From lcaseytw@zionsbank.com Sat Jan 1 02:56:01 2011 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 (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p018u0Ij038315 for ; Sat, 1 Jan 2011 02:56:00 -0600 X-ASG-Debug-ID: 1293872265-367202bf0003-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from 6y087jsh56.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 590A622BE97 for ; Sat, 1 Jan 2011 00:58:00 -0800 (PST) Received: from 6y087jsh56.net (net219.195.109-210.krsk.ertelecom.ru [109.195.219.210]) by cuda.sgi.com with SMTP id hX0wHfVcP3MNmX7r for ; Sat, 01 Jan 2011 00:58:00 -0800 (PST) Date: Sat, 01 Jan 2011 02:53:37 -0700 Message-ID: <4d1ef9a1.c636c49f@zionsbank.com> MIME-Version: 1.0 X-ASG-Orig-Subj: cc6 Subject: cc6 From: "Loralee Casey" Reply-To: "Loralee Casey" To: Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Barracuda-Connect: net219.195.109-210.krsk.ertelecom.ru[109.195.219.210] X-Barracuda-Start-Time: 1293872286 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0535 1.0000 -1.6778 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.08 X-Barracuda-Spam-Status: No, SCORE=-0.08 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_MJ2473, BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.51102 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 1.00 BSF_SC0_MJ2473 Custom Rule MJ2473 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean g From winchesterstar@stabletransit.com Sat Jan 1 19:47:12 2011 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,FREEMAIL_FROM, SUBJ_FRIEND,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 p021lBhR164298 for ; Sat, 1 Jan 2011 19:47:12 -0600 X-ASG-Debug-ID: 1293932953-190e01a90000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx-n05.wc1.dfw1.stabletransit.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BA7731E99286 for ; Sat, 1 Jan 2011 17:49:14 -0800 (PST) Received: from mx-n05.wc1.dfw1.stabletransit.com (mx-n05.wc1.dfw1.stabletransit.com [72.32.1.165]) by cuda.sgi.com with ESMTP id KxHBVJ7dz8Aams7A for ; Sat, 01 Jan 2011 17:49:14 -0800 (PST) Received: by mx-n05.wc1.dfw1.stabletransit.com (Postfix, from userid 99) id A74AD4FECC3; Sat, 1 Jan 2011 19:49:13 -0600 (CST) Received: from mx-n05.wc1.dfw1.stabletransit.com (localhost.localdomain [127.0.0.1]) by mx-n05.wc1.dfw1.stabletransit.com (Postfix) with ESMTP id A2C394FECC3 for ; Sat, 1 Jan 2011 19:49:06 -0600 (CST) Received: by mx-n05.wc1.dfw1.stabletransit.com (Postfix, from userid 300) id 9F17BAE8002; Sat, 1 Jan 2011 19:49:06 -0600 (CST) Received: from php5-n60.wc1.dfw1.stabletransit.com (php5-n60.wc1.dfw1.stabletransit.com [172.17.2.111]) by mx-n05.wc1.dfw1.stabletransit.com (Postfix) with ESMTP id 97506AE8001 for ; Sat, 1 Jan 2011 19:49:06 -0600 (CST) Received: by php5-n60.wc1.dfw1.stabletransit.com (Postfix, from userid 2002237) id 924B5284027A; Sat, 1 Jan 2011 19:49:06 -0600 (CST) To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: DNRonline.com Article sent to you by a friend Subject: DNRonline.com Article sent to you by a friend X-PHP-Script: www.dailynews-record.com/emailfriend.php for 112.201.186.106 Errors-To: michaelle@gmail.com From: michaelle@gmail.com Message-Id: <20110102014906.924B5284027A@php5-n60.wc1.dfw1.stabletransit.com> Date: Sat, 1 Jan 2011 19:49:06 -0600 (CST) X-Barracuda-Connect: mx-n05.wc1.dfw1.stabletransit.com[72.32.1.165] X-Barracuda-Start-Time: 1293932954 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4234 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.51168 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 Dear maam/sir, This person, mike, has sent you the following article and message: Hi - Could an extra two Hundred bucks per day help you out? How about an extra nine hundred per day? This guy\'s got a COMPLETELY new method. . .I never would dreamed of. But it\'s making all that possible in just DAYS. . . http://www.homeaff.co.cc/aff.php?e=linux-xfs@oss.sgi.com And much more. You\'ve got to see this to believe it. http://www.homeaff.co.cc/aff.php?e=linux-xfs@oss.sgi.com WBT Marketing East Land Vill, Lilo-an, PH-6002 P.S. I mean. . .if someone had told me this was possible last week. I\'d have laughed him out of the room. Looks like he\'s getting the last laugh. click the link below to unsubscribe: http://www.homeaff.co.cc/un.php?e=linux-xfs@oss.sgi.com Article Title: Webb Panders For Black Vote Subtitle: Article From: The Daily-News Record Online Article Text: By Steven Thomas RECENTLY VIRGINIA SEN. Jim Webb started a firestorm when he wrote a piece in The Wall Street Journal calling for affirmative action reform and pontificating that present affirmative action legislation discriminates agai... To view the rest of this article, click on this link: http://www.dnronline.com/opinion_details.php?AID=49660&CHID=32 From BATV+0af2cfe36ebb082dd69e+2688+infradead.org+hch@bombadil.srs.infradead.org Sun Jan 2 01:20:01 2011 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_00,J_CHICKENPOX_53, J_CHICKENPOX_64,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 p027JwOj201479 for ; Sun, 2 Jan 2011 01:20:00 -0600 X-ASG-Debug-ID: 1293952924-3289034e0000-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 B878D1615CB2 for ; Sat, 1 Jan 2011 23:22:04 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id FZDO8fdlgrHjEpiy for ; Sat, 01 Jan 2011 23:22:04 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PZIGQ-0007Yj-HN for xfs@oss.sgi.com; Sun, 02 Jan 2011 07:22:02 +0000 Date: Sun, 2 Jan 2011 02:22:02 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: add FITRIM support Subject: [PATCH] xfs: add FITRIM support Message-ID: <20110102072202.GA26488@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: 1293952924 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 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 --- V1 -> V2 - added __user annotations as noted by Alex - removed non-blocking agf read as noted by Alex - update range->len as noted by Alex This does not implement the by-bno search or lock break suggestions from Dave. Given that the 2.6.38 window is about to close those seem a bit risky to me. I'll look into these later. Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2011-01-02 07:11:41.245003791 +0100 +++ xfs/fs/xfs/xfs_alloc.c 2011-01-02 07:24:43.120004698 +0100 @@ -41,10 +41,6 @@ #define XFSA_FIXUP_BNO_OK 1 #define XFSA_FIXUP_CNT_OK 2 -static int -xfs_alloc_busy_search(struct xfs_mount *mp, xfs_agnumber_t agno, - xfs_agblock_t bno, xfs_extlen_t len); - /* * Prototypes for per-ag allocation routines */ @@ -94,7 +90,7 @@ xfs_alloc_lookup_ge( * Lookup the first record less than or equal to [bno, len] * in the btree given by cur. */ -STATIC int /* error */ +int /* error */ xfs_alloc_lookup_le( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agblock_t bno, /* starting block of extent */ @@ -127,7 +123,7 @@ xfs_alloc_update( /* * Get the data from the pointed-to record. */ -STATIC int /* error */ +int /* error */ xfs_alloc_get_rec( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agblock_t *bno, /* output: starting block of extent */ @@ -2615,7 +2611,7 @@ restart: * will require a synchronous transaction, but it can still be * used to distinguish between a partial or exact match. */ -static int +int xfs_alloc_busy_search( struct xfs_mount *mp, xfs_agnumber_t agno, Index: xfs/fs/xfs/xfs_alloc.h =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.h 2011-01-02 07:11:41.251003931 +0100 +++ xfs/fs/xfs/xfs_alloc.h 2011-01-02 07:11:43.684004978 +0100 @@ -19,6 +19,7 @@ #define __XFS_ALLOC_H__ struct xfs_buf; +struct xfs_btree_cur; struct xfs_mount; struct xfs_perag; struct xfs_trans; @@ -118,16 +119,16 @@ xfs_alloc_longest_free_extent(struct xfs struct xfs_perag *pag); #ifdef __KERNEL__ - void -xfs_alloc_busy_insert(xfs_trans_t *tp, - xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len); +xfs_alloc_busy_insert(struct xfs_trans *tp, xfs_agnumber_t agno, + xfs_agblock_t bno, xfs_extlen_t len); void xfs_alloc_busy_clear(struct xfs_mount *mp, struct xfs_busy_extent *busyp); +int +xfs_alloc_busy_search(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_agblock_t bno, xfs_extlen_t len); #endif /* __KERNEL__ */ /* @@ -205,4 +206,18 @@ xfs_free_extent( xfs_fsblock_t bno, /* starting block number of extent */ xfs_extlen_t len); /* length of extent */ +int /* error */ +xfs_alloc_lookup_le( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_agblock_t bno, /* starting block of extent */ + xfs_extlen_t len, /* length of extent */ + int *stat); /* success/failure */ + +int /* error */ +xfs_alloc_get_rec( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_agblock_t *bno, /* output: starting block of extent */ + xfs_extlen_t *len, /* output: length of extent */ + int *stat); /* output: success/failure */ + #endif /* __XFS_ALLOC_H__ */ Index: xfs/fs/xfs/Makefile =================================================================== --- xfs.orig/fs/xfs/Makefile 2011-01-02 07:11:41.258004140 +0100 +++ xfs/fs/xfs/Makefile 2011-01-02 07:11:43.687026908 +0100 @@ -98,6 +98,7 @@ xfs-y += $(addprefix $(XFS_LINUX)/, \ kmem.o \ xfs_aops.o \ xfs_buf.o \ + xfs_discard.o \ xfs_export.o \ xfs_file.o \ xfs_fs_subr.o \ Index: xfs/fs/xfs/linux-2.6/xfs_discard.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfs/fs/xfs/linux-2.6/xfs_discard.c 2011-01-02 08:06:15.828014477 +0100 @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2010 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" +#include "xfs_sb.h" +#include "xfs_inum.h" +#include "xfs_log.h" +#include "xfs_ag.h" +#include "xfs_mount.h" +#include "xfs_quota.h" +#include "xfs_trans.h" +#include "xfs_alloc_btree.h" +#include "xfs_bmap_btree.h" +#include "xfs_ialloc_btree.h" +#include "xfs_btree.h" +#include "xfs_inode.h" +#include "xfs_alloc.h" +#include "xfs_error.h" +#include "xfs_discard.h" +#include "xfs_trace.h" + +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, + __uint64_t *blocks_trimmed) +{ + 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, 0, &agbp); + if (error || !agbp) + 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; + *blocks_trimmed += flen; + +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 __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; + __uint64_t blocks_trimmed = 0; + 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. + */ + 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, + &blocks_trimmed); + if (error) + last_error = error; + } + + if (last_error) + return last_error; + + range.len = XFS_FSB_TO_B(mp, blocks_trimmed); + if (copy_to_user(urange, &range, sizeof(range))) + return -XFS_ERROR(EFAULT); + return 0; +} Index: xfs/fs/xfs/linux-2.6/xfs_discard.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfs/fs/xfs/linux-2.6/xfs_discard.h 2011-01-02 07:11:43.693026629 +0100 @@ -0,0 +1,8 @@ +#ifndef XFS_DISCARD_H +#define XFS_DISCARD_H 1 + +struct fstrim_range; + +extern int xfs_ioc_trim(struct xfs_mount *, struct fstrim_range __user *); + +#endif /* XFS_DISCARD_H */ Index: xfs/fs/xfs/linux-2.6/xfs_trace.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.h 2011-01-02 07:11:41.279260600 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_trace.h 2011-01-02 07:11:43.695005886 +0100 @@ -1759,6 +1759,39 @@ DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_reco DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_recover_inode_cancel); DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_recover_inode_skip); +DECLARE_EVENT_CLASS(xfs_discard_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_agblock_t agbno, xfs_extlen_t len), + TP_ARGS(mp, agno, agbno, len), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, agbno) + __field(xfs_extlen_t, len) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->agbno = agbno; + __entry->len = len; + ), + TP_printk("dev %d:%d agno %u agbno %u len %u\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->agbno, + __entry->len) +) + +#define DEFINE_DISCARD_EVENT(name) \ +DEFINE_EVENT(xfs_discard_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ + xfs_agblock_t agbno, xfs_extlen_t len), \ + TP_ARGS(mp, agno, agbno, len)) +DEFINE_DISCARD_EVENT(xfs_discard_extent); +DEFINE_DISCARD_EVENT(xfs_discard_toosmall); +DEFINE_DISCARD_EVENT(xfs_discard_exclude); +DEFINE_DISCARD_EVENT(xfs_discard_busy); + #endif /* _TRACE_XFS_H */ #undef TRACE_INCLUDE_PATH Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2011-01-02 07:11:41.288254175 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c 2011-01-02 07:11:43.699013429 +0100 @@ -39,6 +39,7 @@ #include "xfs_dfrag.h" #include "xfs_fsops.h" #include "xfs_vnodeops.h" +#include "xfs_discard.h" #include "xfs_quota.h" #include "xfs_inode_item.h" #include "xfs_export.h" @@ -1294,6 +1295,8 @@ xfs_file_ioctl( trace_xfs_file_ioctl(ip); switch (cmd) { + case FITRIM: + return xfs_ioc_trim(mp, arg); case XFS_IOC_ALLOCSP: case XFS_IOC_FREESP: case XFS_IOC_RESVSP: From BATV+0af2cfe36ebb082dd69e+2688+infradead.org+hch@bombadil.srs.infradead.org Sun Jan 2 01:32:01 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p027W1xM202118 for ; Sun, 2 Jan 2011 01:32:01 -0600 X-ASG-Debug-ID: 1293953646-65a200510000-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 6C4F122D38E for ; Sat, 1 Jan 2011 23:34:07 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id QkjDO9gjZDWUDRQt for ; Sat, 01 Jan 2011 23:34:07 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PZIS5-0000tl-IW; Sun, 02 Jan 2011 07:34:05 +0000 Date: Sun, 2 Jan 2011 02:34:05 -0500 From: Christoph Hellwig To: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: XFS status update for December 2010 Subject: XFS status update for December 2010 Message-ID: <20110102073405.GA32611@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: 1293953647 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 release process of the Linux 2.6.37 kernel with it's large XFS updates was in it's final days in December, which explains why we only saw a single one-liner regression fix for XFS in Linus' tree. The XFS development tree finally saw some updates when the writeback updates and some small cleanups to the allocator and log recovery code were merged, but the large metadata scalability updates that have been posted to the list multiple times are still missing. In addition to this on-going work the list also saw patches that fix smaller issues, which are also still waiting to be merged. On the userspace side xfsprogs and xfsdump development has been quit, with no commits to either repository in December, although a large series of updates to the metadump command has been reposted near the end of the month. The xfstests repository saw a new regression test for a btrfs problem, and various updates to existing tests. From melvin@healthyfirst.com Sun Jan 2 21:45:51 2011 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 (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p033jpM5041199 for ; Sun, 2 Jan 2011 21:45:51 -0600 X-ASG-Debug-ID: 1294026476-48ed03d60000-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 8213D22E3E9 for ; Sun, 2 Jan 2011 19:47:56 -0800 (PST) Received: from webserver.webnicc.com ([202.190.70.202]) by cuda.sgi.com with ESMTP id jEAHvusR4ZlN6fU5 for ; Sun, 02 Jan 2011 19:47:56 -0800 (PST) Received: from [202.46.127.68] (helo=[168.168.5.33]) by webserver.webnicc.com with esmtpa (Exim 4.67) (envelope-from ) id 1PZbOh-0000dS-HJ for linux-xfs@oss.sgi.com; Mon, 03 Jan 2011 11:47:52 +0800 Message-Id: Mime-Version: 1.0 From: "Melvin Yap" To: "Brian Tan" Reply-To: melyap98@healthyfirst.com X-ASG-Orig-Subj: Win 4D, DIRECT TOP 3 Now! Subject: Win 4D, DIRECT TOP 3 Now! Date: Mon, 3 Jan 2011 11:47:50 +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: 1294026477 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4750 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.51272 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 Mon Jan 3 04:47:17 2011 X-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 (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p03AlH4k075582 for ; Mon, 3 Jan 2011 04:47:17 -0600 X-ASG-Debug-ID: 1294051763-1a05022e0000-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 A279022EAE2; Mon, 3 Jan 2011 02:49:23 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YL69SuUHiTmeo2bo; Mon, 03 Jan 2011 02:49:23 -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 p03AnGpG013540 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 3 Jan 2011 05:49:16 -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 p03AnDSY006393 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 3 Jan 2011 05:49:15 -0500 Date: Mon, 3 Jan 2011 11:49:13 +0100 (CET) From: Lukas Czerner X-X-Sender: lukas@dhcp-lab-213.englab.brq.redhat.com To: Christoph Hellwig cc: Alex Elder , xfs@oss.sgi.com, lczerner@redhat.com X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support In-Reply-To: <20101228160940.GA28295@infradead.org> Message-ID: References: <20101125112304.GA4195@infradead.org> <1293054073.2408.374.camel@doink> <20101228160940.GA28295@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: 1294051764 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, 28 Dec 2010, Christoph Hellwig wrote: > 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. First of all, sorry for not having proper documentation just yet, I'll try to work something out. Regarding truncation of starting offset and length (also minlen) the proper way is to truncate everything down to align with block size. For example this is the way I am doing it in ext4: start = range->start >> sb->s_blocksize_bits; It is not really a big deal to trim something that was not originally intended to, not mentioning that there probably was not any intention at all when it is not aligned to block size. We just trim slightly more, or slightly less and it does not affect filesystem nor user of the filesystem, since it trims just not used space. But what we want to do (and what I missed in ext4) is to align start+len not just len alone, because we might miss some blocks, when the FITRIM is invoked in sequential manner. Then, truncating start down and truncation start+len down is the right thing to do. Regarding the need to have range interface I had two reasons to do this as it is, but only one is really worth it. Since we want to run FITRIM from the userspace on the background, we want to disturb other IO as little as possible and whole filesystem trim can take minutes on some devices (not talking about LUNs which is even more painful). So you'll probably agree that we do not want to have possibly minute long stalls when doing FITRIM. But it is optional, so if you have fast device with small, not very fragmented filesystem you can end up doing FITRIM on the whole filesystem at once and it will be the right thing to do. Also, some might want to have nice-n-shiny progress bars:). Thanks! -Lukas > > > 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 lczerner@redhat.com Mon Jan 3 04:55:30 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p03AtUSF075916 for ; Mon, 3 Jan 2011 04:55:30 -0600 X-ASG-Debug-ID: 1294052256-50a901b00000-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 507E71617918 for ; Mon, 3 Jan 2011 02:57:36 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id A56S5kCoD62VtEfA for ; Mon, 03 Jan 2011 02:57:36 -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 p03AvQh0016259 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 3 Jan 2011 05:57:26 -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 p03AvNPg001042 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 3 Jan 2011 05:57:25 -0500 Date: Mon, 3 Jan 2011 11:57:23 +0100 (CET) From: Lukas Czerner X-X-Sender: lukas@dhcp-lab-213.englab.brq.redhat.com To: Christoph Hellwig cc: Dave Chinner , xfs@oss.sgi.com, Lukas Czerner X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support In-Reply-To: <20101230114129.GA4321@infradead.org> Message-ID: References: <20101125112304.GA4195@infradead.org> <20101223014409.GL4907@dastard> <20101230114129.GA4321@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.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1294052257 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, 30 Dec 2010, Christoph Hellwig wrote: > 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. Hi, I assume that you're talking about situation, when you call FITRIM with start and len not covering the whole filesystem possibly resulting in trimming just a part of the AG ? In this case I just copy my answer from previous mail... I had two reasons to do this as it is, but only one is really worth it. Since we want to run FITRIM from the userspace on the background, we want to disturb other IO as little as possible and whole filesystem trim can take minutes on some devices (not talking about LUNs which is even more painful). So you'll probably agree that we do not want to have possibly minute long stalls when doing FITRIM. And presumably we do not want the users to care about the size of AG, nor the blocksize (preferably). But it is optional, so if you have fast device with small, not very fragmented filesystem you can end up doing FITRIM on the whole filesystem at once and it will be the right thing to do. Also, some might want to have nice-n-shiny progress bars:). Thanks! -Lukas > > > 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 josef@redhat.com Mon Jan 3 15:56:02 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p03Lu1jf132169 for ; Mon, 3 Jan 2011 15:56:02 -0600 X-ASG-Debug-ID: 1294091888-06f803d70000-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 780B1230094 for ; Mon, 3 Jan 2011 13:58:08 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id M7orZaovgcLE0qe6 for ; Mon, 03 Jan 2011 13:58:08 -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 p03LvRJe003681 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 3 Jan 2011 16:57:28 -0500 Received: from localhost.localdomain (vpn-8-54.rdu.redhat.com [10.11.8.54]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p03LvLZ2000946; Mon, 3 Jan 2011 16:57:21 -0500 Date: Mon, 3 Jan 2011 16:57:21 -0500 From: Josef Bacik To: Josef Bacik Cc: david@fromorbit.com, linux-kernel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, cmm@us.ibm.com, cluster-devel@redhat.com, joel.becker@oracle.com, jack@suse.cz, akpm@linux-foundation.org, torvalds@linux-foundation.org X-ASG-Orig-Subj: Re: Hole Punching V3 Subject: Re: Hole Punching V3 Message-ID: <20110103215720.GA8392@localhost.localdomain> References: <1290044780-2902-1-git-send-email-josef@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290044780-2902-1-git-send-email-josef@redhat.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1294091889 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, Nov 17, 2010 at 08:46:14PM -0500, Josef Bacik wrote: > This is version 3 of the hole punching series I've been posting. Not much has > changed, the history is below > > V2->V3 > -FALLOC_FL_PUNCH_HOLE must also have FALLOC_FL_KEEP_SIZE in order to work > -formatting fixes > > V1->V2 > -Hole punching doesn't change file size > -Fixed the mode checks in ext4/btrfs/gfs2 so they do what they are supposed to > > I've updated my local copies of the xfsprogs patches I have to test this to use > KEEP_SIZE and PUNCH_HOLE together, I'll post them after it looks like these > patches are good to go, including the manpage update. The xfstest I wrote ran > fine both on xfs and btrfs (failing on btrfs obviously). Thanks, > I'd like to try and get this into the next merge window, it seems everybody is happy with it so far, any other comments? Provided everybody is ok with it, how would you like me to send it to you Linus? Would you prefer a pull request or will you just pull the patches off the mailinglist? Thanks, Josef From SRS0+MHMm+37+fromorbit.com=david@internode.on.net Mon Jan 3 17:23:13 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p03NNC7f140923 for ; Mon, 3 Jan 2011 17:23:13 -0600 X-ASG-Debug-ID: 1294097117-1f1d01110000-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 9B5D01D07E73 for ; Mon, 3 Jan 2011 15:25:18 -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 OraZSgUcXIRaCLUD for ; Mon, 03 Jan 2011 15:25:18 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51755987-1927428 for multiple; Tue, 04 Jan 2011 09:55:16 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PZtm6-0008W2-KM; Tue, 04 Jan 2011 10:25:14 +1100 Date: Tue, 4 Jan 2011 10:25:14 +1100 From: Dave Chinner To: Lukas Czerner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support Message-ID: <20110103232514.GF15179@dastard> References: <20101125112304.GA4195@infradead.org> <20101223014409.GL4907@dastard> <20101230114129.GA4321@infradead.org> 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: 1294097119 X-Barracuda-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.51348 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, Jan 03, 2011 at 11:57:23AM +0100, Lukas Czerner wrote: > On Thu, 30 Dec 2010, Christoph Hellwig wrote: > > > 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. > > Hi, I assume that you're talking about situation, when you call FITRIM > with start and len not covering the whole filesystem possibly resulting > in trimming just a part of the AG ? In this case I just copy my answer > from previous mail... Yes. > I had two reasons to do this as it is, but only one is really worth it. > Since we want to run FITRIM from the userspace on the background, we want > to disturb other IO as little as possible and whole filesystem trim can > take minutes on some devices (not talking about LUNs which is even more > painful). Right - it's the high end we have to worry about for XFS: how long do you expect a 100TB filesystem to take to TRIM? ;) > > So you'll probably agree that we do not want to have possibly > minute long stalls when doing FITRIM. And presumably we do not want the > users to care about the size of AG, nor the blocksize (preferably). The issue is that an AG can cover 1TB of disk space, and locking it for the entire time it takes to trim the free space will cause IO disturbances. Even holding the AGF locked for a few seconds can cause problems. So I guess the question is what sort of ranged woul dwe be expecting to see a userspace background trim daemon be using? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+pfJj+38+fromorbit.com=david@internode.on.net Mon Jan 3 18:13:15 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p040DFD9145891 for ; Mon, 3 Jan 2011 18:13:15 -0600 X-ASG-Debug-ID: 1294100120-785b031c0000-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 52A1B23064A for ; Mon, 3 Jan 2011 16:15: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 3rZIo0oVfOoO6ltC for ; Mon, 03 Jan 2011 16:15:20 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51897993-1927428 for multiple; Tue, 04 Jan 2011 10:45:19 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PZuYY-000089-41; Tue, 04 Jan 2011 11:15:18 +1100 Date: Tue, 4 Jan 2011 11:15:18 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: add FITRIM support Subject: Re: [PATCH] xfs: add FITRIM support Message-ID: <20110104001518.GG15179@dastard> References: <20110102072202.GA26488@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110102072202.GA26488@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: 1294100122 X-Barracuda-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.51350 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, Jan 02, 2011 at 02:22:02AM -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 > > --- > > V1 -> V2 > > - added __user annotations as noted by Alex > - removed non-blocking agf read as noted by Alex > - update range->len as noted by Alex > > This does not implement the by-bno search or lock break suggestions from > Dave. Given that the 2.6.38 window is about to close those seem a bit > risky to me. I'll look into these later. Ok, seemms like a good way to proceed. Reviewed-by: Dave Chinner Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+w7Rt+38+fromorbit.com=dave@internode.on.net Mon Jan 3 22:46:41 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p044kewr175954 for ; Mon, 3 Jan 2011 22:46:41 -0600 X-ASG-Debug-ID: 1294116525-6a0103bc0000-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 52FE71D0823A for ; Mon, 3 Jan 2011 20:48: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 dFD5SADtf9RvhaQc for ; Mon, 03 Jan 2011 20:48:45 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51786249-1927428 for ; Tue, 04 Jan 2011 15:18:44 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PZyp9-0000Sz-9R for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:43 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PZyp7-0003tg-Ic for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:41 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Subject: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Date: Tue, 4 Jan 2011 15:48:34 +1100 Message-Id: <1294116518-14908-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294116518-14908-1-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1294116527 X-Barracuda-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.51368 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 need to obtain the i_mutex, i_iolock and i_ilock during the read and write paths. Add a set of wrapper functions to neatly encapsulate the lock ordering and shared/exclusive semantics to make the locking easier to follow and get right. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_file.c | 123 ++++++++++++++++++++++++------------------- 1 files changed, 68 insertions(+), 55 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 33a688c..0d6111e 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -41,6 +41,40 @@ static const struct vm_operations_struct xfs_file_vm_ops; /* + * Locking primitives for read and write IO paths to ensure we consistently use + * and order the inode->i_mutex, ip->i_lock and ip->i_iolock. + */ +static inline void +xfs_rw_ilock( + struct xfs_inode *ip, + int type) +{ + if (type & XFS_IOLOCK_EXCL) + mutex_lock(&VFS_I(ip)->i_mutex); + xfs_ilock(ip, type); +} + +static inline void +xfs_rw_iunlock( + struct xfs_inode *ip, + int type) +{ + xfs_iunlock(ip, type); + if (type & XFS_IOLOCK_EXCL) + mutex_unlock(&VFS_I(ip)->i_mutex); +} + +static inline void +xfs_rw_ilock_demote( + struct xfs_inode *ip, + int type) +{ + xfs_ilock_demote(ip, type); + if (type & XFS_IOLOCK_EXCL) + mutex_unlock(&VFS_I(ip)->i_mutex); +} + +/* * xfs_iozero * * xfs_iozero clears the specified range of buffer supplied, @@ -262,22 +296,21 @@ xfs_file_aio_read( if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; - if (unlikely(ioflags & IO_ISDIRECT)) - mutex_lock(&inode->i_mutex); - xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (unlikely(ioflags & IO_ISDIRECT)) { + xfs_rw_ilock(ip, XFS_IOLOCK_EXCL); + if (inode->i_mapping->nrpages) { ret = -xfs_flushinval_pages(ip, (iocb->ki_pos & PAGE_CACHE_MASK), -1, FI_REMAPF_LOCKED); + if (ret) { + xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); + return ret; + } } - mutex_unlock(&inode->i_mutex); - if (ret) { - xfs_iunlock(ip, XFS_IOLOCK_SHARED); - return ret; - } - } + xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); + } else + xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); trace_xfs_file_read(ip, size, iocb->ki_pos, ioflags); @@ -285,7 +318,7 @@ xfs_file_aio_read( if (ret > 0) XFS_STATS_ADD(xs_read_bytes, ret); - xfs_iunlock(ip, XFS_IOLOCK_SHARED); + xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); return ret; } @@ -309,7 +342,7 @@ xfs_file_splice_read( if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return -EIO; - xfs_ilock(ip, XFS_IOLOCK_SHARED); + xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); trace_xfs_file_splice_read(ip, count, *ppos, ioflags); @@ -317,7 +350,7 @@ xfs_file_splice_read( if (ret > 0) XFS_STATS_ADD(xs_read_bytes, ret); - xfs_iunlock(ip, XFS_IOLOCK_SHARED); + xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); return ret; } @@ -338,10 +371,10 @@ xfs_aio_write_isize_update( *ppos = isize; if (*ppos > ip->i_size) { - xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_rw_ilock(ip, XFS_ILOCK_EXCL); if (*ppos > ip->i_size) ip->i_size = *ppos; - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); } } @@ -356,11 +389,11 @@ xfs_aio_write_newsize_update( struct xfs_inode *ip) { if (ip->i_new_size) { - xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_rw_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_rw_iunlock(ip, XFS_ILOCK_EXCL); } } @@ -386,14 +419,13 @@ xfs_file_splice_write( if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return -EIO; - xfs_ilock(ip, XFS_IOLOCK_EXCL); + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL); new_size = *ppos + count; - xfs_ilock(ip, XFS_ILOCK_EXCL); if (new_size > ip->i_size) ip->i_new_size = new_size; - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); trace_xfs_file_splice_write(ip, count, *ppos, ioflags); @@ -401,7 +433,7 @@ xfs_file_splice_write( xfs_aio_write_isize_update(inode, ppos, ret); xfs_aio_write_newsize_update(ip); - xfs_iunlock(ip, XFS_IOLOCK_EXCL); + xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); return ret; } @@ -604,7 +636,6 @@ xfs_file_aio_write( xfs_fsize_t new_size; int iolock; size_t ocount = 0, count; - int need_i_mutex; XFS_STATS_INC(xs_write_calls); @@ -631,21 +662,16 @@ xfs_file_aio_write( 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); } - xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); - start: ret = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); if (ret) { - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); - goto out_unlock_mutex; + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); + return ret; } if (ioflags & IO_ISDIRECT) { @@ -654,16 +680,14 @@ start: mp->m_rtdev_targp : mp->m_ddev_targp; if ((pos & target->bt_smask) || (count & target->bt_smask)) { - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); + xfs_rw_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); + if (iolock != XFS_IOLOCK_EXCL && + (mapping->nrpages || pos > ip->i_size)) { + xfs_rw_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; } } @@ -687,11 +711,11 @@ start: if (pos > ip->i_size) { ret = -xfs_zero_eof(ip, pos, ip->i_size); if (ret) { - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); goto out_unlock_internal; } } - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); /* * If we're writing the file then make sure to clear the @@ -708,7 +732,7 @@ start: if ((ioflags & IO_ISDIRECT)) { if (mapping->nrpages) { - WARN_ON(need_i_mutex == 0); + WARN_ON(iolock != XFS_IOLOCK_EXCL); ret = -xfs_flushinval_pages(ip, (pos & PAGE_CACHE_MASK), -1, FI_REMAPF_LOCKED); @@ -716,13 +740,10 @@ start: goto out_unlock_internal; } - if (need_i_mutex) { + if (iolock == XFS_IOLOCK_EXCL) { /* demote the lock now the cached pages are gone */ - xfs_ilock_demote(ip, XFS_IOLOCK_EXCL); - mutex_unlock(&inode->i_mutex); - + xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); iolock = XFS_IOLOCK_SHARED; - need_i_mutex = 0; } trace_xfs_file_direct_write(ip, count, iocb->ki_pos, ioflags); @@ -740,7 +761,7 @@ start: count -= ret; ioflags &= ~IO_ISDIRECT; - xfs_iunlock(ip, iolock); + xfs_rw_iunlock(ip, iolock); goto relock; } } else { @@ -779,14 +800,9 @@ write_retry: loff_t end = pos + ret - 1; int error, error2; - xfs_iunlock(ip, iolock); - if (need_i_mutex) - mutex_unlock(&inode->i_mutex); - + xfs_rw_iunlock(ip, iolock); error = filemap_write_and_wait_range(mapping, pos, end); - if (need_i_mutex) - mutex_lock(&inode->i_mutex); - xfs_ilock(ip, iolock); + xfs_rw_ilock(ip, iolock); error2 = -xfs_file_fsync(file, (file->f_flags & __O_SYNC) ? 0 : 1); @@ -798,10 +814,7 @@ write_retry: out_unlock_internal: xfs_aio_write_newsize_update(ip); - xfs_iunlock(ip, iolock); - out_unlock_mutex: - if (need_i_mutex) - mutex_unlock(&inode->i_mutex); + xfs_rw_iunlock(ip, iolock); return ret; } -- 1.7.2.3 From SRS0+98R0+38+fromorbit.com=dave@internode.on.net Mon Jan 3 22:46:41 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p044kf7b175955 for ; Mon, 3 Jan 2011 22:46:41 -0600 X-ASG-Debug-ID: 1294116525-3fea001f0000-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 A86B3153626C for ; Mon, 3 Jan 2011 20:48:45 -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 4P3k0qh9AURfMOG9 for ; Mon, 03 Jan 2011 20:48:45 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51671903-1927428 for ; Tue, 04 Jan 2011 15:18:44 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PZyp9-0000Sw-63 for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:43 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PZyp7-0003ta-FI for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:41 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/8] xfs: factor common post-write isize handling code Subject: [PATCH 2/8] xfs: factor common post-write isize handling code Date: Tue, 4 Jan 2011 15:48:32 +1100 Message-Id: <1294116518-14908-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294116518-14908-1-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1294116527 X-Barracuda-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.51369 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 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 de71a84..841529e 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; 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); if (ret <= 0) goto out_unlock_internal; -- 1.7.2.3 From SRS0+98R0+38+fromorbit.com=dave@internode.on.net Mon Jan 3 22:46:47 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p044kl0f175978 for ; Mon, 3 Jan 2011 22:46:47 -0600 X-ASG-Debug-ID: 1294116532-7e1500290000-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 105AA230523 for ; Mon, 3 Jan 2011 20:48:53 -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 3HHTSfoy20h91OyW for ; Mon, 03 Jan 2011 20:48:53 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51491949-1927428 for ; Tue, 04 Jan 2011 15:18:51 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PZyp9-0000Sx-7j for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:43 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PZyp7-0003td-Gx for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:41 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/8] xfs: factor post-write newsize updates Subject: [PATCH 3/8] xfs: factor post-write newsize updates Date: Tue, 4 Jan 2011 15:48:33 +1100 Message-Id: <1294116518-14908-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294116518-14908-1-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1294116535 X-Barracuda-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.51368 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 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 841529e..33a688c 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; } @@ -785,20 +797,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+98R0+38+fromorbit.com=dave@internode.on.net Mon Jan 3 22:46:50 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p044kn6W175994 for ; Mon, 3 Jan 2011 22:46:49 -0600 X-ASG-Debug-ID: 1294116535-2b8203db0000-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 4B195230E29 for ; Mon, 3 Jan 2011 20:48: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 8LhTzBxGmceL4r6L for ; Mon, 03 Jan 2011 20:48:56 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51671917-1927428 for ; Tue, 04 Jan 2011 15:18:55 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PZypJ-0000TJ-Fj for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:53 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PZypH-0003ts-P0 for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 8/8] xfs: serialise unaligned direct IOs Subject: [PATCH 8/8] xfs: serialise unaligned direct IOs Date: Tue, 4 Jan 2011 15:48:38 +1100 Message-Id: <1294116518-14908-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294116518-14908-1-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1294116537 X-Barracuda-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.51368 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 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 | 28 ++++++++++++++++++++++++---- 1 files changed, 24 insertions(+), 4 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index f21b6ad..a91e1a8 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -678,10 +678,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 @iolock and errors indicated by * negative return values. */ @@ -701,6 +712,7 @@ xfs_file_dio_aio_write( struct xfs_mount *mp = ip->i_mount; ssize_t ret = 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; @@ -708,7 +720,10 @@ 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; else *iolock = XFS_IOLOCK_SHARED; @@ -725,8 +740,13 @@ xfs_file_dio_aio_write( return ret; } - if (*iolock == XFS_IOLOCK_EXCL) { - /* demote the lock now the cached pages are gone */ + /* + * If we are doing unaligned IO, wait for all other IO to drain, + * otherwise demote the lock if we had to flush cached pages + */ + if (unaligned_io) + xfs_ioend_wait(ip); + else if (*iolock == XFS_IOLOCK_EXCL) { xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); *iolock = XFS_IOLOCK_SHARED; } -- 1.7.2.3 From SRS0+o7PV+38+fromorbit.com=dave@internode.on.net Mon Jan 3 22:46:50 2011 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 p044knEC175990 for ; Mon, 3 Jan 2011 22:46:49 -0600 X-ASG-Debug-ID: 1294116535-7e1200330000-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 11EC2230E23 for ; Mon, 3 Jan 2011 20:48:55 -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 NmlhPCLvePV47pyE for ; Mon, 03 Jan 2011 20:48:55 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51169593-1927428 for ; Tue, 04 Jan 2011 15:18:54 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PZypJ-0000TF-Au for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:53 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PZyp7-0003tj-KN for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:41 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write Subject: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write Date: Tue, 4 Jan 2011 15:48:35 +1100 Message-Id: <1294116518-14908-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294116518-14908-1-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1294116537 X-Barracuda-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.51368 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 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 | 168 ++++++++++++++++++++++++++++--------------- 1 files changed, 110 insertions(+), 58 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 0d6111e..d546953 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -619,6 +619,110 @@ 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 @iolock and errors indicated by + * negative return values. + */ +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 *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; + 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; + + *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; + else + *iolock = XFS_IOLOCK_SHARED; + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|*iolock); + + ret = generic_write_checks(file, &pos, &count, + S_ISBLK(inode->i_mode)); + if (ret) { + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|*iolock); + *iolock = 0; + return ret; + } + + 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) { + ret = -xfs_zero_eof(ip, pos, ip->i_size); + if (ret) { + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); + return ret; + } + } + xfs_rw_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. + */ + ret = file_remove_suid(file); + if (unlikely(ret)) + return ret; + + if (mapping->nrpages) { + WARN_ON(*iolock != XFS_IOLOCK_EXCL); + ret = -xfs_flushinval_pages(ip, (pos & PAGE_CACHE_MASK), -1, + FI_REMAPF_LOCKED); + if (ret) + return ret; + } + + if (*iolock == XFS_IOLOCK_EXCL) { + /* demote the lock now the cached pages are gone */ + xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); + *iolock = XFS_IOLOCK_SHARED; + } + + trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0); + ret = generic_file_direct_write(iocb, iovp, + &nr_segs, pos, &iocb->ki_pos, count, ocount); + + /* No fallback to buffered IO on errors for XFS. */ + return ret; +} + STATIC ssize_t xfs_file_aio_write( struct kiocb *iocb, @@ -659,14 +763,13 @@ xfs_file_aio_write( if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; -relock: if (ioflags & IO_ISDIRECT) { - iolock = XFS_IOLOCK_SHARED; - } else { - iolock = XFS_IOLOCK_EXCL; + ret = xfs_file_dio_aio_write(iocb, iovp, nr_segs, pos, + ocount, &iolock); + goto done_io; } -start: + iolock = XFS_IOLOCK_EXCL; ret = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); if (ret) { @@ -674,24 +777,6 @@ start: return ret; } - 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_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); - return XFS_ERROR(-EINVAL); - } - - if (iolock != XFS_IOLOCK_EXCL && - (mapping->nrpages || pos > ip->i_size)) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); - iolock = XFS_IOLOCK_EXCL; - goto start; - } - } - new_size = pos + count; if (new_size > ip->i_size) ip->i_new_size = new_size; @@ -730,41 +815,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(iolock != XFS_IOLOCK_EXCL); - ret = -xfs_flushinval_pages(ip, - (pos & PAGE_CACHE_MASK), - -1, FI_REMAPF_LOCKED); - if (ret) - goto out_unlock_internal; - } - - if (iolock == XFS_IOLOCK_EXCL) { - /* demote the lock now the cached pages are gone */ - xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); - iolock = XFS_IOLOCK_SHARED; - } - - 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_rw_iunlock(ip, iolock); - goto relock; - } - } else { + if (!(ioflags & IO_ISDIRECT)) { int enospc = 0; write_retry: @@ -788,6 +839,7 @@ write_retry: current->backing_dev_info = NULL; +done_io: xfs_aio_write_isize_update(inode, &iocb->ki_pos, ret); if (ret <= 0) -- 1.7.2.3 From SRS0+98R0+38+fromorbit.com=dave@internode.on.net Mon Jan 3 22:46:50 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p044kn61175991 for ; Mon, 3 Jan 2011 22:46:49 -0600 X-ASG-Debug-ID: 1294116535-4996002b0000-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 EC6171D0824D for ; Mon, 3 Jan 2011 20:48:55 -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 dqhfONTWNOpQaDmr for ; Mon, 03 Jan 2011 20:48:55 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52194422-1927428 for ; Tue, 04 Jan 2011 15:18:54 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PZyp9-0000Su-3V for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:43 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PZyp7-0003tW-B3 for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:41 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/8] xfs: prevent corruption due to overlapping AIO DIO V2 Subject: [PATCH 0/8] xfs: prevent corruption due to overlapping AIO DIO V2 Date: Tue, 4 Jan 2011 15:48:30 +1100 Message-Id: <1294116518-14908-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1294116536 X-Barracuda-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.51368 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 aims to serialise unaligned direct IOs to an inode to avoid corruption caused by 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. Version 2: - fix initial sync write error return fixup - add new patch to abstract locking from read/write path and remove the need for the need_i_mutex variable. From SRS0+o7PV+38+fromorbit.com=dave@internode.on.net Mon Jan 3 22:47:00 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p044kxMN176064 for ; Mon, 3 Jan 2011 22:46:59 -0600 X-ASG-Debug-ID: 1294116545-1da901b20000-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 EC4241D0828E for ; Mon, 3 Jan 2011 20:49:05 -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 mUyYbGgSLTHfgxpx for ; Mon, 03 Jan 2011 20:49:05 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51169613-1927428 for ; Tue, 04 Jan 2011 15:19:04 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PZypJ-0000TH-E4 for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:53 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PZypH-0003tp-NG for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 7/8] xfs: factor common write setup code Subject: [PATCH 7/8] xfs: factor common write setup code Date: Tue, 4 Jan 2011 15:48:37 +1100 Message-Id: <1294116518-14908-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294116518-14908-1-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1294116546 X-Barracuda-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.51368 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 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 | 129 ++++++++++++++++++++----------------------- 1 files changed, 59 insertions(+), 70 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 7e7805c..f21b6ad 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -620,6 +620,61 @@ 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 = 0; + + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|*iolock); + + error = generic_write_checks(file, pos, count, S_ISBLK(inode->i_mode)); + if (error) { + xfs_rw_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); + + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); + if (error) + return error; + + /* + * 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. @@ -645,7 +700,6 @@ xfs_file_dio_aio_write( struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; ssize_t ret = 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; @@ -658,47 +712,9 @@ xfs_file_dio_aio_write( *iolock = XFS_IOLOCK_EXCL; else *iolock = XFS_IOLOCK_SHARED; - xfs_rw_ilock(ip, XFS_ILOCK_EXCL|*iolock); - ret = generic_write_checks(file, &pos, &count, - S_ISBLK(inode->i_mode)); - if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|*iolock); - *iolock = 0; - return ret; - } - - 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) { - ret = -xfs_zero_eof(ip, pos, ip->i_size); - if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); - return ret; - } - } - xfs_rw_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. - */ - ret = file_remove_suid(file); - if (unlikely(ret)) + ret = xfs_file_aio_write_checks(file, &pos, &count, iolock); + if (ret) return ret; if (mapping->nrpages) { @@ -738,38 +754,11 @@ xfs_file_buffered_aio_write( struct xfs_inode *ip = XFS_I(inode); ssize_t ret; int enospc = 0; - xfs_fsize_t new_size; size_t count = ocount; *iolock = XFS_IOLOCK_EXCL; - xfs_rw_ilock(ip, XFS_ILOCK_EXCL|*iolock); - - ret = generic_write_checks(file, &pos, &count, - S_ISBLK(inode->i_mode)); - if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|*iolock); - *iolock = 0; - return ret; - } - - 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) { - ret = -xfs_zero_eof(ip, pos, ip->i_size); - if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); - return ret; - } - } - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); - - ret = file_remove_suid(file); - if (unlikely(ret)) + ret = xfs_file_aio_write_checks(file, &pos, &count, iolock); + if (ret) return ret; /* We can write back this queue in page reclaim */ -- 1.7.2.3 From SRS0+w7Rt+38+fromorbit.com=dave@internode.on.net Mon Jan 3 22:46:52 2011 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 p044kqWI176025 for ; Mon, 3 Jan 2011 22:46:52 -0600 X-ASG-Debug-ID: 1294116534-3fdf00230000-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 A90A2153626F for ; Mon, 3 Jan 2011 20:48:58 -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 p92HshwPdtkhkL7f for ; Mon, 03 Jan 2011 20:48:58 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51786254-1927428 for ; Tue, 04 Jan 2011 15:18:54 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PZyp9-0000Sv-4U for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:43 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PZyp7-0003tY-D2 for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:41 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/8] xfs: ensure sync write errors are returned Subject: [PATCH 1/8] xfs: ensure sync write errors are returned Date: Tue, 4 Jan 2011 15:48:31 +1100 Message-Id: <1294116518-14908-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294116518-14908-1-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1294116539 X-Barracuda-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.51369 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_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 | 51 +++++++++++++++++++++---------------------- 1 files changed, 25 insertions(+), 26 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index ba8ad42..de71a84 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -574,7 +574,7 @@ xfs_file_aio_write( 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; + ssize_t ret = 0; int ioflags = 0; xfs_fsize_t isize, new_size; int iolock; @@ -590,9 +590,9 @@ xfs_file_aio_write( if (file->f_mode & FMODE_NOCMTIME) ioflags |= IO_INVIS; - error = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); - if (error) - return error; + ret = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); + if (ret) + return ret; count = ocount; if (count == 0) @@ -616,9 +616,9 @@ relock: xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); start: - error = -generic_write_checks(file, &pos, &count, + ret = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); - if (error) { + if (ret) { xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); goto out_unlock_mutex; } @@ -660,8 +660,8 @@ start: */ if (pos > ip->i_size) { - error = xfs_zero_eof(ip, pos, ip->i_size); - if (error) { + ret = -xfs_zero_eof(ip, pos, ip->i_size); + if (ret) { xfs_iunlock(ip, XFS_ILOCK_EXCL); goto out_unlock_internal; } @@ -674,8 +674,8 @@ start: * by root. This keeps people from modifying setuid and * setgid binaries. */ - error = -file_remove_suid(file); - if (unlikely(error)) + ret = file_remove_suid(file); + if (unlikely(ret)) goto out_unlock_internal; /* We can write back this queue in page reclaim */ @@ -684,10 +684,10 @@ start: if ((ioflags & IO_ISDIRECT)) { if (mapping->nrpages) { WARN_ON(need_i_mutex == 0); - error = xfs_flushinval_pages(ip, + ret = -xfs_flushinval_pages(ip, (pos & PAGE_CACHE_MASK), -1, FI_REMAPF_LOCKED); - if (error) + if (ret) goto out_unlock_internal; } @@ -720,24 +720,24 @@ start: } } else { 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, + ret = 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) + if (ret == -ENOSPC && !enospc) { + ssize_t ret2 = xfs_flush_pages(ip, 0, -1, 0, FI_NONE); + if (ret2) { + ret = ret2; goto out_unlock_internal; + } enospc = 1; goto write_retry; } - ret = ret2; } current->backing_dev_info = NULL; @@ -753,7 +753,6 @@ write_retry: xfs_iunlock(ip, XFS_ILOCK_EXCL); } - error = -ret; if (ret <= 0) goto out_unlock_internal; @@ -762,23 +761,23 @@ write_retry: /* Handle various SYNC-type writes */ if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) { loff_t end = pos + ret - 1; - int error2; + int error, error2; xfs_iunlock(ip, iolock); if (need_i_mutex) mutex_unlock(&inode->i_mutex); - error2 = filemap_write_and_wait_range(mapping, pos, end); - if (!error) - error = error2; + error = filemap_write_and_wait_range(mapping, pos, end); if (need_i_mutex) mutex_lock(&inode->i_mutex); xfs_ilock(ip, iolock); error2 = -xfs_file_fsync(file, (file->f_flags & __O_SYNC) ? 0 : 1); - if (!error) - error = error2; + if (error) + ret = error; + else if (error2) + ret = error2; } out_unlock_internal: @@ -800,7 +799,7 @@ write_retry: out_unlock_mutex: if (need_i_mutex) mutex_unlock(&inode->i_mutex); - return -error; + return ret; } STATIC int -- 1.7.2.3 From SRS0+G9TF+38+fromorbit.com=dave@internode.on.net Mon Jan 3 22:47:05 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p044l4eH176090 for ; Mon, 3 Jan 2011 22:47:04 -0600 X-ASG-Debug-ID: 1294116550-3fd800230000-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 0758D1536274 for ; Mon, 3 Jan 2011 20:49:10 -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 GV1J9l5JHrIhubiJ for ; Mon, 03 Jan 2011 20:49:10 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 6463944-1927428 for ; Tue, 04 Jan 2011 15:19:09 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PZypT-0000TG-BV for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:49:03 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PZypH-0003tm-L9 for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:48:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 6/8] xfs: split buffered IO write path from xfs_file_aio_write Subject: [PATCH 6/8] xfs: split buffered IO write path from xfs_file_aio_write Date: Tue, 4 Jan 2011 15:48:36 +1100 Message-Id: <1294116518-14908-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294116518-14908-1-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1294116552 X-Barracuda-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.51369 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 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 | 146 ++++++++++++++++++++----------------------- 1 files changed, 69 insertions(+), 77 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index d546953..7e7805c 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -724,56 +724,31 @@ 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 *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; - int ioflags = 0; + ssize_t ret; + int enospc = 0; xfs_fsize_t new_size; - int iolock; - size_t ocount = 0, count; - - 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; - - ret = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); - if (ret) - return ret; - - count = ocount; - if (count == 0) - return 0; - - xfs_wait_for_freeze(mp, SB_FREEZE_WRITE); - - if (XFS_FORCED_SHUTDOWN(mp)) - return -EIO; + size_t count = ocount; - if (ioflags & IO_ISDIRECT) { - ret = xfs_file_dio_aio_write(iocb, iovp, nr_segs, pos, - ocount, &iolock); - goto done_io; - } + *iolock = XFS_IOLOCK_EXCL; + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|*iolock); - iolock = XFS_IOLOCK_EXCL; ret = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|*iolock); + *iolock = 0; return ret; } @@ -781,69 +756,86 @@ xfs_file_aio_write( 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) { ret = -xfs_zero_eof(ip, pos, ip->i_size); if (ret) { xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); - goto out_unlock_internal; + return ret; } } xfs_rw_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. - */ ret = file_remove_suid(file); if (unlikely(ret)) - goto out_unlock_internal; + return ret; /* We can write back this queue in page reclaim */ current->backing_dev_info = mapping->backing_dev_info; - if (!(ioflags & IO_ISDIRECT)) { - int enospc = 0; - write_retry: - trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, ioflags); - ret = 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 (ret == -ENOSPC && !enospc) { - ssize_t ret2 = xfs_flush_pages(ip, 0, -1, 0, FI_NONE); - if (ret2) { - ret = ret2; - goto out_unlock_internal; - } - enospc = 1; - goto write_retry; - } + trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, 0); + ret = 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 (ret == -ENOSPC && !enospc) { + ret = -xfs_flush_pages(ip, 0, -1, 0, FI_NONE); + if (ret) + return ret; + enospc = 1; + goto write_retry; } - current->backing_dev_info = NULL; + return ret; +} + +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; + int iolock; + size_t ocount = 0; + + XFS_STATS_INC(xs_write_calls); + + BUG_ON(iocb->ki_pos != pos); + + ret = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); + if (ret) + return ret; + + 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, &iolock); + else + ret = xfs_file_buffered_aio_write(iocb, iovp, nr_segs, pos, + ocount, &iolock); -done_io: xfs_aio_write_isize_update(inode, &iocb->ki_pos, ret); if (ret <= 0) - goto out_unlock_internal; + goto out_unlock; XFS_STATS_ADD(xs_write_bytes, ret); @@ -864,7 +856,7 @@ done_io: ret = error2; } - out_unlock_internal: +out_unlock: xfs_aio_write_newsize_update(ip); xfs_rw_iunlock(ip, iolock); return ret; -- 1.7.2.3 From SRS0+98R0+38+fromorbit.com=dave@internode.on.net Mon Jan 3 22:47:38 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p044lbpl176146 for ; Mon, 3 Jan 2011 22:47:38 -0600 X-ASG-Debug-ID: 1294116573-698e03d30000-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 E0BF61D08392 for ; Mon, 3 Jan 2011 20:49: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 5HFGpiplVOOwXdNj for ; Mon, 03 Jan 2011 20:49:34 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 40314813-1927428 for ; Tue, 04 Jan 2011 15:19:33 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PZypv-0000TW-Nk for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:49:31 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PZypt-0003vI-Vs for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:49:29 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: ensure log covering transactions are synchronous Subject: [PATCH] xfs: ensure log covering transactions are synchronous Date: Tue, 4 Jan 2011 15:49:29 +1100 Message-Id: <1294116569-15052-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: 1294116575 X-Barracuda-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.51370 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 ensure the log is covered and the filesystem idles correctly, we need to ensure that dummy transactions hit the disk and do not stay pinned in memory. If the superblock is pinned in memory, it can't be flushed so the log covering cannot make progress. The result is dependent on timing - more oftent han not we continue to issues a log covering transaction every 36s rather than idling after ~90s. Fix this by making the log covering transaction synchronous. To avoid additional log force from xfssyncd, make the log covering transaction take the place of the existing log force in the xfssyncd background sync process. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 2 +- fs/xfs/linux-2.6/xfs_sync.c | 11 ++++++----- fs/xfs/xfs_fsops.c | 10 +++++----- fs/xfs/xfs_fsops.h | 2 +- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index c51faaa..af32f37 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1413,7 +1413,7 @@ xfs_fs_freeze( xfs_save_resvblks(mp); xfs_quiesce_attr(mp); - return -xfs_fs_log_dummy(mp, SYNC_WAIT); + return -xfs_fs_log_dummy(mp); } STATIC int diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index a02480d..e22f005 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -362,7 +362,7 @@ xfs_quiesce_data( /* mark the log as covered if needed */ if (xfs_log_need_covered(mp)) - error2 = xfs_fs_log_dummy(mp, SYNC_WAIT); + error2 = xfs_fs_log_dummy(mp); /* flush data-only devices */ if (mp->m_rtdev_targp) @@ -503,13 +503,14 @@ xfs_sync_worker( int error; if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { - xfs_log_force(mp, 0); - xfs_reclaim_inodes(mp, 0); /* dgc: errors ignored here */ - error = xfs_qm_sync(mp, SYNC_TRYLOCK); if (mp->m_super->s_frozen == SB_UNFROZEN && xfs_log_need_covered(mp)) - error = xfs_fs_log_dummy(mp, 0); + error = xfs_fs_log_dummy(mp); + else + xfs_log_force(mp, 0); + xfs_reclaim_inodes(mp, 0); + error = xfs_qm_sync(mp, SYNC_TRYLOCK); } mp->m_sync_seq++; wake_up(&mp->m_wait_single_sync_task); diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index f56d30e..cec89dd 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -612,12 +612,13 @@ out: * * We cannot use an inode here for this - that will push dirty state back up * into the VFS and then periodic inode flushing will prevent log covering from - * making progress. Hence we log a field in the superblock instead. + * making progress. Hence we log a field in the superblock instead and use a + * synchronous transaction to ensure the superblock is immediately unpinned + * and can be written back. */ int xfs_fs_log_dummy( - xfs_mount_t *mp, - int flags) + xfs_mount_t *mp) { xfs_trans_t *tp; int error; @@ -632,8 +633,7 @@ xfs_fs_log_dummy( /* log the UUID because it is an unchanging field */ xfs_mod_sb(tp, XFS_SB_UUID); - if (flags & SYNC_WAIT) - xfs_trans_set_sync(tp); + xfs_trans_set_sync(tp); return xfs_trans_commit(tp, 0); } diff --git a/fs/xfs/xfs_fsops.h b/fs/xfs/xfs_fsops.h index a786c52..1b6a98b 100644 --- a/fs/xfs/xfs_fsops.h +++ b/fs/xfs/xfs_fsops.h @@ -25,6 +25,6 @@ extern int xfs_fs_counts(xfs_mount_t *mp, xfs_fsop_counts_t *cnt); extern int xfs_reserve_blocks(xfs_mount_t *mp, __uint64_t *inval, xfs_fsop_resblks_t *outval); extern int xfs_fs_goingdown(xfs_mount_t *mp, __uint32_t inflags); -extern int xfs_fs_log_dummy(xfs_mount_t *mp, int flags); +extern int xfs_fs_log_dummy(struct xfs_mount *mp); #endif /* __XFS_FSOPS_H__ */ -- 1.7.2.3 From SRS0+98R0+38+fromorbit.com=dave@internode.on.net Mon Jan 3 22:48:08 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p044m76N176201 for ; Mon, 3 Jan 2011 22:48:08 -0600 X-ASG-Debug-ID: 1294116612-7e1200390000-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 A0305230982 for ; Mon, 3 Jan 2011 20:50:13 -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 JsvL3trfZYkIYDmC for ; Mon, 03 Jan 2011 20:50:13 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52194523-1927428 for ; Tue, 04 Jan 2011 15:20:12 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PZyqZ-0000Ta-5R for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:50:11 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PZyqX-0003wg-DP for xfs@oss.sgi.com; Tue, 04 Jan 2011 15:50:09 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: errors on sync superblock writes leave it locked Subject: [PATCH] xfs: errors on sync superblock writes leave it locked Date: Tue, 4 Jan 2011 15:50:09 +1100 Message-Id: <1294116609-15138-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1294116614 X-Barracuda-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.51370 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 If we get an IO error on a synchronous superblock write, we attach a error release function to it so that when the last reference goes away the release function is called and the buffer is invalidated and unlocked. The buffer is left locked until the release function is called so that other concurrent users of the buffer will be locked out until the buffer error is fully processed. Unfortunately, for the superblock buffer the filesyetm itself holds a reference to the buffer which prevents the reference count from dropping to zero and the release function being called. As a result, once an IO error occurs on a sync write, the buffer will never be unlocked and all future attempts to lock the buffer will hang. To make matters worse, this problems is not unique to such buffers; if there is a concurrent _xfs_buf_find() running, the lookup will grab a reference to the buffer and then wait on the buffer lock, preventing the reference count from ever falling to zero and hence unlocking the buffer. As such, the whole b_relse function implementation is broken because it cannot rely on the buffer reference count falling to zero to unlock the errored buffer. The synchronous write error path is the only path that uses this callback - it is used to ensure that the synchronous waiter gets the buffer error before the error state is cleared from the buffer by the release function. Given that the only sychronous buffer writes now go through xfs_bwrite() and the error path in question can only occur for a write of a dirty, logged buffer, we can call the b_relse function when an error is detected in xfs_bwrite() after calling xfs_buf_iowait(). The subsequent xfs_buf_relse() call in xfs_bwrite() will then unlock the buffer and everything should continue as per normal. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_buf.c | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 92f1f2a..1775269 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -908,11 +908,8 @@ xfs_buf_rele( 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) && + ASSERT(!bp->b_relse); + if (!(bp->b_flags & XBF_STALE) && atomic_read(&bp->b_lru_ref)) { xfs_buf_lru_add(bp); spin_unlock(&pag->pag_buf_lock); @@ -1112,8 +1109,16 @@ xfs_bwrite( xfs_bdstrat_cb(bp); error = xfs_buf_iowait(bp); - if (error) + if (error) { + /* + * If the error caused a release function to be set, call it + * now to clear the error from the buffer as we have already + * harvested it. + */ xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); + if (bp->b_relse) + bp->b_relse(bp); + } xfs_buf_relse(bp); return error; } -- 1.7.2.3 From dkburrows@yahoo.com Mon Jan 3 22:48:26 2011 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_50,FREEMAIL_FROM, T_DKIM_INVALID,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 p044mPKv176239 for ; Mon, 3 Jan 2011 22:48:26 -0600 X-ASG-Debug-ID: 1294116632-38c803480000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from web31912.mail.mud.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id F12AF230B7C for ; Mon, 3 Jan 2011 20:50:32 -0800 (PST) Received: from web31912.mail.mud.yahoo.com (web31912.mail.mud.yahoo.com [68.142.207.92]) by cuda.sgi.com with SMTP id NHZUgYwqSQBLgyBJ for ; Mon, 03 Jan 2011 20:50:32 -0800 (PST) Received: (qmail 61952 invoked by uid 60001); 4 Jan 2011 04:50:32 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1294116632; bh=ICwx0h+NSc5up14cluarXs7aIxaCg6LQeTYfhqx+uDk=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Subject:To:MIME-Version:Content-Type; b=kEpiBdMr5KuVzKtpWESuPVr2mnwivIzsqGFF4VMOc+uZK/KpXTTW5/cMJlAVyBeCVaMC67UVE3h1MfxeFUO54eUh/vh0X4W9EPXL1XLBoh29F0+UxfzzbSa2uW3Xqgz4orbJjU4z6gosP1jMsQlmmA8BwR9LNz9mIn7r1GtDPdM= DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Subject:To:MIME-Version:Content-Type; b=3HhaX4uzjaORCzWq1PBrCVAefbpl4W8Yyc5ABDqV3A92AZTKcIX0lpnLpIeCT/f8H0xyXmoUG7W8NDrm7Ou23DOjYzZAwYqceL8RtHGkS5DmRBrOujYKCvJc/mYVCb78Lwl0ubhVUonKaeCmSd0eoLR57RojPNOb/Vp4PZWadNM=; Message-ID: <41292.59911.qm@web31912.mail.mud.yahoo.com> X-YMail-OSG: cY9vnigVM1kmEHpXhkxWOwj7kl6lkaGo610.zTvqZPDnTf8 EpixBz7AYRAl.ScmbvWYD88LvSzbLQ3fuP2exBgJIqM35e12f.egsaIY6V_w C7hivPTgXQIg5bowwwzpS2euGDpBEuNxeVcNwskJAt9sGV5vkOE5exD0MLr. .EaIFSHbhSNY4xO9BE1fh4UeoiU0e8cn6LwZ17gItND4SXDwz31p9BOB5N_x J2R2ZuTu7_w5iqu6Nwjw3VkCITraI5jHkcl80NRE7GkpqQ1YoRTwm3LVb_NW jky3z7rJ03TbantQpqd_w.y5nFd.SJgB_yhxoyhtYGDph2jrtWpiR58hh3yf 9aR4em41WGvBkM5r1gxhfpPv.HgpYn7_wlUkE.asmF4GeZymrW8ZOfOhkBCu g.oEjfdsgprtm Received: from [69.165.152.5] by web31912.mail.mud.yahoo.com via HTTP; Mon, 03 Jan 2011 20:50:32 PST X-Mailer: YahooMailRC/553 YahooMailWebService/0.8.107.285259 Date: Mon, 3 Jan 2011 20:50:32 -0800 (PST) From: Dean Burrows X-ASG-Orig-Subj: Accidentally deleted an external log, any recovery options? Subject: Accidentally deleted an external log, any recovery options? To: xfs@oss.sgi.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: web31912.mail.mud.yahoo.com[68.142.207.92] X-Barracuda-Start-Time: 1294116632 X-Barracuda-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.51370 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, I was trying a different distro and in doing so deleted a partition that held an xfs external log. Now I can't mount or repair the drive that was using that external log. Is there a way to get the data off, or to create an internal log without losing the data? From SRS0+TsZX+38+fromorbit.com=david@internode.on.net Mon Jan 3 23:01:07 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p04516BJ177070 for ; Mon, 3 Jan 2011 23:01:07 -0600 X-ASG-Debug-ID: 1294117391-499d00530000-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 E76971D083ED for ; Mon, 3 Jan 2011 21:03:12 -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 O2Hp1fTGnjmjVdAh for ; Mon, 03 Jan 2011 21:03:12 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51170817-1927428 for ; Tue, 04 Jan 2011 15:33:11 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PZz2x-0000VY-5R for xfs@oss.sgi.com; Tue, 04 Jan 2011 16:02:59 +1100 Date: Tue, 4 Jan 2011 16:02:59 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: My current xfs-for-2.6.38 tree.... Subject: My current xfs-for-2.6.38 tree.... Message-ID: <20110104050259.GH15179@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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: 1294117393 X-Barracuda-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.51370 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, FYI, my current xfs-for-2.6.38 tree has just been updated. Changes since last update: - dropped the per-cpu superblock counter cleanup patches from it so we can get it right before merging. - added unaligned aio/dio write fix series (needs review) - added log covering idle fix (needs review) - added superblock write error hang fix (needs review) The tree can be found here (when the rsync updates git.kernel.org): 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 (40): xfs: provide a inode iolock lockdep class xfs: use KM_NOFS for allocations during attribute list operations 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: ensure sync write errors are returned xfs: factor common post-write isize handling code xfs: factor post-write newsize updates xfs: introduce xfs_rw_lock() helpers for locking the inode 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 xfs: ensure log covering transactions are synchronous xfs: errors on sync superblock writes leave it locked fs/xfs/linux-2.6/sv.h | 59 ---- fs/xfs/linux-2.6/xfs_buf.c | 248 ++++++++++----- fs/xfs/linux-2.6/xfs_buf.h | 22 +- fs/xfs/linux-2.6/xfs_file.c | 528 +++++++++++++++++------------- fs/xfs/linux-2.6/xfs_linux.h | 1 - fs/xfs/linux-2.6/xfs_super.c | 24 ++- fs/xfs/linux-2.6/xfs_sync.c | 103 +++++-- 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_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 | 11 +- fs/xfs/xfs_fsops.h | 2 +- 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 | 739 +++++++++++++++++++----------------------- 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 | 23 ++- fs/xfs/xfs_mount.h | 14 + fs/xfs/xfs_trans.c | 79 +++++- 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 +++-- 34 files changed, 1723 insertions(+), 1162 deletions(-) delete mode 100644 fs/xfs/linux-2.6/sv.h -- Dave Chinner david@fromorbit.com From SRS0+THj7+38+fromorbit.com=david@internode.on.net Mon Jan 3 23:17:45 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p045HiRl180311 for ; Mon, 3 Jan 2011 23:17:44 -0600 X-ASG-Debug-ID: 1294118389-3fef006c0000-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 C1042F9BB6C for ; Mon, 3 Jan 2011 21:19: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 aABl7LG7RwNY2sRV for ; Mon, 03 Jan 2011 21:19:50 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51495139-1927428 for multiple; Tue, 04 Jan 2011 15:49:49 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PZzJD-0000XZ-Gr; Tue, 04 Jan 2011 16:19:47 +1100 Date: Tue, 4 Jan 2011 16:19:47 +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: <20110104051947.GI15179@dastard> References: <20101230231353.GC15179@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-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1294118391 X-Barracuda-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.51371 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 31, 2010 at 12:17:12PM +0530, Ajeet Yadav wrote: > 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; > } This won't work reliably because it only handles one specific type of error. We can get more than just EIO back from the lower layers, and so if the superblock write gets a different error then we'll still get the same hang. Effectively what you are doing here is running the xfs_buf_error_relse() callback directly in line. This will result in the buffer being unlocked before the error is pulled off the buffer after xfs_buf_iowait() completes. Essentially that means that some other thread can reuse the buffer and clear the error before the waiter has received the error. I think the correct fix is to call the bp->b_relse function when the waiter is woken to clear the error and unlock the buffer. I've just posted a patch to do this for 2.6.38, but it won't trivially backport to 2.6.34 or 2.6.30 as the synchronous write interfaces into the buffer cache have been cleaned up and simplified recently. It should still be relatively easy to handle, though. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+OI6W+38+fromorbit.com=david@internode.on.net Mon Jan 3 23:24:34 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p045OYRp181897 for ; Mon, 3 Jan 2011 23:24:34 -0600 X-ASG-Debug-ID: 1294118800-499900ba0000-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 233DB1D0851E for ; Mon, 3 Jan 2011 21:26:40 -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 TOK0qd49Al1HHKxb for ; Mon, 03 Jan 2011 21:26:40 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51519963-1927428 for multiple; Tue, 04 Jan 2011 15:56:39 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PZzPq-0000Y8-28; Tue, 04 Jan 2011 16:26:38 +1100 Date: Tue, 4 Jan 2011 16:26:38 +1100 From: Dave Chinner To: Dean Burrows Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Accidentally deleted an external log, any recovery options? Subject: Re: Accidentally deleted an external log, any recovery options? Message-ID: <20110104052637.GJ15179@dastard> References: <41292.59911.qm@web31912.mail.mud.yahoo.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41292.59911.qm@web31912.mail.mud.yahoo.com> 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: 1294118802 X-Barracuda-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.51372 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, Jan 03, 2011 at 08:50:32PM -0800, Dean Burrows wrote: > Hello, > > > I was trying a different distro and in doing so deleted a partition that held an > xfs external log. Now I can't mount or repair the drive that was using that > external log. Is there a way to get the data off, or to create an internal log > without losing the data? Just create a new partition for the external log, zero it, and tell XFS to use that. You'll have lost any metadata that was in the log, so once you have a new external log run xfs_repair -n to check that everything is consistent. If it isn't, then back up everything you can and run repair for real to fix whatever problems there are. Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+dda0c5f29cde9a37fc23+2690+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 3 23:52:36 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p045qaB2184555 for ; Mon, 3 Jan 2011 23:52:36 -0600 X-ASG-Debug-ID: 1294120483-7e14011b0000-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 D5F03230E45 for ; Mon, 3 Jan 2011 21:54:43 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id z8eHAXo5LFOUhG59 for ; Mon, 03 Jan 2011 21: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 1PZzqz-0002aX-JX; Tue, 04 Jan 2011 05:54:41 +0000 Date: Tue, 4 Jan 2011 00:54:41 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: My current xfs-for-2.6.38 tree.... Subject: Re: My current xfs-for-2.6.38 tree.... Message-ID: <20110104055441.GA9870@infradead.org> References: <20110104050259.GH15179@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110104050259.GH15179@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: 1294120483 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, Jan 04, 2011 at 04:02:59PM +1100, Dave Chinner wrote: > Folks, > > FYI, my current xfs-for-2.6.38 tree has just been updated. Changes > since last update: > > - dropped the per-cpu superblock counter cleanup patches > from it so we can get it right before merging. > - added unaligned aio/dio write fix series (needs review) > - added log covering idle fix (needs review) > - added superblock write error hang fix (needs review) > > The tree can be found here (when the rsync updates git.kernel.org): I'll try to get to review the new patches, but can we please get the metadata scalability patches into the xfs tree and thus linux-next ASAP? The merge window is about to open, and we really need to get that stuff in now. From SRS0+G9TF+38+fromorbit.com=dave@internode.on.net Tue Jan 4 00:10:53 2011 X-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 p046Aq8w190589 for ; Tue, 4 Jan 2011 00:10:52 -0600 X-ASG-Debug-ID: 1294121577-7c87006a0000-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 7A5AD161ABA0 for ; Mon, 3 Jan 2011 22:12:58 -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 YNGsxSlTdI2mPGA7 for ; Mon, 03 Jan 2011 22:12:58 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 6472723-1927428 for ; Tue, 04 Jan 2011 16:42:57 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1Pa08T-0000dT-NF for xfs@oss.sgi.com; Tue, 04 Jan 2011 17:12:45 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pa08R-0004T9-Eg for xfs@oss.sgi.com; Tue, 04 Jan 2011 17:12:43 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] repair: warn if running in low memory mode Subject: [PATCH] repair: warn if running in low memory mode Date: Tue, 4 Jan 2011 17:12:43 +1100 Message-Id: <1294121563-17150-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: 1294121579 X-Barracuda-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.51375 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 checking large filesystems, xfs_repair makes an estimate of how much RAM it will need to execute effectively. If the amount of RAM is less than this, it reduces the bhash size and turns of prefetching, which will substantially slow down the repair process. Add a warning that indicates this is happening, along with a recommendation of how much RAM repair calculates it needs to run with prefetching enabled. Signed-off-by: Dave Chinner --- repair/xfs_repair.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index e36eeae..eea1b34 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -650,12 +650,20 @@ main(int argc, char **argv) * Turn off prefetch and minimise libxfs cache if * physical memory is deemed insufficient */ - if (max_mem_specified) + if (max_mem_specified) { do_abort(_("Required memory for repair is " "greater that the maximum specified " "with the -m option. Please increase " "it to at least %lu.\n"), mem_used / 1024); + } else { + do_warn(_("Not enough RAM available for repair " + "to enable prefetching. This will be " + "_slow_.\n" + "You need at least %luMB RAM to run " + "with prefetching enabled."), + mem_used * 1280 / (1024 * 1024)); + } do_prefetch = 0; libxfs_bhash_size = 64; } else { -- 1.7.2.3 From SRS0+98R0+38+fromorbit.com=dave@internode.on.net Tue Jan 4 00:11:07 2011 X-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 p046B73x190624 for ; Tue, 4 Jan 2011 00:11:07 -0600 X-ASG-Debug-ID: 1294121592-3b33004b0000-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 9E318230F9C for ; Mon, 3 Jan 2011 22:13:13 -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 wchAF0gxibU3jt6D for ; Mon, 03 Jan 2011 22:13:13 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52203256-1927428 for ; Tue, 04 Jan 2011 16:43:12 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1Pa08s-0000dY-Ir for xfs@oss.sgi.com; Tue, 04 Jan 2011 17:13:10 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pa08q-0004UT-AI for xfs@oss.sgi.com; Tue, 04 Jan 2011 17:13:08 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs_repair: multithread phase 2 Subject: [PATCH] xfs_repair: multithread phase 2 Date: Tue, 4 Jan 2011 17:13:08 +1100 Message-Id: <1294121588-17233-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1294121594 X-Barracuda-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.51374 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 Running some recent repair tests on broken filesystem meant running phase 1 and 2 repeatedly to reproduce an issue at the start of phase 3. Phase 2 was taking approximately 10 minutes to run as it processes each AG serially. Phase 2 can be trivially parallelised - it is simply scanning the per AG trees to calculate free block counts and free and used inodes counts. This can be done safely in parallel by giving each AG it's own structure to aggregate counts into, then once the AG scan is complete adding them all together. This patch uses 32-way threading which results in no noticable slowdown on single SATA drives with NCQ, but results in ~10x reduction in runtime on a 12 disk RAID-0 array. Signed-off-by: Dave Chinner --- repair/phase2.c | 16 +--- repair/scan.c | 303 +++++++++++++++++++++++++++++++----------------------- repair/scan.h | 37 ------- 3 files changed, 176 insertions(+), 180 deletions(-) diff --git a/repair/phase2.c b/repair/phase2.c index e81ebf0..2f22c51 100644 --- a/repair/phase2.c +++ b/repair/phase2.c @@ -26,8 +26,7 @@ #include "progress.h" void set_mp(xfs_mount_t *mpp); -void scan_ag(xfs_agnumber_t agno); -void validate_sb(struct xfs_sb *sb); +void scan_ags(struct xfs_mount *mp); /* workaround craziness in the xlog routines */ int xlog_recover_do_trans(xlog_t *log, xlog_recover_t *t, int p) { return 0; } @@ -109,7 +108,6 @@ zero_log(xfs_mount_t *mp) void phase2(xfs_mount_t *mp) { - xfs_agnumber_t i; int j; ino_tree_node_t *ino_rec; @@ -138,17 +136,7 @@ phase2(xfs_mount_t *mp) set_progress_msg(PROG_FMT_SCAN_AG, (__uint64_t) glob_agcount); - for (i = 0; i < mp->m_sb.sb_agcount; i++) { - scan_ag(i); -#ifdef XR_INODE_TRACE - print_inode_list(i); -#endif - } - - /* - * Validate that our manual counts match the superblock. - */ - validate_sb(&mp->m_sb); + scan_ags(mp); print_final_rpt(); diff --git a/repair/scan.c b/repair/scan.c index 85017ff..dd62776 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -35,27 +35,32 @@ extern int verify_set_agheader(xfs_mount_t *mp, xfs_buf_t *sbuf, xfs_sb_t *sb, static xfs_mount_t *mp = NULL; /* - * Global variables to validate superblock values against the manual count + * Variables to validate AG header values against the manual count * from the btree traversal. - * - * No locking for now as phase2 is not threaded. */ -static __uint64_t fdblocks; -static __uint64_t icount; -static __uint64_t ifreecount; +struct aghdr_cnts { + xfs_agnumber_t agno; + xfs_extlen_t agffreeblks; + xfs_extlen_t agflongest; + __uint64_t agfbtreeblks; + __uint32_t agicount; + __uint32_t agifreecount; + __uint64_t fdblocks; + __uint64_t icount; + __uint64_t ifreecount; +}; + +static void +scanfunc_allocbt( + struct xfs_btree_block *block, + int level, + xfs_agblock_t bno, + xfs_agnumber_t agno, + int suspect, + int isroot, + __uint32_t magic, + struct aghdr_cnts *agcnts); -/* - * Global variables to validate AG header values against the manual count - * from the btree traversal. - * - * Note: these values must be reset when processing a new AG, and for now - * forces the AG scanning in phase2 to not be threaded. - */ -static xfs_extlen_t agffreeblks; -static xfs_extlen_t agflongest; -static __uint64_t agfbtreeblks; -static __uint32_t agicount; -static __uint32_t agifreecount; void set_mp(xfs_mount_t *mpp) @@ -75,8 +80,10 @@ scan_sbtree( xfs_agblock_t bno, xfs_agnumber_t agno, int suspect, - int isroot), - int isroot) + int isroot, + struct aghdr_cnts *agcnts), + int isroot, + struct aghdr_cnts *agcnts) { xfs_buf_t *bp; @@ -86,7 +93,8 @@ scan_sbtree( do_error(_("can't read btree block %d/%d\n"), agno, root); return; } - (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, root, agno, suspect, isroot); + (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, root, agno, suspect, + isroot, agcnts); libxfs_putbuf(bp); } @@ -469,6 +477,34 @@ _("out-of-order bmap key (file offset) in inode %llu, %s fork, fsbno %llu\n"), } void +scanfunc_bno( + struct xfs_btree_block *block, + int level, + xfs_agblock_t bno, + xfs_agnumber_t agno, + int suspect, + int isroot, + struct aghdr_cnts *agcnts) +{ + return scanfunc_allocbt(block, level, bno, agno, + suspect, isroot, XFS_ABTB_MAGIC, agcnts); +} + +void +scanfunc_cnt( + struct xfs_btree_block *block, + int level, + xfs_agblock_t bno, + xfs_agnumber_t agno, + int suspect, + int isroot, + struct aghdr_cnts *agcnts) +{ + return scanfunc_allocbt(block, level, bno, agno, + suspect, isroot, XFS_ABTC_MAGIC, agcnts); +} + +void scanfunc_allocbt( struct xfs_btree_block *block, int level, @@ -476,7 +512,8 @@ scanfunc_allocbt( xfs_agnumber_t agno, int suspect, int isroot, - __uint32_t magic) + __uint32_t magic, + struct aghdr_cnts *agcnts) { const char *name; int i; @@ -506,8 +543,8 @@ scanfunc_allocbt( * free data block counter. */ if (!isroot) { - agfbtreeblks++; - fdblocks++; + agcnts->agfbtreeblks++; + agcnts->fdblocks++; } if (be16_to_cpu(block->bb_level) != level) { @@ -583,10 +620,10 @@ _("%s freespace btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), lastblock = b; } } else { - fdblocks += len; - agffreeblks += len; - if (len > agflongest) - agflongest = len; + agcnts->fdblocks += len; + agcnts->agffreeblks += len; + if (len > agcnts->agflongest) + agcnts->agflongest = len; if (len < lastcount) { do_warn(_( "out-of-order cnt btree record %d (%u %u) block %u/%u\n"), @@ -670,38 +707,12 @@ _("%s freespace btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), if (bno != 0 && verify_agbno(mp, agno, bno)) { scan_sbtree(bno, level, agno, suspect, (magic == XFS_ABTB_MAGIC) ? - scanfunc_bno : scanfunc_cnt, 0); + scanfunc_bno : scanfunc_cnt, 0, + agcnts); } } } -void -scanfunc_bno( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot) -{ - return scanfunc_allocbt(block, level, bno, agno, - suspect, isroot, XFS_ABTB_MAGIC); -} - -void -scanfunc_cnt( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot - ) -{ - return scanfunc_allocbt(block, level, bno, agno, - suspect, isroot, XFS_ABTC_MAGIC); -} - static int scan_single_ino_chunk( xfs_agnumber_t agno, @@ -886,8 +897,8 @@ scanfunc_ino( xfs_agblock_t bno, xfs_agnumber_t agno, int suspect, - int isroot - ) + int isroot, + struct aghdr_cnts *agcnts) { int i; int numrecs; @@ -968,10 +979,10 @@ _("inode btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), * the block. skip processing of bogus records. */ for (i = 0; i < numrecs; i++) { - agicount += XFS_INODES_PER_CHUNK; - icount += XFS_INODES_PER_CHUNK; - agifreecount += be32_to_cpu(rp[i].ir_freecount); - ifreecount += be32_to_cpu(rp[i].ir_freecount); + agcnts->agicount += XFS_INODES_PER_CHUNK; + agcnts->icount += XFS_INODES_PER_CHUNK; + agcnts->agifreecount += be32_to_cpu(rp[i].ir_freecount); + agcnts->ifreecount += be32_to_cpu(rp[i].ir_freecount); suspect = scan_single_ino_chunk(agno, &rp[i], suspect); } @@ -1015,13 +1026,14 @@ _("inode btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), if (be32_to_cpu(pp[i]) != 0 && verify_agbno(mp, agno, be32_to_cpu(pp[i]))) scan_sbtree(be32_to_cpu(pp[i]), level, agno, - suspect, scanfunc_ino, 0); + suspect, scanfunc_ino, 0, agcnts); } } void scan_freelist( - xfs_agf_t *agf) + xfs_agf_t *agf, + struct aghdr_cnts *agcnts) { xfs_agfl_t *agfl; xfs_buf_t *agflbuf; @@ -1068,7 +1080,7 @@ scan_freelist( be32_to_cpu(agf->agf_flcount), agno); } - fdblocks += count; + agcnts->fdblocks += count; libxfs_putbuf(agflbuf); } @@ -1076,14 +1088,15 @@ scan_freelist( static void validate_agf( struct xfs_agf *agf, - xfs_agnumber_t agno) + xfs_agnumber_t agno, + struct aghdr_cnts *agcnts) { xfs_agblock_t bno; bno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_BNO]); if (bno != 0 && verify_agbno(mp, agno, bno)) { scan_sbtree(bno, be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]), - agno, 0, scanfunc_bno, 1); + agno, 0, scanfunc_bno, 1, agcnts); } else { do_warn(_("bad agbno %u for btbno root, agno %d\n"), bno, agno); @@ -1092,33 +1105,34 @@ validate_agf( bno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_CNT]); if (bno != 0 && verify_agbno(mp, agno, bno)) { scan_sbtree(bno, be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]), - agno, 0, scanfunc_cnt, 1); + agno, 0, scanfunc_cnt, 1, agcnts); } else { do_warn(_("bad agbno %u for btbcnt root, agno %d\n"), bno, agno); } - if (be32_to_cpu(agf->agf_freeblks) != agffreeblks) { + if (be32_to_cpu(agf->agf_freeblks) != agcnts->agffreeblks) { do_warn(_("agf_freeblks %u, counted %u in ag %u\n"), - be32_to_cpu(agf->agf_freeblks), agffreeblks, agno); + be32_to_cpu(agf->agf_freeblks), agcnts->agffreeblks, agno); } - if (be32_to_cpu(agf->agf_longest) != agflongest) { + if (be32_to_cpu(agf->agf_longest) != agcnts->agflongest) { do_warn(_("agf_longest %u, counted %u in ag %u\n"), - be32_to_cpu(agf->agf_longest), agflongest, agno); + be32_to_cpu(agf->agf_longest), agcnts->agflongest, agno); } if (xfs_sb_version_haslazysbcount(&mp->m_sb) && - be32_to_cpu(agf->agf_btreeblks) != agfbtreeblks) { + be32_to_cpu(agf->agf_btreeblks) != agcnts->agfbtreeblks) { do_warn(_("agf_btreeblks %u, counted %u in ag %u\n"), - be32_to_cpu(agf->agf_btreeblks), agfbtreeblks, agno); + be32_to_cpu(agf->agf_btreeblks), agcnts->agfbtreeblks, agno); } } static void validate_agi( struct xfs_agi *agi, - xfs_agnumber_t agno) + xfs_agnumber_t agno, + struct aghdr_cnts *agcnts) { xfs_agblock_t bno; int i; @@ -1126,20 +1140,20 @@ validate_agi( bno = be32_to_cpu(agi->agi_root); if (bno != 0 && verify_agbno(mp, agno, bno)) { scan_sbtree(bno, be32_to_cpu(agi->agi_level), - agno, 0, scanfunc_ino, 1); + agno, 0, scanfunc_ino, 1, agcnts); } else { do_warn(_("bad agbno %u for inobt root, agno %d\n"), be32_to_cpu(agi->agi_root), agno); } - if (be32_to_cpu(agi->agi_count) != agicount) { + if (be32_to_cpu(agi->agi_count) != agcnts->agicount) { do_warn(_("agi_count %u, counted %u in ag %u\n"), - be32_to_cpu(agi->agi_count), agicount, agno); + be32_to_cpu(agi->agi_count), agcnts->agicount, agno); } - if (be32_to_cpu(agi->agi_freecount) != agifreecount) { + if (be32_to_cpu(agi->agi_freecount) != agcnts->agifreecount) { do_warn(_("agi_freecount %u, counted %u in ag %u\n"), - be32_to_cpu(agi->agi_freecount), agifreecount, agno); + be32_to_cpu(agi->agi_freecount), agcnts->agifreecount, agno); } for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) { @@ -1155,42 +1169,15 @@ validate_agi( } /* - * Validate block/inode counts in the superblock. - * - * Note: needs to be called after scan_ag() has been called for all - * allocation groups. - */ -void -validate_sb( - struct xfs_sb *sb) -{ - if (sb->sb_icount != icount) { - do_warn(_("sb_icount %lld, counted %lld\n"), - sb->sb_icount, icount); - } - - if (sb->sb_ifree != ifreecount) { - do_warn(_("sb_ifree %lld, counted %lld\n"), - sb->sb_ifree, ifreecount); - } - - if (sb->sb_fdblocks != fdblocks) { - do_warn(_("sb_fdblocks %lld, counted %lld\n"), - sb->sb_fdblocks, fdblocks); - } - - /* XXX: check sb_frextents */ -} - -/* * Scan an AG for obvious corruption. * * Note: This code is not reentrant due to the use of global variables. */ -void -scan_ag( - xfs_agnumber_t agno) +void * +scan_ag(void *args) { + struct aghdr_cnts *agcnts = args; + xfs_agnumber_t agno = agcnts->agno; xfs_agf_t *agf; xfs_buf_t *agfbuf; int agf_dirty = 0; @@ -1202,28 +1189,18 @@ scan_ag( int sb_dirty = 0; int status; - /* - * Reset the global variables to track the AG header validity. - * - * Because we use global variable but can get called multiple times - * we have to make sure to always reset these variables. - */ - agicount = agifreecount = 0; - agffreeblks = agfbtreeblks = 0; - agflongest = 0; - sbbuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR), XFS_FSS_TO_BB(mp, 1), 0); if (!sbbuf) { do_error(_("can't get root superblock for ag %d\n"), agno); - return; + return NULL; } sb = (xfs_sb_t *)calloc(BBSIZE, 1); if (!sb) { do_error(_("can't allocate memory for superblock\n")); libxfs_putbuf(sbbuf); - return; + return NULL; } libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbbuf)); @@ -1234,7 +1211,7 @@ scan_ag( do_error(_("can't read agf block for ag %d\n"), agno); libxfs_putbuf(sbbuf); free(sb); - return; + return NULL; } agf = XFS_BUF_TO_AGF(agfbuf); @@ -1246,7 +1223,7 @@ scan_ag( libxfs_putbuf(agfbuf); libxfs_putbuf(sbbuf); free(sb); - return; + return NULL; } agi = XFS_BUF_TO_AGI(agibuf); @@ -1298,13 +1275,13 @@ scan_ag( do_warn(_("bad uncorrected agheader %d, skipping ag...\n"), agno); - return; + return NULL; } - scan_freelist(agf); + scan_freelist(agf, agcnts); - validate_agf(agf, agno); - validate_agi(agi, agno); + validate_agf(agf, agno, agcnts); + validate_agi(agi, agno, agcnts); ASSERT(agi_dirty == 0 || (agi_dirty && !no_modify)); @@ -1331,4 +1308,72 @@ scan_ag( libxfs_putbuf(sbbuf); free(sb); PROG_RPT_INC(prog_rpt_done[agno], 1); + +#ifdef XR_INODE_TRACE + print_inode_list(i); +#endif + return NULL; +} + +#define SCAN_THREADS 32 + +void +scan_ags( + struct xfs_mount *mp) +{ + struct aghdr_cnts agcnts[mp->m_sb.sb_agcount]; + pthread_t thr[SCAN_THREADS]; + __uint64_t fdblocks = 0; + __uint64_t icount = 0; + __uint64_t ifreecount = 0; + int i, j, err; + + /* + * scan a few AGs in parallel. The scan is IO latency bound, + * so running a few at a time will speed it up significantly. + */ + for (i = 0; i < mp->m_sb.sb_agcount; i += SCAN_THREADS) { + for (j = 0; j < SCAN_THREADS; j++) { + if (i + j >= mp->m_sb.sb_agcount) + break; + memset(&agcnts[i + j], 0, sizeof(agcnts[i])); + agcnts[i + j].agno = i + j; + err = pthread_create(&thr[j], NULL, scan_ag, + &agcnts[i + j]); + if (err) + do_abort(_("pthread_create failed in scan_ags\n")); + } + for (j = 0; j < SCAN_THREADS; j++) { + if (i + j >= mp->m_sb.sb_agcount) + break; + pthread_join(thr[j], NULL); + } + } + + for (i = 0; i < mp->m_sb.sb_agcount; i++) { + fdblocks += agcnts[i].fdblocks; + icount += agcnts[i].icount; + ifreecount += agcnts[i].ifreecount; + } + + /* + * Validate that our manual counts match the superblock. + */ + if (mp->m_sb.sb_icount != icount) { + do_warn(_("sb_icount %lld, counted %lld\n"), + mp->m_sb.sb_icount, icount); + } + + if (mp->m_sb.sb_ifree != ifreecount) { + do_warn(_("sb_ifree %lld, counted %lld\n"), + mp->m_sb.sb_ifree, ifreecount); + } + + if (mp->m_sb.sb_fdblocks != fdblocks) { + do_warn(_("sb_fdblocks %lld, counted %lld\n"), + mp->m_sb.sb_fdblocks, fdblocks); + } + + /* XXX: check sb_frextents */ } + diff --git a/repair/scan.h b/repair/scan.h index 20567fb..4de1cef 100644 --- a/repair/scan.h +++ b/repair/scan.h @@ -20,19 +20,6 @@ struct blkmap; -void scan_sbtree( - xfs_agblock_t root, - int nlevels, - xfs_agnumber_t agno, - int suspect, - void (*func)(struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot), - int isroot); - int scan_lbtree( xfs_dfsbno_t root, int nlevels, @@ -74,29 +61,5 @@ int scanfunc_bmap( int check_dups, int *dirty); -void scanfunc_bno( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot); - -void scanfunc_cnt( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot); - -void -scanfunc_ino( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot); #endif /* _XR_SCAN_H */ -- 1.7.2.3 From SRS0+THj7+38+fromorbit.com=david@internode.on.net Tue Jan 4 00:44:09 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p046i8HW195185 for ; Tue, 4 Jan 2011 00:44:08 -0600 X-ASG-Debug-ID: 1294123574-113101560000-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 DF1C31D08471 for ; Mon, 3 Jan 2011 22:46:14 -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 JZAIw8uJCBUPguyW for ; Mon, 03 Jan 2011 22:46:14 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 40326693-1927428 for multiple; Tue, 04 Jan 2011 17:16:13 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pa0eq-0000hG-3G; Tue, 04 Jan 2011 17:46:12 +1100 Date: Tue, 4 Jan 2011 17:46:12 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: My current xfs-for-2.6.38 tree.... Subject: Re: My current xfs-for-2.6.38 tree.... Message-ID: <20110104064612.GK15179@dastard> References: <20110104050259.GH15179@dastard> <20110104055441.GA9870@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110104055441.GA9870@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: 1294123575 X-Barracuda-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.51376 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, Jan 04, 2011 at 12:54:41AM -0500, Christoph Hellwig wrote: > On Tue, Jan 04, 2011 at 04:02:59PM +1100, Dave Chinner wrote: > > Folks, > > > > FYI, my current xfs-for-2.6.38 tree has just been updated. Changes > > since last update: > > > > - dropped the per-cpu superblock counter cleanup patches > > from it so we can get it right before merging. > > - added unaligned aio/dio write fix series (needs review) > > - added log covering idle fix (needs review) > > - added superblock write error hang fix (needs review) > > > > The tree can be found here (when the rsync updates git.kernel.org): > > I'll try to get to review the new patches, but can we please get the > metadata scalability patches into the xfs tree and thus linux-next ASAP? > The merge window is about to open, and we really need to get that stuff > in now. That's all first in the branch and reviewed, so Alex should be able to simply merge up to the last commit in that part of the series from the branch I posted. Alex, if you want I can set up a separate branch for the metadata scalability series.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+dda0c5f29cde9a37fc23+2690+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 4 02:19:28 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p048JQrm207440 for ; Tue, 4 Jan 2011 02:19:28 -0600 X-ASG-Debug-ID: 1294129293-58bc001c0000-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 F11EE161AE0E for ; Tue, 4 Jan 2011 00:21:33 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id cEhvrDiRnBPGg9Nv for ; Tue, 04 Jan 2011 00:21:33 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pa295-0008Hg-0G; Tue, 04 Jan 2011 08:21:31 +0000 Date: Tue, 4 Jan 2011 03:21:30 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: ensure log covering transactions are synchronous Subject: Re: [PATCH] xfs: ensure log covering transactions are synchronous Message-ID: <20110104082130.GA29016@infradead.org> References: <1294116569-15052-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294116569-15052-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: 1294129293 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 Ok, my fault for asking to avoid stalling xfssyncd. > Fix this by making the log covering transaction synchronous. To > avoid additional log force from xfssyncd, make the log covering > transaction take the place of the existing log force in the xfssyncd > background sync process. This also looks correct to me. We replace a force with a lsn-force, but given that we just started the transaction those should be equivalent. Reviewed-by: Christoph Hellwig From BATV+dda0c5f29cde9a37fc23+2690+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 4 03:41:32 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p049fVXf218284 for ; Tue, 4 Jan 2011 03:41:32 -0600 X-ASG-Debug-ID: 1294134218-7cec02cc0000-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 7888A1D08A5E for ; Tue, 4 Jan 2011 01:43:38 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 9GLmU3udpUdvCEk4 for ; Tue, 04 Jan 2011 01:43:38 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pa3QW-00067Y-Qj; Tue, 04 Jan 2011 09:43:36 +0000 Date: Tue, 4 Jan 2011 04:43:36 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: errors on sync superblock writes leave it locked Subject: Re: [PATCH] xfs: errors on sync superblock writes leave it locked Message-ID: <20110104094336.GA19193@infradead.org> References: <1294116609-15138-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294116609-15138-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: 1294134219 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 think the patch is quite correct. In the old code xfs_buf_rele incremented the buffer reference count before calling ->b_relse, expecting it do decrement it again. I think the best fix is to kill ->b_relse entirely. We can simply do the buffer callback processing and b_flags updates in xfs_buf_iodone_callbacks. The important thing is to not clear the buffer error there, so that it actually get propagated to the caller. As the buffer remains locked until xfs_bwrite calls xfs_buf_relse it can get the error reliably that way. Patch below, but it's still running xfqa so far: Index: xfs/fs/xfs/linux-2.6/xfs_buf.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.h 2011-01-04 09:42:44.763003651 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_buf.h 2011-01-04 09:54:08.443255013 +0100 @@ -152,8 +152,6 @@ typedef struct xfs_buftarg { struct xfs_buf; typedef void (*xfs_buf_iodone_t)(struct xfs_buf *); -typedef void (*xfs_buf_relse_t)(struct xfs_buf *); -typedef int (*xfs_buf_bdstrat_t)(struct xfs_buf *); #define XB_PAGES 2 @@ -183,7 +181,6 @@ typedef struct xfs_buf { void *b_addr; /* virtual address of buffer */ struct work_struct b_iodone_work; xfs_buf_iodone_t b_iodone; /* I/O completion function */ - xfs_buf_relse_t b_relse; /* releasing function */ struct completion b_iowait; /* queue for I/O waiters */ void *b_fspriv; void *b_fspriv2; @@ -323,7 +320,6 @@ void xfs_buf_stale(struct xfs_buf *bp); #define XFS_BUF_FSPRIVATE2(bp, type) ((type)(bp)->b_fspriv2) #define XFS_BUF_SET_FSPRIVATE2(bp, val) ((bp)->b_fspriv2 = (void*)(val)) #define XFS_BUF_SET_START(bp) do { } while (0) -#define XFS_BUF_SET_BRELSE_FUNC(bp, func) ((bp)->b_relse = (func)) #define XFS_BUF_PTR(bp) (xfs_caddr_t)((bp)->b_addr) #define XFS_BUF_SET_PTR(bp, val, cnt) xfs_buf_associate_memory(bp, val, cnt) @@ -360,8 +356,7 @@ xfs_buf_set_ref( static inline void xfs_buf_relse(xfs_buf_t *bp) { - if (!bp->b_relse) - xfs_buf_unlock(bp); + xfs_buf_unlock(bp); xfs_buf_rele(bp); } Index: xfs/fs/xfs/xfs_buf_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.c 2011-01-04 09:42:44.779005117 +0100 +++ xfs/fs/xfs/xfs_buf_item.c 2011-01-04 09:47:40.798004000 +0100 @@ -141,7 +141,6 @@ xfs_buf_item_log_check( #define xfs_buf_item_log_check(x) #endif -STATIC void xfs_buf_error_relse(xfs_buf_t *bp); STATIC void xfs_buf_do_callbacks(struct xfs_buf *bp); /* @@ -959,128 +958,76 @@ xfs_buf_do_callbacks( */ void xfs_buf_iodone_callbacks( - xfs_buf_t *bp) + struct xfs_buf *bp) { - xfs_log_item_t *lip; - static ulong lasttime; - static xfs_buftarg_t *lasttarg; - xfs_mount_t *mp; + struct xfs_log_item *lip = bp->b_fspriv; + struct xfs_mount *mp = lip->li_mountp; + static ulong lasttime; + static xfs_buftarg_t *lasttarg; - ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); - lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); + if (likely(!XFS_BUF_GETERROR(bp))) + goto do_callbacks; - if (XFS_BUF_GETERROR(bp) != 0) { - /* - * If we've already decided to shutdown the filesystem - * because of IO errors, there's no point in giving this - * a retry. - */ - mp = lip->li_mountp; - if (XFS_FORCED_SHUTDOWN(mp)) { - 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); - XFS_BUF_SET_FSPRIVATE(bp, NULL); - XFS_BUF_CLR_IODONE_FUNC(bp); - xfs_buf_ioend(bp, 0); - return; - } + /* + * If we've already decided to shutdown the filesystem because of + * I/O errors, there's no point in giving this a retry. + */ + if (XFS_FORCED_SHUTDOWN(mp)) { + XFS_BUF_SUPER_STALE(bp); + trace_xfs_buf_item_iodone(bp, _RET_IP_); + goto do_callbacks; + } - if ((XFS_BUF_TARGET(bp) != lasttarg) || - (time_after(jiffies, (lasttime + 5*HZ)))) { - lasttime = jiffies; - cmn_err(CE_ALERT, "Device %s, XFS metadata write error" - " block 0x%llx in %s", - XFS_BUFTARG_NAME(XFS_BUF_TARGET(bp)), - (__uint64_t)XFS_BUF_ADDR(bp), mp->m_fsname); - } - lasttarg = XFS_BUF_TARGET(bp); + if (XFS_BUF_TARGET(bp) != lasttarg || + time_after(jiffies, (lasttime + 5*HZ))) { + lasttime = jiffies; + cmn_err(CE_ALERT, "Device %s, XFS metadata write error" + " block 0x%llx in %s", + XFS_BUFTARG_NAME(XFS_BUF_TARGET(bp)), + (__uint64_t)XFS_BUF_ADDR(bp), mp->m_fsname); + } + lasttarg = XFS_BUF_TARGET(bp); - if (XFS_BUF_ISASYNC(bp)) { - /* - * If the write was asynchronous then noone will be - * looking for the error. Clear the error state - * and write the buffer out again delayed write. - * - * XXXsup This is OK, so long as we catch these - * before we start the umount; we don't want these - * DELWRI metadata bufs to be hanging around. - */ - XFS_BUF_ERROR(bp,0); /* errno of 0 unsets the flag */ + /* + * If the write was asynchronous then noone will be looking for the + * error. Clear the error state and write the buffer out again. + * + * During sync or umount we'll write all pending buffers again + * synchronous, which will catch these errors if they keep hanging + * around. + */ + if (XFS_BUF_ISASYNC(bp)) { + XFS_BUF_ERROR(bp, 0); /* errno of 0 unsets the flag */ - if (!(XFS_BUF_ISSTALE(bp))) { - XFS_BUF_DELAYWRITE(bp); - XFS_BUF_DONE(bp); - XFS_BUF_SET_START(bp); - } - ASSERT(XFS_BUF_IODONE_FUNC(bp)); - trace_xfs_buf_item_iodone_async(bp, _RET_IP_); - xfs_buf_relse(bp); - } else { - /* - * If the write of the buffer was not asynchronous, - * then we want to make sure to return the error - * to the caller of bwrite(). Because of this we - * cannot clear the B_ERROR state at this point. - * Instead we install a callback function that - * will be called when the buffer is released, and - * that routine will clear the error state and - * set the buffer to be written out again after - * some delay. - */ - /* 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); + if (!XFS_BUF_ISSTALE(bp)) { + XFS_BUF_DELAYWRITE(bp); XFS_BUF_DONE(bp); - XFS_BUF_FINISH_IOWAIT(bp); + XFS_BUF_SET_START(bp); } + ASSERT(XFS_BUF_IODONE_FUNC(bp)); + trace_xfs_buf_item_iodone_async(bp, _RET_IP_); + xfs_buf_relse(bp); return; } - xfs_buf_do_callbacks(bp); - XFS_BUF_SET_FSPRIVATE(bp, NULL); - XFS_BUF_CLR_IODONE_FUNC(bp); - xfs_buf_ioend(bp, 0); -} - -/* - * This is a callback routine attached to a buffer which gets an error - * when being written out synchronously. - */ -STATIC void -xfs_buf_error_relse( - xfs_buf_t *bp) -{ - xfs_log_item_t *lip; - xfs_mount_t *mp; - - lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); - mp = (xfs_mount_t *)lip->li_mountp; - ASSERT(XFS_BUF_TARGET(bp) == mp->m_ddev_targp); - + /* + * If the write of the buffer was synchronous, we want to make + * sure to return the error to the caller of xfs_bwrite(). + */ XFS_BUF_STALE(bp); XFS_BUF_DONE(bp); XFS_BUF_UNDELAYWRITE(bp); - XFS_BUF_ERROR(bp,0); trace_xfs_buf_error_relse(bp, _RET_IP_); + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); - if (! XFS_FORCED_SHUTDOWN(mp)) - xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); - /* - * We have to unpin the pinned buffers so do the - * callbacks. - */ +do_callbacks: xfs_buf_do_callbacks(bp); XFS_BUF_SET_FSPRIVATE(bp, NULL); XFS_BUF_CLR_IODONE_FUNC(bp); - XFS_BUF_SET_BRELSE_FUNC(bp,NULL); - xfs_buf_relse(bp); + xfs_buf_ioend(bp, 0); } - /* * This is the iodone() function for buffers which have been * logged. It is called when they are eventually flushed out. Index: xfs/fs/xfs/linux-2.6/xfs_buf.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.c 2011-01-04 09:42:44.770009657 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_buf.c 2011-01-04 09:46:41.233255990 +0100 @@ -896,7 +896,6 @@ xfs_buf_rele( trace_xfs_buf_rele(bp, _RET_IP_); 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)) @@ -908,11 +907,7 @@ xfs_buf_rele( 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) && + if (!(bp->b_flags & XBF_STALE) && atomic_read(&bp->b_lru_ref)) { xfs_buf_lru_add(bp); spin_unlock(&pag->pag_buf_lock); From BATV+dda0c5f29cde9a37fc23+2690+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 4 03:50:50 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p049onCj219210 for ; Tue, 4 Jan 2011 03:50:49 -0600 X-ASG-Debug-ID: 1294134777-58bb02c00000-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 86F221618B8B for ; Tue, 4 Jan 2011 01:52:57 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Yz3L4ThRFsL1fjwU for ; Tue, 04 Jan 2011 01:52:57 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pa3ZY-0007mv-Rc; Tue, 04 Jan 2011 09:52:56 +0000 Date: Tue, 4 Jan 2011 04:52:56 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] repair: warn if running in low memory mode Subject: Re: [PATCH] repair: warn if running in low memory mode Message-ID: <20110104095256.GA26885@infradead.org> References: <1294121563-17150-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294121563-17150-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: 1294134777 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, Jan 04, 2011 at 05:12:43PM +1100, Dave Chinner wrote: > From: Dave Chinner > > When checking large filesystems, xfs_repair makes an estimate of how > much RAM it will need to execute effectively. If the amount of RAM > is less than this, it reduces the bhash size and turns of > prefetching, which will substantially slow down the repair process. > Add a warning that indicates this is happening, along with a > recommendation of how much RAM repair calculates it needs to run > with prefetching enabled. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig > + do_warn(_("Not enough RAM available for repair " > + "to enable prefetching. This will be " > + "_slow_.\n" > + "You need at least %luMB RAM to run " > + "with prefetching enabled."), > + mem_used * 1280 / (1024 * 1024)); Maybe but the strings on a separate line to be easier readable and greppable, e.g.: do_warn( _("Not enough RAM available for repair to enable prefetching. " "This will be _slow_.\n" "You need at least %luMB RAM to run with prefetching enabled."), From BATV+dda0c5f29cde9a37fc23+2690+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 4 04:00:33 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p04A0Xcc220430 for ; Tue, 4 Jan 2011 04:00:33 -0600 X-ASG-Debug-ID: 1294135360-30df02370000-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 186E423167D for ; Tue, 4 Jan 2011 02:02:40 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Vh2uo7ibe3MuEL8e for ; Tue, 04 Jan 2011 02:02:40 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pa3iy-0000vW-5B; Tue, 04 Jan 2011 10:02:40 +0000 Date: Tue, 4 Jan 2011 05:02:40 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: multithread phase 2 Subject: Re: [PATCH] xfs_repair: multithread phase 2 Message-ID: <20110104100240.GB26885@infradead.org> References: <1294121588-17233-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294121588-17233-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: 1294135361 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 uses 32-way threading which results in no noticable > slowdown on single SATA drives with NCQ, but results in ~10x > reduction in runtime on a 12 disk RAID-0 array. Shouldn't we have at least an option to allow tuning this value, similar to the ag_stride? In fact I wonder why phase 3/4 should use different values for it than phase2. > @@ -75,8 +80,10 @@ scan_sbtree( > xfs_agblock_t bno, > xfs_agnumber_t agno, > int suspect, > - int isroot), > - int isroot) > + int isroot, > + struct aghdr_cnts *agcnts), > + int isroot, > + struct aghdr_cnts *agcnts) Please make this a void *priv to keep scan_sbtree generic. > void > +scanfunc_bno( > + struct xfs_btree_block *block, > + int level, > + xfs_agblock_t bno, > + xfs_agnumber_t agno, > + int suspect, > + int isroot, > + struct aghdr_cnts *agcnts) > +{ > + return scanfunc_allocbt(block, level, bno, agno, > + suspect, isroot, XFS_ABTB_MAGIC, agcnts); > +} Now that we have private data bassed to the scanfuncs we could use that to communicate if we're doing a bno or cnt scan. Maybe writing it directly into struct aghdr_cnts is too ugly, in that case we can have a scan_priv structure that contains the magic and the aghdr_cnts. > > void > scan_freelist( This could become static. > * Scan an AG for obvious corruption. > * > * Note: This code is not reentrant due to the use of global variables. That's not true any more I think. > */ > -void > -scan_ag( > - xfs_agnumber_t agno) > +void * > +scan_ag(void *args) Can be static. > +#define SCAN_THREADS 32 > + > +void > +scan_ags( > + struct xfs_mount *mp) > +{ > + struct aghdr_cnts agcnts[mp->m_sb.sb_agcount]; > + pthread_t thr[SCAN_THREADS]; > + __uint64_t fdblocks = 0; > + __uint64_t icount = 0; > + __uint64_t ifreecount = 0; > + int i, j, err; > + > + /* > + * scan a few AGs in parallel. The scan is IO latency bound, > + * so running a few at a time will speed it up significantly. > + */ > + for (i = 0; i < mp->m_sb.sb_agcount; i += SCAN_THREADS) { I think this should use the workqueues from repair/threads.c. Just create a workqueue with 32 threads, and then enqueue all the AGs. From SRS0+THj7+38+fromorbit.com=david@internode.on.net Tue Jan 4 05:58:47 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p04BwkP8238154 for ; Tue, 4 Jan 2011 05:58:47 -0600 X-ASG-Debug-ID: 1294142452-154601ab0000-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 C63641D057AE for ; Tue, 4 Jan 2011 04:00: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 tTAmTNrd027qfGyU for ; Tue, 04 Jan 2011 04:00:52 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52227454-1927428 for multiple; Tue, 04 Jan 2011 22:30:50 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pa5ZJ-00018x-2K; Tue, 04 Jan 2011 23:00:49 +1100 Date: Tue, 4 Jan 2011 23:00:49 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: multithread phase 2 Subject: Re: [PATCH] xfs_repair: multithread phase 2 Message-ID: <20110104120048.GL15179@dastard> References: <1294121588-17233-1-git-send-email-david@fromorbit.com> <20110104100240.GB26885@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110104100240.GB26885@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: 1294142453 X-Barracuda-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.51398 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, Jan 04, 2011 at 05:02:40AM -0500, Christoph Hellwig wrote: > > This patch uses 32-way threading which results in no noticable > > slowdown on single SATA drives with NCQ, but results in ~10x > > reduction in runtime on a 12 disk RAID-0 array. > > Shouldn't we have at least an option to allow tuning this value, > similar to the ag_stride? In fact I wonder why phase 3/4 should > use different values for it than phase2. Phase 3/4/5 use agressive prefetch to try to maximise throughput, while phase 2 has no prefetch and uses synchronous reads. Effectively the use of lots of parallelism simply keeps multiple IOs in flight rather than reading them one at a time, hence reducing the effective IO latency. > > > @@ -75,8 +80,10 @@ scan_sbtree( > > xfs_agblock_t bno, > > xfs_agnumber_t agno, > > int suspect, > > - int isroot), > > - int isroot) > > + int isroot, > > + struct aghdr_cnts *agcnts), > > + int isroot, > > + struct aghdr_cnts *agcnts) > > Please make this a > > void *priv > > to keep scan_sbtree generic. OK. > > * Scan an AG for obvious corruption. > > * > > * Note: This code is not reentrant due to the use of global variables. > > That's not true any more I think. Good point. > > +#define SCAN_THREADS 32 > > + > > +void > > +scan_ags( > > + struct xfs_mount *mp) > > +{ > > + struct aghdr_cnts agcnts[mp->m_sb.sb_agcount]; > > + pthread_t thr[SCAN_THREADS]; > > + __uint64_t fdblocks = 0; > > + __uint64_t icount = 0; > > + __uint64_t ifreecount = 0; > > + int i, j, err; > > + > > + /* > > + * scan a few AGs in parallel. The scan is IO latency bound, > > + * so running a few at a time will speed it up significantly. > > + */ > > + for (i = 0; i < mp->m_sb.sb_agcount; i += SCAN_THREADS) { > > I think this should use the workqueues from repair/threads.c. Just > create a workqueue with 32 threads, and then enqueue all the AGs. Ok. I just used an API I'm familiar with and didn't have to think about. Cheers, Dave. -- Dave Chinner david@fromorbit.com From lopresti@gmail.com Tue Jan 4 11:44:33 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-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 (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p04HiXgL021411 for ; Tue, 4 Jan 2011 11:44:33 -0600 X-ASG-Debug-ID: 1294163200-6c5f02810000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-gw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 039591D0B27A for ; Tue, 4 Jan 2011 09:46:40 -0800 (PST) Received: from mail-gw0-f53.google.com (mail-gw0-f53.google.com [74.125.83.53]) by cuda.sgi.com with ESMTP id dvLOiRcs6qJeRvf2 for ; Tue, 04 Jan 2011 09:46:40 -0800 (PST) Received: by gwb10 with SMTP id 10so4419169gwb.26 for ; Tue, 04 Jan 2011 09:46: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=cqPigC13URPLtxWqHnV44CQi+ItM04E5mTjd6QvwtwM=; b=ciVGZfkFPe+oJoTOTkEbkiF7iDeCsDf8ISikReA2OdUUDUl864QpxQWC4oAGSBEoGl pbo0UwxK5ARX4cAnV7u8wxD6sNWBJnosrX14lNjNNpoQnztuY39m1oCLr0fGlmSv765n ycKTt6/HbOY8AtYLQKKirMqez8kz5QwXATz1s= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=FmazOs13AAJxzkxpBaH3i3cWgsqaHQbmHaZyjIIyJ5PKO3uz1zK1vX7Lp3ilUZk8Lk FVhoQ8qKQbTI+FGY7NIfCPxHdM8qedGzwfTp3rBGJoeMBRvZ5FFII8Em8QVQrzd5uzGD ms39U1Igs9BqhSDS7sApKs/Bg+PfiOhFfet30= MIME-Version: 1.0 Received: by 10.100.107.9 with SMTP id f9mr6858353anc.249.1294163199984; Tue, 04 Jan 2011 09:46:39 -0800 (PST) Received: by 10.100.215.6 with HTTP; Tue, 4 Jan 2011 09:46:39 -0800 (PST) Date: Tue, 4 Jan 2011 09:46:39 -0800 Message-ID: X-ASG-Orig-Subj: Simultaneously mounting one XFS partition on multiple machines Subject: Simultaneously mounting one XFS partition on multiple machines From: "Patrick J. LoPresti" To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-gw0-f53.google.com[74.125.83.53] X-Barracuda-Start-Time: 1294163201 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: -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, SUBJECT_FUZZY_TION X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.51420 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hey, what's the worst that could happen? I recently learned that some of my colleagues have configured two Linux systems to simultaneously mount a single XFS partition residing on shared storage. Specifically, "system R" has the partition mounted read-only while "system W" has it mounted read/write. I told them that this sounds like a very bad idea because XFS is not a clustered file system. But they are skeptical because "it seems to be working fine". I need to know what the actual risks are and whether they can be mitigated. This partition holds large amounts of essentially archival data; that is, it is read frequently but written rarely. When they do want to write to it, they do so via system W and then reboot system R. I am no expert on XFS, but there are essentially two risks that I can see: Risk 1: When making changes via system W, the view of the file system from system R can become corrupted or inconsistent. My colleagues are aware of this and believe they can live with it, as long as the underlying file system is not being damaged ("we can just reboot"). Risk 2: Any time the file system is mounted, even read-only, it will replay the journal if it is non-empty. (At least, I believe this is true. Could one of you please confirm or deny?) So if machine R should reboot while the journal is non-empty, it will replay it, causing fairly unpredictable on-disk corruption. Here are my questions. 1) When can a read-only XFS mount write to the disk, exactly? 2) If I do a "sync" on machine W (and perform no further writes), will that truncate the journal? 3) What am I missing? If your answer is "Please do not do this; get a clustered filesystem", then trust me, you are preaching to the choir. But these systems are already in use and unlikely to be replaced soon, so at this point my job is to find out what the exact risks are. Any information will be appreciated. Thanks! - Pat From support@mail.mpcds.com Tue Jan 4 12:45:06 2011 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 p04Ij5fW027922 for ; Tue, 4 Jan 2011 12:45:06 -0600 X-ASG-Debug-ID: 1294166831-381601cb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.mpcds.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 123DE1D0A080 for ; Tue, 4 Jan 2011 10:47:12 -0800 (PST) Received: from mail.mpcds.com (mail.mpcds.com [208.60.51.100]) by cuda.sgi.com with ESMTP id iwOHICp21sTpV8pV for ; Tue, 04 Jan 2011 10:47:12 -0800 (PST) To: , , , , X-ASG-Orig-Subj: [ 3uvjzg0h5vk9w6pf] : i have a list of 150k criminal attorneys in the usa Subject: [ 3uvjzg0h5vk9w6pf] : i have a list of 150k criminal attorneys in the usa Reply-To: From: Amado Corcoran MIME-Version: 1.0 Content-Type: text/plain Message-ID: <832967a6-f593-41a4-9f0c-69efff129a56@mail.MPCDS.COM> Date: Tue, 4 Jan 2011 12:47:11 -0600 Received-SPF: None (mail.MPCDS.COM: support@mail.mpcds.com does not designate permitted sender hosts) X-Barracuda-Connect: mail.mpcds.com[208.60.51.100] X-Barracuda-Start-Time: 1294166833 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4545 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.51424 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 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 As requested, below is pricing for all our lists only until this Friday: note: all lists are optin and were updated within the last 6 months HEALTH RELATED LISTS Any Individual list below $115 ea OR 2 for $199 -> Complete US Physicians Database -> Chiropractic Doctors in the USA -> American Holistic Medicine Providers/Clinics -> General Dentists in the USA -> Dentists with Specialties -> American Veterinarians & Veterinary Clinics -> US Hospitals -> Nursing Homes int the US -> Pharmaceutical Company Employees -> Physical/Occupational Therapy Clinics and Therapists in the US -> Oncology Physicians in the US -> US Surgery Centers -> Massage Therapists/Therapy Clinics in America -> Acupuncturists/clinics in the US -> Medical Equipment Suppliers(USA) -> Mental Health Counselors (USA) -> Optometrists/Clinics (USA) -> Psychologists (USA) BUSINESS RELATED LISTS Take any individual list below for just $135 each -> Hotels in the USA -> Realtors in the USA -> USA Business Database -> Manufacturer Database (USA) -> Financial Planner Database (USA) -> Finance & Professionals Database (USA) -> Insurance Agents (USA) -> Canadian Businesses -> United Kingdom Business Database -> Media Outlet Contacts (USA) CONSUMER RELATED LISTS $89 each -> USA Consumer Database -> Credit Inquiries Database (USA) -> American Homeowners [ PROFESSIONALS LISTS ] $125 each -> USA Lawyers Database -> Criminal Attorneys in the US Reply to this address for numbers and samples: superlist@gmx.com to terminate please send a blank message to losemyemail@gmx.us From aelder@sgi.com Tue Jan 4 13:46:39 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p04JkdWe033643 for ; Tue, 4 Jan 2011 13:46:39 -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 BB905304071; Tue, 4 Jan 2011 11:48: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); Tue, 4 Jan 2011 13:48:44 -0600 Subject: Re: My current xfs-for-2.6.38 tree.... From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com In-Reply-To: <20110104064612.GK15179@dastard> References: <20110104050259.GH15179@dastard> <20110104055441.GA9870@infradead.org> <20110104064612.GK15179@dastard> Content-Type: text/plain; charset="UTF-8" Date: Tue, 04 Jan 2011 13:48:44 -0600 Message-ID: <1294170524.2485.6.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 04 Jan 2011 19:48:44.0430 (UTC) FILETIME=[651E52E0:01CBAC48] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-04 at 17:46 +1100, Dave Chinner wrote: > On Tue, Jan 04, 2011 at 12:54:41AM -0500, Christoph Hellwig wrote: > > On Tue, Jan 04, 2011 at 04:02:59PM +1100, Dave Chinner wrote: > > > Folks, > > > > > > FYI, my current xfs-for-2.6.38 tree has just been updated. Changes > > > since last update: > > > > > > - dropped the per-cpu superblock counter cleanup patches > > > from it so we can get it right before merging. > > > - added unaligned aio/dio write fix series (needs review) > > > - added log covering idle fix (needs review) > > > - added superblock write error hang fix (needs review) > > > > > > The tree can be found here (when the rsync updates git.kernel.org): > > > > I'll try to get to review the new patches, but can we please get the > > metadata scalability patches into the xfs tree and thus linux-next ASAP? > > The merge window is about to open, and we really need to get that stuff > > in now. > > That's all first in the branch and reviewed, so Alex should be able > to simply merge up to the last commit in that part of the series from > the branch I posted. > > Alex, if you want I can set up a separate branch for the metadata > scalability series.... No that's OK, I'll take in everything that's reviewed and ready to go and leave the rest for later. I've been waiting for a pull request but this is fine with me. -Alex From eflorac@intellique.com Tue Jan 4 15:50:36 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p04LoaTW046291 for ; Tue, 4 Jan 2011 15:50:36 -0600 X-ASG-Debug-ID: 1294177958-4492019c0000-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 0C1FF1D0C6D8 for ; Tue, 4 Jan 2011 13:52:42 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id 6TwX8drZo8zJsBg1 for ; Tue, 04 Jan 2011 13:52:42 -0800 (PST) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 83C02A60FD; Tue, 4 Jan 2011 22:52:34 +0100 (CET) Date: Tue, 4 Jan 2011 22:52:29 +0100 From: Emmanuel Florac To: "Patrick J. LoPresti" Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Simultaneously mounting one XFS partition on multiple machines Subject: Re: Simultaneously mounting one XFS partition on multiple machines Message-ID: <20110104225229.6aa47710@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: 1294177964 X-Barracuda-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.51438 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 Le Tue, 4 Jan 2011 09:46:39 -0800 vous =E9criviez: > If your answer is "Please do not do this; get a clustered filesystem", > then trust me, you are preaching to the choir.=20 Just as a side note : OCFS2 works well, is present in all major distros, is extremely fast to setup and install, and is only slightly slower than xfs. There is absolutely no valid reason not to use it (GFS OTOH is a complete PITA to setup). Yeah I know, I know... --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From SRS0+THj7+38+fromorbit.com=david@internode.on.net Tue Jan 4 15:51:04 2011 X-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_210 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 p04Lp42I046356 for ; Tue, 4 Jan 2011 15:51:04 -0600 X-ASG-Debug-ID: 1294177989-44dc019b0000-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 B84F61D0C6E5 for ; Tue, 4 Jan 2011 13:53:10 -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 DiTsuVoltC2D86Tn for ; Tue, 04 Jan 2011 13:53:10 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 40382064-1927428 for multiple; Wed, 05 Jan 2011 08:23:09 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PaEoV-00024D-05; Wed, 05 Jan 2011 08:53:07 +1100 Date: Wed, 5 Jan 2011 08:53:06 +1100 From: Dave Chinner To: "Patrick J. LoPresti" Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Simultaneously mounting one XFS partition on multiple machines Subject: Re: Simultaneously mounting one XFS partition on multiple machines Message-ID: <20110104215306.GM15179@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: 1294177991 X-Barracuda-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.51438 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 Tue, Jan 04, 2011 at 09:46:39AM -0800, Patrick J. LoPresti wrote: > Hey, what's the worst that could happen? That's just asking for trouble. ;) > I recently learned that some of my colleagues have configured two > Linux systems to simultaneously mount a single XFS partition residing > on shared storage. Specifically, "system R" has the partition mounted > read-only while "system W" has it mounted read/write. > > I told them that this sounds like a very bad idea because XFS is not a > clustered file system. But they are skeptical because "it seems to be > working fine". I need to know what the actual risks are and whether > they can be mitigated. Ok, so it will appear to work fine most of the time... > This partition holds large amounts of essentially archival data; that > is, it is read frequently but written rarely. When they do want to > write to it, they do so via system W and then reboot system R. You could probably just run "echo 3 > /proc/sys/vm/drop_caches" or just umount/mount the device again to get the same effect as rebooting. > I am no expert on XFS, but there are essentially two risks that I can see: > > Risk 1: When making changes via system W, the view of the file system > from system R can become corrupted or inconsistent. My colleagues are > aware of this and believe they can live with it, as long as the > underlying file system is not being damaged ("we can just reboot"). Yup, so long as system R does not cache anything, or the caches are dropped after system W writes, you should be fine. However, there is a window between system W starting to write and system R being rebooted that system R could read inconsistent metadata and/or data. There's not much you can do about that apart from take system R offline while system W is writing. > Risk 2: Any time the file system is mounted, even read-only, it will > replay the journal if it is non-empty. (At least, I believe this is > true. Could one of you please confirm or deny?) So if machine R > should reboot while the journal is non-empty, it will replay it, > causing fairly unpredictable on-disk corruption. Yup. > Here are my questions. > > 1) When can a read-only XFS mount write to the disk, exactly? Log recovery only. Use mount -o ro,norecovery to avoid that. > 2) If I do a "sync" on machine W (and perform no further writes), will > that truncate the journal? FYI, the journal cannot be truncated - it is a fixed size circular log. To get the log clean, I'd freeze the filesystem on system W while system R mounts. e.g: system W system R unmount write data freeze fs mount -o ro,norecovery unfreeze fs > 3) What am I missing? 1. NFS/CIFS. No need for shared access to the block device. NFs works pretty well for read only access, especially if you put a dedicated 10GbE link between the two machines... 2. Snapshots. If you must share the block device, snapshot the active filesystem and mount that readonly on system R - the snapshot will be unchanging. When system W knows a snapshot is unmounted and finished with, it can delete it. That is: system W system R write data .... write data snapshot umount mount -o ro,norecovery delete snapshot .... write data ..... write data snapshot umount mount -o ro,norecovery delete snapshot .... Cheers, Dave. -- Dave Chinner david@fromorbit.com From aelder@sgi.com Tue Jan 4 15:53:11 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p04LrB93046531 for ; Tue, 4 Jan 2011 15:53: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 65A65AC007; Tue, 4 Jan 2011 13:55:16 -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, 4 Jan 2011 15:55:16 -0600 Subject: Re: [PATCH] xfs: add FITRIM support From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20110102072202.GA26488@infradead.org> References: <20110102072202.GA26488@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Tue, 04 Jan 2011 15:55:15 -0600 Message-ID: <1294178115.2485.19.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 04 Jan 2011 21:55:16.0088 (UTC) FILETIME=[12196780:01CBAC5A] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, 2011-01-02 at 02:22 -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 This looks good, but I mention three things below. Correct them as you see fit, either way: Reviewed-by: Alex Elder > --- > > V1 -> V2 > > - added __user annotations as noted by Alex > - removed non-blocking agf read as noted by Alex > - update range->len as noted by Alex > > This does not implement the by-bno search or lock break suggestions from > Dave. Given that the 2.6.38 window is about to close those seem a bit > risky to me. I'll look into these later. . . . > xfs_fs_subr.o \ > Index: xfs/fs/xfs/linux-2.6/xfs_discard.c > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ xfs/fs/xfs/linux-2.6/xfs_discard.c 2011-01-02 08:06:15.828014477 +0100 > @@ -0,0 +1,191 @@ > +/* > + * Copyright (C) 2010 Red Hat, Inc. Maybe 2011 now... > + * All Rights Reserved. > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it would be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write the Free Software Foundation, > + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > + */ > +#include "xfs.h" > +#include "xfs_sb.h" . . . > + > +STATIC int > +xfs_trim_extents( > + struct xfs_mount *mp, . . . > + > + /* > + * 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) { ^ I think this should be >= > + trace_xfs_discard_exclude(mp, agno, fbno, flen); > + goto next_extent; > + } . . . > Index: xfs/fs/xfs/linux-2.6/xfs_discard.h > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ xfs/fs/xfs/linux-2.6/xfs_discard.h 2011-01-02 07:11:43.693026629 +0100 Do you want to add a boilerplate copyright header here? > @@ -0,0 +1,8 @@ > +#ifndef XFS_DISCARD_H > +#define XFS_DISCARD_H 1 > + > +struct fstrim_range; > + > +extern int xfs_ioc_trim(struct xfs_mount *, struct fstrim_range __user *); > + > +#endif /* XFS_DISCARD_H */ . . . From aelder@sgi.com Tue Jan 4 19:51:48 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p051pmYp074246 for ; Tue, 4 Jan 2011 19:51:48 -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 66DCFAC004; Tue, 4 Jan 2011 17:53:52 -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, 4 Jan 2011 19:53:52 -0600 Subject: Re: [PATCH 0/8] xfs: prevent corruption due to overlapping AIO DIO V2 From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294116518-14908-1-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 04 Jan 2011 19:53:52 -0600 Message-ID: <1294192432.2485.717.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Jan 2011 01:53:52.0576 (UTC) FILETIME=[67641C00:01CBAC7B] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-04 at 15:48 +1100, Dave Chinner wrote: > This series aims to serialise unaligned direct IOs to an inode to > avoid corruption caused by 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. > > Version 2: > - fix initial sync write error return fixup > - add new patch to abstract locking from read/write path and remove > the need for the need_i_mutex variable. > I've reviewed this series, and the net result (the code cleanup leading to the real fix in particular) is great. There are some small things among the patches that ought to be fixed in order to allow them to stand alone without bugs (to facilitate git bisects, for example). I've noted them in my reviews. I also think that, having looked over them entirely, a few of my earlier comments get addressed or made non-applicable because of your changes. I'm not going to go fix them now; if you see things like that you can explain if you feel it's useful or just mention that the series renders my comment inoperative or something. -Alex From aelder@sgi.com Tue Jan 4 19:51:53 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p051prJk074278 for ; Tue, 4 Jan 2011 19:51:53 -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 48BCF8F8065; Tue, 4 Jan 2011 17:53: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); Tue, 4 Jan 2011 19:53:59 -0600 Subject: Re: [PATCH 1/8] 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: <1294116518-14908-2-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 04 Jan 2011 19:53:58 -0600 Message-ID: <1294192438.2485.718.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Jan 2011 01:53:59.0107 (UTC) FILETIME=[6B48A930:01CBAC7B] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-04 at 15:48 +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 > 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. > This looks good. You improved it a lot by fixing up the bizarre "error" logic. Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_file.c | 51 +++++++++++++++++++++---------------------- > 1 files changed, 25 insertions(+), 26 deletions(-) From aelder@sgi.com Tue Jan 4 19:52:07 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p051q6ts074320 for ; Tue, 4 Jan 2011 19:52: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 22C35AC004; Tue, 4 Jan 2011 17:54: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); Tue, 4 Jan 2011 19:54:14 -0600 Subject: Re: [PATCH 2/8] xfs: factor common post-write isize handling code From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294116518-14908-3-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-3-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 04 Jan 2011 19:54:14 -0600 Message-ID: <1294192454.2485.719.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Jan 2011 01:54:14.0794 (UTC) FILETIME=[74A24EA0:01CBAC7B] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-04 at 15:48 +1100, Dave Chinner wrote: > From: Dave Chinner > With one exception noted below, this looks good. Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_file.c | 52 +++++++++++++++++++++++------------------- > 1 files changed, 28 insertions(+), 24 deletions(-) . . . > @@ -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); > > if (ret <= 0) > goto out_unlock_internal; Just below this point in the original code there is a call to XFS_STATS_ADD(xs_write_bytes, ret); that also needs to be removed, because xfs_aio_write_isize_update() now does it for you. From aelder@sgi.com Tue Jan 4 19:52:19 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p051qI84074363 for ; Tue, 4 Jan 2011 19:52: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 8109230406A; Tue, 4 Jan 2011 17:54: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); Tue, 4 Jan 2011 19:54:24 -0600 Subject: Re: [PATCH 3/8] xfs: factor post-write newsize updates From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294116518-14908-4-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-4-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 04 Jan 2011 19:54:23 -0600 Message-ID: <1294192463.2485.720.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Jan 2011 01:54:24.0388 (UTC) FILETIME=[7A5A3C40:01CBAC7B] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-04 at 15:48 +1100, Dave Chinner wrote: > From: Dave Chinner > Looks good. Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_file.c | 43 +++++++++++++++++++++---------------------- > 1 files changed, 21 insertions(+), 22 deletions(-) From aelder@sgi.com Tue Jan 4 19:52:33 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p051qXh0074397 for ; Tue, 4 Jan 2011 19:52:33 -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 4CE9530406A; Tue, 4 Jan 2011 17:54: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); Tue, 4 Jan 2011 19:54:42 -0600 Subject: Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294116518-14908-5-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-5-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 04 Jan 2011 19:54:41 -0600 Message-ID: <1294192481.2485.721.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Jan 2011 01:54:42.0201 (UTC) FILETIME=[84F84890:01CBAC7B] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-04 at 15:48 +1100, Dave Chinner wrote: > From: Dave Chinner > > We need to obtain the i_mutex, i_iolock and i_ilock during the read > and write paths. Add a set of wrapper functions to neatly > encapsulate the lock ordering and shared/exclusive semantics to make > the locking easier to follow and get right. > > Signed-off-by: Dave Chinner I like this change, but I think you missed a lock call. I also notice there are some locking differences, and I don't really question them but I wonder if you can offer a little more explanation. > --- > fs/xfs/linux-2.6/xfs_file.c | 123 ++++++++++++++++++++++++------------------- > 1 files changed, 68 insertions(+), 55 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c > index 33a688c..0d6111e 100644 > --- a/fs/xfs/linux-2.6/xfs_file.c > +++ b/fs/xfs/linux-2.6/xfs_file.c . . . > @@ -262,22 +296,21 @@ xfs_file_aio_read( > if (XFS_FORCED_SHUTDOWN(mp)) > return -EIO; > > - if (unlikely(ioflags & IO_ISDIRECT)) > - mutex_lock(&inode->i_mutex); > - xfs_ilock(ip, XFS_IOLOCK_SHARED); > - > if (unlikely(ioflags & IO_ISDIRECT)) { > + xfs_rw_ilock(ip, XFS_IOLOCK_EXCL); > + Previously only XFS_IOLOCK_SHARED was used here. I understand that using the IOLOCK_EXCL now gets the desired mutex_lock() call. Is the previous code in error here though? Can you anticipate any different behavior because of this lock change? Does this specific change justify separating it into a small patch just before this one? > if (inode->i_mapping->nrpages) { > ret = -xfs_flushinval_pages(ip, > (iocb->ki_pos & PAGE_CACHE_MASK), > -1, FI_REMAPF_LOCKED); > + if (ret) { > + xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); > + return ret; > + } > } > - mutex_unlock(&inode->i_mutex); > - if (ret) { > - xfs_iunlock(ip, XFS_IOLOCK_SHARED); > - return ret; > - } > - } > + xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); > + } else > + xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); > > trace_xfs_file_read(ip, size, iocb->ki_pos, ioflags); > . . . > @@ -386,14 +419,13 @@ xfs_file_splice_write( > if (XFS_FORCED_SHUTDOWN(ip->i_mount)) > return -EIO; > > - xfs_ilock(ip, XFS_IOLOCK_EXCL); > + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL); Similar sentiments here. We will now be acquiring i_mutex here where previously we did not. Is that OK? > new_size = *ppos + count; > > - xfs_ilock(ip, XFS_ILOCK_EXCL); > if (new_size > ip->i_size) > ip->i_new_size = new_size; > - xfs_iunlock(ip, XFS_ILOCK_EXCL); > + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); > > trace_xfs_file_splice_write(ip, count, *ppos, ioflags); > . . . > @@ -631,21 +662,16 @@ xfs_file_aio_write( > 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); > } > > - xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); > - Maybe I'm missing something, but I think you want to insert this here: xfs_rw_ilock(ip, XFS_ILOCK_EXCL|iolock); ...because (for starters) if generic_write_checks() returns an error below you're going to be calling the unlock routine. > start: > ret = generic_write_checks(file, &pos, &count, > S_ISBLK(inode->i_mode)); > if (ret) { > - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); > - goto out_unlock_mutex; > + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); > + return ret; > } > > if (ioflags & IO_ISDIRECT) { > @@ -654,16 +680,14 @@ start: > mp->m_rtdev_targp : mp->m_ddev_targp; > > if ((pos & target->bt_smask) || (count & target->bt_smask)) { > - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); > + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); > return XFS_ERROR(-EINVAL); > } > One can get a little lost in this code. I don't know if this comment is exactly right, but something like it might be helpful (while you're in here). /* * For direct I/O, if there are cached pages or * we're extending the file, we need IOLOCK_EXCL * until we're sure the bytes at the new EOF have * been zeroed and/or the cached pages are flushed * out. Upgrade the I/O lock and start again. */ > - if (!need_i_mutex && (mapping->nrpages || pos > ip->i_size)) { > - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); > + if (iolock != XFS_IOLOCK_EXCL && > + (mapping->nrpages || pos > ip->i_size)) { > + xfs_rw_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; > } > } . . . From aelder@sgi.com Tue Jan 4 19:52:48 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p051qm6X074438 for ; Tue, 4 Jan 2011 19:52:48 -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 AB994AC004; Tue, 4 Jan 2011 17:54:56 -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, 4 Jan 2011 19:54:56 -0600 Subject: Re: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294116518-14908-6-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-6-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 04 Jan 2011 19:54:55 -0600 Message-ID: <1294192495.2485.726.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Jan 2011 01:54:56.0357 (UTC) FILETIME=[8D685150:01CBAC7B] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-04 at 15:48 +1100, Dave Chinner wrote: > 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. All good, very good. But I'm not sure why you cut out the code that backed off to buffered I/O if generic_file_direct_write() returns an error. (You gave no explanation.) -Alex > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_file.c | 168 ++++++++++++++++++++++++++++--------------- > 1 files changed, 110 insertions(+), 58 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c > index 0d6111e..d546953 100644 > --- a/fs/xfs/linux-2.6/xfs_file.c > +++ b/fs/xfs/linux-2.6/xfs_file.c > @@ -619,6 +619,110 @@ 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 separating > + * 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 @iolock and errors indicated by > + * negative return values. > + */ > +STATIC ssize_t > +xfs_file_dio_aio_write( > + struct kiocb *iocb, > + const struct iovec *iovp, . . . > + trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0); > + ret = generic_file_direct_write(iocb, iovp, > + &nr_segs, pos, &iocb->ki_pos, count, ocount); > + > + /* No fallback to buffered IO on errors for XFS. */ Why is this? The previous code did fall back (so this change is doing more than just splitting out the direct I/O path). > + return ret; > +} > + > STATIC ssize_t > xfs_file_aio_write( > struct kiocb *iocb, . . . > @@ -788,6 +839,7 @@ write_retry: > > current->backing_dev_info = NULL; > > +done_io: > xfs_aio_write_isize_update(inode, &iocb->ki_pos, ret); > > if (ret <= 0) From aelder@sgi.com Tue Jan 4 19:52:54 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p051qswJ074459 for ; Tue, 4 Jan 2011 19:52:54 -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 57A84AC004; Tue, 4 Jan 2011 17:55: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); Tue, 4 Jan 2011 19:55:01 -0600 Subject: Re: [PATCH 6/8] xfs: split buffered IO write path from xfs_file_aio_write From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294116518-14908-7-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-7-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 04 Jan 2011 19:55:01 -0600 Message-ID: <1294192501.2485.727.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Jan 2011 01:55:02.0013 (UTC) FILETIME=[90C75AD0:01CBAC7B] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-04 at 15:48 +1100, Dave Chinner wrote: > 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. Looks good. Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_file.c | 146 ++++++++++++++++++++----------------------- > 1 files changed, 69 insertions(+), 77 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c > index d546953..7e7805c 100644 > --- a/fs/xfs/linux-2.6/xfs_file.c > +++ b/fs/xfs/linux-2.6/xfs_file.c From aelder@sgi.com Tue Jan 4 19:53:00 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p051qxck074489 for ; Tue, 4 Jan 2011 19:53:00 -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 30F78AC004; Tue, 4 Jan 2011 17:55:08 -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, 4 Jan 2011 19:55:07 -0600 Subject: Re: [PATCH 7/8] xfs: factor common write setup code From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294116518-14908-8-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-8-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 04 Jan 2011 19:55:07 -0600 Message-ID: <1294192507.2485.728.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Jan 2011 01:55:07.0810 (UTC) FILETIME=[943BE820:01CBAC7B] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-04 at 15:48 +1100, Dave Chinner wrote: > 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. Looks good. Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_file.c | 129 ++++++++++++++++++++----------------------- > 1 files changed, 59 insertions(+), 70 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c > index 7e7805c..f21b6ad 100644 > --- a/fs/xfs/linux-2.6/xfs_file.c From aelder@sgi.com Tue Jan 4 19:53:08 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p051r7Hq074519 for ; Tue, 4 Jan 2011 19:53: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 41349AC004; Tue, 4 Jan 2011 17:55:16 -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, 4 Jan 2011 19:55:15 -0600 Subject: Re: [PATCH 8/8] xfs: serialise unaligned direct IOs From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294116518-14908-9-git-send-email-david@fromorbit.com> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-9-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 04 Jan 2011 19:55:15 -0600 Message-ID: <1294192515.2485.729.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Jan 2011 01:55:15.0920 (UTC) FILETIME=[99116500:01CBAC7B] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-04 at 15:48 +1100, Dave Chinner wrote: > 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. Wow, after the rest of this series it gets easy! Looks good. Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_file.c | 28 ++++++++++++++++++++++++---- > 1 files changed, 24 insertions(+), 4 deletions(-) From aelder@sgi.com Tue Jan 4 19:59:41 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p051xftt075310 for ; Tue, 4 Jan 2011 19:59:41 -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 BBF3B8F807A; Tue, 4 Jan 2011 18:01:46 -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, 4 Jan 2011 20:01:46 -0600 Subject: Re: [PATCH] xfs: ensure log covering transactions are synchronous From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294116569-15052-1-git-send-email-david@fromorbit.com> References: <1294116569-15052-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 04 Jan 2011 20:01:46 -0600 Message-ID: <1294192906.2485.730.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Jan 2011 02:01:46.0657 (UTC) FILETIME=[81F72110:01CBAC7C] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-04 at 15:49 +1100, Dave Chinner wrote: > From: Dave Chinner > > To ensure the log is covered and the filesystem idles correctly, we > need to ensure that dummy transactions hit the disk and do not stay > pinned in memory. If the superblock is pinned in memory, it can't > be flushed so the log covering cannot make progress. The result is > dependent on timing - more oftent han not we continue to issues a > log covering transaction every 36s rather than idling after ~90s. > > Fix this by making the log covering transaction synchronous. To > avoid additional log force from xfssyncd, make the log covering > transaction take the place of the existing log force in the xfssyncd > background sync process. > Looks good. Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > --- From aelder@oss.sgi.com Tue Jan 4 20:36:09 2011 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 p052a9mA080164 for ; Tue, 4 Jan 2011 20:36:09 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id p052a8JN079991; Tue, 4 Jan 2011 20:36:08 -0600 Date: Tue, 4 Jan 2011 20:36:08 -0600 Message-Id: <201101050236.p052a8JN079991@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-53-gd0eb2f3 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 489a150f6454e2cd93d9e0ee6d7c5a361844f62a X-Git-Newrev: d0eb2f38b250b7d6c993adf81b0e4ded0565497e 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 d0eb2f3 xfs: convert grant head manipulations to lockless algorithm 3f16b98 xfs: introduce new locks for the log grant ticket wait queues c8a09ff xfs: convert log grant heads to atomic variables 1c3cb9e xfs: convert l_tail_lsn to an atomic variable. 84f3c68 xfs: convert l_last_sync_lsn to an atomic variable 2ced19c xfs: make AIL tail pushing independent of the grant lock eb40a87 xfs: use wait queues directly for the log wait queues a69ed03 xfs: combine grant heads into a single 64 bit integer 663e496 xfs: rework log grant space calculations 3f336c6 xfs: fact out common grant head/log tail verification code 1054794 xfs: convert log grant ticket queues to list heads 9552e7f xfs: use AIL bulk delete function to implement single delete e605994 xfs: use AIL bulk update function to implement single updates 3013683 xfs: remove all the inodes on a buffer from the AIL in bulk c90821a xfs: consume iodone callback items on buffers as they are processed e677d0f xfs: reduce the number of AIL push wakeups 0e57f6a xfs: bulk AIL insertion during transaction commit eb3efa1 xfs: clean up xfs_ail_delete() b199c8a xfs: Pull EFI/EFD handling out from under the AIL lock 9c5f841 xfs: fix EFI transaction cancellation. 821eb21 xfs: connect up buffer reclaim priority hooks 430cbeb xfs: add a lru to the XFS buffer cache ff57ab2 xfs: convert xfsbud shrinker to a per-buftarg shrinker. 1a427ab xfs: convert pag_ici_lock to a spin lock 1a3e8f3 xfs: convert inode cache lookups to use RCU locking d95b7aa xfs: rcu free inodes 6e85756 xfs: don't truncate prealloc from frequently accessed inodes 055388a xfs: dynamic speculative EOF preallocation 622d814 xfs: use KM_NOFS for allocations during attribute list operations dcfcf20 xfs: provide a inode iolock lockdep class from 489a150f6454e2cd93d9e0ee6d7c5a361844f62a (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 d0eb2f38b250b7d6c993adf81b0e4ded0565497e Author: Dave Chinner Date: Tue Dec 21 12:29:14 2010 +1100 xfs: convert grant head manipulations to lockless algorithm 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 commit 3f16b9850743b702380f098ab5e0308cd6af1792 Author: Dave Chinner Date: Tue Dec 21 12:29:01 2010 +1100 xfs: introduce new locks for the log grant ticket wait queues 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 commit c8a09ff8ca2235bccdaea8a52fbd5349646a8ba4 Author: Dave Chinner Date: Sat Dec 4 00:02:40 2010 +1100 xfs: convert log grant heads to atomic variables 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 commit 1c3cb9ec07fabf0c0970adc46fd2a1f09c1186dd Author: Dave Chinner Date: Tue Dec 21 12:28:39 2010 +1100 xfs: convert l_tail_lsn to an atomic variable. 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 commit 84f3c683c4d3f36d3c3ed320babd960a332ac458 Author: Dave Chinner Date: Fri Dec 3 22:11:29 2010 +1100 xfs: convert l_last_sync_lsn to an atomic variable 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 commit 2ced19cbae5448b720919a494606c62095d4f4db Author: Dave Chinner Date: Tue Dec 21 12:09:20 2010 +1100 xfs: make AIL tail pushing independent of the grant lock 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 commit eb40a87500ac2f6be7eaf8ebb35610e6d0e60e9a Author: Dave Chinner Date: Tue Dec 21 12:09:01 2010 +1100 xfs: use wait queues directly for the log wait queues 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 commit a69ed03c24d4a336c23b7116127713d5a8c5ac4d Author: Dave Chinner Date: Tue Dec 21 12:08:20 2010 +1100 xfs: combine grant heads into a single 64 bit integer 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 commit 663e496a720a3a9fc08ea70b29724e8906b34e43 Author: Dave Chinner Date: Tue Dec 21 12:06:05 2010 +1100 xfs: rework log grant space calculations 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 commit 3f336c6fa17c2b3d14b3dd1bd6e64e9cc97b6359 Author: Dave Chinner Date: Tue Dec 21 12:02:52 2010 +1100 xfs: fact out common grant head/log tail verification code 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 commit 1054794198e39103cb986618c4c10ec2252b7089 Author: Dave Chinner Date: Tue Dec 21 12:02:25 2010 +1100 xfs: convert log grant ticket queues to list heads 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 commit 9552e7f2f3dd13a7580e488a7a3582332daad4f5 Author: Dave Chinner Date: Mon Dec 20 12:36:15 2010 +1100 xfs: use AIL bulk delete function to implement single delete 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 commit e60599492990d1b52c70e9ed2f8e062fe11ca937 Author: Dave Chinner Date: Mon Dec 20 12:34:26 2010 +1100 xfs: use AIL bulk update function to implement single updates 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 commit 3013683253ad04f67d8cfaa25be708353686b90a Author: Dave Chinner Date: Mon Dec 20 12:03:17 2010 +1100 xfs: remove all the inodes on a buffer from the AIL in bulk 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 commit c90821a26a8c90ad1e3116393b8a8260ab46bffb Author: Dave Chinner Date: Fri Dec 3 17:00:52 2010 +1100 xfs: consume iodone callback items on buffers as they are processed 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 commit e677d0f9548e2245ee3c2977661ca8ca165af188 Author: Dave Chinner Date: Fri Dec 17 20:08:04 2010 +1100 xfs: reduce the number of AIL push wakeups 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 commit 0e57f6a36f9be03e5abb755f524ee91c4aebe854 Author: Dave Chinner Date: Mon Dec 20 12:02:19 2010 +1100 xfs: bulk AIL insertion during transaction commit 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 commit eb3efa1249b6413be930bdf13d10b6238028a440 Author: Dave Chinner Date: Fri Dec 3 16:42:57 2010 +1100 xfs: clean up xfs_ail_delete() 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 commit b199c8a4ba11879df87daad496ceee41fdc6aa82 Author: Dave Chinner Date: Mon Dec 20 11:59:49 2010 +1100 xfs: Pull EFI/EFD handling out from under the AIL lock 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 commit 9c5f8414efd5eeed9f498d4170337a3eb126341f Author: Dave Chinner Date: Mon Dec 20 11:57:24 2010 +1100 xfs: fix EFI transaction cancellation. 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 commit 821eb21d97a8b686649c08b7284d0b9f34d0e138 Author: Dave Chinner Date: Thu Dec 2 16:31:13 2010 +1100 xfs: connect up buffer reclaim priority hooks 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 commit 430cbeb86fdcbbdabea7d4aa65307de8de425350 Author: Dave Chinner Date: Thu Dec 2 16:30:55 2010 +1100 xfs: add a lru to the XFS buffer cache 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 commit ff57ab21995a8636cfc72efeebb09cc6034d756f Author: Dave Chinner Date: Tue Nov 30 17:27:57 2010 +1100 xfs: convert xfsbud shrinker to a per-buftarg shrinker. 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 commit 1a427ab0c1b205d1bda8da0b77ea9d295ac23c57 Author: Dave Chinner Date: Thu Dec 16 17:08:41 2010 +1100 xfs: convert pag_ici_lock to a spin lock 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 commit 1a3e8f3da09c7082d25b512a0ffe569391e4c09a Author: Dave Chinner Date: Fri Dec 17 17:29:43 2010 +1100 xfs: convert inode cache lookups to use RCU locking 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 commit d95b7aaf9ab6738bef1ebcc52ab66563085e44ac Author: Dave Chinner Date: Thu Dec 16 16:41:39 2010 +1100 xfs: rcu free inodes 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 commit 6e857567dbbfe14dd6cc3f7414671b047b1ff5c7 Author: Dave Chinner Date: Thu Dec 23 12:02:31 2010 +1100 xfs: don't truncate prealloc from frequently accessed inodes 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 track of ->release calls made on a dirty 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 when the inode is dirty, there is a good chance that the inode is being accessed by the NFS server. Hence set a flag the first time ->release is called while there are delalloc blocks still outstanding on the inode. If this flag is set 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. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 055388a3188f56676c21e92962fc366ac8b5cb72 Author: Dave Chinner Date: Tue Jan 4 11:35:03 2011 +1100 xfs: dynamic speculative EOF preallocation 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 commit 622d81494fa32343a4b97b607619656c7a4a6d1a Author: Dave Chinner Date: Thu Dec 23 11:57:37 2010 +1100 xfs: use KM_NOFS for allocations during attribute list operations 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 Reviewed-by: Christoph Hellwig commit dcfcf20512cb517ac18b9433b676183fa1257911 Author: Dave Chinner Date: Thu Dec 23 11:57:13 2010 +1100 xfs: provide a inode iolock lockdep class 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 Reviewed-by: Christoph Hellwig ----------------------------------------------------------------------- Summary of changes: 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 | 1 - fs/xfs/linux-2.6/xfs_super.c | 22 +- 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_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 | 1 + 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 | 739 +++++++++++++++++++----------------------- 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 | 23 ++- fs/xfs/xfs_mount.h | 14 + fs/xfs/xfs_trans.c | 79 +++++- 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 +++-- 32 files changed, 1403 insertions(+), 916 deletions(-) delete mode 100644 fs/xfs/linux-2.6/sv.h hooks/post-receive -- XFS development tree From SRS0+2WZ0+39+fromorbit.com=david@internode.on.net Wed Jan 5 01:34:22 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p057YLUb123401 for ; Wed, 5 Jan 2011 01:34:22 -0600 X-ASG-Debug-ID: 1294212987-7234034f0000-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 8BC541D0E628 for ; Tue, 4 Jan 2011 23:36:28 -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 aCRkiiyMzyFn4bRV for ; Tue, 04 Jan 2011 23:36:28 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51905664-1927428 for multiple; Wed, 05 Jan 2011 18:06:27 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PaNuz-0002of-E8; Wed, 05 Jan 2011 18:36:25 +1100 Date: Wed, 5 Jan 2011 18:36:25 +1100 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write Subject: Re: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write Message-ID: <20110105073625.GA8322@dastard> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-6-git-send-email-david@fromorbit.com> <1294192495.2485.726.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294192495.2485.726.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: 1294212989 X-Barracuda-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.51475 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, Jan 04, 2011 at 07:54:55PM -0600, Alex Elder wrote: > On Tue, 2011-01-04 at 15:48 +1100, Dave Chinner wrote: > > 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. > > All good, very good. But I'm not sure why you cut > out the code that backed off to buffered I/O if > generic_file_direct_write() returns an error. > (You gave no explanation.) Oh, I thought I put one in there. It's simple, though - XFS handles all allocation cases in the direct IO code and never returns a result that will require falling back to the buffered IO path. It is basically a code path that has been unused for years and all it does is make the logic much more complex to understand. I'll add that to the commit message.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+XDxz+39+fromorbit.com=david@internode.on.net Wed Jan 5 01:53:06 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p057r63o125791 for ; Wed, 5 Jan 2011 01:53:06 -0600 X-ASG-Debug-ID: 1294214112-2e7c01330000-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 5931AFA361A for ; Tue, 4 Jan 2011 23:55:13 -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 3ghTA5AYYzI2eEsV for ; Tue, 04 Jan 2011 23:55:13 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52043619-1927428 for multiple; Wed, 05 Jan 2011 18:25:11 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PaOD8-0002qX-6v; Wed, 05 Jan 2011 18:55:10 +1100 Date: Wed, 5 Jan 2011 18:55:10 +1100 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Subject: Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Message-ID: <20110105075510.GB8322@dastard> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-5-git-send-email-david@fromorbit.com> <1294192481.2485.721.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294192481.2485.721.camel@doink> 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: 1294214114 X-Barracuda-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.51476 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, Jan 04, 2011 at 07:54:41PM -0600, Alex Elder wrote: > On Tue, 2011-01-04 at 15:48 +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > We need to obtain the i_mutex, i_iolock and i_ilock during the read > > and write paths. Add a set of wrapper functions to neatly > > encapsulate the lock ordering and shared/exclusive semantics to make > > the locking easier to follow and get right. > > > > Signed-off-by: Dave Chinner > > I like this change, but I think you missed a lock call. > I also notice there are some locking differences, and > I don't really question them but I wonder if you can > offer a little more explanation. > > > --- > > fs/xfs/linux-2.6/xfs_file.c | 123 ++++++++++++++++++++++++------------------- > > 1 files changed, 68 insertions(+), 55 deletions(-) > > > > diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c > > index 33a688c..0d6111e 100644 > > --- a/fs/xfs/linux-2.6/xfs_file.c > > +++ b/fs/xfs/linux-2.6/xfs_file.c > > . . . > > > @@ -262,22 +296,21 @@ xfs_file_aio_read( > > if (XFS_FORCED_SHUTDOWN(mp)) > > return -EIO; > > > > - if (unlikely(ioflags & IO_ISDIRECT)) > > - mutex_lock(&inode->i_mutex); > > - xfs_ilock(ip, XFS_IOLOCK_SHARED); > > - > > if (unlikely(ioflags & IO_ISDIRECT)) { > > + xfs_rw_ilock(ip, XFS_IOLOCK_EXCL); > > + > > Previously only XFS_IOLOCK_SHARED was used here. > I understand that using the IOLOCK_EXCL now gets > the desired mutex_lock() call. Is the previous > code in error here though? No, it isn't wrong. However, the new code takes advantage of the demote process to drop back to IOLOCK_SHARED before the i_mutex is dropped so there's no externally visible change in behaviour. This means that the locking heirarchy is much easier to maintain and understand as all operations use the same wrappers. i.e. there is no real need for a i_mutex + IOLOCK_SHARED state because i_mutex means exclusive access and is the outer lock. Hence the IOLOCK_SHARED vs IOLOCK_EXCL is pretty much irrelevant so I picked the simpler one to implement and understand. > Can you anticipate > any different behavior because of this lock change? None that I can think of, because we are supposed to hold the i_mutex over page cache flushes and it is the outermost lock. > Does this specific change justify separating it > into a small patch just before this one? IMO, not really, but I can if you want. It'll just churn the patch series, though... > > if (inode->i_mapping->nrpages) { > > ret = -xfs_flushinval_pages(ip, > > (iocb->ki_pos & PAGE_CACHE_MASK), > > -1, FI_REMAPF_LOCKED); > > + if (ret) { > > + xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); > > + return ret; > > + } > > } > > - mutex_unlock(&inode->i_mutex); > > - if (ret) { > > - xfs_iunlock(ip, XFS_IOLOCK_SHARED); > > - return ret; > > - } > > - } > > + xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); > > + } else > > + xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); > > > > trace_xfs_file_read(ip, size, iocb->ki_pos, ioflags); > > > > . . . > > > @@ -386,14 +419,13 @@ xfs_file_splice_write( > > if (XFS_FORCED_SHUTDOWN(ip->i_mount)) > > return -EIO; > > > > - xfs_ilock(ip, XFS_IOLOCK_EXCL); > > + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL); > > Similar sentiments here. We will now be acquiring i_mutex > here where previously we did not. Is that OK? It should be because it will have exactly the same serialisation effect as the current XFS_IOLOCK_EXCL has - exclusive access across the write. > > @@ -631,21 +662,16 @@ xfs_file_aio_write( > > 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); > > } > > > > - xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); > > - > > Maybe I'm missing something, but I think you want to > insert this here: > xfs_rw_ilock(ip, XFS_ILOCK_EXCL|iolock); > ...because (for starters) if generic_write_checks() > returns an error below you're going to be calling > the unlock routine. Yes, good catch. I didn't notice that because I didn't test the series patch by patch - just the end result. Will fix. > > > start: > > ret = generic_write_checks(file, &pos, &count, > > S_ISBLK(inode->i_mode)); > > if (ret) { > > - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); > > - goto out_unlock_mutex; > > + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); > > + return ret; > > } > > > > if (ioflags & IO_ISDIRECT) { > > @@ -654,16 +680,14 @@ start: > > mp->m_rtdev_targp : mp->m_ddev_targp; > > > > if ((pos & target->bt_smask) || (count & target->bt_smask)) { > > - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); > > + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); > > return XFS_ERROR(-EINVAL); > > } > > > > One can get a little lost in this code. I don't know if > this comment is exactly right, but something like it might > be helpful (while you're in here). > > /* > * For direct I/O, if there are cached pages or > * we're extending the file, we need IOLOCK_EXCL > * until we're sure the bytes at the new EOF have > * been zeroed and/or the cached pages are flushed > * out. Upgrade the I/O lock and start again. > */ Probably a good idea. I'll add something there. Cheers, Dave. -- Dave Chinner david@fromorbit.com From ajeet.yadav.77@gmail.com Wed Jan 5 02:24:25 2011 X-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 p058OPcx129580 for ; Wed, 5 Jan 2011 02:24:25 -0600 X-ASG-Debug-ID: 1294215992-57c800420000-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 5B37DFA479E for ; Wed, 5 Jan 2011 00:26:32 -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 jLyNsbcGCFQgkCpy for ; Wed, 05 Jan 2011 00:26:32 -0800 (PST) Received: by qyk12 with SMTP id 12so16985830qyk.5 for ; Wed, 05 Jan 2011 00:26:31 -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=T2e93KKd//8sony6s8fneB9TtMCSew7mHRQq03OhlwQ=; b=xMm+CstLVLe35HiKupbKafrGMku1PeCUn5uSNJ3Qox11RKuZHCEqGXZctTeyuAuwUy z0KrIUNtdKtrFMCrq4EnpwJ7zBRa26EHhchZdzDAh4gb1AlIbeEgtaO68Nzl9Gip5Aku k0jLnegd09gWvk0hBcW4ySzRLdkex69j0JZ1o= 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=Dh0+UZtTFmI2M8Jc3Yg9IpOlQdmTWUa63aE/PhTgXC+YJChvKVcFLrGO7UxonBI7lR 4UlyVo0T+OWrUqdzHwnSviyCR7Rw4alVN111zpwh49xhYdKHPuL7R8Un6QksDfKQCB7e oTWjMmQc1clteMDV2iaQGLeLzYGcdrVATJtRA= MIME-Version: 1.0 Received: by 10.229.99.76 with SMTP id t12mr19575650qcn.275.1294215991645; Wed, 05 Jan 2011 00:26:31 -0800 (PST) Received: by 10.220.165.198 with HTTP; Wed, 5 Jan 2011 00:26:31 -0800 (PST) In-Reply-To: <20110104051947.GI15179@dastard> References: <20101230231353.GC15179@dastard> <20110104051947.GI15179@dastard> Date: Wed, 5 Jan 2011 17:26:31 +0900 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=0016367f985e71d4e704991524b0 X-Barracuda-Connect: mail-qy0-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1294215993 X-Barracuda-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.51478 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 --0016367f985e71d4e704991524b0 Content-Type: text/plain; charset=ISO-8859-1 Thanks, I think its better to end this mail by rerering to your patch. http://oss.sgi.com/archives/xfs/2011-01/msg00020.html On Tue, Jan 4, 2011 at 2:19 PM, Dave Chinner wrote: > On Fri, Dec 31, 2010 at 12:17:12PM +0530, Ajeet Yadav wrote: > > 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; > > } > > This won't work reliably because it only handles one specific type > of error. We can get more than just EIO back from the lower layers, > and so if the superblock write gets a different error then we'll > still get the same hang. > > Effectively what you are doing here is running the > xfs_buf_error_relse() callback directly in line. This will result in > the buffer being unlocked before the error is pulled off the buffer > after xfs_buf_iowait() completes. Essentially that means that some > other thread can reuse the buffer and clear the error before the > waiter has received the error. > > I think the correct fix is to call the bp->b_relse function when the > waiter is woken to clear the error and unlock the buffer. I've just > posted a patch to do this for 2.6.38, but it won't trivially backport > to 2.6.34 or 2.6.30 as the synchronous write interfaces into the > buffer cache have been cleaned up and simplified recently. It should > still be relatively easy to handle, though. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --0016367f985e71d4e704991524b0 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Thanks, I think its better to end this mail by rerering to your patch.=
=A0


=A0
On Tue, Jan 4, 2011 at 2:19 PM, Dave Chinner <david@fromorbit.c= om> wrote:
On Fri, Dec 31, 2010 at 12:17:12PM +0530, Ajeet Yadav wro= te:
> Dear Dave,
>
> Our Kernel is 2.6.30.9 but XFS is ba= ckported 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 !=3D
> NULL, and b_hold > 2
>
> I have made below workaround i= t solved the problem in our case because when
> USB is removed we kno= w we get EIO error.
>
> But I think we need to review xfs_buf_e= rror_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 /* We actually overwrite the existing b-relse
> =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0function at times, but we= 9;re gonna be shutting
> down
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0an= yway. */
> - =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 XFS_BUF_DONE(bp);
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 XFS_BUF_FINISH_IOWAIT(bp);
> + =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 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 XFS_BUF_= SUPER_STALE(bp);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 trace_xf= s_buf_item_iodone(bp, _RET_IP_);
> + =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 XFS_BUF_SET_FSPRIVA= TE(bp, NULL);
> + =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 xfs_biodone(bp);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 } else {
> +
> XFS_BUF_SET_BRELSE_FUNC(bp,xfs_buf_e= rror_relse);
> + =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 XFS_BUF_FINISH_IOWAIT(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 return;
> =A0 =A0 =A0 =A0 }

This won't work reliably because it only handles one sp= ecific type
of error. We can get more than just EIO back from the lower = layers,
and so if the superblock write gets a different error then we= 9;ll
still get the same hang.

Effectively what you are doing here is runn= ing the
xfs_buf_error_relse() callback directly in line. This will resul= t in
the buffer being unlocked before the error is pulled off the buffer=
after xfs_buf_iowait() completes. Essentially that means that some
other= thread can reuse the buffer and clear the error before the
waiter has r= eceived the error.

I think the correct fix is to call the bp->b_r= else function when the
waiter is woken to clear the error and unlock the buffer. I've just
= posted a patch to do this for 2.6.38, but it won't trivially backportto 2.6.34 or 2.6.30 as the synchronous write interfaces into the
buffe= r cache have been cleaned up and simplified recently. It should
still be relatively easy to handle, though.

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--0016367f985e71d4e704991524b0-- From tore.hoivaag.larsen@cggveritas.com Wed Jan 5 02:58:02 2011 X-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,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 p058w2AF135257 for ; Wed, 5 Jan 2011 02:58:02 -0600 X-ASG-Debug-ID: 1294218009-0b5701c70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from VA3EHSOBE005.bigfish.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3C1EB1DBD9AA for ; Wed, 5 Jan 2011 01:00:09 -0800 (PST) Received: from VA3EHSOBE005.bigfish.com (va3ehsobe005.messaging.microsoft.com [216.32.180.31]) by cuda.sgi.com with ESMTP id 5FC1DHgiMiQOJuX4 for ; Wed, 05 Jan 2011 01:00:09 -0800 (PST) Received: from mail23-va3-R.bigfish.com (10.7.14.254) by VA3EHSOBE005.bigfish.com (10.7.40.25) with Microsoft SMTP Server id 14.1.225.8; Wed, 5 Jan 2011 09:00:09 +0000 Received: from mail23-va3 (localhost.localdomain [127.0.0.1]) by mail23-va3-R.bigfish.com (Postfix) with ESMTP id 4957C1678543 for ; Wed, 5 Jan 2011 09:00:09 +0000 (UTC) X-SpamScore: -5 X-BigFish: VS-5(zzdf9Mzz1202hzzz2dh27ah2a8h668h67h) X-Forefront-Antispam-Report: KIP:(null);UIP:(null);IPVD:NLI;H:hou-exh01.int.cggveritas.com;RD:error;EFVD:FOP Received: from mail23-va3 (localhost.localdomain [127.0.0.1]) by mail23-va3 (MessageSwitch) id 1294218009170775_1207; Wed, 5 Jan 2011 09:00:09 +0000 (UTC) Received: from VA3EHSMHS028.bigfish.com (unknown [10.7.14.241]) by mail23-va3.bigfish.com (Postfix) with ESMTP id 256F164004E for ; Wed, 5 Jan 2011 09:00:09 +0000 (UTC) Received: from hou-exh01.int.cggveritas.com (192.159.106.244) by VA3EHSMHS028.bigfish.com (10.7.99.38) with Microsoft SMTP Server (TLS) id 14.1.225.8; Wed, 5 Jan 2011 09:00:01 +0000 Received: from crw-exh01.int.cggveritas.com (10.50.16.45) by hou-exh01.int.cggveritas.com (10.14.1.186) with Microsoft SMTP Server (TLS) id 8.2.254.0; Wed, 5 Jan 2011 03:00:01 -0600 Received: from CRW-EXM01.int.cggveritas.com ([10.14.254.241]) by crw-exh01.int.cggveritas.com ([10.50.16.45]) with mapi; Wed, 5 Jan 2011 09:00:00 +0000 From: =?iso-8859-1?Q?Larsen=2C_Tore_H=F8ivaag?= To: "xfs@oss.sgi.com" Date: Wed, 5 Jan 2011 08:59:59 +0000 X-ASG-Orig-Subj: using raid devices raw, loop devices ? Subject: using raid devices raw, loop devices ? Thread-Topic: using raid devices raw, loop devices ? Thread-Index: AQHLrLbuml7ejoxV20GtlM6UyRyIsw== Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Bypass-Agent: EF-1; X-OriginatorOrg: cggveritas.com X-Barracuda-Connect: va3ehsobe005.messaging.microsoft.com[216.32.180.31] X-Barracuda-Start-Time: 1294218010 X-Barracuda-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.51481 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 Lots of people is using >2TB luns labeled loop and using major device.=20 # parted -s /dev/sdd print Disk geometry for /dev/sdd: 0.000-10486938.000 megabytes Disk label type: loop Minor Start End Filesystem Flags 1 0.000 10486938.000 xfs =20 ^^^^ Comments? What causes the occasional corruption? Boot time fsck, dmraid? = Volume manager daemons? # parted -s /dev/sdd print Disk geometry for /dev/sdd: 0.000-10486938.000 megabytes Disk label type: loop Minor Start End Filesystem Flags 1 0.000 10486938.000 xfs =20 [root@argus-vnq1 TSDCLI-v2.3.zip]# dmesg | grep sdd sdd : very big device. try to use READ CAPACITY(16). SCSI device sdd: 21477249024 512-byte hdwr sectors (10996352 MB) SCSI device sdd: drive cache: write back sdd : very big device. try to use READ CAPACITY(16). SCSI device sdd: 21477249024 512-byte hdwr sectors (10996352 MB) SCSI device sdd: drive cache: write back sdd: unknown partition table Attached scsi disk sdd at scsi8, channel 0, id 0, lun 0 XFS mounting filesystem sdd Starting XFS recovery on filesystem: sdd (dev: sdd) Ending XFS recovery on filesystem: sdd (dev: sdd) Regards, ToreL= From lczerner@redhat.com Wed Jan 5 04:19:24 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p05AJNmk146358 for ; Wed, 5 Jan 2011 04:19:24 -0600 X-ASG-Debug-ID: 1294222892-495603780000-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 4360BFA47DB for ; Wed, 5 Jan 2011 02:21:32 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HvGlkVP7Kezq5Z6F for ; Wed, 05 Jan 2011 02:21:32 -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 p05ALK3N018448 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Jan 2011 05:21:20 -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 p05ALHAQ027197 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 5 Jan 2011 05:21:19 -0500 Date: Wed, 5 Jan 2011 11:21:17 +0100 (CET) From: Lukas Czerner X-X-Sender: lukas@dhcp-lab-213.englab.brq.redhat.com To: Dave Chinner cc: Lukas Czerner , Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support In-Reply-To: <20110103232514.GF15179@dastard> Message-ID: References: <20101125112304.GA4195@infradead.org> <20101223014409.GL4907@dastard> <20101230114129.GA4321@infradead.org> <20110103232514.GF15179@dastard> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1294222892 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, 4 Jan 2011, Dave Chinner wrote: > On Mon, Jan 03, 2011 at 11:57:23AM +0100, Lukas Czerner wrote: > > On Thu, 30 Dec 2010, Christoph Hellwig wrote: > > > > > 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. > > > > Hi, I assume that you're talking about situation, when you call FITRIM > > with start and len not covering the whole filesystem possibly resulting > > in trimming just a part of the AG ? In this case I just copy my answer > > from previous mail... > > Yes. > > > I had two reasons to do this as it is, but only one is really worth it. > > Since we want to run FITRIM from the userspace on the background, we want > > to disturb other IO as little as possible and whole filesystem trim can > > take minutes on some devices (not talking about LUNs which is even more > > painful). > > Right - it's the high end we have to worry about for XFS: how long do you > expect a 100TB filesystem to take to TRIM? ;) Presumably a really long time, but it really differs from device to device. > > > > > So you'll probably agree that we do not want to have possibly > > minute long stalls when doing FITRIM. And presumably we do not want the > > users to care about the size of AG, nor the blocksize (preferably). > > The issue is that an AG can cover 1TB of disk space, and locking it > for the entire time it takes to trim the free space will cause > IO disturbances. Even holding the AGF locked for a few seconds > can cause problems. > > So I guess the question is what sort of ranged woul dwe be expecting > to see a userspace background trim daemon be using? Well, I think that doing 1TB trim is not very good idea even if AG is not 1TB big. So doing smaller chunks is probably what userspace daemon need to do. Also note that we do not exactly need to do trim all the time. If we notice that we are running out of space in advance (how much in advance?), we can start trimming smaller chunks, until we reach reasonable a reasonable pool of reclaimed space, or until we trim the whole device. OR, the daemon can watch IO load and when it is low (presumably at night) it can trim the device (possibly with very small cadence) as some kind of precaution measure. The fact is, I am not very familiar with various server IO loads and typical usage of huge storages, so someone who is, can help us to create heuristic for trim daemon. Also I think it is a good idea to something like: if (need_resched()) { unlock() cond_resched(); lock() } while trimming free chunks in the AG. -Lukas > > Cheers, > > Dave. > From eflorac@intellique.com Wed Jan 5 04:29:25 2011 X-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,MIME_8BIT_HEADER 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 p05ATPSd147800 for ; Wed, 5 Jan 2011 04:29:25 -0600 X-ASG-Debug-ID: 1294223488-513a00e50000-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 C0E7E234231 for ; Wed, 5 Jan 2011 02:31:31 -0800 (PST) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id OXGjDUJdUDvfA08u for ; Wed, 05 Jan 2011 02:31:31 -0800 (PST) Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 259894C81AC; Wed, 5 Jan 2011 11:31:23 +0100 (CET) Date: Wed, 5 Jan 2011 11:31:26 +0100 From: Emmanuel Florac To: Larsen Tore =?ISO-8859-1?Q?H=F8ivaag?= Cc: "xfs@oss.sgi.com" X-ASG-Orig-Subj: Re: using raid devices raw, loop devices ? Subject: Re: using raid devices raw, loop devices ? Message-ID: <20110105113126.553d4b0e@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: 1294223493 X-Barracuda-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.51487 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, 5 Jan 2011 08:59:59 +0000 Larsen, Tore H=F8ivaag =E9crivait: > Comments? What causes the occasional corruption? Boot time fsck, > dmraid? Volume manager daemons? >=20 Probably the volume isn't properly unmounted at shutdown. When does the problem occur? At every boot? --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From huflit_hr_huong@yahoo.com.vn Wed Jan 5 07:44:53 2011 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 p05DipZu173138 for ; Wed, 5 Jan 2011 07:44:52 -0600 X-ASG-Debug-ID: 1294235217-2f6202eb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from nm21-vm0.bullet.mail.ne1.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 18E0A235B52 for ; Wed, 5 Jan 2011 05:46:57 -0800 (PST) Received: from nm21-vm0.bullet.mail.ne1.yahoo.com (nm21-vm0.bullet.mail.ne1.yahoo.com [98.138.90.94]) by cuda.sgi.com with SMTP id jwQtUlaEj1ETyE9m for ; Wed, 05 Jan 2011 05:46:57 -0800 (PST) Received: from [98.138.90.49] by nm21.bullet.mail.ne1.yahoo.com with NNFMP; 05 Jan 2011 13:46:57 -0000 Received: from [98.138.84.47] by tm2.bullet.mail.ne1.yahoo.com with NNFMP; 05 Jan 2011 13:46:55 -0000 Received: from [127.0.0.1] by smtp115.mail.ne1.yahoo.com with NNFMP; 05 Jan 2011 13:46:55 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com.vn; s=s1024; t=1294235214; bh=L/5VZafWVxw463SA+uAuHobg/sRo8F77Fb6gTPGfNFM=; h=X-Yahoo-Newman-Id:Received:X-Yahoo-SMTP:X-YMail-OSG:X-Yahoo-Newman-Property:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:Content-Type; b=SgJv35D1/pJo280vZvZ/6QLNFlTRbWqNksF/t7jAJ4yAIJVY2COcoRUqgx91U//xOIwxqI1uu3a3bnJcYMZR6cYUVbygAeAUyrsJ45NY0jA5Z2vW9zY2sXzByEqaQRjcXfvOddja/1IEeg+iClf4TwMbkROnbv2CBhJj4zVQ/z4= X-Yahoo-Newman-Id: 961047.37366.bm@smtp115.mail.ne1.yahoo.com Received: from [192.168.1.2] (huflit_hr_huong@113.170.81.13 with plain) by smtp115.mail.ne1.yahoo.com with SMTP; 05 Jan 2011 05:45:49 -0800 PST X-Yahoo-SMTP: NGuCcmuswBB6o1g8uByOlriILT7J4AR0.n7xFw-- X-YMail-OSG: C9Vk18QVM1kAsbf72UZII5EIXvI5Chhh_Q0uA7WOpNHnNhl k6spzsPZ574mNM2M.Q7NQtb78v8nnphEnx9MDM4IIyjJ4rvYA7BpgRlg2xVr REZ4Z.tlsYaS8T.RiKmNDZbhT4Glwb4mNztZr1AETb3RlFulU.IFRonVrZ_B cZ68P2ZvT8OIg38RKml5.B5v5pdUqdquamH4euClFFHgCoWqNnQf_sKHmB9v jyvmEf3uY8Q5jGCCWzL_UVWcq_NwiV7YujpBUJL1aV5NVrBnzkuFCv6JH2_8 a78ibfGT6MxCXkIWvVfh0JHE5eLBMabQHGY7As8nmfMCT.5kYt.VL X-Yahoo-Newman-Property: ymail-3 Message-ID: <4D247601.6020908@yahoo.com.vn> Date: Wed, 05 Jan 2011 20:45:37 +0700 From: HUFLIT UNIVERSITY User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: e2f024a3.f65395f@poppet.com X-ASG-Orig-Subj: TRUNG =?UTF-8?B?VMOCTSBOR0/huqBJIE5H4buuLUThu4pDSCBUSFXhuqxU?= Subject: TRUNG =?UTF-8?B?VMOCTSBOR0/huqBJIE5H4buuLUThu4pDSCBUSFXhuqxU?= Content-Type: multipart/alternative; boundary="------------030501080004060407050706" X-Barracuda-Connect: nm21-vm0.bullet.mail.ne1.yahoo.com[98.138.90.94] X-Barracuda-Start-Time: 1294235220 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. --------------030501080004060407050706 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit THĂ€NH THẬT XIN Lá»–I NẾU EMAIL NĂ€Y LĂ€M PHIỀN QUĂ KHĂCH! --------------030501080004060407050706 Content-Type: multipart/related; boundary="------------050207060203090700000208" --------------050207060203090700000208 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit
THĂ€NH THẬT XIN Lá»–I  NẾU EMAIL NĂ€Y LĂ€M PHIỀN QUĂ KHĂCH!

--------------050207060203090700000208 Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-ID: /9j/4SNmRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAAB AAAAagEoAAMAAAABAAIAAAExAAIAAABjAAAAcgEyAAIAAAAUAAAA1YdpAAQAAAABAAAA7AAA ARgAE4gAAAAnEAATiAAAACcQQWRvYmUgUGhvdG9zaG9wIENTNSAoMTIuMHgyMDEwMDExNSBb MjAxMDAxMTUubS45OTggMjAxMC8wMS8xNTowMjowMDowMCBjdXRvZmY7IG0gYnJhbmNoXSkg IFdpbmRvd3MAMjAxMDowOTowOSAyMDoxMTowMwAAAAAAA6ABAAMAAAAB//8AAKACAAQAAAAB AAAEQKADAAQAAAABAAAFqwAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAFmARsABQAA AAEAAAFuASgAAwAAAAEAAgAAAgEABAAAAAEAAAF2AgIABAAAAAEAACHoAAAAAAAAAEgAAAAB AAAASAAAAAH/2P/tAAxBZG9iZV9DTQAC/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJ DBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwM/8AAEQgAoAB4AwEiAAIRAQMRAf/dAAQACP/EAT8AAAEFAQEBAQEBAAAA AAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQC BQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1 FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm 9jdHV2d3h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFC I8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSF tJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A9JrdIjwS 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 AxslRxwBWgADGyVHHAFaAAMbJUccAVoAAxslRxwBWgADGyVHHAFaAAMbJUccAgAAAgAAADhC SU0EJQAAAAAAELnJN6el8L+ae9UxEC9c8FE4QklNBD0AAAAABEACAAAAIG5pVwAAAABcAFwA SAB1AGYAbABpAHQAMAAzAFwAaABwACAATABhAHMAZQByAEoAZQB0ACAAMQAwADEAMgAAAAAA AAAAAAAAAQQ8BdwANAMD1wAAAQABAAAAAAAAAAEABwBYAgAAAQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA U0RETQMFAAADBQAAaHAgTGFzZXJKZXQgMTAxMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAA AQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAAAAAABAAAAAQAAABgE AAAAAAAAAAAAAAAAAAAPAAAALQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAgICAAP8AAAD//wAA AP8AAAD//wAAAP8A/wD/AAAAAAAAAAAAAAAAAAAAAABkAAAAZAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeAwAA3gMAAAAAAAAAAAAA AIAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADhCSU0EOgAA AAAA4wAAABAAAAABAAAAAAALcHJpbnRPdXRwdXQAAAAFAAAAAENsclNlbnVtAAAAAENsclMA AAAAUkdCQwAAAABObSAgVEVYVAAAABEAQQBkAG8AYgBlACAAUgBHAEIAIAAoADEAOQA5ADgA KQAAAAAAAEludGVlbnVtAAAAAEludGUAAAAAQ2xybQAAAABNcEJsYm9vbAAAAAALcHJpbnRl ck5hbWVURVhUAAAAHABcAFwASAB1AGYAbABpAHQAMAAzAFwAaABwACAATABhAHMAZQByAEoA ZQB0ACAAMQAwADEAMgAAADhCSU0EOwAAAAABggAAABAAAAABAAAAAAAScHJpbnRPdXRwdXRP cHRpb25zAAAAEAAAAABDcHRuYm9vbAAAAAAAQ2xicmJvb2wAAAAAAFJnc01ib29sAAAAAABD cm5DYm9vbAAAAAAAQ250Q2Jvb2wAAAAAAExibHNib29sAAAAAABOZ3R2Ym9vbAAAAAAARW1s RGJvb2wAAAAAAEludHJib29sAAAAAABCY2tnT2JqYwAAAAEAAAAAAABSR0JDAAAAAwAAAABS ZCAgZG91YkBv4AAAAAAAAAAAAEdybiBkb3ViQG/gAAAAAAAAAAAAQmwgIGRvdWJAb+AAAAAA AAAAAABCcmRUVW50RiNSbHQAAAAAAAAAAAAAAABCbGQgVW50RiNSbHQAAAAAAAAAAAAAAABS c2x0VW50RiNQeGxAYAAAAAAAAAAAAAp2ZWN0b3JEYXRhYm9vbAEAAAAAUGdQc2VudW0AAAAA UGdQcwAAAABQZ1BDAAAAAFNjbCBVbnRGI1ByY0BZAAAAAAAAOEJJTQPtAAAAAAAQAIAAAAAB AAEAgAAAAAEAAThCSU0EJgAAAAAADgAAviqqq76qqqs/gAAAOEJJTQQNAAAAAAAEAAAAkDhC SU0EGQAAAAAABAAAAB44QklNA/MAAAAAAAkAAAAAAAAAAAEAOEJJTScQAAAAAAAKAAEAAAAA AAAAAjhCSU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAy AAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA//////// /////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD///// ////////////////////////A+gAAAAA/////////////////////////////wPoAAA4QklN BAAAAAAAAAIAQjhCSU0EAgAAAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOEJJTQQwAAAAAABYAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAThCSU0ELQAAAAAABgABAAAAEThCSU0ECAAA AAAAEAAAAAEAAAJAAAACQAAAAAA4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAAAANHAAAABgAA AAAAAAAAAAAFqwAABEAAAAAJAEEALQAwADIAMABfAGYAYQB4AAAAAQAAAAAAAAAAAAAAAAAA AAAAAAABAAAAAAAAAAAAAARAAAAFqwAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA AAAAABAAAAABAAAAAAAAbnVsbAAAAAIAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAA BAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAAFqwAAAABS Z2h0bG9uZwAABEAAAAAGc2xpY2VzVmxMcwAAAAFPYmpjAAAAAQAAAAAABXNsaWNlAAAAEgAA AAdzbGljZUlEbG9uZwAAAAAAAAAHZ3JvdXBJRGxvbmcAAAAAAAAABm9yaWdpbmVudW0AAAAM RVNsaWNlT3JpZ2luAAAADWF1dG9HZW5lcmF0ZWQAAAAAVHlwZWVudW0AAAAKRVNsaWNlVHlw ZQAAAABJbWcgAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcA AAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAABasAAAAAUmdodGxvbmcAAARAAAAA A3VybFRFWFQAAAABAAAAAAAAbnVsbFRFWFQAAAABAAAAAAAATXNnZVRFWFQAAAABAAAAAAAG YWx0VGFnVEVYVAAAAAEAAAAAAA5jZWxsVGV4dElzSFRNTGJvb2wBAAAACGNlbGxUZXh0VEVY VAAAAAEAAAAAAAlob3J6QWxpZ25lbnVtAAAAD0VTbGljZUhvcnpBbGlnbgAAAAdkZWZhdWx0 AAAACXZlcnRBbGlnbmVudW0AAAAPRVNsaWNlVmVydEFsaWduAAAAB2RlZmF1bHQAAAALYmdD b2xvclR5cGVlbnVtAAAAEUVTbGljZUJHQ29sb3JUeXBlAAAAAE5vbmUAAAAJdG9wT3V0c2V0 bG9uZwAAAAAAAAAKbGVmdE91dHNldGxvbmcAAAAAAAAADGJvdHRvbU91dHNldGxvbmcAAAAA AAAAC3JpZ2h0T3V0c2V0bG9uZwAAAAAAOEJJTQQoAAAAAAAMAAAAAj/wAAAAAAAAOEJJTQQR AAAAAAABAQA4QklNBBQAAAAAAAQAAAD3OEJJTQQMAAAAACIEAAAAAQAAAHgAAACgAAABaAAA 4QAAACHoABgAAf/Y/+0ADEFkb2JlX0NNAAL/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgM CQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAz/wAARCACgAHgDASIAAhEBAxEB/90ABAAI/8QBPwAAAQUBAQEBAQEA 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 Lg1xFJaMZu4P3brLbHf9Z/Sf6RAcVWYkbX9UW6teb1265hDMykba2urdjUbS4bnW2ep9qd6f q+1ljd/6P/ApMyPrDdknHrdkU7i8V334tPpAgGyv1XVZXqbP8EzZUqGE+yi4izqItZYb2MvN zZY8vcxl7mPtd7X1s3e32I1uTk20Bp6tXXdVADm2tgl/LSWPbva39H79v6P9MiOL906p07vU tnaJO4xqQIBPikuQbsYWsb1EBtBNVTRcA11bTU3a5rbGta219n9iqlJDX90osP8A/9k4QklN BCEAAAAAAFUAAAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAAAATAEEA ZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwACAAQwBTADUAAAABADhCSU0PoAAAAAABDG1h bmlJUkZSAAABADhCSU1BbkRzAAAA4AAAABAAAAABAAAAAAAAbnVsbAAAAAMAAAAAQUZTdGxv bmcAAAAAAAAAAEZySW5WbExzAAAAAU9iamMAAAABAAAAAAAAbnVsbAAAAAIAAAAARnJJRGxv bmcQZcUqAAAAAEZyR0Fkb3ViQGIAAAAAAAAAAAAARlN0c1ZsTHMAAAABT2JqYwAAAAEAAAAA AABudWxsAAAABAAAAABGc0lEbG9uZwAAAAAAAAAAQUZybWxvbmcAAAAAAAAAAEZzRnJWbExz AAAAAWxvbmcQZcUqAAAAAExDbnRsb25nAAAAAAAAOEJJTVJvbGwAAAAIAAAAAAAAAAA4QklN D6EAAAAAABxtZnJpAAAAAgAAABAAAAABAAAAAAAAAAEAAAAAOEJJTQQBAAAAAABoAAYAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAEAAAAB AAAAAAAAAAAAAAAAAAAAAAAAAAQAw3Ah/zhrMwDJhUr/+2p+AM+acgC+acg4QklNBAYAAAAA AAcACAAAAAEBAP/hTU1odHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBi ZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEg eG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1j MDYwIDYxLjEzNDM0MiwgMjAxMC8wMS8xMC0xODowNjo0MyAgICAgICAgIj4gPHJkZjpSREYg eG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMj Ij4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMu YWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1l bnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3No b3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8i IHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3Vy Y2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5 cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUg KDEyLjB4MjAxMDAxMTUgWzIwMTAwMTE1Lm0uOTk4IDIwMTAvMDEvMTU6MDI6MDA6MDAgY3V0 b2ZmOyBtIGJyYW5jaF0pICBXaW5kb3dzIiB4bXA6Q3JlYXRlRGF0ZT0iMjAxMC0wNS0xM1Qy MjoxNjo1NSswNzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMTAtMDktMDlUMjA6MTE6MDMrMDc6 MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTAtMDktMDlUMjA6MTE6MDMrMDc6MDAiIGRjOmZv cm1hdD0iaW1hZ2UvanBlZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFu Y2VJRD0ieG1wLmlpZDo2OUJDRkQzRDEzQkNERjExODU4QkE3RUIxNURDQTBCOSIgeG1wTU06 RG9jdW1lbnRJRD0idXVpZDpBQkI0RTIxMjlGNUVERjExODRCMDgyRDQwMENBNEEzNSIgeG1w TU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOkQ1Q0M0QjVDNUU1RURGMTE5ODlFQzA1 MzRBQ0NCRjlCIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFj dGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpENUNDNEI1QzVFNUVE RjExOTg5RUMwNTM0QUNDQkY5QiIgc3RFdnQ6d2hlbj0iMjAxMC0wNS0xM1QwNTo1NToyMSsw NzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSAoMTIuMHgy MDEwMDExNSBbMjAxMDAxMTUubS45OTggMjAxMC8wMS8xNTowMjowMDowMCBjdXRvZmY7IG0g YnJhbmNoXSkgIFdpbmRvd3MiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2 dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ2Q0M0QjVDNUU1RURGMTE5ODlFQzA1MzRBQ0NCRjlC IiBzdEV2dDp3aGVuPSIyMDEwLTA1LTEzVDE0OjA4OjQxKzA3OjAwIiBzdEV2dDpzb2Z0d2Fy ZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1ICgxMi4weDIwMTAwMTE1IFsyMDEwMDExNS5t Ljk5OCAyMDEwLzAxLzE1OjAyOjAwOjAwIGN1dG9mZjsgbSBicmFuY2hdKSAgV2luZG93cyIg c3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0 Omluc3RhbmNlSUQ9InhtcC5paWQ6NTk0MUE4MTQ4RDVFREYxMUEzNDE4MzdCMENGNzIwRjki IHN0RXZ0OndoZW49IjIwMTAtMDUtMTNUMTk6NDM6MDcrMDc6MDAiIHN0RXZ0OnNvZnR3YXJl QWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgKDEyLjB4MjAxMDAxMTUgWzIwMTAwMTE1Lm0u OTk4IDIwMTAvMDEvMTU6MDI6MDA6MDAgY3V0b2ZmOyBtIGJyYW5jaF0pICBXaW5kb3dzIiBz dEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6 aW5zdGFuY2VJRD0ieG1wLmlpZDo1QTQxQTgxNDhENUVERjExQTM0MTgzN0IwQ0Y3MjBGOSIg c3RFdnQ6d2hlbj0iMjAxMC0wNS0xM1QxOTo1OTo1OSswNzowMCIgc3RFdnQ6c29mdHdhcmVB Z2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSAoMTIuMHgyMDEwMDExNSBbMjAxMDAxMTUubS45 OTggMjAxMC8wMS8xNTowMjowMDowMCBjdXRvZmY7IG0gYnJhbmNoXSkgIFdpbmRvd3MiIHN0 RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDpp bnN0YW5jZUlEPSJ4bXAuaWlkOjVCNDFBODE0OEQ1RURGMTFBMzQxODM3QjBDRjcyMEY5IiBz dEV2dDp3aGVuPSIyMDEwLTA1LTEzVDIwOjI3OjM2KzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFn ZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1ICgxMi4weDIwMTAwMTE1IFsyMDEwMDExNS5tLjk5 OCAyMDEwLzAxLzE1OjAyOjAwOjAwIGN1dG9mZjsgbSBicmFuY2hdKSAgV2luZG93cyIgc3RF dnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omlu c3RhbmNlSUQ9InhtcC5paWQ6NUM0MUE4MTQ4RDVFREYxMUEzNDE4MzdCMENGNzIwRjkiIHN0 RXZ0OndoZW49IjIwMTAtMDUtMTNUMjA6NDI6MTArMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdl bnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgKDEyLjB4MjAxMDAxMTUgWzIwMTAwMTE1Lm0uOTk4 IDIwMTAvMDEvMTU6MDI6MDA6MDAgY3V0b2ZmOyBtIGJyYW5jaF0pICBXaW5kb3dzIiBzdEV2 dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5z dGFuY2VJRD0ieG1wLmlpZDo0RjFDODYwN0ZBNUVERjExOTdBQzhDODU4ODA3Q0U0MyIgc3RF dnQ6d2hlbj0iMjAxMC0wNS0xNFQwODo0MyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0i QWRvYmUgUGhvdG9zaG9wIENTNSAoMTIuMHgyMDEwMDExNSBbMjAxMDAxMTUubS45OTggMjAx MC8wMS8xNTowMjowMDowMCBjdXRvZmY7IG0gYnJhbmNoXSkgIFdpbmRvd3MiIHN0RXZ0OmNo YW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5j ZUlEPSJ4bXAuaWlkOjUwMUM4NjA3RkE1RURGMTE5N0FDOEM4NTg4MDdDRTQzIiBzdEV2dDp3 aGVuPSIyMDEwLTA1LTE0VDA5OjA2OjI2KzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJB ZG9iZSBQaG90b3Nob3AgQ1M1ICgxMi4weDIwMTAwMTE1IFsyMDEwMDExNS5tLjk5OCAyMDEw LzAxLzE1OjAyOjAwOjAwIGN1dG9mZjsgbSBicmFuY2hdKSAgV2luZG93cyIgc3RFdnQ6Y2hh bmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNl SUQ9InhtcC5paWQ6NUZFNDBERjMwMzVGREYxMTlGMkNDNTE2NDgxNzY2RTQiIHN0RXZ0Ondo ZW49IjIwMTAtMDUtMTRUMDk6NTQ6MDErMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFk b2JlIFBob3Rvc2hvcCBDUzUgKDEyLjB4MjAxMDAxMTUgWzIwMTAwMTE1Lm0uOTk4IDIwMTAv MDEvMTU6MDI6MDA6MDAgY3V0b2ZmOyBtIGJyYW5jaF0pICBXaW5kb3dzIiBzdEV2dDpjaGFu Z2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJ RD0ieG1wLmlpZDo2MEU0MERGMzAzNUZERjExOUYyQ0M1MTY0ODE3NjZFNCIgc3RFdnQ6d2hl bj0iMjAxMC0wNS0xNFQwOTo1NDowMSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRv YmUgUGhvdG9zaG9wIENTNSAoMTIuMHgyMDEwMDExNSBbMjAxMDAxMTUubS45OTggMjAxMC8w MS8xNTowMjowMDowMCBjdXRvZmY7IG0gYnJhbmNoXSkgIFdpbmRvd3MiIHN0RXZ0OmNoYW5n ZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlE PSJ4bXAuaWlkOjYxRTQwREYzMDM1RkRGMTE5RjJDQzUxNjQ4MTc2NkU0IiBzdEV2dDp3aGVu PSIyMDEwLTA1LTE0VDEyOjA1OjQxKzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9i ZSBQaG90b3Nob3AgQ1M1ICgxMi4weDIwMTAwMTE1IFsyMDEwMDExNS5tLjk5OCAyMDEwLzAx LzE1OjAyOjAwOjAwIGN1dG9mZjsgbSBicmFuY2hdKSAgV2luZG93cyIgc3RFdnQ6Y2hhbmdl ZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9 InhtcC5paWQ6NjJFNDBERjMwMzVGREYxMTlGMkNDNTE2NDgxNzY2RTQiIHN0RXZ0OndoZW49 IjIwMTAtMDUtMTRUMTI6MTM6MjYrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2Jl IFBob3Rvc2hvcCBDUzUgKDEyLjB4MjAxMDAxMTUgWzIwMTAwMTE1Lm0uOTk4IDIwMTAvMDEv MTU6MDI6MDA6MDAgY3V0b2ZmOyBtIGJyYW5jaF0pICBXaW5kb3dzIiBzdEV2dDpjaGFuZ2Vk PSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0i eG1wLmlpZDo2M0U0MERGMzAzNUZERjExOUYyQ0M1MTY0ODE3NjZFNCIgc3RFdnQ6d2hlbj0i MjAxMC0wNS0xNFQxMjoxNjo0MyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUg UGhvdG9zaG9wIENTNSAoMTIuMHgyMDEwMDExNSBbMjAxMDAxMTUubS45OTggMjAxMC8wMS8x NTowMjowMDowMCBjdXRvZmY7IG0gYnJhbmNoXSkgIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9 Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4 bXAuaWlkOkJCNzE2QzU0NTU1RkRGMTE4ODc0Q0IyNkVDODE0RTI0IiBzdEV2dDp3aGVuPSIy MDEwLTA1LTE0VDE5OjM2OjMzKzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQ aG90b3Nob3AgQ1M1ICgxMi4weDIwMTAwMTE1IFsyMDEwMDExNS5tLjk5OCAyMDEwLzAxLzE1 OjAyOjAwOjAwIGN1dG9mZjsgbSBicmFuY2hdKSAgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0i LyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9Inht cC5paWQ6QkM3MTZDNTQ1NTVGREYxMTg4NzRDQjI2RUM4MTRFMjQiIHN0RXZ0OndoZW49IjIw MTAtMDUtMTRUMjA6MDI6NTUrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBo b3Rvc2hvcCBDUzUgKDEyLjB4MjAxMDAxMTUgWzIwMTAwMTE1Lm0uOTk4IDIwMTAvMDEvMTU6 MDI6MDA6MDAgY3V0b2ZmOyBtIGJyYW5jaF0pICBXaW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIv Ii8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1w LmlpZDpCRTcxNkM1NDU1NUZERjExODg3NENCMjZFQzgxNEUyNCIgc3RFdnQ6d2hlbj0iMjAx MC0wNS0xNFQyMDozMjoyNSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhv dG9zaG9wIENTNSAoMTIuMHgyMDEwMDExNSBbMjAxMDAxMTUubS45OTggMjAxMC8wMS8xNTow MjowMDowMCBjdXRvZmY7IG0gYnJhbmNoXSkgIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8i Lz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAu aWlkOjRGRjg0Q0VDNUQ1RkRGMTFBNDI4RTQwMzIyOUE5REY5IiBzdEV2dDp3aGVuPSIyMDEw LTA1LTE0VDIwOjM4OjA0KzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90 b3Nob3AgQ1M1ICgxMi4weDIwMTAwMTE1IFsyMDEwMDExNS5tLjk5OCAyMDEwLzAxLzE1OjAy OjAwOjAwIGN1dG9mZjsgbSBicmFuY2hdKSAgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIv PiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5p aWQ6NTBGODRDRUM1RDVGREYxMUE0MjhFNDAzMjI5QTlERjkiIHN0RXZ0OndoZW49IjIwMTAt MDUtMTRUMjA6NTA6NDIrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rv c2hvcCBDUzUgKDEyLjB4MjAxMDAxMTUgWzIwMTAwMTE1Lm0uOTk4IDIwMTAvMDEvMTU6MDI6 MDA6MDAgY3V0b2ZmOyBtIGJyYW5jaF0pICBXaW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+ IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlp ZDo1MUY4NENFQzVENUZERjExQTQyOEU0MDMyMjlBOURGOSIgc3RFdnQ6d2hlbj0iMjAxMC0w NS0xNFQyMDo1Nzo0OCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9z aG9wIENTNSAoMTIuMHgyMDEwMDExNSBbMjAxMDAxMTUubS45OTggMjAxMC8wMS8xNTowMjow MDowMCBjdXRvZmY7IG0gYnJhbmNoXSkgIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4g PHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlk OjUyRjg0Q0VDNUQ1RkRGMTFBNDI4RTQwMzIyOUE5REY5IiBzdEV2dDp3aGVuPSIyMDEwLTA1 LTE0VDIxOjE2OjA0KzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3No b3AgQ1M1ICgxMi4weDIwMTAwMTE1IFsyMDEwMDExNS5tLjk5OCAyMDEwLzAxLzE1OjAyOjAw OjAwIGN1dG9mZjsgbSBicmFuY2hdKSAgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8 cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6 ODUwMTBENEM2ODVGREYxMTkxRThCQUM1OTc3REIyRDciIHN0RXZ0OndoZW49IjIwMTAtMDUt MTRUMjE6NTI6MjArMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hv cCBDUzUgKDEyLjB4MjAxMDAxMTUgWzIwMTAwMTE1Lm0uOTk4IDIwMTAvMDEvMTU6MDI6MDA6 MDAgY3V0b2ZmOyBtIGJyYW5jaF0pICBXaW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxy ZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4 NjAxMEQ0QzY4NUZERjExOTFFOEJBQzU5NzdEQjJENyIgc3RFdnQ6d2hlbj0iMjAxMC0wNS0x NFQyMjoyMzo0OCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9w IENTNSAoMTIuMHgyMDEwMDExNSBbMjAxMDAxMTUubS45OTggMjAxMC8wMS8xNTowMjowMDow MCBjdXRvZmY7IG0gYnJhbmNoXSkgIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJk ZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjg3 MDEwRDRDNjg1RkRGMTE5MUU4QkFDNTk3N0RCMkQ3IiBzdEV2dDp3aGVuPSIyMDEwLTA1LTE0 VDIyOjM3OjU4KzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3Ag Q1M1ICgxMi4weDIwMTAwMTE1IFsyMDEwMDExNS5tLjk5OCAyMDEwLzAxLzE1OjAyOjAwOjAw IGN1dG9mZjsgbSBicmFuY2hdKSAgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRm OmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OEMw MTBENEM2ODVGREYxMTkxRThCQUM1OTc3REIyRDciIHN0RXZ0OndoZW49IjIwMTAtMDUtMTRU MjI6NTk6MTgrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBD UzUgKDEyLjB4MjAxMDAxMTUgWzIwMTAwMTE1Lm0uOTk4IDIwMTAvMDEvMTU6MDI6MDA6MDAg Y3V0b2ZmOyBtIGJyYW5jaF0pICBXaW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6 bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo3REVF MzE4NDgyNUZERjExQjE3QkYyQTExNkQyNjM1MSIgc3RFdnQ6d2hlbj0iMjAxMC0wNS0xNVQw MToxNDozNCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENT NSAoMTIuMHgyMDEwMDExNSBbMjAxMDAxMTUubS45OTggMjAxMC8wMS8xNTowMjowMDowMCBj dXRvZmY7IG0gYnJhbmNoXSkgIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjps aSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjdFRUUz MTg0ODI1RkRGMTFCMTdCRjJBMTE2RDI2MzUxIiBzdEV2dDp3aGVuPSIyMDEwLTA1LTE1VDAx OjE0OjM0KzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1 ICgxMi4weDIwMTAwMTE1IFsyMDEwMDExNS5tLjk5OCAyMDEwLzAxLzE1OjAyOjAwOjAwIGN1 dG9mZjsgbSBicmFuY2hdKSAgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxp IHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6N0ZFRTMx ODQ4MjVGREYxMUIxN0JGMkExMTZEMjYzNTEiIHN0RXZ0OndoZW49IjIwMTAtMDUtMTVUMDE6 NDY6NDcrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUg KDEyLjB4MjAxMDAxMTUgWzIwMTAwMTE1Lm0uOTk4IDIwMTAvMDEvMTU6MDI6MDA6MDAgY3V0 b2ZmOyBtIGJyYW5jaF0pICBXaW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkg c3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4MEVFMzE4 NDgyNUZERjExQjE3QkYyQTExNkQyNjM1MSIgc3RFdnQ6d2hlbj0iMjAxMC0wNS0xNVQwMjow NDoxMCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSAo MTIuMHgyMDEwMDExNSBbMjAxMDAxMTUubS45OTggMjAxMC8wMS8xNTowMjowMDowMCBjdXRv ZmY7IG0gYnJhbmNoXSkgIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBz dEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjgxRUUzMTg0 ODI1RkRGMTFCMTdCRjJBMTE2RDI2MzUxIiBzdEV2dDp3aGVuPSIyMDEwLTA1LTE1VDAyOjEy OjQ5KzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1ICgx Mi4weDIwMTAwMTE1IFsyMDEwMDExNS5tLjk5OCAyMDEwLzAxLzE1OjAyOjAwOjAwIGN1dG9m ZjsgbSBicmFuY2hdKSAgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0 RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6QkZERjhCQTJB OEFFREYxMUExQkRDQ0M4MTgwOEQwMTIiIHN0RXZ0OndoZW49IjIwMTAtMDgtMjNUMTg6MjE6 NTQrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgKDEy LjB4MjAxMDAxMTUgWzIwMTAwMTE1Lm0uOTk4IDIwMTAvMDEvMTU6MDI6MDA6MDAgY3V0b2Zm OyBtIGJyYW5jaF0pICBXaW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RF dnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpDMERGOEJBMkE4 QUVERjExQTFCRENDQzgxODA4RDAxMiIgc3RFdnQ6d2hlbj0iMjAxMC0wOC0yM1QxODoyMjoz MiswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSAoMTIu MHgyMDEwMDExNSBbMjAxMDAxMTUubS45OTggMjAxMC8wMS8xNTowMjowMDowMCBjdXRvZmY7 IG0gYnJhbmNoXSkgIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2 dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkMxREY4QkEyQThB RURGMTFBMUJEQ0NDODE4MDhEMDEyIiBzdEV2dDp3aGVuPSIyMDEwLTA4LTIzVDE4OjIyOjMy KzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1ICgxMi4w eDIwMTAwMTE1IFsyMDEwMDExNS5tLjk5OCAyMDEwLzAxLzE1OjAyOjAwOjAwIGN1dG9mZjsg bSBicmFuY2hdKSAgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0 OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6QzRERjhCQTJBOEFF REYxMUExQkRDQ0M4MTgwOEQwMTIiIHN0RXZ0OndoZW49IjIwMTAtMDgtMjNUMTk6MTk6NTIr MDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgKDEyLjB4 MjAxMDAxMTUgWzIwMTAwMTE1Lm0uOTk4IDIwMTAvMDEvMTU6MDI6MDA6MDAgY3V0b2ZmOyBt IGJyYW5jaF0pICBXaW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6 YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNURGOEJBMkE4QUVE RjExQTFCRENDQzgxODA4RDAxMiIgc3RFdnQ6d2hlbj0iMjAxMC0wOC0yM1QyMDo1ODoxMysw NzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSAoMTIuMHgy MDEwMDExNSBbMjAxMDAxMTUubS45OTggMjAxMC8wMS8xNTowMjowMDowMCBjdXRvZmY7IG0g YnJhbmNoXSkgIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDph Y3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkM2REY4QkEyQThBRURG MTFBMUJEQ0NDODE4MDhEMDEyIiBzdEV2dDp3aGVuPSIyMDEwLTA4LTIzVDIxOjA2OjA0KzA3 OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1ICgxMi4weDIw MTAwMTE1IFsyMDEwMDExNS5tLjk5OCAyMDEwLzAxLzE1OjAyOjAwOjAwIGN1dG9mZjsgbSBi cmFuY2hdKSAgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFj dGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6QzdERjhCQTJBOEFFREYx MUExQkRDQ0M4MTgwOEQwMTIiIHN0RXZ0OndoZW49IjIwMTAtMDgtMjNUMjE6MTQ6MjIrMDc6 MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgKDEyLjB4MjAx MDAxMTUgWzIwMTAwMTE1Lm0uOTk4IDIwMTAvMDEvMTU6MDI6MDA6MDAgY3V0b2ZmOyBtIGJy YW5jaF0pICBXaW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0 aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpFRDFDNzMwMkZBQUZERjEx QjU5N0Q1M0Y5RUY4RjFGOCIgc3RFdnQ6d2hlbj0iMjAxMC0wOC0yNVQxMDozNjo1NiswNzow MCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSAoMTIuMHgyMDEw MDExNSBbMjAxMDAxMTUubS45OTggMjAxMC8wMS8xNTowMjowMDowMCBjdXRvZmY7IG0gYnJh bmNoXSkgIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rp b249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkVFMUM3MzAyRkFBRkRGMTFC NTk3RDUzRjlFRjhGMUY4IiBzdEV2dDp3aGVuPSIyMDEwLTA4LTI1VDEwOjU3OjM4KzA3OjAw IiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1ICgxMi4weDIwMTAw MTE1IFsyMDEwMDExNS5tLjk5OCAyMDEwLzAxLzE1OjAyOjAwOjAwIGN1dG9mZjsgbSBicmFu Y2hdKSAgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlv bj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6RUYxQzczMDJGQUFGREYxMUI1 OTdENTNGOUVGOEYxRjgiIHN0RXZ0OndoZW49IjIwMTAtMDgtMjVUMTI6MTA6NDIrMDc6MDAi IHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgKDEyLjB4MjAxMDAx MTUgWzIwMTAwMTE1Lm0uOTk4IDIwMTAvMDEvMTU6MDI6MDA6MDAgY3V0b2ZmOyBtIGJyYW5j aF0pICBXaW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9u PSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpGMDFDNzMwMkZBQUZERjExQjU5 N0Q1M0Y5RUY4RjFGOCIgc3RFdnQ6d2hlbj0iMjAxMC0wOC0yNVQxMjoxNDozMiswNzowMCIg c3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSAoMTIuMHgyMDEwMDEx NSBbMjAxMDAxMTUubS45OTggMjAxMC8wMS8xNTowMjowMDowMCBjdXRvZmY7IG0gYnJhbmNo XSkgIFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249 InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjdEMjE3NEYzM0JCMERGMTE4Qjg1 ODNERTQ2NDMzMzkzIiBzdEV2dDp3aGVuPSIyMDEwLTA4LTI1VDE4OjI4OjU3KzA3OjAwIiBz dEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1ICgxMi4weDIwMTAwMTE1 IFsyMDEwMDExNS5tLjk5OCAyMDEwLzAxLzE1OjAyOjAwOjAwIGN1dG9mZjsgbSBicmFuY2hd KSAgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0i c2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6N0UyMTc0RjMzQkIwREYxMThCODU4 M0RFNDY0MzMzOTMiIHN0RXZ0OndoZW49IjIwMTAtMDgtMjVUMjA6Mjc6MzgrMDc6MDAiIHN0 RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgKDEyLjB4MjAxMDAxMTUg WzIwMTAwMTE1Lm0uOTk4IDIwMTAvMDEvMTU6MDI6MDA6MDAgY3V0b2ZmOyBtIGJyYW5jaF0p ICBXaW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJz YXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo3RjIxNzRGMzNCQjBERjExOEI4NTgz REU0NjQzMzM5MyIgc3RFdnQ6d2hlbj0iMjAxMC0wOC0yNVQyMDozODoxMyswNzowMCIgc3RF dnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSAoMTIuMHgyMDEwMDExNSBb MjAxMDAxMTUubS45OTggMjAxMC8wMS8xNTowMjowMDowMCBjdXRvZmY7IG0gYnJhbmNoXSkg IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNh dmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjgwMjE3NEYzM0JCMERGMTE4Qjg1ODNE RTQ2NDMzMzkzIiBzdEV2dDp3aGVuPSIyMDEwLTA4LTI1VDIwOjU3OjEzKzA3OjAwIiBzdEV2 dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1ICgxMi4weDIwMTAwMTE1IFsy MDEwMDExNS5tLjk5OCAyMDEwLzAxLzE1OjAyOjAwOjAwIGN1dG9mZjsgbSBicmFuY2hdKSAg V2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2 ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ODMyMTc0RjMzQkIwREYxMThCODU4M0RF NDY0MzMzOTMiIHN0RXZ0OndoZW49IjIwMTAtMDgtMjVUMjE6MDk6MTIrMDc6MDAiIHN0RXZ0 OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgKDEyLjB4MjAxMDAxMTUgWzIw MTAwMTE1Lm0uOTk4IDIwMTAvMDEvMTU6MDI6MDA6MDAgY3V0b2ZmOyBtIGJyYW5jaF0pICBX aW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZl ZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoxOUQ3NjIxRUMxQjBERjExOTA4NzhBODk5 N0JDMUI2NiIgc3RFdnQ6d2hlbj0iMjAxMC0wOC0yNlQxMDoyMjoxMiswNzowMCIgc3RFdnQ6 c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSAoMTIuMHgyMDEwMDExNSBbMjAx MDAxMTUubS45OTggMjAxMC8wMS8xNTowMjowMDowMCBjdXRvZmY7IG0gYnJhbmNoXSkgIFdp bmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVk IiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjcxMEIxOUEzMDNCMURGMTFCRDVCQjM4NTZD NkJFNURGIiBzdEV2dDp3aGVuPSIyMDEwLTA4LTI2VDE4OjE4OjIyKzA3OjAwIiBzdEV2dDpz b2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1ICgxMi4weDIwMTAwMTE1IFsyMDEw MDExNS5tLjk5OCAyMDEwLzAxLzE1OjAyOjAwOjAwIGN1dG9mZjsgbSBicmFuY2hdKSAgV2lu ZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQi IHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MDkyRjEyOTUwQ0IxREYxMThFN0Q4QUE3NUU0 RkQ4NjYiIHN0RXZ0OndoZW49IjIwMTAtMDgtMjZUMTk6MjI6MjQrMDc6MDAiIHN0RXZ0OnNv ZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgKDEyLjB4MjAxMDAxMTUgWzIwMTAw MTE1Lm0uOTk4IDIwMTAvMDEvMTU6MDI6MDA6MDAgY3V0b2ZmOyBtIGJyYW5jaF0pICBXaW5k b3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIg c3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowQTJGMTI5NTBDQjFERjExOEU3RDhBQTc1RTRG RDg2NiIgc3RFdnQ6d2hlbj0iMjAxMC0wOC0yNlQxOTozNTozMyswNzowMCIgc3RFdnQ6c29m dHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSAoMTIuMHgyMDEwMDExNSBbMjAxMDAx MTUubS45OTggMjAxMC8wMS8xNTowMjowMDowMCBjdXRvZmY7IG0gYnJhbmNoXSkgIFdpbmRv d3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBz dEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjBEMkYxMjk1MENCMURGMTE4RTdEOEFBNzVFNEZE ODY2IiBzdEV2dDp3aGVuPSIyMDEwLTA4LTI2VDE5OjM5OjExKzA3OjAwIiBzdEV2dDpzb2Z0 d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1ICgxMi4weDIwMTAwMTE1IFsyMDEwMDEx NS5tLjk5OCAyMDEwLzAxLzE1OjAyOjAwOjAwIGN1dG9mZjsgbSBicmFuY2hdKSAgV2luZG93 cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0 RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MEUyRjEyOTUwQ0IxREYxMThFN0Q4QUE3NUU0RkQ4 NjYiIHN0RXZ0OndoZW49IjIwMTAtMDgtMjZUMTk6Mzk6MjUrMDc6MDAiIHN0RXZ0OnNvZnR3 YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgKDEyLjB4MjAxMDAxMTUgWzIwMTAwMTE1 Lm0uOTk4IDIwMTAvMDEvMTU6MDI6MDA6MDAgY3V0b2ZmOyBtIGJyYW5jaF0pICBXaW5kb3dz IiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RF dnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowRjJGMTI5NTBDQjFERjExOEU3RDhBQTc1RTRGRDg2 NiIgc3RFdnQ6d2hlbj0iMjAxMC0wOC0yNlQxOTozOToyNSswNzowMCIgc3RFdnQ6c29mdHdh cmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSAoMTIuMHgyMDEwMDExNSBbMjAxMDAxMTUu bS45OTggMjAxMC8wMS8xNTowMjowMDowMCBjdXRvZmY7IG0gYnJhbmNoXSkgIFdpbmRvd3Mi IHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2 dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjEwMkYxMjk1MENCMURGMTE4RTdEOEFBNzVFNEZEODY2 IiBzdEV2dDp3aGVuPSIyMDEwLTA4LTI2VDE5OjQxOjA5KzA3OjAwIiBzdEV2dDpzb2Z0d2Fy ZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1ICgxMi4weDIwMTAwMTE1IFsyMDEwMDExNS5t Ljk5OCAyMDEwLzAxLzE1OjAyOjAwOjAwIGN1dG9mZjsgbSBicmFuY2hdKSAgV2luZG93cyIg c3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0 Omluc3RhbmNlSUQ9InhtcC5paWQ6NDQxNTY5RUIwRkIxREYxMThFN0Q4QUE3NUU0RkQ4NjYi IHN0RXZ0OndoZW49IjIwMTAtMDgtMjZUMTk6NDY6MTcrMDc6MDAiIHN0RXZ0OnNvZnR3YXJl QWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgKDEyLjB4MjAxMDAxMTUgWzIwMTAwMTE1Lm0u OTk4IDIwMTAvMDEvMTU6MDI6MDA6MDAgY3V0b2ZmOyBtIGJyYW5jaF0pICBXaW5kb3dzIiBz dEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6 aW5zdGFuY2VJRD0ieG1wLmlpZDo0NzE1NjlFQjBGQjFERjExOEU3RDhBQTc1RTRGRDg2NiIg c3RFdnQ6d2hlbj0iMjAxMC0wOC0yNlQxOTo1MjoyMyswNzowMCIgc3RFdnQ6c29mdHdhcmVB Z2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSAoMTIuMHgyMDEwMDExNSBbMjAxMDAxMTUubS45 OTggMjAxMC8wMS8xNTowMjowMDowMCBjdXRvZmY7IG0gYnJhbmNoXSkgIFdpbmRvd3MiIHN0 RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDpp bnN0YW5jZUlEPSJ4bXAuaWlkOjRBMTU2OUVCMEZCMURGMTE4RTdEOEFBNzVFNEZEODY2IiBz dEV2dDp3aGVuPSIyMDEwLTA4LTI2VDIwOjA1OjM5KzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFn ZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1ICgxMi4weDIwMTAwMTE1IFsyMDEwMDExNS5tLjk5 OCAyMDEwLzAxLzE1OjAyOjAwOjAwIGN1dG9mZjsgbSBicmFuY2hdKSAgV2luZG93cyIgc3RF dnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omlu c3RhbmNlSUQ9InhtcC5paWQ6MEU2RkJCREY3MkI1REYxMThFRURDQjEzNTBCRjlDNzEiIHN0 RXZ0OndoZW49IjIwMTAtMDktMDFUMTA6MTQ6MjQrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdl bnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgKDEyLjB4MjAxMDAxMTUgWzIwMTAwMTE1Lm0uOTk4 IDIwMTAvMDEvMTU6MDI6MDA6MDAgY3V0b2ZmOyBtIGJyYW5jaF0pICBXaW5kb3dzIiBzdEV2 dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5z dGFuY2VJRD0ieG1wLmlpZDo2N0JDRkQzRDEzQkNERjExODU4QkE3RUIxNURDQTBCOSIgc3RF dnQ6d2hlbj0iMjAxMC0wOS0wOVQyMDoxMDo0MyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2Vu dD0iQWRvYmUgUGhvdG9zaG9wIENTNSAoMTIuMHgyMDEwMDExNSBbMjAxMDAxMTUubS45OTgg MjAxMC8wMS8xNTowMjowMDowMCBjdXRvZmY7IG0gYnJhbmNoXSkgIFdpbmRvd3MiIHN0RXZ0 OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0 YW5jZUlEPSJ4bXAuaWlkOjY4QkNGRDNEMTNCQ0RGMTE4NThCQTdFQjE1RENBMEI5IiBzdEV2 dDp3aGVuPSIyMDEwLTA5LTA5VDIwOjExOjAzKzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50 PSJBZG9iZSBQaG90b3Nob3AgQ1M1ICgxMi4weDIwMTAwMTE1IFsyMDEwMDExNS5tLjk5OCAy MDEwLzAxLzE1OjAyOjAwOjAwIGN1dG9mZjsgbSBicmFuY2hdKSAgV2luZG93cyIgc3RFdnQ6 Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpw YXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1h Z2UvanBlZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iZGVyaXZlZCIgc3RFdnQ6cGFyYW1l dGVycz0iY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0 byBpbWFnZS9qcGVnIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5z dGFuY2VJRD0ieG1wLmlpZDo2OUJDRkQzRDEzQkNERjExODU4QkE3RUIxNURDQTBCOSIgc3RF dnQ6d2hlbj0iMjAxMC0wOS0wOVQyMDoxMTowMyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2Vu dD0iQWRvYmUgUGhvdG9zaG9wIENTNSAoMTIuMHgyMDEwMDExNSBbMjAxMDAxMTUubS45OTgg MjAxMC8wMS8xNTowMjowMDowMCBjdXRvZmY7IG0gYnJhbmNoXSkgIFdpbmRvd3MiIHN0RXZ0 OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJp dmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjY4QkNGRDNEMTNCQ0RGMTE4NThC QTdFQjE1RENBMEI5IiBzdFJlZjpkb2N1bWVudElEPSJ1dWlkOkFCQjRFMjEyOUY1RURGMTE4 NEIwODJENDAwQ0E0QTM1IiBzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6RDVD QzRCNUM1RTVFREYxMTk4OUVDMDUzNEFDQ0JGOUIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwv cmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/uAA5BZG9iZQBkQAAAAAH/ 2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAQEBAQEBAgICAgICAgICAgICAgID AwMDAwMDAwMDAwMDAwMBAQEBAQEBAgEBAgMCAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA//AABEIBasEQAMBEQACEQEDEQH/3QAEAIj/xAGi AAAABgIDAQAAAAAAAAAAAAAHCAYFBAkDCgIBAAsBAAAGAwEBAQAAAAAAAAAAAAYFBAMHAggB CQAKCxAAAgEDBAEDAwIDAwMCBgl1AQIDBBEFEgYhBxMiAAgxFEEyIxUJUUIWYSQzF1JxgRhi kSVDobHwJjRyChnB0TUn4VM2gvGSokRUc0VGN0djKFVWVxqywtLi8mSDdJOEZaOzw9PjKThm 83UqOTpISUpYWVpnaGlqdnd4eXqFhoeIiYqUlZaXmJmapKWmp6ipqrS1tre4ubrExcbHyMnK 1NXW19jZ2uTl5ufo6er09fb3+Pn6EQACAQMCBAQDBQQEBAYGBW0BAgMRBCESBTEGACITQVEH MmEUcQhCgSORFVKhYhYzCbEkwdFDcvAX4YI0JZJTGGNE8aKyJjUZVDZFZCcKc4OTRnTC0uLy VWV1VjeEhaOzw9Pj8ykalKS0xNTk9JWltcXV5fUoR1dmOHaGlqa2xtbm9md3h5ent8fX5/dI WGh4iJiouMjY6Pg5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6vr/2gAMAwEAAhEDEQA/AN1i CeSnkEkZIP5H0DD+h9kCsVOpTQ9PEV6VdNUx1UYdD6hYOv5Bt7MIpBKtfPz6aZaHrOefbnVO sXvXTnXvfuvdS4J9I8bn0/2T/qf8P9b28hPA9VYdTfd+qde9+691737r3XhwQf6cj/Ye/de6 zzi5WQfR1H+3H19+HWz1g9+611yHII/pz/xX37r3l1x9+691737r3Xvfuvdcm+t/6gH37rfX H37rXXvfuvdZ09UMi/6mzj/iffvPrfHrB7917ru3v3Xqddjgg/4+/dbp161jb+l/fuvDr3vX W+ve/de6lobop/wt/tuPe+qHj1z9+691737r3XIfRh/gD/tj791rrj791vr3v3XuvA2IP9Df 37r3XbcMf9c/7b8e/da669+6310fof8AW9+691g9+691737r3Xvfuvdch+lv8CD/AMR7917r JJzHE3+BB/2HA/3r37r3WH37r3Xa/qH+vb/b8e/da669+631737r3XvfuvdY3/Hv3Xusfv3X uve/de65H6L/ALEf7z7916vXH37r3Xvfuvceux78erL13711br3v3XuuS/2v+Cn/AHjn37rR 64+/db697917rsfUf649+60evNwxH9Cf979+68OHWZ/8zEf8WH+8+/daHHrB791bro+99VPH rr37qvXvfuvdcj+lf9j/AL37917rj7917r3v3XuuQ/S3+w/3v37r3XH37r3XvfuvdZof1H/g v/E+9Nw691IsPdet166t/vre/V69XrtR6h/rj+v9fewet166t9T/AF+nv1evV660+/V69Xrl pHvVetVPXjf8e/Y69jrxFxz78OvDrnMPUo/ARR/vfvfWx1jINlt/qf8Ae2PvfXq9cbH37rde vW9+69XrDJ9W/wCQB/vF/ex1U+vWL37rXXvfuvde9+691mgF5U/wuf8Ak0+/Hh17rExuxP8A Uk/7z7917rw5IH+I9+6910eSf9c+/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3XuuS/W/8AQE/8R7917rj7917r3v3Xuve/de697917r3v3Xuve/de67P0H+xP/ABHv3Xuu vfuvdZ5vSsSf6lLn/XPv3W+sK/W/9AT791rrr37r3XvfuvcOve/de697917rKg4/1/fuvdc/ fuvde/B/xIH+wHPv3XuuvfuvddWHv3W6nr2ke/de1HriRc8D/W9+z1Yddf6/+3966916x97p 16vXI8KB/qjqP+t9B7117z64e/db697917rtRcgf1P8AyP37rR4deY3JP+2/1vx7914cOuvf ut9SIvSkkn5A0r/rn+nv3VTxp1H9+6t1GkqUXhfUf8Pp/t/dSwHWiK9Q3md/qbD+g4Huhcnh 16gHWL3Xj1vr3vx691//0N06GUTLccMB6gPrx+fYajcOOlHUunqHppBIh/pqH4I9vKxRtS9V Ir0ropknjEkZuCBcfkH+nsyR1kXUvTJFOvMOf9f3eletg46692pTr3Xvej69e6mU830jb/kE /wDEH3dWrg9VYefUv3fqvXvfuvde9+691nHrgYfmNtQ/1j9ffvPrfWD37rXXYNiP999ePfuv ddHj/b+/de697917r3v3XuuX1Uf4G3+wPv3Xuure/dbp16w9+63QdZoTZwPwwKn/AGPvXXjw 6xkWJX+hI/2x9+62OHXXv3Xuve/de67P4P8AUf7z9D7914dde/db697917qRCfSR/Q/7wfex 1Rus3v3Wuve/de65L+oD+tx/txb349aPXH37rfXvfuvde9+691yb+yf6qP8Abjj34da64+/d b697917qOeDb+nv3Xuve/de697917rkv9of1U/7xz78evdZPrAf6q/8AvB/5H7159e6w+99e 68ODf37r3Xbfqb/XP+88+/da669+6313791ugPWOQcD/AF/futZ6xe/de697917rv+yP8GP+ 9e/de669+691737r3XY9+62OPXfvVOrde9+631yT6kf1Vh/yb791o9cffut9e9+69176e/da 65N+tv8AXPvfXhw6zMLwR2/DsP8Aez718utefWG1vr/tv+N+99brXh1wP4/1v+J9+6qePXXv 3Wuve/de65H9K/7H/e/fuvdcffuvde9+691yH6W/2H+9+/de64+/de697917rND+o/8ABf8A ifejw691J9069173vr3Xa/Uf6497FOvddD6e/U8+vde9669173rr3Xvfuvdde9jj1vrLL/nD /gAP94v791rrgfx/wUf7yL+99e6696p17r3v3Xuokh5b/g3+9C3u4691j9+691737r3Xvfuv dZ4P1MfwsbE+9HreOsHvfWuu1+v+tc/7Ye/de669+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvdch9G/2A/wB5v791vrj791rr3v3Xuve/de697917r3v3Xuve/de67b62 /oAP9t7917rtBqdR/Vh/xv37r3XOY3kb/A2/2wt78OvHrh9FP+JA/wCJ9+691x9+691737r3 Xvfuvde9+691nAsLe/de679+6912fwP6D/e+ffuvdde/de697917r3v3Xuve/de66sP9b/W9 769Xrqx+g/PH+39+63XrtgCf9bgf6w49668DTrhpPv1Ot1HXH3rq3XNeAzf4aR/rn37rR406 4e/db697917rlUzJBGkd7vbUVHPP+P8AT3osB1UZNemmSZ5PqbL/AKkfT/Y+2y5PDq/WH3Tr XXvfuvddEhQWYgKOSTwBx73UKNR8uvDPTJV5hUJSnAc8gv8AgH6ce0j3HknTgSuT1//R3OI5 GjYMv+xH9fYNRyjV6VU6eUYSIJFPBNiPyD/re16sGFR1Xpxx9WaaUKxPif0sLXsT9CPb8Uhj evkePVGFelO3IuOR9Qf6j2ZD1HTQweuHu3W+ve/de66+liPr7rw6905QyeRef1LYH/H/AB9v KajqhFD1m97611737r3WaA2fSfo4Kn/Y/T3o8Ot9YiCpIP4JH+29761117917rkebH+o/wB5 HB9+6359dW9+69Tr3v3W6dch+R/Uf7yOR7114inDrr37rfXvfuvddg2II/Bv/tvfut9ZZx69 Q+jqGH+259+6qPTrD791br3v3XuuX1X/AFj/ALwffutefXH37rfXvfuvdZYjZrf1H+8j34dV bh1J976r1737r3Xvp7917rk/6j/r3/2/Pvw60OuI+o9+6912fqffhw68OHXZ5Qf4MR/txf37 z691x9+631737r3WFhZj/t/fuvdcffuvde9+691yX9S/7b/b8e/dePWWPmOZf9pB/wBip96P Hr3WD3vr1OvW9+63Trm3JB/qqn/eLH37rwFeuNvfut069b3rr1PXrjJ+n/Wt79148OsHvfVe ve/de67H6T/gR7917rr37r3n1737r3XY+o/x49+62OsgHB/r791snPXWk/77/effqder1zUW Yf4m3+3B9+69WvXAKffuvE9d6f8AH37rWrrsrx/sP+I9+69XPXbLdm/1/wDewD78OvVp1k/3 SP8ACQ/70ffuvHrHb/fc+99a6xuOR/rf8T711viOuNvfuvU69b37r1D12fov/IX+9+/dapnr q3v3W6det7916nXY+jf8g/737914jPXVvfuvU69b37r1Os0P1b/WH+9+/cR1o46ke9U69173 6nXuuS/Ue9EU691x97Ir17r3vVOvde9+09e6979p6912ByP9cf7379Tr3XKX/ON/sP8AoUe9 U691xP1/2A/3r3s54de669+Pl17r3vVOvdQ3+v8AgWc/7z7v1uvXD37rXXvfuvde9+691mi4 SY/7QBf/AINf349b4dYffutddr+f+Cn/AHnj37r3XXv3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917rl/ZH+JJ/23Hv3XuuPv3XuPXvfuvde9+691737r3XvfuvddryR/r+ /de68Te/v3XussA9eo/RFZvfj1vrCTckn88/7f37rXXI8BR/hf8A2/v3XuuPv3Xuve/de697 917rtR6h7917rP7917rsC5A/qffuvdeJuSf8ffuvdde/de697917r3v3Xuve/de697917rsf W/8AQE/7H6D37r3XXv3Xuve/de64Fffutg9dsLKo/wCQj/sfp791scesZ4FybD+p+n+39663 1EaoLOEj+l+W/Jtybe6M3kOtnh1DkYu7MTe5+vts9eHDrh711vr3v3Wuo1TVRUyFpDzbhR9W 90eRYxnrYFekvWV81TxcpH9dAP1v9L29ondpDU8OngoUdNrMqC7Gw/x/Ptssqip631//0tzY i3/EewYRQ9Khw6kU0xjaxJ0NwR/S/wCfbsL6TQ8OtHp0/wB8P8R7W9VpXpR4qq8kZp3PqQek m/K/6/tbbSf6Gfy6bYdOR449rOq9de/de6970evdco3KOGH+x/1vyPelND1rj06AhgCOQRf2 /wBU679+6912Lggj6jn/AG3v3WwOs0wBYOPo6g/7H8+9Dh17rD791brl+P8AWN/9vwffutU6 70sfx/xHv3W+u9B/w9+6912E+hv/ALx7917rxjsfqP8AjR59+68OutB/wPv3W+uJBH1Hv3Xu szeqFG/KEqf9Y/T/AIj37qvA9YPfurde9+691yXm4/qD/txz791o9cffut9e9+691yQ2ZT/j /vB4Pv3Wjw6me99U697917r3v3XuuTfRT/hb/bH37rXXEfUf649+PDr3XbfU+/Dh14dcl5Vx /Szf7Y2Pv3n17rh791vr3v3Wuscg5H+I/wCJ9+62M9cLe/dbp163v3W6dd/4/wBPeutnrPF/ nWX8MGH+3Gr349V8usH/ABHv3Vhw697917rkf0of8CP9sb/8T791ocadcffurde9+691049H +wP/ABX34ceqnz6je99V697917rsfRv9Yf73791vrr37rXXvfuvddr9R/rj37r3Wf37r3Xvf uvdeH1H+uP8Ae/fuvde9+691737r3Xvfuvddn6/64U/8mj37r1a9cx/mm/wk/wCiR7917rH7 917rG31/2Hvx6svXH3rrfXvfut9d24H+u3/Ee/da8+uvfuvde9+6312Po3+w/wB79+6qePXX v3W+ve/db6zQ/U/63/E+9jqjdSPfutde9+6912Pr/sD/ANC+/da669+631737r3Xvfuvde9+ 6912v6l/4MP979+PDr3Xb/rb/XP+8ce9Dh17rpv1H/XP+8ce9jr3XXv3Xuve/de6gt+P9Yn/ AG5Pv3WzTrj791rr3v3Xuve/de6zrxBJ/i6j/bWPHvXn17rB7317rsfpb/YD/iffuvdde/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuuz+B/gP9559+69117917r3v3Xu ve/de697917r3v3XuuQ/J/oP9749+62OuPv3Wus6emGVv6kIP+J9+631g9+611231P8Atv8A bce/de669+691737r3XvfuvdZEH1P+w9+691k9+691yX8n+g4/1zx7917rj7917r3v3Xuve/ de697917r3v3Xuve/de67+i/65/3ge/de669+691737r3XrXsP6m3/FffuvddO6qCzGwH+9f ge/de6aZ5zLwOEB+n9f6X90Y16uBTrGnCs3/ACCP9j9fbfn148adY/eiOrdde/de6gVtfHSL a4aVgdK/W3+J9syShMDj1tVr0k5ZpKmQvIxYk/S/Cj+g9ojUmrdOgAcOos86xf4sfoo/A/F/ bckoQfPq1K9NTyNIbsf9Yfgf63tEzFjUnq3l1//T3NhyLf7b/insGjIp0p4Z66916306Usut NJ/Uv+8j2thfUtD5dV6nQytDIsq3up5/xH5Ht8EqajrRFelerrLGkqm4kUH/AFj9PZsja1DD z6Z+XXvduvde9+PXuuvdOvdTaV7gxn8cj/W/I9uI2KdaI6me79ep5dd+/de6zAa4bDlo2v8A 8gn6+/daOD1xWP8Ar/th731bqQkRv9LX4Nhc8/19+60esog/r/tv+Re/de6yCnH+pP8Asbf8 T79Q9e65+Af6kD/Y/wDFPfs9e67MAIHC/wBP9t79nr3XDwD6Arf/AGB9+z17riYCPwp/1h79 17rkkIZXQgXIuP8AXH+v79nrx9eoxgI+gU/7D36p631w8X+C+9VPXuuxHYg2Xg/0/H59+qet deMViRZeD73U9eHXXi/wX3qp6317xf4L79U9e6mBLgHSOQD+Pe+m+u/Gf9SP949+6917xn/U j/ePfuvdcvHdP0i4b/D6Ee/efWuuhEbj0fkfge/Hr1euzFyfT/vHvQOOvE565LEL/p+oI/24 /wAPfs9aBPXXiH+o/wB49+z17PXvH/tPvXWs9Y5IuAdP0P5/4372Orpx6xeP/aR/vHvfV+ve P/aR/vHvXW+uzFb+yPpf8e/da6yKlpIzp+un+n/BT791r164vFZ2AUfqP9Pzz791scOuHj/2 kf7x791vrl4/R+kcN/h+R791rz668R/1I/3j37r1eveI/wCpH+8e/der12YiV/SPz/T+h968 +tefUTx/8F93z1WvXvH/AMF9+69XrkI/r+n6H3rrfHrj4/8AgvveetV694z/ALT7916p678Z /wBp96r1vrN4/wDAf7x731rr3j/wH+8e/de67EdjfSP949+6914x8n0j6n+n9ffuvddeP/Af 7x7917r3j/wH+8e/de65NGeOB9B/T+lveuvdcxH+0/pH1B/3ke/de6xeP/Af7x7317ri0X04 X3o9WXrh4v8ABfeqnq3XvF/gvv1T17rl4vSOF/U3+9D37PWvPrj4v8F9+qet9e8X+C+/VPXu uQj4PC/j3vrXXHxf4L71U9b694v8F9+qevdZoY/1cA/T+n/E+/efVW6z+M/6kf7x731Xr3jP +pH+8e/de67WPn9I+jf0/wBSffutddeM/wCpH+8e/db694z/AKkf7x7917r3jP8AqR/vHv3X uveM/wCpH+8e/de65JH6luo+v+H/ABHvx4de680d2PpHLH+n9ffvLr3XRjNz6R9T/T+vv3Xu uvGf9SP949+6910YzY+kfQ/09+691DMf04X6D36vW+HXHxn/AGn3uvWs9e8Z/wBp9+r17PXv H/wX37r1esxjtAvA5cm/44BHvXn1vrD4z/tPvdetZ65eP0/Qcn6/6w96r1vNOuPjP+0+99eq eveP/gvv3WuveP8A4L79Xr3XvH/wX3qvW+veP/W97qevdd+P/gvvWevV668Z/wBp9761nr3j P+0+/deqeu/Ef8PeqnrfXmjNzwv/ACLj3vrXXXjP+0+/dbqeveP/AFves9er17x/8F9+r17r 3jP+0+99er17xn/affutVPXLx+n+zyf9696631x8f/BffuvV6zNGRFGth6iWN/8AePfvPr3W NY+f7Nhz/tvfuvZ64+P/AIL7316vXvGf9p9+61U9e8f+t79Xr3XvH/wX37PW+syxGw4HPP49 +69Trvx/7SP949+611y8dlHpHJJ/H0HHvXn17rj4/wDAf7x7317r3i/2kf7x791unXvH/gP9 49+6117x/wCA/wB49+69114/9pH+8e/de64lB/Qj/b+/de66dObA/Tj/AIr7117rGQR9ffuv dde/de66LBFZ2Ngo/wB749+6900TzmVv6IPoP+JPuhNergU6we69b6yPwqr/AIaj/rn3odaH r1j976303V9ctIlls0rcKv8AT/ajb2lll0YHHqyjUeki7vK5dyWdj9f+I9o/Op6e4dRZqgRK wWxcjT/XT+SfbUkunA49bA8+mtmLEkm5PtESSanq3UqCm1kPJwn1Cj6t/h/gPb8cOrubh1on 06//1NzX2C+HSrrs/wBf6/73723r1oenWSGQxSK/1API/qPdo20tXr1Ono6bAryDyD/gfp7X g16qOnzEz6kenN/T60/P+uB7WWr0Phnz6ow8+nb2u6p1737r3XXup691zRijBh+D/tx+R70p oet9OwIIBH0IuPb/AFrrmqk/63v3XuptOnq0kWV1Km/+8H3vrR4dZ0htcW+nH+H+39+691JW L/D/AG/A/wBt7317qSsBP44/23+39+691mWlP9P94JHv1OvdZPtP8P8Aeve/s69139rwRYfg /j/iPeuvdcDS34K/7x/xr341HXusbUpH0uB/T6e/Vr17riKcgg8/7b8f0+nv1a4691iaAhiN I+v9D71Ujrw6xNT/AJ0/6/8AxX6e91r17rh4R/qT/tv+Ne9V691yMINjpPI/oPxx739nXuuP hH+pP+296z17r3hH+pP+29+z17rMsZ02A+nHPH+PveOtGgPXLxH+n+9e/V61XrvxH+n/AEL7 91qvXYjY34/H+H45966917xt/T/oX37HXsde8bf0/wB69+x16ny6942/31vfsde67MbXP/Gv fsdeoOuvG3++t79jr1B100bWNxf/AG3v2OtjB6x+P/aR/vHvdB1br3iP+pH+2Hv1B17rvxH/ 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 9C3/ACgekdzZLuX+ZD8t8x3v2r2RRbu+XXcnxvxVFvCq2tV4vs3anQ2Qw+J2B3Ln5sTj6ads tS0xyGGx6RSRU8VLLUKadnZJvZHzE6fTQ2yoBRQ2K41VqB8jxPzp05FxLdXX4zDmfJeuO41j 639guKKr56V1x1Q/01s75c/zHPi/2f8AzEKP+Yhvj4ZYDcW8OxD8OtgYTM7P2B8eti9d9cdh 1GwMPlvkrV5OhrazN1GXyGMqo65qmZBA7eSKOalmjx8Q9FvZWMq2PgLIQBrJBLEkVOn0Arj/ AD56Rlmca609Ohe69258rf5kvbfyqw2a+cm9/il0h8IZdsfH6HcvxkTau05+2fknt7rWmz/d ncm99yZ6GScbTo8rMr4zDwyU1PU454ystFPFUTz3+ns7ONKQiRpKt3ZotcAfOnn6+vXqsx40 p0VTZvyw+bXyg+E/8mjr7a/feS6o+S/zI+TvbGF3N3zt3b+CfN7p6I+NWQ3JiN17vqtnZWnW iqDLjf4fX1FFWUka11VSQyyeKGpYM6bCxhubhzGGRFFFPAFqYr/qp1rWxVc5PQ89U5X5tdNd p/zqvj/0L8ge0vlvkvi10p0DlOg8n8i8ps3eW98L393L1xU7slxWEy88GIxlYYolnkp8O1M1 IaqCipngaaSeOsq9rYzJbySRrHrLV0igIBp8/wBvHrWpgSAa9Bf/ACye6ewNx/Nfp3rXtb5X /PfYXaGQ6d3/AJz5K/Eb+Yr1NBiaPsPduF2tLkZt2/FvcWBo6Gh29gsTXibIPHlY4qiWipXh QTJIWp939hbG1YpFHSo0tGeAr+L1JGPt68jHVxP59ZV+X/yHp/5E3dPzWh7K3JU92fIXv3e+ K+L+Qq6iios9trA72+TcPUWytp7TSYAxrjcZQZatoo6vU2hGZ2eIhiz+7LT97JDoGlFGoeRo tST9pI6t4jeHXobO8sZW5n+Zd3/X5XsjcG2of5fn8lDdtdmO4trVmMh3vtfu7sLJ1O4q7fON qcrSzUkVXNtqhqamNpKBlV/W6MriNX7aKJLJUCiksvDyIGKft6qxOr7B0TnoKDdHxB/lZ/CP ZVB80e+tj9t/PXdB77rOqumejR8g/k1l+ssvTVe8d77c+K+3ts0LrharLU9djslXbg3D5zFU SN9tLGsckHtXNBDc3bu8asIxSpNFrwGr1pwp1oMVWlePS3+H/wAre49j0H86TcFV2h81M50t 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 5/c+Yw2Ohodp907Co8hSbfftPEUGPUQ4jKU9VW0FNuXDaIqZamqgq8X/AJLUS0GKPopvGt9R pqA7h6E/8V1iXzvybPyreLKgJtZywiLGrdukkHAB+IUNPkeFTaN8kvmN8XfiBtn+9nyU7w2F 1NjpKYVeOx24Msand+4af+IwYqWTaOwcKlVncz4ZqmIVAxWOqDChMsoSJHdWljd8qKj18v29 BK1sry+fw7SJpG/ogn9vkPz6rN61/wCFDf8ALl7T7O231XtvMd5tmd3ZtNubbyEXRe8tyU2b ztWDFiMTiNu7EXL7hq6mvn8VLSwUmEkk8ssflWNCzrVSjMUVgSPKv+cdCi75B5nsdubdbq30 RKKmpoaeZzigGTnq7rFZGnzGLx2XpI6+GlylBR5CliyuKymDycVPXU61MMeRwmbhp62jnVWA mpaunimie8csaSKyjxFCQf8AP0DPs6nWvwPqePevLrxp1zltcIPogt/sfz70OFT1UZ6kUZ9T r/Vb/wC29qrc5I6q3U/2r61173rr3X//1dyj2DulnTljpdMjRH6OLj/gw/HurDz60eHT7Ghk dEAuWYAAfXk+/KNTAdU6xVkYJkAsfGxII/2ng/X358OQOvDh1BgAMsY/2of8V497jFXHVT69 PXtX17p2w63qif6Rtb/Yj2otcy9VbHSlt7MT0xTrv37rdOve9db66IuLf197HHrVK9O8QtGg /wBpX/er+3hw611k92691xLkfUfX6/64492HXuuw4/qR/vHvfXusglb8Nf8A2P8AxT3vr3XP yt+effq9er1yaT0q1h+VIv8A7b3qp63U9Y/KPz/vfvfWvt68Z1t9Cbcf7fkfX37r3WIzE/i3 v2OvY64+T/D37r3XLXdTx9CD9f68H/iPeuvY64+Qf09769jr3kH9PfuvY6yrJeN1t9PUOf8A b+6+fXusXkH9PduvY695B/T37r2OuWsFDx9Df/YHj3rz6159cfIP6e99bx17yD+nv3XsdS4p boOPpcfX/Y+9de6y+T/D/effuvde8n+H+8+/de678nA4/JH1/wBj7959a68H4PH9Pz79148e uvJ/h/vPv3W+uy/pBt+SP+J/4n37rXXXk/w/3n37rfXFnup4/wB5/pz7917rD5P8P959+691 7yf4f7z7917r2v8Aw/3n37rXWVZP3CLfqB/5OGr3o8OvDrFr/wAP95976317yf4f7z7917rt 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 YASCgdh266EVU/Ig4wevqVfy3d1bt3z8Oemt67j7hy3euE3btfEbh647D3jhP4P2tUdfZTCU lTjdsd01EEj0uU3VgK05DB5HOUkcQySUkFbUI9bNVTSnE/hBwIgRjNaHOcinqKGh4Go9OsK9 1hmt9znguESORHZWWMERggkHQCzEL5gajQYFBgHsjAuWIuEBP+x/Htjyp0XN6dYzyb/m9/fu t06n4xPLVaLfVHt9fqF/w9qLcVeny6bc4r1MIsSP6cH/AGHtZ1Xrr3vr3X//1tyj2D+lnXJG KOrr9VII/wBh70aHr3S+wkYqHeq/3XT00k5P4DBPSLj8g+3rSPU5c8FB6ZfGOmwm5JP5JP8A t/aU5NT1bqLBHpqQLekEkf6349uRfH16gPHp1t7U9eA6eMMLzyNbgR2/3n2rsx316o9KdKL2 vPHpnr3vXXuve/de67H1HuwHXvPp506QoH00i3+29vUoOq9e97oevdcGH/FR/sOD7tSnXusf vfXuve/de697917rInqV0/qNQ/1x70eNevdY/e+vddj8j+o/3kcj37r3XXv3Xuve/de67X62 /rx/t/futdde/db697917rJEbOB+CCD/ALH3o8OvdcCLEj+hI/23vfXuuvfuvdc1+hH9bj/Y 2uPejx6159cPe+t9e9+691IgP6h/rH/iD791rqR791vr3v3XuuQ/Sw/1j/tjb/iffvPrXn10 Pof9b3o9aPEdde99W65D9Lf4EH/iD7959a8+uPv3W+vf4f7D37rXUf37rfXvfuvddr9f9h70 eqnh1zB9UZ/1h/tjb37y62OuLizMP8T72OHW+uPv3XuuTfW/9Qp/3jn34da64+/db697917p tqBaZ/8AHSf9uo9+691h9+6912v1/wBgf969+62PTrr37rXXvfuvdSqU+ph/Vb/7Y/8AG/ej w691N9169173rr3XZ+g/2I92PHr3XXvVD17r3v1D17rs/j/WH+9W9+pXr3XO37X/AE8/6J9+ p5de6x+96T17rGV5P+v/AMT73XqteuyOAPeq569XFevAW1f8Fb/eve69erXrrSPfqnrVT17S Pfqnr1T12Bww/wCC/wC9n36vW69daR71U9aqevaR/T36p69U9S4vov8Are/efW/LrN791Xr3 v3Xuve/de697917r3v3Xuve/de68fz/wVvfvLqy9YB+T/h/vbD37rXl11791rr3v3XuoM3Lv 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 3H+seR791rrr37rfXvfuvdcm+t/6gH/b+/da64+/db68DYg/0N/fuvdZJR6rj6MAffh17rH7 917rmAQAfyGv/sPeq561jj1xYWYj/Hj/AFvx7317rr37rfWSE2kH+Nx/t/fj1rqZ791vr3v3 XuuS/W39QR/txx78etHrwBsf8feietE566sfe69br1yUfUf1BH+2Fx71XrVevaR/r+/VPWqn ru3vXXq9RXFmb/X/AN75926sOHXH37rfXJR70eqnrs3Cj/Bj/vPI9+6313KPVf8AqAf94t78 OHW+uFj73XrVR1yIuF/1iP8AbH3rr3XWn36vWq9d6ffq9er021YtKD+Ci/7cEj3sdWHDqN79 17rtf1D/AF/fuvdde/de697917qRTf5z/XUj/eQffuvdOHv1B17r3v1Ovdd/2R/rn/eh7959 a669+631737r3XZ/s/63/RRHvXn17rkP82f8HB/24t79+Lr3XD3vr3XEj3Xz6rTr1vp795db p12Pz/wVv+hffh17rq3vXWqdet791unXYHDf66/8T791rrq3v3Xqdet791unUiPgLf3by615 dZveuq9e9+691737r3Xvfuvde9+691737r3Xj9G/4KffurDrCPo3+wHv3WuuPv3Wuve/de6g S/rf/lo3/JoA92HTny6xe/de697917r3v3XusknAjH9EF/8AXP19+691jAuQP68f7f37r3XM cuT/AK596PDr3WT3Tr3Xvfuvdde99b69b37j16vXiPez16vXBxZWP+02/wBvx78M9er1Et7t 16nXf9n/AFz/AL0Pfutdde/de697917r3v3Xuve/de697917rtvwP6Af7zz7917rnELyIP8A G5/1hz78eHXuuLnUzH+pJ/3n37r3XTfUD+gA/wBj7917rr37r3Xvfuvde9+6908xpojRf6KA f9f8+6nj1QnPXOwNh/Uge/Drw66YXJI/339Pe69br1xsfe69bqOuvfuvdcgDY+9Vz1queuPv fVuu1FyB/U/7x+ffutdeY3JP9T7917rr37rfRPu29g9qbU7BzXa3U+0MR2tt3e2AwmI7U6bq 87i9rbnyWa25M2OwHYHWmc3Fow02QbG1LY7OYXP1dJR11JRUDQ1tJUUzrWFe5bf9bpZTTTXz 9afL5dG+17itixLV8qeYpmoOQfsIyD8qglX7M2/2vjcvs/5LYr4zU3TGG+NlVkc7vmjyEfVW c7q7R6o3DjpNrdo7W2vi+msrksbDicDh6qfeVNBUZWrrspX4aixVLhopqo1vssj2WVUcSnUp GUOVb7aZxmn28OjGTeYZLqOQLWh864PkeNa1/wBnoHt7fBXo35C9jYbtntHY9B27kNw4/ZuV k37tnfu6NobN7T25W1LvhsjkdvbZmamyFJSYOeghx1ZctW0rqJZZ1QOx3sXujz3yrYtsOzbj LHZqaiFghRTRgCnZqWgY5Dela06pzF7K+z/Pu4Q84cw7VFcbkgZWmDOpkUlDolCOFdQ0YoCA Qa5yerRcfR0WLxuNx+Po6PG46hoKDG47H0sQx1FQUdBTpR0ONp6KNAkMcNPGsUTEXIVQxsq+ 48iWjBD3FizMx+JmY6iWPCpJ8gOhOsa2xMFuD4aKAiClFCinb58KDJIAAAp0V7cPzh+LmyN4 bm2Pv7tRet927LylRj8pTb72hu/bNGs9IqzSS4fcddQtja6JonQn7asYlZFvGSye9u0XiFFl VNP8Xn9mR0dpsm/m0i3RLC5eCXVoMURlrppWumlKVFPXPoegbxv8xP48ZXd21+uugtodk9v1 W796YLADPbO67zGwerMJLurcEGMqMzVb07Lgw614j80lT9vhaStkkSKQ3QBDJ5Gh8QI0qvq/ g8vtqT/qr0tHKfNZsZ9/uLGdLOHTraSJomGrVSmqoauk14UxxrixMkAkjXJGkio7xQVDarfv OsZ025h/cXUQ17BkF1vfVEkjrLWgFRT/AC4+z06DYZ5W8GGiu5GnVwAzXVw+VKU8+q0fnV/M w+O3wlw9XS9n9hJh96VO58L19gNj4bZFX2Rm9ybk3btCTdNFU53D43IY58ftuGleD+IVssso kYvHFDLJEU9jTlzkq93WztNwvdQhvLhLZDEK6XlJCaydVK0OKd1DQg0qAeZ/cLbdlm3HaNvC Xd9t9pJeypqCgQQAGamplq/cunJODg9U3fzfPiptz+Zx/Lq2H/Mh6q61qNn/ACO6e2lWT7u2 jjGGUrN6dY7c3hUbS7C69bI0ip/ETgMjBU5bbtU6iVqOKopgpadPCi5i5c3LlPmS65V3Yqbi 0lKMV+EjBXBJIPGuc+QFOpA9mfcnbt72Tb+b7RZEsdygMy61KGoBotCTwNQxpQ1WhBJ6vw+A vSifHX4V/GHpZxAMnsPpnZOP3OaWqpq2kffFdiUzW/ZaSqoy0bwvmqmvaIo72QgF3ILsxKrL IVbiMfs4H8x0E963Ft23a43FqDxXJxwpwHEnyArnj0b36L/wb/eh7oOirz+zrtF1MB/sT/rD 3o9bJoOvSNqYn/YD/WHHvw4daAoOsZ9768epFHJ4qumkvbRNGb/4Bx7ciJWRSPXqhyCOl5uO n5hqwOGUI9vpf8cj2d3aUYP646YiPl0lxyf959o+nR1//9Dcp9g/paB1KoaVqyqgp0FzLIqm 34W92P8AtvbkSGSQIPM9aNAK9LzccyUNNj6WMaV12IH0MaLY/X/Hn2Z7lRIFjX/VTpmIaiT0 x/Xn2RdX6nUq3V7/ANq4/wCN+1UAFCeqnru1jY/UG3t0Dq3Siw6gQSP+Wex/1h7MbQdpPz6Z c9O/tX011737r3XvfuvdZIReWMf7UP8Ae/exk9e6ff8AD2/1rrAeOPfuvde9+691hYWt/tv9 t9P949+611x9+631737r3XvfuvdZX9SI/wDhpP8Arj3ode6xe99a65H9Kkf4qf8AYcj37r3X H37rfXdr/wCB9+4da4dciDpH+Bt/sDyPeh14dcPe+t9e9+691mI1Rof9SdJ/1j9P+I964de6 4elf8T71k9a68C17+9461jrmQGsfyR/vXHvXDrf2dY2CqLn6e/V60a9Q3yNNC1mcA3/BH4P+ PvVerBGPTlDVQzgNGwIPP15592r14gr1L0jj8+/V6pXrsC3I9669Xrs/U/77j8e/de669+61 12OCD/iPfuvdetbj+nHv3XuuvfuvdYJF9X+uP+Ne9g9WBx1xCj/X9+r1qvXfvXWuu/wf8NJ/ 3m3v3W+uTchD/tNv9sffutnh1w9+6r13+B/g3+8Ef8a9+635dde/da69791vqBWjmNv8GB/3 gj3sdWXh1C976314fX/bH37r3XZ4J/1z/vfv3XuuvfuvdZoDaVP9j/0KffuvdOXv3Xuve/de 67/sn/Bh/vI9+8+tdde/db697917rs/Rf9Yj/k4n37rXXIf5tv8Agy+9efW+uHvfXuuvdTQd e6971Xr3XJfqf+Ct/wBCn3vHl149cfeiKde697117rsfpb/Ye99e669+AJ69173bA691nX6D /W91691yDEe919etEdZAQffuq067Pv3Xjx669+6116/v3W+uBb+nv2B1YDrwPD/6w/3k+9fb 17rr8H/XH+9H3759e6429+69Tr1vfutU6bZDc3/qzn/bt7uOrdY/fuvde9+691737r3WWb9d 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 E+/db669+6114i4I/qLe/de6ir9f9h72erHh1x976t1737rXWT8uB+b2/wCI91Pketjh1j92 691yX8j+qn/eOffj1o9cffuvddgG/vR4daPDqJWj0xn+jkf8lLf/AIj34dbXqD731vrw+o/1 x/vfv3XuvWtx/Tj37r3XvfuvdSqX9T/4hf8AeCf+K+9Hr3U33Xr3Xve249e67b6/7BT/ALdb +9deHXXv1D17rtfr/sG/6FPv1OvdeH1H+uP9797p17rx+p/1z/vfv1Ovdde9EU6917348B17 rsfUf64/3v3rr3Hrr3s8evde966912Po3+w/3v3vrR4jrr3rrfXvfuvdZvduqeVeuvfutdch +f8AWP8AxT37rfXH37rXXvfuvde9+691737r3XP+3/sf9696HDqzZbrh731Xr3v3XuoU59T/ AOGgf7wT72OrDrB731br3v3Xuve/de6yS/rt/QAf7x78OvdcF/P/AAVv95Fvfutdc0HB/wBf 3VuPW+uXvXXqdet791qnXre/dep1MpgLAfguNR/wIIb+n0AB/wCN29762OHTxHDE1M8jECUA ssZHLFOR6L6W5BB1KdNiPSAALAY6t0y1dj5B9ReQXNySFTWrXb+pLHn83/N/evPr3l00r/aP 9FP+88f8T731WnXH37r3Xvfuvde9+691737r3Xvfuvddt+o/4cD/AFhx7917rJFwJG/1KWH+ uxsPfj14dY1+v+tz/tuffuvdde/de697917r3v3Xup1Ev63/ANZB/vZ/4j3o9Vb06ne9dV67 P0A/2P8At/fuvdde/de697917r3v3W+utI/33497r16vXQX1D8/U/wCwHPv1cdbrjrv6hr/4 n37r3n1w976t1yX63/1Iv/xT349aPRJfmb/ML+KPwL2pBn/kL2XS4vcubo6ybYHUG1KWXeHd PaOQgpaiWjxexOucQWrJUqainNCMvXfa4ilqJIlyGRo438gWWG33263S2W2xNPK1AFQFjmtO HAGhycY6ZvLuy22yk3PdJ47W1hFZJpnEcUY8yztgUGaCrEA0B60e99/zC+3cR83dz/zAer+h tk/FzbO5p6F93dOYTeOX3bkM5Bk5tO/d8dyVGNhpaEf3tlaKbdFHtzHQx0NTDTZ6Nsjm4clW 5gfc9/dZ9w9v5Jl9wLeFJmiTxZrSIH6j6eMDxZWyQ3g1FFVQTqPpXqHeVfvSe2G6e4MXJe2X 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 /wDXz3scOtDh1jfc+2ja24sET/2t6D/r570et9Y/7z7a/wCehwf/AJ9qD/r573Qde64nc22z /wAxDg+eD/uWoPp+P92f19+PWusX95duf89BhP8Az60H/Xz37rfXv7y7c/56DCf+fWg/6+e/ de69/eXbn/PQYT/z60H/AF89+691l/vNtsxkf3gwlxZh/uVof9Y/7s918+tDrF/eXbn/AD0G E/8APrQf9fPdut9cv7y7bK/8fBhLg/8AO1oPof8Ap57959a8+uP95duf89BhP/PrQf8AXz37 rfXv7y7c/wCegwn/AJ9aD/r57917rkdy7bIU/wB4MJ9LH/crQfj6f7s9+611x/vLtz/nf4T/ AM+tB/189+691z/vLtwAf7+DCXBv/wAXWg/1/wDjp711rzr1yfcu2y1/7wYTkA/8Xah/2P8A uz3oHHWz8uuv7y7b/wCd/hP/AD60H/Xz37qvXY3Ltv6f3gwnII/4utB+f+nnv3Xh11/ebbn/ AD0GE/8APrQf9fPfutde/vLtz/noMJ/59aD/AK+e/de6lRbo20Esdw4MWJ+uWoBx9fzJ791v rJ/ejbP/AD0WC/8APvj/APr5791rr396Ns/89Fgv/Pvj/wDr57917rv+9G2f+eiwX/n3x/8A 189+6311/ejbP/PRYL/z74//AK+e/da67/vRtn/nosF/598f/wBfPfut9e/vRtn/AJ6LBf8A n3x//Xz37rXXX96Ns/8APRYL/wA++P8A+vnv3Xuo/wDebbWtv9/Dg/z/AMvag/r/AMtPe/Lq x4dcf7zbb/56DB/+fag/6+e9163Ude/vLtv/AJ6HBj/yLUB/66e9V61XrINz7a1X/vDg/wBI v/uWoP6WP+7P8Pejw62vGnXH+8u2h/zEOD/8+1B/189+r1Uk9djc22rj/fw4Mc/87agH14/4 6e/der14bn23Yf7+HB/+fag/6+e/de69/efbX/PQ4P8A8+1B/wBfPfutdRqrcu22i43BhCQy mwy1B+fT/wAdP8fex1ZePTd/eTbv/O/wv/n0of8Ar5731br395Nu/wDO/wAL/wCfSh/6+e/d e67bcm3dR/3P4X6n/l6UP5/6ee/de66/vJt3/nf4X/z6UP8A189+691Ipty7cDm+fwgBQ/XK 0IF7j/m57917qd/efbX/AD0OD/8APtQf9fPfqde69/efbf8Az0OD/wDPtQf9fPfuvddnc+2u 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 LMtDJlXcrNLHPR0r07RRNKJtElOZvdbII49G29+611737r3Xvfuvde/Pv3W+ikd2/NPpzonu DqToPcFJv/dvb3dLzHZey+u9lZHdFRFQw1H2n8X3Nl9UGOxVI8izCOaurI9QhmcDRGzD3XgC RXo2/v3Wuve/dbHHr3vQ4dbbj173vqvTFmd07Y25V7bx+4dx4HA1+8s8drbQoszmMfi6vde5 xhK3cx25tumrpEeur/4bjcjkPs6VXl+2pamfR4oJXX3W+n337rXXR+nvw62OPXD3bq/Xvfuv deP/ABHv3Xuve/de697917r3v3Xuu2+vvw60OHXj9B78Ovdde/db68PqP9f348OtHr359+63 025zNYnbmIy+4s/kqLD4LA4yuzOay+RqIqTHYrE4ukauyWSr6qYhIoYIY3llkcgKqkk2HvQ4 de6Kp8Mvmj1p86es8j3H05tPtLDdaw7ir9t7f3T2TtbH7Tpd9T4mRoMrk9m0cOQq6qooaeVf BJVVEECmbXCmqWGoSK3XiKdG+P0H+x968+tefTDVbp2xQ7kwmzq7ceBo93bkxeezu3dq1WXx 9PuPP4TalRQUm6MxhcHNIKqqpcbLlcZFX1EETR071lKszIaiIP7y68eHT6fqf9f37rw4de9+ 6312Pof9h7959a8+uvfut9e9+691k/J/1h/vfuvl1Xy69791Xr3vXW+ve99a697917r3v3Xu u/ejw62OPXXvw4dePE9e97611737r3XA/wCx+p+v+292HV+uvfut9e9+6914f8V/3r37r3Xf 9r/Yn3ry60eHXX4/2PvfXuvc/wCx/wB8Pfut9d3P9T/t/fqDr3Xeo/6/+w96oOvdeDn+n+9/ 8T79p691yD/1H+29609e69qBt/X83H4/Pv1D17r1r8/19+rTHVgeurE/7D37r1c9esfe+t16 69+631737r3Xvfutdet9eP8AY/7H37rR4068R/vV/fh1viOvH6Af4f73z791UCvXVuBx/jf3 7r1Oure99eoeve/da697917rJ9PdeqHr1/x/T/kfv3z635dJDsHfm0+rNibz7M35mabb2yev trZ7em7s7WEilw+29s4uXM5rIz6bkrDTwyPpUFjaygkge/da6A74g/K7ZPzR6XxHffWuzOz9 o9e7lyGRpdpVPae3cTtfK7rx+LlFJUbkwmMxmRyLNjmqVmpoaidojK8MjRo0WiV/deIoaHo0 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 3XuuS/X/AF+P9v7317rq1vdgPPr3WX/kfuvVfLr3v3Wqdd29+63Trv8Ap/tv+JHv3W/Pr3vX W+ve/de66/r731r16xN9T7uOHXhw6rc7m/7etfAH/wAUy/mXn/2J3xs97635dWRe9de67BsQ f6EH/be/da6ne/db679+691737r3SE7RXsh+s+xU6b/ugO3m2Lu5eqj2DVZWh2EOyG2/UDY/ 9963BUtdXQ4j+J/a/wASlo6KonSn8jRQSyBY2917rWe+F/wQ/nq/C2LsXc+3sB/J47c7+7t3 LX7t74+UPcXa/wA3dy949vZaprXqMZj9wbkpNmU0NHhcTCY6PDbexNNS42jijBiphM80sm+r Eqej8/J/+RJ/Ll+Ujdydtdg/FDrPNfKnt7bW4snley63e/cVDin7bym1mx2N3JNT4zLiJKSn rlgk/bxhPiQE07tdG11oEjh0YD+U98Adq/y2vhN1T8csXt3ZWG7CTFYTdvyCzXX2a3bntp9g 9+VGzMTtLfXYGJrt5x01WIq+PDUKRouPoowkKsKSJ2e++vE1NerHnHN/6j/evevPqvXD37rf Xvfuvdcv9T/vvz7qeB611xP1PvY4DrfVbfz2/wCZ4fymf/GktR/8L0+QPu3Xh1ZJ7117r3v3 XuolWOI2/oWH+3AP/Ee/efWuoXv3W+qnfnX8SvlTuH5JfHT52fBfO9JP8h+h9h9odMbs6r+R k29cb1d3H0r2pX4vPZLEQbt2JHV1+DzmKyGKSsxdUtDLBPJKEqyIYfHL7yz1sEUoei77J/lY d5fIfY38yjeH8wTe/U+N74/mQ9R7G6QfbPx1h3Zmervjj1x1VtDI43rNMBlt7Lj8huHMxZnJ vncxLWQRwPUQJBSutI5Ub63UYp5dMHXfwx/mp/IXtX4WYj+Yruz4cQdA/BDsnbveeNyPx3yH bGa7L+TXenWW08hs7p7eW8aPfNBQ0G36LHDIyZrKU1M8hnyKlYYFp5IjRe69UDh59Kvsj4kf zT/jl8ivl5vn+WxuP4cZfqL5zbkwva25sT8nsj2tg90/HT5CjZFB1tvHsfZUWwqDI0mfxeWo sXR5WahrisqVyRxpGKWGRauuOqkqfi8ujDdT9Yb9/li/HP8AllfDPo6PZPZuBftnb3Qnb+e3 fFuai3fn8fntkbq7e7U7O64w+HlkhSuOXoMnnayLK1Lw0+PNR6p5kTV7j1UnUSegW7f+KH8z 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 Xr3v3Wuuzyv+t/vR9668eiK9fi382r5Lj6f9i4Pgnx/5cz8ivZpFiFfz/wAnTDcerIvd+q9Z YzcFD9CP+Rf7z70evdYiLEg/j3vr3Umk/wA8v+x/3r3ZePXvLp59vda6daKTUhQ/VPp/wU+/ dbXpK1XWfXFd2DiO267r/ZFZ2rt/bGV2TgezaramBqOwcJszO18OVze0cRvOanbJU2MrKqmp 6mqoIalYJZYo5JI2dFI11bpZsOf9f3o9NMKHrj791Xr3v3XukTm+tOuNy712N2VuPr/ZO4Ox usKfddJ1rv8Aze1MFld69eUu/KGnxm+KbY26q+CSuxMeZpqSlp8slBPEKuKGKOoEixoB7rfS 29+6113791sdY5B9D/sPfuvdYvfutdcWH1/2/wDxB9+6sOuHv2nq3Xve6Dr3XfvfXuuTfW/9 R/xHvQ9OtdcwR7qR1r7euXv3Vh173rr3Xv6/7f8A23v3Xj1737r3XvfuvddE8e99aPDHWMi/ I92rTrQNMdVudyD/ALGufAAf1+GX8zAf7fs342j3vy63XHVkPv3W+ve/de6mxm6Kf8Lf7bj3 7rXXP37rfXvfuvde9+691737r3Xvfuvde9+691jf6A/4+/da6x+/db67AJ9+r1qvXK3Fv6e6 161Xrogk/wCv78pxTrZPVbXz3Fu7/wCU0T/3slqP/hefyB92Br14GterJtP1/wBc+9V61Xr2 ke9VPWqnqNVj9oH+jg/7wR/xPvY62Om33vq3Xa/qX/XH+9+/da669+631737r3U6nN4/9ZmH /E+9HqrdZveuq9ch9f8AYH/evfut9de/de67At79w49WAp12R9P9b/iT79x60Qeuv7I/1z71 59e8uuh9fe+tDj1yt79p6v1W33OP+xrnwA/8Uy/mYf8AvzfjZ73TB695HqyVhyf99+PeqdaH DrwFuT78B17ru3Bt+bf7378R1rz6429+p1brsDkf6/v1KdaPWT37qnXvfuvdd/j37rfl1179 1rr3v3Xuve/de67968+t+XVbP82L/sj7Hf8Ai5v8sj/4Zd1H7svHra8R1ZL711XqNUfVf8Fc /wC3FvfurDqJ9fp7t1brkVI/4171XrXXH3vrfXOT9Vv6Ko/1uPehw691xH0b/WA/3m/vfWuu Q+g91PHqp49d+/da67t791uhPXdvx711amKdde99V6xS/pt/Uj3sdeHUex976t1yf9Vv6AD/ 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 96J66796gk/vBtHt/q3bHanXByTx42TJ4fe214dz7ZpssYWnWkmaOohiq0DOYJNanUUPvXVe tXH4JfzK/ld8dfjb/Nf+QvzB6eq9w0G0f5ivyL6/66w+xu9pO0e0s98qN2drYbqDbPxA61x+ 6sTJDHtzbU0uLx+AznhmpxQQySJiBFTfbvvqxAJFOlj/AC9sd3L/ACx/lz1btH5X/FCu6AwX 8xuaXrKj7W2P8u2+SW2N3/Kqjrs929iKr5WUG49vYyd+z9xU1XmMau7ds1seKrkihohjpIqe CfH+68cjo227P5pXz87OyPyG7V+CX8vLbHyK+J/xa7W7I6j3NuTcveNTtTvL5Ibk6Yyf8G7Y b4zdZbfweVjnp6CshrKTFSV088uYkjCUdOKnVSLrqtBwJ6vQ2NvCLenX+z9/1GB3LsiHdmzt v7wn2vv7FSbZ3htGLPYSHNS4HeuDqzrx+SoBKafJUkrXgnjkjY3Q+69U8+tIH+a13x8wP5i/ ws7t+eOxOnfkj1p/LnwnUndWwOt5+pfnBl+vNxdx7Yhz9ZtLC/IHvr4kUWJGGz+zKvLwrS12 JqM1/EYcMZ65fuqVVWWw9OnVop0+fVkO/el/l7XfGT4AfD34Z9T/ACD7Z3v1j0PgPkvQfzBu 9vl1vTqgdU5rsCkrsdV9PYjtPE4LO1+66+bG5+txlPtytxUmMxu34sbCyVElNG9FrqlRUk9L j4ffzP8AZ3xp/lp/I3dG+Pj3uyg7f+EnyVzXxd3n1FtfvZPkPnvkb8o+1t54vM4rcG1u9M3G J8pLvTcm8/vsnVVlPJLjh9544JYaaCnb1M9bK1b7ejx/Gb5afzJK35IbN6R+bnwAwHVOyu4d mbx3dsHu/wCOnaWa716+6vzezaaLK1HVnyJy0uFoKbDZGspZvHi8xFULR19ZH9tRRTl5XpdG lKjrwC+R6L3/AMKC955Prjo34Bdh4XZef7IzGw/5unwL3nieu9qSY+LdG/cntfeGUzlDsvbc uWlhpFr8pLAlDRtUzRxCaVDI6pdhsdaTifs6GX48/wAwH5a475bda/Dz+YR8UevfjpvX5KbB 7B7G+L29um+6z3JsXdtV1VRQZ7s3pbeU2SxeJqqTdOBxFVBlHq6OKWgrYRM1OYxFd/Y8uvEC lR1V5RfOPqeq/kj/AAj6a+PXx8h6Q3L/ADGNv9v9P9G/HrZfyYg6n2t1bsbbO7c7kO8t2Z/5 Qdr4+vkxWDpMckjV9QKNspPLloqDEmKrkgqYPUz1Yg1NfLqH8RPkpv8A+LfQ/wA7Pgl1N0v1 RsT5CbX6G7I+ZHxu2B0h8zaDt34qp17nMnT7S7ci6K7EXExbi2PU7YyNQ+4TtDLCreStqXra CWlpaz0e60QDQ9WufyJOwPkN2X/K++Le5fkZtXG4LPS9b7Ki2DueDsmu7N3B251jLsHEZLCd ub9yWTpoKjH57L19RlBkMXNLVPGYUmaqlachdHj1p6asdW++/dU65Dm4/wAL/wCxHPvR9erD 06ra7n/7eufAD/xTL+Zh/wC/N+Nvu3l14cD1ZJ711Xrkfq3+PP8At+ffvLqw8+uHv3VepEZu v+sf+N+9jq44dZPe+t9azPxT2R8v9of8KAosj80O99pdt9ob9/lB9q71pdkdS7dym1+hehMP VfM/YuFj6z6kps+5yuWgVqH7uv3NnI4sjkZXRZoYYKWlgi91bGnHr0Tn5/Y/rP5E/wA3X5hz /JL4DfPP52dQ/FT46/FrqXr7aXxGqO1drYbbuX3XS53u/sjfFbnNjby2NT5WvhjzMOKgxsWQ raqomR4Fp1FFJJTb62MDo1HyH3h8cfkt8Sf5NHw7+F26d+bT+C3zx+Q9Jszcy4ffXY2O3zlv jh0jsXcvZPZ3QO4N97gyVbuqlq8jnMQuAz0hyz1K/bVdIKsRPrPutDBNehq+KHQnW38tT+b5 L8Nfi3Q5/YvxL+VHwW3J8g06Nqd57v3ltPrjv7pTuig2flN27Di3vXV02Ko9wYPcLLlaWmqG E9ZTwyMFijhSL3WuIqethr3rrXXE+9Hqp64+9dV6yCMkX+n+ubf1H+9g/Ww+vNwR73T16sB1 2Yz9f9h9Qf8AbkcfTn6n+psBf3ogU63Shr1Wr8+P+Z3/AMpr/wAaTVH/AMLz+QPvY60PPqyY f8R711ode9+61117917ptqB+8/H10n6f7SB731vqsr+ZX81d3fGTYexOnfjlgsZ2N87flnuK q6l+I3VtaxmoF3TJRGo3T3Pv+GFJXg2fsXHl87n6p4/GyxxUzvGs7zRaHW1FTU8OqKPjd393 78Of+E8v8ybtas7b3N2F8iunfkP82+vYe8MhU1Um56/snJ92w9QJ2rRnKz1DwVMGQr2zlNFJ LKsUiqpEgXS2zx6uaFgOhu7U/l/dJ/yf+zv5XnyK+Kkm/tvdsdm/Nf47fCj5b53K9p9jbvov lNtH5N4fKbJ3PvLtDCbsyNTRVWZo9yrRbix9TTU9KkDh9EJENJDF6tetVLVB6UPW/wADehP5 xPyW/mi9x/MiLsDeVT0N8v8Acvwc+LNJiOzt+7Ni+M+F6G6q21mct2B1di9o5Cko481mdw7h kzdRW5JKvXJEsXijp2lgk9XrddIFOrQ/5KPfXZHyV/lefEztTt/OVW6ezRtbfHWW9N2V881X kd3ZzoftrcHRNTu7KVtSWlqKvKjba5CqqZSJJpZnlkCu7KNHj1RhRurTPfuq9d+/db669+61 13791vy6970eI68OB6697611737r3VbXc/8A29d/l/f+KZfzMf8A35vxs97HA9WHwnqyb/jX +9e9da669+6113791vy6pL/4UBf9u+Kb/wAW7+DP/wAFhtP3sdWT4ujd/wA1n/t11/Ml/wDF BvmJ/wDA8bi96HHrS/EOqJfmH1fuHefxQ/ki7y7p6F+Qfyr/AJbXXnxk2hV/L3oH41JuTObt yG+Mx8dtqU/QvY/YXW2za6gy+59qbfnizMtdSUNQq0zS+Wpjqo5EpZbdXB4049C7/LN2h/Kf 3j82tu9q/wAoz5HUnx6qdqbB3/hPmT8An2V2/s+furGV2IpMd19u6p6v7lyOHfbeV2VmGhmq 8/g8Dk4aqKoNBLJTGqapl9Q+fWmLU7v29Al/LI/k7/y2fmt118t+6vk98Xdudqdp5T+Yv88N sVm9azevam28u2EwPfOTpMPSU/8AcvO42KBqZHYRTwRpKDZteoAjxrXrzMwNB1Y5/K7Xd3xp +XP8wL+WdV9ib67P6V+OMfx+71+LOW7L3Nk97752D1R8jsDmZ9w9JZXd2deSvrcdtrNYSUbe mramoqPs6oxyygQovvxFetNkBurx/eqdU6979Q9e67/I96Hr8+reY6rZ/mw/9kf47/xc3+WR /wDDLuo/exx68vHqyj3vq3UQ/wBf6+69U669+611737r3Xf4PvXWxwPXXvfWuu/6/wC+/Pv3 W/XrF7t1fr3v3Xuve/de697917ri36T/AK3+98e/de6w+/de67P4H+0j/efV/wAT78Otdde/ de69791vr3v3Xuve/de67P1P+2/2A49+691yHCMf6kL/AMSfejk9e64/g/7Af8SffvPr3XXv dK9e669609e65xrqkRf6sL/6w5P+8e9AZ6907e7de697917r3v3Xuve/de69791rrq3vfXqD r1vfutU9OuNvfqDqtOve9Ede68feqdbPp173rrXXf496Hmer8BTqHUtyq/7E/wDEe7DrQ6i+ 99W65fRQP6m/+wHA9+8+tdcffut9e9+691231t/Tj/ivvw611zHpQn8twP8AWH1964nrfUWZ rKF/r/vQ97691F9+690z1P8Ann/2HttuPV14dYfxf/Yf8V966359de/de697917ri4ujj+qs P9491f4G+w9bHHpEN+pv+DH/AHv2VDp7oin80T/t2d/MS/8AFFvlv/74HcHt2L+1X7R/h68e B6OFsgW2Ps1P+zV28x/1ziIePbfFietg9ONYpEt7fVQfaKcUfpxSOHUQ/wBPyfbPWyeuj/Qf Qce/dV6k0jWkI/1Q/wB659vwNR6evWjw6//Q3T6UXpwPyGJH+P8AUewvDhB0oPGvXP2/1rr3 v3Xuve/de8uiLdfm/wDNq+Sxvf8A7FwfBPn/AMua+RfsziNYV/P/ACdMNx6siAJ936rXrNa9 m/NrH/XH0Pup4daHXVveutEHqlL+ZL158y8d84v5Z/y5+JvxHyPy/wAf8YdvfODCdmbGxXeH THRtbj2782LszaGyqiPPdw5KjjnDtj8nOy0VLU6RTFJjCZoWd2MjIPy62tKEH5dJz5F7a/mB /wA1H4ffK/4h90/ADKfATI7q6y29u/pntvefyo+P/fe3M73Z1d2ngOzuutnZjb3Tk1bX4+jq Mjh6eWtydRSzQR06SjwzyMkMjuB1sUGePQY9l4H+Zl/M43J8Seg/kd8AqD4Z9O9J/Jbp35H/ ACs7X3L311V2xtvs6XoXJPufC9UdE7T2TPV5Wah3Pl0p5p8pkmpzj6NDDI08pKzawOtgBeHU H+YR2F8kOqv53fww7A+M3RkHyT3Ptv4BfI6p310vBvfbnXm7d49YVPb+3sfn2683PvBkxSZv HVs2MysFHXzRJWwU1TRxypPPCw8OHXh8PR2P5dHSHyYyPyR+ZP8AMD+WnU+O+O3YXyppujOt +tfjlTb52/2VnurOlOgtuZClxeS7B3ts9jiarPbjymar6+oo6MyJQU8VPB5WlaZU9Xy68Tig 6b/nF098suoPnb0P/Ms+I/RVN8r5dtfGzsj4gfIL48UfYm1esexMj1Vu3sTEdu7S3/1Nn99t FhamvxebxshyeOrKqGWopvFDS6nlkkp7dbrjPRMfln1z/OX+ZfxM7K3bvHpuu692/ub5c9B7 zxv8u7rz5AbL68713J8Geu9sVlF3R1Rub5S7HmpKKl3Fv7NS0Gdlooso32NDSvjVnM8703v3 Dr2AegC+FX8t7t/YX8y74PfKrqb+Uxtj+Xv8Z+ssP8qNqdopX/JDY3cHyF3DmOzOoBS7X7I7 geXP5GebEPklXC4LG43JZTJ09RNka7Iw01HUwum+tE4416CD+Xr2n/M7k+AHyH+Mfxt+DGC7 t2r333588dn9I/Jyp74662H1505HvjuzdOzd9y977H3IRnp5dv5V6zOUAwtPUjK0lRDRRCOp pZg/uvGmK9bX3xA+PmP+J3xV+OnxlxmZk3HSdC9Ldb9TnccsLUsm46vY+1KXAZHcLUjO/g++ qIJasQByIhJ41OlR711Umpr1rhVPwF+eG9usP5nPxdoeg4eu96L/ADRexf5qPwl+Rm69/wCy M90X3Lnqj5B4bt7r3qXc23cFWf3gxdXV4+jqqKtkrKWOnp55A8kwWILNvq1Rg9Gvy2C/mJ/z Kvkf8HoPkJ8FJvgX8fvhX8isH8uOzNxb6756s7l3X2r3f1ts7NbS67666fx3Vk0h/gcFTm6u ryGeyggiq6d18ESS0/iqddawOg36329/Nd/lxbP+R3w1+M/wax3yZ2vv7vP5AdmfDf5V4zvj qjZuxetML8g951W/aWh+R2w9+SRZlqvZWSy1VV1UuPpJoc1HGKWjRGBc+48evEKcny62Cuut p76/0JbK2R3pufGdgdlSdY4DbPcG79vY1NtYPeG9ZtsRY3f2c29iKOOD7Chra5qqWip1RWhh aNCS6ljXpvzx1qrbr6A/nA9dfyx+5P5MHXHwV292bHgOrO0en+p/muvyF6l251X2V8f6/LZD MbeWo683BPSZjG77yGKnTakeLrmhoYq9/wCLT18WPjLPvFa9OVXVq6x/Pv4m91YTtTpjsD5e fC3cfzy+FWz/AIXfHfqDaHUMPzf2P8YOqPjn8m8XUR7S3hX9t4fde6tu4HNybiq6zH47H7im rqulhIjpvFJKKJ19XrSnFAadY+jP5QnzPxnwp+eXU1L0D0l8Ve4K756dF/PD4XddbR7Dwu8/ j2KrqfFbR3XguoajNYmQZdVo2wtdtjKZHL4vHpUZJxkoFloG8h9UV69qFR59W+/H/vj+al8j /kv1Qey/hqvwG+MvV+B31WfIaDsPtrpvvDd/fm/clhThti7H6dqeuWrHxuHwuRH8Yrtw1Rp/ 4hARSwxowLHWKda7Rwz1y/nO/HX5VfIrpj4o0/w52VtrfHcXS38wn4pfI2Cl3nufAbV2fgMB 1DnMjm63dm66zNVVPNUY2gqpKN66ixMdVkpoC4o6OolGj35fn1sEAmvmOgb6s2V85vnB/MP+ Lnyk+T/w8k+DfTHwE2h8gW2FtndPdXXPcXYvdPe/yC2LT9TZ+qpG6ulnoKTamBwZyJpK2eVJ a2pmikSKRGIod4A61gCgNa9VdV38o/5K7W/lpfyhtw9m/Evp75Bdyfy2P9mRHf3wa7y391Qm y+y+ou/Nw1tdvQYrtCesye0afP4SHGYDOYepqa80kbeVppTJAaOo9XJ6vUVNDx6Of8C/i7Xd q/7MJ291R/Ko+HH8u3pvsz4mbz6t6I3ftzPdWb8+QvcW7Oz8fLFVbll390BkK/beJ2AYYqWM 0U0NRXVc6Q10Mz0pEa+6qxpgmvVg38mLD/IjYH8vzo3oX5OfG3dfxr7L+M+1Nt9BS4ncm9uv t90XY+L2BtPH0lP2ftbKdfV1bDDQV8zzwpS1REkbwPpeaMrIdHrTUrUdWp+/dU65KbEH3o5H Wxx6rb7oFv5rvwAH/gGf8zD/AN+d8bPex8PW/I9WR29+61Trnbgf61v9t9Pe+t9cbe69ep1k j4JH9ef9t7sOt9Zve+t9VcVvxz7lm/nV7a+W0eztXx7x/wDK43v8c6vsD+8O1R4e5cx8sdvd mY7Z391Grhm28mEoaqt/iC400K6PC1StQyRN7rflToIO4u8v5uPxq+SvyAx2yPiBN/MH+Ova zbU3F8UcvsztrobovJ/HzNRbUiw+7+p+5oN4RYysr8RPmkky9HuNJK+aGlkMDvJIwhpvdeoD 8uigSfywvlt8dPgL8Bs50/gNhd2fOf4Q/LHdHzU3f1bQ7todhbN7eru+M7uuv+Q3QvX2/tzR rS4oDH7uagwuXyISnkbGpNPCTOsQ31uoJ6NP8O+ufl98lf5hW6v5ifyy+MNV8Odp9d/FY/E/ 45dH7p7P2R2l2Ln5d49nQ9mdtdxbwqevZJsfhwz4zGYPFY9p3mlgWaocKjxM/utGgFB1d971 1rro/T3o8OtHh10v1/1rn/bC/vQ49VHHqfCgZgpIW7adX0AGkH6nj+i83H0FjYe7dOUz1znQ RsVDAgBbEEDTdrWuoA4/VwB+Cb2B9+PHrx6rJ+fYt3j/ACmv/Gk1R/vH8vX5BD3oda8z9nVk g9+HVB69dW9669Trr37rXUGpH7gP9UH+8Mffj1YdVN/LD+UP0p8tPk5i/l3lfkR82eh+7MN1 TRdLY7cPxb+ReR6RNNsClztTuSpw8VTg8dNXKlbWVPmr40rRDO0UDPFqiDe9V6uCQKdVj/FT +SL23i/5cf8AMv8Aiv292R3vRb9+We/vkbiOscH3d3xRdx9bYrFUnY+R3f0D3o2G27Nkqeiz u56o43K72yOpcpWNGrVNPBUxqotXPWyRqB6FSh25/M4/mD9pfAPrT5c/BuP4ldZ/DHv/AK4+ V3yD7myvfvV/Z1B3b3H0Ht3JUHV+2umdrbFmqa4YzLZ2sh3HXVGU0CkiiFMZnnhQ1usDr2BX 59KPL4b+ZF/Lv+Snztj+JHwTh+aXTXza7cj+UPUO6MJ3t1d1OnTfyH3l17huv+0Nudy4Df8A NSTz4eqrcJS5yDJ4vgQAU0kj1M8klJsZ68aEZ8urRP5Y/wAS8z8Gvgd8bfi5ujNUO4969a7L r6nsPOYuSSfFZPs3sDdeR7O7MqsVUTxwyS0hz+ZyP200kMbyRaHZEZio0ePTbGpr0e/37qvX fv3W+uvfutdd+/db697qfLrw6692611379TrfVbPc/8A29d/l/f+KZfzMf8A35vxs97HA9bH wnqyY/8AEe9HrR669+6113+Pfut+XVfH80n4ibx+cHwj7b6E6y3Lhtndu1Vd132P07ufcgq3 25jO0+m+yMT2rsyDcKUayMKCvqsQuMrJfBN4Yal50hkkiRffhx62poanqsT5HdwfzhvnB8b+ y/g/F/Kwb4xb1+Q/X+e6M7j+SfYPyo6T3r0B1jsTsHGvtHsje2zcRsmoqNybjNVh6qrTGYyC iiqYJJ1M5k+2kEmwBXqwCg1r0aL5FdNfPr4lbi+HvafwBxU3ye6j+PXQMPxe7t+D26O16Lqs 9nbGw9Hiodjdz9X7i3fK+3qXeeDbGNDUPlWD1dBK1FFNeVmW3XhQgg+fQG7O6z+aPz0/mLfD n5c9zfBhfgD1b8I6LuPLLu3fvbHV/YHyM+QGb7V68quu6Lq6ho+pZayPD7RxjVUmUyX8YrZP vW0x0sMZeWVfdeoApANa9A98Pc5/Nv8AgbgvkX07tr+T5uHv/b28fmZ8re8dkdo0vzt+IfWG Gz+1O4+2q/dm1JarbOayeSylEn2kkMk3mgNQgchqVZVMXvx68QrUNerIP5cnxS+QPXfYPyx+ Z/zJTYeL+V3zY3b15Wbh646xzlZuzYnRHTHTO1pdqdM9OYjduRpaR8pkqOCsr6zcmUpYI6Ws r5y0CMkSyyer1pvIDgOrVLe/dVp163v3XiOvfn3VeHVj8XVbX82If84fY7/xc7+WP/8ADLuo /duvKKdWTH6H/W96PDr3UX3XqvXXv3Wuve/de67/AB711vy697314cevcWP9T7917y6xkH3Y dWB669+631737r3XvfuvdcH+n+x9+691i9+691yPLH+l7f7Ace/eXWuuj9f8Pfh14dde/db6 97917rtfr/rc/wC2F/futdde/db65twiD+t2/wCIHvXn17rifoP9if8Ab8f8R731rrr37rfX vfuvdSaVbuW/1K/7y3++Pv3n1rqf791vr3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu uve+tU69b37rRHXXvTYFetAZ69/X/ffT3oCgp1Y9N0h1sW55PH+t+Pfq9ar1jsbgf1Nve69b r12xuT/QcD/WHHvw691x9+631yX8n/U8/wCx/Hvx6110ASQPyT791vrI31sPoq6R/wAT7r1o 9N0h1MT+BwP9h7t1ah6x+/da6aKr/PN/sP8AevdG49XXh1gP9P6e6DrY6697691737r3XTfp b/gp/wB691f4D9h630iH/W//AAZv979lY6f6Ir/NCF/5Z38xQ/gfBT5cH/Y/6ANwW93jNJU+ 0f4etHgejf7GN9k7OJ/O1tvf+6iH3U8evdPVaOUb/Aj2kuOIPVl9Om3+rf7Ae03V/Prh791r rkjFXUj8H3YMVNR175df/9HdRpDaFfzZj/yL2F4/7MDpR1lZLG4+h5H/ABI9ug4z1rh1wt/t /duvdesT+PfuHXicZ6Ij1t6v5tHyY/On+XF8FR/tvk18ivZhA1YB8if8nTD1PDqyywHu/VKA ceuxzx/Xj/W/p78OvVr1737rY6kUvE6f7Ef7x7svHHXun1DY2P0Pt7rXXFhpJH+2/wAR+Pfu vdAllfjr05m/kDtH5S5PZ/3Pe+xest09O7V31/eDdMP8K643pnqPc25tuf3Yp65MNP8Ac12P pJ/vKnHyVUfj0RTpGzo3hXh1uvl0NnuwHWunSmfXHb8x8f66n6e/fLra+nUocf4j/X/2/v2e t9YiLH3vqvQJfH7459NfFrr1uq+iNnf3F2E+799b8bA/3h3Vue+6+yt2Ve+d65X+KbxrshW/ 5blK6qqvB9x4YdfjgjihVI1917obffuvde9+691737r3XvfuvdcPdeqdcT9P8RyP9h7917pB 9jdZ9cdv7RyfXvbPX+ye0dg5qow1XmNkdi7UwW9toZap27nKbc+3qnJ7a3LT1NFPJQZKjo8h RvLAxhqYIZ4yssSOvuvZHDpa+/da697917rna6/6x/3g+9efV6VGeur2+nvfWsDh1Ay+Kxed xmSwmcxtBmcJmsfWYvL4fK0dPkcXlsXkqZqTIY3JY+sV4p6eeJ3imhlRkdGKsCpI9+61w4dM +y9lbM632lt3YPXe0dsbC2Ls/EUO39pbK2XgMVtbaW18DjIBTY3Cbd25g4oKOho6eNVjgpqa FI41AVVAFvfurVrx6VAHB/2/+29+p1ojrjb3rr1Ou7e/dbA6rd7oF/5rn8v4/wBfhj/Mw/3j s342e9rwI635dWScD6e9gda67+oP+wP/ABB9+PXuuv8AX97691zUcgj3qvXq+vWX3vrfXvfu vde9+691737r3Xvfuvde976910feutHriOCD/T3UY6qMGvUxJOODY/65H+9c/wBfp/U3IudV unOPXbSXFib2A/r/AL03I+p4+nJ+lyD7r3VZ3z6N+8P5TJ/8GTT/APwvP5A+/LknrX+bqyX3 6h6pXr359+p16tD161/fvt63QHqHVj/Nn/gw/wB6I96anWwOonunW+ux9D/rf8SPe+vdde7B fXr3XJTZlP8ARgf9sffjw6105+9dU697917rv+n++/Pv3W+uvfutdd/1/wB9+ffut9e91PWx 117t1Xrv37r3VbXc/wD29e/l/f8AimX8zH/35vxs92HA16uOB6smI/3r3ojrRHXXv1Oq9e/B /wBh79TrY4det71T169TrsfX3sdbFK465e99W697917r3v3Xuve/de697917r3v3Wuuvel+H rfVbX82P/sj7H/8Ai5v8sj/4Zd1H7sOPXhx6skc2Vj/tJ/3r3o8OtdRbj6fnj/evdadV679+ 69Tr3v3Xuvfj3rrfl1x1fW39D/vXvdOvU9euhcj/AF/e8dexXrsX/I9+x5dax5deK/09+r1u vXCxHvfW69e9+631wcE2H+uf+I9+r1qo64qLEH+hv/thf3qvWq164k3/ANb34DrYHXQNve+v U65WB+nvVfXrVSOPXEi3vfW+PXY+jH/AD/bn/jXv3Xuuvfut9ZJP1W/oAo/2HvQ4da64t9bf 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 /wDXP37t69QdePyR/wCFKv1/4bj+BH/pTuU/H/kT9+x1rt68fkf/AMKVgun/AIbj+BAudR/5 ydylzf8Ar/uT9+7erYHUaT5If8KUiQD/AC5fgSNP9Pk5lDz/AOfP37HWxTj1j/2Y7/hSh/3r m+BX/pTmU/8Arn79jq3XX+zH/wDClD/vXN8Cv/SnMp/9c/e8db6gVPyN/wCFJPkIk/l0/A1W 4JC/JrKH8C3P8T91otak9a+fUb/ZjP8AhSN/3rr+B3/pTOU/+ufv1E9et9e/2Yz/AIUjf966 /gd/6UzlP/rn79RPXr2evf7MZ/wpG/711/A7/wBKZyn/ANc/fqJ69ez10fkZ/wAKRrG/8uv4 HWsb/wDOTOU/p/2svemCaTny69npMf7MP/wo2LMf+G8vgrwST/zkrkwPr/X+Jey4i2/iP7On atTpOdi5P+e78oOkPk18eO6PhL8NdhbO7u+LfyN6rp9z7W+S+W/j1Burf/T+X2ns9MdSmDNQ 1DS5Grp42hq0pINBZ5a+mVNTbUQIQVYmhHl146iKdbA216CoxW2du4ysVVq8bgsRQVSowkRa ijx8dPOqOvDAMpsR9fbBya9X6cakXidvzcW9sT/2fVhx6Z/aOnVuve/da697917r/9PdPoz+ zb+jW/3jn2Foj2dKepY+t/bnXuumFjx9DyD/AMR78DUdUI69/wAR731ugPT1hntLLH/qlv8A 7H2ptT3keo6q46f/AGs6Z697917rsf0/r/vf492oada67HBH+uPdh17p/U3UH+oB/wBuPagc OtdZoz9VP0P+9H3o9e6xkWJB/HvfXuve/de697917p6gk8kat+Rwf9ce/de6ykXBHv3XusHv 3Xuve/de697917r3v3Xuve/de66P09+PDrR4dcPdeqdcWF/9jx/sfqPfut9YwOffhx62MZ69 b3rr1Oux79SvWwOuyOb/ANef9v78oqOt9eH5H9f97HI92p1o9e97631737r3Xf5U/wBf+I96 9etdeb6n3scOvDh15frb+o91bhX063117t17rwv+PfutdcivPvVcdar17T79Xr1esq/T/W4/ 4p7sMjrY6797A69173s062Ove/VHWuve9VPXuve9V631737r3Xvfutde96631737r3XXvR+I de6797691737r3XvfuvdYKgXib/DSf8Ak737rXTd791vrtf1D/E2/wBvx78etHrr37rfXvfu vdOScoh/qq/717qeqHj1y9+6113+Pfut+XXh+f8AW9+HXh14f8QffuvDrw96PDrw49de99a6 5+7dXHDrv37rfXvfuvde9+691737r3XvfuvdeHJA/qQP9v791rrK0LKoY/Q3t9ObfW3v3W6d Yvfuvde9+691737r3Xvfuvde9+PDrw6978OHXuve/de6xyfpt/VlH+8+9Hh1o9Qz9T7317r3 v3W+uz9B/re9Dqo4nrtvqB/QAe/Dh1brr+yf8SP94B978+tefXP3XqnXvfuvde9+691737r3 XvfuvdYD9T/r+/db69+D/iQP9sP+N+/de8uuvfutde9+691737r3XrD37rdeuyOLf0UD/b8n /e/fvPrfz68gtrP9FsP9c8e/E9bBx1wAsGP+AH+3PvfXq164+99e69791vrJCuqRB/jc/wCw 59+6106e/db697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6970TQde66 JsCT+Ofexgde6b29RJ/qb+6V60R10ByP99x+fe+q066PJPv3Xuuvfutdc/oCf9gP97PvXVj1 0ouR/T6n/WHvfWgKnri7fqY/4/8AGh78OvcT1CJub/1966v11791vrwHP+A5P+w97HXq46Za y5nc/wCt/vAt7oePVxSlOox+g/2PvXn1oceuPvfW+ve/de64SG0ch/ojH/ePdX+BvsPWxx6R z+lSPyzEkj+l/wAeygZNfTp4dYfbnW+uLH8f19662PXqNU/5lx/qbf7e/Ptqb4D1Ycemj2i6 v11b3rqtOuve+tdf/9TdMoT+24/ob+wtD8JHSk46ne3OvdchyCPyOR/xI964daPHrh7317qb j30VcR/1R0/8lce3YTpkB+fVW4dK23sz05z0weve7AU611737r3XZ/r/AF+v+v78OvdPdO2q FD/hb/be3l4daPWccWP+Pu3y611zcXAYf6x/4g+9D0631j97691737r3U2iks5jP0YXH+uPf utdOfv3W+sLixv8A19+691x9+691737r3Xvfuvde9+691737r3XA+69UPXR+n+++vv3XuuAH q/3n/b8+/db8uuvdqdW697917rv6gf4cf7A+6jDEevXuuvdutddkWPvw68Ouvfut9chyP9Yg +9HrR68QST79XHWgaDrsLbn3omop16vXdhf3oHHXjx69731Xr3v3W/Lr3v3WuuS/n3ZT1Ydc ve+rde9+49e6979x68eve/U691737r3l1737r3Xvfj17r3vXXuve/de6970fXrw697317r3v 3Xuve/de6xyi8bj/AGlv9uBce/de6bB9D/sPfvPrXn10OCD/AEI9+6312eCR/Qn37rXXXv3W +nGI3jT/AILb/bG3vR6oePXP3rrXXf4/2Pv3l1vy67H/ABHvY68Ouh79Trw68PeiO0168OPX ve6da65e99XHDrv37rfXvfuvde9+691737r3XvfuvdeBsQf6EH/bc+/de6kPOWQJ+ACByeNX 6uD7917qP7917r3v3Xuve/de697917r3vTcOvDj173sde697917rFJ9F/wCDA/7YE+/Hh1o9 RPfut9e9+691yPOn3r16qPPrz/qPvw4dWPHr34X/AFz/AMQPfutdcveuqde9+691737r3Xvf uvdd/j3rz6t5dR/futU67P0X/Yn/AG/vfXuuPv3Wuve/de697917rsC5t/Xj37rfXZ5uf8fe uveR67+if67f7wPe+t+XXH8D/Ek/7bgf8T791rrq3v3XuuiAffq9er1Ipl9TN/QAf7fk+7Dq wz1N9+631737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691170cmnXusczW S35bj/Yfn348OtdQ/dOt9d/gn+vH/En3vy6159cffut069b37qpGOu2/A/oP+R+99aPXY4Qn 8twP9b8+9dbGB1GlPAX+vJ92HXh1g97p1brr3WnXuu/oP9f/AHofT3rgOvdMlSbzP/gbe2z1 vqORf34HrYPXG3vdet164+99b64Tf5iYn6BDc/09tTmkTH5dbHGnSLY6mJ/x4/1vx7LVwOlA Ap1x9769TrH/AFb/AGA9+638usE3+ak/4KfbcnwHqw49M/sv6v173vrXXveq9ep1/9XdIoT6 nH9VBA/1j7CkJ4jpSenQD+vt0nqteuX+t711o164MLH/AAPI/wCJ92B6t1lpjaoh/wCDj/Yc +7J8QPz60eFOlq4sx9nJ6Tdcfeuvde9+6912Obj+v0/1x7917p0omvGV/wBS3+8H26nXj1O/ s/7H/iPd/Pqvn1kT1KV/23/Ee6nBr17rF9Pdut9e9+6912rFWDD6g39+690+qwdVYfRgD791 7rzC4/1uffuvdYffuvde9+691737r3Xvfuvde9+691xPvR6qeuveqdV6425/1if9sffuGOt+ XXD3bq/Xvfuvddr+R/Uf7z7q2KH06911Y+7da65Wvb8cW96r1qvXeke9VPWqnrv37r3Xvfut de9+69137qOJHWzw66926113791vrr37rXXY+vva8etjj1z926v1736vXuve/de6LP8ALv5Q 7J+HvRO7O8N8Us+XpcG9BjMDtehq4KHJbu3Tmaj7XD7ex9TUK6xl/wByoqJvG5hpoZ5hHJ49 DBbnLmux5M2Cbfr8FxHRUjBAaSRjRUBNaeZJodKhmoaU6C/OPNVjybsE2+3wLiOiogIDSSMa KgJ4eZJoaKGahpTohHww/mwZf5o9g121tp/GPPbR2htyhev3v2PleycbkcRthJ6eU4WhWgTE UzVdZXTx+KGmimVggknYiOJrgDkX3an573JrOy2p4YYhWWdpgyx1B0igjGpnIoFBrSrHAPUf 8k+7U/O+4taWe1vDDGKyzNMCqVB0igjBZmIoFBrSrHA6tfx26qavcLG6tc8aSD/jfg+5gWWv Utpch+Br0rUcOoYfQi49vA16VqaivXP3vq3Xvfuvde96bh14ceve99e697917r3v3XuuiLgj +ot7917pp/B/2HvXn1rz6697631236j/AI8/7fn34daHRHvnd85dhfBXrHB763Vgqveu4d3b jj27tDYmMy9Lhchmmp4fvc9lpK+qiqPDR4+DR5pVp5P3pqaEhfNrUB+4PP238gbVHuF3GZ5J n0RxKwUtQVdqkGioKVND3Mq41VAE5/592/kHao7+7jM8kz6I4lYKWoKu1SDRUFKmh7mVcaqg mvSv86nrffe0s92Z2x1dW9CdQ4epm2/id8ZveZ3jX7133GIKyTZuzNm4HDxV9fLTUk4qsjVw gwUatAtQympi9gjYvfDatxs5d23m0O3WSEosryeK0suD4UUSRB3KqdTsO1AV1Eah0B9k97ts 3G0k3Xd7U7fZodCyvJ4hllwfDijSMO5CnU7DtQFdRGodHx+Onzr+O3ynoczXdM79g3LLtyam hz+IrMZmdvZ3EfetIKGoqsTnoKeVoJxE5iqIVeIkMmsSK6LIvLHPPLXOEUkmwXImMVA6lXR1 rWhKuAaGhowqOIrUEAfctc9cuc2RySbJcCXwiA6lWR1rWhKuAaGhoRUeVagjo29HmKWsUGKR WJt9CD9f9b2LA6k9C9ZFbA6eFNxf3fp0CnXdvfuvAU69b3VvhPWwOvW97HDrVOu/fut9e9+6 31737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvem+Hrw49e976 91737r3WKT+z/rOf+Tbe9HrR6j6R/j79XqtT17SPfq9br12Bcr/gR70Tg9eHHriV5P8Arn3s HrZOeu/9T/gv+9kn37rR67966r1737r3Xvfuvde9+6915v0n/ff4e/dWHDrF7r1brxHP+sB/ vXvfWh11b37r1OvW9+69Tos3yr+WfTvw66zn7N7gy9VBST1Rxe2ds4SGCu3ZvPOGIzjEbcxs 8sKOyoDJPPPNFBCljLKhZAwX5t5w2Xkvajuu9OQpOlEUAySvSulFJAOMkkhVHEioqFubebtl 5L2s7pvLkKTpRFoZJG46UUkDhkkkKo4kVFagtq/8KGeh6/J1sG8uiu2NsYpHnGMyO38ptPd9 XURrq8D5DGVk+HFOzgLdYqioCsbamA1e4bs/vIcuySst9t9xEmdLI0chPpVSY6V+Rb/L1Ddp 94zl+SVlvbC4iT8LI0chI/pKTHSvyLf5ekzlf+FEPWkOIyFRg/jpvrIZuKWmTGYvLb1wOHx1 bDIX+6mrMxR0lfJTmMKmlUo5tZa11Clilm+8ltAgZoNsmaQEaVaVFUjNSWCuVpjgrVr0nl+8 ftSws1vtsrSY0q0iKpGaksFcimPwtWvl0ez4OfzQdkfNPC7v8exsn1jvDYs2IOc23X52n3Pj Z8dn/uFxmRw24oaWgaf10k6VEUtDEYz47GQPdZG9vPc+x5/gn8O3a1ntiuuMuHUq+rSyvpQn KkMCgpjjXof8he6VjzzBNpt2tZrcrrQsHUq9dLK4VCcqQQUFMca9WR4rdFJlADDKjcAcMCee fp7k1JA3Ulx3CScOlUragD7c6Udd+/de6mwC0YP+qJb/AIgf717sOrjrP791vr3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917rr3oevXuoszXa3+pH+8n6+99a6w+9Edb 67P9P6f74+9Ux1odde69b67H+9c+9jrR66+p/wAT72ePW/Lrtvrb8KLf8VPvXWqdQXbUxP8A tv8AW/Hu4631x9+6914C5t78evdePJ/3r/W96pjr3TFMbyv/AMGPtk8et9Yveuvde9+6910Q Pe+t16i5A+PHy/TVLx/T0r7YuW/T/Pq6fFXpGfT2iHSjrpvoAPqffut9cG/Cj6D/AHk/k+9d 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 Sm2sdr1CYzOYo5ebKrkslm6+rNQK2OSrq3lqZhUy1GqKNtCxhgAeebv2/wBytbd+VPEgkt0E Qi8I6ZF1ltTOz6tYLMSx1s9VXAFegFzfdcmX8ED8ua4XgQRiPwzpddRbUzlq6wWarHWWqBil ej4fy+dlbk6K23ndxZuCpxe5+yJsLI+JmDR1OK2/hVnkxcdZGbGOoqHqppZYm5RBErBZA6LM vs/yze8s7ZLuF+pjnvdB0HikaatGoeTMWJK8QNINGqBJftntN1y9YyXl0Ck12UOk8VRalajy ZixJHkNNaGoGxB8fd25PMwU7VDu2oqPUSeCoa9z7yCsJWkFT1kTsdzJKoLZ6PrSXNPGT9So/ 3r2dA46GaioHUix/H1PA/wBf3vrdPXpyA0gKPwAP9tx7v1brv3rrfXvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+69173o4HXuuibAk/gX974Dr3UAm5J/qb+/da67H1/wABz78e vdde/db6979Qde69+P8AX5/2H491p6da8+u1/J/oP95PA9+PW+sMrWU/1PH+3+p9+A691E92 691737r3Xf0F/wCvA/4n37rXXEmwJ/oCffjw630n2N2J/qT7YPHrfXXvXXuve/de67A1ED+v 1/1vz79w6901ZqT9lF/1Ten/AFhx7SXRwq9Op0mTb+n+J9pena+nWH8s39OB/r+7dW8qdYve urdYp/8AMyf8F9ty/Aetjj00e0PV+ve/de697917r//X3UMSnkroo7XLagBwL+k39hK2XVKF 9enWNBXpxZSGYf6lmH+2Pt44NOtgE5664HvXVsDrwPv3XgeuDgghh+ef9iOT7sD17PS/pv38 ZC39pF/3o8/X2dxHVCp6TNhuo3v3Wuve/de67AJ9+61WnWeBtDqTzY3/AOII96BzXr3Hp81X +n09qKY6rTruwP8Avv8Ae/eq061WnWUDUhX8/j/XHPv3n1YdY/fuqde9+691lifRIrfi9j/r H6+/dbHTv7t1frG44v7917rH7917r3v3Xuve/de697917r3v3Xuve/de66P09+60eHXD3Xqv Xvfutde9+69137qONOt+XXvduvde9+6911791rrv37rfl11791rrv3o8Otjj173vr3RQvnn8 ga34v/ErunubDPCm59u7ZjxmzGnijqI4t57tykG09sVr0koKzJSVdbFWSxEWaOFwbC5AN9wO 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 G7fmaJ/gY9A3vPKfxvd258vr8i5LP5asjYXt4Zq53gC35sE0gX5t9fYE3+8/eG+Xl9WolmkY fYXJH7BQdBrc7j6rcZ7n+OR2/Isafy6Od8OsI/8ACt25wagK7M4vDo2nj/cZStWTKr/4/eIW H+C+5y9kbLTZX24H8ciRj/aKWP8A1cFfsHUke3NsRBcXX8Tqn+8gk/8AHxX8utjb4gbWE0VF LKha5jPIv/rf72feTG0RV7j1ktytbatJ6ue29QRUmPgRFC2jXgfgWsB7F8agL1LMKBUFOlB7 sRXp7qRAvLN/yCP97P8AxHvwFOvdSfduvde9+B68eve9161173utevde9+pXr3XvdSKdbHXv euvddgXIA/Pv3XuszwMqB/wQSOfrb68e/de6we/de6970M5691Flb18fQcf8V9749a49cOD/ AK/vWR1rI68w54+g4H+w/PvwPXq9dcD/ABPv3Hr2T14Hgn/YD/Y/09++XW+ulFz72TQdb66d v1N+B/vh71wHXum8m5JP597691737rXXJeLt/T/ez7917rj791vqJWNaEj/VED3V+HXh00e2 et9e9+6912o1EAfn37r3XNjdgB9F4H+w9+UdbHSOr311cx+lmt9eLD6ey2Q6pCfn0+vDpvvy W/23+v8Aj3X5dX64+7de697917qLVkeK3+qYf7Yc+2Lg0SnXhx6aiv8AT2i6dB642P09663U dcm4so/H+8n3sdaHr1//0d0zHOI6+kdiLCeK/wDyVYn2D7dtMyn59KGFVNel9uans8NUBww0 Mfxx9PZvfJkOOmYz5dJX2X9P9d+90698+ve7Ade6U23ZbSzRE/rXUB/ip5PsxsGyU6YkGOlD VxalEg+q8N/re10gxXpny6bbX+p9tV69WnDrvj3rrXXvfuvdONC/LRn8jUv+w+o/23u6HNOv cR04+3eq9e9+691l/Ut/yP8AfH3rqwPXA+9nj1sivXre9dep1Ipn0yW/Dcf7H8e9g9bp05e7 de6xOOb/ANfe+vdcPe6da6973Qde6971gde6971U9e69791vr3vXXuuj70etHrh711Tr3v3X uu/eut9e9+HDrx49e97695dde/da65hT9f8AfX/pz/vPv1OrAHj10VI/x/40Lnn/AHv36nXi Kdcffuq9d/j3ocerfh61N/8AhRRv2Sv7k+OvV4lPi2p1nuffjQBAq+TsDdI2+kzyD9Zttoqo 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 5lp8pAcVuGCnqQEZ1Acx6W+qk+9EU69Sh6J//Nk7a+Kew+itn7G+V3yN79+MG1+0+wcbQ7a7 H+OORzmC3+M1tiL+Kz42bceFw+b+zx0kUmqt81IFdRYOCPexWuOtgdHP7c796h+Mvx6y/ffZ G8Ko9O9f7W23lcpvfHU9ZvSprsDlKqiwWFzdOu24p5Mh93JV0z+aljZXEhlHo5Hhx60RXHXG s+UvQmH+Om3/AJYbo7IwOy+gtzdd7R7Sxm/96Sy7ZoW2hvvC02e2nNNRZRY6payuhrKaOnxo hNVJPItPHC07CM2oOq0NadVpRf8ACgL+W60tJkKrencON6+r8wcLQ9v5L4/9r03WVVV86TDm BjWrCCQRoNAJVsS0aqCR4qet6T1YL3R80vjf0N8cI/lrvnsWiq+gKim2nXY/sLZVFX78xuXo N75KDE7ar8PFtSOqlqYaiaphXyQowUEl7BTatDWnWqEmnVYOP2D/ADut373xvcafN34s7X+L 28ux8f2hU7U2z1cmX3lsf4zpWpuTH7a2TWbr2CJsllcngZmiyEebqEmp6iONqbIAPIq7x1vt 9Ojg9OfzZvhJ3zuXorafWnYW6MxmPkfld8YXqYVfWe/sPRZzJ9dwTVO6qStyOToIoKF4EgkZ BVvH5ALx6ri+iD1uhoR1ZJ791Tr3v3Xuve/de697917r3v3Xuu/99/xv3rz6sOB66976r173 7r3Xvfuvddj3o9WXru/vXVq9dX/H+8+99a69z/vv9f8Aw96691Xz/Ln/AOZf/Jfn/uoN89Bb /wAub3D7setmvl1YMfeuq+fXX9P99b37rx69731Xr3v3Xuu/9j70erjj9vXXvfVOu/fut9e/ B96695dde99a697917r3v3W+ve/da69735de6796p17r3v3W/Lr3v2Otde9+635de9+/F+XX vLrw96PW167uP6/X36nVuvXH1/4r798uvdeJHv3Wjw6r4/lzm3X/AMl//Gg3z0/+Cb3D72ev Hy6sHv8Ann3qnW+uj791VuPXXvfVeu/eut+XXXvfWuve/de69YD37rZ49e96HDrbceve99V6 9791vr3v3Wuve/de6796Pl1scD1xH1Pux4dbPAdV87f5/mq9u/8AjPr46f8AwRvaXvfl1scO rBLe/V69Xrq3v3Xuve/de67H/Ee/Hrx69Y+/V69Xrkfof9f/AIn3ocetDj1w976t1737r3Xv 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 vqtzMO3MbX+aPGytnshjhSLkmkji+3qfLJV00T+/VNa9brmvSGq8d/woXyvWT9AzR/CLE7ln ojs6s+ZOP3dvRc+cC1EtFLvjG7FjogsW4GXVKKkYVIBMbx0ENllX3b17HXLfn8nPJ9e/yc+2 v5eXx33Lgd19wdoZvYm+N2dlb+kqNo4jfPYeP7h2vvbdebyRx8WTmoqaLEYFcdi6e1Q4SCBZ pXleWc+BzU9armvRg/lp/LLoPl5/LW60+Ju86jB4fuzpzqDrKLrHflLJNUY3a3c3XPX1Ntx1 TKCFahsJlXinxuQIgLfbTLVLAamnpwmgaGvW656VP8nb4b9t/BT4W4ToHuyp2hVb5x/Ye/d0 VEux8zW57AnG7lr4qnHLHkMhR0MhlCofKpgAU/Rj78TU1HXjnpPfzRfhH3J8w91/BXNdTVWy 6aj+Ofym2p3H2AN3Zuvw0020sLksfV1ke3koqKrFTWFaaTRDK0Kk6byC/HlIHHr3QKfzsf5R 9b/MZ2RsXffS9VtTbHyb6wqFwOMy+6qyqw+3979ZZmrZ8xtHceXxtNVTxSY6eV8liZvDIq66 2mKf5YJYfKadeB6W3eP8qzI/Ij+X98LeiMrv6HqT5VfDHrPoiTqfujaZnzOO2b251d13iNt5 +GGV0pqqow1dW4yGZZ4VgqEmpqGsVG8DUs2wc9aJoa9ISoy//ChqXaS9VxbO/l/Uu8dQwcny hj3VviTFmiWAIN3x9az0jFa82LvqwrUxlJ04tYrKN46r29S+pv5LWE2N/Km7U/lw7q7e/vPm +18tkuwa3s6k2ucfitq9m/xDDbg2xLhcC9U1TPjMfXYHHpUeSrinrITUj/JlnEUWq5r17Vmv RccT0p/woNwPxwh+EtDJ8HJ9o0uwx0njfk1Ubo3+N643rOLbx2rS1iU6RqxyMVAqU0WRfbEk 4X1tC9V/la77ePW+2terj/5ffw62/wDA74ndW/GnB507sqtm0mVyW7N4NRnHf3q3rujMTbg3 Ll4Me0kpgphPP9rQwtIzJSwwrIzyB3apNT1Umpr0dD3rrZ4V66976r1737r3Xvfuvde9+691 737r3XfvQ4dbPGvXXvfWuu/fut9de/da697917r3v3Xuu/fut9V8/wAuf/mX/wAmP/Gg3z0/ +Cb3D72etnqwb8e69a8uuve+tde9+691737r3Xvfut9e/wB9/tuPehw623Hrv/fX9760B13x 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 x/V/Vm4q/Ib0zNPUZ2eBKiaminiaOjgZp5bkRoxB96oKk9bU049WlEFGswIINiPz/Q+0hBHW +qcP5fXwJ7H2h/JE2j/Lg+SlNH132Bun4z/IHoHsgYHMYXdY2vD3Tk914xq/G5bCTy0VXJDj s5FUp4pyuv0MwINlIkBc+nXjx1dQ/gHmf5vmzdr9P/EX5OfFrqbZ23eg6fZew9xfOrAfIXZ+ 8Nu94dW9YRQ0GPqtk/H6hoJNxUm4dy0NDTYvJS52XGU9IKmpytODPFDii4adaOnj0hOsvin8 p9udZ/z1cHluiM7TZv5wdod+7y+OOP8A7+dNTru7Fdh/HSh6c2xFmKym3K8WInbI0TVVSmRM axUsiMGebXAu+rDy6K1vnrP5YdW7S/krdTdW/Eo9pfMX4JfCqpPYW3OtvlB0d1P8heuqPbnU O0vjXlRi9y9jwbi67yXX+78imSWWizkctZkKnG0tRjo6NsRkn97631Z5/LO3Rldr5XuTpfsr 4U90fD3vHeedrvlR2NlO2e1+k++an5B7n7Irots7y7Pq+y+hspW4inyNPVY6kxf8EfHYmnp6 CKijxNElJBLBR660ehR+Y/VfYPyO7q+LvSO5Pj1UdnfDXG77ru1/kpm83mOnMhsfdGZ2fgKo dJdd7m6z3nlP4pmsLSbmmpd15jw4shKnE4lIVrY5ayKL3XuiIfzOf5bGTxz/AA6+Q38r/wCI HUO3Plr8WvlRtHtign6yw3SPQOG3X1GcRV4Ltzq/sHck1Tgnlx+4aGeGmQU8FZIpjdNMEc8k h3177ejF7h6Z+Qu8f5t3xn+X46H3bgeldnfBrtrpTeeUy+8+l5c3tjsjszsfB73x2Gq8Bht0 Vc9TBR0+Jmgra3HCoi88kQgM0XklT3l17y6rM7l/l+fODfP8vH+dz8bcH8dMmezfnd/MJ7M+ Q3x/pqvtDo2nw1f1fvjP9dPjsnuvLf3nZMZVQ02z8hPUUTq8gM1NGmtmlMXq563XPVnXyS6S 797S/mYfyrvkvtXpbcv+iX40bO+bGN7pzGU3d1HRZPadd8kests7X2NSUuCj3JLUZJ6SswlQ uWbHrNHEkkT08lVd1TXVvLq3D37rRHXXvfVeve/de69+PevPrfEde9+60Ove/de69791scev e/da697917rsjk/776+/Dh17rw+v+8f7f37rfXXv3WuuaHm39ffuvdZffuvdVd/ypP8AmWHy 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 5afzP+2+l9hfEyu3nm/kX2p25tndclbvna3f1HnaT4n7v33jNn0FDJszcdDA1bm9riCOsq0e V4q6BSLe63XHXq/rz+YH8G9m/wAwz+XP8f8A4bdjd47b+afcvenYHwg+TmyqrZ9H0V0lt/5c 0/2/YGF+SuXyFfFkNvf6Pqyqra/GyR4qsbLqqRxIoKj37HWsdDDun4Pdy/ys+0f5cny0+M/S u+fl5tD40fBeT+XF8u+s+lcTtuTvfc/VS5Wh7O2v3N1Ls/cFbjKbMVMe+qerrMthxWpU+GsV o7xtV1NNoZHW/t6Gf4Z7d7n+LvXn80P+bT8qOkd44Dtv5Wbhh7/k+Me2X2/ne3dk/G/4w9Vy bO6K653LUxTR0DbubCRVtXkaNa801K00cbyRTiqjj31rjjq7Pq7fA7O6y667JXbuf2gvYWxN o74Xae66WOh3Rtcbs2/T54bd3JRRM6w19F9x9tWRK7BJkdQxAv71SmOvdawlf15/MD+Dezf5 hn8uj4//AA27G7x2380+5e9ewPhB8nNlVWz6LorpLb/y5p/t+wML8lcvkK+LIbe/0fVlVW1+ NljxVY2XVUjiRQVHveOvY6Ffc/wk7m/la9p/y5vll8Z+ld8fLvaHxo+C7/y5Plz1p0tituSd 67n6qXLUXZ21+5Optn7grcZTZipj3zT1dblsQK5KjxVitHeM1dTTe69x6Rkv8rL5H/Nr4c/z Z+2O59r0fx/+Wf8AM87K6q7e6b603TWYmvz3SO0/iDT4z/ZPNmdq5zFpUU9Pm6lMU8e4UpXq IqGCvZNH3Aqqdfdb8+hZ2nSfM7+aH8svgFuj5EfC/tT4YdWfy8dy5vvvv490f3ONH3L8uP7k Psvr7bnxw/u3ksv/ABbauDrKjI5t9zTmKOWJo6eMR1CxyS669w62Qffutde9+691737r3Xj9 f999Px7917qrv+ZB/wAzQ/lQf+NRNjf/AAH3dHvx4de6tE9+691kTgO/9BpHH9p+P96v78fT rw9eozn6D/Y+99e64e/deHXvfqde697917rxIAJJsBySfftQUVPXuJ6Z6qoL3A4W9h/j/ifa RmLdaPHrumpdVpJBx/ZU/n/E+9onmetE9Oft/rXXfv3XuuvfutdYqinp6unnpKuCGqpaqGWn qaaoiSanqKeZDHNBPDICro6kqysCCCQRb37r3Wrx/wAJ8v5fnyF+JHeHz8zHyH2ju3B7e6u3 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 1fXq3UYE/m9vbPy60QOuXB/2Pv3WsjqZjquSgrIalD/m3Gof6pP7Qt/re3oJTDKHHXjkU6Gu GWOohjmjOqOVA6n+oPPsVowdQ68D0mOD10RY29369117114GnQdbmwz0kxyVICIZG1yBOPFK TyQB9Afx7Ir61MbePHw/wdPq1cHpTbfywyVKFc/5TAAso/1QH6XHswsrkTx0PxDpt10npQce 1vVcHrq3v3XqHru3v3W6U49e9663X069b3vqpHXXvf2da64uiurI4DKwsykXBB+oI9+Kgih6 90mGjkwVT5IwXx87fuKOfESfrb/D2XkNaSalyh49X+MZ49KeORZUV0IZXUMpH5BFx7Xhg41D qny65e99e68PeiOtg0PXj73XFetEUPXveuvdTIm1ID+Rwf8AiPfvPr3Xbi4/1veuB691i976 91xZQwsf9h/h70QDx68DTroEiyn/AGB96Bpg9bOcjrn7t1rrr37r3UnyroC2P1vbi1wLf6/v Xy63XqP731rrkOQy/wBRcf668/71f3o+vXh1x97691737r3UiORArBhyVsOL2t+R71TrYPWB jckj8n3sda67+qH/AGlr/wCwbg/7yB7159e8uuPvfXuve/de65J9f9f3o8OvdZfdOvde9769 173rr3Xve+vdcH+g/wBf3tePXusfu3Xuvf1/3359+691kl/Xf/VKjf7dBf8A3n34dePWP8D/ AGI/4n37r3XvfuvdYD9T/rn/AHv37r3XQ/P+t/xPv3Xuve/de6zL+kf778+/de65D6j/AFx7 8evde9+691737r3WQ/5pf+Wj/wC8qvv3n17y6yJ+hf8AY/7370erDh1mBv8AX6+6+fWqdcSv 9Pe69bB67C8c/wBR/wAT799nXq9cgPe6dV4nqB7317rsf8Qf969+PXuuvfuvde9+691kT9Ep /wBpUf7dwf8AiPfvPr3WM/U/659+HDr3XXv3XuuPJ/5F9OP6e/dW4ddEf0/px/r+9der1zce sj8ghfz+Bbj34de68D9f9f3vqp66t/Tj37rdfXr1j79Tr1euwAPfuHWsnrB9T7317r3v3Xj1 737HXuve/U69173rr3l173rz635de9760eve9inXusifk/7D34mvXuso+hP+w/2/vR6910DY +/cetdcuD/gfesjr3XRBHvdet9dkAWv+B9B9fegevddfWw+n+t73wz17ro8k/wC+4/Hvw691 lT0xyP8AlrRr/seWP+2t/t/fuveXWBlY/j8f8j9+62DTqFLMbmOLmQ8X/wBTf20zfhXj1brl DCIxc8ufq3/ED35E05PHr3HrPbgn/Yf8T7d61TPXY4BP+wH+ufr7117rgfe+qnj1737r3Xvf uvde9+691737r3Tbk8hHj4C5IMr+mJPyW/rb/D2xPMIk+Z4dbUaj0jsdj58tVNPUFvCCGdjz qJ/sg+y2GJriTU3AcenmbSMdL+KJIY1jjUKigAAezhVCjSPLpgmvWT3vr3XVve+tU697117P XVv6e9U61T069bj36nXqY6wTzR08Mk8raY41LMT/AEH9PdHZUUs3AdaAqaDoHsrkJcnVvMb6 GbRCn4VfxYewxcTtcSlvLyHStF0jpc7Zwv2cX3lSg+4lA8YYcxJ/UX+hPs3sLXwl8Rx3H+XT Ej1wOlb7MumusNTUR0sEk8rBUjUsSfzYcAf6/ujuI0LtwHWwCTQdAzkq6TI1ctTITZmIjW9w kY/SB/Tj2F55mnkMh/1DpYq6RTpvIv8AT/kQ+h9sjqwPXQsB/U/7H/Yj37Jx17j040sdlMh+ rcD/AAA9q4UoNR60fTqWDYgj6g39vU611Iecsmn6WuAP6A/X/ff8Tz72SOt16lYqLXOZWF1i Fx/TWeBcH29ax6pNR8um2NB0oLaj9f8AXv7MemDk1HXRN/oLD6Ae/dePHrjYfX36vXq9cST7 2B14AdSaSPXLqI4Tk/6/49uKKnq3l1//0N7Nh/aH0P1/wPst611x96691737r3XM+pf9cG4/ qPp7t1oYPSErYfBVTR/jUSv+sefZc66WK9KOIr1G91691737r3WGoS8ZI+q8/wCw9tTLqT7O vA+XTYR/S3P5/wBhb2i6312Bb37rRNeu/euveXQi7PyPkhkx8jEvF64b/wDHM8so/wBY+z7a 59SmFuI4dNSDz6Wji4v/AE9m/TfWL3rr3XGSKOoikglAaORSpB/IIt7q6hwVbgetg9BnPBU7 ZyqSpdqWRjpPNniv6o2/xF/ZCyvt9wGHwn/B09iRaefQj01RFVwR1ELBo5FDAj8X+oP+I9ns ciyIHXgemdJHHqR7t1sde9+63x49d+/de697917rr3cHHVCKHrr34nrXWOSJJkaORQyMLEH3 RlDjS3DrfDpigZ8ROKaUs1DKf2ZD9ImJ/S3+HtGpa2k0NlDw6se4V8+lDcEAjkHm4+h9rfs6 r1737r3Xf1Hv3WzkV669+611mhazafw3H+x/Hv3Xh1Kt70et6esBFiR72MjrXXR9+6110Rf3 4ivWwaddC44P+w96GMHrZ9R1y97611737r3XvfuvddqbEH+hB9+6915hpYj8X4/1jyPfhw69 117917r3v3Xuve/de65JySv+qUj/AGP1H+8ge/Hrw64+/de697917rwNiD7917rP7b69173v rfXveutde/H+x97631xb6H/ffT34cetdYvd+vddj6/7cf7cW9+PXuub8pEf9pK/7FWP/ABBH v3Xj1j/H+sf979+8+vde9+691hf9R/3349+6910P+IP+9X9+69117917rKn6f9v7917rn791 7rx4J/1/fuvddj8/63/Ej37r3XP/AHV/rSf72v8Axr37z695dZov0f7E+6nj17rL/T/XH/FP ehx62OPXQ+g/1h7959ePXL3frXl17349eHTf7917rsfn/gp/4p70evdde99e697917rKv+bf /F4x/vZPvR695dYjySfe+vde9+691737r3XgLkD+rKP9u3vx68OvHkk/1Yn/AHnj37rZ49de /da679+691737r3XR+h/1vfuvdYPfuvDj1737r3Xvfuvde9769173rrx69/T37zr1v0HXve+ tde9+691mUWA/wB99feuvdczwAP63J/3oe9efXuuve+vde9+691zU/W/4t7qevdcPduvddj8 n+g/3k+/H069117917rLL6Qif6lbt/wZuTf/AFuB7914+nWGSpGgxRi7tZiRb08W+v8Avv8A itCfwjj1YfPqMkSx3/LMSzN+eTe3PvwUL1vrKPduvdeP+9f73+fe+vfPrtuAF/pyf9c/X3rr Xl1j976r1737r3Xvfuvde9+691GqqmKkhaaVgAo4F+WP4A9tySLGpY9eArw6RMMNTnqxpZbr Apvf+yFB4C/4n2Vqr3Mmo8OncIKdLmCCOniSGJdKILD+p/xPs2RAihR00TU16ze7de697917 r3v3Xuve/de669+6110ffqdaPQcbqzHnf+HU7gxo377KT6nH0Tj8D2Rbjc1PgocefT0SeZ69 tnCGaRa+pS0MR/ZjYf5x/wDVG/4Hv1haaj40nAcOtyvTtHQi+zvpN1737r3Qe7uyhd1x8TEL GdU5H5b6hf8AYeyXcriv6C/n0oiX8R6Q9rD8/W5+nsn6e66t/vvr7316vWSJPI4X6gnn6nge 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 HHrfXof1W/2g/wC31D3tcnrw49SPdtPVuuz9T/rn/e/fqV69178H/XH+9H36mevdcH/Q/wDw X/ez70RQdabh1F9t9V69/wAV97635de96611yj/zkZ/o4P8Athf3scet9cB9B/rD/ivvx611 xb/iD/vPHvY691j92691ki/Xf+iu3/JKE+/Hrw64D6H/AGA/3m/v3Xuuvfuvde9+691737r3 XvfuvdRqqSSGNmjNiPqRa/0+gvex5AH+J9+49e6YTVVTmxnkseLKzKCAbABYyLi49KXAPJY+ /der1kjLsL3kYfQ6fIy/4j9hAn+21W9+PXqY65+MfTghrf0sbHTc6Qt7HgnSrr9eR791qn+r /V/xY64SoGLfkk2F/qTbTz/U8aT/AF4PvXWz/q/1fy6csfHopVH+qLvf6n1MdN/9hb37qw4d OMQuxP8AQf72ffqeXXj1IH0J/wBh/t/eqdV6696oevddgfn3sDqwHXK31I/A/wB5+g9+p59e 8+uHuvVeuz9AP68/8U97691BnxOPrrtV00cwQFvWoNyeFFz/AI29qYbqeE1iYjqrRo3xDqDT 4PFUT6qWjhhYc3RQDc8393kvbqcUlcnqoiReA6c/pwPafpzrv3rr3XvfuvdcpPSAv+pHP/Bj yf8AinvQ9et0zTqP791brw/J/wBgP+JPvfWvPrr37r3Xvfutdet7916nXJvwv9PeuvceulH9 fp7317h12Tc3966tw669+631xd1jUs7BVH1J96LBRU9e6aaaE1lRJXzr6ATFSRsOBGjH92x/ LH2mjQyuZpOHl/n61wwOnf2r61Trl9B/if8AevfuvAdde9dW697917rr37rVOoOSqBS0c8lx dYnP+2X+v+8e2biTRGT8uvAVNOgWkYu7uTcsxJP9bn2FWJYlvXpRwx1w9663173rr3Xve+vd OEXEaj/C5/3v2tiFEHVD1k9ude697917r3v3Xun3CrzO3+AA/wBj7U2oyx6o/Dp+A/J/5H7W V8h0z9nXRFyT72OtEdcQCTYfU+/da6mIgUW/2591Jr1vp8hGmJB/tIP+35PtWgovW+svu3Xu ve/de69791759f/T31fdOqdQ6pirIw/xv/re082D1YcOobqBZ1/Q3/Jp/p/xT2wR17rH7117 ru1xb8j6f4/4e99e6kRIHhqF/rGw+n9V9uIKow+XXgacOiN4T5K4nN4bEZmPa2Qp48vjKDKR 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 OrDAr1CHHJ/H0/1/afr3RHP5i3aHYfTvxQ35v/p/sio657gxmY2NQ9Tx0/XmL7WbsrsbcG9K Hb+0ul5dhVyioq4921dVHhZKjG1NLVUCznIipjhpJg1kGps9ewMdDt8fe7dofI/pbrnvDYxr Y9t9jbapc5Bj8rR1uOzW38mkj4/ce09wY3JQ09RS5LD5KCrxeSpp4I5IaqnljdFZSPfiKHT1 WnSzytV9xUlFP7cF1A/BY/U+0Mzh3xwHTyii9Nvtrq3y6wVNjE39eP8Ajftuanh9eXpr9oen Ove/de6dMUfHkKNvz9xH/vLWt7dtzSdT8+qngT0NnsWjh0l6xzxiWGWMi4dGW39bjj3V11IV 9evdBRKhjlkiIt42K/7C/HshIINOnqVz1w96HXj119ORwRyP9hz791odCvj310dNIf1NEth/ TixPs7hOuJfs6ocHqT7e6r03ViWYP+GFj/rj2nmXNevHh1AY6R/vXtnqvQY9Oc9Q9V/+I32P /wC8xS+/Hj17oV6Jv1r/AKzD/ej7fhPl1sdTvb3HrfXfvfXusDve4X6fk+9Hqp6//9De31EG 1yGUAWBYOLfgWZJQP8DrH9D7QVpnqv8Aq/1ef+HqXTAvIC+oqvP7hk03HI4qHC/8mn25HUnP l1s4H+r/AC9ObNxe/wBeb83P9DdgC39ASAo/A9qPl1XP+r/V/sdRibn+gHvxz1U56w1Eghhl lvbRG7f7ELce6udKFutjJx0EruZHaRvq7Fj/AK5N7eyQ8a+vSsdBx09/zKTq3/xHOyP/AHma X35uJ68MDoivxh+UHdm3v5pny8+DHyJ3Fjc1tvcHU/Xfyu+DmYTbuG25V1vTVVWy7E7n6+yN Zi4YUyNdt3copxSmWSeskoXaqnKoQFMrRE0CQcTg9MyEnHTp/MO+Wvemzvlf/Lk+DXxS3JQb c7f+U3dOZ373NuWfb23N2PsX4d9G4Vs/3JWPj9yQ1NNQV2dM0ONwGQngIapgmhi1TFV9rOm+ ilfzFv5uWP8Aib8lN59O7E/mAfy/Nr1G6Nhbf2pkOvfkHWdsz78+KHacMldFX7+hXoTZm66T PpkKLI4muk2hvbI4N4JaESR5FaKvdaf3XurRN+/ML419T9JfHbsntX5SdYZTYPcNb151z173 7W5zbdBsbubf+9MBLWYHJYbMbZLYSD+OJj6/IoYJY6KFFkAkjiTgn3FXkcIgrQE46eiNAa9B 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 +zr3uvXvLrq/9Lge9fb1rrlc2/xt/wAT79TH59e6QfYv/Hv44c8786t/9+diPdqU69XHS+vb 6/7f23SvDr3Xdwfof6e/U9evdeJt/vX0/Pv1Ot9esT9f9t/xX377Ovddk2/339Peutdcfz/r D/e+Px7t5db6R+/tjbU7P2NvTrXfeHh3FsbsPam49jby2/UzVdNT53am7cPNgNxYeeooJIZ4 0qqOomgZ4ZUkUMSjqwBFgSM9a6rTpv5Hv8qmlqKeqj+HOxmlppop41qd1doVlO0kMgkRZ6Sr zrxSoSBqjlRkYXVlIJHt0SOeJ62AOrL9j7F2V1ltLBbC652ltvYmyNr0KYzbe0NoYTHbc21g sejtKtHicLiY4qenj1s7lYowCzMxuxJLbHPVuq+e7/5On8tP5E79yPZ3a3xT2dk975iolrc3 mtqbm7H6wTO5CokEtVlc7iurs1hqKtrJnGuesqqeSaVizSOxZidiRwKA9a0jo6fSPQfTHxt2 Fj+sOh+tNo9V7DxsslTDt3aGJgxtNUV00axVGWytSL1FdWzLGgnrq2WWok0r5JGsLVJLGp63 w4dMW2fjF0Ts7v3sb5Rba68x2K767a29htqdidixZHPS5Lc+39v4/G4rDY2qxtVVvQRLBT4f Gxq1NSRuRApZiWctvUSNPl1Wma9MO+/hz8ZuzO+OvPk5vjqLbmc766qpaSj2H2Y9RmqDP4Ok oKmpq6CmdcXVQU9YkElZVNAtdBMI/K4SwYj37UwGkHB60BnozI4916sOi3fJX4gfGv5h7c25 tL5K9UYHtfb+0c++5ttUWaq85jmxGaloHxk9VTVu3qujqNMkEjJLA8rRPZGdGaNGXwZlyuOt EdCxv7a0uf613psvA0GAM2a2NuPa+GxmaSspdqmXI4CbFY7H5dMKBUR4+7pHOKQCRYdXiswX 34HzPW69FW/lzfHLffxU+KeyOleyNudHbU3Zt3M72yFdhPjpVdh1vVFPDuHdlXm6GTB1Had8 0ZpIZ1et+49AnMgi/b0+9yMGNR1rgKdHm9t9a697917r3v3XqdcT/h+eP9t9fex17rxta3+H H+9D6+/DrY6QG7wRuDq2/wDz3eQ/99luL3cdaPS69+691zA/qP8AH/Ye9V68Ouzz/rfge9cO r8Ouj/T+nv3Xh173vr3Xvrx7117ru/5H++49+61TrxN/9b2w7eS9bAp11f8A2A/3349tU69T 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 p8etcOs1J8pviz2L8Yqv5r7H7p2XmfjLRbc3lu+s7poaqrbZI2z19mq7bm9MxJUvCswjx1dj a+mqG8Nw8L2BFiS68svF74sN/h6UJJTB6DrYvzA+MPZdT2pSbL7w6/zEnRuyes+yO3qh81Hi 8d11sDuPYLdp9Zbv3blcyKemo8fl9uo+YpqmWYItMrPKYwOCVoZYyAykaiQPtGDTp2o9egB+ P/8ANl/lxfKTtVukOhfl71F2J2q/3QxmzaDJ5LE5Dcz0MElXWxbKqNx0tHTZ2SGCGaoljw09 Uywo8zARKXFpLWeJdbqQOq1UnB6Wu3f5qfwKpOrune+m+U3WWG6e+QCdoSdS733bW5XZeB3z B0rU1lJ2nLQSbtpaJ6cYaTH1i1LVkcIPjvH5FZCz1v8AVW0pCqTSlR9vDqraWGejEfED+Yr8 J/ntTbvm+I/yJ2D3XU7Akoo964fbdRkqHcO248lJLDja/I7c3FTUVcKKpeCZKavSnamlZHWO VmUgCFSWFSKfb0npToEt1fzqP5UmzO0d99K7s+dfx/w/YfW9Hn6remFq90StjsRJtaneq3Di I91RQPiKvKUaxSrPiKKvmrlkjkiNP5UdBelRQ9b+XR8sDXbX7F2jtjsLYGYos9tLe+28JvDa mdxzO+Nz+2ty4yLNYHM49pFVjDVUs8U8RZQSrC4B9oZrMN3RYPp06r0weq5++v5q/wDLt+MG Y3/tvvn5Z9U9c7o6v3XhNkb42lla/K1u8MPufcOCj3PjMZFtHCUlVkqz/cfNBV1E1DSzRU0c sJqZIvNHqRiCYmmk9Oal416T+/8A+cN/LC6tyPVON3t83eh8PU917dw+7+t5qbdZzeOy+1s9 VNRYfceVzG34qqkw1FPMksSVOanpI9UU6lgYJtGhBM1aKcde1AefRrPkV89Pir8KNkYjf3yu 756+6b2duGqlotr5HdmXJyO6aqmp0q6um2lt7FJU5LLPDFJHLOuOpJjGjoz6Q6kqbaaWuggs P8HTbotKjHTF0l/MQ+HnzZ6X7k378Ovlh1dvaHrnaO4Kjc268alVVZDqOrfB11Rg94b3653N BRZWKgjejqKunNZRRwVqUs6QySBJNJj0zSnHoUvhHvjLdlfFDozfed7/ANn/ACny+59kUuTr /kLsDaFNsHZvbE8lbPGd1be2bRkxY+nkCiJadDYFCfz7316mejUW/PvR63QdYZo1ccgEfQ/4 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 EUlXUxGlVm8SNoBW/vy8c9eHSu/lxSnbf85P+fltDcknh3buHd/wE7IwiVRk8+d66yHxwrMR h8hiqipCvU0uOqI3x04jvHTTWhB9Qvv8PWvLqhD5eY+v3Z8H/wDhSf21tZJsx1Vif5vHSK5w YmKpq6XKR9HdndfUncphx1KjQVaUNRU0tVWEsVKwPNKQYlv7zHW/Pq9f/hQdlMXvD4l/DXam 1snQ5Pc/dX8y34Jba6gfH1C1LZ7cOV7AfcWOq8JU0muQocfTVE4qacNaM8cOL1Xj1rrYCY2/ 4r/vdvfh1Xz6js/4X6f192631j9769173vjjr3Xvdevde9+691171x69137317r3v3XuuSWD KT9Li/v3XupcjJ4gABcK1zbkk/S59+691C9269173Xr3Xvfuvde9+691hqIUqIJYHAKyoyG/ +I4PusiB0KHz68DQ16CXoGVm6X6sppD+7Sdd7KgYHg6F21TeM2/1re2LZyUKNxU06s3Go8+h g9qeqdcT791U8euPuvWuu/fut06//9HfTt/T3TqtfXr1/wCvv3XqenXf19+611737r3XRHv1 Ot169cj6+9ZHHr1AeHQZ9OiNum+qxJpMf+jTY2rV9Lf3Xpfr73inWvPpQo6pNII2LU4Jtr/1 P+N/x7r5de67WshuTGeL2vxa9vp/yP36nWupUFS4Osqw/Bv9CP6g+/efXhjh07w1cbEDUAfx z/vHvdfXq3Hporcq8dQUBssdl+tr/wCsfx/sffutdNkGRnlndCdUR1OOTdLD/ivv1OvdPWIu xqJDfllH+H9ePfhx690+N9T/AL78e9jh1ocOvXv9f+Re/db6pd+SP8h/4TfKL5K9lfLPsDc/ yj2/3N2vS7bx27s11h8i969c4+bEbS27RbYwWEoMbtzxiCihpsfTuKYOUM2uYjyOzH1fLrde h2+PP8sjo/4g9LfI/qzpzcnyH3tQ/IHZ+Qwm44O1/kRvTd24Ukj2plNu0VJsne+4PuZ9uSzp k5g1dSRM0cohqNDNAo9+60T0zUX8sbrHub+XX8a/hL8zv4l2jm+lthdP1M3ZG1d9bzw29dqd 7da7bSjpu0usez45aXOQ5GgrJaxaDJ1OmSpgdhWU7JNLAdVp1qprjpf/AAz/AJZvx4+E+8ux e2tn7h7y7r7+7Yw+H2x2B8jflJ3HuvvnvDP7M27UmswOyBvPdTgUmJpZCj/a0NLD52ipzVNO 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 ZVvTEQwTVEgok917q+r47dzUPyI6I6h70xu0t5bApO2evdrb7Gxew8HWbb3zsyfcWJjyFZtT dmFr0jkgr8fM8lJUgLoZ4y8TPGyO3uvdVj/Kb56/MTN/NPJ/y/P5bnSnQHY3cvWXS+A73+RH cHym3/vnaPSPUmE3rlJ8b111uuI6tx+Qz+R3JnYqeTIRGNUp6emMTuJVkmel917pK9b/AM6P buO+AfzU+V3yj6dm6Z7o/l37+3/0p8n+gMFvKh3PTSdxbVrKHF7Goeud7VEFOtVht61OXxEO EyVRS6ElqJow1XHTCpqPde6DfbP8yv8AmRfH/sr4gZT+ZJ8Sfjd1P8b/AJzdq7P6M2LuPofu Dfe7e0vjL3B2ph58r1LsX5IYbe+JosXXvlaiB8XV5DblUtJRSpLNLKWWGkqfde6GT5F/Pf5q 73+bHZPwN/lp9H/HbsHsL449W9e9pfJ/uP5V9i792j1N19XdtxVGU6w6fwuD6rxuRzVXuHM4 mmfMRVUoSkig4kAsX9+690Z3+Wp86q3539I733Nvjq6Tozv/AKD7v7K+Mfya6WbclLu+l697 t6nr4qbcFLt/dFNFAMjia6kqqLI4+s8CraZ4EkqRT/cze691Yf7917r3v3Xug07o/wCZO9sf +I033/7y1V7917oS/fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691Sr/Ow/nJ9a/wAonoPDbnXbuP7a+R3Z1ZUUXTPSD5Wpxq5PFYaSOXefY29K/HxTT0O3 8NA6o8qR+SqrJqelh0IaqqpPde6En+Zd/MH7L+F/xQ6E7X6d6q2r213z8nO/fjn8bum+r905 7J4Dbme7M7+M1Rj8ZNlsaj1IEcFJWGIqv1UM/pDA+690ovhT2r/Nk3z2nn8T87vil8YOi+oq fr/K5Hbm7elO88z2burI9jw7jxVNiNuZDA5GniSHHzYybMVMtYGLJNTwRgWlJHuvdWf+/de6 97917r3v3Xuve/de697917rpmVRdiFA+pYgD/bn37r3WBqqnX6zR/wCwbUf9st/fqde6xrXU 7yJGhZmc2BCmw/1729+p17qZ7917r3v3Xuve/de6DTtj/j1sV/4kvpf/AN/FgvfuvdCX7917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6oX+WX88Trbqv5wfFn4MfHXbS93 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 nEoUzIgp0WFPutMCrCEA917ojnwcLbZ/n5fz0sFuaXwZrs/q/wDli9k9ZUlUZDUV/XOyuh8z 15vLIYr7gAilg3DKkM4p9UXmcFyJbqPde6oP+fGOr92dJf8ACn/tnaqTZnqzb/8AMK/l7Y3c yYmKpq6esq/j9uLZ+P70ojjaRGgqHxdXVUtRkUdrqIGlnCmJL+691e7/AMKFspi94/Ej4ZbT 2tk6HKbn7s/mYfA/bXTz4+oWpbP7hy3YD7ixtZhKmj1yFDj6eonFTThrRnjh+fde6c/5cBbb n85r+fttDckvh3fuDeHwC7Jwa1Zk+4z3XGR+N9ZiMPkMTUVQWSppcdURvjpxGGipZrQg+oX9 17rF/JbKbh+Un88/sXb8sdXsLOfzPt17Hw9fSlvsKreXWHW+Jw/Yy03jHhZo6yqgSWWNyzsL vay3917q/wD9+6917/effuvdBj3S6jp3ti50/wDGNN9/Xj/mFqr37r3QnXvyOR7917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917pM71ztftbZu7dzYrb2S3dlNubZz 2dxu08NzmNz1+IxUuQo9vYoaX/ymtkjWmg9Det14P09+69182j5k9l/KHdvxG/mffJz58fy0 /nrifmL8rdu7X69w3e+9OnaLCfFz4YfGTa3cmE3BsXpLYGZzdbHlKWiqpIE/jOVfHRy5DITQ a4/K9bV13uvdbOXe2wvjR/M56g/k+4/5Xdl/KL+Xp2jmO190dgfHv4+5Can6r73392H0Xgan ByPJufFQZFtu1CYykj3Dt7K0eRpalqTKU/2si108Ai917pr6b62yf8tv+dJ8d/iH8d+6u9Ox vjL8zfi93t2Z2v0V3X29vHvFOld9dOVsFXtfurZ+49+VGQzONg3DLI+Aqaear8FTP5nkknki o46T3XutltZVc2F7/wCKkf7yffuvdZP959+6910Df8EH+h9+69137917r3v3XumrLAmBQBxq +vv3XumSEfgg8fS/0/1ufe+vdOVCgNShsPSGY/8AJNh/vNveq9e6fvfuvde9+691737r3Qad sf8AHrYr/wASX0v/AO/iwXv3XuhL9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvda9P86Hb2A253l/JGh29g8PgYct/OW6c3DlIsNjKLFx5LP5zbG4K7NZzIJQogmrKydm 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 ++Ns/Iv5RYnoqSeDtTffx/x22MNXYDG46CWlrI8bDnJJqitEB8EUlTKaOHwHr16nRpPkJ/Nc lj6Q+Aue+FHVmK757/8A5nU+PHxZ673/ALqGxdrYLb1JsBOyOzt/9uZXDx11TDQ7Kx8sS56h xivUGYtFE4ZCT7r3St+G3zq+TGb+WvZX8vv5/dPdOdVfJzanSmD+SvWe9vjtvndW8eiu8ulM lut9ibhyO14+wqHH5zGZLA5nw0VXRVyPJUB5ahIoKeGKSq15deAr0bP5wfLnYvwl+K/eHys7 IpazIbM6U2XU7mqMHj6inosjujNVVdBgNo7UoayrBihny+YrKDGQSyKVjedXZWAsdfLq3VUW 2v5jf8xLobsb4k5P+Yp8Uvjt1Z8d/m12jtLpLZG4eje2t8bq7O+NvbfaGInynVWyPkRh96Yq jxlc2UnhfGVVft6pWlo5UlllkLLDS1G6enWj0J/dvzt+bXZnzF7t+G/8tzoz47b8zPxN2Z1v uX5L9wfKXsbfe0ev6DePbeJn3Tsfpbr/AA/WOOr6+qzM+HhFfNkqqQUdO7PT1SU7RxSVWqYr 16vTLiv5021KT+Wd2v8AObfXSGe293N0d2nub4u9j/E6h3VQZXckHzC27v2k6zg6Wxe76amZ ZYazIZHHV5r48fLLT46aSf7WeSAxyaC5p1qnXHr359fP3oz5MfGLpH+ZX8cvjd13sn5rZjO7 L6T7Q+M3a29N503WHb+N29JurC9I954zfuPpUqMplqaOWkosvt2pkoXq4wkYmikkkprEDr2O ryB/UD8/jm3+FxYe9AenWuvMoPIH+8f72L+7U/1f6j1vrsKbHi9uDf8A3rn/AInj/ehsDr3X Er/T/AkfX/e/99/xGiPTrXWP3Qjr3XvewKde6cqILExnb6IpIv8Ak/4f4/ge70x1oHrDNUNU SM7k8/QfgD8Ae/V8urHPQbdN/wDMo+q//EcbI/8AeZpfr7t1odDrgmLRtGD+eeW4H6hx9Pej x6v0rEQKLWsf9jx/r/4e9de6rR/mLfNbuv4x1nxt6V+LHx7X5C/Kf5fdi7i6+6hw+6s3W7O6 X2NQbF21/fPsPsfuLe2OgqZ6bHYnF3qo8fSxfdVqpOKZjJAI5fde6Aj4p/Pz5hYz5wJ/Lt/m M9I9E7B7t3v0hm/kJ0V3B8Vt8b+3n0b2jtDa24Itvbv2ZNjezMbRZ3FZvFl2q5HrAIJoVOlI y1O1VunXuiiZf+bb/Mi7d2d8tvl/8NPiL8Xt6fA34c9hdx7LzlP3L3Lv7aHyg7+xPx3p5J+3 d5dUYXbOLrcBg6aMU9U+NotyMKyaONSsEk0op0917q/D4yd+7N+VPx36R+SnXlPlqPZHe3V2 ye1Ns4/PUyUecxmK3tt+DPU+JzNPEzxrV0nmNNUeGSSIyIxikkjKu2utdVrfKT56/MTNfNPJ fy/P5bnSvQHY3cnWfTGA72+Q/b/ym3/vnaPSPUmE3rlJ8d111uuI6tx2Qz+R3JnYqeXIRGNU p6emMTuJVkmel917pMdb/wA6PbuO+AfzU+V3yj6dm6Z7o/l37+3/ANKfJ/oDBbyodz00ncW1 ayhxexqHrne1RBTrVYbetTl8RDhMlUUuhJaiaMNVx0wqajfW+g32z/Mr/mRfH/sr4gZT+ZJ8 Sfjd1P8AG/5zdq7P6M2LuPofuDfe7e0vjL3B2ph58r1LsX5IYbe+JosXXvlaiB8XV5DblUtJ RSpLNLKWWGkqfde6GT5F/Pf5q73+bHZPwN/lp9H/AB27B7C+OPVvXvaXyf7j+VfYu/do9Tdf V3bcVRlOsOn8Lg+q8bkc1V7hzOJpnzEVVKEpIoOJALF/fuvdGd/lqfOqt+d/SO99zb46uk6L 7+6D7v7K+Mfya6WfclLu+k697t6nr4qbcFLt/dFNFAMjia6kqqLI4+s8CraZ4EkqRT/cze69 1YcCD9Pfuvdd+/de6DTuj/mTvbH/AIjTff8A7y1V7917oS/fuvde9+691737r3Xvfuvde9+6 900V9B5LzwC0o5ZB9HA5uo/r/vf+v9fde6ZFYE2bgjj6e99e67mid4yI5CjkXDC31/pz+Pe6 9e6ZkepSQxzPJqBAILEA3axtb3rr3XUkrtUnSxGmw4J5t7917p9p3d4xqJJFv6/n/X96691r rZz+aj/Mj7pqvmf3V8C/if8AF7fnxC+CvaXbnTu8Ze+u39/7N7/+Qe8OgMcmS7bbpnCbTxlX h8LTwB9GM/vRIrVSeOUaZZJKSn917ozHcn84hH+HvwP7q+JHSk3cfyA/mY57ZuzPi10bv3c8 Ww8fhs9mtuzbj7B3J2vuWlhqmiwmyYaef+MzYyOQ1L+EU0iQTfdRe690sfiH88/li3zMz/8A Lx/mKdM9F9ZfIav6Mb5JdJdofGPfm9N4dDd3db43do2dvTAYqk7Nx+Oz2L3BgKqWneejqlkN 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 6UnmjB8n9RpUDknSb2t/X3XrfWdblQWGkn8fW39PfuvU67t731oj068PfuvCvXPUf9f3rrdO vWB/w/33+2/3r3vj1rh13pI/x/2H/EH37rda9chz/vr+99UPXrf7D/W9+69Xr3I/33/Ee9de 69cC5JFhyT/T/X9+690mclkjMTBAbRDh3H1lP9B/tP8Avf8Are/de6ZwD9B9f99yffut0oOs yjT/AK/5P9ffuvZ8+sirfk/T/e/fuvHrmzKqlmIVQOT/AE97610y1NSZ2sOIwfSv9T/qm/x9 66uBTqL799vXuu/ewB17r3vfDr3WUKLf8i/3v3rPWusf9f8AY+7cet9cub3H++9X/GveutV6 5Af77/Wt/wAU96r1vrlb3vrXXfvfW+ve/de697917r1z7917rr3qvXuvWv7917riV96yOtUI 64cr/re98et9dgX5H+2/4p791rp/wdCKio8ri8cXPP0LD8D3rrx6eMjkrzLRwWLagGsbf8g8 fT/be/dV6ckiC+Mt+o2v9Pr78DTqw6nvIiLyw+n9f+J92631FVnnIAuEH9b/AE9+691J1BDp Fvx/sffuvdc9a/k2/wBf37r3UOorUQFYzqe3450/7b37r3UWgjkklac8IDwSOWbn6f61/r79 17p59+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3TNkciIQ YYSDKRZmH0Qf8V9+690nACx1Ekkm5J5/2J976r8uvSzJAt73cj0qB+f8fe+t9M0kjSOXYkk/ 7wPwB70et9copDG1/wAH6/0/wv7117rJrGrm4v8A4n/e/e6Hr3U6GaNefK6H/Dkcf09+611I NRGQdUrNb/auP959+691FlmQfp1c/wCPH+v7916nWKOtkiNw5K/0v9Af9f37rfWCoqDM5YDT /vZ96691G9+691737r3T5GNMUa/0VQf9tz7t5dVPDqfik1Vqn/UK7f7xYe69bHSt9+631737 r3Xvfuvde9+690nd0bei3PjabGzVMlIlNuLaG4RLHGsjNLtHdlFuuCmKsQNMz0Swu31VWLAE gD37r3Si9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfqde6 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 /lm/Ob+Y9sn+cb8n/wCUn8/u+Ov/AJaJsboej72677z2j1Js7pzK496qm2pmabbVRtnY9Hj6 T7GWg3JOkq1SVVVFVUqFKyWCZvH7r3TT/KL/AJpXzN+Wf8tT+ar8j+7+wsDuTtn4t7u+S2J6 azuP6/2Xt2i29Q9b9Bx772lHX4PB0UFJkDBkmMztWwyGVf25Cyen37r3Vif8gX5jd9/PP+WL 018l/kvujG7x7d3ju7uHE57PYnbOA2hQ1VDtDtDKbZwUceC2zT01HEYqOmhjZo4QXILMSxJ9 +691Xt/Nc+aXzg+RH8yjrL+SF8Cdy9P9Pt2X0PmexvlP3V3Z1Rsnu7b83W25MRkhn+t16r7N xWawOVxdRgoBBkKWqxk/8TmykVE0uPpqaqqJfde6qU/l3fGV/ip/wpV7r2l8sOrfiRS13x6+ Cmd7iwee+OvQm0+remzHtPCbSkw3fWw+pKCiSk2tuifHNXnMtiY0MeRfIiklNNOpb3Xuh46F 3X/OA/naddfKf+YP8Wtx/Bz409Mbj3RuLq7rv419k/EXpjuXeHyt2z1AKHL4HbfyC7U7A29n cgY4mFFSUUsNa1MMlDMIaCgpYKapf3XuthH+Rh/Mmg/mkfAHZnftbsTb/Wm/Ni7szXRHamzN mwPS7Exe+tg4LFZZajYlDM8ktJiazDZfD11NQSu7UZmejEs6QLUS+691rZfzzOufnDmP+FDv 8uCm6v8AkR1vs7O9hGkPwsyWZ6yx+apvj+cbhKXE77PYlLLTONyfxLcUGWytN9wJvBBUxU40 rEFHuvdM+5dmfP7Nf8KgO5etPjf3X1HsX5UZn+X509tbtn5K7164G7dr7ThxvSPXtb2V2Zsb qcGGhrMhkc1R09Li8ZkFFHBFXO8ifsKvv3XurAf5d/8AM0+em+Ovf56nxU+Z2/uue8O+v5aG we3X2X3xhestmbbw/YMmK2xvqgMW7uusTjqHBVFJFV7coamlpzh1E0FRPTVyzeMPL7r3Vlf/ AAnZ+SnZny2/lVdI949urslN9bk3l3VjsmvXvXuzOrtrCn252vlcFjfstm7BosfjKd/BBH5p IaVWlfVJIWdmY+691VB/woRoqn+X7/Mv/lT/AM57a1FVUW2ds9jR/F35RZGgpZ2gn66y6VtR SGpjiJhlra3aeY35TwyzqGV6GgAMgijEXuvdZO2pMf8AzWf+FQHR/WmNqqHenxj/AJRXTtN3 LuOsx89Fl9q5PvTcv8O3hiJsZl4vPSyT/wAcrtkpLTqCzDbleqkMheP3XulP1R/Nh7H6U/mD /wDCgXL9sYPYG4un/gR1PW9i9e7c2j1d13sffu6Mpj6uGHDbZ3V2ht7Fx5jKfxGskp6IVOXq aoQeXzaTot7917qiTFfzdvlJ1P0R1B/MPyHyg/lIdlhvkHL21kP5Su0fj10HtvsLqOm3buQ4 Sr7H2Xuzb+JO8aHeEkdNT1NRXS5yorqSmemrK6qr2hqKFPde6OF/N8T5g96/z0v5TnZ3QXyO 692rQ/I/Yux+wvgJl9w9YY3LDoPb24ti42v3DJ2VQvTyruJ8nmmyWWgWfzCCGqjp1IWIAe69 1vr9aY7fOH652BiOztxY3d/ZWL2TtXHdhbtw2MjwuH3RvmhwUFNuzcWKw0SolJTVtetRUwUy ooiR1QKAtvfuvdaAHTHxh+e/8iLcPyd6z7R/kybC/m3fFvs/srcG8KL5Iba23iOxO5c7sSvx cONNPu6alwO88tR46CliNdk8NmNsUsEeRlyc8WRnpZ0qh7r3Rv8A4TfIr4N9NfyIv5pHb38r GPuLY+4OuMjmewezfjv8wKLrztOp6Y7aydHjcHRin2bVY6bEV23spQY8QUbV6VBmbHulRHDV U00a+691k+U383f57/Hr+Uz/ACS++fj3neusV3B8t95Y/avZmApOrOtMJszecVRIfsNr4bAU +KOO25BVTssLT4ikhMQcuouPfuvdGDj+bf8AOD+D/wDOh+FXxC+anyP6F+TPRfzzxOSqYdnd X9KYLrHGdK5nwZPHz4jYeeFKm4qyDF5SDHtHW7iy2QNfQvMrU9FU6Xj917qP1r84f5xX8035 +fPvav8AL6+RHQPxQ+M38vDs4dQYfaXa/SmI7NHyV31is/m9upFv/PZClmzuJxmXq9t5Opmr MBU42fHY+ox8KUtXXCqqR7r3RrP+E5f8xX5kfzCdm/ODJfMvPbdyO8OjvklF1ptrAbb2ttXb tFsrGjFVVRltrfe7Ypab+JClqojClbVGSV1QMXOo3917rZL9+691pwf8Ki+79ud4dy/y5v5Q 03Z23esNu/I/u7afdvyg3ruTdmE2VhtkdEbcztRtTBZDN5/cNVTUK00jJunMR09Wy+StwlAs RaV1U+691D/4TW9y7F+NPzQ/mcfyhds9n7R7H6r667azHyW+IG6dp71wO+sDn+p9yz0WN3Bj Mfu3CVU9HV1MGHrtlVU9JQu/irP4y0oV4pLe690tKv5v/wA4L5S/zpv5iv8ALT+KfyM6V6S6 x6S6+wG7to9l9j9I7W3/AJTpzFHC7KqqmbaWHgpon3Bm8pks89NEu5KiagpqJqyYxSVMNHGf de6Nv/wnc/mI/Mb5oba+bvSPzk3Fs3sPvP4RfIVencr2vs3bWD2hS74p6mpzWFrErsJteixm MZ6PI7erzT1lHiqITU08Akp1lieST3XuiVf8LMMhS4n4dfCLK11FUZKhxvzn2xkKzHUlNHWV WQpaPq3cdRUUVNRzMqSySopjSN2AYkKSAb+/de6rJ/mr/IHqv+dB1V1b8RP5dH8mD5UbG+QG R7j2lm4e7+0fijsTonHdabWWnrMXnUyG8uuK7Mxw4muNRTjJyZ2upMfEkQqGEtTBTafde6Mn /Mo2j8rMB/wpl/lLdd/GjfPX6fKWi/loYzr3Bdq9q4TKbg2Ziq98D35tTsvtbJ7YpJVmyFVj 8K2ZzuMxs03iqa6KmgqmMEkt/de6su/lNfOz+YdS/wA2n50fyjPn/wB17D+U+4fjx03gu99k 9/bT6t2h1FWPisqmxMhDtmq2zsWixtE0NTjuwcXMUmpZZ6WqpKmP72qhkjZfde6L1/Kq/mN/ Jn5jfyU/5hf8y35B1nVu+Pml8OaH5x4z46d1P0p1ZjM91tjevvhntvtfA4/Dx47FRxiCTNZC qmyELLorImFPUiWFVQe691dD/Ip+WHdvzh/lWfFr5R/IzceP3b3L2f8A6bv747hxW3cHtSgy H9yvkZu/rzb3gwG24Kaip/FisTQwN4YV1shke8jsx917q2qaGKoilgnijngnjeGaGZFkimik UpJFLG4IZWBIZSLEcH37r3Wlv/wpa6R6X2R8nP5FdDsvqLrDaFFuv530+J3TR7X2DtTAUu5M UewOuoTjM/T4mkhSsp9E0yeGoDpaRxazNf3Xujpf8Kh+rOsesf5Ivyeg61652H17BmOxPjdL lodj7Q2/tOLKS0fduHSjlyMeAp6cTtEJJBG0oYqGYLbUb+691VXv75w/zoP5Xvxv/lH/ACy7 J+RHQO9/iX31jfjJ09U/Cba3Sm36Gq2Z1tkuq8fmdtpXdy5Wlk3HW7lqdsUczZGugy0NBR5j SIaKtofSfde6uo7I/mEfKTbv/CkLoD+XTit64eD4p79+JGZ7Y3Nsh9mbVnzNZvej2tvbKQZK HestKctDGJsLj2NPFVrEQjArZ3B917rH8Mv5hXyn7i/n0fzNPgrvreGHzXxx+NfUG2d3dQbK ptn7Uw+Ww+fyVPsaSpkrd40NJHkqxZGzeRASsqZEXyLYftpb3XutbH+Yf82vnv8AGWh7/wC+ e1/mR/KJx/aGX+TeCr89/Ky606M+KHyWye+8DtzJrSba3v2v2TTYKt3ZJmMMtXIS24sjQ5FI oqiopamikkjo3917q6H+Zf8AzZf5gWwe7P5Gm1fhhkesdrV38yTaO1c7vPr7sna2Nzux6vcX Ysuxzt+j3BudqaoztBhsWdx1TZF8JPHWS0yP4WM4iI917py+H/ze/mnfH3+efS/ysfnn8ieq /ltsHuboTNd1de752Z0zs/pyt2G1FtrJbpoqTH4/aVJSzGnWbBZnFT0mWqsnLIho6xKyJjNT n3Xutq3cO4MJtPAZzdW5cnR4Tbm2sPk9wZ/M5CZafH4jCYaifI5XJ1078JDTwRySyueAqk/j 37r3Xyi+7Mnh/nVsz+ZJ/PIT5EbF67+U/XPzp6c3x8NOp892rsrA9sN0v0/k4sdD/DeucxkW ydZLisRkNk1NHNTUyq0+38ktPr1vCvuvdb0vzD/md71rf5Bm6f5oPxS3Bh9qdi53499S9obS rZ8Phd243Zm8ty9gYHaPYW1K3DZ1a2iqJsPW1OYwtRHMJQk8DEMWQN7oBmnXuqC/kx/M5/n2 fGv+Xl8HP5uW5vkt8bsh1B23XdS7d3T8UcX0RtT7jeGO3Ztav3Bid/777Eq8eMglTuWPD1VR XY7a1XiIsUtZSw0wqzFPMLY4daoOt7zbGcj3Ntvb25IIJKWDcOExOchppmV5aeLLUEdfHBIy cFkEgUkcEj3rrw6I3/NiH/YrP+ZX9f8AsgH5kf4D/snXcfvY691pQ/ymfld8ruvf5VXTXXfW /wDwnRx/z02Ljtt9+U2I+UWWz+w8ziu2kzPc27snlIcn1tWde5jK5Knw1XU1G2psWmbklrUo DHC8AmSOLfW+jFfydu48f8QP+E3v8xbvX409v0lZ8mdj777N7P7K64zmwGjwfxy7JrsZgNpY fr1di9gR1cOUo5sNQR1MlfPE8E8sk1EQ0mOlY+690v8Au3+a387vjd/Lu/4T/bp+KUnTG1N/ fNjc+W232VsDGdP9ZbJ6v3rkq3fGAgxW2sZgdt4YUe1aOvrMzVrW1W36KGVTUSVADTKD7117 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 5398fNr+Xr/ME+BFJ0Xvbsb4aVG54Mx1b3lubNbSw+cFfmqfMYSuo63FIi1NPJHJkqavRsjS TQMKWSAVIeZYvde6dfi7/LY+b+B/na7i/mjfIg9BY/bvZvwS6x6h7EwHVe6t11cuN+QdP1ps TGdk0+0Nu7joWkXbEWcweZTEVNXl5apqT7VplMrvp917oJOpf5W3yH+NXa3/AAor+Rvbe6em sB1T8/Ose68t09nU3jnKh9qYWqwW/MpUZrteBsOgxVNSU2bpZ6p6N60oiTFVcoof3XujZ/8A Ca3qql6X/lH9Edf0fanUvdEGK3t3lUr2B0juPL7r67ypynb2XyDU2Jzecx2KqZJaUyfb1avR IEmR1UuAGPuvdG1/m/fBBv5kX8vX5C/FPEyYOh7B3Zt/Hbm6fze4ZJKXF4TtrYWYg3ZsmSuy UMNRLR0tdPTNh8jVRU8rx0VZUlY3PpPuvdEO/wCE8P8AKK7a/la9J/IDJfJ7PbN3j8ovkb2t QZ7eu6NlbizO7cWvXeyMKaTYGEl3Bn6SiqKirGQyW4shVyfbICKqGI6/AHPuvdBB13/JB7b3 V81/53W/vkDmdhUXxu/mcdW5LrXrrIbMz+QzvYu1Xybo1NubObZyFBR0kFTjJ0ir6WNMhMjy workKSffuvdVD/Hf4mfzQeuezut/5K2xe6v5Ruy9+fHDIP2TuX5BUPUe2e2PlRl/jbVVYzdF i9zdb9t7RyuKr5BSbionpxPjaeT0UFPLl9EU9VVe691cl/OB/llfOTtj5gfy3vnN/L4oeh95 b3+DNHmMDV9U925up2FgsxRJX0lXturxy7SpaOialeA5GlrqanqMf9qRSNRwzRtJHB7r3WwX 11jOwd3dFbFw3ySw2xR2rufqXbGM772/11Nm5OtB2DmtnQUvaeG2LUZqV8k2C/iUtdBi3q5j Uml8Rlcy6m9+691qNdLfyx/+FCH8qDMdwdLfy0u7Pil8gPiP2Z2TuLsTYkHyWqMqnYnW2Q3I Uhrsnm6eeGkX+JyQx0yV8tHk8hRVslN98KCinqZ6c+690MXx/wD5A/yf6m/lpfzU+vex+5Ou +2/5hX807TuntLctLW5TAdN4jdNHuHKbrxePTLjFQ1Ek0uS3HuTIZPI0+Ep4WapgpaekEVKs 8/uvdNnyJ/kefM/tL+Xv/Jb+MO2cp0pH2R8A+1Ns7y7znye+c/S7Zq8RiMlHV1a7DykOFlly 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 dVIEbtTVBOFFZLSYgCWM5HxoQR0fbPu8VpHJtm5R+Pt91Tx4vxY+GSNvwSx8UYfYcHo0eD31 /pg2vLBgpqfZfcmyq3H7lxGPrpUlfb+88C4qcTuHEzNd6zCVbGSklqUTmmmmgmVZCynEfe7T dN5guOWNyhG1cw7eyzRxtWiTxd0VxbvxltJQSmtNVI5GSSjDps7enKG6x7mSb/Zb1WikkUYk t5RSSGZeCTx4cKxFXQMlR0PnbfdO3u2ekesaYCPb+W7A7TwOF7D2pWVKR1GypOqnbsDsrBZ2 R2QxU9JJjaVVqm9EsE8El9Mw9h/c+ZrTmvYdqtpgIJbi+iW8hY0Nv9B/jd4shPBEEQIY0DIy twIPVNn5ZvuWd93O7i/XitbJ2tJlFRcG+/xa0aMAZZ/EaqjKsCvEdV/bq3hU9k7urd5ySM+3 YI6jE9fUbxmM0+AeRTkNwyxtytRlpo1lN+Vpo6dODqvk97JcrT3ss3ufvC0a9Qw7bGw7oLAk M05Byst86hmByIEReD9LNxhh5f21OVrWniqRJeODXXP+GGvmlup0jyMjOfLpr95FdBzr3v3X umLdGkbX3MWIULt7NNqJ0hSuNkKtq/Fjax9gr3JWJvbnfxMAVO23wNeFPpZejvlksOY7Apx+ ohpT/movX2D+pJ5qnqjrCpqZ5qmoqOvdlzz1FRK889RNLtulklmmnlJZ3dmZmdiSTyST7+fg dZyHj0IB96PXuve7Dh17r3vfXuve/de679+6914C/wDsPej1omnWQAfj3WvWuPXL377OrdIL tXsGh6l6v7I7UymA3duvGdZ7C3h2DkdrbAwM26d+bkodmbeqNx1eA2TtineOTJZesjpmp8bQ I6tUVDxxKwLg+/V9evdfO9/kbZb+X9293J8p9jfLH+XZ2p8oN2/IL5vUmB617AqviiO0dr9H YfszdM+I/h/cG96iZW2fHS1NdHW5YMHNNFFNUG/i5v17q3T+VbsrFfy9f+FC38wj+W90VUZX E/Ejf3Q+3fkVs7rCqylfl6DYG/BitmZyEYqpy8ksywQQbjzmLRvI801JHjEqpZno1f36nXui 3fCv+cb1p0v/ACB/lb8qN2fDL4sdXncnzM3l8U9k/HL4t7U3h0b1H2pvTffQOz83UZfe33Ge zeUSsODfMS5WsoK6KSegxdLSQrTy3qfeqde6U/wq+XnZv8vb5zfBHaPyy+MH8rram3fmdsjD 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 JNC5jkLQ1FPIk0MgSWGSOVEdfde6w9MdS7P6F6k606R69TMQ7B6k2PtnrrZFLn87lNz5ih2j s/ERYHbmNrtwZuSasrGpqOCGnE9VM8rKgLuzXY+690Jnv3Xuk/ksl+qnpmN/pJIP95RCP95P v3WieitZH4qdJZv5Rba+Y2c2pNmu/dk9SZXpPY+6cpmctWYvZWxNwZ9tx7jTa+1ZJv4ZR5LI zN4K3NR0v30tKBRmoFIWhbdOtcejCVFQIRpWxkI4H+p/xPvdacOt06aSWZiTdmJ/1yT7r1vp 4o8PLPZ5mWGP6+ogMw+v09+690+Lg6Rk0moIQfUJpUH/ABLH37r3XJcLiEIVpC7H6BqgAn/W CW9+691PpqGlppSsEIUBQ2vySM1yfoLn37r3UpHk+4kjYfthEeNrc8mzKT+be/de6ke/de69 7917r3v3Xuve/de697917rDJ5/8Adfj/AOQtX+829+691kXUFGogt+SBYX/w9+691y9+690W 7dPxL6K3f8oOrfmTlNozQfInqHr3efU21+wMRm8zh56/rPfUv3uX2PvDF4+ZKTM46Ct1ZHGw ZGGX7KreSopjE8spf3XujI+/de697917r3v3Xuve/de697917pN7y2tjt87Q3VsrLz5SlxO8 Nt5za2UqcHk6vC5qnx24MZLia2fEZnHsk9JVJFMzU9VA6yRSBXQhlB9+690HPx0+PPT/AMT+ kOt/jp0Fsyh6/wCoOp9uxbZ2TtSgnrKxMfQCpkyFbVVuRyUk1VWVtbWT1FdkK6qmknqqqaao mkeWR2PuvdDV7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6Ld0n8S+ivjt2N8 iu0entozbN3H8qewsf2z3TRUWbzM+19wdmUmIOGyO+MbtWrmehxmRy0emXNT4+GL7+oVampD z6pG917oyPv3Xuve/de6Lt8pPir0n8zOpqnor5D7Yqt89SZTdWyd2bl2MudzODw+8KjYG56b eOAwm7Bg5qeWuxRyNHSz1eOlk8NR4lSVWS6n3XujCwwxU8UUEEUcEEEaQwwwoscUMUahI4oo 0ACqoACqBYDge/de6ye/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3vRNOvdde 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 jqz/AG//AD7vhtgtvYbBxdYfJC1JTsMg67M6uYSVUjCaWWmb++S3DSFiS6A2txf2KNg+69zr suy2+1rdWFYkAYiW4ILnucg/SgmrEnIBp5dG1nzLtdpaJbLHJ2ADgvHzPx+Zr1//1K3ffULq Duve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv/9k= --------------050207060203090700000208-- --------------030501080004060407050706-- __________________________________________________ Ba:!n CC3 Sa;- Da;%ng Yahoo! KhC4ng? Ma;t ma;i vC, thF0 rC!c? Yahoo! ThF0 cC3 chF0F!ng trC,nh ba:#o va; cha;ng thF0 rC!c ha;/u hia;u nha:%t trC*n ma:!ng http://vn.mail.yahoo.com From michael.monnerie@is.it-management.at Wed Jan 5 16:05:35 2011 X-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_56 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 p05M5YSf237685 for ; Wed, 5 Jan 2011 16:05:35 -0600 X-ASG-Debug-ID: 1294265260-1ab7024e0000-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 542961D0EF9C for ; Wed, 5 Jan 2011 14:07:41 -0800 (PST) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id ZSlgp4e5ZS3O6Wjg for ; Wed, 05 Jan 2011 14:07:41 -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 89079400; Wed, 5 Jan 2011 23:07:39 +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 C1C8247EA03; Wed, 5 Jan 2011 23:07:38 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support Date: Wed, 5 Jan 2011 23:07:35 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.37-rc6-zmi; KDE/4.4.4; x86_64; ; ) Cc: Lukas Czerner , Dave Chinner , Christoph Hellwig References: <20101125112304.GA4195@infradead.org> <20110103232514.GF15179@dastard> In-Reply-To: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart6264039.utRq0FKL5I"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201101052307.38379@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1294265261 X-Barracuda-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.51533 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 --nextPart6264039.utRq0FKL5I Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Mittwoch, 5. Januar 2011 Lukas Czerner wrote: > If we > notice that we are running out of space in advance (how much in > advance?), we can start trimming smaller chunks, until we reach > reasonable a reasonable pool of reclaimed space, or until we trim > the whole device. Would it be possible that all blocks that have been in use since the=20 last FITRIM run can be logged? Like this, we would only need to clean=20 those. If you have a 2TB volume, probably only 25% of it have been=20 rewritten (=3D500GB) since the last run, and of that maybe 80% are still=20 in use at the time we run FITRIM, so only 100GB would need the cleanup. Maybe each AG could store a bitmap of written blocks, that are reset by=20 a FITRIM run. That could be an asynchronous written bitmap and shouldn't=20 disturb performance too much. Maybe it's even only needed to store a bit=20 per sunit*swidth blocks, to keep that table small. A mount option could=20 be used to enable that feature, so only those which use thin=20 provisioning or SSDs or similar devices enable it at wish. Especially for 100TB size devices that seems like something that should=20 be thought of, as maybe if you run FITRIM once a week there, only <10TB=20 have been rewritten, if at all, and such a table would boost a FITRIM=20 run a lot. But maybe this is just bullshit of my tired brain, and I'm not a dev so=20 I have no idea how hard it would be to implement that. =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/ --nextPart6264039.utRq0FKL5I 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) iEYEABECAAYFAk0k66oACgkQzhSR9xwSCbTPQQCePaTJgyVeTouFU2CEzBNl2t84 I3oAoIwSXbxQIvHxywdrFn5uef0fqwm4 =lssH -----END PGP SIGNATURE----- --nextPart6264039.utRq0FKL5I-- From aelder@sgi.com Wed Jan 5 16:23:02 2011 X-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 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 p05MN1ZE239875 for ; Wed, 5 Jan 2011 16:23:02 -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 294FA8F8087; Wed, 5 Jan 2011 14:25:07 -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, 5 Jan 2011 16:25:07 -0600 Subject: Re: [PATCH] repair: warn if running in low memory mode From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294121563-17150-1-git-send-email-david@fromorbit.com> References: <1294121563-17150-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 05 Jan 2011 16:25:07 -0600 Message-ID: <1294266307.2312.87.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Jan 2011 22:25:07.0876 (UTC) FILETIME=[68804E40:01CBAD27] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-04 at 17:12 +1100, Dave Chinner wrote: > From: Dave Chinner > > When checking large filesystems, xfs_repair makes an estimate of how > much RAM it will need to execute effectively. If the amount of RAM > is less than this, it reduces the bhash size and turns of > prefetching, which will substantially slow down the repair process. > Add a warning that indicates this is happening, along with a > recommendation of how much RAM repair calculates it needs to run > with prefetching enabled. This looks good. If someone specifies a maximum memory amount using -m, but that amount exceeds the memory available and/or the process' address space rlimit, it is silently reduced to the maximum possible. That may then be followed by the "...please increase it..." message, which might be confusing and possibly annoying. Maybe a single message that was a bit more informative would suffice, whether or not max_mem was specified. Just a thought. Your change looks fine. Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > --- > repair/xfs_repair.c | 10 +++++++++- > 1 files changed, 9 insertions(+), 1 deletions(-) > > diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c > index e36eeae..eea1b34 100644 > --- a/repair/xfs_repair.c > +++ b/repair/xfs_repair.c > @@ -650,12 +650,20 @@ main(int argc, char **argv) > * Turn off prefetch and minimise libxfs cache if > * physical memory is deemed insufficient > */ > - if (max_mem_specified) > + if (max_mem_specified) { > do_abort(_("Required memory for repair is " > "greater that the maximum specified " > "with the -m option. Please increase " > "it to at least %lu.\n"), > mem_used / 1024); > + } else { > + do_warn(_("Not enough RAM available for repair " > + "to enable prefetching. This will be " > + "_slow_.\n" > + "You need at least %luMB RAM to run " > + "with prefetching enabled."), > + mem_used * 1280 / (1024 * 1024)); > + } > do_prefetch = 0; > libxfs_bhash_size = 64; > } else { From SRS0+3TMh+39+fromorbit.com=david@internode.on.net Wed Jan 5 16:49:16 2011 X-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_56, J_CHICKENPOX_63 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 p05MnFiU242194 for ; Wed, 5 Jan 2011 16:49:16 -0600 X-ASG-Debug-ID: 1294267881-173102ee0000-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 EF02D2385E3 for ; Wed, 5 Jan 2011 14:51:22 -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 h9iduD2kN6dTbqam for ; Wed, 05 Jan 2011 14:51:22 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 40488039-1927428 for multiple; Thu, 06 Jan 2011 09:20:52 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PacBj-00049L-Rz; Thu, 06 Jan 2011 09:50:39 +1100 Date: Thu, 6 Jan 2011 09:50:39 +1100 From: Dave Chinner To: Michael Monnerie Cc: xfs@oss.sgi.com, Lukas Czerner , Christoph Hellwig X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support Message-ID: <20110105225039.GD8322@dastard> References: <20101125112304.GA4195@infradead.org> <20110103232514.GF15179@dastard> <201101052307.38379@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201101052307.38379@zmi.at> 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: 1294267883 X-Barracuda-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.51537 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, Jan 05, 2011 at 11:07:35PM +0100, Michael Monnerie wrote: > On Mittwoch, 5. Januar 2011 Lukas Czerner wrote: > > If we > > notice that we are running out of space in advance (how much in > > advance?), we can start trimming smaller chunks, until we reach > > reasonable a reasonable pool of reclaimed space, or until we trim > > the whole device. > > Would it be possible that all blocks that have been in use since the > last FITRIM run can be logged? Like this, we would only need to clean > those. If you have a 2TB volume, probably only 25% of it have been > rewritten (=500GB) since the last run, and of that maybe 80% are still > in use at the time we run FITRIM, so only 100GB would need the cleanup. > Maybe each AG could store a bitmap of written blocks, that are reset by > a FITRIM run. That could be an asynchronous written bitmap and shouldn't > disturb performance too much. Maybe it's even only needed to store a bit > per sunit*swidth blocks, to keep that table small. A mount option could > be used to enable that feature, so only those which use thin > provisioning or SSDs or similar devices enable it at wish. Not easily. It would need a second set of free space btrees for tracking freed but untrimmed extents. The idea of the background trim is that it doesn't need all that complexity because all the status information on where the trim process is up to can be kept in userspace. This is basically the same mode of functioning as the period background xfs_fsr defragmentation mode - run it for an hour every couple of nights,and it will slowly work it way through the entire filesystem over a period of weeks. No state or additional on-disk structures are needed for xfs_fsr to do it's work.... The background trim is intended to enable even the slowest of devices to be trimmed over time, while introducing as little runtime overhead and complexity as possible. Hence adding complexity and runtime overhead to optimise background trimming tends to defeat the primary design goal.... > Especially for 100TB size devices that seems like something that should > be thought of, as maybe if you run FITRIM once a week there, only <10TB > have been rewritten, if at all, and such a table would boost a FITRIM > run a lot. If we want optimised, only-trim-what-we-free behaviour, we need to hook into the transaction subsystem and issue TRIM commands at the time extents are actually freed. That is much more complex to implement but much easier to optimise because it doesn't require persistent state on disk. However, most devices are simply not ready to handle the flood of TRIM commands this generates, with performance degrading by ~10-20% for the best of devices and _10-100x_ for the worst... Cheers, Dave. -- Dave Chinner david@fromorbit.com From aelder@sgi.com Wed Jan 5 17:40:09 2011 X-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 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 p05Ne9Vx248372 for ; Wed, 5 Jan 2011 17:40:09 -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 5D1CE8F8074; Wed, 5 Jan 2011 15:42: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, 5 Jan 2011 17:42:15 -0600 Subject: Re: [PATCH] xfs_repair: multithread phase 2 From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294121588-17233-1-git-send-email-david@fromorbit.com> References: <1294121588-17233-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 05 Jan 2011 17:42:14 -0600 Message-ID: <1294270934.2312.105.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Jan 2011 23:42:15.0109 (UTC) FILETIME=[2E8C0750:01CBAD32] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-04 at 17:13 +1100, Dave Chinner wrote: > From: Dave Chinner > > Running some recent repair tests on broken filesystem meant running > phase 1 and 2 repeatedly to reproduce an issue at the start of phase > 3. Phase 2 was taking approximately 10 minutes to run as it > processes each AG serially. > > Phase 2 can be trivially parallelised - it is simply scanning the > per AG trees to calculate free block counts and free and used inodes > counts. This can be done safely in parallel by giving each AG it's > own structure to aggregate counts into, then once the AG scan is > complete adding them all together. > > This patch uses 32-way threading which results in no noticable > slowdown on single SATA drives with NCQ, but results in ~10x > reduction in runtime on a 12 disk RAID-0 array. This is great. And evidently not very hard at all. It should have been done a long time ago... I had a few of the same comments Christoph had (though I didn't know about the the workqueues). I'll reiterate one, that SCAN_THREADS should be a command line option. 32 is a fine default, but there's no sense in restricting it to that. A few other things, below, but this looks good to me. Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > --- > repair/phase2.c | 16 +--- > repair/scan.c | 303 +++++++++++++++++++++++++++++++----------------------- > repair/scan.h | 37 ------- > 3 files changed, 176 insertions(+), 180 deletions(-) . . . > diff --git a/repair/scan.c b/repair/scan.c > index 85017ff..dd62776 100644 > --- a/repair/scan.c > +++ b/repair/scan.c . . . > @@ -469,6 +477,34 @@ _("out-of-order bmap key (file offset) in inode %llu, %s fork, fsbno %llu\n"), > } > Can this (and scanfunc_cnt() and scanfunc_ino()) be given static scope now? > void > +scanfunc_bno( > + struct xfs_btree_block *block, > + int level, > + xfs_agblock_t bno, > + xfs_agnumber_t agno, > + int suspect, > + int isroot, > + struct aghdr_cnts *agcnts) > +{ > + return scanfunc_allocbt(block, level, bno, agno, > + suspect, isroot, XFS_ABTB_MAGIC, agcnts); > +} > + . . . > @@ -1155,42 +1169,15 @@ validate_agi( > } . . . > -void > -scan_ag( > - xfs_agnumber_t agno) > +void * > +scan_ag(void *args) Maybe arg (singular) > { > + struct aghdr_cnts *agcnts = args; > + xfs_agnumber_t agno = agcnts->agno; > xfs_agf_t *agf; > xfs_buf_t *agfbuf; > int agf_dirty = 0; . . . > @@ -1331,4 +1308,72 @@ scan_ag( > libxfs_putbuf(sbbuf); > free(sb); > PROG_RPT_INC(prog_rpt_done[agno], 1); > + > +#ifdef XR_INODE_TRACE > + print_inode_list(i); I know this is only under XR_INODE_TRACE, but now that you're multi-threading these, the output can get interleaved and therefore somewhat useless. Maybe you could adjust print_inode_list() so it includes the AG number with each line output rather than just prior to printing all of them. > +#endif > + return NULL; > +} > + > +#define SCAN_THREADS 32 Make this configurable at runtime. > + > +void > +scan_ags( > + struct xfs_mount *mp) > +{ > + struct aghdr_cnts agcnts[mp->m_sb.sb_agcount]; There is some mention about the per-thread stack size getting set at the time the program starts in the pthread documentation. I don't expect this will be a problem in practice, but maybe this should be allocated dynamically. > + pthread_t thr[SCAN_THREADS]; > + __uint64_t fdblocks = 0; > + __uint64_t icount = 0; > + __uint64_t ifreecount = 0; > + int i, j, err; > + > + /* > + * scan a few AGs in parallel. The scan is IO latency bound, > + * so running a few at a time will speed it up significantly. > + */ > + for (i = 0; i < mp->m_sb.sb_agcount; i += SCAN_THREADS) { > + for (j = 0; j < SCAN_THREADS; j++) { xfs_agnumber_t agno = i + j; > + if (i + j >= mp->m_sb.sb_agcount) if (agno >= mp->m_sb.sg_agcount) (and so on, throughout this section) > + break; > + memset(&agcnts[i + j], 0, sizeof(agcnts[i])); agcnts[i + j] > + agcnts[i + j].agno = i + j; > + err = pthread_create(&thr[j], NULL, scan_ag, > + &agcnts[i + j]); > + if (err) From yuji_touya@yokogawa-digital.com Wed Jan 5 22:16:24 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p064GNph011302 for ; Wed, 5 Jan 2011 22:16:24 -0600 X-ASG-Debug-ID: 1294287510-378e00300000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from zns001-0m9004.yokogawa.co.jp (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F0E3BF826B1 for ; Wed, 5 Jan 2011 20:18:31 -0800 (PST) Received: from zns001-0m9004.yokogawa.co.jp (zns001-0m9004.yokogawa.co.jp [203.174.79.162]) by cuda.sgi.com with ESMTP id 1vW4umRA2J17ihd0 for ; Wed, 05 Jan 2011 20:18:31 -0800 (PST) Received: from zns001-0m9004.yokogawa.co.jp (localhost [127.0.0.1]) by zns001-0m9004.yokogawa.co.jp (8.12.10+Sun/8.12.10) with ESMTP id p064ITUQ022644 for ; Thu, 6 Jan 2011 13:18:29 +0900 (JST) Received: from zex001-0m9027.jp.ykgw.net (zex001-0m9027.jp.ykgw.net [10.0.11.46]) by zns001-0m9004.yokogawa.co.jp (8.12.10+Sun/8.12.10) with ESMTP id p064IT8o022638 for ; Thu, 6 Jan 2011 13:18:29 +0900 (JST) Received: from EXMAIL03.jp.ykgw.net ([10.0.11.29]) by zex001-0m9027.jp.ykgw.net ([10.0.11.46]) with mapi; Thu, 6 Jan 2011 13:18:29 +0900 From: To: Date: Thu, 6 Jan 2011 13:18:27 +0900 X-ASG-Orig-Subj: 2.6.27.30 fc10, some processes stuck in D state Subject: 2.6.27.30 fc10, some processes stuck in D state Thread-Topic: 2.6.27.30 fc10, some processes stuck in D state Thread-Index: AcutWL7apEyxzWAEQqCMcUmBzK711g== Message-ID: <8529A87D856C184491994079B5F87B68C1A8289FCC@EXMAIL03.jp.ykgw.net> Accept-Language: ja-JP Content-Language: ja-JP X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: ja-JP Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: zns001-0m9004.yokogawa.co.jp[203.174.79.162] X-Barracuda-Start-Time: 1294287511 X-Barracuda-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.51558 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 folks, We need to save a bunch of transport-stream(TS) data(4MB/sec, 300GB/day), a= nd are using xfs formatted hardware RAID system to save TS data. Some processes (pdflush, kswapd, our own services etc) stuck in D-state and our system stops saving and down-converting TS data. It rarely happens (3 times in recent 3 months), but it's quite serious for = us. How can we avoid this? One more thing, in that situation when I run "ls /mnt/raid/foo" command,=20 all stuck processes suddenly wake up and continue running. Very strange... (/mnt/raid is where we mount xfs) kenel: fedora 10 Linux version 2.6.27.30-170.2.82.fc10.i686 (mockbuild@xenbuilder4.fedora.ph= x.redhat.com) (gcc version 4.3.2 20081105 (Red Hat 4.3.2-7) (GCC) ) #1 SMP Mon Aug 17 08:= 38:59 EDT2009 cpu: Intel(R) Xeon(R) E5420 CPU @ 2.50GHz (4 cores) mount: /dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw) /dev/mapper/IcmsT2-Volume00 on /mnt/raid type xfs (rw) result of SysRq + w: SysRq : Show Blocked State task PC stack pid father pdflush D c07fc900 0 289 2 f5e82b2c 00000046 c04749e5 c07fc900 00000001 c087c67c c087fc00 c087fc= 00=20 c087fc00 f78d4010 f78d4284 c2032c00 00000003 c2032c00 c8113a78 ded18d= 80=20 000000ca 00000000 ded18dc0 f78d4284 0651f34e 00000004 00000005 00a000= ca=20 Call Trace: [] ? __alloc_pages_internal+0xb0/0x399 [] schedule_timeout+0x17/0xbc [] ? xfs_bmap_search_extents+0x4c/0xab [xfs] [] ? add_wait_queue_exclusive+0x2b/0x30 [] _sv_wait+0x53/0x65 [xfs] [] ? default_wake_function+0x0/0xd [] xlog_grant_log_space+0x84/0x269 [xfs] [] xfs_log_reserve+0xa0/0xa8 [xfs] [] xfs_trans_reserve+0xbe/0x19d [xfs] [] xfs_iomap_write_allocate+0x101/0x355 [xfs] [] ? xfs_iomap+0x18b/0x2c9 [xfs] [] xfs_iomap+0x26a/0x2c9 [xfs] [] xfs_map_blocks+0x2b/0x63 [xfs] [] xfs_page_state_convert+0x326/0x5d2 [xfs] [] ? page_mkclean+0x15/0x1d7 [] xfs_vm_writepage+0xa0/0xd7 [xfs] [] __writepage+0xb/0x26 [] write_cache_pages+0x1bc/0x2ad [] ? __writepage+0x0/0x26 [] generic_writepages+0x1d/0x27 [] xfs_vm_writepages+0x3e/0x44 [xfs] [] ? xfs_vm_writepages+0x0/0x44 [xfs] [] do_writepages+0x23/0x34 [] __writeback_single_inode+0x16c/0x2b7 [] ? dm_any_congested+0x39/0x42 [] generic_sync_sb_inodes+0x202/0x31b [] writeback_inodes+0x7d/0xc5 [] background_writeout+0x73/0x9f [] pdflush+0x12c/0x1d5 [] ? background_writeout+0x0/0x9f [] ? pdflush+0x0/0x1d5 [] kthread+0x3b/0x61 [] ? kthread+0x0/0x61 [] kernel_thread_helper+0x7/0x10 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D kswapd0 D f796c258 0 291 2 f5e80b08 00000046 00000021 f796c258 f5e80ae0 c087c67c c087fc00 c087fc= 00=20 c087fc00 f78d59b0 f78d5c24 c201cc00 00000001 c201cc00 c8113a78 ded18d= 80=20 000000ca 00000000 ded18dc0 f78d5c24 06b83185 00000004 00000005 00a000= ca=20 Call Trace: [] schedule_timeout+0x17/0xbc [] ? xfs_bmap_search_extents+0x4c/0xab [xfs] [] ? add_wait_queue_exclusive+0x2b/0x30 [] _sv_wait+0x53/0x65 [xfs] [] ? default_wake_function+0x0/0xd [] xlog_grant_log_space+0x84/0x269 [xfs] [] xfs_log_reserve+0xa0/0xa8 [xfs] [] xfs_trans_reserve+0xbe/0x19d [xfs] [] xfs_iomap_write_allocate+0x101/0x355 [xfs] [] ? check_preempt_wakeup+0x145/0x1c3 [] ? xfs_iomap+0x18b/0x2c9 [xfs] [] xfs_iomap+0x26a/0x2c9 [xfs] [] xfs_map_blocks+0x2b/0x63 [xfs] [] xfs_page_state_convert+0x326/0x5d2 [xfs] [] ? page_mkclean+0x15/0x1d7 [] xfs_vm_writepage+0xa0/0xd7 [xfs] [] shrink_page_list+0x330/0x55d [] ? isolate_lru_pages+0x7c/0x16d [] shrink_inactive_list+0x144/0x373 [] ? _spin_lock+0x8/0xb [] ? nfs_access_cache_shrinker+0x174/0x1ad [nfs] [] shrink_zone+0xbb/0xda [] kswapd+0x329/0x43c [] ? isolate_pages_global+0x0/0x3e [] ? autoremove_wake_function+0x0/0x33 [] ? kswapd+0x0/0x43c [] kthread+0x3b/0x61 [] ? kthread+0x0/0x61 [] kernel_thread_helper+0x7/0x10 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D icms D e0bc99d4 0 2860 1 e0debe00 00000086 c436cdc8 e0bc99d4 e0debe60 c087c67c c087fc00 c087fc= 00=20 c087fc00 f4c1cce0 f4c1cf54 c2032c00 00000003 c2032c00 e0debdc8 e0debe= 60=20 00040000 0000e9f8 00000000 f4c1cf54 065204d3 c046fa29 0000000e 000000= 00=20 Call Trace: [] ? find_get_pages+0x28/0xb0 [] schedule_timeout+0x17/0xbc [] ? pagevec_lookup+0x19/0x22 [] ? add_wait_queue_exclusive+0x2b/0x30 [] _sv_wait+0x53/0x65 [xfs] [] ? default_wake_function+0x0/0xd [] xlog_grant_log_space+0x84/0x269 [xfs] [] xfs_log_reserve+0xa0/0xa8 [xfs] [] xfs_trans_reserve+0xbe/0x19d [xfs] [] xfs_free_eofblocks+0x193/0x230 [xfs] [] xfs_release+0x167/0x173 [xfs] [] ? schedule+0x6ee/0x70d [] xfs_file_release+0xe/0x12 [xfs] [] __fput+0xad/0x13d [] fput+0x17/0x19 [] filp_close+0x50/0x5a [] sys_close+0x72/0xb1 [] syscall_call+0x7/0xb =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D gnome-setting D c0471cc1 0 3130 1 f5148900 00000086 c048f5e4 c0471cc1 00011220 c087c67c c087fc00 c087fc= 00=20 c087fc00 e08059b0 e0805c24 c201cc00 00000001 c201cc00 c8113a78 ded18d= 80=20 000000ca 00000000 ded18dc0 e0805c24 0747d4ba 00000004 00000005 00a000= ca=20 Call Trace: [] ? kmem_cache_alloc+0x80/0xc4 [] ? mempool_alloc_slab+0xe/0x10 [] schedule_timeout+0x17/0xbc [] ? xfs_bmap_search_extents+0x4c/0xab [xfs] [] ? add_wait_queue_exclusive+0x2b/0x30 [] _sv_wait+0x53/0x65 [xfs] [] ? default_wake_function+0x0/0xd [] xlog_grant_log_space+0x84/0x269 [xfs] [] xfs_log_reserve+0xa0/0xa8 [xfs] [] xfs_trans_reserve+0xbe/0x19d [xfs] [] xfs_iomap_write_allocate+0x101/0x355 [xfs] [] ? resched_task+0x3a/0x6e [] ? xfs_iomap+0x18b/0x2c9 [xfs] [] xfs_iomap+0x26a/0x2c9 [xfs] [] xfs_map_blocks+0x2b/0x63 [xfs] [] xfs_page_state_convert+0x326/0x5d2 [xfs] [] ? page_mkclean+0x15/0x1d7 [] xfs_vm_writepage+0xa0/0xd7 [xfs] [] shrink_page_list+0x330/0x55d [] ? isolate_lru_pages+0x7c/0x16d [] shrink_inactive_list+0x144/0x373 [] ? throttle_vm_writeout+0x21/0x74 [] shrink_zone+0xbb/0xda [] try_to_free_pages+0x201/0x321 [] ? isolate_pages_global+0x0/0x3e [] __alloc_pages_internal+0x222/0x399 [] handle_mm_fault+0x14c/0x6d1 [] ? __sock_recvmsg+0x51/0x5b [] do_page_fault+0x33d/0x710 [] ? vma_merge+0x1bc/0x237 [] ? __vm_enough_memory+0x17/0xde [] ? mmap_region+0x179/0x3fa [] ? mmap_region+0x329/0x3fa [] ? do_mmap_pgoff+0x26b/0x2cb [] ? path_put+0x15/0x18 [] ? audit_syscall_exit+0xb2/0xc7 [] ? do_page_fault+0x0/0x710 [] error_code+0x72/0x78 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D DownConvert D c0447428 0 3161 2860 e0817e00 00000086 f786a670 c0447428 00000000 c087c67c c087fc00 c087fc= 00=20 c087fc00 e0bc99a0 e0bc9c14 c2027c00 00000002 c2027c00 c0406f63 000000= 46=20 c2023104 00000000 e000be70 e0bc9c14 06520571 e0817000 c052068c c087fc= 00=20 Call Trace: [] ? tick_program_event+0x22/0x29 [] ? do_softirq+0xbe/0xdb [] ? trace_hardirqs_on_thunk+0xc/0x10 [] ? restore_nocheck_notrace+0x0/0xe [] schedule_timeout+0x17/0xbc [] ? add_wait_queue_exclusive+0x2b/0x30 [] _sv_wait+0x53/0x65 [xfs] [] ? default_wake_function+0x0/0xd [] xlog_grant_log_space+0x13d/0x269 [xfs] [] xfs_log_reserve+0xa0/0xa8 [xfs] [] xfs_trans_reserve+0xbe/0x19d [xfs] [] xfs_free_eofblocks+0x193/0x230 [xfs] [] xfs_release+0x167/0x173 [xfs] [] xfs_file_release+0xe/0x12 [xfs] [] __fput+0xad/0x13d [] fput+0x17/0x19 [] filp_close+0x50/0x5a [] sys_close+0x72/0xb1 [] syscall_call+0x7/0xb =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D extif D 00c066d4 0 4914 2870 d8259e2c 00000082 c04e0bf8 00c066d4 d8259dd4 c087c67c c087fc00 c087fc= 00=20 c087fc00 e0bcd9b0 e0bcdc24 c2032c00 00000003 c2032c00 dc4a9908 000000= 15=20 7c012ebf db74d019 f77c1908 e0bcdc24 06520ade d8259e58 db74d000 d8259e= 20=20 Call Trace: [] ? ext3_get_acl+0x77/0x26f [] ? dput+0x34/0x107 [] rwsem_down_failed_common+0x81/0x95 [] rwsem_down_read_failed+0x1d/0x27 [] call_rwsem_down_read_failed+0x7/0xc [] ? down_read+0x26/0x29 [] xfs_ilock+0x2b/0x4b [xfs] [] xfs_read+0xf8/0x1cb [xfs] [] xfs_file_aio_read+0x51/0x59 [xfs] [] do_sync_read+0xab/0xe9 [] ? autoremove_wake_function+0x0/0x33 [] ? need_resched+0x18/0x22 [] ? virt_to_head_page+0x22/0x2e [] ? security_file_permission+0xf/0x11 [] ? do_sync_read+0x0/0xe9 [] vfs_read+0x81/0xdc [] sys_read+0x3b/0x60 [] syscall_call+0x7/0xb =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D extif D 00c066d4 0 7721 2870 de6e5e2c 00000086 c04e0bf8 00c066d4 de6e5dd4 c087c67c c087fc00 c087fc= 00=20 c087fc00 e0800000 e0800274 c2027c00 00000002 c2027c00 dc4a9908 000000= 15=20 7c012ebf f4c04019 f77c1908 e0800274 0669c893 de6e5e58 f4c04000 de6e5e= 20=20 Call Trace: [] ? ext3_get_acl+0x77/0x26f [] ? dput+0x34/0x107 [] rwsem_down_failed_common+0x81/0x95 [] rwsem_down_read_failed+0x1d/0x27 [] call_rwsem_down_read_failed+0x7/0xc [] ? down_read+0x26/0x29 [] xfs_ilock+0x2b/0x4b [xfs] [] xfs_read+0xf8/0x1cb [xfs] [] xfs_file_aio_read+0x51/0x59 [xfs] [] do_sync_read+0xab/0xe9 [] ? autoremove_wake_function+0x0/0x33 [] ? need_resched+0x18/0x22 [] ? virt_to_head_page+0x22/0x2e [] ? security_file_permission+0xf/0x11 [] ? do_sync_read+0x0/0xe9 [] vfs_read+0x81/0xdc [] sys_read+0x3b/0x60 [] syscall_call+0x7/0xb =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D extif D 00c066d4 0 8628 2870 de873e2c 00000086 c04e0bf8 00c066d4 de873dd4 c087c67c c087fc00 c087fc= 00=20 c087fc00 e0e359b0 e0e35c24 c2032c00 00000003 c2032c00 dc4a9908 000000= 15=20 7c012ebf db74d019 f77c1908 e0e35c24 06b091d2 de873e58 db74d000 de873e= 20=20 Call Trace: [] ? ext3_get_acl+0x77/0x26f [] ? dput+0x34/0x107 [] rwsem_down_failed_common+0x81/0x95 [] rwsem_down_read_failed+0x1d/0x27 [] call_rwsem_down_read_failed+0x7/0xc [] ? down_read+0x26/0x29 [] xfs_ilock+0x2b/0x4b [xfs] [] xfs_read+0xf8/0x1cb [xfs] [] xfs_file_aio_read+0x51/0x59 [xfs] [] do_sync_read+0xab/0xe9 [] ? autoremove_wake_function+0x0/0x33 [] ? need_resched+0x18/0x22 [] ? virt_to_head_page+0x22/0x2e [] ? security_file_permission+0xf/0x11 [] ? do_sync_read+0x0/0xe9 [] vfs_read+0x81/0xdc [] sys_read+0x3b/0x60 [] syscall_call+0x7/0xb =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D tar D 00000000 0 8728 8727 d81c08e8 00000082 00000000 00000000 00000000 c087c67c c087fc00 c087fc= 00=20 c087fc00 e0bccce0 e0bccf54 c2011c00 00000000 c2011c00 c8113a78 ded18d= 80=20 000000ca 00000000 ded18dc0 e0bccf54 06b834d7 00000004 00000005 00a000= ca=20 Call Trace: [] schedule_timeout+0x17/0xbc [] ? xfs_bmap_search_extents+0x4c/0xab [xfs] [] ? add_wait_queue_exclusive+0x2b/0x30 [] _sv_wait+0x53/0x65 [xfs] [] ? default_wake_function+0x0/0xd [] xlog_grant_log_space+0x84/0x269 [xfs] [] xfs_log_reserve+0xa0/0xa8 [xfs] [] xfs_trans_reserve+0xbe/0x19d [xfs] [] xfs_iomap_write_allocate+0x101/0x355 [xfs] [] ? xfs_iomap+0x18b/0x2c9 [xfs] [] xfs_iomap+0x26a/0x2c9 [xfs] [] xfs_map_blocks+0x2b/0x63 [xfs] [] xfs_page_state_convert+0x326/0x5d2 [xfs] [] ? page_mkclean+0x15/0x1d7 [] xfs_vm_writepage+0xa0/0xd7 [xfs] [] shrink_page_list+0x330/0x55d [] ? isolate_lru_pages+0x7c/0x16d [] shrink_inactive_list+0x144/0x373 [] ? throttle_vm_writeout+0x21/0x74 [] shrink_zone+0xbb/0xda [] try_to_free_pages+0x201/0x321 [] ? isolate_pages_global+0x0/0x3e [] __alloc_pages_internal+0x222/0x399 [] __do_page_cache_readahead+0xa0/0x159 [] ondemand_readahead+0x101/0x10f [] page_cache_async_readahead+0x57/0x62 [] generic_file_aio_read+0x248/0x539 [] do_sync_read+0xab/0xe9 [] ? autoremove_wake_function+0x0/0x33 [] ? need_resched+0x18/0x22 [] ? security_file_permission+0xf/0x11 [] ? do_sync_read+0x0/0xe9 [] vfs_read+0x81/0xdc [] sys_read+0x3b/0x60 [] syscall_call+0x7/0xb =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D extif D 00c066d4 0 22868 2870 f5b77e2c 00000086 c04e0bf8 00c066d4 f5b77dd4 c087c67c c087fc00 c087fc= 00=20 c087fc00 dcd52670 dcd528e4 c2027c00 00000002 c2027c00 dc4a9908 000000= 15=20 7c012ebf f4c05019 f77c1908 dcd528e4 0ae7ef5e f5b77e58 f4c05000 f5b77e= 20=20 Call Trace: [] ? ext3_get_acl+0x77/0x26f [] ? dput+0x34/0x107 [] rwsem_down_failed_common+0x81/0x95 [] rwsem_down_read_failed+0x1d/0x27 [] call_rwsem_down_read_failed+0x7/0xc [] ? down_read+0x26/0x29 [] xfs_ilock+0x2b/0x4b [xfs] [] xfs_read+0xf8/0x1cb [xfs] [] xfs_file_aio_read+0x51/0x59 [xfs] [] do_sync_read+0xab/0xe9 [] ? autoremove_wake_function+0x0/0x33 [] ? need_resched+0x18/0x22 [] ? virt_to_head_page+0x22/0x2e [] ? security_file_permission+0xf/0x11 [] ? do_sync_read+0x0/0xe9 [] vfs_read+0x81/0xdc [] sys_read+0x3b/0x60 [] syscall_call+0x7/0xb ----------- Yuji Touya= From SRS0+ABSF+40+fromorbit.com=david@internode.on.net Wed Jan 5 22:59:02 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p064wuRY016102 for ; Wed, 5 Jan 2011 22:59:02 -0600 X-ASG-Debug-ID: 1294290063-4bd200cb0000-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 8218B4F4832 for ; Wed, 5 Jan 2011 21:01:04 -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 Lq4JLgD2v2FRLXvo for ; Wed, 05 Jan 2011 21:01:04 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52136344-1927428 for multiple; Thu, 06 Jan 2011 15:31:03 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pahy6-0004ql-07; Thu, 06 Jan 2011 16:00:58 +1100 Date: Thu, 6 Jan 2011 16:00:57 +1100 From: Dave Chinner To: yuji_touya@yokogawa-digital.com Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: 2.6.27.30 fc10, some processes stuck in D state Subject: Re: 2.6.27.30 fc10, some processes stuck in D state Message-ID: <20110106050057.GF8322@dastard> References: <8529A87D856C184491994079B5F87B68C1A8289FCC@EXMAIL03.jp.ykgw.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8529A87D856C184491994079B5F87B68C1A8289FCC@EXMAIL03.jp.ykgw.net> 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: 1294290065 X-Barracuda-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.51561 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, Jan 06, 2011 at 01:18:27PM +0900, yuji_touya@yokogawa-digital.com wrote: > Hello folks, > > We need to save a bunch of transport-stream(TS) data(4MB/sec, 300GB/day), and > are using xfs formatted hardware RAID system to save TS data. > Some processes (pdflush, kswapd, our own services etc) stuck in D-state and > our system stops saving and down-converting TS data. Everything is waiting for log space to be freed. Typically a sign that metadata has not been flushed or that IO completion has not occurred so the tail is not moving forward. > It rarely happens (3 times in recent 3 months), but it's quite serious for us. > How can we avoid this? What did you change 3 months ago? Or did this always happen? > One more thing, in that situation when I run "ls /mnt/raid/foo" command, > all stuck processes suddenly wake up and continue running. Very strange... > (/mnt/raid is where we mount xfs) So doing new read IOs starts stuff moving again? That sounds like an IO completion has not arrived from the lower layers until a new IO is issued and completes. Perhaps the hardware RAID is not issuing an interrupt when it should? What type of RAID controller/storage hardware are you using? Is it all running the latest firmware, appropriate drivers, etc? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+RTOu+40+fromorbit.com=dave@internode.on.net Wed Jan 5 23:45:19 2011 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 p065jHKs018824 for ; Wed, 5 Jan 2011 23:45:17 -0600 X-ASG-Debug-ID: 1294292833-61d500b60000-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 97685FAD019 for ; Wed, 5 Jan 2011 21:47:13 -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 mArB8PdIY10urf0k for ; Wed, 05 Jan 2011 21:47:13 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52140407-1927428 for ; Thu, 06 Jan 2011 16:16:50 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PaigS-0004v9-3q for xfs@oss.sgi.com; Thu, 06 Jan 2011 16:46:48 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Paig8-0003Gt-4z for xfs@oss.sgi.com; Thu, 06 Jan 2011 16:46:28 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] libxfs: sync files with 2.6.38 kernel code Subject: [PATCH] libxfs: sync files with 2.6.38 kernel code Date: Thu, 6 Jan 2011 16:46:28 +1100 Message-Id: <1294292788-12547-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: 1294292838 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 From: Dave Chinner Bring the libxfs headers and code into sync with the 2.6.37 kernel code. Update the rest of xfsprogs to work with the new code. Note: this does not convert xfsprogs to the kernel xfs_trans_ijoin\ijoin_ref interface, it maintains the older ijoin/ihold interface because of the different way the inode reference counting works in libxfs. More work will be needed to change it over to a manner compatible with the current kernel API. Note: log sector size handling needs to be sorted out. Specifically, initialising l_sectbb_log/l_sectBBsize correctly and removing the hacks in xlog_bread and friends (libxlog/xfs_log_recover.c) to work around the fact they are not initialised correctly. (FWIW, I don't think xfsprogs handles large log sector size correctly as a result, and especially not if the log device sector size is different to the data device sector size). Testing: Currently passes xfstests on x86_64 w/ 4k block sizes. On 512 byte block/2k directory block filesystems repair is giving this additional output on test 033: +cache_purge: shake on cache 0x67a060 left 1 nodes!? The same test run saw test 104 generating: +_check_xfs_filesystem: filesystem on /dev/vdb is inconsistent (c) (see 104.full) which appears to be due to this output: *** xfs_check output *** XFS: Invalid block length (0x2000) given for buffer Which may be a result of the above xlog_bread issues. I haven't confirmed whether this is a regression or not yet. Signed-off-by: Dave Chinner --- db/attr.c | 16 +- db/attrset.c | 5 +- db/bmap.c | 18 +- db/bmap.h | 4 +- db/check.c | 50 +- db/convert.c | 6 +- db/dir2sf.c | 6 +- db/field.c | 2 +- db/frag.c | 6 +- db/inode.c | 124 ++-- db/metadump.c | 20 +- include/Makefile | 5 +- include/atomic.h | 31 + include/libxfs.h | 44 +- include/libxlog.h | 16 +- include/list.h | 11 + include/radix-tree.h | 76 ++ include/xfs_ag.h | 100 ++- include/xfs_alloc.h | 58 +- include/xfs_arch.h | 32 - include/xfs_attr_leaf.h | 12 - include/xfs_attr_sf.h | 42 +- include/xfs_bit.h | 10 +- include/xfs_bmap.h | 133 ++-- include/xfs_bmap_btree.h | 20 +- include/xfs_btree.h | 31 +- include/xfs_btree_trace.h | 17 - include/xfs_buf_item.h | 51 +- include/xfs_da_btree.h | 21 +- include/xfs_dfrag.h | 5 +- include/xfs_dinode.h | 149 ++--- include/xfs_dir2.h | 4 +- include/xfs_dir2_data.h | 2 +- include/xfs_dir2_node.h | 2 - include/xfs_dir2_sf.h | 7 - include/xfs_extfree_item.h | 17 +- include/xfs_fs.h | 30 +- include/xfs_ialloc.h | 30 +- include/xfs_ialloc_btree.h | 23 +- include/xfs_imap.h | 38 - include/xfs_inode.h | 210 +++--- include/xfs_inode_item.h | 32 +- include/xfs_inum.h | 1 - include/xfs_log.h | 70 +- include/xfs_log_priv.h | 331 +++++++-- include/xfs_log_recover.h | 25 +- include/xfs_mount.h | 259 ++----- include/xfs_quota.h | 160 ++-- include/xfs_rtalloc.h | 19 +- include/xfs_sb.h | 168 +++-- include/xfs_trace.h | 85 +++ include/xfs_trans.h | 648 +++-------------- include/xfs_trans_space.h | 2 +- include/xfs_types.h | 18 +- libxfs/Makefile | 2 +- libxfs/init.c | 133 +++- libxfs/logitem.c | 371 +--------- libxfs/radix-tree.c | 805 ++++++++++++++++++++ libxfs/trans.c | 211 ++---- libxfs/util.c | 75 +- libxfs/xfs.h | 49 +- libxfs/xfs_alloc.c | 599 ++++++++-------- libxfs/xfs_alloc_btree.c | 46 +- libxfs/xfs_attr.c | 138 ++-- libxfs/xfs_attr_leaf.c | 135 ++-- libxfs/xfs_bmap.c | 1773 ++++++++++++++++++++++---------------------- libxfs/xfs_bmap_btree.c | 129 ++-- libxfs/xfs_btree.c | 96 ++- libxfs/xfs_da_btree.c | 48 +- libxfs/xfs_dir2.c | 31 +- libxfs/xfs_dir2_block.c | 28 +- libxfs/xfs_dir2_leaf.c | 21 +- libxfs/xfs_dir2_node.c | 29 +- libxfs/xfs_dir2_sf.c | 24 +- libxfs/xfs_ialloc.c | 1157 +++++++++++++++-------------- libxfs/xfs_ialloc_btree.c | 35 +- libxfs/xfs_inode.c | 277 ++++---- libxfs/xfs_mount.c | 123 +--- libxfs/xfs_trans.c | 492 +++++++++++-- libxlog/xfs_log_recover.c | 606 ++++++++------- logprint/log_misc.c | 2 +- logprint/log_print_all.c | 13 +- logprint/log_print_trans.c | 4 +- mkfs/proto.c | 18 +- mkfs/xfs_mkfs.c | 3 +- repair/attr_repair.c | 14 +- repair/dino_chunks.c | 12 +- repair/dinode.c | 275 ++++---- repair/dir.c | 18 +- repair/dir2.c | 22 +- repair/incore.h | 3 + repair/phase6.c | 76 +- repair/prefetch.c | 29 +- repair/rt.c | 2 +- 94 files changed, 5826 insertions(+), 5400 deletions(-) create mode 100644 include/atomic.h create mode 100644 include/radix-tree.h delete mode 100644 include/xfs_imap.h create mode 100644 include/xfs_trace.h create mode 100644 libxfs/radix-tree.c diff --git a/db/attr.c b/db/attr.c index f15d408..74bf411 100644 --- a/db/attr.c +++ b/db/attr.c @@ -219,7 +219,7 @@ attr_leaf_name_local_name_count( e = &block->entries[i]; if (be16_to_cpu(e->nameidx) == off) { if (e->flags & XFS_ATTR_LOCAL) { - l = XFS_ATTR_LEAF_NAME_LOCAL(block, i); + l = xfs_attr_leaf_name_local(block, i); return l->namelen; } else return 0; @@ -248,7 +248,7 @@ attr_leaf_name_local_value_count( e = &block->entries[i]; if (be16_to_cpu(e->nameidx) == off) { if (e->flags & XFS_ATTR_LOCAL) { - l = XFS_ATTR_LEAF_NAME_LOCAL(block, i); + l = xfs_attr_leaf_name_local(block, i); return be16_to_cpu(l->valuelen); } else return 0; @@ -285,7 +285,7 @@ attr_leaf_name_local_value_offset( if (i >= be16_to_cpu(block->hdr.count)) return 0; - l = XFS_ATTR_LEAF_NAME_LOCAL(block, i); + l = xfs_attr_leaf_name_local(block, i); vp = (char *)&l->nameval[l->namelen]; return (int)bitize(vp - (char *)l); } @@ -333,7 +333,7 @@ attr_leaf_name_remote_name_count( e = &block->entries[i]; if (be16_to_cpu(e->nameidx) == off) { if (!(e->flags & XFS_ATTR_LOCAL)) { - r = XFS_ATTR_LEAF_NAME_REMOTE(block, i); + r = xfs_attr_leaf_name_remote(block, i); return r->namelen; } else return 0; @@ -360,12 +360,12 @@ attr_leaf_name_size( return 0; e = &block->entries[idx]; if (e->flags & XFS_ATTR_LOCAL) { - l = XFS_ATTR_LEAF_NAME_LOCAL(block, idx); - return (int)bitize(XFS_ATTR_LEAF_ENTSIZE_LOCAL(l->namelen, + l = xfs_attr_leaf_name_local(block, idx); + return (int)bitize(xfs_attr_leaf_entsize_local(l->namelen, be16_to_cpu(l->valuelen))); } else { - r = XFS_ATTR_LEAF_NAME_REMOTE(block, idx); - return (int)bitize(XFS_ATTR_LEAF_ENTSIZE_REMOTE(r->namelen)); + r = xfs_attr_leaf_name_remote(block, idx); + return (int)bitize(xfs_attr_leaf_entsize_remote(r->namelen)); } } diff --git a/db/attrset.c b/db/attrset.c index 35fea11..cbecbe9 100644 --- a/db/attrset.c +++ b/db/attrset.c @@ -158,7 +158,8 @@ attr_set_f( goto out; } - if (libxfs_attr_set(ip, name, value, valuelen, flags)) { + if (libxfs_attr_set(ip, (unsigned char *)name, + (unsigned char *)value, valuelen, flags)) { dbprintf(_("failed to set attr %s on inode %llu\n"), name, (unsigned long long)iocur_top->ino); goto out; @@ -233,7 +234,7 @@ attr_remove_f( goto out; } - if (libxfs_attr_remove(ip, name, flags)) { + if (libxfs_attr_remove(ip, (unsigned char *)name, flags)) { dbprintf(_("failed to remove attr %s from inode %llu\n"), name, (unsigned long long)iocur_top->ino); goto out; diff --git a/db/bmap.c b/db/bmap.c index 5abad68..ddad49c 100644 --- a/db/bmap.c +++ b/db/bmap.c @@ -29,7 +29,7 @@ #include "init.h" static int bmap_f(int argc, char **argv); -static int bmap_one_extent(xfs_bmbt_rec_64_t *ep, +static int bmap_one_extent(xfs_bmbt_rec_t *ep, xfs_dfiloff_t *offp, xfs_dfiloff_t eoff, int *idxp, bmap_ext_t *bep); static xfs_fsblock_t select_child(xfs_dfiloff_t off, xfs_bmbt_key_t *kp, @@ -52,7 +52,7 @@ bmap( xfs_dfiloff_t curoffset; xfs_dinode_t *dip; xfs_dfiloff_t eoffset; - xfs_bmbt_rec_64_t *ep; + xfs_bmbt_rec_t *ep; xfs_dinode_fmt_t fmt; int fsize; xfs_bmbt_key_t *kp; @@ -63,7 +63,7 @@ bmap( xfs_bmbt_ptr_t *pp; xfs_bmdr_block_t *rblock; typnm_t typ; - xfs_bmbt_rec_64_t *xp; + xfs_bmbt_rec_t *xp; push_cur(); set_cur_inode(iocur_top->ino); @@ -81,7 +81,7 @@ bmap( fmt == XFS_DINODE_FMT_BTREE); if (fmt == XFS_DINODE_FMT_EXTENTS) { nextents = XFS_DFORK_NEXTENTS(dip, whichfork); - xp = (xfs_bmbt_rec_64_t *)XFS_DFORK_PTR(dip, whichfork); + xp = (xfs_bmbt_rec_t *)XFS_DFORK_PTR(dip, whichfork); for (ep = xp; ep < &xp[nextents] && n < nex; ep++) { if (!bmap_one_extent(ep, &curoffset, eoffset, &n, bep)) break; @@ -110,7 +110,7 @@ bmap( for (;;) { nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib); nextents = be16_to_cpu(block->bb_numrecs); - xp = (xfs_bmbt_rec_64_t *) + xp = (xfs_bmbt_rec_t *) XFS_BMBT_REC_ADDR(mp, block, 1); for (ep = xp; ep < &xp[nextents] && n < nex; ep++) { if (!bmap_one_extent(ep, &curoffset, eoffset, @@ -171,9 +171,9 @@ bmap_f( push_cur(); set_cur_inode(iocur_top->ino); dip = iocur_top->data; - if (be32_to_cpu(dip->di_core.di_nextents)) + if (be32_to_cpu(dip->di_nextents)) dfork = 1; - if (be16_to_cpu(dip->di_core.di_anextents)) + if (be16_to_cpu(dip->di_anextents)) afork = 1; pop_cur(); } @@ -233,7 +233,7 @@ bmap_init(void) static int bmap_one_extent( - xfs_bmbt_rec_64_t *ep, + xfs_bmbt_rec_t *ep, xfs_dfiloff_t *offp, xfs_dfiloff_t eoff, int *idxp, @@ -271,7 +271,7 @@ bmap_one_extent( void convert_extent( - xfs_bmbt_rec_64_t *rp, + xfs_bmbt_rec_t *rp, xfs_dfiloff_t *op, xfs_dfsbno_t *sp, xfs_dfilblks_t *cp, diff --git a/db/bmap.h b/db/bmap.h index 878acc0..2895287 100644 --- a/db/bmap.h +++ b/db/bmap.h @@ -17,7 +17,7 @@ */ struct bbmap; -struct xfs_bmbt_rec_64; +struct xfs_bmbt_rec; typedef struct bmap_ext { xfs_dfiloff_t startoff; @@ -29,6 +29,6 @@ typedef struct bmap_ext { extern void bmap(xfs_dfiloff_t offset, xfs_dfilblks_t len, int whichfork, int *nexp, bmap_ext_t *bep); extern void bmap_init(void); -extern void convert_extent(struct xfs_bmbt_rec_64 *rp, xfs_dfiloff_t *op, +extern void convert_extent(struct xfs_bmbt_rec *rp, xfs_dfiloff_t *op, xfs_dfsbno_t *sp, xfs_dfilblks_t *cp, int *fp); extern void make_bbmap(struct bbmap *bbmap, int nex, bmap_ext_t *bmp); diff --git a/db/check.c b/db/check.c index a8939a4..e601e0a 100644 --- a/db/check.c +++ b/db/check.c @@ -2317,7 +2317,7 @@ process_data_dir_v2( tag_err += be16_to_cpu(*tagp) != (char *)dep - (char *)data; addr = xfs_dir2_db_off_to_dataptr(mp, db, (char *)dep - (char *)data); - xname.name = (char *)dep->name; + xname.name = dep->name; xname.len = dep->namelen; dir_hash_add(mp->m_dirnameops->hashname(&xname), addr); ptr += xfs_dir2_data_entsize(dep->namelen); @@ -2508,23 +2508,23 @@ process_dir_v1( inodata_t *id, xfs_ino_t *parent) { - xfs_fsize_t size = be64_to_cpu(dip->di_core.di_size); + xfs_fsize_t size = be64_to_cpu(dip->di_size); if (size <= XFS_DFORK_DSIZE(dip, mp) && - dip->di_core.di_format == XFS_DINODE_FMT_LOCAL) + dip->di_format == XFS_DINODE_FMT_LOCAL) *parent = process_shortform_dir_v1(dip, dot, dotdot, id); else if (size == XFS_LBSIZE(mp) && - (dip->di_core.di_format == XFS_DINODE_FMT_EXTENTS || - dip->di_core.di_format == XFS_DINODE_FMT_BTREE)) + (dip->di_format == XFS_DINODE_FMT_EXTENTS || + dip->di_format == XFS_DINODE_FMT_BTREE)) *parent = process_leaf_dir_v1(blkmap, dot, dotdot, id); else if (size >= XFS_LBSIZE(mp) && - (dip->di_core.di_format == XFS_DINODE_FMT_EXTENTS || - dip->di_core.di_format == XFS_DINODE_FMT_BTREE)) + (dip->di_format == XFS_DINODE_FMT_EXTENTS || + dip->di_format == XFS_DINODE_FMT_BTREE)) *parent = process_node_dir_v1(blkmap, dot, dotdot, id); else { dbprintf(_("bad size (%lld) or format (%d) for directory inode " "%lld\n"), - size, dip->di_core.di_format, id->ino); + size, dip->di_format, id->ino); error++; return 1; } @@ -2541,25 +2541,25 @@ process_dir_v2( xfs_ino_t *parent) { xfs_fileoff_t last = 0; - xfs_fsize_t size = be64_to_cpu(dip->di_core.di_size); + xfs_fsize_t size = be64_to_cpu(dip->di_size); if (blkmap) last = blkmap_last_off(blkmap); if (size <= XFS_DFORK_DSIZE(dip, mp) && - dip->di_core.di_format == XFS_DINODE_FMT_LOCAL) + dip->di_format == XFS_DINODE_FMT_LOCAL) *parent = process_sf_dir_v2(dip, dot, dotdot, id); else if (last == mp->m_dirblkfsbs && - (dip->di_core.di_format == XFS_DINODE_FMT_EXTENTS || - dip->di_core.di_format == XFS_DINODE_FMT_BTREE)) + (dip->di_format == XFS_DINODE_FMT_EXTENTS || + dip->di_format == XFS_DINODE_FMT_BTREE)) *parent = process_block_dir_v2(blkmap, dot, dotdot, id); else if (last >= mp->m_dirleafblk + mp->m_dirblkfsbs && - (dip->di_core.di_format == XFS_DINODE_FMT_EXTENTS || - dip->di_core.di_format == XFS_DINODE_FMT_BTREE)) + (dip->di_format == XFS_DINODE_FMT_EXTENTS || + dip->di_format == XFS_DINODE_FMT_BTREE)) *parent = process_leaf_node_dir_v2(blkmap, dot, dotdot, id, size); else { dbprintf(_("bad size (%lld) or format (%d) for directory inode " "%lld\n"), - size, dip->di_core.di_format, id->ino); + size, dip->di_format, id->ino); error++; return 1; } @@ -2646,7 +2646,7 @@ process_inode( "dev", "local", "extents", "btree", "uuid" }; - libxfs_dinode_from_disk(&idic, &dip->di_core); + libxfs_dinode_from_disk(&idic, dip); ino = XFS_AGINO_TO_INO(mp, be32_to_cpu(agf->agf_seqno), agino); if (!isfree) { @@ -2677,7 +2677,7 @@ process_inode( idic.di_nblocks, ino); error++; } - if (idic.di_version == XFS_DINODE_VERSION_1) + if (idic.di_version == 1) nlink = idic.di_onlink; else nlink = idic.di_nlink; @@ -2782,7 +2782,7 @@ process_inode( type = DBM_UNKNOWN; break; } - if (idic.di_version == XFS_DINODE_VERSION_1) + if (idic.di_version == 1) setlink_inode(id, idic.di_onlink, type == DBM_DIR, security); else { sbversion |= XFS_SB_VERSION_NLINKBIT; @@ -2910,12 +2910,12 @@ process_lclinode( xfs_fsblock_t bno; bno = XFS_INO_TO_FSB(mp, id->ino); - if (whichfork == XFS_DATA_FORK && be64_to_cpu(dip->di_core.di_size) > + if (whichfork == XFS_DATA_FORK && be64_to_cpu(dip->di_size) > XFS_DFORK_DSIZE(dip, mp)) { if (!sflag || id->ilist || CHECK_BLIST(bno)) dbprintf(_("local inode %lld data is too large (size " "%lld)\n"), - id->ino, be64_to_cpu(dip->di_core.di_size)); + id->ino, be64_to_cpu(dip->di_size)); error++; } else if (whichfork == XFS_ATTR_FORK) { @@ -3647,7 +3647,7 @@ process_sf_dir_v2( offset = XFS_DIR2_DATA_FIRST_OFFSET; for (i = sf->hdr.count - 1, i8 = 0; i >= 0; i--) { if ((__psint_t)sfe + xfs_dir2_sf_entsize_byentry(sf, sfe) - - (__psint_t)sf > be64_to_cpu(dip->di_core.di_size)) { + (__psint_t)sf > be64_to_cpu(dip->di_size)) { if (!sflag) dbprintf(_("dir %llu bad size in entry at %d\n"), id->ino, @@ -3689,10 +3689,10 @@ process_sf_dir_v2( sfe = xfs_dir2_sf_nextentry(sf, sfe); } if (i < 0 && (__psint_t)sfe - (__psint_t)sf != - be64_to_cpu(dip->di_core.di_size)) { + be64_to_cpu(dip->di_size)) { if (!sflag) dbprintf(_("dir %llu size is %lld, should be %u\n"), - id->ino, be64_to_cpu(dip->di_core.di_size), + id->ino, be64_to_cpu(dip->di_size), (uint)((char *)sfe - (char *)sf)); error++; } @@ -3769,9 +3769,9 @@ process_shortform_dir_v1( sfe->namelen, sfe->namelen, sfe->name, lino); sfe = xfs_dir_sf_nextentry(sfe); } - if ((__psint_t)sfe - (__psint_t)sf != be64_to_cpu(dip->di_core.di_size)) + if ((__psint_t)sfe - (__psint_t)sf != be64_to_cpu(dip->di_size)) dbprintf(_("dir %llu size is %lld, should be %d\n"), - id->ino, be64_to_cpu(dip->di_core.di_size), + id->ino, be64_to_cpu(dip->di_size), (int)((char *)sfe - (char *)sf)); lino = XFS_GET_DIR_INO8(sf->hdr.parent); cid = find_inode(lino, 1); diff --git a/db/convert.c b/db/convert.c index 070ac1a..1fa094b 100644 --- a/db/convert.c +++ b/db/convert.c @@ -210,14 +210,14 @@ convert_f(int argc, char **argv) } switch (wtype) { case CT_AGBLOCK: - v = XFS_DADDR_TO_AGBNO(mp, v >> BBSHIFT); + v = xfs_daddr_to_agbno(mp, v >> BBSHIFT); break; case CT_AGINO: v = (v >> mp->m_sb.sb_inodelog) % (mp->m_sb.sb_agblocks << mp->m_sb.sb_inopblog); break; case CT_AGNUMBER: - v = XFS_DADDR_TO_AGNO(mp, v >> BBSHIFT); + v = xfs_daddr_to_agno(mp, v >> BBSHIFT); break; case CT_BBOFF: v &= BBMASK; @@ -234,7 +234,7 @@ convert_f(int argc, char **argv) v = XFS_DADDR_TO_FSB(mp, v >> BBSHIFT); break; case CT_INO: - v = XFS_AGINO_TO_INO(mp, XFS_DADDR_TO_AGNO(mp, v >> BBSHIFT), + v = XFS_AGINO_TO_INO(mp, xfs_daddr_to_agno(mp, v >> BBSHIFT), (v >> mp->m_sb.sb_inodelog) % (mp->m_sb.sb_agblocks << mp->m_sb.sb_inopblog)); break; diff --git a/db/dir2sf.c b/db/dir2sf.c index 426ad16..b2db088 100644 --- a/db/dir2sf.c +++ b/db/dir2sf.c @@ -76,7 +76,7 @@ dir2_inou_i4_count( xfs_dir2_sf_t *sf; ASSERT(bitoffs(startoff) == 0); - sf = &((xfs_dinode_t *)obj)->di_u.di_dir2sf; + sf = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(obj); return sf->hdr.i8count == 0; } @@ -89,7 +89,7 @@ dir2_inou_i8_count( xfs_dir2_sf_t *sf; ASSERT(bitoffs(startoff) == 0); - sf = &((xfs_dinode_t *)obj)->di_u.di_dir2sf; + sf = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(obj); return sf->hdr.i8count != 0; } @@ -104,7 +104,7 @@ dir2_inou_size( ASSERT(bitoffs(startoff) == 0); ASSERT(idx == 0); - sf = &((xfs_dinode_t *)obj)->di_u.di_dir2sf; + sf = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(obj); return bitize(sf->hdr.i8count ? (uint)sizeof(xfs_dir2_ino8_t) : (uint)sizeof(xfs_dir2_ino4_t)); diff --git a/db/field.c b/db/field.c index 5cf97e1..6903898 100644 --- a/db/field.c +++ b/db/field.c @@ -151,7 +151,7 @@ const ftattr_t ftattrtab[] = { { FLDT_DINODE_A, "dinode_a", NULL, (char *)inode_a_flds, inode_a_size, FTARG_SIZE|FTARG_OKEMPTY, NULL, inode_a_flds }, { FLDT_DINODE_CORE, "dinode_core", NULL, (char *)inode_core_flds, - SI(bitsz(xfs_dinode_core_t)), 0, NULL, inode_core_flds }, + SI(bitsz(xfs_dinode_t)), 0, NULL, inode_core_flds }, { FLDT_DINODE_FMT, "dinode_fmt", fp_dinode_fmt, NULL, SI(bitsz(__int8_t)), 0, NULL, NULL }, { FLDT_DINODE_U, "dinode_u", NULL, (char *)inode_u_flds, inode_u_size, diff --git a/db/frag.c b/db/frag.c index 305bef1..23ccfa5 100644 --- a/db/frag.c +++ b/db/frag.c @@ -307,20 +307,18 @@ process_inode( xfs_dinode_t *dip) { __uint64_t actual; - xfs_dinode_core_t *dic; __uint64_t ideal; xfs_ino_t ino; int skipa; int skipd; - dic = &dip->di_core; ino = XFS_AGINO_TO_INO(mp, be32_to_cpu(agf->agf_seqno), agino); - switch (be16_to_cpu(dic->di_mode) & S_IFMT) { + switch (be16_to_cpu(dip->di_mode) & S_IFMT) { case S_IFDIR: skipd = !dflag; break; case S_IFREG: - if (!rflag && (be16_to_cpu(dic->di_flags) & XFS_DIFLAG_REALTIME)) + if (!rflag && (be16_to_cpu(dip->di_flags) & XFS_DIFLAG_REALTIME)) skipd = 1; else if (!Rflag && (ino == mp->m_sb.sb_rbmino || diff --git a/db/inode.c b/db/inode.c index 6f8592a..bd08d80 100644 --- a/db/inode.c +++ b/db/inode.c @@ -40,6 +40,7 @@ static int inode_core_onlink_count(void *obj, int startoff); static int inode_core_projid_count(void *obj, int startoff); static int inode_core_nlinkv1_count(void *obj, int startoff); static int inode_f(int argc, char **argv); +static int inode_u_offset(void *obj, int startoff, int idx); static int inode_u_bmbt_count(void *obj, int startoff); static int inode_u_bmx_count(void *obj, int startoff); static int inode_u_c_count(void *obj, int startoff); @@ -58,18 +59,17 @@ const field_t inode_hfld[] = { { NULL } }; +/* XXX: fix this up! */ #define OFF(f) bitize(offsetof(xfs_dinode_t, di_ ## f)) const field_t inode_flds[] = { - { "core", FLDT_DINODE_CORE, OI(OFF(core)), C1, 0, TYP_NONE }, - { "next_unlinked", FLDT_AGINO, OI(OFF(next_unlinked)), C1, 0, - TYP_INODE }, - { "u", FLDT_DINODE_U, OI(OFF(u)), C1, 0, TYP_NONE }, + { "core", FLDT_DINODE_CORE, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "u", FLDT_DINODE_U, inode_u_offset, C1, FLD_OFFSET, TYP_NONE }, { "a", FLDT_DINODE_A, inode_a_offset, inode_a_count, FLD_COUNT|FLD_OFFSET, TYP_NONE }, { NULL } }; -#define COFF(f) bitize(offsetof(xfs_dinode_core_t, di_ ## f)) +#define COFF(f) bitize(offsetof(xfs_dinode_t, di_ ## f)) const field_t inode_core_flds[] = { { "magic", FLDT_UINT16X, OI(COFF(magic)), C1, 0, TYP_NONE }, { "mode", FLDT_UINT16O, OI(COFF(mode)), C1, 0, TYP_NONE }, @@ -147,6 +147,8 @@ const field_t inode_core_flds[] = { OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_FILESTREAM_BIT-1),C1, 0, TYP_NONE }, { "gen", FLDT_UINT32D, OI(COFF(gen)), C1, 0, TYP_NONE }, + { "next_unlinked", FLDT_AGINO, OI(OFF(next_unlinked)), C1, 0, + TYP_INODE }, { NULL } }; @@ -228,7 +230,7 @@ inode_a_bmbt_count( if (!XFS_DFORK_Q(dip)) return 0; ASSERT((char *)XFS_DFORK_APTR(dip) - (char *)dip == byteize(startoff)); - return dip->di_core.di_aformat == XFS_DINODE_FMT_BTREE; + return dip->di_aformat == XFS_DINODE_FMT_BTREE; } static int @@ -244,8 +246,8 @@ inode_a_bmx_count( if (!XFS_DFORK_Q(dip)) return 0; ASSERT((char *)XFS_DFORK_APTR(dip) - (char *)dip == byteize(startoff)); - return dip->di_core.di_aformat == XFS_DINODE_FMT_EXTENTS ? - be16_to_cpu(dip->di_core.di_anextents) : 0; + return dip->di_aformat == XFS_DINODE_FMT_EXTENTS ? + be16_to_cpu(dip->di_anextents) : 0; } static int @@ -288,7 +290,7 @@ inode_a_sfattr_count( if (!XFS_DFORK_Q(dip)) return 0; ASSERT((char *)XFS_DFORK_APTR(dip) - (char *)dip == byteize(startoff)); - return dip->di_core.di_aformat == XFS_DINODE_FMT_LOCAL; + return dip->di_aformat == XFS_DINODE_FMT_LOCAL; } int @@ -303,12 +305,12 @@ inode_a_size( ASSERT(startoff == 0); ASSERT(idx == 0); dip = obj; - switch (dip->di_core.di_aformat) { + switch (dip->di_aformat) { case XFS_DINODE_FMT_LOCAL: asf = (xfs_attr_shortform_t *)XFS_DFORK_APTR(dip); return bitize(be16_to_cpu(asf->hdr.totsize)); case XFS_DINODE_FMT_EXTENTS: - return (int)be16_to_cpu(dip->di_core.di_anextents) * + return (int)be16_to_cpu(dip->di_anextents) * bitsz(xfs_bmbt_rec_t); case XFS_DINODE_FMT_BTREE: return bitize((int)XFS_DFORK_ASIZE(dip, mp)); @@ -319,54 +321,54 @@ inode_a_size( static int inode_core_nlinkv1_count( - void *obj, - int startoff) + void *obj, + int startoff) { - xfs_dinode_core_t *dic; + xfs_dinode_t *dic; ASSERT(startoff == 0); ASSERT(obj == iocur_top->data); dic = obj; - return dic->di_version == XFS_DINODE_VERSION_1; + return dic->di_version == 1; } static int inode_core_nlinkv2_count( - void *obj, - int startoff) + void *obj, + int startoff) { - xfs_dinode_core_t *dic; + xfs_dinode_t *dic; ASSERT(startoff == 0); ASSERT(obj == iocur_top->data); dic = obj; - return dic->di_version == XFS_DINODE_VERSION_2; + return dic->di_version == 2; } static int inode_core_onlink_count( - void *obj, - int startoff) + void *obj, + int startoff) { - xfs_dinode_core_t *dic; + xfs_dinode_t *dic; ASSERT(startoff == 0); ASSERT(obj == iocur_top->data); dic = obj; - return dic->di_version == XFS_DINODE_VERSION_2; + return dic->di_version == 2; } static int inode_core_projid_count( - void *obj, - int startoff) + void *obj, + int startoff) { - xfs_dinode_core_t *dic; + xfs_dinode_t *dic; ASSERT(startoff == 0); ASSERT(obj == iocur_top->data); dic = obj; - return dic->di_version == XFS_DINODE_VERSION_2; + return dic->di_version == 2; } static int @@ -430,6 +432,20 @@ inode_size( } static int +inode_u_offset( + void *obj, + int startoff, + int idx) +{ + xfs_dinode_t *dip; + + ASSERT(startoff == 0); + ASSERT(idx == 0); + dip = obj; + return bitize((int)((char *)XFS_DFORK_DPTR(dip) - (char *)dip)); +} + +static int inode_u_bmbt_count( void *obj, int startoff) @@ -439,8 +455,8 @@ inode_u_bmbt_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_BTREE; + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_BTREE; } static int @@ -453,9 +469,9 @@ inode_u_bmx_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_EXTENTS ? - be32_to_cpu(dip->di_core.di_nextents) : 0; + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_EXTENTS ? + be32_to_cpu(dip->di_nextents) : 0; } static int @@ -468,10 +484,10 @@ inode_u_c_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_LOCAL && - (be16_to_cpu(dip->di_core.di_mode) & S_IFMT) == S_IFREG ? - (int)be64_to_cpu(dip->di_core.di_size) : 0; + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_LOCAL && + (be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFREG ? + (int)be64_to_cpu(dip->di_size) : 0; } static int @@ -484,8 +500,8 @@ inode_u_dev_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_DEV; + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_DEV; } static int @@ -498,8 +514,8 @@ inode_u_muuid_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_UUID; + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_UUID; } static int @@ -512,9 +528,9 @@ inode_u_sfdir_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_LOCAL && - (be16_to_cpu(dip->di_core.di_mode) & S_IFMT) == S_IFDIR + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_LOCAL && + (be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFDIR && !xfs_sb_version_hasdirv2(&mp->m_sb); } @@ -528,9 +544,9 @@ inode_u_sfdir2_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_LOCAL && - (be16_to_cpu(dip->di_core.di_mode) & S_IFMT) == S_IFDIR && + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_LOCAL && + (be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFDIR && xfs_sb_version_hasdirv2(&mp->m_sb); } @@ -545,13 +561,13 @@ inode_u_size( ASSERT(startoff == 0); ASSERT(idx == 0); dip = obj; - switch (dip->di_core.di_format) { + switch (dip->di_format) { case XFS_DINODE_FMT_DEV: return bitsz(xfs_dev_t); case XFS_DINODE_FMT_LOCAL: - return bitize((int)be64_to_cpu(dip->di_core.di_size)); + return bitize((int)be64_to_cpu(dip->di_size)); case XFS_DINODE_FMT_EXTENTS: - return (int)be32_to_cpu(dip->di_core.di_nextents) * + return (int)be32_to_cpu(dip->di_nextents) * bitsz(xfs_bmbt_rec_t); case XFS_DINODE_FMT_BTREE: return bitize((int)XFS_DFORK_DSIZE(dip, mp)); @@ -572,10 +588,10 @@ inode_u_symlink_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_LOCAL && - (be16_to_cpu(dip->di_core.di_mode) & S_IFMT) == S_IFLNK ? - (int)be64_to_cpu(dip->di_core.di_size) : 0; + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_LOCAL && + (be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFLNK ? + (int)be64_to_cpu(dip->di_size) : 0; } void @@ -611,7 +627,7 @@ set_cur_inode( off_cur(offset << mp->m_sb.sb_inodelog, mp->m_sb.sb_inodesize); dip = iocur_top->data; iocur_top->ino = ino; - iocur_top->mode = be16_to_cpu(dip->di_core.di_mode); + iocur_top->mode = be16_to_cpu(dip->di_mode); if ((iocur_top->mode & S_IFMT) == S_IFDIR) iocur_top->dirino = ino; diff --git a/db/metadump.c b/db/metadump.c index ef6e571..884d338 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -502,8 +502,8 @@ obfuscate_sf_dir( __uint64_t ino_dir_size; int i; - sfp = &dip->di_u.di_dir2sf; - ino_dir_size = be64_to_cpu(dip->di_core.di_size); + sfp = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); + ino_dir_size = be64_to_cpu(dip->di_size); if (ino_dir_size > XFS_DFORK_DSIZE(dip, mp)) { ino_dir_size = XFS_DFORK_DSIZE(dip, mp); if (show_warnings) @@ -555,8 +555,9 @@ obfuscate_sf_symlink( xfs_dinode_t *dip) { __uint64_t len; + char *buf; - len = be64_to_cpu(dip->di_core.di_size); + len = be64_to_cpu(dip->di_size); if (len > XFS_DFORK_DSIZE(dip, mp)) { if (show_warnings) print_warning("invalid size (%d) in symlink inode %llu", @@ -564,8 +565,9 @@ obfuscate_sf_symlink( len = XFS_DFORK_DSIZE(dip, mp); } + buf = (char *)XFS_DFORK_DPTR(dip); while (len > 0) - dip->di_u.di_symlink[--len] = random() % 127 + 1; + buf[--len] = random() % 127 + 1; } static void @@ -841,7 +843,7 @@ obfuscate_attr_blocks( break; } if (entry->flags & XFS_ATTR_LOCAL) { - local = XFS_ATTR_LEAF_NAME_LOCAL(leaf, i); + local = xfs_attr_leaf_name_local(leaf, i); if (local->namelen == 0) { if (show_warnings) print_warning("zero length for " @@ -854,7 +856,7 @@ obfuscate_attr_blocks( memset(&local->nameval[local->namelen], 0, be16_to_cpu(local->valuelen)); } else { - remote = XFS_ATTR_LEAF_NAME_REMOTE(leaf, i); + remote = xfs_attr_leaf_name_remote(leaf, i); if (remote->namelen == 0 || remote->valueblk == 0) { if (show_warnings) @@ -1143,7 +1145,7 @@ process_inode_data( xfs_dinode_t *dip, typnm_t itype) { - switch (dip->di_core.di_format) { + switch (dip->di_format) { case XFS_DINODE_FMT_LOCAL: if (!dont_obfuscate) switch (itype) { @@ -1180,7 +1182,7 @@ process_inode( cur_ino = XFS_AGINO_TO_INO(mp, agno, agino); /* copy appropriate data fork metadata */ - switch (be16_to_cpu(dip->di_core.di_mode) & S_IFMT) { + switch (be16_to_cpu(dip->di_mode) & S_IFMT) { case S_IFDIR: memset(&dir_data, 0, sizeof(dir_data)); success = process_inode_data(dip, TYP_DIR2); @@ -1198,7 +1200,7 @@ process_inode( /* copy extended attributes if they exist and forkoff is valid */ if (success && XFS_DFORK_DSIZE(dip, mp) < XFS_LITINO(mp)) { attr_data.remote_val_count = 0; - switch (dip->di_core.di_aformat) { + switch (dip->di_aformat) { case XFS_DINODE_FMT_LOCAL: if (!dont_obfuscate) obfuscate_sf_attr(dip); diff --git a/include/Makefile b/include/Makefile index 912f1ba..a84963c 100644 --- a/include/Makefile +++ b/include/Makefile @@ -19,7 +19,8 @@ TOPDIR = .. include $(TOPDIR)/include/builddefs QAHFILES = libxfs.h libxlog.h \ - bitops.h cache.h kmem.h list.h parent.h swab.h \ + atomic.h bitops.h cache.h kmem.h list.h hlist.h parent.h radix-tree.h \ + swab.h \ xfs_ag.h xfs_alloc.h xfs_alloc_btree.h xfs_arch.h xfs_attr_leaf.h \ xfs_attr_sf.h xfs_bit.h xfs_bmap.h xfs_bmap_btree.h xfs_btree.h \ xfs_btree_trace.h xfs_buf_item.h xfs_da_btree.h xfs_dinode.h \ @@ -28,7 +29,7 @@ QAHFILES = libxfs.h libxlog.h \ xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ xfs_imap.h xfs_inode.h xfs_inode_item.h xfs_inum.h \ xfs_log.h xfs_log_priv.h xfs_log_recover.h xfs_metadump.h \ - xfs_mount.h xfs_quota.h xfs_rtalloc.h xfs_sb.h \ + xfs_mount.h xfs_quota.h xfs_rtalloc.h xfs_sb.h xfs_trace.h \ xfs_trans.h xfs_trans_space.h xfs_types.h xfs_dfrag.h HFILES = handle.h jdm.h xqm.h xfs.h xfs_fs.h diff --git a/include/atomic.h b/include/atomic.h new file mode 100644 index 0000000..bdf1083 --- /dev/null +++ b/include/atomic.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2011 RedHat, 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 __ATOMIC_H__ +#define __ATOMIC_H__ + +typedef int32_t atomic_t; +typedef int64_t atomic64_t; + +#define atomic_inc_return(x) (++(*(x))) +#define atomic_dec_return(x) (--(*(x))) + +#define atomic64_read(x) *(x) +#define atomic64_set(x, v) (*(x) = v) + +#endif /* __ATOMIC_H__ */ + diff --git a/include/libxfs.h b/include/libxfs.h index e7199c7..9740fbd 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -25,10 +25,13 @@ #include #include +#include #include #include #include #include +#include +#include #include #include @@ -54,6 +57,7 @@ #include #include #include +#include #ifndef XFS_SUPER_MAGIC @@ -62,6 +66,10 @@ #define xfs_isset(a,i) ((a)[(i)/(sizeof((a))*NBBY)] & (1<<((i)%(sizeof((a))*NBBY)))) +#define __round_mask(x, y) ((__typeof__(x))((y)-1)) +#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) +#define round_down(x, y) ((x) & ~__round_mask(x, y)) + /* * Argument structure for libxfs_init(). */ @@ -164,7 +172,7 @@ typedef struct xfs_mount { uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */ uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ uint m_in_maxlevels; /* XFS_IN_MAXLEVELS */ - xfs_perag_t *m_perag; /* per-ag accounting info */ + struct radix_tree_root m_perag_tree; uint m_flags; /* global mount flags */ uint m_qflags; /* quota status flags */ uint m_attroffset; /* inode attribute offset */ @@ -240,8 +248,11 @@ enum xfs_buf_flags_t { /* b_flags bits */ #define XFS_BUF_SIZE(bp) ((bp)->b_bcount) #define XFS_BUF_COUNT(bp) ((bp)->b_bcount) #define XFS_BUF_TARGET(bp) ((bp)->b_dev) -#define XFS_BUF_SET_PTR(bp,p,cnt) ((bp)->b_addr = (char *)(p)); \ - XFS_BUF_SET_COUNT(bp,cnt) +#define XFS_BUF_SET_PTR(bp,p,cnt) ({ \ + (bp)->b_addr = (char *)(p); \ + XFS_BUF_SET_COUNT(bp,cnt); \ +}) + #define XFS_BUF_SET_ADDR(bp,blk) ((bp)->b_blkno = (blk)) #define XFS_BUF_SET_COUNT(bp,cnt) ((bp)->b_bcount = (cnt)) @@ -329,6 +340,7 @@ typedef struct xfs_inode_log_item { unsigned short ili_flags; /* misc flags */ unsigned int ili_last_fields; /* fields when flushed*/ xfs_inode_log_format_t ili_format; /* logged structure */ + int ili_lock_flags; } xfs_inode_log_item_t; typedef struct xfs_buf_log_item { @@ -352,7 +364,7 @@ typedef struct xfs_trans { long t_fdblocks_delta; /* superblock fdblocks chg */ long t_frextents_delta; /* superblock freextents chg */ unsigned int t_items_free; /* log item descs free */ - xfs_log_item_chunk_t t_items; /* first log item desc chunk */ + struct list_head t_items; /* first log item desc chunk */ } xfs_trans_t; extern xfs_trans_t *libxfs_trans_alloc (xfs_mount_t *, int); @@ -368,6 +380,7 @@ extern int libxfs_trans_iget (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, extern void libxfs_trans_iput(xfs_trans_t *, struct xfs_inode *, uint); extern void libxfs_trans_ijoin (xfs_trans_t *, struct xfs_inode *, uint); extern void libxfs_trans_ihold (xfs_trans_t *, struct xfs_inode *); +extern void libxfs_trans_ijoin_ref(xfs_trans_t *, struct xfs_inode *, int); extern void libxfs_trans_log_inode (xfs_trans_t *, struct xfs_inode *, uint); @@ -390,10 +403,8 @@ typedef struct xfs_inode { struct cache_node i_node; xfs_mount_t *i_mount; /* fs mount struct ptr */ xfs_ino_t i_ino; /* inode number (agno/agino) */ - xfs_daddr_t i_blkno; /* blkno of inode buffer */ + struct xfs_imap i_imap; /* location for xfs_imap() */ dev_t i_dev; /* dev for this inode */ - ushort i_len; /* len of inode buffer */ - ushort i_boffset; /* off of inode in buffer */ xfs_ifork_t *i_afp; /* attribute fork pointer */ xfs_ifork_t i_df; /* data fork */ xfs_trans_t *i_transp; /* ptr to owning transaction */ @@ -418,7 +429,8 @@ extern int libxfs_inode_alloc (xfs_trans_t **, xfs_inode_t *, mode_t, struct fsxattr *, xfs_inode_t **); extern void libxfs_trans_inode_alloc_buf (xfs_trans_t *, xfs_buf_t *); -extern void libxfs_ichgtime (xfs_inode_t *, int); +extern void libxfs_trans_ichgtime(struct xfs_trans *, + struct xfs_inode *, int); extern int libxfs_iflush_int (xfs_inode_t *, xfs_buf_t *); extern int libxfs_iread (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, xfs_inode_t *, xfs_daddr_t); @@ -431,6 +443,9 @@ extern int libxfs_iget (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, uint, xfs_inode_t **, xfs_daddr_t); extern void libxfs_iput (xfs_inode_t *, uint); +extern int xfs_imap_to_bp(xfs_mount_t *mp, xfs_trans_t *tp, struct xfs_imap *imap, + xfs_buf_t **bpp, uint buf_flags, uint iget_flags); + #include /* dirv1 support in db & repair */ #include #include @@ -466,12 +481,14 @@ extern unsigned long libxfs_physmem(void); /* in kilobytes */ #include #include #include -#include #include #include +#define XFS_INOBT_CLR_FREE(rp,i) ((rp)->ir_free &= ~XFS_INOBT_MASK(i)) +#define XFS_INOBT_SET_FREE(rp,i) ((rp)->ir_free |= XFS_INOBT_MASK(i)) #define XFS_INOBT_IS_FREE_DISK(rp,i) \ ((be64_to_cpu((rp)->ir_free) & XFS_INOBT_MASK(i)) != 0) + /* * public xfs kernel routines to be called as libxfs_* */ @@ -480,14 +497,17 @@ extern unsigned long libxfs_physmem(void); /* in kilobytes */ int libxfs_alloc_fix_freelist(xfs_alloc_arg_t *, int); /* xfs_attr.c */ -int libxfs_attr_get(struct xfs_inode *, const char *, char *, int *, int); -int libxfs_attr_set(struct xfs_inode *, const char *, char *, int, int); -int libxfs_attr_remove(struct xfs_inode *, const char *, int); +int libxfs_attr_get(struct xfs_inode *, const unsigned char *, + unsigned char *, int *, int); +int libxfs_attr_set(struct xfs_inode *, const unsigned char *, + unsigned char *, int, int); +int libxfs_attr_remove(struct xfs_inode *, const unsigned char *, int); /* xfs_bmap.c */ xfs_bmbt_rec_host_t *xfs_bmap_search_extents(xfs_inode_t *, xfs_fileoff_t, int, int *, xfs_extnum_t *, xfs_bmbt_irec_t *, xfs_bmbt_irec_t *); +void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); /* xfs_attr_leaf.h */ #define libxfs_attr_leaf_newentsize xfs_attr_leaf_newentsize diff --git a/include/libxlog.h b/include/libxlog.h index 2a8a251..d1142ab 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -39,13 +39,12 @@ typedef struct log { int l_iclog_size; /* size of log in bytes */ int l_iclog_size_log;/* log power size of log */ int l_iclog_bufs; /* number of iclog buffers */ - int l_grant_reserve_cycle; /* */ - int l_grant_reserve_bytes; /* */ - int l_grant_write_cycle; /* */ - int l_grant_write_bytes; /* */ + atomic64_t l_grant_reserve_head; + atomic64_t l_grant_write_head; uint l_sectbb_log; /* log2 of sector size in bbs */ uint l_sectbb_mask; /* sector size (in BBs) * alignment mask */ + int l_sectBBsize; /* size of log sector in 512 byte chunks */ } xlog_t; #include @@ -91,7 +90,10 @@ extern libxfs_init_t x; extern struct xfs_buf *xlog_get_bp(xlog_t *, int); extern void xlog_put_bp(struct xfs_buf *); -extern int xlog_bread(xlog_t *, xfs_daddr_t, int, struct xfs_buf *); +extern int xlog_bread(xlog_t *log, xfs_daddr_t blk_no, int nbblks, + xfs_buf_t *bp, xfs_caddr_t *offset); +extern int xlog_bread_noalign(xlog_t *log, xfs_daddr_t blk_no, int nbblks, + xfs_buf_t *bp); extern int xlog_find_zeroed(xlog_t *log, xfs_daddr_t *blk_no); extern int xlog_find_cycle_start(xlog_t *log, xfs_buf_t *bp, @@ -110,7 +112,7 @@ extern int xlog_print_find_oldest(xlog_t *log, xfs_daddr_t *last_blk); /* for transactional view */ extern void xlog_recover_print_trans_head(xlog_recover_t *tr); extern void xlog_recover_print_trans(xlog_recover_t *trans, - xlog_recover_item_t *itemq, int print); + struct list_head *itemq, int print); extern int xlog_do_recovery_pass(xlog_t *log, xfs_daddr_t head_blk, xfs_daddr_t tail_blk, int pass); extern int xlog_recover_do_trans(xlog_t *log, xlog_recover_t *trans, @@ -120,4 +122,6 @@ extern int xlog_header_check_recover(xfs_mount_t *mp, extern int xlog_header_check_mount(xfs_mount_t *mp, xlog_rec_header_t *head); +#define xlog_assign_atomic_lsn(l,a,b) ((void) 0) +#define xlog_assign_grant_head(l,a,b) ((void) 0) #endif /* LIBXLOG_H */ diff --git a/include/list.h b/include/list.h index 2389a6c..3f087a4 100644 --- a/include/list.h +++ b/include/list.h @@ -27,6 +27,12 @@ struct list_head { struct list_head *prev; }; +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +#define INIT_LIST_HEAD(list) list_head_init(list) static inline void list_head_init(struct list_head *list) { list->next = list->prev = list; @@ -68,6 +74,11 @@ static inline void list_del_init(struct list_head *entry) list_head_init(entry); } +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); +} + static inline void list_move(struct list_head *list, struct list_head *head) { __list_del(list->prev, list->next); diff --git a/include/radix-tree.h b/include/radix-tree.h new file mode 100644 index 0000000..e16e08d --- /dev/null +++ b/include/radix-tree.h @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2001 Momchil Velikov + * Portions Copyright (C) 2001 Christoph Hellwig + * + * 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, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef __XFS_SUPPORT_RADIX_TREE_H__ +#define __XFS_SUPPORT_RADIX_TREE_H__ + +#define RADIX_TREE_TAGS + +struct radix_tree_root { + unsigned int height; + struct radix_tree_node *rnode; +}; + +#define RADIX_TREE_INIT(mask) { \ + .height = 0, \ + .rnode = NULL, \ +} + +#define RADIX_TREE(name, mask) \ + struct radix_tree_root name = RADIX_TREE_INIT(mask) + +#define INIT_RADIX_TREE(root, mask) \ +do { \ + (root)->height = 0; \ + (root)->rnode = NULL; \ +} while (0) + +#ifdef RADIX_TREE_TAGS +#define RADIX_TREE_MAX_TAGS 2 +#endif + +int radix_tree_insert(struct radix_tree_root *, unsigned long, void *); +void *radix_tree_lookup(struct radix_tree_root *, unsigned long); +void **radix_tree_lookup_slot(struct radix_tree_root *, unsigned long); +void *radix_tree_lookup_first(struct radix_tree_root *, unsigned long *); +void *radix_tree_delete(struct radix_tree_root *, unsigned long); +unsigned int +radix_tree_gang_lookup(struct radix_tree_root *root, void **results, + unsigned long first_index, unsigned int max_items); +unsigned int +radix_tree_gang_lookup_ex(struct radix_tree_root *root, void **results, + unsigned long first_index, unsigned long last_index, + unsigned int max_items); + +void radix_tree_init(void); + +#ifdef RADIX_TREE_TAGS +void *radix_tree_tag_set(struct radix_tree_root *root, + unsigned long index, unsigned int tag); +void *radix_tree_tag_clear(struct radix_tree_root *root, + unsigned long index, unsigned int tag); +int radix_tree_tag_get(struct radix_tree_root *root, + unsigned long index, unsigned int tag); +unsigned int +radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results, + unsigned long first_index, unsigned int max_items, + unsigned int tag); +int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag); +#endif + +#endif /* __XFS_SUPPORT_RADIX_TREE_H__ */ diff --git a/include/xfs_ag.h b/include/xfs_ag.h index 729ee3e..5adce91 100644 --- a/include/xfs_ag.h +++ b/include/xfs_ag.h @@ -86,11 +86,27 @@ typedef struct xfs_agf { #define XFS_AGF_NUM_BITS 12 #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) +#define XFS_AGF_FLAGS \ + { XFS_AGF_MAGICNUM, "MAGICNUM" }, \ + { XFS_AGF_VERSIONNUM, "VERSIONNUM" }, \ + { XFS_AGF_SEQNO, "SEQNO" }, \ + { XFS_AGF_LENGTH, "LENGTH" }, \ + { XFS_AGF_ROOTS, "ROOTS" }, \ + { XFS_AGF_LEVELS, "LEVELS" }, \ + { XFS_AGF_FLFIRST, "FLFIRST" }, \ + { XFS_AGF_FLLAST, "FLLAST" }, \ + { XFS_AGF_FLCOUNT, "FLCOUNT" }, \ + { XFS_AGF_FREEBLKS, "FREEBLKS" }, \ + { XFS_AGF_LONGEST, "LONGEST" }, \ + { XFS_AGF_BTREEBLKS, "BTREEBLKS" } + /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) #define XFS_AGF_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp)) #define XFS_BUF_TO_AGF(bp) ((xfs_agf_t *)XFS_BUF_PTR(bp)) +extern int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_agnumber_t agno, int flags, struct xfs_buf **bpp); /* * Size of the unlinked inode hash table in the agi. @@ -142,6 +158,9 @@ typedef struct xfs_agi { #define XFS_AGI_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGI_DADDR(mp)) #define XFS_BUF_TO_AGI(bp) ((xfs_agi_t *)XFS_BUF_PTR(bp)) +extern int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_agnumber_t agno, struct xfs_buf **bpp); + /* * The third a.g. block contains the a.g. freelist, an array * of block pointers to blocks owned by the allocation btree code. @@ -156,29 +175,33 @@ typedef struct xfs_agfl { } xfs_agfl_t; /* - * Busy block/extent entry. Used in perag to mark blocks that have been freed - * but whose transactions aren't committed to disk yet. + * Busy block/extent entry. Indexed by a rbtree in perag to mark blocks that + * have been freed but whose transactions aren't committed to disk yet. + * + * Note that we use the transaction ID to record the transaction, not the + * transaction structure itself. See xfs_alloc_busy_insert() for details. */ -typedef struct xfs_perag_busy { - xfs_agblock_t busy_start; - xfs_extlen_t busy_length; - struct xfs_trans *busy_tp; /* transaction that did the free */ -} xfs_perag_busy_t; +struct xfs_busy_extent { +#ifdef __KERNEL__ + struct rb_node rb_node; /* ag by-bno indexed search tree */ +#endif + struct list_head list; /* transaction busy extent list */ + xfs_agnumber_t agno; + xfs_agblock_t bno; + xfs_extlen_t length; + xlog_tid_t tid; /* transaction that created this */ +}; /* * Per-ag incore structure, copies of information in agf and agi, * to improve the performance of allocation group selection. - * - * pick sizes which fit in allocation buckets well */ -#if (BITS_PER_LONG == 32) -#define XFS_PAGB_NUM_SLOTS 84 -#elif (BITS_PER_LONG == 64) #define XFS_PAGB_NUM_SLOTS 128 -#endif -typedef struct xfs_perag -{ +typedef struct xfs_perag { + struct xfs_mount *pag_mount; /* owner filesystem */ + xfs_agnumber_t pag_agno; /* AG this structure belongs to */ + atomic_t pag_ref; /* perag reference count */ char pagf_init; /* this agf's entry is initialized */ char pagi_init; /* this agi's entry is initialized */ char pagf_metadata; /* the agf is preferred to be metadata */ @@ -191,19 +214,44 @@ typedef struct xfs_perag __uint32_t pagf_btreeblks; /* # of blocks held in AGF btrees */ xfs_agino_t pagi_freecount; /* number of free inodes */ xfs_agino_t pagi_count; /* number of allocated inodes */ - int pagb_count; /* pagb slots in use */ - xfs_perag_busy_t *pagb_list; /* unstable blocks */ + + /* + * Inode allocation search lookup optimisation. + * If the pagino matches, the search for new inodes + * doesn't need to search the near ones again straight away + */ + xfs_agino_t pagl_pagino; + xfs_agino_t pagl_leftrec; + xfs_agino_t pagl_rightrec; #ifdef __KERNEL__ - spinlock_t pagb_lock; /* lock for pagb_list */ + spinlock_t pagb_lock; /* lock for pagb_tree */ + struct rb_root pagb_tree; /* ordered tree of busy extents */ atomic_t pagf_fstrms; /* # of filestreams active in this AG */ - int pag_ici_init; /* incore inode cache initialised */ - 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 */ + unsigned long pag_ici_reclaim_cursor; /* reclaim restart point */ + + /* buffer cache index */ + spinlock_t pag_buf_lock; /* lock for pag_buf_tree */ + struct rb_root pag_buf_tree; /* ordered tree of active buffers */ + + /* for rcu-safe freeing */ + struct rcu_head rcu_head; #endif + int pagb_count; /* pagb slots in use */ } xfs_perag_t; +/* + * tags for inode radix tree + */ +#define XFS_ICI_NO_TAG (-1) /* special flag for an untagged lookup + in xfs_inode_ag_iterator */ +#define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */ + #define XFS_AG_MAXLEVELS(mp) ((mp)->m_ag_maxlevels) #define XFS_MIN_FREELIST_RAW(bl,cl,mp) \ (MIN(bl + 1, XFS_AG_MAXLEVELS(mp)) + MIN(cl + 1, XFS_AG_MAXLEVELS(mp))) @@ -213,15 +261,15 @@ typedef struct xfs_perag be32_to_cpu((a)->agf_levels[XFS_BTNUM_CNTi]), mp)) #define XFS_MIN_FREELIST_PAG(pag,mp) \ (XFS_MIN_FREELIST_RAW( \ - (uint_t)(pag)->pagf_levels[XFS_BTNUM_BNOi], \ - (uint_t)(pag)->pagf_levels[XFS_BTNUM_CNTi], mp)) + (unsigned int)(pag)->pagf_levels[XFS_BTNUM_BNOi], \ + (unsigned int)(pag)->pagf_levels[XFS_BTNUM_CNTi], mp)) #define XFS_AGB_TO_FSB(mp,agno,agbno) \ (((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno)) #define XFS_FSB_TO_AGNO(mp,fsbno) \ ((xfs_agnumber_t)((fsbno) >> (mp)->m_sb.sb_agblklog)) #define XFS_FSB_TO_AGBNO(mp,fsbno) \ - ((xfs_agblock_t)((fsbno) & XFS_MASK32LO((mp)->m_sb.sb_agblklog))) + ((xfs_agblock_t)((fsbno) & xfs_mask32lo((mp)->m_sb.sb_agblklog))) #define XFS_AGB_TO_DADDR(mp,agno,agbno) \ ((xfs_daddr_t)XFS_FSB_TO_BB(mp, \ (xfs_fsblock_t)(agno) * (mp)->m_sb.sb_agblocks + (agbno))) @@ -234,8 +282,8 @@ typedef struct xfs_perag #define XFS_AG_CHECK_DADDR(mp,d,len) \ ((len) == 1 ? \ ASSERT((d) == XFS_SB_DADDR || \ - XFS_DADDR_TO_AGBNO(mp, d) != XFS_SB_DADDR) : \ - ASSERT(XFS_DADDR_TO_AGNO(mp, d) == \ - XFS_DADDR_TO_AGNO(mp, (d) + (len) - 1))) + xfs_daddr_to_agbno(mp, d) != XFS_SB_DADDR) : \ + ASSERT(xfs_daddr_to_agno(mp, d) == \ + xfs_daddr_to_agno(mp, (d) + (len) - 1))) #endif /* __XFS_AG_H__ */ diff --git a/include/xfs_alloc.h b/include/xfs_alloc.h index 5881727..895009a 100644 --- a/include/xfs_alloc.h +++ b/include/xfs_alloc.h @@ -22,20 +22,30 @@ struct xfs_buf; struct xfs_mount; struct xfs_perag; struct xfs_trans; +struct xfs_busy_extent; /* * Freespace allocation types. Argument to xfs_alloc_[v]extent. */ -typedef enum xfs_alloctype -{ - XFS_ALLOCTYPE_ANY_AG, /* allocate anywhere, use rotor */ - XFS_ALLOCTYPE_FIRST_AG, /* ... start at ag 0 */ - XFS_ALLOCTYPE_START_AG, /* anywhere, start in this a.g. */ - XFS_ALLOCTYPE_THIS_AG, /* anywhere in this a.g. */ - XFS_ALLOCTYPE_START_BNO, /* near this block else anywhere */ - XFS_ALLOCTYPE_NEAR_BNO, /* in this a.g. and near this block */ - XFS_ALLOCTYPE_THIS_BNO /* at exactly this block */ -} xfs_alloctype_t; +#define XFS_ALLOCTYPE_ANY_AG 0x01 /* allocate anywhere, use rotor */ +#define XFS_ALLOCTYPE_FIRST_AG 0x02 /* ... start at ag 0 */ +#define XFS_ALLOCTYPE_START_AG 0x04 /* anywhere, start in this a.g. */ +#define XFS_ALLOCTYPE_THIS_AG 0x08 /* anywhere in this a.g. */ +#define XFS_ALLOCTYPE_START_BNO 0x10 /* near this block else anywhere */ +#define XFS_ALLOCTYPE_NEAR_BNO 0x20 /* in this a.g. and near this block */ +#define XFS_ALLOCTYPE_THIS_BNO 0x40 /* at exactly this block */ + +/* this should become an enum again when the tracing code is fixed */ +typedef unsigned int xfs_alloctype_t; + +#define XFS_ALLOC_TYPES \ + { XFS_ALLOCTYPE_ANY_AG, "ANY_AG" }, \ + { XFS_ALLOCTYPE_FIRST_AG, "FIRST_AG" }, \ + { XFS_ALLOCTYPE_START_AG, "START_AG" }, \ + { XFS_ALLOCTYPE_THIS_AG, "THIS_AG" }, \ + { XFS_ALLOCTYPE_START_BNO, "START_BNO" }, \ + { XFS_ALLOCTYPE_NEAR_BNO, "NEAR_BNO" }, \ + { XFS_ALLOCTYPE_THIS_BNO, "THIS_BNO" } /* * Flags for xfs_alloc_fix_freelist. @@ -100,37 +110,23 @@ typedef struct xfs_alloc_arg { #define XFS_ALLOC_USERDATA 1 /* allocation is for user data*/ #define XFS_ALLOC_INITIAL_USER_DATA 2 /* special case start of file */ - -#ifdef __KERNEL__ - -#if defined(XFS_ALLOC_TRACE) /* - * Allocation tracing buffer size. + * Find the length of the longest extent in an AG. */ -#define XFS_ALLOC_TRACE_SIZE 4096 -extern ktrace_t *xfs_alloc_trace_buf; +xfs_extlen_t +xfs_alloc_longest_free_extent(struct xfs_mount *mp, + struct xfs_perag *pag); -/* - * Types for alloc tracing. - */ -#define XFS_ALLOC_KTRACE_ALLOC 1 -#define XFS_ALLOC_KTRACE_FREE 2 -#define XFS_ALLOC_KTRACE_MODAGF 3 -#define XFS_ALLOC_KTRACE_BUSY 4 -#define XFS_ALLOC_KTRACE_UNBUSY 5 -#define XFS_ALLOC_KTRACE_BUSYSEARCH 6 -#endif +#ifdef __KERNEL__ void -xfs_alloc_mark_busy(xfs_trans_t *tp, +xfs_alloc_busy_insert(xfs_trans_t *tp, xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len); void -xfs_alloc_clear_busy(xfs_trans_t *tp, - xfs_agnumber_t ag, - int idx); +xfs_alloc_busy_clear(struct xfs_mount *mp, struct xfs_busy_extent *busyp); #endif /* __KERNEL__ */ diff --git a/include/xfs_arch.h b/include/xfs_arch.h index 53d5e70..0902249 100644 --- a/include/xfs_arch.h +++ b/include/xfs_arch.h @@ -73,28 +73,6 @@ static inline void be64_add_cpu(__be64 *a, __s64 b) #endif /* __KERNEL__ */ -/* do we need conversion? */ -#define ARCH_NOCONVERT 1 -#ifdef XFS_NATIVE_HOST -# define ARCH_CONVERT ARCH_NOCONVERT -#else -# define ARCH_CONVERT 0 -#endif - -/* generic swapping macros */ - -#ifndef HAVE_SWABMACROS -#define INT_SWAP16(type,var) ((typeof(type))(__swab16((__u16)(var)))) -#define INT_SWAP32(type,var) ((typeof(type))(__swab32((__u32)(var)))) -#define INT_SWAP64(type,var) ((typeof(type))(__swab64((__u64)(var)))) -#endif - -#define INT_SWAP(type, var) \ - ((sizeof(type) == 8) ? INT_SWAP64(type,var) : \ - ((sizeof(type) == 4) ? INT_SWAP32(type,var) : \ - ((sizeof(type) == 2) ? INT_SWAP16(type,var) : \ - (var)))) - /* * get and set integers from potentially unaligned locations */ @@ -107,16 +85,6 @@ static inline void be64_add_cpu(__be64 *a, __s64 b) ((__u8*)(pointer))[1] = (((value) ) & 0xff); \ } -/* does not return a value */ -#define INT_SET(reference,arch,valueref) \ - (__builtin_constant_p(valueref) ? \ - (void)( (reference) = ( ((arch) != ARCH_NOCONVERT) ? (INT_SWAP((reference),(valueref))) : (valueref)) ) : \ - (void)( \ - ((reference) = (valueref)), \ - ( ((arch) != ARCH_NOCONVERT) ? (reference) = INT_SWAP((reference),(reference)) : 0 ) \ - ) \ - ) - /* * In directories inode numbers are stored as unaligned arrays of unsigned * 8bit integers on disk. diff --git a/include/xfs_attr_leaf.h b/include/xfs_attr_leaf.h index 83e9af4..9c7d22f 100644 --- a/include/xfs_attr_leaf.h +++ b/include/xfs_attr_leaf.h @@ -151,8 +151,6 @@ typedef struct xfs_attr_leafblock { /* * Cast typed pointers for "local" and "remote" name/value structs. */ -#define XFS_ATTR_LEAF_NAME_REMOTE(leafp,idx) \ - xfs_attr_leaf_name_remote(leafp,idx) static inline xfs_attr_leaf_name_remote_t * xfs_attr_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) { @@ -160,8 +158,6 @@ xfs_attr_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; } -#define XFS_ATTR_LEAF_NAME_LOCAL(leafp,idx) \ - xfs_attr_leaf_name_local(leafp,idx) static inline xfs_attr_leaf_name_local_t * xfs_attr_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) { @@ -169,8 +165,6 @@ xfs_attr_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; } -#define XFS_ATTR_LEAF_NAME(leafp,idx) \ - xfs_attr_leaf_name(leafp,idx) static inline char *xfs_attr_leaf_name(xfs_attr_leafblock_t *leafp, int idx) { return &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; @@ -181,24 +175,18 @@ static inline char *xfs_attr_leaf_name(xfs_attr_leafblock_t *leafp, int idx) * a "local" name/value structure, a "remote" name/value structure, and * a pointer which might be either. */ -#define XFS_ATTR_LEAF_ENTSIZE_REMOTE(nlen) \ - xfs_attr_leaf_entsize_remote(nlen) static inline int xfs_attr_leaf_entsize_remote(int nlen) { return ((uint)sizeof(xfs_attr_leaf_name_remote_t) - 1 + (nlen) + \ XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); } -#define XFS_ATTR_LEAF_ENTSIZE_LOCAL(nlen,vlen) \ - xfs_attr_leaf_entsize_local(nlen,vlen) static inline int xfs_attr_leaf_entsize_local(int nlen, int vlen) { return ((uint)sizeof(xfs_attr_leaf_name_local_t) - 1 + (nlen) + (vlen) + XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); } -#define XFS_ATTR_LEAF_ENTSIZE_LOCAL_MAX(bsize) \ - xfs_attr_leaf_entsize_local_max(bsize) static inline int xfs_attr_leaf_entsize_local_max(int bsize) { return (((bsize) >> 1) + ((bsize) >> 2)); diff --git a/include/xfs_attr_sf.h b/include/xfs_attr_sf.h index ea22839..919756e 100644 --- a/include/xfs_attr_sf.h +++ b/include/xfs_attr_sf.h @@ -25,8 +25,6 @@ * to fit into the literal area of the inode. */ -struct xfs_inode; - /* * Entries are packed toward the top as tight as possible. */ @@ -54,7 +52,7 @@ typedef struct xfs_attr_sf_sort { __uint8_t valuelen; /* length of value */ __uint8_t flags; /* flags bits (see xfs_attr_leaf.h) */ xfs_dahash_t hash; /* this entry's hash value */ - char *name; /* name value, pointer into buffer */ + unsigned char *name; /* name value, pointer into buffer */ } xfs_attr_sf_sort_t; #define XFS_ATTR_SF_ENTSIZE_BYNAME(nlen,vlen) /* space name/value uses */ \ @@ -69,42 +67,4 @@ typedef struct xfs_attr_sf_sort { (be16_to_cpu(((xfs_attr_shortform_t *) \ ((dp)->i_afp->if_u1.if_data))->hdr.totsize)) -#if defined(XFS_ATTR_TRACE) -/* - * Kernel tracing support for attribute lists - */ -struct xfs_attr_list_context; -struct xfs_da_intnode; -struct xfs_da_node_entry; -struct xfs_attr_leafblock; - -#define XFS_ATTR_TRACE_SIZE 4096 /* size of global trace buffer */ -extern ktrace_t *xfs_attr_trace_buf; - -/* - * Trace record types. - */ -#define XFS_ATTR_KTRACE_L_C 1 /* context */ -#define XFS_ATTR_KTRACE_L_CN 2 /* context, node */ -#define XFS_ATTR_KTRACE_L_CB 3 /* context, btree */ -#define XFS_ATTR_KTRACE_L_CL 4 /* context, leaf */ - -void xfs_attr_trace_l_c(char *where, struct xfs_attr_list_context *context); -void xfs_attr_trace_l_cn(char *where, struct xfs_attr_list_context *context, - struct xfs_da_intnode *node); -void xfs_attr_trace_l_cb(char *where, struct xfs_attr_list_context *context, - struct xfs_da_node_entry *btree); -void xfs_attr_trace_l_cl(char *where, struct xfs_attr_list_context *context, - struct xfs_attr_leafblock *leaf); -void xfs_attr_trace_enter(int type, char *where, - struct xfs_attr_list_context *context, - __psunsigned_t a13, __psunsigned_t a14, - __psunsigned_t a15); -#else -#define xfs_attr_trace_l_c(w,c) -#define xfs_attr_trace_l_cn(w,c,n) -#define xfs_attr_trace_l_cb(w,c,b) -#define xfs_attr_trace_l_cl(w,c,l) -#endif /* XFS_ATTR_TRACE */ - #endif /* __XFS_ATTR_SF_H__ */ diff --git a/include/xfs_bit.h b/include/xfs_bit.h index bca7b24..f1e3c90 100644 --- a/include/xfs_bit.h +++ b/include/xfs_bit.h @@ -23,24 +23,16 @@ */ /* - * masks with n high/low bits set, 32-bit values & 64-bit values + * masks with n high/low bits set, 64-bit values */ -#define XFS_MASK32HI(n) xfs_mask32hi(n) -static inline __uint32_t xfs_mask32hi(int n) -{ - return (__uint32_t)-1 << (32 - (n)); -} -#define XFS_MASK64HI(n) xfs_mask64hi(n) static inline __uint64_t xfs_mask64hi(int n) { return (__uint64_t)-1 << (64 - (n)); } -#define XFS_MASK32LO(n) xfs_mask32lo(n) static inline __uint32_t xfs_mask32lo(int n) { return ((__uint32_t)1 << (n)) - 1; } -#define XFS_MASK64LO(n) xfs_mask64lo(n) static inline __uint64_t xfs_mask64lo(int n) { return ((__uint64_t)1 << (n)) - 1; diff --git a/include/xfs_bmap.h b/include/xfs_bmap.h index 7c9d12c..3651191 100644 --- a/include/xfs_bmap.h +++ b/include/xfs_bmap.h @@ -28,20 +28,6 @@ struct xfs_trans; extern kmem_zone_t *xfs_bmap_free_item_zone; /* - * DELTA: describe a change to the in-core extent list. - * - * Internally the use of xed_blockount is somewhat funky. - * xed_blockcount contains an offset much of the time because this - * makes merging changes easier. (xfs_fileoff_t and xfs_filblks_t are - * the same underlying type). - */ -typedef struct xfs_extdelta -{ - xfs_fileoff_t xed_startoff; /* offset of range */ - xfs_filblks_t xed_blockcount; /* blocks in range */ -} xfs_extdelta_t; - -/* * List of extents to be free "later". * The list is kept sorted on xbf_startblock. */ @@ -82,20 +68,32 @@ typedef struct xfs_bmap_free #define XFS_BMAPI_DELAY 0x002 /* delayed write operation */ #define XFS_BMAPI_ENTIRE 0x004 /* return entire extent, not trimmed */ #define XFS_BMAPI_METADATA 0x008 /* mapping metadata not user data */ -#define XFS_BMAPI_EXACT 0x010 /* allocate only to spec'd bounds */ -#define XFS_BMAPI_ATTRFORK 0x020 /* use attribute fork not data */ -#define XFS_BMAPI_ASYNC 0x040 /* bunmapi xactions can be async */ -#define XFS_BMAPI_RSVBLOCKS 0x080 /* OK to alloc. reserved data blocks */ -#define XFS_BMAPI_PREALLOC 0x100 /* preallocation op: unwritten space */ -#define XFS_BMAPI_IGSTATE 0x200 /* Ignore state - */ +#define XFS_BMAPI_ATTRFORK 0x010 /* use attribute fork not data */ +#define XFS_BMAPI_RSVBLOCKS 0x020 /* OK to alloc. reserved data blocks */ +#define XFS_BMAPI_PREALLOC 0x040 /* preallocation op: unwritten space */ +#define XFS_BMAPI_IGSTATE 0x080 /* Ignore state - */ /* combine contig. space */ -#define XFS_BMAPI_CONTIG 0x400 /* must allocate only one extent */ -/* XFS_BMAPI_DIRECT_IO 0x800 */ -#define XFS_BMAPI_CONVERT 0x1000 /* unwritten extent conversion - */ - /* need write cache flushing and no */ - /* additional allocation alignments */ +#define XFS_BMAPI_CONTIG 0x100 /* must allocate only one extent */ +/* + * unwritten extent conversion - this needs write cache flushing and no additional + * allocation alignments. When specified with XFS_BMAPI_PREALLOC it converts + * from written to unwritten, otherwise convert from unwritten to written. + */ +#define XFS_BMAPI_CONVERT 0x200 + +#define XFS_BMAPI_FLAGS \ + { XFS_BMAPI_WRITE, "WRITE" }, \ + { XFS_BMAPI_DELAY, "DELAY" }, \ + { XFS_BMAPI_ENTIRE, "ENTIRE" }, \ + { XFS_BMAPI_METADATA, "METADATA" }, \ + { XFS_BMAPI_ATTRFORK, "ATTRFORK" }, \ + { XFS_BMAPI_RSVBLOCKS, "RSVBLOCKS" }, \ + { XFS_BMAPI_PREALLOC, "PREALLOC" }, \ + { XFS_BMAPI_IGSTATE, "IGSTATE" }, \ + { XFS_BMAPI_CONTIG, "CONTIG" }, \ + { XFS_BMAPI_CONVERT, "CONVERT" } + -#define XFS_BMAPI_AFLAG(w) xfs_bmapi_aflag(w) static inline int xfs_bmapi_aflag(int w) { return (w == XFS_ATTR_FORK ? XFS_BMAPI_ATTRFORK : 0); @@ -107,7 +105,6 @@ static inline int xfs_bmapi_aflag(int w) #define DELAYSTARTBLOCK ((xfs_fsblock_t)-1LL) #define HOLESTARTBLOCK ((xfs_fsblock_t)-2LL) -#define XFS_BMAP_INIT(flp,fbp) xfs_bmap_init(flp,fbp) static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) { ((flp)->xbf_first = NULL, (flp)->xbf_count = 0, \ @@ -127,7 +124,7 @@ typedef struct xfs_bmalloca { struct xfs_bmbt_irec *gotp; /* extent after, or delayed */ xfs_extlen_t alen; /* i/o length asked/allocated */ xfs_extlen_t total; /* total blocks needed for xaction */ - xfs_extlen_t minlen; /* mininum allocation size (blocks) */ + xfs_extlen_t minlen; /* minimum allocation size (blocks) */ xfs_extlen_t minleft; /* amount must be left after alloc */ char eof; /* set if allocating past last extent */ char wasdel; /* replacing a delayed allocation */ @@ -137,36 +134,43 @@ typedef struct xfs_bmalloca { char conv; /* overwriting unwritten extents */ } xfs_bmalloca_t; -#if defined(__KERNEL__) && defined(XFS_BMAP_TRACE) /* - * Trace operations for bmap extent tracing + * Flags for xfs_bmap_add_extent*. */ -#define XFS_BMAP_KTRACE_DELETE 1 -#define XFS_BMAP_KTRACE_INSERT 2 -#define XFS_BMAP_KTRACE_PRE_UP 3 -#define XFS_BMAP_KTRACE_POST_UP 4 - -#define XFS_BMAP_TRACE_SIZE 4096 /* size of global trace buffer */ -#define XFS_BMAP_KTRACE_SIZE 32 /* size of per-inode trace buffer */ -extern ktrace_t *xfs_bmap_trace_buf; +#define BMAP_LEFT_CONTIG (1 << 0) +#define BMAP_RIGHT_CONTIG (1 << 1) +#define BMAP_LEFT_FILLING (1 << 2) +#define BMAP_RIGHT_FILLING (1 << 3) +#define BMAP_LEFT_DELAY (1 << 4) +#define BMAP_RIGHT_DELAY (1 << 5) +#define BMAP_LEFT_VALID (1 << 6) +#define BMAP_RIGHT_VALID (1 << 7) +#define BMAP_ATTRFORK (1 << 8) + +#define XFS_BMAP_EXT_FLAGS \ + { BMAP_LEFT_CONTIG, "LC" }, \ + { BMAP_RIGHT_CONTIG, "RC" }, \ + { BMAP_LEFT_FILLING, "LF" }, \ + { BMAP_RIGHT_FILLING, "RF" }, \ + { BMAP_ATTRFORK, "ATTR" } /* * Add bmap trace insert entries for all the contents of the extent list. + * + * Quite excessive tracing. Only do this for debug builds. */ +#if defined(__KERNEL) && defined(DEBUG) void xfs_bmap_trace_exlist( - const char *fname, /* function name */ struct xfs_inode *ip, /* incore inode pointer */ xfs_extnum_t cnt, /* count of entries in list */ - int whichfork); /* data or attr fork */ + int whichfork, + unsigned long caller_ip); /* data or attr fork */ #define XFS_BMAP_TRACE_EXLIST(ip,c,w) \ - xfs_bmap_trace_exlist(__func__,ip,c,w) - -#else /* __KERNEL__ && XFS_BMAP_TRACE */ - + xfs_bmap_trace_exlist(ip,c,w, _THIS_IP_) +#else #define XFS_BMAP_TRACE_EXLIST(ip,c,w) - -#endif /* __KERNEL__ && XFS_BMAP_TRACE */ +#endif /* * Convert inode from non-attributed to attributed. @@ -290,9 +294,7 @@ xfs_bmapi( xfs_extlen_t total, /* total blocks needed */ struct xfs_bmbt_irec *mval, /* output: map values */ int *nmap, /* i/o: mval size/count */ - xfs_bmap_free_t *flist, /* i/o: list extents to free */ - xfs_extdelta_t *delta); /* o: change made to incore - extents */ + xfs_bmap_free_t *flist); /* i/o: list extents to free */ /* * Map file blocks to filesystem blocks, simple version. @@ -326,8 +328,6 @@ xfs_bunmapi( xfs_fsblock_t *firstblock, /* first allocated block controls a.g. for allocs */ xfs_bmap_free_t *flist, /* i/o: list extents to free */ - xfs_extdelta_t *delta, /* o: change made to incore - extents */ int *done); /* set if not done yet */ /* @@ -340,6 +340,10 @@ xfs_check_nostate_extents( xfs_extnum_t idx, xfs_extnum_t num); +uint +xfs_default_attroffset( + struct xfs_inode *ip); + #ifdef __KERNEL__ /* @@ -356,15 +360,18 @@ xfs_bmap_finish( xfs_bmap_free_t *flist, /* i/o: list extents to free */ int *committed); /* xact committed or not */ +/* bmap to userspace formatter - copy to user & advance pointer */ +typedef int (*xfs_bmap_format_t)(void **, struct getbmapx *, int *); + /* - * Fcntl interface to xfs_bmapi. + * Get inode's extents as described in bmv, and format for output. */ int /* error code */ xfs_getbmap( xfs_inode_t *ip, - struct getbmap *bmv, /* user bmap structure */ - void __user *ap, /* pointer to user's array */ - int iflags); /* interface flags */ + struct getbmapx *bmv, /* user bmap structure */ + xfs_bmap_format_t formatter, /* format to user */ + void *arg); /* formatter arg */ /* * Check if the endoff is outside the last extent. If so the caller will grow @@ -387,17 +394,11 @@ xfs_bmap_count_blocks( int whichfork, int *count); -/* - * Search the extent records for the entry containing block bno. - * If bno lies in a hole, point to the next entry. If bno lies - * past eof, *eofp will be set, and *prevp will contain the last - * entry (null if none). Else, *lastxp will be set to the index - * of the found entry; *gotp will contain the entry. - */ -xfs_bmbt_rec_host_t * -xfs_bmap_search_multi_extents(struct xfs_ifork *, xfs_fileoff_t, int *, - xfs_extnum_t *, xfs_bmbt_irec_t *, xfs_bmbt_irec_t *); - +int +xfs_bmap_punch_delalloc_range( + struct xfs_inode *ip, + xfs_fileoff_t start_fsb, + xfs_fileoff_t length); #endif /* __KERNEL__ */ #endif /* __XFS_BMAP_H__ */ diff --git a/include/xfs_bmap_btree.h b/include/xfs_bmap_btree.h index a4555ab..0e66c4e 100644 --- a/include/xfs_bmap_btree.h +++ b/include/xfs_bmap_btree.h @@ -46,20 +46,12 @@ typedef struct xfs_bmdr_block { #define BMBT_STARTBLOCK_BITLEN 52 #define BMBT_BLOCKCOUNT_BITLEN 21 - -#define BMBT_USE_64 1 - -typedef struct xfs_bmbt_rec_32 -{ - __uint32_t l0, l1, l2, l3; -} xfs_bmbt_rec_32_t; -typedef struct xfs_bmbt_rec_64 -{ +typedef struct xfs_bmbt_rec { __be64 l0, l1; -} xfs_bmbt_rec_64_t; +} xfs_bmbt_rec_t; typedef __uint64_t xfs_bmbt_rec_base_t; /* use this for casts */ -typedef xfs_bmbt_rec_64_t xfs_bmbt_rec_t, xfs_bmdr_rec_t; +typedef xfs_bmbt_rec_t xfs_bmdr_rec_t; typedef struct xfs_bmbt_rec_host { __uint64_t l0, l1; @@ -76,26 +68,22 @@ typedef struct xfs_bmbt_rec_host { #define DSTARTBLOCKMASK \ (((((xfs_dfsbno_t)1) << DSTARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS) -#define ISNULLSTARTBLOCK(x) isnullstartblock(x) static inline int isnullstartblock(xfs_fsblock_t x) { return ((x) & STARTBLOCKMASK) == STARTBLOCKMASK; } -#define ISNULLDSTARTBLOCK(x) isnulldstartblock(x) static inline int isnulldstartblock(xfs_dfsbno_t x) { return ((x) & DSTARTBLOCKMASK) == DSTARTBLOCKMASK; } -#define NULLSTARTBLOCK(k) nullstartblock(k) static inline xfs_fsblock_t nullstartblock(int k) { ASSERT(k < (1 << STARTBLOCKVALBITS)); return STARTBLOCKMASK | (k); } -#define STARTBLOCKVAL(x) startblockval(x) static inline xfs_filblks_t startblockval(xfs_fsblock_t x) { return (xfs_filblks_t)((x) & ~STARTBLOCKMASK); @@ -224,7 +212,6 @@ extern xfs_fsblock_t xfs_bmbt_get_startblock(xfs_bmbt_rec_host_t *r); extern xfs_fileoff_t xfs_bmbt_get_startoff(xfs_bmbt_rec_host_t *r); extern xfs_exntst_t xfs_bmbt_get_state(xfs_bmbt_rec_host_t *r); -extern void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); extern xfs_filblks_t xfs_bmbt_disk_get_blockcount(xfs_bmbt_rec_t *r); extern xfs_fileoff_t xfs_bmbt_disk_get_startoff(xfs_bmbt_rec_t *r); @@ -236,7 +223,6 @@ extern void xfs_bmbt_set_startblock(xfs_bmbt_rec_host_t *r, xfs_fsblock_t v); extern void xfs_bmbt_set_startoff(xfs_bmbt_rec_host_t *r, xfs_fileoff_t v); extern void xfs_bmbt_set_state(xfs_bmbt_rec_host_t *r, xfs_exntst_t v); -extern void xfs_bmbt_disk_set_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); extern void xfs_bmbt_disk_set_allf(xfs_bmbt_rec_t *r, xfs_fileoff_t o, xfs_fsblock_t b, xfs_filblks_t c, xfs_exntst_t v); diff --git a/include/xfs_btree.h b/include/xfs_btree.h index 789fffd..82fafc6 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -41,7 +41,7 @@ extern kmem_zone_t *xfs_btree_cur_zone; /* * Generic btree header. * - * This is a comination of the actual format used on disk for short and long + * This is a combination of the actual format used on disk for short and long * format btrees. The first three fields are shared by both format, but * the pointers are different and should be used with care. * @@ -152,9 +152,7 @@ struct xfs_btree_ops { /* update btree root pointer */ void (*set_root)(struct xfs_btree_cur *cur, - union xfs_btree_ptr *nptr, int level_change); - int (*kill_root)(struct xfs_btree_cur *cur, struct xfs_buf *bp, - int level, union xfs_btree_ptr *newroot); + union xfs_btree_ptr *nptr, int level_change); /* block allocation / freeing */ int (*alloc_block)(struct xfs_btree_cur *cur, @@ -379,20 +377,6 @@ xfs_btree_read_bufl( int refval);/* ref count value for buffer */ /* - * Get a buffer for the block, return it read in. - * Short-form addressing. - */ -int /* error */ -xfs_btree_read_bufs( - struct xfs_mount *mp, /* file system mount point */ - struct xfs_trans *tp, /* transaction pointer */ - xfs_agnumber_t agno, /* allocation group number */ - xfs_agblock_t agbno, /* allocation group block number */ - uint lock, /* lock flags for read_buf */ - struct xfs_buf **bpp, /* buffer for agno/agbno */ - int refval);/* ref count value for buffer */ - -/* * Read-ahead the block, don't wait for it, don't return a buffer. * Long-form addressing. */ @@ -413,16 +397,6 @@ xfs_btree_reada_bufs( xfs_agblock_t agbno, /* allocation group block number */ xfs_extlen_t count); /* count of filesystem blocks */ -/* - * Set the buffer for level "lev" in the cursor to bp, releasing - * any previous buffer. - */ -void -xfs_btree_setbuf( - xfs_btree_cur_t *cur, /* btree cursor */ - int lev, /* level in btree */ - struct xfs_buf *bp); /* new buffer to set */ - /* * Common btree core entry points. @@ -432,7 +406,6 @@ int xfs_btree_decrement(struct xfs_btree_cur *, int, int *); int xfs_btree_lookup(struct xfs_btree_cur *, xfs_lookup_t, int *); int xfs_btree_update(struct xfs_btree_cur *, union xfs_btree_rec *); int xfs_btree_new_iroot(struct xfs_btree_cur *, int *, int *); -int xfs_btree_kill_iroot(struct xfs_btree_cur *); int xfs_btree_insert(struct xfs_btree_cur *, int *); int xfs_btree_delete(struct xfs_btree_cur *, int *); int xfs_btree_get_rec(struct xfs_btree_cur *, union xfs_btree_rec **, int *); diff --git a/include/xfs_btree_trace.h b/include/xfs_btree_trace.h index b3f5eb3..2d8a309 100644 --- a/include/xfs_btree_trace.h +++ b/include/xfs_btree_trace.h @@ -58,8 +58,6 @@ void xfs_btree_trace_argbi(const char *, struct xfs_btree_cur *, struct xfs_buf *, int, int); void xfs_btree_trace_argbii(const char *, struct xfs_btree_cur *, struct xfs_buf *, int, int, int); -void xfs_btree_trace_argfffi(const char *, struct xfs_btree_cur *, - xfs_dfiloff_t, xfs_dfsbno_t, xfs_dfilblks_t, int, int); void xfs_btree_trace_argi(const char *, struct xfs_btree_cur *, int, int); void xfs_btree_trace_argipk(const char *, struct xfs_btree_cur *, int, union xfs_btree_ptr, union xfs_btree_key *, int); @@ -71,24 +69,10 @@ void xfs_btree_trace_argr(const char *, struct xfs_btree_cur *, union xfs_btree_rec *, int); void xfs_btree_trace_cursor(const char *, struct xfs_btree_cur *, int, int); - -#define XFS_ALLOCBT_TRACE_SIZE 4096 /* size of global trace buffer */ -extern ktrace_t *xfs_allocbt_trace_buf; - -#define XFS_INOBT_TRACE_SIZE 4096 /* size of global trace buffer */ -extern ktrace_t *xfs_inobt_trace_buf; - -#define XFS_BMBT_TRACE_SIZE 4096 /* size of global trace buffer */ -#define XFS_BMBT_KTRACE_SIZE 32 /* size of per-inode trace buffer */ -extern ktrace_t *xfs_bmbt_trace_buf; - - #define XFS_BTREE_TRACE_ARGBI(c, b, i) \ xfs_btree_trace_argbi(__func__, c, b, i, __LINE__) #define XFS_BTREE_TRACE_ARGBII(c, b, i, j) \ xfs_btree_trace_argbii(__func__, c, b, i, j, __LINE__) -#define XFS_BTREE_TRACE_ARGFFFI(c, o, b, i, j) \ - xfs_btree_trace_argfffi(__func__, c, o, b, i, j, __LINE__) #define XFS_BTREE_TRACE_ARGI(c, i) \ xfs_btree_trace_argi(__func__, c, i, __LINE__) #define XFS_BTREE_TRACE_ARGIPK(c, i, p, k) \ @@ -104,7 +88,6 @@ extern ktrace_t *xfs_bmbt_trace_buf; #else #define XFS_BTREE_TRACE_ARGBI(c, b, i) #define XFS_BTREE_TRACE_ARGBII(c, b, i, j) -#define XFS_BTREE_TRACE_ARGFFFI(c, o, b, i, j) #define XFS_BTREE_TRACE_ARGI(c, i) #define XFS_BTREE_TRACE_ARGIPK(c, i, p, s) #define XFS_BTREE_TRACE_ARGIPR(c, i, p, r) diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index 5a41c34..b6ecd20 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -26,7 +26,7 @@ extern kmem_zone_t *xfs_buf_item_zone; * have been logged. * For 6.2 and beyond, this is XFS_LI_BUF. We use this to log everything. */ -typedef struct xfs_buf_log_format_t { +typedef struct xfs_buf_log_format { unsigned short blf_type; /* buf log item type indicator */ unsigned short blf_size; /* size of this item */ ushort blf_flags; /* misc state */ @@ -41,22 +41,22 @@ typedef struct xfs_buf_log_format_t { * This flag indicates that the buffer contains on disk inodes * and requires special recovery handling. */ -#define XFS_BLI_INODE_BUF 0x1 +#define XFS_BLF_INODE_BUF 0x1 /* * This flag indicates that the buffer should not be replayed * during recovery because its blocks are being freed. */ -#define XFS_BLI_CANCEL 0x2 +#define XFS_BLF_CANCEL 0x2 /* * This flag indicates that the buffer contains on disk * user or group dquots and may require special recovery handling. */ -#define XFS_BLI_UDQUOT_BUF 0x4 -#define XFS_BLI_PDQUOT_BUF 0x8 -#define XFS_BLI_GDQUOT_BUF 0x10 +#define XFS_BLF_UDQUOT_BUF 0x4 +#define XFS_BLF_PDQUOT_BUF 0x8 +#define XFS_BLF_GDQUOT_BUF 0x10 -#define XFS_BLI_CHUNK 128 -#define XFS_BLI_SHIFT 7 +#define XFS_BLF_CHUNK 128 +#define XFS_BLF_SHIFT 7 #define BIT_TO_WORD_SHIFT 5 #define NBWORD (NBBY * sizeof(unsigned int)) @@ -69,23 +69,24 @@ typedef struct xfs_buf_log_format_t { #define XFS_BLI_LOGGED 0x08 #define XFS_BLI_INODE_ALLOC_BUF 0x10 #define XFS_BLI_STALE_INODE 0x20 +#define XFS_BLI_INODE_BUF 0x40 + +#define XFS_BLI_FLAGS \ + { XFS_BLI_HOLD, "HOLD" }, \ + { XFS_BLI_DIRTY, "DIRTY" }, \ + { XFS_BLI_STALE, "STALE" }, \ + { XFS_BLI_LOGGED, "LOGGED" }, \ + { XFS_BLI_INODE_ALLOC_BUF, "INODE_ALLOC" }, \ + { XFS_BLI_STALE_INODE, "STALE_INODE" }, \ + { XFS_BLI_INODE_BUF, "INODE_BUF" } #ifdef __KERNEL__ struct xfs_buf; -struct ktrace; struct xfs_mount; struct xfs_buf_log_item; -#if defined(XFS_BLI_TRACE) -#define XFS_BLI_TRACE_SIZE 32 - -void xfs_buf_item_trace(char *, struct xfs_buf_log_item *); -#else -#define xfs_buf_item_trace(id, bip) -#endif - /* * This is the in core log item structure used to track information * needed to log buffers. It tracks how many times the lock has been @@ -97,9 +98,6 @@ typedef struct xfs_buf_log_item { unsigned int bli_flags; /* misc flags */ unsigned int bli_recur; /* lock recursion count */ atomic_t bli_refcount; /* cnt of tp refs */ -#ifdef XFS_BLI_TRACE - struct ktrace *bli_trace; /* event trace buf */ -#endif #ifdef XFS_TRANS_DEBUG char *bli_orig; /* original buffer copy */ char *bli_logged; /* bytes logged (bitmap) */ @@ -107,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); @@ -126,7 +113,7 @@ void xfs_buf_attach_iodone(struct xfs_buf *, void(*)(struct xfs_buf *, xfs_log_item_t *), xfs_log_item_t *); void xfs_buf_iodone_callbacks(struct xfs_buf *); -void xfs_buf_iodone(struct xfs_buf *, xfs_buf_log_item_t *); +void xfs_buf_iodone(struct xfs_buf *, struct xfs_log_item *); #ifdef XFS_TRANS_DEBUG void diff --git a/include/xfs_da_btree.h b/include/xfs_da_btree.h index 70b710c..fe9f5a8 100644 --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -91,9 +91,9 @@ enum xfs_dacmp { * Structure to ease passing around component names. */ typedef struct xfs_da_args { - const uchar_t *name; /* string (maybe not NULL terminated) */ + const __uint8_t *name; /* string (maybe not NULL terminated) */ int namelen; /* length of string (maybe no NULL) */ - uchar_t *value; /* set of bytes (maybe contain NULLs) */ + __uint8_t *value; /* set of bytes (maybe contain NULLs) */ int valuelen; /* length of value */ int flags; /* argument flags (eg: ATTR_NOCREATE) */ xfs_dahash_t hashval; /* hash value of name */ @@ -125,6 +125,13 @@ typedef struct xfs_da_args { #define XFS_DA_OP_OKNOENT 0x0008 /* lookup/add op, ENOENT ok, else die */ #define XFS_DA_OP_CILOOKUP 0x0010 /* lookup to return CI name if found */ +#define XFS_DA_OP_FLAGS \ + { XFS_DA_OP_JUSTCHECK, "JUSTCHECK" }, \ + { XFS_DA_OP_RENAME, "RENAME" }, \ + { XFS_DA_OP_ADDNAME, "ADDNAME" }, \ + { XFS_DA_OP_OKNOENT, "OKNOENT" }, \ + { XFS_DA_OP_CILOOKUP, "CILOOKUP" } + /* * Structure to describe buffer(s) for a block. * This is needed in the directory version 2 format case, when @@ -185,7 +192,7 @@ typedef struct xfs_da_state { unsigned char inleaf; /* insert into 1->lf, 0->splf */ unsigned char extravalid; /* T/F: extrablk is in use */ unsigned char extraafter; /* T/F: extrablk is after new */ - xfs_da_state_blk_t extrablk; /* for double-splits on leafs */ + xfs_da_state_blk_t extrablk; /* for double-splits on leaves */ /* for dirv2 extrablk is data */ } xfs_da_state_t; @@ -202,7 +209,8 @@ typedef struct xfs_da_state { */ struct xfs_nameops { xfs_dahash_t (*hashname)(struct xfs_name *); - enum xfs_dacmp (*compname)(struct xfs_da_args *, const char *, int); + enum xfs_dacmp (*compname)(struct xfs_da_args *, + const unsigned char *, int); }; @@ -251,9 +259,9 @@ xfs_daddr_t xfs_da_reada_buf(struct xfs_trans *trans, struct xfs_inode *dp, int xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, xfs_dabuf_t *dead_buf); -uint xfs_da_hashname(const uchar_t *name_string, int name_length); +uint xfs_da_hashname(const __uint8_t *name_string, int name_length); enum xfs_dacmp xfs_da_compname(struct xfs_da_args *args, - const char *name, int len); + const unsigned char *name, int len); xfs_da_state_t *xfs_da_state_alloc(void); @@ -268,5 +276,6 @@ xfs_daddr_t xfs_da_blkno(xfs_dabuf_t *dabuf); extern struct kmem_zone *xfs_da_state_zone; extern struct kmem_zone *xfs_dabuf_zone; +extern const struct xfs_nameops xfs_default_nameops; #endif /* __XFS_DA_BTREE_H__ */ diff --git a/include/xfs_dfrag.h b/include/xfs_dfrag.h index da17820..20bdd93 100644 --- a/include/xfs_dfrag.h +++ b/include/xfs_dfrag.h @@ -46,10 +46,7 @@ typedef struct xfs_swapext /* * Syscall interface for xfs_swapext */ -int xfs_swapext(struct xfs_swapext __user *sx); - -int xfs_swap_extents(struct xfs_inode *ip, struct xfs_inode *tip, - struct xfs_swapext *sxp); +int xfs_swapext(struct xfs_swapext *sx); #endif /* __KERNEL__ */ diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index f28c088..dffba9b 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -18,32 +18,29 @@ #ifndef __XFS_DINODE_H__ #define __XFS_DINODE_H__ -struct xfs_buf; -struct xfs_mount; +#define XFS_DINODE_MAGIC 0x494e /* 'IN' */ +#define XFS_DINODE_GOOD_VERSION(v) (((v) == 1 || (v) == 2)) -#define XFS_DINODE_VERSION_1 1 -#define XFS_DINODE_VERSION_2 2 -#define XFS_DINODE_GOOD_VERSION(v) \ - (((v) == XFS_DINODE_VERSION_1 || (v) == XFS_DINODE_VERSION_2)) -#define XFS_DINODE_MAGIC 0x494e /* 'IN' */ - -/* - * Disk inode structure. - * This is just the header; the inode is expanded to fill a variable size - * with the last field expanding. It is split into the core and "other" - * because we only need the core part in the in-core inode. - */ typedef struct xfs_timestamp { __be32 t_sec; /* timestamp seconds */ __be32 t_nsec; /* timestamp nanoseconds */ } xfs_timestamp_t; /* - * Note: Coordinate changes to this structure with the XFS_DI_* #defines - * below, the offsets table in xfs_ialloc_log_di() and struct xfs_icdinode - * in xfs_inode.h. + * On-disk inode structure. + * + * This is just the header or "dinode core", the inode is expanded to fill a + * variable size the leftover area split into a data and an attribute fork. + * The format of the data and attribute fork depends on the format of the + * inode as indicated by di_format and di_aformat. To access the data and + * attribute use the XFS_DFORK_PTR, XFS_DFORK_DPTR, and XFS_DFORK_PTR macros + * below. + * + * There is a very similar struct icdinode in xfs_inode which matches the + * layout of the first 96 bytes of this structure, but is kept in native + * format instead of big endian. */ -typedef struct xfs_dinode_core { +typedef struct xfs_dinode { __be16 di_magic; /* inode magic # = XFS_DINODE_MAGIC */ __be16 di_mode; /* mode and type of file */ __u8 di_version; /* inode version */ @@ -70,33 +67,12 @@ typedef struct xfs_dinode_core { __be16 di_dmstate; /* DMIG state info */ __be16 di_flags; /* random flags, XFS_DIFLAG_... */ __be32 di_gen; /* generation number */ -} xfs_dinode_core_t; -#define DI_MAX_FLUSH 0xffff + /* di_next_unlinked is the only non-core field in the old dinode */ + __be32 di_next_unlinked;/* agi unlinked list ptr */ +} __attribute__((packed)) xfs_dinode_t; -typedef struct xfs_dinode -{ - xfs_dinode_core_t di_core; - /* - * In adding anything between the core and the union, be - * sure to update the macros like XFS_LITINO below. - */ - __be32 di_next_unlinked;/* agi unlinked list ptr */ - union { - xfs_bmdr_block_t di_bmbt; /* btree root block */ - xfs_bmbt_rec_32_t di_bmx[1]; /* extent list */ - xfs_dir2_sf_t di_dir2sf; /* shortform directory v2 */ - char di_c[1]; /* local contents */ - __be32 di_dev; /* device for S_IFCHR/S_IFBLK */ - uuid_t di_muuid; /* mount point value */ - char di_symlink[1]; /* local symbolic link */ - } di_u; - union { - xfs_bmdr_block_t di_abmbt; /* btree root block */ - xfs_bmbt_rec_32_t di_abmx[1]; /* extent list */ - xfs_attr_shortform_t di_attrsf; /* shortform attribute list */ - } di_a; -} xfs_dinode_t; +#define DI_MAX_FLUSH 0xffff /* * The 32 bit link count in the inode theoretically maxes out at UINT_MAX. @@ -107,50 +83,14 @@ typedef struct xfs_dinode #define XFS_MAXLINK_1 65535U /* - * Bit names for logging disk inodes only - */ -#define XFS_DI_MAGIC 0x0000001 -#define XFS_DI_MODE 0x0000002 -#define XFS_DI_VERSION 0x0000004 -#define XFS_DI_FORMAT 0x0000008 -#define XFS_DI_ONLINK 0x0000010 -#define XFS_DI_UID 0x0000020 -#define XFS_DI_GID 0x0000040 -#define XFS_DI_NLINK 0x0000080 -#define XFS_DI_PROJID 0x0000100 -#define XFS_DI_PAD 0x0000200 -#define XFS_DI_ATIME 0x0000400 -#define XFS_DI_MTIME 0x0000800 -#define XFS_DI_CTIME 0x0001000 -#define XFS_DI_SIZE 0x0002000 -#define XFS_DI_NBLOCKS 0x0004000 -#define XFS_DI_EXTSIZE 0x0008000 -#define XFS_DI_NEXTENTS 0x0010000 -#define XFS_DI_NAEXTENTS 0x0020000 -#define XFS_DI_FORKOFF 0x0040000 -#define XFS_DI_AFORMAT 0x0080000 -#define XFS_DI_DMEVMASK 0x0100000 -#define XFS_DI_DMSTATE 0x0200000 -#define XFS_DI_FLAGS 0x0400000 -#define XFS_DI_GEN 0x0800000 -#define XFS_DI_NEXT_UNLINKED 0x1000000 -#define XFS_DI_U 0x2000000 -#define XFS_DI_A 0x4000000 -#define XFS_DI_NUM_BITS 27 -#define XFS_DI_ALL_BITS ((1 << XFS_DI_NUM_BITS) - 1) -#define XFS_DI_CORE_BITS (XFS_DI_ALL_BITS & ~(XFS_DI_U|XFS_DI_A)) - -/* * Values for di_format */ -typedef enum xfs_dinode_fmt -{ - XFS_DINODE_FMT_DEV, /* CHR, BLK: di_dev */ - XFS_DINODE_FMT_LOCAL, /* DIR, REG: di_c */ - /* LNK: di_symlink */ - XFS_DINODE_FMT_EXTENTS, /* DIR, REG, LNK: di_bmx */ - XFS_DINODE_FMT_BTREE, /* DIR, REG, LNK: di_bmbt */ - XFS_DINODE_FMT_UUID /* MNT: di_uuid */ +typedef enum xfs_dinode_fmt { + XFS_DINODE_FMT_DEV, /* xfs_dev_t */ + XFS_DINODE_FMT_LOCAL, /* bulk data */ + XFS_DINODE_FMT_EXTENTS, /* struct xfs_bmbt_rec */ + XFS_DINODE_FMT_BTREE, /* struct xfs_bmdr_block */ + XFS_DINODE_FMT_UUID /* uuid_t */ } xfs_dinode_fmt_t; /* @@ -164,15 +104,17 @@ typedef enum xfs_dinode_fmt /* * Inode size for given fs. */ -#define XFS_LITINO(mp) ((mp)->m_litino) +#define XFS_LITINO(mp) \ + ((int)(((mp)->m_sb.sb_inodesize) - sizeof(struct xfs_dinode))) + #define XFS_BROOT_SIZE_ADJ \ (XFS_BTREE_LBLOCK_LEN - sizeof(xfs_bmdr_block_t)) /* * Inode data & attribute fork sizes, per inode. */ -#define XFS_DFORK_Q(dip) ((dip)->di_core.di_forkoff != 0) -#define XFS_DFORK_BOFF(dip) ((int)((dip)->di_core.di_forkoff << 3)) +#define XFS_DFORK_Q(dip) ((dip)->di_forkoff != 0) +#define XFS_DFORK_BOFF(dip) ((int)((dip)->di_forkoff << 3)) #define XFS_DFORK_DSIZE(dip,mp) \ (XFS_DFORK_Q(dip) ? \ @@ -187,23 +129,42 @@ typedef enum xfs_dinode_fmt XFS_DFORK_DSIZE(dip, mp) : \ XFS_DFORK_ASIZE(dip, mp)) -#define XFS_DFORK_DPTR(dip) ((dip)->di_u.di_c) +/* + * Return pointers to the data or attribute forks. + */ +#define XFS_DFORK_DPTR(dip) \ + ((char *)(dip) + sizeof(struct xfs_dinode)) #define XFS_DFORK_APTR(dip) \ - ((dip)->di_u.di_c + XFS_DFORK_BOFF(dip)) + (XFS_DFORK_DPTR(dip) + XFS_DFORK_BOFF(dip)) #define XFS_DFORK_PTR(dip,w) \ ((w) == XFS_DATA_FORK ? XFS_DFORK_DPTR(dip) : XFS_DFORK_APTR(dip)) + #define XFS_DFORK_FORMAT(dip,w) \ ((w) == XFS_DATA_FORK ? \ - (dip)->di_core.di_format : \ - (dip)->di_core.di_aformat) + (dip)->di_format : \ + (dip)->di_aformat) #define XFS_DFORK_NEXTENTS(dip,w) \ ((w) == XFS_DATA_FORK ? \ - be32_to_cpu((dip)->di_core.di_nextents) : \ - be16_to_cpu((dip)->di_core.di_anextents)) + be32_to_cpu((dip)->di_nextents) : \ + be16_to_cpu((dip)->di_anextents)) #define XFS_BUF_TO_DINODE(bp) ((xfs_dinode_t *)XFS_BUF_PTR(bp)) /* + * For block and character special files the 32bit dev_t is stored at the + * beginning of the data fork. + */ +static inline xfs_dev_t xfs_dinode_get_rdev(struct xfs_dinode *dip) +{ + return be32_to_cpu(*(__be32 *)XFS_DFORK_DPTR(dip)); +} + +static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev) +{ + *(__be32 *)XFS_DFORK_DPTR(dip) = cpu_to_be32(rdev); +} + +/* * Values for di_flags * There should be a one-to-one correspondence between these flags and the * XFS_XFLAG_s. diff --git a/include/xfs_dir2.h b/include/xfs_dir2.h index 1d9ef96..74a3b10 100644 --- a/include/xfs_dir2.h +++ b/include/xfs_dir2.h @@ -100,7 +100,7 @@ extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, struct xfs_dabuf *bp); -extern int xfs_dir_cilookup_result(struct xfs_da_args *args, const char *name, - int len); +extern int xfs_dir_cilookup_result(struct xfs_da_args *args, + const unsigned char *name, int len); #endif /* __XFS_DIR2_H__ */ diff --git a/include/xfs_dir2_data.h b/include/xfs_dir2_data.h index b816e02..efbc290 100644 --- a/include/xfs_dir2_data.h +++ b/include/xfs_dir2_data.h @@ -38,7 +38,7 @@ struct xfs_trans; /* * Directory address space divided into sections, - * spaces separated by 32gb. + * spaces separated by 32GB. */ #define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) #define XFS_DIR2_DATA_SPACE 0 diff --git a/include/xfs_dir2_node.h b/include/xfs_dir2_node.h index dde72db..82dfe71 100644 --- a/include/xfs_dir2_node.h +++ b/include/xfs_dir2_node.h @@ -75,8 +75,6 @@ xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) return ((db) % XFS_DIR2_MAX_FREE_BESTS(mp)); } -extern void xfs_dir2_free_log_bests(struct xfs_trans *tp, struct xfs_dabuf *bp, - int first, int last); extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args, struct xfs_dabuf *lbp); extern xfs_dahash_t xfs_dir2_leafn_lasthash(struct xfs_dabuf *bp, int *count); diff --git a/include/xfs_dir2_sf.h b/include/xfs_dir2_sf.h index deecc9d..6ac44b5 100644 --- a/include/xfs_dir2_sf.h +++ b/include/xfs_dir2_sf.h @@ -34,13 +34,6 @@ struct xfs_mount; struct xfs_trans; /* - * Maximum size of a shortform directory. - */ -#define XFS_DIR2_SF_MAX_SIZE \ - (XFS_DINODE_MAX_SIZE - (uint)sizeof(xfs_dinode_core_t) - \ - (uint)sizeof(xfs_agino_t)) - -/* * Inode number stored as 8 8-bit values. */ typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t; diff --git a/include/xfs_extfree_item.h b/include/xfs_extfree_item.h index 2f049f6..375f68e 100644 --- a/include/xfs_extfree_item.h +++ b/include/xfs_extfree_item.h @@ -33,12 +33,10 @@ typedef struct xfs_extent { * conversion routine. */ -#ifndef HAVE_FORMAT32 typedef struct xfs_extent_32 { __uint64_t ext_start; __uint32_t ext_len; } __attribute__((packed)) xfs_extent_32_t; -#endif typedef struct xfs_extent_64 { __uint64_t ext_start; @@ -59,7 +57,6 @@ typedef struct xfs_efi_log_format { xfs_extent_t efi_extents[1]; /* array of extents to free */ } xfs_efi_log_format_t; -#ifndef HAVE_FORMAT32 typedef struct xfs_efi_log_format_32 { __uint16_t efi_type; /* efi log item type */ __uint16_t efi_size; /* size of this item */ @@ -67,7 +64,6 @@ typedef struct xfs_efi_log_format_32 { __uint64_t efi_id; /* efi identifier */ xfs_extent_32_t efi_extents[1]; /* array of extents to free */ } __attribute__((packed)) xfs_efi_log_format_32_t; -#endif typedef struct xfs_efi_log_format_64 { __uint16_t efi_type; /* efi log item type */ @@ -90,7 +86,6 @@ typedef struct xfs_efd_log_format { xfs_extent_t efd_extents[1]; /* array of extents freed */ } xfs_efd_log_format_t; -#ifndef HAVE_FORMAT32 typedef struct xfs_efd_log_format_32 { __uint16_t efd_type; /* efd log item type */ __uint16_t efd_size; /* size of this item */ @@ -98,7 +93,6 @@ typedef struct xfs_efd_log_format_32 { __uint64_t efd_efi_id; /* id of corresponding efi */ xfs_extent_32_t efd_extents[1]; /* array of extents freed */ } __attribute__((packed)) xfs_efd_log_format_32_t; -#endif typedef struct xfs_efd_log_format_64 { __uint16_t efd_type; /* efd log item type */ @@ -117,11 +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_CANCELED 0x4 +#define XFS_EFI_RECOVERED 1 +#define XFS_EFI_COMMITTED 2 /* * This is the "extent free intention" log item. It is used @@ -131,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/include/xfs_fs.h b/include/xfs_fs.h index 47c1e93..faac5af 100644 --- a/include/xfs_fs.h +++ b/include/xfs_fs.h @@ -113,22 +113,16 @@ struct getbmapx { #define BMV_IF_ATTRFORK 0x1 /* return attr fork rather than data */ #define BMV_IF_NO_DMAPI_READ 0x2 /* Do not generate DMAPI read event */ #define BMV_IF_PREALLOC 0x4 /* rtn status BMV_OF_PREALLOC if req */ -#define BMV_IF_VALID (BMV_IF_ATTRFORK|BMV_IF_NO_DMAPI_READ|BMV_IF_PREALLOC) -#ifdef __KERNEL__ -#define BMV_IF_EXTENDED 0x40000000 /* getpmapx if set */ -#endif +#define BMV_IF_DELALLOC 0x8 /* rtn status BMV_OF_DELALLOC if req */ +#define BMV_IF_NO_HOLES 0x10 /* Do not return holes */ +#define BMV_IF_VALID \ + (BMV_IF_ATTRFORK|BMV_IF_NO_DMAPI_READ|BMV_IF_PREALLOC| \ + BMV_IF_DELALLOC|BMV_IF_NO_HOLES) -/* bmv_oflags values - returned for for each non-header segment */ +/* bmv_oflags values - returned for each non-header segment */ #define BMV_OF_PREALLOC 0x1 /* segment = unwritten pre-allocation */ - -/* Convert getbmap <-> getbmapx - move fields from p1 to p2. */ -#define GETBMAP_CONVERT(p1,p2) { \ - p2.bmv_offset = p1.bmv_offset; \ - p2.bmv_block = p1.bmv_block; \ - p2.bmv_length = p1.bmv_length; \ - p2.bmv_count = p1.bmv_count; \ - p2.bmv_entries = p1.bmv_entries; } - +#define BMV_OF_DELALLOC 0x2 /* segment = delayed allocation */ +#define BMV_OF_LAST 0x4 /* segment is the last in the file */ /* * Structure for XFS_IOC_FSSETDM. @@ -300,7 +294,7 @@ typedef struct xfs_bstat { __s32 bs_extents; /* number of extents */ __u32 bs_gen; /* generation count */ __u16 bs_projid_lo; /* lower part of project id */ -#define bs_projid bs_projid_lo +#define bs_projid bs_projid_lo /* (previously just bs_projid) */ __u16 bs_forkoff; /* inode fork offset in bytes */ __u16 bs_projid_hi; /* higher part of project id */ unsigned char bs_pad[10]; /* pad space, unused */ @@ -432,10 +426,6 @@ typedef struct xfs_handle { #define XFS_IOC_GETXFLAGS FS_IOC_GETFLAGS #define XFS_IOC_SETXFLAGS FS_IOC_SETFLAGS #define XFS_IOC_GETVERSION FS_IOC_GETVERSION -/* 32-bit compat counterparts */ -#define XFS_IOC32_GETXFLAGS FS_IOC32_GETFLAGS -#define XFS_IOC32_SETXFLAGS FS_IOC32_SETFLAGS -#define XFS_IOC32_GETVERSION FS_IOC32_GETVERSION /* * ioctl commands that replace IRIX fcntl()'s @@ -484,6 +474,8 @@ typedef struct xfs_handle { #define XFS_IOC_ERROR_INJECTION _IOW ('X', 116, struct xfs_error_injection) #define XFS_IOC_ERROR_CLEARALL _IOW ('X', 117, struct xfs_error_injection) /* XFS_IOC_ATTRCTL_BY_HANDLE -- deprecated 118 */ +/* XFS_IOC_FREEZE -- FIFREEZE 119 */ +/* XFS_IOC_THAW -- FITHAW 120 */ #define XFS_IOC_FREEZE _IOWR('X', 119, int) #define XFS_IOC_THAW _IOWR('X', 120, int) #define XFS_IOC_FSSETDM_BY_HANDLE _IOW ('X', 121, struct xfs_fsop_setdm_handlereq) diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h index ccf554a..bb53854 100644 --- a/include/xfs_ialloc.h +++ b/include/xfs_ialloc.h @@ -20,6 +20,7 @@ struct xfs_buf; struct xfs_dinode; +struct xfs_imap; struct xfs_mount; struct xfs_trans; @@ -38,7 +39,6 @@ struct xfs_trans; /* * Make an inode pointer out of the buffer/offset. */ -#define XFS_MAKE_IPTR(mp,b,o) xfs_make_iptr(mp,b,o) static inline struct xfs_dinode * xfs_make_iptr(struct xfs_mount *mp, struct xfs_buf *b, int o) { @@ -49,7 +49,6 @@ xfs_make_iptr(struct xfs_mount *mp, struct xfs_buf *b, int o) /* * Find a free (set) bit in the inode bitmask. */ -#define XFS_IALLOC_FIND_FREE(fp) xfs_ialloc_find_free(fp) static inline int xfs_ialloc_find_free(xfs_inofree_t *fp) { return xfs_lowbit64(*fp); @@ -104,17 +103,14 @@ xfs_difree( xfs_ino_t *first_ino); /* first inode in deleted cluster */ /* - * Return the location of the inode in bno/len/off, - * for mapping it into a buffer. + * Return the location of the inode in imap, for mapping it into a buffer. */ int -xfs_dilocate( +xfs_imap( struct xfs_mount *mp, /* file system mount structure */ struct xfs_trans *tp, /* transaction pointer */ xfs_ino_t ino, /* inode to locate */ - xfs_fsblock_t *bno, /* output: block containing inode */ - int *len, /* output: num blocks in cluster*/ - int *off, /* output: index in block of inode */ + struct xfs_imap *imap, /* location map structure */ uint flags); /* flags for inode btree lookup */ /* @@ -154,23 +150,15 @@ xfs_ialloc_pagi_init( xfs_agnumber_t agno); /* allocation group number */ /* - * Lookup the first record greater than or equal to ino - * in the btree given by cur. + * Lookup a record by ino in the btree given by cur. */ -int xfs_inobt_lookup_ge(struct xfs_btree_cur *cur, xfs_agino_t ino, - __int32_t fcnt, xfs_inofree_t free, int *stat); - -/* - * Lookup the first record less than or equal to ino - * in the btree given by cur. - */ -int xfs_inobt_lookup_le(struct xfs_btree_cur *cur, xfs_agino_t ino, - __int32_t fcnt, xfs_inofree_t free, int *stat); +int xfs_inobt_lookup(struct xfs_btree_cur *cur, xfs_agino_t ino, + xfs_lookup_t dir, int *stat); /* * Get the data from the pointed-to record. */ -extern int xfs_inobt_get_rec(struct xfs_btree_cur *cur, xfs_agino_t *ino, - __int32_t *fcnt, xfs_inofree_t *free, int *stat); +extern int xfs_inobt_get_rec(struct xfs_btree_cur *cur, + xfs_inobt_rec_incore_t *rec, int *stat); #endif /* __XFS_IALLOC_H__ */ diff --git a/include/xfs_ialloc_btree.h b/include/xfs_ialloc_btree.h index 37e5dd0..f782ad0 100644 --- a/include/xfs_ialloc_btree.h +++ b/include/xfs_ialloc_btree.h @@ -32,15 +32,14 @@ struct xfs_mount; #define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ typedef __uint64_t xfs_inofree_t; -#define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) +#define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) #define XFS_INODES_PER_CHUNK_LOG (XFS_NBBYLOG + 3) -#define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) +#define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) +#define XFS_INOBT_MASK(i) ((xfs_inofree_t)1 << (i)) -#define XFS_INOBT_MASKN(i,n) xfs_inobt_maskn(i,n) static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) { - return (((n) >= XFS_INODES_PER_CHUNK ? \ - (xfs_inofree_t)0 : ((xfs_inofree_t)1 << (n))) - 1) << (i); + return ((n >= XFS_INODES_PER_CHUNK ? 0 : XFS_INOBT_MASK(n)) - 1) << i; } /* @@ -70,20 +69,6 @@ typedef struct xfs_inobt_key { typedef __be32 xfs_inobt_ptr_t; /* - * Bit manipulations for ir_free. - */ -#define XFS_INOBT_MASK(i) ((xfs_inofree_t)1 << (i)) -#define XFS_INOBT_IS_FREE(rp,i) \ - (((rp)->ir_free & XFS_INOBT_MASK(i)) != 0) -#define XFS_INOBT_SET_FREE(rp,i) ((rp)->ir_free |= XFS_INOBT_MASK(i)) -#define XFS_INOBT_CLR_FREE(rp,i) ((rp)->ir_free &= ~XFS_INOBT_MASK(i)) - -/* - * Maximum number of inode btree levels. - */ -#define XFS_IN_MAXLEVELS(mp) ((mp)->m_in_maxlevels) - -/* * block numbers in the AG. */ #define XFS_IBT_BLOCK(mp) ((xfs_agblock_t)(XFS_CNT_BLOCK(mp) + 1)) diff --git a/include/xfs_imap.h b/include/xfs_imap.h deleted file mode 100644 index f9ce628..0000000 --- a/include/xfs_imap.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2000,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_IMAP_H__ -#define __XFS_IMAP_H__ - -/* - * This is the structure passed to xfs_imap() to map - * an inode number to its on disk location. - */ -typedef struct xfs_imap { - xfs_daddr_t im_blkno; /* starting BB of inode chunk */ - uint im_len; /* length in BBs of inode chunk */ - xfs_agblock_t im_agblkno; /* logical block of inode chunk in ag */ - ushort im_ioffset; /* inode offset in block in "inodes" */ - ushort im_boffset; /* inode offset in block in bytes */ -} xfs_imap_t; - -struct xfs_mount; -struct xfs_trans; -int xfs_imap(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, - xfs_imap_t *, uint); - -#endif /* __XFS_IMAP_H__ */ diff --git a/include/xfs_inode.h b/include/xfs_inode.h index 7e6fc91..ca56544 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -18,8 +18,8 @@ #ifndef __XFS_INODE_H__ #define __XFS_INODE_H__ +struct posix_acl; struct xfs_dinode; -struct xfs_dinode_core; struct xfs_inode; /* @@ -84,6 +84,16 @@ typedef struct xfs_ifork { } xfs_ifork_t; /* + * Inode location information. Stored in the inode and passed to + * xfs_imap_to_bp() to get a buffer and dinode for a given inode. + */ +struct xfs_imap { + xfs_daddr_t im_blkno; /* starting BB of inode chunk */ + ushort im_len; /* length in BBs of inode chunk */ + ushort im_boffset; /* inode offset in block in bytes */ +}; + +/* * This is the xfs in-core inode structure. * Most of the on-disk inode is embedded in the i_d field. * @@ -112,8 +122,8 @@ typedef struct xfs_ictimestamp { } xfs_ictimestamp_t; /* - * NOTE: This structure must be kept identical to struct xfs_dinode_core - * in xfs_dinode.h except for the endianess annotations. + * NOTE: This structure must be kept identical to struct xfs_dinode + * in xfs_dinode.h except for the endianness annotations. */ typedef struct xfs_icdinode { __uint16_t di_magic; /* inode magic # = XFS_DINODE_MAGIC */ @@ -159,12 +169,6 @@ typedef struct xfs_icdinode { #define XFS_IFEXTIREC 0x08 /* Indirection array of extent blocks */ /* - * Flags for xfs_itobp(), xfs_imap() and xfs_dilocate(). - */ -#define XFS_IMAP_LOOKUP 0x1 -#define XFS_IMAP_BULKSTAT 0x2 - -/* * Fork handling. */ @@ -204,7 +208,6 @@ typedef struct xfs_icdinode { ((ip)->i_d.di_nextents = (n)) : \ ((ip)->i_d.di_anextents = (n))) - /* * Project quota id helpers (previously projid was 16bit only * and using two 16bit values to hold new 32bit projid was choosen @@ -227,8 +230,6 @@ xfs_set_projid(struct xfs_icdinode *i_d, #ifdef __KERNEL__ struct bhv_desc; -struct cred; -struct ktrace; struct xfs_buf; struct xfs_bmap_free; struct xfs_bmbt_irec; @@ -237,41 +238,21 @@ struct xfs_mount; struct xfs_trans; struct xfs_dquot; -#if defined(XFS_ILOCK_TRACE) -#define XFS_ILOCK_KTRACE_SIZE 32 -extern ktrace_t *xfs_ilock_trace_buf; -extern void xfs_ilock_trace(struct xfs_inode *, int, unsigned int, inst_t *); -#else -#define xfs_ilock_trace(i,n,f,ra) -#endif - typedef struct dm_attrs_s { __uint32_t da_dmevmask; /* DMIG event mask */ __uint16_t da_dmstate; /* DMIG state info */ __uint16_t da_pad; /* DMIG extra padding */ } dm_attrs_t; -typedef struct { - struct xfs_inode *ip_mnext; /* next inode in mount list */ - struct xfs_inode *ip_mprev; /* ptr to prev inode */ - struct xfs_mount *ip_mount; /* fs mount struct ptr */ -} xfs_iptr_t; - typedef struct xfs_inode { /* Inode linking and identification information. */ - struct xfs_inode *i_mnext; /* next inode in mount list */ - struct xfs_inode *i_mprev; /* ptr to prev inode */ struct xfs_mount *i_mount; /* fs mount struct ptr */ - struct list_head i_reclaim; /* reclaim list */ - struct inode *i_vnode; /* vnode backpointer */ struct xfs_dquot *i_udquot; /* user dquot */ struct xfs_dquot *i_gdquot; /* group dquot */ /* Inode location stuff */ xfs_ino_t i_ino; /* inode number (agno/agino)*/ - xfs_daddr_t i_blkno; /* blkno of inode buffer */ - ushort i_len; /* len of inode buffer */ - ushort i_boffset; /* off of inode in buffer */ + struct xfs_imap i_imap; /* location for xfs_imap() */ /* Extent information. */ xfs_ifork_t *i_afp; /* attribute fork pointer */ @@ -289,8 +270,6 @@ typedef struct xfs_inode { /* Miscellaneous state. */ unsigned short i_flags; /* see defined flags below */ unsigned char i_update_core; /* timestamps/size is dirty */ - unsigned char i_update_size; /* di_size field is dirty */ - unsigned int i_gen; /* generation count */ unsigned int i_delayed_blks; /* count of delay alloc blks */ xfs_icdinode_t i_d; /* most of ondisk inode */ @@ -298,25 +277,9 @@ typedef struct xfs_inode { xfs_fsize_t i_size; /* in-memory size */ xfs_fsize_t i_new_size; /* size when write completes */ atomic_t i_iocount; /* outstanding I/O count */ - /* Trace buffers per inode. */ -#ifdef XFS_INODE_TRACE - struct ktrace *i_trace; /* general inode trace */ -#endif -#ifdef XFS_BMAP_TRACE - struct ktrace *i_xtrace; /* inode extent list trace */ -#endif -#ifdef XFS_BTREE_TRACE - struct ktrace *i_btrace; /* inode bmap btree trace */ -#endif -#ifdef XFS_RW_TRACE - struct ktrace *i_rwtrace; /* inode read/write trace */ -#endif -#ifdef XFS_ILOCK_TRACE - struct ktrace *i_lock_trace; /* inode lock/unlock trace */ -#endif -#ifdef XFS_DIR2_TRACE - struct ktrace *i_dir_trace; /* inode directory trace */ -#endif + + /* VFS inode */ + struct inode i_vnode; /* embedded VFS inode */ } xfs_inode_t; #define XFS_ISIZE(ip) (((ip)->i_d.di_mode & S_IFMT) == S_IFREG) ? \ @@ -325,13 +288,13 @@ typedef struct xfs_inode { /* Convert from vfs inode to xfs inode */ static inline struct xfs_inode *XFS_I(struct inode *inode) { - return (struct xfs_inode *)inode->i_private; + return container_of(inode, struct xfs_inode, i_vnode); } /* convert from xfs inode to vfs inode */ static inline struct inode *VFS_I(struct xfs_inode *ip) { - return (struct inode *)ip->i_vnode; + return &ip->i_vnode; } /* @@ -389,6 +352,25 @@ xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned short flags) } /* + * Project quota id helpers (previously projid was 16bit only + * and using two 16bit values to hold new 32bit projid was choosen + * to retain compatibility with "old" filesystems). + */ +static inline prid_t +xfs_get_projid(struct xfs_inode *ip) +{ + return (prid_t)ip->i_d.di_projid_hi << 16 | ip->i_d.di_projid_lo; +} + +static inline void +xfs_set_projid(struct xfs_inode *ip, + prid_t projid) +{ + ip->i_d.di_projid_hi = (__uint16_t) (projid >> 16); + ip->i_d.di_projid_lo = (__uint16_t) (projid & 0xffff); +} + +/* * Manage the i_flush queue embedded in the inode. This completion * queue synchronizes processes attempting to flush the in-core * inode back to disk. @@ -411,17 +393,13 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) /* * In-core inode flags. */ -#define XFS_IGRIO 0x0001 /* inode used for guaranteed rate i/o */ -#define XFS_IUIOSZ 0x0002 /* inode i/o sizes have been explicitly set */ -#define XFS_IQUIESCE 0x0004 /* we have started quiescing for this inode */ -#define XFS_IRECLAIM 0x0008 /* we have started reclaiming this inode */ -#define XFS_ISTALE 0x0010 /* inode has been staled */ -#define XFS_IRECLAIMABLE 0x0020 /* inode can be reclaimed */ -#define XFS_INEW 0x0040 -#define XFS_IFILESTREAM 0x0080 /* inode is in a filestream directory */ -#define XFS_IMODIFIED 0x0100 /* XFS inode state possibly differs */ - /* to the Linux inode state. */ -#define XFS_ITRUNCATED 0x0200 /* 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. @@ -437,6 +415,14 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) #define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \ | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED) +#define XFS_LOCK_FLAGS \ + { XFS_IOLOCK_EXCL, "IOLOCK_EXCL" }, \ + { XFS_IOLOCK_SHARED, "IOLOCK_SHARED" }, \ + { XFS_ILOCK_EXCL, "ILOCK_EXCL" }, \ + { XFS_ILOCK_SHARED, "ILOCK_SHARED" }, \ + { XFS_IUNLOCK_NONOTIFY, "IUNLOCK_NONOTIFY" } + + /* * Flags for lockdep annotations. * @@ -470,15 +456,7 @@ 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) -/* - * Flags for xfs_iflush() - */ -#define XFS_IFLUSH_DELWRI_ELSE_SYNC 1 -#define XFS_IFLUSH_DELWRI_ELSE_ASYNC 2 -#define XFS_IFLUSH_SYNC 3 -#define XFS_IFLUSH_ASYNC 4 -#define XFS_IFLUSH_DELWRI 5 -#define XFS_IFLUSH_ASYNC_NOBLOCK 6 +extern struct lock_class_key xfs_iolock_reclaimable; /* * Flags for xfs_itruncate_start(). @@ -486,6 +464,10 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) #define XFS_ITRUNC_DEFINITE 0x1 #define XFS_ITRUNC_MAYBE 0x2 +#define XFS_ITRUNC_FLAGS \ + { XFS_ITRUNC_DEFINITE, "DEFINITE" }, \ + { XFS_ITRUNC_MAYBE, "MAYBE" } + /* * For multiple groups support: if S_ISGID bit is set in the parent * directory, group of new file is set to that of the parent, and @@ -496,22 +478,10 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) ((pip)->i_d.di_mode & S_ISGID)) /* - * Flags for xfs_iget() - */ -#define XFS_IGET_CREATE 0x1 -#define XFS_IGET_BULKSTAT 0x2 - -/* * xfs_iget.c prototypes. */ -void xfs_ihash_init(struct xfs_mount *); -void xfs_ihash_free(struct xfs_mount *); -xfs_inode_t *xfs_inode_incore(struct xfs_mount *, xfs_ino_t, - struct xfs_trans *); int xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, - uint, uint, xfs_inode_t **, xfs_daddr_t); -void xfs_iput(xfs_inode_t *, uint); -void xfs_iput_new(xfs_inode_t *, uint); + uint, uint, xfs_inode_t **); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); void xfs_iunlock(xfs_inode_t *, uint); @@ -519,18 +489,14 @@ void xfs_ilock_demote(xfs_inode_t *, uint); int xfs_isilocked(xfs_inode_t *, uint); uint xfs_ilock_map_shared(xfs_inode_t *); void xfs_iunlock_map_shared(xfs_inode_t *, uint); -void xfs_ireclaim(xfs_inode_t *); -int xfs_finish_reclaim(xfs_inode_t *, int, int); -int xfs_finish_reclaim_all(struct xfs_mount *, int); +void xfs_inode_free(struct xfs_inode *ip); /* * xfs_inode.c prototypes. */ -int xfs_iread(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, - xfs_inode_t **, xfs_daddr_t, uint); int xfs_ialloc(struct xfs_trans *, xfs_inode_t *, mode_t, - xfs_nlink_t, xfs_dev_t, struct cred *, prid_t, - int, struct xfs_buf **, boolean_t *, xfs_inode_t **); + xfs_nlink_t, xfs_dev_t, prid_t, int, + struct xfs_buf **, boolean_t *, xfs_inode_t **); uint xfs_ip2xflags(struct xfs_inode *); uint xfs_dic2xflags(struct xfs_dinode *); @@ -541,31 +507,49 @@ int xfs_itruncate_finish(struct xfs_trans **, xfs_inode_t *, xfs_fsize_t, int, int); int xfs_iunlink(struct xfs_trans *, xfs_inode_t *); -struct xfs_inode * xfs_inode_alloc(struct xfs_mount *, xfs_ino_t); -void xfs_idestroy(xfs_inode_t *); -void xfs_iextract(xfs_inode_t *); void xfs_iext_realloc(xfs_inode_t *, int, int); -void xfs_ipin(xfs_inode_t *); -void xfs_iunpin(xfs_inode_t *); +void xfs_iunpin_wait(xfs_inode_t *); int xfs_iflush(xfs_inode_t *, uint); -void xfs_iflush_all(struct xfs_mount *); -void xfs_ichgtime(xfs_inode_t *, int); -xfs_fsize_t xfs_file_last_byte(xfs_inode_t *); void xfs_lock_inodes(xfs_inode_t **, int, uint); void xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint); -void xfs_synchronize_atime(xfs_inode_t *); +void xfs_synchronize_times(xfs_inode_t *); +void xfs_mark_inode_dirty(xfs_inode_t *); void xfs_mark_inode_dirty_sync(xfs_inode_t *); +#define IHOLD(ip) \ +do { \ + ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \ + ihold(VFS_I(ip)); \ + trace_xfs_ihold(ip, _THIS_IP_); \ +} while (0) + +#define IRELE(ip) \ +do { \ + trace_xfs_irele(ip, _THIS_IP_); \ + iput(VFS_I(ip)); \ +} while (0) + #endif /* __KERNEL__ */ +/* + * Flags for xfs_iget() + */ +#define XFS_IGET_CREATE 0x1 +#define XFS_IGET_UNTRUSTED 0x2 + +int xfs_inotobp(struct xfs_mount *, struct xfs_trans *, + xfs_ino_t, struct xfs_dinode **, + struct xfs_buf **, int *, uint); int xfs_itobp(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, struct xfs_dinode **, - struct xfs_buf **, xfs_daddr_t, uint, uint); -void xfs_dinode_from_disk(struct xfs_icdinode *, - struct xfs_dinode_core *); -void xfs_dinode_to_disk(struct xfs_dinode_core *, + struct xfs_buf **, uint); +int xfs_iread(struct xfs_mount *, struct xfs_trans *, + struct xfs_inode *, uint); +void xfs_dinode_to_disk(struct xfs_dinode *, struct xfs_icdinode *); +void xfs_dinode_from_disk(struct xfs_icdinode *, + struct xfs_dinode *); void xfs_idestroy_fork(struct xfs_inode *, int); void xfs_idata_realloc(struct xfs_inode *, int, int); void xfs_iroot_realloc(struct xfs_inode *, int, int); @@ -573,17 +557,15 @@ int xfs_iread_extents(struct xfs_trans *, struct xfs_inode *, int); int xfs_iextents_copy(struct xfs_inode *, xfs_bmbt_rec_t *, int); xfs_bmbt_rec_host_t *xfs_iext_get_ext(xfs_ifork_t *, xfs_extnum_t); -void xfs_iext_insert(xfs_ifork_t *, xfs_extnum_t, xfs_extnum_t, - xfs_bmbt_irec_t *); +void xfs_iext_insert(struct xfs_inode *, xfs_extnum_t, xfs_extnum_t, + xfs_bmbt_irec_t *, int); void xfs_iext_add(xfs_ifork_t *, xfs_extnum_t, int); void xfs_iext_add_indirect_multi(xfs_ifork_t *, int, xfs_extnum_t, int); -void xfs_iext_remove(xfs_ifork_t *, xfs_extnum_t, int); +void xfs_iext_remove(struct xfs_inode *, xfs_extnum_t, int, int); void xfs_iext_remove_inline(xfs_ifork_t *, xfs_extnum_t, int); void xfs_iext_remove_direct(xfs_ifork_t *, xfs_extnum_t, int); void xfs_iext_remove_indirect(xfs_ifork_t *, xfs_extnum_t, int); void xfs_iext_realloc_direct(xfs_ifork_t *, int); -void xfs_iext_realloc_indirect(xfs_ifork_t *, int); -void xfs_iext_indirect_to_direct(xfs_ifork_t *); void xfs_iext_direct_to_inline(xfs_ifork_t *, xfs_extnum_t); void xfs_iext_inline_to_direct(xfs_ifork_t *, int); void xfs_iext_destroy(xfs_ifork_t *); diff --git a/include/xfs_inode_item.h b/include/xfs_inode_item.h index 1ff04cc..d3dee61 100644 --- a/include/xfs_inode_item.h +++ b/include/xfs_inode_item.h @@ -40,7 +40,6 @@ typedef struct xfs_inode_log_format { __int32_t ilf_boffset; /* off of inode in buffer */ } xfs_inode_log_format_t; -#ifndef HAVE_FORMAT32 typedef struct xfs_inode_log_format_32 { __uint16_t ilf_type; /* inode log item type */ __uint16_t ilf_size; /* size of this item */ @@ -56,7 +55,6 @@ typedef struct xfs_inode_log_format_32 { __int32_t ilf_len; /* len of inode buffer */ __int32_t ilf_boffset; /* off of inode in buffer */ } __attribute__((packed)) xfs_inode_log_format_32_t; -#endif typedef struct xfs_inode_log_format_64 { __uint16_t ilf_type; /* inode log item type */ @@ -105,26 +103,16 @@ typedef struct xfs_inode_log_format_64 { XFS_ILOG_ADATA | XFS_ILOG_AEXT | \ XFS_ILOG_ABROOT) -#define XFS_ILI_HOLD 0x1 -#define XFS_ILI_IOLOCKED_EXCL 0x2 -#define XFS_ILI_IOLOCKED_SHARED 0x4 - -#define XFS_ILI_IOLOCKED_ANY (XFS_ILI_IOLOCKED_EXCL | XFS_ILI_IOLOCKED_SHARED) - - -#define XFS_ILOG_FBROOT(w) xfs_ilog_fbroot(w) static inline int xfs_ilog_fbroot(int w) { return (w == XFS_DATA_FORK ? XFS_ILOG_DBROOT : XFS_ILOG_ABROOT); } -#define XFS_ILOG_FEXT(w) xfs_ilog_fext(w) static inline int xfs_ilog_fext(int w) { return (w == XFS_DATA_FORK ? XFS_ILOG_DEXT : XFS_ILOG_AEXT); } -#define XFS_ILOG_FDATA(w) xfs_ilog_fdata(w) static inline int xfs_ilog_fdata(int w) { return (w == XFS_DATA_FORK ? XFS_ILOG_DDATA : XFS_ILOG_ADATA); @@ -133,7 +121,7 @@ static inline int xfs_ilog_fdata(int w) #ifdef __KERNEL__ struct xfs_buf; -struct xfs_bmbt_rec_64; +struct xfs_bmbt_rec; struct xfs_inode; struct xfs_mount; @@ -143,21 +131,13 @@ typedef struct xfs_inode_log_item { struct xfs_inode *ili_inode; /* inode ptr */ xfs_lsn_t ili_flush_lsn; /* lsn at last flush */ xfs_lsn_t ili_last_lsn; /* lsn at last transaction */ - unsigned short ili_ilock_recur; /* lock recursion count */ - unsigned short ili_iolock_recur; /* lock recursion count */ - unsigned short ili_flags; /* misc flags */ + unsigned short ili_lock_flags; /* lock flags */ unsigned short ili_logged; /* flushed logged data */ unsigned int ili_last_fields; /* fields when flushed */ - struct xfs_bmbt_rec_64 *ili_extents_buf; /* array of logged + struct xfs_bmbt_rec *ili_extents_buf; /* array of logged data exts */ - struct xfs_bmbt_rec_64 *ili_aextents_buf; /* array of logged + struct xfs_bmbt_rec *ili_aextents_buf; /* array of logged attr exts */ - unsigned int ili_pushbuf_flag; /* one bit used in push_ail */ - -#ifdef DEBUG - uint64_t ili_push_owner; /* one who sets pushbuf_flag - above gets to push the buf */ -#endif #ifdef XFS_TRANS_DEBUG int ili_root_size; char *ili_orig_root; @@ -175,8 +155,8 @@ static inline int xfs_inode_clean(xfs_inode_t *ip) extern void xfs_inode_item_init(struct xfs_inode *, struct xfs_mount *); extern void xfs_inode_item_destroy(struct xfs_inode *); -extern void xfs_iflush_done(struct xfs_buf *, xfs_inode_log_item_t *); -extern void xfs_istale_done(struct xfs_buf *, xfs_inode_log_item_t *); +extern void xfs_iflush_done(struct xfs_buf *, struct xfs_log_item *); +extern void xfs_istale_done(struct xfs_buf *, struct xfs_log_item *); extern void xfs_iflush_abort(struct xfs_inode *); extern int xfs_inode_item_format_convert(xfs_log_iovec_t *, xfs_inode_log_format_t *); diff --git a/include/xfs_inum.h b/include/xfs_inum.h index 7a28191..b8e4ee4 100644 --- a/include/xfs_inum.h +++ b/include/xfs_inum.h @@ -72,7 +72,6 @@ struct xfs_mount; #if XFS_BIG_INUMS #define XFS_MAXINUMBER ((xfs_ino_t)((1ULL << 56) - 1ULL)) -#define XFS_INO64_OFFSET ((xfs_ino_t)(1ULL << 32)) #else #define XFS_MAXINUMBER ((xfs_ino_t)((1ULL << 32) - 1ULL)) #endif diff --git a/include/xfs_log.h b/include/xfs_log.h index d47b91f..916eb7d 100644 --- a/include/xfs_log.h +++ b/include/xfs_log.h @@ -19,7 +19,6 @@ #define __XFS_LOG_H__ /* get lsn fields */ - #define CYCLE_LSN(lsn) ((uint)((lsn)>>32)) #define BLOCK_LSN(lsn) ((uint)(lsn)) @@ -56,28 +55,18 @@ static inline xfs_lsn_t _lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2) /* * Flags to xfs_log_reserve() * - * XFS_LOG_SLEEP: If space is not available, sleep (default) - * XFS_LOG_NOSLEEP: If space is not available, return error * XFS_LOG_PERM_RESERV: Permanent reservation. When writes are * performed against this type of reservation, the reservation * is not decreased. Long running transactions should use this. */ -#define XFS_LOG_SLEEP 0x0 -#define XFS_LOG_NOSLEEP 0x1 #define XFS_LOG_PERM_RESERV 0x2 /* * Flags to xfs_log_force() * * XFS_LOG_SYNC: Synchronous force in-core log to disk - * XFS_LOG_FORCE: Start in-core log write now. - * XFS_LOG_URGE: Start write within some window of time. - * - * Note: Either XFS_LOG_FORCE or XFS_LOG_URGE must be set. */ #define XFS_LOG_SYNC 0x1 -#define XFS_LOG_FORCE 0x2 -#define XFS_LOG_URGE 0x4 #endif /* __KERNEL__ */ @@ -110,15 +99,20 @@ static inline xfs_lsn_t _lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2) #define XLOG_REG_TYPE_TRANSHDR 19 #define XLOG_REG_TYPE_MAX 19 -#define XLOG_VEC_SET_TYPE(vecp, t) ((vecp)->i_type = (t)) - typedef struct xfs_log_iovec { - xfs_caddr_t i_addr; /* beginning address of region */ + void *i_addr; /* beginning address of region */ int i_len; /* length in bytes of region */ uint i_type; /* type of region */ } xfs_log_iovec_t; -typedef void* xfs_log_ticket_t; +struct xfs_log_vec { + struct xfs_log_vec *lv_next; /* next lv in build list */ + int lv_niovecs; /* number of iovecs in lv */ + struct xfs_log_iovec *lv_iovecp; /* iovec array */ + struct xfs_log_item *lv_item; /* owner */ + char *lv_buf; /* formatted buffer */ + int lv_buf_len; /* size of formatted buffer */ +}; /* * Structure used to pass callback function and the function's argument @@ -134,17 +128,33 @@ typedef struct xfs_log_callback { #ifdef __KERNEL__ /* Log manager interfaces */ struct xfs_mount; +struct xlog_in_core; +struct xlog_ticket; +struct xfs_log_item; +struct xfs_item_ops; +struct xfs_trans; + +void xfs_log_item_init(struct xfs_mount *mp, + struct xfs_log_item *item, + int type, + struct xfs_item_ops *ops); + xfs_lsn_t xfs_log_done(struct xfs_mount *mp, - xfs_log_ticket_t ticket, - void **iclog, + struct xlog_ticket *ticket, + struct xlog_in_core **iclog, uint flags); int _xfs_log_force(struct xfs_mount *mp, - xfs_lsn_t lsn, uint flags, int *log_forced); void xfs_log_force(struct xfs_mount *mp, - xfs_lsn_t lsn, uint flags); +int _xfs_log_force_lsn(struct xfs_mount *mp, + xfs_lsn_t lsn, + uint flags, + int *log_forced); +void xfs_log_force_lsn(struct xfs_mount *mp, + xfs_lsn_t lsn, + uint flags); int xfs_log_mount(struct xfs_mount *mp, struct xfs_buftarg *log_target, xfs_daddr_t start_block, @@ -153,34 +163,38 @@ int xfs_log_mount_finish(struct xfs_mount *mp); void xfs_log_move_tail(struct xfs_mount *mp, xfs_lsn_t tail_lsn); int xfs_log_notify(struct xfs_mount *mp, - void *iclog, + struct xlog_in_core *iclog, xfs_log_callback_t *callback_entry); int xfs_log_release_iclog(struct xfs_mount *mp, - void *iclog_hndl); + struct xlog_in_core *iclog); int xfs_log_reserve(struct xfs_mount *mp, int length, int count, - xfs_log_ticket_t *ticket, + struct xlog_ticket **ticket, __uint8_t clientid, uint flags, uint t_type); int xfs_log_write(struct xfs_mount *mp, xfs_log_iovec_t region[], int nentries, - xfs_log_ticket_t ticket, + struct xlog_ticket *ticket, xfs_lsn_t *start_lsn); -int xfs_log_unmount(struct xfs_mount *mp); int xfs_log_unmount_write(struct xfs_mount *mp); -void xfs_log_unmount_dealloc(struct xfs_mount *mp); +void xfs_log_unmount(struct xfs_mount *mp); int xfs_log_force_umount(struct xfs_mount *mp, int logerror); int xfs_log_need_covered(struct xfs_mount *mp); void xlog_iodone(struct xfs_buf *); -#endif - +struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket); +void xfs_log_ticket_put(struct xlog_ticket *ticket); -extern int xlog_debug; /* set to 1 to enable real log */ +xlog_tid_t xfs_log_get_trans_ident(struct xfs_trans *tp); +int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, + struct xfs_log_vec *log_vector, + xfs_lsn_t *commit_lsn, int flags); +bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip); +#endif #endif /* __XFS_LOG_H__ */ diff --git a/include/xfs_log_priv.h b/include/xfs_log_priv.h index e7d8f84..d5f8be8 100644 --- a/include/xfs_log_priv.h +++ b/include/xfs_log_priv.h @@ -19,10 +19,8 @@ #define __XFS_LOG_PRIV_H__ struct xfs_buf; -struct ktrace; struct log; struct xlog_ticket; -struct xfs_buf_cancel; struct xfs_mount; /* @@ -55,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; @@ -134,7 +131,11 @@ 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" } + #endif /* __KERNEL__ */ #define XLOG_UNMOUNT_TYPE 0x556e /* Un for Unmount */ @@ -147,8 +148,6 @@ static inline uint xlog_get_client_id(__be32 i) #define XLOG_RECOVERY_NEEDED 0x4 /* log was recovered */ #define XLOG_IO_ERROR 0x8 /* log hit an I/O error, and being shutdown */ -typedef __uint32_t xlog_tid_t; - #ifdef __KERNEL__ /* @@ -241,10 +240,10 @@ typedef struct xlog_res { } xlog_res_t; 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 */ + 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 */ int t_curr_res; /* current reservation in bytes : 4 */ int t_unit_res; /* unit reservation in bytes : 4 */ char t_ocnt; /* original count : 1 */ @@ -309,6 +308,16 @@ typedef struct xlog_rec_ext_header { } xlog_rec_ext_header_t; #ifdef __KERNEL__ + +/* + * Quite misnamed, because this union lays out the actual on-disk log buffer. + */ +typedef union xlog_in_core2 { + xlog_rec_header_t hic_header; + xlog_rec_ext_header_t hic_xheader; + char hic_sector[XLOG_HEADER_SIZE]; +} xlog_in_core_2_t; + /* * - A log record header is 512 bytes. There is plenty of room to grow the * xlog_rec_header_t into the reserved space. @@ -338,9 +347,9 @@ typedef struct xlog_rec_ext_header { * We'll put all the read-only and l_icloglock fields in the first cacheline, * and move everything else out to subsequent cachelines. */ -typedef struct xlog_iclog_fields { - sv_t ic_force_wait; - sv_t ic_write_wait; +typedef struct xlog_in_core { + wait_queue_head_t ic_force_wait; + wait_queue_head_t ic_write_wait; struct xlog_in_core *ic_next; struct xlog_in_core *ic_prev; struct xfs_buf *ic_bp; @@ -348,11 +357,8 @@ typedef struct xlog_iclog_fields { int ic_size; int ic_offset; int ic_bwritecnt; - ushort_t ic_state; + unsigned short ic_state; char *ic_datap; /* pointer to iclog data */ -#ifdef XFS_LOG_TRACE - struct ktrace *ic_trace; -#endif /* Callback structures need their own cacheline */ spinlock_t ic_callback_lock ____cacheline_aligned_in_smp; @@ -361,39 +367,108 @@ typedef struct xlog_iclog_fields { /* reference counts need their own cacheline */ atomic_t ic_refcnt ____cacheline_aligned_in_smp; -} xlog_iclog_fields_t; + xlog_in_core_2_t *ic_data; +#define ic_header ic_data->hic_header +} xlog_in_core_t; -typedef union xlog_in_core2 { - xlog_rec_header_t hic_header; - xlog_rec_ext_header_t hic_xheader; - char hic_sector[XLOG_HEADER_SIZE]; -} xlog_in_core_2_t; +/* + * The CIL context is used to aggregate per-transaction details as well be + * passed to the iclog for checkpoint post-commit processing. After being + * passed to the iclog, another context needs to be allocated for tracking the + * next set of transactions to be aggregated into a checkpoint. + */ +struct xfs_cil; + +struct xfs_cil_ctx { + struct xfs_cil *cil; + xfs_lsn_t sequence; /* chkpt sequence # */ + xfs_lsn_t start_lsn; /* first LSN of chkpt commit */ + xfs_lsn_t commit_lsn; /* chkpt commit record lsn */ + struct xlog_ticket *ticket; /* chkpt ticket */ + int nvecs; /* number of regions */ + int space_used; /* aggregate size of regions */ + struct list_head busy_extents; /* busy extents in chkpt */ + struct xfs_log_vec *lv_chain; /* logvecs being pushed */ + xfs_log_callback_t log_cb; /* completion callback hook. */ + struct list_head committing; /* ctx committing list */ +}; -typedef struct xlog_in_core { - xlog_iclog_fields_t hic_fields; - xlog_in_core_2_t *hic_data; -} xlog_in_core_t; +/* + * Committed Item List structure + * + * This structure is used to track log items that have been committed but not + * yet written into the log. It is used only when the delayed logging mount + * option is enabled. + * + * This structure tracks the list of committing checkpoint contexts so + * we can avoid the problem of having to hold out new transactions during a + * flush until we have a the commit record LSN of the checkpoint. We can + * traverse the list of committing contexts in xlog_cil_push_lsn() to find a + * sequence match and extract the commit LSN directly from there. If the + * checkpoint is still in the process of committing, we can block waiting for + * the commit LSN to be determined as well. This should make synchronous + * operations almost as efficient as the old logging methods. + */ +struct xfs_cil { + struct log *xc_log; + struct list_head xc_cil; + spinlock_t xc_cil_lock; + struct xfs_cil_ctx *xc_ctx; + struct rw_semaphore xc_ctx_lock; + struct list_head xc_committing; + wait_queue_head_t xc_commit_wait; + xfs_lsn_t xc_current_sequence; +}; /* - * Defines to save our code from this glop. + * The amount of log space we allow the CIL to aggregate is difficult to size. + * Whatever we choose, we have to make sure we can get a reservation for the + * log space effectively, that it is large enough to capture sufficient + * relogging to reduce log buffer IO significantly, but it is not too large for + * the log or induces too much latency when writing out through the iclogs. We + * track both space consumed and the number of vectors in the checkpoint + * context, so we need to decide which to use for limiting. + * + * Every log buffer we write out during a push needs a header reserved, which + * is at least one sector and more for v2 logs. Hence we need a reservation of + * at least 512 bytes per 32k of log space just for the LR headers. That means + * 16KB of reservation per megabyte of delayed logging space we will consume, + * plus various headers. The number of headers will vary based on the num of + * io vectors, so limiting on a specific number of vectors is going to result + * in transactions of varying size. IOWs, it is more consistent to track and + * limit space consumed in the log rather than by the number of objects being + * logged in order to prevent checkpoint ticket overruns. + * + * Further, use of static reservations through the log grant mechanism is + * problematic. It introduces a lot of complexity (e.g. reserve grant vs write + * grant) and a significant deadlock potential because regranting write space + * can block on log pushes. Hence if we have to regrant log space during a log + * push, we can deadlock. + * + * However, we can avoid this by use of a dynamic "reservation stealing" + * technique during transaction commit whereby unused reservation space in the + * transaction ticket is transferred to the CIL ctx commit ticket to cover the + * space needed by the checkpoint transaction. This means that we never need to + * specifically reserve space for the CIL checkpoint transaction, nor do we + * need to regrant space once the checkpoint completes. This also means the + * checkpoint transaction ticket is specific to the checkpoint context, rather + * than the CIL itself. + * + * With dynamic reservations, we can effectively make up arbitrary limits for + * the checkpoint size so long as they don't violate any other size rules. + * Recovery imposes a rule that no transaction exceed half the log, so we are + * limited by that. Furthermore, the log transaction reservation subsystem + * tries to keep 25% of the log free, so we need to keep below that limit or we + * risk running out of free log space to start any new transactions. + * + * In order to keep background CIL push efficient, we will set a lower + * threshold at which background pushing is attempted without blocking current + * transaction commits. A separate, higher bound defines when CIL pushes are + * enforced to ensure we stay within our maximum checkpoint size bounds. + * threshold, yet give us plenty of space for aggregation on large logs. */ -#define ic_force_wait hic_fields.ic_force_wait -#define ic_write_wait hic_fields.ic_write_wait -#define ic_next hic_fields.ic_next -#define ic_prev hic_fields.ic_prev -#define ic_bp hic_fields.ic_bp -#define ic_log hic_fields.ic_log -#define ic_callback hic_fields.ic_callback -#define ic_callback_lock hic_fields.ic_callback_lock -#define ic_callback_tail hic_fields.ic_callback_tail -#define ic_trace hic_fields.ic_trace -#define ic_size hic_fields.ic_size -#define ic_offset hic_fields.ic_offset -#define ic_refcnt hic_fields.ic_refcnt -#define ic_bwritecnt hic_fields.ic_bwritecnt -#define ic_state hic_fields.ic_state -#define ic_datap hic_fields.ic_datap -#define ic_header hic_data->hic_header +#define XLOG_CIL_SPACE_LIMIT(log) (log->l_logsize >> 3) +#define XLOG_CIL_HARD_SPACE_LIMIT(log) (3 * (log->l_logsize >> 4)) /* * The reservation head lsn is not made up of a cycle number and block number. @@ -404,17 +479,17 @@ typedef struct xlog_in_core { typedef struct log { /* The following fields don't need locking */ struct xfs_mount *l_mp; /* mount point */ + struct xfs_ail *l_ailp; /* AIL log is working with */ + struct xfs_cil *l_cilp; /* CIL log is working with */ struct xfs_buf *l_xbuf; /* extra buffer for log * wrapping */ struct xfs_buftarg *l_targ; /* buftarg of log */ 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_sectbb_log; /* log2 of sector size in BBs */ - uint l_sectbb_mask; /* sector size (in BBs) - * alignment mask */ + uint l_sectBBsize; /* sector size in BBs (2^n) */ int l_iclog_size; /* size of log in bytes */ int l_iclog_size_log; /* log power size of log */ int l_iclog_bufs; /* number of iclog buffers */ @@ -423,33 +498,40 @@ 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" */ 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 */ - 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 */ 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; - xlog_ticket_t *l_reserve_headq; - xlog_ticket_t *l_write_headq; - int l_grant_reserve_cycle; - int l_grant_reserve_bytes; - int l_grant_write_cycle; - int l_grant_write_bytes; - -#ifdef XFS_LOG_TRACE - struct ktrace *l_grant_trace; -#endif + /* + * 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; + + /* + * 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 @@ -458,30 +540,108 @@ typedef struct log { } xlog_t; -#define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) +#define XLOG_BUF_CANCEL_BUCKET(log, blkno) \ + ((log)->l_buf_cancel_table + ((__uint64_t)blkno % XLOG_BC_TABLE_SIZE)) +#define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) /* common routines */ extern xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); -extern int xlog_find_tail(xlog_t *log, - xfs_daddr_t *head_blk, - xfs_daddr_t *tail_blk); extern int xlog_recover(xlog_t *log); extern int xlog_recover_finish(xlog_t *log); extern void xlog_pack_data(xlog_t *log, xlog_in_core_t *iclog, int); -extern void xlog_recover_process_iunlinks(xlog_t *log); -extern struct xfs_buf *xlog_get_bp(xlog_t *, int); -extern void xlog_put_bp(struct xfs_buf *); -extern int xlog_bread(xlog_t *, xfs_daddr_t, int, struct xfs_buf *); +extern kmem_zone_t *xfs_log_ticket_zone; +struct xlog_ticket *xlog_ticket_alloc(struct log *log, int unit_bytes, + int count, char client, uint xflags, + int alloc_flags); + -extern kmem_zone_t *xfs_log_ticket_zone; +static inline void +xlog_write_adv_cnt(void **ptr, int *len, int *off, size_t bytes) +{ + *ptr += bytes; + *len -= bytes; + *off += bytes; +} -/* iclog tracing */ -#define XLOG_TRACE_GRAB_FLUSH 1 -#define XLOG_TRACE_REL_FLUSH 2 -#define XLOG_TRACE_SLEEP_FLUSH 3 -#define XLOG_TRACE_WAKE_FLUSH 4 +void xlog_print_tic_res(struct xfs_mount *mp, struct xlog_ticket *ticket); +int xlog_write(struct log *log, struct xfs_log_vec *log_vector, + struct xlog_ticket *tic, xfs_lsn_t *start_lsn, + 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 grant head, we sample it first so that the value will not + * change while we are cracking it into the component values. This means we + * will always get consistent component values to work from. + */ +static inline void +xlog_crack_grant_head_val(int64_t val, int *cycle, int *space) +{ + *cycle = val >> 32; + *space = val & 0xffffffff; +} + +static inline void +xlog_crack_grant_head(atomic64_t *head, int *cycle, int *space) +{ + xlog_crack_grant_head_val(atomic64_read(head), cycle, space); +} + +static inline int64_t +xlog_assign_grant_head_val(int cycle, int space) +{ + return ((int64_t)cycle << 32) | space; +} + +static inline void +xlog_assign_grant_head(atomic64_t *head, int cycle, int space) +{ + atomic64_set(head, xlog_assign_grant_head_val(cycle, space)); +} + +/* + * Committed Item List interfaces + */ +int xlog_cil_init(struct log *log); +void xlog_cil_init_post_recovery(struct log *log); +void xlog_cil_destroy(struct log *log); + +/* + * CIL force routines + */ +xfs_lsn_t xlog_cil_force_lsn(struct log *log, xfs_lsn_t sequence); + +static inline void +xlog_cil_force(struct log *log) +{ + xlog_cil_force_lsn(log, log->l_cilp->xc_current_sequence); +} /* * Unmount record type is used as a pseudo transaction type for the ticket. @@ -489,6 +649,21 @@ extern kmem_zone_t *xfs_log_ticket_zone; */ #define XLOG_UNMOUNT_REC_TYPE (-1U) +/* + * Wrapper function for waiting on a wait queue serialised against wakeups + * by a spinlock. This matches the semantics of all the wait queues used in the + * log code. + */ +static inline void xlog_wait(wait_queue_head_t *wq, spinlock_t *lock) +{ + DECLARE_WAITQUEUE(wait, current); + + add_wait_queue_exclusive(wq, &wait); + __set_current_state(TASK_UNINTERRUPTIBLE); + spin_unlock(lock); + schedule(); + remove_wait_queue(wq, &wait); +} #endif /* __KERNEL__ */ #endif /* __XFS_LOG_PRIV_H__ */ diff --git a/include/xfs_log_recover.h b/include/xfs_log_recover.h index b225455..1c55ccb 100644 --- a/include/xfs_log_recover.h +++ b/include/xfs_log_recover.h @@ -28,29 +28,28 @@ #define XLOG_RHASH(tid) \ ((((__uint32_t)tid)>>XLOG_RHASH_SHIFT) & (XLOG_RHASH_SIZE-1)) -#define XLOG_MAX_REGIONS_IN_ITEM (XFS_MAX_BLOCKSIZE / XFS_BLI_CHUNK / 2 + 1) +#define XLOG_MAX_REGIONS_IN_ITEM (XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK / 2 + 1) /* * item headers are in ri_buf[0]. Additional buffers follow. */ typedef struct xlog_recover_item { - struct xlog_recover_item *ri_next; - struct xlog_recover_item *ri_prev; - int ri_type; - int ri_cnt; /* count of regions found */ - int ri_total; /* total regions */ - xfs_log_iovec_t *ri_buf; /* ptr to regions buffer */ + struct list_head ri_list; + int ri_type; + int ri_cnt; /* count of regions found */ + int ri_total; /* total regions */ + xfs_log_iovec_t *ri_buf; /* ptr to regions buffer */ } xlog_recover_item_t; struct xlog_tid; typedef struct xlog_recover { - struct xlog_recover *r_next; - xlog_tid_t r_log_tid; /* log's transaction id */ - xfs_trans_header_t r_theader; /* trans header for partial */ - int r_state; /* not needed */ - xfs_lsn_t r_lsn; /* xact lsn */ - xlog_recover_item_t *r_itemq; /* q for items */ + struct hlist_node r_list; + xlog_tid_t r_log_tid; /* log's transaction id */ + xfs_trans_header_t r_theader; /* trans header for partial */ + int r_state; /* not needed */ + xfs_lsn_t r_lsn; /* xact lsn */ + struct list_head r_itemq; /* q for items */ } xlog_recover_t; #define ITEM_TYPE(i) (*(ushort *)(i)->ri_buf[0].i_addr) diff --git a/include/xfs_mount.h b/include/xfs_mount.h index ff200d1..94a02e1 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -18,7 +18,6 @@ #ifndef __XFS_MOUNT_H__ #define __XFS_MOUNT_H__ - typedef struct xfs_trans_reservations { uint tr_write; /* extent alloc trans */ uint tr_itruncate; /* truncate trans */ @@ -45,14 +44,15 @@ typedef struct xfs_trans_reservations { #ifndef __KERNEL__ -#define XFS_DADDR_TO_AGNO(mp,d) \ +#define xfs_daddr_to_agno(mp,d) \ ((xfs_agnumber_t)(XFS_BB_TO_FSBT(mp, d) / (mp)->m_sb.sb_agblocks)) -#define XFS_DADDR_TO_AGBNO(mp,d) \ +#define xfs_daddr_to_agbno(mp,d) \ ((xfs_agblock_t)(XFS_BB_TO_FSBT(mp, d) % (mp)->m_sb.sb_agblocks)) #else /* __KERNEL__ */ -struct cred; +#include "xfs_sync.h" + struct log; struct xfs_mount_args; struct xfs_inode; @@ -62,133 +62,9 @@ struct xfs_extdelta; struct xfs_swapext; struct xfs_mru_cache; struct xfs_nameops; - -/* - * Prototypes and functions for the Data Migration subsystem. - */ - -typedef int (*xfs_send_data_t)(int, struct xfs_inode *, - xfs_off_t, size_t, int, int *); -typedef int (*xfs_send_mmap_t)(struct vm_area_struct *, uint); -typedef int (*xfs_send_destroy_t)(struct xfs_inode *, dm_right_t); -typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct xfs_mount *, - struct xfs_inode *, dm_right_t, - struct xfs_inode *, dm_right_t, - const char *, const char *, mode_t, int, int); -typedef int (*xfs_send_mount_t)(struct xfs_mount *, dm_right_t, - char *, char *); -typedef void (*xfs_send_unmount_t)(struct xfs_mount *, struct xfs_inode *, - dm_right_t, mode_t, int, int); - -typedef struct xfs_dmops { - xfs_send_data_t xfs_send_data; - xfs_send_mmap_t xfs_send_mmap; - xfs_send_destroy_t xfs_send_destroy; - xfs_send_namesp_t xfs_send_namesp; - xfs_send_mount_t xfs_send_mount; - xfs_send_unmount_t xfs_send_unmount; -} xfs_dmops_t; - -#define XFS_SEND_DATA(mp, ev,ip,off,len,fl,lock) \ - (*(mp)->m_dm_ops->xfs_send_data)(ev,ip,off,len,fl,lock) -#define XFS_SEND_MMAP(mp, vma,fl) \ - (*(mp)->m_dm_ops->xfs_send_mmap)(vma,fl) -#define XFS_SEND_DESTROY(mp, ip,right) \ - (*(mp)->m_dm_ops->xfs_send_destroy)(ip,right) -#define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ - (*(mp)->m_dm_ops->xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl) -#define XFS_SEND_PREUNMOUNT(mp,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ - (*(mp)->m_dm_ops->xfs_send_namesp)(DM_EVENT_PREUNMOUNT,mp,b1,r1,b2,r2,n1,n2,mode,rval,fl) -#define XFS_SEND_MOUNT(mp,right,path,name) \ - (*(mp)->m_dm_ops->xfs_send_mount)(mp,right,path,name) -#define XFS_SEND_UNMOUNT(mp, ip,right,mode,rval,fl) \ - (*(mp)->m_dm_ops->xfs_send_unmount)(mp,ip,right,mode,rval,fl) - - -/* - * Prototypes and functions for the Quota Management subsystem. - */ - -struct xfs_dquot; -struct xfs_dqtrxops; +struct xfs_ail; struct xfs_quotainfo; -typedef int (*xfs_qminit_t)(struct xfs_mount *, uint *, uint *); -typedef int (*xfs_qmmount_t)(struct xfs_mount *, uint, uint); -typedef int (*xfs_qmunmount_t)(struct xfs_mount *); -typedef void (*xfs_qmdone_t)(struct xfs_mount *); -typedef void (*xfs_dqrele_t)(struct xfs_dquot *); -typedef int (*xfs_dqattach_t)(struct xfs_inode *, uint); -typedef void (*xfs_dqdetach_t)(struct xfs_inode *); -typedef int (*xfs_dqpurgeall_t)(struct xfs_mount *, uint); -typedef int (*xfs_dqvopalloc_t)(struct xfs_mount *, - struct xfs_inode *, uid_t, gid_t, prid_t, uint, - struct xfs_dquot **, struct xfs_dquot **); -typedef void (*xfs_dqvopcreate_t)(struct xfs_trans *, struct xfs_inode *, - struct xfs_dquot *, struct xfs_dquot *); -typedef int (*xfs_dqvoprename_t)(struct xfs_inode **); -typedef struct xfs_dquot * (*xfs_dqvopchown_t)( - struct xfs_trans *, struct xfs_inode *, - struct xfs_dquot **, struct xfs_dquot *); -typedef int (*xfs_dqvopchownresv_t)(struct xfs_trans *, struct xfs_inode *, - struct xfs_dquot *, struct xfs_dquot *, uint); -typedef void (*xfs_dqstatvfs_t)(struct xfs_inode *, bhv_statvfs_t *); -typedef int (*xfs_dqsync_t)(struct xfs_mount *, int flags); -typedef int (*xfs_quotactl_t)(struct xfs_mount *, int, int, xfs_caddr_t); - -typedef struct xfs_qmops { - xfs_qminit_t xfs_qminit; - xfs_qmdone_t xfs_qmdone; - xfs_qmmount_t xfs_qmmount; - xfs_qmunmount_t xfs_qmunmount; - xfs_dqrele_t xfs_dqrele; - xfs_dqattach_t xfs_dqattach; - xfs_dqdetach_t xfs_dqdetach; - xfs_dqpurgeall_t xfs_dqpurgeall; - xfs_dqvopalloc_t xfs_dqvopalloc; - xfs_dqvopcreate_t xfs_dqvopcreate; - xfs_dqvoprename_t xfs_dqvoprename; - xfs_dqvopchown_t xfs_dqvopchown; - xfs_dqvopchownresv_t xfs_dqvopchownresv; - xfs_dqstatvfs_t xfs_dqstatvfs; - xfs_dqsync_t xfs_dqsync; - xfs_quotactl_t xfs_quotactl; - struct xfs_dqtrxops *xfs_dqtrxops; -} xfs_qmops_t; - -#define XFS_QM_INIT(mp, mnt, fl) \ - (*(mp)->m_qm_ops->xfs_qminit)(mp, mnt, fl) -#define XFS_QM_MOUNT(mp, mnt, fl) \ - (*(mp)->m_qm_ops->xfs_qmmount)(mp, mnt, fl) -#define XFS_QM_UNMOUNT(mp) \ - (*(mp)->m_qm_ops->xfs_qmunmount)(mp) -#define XFS_QM_DONE(mp) \ - (*(mp)->m_qm_ops->xfs_qmdone)(mp) -#define XFS_QM_DQRELE(mp, dq) \ - (*(mp)->m_qm_ops->xfs_dqrele)(dq) -#define XFS_QM_DQATTACH(mp, ip, fl) \ - (*(mp)->m_qm_ops->xfs_dqattach)(ip, fl) -#define XFS_QM_DQDETACH(mp, ip) \ - (*(mp)->m_qm_ops->xfs_dqdetach)(ip) -#define XFS_QM_DQPURGEALL(mp, fl) \ - (*(mp)->m_qm_ops->xfs_dqpurgeall)(mp, fl) -#define XFS_QM_DQVOPALLOC(mp, ip, uid, gid, prid, fl, dq1, dq2) \ - (*(mp)->m_qm_ops->xfs_dqvopalloc)(mp, ip, uid, gid, prid, fl, dq1, dq2) -#define XFS_QM_DQVOPCREATE(mp, tp, ip, dq1, dq2) \ - (*(mp)->m_qm_ops->xfs_dqvopcreate)(tp, ip, dq1, dq2) -#define XFS_QM_DQVOPRENAME(mp, ip) \ - (*(mp)->m_qm_ops->xfs_dqvoprename)(ip) -#define XFS_QM_DQVOPCHOWN(mp, tp, ip, dqp, dq) \ - (*(mp)->m_qm_ops->xfs_dqvopchown)(tp, ip, dqp, dq) -#define XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, dq1, dq2, fl) \ - (*(mp)->m_qm_ops->xfs_dqvopchownresv)(tp, ip, dq1, dq2, fl) -#define XFS_QM_DQSTATVFS(ip, statp) \ - (*(ip)->i_mount->m_qm_ops->xfs_dqstatvfs)(ip, statp) -#define XFS_QM_DQSYNC(mp, flags) \ - (*(mp)->m_qm_ops->xfs_dqsync)(mp, flags) -#define XFS_QM_QUOTACTL(mp, cmd, id, addr) \ - (*(mp)->m_qm_ops->xfs_quotactl)(mp, cmd, id, addr) - #ifdef HAVE_PERCPU_SB /* @@ -214,6 +90,8 @@ 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) @@ -221,20 +99,24 @@ extern void xfs_icsb_sync_counters_locked(struct xfs_mount *, int); #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_ail { - struct list_head xa_ail; - uint xa_gen; - struct task_struct *xa_task; - xfs_lsn_t xa_target; -} xfs_ail_t; +/* 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 */ - spinlock_t m_ail_lock; /* fs AIL mutex */ - xfs_ail_t m_ail; /* fs active log item list */ + struct xfs_ail *m_ail; /* fs active log item list */ xfs_sb_t m_sb; /* copy of fs superblock */ spinlock_t m_sb_lock; /* sb counter lock */ struct xfs_buf *m_sb_bp; /* buffer for superblock */ @@ -247,10 +129,6 @@ typedef struct xfs_mount { xfs_agnumber_t m_agirotor; /* last ag dir inode alloced */ spinlock_t m_agirotor_lock;/* .. and lock protecting it */ xfs_agnumber_t m_maxagi; /* highest inode alloc group */ - struct xfs_inode *m_inodes; /* active inode list */ - struct list_head m_del_inodes; /* inodes to reclaim */ - mutex_t m_ilock; /* inode list mutex */ - uint m_ireclaims; /* count of calls to reclaim*/ uint m_readio_log; /* min read size log bytes */ uint m_readio_blocks; /* min read size blocks */ uint m_writeio_log; /* min write size log bytes */ @@ -283,19 +161,17 @@ typedef struct xfs_mount { uint m_inobt_mnr[2]; /* min inobt btree records */ uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */ uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ - uint m_in_maxlevels; /* XFS_IN_MAXLEVELS */ - struct xfs_perag *m_perag; /* per-ag accounting info */ - struct rw_semaphore m_peraglock; /* lock for m_perag (pointer) */ + uint m_in_maxlevels; /* max inobt btree levels. */ + struct radix_tree_root m_perag_tree; /* per-ag accounting info */ + spinlock_t m_perag_lock; /* lock for m_perag_tree */ struct mutex m_growlock; /* growfs mutex */ int m_fixedfsid[2]; /* unchanged for life of FS */ uint m_dmevmask; /* DMI events for this FS */ __uint64_t m_flags; /* global mount flags */ - uint m_attroffset; /* inode attribute offset */ uint m_dir_node_ents; /* #entries in a dir danode */ uint m_attr_node_ents; /* #entries in attr danode */ int m_ialloc_inos; /* inodes in inode allocation */ int m_ialloc_blks; /* blocks in inode allocation */ - int m_litino; /* size of inode union area */ int m_inoalign_mask;/* mask sb_inoalignmt if used */ uint m_qflags; /* quota status flags */ xfs_trans_reservations_t m_reservations;/* precomputed res values */ @@ -303,17 +179,12 @@ typedef struct xfs_mount { __uint64_t m_maxioffset; /* maximum inode offset */ __uint64_t m_resblks; /* total reserved blocks */ __uint64_t m_resblks_avail;/* available reserved blocks */ -#if XFS_BIG_INUMS - xfs_ino_t m_inoadd; /* add value for ino64_offset */ -#endif + __uint64_t m_resblks_save; /* reserved blks @ remount,ro */ int m_dalign; /* stripe unit */ int m_swidth; /* stripe width */ int m_sinoalign; /* stripe unit inode alignment */ int m_attr_magicpct;/* 37% of the blocksize */ int m_dir_magicpct; /* 37% of the dir blocksize */ - __uint8_t m_mk_sharedro; /* mark shared ro on unmount */ - __uint8_t m_inode_quiesce;/* call quiesce on new inodes. - field governed by m_ilock */ __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ int m_dirblksize; /* directory block sz--bytes */ @@ -324,23 +195,25 @@ typedef struct xfs_mount { uint m_chsize; /* size of next field */ struct xfs_chash *m_chash; /* fs private inode per-cluster * hash table */ - struct xfs_dmops *m_dm_ops; /* vector of DMI ops */ - struct xfs_qmops *m_qm_ops; /* vector of XQM ops */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB - xfs_icsb_cnts_t *m_sb_cnts; /* per-cpu superblock counters */ + 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 */ - bhv_vfs_sync_work_t m_sync_work; /* work item for VFS_SYNC */ + xfs_sync_work_t m_sync_work; /* work item for VFS_SYNC */ struct list_head m_sync_list; /* sync thread work item list */ spinlock_t m_sync_lock; /* work item list lock */ int m_sync_seq; /* sync thread generation no. */ wait_queue_head_t m_wait_single_sync_task; - struct vfsmount *m_vfsmount; + __int64_t m_update_flags; /* sb flags we need to update + on the next remount,rw */ + struct shrinker m_inode_shrink; /* inode reclaim shrinker */ + int64_t m_low_space[XFS_LOWSP_MAX]; + /* low free space thresholds */ } xfs_mount_t; /* @@ -349,8 +222,7 @@ typedef struct xfs_mount { #define XFS_MOUNT_WSYNC (1ULL << 0) /* for nfs - all metadata ops must be synchronous except for space allocations */ -#define XFS_MOUNT_INO64 (1ULL << 1) -#define XFS_MOUNT_DMAPI (1ULL << 2) /* dmapi is enabled */ +#define XFS_MOUNT_DELAYLOG (1ULL << 1) /* delayed logging is enabled */ #define XFS_MOUNT_WAS_CLEAN (1ULL << 3) #define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem operations, typically for @@ -362,10 +234,7 @@ typedef struct xfs_mount { #define XFS_MOUNT_ATTR2 (1ULL << 8) /* allow use of attr2 format */ #define XFS_MOUNT_GRPID (1ULL << 9) /* group-ID assigned from directory */ #define XFS_MOUNT_NORECOVERY (1ULL << 10) /* no recovery - dirty fs */ -#define XFS_MOUNT_SHARED (1ULL << 11) /* shared mount */ #define XFS_MOUNT_DFLT_IOSIZE (1ULL << 12) /* set default i/o size */ -#define XFS_MOUNT_OSYNCISOSYNC (1ULL << 13) /* o_sync is REALLY o_sync */ - /* osyncisdsync is now default*/ #define XFS_MOUNT_32BITINODES (1ULL << 14) /* do not create inodes above * 32 bits in size */ #define XFS_MOUNT_SMALL_INUMS (1ULL << 15) /* users wants 32bit inodes */ @@ -378,8 +247,6 @@ typedef struct xfs_mount { #define XFS_MOUNT_DIRSYNC (1ULL << 21) /* synchronous directory ops */ #define XFS_MOUNT_COMPAT_IOSIZE (1ULL << 22) /* don't report large preferred * I/O size in stat() */ -#define XFS_MOUNT_NO_PERCPU_SB (1ULL << 23) /* don't use per-cpu superblock - counters */ #define XFS_MOUNT_FILESTREAMS (1ULL << 24) /* enable the filestreams allocator */ #define XFS_MOUNT_NOATTR2 (1ULL << 25) /* disable use of attr2 format */ @@ -402,8 +269,8 @@ typedef struct xfs_mount { * Synchronous read and write sizes. This should be * better for NFSv2 wsync filesystems. */ -#define XFS_WSYNC_READIO_LOG 15 /* 32K */ -#define XFS_WSYNC_WRITEIO_LOG 14 /* 16K */ +#define XFS_WSYNC_READIO_LOG 15 /* 32k */ +#define XFS_WSYNC_WRITEIO_LOG 14 /* 16k */ /* * Allow large block sizes to be reported to userspace programs if the @@ -439,12 +306,21 @@ void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname, #define xfs_force_shutdown(m,f) \ xfs_do_force_shutdown(m, f, __FILE__, __LINE__) +#define SHUTDOWN_META_IO_ERROR 0x0001 /* write attempt to metadata failed */ +#define SHUTDOWN_LOG_IO_ERROR 0x0002 /* write attempt to the log failed */ +#define SHUTDOWN_FORCE_UMOUNT 0x0004 /* shutdown from a forced unmount */ +#define SHUTDOWN_CORRUPT_INCORE 0x0008 /* corrupt in-memory data structures */ +#define SHUTDOWN_REMOTE_REQ 0x0010 /* shutdown came from remote cell */ +#define SHUTDOWN_DEVICE_REQ 0x0020 /* failed all paths to the device */ + +#define xfs_test_for_freeze(mp) ((mp)->m_super->s_frozen) +#define xfs_wait_for_freeze(mp,l) vfs_check_frozen((mp)->m_super, (l)) + /* * Flags for xfs_mountfs */ #define XFS_MFSI_QUIET 0x40 /* Be silent if mount errors found */ -#define XFS_DADDR_TO_AGNO(mp,d) xfs_daddr_to_agno(mp,d) static inline xfs_agnumber_t xfs_daddr_to_agno(struct xfs_mount *mp, xfs_daddr_t d) { @@ -453,7 +329,6 @@ xfs_daddr_to_agno(struct xfs_mount *mp, xfs_daddr_t d) return (xfs_agnumber_t) ld; } -#define XFS_DADDR_TO_AGBNO(mp,d) xfs_daddr_to_agbno(mp,d) static inline xfs_agblock_t xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) { @@ -462,31 +337,16 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) } /* - * perag get/put wrappers for eventual ref counting - */ -static inline xfs_perag_t * -xfs_get_perag(struct xfs_mount *mp, xfs_ino_t ino) -{ - return &mp->m_perag[XFS_INO_TO_AGNO(mp, ino)]; -} - -static inline void -xfs_put_perag(struct xfs_mount *mp, xfs_perag_t *pag) -{ - /* nothing to see here, move along */ -} - -/* * Per-cpu superblock locking functions */ #ifdef HAVE_PERCPU_SB -STATIC_INLINE void +static inline void xfs_icsb_lock(xfs_mount_t *mp) { mutex_lock(&mp->m_icsb_mutex); } -STATIC_INLINE void +static inline void xfs_icsb_unlock(xfs_mount_t *mp) { mutex_unlock(&mp->m_icsb_mutex); @@ -505,40 +365,39 @@ typedef struct xfs_mod_sb { int64_t msb_delta; /* Change to make to specified field */ } xfs_mod_sb_t; -#define XFS_MOUNT_ILOCK(mp) mutex_lock(&((mp)->m_ilock)) -#define XFS_MOUNT_IUNLOCK(mp) mutex_unlock(&((mp)->m_ilock)) - extern int xfs_log_sbcount(xfs_mount_t *, uint); +extern __uint64_t xfs_default_resblks(xfs_mount_t *mp); extern int xfs_mountfs(xfs_mount_t *mp); -extern void xfs_mountfs_check_barriers(xfs_mount_t *mp); extern void xfs_unmountfs(xfs_mount_t *); extern int xfs_unmountfs_writesb(xfs_mount_t *); -extern int xfs_unmount_flush(xfs_mount_t *, int); extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); -extern int xfs_mod_incore_sb_unlocked(xfs_mount_t *, xfs_sb_field_t, - int64_t, int); extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, uint, int); +extern int xfs_mount_log_sb(xfs_mount_t *, __int64_t); extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); extern int xfs_readsb(xfs_mount_t *, int); extern void xfs_freesb(xfs_mount_t *); extern int xfs_fs_writable(xfs_mount_t *); -extern int xfs_syncsub(xfs_mount_t *, int, int *); -extern int xfs_sync_inodes(xfs_mount_t *, int, int *); extern int xfs_sb_validate_fsb_count(struct xfs_sb *, __uint64_t); -extern int xfs_dmops_get(struct xfs_mount *, struct xfs_mount_args *); -extern void xfs_dmops_put(struct xfs_mount *); -extern int xfs_qmops_get(struct xfs_mount *, struct xfs_mount_args *); -extern void xfs_qmops_put(struct xfs_mount *); +extern int xfs_dev_is_read_only(struct xfs_mount *, char *); -extern struct xfs_dmops xfs_dmcore_xfs; +extern void xfs_set_low_space_thresholds(struct xfs_mount *); #endif /* __KERNEL__ */ +/* + * perag get/put wrappers for ref counting + */ +struct xfs_perag *xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno); +struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *mp, xfs_agnumber_t agno, + int tag); +void xfs_perag_put(struct xfs_perag *pag); + extern void xfs_mod_sb(struct xfs_trans *, __int64_t); -extern xfs_agnumber_t xfs_initialize_perag(struct xfs_mount *, xfs_agnumber_t); +extern int xfs_initialize_perag(struct xfs_mount *, xfs_agnumber_t, + xfs_agnumber_t *); extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); diff --git a/include/xfs_quota.h b/include/xfs_quota.h index 12c4ec7..5d1f57d 100644 --- a/include/xfs_quota.h +++ b/include/xfs_quota.h @@ -18,6 +18,8 @@ #ifndef __XFS_QUOTA_H__ #define __XFS_QUOTA_H__ +struct xfs_trans; + /* * The ondisk form of a dquot structure. */ @@ -84,14 +86,20 @@ typedef struct xfs_dqblk { #define XFS_DQ_USER 0x0001 /* a user quota */ #define XFS_DQ_PROJ 0x0002 /* project quota */ #define XFS_DQ_GROUP 0x0004 /* a group quota */ -#define XFS_DQ_FLOCKED 0x0008 /* flush lock taken */ -#define XFS_DQ_DIRTY 0x0010 /* dquot is dirty */ -#define XFS_DQ_WANT 0x0020 /* for lookup/reclaim race */ -#define XFS_DQ_INACTIVE 0x0040 /* dq off mplist & hashlist */ -#define XFS_DQ_MARKER 0x0080 /* sentinel */ +#define XFS_DQ_DIRTY 0x0008 /* dquot is dirty */ +#define XFS_DQ_WANT 0x0010 /* for lookup/reclaim race */ +#define XFS_DQ_INACTIVE 0x0020 /* dq off mplist & hashlist */ #define XFS_DQ_ALLTYPES (XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP) +#define XFS_DQ_FLAGS \ + { XFS_DQ_USER, "USER" }, \ + { XFS_DQ_PROJ, "PROJ" }, \ + { XFS_DQ_GROUP, "GROUP" }, \ + { XFS_DQ_DIRTY, "DIRTY" }, \ + { XFS_DQ_WANT, "WANT" }, \ + { XFS_DQ_INACTIVE, "INACTIVE" } + /* * In the worst case, when both user and group quotas are on, * we can have a max of three dquots changing in a single transaction. @@ -187,18 +195,13 @@ typedef struct xfs_qoff_logformat { * to a single function. None of these XFS_QMOPT_* flags are meant to have * persistent values (ie. their values can and will change between versions) */ -#define XFS_QMOPT_DQLOCK 0x0000001 /* dqlock */ #define XFS_QMOPT_DQALLOC 0x0000002 /* alloc dquot ondisk if needed */ #define XFS_QMOPT_UQUOTA 0x0000004 /* user dquot requested */ #define XFS_QMOPT_PQUOTA 0x0000008 /* project dquot requested */ #define XFS_QMOPT_FORCE_RES 0x0000010 /* ignore quota limits */ #define XFS_QMOPT_DQSUSER 0x0000020 /* don't cache super users dquot */ #define XFS_QMOPT_SBVERSION 0x0000040 /* change superblock version num */ -#define XFS_QMOPT_QUOTAOFF 0x0000080 /* quotas are being turned off */ -#define XFS_QMOPT_UMOUNTING 0x0000100 /* filesys is being unmounted */ -#define XFS_QMOPT_DOLOG 0x0000200 /* log buf changes (in quotacheck) */ #define XFS_QMOPT_DOWARN 0x0000400 /* increase warning cnt if needed */ -#define XFS_QMOPT_ILOCKED 0x0000800 /* inode is already locked (excl) */ #define XFS_QMOPT_DQREPAIR 0x0001000 /* repair dquot if damaged */ #define XFS_QMOPT_GQUOTA 0x0002000 /* group dquot requested */ #define XFS_QMOPT_ENOSPC 0x0004000 /* enospc instead of edquot (prj) */ @@ -217,16 +220,9 @@ typedef struct xfs_qoff_logformat { #define XFS_QMOPT_RES_INOS 0x0800000 /* - * flags for dqflush and dqflush_all. - */ -#define XFS_QMOPT_SYNC 0x1000000 -#define XFS_QMOPT_ASYNC 0x2000000 -#define XFS_QMOPT_DELWRI 0x4000000 - -/* * flags for dqalloc. */ -#define XFS_QMOPT_INHERIT 0x8000000 +#define XFS_QMOPT_INHERIT 0x1000000 /* * flags to xfs_trans_mod_dquot. @@ -303,69 +299,77 @@ typedef struct xfs_dqtrx { long qt_delrtb_delta; /* delayed RT blk count changes */ } xfs_dqtrx_t; -/* - * Dquot transaction functions, used if quota is enabled. - */ -typedef void (*qo_dup_dqinfo_t)(struct xfs_trans *, struct xfs_trans *); -typedef void (*qo_mod_dquot_byino_t)(struct xfs_trans *, - struct xfs_inode *, uint, long); -typedef void (*qo_free_dqinfo_t)(struct xfs_trans *); -typedef void (*qo_apply_dquot_deltas_t)(struct xfs_trans *); -typedef void (*qo_unreserve_and_mod_dquots_t)(struct xfs_trans *); -typedef int (*qo_reserve_quota_nblks_t)( - struct xfs_trans *, struct xfs_mount *, - struct xfs_inode *, long, long, uint); -typedef int (*qo_reserve_quota_bydquots_t)( - struct xfs_trans *, struct xfs_mount *, - struct xfs_dquot *, struct xfs_dquot *, - long, long, uint); -typedef struct xfs_dqtrxops { - qo_dup_dqinfo_t qo_dup_dqinfo; - qo_free_dqinfo_t qo_free_dqinfo; - qo_mod_dquot_byino_t qo_mod_dquot_byino; - qo_apply_dquot_deltas_t qo_apply_dquot_deltas; - qo_reserve_quota_nblks_t qo_reserve_quota_nblks; - qo_reserve_quota_bydquots_t qo_reserve_quota_bydquots; - qo_unreserve_and_mod_dquots_t qo_unreserve_and_mod_dquots; -} xfs_dqtrxops_t; - -#define XFS_DQTRXOP(mp, tp, op, args...) \ - ((mp)->m_qm_ops->xfs_dqtrxops ? \ - ((mp)->m_qm_ops->xfs_dqtrxops->op)(tp, ## args) : 0) - -#define XFS_DQTRXOP_VOID(mp, tp, op, args...) \ - ((mp)->m_qm_ops->xfs_dqtrxops ? \ - ((mp)->m_qm_ops->xfs_dqtrxops->op)(tp, ## args) : (void)0) - -#define XFS_TRANS_DUP_DQINFO(mp, otp, ntp) \ - XFS_DQTRXOP_VOID(mp, otp, qo_dup_dqinfo, ntp) -#define XFS_TRANS_FREE_DQINFO(mp, tp) \ - XFS_DQTRXOP_VOID(mp, tp, qo_free_dqinfo) -#define XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, field, delta) \ - XFS_DQTRXOP_VOID(mp, tp, qo_mod_dquot_byino, ip, field, delta) -#define XFS_TRANS_APPLY_DQUOT_DELTAS(mp, tp) \ - XFS_DQTRXOP_VOID(mp, tp, qo_apply_dquot_deltas) -#define XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, ninos, fl) \ - XFS_DQTRXOP(mp, tp, qo_reserve_quota_nblks, mp, ip, nblks, ninos, fl) -#define XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, nb, ni, fl) \ - XFS_DQTRXOP(mp, tp, qo_reserve_quota_bydquots, mp, ud, gd, nb, ni, fl) -#define XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp) \ - XFS_DQTRXOP_VOID(mp, tp, qo_unreserve_and_mod_dquots) - -#define XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, ninos, flags) \ - XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, -(nblks), -(ninos), flags) -#define XFS_TRANS_RESERVE_QUOTA(mp, tp, ud, gd, nb, ni, f) \ - XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, nb, ni, \ - f | XFS_QMOPT_RES_REGBLKS) -#define XFS_TRANS_UNRESERVE_QUOTA(mp, tp, ud, gd, nb, ni, f) \ - XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, -(nb), -(ni), \ - f | XFS_QMOPT_RES_REGBLKS) - extern int xfs_qm_dqcheck(xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *); extern int xfs_mount_reset_sbqflags(struct xfs_mount *); -extern struct xfs_qmops xfs_qmcore_xfs; - #endif /* __KERNEL__ */ +#ifdef CONFIG_XFS_QUOTA +extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *); +extern void xfs_trans_free_dqinfo(struct xfs_trans *); +extern void xfs_trans_mod_dquot_byino(struct xfs_trans *, struct xfs_inode *, + uint, long); +extern void xfs_trans_apply_dquot_deltas(struct xfs_trans *); +extern void xfs_trans_unreserve_and_mod_dquots(struct xfs_trans *); +extern int xfs_trans_reserve_quota_nblks(struct xfs_trans *, + struct xfs_inode *, long, long, uint); +extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *, + struct xfs_mount *, struct xfs_dquot *, + struct xfs_dquot *, long, long, uint); + +extern int xfs_qm_vop_dqalloc(struct xfs_inode *, uid_t, gid_t, prid_t, uint, + struct xfs_dquot **, struct xfs_dquot **); +extern void xfs_qm_vop_create_dqattach(struct xfs_trans *, struct xfs_inode *, + struct xfs_dquot *, struct xfs_dquot *); +extern int xfs_qm_vop_rename_dqattach(struct xfs_inode **); +extern struct xfs_dquot *xfs_qm_vop_chown(struct xfs_trans *, + struct xfs_inode *, struct xfs_dquot **, struct xfs_dquot *); +extern int xfs_qm_vop_chown_reserve(struct xfs_trans *, struct xfs_inode *, + struct xfs_dquot *, struct xfs_dquot *, uint); +extern int xfs_qm_dqattach(struct xfs_inode *, uint); +extern int xfs_qm_dqattach_locked(struct xfs_inode *, uint); +extern void xfs_qm_dqdetach(struct xfs_inode *); +extern void xfs_qm_dqrele(struct xfs_dquot *); +extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *); +extern int xfs_qm_sync(struct xfs_mount *, int); +extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *); +extern void xfs_qm_mount_quotas(struct xfs_mount *); +extern void xfs_qm_unmount(struct xfs_mount *); +extern void xfs_qm_unmount_quotas(struct xfs_mount *); + +#else +#define xfs_qm_vop_dqalloc(ip, uid, gid, prid, flags, udqp, gdqp) ({ \ + *(udqp) = NULL; \ + *(gdqp) = NULL; \ + 0; \ +}) +#define xfs_trans_dup_dqinfo(tp, tp2) +#define xfs_trans_free_dqinfo(tp) +#define xfs_trans_mod_dquot_byino(tp, ip, fields, delta) +#define xfs_trans_apply_dquot_deltas(tp) +#define xfs_trans_unreserve_and_mod_dquots(tp) +#define xfs_trans_reserve_quota_nblks(tp, ip, blks, inos, flg) (0) +#define xfs_trans_reserve_quota_bydquots(tp, mp, uqp, gqp, blks, inos, flg) (0) +#define xfs_qm_vop_create_dqattach(tp, ip, u, g) +#define xfs_qm_vop_rename_dqattach(it) (0) +#define xfs_qm_vop_chown(tp, ip, old, new) (NULL) +#define xfs_qm_vop_chown_reserve(tp, ip, u, g, fl) (0) +#define xfs_qm_dqattach(ip, fl) (0) +#define xfs_qm_dqattach_locked(ip, fl) (0) +#define xfs_qm_dqdetach(ip) +#define xfs_qm_dqrele(d) +#define xfs_qm_statvfs(ip, s) +#define xfs_qm_sync(mp, flags) (0) +#define xfs_qm_newmount(mp, a, b) (0) +#define xfs_qm_mount_quotas(mp) +#define xfs_qm_unmount(mp) +#define xfs_qm_unmount_quotas(mp) +#endif /* CONFIG_XFS_QUOTA */ + +#define xfs_trans_unreserve_quota_nblks(tp, ip, nblks, ninos, flags) \ + xfs_trans_reserve_quota_nblks(tp, ip, -(nblks), -(ninos), flags) +#define xfs_trans_reserve_quota(tp, mp, ud, gd, nb, ni, f) \ + xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, nb, ni, \ + f | XFS_QMOPT_RES_REGBLKS) + #endif /* __XFS_QUOTA_H__ */ diff --git a/include/xfs_rtalloc.h b/include/xfs_rtalloc.h index 8d8dcd2..ff614c2 100644 --- a/include/xfs_rtalloc.h +++ b/include/xfs_rtalloc.h @@ -23,8 +23,8 @@ struct xfs_trans; /* Min and max rt extent sizes, specified in bytes */ #define XFS_MAX_RTEXTSIZE (1024 * 1024 * 1024) /* 1GB */ -#define XFS_DFL_RTEXTSIZE (64 * 1024) /* 64KB */ -#define XFS_MIN_RTEXTSIZE (4 * 1024) /* 4KB */ +#define XFS_DFL_RTEXTSIZE (64 * 1024) /* 64kB */ +#define XFS_MIN_RTEXTSIZE (4 * 1024) /* 4kB */ /* * Constants for bit manipulations. @@ -108,6 +108,9 @@ xfs_rtfree_extent( int /* error */ xfs_rtmount_init( struct xfs_mount *mp); /* file system mount structure */ +void +xfs_rtunmount_inodes( + struct xfs_mount *mp); /* * Get the bitmap and summary inodes into the mount structure @@ -144,8 +147,18 @@ xfs_growfs_rt( # define xfs_rtfree_extent(t,b,l) (ENOSYS) # define xfs_rtpick_extent(m,t,l,rb) (ENOSYS) # define xfs_growfs_rt(mp,in) (ENOSYS) -# define xfs_rtmount_init(m) (((mp)->m_sb.sb_rblocks == 0)? 0 : (ENOSYS)) +static inline int /* error */ +xfs_rtmount_init( + xfs_mount_t *mp) /* file system mount structure */ +{ + if (mp->m_sb.sb_rblocks == 0) + return 0; + + cmn_err(CE_WARN, "XFS: Not built with CONFIG_XFS_RT"); + return ENOSYS; +} # define xfs_rtmount_inodes(m) (((mp)->m_sb.sb_rblocks == 0)? 0 : (ENOSYS)) +# define xfs_rtunmount_inodes(m) #endif /* CONFIG_XFS_RT */ #endif /* __KERNEL__ */ diff --git a/include/xfs_sb.h b/include/xfs_sb.h index f88dc32..5dcc2d7 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -299,30 +299,34 @@ typedef enum { #define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS) -#ifdef __KERNEL__ static inline int xfs_sb_good_version(xfs_sb_t *sbp) { - return (((sbp->sb_versionnum >= XFS_SB_VERSION_1) && \ - (sbp->sb_versionnum <= XFS_SB_VERSION_3)) || \ - ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - !((sbp->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS) || \ - ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && \ - (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS))) && \ - (sbp->sb_shared_vn <= XFS_SB_MAX_SHARED_VN))); -} + /* We always support version 1-3 */ + if (sbp->sb_versionnum >= XFS_SB_VERSION_1 && + sbp->sb_versionnum <= XFS_SB_VERSION_3) + return 1; + + /* We support version 4 if all feature bits are supported */ + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) { + if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS) || + ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && + (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS))) + return 0; + +#ifdef __KERNEL__ + if (sbp->sb_shared_vn > XFS_SB_MAX_SHARED_VN) + return 0; #else -static inline int xfs_sb_good_version(xfs_sb_t *sbp) -{ - return (((sbp->sb_versionnum >= XFS_SB_VERSION_1) && \ - (sbp->sb_versionnum <= XFS_SB_VERSION_3)) || \ - ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - !((sbp->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS) || \ - ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && \ - (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS))) && \ - (!(sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT) || \ - (sbp->sb_shared_vn <= XFS_SB_MAX_SHARED_VN)))); + if ((sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT) && + sbp->sb_shared_vn > XFS_SB_MAX_SHARED_VN) + return 0; +#endif + + return 1; + } + + return 0; } -#endif /* __KERNEL__ */ /* * Detect a mismatched features2 field. Older kernels read/wrote @@ -335,123 +339,127 @@ static inline int xfs_sb_has_mismatched_features2(xfs_sb_t *sbp) static inline unsigned xfs_sb_version_tonew(unsigned v) { - return ((((v) == XFS_SB_VERSION_1) ? \ - 0 : \ - (((v) == XFS_SB_VERSION_2) ? \ - XFS_SB_VERSION_ATTRBIT : \ - (XFS_SB_VERSION_ATTRBIT | XFS_SB_VERSION_NLINKBIT))) | \ - XFS_SB_VERSION_4); + if (v == XFS_SB_VERSION_1) + return XFS_SB_VERSION_4; + + if (v == XFS_SB_VERSION_2) + return XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT; + + return XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT | + XFS_SB_VERSION_NLINKBIT; } static inline unsigned xfs_sb_version_toold(unsigned v) { - return (((v) & (XFS_SB_VERSION_QUOTABIT | XFS_SB_VERSION_ALIGNBIT)) ? \ - 0 : \ - (((v) & XFS_SB_VERSION_NLINKBIT) ? \ - XFS_SB_VERSION_3 : \ - (((v) & XFS_SB_VERSION_ATTRBIT) ? \ - XFS_SB_VERSION_2 : \ - XFS_SB_VERSION_1))); + if (v & (XFS_SB_VERSION_QUOTABIT | XFS_SB_VERSION_ALIGNBIT)) + return 0; + if (v & XFS_SB_VERSION_NLINKBIT) + return XFS_SB_VERSION_3; + if (v & XFS_SB_VERSION_ATTRBIT) + return XFS_SB_VERSION_2; + return XFS_SB_VERSION_1; } static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp) { - return ((sbp)->sb_versionnum == XFS_SB_VERSION_2) || \ - ((sbp)->sb_versionnum == XFS_SB_VERSION_3) || \ - ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_ATTRBIT)); + return sbp->sb_versionnum == XFS_SB_VERSION_2 || + sbp->sb_versionnum == XFS_SB_VERSION_3 || + (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT)); } static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) { - (sbp)->sb_versionnum = (((sbp)->sb_versionnum == XFS_SB_VERSION_1) ? \ - XFS_SB_VERSION_2 : \ - ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) ? \ - ((sbp)->sb_versionnum | XFS_SB_VERSION_ATTRBIT) : \ - (XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT))); + if (sbp->sb_versionnum == XFS_SB_VERSION_1) + sbp->sb_versionnum = XFS_SB_VERSION_2; + else if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) + sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; + else + sbp->sb_versionnum = XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT; } static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) { - return ((sbp)->sb_versionnum == XFS_SB_VERSION_3) || \ - ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); + return sbp->sb_versionnum == XFS_SB_VERSION_3 || + (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); } static inline void xfs_sb_version_addnlink(xfs_sb_t *sbp) { - (sbp)->sb_versionnum = ((sbp)->sb_versionnum <= XFS_SB_VERSION_2 ? \ - XFS_SB_VERSION_3 : \ - ((sbp)->sb_versionnum | XFS_SB_VERSION_NLINKBIT)); + if (sbp->sb_versionnum <= XFS_SB_VERSION_2) + sbp->sb_versionnum = XFS_SB_VERSION_3; + else + sbp->sb_versionnum |= XFS_SB_VERSION_NLINKBIT; } static inline int xfs_sb_version_hasquota(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_QUOTABIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); } static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) { - (sbp)->sb_versionnum = \ - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 ? \ - ((sbp)->sb_versionnum | XFS_SB_VERSION_QUOTABIT) : \ - (xfs_sb_version_tonew((sbp)->sb_versionnum) | \ - XFS_SB_VERSION_QUOTABIT)); + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) + sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT; + else + sbp->sb_versionnum = xfs_sb_version_tonew(sbp->sb_versionnum) | + XFS_SB_VERSION_QUOTABIT; } static inline int xfs_sb_version_hasalign(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_ALIGNBIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT); } static inline int xfs_sb_version_hasdalign(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); } static inline int xfs_sb_version_hasshared(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_SHAREDBIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT); } static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); } static inline int xfs_sb_version_haslogv2(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); } static inline int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); } static inline int xfs_sb_version_hassector(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_SECTORBIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT); } static inline int xfs_sb_version_hasasciici(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); } static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT); } /* @@ -466,22 +474,20 @@ static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) static inline int xfs_sb_version_haslazysbcount(xfs_sb_t *sbp) { - return (xfs_sb_version_hasmorebits(sbp) && \ - ((sbp)->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)); + return xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT); } static inline int xfs_sb_version_hasattr2(xfs_sb_t *sbp) { - return (xfs_sb_version_hasmorebits(sbp)) && \ - ((sbp)->sb_features2 & XFS_SB_VERSION2_ATTR2BIT); + return xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT); } static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) { - ((sbp)->sb_versionnum = \ - ((sbp)->sb_versionnum | XFS_SB_VERSION_MOREBITSBIT), \ - ((sbp)->sb_features2 = \ - ((sbp)->sb_features2 | XFS_SB_VERSION2_ATTR2BIT))); + sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; + sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; } static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp) @@ -514,7 +520,7 @@ static inline void xfs_sb_version_addprojid32bit(xfs_sb_t *sbp) #define XFS_HDR_BLOCK(mp,d) ((xfs_agblock_t)XFS_BB_TO_FSBT(mp,d)) #define XFS_DADDR_TO_FSB(mp,d) XFS_AGB_TO_FSB(mp, \ - XFS_DADDR_TO_AGNO(mp,d), XFS_DADDR_TO_AGBNO(mp,d)) + xfs_daddr_to_agno(mp,d), xfs_daddr_to_agbno(mp,d)) #define XFS_FSB_TO_DADDR(mp,fsbno) XFS_AGB_TO_DADDR(mp, \ XFS_FSB_TO_AGNO(mp,fsbno), XFS_FSB_TO_AGBNO(mp,fsbno)) diff --git a/include/xfs_trace.h b/include/xfs_trace.h new file mode 100644 index 0000000..bf82f6e --- /dev/null +++ b/include/xfs_trace.h @@ -0,0 +1,85 @@ +#ifndef __TRACE_H__ +#define __TRACE_H__ + +#define trace_xfs_alloc_exact_done(a) ((void) 0) +#define trace_xfs_alloc_exact_notfound(a) ((void) 0) +#define trace_xfs_alloc_exact_error(a) ((void) 0) +#define trace_xfs_alloc_near_nominleft(a) ((void) 0) +#define trace_xfs_alloc_near_first(a) ((void) 0) +#define trace_xfs_alloc_near_greater(a) ((void) 0) +#define trace_xfs_alloc_near_lesser(a) ((void) 0) +#define trace_xfs_alloc_near_error(a) ((void) 0) +#define trace_xfs_alloc_size_neither(a) ((void) 0) +#define trace_xfs_alloc_size_noentry(a) ((void) 0) +#define trace_xfs_alloc_size_nominleft(a) ((void) 0) +#define trace_xfs_alloc_size_done(a) ((void) 0) +#define trace_xfs_alloc_size_error(a) ((void) 0) +#define trace_xfs_alloc_small_freelist(a) ((void) 0) +#define trace_xfs_alloc_small_notenough(a) ((void) 0) +#define trace_xfs_alloc_small_done(a) ((void) 0) +#define trace_xfs_alloc_small_error(a) ((void) 0) +#define trace_xfs_alloc_vextent_badargs(a) ((void) 0) +#define trace_xfs_alloc_vextent_nofix(a) ((void) 0) +#define trace_xfs_alloc_vextent_noagbp(a) ((void) 0) +#define trace_xfs_alloc_vextent_loopfailed(a) ((void) 0) +#define trace_xfs_alloc_vextent_allfailed(a) ((void) 0) + +#define trace_xfs_log_recover_item_reorder_head(a,b,c,d) ((void) 0) +#define trace_xfs_log_recover_item_reorder_tail(a,b,c,d) ((void) 0) +#define trace_xfs_log_recover_item_add_cont(a,b,c,d) ((void) 0) +#define trace_xfs_log_recover_item_add(a,b,c,d) ((void) 0) + +#define trace_xfs_btree_corrupt(a,b) ((void) 0) +#define trace_xfs_da_btree_corrupt(a,b) ((void) 0) + +#define trace_xfs_free_extent(a,b,c,d,e,f,g) ((void) 0) +#define trace_xfs_agf(a,b,c,d) ((void) 0) + +#define trace_xfs_iext_insert(a,b,c,d,e) ((void) 0) +#define trace_xfs_iext_remove(a,b,c,d) ((void) 0) + +#define trace_xfs_dir2_grow_inode(a,b) ((void) 0) +#define trace_xfs_dir2_shrink_inode(a,b) ((void) 0) + +#define trace_xfs_dir2_leaf_to_node(a) ((void) 0) +#define trace_xfs_dir2_leaf_to_block(a) ((void) 0) +#define trace_xfs_dir2_leaf_addname(a) ((void) 0) +#define trace_xfs_dir2_leaf_lookup(a) ((void) 0) +#define trace_xfs_dir2_leaf_removename(a) ((void) 0) +#define trace_xfs_dir2_leaf_replace(a) ((void) 0) + +#define trace_xfs_dir2_block_addname(a) ((void) 0) +#define trace_xfs_dir2_block_to_leaf(a) ((void) 0) +#define trace_xfs_dir2_block_to_sf(a) ((void) 0) +#define trace_xfs_dir2_block_lookup(a) ((void) 0) +#define trace_xfs_dir2_block_removename(a) ((void) 0) +#define trace_xfs_dir2_block_replace(a) ((void) 0) + +#define trace_xfs_dir2_leafn_add(a,b) ((void) 0) +#define trace_xfs_dir2_leafn_remove(a,b) ((void) 0) +#define trace_xfs_dir2_leafn_moveents(a,b,c,d) ((void) 0) + +#define trace_xfs_dir2_node_to_leaf(a) ((void) 0) +#define trace_xfs_dir2_node_addname(a) ((void) 0) +#define trace_xfs_dir2_node_lookup(a) ((void) 0) +#define trace_xfs_dir2_node_removename(a) ((void) 0) +#define trace_xfs_dir2_node_replace(a) ((void) 0) + +#define trace_xfs_dir2_sf_to_block(a) ((void) 0) +#define trace_xfs_dir2_sf_addname(a) ((void) 0) +#define trace_xfs_dir2_sf_create(a) ((void) 0) +#define trace_xfs_dir2_sf_lookup(a) ((void) 0) +#define trace_xfs_dir2_sf_removename(a) ((void) 0) +#define trace_xfs_dir2_sf_replace(a) ((void) 0) +#define trace_xfs_dir2_sf_toino4(a) ((void) 0) +#define trace_xfs_dir2_sf_toino8(a) ((void) 0) + +#define trace_xfs_bmap_pre_update(a,b,c,d) ((void) 0) +#define trace_xfs_bmap_post_update(a,b,c,d) ((void) 0) +#define trace_xfs_extlist(a,b,c,d) ((void) 0) +#define trace_xfs_bunmap(a,b,c,d,e) ((void) 0) + +#define trace_xfs_perag_get(a,b,c,d) ((void) 0) +#define trace_xfs_perag_put(a,b,c,d) ((void) 0) + +#endif /* __TRACE_H__ */ diff --git a/include/xfs_trans.h b/include/xfs_trans.h index 1d89d50..c2042b7 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -49,6 +49,15 @@ typedef struct xfs_trans_header { #define XFS_LI_DQUOT 0x123d #define XFS_LI_QUOTAOFF 0x123e +#define XFS_LI_TYPE_DESC \ + { XFS_LI_EFI, "XFS_LI_EFI" }, \ + { XFS_LI_EFD, "XFS_LI_EFD" }, \ + { XFS_LI_IUNLINK, "XFS_LI_IUNLINK" }, \ + { XFS_LI_INODE, "XFS_LI_INODE" }, \ + { XFS_LI_BUF, "XFS_LI_BUF" }, \ + { XFS_LI_DQUOT, "XFS_LI_DQUOT" }, \ + { XFS_LI_QUOTAOFF, "XFS_LI_QUOTAOFF" } + /* * Transaction types. Used to distinguish types of buffers. */ @@ -68,7 +77,7 @@ typedef struct xfs_trans_header { #define XFS_TRANS_GROWFS 14 #define XFS_TRANS_STRAT_WRITE 15 #define XFS_TRANS_DIOSTRAT 16 -#define XFS_TRANS_WRITE_SYNC 17 +/* 17 was XFS_TRANS_WRITE_SYNC */ #define XFS_TRANS_WRITEID 18 #define XFS_TRANS_ADDAFORK 19 #define XFS_TRANS_ATTRINVAL 20 @@ -97,9 +106,54 @@ typedef struct xfs_trans_header { #define XFS_TRANS_GROWFSRT_FREE 39 #define XFS_TRANS_SWAPEXT 40 #define XFS_TRANS_SB_COUNT 41 -#define XFS_TRANS_TYPE_MAX 41 +#define XFS_TRANS_CHECKPOINT 42 +#define XFS_TRANS_TYPE_MAX 42 /* new transaction types need to be reflected in xfs_logprint(8) */ +#define XFS_TRANS_TYPES \ + { XFS_TRANS_SETATTR_NOT_SIZE, "SETATTR_NOT_SIZE" }, \ + { XFS_TRANS_SETATTR_SIZE, "SETATTR_SIZE" }, \ + { XFS_TRANS_INACTIVE, "INACTIVE" }, \ + { XFS_TRANS_CREATE, "CREATE" }, \ + { XFS_TRANS_CREATE_TRUNC, "CREATE_TRUNC" }, \ + { XFS_TRANS_TRUNCATE_FILE, "TRUNCATE_FILE" }, \ + { XFS_TRANS_REMOVE, "REMOVE" }, \ + { XFS_TRANS_LINK, "LINK" }, \ + { XFS_TRANS_RENAME, "RENAME" }, \ + { XFS_TRANS_MKDIR, "MKDIR" }, \ + { XFS_TRANS_RMDIR, "RMDIR" }, \ + { XFS_TRANS_SYMLINK, "SYMLINK" }, \ + { XFS_TRANS_SET_DMATTRS, "SET_DMATTRS" }, \ + { XFS_TRANS_GROWFS, "GROWFS" }, \ + { XFS_TRANS_STRAT_WRITE, "STRAT_WRITE" }, \ + { XFS_TRANS_DIOSTRAT, "DIOSTRAT" }, \ + { XFS_TRANS_WRITEID, "WRITEID" }, \ + { XFS_TRANS_ADDAFORK, "ADDAFORK" }, \ + { XFS_TRANS_ATTRINVAL, "ATTRINVAL" }, \ + { XFS_TRANS_ATRUNCATE, "ATRUNCATE" }, \ + { XFS_TRANS_ATTR_SET, "ATTR_SET" }, \ + { XFS_TRANS_ATTR_RM, "ATTR_RM" }, \ + { XFS_TRANS_ATTR_FLAG, "ATTR_FLAG" }, \ + { XFS_TRANS_CLEAR_AGI_BUCKET, "CLEAR_AGI_BUCKET" }, \ + { XFS_TRANS_QM_SBCHANGE, "QM_SBCHANGE" }, \ + { XFS_TRANS_QM_QUOTAOFF, "QM_QUOTAOFF" }, \ + { XFS_TRANS_QM_DQALLOC, "QM_DQALLOC" }, \ + { XFS_TRANS_QM_SETQLIM, "QM_SETQLIM" }, \ + { XFS_TRANS_QM_DQCLUSTER, "QM_DQCLUSTER" }, \ + { XFS_TRANS_QM_QINOCREATE, "QM_QINOCREATE" }, \ + { XFS_TRANS_QM_QUOTAOFF_END, "QM_QOFF_END" }, \ + { XFS_TRANS_SB_UNIT, "SB_UNIT" }, \ + { XFS_TRANS_FSYNC_TS, "FSYNC_TS" }, \ + { XFS_TRANS_GROWFSRT_ALLOC, "GROWFSRT_ALLOC" }, \ + { XFS_TRANS_GROWFSRT_ZERO, "GROWFSRT_ZERO" }, \ + { XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \ + { XFS_TRANS_SWAPEXT, "SWAPEXT" }, \ + { XFS_TRANS_SB_COUNT, "SB_COUNT" }, \ + { XFS_TRANS_CHECKPOINT, "CHECKPOINT" }, \ + { XFS_TRANS_DUMMY1, "DUMMY1" }, \ + { XFS_TRANS_DUMMY2, "DUMMY2" }, \ + { XLOG_UNMOUNT_REC_TYPE, "UNMOUNT" } + /* * This structure is used to track log items associated with * a transaction. It points to the log item and keeps some @@ -107,106 +161,14 @@ typedef struct xfs_trans_header { * the amount of space needed to log the item it describes * once we get to commit processing (see xfs_trans_commit()). */ -typedef struct xfs_log_item_desc { +struct xfs_log_item_desc { struct xfs_log_item *lid_item; - ushort lid_size; - unsigned char lid_flags; - unsigned char lid_index; -} xfs_log_item_desc_t; + ushort lid_size; + unsigned char lid_flags; + struct list_head lid_trans; +}; #define XFS_LID_DIRTY 0x1 -#define XFS_LID_PINNED 0x2 -#define XFS_LID_BUF_STALE 0x8 - -/* - * This structure is used to maintain a chunk list of log_item_desc - * structures. The free field is a bitmask indicating which descriptors - * in this chunk's array are free. The unused field is the first value - * not used since this chunk was allocated. - */ -#define XFS_LIC_NUM_SLOTS 15 -typedef struct xfs_log_item_chunk { - struct xfs_log_item_chunk *lic_next; - ushort lic_free; - ushort lic_unused; - xfs_log_item_desc_t lic_descs[XFS_LIC_NUM_SLOTS]; -} xfs_log_item_chunk_t; - -#define XFS_LIC_MAX_SLOT (XFS_LIC_NUM_SLOTS - 1) -#define XFS_LIC_FREEMASK ((1 << XFS_LIC_NUM_SLOTS) - 1) - - -/* - * Initialize the given chunk. Set the chunk's free descriptor mask - * to indicate that all descriptors are free. The caller gets to set - * lic_unused to the right value (0 matches all free). The - * lic_descs.lid_index values are set up as each desc is allocated. - */ -static inline void xfs_lic_init(xfs_log_item_chunk_t *cp) -{ - cp->lic_free = XFS_LIC_FREEMASK; -} - -static inline void xfs_lic_init_slot(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_descs[slot].lid_index = (unsigned char)(slot); -} - -static inline int xfs_lic_vacancy(xfs_log_item_chunk_t *cp) -{ - return cp->lic_free & XFS_LIC_FREEMASK; -} - -static inline void xfs_lic_all_free(xfs_log_item_chunk_t *cp) -{ - cp->lic_free = XFS_LIC_FREEMASK; -} - -static inline int xfs_lic_are_all_free(xfs_log_item_chunk_t *cp) -{ - return ((cp->lic_free & XFS_LIC_FREEMASK) == XFS_LIC_FREEMASK); -} - -static inline int xfs_lic_isfree(xfs_log_item_chunk_t *cp, int slot) -{ - return (cp->lic_free & (1 << slot)); -} - -static inline void xfs_lic_claim(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_free &= ~(1 << slot); -} - -static inline void xfs_lic_relse(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_free |= 1 << slot; -} - -static inline xfs_log_item_desc_t * -xfs_lic_slot(xfs_log_item_chunk_t *cp, int slot) -{ - return &(cp->lic_descs[slot]); -} - -static inline int xfs_lic_desc_to_slot(xfs_log_item_desc_t *dp) -{ - return (uint)dp->lid_index; -} - -/* - * Calculate the address of a chunk given a descriptor pointer: - * dp - dp->lid_index give the address of the start of the lic_descs array. - * From this we subtract the offset of the lic_descs field in a chunk. - * All of this yields the address of the chunk, which is - * cast to a chunk pointer. - */ -static inline xfs_log_item_chunk_t * -xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp) -{ - return (xfs_log_item_chunk_t*) \ - (((xfs_caddr_t)((dp) - (dp)->lid_index)) - \ - (xfs_caddr_t)(((xfs_log_item_chunk_t*)0)->lic_descs)); -} #define XFS_TRANS_MAGIC 0x5452414E /* 'TRAN' */ /* @@ -222,8 +184,6 @@ xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp) /* * Values for call flags parameter. */ -#define XFS_TRANS_NOSLEEP 0x1 -#define XFS_TRANS_WAIT 0x2 #define XFS_TRANS_RELEASE_LOG_RES 0x4 #define XFS_TRANS_ABORT 0x8 @@ -247,24 +207,6 @@ xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp) /* - * Various log reservation values. - * These are based on the size of the file system block - * because that is what most transactions manipulate. - * Each adds in an additional 128 bytes per item logged to - * try to account for the overhead of the transaction mechanism. - * - * Note: - * Most of the reservations underestimate the number of allocation - * groups into which they could free extents in the xfs_bmap_finish() - * call. This is because the number in the worst case is quite high - * and quite unusual. In order to fix this we need to change - * xfs_bmap_finish() to free extents in only a single AG at a time. - * This will require changes to the EFI code as well, however, so that - * the EFI for the extents not freed is logged again in each transaction. - * See bug 261917. - */ - -/* * Per-extent log reservation for the allocation btree changes * involved in freeing or allocating an extent. * 2 trees * (2 blocks/level * max depth - 1) * block size @@ -288,429 +230,36 @@ xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp) (XFS_DAENTER_BLOCKS(mp, XFS_DATA_FORK) + \ XFS_DAENTER_BMAPS(mp, XFS_DATA_FORK) + 1) -/* - * In a write transaction we can allocate a maximum of 2 - * extents. This gives: - * the inode getting the new extents: inode size - * the inode\'s bmap btree: max depth * block size - * the agfs of the ags from which the extents are allocated: 2 * sector - * the superblock free block counter: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - * And the bmap_finish transaction can free bmap blocks in a join: - * the agfs of the ags containing the blocks: 2 * sector size - * the agfls of the ags containing the blocks: 2 * sector size - * the super block free block counter: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_WRITE_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + \ - (2 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ - (128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))),\ - ((2 * (mp)->m_sb.sb_sectsize) + \ - (2 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ - (128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))))) #define XFS_WRITE_LOG_RES(mp) ((mp)->m_reservations.tr_write) - -/* - * In truncating a file we free up to two extents at once. We can modify: - * the inode being truncated: inode size - * the inode\'s bmap btree: (max depth + 1) * block size - * And the bmap_finish transaction can free the blocks and bmap blocks: - * the agf for each of the ags: 4 * sector size - * the agfl for each of the ags: 4 * sector size - * the super block to reflect the freed blocks: sector size - * worst case split in allocation btrees per extent assuming 4 extents: - * 4 exts * 2 trees * (2 * max depth - 1) * block size - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (max depth - 1) * block size - */ -#define XFS_CALC_ITRUNCATE_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + \ - (128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)))), \ - ((4 * (mp)->m_sb.sb_sectsize) + \ - (4 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 4) + \ - (128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4))) + \ - (128 * 5) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + XFS_IN_MAXLEVELS(mp) + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) - #define XFS_ITRUNCATE_LOG_RES(mp) ((mp)->m_reservations.tr_itruncate) - -/* - * In renaming a files we can modify: - * the four inodes involved: 4 * inode size - * the two directory btrees: 2 * (max depth + v2) * dir block size - * the two directory bmap btrees: 2 * max depth * block size - * And the bmap_finish transaction can free dir and bmap blocks (two sets - * of bmap blocks) giving: - * the agf for the ags in which the blocks live: 3 * sector size - * the agfl for the ags in which the blocks live: 3 * sector size - * the superblock for the free block count: sector size - * the allocation btrees: 3 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_RENAME_LOG_RES(mp) \ - (MAX( \ - ((4 * (mp)->m_sb.sb_inodesize) + \ - (2 * XFS_DIROP_LOG_RES(mp)) + \ - (128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp)))), \ - ((3 * (mp)->m_sb.sb_sectsize) + \ - (3 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 3) + \ - (128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))))) - #define XFS_RENAME_LOG_RES(mp) ((mp)->m_reservations.tr_rename) - -/* - * For creating a link to an inode: - * the parent directory inode: inode size - * the linked inode: inode size - * the directory btree could split: (max depth + v2) * dir block size - * the directory bmap btree could join or split: (max depth + v2) * blocksize - * And the bmap_finish transaction can free some bmap blocks giving: - * the agf for the ag in which the blocks live: sector size - * the agfl for the ag in which the blocks live: sector size - * the superblock for the free block count: sector size - * the allocation btrees: 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_LINK_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_inodesize + \ - XFS_DIROP_LOG_RES(mp) + \ - (128 * (2 + XFS_DIROP_LOG_COUNT(mp)))), \ - ((mp)->m_sb.sb_sectsize + \ - (mp)->m_sb.sb_sectsize + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) - #define XFS_LINK_LOG_RES(mp) ((mp)->m_reservations.tr_link) - -/* - * For removing a directory entry we can modify: - * the parent directory inode: inode size - * the removed inode: inode size - * the directory btree could join: (max depth + v2) * dir block size - * the directory bmap btree could join or split: (max depth + v2) * blocksize - * And the bmap_finish transaction can free the dir and bmap blocks giving: - * the agf for the ag in which the blocks live: 2 * sector size - * the agfl for the ag in which the blocks live: 2 * sector size - * the superblock for the free block count: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_REMOVE_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_inodesize + \ - XFS_DIROP_LOG_RES(mp) + \ - (128 * (2 + XFS_DIROP_LOG_COUNT(mp)))), \ - ((2 * (mp)->m_sb.sb_sectsize) + \ - (2 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ - (128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))))) - #define XFS_REMOVE_LOG_RES(mp) ((mp)->m_reservations.tr_remove) - -/* - * For symlink we can modify: - * the parent directory inode: inode size - * the new inode: inode size - * the inode btree entry: 1 block - * the directory btree: (max depth + v2) * dir block size - * the directory inode\'s bmap btree: (max depth + v2) * block size - * the blocks for the symlink: 1 KB - * Or in the first xact we allocate some inodes giving: - * the agi and agf of the ag getting the new inodes: 2 * sectorsize - * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_SYMLINK_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B(mp, 1) + \ - XFS_DIROP_LOG_RES(mp) + \ - 1024 + \ - (128 * (4 + XFS_DIROP_LOG_COUNT(mp)))), \ - (2 * (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), XFS_IALLOC_BLOCKS((mp))) + \ - XFS_FSB_TO_B((mp), XFS_IN_MAXLEVELS(mp)) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + XFS_IN_MAXLEVELS(mp) + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) - #define XFS_SYMLINK_LOG_RES(mp) ((mp)->m_reservations.tr_symlink) - -/* - * For create we can modify: - * the parent directory inode: inode size - * the new inode: inode size - * the inode btree entry: block size - * the superblock for the nlink flag: sector size - * the directory btree: (max depth + v2) * dir block size - * the directory inode\'s bmap btree: (max depth + v2) * block size - * Or in the first xact we allocate some inodes giving: - * the agi and agf of the ag getting the new inodes: 2 * sectorsize - * the superblock for the nlink flag: sector size - * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (max depth - 1) * block size - */ -#define XFS_CALC_CREATE_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B(mp, 1) + \ - XFS_DIROP_LOG_RES(mp) + \ - (128 * (3 + XFS_DIROP_LOG_COUNT(mp)))), \ - (3 * (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), XFS_IALLOC_BLOCKS((mp))) + \ - XFS_FSB_TO_B((mp), XFS_IN_MAXLEVELS(mp)) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + XFS_IN_MAXLEVELS(mp) + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) - #define XFS_CREATE_LOG_RES(mp) ((mp)->m_reservations.tr_create) - -/* - * Making a new directory is the same as creating a new file. - */ -#define XFS_CALC_MKDIR_LOG_RES(mp) XFS_CALC_CREATE_LOG_RES(mp) - #define XFS_MKDIR_LOG_RES(mp) ((mp)->m_reservations.tr_mkdir) - -/* - * In freeing an inode we can modify: - * the inode being freed: inode size - * the super block free inode counter: sector size - * the agi hash list and counters: sector size - * the inode btree entry: block size - * the on disk inode before ours in the agi hash list: inode cluster size - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (max depth - 1) * block size - */ -#define XFS_CALC_IFREE_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize + \ - (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), 1) + \ - MAX((__uint16_t)XFS_FSB_TO_B((mp), 1), XFS_INODE_CLUSTER_SIZE(mp)) + \ - (128 * 5) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + XFS_IN_MAXLEVELS(mp) + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) - - #define XFS_IFREE_LOG_RES(mp) ((mp)->m_reservations.tr_ifree) - -/* - * When only changing the inode we log the inode and possibly the superblock - * We also add a bit of slop for the transaction stuff. - */ -#define XFS_CALC_ICHANGE_LOG_RES(mp) ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize + 512) - #define XFS_ICHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_ichange) - -/* - * Growing the data section of the filesystem. - * superblock - * agi and agf - * allocation btrees - */ -#define XFS_CALC_GROWDATA_LOG_RES(mp) \ - ((mp)->m_sb.sb_sectsize * 3 + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) - #define XFS_GROWDATA_LOG_RES(mp) ((mp)->m_reservations.tr_growdata) - -/* - * Growing the rt section of the filesystem. - * In the first set of transactions (ALLOC) we allocate space to the - * bitmap or summary files. - * superblock: sector size - * agf of the ag from which the extent is allocated: sector size - * bmap btree for bitmap/summary inode: max depth * blocksize - * bitmap/summary inode: inode size - * allocation btrees for 1 block alloc: 2 * (2 * maxdepth - 1) * blocksize - */ -#define XFS_CALC_GROWRTALLOC_LOG_RES(mp) \ - (2 * (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + \ - (mp)->m_sb.sb_inodesize + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * \ - (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) - #define XFS_GROWRTALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_growrtalloc) - -/* - * Growing the rt section of the filesystem. - * In the second set of transactions (ZERO) we zero the new metadata blocks. - * one bitmap/summary block: blocksize - */ -#define XFS_CALC_GROWRTZERO_LOG_RES(mp) \ - ((mp)->m_sb.sb_blocksize + 128) - #define XFS_GROWRTZERO_LOG_RES(mp) ((mp)->m_reservations.tr_growrtzero) - -/* - * Growing the rt section of the filesystem. - * In the third set of transactions (FREE) we update metadata without - * allocating any new blocks. - * superblock: sector size - * bitmap inode: inode size - * summary inode: inode size - * one bitmap block: blocksize - * summary blocks: new summary size - */ -#define XFS_CALC_GROWRTFREE_LOG_RES(mp) \ - ((mp)->m_sb.sb_sectsize + \ - 2 * (mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_blocksize + \ - (mp)->m_rsumsize + \ - (128 * 5)) - #define XFS_GROWRTFREE_LOG_RES(mp) ((mp)->m_reservations.tr_growrtfree) - -/* - * Logging the inode modification timestamp on a synchronous write. - * inode - */ -#define XFS_CALC_SWRITE_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + 128) - #define XFS_SWRITE_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) - /* * Logging the inode timestamps on an fsync -- same as SWRITE * as long as SWRITE logs the entire inode core */ #define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) - -/* - * Logging the inode mode bits when writing a setuid/setgid file - * inode - */ -#define XFS_CALC_WRITEID_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + 128) - #define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) - -/* - * Converting the inode from non-attributed to attributed. - * the inode being converted: inode size - * agf block and superblock (for block allocation) - * the new block (directory sized) - * bmap blocks for the new directory block - * allocation btrees - */ -#define XFS_CALC_ADDAFORK_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize * 2 + \ - (mp)->m_dirblksize + \ - XFS_FSB_TO_B(mp, (XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1)) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (4 + (XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) - #define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_reservations.tr_addafork) - -/* - * Removing the attribute fork of a file - * the inode being truncated: inode size - * the inode\'s bmap btree: max depth * block size - * And the bmap_finish transaction can free the blocks and bmap blocks: - * the agf for each of the ags: 4 * sector size - * the agfl for each of the ags: 4 * sector size - * the super block to reflect the freed blocks: sector size - * worst case split in allocation btrees per extent assuming 4 extents: - * 4 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_ATTRINVAL_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + \ - (128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)))), \ - ((4 * (mp)->m_sb.sb_sectsize) + \ - (4 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 4) + \ - (128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))))) - #define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_reservations.tr_attrinval) - -/* - * Setting an attribute. - * the inode getting the attribute - * the superblock for allocations - * the agfs extents are allocated from - * the attribute btree * max depth - * the inode allocation btree - * Since attribute transaction space is dependent on the size of the attribute, - * the calculation is done partially at mount time and partially at runtime. - */ -#define XFS_CALC_ATTRSET_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), XFS_DA_NODE_MAXDEPTH) + \ - (128 * (2 + XFS_DA_NODE_MAXDEPTH))) - #define XFS_ATTRSET_LOG_RES(mp, ext) \ ((mp)->m_reservations.tr_attrset + \ (ext * (mp)->m_sb.sb_sectsize) + \ (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))))) - -/* - * Removing an attribute. - * the inode: inode size - * the attribute btree could join: max depth * block size - * the inode bmap btree could join or split: max depth * block size - * And the bmap_finish transaction can free the attr blocks freed giving: - * the agf for the ag in which the blocks live: 2 * sector size - * the agfl for the ag in which the blocks live: 2 * sector size - * the superblock for the free block count: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_ATTRRM_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B((mp), XFS_DA_NODE_MAXDEPTH) + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + \ - (128 * (1 + XFS_DA_NODE_MAXDEPTH + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)))), \ - ((2 * (mp)->m_sb.sb_sectsize) + \ - (2 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ - (128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))))) - #define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) - -/* - * Clearing a bad agino number in an agi hash bucket. - */ -#define XFS_CALC_CLEAR_AGI_BUCKET_LOG_RES(mp) \ - ((mp)->m_sb.sb_sectsize + 128) - #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) @@ -745,8 +294,8 @@ xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp) #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__ @@ -762,12 +311,14 @@ struct xfs_log_item_desc; struct xfs_mount; struct xfs_trans; struct xfs_dquot_acct; +struct xfs_busy_extent; typedef struct xfs_log_item { struct list_head li_ail; /* AIL pointers */ xfs_lsn_t li_lsn; /* last on-disk lsn */ struct xfs_log_item_desc *li_desc; /* ptr to current desc*/ struct xfs_mount *li_mountp; /* ptr to fs mount */ + struct xfs_ail *li_ailp; /* ptr to AIL */ uint li_type; /* item type */ uint li_flags; /* misc flags */ struct xfs_log_item *li_bio_list; /* buffer item list */ @@ -776,17 +327,25 @@ typedef struct xfs_log_item { /* buffer item iodone */ /* callback func */ struct xfs_item_ops *li_ops; /* function list */ + + /* delayed logging */ + struct list_head li_cil; /* CIL pointers */ + struct xfs_log_vec *li_lv; /* active log vector */ + xfs_lsn_t li_seq; /* CIL commit seq */ } xfs_log_item_t; #define XFS_LI_IN_AIL 0x1 #define XFS_LI_ABORTED 0x2 +#define XFS_LI_FLAGS \ + { XFS_LI_IN_AIL, "IN_AIL" }, \ + { XFS_LI_ABORTED, "ABORTED" } + typedef struct xfs_item_ops { uint (*iop_size)(xfs_log_item_t *); void (*iop_format)(xfs_log_item_t *, struct xfs_log_iovec *); void (*iop_pin)(xfs_log_item_t *); - void (*iop_unpin)(xfs_log_item_t *, int); - void (*iop_unpin_remove)(xfs_log_item_t *, struct xfs_trans *); + void (*iop_unpin)(xfs_log_item_t *, int remove); uint (*iop_trylock)(xfs_log_item_t *); void (*iop_unlock)(xfs_log_item_t *); xfs_lsn_t (*iop_committed)(xfs_log_item_t *, xfs_lsn_t); @@ -798,8 +357,7 @@ typedef struct xfs_item_ops { #define IOP_SIZE(ip) (*(ip)->li_ops->iop_size)(ip) #define IOP_FORMAT(ip,vp) (*(ip)->li_ops->iop_format)(ip, vp) #define IOP_PIN(ip) (*(ip)->li_ops->iop_pin)(ip) -#define IOP_UNPIN(ip, flags) (*(ip)->li_ops->iop_unpin)(ip, flags) -#define IOP_UNPIN_REMOVE(ip,tp) (*(ip)->li_ops->iop_unpin_remove)(ip, tp) +#define IOP_UNPIN(ip, remove) (*(ip)->li_ops->iop_unpin)(ip, remove) #define IOP_TRYLOCK(ip) (*(ip)->li_ops->iop_trylock)(ip) #define IOP_UNLOCK(ip) (*(ip)->li_ops->iop_unlock)(ip) #define IOP_COMMITTED(ip, lsn) (*(ip)->li_ops->iop_committed)(ip, lsn) @@ -813,36 +371,7 @@ typedef struct xfs_item_ops { #define XFS_ITEM_SUCCESS 0 #define XFS_ITEM_PINNED 1 #define XFS_ITEM_LOCKED 2 -#define XFS_ITEM_FLUSHING 3 -#define XFS_ITEM_PUSHBUF 4 - -/* - * This structure is used to maintain a list of block ranges that have been - * freed in the transaction. The ranges are listed in the perag[] busy list - * between when they're freed and the transaction is committed to disk. - */ - -typedef struct xfs_log_busy_slot { - xfs_agnumber_t lbc_ag; - ushort lbc_idx; /* index in perag.busy[] */ -} xfs_log_busy_slot_t; - -#define XFS_LBC_NUM_SLOTS 31 -typedef struct xfs_log_busy_chunk { - struct xfs_log_busy_chunk *lbc_next; - uint lbc_free; /* free slots bitmask */ - ushort lbc_unused; /* first unused */ - xfs_log_busy_slot_t lbc_busy[XFS_LBC_NUM_SLOTS]; -} xfs_log_busy_chunk_t; - -#define XFS_LBC_MAX_SLOT (XFS_LBC_NUM_SLOTS - 1) -#define XFS_LBC_FREEMASK ((1U << XFS_LBC_NUM_SLOTS) - 1) - -#define XFS_LBC_INIT(cp) ((cp)->lbc_free = XFS_LBC_FREEMASK) -#define XFS_LBC_CLAIM(cp, slot) ((cp)->lbc_free &= ~(1 << (slot))) -#define XFS_LBC_SLOT(cp, slot) (&((cp)->lbc_busy[(slot)])) -#define XFS_LBC_VACANCY(cp) (((cp)->lbc_free) & XFS_LBC_FREEMASK) -#define XFS_LBC_ISFREE(cp, slot) ((cp)->lbc_free & (1 << (slot))) +#define XFS_ITEM_PUSHBUF 3 /* * This is the type of function which can be given to xfs_trans_callback() @@ -863,15 +392,13 @@ typedef struct xfs_trans { unsigned int t_blk_res_used; /* # of resvd blocks used */ unsigned int t_rtx_res; /* # of rt extents resvd */ unsigned int t_rtx_res_used; /* # of resvd rt extents used */ - xfs_log_ticket_t t_ticket; /* log mgr ticket */ + struct xlog_ticket *t_ticket; /* log mgr ticket */ xfs_lsn_t t_lsn; /* log seq num of start of * transaction. */ xfs_lsn_t t_commit_lsn; /* log seq num of end of * transaction. */ struct xfs_mount *t_mountp; /* ptr to fs mount struct */ struct xfs_dquot_acct *t_dqinfo; /* acctg info for dquots */ - xfs_trans_callback_t t_callback; /* transaction callback */ - void *t_callarg; /* callback arg */ unsigned int t_flags; /* misc flags */ int64_t t_icount_delta; /* superblock icount change */ int64_t t_ifree_delta; /* superblock ifree change */ @@ -892,11 +419,9 @@ typedef struct xfs_trans { int64_t t_rblocks_delta;/* superblock rblocks change */ int64_t t_rextents_delta;/* superblocks rextents chg */ int64_t t_rextslog_delta;/* superblocks rextslog chg */ - unsigned int t_items_free; /* log item descs free */ - xfs_log_item_chunk_t t_items; /* first log item desc chunk */ + struct list_head t_items; /* log item descriptors */ xfs_trans_header_t t_header; /* header for in-log trans */ - unsigned int t_busy_free; /* busy descs free */ - xfs_log_busy_chunk_t t_busy; /* busy/async free blocks */ + struct list_head t_busy; /* list of busy extents */ unsigned long t_pflags; /* saved process flags state */ } xfs_trans_t; @@ -923,7 +448,7 @@ typedef struct xfs_trans { * XFS transaction mechanism exported interfaces. */ xfs_trans_t *xfs_trans_alloc(struct xfs_mount *, uint); -xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint); +xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint, uint); xfs_trans_t *xfs_trans_dup(xfs_trans_t *); int xfs_trans_reserve(xfs_trans_t *, uint, uint, uint, uint, uint); @@ -946,8 +471,9 @@ void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint); void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); int xfs_trans_iget(struct xfs_mount *, xfs_trans_t *, xfs_ino_t , uint, uint, struct xfs_inode **); -void xfs_trans_ijoin(xfs_trans_t *, struct xfs_inode *, uint); -void xfs_trans_ihold(xfs_trans_t *, struct xfs_inode *); +void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); +void xfs_trans_ijoin_ref(struct xfs_trans *, struct xfs_inode *, uint); +void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); struct xfs_efi_log_item *xfs_trans_get_efi(xfs_trans_t *, uint); @@ -970,15 +496,9 @@ int _xfs_trans_commit(xfs_trans_t *, void xfs_trans_cancel(xfs_trans_t *, int); int xfs_trans_ail_init(struct xfs_mount *); void xfs_trans_ail_destroy(struct xfs_mount *); -void xfs_trans_push_ail(struct xfs_mount *, xfs_lsn_t); -xfs_lsn_t xfs_trans_tail_ail(struct xfs_mount *); -void xfs_trans_unlocked_item(struct xfs_mount *, - xfs_log_item_t *); -xfs_log_busy_slot_t *xfs_trans_add_busy(xfs_trans_t *tp, - xfs_agnumber_t ag, - xfs_extlen_t idx); extern kmem_zone_t *xfs_trans_zone; +extern kmem_zone_t *xfs_log_item_desc_zone; #endif /* __KERNEL__ */ diff --git a/include/xfs_trans_space.h b/include/xfs_trans_space.h index 4ea2e50..7d2c920 100644 --- a/include/xfs_trans_space.h +++ b/include/xfs_trans_space.h @@ -47,7 +47,7 @@ #define XFS_DIRREMOVE_SPACE_RES(mp) \ XFS_DAREMOVE_SPACE_RES(mp, XFS_DATA_FORK) #define XFS_IALLOC_SPACE_RES(mp) \ - (XFS_IALLOC_BLOCKS(mp) + XFS_IN_MAXLEVELS(mp)-1) + (XFS_IALLOC_BLOCKS(mp) + (mp)->m_in_maxlevels - 1) /* * Space reservation values for various transactions. diff --git a/include/xfs_types.h b/include/xfs_types.h index 228b948..26d1867 100644 --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -21,14 +21,6 @@ #ifdef __KERNEL__ /* - * POSIX Extensions - */ -typedef unsigned char uchar_t; -typedef unsigned short ushort_t; -typedef unsigned int uint_t; -typedef unsigned long ulong_t; - -/* * Additional type declarations for XFS */ typedef signed char __int8_t; @@ -45,7 +37,7 @@ typedef __uint32_t prid_t; /* project ID */ typedef __uint32_t inst_t; /* an instruction */ typedef __s64 xfs_off_t; /* type */ -typedef __u64 xfs_ino_t; /* type */ +typedef unsigned long long xfs_ino_t; /* type */ typedef __s64 xfs_daddr_t; /* type */ typedef char * xfs_caddr_t; /* type */ typedef __u32 xfs_dev_t; @@ -81,6 +73,8 @@ typedef __int32_t xfs_tid_t; /* transaction identifier */ typedef __uint32_t xfs_dablk_t; /* dir/attr block number (in file) */ typedef __uint32_t xfs_dahash_t; /* dir/attr hash value */ +typedef __uint32_t xlog_tid_t; /* transaction ID type */ + /* * These types are 64 bits on disk but are either 32 or 64 bits in memory. * Disk based types: @@ -109,8 +103,6 @@ typedef __uint64_t xfs_fileoff_t; /* block number in a file */ typedef __int64_t xfs_sfiloff_t; /* signed block number in a file */ typedef __uint64_t xfs_filblks_t; /* number of blocks in a file */ -typedef __uint8_t xfs_arch_t; /* architecture of an xfs fs */ - /* * Null values for the types. */ @@ -159,8 +151,8 @@ typedef enum { } xfs_btnum_t; struct xfs_name { - const char *name; - int len; + const unsigned char *name; + int len; }; #endif /* __XFS_TYPES_H__ */ diff --git a/libxfs/Makefile b/libxfs/Makefile index 990cbf7..dcff031 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -11,7 +11,7 @@ LT_REVISION = 0 LT_AGE = 0 HFILES = xfs.h init.h -CFILES = cache.c init.c kmem.c logitem.c rdwr.c trans.c util.c \ +CFILES = cache.c init.c kmem.c logitem.c rdwr.c radix-tree.c trans.c util.c \ xfs_alloc.c xfs_ialloc.c xfs_inode.c xfs_btree.c xfs_alloc_btree.c \ xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c \ xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c \ diff --git a/libxfs/init.c b/libxfs/init.c index 75d043e..d59308d 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -374,6 +374,7 @@ manage_zones(int release) extern kmem_zone_t *xfs_da_state_zone; extern kmem_zone_t *xfs_btree_cur_zone; extern kmem_zone_t *xfs_bmap_free_item_zone; + extern kmem_zone_t *xfs_log_item_desc_zone; extern void xfs_dir_startup(); if (release) { /* free zone allocation */ @@ -385,6 +386,7 @@ manage_zones(int release) kmem_free(xfs_da_state_zone); kmem_free(xfs_btree_cur_zone); kmem_free(xfs_bmap_free_item_zone); + kmem_free(xfs_log_item_desc_zone); return; } /* otherwise initialise zone allocation */ @@ -402,6 +404,8 @@ manage_zones(int release) sizeof(xfs_btree_cur_t), "xfs_btree_cur"); xfs_bmap_free_item_zone = kmem_zone_init( sizeof(xfs_bmap_free_item_t), "xfs_bmap_free_item"); + xfs_log_item_desc_zone = kmem_zone_init( + sizeof(struct xfs_log_item_desc), "xfs_log_item_desc"); xfs_dir_startup(); } @@ -509,6 +513,109 @@ libxfs_dirv1_mount( mp->m_dirblkfsbs = 1; } +static int +libxfs_initialize_perag( + xfs_mount_t *mp, + xfs_agnumber_t agcount, + xfs_agnumber_t *maxagi) +{ + xfs_agnumber_t index, max_metadata; + xfs_agnumber_t first_initialised = 0; + xfs_perag_t *pag; + xfs_agino_t agino; + xfs_ino_t ino; + xfs_sb_t *sbp = &mp->m_sb; + int error = -ENOMEM; + + /* + * Walk the current per-ag tree so we don't try to initialise AGs + * that already exist (growfs case). Allocate and insert all the + * AGs we don't find ready for initialisation. + */ + for (index = 0; index < agcount; index++) { + pag = xfs_perag_get(mp, index); + if (pag) { + xfs_perag_put(pag); + continue; + } + if (!first_initialised) + first_initialised = index; + + pag = kmem_zalloc(sizeof(*pag), KM_MAYFAIL); + if (!pag) + goto out_unwind; + pag->pag_agno = index; + pag->pag_mount = mp; + + if (radix_tree_insert(&mp->m_perag_tree, index, pag)) { + error = -EEXIST; + goto out_unwind; + } + } + + /* + * If we mount with the inode64 option, or no inode overflows + * the legacy 32-bit address space clear the inode32 option. + */ + agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks - 1, 0); + ino = XFS_AGINO_TO_INO(mp, agcount - 1, agino); + + if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) && ino > XFS_MAXINUMBER_32) + mp->m_flags |= XFS_MOUNT_32BITINODES; + else + mp->m_flags &= ~XFS_MOUNT_32BITINODES; + + if (mp->m_flags & XFS_MOUNT_32BITINODES) { + /* + * Calculate how much should be reserved for inodes to meet + * the max inode percentage. + */ + if (mp->m_maxicount) { + __uint64_t icount; + + icount = sbp->sb_dblocks * sbp->sb_imax_pct; + do_div(icount, 100); + icount += sbp->sb_agblocks - 1; + do_div(icount, sbp->sb_agblocks); + max_metadata = icount; + } else { + max_metadata = agcount; + } + + for (index = 0; index < agcount; index++) { + ino = XFS_AGINO_TO_INO(mp, index, agino); + if (ino > XFS_MAXINUMBER_32) { + index++; + break; + } + + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 1; + if (index < max_metadata) + pag->pagf_metadata = 1; + xfs_perag_put(pag); + } + } else { + for (index = 0; index < agcount; index++) { + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 1; + xfs_perag_put(pag); + } + } + + if (maxagi) + *maxagi = index; + return 0; + +out_unwind: + kmem_free(pag); + for (; index > first_initialised; index--) { + pag = radix_tree_delete(&mp->m_perag_tree, index); + kmem_free(pag); + } + return error; +} + /* * Mount structure initialization, provides a filled-in xfs_mount_t * such that the numerous XFS_* macros can be used. If dev is zero, @@ -526,7 +633,6 @@ libxfs_mount( xfs_daddr_t d; xfs_buf_t *bp; xfs_sb_t *sbp; - size_t size; int error; mp->m_dev = dev; @@ -534,6 +640,7 @@ libxfs_mount( mp->m_logdev = logdev; mp->m_flags = (LIBXFS_MOUNT_32BITINODES|LIBXFS_MOUNT_32BITINOOPT); mp->m_sb = *sb; + INIT_RADIX_TREE(&mp->m_perag_tree, GFP_KERNEL); sbp = &(mp->m_sb); xfs_mount_common(mp, sb); @@ -645,16 +752,13 @@ libxfs_mount( return NULL; } - /* Allocate and initialize the per-ag data */ - size = sbp->sb_agcount * sizeof(xfs_perag_t); - if (size && (mp->m_perag = calloc(size, 1)) == NULL) { - fprintf(stderr, _("%s: failed to alloc %ld bytes: %s\n"), - progname, (long)size, strerror(errno)); + error = libxfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi); + if (error) { + fprintf(stderr, _("%s: perag init failed\n"), + progname); exit(1); } - mp->m_maxagi = xfs_initialize_perag(mp, sbp->sb_agcount); - /* * mkfs calls mount before the root inode is allocated. */ @@ -707,17 +811,16 @@ libxfs_rtmount_destroy(xfs_mount_t *mp) void libxfs_umount(xfs_mount_t *mp) { + struct xfs_perag *pag; + int agno; + libxfs_rtmount_destroy(mp); libxfs_icache_purge(); libxfs_bcache_purge(); - if (mp->m_perag) { - int agno; - for (agno = 0; agno < mp->m_maxagi; agno++) { - if (mp->m_perag[agno].pagb_list) - free(mp->m_perag[agno].pagb_list); - } - free(mp->m_perag); + for (agno = 0; agno < mp->m_maxagi; agno++) { + pag = radix_tree_delete(&mp->m_perag_tree, agno); + kmem_free(pag); } } diff --git a/libxfs/logitem.c b/libxfs/logitem.c index d6ef10b..0f2c14b 100644 --- a/libxfs/logitem.c +++ b/libxfs/logitem.c @@ -26,215 +26,6 @@ kmem_zone_t *xfs_ili_zone; /* inode log item zone */ */ /* - * This is called to add the given log item to the transaction's - * list of log items. It must find a free log item descriptor - * or allocate a new one and add the item to that descriptor. - * The function returns a pointer to item descriptor used to point - * to the new item. The log item will now point to its new descriptor - * with its li_desc field. - */ -xfs_log_item_desc_t * -xfs_trans_add_item( - xfs_trans_t *tp, - xfs_log_item_t *lip) -{ - xfs_log_item_desc_t *lidp; - xfs_log_item_chunk_t *licp; - int i = 0; - - /* - * If there are no free descriptors, allocate a new chunk - * of them and put it at the front of the chunk list. - */ - if (tp->t_items_free == 0) { - licp = (xfs_log_item_chunk_t*) - kmem_alloc(sizeof(xfs_log_item_chunk_t), KM_SLEEP); - ASSERT(licp != NULL); - /* - * Initialize the chunk, and then - * claim the first slot in the newly allocated chunk. - */ - xfs_lic_init(licp); - xfs_lic_claim(licp, 0); - licp->lic_unused = 1; - xfs_lic_init_slot(licp, 0); - lidp = xfs_lic_slot(licp, 0); - - /* - * Link in the new chunk and update the free count. - */ - licp->lic_next = tp->t_items.lic_next; - tp->t_items.lic_next = licp; - tp->t_items_free = XFS_LIC_NUM_SLOTS - 1; - - /* - * Initialize the descriptor and the generic portion - * of the log item. - * - * Point the new slot at this item and return it. - * Also point the log item at its currently active - * descriptor and set the item's mount pointer. - */ - lidp->lid_item = lip; - lidp->lid_flags = 0; - lidp->lid_size = 0; - lip->li_desc = lidp; - lip->li_mountp = tp->t_mountp; - return lidp; - } - - /* - * Find the free descriptor. It is somewhere in the chunklist - * of descriptors. - */ - licp = &tp->t_items; - while (licp != NULL) { - if (xfs_lic_vacancy(licp)) { - if (licp->lic_unused <= XFS_LIC_MAX_SLOT) { - i = licp->lic_unused; - ASSERT(xfs_lic_isfree(licp, i)); - break; - } - for (i = 0; i <= XFS_LIC_MAX_SLOT; i++) { - if (xfs_lic_isfree(licp, i)) - break; - } - ASSERT(i <= XFS_LIC_MAX_SLOT); - break; - } - licp = licp->lic_next; - } - ASSERT(licp != NULL); - /* - * If we find a free descriptor, claim it, - * initialize it, and return it. - */ - xfs_lic_claim(licp, i); - if (licp->lic_unused <= i) { - licp->lic_unused = i + 1; - xfs_lic_init_slot(licp, i); - } - lidp = xfs_lic_slot(licp, i); - tp->t_items_free--; - lidp->lid_item = lip; - lidp->lid_flags = 0; - lidp->lid_size = 0; - lip->li_desc = lidp; - lip->li_mountp = tp->t_mountp; - return lidp; -} - -/* - * Free the given descriptor. - * - * This requires setting the bit in the chunk's free mask corresponding - * to the given slot. - */ -void -xfs_trans_free_item( - xfs_trans_t *tp, - xfs_log_item_desc_t *lidp) -{ - uint slot; - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t **licpp; - - slot = xfs_lic_desc_to_slot(lidp); - licp = xfs_lic_desc_to_chunk(lidp); - xfs_lic_relse(licp, slot); - lidp->lid_item->li_desc = NULL; - tp->t_items_free++; - - /* - * If there are no more used items in the chunk and this is not - * the chunk embedded in the transaction structure, then free - * the chunk. First pull it from the chunk list and then - * free it back to the heap. We didn't bother with a doubly - * linked list here because the lists should be very short - * and this is not a performance path. It's better to save - * the memory of the extra pointer. - * - * Also decrement the transaction structure's count of free items - * by the number in a chunk since we are freeing an empty chunk. - */ - if (xfs_lic_are_all_free(licp) && (licp != &(tp->t_items))) { - licpp = &(tp->t_items.lic_next); - while (*licpp != licp) { - ASSERT(*licpp != NULL); - licpp = &((*licpp)->lic_next); - } - *licpp = licp->lic_next; - kmem_free(licp); - tp->t_items_free -= XFS_LIC_NUM_SLOTS; - } -} - -/* - * This is called to find the descriptor corresponding to the given - * log item. It returns a pointer to the descriptor. - * The log item MUST have a corresponding descriptor in the given - * transaction. This routine does not return NULL, it panics. - * - * The descriptor pointer is kept in the log item's li_desc field. - * Just return it. - */ -xfs_log_item_desc_t * -xfs_trans_find_item( - xfs_trans_t *tp, - xfs_log_item_t *lip) -{ - ASSERT(lip->li_desc != NULL); - - return lip->li_desc; -} - -/* - * This is called to unlock all of the items of a transaction and to free - * all the descriptors of that transaction. - * - * It walks the list of descriptors and unlocks each item. It frees - * each chunk except that embedded in the transaction as it goes along. - */ -void -xfs_trans_free_items( - xfs_trans_t *tp, - int flags) -{ - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t *next_licp; - int abort; - - abort = flags & XFS_TRANS_ABORT; - licp = &tp->t_items; - /* - * Special case the embedded chunk so we don't free it below. - */ - if (!xfs_lic_are_all_free(licp)) { - (void) xfs_trans_unlock_chunk(licp, 1, abort, NULLCOMMITLSN); - xfs_lic_all_free(licp); - licp->lic_unused = 0; - } - licp = licp->lic_next; - - /* - * Unlock each item in each chunk and free the chunks. - */ - while (licp != NULL) { - ASSERT(!xfs_lic_are_all_free(licp)); - (void) xfs_trans_unlock_chunk(licp, 1, abort, NULLCOMMITLSN); - next_licp = licp->lic_next; - kmem_free(licp); - licp = next_licp; - } - - /* - * Reset the transaction structure's free item count. - */ - tp->t_items_free = XFS_LIC_NUM_SLOTS; - tp->t_items.lic_next = NULL; -} - -/* * Following functions from fs/xfs/xfs_trans_buf.c */ @@ -250,149 +41,21 @@ xfs_trans_buf_item_match( xfs_daddr_t blkno, int len) { - xfs_log_item_chunk_t *licp; - xfs_log_item_desc_t *lidp; - xfs_buf_log_item_t *blip; - xfs_buf_t *bp; - int i; - -#ifdef LI_DEBUG - fprintf(stderr, "buf_item_match (fast) log items for xact %p\n", tp); -#endif - - bp = NULL; - len = BBTOB(len); - licp = &tp->t_items; - if (!xfs_lic_are_all_free(licp)) { - for (i = 0; i < licp->lic_unused; i++) { - /* - * Skip unoccupied slots. - */ - if (xfs_lic_isfree(licp, i)) { - continue; - } - - lidp = xfs_lic_slot(licp, i); - blip = (xfs_buf_log_item_t *)lidp->lid_item; -#ifdef LI_DEBUG - fprintf(stderr, - "\tfound log item, xact %p, blip=%p (%d/%d)\n", - tp, blip, i, licp->lic_unused); -#endif - if (blip->bli_item.li_type != XFS_LI_BUF) { - continue; - } - - bp = blip->bli_buf; -#ifdef LI_DEBUG - fprintf(stderr, - "\tfound buf %p log item, xact %p, blip=%p (%d)\n", - bp, tp, blip, i); -#endif - if ((XFS_BUF_TARGET(bp) == target->dev) && - (XFS_BUF_ADDR(bp) == blkno) && - (XFS_BUF_COUNT(bp) == len)) { - /* - * We found it. Break out and - * return the pointer to the buffer. - */ -#ifdef LI_DEBUG - fprintf(stderr, - "\tfound REAL buf log item, bp=%p\n", - bp); -#endif - break; - } else { - bp = NULL; - } - } - } -#ifdef LI_DEBUG - if (!bp) fprintf(stderr, "\tfast search - got nothing\n"); -#endif - return bp; + struct xfs_log_item_desc *lidp; + struct xfs_buf_log_item *blip; + + len = BBTOB(len); + list_for_each_entry(lidp, &tp->t_items, lid_trans) { + blip = (struct xfs_buf_log_item *)lidp->lid_item; + if (blip->bli_item.li_type == XFS_LI_BUF && + XFS_BUF_TARGET(blip->bli_buf) == target->dev && + XFS_BUF_ADDR(blip->bli_buf) == blkno && + XFS_BUF_COUNT(blip->bli_buf) == len) + return blip->bli_buf; + } + + return NULL; } - -/* - * Check to see if a buffer matching the given parameters is already - * a part of the given transaction. Check all the chunks, we - * want to be thorough. - */ -xfs_buf_t * -xfs_trans_buf_item_match_all( - xfs_trans_t *tp, - xfs_buftarg_t *target, - xfs_daddr_t blkno, - int len) -{ - xfs_log_item_chunk_t *licp; - xfs_log_item_desc_t *lidp; - xfs_buf_log_item_t *blip; - xfs_buf_t *bp; - int i; - -#ifdef LI_DEBUG - fprintf(stderr, "buf_item_match_all (slow) log items for xact %p\n", - tp); -#endif - - bp = NULL; - len = BBTOB(len); - for (licp = &tp->t_items; licp != NULL; licp = licp->lic_next) { - if (xfs_lic_are_all_free(licp)) { - ASSERT(licp == &tp->t_items); - ASSERT(licp->lic_next == NULL); - return NULL; - } - for (i = 0; i < licp->lic_unused; i++) { - /* - * Skip unoccupied slots. - */ - if (xfs_lic_isfree(licp, i)) { - continue; - } - - lidp = xfs_lic_slot(licp, i); - blip = (xfs_buf_log_item_t *)lidp->lid_item; -#ifdef LI_DEBUG - fprintf(stderr, - "\tfound log item, xact %p, blip=%p (%d/%d)\n", - tp, blip, i, licp->lic_unused); -#endif - if (blip->bli_item.li_type != XFS_LI_BUF) { - continue; - } - - bp = blip->bli_buf; - ASSERT(bp); - ASSERT(XFS_BUF_ADDR(bp)); -#ifdef LI_DEBUG - fprintf(stderr, - "\tfound buf %p log item, xact %p, blip=%p (%d)\n", - bp, tp, blip, i); -#endif - if ((XFS_BUF_TARGET(bp) == target->dev) && - (XFS_BUF_ADDR(bp) == blkno) && - (XFS_BUF_COUNT(bp) == len)) { - /* - * We found it. Break out and - * return the pointer to the buffer. - */ -#ifdef LI_DEBUG - fprintf(stderr, - "\tfound REAL buf log item, bp=%p\n", - bp); -#endif - return bp; - } - } - } -#ifdef LI_DEBUG - if (!bp) fprintf(stderr, "slow search - got nothing\n"); -#endif - return NULL; -} - /* * The following are from fs/xfs/xfs_buf_item.c */ @@ -493,7 +156,7 @@ xfs_inode_item_init( iip->ili_inode = ip; iip->ili_format.ilf_type = XFS_LI_INODE; iip->ili_format.ilf_ino = ip->i_ino; - iip->ili_format.ilf_blkno = ip->i_blkno; - iip->ili_format.ilf_len = ip->i_len; - iip->ili_format.ilf_boffset = ip->i_boffset; + iip->ili_format.ilf_blkno = ip->i_imap.im_blkno; + iip->ili_format.ilf_len = ip->i_imap.im_len; + iip->ili_format.ilf_boffset = ip->i_imap.im_boffset; } diff --git a/libxfs/radix-tree.c b/libxfs/radix-tree.c new file mode 100644 index 0000000..36a6324 --- /dev/null +++ b/libxfs/radix-tree.c @@ -0,0 +1,805 @@ +/* + * Copyright (C) 2001 Momchil Velikov + * Portions Copyright (C) 2001 Christoph Hellwig + * Copyright (C) 2005 SGI, Christoph Lameter + * + * 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, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include "radix-tree.h" + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif + +#define RADIX_TREE_MAP_SHIFT 6 +#define RADIX_TREE_MAP_SIZE (1UL << RADIX_TREE_MAP_SHIFT) +#define RADIX_TREE_MAP_MASK (RADIX_TREE_MAP_SIZE-1) + +#ifdef RADIX_TREE_TAGS +#define RADIX_TREE_TAG_LONGS \ + ((RADIX_TREE_MAP_SIZE + BITS_PER_LONG - 1) / BITS_PER_LONG) +#endif + +struct radix_tree_node { + unsigned int count; + void *slots[RADIX_TREE_MAP_SIZE]; +#ifdef RADIX_TREE_TAGS + unsigned long tags[RADIX_TREE_MAX_TAGS][RADIX_TREE_TAG_LONGS]; +#endif +}; + +struct radix_tree_path { + struct radix_tree_node *node; + int offset; +}; + +#define RADIX_TREE_INDEX_BITS (8 /* CHAR_BIT */ * sizeof(unsigned long)) +#define RADIX_TREE_MAX_PATH (RADIX_TREE_INDEX_BITS/RADIX_TREE_MAP_SHIFT + 2) + +static unsigned long height_to_maxindex[RADIX_TREE_MAX_PATH]; + +/* + * Radix tree node cache. + */ + +#define radix_tree_node_alloc(r) ((struct radix_tree_node *) \ + calloc(1, sizeof(struct radix_tree_node))) +#define radix_tree_node_free(n) free(n) + +#ifdef RADIX_TREE_TAGS + +static inline void tag_set(struct radix_tree_node *node, unsigned int tag, + int offset) +{ + *((__uint32_t *)node->tags[tag] + (offset >> 5)) |= (1 << (offset & 31)); +} + +static inline void tag_clear(struct radix_tree_node *node, unsigned int tag, + int offset) +{ + __uint32_t *p = (__uint32_t*)node->tags[tag] + (offset >> 5); + __uint32_t m = 1 << (offset & 31); + *p &= ~m; +} + +static inline int tag_get(struct radix_tree_node *node, unsigned int tag, + int offset) +{ + return 1 & (((const __uint32_t *)node->tags[tag])[offset >> 5] >> (offset & 31)); +} + +/* + * Returns 1 if any slot in the node has this tag set. + * Otherwise returns 0. + */ +static inline int any_tag_set(struct radix_tree_node *node, unsigned int tag) +{ + int idx; + for (idx = 0; idx < RADIX_TREE_TAG_LONGS; idx++) { + if (node->tags[tag][idx]) + return 1; + } + return 0; +} + +#endif + +/* + * Return the maximum key which can be store into a + * radix tree with height HEIGHT. + */ +static inline unsigned long radix_tree_maxindex(unsigned int height) +{ + return height_to_maxindex[height]; +} + +/* + * Extend a radix tree so it can store key @index. + */ +static int radix_tree_extend(struct radix_tree_root *root, unsigned long index) +{ + struct radix_tree_node *node; + unsigned int height; +#ifdef RADIX_TREE_TAGS + char tags[RADIX_TREE_MAX_TAGS]; + int tag; +#endif + + /* Figure out what the height should be. */ + height = root->height + 1; + while (index > radix_tree_maxindex(height)) + height++; + + if (root->rnode == NULL) { + root->height = height; + goto out; + } + +#ifdef RADIX_TREE_TAGS + /* + * Prepare the tag status of the top-level node for propagation + * into the newly-pushed top-level node(s) + */ + for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { + tags[tag] = 0; + if (any_tag_set(root->rnode, tag)) + tags[tag] = 1; + } +#endif + do { + if (!(node = radix_tree_node_alloc(root))) + return -ENOMEM; + + /* Increase the height. */ + node->slots[0] = root->rnode; + +#ifdef RADIX_TREE_TAGS + /* Propagate the aggregated tag info into the new root */ + for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { + if (tags[tag]) + tag_set(node, tag, 0); + } +#endif + node->count = 1; + root->rnode = node; + root->height++; + } while (height > root->height); +out: + return 0; +} + +/** + * radix_tree_insert - insert into a radix tree + * @root: radix tree root + * @index: index key + * @item: item to insert + * + * Insert an item into the radix tree at position @index. + */ +int radix_tree_insert(struct radix_tree_root *root, + unsigned long index, void *item) +{ + struct radix_tree_node *node = NULL, *slot; + unsigned int height, shift; + int offset; + int error; + + /* Make sure the tree is high enough. */ + if ((!index && !root->rnode) || + index > radix_tree_maxindex(root->height)) { + error = radix_tree_extend(root, index); + if (error) + return error; + } + + slot = root->rnode; + height = root->height; + shift = (height-1) * RADIX_TREE_MAP_SHIFT; + + offset = 0; /* uninitialised var warning */ + do { + if (slot == NULL) { + /* Have to add a child node. */ + if (!(slot = radix_tree_node_alloc(root))) + return -ENOMEM; + if (node) { + node->slots[offset] = slot; + node->count++; + } else + root->rnode = slot; + } + + /* Go a level down */ + offset = (index >> shift) & RADIX_TREE_MAP_MASK; + node = slot; + slot = node->slots[offset]; + shift -= RADIX_TREE_MAP_SHIFT; + height--; + } while (height > 0); + + if (slot != NULL) + return -EEXIST; + + ASSERT(node); + node->count++; + node->slots[offset] = item; +#ifdef RADIX_TREE_TAGS + ASSERT(!tag_get(node, 0, offset)); + ASSERT(!tag_get(node, 1, offset)); +#endif + return 0; +} + +static inline void **__lookup_slot(struct radix_tree_root *root, + unsigned long index) +{ + unsigned int height, shift; + struct radix_tree_node **slot; + + height = root->height; + if (index > radix_tree_maxindex(height)) + return NULL; + + shift = (height-1) * RADIX_TREE_MAP_SHIFT; + slot = &root->rnode; + + while (height > 0) { + if (*slot == NULL) + return NULL; + + slot = (struct radix_tree_node **) + ((*slot)->slots + + ((index >> shift) & RADIX_TREE_MAP_MASK)); + shift -= RADIX_TREE_MAP_SHIFT; + height--; + } + + return (void **)slot; +} + +/** + * radix_tree_lookup_slot - lookup a slot in a radix tree + * @root: radix tree root + * @index: index key + * + * Lookup the slot corresponding to the position @index in the radix tree + * @root. This is useful for update-if-exists operations. + */ +void **radix_tree_lookup_slot(struct radix_tree_root *root, unsigned long index) +{ + return __lookup_slot(root, index); +} + +/** + * radix_tree_lookup - perform lookup operation on a radix tree + * @root: radix tree root + * @index: index key + * + * Lookup the item at the position @index in the radix tree @root. + */ +void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index) +{ + void **slot; + + slot = __lookup_slot(root, index); + return slot != NULL ? *slot : NULL; +} + +/** + * raid_tree_first_key - find the first index key in the radix tree + * @root: radix tree root + * @index: where the first index will be placed + * + * Returns the first entry and index key in the radix tree @root. + */ +void *radix_tree_lookup_first(struct radix_tree_root *root, unsigned long *index) +{ + unsigned int height, shift; + struct radix_tree_node *slot; + unsigned long i; + + height = root->height; + *index = 0; + if (height == 0) + return NULL; + + shift = (height-1) * RADIX_TREE_MAP_SHIFT; + slot = root->rnode; + + for (; height > 1; height--) { + for (i = 0; i < RADIX_TREE_MAP_SIZE; i++) { + if (slot->slots[i] != NULL) + break; + } + ASSERT(i < RADIX_TREE_MAP_SIZE); + + *index |= (i << shift); + shift -= RADIX_TREE_MAP_SHIFT; + slot = slot->slots[i]; + } + for (i = 0; i < RADIX_TREE_MAP_SIZE; i++) { + if (slot->slots[i] != NULL) { + *index |= i; + return slot->slots[i]; + } + } + return NULL; +} + +#ifdef RADIX_TREE_TAGS + +/** + * radix_tree_tag_set - set a tag on a radix tree node + * @root: radix tree root + * @index: index key + * @tag: tag index + * + * Set the search tag (which must be < RADIX_TREE_MAX_TAGS) + * corresponding to @index in the radix tree. From + * the root all the way down to the leaf node. + * + * Returns the address of the tagged item. Setting a tag on a not-present + * item is a bug. + */ +void *radix_tree_tag_set(struct radix_tree_root *root, + unsigned long index, unsigned int tag) +{ + unsigned int height, shift; + struct radix_tree_node *slot; + + height = root->height; + if (index > radix_tree_maxindex(height)) + return NULL; + + shift = (height - 1) * RADIX_TREE_MAP_SHIFT; + slot = root->rnode; + + while (height > 0) { + int offset; + + offset = (index >> shift) & RADIX_TREE_MAP_MASK; + if (!tag_get(slot, tag, offset)) + tag_set(slot, tag, offset); + slot = slot->slots[offset]; + ASSERT(slot != NULL); + shift -= RADIX_TREE_MAP_SHIFT; + height--; + } + + return slot; +} + +/** + * radix_tree_tag_clear - clear a tag on a radix tree node + * @root: radix tree root + * @index: index key + * @tag: tag index + * + * Clear the search tag (which must be < RADIX_TREE_MAX_TAGS) + * corresponding to @index in the radix tree. If + * this causes the leaf node to have no tags set then clear the tag in the + * next-to-leaf node, etc. + * + * Returns the address of the tagged item on success, else NULL. ie: + * has the same return value and semantics as radix_tree_lookup(). + */ +void *radix_tree_tag_clear(struct radix_tree_root *root, + unsigned long index, unsigned int tag) +{ + struct radix_tree_path path[RADIX_TREE_MAX_PATH], *pathp = path; + struct radix_tree_node *slot; + unsigned int height, shift; + void *ret = NULL; + + height = root->height; + if (index > radix_tree_maxindex(height)) + goto out; + + shift = (height - 1) * RADIX_TREE_MAP_SHIFT; + pathp->node = NULL; + slot = root->rnode; + + while (height > 0) { + int offset; + + if (slot == NULL) + goto out; + + offset = (index >> shift) & RADIX_TREE_MAP_MASK; + pathp[1].offset = offset; + pathp[1].node = slot; + slot = slot->slots[offset]; + pathp++; + shift -= RADIX_TREE_MAP_SHIFT; + height--; + } + + ret = slot; + if (ret == NULL) + goto out; + + do { + if (!tag_get(pathp->node, tag, pathp->offset)) + goto out; + tag_clear(pathp->node, tag, pathp->offset); + if (any_tag_set(pathp->node, tag)) + goto out; + pathp--; + } while (pathp->node); +out: + return ret; +} + +#endif + +static unsigned int +__lookup(struct radix_tree_root *root, void **results, unsigned long index, + unsigned int max_items, unsigned long *next_index) +{ + unsigned int nr_found = 0; + unsigned int shift, height; + struct radix_tree_node *slot; + unsigned long i; + + height = root->height; + if (height == 0) + goto out; + + shift = (height-1) * RADIX_TREE_MAP_SHIFT; + slot = root->rnode; + + for ( ; height > 1; height--) { + + for (i = (index >> shift) & RADIX_TREE_MAP_MASK ; + i < RADIX_TREE_MAP_SIZE; i++) { + if (slot->slots[i] != NULL) + break; + index &= ~((1UL << shift) - 1); + index += 1UL << shift; + if (index == 0) + goto out; /* 32-bit wraparound */ + } + if (i == RADIX_TREE_MAP_SIZE) + goto out; + + shift -= RADIX_TREE_MAP_SHIFT; + slot = slot->slots[i]; + } + + /* Bottom level: grab some items */ + for (i = index & RADIX_TREE_MAP_MASK; i < RADIX_TREE_MAP_SIZE; i++) { + index++; + if (slot->slots[i]) { + results[nr_found++] = slot->slots[i]; + if (nr_found == max_items) + goto out; + } + } +out: + *next_index = index; + return nr_found; +} + +/** + * radix_tree_gang_lookup - perform multiple lookup on a radix tree + * @root: radix tree root + * @results: where the results of the lookup are placed + * @first_index: start the lookup from this key + * @max_items: place up to this many items at *results + * + * Performs an index-ascending scan of the tree for present items. Places + * them at *@results and returns the number of items which were placed at + * *@results. + * + * The implementation is naive. + */ +unsigned int +radix_tree_gang_lookup(struct radix_tree_root *root, void **results, + unsigned long first_index, unsigned int max_items) +{ + const unsigned long max_index = radix_tree_maxindex(root->height); + unsigned long cur_index = first_index; + unsigned int ret = 0; + + while (ret < max_items) { + unsigned int nr_found; + unsigned long next_index; /* Index of next search */ + + if (cur_index > max_index) + break; + nr_found = __lookup(root, results + ret, cur_index, + max_items - ret, &next_index); + ret += nr_found; + if (next_index == 0) + break; + cur_index = next_index; + } + return ret; +} + +/** + * radix_tree_gang_lookup_ex - perform multiple lookup on a radix tree + * @root: radix tree root + * @results: where the results of the lookup are placed + * @first_index: start the lookup from this key + * @last_index: don't lookup past this key + * @max_items: place up to this many items at *results + * + * Performs an index-ascending scan of the tree for present items starting + * @first_index until @last_index up to as many as @max_items. Places + * them at *@results and returns the number of items which were placed + * at *@results. + * + * The implementation is naive. + */ +unsigned int +radix_tree_gang_lookup_ex(struct radix_tree_root *root, void **results, + unsigned long first_index, unsigned long last_index, + unsigned int max_items) +{ + const unsigned long max_index = radix_tree_maxindex(root->height); + unsigned long cur_index = first_index; + unsigned int ret = 0; + + while (ret < max_items && cur_index < last_index) { + unsigned int nr_found; + unsigned long next_index; /* Index of next search */ + + if (cur_index > max_index) + break; + nr_found = __lookup(root, results + ret, cur_index, + max_items - ret, &next_index); + ret += nr_found; + if (next_index == 0) + break; + cur_index = next_index; + } + return ret; +} + +#ifdef RADIX_TREE_TAGS + +static unsigned int +__lookup_tag(struct radix_tree_root *root, void **results, unsigned long index, + unsigned int max_items, unsigned long *next_index, unsigned int tag) +{ + unsigned int nr_found = 0; + unsigned int shift; + unsigned int height = root->height; + struct radix_tree_node *slot; + + shift = (height - 1) * RADIX_TREE_MAP_SHIFT; + slot = root->rnode; + + while (height > 0) { + unsigned long i = (index >> shift) & RADIX_TREE_MAP_MASK; + + for ( ; i < RADIX_TREE_MAP_SIZE; i++) { + if (tag_get(slot, tag, i)) { + ASSERT(slot->slots[i] != NULL); + break; + } + index &= ~((1UL << shift) - 1); + index += 1UL << shift; + if (index == 0) + goto out; /* 32-bit wraparound */ + } + if (i == RADIX_TREE_MAP_SIZE) + goto out; + height--; + if (height == 0) { /* Bottom level: grab some items */ + unsigned long j = index & RADIX_TREE_MAP_MASK; + + for ( ; j < RADIX_TREE_MAP_SIZE; j++) { + index++; + if (tag_get(slot, tag, j)) { + ASSERT(slot->slots[j] != NULL); + results[nr_found++] = slot->slots[j]; + if (nr_found == max_items) + goto out; + } + } + } + shift -= RADIX_TREE_MAP_SHIFT; + slot = slot->slots[i]; + } +out: + *next_index = index; + return nr_found; +} + +/** + * radix_tree_gang_lookup_tag - perform multiple lookup on a radix tree + * based on a tag + * @root: radix tree root + * @results: where the results of the lookup are placed + * @first_index: start the lookup from this key + * @max_items: place up to this many items at *results + * @tag: the tag index (< RADIX_TREE_MAX_TAGS) + * + * Performs an index-ascending scan of the tree for present items which + * have the tag indexed by @tag set. Places the items at *@results and + * returns the number of items which were placed at *@results. + */ +unsigned int +radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results, + unsigned long first_index, unsigned int max_items, + unsigned int tag) +{ + const unsigned long max_index = radix_tree_maxindex(root->height); + unsigned long cur_index = first_index; + unsigned int ret = 0; + + while (ret < max_items) { + unsigned int nr_found; + unsigned long next_index; /* Index of next search */ + + if (cur_index > max_index) + break; + nr_found = __lookup_tag(root, results + ret, cur_index, + max_items - ret, &next_index, tag); + ret += nr_found; + if (next_index == 0) + break; + cur_index = next_index; + } + return ret; +} + +#endif + +/** + * radix_tree_shrink - shrink height of a radix tree to minimal + * @root radix tree root + */ +static inline void radix_tree_shrink(struct radix_tree_root *root) +{ + /* try to shrink tree height */ + while (root->height > 1 && + root->rnode->count == 1 && + root->rnode->slots[0]) { + struct radix_tree_node *to_free = root->rnode; + + root->rnode = to_free->slots[0]; + root->height--; + /* must only free zeroed nodes into the slab */ +#ifdef RADIX_TREE_TAGS + tag_clear(to_free, 0, 0); + tag_clear(to_free, 1, 0); +#endif + to_free->slots[0] = NULL; + to_free->count = 0; + radix_tree_node_free(to_free); + } +} + +/** + * radix_tree_delete - delete an item from a radix tree + * @root: radix tree root + * @index: index key + * + * Remove the item at @index from the radix tree rooted at @root. + * + * Returns the address of the deleted item, or NULL if it was not present. + */ +void *radix_tree_delete(struct radix_tree_root *root, unsigned long index) +{ + struct radix_tree_path path[RADIX_TREE_MAX_PATH], *pathp = path; + struct radix_tree_path *orig_pathp; + struct radix_tree_node *slot; + unsigned int height, shift; + void *ret = NULL; +#ifdef RADIX_TREE_TAGS + char tags[RADIX_TREE_MAX_TAGS]; + int nr_cleared_tags; + int tag; +#endif + int offset; + + height = root->height; + if (index > radix_tree_maxindex(height)) + goto out; + + shift = (height - 1) * RADIX_TREE_MAP_SHIFT; + pathp->node = NULL; + slot = root->rnode; + + for ( ; height > 0; height--) { + if (slot == NULL) + goto out; + + pathp++; + offset = (index >> shift) & RADIX_TREE_MAP_MASK; + pathp->offset = offset; + pathp->node = slot; + slot = slot->slots[offset]; + shift -= RADIX_TREE_MAP_SHIFT; + } + + ret = slot; + if (ret == NULL) + goto out; + + orig_pathp = pathp; + +#ifdef RADIX_TREE_TAGS + /* + * Clear all tags associated with the just-deleted item + */ + nr_cleared_tags = 0; + for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { + tags[tag] = 1; + if (tag_get(pathp->node, tag, pathp->offset)) { + tag_clear(pathp->node, tag, pathp->offset); + if (!any_tag_set(pathp->node, tag)) { + tags[tag] = 0; + nr_cleared_tags++; + } + } + } + + for (pathp--; nr_cleared_tags && pathp->node; pathp--) { + for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { + if (tags[tag]) + continue; + + tag_clear(pathp->node, tag, pathp->offset); + if (any_tag_set(pathp->node, tag)) { + tags[tag] = 1; + nr_cleared_tags--; + } + } + } +#endif + /* Now free the nodes we do not need anymore */ + for (pathp = orig_pathp; pathp->node; pathp--) { + pathp->node->slots[pathp->offset] = NULL; + pathp->node->count--; + + if (pathp->node->count) { + if (pathp->node == root->rnode) + radix_tree_shrink(root); + goto out; + } + + /* Node with zero slots in use so free it */ + radix_tree_node_free(pathp->node); + } + root->rnode = NULL; + root->height = 0; +out: + return ret; +} + +#ifdef RADIX_TREE_TAGS +/** + * radix_tree_tagged - test whether any items in the tree are tagged + * @root: radix tree root + * @tag: tag to test + */ +int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag) +{ + struct radix_tree_node *rnode; + rnode = root->rnode; + if (!rnode) + return 0; + return any_tag_set(rnode, tag); +} +#endif + +static unsigned long __maxindex(unsigned int height) +{ + unsigned int tmp = height * RADIX_TREE_MAP_SHIFT; + unsigned long index = (~0UL >> (RADIX_TREE_INDEX_BITS - tmp - 1)) >> 1; + + if (tmp >= RADIX_TREE_INDEX_BITS) + index = ~0UL; + return index; +} + +static void radix_tree_init_maxindex(void) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(height_to_maxindex); i++) + height_to_maxindex[i] = __maxindex(i); +} + +void radix_tree_init(void) +{ + radix_tree_init_maxindex(); +} diff --git a/libxfs/trans.c b/libxfs/trans.c index 1c60f38..9382c56 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -36,8 +36,7 @@ libxfs_trans_alloc( } ptr->t_mountp = mp; ptr->t_type = type; - ptr->t_items_free = XFS_LIC_NUM_SLOTS; - xfs_lic_init(&ptr->t_items); + INIT_LIST_HEAD(&ptr->t_items); #ifdef XACT_DEBUG fprintf(stderr, "allocated new transaction %p\n", ptr); #endif @@ -139,7 +138,6 @@ libxfs_trans_iput( uint lock_flags) { xfs_inode_log_item_t *iip; - xfs_log_item_desc_t *lidp; if (tp == NULL) { libxfs_iput(ip, lock_flags); @@ -149,12 +147,7 @@ libxfs_trans_iput( ASSERT(ip->i_transp == tp); iip = ip->i_itemp; ASSERT(iip != NULL); - - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *)iip); - ASSERT(lidp != NULL); - ASSERT(lidp->lid_item == (xfs_log_item_t *)iip); - ASSERT(!(lidp->lid_flags & XFS_LID_DIRTY)); - xfs_trans_free_item(tp, lidp); + xfs_trans_del_item(&iip->ili_item); libxfs_iput(ip, lock_flags); } @@ -183,6 +176,23 @@ libxfs_trans_ijoin( } void +libxfs_trans_ijoin_ref( + xfs_trans_t *tp, + xfs_inode_t *ip, + int lock_flags) +{ + ASSERT(ip->i_transp == tp); + ASSERT(ip->i_itemp != NULL); + + xfs_trans_ijoin(tp, ip, lock_flags); + ip->i_itemp->ili_lock_flags = lock_flags; + +#ifdef XACT_DEBUG + fprintf(stderr, "ijoin_ref'd inode %llu, transaction %p\n", ip->i_ino, tp); +#endif +} + +void libxfs_trans_ihold( xfs_trans_t *tp, xfs_inode_t *ip) @@ -190,7 +200,8 @@ libxfs_trans_ihold( ASSERT(ip->i_transp == tp); ASSERT(ip->i_itemp != NULL); - ip->i_itemp->ili_flags |= XFS_ILI_HOLD; + ip->i_itemp->ili_lock_flags = 1; + #ifdef XACT_DEBUG fprintf(stderr, "ihold'd inode %llu, transaction %p\n", ip->i_ino, tp); #endif @@ -224,19 +235,14 @@ xfs_trans_log_inode( xfs_inode_t *ip, uint flags) { - xfs_log_item_desc_t *lidp; - ASSERT(ip->i_transp == tp); ASSERT(ip->i_itemp != NULL); #ifdef XACT_DEBUG fprintf(stderr, "dirtied inode %llu, transaction %p\n", ip->i_ino, tp); #endif - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)(ip->i_itemp)); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + ip->i_itemp->ili_item.li_desc->lid_flags |= XFS_LID_DIRTY; /* * Always OR in the bits from the ili_last_fields field. @@ -266,7 +272,6 @@ libxfs_trans_log_buf( uint last) { xfs_buf_log_item_t *bip; - xfs_log_item_desc_t *lidp; ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); @@ -277,11 +282,8 @@ libxfs_trans_log_buf( bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *)bip); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + bip->bli_item.li_desc->lid_flags |= XFS_LID_DIRTY; xfs_buf_item_log(bip, first, last); } @@ -291,7 +293,6 @@ libxfs_trans_brelse( xfs_buf_t *bp) { xfs_buf_log_item_t *bip; - xfs_log_item_desc_t *lidp; #ifdef XACT_DEBUG fprintf(stderr, "released buffer %p, transaction %p\n", bp, tp); #endif @@ -304,8 +305,6 @@ libxfs_trans_brelse( ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(bip->bli_item.li_type == XFS_LI_BUF); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); - ASSERT(lidp != NULL); if (bip->bli_recur > 0) { bip->bli_recur--; return; @@ -313,9 +312,9 @@ libxfs_trans_brelse( /* If dirty/stale, can't release till transaction committed */ if (bip->bli_flags & XFS_BLI_STALE) return; - if (lidp->lid_flags & XFS_LID_DIRTY) + if (bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY) return; - xfs_trans_free_item(tp, lidp); + xfs_trans_del_item(&bip->bli_item); if (bip->bli_flags & XFS_BLI_HOLD) bip->bli_flags &= ~XFS_BLI_HOLD; XFS_BUF_SET_FSPRIVATE2(bp, NULL); @@ -327,7 +326,6 @@ libxfs_trans_binval( xfs_trans_t *tp, xfs_buf_t *bp) { - xfs_log_item_desc_t *lidp; xfs_buf_log_item_t *bip; #ifdef XACT_DEBUG fprintf(stderr, "binval'd buffer %p, transaction %p\n", bp, tp); @@ -337,17 +335,15 @@ libxfs_trans_binval( ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); - ASSERT(lidp != NULL); if (bip->bli_flags & XFS_BLI_STALE) return; XFS_BUF_UNDELAYWRITE(bp); XFS_BUF_STALE(bp); bip->bli_flags |= XFS_BLI_STALE; bip->bli_flags &= ~XFS_BLI_DIRTY; - bip->bli_format.blf_flags &= ~XFS_BLI_INODE_BUF; - bip->bli_format.blf_flags |= XFS_BLI_CANCEL; - lidp->lid_flags |= XFS_LID_DIRTY; + bip->bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; + bip->bli_format.blf_flags |= XFS_BLF_CANCEL; + bip->bli_item.li_desc->lid_flags |= XFS_LID_DIRTY; tp->t_flags |= XFS_TRANS_DIRTY; } @@ -402,10 +398,7 @@ libxfs_trans_get_buf( return libxfs_getbuf(dev, d, len); bdev.dev = dev; - if (tp->t_items.lic_next == NULL) - bp = xfs_trans_buf_item_match(tp, &bdev, d, len); - else - bp = xfs_trans_buf_item_match_all(tp, &bdev, d, len); + bp = xfs_trans_buf_item_match(tp, &bdev, d, len); if (bp != NULL) { ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); @@ -447,10 +440,7 @@ libxfs_trans_getsb( bdev.dev = mp->m_dev; len = XFS_FSS_TO_BB(mp, 1); - if (tp->t_items.lic_next == NULL) - bp = xfs_trans_buf_item_match(tp, &bdev, XFS_SB_DADDR, len); - else - bp = xfs_trans_buf_item_match_all(tp, &bdev, XFS_SB_DADDR, len); + bp = xfs_trans_buf_item_match(tp, &bdev, XFS_SB_DADDR, len); if (bp != NULL) { ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); @@ -494,10 +484,7 @@ libxfs_trans_read_buf( } bdev.dev = dev; - if (tp->t_items.lic_next == NULL) - bp = xfs_trans_buf_item_match(tp, &bdev, blkno, len); - else - bp = xfs_trans_buf_item_match_all(tp, &bdev, blkno, len); + bp = xfs_trans_buf_item_match(tp, &bdev, blkno, len); if (bp != NULL) { ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); @@ -574,13 +561,11 @@ inode_item_done( xfs_inode_t *ip; xfs_mount_t *mp; xfs_buf_t *bp; - int hold; int error; extern kmem_zone_t *xfs_ili_zone; ip = iip->ili_inode; mp = iip->ili_item.li_mountp; - hold = iip->ili_flags & XFS_ILI_HOLD; ASSERT(ip != NULL); if (!(iip->ili_format.ilf_fields & XFS_ILOG_ALL)) { @@ -592,7 +577,7 @@ inode_item_done( /* * Get the buffer containing the on-disk inode. */ - error = xfs_itobp(mp, NULL, ip, &dip, &bp, 0, 0, 0); + error = xfs_itobp(mp, NULL, ip, &dip, &bp, 0); if (error) { fprintf(stderr, _("%s: warning - itobp failed (%d)\n"), progname, error); @@ -613,11 +598,11 @@ inode_item_done( libxfs_writebuf(bp, 0); #ifdef XACT_DEBUG fprintf(stderr, "flushing dirty inode %llu, buffer %p (hold=%u)\n", - ip->i_ino, bp, hold); + ip->i_ino, bp, iip->ili_lock_flags); #endif ili_done: - if (hold) { - iip->ili_flags &= ~XFS_ILI_HOLD; + if (iip->ili_lock_flags) { + iip->ili_lock_flags = 0; return; } else { libxfs_iput(ip, 0); @@ -659,63 +644,26 @@ buf_item_done( kmem_zone_free(xfs_buf_item_zone, bip); } -/* - * This is called to perform the commit processing for each - * item described by the given chunk. - */ static void -trans_chunk_committed( - xfs_log_item_chunk_t *licp) +trans_committed( + xfs_trans_t *tp) { - xfs_log_item_desc_t *lidp; - xfs_log_item_t *lip; - int i; - - lidp = licp->lic_descs; - for (i = 0; i < licp->lic_unused; i++, lidp++) { - if (xfs_lic_isfree(licp, i)) - continue; - lip = lidp->lid_item; + struct xfs_log_item_desc *lidp, *next; + + list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) { + struct xfs_log_item *lip = lidp->lid_item; + + xfs_trans_del_item(lip); if (lip->li_type == XFS_LI_BUF) - buf_item_done((xfs_buf_log_item_t *)lidp->lid_item); + buf_item_done((xfs_buf_log_item_t *)lip); else if (lip->li_type == XFS_LI_INODE) - inode_item_done((xfs_inode_log_item_t *)lidp->lid_item); + inode_item_done((xfs_inode_log_item_t *)lip); else { fprintf(stderr, _("%s: unrecognised log item type\n"), progname); ASSERT(0); } - } -} - -/* - * Calls trans_chunk_committed() to process the items in each chunk. - */ -static void -trans_committed( - xfs_trans_t *tp) -{ - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t *next_licp; - - /* - * Special case the chunk embedded in the transaction. - */ - licp = &(tp->t_items); - if (!(xfs_lic_are_all_free(licp))) { - trans_chunk_committed(licp); - } - - /* - * Process the items in each chunk in turn. - */ - licp = licp->lic_next; - while (licp != NULL) { - trans_chunk_committed(licp); - next_licp = licp->lic_next; - kmem_free(licp); - licp = next_licp; - } + } } static void @@ -729,9 +677,9 @@ buf_item_unlock( XFS_BUF_SET_FSPRIVATE2(bip->bli_buf, NULL); hold = bip->bli_flags & XFS_BLI_HOLD; + bip->bli_flags &= ~XFS_BLI_HOLD; if (!hold) libxfs_putbuf(bp); - bip->bli_flags &= ~XFS_BLI_HOLD; } static void @@ -739,75 +687,44 @@ inode_item_unlock( xfs_inode_log_item_t *iip) { xfs_inode_t *ip = iip->ili_inode; - uint hold; /* Clear the transaction pointer in the inode. */ ip->i_transp = NULL; - hold = iip->ili_flags & XFS_ILI_HOLD; - if (!hold) - libxfs_iput(ip, 0); iip->ili_flags = 0; + if (!iip->ili_lock_flags) { + iip->ili_lock_flags = 0; + libxfs_iput(ip, 0); + } } /* - * Unlock each item pointed to by a descriptor in the given chunk. - * Free descriptors pointing to items which are not dirty if freeing_chunk - * is zero. If freeing_chunk is non-zero, then we need to unlock all - * items in the chunk. Return the number of descriptors freed. - * Originally based on xfs_trans_unlock_chunk() - adapted for libxfs - * transactions though. + * Unlock all of the items of a transaction and free all the descriptors + * of that transaction. */ -int -xfs_trans_unlock_chunk( - xfs_log_item_chunk_t *licp, - int freeing_chunk, - int abort, - xfs_lsn_t commit_lsn) /* nb: unused */ +void +xfs_trans_free_items( + struct xfs_trans *tp, + int flags) { - xfs_log_item_desc_t *lidp; - xfs_log_item_t *lip; - int i; - int freed; - - freed = 0; - lidp = licp->lic_descs; - for (i = 0; i < licp->lic_unused; i++, lidp++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - lip = lidp->lid_item; - lip->li_desc = NULL; + struct xfs_log_item_desc *lidp, *next; - /* - * Disassociate the logged item from this transaction - */ + list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) { + struct xfs_log_item *lip = lidp->lid_item; + + xfs_trans_del_item(lip); if (lip->li_type == XFS_LI_BUF) - buf_item_unlock((xfs_buf_log_item_t *)lidp->lid_item); + buf_item_unlock((xfs_buf_log_item_t *)lip); else if (lip->li_type == XFS_LI_INODE) - inode_item_unlock((xfs_inode_log_item_t *)lidp->lid_item); + inode_item_unlock((xfs_inode_log_item_t *)lip); else { fprintf(stderr, _("%s: unrecognised log item type\n"), progname); ASSERT(0); } - - /* - * Free the descriptor if the item is not dirty - * within this transaction and the caller is not - * going to just free the entire thing regardless. - */ - if (!(freeing_chunk) && - (!(lidp->lid_flags & XFS_LID_DIRTY) || abort)) { - xfs_lic_relse(licp, i); - freed++; - } } - - return (freed); } - /* * Commit the changes represented by this transaction */ diff --git a/libxfs/util.c b/libxfs/util.c index 077d2a2..bffbac0 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -28,7 +28,10 @@ * where it's no longer worth the hassle of maintaining common code. */ void -libxfs_ichgtime(xfs_inode_t *ip, int flags) +libxfs_trans_ichgtime( + struct xfs_trans *tp, + struct xfs_inode *ip, + int flags) { struct timespec tv; struct timeval stv; @@ -74,22 +77,26 @@ libxfs_iread( ip->i_ino = ino; ip->i_mount = mp; - /* - * Get pointer's to the on-disk inode and the buffer containing it. - * If the inode number refers to a block outside the file system - * then xfs_itobp() will return NULL. In this case we should - * return NULL as well. Set i_blkno to 0 so that xfs_itobp() will - * know that this is a new incore inode. - */ - error = xfs_itobp(mp, tp, ip, &dip, &bp, bno, 0, XFS_BUF_LOCK); - if (error) - return error; + /* + * Fill in the location information in the in-core inode. + */ + error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, 0); + if (error) + return error; + + /* + * Get pointers to the on-disk inode and the buffer containing it. + */ + error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp, XBF_LOCK, 0); + if (error) + return error; + dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); /* * If we got something that isn't an inode it means someone * (nfs or dmi) has a stale handle. */ - if (be16_to_cpu(dip->di_core.di_magic) != XFS_DINODE_MAGIC) { + if (be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC) { xfs_trans_brelse(tp, bp); return EINVAL; } @@ -101,18 +108,18 @@ libxfs_iread( * specific information. * Otherwise, just get the truly permanent information. */ - if (dip->di_core.di_mode) { - xfs_dinode_from_disk(&ip->i_d, &dip->di_core); + if (dip->di_mode) { + xfs_dinode_from_disk(&ip->i_d, dip); error = xfs_iformat(ip, dip); if (error) { xfs_trans_brelse(tp, bp); return error; } } else { - ip->i_d.di_magic = be16_to_cpu(dip->di_core.di_magic); - ip->i_d.di_version = dip->di_core.di_version; - ip->i_d.di_gen = be32_to_cpu(dip->di_core.di_gen); - ip->i_d.di_flushiter = be16_to_cpu(dip->di_core.di_flushiter); + ip->i_d.di_magic = be16_to_cpu(dip->di_magic); + ip->i_d.di_version = dip->di_version; + ip->i_d.di_gen = be32_to_cpu(dip->di_gen); + ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter); /* * Make sure to pull in the mode here as well in * case the inode is released without being used. @@ -140,7 +147,7 @@ libxfs_iread( * the new format. We don't change the version number so that we * can distinguish this from a real new format inode. */ - if (ip->i_d.di_version == XFS_DINODE_VERSION_1) { + if (ip->i_d.di_version == 1) { ip->i_d.di_nlink = ip->i_d.di_onlink; ip->i_d.di_onlink = 0; xfs_set_projid(&ip->i_d, 0); @@ -229,8 +236,8 @@ libxfs_ialloc( * here rather than here and in the flush/logging code. */ if (xfs_sb_version_hasnlink(&tp->t_mountp->m_sb) && - ip->i_d.di_version == XFS_DINODE_VERSION_1) { - ip->i_d.di_version = XFS_DINODE_VERSION_2; + ip->i_d.di_version == 1) { + ip->i_d.di_version = 2; /* * old link count, projid_lo/hi field, pad field * already zeroed @@ -246,7 +253,7 @@ libxfs_ialloc( ip->i_d.di_size = 0; ip->i_d.di_nextents = 0; ASSERT(ip->i_d.di_nblocks == 0); - xfs_ichgtime(ip, XFS_ICHGTIME_CHG|XFS_ICHGTIME_MOD); + xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG|XFS_ICHGTIME_MOD); /* * di_gen will have been taken care of in xfs_iread. */ @@ -398,7 +405,7 @@ libxfs_iflush_int(xfs_inode_t *ip, xfs_buf_t *bp) mp = ip->i_mount; /* set *dip = inode's place in the buffer */ - dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_boffset); + dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); ASSERT(ip->i_d.di_magic == XFS_DINODE_MAGIC); if ((ip->i_d.di_mode & S_IFMT) == S_IFREG) { @@ -419,7 +426,7 @@ libxfs_iflush_int(xfs_inode_t *ip, xfs_buf_t *bp) * because if the inode is dirty at all the core must * be. */ - xfs_dinode_to_disk(&dip->di_core, &ip->i_d); + xfs_dinode_to_disk(dip, &ip->i_d); /* * If this is really an old format inode and the superblock version @@ -427,28 +434,27 @@ libxfs_iflush_int(xfs_inode_t *ip, xfs_buf_t *bp) * convert back to the old inode format. If the superblock version * has been updated, then make the conversion permanent. */ - ASSERT(ip->i_d.di_version == XFS_DINODE_VERSION_1 || + ASSERT(ip->i_d.di_version == 1 || xfs_sb_version_hasnlink(&mp->m_sb)); - if (ip->i_d.di_version == XFS_DINODE_VERSION_1) { + if (ip->i_d.di_version == 1) { if (!xfs_sb_version_hasnlink(&mp->m_sb)) { /* * Convert it back. */ ASSERT(ip->i_d.di_nlink <= XFS_MAXLINK_1); - dip->di_core.di_onlink = cpu_to_be16(ip->i_d.di_nlink); + dip->di_onlink = cpu_to_be16(ip->i_d.di_nlink); } else { /* * The superblock version has already been bumped, * so just make the conversion to the new inode * format permanent. */ - ip->i_d.di_version = XFS_DINODE_VERSION_2; - dip->di_core.di_version = XFS_DINODE_VERSION_2; + ip->i_d.di_version = 2; + dip->di_version = 2; ip->i_d.di_onlink = 0; - dip->di_core.di_onlink = 0; + dip->di_onlink = 0; memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); - memset(&(dip->di_core.di_pad[0]), 0, - sizeof(dip->di_core.di_pad)); + memset(&(dip->di_pad[0]), 0, sizeof(dip->di_pad)); ASSERT(xfs_get_projid(ip->i_d) == 0); } } @@ -571,10 +577,11 @@ libxfs_alloc_file_space( xfs_trans_ijoin(tp, ip, 0); xfs_trans_ihold(tp, ip); - XFS_BMAP_INIT(&free_list, &firstfsb); + xfs_bmap_init(&free_list, &firstfsb); error = xfs_bmapi(tp, ip, startoffset_fsb, allocatesize_fsb, xfs_bmapi_flags, &firstfsb, 0, imapp, - &reccount, &free_list, NULL); + &reccount, &free_list); + if (error) break; diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 8e94dad..b3f8378 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -51,9 +51,9 @@ typedef __uint32_t inst_t; /* an instruction */ #define m_ddev_targp m_dev +#define xfs_error_level 0 #define STATIC static -#define STATIC_INLINE static inline #define ATTR_ROOT LIBXFS_ATTR_ROOT #define ATTR_SECURE LIBXFS_ATTR_SECURE @@ -83,10 +83,6 @@ typedef __uint32_t inst_t; /* an instruction */ #define XFS_WANT_CORRUPTED_RETURN(expr) \ { if (!(expr)) { return EFSCORRUPTED; } } -#define TRACE_FREE(s,a,b,x,f) ((void) 0) -#define TRACE_ALLOC(s,a) ((void) 0) -#define TRACE_MODAGF(a,b,c) ((void) 0) - #ifdef __GNUC__ #define __return_address __builtin_return_address(0) #endif @@ -99,6 +95,8 @@ typedef __uint32_t inst_t; /* an instruction */ #define spin_unlock(a) ((void) 0) #define likely(x) (x) #define unlikely(x) (x) +#define rcu_read_lock() ((void) 0) +#define rcu_read_unlock() ((void) 0) /* * random32 is used for di_gen inode allocation, it must be zero for libxfs @@ -108,8 +106,6 @@ typedef __uint32_t inst_t; /* an instruction */ #define PAGE_CACHE_SIZE getpagesize() -#define INIT_LIST_HEAD(x) - static inline int __do_div(unsigned long long *n, unsigned base) { int __res; @@ -192,6 +188,9 @@ roundup_pow_of_two(uint v) /* buffer management */ #define XFS_BUF_LOCK 0 #define XFS_BUF_TRYLOCK 0 +#define XBF_LOCK XFS_BUF_LOCK +#define XBF_TRYLOCK XFS_BUF_TRYLOCK +#define XBF_DONT_BLOCK 0 #define XFS_BUF_GETERROR(bp) 0 #define XFS_BUF_DONE(bp) ((bp)->b_flags |= LIBXFS_B_UPTODATE) #define XFS_BUF_ISDONE(bp) ((bp)->b_flags & LIBXFS_B_UPTODATE) @@ -206,14 +205,14 @@ roundup_pow_of_two(uint v) #define xfs_read_buf(mp,devp,blkno,len,f,bpp) \ (*(bpp) = libxfs_readbuf((devp), \ (blkno), (len), 1), 0) -#define xfs_buf_get_flags(devp,blkno,len,f) \ +#define xfs_buf_get(devp,blkno,len,f) \ (libxfs_getbuf((devp), (blkno), (len))) #define xfs_bwrite(mp,bp) libxfs_writebuf((bp), 0) -#define XFS_B_READ LIBXFS_BREAD -#define XFS_B_WRITE LIBXFS_BWRITE -#define xfs_biomove(bp,off,len,data,f) libxfs_iomove(bp,off,len,data,f) -#define xfs_biozero(bp,off,len) libxfs_iomove(bp,off,len,0,LIBXFS_BZERO) +#define XBRW_READ LIBXFS_BREAD +#define XBRW_WRITE LIBXFS_BWRITE +#define xfs_buf_iomove(bp,off,len,data,f) libxfs_iomove(bp,off,len,data,f) +#define xfs_buf_zero(bp,off,len) libxfs_iomove(bp,off,len,0,LIBXFS_BZERO) /* mount stuff */ #define XFS_MOUNT_32BITINODES LIBXFS_MOUNT_32BITINODES @@ -222,6 +221,9 @@ roundup_pow_of_two(uint v) #define XFS_MOUNT_WSYNC 0 /* ignored in userspace */ #define XFS_MOUNT_NOALIGN 0 /* ignored in userspace */ +#define xfs_icsb_modify_counters(mp, field, delta, rsvd) \ + xfs_mod_incore_sb(mp, field, delta, rsvd) + /* * Map XFS kernel routine names to libxfs versions */ @@ -236,7 +238,7 @@ roundup_pow_of_two(uint v) #define xfs_fs_cmn_err libxfs_fs_cmn_err #define xfs_bmap_finish libxfs_bmap_finish -#define xfs_ichgtime libxfs_ichgtime +#define xfs_trans_ichgtime libxfs_trans_ichgtime #define xfs_mod_incore_sb libxfs_mod_incore_sb #define xfs_trans_alloc libxfs_trans_alloc @@ -252,6 +254,7 @@ roundup_pow_of_two(uint v) #define xfs_trans_iget libxfs_trans_iget #define xfs_trans_ihold libxfs_trans_ihold #define xfs_trans_ijoin libxfs_trans_ijoin +#define xfs_trans_ijoin_ref libxfs_trans_ijoin_ref #define xfs_trans_inode_alloc_buf libxfs_trans_inode_alloc_buf #define xfs_trans_log_buf libxfs_trans_log_buf #define xfs_trans_log_inode libxfs_trans_log_inode @@ -265,7 +268,7 @@ roundup_pow_of_two(uint v) #define xfs_trans_agflist_delta(tp, d) #define xfs_trans_agbtree_delta(tp, d) -#define xfs_baread(a,b,c) ((void) 0) /* no readahead */ +#define xfs_buf_readahead(a,b,c) ((void) 0) /* no readahead */ #define xfs_btree_reada_bufl(m,fsb,c) ((void) 0) #define xfs_btree_reada_bufs(m,fsb,c,x) ((void) 0) #define xfs_buftrace(x,y) ((void) 0) /* debug only */ @@ -289,8 +292,12 @@ roundup_pow_of_two(uint v) #define xfs_iunlock(ip,mode) ((void) 0) /* space allocation */ -#define xfs_alloc_search_busy(tp,ag,b,len) ((void) 0) -#define xfs_alloc_mark_busy(tp,ag,b,len) ((void) 0) +#define xfs_alloc_busy_search(tp,ag,b,len) 0 +/* avoid unused variable warning */ +#define xfs_alloc_busy_insert(tp,ag,b,len) ({ \ + xfs_agnumber_t __foo = ag; \ + __foo = 0; \ +}) #define xfs_rotorstep 1 #define xfs_bmap_rtalloc(a) (ENOSYS) #define xfs_rtpick_extent(mp,tp,len,p) (ENOSYS) @@ -329,10 +336,9 @@ void xfs_mount_common(xfs_mount_t *, xfs_sb_t *); */ /* xfs_trans_item.c */ -xfs_log_item_desc_t *xfs_trans_add_item (xfs_trans_t *, xfs_log_item_t *); -xfs_log_item_desc_t *xfs_trans_find_item (xfs_trans_t *, xfs_log_item_t *); -void xfs_trans_free_item (xfs_trans_t *, xfs_log_item_desc_t *); -void xfs_trans_free_items (xfs_trans_t *, int); +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 *, int); /* xfs_inode_item.c */ void xfs_inode_item_init (xfs_inode_t *, xfs_mount_t *); @@ -344,10 +350,7 @@ void xfs_buf_item_log (xfs_buf_log_item_t *, uint, uint); /* xfs_trans_buf.c */ xfs_buf_t *xfs_trans_buf_item_match (xfs_trans_t *, xfs_buftarg_t *, xfs_daddr_t, int); -xfs_buf_t *xfs_trans_buf_item_match_all (xfs_trans_t *, xfs_buftarg_t *, - xfs_daddr_t, int); /* local source files */ int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); void xfs_trans_mod_sb(xfs_trans_t *, uint, long); -int xfs_trans_unlock_chunk (xfs_log_item_chunk_t *, int, int, xfs_lsn_t); diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 77013ab..a76512d 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -494,9 +494,6 @@ xfs_alloc_ag_vextent( */ if (args->agbno != NULLAGBLOCK) { xfs_agf_t *agf; /* allocation group freelist header */ -#ifdef XFS_ALLOC_TRACE - xfs_mount_t *mp = args->mp; -#endif long slen = (long)args->len; ASSERT(args->len >= args->minlen && args->len <= args->maxlen); @@ -511,12 +508,18 @@ xfs_alloc_ag_vextent( args->pag->pagf_freeblks -= args->len; ASSERT(be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length)); - TRACE_MODAGF(NULL, agf, XFS_AGF_FREEBLKS); xfs_alloc_log_agf(args->tp, args->agbp, XFS_AGF_FREEBLKS); - /* search the busylist for these blocks */ - xfs_alloc_search_busy(args->tp, args->agno, - args->agbno, args->len); + /* + * Search the busylist for these blocks and mark the + * transaction as synchronous if blocks are found. This + * avoids the need to block due to a synchronous log + * force to ensure correct ordering as the synchronous + * transaction will guarantee that for us. + */ + if (xfs_alloc_busy_search(args->mp, args->agno, + args->agbno, args->len)) + xfs_trans_set_sync(args->tp); } if (!args->isfl) xfs_trans_mod_sb(args->tp, @@ -555,57 +558,53 @@ xfs_alloc_ag_vextent_exact( * 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. @@ -614,20 +613,117 @@ 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_ALLOC("normal", 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: xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR); - TRACE_ALLOC("error", args); + trace_xfs_alloc_exact_error(args); + return error; +} + +/* + * 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; } @@ -648,7 +744,7 @@ xfs_alloc_ag_vextent_near( xfs_agblock_t gtbnoa; /* aligned ... */ xfs_extlen_t gtdiff; /* difference to right side entry */ xfs_extlen_t gtlen; /* length of right side entry */ - xfs_extlen_t gtlena; /* aligned ... */ + xfs_extlen_t gtlena = 0; /* aligned ... */ xfs_agblock_t gtnew; /* useful start bno of right side */ int error; /* error code */ int i; /* result code, temporary */ @@ -656,10 +752,8 @@ xfs_alloc_ag_vextent_near( xfs_agblock_t ltbno; /* start bno of left side entry */ xfs_agblock_t ltbnoa; /* aligned ... */ xfs_extlen_t ltdiff; /* difference to left side entry */ - /*REFERENCED*/ - xfs_agblock_t ltend; /* end bno of left side entry */ xfs_extlen_t ltlen; /* length of left side entry */ - xfs_extlen_t ltlena; /* aligned ... */ + xfs_extlen_t ltlena = 0; /* aligned ... */ xfs_agblock_t ltnew; /* useful start bno of left side */ xfs_extlen_t rlen; /* length of returned extent */ #if defined(DEBUG) && defined(__KERNEL__) @@ -782,12 +876,11 @@ xfs_alloc_ag_vextent_near( if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) goto error0; XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - ltend = ltbno + ltlen; - ASSERT(ltend <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); + ASSERT(ltbno + ltlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); args->len = blen; if (!xfs_alloc_fix_minleft(args)) { xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); - TRACE_ALLOC("nominleft", args); + trace_xfs_alloc_near_nominleft(args); return 0; } blen = args->len; @@ -796,7 +889,7 @@ xfs_alloc_ag_vextent_near( */ args->agbno = bnew; ASSERT(bnew >= ltbno); - ASSERT(bnew + blen <= ltend); + ASSERT(bnew + blen <= ltbno + ltlen); /* * Set up a cursor for the by-bno tree. */ @@ -810,7 +903,8 @@ xfs_alloc_ag_vextent_near( goto error0; xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR); - TRACE_ALLOC("first", args); + + trace_xfs_alloc_near_first(args); return 0; } /* @@ -900,211 +994,55 @@ 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. */ if (bno_cur_lt == NULL && bno_cur_gt == NULL) { - TRACE_ALLOC("neither", args); + trace_xfs_alloc_size_neither(args); 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 @@ -1121,14 +1059,14 @@ xfs_alloc_ag_vextent_near( j = 1; } else j = 0; + /* * Fix up the length and compute the useful address. */ - ltend = ltbno + ltlen; args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); xfs_alloc_fix_len(args); if (!xfs_alloc_fix_minleft(args)) { - TRACE_ALLOC("nominleft", args); + trace_xfs_alloc_near_nominleft(args); xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); return 0; @@ -1137,19 +1075,24 @@ xfs_alloc_ag_vextent_near( (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment, ltbno, ltlen, <new); ASSERT(ltnew >= ltbno); - ASSERT(ltnew + rlen <= ltend); + ASSERT(ltnew + rlen <= ltbno + ltlen); ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); args->agbno = ltnew; if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno, ltlen, ltnew, rlen, XFSA_FIXUP_BNO_OK))) goto error0; - TRACE_ALLOC(j ? "gt" : "lt", args); + + if (j) + trace_xfs_alloc_near_greater(args); + else + trace_xfs_alloc_near_lesser(args); + xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR); return 0; error0: - TRACE_ALLOC("error", args); + trace_xfs_alloc_near_error(args); if (cnt_cur != NULL) xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR); if (bno_cur_lt != NULL) @@ -1200,7 +1143,7 @@ xfs_alloc_ag_vextent_size( goto error0; if (i == 0 || flen == 0) { xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); - TRACE_ALLOC("noentry", args); + trace_xfs_alloc_size_noentry(args); return 0; } ASSERT(i == 1); @@ -1277,7 +1220,7 @@ xfs_alloc_ag_vextent_size( xfs_alloc_fix_len(args); if (rlen < args->minlen || !xfs_alloc_fix_minleft(args)) { xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); - TRACE_ALLOC("nominleft", args); + trace_xfs_alloc_size_nominleft(args); args->agbno = NULLAGBLOCK; return 0; } @@ -1300,11 +1243,11 @@ xfs_alloc_ag_vextent_size( args->agbno + args->len <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length), error0); - TRACE_ALLOC("normal", args); + trace_xfs_alloc_size_done(args); return 0; error0: - TRACE_ALLOC("error", args); + trace_xfs_alloc_size_error(args); if (cnt_cur) xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR); if (bno_cur) @@ -1363,7 +1306,7 @@ xfs_alloc_ag_vextent_small( be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length), error0); args->wasfromfl = 1; - TRACE_ALLOC("freelist", args); + trace_xfs_alloc_small_freelist(args); *stat = 0; return 0; } @@ -1385,17 +1328,17 @@ xfs_alloc_ag_vextent_small( */ if (flen < args->minlen) { args->agbno = NULLAGBLOCK; - TRACE_ALLOC("notenough", args); + trace_xfs_alloc_small_notenough(args); flen = 0; } *fbnop = fbno; *flenp = flen; *stat = 1; - TRACE_ALLOC("normal", args); + trace_xfs_alloc_small_done(args); return 0; error0: - TRACE_ALLOC("error", args); + trace_xfs_alloc_small_error(args); return error; } @@ -1629,26 +1572,25 @@ xfs_free_ag_extent( xfs_agf_t *agf; xfs_perag_t *pag; /* per allocation group data */ + pag = xfs_perag_get(mp, agno); + pag->pagf_freeblks += len; + xfs_perag_put(pag); + agf = XFS_BUF_TO_AGF(agbp); - pag = &mp->m_perag[agno]; be32_add_cpu(&agf->agf_freeblks, len); xfs_trans_agblocks_delta(tp, len); - pag->pagf_freeblks += len; XFS_WANT_CORRUPTED_GOTO( be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length), error0); - TRACE_MODAGF(NULL, agf, XFS_AGF_FREEBLKS); xfs_alloc_log_agf(tp, agbp, XFS_AGF_FREEBLKS); if (!isfl) xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len); XFS_STATS_INC(xs_freex); XFS_STATS_ADD(xs_freeb, len); } - TRACE_FREE(haveleft ? - (haveright ? "both" : "left") : - (haveright ? "right" : "none"), - agno, bno, len, isfl); + + trace_xfs_free_extent(mp, agno, bno, len, isfl, haveleft, haveright); /* * Since blocks move to the free list without the coordination @@ -1661,11 +1603,11 @@ xfs_free_ag_extent( * when the iclog commits to disk. If a busy block is allocated, * the iclog is pushed up to the LSN that freed the block. */ - xfs_alloc_mark_busy(tp, agno, bno, len); + xfs_alloc_busy_insert(tp, agno, bno, len); return 0; error0: - TRACE_FREE("error", agno, bno, len, isfl); + trace_xfs_free_extent(mp, agno, bno, len, isfl, -1, -1); if (bno_cur) xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR); if (cnt_cur) @@ -1701,6 +1643,25 @@ xfs_alloc_compute_maxlevels( } /* + * Find the length of the longest extent in an AG. + */ +xfs_extlen_t +xfs_alloc_longest_free_extent( + struct xfs_mount *mp, + struct xfs_perag *pag) +{ + xfs_extlen_t need, delta = 0; + + need = XFS_MIN_FREELIST_PAG(pag, mp); + if (need > pag->pagf_flcount) + delta = need - pag->pagf_flcount; + + if (pag->pagf_longest > delta) + return pag->pagf_longest - delta; + return pag->pagf_flcount > 0 || pag->pagf_longest > 0; +} + +/* * Decide whether to use this allocation group for this allocation. * If so, fix up the btree freelist's size. * @@ -1754,15 +1715,12 @@ xfs_alloc_fix_freelist( } if (!(flags & XFS_ALLOC_FLAG_FREEING)) { - need = XFS_MIN_FREELIST_PAG(pag, mp); - delta = need > pag->pagf_flcount ? need - pag->pagf_flcount : 0; /* * If it looks like there isn't a long enough extent, or enough * total blocks, reject it. */ - longest = (pag->pagf_longest > delta) ? - (pag->pagf_longest - delta) : - (pag->pagf_flcount > 0 || pag->pagf_longest > 0); + need = XFS_MIN_FREELIST_PAG(pag, mp); + longest = xfs_alloc_longest_free_extent(mp, pag); if ((args->minlen + args->alignment + args->minalignslop - 1) > longest || ((int)(pag->pagf_freeblks + pag->pagf_flcount - @@ -1925,10 +1883,12 @@ xfs_alloc_get_freelist( xfs_trans_brelse(tp, agflbp); if (be32_to_cpu(agf->agf_flfirst) == XFS_AGFL_SIZE(mp)) agf->agf_flfirst = 0; - pag = &mp->m_perag[be32_to_cpu(agf->agf_seqno)]; + + pag = xfs_perag_get(mp, be32_to_cpu(agf->agf_seqno)); be32_add_cpu(&agf->agf_flcount, -1); xfs_trans_agflist_delta(tp, -1); pag->pagf_flcount--; + xfs_perag_put(pag); logflags = XFS_AGF_FLFIRST | XFS_AGF_FLCOUNT; if (btreeblk) { @@ -1937,19 +1897,24 @@ xfs_alloc_get_freelist( logflags |= XFS_AGF_BTREEBLKS; } - TRACE_MODAGF(NULL, agf, logflags); xfs_alloc_log_agf(tp, agbp, logflags); *bnop = bno; /* - * As blocks are freed, they are added to the per-ag busy list - * and remain there until the freeing transaction is committed to - * disk. Now that we have allocated blocks, this list must be - * searched to see if a block is being reused. If one is, then - * the freeing transaction must be pushed to disk NOW by forcing - * to disk all iclogs up that transaction's LSN. - */ - xfs_alloc_search_busy(tp, be32_to_cpu(agf->agf_seqno), bno, 1); + * As blocks are freed, they are added to the per-ag busy list and + * remain there until the freeing transaction is committed to disk. + * Now that we have allocated blocks, this list must be searched to see + * if a block is being reused. If one is, then the freeing transaction + * must be pushed to disk before this transaction. + * + * We do this by setting the current transaction to a sync transaction + * which guarantees that the freeing transaction is on disk before this + * transaction. This is done instead of a synchronous log force here so + * that we don't sit and wait with the AGF locked in the transaction + * during the log force. + */ + if (xfs_alloc_busy_search(mp, be32_to_cpu(agf->agf_seqno), bno, 1)) + xfs_trans_set_sync(tp); return 0; } @@ -1980,6 +1945,8 @@ xfs_alloc_log_agf( sizeof(xfs_agf_t) }; + trace_xfs_agf(tp->t_mountp, XFS_BUF_TO_AGF(bp), fields, _RET_IP_); + xfs_btree_offsets(fields, offsets, XFS_AGF_NUM_BITS, &first, &last); xfs_trans_log_buf(tp, bp, (uint)first, (uint)last); } @@ -2033,7 +2000,8 @@ xfs_alloc_put_freelist( be32_add_cpu(&agf->agf_fllast, 1); if (be32_to_cpu(agf->agf_fllast) == XFS_AGFL_SIZE(mp)) agf->agf_fllast = 0; - pag = &mp->m_perag[be32_to_cpu(agf->agf_seqno)]; + + pag = xfs_perag_get(mp, be32_to_cpu(agf->agf_seqno)); be32_add_cpu(&agf->agf_flcount, 1); xfs_trans_agflist_delta(tp, 1); pag->pagf_flcount++; @@ -2044,14 +2012,13 @@ xfs_alloc_put_freelist( pag->pagf_btreeblks--; logflags |= XFS_AGF_BTREEBLKS; } + xfs_perag_put(pag); - TRACE_MODAGF(NULL, agf, logflags); xfs_alloc_log_agf(tp, agbp, logflags); ASSERT(be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp)); blockp = &agfl->agfl_bno[be32_to_cpu(agf->agf_fllast)]; *blockp = cpu_to_be32(bno); - TRACE_MODAGF(NULL, agf, logflags); xfs_alloc_log_agf(tp, agbp, logflags); xfs_trans_log_buf(tp, agflbp, (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl), @@ -2064,44 +2031,41 @@ xfs_alloc_put_freelist( * Read in the allocation group header (free/alloc section). */ int /* error */ -xfs_alloc_read_agf( - xfs_mount_t *mp, /* mount point structure */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_agnumber_t agno, /* allocation group number */ - int flags, /* XFS_ALLOC_FLAG_... */ - xfs_buf_t **bpp) /* buffer for the ag freelist header */ +xfs_read_agf( + struct xfs_mount *mp, /* mount point structure */ + struct xfs_trans *tp, /* transaction pointer */ + xfs_agnumber_t agno, /* allocation group number */ + int flags, /* XFS_BUF_ */ + struct xfs_buf **bpp) /* buffer for the ag freelist header */ { - xfs_agf_t *agf; /* ag freelist header */ + struct xfs_agf *agf; /* ag freelist header */ int agf_ok; /* set if agf is consistent */ - xfs_buf_t *bp; /* return value */ - xfs_perag_t *pag; /* per allocation group data */ int error; ASSERT(agno != NULLAGNUMBER); error = xfs_trans_read_buf( mp, tp, mp->m_ddev_targp, XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), - (flags & XFS_ALLOC_FLAG_TRYLOCK) ? XFS_BUF_TRYLOCK : 0U, - &bp); + XFS_FSS_TO_BB(mp, 1), flags, bpp); if (error) return error; - ASSERT(!bp || !XFS_BUF_GETERROR(bp)); - if (!bp) { - *bpp = NULL; + if (!*bpp) return 0; - } + + ASSERT(!XFS_BUF_GETERROR(*bpp)); + agf = XFS_BUF_TO_AGF(*bpp); + /* * Validate the magic number of the agf block. */ - agf = XFS_BUF_TO_AGF(bp); agf_ok = be32_to_cpu(agf->agf_magicnum) == XFS_AGF_MAGIC && XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) && be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) && be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp); + be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp) && + be32_to_cpu(agf->agf_seqno) == agno; if (xfs_sb_version_haslazysbcount(&mp->m_sb)) agf_ok = agf_ok && be32_to_cpu(agf->agf_btreeblks) <= be32_to_cpu(agf->agf_length); @@ -2109,10 +2073,41 @@ xfs_alloc_read_agf( XFS_RANDOM_ALLOC_READ_AGF))) { XFS_CORRUPTION_ERROR("xfs_alloc_read_agf", XFS_ERRLEVEL_LOW, mp, agf); - xfs_trans_brelse(tp, bp); + xfs_trans_brelse(tp, *bpp); return XFS_ERROR(EFSCORRUPTED); } - pag = &mp->m_perag[agno]; + XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_AGF, XFS_AGF_REF); + return 0; +} + +/* + * Read in the allocation group header (free/alloc section). + */ +int /* error */ +xfs_alloc_read_agf( + struct xfs_mount *mp, /* mount point structure */ + struct xfs_trans *tp, /* transaction pointer */ + xfs_agnumber_t agno, /* allocation group number */ + int flags, /* XFS_ALLOC_FLAG_... */ + struct xfs_buf **bpp) /* buffer for the ag freelist header */ +{ + struct xfs_agf *agf; /* ag freelist header */ + struct xfs_perag *pag; /* per allocation group data */ + int error; + + ASSERT(agno != NULLAGNUMBER); + + error = xfs_read_agf(mp, tp, agno, + (flags & XFS_ALLOC_FLAG_TRYLOCK) ? XBF_TRYLOCK : 0, + bpp); + if (error) + return error; + if (!*bpp) + return 0; + ASSERT(!XFS_BUF_GETERROR(*bpp)); + + agf = XFS_BUF_TO_AGF(*bpp); + pag = xfs_perag_get(mp, agno); if (!pag->pagf_init) { pag->pagf_freeblks = be32_to_cpu(agf->agf_freeblks); pag->pagf_btreeblks = be32_to_cpu(agf->agf_btreeblks); @@ -2123,8 +2118,7 @@ xfs_alloc_read_agf( pag->pagf_levels[XFS_BTNUM_CNTi] = be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]); spin_lock_init(&pag->pagb_lock); - pag->pagb_list = kmem_zalloc(XFS_PAGB_NUM_SLOTS * - sizeof(xfs_perag_busy_t), KM_SLEEP); + pag->pagb_count = 0; pag->pagf_init = 1; } #ifdef DEBUG @@ -2139,8 +2133,7 @@ xfs_alloc_read_agf( be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi])); } #endif - XFS_BUF_SET_VTYPE_REF(bp, B_FS_AGF, XFS_AGF_REF); - *bpp = bp; + xfs_perag_put(pag); return 0; } @@ -2187,7 +2180,7 @@ xfs_alloc_vextent( args->minlen > args->maxlen || args->minlen > agsize || args->mod >= args->prod) { args->fsbno = NULLFSBLOCK; - TRACE_ALLOC("badargs", args); + trace_xfs_alloc_vextent_badargs(args); return 0; } minleft = args->minleft; @@ -2200,24 +2193,21 @@ xfs_alloc_vextent( * These three force us into a single a.g. */ args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno); - down_read(&mp->m_peraglock); - args->pag = &mp->m_perag[args->agno]; + args->pag = xfs_perag_get(mp, args->agno); args->minleft = 0; error = xfs_alloc_fix_freelist(args, 0); args->minleft = minleft; if (error) { - TRACE_ALLOC("nofix", args); + trace_xfs_alloc_vextent_nofix(args); goto error0; } if (!args->agbp) { - up_read(&mp->m_peraglock); - TRACE_ALLOC("noagbp", args); + trace_xfs_alloc_vextent_noagbp(args); break; } args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno); if ((error = xfs_alloc_ag_vextent(args))) goto error0; - up_read(&mp->m_peraglock); break; case XFS_ALLOCTYPE_START_BNO: /* @@ -2269,14 +2259,13 @@ xfs_alloc_vextent( * Loop over allocation groups twice; first time with * trylock set, second time without. */ - down_read(&mp->m_peraglock); for (;;) { - args->pag = &mp->m_perag[args->agno]; + args->pag = xfs_perag_get(mp, args->agno); if (no_min) args->minleft = 0; error = xfs_alloc_fix_freelist(args, flags); args->minleft = minleft; if (error) { - TRACE_ALLOC("nofix", args); + trace_xfs_alloc_vextent_nofix(args); goto error0; } /* @@ -2287,7 +2276,9 @@ xfs_alloc_vextent( goto error0; break; } - TRACE_ALLOC("loopfailed", args); + + trace_xfs_alloc_vextent_loopfailed(args); + /* * Didn't work, figure out the next iteration. */ @@ -2314,7 +2305,7 @@ xfs_alloc_vextent( if (args->agno == sagno) { if (no_min == 1) { args->agbno = NULLAGBLOCK; - TRACE_ALLOC("allfailed", args); + trace_xfs_alloc_vextent_allfailed(args); break; } if (flags == 0) { @@ -2328,8 +2319,8 @@ xfs_alloc_vextent( } } } + xfs_perag_put(args->pag); } - up_read(&mp->m_peraglock); if (bump_rotor || (type == XFS_ALLOCTYPE_ANY_AG)) { if (args->agno == sagno) mp->m_agfrotor = (mp->m_agfrotor + 1) % @@ -2355,9 +2346,10 @@ xfs_alloc_vextent( args->len); #endif } + xfs_perag_put(args->pag); return 0; error0: - up_read(&mp->m_peraglock); + xfs_perag_put(args->pag); return error; } @@ -2382,8 +2374,7 @@ xfs_free_extent( args.agno = XFS_FSB_TO_AGNO(args.mp, bno); ASSERT(args.agno < args.mp->m_sb.sb_agcount); args.agbno = XFS_FSB_TO_AGBNO(args.mp, bno); - down_read(&args.mp->m_peraglock); - args.pag = &args.mp->m_perag[args.agno]; + args.pag = xfs_perag_get(args.mp, args.agno); if ((error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING))) goto error0; #ifdef DEBUG @@ -2393,6 +2384,6 @@ xfs_free_extent( #endif error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, len, 0); error0: - up_read(&args.mp->m_peraglock); + xfs_perag_put(args.pag); return error; } diff --git a/libxfs/xfs_alloc_btree.c b/libxfs/xfs_alloc_btree.c index 4d55caf..b782d9d 100644 --- a/libxfs/xfs_alloc_btree.c +++ b/libxfs/xfs_alloc_btree.c @@ -36,12 +36,14 @@ xfs_allocbt_set_root( struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); int btnum = cur->bc_btnum; + struct xfs_perag *pag = xfs_perag_get(cur->bc_mp, seqno); ASSERT(ptr->s != 0); agf->agf_roots[btnum] = ptr->s; be32_add_cpu(&agf->agf_levels[btnum], inc); - cur->bc_mp->m_perag[seqno].pagf_levels[btnum] += inc; + pag->pagf_levels[btnum] += inc; + xfs_perag_put(pag); xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_ROOTS | XFS_AGF_LEVELS); } @@ -91,7 +93,7 @@ xfs_allocbt_free_block( xfs_agblock_t bno; int error; - bno = XFS_DADDR_TO_AGBNO(cur->bc_mp, XFS_BUF_ADDR(bp)); + bno = xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp)); error = xfs_alloc_put_freelist(cur->bc_tp, agbp, NULL, bno, 1); if (error) return error; @@ -107,7 +109,7 @@ xfs_allocbt_free_block( * disk. If a busy block is allocated, the iclog is pushed up to the * LSN that freed the block. */ - xfs_alloc_mark_busy(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1); + xfs_alloc_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1); xfs_trans_agbtree_delta(cur->bc_tp, -1); return 0; } @@ -125,6 +127,7 @@ xfs_allocbt_update_lastrec( { struct xfs_agf *agf = XFS_BUF_TO_AGF(cur->bc_private.a.agbp); xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); + struct xfs_perag *pag; __be32 len; int numrecs; @@ -168,7 +171,9 @@ xfs_allocbt_update_lastrec( } agf->agf_longest = len; - cur->bc_mp->m_perag[seqno].pagf_longest = be32_to_cpu(len); + pag = xfs_perag_get(cur->bc_mp, seqno); + pag->pagf_longest = be32_to_cpu(len); + xfs_perag_put(pag); xfs_alloc_log_agf(cur->bc_tp, cur->bc_private.a.agbp, XFS_AGF_LONGEST); } @@ -255,38 +260,6 @@ xfs_allocbt_key_diff( return (__int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; } -STATIC int -xfs_allocbt_kill_root( - struct xfs_btree_cur *cur, - struct xfs_buf *bp, - int level, - union xfs_btree_ptr *newroot) -{ - int error; - - XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); - XFS_BTREE_STATS_INC(cur, killroot); - - /* - * Update the root pointer, decreasing the level by 1 and then - * free the old root. - */ - xfs_allocbt_set_root(cur, newroot, -1); - error = xfs_allocbt_free_block(cur, bp); - if (error) { - XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); - return error; - } - - XFS_BTREE_STATS_INC(cur, free); - - xfs_btree_setbuf(cur, level, NULL); - cur->bc_nlevels--; - - XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); - return 0; -} - #ifdef DEBUG STATIC int xfs_allocbt_keys_inorder( @@ -398,7 +371,6 @@ static const struct xfs_btree_ops xfs_allocbt_ops = { .dup_cursor = xfs_allocbt_dup_cursor, .set_root = xfs_allocbt_set_root, - .kill_root = xfs_allocbt_kill_root, .alloc_block = xfs_allocbt_alloc_block, .free_block = xfs_allocbt_free_block, .update_lastrec = xfs_allocbt_update_lastrec, diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index 7ab37ff..aaeaec4 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -60,12 +60,12 @@ STATIC int xfs_attr_rmtval_remove(xfs_da_args_t *args); STATIC int xfs_attr_name_to_xname( struct xfs_name *xname, - const char *aname) + const unsigned char *aname) { if (!aname) return EINVAL; xname->name = aname; - xname->len = strlen(aname); + xname->len = strlen((char *)aname); if (xname->len >= MAXNAMELEN) return EFAULT; /* match IRIX behaviour */ @@ -87,9 +87,13 @@ xfs_inode_hasattr( * Overall external interface routines. *========================================================================*/ -int -xfs_attr_fetch(xfs_inode_t *ip, struct xfs_name *name, - char *value, int *valuelenp, int flags) +STATIC int +xfs_attr_get_int( + struct xfs_inode *ip, + struct xfs_name *name, + unsigned char *value, + int *valuelenp, + int flags) { xfs_da_args_t args; int error; @@ -134,8 +138,8 @@ xfs_attr_fetch(xfs_inode_t *ip, struct xfs_name *name, int xfs_attr_get( xfs_inode_t *ip, - const char *name, - char *value, + const unsigned char *name, + unsigned char *value, int *valuelenp, int flags) { @@ -152,7 +156,7 @@ xfs_attr_get( return error; xfs_ilock(ip, XFS_ILOCK_SHARED); - error = xfs_attr_fetch(ip, &xname, value, valuelenp, flags); + error = xfs_attr_get_int(ip, &xname, value, valuelenp, flags); xfs_iunlock(ip, XFS_ILOCK_SHARED); return(error); } @@ -160,7 +164,7 @@ xfs_attr_get( /* * Calculate how many blocks we need for the new attribute, */ -int +STATIC int xfs_attr_calc_size( struct xfs_inode *ip, int namelen, @@ -198,8 +202,12 @@ xfs_attr_calc_size( } STATIC int -xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, - char *value, int valuelen, int flags) +xfs_attr_set_int( + struct xfs_inode *dp, + struct xfs_name *name, + unsigned char *value, + int valuelen, + int flags) { xfs_da_args_t args; xfs_fsblock_t firstblock; @@ -212,8 +220,9 @@ xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, /* * Attach the dquots to the inode. */ - if ((error = XFS_QM_DQATTACH(mp, dp, 0))) - return (error); + error = xfs_qm_dqattach(dp, 0); + if (error) + return error; /* * If the inode doesn't have an attribute fork, add one. @@ -274,7 +283,7 @@ xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, } xfs_ilock(dp, XFS_ILOCK_EXCL); - error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, args.trans, dp, args.total, 0, + error = xfs_trans_reserve_quota_nblks(args.trans, dp, args.total, 0, rsvd ? XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES : XFS_QMOPT_RES_REGBLKS); if (error) { @@ -320,16 +329,15 @@ xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, if (mp->m_flags & XFS_MOUNT_WSYNC) { xfs_trans_set_sync(args.trans); } + + if (!error && (flags & ATTR_KERNOTIME) == 0) { + xfs_trans_ichgtime(args.trans, dp, + XFS_ICHGTIME_CHG); + } err2 = xfs_trans_commit(args.trans, XFS_TRANS_RELEASE_LOG_RES); xfs_iunlock(dp, XFS_ILOCK_EXCL); - /* - * Hit the inode change time. - */ - if (!error && (flags & ATTR_KERNOTIME) == 0) { - xfs_ichgtime(dp, XFS_ICHGTIME_CHG); - } return(error == 0 ? err2 : error); } @@ -337,7 +345,7 @@ xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, * It won't fit in the shortform, transform to a leaf block. * GROT: another possible req'mt for a double-split btree op. */ - XFS_BMAP_INIT(args.flist, args.firstblock); + xfs_bmap_init(args.flist, args.firstblock); error = xfs_attr_shortform_to_leaf(&args); if (!error) { error = xfs_bmap_finish(&args.trans, args.flist, @@ -387,6 +395,9 @@ xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, xfs_trans_set_sync(args.trans); } + if ((flags & ATTR_KERNOTIME) == 0) + xfs_trans_ichgtime(args.trans, dp, XFS_ICHGTIME_CHG); + /* * Commit the last in the sequence of transactions. */ @@ -394,13 +405,6 @@ xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, error = xfs_trans_commit(args.trans, XFS_TRANS_RELEASE_LOG_RES); xfs_iunlock(dp, XFS_ILOCK_EXCL); - /* - * Hit the inode change time. - */ - if (!error && (flags & ATTR_KERNOTIME) == 0) { - xfs_ichgtime(dp, XFS_ICHGTIME_CHG); - } - return(error); out: @@ -414,8 +418,8 @@ out: int xfs_attr_set( xfs_inode_t *dp, - const char *name, - char *value, + const unsigned char *name, + unsigned char *value, int valuelen, int flags) { @@ -464,8 +468,9 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) /* * Attach the dquots to the inode. */ - if ((error = XFS_QM_DQATTACH(mp, dp, 0))) - return (error); + error = xfs_qm_dqattach(dp, 0); + if (error) + return error; /* * Start our first transaction of the day. @@ -534,6 +539,9 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) xfs_trans_set_sync(args.trans); } + if ((flags & ATTR_KERNOTIME) == 0) + xfs_trans_ichgtime(args.trans, dp, XFS_ICHGTIME_CHG); + /* * Commit the last in the sequence of transactions. */ @@ -541,13 +549,6 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) error = xfs_trans_commit(args.trans, XFS_TRANS_RELEASE_LOG_RES); xfs_iunlock(dp, XFS_ILOCK_EXCL); - /* - * Hit the inode change time. - */ - if (!error && (flags & ATTR_KERNOTIME) == 0) { - xfs_ichgtime(dp, XFS_ICHGTIME_CHG); - } - return(error); out: @@ -561,7 +562,7 @@ out: int xfs_attr_remove( xfs_inode_t *dp, - const char *name, + const unsigned char *name, int flags) { int error; @@ -586,7 +587,6 @@ xfs_attr_remove( return xfs_attr_remove_int(dp, &xname, flags); } - /*======================================================================== * External routines when attribute list is inside the inode *========================================================================*/ @@ -686,7 +686,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * Commit that transaction so that the node_addname() call * can manage its own transactions. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_node(args); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -787,7 +787,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * If the result is small enough, shrink it all into the inode. */ if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { @@ -865,7 +865,7 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) * If the result is small enough, shrink it all into the inode. */ if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { @@ -924,7 +924,6 @@ xfs_attr_leaf_get(xfs_da_args_t *args) return(error); } - /*======================================================================== * External routines when attribute list size > XFS_LBSIZE(mp). *========================================================================*/ @@ -992,7 +991,7 @@ restart: * have been a b-tree. */ xfs_da_state_free(state); - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_node(args); if (!error) { error = xfs_bmap_finish(&args->trans, @@ -1033,7 +1032,7 @@ restart: * in the index/blkno/rmtblkno/rmtblkcnt fields and * in the index2/blkno2/rmtblkno2/rmtblkcnt2 fields. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_da_split(state); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -1145,7 +1144,7 @@ restart: * Check to see if the tree needs to be collapsed. */ if (retval && (state->path.active > 1)) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_da_join(state); if (!error) { error = xfs_bmap_finish(&args->trans, @@ -1281,7 +1280,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) * Check to see if the tree needs to be collapsed. */ if (retval && (state->path.active > 1)) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_da_join(state); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -1332,7 +1331,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) == XFS_ATTR_LEAF_MAGIC); if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { @@ -1522,7 +1521,6 @@ xfs_attr_node_get(xfs_da_args_t *args) return(retval); } - /*======================================================================== * External routines for manipulating out-of-line attribute values. *========================================================================*/ @@ -1537,7 +1535,7 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) xfs_bmbt_irec_t map[ATTR_RMTVALUE_MAPSIZE]; xfs_mount_t *mp; xfs_daddr_t dblkno; - xfs_caddr_t dst; + void *dst; xfs_buf_t *bp; int nmap, error, tmp, valuelen, blkcnt, i; xfs_dablk_t lblkno; @@ -1553,7 +1551,7 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) error = xfs_bmapi(args->trans, args->dp, (xfs_fileoff_t)lblkno, args->rmtblkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - NULL, 0, map, &nmap, NULL, NULL); + NULL, 0, map, &nmap, NULL); if (error) return(error); ASSERT(nmap >= 1); @@ -1564,13 +1562,14 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) dblkno = XFS_FSB_TO_DADDR(mp, map[i].br_startblock); blkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount); error = xfs_read_buf(mp, mp->m_ddev_targp, dblkno, - blkcnt, XFS_BUF_LOCK, &bp); + blkcnt, XBF_LOCK | XBF_DONT_BLOCK, + &bp); if (error) return(error); tmp = (valuelen < XFS_BUF_SIZE(bp)) ? valuelen : XFS_BUF_SIZE(bp); - xfs_biomove(bp, 0, tmp, dst, XFS_B_READ); + xfs_buf_iomove(bp, 0, tmp, dst, XBRW_READ); xfs_buf_relse(bp); dst += tmp; valuelen -= tmp; @@ -1594,7 +1593,7 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) xfs_inode_t *dp; xfs_bmbt_irec_t map; xfs_daddr_t dblkno; - xfs_caddr_t src; + void *src; xfs_buf_t *bp; xfs_dablk_t lblkno; int blkcnt, valuelen, nmap, error, tmp, committed; @@ -1624,14 +1623,14 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) /* * Allocate a single extent, up to the size of the value. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); nmap = 1; error = xfs_bmapi(args->trans, dp, (xfs_fileoff_t)lblkno, blkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA | XFS_BMAPI_WRITE, args->firstblock, args->total, &map, &nmap, - args->flist, NULL); + args->flist); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, &committed); @@ -1678,13 +1677,13 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) /* * Try to remember where we decided to put the value. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); nmap = 1; error = xfs_bmapi(NULL, dp, (xfs_fileoff_t)lblkno, args->rmtblkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, args->firstblock, 0, &map, &nmap, - NULL, NULL); + NULL); if (error) { return(error); } @@ -1695,16 +1694,16 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock), blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); - bp = xfs_buf_get_flags(mp->m_ddev_targp, dblkno, - blkcnt, XFS_BUF_LOCK); + bp = xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, + XBF_LOCK | XBF_DONT_BLOCK); ASSERT(bp); ASSERT(!XFS_BUF_GETERROR(bp)); tmp = (valuelen < XFS_BUF_SIZE(bp)) ? valuelen : XFS_BUF_SIZE(bp); - xfs_biomove(bp, 0, tmp, src, XFS_B_WRITE); + xfs_buf_iomove(bp, 0, tmp, src, XBRW_WRITE); if (tmp < XFS_BUF_SIZE(bp)) - xfs_biozero(bp, tmp, XFS_BUF_SIZE(bp) - tmp); + xfs_buf_zero(bp, tmp, XFS_BUF_SIZE(bp) - tmp); if ((error = xfs_bwrite(mp, bp))) {/* GROT: NOTE: synchronous write */ return (error); } @@ -1743,13 +1742,13 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) /* * Try to remember where we decided to put the value. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); nmap = 1; error = xfs_bmapi(NULL, args->dp, (xfs_fileoff_t)lblkno, args->rmtblkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, args->firstblock, 0, &map, &nmap, - args->flist, NULL); + args->flist); if (error) { return(error); } @@ -1763,8 +1762,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) /* * If the "remote" value is in the cache, remove it. */ - bp = xfs_incore(mp->m_ddev_targp, dblkno, blkcnt, - XFS_INCORE_TRYLOCK); + bp = xfs_incore(mp->m_ddev_targp, dblkno, blkcnt, XBF_TRYLOCK); if (bp) { XFS_BUF_STALE(bp); XFS_BUF_UNDELAYWRITE(bp); @@ -1784,11 +1782,11 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) blkcnt = args->rmtblkcnt; done = 0; while (!done) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_bunmapi(args->trans, args->dp, lblkno, blkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, 1, args->firstblock, args->flist, - NULL, &done); + &done); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, &committed); diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index f8f926f..d1f7a20 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -45,6 +45,7 @@ STATIC int xfs_attr_leaf_figure_balance(xfs_da_state_t *state, int *number_entries_in_blk1, int *number_usedbytes_in_blk1); + /* * Utility routines. */ @@ -63,7 +64,7 @@ STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index); * If namespace bits don't match return 0. * If all match then return 1. */ -STATIC_INLINE int +STATIC int xfs_attr_namesp_match(int arg_flags, int ondisk_flags) { return XFS_ATTR_NSP_ONDISK(ondisk_flags) == XFS_ATTR_NSP_ARGS_TO_ONDISK(arg_flags); @@ -120,7 +121,8 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) * minimum offset only needs to be the space required for * the btree root. */ - if (!dp->i_d.di_forkoff && dp->i_df.if_bytes > mp->m_attroffset) + if (!dp->i_d.di_forkoff && dp->i_df.if_bytes > + xfs_default_attroffset(dp)) dsize = XFS_BMDR_SPACE_CALC(MINDBTPTRS); break; @@ -263,6 +265,26 @@ xfs_attr_shortform_add(xfs_da_args_t *args, int forkoff) } /* + * After the last attribute is removed revert to original inode format, + * making all literal area available to the data fork once more. + */ +STATIC void +xfs_attr_fork_reset( + struct xfs_inode *ip, + struct xfs_trans *tp) +{ + xfs_idestroy_fork(ip, XFS_ATTR_FORK); + ip->i_d.di_forkoff = 0; + ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; + + ASSERT(ip->i_d.di_anextents == 0); + ASSERT(ip->i_afp == NULL); + + ip->i_df.if_ext_max = XFS_IFORK_DSIZE(ip) / sizeof(xfs_bmbt_rec_t); + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); +} + +/* * Remove an attribute from the shortform attribute list structure. */ int @@ -309,22 +331,10 @@ xfs_attr_shortform_remove(xfs_da_args_t *args) */ totsize -= size; if (totsize == sizeof(xfs_attr_sf_hdr_t) && - !(args->op_flags & XFS_DA_OP_ADDNAME) && - (mp->m_flags & XFS_MOUNT_ATTR2) && - (dp->i_d.di_format != XFS_DINODE_FMT_BTREE)) { - /* - * Last attribute now removed, revert to original - * inode format making all literal area available - * to the data fork once more. - */ - xfs_idestroy_fork(dp, XFS_ATTR_FORK); - dp->i_d.di_forkoff = 0; - dp->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; - ASSERT(dp->i_d.di_anextents == 0); - ASSERT(dp->i_afp == NULL); - dp->i_df.if_ext_max = - XFS_IFORK_DSIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); - xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE); + (mp->m_flags & XFS_MOUNT_ATTR2) && + (dp->i_d.di_format != XFS_DINODE_FMT_BTREE) && + !(args->op_flags & XFS_DA_OP_ADDNAME)) { + xfs_attr_fork_reset(dp, args->trans); } else { xfs_idata_realloc(dp, -size, XFS_ATTR_FORK); dp->i_d.di_forkoff = xfs_attr_shortform_bytesfit(dp, totsize); @@ -476,11 +486,11 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) sfe = &sf->list[0]; for (i = 0; i < sf->hdr.count; i++) { - nargs.name = (char *)sfe->nameval; + nargs.name = sfe->nameval; nargs.namelen = sfe->namelen; - nargs.value = (char *)&sfe->nameval[nargs.namelen]; + nargs.value = &sfe->nameval[nargs.namelen]; nargs.valuelen = sfe->valuelen; - nargs.hashval = xfs_da_hashname((char *)sfe->nameval, + nargs.hashval = xfs_da_hashname(sfe->nameval, sfe->namelen); nargs.flags = XFS_ATTR_NSP_ONDISK_TO_ARGS(sfe->flags); error = xfs_attr_leaf_lookup_int(bp, &nargs); /* set a->index */ @@ -522,7 +532,7 @@ xfs_attr_shortform_allfit(xfs_dabuf_t *bp, xfs_inode_t *dp) continue; /* don't copy partial entries */ if (!(entry->flags & XFS_ATTR_LOCAL)) return(0); - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, i); + name_loc = xfs_attr_leaf_name_local(leaf, i); if (name_loc->namelen >= XFS_ATTR_SF_ENTSIZE_MAX) return(0); if (be16_to_cpu(name_loc->valuelen) >= XFS_ATTR_SF_ENTSIZE_MAX) @@ -572,20 +582,7 @@ xfs_attr_leaf_to_shortform(xfs_dabuf_t *bp, xfs_da_args_t *args, int forkoff) if (forkoff == -1) { ASSERT(dp->i_mount->m_flags & XFS_MOUNT_ATTR2); ASSERT(dp->i_d.di_format != XFS_DINODE_FMT_BTREE); - - /* - * Last attribute was removed, revert to original - * inode format making all literal area available - * to the data fork once more. - */ - xfs_idestroy_fork(dp, XFS_ATTR_FORK); - dp->i_d.di_forkoff = 0; - dp->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; - ASSERT(dp->i_d.di_anextents == 0); - ASSERT(dp->i_afp == NULL); - dp->i_df.if_ext_max = - XFS_IFORK_DSIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); - xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE); + xfs_attr_fork_reset(dp, args->trans); goto out; } @@ -609,10 +606,10 @@ xfs_attr_leaf_to_shortform(xfs_dabuf_t *bp, xfs_da_args_t *args, int forkoff) if (!entry->nameidx) continue; ASSERT(entry->flags & XFS_ATTR_LOCAL); - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, i); - nargs.name = (char *)name_loc->nameval; + name_loc = xfs_attr_leaf_name_local(leaf, i); + nargs.name = name_loc->nameval; nargs.namelen = name_loc->namelen; - nargs.value = (char *)&name_loc->nameval[nargs.namelen]; + nargs.value = &name_loc->nameval[nargs.namelen]; nargs.valuelen = be16_to_cpu(name_loc->valuelen); nargs.hashval = be32_to_cpu(entry->hashval); nargs.flags = XFS_ATTR_NSP_ONDISK_TO_ARGS(entry->flags); @@ -927,14 +924,14 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int mapindex) * as part of this transaction (a split operation for example). */ if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, args->index); + name_loc = xfs_attr_leaf_name_local(leaf, args->index); name_loc->namelen = args->namelen; name_loc->valuelen = cpu_to_be16(args->valuelen); memcpy((char *)name_loc->nameval, args->name, args->namelen); memcpy((char *)&name_loc->nameval[args->namelen], args->value, be16_to_cpu(name_loc->valuelen)); } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); name_rmt->namelen = args->namelen; memcpy((char *)name_rmt->name, args->name, args->namelen); entry->flags |= XFS_ATTR_INCOMPLETE; @@ -945,7 +942,7 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int mapindex) args->rmtblkcnt = XFS_B_TO_FSB(mp, args->valuelen); } xfs_da_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, XFS_ATTR_LEAF_NAME(leaf, args->index), + XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), xfs_attr_leaf_entsize(leaf, args->index))); /* @@ -1535,10 +1532,10 @@ xfs_attr_leaf_remove(xfs_dabuf_t *bp, xfs_da_args_t *args) /* * Compress the remaining entries and zero out the removed stuff. */ - memset(XFS_ATTR_LEAF_NAME(leaf, args->index), 0, entsize); + memset(xfs_attr_leaf_name(leaf, args->index), 0, entsize); be16_add_cpu(&hdr->usedbytes, -entsize); xfs_da_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, XFS_ATTR_LEAF_NAME(leaf, args->index), + XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), entsize)); tmp = (be16_to_cpu(hdr->count) - args->index) @@ -1771,7 +1768,7 @@ xfs_attr_leaf_lookup_int(xfs_dabuf_t *bp, xfs_da_args_t *args) continue; } if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, probe); + name_loc = xfs_attr_leaf_name_local(leaf, probe); if (name_loc->namelen != args->namelen) continue; if (memcmp(args->name, (char *)name_loc->nameval, args->namelen) != 0) @@ -1781,7 +1778,7 @@ xfs_attr_leaf_lookup_int(xfs_dabuf_t *bp, xfs_da_args_t *args) args->index = probe; return(XFS_ERROR(EEXIST)); } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, probe); + name_rmt = xfs_attr_leaf_name_remote(leaf, probe); if (name_rmt->namelen != args->namelen) continue; if (memcmp(args->name, (char *)name_rmt->name, @@ -1821,7 +1818,7 @@ xfs_attr_leaf_getvalue(xfs_dabuf_t *bp, xfs_da_args_t *args) entry = &leaf->entries[args->index]; if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, args->index); + name_loc = xfs_attr_leaf_name_local(leaf, args->index); ASSERT(name_loc->namelen == args->namelen); ASSERT(memcmp(args->name, name_loc->nameval, args->namelen) == 0); valuelen = be16_to_cpu(name_loc->valuelen); @@ -1836,7 +1833,7 @@ xfs_attr_leaf_getvalue(xfs_dabuf_t *bp, xfs_da_args_t *args) args->valuelen = valuelen; memcpy(args->value, &name_loc->nameval[args->namelen], valuelen); } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); ASSERT(name_rmt->namelen == args->namelen); ASSERT(memcmp(args->name, name_rmt->name, args->namelen) == 0); valuelen = be32_to_cpu(name_rmt->valuelen); @@ -1929,7 +1926,7 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, * off for 6.2, should be revisited later. */ if (entry_s->flags & XFS_ATTR_INCOMPLETE) { /* skip partials? */ - memset(XFS_ATTR_LEAF_NAME(leaf_s, start_s + i), 0, tmp); + memset(xfs_attr_leaf_name(leaf_s, start_s + i), 0, tmp); be16_add_cpu(&hdr_s->usedbytes, -tmp); be16_add_cpu(&hdr_s->count, -1); entry_d--; /* to compensate for ++ in loop hdr */ @@ -1946,11 +1943,11 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, entry_d->flags = entry_s->flags; ASSERT(be16_to_cpu(entry_d->nameidx) + tmp <= XFS_LBSIZE(mp)); - memmove(XFS_ATTR_LEAF_NAME(leaf_d, desti), - XFS_ATTR_LEAF_NAME(leaf_s, start_s + i), tmp); + memmove(xfs_attr_leaf_name(leaf_d, desti), + xfs_attr_leaf_name(leaf_s, start_s + i), tmp); ASSERT(be16_to_cpu(entry_s->nameidx) + tmp <= XFS_LBSIZE(mp)); - memset(XFS_ATTR_LEAF_NAME(leaf_s, start_s + i), 0, tmp); + memset(xfs_attr_leaf_name(leaf_s, start_s + i), 0, tmp); be16_add_cpu(&hdr_s->usedbytes, -tmp); be16_add_cpu(&hdr_d->usedbytes, tmp); be16_add_cpu(&hdr_s->count, -1); @@ -2062,12 +2059,12 @@ xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index) ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); if (leaf->entries[index].flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, index); - size = XFS_ATTR_LEAF_ENTSIZE_LOCAL(name_loc->namelen, + name_loc = xfs_attr_leaf_name_local(leaf, index); + size = xfs_attr_leaf_entsize_local(name_loc->namelen, be16_to_cpu(name_loc->valuelen)); } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, index); - size = XFS_ATTR_LEAF_ENTSIZE_REMOTE(name_rmt->namelen); + name_rmt = xfs_attr_leaf_name_remote(leaf, index); + size = xfs_attr_leaf_entsize_remote(name_rmt->namelen); } return(size); } @@ -2083,13 +2080,13 @@ xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int *local) { int size; - size = XFS_ATTR_LEAF_ENTSIZE_LOCAL(namelen, valuelen); - if (size < XFS_ATTR_LEAF_ENTSIZE_LOCAL_MAX(blocksize)) { + size = xfs_attr_leaf_entsize_local(namelen, valuelen); + if (size < xfs_attr_leaf_entsize_local_max(blocksize)) { if (local) { *local = 1; } } else { - size = XFS_ATTR_LEAF_ENTSIZE_REMOTE(namelen); + size = xfs_attr_leaf_entsize_remote(namelen); if (local) { *local = 0; } @@ -2137,11 +2134,11 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) #ifdef DEBUG if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, args->index); + name_loc = xfs_attr_leaf_name_local(leaf, args->index); namelen = name_loc->namelen; name = (char *)name_loc->nameval; } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); namelen = name_rmt->namelen; name = (char *)name_rmt->name; } @@ -2156,7 +2153,7 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) if (args->rmtblkno) { ASSERT((entry->flags & XFS_ATTR_LOCAL) == 0); - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); name_rmt->valueblk = cpu_to_be32(args->rmtblkno); name_rmt->valuelen = cpu_to_be32(args->valuelen); xfs_da_log_buf(args->trans, bp, @@ -2203,7 +2200,7 @@ xfs_attr_leaf_setflag(xfs_da_args_t *args) xfs_da_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); if ((entry->flags & XFS_ATTR_LOCAL) == 0) { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); name_rmt->valueblk = 0; name_rmt->valuelen = 0; xfs_da_log_buf(args->trans, bp, @@ -2276,20 +2273,20 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) #ifdef DEBUG if (entry1->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf1, args->index); + name_loc = xfs_attr_leaf_name_local(leaf1, args->index); namelen1 = name_loc->namelen; name1 = (char *)name_loc->nameval; } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf1, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf1, args->index); namelen1 = name_rmt->namelen; name1 = (char *)name_rmt->name; } if (entry2->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf2, args->index2); + name_loc = xfs_attr_leaf_name_local(leaf2, args->index2); namelen2 = name_loc->namelen; name2 = (char *)name_loc->nameval; } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf2, args->index2); + name_rmt = xfs_attr_leaf_name_remote(leaf2, args->index2); namelen2 = name_rmt->namelen; name2 = (char *)name_rmt->name; } @@ -2306,7 +2303,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) XFS_DA_LOGRANGE(leaf1, entry1, sizeof(*entry1))); if (args->rmtblkno) { ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0); - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf1, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf1, args->index); name_rmt->valueblk = cpu_to_be32(args->rmtblkno); name_rmt->valuelen = cpu_to_be32(args->valuelen); xfs_da_log_buf(args->trans, bp1, @@ -2317,7 +2314,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) xfs_da_log_buf(args->trans, bp2, XFS_DA_LOGRANGE(leaf2, entry2, sizeof(*entry2))); if ((entry2->flags & XFS_ATTR_LOCAL) == 0) { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf2, args->index2); + name_rmt = xfs_attr_leaf_name_remote(leaf2, args->index2); name_rmt->valueblk = 0; name_rmt->valuelen = 0; xfs_da_log_buf(args->trans, bp2, diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index cf1123a..5a626b0 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -65,7 +65,6 @@ xfs_bmap_add_extent( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd); /* OK to allocate reserved blocks */ @@ -83,7 +82,6 @@ xfs_bmap_add_extent_delay_real( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd); /* OK to allocate reserved blocks */ /* @@ -96,7 +94,6 @@ xfs_bmap_add_extent_hole_delay( xfs_extnum_t idx, /* extent number to update/insert */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp,/* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd); /* OK to allocate reserved blocks */ /* @@ -110,7 +107,6 @@ xfs_bmap_add_extent_hole_real( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork); /* data or attr fork */ /* @@ -123,8 +119,7 @@ xfs_bmap_add_extent_unwritten_real( xfs_extnum_t idx, /* extent number to update/insert */ xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta); /* Change made to incore extents */ + int *logflagsp); /* inode logging flags */ /* * xfs_bmap_alloc is called by xfs_bmapi to allocate an extent for a file. @@ -161,23 +156,10 @@ xfs_bmap_del_extent( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp,/* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd); /* OK to allocate reserved blocks */ /* - * Remove the entry "free" from the free item list. Prev points to the - * previous entry, unless "free" is the head of the list. - * - * Note: this requires user-space public scope for libxfs_iread - */ -void -xfs_bmap_del_free( - xfs_bmap_free_t *flist, /* free item list header */ - xfs_bmap_free_item_t *prev, /* previous item on list, if any */ - xfs_bmap_free_item_t *free); /* list item to be freed */ - -/* * Convert an extents-format file into a btree-format file. * The new file will have a root block (in the inode) and a single child block. */ @@ -219,71 +201,6 @@ xfs_bmap_isaeof( int whichfork, /* data or attribute fork */ char *aeof); /* return value */ -#ifdef XFS_BMAP_TRACE -/* - * Add bmap trace entry prior to a call to xfs_iext_remove. - */ -STATIC void -xfs_bmap_trace_delete( - const char *fname, /* function name */ - char *desc, /* operation description */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* index of entry(entries) deleted */ - xfs_extnum_t cnt, /* count of entries deleted, 1 or 2 */ - int whichfork); /* data or attr fork */ - -/* - * Add bmap trace entry prior to a call to xfs_iext_insert, or - * reading in the extents list from the disk (in the btree). - */ -STATIC void -xfs_bmap_trace_insert( - const char *fname, /* function name */ - char *desc, /* operation description */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* index of entry(entries) inserted */ - xfs_extnum_t cnt, /* count of entries inserted, 1 or 2 */ - xfs_bmbt_irec_t *r1, /* inserted record 1 */ - xfs_bmbt_irec_t *r2, /* inserted record 2 or null */ - int whichfork); /* data or attr fork */ - -/* - * Add bmap trace entry after updating an extent record in place. - */ -STATIC void -xfs_bmap_trace_post_update( - const char *fname, /* function name */ - char *desc, /* operation description */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* index of entry updated */ - int whichfork); /* data or attr fork */ - -/* - * Add bmap trace entry prior to updating an extent record in place. - */ -STATIC void -xfs_bmap_trace_pre_update( - const char *fname, /* function name */ - char *desc, /* operation description */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* index of entry to be updated */ - int whichfork); /* data or attr fork */ - -#define XFS_BMAP_TRACE_DELETE(d,ip,i,c,w) \ - xfs_bmap_trace_delete(__func__,d,ip,i,c,w) -#define XFS_BMAP_TRACE_INSERT(d,ip,i,c,r1,r2,w) \ - xfs_bmap_trace_insert(__func__,d,ip,i,c,r1,r2,w) -#define XFS_BMAP_TRACE_POST_UPDATE(d,ip,i,w) \ - xfs_bmap_trace_post_update(__func__,d,ip,i,w) -#define XFS_BMAP_TRACE_PRE_UPDATE(d,ip,i,w) \ - xfs_bmap_trace_pre_update(__func__,d,ip,i,w) -#else -#define XFS_BMAP_TRACE_DELETE(d,ip,i,c,w) -#define XFS_BMAP_TRACE_INSERT(d,ip,i,c,r1,r2,w) -#define XFS_BMAP_TRACE_POST_UPDATE(d,ip,i,w) -#define XFS_BMAP_TRACE_PRE_UPDATE(d,ip,i,w) -#endif /* XFS_BMAP_TRACE */ - /* * Compute the worst-case number of indirect blocks that will be used * for ip's delayed extent of length "len". @@ -310,18 +227,28 @@ xfs_bmap_validate_ret( #define xfs_bmap_validate_ret(bno,len,flags,mval,onmap,nmap) #endif /* DEBUG */ -#if defined(XFS_RW_TRACE) +STATIC int +xfs_bmap_count_tree( + xfs_mount_t *mp, + xfs_trans_t *tp, + xfs_ifork_t *ifp, + xfs_fsblock_t blockno, + int levelin, + int *count); + STATIC void -xfs_bunmap_trace( - xfs_inode_t *ip, - xfs_fileoff_t bno, - xfs_filblks_t len, - int flags, - inst_t *ra); -#else -#define xfs_bunmap_trace(ip, bno, len, flags, ra) -#endif /* XFS_RW_TRACE */ +xfs_bmap_count_leaves( + xfs_ifork_t *ifp, + xfs_extnum_t idx, + int numrecs, + int *count); +STATIC void +xfs_bmap_disk_count_leaves( + struct xfs_mount *mp, + struct xfs_btree_block *block, + int numrecs, + int *count); /* * Bmap internal routines. @@ -490,7 +417,6 @@ xfs_bmap_add_extent( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd) /* OK to use reserved data blocks */ { @@ -515,35 +441,26 @@ xfs_bmap_add_extent( * already extents in the list. */ if (nextents == 0) { - XFS_BMAP_TRACE_INSERT("insert empty", ip, 0, 1, new, NULL, - whichfork); - xfs_iext_insert(ifp, 0, 1, new); + xfs_iext_insert(ip, 0, 1, new, + whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0); + ASSERT(cur == NULL); ifp->if_lastex = 0; - if (!ISNULLSTARTBLOCK(new->br_startblock)) { + if (!isnullstartblock(new->br_startblock)) { XFS_IFORK_NEXT_SET(ip, whichfork, 1); - logflags = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); + logflags = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); } else logflags = 0; - /* DELTA: single new extent */ - if (delta) { - if (delta->xed_startoff > new->br_startoff) - delta->xed_startoff = new->br_startoff; - if (delta->xed_blockcount < - new->br_startoff + new->br_blockcount) - delta->xed_blockcount = new->br_startoff + - new->br_blockcount; - } } /* * Any kind of new delayed allocation goes here. */ - else if (ISNULLSTARTBLOCK(new->br_startblock)) { + else if (isnullstartblock(new->br_startblock)) { if (cur) ASSERT((cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL) == 0); if ((error = xfs_bmap_add_extent_hole_delay(ip, idx, new, - &logflags, delta, rsvd))) + &logflags, rsvd))) goto done; } /* @@ -554,7 +471,7 @@ xfs_bmap_add_extent( ASSERT((cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL) == 0); if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, new, - &logflags, delta, whichfork))) + &logflags, whichfork))) goto done; } else { xfs_bmbt_irec_t prev; /* old extent at offset idx */ @@ -569,27 +486,27 @@ xfs_bmap_add_extent( * in a delayed or unwritten allocation with a real one, or * converting real back to unwritten. */ - if (!ISNULLSTARTBLOCK(new->br_startblock) && + if (!isnullstartblock(new->br_startblock) && new->br_startoff + new->br_blockcount > prev.br_startoff) { if (prev.br_state != XFS_EXT_UNWRITTEN && - ISNULLSTARTBLOCK(prev.br_startblock)) { - da_old = STARTBLOCKVAL(prev.br_startblock); + isnullstartblock(prev.br_startblock)) { + da_old = startblockval(prev.br_startblock); if (cur) ASSERT(cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL); if ((error = xfs_bmap_add_extent_delay_real(ip, idx, &cur, new, &da_new, first, flist, - &logflags, delta, rsvd))) + &logflags, rsvd))) goto done; } else if (new->br_state == XFS_EXT_NORM) { ASSERT(new->br_state == XFS_EXT_NORM); if ((error = xfs_bmap_add_extent_unwritten_real( - ip, idx, &cur, new, &logflags, delta))) + ip, idx, &cur, new, &logflags))) goto done; } else { ASSERT(new->br_state == XFS_EXT_UNWRITTEN); if ((error = xfs_bmap_add_extent_unwritten_real( - ip, idx, &cur, new, &logflags, delta))) + ip, idx, &cur, new, &logflags))) goto done; } ASSERT(*curp == cur || *curp == NULL); @@ -602,7 +519,7 @@ xfs_bmap_add_extent( ASSERT((cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL) == 0); if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, - new, &logflags, delta, whichfork))) + new, &logflags, whichfork))) goto done; } } @@ -634,7 +551,7 @@ xfs_bmap_add_extent( nblks += cur->bc_private.b.allocated; ASSERT(nblks <= da_old); if (nblks < da_old) - xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, + xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, (int64_t)(da_old - nblks), rsvd); } /* @@ -667,7 +584,6 @@ xfs_bmap_add_extent_delay_real( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd) /* OK to use reserved data block allocation */ { xfs_btree_cur_t *cur; /* btree cursor */ @@ -684,26 +600,10 @@ xfs_bmap_add_extent_delay_real( xfs_filblks_t temp=0; /* value for dnew calculations */ xfs_filblks_t temp2=0;/* value for dnew calculations */ int tmp_rval; /* partial logging flags */ - enum { /* bit number definitions for state */ - LEFT_CONTIG, RIGHT_CONTIG, - LEFT_FILLING, RIGHT_FILLING, - LEFT_DELAY, RIGHT_DELAY, - LEFT_VALID, RIGHT_VALID - }; #define LEFT r[0] #define RIGHT r[1] #define PREV r[2] -#define MASK(b) (1 << (b)) -#define MASK2(a,b) (MASK(a) | MASK(b)) -#define MASK3(a,b,c) (MASK2(a,b) | MASK(c)) -#define MASK4(a,b,c,d) (MASK3(a,b,c) | MASK(d)) -#define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b))) -#define STATE_TEST(b) (state & MASK(b)) -#define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \ - ((state &= ~MASK(b)), 0)) -#define SWITCH_STATE \ - (state & MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG)) /* * Set up a bunch of variables to make the tests simpler. @@ -715,69 +615,80 @@ xfs_bmap_add_extent_delay_real( new_endoff = new->br_startoff + new->br_blockcount; ASSERT(PREV.br_startoff <= new->br_startoff); ASSERT(PREV.br_startoff + PREV.br_blockcount >= new_endoff); + /* * Set flags determining what part of the previous delayed allocation * extent is being replaced by a real allocation. */ - STATE_SET(LEFT_FILLING, PREV.br_startoff == new->br_startoff); - STATE_SET(RIGHT_FILLING, - PREV.br_startoff + PREV.br_blockcount == new_endoff); + if (PREV.br_startoff == new->br_startoff) + state |= BMAP_LEFT_FILLING; + if (PREV.br_startoff + PREV.br_blockcount == new_endoff) + state |= BMAP_RIGHT_FILLING; + /* * Check and set flags if this segment has a left neighbor. * Don't set contiguous if the combined extent would be too large. */ - if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { + if (idx > 0) { + state |= BMAP_LEFT_VALID; xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); - STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(LEFT.br_startblock)); + + if (isnullstartblock(LEFT.br_startblock)) + state |= BMAP_LEFT_DELAY; } - STATE_SET(LEFT_CONTIG, - STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) && - LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && - LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && - LEFT.br_state == new->br_state && - LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN); + + if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && + LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && + LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && + LEFT.br_state == new->br_state && + LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN) + state |= BMAP_LEFT_CONTIG; + /* * Check and set flags if this segment has a right neighbor. * Don't set contiguous if the combined extent would be too large. * Also check for all-three-contiguous being too large. */ - if (STATE_SET_TEST(RIGHT_VALID, - idx < - ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)) { + if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { + state |= BMAP_RIGHT_VALID; xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); - STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(RIGHT.br_startblock)); + + if (isnullstartblock(RIGHT.br_startblock)) + state |= BMAP_RIGHT_DELAY; } - STATE_SET(RIGHT_CONTIG, - STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) && - new_endoff == RIGHT.br_startoff && - new->br_startblock + new->br_blockcount == - RIGHT.br_startblock && - new->br_state == RIGHT.br_state && - new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN && - ((state & MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING)) != - MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING) || - LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount - <= MAXEXTLEN)); + + if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && + new_endoff == RIGHT.br_startoff && + new->br_startblock + new->br_blockcount == RIGHT.br_startblock && + new->br_state == RIGHT.br_state && + new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN && + ((state & (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | + BMAP_RIGHT_FILLING)) != + (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | + BMAP_RIGHT_FILLING) || + LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount + <= MAXEXTLEN)) + state |= BMAP_RIGHT_CONTIG; + error = 0; /* * Switch out based on the FILLING and CONTIG state bits. */ - switch (SWITCH_STATE) { - - case MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): + switch (state & (BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | + BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG)) { + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | + BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* * Filling in all of a previously delayed allocation extent. * The left and right neighbors are both contiguous with new. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|LC|RC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), LEFT.br_blockcount + PREV.br_blockcount + RIGHT.br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF|LC|RC", ip, idx - 1, - XFS_DATA_FORK); - XFS_BMAP_TRACE_DELETE("LF|RF|LC|RC", ip, idx, 2, XFS_DATA_FORK); - xfs_iext_remove(ifp, idx, 2); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + + xfs_iext_remove(ip, idx, 2, state); ip->i_df.if_lastex = idx - 1; ip->i_d.di_nextents--; if (cur == NULL) @@ -803,27 +714,20 @@ xfs_bmap_add_extent_delay_real( goto done; } *dnew = 0; - /* DELTA: Three in-core extents are replaced by one. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount + - RIGHT.br_blockcount; break; - case MASK3(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: /* * Filling in all of a previously delayed allocation extent. * The left neighbor is contiguous, the right is not. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|LC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), LEFT.br_blockcount + PREV.br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF|LC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + ip->i_df.if_lastex = idx - 1; - XFS_BMAP_TRACE_DELETE("LF|RF|LC", ip, idx, 1, XFS_DATA_FORK); - xfs_iext_remove(ifp, idx, 1); + xfs_iext_remove(ip, idx, 1, state); if (cur == NULL) rval = XFS_ILOG_DEXT; else { @@ -840,25 +744,21 @@ xfs_bmap_add_extent_delay_real( goto done; } *dnew = 0; - /* DELTA: Two in-core extents are replaced by one. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount; break; - case MASK3(LEFT_FILLING, RIGHT_FILLING, RIGHT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* * Filling in all of a previously delayed allocation extent. * The right neighbor is contiguous, the left is not. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|RC", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_startblock(ep, new->br_startblock); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount + RIGHT.br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF|RC", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + ip->i_df.if_lastex = idx; - XFS_BMAP_TRACE_DELETE("LF|RF|RC", ip, idx + 1, 1, XFS_DATA_FORK); - xfs_iext_remove(ifp, idx + 1, 1); + xfs_iext_remove(ip, idx + 1, 1, state); if (cur == NULL) rval = XFS_ILOG_DEXT; else { @@ -875,21 +775,18 @@ xfs_bmap_add_extent_delay_real( goto done; } *dnew = 0; - /* DELTA: Two in-core extents are replaced by one. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount + - RIGHT.br_blockcount; break; - case MASK2(LEFT_FILLING, RIGHT_FILLING): + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: /* * Filling in all of a previously delayed allocation extent. * Neither the left nor right neighbors are contiguous with * the new one. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_startblock(ep, new->br_startblock); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + ip->i_df.if_lastex = idx; ip->i_d.di_nextents++; if (cur == NULL) @@ -907,24 +804,22 @@ xfs_bmap_add_extent_delay_real( XFS_WANT_CORRUPTED_GOTO(i == 1, done); } *dnew = 0; - /* DELTA: The in-core extent described by new changed type. */ - temp = new->br_startoff; - temp2 = new->br_blockcount; break; - case MASK2(LEFT_FILLING, LEFT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: /* * Filling in the first part of a previous delayed allocation. * The left neighbor is contiguous. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|LC", ip, idx - 1, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), LEFT.br_blockcount + new->br_blockcount); xfs_bmbt_set_startoff(ep, PREV.br_startoff + new->br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|LC", ip, idx - 1, XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + temp = PREV.br_blockcount - new->br_blockcount; - XFS_BMAP_TRACE_PRE_UPDATE("LF|LC", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); ip->i_df.if_lastex = idx - 1; if (cur == NULL) @@ -944,28 +839,22 @@ xfs_bmap_add_extent_delay_real( goto done; } temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), - STARTBLOCKVAL(PREV.br_startblock)); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); - XFS_BMAP_TRACE_POST_UPDATE("LF|LC", ip, idx, XFS_DATA_FORK); + startblockval(PREV.br_startblock)); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); *dnew = temp; - /* DELTA: The boundary between two in-core extents moved. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount; break; - case MASK(LEFT_FILLING): + case BMAP_LEFT_FILLING: /* * Filling in the first part of a previous delayed allocation. * The left neighbor is not contiguous. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_startoff(ep, new_endoff); temp = PREV.br_blockcount - new->br_blockcount; xfs_bmbt_set_blockcount(ep, temp); - XFS_BMAP_TRACE_INSERT("LF", ip, idx, 1, new, NULL, - XFS_DATA_FORK); - xfs_iext_insert(ifp, idx, 1, new); + xfs_iext_insert(ip, idx, 1, new, state); ip->i_df.if_lastex = idx; ip->i_d.di_nextents++; if (cur == NULL) @@ -992,31 +881,28 @@ xfs_bmap_add_extent_delay_real( goto done; } temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), - STARTBLOCKVAL(PREV.br_startblock) - + startblockval(PREV.br_startblock) - (cur ? cur->bc_private.b.allocated : 0)); ep = xfs_iext_get_ext(ifp, idx + 1); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); - XFS_BMAP_TRACE_POST_UPDATE("LF", ip, idx + 1, XFS_DATA_FORK); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); *dnew = temp; - /* DELTA: One in-core extent is split in two. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; - case MASK2(RIGHT_FILLING, RIGHT_CONTIG): + case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* * Filling in the last part of a previous delayed allocation. * The right neighbor is contiguous with the new allocation. */ temp = PREV.br_blockcount - new->br_blockcount; - XFS_BMAP_TRACE_PRE_UPDATE("RF|RC", ip, idx, XFS_DATA_FORK); - XFS_BMAP_TRACE_PRE_UPDATE("RF|RC", ip, idx + 1, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, idx + 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, idx + 1), new->br_startoff, new->br_startblock, new->br_blockcount + RIGHT.br_blockcount, RIGHT.br_state); - XFS_BMAP_TRACE_POST_UPDATE("RF|RC", ip, idx + 1, XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); ip->i_df.if_lastex = idx + 1; if (cur == NULL) rval = XFS_ILOG_DEXT; @@ -1035,27 +921,21 @@ xfs_bmap_add_extent_delay_real( goto done; } temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), - STARTBLOCKVAL(PREV.br_startblock)); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); - XFS_BMAP_TRACE_POST_UPDATE("RF|RC", ip, idx, XFS_DATA_FORK); + startblockval(PREV.br_startblock)); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); *dnew = temp; - /* DELTA: The boundary between two in-core extents moved. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount + - RIGHT.br_blockcount; break; - case MASK(RIGHT_FILLING): + case BMAP_RIGHT_FILLING: /* * Filling in the last part of a previous delayed allocation. * The right neighbor is not contiguous. */ temp = PREV.br_blockcount - new->br_blockcount; - XFS_BMAP_TRACE_PRE_UPDATE("RF", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); - XFS_BMAP_TRACE_INSERT("RF", ip, idx + 1, 1, new, NULL, - XFS_DATA_FORK); - xfs_iext_insert(ifp, idx + 1, 1, new); + xfs_iext_insert(ip, idx + 1, 1, new, state); ip->i_df.if_lastex = idx + 1; ip->i_d.di_nextents++; if (cur == NULL) @@ -1082,15 +962,12 @@ xfs_bmap_add_extent_delay_real( goto done; } temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), - STARTBLOCKVAL(PREV.br_startblock) - + startblockval(PREV.br_startblock) - (cur ? cur->bc_private.b.allocated : 0)); ep = xfs_iext_get_ext(ifp, idx); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); - XFS_BMAP_TRACE_POST_UPDATE("RF", ip, idx, XFS_DATA_FORK); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); *dnew = temp; - /* DELTA: One in-core extent is split in two. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; case 0: @@ -1100,7 +977,7 @@ xfs_bmap_add_extent_delay_real( * This case is avoided almost all the time. */ temp = new->br_startoff - PREV.br_startoff; - XFS_BMAP_TRACE_PRE_UPDATE("0", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); r[0] = *new; r[1].br_state = PREV.br_state; @@ -1108,9 +985,7 @@ xfs_bmap_add_extent_delay_real( r[1].br_startoff = new_endoff; temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; r[1].br_blockcount = temp2; - XFS_BMAP_TRACE_INSERT("0", ip, idx + 1, 2, &r[0], &r[1], - XFS_DATA_FORK); - xfs_iext_insert(ifp, idx + 1, 2, &r[0]); + xfs_iext_insert(ip, idx + 1, 2, &r[0], state); ip->i_df.if_lastex = idx + 1; ip->i_d.di_nextents++; if (cur == NULL) @@ -1138,10 +1013,11 @@ xfs_bmap_add_extent_delay_real( } temp = xfs_bmap_worst_indlen(ip, temp); temp2 = xfs_bmap_worst_indlen(ip, temp2); - diff = (int)(temp + temp2 - STARTBLOCKVAL(PREV.br_startblock) - + diff = (int)(temp + temp2 - startblockval(PREV.br_startblock) - (cur ? cur->bc_private.b.allocated : 0)); if (diff > 0 && - xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, -((int64_t)diff), rsvd)) { + xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, + -((int64_t)diff), rsvd)) { /* * Ick gross gag me with a spoon. */ @@ -1151,67 +1027,51 @@ xfs_bmap_add_extent_delay_real( temp--; diff--; if (!diff || - !xfs_mod_incore_sb(ip->i_mount, - XFS_SBS_FDBLOCKS, -((int64_t)diff), rsvd)) + !xfs_icsb_modify_counters(ip->i_mount, + XFS_SBS_FDBLOCKS, + -((int64_t)diff), rsvd)) break; } if (temp2) { temp2--; diff--; if (!diff || - !xfs_mod_incore_sb(ip->i_mount, - XFS_SBS_FDBLOCKS, -((int64_t)diff), rsvd)) + !xfs_icsb_modify_counters(ip->i_mount, + XFS_SBS_FDBLOCKS, + -((int64_t)diff), rsvd)) break; } } } ep = xfs_iext_get_ext(ifp, idx); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); - XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx, XFS_DATA_FORK); - XFS_BMAP_TRACE_PRE_UPDATE("0", ip, idx + 2, XFS_DATA_FORK); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, idx + 2, state, _THIS_IP_); xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx + 2), - NULLSTARTBLOCK((int)temp2)); - XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx + 2, XFS_DATA_FORK); + nullstartblock((int)temp2)); + trace_xfs_bmap_post_update(ip, idx + 2, state, _THIS_IP_); *dnew = temp + temp2; - /* DELTA: One in-core extent is split in three. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; - case MASK3(LEFT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): - case MASK3(RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): - case MASK2(LEFT_FILLING, RIGHT_CONTIG): - case MASK2(RIGHT_FILLING, LEFT_CONTIG): - case MASK2(LEFT_CONTIG, RIGHT_CONTIG): - case MASK(LEFT_CONTIG): - case MASK(RIGHT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_LEFT_FILLING | BMAP_RIGHT_CONTIG: + case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: + case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_LEFT_CONTIG: + case BMAP_RIGHT_CONTIG: /* * These cases are all impossible. */ ASSERT(0); } *curp = cur; - if (delta) { - temp2 += temp; - if (delta->xed_startoff > temp) - delta->xed_startoff = temp; - if (delta->xed_blockcount < temp2) - delta->xed_blockcount = temp2; - } done: *logflagsp = rval; return error; #undef LEFT #undef RIGHT #undef PREV -#undef MASK -#undef MASK2 -#undef MASK3 -#undef MASK4 -#undef STATE_SET -#undef STATE_TEST -#undef STATE_SET_TEST -#undef SWITCH_STATE } /* @@ -1224,8 +1084,7 @@ xfs_bmap_add_extent_unwritten_real( xfs_extnum_t idx, /* extent number to update/insert */ xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta) /* Change made to incore extents */ + int *logflagsp) /* inode logging flags */ { xfs_btree_cur_t *cur; /* btree cursor */ xfs_bmbt_rec_host_t *ep; /* extent entry for idx */ @@ -1239,29 +1098,10 @@ xfs_bmap_add_extent_unwritten_real( /* left is 0, right is 1, prev is 2 */ int rval=0; /* return value (logging flags) */ int state = 0;/* state bits, accessed thru macros */ - xfs_filblks_t temp=0; - xfs_filblks_t temp2=0; - enum { /* bit number definitions for state */ - LEFT_CONTIG, RIGHT_CONTIG, - LEFT_FILLING, RIGHT_FILLING, - LEFT_DELAY, RIGHT_DELAY, - LEFT_VALID, RIGHT_VALID - }; #define LEFT r[0] #define RIGHT r[1] #define PREV r[2] -#define MASK(b) (1 << (b)) -#define MASK2(a,b) (MASK(a) | MASK(b)) -#define MASK3(a,b,c) (MASK2(a,b) | MASK(c)) -#define MASK4(a,b,c,d) (MASK3(a,b,c) | MASK(d)) -#define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b))) -#define STATE_TEST(b) (state & MASK(b)) -#define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \ - ((state &= ~MASK(b)), 0)) -#define SWITCH_STATE \ - (state & MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG)) - /* * Set up a bunch of variables to make the tests simpler. */ @@ -1277,68 +1117,78 @@ xfs_bmap_add_extent_unwritten_real( new_endoff = new->br_startoff + new->br_blockcount; ASSERT(PREV.br_startoff <= new->br_startoff); ASSERT(PREV.br_startoff + PREV.br_blockcount >= new_endoff); + /* * Set flags determining what part of the previous oldext allocation * extent is being replaced by a newext allocation. */ - STATE_SET(LEFT_FILLING, PREV.br_startoff == new->br_startoff); - STATE_SET(RIGHT_FILLING, - PREV.br_startoff + PREV.br_blockcount == new_endoff); + if (PREV.br_startoff == new->br_startoff) + state |= BMAP_LEFT_FILLING; + if (PREV.br_startoff + PREV.br_blockcount == new_endoff) + state |= BMAP_RIGHT_FILLING; + /* * Check and set flags if this segment has a left neighbor. * Don't set contiguous if the combined extent would be too large. */ - if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { + if (idx > 0) { + state |= BMAP_LEFT_VALID; xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); - STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(LEFT.br_startblock)); + + if (isnullstartblock(LEFT.br_startblock)) + state |= BMAP_LEFT_DELAY; } - STATE_SET(LEFT_CONTIG, - STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) && - LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && - LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && - LEFT.br_state == newext && - LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN); + + if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && + LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && + LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && + LEFT.br_state == newext && + LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN) + state |= BMAP_LEFT_CONTIG; + /* * Check and set flags if this segment has a right neighbor. * Don't set contiguous if the combined extent would be too large. * Also check for all-three-contiguous being too large. */ - if (STATE_SET_TEST(RIGHT_VALID, - idx < - ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)) { + if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { + state |= BMAP_RIGHT_VALID; xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); - STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(RIGHT.br_startblock)); + if (isnullstartblock(RIGHT.br_startblock)) + state |= BMAP_RIGHT_DELAY; } - STATE_SET(RIGHT_CONTIG, - STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) && - new_endoff == RIGHT.br_startoff && - new->br_startblock + new->br_blockcount == - RIGHT.br_startblock && - newext == RIGHT.br_state && - new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN && - ((state & MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING)) != - MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING) || - LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount - <= MAXEXTLEN)); + + if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && + new_endoff == RIGHT.br_startoff && + new->br_startblock + new->br_blockcount == RIGHT.br_startblock && + newext == RIGHT.br_state && + new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN && + ((state & (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | + BMAP_RIGHT_FILLING)) != + (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | + BMAP_RIGHT_FILLING) || + LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount + <= MAXEXTLEN)) + state |= BMAP_RIGHT_CONTIG; + /* * Switch out based on the FILLING and CONTIG state bits. */ - switch (SWITCH_STATE) { - - case MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): + switch (state & (BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | + BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG)) { + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | + BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* * Setting all of a previous oldext extent to newext. * The left and right neighbors are both contiguous with new. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|LC|RC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), LEFT.br_blockcount + PREV.br_blockcount + RIGHT.br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF|LC|RC", ip, idx - 1, - XFS_DATA_FORK); - XFS_BMAP_TRACE_DELETE("LF|RF|LC|RC", ip, idx, 2, XFS_DATA_FORK); - xfs_iext_remove(ifp, idx, 2); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + + xfs_iext_remove(ip, idx, 2, state); ip->i_df.if_lastex = idx - 1; ip->i_d.di_nextents -= 2; if (cur == NULL) @@ -1368,27 +1218,20 @@ xfs_bmap_add_extent_unwritten_real( RIGHT.br_blockcount, LEFT.br_state))) goto done; } - /* DELTA: Three in-core extents are replaced by one. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount + - RIGHT.br_blockcount; break; - case MASK3(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: /* * Setting all of a previous oldext extent to newext. * The left neighbor is contiguous, the right is not. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|LC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), LEFT.br_blockcount + PREV.br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF|LC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + ip->i_df.if_lastex = idx - 1; - XFS_BMAP_TRACE_DELETE("LF|RF|LC", ip, idx, 1, XFS_DATA_FORK); - xfs_iext_remove(ifp, idx, 1); + xfs_iext_remove(ip, idx, 1, state); ip->i_d.di_nextents--; if (cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1411,27 +1254,20 @@ xfs_bmap_add_extent_unwritten_real( LEFT.br_state))) goto done; } - /* DELTA: Two in-core extents are replaced by one. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount; break; - case MASK3(LEFT_FILLING, RIGHT_FILLING, RIGHT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* * Setting all of a previous oldext extent to newext. * The right neighbor is contiguous, the left is not. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|RC", ip, idx, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount + RIGHT.br_blockcount); xfs_bmbt_set_state(ep, newext); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF|RC", ip, idx, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); ip->i_df.if_lastex = idx; - XFS_BMAP_TRACE_DELETE("LF|RF|RC", ip, idx + 1, 1, XFS_DATA_FORK); - xfs_iext_remove(ifp, idx + 1, 1); + xfs_iext_remove(ip, idx + 1, 1, state); ip->i_d.di_nextents--; if (cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1454,23 +1290,18 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } - /* DELTA: Two in-core extents are replaced by one. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount + - RIGHT.br_blockcount; break; - case MASK2(LEFT_FILLING, RIGHT_FILLING): + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: /* * Setting all of a previous oldext extent to newext. * Neither the left nor right neighbors are contiguous with * the new one. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF", ip, idx, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_state(ep, newext); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF", ip, idx, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + ip->i_df.if_lastex = idx; if (cur == NULL) rval = XFS_ILOG_DEXT; @@ -1486,32 +1317,27 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } - /* DELTA: The in-core extent described by new changed type. */ - temp = new->br_startoff; - temp2 = new->br_blockcount; break; - case MASK2(LEFT_FILLING, LEFT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: /* * Setting the first part of a previous oldext extent to newext. * The left neighbor is contiguous. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|LC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), LEFT.br_blockcount + new->br_blockcount); xfs_bmbt_set_startoff(ep, PREV.br_startoff + new->br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|LC", ip, idx - 1, - XFS_DATA_FORK); - XFS_BMAP_TRACE_PRE_UPDATE("LF|LC", ip, idx, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_startblock(ep, new->br_startblock + new->br_blockcount); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|LC", ip, idx, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + ip->i_df.if_lastex = idx - 1; if (cur == NULL) rval = XFS_ILOG_DEXT; @@ -1536,28 +1362,23 @@ xfs_bmap_add_extent_unwritten_real( LEFT.br_state)) goto done; } - /* DELTA: The boundary between two in-core extents moved. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount; break; - case MASK(LEFT_FILLING): + case BMAP_LEFT_FILLING: /* * Setting the first part of a previous oldext extent to newext. * The left neighbor is not contiguous. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); ASSERT(ep && xfs_bmbt_get_state(ep) == oldext); xfs_bmbt_set_startoff(ep, new_endoff); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); xfs_bmbt_set_startblock(ep, new->br_startblock + new->br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF", ip, idx, XFS_DATA_FORK); - XFS_BMAP_TRACE_INSERT("LF", ip, idx, 1, new, NULL, - XFS_DATA_FORK); - xfs_iext_insert(ifp, idx, 1, new); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + + xfs_iext_insert(ip, idx, 1, new, state); ip->i_df.if_lastex = idx; ip->i_d.di_nextents++; if (cur == NULL) @@ -1580,29 +1401,23 @@ xfs_bmap_add_extent_unwritten_real( goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - /* DELTA: One in-core extent is split in two. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; - case MASK2(RIGHT_FILLING, RIGHT_CONTIG): + case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* * Setting the last part of a previous oldext extent to newext. * The right neighbor is contiguous with the new allocation. */ - XFS_BMAP_TRACE_PRE_UPDATE("RF|RC", ip, idx, - XFS_DATA_FORK); - XFS_BMAP_TRACE_PRE_UPDATE("RF|RC", ip, idx + 1, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, idx + 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("RF|RC", ip, idx, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, idx + 1), new->br_startoff, new->br_startblock, new->br_blockcount + RIGHT.br_blockcount, newext); - XFS_BMAP_TRACE_POST_UPDATE("RF|RC", ip, idx + 1, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); + ip->i_df.if_lastex = idx + 1; if (cur == NULL) rval = XFS_ILOG_DEXT; @@ -1626,24 +1441,19 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } - /* DELTA: The boundary between two in-core extents moved. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount + - RIGHT.br_blockcount; break; - case MASK(RIGHT_FILLING): + case BMAP_RIGHT_FILLING: /* * Setting the last part of a previous oldext extent to newext. * The right neighbor is not contiguous. */ - XFS_BMAP_TRACE_PRE_UPDATE("RF", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("RF", ip, idx, XFS_DATA_FORK); - XFS_BMAP_TRACE_INSERT("RF", ip, idx + 1, 1, new, NULL, - XFS_DATA_FORK); - xfs_iext_insert(ifp, idx + 1, 1, new); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + + xfs_iext_insert(ip, idx + 1, 1, new, state); ip->i_df.if_lastex = idx + 1; ip->i_d.di_nextents++; if (cur == NULL) @@ -1670,9 +1480,6 @@ xfs_bmap_add_extent_unwritten_real( goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - /* DELTA: One in-core extent is split in two. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; case 0: @@ -1681,19 +1488,18 @@ xfs_bmap_add_extent_unwritten_real( * newext. Contiguity is impossible here. * One extent becomes three extents. */ - XFS_BMAP_TRACE_PRE_UPDATE("0", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, new->br_startoff - PREV.br_startoff); - XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + r[0] = *new; r[1].br_startoff = new_endoff; r[1].br_blockcount = PREV.br_startoff + PREV.br_blockcount - new_endoff; r[1].br_startblock = new->br_startblock + new->br_blockcount; r[1].br_state = oldext; - XFS_BMAP_TRACE_INSERT("0", ip, idx + 1, 2, &r[0], &r[1], - XFS_DATA_FORK); - xfs_iext_insert(ifp, idx + 1, 2, &r[0]); + xfs_iext_insert(ip, idx + 1, 2, &r[0], state); ip->i_df.if_lastex = idx + 1; ip->i_d.di_nextents += 2; if (cur == NULL) @@ -1733,45 +1539,27 @@ xfs_bmap_add_extent_unwritten_real( goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - /* DELTA: One in-core extent is split in three. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; - case MASK3(LEFT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): - case MASK3(RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): - case MASK2(LEFT_FILLING, RIGHT_CONTIG): - case MASK2(RIGHT_FILLING, LEFT_CONTIG): - case MASK2(LEFT_CONTIG, RIGHT_CONTIG): - case MASK(LEFT_CONTIG): - case MASK(RIGHT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_LEFT_FILLING | BMAP_RIGHT_CONTIG: + case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: + case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_LEFT_CONTIG: + case BMAP_RIGHT_CONTIG: /* * These cases are all impossible. */ ASSERT(0); } *curp = cur; - if (delta) { - temp2 += temp; - if (delta->xed_startoff > temp) - delta->xed_startoff = temp; - if (delta->xed_blockcount < temp2) - delta->xed_blockcount = temp2; - } done: *logflagsp = rval; return error; #undef LEFT #undef RIGHT #undef PREV -#undef MASK -#undef MASK2 -#undef MASK3 -#undef MASK4 -#undef STATE_SET -#undef STATE_TEST -#undef STATE_SET_TEST -#undef SWITCH_STATE } /* @@ -1785,7 +1573,6 @@ xfs_bmap_add_extent_hole_delay( xfs_extnum_t idx, /* extent number to update/insert */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd) /* OK to allocate reserved blocks */ { xfs_bmbt_rec_host_t *ep; /* extent record for idx */ @@ -1796,63 +1583,57 @@ xfs_bmap_add_extent_hole_delay( xfs_bmbt_irec_t right; /* right neighbor extent entry */ int state; /* state bits, accessed thru macros */ xfs_filblks_t temp=0; /* temp for indirect calculations */ - xfs_filblks_t temp2=0; - enum { /* bit number definitions for state */ - LEFT_CONTIG, RIGHT_CONTIG, - LEFT_DELAY, RIGHT_DELAY, - LEFT_VALID, RIGHT_VALID - }; - -#define MASK(b) (1 << (b)) -#define MASK2(a,b) (MASK(a) | MASK(b)) -#define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b))) -#define STATE_TEST(b) (state & MASK(b)) -#define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \ - ((state &= ~MASK(b)), 0)) -#define SWITCH_STATE (state & MASK2(LEFT_CONTIG, RIGHT_CONTIG)) ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); ep = xfs_iext_get_ext(ifp, idx); state = 0; - ASSERT(ISNULLSTARTBLOCK(new->br_startblock)); + ASSERT(isnullstartblock(new->br_startblock)); + /* * Check and set flags if this segment has a left neighbor */ - if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { + if (idx > 0) { + state |= BMAP_LEFT_VALID; xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); - STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(left.br_startblock)); + + if (isnullstartblock(left.br_startblock)) + state |= BMAP_LEFT_DELAY; } + /* * Check and set flags if the current (right) segment exists. * If it doesn't exist, we're converting the hole at end-of-file. */ - if (STATE_SET_TEST(RIGHT_VALID, - idx < - ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t))) { + if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { + state |= BMAP_RIGHT_VALID; xfs_bmbt_get_all(ep, &right); - STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(right.br_startblock)); + + if (isnullstartblock(right.br_startblock)) + state |= BMAP_RIGHT_DELAY; } + /* * Set contiguity flags on the left and right neighbors. * Don't let extents get too large, even if the pieces are contiguous. */ - STATE_SET(LEFT_CONTIG, - STATE_TEST(LEFT_VALID) && STATE_TEST(LEFT_DELAY) && - left.br_startoff + left.br_blockcount == new->br_startoff && - left.br_blockcount + new->br_blockcount <= MAXEXTLEN); - STATE_SET(RIGHT_CONTIG, - STATE_TEST(RIGHT_VALID) && STATE_TEST(RIGHT_DELAY) && - new->br_startoff + new->br_blockcount == right.br_startoff && - new->br_blockcount + right.br_blockcount <= MAXEXTLEN && - (!STATE_TEST(LEFT_CONTIG) || - (left.br_blockcount + new->br_blockcount + - right.br_blockcount <= MAXEXTLEN))); + if ((state & BMAP_LEFT_VALID) && (state & BMAP_LEFT_DELAY) && + left.br_startoff + left.br_blockcount == new->br_startoff && + left.br_blockcount + new->br_blockcount <= MAXEXTLEN) + state |= BMAP_LEFT_CONTIG; + + if ((state & BMAP_RIGHT_VALID) && (state & BMAP_RIGHT_DELAY) && + new->br_startoff + new->br_blockcount == right.br_startoff && + new->br_blockcount + right.br_blockcount <= MAXEXTLEN && + (!(state & BMAP_LEFT_CONTIG) || + (left.br_blockcount + new->br_blockcount + + right.br_blockcount <= MAXEXTLEN))) + state |= BMAP_RIGHT_CONTIG; + /* * Switch out based on the contiguity flags. */ - switch (SWITCH_STATE) { - - case MASK2(LEFT_CONTIG, RIGHT_CONTIG): + switch (state & (BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG)) { + case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: /* * New allocation is contiguous with delayed allocations * on the left and on the right. @@ -1860,66 +1641,56 @@ xfs_bmap_add_extent_hole_delay( */ temp = left.br_blockcount + new->br_blockcount + right.br_blockcount; - XFS_BMAP_TRACE_PRE_UPDATE("LC|RC", ip, idx - 1, - XFS_DATA_FORK); + + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp); - oldlen = STARTBLOCKVAL(left.br_startblock) + - STARTBLOCKVAL(new->br_startblock) + - STARTBLOCKVAL(right.br_startblock); + oldlen = startblockval(left.br_startblock) + + startblockval(new->br_startblock) + + startblockval(right.br_startblock); newlen = xfs_bmap_worst_indlen(ip, temp); xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1), - NULLSTARTBLOCK((int)newlen)); - XFS_BMAP_TRACE_POST_UPDATE("LC|RC", ip, idx - 1, - XFS_DATA_FORK); - XFS_BMAP_TRACE_DELETE("LC|RC", ip, idx, 1, XFS_DATA_FORK); - xfs_iext_remove(ifp, idx, 1); + nullstartblock((int)newlen)); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + + xfs_iext_remove(ip, idx, 1, state); ip->i_df.if_lastex = idx - 1; - /* DELTA: Two in-core extents were replaced by one. */ - temp2 = temp; - temp = left.br_startoff; break; - case MASK(LEFT_CONTIG): + case BMAP_LEFT_CONTIG: /* * New allocation is contiguous with a delayed allocation * on the left. * Merge the new allocation with the left neighbor. */ temp = left.br_blockcount + new->br_blockcount; - XFS_BMAP_TRACE_PRE_UPDATE("LC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp); - oldlen = STARTBLOCKVAL(left.br_startblock) + - STARTBLOCKVAL(new->br_startblock); + oldlen = startblockval(left.br_startblock) + + startblockval(new->br_startblock); newlen = xfs_bmap_worst_indlen(ip, temp); xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1), - NULLSTARTBLOCK((int)newlen)); - XFS_BMAP_TRACE_POST_UPDATE("LC", ip, idx - 1, - XFS_DATA_FORK); + nullstartblock((int)newlen)); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + ip->i_df.if_lastex = idx - 1; - /* DELTA: One in-core extent grew into a hole. */ - temp2 = temp; - temp = left.br_startoff; break; - case MASK(RIGHT_CONTIG): + case BMAP_RIGHT_CONTIG: /* * New allocation is contiguous with a delayed allocation * on the right. * Merge the new allocation with the right neighbor. */ - XFS_BMAP_TRACE_PRE_UPDATE("RC", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); temp = new->br_blockcount + right.br_blockcount; - oldlen = STARTBLOCKVAL(new->br_startblock) + - STARTBLOCKVAL(right.br_startblock); + oldlen = startblockval(new->br_startblock) + + startblockval(right.br_startblock); newlen = xfs_bmap_worst_indlen(ip, temp); xfs_bmbt_set_allf(ep, new->br_startoff, - NULLSTARTBLOCK((int)newlen), temp, right.br_state); - XFS_BMAP_TRACE_POST_UPDATE("RC", ip, idx, XFS_DATA_FORK); + nullstartblock((int)newlen), temp, right.br_state); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + ip->i_df.if_lastex = idx; - /* DELTA: One in-core extent grew into a hole. */ - temp2 = temp; - temp = new->br_startoff; break; case 0: @@ -1929,38 +1700,20 @@ xfs_bmap_add_extent_hole_delay( * Insert a new entry. */ oldlen = newlen = 0; - XFS_BMAP_TRACE_INSERT("0", ip, idx, 1, new, NULL, - XFS_DATA_FORK); - xfs_iext_insert(ifp, idx, 1, new); + xfs_iext_insert(ip, idx, 1, new, state); ip->i_df.if_lastex = idx; - /* DELTA: A new in-core extent was added in a hole. */ - temp2 = new->br_blockcount; - temp = new->br_startoff; break; } if (oldlen != newlen) { ASSERT(oldlen > newlen); - xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, + xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, (int64_t)(oldlen - newlen), rsvd); /* * Nothing to do for disk quota accounting here. */ } - if (delta) { - temp2 += temp; - if (delta->xed_startoff > temp) - delta->xed_startoff = temp; - if (delta->xed_blockcount < temp2) - delta->xed_blockcount = temp2; - } *logflagsp = 0; return 0; -#undef MASK -#undef MASK2 -#undef STATE_SET -#undef STATE_TEST -#undef STATE_SET_TEST -#undef SWITCH_STATE } /* @@ -1974,7 +1727,6 @@ xfs_bmap_add_extent_hole_real( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork) /* data or attr fork */ { xfs_bmbt_rec_host_t *ep; /* pointer to extent entry ins. point */ @@ -1985,90 +1737,80 @@ xfs_bmap_add_extent_hole_real( xfs_bmbt_irec_t right; /* right neighbor extent entry */ int rval=0; /* return value (logging flags) */ int state; /* state bits, accessed thru macros */ - xfs_filblks_t temp=0; - xfs_filblks_t temp2=0; - enum { /* bit number definitions for state */ - LEFT_CONTIG, RIGHT_CONTIG, - LEFT_DELAY, RIGHT_DELAY, - LEFT_VALID, RIGHT_VALID - }; - -#define MASK(b) (1 << (b)) -#define MASK2(a,b) (MASK(a) | MASK(b)) -#define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b))) -#define STATE_TEST(b) (state & MASK(b)) -#define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \ - ((state &= ~MASK(b)), 0)) -#define SWITCH_STATE (state & MASK2(LEFT_CONTIG, RIGHT_CONTIG)) ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT(idx <= ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); ep = xfs_iext_get_ext(ifp, idx); state = 0; + + if (whichfork == XFS_ATTR_FORK) + state |= BMAP_ATTRFORK; + /* * Check and set flags if this segment has a left neighbor. */ - if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { + if (idx > 0) { + state |= BMAP_LEFT_VALID; xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); - STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(left.br_startblock)); + if (isnullstartblock(left.br_startblock)) + state |= BMAP_LEFT_DELAY; } + /* * Check and set flags if this segment has a current value. * Not true if we're inserting into the "hole" at eof. */ - if (STATE_SET_TEST(RIGHT_VALID, - idx < - ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))) { + if (idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { + state |= BMAP_RIGHT_VALID; xfs_bmbt_get_all(ep, &right); - STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(right.br_startblock)); + if (isnullstartblock(right.br_startblock)) + state |= BMAP_RIGHT_DELAY; } + /* * We're inserting a real allocation between "left" and "right". * Set the contiguity flags. Don't let extents get too large. */ - STATE_SET(LEFT_CONTIG, - STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) && - left.br_startoff + left.br_blockcount == new->br_startoff && - left.br_startblock + left.br_blockcount == new->br_startblock && - left.br_state == new->br_state && - left.br_blockcount + new->br_blockcount <= MAXEXTLEN); - STATE_SET(RIGHT_CONTIG, - STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) && - new->br_startoff + new->br_blockcount == right.br_startoff && - new->br_startblock + new->br_blockcount == - right.br_startblock && - new->br_state == right.br_state && - new->br_blockcount + right.br_blockcount <= MAXEXTLEN && - (!STATE_TEST(LEFT_CONTIG) || - left.br_blockcount + new->br_blockcount + - right.br_blockcount <= MAXEXTLEN)); + if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && + left.br_startoff + left.br_blockcount == new->br_startoff && + left.br_startblock + left.br_blockcount == new->br_startblock && + left.br_state == new->br_state && + left.br_blockcount + new->br_blockcount <= MAXEXTLEN) + state |= BMAP_LEFT_CONTIG; + + if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && + new->br_startoff + new->br_blockcount == right.br_startoff && + new->br_startblock + new->br_blockcount == right.br_startblock && + new->br_state == right.br_state && + new->br_blockcount + right.br_blockcount <= MAXEXTLEN && + (!(state & BMAP_LEFT_CONTIG) || + left.br_blockcount + new->br_blockcount + + right.br_blockcount <= MAXEXTLEN)) + state |= BMAP_RIGHT_CONTIG; error = 0; /* * Select which case we're in here, and implement it. */ - switch (SWITCH_STATE) { - - case MASK2(LEFT_CONTIG, RIGHT_CONTIG): + switch (state & (BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG)) { + case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: /* * New allocation is contiguous with real allocations on the * left and on the right. * Merge all three into a single extent record. */ - XFS_BMAP_TRACE_PRE_UPDATE("LC|RC", ip, idx - 1, - whichfork); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), left.br_blockcount + new->br_blockcount + right.br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LC|RC", ip, idx - 1, - whichfork); - XFS_BMAP_TRACE_DELETE("LC|RC", ip, idx, 1, whichfork); - xfs_iext_remove(ifp, idx, 1); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + + xfs_iext_remove(ip, idx, 1, state); ifp->if_lastex = idx - 1; XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) - 1); if (cur == NULL) { - rval = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); + rval = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); } else { rval = XFS_ILOG_CORE; if ((error = xfs_bmbt_lookup_eq(cur, @@ -2091,26 +1833,22 @@ xfs_bmap_add_extent_hole_real( left.br_state))) goto done; } - /* DELTA: Two in-core extents were replaced by one. */ - temp = left.br_startoff; - temp2 = left.br_blockcount + - new->br_blockcount + - right.br_blockcount; break; - case MASK(LEFT_CONTIG): + case BMAP_LEFT_CONTIG: /* * New allocation is contiguous with a real allocation * on the left. * Merge the new allocation with the left neighbor. */ - XFS_BMAP_TRACE_PRE_UPDATE("LC", ip, idx - 1, whichfork); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), left.br_blockcount + new->br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LC", ip, idx - 1, whichfork); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + ifp->if_lastex = idx - 1; if (cur == NULL) { - rval = XFS_ILOG_FEXT(whichfork); + rval = xfs_ilog_fext(whichfork); } else { rval = 0; if ((error = xfs_bmbt_lookup_eq(cur, @@ -2126,26 +1864,23 @@ xfs_bmap_add_extent_hole_real( left.br_state))) goto done; } - /* DELTA: One in-core extent grew. */ - temp = left.br_startoff; - temp2 = left.br_blockcount + - new->br_blockcount; break; - case MASK(RIGHT_CONTIG): + case BMAP_RIGHT_CONTIG: /* * New allocation is contiguous with a real allocation * on the right. * Merge the new allocation with the right neighbor. */ - XFS_BMAP_TRACE_PRE_UPDATE("RC", ip, idx, whichfork); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_allf(ep, new->br_startoff, new->br_startblock, new->br_blockcount + right.br_blockcount, right.br_state); - XFS_BMAP_TRACE_POST_UPDATE("RC", ip, idx, whichfork); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + ifp->if_lastex = idx; if (cur == NULL) { - rval = XFS_ILOG_FEXT(whichfork); + rval = xfs_ilog_fext(whichfork); } else { rval = 0; if ((error = xfs_bmbt_lookup_eq(cur, @@ -2161,10 +1896,6 @@ xfs_bmap_add_extent_hole_real( right.br_state))) goto done; } - /* DELTA: One in-core extent grew. */ - temp = new->br_startoff; - temp2 = new->br_blockcount + - right.br_blockcount; break; case 0: @@ -2173,13 +1904,12 @@ xfs_bmap_add_extent_hole_real( * real allocation. * Insert a new entry. */ - XFS_BMAP_TRACE_INSERT("0", ip, idx, 1, new, NULL, whichfork); - xfs_iext_insert(ifp, idx, 1, new); + xfs_iext_insert(ip, idx, 1, new, state); ifp->if_lastex = idx; XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) + 1); if (cur == NULL) { - rval = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); + rval = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); } else { rval = XFS_ILOG_CORE; if ((error = xfs_bmbt_lookup_eq(cur, @@ -2193,27 +1923,11 @@ xfs_bmap_add_extent_hole_real( goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - /* DELTA: A new extent was added in a hole. */ - temp = new->br_startoff; - temp2 = new->br_blockcount; break; } - if (delta) { - temp2 += temp; - if (delta->xed_startoff > temp) - delta->xed_startoff = temp; - if (delta->xed_blockcount < temp2) - delta->xed_blockcount = temp2; - } done: *logflagsp = rval; return error; -#undef MASK -#undef MASK2 -#undef STATE_SET -#undef STATE_TEST -#undef STATE_SET_TEST -#undef SWITCH_STATE } /* @@ -2404,10 +2118,10 @@ xfs_bmap_adjacent( fb_agno = nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, ap->firstblock); /* * If allocating at eof, and there's a previous real block, - * try to use it's last block as our starting point. + * try to use its last block as our starting point. */ if (ap->eof && ap->prevp->br_startoff != NULLFILEOFF && - !ISNULLSTARTBLOCK(ap->prevp->br_startblock) && + !isnullstartblock(ap->prevp->br_startblock) && ISVALID(ap->prevp->br_startblock + ap->prevp->br_blockcount, ap->prevp->br_startblock)) { ap->rval = ap->prevp->br_startblock + ap->prevp->br_blockcount; @@ -2436,7 +2150,7 @@ xfs_bmap_adjacent( * start block based on it. */ if (ap->prevp->br_startoff != NULLFILEOFF && - !ISNULLSTARTBLOCK(ap->prevp->br_startblock) && + !isnullstartblock(ap->prevp->br_startblock) && (prevbno = ap->prevp->br_startblock + ap->prevp->br_blockcount) && ISVALID(prevbno, ap->prevp->br_startblock)) { @@ -2477,7 +2191,7 @@ xfs_bmap_adjacent( * If there's a following (right) block, select a requested * start block based on it. */ - if (!ISNULLSTARTBLOCK(ap->gotp->br_startblock)) { + if (!isnullstartblock(ap->gotp->br_startblock)) { /* * Calculate gap to start of next block. */ @@ -2530,25 +2244,134 @@ xfs_bmap_adjacent( } STATIC int +xfs_bmap_btalloc_nullfb( + struct xfs_bmalloca *ap, + struct xfs_alloc_arg *args, + xfs_extlen_t *blen) +{ + struct xfs_mount *mp = ap->ip->i_mount; + struct xfs_perag *pag; + xfs_agnumber_t ag, startag; + int notinit = 0; + int error; + + if (ap->userdata && xfs_inode_is_filestream(ap->ip)) + args->type = XFS_ALLOCTYPE_NEAR_BNO; + else + args->type = XFS_ALLOCTYPE_START_BNO; + args->total = ap->total; + + /* + * Search for an allocation group with a single extent large enough + * for the request. If one isn't found, then adjust the minimum + * allocation size to the largest space found. + */ + startag = ag = XFS_FSB_TO_AGNO(mp, args->fsbno); + if (startag == NULLAGNUMBER) + startag = ag = 0; + + pag = xfs_perag_get(mp, ag); + while (*blen < ap->alen) { + if (!pag->pagf_init) { + error = xfs_alloc_pagf_init(mp, args->tp, ag, + XFS_ALLOC_FLAG_TRYLOCK); + if (error) { + xfs_perag_put(pag); + return error; + } + } + + /* + * See xfs_alloc_fix_freelist... + */ + if (pag->pagf_init) { + xfs_extlen_t longest; + longest = xfs_alloc_longest_free_extent(mp, pag); + if (*blen < longest) + *blen = longest; + } else + notinit = 1; + + if (xfs_inode_is_filestream(ap->ip)) { + if (*blen >= ap->alen) + break; + + if (ap->userdata) { + /* + * If startag is an invalid AG, we've + * come here once before and + * xfs_filestream_new_ag picked the + * best currently available. + * + * Don't continue looping, since we + * could loop forever. + */ + if (startag == NULLAGNUMBER) + break; + + error = xfs_filestream_new_ag(ap, &ag); + xfs_perag_put(pag); + if (error) + return error; + + /* loop again to set 'blen'*/ + startag = NULLAGNUMBER; + pag = xfs_perag_get(mp, ag); + continue; + } + } + if (++ag == mp->m_sb.sb_agcount) + ag = 0; + if (ag == startag) + break; + xfs_perag_put(pag); + pag = xfs_perag_get(mp, ag); + } + xfs_perag_put(pag); + + /* + * Since the above loop did a BUF_TRYLOCK, it is + * possible that there is space for this request. + */ + if (notinit || *blen < ap->minlen) + args->minlen = ap->minlen; + /* + * If the best seen length is less than the request + * length, use the best as the minimum. + */ + else if (*blen < ap->alen) + args->minlen = *blen; + /* + * Otherwise we've seen an extent as big as alen, + * use that as the minimum. + */ + else + args->minlen = ap->alen; + + /* + * set the failure fallback case to look in the selected + * AG as the stream may have moved. + */ + if (xfs_inode_is_filestream(ap->ip)) + ap->rval = args->fsbno = XFS_AGB_TO_FSB(mp, ag, 0); + + return 0; +} + +STATIC int xfs_bmap_btalloc( xfs_bmalloca_t *ap) /* bmap alloc argument struct */ { xfs_mount_t *mp; /* mount point structure */ xfs_alloctype_t atype = 0; /* type for allocation routines */ xfs_extlen_t align; /* minimum allocation alignment */ - xfs_agnumber_t ag; xfs_agnumber_t fb_agno; /* ag number of ap->firstblock */ - xfs_agnumber_t startag; + xfs_agnumber_t ag; xfs_alloc_arg_t args; xfs_extlen_t blen; - xfs_extlen_t delta; - xfs_extlen_t longest; - xfs_extlen_t need; xfs_extlen_t nextminlen = 0; - xfs_perag_t *pag; int nullfb; /* true if ap->firstblock isn't set */ int isaligned; - int notinit; int tryagain; int error; @@ -2595,107 +2418,9 @@ xfs_bmap_btalloc( args.firstblock = ap->firstblock; blen = 0; if (nullfb) { - if (ap->userdata && xfs_inode_is_filestream(ap->ip)) - args.type = XFS_ALLOCTYPE_NEAR_BNO; - else - args.type = XFS_ALLOCTYPE_START_BNO; - args.total = ap->total; - - /* - * Search for an allocation group with a single extent - * large enough for the request. - * - * If one isn't found, then adjust the minimum allocation - * size to the largest space found. - */ - startag = ag = XFS_FSB_TO_AGNO(mp, args.fsbno); - if (startag == NULLAGNUMBER) - startag = ag = 0; - notinit = 0; - down_read(&mp->m_peraglock); - while (blen < ap->alen) { - pag = &mp->m_perag[ag]; - if (!pag->pagf_init && - (error = xfs_alloc_pagf_init(mp, args.tp, - ag, XFS_ALLOC_FLAG_TRYLOCK))) { - up_read(&mp->m_peraglock); - return error; - } - /* - * See xfs_alloc_fix_freelist... - */ - if (pag->pagf_init) { - need = XFS_MIN_FREELIST_PAG(pag, mp); - delta = need > pag->pagf_flcount ? - need - pag->pagf_flcount : 0; - longest = (pag->pagf_longest > delta) ? - (pag->pagf_longest - delta) : - (pag->pagf_flcount > 0 || - pag->pagf_longest > 0); - if (blen < longest) - blen = longest; - } else - notinit = 1; - - if (xfs_inode_is_filestream(ap->ip)) { - if (blen >= ap->alen) - break; - - if (ap->userdata) { - /* - * If startag is an invalid AG, we've - * come here once before and - * xfs_filestream_new_ag picked the - * best currently available. - * - * Don't continue looping, since we - * could loop forever. - */ - if (startag == NULLAGNUMBER) - break; - - error = xfs_filestream_new_ag(ap, &ag); - if (error) { - up_read(&mp->m_peraglock); - return error; - } - - /* loop again to set 'blen'*/ - startag = NULLAGNUMBER; - continue; - } - } - if (++ag == mp->m_sb.sb_agcount) - ag = 0; - if (ag == startag) - break; - } - up_read(&mp->m_peraglock); - /* - * Since the above loop did a BUF_TRYLOCK, it is - * possible that there is space for this request. - */ - if (notinit || blen < ap->minlen) - args.minlen = ap->minlen; - /* - * If the best seen length is less than the request - * length, use the best as the minimum. - */ - else if (blen < ap->alen) - args.minlen = blen; - /* - * Otherwise we've seen an extent as big as alen, - * use that as the minimum. - */ - else - args.minlen = ap->alen; - - /* - * set the failure fallback case to look in the selected - * AG as the stream may have moved. - */ - if (xfs_inode_is_filestream(ap->ip)) - ap->rval = args.fsbno = XFS_AGB_TO_FSB(mp, ag, 0); + error = xfs_bmap_btalloc_nullfb(ap, &args, &blen); + if (error) + return error; } else if (ap->low) { if (xfs_inode_is_filestream(ap->ip)) args.type = XFS_ALLOCTYPE_FIRST_AG; @@ -2832,7 +2557,7 @@ xfs_bmap_btalloc( * Adjust the disk quota also. This was reserved * earlier. */ - XFS_TRANS_MOD_DQUOT_BYINO(mp, ap->tp, ap->ip, + xfs_trans_mod_dquot_byino(ap->tp, ap->ip, ap->wasdel ? XFS_TRANS_DQ_DELBCOUNT : XFS_TRANS_DQ_BCOUNT, (long) args.len); @@ -2903,7 +2628,7 @@ xfs_bmap_btree_to_extents( return error; xfs_bmap_add_free(cbno, 1, cur->bc_private.b.flist, mp); ip->i_d.di_nblocks--; - XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); xfs_trans_binval(tp, cbp); if (cur->bc_bufs[0] == cbp) cur->bc_bufs[0] = NULL; @@ -2911,7 +2636,7 @@ xfs_bmap_btree_to_extents( ASSERT(ifp->if_broot == NULL); ASSERT((ifp->if_flags & XFS_IFBROOT) == 0); XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); - *logflagsp = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); + *logflagsp = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); return 0; } @@ -2928,7 +2653,6 @@ xfs_bmap_del_extent( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *del, /* data to remove from extents */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd) /* OK to allocate reserved blocks */ { @@ -2952,8 +2676,13 @@ xfs_bmap_del_extent( uint qfield; /* quota field to update */ xfs_filblks_t temp; /* for indirect length calculations */ xfs_filblks_t temp2; /* for indirect length calculations */ + int state = 0; XFS_STATS_INC(xs_del_exlist); + + if (whichfork == XFS_ATTR_FORK) + state |= BMAP_ATTRFORK; + mp = ip->i_mount; ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT((idx >= 0) && (idx < ifp->if_bytes / @@ -2965,8 +2694,8 @@ xfs_bmap_del_extent( del_endoff = del->br_startoff + del->br_blockcount; got_endoff = got.br_startoff + got.br_blockcount; ASSERT(got_endoff >= del_endoff); - delay = ISNULLSTARTBLOCK(got.br_startblock); - ASSERT(ISNULLSTARTBLOCK(del->br_startblock) == delay); + delay = isnullstartblock(got.br_startblock); + ASSERT(isnullstartblock(del->br_startblock) == delay); flags = 0; qfield = 0; error = 0; @@ -3018,7 +2747,7 @@ xfs_bmap_del_extent( } da_old = da_new = 0; } else { - da_old = STARTBLOCKVAL(got.br_startblock); + da_old = startblockval(got.br_startblock); da_new = 0; nblks = 0; do_fx = 0; @@ -3033,8 +2762,8 @@ xfs_bmap_del_extent( /* * Matches the whole extent. Delete the entry. */ - XFS_BMAP_TRACE_DELETE("3", ip, idx, 1, whichfork); - xfs_iext_remove(ifp, idx, 1); + xfs_iext_remove(ip, idx, 1, + whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0); ifp->if_lastex = idx; if (delay) break; @@ -3042,7 +2771,7 @@ xfs_bmap_del_extent( XFS_IFORK_NEXTENTS(ip, whichfork) - 1); flags |= XFS_ILOG_CORE; if (!cur) { - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); break; } if ((error = xfs_btree_delete(cur, &i))) @@ -3054,7 +2783,7 @@ xfs_bmap_del_extent( /* * Deleting the first part of the extent. */ - XFS_BMAP_TRACE_PRE_UPDATE("2", ip, idx, whichfork); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_startoff(ep, del_endoff); temp = got.br_blockcount - del->br_blockcount; xfs_bmbt_set_blockcount(ep, temp); @@ -3062,16 +2791,15 @@ xfs_bmap_del_extent( if (delay) { temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), da_old); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); - XFS_BMAP_TRACE_POST_UPDATE("2", ip, idx, - whichfork); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); da_new = temp; break; } xfs_bmbt_set_startblock(ep, del_endblock); - XFS_BMAP_TRACE_POST_UPDATE("2", ip, idx, whichfork); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); if (!cur) { - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); break; } if ((error = xfs_bmbt_update(cur, del_endoff, del_endblock, @@ -3085,21 +2813,20 @@ xfs_bmap_del_extent( * Deleting the last part of the extent. */ temp = got.br_blockcount - del->br_blockcount; - XFS_BMAP_TRACE_PRE_UPDATE("1", ip, idx, whichfork); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); ifp->if_lastex = idx; if (delay) { temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), da_old); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); - XFS_BMAP_TRACE_POST_UPDATE("1", ip, idx, - whichfork); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); da_new = temp; break; } - XFS_BMAP_TRACE_POST_UPDATE("1", ip, idx, whichfork); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); if (!cur) { - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); break; } if ((error = xfs_bmbt_update(cur, got.br_startoff, @@ -3114,7 +2841,7 @@ xfs_bmap_del_extent( * Deleting the middle of the extent. */ temp = del->br_startoff - got.br_startoff; - XFS_BMAP_TRACE_PRE_UPDATE("0", ip, idx, whichfork); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); new.br_startoff = del_endoff; temp2 = got_endoff - del_endoff; @@ -3174,22 +2901,22 @@ xfs_bmap_del_extent( } XFS_WANT_CORRUPTED_GOTO(i == 1, done); } else - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) + 1); } else { ASSERT(whichfork == XFS_DATA_FORK); temp = xfs_bmap_worst_indlen(ip, temp); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); temp2 = xfs_bmap_worst_indlen(ip, temp2); - new.br_startblock = NULLSTARTBLOCK((int)temp2); + new.br_startblock = nullstartblock((int)temp2); da_new = temp + temp2; while (da_new > da_old) { if (temp) { temp--; da_new--; xfs_bmbt_set_startblock(ep, - NULLSTARTBLOCK((int)temp)); + nullstartblock((int)temp)); } if (da_new == da_old) break; @@ -3197,14 +2924,12 @@ xfs_bmap_del_extent( temp2--; da_new--; new.br_startblock = - NULLSTARTBLOCK((int)temp2); + nullstartblock((int)temp2); } } } - XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx, whichfork); - XFS_BMAP_TRACE_INSERT("0", ip, idx + 1, 1, &new, NULL, - whichfork); - xfs_iext_insert(ifp, idx + 1, 1, &new); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + xfs_iext_insert(ip, idx + 1, 1, &new, state); ifp->if_lastex = idx + 1; break; } @@ -3223,23 +2948,16 @@ xfs_bmap_del_extent( * Adjust quota data. */ if (qfield) - XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, qfield, (long)-nblks); + xfs_trans_mod_dquot_byino(tp, ip, qfield, (long)-nblks); /* * Account for change in delayed indirect blocks. * Nothing to do for disk quota accounting here. */ ASSERT(da_old >= da_new); - if (da_old > da_new) - xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, (int64_t)(da_old - da_new), - rsvd); - if (delta) { - /* DELTA: report the original extent. */ - if (delta->xed_startoff > got.br_startoff) - delta->xed_startoff = got.br_startoff; - if (delta->xed_blockcount < got.br_startoff+got.br_blockcount) - delta->xed_blockcount = got.br_startoff + - got.br_blockcount; + if (da_old > da_new) { + xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + (int64_t)(da_old - da_new), rsvd); } done: *logflagsp = flags; @@ -3249,8 +2967,6 @@ done: /* * Remove the entry "free" from the free item list. Prev points to the * previous entry, unless "free" is the head of the list. - * - * Note: this requires user-space public scope for libxfs_iread */ void xfs_bmap_del_free( @@ -3362,7 +3078,7 @@ xfs_bmap_extents_to_btree( *firstblock = cur->bc_private.b.firstblock = args.fsbno; cur->bc_private.b.allocated++; ip->i_d.di_nblocks++; - XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, 1L); + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, 1L); abp = xfs_btree_get_bufl(mp, tp, args.fsbno, 0); /* * Fill in the child block. @@ -3376,7 +3092,7 @@ xfs_bmap_extents_to_btree( nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); for (cnt = i = 0; i < nextents; i++) { ep = xfs_iext_get_ext(ifp, i); - if (!ISNULLSTARTBLOCK(xfs_bmbt_get_startblock(ep))) { + if (!isnullstartblock(xfs_bmbt_get_startblock(ep))) { arp->l0 = cpu_to_be64(ep->l0); arp->l1 = cpu_to_be64(ep->l1); arp++; cnt++; @@ -3403,11 +3119,32 @@ xfs_bmap_extents_to_btree( xfs_btree_log_recs(cur, abp, 1, be16_to_cpu(ablock->bb_numrecs)); ASSERT(*curp == NULL); *curp = cur; - *logflagsp = XFS_ILOG_CORE | XFS_ILOG_FBROOT(whichfork); + *logflagsp = XFS_ILOG_CORE | xfs_ilog_fbroot(whichfork); return 0; } /* + * Calculate the default attribute fork offset for newly created inodes. + */ +uint +xfs_default_attroffset( + struct xfs_inode *ip) +{ + struct xfs_mount *mp = ip->i_mount; + uint offset; + + if (mp->m_sb.sb_inodesize == 256) { + offset = XFS_LITINO(mp) - + XFS_BMDR_SPACE_CALC(MINABTPTRS); + } else { + offset = XFS_BMDR_SPACE_CALC(6 * MINABTPTRS); + } + + ASSERT(offset < XFS_LITINO(mp)); + return offset; +} + +/* * Helper routine to reset inode di_forkoff field when switching * attribute fork from local to extent format - we reset it where * possible to make space available for inline data fork extents. @@ -3419,15 +3156,18 @@ xfs_bmap_forkoff_reset( int whichfork) { if (whichfork == XFS_ATTR_FORK && - (ip->i_d.di_format != XFS_DINODE_FMT_DEV) && - (ip->i_d.di_format != XFS_DINODE_FMT_UUID) && - (ip->i_d.di_format != XFS_DINODE_FMT_BTREE) && - ((mp->m_attroffset >> 3) > ip->i_d.di_forkoff)) { - ip->i_d.di_forkoff = mp->m_attroffset >> 3; - ip->i_df.if_ext_max = XFS_IFORK_DSIZE(ip) / - (uint)sizeof(xfs_bmbt_rec_t); - ip->i_afp->if_ext_max = XFS_IFORK_ASIZE(ip) / - (uint)sizeof(xfs_bmbt_rec_t); + ip->i_d.di_format != XFS_DINODE_FMT_DEV && + ip->i_d.di_format != XFS_DINODE_FMT_UUID && + ip->i_d.di_format != XFS_DINODE_FMT_BTREE) { + uint dfl_forkoff = xfs_default_attroffset(ip) >> 3; + + if (dfl_forkoff > ip->i_d.di_forkoff) { + ip->i_d.di_forkoff = dfl_forkoff; + ip->i_df.if_ext_max = + XFS_IFORK_DSIZE(ip) / sizeof(xfs_bmbt_rec_t); + ip->i_afp->if_ext_max = + XFS_IFORK_ASIZE(ip) / sizeof(xfs_bmbt_rec_t); + } } } @@ -3502,12 +3242,14 @@ xfs_bmap_local_to_extents( xfs_iext_add(ifp, 0, 1); ep = xfs_iext_get_ext(ifp, 0); xfs_bmbt_set_allf(ep, 0, args.fsbno, 1, XFS_EXT_NORM); - XFS_BMAP_TRACE_POST_UPDATE("new", ip, 0, whichfork); + trace_xfs_bmap_post_update(ip, 0, + whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0, + _THIS_IP_); XFS_IFORK_NEXT_SET(ip, whichfork, 1); ip->i_d.di_nblocks = 1; - XFS_TRANS_MOD_DQUOT_BYINO(args.mp, tp, ip, + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, 1L); - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); } else { ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) == 0); xfs_bmap_forkoff_reset(ip->i_mount, ip, whichfork); @@ -3528,7 +3270,7 @@ done: * entry (null if none). Else, *lastxp will be set to the index * of the found entry; *gotp will contain the entry. */ -xfs_bmbt_rec_host_t * /* pointer to found extent entry */ +STATIC xfs_bmbt_rec_host_t * /* pointer to found extent entry */ xfs_bmap_search_multi_extents( xfs_ifork_t *ifp, /* inode fork pointer */ xfs_fileoff_t bno, /* block number searched for */ @@ -3578,8 +3320,6 @@ xfs_bmap_search_multi_extents( * *eofp will be set, and *prevp will contain the last entry (null if none). * Else, *lastxp will be set to the index of the found * entry; *gotp will contain the entry. - * - * Note this is public in libxfs for xfs_repair's phase6. */ xfs_bmbt_rec_host_t * /* pointer to found extent entry */ xfs_bmap_search_extents( @@ -3682,7 +3422,7 @@ xfs_bmap_add_attrfork( XFS_TRANS_PERM_LOG_RES, XFS_ADDAFORK_LOG_COUNT))) goto error0; xfs_ilock(ip, XFS_ILOCK_EXCL); - error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, blks, 0, rsvd ? + error = xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ? XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES : XFS_QMOPT_RES_REGBLKS); if (error) { @@ -3700,9 +3440,10 @@ xfs_bmap_add_attrfork( ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; } ASSERT(ip->i_d.di_anextents == 0); - IHOLD(ip); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + + xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + switch (ip->i_d.di_format) { case XFS_DINODE_FMT_DEV: ip->i_d.di_forkoff = roundup(sizeof(xfs_dev_t), 8) >> 3; @@ -3715,7 +3456,7 @@ xfs_bmap_add_attrfork( case XFS_DINODE_FMT_BTREE: ip->i_d.di_forkoff = xfs_attr_shortform_bytesfit(ip, size); if (!ip->i_d.di_forkoff) - ip->i_d.di_forkoff = mp->m_attroffset >> 3; + ip->i_d.di_forkoff = xfs_default_attroffset(ip) >> 3; else if (mp->m_flags & XFS_MOUNT_ATTR2) version = 2; break; @@ -3732,7 +3473,7 @@ xfs_bmap_add_attrfork( XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); ip->i_afp->if_flags = XFS_IFEXTENTS; logflags = 0; - XFS_BMAP_INIT(&flist, &firstblock); + xfs_bmap_init(&flist, &firstblock); switch (ip->i_d.di_format) { case XFS_DINODE_FMT_LOCAL: error = xfs_bmap_add_attrfork_local(tp, ip, &firstblock, &flist, @@ -3775,7 +3516,7 @@ xfs_bmap_add_attrfork( } if ((error = xfs_bmap_finish(&tp, &flist, &committed))) goto error2; - error = xfs_trans_commit(tp, XFS_TRANS_PERM_LOG_RES); + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); ASSERT(ip->i_df.if_ext_max == XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t)); return error; @@ -3812,7 +3553,7 @@ xfs_bmap_add_free( ASSERT(bno != NULLFSBLOCK); ASSERT(len > 0); ASSERT(len <= MAXEXTLEN); - ASSERT(!ISNULLSTARTBLOCK(bno)); + ASSERT(!isnullstartblock(bno)); agno = XFS_FSB_TO_AGNO(mp, bno); agbno = XFS_FSB_TO_AGBNO(mp, bno); ASSERT(agno < mp->m_sb.sb_agcount); @@ -3862,12 +3603,12 @@ xfs_bmap_compute_maxlevels( * (a signed 16-bit number, xfs_aextnum_t). * * Note that we can no longer assume that if we are in ATTR1 that - * the fork offset of all the inodes will be (m_attroffset >> 3) - * because we could have mounted with ATTR2 and then mounted back - * with ATTR1, keeping the di_forkoff's fixed but probably at - * various positions. Therefore, for both ATTR1 and ATTR2 - * we have to assume the worst case scenario of a minimum size - * available. + * the fork offset of all the inodes will be + * (xfs_default_attroffset(ip) >> 3) because we could have mounted + * with ATTR2 and then mounted back with ATTR1, keeping the + * di_forkoff's fixed but probably at various positions. Therefore, + * for both ATTR1 and ATTR2 we have to assume the worst case scenario + * of a minimum size available. */ if (whichfork == XFS_DATA_FORK) { maxleafents = MAXEXTNUM; @@ -4243,6 +3984,74 @@ error0: return XFS_ERROR(EFSCORRUPTED); } +#ifdef DEBUG +/* + * Add bmap trace insert entries for all the contents of the extent records. + */ +void +xfs_bmap_trace_exlist( + xfs_inode_t *ip, /* incore inode pointer */ + xfs_extnum_t cnt, /* count of entries in the list */ + int whichfork, /* data or attr fork */ + unsigned long caller_ip) +{ + xfs_extnum_t idx; /* extent record index */ + xfs_ifork_t *ifp; /* inode fork pointer */ + int state = 0; + + if (whichfork == XFS_ATTR_FORK) + state |= BMAP_ATTRFORK; + + ifp = XFS_IFORK_PTR(ip, whichfork); + ASSERT(cnt == (ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))); + for (idx = 0; idx < cnt; idx++) + trace_xfs_extlist(ip, idx, whichfork, caller_ip); +} + +/* + * Validate that the bmbt_irecs being returned from bmapi are valid + * given the callers original parameters. Specifically check the + * ranges of the returned irecs to ensure that they only extent beyond + * the given parameters if the XFS_BMAPI_ENTIRE flag was set. + */ +STATIC void +xfs_bmap_validate_ret( + xfs_fileoff_t bno, + xfs_filblks_t len, + int flags, + xfs_bmbt_irec_t *mval, + int nmap, + int ret_nmap) +{ + int i; /* index to map values */ + + ASSERT(ret_nmap <= nmap); + + for (i = 0; i < ret_nmap; i++) { + ASSERT(mval[i].br_blockcount > 0); + if (!(flags & XFS_BMAPI_ENTIRE)) { + ASSERT(mval[i].br_startoff >= bno); + ASSERT(mval[i].br_blockcount <= len); + ASSERT(mval[i].br_startoff + mval[i].br_blockcount <= + bno + len); + } else { + ASSERT(mval[i].br_startoff < bno + len); + ASSERT(mval[i].br_startoff + mval[i].br_blockcount > + bno); + } + ASSERT(i == 0 || + mval[i - 1].br_startoff + mval[i - 1].br_blockcount == + mval[i].br_startoff); + if ((flags & XFS_BMAPI_WRITE) && !(flags & XFS_BMAPI_DELAY)) + ASSERT(mval[i].br_startblock != DELAYSTARTBLOCK && + mval[i].br_startblock != HOLESTARTBLOCK); + ASSERT(mval[i].br_state == XFS_EXT_NORM || + mval[i].br_state == XFS_EXT_UNWRITTEN); + } +} +#endif /* DEBUG */ + + /* * Map file blocks to filesystem blocks. * File range is given by the bno/len pair. @@ -4268,13 +4077,12 @@ xfs_bmapi( xfs_extlen_t total, /* total blocks needed */ xfs_bmbt_irec_t *mval, /* output: map values */ int *nmap, /* i/o: mval size/count */ - xfs_bmap_free_t *flist, /* i/o: list extents to free */ - xfs_extdelta_t *delta) /* o: change made to incore extents */ + xfs_bmap_free_t *flist) /* i/o: list extents to free */ { xfs_fsblock_t abno; /* allocated block number */ xfs_extlen_t alen; /* allocated extent length */ xfs_fileoff_t aoff; /* allocated file offset */ - xfs_bmalloca_t bma; /* args for xfs_bmap_alloc */ + xfs_bmalloca_t bma = { 0 }; /* args for xfs_bmap_alloc */ xfs_btree_cur_t *cur; /* bmap btree cursor */ xfs_fileoff_t end; /* end of mapped file region */ int eof; /* we've hit the end of extents */ @@ -4289,7 +4097,7 @@ xfs_bmapi( xfs_extlen_t minlen; /* min allocation size */ xfs_mount_t *mp; /* xfs mount structure */ int n; /* current extent index */ - int nallocs; /* number of extents alloc\'d */ + int nallocs; /* number of extents alloc'd */ xfs_extnum_t nextents; /* number of extents in file */ xfs_fileoff_t obno; /* old block number (offset) */ xfs_bmbt_irec_t prev; /* previous file extent record */ @@ -4381,10 +4189,7 @@ xfs_bmapi( end = bno + len; obno = bno; bma.ip = NULL; - if (delta) { - delta->xed_startoff = NULLFILEOFF; - delta->xed_blockcount = 0; - } + while (bno < end && n < *nmap) { /* * Reading past eof, act as though there's a hole @@ -4394,7 +4199,7 @@ xfs_bmapi( got.br_startoff = end; inhole = eof || got.br_startoff > bno; wasdelay = wr && !inhole && !(flags & XFS_BMAPI_DELAY) && - ISNULLSTARTBLOCK(got.br_startblock); + isnullstartblock(got.br_startblock); /* * First, deal with the hole before the allocated space * that we found, if any. @@ -4405,19 +4210,13 @@ xfs_bmapi( * allocate the stuff asked for in this bmap call * but that wouldn't be as good. */ - if (wasdelay && !(flags & XFS_BMAPI_EXACT)) { + if (wasdelay) { alen = (xfs_extlen_t)got.br_blockcount; aoff = got.br_startoff; if (lastx != NULLEXTNUM && lastx) { ep = xfs_iext_get_ext(ifp, lastx - 1); xfs_bmbt_get_all(ep, &prev); } - } else if (wasdelay) { - alen = (xfs_extlen_t) - XFS_FILBLKS_MIN(len, - (got.br_startoff + - got.br_blockcount) - bno); - aoff = bno; } else { alen = (xfs_extlen_t) XFS_FILBLKS_MIN(len, MAXEXTLEN); @@ -4452,10 +4251,11 @@ xfs_bmapi( * adjusted later. We return if we haven't * allocated blocks already inside this loop. */ - if ((error = XFS_TRANS_RESERVE_QUOTA_NBLKS( - mp, NULL, ip, (long)alen, 0, + error = xfs_trans_reserve_quota_nblks( + NULL, ip, (long)alen, 0, rt ? XFS_QMOPT_RES_RTBLKS : - XFS_QMOPT_RES_REGBLKS))) { + XFS_QMOPT_RES_REGBLKS); + if (error) { if (n == 0) { *nmap = 0; ASSERT(cur == NULL); @@ -4478,13 +4278,13 @@ xfs_bmapi( -((int64_t)extsz), (flags & XFS_BMAPI_RSVBLOCKS)); } else { - error = xfs_mod_incore_sb(mp, + error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -((int64_t)alen), (flags & XFS_BMAPI_RSVBLOCKS)); } if (!error) { - error = xfs_mod_incore_sb(mp, + error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -((int64_t)indlen), (flags & XFS_BMAPI_RSVBLOCKS)); @@ -4494,7 +4294,7 @@ xfs_bmapi( (int64_t)extsz, (flags & XFS_BMAPI_RSVBLOCKS)); else if (error) - xfs_mod_incore_sb(mp, + xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, (int64_t)alen, (flags & XFS_BMAPI_RSVBLOCKS)); @@ -4504,8 +4304,8 @@ xfs_bmapi( if (XFS_IS_QUOTA_ON(mp)) /* unreserve the blocks now */ (void) - XFS_TRANS_UNRESERVE_QUOTA_NBLKS( - mp, NULL, ip, + xfs_trans_unreserve_quota_nblks( + NULL, ip, (long)alen, 0, rt ? XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS); @@ -4513,7 +4313,7 @@ xfs_bmapi( } ip->i_delayed_blks += alen; - abno = NULLSTARTBLOCK(indlen); + abno = nullstartblock(indlen); } else { /* * If first time, allocate and fill in @@ -4615,7 +4415,7 @@ xfs_bmapi( got.br_state = XFS_EXT_UNWRITTEN; } error = xfs_bmap_add_extent(ip, lastx, &cur, &got, - firstblock, flist, &tmp_logflags, delta, + firstblock, flist, &tmp_logflags, whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); logflags |= tmp_logflags; if (error) @@ -4629,8 +4429,8 @@ xfs_bmapi( aoff + alen); #ifdef DEBUG if (flags & XFS_BMAPI_DELAY) { - ASSERT(ISNULLSTARTBLOCK(got.br_startblock)); - ASSERT(STARTBLOCKVAL(got.br_startblock) > 0); + ASSERT(isnullstartblock(got.br_startblock)); + ASSERT(startblockval(got.br_startblock) > 0); } ASSERT(got.br_state == XFS_EXT_NORM || got.br_state == XFS_EXT_UNWRITTEN); @@ -4664,7 +4464,7 @@ xfs_bmapi( ASSERT((bno >= obno) || (n == 0)); ASSERT(bno < end); mval->br_startoff = bno; - if (ISNULLSTARTBLOCK(got.br_startblock)) { + if (isnullstartblock(got.br_startblock)) { ASSERT(!wr || (flags & XFS_BMAPI_DELAY)); mval->br_startblock = DELAYSTARTBLOCK; } else @@ -4686,7 +4486,7 @@ xfs_bmapi( ASSERT(mval->br_blockcount <= len); } else { *mval = got; - if (ISNULLSTARTBLOCK(mval->br_startblock)) { + if (isnullstartblock(mval->br_startblock)) { ASSERT(!wr || (flags & XFS_BMAPI_DELAY)); mval->br_startblock = DELAYSTARTBLOCK; } @@ -4696,8 +4496,12 @@ xfs_bmapi( * Check if writing previously allocated but * unwritten extents. */ - if (wr && mval->br_state == XFS_EXT_UNWRITTEN && - ((flags & (XFS_BMAPI_PREALLOC|XFS_BMAPI_DELAY)) == 0)) { + if (wr && + ((mval->br_state == XFS_EXT_UNWRITTEN && + ((flags & (XFS_BMAPI_PREALLOC|XFS_BMAPI_DELAY)) == 0)) || + (mval->br_state == XFS_EXT_NORM && + ((flags & (XFS_BMAPI_PREALLOC|XFS_BMAPI_CONVERT)) == + (XFS_BMAPI_PREALLOC|XFS_BMAPI_CONVERT))))) { /* * Modify (by adding) the state flag, if writing. */ @@ -4709,9 +4513,11 @@ xfs_bmapi( *firstblock; cur->bc_private.b.flist = flist; } - mval->br_state = XFS_EXT_NORM; + mval->br_state = (mval->br_state == XFS_EXT_UNWRITTEN) + ? XFS_EXT_NORM + : XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx, &cur, mval, - firstblock, flist, &tmp_logflags, delta, + firstblock, flist, &tmp_logflags, whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); logflags |= tmp_logflags; if (error) @@ -4801,25 +4607,17 @@ xfs_bmapi( ASSERT(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE || XFS_IFORK_NEXTENTS(ip, whichfork) > ifp->if_ext_max); error = 0; - if (delta && delta->xed_startoff != NULLFILEOFF) { - /* A change was actually made. - * Note that delta->xed_blockount is an offset at this - * point and needs to be converted to a block count. - */ - ASSERT(delta->xed_blockcount > delta->xed_startoff); - delta->xed_blockcount -= delta->xed_startoff; - } error0: /* * Log everything. Do this after conversion, there's no point in * logging the extent records if we've converted to btree format. */ - if ((logflags & XFS_ILOG_FEXT(whichfork)) && + if ((logflags & xfs_ilog_fext(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS) - logflags &= ~XFS_ILOG_FEXT(whichfork); - else if ((logflags & XFS_ILOG_FBROOT(whichfork)) && + logflags &= ~xfs_ilog_fext(whichfork); + else if ((logflags & xfs_ilog_fbroot(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE) - logflags &= ~XFS_ILOG_FBROOT(whichfork); + logflags &= ~xfs_ilog_fbroot(whichfork); /* * Log whatever the flags say, even if error. Otherwise we might miss * detecting a case where the data is changed, there's an error, @@ -4896,7 +4694,7 @@ xfs_bmapi_single( *fsb = NULLFSBLOCK; return 0; } - ASSERT(!ISNULLSTARTBLOCK(got.br_startblock)); + ASSERT(!isnullstartblock(got.br_startblock)); ASSERT(bno < got.br_startoff + got.br_blockcount); *fsb = got.br_startblock + (bno - got.br_startoff); ifp->if_lastex = lastx; @@ -4920,8 +4718,6 @@ xfs_bunmapi( xfs_fsblock_t *firstblock, /* first allocated block controls a.g. for allocs */ xfs_bmap_free_t *flist, /* i/o: list extents to free */ - xfs_extdelta_t *delta, /* o: change made to incore - extents */ int *done) /* set if not done yet */ { xfs_btree_cur_t *cur; /* bmap btree cursor */ @@ -4946,7 +4742,8 @@ xfs_bunmapi( int rsvd; /* OK to allocate reserved blocks */ xfs_fsblock_t sum; - xfs_bunmap_trace(ip, bno, len, flags, (inst_t *)__return_address); + trace_xfs_bunmap(ip, bno, len, flags, _RET_IP_); + whichfork = (flags & XFS_BMAPI_ATTRFORK) ? XFS_ATTR_FORK : XFS_DATA_FORK; ifp = XFS_IFORK_PTR(ip, whichfork); @@ -4979,10 +4776,7 @@ xfs_bunmapi( bno = start + len - 1; ep = xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, &prev); - if (delta) { - delta->xed_startoff = NULLFILEOFF; - delta->xed_blockcount = 0; - } + /* * Check to see if the given block number is past the end of the * file, back up to the last block if so... @@ -5028,7 +4822,7 @@ xfs_bunmapi( */ ASSERT(ep != NULL); del = got; - wasdel = ISNULLSTARTBLOCK(del.br_startblock); + wasdel = isnullstartblock(del.br_startblock); if (got.br_startoff < start) { del.br_startoff = start; del.br_blockcount -= start - got.br_startoff; @@ -5080,7 +4874,7 @@ xfs_bunmapi( } del.br_state = XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx, &cur, &del, - firstblock, flist, &logflags, delta, + firstblock, flist, &logflags, XFS_DATA_FORK, 0); if (error) goto error0; @@ -5123,7 +4917,7 @@ xfs_bunmapi( xfs_bmbt_get_all(xfs_iext_get_ext(ifp, lastx - 1), &prev); ASSERT(prev.br_state == XFS_EXT_NORM); - ASSERT(!ISNULLSTARTBLOCK(prev.br_startblock)); + ASSERT(!isnullstartblock(prev.br_startblock)); ASSERT(del.br_startblock == prev.br_startblock + prev.br_blockcount); if (prev.br_startoff < start) { @@ -5135,7 +4929,7 @@ xfs_bunmapi( prev.br_state = XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx - 1, &cur, &prev, firstblock, flist, &logflags, - delta, XFS_DATA_FORK, 0); + XFS_DATA_FORK, 0); if (error) goto error0; goto nodelete; @@ -5144,14 +4938,14 @@ xfs_bunmapi( del.br_state = XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx, &cur, &del, firstblock, flist, &logflags, - delta, XFS_DATA_FORK, 0); + XFS_DATA_FORK, 0); if (error) goto error0; goto nodelete; } } if (wasdel) { - ASSERT(STARTBLOCKVAL(del.br_startblock) > 0); + ASSERT(startblockval(del.br_startblock) > 0); /* Update realtime/data freespace, unreserve quota */ if (isrt) { xfs_filblks_t rtexts; @@ -5160,14 +4954,14 @@ xfs_bunmapi( do_div(rtexts, mp->m_sb.sb_rextsize); xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, (int64_t)rtexts, rsvd); - (void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, - NULL, ip, -((long)del.br_blockcount), 0, + (void)xfs_trans_reserve_quota_nblks(NULL, + ip, -((long)del.br_blockcount), 0, XFS_QMOPT_RES_RTBLKS); } else { - xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, + xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, (int64_t)del.br_blockcount, rsvd); - (void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, - NULL, ip, -((long)del.br_blockcount), 0, + (void)xfs_trans_reserve_quota_nblks(NULL, + ip, -((long)del.br_blockcount), 0, XFS_QMOPT_RES_REGBLKS); } ip->i_delayed_blks -= del.br_blockcount; @@ -5197,7 +4991,7 @@ xfs_bunmapi( goto error0; } error = xfs_bmap_del_extent(ip, tp, lastx, flist, cur, &del, - &tmp_logflags, delta, whichfork, rsvd); + &tmp_logflags, whichfork, rsvd); logflags |= tmp_logflags; if (error) goto error0; @@ -5254,25 +5048,17 @@ nodelete: ASSERT(ifp->if_ext_max == XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); error = 0; - if (delta && delta->xed_startoff != NULLFILEOFF) { - /* A change was actually made. - * Note that delta->xed_blockount is an offset at this - * point and needs to be converted to a block count. - */ - ASSERT(delta->xed_blockcount > delta->xed_startoff); - delta->xed_blockcount -= delta->xed_startoff; - } error0: /* * Log everything. Do this after conversion, there's no point in * logging the extent records if we've converted to btree format. */ - if ((logflags & XFS_ILOG_FEXT(whichfork)) && + if ((logflags & xfs_ilog_fext(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS) - logflags &= ~XFS_ILOG_FEXT(whichfork); - else if ((logflags & XFS_ILOG_FBROOT(whichfork)) && + logflags &= ~xfs_ilog_fext(whichfork); + else if ((logflags & xfs_ilog_fbroot(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE) - logflags &= ~XFS_ILOG_FBROOT(whichfork); + logflags &= ~xfs_ilog_fbroot(whichfork); /* * Log inode even in the error case, if the transaction * is dirty we'll need to shut down the filesystem. @@ -5330,7 +5116,202 @@ xfs_bmap_isaeof( */ *aeof = (off >= s.br_startoff && off < s.br_startoff + s.br_blockcount && - ISNULLSTARTBLOCK(s.br_startblock)) || + isnullstartblock(s.br_startblock)) || off >= s.br_startoff + s.br_blockcount; return 0; } + +/* + * Check if the endoff is outside the last extent. If so the caller will grow + * the allocation to a stripe unit boundary. + */ +int /* error */ +xfs_bmap_eof( + xfs_inode_t *ip, /* incore inode pointer */ + xfs_fileoff_t endoff, /* file offset in fsblocks */ + int whichfork, /* data or attribute fork */ + int *eof) /* result value */ +{ + xfs_fsblock_t blockcount; /* extent block count */ + int error; /* error return value */ + xfs_ifork_t *ifp; /* inode fork pointer */ + xfs_bmbt_rec_host_t *lastrec; /* extent record pointer */ + xfs_extnum_t nextents; /* number of file extents */ + xfs_fileoff_t startoff; /* extent starting file offset */ + + ASSERT(whichfork == XFS_DATA_FORK); + ifp = XFS_IFORK_PTR(ip, whichfork); + if (!(ifp->if_flags & XFS_IFEXTENTS) && + (error = xfs_iread_extents(NULL, ip, whichfork))) + return error; + nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + if (nextents == 0) { + *eof = 1; + return 0; + } + /* + * Go to the last extent + */ + lastrec = xfs_iext_get_ext(ifp, nextents - 1); + startoff = xfs_bmbt_get_startoff(lastrec); + blockcount = xfs_bmbt_get_blockcount(lastrec); + *eof = endoff >= startoff + blockcount; + return 0; +} + +/* + * Count fsblocks of the given fork. + */ +int /* error */ +xfs_bmap_count_blocks( + xfs_trans_t *tp, /* transaction pointer */ + xfs_inode_t *ip, /* incore inode */ + int whichfork, /* data or attr fork */ + int *count) /* out: count of blocks */ +{ + struct xfs_btree_block *block; /* current btree block */ + xfs_fsblock_t bno; /* block # of "block" */ + xfs_ifork_t *ifp; /* fork structure */ + int level; /* btree level, for checking */ + xfs_mount_t *mp; /* file system mount structure */ + __be64 *pp; /* pointer to block address */ + + bno = NULLFSBLOCK; + mp = ip->i_mount; + ifp = XFS_IFORK_PTR(ip, whichfork); + if ( XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS ) { + xfs_bmap_count_leaves(ifp, 0, + ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t), + count); + return 0; + } + + /* + * Root level must use BMAP_BROOT_PTR_ADDR macro to get ptr out. + */ + block = ifp->if_broot; + level = be16_to_cpu(block->bb_level); + ASSERT(level > 0); + pp = XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes); + bno = be64_to_cpu(*pp); + ASSERT(bno != NULLDFSBNO); + ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount); + ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks); + + if (unlikely(xfs_bmap_count_tree(mp, tp, ifp, bno, level, count) < 0)) { + XFS_ERROR_REPORT("xfs_bmap_count_blocks(2)", XFS_ERRLEVEL_LOW, + mp); + return XFS_ERROR(EFSCORRUPTED); + } + + return 0; +} + +/* + * Recursively walks each level of a btree + * to count total fsblocks is use. + */ +STATIC int /* error */ +xfs_bmap_count_tree( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_fsblock_t blockno, /* file system block number */ + int levelin, /* level in btree */ + int *count) /* Count of blocks */ +{ + int error; + xfs_buf_t *bp, *nbp; + int level = levelin; + __be64 *pp; + xfs_fsblock_t bno = blockno; + xfs_fsblock_t nextbno; + struct xfs_btree_block *block, *nextblock; + int numrecs; + + if ((error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, XFS_BMAP_BTREE_REF))) + return error; + *count += 1; + block = XFS_BUF_TO_BLOCK(bp); + + if (--level) { + /* Not at node above leaves, count this level of nodes */ + nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib); + while (nextbno != NULLFSBLOCK) { + if ((error = xfs_btree_read_bufl(mp, tp, nextbno, + 0, &nbp, XFS_BMAP_BTREE_REF))) + return error; + *count += 1; + nextblock = XFS_BUF_TO_BLOCK(nbp); + nextbno = be64_to_cpu(nextblock->bb_u.l.bb_rightsib); + xfs_trans_brelse(tp, nbp); + } + + /* Dive to the next level */ + pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); + bno = be64_to_cpu(*pp); + if (unlikely((error = + xfs_bmap_count_tree(mp, tp, ifp, bno, level, count)) < 0)) { + xfs_trans_brelse(tp, bp); + XFS_ERROR_REPORT("xfs_bmap_count_tree(1)", + XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + xfs_trans_brelse(tp, bp); + } else { + /* count all level 1 nodes and their leaves */ + for (;;) { + nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib); + numrecs = be16_to_cpu(block->bb_numrecs); + xfs_bmap_disk_count_leaves(mp, block, numrecs, count); + xfs_trans_brelse(tp, bp); + if (nextbno == NULLFSBLOCK) + break; + bno = nextbno; + if ((error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, + XFS_BMAP_BTREE_REF))) + return error; + *count += 1; + block = XFS_BUF_TO_BLOCK(bp); + } + } + return 0; +} + +/* + * Count leaf blocks given a range of extent records. + */ +STATIC void +xfs_bmap_count_leaves( + xfs_ifork_t *ifp, + xfs_extnum_t idx, + int numrecs, + int *count) +{ + int b; + + for (b = 0; b < numrecs; b++) { + xfs_bmbt_rec_host_t *frp = xfs_iext_get_ext(ifp, idx + b); + *count += xfs_bmbt_get_blockcount(frp); + } +} + +/* + * Count leaf blocks given a range of extent records originally + * in btree format. + */ +STATIC void +xfs_bmap_disk_count_leaves( + struct xfs_mount *mp, + struct xfs_btree_block *block, + int numrecs, + int *count) +{ + int b; + xfs_bmbt_rec_t *frp; + + for (b = 1; b <= numrecs; b++) { + frp = XFS_BMBT_REC_ADDR(mp, block, b); + *count += xfs_bmbt_disk_get_blockcount(frp); + } +} diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index a7a0805..ff51fdd 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -71,8 +71,7 @@ xfs_bmdr_to_bmbt( * This code must be in sync with the routines xfs_bmbt_get_startoff, * xfs_bmbt_get_startblock, xfs_bmbt_get_blockcount and xfs_bmbt_get_state. */ - -STATIC_INLINE void +STATIC void __xfs_bmbt_get_all( __uint64_t l0, __uint64_t l1, @@ -83,25 +82,25 @@ __xfs_bmbt_get_all( ext_flag = (int)(l0 >> (64 - BMBT_EXNTFLAG_BITLEN)); s->br_startoff = ((xfs_fileoff_t)l0 & - XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; + xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; #if XFS_BIG_BLKNOS - s->br_startblock = (((xfs_fsblock_t)l0 & XFS_MASK64LO(9)) << 43) | + s->br_startblock = (((xfs_fsblock_t)l0 & xfs_mask64lo(9)) << 43) | (((xfs_fsblock_t)l1) >> 21); #else #ifdef DEBUG { xfs_dfsbno_t b; - b = (((xfs_dfsbno_t)l0 & XFS_MASK64LO(9)) << 43) | + b = (((xfs_dfsbno_t)l0 & xfs_mask64lo(9)) << 43) | (((xfs_dfsbno_t)l1) >> 21); - ASSERT((b >> 32) == 0 || ISNULLDSTARTBLOCK(b)); + ASSERT((b >> 32) == 0 || isnulldstartblock(b)); s->br_startblock = (xfs_fsblock_t)b; } #else /* !DEBUG */ s->br_startblock = (xfs_fsblock_t)(((xfs_dfsbno_t)l1) >> 21); #endif /* DEBUG */ #endif /* XFS_BIG_BLKNOS */ - s->br_blockcount = (xfs_filblks_t)(l1 & XFS_MASK64LO(21)); + s->br_blockcount = (xfs_filblks_t)(l1 & xfs_mask64lo(21)); /* This is xfs_extent_state() in-line */ if (ext_flag) { ASSERT(s->br_blockcount != 0); /* saved for DMIG */ @@ -126,7 +125,7 @@ xfs_filblks_t xfs_bmbt_get_blockcount( xfs_bmbt_rec_host_t *r) { - return (xfs_filblks_t)(r->l1 & XFS_MASK64LO(21)); + return (xfs_filblks_t)(r->l1 & xfs_mask64lo(21)); } /* @@ -137,15 +136,15 @@ xfs_bmbt_get_startblock( xfs_bmbt_rec_host_t *r) { #if XFS_BIG_BLKNOS - return (((xfs_fsblock_t)r->l0 & XFS_MASK64LO(9)) << 43) | + return (((xfs_fsblock_t)r->l0 & xfs_mask64lo(9)) << 43) | (((xfs_fsblock_t)r->l1) >> 21); #else #ifdef DEBUG xfs_dfsbno_t b; - b = (((xfs_dfsbno_t)r->l0 & XFS_MASK64LO(9)) << 43) | + b = (((xfs_dfsbno_t)r->l0 & xfs_mask64lo(9)) << 43) | (((xfs_dfsbno_t)r->l1) >> 21); - ASSERT((b >> 32) == 0 || ISNULLDSTARTBLOCK(b)); + ASSERT((b >> 32) == 0 || isnulldstartblock(b)); return (xfs_fsblock_t)b; #else /* !DEBUG */ return (xfs_fsblock_t)(((xfs_dfsbno_t)r->l1) >> 21); @@ -161,7 +160,7 @@ xfs_bmbt_get_startoff( xfs_bmbt_rec_host_t *r) { return ((xfs_fileoff_t)r->l0 & - XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; + xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; } xfs_exntst_t @@ -175,16 +174,6 @@ xfs_bmbt_get_state( ext_flag); } -/* Endian flipping versions of the bmbt extraction functions */ -void -xfs_bmbt_disk_get_all( - xfs_bmbt_rec_t *r, - xfs_bmbt_irec_t *s) -{ - __xfs_bmbt_get_all(get_unaligned_be64(&r->l0), - get_unaligned_be64(&r->l1), s); -} - /* * Extract the blockcount field from an on disk bmap extent record. */ @@ -192,7 +181,7 @@ xfs_filblks_t xfs_bmbt_disk_get_blockcount( xfs_bmbt_rec_t *r) { - return (xfs_filblks_t)(be64_to_cpu(r->l1) & XFS_MASK64LO(21)); + return (xfs_filblks_t)(be64_to_cpu(r->l1) & xfs_mask64lo(21)); } /* @@ -203,7 +192,7 @@ xfs_bmbt_disk_get_startoff( xfs_bmbt_rec_t *r) { return ((xfs_fileoff_t)be64_to_cpu(r->l0) & - XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; + xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; } @@ -221,33 +210,33 @@ xfs_bmbt_set_allf( int extent_flag = (state == XFS_EXT_NORM) ? 0 : 1; ASSERT(state == XFS_EXT_NORM || state == XFS_EXT_UNWRITTEN); - ASSERT((startoff & XFS_MASK64HI(64-BMBT_STARTOFF_BITLEN)) == 0); - ASSERT((blockcount & XFS_MASK64HI(64-BMBT_BLOCKCOUNT_BITLEN)) == 0); + ASSERT((startoff & xfs_mask64hi(64-BMBT_STARTOFF_BITLEN)) == 0); + ASSERT((blockcount & xfs_mask64hi(64-BMBT_BLOCKCOUNT_BITLEN)) == 0); #if XFS_BIG_BLKNOS - ASSERT((startblock & XFS_MASK64HI(64-BMBT_STARTBLOCK_BITLEN)) == 0); + ASSERT((startblock & xfs_mask64hi(64-BMBT_STARTBLOCK_BITLEN)) == 0); r->l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)startoff << 9) | ((xfs_bmbt_rec_base_t)startblock >> 43); r->l1 = ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); #else /* !XFS_BIG_BLKNOS */ - if (ISNULLSTARTBLOCK(startblock)) { + if (isnullstartblock(startblock)) { r->l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)startoff << 9) | - (xfs_bmbt_rec_base_t)XFS_MASK64LO(9); - r->l1 = XFS_MASK64HI(11) | + (xfs_bmbt_rec_base_t)xfs_mask64lo(9); + r->l1 = xfs_mask64hi(11) | ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); } else { r->l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)startoff << 9); r->l1 = ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); } #endif /* XFS_BIG_BLKNOS */ } @@ -279,11 +268,11 @@ xfs_bmbt_disk_set_allf( int extent_flag = (state == XFS_EXT_NORM) ? 0 : 1; ASSERT(state == XFS_EXT_NORM || state == XFS_EXT_UNWRITTEN); - ASSERT((startoff & XFS_MASK64HI(64-BMBT_STARTOFF_BITLEN)) == 0); - ASSERT((blockcount & XFS_MASK64HI(64-BMBT_BLOCKCOUNT_BITLEN)) == 0); + ASSERT((startoff & xfs_mask64hi(64-BMBT_STARTOFF_BITLEN)) == 0); + ASSERT((blockcount & xfs_mask64hi(64-BMBT_BLOCKCOUNT_BITLEN)) == 0); #if XFS_BIG_BLKNOS - ASSERT((startblock & XFS_MASK64HI(64-BMBT_STARTBLOCK_BITLEN)) == 0); + ASSERT((startblock & xfs_mask64hi(64-BMBT_STARTBLOCK_BITLEN)) == 0); r->l0 = cpu_to_be64( ((xfs_bmbt_rec_base_t)extent_flag << 63) | @@ -292,17 +281,17 @@ xfs_bmbt_disk_set_allf( r->l1 = cpu_to_be64( ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21))); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21))); #else /* !XFS_BIG_BLKNOS */ - if (ISNULLSTARTBLOCK(startblock)) { + if (isnullstartblock(startblock)) { r->l0 = cpu_to_be64( ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)startoff << 9) | - (xfs_bmbt_rec_base_t)XFS_MASK64LO(9)); - r->l1 = cpu_to_be64(XFS_MASK64HI(11) | + (xfs_bmbt_rec_base_t)xfs_mask64lo(9)); + r->l1 = cpu_to_be64(xfs_mask64hi(11) | ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21))); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21))); } else { r->l0 = cpu_to_be64( ((xfs_bmbt_rec_base_t)extent_flag << 63) | @@ -310,7 +299,7 @@ xfs_bmbt_disk_set_allf( r->l1 = cpu_to_be64( ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21))); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21))); } #endif /* XFS_BIG_BLKNOS */ } @@ -318,7 +307,7 @@ xfs_bmbt_disk_set_allf( /* * Set all the fields in a bmap extent record from the uncompressed form. */ -void +STATIC void xfs_bmbt_disk_set_all( xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s) @@ -335,9 +324,9 @@ xfs_bmbt_set_blockcount( xfs_bmbt_rec_host_t *r, xfs_filblks_t v) { - ASSERT((v & XFS_MASK64HI(43)) == 0); - r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)XFS_MASK64HI(43)) | - (xfs_bmbt_rec_base_t)(v & XFS_MASK64LO(21)); + ASSERT((v & xfs_mask64hi(43)) == 0); + r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64hi(43)) | + (xfs_bmbt_rec_base_t)(v & xfs_mask64lo(21)); } /* @@ -349,21 +338,21 @@ xfs_bmbt_set_startblock( xfs_fsblock_t v) { #if XFS_BIG_BLKNOS - ASSERT((v & XFS_MASK64HI(12)) == 0); - r->l0 = (r->l0 & (xfs_bmbt_rec_base_t)XFS_MASK64HI(55)) | + ASSERT((v & xfs_mask64hi(12)) == 0); + r->l0 = (r->l0 & (xfs_bmbt_rec_base_t)xfs_mask64hi(55)) | (xfs_bmbt_rec_base_t)(v >> 43); - r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)) | + r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64lo(21)) | (xfs_bmbt_rec_base_t)(v << 21); #else /* !XFS_BIG_BLKNOS */ - if (ISNULLSTARTBLOCK(v)) { - r->l0 |= (xfs_bmbt_rec_base_t)XFS_MASK64LO(9); - r->l1 = (xfs_bmbt_rec_base_t)XFS_MASK64HI(11) | + if (isnullstartblock(v)) { + r->l0 |= (xfs_bmbt_rec_base_t)xfs_mask64lo(9); + r->l1 = (xfs_bmbt_rec_base_t)xfs_mask64hi(11) | ((xfs_bmbt_rec_base_t)v << 21) | - (r->l1 & (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); } else { - r->l0 &= ~(xfs_bmbt_rec_base_t)XFS_MASK64LO(9); + r->l0 &= ~(xfs_bmbt_rec_base_t)xfs_mask64lo(9); r->l1 = ((xfs_bmbt_rec_base_t)v << 21) | - (r->l1 & (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); } #endif /* XFS_BIG_BLKNOS */ } @@ -376,10 +365,10 @@ xfs_bmbt_set_startoff( xfs_bmbt_rec_host_t *r, xfs_fileoff_t v) { - ASSERT((v & XFS_MASK64HI(9)) == 0); - r->l0 = (r->l0 & (xfs_bmbt_rec_base_t) XFS_MASK64HI(1)) | + ASSERT((v & xfs_mask64hi(9)) == 0); + r->l0 = (r->l0 & (xfs_bmbt_rec_base_t) xfs_mask64hi(1)) | ((xfs_bmbt_rec_base_t)v << 9) | - (r->l0 & (xfs_bmbt_rec_base_t)XFS_MASK64LO(9)); + (r->l0 & (xfs_bmbt_rec_base_t)xfs_mask64lo(9)); } /* @@ -392,9 +381,9 @@ xfs_bmbt_set_state( { ASSERT(v == XFS_EXT_NORM || v == XFS_EXT_UNWRITTEN); if (v == XFS_EXT_NORM) - r->l0 &= XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN); + r->l0 &= xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN); else - r->l0 |= XFS_MASK64HI(BMBT_EXNTFLAG_BITLEN); + r->l0 |= xfs_mask64hi(BMBT_EXNTFLAG_BITLEN); } /* @@ -563,7 +552,7 @@ xfs_bmbt_alloc_block( cur->bc_private.b.allocated++; cur->bc_private.b.ip->i_d.di_nblocks++; xfs_trans_log_inode(args.tp, cur->bc_private.b.ip, XFS_ILOG_CORE); - XFS_TRANS_MOD_DQUOT_BYINO(args.mp, args.tp, cur->bc_private.b.ip, + xfs_trans_mod_dquot_byino(args.tp, cur->bc_private.b.ip, XFS_TRANS_DQ_BCOUNT, 1L); new->l = cpu_to_be64(args.fsbno); @@ -591,7 +580,7 @@ xfs_bmbt_free_block( ip->i_d.di_nblocks--; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); xfs_trans_binval(tp, bp); return 0; } @@ -752,12 +741,6 @@ xfs_bmbt_trace_enter( (void *)a0, (void *)a1, (void *)a2, (void *)a3, (void *)a4, (void *)a5, (void *)a6, (void *)a7, (void *)a8, (void *)a9, (void *)a10); - ktrace_enter(ip->i_btrace, - (void *)((__psint_t)type | (whichfork << 8) | (line << 16)), - (void *)func, (void *)s, (void *)ip, (void *)cur, - (void *)a0, (void *)a1, (void *)a2, (void *)a3, - (void *)a4, (void *)a5, (void *)a6, (void *)a7, - (void *)a8, (void *)a9, (void *)a10); } STATIC void @@ -806,6 +789,16 @@ xfs_bmbt_trace_record( } #endif /* XFS_BTREE_TRACE */ +/* Endian flipping versions of the bmbt extraction functions */ +void +xfs_bmbt_disk_get_all( + xfs_bmbt_rec_t *r, + xfs_bmbt_irec_t *s) +{ + __xfs_bmbt_get_all(get_unaligned_be64(&r->l0), + get_unaligned_be64(&r->l1), s); +} + static const struct xfs_btree_ops xfs_bmbt_ops = { .rec_len = sizeof(xfs_bmbt_rec_t), .key_len = sizeof(xfs_bmbt_key_t), diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 83c2114..02854db 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -59,7 +59,7 @@ xfs_btree_check_lblock( XFS_ERRTAG_BTREE_CHECK_LBLOCK, XFS_RANDOM_BTREE_CHECK_LBLOCK))) { if (bp) - xfs_buftrace("LBTREE ERROR", bp); + trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_ERROR_REPORT("xfs_btree_check_lblock", XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); @@ -97,9 +97,9 @@ xfs_btree_check_sblock( XFS_ERRTAG_BTREE_CHECK_SBLOCK, XFS_RANDOM_BTREE_CHECK_SBLOCK))) { if (bp) - xfs_buftrace("SBTREE ERROR", bp); - XFS_ERROR_REPORT("xfs_btree_check_sblock", XFS_ERRLEVEL_LOW, - cur->bc_mp); + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR("xfs_btree_check_sblock", + XFS_ERRLEVEL_LOW, cur->bc_mp, block); return XFS_ERROR(EFSCORRUPTED); } return 0; @@ -199,7 +199,7 @@ xfs_btree_del_cursor( */ for (i = 0; i < cur->bc_nlevels; i++) { if (cur->bc_bufs[i]) - xfs_btree_setbuf(cur, i, NULL); + xfs_trans_brelse(cur->bc_tp, cur->bc_bufs[i]); else if (!error) break; } @@ -670,8 +670,8 @@ xfs_btree_readahead_lblock( struct xfs_btree_block *block) { int rval = 0; - xfs_fsblock_t left = be64_to_cpu(block->bb_u.l.bb_leftsib); - xfs_fsblock_t right = be64_to_cpu(block->bb_u.l.bb_rightsib); + xfs_dfsbno_t left = be64_to_cpu(block->bb_u.l.bb_leftsib); + xfs_dfsbno_t right = be64_to_cpu(block->bb_u.l.bb_rightsib); if ((lr & XFS_BTCUR_LEFTRA) && left != NULLDFSBNO) { xfs_btree_reada_bufl(cur->bc_mp, left, 1); @@ -747,22 +747,19 @@ xfs_btree_readahead( * Set the buffer for level "lev" in the cursor to bp, releasing * any previous buffer. */ -void +STATIC void xfs_btree_setbuf( xfs_btree_cur_t *cur, /* btree cursor */ int lev, /* level in btree */ xfs_buf_t *bp) /* new buffer to set */ { struct xfs_btree_block *b; /* btree block */ - xfs_buf_t *obp; /* old buffer pointer */ - obp = cur->bc_bufs[lev]; - if (obp) - xfs_trans_brelse(cur->bc_tp, obp); + if (cur->bc_bufs[lev]) + xfs_trans_brelse(cur->bc_tp, cur->bc_bufs[lev]); cur->bc_bufs[lev] = bp; cur->bc_ra[lev] = 0; - if (!bp) - return; + b = XFS_BUF_TO_BLOCK(bp); if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { if (be64_to_cpu(b->bb_u.l.bb_leftsib) == NULLDFSBNO) @@ -783,7 +780,7 @@ xfs_btree_ptr_is_null( union xfs_btree_ptr *ptr) { if (cur->bc_flags & XFS_BTREE_LONG_PTRS) - return be64_to_cpu(ptr->l) == NULLFSBLOCK; + return be64_to_cpu(ptr->l) == NULLDFSBNO; else return be32_to_cpu(ptr->s) == NULLAGBLOCK; } @@ -794,7 +791,7 @@ xfs_btree_set_ptr_null( union xfs_btree_ptr *ptr) { if (cur->bc_flags & XFS_BTREE_LONG_PTRS) - ptr->l = cpu_to_be64(NULLFSBLOCK); + ptr->l = cpu_to_be64(NULLDFSBNO); else ptr->s = cpu_to_be32(NULLAGBLOCK); } @@ -858,8 +855,8 @@ xfs_btree_init_block( new->bb_numrecs = cpu_to_be16(numrecs); if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { - new->bb_u.l.bb_leftsib = cpu_to_be64(NULLFSBLOCK); - new->bb_u.l.bb_rightsib = cpu_to_be64(NULLFSBLOCK); + new->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); + new->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); } else { new->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK); new->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); @@ -900,7 +897,7 @@ xfs_btree_buf_to_ptr( ptr->l = cpu_to_be64(XFS_DADDR_TO_FSB(cur->bc_mp, XFS_BUF_ADDR(bp))); else { - ptr->s = cpu_to_be32(XFS_DADDR_TO_AGBNO(cur->bc_mp, + ptr->s = cpu_to_be32(xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp))); } } @@ -911,7 +908,7 @@ xfs_btree_ptr_to_daddr( union xfs_btree_ptr *ptr) { if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { - ASSERT(be64_to_cpu(ptr->l) != NULLFSBLOCK); + ASSERT(be64_to_cpu(ptr->l) != NULLDFSBNO); return XFS_FSB_TO_DADDR(cur->bc_mp, be64_to_cpu(ptr->l)); } else { @@ -931,13 +928,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); @@ -956,7 +953,7 @@ xfs_btree_get_buf_block( xfs_daddr_t d; /* need to sort out how callers deal with failures first */ - ASSERT(!(flags & XFS_BUF_TRYLOCK)); + ASSERT(!(flags & XBF_TRYLOCK)); d = xfs_btree_ptr_to_daddr(cur, ptr); *bpp = xfs_trans_get_buf(cur->bc_tp, mp->m_ddev_targp, d, @@ -987,7 +984,7 @@ xfs_btree_read_buf_block( int error; /* need to sort out how callers deal with failures first */ - ASSERT(!(flags & XFS_BUF_TRYLOCK)); + ASSERT(!(flags & XBF_TRYLOCK)); d = xfs_btree_ptr_to_daddr(cur, ptr); error = xfs_trans_read_buf(mp, cur->bc_tp, mp->m_ddev_targp, d, @@ -1823,7 +1820,7 @@ xfs_btree_lshift( /* * We add one entry to the left side and remove one for the right side. - * Accout for it here, the changes will be updated on disk and logged + * Account for it here, the changes will be updated on disk and logged * later. */ lrecs++; @@ -2394,7 +2391,7 @@ xfs_btree_new_iroot( xfs_btree_log_ptrs(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs)); *logflags |= - XFS_ILOG_CORE | XFS_ILOG_FBROOT(cur->bc_private.b.whichfork); + XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork); *stat = 1; XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); return 0; @@ -2891,7 +2888,7 @@ error0: * inode we have to copy the single block it was pointing to into the * inode. */ -int +STATIC int xfs_btree_kill_iroot( struct xfs_btree_cur *cur) { @@ -2988,13 +2985,50 @@ xfs_btree_kill_iroot( cur->bc_bufs[level - 1] = NULL; be16_add_cpu(&block->bb_level, -1); xfs_trans_log_inode(cur->bc_tp, ip, - XFS_ILOG_CORE | XFS_ILOG_FBROOT(cur->bc_private.b.whichfork)); + XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork)); cur->bc_nlevels--; out0: XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); return 0; } +/* + * Kill the current root node, and replace it with it's only child node. + */ +STATIC int +xfs_btree_kill_root( + struct xfs_btree_cur *cur, + struct xfs_buf *bp, + int level, + union xfs_btree_ptr *newroot) +{ + int error; + + XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); + XFS_BTREE_STATS_INC(cur, killroot); + + /* + * Update the root pointer, decreasing the level by 1 and then + * free the old root. + */ + cur->bc_ops->set_root(cur, newroot, -1); + + error = cur->bc_ops->free_block(cur, bp); + if (error) { + XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); + return error; + } + + XFS_BTREE_STATS_INC(cur, free); + + cur->bc_bufs[level] = NULL; + cur->bc_ra[level] = 0; + cur->bc_nlevels--; + + XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); + return 0; +} + STATIC int xfs_btree_dec_cursor( struct xfs_btree_cur *cur, @@ -3179,7 +3213,7 @@ xfs_btree_delrec( * Make it the new root of the btree. */ pp = xfs_btree_ptr_addr(cur, 1, block); - error = cur->bc_ops->kill_root(cur, bp, level, pp); + error = xfs_btree_kill_root(cur, bp, level, pp); if (error) goto error0; } else if (level > 0) { @@ -3475,7 +3509,7 @@ xfs_btree_delrec( XFS_BTREE_STATS_INC(cur, join); /* - * Fix up the the number of records and right block pointer in the + * Fix up the number of records and right block pointer in the * surviving block, and log it. */ xfs_btree_set_numrecs(left, lrecs + rrecs); diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index 40b52a4..3eb34d6 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -24,8 +24,6 @@ * Routines to implement directories as Btrees of hashed names. */ -static int xfs_error_level; - /*======================================================================== * Function prototypes for the kernel. *========================================================================*/ @@ -553,16 +551,14 @@ xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, xfs_da_intnode_t *node; xfs_da_node_entry_t *btree; int tmp; - xfs_mount_t *mp; node = oldblk->bp->data; - mp = state->mp; ASSERT(be16_to_cpu(node->hdr.info.magic) == XFS_DA_NODE_MAGIC); ASSERT((oldblk->index >= 0) && (oldblk->index <= be16_to_cpu(node->hdr.count))); ASSERT(newblk->blkno != 0); if (state->args->whichfork == XFS_DATA_FORK) - ASSERT(newblk->blkno >= mp->m_dirleafblk && - newblk->blkno < mp->m_dirfreeblk); + ASSERT(newblk->blkno >= state->mp->m_dirleafblk && + newblk->blkno < state->mp->m_dirfreeblk); /* * We may need to make some room before we insert the new node. @@ -1476,7 +1472,7 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, * This is implemented with some source-level loop unrolling. */ xfs_dahash_t -xfs_da_hashname(const uchar_t *name, int namelen) +xfs_da_hashname(const __uint8_t *name, int namelen) { xfs_dahash_t hash; @@ -1506,8 +1502,8 @@ xfs_da_hashname(const uchar_t *name, int namelen) enum xfs_dacmp xfs_da_compname( struct xfs_da_args *args, - const char *name, - int len) + const unsigned char *name, + int len) { return (args->namelen == len && memcmp(args->name, name, len) == 0) ? XFS_CMP_EXACT : XFS_CMP_DIFFERENT; @@ -1539,11 +1535,14 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) int nmap, error, w, count, c, got, i, mapi; xfs_trans_t *tp; xfs_mount_t *mp; + xfs_drfsbno_t nblks; dp = args->dp; mp = dp->i_mount; w = args->whichfork; tp = args->trans; + nblks = dp->i_d.di_nblocks; + /* * For new directories adjust the file offset and block count. */ @@ -1567,10 +1566,10 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) nmap = 1; ASSERT(args->firstblock != NULL); if ((error = xfs_bmapi(tp, dp, bno, count, - XFS_BMAPI_AFLAG(w)|XFS_BMAPI_WRITE|XFS_BMAPI_METADATA| + xfs_bmapi_aflag(w)|XFS_BMAPI_WRITE|XFS_BMAPI_METADATA| XFS_BMAPI_CONTIG, args->firstblock, args->total, &map, &nmap, - args->flist, NULL))) { + args->flist))) { return error; } ASSERT(nmap <= 1); @@ -1588,11 +1587,10 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) nmap = MIN(XFS_BMAP_MAX_NMAP, count); c = (int)(bno + count - b); if ((error = xfs_bmapi(tp, dp, b, c, - XFS_BMAPI_AFLAG(w)|XFS_BMAPI_WRITE| + xfs_bmapi_aflag(w)|XFS_BMAPI_WRITE| XFS_BMAPI_METADATA, args->firstblock, args->total, - &mapp[mapi], &nmap, args->flist, - NULL))) { + &mapp[mapi], &nmap, args->flist))) { kmem_free(mapp); return error; } @@ -1620,6 +1618,8 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) } if (mapp != &map) kmem_free(mapp); + /* account for newly allocated blocks in reserved blocks total */ + args->total -= dp->i_d.di_nblocks - nblks; *new_blkno = (xfs_dablk_t)bno; return 0; } @@ -1850,8 +1850,8 @@ xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, * the last block to the place we want to kill. */ if ((error = xfs_bunmapi(tp, dp, dead_blkno, count, - XFS_BMAPI_AFLAG(w)|XFS_BMAPI_METADATA, - 0, args->firstblock, args->flist, NULL, + xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA, + 0, args->firstblock, args->flist, &done)) == ENOSPC) { if (w != XFS_DATA_FORK) break; @@ -1896,8 +1896,6 @@ xfs_da_map_covers_blocks( /* * Make a dabuf. * Used for get_buf, read_buf, read_bufr, and reada_buf. - * - * Note: this requires user-space public scope for libxfs_da_read_bufr */ int xfs_da_do_buf( @@ -1957,8 +1955,8 @@ xfs_da_do_buf( if ((error = xfs_bmapi(trans, dp, (xfs_fileoff_t)bno, nfsb, XFS_BMAPI_METADATA | - XFS_BMAPI_AFLAG(whichfork), - NULL, 0, mapp, &nmap, NULL, NULL))) + xfs_bmapi_aflag(whichfork), + NULL, 0, mapp, &nmap, NULL))) goto exit0; } } else { @@ -2019,7 +2017,7 @@ xfs_da_do_buf( mappedbno, nmapped, 0, &bp); break; case 3: - xfs_baread(mp->m_ddev_targp, mappedbno, nmapped); + xfs_buf_readahead(mp->m_ddev_targp, mappedbno, nmapped); error = 0; bp = NULL; break; @@ -2077,7 +2075,7 @@ xfs_da_do_buf( (be32_to_cpu(free->hdr.magic) != XFS_DIR2_FREE_MAGIC), mp, XFS_ERRTAG_DA_READ_BUF, XFS_RANDOM_DA_READ_BUF))) { - xfs_buftrace("DA READ ERROR", rbp->bps[0]); + trace_xfs_da_btree_corrupt(rbp->bps[0], _RET_IP_); XFS_CORRUPTION_ERROR("xfs_da_do_buf(2)", XFS_ERRLEVEL_LOW, mp, info); error = XFS_ERROR(EFSCORRUPTED); @@ -2171,7 +2169,7 @@ kmem_zone_t *xfs_dabuf_zone; /* dabuf zone */ xfs_da_state_t * xfs_da_state_alloc(void) { - return kmem_zone_zalloc(xfs_da_state_zone, KM_SLEEP); + return kmem_zone_zalloc(xfs_da_state_zone, KM_NOFS); } /* @@ -2231,9 +2229,9 @@ xfs_da_buf_make(int nbuf, xfs_buf_t **bps, inst_t *ra) int off; if (nbuf == 1) - dabuf = kmem_zone_alloc(xfs_dabuf_zone, KM_SLEEP); + dabuf = kmem_zone_alloc(xfs_dabuf_zone, KM_NOFS); else - dabuf = kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_SLEEP); + dabuf = kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_NOFS); dabuf->dirty = 0; #ifdef XFS_DABUF_DEBUG dabuf->ra = ra; diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c index 71134f8..d475118 100644 --- a/libxfs/xfs_dir2.c +++ b/libxfs/xfs_dir2.c @@ -18,9 +18,7 @@ #include -struct xfs_name xfs_name_dotdot = {"..", 2}; - -extern const struct xfs_nameops xfs_default_nameops; +struct xfs_name xfs_name_dotdot = { (unsigned char *)"..", 2}; /* * ASCII case-insensitive (ie. A-Z) support for directories that was @@ -42,8 +40,8 @@ xfs_ascii_ci_hashname( STATIC enum xfs_dacmp xfs_ascii_ci_compname( struct xfs_da_args *args, - const char *name, - int len) + const unsigned char *name, + int len) { enum xfs_dacmp result; int i; @@ -223,7 +221,7 @@ xfs_dir_createname( int xfs_dir_cilookup_result( struct xfs_da_args *args, - const char *name, + const unsigned char *name, int len) { if (args->cmpresult == XFS_CMP_DIFFERENT) @@ -232,7 +230,7 @@ xfs_dir_cilookup_result( !(args->op_flags & XFS_DA_OP_CILOOKUP)) return EEXIST; - args->value = kmem_alloc(len, KM_MAYFAIL); + args->value = kmem_alloc(len, KM_NOFS | KM_MAYFAIL); if (!args->value) return ENOMEM; @@ -420,11 +418,14 @@ xfs_dir2_grow_inode( xfs_mount_t *mp; int nmap; /* number of bmap entries */ xfs_trans_t *tp; + xfs_drfsbno_t nblks; + + trace_xfs_dir2_grow_inode(args, space); - xfs_dir2_trace_args_s("grow_inode", args, space); dp = args->dp; tp = args->trans; mp = dp->i_mount; + nblks = dp->i_d.di_nblocks; /* * Set lowest possible block in the space requested. */ @@ -443,7 +444,7 @@ xfs_dir2_grow_inode( if ((error = xfs_bmapi(tp, dp, bno, count, XFS_BMAPI_WRITE|XFS_BMAPI_METADATA|XFS_BMAPI_CONTIG, args->firstblock, args->total, &map, &nmap, - args->flist, NULL))) + args->flist))) return error; ASSERT(nmap <= 1); if (nmap == 1) { @@ -475,8 +476,7 @@ xfs_dir2_grow_inode( if ((error = xfs_bmapi(tp, dp, b, c, XFS_BMAPI_WRITE|XFS_BMAPI_METADATA, args->firstblock, args->total, - &mapp[mapi], &nmap, args->flist, - NULL))) { + &mapp[mapi], &nmap, args->flist))) { kmem_free(mapp); return error; } @@ -517,7 +517,11 @@ xfs_dir2_grow_inode( */ if (mapp != &map) kmem_free(mapp); + + /* account for newly allocated blocks in reserved blocks total */ + args->total -= dp->i_d.di_nblocks - nblks; *dbp = xfs_dir2_da_to_db(mp, (xfs_dablk_t)bno); + /* * Update file's size if this is the data space and it grew. */ @@ -594,7 +598,8 @@ xfs_dir2_shrink_inode( xfs_mount_t *mp; xfs_trans_t *tp; - xfs_dir2_trace_args_db("shrink_inode", args, db, bp); + trace_xfs_dir2_shrink_inode(args, db); + dp = args->dp; mp = dp->i_mount; tp = args->trans; @@ -604,7 +609,7 @@ xfs_dir2_shrink_inode( */ if ((error = xfs_bunmapi(tp, dp, da, mp->m_dirblkfsbs, XFS_BMAPI_METADATA, 0, args->firstblock, args->flist, - NULL, &done))) { + &done))) { /* * ENOSPC actually can happen if we're in a removename with * no space reservation, and the resulting block removal diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index d197b0b..b614ea6 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -36,8 +36,8 @@ static xfs_dahash_t xfs_dir_hash_dot, xfs_dir_hash_dotdot; void xfs_dir_startup(void) { - xfs_dir_hash_dot = xfs_da_hashname(".", 1); - xfs_dir_hash_dotdot = xfs_da_hashname("..", 2); + xfs_dir_hash_dot = xfs_da_hashname((unsigned char *)".", 1); + xfs_dir_hash_dotdot = xfs_da_hashname((unsigned char *)"..", 2); } /* @@ -73,7 +73,8 @@ xfs_dir2_block_addname( __be16 *tagp; /* pointer to tag value */ xfs_trans_t *tp; /* transaction structure */ - xfs_dir2_trace_args("block_addname", args); + trace_xfs_dir2_block_addname(args); + dp = args->dp; tp = args->trans; mp = dp->i_mount; @@ -467,7 +468,8 @@ xfs_dir2_block_lookup( int error; /* error return value */ xfs_mount_t *mp; /* filesystem mount point */ - xfs_dir2_trace_args("block_lookup", args); + trace_xfs_dir2_block_lookup(args); + /* * Get the buffer, look up the entry. * If not found (ENOENT) then return, have no buffer. @@ -624,7 +626,8 @@ xfs_dir2_block_removename( int size; /* shortform size */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args("block_removename", args); + trace_xfs_dir2_block_removename(args); + /* * Look up the entry in the block. Gets the buffer and entry index. * It will always be there, the vnodeops level does a lookup first. @@ -700,7 +703,8 @@ xfs_dir2_block_replace( int error; /* error return value */ xfs_mount_t *mp; /* filesystem mount point */ - xfs_dir2_trace_args("block_replace", args); + trace_xfs_dir2_block_replace(args); + /* * Lookup the entry in the directory. Get buffer and entry index. * This will always succeed since the caller has already done a lookup. @@ -774,7 +778,8 @@ xfs_dir2_leaf_to_block( int to; /* block/leaf to index */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args_bb("leaf_to_block", args, lbp, dbp); + trace_xfs_dir2_leaf_to_block(args); + dp = args->dp; tp = args->trans; mp = dp->i_mount; @@ -921,7 +926,8 @@ xfs_dir2_sf_to_block( xfs_trans_t *tp; /* transaction pointer */ struct xfs_name name; - xfs_dir2_trace_args("sf_to_block", args); + trace_xfs_dir2_sf_to_block(args); + dp = args->dp; tp = args->trans; mp = dp->i_mount; @@ -943,10 +949,10 @@ xfs_dir2_sf_to_block( */ buf_len = dp->i_df.if_bytes; - buf = kmem_alloc(dp->i_df.if_bytes, KM_SLEEP); + buf = kmem_alloc(buf_len, KM_SLEEP); - memcpy(buf, sfp, dp->i_df.if_bytes); - xfs_idata_realloc(dp, -dp->i_df.if_bytes, XFS_DATA_FORK); + memcpy(buf, sfp, buf_len); + xfs_idata_realloc(dp, -buf_len, XFS_DATA_FORK); dp->i_d.di_size = 0; xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); /* diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 9a1aace..9ce2320 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -57,7 +57,8 @@ xfs_dir2_block_to_leaf( int needscan; /* need to rescan bestfree */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args_b("block_to_leaf", args, dbp); + trace_xfs_dir2_block_to_leaf(args); + dp = args->dp; mp = dp->i_mount; tp = args->trans; @@ -165,7 +166,8 @@ xfs_dir2_leaf_addname( xfs_trans_t *tp; /* transaction pointer */ xfs_dir2_db_t use_block; /* data block number */ - xfs_dir2_trace_args("leaf_addname", args); + trace_xfs_dir2_leaf_addname(args); + dp = args->dp; tp = args->trans; mp = dp->i_mount; @@ -526,7 +528,7 @@ xfs_dir2_leaf_addname( * Check the internal consistency of a leaf1 block. * Pop an assert if something is wrong. */ -void +STATIC void xfs_dir2_leaf_check( xfs_inode_t *dp, /* incore directory inode */ xfs_dabuf_t *bp) /* leaf's buffer */ @@ -881,7 +883,8 @@ xfs_dir2_leaf_lookup( xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args("leaf_lookup", args); + trace_xfs_dir2_leaf_lookup(args); + /* * Look up name in the leaf block, returning both buffers and index. */ @@ -1069,7 +1072,8 @@ xfs_dir2_leaf_removename( xfs_dir2_data_off_t oldbest; /* old value of best free */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args("leaf_removename", args); + trace_xfs_dir2_leaf_removename(args); + /* * Lookup the leaf entry, get the leaf and data blocks read in. */ @@ -1201,7 +1205,8 @@ xfs_dir2_leaf_replace( xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args("leaf_replace", args); + trace_xfs_dir2_leaf_replace(args); + /* * Look up the entry. */ @@ -1381,7 +1386,9 @@ xfs_dir2_node_to_leaf( if (state->path.active > 1) return 0; args = state->args; - xfs_dir2_trace_args("node_to_leaf", args); + + trace_xfs_dir2_node_to_leaf(args); + mp = state->mp; dp = args->dp; tp = args->trans; diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index db88adc..e4e20d6 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -43,7 +43,7 @@ static int xfs_dir2_node_addname_int(xfs_da_args_t *args, /* * Log entries from a freespace block. */ -void +STATIC void xfs_dir2_free_log_bests( xfs_trans_t *tp, /* transaction pointer */ xfs_dabuf_t *bp, /* freespace buffer */ @@ -101,7 +101,8 @@ xfs_dir2_leaf_to_node( __be16 *to; /* pointer to freespace entry */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args_b("leaf_to_node", args, lbp); + trace_xfs_dir2_leaf_to_node(args); + dp = args->dp; mp = dp->i_mount; tp = args->trans; @@ -174,7 +175,8 @@ xfs_dir2_leafn_add( xfs_mount_t *mp; /* filesystem mount point */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args_sb("leafn_add", args, index, bp); + trace_xfs_dir2_leafn_add(args, index); + dp = args->dp; mp = dp->i_mount; tp = args->trans; @@ -689,8 +691,8 @@ xfs_dir2_leafn_moveents( int stale; /* count stale leaves copied */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args_bibii("leafn_moveents", args, bp_s, start_s, bp_d, - start_d, count); + trace_xfs_dir2_leafn_moveents(args, start_s, start_d, count); + /* * Silently return if nothing to do. */ @@ -911,7 +913,8 @@ xfs_dir2_leafn_remove( int needscan; /* need to rescan data frees */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args_sb("leafn_remove", args, index, bp); + trace_xfs_dir2_leafn_remove(args, index); + dp = args->dp; tp = args->trans; mp = dp->i_mount; @@ -1082,7 +1085,7 @@ xfs_dir2_leafn_remove( } xfs_dir2_leafn_check(dp, bp); /* - * Return indication of whether this leaf block is emtpy enough + * Return indication of whether this leaf block is empty enough * to justify trying to join it with a neighbor. */ *rval = @@ -1341,7 +1344,8 @@ xfs_dir2_node_addname( int rval; /* sub-return value */ xfs_da_state_t *state; /* btree cursor */ - xfs_dir2_trace_args("node_addname", args); + trace_xfs_dir2_node_addname(args); + /* * Allocate and initialize the state (btree cursor). */ @@ -1800,7 +1804,8 @@ xfs_dir2_node_lookup( int rval; /* operation return value */ xfs_da_state_t *state; /* btree cursor */ - xfs_dir2_trace_args("node_lookup", args); + trace_xfs_dir2_node_lookup(args); + /* * Allocate and initialize the btree cursor. */ @@ -1853,7 +1858,8 @@ xfs_dir2_node_removename( int rval; /* operation return value */ xfs_da_state_t *state; /* btree cursor */ - xfs_dir2_trace_args("node_removename", args); + trace_xfs_dir2_node_removename(args); + /* * Allocate and initialize the btree cursor. */ @@ -1922,7 +1928,8 @@ xfs_dir2_node_replace( int rval; /* internal return value */ xfs_da_state_t *state; /* btree cursor */ - xfs_dir2_trace_args("node_replace", args); + trace_xfs_dir2_node_replace(args); + /* * Allocate and initialize the btree cursor. */ diff --git a/libxfs/xfs_dir2_sf.c b/libxfs/xfs_dir2_sf.c index 77f30de..6b5e6d4 100644 --- a/libxfs/xfs_dir2_sf.c +++ b/libxfs/xfs_dir2_sf.c @@ -148,7 +148,8 @@ xfs_dir2_block_to_sf( xfs_dir2_sf_t *sfp; /* shortform structure */ xfs_ino_t temp; - xfs_dir2_trace_args_sb("block_to_sf", args, size, bp); + trace_xfs_dir2_block_to_sf(args); + dp = args->dp; mp = dp->i_mount; @@ -260,7 +261,8 @@ xfs_dir2_sf_addname( xfs_dir2_sf_t *sfp; /* shortform structure */ xfs_dir2_sf_entry_t *sfep = NULL; /* shortform entry */ - xfs_dir2_trace_args("sf_addname", args); + trace_xfs_dir2_sf_addname(args); + ASSERT(xfs_dir2_sf_lookup(args) == ENOENT); dp = args->dp; ASSERT(dp->i_df.if_flags & XFS_IFINLINE); @@ -633,7 +635,8 @@ xfs_dir2_sf_create( xfs_dir2_sf_t *sfp; /* shortform structure */ int size; /* directory size */ - xfs_dir2_trace_args_i("sf_create", args, pino); + trace_xfs_dir2_sf_create(args); + dp = args->dp; ASSERT(dp != NULL); @@ -688,7 +691,8 @@ xfs_dir2_sf_lookup( enum xfs_dacmp cmp; /* comparison result */ xfs_dir2_sf_entry_t *ci_sfep; /* case-insens. entry */ - xfs_dir2_trace_args("sf_lookup", args); + trace_xfs_dir2_sf_lookup(args); + xfs_dir2_sf_check(args); dp = args->dp; @@ -771,7 +775,8 @@ xfs_dir2_sf_removename( xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ xfs_dir2_sf_t *sfp; /* shortform structure */ - xfs_dir2_trace_args("sf_removename", args); + trace_xfs_dir2_sf_removename(args); + dp = args->dp; ASSERT(dp->i_df.if_flags & XFS_IFINLINE); @@ -862,7 +867,8 @@ xfs_dir2_sf_replace( xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ xfs_dir2_sf_t *sfp; /* shortform structure */ - xfs_dir2_trace_args("sf_replace", args); + trace_xfs_dir2_sf_replace(args); + dp = args->dp; ASSERT(dp->i_df.if_flags & XFS_IFINLINE); @@ -1005,7 +1011,8 @@ xfs_dir2_sf_toino4( xfs_dir2_sf_entry_t *sfep; /* new sf entry */ xfs_dir2_sf_t *sfp; /* new sf directory */ - xfs_dir2_trace_args("sf_toino4", args); + trace_xfs_dir2_sf_toino4(args); + dp = args->dp; /* @@ -1082,7 +1089,8 @@ xfs_dir2_sf_toino8( xfs_dir2_sf_entry_t *sfep; /* new sf entry */ xfs_dir2_sf_t *sfp; /* new sf directory */ - xfs_dir2_trace_args("sf_toino8", args); + trace_xfs_dir2_sf_toino8(args); + dp = args->dp; /* diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 32ae4b0..1fcafb6 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -18,73 +18,6 @@ #include -/* - * Internal functions. - */ - -/* - * Log specified fields for the inode given by bp and off. - */ -STATIC void -xfs_ialloc_log_di( - xfs_trans_t *tp, /* transaction pointer */ - xfs_buf_t *bp, /* inode buffer */ - int off, /* index of inode in buffer */ - int fields) /* bitmask of fields to log */ -{ - int first; /* first byte number */ - int ioffset; /* off in bytes */ - int last; /* last byte number */ - xfs_mount_t *mp; /* mount point structure */ - static const short offsets[] = { /* field offsets */ - /* keep in sync with bits */ - offsetof(xfs_dinode_core_t, di_magic), - offsetof(xfs_dinode_core_t, di_mode), - offsetof(xfs_dinode_core_t, di_version), - offsetof(xfs_dinode_core_t, di_format), - offsetof(xfs_dinode_core_t, di_onlink), - offsetof(xfs_dinode_core_t, di_uid), - offsetof(xfs_dinode_core_t, di_gid), - offsetof(xfs_dinode_core_t, di_nlink), - offsetof(xfs_dinode_core_t, di_projid_lo), - offsetof(xfs_dinode_core_t, di_projid_hi), - offsetof(xfs_dinode_core_t, di_pad), - offsetof(xfs_dinode_core_t, di_atime), - offsetof(xfs_dinode_core_t, di_mtime), - offsetof(xfs_dinode_core_t, di_ctime), - offsetof(xfs_dinode_core_t, di_size), - offsetof(xfs_dinode_core_t, di_nblocks), - offsetof(xfs_dinode_core_t, di_extsize), - offsetof(xfs_dinode_core_t, di_nextents), - offsetof(xfs_dinode_core_t, di_anextents), - offsetof(xfs_dinode_core_t, di_forkoff), - offsetof(xfs_dinode_core_t, di_aformat), - offsetof(xfs_dinode_core_t, di_dmevmask), - offsetof(xfs_dinode_core_t, di_dmstate), - offsetof(xfs_dinode_core_t, di_flags), - offsetof(xfs_dinode_core_t, di_gen), - offsetof(xfs_dinode_t, di_next_unlinked), - offsetof(xfs_dinode_t, di_u), - offsetof(xfs_dinode_t, di_a), - sizeof(xfs_dinode_t) - }; - - - ASSERT(offsetof(xfs_dinode_t, di_core) == 0); - ASSERT((fields & (XFS_DI_U|XFS_DI_A)) == 0); - mp = tp->t_mountp; - /* - * Get the inode-relative first and last bytes for these fields - */ - xfs_btree_offsets(fields, offsets, XFS_DI_NUM_BITS, &first, &last); - /* - * Convert to buffer offsets and log it. - */ - ioffset = off << mp->m_sb.sb_inodelog; - first += ioffset; - last += ioffset; - xfs_trans_log_buf(tp, bp, first, last); -} /* * Allocation group level functions. @@ -101,75 +34,35 @@ xfs_ialloc_cluster_alignment( } /* - * Lookup the record equal to ino in the btree given by cur. - */ -STATIC int /* error */ -xfs_inobt_lookup_eq( - struct xfs_btree_cur *cur, /* btree cursor */ - xfs_agino_t ino, /* starting inode of chunk */ - __int32_t fcnt, /* free inode count */ - xfs_inofree_t free, /* free inode mask */ - int *stat) /* success/failure */ -{ - cur->bc_rec.i.ir_startino = ino; - cur->bc_rec.i.ir_freecount = fcnt; - cur->bc_rec.i.ir_free = free; - return xfs_btree_lookup(cur, XFS_LOOKUP_EQ, stat); -} - -/* - * Lookup the first record greater than or equal to ino - * in the btree given by cur. + * Lookup a record by ino in the btree given by cur. */ int /* error */ -xfs_inobt_lookup_ge( +xfs_inobt_lookup( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agino_t ino, /* starting inode of chunk */ - __int32_t fcnt, /* free inode count */ - xfs_inofree_t free, /* free inode mask */ + xfs_lookup_t dir, /* <=, >=, == */ int *stat) /* success/failure */ { cur->bc_rec.i.ir_startino = ino; - cur->bc_rec.i.ir_freecount = fcnt; - cur->bc_rec.i.ir_free = free; - return xfs_btree_lookup(cur, XFS_LOOKUP_GE, stat); + cur->bc_rec.i.ir_freecount = 0; + cur->bc_rec.i.ir_free = 0; + return xfs_btree_lookup(cur, dir, stat); } /* - * Lookup the first record less than or equal to ino - * in the btree given by cur. - */ -int /* error */ -xfs_inobt_lookup_le( - struct xfs_btree_cur *cur, /* btree cursor */ - xfs_agino_t ino, /* starting inode of chunk */ - __int32_t fcnt, /* free inode count */ - xfs_inofree_t free, /* free inode mask */ - int *stat) /* success/failure */ -{ - cur->bc_rec.i.ir_startino = ino; - cur->bc_rec.i.ir_freecount = fcnt; - cur->bc_rec.i.ir_free = free; - return xfs_btree_lookup(cur, XFS_LOOKUP_LE, stat); -} - -/* - * Update the record referred to by cur to the value given - * by [ino, fcnt, free]. + * Update the record referred to by cur to the value given. * This either works (return 0) or gets an EFSCORRUPTED error. */ STATIC int /* error */ xfs_inobt_update( struct xfs_btree_cur *cur, /* btree cursor */ - xfs_agino_t ino, /* starting inode of chunk */ - __int32_t fcnt, /* free inode count */ - xfs_inofree_t free) /* free inode mask */ + xfs_inobt_rec_incore_t *irec) /* btree record */ { union xfs_btree_rec rec; - rec.inobt.ir_startino = cpu_to_be32(ino); - rec.inobt.ir_freecount = cpu_to_be32(fcnt); - rec.inobt.ir_free = cpu_to_be64(free); + rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino); + rec.inobt.ir_freecount = cpu_to_be32(irec->ir_freecount); + rec.inobt.ir_free = cpu_to_be64(irec->ir_free); return xfs_btree_update(cur, &rec); } @@ -179,9 +72,7 @@ xfs_inobt_update( int /* error */ xfs_inobt_get_rec( struct xfs_btree_cur *cur, /* btree cursor */ - xfs_agino_t *ino, /* output: starting inode of chunk */ - __int32_t *fcnt, /* output: number of free inodes */ - xfs_inofree_t *free, /* output: free inode mask */ + xfs_inobt_rec_incore_t *irec, /* btree record */ int *stat) /* output: success/failure */ { union xfs_btree_rec *rec; @@ -189,14 +80,136 @@ xfs_inobt_get_rec( error = xfs_btree_get_rec(cur, &rec, stat); if (!error && *stat == 1) { - *ino = be32_to_cpu(rec->inobt.ir_startino); - *fcnt = be32_to_cpu(rec->inobt.ir_freecount); - *free = be64_to_cpu(rec->inobt.ir_free); + irec->ir_startino = be32_to_cpu(rec->inobt.ir_startino); + irec->ir_freecount = be32_to_cpu(rec->inobt.ir_freecount); + irec->ir_free = be64_to_cpu(rec->inobt.ir_free); } return error; } /* + * Verify that the number of free inodes in the AGI is correct. + */ +#ifdef DEBUG +STATIC int +xfs_check_agi_freecount( + struct xfs_btree_cur *cur, + struct xfs_agi *agi) +{ + if (cur->bc_nlevels == 1) { + xfs_inobt_rec_incore_t rec; + int freecount = 0; + int error; + int i; + + error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); + if (error) + return error; + + do { + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + return error; + + if (i) { + freecount += rec.ir_freecount; + error = xfs_btree_increment(cur, 0, &i); + if (error) + return error; + } + } while (i == 1); + + if (!XFS_FORCED_SHUTDOWN(cur->bc_mp)) + ASSERT(freecount == be32_to_cpu(agi->agi_freecount)); + } + return 0; +} +#else +#define xfs_check_agi_freecount(cur, agi) 0 +#endif + +/* + * Initialise a new set of inodes. + */ +STATIC void +xfs_ialloc_inode_init( + struct xfs_mount *mp, + struct xfs_trans *tp, + xfs_agnumber_t agno, + xfs_agblock_t agbno, + xfs_agblock_t length, + unsigned int gen) +{ + struct xfs_buf *fbuf; + struct xfs_dinode *free; + int blks_per_cluster, nbufs, ninodes; + int version; + int i, j; + xfs_daddr_t d; + + /* + * Loop over the new block(s), filling in the inodes. + * For small block sizes, manipulate the inodes in buffers + * which are multiples of the blocks size. + */ + if (mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(mp)) { + blks_per_cluster = 1; + nbufs = length; + ninodes = mp->m_sb.sb_inopblock; + } else { + blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) / + mp->m_sb.sb_blocksize; + nbufs = length / blks_per_cluster; + ninodes = blks_per_cluster * mp->m_sb.sb_inopblock; + } + + /* + * Figure out what version number to use in the inodes we create. + * If the superblock version has caught up to the one that supports + * the new inode format, then use the new inode version. Otherwise + * use the old version so that old kernels will continue to be + * able to use the file system. + */ + if (xfs_sb_version_hasnlink(&mp->m_sb)) + version = 2; + else + version = 1; + + for (j = 0; j < nbufs; j++) { + /* + * Get the block. + */ + d = XFS_AGB_TO_DADDR(mp, agno, agbno + (j * blks_per_cluster)); + fbuf = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, + mp->m_bsize * blks_per_cluster, + XBF_LOCK); + ASSERT(fbuf); + ASSERT(!XFS_BUF_GETERROR(fbuf)); + + /* + * Initialize all inodes in this buffer and then log them. + * + * XXX: It would be much better if we had just one transaction + * to log a whole cluster of inodes instead of all the + * individual transactions causing a lot of log traffic. + */ + xfs_buf_zero(fbuf, 0, ninodes << mp->m_sb.sb_inodelog); + for (i = 0; i < ninodes; i++) { + int ioffset = i << mp->m_sb.sb_inodelog; + uint isize = sizeof(struct xfs_dinode); + + free = xfs_make_iptr(mp, fbuf, i); + free->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); + free->di_version = version; + free->di_gen = cpu_to_be32(gen); + free->di_next_unlinked = cpu_to_be32(NULLAGINO); + xfs_trans_log_buf(tp, fbuf, ioffset, ioffset + isize - 1); + } + xfs_trans_inode_alloc_buf(tp, fbuf); + } +} + +/* * Allocate new inodes in the allocation group specified by agbp. * Return 0 for success, else error code. */ @@ -208,24 +221,16 @@ xfs_ialloc_ag_alloc( { xfs_agi_t *agi; /* allocation group header */ xfs_alloc_arg_t args; /* allocation argument structure */ - int blks_per_cluster; /* fs blocks per inode cluster */ xfs_btree_cur_t *cur; /* inode btree cursor */ - xfs_daddr_t d; /* disk addr of buffer */ xfs_agnumber_t agno; int error; - xfs_buf_t *fbuf; /* new free inodes' buffer */ - xfs_dinode_t *free; /* new free inode structure */ - int i; /* inode counter */ - int j; /* block counter */ - int nbufs; /* num bufs of new inodes */ + int i; xfs_agino_t newino; /* new first inode's number */ xfs_agino_t newlen; /* new number of inodes */ - int ninodes; /* num inodes per buf */ xfs_agino_t thisino; /* current inode number, for loop */ - int version; /* inode version number to use */ int isaligned = 0; /* inode allocation at stripe unit */ /* boundary */ - unsigned int gen; + struct xfs_perag *pag; args.tp = tp; args.mp = tp->t_mountp; @@ -246,12 +251,12 @@ xfs_ialloc_ag_alloc( */ agi = XFS_BUF_TO_AGI(agbp); newino = be32_to_cpu(agi->agi_newino); + agno = be32_to_cpu(agi->agi_seqno); args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) + XFS_IALLOC_BLOCKS(args.mp); if (likely(newino != NULLAGINO && (args.agbno < be32_to_cpu(agi->agi_length)))) { - args.fsbno = XFS_AGB_TO_FSB(args.mp, - be32_to_cpu(agi->agi_seqno), args.agbno); + args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); args.type = XFS_ALLOCTYPE_THIS_BNO; args.mod = args.total = args.wasdel = args.isfl = args.userdata = args.minalignslop = 0; @@ -274,7 +279,7 @@ xfs_ialloc_ag_alloc( args.minalignslop = xfs_ialloc_cluster_alignment(&args) - 1; /* Allow space for the inode btree to split. */ - args.minleft = XFS_IN_MAXLEVELS(args.mp) - 1; + args.minleft = args.mp->m_in_maxlevels - 1; if ((error = xfs_alloc_vextent(&args))) return error; } else @@ -302,8 +307,7 @@ xfs_ialloc_ag_alloc( * For now, just allocate blocks up front. */ args.agbno = be32_to_cpu(agi->agi_root); - args.fsbno = XFS_AGB_TO_FSB(args.mp, - be32_to_cpu(agi->agi_seqno), args.agbno); + args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); /* * Allocate a fixed-size extent of inodes. */ @@ -314,7 +318,7 @@ xfs_ialloc_ag_alloc( /* * Allow space for the inode btree to split. */ - args.minleft = XFS_IN_MAXLEVELS(args.mp) - 1; + args.minleft = args.mp->m_in_maxlevels - 1; if ((error = xfs_alloc_vextent(&args))) return error; } @@ -326,8 +330,7 @@ xfs_ialloc_ag_alloc( if (isaligned && args.fsbno == NULLFSBLOCK) { args.type = XFS_ALLOCTYPE_NEAR_BNO; args.agbno = be32_to_cpu(agi->agi_root); - args.fsbno = XFS_AGB_TO_FSB(args.mp, - be32_to_cpu(agi->agi_seqno), args.agbno); + args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); args.alignment = xfs_ialloc_cluster_alignment(&args); if ((error = xfs_alloc_vextent(&args))) return error; @@ -338,78 +341,30 @@ xfs_ialloc_ag_alloc( return 0; } ASSERT(args.len == args.minlen); - /* - * Convert the results. - */ - newino = XFS_OFFBNO_TO_AGINO(args.mp, args.agbno, 0); - /* - * Loop over the new block(s), filling in the inodes. - * For small block sizes, manipulate the inodes in buffers - * which are multiples of the blocks size. - */ - if (args.mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(args.mp)) { - blks_per_cluster = 1; - nbufs = (int)args.len; - ninodes = args.mp->m_sb.sb_inopblock; - } else { - blks_per_cluster = XFS_INODE_CLUSTER_SIZE(args.mp) / - args.mp->m_sb.sb_blocksize; - nbufs = (int)args.len / blks_per_cluster; - ninodes = blks_per_cluster * args.mp->m_sb.sb_inopblock; - } - /* - * Figure out what version number to use in the inodes we create. - * If the superblock version has caught up to the one that supports - * the new inode format, then use the new inode version. Otherwise - * use the old version so that old kernels will continue to be - * able to use the file system. - */ - if (xfs_sb_version_hasnlink(&args.mp->m_sb)) - version = XFS_DINODE_VERSION_2; - else - version = XFS_DINODE_VERSION_1; /* + * Stamp and write the inode buffers. + * * Seed the new inode cluster with a random generation number. This * prevents short-term reuse of generation numbers if a chunk is * freed and then immediately reallocated. We use random numbers * rather than a linear progression to prevent the next generation * number from being easily guessable. */ - gen = random32(); - for (j = 0; j < nbufs; j++) { - /* - * Get the block. - */ - d = XFS_AGB_TO_DADDR(args.mp, be32_to_cpu(agi->agi_seqno), - args.agbno + (j * blks_per_cluster)); - fbuf = xfs_trans_get_buf(tp, args.mp->m_ddev_targp, d, - args.mp->m_bsize * blks_per_cluster, - XFS_BUF_LOCK); - ASSERT(fbuf); - ASSERT(!XFS_BUF_GETERROR(fbuf)); - /* - * Set initial values for the inodes in this buffer. - */ - xfs_biozero(fbuf, 0, ninodes << args.mp->m_sb.sb_inodelog); - for (i = 0; i < ninodes; i++) { - free = XFS_MAKE_IPTR(args.mp, fbuf, i); - free->di_core.di_magic = cpu_to_be16(XFS_DINODE_MAGIC); - free->di_core.di_version = version; - free->di_core.di_gen = cpu_to_be32(gen); - free->di_next_unlinked = cpu_to_be32(NULLAGINO); - xfs_ialloc_log_di(tp, fbuf, i, - XFS_DI_CORE_BITS | XFS_DI_NEXT_UNLINKED); - } - xfs_trans_inode_alloc_buf(tp, fbuf); - } + xfs_ialloc_inode_init(args.mp, tp, agno, args.agbno, args.len, + random32()); + + /* + * Convert the results. + */ + newino = XFS_OFFBNO_TO_AGINO(args.mp, args.agbno, 0); be32_add_cpu(&agi->agi_count, newlen); be32_add_cpu(&agi->agi_freecount, newlen); - agno = be32_to_cpu(agi->agi_seqno); - down_read(&args.mp->m_peraglock); - args.mp->m_perag[agno].pagi_freecount += newlen; - up_read(&args.mp->m_peraglock); + pag = xfs_perag_get(args.mp, agno); + pag->pagi_freecount += newlen; + xfs_perag_put(pag); agi->agi_newino = cpu_to_be32(newino); + /* * Insert records describing the new inode chunk into the btree. */ @@ -417,13 +372,17 @@ xfs_ialloc_ag_alloc( for (thisino = newino; thisino < newino + newlen; thisino += XFS_INODES_PER_CHUNK) { - if ((error = xfs_inobt_lookup_eq(cur, thisino, - XFS_INODES_PER_CHUNK, XFS_INOBT_ALL_FREE, &i))) { + cur->bc_rec.i.ir_startino = thisino; + cur->bc_rec.i.ir_freecount = XFS_INODES_PER_CHUNK; + cur->bc_rec.i.ir_free = XFS_INOBT_ALL_FREE; + error = xfs_btree_lookup(cur, XFS_LOOKUP_EQ, &i); + if (error) { xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); return error; } ASSERT(i == 0); - if ((error = xfs_btree_insert(cur, &i))) { + error = xfs_btree_insert(cur, &i); + if (error) { xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); return error; } @@ -444,7 +403,7 @@ xfs_ialloc_ag_alloc( return 0; } -STATIC_INLINE xfs_agnumber_t +STATIC xfs_agnumber_t xfs_ialloc_next_ag( xfs_mount_t *mp) { @@ -505,9 +464,8 @@ xfs_ialloc_ag_select( */ agno = pagno; flags = XFS_ALLOC_FLAG_TRYLOCK; - down_read(&mp->m_peraglock); for (;;) { - pag = &mp->m_perag[agno]; + pag = xfs_perag_get(mp, agno); if (!pag->pagi_init) { if (xfs_ialloc_read_agi(mp, tp, agno, &agbp)) { agbp = NULL; @@ -546,7 +504,7 @@ xfs_ialloc_ag_select( agbp = NULL; goto nextag; } - up_read(&mp->m_peraglock); + xfs_perag_put(pag); return agbp; } } @@ -554,28 +512,81 @@ unlock_nextag: if (agbp) xfs_trans_brelse(tp, agbp); nextag: + xfs_perag_put(pag); /* * No point in iterating over the rest, if we're shutting * down. */ - if (XFS_FORCED_SHUTDOWN(mp)) { - up_read(&mp->m_peraglock); + if (XFS_FORCED_SHUTDOWN(mp)) return NULL; - } agno++; if (agno >= agcount) agno = 0; if (agno == pagno) { - if (flags == 0) { - up_read(&mp->m_peraglock); + if (flags == 0) return NULL; - } flags = 0; } } } /* + * Try to retrieve the next record to the left/right from the current one. + */ +STATIC int +xfs_ialloc_next_rec( + struct xfs_btree_cur *cur, + xfs_inobt_rec_incore_t *rec, + int *done, + int left) +{ + int error; + int i; + + if (left) + error = xfs_btree_decrement(cur, 0, &i); + else + error = xfs_btree_increment(cur, 0, &i); + + if (error) + return error; + *done = !i; + if (i) { + error = xfs_inobt_get_rec(cur, rec, &i); + if (error) + return error; + XFS_WANT_CORRUPTED_RETURN(i == 1); + } + + return 0; +} + +STATIC int +xfs_ialloc_get_rec( + struct xfs_btree_cur *cur, + xfs_agino_t agino, + xfs_inobt_rec_incore_t *rec, + int *done, + int left) +{ + int error; + int i; + + error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_EQ, &i); + if (error) + return error; + *done = !i; + if (i) { + error = xfs_inobt_get_rec(cur, rec, &i); + if (error) + return error; + XFS_WANT_CORRUPTED_RETURN(i == 1); + } + + return 0; +} + +/* * Visible inode allocation functions. */ @@ -629,12 +640,13 @@ xfs_dialloc( int j; /* result code */ xfs_mount_t *mp; /* file system mount structure */ int offset; /* index of inode in chunk */ - xfs_agino_t pagino; /* parent's a.g. relative inode # */ - xfs_agnumber_t pagno; /* parent's allocation group number */ + xfs_agino_t pagino; /* parent's AG relative inode # */ + xfs_agnumber_t pagno; /* parent's AG number */ xfs_inobt_rec_incore_t rec; /* inode allocation record */ xfs_agnumber_t tagno; /* testing allocation group number */ xfs_btree_cur_t *tcur; /* temp cursor */ xfs_inobt_rec_incore_t trec; /* temp inode allocation record */ + struct xfs_perag *pag; if (*IO_agbp == NULL) { @@ -734,13 +746,13 @@ nextag: *inop = NULLFSINO; return noroom ? ENOSPC : 0; } - down_read(&mp->m_peraglock); - if (mp->m_perag[tagno].pagi_inodeok == 0) { - up_read(&mp->m_peraglock); + pag = xfs_perag_get(mp, tagno); + if (pag->pagi_inodeok == 0) { + xfs_perag_put(pag); goto nextag; } error = xfs_ialloc_read_agi(mp, tp, tagno, &agbp); - up_read(&mp->m_peraglock); + xfs_perag_put(pag); if (error) goto nextag; agi = XFS_BUF_TO_AGI(agbp); @@ -753,6 +765,9 @@ nextag: */ agno = tagno; *IO_agbp = NULL; + pag = xfs_perag_get(mp, agno); + + restart_pagno: cur = xfs_inobt_init_cursor(mp, tp, agbp, be32_to_cpu(agi->agi_seqno)); /* * If pagino is 0 (this is the root inode allocation) use newino. @@ -760,298 +775,315 @@ nextag: */ if (!pagino) pagino = be32_to_cpu(agi->agi_newino); -#ifdef DEBUG - if (cur->bc_nlevels == 1) { - int freecount = 0; - if ((error = xfs_inobt_lookup_ge(cur, 0, 0, 0, &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - do { - if ((error = xfs_inobt_get_rec(cur, &rec.ir_startino, - &rec.ir_freecount, &rec.ir_free, &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - freecount += rec.ir_freecount; - if ((error = xfs_btree_increment(cur, 0, &i))) - goto error0; - } while (i == 1); + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error0; - ASSERT(freecount == be32_to_cpu(agi->agi_freecount) || - XFS_FORCED_SHUTDOWN(mp)); - } -#endif /* - * If in the same a.g. as the parent, try to get near the parent. + * If in the same AG as the parent, try to get near the parent. */ if (pagno == agno) { - if ((error = xfs_inobt_lookup_le(cur, pagino, 0, 0, &i))) + int doneleft; /* done, to the left */ + int doneright; /* done, to the right */ + int searchdistance = 10; + + error = xfs_inobt_lookup(cur, pagino, XFS_LOOKUP_LE, &i); + if (error) goto error0; - if (i != 0 && - (error = xfs_inobt_get_rec(cur, &rec.ir_startino, - &rec.ir_freecount, &rec.ir_free, &j)) == 0 && - j == 1 && - rec.ir_freecount > 0) { + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + + error = xfs_inobt_get_rec(cur, &rec, &j); + if (error) + goto error0; + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + + if (rec.ir_freecount > 0) { /* * Found a free inode in the same chunk - * as parent, done. + * as the parent, done. */ + goto alloc_inode; } + + + /* + * In the same AG as parent, but parent's chunk is full. + */ + + /* duplicate the cursor, search left & right simultaneously */ + error = xfs_btree_dup_cursor(cur, &tcur); + if (error) + goto error0; + /* - * In the same a.g. as parent, but parent's chunk is full. + * Skip to last blocks looked up if same parent inode. */ - else { - int doneleft; /* done, to the left */ - int doneright; /* done, to the right */ + if (pagino != NULLAGINO && + pag->pagl_pagino == pagino && + pag->pagl_leftrec != NULLAGINO && + pag->pagl_rightrec != NULLAGINO) { + error = xfs_ialloc_get_rec(tcur, pag->pagl_leftrec, + &trec, &doneleft, 1); + if (error) + goto error1; + error = xfs_ialloc_get_rec(cur, pag->pagl_rightrec, + &rec, &doneright, 0); if (error) - goto error0; - ASSERT(i == 1); - ASSERT(j == 1); - /* - * Duplicate the cursor, search left & right - * simultaneously. - */ - if ((error = xfs_btree_dup_cursor(cur, &tcur))) - goto error0; - /* - * Search left with tcur, back up 1 record. - */ - if ((error = xfs_btree_decrement(tcur, 0, &i))) goto error1; - doneleft = !i; - if (!doneleft) { - if ((error = xfs_inobt_get_rec(tcur, - &trec.ir_startino, - &trec.ir_freecount, - &trec.ir_free, &i))) - goto error1; - XFS_WANT_CORRUPTED_GOTO(i == 1, error1); - } - /* - * Search right with cur, go forward 1 record. - */ - if ((error = xfs_btree_increment(cur, 0, &i))) + } else { + /* search left with tcur, back up 1 record */ + error = xfs_ialloc_next_rec(tcur, &trec, &doneleft, 1); + if (error) goto error1; - doneright = !i; - if (!doneright) { - if ((error = xfs_inobt_get_rec(cur, - &rec.ir_startino, - &rec.ir_freecount, - &rec.ir_free, &i))) - goto error1; - XFS_WANT_CORRUPTED_GOTO(i == 1, error1); - } - /* - * Loop until we find the closest inode chunk - * with a free one. - */ - while (!doneleft || !doneright) { - int useleft; /* using left inode - chunk this time */ + /* search right with cur, go forward 1 record. */ + error = xfs_ialloc_next_rec(cur, &rec, &doneright, 0); + if (error) + goto error1; + } + + /* + * Loop until we find an inode chunk with a free inode. + */ + while (!doneleft || !doneright) { + int useleft; /* using left inode chunk this time */ + + if (!--searchdistance) { /* - * Figure out which block is closer, - * if both are valid. - */ - if (!doneleft && !doneright) - useleft = - pagino - - (trec.ir_startino + - XFS_INODES_PER_CHUNK - 1) < - rec.ir_startino - pagino; - else - useleft = !doneleft; - /* - * If checking the left, does it have - * free inodes? - */ - if (useleft && trec.ir_freecount) { - /* - * Yes, set it up as the chunk to use. - */ - rec = trec; - xfs_btree_del_cursor(cur, - XFS_BTREE_NOERROR); - cur = tcur; - break; - } - /* - * If checking the right, does it have - * free inodes? - */ - if (!useleft && rec.ir_freecount) { - /* - * Yes, it's already set up. - */ - xfs_btree_del_cursor(tcur, - XFS_BTREE_NOERROR); - break; - } - /* - * If used the left, get another one - * further left. - */ - if (useleft) { - if ((error = xfs_btree_decrement(tcur, 0, - &i))) - goto error1; - doneleft = !i; - if (!doneleft) { - if ((error = xfs_inobt_get_rec( - tcur, - &trec.ir_startino, - &trec.ir_freecount, - &trec.ir_free, &i))) - goto error1; - XFS_WANT_CORRUPTED_GOTO(i == 1, - error1); - } - } - /* - * If used the right, get another one - * further right. + * Not in range - save last search + * location and allocate a new inode */ - else { - if ((error = xfs_btree_increment(cur, 0, - &i))) - goto error1; - doneright = !i; - if (!doneright) { - if ((error = xfs_inobt_get_rec( - cur, - &rec.ir_startino, - &rec.ir_freecount, - &rec.ir_free, &i))) - goto error1; - XFS_WANT_CORRUPTED_GOTO(i == 1, - error1); - } - } + xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); + pag->pagl_leftrec = trec.ir_startino; + pag->pagl_rightrec = rec.ir_startino; + pag->pagl_pagino = pagino; + goto newino; } - ASSERT(!doneleft || !doneright); + + /* figure out the closer block if both are valid. */ + if (!doneleft && !doneright) { + useleft = pagino - + (trec.ir_startino + XFS_INODES_PER_CHUNK - 1) < + rec.ir_startino - pagino; + } else { + useleft = !doneleft; + } + + /* free inodes to the left? */ + if (useleft && trec.ir_freecount) { + rec = trec; + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + cur = tcur; + + pag->pagl_leftrec = trec.ir_startino; + pag->pagl_rightrec = rec.ir_startino; + pag->pagl_pagino = pagino; + goto alloc_inode; + } + + /* free inodes to the right? */ + if (!useleft && rec.ir_freecount) { + xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); + + pag->pagl_leftrec = trec.ir_startino; + pag->pagl_rightrec = rec.ir_startino; + pag->pagl_pagino = pagino; + goto alloc_inode; + } + + /* get next record to check */ + if (useleft) { + error = xfs_ialloc_next_rec(tcur, &trec, + &doneleft, 1); + } else { + error = xfs_ialloc_next_rec(cur, &rec, + &doneright, 0); + } + if (error) + goto error1; } + + /* + * We've reached the end of the btree. because + * we are only searching a small chunk of the + * btree each search, there is obviously free + * inodes closer to the parent inode than we + * are now. restart the search again. + */ + pag->pagl_pagino = NULLAGINO; + pag->pagl_leftrec = NULLAGINO; + pag->pagl_rightrec = NULLAGINO; + xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + goto restart_pagno; } + /* - * In a different a.g. from the parent. + * In a different AG from the parent. * See if the most recently allocated block has any free. */ - else if (be32_to_cpu(agi->agi_newino) != NULLAGINO) { - if ((error = xfs_inobt_lookup_eq(cur, - be32_to_cpu(agi->agi_newino), 0, 0, &i))) +newino: + if (be32_to_cpu(agi->agi_newino) != NULLAGINO) { + error = xfs_inobt_lookup(cur, be32_to_cpu(agi->agi_newino), + XFS_LOOKUP_EQ, &i); + if (error) goto error0; - if (i == 1 && - (error = xfs_inobt_get_rec(cur, &rec.ir_startino, - &rec.ir_freecount, &rec.ir_free, &j)) == 0 && - j == 1 && - rec.ir_freecount > 0) { - /* - * The last chunk allocated in the group still has - * a free inode. - */ - } - /* - * None left in the last group, search the whole a.g. - */ - else { + + if (i == 1) { + error = xfs_inobt_get_rec(cur, &rec, &j); if (error) goto error0; - if ((error = xfs_inobt_lookup_ge(cur, 0, 0, 0, &i))) - goto error0; - ASSERT(i == 1); - for (;;) { - if ((error = xfs_inobt_get_rec(cur, - &rec.ir_startino, - &rec.ir_freecount, &rec.ir_free, - &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - if (rec.ir_freecount > 0) - break; - if ((error = xfs_btree_increment(cur, 0, &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + + if (j == 1 && rec.ir_freecount > 0) { + /* + * The last chunk allocated in the group + * still has a free inode. + */ + goto alloc_inode; } } } - offset = XFS_IALLOC_FIND_FREE(&rec.ir_free); + + /* + * None left in the last group, search the whole AG + */ + error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); + if (error) + goto error0; + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + + for (;;) { + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error0; + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + if (rec.ir_freecount > 0) + break; + error = xfs_btree_increment(cur, 0, &i); + if (error) + goto error0; + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + } + +alloc_inode: + offset = xfs_ialloc_find_free(&rec.ir_free); ASSERT(offset >= 0); ASSERT(offset < XFS_INODES_PER_CHUNK); ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % XFS_INODES_PER_CHUNK) == 0); ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino + offset); - XFS_INOBT_CLR_FREE(&rec, offset); + rec.ir_free &= ~XFS_INOBT_MASK(offset); rec.ir_freecount--; - if ((error = xfs_inobt_update(cur, rec.ir_startino, rec.ir_freecount, - rec.ir_free))) + error = xfs_inobt_update(cur, &rec); + if (error) goto error0; be32_add_cpu(&agi->agi_freecount, -1); xfs_ialloc_log_agi(tp, agbp, XFS_AGI_FREECOUNT); - down_read(&mp->m_peraglock); - mp->m_perag[tagno].pagi_freecount--; - up_read(&mp->m_peraglock); -#ifdef DEBUG - if (cur->bc_nlevels == 1) { - int freecount = 0; + pag->pagi_freecount--; + + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error0; - if ((error = xfs_inobt_lookup_ge(cur, 0, 0, 0, &i))) - goto error0; - do { - if ((error = xfs_inobt_get_rec(cur, &rec.ir_startino, - &rec.ir_freecount, &rec.ir_free, &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - freecount += rec.ir_freecount; - if ((error = xfs_btree_increment(cur, 0, &i))) - goto error0; - } while (i == 1); - ASSERT(freecount == be32_to_cpu(agi->agi_freecount) || - XFS_FORCED_SHUTDOWN(mp)); - } -#endif xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, -1); + xfs_perag_put(pag); *inop = ino; return 0; error1: xfs_btree_del_cursor(tcur, XFS_BTREE_ERROR); error0: xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + xfs_perag_put(pag); return error; } +STATIC int +xfs_imap_lookup( + struct xfs_mount *mp, + struct xfs_trans *tp, + xfs_agnumber_t agno, + xfs_agino_t agino, + xfs_agblock_t agbno, + xfs_agblock_t *chunk_agbno, + xfs_agblock_t *offset_agbno, + int flags) +{ + struct xfs_inobt_rec_incore rec; + struct xfs_btree_cur *cur; + struct xfs_buf *agbp; + int error; + int i; + + error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); + if (error) { + xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " + "xfs_ialloc_read_agi() returned " + "error %d, agno %d", + error, agno); + return error; + } + + /* + * Lookup the inode record for the given agino. If the record cannot be + * found, then it's an invalid inode number and we should abort. Once + * we have a record, we need to ensure it contains the inode number + * we are looking up. + */ + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); + error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i); + if (!error) { + if (i) + error = xfs_inobt_get_rec(cur, &rec, &i); + if (!error && i == 0) + error = EINVAL; + } + + xfs_trans_brelse(tp, agbp); + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + if (error) + return error; + + /* check that the returned record contains the required inode */ + if (rec.ir_startino > agino || + rec.ir_startino + XFS_IALLOC_INODES(mp) <= agino) + return EINVAL; + + /* for untrusted inodes check it is allocated first */ + if ((flags & XFS_IGET_UNTRUSTED) && + (rec.ir_free & XFS_INOBT_MASK(agino - rec.ir_startino))) + return EINVAL; + + *chunk_agbno = XFS_AGINO_TO_AGBNO(mp, rec.ir_startino); + *offset_agbno = agbno - *chunk_agbno; + return 0; +} /* - * Return the location of the inode in bno/off, for mapping it into a buffer. + * Return the location of the inode in imap, for mapping it into a buffer. */ -/*ARGSUSED*/ int -xfs_dilocate( - xfs_mount_t *mp, /* file system mount structure */ - xfs_trans_t *tp, /* transaction pointer */ +xfs_imap( + xfs_mount_t *mp, /* file system mount structure */ + xfs_trans_t *tp, /* transaction pointer */ xfs_ino_t ino, /* inode to locate */ - xfs_fsblock_t *bno, /* output: block containing inode */ - int *len, /* output: num blocks in inode cluster */ - int *off, /* output: index in block of inode */ - uint flags) /* flags concerning inode lookup */ + struct xfs_imap *imap, /* location map structure */ + uint flags) /* flags for inode btree lookup */ { xfs_agblock_t agbno; /* block number of inode in the alloc group */ - xfs_buf_t *agbp; /* agi buffer */ xfs_agino_t agino; /* inode number within alloc group */ xfs_agnumber_t agno; /* allocation group number */ int blks_per_cluster; /* num blocks per inode cluster */ xfs_agblock_t chunk_agbno; /* first block in inode chunk */ - xfs_agino_t chunk_agino; /* first agino in inode chunk */ - __int32_t chunk_cnt; /* count of free inodes in chunk */ - xfs_inofree_t chunk_free; /* mask of free inodes in chunk */ xfs_agblock_t cluster_agbno; /* first block in inode cluster */ - xfs_btree_cur_t *cur; /* inode btree cursor */ int error; /* error code */ - int i; /* temp state */ int offset; /* index of inode in its buffer */ - int offset_agbno; /* blks from chunk start to inode */ + xfs_agblock_t offset_agbno; /* blks from chunk start to inode */ ASSERT(ino != NULLFSINO); + /* * Split up the inode number into its parts. */ @@ -1061,25 +1093,28 @@ xfs_dilocate( if (agno >= mp->m_sb.sb_agcount || agbno >= mp->m_sb.sb_agblocks || ino != XFS_AGINO_TO_INO(mp, agno, agino)) { #ifdef DEBUG - /* no diagnostics for bulkstat, ino comes from userspace */ - if (flags & XFS_IMAP_BULKSTAT) + /* + * Don't output diagnostic information for untrusted inodes + * as they can be invalid without implying corruption. + */ + if (flags & XFS_IGET_UNTRUSTED) return XFS_ERROR(EINVAL); if (agno >= mp->m_sb.sb_agcount) { xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_dilocate: agno (%d) >= " + "xfs_imap: agno (%d) >= " "mp->m_sb.sb_agcount (%d)", agno, mp->m_sb.sb_agcount); } if (agbno >= mp->m_sb.sb_agblocks) { xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_dilocate: agbno (0x%llx) >= " + "xfs_imap: agbno (0x%llx) >= " "mp->m_sb.sb_agblocks (0x%lx)", (unsigned long long) agbno, (unsigned long) mp->m_sb.sb_agblocks); } if (ino != XFS_AGINO_TO_INO(mp, agno, agino)) { xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_dilocate: ino (0x%llx) != " + "xfs_imap: ino (0x%llx) != " "XFS_AGINO_TO_INO(mp, agno, agino) " "(0x%llx)", ino, XFS_AGINO_TO_INO(mp, agno, agino)); @@ -1088,84 +1123,81 @@ xfs_dilocate( #endif /* DEBUG */ return XFS_ERROR(EINVAL); } - if ((mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(mp)) || - !(flags & XFS_IMAP_LOOKUP)) { - offset = XFS_INO_TO_OFFSET(mp, ino); - ASSERT(offset < mp->m_sb.sb_inopblock); - *bno = XFS_AGB_TO_FSB(mp, agno, agbno); - *off = offset; - *len = 1; - return 0; - } + blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; - if (*bno != NULLFSBLOCK) { + + /* + * For bulkstat and handle lookups, we have an untrusted inode number + * that we have to verify is valid. We cannot do this just by reading + * the inode buffer as it may have been unlinked and removed leaving + * inodes in stale state on disk. Hence we have to do a btree lookup + * in all cases where an untrusted inode number is passed. + */ + if (flags & XFS_IGET_UNTRUSTED) { + error = xfs_imap_lookup(mp, tp, agno, agino, agbno, + &chunk_agbno, &offset_agbno, flags); + if (error) + return error; + goto out_map; + } + + /* + * If the inode cluster size is the same as the blocksize or + * smaller we get to the buffer by simple arithmetics. + */ + if (XFS_INODE_CLUSTER_SIZE(mp) <= mp->m_sb.sb_blocksize) { offset = XFS_INO_TO_OFFSET(mp, ino); ASSERT(offset < mp->m_sb.sb_inopblock); - cluster_agbno = XFS_FSB_TO_AGBNO(mp, *bno); - *off = ((agbno - cluster_agbno) * mp->m_sb.sb_inopblock) + - offset; - *len = blks_per_cluster; + + imap->im_blkno = XFS_AGB_TO_DADDR(mp, agno, agbno); + imap->im_len = XFS_FSB_TO_BB(mp, 1); + imap->im_boffset = (ushort)(offset << mp->m_sb.sb_inodelog); return 0; } + + /* + * If the inode chunks are aligned then use simple maths to + * find the location. Otherwise we have to do a btree + * lookup to find the location. + */ if (mp->m_inoalign_mask) { offset_agbno = agbno & mp->m_inoalign_mask; chunk_agbno = agbno - offset_agbno; } else { - down_read(&mp->m_peraglock); - error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); - up_read(&mp->m_peraglock); - if (error) { -#ifdef DEBUG - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_dilocate: " - "xfs_ialloc_read_agi() returned " - "error %d, agno %d", - error, agno); -#endif /* DEBUG */ - return error; - } - cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); - if ((error = xfs_inobt_lookup_le(cur, agino, 0, 0, &i))) { -#ifdef DEBUG - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_dilocate: " - "xfs_inobt_lookup_le() failed"); -#endif /* DEBUG */ - goto error0; - } - if ((error = xfs_inobt_get_rec(cur, &chunk_agino, &chunk_cnt, - &chunk_free, &i))) { -#ifdef DEBUG - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_dilocate: " - "xfs_inobt_get_rec() failed"); -#endif /* DEBUG */ - goto error0; - } - if (i == 0) { -#ifdef DEBUG - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_dilocate: " - "xfs_inobt_get_rec() failed"); -#endif /* DEBUG */ - error = XFS_ERROR(EINVAL); - } - xfs_trans_brelse(tp, agbp); - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + error = xfs_imap_lookup(mp, tp, agno, agino, agbno, + &chunk_agbno, &offset_agbno, flags); if (error) return error; - chunk_agbno = XFS_AGINO_TO_AGBNO(mp, chunk_agino); - offset_agbno = agbno - chunk_agbno; } + +out_map: ASSERT(agbno >= chunk_agbno); cluster_agbno = chunk_agbno + ((offset_agbno / blks_per_cluster) * blks_per_cluster); offset = ((agbno - cluster_agbno) * mp->m_sb.sb_inopblock) + XFS_INO_TO_OFFSET(mp, ino); - *bno = XFS_AGB_TO_FSB(mp, agno, cluster_agbno); - *off = offset; - *len = blks_per_cluster; + + imap->im_blkno = XFS_AGB_TO_DADDR(mp, agno, cluster_agbno); + imap->im_len = XFS_FSB_TO_BB(mp, blks_per_cluster); + imap->im_boffset = (ushort)(offset << mp->m_sb.sb_inodelog); + + /* + * If the inode number maps to a block outside the bounds + * of the file system then return NULL rather than calling + * read_buf and panicing when we get an error from the + * driver. + */ + if ((imap->im_blkno + imap->im_len) > + XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)) { + xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " + "(imap->im_blkno (0x%llx) + imap->im_len (0x%llx)) > " + " XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks) (0x%llx)", + (unsigned long long) imap->im_blkno, + (unsigned long long) imap->im_len, + XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)); + return XFS_ERROR(EINVAL); + } return 0; -error0: - xfs_trans_brelse(tp, agbp); - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); - return error; } /* @@ -1233,70 +1265,95 @@ xfs_ialloc_log_agi( xfs_trans_log_buf(tp, bp, first, last); } +#ifdef DEBUG +STATIC void +xfs_check_agi_unlinked( + struct xfs_agi *agi) +{ + int i; + + for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) + ASSERT(agi->agi_unlinked[i]); +} +#else +#define xfs_check_agi_unlinked(agi) +#endif + /* * Read in the allocation group header (inode allocation section) */ int -xfs_ialloc_read_agi( - xfs_mount_t *mp, /* file system mount structure */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_agnumber_t agno, /* allocation group number */ - xfs_buf_t **bpp) /* allocation group hdr buf */ +xfs_read_agi( + struct xfs_mount *mp, /* file system mount structure */ + struct xfs_trans *tp, /* transaction pointer */ + xfs_agnumber_t agno, /* allocation group number */ + struct xfs_buf **bpp) /* allocation group hdr buf */ { - xfs_agi_t *agi; /* allocation group header */ - int agi_ok; /* agi is consistent */ - xfs_buf_t *bp; /* allocation group hdr buf */ - xfs_perag_t *pag; /* per allocation group data */ - int error; + struct xfs_agi *agi; /* allocation group header */ + int agi_ok; /* agi is consistent */ + int error; ASSERT(agno != NULLAGNUMBER); - error = xfs_trans_read_buf( - mp, tp, mp->m_ddev_targp, + + error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), 0, &bp); + XFS_FSS_TO_BB(mp, 1), 0, bpp); if (error) return error; - ASSERT(bp && !XFS_BUF_GETERROR(bp)); + + ASSERT(*bpp && !XFS_BUF_GETERROR(*bpp)); + agi = XFS_BUF_TO_AGI(*bpp); /* * Validate the magic number of the agi block. */ - agi = XFS_BUF_TO_AGI(bp); - agi_ok = - be32_to_cpu(agi->agi_magicnum) == XFS_AGI_MAGIC && - XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)); + agi_ok = be32_to_cpu(agi->agi_magicnum) == XFS_AGI_MAGIC && + XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)) && + be32_to_cpu(agi->agi_seqno) == agno; if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, XFS_RANDOM_IALLOC_READ_AGI))) { - XFS_CORRUPTION_ERROR("xfs_ialloc_read_agi", XFS_ERRLEVEL_LOW, + XFS_CORRUPTION_ERROR("xfs_read_agi", XFS_ERRLEVEL_LOW, mp, agi); - xfs_trans_brelse(tp, bp); + xfs_trans_brelse(tp, *bpp); return XFS_ERROR(EFSCORRUPTED); } - pag = &mp->m_perag[agno]; + + XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_AGI, XFS_AGI_REF); + + xfs_check_agi_unlinked(agi); + return 0; +} + +int +xfs_ialloc_read_agi( + struct xfs_mount *mp, /* file system mount structure */ + struct xfs_trans *tp, /* transaction pointer */ + xfs_agnumber_t agno, /* allocation group number */ + struct xfs_buf **bpp) /* allocation group hdr buf */ +{ + struct xfs_agi *agi; /* allocation group header */ + struct xfs_perag *pag; /* per allocation group data */ + int error; + + error = xfs_read_agi(mp, tp, agno, bpp); + if (error) + return error; + + agi = XFS_BUF_TO_AGI(*bpp); + pag = xfs_perag_get(mp, agno); if (!pag->pagi_init) { pag->pagi_freecount = be32_to_cpu(agi->agi_freecount); pag->pagi_count = be32_to_cpu(agi->agi_count); pag->pagi_init = 1; - } else { - /* - * It's possible for these to be out of sync if - * we are in the middle of a forced shutdown. - */ - ASSERT(pag->pagi_freecount == be32_to_cpu(agi->agi_freecount) || - XFS_FORCED_SHUTDOWN(mp)); - } - -#ifdef DEBUG - { - int i; - - for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) - ASSERT(agi->agi_unlinked[i]); } -#endif - XFS_BUF_SET_VTYPE_REF(bp, B_FS_AGI, XFS_AGI_REF); - *bpp = bp; + /* + * It's possible for these to be out of sync if + * we are in the middle of a forced shutdown. + */ + ASSERT(pag->pagi_freecount == be32_to_cpu(agi->agi_freecount) || + XFS_FORCED_SHUTDOWN(mp)); + xfs_perag_put(pag); return 0; } diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 17afc23..35dd96f 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -140,7 +140,7 @@ xfs_inobt_init_rec_from_cur( } /* - * intial value of ptr for lookup + * initial value of ptr for lookup */ STATIC void xfs_inobt_init_ptr_from_cur( @@ -163,38 +163,6 @@ xfs_inobt_key_diff( cur->bc_rec.i.ir_startino; } -STATIC int -xfs_inobt_kill_root( - struct xfs_btree_cur *cur, - struct xfs_buf *bp, - int level, - union xfs_btree_ptr *newroot) -{ - int error; - - XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); - XFS_BTREE_STATS_INC(cur, killroot); - - /* - * Update the root pointer, decreasing the level by 1 and then - * free the old root. - */ - xfs_inobt_set_root(cur, newroot, -1); - error = xfs_inobt_free_block(cur, bp); - if (error) { - XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); - return error; - } - - XFS_BTREE_STATS_INC(cur, free); - - cur->bc_bufs[level] = NULL; - cur->bc_nlevels--; - - XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); - return 0; -} - #ifdef DEBUG STATIC int xfs_inobt_keys_inorder( @@ -289,7 +257,6 @@ static const struct xfs_btree_ops xfs_inobt_ops = { .dup_cursor = xfs_inobt_dup_cursor, .set_root = xfs_inobt_set_root, - .kill_root = xfs_inobt_kill_root, .alloc_block = xfs_inobt_alloc_block, .free_block = xfs_inobt_free_block, .get_minrecs = xfs_inobt_get_minrecs, diff --git a/libxfs/xfs_inode.c b/libxfs/xfs_inode.c index 1c9ea3b..e4474fd 100644 --- a/libxfs/xfs_inode.c +++ b/libxfs/xfs_inode.c @@ -87,14 +87,14 @@ xfs_inobp_check( * We do basic validation checks on the buffer once it has been * retrieved from disk. */ -STATIC int +int xfs_imap_to_bp( xfs_mount_t *mp, xfs_trans_t *tp, - xfs_imap_t *imap, + struct xfs_imap *imap, xfs_buf_t **bpp, uint buf_flags, - uint imap_flags) + uint iget_flags) { int error; int i; @@ -110,7 +110,7 @@ xfs_imap_to_bp( "an error %d on %s. Returning error.", error, mp->m_fsname); } else { - ASSERT(buf_flags & XFS_BUF_TRYLOCK); + ASSERT(buf_flags & XBF_TRYLOCK); } return error; } @@ -131,12 +131,12 @@ xfs_imap_to_bp( dip = (xfs_dinode_t *)xfs_buf_offset(bp, (i << mp->m_sb.sb_inodelog)); - di_ok = be16_to_cpu(dip->di_core.di_magic) == XFS_DINODE_MAGIC && - XFS_DINODE_GOOD_VERSION(dip->di_core.di_version); + di_ok = be16_to_cpu(dip->di_magic) == XFS_DINODE_MAGIC && + XFS_DINODE_GOOD_VERSION(dip->di_version); if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP, XFS_RANDOM_ITOBP_INOTOBP))) { - if (imap_flags & XFS_IMAP_BULKSTAT) { + if (iget_flags & XFS_IGET_UNTRUSTED) { xfs_trans_brelse(tp, bp); return XFS_ERROR(EINVAL); } @@ -148,7 +148,7 @@ xfs_imap_to_bp( "daddr %lld #%d (magic=%x)", XFS_BUFTARG_NAME(mp->m_ddev_targp), (unsigned long long)imap->im_blkno, i, - be16_to_cpu(dip->di_core.di_magic)); + be16_to_cpu(dip->di_magic)); #endif xfs_trans_brelse(tp, bp); return XFS_ERROR(EFSCORRUPTED); @@ -167,6 +167,49 @@ xfs_imap_to_bp( } /* + * This routine is called to map an inode number within a file + * system to the buffer containing the on-disk version of the + * inode. It returns a pointer to the buffer containing the + * on-disk inode in the bpp parameter, and in the dip parameter + * it returns a pointer to the on-disk inode within that buffer. + * + * If a non-zero error is returned, then the contents of bpp and + * dipp are undefined. + * + * Use xfs_imap() to determine the size and location of the + * buffer to read from disk. + */ +int +xfs_inotobp( + xfs_mount_t *mp, + xfs_trans_t *tp, + xfs_ino_t ino, + xfs_dinode_t **dipp, + xfs_buf_t **bpp, + int *offset, + uint imap_flags) +{ + struct xfs_imap imap; + xfs_buf_t *bp; + int error; + + imap.im_blkno = 0; + error = xfs_imap(mp, tp, ino, &imap, imap_flags); + if (error) + return error; + + error = xfs_imap_to_bp(mp, tp, &imap, &bp, XBF_LOCK, imap_flags); + if (error) + return error; + + *dipp = (xfs_dinode_t *)xfs_buf_offset(bp, imap.im_boffset); + *bpp = bp; + *offset = imap.im_boffset; + return 0; +} + + +/* * This routine is called to map an inode to the buffer containing * the on-disk version of the inode. It returns a pointer to the * buffer containing the on-disk inode in the bpp parameter, and in @@ -176,15 +219,11 @@ xfs_imap_to_bp( * If a non-zero error is returned, then the contents of bpp and * dipp are undefined. * - * If the inode is new and has not yet been initialized, use xfs_imap() - * to determine the size and location of the buffer to read from disk. - * If the inode has already been mapped to its buffer and read in once, - * then use the mapping information stored in the inode rather than - * calling xfs_imap(). This allows us to avoid the overhead of looking - * at the inode btree for small block file systems (see xfs_dilocate()). - * We can tell whether the inode has been mapped in before by comparing - * its disk block address to 0. Only uninitialized inodes will have - * 0 for the disk block address. + * The inode is expected to already been mapped to its buffer and read + * in once, thus we can use the mapping information stored in the inode + * rather than calling xfs_imap(). This allows us to avoid the overhead + * of looking at the inode btree for small block file systems + * (see xfs_imap()). */ int xfs_itobp( @@ -193,51 +232,25 @@ xfs_itobp( xfs_inode_t *ip, xfs_dinode_t **dipp, xfs_buf_t **bpp, - xfs_daddr_t bno, - uint imap_flags, uint buf_flags) { - xfs_imap_t imap; xfs_buf_t *bp; int error; - if (ip->i_blkno == (xfs_daddr_t)0) { - imap.im_blkno = bno; - error = xfs_imap(mp, tp, ip->i_ino, &imap, - XFS_IMAP_LOOKUP | imap_flags); - if (error) - return error; + ASSERT(ip->i_imap.im_blkno != 0); - /* - * Fill in the fields in the inode that will be used to - * map the inode to its buffer from now on. - */ - ip->i_blkno = imap.im_blkno; - ip->i_len = imap.im_len; - ip->i_boffset = imap.im_boffset; - } else { - /* - * We've already mapped the inode once, so just use the - * mapping that we saved the first time. - */ - imap.im_blkno = ip->i_blkno; - imap.im_len = ip->i_len; - imap.im_boffset = ip->i_boffset; - } - ASSERT(bno == 0 || bno == imap.im_blkno); - - error = xfs_imap_to_bp(mp, tp, &imap, &bp, buf_flags, imap_flags); + error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp, buf_flags, 0); if (error) return error; if (!bp) { - ASSERT(buf_flags & XFS_BUF_TRYLOCK); + ASSERT(buf_flags & XBF_TRYLOCK); ASSERT(tp == NULL); *bpp = NULL; return EAGAIN; } - *dipp = (xfs_dinode_t *)xfs_buf_offset(bp, imap.im_boffset); + *dipp = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); *bpp = bp; return 0; } @@ -250,8 +263,6 @@ xfs_itobp( * pointers. For a file in B-tree format, only the root is immediately * brought in-core. The rest will be in-lined in if_extents when it * is first referenced (see xfs_iread_extents()). - * - * Note: this requires user-space public scope for libxfs_iread */ int xfs_iformat( @@ -266,55 +277,65 @@ xfs_iformat( XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); error = 0; - if (unlikely(be32_to_cpu(dip->di_core.di_nextents) + - be16_to_cpu(dip->di_core.di_anextents) > - be64_to_cpu(dip->di_core.di_nblocks))) { + if (unlikely(be32_to_cpu(dip->di_nextents) + + be16_to_cpu(dip->di_anextents) > + be64_to_cpu(dip->di_nblocks))) { xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, "corrupt dinode %Lu, extent total = %d, nblocks = %Lu.", (unsigned long long)ip->i_ino, - (int)(be32_to_cpu(dip->di_core.di_nextents) + - be16_to_cpu(dip->di_core.di_anextents)), + (int)(be32_to_cpu(dip->di_nextents) + + be16_to_cpu(dip->di_anextents)), (unsigned long long) - be64_to_cpu(dip->di_core.di_nblocks)); + be64_to_cpu(dip->di_nblocks)); XFS_CORRUPTION_ERROR("xfs_iformat(1)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); return XFS_ERROR(EFSCORRUPTED); } - if (unlikely(dip->di_core.di_forkoff > ip->i_mount->m_sb.sb_inodesize)) { + if (unlikely(dip->di_forkoff > ip->i_mount->m_sb.sb_inodesize)) { xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, "corrupt dinode %Lu, forkoff = 0x%x.", (unsigned long long)ip->i_ino, - dip->di_core.di_forkoff); + dip->di_forkoff); XFS_CORRUPTION_ERROR("xfs_iformat(2)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); return XFS_ERROR(EFSCORRUPTED); } + if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) && + !ip->i_mount->m_rtdev)) { + xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, + "corrupt dinode %Lu, has realtime flag set.", + ip->i_ino); + XFS_CORRUPTION_ERROR("xfs_iformat(realtime)", + XFS_ERRLEVEL_LOW, ip->i_mount, dip); + return XFS_ERROR(EFSCORRUPTED); + } + switch (ip->i_d.di_mode & S_IFMT) { case S_IFIFO: case S_IFCHR: case S_IFBLK: case S_IFSOCK: - if (unlikely(dip->di_core.di_format != XFS_DINODE_FMT_DEV)) { + if (unlikely(dip->di_format != XFS_DINODE_FMT_DEV)) { XFS_CORRUPTION_ERROR("xfs_iformat(3)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); return XFS_ERROR(EFSCORRUPTED); } ip->i_d.di_size = 0; ip->i_size = 0; - ip->i_df.if_u2.if_rdev = be32_to_cpu(dip->di_u.di_dev); + ip->i_df.if_u2.if_rdev = xfs_dinode_get_rdev(dip); break; case S_IFREG: case S_IFLNK: case S_IFDIR: - switch (dip->di_core.di_format) { + switch (dip->di_format) { case XFS_DINODE_FMT_LOCAL: /* * no local regular files yet */ - if (unlikely((be16_to_cpu(dip->di_core.di_mode) & S_IFMT) == S_IFREG)) { + if (unlikely((be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFREG)) { xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, "corrupt inode %Lu " "(local format for regular file).", @@ -325,7 +346,7 @@ xfs_iformat( return XFS_ERROR(EFSCORRUPTED); } - di_size = be64_to_cpu(dip->di_core.di_size); + di_size = be64_to_cpu(dip->di_size); if (unlikely(di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, "corrupt inode %Lu " @@ -364,13 +385,26 @@ xfs_iformat( if (!XFS_DFORK_Q(dip)) return 0; ASSERT(ip->i_afp == NULL); - ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP); + ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP | KM_NOFS); ip->i_afp->if_ext_max = XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); - switch (dip->di_core.di_aformat) { + switch (dip->di_aformat) { case XFS_DINODE_FMT_LOCAL: atp = (xfs_attr_shortform_t *)XFS_DFORK_APTR(dip); size = be16_to_cpu(atp->hdr.totsize); + + if (unlikely(size < sizeof(struct xfs_attr_sf_hdr))) { + xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, + "corrupt inode %Lu " + "(bad attr fork size %Ld).", + (unsigned long long) ip->i_ino, + (long long) size); + XFS_CORRUPTION_ERROR("xfs_iformat(8)", + XFS_ERRLEVEL_LOW, + ip->i_mount, dip); + return XFS_ERROR(EFSCORRUPTED); + } + error = xfs_iformat_local(ip, dip, XFS_ATTR_FORK, size); break; case XFS_DINODE_FMT_EXTENTS: @@ -434,7 +468,7 @@ xfs_iformat_local( ifp->if_u1.if_data = ifp->if_u2.if_inline_data; else { real_size = roundup(size, 4); - ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP); + ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP | KM_NOFS); } ifp->if_bytes = size; ifp->if_real_bytes = real_size; @@ -561,7 +595,7 @@ xfs_iformat_btree( } ifp->if_broot_bytes = size; - ifp->if_broot = kmem_alloc(size, KM_SLEEP); + ifp->if_broot = kmem_alloc(size, KM_SLEEP | KM_NOFS); ASSERT(ifp->if_broot != NULL); /* * Copy and convert from the on-disk structure @@ -579,7 +613,7 @@ xfs_iformat_btree( void xfs_dinode_from_disk( xfs_icdinode_t *to, - xfs_dinode_core_t *from) + xfs_dinode_t *from) { to->di_magic = be16_to_cpu(from->di_magic); to->di_mode = be16_to_cpu(from->di_mode); @@ -614,7 +648,7 @@ xfs_dinode_from_disk( void xfs_dinode_to_disk( - xfs_dinode_core_t *to, + xfs_dinode_t *to, xfs_icdinode_t *from) { to->di_magic = cpu_to_be16(from->di_magic); @@ -661,7 +695,6 @@ xfs_iread_extents( int error; xfs_ifork_t *ifp; xfs_extnum_t nextents; - size_t size; if (unlikely(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE)) { XFS_ERROR_REPORT("xfs_iread_extents", XFS_ERRLEVEL_LOW, @@ -669,7 +702,6 @@ xfs_iread_extents( return XFS_ERROR(EFSCORRUPTED); } nextents = XFS_IFORK_NEXTENTS(ip, whichfork); - size = nextents * sizeof(xfs_bmbt_rec_t); ifp = XFS_IFORK_PTR(ip, whichfork); /* @@ -737,7 +769,7 @@ xfs_iroot_realloc( */ if (ifp->if_broot_bytes == 0) { new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(rec_diff); - ifp->if_broot = kmem_alloc(new_size, KM_SLEEP); + ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); ifp->if_broot_bytes = (int)new_size; return; } @@ -753,7 +785,7 @@ xfs_iroot_realloc( new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max); ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, (size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */ - KM_SLEEP); + KM_SLEEP | KM_NOFS); op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, ifp->if_broot_bytes); np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, @@ -779,7 +811,7 @@ xfs_iroot_realloc( else new_size = 0; if (new_size > 0) { - new_broot = kmem_alloc(new_size, KM_SLEEP); + new_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); /* * First copy over the btree block header. */ @@ -883,7 +915,8 @@ xfs_idata_realloc( real_size = roundup(new_size, 4); if (ifp->if_u1.if_data == NULL) { ASSERT(ifp->if_real_bytes == 0); - ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP); + ifp->if_u1.if_data = kmem_alloc(real_size, + KM_SLEEP | KM_NOFS); } else if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) { /* * Only do the realloc if the underlying size @@ -894,11 +927,12 @@ xfs_idata_realloc( kmem_realloc(ifp->if_u1.if_data, real_size, ifp->if_real_bytes, - KM_SLEEP); + KM_SLEEP | KM_NOFS); } } else { ASSERT(ifp->if_real_bytes == 0); - ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP); + ifp->if_u1.if_data = kmem_alloc(real_size, + KM_SLEEP | KM_NOFS); memcpy(ifp->if_u1.if_data, ifp->if_u2.if_inline_data, ifp->if_bytes); } @@ -908,64 +942,6 @@ xfs_idata_realloc( ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork)); } - - - -/* - * Map inode to disk block and offset. - * - * mp -- the mount point structure for the current file system - * tp -- the current transaction - * ino -- the inode number of the inode to be located - * imap -- this structure is filled in with the information necessary - * to retrieve the given inode from disk - * flags -- flags to pass to xfs_dilocate indicating whether or not - * lookups in the inode btree were OK or not - */ -int -xfs_imap( - xfs_mount_t *mp, - xfs_trans_t *tp, - xfs_ino_t ino, - xfs_imap_t *imap, - uint flags) -{ - xfs_fsblock_t fsbno; - int len; - int off; - int error; - - fsbno = imap->im_blkno ? - XFS_DADDR_TO_FSB(mp, imap->im_blkno) : NULLFSBLOCK; - error = xfs_dilocate(mp, tp, ino, &fsbno, &len, &off, flags); - if (error) - return error; - - imap->im_blkno = XFS_FSB_TO_DADDR(mp, fsbno); - imap->im_len = XFS_FSB_TO_BB(mp, len); - imap->im_agblkno = XFS_FSB_TO_AGBNO(mp, fsbno); - imap->im_ioffset = (ushort)off; - imap->im_boffset = (ushort)(off << mp->m_sb.sb_inodelog); - - /* - * If the inode number maps to a block outside the bounds - * of the file system then return NULL rather than calling - * read_buf and panicing when we get an error from the - * driver. - */ - if ((imap->im_blkno + imap->im_len) > - XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)) { - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "(imap->im_blkno (0x%llx) + imap->im_len (0x%llx)) > " - " XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks) (0x%llx)", - (unsigned long long) imap->im_blkno, - (unsigned long long) imap->im_len, - XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)); - return EINVAL; - } - return 0; -} - void xfs_idestroy_fork( xfs_inode_t *ip, @@ -1050,7 +1026,7 @@ xfs_iextents_copy( for (i = 0; i < nrecs; i++) { xfs_bmbt_rec_host_t *ep = xfs_iext_get_ext(ifp, i); start_block = xfs_bmbt_get_startblock(ep); - if (ISNULLSTARTBLOCK(start_block)) { + if (isnullstartblock(start_block)) { /* * It's a delayed allocation extent, so skip it. */ @@ -1078,8 +1054,6 @@ xfs_iextents_copy( * changed formats after being modified but before being flushed. * In these cases, the format always takes precedence, because the * format indicates the current state of the fork. - * - * Note: this requires user-space public scope for libxfs_iread */ /*ARGSUSED*/ void @@ -1157,15 +1131,16 @@ xfs_iflush_fork( case XFS_DINODE_FMT_DEV: if (iip->ili_format.ilf_fields & XFS_ILOG_DEV) { ASSERT(whichfork == XFS_DATA_FORK); - dip->di_u.di_dev = cpu_to_be32(ip->i_df.if_u2.if_rdev); + xfs_dinode_put_rdev(dip, ip->i_df.if_u2.if_rdev); } break; case XFS_DINODE_FMT_UUID: if (iip->ili_format.ilf_fields & XFS_ILOG_UUID) { ASSERT(whichfork == XFS_DATA_FORK); - memcpy(&dip->di_u.di_muuid, &ip->i_df.if_u2.if_uuid, - sizeof(uuid_t)); + memcpy(XFS_DFORK_DPTR(dip), + &ip->i_df.if_u2.if_uuid, + sizeof(uuid_t)); } break; @@ -1206,13 +1181,17 @@ xfs_iext_get_ext( */ void xfs_iext_insert( - xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_inode_t *ip, /* incore inode pointer */ xfs_extnum_t idx, /* starting index of new items */ xfs_extnum_t count, /* number of inserted items */ - xfs_bmbt_irec_t *new) /* items to insert */ + xfs_bmbt_irec_t *new, /* items to insert */ + int state) /* type of extent conversion */ { + xfs_ifork_t *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df; xfs_extnum_t i; /* extent record index */ + trace_xfs_iext_insert(ip, idx, new, state, _RET_IP_); + ASSERT(ifp->if_flags & XFS_IFEXTENTS); xfs_iext_add(ifp, idx, count); for (i = idx; i < idx + count; i++, new++) @@ -1455,13 +1434,17 @@ xfs_iext_add_indirect_multi( */ void xfs_iext_remove( - xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_inode_t *ip, /* incore inode pointer */ xfs_extnum_t idx, /* index to begin removing exts */ - int ext_diff) /* number of extents to remove */ + int ext_diff, /* number of extents to remove */ + int state) /* type of extent conversion */ { + xfs_ifork_t *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df; xfs_extnum_t nextents; /* number of extents in file */ int new_size; /* size of extents after removal */ + trace_xfs_iext_remove(ip, idx, state, _RET_IP_); + ASSERT(ext_diff > 0); nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); new_size = (nextents - ext_diff) * sizeof(xfs_bmbt_rec_t); @@ -1583,13 +1566,11 @@ xfs_iext_remove_indirect( xfs_extnum_t ext_diff; /* extents to remove in current list */ xfs_extnum_t nex1; /* number of extents before idx */ xfs_extnum_t nex2; /* extents after idx + count */ - int nlists; /* entries in indirection array */ int page_idx = idx; /* index in target extent list */ ASSERT(ifp->if_flags & XFS_IFEXTIREC); erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 0); ASSERT(erp != NULL); - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; nex1 = page_idx; ext_cnt = count; while (ext_cnt) { @@ -1743,7 +1724,7 @@ xfs_iext_inline_to_direct( /* * Resize an extent indirection array to new_size bytes. */ -void +STATIC void xfs_iext_realloc_indirect( xfs_ifork_t *ifp, /* inode fork pointer */ int new_size) /* new indirection array size */ @@ -1768,7 +1749,7 @@ xfs_iext_realloc_indirect( /* * Switch from indirection array to linear (direct) extent allocations. */ -void +STATIC void xfs_iext_indirect_to_direct( xfs_ifork_t *ifp) /* inode fork pointer */ { diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index 02bff42..32d2255 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -73,70 +73,36 @@ static const struct { { sizeof(xfs_sb_t), 0 } }; -xfs_agnumber_t -xfs_initialize_perag( - xfs_mount_t *mp, - xfs_agnumber_t agcount) +/* + * Reference counting access wrappers to the perag structures. + * Because we never free per-ag structures, the only thing we + * have to protect against changes is the tree structure itself. + */ +struct xfs_perag * +xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) { - xfs_agnumber_t index, max_metadata; - xfs_perag_t *pag; - xfs_agino_t agino; - xfs_ino_t ino; - xfs_sb_t *sbp = &mp->m_sb; - xfs_ino_t max_inum = XFS_MAXINUMBER_32; - - /* Check to see if the filesystem can overflow 32 bit inodes */ - agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks - 1, 0); - ino = XFS_AGINO_TO_INO(mp, agcount - 1, agino); - - /* Clear the mount flag if no inode can overflow 32 bits - * on this filesystem, or if specifically requested.. - */ - if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) && ino > max_inum) { - mp->m_flags |= XFS_MOUNT_32BITINODES; - } else { - mp->m_flags &= ~XFS_MOUNT_32BITINODES; + struct xfs_perag *pag; + int ref = 0; + + rcu_read_lock(); + pag = radix_tree_lookup(&mp->m_perag_tree, agno); + if (pag) { + ASSERT(atomic_read(&pag->pag_ref) >= 0); + ref = atomic_inc_return(&pag->pag_ref); } + trace_xfs_perag_get(mp, agno, ref, _RET_IP_); + rcu_read_unlock(); + return pag; +} - /* If we can overflow then setup the ag headers accordingly */ - if (mp->m_flags & XFS_MOUNT_32BITINODES) { - /* Calculate how much should be reserved for inodes to - * meet the max inode percentage. - */ - if (mp->m_maxicount) { - __uint64_t icount; - - icount = sbp->sb_dblocks * sbp->sb_imax_pct; - do_div(icount, 100); - icount += sbp->sb_agblocks - 1; - do_div(icount, sbp->sb_agblocks); - max_metadata = icount; - } else { - max_metadata = agcount; - } - for (index = 0; index < agcount; index++) { - ino = XFS_AGINO_TO_INO(mp, index, agino); - if (ino > max_inum) { - index++; - break; - } +void +xfs_perag_put(struct xfs_perag *pag) +{ + int ref; - /* This ag is preferred for inodes */ - pag = &mp->m_perag[index]; - pag->pagi_inodeok = 1; - if (index < max_metadata) - pag->pagf_metadata = 1; - xfs_initialize_perag_icache(pag); - } - } else { - /* Setup default behavior for smaller filesystems */ - for (index = 0; index < agcount; index++) { - pag = &mp->m_perag[index]; - pag->pagi_inodeok = 1; - xfs_initialize_perag_icache(pag); - } - } - return index; + ASSERT(atomic_read(&pag->pag_ref) > 0); + ref = atomic_dec_return(&pag->pag_ref); + trace_xfs_perag_put(pag->pag_mount, pag->pag_agno, ref, _RET_IP_); } void @@ -265,33 +231,9 @@ xfs_mount_common(xfs_mount_t *mp, xfs_sb_t *sbp) mp->m_sectbb_log = sbp->sb_sectlog - BBSHIFT; mp->m_agno_log = xfs_highbit32(sbp->sb_agcount - 1) + 1; mp->m_agino_log = sbp->sb_inopblog + sbp->sb_agblklog; - mp->m_litino = sbp->sb_inodesize - - ((uint)sizeof(xfs_dinode_core_t) + (uint)sizeof(xfs_agino_t)); mp->m_blockmask = sbp->sb_blocksize - 1; mp->m_blockwsize = sbp->sb_blocksize >> XFS_WORDLOG; mp->m_blockwmask = mp->m_blockwsize - 1; - INIT_LIST_HEAD(&mp->m_del_inodes); - - /* - * Setup for attributes, in case they get created. - * This value is for inodes getting attributes for the first time, - * the per-inode value is for old attribute values. - */ - ASSERT(sbp->sb_inodesize >= 256 && sbp->sb_inodesize <= 2048); - switch (sbp->sb_inodesize) { - case 256: - mp->m_attroffset = XFS_LITINO(mp) - - XFS_BMDR_SPACE_CALC(MINABTPTRS); - break; - case 512: - case 1024: - case 2048: - mp->m_attroffset = XFS_BMDR_SPACE_CALC(6 * MINABTPTRS); - break; - default: - ASSERT(0); - } - ASSERT(mp->m_attroffset < XFS_LITINO(mp)); mp->m_alloc_mxr[0] = xfs_allocbt_maxrecs(mp, sbp->sb_blocksize, 1); mp->m_alloc_mxr[1] = xfs_allocbt_maxrecs(mp, sbp->sb_blocksize, 0); @@ -340,7 +282,7 @@ xfs_initialize_perag_data(xfs_mount_t *mp, xfs_agnumber_t agcount) for (index = 0; index < agcount; index++) { /* * read the agf, then the agi. This gets us - * all the inforamtion we need and populates the + * all the information we need and populates the * per-ag structures for us. */ error = xfs_alloc_pagf_init(mp, NULL, index, 0); @@ -350,12 +292,13 @@ xfs_initialize_perag_data(xfs_mount_t *mp, xfs_agnumber_t agcount) error = xfs_ialloc_pagi_init(mp, NULL, index); if (error) return error; - pag = &mp->m_perag[index]; + pag = xfs_perag_get(mp, index); ifree += pag->pagi_freecount; ialloc += pag->pagi_count; bfree += pag->pagf_freeblks; bfreelst += pag->pagf_flcount; btree += pag->pagf_btreeblks; + xfs_perag_put(pag); } /* * Overwrite incore superblock counters with just-read data @@ -397,18 +340,16 @@ xfs_mod_sb(xfs_trans_t *tp, __int64_t fields) last = 0; /* translate/copy */ - xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb, fields); /* find modified range */ + f = (xfs_sb_field_t)xfs_highbit64((__uint64_t)fields); + ASSERT((1LL << f) & XFS_SB_MOD_BITS); + last = xfs_sb_info[f + 1].offset - 1; f = (xfs_sb_field_t)xfs_lowbit64((__uint64_t)fields); ASSERT((1LL << f) & XFS_SB_MOD_BITS); first = xfs_sb_info[f].offset; - f = (xfs_sb_field_t)xfs_highbit64((__uint64_t)fields); - ASSERT((1LL << f) & XFS_SB_MOD_BITS); - last = xfs_sb_info[f + 1].offset - 1; - xfs_trans_log_buf(tp, bp, first, last); } diff --git a/libxfs/xfs_trans.c b/libxfs/xfs_trans.c index 9036995..635de8f 100644 --- a/libxfs/xfs_trans.c +++ b/libxfs/xfs_trans.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (C) 2010 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -18,135 +19,491 @@ #include +kmem_zone_t *xfs_trans_zone; +kmem_zone_t *xfs_log_item_desc_zone; + /* - * Reservation functions here avoid a huge stack in xfs_trans_init - * due to register overflow from temporaries in the calculations. + * Various log reservation values. + * + * These are based on the size of the file system block because that is what + * most transactions manipulate. Each adds in an additional 128 bytes per + * item logged to try to account for the overhead of the transaction mechanism. + * + * Note: Most of the reservations underestimate the number of allocation + * groups into which they could free extents in the xfs_bmap_finish() call. + * This is because the number in the worst case is quite high and quite + * unusual. In order to fix this we need to change xfs_bmap_finish() to free + * extents in only a single AG at a time. This will require changes to the + * EFI code as well, however, so that the EFI for the extents not freed is + * logged again in each transaction. See SGI PV #261917. + * + * Reservation functions here avoid a huge stack in xfs_trans_init due to + * register overflow from temporaries in the calculations. */ + +/* + * In a write transaction we can allocate a maximum of 2 + * extents. This gives: + * the inode getting the new extents: inode size + * the inode's bmap btree: max depth * block size + * the agfs of the ags from which the extents are allocated: 2 * sector + * the superblock free block counter: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + * And the bmap_finish transaction can free bmap blocks in a join: + * the agfs of the ags containing the blocks: 2 * sector size + * the agfls of the ags containing the blocks: 2 * sector size + * the super block free block counter: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_write_reservation(xfs_mount_t *mp) +xfs_calc_write_reservation( + struct xfs_mount *mp) { - return XFS_CALC_WRITE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + + 2 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 2) + + 128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + + XFS_ALLOCFREE_LOG_COUNT(mp, 2))), + (2 * mp->m_sb.sb_sectsize + + 2 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 2) + + 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); } +/* + * In truncating a file we free up to two extents at once. We can modify: + * the inode being truncated: inode size + * the inode's bmap btree: (max depth + 1) * block size + * And the bmap_finish transaction can free the blocks and bmap blocks: + * the agf for each of the ags: 4 * sector size + * the agfl for each of the ags: 4 * sector size + * the super block to reflect the freed blocks: sector size + * worst case split in allocation btrees per extent assuming 4 extents: + * 4 exts * 2 trees * (2 * max depth - 1) * block size + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (max depth - 1) * block size + */ STATIC uint -xfs_calc_itruncate_reservation(xfs_mount_t *mp) +xfs_calc_itruncate_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ITRUNCATE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + + 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), + (4 * mp->m_sb.sb_sectsize + + 4 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 4) + + 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + + 128 * 5 + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); } +/* + * In renaming a files we can modify: + * the four inodes involved: 4 * inode size + * the two directory btrees: 2 * (max depth + v2) * dir block size + * the two directory bmap btrees: 2 * max depth * block size + * And the bmap_finish transaction can free dir and bmap blocks (two sets + * of bmap blocks) giving: + * the agf for the ags in which the blocks live: 3 * sector size + * the agfl for the ags in which the blocks live: 3 * sector size + * the superblock for the free block count: sector size + * the allocation btrees: 3 exts * 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_rename_reservation(xfs_mount_t *mp) +xfs_calc_rename_reservation( + struct xfs_mount *mp) { - return XFS_CALC_RENAME_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((4 * mp->m_sb.sb_inodesize + + 2 * XFS_DIROP_LOG_RES(mp) + + 128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp))), + (3 * mp->m_sb.sb_sectsize + + 3 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 3) + + 128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))); } +/* + * For creating a link to an inode: + * the parent directory inode: inode size + * the linked inode: inode size + * the directory btree could split: (max depth + v2) * dir block size + * the directory bmap btree could join or split: (max depth + v2) * blocksize + * And the bmap_finish transaction can free some bmap blocks giving: + * the agf for the ag in which the blocks live: sector size + * the agfl for the ag in which the blocks live: sector size + * the superblock for the free block count: sector size + * the allocation btrees: 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_link_reservation(xfs_mount_t *mp) +xfs_calc_link_reservation( + struct xfs_mount *mp) { - return XFS_CALC_LINK_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + mp->m_sb.sb_inodesize + + XFS_DIROP_LOG_RES(mp) + + 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), + (mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); } +/* + * For removing a directory entry we can modify: + * the parent directory inode: inode size + * the removed inode: inode size + * the directory btree could join: (max depth + v2) * dir block size + * the directory bmap btree could join or split: (max depth + v2) * blocksize + * And the bmap_finish transaction can free the dir and bmap blocks giving: + * the agf for the ag in which the blocks live: 2 * sector size + * the agfl for the ag in which the blocks live: 2 * sector size + * the superblock for the free block count: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_remove_reservation(xfs_mount_t *mp) +xfs_calc_remove_reservation( + struct xfs_mount *mp) { - return XFS_CALC_REMOVE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + mp->m_sb.sb_inodesize + + XFS_DIROP_LOG_RES(mp) + + 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), + (2 * mp->m_sb.sb_sectsize + + 2 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 2) + + 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); } +/* + * For symlink we can modify: + * the parent directory inode: inode size + * the new inode: inode size + * the inode btree entry: 1 block + * the directory btree: (max depth + v2) * dir block size + * the directory inode's bmap btree: (max depth + v2) * block size + * the blocks for the symlink: 1 kB + * Or in the first xact we allocate some inodes giving: + * the agi and agf of the ag getting the new inodes: 2 * sectorsize + * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_symlink_reservation(xfs_mount_t *mp) +xfs_calc_symlink_reservation( + struct xfs_mount *mp) { - return XFS_CALC_SYMLINK_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, 1) + + XFS_DIROP_LOG_RES(mp) + + 1024 + + 128 * (4 + XFS_DIROP_LOG_COUNT(mp))), + (2 * mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + + XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); } +/* + * For create we can modify: + * the parent directory inode: inode size + * the new inode: inode size + * the inode btree entry: block size + * the superblock for the nlink flag: sector size + * the directory btree: (max depth + v2) * dir block size + * the directory inode's bmap btree: (max depth + v2) * block size + * Or in the first xact we allocate some inodes giving: + * the agi and agf of the ag getting the new inodes: 2 * sectorsize + * the superblock for the nlink flag: sector size + * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (max depth - 1) * block size + */ STATIC uint -xfs_calc_create_reservation(xfs_mount_t *mp) +xfs_calc_create_reservation( + struct xfs_mount *mp) { - return XFS_CALC_CREATE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, 1) + + XFS_DIROP_LOG_RES(mp) + + 128 * (3 + XFS_DIROP_LOG_COUNT(mp))), + (3 * mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + + XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); } +/* + * Making a new directory is the same as creating a new file. + */ STATIC uint -xfs_calc_mkdir_reservation(xfs_mount_t *mp) +xfs_calc_mkdir_reservation( + struct xfs_mount *mp) { - return XFS_CALC_MKDIR_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return xfs_calc_create_reservation(mp); } +/* + * In freeing an inode we can modify: + * the inode being freed: inode size + * the super block free inode counter: sector size + * the agi hash list and counters: sector size + * the inode btree entry: block size + * the on disk inode before ours in the agi hash list: inode cluster size + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (max depth - 1) * block size + */ STATIC uint -xfs_calc_ifree_reservation(xfs_mount_t *mp) +xfs_calc_ifree_reservation( + struct xfs_mount *mp) { - return XFS_CALC_IFREE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, 1) + + MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), + XFS_INODE_CLUSTER_SIZE(mp)) + + 128 * 5 + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); } +/* + * When only changing the inode we log the inode and possibly the superblock + * We also add a bit of slop for the transaction stuff. + */ STATIC uint -xfs_calc_ichange_reservation(xfs_mount_t *mp) +xfs_calc_ichange_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ICHANGE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize + + 512; + } +/* + * Growing the data section of the filesystem. + * superblock + * agi and agf + * allocation btrees + */ STATIC uint -xfs_calc_growdata_reservation(xfs_mount_t *mp) +xfs_calc_growdata_reservation( + struct xfs_mount *mp) { - return XFS_CALC_GROWDATA_LOG_RES(mp); + return mp->m_sb.sb_sectsize * 3 + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); } +/* + * Growing the rt section of the filesystem. + * In the first set of transactions (ALLOC) we allocate space to the + * bitmap or summary files. + * superblock: sector size + * agf of the ag from which the extent is allocated: sector size + * bmap btree for bitmap/summary inode: max depth * blocksize + * bitmap/summary inode: inode size + * allocation btrees for 1 block alloc: 2 * (2 * maxdepth - 1) * blocksize + */ STATIC uint -xfs_calc_growrtalloc_reservation(xfs_mount_t *mp) +xfs_calc_growrtalloc_reservation( + struct xfs_mount *mp) { - return XFS_CALC_GROWRTALLOC_LOG_RES(mp); + return 2 * mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + + mp->m_sb.sb_inodesize + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); } +/* + * Growing the rt section of the filesystem. + * In the second set of transactions (ZERO) we zero the new metadata blocks. + * one bitmap/summary block: blocksize + */ STATIC uint -xfs_calc_growrtzero_reservation(xfs_mount_t *mp) +xfs_calc_growrtzero_reservation( + struct xfs_mount *mp) { - return XFS_CALC_GROWRTZERO_LOG_RES(mp); + return mp->m_sb.sb_blocksize + 128; } +/* + * Growing the rt section of the filesystem. + * In the third set of transactions (FREE) we update metadata without + * allocating any new blocks. + * superblock: sector size + * bitmap inode: inode size + * summary inode: inode size + * one bitmap block: blocksize + * summary blocks: new summary size + */ STATIC uint -xfs_calc_growrtfree_reservation(xfs_mount_t *mp) +xfs_calc_growrtfree_reservation( + struct xfs_mount *mp) { - return XFS_CALC_GROWRTFREE_LOG_RES(mp); + return mp->m_sb.sb_sectsize + + 2 * mp->m_sb.sb_inodesize + + mp->m_sb.sb_blocksize + + mp->m_rsumsize + + 128 * 5; } +/* + * Logging the inode modification timestamp on a synchronous write. + * inode + */ STATIC uint -xfs_calc_swrite_reservation(xfs_mount_t *mp) +xfs_calc_swrite_reservation( + struct xfs_mount *mp) { - return XFS_CALC_SWRITE_LOG_RES(mp); + return mp->m_sb.sb_inodesize + 128; } +/* + * Logging the inode mode bits when writing a setuid/setgid file + * inode + */ STATIC uint xfs_calc_writeid_reservation(xfs_mount_t *mp) { - return XFS_CALC_WRITEID_LOG_RES(mp); + return mp->m_sb.sb_inodesize + 128; } +/* + * Converting the inode from non-attributed to attributed. + * the inode being converted: inode size + * agf block and superblock (for block allocation) + * the new block (directory sized) + * bmap blocks for the new directory block + * allocation btrees + */ STATIC uint -xfs_calc_addafork_reservation(xfs_mount_t *mp) +xfs_calc_addafork_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ADDAFORK_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize * 2 + + mp->m_dirblksize + + XFS_FSB_TO_B(mp, XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (4 + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1 + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); } +/* + * Removing the attribute fork of a file + * the inode being truncated: inode size + * the inode's bmap btree: max depth * block size + * And the bmap_finish transaction can free the blocks and bmap blocks: + * the agf for each of the ags: 4 * sector size + * the agfl for each of the ags: 4 * sector size + * the super block to reflect the freed blocks: sector size + * worst case split in allocation btrees per extent assuming 4 extents: + * 4 exts * 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_attrinval_reservation(xfs_mount_t *mp) +xfs_calc_attrinval_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ATTRINVAL_LOG_RES(mp); + return MAX((mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + + 128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))), + (4 * mp->m_sb.sb_sectsize + + 4 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 4) + + 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))); } +/* + * Setting an attribute. + * the inode getting the attribute + * the superblock for allocations + * the agfs extents are allocated from + * the attribute btree * max depth + * the inode allocation btree + * Since attribute transaction space is dependent on the size of the attribute, + * the calculation is done partially at mount time and partially at runtime. + */ STATIC uint -xfs_calc_attrset_reservation(xfs_mount_t *mp) +xfs_calc_attrset_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ATTRSET_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + + 128 * (2 + XFS_DA_NODE_MAXDEPTH); } +/* + * Removing an attribute. + * the inode: inode size + * the attribute btree could join: max depth * block size + * the inode bmap btree could join or split: max depth * block size + * And the bmap_finish transaction can free the attr blocks freed giving: + * the agf for the ag in which the blocks live: 2 * sector size + * the agfl for the ag in which the blocks live: 2 * sector size + * the superblock for the free block count: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_attrrm_reservation(xfs_mount_t *mp) +xfs_calc_attrrm_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ATTRRM_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + + 128 * (1 + XFS_DA_NODE_MAXDEPTH + + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), + (2 * mp->m_sb.sb_sectsize + + 2 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 2) + + 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); } +/* + * Clearing a bad agino number in an agi hash bucket. + */ STATIC uint -xfs_calc_clear_agi_bucket_reservation(xfs_mount_t *mp) +xfs_calc_clear_agi_bucket_reservation( + struct xfs_mount *mp) { - return XFS_CALC_CLEAR_AGI_BUCKET_LOG_RES(mp); + return mp->m_sb.sb_sectsize + 128; } /* @@ -155,11 +512,10 @@ xfs_calc_clear_agi_bucket_reservation(xfs_mount_t *mp) */ void xfs_trans_init( - xfs_mount_t *mp) + struct xfs_mount *mp) { - xfs_trans_reservations_t *resp; + struct xfs_trans_reservations *resp = &mp->m_reservations; - resp = &(mp->m_reservations); resp->tr_write = xfs_calc_write_reservation(mp); resp->tr_itruncate = xfs_calc_itruncate_reservation(mp); resp->tr_rename = xfs_calc_rename_reservation(mp); @@ -184,6 +540,50 @@ xfs_trans_init( } /* + * Add the given log item to the transaction's list of log items. + * + * The log item will now point to its new descriptor with its li_desc field. + */ +void +xfs_trans_add_item( + struct xfs_trans *tp, + struct xfs_log_item *lip) +{ + struct xfs_log_item_desc *lidp; + + ASSERT(lip->li_mountp = tp->t_mountp); + ASSERT(lip->li_ailp = tp->t_mountp->m_ail); + + lidp = kmem_zone_zalloc(xfs_log_item_desc_zone, KM_SLEEP | KM_NOFS); + + lidp->lid_item = lip; + lidp->lid_flags = 0; + lidp->lid_size = 0; + list_add_tail(&lidp->lid_trans, &tp->t_items); + + lip->li_desc = lidp; +} + +STATIC void +xfs_trans_free_item_desc( + struct xfs_log_item_desc *lidp) +{ + list_del_init(&lidp->lid_trans); + kmem_zone_free(xfs_log_item_desc_zone, lidp); +} + +/* + * Unlink and free the given descriptor. + */ +void +xfs_trans_del_item( + struct xfs_log_item *lip) +{ + xfs_trans_free_item_desc(lip->li_desc); + lip->li_desc = NULL; +} + +/* * Roll from one trans in the sequence of PERMANENT transactions to * the next: permanent transactions are only flushed out when * committed with XFS_TRANS_RELEASE_LOG_RES, but we still want as soon diff --git a/libxlog/xfs_log_recover.c b/libxlog/xfs_log_recover.c index 9e0e567..23fe6fd 100644 --- a/libxlog/xfs_log_recover.c +++ b/libxlog/xfs_log_recover.c @@ -22,31 +22,60 @@ #define xlog_clear_stale_blocks(log, tail_lsn) (0) #define xfs_readonly_buftarg(buftarg) (0) -STATIC void xlog_recover_insert_item_backq(xlog_recover_item_t **q, - xlog_recover_item_t *item); /* - * Sector aligned buffer routines for buffer create/read/write/access + * Verify the given count of basic blocks is valid number of blocks + * to specify for an operation involving the given XFS log buffer. + * Returns nonzero if the count is valid, 0 otherwise. */ -#define XLOG_SECTOR_ROUNDUP_BBCOUNT(log, bbs) \ - ( ((log)->l_sectbb_mask && (bbs & (log)->l_sectbb_mask)) ? \ - ((bbs + (log)->l_sectbb_mask + 1) & ~(log)->l_sectbb_mask) : (bbs) ) -#define XLOG_SECTOR_ROUNDDOWN_BLKNO(log, bno) ((bno) & ~(log)->l_sectbb_mask) +static inline int +xlog_buf_bbcount_valid( + xlog_t *log, + int bbcount) +{ + return bbcount > 0 && bbcount <= log->l_logBBsize; +} +/* + * Allocate a buffer to hold log data. The buffer needs to be able + * to map to a range of nbblks basic blocks at any valid (basic + * block) offset within the log. + */ xfs_buf_t * xlog_get_bp( xlog_t *log, - int num_bblks) + int nbblks) { - ASSERT(num_bblks > 0); - - if (log->l_sectbb_log) { - if (num_bblks > 1) - num_bblks += XLOG_SECTOR_ROUNDUP_BBCOUNT(log, 1); - num_bblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, num_bblks); + if (!xlog_buf_bbcount_valid(log, nbblks)) { + xlog_warn("XFS: Invalid block length (0x%x) given for buffer", + nbblks); + XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_HIGH, log->l_mp); + return NULL; } - return libxfs_getbufr(log->l_dev, (xfs_daddr_t)-1, num_bblks); + + /* + * We do log I/O in units of log sectors (a power-of-2 + * multiple of the basic block size), so we round up the + * requested size to acommodate the basic blocks required + * for complete log sectors. + * + * In addition, the buffer may be used for a non-sector- + * aligned block offset, in which case an I/O of the + * requested size could extend beyond the end of the + * buffer. If the requested size is only 1 basic block it + * will never straddle a sector boundary, so this won't be + * an issue. Nor will this be a problem if the log I/O is + * done in basic blocks (sector size 1). But otherwise we + * extend the buffer by one extra log sector to ensure + * there's space to accomodate this possiblility. + */ + if (nbblks > 1 && log->l_sectBBsize > 1) + nbblks += log->l_sectBBsize; + if (log->l_sectBBsize) + nbblks = round_up(nbblks, log->l_sectBBsize); + + return libxfs_getbufr(log->l_dev, (xfs_daddr_t)-1, nbblks); } void @@ -56,25 +85,50 @@ xlog_put_bp( libxfs_putbufr(bp); } +/* + * Return the address of the start of the given block number's data + * in a log buffer. The buffer covers a log sector-aligned region. + */ +STATIC xfs_caddr_t +xlog_align( + xlog_t *log, + xfs_daddr_t blk_no, + int nbblks, + xfs_buf_t *bp) +{ + xfs_daddr_t offset = 0; + + if (log->l_sectBBsize) + offset = blk_no & ((xfs_daddr_t)log->l_sectBBsize - 1); + + ASSERT(BBTOB(offset + nbblks) <= XFS_BUF_SIZE(bp)); + return XFS_BUF_PTR(bp) + BBTOB(offset); +} /* * nbblks should be uint, but oh well. Just want to catch that 32-bit length. */ int -xlog_bread( +xlog_bread_noalign( xlog_t *log, xfs_daddr_t blk_no, int nbblks, xfs_buf_t *bp) { - if (log->l_sectbb_log) { - blk_no = XLOG_SECTOR_ROUNDDOWN_BLKNO(log, blk_no); - nbblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, nbblks); + if (!xlog_buf_bbcount_valid(log, nbblks)) { + xlog_warn("XFS: Invalid block length (0x%x) given for buffer", + nbblks); + XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_HIGH, log->l_mp); + return EFSCORRUPTED; + } + + if (log->l_sectBBsize > 1) { + blk_no = round_down(blk_no, log->l_sectBBsize); + nbblks = round_up(nbblks, log->l_sectBBsize); } ASSERT(nbblks > 0); ASSERT(BBTOB(nbblks) <= XFS_BUF_SIZE(bp)); - ASSERT(bp); XFS_BUF_SET_ADDR(bp, log->l_logBBstart + blk_no); XFS_BUF_SET_COUNT(bp, BBTOB(nbblks)); @@ -82,26 +136,24 @@ xlog_bread( return libxfs_readbufr(log->l_dev, XFS_BUF_ADDR(bp), bp, nbblks, 0); } - -static xfs_caddr_t -xlog_align( +int +xlog_bread( xlog_t *log, xfs_daddr_t blk_no, int nbblks, - xfs_buf_t *bp) + xfs_buf_t *bp, + xfs_caddr_t *offset) { - xfs_caddr_t ptr; + int error; - if (!log->l_sectbb_log) - return XFS_BUF_PTR(bp); + error = xlog_bread_noalign(log, blk_no, nbblks, bp); + if (error) + return error; - ptr = XFS_BUF_PTR(bp) + BBTOB((int)blk_no & log->l_sectbb_mask); - ASSERT(XFS_BUF_SIZE(bp) >= - BBTOB(nbblks + (blk_no & log->l_sectbb_mask))); - return ptr; + *offset = xlog_align(log, blk_no, nbblks, bp); + return 0; } - /* * This routine finds (to an approximation) the first block in the physical * log which contains the given cycle. It uses a binary search algorithm. @@ -118,39 +170,38 @@ xlog_find_cycle_start( { xfs_caddr_t offset; xfs_daddr_t mid_blk; + xfs_daddr_t end_blk; uint mid_cycle; int error; - mid_blk = BLK_AVG(first_blk, *last_blk); - while (mid_blk != first_blk && mid_blk != *last_blk) { - if ((error = xlog_bread(log, mid_blk, 1, bp))) + end_blk = *last_blk; + mid_blk = BLK_AVG(first_blk, end_blk); + while (mid_blk != first_blk && mid_blk != end_blk) { + error = xlog_bread(log, mid_blk, 1, bp, &offset); + if (error) return error; - offset = xlog_align(log, mid_blk, 1, bp); mid_cycle = xlog_get_cycle(offset); - if (mid_cycle == cycle) { - *last_blk = mid_blk; - /* last_half_cycle == mid_cycle */ - } else { - first_blk = mid_blk; - /* first_half_cycle == mid_cycle */ - } - mid_blk = BLK_AVG(first_blk, *last_blk); + if (mid_cycle == cycle) + end_blk = mid_blk; /* last_half_cycle == mid_cycle */ + else + first_blk = mid_blk; /* first_half_cycle == mid_cycle */ + mid_blk = BLK_AVG(first_blk, end_blk); } - ASSERT((mid_blk == first_blk && mid_blk+1 == *last_blk) || - (mid_blk == *last_blk && mid_blk-1 == first_blk)); + ASSERT((mid_blk == first_blk && mid_blk+1 == end_blk) || + (mid_blk == end_blk && mid_blk-1 == first_blk)); + + *last_blk = end_blk; return 0; } /* - * Check that the range of blocks does not contain the cycle number - * given. The scan needs to occur from front to back and the ptr into the - * region must be updated since a later routine will need to perform another - * test. If the region is completely good, we end up returning the same - * last block number. - * - * Set blkno to -1 if we encounter no errors. This is an invalid block number - * since we don't ever expect logs to get this large. + * Check that a range of blocks does not contain stop_on_cycle_no. + * Fill in *new_blk with the block offset where such a block is + * found, or with -1 (an invalid block number) if there is no such + * block in the range. The scan needs to occur from front to back + * and the pointer into the region must be updated since a later + * routine will need to perform another test. */ STATIC int xlog_find_verify_cycle( @@ -167,12 +218,16 @@ xlog_find_verify_cycle( xfs_caddr_t buf = NULL; int error = 0; + /* + * Greedily allocate a buffer big enough to handle the full + * range of basic blocks we'll be examining. If that fails, + * try a smaller size. We need to be able to read at least + * a log sector, or we're out of luck. + */ bufblks = 1 << ffs(nbblks); - while (!(bp = xlog_get_bp(log, bufblks))) { - /* can't get enough memory to do everything in one big buffer */ bufblks >>= 1; - if (bufblks <= log->l_sectbb_log) + if (bufblks < MAX(log->l_sectBBsize, 1)) return ENOMEM; } @@ -181,10 +236,10 @@ xlog_find_verify_cycle( bcount = min(bufblks, (start_blk + nbblks - i)); - if ((error = xlog_bread(log, i, bcount, bp))) + error = xlog_bread(log, i, bcount, bp, &buf); + if (error) goto out; - buf = xlog_align(log, i, bcount, bp); for (j = 0; j < bcount; j++) { cycle = xlog_get_cycle(buf); if (cycle == stop_on_cycle_no) { @@ -238,9 +293,9 @@ xlog_find_verify_log_record( return ENOMEM; smallmem = 1; } else { - if ((error = xlog_bread(log, start_blk, num_blks, bp))) + error = xlog_bread(log, start_blk, num_blks, bp, &offset); + if (error) goto out; - offset = xlog_align(log, start_blk, num_blks, bp); offset += ((num_blks - 1) << BBSHIFT); } @@ -255,9 +310,9 @@ xlog_find_verify_log_record( } if (smallmem) { - if ((error = xlog_bread(log, i, 1, bp))) + error = xlog_bread(log, i, 1, bp, &offset); + if (error) goto out; - offset = xlog_align(log, i, 1, bp); } head = (xlog_rec_header_t *)offset; @@ -325,7 +380,7 @@ out: * * Return: zero if normal, non-zero if error. */ -int +STATIC int xlog_find_head( xlog_t *log, xfs_daddr_t *return_head_blk) @@ -337,14 +392,13 @@ xlog_find_head( uint first_half_cycle, last_half_cycle; uint stop_on_cycle; int error, log_bbnum = log->l_logBBsize; - extern int platform_has_uuid; /* Is the end of the log device zeroed? */ if ((error = xlog_find_zeroed(log, &first_blk)) == -1) { *return_head_blk = first_blk; /* Is the whole lot zeroed? */ - if (!first_blk && platform_has_uuid) { + if (!first_blk) { /* Linux XFS shouldn't generate totally zeroed logs - * mkfs etc write a dummy unmount record to a fresh * log so we can store the uuid in there @@ -362,15 +416,18 @@ xlog_find_head( bp = xlog_get_bp(log, 1); if (!bp) return ENOMEM; - if ((error = xlog_bread(log, 0, 1, bp))) + + error = xlog_bread(log, 0, 1, bp, &offset); + if (error) goto bp_err; - offset = xlog_align(log, 0, 1, bp); + first_half_cycle = xlog_get_cycle(offset); last_blk = head_blk = log_bbnum - 1; /* get cycle # of last block */ - if ((error = xlog_bread(log, last_blk, 1, bp))) + error = xlog_bread(log, last_blk, 1, bp, &offset); + if (error) goto bp_err; - offset = xlog_align(log, last_blk, 1, bp); + last_half_cycle = xlog_get_cycle(offset); ASSERT(last_half_cycle != 0); @@ -418,7 +475,7 @@ xlog_find_head( * In this case we want to find the first block with cycle * number matching last_half_cycle. We expect the log to be * some variation on - * x + 1 ... | x ... + * x + 1 ... | x ... | x * The first block with cycle number x (last_half_cycle) will * be where the new head belongs. First we do a binary search * for the first occurrence of last_half_cycle. The binary @@ -428,11 +485,13 @@ xlog_find_head( * the log, then we look for occurrences of last_half_cycle - 1 * at the end of the log. The cases we're looking for look * like - * x + 1 ... | x | x + 1 | x ... - * ^ binary search stopped here + * v binary search stopped here + * x + 1 ... | x | x + 1 | x ... | x + * ^ but we want to locate this spot * or - * x + 1 ... | x ... | x - 1 | x * <---------> less than scan distance + * x + 1 ... | x ... | x - 1 | x + * ^ we want to locate this spot */ stop_on_cycle = last_half_cycle; if ((error = xlog_find_cycle_start(log, bp, first_blk, @@ -488,16 +547,16 @@ xlog_find_head( * certainly not the head of the log. By searching for * last_half_cycle-1 we accomplish that. */ - start_blk = log_bbnum - num_scan_bblks + head_blk; ASSERT(head_blk <= INT_MAX && - (xfs_daddr_t) num_scan_bblks - head_blk >= 0); + (xfs_daddr_t) num_scan_bblks >= head_blk); + start_blk = log_bbnum - (num_scan_bblks - head_blk); if ((error = xlog_find_verify_cycle(log, start_blk, num_scan_bblks - (int)head_blk, (stop_on_cycle - 1), &new_blk))) goto bp_err; if (new_blk != -1) { head_blk = new_blk; - goto bad_blk; + goto validate_head; } /* @@ -515,7 +574,7 @@ xlog_find_head( head_blk = new_blk; } - bad_blk: +validate_head: /* * Now we need to make sure head_blk is not pointing to a block in * the middle of a log record. @@ -537,7 +596,7 @@ xlog_find_head( if ((error = xlog_find_verify_log_record(log, start_blk, &head_blk, 0)) == -1) { /* We hit the beginning of the log during our search */ - start_blk = log_bbnum - num_scan_bblks + head_blk; + start_blk = log_bbnum - (num_scan_bblks - head_blk); new_blk = log_bbnum; ASSERT(start_blk <= INT_MAX && (xfs_daddr_t) log_bbnum-start_blk >= 0); @@ -620,13 +679,14 @@ xlog_find_tail( if (!bp) return ENOMEM; if (*head_blk == 0) { /* special case */ - if ((error = xlog_bread(log, 0, 1, bp))) - goto bread_err; - offset = xlog_align(log, 0, 1, bp); + error = xlog_bread(log, 0, 1, bp, &offset); + if (error) + goto done; + if (xlog_get_cycle(offset) == 0) { *tail_blk = 0; /* leave all other log inited values alone */ - goto exit; + goto done; } } @@ -635,9 +695,10 @@ xlog_find_tail( */ ASSERT(*head_blk < INT_MAX); for (i = (int)(*head_blk) - 1; i >= 0; i--) { - if ((error = xlog_bread(log, i, 1, bp))) - goto bread_err; - offset = xlog_align(log, i, 1, bp); + error = xlog_bread(log, i, 1, bp, &offset); + if (error) + goto done; + if (XLOG_HEADER_MAGIC_NUM == be32_to_cpu(*(__be32 *)offset)) { found = 1; break; @@ -651,9 +712,10 @@ xlog_find_tail( */ if (!found) { for (i = log->l_logBBsize - 1; i >= (int)(*head_blk); i--) { - if ((error = xlog_bread(log, i, 1, bp))) - goto bread_err; - offset = xlog_align(log, i, 1, bp); + error = xlog_bread(log, i, 1, bp, &offset); + if (error) + goto done; + if (XLOG_HEADER_MAGIC_NUM == be32_to_cpu(*(__be32 *)offset)) { found = 2; @@ -686,12 +748,12 @@ 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); - 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); + 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)); + 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 @@ -721,14 +783,14 @@ 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; - if ((error = xlog_bread(log, umount_data_blk, 1, bp))) { - goto bread_err; - } - offset = xlog_align(log, umount_data_blk, 1, bp); + error = xlog_bread(log, umount_data_blk, 1, bp, &offset); + if (error) + goto done; + op_head = (xlog_op_header_t *)offset; if (op_head->oh_flags & XLOG_UNMOUNT_TRANS) { /* @@ -736,12 +798,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); - 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; /* @@ -773,12 +833,10 @@ xlog_find_tail( * But... if the -device- itself is readonly, just skip this. * We can't recover this device anyway, so it won't matter. */ - if (!xfs_readonly_buftarg(log->l_mp->m_logdev_targp)) { + if (!xfs_readonly_buftarg(log->l_mp->m_logdev_targp)) error = xlog_clear_stale_blocks(log, tail_lsn); - } -bread_err: -exit: +done: xlog_put_bp(bp); if (error) @@ -820,9 +878,10 @@ xlog_find_zeroed( bp = xlog_get_bp(log, 1); if (!bp) return ENOMEM; - if ((error = xlog_bread(log, 0, 1, bp))) + error = xlog_bread(log, 0, 1, bp, &offset); + if (error) goto bp_err; - offset = xlog_align(log, 0, 1, bp); + first_cycle = xlog_get_cycle(offset); if (first_cycle == 0) { /* completely zeroed log */ *blk_no = 0; @@ -831,9 +890,10 @@ xlog_find_zeroed( } /* check partially zeroed log */ - if ((error = xlog_bread(log, log_bbnum-1, 1, bp))) + error = xlog_bread(log, log_bbnum-1, 1, bp, &offset); + if (error) goto bp_err; - offset = xlog_align(log, log_bbnum-1, 1, bp); + last_cycle = xlog_get_cycle(offset); if (last_cycle != 0) { /* log completely written to */ xlog_put_bp(bp); @@ -899,40 +959,50 @@ bp_err: STATIC xlog_recover_t * xlog_recover_find_tid( - xlog_recover_t *q, + struct hlist_head *head, xlog_tid_t tid) { - xlog_recover_t *p = q; + xlog_recover_t *trans; + struct hlist_node *n; - while (p != NULL) { - if (p->r_log_tid == tid) - break; - p = p->r_next; + hlist_for_each_entry(trans, n, head, r_list) { + if (trans->r_log_tid == tid) + return trans; } - return p; + return NULL; } STATIC void -xlog_recover_put_hashq( - xlog_recover_t **q, - xlog_recover_t *trans) +xlog_recover_new_tid( + struct hlist_head *head, + xlog_tid_t tid, + xfs_lsn_t lsn) { - trans->r_next = *q; - *q = trans; + xlog_recover_t *trans; + + trans = kmem_zalloc(sizeof(xlog_recover_t), KM_SLEEP); + trans->r_log_tid = tid; + trans->r_lsn = lsn; + INIT_LIST_HEAD(&trans->r_itemq); + + INIT_HLIST_NODE(&trans->r_list); + hlist_add_head(&trans->r_list, head); } STATIC void xlog_recover_add_item( - xlog_recover_item_t **itemq) + struct list_head *head) { xlog_recover_item_t *item; item = kmem_zalloc(sizeof(xlog_recover_item_t), KM_SLEEP); - xlog_recover_insert_item_backq(itemq, item); + INIT_LIST_HEAD(&item->ri_list); + list_add_tail(&item->ri_list, head); } STATIC int xlog_recover_add_to_cont_trans( + struct log *log, xlog_recover_t *trans, xfs_caddr_t dp, int len) @@ -941,8 +1011,7 @@ xlog_recover_add_to_cont_trans( xfs_caddr_t ptr, old_ptr; int old_len; - item = trans->r_itemq; - if (item == NULL) { + if (list_empty(&trans->r_itemq)) { /* finish copying rest of trans header */ xlog_recover_add_item(&trans->r_itemq); ptr = (xfs_caddr_t) &trans->r_theader + @@ -950,7 +1019,8 @@ xlog_recover_add_to_cont_trans( memcpy(ptr, dp, len); /* d, s, l */ return 0; } - item = item->ri_prev; + /* take the tail entry */ + item = list_entry(trans->r_itemq.prev, xlog_recover_item_t, ri_list); old_ptr = item->ri_buf[item->ri_cnt-1].i_addr; old_len = item->ri_buf[item->ri_cnt-1].i_len; @@ -959,6 +1029,7 @@ xlog_recover_add_to_cont_trans( memcpy(&ptr[old_len], dp, len); /* d, s, l */ item->ri_buf[item->ri_cnt-1].i_len += len; item->ri_buf[item->ri_cnt-1].i_addr = ptr; + trace_xfs_log_recover_item_add_cont(log, trans, item, 0); return 0; } @@ -977,6 +1048,7 @@ xlog_recover_add_to_cont_trans( */ STATIC int xlog_recover_add_to_trans( + struct log *log, xlog_recover_t *trans, xfs_caddr_t dp, int len) @@ -987,9 +1059,14 @@ xlog_recover_add_to_trans( if (!len) return 0; - item = trans->r_itemq; - if (item == NULL) { - ASSERT(*(uint *)dp == XFS_TRANS_HEADER_MAGIC); + if (list_empty(&trans->r_itemq)) { + /* we need to catch log corruptions here */ + if (*(uint *)dp != XFS_TRANS_HEADER_MAGIC) { + xlog_warn("XFS: xlog_recover_add_to_trans: " + "bad header magic number"); + ASSERT(0); + return XFS_ERROR(EIO); + } if (len == sizeof(xfs_trans_header_t)) xlog_recover_add_item(&trans->r_itemq); memcpy(&trans->r_theader, dp, len); /* d, s, l */ @@ -1000,88 +1077,40 @@ xlog_recover_add_to_trans( memcpy(ptr, dp, len); in_f = (xfs_inode_log_format_t *)ptr; - if (item->ri_prev->ri_total != 0 && - item->ri_prev->ri_total == item->ri_prev->ri_cnt) { + /* take the tail entry */ + item = list_entry(trans->r_itemq.prev, xlog_recover_item_t, ri_list); + if (item->ri_total != 0 && + item->ri_total == item->ri_cnt) { + /* tail item is in use, get a new one */ xlog_recover_add_item(&trans->r_itemq); + item = list_entry(trans->r_itemq.prev, + xlog_recover_item_t, ri_list); } - item = trans->r_itemq; - item = item->ri_prev; if (item->ri_total == 0) { /* first region to be added */ - item->ri_total = in_f->ilf_size; - ASSERT(item->ri_total <= XLOG_MAX_REGIONS_IN_ITEM); - item->ri_buf = kmem_zalloc((item->ri_total * - sizeof(xfs_log_iovec_t)), KM_SLEEP); + if (in_f->ilf_size == 0 || + in_f->ilf_size > XLOG_MAX_REGIONS_IN_ITEM) { + xlog_warn( + "XFS: bad number of regions (%d) in inode log format", + in_f->ilf_size); + ASSERT(0); + return XFS_ERROR(EIO); + } + + item->ri_total = in_f->ilf_size; + item->ri_buf = + kmem_zalloc(item->ri_total * sizeof(xfs_log_iovec_t), + KM_SLEEP); } ASSERT(item->ri_total > item->ri_cnt); /* Description region is ri_buf[0] */ item->ri_buf[item->ri_cnt].i_addr = ptr; item->ri_buf[item->ri_cnt].i_len = len; item->ri_cnt++; + trace_xfs_log_recover_item_add(log, trans, item, 0); return 0; } -STATIC void -xlog_recover_new_tid( - xlog_recover_t **q, - xlog_tid_t tid, - xfs_lsn_t lsn) -{ - xlog_recover_t *trans; - - trans = kmem_zalloc(sizeof(xlog_recover_t), KM_SLEEP); - trans->r_log_tid = tid; - trans->r_lsn = lsn; - xlog_recover_put_hashq(q, trans); -} - -STATIC int -xlog_recover_unlink_tid( - xlog_recover_t **q, - xlog_recover_t *trans) -{ - xlog_recover_t *tp; - int found = 0; - - ASSERT(trans != NULL); - if (trans == *q) { - *q = (*q)->r_next; - } else { - tp = *q; - while (tp) { - if (tp->r_next == trans) { - found = 1; - break; - } - tp = tp->r_next; - } - if (!found) { - xlog_warn( - "XFS: xlog_recover_unlink_tid: trans not found"); - ASSERT(0); - return XFS_ERROR(EIO); - } - tp->r_next = tp->r_next->r_next; - } - return 0; -} - -STATIC void -xlog_recover_insert_item_backq( - xlog_recover_item_t **q, - xlog_recover_item_t *item) -{ - if (*q == NULL) { - item->ri_prev = item->ri_next = item; - *q = item; - } else { - item->ri_next = *q; - item->ri_prev = (*q)->ri_prev; - (*q)->ri_prev = item; - item->ri_prev->ri_next = item; - } -} - /* * Free up any resources allocated by the transaction * @@ -1089,41 +1118,43 @@ xlog_recover_insert_item_backq( */ STATIC void xlog_recover_free_trans( - xlog_recover_t *trans) + struct xlog_recover *trans) { - xlog_recover_item_t *first_item, *item, *free_item; + xlog_recover_item_t *item, *n; int i; - item = first_item = trans->r_itemq; - do { - free_item = item; - item = item->ri_next; - /* Free the regions in the item. */ - for (i = 0; i < free_item->ri_cnt; i++) { - kmem_free(free_item->ri_buf[i].i_addr); - } + list_for_each_entry_safe(item, n, &trans->r_itemq, ri_list) { + /* Free the regions in the item. */ + list_del(&item->ri_list); + for (i = 0; i < item->ri_cnt; i++) + kmem_free(item->ri_buf[i].i_addr); /* Free the item itself */ - kmem_free(free_item->ri_buf); - kmem_free(free_item); - } while (first_item != item); + kmem_free(item->ri_buf); + kmem_free(item); + } /* Free the transaction recover structure */ kmem_free(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_commit_trans( - xlog_t *log, - xlog_recover_t **q, - xlog_recover_t *trans, + struct log *log, + struct xlog_recover *trans, int pass) { - int error; + int error = 0; - if ((error = xlog_recover_unlink_tid(q, trans))) - return error; + hlist_del(&trans->r_list); if ((error = xlog_recover_do_trans(log, trans, pass))) return error; - xlog_recover_free_trans(trans); /* no error */ + + xlog_recover_free_trans(trans); return 0; } @@ -1148,7 +1179,7 @@ xlog_recover_unmount_trans( STATIC int xlog_recover_process_data( xlog_t *log, - xlog_recover_t *rhash[], + struct hlist_head rhash[], xlog_rec_header_t *rhead, xfs_caddr_t dp, int pass) @@ -1182,27 +1213,32 @@ xlog_recover_process_data( } tid = be32_to_cpu(ohead->oh_tid); hash = XLOG_RHASH(tid); - trans = xlog_recover_find_tid(rhash[hash], tid); + trans = xlog_recover_find_tid(&rhash[hash], tid); if (trans == NULL) { /* not found; add new tid */ if (ohead->oh_flags & XLOG_START_TRANS) xlog_recover_new_tid(&rhash[hash], tid, be64_to_cpu(rhead->h_lsn)); } else { - ASSERT(dp + be32_to_cpu(ohead->oh_len) <= lp); + if (dp + be32_to_cpu(ohead->oh_len) > lp) { + xlog_warn( + "XFS: xlog_recover_process_data: bad length"); + return (XFS_ERROR(EIO)); + } flags = ohead->oh_flags & ~XLOG_END_TRANS; if (flags & XLOG_WAS_CONT_TRANS) flags &= ~XLOG_CONTINUE_TRANS; switch (flags) { case XLOG_COMMIT_TRANS: error = xlog_recover_commit_trans(log, - &rhash[hash], trans, pass); + trans, pass); break; case XLOG_UNMOUNT_TRANS: error = xlog_recover_unmount_trans(trans); break; case XLOG_WAS_CONT_TRANS: - error = xlog_recover_add_to_cont_trans(trans, - dp, be32_to_cpu(ohead->oh_len)); + error = xlog_recover_add_to_cont_trans(log, + trans, dp, + be32_to_cpu(ohead->oh_len)); break; case XLOG_START_TRANS: xlog_warn( @@ -1212,7 +1248,7 @@ xlog_recover_process_data( break; case 0: case XLOG_CONTINUE_TRANS: - error = xlog_recover_add_to_trans(trans, + error = xlog_recover_add_to_trans(log, trans, dp, be32_to_cpu(ohead->oh_len)); break; default: @@ -1238,7 +1274,6 @@ xlog_unpack_data( xlog_t *log) { int i, j, k; - xlog_in_core_2_t *xhdr; for (i = 0; i < BTOBB(be32_to_cpu(rhead->h_len)) && i < (XLOG_HEADER_CYCLE_SIZE / BBSIZE); i++) { @@ -1247,7 +1282,7 @@ xlog_unpack_data( } if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { - xhdr = (xlog_in_core_2_t *)rhead; + xlog_in_core_2_t *xhdr = (xlog_in_core_2_t *)rhead; for ( ; i < BTOBB(be32_to_cpu(rhead->h_len)); i++) { j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); k = i % (XLOG_HEADER_CYCLE_SIZE / BBSIZE); @@ -1255,8 +1290,6 @@ xlog_unpack_data( dp += BBSIZE; } } - - xlog_unpack_data_checksum(rhead, dp, log); } STATIC int @@ -1312,12 +1345,12 @@ xlog_do_recovery_pass( { xlog_rec_header_t *rhead; xfs_daddr_t blk_no; - xfs_caddr_t bufaddr, offset; + xfs_caddr_t offset; xfs_buf_t *hbp, *dbp; int error = 0, h_size; int bblks, split_bblks; int hblks, split_hblks, wrapped_hblks; - xlog_recover_t *rhash[XLOG_RHASH_SIZE]; + struct hlist_head rhash[XLOG_RHASH_SIZE]; ASSERT(head_blk != tail_blk); @@ -1334,9 +1367,11 @@ xlog_do_recovery_pass( hbp = xlog_get_bp(log, 1); if (!hbp) return ENOMEM; - if ((error = xlog_bread(log, tail_blk, 1, hbp))) + + error = xlog_bread(log, tail_blk, 1, hbp, &offset); + if (error) goto bread_err1; - offset = xlog_align(log, tail_blk, 1, hbp); + rhead = (xlog_rec_header_t *)offset; error = xlog_valid_rec_header(log, rhead, tail_blk); if (error) @@ -1353,7 +1388,7 @@ xlog_do_recovery_pass( hblks = 1; } } else { - ASSERT(log->l_sectbb_log == 0); + ASSERT(log->l_sectBBsize == 1); hblks = 1; hbp = xlog_get_bp(log, 1); h_size = XLOG_BIG_RECORD_BSIZE; @@ -1370,9 +1405,10 @@ xlog_do_recovery_pass( memset(rhash, 0, sizeof(rhash)); if (tail_blk <= head_blk) { for (blk_no = tail_blk; blk_no < head_blk; ) { - if ((error = xlog_bread(log, blk_no, hblks, hbp))) + error = xlog_bread(log, blk_no, hblks, hbp, &offset); + if (error) goto bread_err2; - offset = xlog_align(log, blk_no, hblks, hbp); + rhead = (xlog_rec_header_t *)offset; error = xlog_valid_rec_header(log, rhead, blk_no); if (error) @@ -1380,10 +1416,11 @@ xlog_do_recovery_pass( /* blocks in data section */ bblks = (int)BTOBB(be32_to_cpu(rhead->h_len)); - error = xlog_bread(log, blk_no + hblks, bblks, dbp); + error = xlog_bread(log, blk_no + hblks, bblks, dbp, + &offset); if (error) goto bread_err2; - offset = xlog_align(log, blk_no + hblks, bblks, dbp); + xlog_unpack_data(rhead, offset, log); if ((error = xlog_recover_process_data(log, rhash, rhead, offset, pass))) @@ -1401,15 +1438,15 @@ xlog_do_recovery_pass( /* * Check for header wrapping around physical end-of-log */ - offset = NULL; + offset = XFS_BUF_PTR(hbp); split_hblks = 0; wrapped_hblks = 0; if (blk_no + hblks <= log->l_logBBsize) { /* Read header in one read */ - error = xlog_bread(log, blk_no, hblks, hbp); + error = xlog_bread(log, blk_no, hblks, hbp, + &offset); if (error) goto bread_err2; - offset = xlog_align(log, blk_no, hblks, hbp); } else { /* This LR is split across physical log end */ if (blk_no != log->l_logBBsize) { @@ -1417,12 +1454,13 @@ xlog_do_recovery_pass( ASSERT(blk_no <= INT_MAX); split_hblks = log->l_logBBsize - (int)blk_no; ASSERT(split_hblks > 0); - if ((error = xlog_bread(log, blk_no, - split_hblks, hbp))) + error = xlog_bread(log, blk_no, + split_hblks, hbp, + &offset); + if (error) goto bread_err2; - offset = xlog_align(log, blk_no, - split_hblks, hbp); } + /* * Note: this black magic still works with * large sector sizes (non-512) only because: @@ -1436,17 +1474,21 @@ xlog_do_recovery_pass( * - order is important. */ wrapped_hblks = hblks - split_hblks; - bufaddr = XFS_BUF_PTR(hbp); - XFS_BUF_SET_PTR(hbp, - bufaddr + BBTOB(split_hblks), + error = XFS_BUF_SET_PTR(hbp, + offset + BBTOB(split_hblks), BBTOB(hblks - split_hblks)); - error = xlog_bread(log, 0, wrapped_hblks, hbp); if (error) goto bread_err2; - XFS_BUF_SET_PTR(hbp, bufaddr, BBTOB(hblks)); - if (!offset) - offset = xlog_align(log, 0, - wrapped_hblks, hbp); + + error = xlog_bread_noalign(log, 0, + wrapped_hblks, hbp); + if (error) + goto bread_err2; + + error = XFS_BUF_SET_PTR(hbp, offset, + BBTOB(hblks)); + if (error) + goto bread_err2; } rhead = (xlog_rec_header_t *)offset; error = xlog_valid_rec_header(log, rhead, @@ -1459,14 +1501,14 @@ xlog_do_recovery_pass( /* Read in data for log record */ if (blk_no + bblks <= log->l_logBBsize) { - error = xlog_bread(log, blk_no, bblks, dbp); + error = xlog_bread(log, blk_no, bblks, dbp, + &offset); if (error) goto bread_err2; - offset = xlog_align(log, blk_no, bblks, dbp); } else { /* This log record is split across the * physical end of log */ - offset = NULL; + offset = XFS_BUF_PTR(dbp); split_bblks = 0; if (blk_no != log->l_logBBsize) { /* some data is before the physical @@ -1476,12 +1518,13 @@ xlog_do_recovery_pass( split_bblks = log->l_logBBsize - (int)blk_no; ASSERT(split_bblks > 0); - if ((error = xlog_bread(log, blk_no, - split_bblks, dbp))) + error = xlog_bread(log, blk_no, + split_bblks, dbp, + &offset); + if (error) goto bread_err2; - offset = xlog_align(log, blk_no, - split_bblks, dbp); } + /* * Note: this black magic still works with * large sector sizes (non-512) only because: @@ -1494,18 +1537,21 @@ xlog_do_recovery_pass( * _first_, then the log start (LR header end) * - order is important. */ - bufaddr = XFS_BUF_PTR(dbp); - XFS_BUF_SET_PTR(dbp, - bufaddr + BBTOB(split_bblks), + error = XFS_BUF_SET_PTR(dbp, + offset + BBTOB(split_bblks), BBTOB(bblks - split_bblks)); - error = xlog_bread(log, wrapped_hblks, - bblks - split_bblks, dbp); if (error) goto bread_err2; - XFS_BUF_SET_PTR(dbp, bufaddr, h_size); - if (!offset) - offset = xlog_align(log, wrapped_hblks, - bblks - split_bblks, dbp); + + error = xlog_bread_noalign(log, wrapped_hblks, + bblks - split_bblks, + dbp); + if (error) + goto bread_err2; + + error = XFS_BUF_SET_PTR(dbp, offset, h_size); + if (error) + goto bread_err2; } xlog_unpack_data(rhead, offset, log); if ((error = xlog_recover_process_data(log, rhash, @@ -1519,17 +1565,21 @@ xlog_do_recovery_pass( /* read first part of physical log */ while (blk_no < head_blk) { - if ((error = xlog_bread(log, blk_no, hblks, hbp))) + error = xlog_bread(log, blk_no, hblks, hbp, &offset); + if (error) goto bread_err2; - offset = xlog_align(log, blk_no, hblks, hbp); + rhead = (xlog_rec_header_t *)offset; error = xlog_valid_rec_header(log, rhead, blk_no); if (error) goto bread_err2; + bblks = (int)BTOBB(be32_to_cpu(rhead->h_len)); - if ((error = xlog_bread(log, blk_no+hblks, bblks, dbp))) + error = xlog_bread(log, blk_no+hblks, bblks, dbp, + &offset); + if (error) goto bread_err2; - offset = xlog_align(log, blk_no+hblks, bblks, dbp); + xlog_unpack_data(rhead, offset, log); if ((error = xlog_recover_process_data(log, rhash, rhead, offset, pass))) diff --git a/logprint/log_misc.c b/logprint/log_misc.c index 253e146..707a93b 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -642,7 +642,7 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, int len, int *i, int num_ops) mode = dino.di_mode & S_IFMT; size = (int)dino.di_size; xlog_print_trans_inode_core(&dino); - *ptr += sizeof(xfs_dinode_core_t); + *ptr += sizeof(xfs_icdinode_t); if (*i == num_ops-1 && f->ilf_size == 3) { return 1; diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index 7bd4617..62727bf 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -36,10 +36,10 @@ xlog_print_find_oldest( first_blk = 0; /* read first block */ bp = xlog_get_bp(log, 1); - xlog_bread(log, 0, 1, bp); + xlog_bread_noalign(log, 0, 1, bp); first_half_cycle = xlog_get_cycle(XFS_BUF_PTR(bp)); *last_blk = log->l_logBBsize-1; /* read last block */ - xlog_bread(log, *last_blk, 1, bp); + xlog_bread_noalign(log, *last_blk, 1, bp); last_half_cycle = xlog_get_cycle(XFS_BUF_PTR(bp)); ASSERT(last_half_cycle != 0); @@ -486,19 +486,16 @@ xlog_recover_print_item( void xlog_recover_print_trans( xlog_recover_t *trans, - xlog_recover_item_t *itemq, + struct list_head *itemq, int print) { - xlog_recover_item_t *first_item, *item; + xlog_recover_item_t *item; if (print < 3) return; print_xlog_record_line(); xlog_recover_print_trans_head(trans); - item = first_item = itemq; - do { + list_for_each_entry(item, itemq, ri_list) xlog_recover_print_item(item); - item = item->ri_next; - } while (first_item != item); } diff --git a/logprint/log_print_trans.c b/logprint/log_print_trans.c index 8b21257..7405772 100644 --- a/logprint/log_print_trans.c +++ b/logprint/log_print_trans.c @@ -25,7 +25,7 @@ xlog_recover_print_trans_head( printf(_("TRANS: tid:0x%x type:%s #items:%d trans:0x%x q:0x%lx\n"), tr->r_log_tid, trans_type[tr->r_theader.th_type], tr->r_theader.th_num_items, - tr->r_theader.th_tid, (long)tr->r_itemq); + tr->r_theader.th_tid, (long)&tr->r_itemq); } int @@ -34,7 +34,7 @@ xlog_recover_do_trans( xlog_recover_t *trans, int pass) { - xlog_recover_print_trans(trans, trans->r_itemq, 3); + xlog_recover_print_trans(trans, &trans->r_itemq, 3); return 0; } diff --git a/mkfs/proto.c b/mkfs/proto.c index 3723685..3021028 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -39,7 +39,7 @@ static long filesize(int fd); * (basically no fragmentation). */ #define MKFS_BLOCKRES_INODE \ - ((uint)(XFS_IALLOC_BLOCKS(mp) + (XFS_IN_MAXLEVELS(mp) - 1))) + ((uint)(XFS_IALLOC_BLOCKS(mp) + ((mp)->m_in_maxlevels - 1))) #define MKFS_BLOCKRES(rb) \ ((uint)(MKFS_BLOCKRES_INODE + XFS_DA_NODE_MAXDEPTH + \ (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1) + (rb))) @@ -201,7 +201,7 @@ rsvfile( if (ip->i_d.di_mode & S_IXGRP) ip->i_d.di_mode &= ~S_ISGID; - libxfs_ichgtime(ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + libxfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); ip->i_d.di_flags |= XFS_DIFLAG_PREALLOC; @@ -244,7 +244,7 @@ newfile( nb = XFS_B_TO_FSB(mp, len); nmap = 1; error = libxfs_bmapi(tp, ip, 0, nb, XFS_BMAPI_WRITE, first, nb, - &map, &nmap, flist, NULL); + &map, &nmap, flist); if (error) { fail(_("error allocating space for a file"), error); } @@ -436,7 +436,7 @@ parseproto( xname.len = name ? strlen(name) : 0; tp = libxfs_trans_alloc(mp, 0); flags = XFS_ILOG_CORE; - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); switch (fmt) { case IF_REGULAR: buf = newregfile(pp, &len); @@ -664,13 +664,13 @@ rtinit( libxfs_trans_ijoin(tp, rbmip, 0); libxfs_trans_ihold(tp, rbmip); bno = 0; - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); while (bno < mp->m_sb.sb_rbmblocks) { nmap = XFS_BMAP_MAX_NMAP; error = libxfs_bmapi(tp, rbmip, bno, (xfs_extlen_t)(mp->m_sb.sb_rbmblocks - bno), XFS_BMAPI_WRITE, &first, mp->m_sb.sb_rbmblocks, - map, &nmap, &flist, NULL); + map, &nmap, &flist); if (error) { fail(_("Allocation of the realtime bitmap failed"), error); @@ -701,13 +701,13 @@ rtinit( libxfs_trans_ijoin(tp, rsumip, 0); libxfs_trans_ihold(tp, rsumip); bno = 0; - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); while (bno < nsumblocks) { nmap = XFS_BMAP_MAX_NMAP; error = libxfs_bmapi(tp, rsumip, bno, (xfs_extlen_t)(nsumblocks - bno), XFS_BMAPI_WRITE, &first, nsumblocks, - map, &nmap, &flist, NULL); + map, &nmap, &flist); if (error) { fail(_("Allocation of the realtime summary failed"), error); @@ -733,7 +733,7 @@ rtinit( tp = libxfs_trans_alloc(mp, 0); if ((i = libxfs_trans_reserve(tp, 0, 0, 0, 0, 0))) res_failed(i); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); ebno = XFS_RTMIN(mp->m_sb.sb_rextents, bno + NBBY * mp->m_sb.sb_blocksize); error = libxfs_rtfree_extent(tp, bno, (xfs_extlen_t)(ebno-bno)); diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 5b3b9a7..1e4e966 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2611,10 +2611,11 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), args.mp = mp; args.agno = agno; args.alignment = 1; - args.pag = &mp->m_perag[agno]; + args.pag = xfs_perag_get(mp,agno); if ((c = libxfs_trans_reserve(tp, worst_freelist, 0, 0, 0, 0))) res_failed(c); libxfs_alloc_fix_freelist(&args, 0); + xfs_perag_put(args.pag); libxfs_trans_commit(tp, 0); } diff --git a/repair/attr_repair.c b/repair/attr_repair.c index fb686fa..7672e13 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -388,7 +388,7 @@ process_leaf_attr_local( { xfs_attr_leaf_name_local_t *local; - local = XFS_ATTR_LEAF_NAME_LOCAL(leaf, i); + local = xfs_attr_leaf_name_local(leaf, i); if (local->namelen == 0 || namecheck((char *)&local->nameval[0], local->namelen)) { do_warn(_("attribute entry %d in attr block %u, inode %llu " @@ -423,7 +423,7 @@ process_leaf_attr_local( return -1; } } - return XFS_ATTR_LEAF_ENTSIZE_LOCAL(local->namelen, + return xfs_attr_leaf_entsize_local(local->namelen, be16_to_cpu(local->valuelen)); } @@ -441,7 +441,7 @@ process_leaf_attr_remote( xfs_attr_leaf_name_remote_t *remotep; char* value; - remotep = XFS_ATTR_LEAF_NAME_REMOTE(leaf, i); + remotep = xfs_attr_leaf_name_remote(leaf, i); if (remotep->namelen == 0 || namecheck((char *)&remotep->name[0], remotep->namelen) || @@ -479,7 +479,7 @@ process_leaf_attr_remote( } free(value); out: - return XFS_ATTR_LEAF_ENTSIZE_REMOTE(remotep->namelen); + return xfs_attr_leaf_entsize_remote(remotep->namelen); bad_free_out: free(value); @@ -840,8 +840,8 @@ process_longform_attr( bno = blkmap_get(blkmap, 0); if ( bno == NULLDFSBNO ) { - if (dip->di_core.di_aformat == XFS_DINODE_FMT_EXTENTS && - be16_to_cpu(dip->di_core.di_anextents) == 0) + if (dip->di_aformat == XFS_DINODE_FMT_EXTENTS && + be16_to_cpu(dip->di_anextents) == 0) return(0); /* the kernel can handle this state */ do_warn(_("block 0 of inode %llu attribute fork is missing\n"), ino); @@ -958,7 +958,7 @@ process_attributes( int *repair) /* returned if we did repair */ { int err; - __u8 aformat = dip->di_core.di_aformat; + __u8 aformat = dip->di_aformat; xfs_attr_shortform_t *asf; asf = (xfs_attr_shortform_t *) XFS_DFORK_APTR(dip); diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c index 734e9a8..8735f92 100644 --- a/repair/dino_chunks.c +++ b/repair/dino_chunks.c @@ -62,7 +62,7 @@ check_aginode_block(xfs_mount_t *mp, } for (i = 0; i < mp->m_sb.sb_inopblock; i++) { - dino_p = XFS_MAKE_IPTR(mp, bp, i); + dino_p = xfs_make_iptr(mp, bp, i); if (!verify_uncertain_dinode(mp, dino_p, agno, XFS_OFFBNO_TO_AGINO(mp, agbno, i))) cnt++; @@ -674,7 +674,7 @@ process_inode_chunk( /* * make inode pointer */ - dino = XFS_MAKE_IPTR(mp, bplist[bp_index], cluster_offset); + dino = xfs_make_iptr(mp, bplist[bp_index], cluster_offset); agino = irec_offset + ino_rec->ino_startnum; /* @@ -767,7 +767,7 @@ process_inode_chunk( /* * make inode pointer */ - dino = XFS_MAKE_IPTR(mp, bplist[bp_index], cluster_offset); + dino = xfs_make_iptr(mp, bplist[bp_index], cluster_offset); agino = irec_offset + ino_rec->ino_startnum; is_used = 3; @@ -809,9 +809,9 @@ process_inode_chunk( * store on-disk nlink count for comparing in phase 7 */ set_inode_disk_nlinks(ino_rec, irec_offset, - dino->di_core.di_version > XFS_DINODE_VERSION_1 - ? be32_to_cpu(dino->di_core.di_nlink) - : be16_to_cpu(dino->di_core.di_onlink)); + dino->di_version > 1 + ? be32_to_cpu(dino->di_nlink) + : be16_to_cpu(dino->di_onlink)); } else { set_inode_free(ino_rec, irec_offset); diff --git a/repair/dinode.c b/repair/dinode.c index bf04c6e..2fa850d 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -43,27 +43,27 @@ int calc_attr_offset(xfs_mount_t *mp, xfs_dinode_t *dino) { - xfs_dinode_core_t *dinoc = &dino->di_core; - int offset = ((__psint_t) &dino->di_u) - - (__psint_t)dino; + int offset = (__psint_t)XFS_DFORK_DPTR(dino) - (__psint_t)dino; + xfs_bmdr_block_t *dfp; /* * don't worry about alignment when calculating offset * because the data fork is already 8-byte aligned */ - switch (dinoc->di_format) { + switch (dino->di_format) { case XFS_DINODE_FMT_DEV: offset += sizeof(xfs_dev_t); break; case XFS_DINODE_FMT_LOCAL: - offset += be64_to_cpu(dinoc->di_size); + offset += be64_to_cpu(dino->di_size); break; case XFS_DINODE_FMT_EXTENTS: - offset += be32_to_cpu(dinoc->di_nextents) * + offset += be32_to_cpu(dino->di_nextents) * sizeof(xfs_bmbt_rec_t); break; case XFS_DINODE_FMT_BTREE: - offset += be16_to_cpu(dino->di_u.di_bmbt.bb_numrecs) * + dfp = (xfs_bmdr_block_t *)XFS_DFORK_DPTR(dino); + offset += be16_to_cpu(dfp->bb_numrecs) * sizeof(xfs_bmbt_rec_t); break; default: @@ -79,9 +79,7 @@ calc_attr_offset(xfs_mount_t *mp, xfs_dinode_t *dino) int clear_dinode_attr(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_ino_t ino_num) { - xfs_dinode_core_t *dinoc = &dino->di_core; - - ASSERT(dinoc->di_forkoff != 0); + ASSERT(dino->di_forkoff != 0); if (!no_modify) fprintf(stderr, _("clearing inode %llu attributes\n"), @@ -90,16 +88,16 @@ clear_dinode_attr(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_ino_t ino_num) fprintf(stderr, _("would have cleared inode %llu attributes\n"), (unsigned long long)ino_num); - if (be16_to_cpu(dinoc->di_anextents) != 0) { + if (be16_to_cpu(dino->di_anextents) != 0) { if (no_modify) return(1); - dinoc->di_anextents = cpu_to_be16(0); + dino->di_anextents = cpu_to_be16(0); } - if (dinoc->di_aformat != XFS_DINODE_FMT_EXTENTS) { + if (dino->di_aformat != XFS_DINODE_FMT_EXTENTS) { if (no_modify) return(1); - dinoc->di_aformat = XFS_DINODE_FMT_EXTENTS; + dino->di_aformat = XFS_DINODE_FMT_EXTENTS; } /* get rid of the fork by clearing forkoff */ @@ -118,7 +116,7 @@ clear_dinode_attr(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_ino_t ino_num) XFS_DFORK_APTR(dino); asf->hdr.totsize = cpu_to_be16(sizeof(xfs_attr_sf_hdr_t)); asf->hdr.count = 0; - dinoc->di_forkoff = 0; /* got to do this after asf is set */ + dino->di_forkoff = 0; /* got to do this after asf is set */ } /* @@ -129,7 +127,7 @@ clear_dinode_attr(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_ino_t ino_num) /* ARGSUSED */ int -clear_dinode_core(xfs_dinode_core_t *dinoc, xfs_ino_t ino_num) +clear_dinode_core(xfs_dinode_t *dinoc, xfs_ino_t ino_num) { int dirty = 0; @@ -143,14 +141,13 @@ clear_dinode_core(xfs_dinode_core_t *dinoc, xfs_ino_t ino_num) } if (!XFS_DINODE_GOOD_VERSION(dinoc->di_version) || - (!fs_inode_nlink && dinoc->di_version > XFS_DINODE_VERSION_1)) { + (!fs_inode_nlink && dinoc->di_version > 1)) { dirty = 1; if (no_modify) return(1); - dinoc->di_version = (fs_inode_nlink) ? XFS_DINODE_VERSION_2 - : XFS_DINODE_VERSION_1; + dinoc->di_version = (fs_inode_nlink) ? 2 : 1; } if (be16_to_cpu(dinoc->di_mode) != 0) { @@ -252,7 +249,7 @@ clear_dinode_core(xfs_dinode_core_t *dinoc, xfs_ino_t ino_num) dinoc->di_anextents = 0; } - if (dinoc->di_version > XFS_DINODE_VERSION_1 && + if (dinoc->di_version > 1 && be32_to_cpu(dinoc->di_nlink) != 0) { dirty = 1; @@ -289,13 +286,13 @@ clear_dinode(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_ino_t ino_num) { int dirty; - dirty = clear_dinode_core(&dino->di_core, ino_num); + dirty = clear_dinode_core(dino, ino_num); dirty += clear_dinode_unlinked(mp, dino); /* and clear the forks */ if (dirty && !no_modify) - memset(&dino->di_u, 0, XFS_LITINO(mp)); + memset(XFS_DFORK_DPTR(dino), 0, XFS_LITINO(mp)); return(dirty); } @@ -868,7 +865,7 @@ get_agino_buf(xfs_mount_t *mp, return(NULL); } - *dipp = XFS_MAKE_IPTR(mp, bp, agino - + *dipp = xfs_make_iptr(mp, bp, agino - XFS_OFFBNO_TO_AGINO(mp, XFS_AGINO_TO_AGBNO(mp, irec->ino_startnum), 0)); @@ -1347,11 +1344,11 @@ process_lclinode( xfs_ino_t lino; lino = XFS_AGINO_TO_INO(mp, agno, ino); - if (whichfork == XFS_DATA_FORK && be64_to_cpu(dip->di_core.di_size) > + if (whichfork == XFS_DATA_FORK && be64_to_cpu(dip->di_size) > XFS_DFORK_DSIZE(dip, mp)) { do_warn( _("local inode %llu data fork is too large (size = %lld, max = %d)\n"), - lino, be64_to_cpu(dip->di_core.di_size), + lino, be64_to_cpu(dip->di_size), XFS_DFORK_DSIZE(dip, mp)); return(1); } else if (whichfork == XFS_ATTR_FORK) { @@ -1385,23 +1382,23 @@ process_symlink_extlist(xfs_mount_t *mp, xfs_ino_t lino, xfs_dinode_t *dino) int i; int max_blocks; - if (be64_to_cpu(dino->di_core.di_size) <= XFS_DFORK_DSIZE(dino, mp)) { - if (dino->di_core.di_format == XFS_DINODE_FMT_LOCAL) + if (be64_to_cpu(dino->di_size) <= XFS_DFORK_DSIZE(dino, mp)) { + if (dino->di_format == XFS_DINODE_FMT_LOCAL) return 0; do_warn(_("mismatch between format (%d) and size (%lld) in " - "symlink ino %llu\n"), dino->di_core.di_format, - be64_to_cpu(dino->di_core.di_size), lino); + "symlink ino %llu\n"), dino->di_format, + be64_to_cpu(dino->di_size), lino); return 1; } - if (dino->di_core.di_format == XFS_DINODE_FMT_LOCAL) { + if (dino->di_format == XFS_DINODE_FMT_LOCAL) { do_warn(_("mismatch between format (%d) and size (%lld) in " - "symlink inode %llu\n"), dino->di_core.di_format, - be64_to_cpu(dino->di_core.di_size), lino); + "symlink inode %llu\n"), dino->di_format, + be64_to_cpu(dino->di_size), lino); return 1; } rp = (xfs_bmbt_rec_t *)XFS_DFORK_DPTR(dino); - numrecs = be32_to_cpu(dino->di_core.di_nextents); + numrecs = be32_to_cpu(dino->di_nextents); /* * the max # of extents in a symlink inode is equal to the @@ -1471,7 +1468,6 @@ process_symlink( blkmap_t *blkmap) { xfs_dfsbno_t fsbno; - xfs_dinode_core_t *dinoc = &dino->di_core; xfs_buf_t *bp = NULL; char *symlink, *cptr, *buf_data; int i, size, amountdone; @@ -1483,9 +1479,9 @@ process_symlink( * the inode is structurally ok so we don't have to check * for that */ - if (be64_to_cpu(dinoc->di_size) >= MAXPATHLEN) { + if (be64_to_cpu(dino->di_size) >= MAXPATHLEN) { do_warn(_("symlink in inode %llu too long (%lld chars)\n"), - lino, be64_to_cpu(dinoc->di_size)); + lino, be64_to_cpu(dino->di_size)); return(1); } @@ -1494,13 +1490,13 @@ process_symlink( * get symlink contents into data area */ symlink = &data[0]; - if (be64_to_cpu(dinoc->di_size) <= XFS_DFORK_DSIZE(dino, mp)) { + if (be64_to_cpu(dino->di_size) <= XFS_DFORK_DSIZE(dino, mp)) { /* * local symlink, just copy the symlink out of the * inode into the data area */ memmove(symlink, XFS_DFORK_DPTR(dino), - be64_to_cpu(dinoc->di_size)); + be64_to_cpu(dino->di_size)); } else { /* * stored in a meta-data file, have to bmap one block @@ -1509,7 +1505,7 @@ process_symlink( i = size = amountdone = 0; cptr = symlink; - while (amountdone < be64_to_cpu(dinoc->di_size)) { + while (amountdone < be64_to_cpu(dino->di_size)) { fsbno = blkmap_get(blkmap, i); if (fsbno != NULLDFSBNO) bp = libxfs_readbuf(mp->m_dev, @@ -1523,7 +1519,7 @@ process_symlink( } buf_data = (char *)XFS_BUF_PTR(bp); - size = MIN(be64_to_cpu(dinoc->di_size) - amountdone, + size = MIN(be64_to_cpu(dino->di_size) - amountdone, XFS_FSB_TO_BB(mp, 1) * BBSIZE); memmove(cptr, buf_data, size); cptr += size; @@ -1532,12 +1528,12 @@ process_symlink( libxfs_putbuf(bp); } } - data[be64_to_cpu(dinoc->di_size)] = '\0'; + data[be64_to_cpu(dino->di_size)] = '\0'; /* * check for nulls */ - if (null_check(symlink, be64_to_cpu(dinoc->di_size))) { + if (null_check(symlink, be64_to_cpu(dino->di_size))) { do_warn( _("found illegal null character in symlink inode %llu\n"), lino); @@ -1547,7 +1543,7 @@ process_symlink( /* * check for any component being too long */ - if (be64_to_cpu(dinoc->di_size) >= MAXNAMELEN) { + if (be64_to_cpu(dino->di_size) >= MAXNAMELEN) { cptr = strchr(symlink, '/'); while (cptr != NULL) { @@ -1595,27 +1591,27 @@ process_misc_ino_types(xfs_mount_t *mp, /* * must also have a zero size */ - if (be64_to_cpu(dino->di_core.di_size) != 0) { + if (be64_to_cpu(dino->di_size) != 0) { switch (type) { case XR_INO_CHRDEV: do_warn(_("size of character device inode %llu != 0 " "(%lld bytes)\n"), lino, - be64_to_cpu(dino->di_core.di_size)); + be64_to_cpu(dino->di_size)); break; case XR_INO_BLKDEV: do_warn(_("size of block device inode %llu != 0 " "(%lld bytes)\n"), lino, - be64_to_cpu(dino->di_core.di_size)); + be64_to_cpu(dino->di_size)); break; case XR_INO_SOCK: do_warn(_("size of socket inode %llu != 0 " "(%lld bytes)\n"), lino, - be64_to_cpu(dino->di_core.di_size)); + be64_to_cpu(dino->di_size)); break; case XR_INO_FIFO: do_warn(_("size of fifo inode %llu != 0 " "(%lld bytes)\n"), lino, - be64_to_cpu(dino->di_core.di_size)); + be64_to_cpu(dino->di_size)); break; default: do_warn(_("Internal error - process_misc_ino_types, " @@ -1634,7 +1630,7 @@ process_misc_ino_types_blocks(xfs_drfsbno_t totblocks, xfs_ino_t lino, int type) { /* * you can not enforce all misc types have zero data fork blocks - * by checking dino->di_core.di_nblocks because atotblocks (attribute + * by checking dino->di_nblocks because atotblocks (attribute * blocks) are part of nblocks. We must check this later when atotblocks * has been calculated or by doing a simple check that anExtents == 0. * We must also guarantee that totblocks is 0. Thus nblocks checking @@ -1673,28 +1669,28 @@ process_misc_ino_types_blocks(xfs_drfsbno_t totblocks, xfs_ino_t lino, int type) static inline int dinode_fmt( - xfs_dinode_core_t *dinoc) + xfs_dinode_t *dino) { - return be16_to_cpu(dinoc->di_mode) & S_IFMT; + return be16_to_cpu(dino->di_mode) & S_IFMT; } static inline void change_dinode_fmt( - xfs_dinode_core_t *dinoc, + xfs_dinode_t *dino, int new_fmt) { - int mode = be16_to_cpu(dinoc->di_mode); + int mode = be16_to_cpu(dino->di_mode); ASSERT((new_fmt & ~S_IFMT) == 0); mode &= ~S_IFMT; mode |= new_fmt; - dinoc->di_mode = cpu_to_be16(mode); + dino->di_mode = cpu_to_be16(mode); } static int check_dinode_mode_format( - xfs_dinode_core_t *dinoc) + xfs_dinode_t *dinoc) { if (dinoc->di_format >= XFS_DINODE_FMT_UUID) return -1; /* FMT_UUID is not used */ @@ -1731,7 +1727,7 @@ check_dinode_mode_format( static int process_check_sb_inodes( xfs_mount_t *mp, - xfs_dinode_core_t *dinoc, + xfs_dinode_t *dinoc, xfs_ino_t lino, int *type, int *dirty) @@ -1827,17 +1823,16 @@ process_check_inode_sizes( xfs_ino_t lino, int type) { - xfs_dinode_core_t *dinoc = &dino->di_core; - xfs_fsize_t size = be64_to_cpu(dinoc->di_size); + xfs_fsize_t size = be64_to_cpu(dino->di_size); switch (type) { case XR_INO_DIR: if (size <= XFS_DFORK_DSIZE(dino, mp) && - dinoc->di_format != XFS_DINODE_FMT_LOCAL) { + dino->di_format != XFS_DINODE_FMT_LOCAL) { do_warn(_("mismatch between format (%d) and size " "(%lld) in directory ino %llu\n"), - dinoc->di_format, size, lino); + dino->di_format, size, lino); return 1; } if (size > XFS_DIR2_LEAF_OFFSET) { @@ -1907,17 +1902,17 @@ process_check_inode_sizes( static int process_check_inode_forkoff( xfs_mount_t *mp, - xfs_dinode_core_t *dinoc, + xfs_dinode_t *dino, xfs_ino_t lino) { - if (dinoc->di_forkoff == 0) + if (dino->di_forkoff == 0) return 0; - switch (dinoc->di_format) { + switch (dino->di_format) { case XFS_DINODE_FMT_DEV: - if (dinoc->di_forkoff != (roundup(sizeof(xfs_dev_t), 8) >> 3)) { + if (dino->di_forkoff != (roundup(sizeof(xfs_dev_t), 8) >> 3)) { do_warn(_("bad attr fork offset %d in dev inode %llu, " - "should be %d\n"), dinoc->di_forkoff, lino, + "should be %d\n"), dino->di_forkoff, lino, (int)(roundup(sizeof(xfs_dev_t), 8) >> 3)); return 1; } @@ -1925,15 +1920,15 @@ process_check_inode_forkoff( case XFS_DINODE_FMT_LOCAL: /* fall through ... */ case XFS_DINODE_FMT_EXTENTS: /* fall through ... */ case XFS_DINODE_FMT_BTREE: - if (dinoc->di_forkoff >= (XFS_LITINO(mp) >> 3)) { + if (dino->di_forkoff >= (XFS_LITINO(mp) >> 3)) { do_warn(_("bad attr fork offset %d in inode %llu, " - "max=%d\n"), dinoc->di_forkoff, lino, + "max=%d\n"), dino->di_forkoff, lino, XFS_LITINO(mp) >> 3); return 1; } break; default: - do_error(_("unexpected inode format %d\n"), dinoc->di_format); + do_error(_("unexpected inode format %d\n"), dino->di_format); break; } return 0; @@ -1944,24 +1939,24 @@ process_check_inode_forkoff( */ static int process_inode_blocks_and_extents( - xfs_dinode_core_t *dinoc, + xfs_dinode_t *dino, xfs_drfsbno_t nblocks, __uint64_t nextents, __uint64_t anextents, xfs_ino_t lino, int *dirty) { - if (nblocks != be64_to_cpu(dinoc->di_nblocks)) { + if (nblocks != be64_to_cpu(dino->di_nblocks)) { if (!no_modify) { do_warn(_("correcting nblocks for inode %llu, " "was %llu - counted %llu\n"), lino, - be64_to_cpu(dinoc->di_nblocks), nblocks); - dinoc->di_nblocks = cpu_to_be64(nblocks); + be64_to_cpu(dino->di_nblocks), nblocks); + dino->di_nblocks = cpu_to_be64(nblocks); *dirty = 1; } else { do_warn(_("bad nblocks %llu for inode %llu, " "would reset to %llu\n"), - be64_to_cpu(dinoc->di_nblocks), lino, nblocks); + be64_to_cpu(dino->di_nblocks), lino, nblocks); } } @@ -1970,16 +1965,16 @@ process_inode_blocks_and_extents( nextents, lino); return 1; } - if (nextents != be32_to_cpu(dinoc->di_nextents)) { + if (nextents != be32_to_cpu(dino->di_nextents)) { if (!no_modify) { do_warn(_("correcting nextents for inode %llu, " "was %d - counted %llu\n"), lino, - be32_to_cpu(dinoc->di_nextents), nextents); - dinoc->di_nextents = cpu_to_be32(nextents); + be32_to_cpu(dino->di_nextents), nextents); + dino->di_nextents = cpu_to_be32(nextents); *dirty = 1; } else { do_warn(_("bad nextents %d for inode %llu, would reset " - "to %llu\n"), be32_to_cpu(dinoc->di_nextents), + "to %llu\n"), be32_to_cpu(dino->di_nextents), lino, nextents); } } @@ -1989,16 +1984,16 @@ process_inode_blocks_and_extents( anextents, lino); return 1; } - if (anextents != be16_to_cpu(dinoc->di_anextents)) { + if (anextents != be16_to_cpu(dino->di_anextents)) { if (!no_modify) { do_warn(_("correcting anextents for inode %llu, " "was %d - counted %llu\n"), lino, - be16_to_cpu(dinoc->di_anextents), anextents); - dinoc->di_anextents = cpu_to_be16(anextents); + be16_to_cpu(dino->di_anextents), anextents); + dino->di_anextents = cpu_to_be16(anextents); *dirty = 1; } else { do_warn(_("bad anextents %d for inode %llu, would reset" - " to %llu\n"), be16_to_cpu(dinoc->di_anextents), + " to %llu\n"), be16_to_cpu(dino->di_anextents), lino, anextents); } } @@ -2021,19 +2016,18 @@ process_inode_data_fork( blkmap_t **dblkmap, int check_dups) { - xfs_dinode_core_t *dinoc = &dino->di_core; xfs_ino_t lino = XFS_AGINO_TO_INO(mp, agno, ino); int err = 0; - *nextents = be32_to_cpu(dinoc->di_nextents); - if (*nextents > be64_to_cpu(dinoc->di_nblocks)) + *nextents = be32_to_cpu(dino->di_nextents); + if (*nextents > be64_to_cpu(dino->di_nblocks)) *nextents = 1; - if (dinoc->di_format != XFS_DINODE_FMT_LOCAL && type != XR_INO_RTDATA) + if (dino->di_format != XFS_DINODE_FMT_LOCAL && type != XR_INO_RTDATA) *dblkmap = blkmap_alloc(*nextents, XFS_DATA_FORK); *nextents = 0; - switch (dinoc->di_format) { + switch (dino->di_format) { case XFS_DINODE_FMT_LOCAL: err = process_lclinode(mp, agno, ino, dino, XFS_DATA_FORK); *totblocks = 0; @@ -2053,7 +2047,7 @@ process_inode_data_fork( break; default: do_error(_("unknown format %d, ino %llu (mode = %d)\n"), - dinoc->di_format, lino, be16_to_cpu(dinoc->di_mode)); + dino->di_format, lino, be16_to_cpu(dino->di_mode)); } if (err) { @@ -2071,7 +2065,7 @@ process_inode_data_fork( * re-process data fork to set bitmap since the * bitmap wasn't set the first time through */ - switch (dinoc->di_format) { + switch (dino->di_format) { case XFS_DINODE_FMT_LOCAL: err = process_lclinode(mp, agno, ino, dino, XFS_DATA_FORK); @@ -2091,8 +2085,8 @@ process_inode_data_fork( break; default: do_error(_("unknown format %d, ino %llu (mode = %d)\n"), - dinoc->di_format, lino, - be16_to_cpu(dinoc->di_mode)); + dino->di_format, lino, + be16_to_cpu(dino->di_mode)); } if (no_modify && err != 0) @@ -2120,7 +2114,6 @@ process_inode_attr_fork( int extra_attr_check, int *retval) { - xfs_dinode_core_t *dinoc = &dino->di_core; xfs_ino_t lino = XFS_AGINO_TO_INO(mp, agno, ino); blkmap_t *ablkmap = NULL; int repair = 0; @@ -2128,12 +2121,12 @@ process_inode_attr_fork( if (!XFS_DFORK_Q(dino)) { *anextents = 0; - if (dinoc->di_aformat != XFS_DINODE_FMT_EXTENTS) { + if (dino->di_aformat != XFS_DINODE_FMT_EXTENTS) { do_warn(_("bad attribute format %d in inode %llu, "), - dinoc->di_aformat, lino); + dino->di_aformat, lino); if (!no_modify) { do_warn(_("resetting value\n")); - dinoc->di_aformat = XFS_DINODE_FMT_EXTENTS; + dino->di_aformat = XFS_DINODE_FMT_EXTENTS; *dirty = 1; } else do_warn(_("would reset value\n")); @@ -2141,11 +2134,11 @@ process_inode_attr_fork( return 0; } - *anextents = be16_to_cpu(dinoc->di_anextents); - if (*anextents > be64_to_cpu(dinoc->di_nblocks)) + *anextents = be16_to_cpu(dino->di_anextents); + if (*anextents > be64_to_cpu(dino->di_nblocks)) *anextents = 1; - switch (dinoc->di_aformat) { + switch (dino->di_aformat) { case XFS_DINODE_FMT_LOCAL: *anextents = 0; *atotblocks = 0; @@ -2167,7 +2160,7 @@ process_inode_attr_fork( break; default: do_warn(_("illegal attribute format %d, ino %llu\n"), - dinoc->di_aformat, lino); + dino->di_aformat, lino); err = 1; break; } @@ -2187,7 +2180,7 @@ process_inode_attr_fork( if (delete_attr_ok) { do_warn(_(", clearing attr fork\n")); *dirty += clear_dinode_attr(mp, dino, lino); - dinoc->di_aformat = XFS_DINODE_FMT_LOCAL; + dino->di_aformat = XFS_DINODE_FMT_LOCAL; } else { do_warn("\n"); *dirty += clear_dinode(mp, dino, lino); @@ -2206,7 +2199,7 @@ process_inode_attr_fork( } if (check_dups) { - switch (dinoc->di_aformat) { + switch (dino->di_aformat) { case XFS_DINODE_FMT_LOCAL: err = process_lclinode(mp, agno, ino, dino, XFS_ATTR_FORK); @@ -2223,7 +2216,7 @@ process_inode_attr_fork( break; default: do_error(_("illegal attribute fmt %d, ino %llu\n"), - dinoc->di_aformat, lino); + dino->di_aformat, lino); } if (no_modify && err != 0) { @@ -2247,7 +2240,7 @@ process_inode_attr_fork( /* clear attributes if not done already */ if (!no_modify) { *dirty += clear_dinode_attr(mp, dino, lino); - dinoc->di_aformat = XFS_DINODE_FMT_LOCAL; + dino->di_aformat = XFS_DINODE_FMT_LOCAL; } else { do_warn(_("would clear attr fork\n")); } @@ -2270,18 +2263,18 @@ process_inode_attr_fork( static int process_check_inode_nlink_version( - xfs_dinode_core_t *dinoc, + xfs_dinode_t *dino, xfs_ino_t lino) { int dirty = 0; - if (dinoc->di_version > XFS_DINODE_VERSION_1 && !fs_inode_nlink) { + if (dino->di_version > 1 && !fs_inode_nlink) { /* * do we have a fs/inode version mismatch with a valid * version 2 inode here that has to stay version 2 or * lose links? */ - if (be32_to_cpu(dinoc->di_nlink) > XFS_MAXLINK_1) { + if (be32_to_cpu(dino->di_nlink) > XFS_MAXLINK_1) { /* * yes. are nlink inodes allowed? */ @@ -2311,17 +2304,17 @@ process_check_inode_nlink_version( if (!no_modify) { do_warn(_("converting back to version 1,\n" "this may destroy %d links\n"), - be32_to_cpu(dinoc->di_nlink) - + be32_to_cpu(dino->di_nlink) - XFS_MAXLINK_1); - dinoc->di_version = XFS_DINODE_VERSION_1; - dinoc->di_nlink = cpu_to_be32(XFS_MAXLINK_1); - dinoc->di_onlink = cpu_to_be16(XFS_MAXLINK_1); + dino->di_version = 1; + dino->di_nlink = cpu_to_be32(XFS_MAXLINK_1); + dino->di_onlink = cpu_to_be16(XFS_MAXLINK_1); dirty = 1; } else { do_warn(_("would convert back to version 1,\n" "\tthis might destroy %d links\n"), - be32_to_cpu(dinoc->di_nlink) - + be32_to_cpu(dino->di_nlink) - XFS_MAXLINK_1); } } @@ -2337,9 +2330,9 @@ process_check_inode_nlink_version( do_warn(_("found version 2 inode %llu, "), lino); if (!no_modify) { do_warn(_("converting back to version 1\n")); - dinoc->di_version = XFS_DINODE_VERSION_1; - dinoc->di_onlink = cpu_to_be16( - be32_to_cpu(dinoc->di_nlink)); + dino->di_version = 1; + dino->di_onlink = cpu_to_be16( + be32_to_cpu(dino->di_nlink)); dirty = 1; } else { do_warn(_("would convert back to version 1\n")); @@ -2352,18 +2345,18 @@ process_check_inode_nlink_version( * to stay a version 2 inode. it should have a zero * onlink field, so clear it. */ - if (dinoc->di_version > XFS_DINODE_VERSION_1 && - dinoc->di_onlink != 0 && fs_inode_nlink > 0) { + if (dino->di_version > 1 && + dino->di_onlink != 0 && fs_inode_nlink > 0) { if (!no_modify) { do_warn(_("clearing obsolete nlink field in " "version 2 inode %llu, was %d, now 0\n"), - lino, be16_to_cpu(dinoc->di_onlink)); - dinoc->di_onlink = 0; + lino, be16_to_cpu(dino->di_onlink)); + dino->di_onlink = 0; dirty = 1; } else { do_warn(_("would clear obsolete nlink field in " "version 2 inode %llu, currently %d\n"), - lino, be16_to_cpu(dinoc->di_onlink)); + lino, be16_to_cpu(dino->di_onlink)); } } return dirty; @@ -2398,7 +2391,6 @@ process_dinode_int(xfs_mount_t *mp, { xfs_drfsbno_t totblocks = 0; xfs_drfsbno_t atotblocks = 0; - xfs_dinode_core_t *dinoc; int di_mode; int type; int retval = 0; @@ -2413,9 +2405,8 @@ process_dinode_int(xfs_mount_t *mp, *used = is_used; type = XR_INO_UNKNOWN; - dinoc = &dino->di_core; lino = XFS_AGINO_TO_INO(mp, agno, ino); - di_mode = be16_to_cpu(dinoc->di_mode); + di_mode = be16_to_cpu(dino->di_mode); /* * if in verify mode, don't modify the inode. @@ -2431,35 +2422,33 @@ process_dinode_int(xfs_mount_t *mp, */ ASSERT(uncertain == 0 || verify_mode != 0); - if (be16_to_cpu(dinoc->di_magic) != XFS_DINODE_MAGIC) { + if (be16_to_cpu(dino->di_magic) != XFS_DINODE_MAGIC) { retval = 1; if (!uncertain) do_warn(_("bad magic number 0x%x on inode %llu%c"), - be16_to_cpu(dinoc->di_magic), lino, + be16_to_cpu(dino->di_magic), lino, verify_mode ? '\n' : ','); if (!verify_mode) { if (!no_modify) { do_warn(_(" resetting magic number\n")); - dinoc->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); + dino->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); *dirty = 1; } else do_warn(_(" would reset magic number\n")); } } - if (!XFS_DINODE_GOOD_VERSION(dinoc->di_version) || - (!fs_inode_nlink && dinoc->di_version > XFS_DINODE_VERSION_1)) { + if (!XFS_DINODE_GOOD_VERSION(dino->di_version) || + (!fs_inode_nlink && dino->di_version > 1)) { retval = 1; if (!uncertain) do_warn(_("bad version number 0x%x on inode %llu%c"), - (__s8)dinoc->di_version, lino, + (__s8)dino->di_version, lino, verify_mode ? '\n' : ','); if (!verify_mode) { if (!no_modify) { do_warn(_(" resetting version number\n")); - dinoc->di_version = (fs_inode_nlink) ? - XFS_DINODE_VERSION_2 : - XFS_DINODE_VERSION_1; + dino->di_version = (fs_inode_nlink) ? 2 : 1; *dirty = 1; } else do_warn(_(" would reset version number\n")); @@ -2469,10 +2458,10 @@ process_dinode_int(xfs_mount_t *mp, /* * blow out of here if the inode size is < 0 */ - if ((xfs_fsize_t)be64_to_cpu(dinoc->di_size) < 0) { + if ((xfs_fsize_t)be64_to_cpu(dino->di_size) < 0) { if (!uncertain) do_warn(_("bad (negative) size %lld on inode %llu\n"), - be64_to_cpu(dinoc->di_size), lino); + be64_to_cpu(dino->di_size), lino); if (verify_mode) return 1; goto clear_bad_out; @@ -2522,7 +2511,7 @@ process_dinode_int(xfs_mount_t *mp, * free inodes since technically any format is legal * as we reset the inode when we re-use it. */ - if (di_mode != 0 && check_dinode_mode_format(dinoc) != 0) { + if (di_mode != 0 && check_dinode_mode_format(dino) != 0) { if (!uncertain) do_warn(_("bad inode format in inode %llu\n"), lino); if (verify_mode) @@ -2552,7 +2541,7 @@ process_dinode_int(xfs_mount_t *mp, *isa_dir = 1; break; case S_IFREG: - if (be16_to_cpu(dinoc->di_flags) & XFS_DIFLAG_REALTIME) + if (be16_to_cpu(dino->di_flags) & XFS_DIFLAG_REALTIME) type = XR_INO_RTDATA; else if (lino == mp->m_sb.sb_rbmino) type = XR_INO_RTBITMAP; @@ -2585,27 +2574,27 @@ process_dinode_int(xfs_mount_t *mp, /* * type checks for superblock inodes */ - if (process_check_sb_inodes(mp, dinoc, lino, &type, dirty) != 0) + if (process_check_sb_inodes(mp, dino, lino, &type, dirty) != 0) goto clear_bad_out; /* * only regular files with REALTIME or EXTSIZE flags set can have * extsize set, or directories with EXTSZINHERIT. */ - if (be32_to_cpu(dinoc->di_extsize) != 0) { + if (be32_to_cpu(dino->di_extsize) != 0) { if ((type == XR_INO_RTDATA) || - (type == XR_INO_DIR && (be16_to_cpu(dinoc->di_flags) & + (type == XR_INO_DIR && (be16_to_cpu(dino->di_flags) & XFS_DIFLAG_EXTSZINHERIT)) || - (type == XR_INO_DATA && (be16_to_cpu(dinoc->di_flags) & + (type == XR_INO_DATA && (be16_to_cpu(dino->di_flags) & XFS_DIFLAG_EXTSIZE))) { /* s'okay */ ; } else { do_warn(_("bad non-zero extent size %u for " "non-realtime/extsize inode %llu, "), - be32_to_cpu(dinoc->di_extsize), lino); + be32_to_cpu(dino->di_extsize), lino); if (!no_modify) { do_warn(_("resetting to zero\n")); - dinoc->di_extsize = 0; + dino->di_extsize = 0; *dirty = 1; } else do_warn(_("would reset to zero\n")); @@ -2621,7 +2610,7 @@ process_dinode_int(xfs_mount_t *mp, /* * check for illegal values of forkoff */ - if (process_check_inode_forkoff(mp, dinoc, lino) != 0) + if (process_check_inode_forkoff(mp, dino, lino) != 0) goto clear_bad_out; /* @@ -2649,7 +2638,7 @@ process_dinode_int(xfs_mount_t *mp, /* * correct space counters if required */ - if (process_inode_blocks_and_extents(dinoc, totblocks + atotblocks, + if (process_inode_blocks_and_extents(dino, totblocks + atotblocks, nextents, anextents, lino, dirty) != 0) goto clear_bad_out; @@ -2687,7 +2676,7 @@ process_dinode_int(xfs_mount_t *mp, * just leave nlinks alone. even if it's set wrong, * it'll be reset when read in. */ - *dirty += process_check_inode_nlink_version(dinoc, lino); + *dirty += process_check_inode_nlink_version(dino, lino); return retval; diff --git a/repair/dir.c b/repair/dir.c index 6e0d54b..3c44132 100644 --- a/repair/dir.c +++ b/repair/dir.c @@ -107,7 +107,7 @@ process_shortform_dir( sf = (xfs_dir_shortform_t *)XFS_DFORK_DPTR(dip); max_size = XFS_DFORK_DSIZE(dip, mp); num_entries = sf->hdr.count; - ino_dir_size = be64_to_cpu(dip->di_core.di_size); + ino_dir_size = be64_to_cpu(dip->di_size); *repair = 0; ASSERT(ino_dir_size <= max_size); @@ -338,7 +338,7 @@ process_shortform_dir( if (!no_modify) { tmp_elen = xfs_dir_sf_entsize_byentry(sf_entry); - be64_add_cpu(&dip->di_core.di_size, -tmp_elen); + be64_add_cpu(&dip->di_size, -tmp_elen); ino_dir_size -= tmp_elen; tmp_sfe = (xfs_dir_sf_entry_t *) @@ -425,7 +425,7 @@ process_shortform_dir( ino, (__int64_t) ino_dir_size, (__int64_t)((__psint_t) next_sfe - (__psint_t) sf)); - dip->di_core.di_size = cpu_to_be64((__psint_t)next_sfe + dip->di_size = cpu_to_be64((__psint_t)next_sfe - (__psint_t)sf); *dino_dirty = 1; *repair = 1; @@ -954,7 +954,7 @@ get_first_dblock_fsbno(xfs_mount_t *mp, return(fsbno); } - if (be64_to_cpu(dino->di_core.di_size) <= XFS_LBSIZE(mp)) + if (be64_to_cpu(dino->di_size) <= XFS_LBSIZE(mp)) return(fsbno); do { @@ -2551,7 +2551,7 @@ process_node_dir( /* * sanity check inode size */ - if (be64_to_cpu(dip->di_core.di_size) < + if (be64_to_cpu(dip->di_size) < (da_cursor.greatest_bno + 1) * mp->m_sb.sb_blocksize) { if ((xfs_fsize_t) da_cursor.greatest_bno * mp->m_sb.sb_blocksize > UINT_MAX) { @@ -2565,9 +2565,9 @@ process_node_dir( _("setting directory inode (%llu) size to %llu bytes, was %lld bytes\n"), ino, (xfs_dfiloff_t) (da_cursor.greatest_bno + 1) * mp->m_sb.sb_blocksize, - be64_to_cpu(dip->di_core.di_size)); + be64_to_cpu(dip->di_size)); - dip->di_core.di_size = cpu_to_be64((da_cursor.greatest_bno + 1) + dip->di_size = cpu_to_be64((da_cursor.greatest_bno + 1) * mp->m_sb.sb_blocksize); } return(0); @@ -2709,13 +2709,13 @@ process_dir( * is only called ONCE so all the subordinate routines will * fix '.' and junk '..' if they're bogus. */ - if (be64_to_cpu(dip->di_core.di_size) <= XFS_DFORK_DSIZE(dip, mp)) { + if (be64_to_cpu(dip->di_size) <= XFS_DFORK_DSIZE(dip, mp)) { dot = 1; dotdot = 1; if (process_shortform_dir(mp, ino, dip, ino_discovery, dino_dirty, parent, dirname, &repair)) res = 1; - } else if (be64_to_cpu(dip->di_core.di_size) <= XFS_LBSIZE(mp)) { + } else if (be64_to_cpu(dip->di_size) <= XFS_LBSIZE(mp)) { if (process_leaf_dir(mp, ino, dip, ino_discovery, dino_dirty, blkmap, &dot, &dotdot, parent, dirname, &repair)) diff --git a/repair/dir2.c b/repair/dir2.c index d0739fd..780f5cd 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -810,7 +810,7 @@ process_sf_dir2_fixoff( xfs_dir2_sf_entry_t *sfep; xfs_dir2_sf_t *sfp; - sfp = &dip->di_u.di_dir2sf; + sfp = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); sfep = xfs_dir2_sf_firstentry(sfp); offset = XFS_DIR2_DATA_FIRST_OFFSET; @@ -862,10 +862,10 @@ process_sf_dir2( xfs_dir2_sf_entry_t *tmp_sfep; xfs_ino_t zero = 0; - sfp = &dip->di_u.di_dir2sf; + sfp = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); max_size = XFS_DFORK_DSIZE(dip, mp); num_entries = sfp->hdr.count; - ino_dir_size = be64_to_cpu(dip->di_core.di_size); + ino_dir_size = be64_to_cpu(dip->di_size); offset = XFS_DIR2_DATA_FIRST_OFFSET; bad_offset = *repair = 0; @@ -1101,7 +1101,7 @@ process_sf_dir2( if (!no_modify) { tmp_elen = xfs_dir2_sf_entsize_byentry(sfp, sfep); - be64_add_cpu(&dip->di_core.di_size, -tmp_elen); + be64_add_cpu(&dip->di_size, -tmp_elen); ino_dir_size -= tmp_elen; tmp_sfep = (xfs_dir2_sf_entry_t *) @@ -1209,7 +1209,7 @@ process_sf_dir2( (__int64_t)((__psint_t)next_sfep - (__psint_t)sfp)); - dip->di_core.di_size = cpu_to_be64( + dip->di_size = cpu_to_be64( (__psint_t)next_sfep - (__psint_t)sfp); *dino_dirty = 1; *repair = 1; @@ -2073,20 +2073,20 @@ process_dir2( */ if (blkmap) last = blkmap_last_off(blkmap); - if (be64_to_cpu(dip->di_core.di_size) <= XFS_DFORK_DSIZE(dip, mp) && - dip->di_core.di_format == XFS_DINODE_FMT_LOCAL) { + if (be64_to_cpu(dip->di_size) <= XFS_DFORK_DSIZE(dip, mp) && + dip->di_format == XFS_DINODE_FMT_LOCAL) { dot = dotdot = 1; res = process_sf_dir2(mp, ino, dip, ino_discovery, dino_dirty, dirname, parent, &repair); } else if (last == mp->m_dirblkfsbs && - (dip->di_core.di_format == XFS_DINODE_FMT_EXTENTS || - dip->di_core.di_format == XFS_DINODE_FMT_BTREE)) { + (dip->di_format == XFS_DINODE_FMT_EXTENTS || + dip->di_format == XFS_DINODE_FMT_BTREE)) { res = process_block_dir2(mp, ino, dip, ino_discovery, dino_dirty, dirname, parent, blkmap, &dot, &dotdot, &repair); } else if (last >= mp->m_dirleafblk + mp->m_dirblkfsbs && - (dip->di_core.di_format == XFS_DINODE_FMT_EXTENTS || - dip->di_core.di_format == XFS_DINODE_FMT_BTREE)) { + (dip->di_format == XFS_DINODE_FMT_EXTENTS || + dip->di_format == XFS_DINODE_FMT_BTREE)) { res = process_leaf_node_dir2(mp, ino, dip, ino_discovery, dirname, parent, blkmap, &dot, &dotdot, &repair, last > mp->m_dirleafblk + mp->m_dirblkfsbs); diff --git a/repair/incore.h b/repair/incore.h index 99853fb..3d7e736 100644 --- a/repair/incore.h +++ b/repair/incore.h @@ -441,6 +441,9 @@ void clear_uncertain_ino_cache(xfs_agnumber_t agno); XFS_INOCF_SET_CF((ino_rec), (ino_offset)), \ XFS_INOBT_CLR_FREE((ino_rec), (ino_offset)) +#define XFS_INOBT_IS_FREE(ino_rec, ino_offset) \ + (((ino_rec)->ir_free & XFS_INOBT_MASK(ino_offset)) != 0) + #define is_inode_used(ino_rec, ino_offset) \ !XFS_INOBT_IS_FREE((ino_rec), (ino_offset)) diff --git a/repair/phase6.c b/repair/phase6.c index d056063..f7ae25e 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -35,7 +35,7 @@ static struct cred zerocr; static struct fsxattr zerofsx; static xfs_ino_t orphanage_ino; -static struct xfs_name xfs_name_dot = {".", 1}; +static struct xfs_name xfs_name_dot = {(unsigned char *)".", 1}; /* * Data structures used to keep track of directories where the ".." @@ -133,7 +133,7 @@ dir_hash_add( __uint32_t addr, xfs_ino_t inum, int namelen, - char *name) + unsigned char *name) { xfs_dahash_t hash = 0; int byaddr; @@ -346,7 +346,7 @@ dir_hash_see_all( static void dir_hash_dup_names(dir_hash_tab_t *hashtab) { - char *name; + unsigned char *name; dir_hash_ent_t *p; if (hashtab->names_duped) @@ -444,11 +444,11 @@ mk_rbmino(xfs_mount_t *mp) error); } - memset(&ip->i_d, 0, sizeof(xfs_dinode_core_t)); + memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); ip->i_d.di_magic = XFS_DINODE_MAGIC; ip->i_d.di_mode = S_IFREG; - ip->i_d.di_version = XFS_DINODE_VERSION_1; + ip->i_d.di_version = 1; ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS; ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; @@ -481,13 +481,13 @@ mk_rbmino(xfs_mount_t *mp) libxfs_trans_ijoin(tp, ip, 0); bno = 0; - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); while (bno < mp->m_sb.sb_rbmblocks) { nmap = XFS_BMAP_MAX_NMAP; error = libxfs_bmapi(tp, ip, bno, (xfs_extlen_t)(mp->m_sb.sb_rbmblocks - bno), XFS_BMAPI_WRITE, &first, mp->m_sb.sb_rbmblocks, - map, &nmap, &flist, NULL); + map, &nmap, &flist); if (error) { do_error( _("couldn't allocate realtime bitmap, error = %d\n"), @@ -543,7 +543,7 @@ fill_rbmino(xfs_mount_t *mp) */ nmap = 1; error = libxfs_bmapi(tp, ip, bno, 1, XFS_BMAPI_WRITE, - &first, 1, &map, &nmap, NULL, NULL); + &first, 1, &map, &nmap, NULL); if (error || nmap != 1) { do_error( _("couldn't map realtime bitmap block %llu, error = %d\n"), @@ -612,7 +612,7 @@ fill_rsumino(xfs_mount_t *mp) */ nmap = 1; error = libxfs_bmapi(tp, ip, bno, 1, XFS_BMAPI_WRITE, - &first, 1, &map, &nmap, NULL, NULL); + &first, 1, &map, &nmap, NULL); if (error || nmap != 1) { do_error( _("couldn't map realtime summary inode block %llu, error = %d\n"), @@ -677,11 +677,11 @@ mk_rsumino(xfs_mount_t *mp) error); } - memset(&ip->i_d, 0, sizeof(xfs_dinode_core_t)); + memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); ip->i_d.di_magic = XFS_DINODE_MAGIC; ip->i_d.di_mode = S_IFREG; - ip->i_d.di_version = XFS_DINODE_VERSION_1; + ip->i_d.di_version = 1; ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS; ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; @@ -708,7 +708,7 @@ mk_rsumino(xfs_mount_t *mp) * from mkfs) */ tp = libxfs_trans_alloc(mp, 0); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); nsumblocks = mp->m_rsumsize >> mp->m_sb.sb_blocklog; if ((error = libxfs_trans_reserve(tp, @@ -720,13 +720,13 @@ mk_rsumino(xfs_mount_t *mp) libxfs_trans_ijoin(tp, ip, 0); bno = 0; - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); while (bno < nsumblocks) { nmap = XFS_BMAP_MAX_NMAP; error = libxfs_bmapi(tp, ip, bno, (xfs_extlen_t)(nsumblocks - bno), XFS_BMAPI_WRITE, &first, nsumblocks, - map, &nmap, &flist, NULL); + map, &nmap, &flist); if (error) { do_error( _("couldn't allocate realtime summary inode, error = %d\n"), @@ -778,11 +778,11 @@ mk_root_dir(xfs_mount_t *mp) /* * take care of the core -- initialization from xfs_ialloc() */ - memset(&ip->i_d, 0, sizeof(xfs_dinode_core_t)); + memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); ip->i_d.di_magic = XFS_DINODE_MAGIC; ip->i_d.di_mode = (__uint16_t) mode|S_IFDIR; - ip->i_d.di_version = XFS_DINODE_VERSION_1; + ip->i_d.di_version = 1; ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS; ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; @@ -843,7 +843,7 @@ mk_orphanage(xfs_mount_t *mp) do_error(_("%d - couldn't iget root inode to obtain %s\n"), i, ORPHANAGE); - xname.name = ORPHANAGE; + xname.name = (unsigned char *)ORPHANAGE; xname.len = strlen(ORPHANAGE); if (libxfs_dir_lookup(NULL, pip, &xname, &ino, NULL) == 0) return ino; @@ -853,7 +853,7 @@ mk_orphanage(xfs_mount_t *mp) */ tp = libxfs_trans_alloc(mp, 0); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); nres = XFS_MKDIR_SPACE_RES(mp, xname.len); if ((i = libxfs_trans_reserve(tp, nres, XFS_MKDIR_LOG_RES(mp), 0, @@ -935,7 +935,7 @@ mv_orphanage( xfs_bmap_free_t flist; int err; int committed; - char fname[MAXPATHLEN + 1]; + unsigned char fname[MAXPATHLEN + 1]; int nres; int incr; ino_tree_node_t *irec; @@ -945,7 +945,7 @@ mv_orphanage( ASSERT(xfs_sb_version_hasdirv2(&mp->m_sb)); xname.name = fname; - xname.len = snprintf(fname, sizeof(fname), "%llu", + xname.len = snprintf((char *)fname, sizeof(fname), "%llu", (unsigned long long)ino); err = libxfs_iget(mp, NULL, orphanage_ino, 0, &orphanage_ip, 0); @@ -957,7 +957,7 @@ mv_orphanage( incr = 0; while (libxfs_dir_lookup(NULL, orphanage_ip, &xname, &entry_ino_num, NULL) == 0) - xname.len = snprintf(fname, sizeof(fname), "%llu.%d", + xname.len = snprintf((char *)fname, sizeof(fname), "%llu.%d", (unsigned long long)ino, ++incr); tp = libxfs_trans_alloc(mp, 0); @@ -989,7 +989,7 @@ mv_orphanage( libxfs_trans_ijoin(tp, orphanage_ip, 0); libxfs_trans_ijoin(tp, ino_p, 0); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); err = libxfs_dir_createname(tp, orphanage_ip, &xname, ino, &first, &flist, nres); if (err) @@ -1033,7 +1033,7 @@ mv_orphanage( libxfs_trans_ijoin(tp, orphanage_ip, 0); libxfs_trans_ijoin(tp, ino_p, 0); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); err = libxfs_dir_createname(tp, orphanage_ip, &xname, ino, &first, &flist, nres); @@ -1090,7 +1090,7 @@ mv_orphanage( libxfs_trans_ijoin(tp, orphanage_ip, 0); libxfs_trans_ijoin(tp, ino_p, 0); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); err = libxfs_dir_createname(tp, orphanage_ip, &xname, ino, &first, &flist, nres); if (err) @@ -1151,7 +1151,7 @@ map_first_dblock_fsbno(xfs_mount_t *mp, nmap = 1; error = libxfs_bmapi(NULL, ip, (xfs_fileoff_t) da_bno, 1, XFS_BMAPI_METADATA, &fblock, 0, - &map, &nmap, NULL, NULL); + &map, &nmap, NULL); if (error || nmap != 1) { if (!no_modify) do_error( @@ -1221,7 +1221,7 @@ _("bad dir/attr magic number in inode %llu, file bno = %u, fsbno = %llu\n"), nmap = 1; error = libxfs_bmapi(NULL, ip, (xfs_fileoff_t) da_bno, 1, XFS_BMAPI_METADATA, &fblock, 0, - &map, &nmap, NULL, NULL); + &map, &nmap, NULL); if (error || nmap != 1) { if (!no_modify) do_error( @@ -1438,7 +1438,7 @@ lf_block_dir_entry_check(xfs_mount_t *mp, */ if (!dir_hash_add(mp, hashtab, (da_bno << mp->m_sb.sb_blocklog) + be16_to_cpu(entry->nameidx), lino, - entry->namelen, (char *)namest->name)) { + entry->namelen, namest->name)) { nbad++; if (entry_junked(_("entry \"%s\" (ino %llu) in dir " "%llu is a duplicate name"), @@ -1606,7 +1606,7 @@ _("bad magic # (0x%x) for dir ino %llu leaf block (bno %u fsbno %llu)\n"), nmap = 1; error = libxfs_bmapi(NULL, ip, (xfs_fileoff_t)da_bno, 1, XFS_BMAPI_METADATA, &fblock, 0, - &map, &nmap, NULL, NULL); + &map, &nmap, NULL); if (error || nmap != 1) { if (!no_modify) do_error( @@ -1678,7 +1678,7 @@ longform_dir2_rebuild( if (pip.i_ino == NULLFSINO) pip.i_ino = mp->m_sb.sb_rootino; - XFS_BMAP_INIT(&flist, &firstblock); + xfs_bmap_init(&flist, &firstblock); tp = libxfs_trans_alloc(mp, 0); nres = XFS_REMOVE_SPACE_RES(mp); @@ -1696,7 +1696,7 @@ longform_dir2_rebuild( /* free all data, leaf, node and freespace blocks */ error = libxfs_bunmapi(tp, ip, 0, lastblock, XFS_BMAPI_METADATA, 0, - &firstblock, &flist, NULL, &done); + &firstblock, &flist, &done); if (error) { do_warn(_("xfs_bunmapi failed -- error - %d\n"), error); libxfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | @@ -1735,7 +1735,7 @@ longform_dir2_rebuild( libxfs_trans_ijoin(tp, ip, 0); libxfs_trans_ihold(tp, ip); - XFS_BMAP_INIT(&flist, &firstblock); + xfs_bmap_init(&flist, &firstblock); error = libxfs_dir_createname(tp, ip, &p->name, p->inum, &firstblock, &flist, nres); if (error) { @@ -1793,7 +1793,7 @@ dir2_kill_block( libxfs_trans_ihold(tp, ip); libxfs_da_bjoin(tp, bp); memset(&args, 0, sizeof(args)); - XFS_BMAP_INIT(&flist, &firstblock); + xfs_bmap_init(&flist, &firstblock); args.dp = ip; args.trans = tp; args.firstblock = &firstblock; @@ -1974,7 +1974,7 @@ longform_dir2_entry_check_data( libxfs_trans_ihold(tp, ip); libxfs_da_bjoin(tp, bp); libxfs_da_bhold(tp, bp); - XFS_BMAP_INIT(&flist, &firstblock); + xfs_bmap_init(&flist, &firstblock); if (be32_to_cpu(d->hdr.magic) != wantmagic) { do_warn(_("bad directory block magic # %#x for directory inode " "%llu block %d: "), @@ -2102,7 +2102,7 @@ longform_dir2_entry_check_data( * check for duplicate names in directory. */ if (!dir_hash_add(mp, hashtab, addr, inum, dep->namelen, - (char *)dep->name)) { + dep->name)) { nbad++; if (entry_junked(_("entry \"%s\" (ino %llu) in dir " "%llu is a duplicate name"), @@ -2724,7 +2724,7 @@ shortform_dir_entry_check(xfs_mount_t *mp, */ if (!dir_hash_add(mp, hashtab, (xfs_dir2_dataptr_t) (sf_entry - &sf->list[0]), lino, - sf_entry->namelen, (char *)sf_entry->name)) { + sf_entry->namelen, sf_entry->name)) { do_warn(_("entry \"%s\" (ino %llu) in dir %llu is a " "duplicate name"), fname, lino, ino); goto do_junkit; @@ -3051,7 +3051,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, */ if (!dir_hash_add(mp, hashtab, (xfs_dir2_dataptr_t) (sfep - xfs_dir2_sf_firstentry(sfp)), - lino, sfep->namelen, (char *)sfep->name)) { + lino, sfep->namelen, sfep->name)) { do_warn(_("entry \"%s\" (ino %llu) in dir %llu is a " "duplicate name"), fname, lino, ino); goto do_junkit; @@ -3397,7 +3397,7 @@ process_dir_inode( libxfs_trans_ijoin(tp, ip, 0); libxfs_trans_ihold(tp, ip); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); error = libxfs_dir_createname(tp, ip, &xfs_name_dotdot, ip->i_ino, &first, &flist, nres); @@ -3462,7 +3462,7 @@ process_dir_inode( libxfs_trans_ijoin(tp, ip, 0); libxfs_trans_ihold(tp, ip); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); error = libxfs_dir_createname(tp, ip, &xfs_name_dot, ip->i_ino, &first, &flist, nres); diff --git a/repair/prefetch.c b/repair/prefetch.c index a70082f..d2fdf90 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -316,7 +316,7 @@ pf_read_exinode( xfs_dinode_t *dino) { pf_read_bmbt_reclist(args, (xfs_bmbt_rec_t *)XFS_DFORK_DPTR(dino), - be32_to_cpu(dino->di_core.di_nextents)); + be32_to_cpu(dino->di_nextents)); } static void @@ -328,23 +328,21 @@ pf_read_inode_dirs( int icnt = 0; int hasdir = 0; int isadir; - xfs_dinode_core_t *dinoc; for (icnt = 0; icnt < (XFS_BUF_COUNT(bp) >> mp->m_sb.sb_inodelog); icnt++) { - dino = XFS_MAKE_IPTR(mp, bp, icnt); - dinoc = &dino->di_core; + dino = xfs_make_iptr(mp, bp, icnt); /* * We are only prefetching directory contents in extents * and btree nodes for other inodes */ - isadir = (be16_to_cpu(dinoc->di_mode) & S_IFMT) == S_IFDIR; + isadir = (be16_to_cpu(dino->di_mode) & S_IFMT) == S_IFDIR; hasdir |= isadir; - if (dinoc->di_format <= XFS_DINODE_FMT_LOCAL) + if (dino->di_format <= XFS_DINODE_FMT_LOCAL) continue; - if (!isadir && (dinoc->di_format == XFS_DINODE_FMT_EXTENTS || + if (!isadir && (dino->di_format == XFS_DINODE_FMT_EXTENTS || args->dirs_only)) continue; @@ -353,25 +351,24 @@ pf_read_inode_dirs( * its directory data. It's a cut down version of * process_dinode_int() in dinode.c. */ - if (dinoc->di_format > XFS_DINODE_FMT_BTREE) + if (dino->di_format > XFS_DINODE_FMT_BTREE) continue; - if (be16_to_cpu(dinoc->di_magic) != XFS_DINODE_MAGIC) + if (be16_to_cpu(dino->di_magic) != XFS_DINODE_MAGIC) continue; - if (!XFS_DINODE_GOOD_VERSION(dinoc->di_version) || - (!fs_inode_nlink && dinoc->di_version > - XFS_DINODE_VERSION_1)) + if (!XFS_DINODE_GOOD_VERSION(dino->di_version) || + (!fs_inode_nlink && dino->di_version > 1)) continue; - if (be64_to_cpu(dinoc->di_size) <= XFS_DFORK_DSIZE(dino, mp)) + if (be64_to_cpu(dino->di_size) <= XFS_DFORK_DSIZE(dino, mp)) continue; - if ((dinoc->di_forkoff != 0) && - (dinoc->di_forkoff >= (XFS_LITINO(mp) >> 3))) + if ((dino->di_forkoff != 0) && + (dino->di_forkoff >= (XFS_LITINO(mp) >> 3))) continue; - switch (dinoc->di_format) { + switch (dino->di_format) { case XFS_DINODE_FMT_EXTENTS: pf_read_exinode(args, dino); break; diff --git a/repair/rt.c b/repair/rt.c index 7645128..d6ecd56 100644 --- a/repair/rt.c +++ b/repair/rt.c @@ -193,7 +193,7 @@ process_rtbitmap(xfs_mount_t *mp, extno = 0; error = 0; - end_bmbno = howmany(be64_to_cpu(dino->di_core.di_size), + end_bmbno = howmany(be64_to_cpu(dino->di_size), mp->m_sb.sb_blocksize); for (bmbno = 0; bmbno < end_bmbno; bmbno++) { -- 1.7.2.3 From SRS0+D2ZB+40+fromorbit.com=david@internode.on.net Thu Jan 6 01:15:58 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p067Fw8f030925 for ; Thu, 6 Jan 2011 01:15:58 -0600 X-ASG-Debug-ID: 1294298284-76ba01b70000-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 6304E4F4963 for ; Wed, 5 Jan 2011 23:18: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 VcrJRgeFoarXtEGC for ; Wed, 05 Jan 2011 23:18:04 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 6689646-1927428 for ; Thu, 06 Jan 2011 17:48:03 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pak6j-00052W-MU for xfs@oss.sgi.com; Thu, 06 Jan 2011 18:18:01 +1100 Date: Thu, 6 Jan 2011 18:18:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: libxfs: sync files with 2.6.38 kernel code Subject: libxfs: sync files with 2.6.38 kernel code Message-ID: <20110106071801.GG8322@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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: 1294298286 X-Barracuda-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.51568 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, Seeing as the current patch is over the list limits (it's 670k), I pushed the current xfsprogs branch I'm working on to git.kernel.org. Some things to note: Note: this does not convert xfsprogs to the kernel xfs_trans_ijoin\ijoin_ref interface, it maintains the older ijoin/ihold interface because of the different way the inode reference counting works in libxfs. More work will be needed to change it over to a manner compatible with the current kernel API. Note: log sector size handling needs to be sorted out. Specifically, initialising l_sectbb_log/l_sectBBsize correctly and removing the hacks in xlog_bread and friends (libxlog/xfs_log_recover.c) to work around the fact they are not initialised correctly. (FWIW, I don't think xfsprogs handles large log sector size correctly as a result, and especially not if the log device sector size is different to the data device sector size). Note: the patch re-introduces the radix-tree code that xfs_repair previously used as part of libxfs. This can probably be separated out into a preparatory patch. Note: all the new trace points are being aggregated at include/xfs_trace.h and defined to ((void) 0). If we want to do something with them for userspace, then we can do something different here as required. Testing: Currently passes xfstests on x86_64 w/ 4k block sizes. On 512 byte block/2k directory block filesystems repair is giving this additional output on test 033: +cache_purge: shake on cache 0x67a060 left 1 nodes!? The same test run saw test 104 generating: +_check_xfs_filesystem: filesystem on /dev/vdb is inconsistent (c) (see 104.full) which appears to be due to this output: *** xfs_check output *** XFS: Invalid block length (0x2000) given for buffer Which may be a result of the above xlog_bread issues. I haven't confirmed whether this is a regression or not yet. The tree/branch can be found here: The following changes since commit adfdbed6a014a412529864a66b09117e6a4bee64: Update xfsprogs Debian maintainer annotation, bump version. (2010-11-11 21:11:44 +1100) are available in the git repository at: git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev kernel-2.6.38-sync Dave Chinner (3): repair: warn if running in low memory mode xfs_repair: multithread phase 2 libxfs: sync files with 2.6.38 kernel code db/attr.c | 16 +- db/attrset.c | 5 +- db/bmap.c | 18 +- db/bmap.h | 4 +- db/check.c | 50 +- db/convert.c | 6 +- db/dir2sf.c | 6 +- db/field.c | 2 +- db/frag.c | 6 +- db/inode.c | 124 ++-- db/metadump.c | 20 +- include/Makefile | 5 +- include/atomic.h | 31 + include/libxfs.h | 44 +- include/libxlog.h | 16 +- include/list.h | 11 + include/radix-tree.h | 76 ++ include/xfs_ag.h | 100 ++- include/xfs_alloc.h | 58 +- include/xfs_arch.h | 32 - include/xfs_attr_leaf.h | 12 - include/xfs_attr_sf.h | 42 +- include/xfs_bit.h | 10 +- include/xfs_bmap.h | 133 ++-- include/xfs_bmap_btree.h | 20 +- include/xfs_btree.h | 31 +- include/xfs_btree_trace.h | 17 - include/xfs_buf_item.h | 51 +- include/xfs_da_btree.h | 21 +- include/xfs_dfrag.h | 5 +- include/xfs_dinode.h | 149 ++--- include/xfs_dir2.h | 4 +- include/xfs_dir2_data.h | 2 +- include/xfs_dir2_node.h | 2 - include/xfs_dir2_sf.h | 7 - include/xfs_extfree_item.h | 17 +- include/xfs_fs.h | 30 +- include/xfs_ialloc.h | 30 +- include/xfs_ialloc_btree.h | 23 +- include/xfs_imap.h | 38 - include/xfs_inode.h | 210 +++--- include/xfs_inode_item.h | 32 +- include/xfs_inum.h | 1 - include/xfs_log.h | 70 +- include/xfs_log_priv.h | 331 +++++++-- include/xfs_log_recover.h | 25 +- include/xfs_mount.h | 259 ++----- include/xfs_quota.h | 160 ++-- include/xfs_rtalloc.h | 19 +- include/xfs_sb.h | 168 +++-- include/xfs_trace.h | 85 +++ include/xfs_trans.h | 648 +++-------------- include/xfs_trans_space.h | 2 +- include/xfs_types.h | 18 +- libxfs/Makefile | 2 +- libxfs/init.c | 133 +++- libxfs/logitem.c | 371 +--------- libxfs/radix-tree.c | 805 ++++++++++++++++++++ libxfs/trans.c | 211 ++---- libxfs/util.c | 75 +- libxfs/xfs.h | 49 +- libxfs/xfs_alloc.c | 599 ++++++++-------- libxfs/xfs_alloc_btree.c | 46 +- libxfs/xfs_attr.c | 138 ++-- libxfs/xfs_attr_leaf.c | 135 ++-- libxfs/xfs_bmap.c | 1773 ++++++++++++++++++++++---------------------- libxfs/xfs_bmap_btree.c | 129 ++-- libxfs/xfs_btree.c | 96 ++- libxfs/xfs_da_btree.c | 48 +- libxfs/xfs_dir2.c | 31 +- libxfs/xfs_dir2_block.c | 28 +- libxfs/xfs_dir2_leaf.c | 21 +- libxfs/xfs_dir2_node.c | 29 +- libxfs/xfs_dir2_sf.c | 24 +- libxfs/xfs_ialloc.c | 1157 +++++++++++++++-------------- libxfs/xfs_ialloc_btree.c | 35 +- libxfs/xfs_inode.c | 277 ++++---- libxfs/xfs_mount.c | 123 +--- libxfs/xfs_trans.c | 492 +++++++++++-- libxlog/xfs_log_recover.c | 606 ++++++++------- logprint/log_misc.c | 2 +- logprint/log_print_all.c | 13 +- logprint/log_print_trans.c | 4 +- mkfs/proto.c | 18 +- mkfs/xfs_mkfs.c | 3 +- repair/attr_repair.c | 14 +- repair/dino_chunks.c | 12 +- repair/dinode.c | 275 ++++---- repair/dir.c | 18 +- repair/dir2.c | 22 +- repair/incore.h | 3 + repair/phase2.c | 16 +- repair/phase6.c | 76 +- repair/prefetch.c | 29 +- repair/rt.c | 2 +- repair/scan.c | 303 +++++---- repair/scan.h | 37 - repair/xfs_repair.c | 10 +- 98 files changed, 6011 insertions(+), 5581 deletions(-) create mode 100644 include/atomic.h create mode 100644 include/radix-tree.h delete mode 100644 include/xfs_imap.h create mode 100644 include/xfs_trace.h create mode 100644 libxfs/radix-tree.c -- Dave Chinner david@fromorbit.com From michael.monnerie@is.it-management.at Thu Jan 6 02:08:31 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0688Vk1036967 for ; Thu, 6 Jan 2011 02:08:31 -0600 X-ASG-Debug-ID: 1294301437-1c9a02ee0000-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 889F41D1162A for ; Thu, 6 Jan 2011 00:10:37 -0800 (PST) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id poyNH1PeJJC7pQKl for ; Thu, 06 Jan 2011 00:10:37 -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 BCA0C602; Thu, 6 Jan 2011 09:10:35 +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 3406B401C2F; Thu, 6 Jan 2011 10:10:35 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support Date: Thu, 6 Jan 2011 09:10:29 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.37-rc6-zmi; KDE/4.4.4; x86_64; ; ) Cc: Dave Chinner , Christoph Hellwig , Lukas Czerner References: <20101125112304.GA4195@infradead.org> <201101052307.38379@zmi.at> <20110105225039.GD8322@dastard> In-Reply-To: <20110105225039.GD8322@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1403829.Rtha2R3Pyy"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201101060910.34534@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1294301438 X-Barracuda-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.51571 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 --nextPart1403829.Rtha2R3Pyy Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Mittwoch, 5. Januar 2011 Dave Chinner wrote: > No state or additional on-disk > structures are needed for xfs_fsr to do it's work.... That's not exactly the same - once you defraged a file, you know it's=20 done, and can skip it next time. But you dont know if the (free) space=20 between block 0 and 20 on disk has been rewritten since the last trim=20 run or not used at all, so you'd have to do it all again. =20 > The background trim is intended to enable even the slowest of > devices to be trimmed over time, while introducing as little runtime > overhead and complexity as possible. Hence adding complexity and > runtime overhead to optimise background trimming tends to defeat the > primary design goal.... It would be interesting to have real world numbers to see what's "best".=20 I'd imagine a normal file or web server to store tons of files that are=20 mostly read-only, while 5% of it a used a lot, as well as lots of temp=20 files. For this, knowing what's been used would be great. Also, I'm thinking of a NetApp storage, that has been setup to run=20 deduplication on Sunday. It's best to run trim on Saturday and it should=20 be finished before Sunday. For big storages that might be not easy to=20 finish, if all disk space has to be freed explicitly. And wouldn't it still be cheaper to keep a "written bmap" than to run=20 over the full space of a (big) disk? I'd say depends on the workload. =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/ --nextPart1403829.Rtha2R3Pyy 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) iEYEABECAAYFAk0lePoACgkQzhSR9xwSCbQebgCcDqcuUK6zY0jqKc79Ruq8NkyP jjcAoNlqZPJ4VrfwPol3WMRj14RSCr0P =Z+Ew -----END PGP SIGNATURE----- --nextPart1403829.Rtha2R3Pyy-- From lczerner@redhat.com Thu Jan 6 02:33:22 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p068XMtb040716 for ; Thu, 6 Jan 2011 02:33:22 -0600 X-ASG-Debug-ID: 1294302931-76b903b10000-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 D36F24F4C5B for ; Thu, 6 Jan 2011 00:35:31 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QcMx5k1D8Y3iyWiD for ; Thu, 06 Jan 2011 00:35:31 -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 p068XxA1006187 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 6 Jan 2011 03:33:59 -0500 Received: from dhcp-lab-213.englab.brq.redhat.com (dhcp-1-233.brq.redhat.com [10.34.1.233]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p068XtP1031092 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 6 Jan 2011 03:33:57 -0500 Date: Thu, 6 Jan 2011 09:33:54 +0100 (CET) From: Lukas Czerner X-X-Sender: lukas@dhcp-lab-213.englab.brq.redhat.com To: Michael Monnerie cc: xfs@oss.sgi.com, Dave Chinner , Christoph Hellwig , Lukas Czerner X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support In-Reply-To: <201101060910.34534@zmi.at> Message-ID: References: <20101125112304.GA4195@infradead.org> <201101052307.38379@zmi.at> <20110105225039.GD8322@dastard> <201101060910.34534@zmi.at> 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: 1294302931 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, 6 Jan 2011, Michael Monnerie wrote: > On Mittwoch, 5. Januar 2011 Dave Chinner wrote: > > No state or additional on-disk > > structures are needed for xfs_fsr to do it's work.... > > That's not exactly the same - once you defraged a file, you know it's > done, and can skip it next time. But you dont know if the (free) space > between block 0 and 20 on disk has been rewritten since the last trim > run or not used at all, so you'd have to do it all again. > > > The background trim is intended to enable even the slowest of > > devices to be trimmed over time, while introducing as little runtime > > overhead and complexity as possible. Hence adding complexity and > > runtime overhead to optimise background trimming tends to defeat the > > primary design goal.... > > It would be interesting to have real world numbers to see what's "best". > I'd imagine a normal file or web server to store tons of files that are > mostly read-only, while 5% of it a used a lot, as well as lots of temp > files. For this, knowing what's been used would be great. > > Also, I'm thinking of a NetApp storage, that has been setup to run > deduplication on Sunday. It's best to run trim on Saturday and it should > be finished before Sunday. For big storages that might be not easy to > finish, if all disk space has to be freed explicitly. > > And wouldn't it still be cheaper to keep a "written bmap" than to run > over the full space of a (big) disk? I'd say depends on the workload. > I have already investigated approach with storing the information about blocks freed since last trim. However I found it not that useful for several reasons. 1. Bitmaps are big, especially on huge filesystems you are talking about it will significantly increase the memory utilization. 2. Rbtree might be better, however there is some threshold we need to watch, because when it gets really fragmented it can be bigger than bitmap. Moreover it adds significant complexity and of course CPU utilization. 3. As I said several times, we do not need to trim when there was not enough writes from the last trim, because when we have enough space for example for wear leveling in SSD, we do not need to reclaim more, OR we can do is really slowly as a precaution measure. All that said, we have much more flexibility in user space and we can think of a lots of different heuristic to determine whether or not to do the trim and how. Thanks! -Lukas From lczerner@redhat.com Thu Jan 6 02:38:49 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p068cnAG040929 for ; Thu, 6 Jan 2011 02:38:49 -0600 X-ASG-Debug-ID: 1294303258-1af903c80000-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 B152DFAD612 for ; Thu, 6 Jan 2011 00:40:58 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CGbjyoPIywSFOzNY for ; Thu, 06 Jan 2011 00:40:58 -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 p068eqgr023382 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 6 Jan 2011 03:40:52 -0500 Received: from dhcp-lab-213.englab.brq.redhat.com (dhcp-1-233.brq.redhat.com [10.34.1.233]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p068emZ7027374 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 6 Jan 2011 03:40:50 -0500 Date: Thu, 6 Jan 2011 09:40:48 +0100 (CET) From: Lukas Czerner X-X-Sender: lukas@dhcp-lab-213.englab.brq.redhat.com To: Lukas Czerner cc: Michael Monnerie , xfs@oss.sgi.com, Dave Chinner , Christoph Hellwig X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support In-Reply-To: Message-ID: References: <20101125112304.GA4195@infradead.org> <201101052307.38379@zmi.at> <20110105225039.GD8322@dastard> <201101060910.34534@zmi.at> 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: 1294303258 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, 6 Jan 2011, Lukas Czerner wrote: > On Thu, 6 Jan 2011, Michael Monnerie wrote: > > > On Mittwoch, 5. Januar 2011 Dave Chinner wrote: > > > No state or additional on-disk > > > structures are needed for xfs_fsr to do it's work.... > > > > That's not exactly the same - once you defraged a file, you know it's > > done, and can skip it next time. But you dont know if the (free) space > > between block 0 and 20 on disk has been rewritten since the last trim > > run or not used at all, so you'd have to do it all again. > > > > > The background trim is intended to enable even the slowest of > > > devices to be trimmed over time, while introducing as little runtime > > > overhead and complexity as possible. Hence adding complexity and > > > runtime overhead to optimise background trimming tends to defeat the > > > primary design goal.... > > > > It would be interesting to have real world numbers to see what's "best". > > I'd imagine a normal file or web server to store tons of files that are > > mostly read-only, while 5% of it a used a lot, as well as lots of temp > > files. For this, knowing what's been used would be great. > > > > Also, I'm thinking of a NetApp storage, that has been setup to run > > deduplication on Sunday. It's best to run trim on Saturday and it should > > be finished before Sunday. For big storages that might be not easy to > > finish, if all disk space has to be freed explicitly. > > > > And wouldn't it still be cheaper to keep a "written bmap" than to run > > over the full space of a (big) disk? I'd say depends on the workload. > > > > I have already investigated approach with storing the information about > blocks freed since last trim. However I found it not that useful for > several reasons. > > 1. Bitmaps are big, especially on huge filesystems you are talking about > it will significantly increase the memory utilization. > > 2. Rbtree might be better, however there is some threshold we need to > watch, because when it gets really fragmented it can be bigger than > bitmap. Moreover it adds significant complexity and of course CPU > utilization. Not talking about the fact that neither bitmaps not rbtrees can survive umount. > > 3. As I said several times, we do not need to trim when there was not > enough writes from the last trim, because when we have enough space for > example for wear leveling in SSD, we do not need to reclaim more, OR we > can do is really slowly as a precaution measure. > > All that said, we have much more flexibility in user space and we can > think of a lots of different heuristic to determine whether or not to do > the trim and how. > > Thanks! > -Lukas > From SRS0+hpLj+40+fromorbit.com=david@internode.on.net Thu Jan 6 03:15:52 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p069Fpbi043527 for ; Thu, 6 Jan 2011 03:15:51 -0600 X-ASG-Debug-ID: 1294305478-600e018c0000-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 09CD7BD914B for ; Thu, 6 Jan 2011 01:17:58 -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 4jwQML9Da8YSiNxm for ; Thu, 06 Jan 2011 01:17:58 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51749919-1927428 for multiple; Thu, 06 Jan 2011 19:47:09 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Palxz-0005Cx-Hx; Thu, 06 Jan 2011 20:17:07 +1100 Date: Thu, 6 Jan 2011 20:17:07 +1100 From: Dave Chinner To: Michael Monnerie Cc: xfs@oss.sgi.com, Christoph Hellwig , Lukas Czerner X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support Message-ID: <20110106091707.GH8322@dastard> References: <20101125112304.GA4195@infradead.org> <201101052307.38379@zmi.at> <20110105225039.GD8322@dastard> <201101060910.34534@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201101060910.34534@zmi.at> 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: 1294305480 X-Barracuda-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.51576 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, Jan 06, 2011 at 09:10:29AM +0100, Michael Monnerie wrote: > On Mittwoch, 5. Januar 2011 Dave Chinner wrote: > > No state or additional on-disk > > structures are needed for xfs_fsr to do it's work.... > > That's not exactly the same - once you defraged a file, you know it's > done, and can skip it next time. Sure, but the way xfs_fsr skips it is by physically checking the inode on the next filesystem pass. It does that efficiently because the necessary information is cheap to read (via bulkstat), not because we track what needs defrag in the filesystem on every operation. > But you dont know if the (free) space > between block 0 and 20 on disk has been rewritten since the last trim > run or not used at all, so you'd have to do it all again. Sure, but the block device should, and therefore a TRIM to an area with nothing to trim should be fast. The current generation drives still have problems with this, but once device implementations are better optimised there should be little penalty for trying to trim a region that currently holds no data on the device. basically we need to design for the future, not for the limitations the current generation of devices have.... > > The background trim is intended to enable even the slowest of > > devices to be trimmed over time, while introducing as little runtime > > overhead and complexity as possible. Hence adding complexity and > > runtime overhead to optimise background trimming tends to defeat the > > primary design goal.... > > It would be interesting to have real world numbers to see what's "best". > I'd imagine a normal file or web server to store tons of files that are > mostly read-only, while 5% of it a used a lot, as well as lots of temp > files. For this, knowing what's been used would be great. A filesystem does not necessarily reuse the same blocks for temporary data. That "5%" of data that is written and erase all the time could end up spanning 50% of the filesystem free space over the period of a week.... > Also, I'm thinking of a NetApp storage, that has been setup to run > deduplication on Sunday. It's best to run trim on Saturday and it should > be finished before Sunday. For big storages that might be not easy to > finish, if all disk space has to be freed explicitly. > > And wouldn't it still be cheaper to keep a "written bmap" than to run > over the full space of a (big) disk? I'd say depends on the workload. So, lets keep a "used free space" tree in the filesystem for this purpose. I'll spell out what it means in terms of runtime overhead for you. Firstly, every extent that is freed now needs to be inserted into the new used free space tree. That means transactions reservations all increase in size by 30%, log traffic increases by 30%, cpu overhead increases by ~30%, buffer cache footprint increases by 30% and we've got 30% more metadata to write to disk. (30% because there are already 2 free space btrees that are updated on every extent free.) Secondly, when we allocate an extent, we now have to check whether the extent is in the used free space btree and remove it from there if it is. That adds another btree lookup and modification to the allocation code, which adds roughly 30% overhead there as well. That's a lot of additional runtime overhead. And then we have to consider the userspace utilities - we need to add code to mkfs, xfs_repair, xfs_db, etc to enable checking and repairing of the new btree, cross checking that every extent in used free space tree is in the free space tree, etc. That's a lot of work on top of just the kernel allocation code changes to keep the new tree up to date. IMO, tracking used free space to optimise background trim is premature optimisation - it might be needed for a year or two, but it will take at least that long to get such an optimisation stable enough to consider for enterprise distros. And at which point, it probably isn't going to be needed anymore. Realistically, we have to design for how we expect devices to behave in 2-3 years time, not waste time trying to optimise for fundamentally broken devices that nobody will be using in 2-3 years time... Cheers, Dave. -- Dave Chinner david@fromorbit.com From karn@philkarn.net Thu Jan 6 07:49:21 2011 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 (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p06DnLGb070284 for ; Thu, 6 Jan 2011 07:49:21 -0600 X-ASG-Debug-ID: 1294321889-125303b70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-fx0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 717694F55C9 for ; Thu, 6 Jan 2011 05:51:29 -0800 (PST) Received: from mail-fx0-f53.google.com (mail-fx0-f53.google.com [209.85.161.53]) by cuda.sgi.com with ESMTP id 5PFV2LEtIfuuBFZH for ; Thu, 06 Jan 2011 05:51:29 -0800 (PST) Received: by fxm11 with SMTP id 11so10684435fxm.26 for ; Thu, 06 Jan 2011 05:51:29 -0800 (PST) Received: by 10.223.95.203 with SMTP id e11mr2397432fan.60.1294321889050; Thu, 06 Jan 2011 05:51:29 -0800 (PST) MIME-Version: 1.0 Received: by 10.223.145.132 with HTTP; Thu, 6 Jan 2011 05:51:08 -0800 (PST) Reply-To: karn@ka9q.net From: Phil Karn Date: Thu, 6 Jan 2011 05:51:08 -0800 Message-ID: X-ASG-Orig-Subj: changing from internal to external log? Subject: changing from internal to external log? To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=00248c11dcc96bff5904992dcc6a X-Barracuda-Connect: mail-fx0-f53.google.com[209.85.161.53] X-Barracuda-Start-Time: 1294321890 X-Barracuda-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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.51595 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 --00248c11dcc96bff5904992dcc6a Content-Type: text/plain; charset=UTF-8 Is there any way to reconfigure an existing XFS file system, originally set up with an internal log, to use an external log device? I have an existing XFS file system on a 4x2 TB RAID-5 array, and I'd really rather not have to take a week to load it all over again. I have since added a SSD to that system and would like to try using a partition on it as an external logfile for the RAID-5 filesystem. I've been playing with various test XFS filesystems and have discovered, as I'm sure many others have before me, that the journal is a big bottleneck when creating or deleting lots of files. I've even tried fallocating a couple of gig from my XFS file system to a loopback device with reiserfs. Extracting and building the Linux kernel tree goes quite a bit faster than using the XFS file system directly, even after playing with all the usual mount options. The only way I've found to make native XFS equally fast seems to be an external journal on a fast device. --00248c11dcc96bff5904992dcc6a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Is there any way to reconfigure an existing XFS file system, originally set= up with an internal log, to use an external log device? I have an existing= XFS file system on a 4x2 TB RAID-5 array, and I'd really rather not ha= ve to take a week to load it all over again.

I have since added a SSD to that system and would like to try using a p= artition on it as an external logfile for the RAID-5 filesystem. I've b= een playing with various test XFS filesystems and have discovered, as I'= ;m sure many others have before me, that the journal is a big bottleneck wh= en creating or deleting lots of files.

I've even tried fallocating a couple of gig from my XFS file system= to a loopback device with reiserfs. Extracting and building the Linux kern= el tree goes quite a bit faster than using the XFS file system directly, ev= en after playing with all the usual mount options. The only way I've fo= und to make native XFS equally fast seems to be an external journal on a fa= st device.



--00248c11dcc96bff5904992dcc6a-- From michael.monnerie@is.it-management.at Thu Jan 6 10:48:40 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p06Gmdp3090222 for ; Thu, 6 Jan 2011 10:48:40 -0600 X-ASG-Debug-ID: 1294332645-159900190000-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 D9949FAE25E for ; Thu, 6 Jan 2011 08:50:46 -0800 (PST) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id lkuleEo39XiF3UIh for ; Thu, 06 Jan 2011 08:50:46 -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 E7917603; Thu, 6 Jan 2011 17:50:44 +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 C8B80401C2F; Thu, 6 Jan 2011 17:50:43 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support Date: Thu, 6 Jan 2011 17:50:42 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.37-rc6-zmi; KDE/4.4.4; x86_64; ; ) Cc: Dave Chinner , Christoph Hellwig , Lukas Czerner References: <20101125112304.GA4195@infradead.org> <201101060910.34534@zmi.at> <20110106091707.GH8322@dastard> In-Reply-To: <20110106091707.GH8322@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1517145.QbsRH8ghIt"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201101061750.43556@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1294332646 X-Barracuda-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.51606 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 --nextPart1517145.QbsRH8ghIt Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Donnerstag, 6. Januar 2011 Dave Chinner wrote: > Realistically, we have > to design for how we expect devices to behave in 2-3 years time, not > waste time trying to optimise for fundamentally broken devices that > nobody will be using in 2-3 years time... I see, thanks for the explanation. I hope that there will be a solution=20 that allows us to FITRIM on Saturday "in the background", so the thin=20 provisioned VMs are smaller and faster to back up. That's my immediate=20 wish, as we currently don't use SSDs. =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/ --nextPart1517145.QbsRH8ghIt 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) iEYEABECAAYFAk0l8uMACgkQzhSR9xwSCbTlgQCguppaHz/R8WuueGf23gBxZQRT CVEAoKQjouvGCMtZm3FZqnZ2671PA1AB =32Ue -----END PGP SIGNATURE----- --nextPart1517145.QbsRH8ghIt-- From BATV+83c2603f8a114793e4e4+2692+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 6 12:01:03 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p06I11Yi097969 for ; Thu, 6 Jan 2011 12:01:03 -0600 X-ASG-Debug-ID: 1294336991-307a02110000-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 820ADFAEBDA; Thu, 6 Jan 2011 10:03:11 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 4EkDvgujFpOiCEnT; Thu, 06 Jan 2011 10:03:11 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PauAz-0000Hg-Qg; Thu, 06 Jan 2011 18:03:05 +0000 Date: Thu, 6 Jan 2011 13:03:05 -0500 From: Christoph Hellwig To: Alex Elder Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: add FITRIM support Subject: Re: [PATCH] xfs: add FITRIM support Message-ID: <20110106180305.GA32670@infradead.org> References: <20110102072202.GA26488@infradead.org> <1294178115.2485.19.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294178115.2485.19.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: 1294336991 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 > > + * Copyright (C) 2010 Red Hat, Inc. > > Maybe 2011 now... Nothing major changes in 2011, so no. > > + * 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) { > > ^ > I think this should be >= Yes. > Do you want to add a boilerplate copyright header here? Kinda hard to claim copyright on a single prototype. From BATV+83c2603f8a114793e4e4+2692+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 6 12:03:57 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p06I3uQx098648 for ; Thu, 6 Jan 2011 12:03:57 -0600 X-ASG-Debug-ID: 1294337166-2d3900dd0000-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 667BA23ADD0 for ; Thu, 6 Jan 2011 10:06:06 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id ZBmQblmHLJw5FwTN for ; Thu, 06 Jan 2011 10:06:06 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PauDr-00014j-Hw; Thu, 06 Jan 2011 18:06:03 +0000 Date: Thu, 6 Jan 2011 13:06:03 -0500 From: Christoph Hellwig To: Michael Monnerie Cc: xfs@oss.sgi.com, Lukas Czerner , Dave Chinner , Christoph Hellwig X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support Message-ID: <20110106180603.GB32670@infradead.org> References: <20101125112304.GA4195@infradead.org> <20110103232514.GF15179@dastard> <201101052307.38379@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201101052307.38379@zmi.at> 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: 1294337166 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, Jan 05, 2011 at 11:07:35PM +0100, Michael Monnerie wrote: > On Mittwoch, 5. Januar 2011 Lukas Czerner wrote: > > If we > > notice that we are running out of space in advance (how much in > > advance?), we can start trimming smaller chunks, until we reach > > reasonable a reasonable pool of reclaimed space, or until we trim > > the whole device. > > Would it be possible that all blocks that have been in use since the > last FITRIM run can be logged? It's a lot of overhead for the big hammer approach the FITRIM is. If you're interested look for some of my earlier discard support patches as they implemented it using an rbtree. But getting this fully right just was a lot of overhead. My strategy is to instead have the simple big hammer FITRIM for e.g. people that want to reclaim storage from a VM or thing provisioned array once in a while, while implementing an optimized discard on commit for SSDs. I'm planning to have the latter ready for 2.6.39. The biggest part to get it is to avoid allocating extents from busy ranges, and I've finally got an older patch from Dave to fully work for that. The next step is to have proper asynchronous discard requests to avoid the waiting overhead the other filesystems have right now. From BATV+83c2603f8a114793e4e4+2692+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 6 12:06:16 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p06I6GoY099293 for ; Thu, 6 Jan 2011 12:06:16 -0600 X-ASG-Debug-ID: 1294337300-1a7e02e10000-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 BC5F71D13A66 for ; Thu, 6 Jan 2011 10:08:20 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 7XWaDa4BnuAmGrIW for ; Thu, 06 Jan 2011 10:08:20 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PauG2-00018s-Qz; Thu, 06 Jan 2011 18:08:18 +0000 Date: Thu, 6 Jan 2011 13:08:18 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Michael Monnerie , xfs@oss.sgi.com, Lukas Czerner , Christoph Hellwig X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support Message-ID: <20110106180818.GC32670@infradead.org> References: <20101125112304.GA4195@infradead.org> <20110103232514.GF15179@dastard> <201101052307.38379@zmi.at> <20110105225039.GD8322@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110105225039.GD8322@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: 1294337300 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, Jan 06, 2011 at 09:50:39AM +1100, Dave Chinner wrote: > If we want optimised, only-trim-what-we-free behaviour, we need to > hook into the transaction subsystem and issue TRIM commands at the > time extents are actually freed. That is much more complex to > implement but much easier to optimise because it doesn't require > persistent state on disk. However, most devices are simply not ready > to handle the flood of TRIM commands this generates, with > performance degrading by ~10-20% for the best of devices and > _10-100x_ for the worst... I tested a few devices that have zero to 1% degradation, but those were arrays, which allow for queued WRITE SAME/UNMAP commands instead of the unqueued TRIM in ATA. But I'm gettig close to finishing the online discard and will start another benchmark session soon. With PCI-E flash devices that aren't limited by the ATA protocol, and the proposed queueable TRIM command this looks like what we need for the future. From BATV+83c2603f8a114793e4e4+2692+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 6 12:08:11 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p06I86EP099798 for ; Thu, 6 Jan 2011 12:08:11 -0600 X-ASG-Debug-ID: 1294337415-5bda00230000-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 C869DFAE710 for ; Thu, 6 Jan 2011 10:10:15 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id J6zxK4XmRD7lFldw for ; Thu, 06 Jan 2011 10:10:15 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PauHv-0001rq-1Z; Thu, 06 Jan 2011 18:10:15 +0000 Date: Thu, 6 Jan 2011 13:10:15 -0500 From: Christoph Hellwig To: Michael Monnerie Cc: xfs@oss.sgi.com, Dave Chinner , Christoph Hellwig , Lukas Czerner X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support Message-ID: <20110106181014.GD32670@infradead.org> References: <20101125112304.GA4195@infradead.org> <201101060910.34534@zmi.at> <20110106091707.GH8322@dastard> <201101061750.43556@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201101061750.43556@zmi.at> 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: 1294337415 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, Jan 06, 2011 at 05:50:42PM +0100, Michael Monnerie wrote: > On Donnerstag, 6. Januar 2011 Dave Chinner wrote: > > Realistically, we have > > to design for how we expect devices to behave in 2-3 years time, not > > waste time trying to optimise for fundamentally broken devices that > > nobody will be using in 2-3 years time... > > I see, thanks for the explanation. I hope that there will be a solution > that allows us to FITRIM on Saturday "in the background", so the thin > provisioned VMs are smaller and faster to back up. That's my immediate > wish, as we currently don't use SSDs. That's what you can do with my FITRIM patches. Right now the only discard support known to me is my impementation that requires XFS as backing store for the images. And a hole punch of an existing hole is very cheap in XFS, so trimming things multiple times is not an issue. From sandeen@redhat.com Thu Jan 6 12:14:45 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p06IEjQB101897 for ; Thu, 6 Jan 2011 12:14:45 -0600 X-ASG-Debug-ID: 1294337814-307a02c00000-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 D5947FAE91B for ; Thu, 6 Jan 2011 10:16:54 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EUactGttMQ0m0UZ8 for ; Thu, 06 Jan 2011 10:16:54 -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 p06IGnaP027661 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 6 Jan 2011 13:16:54 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p06HiPhY003113 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 6 Jan 2011 12:44:26 -0500 Message-ID: <4D25FF79.6070207@redhat.com> Date: Thu, 06 Jan 2011 11:44:25 -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: xfs-oss X-ASG-Orig-Subj: [PATCH] xfstests 241: run longer Subject: [PATCH] xfstests 241: run longer Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1294337814 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 ran into a failure on an ext4 backport which should have been caught by this test, but 30s wasn't long enough to hit it reliably. So run a bit longer; it's not in the quick group anyway. Signed-off-by: Eric Sandeen --- diff --git a/241 b/241 index b5aa7b0..bb920fe 100755 --- a/241 +++ b/241 @@ -54,7 +54,7 @@ rm -f $seq.full rm -rf $TEST_DIR/dbench mkdir $TEST_DIR/dbench -dbench -t 30 -D $TEST_DIR/dbench 4 >> $seq.full +dbench -t 60 -D $TEST_DIR/dbench 4 >> $seq.full status=$? exit From BATV+83c2603f8a114793e4e4+2692+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 6 12:14:50 2011 X-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_23 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 p06IEoj6101936 for ; Thu, 6 Jan 2011 12:14:50 -0600 X-ASG-Debug-ID: 1294337819-159903bd0000-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 A54A8FAE91F for ; Thu, 6 Jan 2011 10:16:59 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id XXKAbBk9YkZNciE7 for ; Thu, 06 Jan 2011 10:16:59 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PauOR-0002dN-0W; Thu, 06 Jan 2011 18:16:59 +0000 Date: Thu, 6 Jan 2011 13:16:58 -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: <20110106181658.GA7299@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: 1294337819 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 lastest version of this patch makes test 229 oops for me. This only started to happen very recently, so I'm not sure if was caused by an updated of this patch or an change in environment. Either way reverting this commit from the xfs tree makes 229 not oops (but still fail as always) for me: [ 52.089635] Assertion failed: (blockcount & xfs_mask64hi(64-BMBT_BLOCKCOUNT_BITLEN)) == 0, file: fs/xfs/xfs_bmap_btree.c, line: 236 [ 52.093089] ------------[ cut here ]------------ [ 52.094491] kernel BUG at fs/xfs/support/debug.c:108! [ 52.095965] invalid opcode: 0000 [#1] SMP [ 52.097003] last sysfs file: /sys/devices/virtio-pci/virtio1/block/vdb/removable [ 52.097003] Modules linked in: [ 52.097003] [ 52.097003] Pid: 2343, comm: t_holes Not tainted 2.6.37-rc4-xfs+ #70 /Bochs [ 52.097003] EIP: 0060:[] EFLAGS: 00010286 CPU: 0 [ 52.097003] EIP is at assfail+0x1e/0x30 [ 52.097003] EAX: 0000008a EBX: 00000000 ECX: ffffff76 EDX: 00000001 [ 52.097003] ESI: 00000000 EDI: f530d56c EBP: f4779930 ESP: f4779920 [ 52.097003] DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 [ 52.097003] Process t_holes (pid: 2343, ti=f4778000 task=f4f54340 task.ti=f4778000) [ 52.097003] Stack: [ 52.097003] c0bc7d84 c0bbf538 c0b8a547 000000ec f477994c c049a822 00000000 00200000 [ 52.097003] 000fffff 00000001 00000001 f477996c c049a8c3 fffe2065 000fffff 00200000 [ 52.097003] 00000000 00000000 f4779b5c f47799a0 c04bc2bf 00000000 f530d554 00000000 [ 52.097003] Call Trace: [ 52.097003] [] ? xfs_bmbt_set_allf+0x72/0xe0 [ 52.097003] [] ? xfs_bmbt_set_all+0x33/0x40 [ 52.097003] [] ? xfs_iext_insert+0x7f/0xe0 [ 52.097003] [] ? xfs_bmap_add_extent+0x98/0x640 [ 52.097003] [] ? xfs_bmap_add_extent+0x98/0x640 [ 52.097003] [] ? xfs_icsb_modify_counters+0x5b/0x1b0 [ 52.097003] [] ? kvm_clock_read+0x14/0x20 [ 52.097003] [] ? xfs_bmapi+0xf72/0x20d0 [ 52.097003] [] ? sched_clock+0x8/0x10 [ 52.097003] [] ? xfs_icsb_sync_counters_locked+0x63/0x80 [ 52.097003] [] ? xfs_iomap_write_delay+0x20d/0x480 [ 52.097003] [] ? __xfs_get_blocks+0x59b/0x6c0 [ 52.097003] [] ? xfs_get_blocks+0x21/0x30 [ 52.097003] [] ? __block_write_begin+0x165/0x390 [ 52.097003] [] ? block_write_begin+0x4a/0x80 [ 52.097003] [] ? xfs_get_blocks+0x0/0x30 [ 52.097003] [] ? xfs_vm_write_begin+0x43/0x70 [ 52.097003] [] ? xfs_get_blocks+0x0/0x30 [ 52.097003] [] ? generic_file_buffered_write+0xd5/0x200 [ 52.097003] [] ? mutex_lock_nested+0x35/0x40 [ 52.097003] [] ? xfs_file_aio_write+0x552/0x950 [ 52.097003] [] ? do_sync_write+0x9c/0xd0 [ 52.097003] [] ? do_page_fault+0x1ba/0x450 [ 52.097003] [] ? vfs_write+0x9a/0x140 [ 52.097003] [] ? do_sync_write+0x0/0xd0 [ 52.097003] [] ? sys_write+0x3d/0x70 [ 52.097003] [] ? syscall_call+0x7/0xb [ 52.097003] Code: 00 e8 e7 5f 19 00 c9 c3 90 8d 74 26 00 55 89 e5 83 ec 10 89 4c 24 0c 89 54 24 08 89 44 24 04 c7 04 24 84 7d bc c0 e8 82 23 44 00 <0f> 0b eb fe 8d b4 26 00 00 00 00 8d bc 27 00 00 00 00 55 89 e5 [ 52.097003] EIP: [] assfail+0x1e/0x30 SS:ESP 0068:f4779920 [ 52.187554] ---[ end trace 7e012a71bd3e3b9d ]--- From karn@ka9q.net Thu Jan 6 21:20:18 2011 X-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_26 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 p073KHtp221128 for ; Thu, 6 Jan 2011 21:20:18 -0600 X-ASG-Debug-ID: 1294370546-0aec03240000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-gx0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D8CBD23EDB8 for ; Thu, 6 Jan 2011 19:22:26 -0800 (PST) Received: from mail-gx0-f181.google.com (mail-gx0-f181.google.com [209.85.161.181]) by cuda.sgi.com with ESMTP id Wh7DB5GkUo4WEkPA for ; Thu, 06 Jan 2011 19:22:26 -0800 (PST) Received: by gxk10 with SMTP id 10so8713837gxk.26 for ; Thu, 06 Jan 2011 19:22:26 -0800 (PST) Received: by 10.101.67.8 with SMTP id u8mr15175557ank.45.1294370545930; Thu, 06 Jan 2011 19:22:25 -0800 (PST) Received: from maggie-129046076143.qualcomm.com (129-46-76-143.qualcomm.com [129.46.76.143]) by mx.google.com with ESMTPS id c30sm32980084anc.20.2011.01.06.19.22.23 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 06 Jan 2011 19:22:24 -0800 (PST) Sender: Phil Karn Message-ID: <4D2686ED.7000304@philkarn.net> Date: Thu, 06 Jan 2011 19:22:21 -0800 From: Phil Karn Reply-To: karn@ka9q.net 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: xfs@oss.sgi.com X-ASG-Orig-Subj: TRIM details Subject: TRIM details Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-gx0-f181.google.com[209.85.161.181] X-Barracuda-Start-Time: 1294370546 X-Barracuda-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.51648 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Now that I've rebuilt my main Linux server, added a 120GB Intel SSD and converted all the file systems to XFS, I've gotten interested in the internals of both XFS and TRIM and how they work together (or will work together). I'd like to know exactly how the drives implement TRIM but I've only found bits and pieces. Can anyone suggest a current and complete reference for the complete SATA command set that includes all the TRIM related stuff? As I understand it, there's a SATA (and SCSI?) command that will repeatedly write a fixed block of data to some number of consecutive LBAs (WRITE SAME), and an "unmap" bit in the write command can be set to indicate that instead of actually writing the blocks, they can be marked for erasure and placed in the free pool. Is this the only way it can be done? It occurs to me that while an "unmap" bit should be quite fast, you don't absolutely *have* to have it. Just have the drive interpret an ordinary write of all 0's to any LBA as an implicit "unmap" indication for that LBA. As long as the drive returns all 0's when an unmapped LBA is read (and I believe this is already a requirement) then were an application to write a block of real data that just happens to contain all 0's, it would still get back what it wrote. Then you could manually trim a drive with something like dd if=/dev/zero of=foobar bs=1024k count=10240k rm foobar or if you're really adventurous and don't mind a little hiccup: dd if=/dev/zero of=foobar bs=1024k count=20m rm foobar (i.e, let dd run the file system out of space before you delete the temporary). Then you wouldn't need a potentially dangerous program like wiper.sh talking directly to the drive behind the file system's back. And while wiper.sh only works with file systems whose structures it knows, this approach would work with ANY file system. This will all become moot when every SSD supports TRIM and every file system uses it. But there are a lot of file systems out there, not all of them support TRIM, and many may not for some time. Somebody must have already thought of this, right? Phil From anton@samba.org Thu Jan 6 21:28:39 2011 X-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 p073Sd4e222543 for ; Thu, 6 Jan 2011 21:28:39 -0600 X-ASG-Debug-ID: 1294371047-0aee036e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ozlabs.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C2B9023F1F9; Thu, 6 Jan 2011 19:30:47 -0800 (PST) Received: from ozlabs.org (ozlabs.org [203.10.76.45]) by cuda.sgi.com with ESMTP id vz2PqSDsxDZljkJ7; Thu, 06 Jan 2011 19:30:47 -0800 (PST) Received: from kryten (ppp121-44-56-164.lns20.syd6.internode.on.net [121.44.56.164]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPSA id 660D4B7145; Fri, 7 Jan 2011 14:30:44 +1100 (EST) Date: Fri, 7 Jan 2011 14:30:41 +1100 From: Anton Blanchard To: Alex Elder , Dave Chinner , Christoph Hellwig Cc: xfs-masters@oss.sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: xfs: Add log level to assertion printk Subject: xfs: Add log level to assertion printk Message-ID: <20110107143041.1d07e34f@kryten> X-Mailer: Claws Mail 3.7.6 (GTK+ 2.22.0; i486-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ozlabs.org[203.10.76.45] X-Barracuda-Start-Time: 1294371048 X-Barracuda-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.51648 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 I received a ppc64 bug report involving xfs but the assertion was filtered out by the console log level. Use KERN_CRIT to ensure it makes it out. Signed-off-by: Anton Blanchard --- diff --git a/fs/xfs/support/debug.c b/fs/xfs/support/debug.c index 975aa10..86162e5 100644 --- a/fs/xfs/support/debug.c +++ b/fs/xfs/support/debug.c @@ -104,7 +104,8 @@ xfs_fs_vcmn_err( void assfail(char *expr, char *file, int line) { - printk("Assertion failed: %s, file: %s, line: %d\n", expr, file, line); + printk(KERN_CRIT "Assertion failed: %s, file: %s, line: %d\n", expr, + file, line); BUG(); } From martin.petersen@oracle.com Thu Jan 6 22:35:22 2011 X-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_26, UNPARSEABLE_RELAY 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 p074ZMRB233627 for ; Thu, 6 Jan 2011 22:35:22 -0600 X-ASG-Debug-ID: 1294375051-09f3015b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from rcsinet10.oracle.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3F0C9236FCC for ; Thu, 6 Jan 2011 20:37:32 -0800 (PST) Received: from rcsinet10.oracle.com (rcsinet10.oracle.com [148.87.113.121]) by cuda.sgi.com with ESMTP id UDxe77WXA4Kfao7S for ; Thu, 06 Jan 2011 20:37:32 -0800 (PST) Received: from acsinet15.oracle.com (acsinet15.oracle.com [141.146.126.227]) by rcsinet10.oracle.com (Switch-3.4.2/Switch-3.4.2) with ESMTP id p074bSjT004391 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 7 Jan 2011 04:37:29 GMT Received: from acsmt354.oracle.com (acsmt354.oracle.com [141.146.40.154]) by acsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id p074WxCL010570; Fri, 7 Jan 2011 04:37:27 GMT Received: from abhmt009.oracle.com by acsmt354.oracle.com with ESMTP id 938034791294374959; Thu, 06 Jan 2011 20:35:59 -0800 Received: from groovelator.mkp.net (/209.217.122.111) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 06 Jan 2011 20:35:58 -0800 To: karn@ka9q.net Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: TRIM details Subject: Re: TRIM details From: "Martin K. Petersen" Organization: Oracle References: <4D2686ED.7000304@philkarn.net> Date: Thu, 06 Jan 2011 23:35:57 -0500 In-Reply-To: <4D2686ED.7000304@philkarn.net> (Phil Karn's message of "Thu, 06 Jan 2011 19:22:21 -0800") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: rcsinet10.oracle.com[148.87.113.121] X-Barracuda-Start-Time: 1294375052 X-Barracuda-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=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.51652 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean >>>>> "Phil" == Phil Karn writes: Phil> I'd like to know exactly how the drives implement TRIM but I've Phil> only found bits and pieces. Can anyone suggest a current and Phil> complete reference for the complete SATA command set that includes Phil> all the TRIM related stuff? You kind-of have to be T13 member to get it. But try googling ATA ACS-2... Phil> As I understand it, there's a SATA (and SCSI?) command that will Phil> repeatedly write a fixed block of data to some number of Phil> consecutive LBAs (WRITE SAME), and an "unmap" bit in the write Phil> command can be set to indicate that instead of actually writing Phil> the blocks, they can be marked for erasure and placed in the free Phil> pool. There are several commands and variations... For ATA there's the DSM TRIM command which allows you to indicate ranges of blocks to discard. The ranges are stored in the data blocks and not the command itself. A device can indicate how many blocks of payload it supports. Many don't. Some of those that do blow up if you actually send more than one block. In SCSI there are three ways: 1. WRITE SAME with a zeroed payload 2. WRITE SAME with the UNMAP bit set 3. UNMAP command UNMAP, like ATA DSM, takes a set of ranges in the data payload. Just to make things more interesting they are not the same format and don't have a 1:1 mapping with the ATA ranges. There is no official support for (1) at the protocol level. You have to know via means outside the standard whether the device supports logical block provisioning with zero detection. There are a few storage arrays out there that do. Whether the device supports (2) or (3) is indicated in a set of VPD pages that also indicate preferred granularity, alignment, etc. That didn't use to be the case so for a while you just had to guess. We have some heuristics in place that pick the right command depending on the device. Furthermore, in Linux, ATA sits underneath SCSI. So we translate WRITE SAME(16) with the UNMAP bit set to DSM TRIM in our SCSI-ATA Translation Layer. Finally, there are a set of bits in both ATA and SCSI that indicate whether read after a discard will return zeroes or garbage. Some devices report that they return zeroes but don't in all cases. The kernel goes through a lot of blah to make sure we're doing the right thing. I really don't think that's a headache that's worth repeating. Thankfully, at the top of the stack we have a generic block device ioctl that hides all the complexity from the user. If you want to tinker that's a much better place to start. If you check the archives you'll also see that the filesystem-specific FITRIM ioctl is being worked on. Plus some filesystems have the option of doing discards in realtime. Phil> Just have the drive interpret an ordinary write of all 0's to any Phil> LBA as an implicit "unmap" indication for that LBA. As long as the Phil> drive returns all 0's when an unmapped LBA is read (and I believe Phil> this is already a requirement) then were an application to write a Phil> block of real data that just happens to contain all 0's, it would Phil> still get back what it wrote. See above. Phil> Then you could manually trim a drive with something like Phil> dd if=/dev/zero of=foobar bs=1024k count=10240k rm foobar But if the device does not detect zeroes then you'll end up: - transferring a bunch of useless data across the bus which will slow things to a grinding halt and - if it's an SSD, wear out a lot of flash cells for no reason -- Martin K. Petersen Oracle Linux Engineering From SRS0+RScM+41+fromorbit.com=david@internode.on.net Fri Jan 7 00:09:22 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0769LEg247586 for ; Fri, 7 Jan 2011 00:09:21 -0600 X-ASG-Debug-ID: 1294380688-0cde026a0000-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 78DA71D00837 for ; Thu, 6 Jan 2011 22:11:28 -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 foiVeSpIOdTZLKos for ; Thu, 06 Jan 2011 22:11:28 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52105280-1927428 for multiple; Fri, 07 Jan 2011 16:41:27 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pb5Xp-0007CM-Ix; Fri, 07 Jan 2011 17:11:25 +1100 Date: Fri, 7 Jan 2011 17:11:25 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: errors on sync superblock writes leave it locked Subject: Re: [PATCH] xfs: errors on sync superblock writes leave it locked Message-ID: <20110107061125.GI8322@dastard> References: <1294116609-15138-1-git-send-email-david@fromorbit.com> <20110104094336.GA19193@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110104094336.GA19193@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: 1294380690 X-Barracuda-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.51658 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, Jan 04, 2011 at 04:43:36AM -0500, Christoph Hellwig wrote: > I don't think the patch is quite correct. In the old code xfs_buf_rele > incremented the buffer reference count before calling ->b_relse, > expecting it do decrement it again. > > I think the best fix is to kill ->b_relse entirely. We can simply > do the buffer callback processing and b_flags updates in > xfs_buf_iodone_callbacks. The important thing is to not clear the > buffer error there, so that it actually get propagated to the caller. > As the buffer remains locked until xfs_bwrite calls xfs_buf_relse it > can get the error reliably that way. > > Patch below, but it's still running xfqa so far: Looks sane. can i get a signed-off-by for it from you and I'll include it in my remaining -for-2.6.38 series? Cheers, Dave. -- Dave Chinner david@fromorbit.com From MAILER-DAEMON@oss.sgi.com Fri Jan 7 01:36:19 2011 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.1 required=5.0 tests=BAYES_00,VIRUS_WARNING152 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 p077aJqY005030 for ; Fri, 7 Jan 2011 01:36:19 -0600 X-ASG-Debug-ID: 1294385905-76e400ee0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from servihoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B302E23722E for ; Thu, 6 Jan 2011 23:38:26 -0800 (PST) Received: from servihoo.com (mail1.servihoo.com [202.123.2.106]) by cuda.sgi.com with ESMTP id 6uv0a8zstY3KENpa for ; Thu, 06 Jan 2011 23:38:26 -0800 (PST) X-ASG-Orig-Subj: Undeliverable mail: Message could not be delivered Subject: Undeliverable mail: Message could not be delivered From: To: Date: Fri, 07 Jan 2011 11:38:24 +0400 Message-ID: X-MAPI-Message-Class: REPORT.IPM.Note.NDR MIME-Version: 1.0 Content-Type: multipart/report; report-type="delivery-status"; boundary="_===140542516====servihoo.com===_" X-Barracuda-Connect: mail1.servihoo.com[202.123.2.106] X-Barracuda-Start-Time: 1294385907 X-Barracuda-Bayes: INNOCENT GLOBAL 0.6717 1.0000 1.1645 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.37 X-Barracuda-Spam-Status: No, SCORE=1.37 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_SA590, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.51664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 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 --_===140542516====servihoo.com===_ Content-Type: text/plain; charset="utf-8" Failed to deliver to 'cbiesinger@web.de' Virus(es) found. readme.zip is infected with W32/Mydoom.o@MM!zip Viruses: 1 Trojans: 0 Jokes: 0 Tests: 0 Captured by McAfee antivirus plugin running on CommuniGate Pro (TM) mail server --_===140542516====servihoo.com===_ Content-Type: message/delivery-status Reporting-MTA: dns; servihoo.com Original-Recipient: rfc822; Final-Recipient: system; Action: failed Status: 5.0.0 --_===140542516====servihoo.com===_ Content-Type: text/rfc822-headers Received: from [197.224.171.201] (HELO oss.sgi.com) by servihoo.com (CommuniGate Pro SMTP 5.2.19) with ESMTP id 140542490 for cbiesinger@web.de; Fri, 07 Jan 2011 11:38:21 +0400 From: xfs@oss.sgi.com To: cbiesinger@web.de Subject: Message could not be delivered Date: Thu, 6 Jan 2011 23:37:19 -0800 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0012_BC3DE8D1.A3718D21" 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: --_===140542516====servihoo.com===_-- From BATV+63a2e70d0cd1afb6cd6a+2693+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 7 02:43:14 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p078hB6Q015675 for ; Fri, 7 Jan 2011 02:43:13 -0600 X-ASG-Debug-ID: 1294389920-44d702570000-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 63513F10254 for ; Fri, 7 Jan 2011 00:45:20 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id C45BDDGEuiNjIqG2 for ; Fri, 07 Jan 2011 00:45:20 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pb7wk-0003Tz-GV; Fri, 07 Jan 2011 08:45:18 +0000 Date: Fri, 7 Jan 2011 03:45:18 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/8] xfs: ensure sync write errors are returned Subject: Re: [PATCH 1/8] xfs: ensure sync write errors are returned Message-ID: <20110107084518.GA10829@infradead.org> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294116518-14908-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: 1294389921 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 > + if (ret == -ENOSPC && !enospc) { > + ssize_t ret2 = xfs_flush_pages(ip, 0, -1, 0, FI_NONE); > + if (ret2) { > + ret = ret2; > goto out_unlock_internal; > + } > enospc = 1; > goto write_retry; > } I don't think there is any reason for the ret2 variale here. If it's non-zero we assign it to ret, and if it's zero we overwrite it again after jumping to the write_retry label. From BATV+63a2e70d0cd1afb6cd6a+2693+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 7 02:51:48 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p078pmSZ018346 for ; Fri, 7 Jan 2011 02:51:48 -0600 X-ASG-Debug-ID: 1294390437-2c9e01af0000-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 2E01E1D1596A for ; Fri, 7 Jan 2011 00:53:57 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id eEJ2lTD2V2phg6mC for ; Fri, 07 Jan 2011 00:53:57 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pb857-0004Lp-EC; Fri, 07 Jan 2011 08:53:57 +0000 Date: Fri, 7 Jan 2011 03:53:57 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 7/8] xfs: factor common write setup code Subject: Re: [PATCH 7/8] xfs: factor common write setup code Message-ID: <20110107085357.GB10829@infradead.org> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294116518-14908-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: 1294390438 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, Jan 04, 2011 at 03:48:37PM +1100, Dave Chinner wrote: > 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. Wouldn't it be better to create the helper before duplicating the code, aka move it before the buffer/direct splits in the series? > + /* > + * 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; just return file_remove_suid(file); ? From BATV+63a2e70d0cd1afb6cd6a+2693+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 7 02:56:21 2011 X-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 p078uLTb018557 for ; Fri, 7 Jan 2011 02:56:21 -0600 X-ASG-Debug-ID: 1294390710-2c9f01c20000-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 258631D15BA4 for ; Fri, 7 Jan 2011 00:58:31 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id NuivW3pPSKS8xMhG for ; Fri, 07 Jan 2011 00:58:31 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pb89W-00051Y-P0; Fri, 07 Jan 2011 08:58:30 +0000 Date: Fri, 7 Jan 2011 03:58:30 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write Subject: Re: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write Message-ID: <20110107085830.GC10829@infradead.org> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294116518-14908-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: 1294390711 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 also clearly indicates that XFS > + * does not fall back to buffered IO in the direct IO write path. I don't think this comment belongs into the function header. It's already present in the right place anyway, so it can just be removed. > + xfs_buftarg_t *target = XFS_IS_REALTIME_INODE(ip) ? > + mp->m_rtdev_targp : mp->m_ddev_targp; struct xfs_buftarg, please. > + trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0); > + ret = generic_file_direct_write(iocb, iovp, > + &nr_segs, pos, &iocb->ki_pos, count, ocount); > + > + /* No fallback to buffered IO on errors for XFS. */ > + return ret; I'd add an ASSERT(ret < 0 || ret == count); here to make sure we don't get problems due to changes in the core direct I/O code. From SRS0+h+ws+41+fromorbit.com=david@internode.on.net Fri Jan 7 03:05:24 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0795O4o020095 for ; Fri, 7 Jan 2011 03:05:24 -0600 X-ASG-Debug-ID: 1294391252-633f03d00000-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 1618C4F6687 for ; Fri, 7 Jan 2011 01:07:32 -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 Rb7CoYyn02gr1Ytq for ; Fri, 07 Jan 2011 01:07:32 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52523771-1927428 for multiple; Fri, 07 Jan 2011 19:37:31 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pb8ID-0007SC-NC; Fri, 07 Jan 2011 20:07:29 +1100 Date: Fri, 7 Jan 2011 20:07:29 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/8] xfs: ensure sync write errors are returned Subject: Re: [PATCH 1/8] xfs: ensure sync write errors are returned Message-ID: <20110107090729.GK8322@dastard> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-2-git-send-email-david@fromorbit.com> <20110107084518.GA10829@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110107084518.GA10829@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: 1294391254 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= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.51670 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, Jan 07, 2011 at 03:45:18AM -0500, Christoph Hellwig wrote: > > + if (ret == -ENOSPC && !enospc) { > > + ssize_t ret2 = xfs_flush_pages(ip, 0, -1, 0, FI_NONE); > > + if (ret2) { > > + ret = ret2; > > goto out_unlock_internal; > > + } > > enospc = 1; > > goto write_retry; > > } > > I don't think there is any reason for the ret2 variale here. If it's > non-zero we assign it to ret, and if it's zero we overwrite it again > after jumping to the write_retry label. True, I'll fix it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From ms@citd.de Fri Jan 7 03:09:24 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0799NR5020869 for ; Fri, 7 Jan 2011 03:09:24 -0600 X-ASG-Debug-ID: 1294391492-384301590000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from enyo.dsw2k3.info (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5A6E21D15DE4 for ; Fri, 7 Jan 2011 01:11:33 -0800 (PST) Received: from enyo.dsw2k3.info (enyo.dsw2k3.info [195.71.86.239]) by cuda.sgi.com with ESMTP id cBAeCnccPin8nXIv for ; Fri, 07 Jan 2011 01:11:33 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by enyo.dsw2k3.info (Postfix) with ESMTP id D4489A65C20; Fri, 7 Jan 2011 10:11:31 +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 enyo.dsw2k3.info Received: from enyo.dsw2k3.info ([127.0.0.1]) by localhost (enyo.dsw2k3.info [127.0.0.1]) (amavisd-new, port 10024) with LMTP id mhckriAsuqzM; Fri, 7 Jan 2011 10:11:23 +0100 (CET) Received: from citd.de (p4FC4C93B.dip.t-dialin.net [79.196.201.59]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (Client did not present a certificate) by enyo.dsw2k3.info (Postfix) with ESMTPSA id D34D198C6E5; Fri, 7 Jan 2011 10:11:22 +0100 (CET) Date: Fri, 7 Jan 2011 10:11:20 +0100 From: Matthias Schniedermeyer To: karn@ka9q.net Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: TRIM details Subject: Re: TRIM details Message-ID: <20110107091120.GA6634@citd.de> References: <4D2686ED.7000304@philkarn.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D2686ED.7000304@philkarn.net> User-Agent: Mutt/1.5.19 (2009-01-05) X-Barracuda-Connect: enyo.dsw2k3.info[195.71.86.239] X-Barracuda-Start-Time: 1294391493 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-ASG-Whitelist: HEADER (^X-Barracuda-Connect: [^ ]+\.dsw2k3\.info\[) X-Virus-Status: Clean On 06.01.2011 19:22, Phil Karn wrote: > Now that I've rebuilt my main Linux server, added a 120GB Intel SSD and > converted all the file systems to XFS, I've gotten interested in the > internals of both XFS and TRIM and how they work together (or will work > together). > > I'd like to know exactly how the drives implement TRIM but I've only > found bits and pieces. Can anyone suggest a current and complete > reference for the complete SATA command set that includes all the TRIM > related stuff? > > As I understand it, there's a SATA (and SCSI?) command that will > repeatedly write a fixed block of data to some number of consecutive > LBAs (WRITE SAME), and an "unmap" bit in the write command can be set to > indicate that instead of actually writing the blocks, they can be marked > for erasure and placed in the free pool. I roughly know what happens in the SATA version. The SATA command takes an sector-offset and a sector-count (up to 64k) Spec is linked on the Wikipedia-page: http://en.wikipedia.org/wiki/TRIM > Is this the only way it can be done? It occurs to me that while an > "unmap" bit should be quite fast, you don't absolutely *have* to have it. "Quite fast" is something of an understatement. The Intel SSD can TRIM the whole drive in a matter of seconds. I have tested that with hdparm, when i wrote me a simple disc imaging perl-script. > Just have the drive interpret an ordinary write of all 0's to any LBA as > an implicit "unmap" indication for that LBA. As long as the drive The drive would have to look into each written sector in the off chance that it might be 0, that's a lot of electrons you have to burn for not much gain. And that's ignoring the performance side, doing such a check on each incoming write would be expensive at best. Bis denn -- Real Programmers consider "what you see is what you get" to be just as bad a concept in Text Editors as it is in women. No, the Real Programmer wants a "you asked for it, you got it" text editor -- complicated, cryptic, powerful, unforgiving, dangerous. From ms@citd.de Fri Jan 7 03:15:23 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p079FNpF021857 for ; Fri, 7 Jan 2011 03:15:23 -0600 X-ASG-Debug-ID: 1294391852-2c9102860000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from enyo.dsw2k3.info (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3415C1D15E26 for ; Fri, 7 Jan 2011 01:17:32 -0800 (PST) Received: from enyo.dsw2k3.info (enyo.dsw2k3.info [195.71.86.239]) by cuda.sgi.com with ESMTP id 5vzJjJVycc07rQyI for ; Fri, 07 Jan 2011 01:17:32 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by enyo.dsw2k3.info (Postfix) with ESMTP id F2C8FA65C26; Fri, 7 Jan 2011 10:17:31 +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 enyo.dsw2k3.info Received: from enyo.dsw2k3.info ([127.0.0.1]) by localhost (enyo.dsw2k3.info [127.0.0.1]) (amavisd-new, port 10024) with LMTP id bSmwP4uxJ1DR; Fri, 7 Jan 2011 10:17:23 +0100 (CET) Received: from citd.de (p4FC4C93B.dip.t-dialin.net [79.196.201.59]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (Client did not present a certificate) by enyo.dsw2k3.info (Postfix) with ESMTPSA id D7E20A65C20; Fri, 7 Jan 2011 10:17:22 +0100 (CET) Date: Fri, 7 Jan 2011 10:17:20 +0100 From: Matthias Schniedermeyer To: karn@ka9q.net Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: TRIM details Subject: Re: TRIM details Message-ID: <20110107091720.GA6921@citd.de> References: <4D2686ED.7000304@philkarn.net> <20110107091120.GA6634@citd.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110107091120.GA6634@citd.de> User-Agent: Mutt/1.5.19 (2009-01-05) X-Barracuda-Connect: enyo.dsw2k3.info[195.71.86.239] X-Barracuda-Start-Time: 1294391853 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-ASG-Whitelist: HEADER (^X-Barracuda-Connect: [^ ]+\.dsw2k3\.info\[) X-Virus-Status: Clean On 07.01.2011 10:11, Matthias Schniedermeyer wrote: > On 06.01.2011 19:22, Phil Karn wrote: > > > Just have the drive interpret an ordinary write of all 0's to any LBA as > > an implicit "unmap" indication for that LBA. As long as the drive > > The drive would have to look into each written sector in the off chance > that it might be 0, that's a lot of electrons you have to burn for not > much gain. And that's ignoring the performance side, doing such a check > on each incoming write would be expensive at best. Altough, after thinking about it a little more. Doing a Population count in the controller while the data comes in over the wire can't be that expensive. Bis denn -- Real Programmers consider "what you see is what you get" to be just as bad a concept in Text Editors as it is in women. No, the Real Programmer wants a "you asked for it, you got it" text editor -- complicated, cryptic, powerful, unforgiving, dangerous. From SRS0+h+ws+41+fromorbit.com=david@internode.on.net Fri Jan 7 03:18:56 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p079IuWh022055 for ; Fri, 7 Jan 2011 03:18:56 -0600 X-ASG-Debug-ID: 1294392060-44d9038c0000-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 74C9815396B6 for ; Fri, 7 Jan 2011 01:21:04 -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 rgCAuRqH6JBoCeLf for ; Fri, 07 Jan 2011 01:21:04 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 40645646-1927428 for multiple; Fri, 07 Jan 2011 19:50:59 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pb8VG-0007TP-6o; Fri, 07 Jan 2011 20:20:58 +1100 Date: Fri, 7 Jan 2011 20:20:58 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 7/8] xfs: factor common write setup code Subject: Re: [PATCH 7/8] xfs: factor common write setup code Message-ID: <20110107092058.GL8322@dastard> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-8-git-send-email-david@fromorbit.com> <20110107085357.GB10829@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110107085357.GB10829@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: 1294392065 X-Barracuda-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.51671 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, Jan 07, 2011 at 03:53:57AM -0500, Christoph Hellwig wrote: > On Tue, Jan 04, 2011 at 03:48:37PM +1100, Dave Chinner wrote: > > 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. > > Wouldn't it be better to create the helper before duplicating the code, > aka move it before the buffer/direct splits in the series? Maybe, but at this I'd prefer not to move it as it would mean having to rework several other patches in the series as well. Moving it doesn't change the end result at all, so unless you feel really strongly about this I'm going to say no this time because we're now under time pressure to get this tested and finished for 2.6.38. > > + /* > > + * 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; > > just > > return file_remove_suid(file); Yup, will fix. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+h+ws+41+fromorbit.com=david@internode.on.net Fri Jan 7 03:19:30 2011 X-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 (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p079JUKW022183 for ; Fri, 7 Jan 2011 03:19:30 -0600 X-ASG-Debug-ID: 1294392098-76da031b0000-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 061C023FEB8 for ; Fri, 7 Jan 2011 01:21:38 -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 mCjeSjKoMK9fGgcC for ; Fri, 07 Jan 2011 01:21:38 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52524692-1927428 for multiple; Fri, 07 Jan 2011 19:51:37 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pb8Vs-0007Tr-I7; Fri, 07 Jan 2011 20:21:36 +1100 Date: Fri, 7 Jan 2011 20:21:36 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write Subject: Re: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write Message-ID: <20110107092136.GM8322@dastard> References: <1294116518-14908-1-git-send-email-david@fromorbit.com> <1294116518-14908-6-git-send-email-david@fromorbit.com> <20110107085830.GC10829@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110107085830.GC10829@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: 1294392100 X-Barracuda-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.51672 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, Jan 07, 2011 at 03:58:30AM -0500, Christoph Hellwig wrote: > > +This also clearly indicates that XFS > > + * does not fall back to buffered IO in the direct IO write path. > > I don't think this comment belongs into the function header. It's > already present in the right place anyway, so it can just be removed. OK. > > + xfs_buftarg_t *target = XFS_IS_REALTIME_INODE(ip) ? > > + mp->m_rtdev_targp : mp->m_ddev_targp; > > struct xfs_buftarg, please. Was copy-n-paste. Will fix. > > + trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0); > > + ret = generic_file_direct_write(iocb, iovp, > > + &nr_segs, pos, &iocb->ki_pos, count, ocount); > > + > > + /* No fallback to buffered IO on errors for XFS. */ > > + return ret; > > I'd add an > > ASSERT(ret < 0 || ret == count); > > here to make sure we don't get problems due to changes in the core > direct I/O code. Yup, good idea. Cheers, Dave. -- Dave Chinner david@fromorbit.com From jessen@szcnarts.com Fri Jan 7 04:45:18 2011 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.1 required=5.0 tests=BAYES_60,J_CHICKENPOX_26 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 p07AjHoD034118 for ; Fri, 7 Jan 2011 04:45:18 -0600 X-ASG-Debug-ID: 1294397237-268800c20001-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from szcnarts.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EA6E11D161B4 for ; Fri, 7 Jan 2011 02:47:18 -0800 (PST) Received: from szcnarts.com ([183.13.88.156]) by cuda.sgi.com with ESMTP id w1Y7eEFACgT7AZAm for ; Fri, 07 Jan 2011 02:47:18 -0800 (PST) From: "jessen" X-ASG-Orig-Subj: Re: Updated Quotation Shipping Subject: Re: Updated Quotation Shipping To: linux-xfs@oss.sgi.com Content-Type: text/plain;charset="GB2312" Reply-To: jessen@szcnarts.com Date: Fri, 7 Jan 2011 18:47:18 +0800 X-Priority: 3 X-Mailer: FoxMail 4.0 beta 2 [cn] X-Barracuda-Connect: UNKNOWN[183.13.88.156] X-Barracuda-Start-Time: 1294397244 Message-Id: <20110107104718.EA6E11D161B4@cuda.sgi.com> X-Barracuda-Bayes: INNOCENT GLOBAL 0.6091 1.0000 0.7923 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.53 X-Barracuda-Spam-Status: No, SCORE=1.53 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_MISSING_MID, BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.51676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 BSF_SC0_MISSING_MID BODY: Custom Rule BSF_SC0_MISSING_MID 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean DEAR ALL: For any concerns issue please feel free to discuss with me,thanks for your supports! EUR-1 Yantian 2/4 CMA CGM AQUILA FL710W(CY:11-Jan) Southampton/Hamburg/Rotterdam/Zeebrugge/Antwerp/Le Havre USD1400/2625/2725 EUR-3 Chiwan (4/5) /Nansha (5/6) /Yantian (6/7) CC OTELLO FM322W(CWN:13-JAN,NSA:14-JAN, YTN:15-JAN,) Le Havre/Dunkerque/Dunkerque/Antwerp/Zeebrugger/Hamburg/Rotterdam/Southampton USD1375/2525/2625 EUR-5 Yantian 3/5 MAERSK EINDHOVEN VA055W (YTN: 12-Jan) Le Havre/Rotterdam/Hamburg/Zeebrugge/Antwerp USD1325/2375/2475 Remark: 1.Above rates are further subject to ORC:USD141/269/269, DOC:USD25 per set, SEAL Fee:USD4 per container, OWS: On/Above 18 tons USD150,include tare weight. 2.Also can accept PRD shipment. MED-1 Nansha:6/7 Chiwan 7/1 CMA CGM PUCCINI ME708W (NSA: 15-JAN; CWN: 16-JAN) Valencia/Barcelona/Fos/Genoa/Naples USD1150/2125/2225 MED-3 Chiwan 4/5 , Yantian 5/6 CMA CGM MUSSET BX711W(CWN/YTN:14-JAN) Port Said (East)/Damietta/Izmit/Ambarli/Ilyichevsk/Constanza/Odessa USD1325/2325/2425 Remark: 1.Above rates are further subject to ORC:USD141/269/269, DOC:USD25 per set, SEAL Fee:USD4 per container,ISPS:USD10/container; OWS: On/Above 18 tons USD150,include tare weight. 2.Also can accept PRD shipment. ISC-1 Shekou 6/1 GE465W (CY: 10-Jan) Jebel Ali/Bandar Abbas USD925/1425/1425 Doha USD1275/2100/2100 Khorramshr/Bushehr USD1925/3025/3025 Remark: 1.Above rates are further subject to THC:RMB470/755, DOC, ISPS, SEAL Fee, OWS: On/Above 18 tons USD150,include tare weight. 2.Also can accept PRD shipment. 2011-01-07 --------------------------------------------------- Tks & best rgds. If you have any question, pls contact with me! Mr.Jason Zhang SHENZHEN LUCKY TRANS INTERNATIONAL LOGISTICS CO.,LTD. (Shenzhen Office) Tel:+86 755 25172492/25172493/25712494-604 Fax:+86 755 25172748 Mob:13418553654/15118845670(24'HR) Msn:cargo_shenzhen@hotmail.com QQ:154887788 Skype:jasonzhang0428 E-mail:jason@lucky-trans.com Wed: http://www.lucky-trans.com/ Add: Room 407A,Suhao Bidg.,Nanxin Road, Nanshan Dist.,Shenzhen,China From yuji_touya@yokogawa-digital.com Fri Jan 7 04:58:51 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p07Awpq9036094 for ; Fri, 7 Jan 2011 04:58:51 -0600 X-ASG-Debug-ID: 1294398059-799e02ab0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from zns001-0m9003.yokogawa.co.jp (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D1009240289 for ; Fri, 7 Jan 2011 03:00:59 -0800 (PST) Received: from zns001-0m9003.yokogawa.co.jp (zns001-0m9003.yokogawa.co.jp [203.174.79.161]) by cuda.sgi.com with ESMTP id B7RZFlNC5digPW3a for ; Fri, 07 Jan 2011 03:00:59 -0800 (PST) Received: from zns001-0m9003.yokogawa.co.jp (localhost [127.0.0.1]) by zns001-0m9003.yokogawa.co.jp (8.12.10+Sun/8.12.10) with ESMTP id p07B0fLk029859; Fri, 7 Jan 2011 20:00:41 +0900 (JST) Received: from zex001-0m9025.jp.ykgw.net (zex001-0m9025.jp.ykgw.net [10.0.11.44]) by zns001-0m9003.yokogawa.co.jp (8.12.10+Sun/8.12.10) with ESMTP id p07B0dSB029848; Fri, 7 Jan 2011 20:00:40 +0900 (JST) Received: from EXMAIL03.jp.ykgw.net ([10.0.11.29]) by zex001-0m9025.jp.ykgw.net ([10.0.11.44]) with mapi; Fri, 7 Jan 2011 20:00:39 +0900 From: To: CC: Date: Fri, 7 Jan 2011 20:00:38 +0900 X-ASG-Orig-Subj: RE: 2.6.27.30 fc10, some processes stuck in D state Subject: RE: 2.6.27.30 fc10, some processes stuck in D state Thread-Topic: 2.6.27.30 fc10, some processes stuck in D state Thread-Index: AcutXr+au7BdH9lvSkG7QOSD1Vl6bAAFjkJQ Message-ID: <8529A87D856C184491994079B5F87B68C1A828A388@EXMAIL03.jp.ykgw.net> References: <8529A87D856C184491994079B5F87B68C1A8289FCC@EXMAIL03.jp.ykgw.net> <20110106050057.GF8322@dastard> In-Reply-To: <20110106050057.GF8322@dastard> Accept-Language: ja-JP Content-Language: ja-JP X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: ja-JP Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: zns001-0m9003.yokogawa.co.jp[203.174.79.161] X-Barracuda-Start-Time: 1294398060 X-Barracuda-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.51678 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 Dave, Thank you for your replying. > -----Original Message----- > From: Dave Chinner [mailto:david@fromorbit.com]=20 > Sent: Thursday, January 06, 2011 2:01 PM > Everything is waiting for log space to be freed. Typically a sign > that metadata has not been flushed or that IO completion has not occurred > so the tail is not moving forward. Nice to know it! It will help us. > What did you change 3 months ago? Or did this always happen? This always happens. > So doing new read IOs starts stuff moving again? That sounds like an IO > completion has not arrived from the lower layers until a new IO is > issued and completes. Perhaps the hardware RAID is not issuing an > interrupt when it should? Yes, new read IOs seem to wake up them. Are there any tools/ways to examine whether expected interrupt occurred or = not? > What type of RAID controller/storage hardware are you using? Is it > all running the latest firmware, appropriate drivers, etc? PCI Express adapter and an external RAID system, connected with fiber chann= el each other. The BIOS, PCI Express adapter and RAID system's firmware are not up to date= . We will try to update these softwares and check if the same problem occur. It would be nice to reproduce this problem as easy as posible. If there is suitable application(benchmark or test program etc), please let= me know. Thanks. Yuji From SRS0+FBYn+41+fromorbit.com=dave@internode.on.net Fri Jan 7 05:28:55 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p07BSt0X039015 for ; Fri, 7 Jan 2011 05:28:55 -0600 X-ASG-Debug-ID: 1294399862-0d8103df0000-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 D9B981D160DD for ; Fri, 7 Jan 2011 03:31: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 iyEReGAGN7AYx9rA for ; Fri, 07 Jan 2011 03:31:03 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52125624-1927428 for ; Fri, 07 Jan 2011 22:01:02 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PbAX6-0007hf-S6 for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:31:00 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PbAWc-0000JO-2W for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:30:30 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/8] xfs: ensure sync write errors are returned Subject: [PATCH 1/8] xfs: ensure sync write errors are returned Date: Fri, 7 Jan 2011 22:30:18 +1100 Message-Id: <1294399825-1157-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294399825-1157-1-git-send-email-david@fromorbit.com> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1294399864 X-Barracuda-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.51680 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_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 Reviewed-by: Alex Elder --- fs/xfs/linux-2.6/xfs_file.c | 49 ++++++++++++++++++++---------------------- 1 files changed, 23 insertions(+), 26 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index ba8ad42..10b7fb4 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -574,7 +574,7 @@ xfs_file_aio_write( 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; + ssize_t ret = 0; int ioflags = 0; xfs_fsize_t isize, new_size; int iolock; @@ -590,9 +590,9 @@ xfs_file_aio_write( if (file->f_mode & FMODE_NOCMTIME) ioflags |= IO_INVIS; - error = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); - if (error) - return error; + ret = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); + if (ret) + return ret; count = ocount; if (count == 0) @@ -616,9 +616,9 @@ relock: xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); start: - error = -generic_write_checks(file, &pos, &count, + ret = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); - if (error) { + if (ret) { xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); goto out_unlock_mutex; } @@ -660,8 +660,8 @@ start: */ if (pos > ip->i_size) { - error = xfs_zero_eof(ip, pos, ip->i_size); - if (error) { + ret = -xfs_zero_eof(ip, pos, ip->i_size); + if (ret) { xfs_iunlock(ip, XFS_ILOCK_EXCL); goto out_unlock_internal; } @@ -674,8 +674,8 @@ start: * by root. This keeps people from modifying setuid and * setgid binaries. */ - error = -file_remove_suid(file); - if (unlikely(error)) + ret = file_remove_suid(file); + if (unlikely(ret)) goto out_unlock_internal; /* We can write back this queue in page reclaim */ @@ -684,10 +684,10 @@ start: if ((ioflags & IO_ISDIRECT)) { if (mapping->nrpages) { WARN_ON(need_i_mutex == 0); - error = xfs_flushinval_pages(ip, + ret = -xfs_flushinval_pages(ip, (pos & PAGE_CACHE_MASK), -1, FI_REMAPF_LOCKED); - if (error) + if (ret) goto out_unlock_internal; } @@ -720,24 +720,22 @@ start: } } else { 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, + ret = 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) + if (ret == -ENOSPC && !enospc) { + ret = xfs_flush_pages(ip, 0, -1, 0, FI_NONE); + if (ret) goto out_unlock_internal; enospc = 1; goto write_retry; } - ret = ret2; } current->backing_dev_info = NULL; @@ -753,7 +751,6 @@ write_retry: xfs_iunlock(ip, XFS_ILOCK_EXCL); } - error = -ret; if (ret <= 0) goto out_unlock_internal; @@ -762,23 +759,23 @@ write_retry: /* Handle various SYNC-type writes */ if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) { loff_t end = pos + ret - 1; - int error2; + int error, error2; xfs_iunlock(ip, iolock); if (need_i_mutex) mutex_unlock(&inode->i_mutex); - error2 = filemap_write_and_wait_range(mapping, pos, end); - if (!error) - error = error2; + error = filemap_write_and_wait_range(mapping, pos, end); if (need_i_mutex) mutex_lock(&inode->i_mutex); xfs_ilock(ip, iolock); error2 = -xfs_file_fsync(file, (file->f_flags & __O_SYNC) ? 0 : 1); - if (!error) - error = error2; + if (error) + ret = error; + else if (error2) + ret = error2; } out_unlock_internal: @@ -800,7 +797,7 @@ write_retry: out_unlock_mutex: if (need_i_mutex) mutex_unlock(&inode->i_mutex); - return -error; + return ret; } STATIC int -- 1.7.2.3 From SRS0+1hB4+41+fromorbit.com=dave@internode.on.net Fri Jan 7 05:28:55 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p07BStHV039013 for ; Fri, 7 Jan 2011 05:28:55 -0600 X-ASG-Debug-ID: 1294399863-1c4002f60000-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 D02771D160DB for ; Fri, 7 Jan 2011 03:31:03 -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 B0OEiJlly7UQvzpb for ; Fri, 07 Jan 2011 03:31:03 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51828843-1927428 for ; Fri, 07 Jan 2011 22:01:02 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PbAX6-0007he-Qj for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:31:00 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PbAWc-0000JM-0Z for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:30:30 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/8] xfs: prevent corruption due to overlapping AIO DIO V3 Subject: [PATCH 0/8] xfs: prevent corruption due to overlapping AIO DIO V3 Date: Fri, 7 Jan 2011 22:30:17 +1100 Message-Id: <1294399825-1157-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: 1294399864 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5187 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.51680 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 Version 3 to address review comments from Alex and Christoph. From SRS0+1hB4+41+fromorbit.com=dave@internode.on.net Fri Jan 7 05:29:04 2011 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 p07BT4GM039067 for ; Fri, 7 Jan 2011 05:29:04 -0600 X-ASG-Debug-ID: 1294399872-43b000560000-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 392E74F6708 for ; Fri, 7 Jan 2011 03:31:13 -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 Nbqllcluo1rdYslP for ; Fri, 07 Jan 2011 03:31:13 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51828857-1927428 for ; Fri, 07 Jan 2011 22:01:12 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PbAXH-0007hp-01 for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:31:11 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PbAWm-0000JW-7H for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:30:40 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Subject: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Date: Fri, 7 Jan 2011 22:30:21 +1100 Message-Id: <1294399825-1157-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294399825-1157-1-git-send-email-david@fromorbit.com> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1294399874 X-Barracuda-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.51680 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 need to obtain the i_mutex, i_iolock and i_ilock during the read and write paths. Add a set of wrapper functions to neatly encapsulate the lock ordering and shared/exclusive semantics to make the locking easier to follow and get right. Note that this changes some of the exclusive locking serialisation in that serialisation will occur against the i_mutex instead of the XFS_IOLOCK_EXCL. This does not change any behaviour, and it is arguably more efficient to use the mutex for such serialisation than the rw_sem. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_file.c | 130 +++++++++++++++++++++++++------------------ 1 files changed, 75 insertions(+), 55 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index c47d7dc0..ad37965 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -41,6 +41,40 @@ static const struct vm_operations_struct xfs_file_vm_ops; /* + * Locking primitives for read and write IO paths to ensure we consistently use + * and order the inode->i_mutex, ip->i_lock and ip->i_iolock. + */ +static inline void +xfs_rw_ilock( + struct xfs_inode *ip, + int type) +{ + if (type & XFS_IOLOCK_EXCL) + mutex_lock(&VFS_I(ip)->i_mutex); + xfs_ilock(ip, type); +} + +static inline void +xfs_rw_iunlock( + struct xfs_inode *ip, + int type) +{ + xfs_iunlock(ip, type); + if (type & XFS_IOLOCK_EXCL) + mutex_unlock(&VFS_I(ip)->i_mutex); +} + +static inline void +xfs_rw_ilock_demote( + struct xfs_inode *ip, + int type) +{ + xfs_ilock_demote(ip, type); + if (type & XFS_IOLOCK_EXCL) + mutex_unlock(&VFS_I(ip)->i_mutex); +} + +/* * xfs_iozero * * xfs_iozero clears the specified range of buffer supplied, @@ -262,22 +296,21 @@ xfs_file_aio_read( if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; - if (unlikely(ioflags & IO_ISDIRECT)) - mutex_lock(&inode->i_mutex); - xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (unlikely(ioflags & IO_ISDIRECT)) { + xfs_rw_ilock(ip, XFS_IOLOCK_EXCL); + if (inode->i_mapping->nrpages) { ret = -xfs_flushinval_pages(ip, (iocb->ki_pos & PAGE_CACHE_MASK), -1, FI_REMAPF_LOCKED); + if (ret) { + xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); + return ret; + } } - mutex_unlock(&inode->i_mutex); - if (ret) { - xfs_iunlock(ip, XFS_IOLOCK_SHARED); - return ret; - } - } + xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); + } else + xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); trace_xfs_file_read(ip, size, iocb->ki_pos, ioflags); @@ -285,7 +318,7 @@ xfs_file_aio_read( if (ret > 0) XFS_STATS_ADD(xs_read_bytes, ret); - xfs_iunlock(ip, XFS_IOLOCK_SHARED); + xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); return ret; } @@ -309,7 +342,7 @@ xfs_file_splice_read( if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return -EIO; - xfs_ilock(ip, XFS_IOLOCK_SHARED); + xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); trace_xfs_file_splice_read(ip, count, *ppos, ioflags); @@ -317,7 +350,7 @@ xfs_file_splice_read( if (ret > 0) XFS_STATS_ADD(xs_read_bytes, ret); - xfs_iunlock(ip, XFS_IOLOCK_SHARED); + xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); return ret; } @@ -338,10 +371,10 @@ xfs_aio_write_isize_update( *ppos = isize; if (*ppos > ip->i_size) { - xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_rw_ilock(ip, XFS_ILOCK_EXCL); if (*ppos > ip->i_size) ip->i_size = *ppos; - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); } } @@ -356,11 +389,11 @@ xfs_aio_write_newsize_update( struct xfs_inode *ip) { if (ip->i_new_size) { - xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_rw_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_rw_iunlock(ip, XFS_ILOCK_EXCL); } } @@ -386,14 +419,13 @@ xfs_file_splice_write( if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return -EIO; - xfs_ilock(ip, XFS_IOLOCK_EXCL); + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL); new_size = *ppos + count; - xfs_ilock(ip, XFS_ILOCK_EXCL); if (new_size > ip->i_size) ip->i_new_size = new_size; - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); trace_xfs_file_splice_write(ip, count, *ppos, ioflags); @@ -401,7 +433,7 @@ xfs_file_splice_write( xfs_aio_write_isize_update(inode, ppos, ret); xfs_aio_write_newsize_update(ip); - xfs_iunlock(ip, XFS_IOLOCK_EXCL); + xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); return ret; } @@ -604,7 +636,6 @@ xfs_file_aio_write( xfs_fsize_t new_size; int iolock; size_t ocount = 0, count; - int need_i_mutex; XFS_STATS_INC(xs_write_calls); @@ -631,21 +662,17 @@ xfs_file_aio_write( 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); } - xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); - start: + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|iolock); ret = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); if (ret) { - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); - goto out_unlock_mutex; + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); + return ret; } if (ioflags & IO_ISDIRECT) { @@ -654,16 +681,20 @@ start: mp->m_rtdev_targp : mp->m_ddev_targp; if ((pos & target->bt_smask) || (count & target->bt_smask)) { - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); + xfs_rw_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); + /* + * For direct I/O, if there are cached pages or we're extending + * the file, we need IOLOCK_EXCL until we're sure the bytes at + * the new EOF have been zeroed and/or the cached pages are + * flushed out. Upgrade the I/O lock and start again. + */ + if (iolock != XFS_IOLOCK_EXCL && + (mapping->nrpages || pos > ip->i_size)) { + xfs_rw_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; } } @@ -687,11 +718,11 @@ start: if (pos > ip->i_size) { ret = -xfs_zero_eof(ip, pos, ip->i_size); if (ret) { - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); goto out_unlock_internal; } } - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); /* * If we're writing the file then make sure to clear the @@ -708,7 +739,7 @@ start: if ((ioflags & IO_ISDIRECT)) { if (mapping->nrpages) { - WARN_ON(need_i_mutex == 0); + WARN_ON(iolock != XFS_IOLOCK_EXCL); ret = -xfs_flushinval_pages(ip, (pos & PAGE_CACHE_MASK), -1, FI_REMAPF_LOCKED); @@ -716,13 +747,10 @@ start: goto out_unlock_internal; } - if (need_i_mutex) { + if (iolock == XFS_IOLOCK_EXCL) { /* demote the lock now the cached pages are gone */ - xfs_ilock_demote(ip, XFS_IOLOCK_EXCL); - mutex_unlock(&inode->i_mutex); - + xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); iolock = XFS_IOLOCK_SHARED; - need_i_mutex = 0; } trace_xfs_file_direct_write(ip, count, iocb->ki_pos, ioflags); @@ -740,7 +768,7 @@ start: count -= ret; ioflags &= ~IO_ISDIRECT; - xfs_iunlock(ip, iolock); + xfs_rw_iunlock(ip, iolock); goto relock; } } else { @@ -775,14 +803,9 @@ write_retry: loff_t end = pos + ret - 1; int error, error2; - xfs_iunlock(ip, iolock); - if (need_i_mutex) - mutex_unlock(&inode->i_mutex); - + xfs_rw_iunlock(ip, iolock); error = filemap_write_and_wait_range(mapping, pos, end); - if (need_i_mutex) - mutex_lock(&inode->i_mutex); - xfs_ilock(ip, iolock); + xfs_rw_ilock(ip, iolock); error2 = -xfs_file_fsync(file, (file->f_flags & __O_SYNC) ? 0 : 1); @@ -794,10 +817,7 @@ write_retry: out_unlock_internal: xfs_aio_write_newsize_update(ip); - xfs_iunlock(ip, iolock); - out_unlock_mutex: - if (need_i_mutex) - mutex_unlock(&inode->i_mutex); + xfs_rw_iunlock(ip, iolock); return ret; } -- 1.7.2.3 From SRS0+FBYn+41+fromorbit.com=dave@internode.on.net Fri Jan 7 05:29:05 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p07BT5Q5039078 for ; Fri, 7 Jan 2011 05:29:05 -0600 X-ASG-Debug-ID: 1294399872-55c502cf0000-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 1E62D1539BB5 for ; Fri, 7 Jan 2011 03:31: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 wbdqJbU5MBAid75a for ; Fri, 07 Jan 2011 03:31:13 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52125626-1927428 for ; Fri, 07 Jan 2011 22:01:12 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PbAXG-0007hn-T5 for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:31:10 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PbAWm-0000JQ-35 for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:30:40 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/8] xfs: factor common post-write isize handling code Subject: [PATCH 2/8] xfs: factor common post-write isize handling code Date: Fri, 7 Jan 2011 22:30:19 +1100 Message-Id: <1294399825-1157-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294399825-1157-1-git-send-email-david@fromorbit.com> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1294399875 X-Barracuda-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.51679 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 Signed-off-by: Dave Chinner Reviewed-by: Alex Elder --- fs/xfs/linux-2.6/xfs_file.c | 54 ++++++++++++++++++++++-------------------- 1 files changed, 28 insertions(+), 26 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 10b7fb4..b3915bf 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; 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; @@ -740,22 +753,11 @@ 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); if (ret <= 0) goto out_unlock_internal; - XFS_STATS_ADD(xs_write_bytes, ret); - /* Handle various SYNC-type writes */ if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) { loff_t end = pos + ret - 1; -- 1.7.2.3 From SRS0+1hB4+41+fromorbit.com=dave@internode.on.net Fri Jan 7 05:29:14 2011 X-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 p07BTEpE039124 for ; Fri, 7 Jan 2011 05:29:14 -0600 X-ASG-Debug-ID: 1294399882-155703860000-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 0FE8B1D160DE for ; Fri, 7 Jan 2011 03:31:23 -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 q3NfgSQOc7ydDcVk for ; Fri, 07 Jan 2011 03:31:23 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51828865-1927428 for ; Fri, 07 Jan 2011 22:01:22 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PbAXR-0007hx-3T for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:31:21 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PbAWw-0000Ja-85 for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:30:50 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write Subject: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write Date: Fri, 7 Jan 2011 22:30:22 +1100 Message-Id: <1294399825-1157-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294399825-1157-1-git-send-email-david@fromorbit.com> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1294399884 X-Barracuda-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.51680 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 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. This also removes the failed direct IO fallback path to buffered IO. XFS handles all direct IO cases without needing to fall back to buffered IO, so we can safely remove this unused path. This greatly simplifies the logic and locking needed in the write path. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_file.c | 179 ++++++++++++++++++++++++++++--------------- 1 files changed, 116 insertions(+), 63 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index ad37965..2d55648 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -619,6 +619,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. + * + * Returns with locks held indicated by @iolock and errors indicated by + * negative return values. + */ +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 *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; + xfs_fsize_t new_size; + size_t count = ocount; + struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? + mp->m_rtdev_targp : mp->m_ddev_targp; + + *iolock = 0; + if ((pos & target->bt_smask) || (count & target->bt_smask)) + return -XFS_ERROR(EINVAL); + + /* + * For direct I/O, if there are cached pages or we're extending + * the file, we need IOLOCK_EXCL until we're sure the bytes at + * the new EOF have been zeroed and/or the cached pages are + * flushed out. + */ + if (mapping->nrpages || pos > ip->i_size) + *iolock = XFS_IOLOCK_EXCL; + else + *iolock = XFS_IOLOCK_SHARED; + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|*iolock); + + ret = generic_write_checks(file, &pos, &count, + S_ISBLK(inode->i_mode)); + if (ret) { + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|*iolock); + *iolock = 0; + return ret; + } + + 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) { + ret = -xfs_zero_eof(ip, pos, ip->i_size); + if (ret) { + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); + return ret; + } + } + xfs_rw_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. + */ + ret = file_remove_suid(file); + if (unlikely(ret)) + return ret; + + if (mapping->nrpages) { + WARN_ON(*iolock != XFS_IOLOCK_EXCL); + ret = -xfs_flushinval_pages(ip, (pos & PAGE_CACHE_MASK), -1, + FI_REMAPF_LOCKED); + if (ret) + return ret; + } + + if (*iolock == XFS_IOLOCK_EXCL) { + /* demote the lock now the cached pages are gone */ + xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); + *iolock = XFS_IOLOCK_SHARED; + } + + trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0); + ret = generic_file_direct_write(iocb, iovp, + &nr_segs, pos, &iocb->ki_pos, count, ocount); + + /* No fallback to buffered IO on errors for XFS. */ + ASSERT(ret < 0 || ret == count); + return ret; +} + STATIC ssize_t xfs_file_aio_write( struct kiocb *iocb, @@ -661,12 +771,12 @@ xfs_file_aio_write( relock: if (ioflags & IO_ISDIRECT) { - iolock = XFS_IOLOCK_SHARED; - } else { - iolock = XFS_IOLOCK_EXCL; + ret = xfs_file_dio_aio_write(iocb, iovp, nr_segs, pos, + ocount, &iolock); + goto done_io; } + iolock = XFS_IOLOCK_EXCL; -start: xfs_rw_ilock(ip, XFS_ILOCK_EXCL|iolock); ret = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); @@ -675,30 +785,6 @@ start: return ret; } - 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_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); - return XFS_ERROR(-EINVAL); - } - - /* - * For direct I/O, if there are cached pages or we're extending - * the file, we need IOLOCK_EXCL until we're sure the bytes at - * the new EOF have been zeroed and/or the cached pages are - * flushed out. Upgrade the I/O lock and start again. - */ - if (iolock != XFS_IOLOCK_EXCL && - (mapping->nrpages || pos > ip->i_size)) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); - iolock = XFS_IOLOCK_EXCL; - goto start; - } - } - new_size = pos + count; if (new_size > ip->i_size) ip->i_new_size = new_size; @@ -737,41 +823,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(iolock != XFS_IOLOCK_EXCL); - ret = -xfs_flushinval_pages(ip, - (pos & PAGE_CACHE_MASK), - -1, FI_REMAPF_LOCKED); - if (ret) - goto out_unlock_internal; - } - - if (iolock == XFS_IOLOCK_EXCL) { - /* demote the lock now the cached pages are gone */ - xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); - iolock = XFS_IOLOCK_SHARED; - } - - 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_rw_iunlock(ip, iolock); - goto relock; - } - } else { + if (!(ioflags & IO_ISDIRECT)) { int enospc = 0; write_retry: @@ -793,6 +845,7 @@ write_retry: current->backing_dev_info = NULL; +done_io: xfs_aio_write_isize_update(inode, &iocb->ki_pos, ret); if (ret <= 0) -- 1.7.2.3 From SRS0+1hB4+41+fromorbit.com=dave@internode.on.net Fri Jan 7 05:29:15 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p07BTEZ3039126 for ; Fri, 7 Jan 2011 05:29:14 -0600 X-ASG-Debug-ID: 1294399882-36d903d60000-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 6F1261539BB9 for ; Fri, 7 Jan 2011 03:31:23 -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 uvvOF2GthYX9Pj6d for ; Fri, 07 Jan 2011 03:31:23 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 40653042-1927428 for ; Fri, 07 Jan 2011 22:01:22 +1030 (CDT) Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PbAXQ-0007ho-ST for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:31:20 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PbAWm-0000JU-50 for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:30:40 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/8] xfs: factor post-write newsize updates Subject: [PATCH 3/8] xfs: factor post-write newsize updates Date: Fri, 7 Jan 2011 22:30:20 +1100 Message-Id: <1294399825-1157-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294399825-1157-1-git-send-email-david@fromorbit.com> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1294399884 X-Barracuda-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.51679 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 Signed-off-by: Dave Chinner Reviewed-by: Alex Elder --- 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 b3915bf..c47d7dc0 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; } @@ -781,20 +793,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+kvVY+41+fromorbit.com=dave@internode.on.net Fri Jan 7 05:29:15 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p07BTFH3039135 for ; Fri, 7 Jan 2011 05:29:15 -0600 X-ASG-Debug-ID: 1294399883-43b200480000-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 0F6984F674C for ; Fri, 7 Jan 2011 03:31:23 -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 cjjmD1Drw3MKLMOB for ; Fri, 07 Jan 2011 03:31:23 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51857746-1927428 for ; Fri, 07 Jan 2011 22:01:22 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PbAXR-0007i3-8m for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:31:21 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PbAWw-0000Jo-Fj for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:30:50 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 8/8] xfs: serialise unaligned direct IOs Subject: [PATCH 8/8] xfs: serialise unaligned direct IOs Date: Fri, 7 Jan 2011 22:30:25 +1100 Message-Id: <1294399825-1157-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294399825-1157-1-git-send-email-david@fromorbit.com> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1294399885 X-Barracuda-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.51680 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 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 Reviewed-by: Alex Elder --- fs/xfs/linux-2.6/xfs_file.c | 38 ++++++++++++++++++++++++++++---------- 1 files changed, 28 insertions(+), 10 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index d6ff7ff..5c1402c 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -677,9 +677,24 @@ 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. * + * If there are cached pages or we're extending the file, we need IOLOCK_EXCL + * until we're sure the bytes at the new EOF have been zeroed and/or the cached + * pages are flushed out. + * + * In most cases the direct IO writes will be done holding 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 @iolock and errors indicated by * negative return values. */ @@ -699,6 +714,7 @@ xfs_file_dio_aio_write( struct xfs_mount *mp = ip->i_mount; ssize_t ret = 0; size_t count = ocount; + int unaligned_io = 0; struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; @@ -706,13 +722,10 @@ xfs_file_dio_aio_write( if ((pos & target->bt_smask) || (count & target->bt_smask)) return -XFS_ERROR(EINVAL); - /* - * For direct I/O, if there are cached pages or we're extending - * the file, we need IOLOCK_EXCL until we're sure the bytes at - * the new EOF have been zeroed and/or the cached pages are - * flushed out. - */ - 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; else *iolock = XFS_IOLOCK_SHARED; @@ -729,8 +742,13 @@ xfs_file_dio_aio_write( return ret; } - if (*iolock == XFS_IOLOCK_EXCL) { - /* demote the lock now the cached pages are gone */ + /* + * If we are doing unaligned IO, wait for all other IO to drain, + * otherwise demote the lock if we had to flush cached pages + */ + if (unaligned_io) + xfs_ioend_wait(ip); + else if (*iolock == XFS_IOLOCK_EXCL) { xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); *iolock = XFS_IOLOCK_SHARED; } -- 1.7.2.3 From SRS0++Kwz+41+fromorbit.com=dave@internode.on.net Fri Jan 7 05:29:16 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p07BTFRj039147 for ; Fri, 7 Jan 2011 05:29:15 -0600 X-ASG-Debug-ID: 1294399883-649801f40000-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 170491539BBD for ; Fri, 7 Jan 2011 03:31:23 -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 paCgOC6YIeMOj9mj for ; Fri, 07 Jan 2011 03:31:23 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 6797298-1927428 for ; Fri, 07 Jan 2011 22:01:22 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PbAXR-0007i0-52 for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:31:21 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PbAWw-0000Ji-BV for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:30:50 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 6/8] xfs: split buffered IO write path from xfs_file_aio_write Subject: [PATCH 6/8] xfs: split buffered IO write path from xfs_file_aio_write Date: Fri, 7 Jan 2011 22:30:23 +1100 Message-Id: <1294399825-1157-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294399825-1157-1-git-send-email-david@fromorbit.com> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1294399885 X-Barracuda-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.51679 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 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 Reviewed-by: Alex Elder --- fs/xfs/linux-2.6/xfs_file.c | 146 ++++++++++++++++++++----------------------- 1 files changed, 69 insertions(+), 77 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 2d55648..9ce5e12 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -730,58 +730,31 @@ 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 *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; - int ioflags = 0; + ssize_t ret; + int enospc = 0; xfs_fsize_t new_size; - int iolock; - size_t ocount = 0, count; - - 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; - - ret = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); - if (ret) - return ret; - - count = ocount; - if (count == 0) - return 0; - - xfs_wait_for_freeze(mp, SB_FREEZE_WRITE); - - if (XFS_FORCED_SHUTDOWN(mp)) - return -EIO; + size_t count = ocount; -relock: - if (ioflags & IO_ISDIRECT) { - ret = xfs_file_dio_aio_write(iocb, iovp, nr_segs, pos, - ocount, &iolock); - goto done_io; - } - iolock = XFS_IOLOCK_EXCL; + *iolock = XFS_IOLOCK_EXCL; + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|*iolock); - xfs_rw_ilock(ip, XFS_ILOCK_EXCL|iolock); ret = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|*iolock); + *iolock = 0; return ret; } @@ -789,67 +762,86 @@ relock: 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) { ret = -xfs_zero_eof(ip, pos, ip->i_size); if (ret) { xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); - goto out_unlock_internal; + return ret; } } xfs_rw_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. - */ ret = file_remove_suid(file); if (unlikely(ret)) - goto out_unlock_internal; + return ret; /* We can write back this queue in page reclaim */ current->backing_dev_info = mapping->backing_dev_info; - if (!(ioflags & IO_ISDIRECT)) { - int enospc = 0; - write_retry: - trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, ioflags); - ret = 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 (ret == -ENOSPC && !enospc) { - ret = xfs_flush_pages(ip, 0, -1, 0, FI_NONE); - if (ret) - goto out_unlock_internal; - enospc = 1; - goto write_retry; - } + trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, 0); + ret = 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 (ret == -ENOSPC && !enospc) { + ret = -xfs_flush_pages(ip, 0, -1, 0, FI_NONE); + if (ret) + return ret; + enospc = 1; + goto write_retry; } - current->backing_dev_info = NULL; + return ret; +} + +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; + int iolock; + size_t ocount = 0; + + XFS_STATS_INC(xs_write_calls); + + BUG_ON(iocb->ki_pos != pos); + + ret = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); + if (ret) + return ret; + + 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, &iolock); + else + ret = xfs_file_buffered_aio_write(iocb, iovp, nr_segs, pos, + ocount, &iolock); -done_io: xfs_aio_write_isize_update(inode, &iocb->ki_pos, ret); if (ret <= 0) - goto out_unlock_internal; + goto out_unlock; /* Handle various SYNC-type writes */ if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) { @@ -868,7 +860,7 @@ done_io: ret = error2; } - out_unlock_internal: +out_unlock: xfs_aio_write_newsize_update(ip); xfs_rw_iunlock(ip, iolock); return ret; -- 1.7.2.3 From SRS0+TIHT+41+fromorbit.com=dave@internode.on.net Fri Jan 7 05:29:16 2011 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 p07BTGDJ039162 for ; Fri, 7 Jan 2011 05:29:16 -0600 X-ASG-Debug-ID: 1294399884-33c9010d0000-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 273B84F674E for ; Fri, 7 Jan 2011 03:31:25 -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 qVMRE2B4E8ZVXkNp for ; Fri, 07 Jan 2011 03:31:25 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51508760-1927428 for ; Fri, 07 Jan 2011 22:01:23 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PbAXR-0007i1-75 for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:31:21 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PbAWw-0000Jl-Dl for xfs@oss.sgi.com; Fri, 07 Jan 2011 22:30:50 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 7/8] xfs: factor common write setup code Subject: [PATCH 7/8] xfs: factor common write setup code Date: Fri, 7 Jan 2011 22:30:24 +1100 Message-Id: <1294399825-1157-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294399825-1157-1-git-send-email-david@fromorbit.com> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1294399886 X-Barracuda-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.51680 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 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 Reviewed-by: Alex Elder --- fs/xfs/linux-2.6/xfs_file.c | 128 +++++++++++++++++++----------------------- 1 files changed, 58 insertions(+), 70 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 9ce5e12..d6ff7ff 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -620,6 +620,60 @@ 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 = 0; + + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|*iolock); + + error = generic_write_checks(file, pos, count, S_ISBLK(inode->i_mode)); + if (error) { + xfs_rw_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); + + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); + if (error) + return error; + + /* + * 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. + */ + return file_remove_suid(file); + +} + +/* * xfs_file_dio_aio_write - handle direct IO writes * * Lock the inode appropriately to prepare for and issue a direct IO write. @@ -644,7 +698,6 @@ xfs_file_dio_aio_write( struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; ssize_t ret = 0; - xfs_fsize_t new_size; size_t count = ocount; struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; @@ -663,47 +716,9 @@ xfs_file_dio_aio_write( *iolock = XFS_IOLOCK_EXCL; else *iolock = XFS_IOLOCK_SHARED; - xfs_rw_ilock(ip, XFS_ILOCK_EXCL|*iolock); - - ret = generic_write_checks(file, &pos, &count, - S_ISBLK(inode->i_mode)); - if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|*iolock); - *iolock = 0; - return ret; - } - - 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) { - ret = -xfs_zero_eof(ip, pos, ip->i_size); - if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); - return ret; - } - } - xfs_rw_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. - */ - ret = file_remove_suid(file); - if (unlikely(ret)) + ret = xfs_file_aio_write_checks(file, &pos, &count, iolock); + if (ret) return ret; if (mapping->nrpages) { @@ -744,38 +759,11 @@ xfs_file_buffered_aio_write( struct xfs_inode *ip = XFS_I(inode); ssize_t ret; int enospc = 0; - xfs_fsize_t new_size; size_t count = ocount; *iolock = XFS_IOLOCK_EXCL; - xfs_rw_ilock(ip, XFS_ILOCK_EXCL|*iolock); - - ret = generic_write_checks(file, &pos, &count, - S_ISBLK(inode->i_mode)); - if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|*iolock); - *iolock = 0; - return ret; - } - - 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) { - ret = -xfs_zero_eof(ip, pos, ip->i_size); - if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); - return ret; - } - } - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); - - ret = file_remove_suid(file); - if (unlikely(ret)) + ret = xfs_file_aio_write_checks(file, &pos, &count, iolock); + if (ret) return ret; /* We can write back this queue in page reclaim */ -- 1.7.2.3 From BATV+63a2e70d0cd1afb6cd6a+2693+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 7 06:52:48 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p07CqlV6051726 for ; Fri, 7 Jan 2011 06:52:48 -0600 X-ASG-Debug-ID: 1294404897-6b6302e10000-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 36A541D1627D for ; Fri, 7 Jan 2011 04:54:57 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id AkJiSPBKe6J6oFxe for ; Fri, 07 Jan 2011 04:54:57 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PbBqK-0001nZ-H5; Fri, 07 Jan 2011 12:54:56 +0000 Date: Fri, 7 Jan 2011 07:54:56 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] xfstests 241: run longer Subject: Re: [PATCH] xfstests 241: run longer Message-ID: <20110107125456.GA6811@infradead.org> References: <4D25FF79.6070207@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D25FF79.6070207@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: 1294404897 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, Jan 06, 2011 at 11:44:25AM -0600, Eric Sandeen wrote: > I ran into a failure on an ext4 backport which should have > been caught by this test, but 30s wasn't long enough to > hit it reliably. So run a bit longer; it's not in the > quick group anyway. Looks good, Reviewed-by: Christoph Hellwig From BATV+63a2e70d0cd1afb6cd6a+2693+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 7 06:53:04 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (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 p07Cr4FA051755 for ; Fri, 7 Jan 2011 06:53:04 -0600 X-ASG-Debug-ID: 1294404914-6b6302e40000-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 C92861D16346; Fri, 7 Jan 2011 04:55:14 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id TzCdmYmbp1GxmLCS; Fri, 07 Jan 2011 04:55:14 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PbBqb-0002QS-5e; Fri, 07 Jan 2011 12:55:13 +0000 Date: Fri, 7 Jan 2011 07:55:13 -0500 From: Christoph Hellwig To: Anton Blanchard Cc: Alex Elder , Dave Chinner , Christoph Hellwig , xfs-masters@oss.sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: Add log level to assertion printk Subject: Re: xfs: Add log level to assertion printk Message-ID: <20110107125513.GB6811@infradead.org> References: <20110107143041.1d07e34f@kryten> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110107143041.1d07e34f@kryten> 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: 1294404914 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, Jan 07, 2011 at 02:30:41PM +1100, Anton Blanchard wrote: > > I received a ppc64 bug report involving xfs but the assertion was filtered out > by the console log level. Use KERN_CRIT to ensure it makes it out. > > Signed-off-by: Anton Blanchard Looks good, Reviewed-by: Christoph Hellwig From BATV+63a2e70d0cd1afb6cd6a+2693+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 7 06:59:56 2011 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_00,J_CHICKENPOX_53, J_CHICKENPOX_64,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 p07CxtlZ052608 for ; Fri, 7 Jan 2011 06:59:55 -0600 X-ASG-Debug-ID: 1294405325-127502f80000-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 8393D153A109 for ; Fri, 7 Jan 2011 05:02:05 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id xiHl5fekQMAYbZqG for ; Fri, 07 Jan 2011 05:02:05 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PbBxE-0003Ai-OO for xfs@oss.sgi.com; Fri, 07 Jan 2011 13:02:04 +0000 Date: Fri, 7 Jan 2011 08:02:04 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH v3] xfs: add FITRIM support Subject: [PATCH v3] xfs: add FITRIM support Message-ID: <20110107130204.GA12134@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: 1294405325 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 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 Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2011-01-05 17:54:46.795005538 +0100 +++ xfs/fs/xfs/xfs_alloc.c 2011-01-07 13:48:07.540253827 +0100 @@ -41,10 +41,6 @@ #define XFSA_FIXUP_BNO_OK 1 #define XFSA_FIXUP_CNT_OK 2 -static int -xfs_alloc_busy_search(struct xfs_mount *mp, xfs_agnumber_t agno, - xfs_agblock_t bno, xfs_extlen_t len); - /* * Prototypes for per-ag allocation routines */ @@ -94,7 +90,7 @@ xfs_alloc_lookup_ge( * Lookup the first record less than or equal to [bno, len] * in the btree given by cur. */ -STATIC int /* error */ +int /* error */ xfs_alloc_lookup_le( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agblock_t bno, /* starting block of extent */ @@ -127,7 +123,7 @@ xfs_alloc_update( /* * Get the data from the pointed-to record. */ -STATIC int /* error */ +int /* error */ xfs_alloc_get_rec( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agblock_t *bno, /* output: starting block of extent */ @@ -2615,7 +2611,7 @@ restart: * will require a synchronous transaction, but it can still be * used to distinguish between a partial or exact match. */ -static int +int xfs_alloc_busy_search( struct xfs_mount *mp, xfs_agnumber_t agno, Index: xfs/fs/xfs/xfs_alloc.h =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.h 2011-01-05 17:54:46.796024256 +0100 +++ xfs/fs/xfs/xfs_alloc.h 2011-01-07 08:12:28.479274081 +0100 @@ -19,6 +19,7 @@ #define __XFS_ALLOC_H__ struct xfs_buf; +struct xfs_btree_cur; struct xfs_mount; struct xfs_perag; struct xfs_trans; @@ -118,16 +119,16 @@ xfs_alloc_longest_free_extent(struct xfs struct xfs_perag *pag); #ifdef __KERNEL__ - void -xfs_alloc_busy_insert(xfs_trans_t *tp, - xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len); +xfs_alloc_busy_insert(struct xfs_trans *tp, xfs_agnumber_t agno, + xfs_agblock_t bno, xfs_extlen_t len); void xfs_alloc_busy_clear(struct xfs_mount *mp, struct xfs_busy_extent *busyp); +int +xfs_alloc_busy_search(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_agblock_t bno, xfs_extlen_t len); #endif /* __KERNEL__ */ /* @@ -205,4 +206,18 @@ xfs_free_extent( xfs_fsblock_t bno, /* starting block number of extent */ xfs_extlen_t len); /* length of extent */ +int /* error */ +xfs_alloc_lookup_le( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_agblock_t bno, /* starting block of extent */ + xfs_extlen_t len, /* length of extent */ + int *stat); /* success/failure */ + +int /* error */ +xfs_alloc_get_rec( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_agblock_t *bno, /* output: starting block of extent */ + xfs_extlen_t *len, /* output: length of extent */ + int *stat); /* output: success/failure */ + #endif /* __XFS_ALLOC_H__ */ Index: xfs/fs/xfs/Makefile =================================================================== --- xfs.orig/fs/xfs/Makefile 2011-01-05 17:54:46.773007283 +0100 +++ xfs/fs/xfs/Makefile 2011-01-07 08:12:28.482026281 +0100 @@ -98,6 +98,7 @@ xfs-y += $(addprefix $(XFS_LINUX)/, \ kmem.o \ xfs_aops.o \ xfs_buf.o \ + xfs_discard.o \ xfs_export.o \ xfs_file.o \ xfs_fs_subr.o \ Index: xfs/fs/xfs/linux-2.6/xfs_discard.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfs/fs/xfs/linux-2.6/xfs_discard.c 2011-01-07 13:49:08.512253478 +0100 @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2010 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" +#include "xfs_sb.h" +#include "xfs_inum.h" +#include "xfs_log.h" +#include "xfs_ag.h" +#include "xfs_mount.h" +#include "xfs_quota.h" +#include "xfs_trans.h" +#include "xfs_alloc_btree.h" +#include "xfs_bmap_btree.h" +#include "xfs_ialloc_btree.h" +#include "xfs_btree.h" +#include "xfs_inode.h" +#include "xfs_alloc.h" +#include "xfs_error.h" +#include "xfs_discard.h" +#include "xfs_trace.h" + +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, + __uint64_t *blocks_trimmed) +{ + 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, 0, &agbp); + if (error || !agbp) + 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; + *blocks_trimmed += flen; + +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 __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; + __uint64_t blocks_trimmed = 0; + 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. + */ + 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, + &blocks_trimmed); + if (error) + last_error = error; + } + + if (last_error) + return last_error; + + range.len = XFS_FSB_TO_B(mp, blocks_trimmed); + if (copy_to_user(urange, &range, sizeof(range))) + return -XFS_ERROR(EFAULT); + return 0; +} Index: xfs/fs/xfs/linux-2.6/xfs_discard.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfs/fs/xfs/linux-2.6/xfs_discard.h 2011-01-07 08:12:28.486026770 +0100 @@ -0,0 +1,8 @@ +#ifndef XFS_DISCARD_H +#define XFS_DISCARD_H 1 + +struct fstrim_range; + +extern int xfs_ioc_trim(struct xfs_mount *, struct fstrim_range __user *); + +#endif /* XFS_DISCARD_H */ Index: xfs/fs/xfs/linux-2.6/xfs_trace.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.h 2011-01-05 18:18:20.035254106 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_trace.h 2011-01-07 13:48:07.424253827 +0100 @@ -1759,6 +1759,39 @@ DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_reco DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_recover_inode_cancel); DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_recover_inode_skip); +DECLARE_EVENT_CLASS(xfs_discard_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_agblock_t agbno, xfs_extlen_t len), + TP_ARGS(mp, agno, agbno, len), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, agbno) + __field(xfs_extlen_t, len) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->agbno = agbno; + __entry->len = len; + ), + TP_printk("dev %d:%d agno %u agbno %u len %u\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->agbno, + __entry->len) +) + +#define DEFINE_DISCARD_EVENT(name) \ +DEFINE_EVENT(xfs_discard_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ + xfs_agblock_t agbno, xfs_extlen_t len), \ + TP_ARGS(mp, agno, agbno, len)) +DEFINE_DISCARD_EVENT(xfs_discard_extent); +DEFINE_DISCARD_EVENT(xfs_discard_toosmall); +DEFINE_DISCARD_EVENT(xfs_discard_exclude); +DEFINE_DISCARD_EVENT(xfs_discard_busy); + #endif /* _TRACE_XFS_H */ #undef TRACE_INCLUDE_PATH Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2011-01-05 17:54:46.784005119 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c 2011-01-07 08:12:28.491010357 +0100 @@ -39,6 +39,7 @@ #include "xfs_dfrag.h" #include "xfs_fsops.h" #include "xfs_vnodeops.h" +#include "xfs_discard.h" #include "xfs_quota.h" #include "xfs_inode_item.h" #include "xfs_export.h" @@ -1294,6 +1295,8 @@ xfs_file_ioctl( trace_xfs_file_ioctl(ip); switch (cmd) { + case FITRIM: + return xfs_ioc_trim(mp, arg); case XFS_IOC_ALLOCSP: case XFS_IOC_FREESP: case XFS_IOC_RESVSP: From BATV+63a2e70d0cd1afb6cd6a+2693+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 7 07:00:13 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p07D0Da0052693 for ; Fri, 7 Jan 2011 07:00:13 -0600 X-ASG-Debug-ID: 1294405343-7394024c0000-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 9ED961D16396 for ; Fri, 7 Jan 2011 05:02:23 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 5GJ4dHxakitgHthR for ; Fri, 07 Jan 2011 05:02:23 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PbBxX-0003As-6W for xfs@oss.sgi.com; Fri, 07 Jan 2011 13:02:23 +0000 Date: Fri, 7 Jan 2011 08:02:23 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: fix error handling for synchronous writes Subject: [PATCH] xfs: fix error handling for synchronous writes Message-ID: <20110107130223.GB12134@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: 1294405343 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 If we get an IO error on a synchronous superblock write, we attach an error release function to it so that when the last reference goes away the release function is called and the buffer is invalidated and unlocked. The buffer is left locked until the release function is called so that other concurrent users of the buffer will be locked out until the buffer error is fully processed. Unfortunately, for the superblock buffer the filesyetm itself holds a reference to the buffer which prevents the reference count from dropping to zero and the release function being called. As a result, once an IO error occurs on a sync write, the buffer will never be unlocked and all future attempts to lock the buffer will hang. To make matters worse, this problems is not unique to such buffers; if there is a concurrent _xfs_buf_find() running, the lookup will grab a reference to the buffer and then wait on the buffer lock, preventing the reference count from ever falling to zero and hence unlocking the buffer. As such, the whole b_relse function implementation is broken because it cannot rely on the buffer reference count falling to zero to unlock the errored buffer. The synchronous write error path is the only path that uses this callback - it is used to ensure that the synchronous waiter gets the buffer error before the error state is cleared from the buffer by the release function. Given that the only sychronous buffer writes now go through xfs_bwrite and the error path in question can only occur for a write of a dirty, logged buffer, we can move most of the b_relse processing to happen inline in xfs_buf_iodone_callbacks, just like a normal I/O completion. In addition to that we make sure the error is not cleared in xfs_buf_iodone_callbacks, so that xfs_bwrite can reliably check it. Given that xfs_bwrite keeps the buffer locked until it has waited for it and checked the error this allows to reliably propagate the error to the caller, and make sure that the buffer is reliably unlocked. Given that xfs_buf_iodone_callbacks was the only instance of the b_relse callback we can remove it entirely. Based on earlier patches by Dave Chinner and Ajeet Yadav. Signed-off-by: Christoph Hellwig Reported-by: Ajeet Yadav Index: xfs/fs/xfs/linux-2.6/xfs_buf.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.h 2011-01-04 09:42:44.763003651 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_buf.h 2011-01-04 09:54:08.443255013 +0100 @@ -152,8 +152,6 @@ typedef struct xfs_buftarg { struct xfs_buf; typedef void (*xfs_buf_iodone_t)(struct xfs_buf *); -typedef void (*xfs_buf_relse_t)(struct xfs_buf *); -typedef int (*xfs_buf_bdstrat_t)(struct xfs_buf *); #define XB_PAGES 2 @@ -183,7 +181,6 @@ typedef struct xfs_buf { void *b_addr; /* virtual address of buffer */ struct work_struct b_iodone_work; xfs_buf_iodone_t b_iodone; /* I/O completion function */ - xfs_buf_relse_t b_relse; /* releasing function */ struct completion b_iowait; /* queue for I/O waiters */ void *b_fspriv; void *b_fspriv2; @@ -323,7 +320,6 @@ void xfs_buf_stale(struct xfs_buf *bp); #define XFS_BUF_FSPRIVATE2(bp, type) ((type)(bp)->b_fspriv2) #define XFS_BUF_SET_FSPRIVATE2(bp, val) ((bp)->b_fspriv2 = (void*)(val)) #define XFS_BUF_SET_START(bp) do { } while (0) -#define XFS_BUF_SET_BRELSE_FUNC(bp, func) ((bp)->b_relse = (func)) #define XFS_BUF_PTR(bp) (xfs_caddr_t)((bp)->b_addr) #define XFS_BUF_SET_PTR(bp, val, cnt) xfs_buf_associate_memory(bp, val, cnt) @@ -360,8 +356,7 @@ xfs_buf_set_ref( static inline void xfs_buf_relse(xfs_buf_t *bp) { - if (!bp->b_relse) - xfs_buf_unlock(bp); + xfs_buf_unlock(bp); xfs_buf_rele(bp); } Index: xfs/fs/xfs/xfs_buf_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.c 2011-01-04 09:42:44.779005117 +0100 +++ xfs/fs/xfs/xfs_buf_item.c 2011-01-04 09:47:40.798004000 +0100 @@ -141,7 +141,6 @@ xfs_buf_item_log_check( #define xfs_buf_item_log_check(x) #endif -STATIC void xfs_buf_error_relse(xfs_buf_t *bp); STATIC void xfs_buf_do_callbacks(struct xfs_buf *bp); /* @@ -959,128 +958,76 @@ xfs_buf_do_callbacks( */ void xfs_buf_iodone_callbacks( - xfs_buf_t *bp) + struct xfs_buf *bp) { - xfs_log_item_t *lip; - static ulong lasttime; - static xfs_buftarg_t *lasttarg; - xfs_mount_t *mp; + struct xfs_log_item *lip = bp->b_fspriv; + struct xfs_mount *mp = lip->li_mountp; + static ulong lasttime; + static xfs_buftarg_t *lasttarg; - ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); - lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); + if (likely(!XFS_BUF_GETERROR(bp))) + goto do_callbacks; - if (XFS_BUF_GETERROR(bp) != 0) { - /* - * If we've already decided to shutdown the filesystem - * because of IO errors, there's no point in giving this - * a retry. - */ - mp = lip->li_mountp; - if (XFS_FORCED_SHUTDOWN(mp)) { - 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); - XFS_BUF_SET_FSPRIVATE(bp, NULL); - XFS_BUF_CLR_IODONE_FUNC(bp); - xfs_buf_ioend(bp, 0); - return; - } + /* + * If we've already decided to shutdown the filesystem because of + * I/O errors, there's no point in giving this a retry. + */ + if (XFS_FORCED_SHUTDOWN(mp)) { + XFS_BUF_SUPER_STALE(bp); + trace_xfs_buf_item_iodone(bp, _RET_IP_); + goto do_callbacks; + } - if ((XFS_BUF_TARGET(bp) != lasttarg) || - (time_after(jiffies, (lasttime + 5*HZ)))) { - lasttime = jiffies; - cmn_err(CE_ALERT, "Device %s, XFS metadata write error" - " block 0x%llx in %s", - XFS_BUFTARG_NAME(XFS_BUF_TARGET(bp)), - (__uint64_t)XFS_BUF_ADDR(bp), mp->m_fsname); - } - lasttarg = XFS_BUF_TARGET(bp); + if (XFS_BUF_TARGET(bp) != lasttarg || + time_after(jiffies, (lasttime + 5*HZ))) { + lasttime = jiffies; + cmn_err(CE_ALERT, "Device %s, XFS metadata write error" + " block 0x%llx in %s", + XFS_BUFTARG_NAME(XFS_BUF_TARGET(bp)), + (__uint64_t)XFS_BUF_ADDR(bp), mp->m_fsname); + } + lasttarg = XFS_BUF_TARGET(bp); - if (XFS_BUF_ISASYNC(bp)) { - /* - * If the write was asynchronous then noone will be - * looking for the error. Clear the error state - * and write the buffer out again delayed write. - * - * XXXsup This is OK, so long as we catch these - * before we start the umount; we don't want these - * DELWRI metadata bufs to be hanging around. - */ - XFS_BUF_ERROR(bp,0); /* errno of 0 unsets the flag */ + /* + * If the write was asynchronous then noone will be looking for the + * error. Clear the error state and write the buffer out again. + * + * During sync or umount we'll write all pending buffers again + * synchronous, which will catch these errors if they keep hanging + * around. + */ + if (XFS_BUF_ISASYNC(bp)) { + XFS_BUF_ERROR(bp, 0); /* errno of 0 unsets the flag */ - if (!(XFS_BUF_ISSTALE(bp))) { - XFS_BUF_DELAYWRITE(bp); - XFS_BUF_DONE(bp); - XFS_BUF_SET_START(bp); - } - ASSERT(XFS_BUF_IODONE_FUNC(bp)); - trace_xfs_buf_item_iodone_async(bp, _RET_IP_); - xfs_buf_relse(bp); - } else { - /* - * If the write of the buffer was not asynchronous, - * then we want to make sure to return the error - * to the caller of bwrite(). Because of this we - * cannot clear the B_ERROR state at this point. - * Instead we install a callback function that - * will be called when the buffer is released, and - * that routine will clear the error state and - * set the buffer to be written out again after - * some delay. - */ - /* 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); + if (!XFS_BUF_ISSTALE(bp)) { + XFS_BUF_DELAYWRITE(bp); XFS_BUF_DONE(bp); - XFS_BUF_FINISH_IOWAIT(bp); + XFS_BUF_SET_START(bp); } + ASSERT(XFS_BUF_IODONE_FUNC(bp)); + trace_xfs_buf_item_iodone_async(bp, _RET_IP_); + xfs_buf_relse(bp); return; } - xfs_buf_do_callbacks(bp); - XFS_BUF_SET_FSPRIVATE(bp, NULL); - XFS_BUF_CLR_IODONE_FUNC(bp); - xfs_buf_ioend(bp, 0); -} - -/* - * This is a callback routine attached to a buffer which gets an error - * when being written out synchronously. - */ -STATIC void -xfs_buf_error_relse( - xfs_buf_t *bp) -{ - xfs_log_item_t *lip; - xfs_mount_t *mp; - - lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); - mp = (xfs_mount_t *)lip->li_mountp; - ASSERT(XFS_BUF_TARGET(bp) == mp->m_ddev_targp); - + /* + * If the write of the buffer was synchronous, we want to make + * sure to return the error to the caller of xfs_bwrite(). + */ XFS_BUF_STALE(bp); XFS_BUF_DONE(bp); XFS_BUF_UNDELAYWRITE(bp); - XFS_BUF_ERROR(bp,0); trace_xfs_buf_error_relse(bp, _RET_IP_); + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); - if (! XFS_FORCED_SHUTDOWN(mp)) - xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); - /* - * We have to unpin the pinned buffers so do the - * callbacks. - */ +do_callbacks: xfs_buf_do_callbacks(bp); XFS_BUF_SET_FSPRIVATE(bp, NULL); XFS_BUF_CLR_IODONE_FUNC(bp); - XFS_BUF_SET_BRELSE_FUNC(bp,NULL); - xfs_buf_relse(bp); + xfs_buf_ioend(bp, 0); } - /* * This is the iodone() function for buffers which have been * logged. It is called when they are eventually flushed out. Index: xfs/fs/xfs/linux-2.6/xfs_buf.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.c 2011-01-04 09:42:44.770009657 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_buf.c 2011-01-04 09:46:41.233255990 +0100 @@ -896,7 +896,6 @@ xfs_buf_rele( trace_xfs_buf_rele(bp, _RET_IP_); 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)) @@ -908,11 +907,7 @@ xfs_buf_rele( 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) && + if (!(bp->b_flags & XBF_STALE) && atomic_read(&bp->b_lru_ref)) { xfs_buf_lru_add(bp); spin_unlock(&pag->pag_buf_lock); From karn@ka9q.net Fri Jan 7 08:11:28 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p07EBSua064101 for ; Fri, 7 Jan 2011 08:11:28 -0600 X-ASG-Debug-ID: 1294409616-4c3a03860000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from homer.ka9q.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 26B2B153A499 for ; Fri, 7 Jan 2011 06:13:37 -0800 (PST) Received: from homer.ka9q.net (homer.ka9q.net [75.60.237.89]) by cuda.sgi.com with ESMTP id XXwUY5qmc34xFQCn for ; Fri, 07 Jan 2011 06:13:37 -0800 (PST) Received: from [192.168.2.14] (helo=maggie.local) by homer.ka9q.net with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.72) (envelope-from ) id 1PbD4Q-0001Ht-7l; Fri, 07 Jan 2011 06:13:34 -0800 Message-ID: <4D271F8D.3030404@ka9q.net> Date: Fri, 07 Jan 2011 06:13:33 -0800 From: Phil Karn 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: Matthias Schniedermeyer CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: TRIM details Subject: Re: TRIM details References: <4D2686ED.7000304@philkarn.net> <20110107091120.GA6634@citd.de> In-Reply-To: <20110107091120.GA6634@citd.de> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: homer.ka9q.net[75.60.237.89] X-Barracuda-Start-Time: 1294409618 X-Barracuda-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.51691 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 1/7/11 1:11 AM, Matthias Schniedermeyer wrote: > The drive would have to look into each written sector in the off chance > that it might be 0, that's a lot of electrons you have to burn for not > much gain. And that's ignoring the performance side, doing such a check > on each incoming write would be expensive at best. Oh, there's no question that an explicit TRIM command would be *far* more efficient than an implicit TRIM that writes zeroes. If nothing else, implicit TRIMming requires writing every single sector individually, while the WRITE SAME command lets the host wipe up to 65,536 (I think) sectors with a single command. But that's not my point. My point is that if the drive could recognize a write of 0s to a sector as an implicit TRIM, then it would still be possible to manually trim the drive without any support whatsoever from the device driver or file system. You could use a standard copy command, provided you have something like /dev/zero, or you could write a simple application that wouldn't even need root privileges (assuming it didn't need to get around any quotas when creating the temporary file). And it would work for any file system and any operating system while we're waiting for native TRIM support (I'm still waiting for TRIM support for HFS+ in Mac OSX). I don't think it would be that hard for the drive to recognize a write of all zeroes. It already has to compute a set of Reed Solomon parity symbols for every block written to the drive. That's quite a bit more work than merely seeing if the block is all 0's. You could even use the existing Reed-Solomon encoder to optimize the process though I doubt it would really be necessary. The RS parities for an all-0 data block are also all 0. If any of the parities are non zero, then it can't be a block of 0's. If the parities are all zero, then confirm in software that the data is all 0's; you'll have very few false alarms. From karn@ka9q.net Fri Jan 7 08:13:06 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p07ED5La064279 for ; Fri, 7 Jan 2011 08:13:06 -0600 X-ASG-Debug-ID: 1294409715-4c39036c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from homer.ka9q.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D1EDC153A4C4 for ; Fri, 7 Jan 2011 06:15:15 -0800 (PST) Received: from homer.ka9q.net (homer.ka9q.net [75.60.237.89]) by cuda.sgi.com with ESMTP id tmRMa2yaGw9WbwJ9 for ; Fri, 07 Jan 2011 06:15:15 -0800 (PST) Received: from [192.168.2.14] (helo=maggie.local) by homer.ka9q.net with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.72) (envelope-from ) id 1PbD63-0001I8-Fr; Fri, 07 Jan 2011 06:15:15 -0800 Message-ID: <4D271FF3.7060303@ka9q.net> Date: Fri, 07 Jan 2011 06:15:15 -0800 From: Phil Karn 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: Matthias Schniedermeyer CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: TRIM details Subject: Re: TRIM details References: <4D2686ED.7000304@philkarn.net> <20110107091120.GA6634@citd.de> <20110107091720.GA6921@citd.de> In-Reply-To: <20110107091720.GA6921@citd.de> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: homer.ka9q.net[75.60.237.89] X-Barracuda-Start-Time: 1294409715 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0077 1.0000 -1.9706 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.97 X-Barracuda-Spam-Status: No, SCORE=-1.97 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.51691 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 1/7/11 1:17 AM, Matthias Schniedermeyer wrote: > Altough, after thinking about it a little more. Doing a Population count > in the controller while the data comes in over the wire can't be that > expensive. Doesn't even have to be a popcount. Just OR every word into a register as the data flies by and look to see if the result is 0. From karn@ka9q.net Fri Jan 7 08:19:33 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p07EJXXP065348 for ; Fri, 7 Jan 2011 08:19:33 -0600 X-ASG-Debug-ID: 1294410102-551e01370000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-pv0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 583AB1D166BE for ; Fri, 7 Jan 2011 06:21:42 -0800 (PST) Received: from mail-pv0-f181.google.com (mail-pv0-f181.google.com [74.125.83.181]) by cuda.sgi.com with ESMTP id Uva1RD856haEQDAp for ; Fri, 07 Jan 2011 06:21:42 -0800 (PST) Received: by pvg12 with SMTP id 12so4730570pvg.26 for ; Fri, 07 Jan 2011 06:21:42 -0800 (PST) Received: by 10.142.165.10 with SMTP id n10mr1767111wfe.182.1294410101952; Fri, 07 Jan 2011 06:21:41 -0800 (PST) Received: from maggie.local (router.ka9q.net [75.60.237.91]) by mx.google.com with ESMTPS id p8sm2714757wff.16.2011.01.07.06.21.39 (version=TLSv1/SSLv3 cipher=RC4-MD5); Fri, 07 Jan 2011 06:21:40 -0800 (PST) Sender: Phil Karn Message-ID: <4D272171.9090906@philkarn.net> Date: Fri, 07 Jan 2011 06:21:37 -0800 From: Phil Karn Reply-To: karn@ka9q.net 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: Matthias Schniedermeyer CC: karn@ka9q.net, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: TRIM details Subject: Re: TRIM details References: <4D2686ED.7000304@philkarn.net> <20110107091120.GA6634@citd.de> In-Reply-To: <20110107091120.GA6634@citd.de> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pv0-f181.google.com[74.125.83.181] X-Barracuda-Start-Time: 1294410103 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0026 1.0000 -2.0038 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.00 X-Barracuda-Spam-Status: No, SCORE=-2.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.51692 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 1/7/11 1:11 AM, Matthias Schniedermeyer wrote: > "Quite fast" is something of an understatement. > The Intel SSD can TRIM the whole drive in a matter of seconds. I have > tested that with hdparm, when i wrote me a simple disc imaging > perl-script. Yes, I've been running wiper.sh on the XFS filesystems on my Intel 120 GB SSD and it's impressively fast. I've been careful to do backups first, but I haven't had a problem yet. From karn@ka9q.net Fri Jan 7 08:34:11 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p07EYBXI067636 for ; Fri, 7 Jan 2011 08:34:11 -0600 X-ASG-Debug-ID: 1294410981-556600a30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-pw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 99C6C248F8A for ; Fri, 7 Jan 2011 06:36:21 -0800 (PST) Received: from mail-pw0-f53.google.com (mail-pw0-f53.google.com [209.85.160.53]) by cuda.sgi.com with ESMTP id YwauzCYHtD6PTlb0 for ; Fri, 07 Jan 2011 06:36:21 -0800 (PST) Received: by pwj6 with SMTP id 6so3670482pwj.26 for ; Fri, 07 Jan 2011 06:36:21 -0800 (PST) Received: by 10.142.47.2 with SMTP id u2mr1789923wfu.227.1294410980928; Fri, 07 Jan 2011 06:36:20 -0800 (PST) Received: from maggie.local (router.ka9q.net [75.60.237.91]) by mx.google.com with ESMTPS id e14sm2735243wfg.8.2011.01.07.06.36.18 (version=TLSv1/SSLv3 cipher=RC4-MD5); Fri, 07 Jan 2011 06:36:19 -0800 (PST) Sender: Phil Karn Message-ID: <4D2724E0.9020801@philkarn.net> Date: Fri, 07 Jan 2011 06:36:16 -0800 From: Phil Karn Reply-To: karn@ka9q.net 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: xfs@oss.sgi.com X-ASG-Orig-Subj: realtime partition support? Subject: realtime partition support? Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pw0-f53.google.com[209.85.160.53] X-Barracuda-Start-Time: 1294410981 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0026 1.0000 -2.0039 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.59 X-Barracuda-Spam-Status: No, SCORE=-1.59 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.51692 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 What's the status of the realtime partition feature in XFS? I think I read somewhere that it wasn't actually implemented and/or working in the Linux XFS implementation, but I'm not sure. If it is in Linux, how well tested is it? It occurred to me that the XFS realtime feature might be a quick and easy way to make a hybrid of a SSD and a rotating drive. Just create a XFS file system on the SSD that specifies the rotating drive as its realtime partition. This would put all the metadata on the SSD where it can be quickly accessed at random. Throughput on large files would be almost as fast as if everything were on the SSD. Small files wouldn't be as fast, but still much faster than with no SSD at all. Phil From martin.petersen@oracle.com Fri Jan 7 10:48:53 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UNPARSEABLE_RELAY 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 p07GmqqG089427 for ; Fri, 7 Jan 2011 10:48:53 -0600 X-ASG-Debug-ID: 1294419062-04d500060000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from rcsinet10.oracle.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DAC551D17216 for ; Fri, 7 Jan 2011 08:51:02 -0800 (PST) Received: from rcsinet10.oracle.com (rcsinet10.oracle.com [148.87.113.121]) by cuda.sgi.com with ESMTP id Y3KcWbuxHCDAwFzf for ; Fri, 07 Jan 2011 08:51:02 -0800 (PST) Received: from rcsinet15.oracle.com (rcsinet15.oracle.com [148.87.113.117]) by rcsinet10.oracle.com (Switch-3.4.2/Switch-3.4.2) with ESMTP id p07GosrV027271 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 7 Jan 2011 16:50:56 GMT Received: from acsmt355.oracle.com (acsmt355.oracle.com [141.146.40.155]) by rcsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id p07FWQa8012301; Fri, 7 Jan 2011 16:50:53 GMT Received: from abhmt004.oracle.com by acsmt354.oracle.com with ESMTP id 940026011294419011; Fri, 07 Jan 2011 08:50:11 -0800 Received: from groovelator.mkp.net (/209.217.122.111) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 07 Jan 2011 08:50:11 -0800 To: Phil Karn Cc: Matthias Schniedermeyer , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: TRIM details Subject: Re: TRIM details From: "Martin K. Petersen" Organization: Oracle References: <4D2686ED.7000304@philkarn.net> <20110107091120.GA6634@citd.de> <4D271F8D.3030404@ka9q.net> Date: Fri, 07 Jan 2011 11:50:09 -0500 In-Reply-To: <4D271F8D.3030404@ka9q.net> (Phil Karn's message of "Fri, 07 Jan 2011 06:13:33 -0800") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: rcsinet10.oracle.com[148.87.113.121] X-Barracuda-Start-Time: 1294419062 X-Barracuda-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=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.51702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean >>>>> "Phil" == Phil Karn writes: Phil> Oh, there's no question that an explicit TRIM command would be Phil> *far* more efficient than an implicit TRIM that writes zeroes. If Phil> nothing else, implicit TRIMming requires writing every single Phil> sector individually, while the WRITE SAME command lets the host Phil> wipe up to 65,536 (I think) sectors with a single command. ATA does not have WRITE SAME. It's a SCSI command. WRITE SAME(10) allows clearing 32MB per command on a device with 512-byte blocks. WRITE SAME(16) allows a bigger area but most drives don't support it. Those that do often cap at 16-bits anyway (Note that I'm talking about drives. Arrays are more flexible). DSM TRIM allows you to clear 2GB per command with a 512-byte payload. Several modern drives will let you clear 16GB with a 4KB payload. Phil> But that's not my point. My point is that if the drive could Phil> recognize a write of 0s to a sector as an implicit TRIM, then it Phil> would still be possible to manually trim the drive without any Phil> support whatsoever from the device driver or file system. But the fact remains that drives don't implement this. They do implement DSM TRIM. Even if the drives did support zero detection we'd have no way of getting the information to them short of sending a bazillion zeroes down the pipe. And why would the drive vendors add support for a crappier interface when DSM exists? If you are set on using dd you could do zero detection in the kernel and have the filesystem either send the data pages or issue discards for the relevant regions if the device supports it. We pretty much have all the infrastructure in place for that. But your time is better spent adding FITRIM support to your filesystem of choice. XFS is done already, Christoph posted the patches. Phil> I don't think it would be that hard for the drive to recognize a Phil> write of all zeroes. It already has to compute a set of Reed Phil> Solomon parity symbols for every block written to the Phil> drive. That typically happens way later. There's usually a clear separation between command processing and encoding. The zero detection needs to happen early as it affects whether you need to mark the block in a bitmap or allocate a real flash block. -- Martin K. Petersen Oracle Linux Engineering From ben-morris@sbcglobal.net Fri Jan 7 13:45:40 2011 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,T_LOTS_OF_MONEY 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 p07Jje9t110928 for ; Fri, 7 Jan 2011 13:45:40 -0600 X-ASG-Debug-ID: 1294429669-6b3103420000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from web82204.mail.mud.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 7EBFE1D15B17 for ; Fri, 7 Jan 2011 11:47:50 -0800 (PST) Received: from web82204.mail.mud.yahoo.com (web82204.mail.mud.yahoo.com [209.191.86.99]) by cuda.sgi.com with SMTP id rOBEkQDFKe7m7oXz for ; Fri, 07 Jan 2011 11:47:50 -0800 (PST) Received: (qmail 11609 invoked by uid 60001); 7 Jan 2011 19:47:49 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sbcglobal.net; s=s1024; t=1294429669; bh=JqSpnFw5p4rIabjtNhXrX5dp4EgPNiaHKpWXnx4r610=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Subject:To:MIME-Version:Content-Type:Content-Transfer-Encoding; b=nDaTqTq7Lnzi6LclIvdBTgNr8aSzG761sHFa6im0QePeHZrXup4X7OITpSuD0NHEBf30CpTyJutW4PMxGlpU1Xg10Bv4Z3jKyUijR8jNpp10hM9WBHLe+Zc5LWLPvAkoBHq9PQN/S/q80EjKikGLvfJ8a4hO/TYQdZvYnv9QgeA= DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; s=s1024; d=sbcglobal.net; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Subject:To:MIME-Version:Content-Type:Content-Transfer-Encoding; b=ZKYuzSlSgr+hYm7Xuc8dyWsGnAEYhx0jvaRX7TSW/XPOH9g5tWBE7eWZhs3Z8qJIehYXhCXNTgW3G5cRgIpf32TGF01ACh/TRoJtwLVeoxprktlOF42IgF2kOCSdPjB03hquksPR5uzNfihHHeO3wOBCN8WVWdKSq402JqvImJc=; Message-ID: <243222.3206.qm@web82204.mail.mud.yahoo.com> X-YMail-OSG: dx4hLAsVM1nMOrJsP8AqF73kd8563t8QCEH3AyyWMl_mtsL WbRQmyka6NcVC3FPMLWg0cv8v543Pzf1JC0rRIvUXm73wxY8IYmTZrHe9dfu mjfUQ0NOg2F427pRIRc3L9r8gPPQtVYhBRGBkRd0z2JyLfVO47g1EOgnKYB2 FchwjlVoQgQPhHKlDp9U3qttR1KmqFvRBCITe2hrreQNbo6icT7.7KX0mQwL wMCyjFMJ_41ZAIFG2o.lW8ea0OZTf0a_cFBWnTb_MWS1qWtzuf7dtyYwbxN5 Rde5Ul5ouQkMzJJ8YinWw7rBLw9BD_F9oGCUYi7ozAjjPAvo3c5hy_qNkUL0 ckH7w0UuheC3nCbz07vcJ86RBH4bWbJIXYPIyDmhb6uoc9MngzWxlwQUvARF LElPncwWEeQjF.8EBJUUmZgKCP95NHh3PxburQifzAv.VJgo1i.QPuMS2_rV n4FTUGFfn5Czw6RboPD8kilafEr4Tl8wjtgcPuJ2QpFJ7b39WXQKYe4Bj1Fe BhG.O1OX1zAhp7PXGvexGSDVYZ_RNipAurFteKRmkOCa.14b4tEEbnIiKzUJ N8zHrVozM9otrlBlGPoB0FzEfSIeWeekMaswm3zvUyuqlMDop0tYLCRLofPQ RLSPNheZzywnK2h4a7zvgST9FxEJmb1TMcHE2XxUn7rpy1KqaWgZsPBhUP1w ii.bdp9dStRDrhzgZywXKkm27ztgX_qPzcwC4mGEwgQ8wgaN9maO5lYOZ0WO gG6eVOLbUnMhhz3mUxoYInWAAudSS84lGRMNTKlfvSNptacp1vGXaxZbTYfE ZnsMEAwGwpBT5itylprToHeFWolAaa7q2ZBBeO5wyeRaSw22NE1qa33gLqsI Z5bHtYBBMKt7SmOHjqF5qSJqIsiW4.YU94j_hGcvirwOZoC.A4bsykLljQKR 9VOKYnJ5LA3HflK1XhkCk.btyjoRgwf0zIyJjswzjxLFdmcu0j6xzpjjGbOW 4gCYtgyW3y3448AqxqsSOIq0ICiLpjcGbGpzHS5LVw3Bk4oouq4r_bwNWjYc - Received: from [173.245.85.110] by web82204.mail.mud.yahoo.com via HTTP; Fri, 07 Jan 2011 11:47:49 PST X-Mailer: YahooMailClassic/11.4.20 YahooMailWebService/0.8.107.285259 Date: Fri, 7 Jan 2011 11:47:49 -0800 (PST) From: ben-morris@sbcglobal.net X-ASG-Orig-Subj: =?utf-8?B?Q2xhaW0gwqM3NTAsMDAwLjAwIEdCUCBpbiB0aGUgR25sZCBOZXcgWWVhciBQ?= =?utf-8?B?cm9tbyAyMDExLiBTZW5k4oCP4oCP4oCP?= Subject: =?utf-8?B?Q2xhaW0gwqM3NTAsMDAwLjAwIEdCUCBpbiB0aGUgR25sZCBOZXcgWWVhciBQ?= =?utf-8?B?cm9tbyAyMDExLiBTZW5k4oCP4oCP4oCP?= To: undisclosed recipients: ; MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: web82204.mail.mud.yahoo.com[209.191.86.99] X-Barracuda-Start-Time: 1294429670 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3113 1.0000 -0.3008 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.30 X-Barracuda-Spam-Status: No, SCORE=-0.30 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.51712 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name -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 Name: Country From karn@ka9q.net Fri Jan 7 17:41:18 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p07NfH3F141970 for ; Fri, 7 Jan 2011 17:41:18 -0600 X-ASG-Debug-ID: 1294443807-411300930000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from homer.ka9q.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0C47724AAA8 for ; Fri, 7 Jan 2011 15:43:27 -0800 (PST) Received: from homer.ka9q.net (homer.ka9q.net [75.60.237.89]) by cuda.sgi.com with ESMTP id PWDGLIjwfOkQuKmh for ; Fri, 07 Jan 2011 15:43:27 -0800 (PST) Received: from [192.168.2.14] (helo=maggie.local) by homer.ka9q.net with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.72) (envelope-from ) id 1PbLxr-00028m-5u; Fri, 07 Jan 2011 15:43:23 -0800 Message-ID: <4D27A51A.1090207@ka9q.net> Date: Fri, 07 Jan 2011 15:43:22 -0800 From: Phil Karn 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: "Martin K. Petersen" CC: Matthias Schniedermeyer , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: TRIM details Subject: Re: TRIM details References: <4D2686ED.7000304@philkarn.net> <20110107091120.GA6634@citd.de> <4D271F8D.3030404@ka9q.net> In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: homer.ka9q.net[75.60.237.89] X-Barracuda-Start-Time: 1294443808 X-Barracuda-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.51728 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 1/7/11 8:50 AM, Martin K. Petersen wrote: > ATA does not have WRITE SAME. It's a SCSI command. Ah. I keep thinking that the ATA commands are the same as SCSI commands because Linux does a pretty good job of making ATA drives look as though they're SCSI, but they're not a 1-1 mapping. > But the fact remains that drives don't implement this. They do implement > DSM TRIM. Even if the drives did support zero detection we'd have no way > of getting the information to them short of sending a bazillion zeroes > down the pipe. I know. > And why would the drive vendors add support for a > crappier interface when DSM exists? The *only* reason I suggest this is to make it possible to manually TRIM a drive when the file system and/or device driver don't yet support the explicit device-level TRIM command. RAID subsystems are another obstacle to TRIM, but I don't quite see the point in using RAID with SSDs, or especially why so many people seem to want to do RAID-0 with SSDs. SSDs already implement something much like RAID-0 internally, i.e., interleaving for speed, which is why the bigger SSDs are generally faster than the smaller ones until the interface saturates. At that point you're better off abandoning SATA and attaching the SSD subsystem directly to the processor over a PCI-e path, as in the OCX Revo drives. The implicit TRIM-with-zeroes feature I suggest wouldn't have to be in every drive. You wouldn't have to use it even if it were there. And I will certainly use your new XFS code as soon as it's stable enough to go into the production kernel. But the many concerned about the lack of TRIM support in their proprietary, closed-source OS/FS of choice could select such a drive and trim manually at the application layer until (or if) their vendor finally gets around to supporting explicit device-level TRIM. OSX still doesn't have it, which is surprising given how many SSDs Apple has sold in MacBooks -- and how much they charge for them. This is not something I'd expected to be of direct use by those who use XFS. But you've obviously been thinking a lot about SSDs and TRIM in general so I knew you'd have some useful comments on the idea. I really ought to approach an SSD vendor with this idea, but I don't know anybody who works for one. Thanks for your ideas. Phil From SRS0+NbkC+42+fromorbit.com=david@internode.on.net Fri Jan 7 20:15:29 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p082FT15157393 for ; Fri, 7 Jan 2011 20:15:29 -0600 X-ASG-Debug-ID: 1294453056-6f4103ad0000-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 48980249F7D for ; Fri, 7 Jan 2011 18:17:37 -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 KnupI3gkCYEQTKvJ for ; Fri, 07 Jan 2011 18:17:37 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51871179-1927428 for multiple; Sat, 08 Jan 2011 12:47:35 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PbOMz-0000nK-1y; Sat, 08 Jan 2011 13:17:29 +1100 Date: Sat, 8 Jan 2011 13:17:29 +1100 From: Dave Chinner To: karn@ka9q.net Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: realtime partition support? Subject: Re: realtime partition support? Message-ID: <20110108021728.GA28803@dastard> References: <4D2724E0.9020801@philkarn.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D2724E0.9020801@philkarn.net> 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: 1294453059 X-Barracuda-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.51738 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 Fri, Jan 07, 2011 at 06:36:16AM -0800, Phil Karn wrote: > What's the status of the realtime partition feature in XFS? I think I > read somewhere that it wasn't actually implemented and/or working in the > Linux XFS implementation, but I'm not sure. If it is in Linux, how well > tested is it? Experimental, implemented in linux and mostly just works, but is largely untested and not really recommended for any sort of production use. > It occurred to me that the XFS realtime feature might be a quick and > easy way to make a hybrid of a SSD and a rotating drive. Just create a > XFS file system on the SSD that specifies the rotating drive as its > realtime partition. This would put all the metadata on the SSD where it > can be quickly accessed at random. Has a couple of drawbacks: realtime device extent allocation is single threaded, and it's not designed as a general purpose allocator. > Throughput on large files would be almost as fast as if everything were > on the SSD. Not at all. The data is still written to the rotating disk, so the presence of the SSD won't change throughput rates at all. In fact, the rt device is not aimed at maximising throughput - it was designed for deterministic performance for low-latency multiple stream access patterns - so it will probably give lower throughput than just using the rotating drive alone.... > Small files wouldn't be as fast, but still much faster than > with no SSD at all. I'd also expect it to be be much, much slower than just using the rotating disk for the standard data device - the SSD will make no difference as metadata IO is not the limiting factor. Further, the rt allocator is simply not designed to handle lots of small files efficiently so will trigger many more seeks for small file data IO than the standard allocator (and hence be slower) because the standard allocator packs small files tightly together... It's a nice idea, but it doesn't really work out in practise with the current XFS structure. Cheers, Dave. -- Dave Chinner david@fromorbit.com From karn@ka9q.net Fri Jan 7 21:57:23 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p083vMoT168101 for ; Fri, 7 Jan 2011 21:57:23 -0600 X-ASG-Debug-ID: 1294459172-430c03340000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-gx0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D0CC223FB4E for ; Fri, 7 Jan 2011 19:59:32 -0800 (PST) Received: from mail-gx0-f181.google.com (mail-gx0-f181.google.com [209.85.161.181]) by cuda.sgi.com with ESMTP id ydhxEAow5QjFEsRj for ; Fri, 07 Jan 2011 19:59:32 -0800 (PST) Received: by gxk10 with SMTP id 10so9237724gxk.26 for ; Fri, 07 Jan 2011 19:59:32 -0800 (PST) Received: by 10.150.157.8 with SMTP id f8mr26288092ybe.195.1294459171811; Fri, 07 Jan 2011 19:59:31 -0800 (PST) Received: from maggie.local (129-46-76-189.qualcomm.com [129.46.76.189]) by mx.google.com with ESMTPS id u31sm13415892yba.9.2011.01.07.19.59.29 (version=TLSv1/SSLv3 cipher=RC4-MD5); Fri, 07 Jan 2011 19:59:30 -0800 (PST) Sender: Phil Karn Message-ID: <4D27E11F.4030607@philkarn.net> Date: Fri, 07 Jan 2011 19:59:27 -0800 From: Phil Karn Reply-To: karn@ka9q.net 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: Dave Chinner CC: karn@ka9q.net, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: realtime partition support? Subject: Re: realtime partition support? References: <4D2724E0.9020801@philkarn.net> <20110108021728.GA28803@dastard> In-Reply-To: <20110108021728.GA28803@dastard> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-gx0-f181.google.com[209.85.161.181] X-Barracuda-Start-Time: 1294459172 X-Barracuda-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.51746 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 1/7/11 6:17 PM, Dave Chinner wrote: > Experimental, implemented in linux and mostly just works, but is > largely untested and not really recommended for any sort of > production use. Thanks. >> Throughput on large files would be almost as fast as if everything were >> on the SSD. > > Not at all. The data is still written to the rotating disk, so > the presence of the SSD won't change throughput rates at all. My point is that the big win of the SSD comes from its lack of rotational and seek latency. They really shine on random small reads. On large sequential reads and writes, modern rotating disks can shovel data almost as quickly as an SSD once the head is in the right place and the data has started flowing. But it can't get there until it has walked the directory tree, read the inode for the file in question and finally seeked to the file's first extent. If all that meta information resided on SSD, the conventional drive could get to that first extent that much more quickly. Yeah, the SSD is typically still faster than a rotating drive on sequential reads -- but only by a factor of 2:1, not dozens or hundreds of times. On sequential writes, many rotating drives are actually faster than many SSDs. > I'd also expect it to be be much, much slower than just using the > rotating disk for the standard data device - the SSD will make no > difference as metadata IO is not the limiting factor. No? I'm having a very hard time getting XFS on rotating SATA drives to come close to Reiser or ext4 when extracting a large tarball (e.g., the Linux source tree) or when doing rm -rf. I've improved it by playing with logbsize and logbufs but Reiser is still much faster, especially at rm -rf. The only way I've managed to get XFS close is by essentially disabling journaling altogether, which I don't want to do. I've tried building XFS with an external journal and giving it a loopback device connected to a file in /tmp. Then it's plenty fast. But unsafe. As I understand it, the problem is all that seeking to the internal journal. I'd like to try putting the journal on a SSD partition but I can't figure out how to do that with an existing XFS file system without rebuilding it. Turning off the write barrier also speeds things up considerably, but that also makes me nervous. My system doesn't have a RAID controller with a nonvolatile cache but it is plugged into a UPS (actually a large solar power system with a battery bank) so unexpected loss of power is unlikely. Can I safely turn off the barrier? If I correctly understand how drive write caching works, then even a kernel panic shouldn't keep data that's already been sent to the drive from being written out to the media. Only a power failure could do that, or possibly the host resetting the drive. After a kernel panic the BIOS will eventually reset all the hardware, but that won't happen for some time after a kernel panic. From stan@hardwarefreak.com Sat Jan 8 00:27:09 2011 X-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 p086R8Zv192172 for ; Sat, 8 Jan 2011 00:27:09 -0600 X-ASG-Debug-ID: 1294468154-2494023e0000-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 BD9D42495FF for ; Fri, 7 Jan 2011 22:29:15 -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 pAAspNhmSXZJiDT9 for ; Fri, 07 Jan 2011 22:29:15 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 581656C01B for ; Sat, 8 Jan 2011 00:29:14 -0600 (CST) Message-ID: <4D28043A.20300@hardwarefreak.com> Date: Sat, 08 Jan 2011 00: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: realtime partition support? Subject: Re: realtime partition support? References: <4D2724E0.9020801@philkarn.net> <20110108021728.GA28803@dastard> <4D27E11F.4030607@philkarn.net> In-Reply-To: <4D27E11F.4030607@philkarn.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: 1294468155 X-Barracuda-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.51756 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 Phil Karn put forth on 1/7/2011 9:59 PM: > No? I'm having a very hard time getting XFS on rotating SATA drives to > come close to Reiser or ext4 when extracting a large tarball (e.g., the > Linux source tree) or when doing rm -rf. This is because you're not using Dave's delayed logging patch, and you've not been reading this list for many months, as it's been discussed in detail many times. See: http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/filesystems/xfs-delayed-logging-design.txt;h=96d0df28bed323d5596fc051b0ffb96ed8e3c8df;hb=HEAD Dave Chinner put forth on 3/14/2010 11:30 PM: > The following results are from a synthetic test designed to show > just the impact of delayed logging on the amount of metadata > written to the log. > > load: Sequential create 100k zero-length files in a directory per > thread, no fsync between create and unlink. > (./fs_mark -S0 -n 100000 -s 0 -d ....) > > measurement: via PCP. XFS specific metrics: > > xfs.log.blocks > xfs.log.writes > xfs.log.noiclogs > xfs.log.force > xfs.transactions.* > xfs.dir_ops.create > xfs.dir_ops.remove > > > machine: > > 2GHz Dual core opteron, 3GB RAM > single 36GB 15krpm scsi drive w/ CTQ depth=32 > mkfs.xfs -f -l size=128m /dev/sdb2 > > Current code: > > mount -o "logbsize=262144" /dev/sdb2 /mnt/scratch > > threads: fs_mark CPU create log unlink log > throughput bandwidth bandwidth > 1 2900/s 75% 34MB/s 34MB/s > 2 2850/s 75% 33MB/s 33MB/s > 4 2800/s 80% 30MB/s 30MB/s > > Delayed logging: > > mount -o "delaylog,logbsize=262144" /dev/sdb2 /mnt/scratch > > threads: fs_mark CPU create log unlink log > throughput bandwidth bandwidth > 1 4300/s 110% 1.5MB/s <1MB/s > 2 7900/s 195% <4MB/s <1MB/s > 4 7500/s 200% <5MB/s <1.5MB/s > > I think it pretty clear that the design goal of "an order of > magnitude less log IO bandwidth" is being met here. Scalability is > looking promising, but a 2p machine is not large enough to make any > definitive statements about that. Hence from these results the > implementation is at or exceeding design levels. The above results were with very young code. I'm guessing the current code in the tree probably has a little better performance. Nonetheless, the above results are impressive, and put XFS on par with any other FS WRT metadata write heavy workloads. Your "rm -rf" operation will be _significantly_ faster, likely a factor of 2x or better, with this delayed logging option enabled, and will be limited mainly/only by the speed of your CPU/memory subsystem. Untarring a kernel should yield a similar, but somewhat lesser, performance increase as you'll be creating ~2300 directories and ~50,000 files (not nulls). With a modern AMD/Intel platform with a CPU of ~3GHz clock speed, XFS metadata OPs with delayed logging enabled should absolutely scream, especially so with multicore CPUs and parallel/concurrent metadata write heavy processes/threads. I can't remember any more recent test results from Dave, although I may simply have missed reading those emails, if they were sent. Even if the current code isn't any faster than that used for the tests above, the metadata write performance increase is still phenomenal. Again, nice work Dave. :) AFAIK, you've eliminated the one 'legit' performance gripe Linux folks have traditionally leveled at XFS WRT to use as a general purpose server/workstation filesystem. Now they have no excuses not to use it. :) I'd love to see a full up Linux FS performance comparison article after 2.6.39 rolls out and delaylog is the default mount option. I don't have the necessary hardware etc to do such a piece or I gladly would. -- Stan From karn@ka9q.net Sat Jan 8 08:40:48 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p08Eel8r008298 for ; Sat, 8 Jan 2011 08:40:48 -0600 X-ASG-Debug-ID: 1294497777-7dfa00830000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-pw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 76D73153AB36 for ; Sat, 8 Jan 2011 06:42:57 -0800 (PST) Received: from mail-pw0-f53.google.com (mail-pw0-f53.google.com [209.85.160.53]) by cuda.sgi.com with ESMTP id BCQ2gA67uZr6URtZ for ; Sat, 08 Jan 2011 06:42:57 -0800 (PST) Received: by pwj6 with SMTP id 6so3874507pwj.26 for ; Sat, 08 Jan 2011 06:42:56 -0800 (PST) Received: by 10.142.14.11 with SMTP id 11mr2708794wfn.373.1294497776877; Sat, 08 Jan 2011 06:42:56 -0800 (PST) Received: from maggie.local (router.ka9q.net [75.60.237.91]) by mx.google.com with ESMTPS id o1sm4372277wfl.2.2011.01.08.06.42.54 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sat, 08 Jan 2011 06:42:55 -0800 (PST) Sender: Phil Karn Message-ID: <4D2877EC.1070302@philkarn.net> Date: Sat, 08 Jan 2011 06:42:52 -0800 From: Phil Karn Reply-To: karn@ka9q.net 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: realtime partition support? Subject: Re: realtime partition support? References: <4D2724E0.9020801@philkarn.net> <20110108021728.GA28803@dastard> <4D27E11F.4030607@philkarn.net> <4D28043A.20300@hardwarefreak.com> In-Reply-To: <4D28043A.20300@hardwarefreak.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pw0-f53.google.com[209.85.160.53] X-Barracuda-Start-Time: 1294497777 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0035 1.0000 -1.9980 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.59 X-Barracuda-Spam-Status: No, SCORE=-1.59 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.51788 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 1/7/11 10:29 PM, Stan Hoeppner wrote: > Phil Karn put forth on 1/7/2011 9:59 PM: > >> No? I'm having a very hard time getting XFS on rotating SATA drives to >> come close to Reiser or ext4 when extracting a large tarball (e.g., the >> Linux source tree) or when doing rm -rf. > > This is because you're not using Dave's delayed logging patch, and > you've not been reading this list for many months, as it's been > discussed in detail many times. See: > > http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/filesystems/xfs-delayed-logging-design.txt;h=96d0df28bed323d5596fc051b0ffb96ed8e3c8df;hb=HEAD Yes, I am new to the list, and while I did pull down a year of the archives I certainly haven't read them all. Thanks to this file pointer and your explanation, I now have a pretty good idea of what's going on. Phil From sendmail-proxy@relay.dotsterhost.com Sat Jan 8 09:33:30 2011 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,T_LOTS_OF_MONEY 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 p08FXUtZ016041 for ; Sat, 8 Jan 2011 09:33:30 -0600 X-ASG-Debug-ID: 1294500939-1be303780000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from relay.dotsterhost.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9915324BA53 for ; Sat, 8 Jan 2011 07:35:39 -0800 (PST) Received: from relay.dotsterhost.com (relay.dotsterhost.com [72.5.54.243]) by cuda.sgi.com with ESMTP id HnBmRHbUDJvIyEqv for ; Sat, 08 Jan 2011 07:35:39 -0800 (PST) Received: from relay.dotsterhost.com (localhost.localdomain [127.0.0.1]) by relay.dotsterhost.com (8.12.11.20060308/8.12.11) with ESMTP id p08FY88q031787 for ; Sat, 8 Jan 2011 07:34:08 -0800 Received: (from sendmail-proxy@localhost) by relay.dotsterhost.com (8.12.11.20060308/8.12.11/Submit) id p08FY815031771; Sat, 8 Jan 2011 07:34:08 -0800 Date: Sat, 8 Jan 2011 07:34:08 -0800 Message-Id: <201101081534.p08FY815031771@relay.dotsterhost.com> Sender-ID: m2716 To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: (IEBS). Endowment Subject: (IEBS). Endowment From: Gnld & Wallace Global Foundation Reply-To: gw.liaison@windowslive.com MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit X-Barracuda-Connect: relay.dotsterhost.com[72.5.54.243] X-Barracuda-Start-Time: 1294500939 X-Barracuda-Bayes: INNOCENT GLOBAL 0.7337 1.0000 1.6361 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.64 X-Barracuda-Spam-Status: No, SCORE=1.64 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.51791 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 Congratulation, your email address was randomly selected for MDGs Annual Award donation of £980,860.00 (Nine Hundred and Eighty Thousand Eight hundred Sixty Pounds) organized by the Gnld & Wallace Global Foundation via Internet Electronic Balloting System (IEBS). In honor of the founder Jerry Brassfield and Henry A.Wallace. Due to consistency and transparency, we now enjoy the support of the United States Agency for International Development (USAID) and the European Union (EU) in realization of the founders vision. Your selection was in recognition of your commitment for self actualization. You are by e-mail advice to contact the office of the Liaison with personal details to process your claims. Your e-mail ref: numbers (DV/GN-222-6747/E-56). Sir. Oliver Copper, Tel: +44 70 4578 2380, Email: gw.liaison@windowslive.com Gnld & Wallace Global Foundation Liaison Office, United Kingdom. The selected e-mail users are by this electronic e-mail notification advice to the office of the Liaison, United Kingdom for screening and redemption within 30 days of this announcement. Yours Sincerely Mrs. Sarah Scarth From SRS0+wAbv+44+fromorbit.com=david@internode.on.net Sun Jan 9 18:18:05 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0A0I4p7174315 for ; Sun, 9 Jan 2011 18:18:04 -0600 X-ASG-Debug-ID: 1294618814-06af037f0000-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 31E82FC709E for ; Sun, 9 Jan 2011 16:20:14 -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 R3eHJBaJAoC1BN92 for ; Sun, 09 Jan 2011 16:20:14 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 40826712-1927428 for multiple; Mon, 10 Jan 2011 10:50:13 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pc5UZ-0004Il-SV; Mon, 10 Jan 2011 11:20:11 +1100 Date: Mon, 10 Jan 2011 11:20:11 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v3] xfs: add FITRIM support Subject: Re: [PATCH v3] xfs: add FITRIM support Message-ID: <20110110002011.GC28803@dastard> References: <20110107130204.GA12134@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110107130204.GA12134@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: 1294618816 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0201 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.51922 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, Jan 07, 2011 at 08:02: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 Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+zllW+44+fromorbit.com=david@internode.on.net Sun Jan 9 18:19:03 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0A0J2Zi174367 for ; Sun, 9 Jan 2011 18:19:03 -0600 X-ASG-Debug-ID: 1294618872-2fb9016f0000-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 7D4E6FC70AA for ; Sun, 9 Jan 2011 16:21: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 ha7zcvpNscfokC44 for ; Sun, 09 Jan 2011 16:21:13 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52029293-1927428 for multiple; Mon, 10 Jan 2011 10:51:11 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pc5VW-0004Iu-0Z; Mon, 10 Jan 2011 11:21:10 +1100 Date: Mon, 10 Jan 2011 11:21:09 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: fix error handling for synchronous writes Subject: Re: [PATCH] xfs: fix error handling for synchronous writes Message-ID: <20110110002109.GD28803@dastard> References: <20110107130223.GB12134@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110107130223.GB12134@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: 1294618874 X-Barracuda-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.51922 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, Jan 07, 2011 at 08:02:23AM -0500, Christoph Hellwig wrote: > If we get an IO error on a synchronous superblock write, we attach an > error release function to it so that when the last reference goes away > the release function is called and the buffer is invalidated and > unlocked. The buffer is left locked until the release function is > called so that other concurrent users of the buffer will be locked out > until the buffer error is fully processed. > > Unfortunately, for the superblock buffer the filesyetm itself holds a > reference to the buffer which prevents the reference count from > dropping to zero and the release function being called. As a result, > once an IO error occurs on a sync write, the buffer will never be > unlocked and all future attempts to lock the buffer will hang. > > To make matters worse, this problems is not unique to such buffers; > if there is a concurrent _xfs_buf_find() running, the lookup will grab > a reference to the buffer and then wait on the buffer lock, preventing > the reference count from ever falling to zero and hence unlocking the > buffer. > > As such, the whole b_relse function implementation is broken because it > cannot rely on the buffer reference count falling to zero to unlock the > errored buffer. The synchronous write error path is the only path that > uses this callback - it is used to ensure that the synchronous waiter > gets the buffer error before the error state is cleared from the buffer > by the release function. > > Given that the only sychronous buffer writes now go through xfs_bwrite > and the error path in question can only occur for a write of a dirty, > logged buffer, we can move most of the b_relse processing to happen > inline in xfs_buf_iodone_callbacks, just like a normal I/O completion. > In addition to that we make sure the error is not cleared in > xfs_buf_iodone_callbacks, so that xfs_bwrite can reliably check it. > Given that xfs_bwrite keeps the buffer locked until it has waited for > it and checked the error this allows to reliably propagate the error > to the caller, and make sure that the buffer is reliably unlocked. > > Given that xfs_buf_iodone_callbacks was the only instance of the > b_relse callback we can remove it entirely. > > Based on earlier patches by Dave Chinner and Ajeet Yadav. > > Signed-off-by: Christoph Hellwig > Reported-by: Ajeet Yadav Passes xfsqa fine here. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+wAbv+44+fromorbit.com=david@internode.on.net Sun Jan 9 18:32:59 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0A0Wx0H175095 for ; Sun, 9 Jan 2011 18:32:59 -0600 X-ASG-Debug-ID: 1294619709-656901660000-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 1727B24D635 for ; Sun, 9 Jan 2011 16:35:09 -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 t42sYbdfDYRskoFj for ; Sun, 09 Jan 2011 16:35:09 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51999699-1927428 for multiple; Mon, 10 Jan 2011 11:05:08 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pc5j1-0004K6-0B; Mon, 10 Jan 2011 11:35:07 +1100 Date: Mon, 10 Jan 2011 11:35:06 +1100 From: Dave Chinner To: karn@ka9q.net Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: realtime partition support? Subject: Re: realtime partition support? Message-ID: <20110110003506.GE28803@dastard> References: <4D2724E0.9020801@philkarn.net> <20110108021728.GA28803@dastard> <4D27E11F.4030607@philkarn.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D27E11F.4030607@philkarn.net> 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: 1294619711 X-Barracuda-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.51923 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 Fri, Jan 07, 2011 at 07:59:27PM -0800, Phil Karn wrote: > On 1/7/11 6:17 PM, Dave Chinner wrote: > >> Throughput on large files would be almost as fast as if everything were > >> on the SSD. > > > > Not at all. The data is still written to the rotating disk, so > > the presence of the SSD won't change throughput rates at all. > > My point is that the big win of the SSD comes from its lack of > rotational and seek latency. They really shine on random small reads. On > large sequential reads and writes, modern rotating disks can shovel data > almost as quickly as an SSD once the head is in the right place and the > data has started flowing. But it can't get there until it has walked the > directory tree, read the inode for the file in question and finally > seeked to the file's first extent. Which often does not require IO because the path and inodes are cached in memory. > If all that meta information resided > on SSD, the conventional drive could get to that first extent that much > more quickly. Not that much more quickly, because XFS uses readahead to hide a lot of the directory traversal IO latency when it is not cached.... > > I'd also expect it to be be much, much slower than just using the > > rotating disk for the standard data device - the SSD will make no > > difference as metadata IO is not the limiting factor. > > No? I'm having a very hard time getting XFS on rotating SATA drives to > come close to Reiser or ext4 when extracting a large tarball (e.g., the > Linux source tree) or when doing rm -rf. I've improved it by playing > with logbsize and logbufs but Reiser is still much faster, especially at > rm -rf. The only way I've managed to get XFS close is by essentially > disabling journaling altogether, which I don't want to do. I've tried > building XFS with an external journal and giving it a loopback device > connected to a file in /tmp. Then it's plenty fast. But unsafe. As has already been suggested, "-o delaylog" is the solution to that problem. > Turning off the write barrier also speeds things up considerably, but > that also makes me nervous. My system doesn't have a RAID controller > with a nonvolatile cache but it is plugged into a UPS (actually a large > solar power system with a battery bank) so unexpected loss of power is > unlikely. Can I safely turn off the barrier? Should be safe. In 2.6.37 the overhead of barriers is greatly reduced. IIRC, on most modern hardware they will most likely be unnoticable, so disabling them is probably not necessary... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+qjs8+44+fromorbit.com=dave@internode.on.net Sun Jan 9 18:42:58 2011 X-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_91 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 p0A0gvME175722 for ; Sun, 9 Jan 2011 18:42:58 -0600 X-ASG-Debug-ID: 1294620304-286402af0000-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 4A1F0FBBE47 for ; Sun, 9 Jan 2011 16:45:04 -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 SDqyOMNNGxzILEUZ for ; Sun, 09 Jan 2011 16:45:04 -0800 (PST) Received: from dastard (unverified [121.44.135.206]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52000645-1927428 for ; Mon, 10 Jan 2011 11:15:03 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1Pc5sb-0004Kq-Mm for xfs@oss.sgi.com; Mon, 10 Jan 2011 11:45:01 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pc5rk-0004SI-5U for xfs@oss.sgi.com; Mon, 10 Jan 2011 11:44:08 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs_repair: multithread phase 2 Subject: [PATCH] xfs_repair: multithread phase 2 Date: Mon, 10 Jan 2011 11:44:08 +1100 Message-Id: <1294620248-17098-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: 1294620306 X-Barracuda-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.51924 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 Running some recent repair tests on broken filesystem meant running phase 1 and 2 repeatedly to reproduce an issue at the start of phase 3. Phase 2 was taking approximately 10 minutes to run as it processes each AG serially. Phase 2 can be trivially parallelised - it is simply scanning the per AG trees to calculate free block counts and free and used inodes counts. This can be done safely in parallel by giving each AG it's own structure to aggregate counts into, then once the AG scan is complete adding them all together. This patch uses 32-way threading which results in no noticable slowdown on single SATA drives with NCQ, but results in ~10x reduction in runtime on a 12 disk RAID-0 array. Signed-off-by: Dave Chinner --- repair/phase2.c | 20 +--- repair/scan.c | 294 +++++++++++++++++++++++++++++---------------------- repair/scan.h | 39 +------ repair/xfs_repair.c | 10 ++- 4 files changed, 182 insertions(+), 181 deletions(-) diff --git a/repair/phase2.c b/repair/phase2.c index e81ebf0..1e9377e 100644 --- a/repair/phase2.c +++ b/repair/phase2.c @@ -24,10 +24,9 @@ #include "err_protos.h" #include "incore.h" #include "progress.h" +#include "scan.h" void set_mp(xfs_mount_t *mpp); -void scan_ag(xfs_agnumber_t agno); -void validate_sb(struct xfs_sb *sb); /* workaround craziness in the xlog routines */ int xlog_recover_do_trans(xlog_t *log, xlog_recover_t *t, int p) { return 0; } @@ -107,9 +106,10 @@ zero_log(xfs_mount_t *mp) */ void -phase2(xfs_mount_t *mp) +phase2( + struct xfs_mount *mp, + int scan_threads) { - xfs_agnumber_t i; int j; ino_tree_node_t *ino_rec; @@ -138,17 +138,7 @@ phase2(xfs_mount_t *mp) set_progress_msg(PROG_FMT_SCAN_AG, (__uint64_t) glob_agcount); - for (i = 0; i < mp->m_sb.sb_agcount; i++) { - scan_ag(i); -#ifdef XR_INODE_TRACE - print_inode_list(i); -#endif - } - - /* - * Validate that our manual counts match the superblock. - */ - validate_sb(&mp->m_sb); + scan_ags(mp, scan_threads); print_final_rpt(); diff --git a/repair/scan.c b/repair/scan.c index 85017ff..afed693 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -28,6 +28,7 @@ #include "versions.h" #include "bmap.h" #include "progress.h" +#include "threads.h" extern int verify_set_agheader(xfs_mount_t *mp, xfs_buf_t *sbuf, xfs_sb_t *sb, xfs_agf_t *agf, xfs_agi_t *agi, xfs_agnumber_t i); @@ -35,27 +36,31 @@ extern int verify_set_agheader(xfs_mount_t *mp, xfs_buf_t *sbuf, xfs_sb_t *sb, static xfs_mount_t *mp = NULL; /* - * Global variables to validate superblock values against the manual count + * Variables to validate AG header values against the manual count * from the btree traversal. - * - * No locking for now as phase2 is not threaded. */ -static __uint64_t fdblocks; -static __uint64_t icount; -static __uint64_t ifreecount; +struct aghdr_cnts { + xfs_agnumber_t agno; + xfs_extlen_t agffreeblks; + xfs_extlen_t agflongest; + __uint64_t agfbtreeblks; + __uint32_t agicount; + __uint32_t agifreecount; + __uint64_t fdblocks; + __uint64_t icount; + __uint64_t ifreecount; +}; -/* - * Global variables to validate AG header values against the manual count - * from the btree traversal. - * - * Note: these values must be reset when processing a new AG, and for now - * forces the AG scanning in phase2 to not be threaded. - */ -static xfs_extlen_t agffreeblks; -static xfs_extlen_t agflongest; -static __uint64_t agfbtreeblks; -static __uint32_t agicount; -static __uint32_t agifreecount; +static void +scanfunc_allocbt( + struct xfs_btree_block *block, + int level, + xfs_agblock_t bno, + xfs_agnumber_t agno, + int suspect, + int isroot, + __uint32_t magic, + struct aghdr_cnts *agcnts); void set_mp(xfs_mount_t *mpp) @@ -75,8 +80,10 @@ scan_sbtree( xfs_agblock_t bno, xfs_agnumber_t agno, int suspect, - int isroot), - int isroot) + int isroot, + void *priv), + int isroot, + void *priv) { xfs_buf_t *bp; @@ -86,7 +93,8 @@ scan_sbtree( do_error(_("can't read btree block %d/%d\n"), agno, root); return; } - (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, root, agno, suspect, isroot); + (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, root, agno, suspect, + isroot, priv); libxfs_putbuf(bp); } @@ -468,7 +476,35 @@ _("out-of-order bmap key (file offset) in inode %llu, %s fork, fsbno %llu\n"), return(0); } -void +static void +scanfunc_bno( + struct xfs_btree_block *block, + int level, + xfs_agblock_t bno, + xfs_agnumber_t agno, + int suspect, + int isroot, + void *agcnts) +{ + return scanfunc_allocbt(block, level, bno, agno, + suspect, isroot, XFS_ABTB_MAGIC, agcnts); +} + +static void +scanfunc_cnt( + struct xfs_btree_block *block, + int level, + xfs_agblock_t bno, + xfs_agnumber_t agno, + int suspect, + int isroot, + void *agcnts) +{ + return scanfunc_allocbt(block, level, bno, agno, + suspect, isroot, XFS_ABTC_MAGIC, agcnts); +} + +static void scanfunc_allocbt( struct xfs_btree_block *block, int level, @@ -476,7 +512,8 @@ scanfunc_allocbt( xfs_agnumber_t agno, int suspect, int isroot, - __uint32_t magic) + __uint32_t magic, + struct aghdr_cnts *agcnts) { const char *name; int i; @@ -506,8 +543,8 @@ scanfunc_allocbt( * free data block counter. */ if (!isroot) { - agfbtreeblks++; - fdblocks++; + agcnts->agfbtreeblks++; + agcnts->fdblocks++; } if (be16_to_cpu(block->bb_level) != level) { @@ -583,10 +620,10 @@ _("%s freespace btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), lastblock = b; } } else { - fdblocks += len; - agffreeblks += len; - if (len > agflongest) - agflongest = len; + agcnts->fdblocks += len; + agcnts->agffreeblks += len; + if (len > agcnts->agflongest) + agcnts->agflongest = len; if (len < lastcount) { do_warn(_( "out-of-order cnt btree record %d (%u %u) block %u/%u\n"), @@ -670,38 +707,12 @@ _("%s freespace btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), if (bno != 0 && verify_agbno(mp, agno, bno)) { scan_sbtree(bno, level, agno, suspect, (magic == XFS_ABTB_MAGIC) ? - scanfunc_bno : scanfunc_cnt, 0); + scanfunc_bno : scanfunc_cnt, 0, + (void *)agcnts); } } } -void -scanfunc_bno( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot) -{ - return scanfunc_allocbt(block, level, bno, agno, - suspect, isroot, XFS_ABTB_MAGIC); -} - -void -scanfunc_cnt( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot - ) -{ - return scanfunc_allocbt(block, level, bno, agno, - suspect, isroot, XFS_ABTC_MAGIC); -} - static int scan_single_ino_chunk( xfs_agnumber_t agno, @@ -879,16 +890,17 @@ _("inode rec for ino %llu (%d/%d) overlaps existing rec (start %d/%d)\n"), * get the start and alignment of the inode chunks right. Those chunks * that we aren't sure about go into the uncertain list. */ -void +static void scanfunc_ino( struct xfs_btree_block *block, int level, xfs_agblock_t bno, xfs_agnumber_t agno, int suspect, - int isroot - ) + int isroot, + void *priv) { + struct aghdr_cnts *agcnts = priv; int i; int numrecs; int state; @@ -968,10 +980,10 @@ _("inode btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), * the block. skip processing of bogus records. */ for (i = 0; i < numrecs; i++) { - agicount += XFS_INODES_PER_CHUNK; - icount += XFS_INODES_PER_CHUNK; - agifreecount += be32_to_cpu(rp[i].ir_freecount); - ifreecount += be32_to_cpu(rp[i].ir_freecount); + agcnts->agicount += XFS_INODES_PER_CHUNK; + agcnts->icount += XFS_INODES_PER_CHUNK; + agcnts->agifreecount += be32_to_cpu(rp[i].ir_freecount); + agcnts->ifreecount += be32_to_cpu(rp[i].ir_freecount); suspect = scan_single_ino_chunk(agno, &rp[i], suspect); } @@ -1015,13 +1027,14 @@ _("inode btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), if (be32_to_cpu(pp[i]) != 0 && verify_agbno(mp, agno, be32_to_cpu(pp[i]))) scan_sbtree(be32_to_cpu(pp[i]), level, agno, - suspect, scanfunc_ino, 0); + suspect, scanfunc_ino, 0, priv); } } -void +static void scan_freelist( - xfs_agf_t *agf) + xfs_agf_t *agf, + struct aghdr_cnts *agcnts) { xfs_agfl_t *agfl; xfs_buf_t *agflbuf; @@ -1068,7 +1081,7 @@ scan_freelist( be32_to_cpu(agf->agf_flcount), agno); } - fdblocks += count; + agcnts->fdblocks += count; libxfs_putbuf(agflbuf); } @@ -1076,14 +1089,15 @@ scan_freelist( static void validate_agf( struct xfs_agf *agf, - xfs_agnumber_t agno) + xfs_agnumber_t agno, + struct aghdr_cnts *agcnts) { xfs_agblock_t bno; bno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_BNO]); if (bno != 0 && verify_agbno(mp, agno, bno)) { scan_sbtree(bno, be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]), - agno, 0, scanfunc_bno, 1); + agno, 0, scanfunc_bno, 1, agcnts); } else { do_warn(_("bad agbno %u for btbno root, agno %d\n"), bno, agno); @@ -1092,33 +1106,34 @@ validate_agf( bno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_CNT]); if (bno != 0 && verify_agbno(mp, agno, bno)) { scan_sbtree(bno, be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]), - agno, 0, scanfunc_cnt, 1); + agno, 0, scanfunc_cnt, 1, agcnts); } else { do_warn(_("bad agbno %u for btbcnt root, agno %d\n"), bno, agno); } - if (be32_to_cpu(agf->agf_freeblks) != agffreeblks) { + if (be32_to_cpu(agf->agf_freeblks) != agcnts->agffreeblks) { do_warn(_("agf_freeblks %u, counted %u in ag %u\n"), - be32_to_cpu(agf->agf_freeblks), agffreeblks, agno); + be32_to_cpu(agf->agf_freeblks), agcnts->agffreeblks, agno); } - if (be32_to_cpu(agf->agf_longest) != agflongest) { + if (be32_to_cpu(agf->agf_longest) != agcnts->agflongest) { do_warn(_("agf_longest %u, counted %u in ag %u\n"), - be32_to_cpu(agf->agf_longest), agflongest, agno); + be32_to_cpu(agf->agf_longest), agcnts->agflongest, agno); } if (xfs_sb_version_haslazysbcount(&mp->m_sb) && - be32_to_cpu(agf->agf_btreeblks) != agfbtreeblks) { + be32_to_cpu(agf->agf_btreeblks) != agcnts->agfbtreeblks) { do_warn(_("agf_btreeblks %u, counted %u in ag %u\n"), - be32_to_cpu(agf->agf_btreeblks), agfbtreeblks, agno); + be32_to_cpu(agf->agf_btreeblks), agcnts->agfbtreeblks, agno); } } static void validate_agi( struct xfs_agi *agi, - xfs_agnumber_t agno) + xfs_agnumber_t agno, + struct aghdr_cnts *agcnts) { xfs_agblock_t bno; int i; @@ -1126,20 +1141,20 @@ validate_agi( bno = be32_to_cpu(agi->agi_root); if (bno != 0 && verify_agbno(mp, agno, bno)) { scan_sbtree(bno, be32_to_cpu(agi->agi_level), - agno, 0, scanfunc_ino, 1); + agno, 0, scanfunc_ino, 1, agcnts); } else { do_warn(_("bad agbno %u for inobt root, agno %d\n"), be32_to_cpu(agi->agi_root), agno); } - if (be32_to_cpu(agi->agi_count) != agicount) { + if (be32_to_cpu(agi->agi_count) != agcnts->agicount) { do_warn(_("agi_count %u, counted %u in ag %u\n"), - be32_to_cpu(agi->agi_count), agicount, agno); + be32_to_cpu(agi->agi_count), agcnts->agicount, agno); } - if (be32_to_cpu(agi->agi_freecount) != agifreecount) { + if (be32_to_cpu(agi->agi_freecount) != agcnts->agifreecount) { do_warn(_("agi_freecount %u, counted %u in ag %u\n"), - be32_to_cpu(agi->agi_freecount), agifreecount, agno); + be32_to_cpu(agi->agi_freecount), agcnts->agifreecount, agno); } for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) { @@ -1155,42 +1170,15 @@ validate_agi( } /* - * Validate block/inode counts in the superblock. - * - * Note: needs to be called after scan_ag() has been called for all - * allocation groups. - */ -void -validate_sb( - struct xfs_sb *sb) -{ - if (sb->sb_icount != icount) { - do_warn(_("sb_icount %lld, counted %lld\n"), - sb->sb_icount, icount); - } - - if (sb->sb_ifree != ifreecount) { - do_warn(_("sb_ifree %lld, counted %lld\n"), - sb->sb_ifree, ifreecount); - } - - if (sb->sb_fdblocks != fdblocks) { - do_warn(_("sb_fdblocks %lld, counted %lld\n"), - sb->sb_fdblocks, fdblocks); - } - - /* XXX: check sb_frextents */ -} - -/* * Scan an AG for obvious corruption. - * - * Note: This code is not reentrant due to the use of global variables. */ -void +static void scan_ag( - xfs_agnumber_t agno) + work_queue_t *wq, + xfs_agnumber_t agno, + void *arg) { + struct aghdr_cnts *agcnts = arg; xfs_agf_t *agf; xfs_buf_t *agfbuf; int agf_dirty = 0; @@ -1202,16 +1190,6 @@ scan_ag( int sb_dirty = 0; int status; - /* - * Reset the global variables to track the AG header validity. - * - * Because we use global variable but can get called multiple times - * we have to make sure to always reset these variables. - */ - agicount = agifreecount = 0; - agffreeblks = agfbtreeblks = 0; - agflongest = 0; - sbbuf = libxfs_readbuf(mp->m_dev, XFS_AG_DADDR(mp, agno, XFS_SB_DADDR), XFS_FSS_TO_BB(mp, 1), 0); if (!sbbuf) { @@ -1301,10 +1279,10 @@ scan_ag( return; } - scan_freelist(agf); + scan_freelist(agf, agcnts); - validate_agf(agf, agno); - validate_agi(agi, agno); + validate_agf(agf, agno, agcnts); + validate_agi(agi, agno, agcnts); ASSERT(agi_dirty == 0 || (agi_dirty && !no_modify)); @@ -1331,4 +1309,64 @@ scan_ag( libxfs_putbuf(sbbuf); free(sb); PROG_RPT_INC(prog_rpt_done[agno], 1); + +#ifdef XR_INODE_TRACE + print_inode_list(i); +#endif + return; } + +#define SCAN_THREADS 32 + +void +scan_ags( + struct xfs_mount *mp, + int scan_threads) +{ + struct aghdr_cnts *agcnts; + __uint64_t fdblocks = 0; + __uint64_t icount = 0; + __uint64_t ifreecount = 0; + xfs_agnumber_t i; + work_queue_t wq; + + agcnts = malloc(mp->m_sb.sb_agcount * sizeof(*agcnts)); + if (!agcnts) { + do_abort(_("no memory for ag header counts\n")); + return; + } + memset(agcnts, 0, mp->m_sb.sb_agcount * sizeof(*agcnts)); + + create_work_queue(&wq, mp, scan_threads); + + for (i = 0; i < mp->m_sb.sb_agcount; i++) + queue_work(&wq, scan_ag, i, &agcnts[i]); + + destroy_work_queue(&wq); + + /* tally up the counts */ + for (i = 0; i < mp->m_sb.sb_agcount; i++) { + fdblocks += agcnts[i].fdblocks; + icount += agcnts[i].icount; + ifreecount += agcnts[i].ifreecount; + } + + /* + * Validate that our manual counts match the superblock. + */ + if (mp->m_sb.sb_icount != icount) { + do_warn(_("sb_icount %lld, counted %lld\n"), + mp->m_sb.sb_icount, icount); + } + + if (mp->m_sb.sb_ifree != ifreecount) { + do_warn(_("sb_ifree %lld, counted %lld\n"), + mp->m_sb.sb_ifree, ifreecount); + } + + if (mp->m_sb.sb_fdblocks != fdblocks) { + do_warn(_("sb_fdblocks %lld, counted %lld\n"), + mp->m_sb.sb_fdblocks, fdblocks); + } +} + diff --git a/repair/scan.h b/repair/scan.h index 20567fb..9f945cf 100644 --- a/repair/scan.h +++ b/repair/scan.h @@ -20,19 +20,6 @@ struct blkmap; -void scan_sbtree( - xfs_agblock_t root, - int nlevels, - xfs_agnumber_t agno, - int suspect, - void (*func)(struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot), - int isroot); - int scan_lbtree( xfs_dfsbno_t root, int nlevels, @@ -74,29 +61,9 @@ int scanfunc_bmap( int check_dups, int *dirty); -void scanfunc_bno( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot); - -void scanfunc_cnt( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot); - void -scanfunc_ino( - struct xfs_btree_block *block, - int level, - xfs_agblock_t bno, - xfs_agnumber_t agno, - int suspect, - int isroot); +scan_ags( + struct xfs_mount *mp, + int scan_threads); #endif /* _XR_SCAN_H */ diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 1d9ad46..4707b83 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -33,7 +33,7 @@ #define rounddown(x, y) (((x)/(y))*(y)) extern void phase1(xfs_mount_t *); -extern void phase2(xfs_mount_t *); +extern void phase2(xfs_mount_t *, int); extern void phase3(xfs_mount_t *); extern void phase4(xfs_mount_t *); extern void phase5(xfs_mount_t *); @@ -63,6 +63,8 @@ char *o_opts[] = { "ag_stride", #define FORCE_GEO 5 "force_geometry", +#define PHASE2_THREADS 6 + "phase2_threads", NULL }; @@ -80,6 +82,7 @@ char *c_opts[] = { static int ihash_option_used; static int bhash_option_used; static long max_mem_specified; /* in megabytes */ +static int phase2_threads = 32; static void usage(void) @@ -266,6 +269,9 @@ process_args(int argc, char **argv) respec('o', o_opts, FORCE_GEO); force_geo = 1; break; + case PHASE2_THREADS: + phase2_threads = (int)strtol(val, NULL, 0); + break; default: unknown('o', val); break; @@ -709,7 +715,7 @@ main(int argc, char **argv) } /* make sure the per-ag freespace maps are ok so we can mount the fs */ - phase2(mp); + phase2(mp, phase2_threads); timestamp(PHASE_END, 2, NULL); if (do_prefetch) -- 1.7.2.3 From michael.monnerie@is.it-management.at Mon Jan 10 01:55:49 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0A7tmHR220814 for ; Mon, 10 Jan 2011 01:55:49 -0600 X-ASG-Debug-ID: 1294646276-095b02890000-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 80B9624DCCB for ; Sun, 9 Jan 2011 23:57:56 -0800 (PST) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id fGeIiEhRMPaWbkfT for ; Sun, 09 Jan 2011 23:57: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 C205742B; Mon, 10 Jan 2011 08:57:54 +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 AEBB0401C2F; Mon, 10 Jan 2011 08:57:53 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: multithread phase 2 Subject: Re: [PATCH] xfs_repair: multithread phase 2 Date: Mon, 10 Jan 2011 08:57:52 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.37-zmi; KDE/4.4.4; x86_64; ; ) Cc: Dave Chinner References: <1294620248-17098-1-git-send-email-david@fromorbit.com> In-Reply-To: <1294620248-17098-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1393371.eMgovlejhY"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201101100857.53421@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1294646277 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0009 1.0000 -2.0149 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.51953 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 --nextPart1393371.eMgovlejhY Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Montag, 10. Januar 2011 Dave Chinner wrote: > This patch uses 32-way threading which results in no noticable > slowdown on single SATA drives with NCQ, but results in ~10x > reduction in runtime on a 12 disk RAID-0 array. Is the fixed 32-way number reasonable, or shouldn't that be "number of=20 available cpu cores"-way? Why threading when you have a single core cpu? =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/ --nextPart1393371.eMgovlejhY 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) iEYEABECAAYFAk0qvAEACgkQzhSR9xwSCbSGcgCgtQLXXb4XdpC1eBk+KQMa+/mS yZsAn2ZatSYoDhRY7os3SPS5acA3nOFx =W/PX -----END PGP SIGNATURE----- --nextPart1393371.eMgovlejhY-- From tore.hoivaag.larsen@cggveritas.com Mon Jan 10 02:33:40 2011 X-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,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 p0A8XeSl224672 for ; Mon, 10 Jan 2011 02:33:40 -0600 X-ASG-Debug-ID: 1294648550-256301c00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from AM1EHSOBE003.bigfish.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DA0C51D1E023 for ; Mon, 10 Jan 2011 00:35:51 -0800 (PST) Received: from AM1EHSOBE003.bigfish.com (am1ehsobe003.messaging.microsoft.com [213.199.154.206]) by cuda.sgi.com with ESMTP id k6wfYVumSymZkCqf for ; Mon, 10 Jan 2011 00:35:51 -0800 (PST) Received: from mail4-am1-R.bigfish.com (10.3.201.247) by AM1EHSOBE003.bigfish.com (10.3.204.23) with Microsoft SMTP Server id 14.1.225.8; Mon, 10 Jan 2011 08:35:50 +0000 Received: from mail4-am1 (localhost.localdomain [127.0.0.1]) by mail4-am1-R.bigfish.com (Postfix) with ESMTP id 122181120567; Mon, 10 Jan 2011 08:35:50 +0000 (UTC) X-SpamScore: -5 X-BigFish: VS-5(zzdf9Mzz1202hzz8275bhz2dh27ah2a8h668h65h) X-Forefront-Antispam-Report: KIP:(null);UIP:(null);IPVD:NLI;H:hou-exh02.int.cggveritas.com;RD:error;EFVD:FOP Received: from mail4-am1 (localhost.localdomain [127.0.0.1]) by mail4-am1 (MessageSwitch) id 1294648549970060_15166; Mon, 10 Jan 2011 08:35:49 +0000 (UTC) Received: from AM1EHSMHS007.bigfish.com (unknown [10.3.201.247]) by mail4-am1.bigfish.com (Postfix) with ESMTP id E05D98004B; Mon, 10 Jan 2011 08:35:49 +0000 (UTC) Received: from hou-exh02.int.cggveritas.com (192.159.106.244) by AM1EHSMHS007.bigfish.com (10.3.207.107) with Microsoft SMTP Server (TLS) id 14.1.225.8; Mon, 10 Jan 2011 08:35:47 +0000 Received: from crw-exh02.int.cggveritas.com (10.50.16.46) by hou-exh02.int.cggveritas.com (10.14.1.187) with Microsoft SMTP Server (TLS) id 8.2.254.0; Mon, 10 Jan 2011 02:35:45 -0600 Received: from CRW-EXM01.int.cggveritas.com ([10.14.254.241]) by crw-exh02.int.cggveritas.com ([10.50.16.46]) with mapi; Mon, 10 Jan 2011 08:35:44 +0000 From: =?iso-8859-1?Q?Larsen=2C_Tore_H=F8ivaag?= To: "xfs@oss.sgi.com" CC: Alexis Cousein Date: Mon, 10 Jan 2011 08:35:44 +0000 X-ASG-Orig-Subj: RedHat, Novell and SGI xfs kernel module api Subject: RedHat, Novell and SGI xfs kernel module api Thread-Topic: RedHat, Novell and SGI xfs kernel module api Thread-Index: AQHLsKFeldJ402CHtkCP0ZyaLKQsSg== Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Bypass-Agent: EF-1; X-OriginatorOrg: cggveritas.com X-Barracuda-Connect: am1ehsobe003.messaging.microsoft.com[213.199.154.206] X-Barracuda-Start-Time: 1294648551 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0066 1.0000 -1.9781 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.98 X-Barracuda-Spam-Status: No, SCORE=-1.98 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.51955 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, currently we are purchasing Redhat's ScaleFS, SGI's cxfs, and Novell SL= ES xfs. Having e.g. Redhat XFS play nicely with cxfs client is not trivial. Usu= ally, I have to choose ScaleFS w/lvm2 volumes og RHEL, but if I want cxfs, = But I can't have local xvm volumes on 3rd party hw.=20 Is there plans to make an effort to making sure the xfs api is common f= rom the vendors and play nicely with each other ? Comments?=20 Mvh / Best Regards, --=20 MSc Tore H. Larsen Sr. Systems Engineer, Instrumentation CGGVeritas MAPL TSG tel: +47 56 11 48 36 mob:+47 918 33 670 fax: +47 56 11 48 01 www.cggveritas.com mailto:tore.hoivaag.larsen@cggveritas.com CGGVeritas Services Norway AS Carl Konows gate 34 N-5162 Laksev=E5g - Bergen Norway= From SRS0+wAbv+44+fromorbit.com=david@internode.on.net Mon Jan 10 02:39:15 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0A8dEnB226147 for ; Mon, 10 Jan 2011 02:39:15 -0600 X-ASG-Debug-ID: 1294648885-318001e30000-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 9A82B24E14D for ; Mon, 10 Jan 2011 00:41:25 -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 EN2EVcyMX54M1hGJ for ; Mon, 10 Jan 2011 00:41:25 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52045498-1927428 for multiple; Mon, 10 Jan 2011 19:11:24 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PcDJa-0004ww-Qb; Mon, 10 Jan 2011 19:41:22 +1100 Date: Mon, 10 Jan 2011 19:41:22 +1100 From: Dave Chinner To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: multithread phase 2 Subject: Re: [PATCH] xfs_repair: multithread phase 2 Message-ID: <20110110084122.GF28803@dastard> References: <1294620248-17098-1-git-send-email-david@fromorbit.com> <201101100857.53421@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201101100857.53421@zmi.at> 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: 1294648886 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0190 1.0000 -1.8978 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.90 X-Barracuda-Spam-Status: No, SCORE=-1.90 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.51955 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, Jan 10, 2011 at 08:57:52AM +0100, Michael Monnerie wrote: > On Montag, 10. Januar 2011 Dave Chinner wrote: > > This patch uses 32-way threading which results in no noticable > > slowdown on single SATA drives with NCQ, but results in ~10x > > reduction in runtime on a 12 disk RAID-0 array. > > Is the fixed 32-way number reasonable, or shouldn't that be "number of > available cpu cores"-way? Why threading when you have a single core cpu? Sure, 32-way is reasonable on a single disk and CPU. Pretty much every sata disk supports NCQ these days, and default to a depth of 32, which means we can have 32 concurrent reads in progress at once. Phase 2 is all synchronous IO, so the only way to hide the IO latency is to queue work to multiple threads and switch between the threadsto work on another queue when the current one blocks waiting for IO. Basically the threading being used to drive IO level concurrency, not to drive CPU level concurrency - the total CPU usage of phase 2 is less than what even a slow CPU can provide, so to keep it busy we need lots of concurrent IO streams in progress at once... And if you want to change it, there's a command line option for it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+pOxJ+44+fromorbit.com=dave@internode.on.net Mon Jan 10 02:42:51 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0A8goEX226352 for ; Mon, 10 Jan 2011 02:42:51 -0600 X-ASG-Debug-ID: 1294649100-289301f80000-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 7885F1D1E072 for ; Mon, 10 Jan 2011 00:45:01 -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 0bLYAFHKWf86vhx8 for ; Mon, 10 Jan 2011 00:45:01 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 7019538-1927428 for ; Mon, 10 Jan 2011 19:14:59 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcDN3-0004x6-U6 for xfs@oss.sgi.com; Mon, 10 Jan 2011 19:44:57 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PcDN1-00075k-5p for xfs@oss.sgi.com; Mon, 10 Jan 2011 19:44:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/3] xfsprogs: sync up with 2.6.38 kernel code V2 Subject: [PATCH 0/3] xfsprogs: sync up with 2.6.38 kernel code V2 Date: Mon, 10 Jan 2011 19:44:48 +1100 Message-Id: <1294649091-27174-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: 1294649102 X-Barracuda-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.51955 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 version 2 of the 2.6.38 kernel code sync to userspace. It currently passes xfstests on x86_64 with no new regressions regardless of the filesystem block size combination I throw at it. Note: this does not convert xfsprogs to the kernel xfs_trans_ijoin\ ijoin_ref interface, it maintains the older ijoin/ihold interface because of the different way the inode reference counting works in libxfs. More work will be needed to change it over to a manner compatible with the current kernel API. Note: log sector size handling needs to be sorted out. Specifically, initialising l_sectbb_log/l_sectBBsize correctly and removing the hacks in xlog_bread and friends (libxlog/xfs_log_recover.c) to work around the fact they are not initialised correctly. (FWIW, I don't think xfsprogs handles large log sector size correctly as a result, and especially not if the log device sector size is different to the data device sector size). Version 2: - split into three patches: - reintroduction of radix tree code - libxlog resync - includes required libxfs transaction code changes - updates logprint to use new interfaces - libxfs resync - updates libxfs - updates all xfsprogs to use new libxfs interfaces. - fixes xfstest 033 cache_purge bug - was a problem in handling the XFS_ILI_HOLD flag removal. --- The following changes since commit adfdbed6a014a412529864a66b09117e6a4bee64: Update xfsprogs Debian maintainer annotation, bump version. (2010-11-11 21:11:44 +1100) are available in the git repository at: git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev kernel-2.6.38-sync Dave Chinner (5): repair: warn if running in low memory mode xfs_repair: multithread phase 2 libxfs: reintroduce old xfs_repair radix-tree code libxlog: sync up with 2.6.38 kernel code libxfs: sync files with 2.6.38 kernel code db/attr.c | 16 +- db/attrset.c | 5 +- db/bmap.c | 18 +- db/bmap.h | 4 +- db/check.c | 50 +- db/convert.c | 6 +- db/dir2sf.c | 6 +- db/field.c | 2 +- db/frag.c | 6 +- db/inode.c | 124 ++-- db/metadump.c | 20 +- include/Makefile | 5 +- include/atomic.h | 31 + include/hlist.h | 76 ++ include/libxfs.h | 44 +- include/libxlog.h | 16 +- include/list.h | 11 + include/radix-tree.h | 76 ++ include/xfs_ag.h | 100 ++- include/xfs_alloc.h | 58 +- include/xfs_arch.h | 32 - include/xfs_attr_leaf.h | 12 - include/xfs_attr_sf.h | 42 +- include/xfs_bit.h | 10 +- include/xfs_bmap.h | 133 ++-- include/xfs_bmap_btree.h | 20 +- include/xfs_btree.h | 31 +- include/xfs_btree_trace.h | 17 - include/xfs_buf_item.h | 50 +- include/xfs_da_btree.h | 21 +- include/xfs_dfrag.h | 5 +- include/xfs_dinode.h | 149 ++--- include/xfs_dir2.h | 4 +- include/xfs_dir2_data.h | 2 +- include/xfs_dir2_node.h | 2 - include/xfs_dir2_sf.h | 7 - include/xfs_extfree_item.h | 17 +- include/xfs_fs.h | 30 +- include/xfs_ialloc.h | 30 +- include/xfs_ialloc_btree.h | 23 +- include/xfs_imap.h | 38 - include/xfs_inode.h | 210 +++--- include/xfs_inode_item.h | 32 +- include/xfs_inum.h | 1 - include/xfs_log.h | 70 +- include/xfs_log_priv.h | 331 +++++++-- include/xfs_log_recover.h | 25 +- include/xfs_mount.h | 259 ++----- include/xfs_quota.h | 160 ++-- include/xfs_rtalloc.h | 19 +- include/xfs_sb.h | 168 +++-- include/xfs_trace.h | 85 +++ include/xfs_trans.h | 648 +++-------------- include/xfs_trans_space.h | 2 +- include/xfs_types.h | 18 +- libxfs/Makefile | 2 +- libxfs/init.c | 133 +++- libxfs/logitem.c | 371 +--------- libxfs/radix-tree.c | 805 ++++++++++++++++++++ libxfs/trans.c | 211 ++---- libxfs/util.c | 75 +- libxfs/xfs.h | 49 +- libxfs/xfs_alloc.c | 599 ++++++++-------- libxfs/xfs_alloc_btree.c | 46 +- libxfs/xfs_attr.c | 138 ++-- libxfs/xfs_attr_leaf.c | 135 ++-- libxfs/xfs_bmap.c | 1773 ++++++++++++++++++++++---------------------- libxfs/xfs_bmap_btree.c | 129 ++-- libxfs/xfs_btree.c | 96 ++- libxfs/xfs_da_btree.c | 48 +- libxfs/xfs_dir2.c | 31 +- libxfs/xfs_dir2_block.c | 28 +- libxfs/xfs_dir2_leaf.c | 21 +- libxfs/xfs_dir2_node.c | 29 +- libxfs/xfs_dir2_sf.c | 24 +- libxfs/xfs_ialloc.c | 1157 +++++++++++++++-------------- libxfs/xfs_ialloc_btree.c | 35 +- libxfs/xfs_inode.c | 277 ++++---- libxfs/xfs_mount.c | 123 +--- libxfs/xfs_trans.c | 492 +++++++++++-- libxlog/xfs_log_recover.c | 606 ++++++++------- logprint/log_misc.c | 2 +- logprint/log_print_all.c | 13 +- logprint/log_print_trans.c | 4 +- mkfs/proto.c | 18 +- mkfs/xfs_mkfs.c | 3 +- repair/attr_repair.c | 14 +- repair/dino_chunks.c | 12 +- repair/dinode.c | 275 ++++---- repair/dir.c | 18 +- repair/dir2.c | 22 +- repair/incore.h | 3 + repair/phase2.c | 20 +- repair/phase6.c | 76 +- repair/prefetch.c | 29 +- repair/rt.c | 2 +- repair/scan.c | 294 +++++---- repair/scan.h | 39 +- repair/xfs_repair.c | 26 +- 99 files changed, 6094 insertions(+), 5586 deletions(-) create mode 100644 include/atomic.h create mode 100644 include/hlist.h create mode 100644 include/radix-tree.h delete mode 100644 include/xfs_imap.h create mode 100644 include/xfs_trace.h create mode 100644 libxfs/radix-tree.c From SRS0+Vwyn+44+fromorbit.com=dave@internode.on.net Mon Jan 10 02:43:01 2011 X-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_61, J_CHICKENPOX_64,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 p0A8h1DV226378 for ; Mon, 10 Jan 2011 02:43:01 -0600 X-ASG-Debug-ID: 1294649110-35cd011d0000-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 635221D1E074 for ; Mon, 10 Jan 2011 00:45:10 -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 llFTsRfbUF83QdFp for ; Mon, 10 Jan 2011 00:45:10 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52076516-1927428 for ; Mon, 10 Jan 2011 19:15:09 +1030 (CDT) Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcDND-0004x7-TE for xfs@oss.sgi.com; Mon, 10 Jan 2011 19:45:07 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PcDN1-00075m-7f for xfs@oss.sgi.com; Mon, 10 Jan 2011 19:44:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/3] libxfs: reintroduce old xfs_repair radix-tree code Subject: [PATCH 1/3] libxfs: reintroduce old xfs_repair radix-tree code Date: Mon, 10 Jan 2011 19:44:49 +1100 Message-Id: <1294649091-27174-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294649091-27174-1-git-send-email-david@fromorbit.com> References: <1294649091-27174-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1294649112 X-Barracuda-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.51955 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 current kernel code uses radix trees more widely than the previous code, so for the next sync we need radix tree support in libxfs. Pull the old radix tree code out the xfs_repair git history and move it into libxfs to simplify the kernel code sync. Signed-off-by: Dave Chinner --- include/Makefile | 2 +- include/libxfs.h | 1 + include/radix-tree.h | 76 +++++ libxfs/Makefile | 2 +- libxfs/radix-tree.c | 805 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 884 insertions(+), 2 deletions(-) create mode 100644 include/radix-tree.h create mode 100644 libxfs/radix-tree.c diff --git a/include/Makefile b/include/Makefile index 912f1ba..63709e6 100644 --- a/include/Makefile +++ b/include/Makefile @@ -19,7 +19,7 @@ TOPDIR = .. include $(TOPDIR)/include/builddefs QAHFILES = libxfs.h libxlog.h \ - bitops.h cache.h kmem.h list.h parent.h swab.h \ + bitops.h cache.h kmem.h list.h parent.h radix-tree.h swab.h \ xfs_ag.h xfs_alloc.h xfs_alloc_btree.h xfs_arch.h xfs_attr_leaf.h \ xfs_attr_sf.h xfs_bit.h xfs_bmap.h xfs_bmap_btree.h xfs_btree.h \ xfs_btree_trace.h xfs_buf_item.h xfs_da_btree.h xfs_dinode.h \ diff --git a/include/libxfs.h b/include/libxfs.h index e7199c7..13fbf79 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include diff --git a/include/radix-tree.h b/include/radix-tree.h new file mode 100644 index 0000000..e16e08d --- /dev/null +++ b/include/radix-tree.h @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2001 Momchil Velikov + * Portions Copyright (C) 2001 Christoph Hellwig + * + * 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, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef __XFS_SUPPORT_RADIX_TREE_H__ +#define __XFS_SUPPORT_RADIX_TREE_H__ + +#define RADIX_TREE_TAGS + +struct radix_tree_root { + unsigned int height; + struct radix_tree_node *rnode; +}; + +#define RADIX_TREE_INIT(mask) { \ + .height = 0, \ + .rnode = NULL, \ +} + +#define RADIX_TREE(name, mask) \ + struct radix_tree_root name = RADIX_TREE_INIT(mask) + +#define INIT_RADIX_TREE(root, mask) \ +do { \ + (root)->height = 0; \ + (root)->rnode = NULL; \ +} while (0) + +#ifdef RADIX_TREE_TAGS +#define RADIX_TREE_MAX_TAGS 2 +#endif + +int radix_tree_insert(struct radix_tree_root *, unsigned long, void *); +void *radix_tree_lookup(struct radix_tree_root *, unsigned long); +void **radix_tree_lookup_slot(struct radix_tree_root *, unsigned long); +void *radix_tree_lookup_first(struct radix_tree_root *, unsigned long *); +void *radix_tree_delete(struct radix_tree_root *, unsigned long); +unsigned int +radix_tree_gang_lookup(struct radix_tree_root *root, void **results, + unsigned long first_index, unsigned int max_items); +unsigned int +radix_tree_gang_lookup_ex(struct radix_tree_root *root, void **results, + unsigned long first_index, unsigned long last_index, + unsigned int max_items); + +void radix_tree_init(void); + +#ifdef RADIX_TREE_TAGS +void *radix_tree_tag_set(struct radix_tree_root *root, + unsigned long index, unsigned int tag); +void *radix_tree_tag_clear(struct radix_tree_root *root, + unsigned long index, unsigned int tag); +int radix_tree_tag_get(struct radix_tree_root *root, + unsigned long index, unsigned int tag); +unsigned int +radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results, + unsigned long first_index, unsigned int max_items, + unsigned int tag); +int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag); +#endif + +#endif /* __XFS_SUPPORT_RADIX_TREE_H__ */ diff --git a/libxfs/Makefile b/libxfs/Makefile index 990cbf7..b3fd85c 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -11,7 +11,7 @@ LT_REVISION = 0 LT_AGE = 0 HFILES = xfs.h init.h -CFILES = cache.c init.c kmem.c logitem.c rdwr.c trans.c util.c \ +CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_alloc.c xfs_ialloc.c xfs_inode.c xfs_btree.c xfs_alloc_btree.c \ xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c \ xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c \ diff --git a/libxfs/radix-tree.c b/libxfs/radix-tree.c new file mode 100644 index 0000000..36a6324 --- /dev/null +++ b/libxfs/radix-tree.c @@ -0,0 +1,805 @@ +/* + * Copyright (C) 2001 Momchil Velikov + * Portions Copyright (C) 2001 Christoph Hellwig + * Copyright (C) 2005 SGI, Christoph Lameter + * + * 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, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include "radix-tree.h" + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif + +#define RADIX_TREE_MAP_SHIFT 6 +#define RADIX_TREE_MAP_SIZE (1UL << RADIX_TREE_MAP_SHIFT) +#define RADIX_TREE_MAP_MASK (RADIX_TREE_MAP_SIZE-1) + +#ifdef RADIX_TREE_TAGS +#define RADIX_TREE_TAG_LONGS \ + ((RADIX_TREE_MAP_SIZE + BITS_PER_LONG - 1) / BITS_PER_LONG) +#endif + +struct radix_tree_node { + unsigned int count; + void *slots[RADIX_TREE_MAP_SIZE]; +#ifdef RADIX_TREE_TAGS + unsigned long tags[RADIX_TREE_MAX_TAGS][RADIX_TREE_TAG_LONGS]; +#endif +}; + +struct radix_tree_path { + struct radix_tree_node *node; + int offset; +}; + +#define RADIX_TREE_INDEX_BITS (8 /* CHAR_BIT */ * sizeof(unsigned long)) +#define RADIX_TREE_MAX_PATH (RADIX_TREE_INDEX_BITS/RADIX_TREE_MAP_SHIFT + 2) + +static unsigned long height_to_maxindex[RADIX_TREE_MAX_PATH]; + +/* + * Radix tree node cache. + */ + +#define radix_tree_node_alloc(r) ((struct radix_tree_node *) \ + calloc(1, sizeof(struct radix_tree_node))) +#define radix_tree_node_free(n) free(n) + +#ifdef RADIX_TREE_TAGS + +static inline void tag_set(struct radix_tree_node *node, unsigned int tag, + int offset) +{ + *((__uint32_t *)node->tags[tag] + (offset >> 5)) |= (1 << (offset & 31)); +} + +static inline void tag_clear(struct radix_tree_node *node, unsigned int tag, + int offset) +{ + __uint32_t *p = (__uint32_t*)node->tags[tag] + (offset >> 5); + __uint32_t m = 1 << (offset & 31); + *p &= ~m; +} + +static inline int tag_get(struct radix_tree_node *node, unsigned int tag, + int offset) +{ + return 1 & (((const __uint32_t *)node->tags[tag])[offset >> 5] >> (offset & 31)); +} + +/* + * Returns 1 if any slot in the node has this tag set. + * Otherwise returns 0. + */ +static inline int any_tag_set(struct radix_tree_node *node, unsigned int tag) +{ + int idx; + for (idx = 0; idx < RADIX_TREE_TAG_LONGS; idx++) { + if (node->tags[tag][idx]) + return 1; + } + return 0; +} + +#endif + +/* + * Return the maximum key which can be store into a + * radix tree with height HEIGHT. + */ +static inline unsigned long radix_tree_maxindex(unsigned int height) +{ + return height_to_maxindex[height]; +} + +/* + * Extend a radix tree so it can store key @index. + */ +static int radix_tree_extend(struct radix_tree_root *root, unsigned long index) +{ + struct radix_tree_node *node; + unsigned int height; +#ifdef RADIX_TREE_TAGS + char tags[RADIX_TREE_MAX_TAGS]; + int tag; +#endif + + /* Figure out what the height should be. */ + height = root->height + 1; + while (index > radix_tree_maxindex(height)) + height++; + + if (root->rnode == NULL) { + root->height = height; + goto out; + } + +#ifdef RADIX_TREE_TAGS + /* + * Prepare the tag status of the top-level node for propagation + * into the newly-pushed top-level node(s) + */ + for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { + tags[tag] = 0; + if (any_tag_set(root->rnode, tag)) + tags[tag] = 1; + } +#endif + do { + if (!(node = radix_tree_node_alloc(root))) + return -ENOMEM; + + /* Increase the height. */ + node->slots[0] = root->rnode; + +#ifdef RADIX_TREE_TAGS + /* Propagate the aggregated tag info into the new root */ + for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { + if (tags[tag]) + tag_set(node, tag, 0); + } +#endif + node->count = 1; + root->rnode = node; + root->height++; + } while (height > root->height); +out: + return 0; +} + +/** + * radix_tree_insert - insert into a radix tree + * @root: radix tree root + * @index: index key + * @item: item to insert + * + * Insert an item into the radix tree at position @index. + */ +int radix_tree_insert(struct radix_tree_root *root, + unsigned long index, void *item) +{ + struct radix_tree_node *node = NULL, *slot; + unsigned int height, shift; + int offset; + int error; + + /* Make sure the tree is high enough. */ + if ((!index && !root->rnode) || + index > radix_tree_maxindex(root->height)) { + error = radix_tree_extend(root, index); + if (error) + return error; + } + + slot = root->rnode; + height = root->height; + shift = (height-1) * RADIX_TREE_MAP_SHIFT; + + offset = 0; /* uninitialised var warning */ + do { + if (slot == NULL) { + /* Have to add a child node. */ + if (!(slot = radix_tree_node_alloc(root))) + return -ENOMEM; + if (node) { + node->slots[offset] = slot; + node->count++; + } else + root->rnode = slot; + } + + /* Go a level down */ + offset = (index >> shift) & RADIX_TREE_MAP_MASK; + node = slot; + slot = node->slots[offset]; + shift -= RADIX_TREE_MAP_SHIFT; + height--; + } while (height > 0); + + if (slot != NULL) + return -EEXIST; + + ASSERT(node); + node->count++; + node->slots[offset] = item; +#ifdef RADIX_TREE_TAGS + ASSERT(!tag_get(node, 0, offset)); + ASSERT(!tag_get(node, 1, offset)); +#endif + return 0; +} + +static inline void **__lookup_slot(struct radix_tree_root *root, + unsigned long index) +{ + unsigned int height, shift; + struct radix_tree_node **slot; + + height = root->height; + if (index > radix_tree_maxindex(height)) + return NULL; + + shift = (height-1) * RADIX_TREE_MAP_SHIFT; + slot = &root->rnode; + + while (height > 0) { + if (*slot == NULL) + return NULL; + + slot = (struct radix_tree_node **) + ((*slot)->slots + + ((index >> shift) & RADIX_TREE_MAP_MASK)); + shift -= RADIX_TREE_MAP_SHIFT; + height--; + } + + return (void **)slot; +} + +/** + * radix_tree_lookup_slot - lookup a slot in a radix tree + * @root: radix tree root + * @index: index key + * + * Lookup the slot corresponding to the position @index in the radix tree + * @root. This is useful for update-if-exists operations. + */ +void **radix_tree_lookup_slot(struct radix_tree_root *root, unsigned long index) +{ + return __lookup_slot(root, index); +} + +/** + * radix_tree_lookup - perform lookup operation on a radix tree + * @root: radix tree root + * @index: index key + * + * Lookup the item at the position @index in the radix tree @root. + */ +void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index) +{ + void **slot; + + slot = __lookup_slot(root, index); + return slot != NULL ? *slot : NULL; +} + +/** + * raid_tree_first_key - find the first index key in the radix tree + * @root: radix tree root + * @index: where the first index will be placed + * + * Returns the first entry and index key in the radix tree @root. + */ +void *radix_tree_lookup_first(struct radix_tree_root *root, unsigned long *index) +{ + unsigned int height, shift; + struct radix_tree_node *slot; + unsigned long i; + + height = root->height; + *index = 0; + if (height == 0) + return NULL; + + shift = (height-1) * RADIX_TREE_MAP_SHIFT; + slot = root->rnode; + + for (; height > 1; height--) { + for (i = 0; i < RADIX_TREE_MAP_SIZE; i++) { + if (slot->slots[i] != NULL) + break; + } + ASSERT(i < RADIX_TREE_MAP_SIZE); + + *index |= (i << shift); + shift -= RADIX_TREE_MAP_SHIFT; + slot = slot->slots[i]; + } + for (i = 0; i < RADIX_TREE_MAP_SIZE; i++) { + if (slot->slots[i] != NULL) { + *index |= i; + return slot->slots[i]; + } + } + return NULL; +} + +#ifdef RADIX_TREE_TAGS + +/** + * radix_tree_tag_set - set a tag on a radix tree node + * @root: radix tree root + * @index: index key + * @tag: tag index + * + * Set the search tag (which must be < RADIX_TREE_MAX_TAGS) + * corresponding to @index in the radix tree. From + * the root all the way down to the leaf node. + * + * Returns the address of the tagged item. Setting a tag on a not-present + * item is a bug. + */ +void *radix_tree_tag_set(struct radix_tree_root *root, + unsigned long index, unsigned int tag) +{ + unsigned int height, shift; + struct radix_tree_node *slot; + + height = root->height; + if (index > radix_tree_maxindex(height)) + return NULL; + + shift = (height - 1) * RADIX_TREE_MAP_SHIFT; + slot = root->rnode; + + while (height > 0) { + int offset; + + offset = (index >> shift) & RADIX_TREE_MAP_MASK; + if (!tag_get(slot, tag, offset)) + tag_set(slot, tag, offset); + slot = slot->slots[offset]; + ASSERT(slot != NULL); + shift -= RADIX_TREE_MAP_SHIFT; + height--; + } + + return slot; +} + +/** + * radix_tree_tag_clear - clear a tag on a radix tree node + * @root: radix tree root + * @index: index key + * @tag: tag index + * + * Clear the search tag (which must be < RADIX_TREE_MAX_TAGS) + * corresponding to @index in the radix tree. If + * this causes the leaf node to have no tags set then clear the tag in the + * next-to-leaf node, etc. + * + * Returns the address of the tagged item on success, else NULL. ie: + * has the same return value and semantics as radix_tree_lookup(). + */ +void *radix_tree_tag_clear(struct radix_tree_root *root, + unsigned long index, unsigned int tag) +{ + struct radix_tree_path path[RADIX_TREE_MAX_PATH], *pathp = path; + struct radix_tree_node *slot; + unsigned int height, shift; + void *ret = NULL; + + height = root->height; + if (index > radix_tree_maxindex(height)) + goto out; + + shift = (height - 1) * RADIX_TREE_MAP_SHIFT; + pathp->node = NULL; + slot = root->rnode; + + while (height > 0) { + int offset; + + if (slot == NULL) + goto out; + + offset = (index >> shift) & RADIX_TREE_MAP_MASK; + pathp[1].offset = offset; + pathp[1].node = slot; + slot = slot->slots[offset]; + pathp++; + shift -= RADIX_TREE_MAP_SHIFT; + height--; + } + + ret = slot; + if (ret == NULL) + goto out; + + do { + if (!tag_get(pathp->node, tag, pathp->offset)) + goto out; + tag_clear(pathp->node, tag, pathp->offset); + if (any_tag_set(pathp->node, tag)) + goto out; + pathp--; + } while (pathp->node); +out: + return ret; +} + +#endif + +static unsigned int +__lookup(struct radix_tree_root *root, void **results, unsigned long index, + unsigned int max_items, unsigned long *next_index) +{ + unsigned int nr_found = 0; + unsigned int shift, height; + struct radix_tree_node *slot; + unsigned long i; + + height = root->height; + if (height == 0) + goto out; + + shift = (height-1) * RADIX_TREE_MAP_SHIFT; + slot = root->rnode; + + for ( ; height > 1; height--) { + + for (i = (index >> shift) & RADIX_TREE_MAP_MASK ; + i < RADIX_TREE_MAP_SIZE; i++) { + if (slot->slots[i] != NULL) + break; + index &= ~((1UL << shift) - 1); + index += 1UL << shift; + if (index == 0) + goto out; /* 32-bit wraparound */ + } + if (i == RADIX_TREE_MAP_SIZE) + goto out; + + shift -= RADIX_TREE_MAP_SHIFT; + slot = slot->slots[i]; + } + + /* Bottom level: grab some items */ + for (i = index & RADIX_TREE_MAP_MASK; i < RADIX_TREE_MAP_SIZE; i++) { + index++; + if (slot->slots[i]) { + results[nr_found++] = slot->slots[i]; + if (nr_found == max_items) + goto out; + } + } +out: + *next_index = index; + return nr_found; +} + +/** + * radix_tree_gang_lookup - perform multiple lookup on a radix tree + * @root: radix tree root + * @results: where the results of the lookup are placed + * @first_index: start the lookup from this key + * @max_items: place up to this many items at *results + * + * Performs an index-ascending scan of the tree for present items. Places + * them at *@results and returns the number of items which were placed at + * *@results. + * + * The implementation is naive. + */ +unsigned int +radix_tree_gang_lookup(struct radix_tree_root *root, void **results, + unsigned long first_index, unsigned int max_items) +{ + const unsigned long max_index = radix_tree_maxindex(root->height); + unsigned long cur_index = first_index; + unsigned int ret = 0; + + while (ret < max_items) { + unsigned int nr_found; + unsigned long next_index; /* Index of next search */ + + if (cur_index > max_index) + break; + nr_found = __lookup(root, results + ret, cur_index, + max_items - ret, &next_index); + ret += nr_found; + if (next_index == 0) + break; + cur_index = next_index; + } + return ret; +} + +/** + * radix_tree_gang_lookup_ex - perform multiple lookup on a radix tree + * @root: radix tree root + * @results: where the results of the lookup are placed + * @first_index: start the lookup from this key + * @last_index: don't lookup past this key + * @max_items: place up to this many items at *results + * + * Performs an index-ascending scan of the tree for present items starting + * @first_index until @last_index up to as many as @max_items. Places + * them at *@results and returns the number of items which were placed + * at *@results. + * + * The implementation is naive. + */ +unsigned int +radix_tree_gang_lookup_ex(struct radix_tree_root *root, void **results, + unsigned long first_index, unsigned long last_index, + unsigned int max_items) +{ + const unsigned long max_index = radix_tree_maxindex(root->height); + unsigned long cur_index = first_index; + unsigned int ret = 0; + + while (ret < max_items && cur_index < last_index) { + unsigned int nr_found; + unsigned long next_index; /* Index of next search */ + + if (cur_index > max_index) + break; + nr_found = __lookup(root, results + ret, cur_index, + max_items - ret, &next_index); + ret += nr_found; + if (next_index == 0) + break; + cur_index = next_index; + } + return ret; +} + +#ifdef RADIX_TREE_TAGS + +static unsigned int +__lookup_tag(struct radix_tree_root *root, void **results, unsigned long index, + unsigned int max_items, unsigned long *next_index, unsigned int tag) +{ + unsigned int nr_found = 0; + unsigned int shift; + unsigned int height = root->height; + struct radix_tree_node *slot; + + shift = (height - 1) * RADIX_TREE_MAP_SHIFT; + slot = root->rnode; + + while (height > 0) { + unsigned long i = (index >> shift) & RADIX_TREE_MAP_MASK; + + for ( ; i < RADIX_TREE_MAP_SIZE; i++) { + if (tag_get(slot, tag, i)) { + ASSERT(slot->slots[i] != NULL); + break; + } + index &= ~((1UL << shift) - 1); + index += 1UL << shift; + if (index == 0) + goto out; /* 32-bit wraparound */ + } + if (i == RADIX_TREE_MAP_SIZE) + goto out; + height--; + if (height == 0) { /* Bottom level: grab some items */ + unsigned long j = index & RADIX_TREE_MAP_MASK; + + for ( ; j < RADIX_TREE_MAP_SIZE; j++) { + index++; + if (tag_get(slot, tag, j)) { + ASSERT(slot->slots[j] != NULL); + results[nr_found++] = slot->slots[j]; + if (nr_found == max_items) + goto out; + } + } + } + shift -= RADIX_TREE_MAP_SHIFT; + slot = slot->slots[i]; + } +out: + *next_index = index; + return nr_found; +} + +/** + * radix_tree_gang_lookup_tag - perform multiple lookup on a radix tree + * based on a tag + * @root: radix tree root + * @results: where the results of the lookup are placed + * @first_index: start the lookup from this key + * @max_items: place up to this many items at *results + * @tag: the tag index (< RADIX_TREE_MAX_TAGS) + * + * Performs an index-ascending scan of the tree for present items which + * have the tag indexed by @tag set. Places the items at *@results and + * returns the number of items which were placed at *@results. + */ +unsigned int +radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results, + unsigned long first_index, unsigned int max_items, + unsigned int tag) +{ + const unsigned long max_index = radix_tree_maxindex(root->height); + unsigned long cur_index = first_index; + unsigned int ret = 0; + + while (ret < max_items) { + unsigned int nr_found; + unsigned long next_index; /* Index of next search */ + + if (cur_index > max_index) + break; + nr_found = __lookup_tag(root, results + ret, cur_index, + max_items - ret, &next_index, tag); + ret += nr_found; + if (next_index == 0) + break; + cur_index = next_index; + } + return ret; +} + +#endif + +/** + * radix_tree_shrink - shrink height of a radix tree to minimal + * @root radix tree root + */ +static inline void radix_tree_shrink(struct radix_tree_root *root) +{ + /* try to shrink tree height */ + while (root->height > 1 && + root->rnode->count == 1 && + root->rnode->slots[0]) { + struct radix_tree_node *to_free = root->rnode; + + root->rnode = to_free->slots[0]; + root->height--; + /* must only free zeroed nodes into the slab */ +#ifdef RADIX_TREE_TAGS + tag_clear(to_free, 0, 0); + tag_clear(to_free, 1, 0); +#endif + to_free->slots[0] = NULL; + to_free->count = 0; + radix_tree_node_free(to_free); + } +} + +/** + * radix_tree_delete - delete an item from a radix tree + * @root: radix tree root + * @index: index key + * + * Remove the item at @index from the radix tree rooted at @root. + * + * Returns the address of the deleted item, or NULL if it was not present. + */ +void *radix_tree_delete(struct radix_tree_root *root, unsigned long index) +{ + struct radix_tree_path path[RADIX_TREE_MAX_PATH], *pathp = path; + struct radix_tree_path *orig_pathp; + struct radix_tree_node *slot; + unsigned int height, shift; + void *ret = NULL; +#ifdef RADIX_TREE_TAGS + char tags[RADIX_TREE_MAX_TAGS]; + int nr_cleared_tags; + int tag; +#endif + int offset; + + height = root->height; + if (index > radix_tree_maxindex(height)) + goto out; + + shift = (height - 1) * RADIX_TREE_MAP_SHIFT; + pathp->node = NULL; + slot = root->rnode; + + for ( ; height > 0; height--) { + if (slot == NULL) + goto out; + + pathp++; + offset = (index >> shift) & RADIX_TREE_MAP_MASK; + pathp->offset = offset; + pathp->node = slot; + slot = slot->slots[offset]; + shift -= RADIX_TREE_MAP_SHIFT; + } + + ret = slot; + if (ret == NULL) + goto out; + + orig_pathp = pathp; + +#ifdef RADIX_TREE_TAGS + /* + * Clear all tags associated with the just-deleted item + */ + nr_cleared_tags = 0; + for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { + tags[tag] = 1; + if (tag_get(pathp->node, tag, pathp->offset)) { + tag_clear(pathp->node, tag, pathp->offset); + if (!any_tag_set(pathp->node, tag)) { + tags[tag] = 0; + nr_cleared_tags++; + } + } + } + + for (pathp--; nr_cleared_tags && pathp->node; pathp--) { + for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { + if (tags[tag]) + continue; + + tag_clear(pathp->node, tag, pathp->offset); + if (any_tag_set(pathp->node, tag)) { + tags[tag] = 1; + nr_cleared_tags--; + } + } + } +#endif + /* Now free the nodes we do not need anymore */ + for (pathp = orig_pathp; pathp->node; pathp--) { + pathp->node->slots[pathp->offset] = NULL; + pathp->node->count--; + + if (pathp->node->count) { + if (pathp->node == root->rnode) + radix_tree_shrink(root); + goto out; + } + + /* Node with zero slots in use so free it */ + radix_tree_node_free(pathp->node); + } + root->rnode = NULL; + root->height = 0; +out: + return ret; +} + +#ifdef RADIX_TREE_TAGS +/** + * radix_tree_tagged - test whether any items in the tree are tagged + * @root: radix tree root + * @tag: tag to test + */ +int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag) +{ + struct radix_tree_node *rnode; + rnode = root->rnode; + if (!rnode) + return 0; + return any_tag_set(rnode, tag); +} +#endif + +static unsigned long __maxindex(unsigned int height) +{ + unsigned int tmp = height * RADIX_TREE_MAP_SHIFT; + unsigned long index = (~0UL >> (RADIX_TREE_INDEX_BITS - tmp - 1)) >> 1; + + if (tmp >= RADIX_TREE_INDEX_BITS) + index = ~0UL; + return index; +} + +static void radix_tree_init_maxindex(void) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(height_to_maxindex); i++) + height_to_maxindex[i] = __maxindex(i); +} + +void radix_tree_init(void) +{ + radix_tree_init_maxindex(); +} -- 1.7.2.3 From SRS0+N/x4+44+fromorbit.com=dave@internode.on.net Mon Jan 10 02:43:04 2011 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_00,J_CHICKENPOX_37, J_CHICKENPOX_43,J_CHICKENPOX_55,J_CHICKENPOX_56,J_CHICKENPOX_61, J_CHICKENPOX_62,J_CHICKENPOX_63,J_CHICKENPOX_64,J_CHICKENPOX_65, J_CHICKENPOX_66,J_CHICKENPOX_84,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 p0A8h311226388 for ; Mon, 10 Jan 2011 02:43:03 -0600 X-ASG-Debug-ID: 1294649104-5e23030f0000-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 806C0FCA0CE for ; Mon, 10 Jan 2011 00:45:05 -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 z5ohsNAd3LsLWLsD for ; Mon, 10 Jan 2011 00:45:05 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52483388-1927428 for ; Mon, 10 Jan 2011 19:14:59 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcDN4-0004x8-1M for xfs@oss.sgi.com; Mon, 10 Jan 2011 19:44:58 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PcDN1-00075o-9z for xfs@oss.sgi.com; Mon, 10 Jan 2011 19:44:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/3] libxlog: sync up with 2.6.38 kernel code Subject: [PATCH 2/3] libxlog: sync up with 2.6.38 kernel code Date: Mon, 10 Jan 2011 19:44:50 +1100 Message-Id: <1294649091-27174-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294649091-27174-1-git-send-email-david@fromorbit.com> References: <1294649091-27174-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1294649108 X-Barracuda-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.51956 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 Update libxlog with the current 2.6.38 kernel code and well as updating the necessary parts of libxfs and variaous header files to ensure that it compiles correctly. Signed-off-by: Dave Chinner --- include/Makefile | 5 +- include/atomic.h | 31 ++ include/hlist.h | 76 +++++ include/libxfs.h | 17 +- include/libxlog.h | 16 +- include/list.h | 11 + include/xfs_buf_item.h | 50 ++--- include/xfs_extfree_item.h | 17 +- include/xfs_inode_item.h | 2 - include/xfs_log.h | 70 +++-- include/xfs_log_priv.h | 331 +++++++++++++++++------ include/xfs_log_recover.h | 25 +- include/xfs_trace.h | 9 + include/xfs_trans.h | 648 ++++++-------------------------------------- include/xfs_types.h | 2 + libxfs/logitem.c | 365 +------------------------ libxfs/trans.c | 209 +++++---------- libxfs/xfs.h | 12 +- libxfs/xfs_mount.c | 1 - libxfs/xfs_trans.c | 492 ++++++++++++++++++++++++++++++--- libxlog/xfs_log_recover.c | 606 ++++++++++++++++++++++------------------- logprint/log_print_all.c | 13 +- logprint/log_print_trans.c | 4 +- 23 files changed, 1431 insertions(+), 1581 deletions(-) create mode 100644 include/atomic.h create mode 100644 include/hlist.h create mode 100644 include/xfs_trace.h diff --git a/include/Makefile b/include/Makefile index 63709e6..a84963c 100644 --- a/include/Makefile +++ b/include/Makefile @@ -19,7 +19,8 @@ TOPDIR = .. include $(TOPDIR)/include/builddefs QAHFILES = libxfs.h libxlog.h \ - bitops.h cache.h kmem.h list.h parent.h radix-tree.h swab.h \ + atomic.h bitops.h cache.h kmem.h list.h hlist.h parent.h radix-tree.h \ + swab.h \ xfs_ag.h xfs_alloc.h xfs_alloc_btree.h xfs_arch.h xfs_attr_leaf.h \ xfs_attr_sf.h xfs_bit.h xfs_bmap.h xfs_bmap_btree.h xfs_btree.h \ xfs_btree_trace.h xfs_buf_item.h xfs_da_btree.h xfs_dinode.h \ @@ -28,7 +29,7 @@ QAHFILES = libxfs.h libxlog.h \ xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ xfs_imap.h xfs_inode.h xfs_inode_item.h xfs_inum.h \ xfs_log.h xfs_log_priv.h xfs_log_recover.h xfs_metadump.h \ - xfs_mount.h xfs_quota.h xfs_rtalloc.h xfs_sb.h \ + xfs_mount.h xfs_quota.h xfs_rtalloc.h xfs_sb.h xfs_trace.h \ xfs_trans.h xfs_trans_space.h xfs_types.h xfs_dfrag.h HFILES = handle.h jdm.h xqm.h xfs.h xfs_fs.h diff --git a/include/atomic.h b/include/atomic.h new file mode 100644 index 0000000..bdf1083 --- /dev/null +++ b/include/atomic.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2011 RedHat, 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 __ATOMIC_H__ +#define __ATOMIC_H__ + +typedef int32_t atomic_t; +typedef int64_t atomic64_t; + +#define atomic_inc_return(x) (++(*(x))) +#define atomic_dec_return(x) (--(*(x))) + +#define atomic64_read(x) *(x) +#define atomic64_set(x, v) (*(x) = v) + +#endif /* __ATOMIC_H__ */ + diff --git a/include/hlist.h b/include/hlist.h new file mode 100644 index 0000000..6d814ab --- /dev/null +++ b/include/hlist.h @@ -0,0 +1,76 @@ +/* + * 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 __HLIST_H__ +#define __HLIST_H__ + +/* + * double-linked hash list with single head implementation taken from linux + * kernel headers. + */ + +struct hlist_node { + struct hlist_node *next; + struct hlist_node **pprev; +}; +struct hlist_head { + struct hlist_node *first; +}; + +#define HLIST_HEAD_INIT { .first = NULL } +static inline void INIT_HLIST_NODE(struct hlist_node *h) +{ + h->next = NULL; + h->pprev = NULL; +} + +static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) +{ + struct hlist_node *first = h->first; + n->next = first; + if (first) + first->pprev = &n->next; + h->first = n; + n->pprev = &h->first; +} + +static inline void __hlist_del(struct hlist_node *n) +{ + struct hlist_node *next = n->next; + struct hlist_node **pprev = n->pprev; + *pprev = next; + if (next) + next->pprev = pprev; +} + +static inline void hlist_del(struct hlist_node *n) +{ + __hlist_del(n); +} + +#define hlist_entry(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + + +#define hlist_for_each(pos, head) \ + for (pos = (head)->first; pos; pos = pos->next) + +#define hlist_for_each_entry(tpos, pos, head, member) \ + for (pos = (head)->first; \ + pos && ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ + pos = pos->next) + + +#endif /* __LIST_H__ */ diff --git a/include/libxfs.h b/include/libxfs.h index 13fbf79..69b24ac 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -25,11 +25,13 @@ #include #include +#include #include #include #include #include #include +#include #include #include @@ -55,6 +57,7 @@ #include #include #include +#include #ifndef XFS_SUPER_MAGIC @@ -63,6 +66,10 @@ #define xfs_isset(a,i) ((a)[(i)/(sizeof((a))*NBBY)] & (1<<((i)%(sizeof((a))*NBBY)))) +#define __round_mask(x, y) ((__typeof__(x))((y)-1)) +#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) +#define round_down(x, y) ((x) & ~__round_mask(x, y)) + /* * Argument structure for libxfs_init(). */ @@ -241,8 +248,11 @@ enum xfs_buf_flags_t { /* b_flags bits */ #define XFS_BUF_SIZE(bp) ((bp)->b_bcount) #define XFS_BUF_COUNT(bp) ((bp)->b_bcount) #define XFS_BUF_TARGET(bp) ((bp)->b_dev) -#define XFS_BUF_SET_PTR(bp,p,cnt) ((bp)->b_addr = (char *)(p)); \ - XFS_BUF_SET_COUNT(bp,cnt) +#define XFS_BUF_SET_PTR(bp,p,cnt) ({ \ + (bp)->b_addr = (char *)(p); \ + XFS_BUF_SET_COUNT(bp,cnt); \ +}) + #define XFS_BUF_SET_ADDR(bp,blk) ((bp)->b_blkno = (blk)) #define XFS_BUF_SET_COUNT(bp,cnt) ((bp)->b_bcount = (cnt)) @@ -330,6 +340,7 @@ typedef struct xfs_inode_log_item { unsigned short ili_flags; /* misc flags */ unsigned int ili_last_fields; /* fields when flushed*/ xfs_inode_log_format_t ili_format; /* logged structure */ + int ili_lock_flags; } xfs_inode_log_item_t; typedef struct xfs_buf_log_item { @@ -353,7 +364,7 @@ typedef struct xfs_trans { long t_fdblocks_delta; /* superblock fdblocks chg */ long t_frextents_delta; /* superblock freextents chg */ unsigned int t_items_free; /* log item descs free */ - xfs_log_item_chunk_t t_items; /* first log item desc chunk */ + struct list_head t_items; /* first log item desc chunk */ } xfs_trans_t; extern xfs_trans_t *libxfs_trans_alloc (xfs_mount_t *, int); diff --git a/include/libxlog.h b/include/libxlog.h index 2a8a251..d1142ab 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -39,13 +39,12 @@ typedef struct log { int l_iclog_size; /* size of log in bytes */ int l_iclog_size_log;/* log power size of log */ int l_iclog_bufs; /* number of iclog buffers */ - int l_grant_reserve_cycle; /* */ - int l_grant_reserve_bytes; /* */ - int l_grant_write_cycle; /* */ - int l_grant_write_bytes; /* */ + atomic64_t l_grant_reserve_head; + atomic64_t l_grant_write_head; uint l_sectbb_log; /* log2 of sector size in bbs */ uint l_sectbb_mask; /* sector size (in BBs) * alignment mask */ + int l_sectBBsize; /* size of log sector in 512 byte chunks */ } xlog_t; #include @@ -91,7 +90,10 @@ extern libxfs_init_t x; extern struct xfs_buf *xlog_get_bp(xlog_t *, int); extern void xlog_put_bp(struct xfs_buf *); -extern int xlog_bread(xlog_t *, xfs_daddr_t, int, struct xfs_buf *); +extern int xlog_bread(xlog_t *log, xfs_daddr_t blk_no, int nbblks, + xfs_buf_t *bp, xfs_caddr_t *offset); +extern int xlog_bread_noalign(xlog_t *log, xfs_daddr_t blk_no, int nbblks, + xfs_buf_t *bp); extern int xlog_find_zeroed(xlog_t *log, xfs_daddr_t *blk_no); extern int xlog_find_cycle_start(xlog_t *log, xfs_buf_t *bp, @@ -110,7 +112,7 @@ extern int xlog_print_find_oldest(xlog_t *log, xfs_daddr_t *last_blk); /* for transactional view */ extern void xlog_recover_print_trans_head(xlog_recover_t *tr); extern void xlog_recover_print_trans(xlog_recover_t *trans, - xlog_recover_item_t *itemq, int print); + struct list_head *itemq, int print); extern int xlog_do_recovery_pass(xlog_t *log, xfs_daddr_t head_blk, xfs_daddr_t tail_blk, int pass); extern int xlog_recover_do_trans(xlog_t *log, xlog_recover_t *trans, @@ -120,4 +122,6 @@ extern int xlog_header_check_recover(xfs_mount_t *mp, extern int xlog_header_check_mount(xfs_mount_t *mp, xlog_rec_header_t *head); +#define xlog_assign_atomic_lsn(l,a,b) ((void) 0) +#define xlog_assign_grant_head(l,a,b) ((void) 0) #endif /* LIBXLOG_H */ diff --git a/include/list.h b/include/list.h index 2389a6c..3f087a4 100644 --- a/include/list.h +++ b/include/list.h @@ -27,6 +27,12 @@ struct list_head { struct list_head *prev; }; +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +#define INIT_LIST_HEAD(list) list_head_init(list) static inline void list_head_init(struct list_head *list) { list->next = list->prev = list; @@ -68,6 +74,11 @@ static inline void list_del_init(struct list_head *entry) list_head_init(entry); } +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); +} + static inline void list_move(struct list_head *list, struct list_head *head) { __list_del(list->prev, list->next); diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h index 5a41c34..a5efba9 100644 --- a/include/xfs_buf_item.h +++ b/include/xfs_buf_item.h @@ -26,7 +26,7 @@ extern kmem_zone_t *xfs_buf_item_zone; * have been logged. * For 6.2 and beyond, this is XFS_LI_BUF. We use this to log everything. */ -typedef struct xfs_buf_log_format_t { +typedef struct xfs_buf_log_format { unsigned short blf_type; /* buf log item type indicator */ unsigned short blf_size; /* size of this item */ ushort blf_flags; /* misc state */ @@ -41,22 +41,22 @@ typedef struct xfs_buf_log_format_t { * This flag indicates that the buffer contains on disk inodes * and requires special recovery handling. */ -#define XFS_BLI_INODE_BUF 0x1 +#define XFS_BLF_INODE_BUF 0x1 /* * This flag indicates that the buffer should not be replayed * during recovery because its blocks are being freed. */ -#define XFS_BLI_CANCEL 0x2 +#define XFS_BLF_CANCEL 0x2 /* * This flag indicates that the buffer contains on disk * user or group dquots and may require special recovery handling. */ -#define XFS_BLI_UDQUOT_BUF 0x4 -#define XFS_BLI_PDQUOT_BUF 0x8 -#define XFS_BLI_GDQUOT_BUF 0x10 +#define XFS_BLF_UDQUOT_BUF 0x4 +#define XFS_BLF_PDQUOT_BUF 0x8 +#define XFS_BLF_GDQUOT_BUF 0x10 -#define XFS_BLI_CHUNK 128 -#define XFS_BLI_SHIFT 7 +#define XFS_BLF_CHUNK 128 +#define XFS_BLF_SHIFT 7 #define BIT_TO_WORD_SHIFT 5 #define NBWORD (NBBY * sizeof(unsigned int)) @@ -69,23 +69,23 @@ typedef struct xfs_buf_log_format_t { #define XFS_BLI_LOGGED 0x08 #define XFS_BLI_INODE_ALLOC_BUF 0x10 #define XFS_BLI_STALE_INODE 0x20 +#define XFS_BLI_INODE_BUF 0x40 +#define XFS_BLI_FLAGS \ + { XFS_BLI_HOLD, "HOLD" }, \ + { XFS_BLI_DIRTY, "DIRTY" }, \ + { XFS_BLI_STALE, "STALE" }, \ + { XFS_BLI_LOGGED, "LOGGED" }, \ + { XFS_BLI_INODE_ALLOC_BUF, "INODE_ALLOC" }, \ + { XFS_BLI_STALE_INODE, "STALE_INODE" }, \ + { XFS_BLI_INODE_BUF, "INODE_BUF" } #ifdef __KERNEL__ struct xfs_buf; -struct ktrace; struct xfs_mount; struct xfs_buf_log_item; -#if defined(XFS_BLI_TRACE) -#define XFS_BLI_TRACE_SIZE 32 - -void xfs_buf_item_trace(char *, struct xfs_buf_log_item *); -#else -#define xfs_buf_item_trace(id, bip) -#endif - /* * This is the in core log item structure used to track information * needed to log buffers. It tracks how many times the lock has been @@ -97,9 +97,6 @@ typedef struct xfs_buf_log_item { unsigned int bli_flags; /* misc flags */ unsigned int bli_recur; /* lock recursion count */ atomic_t bli_refcount; /* cnt of tp refs */ -#ifdef XFS_BLI_TRACE - struct ktrace *bli_trace; /* event trace buf */ -#endif #ifdef XFS_TRANS_DEBUG char *bli_orig; /* original buffer copy */ char *bli_logged; /* bytes logged (bitmap) */ @@ -107,17 +104,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); @@ -126,7 +112,7 @@ void xfs_buf_attach_iodone(struct xfs_buf *, void(*)(struct xfs_buf *, xfs_log_item_t *), xfs_log_item_t *); void xfs_buf_iodone_callbacks(struct xfs_buf *); -void xfs_buf_iodone(struct xfs_buf *, xfs_buf_log_item_t *); +void xfs_buf_iodone(struct xfs_buf *, struct xfs_log_item *); #ifdef XFS_TRANS_DEBUG void diff --git a/include/xfs_extfree_item.h b/include/xfs_extfree_item.h index 2f049f6..375f68e 100644 --- a/include/xfs_extfree_item.h +++ b/include/xfs_extfree_item.h @@ -33,12 +33,10 @@ typedef struct xfs_extent { * conversion routine. */ -#ifndef HAVE_FORMAT32 typedef struct xfs_extent_32 { __uint64_t ext_start; __uint32_t ext_len; } __attribute__((packed)) xfs_extent_32_t; -#endif typedef struct xfs_extent_64 { __uint64_t ext_start; @@ -59,7 +57,6 @@ typedef struct xfs_efi_log_format { xfs_extent_t efi_extents[1]; /* array of extents to free */ } xfs_efi_log_format_t; -#ifndef HAVE_FORMAT32 typedef struct xfs_efi_log_format_32 { __uint16_t efi_type; /* efi log item type */ __uint16_t efi_size; /* size of this item */ @@ -67,7 +64,6 @@ typedef struct xfs_efi_log_format_32 { __uint64_t efi_id; /* efi identifier */ xfs_extent_32_t efi_extents[1]; /* array of extents to free */ } __attribute__((packed)) xfs_efi_log_format_32_t; -#endif typedef struct xfs_efi_log_format_64 { __uint16_t efi_type; /* efi log item type */ @@ -90,7 +86,6 @@ typedef struct xfs_efd_log_format { xfs_extent_t efd_extents[1]; /* array of extents freed */ } xfs_efd_log_format_t; -#ifndef HAVE_FORMAT32 typedef struct xfs_efd_log_format_32 { __uint16_t efd_type; /* efd log item type */ __uint16_t efd_size; /* size of this item */ @@ -98,7 +93,6 @@ typedef struct xfs_efd_log_format_32 { __uint64_t efd_efi_id; /* id of corresponding efi */ xfs_extent_32_t efd_extents[1]; /* array of extents freed */ } __attribute__((packed)) xfs_efd_log_format_32_t; -#endif typedef struct xfs_efd_log_format_64 { __uint16_t efd_type; /* efd log item type */ @@ -117,11 +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_CANCELED 0x4 +#define XFS_EFI_RECOVERED 1 +#define XFS_EFI_COMMITTED 2 /* * This is the "extent free intention" log item. It is used @@ -131,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/include/xfs_inode_item.h b/include/xfs_inode_item.h index 1ff04cc..81dcf94 100644 --- a/include/xfs_inode_item.h +++ b/include/xfs_inode_item.h @@ -40,7 +40,6 @@ typedef struct xfs_inode_log_format { __int32_t ilf_boffset; /* off of inode in buffer */ } xfs_inode_log_format_t; -#ifndef HAVE_FORMAT32 typedef struct xfs_inode_log_format_32 { __uint16_t ilf_type; /* inode log item type */ __uint16_t ilf_size; /* size of this item */ @@ -56,7 +55,6 @@ typedef struct xfs_inode_log_format_32 { __int32_t ilf_len; /* len of inode buffer */ __int32_t ilf_boffset; /* off of inode in buffer */ } __attribute__((packed)) xfs_inode_log_format_32_t; -#endif typedef struct xfs_inode_log_format_64 { __uint16_t ilf_type; /* inode log item type */ diff --git a/include/xfs_log.h b/include/xfs_log.h index d47b91f..916eb7d 100644 --- a/include/xfs_log.h +++ b/include/xfs_log.h @@ -19,7 +19,6 @@ #define __XFS_LOG_H__ /* get lsn fields */ - #define CYCLE_LSN(lsn) ((uint)((lsn)>>32)) #define BLOCK_LSN(lsn) ((uint)(lsn)) @@ -56,28 +55,18 @@ static inline xfs_lsn_t _lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2) /* * Flags to xfs_log_reserve() * - * XFS_LOG_SLEEP: If space is not available, sleep (default) - * XFS_LOG_NOSLEEP: If space is not available, return error * XFS_LOG_PERM_RESERV: Permanent reservation. When writes are * performed against this type of reservation, the reservation * is not decreased. Long running transactions should use this. */ -#define XFS_LOG_SLEEP 0x0 -#define XFS_LOG_NOSLEEP 0x1 #define XFS_LOG_PERM_RESERV 0x2 /* * Flags to xfs_log_force() * * XFS_LOG_SYNC: Synchronous force in-core log to disk - * XFS_LOG_FORCE: Start in-core log write now. - * XFS_LOG_URGE: Start write within some window of time. - * - * Note: Either XFS_LOG_FORCE or XFS_LOG_URGE must be set. */ #define XFS_LOG_SYNC 0x1 -#define XFS_LOG_FORCE 0x2 -#define XFS_LOG_URGE 0x4 #endif /* __KERNEL__ */ @@ -110,15 +99,20 @@ static inline xfs_lsn_t _lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2) #define XLOG_REG_TYPE_TRANSHDR 19 #define XLOG_REG_TYPE_MAX 19 -#define XLOG_VEC_SET_TYPE(vecp, t) ((vecp)->i_type = (t)) - typedef struct xfs_log_iovec { - xfs_caddr_t i_addr; /* beginning address of region */ + void *i_addr; /* beginning address of region */ int i_len; /* length in bytes of region */ uint i_type; /* type of region */ } xfs_log_iovec_t; -typedef void* xfs_log_ticket_t; +struct xfs_log_vec { + struct xfs_log_vec *lv_next; /* next lv in build list */ + int lv_niovecs; /* number of iovecs in lv */ + struct xfs_log_iovec *lv_iovecp; /* iovec array */ + struct xfs_log_item *lv_item; /* owner */ + char *lv_buf; /* formatted buffer */ + int lv_buf_len; /* size of formatted buffer */ +}; /* * Structure used to pass callback function and the function's argument @@ -134,17 +128,33 @@ typedef struct xfs_log_callback { #ifdef __KERNEL__ /* Log manager interfaces */ struct xfs_mount; +struct xlog_in_core; +struct xlog_ticket; +struct xfs_log_item; +struct xfs_item_ops; +struct xfs_trans; + +void xfs_log_item_init(struct xfs_mount *mp, + struct xfs_log_item *item, + int type, + struct xfs_item_ops *ops); + xfs_lsn_t xfs_log_done(struct xfs_mount *mp, - xfs_log_ticket_t ticket, - void **iclog, + struct xlog_ticket *ticket, + struct xlog_in_core **iclog, uint flags); int _xfs_log_force(struct xfs_mount *mp, - xfs_lsn_t lsn, uint flags, int *log_forced); void xfs_log_force(struct xfs_mount *mp, - xfs_lsn_t lsn, uint flags); +int _xfs_log_force_lsn(struct xfs_mount *mp, + xfs_lsn_t lsn, + uint flags, + int *log_forced); +void xfs_log_force_lsn(struct xfs_mount *mp, + xfs_lsn_t lsn, + uint flags); int xfs_log_mount(struct xfs_mount *mp, struct xfs_buftarg *log_target, xfs_daddr_t start_block, @@ -153,34 +163,38 @@ int xfs_log_mount_finish(struct xfs_mount *mp); void xfs_log_move_tail(struct xfs_mount *mp, xfs_lsn_t tail_lsn); int xfs_log_notify(struct xfs_mount *mp, - void *iclog, + struct xlog_in_core *iclog, xfs_log_callback_t *callback_entry); int xfs_log_release_iclog(struct xfs_mount *mp, - void *iclog_hndl); + struct xlog_in_core *iclog); int xfs_log_reserve(struct xfs_mount *mp, int length, int count, - xfs_log_ticket_t *ticket, + struct xlog_ticket **ticket, __uint8_t clientid, uint flags, uint t_type); int xfs_log_write(struct xfs_mount *mp, xfs_log_iovec_t region[], int nentries, - xfs_log_ticket_t ticket, + struct xlog_ticket *ticket, xfs_lsn_t *start_lsn); -int xfs_log_unmount(struct xfs_mount *mp); int xfs_log_unmount_write(struct xfs_mount *mp); -void xfs_log_unmount_dealloc(struct xfs_mount *mp); +void xfs_log_unmount(struct xfs_mount *mp); int xfs_log_force_umount(struct xfs_mount *mp, int logerror); int xfs_log_need_covered(struct xfs_mount *mp); void xlog_iodone(struct xfs_buf *); -#endif - +struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket); +void xfs_log_ticket_put(struct xlog_ticket *ticket); -extern int xlog_debug; /* set to 1 to enable real log */ +xlog_tid_t xfs_log_get_trans_ident(struct xfs_trans *tp); +int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, + struct xfs_log_vec *log_vector, + xfs_lsn_t *commit_lsn, int flags); +bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip); +#endif #endif /* __XFS_LOG_H__ */ diff --git a/include/xfs_log_priv.h b/include/xfs_log_priv.h index e7d8f84..d5f8be8 100644 --- a/include/xfs_log_priv.h +++ b/include/xfs_log_priv.h @@ -19,10 +19,8 @@ #define __XFS_LOG_PRIV_H__ struct xfs_buf; -struct ktrace; struct log; struct xlog_ticket; -struct xfs_buf_cancel; struct xfs_mount; /* @@ -55,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; @@ -134,7 +131,11 @@ 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" } + #endif /* __KERNEL__ */ #define XLOG_UNMOUNT_TYPE 0x556e /* Un for Unmount */ @@ -147,8 +148,6 @@ static inline uint xlog_get_client_id(__be32 i) #define XLOG_RECOVERY_NEEDED 0x4 /* log was recovered */ #define XLOG_IO_ERROR 0x8 /* log hit an I/O error, and being shutdown */ -typedef __uint32_t xlog_tid_t; - #ifdef __KERNEL__ /* @@ -241,10 +240,10 @@ typedef struct xlog_res { } xlog_res_t; 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 */ + 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 */ int t_curr_res; /* current reservation in bytes : 4 */ int t_unit_res; /* unit reservation in bytes : 4 */ char t_ocnt; /* original count : 1 */ @@ -309,6 +308,16 @@ typedef struct xlog_rec_ext_header { } xlog_rec_ext_header_t; #ifdef __KERNEL__ + +/* + * Quite misnamed, because this union lays out the actual on-disk log buffer. + */ +typedef union xlog_in_core2 { + xlog_rec_header_t hic_header; + xlog_rec_ext_header_t hic_xheader; + char hic_sector[XLOG_HEADER_SIZE]; +} xlog_in_core_2_t; + /* * - A log record header is 512 bytes. There is plenty of room to grow the * xlog_rec_header_t into the reserved space. @@ -338,9 +347,9 @@ typedef struct xlog_rec_ext_header { * We'll put all the read-only and l_icloglock fields in the first cacheline, * and move everything else out to subsequent cachelines. */ -typedef struct xlog_iclog_fields { - sv_t ic_force_wait; - sv_t ic_write_wait; +typedef struct xlog_in_core { + wait_queue_head_t ic_force_wait; + wait_queue_head_t ic_write_wait; struct xlog_in_core *ic_next; struct xlog_in_core *ic_prev; struct xfs_buf *ic_bp; @@ -348,11 +357,8 @@ typedef struct xlog_iclog_fields { int ic_size; int ic_offset; int ic_bwritecnt; - ushort_t ic_state; + unsigned short ic_state; char *ic_datap; /* pointer to iclog data */ -#ifdef XFS_LOG_TRACE - struct ktrace *ic_trace; -#endif /* Callback structures need their own cacheline */ spinlock_t ic_callback_lock ____cacheline_aligned_in_smp; @@ -361,39 +367,108 @@ typedef struct xlog_iclog_fields { /* reference counts need their own cacheline */ atomic_t ic_refcnt ____cacheline_aligned_in_smp; -} xlog_iclog_fields_t; + xlog_in_core_2_t *ic_data; +#define ic_header ic_data->hic_header +} xlog_in_core_t; -typedef union xlog_in_core2 { - xlog_rec_header_t hic_header; - xlog_rec_ext_header_t hic_xheader; - char hic_sector[XLOG_HEADER_SIZE]; -} xlog_in_core_2_t; +/* + * The CIL context is used to aggregate per-transaction details as well be + * passed to the iclog for checkpoint post-commit processing. After being + * passed to the iclog, another context needs to be allocated for tracking the + * next set of transactions to be aggregated into a checkpoint. + */ +struct xfs_cil; + +struct xfs_cil_ctx { + struct xfs_cil *cil; + xfs_lsn_t sequence; /* chkpt sequence # */ + xfs_lsn_t start_lsn; /* first LSN of chkpt commit */ + xfs_lsn_t commit_lsn; /* chkpt commit record lsn */ + struct xlog_ticket *ticket; /* chkpt ticket */ + int nvecs; /* number of regions */ + int space_used; /* aggregate size of regions */ + struct list_head busy_extents; /* busy extents in chkpt */ + struct xfs_log_vec *lv_chain; /* logvecs being pushed */ + xfs_log_callback_t log_cb; /* completion callback hook. */ + struct list_head committing; /* ctx committing list */ +}; -typedef struct xlog_in_core { - xlog_iclog_fields_t hic_fields; - xlog_in_core_2_t *hic_data; -} xlog_in_core_t; +/* + * Committed Item List structure + * + * This structure is used to track log items that have been committed but not + * yet written into the log. It is used only when the delayed logging mount + * option is enabled. + * + * This structure tracks the list of committing checkpoint contexts so + * we can avoid the problem of having to hold out new transactions during a + * flush until we have a the commit record LSN of the checkpoint. We can + * traverse the list of committing contexts in xlog_cil_push_lsn() to find a + * sequence match and extract the commit LSN directly from there. If the + * checkpoint is still in the process of committing, we can block waiting for + * the commit LSN to be determined as well. This should make synchronous + * operations almost as efficient as the old logging methods. + */ +struct xfs_cil { + struct log *xc_log; + struct list_head xc_cil; + spinlock_t xc_cil_lock; + struct xfs_cil_ctx *xc_ctx; + struct rw_semaphore xc_ctx_lock; + struct list_head xc_committing; + wait_queue_head_t xc_commit_wait; + xfs_lsn_t xc_current_sequence; +}; /* - * Defines to save our code from this glop. + * The amount of log space we allow the CIL to aggregate is difficult to size. + * Whatever we choose, we have to make sure we can get a reservation for the + * log space effectively, that it is large enough to capture sufficient + * relogging to reduce log buffer IO significantly, but it is not too large for + * the log or induces too much latency when writing out through the iclogs. We + * track both space consumed and the number of vectors in the checkpoint + * context, so we need to decide which to use for limiting. + * + * Every log buffer we write out during a push needs a header reserved, which + * is at least one sector and more for v2 logs. Hence we need a reservation of + * at least 512 bytes per 32k of log space just for the LR headers. That means + * 16KB of reservation per megabyte of delayed logging space we will consume, + * plus various headers. The number of headers will vary based on the num of + * io vectors, so limiting on a specific number of vectors is going to result + * in transactions of varying size. IOWs, it is more consistent to track and + * limit space consumed in the log rather than by the number of objects being + * logged in order to prevent checkpoint ticket overruns. + * + * Further, use of static reservations through the log grant mechanism is + * problematic. It introduces a lot of complexity (e.g. reserve grant vs write + * grant) and a significant deadlock potential because regranting write space + * can block on log pushes. Hence if we have to regrant log space during a log + * push, we can deadlock. + * + * However, we can avoid this by use of a dynamic "reservation stealing" + * technique during transaction commit whereby unused reservation space in the + * transaction ticket is transferred to the CIL ctx commit ticket to cover the + * space needed by the checkpoint transaction. This means that we never need to + * specifically reserve space for the CIL checkpoint transaction, nor do we + * need to regrant space once the checkpoint completes. This also means the + * checkpoint transaction ticket is specific to the checkpoint context, rather + * than the CIL itself. + * + * With dynamic reservations, we can effectively make up arbitrary limits for + * the checkpoint size so long as they don't violate any other size rules. + * Recovery imposes a rule that no transaction exceed half the log, so we are + * limited by that. Furthermore, the log transaction reservation subsystem + * tries to keep 25% of the log free, so we need to keep below that limit or we + * risk running out of free log space to start any new transactions. + * + * In order to keep background CIL push efficient, we will set a lower + * threshold at which background pushing is attempted without blocking current + * transaction commits. A separate, higher bound defines when CIL pushes are + * enforced to ensure we stay within our maximum checkpoint size bounds. + * threshold, yet give us plenty of space for aggregation on large logs. */ -#define ic_force_wait hic_fields.ic_force_wait -#define ic_write_wait hic_fields.ic_write_wait -#define ic_next hic_fields.ic_next -#define ic_prev hic_fields.ic_prev -#define ic_bp hic_fields.ic_bp -#define ic_log hic_fields.ic_log -#define ic_callback hic_fields.ic_callback -#define ic_callback_lock hic_fields.ic_callback_lock -#define ic_callback_tail hic_fields.ic_callback_tail -#define ic_trace hic_fields.ic_trace -#define ic_size hic_fields.ic_size -#define ic_offset hic_fields.ic_offset -#define ic_refcnt hic_fields.ic_refcnt -#define ic_bwritecnt hic_fields.ic_bwritecnt -#define ic_state hic_fields.ic_state -#define ic_datap hic_fields.ic_datap -#define ic_header hic_data->hic_header +#define XLOG_CIL_SPACE_LIMIT(log) (log->l_logsize >> 3) +#define XLOG_CIL_HARD_SPACE_LIMIT(log) (3 * (log->l_logsize >> 4)) /* * The reservation head lsn is not made up of a cycle number and block number. @@ -404,17 +479,17 @@ typedef struct xlog_in_core { typedef struct log { /* The following fields don't need locking */ struct xfs_mount *l_mp; /* mount point */ + struct xfs_ail *l_ailp; /* AIL log is working with */ + struct xfs_cil *l_cilp; /* CIL log is working with */ struct xfs_buf *l_xbuf; /* extra buffer for log * wrapping */ struct xfs_buftarg *l_targ; /* buftarg of log */ 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_sectbb_log; /* log2 of sector size in BBs */ - uint l_sectbb_mask; /* sector size (in BBs) - * alignment mask */ + uint l_sectBBsize; /* sector size in BBs (2^n) */ int l_iclog_size; /* size of log in bytes */ int l_iclog_size_log; /* log power size of log */ int l_iclog_bufs; /* number of iclog buffers */ @@ -423,33 +498,40 @@ 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" */ 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 */ - 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 */ 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; - xlog_ticket_t *l_reserve_headq; - xlog_ticket_t *l_write_headq; - int l_grant_reserve_cycle; - int l_grant_reserve_bytes; - int l_grant_write_cycle; - int l_grant_write_bytes; - -#ifdef XFS_LOG_TRACE - struct ktrace *l_grant_trace; -#endif + /* + * 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; + + /* + * 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 @@ -458,30 +540,108 @@ typedef struct log { } xlog_t; -#define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) +#define XLOG_BUF_CANCEL_BUCKET(log, blkno) \ + ((log)->l_buf_cancel_table + ((__uint64_t)blkno % XLOG_BC_TABLE_SIZE)) +#define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) /* common routines */ extern xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); -extern int xlog_find_tail(xlog_t *log, - xfs_daddr_t *head_blk, - xfs_daddr_t *tail_blk); extern int xlog_recover(xlog_t *log); extern int xlog_recover_finish(xlog_t *log); extern void xlog_pack_data(xlog_t *log, xlog_in_core_t *iclog, int); -extern void xlog_recover_process_iunlinks(xlog_t *log); -extern struct xfs_buf *xlog_get_bp(xlog_t *, int); -extern void xlog_put_bp(struct xfs_buf *); -extern int xlog_bread(xlog_t *, xfs_daddr_t, int, struct xfs_buf *); +extern kmem_zone_t *xfs_log_ticket_zone; +struct xlog_ticket *xlog_ticket_alloc(struct log *log, int unit_bytes, + int count, char client, uint xflags, + int alloc_flags); + -extern kmem_zone_t *xfs_log_ticket_zone; +static inline void +xlog_write_adv_cnt(void **ptr, int *len, int *off, size_t bytes) +{ + *ptr += bytes; + *len -= bytes; + *off += bytes; +} -/* iclog tracing */ -#define XLOG_TRACE_GRAB_FLUSH 1 -#define XLOG_TRACE_REL_FLUSH 2 -#define XLOG_TRACE_SLEEP_FLUSH 3 -#define XLOG_TRACE_WAKE_FLUSH 4 +void xlog_print_tic_res(struct xfs_mount *mp, struct xlog_ticket *ticket); +int xlog_write(struct log *log, struct xfs_log_vec *log_vector, + struct xlog_ticket *tic, xfs_lsn_t *start_lsn, + 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 grant head, we sample it first so that the value will not + * change while we are cracking it into the component values. This means we + * will always get consistent component values to work from. + */ +static inline void +xlog_crack_grant_head_val(int64_t val, int *cycle, int *space) +{ + *cycle = val >> 32; + *space = val & 0xffffffff; +} + +static inline void +xlog_crack_grant_head(atomic64_t *head, int *cycle, int *space) +{ + xlog_crack_grant_head_val(atomic64_read(head), cycle, space); +} + +static inline int64_t +xlog_assign_grant_head_val(int cycle, int space) +{ + return ((int64_t)cycle << 32) | space; +} + +static inline void +xlog_assign_grant_head(atomic64_t *head, int cycle, int space) +{ + atomic64_set(head, xlog_assign_grant_head_val(cycle, space)); +} + +/* + * Committed Item List interfaces + */ +int xlog_cil_init(struct log *log); +void xlog_cil_init_post_recovery(struct log *log); +void xlog_cil_destroy(struct log *log); + +/* + * CIL force routines + */ +xfs_lsn_t xlog_cil_force_lsn(struct log *log, xfs_lsn_t sequence); + +static inline void +xlog_cil_force(struct log *log) +{ + xlog_cil_force_lsn(log, log->l_cilp->xc_current_sequence); +} /* * Unmount record type is used as a pseudo transaction type for the ticket. @@ -489,6 +649,21 @@ extern kmem_zone_t *xfs_log_ticket_zone; */ #define XLOG_UNMOUNT_REC_TYPE (-1U) +/* + * Wrapper function for waiting on a wait queue serialised against wakeups + * by a spinlock. This matches the semantics of all the wait queues used in the + * log code. + */ +static inline void xlog_wait(wait_queue_head_t *wq, spinlock_t *lock) +{ + DECLARE_WAITQUEUE(wait, current); + + add_wait_queue_exclusive(wq, &wait); + __set_current_state(TASK_UNINTERRUPTIBLE); + spin_unlock(lock); + schedule(); + remove_wait_queue(wq, &wait); +} #endif /* __KERNEL__ */ #endif /* __XFS_LOG_PRIV_H__ */ diff --git a/include/xfs_log_recover.h b/include/xfs_log_recover.h index b225455..1c55ccb 100644 --- a/include/xfs_log_recover.h +++ b/include/xfs_log_recover.h @@ -28,29 +28,28 @@ #define XLOG_RHASH(tid) \ ((((__uint32_t)tid)>>XLOG_RHASH_SHIFT) & (XLOG_RHASH_SIZE-1)) -#define XLOG_MAX_REGIONS_IN_ITEM (XFS_MAX_BLOCKSIZE / XFS_BLI_CHUNK / 2 + 1) +#define XLOG_MAX_REGIONS_IN_ITEM (XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK / 2 + 1) /* * item headers are in ri_buf[0]. Additional buffers follow. */ typedef struct xlog_recover_item { - struct xlog_recover_item *ri_next; - struct xlog_recover_item *ri_prev; - int ri_type; - int ri_cnt; /* count of regions found */ - int ri_total; /* total regions */ - xfs_log_iovec_t *ri_buf; /* ptr to regions buffer */ + struct list_head ri_list; + int ri_type; + int ri_cnt; /* count of regions found */ + int ri_total; /* total regions */ + xfs_log_iovec_t *ri_buf; /* ptr to regions buffer */ } xlog_recover_item_t; struct xlog_tid; typedef struct xlog_recover { - struct xlog_recover *r_next; - xlog_tid_t r_log_tid; /* log's transaction id */ - xfs_trans_header_t r_theader; /* trans header for partial */ - int r_state; /* not needed */ - xfs_lsn_t r_lsn; /* xact lsn */ - xlog_recover_item_t *r_itemq; /* q for items */ + struct hlist_node r_list; + xlog_tid_t r_log_tid; /* log's transaction id */ + xfs_trans_header_t r_theader; /* trans header for partial */ + int r_state; /* not needed */ + xfs_lsn_t r_lsn; /* xact lsn */ + struct list_head r_itemq; /* q for items */ } xlog_recover_t; #define ITEM_TYPE(i) (*(ushort *)(i)->ri_buf[0].i_addr) diff --git a/include/xfs_trace.h b/include/xfs_trace.h new file mode 100644 index 0000000..fef82d0 --- /dev/null +++ b/include/xfs_trace.h @@ -0,0 +1,9 @@ +#ifndef __TRACE_H__ +#define __TRACE_H__ + +#define trace_xfs_log_recover_item_reorder_head(a,b,c,d) ((void) 0) +#define trace_xfs_log_recover_item_reorder_tail(a,b,c,d) ((void) 0) +#define trace_xfs_log_recover_item_add_cont(a,b,c,d) ((void) 0) +#define trace_xfs_log_recover_item_add(a,b,c,d) ((void) 0) + +#endif /* __TRACE_H__ */ diff --git a/include/xfs_trans.h b/include/xfs_trans.h index 1d89d50..c2042b7 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -49,6 +49,15 @@ typedef struct xfs_trans_header { #define XFS_LI_DQUOT 0x123d #define XFS_LI_QUOTAOFF 0x123e +#define XFS_LI_TYPE_DESC \ + { XFS_LI_EFI, "XFS_LI_EFI" }, \ + { XFS_LI_EFD, "XFS_LI_EFD" }, \ + { XFS_LI_IUNLINK, "XFS_LI_IUNLINK" }, \ + { XFS_LI_INODE, "XFS_LI_INODE" }, \ + { XFS_LI_BUF, "XFS_LI_BUF" }, \ + { XFS_LI_DQUOT, "XFS_LI_DQUOT" }, \ + { XFS_LI_QUOTAOFF, "XFS_LI_QUOTAOFF" } + /* * Transaction types. Used to distinguish types of buffers. */ @@ -68,7 +77,7 @@ typedef struct xfs_trans_header { #define XFS_TRANS_GROWFS 14 #define XFS_TRANS_STRAT_WRITE 15 #define XFS_TRANS_DIOSTRAT 16 -#define XFS_TRANS_WRITE_SYNC 17 +/* 17 was XFS_TRANS_WRITE_SYNC */ #define XFS_TRANS_WRITEID 18 #define XFS_TRANS_ADDAFORK 19 #define XFS_TRANS_ATTRINVAL 20 @@ -97,9 +106,54 @@ typedef struct xfs_trans_header { #define XFS_TRANS_GROWFSRT_FREE 39 #define XFS_TRANS_SWAPEXT 40 #define XFS_TRANS_SB_COUNT 41 -#define XFS_TRANS_TYPE_MAX 41 +#define XFS_TRANS_CHECKPOINT 42 +#define XFS_TRANS_TYPE_MAX 42 /* new transaction types need to be reflected in xfs_logprint(8) */ +#define XFS_TRANS_TYPES \ + { XFS_TRANS_SETATTR_NOT_SIZE, "SETATTR_NOT_SIZE" }, \ + { XFS_TRANS_SETATTR_SIZE, "SETATTR_SIZE" }, \ + { XFS_TRANS_INACTIVE, "INACTIVE" }, \ + { XFS_TRANS_CREATE, "CREATE" }, \ + { XFS_TRANS_CREATE_TRUNC, "CREATE_TRUNC" }, \ + { XFS_TRANS_TRUNCATE_FILE, "TRUNCATE_FILE" }, \ + { XFS_TRANS_REMOVE, "REMOVE" }, \ + { XFS_TRANS_LINK, "LINK" }, \ + { XFS_TRANS_RENAME, "RENAME" }, \ + { XFS_TRANS_MKDIR, "MKDIR" }, \ + { XFS_TRANS_RMDIR, "RMDIR" }, \ + { XFS_TRANS_SYMLINK, "SYMLINK" }, \ + { XFS_TRANS_SET_DMATTRS, "SET_DMATTRS" }, \ + { XFS_TRANS_GROWFS, "GROWFS" }, \ + { XFS_TRANS_STRAT_WRITE, "STRAT_WRITE" }, \ + { XFS_TRANS_DIOSTRAT, "DIOSTRAT" }, \ + { XFS_TRANS_WRITEID, "WRITEID" }, \ + { XFS_TRANS_ADDAFORK, "ADDAFORK" }, \ + { XFS_TRANS_ATTRINVAL, "ATTRINVAL" }, \ + { XFS_TRANS_ATRUNCATE, "ATRUNCATE" }, \ + { XFS_TRANS_ATTR_SET, "ATTR_SET" }, \ + { XFS_TRANS_ATTR_RM, "ATTR_RM" }, \ + { XFS_TRANS_ATTR_FLAG, "ATTR_FLAG" }, \ + { XFS_TRANS_CLEAR_AGI_BUCKET, "CLEAR_AGI_BUCKET" }, \ + { XFS_TRANS_QM_SBCHANGE, "QM_SBCHANGE" }, \ + { XFS_TRANS_QM_QUOTAOFF, "QM_QUOTAOFF" }, \ + { XFS_TRANS_QM_DQALLOC, "QM_DQALLOC" }, \ + { XFS_TRANS_QM_SETQLIM, "QM_SETQLIM" }, \ + { XFS_TRANS_QM_DQCLUSTER, "QM_DQCLUSTER" }, \ + { XFS_TRANS_QM_QINOCREATE, "QM_QINOCREATE" }, \ + { XFS_TRANS_QM_QUOTAOFF_END, "QM_QOFF_END" }, \ + { XFS_TRANS_SB_UNIT, "SB_UNIT" }, \ + { XFS_TRANS_FSYNC_TS, "FSYNC_TS" }, \ + { XFS_TRANS_GROWFSRT_ALLOC, "GROWFSRT_ALLOC" }, \ + { XFS_TRANS_GROWFSRT_ZERO, "GROWFSRT_ZERO" }, \ + { XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \ + { XFS_TRANS_SWAPEXT, "SWAPEXT" }, \ + { XFS_TRANS_SB_COUNT, "SB_COUNT" }, \ + { XFS_TRANS_CHECKPOINT, "CHECKPOINT" }, \ + { XFS_TRANS_DUMMY1, "DUMMY1" }, \ + { XFS_TRANS_DUMMY2, "DUMMY2" }, \ + { XLOG_UNMOUNT_REC_TYPE, "UNMOUNT" } + /* * This structure is used to track log items associated with * a transaction. It points to the log item and keeps some @@ -107,106 +161,14 @@ typedef struct xfs_trans_header { * the amount of space needed to log the item it describes * once we get to commit processing (see xfs_trans_commit()). */ -typedef struct xfs_log_item_desc { +struct xfs_log_item_desc { struct xfs_log_item *lid_item; - ushort lid_size; - unsigned char lid_flags; - unsigned char lid_index; -} xfs_log_item_desc_t; + ushort lid_size; + unsigned char lid_flags; + struct list_head lid_trans; +}; #define XFS_LID_DIRTY 0x1 -#define XFS_LID_PINNED 0x2 -#define XFS_LID_BUF_STALE 0x8 - -/* - * This structure is used to maintain a chunk list of log_item_desc - * structures. The free field is a bitmask indicating which descriptors - * in this chunk's array are free. The unused field is the first value - * not used since this chunk was allocated. - */ -#define XFS_LIC_NUM_SLOTS 15 -typedef struct xfs_log_item_chunk { - struct xfs_log_item_chunk *lic_next; - ushort lic_free; - ushort lic_unused; - xfs_log_item_desc_t lic_descs[XFS_LIC_NUM_SLOTS]; -} xfs_log_item_chunk_t; - -#define XFS_LIC_MAX_SLOT (XFS_LIC_NUM_SLOTS - 1) -#define XFS_LIC_FREEMASK ((1 << XFS_LIC_NUM_SLOTS) - 1) - - -/* - * Initialize the given chunk. Set the chunk's free descriptor mask - * to indicate that all descriptors are free. The caller gets to set - * lic_unused to the right value (0 matches all free). The - * lic_descs.lid_index values are set up as each desc is allocated. - */ -static inline void xfs_lic_init(xfs_log_item_chunk_t *cp) -{ - cp->lic_free = XFS_LIC_FREEMASK; -} - -static inline void xfs_lic_init_slot(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_descs[slot].lid_index = (unsigned char)(slot); -} - -static inline int xfs_lic_vacancy(xfs_log_item_chunk_t *cp) -{ - return cp->lic_free & XFS_LIC_FREEMASK; -} - -static inline void xfs_lic_all_free(xfs_log_item_chunk_t *cp) -{ - cp->lic_free = XFS_LIC_FREEMASK; -} - -static inline int xfs_lic_are_all_free(xfs_log_item_chunk_t *cp) -{ - return ((cp->lic_free & XFS_LIC_FREEMASK) == XFS_LIC_FREEMASK); -} - -static inline int xfs_lic_isfree(xfs_log_item_chunk_t *cp, int slot) -{ - return (cp->lic_free & (1 << slot)); -} - -static inline void xfs_lic_claim(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_free &= ~(1 << slot); -} - -static inline void xfs_lic_relse(xfs_log_item_chunk_t *cp, int slot) -{ - cp->lic_free |= 1 << slot; -} - -static inline xfs_log_item_desc_t * -xfs_lic_slot(xfs_log_item_chunk_t *cp, int slot) -{ - return &(cp->lic_descs[slot]); -} - -static inline int xfs_lic_desc_to_slot(xfs_log_item_desc_t *dp) -{ - return (uint)dp->lid_index; -} - -/* - * Calculate the address of a chunk given a descriptor pointer: - * dp - dp->lid_index give the address of the start of the lic_descs array. - * From this we subtract the offset of the lic_descs field in a chunk. - * All of this yields the address of the chunk, which is - * cast to a chunk pointer. - */ -static inline xfs_log_item_chunk_t * -xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp) -{ - return (xfs_log_item_chunk_t*) \ - (((xfs_caddr_t)((dp) - (dp)->lid_index)) - \ - (xfs_caddr_t)(((xfs_log_item_chunk_t*)0)->lic_descs)); -} #define XFS_TRANS_MAGIC 0x5452414E /* 'TRAN' */ /* @@ -222,8 +184,6 @@ xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp) /* * Values for call flags parameter. */ -#define XFS_TRANS_NOSLEEP 0x1 -#define XFS_TRANS_WAIT 0x2 #define XFS_TRANS_RELEASE_LOG_RES 0x4 #define XFS_TRANS_ABORT 0x8 @@ -247,24 +207,6 @@ xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp) /* - * Various log reservation values. - * These are based on the size of the file system block - * because that is what most transactions manipulate. - * Each adds in an additional 128 bytes per item logged to - * try to account for the overhead of the transaction mechanism. - * - * Note: - * Most of the reservations underestimate the number of allocation - * groups into which they could free extents in the xfs_bmap_finish() - * call. This is because the number in the worst case is quite high - * and quite unusual. In order to fix this we need to change - * xfs_bmap_finish() to free extents in only a single AG at a time. - * This will require changes to the EFI code as well, however, so that - * the EFI for the extents not freed is logged again in each transaction. - * See bug 261917. - */ - -/* * Per-extent log reservation for the allocation btree changes * involved in freeing or allocating an extent. * 2 trees * (2 blocks/level * max depth - 1) * block size @@ -288,429 +230,36 @@ xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp) (XFS_DAENTER_BLOCKS(mp, XFS_DATA_FORK) + \ XFS_DAENTER_BMAPS(mp, XFS_DATA_FORK) + 1) -/* - * In a write transaction we can allocate a maximum of 2 - * extents. This gives: - * the inode getting the new extents: inode size - * the inode\'s bmap btree: max depth * block size - * the agfs of the ags from which the extents are allocated: 2 * sector - * the superblock free block counter: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - * And the bmap_finish transaction can free bmap blocks in a join: - * the agfs of the ags containing the blocks: 2 * sector size - * the agfls of the ags containing the blocks: 2 * sector size - * the super block free block counter: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_WRITE_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + \ - (2 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ - (128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))),\ - ((2 * (mp)->m_sb.sb_sectsize) + \ - (2 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ - (128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))))) #define XFS_WRITE_LOG_RES(mp) ((mp)->m_reservations.tr_write) - -/* - * In truncating a file we free up to two extents at once. We can modify: - * the inode being truncated: inode size - * the inode\'s bmap btree: (max depth + 1) * block size - * And the bmap_finish transaction can free the blocks and bmap blocks: - * the agf for each of the ags: 4 * sector size - * the agfl for each of the ags: 4 * sector size - * the super block to reflect the freed blocks: sector size - * worst case split in allocation btrees per extent assuming 4 extents: - * 4 exts * 2 trees * (2 * max depth - 1) * block size - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (max depth - 1) * block size - */ -#define XFS_CALC_ITRUNCATE_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + \ - (128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)))), \ - ((4 * (mp)->m_sb.sb_sectsize) + \ - (4 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 4) + \ - (128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4))) + \ - (128 * 5) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + XFS_IN_MAXLEVELS(mp) + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) - #define XFS_ITRUNCATE_LOG_RES(mp) ((mp)->m_reservations.tr_itruncate) - -/* - * In renaming a files we can modify: - * the four inodes involved: 4 * inode size - * the two directory btrees: 2 * (max depth + v2) * dir block size - * the two directory bmap btrees: 2 * max depth * block size - * And the bmap_finish transaction can free dir and bmap blocks (two sets - * of bmap blocks) giving: - * the agf for the ags in which the blocks live: 3 * sector size - * the agfl for the ags in which the blocks live: 3 * sector size - * the superblock for the free block count: sector size - * the allocation btrees: 3 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_RENAME_LOG_RES(mp) \ - (MAX( \ - ((4 * (mp)->m_sb.sb_inodesize) + \ - (2 * XFS_DIROP_LOG_RES(mp)) + \ - (128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp)))), \ - ((3 * (mp)->m_sb.sb_sectsize) + \ - (3 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 3) + \ - (128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))))) - #define XFS_RENAME_LOG_RES(mp) ((mp)->m_reservations.tr_rename) - -/* - * For creating a link to an inode: - * the parent directory inode: inode size - * the linked inode: inode size - * the directory btree could split: (max depth + v2) * dir block size - * the directory bmap btree could join or split: (max depth + v2) * blocksize - * And the bmap_finish transaction can free some bmap blocks giving: - * the agf for the ag in which the blocks live: sector size - * the agfl for the ag in which the blocks live: sector size - * the superblock for the free block count: sector size - * the allocation btrees: 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_LINK_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_inodesize + \ - XFS_DIROP_LOG_RES(mp) + \ - (128 * (2 + XFS_DIROP_LOG_COUNT(mp)))), \ - ((mp)->m_sb.sb_sectsize + \ - (mp)->m_sb.sb_sectsize + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) - #define XFS_LINK_LOG_RES(mp) ((mp)->m_reservations.tr_link) - -/* - * For removing a directory entry we can modify: - * the parent directory inode: inode size - * the removed inode: inode size - * the directory btree could join: (max depth + v2) * dir block size - * the directory bmap btree could join or split: (max depth + v2) * blocksize - * And the bmap_finish transaction can free the dir and bmap blocks giving: - * the agf for the ag in which the blocks live: 2 * sector size - * the agfl for the ag in which the blocks live: 2 * sector size - * the superblock for the free block count: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_REMOVE_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_inodesize + \ - XFS_DIROP_LOG_RES(mp) + \ - (128 * (2 + XFS_DIROP_LOG_COUNT(mp)))), \ - ((2 * (mp)->m_sb.sb_sectsize) + \ - (2 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ - (128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))))) - #define XFS_REMOVE_LOG_RES(mp) ((mp)->m_reservations.tr_remove) - -/* - * For symlink we can modify: - * the parent directory inode: inode size - * the new inode: inode size - * the inode btree entry: 1 block - * the directory btree: (max depth + v2) * dir block size - * the directory inode\'s bmap btree: (max depth + v2) * block size - * the blocks for the symlink: 1 KB - * Or in the first xact we allocate some inodes giving: - * the agi and agf of the ag getting the new inodes: 2 * sectorsize - * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_SYMLINK_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B(mp, 1) + \ - XFS_DIROP_LOG_RES(mp) + \ - 1024 + \ - (128 * (4 + XFS_DIROP_LOG_COUNT(mp)))), \ - (2 * (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), XFS_IALLOC_BLOCKS((mp))) + \ - XFS_FSB_TO_B((mp), XFS_IN_MAXLEVELS(mp)) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + XFS_IN_MAXLEVELS(mp) + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) - #define XFS_SYMLINK_LOG_RES(mp) ((mp)->m_reservations.tr_symlink) - -/* - * For create we can modify: - * the parent directory inode: inode size - * the new inode: inode size - * the inode btree entry: block size - * the superblock for the nlink flag: sector size - * the directory btree: (max depth + v2) * dir block size - * the directory inode\'s bmap btree: (max depth + v2) * block size - * Or in the first xact we allocate some inodes giving: - * the agi and agf of the ag getting the new inodes: 2 * sectorsize - * the superblock for the nlink flag: sector size - * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (max depth - 1) * block size - */ -#define XFS_CALC_CREATE_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B(mp, 1) + \ - XFS_DIROP_LOG_RES(mp) + \ - (128 * (3 + XFS_DIROP_LOG_COUNT(mp)))), \ - (3 * (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), XFS_IALLOC_BLOCKS((mp))) + \ - XFS_FSB_TO_B((mp), XFS_IN_MAXLEVELS(mp)) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + XFS_IN_MAXLEVELS(mp) + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))))) - #define XFS_CREATE_LOG_RES(mp) ((mp)->m_reservations.tr_create) - -/* - * Making a new directory is the same as creating a new file. - */ -#define XFS_CALC_MKDIR_LOG_RES(mp) XFS_CALC_CREATE_LOG_RES(mp) - #define XFS_MKDIR_LOG_RES(mp) ((mp)->m_reservations.tr_mkdir) - -/* - * In freeing an inode we can modify: - * the inode being freed: inode size - * the super block free inode counter: sector size - * the agi hash list and counters: sector size - * the inode btree entry: block size - * the on disk inode before ours in the agi hash list: inode cluster size - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (max depth - 1) * block size - */ -#define XFS_CALC_IFREE_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize + \ - (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), 1) + \ - MAX((__uint16_t)XFS_FSB_TO_B((mp), 1), XFS_INODE_CLUSTER_SIZE(mp)) + \ - (128 * 5) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (2 + XFS_IALLOC_BLOCKS(mp) + XFS_IN_MAXLEVELS(mp) + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) - - #define XFS_IFREE_LOG_RES(mp) ((mp)->m_reservations.tr_ifree) - -/* - * When only changing the inode we log the inode and possibly the superblock - * We also add a bit of slop for the transaction stuff. - */ -#define XFS_CALC_ICHANGE_LOG_RES(mp) ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize + 512) - #define XFS_ICHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_ichange) - -/* - * Growing the data section of the filesystem. - * superblock - * agi and agf - * allocation btrees - */ -#define XFS_CALC_GROWDATA_LOG_RES(mp) \ - ((mp)->m_sb.sb_sectsize * 3 + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) - #define XFS_GROWDATA_LOG_RES(mp) ((mp)->m_reservations.tr_growdata) - -/* - * Growing the rt section of the filesystem. - * In the first set of transactions (ALLOC) we allocate space to the - * bitmap or summary files. - * superblock: sector size - * agf of the ag from which the extent is allocated: sector size - * bmap btree for bitmap/summary inode: max depth * blocksize - * bitmap/summary inode: inode size - * allocation btrees for 1 block alloc: 2 * (2 * maxdepth - 1) * blocksize - */ -#define XFS_CALC_GROWRTALLOC_LOG_RES(mp) \ - (2 * (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + \ - (mp)->m_sb.sb_inodesize + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * \ - (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) - #define XFS_GROWRTALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_growrtalloc) - -/* - * Growing the rt section of the filesystem. - * In the second set of transactions (ZERO) we zero the new metadata blocks. - * one bitmap/summary block: blocksize - */ -#define XFS_CALC_GROWRTZERO_LOG_RES(mp) \ - ((mp)->m_sb.sb_blocksize + 128) - #define XFS_GROWRTZERO_LOG_RES(mp) ((mp)->m_reservations.tr_growrtzero) - -/* - * Growing the rt section of the filesystem. - * In the third set of transactions (FREE) we update metadata without - * allocating any new blocks. - * superblock: sector size - * bitmap inode: inode size - * summary inode: inode size - * one bitmap block: blocksize - * summary blocks: new summary size - */ -#define XFS_CALC_GROWRTFREE_LOG_RES(mp) \ - ((mp)->m_sb.sb_sectsize + \ - 2 * (mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_blocksize + \ - (mp)->m_rsumsize + \ - (128 * 5)) - #define XFS_GROWRTFREE_LOG_RES(mp) ((mp)->m_reservations.tr_growrtfree) - -/* - * Logging the inode modification timestamp on a synchronous write. - * inode - */ -#define XFS_CALC_SWRITE_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + 128) - #define XFS_SWRITE_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) - /* * Logging the inode timestamps on an fsync -- same as SWRITE * as long as SWRITE logs the entire inode core */ #define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) - -/* - * Logging the inode mode bits when writing a setuid/setgid file - * inode - */ -#define XFS_CALC_WRITEID_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + 128) - #define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) - -/* - * Converting the inode from non-attributed to attributed. - * the inode being converted: inode size - * agf block and superblock (for block allocation) - * the new block (directory sized) - * bmap blocks for the new directory block - * allocation btrees - */ -#define XFS_CALC_ADDAFORK_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize * 2 + \ - (mp)->m_dirblksize + \ - XFS_FSB_TO_B(mp, (XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1)) + \ - XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (4 + (XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + \ - XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) - #define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_reservations.tr_addafork) - -/* - * Removing the attribute fork of a file - * the inode being truncated: inode size - * the inode\'s bmap btree: max depth * block size - * And the bmap_finish transaction can free the blocks and bmap blocks: - * the agf for each of the ags: 4 * sector size - * the agfl for each of the ags: 4 * sector size - * the super block to reflect the freed blocks: sector size - * worst case split in allocation btrees per extent assuming 4 extents: - * 4 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_ATTRINVAL_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + \ - (128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)))), \ - ((4 * (mp)->m_sb.sb_sectsize) + \ - (4 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 4) + \ - (128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))))) - #define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_reservations.tr_attrinval) - -/* - * Setting an attribute. - * the inode getting the attribute - * the superblock for allocations - * the agfs extents are allocated from - * the attribute btree * max depth - * the inode allocation btree - * Since attribute transaction space is dependent on the size of the attribute, - * the calculation is done partially at mount time and partially at runtime. - */ -#define XFS_CALC_ATTRSET_LOG_RES(mp) \ - ((mp)->m_sb.sb_inodesize + \ - (mp)->m_sb.sb_sectsize + \ - XFS_FSB_TO_B((mp), XFS_DA_NODE_MAXDEPTH) + \ - (128 * (2 + XFS_DA_NODE_MAXDEPTH))) - #define XFS_ATTRSET_LOG_RES(mp, ext) \ ((mp)->m_reservations.tr_attrset + \ (ext * (mp)->m_sb.sb_sectsize) + \ (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))))) - -/* - * Removing an attribute. - * the inode: inode size - * the attribute btree could join: max depth * block size - * the inode bmap btree could join or split: max depth * block size - * And the bmap_finish transaction can free the attr blocks freed giving: - * the agf for the ag in which the blocks live: 2 * sector size - * the agfl for the ag in which the blocks live: 2 * sector size - * the superblock for the free block count: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - */ -#define XFS_CALC_ATTRRM_LOG_RES(mp) \ - (MAX( \ - ((mp)->m_sb.sb_inodesize + \ - XFS_FSB_TO_B((mp), XFS_DA_NODE_MAXDEPTH) + \ - XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + \ - (128 * (1 + XFS_DA_NODE_MAXDEPTH + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)))), \ - ((2 * (mp)->m_sb.sb_sectsize) + \ - (2 * (mp)->m_sb.sb_sectsize) + \ - (mp)->m_sb.sb_sectsize + \ - XFS_ALLOCFREE_LOG_RES(mp, 2) + \ - (128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))))) - #define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) - -/* - * Clearing a bad agino number in an agi hash bucket. - */ -#define XFS_CALC_CLEAR_AGI_BUCKET_LOG_RES(mp) \ - ((mp)->m_sb.sb_sectsize + 128) - #define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) @@ -745,8 +294,8 @@ xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp) #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__ @@ -762,12 +311,14 @@ struct xfs_log_item_desc; struct xfs_mount; struct xfs_trans; struct xfs_dquot_acct; +struct xfs_busy_extent; typedef struct xfs_log_item { struct list_head li_ail; /* AIL pointers */ xfs_lsn_t li_lsn; /* last on-disk lsn */ struct xfs_log_item_desc *li_desc; /* ptr to current desc*/ struct xfs_mount *li_mountp; /* ptr to fs mount */ + struct xfs_ail *li_ailp; /* ptr to AIL */ uint li_type; /* item type */ uint li_flags; /* misc flags */ struct xfs_log_item *li_bio_list; /* buffer item list */ @@ -776,17 +327,25 @@ typedef struct xfs_log_item { /* buffer item iodone */ /* callback func */ struct xfs_item_ops *li_ops; /* function list */ + + /* delayed logging */ + struct list_head li_cil; /* CIL pointers */ + struct xfs_log_vec *li_lv; /* active log vector */ + xfs_lsn_t li_seq; /* CIL commit seq */ } xfs_log_item_t; #define XFS_LI_IN_AIL 0x1 #define XFS_LI_ABORTED 0x2 +#define XFS_LI_FLAGS \ + { XFS_LI_IN_AIL, "IN_AIL" }, \ + { XFS_LI_ABORTED, "ABORTED" } + typedef struct xfs_item_ops { uint (*iop_size)(xfs_log_item_t *); void (*iop_format)(xfs_log_item_t *, struct xfs_log_iovec *); void (*iop_pin)(xfs_log_item_t *); - void (*iop_unpin)(xfs_log_item_t *, int); - void (*iop_unpin_remove)(xfs_log_item_t *, struct xfs_trans *); + void (*iop_unpin)(xfs_log_item_t *, int remove); uint (*iop_trylock)(xfs_log_item_t *); void (*iop_unlock)(xfs_log_item_t *); xfs_lsn_t (*iop_committed)(xfs_log_item_t *, xfs_lsn_t); @@ -798,8 +357,7 @@ typedef struct xfs_item_ops { #define IOP_SIZE(ip) (*(ip)->li_ops->iop_size)(ip) #define IOP_FORMAT(ip,vp) (*(ip)->li_ops->iop_format)(ip, vp) #define IOP_PIN(ip) (*(ip)->li_ops->iop_pin)(ip) -#define IOP_UNPIN(ip, flags) (*(ip)->li_ops->iop_unpin)(ip, flags) -#define IOP_UNPIN_REMOVE(ip,tp) (*(ip)->li_ops->iop_unpin_remove)(ip, tp) +#define IOP_UNPIN(ip, remove) (*(ip)->li_ops->iop_unpin)(ip, remove) #define IOP_TRYLOCK(ip) (*(ip)->li_ops->iop_trylock)(ip) #define IOP_UNLOCK(ip) (*(ip)->li_ops->iop_unlock)(ip) #define IOP_COMMITTED(ip, lsn) (*(ip)->li_ops->iop_committed)(ip, lsn) @@ -813,36 +371,7 @@ typedef struct xfs_item_ops { #define XFS_ITEM_SUCCESS 0 #define XFS_ITEM_PINNED 1 #define XFS_ITEM_LOCKED 2 -#define XFS_ITEM_FLUSHING 3 -#define XFS_ITEM_PUSHBUF 4 - -/* - * This structure is used to maintain a list of block ranges that have been - * freed in the transaction. The ranges are listed in the perag[] busy list - * between when they're freed and the transaction is committed to disk. - */ - -typedef struct xfs_log_busy_slot { - xfs_agnumber_t lbc_ag; - ushort lbc_idx; /* index in perag.busy[] */ -} xfs_log_busy_slot_t; - -#define XFS_LBC_NUM_SLOTS 31 -typedef struct xfs_log_busy_chunk { - struct xfs_log_busy_chunk *lbc_next; - uint lbc_free; /* free slots bitmask */ - ushort lbc_unused; /* first unused */ - xfs_log_busy_slot_t lbc_busy[XFS_LBC_NUM_SLOTS]; -} xfs_log_busy_chunk_t; - -#define XFS_LBC_MAX_SLOT (XFS_LBC_NUM_SLOTS - 1) -#define XFS_LBC_FREEMASK ((1U << XFS_LBC_NUM_SLOTS) - 1) - -#define XFS_LBC_INIT(cp) ((cp)->lbc_free = XFS_LBC_FREEMASK) -#define XFS_LBC_CLAIM(cp, slot) ((cp)->lbc_free &= ~(1 << (slot))) -#define XFS_LBC_SLOT(cp, slot) (&((cp)->lbc_busy[(slot)])) -#define XFS_LBC_VACANCY(cp) (((cp)->lbc_free) & XFS_LBC_FREEMASK) -#define XFS_LBC_ISFREE(cp, slot) ((cp)->lbc_free & (1 << (slot))) +#define XFS_ITEM_PUSHBUF 3 /* * This is the type of function which can be given to xfs_trans_callback() @@ -863,15 +392,13 @@ typedef struct xfs_trans { unsigned int t_blk_res_used; /* # of resvd blocks used */ unsigned int t_rtx_res; /* # of rt extents resvd */ unsigned int t_rtx_res_used; /* # of resvd rt extents used */ - xfs_log_ticket_t t_ticket; /* log mgr ticket */ + struct xlog_ticket *t_ticket; /* log mgr ticket */ xfs_lsn_t t_lsn; /* log seq num of start of * transaction. */ xfs_lsn_t t_commit_lsn; /* log seq num of end of * transaction. */ struct xfs_mount *t_mountp; /* ptr to fs mount struct */ struct xfs_dquot_acct *t_dqinfo; /* acctg info for dquots */ - xfs_trans_callback_t t_callback; /* transaction callback */ - void *t_callarg; /* callback arg */ unsigned int t_flags; /* misc flags */ int64_t t_icount_delta; /* superblock icount change */ int64_t t_ifree_delta; /* superblock ifree change */ @@ -892,11 +419,9 @@ typedef struct xfs_trans { int64_t t_rblocks_delta;/* superblock rblocks change */ int64_t t_rextents_delta;/* superblocks rextents chg */ int64_t t_rextslog_delta;/* superblocks rextslog chg */ - unsigned int t_items_free; /* log item descs free */ - xfs_log_item_chunk_t t_items; /* first log item desc chunk */ + struct list_head t_items; /* log item descriptors */ xfs_trans_header_t t_header; /* header for in-log trans */ - unsigned int t_busy_free; /* busy descs free */ - xfs_log_busy_chunk_t t_busy; /* busy/async free blocks */ + struct list_head t_busy; /* list of busy extents */ unsigned long t_pflags; /* saved process flags state */ } xfs_trans_t; @@ -923,7 +448,7 @@ typedef struct xfs_trans { * XFS transaction mechanism exported interfaces. */ xfs_trans_t *xfs_trans_alloc(struct xfs_mount *, uint); -xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint); +xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint, uint); xfs_trans_t *xfs_trans_dup(xfs_trans_t *); int xfs_trans_reserve(xfs_trans_t *, uint, uint, uint, uint, uint); @@ -946,8 +471,9 @@ void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint); void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); int xfs_trans_iget(struct xfs_mount *, xfs_trans_t *, xfs_ino_t , uint, uint, struct xfs_inode **); -void xfs_trans_ijoin(xfs_trans_t *, struct xfs_inode *, uint); -void xfs_trans_ihold(xfs_trans_t *, struct xfs_inode *); +void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); +void xfs_trans_ijoin_ref(struct xfs_trans *, struct xfs_inode *, uint); +void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); struct xfs_efi_log_item *xfs_trans_get_efi(xfs_trans_t *, uint); @@ -970,15 +496,9 @@ int _xfs_trans_commit(xfs_trans_t *, void xfs_trans_cancel(xfs_trans_t *, int); int xfs_trans_ail_init(struct xfs_mount *); void xfs_trans_ail_destroy(struct xfs_mount *); -void xfs_trans_push_ail(struct xfs_mount *, xfs_lsn_t); -xfs_lsn_t xfs_trans_tail_ail(struct xfs_mount *); -void xfs_trans_unlocked_item(struct xfs_mount *, - xfs_log_item_t *); -xfs_log_busy_slot_t *xfs_trans_add_busy(xfs_trans_t *tp, - xfs_agnumber_t ag, - xfs_extlen_t idx); extern kmem_zone_t *xfs_trans_zone; +extern kmem_zone_t *xfs_log_item_desc_zone; #endif /* __KERNEL__ */ diff --git a/include/xfs_types.h b/include/xfs_types.h index 228b948..901d4ac 100644 --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -81,6 +81,8 @@ typedef __int32_t xfs_tid_t; /* transaction identifier */ typedef __uint32_t xfs_dablk_t; /* dir/attr block number (in file) */ typedef __uint32_t xfs_dahash_t; /* dir/attr hash value */ +typedef __uint32_t xlog_tid_t; /* transaction ID type */ + /* * These types are 64 bits on disk but are either 32 or 64 bits in memory. * Disk based types: diff --git a/libxfs/logitem.c b/libxfs/logitem.c index d6ef10b..0856ca6 100644 --- a/libxfs/logitem.c +++ b/libxfs/logitem.c @@ -26,215 +26,6 @@ kmem_zone_t *xfs_ili_zone; /* inode log item zone */ */ /* - * This is called to add the given log item to the transaction's - * list of log items. It must find a free log item descriptor - * or allocate a new one and add the item to that descriptor. - * The function returns a pointer to item descriptor used to point - * to the new item. The log item will now point to its new descriptor - * with its li_desc field. - */ -xfs_log_item_desc_t * -xfs_trans_add_item( - xfs_trans_t *tp, - xfs_log_item_t *lip) -{ - xfs_log_item_desc_t *lidp; - xfs_log_item_chunk_t *licp; - int i = 0; - - /* - * If there are no free descriptors, allocate a new chunk - * of them and put it at the front of the chunk list. - */ - if (tp->t_items_free == 0) { - licp = (xfs_log_item_chunk_t*) - kmem_alloc(sizeof(xfs_log_item_chunk_t), KM_SLEEP); - ASSERT(licp != NULL); - /* - * Initialize the chunk, and then - * claim the first slot in the newly allocated chunk. - */ - xfs_lic_init(licp); - xfs_lic_claim(licp, 0); - licp->lic_unused = 1; - xfs_lic_init_slot(licp, 0); - lidp = xfs_lic_slot(licp, 0); - - /* - * Link in the new chunk and update the free count. - */ - licp->lic_next = tp->t_items.lic_next; - tp->t_items.lic_next = licp; - tp->t_items_free = XFS_LIC_NUM_SLOTS - 1; - - /* - * Initialize the descriptor and the generic portion - * of the log item. - * - * Point the new slot at this item and return it. - * Also point the log item at its currently active - * descriptor and set the item's mount pointer. - */ - lidp->lid_item = lip; - lidp->lid_flags = 0; - lidp->lid_size = 0; - lip->li_desc = lidp; - lip->li_mountp = tp->t_mountp; - return lidp; - } - - /* - * Find the free descriptor. It is somewhere in the chunklist - * of descriptors. - */ - licp = &tp->t_items; - while (licp != NULL) { - if (xfs_lic_vacancy(licp)) { - if (licp->lic_unused <= XFS_LIC_MAX_SLOT) { - i = licp->lic_unused; - ASSERT(xfs_lic_isfree(licp, i)); - break; - } - for (i = 0; i <= XFS_LIC_MAX_SLOT; i++) { - if (xfs_lic_isfree(licp, i)) - break; - } - ASSERT(i <= XFS_LIC_MAX_SLOT); - break; - } - licp = licp->lic_next; - } - ASSERT(licp != NULL); - /* - * If we find a free descriptor, claim it, - * initialize it, and return it. - */ - xfs_lic_claim(licp, i); - if (licp->lic_unused <= i) { - licp->lic_unused = i + 1; - xfs_lic_init_slot(licp, i); - } - lidp = xfs_lic_slot(licp, i); - tp->t_items_free--; - lidp->lid_item = lip; - lidp->lid_flags = 0; - lidp->lid_size = 0; - lip->li_desc = lidp; - lip->li_mountp = tp->t_mountp; - return lidp; -} - -/* - * Free the given descriptor. - * - * This requires setting the bit in the chunk's free mask corresponding - * to the given slot. - */ -void -xfs_trans_free_item( - xfs_trans_t *tp, - xfs_log_item_desc_t *lidp) -{ - uint slot; - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t **licpp; - - slot = xfs_lic_desc_to_slot(lidp); - licp = xfs_lic_desc_to_chunk(lidp); - xfs_lic_relse(licp, slot); - lidp->lid_item->li_desc = NULL; - tp->t_items_free++; - - /* - * If there are no more used items in the chunk and this is not - * the chunk embedded in the transaction structure, then free - * the chunk. First pull it from the chunk list and then - * free it back to the heap. We didn't bother with a doubly - * linked list here because the lists should be very short - * and this is not a performance path. It's better to save - * the memory of the extra pointer. - * - * Also decrement the transaction structure's count of free items - * by the number in a chunk since we are freeing an empty chunk. - */ - if (xfs_lic_are_all_free(licp) && (licp != &(tp->t_items))) { - licpp = &(tp->t_items.lic_next); - while (*licpp != licp) { - ASSERT(*licpp != NULL); - licpp = &((*licpp)->lic_next); - } - *licpp = licp->lic_next; - kmem_free(licp); - tp->t_items_free -= XFS_LIC_NUM_SLOTS; - } -} - -/* - * This is called to find the descriptor corresponding to the given - * log item. It returns a pointer to the descriptor. - * The log item MUST have a corresponding descriptor in the given - * transaction. This routine does not return NULL, it panics. - * - * The descriptor pointer is kept in the log item's li_desc field. - * Just return it. - */ -xfs_log_item_desc_t * -xfs_trans_find_item( - xfs_trans_t *tp, - xfs_log_item_t *lip) -{ - ASSERT(lip->li_desc != NULL); - - return lip->li_desc; -} - -/* - * This is called to unlock all of the items of a transaction and to free - * all the descriptors of that transaction. - * - * It walks the list of descriptors and unlocks each item. It frees - * each chunk except that embedded in the transaction as it goes along. - */ -void -xfs_trans_free_items( - xfs_trans_t *tp, - int flags) -{ - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t *next_licp; - int abort; - - abort = flags & XFS_TRANS_ABORT; - licp = &tp->t_items; - /* - * Special case the embedded chunk so we don't free it below. - */ - if (!xfs_lic_are_all_free(licp)) { - (void) xfs_trans_unlock_chunk(licp, 1, abort, NULLCOMMITLSN); - xfs_lic_all_free(licp); - licp->lic_unused = 0; - } - licp = licp->lic_next; - - /* - * Unlock each item in each chunk and free the chunks. - */ - while (licp != NULL) { - ASSERT(!xfs_lic_are_all_free(licp)); - (void) xfs_trans_unlock_chunk(licp, 1, abort, NULLCOMMITLSN); - next_licp = licp->lic_next; - kmem_free(licp); - licp = next_licp; - } - - /* - * Reset the transaction structure's free item count. - */ - tp->t_items_free = XFS_LIC_NUM_SLOTS; - tp->t_items.lic_next = NULL; -} - -/* * Following functions from fs/xfs/xfs_trans_buf.c */ @@ -250,149 +41,21 @@ xfs_trans_buf_item_match( xfs_daddr_t blkno, int len) { - xfs_log_item_chunk_t *licp; - xfs_log_item_desc_t *lidp; - xfs_buf_log_item_t *blip; - xfs_buf_t *bp; - int i; - -#ifdef LI_DEBUG - fprintf(stderr, "buf_item_match (fast) log items for xact %p\n", tp); -#endif - - bp = NULL; - len = BBTOB(len); - licp = &tp->t_items; - if (!xfs_lic_are_all_free(licp)) { - for (i = 0; i < licp->lic_unused; i++) { - /* - * Skip unoccupied slots. - */ - if (xfs_lic_isfree(licp, i)) { - continue; - } - - lidp = xfs_lic_slot(licp, i); - blip = (xfs_buf_log_item_t *)lidp->lid_item; -#ifdef LI_DEBUG - fprintf(stderr, - "\tfound log item, xact %p, blip=%p (%d/%d)\n", - tp, blip, i, licp->lic_unused); -#endif - if (blip->bli_item.li_type != XFS_LI_BUF) { - continue; - } - - bp = blip->bli_buf; -#ifdef LI_DEBUG - fprintf(stderr, - "\tfound buf %p log item, xact %p, blip=%p (%d)\n", - bp, tp, blip, i); -#endif - if ((XFS_BUF_TARGET(bp) == target->dev) && - (XFS_BUF_ADDR(bp) == blkno) && - (XFS_BUF_COUNT(bp) == len)) { - /* - * We found it. Break out and - * return the pointer to the buffer. - */ -#ifdef LI_DEBUG - fprintf(stderr, - "\tfound REAL buf log item, bp=%p\n", - bp); -#endif - break; - } else { - bp = NULL; - } - } - } -#ifdef LI_DEBUG - if (!bp) fprintf(stderr, "\tfast search - got nothing\n"); -#endif - return bp; + struct xfs_log_item_desc *lidp; + struct xfs_buf_log_item *blip; + + len = BBTOB(len); + list_for_each_entry(lidp, &tp->t_items, lid_trans) { + blip = (struct xfs_buf_log_item *)lidp->lid_item; + if (blip->bli_item.li_type == XFS_LI_BUF && + XFS_BUF_TARGET(blip->bli_buf) == target->dev && + XFS_BUF_ADDR(blip->bli_buf) == blkno && + XFS_BUF_COUNT(blip->bli_buf) == len) + return blip->bli_buf; + } + + return NULL; } - -/* - * Check to see if a buffer matching the given parameters is already - * a part of the given transaction. Check all the chunks, we - * want to be thorough. - */ -xfs_buf_t * -xfs_trans_buf_item_match_all( - xfs_trans_t *tp, - xfs_buftarg_t *target, - xfs_daddr_t blkno, - int len) -{ - xfs_log_item_chunk_t *licp; - xfs_log_item_desc_t *lidp; - xfs_buf_log_item_t *blip; - xfs_buf_t *bp; - int i; - -#ifdef LI_DEBUG - fprintf(stderr, "buf_item_match_all (slow) log items for xact %p\n", - tp); -#endif - - bp = NULL; - len = BBTOB(len); - for (licp = &tp->t_items; licp != NULL; licp = licp->lic_next) { - if (xfs_lic_are_all_free(licp)) { - ASSERT(licp == &tp->t_items); - ASSERT(licp->lic_next == NULL); - return NULL; - } - for (i = 0; i < licp->lic_unused; i++) { - /* - * Skip unoccupied slots. - */ - if (xfs_lic_isfree(licp, i)) { - continue; - } - - lidp = xfs_lic_slot(licp, i); - blip = (xfs_buf_log_item_t *)lidp->lid_item; -#ifdef LI_DEBUG - fprintf(stderr, - "\tfound log item, xact %p, blip=%p (%d/%d)\n", - tp, blip, i, licp->lic_unused); -#endif - if (blip->bli_item.li_type != XFS_LI_BUF) { - continue; - } - - bp = blip->bli_buf; - ASSERT(bp); - ASSERT(XFS_BUF_ADDR(bp)); -#ifdef LI_DEBUG - fprintf(stderr, - "\tfound buf %p log item, xact %p, blip=%p (%d)\n", - bp, tp, blip, i); -#endif - if ((XFS_BUF_TARGET(bp) == target->dev) && - (XFS_BUF_ADDR(bp) == blkno) && - (XFS_BUF_COUNT(bp) == len)) { - /* - * We found it. Break out and - * return the pointer to the buffer. - */ -#ifdef LI_DEBUG - fprintf(stderr, - "\tfound REAL buf log item, bp=%p\n", - bp); -#endif - return bp; - } - } - } -#ifdef LI_DEBUG - if (!bp) fprintf(stderr, "slow search - got nothing\n"); -#endif - return NULL; -} - /* * The following are from fs/xfs/xfs_buf_item.c */ diff --git a/libxfs/trans.c b/libxfs/trans.c index 1c60f38..c5dd2ca 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -36,8 +36,7 @@ libxfs_trans_alloc( } ptr->t_mountp = mp; ptr->t_type = type; - ptr->t_items_free = XFS_LIC_NUM_SLOTS; - xfs_lic_init(&ptr->t_items); + INIT_LIST_HEAD(&ptr->t_items); #ifdef XACT_DEBUG fprintf(stderr, "allocated new transaction %p\n", ptr); #endif @@ -139,7 +138,6 @@ libxfs_trans_iput( uint lock_flags) { xfs_inode_log_item_t *iip; - xfs_log_item_desc_t *lidp; if (tp == NULL) { libxfs_iput(ip, lock_flags); @@ -149,12 +147,7 @@ libxfs_trans_iput( ASSERT(ip->i_transp == tp); iip = ip->i_itemp; ASSERT(iip != NULL); - - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *)iip); - ASSERT(lidp != NULL); - ASSERT(lidp->lid_item == (xfs_log_item_t *)iip); - ASSERT(!(lidp->lid_flags & XFS_LID_DIRTY)); - xfs_trans_free_item(tp, lidp); + xfs_trans_del_item(&iip->ili_item); libxfs_iput(ip, lock_flags); } @@ -183,6 +176,23 @@ libxfs_trans_ijoin( } void +libxfs_trans_ijoin_ref( + xfs_trans_t *tp, + xfs_inode_t *ip, + int lock_flags) +{ + ASSERT(ip->i_transp == tp); + ASSERT(ip->i_itemp != NULL); + + xfs_trans_ijoin(tp, ip, lock_flags); + ip->i_itemp->ili_lock_flags = lock_flags; + +#ifdef XACT_DEBUG + fprintf(stderr, "ijoin_ref'd inode %llu, transaction %p\n", ip->i_ino, tp); +#endif +} + +void libxfs_trans_ihold( xfs_trans_t *tp, xfs_inode_t *ip) @@ -190,7 +200,8 @@ libxfs_trans_ihold( ASSERT(ip->i_transp == tp); ASSERT(ip->i_itemp != NULL); - ip->i_itemp->ili_flags |= XFS_ILI_HOLD; + ip->i_itemp->ili_lock_flags = 1; + #ifdef XACT_DEBUG fprintf(stderr, "ihold'd inode %llu, transaction %p\n", ip->i_ino, tp); #endif @@ -224,19 +235,14 @@ xfs_trans_log_inode( xfs_inode_t *ip, uint flags) { - xfs_log_item_desc_t *lidp; - ASSERT(ip->i_transp == tp); ASSERT(ip->i_itemp != NULL); #ifdef XACT_DEBUG fprintf(stderr, "dirtied inode %llu, transaction %p\n", ip->i_ino, tp); #endif - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)(ip->i_itemp)); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + ip->i_itemp->ili_item.li_desc->lid_flags |= XFS_LID_DIRTY; /* * Always OR in the bits from the ili_last_fields field. @@ -266,7 +272,6 @@ libxfs_trans_log_buf( uint last) { xfs_buf_log_item_t *bip; - xfs_log_item_desc_t *lidp; ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); @@ -277,11 +282,8 @@ libxfs_trans_log_buf( bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t *)bip); - ASSERT(lidp != NULL); - tp->t_flags |= XFS_TRANS_DIRTY; - lidp->lid_flags |= XFS_LID_DIRTY; + bip->bli_item.li_desc->lid_flags |= XFS_LID_DIRTY; xfs_buf_item_log(bip, first, last); } @@ -291,7 +293,6 @@ libxfs_trans_brelse( xfs_buf_t *bp) { xfs_buf_log_item_t *bip; - xfs_log_item_desc_t *lidp; #ifdef XACT_DEBUG fprintf(stderr, "released buffer %p, transaction %p\n", bp, tp); #endif @@ -304,8 +305,6 @@ libxfs_trans_brelse( ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); ASSERT(bip->bli_item.li_type == XFS_LI_BUF); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); - ASSERT(lidp != NULL); if (bip->bli_recur > 0) { bip->bli_recur--; return; @@ -313,9 +312,9 @@ libxfs_trans_brelse( /* If dirty/stale, can't release till transaction committed */ if (bip->bli_flags & XFS_BLI_STALE) return; - if (lidp->lid_flags & XFS_LID_DIRTY) + if (bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY) return; - xfs_trans_free_item(tp, lidp); + xfs_trans_del_item(&bip->bli_item); if (bip->bli_flags & XFS_BLI_HOLD) bip->bli_flags &= ~XFS_BLI_HOLD; XFS_BUF_SET_FSPRIVATE2(bp, NULL); @@ -327,7 +326,6 @@ libxfs_trans_binval( xfs_trans_t *tp, xfs_buf_t *bp) { - xfs_log_item_desc_t *lidp; xfs_buf_log_item_t *bip; #ifdef XACT_DEBUG fprintf(stderr, "binval'd buffer %p, transaction %p\n", bp, tp); @@ -337,17 +335,15 @@ libxfs_trans_binval( ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); - ASSERT(lidp != NULL); if (bip->bli_flags & XFS_BLI_STALE) return; XFS_BUF_UNDELAYWRITE(bp); XFS_BUF_STALE(bp); bip->bli_flags |= XFS_BLI_STALE; bip->bli_flags &= ~XFS_BLI_DIRTY; - bip->bli_format.blf_flags &= ~XFS_BLI_INODE_BUF; - bip->bli_format.blf_flags |= XFS_BLI_CANCEL; - lidp->lid_flags |= XFS_LID_DIRTY; + bip->bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; + bip->bli_format.blf_flags |= XFS_BLF_CANCEL; + bip->bli_item.li_desc->lid_flags |= XFS_LID_DIRTY; tp->t_flags |= XFS_TRANS_DIRTY; } @@ -402,10 +398,7 @@ libxfs_trans_get_buf( return libxfs_getbuf(dev, d, len); bdev.dev = dev; - if (tp->t_items.lic_next == NULL) - bp = xfs_trans_buf_item_match(tp, &bdev, d, len); - else - bp = xfs_trans_buf_item_match_all(tp, &bdev, d, len); + bp = xfs_trans_buf_item_match(tp, &bdev, d, len); if (bp != NULL) { ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); @@ -447,10 +440,7 @@ libxfs_trans_getsb( bdev.dev = mp->m_dev; len = XFS_FSS_TO_BB(mp, 1); - if (tp->t_items.lic_next == NULL) - bp = xfs_trans_buf_item_match(tp, &bdev, XFS_SB_DADDR, len); - else - bp = xfs_trans_buf_item_match_all(tp, &bdev, XFS_SB_DADDR, len); + bp = xfs_trans_buf_item_match(tp, &bdev, XFS_SB_DADDR, len); if (bp != NULL) { ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); @@ -494,10 +484,7 @@ libxfs_trans_read_buf( } bdev.dev = dev; - if (tp->t_items.lic_next == NULL) - bp = xfs_trans_buf_item_match(tp, &bdev, blkno, len); - else - bp = xfs_trans_buf_item_match_all(tp, &bdev, blkno, len); + bp = xfs_trans_buf_item_match(tp, &bdev, blkno, len); if (bp != NULL) { ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); @@ -574,13 +561,11 @@ inode_item_done( xfs_inode_t *ip; xfs_mount_t *mp; xfs_buf_t *bp; - int hold; int error; extern kmem_zone_t *xfs_ili_zone; ip = iip->ili_inode; mp = iip->ili_item.li_mountp; - hold = iip->ili_flags & XFS_ILI_HOLD; ASSERT(ip != NULL); if (!(iip->ili_format.ilf_fields & XFS_ILOG_ALL)) { @@ -613,11 +598,11 @@ inode_item_done( libxfs_writebuf(bp, 0); #ifdef XACT_DEBUG fprintf(stderr, "flushing dirty inode %llu, buffer %p (hold=%u)\n", - ip->i_ino, bp, hold); + ip->i_ino, bp, iip->ili_lock_flags); #endif ili_done: - if (hold) { - iip->ili_flags &= ~XFS_ILI_HOLD; + if (iip->ili_lock_flags) { + iip->ili_lock_flags = 0; return; } else { libxfs_iput(ip, 0); @@ -659,63 +644,26 @@ buf_item_done( kmem_zone_free(xfs_buf_item_zone, bip); } -/* - * This is called to perform the commit processing for each - * item described by the given chunk. - */ static void -trans_chunk_committed( - xfs_log_item_chunk_t *licp) +trans_committed( + xfs_trans_t *tp) { - xfs_log_item_desc_t *lidp; - xfs_log_item_t *lip; - int i; - - lidp = licp->lic_descs; - for (i = 0; i < licp->lic_unused; i++, lidp++) { - if (xfs_lic_isfree(licp, i)) - continue; - lip = lidp->lid_item; + struct xfs_log_item_desc *lidp, *next; + + list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) { + struct xfs_log_item *lip = lidp->lid_item; + + xfs_trans_del_item(lip); if (lip->li_type == XFS_LI_BUF) - buf_item_done((xfs_buf_log_item_t *)lidp->lid_item); + buf_item_done((xfs_buf_log_item_t *)lip); else if (lip->li_type == XFS_LI_INODE) - inode_item_done((xfs_inode_log_item_t *)lidp->lid_item); + inode_item_done((xfs_inode_log_item_t *)lip); else { fprintf(stderr, _("%s: unrecognised log item type\n"), progname); ASSERT(0); } - } -} - -/* - * Calls trans_chunk_committed() to process the items in each chunk. - */ -static void -trans_committed( - xfs_trans_t *tp) -{ - xfs_log_item_chunk_t *licp; - xfs_log_item_chunk_t *next_licp; - - /* - * Special case the chunk embedded in the transaction. - */ - licp = &(tp->t_items); - if (!(xfs_lic_are_all_free(licp))) { - trans_chunk_committed(licp); - } - - /* - * Process the items in each chunk in turn. - */ - licp = licp->lic_next; - while (licp != NULL) { - trans_chunk_committed(licp); - next_licp = licp->lic_next; - kmem_free(licp); - licp = next_licp; - } + } } static void @@ -729,9 +677,9 @@ buf_item_unlock( XFS_BUF_SET_FSPRIVATE2(bip->bli_buf, NULL); hold = bip->bli_flags & XFS_BLI_HOLD; + bip->bli_flags &= ~XFS_BLI_HOLD; if (!hold) libxfs_putbuf(bp); - bip->bli_flags &= ~XFS_BLI_HOLD; } static void @@ -739,75 +687,44 @@ inode_item_unlock( xfs_inode_log_item_t *iip) { xfs_inode_t *ip = iip->ili_inode; - uint hold; /* Clear the transaction pointer in the inode. */ ip->i_transp = NULL; - hold = iip->ili_flags & XFS_ILI_HOLD; - if (!hold) - libxfs_iput(ip, 0); iip->ili_flags = 0; + if (!iip->ili_lock_flags) + libxfs_iput(ip, 0); + else + iip->ili_lock_flags = 0; } /* - * Unlock each item pointed to by a descriptor in the given chunk. - * Free descriptors pointing to items which are not dirty if freeing_chunk - * is zero. If freeing_chunk is non-zero, then we need to unlock all - * items in the chunk. Return the number of descriptors freed. - * Originally based on xfs_trans_unlock_chunk() - adapted for libxfs - * transactions though. + * Unlock all of the items of a transaction and free all the descriptors + * of that transaction. */ -int -xfs_trans_unlock_chunk( - xfs_log_item_chunk_t *licp, - int freeing_chunk, - int abort, - xfs_lsn_t commit_lsn) /* nb: unused */ +void +xfs_trans_free_items( + struct xfs_trans *tp, + int flags) { - xfs_log_item_desc_t *lidp; - xfs_log_item_t *lip; - int i; - int freed; - - freed = 0; - lidp = licp->lic_descs; - for (i = 0; i < licp->lic_unused; i++, lidp++) { - if (xfs_lic_isfree(licp, i)) { - continue; - } - lip = lidp->lid_item; - lip->li_desc = NULL; + struct xfs_log_item_desc *lidp, *next; - /* - * Disassociate the logged item from this transaction - */ + list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) { + struct xfs_log_item *lip = lidp->lid_item; + + xfs_trans_del_item(lip); if (lip->li_type == XFS_LI_BUF) - buf_item_unlock((xfs_buf_log_item_t *)lidp->lid_item); + buf_item_unlock((xfs_buf_log_item_t *)lip); else if (lip->li_type == XFS_LI_INODE) - inode_item_unlock((xfs_inode_log_item_t *)lidp->lid_item); + inode_item_unlock((xfs_inode_log_item_t *)lip); else { fprintf(stderr, _("%s: unrecognised log item type\n"), progname); ASSERT(0); } - - /* - * Free the descriptor if the item is not dirty - * within this transaction and the caller is not - * going to just free the entire thing regardless. - */ - if (!(freeing_chunk) && - (!(lidp->lid_flags & XFS_LID_DIRTY) || abort)) { - xfs_lic_relse(licp, i); - freed++; - } } - - return (freed); } - /* * Commit the changes represented by this transaction */ diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 8e94dad..a9e2bf1 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -108,8 +108,6 @@ typedef __uint32_t inst_t; /* an instruction */ #define PAGE_CACHE_SIZE getpagesize() -#define INIT_LIST_HEAD(x) - static inline int __do_div(unsigned long long *n, unsigned base) { int __res; @@ -329,10 +327,9 @@ void xfs_mount_common(xfs_mount_t *, xfs_sb_t *); */ /* xfs_trans_item.c */ -xfs_log_item_desc_t *xfs_trans_add_item (xfs_trans_t *, xfs_log_item_t *); -xfs_log_item_desc_t *xfs_trans_find_item (xfs_trans_t *, xfs_log_item_t *); -void xfs_trans_free_item (xfs_trans_t *, xfs_log_item_desc_t *); -void xfs_trans_free_items (xfs_trans_t *, int); +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 *, int); /* xfs_inode_item.c */ void xfs_inode_item_init (xfs_inode_t *, xfs_mount_t *); @@ -344,10 +341,7 @@ void xfs_buf_item_log (xfs_buf_log_item_t *, uint, uint); /* xfs_trans_buf.c */ xfs_buf_t *xfs_trans_buf_item_match (xfs_trans_t *, xfs_buftarg_t *, xfs_daddr_t, int); -xfs_buf_t *xfs_trans_buf_item_match_all (xfs_trans_t *, xfs_buftarg_t *, - xfs_daddr_t, int); /* local source files */ int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); void xfs_trans_mod_sb(xfs_trans_t *, uint, long); -int xfs_trans_unlock_chunk (xfs_log_item_chunk_t *, int, int, xfs_lsn_t); diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index 02bff42..dde9678 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -270,7 +270,6 @@ xfs_mount_common(xfs_mount_t *mp, xfs_sb_t *sbp) mp->m_blockmask = sbp->sb_blocksize - 1; mp->m_blockwsize = sbp->sb_blocksize >> XFS_WORDLOG; mp->m_blockwmask = mp->m_blockwsize - 1; - INIT_LIST_HEAD(&mp->m_del_inodes); /* * Setup for attributes, in case they get created. diff --git a/libxfs/xfs_trans.c b/libxfs/xfs_trans.c index 9036995..635de8f 100644 --- a/libxfs/xfs_trans.c +++ b/libxfs/xfs_trans.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (C) 2010 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -18,135 +19,491 @@ #include +kmem_zone_t *xfs_trans_zone; +kmem_zone_t *xfs_log_item_desc_zone; + /* - * Reservation functions here avoid a huge stack in xfs_trans_init - * due to register overflow from temporaries in the calculations. + * Various log reservation values. + * + * These are based on the size of the file system block because that is what + * most transactions manipulate. Each adds in an additional 128 bytes per + * item logged to try to account for the overhead of the transaction mechanism. + * + * Note: Most of the reservations underestimate the number of allocation + * groups into which they could free extents in the xfs_bmap_finish() call. + * This is because the number in the worst case is quite high and quite + * unusual. In order to fix this we need to change xfs_bmap_finish() to free + * extents in only a single AG at a time. This will require changes to the + * EFI code as well, however, so that the EFI for the extents not freed is + * logged again in each transaction. See SGI PV #261917. + * + * Reservation functions here avoid a huge stack in xfs_trans_init due to + * register overflow from temporaries in the calculations. */ + +/* + * In a write transaction we can allocate a maximum of 2 + * extents. This gives: + * the inode getting the new extents: inode size + * the inode's bmap btree: max depth * block size + * the agfs of the ags from which the extents are allocated: 2 * sector + * the superblock free block counter: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + * And the bmap_finish transaction can free bmap blocks in a join: + * the agfs of the ags containing the blocks: 2 * sector size + * the agfls of the ags containing the blocks: 2 * sector size + * the super block free block counter: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_write_reservation(xfs_mount_t *mp) +xfs_calc_write_reservation( + struct xfs_mount *mp) { - return XFS_CALC_WRITE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + + 2 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 2) + + 128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + + XFS_ALLOCFREE_LOG_COUNT(mp, 2))), + (2 * mp->m_sb.sb_sectsize + + 2 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 2) + + 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); } +/* + * In truncating a file we free up to two extents at once. We can modify: + * the inode being truncated: inode size + * the inode's bmap btree: (max depth + 1) * block size + * And the bmap_finish transaction can free the blocks and bmap blocks: + * the agf for each of the ags: 4 * sector size + * the agfl for each of the ags: 4 * sector size + * the super block to reflect the freed blocks: sector size + * worst case split in allocation btrees per extent assuming 4 extents: + * 4 exts * 2 trees * (2 * max depth - 1) * block size + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (max depth - 1) * block size + */ STATIC uint -xfs_calc_itruncate_reservation(xfs_mount_t *mp) +xfs_calc_itruncate_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ITRUNCATE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + + 128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), + (4 * mp->m_sb.sb_sectsize + + 4 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 4) + + 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + + 128 * 5 + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); } +/* + * In renaming a files we can modify: + * the four inodes involved: 4 * inode size + * the two directory btrees: 2 * (max depth + v2) * dir block size + * the two directory bmap btrees: 2 * max depth * block size + * And the bmap_finish transaction can free dir and bmap blocks (two sets + * of bmap blocks) giving: + * the agf for the ags in which the blocks live: 3 * sector size + * the agfl for the ags in which the blocks live: 3 * sector size + * the superblock for the free block count: sector size + * the allocation btrees: 3 exts * 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_rename_reservation(xfs_mount_t *mp) +xfs_calc_rename_reservation( + struct xfs_mount *mp) { - return XFS_CALC_RENAME_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((4 * mp->m_sb.sb_inodesize + + 2 * XFS_DIROP_LOG_RES(mp) + + 128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp))), + (3 * mp->m_sb.sb_sectsize + + 3 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 3) + + 128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))); } +/* + * For creating a link to an inode: + * the parent directory inode: inode size + * the linked inode: inode size + * the directory btree could split: (max depth + v2) * dir block size + * the directory bmap btree could join or split: (max depth + v2) * blocksize + * And the bmap_finish transaction can free some bmap blocks giving: + * the agf for the ag in which the blocks live: sector size + * the agfl for the ag in which the blocks live: sector size + * the superblock for the free block count: sector size + * the allocation btrees: 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_link_reservation(xfs_mount_t *mp) +xfs_calc_link_reservation( + struct xfs_mount *mp) { - return XFS_CALC_LINK_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + mp->m_sb.sb_inodesize + + XFS_DIROP_LOG_RES(mp) + + 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), + (mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); } +/* + * For removing a directory entry we can modify: + * the parent directory inode: inode size + * the removed inode: inode size + * the directory btree could join: (max depth + v2) * dir block size + * the directory bmap btree could join or split: (max depth + v2) * blocksize + * And the bmap_finish transaction can free the dir and bmap blocks giving: + * the agf for the ag in which the blocks live: 2 * sector size + * the agfl for the ag in which the blocks live: 2 * sector size + * the superblock for the free block count: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_remove_reservation(xfs_mount_t *mp) +xfs_calc_remove_reservation( + struct xfs_mount *mp) { - return XFS_CALC_REMOVE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + mp->m_sb.sb_inodesize + + XFS_DIROP_LOG_RES(mp) + + 128 * (2 + XFS_DIROP_LOG_COUNT(mp))), + (2 * mp->m_sb.sb_sectsize + + 2 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 2) + + 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); } +/* + * For symlink we can modify: + * the parent directory inode: inode size + * the new inode: inode size + * the inode btree entry: 1 block + * the directory btree: (max depth + v2) * dir block size + * the directory inode's bmap btree: (max depth + v2) * block size + * the blocks for the symlink: 1 kB + * Or in the first xact we allocate some inodes giving: + * the agi and agf of the ag getting the new inodes: 2 * sectorsize + * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_symlink_reservation(xfs_mount_t *mp) +xfs_calc_symlink_reservation( + struct xfs_mount *mp) { - return XFS_CALC_SYMLINK_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, 1) + + XFS_DIROP_LOG_RES(mp) + + 1024 + + 128 * (4 + XFS_DIROP_LOG_COUNT(mp))), + (2 * mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + + XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); } +/* + * For create we can modify: + * the parent directory inode: inode size + * the new inode: inode size + * the inode btree entry: block size + * the superblock for the nlink flag: sector size + * the directory btree: (max depth + v2) * dir block size + * the directory inode's bmap btree: (max depth + v2) * block size + * Or in the first xact we allocate some inodes giving: + * the agi and agf of the ag getting the new inodes: 2 * sectorsize + * the superblock for the nlink flag: sector size + * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (max depth - 1) * block size + */ STATIC uint -xfs_calc_create_reservation(xfs_mount_t *mp) +xfs_calc_create_reservation( + struct xfs_mount *mp) { - return XFS_CALC_CREATE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, 1) + + XFS_DIROP_LOG_RES(mp) + + 128 * (3 + XFS_DIROP_LOG_COUNT(mp))), + (3 * mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + + XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); } +/* + * Making a new directory is the same as creating a new file. + */ STATIC uint -xfs_calc_mkdir_reservation(xfs_mount_t *mp) +xfs_calc_mkdir_reservation( + struct xfs_mount *mp) { - return XFS_CALC_MKDIR_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return xfs_calc_create_reservation(mp); } +/* + * In freeing an inode we can modify: + * the inode being freed: inode size + * the super block free inode counter: sector size + * the agi hash list and counters: sector size + * the inode btree entry: block size + * the on disk inode before ours in the agi hash list: inode cluster size + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (max depth - 1) * block size + */ STATIC uint -xfs_calc_ifree_reservation(xfs_mount_t *mp) +xfs_calc_ifree_reservation( + struct xfs_mount *mp) { - return XFS_CALC_IFREE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, 1) + + MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), + XFS_INODE_CLUSTER_SIZE(mp)) + + 128 * 5 + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); } +/* + * When only changing the inode we log the inode and possibly the superblock + * We also add a bit of slop for the transaction stuff. + */ STATIC uint -xfs_calc_ichange_reservation(xfs_mount_t *mp) +xfs_calc_ichange_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ICHANGE_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize + + 512; + } +/* + * Growing the data section of the filesystem. + * superblock + * agi and agf + * allocation btrees + */ STATIC uint -xfs_calc_growdata_reservation(xfs_mount_t *mp) +xfs_calc_growdata_reservation( + struct xfs_mount *mp) { - return XFS_CALC_GROWDATA_LOG_RES(mp); + return mp->m_sb.sb_sectsize * 3 + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); } +/* + * Growing the rt section of the filesystem. + * In the first set of transactions (ALLOC) we allocate space to the + * bitmap or summary files. + * superblock: sector size + * agf of the ag from which the extent is allocated: sector size + * bmap btree for bitmap/summary inode: max depth * blocksize + * bitmap/summary inode: inode size + * allocation btrees for 1 block alloc: 2 * (2 * maxdepth - 1) * blocksize + */ STATIC uint -xfs_calc_growrtalloc_reservation(xfs_mount_t *mp) +xfs_calc_growrtalloc_reservation( + struct xfs_mount *mp) { - return XFS_CALC_GROWRTALLOC_LOG_RES(mp); + return 2 * mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + + mp->m_sb.sb_inodesize + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); } +/* + * Growing the rt section of the filesystem. + * In the second set of transactions (ZERO) we zero the new metadata blocks. + * one bitmap/summary block: blocksize + */ STATIC uint -xfs_calc_growrtzero_reservation(xfs_mount_t *mp) +xfs_calc_growrtzero_reservation( + struct xfs_mount *mp) { - return XFS_CALC_GROWRTZERO_LOG_RES(mp); + return mp->m_sb.sb_blocksize + 128; } +/* + * Growing the rt section of the filesystem. + * In the third set of transactions (FREE) we update metadata without + * allocating any new blocks. + * superblock: sector size + * bitmap inode: inode size + * summary inode: inode size + * one bitmap block: blocksize + * summary blocks: new summary size + */ STATIC uint -xfs_calc_growrtfree_reservation(xfs_mount_t *mp) +xfs_calc_growrtfree_reservation( + struct xfs_mount *mp) { - return XFS_CALC_GROWRTFREE_LOG_RES(mp); + return mp->m_sb.sb_sectsize + + 2 * mp->m_sb.sb_inodesize + + mp->m_sb.sb_blocksize + + mp->m_rsumsize + + 128 * 5; } +/* + * Logging the inode modification timestamp on a synchronous write. + * inode + */ STATIC uint -xfs_calc_swrite_reservation(xfs_mount_t *mp) +xfs_calc_swrite_reservation( + struct xfs_mount *mp) { - return XFS_CALC_SWRITE_LOG_RES(mp); + return mp->m_sb.sb_inodesize + 128; } +/* + * Logging the inode mode bits when writing a setuid/setgid file + * inode + */ STATIC uint xfs_calc_writeid_reservation(xfs_mount_t *mp) { - return XFS_CALC_WRITEID_LOG_RES(mp); + return mp->m_sb.sb_inodesize + 128; } +/* + * Converting the inode from non-attributed to attributed. + * the inode being converted: inode size + * agf block and superblock (for block allocation) + * the new block (directory sized) + * bmap blocks for the new directory block + * allocation btrees + */ STATIC uint -xfs_calc_addafork_reservation(xfs_mount_t *mp) +xfs_calc_addafork_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ADDAFORK_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize * 2 + + mp->m_dirblksize + + XFS_FSB_TO_B(mp, XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + + XFS_ALLOCFREE_LOG_RES(mp, 1) + + 128 * (4 + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1 + + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); } +/* + * Removing the attribute fork of a file + * the inode being truncated: inode size + * the inode's bmap btree: max depth * block size + * And the bmap_finish transaction can free the blocks and bmap blocks: + * the agf for each of the ags: 4 * sector size + * the agfl for each of the ags: 4 * sector size + * the super block to reflect the freed blocks: sector size + * worst case split in allocation btrees per extent assuming 4 extents: + * 4 exts * 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_attrinval_reservation(xfs_mount_t *mp) +xfs_calc_attrinval_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ATTRINVAL_LOG_RES(mp); + return MAX((mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + + 128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))), + (4 * mp->m_sb.sb_sectsize + + 4 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 4) + + 128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))); } +/* + * Setting an attribute. + * the inode getting the attribute + * the superblock for allocations + * the agfs extents are allocated from + * the attribute btree * max depth + * the inode allocation btree + * Since attribute transaction space is dependent on the size of the attribute, + * the calculation is done partially at mount time and partially at runtime. + */ STATIC uint -xfs_calc_attrset_reservation(xfs_mount_t *mp) +xfs_calc_attrset_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ATTRSET_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize + + XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + + 128 * (2 + XFS_DA_NODE_MAXDEPTH); } +/* + * Removing an attribute. + * the inode: inode size + * the attribute btree could join: max depth * block size + * the inode bmap btree could join or split: max depth * block size + * And the bmap_finish transaction can free the attr blocks freed giving: + * the agf for the ag in which the blocks live: 2 * sector size + * the agfl for the ag in which the blocks live: 2 * sector size + * the superblock for the free block count: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + */ STATIC uint -xfs_calc_attrrm_reservation(xfs_mount_t *mp) +xfs_calc_attrrm_reservation( + struct xfs_mount *mp) { - return XFS_CALC_ATTRRM_LOG_RES(mp) + XFS_DQUOT_LOGRES(mp); + return XFS_DQUOT_LOGRES(mp) + + MAX((mp->m_sb.sb_inodesize + + XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + + XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + + 128 * (1 + XFS_DA_NODE_MAXDEPTH + + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), + (2 * mp->m_sb.sb_sectsize + + 2 * mp->m_sb.sb_sectsize + + mp->m_sb.sb_sectsize + + XFS_ALLOCFREE_LOG_RES(mp, 2) + + 128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); } +/* + * Clearing a bad agino number in an agi hash bucket. + */ STATIC uint -xfs_calc_clear_agi_bucket_reservation(xfs_mount_t *mp) +xfs_calc_clear_agi_bucket_reservation( + struct xfs_mount *mp) { - return XFS_CALC_CLEAR_AGI_BUCKET_LOG_RES(mp); + return mp->m_sb.sb_sectsize + 128; } /* @@ -155,11 +512,10 @@ xfs_calc_clear_agi_bucket_reservation(xfs_mount_t *mp) */ void xfs_trans_init( - xfs_mount_t *mp) + struct xfs_mount *mp) { - xfs_trans_reservations_t *resp; + struct xfs_trans_reservations *resp = &mp->m_reservations; - resp = &(mp->m_reservations); resp->tr_write = xfs_calc_write_reservation(mp); resp->tr_itruncate = xfs_calc_itruncate_reservation(mp); resp->tr_rename = xfs_calc_rename_reservation(mp); @@ -184,6 +540,50 @@ xfs_trans_init( } /* + * Add the given log item to the transaction's list of log items. + * + * The log item will now point to its new descriptor with its li_desc field. + */ +void +xfs_trans_add_item( + struct xfs_trans *tp, + struct xfs_log_item *lip) +{ + struct xfs_log_item_desc *lidp; + + ASSERT(lip->li_mountp = tp->t_mountp); + ASSERT(lip->li_ailp = tp->t_mountp->m_ail); + + lidp = kmem_zone_zalloc(xfs_log_item_desc_zone, KM_SLEEP | KM_NOFS); + + lidp->lid_item = lip; + lidp->lid_flags = 0; + lidp->lid_size = 0; + list_add_tail(&lidp->lid_trans, &tp->t_items); + + lip->li_desc = lidp; +} + +STATIC void +xfs_trans_free_item_desc( + struct xfs_log_item_desc *lidp) +{ + list_del_init(&lidp->lid_trans); + kmem_zone_free(xfs_log_item_desc_zone, lidp); +} + +/* + * Unlink and free the given descriptor. + */ +void +xfs_trans_del_item( + struct xfs_log_item *lip) +{ + xfs_trans_free_item_desc(lip->li_desc); + lip->li_desc = NULL; +} + +/* * Roll from one trans in the sequence of PERMANENT transactions to * the next: permanent transactions are only flushed out when * committed with XFS_TRANS_RELEASE_LOG_RES, but we still want as soon diff --git a/libxlog/xfs_log_recover.c b/libxlog/xfs_log_recover.c index 9e0e567..23fe6fd 100644 --- a/libxlog/xfs_log_recover.c +++ b/libxlog/xfs_log_recover.c @@ -22,31 +22,60 @@ #define xlog_clear_stale_blocks(log, tail_lsn) (0) #define xfs_readonly_buftarg(buftarg) (0) -STATIC void xlog_recover_insert_item_backq(xlog_recover_item_t **q, - xlog_recover_item_t *item); /* - * Sector aligned buffer routines for buffer create/read/write/access + * Verify the given count of basic blocks is valid number of blocks + * to specify for an operation involving the given XFS log buffer. + * Returns nonzero if the count is valid, 0 otherwise. */ -#define XLOG_SECTOR_ROUNDUP_BBCOUNT(log, bbs) \ - ( ((log)->l_sectbb_mask && (bbs & (log)->l_sectbb_mask)) ? \ - ((bbs + (log)->l_sectbb_mask + 1) & ~(log)->l_sectbb_mask) : (bbs) ) -#define XLOG_SECTOR_ROUNDDOWN_BLKNO(log, bno) ((bno) & ~(log)->l_sectbb_mask) +static inline int +xlog_buf_bbcount_valid( + xlog_t *log, + int bbcount) +{ + return bbcount > 0 && bbcount <= log->l_logBBsize; +} +/* + * Allocate a buffer to hold log data. The buffer needs to be able + * to map to a range of nbblks basic blocks at any valid (basic + * block) offset within the log. + */ xfs_buf_t * xlog_get_bp( xlog_t *log, - int num_bblks) + int nbblks) { - ASSERT(num_bblks > 0); - - if (log->l_sectbb_log) { - if (num_bblks > 1) - num_bblks += XLOG_SECTOR_ROUNDUP_BBCOUNT(log, 1); - num_bblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, num_bblks); + if (!xlog_buf_bbcount_valid(log, nbblks)) { + xlog_warn("XFS: Invalid block length (0x%x) given for buffer", + nbblks); + XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_HIGH, log->l_mp); + return NULL; } - return libxfs_getbufr(log->l_dev, (xfs_daddr_t)-1, num_bblks); + + /* + * We do log I/O in units of log sectors (a power-of-2 + * multiple of the basic block size), so we round up the + * requested size to acommodate the basic blocks required + * for complete log sectors. + * + * In addition, the buffer may be used for a non-sector- + * aligned block offset, in which case an I/O of the + * requested size could extend beyond the end of the + * buffer. If the requested size is only 1 basic block it + * will never straddle a sector boundary, so this won't be + * an issue. Nor will this be a problem if the log I/O is + * done in basic blocks (sector size 1). But otherwise we + * extend the buffer by one extra log sector to ensure + * there's space to accomodate this possiblility. + */ + if (nbblks > 1 && log->l_sectBBsize > 1) + nbblks += log->l_sectBBsize; + if (log->l_sectBBsize) + nbblks = round_up(nbblks, log->l_sectBBsize); + + return libxfs_getbufr(log->l_dev, (xfs_daddr_t)-1, nbblks); } void @@ -56,25 +85,50 @@ xlog_put_bp( libxfs_putbufr(bp); } +/* + * Return the address of the start of the given block number's data + * in a log buffer. The buffer covers a log sector-aligned region. + */ +STATIC xfs_caddr_t +xlog_align( + xlog_t *log, + xfs_daddr_t blk_no, + int nbblks, + xfs_buf_t *bp) +{ + xfs_daddr_t offset = 0; + + if (log->l_sectBBsize) + offset = blk_no & ((xfs_daddr_t)log->l_sectBBsize - 1); + + ASSERT(BBTOB(offset + nbblks) <= XFS_BUF_SIZE(bp)); + return XFS_BUF_PTR(bp) + BBTOB(offset); +} /* * nbblks should be uint, but oh well. Just want to catch that 32-bit length. */ int -xlog_bread( +xlog_bread_noalign( xlog_t *log, xfs_daddr_t blk_no, int nbblks, xfs_buf_t *bp) { - if (log->l_sectbb_log) { - blk_no = XLOG_SECTOR_ROUNDDOWN_BLKNO(log, blk_no); - nbblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, nbblks); + if (!xlog_buf_bbcount_valid(log, nbblks)) { + xlog_warn("XFS: Invalid block length (0x%x) given for buffer", + nbblks); + XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_HIGH, log->l_mp); + return EFSCORRUPTED; + } + + if (log->l_sectBBsize > 1) { + blk_no = round_down(blk_no, log->l_sectBBsize); + nbblks = round_up(nbblks, log->l_sectBBsize); } ASSERT(nbblks > 0); ASSERT(BBTOB(nbblks) <= XFS_BUF_SIZE(bp)); - ASSERT(bp); XFS_BUF_SET_ADDR(bp, log->l_logBBstart + blk_no); XFS_BUF_SET_COUNT(bp, BBTOB(nbblks)); @@ -82,26 +136,24 @@ xlog_bread( return libxfs_readbufr(log->l_dev, XFS_BUF_ADDR(bp), bp, nbblks, 0); } - -static xfs_caddr_t -xlog_align( +int +xlog_bread( xlog_t *log, xfs_daddr_t blk_no, int nbblks, - xfs_buf_t *bp) + xfs_buf_t *bp, + xfs_caddr_t *offset) { - xfs_caddr_t ptr; + int error; - if (!log->l_sectbb_log) - return XFS_BUF_PTR(bp); + error = xlog_bread_noalign(log, blk_no, nbblks, bp); + if (error) + return error; - ptr = XFS_BUF_PTR(bp) + BBTOB((int)blk_no & log->l_sectbb_mask); - ASSERT(XFS_BUF_SIZE(bp) >= - BBTOB(nbblks + (blk_no & log->l_sectbb_mask))); - return ptr; + *offset = xlog_align(log, blk_no, nbblks, bp); + return 0; } - /* * This routine finds (to an approximation) the first block in the physical * log which contains the given cycle. It uses a binary search algorithm. @@ -118,39 +170,38 @@ xlog_find_cycle_start( { xfs_caddr_t offset; xfs_daddr_t mid_blk; + xfs_daddr_t end_blk; uint mid_cycle; int error; - mid_blk = BLK_AVG(first_blk, *last_blk); - while (mid_blk != first_blk && mid_blk != *last_blk) { - if ((error = xlog_bread(log, mid_blk, 1, bp))) + end_blk = *last_blk; + mid_blk = BLK_AVG(first_blk, end_blk); + while (mid_blk != first_blk && mid_blk != end_blk) { + error = xlog_bread(log, mid_blk, 1, bp, &offset); + if (error) return error; - offset = xlog_align(log, mid_blk, 1, bp); mid_cycle = xlog_get_cycle(offset); - if (mid_cycle == cycle) { - *last_blk = mid_blk; - /* last_half_cycle == mid_cycle */ - } else { - first_blk = mid_blk; - /* first_half_cycle == mid_cycle */ - } - mid_blk = BLK_AVG(first_blk, *last_blk); + if (mid_cycle == cycle) + end_blk = mid_blk; /* last_half_cycle == mid_cycle */ + else + first_blk = mid_blk; /* first_half_cycle == mid_cycle */ + mid_blk = BLK_AVG(first_blk, end_blk); } - ASSERT((mid_blk == first_blk && mid_blk+1 == *last_blk) || - (mid_blk == *last_blk && mid_blk-1 == first_blk)); + ASSERT((mid_blk == first_blk && mid_blk+1 == end_blk) || + (mid_blk == end_blk && mid_blk-1 == first_blk)); + + *last_blk = end_blk; return 0; } /* - * Check that the range of blocks does not contain the cycle number - * given. The scan needs to occur from front to back and the ptr into the - * region must be updated since a later routine will need to perform another - * test. If the region is completely good, we end up returning the same - * last block number. - * - * Set blkno to -1 if we encounter no errors. This is an invalid block number - * since we don't ever expect logs to get this large. + * Check that a range of blocks does not contain stop_on_cycle_no. + * Fill in *new_blk with the block offset where such a block is + * found, or with -1 (an invalid block number) if there is no such + * block in the range. The scan needs to occur from front to back + * and the pointer into the region must be updated since a later + * routine will need to perform another test. */ STATIC int xlog_find_verify_cycle( @@ -167,12 +218,16 @@ xlog_find_verify_cycle( xfs_caddr_t buf = NULL; int error = 0; + /* + * Greedily allocate a buffer big enough to handle the full + * range of basic blocks we'll be examining. If that fails, + * try a smaller size. We need to be able to read at least + * a log sector, or we're out of luck. + */ bufblks = 1 << ffs(nbblks); - while (!(bp = xlog_get_bp(log, bufblks))) { - /* can't get enough memory to do everything in one big buffer */ bufblks >>= 1; - if (bufblks <= log->l_sectbb_log) + if (bufblks < MAX(log->l_sectBBsize, 1)) return ENOMEM; } @@ -181,10 +236,10 @@ xlog_find_verify_cycle( bcount = min(bufblks, (start_blk + nbblks - i)); - if ((error = xlog_bread(log, i, bcount, bp))) + error = xlog_bread(log, i, bcount, bp, &buf); + if (error) goto out; - buf = xlog_align(log, i, bcount, bp); for (j = 0; j < bcount; j++) { cycle = xlog_get_cycle(buf); if (cycle == stop_on_cycle_no) { @@ -238,9 +293,9 @@ xlog_find_verify_log_record( return ENOMEM; smallmem = 1; } else { - if ((error = xlog_bread(log, start_blk, num_blks, bp))) + error = xlog_bread(log, start_blk, num_blks, bp, &offset); + if (error) goto out; - offset = xlog_align(log, start_blk, num_blks, bp); offset += ((num_blks - 1) << BBSHIFT); } @@ -255,9 +310,9 @@ xlog_find_verify_log_record( } if (smallmem) { - if ((error = xlog_bread(log, i, 1, bp))) + error = xlog_bread(log, i, 1, bp, &offset); + if (error) goto out; - offset = xlog_align(log, i, 1, bp); } head = (xlog_rec_header_t *)offset; @@ -325,7 +380,7 @@ out: * * Return: zero if normal, non-zero if error. */ -int +STATIC int xlog_find_head( xlog_t *log, xfs_daddr_t *return_head_blk) @@ -337,14 +392,13 @@ xlog_find_head( uint first_half_cycle, last_half_cycle; uint stop_on_cycle; int error, log_bbnum = log->l_logBBsize; - extern int platform_has_uuid; /* Is the end of the log device zeroed? */ if ((error = xlog_find_zeroed(log, &first_blk)) == -1) { *return_head_blk = first_blk; /* Is the whole lot zeroed? */ - if (!first_blk && platform_has_uuid) { + if (!first_blk) { /* Linux XFS shouldn't generate totally zeroed logs - * mkfs etc write a dummy unmount record to a fresh * log so we can store the uuid in there @@ -362,15 +416,18 @@ xlog_find_head( bp = xlog_get_bp(log, 1); if (!bp) return ENOMEM; - if ((error = xlog_bread(log, 0, 1, bp))) + + error = xlog_bread(log, 0, 1, bp, &offset); + if (error) goto bp_err; - offset = xlog_align(log, 0, 1, bp); + first_half_cycle = xlog_get_cycle(offset); last_blk = head_blk = log_bbnum - 1; /* get cycle # of last block */ - if ((error = xlog_bread(log, last_blk, 1, bp))) + error = xlog_bread(log, last_blk, 1, bp, &offset); + if (error) goto bp_err; - offset = xlog_align(log, last_blk, 1, bp); + last_half_cycle = xlog_get_cycle(offset); ASSERT(last_half_cycle != 0); @@ -418,7 +475,7 @@ xlog_find_head( * In this case we want to find the first block with cycle * number matching last_half_cycle. We expect the log to be * some variation on - * x + 1 ... | x ... + * x + 1 ... | x ... | x * The first block with cycle number x (last_half_cycle) will * be where the new head belongs. First we do a binary search * for the first occurrence of last_half_cycle. The binary @@ -428,11 +485,13 @@ xlog_find_head( * the log, then we look for occurrences of last_half_cycle - 1 * at the end of the log. The cases we're looking for look * like - * x + 1 ... | x | x + 1 | x ... - * ^ binary search stopped here + * v binary search stopped here + * x + 1 ... | x | x + 1 | x ... | x + * ^ but we want to locate this spot * or - * x + 1 ... | x ... | x - 1 | x * <---------> less than scan distance + * x + 1 ... | x ... | x - 1 | x + * ^ we want to locate this spot */ stop_on_cycle = last_half_cycle; if ((error = xlog_find_cycle_start(log, bp, first_blk, @@ -488,16 +547,16 @@ xlog_find_head( * certainly not the head of the log. By searching for * last_half_cycle-1 we accomplish that. */ - start_blk = log_bbnum - num_scan_bblks + head_blk; ASSERT(head_blk <= INT_MAX && - (xfs_daddr_t) num_scan_bblks - head_blk >= 0); + (xfs_daddr_t) num_scan_bblks >= head_blk); + start_blk = log_bbnum - (num_scan_bblks - head_blk); if ((error = xlog_find_verify_cycle(log, start_blk, num_scan_bblks - (int)head_blk, (stop_on_cycle - 1), &new_blk))) goto bp_err; if (new_blk != -1) { head_blk = new_blk; - goto bad_blk; + goto validate_head; } /* @@ -515,7 +574,7 @@ xlog_find_head( head_blk = new_blk; } - bad_blk: +validate_head: /* * Now we need to make sure head_blk is not pointing to a block in * the middle of a log record. @@ -537,7 +596,7 @@ xlog_find_head( if ((error = xlog_find_verify_log_record(log, start_blk, &head_blk, 0)) == -1) { /* We hit the beginning of the log during our search */ - start_blk = log_bbnum - num_scan_bblks + head_blk; + start_blk = log_bbnum - (num_scan_bblks - head_blk); new_blk = log_bbnum; ASSERT(start_blk <= INT_MAX && (xfs_daddr_t) log_bbnum-start_blk >= 0); @@ -620,13 +679,14 @@ xlog_find_tail( if (!bp) return ENOMEM; if (*head_blk == 0) { /* special case */ - if ((error = xlog_bread(log, 0, 1, bp))) - goto bread_err; - offset = xlog_align(log, 0, 1, bp); + error = xlog_bread(log, 0, 1, bp, &offset); + if (error) + goto done; + if (xlog_get_cycle(offset) == 0) { *tail_blk = 0; /* leave all other log inited values alone */ - goto exit; + goto done; } } @@ -635,9 +695,10 @@ xlog_find_tail( */ ASSERT(*head_blk < INT_MAX); for (i = (int)(*head_blk) - 1; i >= 0; i--) { - if ((error = xlog_bread(log, i, 1, bp))) - goto bread_err; - offset = xlog_align(log, i, 1, bp); + error = xlog_bread(log, i, 1, bp, &offset); + if (error) + goto done; + if (XLOG_HEADER_MAGIC_NUM == be32_to_cpu(*(__be32 *)offset)) { found = 1; break; @@ -651,9 +712,10 @@ xlog_find_tail( */ if (!found) { for (i = log->l_logBBsize - 1; i >= (int)(*head_blk); i--) { - if ((error = xlog_bread(log, i, 1, bp))) - goto bread_err; - offset = xlog_align(log, i, 1, bp); + error = xlog_bread(log, i, 1, bp, &offset); + if (error) + goto done; + if (XLOG_HEADER_MAGIC_NUM == be32_to_cpu(*(__be32 *)offset)) { found = 2; @@ -686,12 +748,12 @@ 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); - 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); + 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)); + 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 @@ -721,14 +783,14 @@ 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; - if ((error = xlog_bread(log, umount_data_blk, 1, bp))) { - goto bread_err; - } - offset = xlog_align(log, umount_data_blk, 1, bp); + error = xlog_bread(log, umount_data_blk, 1, bp, &offset); + if (error) + goto done; + op_head = (xlog_op_header_t *)offset; if (op_head->oh_flags & XLOG_UNMOUNT_TRANS) { /* @@ -736,12 +798,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); - 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; /* @@ -773,12 +833,10 @@ xlog_find_tail( * But... if the -device- itself is readonly, just skip this. * We can't recover this device anyway, so it won't matter. */ - if (!xfs_readonly_buftarg(log->l_mp->m_logdev_targp)) { + if (!xfs_readonly_buftarg(log->l_mp->m_logdev_targp)) error = xlog_clear_stale_blocks(log, tail_lsn); - } -bread_err: -exit: +done: xlog_put_bp(bp); if (error) @@ -820,9 +878,10 @@ xlog_find_zeroed( bp = xlog_get_bp(log, 1); if (!bp) return ENOMEM; - if ((error = xlog_bread(log, 0, 1, bp))) + error = xlog_bread(log, 0, 1, bp, &offset); + if (error) goto bp_err; - offset = xlog_align(log, 0, 1, bp); + first_cycle = xlog_get_cycle(offset); if (first_cycle == 0) { /* completely zeroed log */ *blk_no = 0; @@ -831,9 +890,10 @@ xlog_find_zeroed( } /* check partially zeroed log */ - if ((error = xlog_bread(log, log_bbnum-1, 1, bp))) + error = xlog_bread(log, log_bbnum-1, 1, bp, &offset); + if (error) goto bp_err; - offset = xlog_align(log, log_bbnum-1, 1, bp); + last_cycle = xlog_get_cycle(offset); if (last_cycle != 0) { /* log completely written to */ xlog_put_bp(bp); @@ -899,40 +959,50 @@ bp_err: STATIC xlog_recover_t * xlog_recover_find_tid( - xlog_recover_t *q, + struct hlist_head *head, xlog_tid_t tid) { - xlog_recover_t *p = q; + xlog_recover_t *trans; + struct hlist_node *n; - while (p != NULL) { - if (p->r_log_tid == tid) - break; - p = p->r_next; + hlist_for_each_entry(trans, n, head, r_list) { + if (trans->r_log_tid == tid) + return trans; } - return p; + return NULL; } STATIC void -xlog_recover_put_hashq( - xlog_recover_t **q, - xlog_recover_t *trans) +xlog_recover_new_tid( + struct hlist_head *head, + xlog_tid_t tid, + xfs_lsn_t lsn) { - trans->r_next = *q; - *q = trans; + xlog_recover_t *trans; + + trans = kmem_zalloc(sizeof(xlog_recover_t), KM_SLEEP); + trans->r_log_tid = tid; + trans->r_lsn = lsn; + INIT_LIST_HEAD(&trans->r_itemq); + + INIT_HLIST_NODE(&trans->r_list); + hlist_add_head(&trans->r_list, head); } STATIC void xlog_recover_add_item( - xlog_recover_item_t **itemq) + struct list_head *head) { xlog_recover_item_t *item; item = kmem_zalloc(sizeof(xlog_recover_item_t), KM_SLEEP); - xlog_recover_insert_item_backq(itemq, item); + INIT_LIST_HEAD(&item->ri_list); + list_add_tail(&item->ri_list, head); } STATIC int xlog_recover_add_to_cont_trans( + struct log *log, xlog_recover_t *trans, xfs_caddr_t dp, int len) @@ -941,8 +1011,7 @@ xlog_recover_add_to_cont_trans( xfs_caddr_t ptr, old_ptr; int old_len; - item = trans->r_itemq; - if (item == NULL) { + if (list_empty(&trans->r_itemq)) { /* finish copying rest of trans header */ xlog_recover_add_item(&trans->r_itemq); ptr = (xfs_caddr_t) &trans->r_theader + @@ -950,7 +1019,8 @@ xlog_recover_add_to_cont_trans( memcpy(ptr, dp, len); /* d, s, l */ return 0; } - item = item->ri_prev; + /* take the tail entry */ + item = list_entry(trans->r_itemq.prev, xlog_recover_item_t, ri_list); old_ptr = item->ri_buf[item->ri_cnt-1].i_addr; old_len = item->ri_buf[item->ri_cnt-1].i_len; @@ -959,6 +1029,7 @@ xlog_recover_add_to_cont_trans( memcpy(&ptr[old_len], dp, len); /* d, s, l */ item->ri_buf[item->ri_cnt-1].i_len += len; item->ri_buf[item->ri_cnt-1].i_addr = ptr; + trace_xfs_log_recover_item_add_cont(log, trans, item, 0); return 0; } @@ -977,6 +1048,7 @@ xlog_recover_add_to_cont_trans( */ STATIC int xlog_recover_add_to_trans( + struct log *log, xlog_recover_t *trans, xfs_caddr_t dp, int len) @@ -987,9 +1059,14 @@ xlog_recover_add_to_trans( if (!len) return 0; - item = trans->r_itemq; - if (item == NULL) { - ASSERT(*(uint *)dp == XFS_TRANS_HEADER_MAGIC); + if (list_empty(&trans->r_itemq)) { + /* we need to catch log corruptions here */ + if (*(uint *)dp != XFS_TRANS_HEADER_MAGIC) { + xlog_warn("XFS: xlog_recover_add_to_trans: " + "bad header magic number"); + ASSERT(0); + return XFS_ERROR(EIO); + } if (len == sizeof(xfs_trans_header_t)) xlog_recover_add_item(&trans->r_itemq); memcpy(&trans->r_theader, dp, len); /* d, s, l */ @@ -1000,88 +1077,40 @@ xlog_recover_add_to_trans( memcpy(ptr, dp, len); in_f = (xfs_inode_log_format_t *)ptr; - if (item->ri_prev->ri_total != 0 && - item->ri_prev->ri_total == item->ri_prev->ri_cnt) { + /* take the tail entry */ + item = list_entry(trans->r_itemq.prev, xlog_recover_item_t, ri_list); + if (item->ri_total != 0 && + item->ri_total == item->ri_cnt) { + /* tail item is in use, get a new one */ xlog_recover_add_item(&trans->r_itemq); + item = list_entry(trans->r_itemq.prev, + xlog_recover_item_t, ri_list); } - item = trans->r_itemq; - item = item->ri_prev; if (item->ri_total == 0) { /* first region to be added */ - item->ri_total = in_f->ilf_size; - ASSERT(item->ri_total <= XLOG_MAX_REGIONS_IN_ITEM); - item->ri_buf = kmem_zalloc((item->ri_total * - sizeof(xfs_log_iovec_t)), KM_SLEEP); + if (in_f->ilf_size == 0 || + in_f->ilf_size > XLOG_MAX_REGIONS_IN_ITEM) { + xlog_warn( + "XFS: bad number of regions (%d) in inode log format", + in_f->ilf_size); + ASSERT(0); + return XFS_ERROR(EIO); + } + + item->ri_total = in_f->ilf_size; + item->ri_buf = + kmem_zalloc(item->ri_total * sizeof(xfs_log_iovec_t), + KM_SLEEP); } ASSERT(item->ri_total > item->ri_cnt); /* Description region is ri_buf[0] */ item->ri_buf[item->ri_cnt].i_addr = ptr; item->ri_buf[item->ri_cnt].i_len = len; item->ri_cnt++; + trace_xfs_log_recover_item_add(log, trans, item, 0); return 0; } -STATIC void -xlog_recover_new_tid( - xlog_recover_t **q, - xlog_tid_t tid, - xfs_lsn_t lsn) -{ - xlog_recover_t *trans; - - trans = kmem_zalloc(sizeof(xlog_recover_t), KM_SLEEP); - trans->r_log_tid = tid; - trans->r_lsn = lsn; - xlog_recover_put_hashq(q, trans); -} - -STATIC int -xlog_recover_unlink_tid( - xlog_recover_t **q, - xlog_recover_t *trans) -{ - xlog_recover_t *tp; - int found = 0; - - ASSERT(trans != NULL); - if (trans == *q) { - *q = (*q)->r_next; - } else { - tp = *q; - while (tp) { - if (tp->r_next == trans) { - found = 1; - break; - } - tp = tp->r_next; - } - if (!found) { - xlog_warn( - "XFS: xlog_recover_unlink_tid: trans not found"); - ASSERT(0); - return XFS_ERROR(EIO); - } - tp->r_next = tp->r_next->r_next; - } - return 0; -} - -STATIC void -xlog_recover_insert_item_backq( - xlog_recover_item_t **q, - xlog_recover_item_t *item) -{ - if (*q == NULL) { - item->ri_prev = item->ri_next = item; - *q = item; - } else { - item->ri_next = *q; - item->ri_prev = (*q)->ri_prev; - (*q)->ri_prev = item; - item->ri_prev->ri_next = item; - } -} - /* * Free up any resources allocated by the transaction * @@ -1089,41 +1118,43 @@ xlog_recover_insert_item_backq( */ STATIC void xlog_recover_free_trans( - xlog_recover_t *trans) + struct xlog_recover *trans) { - xlog_recover_item_t *first_item, *item, *free_item; + xlog_recover_item_t *item, *n; int i; - item = first_item = trans->r_itemq; - do { - free_item = item; - item = item->ri_next; - /* Free the regions in the item. */ - for (i = 0; i < free_item->ri_cnt; i++) { - kmem_free(free_item->ri_buf[i].i_addr); - } + list_for_each_entry_safe(item, n, &trans->r_itemq, ri_list) { + /* Free the regions in the item. */ + list_del(&item->ri_list); + for (i = 0; i < item->ri_cnt; i++) + kmem_free(item->ri_buf[i].i_addr); /* Free the item itself */ - kmem_free(free_item->ri_buf); - kmem_free(free_item); - } while (first_item != item); + kmem_free(item->ri_buf); + kmem_free(item); + } /* Free the transaction recover structure */ kmem_free(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_commit_trans( - xlog_t *log, - xlog_recover_t **q, - xlog_recover_t *trans, + struct log *log, + struct xlog_recover *trans, int pass) { - int error; + int error = 0; - if ((error = xlog_recover_unlink_tid(q, trans))) - return error; + hlist_del(&trans->r_list); if ((error = xlog_recover_do_trans(log, trans, pass))) return error; - xlog_recover_free_trans(trans); /* no error */ + + xlog_recover_free_trans(trans); return 0; } @@ -1148,7 +1179,7 @@ xlog_recover_unmount_trans( STATIC int xlog_recover_process_data( xlog_t *log, - xlog_recover_t *rhash[], + struct hlist_head rhash[], xlog_rec_header_t *rhead, xfs_caddr_t dp, int pass) @@ -1182,27 +1213,32 @@ xlog_recover_process_data( } tid = be32_to_cpu(ohead->oh_tid); hash = XLOG_RHASH(tid); - trans = xlog_recover_find_tid(rhash[hash], tid); + trans = xlog_recover_find_tid(&rhash[hash], tid); if (trans == NULL) { /* not found; add new tid */ if (ohead->oh_flags & XLOG_START_TRANS) xlog_recover_new_tid(&rhash[hash], tid, be64_to_cpu(rhead->h_lsn)); } else { - ASSERT(dp + be32_to_cpu(ohead->oh_len) <= lp); + if (dp + be32_to_cpu(ohead->oh_len) > lp) { + xlog_warn( + "XFS: xlog_recover_process_data: bad length"); + return (XFS_ERROR(EIO)); + } flags = ohead->oh_flags & ~XLOG_END_TRANS; if (flags & XLOG_WAS_CONT_TRANS) flags &= ~XLOG_CONTINUE_TRANS; switch (flags) { case XLOG_COMMIT_TRANS: error = xlog_recover_commit_trans(log, - &rhash[hash], trans, pass); + trans, pass); break; case XLOG_UNMOUNT_TRANS: error = xlog_recover_unmount_trans(trans); break; case XLOG_WAS_CONT_TRANS: - error = xlog_recover_add_to_cont_trans(trans, - dp, be32_to_cpu(ohead->oh_len)); + error = xlog_recover_add_to_cont_trans(log, + trans, dp, + be32_to_cpu(ohead->oh_len)); break; case XLOG_START_TRANS: xlog_warn( @@ -1212,7 +1248,7 @@ xlog_recover_process_data( break; case 0: case XLOG_CONTINUE_TRANS: - error = xlog_recover_add_to_trans(trans, + error = xlog_recover_add_to_trans(log, trans, dp, be32_to_cpu(ohead->oh_len)); break; default: @@ -1238,7 +1274,6 @@ xlog_unpack_data( xlog_t *log) { int i, j, k; - xlog_in_core_2_t *xhdr; for (i = 0; i < BTOBB(be32_to_cpu(rhead->h_len)) && i < (XLOG_HEADER_CYCLE_SIZE / BBSIZE); i++) { @@ -1247,7 +1282,7 @@ xlog_unpack_data( } if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { - xhdr = (xlog_in_core_2_t *)rhead; + xlog_in_core_2_t *xhdr = (xlog_in_core_2_t *)rhead; for ( ; i < BTOBB(be32_to_cpu(rhead->h_len)); i++) { j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); k = i % (XLOG_HEADER_CYCLE_SIZE / BBSIZE); @@ -1255,8 +1290,6 @@ xlog_unpack_data( dp += BBSIZE; } } - - xlog_unpack_data_checksum(rhead, dp, log); } STATIC int @@ -1312,12 +1345,12 @@ xlog_do_recovery_pass( { xlog_rec_header_t *rhead; xfs_daddr_t blk_no; - xfs_caddr_t bufaddr, offset; + xfs_caddr_t offset; xfs_buf_t *hbp, *dbp; int error = 0, h_size; int bblks, split_bblks; int hblks, split_hblks, wrapped_hblks; - xlog_recover_t *rhash[XLOG_RHASH_SIZE]; + struct hlist_head rhash[XLOG_RHASH_SIZE]; ASSERT(head_blk != tail_blk); @@ -1334,9 +1367,11 @@ xlog_do_recovery_pass( hbp = xlog_get_bp(log, 1); if (!hbp) return ENOMEM; - if ((error = xlog_bread(log, tail_blk, 1, hbp))) + + error = xlog_bread(log, tail_blk, 1, hbp, &offset); + if (error) goto bread_err1; - offset = xlog_align(log, tail_blk, 1, hbp); + rhead = (xlog_rec_header_t *)offset; error = xlog_valid_rec_header(log, rhead, tail_blk); if (error) @@ -1353,7 +1388,7 @@ xlog_do_recovery_pass( hblks = 1; } } else { - ASSERT(log->l_sectbb_log == 0); + ASSERT(log->l_sectBBsize == 1); hblks = 1; hbp = xlog_get_bp(log, 1); h_size = XLOG_BIG_RECORD_BSIZE; @@ -1370,9 +1405,10 @@ xlog_do_recovery_pass( memset(rhash, 0, sizeof(rhash)); if (tail_blk <= head_blk) { for (blk_no = tail_blk; blk_no < head_blk; ) { - if ((error = xlog_bread(log, blk_no, hblks, hbp))) + error = xlog_bread(log, blk_no, hblks, hbp, &offset); + if (error) goto bread_err2; - offset = xlog_align(log, blk_no, hblks, hbp); + rhead = (xlog_rec_header_t *)offset; error = xlog_valid_rec_header(log, rhead, blk_no); if (error) @@ -1380,10 +1416,11 @@ xlog_do_recovery_pass( /* blocks in data section */ bblks = (int)BTOBB(be32_to_cpu(rhead->h_len)); - error = xlog_bread(log, blk_no + hblks, bblks, dbp); + error = xlog_bread(log, blk_no + hblks, bblks, dbp, + &offset); if (error) goto bread_err2; - offset = xlog_align(log, blk_no + hblks, bblks, dbp); + xlog_unpack_data(rhead, offset, log); if ((error = xlog_recover_process_data(log, rhash, rhead, offset, pass))) @@ -1401,15 +1438,15 @@ xlog_do_recovery_pass( /* * Check for header wrapping around physical end-of-log */ - offset = NULL; + offset = XFS_BUF_PTR(hbp); split_hblks = 0; wrapped_hblks = 0; if (blk_no + hblks <= log->l_logBBsize) { /* Read header in one read */ - error = xlog_bread(log, blk_no, hblks, hbp); + error = xlog_bread(log, blk_no, hblks, hbp, + &offset); if (error) goto bread_err2; - offset = xlog_align(log, blk_no, hblks, hbp); } else { /* This LR is split across physical log end */ if (blk_no != log->l_logBBsize) { @@ -1417,12 +1454,13 @@ xlog_do_recovery_pass( ASSERT(blk_no <= INT_MAX); split_hblks = log->l_logBBsize - (int)blk_no; ASSERT(split_hblks > 0); - if ((error = xlog_bread(log, blk_no, - split_hblks, hbp))) + error = xlog_bread(log, blk_no, + split_hblks, hbp, + &offset); + if (error) goto bread_err2; - offset = xlog_align(log, blk_no, - split_hblks, hbp); } + /* * Note: this black magic still works with * large sector sizes (non-512) only because: @@ -1436,17 +1474,21 @@ xlog_do_recovery_pass( * - order is important. */ wrapped_hblks = hblks - split_hblks; - bufaddr = XFS_BUF_PTR(hbp); - XFS_BUF_SET_PTR(hbp, - bufaddr + BBTOB(split_hblks), + error = XFS_BUF_SET_PTR(hbp, + offset + BBTOB(split_hblks), BBTOB(hblks - split_hblks)); - error = xlog_bread(log, 0, wrapped_hblks, hbp); if (error) goto bread_err2; - XFS_BUF_SET_PTR(hbp, bufaddr, BBTOB(hblks)); - if (!offset) - offset = xlog_align(log, 0, - wrapped_hblks, hbp); + + error = xlog_bread_noalign(log, 0, + wrapped_hblks, hbp); + if (error) + goto bread_err2; + + error = XFS_BUF_SET_PTR(hbp, offset, + BBTOB(hblks)); + if (error) + goto bread_err2; } rhead = (xlog_rec_header_t *)offset; error = xlog_valid_rec_header(log, rhead, @@ -1459,14 +1501,14 @@ xlog_do_recovery_pass( /* Read in data for log record */ if (blk_no + bblks <= log->l_logBBsize) { - error = xlog_bread(log, blk_no, bblks, dbp); + error = xlog_bread(log, blk_no, bblks, dbp, + &offset); if (error) goto bread_err2; - offset = xlog_align(log, blk_no, bblks, dbp); } else { /* This log record is split across the * physical end of log */ - offset = NULL; + offset = XFS_BUF_PTR(dbp); split_bblks = 0; if (blk_no != log->l_logBBsize) { /* some data is before the physical @@ -1476,12 +1518,13 @@ xlog_do_recovery_pass( split_bblks = log->l_logBBsize - (int)blk_no; ASSERT(split_bblks > 0); - if ((error = xlog_bread(log, blk_no, - split_bblks, dbp))) + error = xlog_bread(log, blk_no, + split_bblks, dbp, + &offset); + if (error) goto bread_err2; - offset = xlog_align(log, blk_no, - split_bblks, dbp); } + /* * Note: this black magic still works with * large sector sizes (non-512) only because: @@ -1494,18 +1537,21 @@ xlog_do_recovery_pass( * _first_, then the log start (LR header end) * - order is important. */ - bufaddr = XFS_BUF_PTR(dbp); - XFS_BUF_SET_PTR(dbp, - bufaddr + BBTOB(split_bblks), + error = XFS_BUF_SET_PTR(dbp, + offset + BBTOB(split_bblks), BBTOB(bblks - split_bblks)); - error = xlog_bread(log, wrapped_hblks, - bblks - split_bblks, dbp); if (error) goto bread_err2; - XFS_BUF_SET_PTR(dbp, bufaddr, h_size); - if (!offset) - offset = xlog_align(log, wrapped_hblks, - bblks - split_bblks, dbp); + + error = xlog_bread_noalign(log, wrapped_hblks, + bblks - split_bblks, + dbp); + if (error) + goto bread_err2; + + error = XFS_BUF_SET_PTR(dbp, offset, h_size); + if (error) + goto bread_err2; } xlog_unpack_data(rhead, offset, log); if ((error = xlog_recover_process_data(log, rhash, @@ -1519,17 +1565,21 @@ xlog_do_recovery_pass( /* read first part of physical log */ while (blk_no < head_blk) { - if ((error = xlog_bread(log, blk_no, hblks, hbp))) + error = xlog_bread(log, blk_no, hblks, hbp, &offset); + if (error) goto bread_err2; - offset = xlog_align(log, blk_no, hblks, hbp); + rhead = (xlog_rec_header_t *)offset; error = xlog_valid_rec_header(log, rhead, blk_no); if (error) goto bread_err2; + bblks = (int)BTOBB(be32_to_cpu(rhead->h_len)); - if ((error = xlog_bread(log, blk_no+hblks, bblks, dbp))) + error = xlog_bread(log, blk_no+hblks, bblks, dbp, + &offset); + if (error) goto bread_err2; - offset = xlog_align(log, blk_no+hblks, bblks, dbp); + xlog_unpack_data(rhead, offset, log); if ((error = xlog_recover_process_data(log, rhash, rhead, offset, pass))) diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index 7bd4617..62727bf 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -36,10 +36,10 @@ xlog_print_find_oldest( first_blk = 0; /* read first block */ bp = xlog_get_bp(log, 1); - xlog_bread(log, 0, 1, bp); + xlog_bread_noalign(log, 0, 1, bp); first_half_cycle = xlog_get_cycle(XFS_BUF_PTR(bp)); *last_blk = log->l_logBBsize-1; /* read last block */ - xlog_bread(log, *last_blk, 1, bp); + xlog_bread_noalign(log, *last_blk, 1, bp); last_half_cycle = xlog_get_cycle(XFS_BUF_PTR(bp)); ASSERT(last_half_cycle != 0); @@ -486,19 +486,16 @@ xlog_recover_print_item( void xlog_recover_print_trans( xlog_recover_t *trans, - xlog_recover_item_t *itemq, + struct list_head *itemq, int print) { - xlog_recover_item_t *first_item, *item; + xlog_recover_item_t *item; if (print < 3) return; print_xlog_record_line(); xlog_recover_print_trans_head(trans); - item = first_item = itemq; - do { + list_for_each_entry(item, itemq, ri_list) xlog_recover_print_item(item); - item = item->ri_next; - } while (first_item != item); } diff --git a/logprint/log_print_trans.c b/logprint/log_print_trans.c index 8b21257..7405772 100644 --- a/logprint/log_print_trans.c +++ b/logprint/log_print_trans.c @@ -25,7 +25,7 @@ xlog_recover_print_trans_head( printf(_("TRANS: tid:0x%x type:%s #items:%d trans:0x%x q:0x%lx\n"), tr->r_log_tid, trans_type[tr->r_theader.th_type], tr->r_theader.th_num_items, - tr->r_theader.th_tid, (long)tr->r_itemq); + tr->r_theader.th_tid, (long)&tr->r_itemq); } int @@ -34,7 +34,7 @@ xlog_recover_do_trans( xlog_recover_t *trans, int pass) { - xlog_recover_print_trans(trans, trans->r_itemq, 3); + xlog_recover_print_trans(trans, &trans->r_itemq, 3); return 0; } -- 1.7.2.3 From SRS0+qjs8+44+fromorbit.com=dave@internode.on.net Mon Jan 10 02:43:59 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.9 required=5.0 tests=ADVANCE_FEE_3_NEW,BAYES_00, FORM_FRAUD_3,J_CHICKENPOX_102,J_CHICKENPOX_22,J_CHICKENPOX_25,J_CHICKENPOX_32, J_CHICKENPOX_41,J_CHICKENPOX_42,J_CHICKENPOX_43,J_CHICKENPOX_44, J_CHICKENPOX_45,J_CHICKENPOX_46,J_CHICKENPOX_47,J_CHICKENPOX_48, J_CHICKENPOX_53,J_CHICKENPOX_55,J_CHICKENPOX_57,J_CHICKENPOX_61, J_CHICKENPOX_62,J_CHICKENPOX_63,J_CHICKENPOX_64,J_CHICKENPOX_65, J_CHICKENPOX_66,J_CHICKENPOX_72,J_CHICKENPOX_74,J_CHICKENPOX_83, LOCAL_GNU_PATCH,TVD_PH_BODY_ACCOUNTS_PRE,T_FILL_THIS_FORM_SHORT 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 p0A8hwaU226437 for ; Mon, 10 Jan 2011 02:43:59 -0600 X-ASG-Debug-ID: 1294649145-317f020c0000-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 812F424E198 for ; Mon, 10 Jan 2011 00:45: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 ExMLelMcW8unKmB7 for ; Mon, 10 Jan 2011 00:45:45 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 40874021-1927428 for ; Mon, 10 Jan 2011 19:15:29 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcDNE-0004xA-2q for xfs@oss.sgi.com; Mon, 10 Jan 2011 19:45:08 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PcDN1-00075r-Cs for xfs@oss.sgi.com; Mon, 10 Jan 2011 19:44:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/3] libxfs: sync files with 2.6.38 kernel code Subject: [PATCH 3/3] libxfs: sync files with 2.6.38 kernel code Date: Mon, 10 Jan 2011 19:44:51 +1100 Message-Id: <1294649091-27174-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294649091-27174-1-git-send-email-david@fromorbit.com> References: <1294649091-27174-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1294649149 X-Barracuda-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.51955 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 Bring the libxfs headers and code into sync with the 2.6.37 kernel code. Update the rest of xfsprogs to work with the new code. Note: this does not convert xfsprogs to the kernel xfs_trans_ijoin\ijoin_ref interface, it maintains the older ijoin/ihold interface because of the different way the inode reference counting works in libxfs. More work will be needed to change it over to a manner compatible with the current kernel API. Note: log sector size handling needs to be sorted out. Specifically, initialising l_sectbb_log/l_sectBBsize correctly and removing the hacks in xlog_bread and friends (libxlog/xfs_log_recover.c) to work around the fact they are not initialised correctly. (FWIW, I don't think xfsprogs handles large log sector size correctly as a result, and especially not if the log device sector size is different to the data device sector size). Testing: Currently passes xfstests on x86_64 w/ 4k block sizes and 512 byte block/2k directory block filesystems. No obvious regressions are occurring during xfstests runs. Signed-off-by: Dave Chinner --- db/attr.c | 16 +- db/attrset.c | 5 +- db/bmap.c | 18 +- db/bmap.h | 4 +- db/check.c | 50 +- db/convert.c | 6 +- db/dir2sf.c | 6 +- db/field.c | 2 +- db/frag.c | 6 +- db/inode.c | 124 ++-- db/metadump.c | 20 +- include/libxfs.h | 26 +- include/xfs_ag.h | 100 ++- include/xfs_alloc.h | 58 +- include/xfs_arch.h | 32 - include/xfs_attr_leaf.h | 12 - include/xfs_attr_sf.h | 42 +- include/xfs_bit.h | 10 +- include/xfs_bmap.h | 133 ++-- include/xfs_bmap_btree.h | 20 +- include/xfs_btree.h | 31 +- include/xfs_btree_trace.h | 17 - include/xfs_da_btree.h | 21 +- include/xfs_dfrag.h | 5 +- include/xfs_dinode.h | 149 ++--- include/xfs_dir2.h | 4 +- include/xfs_dir2_data.h | 2 +- include/xfs_dir2_node.h | 2 - include/xfs_dir2_sf.h | 7 - include/xfs_fs.h | 30 +- include/xfs_ialloc.h | 30 +- include/xfs_ialloc_btree.h | 23 +- include/xfs_imap.h | 38 - include/xfs_inode.h | 210 +++--- include/xfs_inode_item.h | 30 +- include/xfs_inum.h | 1 - include/xfs_mount.h | 259 ++----- include/xfs_quota.h | 160 ++-- include/xfs_rtalloc.h | 19 +- include/xfs_sb.h | 168 +++-- include/xfs_trace.h | 76 ++ include/xfs_trans_space.h | 2 +- include/xfs_types.h | 16 +- libxfs/init.c | 133 +++- libxfs/logitem.c | 6 +- libxfs/trans.c | 2 +- libxfs/util.c | 75 +- libxfs/xfs.h | 37 +- libxfs/xfs_alloc.c | 599 ++++++++-------- libxfs/xfs_alloc_btree.c | 46 +- libxfs/xfs_attr.c | 138 ++-- libxfs/xfs_attr_leaf.c | 135 ++-- libxfs/xfs_bmap.c | 1773 ++++++++++++++++++++++---------------------- libxfs/xfs_bmap_btree.c | 129 ++-- libxfs/xfs_btree.c | 96 ++- libxfs/xfs_da_btree.c | 48 +- libxfs/xfs_dir2.c | 31 +- libxfs/xfs_dir2_block.c | 28 +- libxfs/xfs_dir2_leaf.c | 21 +- libxfs/xfs_dir2_node.c | 29 +- libxfs/xfs_dir2_sf.c | 24 +- libxfs/xfs_ialloc.c | 1157 +++++++++++++++-------------- libxfs/xfs_ialloc_btree.c | 35 +- libxfs/xfs_inode.c | 277 ++++---- libxfs/xfs_mount.c | 122 +--- logprint/log_misc.c | 2 +- mkfs/proto.c | 18 +- mkfs/xfs_mkfs.c | 3 +- repair/attr_repair.c | 14 +- repair/dino_chunks.c | 12 +- repair/dinode.c | 275 ++++---- repair/dir.c | 18 +- repair/dir2.c | 22 +- repair/incore.h | 3 + repair/phase6.c | 76 +- repair/prefetch.c | 29 +- repair/rt.c | 2 +- 77 files changed, 3587 insertions(+), 3818 deletions(-) delete mode 100644 include/xfs_imap.h diff --git a/db/attr.c b/db/attr.c index f15d408..74bf411 100644 --- a/db/attr.c +++ b/db/attr.c @@ -219,7 +219,7 @@ attr_leaf_name_local_name_count( e = &block->entries[i]; if (be16_to_cpu(e->nameidx) == off) { if (e->flags & XFS_ATTR_LOCAL) { - l = XFS_ATTR_LEAF_NAME_LOCAL(block, i); + l = xfs_attr_leaf_name_local(block, i); return l->namelen; } else return 0; @@ -248,7 +248,7 @@ attr_leaf_name_local_value_count( e = &block->entries[i]; if (be16_to_cpu(e->nameidx) == off) { if (e->flags & XFS_ATTR_LOCAL) { - l = XFS_ATTR_LEAF_NAME_LOCAL(block, i); + l = xfs_attr_leaf_name_local(block, i); return be16_to_cpu(l->valuelen); } else return 0; @@ -285,7 +285,7 @@ attr_leaf_name_local_value_offset( if (i >= be16_to_cpu(block->hdr.count)) return 0; - l = XFS_ATTR_LEAF_NAME_LOCAL(block, i); + l = xfs_attr_leaf_name_local(block, i); vp = (char *)&l->nameval[l->namelen]; return (int)bitize(vp - (char *)l); } @@ -333,7 +333,7 @@ attr_leaf_name_remote_name_count( e = &block->entries[i]; if (be16_to_cpu(e->nameidx) == off) { if (!(e->flags & XFS_ATTR_LOCAL)) { - r = XFS_ATTR_LEAF_NAME_REMOTE(block, i); + r = xfs_attr_leaf_name_remote(block, i); return r->namelen; } else return 0; @@ -360,12 +360,12 @@ attr_leaf_name_size( return 0; e = &block->entries[idx]; if (e->flags & XFS_ATTR_LOCAL) { - l = XFS_ATTR_LEAF_NAME_LOCAL(block, idx); - return (int)bitize(XFS_ATTR_LEAF_ENTSIZE_LOCAL(l->namelen, + l = xfs_attr_leaf_name_local(block, idx); + return (int)bitize(xfs_attr_leaf_entsize_local(l->namelen, be16_to_cpu(l->valuelen))); } else { - r = XFS_ATTR_LEAF_NAME_REMOTE(block, idx); - return (int)bitize(XFS_ATTR_LEAF_ENTSIZE_REMOTE(r->namelen)); + r = xfs_attr_leaf_name_remote(block, idx); + return (int)bitize(xfs_attr_leaf_entsize_remote(r->namelen)); } } diff --git a/db/attrset.c b/db/attrset.c index 35fea11..cbecbe9 100644 --- a/db/attrset.c +++ b/db/attrset.c @@ -158,7 +158,8 @@ attr_set_f( goto out; } - if (libxfs_attr_set(ip, name, value, valuelen, flags)) { + if (libxfs_attr_set(ip, (unsigned char *)name, + (unsigned char *)value, valuelen, flags)) { dbprintf(_("failed to set attr %s on inode %llu\n"), name, (unsigned long long)iocur_top->ino); goto out; @@ -233,7 +234,7 @@ attr_remove_f( goto out; } - if (libxfs_attr_remove(ip, name, flags)) { + if (libxfs_attr_remove(ip, (unsigned char *)name, flags)) { dbprintf(_("failed to remove attr %s from inode %llu\n"), name, (unsigned long long)iocur_top->ino); goto out; diff --git a/db/bmap.c b/db/bmap.c index 5abad68..ddad49c 100644 --- a/db/bmap.c +++ b/db/bmap.c @@ -29,7 +29,7 @@ #include "init.h" static int bmap_f(int argc, char **argv); -static int bmap_one_extent(xfs_bmbt_rec_64_t *ep, +static int bmap_one_extent(xfs_bmbt_rec_t *ep, xfs_dfiloff_t *offp, xfs_dfiloff_t eoff, int *idxp, bmap_ext_t *bep); static xfs_fsblock_t select_child(xfs_dfiloff_t off, xfs_bmbt_key_t *kp, @@ -52,7 +52,7 @@ bmap( xfs_dfiloff_t curoffset; xfs_dinode_t *dip; xfs_dfiloff_t eoffset; - xfs_bmbt_rec_64_t *ep; + xfs_bmbt_rec_t *ep; xfs_dinode_fmt_t fmt; int fsize; xfs_bmbt_key_t *kp; @@ -63,7 +63,7 @@ bmap( xfs_bmbt_ptr_t *pp; xfs_bmdr_block_t *rblock; typnm_t typ; - xfs_bmbt_rec_64_t *xp; + xfs_bmbt_rec_t *xp; push_cur(); set_cur_inode(iocur_top->ino); @@ -81,7 +81,7 @@ bmap( fmt == XFS_DINODE_FMT_BTREE); if (fmt == XFS_DINODE_FMT_EXTENTS) { nextents = XFS_DFORK_NEXTENTS(dip, whichfork); - xp = (xfs_bmbt_rec_64_t *)XFS_DFORK_PTR(dip, whichfork); + xp = (xfs_bmbt_rec_t *)XFS_DFORK_PTR(dip, whichfork); for (ep = xp; ep < &xp[nextents] && n < nex; ep++) { if (!bmap_one_extent(ep, &curoffset, eoffset, &n, bep)) break; @@ -110,7 +110,7 @@ bmap( for (;;) { nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib); nextents = be16_to_cpu(block->bb_numrecs); - xp = (xfs_bmbt_rec_64_t *) + xp = (xfs_bmbt_rec_t *) XFS_BMBT_REC_ADDR(mp, block, 1); for (ep = xp; ep < &xp[nextents] && n < nex; ep++) { if (!bmap_one_extent(ep, &curoffset, eoffset, @@ -171,9 +171,9 @@ bmap_f( push_cur(); set_cur_inode(iocur_top->ino); dip = iocur_top->data; - if (be32_to_cpu(dip->di_core.di_nextents)) + if (be32_to_cpu(dip->di_nextents)) dfork = 1; - if (be16_to_cpu(dip->di_core.di_anextents)) + if (be16_to_cpu(dip->di_anextents)) afork = 1; pop_cur(); } @@ -233,7 +233,7 @@ bmap_init(void) static int bmap_one_extent( - xfs_bmbt_rec_64_t *ep, + xfs_bmbt_rec_t *ep, xfs_dfiloff_t *offp, xfs_dfiloff_t eoff, int *idxp, @@ -271,7 +271,7 @@ bmap_one_extent( void convert_extent( - xfs_bmbt_rec_64_t *rp, + xfs_bmbt_rec_t *rp, xfs_dfiloff_t *op, xfs_dfsbno_t *sp, xfs_dfilblks_t *cp, diff --git a/db/bmap.h b/db/bmap.h index 878acc0..2895287 100644 --- a/db/bmap.h +++ b/db/bmap.h @@ -17,7 +17,7 @@ */ struct bbmap; -struct xfs_bmbt_rec_64; +struct xfs_bmbt_rec; typedef struct bmap_ext { xfs_dfiloff_t startoff; @@ -29,6 +29,6 @@ typedef struct bmap_ext { extern void bmap(xfs_dfiloff_t offset, xfs_dfilblks_t len, int whichfork, int *nexp, bmap_ext_t *bep); extern void bmap_init(void); -extern void convert_extent(struct xfs_bmbt_rec_64 *rp, xfs_dfiloff_t *op, +extern void convert_extent(struct xfs_bmbt_rec *rp, xfs_dfiloff_t *op, xfs_dfsbno_t *sp, xfs_dfilblks_t *cp, int *fp); extern void make_bbmap(struct bbmap *bbmap, int nex, bmap_ext_t *bmp); diff --git a/db/check.c b/db/check.c index a8939a4..e601e0a 100644 --- a/db/check.c +++ b/db/check.c @@ -2317,7 +2317,7 @@ process_data_dir_v2( tag_err += be16_to_cpu(*tagp) != (char *)dep - (char *)data; addr = xfs_dir2_db_off_to_dataptr(mp, db, (char *)dep - (char *)data); - xname.name = (char *)dep->name; + xname.name = dep->name; xname.len = dep->namelen; dir_hash_add(mp->m_dirnameops->hashname(&xname), addr); ptr += xfs_dir2_data_entsize(dep->namelen); @@ -2508,23 +2508,23 @@ process_dir_v1( inodata_t *id, xfs_ino_t *parent) { - xfs_fsize_t size = be64_to_cpu(dip->di_core.di_size); + xfs_fsize_t size = be64_to_cpu(dip->di_size); if (size <= XFS_DFORK_DSIZE(dip, mp) && - dip->di_core.di_format == XFS_DINODE_FMT_LOCAL) + dip->di_format == XFS_DINODE_FMT_LOCAL) *parent = process_shortform_dir_v1(dip, dot, dotdot, id); else if (size == XFS_LBSIZE(mp) && - (dip->di_core.di_format == XFS_DINODE_FMT_EXTENTS || - dip->di_core.di_format == XFS_DINODE_FMT_BTREE)) + (dip->di_format == XFS_DINODE_FMT_EXTENTS || + dip->di_format == XFS_DINODE_FMT_BTREE)) *parent = process_leaf_dir_v1(blkmap, dot, dotdot, id); else if (size >= XFS_LBSIZE(mp) && - (dip->di_core.di_format == XFS_DINODE_FMT_EXTENTS || - dip->di_core.di_format == XFS_DINODE_FMT_BTREE)) + (dip->di_format == XFS_DINODE_FMT_EXTENTS || + dip->di_format == XFS_DINODE_FMT_BTREE)) *parent = process_node_dir_v1(blkmap, dot, dotdot, id); else { dbprintf(_("bad size (%lld) or format (%d) for directory inode " "%lld\n"), - size, dip->di_core.di_format, id->ino); + size, dip->di_format, id->ino); error++; return 1; } @@ -2541,25 +2541,25 @@ process_dir_v2( xfs_ino_t *parent) { xfs_fileoff_t last = 0; - xfs_fsize_t size = be64_to_cpu(dip->di_core.di_size); + xfs_fsize_t size = be64_to_cpu(dip->di_size); if (blkmap) last = blkmap_last_off(blkmap); if (size <= XFS_DFORK_DSIZE(dip, mp) && - dip->di_core.di_format == XFS_DINODE_FMT_LOCAL) + dip->di_format == XFS_DINODE_FMT_LOCAL) *parent = process_sf_dir_v2(dip, dot, dotdot, id); else if (last == mp->m_dirblkfsbs && - (dip->di_core.di_format == XFS_DINODE_FMT_EXTENTS || - dip->di_core.di_format == XFS_DINODE_FMT_BTREE)) + (dip->di_format == XFS_DINODE_FMT_EXTENTS || + dip->di_format == XFS_DINODE_FMT_BTREE)) *parent = process_block_dir_v2(blkmap, dot, dotdot, id); else if (last >= mp->m_dirleafblk + mp->m_dirblkfsbs && - (dip->di_core.di_format == XFS_DINODE_FMT_EXTENTS || - dip->di_core.di_format == XFS_DINODE_FMT_BTREE)) + (dip->di_format == XFS_DINODE_FMT_EXTENTS || + dip->di_format == XFS_DINODE_FMT_BTREE)) *parent = process_leaf_node_dir_v2(blkmap, dot, dotdot, id, size); else { dbprintf(_("bad size (%lld) or format (%d) for directory inode " "%lld\n"), - size, dip->di_core.di_format, id->ino); + size, dip->di_format, id->ino); error++; return 1; } @@ -2646,7 +2646,7 @@ process_inode( "dev", "local", "extents", "btree", "uuid" }; - libxfs_dinode_from_disk(&idic, &dip->di_core); + libxfs_dinode_from_disk(&idic, dip); ino = XFS_AGINO_TO_INO(mp, be32_to_cpu(agf->agf_seqno), agino); if (!isfree) { @@ -2677,7 +2677,7 @@ process_inode( idic.di_nblocks, ino); error++; } - if (idic.di_version == XFS_DINODE_VERSION_1) + if (idic.di_version == 1) nlink = idic.di_onlink; else nlink = idic.di_nlink; @@ -2782,7 +2782,7 @@ process_inode( type = DBM_UNKNOWN; break; } - if (idic.di_version == XFS_DINODE_VERSION_1) + if (idic.di_version == 1) setlink_inode(id, idic.di_onlink, type == DBM_DIR, security); else { sbversion |= XFS_SB_VERSION_NLINKBIT; @@ -2910,12 +2910,12 @@ process_lclinode( xfs_fsblock_t bno; bno = XFS_INO_TO_FSB(mp, id->ino); - if (whichfork == XFS_DATA_FORK && be64_to_cpu(dip->di_core.di_size) > + if (whichfork == XFS_DATA_FORK && be64_to_cpu(dip->di_size) > XFS_DFORK_DSIZE(dip, mp)) { if (!sflag || id->ilist || CHECK_BLIST(bno)) dbprintf(_("local inode %lld data is too large (size " "%lld)\n"), - id->ino, be64_to_cpu(dip->di_core.di_size)); + id->ino, be64_to_cpu(dip->di_size)); error++; } else if (whichfork == XFS_ATTR_FORK) { @@ -3647,7 +3647,7 @@ process_sf_dir_v2( offset = XFS_DIR2_DATA_FIRST_OFFSET; for (i = sf->hdr.count - 1, i8 = 0; i >= 0; i--) { if ((__psint_t)sfe + xfs_dir2_sf_entsize_byentry(sf, sfe) - - (__psint_t)sf > be64_to_cpu(dip->di_core.di_size)) { + (__psint_t)sf > be64_to_cpu(dip->di_size)) { if (!sflag) dbprintf(_("dir %llu bad size in entry at %d\n"), id->ino, @@ -3689,10 +3689,10 @@ process_sf_dir_v2( sfe = xfs_dir2_sf_nextentry(sf, sfe); } if (i < 0 && (__psint_t)sfe - (__psint_t)sf != - be64_to_cpu(dip->di_core.di_size)) { + be64_to_cpu(dip->di_size)) { if (!sflag) dbprintf(_("dir %llu size is %lld, should be %u\n"), - id->ino, be64_to_cpu(dip->di_core.di_size), + id->ino, be64_to_cpu(dip->di_size), (uint)((char *)sfe - (char *)sf)); error++; } @@ -3769,9 +3769,9 @@ process_shortform_dir_v1( sfe->namelen, sfe->namelen, sfe->name, lino); sfe = xfs_dir_sf_nextentry(sfe); } - if ((__psint_t)sfe - (__psint_t)sf != be64_to_cpu(dip->di_core.di_size)) + if ((__psint_t)sfe - (__psint_t)sf != be64_to_cpu(dip->di_size)) dbprintf(_("dir %llu size is %lld, should be %d\n"), - id->ino, be64_to_cpu(dip->di_core.di_size), + id->ino, be64_to_cpu(dip->di_size), (int)((char *)sfe - (char *)sf)); lino = XFS_GET_DIR_INO8(sf->hdr.parent); cid = find_inode(lino, 1); diff --git a/db/convert.c b/db/convert.c index 070ac1a..1fa094b 100644 --- a/db/convert.c +++ b/db/convert.c @@ -210,14 +210,14 @@ convert_f(int argc, char **argv) } switch (wtype) { case CT_AGBLOCK: - v = XFS_DADDR_TO_AGBNO(mp, v >> BBSHIFT); + v = xfs_daddr_to_agbno(mp, v >> BBSHIFT); break; case CT_AGINO: v = (v >> mp->m_sb.sb_inodelog) % (mp->m_sb.sb_agblocks << mp->m_sb.sb_inopblog); break; case CT_AGNUMBER: - v = XFS_DADDR_TO_AGNO(mp, v >> BBSHIFT); + v = xfs_daddr_to_agno(mp, v >> BBSHIFT); break; case CT_BBOFF: v &= BBMASK; @@ -234,7 +234,7 @@ convert_f(int argc, char **argv) v = XFS_DADDR_TO_FSB(mp, v >> BBSHIFT); break; case CT_INO: - v = XFS_AGINO_TO_INO(mp, XFS_DADDR_TO_AGNO(mp, v >> BBSHIFT), + v = XFS_AGINO_TO_INO(mp, xfs_daddr_to_agno(mp, v >> BBSHIFT), (v >> mp->m_sb.sb_inodelog) % (mp->m_sb.sb_agblocks << mp->m_sb.sb_inopblog)); break; diff --git a/db/dir2sf.c b/db/dir2sf.c index 426ad16..b2db088 100644 --- a/db/dir2sf.c +++ b/db/dir2sf.c @@ -76,7 +76,7 @@ dir2_inou_i4_count( xfs_dir2_sf_t *sf; ASSERT(bitoffs(startoff) == 0); - sf = &((xfs_dinode_t *)obj)->di_u.di_dir2sf; + sf = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(obj); return sf->hdr.i8count == 0; } @@ -89,7 +89,7 @@ dir2_inou_i8_count( xfs_dir2_sf_t *sf; ASSERT(bitoffs(startoff) == 0); - sf = &((xfs_dinode_t *)obj)->di_u.di_dir2sf; + sf = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(obj); return sf->hdr.i8count != 0; } @@ -104,7 +104,7 @@ dir2_inou_size( ASSERT(bitoffs(startoff) == 0); ASSERT(idx == 0); - sf = &((xfs_dinode_t *)obj)->di_u.di_dir2sf; + sf = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(obj); return bitize(sf->hdr.i8count ? (uint)sizeof(xfs_dir2_ino8_t) : (uint)sizeof(xfs_dir2_ino4_t)); diff --git a/db/field.c b/db/field.c index 5cf97e1..6903898 100644 --- a/db/field.c +++ b/db/field.c @@ -151,7 +151,7 @@ const ftattr_t ftattrtab[] = { { FLDT_DINODE_A, "dinode_a", NULL, (char *)inode_a_flds, inode_a_size, FTARG_SIZE|FTARG_OKEMPTY, NULL, inode_a_flds }, { FLDT_DINODE_CORE, "dinode_core", NULL, (char *)inode_core_flds, - SI(bitsz(xfs_dinode_core_t)), 0, NULL, inode_core_flds }, + SI(bitsz(xfs_dinode_t)), 0, NULL, inode_core_flds }, { FLDT_DINODE_FMT, "dinode_fmt", fp_dinode_fmt, NULL, SI(bitsz(__int8_t)), 0, NULL, NULL }, { FLDT_DINODE_U, "dinode_u", NULL, (char *)inode_u_flds, inode_u_size, diff --git a/db/frag.c b/db/frag.c index 305bef1..23ccfa5 100644 --- a/db/frag.c +++ b/db/frag.c @@ -307,20 +307,18 @@ process_inode( xfs_dinode_t *dip) { __uint64_t actual; - xfs_dinode_core_t *dic; __uint64_t ideal; xfs_ino_t ino; int skipa; int skipd; - dic = &dip->di_core; ino = XFS_AGINO_TO_INO(mp, be32_to_cpu(agf->agf_seqno), agino); - switch (be16_to_cpu(dic->di_mode) & S_IFMT) { + switch (be16_to_cpu(dip->di_mode) & S_IFMT) { case S_IFDIR: skipd = !dflag; break; case S_IFREG: - if (!rflag && (be16_to_cpu(dic->di_flags) & XFS_DIFLAG_REALTIME)) + if (!rflag && (be16_to_cpu(dip->di_flags) & XFS_DIFLAG_REALTIME)) skipd = 1; else if (!Rflag && (ino == mp->m_sb.sb_rbmino || diff --git a/db/inode.c b/db/inode.c index 6f8592a..bd08d80 100644 --- a/db/inode.c +++ b/db/inode.c @@ -40,6 +40,7 @@ static int inode_core_onlink_count(void *obj, int startoff); static int inode_core_projid_count(void *obj, int startoff); static int inode_core_nlinkv1_count(void *obj, int startoff); static int inode_f(int argc, char **argv); +static int inode_u_offset(void *obj, int startoff, int idx); static int inode_u_bmbt_count(void *obj, int startoff); static int inode_u_bmx_count(void *obj, int startoff); static int inode_u_c_count(void *obj, int startoff); @@ -58,18 +59,17 @@ const field_t inode_hfld[] = { { NULL } }; +/* XXX: fix this up! */ #define OFF(f) bitize(offsetof(xfs_dinode_t, di_ ## f)) const field_t inode_flds[] = { - { "core", FLDT_DINODE_CORE, OI(OFF(core)), C1, 0, TYP_NONE }, - { "next_unlinked", FLDT_AGINO, OI(OFF(next_unlinked)), C1, 0, - TYP_INODE }, - { "u", FLDT_DINODE_U, OI(OFF(u)), C1, 0, TYP_NONE }, + { "core", FLDT_DINODE_CORE, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "u", FLDT_DINODE_U, inode_u_offset, C1, FLD_OFFSET, TYP_NONE }, { "a", FLDT_DINODE_A, inode_a_offset, inode_a_count, FLD_COUNT|FLD_OFFSET, TYP_NONE }, { NULL } }; -#define COFF(f) bitize(offsetof(xfs_dinode_core_t, di_ ## f)) +#define COFF(f) bitize(offsetof(xfs_dinode_t, di_ ## f)) const field_t inode_core_flds[] = { { "magic", FLDT_UINT16X, OI(COFF(magic)), C1, 0, TYP_NONE }, { "mode", FLDT_UINT16O, OI(COFF(mode)), C1, 0, TYP_NONE }, @@ -147,6 +147,8 @@ const field_t inode_core_flds[] = { OI(COFF(flags) + bitsz(__uint16_t) - XFS_DIFLAG_FILESTREAM_BIT-1),C1, 0, TYP_NONE }, { "gen", FLDT_UINT32D, OI(COFF(gen)), C1, 0, TYP_NONE }, + { "next_unlinked", FLDT_AGINO, OI(OFF(next_unlinked)), C1, 0, + TYP_INODE }, { NULL } }; @@ -228,7 +230,7 @@ inode_a_bmbt_count( if (!XFS_DFORK_Q(dip)) return 0; ASSERT((char *)XFS_DFORK_APTR(dip) - (char *)dip == byteize(startoff)); - return dip->di_core.di_aformat == XFS_DINODE_FMT_BTREE; + return dip->di_aformat == XFS_DINODE_FMT_BTREE; } static int @@ -244,8 +246,8 @@ inode_a_bmx_count( if (!XFS_DFORK_Q(dip)) return 0; ASSERT((char *)XFS_DFORK_APTR(dip) - (char *)dip == byteize(startoff)); - return dip->di_core.di_aformat == XFS_DINODE_FMT_EXTENTS ? - be16_to_cpu(dip->di_core.di_anextents) : 0; + return dip->di_aformat == XFS_DINODE_FMT_EXTENTS ? + be16_to_cpu(dip->di_anextents) : 0; } static int @@ -288,7 +290,7 @@ inode_a_sfattr_count( if (!XFS_DFORK_Q(dip)) return 0; ASSERT((char *)XFS_DFORK_APTR(dip) - (char *)dip == byteize(startoff)); - return dip->di_core.di_aformat == XFS_DINODE_FMT_LOCAL; + return dip->di_aformat == XFS_DINODE_FMT_LOCAL; } int @@ -303,12 +305,12 @@ inode_a_size( ASSERT(startoff == 0); ASSERT(idx == 0); dip = obj; - switch (dip->di_core.di_aformat) { + switch (dip->di_aformat) { case XFS_DINODE_FMT_LOCAL: asf = (xfs_attr_shortform_t *)XFS_DFORK_APTR(dip); return bitize(be16_to_cpu(asf->hdr.totsize)); case XFS_DINODE_FMT_EXTENTS: - return (int)be16_to_cpu(dip->di_core.di_anextents) * + return (int)be16_to_cpu(dip->di_anextents) * bitsz(xfs_bmbt_rec_t); case XFS_DINODE_FMT_BTREE: return bitize((int)XFS_DFORK_ASIZE(dip, mp)); @@ -319,54 +321,54 @@ inode_a_size( static int inode_core_nlinkv1_count( - void *obj, - int startoff) + void *obj, + int startoff) { - xfs_dinode_core_t *dic; + xfs_dinode_t *dic; ASSERT(startoff == 0); ASSERT(obj == iocur_top->data); dic = obj; - return dic->di_version == XFS_DINODE_VERSION_1; + return dic->di_version == 1; } static int inode_core_nlinkv2_count( - void *obj, - int startoff) + void *obj, + int startoff) { - xfs_dinode_core_t *dic; + xfs_dinode_t *dic; ASSERT(startoff == 0); ASSERT(obj == iocur_top->data); dic = obj; - return dic->di_version == XFS_DINODE_VERSION_2; + return dic->di_version == 2; } static int inode_core_onlink_count( - void *obj, - int startoff) + void *obj, + int startoff) { - xfs_dinode_core_t *dic; + xfs_dinode_t *dic; ASSERT(startoff == 0); ASSERT(obj == iocur_top->data); dic = obj; - return dic->di_version == XFS_DINODE_VERSION_2; + return dic->di_version == 2; } static int inode_core_projid_count( - void *obj, - int startoff) + void *obj, + int startoff) { - xfs_dinode_core_t *dic; + xfs_dinode_t *dic; ASSERT(startoff == 0); ASSERT(obj == iocur_top->data); dic = obj; - return dic->di_version == XFS_DINODE_VERSION_2; + return dic->di_version == 2; } static int @@ -430,6 +432,20 @@ inode_size( } static int +inode_u_offset( + void *obj, + int startoff, + int idx) +{ + xfs_dinode_t *dip; + + ASSERT(startoff == 0); + ASSERT(idx == 0); + dip = obj; + return bitize((int)((char *)XFS_DFORK_DPTR(dip) - (char *)dip)); +} + +static int inode_u_bmbt_count( void *obj, int startoff) @@ -439,8 +455,8 @@ inode_u_bmbt_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_BTREE; + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_BTREE; } static int @@ -453,9 +469,9 @@ inode_u_bmx_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_EXTENTS ? - be32_to_cpu(dip->di_core.di_nextents) : 0; + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_EXTENTS ? + be32_to_cpu(dip->di_nextents) : 0; } static int @@ -468,10 +484,10 @@ inode_u_c_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_LOCAL && - (be16_to_cpu(dip->di_core.di_mode) & S_IFMT) == S_IFREG ? - (int)be64_to_cpu(dip->di_core.di_size) : 0; + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_LOCAL && + (be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFREG ? + (int)be64_to_cpu(dip->di_size) : 0; } static int @@ -484,8 +500,8 @@ inode_u_dev_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_DEV; + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_DEV; } static int @@ -498,8 +514,8 @@ inode_u_muuid_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_UUID; + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_UUID; } static int @@ -512,9 +528,9 @@ inode_u_sfdir_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_LOCAL && - (be16_to_cpu(dip->di_core.di_mode) & S_IFMT) == S_IFDIR + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_LOCAL && + (be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFDIR && !xfs_sb_version_hasdirv2(&mp->m_sb); } @@ -528,9 +544,9 @@ inode_u_sfdir2_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_LOCAL && - (be16_to_cpu(dip->di_core.di_mode) & S_IFMT) == S_IFDIR && + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_LOCAL && + (be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFDIR && xfs_sb_version_hasdirv2(&mp->m_sb); } @@ -545,13 +561,13 @@ inode_u_size( ASSERT(startoff == 0); ASSERT(idx == 0); dip = obj; - switch (dip->di_core.di_format) { + switch (dip->di_format) { case XFS_DINODE_FMT_DEV: return bitsz(xfs_dev_t); case XFS_DINODE_FMT_LOCAL: - return bitize((int)be64_to_cpu(dip->di_core.di_size)); + return bitize((int)be64_to_cpu(dip->di_size)); case XFS_DINODE_FMT_EXTENTS: - return (int)be32_to_cpu(dip->di_core.di_nextents) * + return (int)be32_to_cpu(dip->di_nextents) * bitsz(xfs_bmbt_rec_t); case XFS_DINODE_FMT_BTREE: return bitize((int)XFS_DFORK_DSIZE(dip, mp)); @@ -572,10 +588,10 @@ inode_u_symlink_count( ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); dip = obj; - ASSERT((char *)&dip->di_u - (char *)dip == byteize(startoff)); - return dip->di_core.di_format == XFS_DINODE_FMT_LOCAL && - (be16_to_cpu(dip->di_core.di_mode) & S_IFMT) == S_IFLNK ? - (int)be64_to_cpu(dip->di_core.di_size) : 0; + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_LOCAL && + (be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFLNK ? + (int)be64_to_cpu(dip->di_size) : 0; } void @@ -611,7 +627,7 @@ set_cur_inode( off_cur(offset << mp->m_sb.sb_inodelog, mp->m_sb.sb_inodesize); dip = iocur_top->data; iocur_top->ino = ino; - iocur_top->mode = be16_to_cpu(dip->di_core.di_mode); + iocur_top->mode = be16_to_cpu(dip->di_mode); if ((iocur_top->mode & S_IFMT) == S_IFDIR) iocur_top->dirino = ino; diff --git a/db/metadump.c b/db/metadump.c index ef6e571..884d338 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -502,8 +502,8 @@ obfuscate_sf_dir( __uint64_t ino_dir_size; int i; - sfp = &dip->di_u.di_dir2sf; - ino_dir_size = be64_to_cpu(dip->di_core.di_size); + sfp = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); + ino_dir_size = be64_to_cpu(dip->di_size); if (ino_dir_size > XFS_DFORK_DSIZE(dip, mp)) { ino_dir_size = XFS_DFORK_DSIZE(dip, mp); if (show_warnings) @@ -555,8 +555,9 @@ obfuscate_sf_symlink( xfs_dinode_t *dip) { __uint64_t len; + char *buf; - len = be64_to_cpu(dip->di_core.di_size); + len = be64_to_cpu(dip->di_size); if (len > XFS_DFORK_DSIZE(dip, mp)) { if (show_warnings) print_warning("invalid size (%d) in symlink inode %llu", @@ -564,8 +565,9 @@ obfuscate_sf_symlink( len = XFS_DFORK_DSIZE(dip, mp); } + buf = (char *)XFS_DFORK_DPTR(dip); while (len > 0) - dip->di_u.di_symlink[--len] = random() % 127 + 1; + buf[--len] = random() % 127 + 1; } static void @@ -841,7 +843,7 @@ obfuscate_attr_blocks( break; } if (entry->flags & XFS_ATTR_LOCAL) { - local = XFS_ATTR_LEAF_NAME_LOCAL(leaf, i); + local = xfs_attr_leaf_name_local(leaf, i); if (local->namelen == 0) { if (show_warnings) print_warning("zero length for " @@ -854,7 +856,7 @@ obfuscate_attr_blocks( memset(&local->nameval[local->namelen], 0, be16_to_cpu(local->valuelen)); } else { - remote = XFS_ATTR_LEAF_NAME_REMOTE(leaf, i); + remote = xfs_attr_leaf_name_remote(leaf, i); if (remote->namelen == 0 || remote->valueblk == 0) { if (show_warnings) @@ -1143,7 +1145,7 @@ process_inode_data( xfs_dinode_t *dip, typnm_t itype) { - switch (dip->di_core.di_format) { + switch (dip->di_format) { case XFS_DINODE_FMT_LOCAL: if (!dont_obfuscate) switch (itype) { @@ -1180,7 +1182,7 @@ process_inode( cur_ino = XFS_AGINO_TO_INO(mp, agno, agino); /* copy appropriate data fork metadata */ - switch (be16_to_cpu(dip->di_core.di_mode) & S_IFMT) { + switch (be16_to_cpu(dip->di_mode) & S_IFMT) { case S_IFDIR: memset(&dir_data, 0, sizeof(dir_data)); success = process_inode_data(dip, TYP_DIR2); @@ -1198,7 +1200,7 @@ process_inode( /* copy extended attributes if they exist and forkoff is valid */ if (success && XFS_DFORK_DSIZE(dip, mp) < XFS_LITINO(mp)) { attr_data.remote_val_count = 0; - switch (dip->di_core.di_aformat) { + switch (dip->di_aformat) { case XFS_DINODE_FMT_LOCAL: if (!dont_obfuscate) obfuscate_sf_attr(dip); diff --git a/include/libxfs.h b/include/libxfs.h index 69b24ac..ba5f286 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -172,7 +172,7 @@ typedef struct xfs_mount { uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */ uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ uint m_in_maxlevels; /* XFS_IN_MAXLEVELS */ - xfs_perag_t *m_perag; /* per-ag accounting info */ + struct radix_tree_root m_perag_tree; uint m_flags; /* global mount flags */ uint m_qflags; /* quota status flags */ uint m_attroffset; /* inode attribute offset */ @@ -380,6 +380,7 @@ extern int libxfs_trans_iget (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, extern void libxfs_trans_iput(xfs_trans_t *, struct xfs_inode *, uint); extern void libxfs_trans_ijoin (xfs_trans_t *, struct xfs_inode *, uint); extern void libxfs_trans_ihold (xfs_trans_t *, struct xfs_inode *); +extern void libxfs_trans_ijoin_ref(xfs_trans_t *, struct xfs_inode *, int); extern void libxfs_trans_log_inode (xfs_trans_t *, struct xfs_inode *, uint); @@ -402,10 +403,8 @@ typedef struct xfs_inode { struct cache_node i_node; xfs_mount_t *i_mount; /* fs mount struct ptr */ xfs_ino_t i_ino; /* inode number (agno/agino) */ - xfs_daddr_t i_blkno; /* blkno of inode buffer */ + struct xfs_imap i_imap; /* location for xfs_imap() */ dev_t i_dev; /* dev for this inode */ - ushort i_len; /* len of inode buffer */ - ushort i_boffset; /* off of inode in buffer */ xfs_ifork_t *i_afp; /* attribute fork pointer */ xfs_ifork_t i_df; /* data fork */ xfs_trans_t *i_transp; /* ptr to owning transaction */ @@ -430,7 +429,8 @@ extern int libxfs_inode_alloc (xfs_trans_t **, xfs_inode_t *, mode_t, struct fsxattr *, xfs_inode_t **); extern void libxfs_trans_inode_alloc_buf (xfs_trans_t *, xfs_buf_t *); -extern void libxfs_ichgtime (xfs_inode_t *, int); +extern void libxfs_trans_ichgtime(struct xfs_trans *, + struct xfs_inode *, int); extern int libxfs_iflush_int (xfs_inode_t *, xfs_buf_t *); extern int libxfs_iread (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, xfs_inode_t *, xfs_daddr_t); @@ -443,6 +443,9 @@ extern int libxfs_iget (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, uint, xfs_inode_t **, xfs_daddr_t); extern void libxfs_iput (xfs_inode_t *, uint); +extern int xfs_imap_to_bp(xfs_mount_t *mp, xfs_trans_t *tp, struct xfs_imap *imap, + xfs_buf_t **bpp, uint buf_flags, uint iget_flags); + #include /* dirv1 support in db & repair */ #include #include @@ -478,12 +481,14 @@ extern unsigned long libxfs_physmem(void); /* in kilobytes */ #include #include #include -#include #include #include +#define XFS_INOBT_CLR_FREE(rp,i) ((rp)->ir_free &= ~XFS_INOBT_MASK(i)) +#define XFS_INOBT_SET_FREE(rp,i) ((rp)->ir_free |= XFS_INOBT_MASK(i)) #define XFS_INOBT_IS_FREE_DISK(rp,i) \ ((be64_to_cpu((rp)->ir_free) & XFS_INOBT_MASK(i)) != 0) + /* * public xfs kernel routines to be called as libxfs_* */ @@ -492,14 +497,17 @@ extern unsigned long libxfs_physmem(void); /* in kilobytes */ int libxfs_alloc_fix_freelist(xfs_alloc_arg_t *, int); /* xfs_attr.c */ -int libxfs_attr_get(struct xfs_inode *, const char *, char *, int *, int); -int libxfs_attr_set(struct xfs_inode *, const char *, char *, int, int); -int libxfs_attr_remove(struct xfs_inode *, const char *, int); +int libxfs_attr_get(struct xfs_inode *, const unsigned char *, + unsigned char *, int *, int); +int libxfs_attr_set(struct xfs_inode *, const unsigned char *, + unsigned char *, int, int); +int libxfs_attr_remove(struct xfs_inode *, const unsigned char *, int); /* xfs_bmap.c */ xfs_bmbt_rec_host_t *xfs_bmap_search_extents(xfs_inode_t *, xfs_fileoff_t, int, int *, xfs_extnum_t *, xfs_bmbt_irec_t *, xfs_bmbt_irec_t *); +void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); /* xfs_attr_leaf.h */ #define libxfs_attr_leaf_newentsize xfs_attr_leaf_newentsize diff --git a/include/xfs_ag.h b/include/xfs_ag.h index 729ee3e..5adce91 100644 --- a/include/xfs_ag.h +++ b/include/xfs_ag.h @@ -86,11 +86,27 @@ typedef struct xfs_agf { #define XFS_AGF_NUM_BITS 12 #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) +#define XFS_AGF_FLAGS \ + { XFS_AGF_MAGICNUM, "MAGICNUM" }, \ + { XFS_AGF_VERSIONNUM, "VERSIONNUM" }, \ + { XFS_AGF_SEQNO, "SEQNO" }, \ + { XFS_AGF_LENGTH, "LENGTH" }, \ + { XFS_AGF_ROOTS, "ROOTS" }, \ + { XFS_AGF_LEVELS, "LEVELS" }, \ + { XFS_AGF_FLFIRST, "FLFIRST" }, \ + { XFS_AGF_FLLAST, "FLLAST" }, \ + { XFS_AGF_FLCOUNT, "FLCOUNT" }, \ + { XFS_AGF_FREEBLKS, "FREEBLKS" }, \ + { XFS_AGF_LONGEST, "LONGEST" }, \ + { XFS_AGF_BTREEBLKS, "BTREEBLKS" } + /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) #define XFS_AGF_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp)) #define XFS_BUF_TO_AGF(bp) ((xfs_agf_t *)XFS_BUF_PTR(bp)) +extern int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_agnumber_t agno, int flags, struct xfs_buf **bpp); /* * Size of the unlinked inode hash table in the agi. @@ -142,6 +158,9 @@ typedef struct xfs_agi { #define XFS_AGI_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGI_DADDR(mp)) #define XFS_BUF_TO_AGI(bp) ((xfs_agi_t *)XFS_BUF_PTR(bp)) +extern int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_agnumber_t agno, struct xfs_buf **bpp); + /* * The third a.g. block contains the a.g. freelist, an array * of block pointers to blocks owned by the allocation btree code. @@ -156,29 +175,33 @@ typedef struct xfs_agfl { } xfs_agfl_t; /* - * Busy block/extent entry. Used in perag to mark blocks that have been freed - * but whose transactions aren't committed to disk yet. + * Busy block/extent entry. Indexed by a rbtree in perag to mark blocks that + * have been freed but whose transactions aren't committed to disk yet. + * + * Note that we use the transaction ID to record the transaction, not the + * transaction structure itself. See xfs_alloc_busy_insert() for details. */ -typedef struct xfs_perag_busy { - xfs_agblock_t busy_start; - xfs_extlen_t busy_length; - struct xfs_trans *busy_tp; /* transaction that did the free */ -} xfs_perag_busy_t; +struct xfs_busy_extent { +#ifdef __KERNEL__ + struct rb_node rb_node; /* ag by-bno indexed search tree */ +#endif + struct list_head list; /* transaction busy extent list */ + xfs_agnumber_t agno; + xfs_agblock_t bno; + xfs_extlen_t length; + xlog_tid_t tid; /* transaction that created this */ +}; /* * Per-ag incore structure, copies of information in agf and agi, * to improve the performance of allocation group selection. - * - * pick sizes which fit in allocation buckets well */ -#if (BITS_PER_LONG == 32) -#define XFS_PAGB_NUM_SLOTS 84 -#elif (BITS_PER_LONG == 64) #define XFS_PAGB_NUM_SLOTS 128 -#endif -typedef struct xfs_perag -{ +typedef struct xfs_perag { + struct xfs_mount *pag_mount; /* owner filesystem */ + xfs_agnumber_t pag_agno; /* AG this structure belongs to */ + atomic_t pag_ref; /* perag reference count */ char pagf_init; /* this agf's entry is initialized */ char pagi_init; /* this agi's entry is initialized */ char pagf_metadata; /* the agf is preferred to be metadata */ @@ -191,19 +214,44 @@ typedef struct xfs_perag __uint32_t pagf_btreeblks; /* # of blocks held in AGF btrees */ xfs_agino_t pagi_freecount; /* number of free inodes */ xfs_agino_t pagi_count; /* number of allocated inodes */ - int pagb_count; /* pagb slots in use */ - xfs_perag_busy_t *pagb_list; /* unstable blocks */ + + /* + * Inode allocation search lookup optimisation. + * If the pagino matches, the search for new inodes + * doesn't need to search the near ones again straight away + */ + xfs_agino_t pagl_pagino; + xfs_agino_t pagl_leftrec; + xfs_agino_t pagl_rightrec; #ifdef __KERNEL__ - spinlock_t pagb_lock; /* lock for pagb_list */ + spinlock_t pagb_lock; /* lock for pagb_tree */ + struct rb_root pagb_tree; /* ordered tree of busy extents */ atomic_t pagf_fstrms; /* # of filestreams active in this AG */ - int pag_ici_init; /* incore inode cache initialised */ - 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 */ + unsigned long pag_ici_reclaim_cursor; /* reclaim restart point */ + + /* buffer cache index */ + spinlock_t pag_buf_lock; /* lock for pag_buf_tree */ + struct rb_root pag_buf_tree; /* ordered tree of active buffers */ + + /* for rcu-safe freeing */ + struct rcu_head rcu_head; #endif + int pagb_count; /* pagb slots in use */ } xfs_perag_t; +/* + * tags for inode radix tree + */ +#define XFS_ICI_NO_TAG (-1) /* special flag for an untagged lookup + in xfs_inode_ag_iterator */ +#define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */ + #define XFS_AG_MAXLEVELS(mp) ((mp)->m_ag_maxlevels) #define XFS_MIN_FREELIST_RAW(bl,cl,mp) \ (MIN(bl + 1, XFS_AG_MAXLEVELS(mp)) + MIN(cl + 1, XFS_AG_MAXLEVELS(mp))) @@ -213,15 +261,15 @@ typedef struct xfs_perag be32_to_cpu((a)->agf_levels[XFS_BTNUM_CNTi]), mp)) #define XFS_MIN_FREELIST_PAG(pag,mp) \ (XFS_MIN_FREELIST_RAW( \ - (uint_t)(pag)->pagf_levels[XFS_BTNUM_BNOi], \ - (uint_t)(pag)->pagf_levels[XFS_BTNUM_CNTi], mp)) + (unsigned int)(pag)->pagf_levels[XFS_BTNUM_BNOi], \ + (unsigned int)(pag)->pagf_levels[XFS_BTNUM_CNTi], mp)) #define XFS_AGB_TO_FSB(mp,agno,agbno) \ (((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno)) #define XFS_FSB_TO_AGNO(mp,fsbno) \ ((xfs_agnumber_t)((fsbno) >> (mp)->m_sb.sb_agblklog)) #define XFS_FSB_TO_AGBNO(mp,fsbno) \ - ((xfs_agblock_t)((fsbno) & XFS_MASK32LO((mp)->m_sb.sb_agblklog))) + ((xfs_agblock_t)((fsbno) & xfs_mask32lo((mp)->m_sb.sb_agblklog))) #define XFS_AGB_TO_DADDR(mp,agno,agbno) \ ((xfs_daddr_t)XFS_FSB_TO_BB(mp, \ (xfs_fsblock_t)(agno) * (mp)->m_sb.sb_agblocks + (agbno))) @@ -234,8 +282,8 @@ typedef struct xfs_perag #define XFS_AG_CHECK_DADDR(mp,d,len) \ ((len) == 1 ? \ ASSERT((d) == XFS_SB_DADDR || \ - XFS_DADDR_TO_AGBNO(mp, d) != XFS_SB_DADDR) : \ - ASSERT(XFS_DADDR_TO_AGNO(mp, d) == \ - XFS_DADDR_TO_AGNO(mp, (d) + (len) - 1))) + xfs_daddr_to_agbno(mp, d) != XFS_SB_DADDR) : \ + ASSERT(xfs_daddr_to_agno(mp, d) == \ + xfs_daddr_to_agno(mp, (d) + (len) - 1))) #endif /* __XFS_AG_H__ */ diff --git a/include/xfs_alloc.h b/include/xfs_alloc.h index 5881727..895009a 100644 --- a/include/xfs_alloc.h +++ b/include/xfs_alloc.h @@ -22,20 +22,30 @@ struct xfs_buf; struct xfs_mount; struct xfs_perag; struct xfs_trans; +struct xfs_busy_extent; /* * Freespace allocation types. Argument to xfs_alloc_[v]extent. */ -typedef enum xfs_alloctype -{ - XFS_ALLOCTYPE_ANY_AG, /* allocate anywhere, use rotor */ - XFS_ALLOCTYPE_FIRST_AG, /* ... start at ag 0 */ - XFS_ALLOCTYPE_START_AG, /* anywhere, start in this a.g. */ - XFS_ALLOCTYPE_THIS_AG, /* anywhere in this a.g. */ - XFS_ALLOCTYPE_START_BNO, /* near this block else anywhere */ - XFS_ALLOCTYPE_NEAR_BNO, /* in this a.g. and near this block */ - XFS_ALLOCTYPE_THIS_BNO /* at exactly this block */ -} xfs_alloctype_t; +#define XFS_ALLOCTYPE_ANY_AG 0x01 /* allocate anywhere, use rotor */ +#define XFS_ALLOCTYPE_FIRST_AG 0x02 /* ... start at ag 0 */ +#define XFS_ALLOCTYPE_START_AG 0x04 /* anywhere, start in this a.g. */ +#define XFS_ALLOCTYPE_THIS_AG 0x08 /* anywhere in this a.g. */ +#define XFS_ALLOCTYPE_START_BNO 0x10 /* near this block else anywhere */ +#define XFS_ALLOCTYPE_NEAR_BNO 0x20 /* in this a.g. and near this block */ +#define XFS_ALLOCTYPE_THIS_BNO 0x40 /* at exactly this block */ + +/* this should become an enum again when the tracing code is fixed */ +typedef unsigned int xfs_alloctype_t; + +#define XFS_ALLOC_TYPES \ + { XFS_ALLOCTYPE_ANY_AG, "ANY_AG" }, \ + { XFS_ALLOCTYPE_FIRST_AG, "FIRST_AG" }, \ + { XFS_ALLOCTYPE_START_AG, "START_AG" }, \ + { XFS_ALLOCTYPE_THIS_AG, "THIS_AG" }, \ + { XFS_ALLOCTYPE_START_BNO, "START_BNO" }, \ + { XFS_ALLOCTYPE_NEAR_BNO, "NEAR_BNO" }, \ + { XFS_ALLOCTYPE_THIS_BNO, "THIS_BNO" } /* * Flags for xfs_alloc_fix_freelist. @@ -100,37 +110,23 @@ typedef struct xfs_alloc_arg { #define XFS_ALLOC_USERDATA 1 /* allocation is for user data*/ #define XFS_ALLOC_INITIAL_USER_DATA 2 /* special case start of file */ - -#ifdef __KERNEL__ - -#if defined(XFS_ALLOC_TRACE) /* - * Allocation tracing buffer size. + * Find the length of the longest extent in an AG. */ -#define XFS_ALLOC_TRACE_SIZE 4096 -extern ktrace_t *xfs_alloc_trace_buf; +xfs_extlen_t +xfs_alloc_longest_free_extent(struct xfs_mount *mp, + struct xfs_perag *pag); -/* - * Types for alloc tracing. - */ -#define XFS_ALLOC_KTRACE_ALLOC 1 -#define XFS_ALLOC_KTRACE_FREE 2 -#define XFS_ALLOC_KTRACE_MODAGF 3 -#define XFS_ALLOC_KTRACE_BUSY 4 -#define XFS_ALLOC_KTRACE_UNBUSY 5 -#define XFS_ALLOC_KTRACE_BUSYSEARCH 6 -#endif +#ifdef __KERNEL__ void -xfs_alloc_mark_busy(xfs_trans_t *tp, +xfs_alloc_busy_insert(xfs_trans_t *tp, xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len); void -xfs_alloc_clear_busy(xfs_trans_t *tp, - xfs_agnumber_t ag, - int idx); +xfs_alloc_busy_clear(struct xfs_mount *mp, struct xfs_busy_extent *busyp); #endif /* __KERNEL__ */ diff --git a/include/xfs_arch.h b/include/xfs_arch.h index 53d5e70..0902249 100644 --- a/include/xfs_arch.h +++ b/include/xfs_arch.h @@ -73,28 +73,6 @@ static inline void be64_add_cpu(__be64 *a, __s64 b) #endif /* __KERNEL__ */ -/* do we need conversion? */ -#define ARCH_NOCONVERT 1 -#ifdef XFS_NATIVE_HOST -# define ARCH_CONVERT ARCH_NOCONVERT -#else -# define ARCH_CONVERT 0 -#endif - -/* generic swapping macros */ - -#ifndef HAVE_SWABMACROS -#define INT_SWAP16(type,var) ((typeof(type))(__swab16((__u16)(var)))) -#define INT_SWAP32(type,var) ((typeof(type))(__swab32((__u32)(var)))) -#define INT_SWAP64(type,var) ((typeof(type))(__swab64((__u64)(var)))) -#endif - -#define INT_SWAP(type, var) \ - ((sizeof(type) == 8) ? INT_SWAP64(type,var) : \ - ((sizeof(type) == 4) ? INT_SWAP32(type,var) : \ - ((sizeof(type) == 2) ? INT_SWAP16(type,var) : \ - (var)))) - /* * get and set integers from potentially unaligned locations */ @@ -107,16 +85,6 @@ static inline void be64_add_cpu(__be64 *a, __s64 b) ((__u8*)(pointer))[1] = (((value) ) & 0xff); \ } -/* does not return a value */ -#define INT_SET(reference,arch,valueref) \ - (__builtin_constant_p(valueref) ? \ - (void)( (reference) = ( ((arch) != ARCH_NOCONVERT) ? (INT_SWAP((reference),(valueref))) : (valueref)) ) : \ - (void)( \ - ((reference) = (valueref)), \ - ( ((arch) != ARCH_NOCONVERT) ? (reference) = INT_SWAP((reference),(reference)) : 0 ) \ - ) \ - ) - /* * In directories inode numbers are stored as unaligned arrays of unsigned * 8bit integers on disk. diff --git a/include/xfs_attr_leaf.h b/include/xfs_attr_leaf.h index 83e9af4..9c7d22f 100644 --- a/include/xfs_attr_leaf.h +++ b/include/xfs_attr_leaf.h @@ -151,8 +151,6 @@ typedef struct xfs_attr_leafblock { /* * Cast typed pointers for "local" and "remote" name/value structs. */ -#define XFS_ATTR_LEAF_NAME_REMOTE(leafp,idx) \ - xfs_attr_leaf_name_remote(leafp,idx) static inline xfs_attr_leaf_name_remote_t * xfs_attr_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) { @@ -160,8 +158,6 @@ xfs_attr_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; } -#define XFS_ATTR_LEAF_NAME_LOCAL(leafp,idx) \ - xfs_attr_leaf_name_local(leafp,idx) static inline xfs_attr_leaf_name_local_t * xfs_attr_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) { @@ -169,8 +165,6 @@ xfs_attr_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; } -#define XFS_ATTR_LEAF_NAME(leafp,idx) \ - xfs_attr_leaf_name(leafp,idx) static inline char *xfs_attr_leaf_name(xfs_attr_leafblock_t *leafp, int idx) { return &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; @@ -181,24 +175,18 @@ static inline char *xfs_attr_leaf_name(xfs_attr_leafblock_t *leafp, int idx) * a "local" name/value structure, a "remote" name/value structure, and * a pointer which might be either. */ -#define XFS_ATTR_LEAF_ENTSIZE_REMOTE(nlen) \ - xfs_attr_leaf_entsize_remote(nlen) static inline int xfs_attr_leaf_entsize_remote(int nlen) { return ((uint)sizeof(xfs_attr_leaf_name_remote_t) - 1 + (nlen) + \ XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); } -#define XFS_ATTR_LEAF_ENTSIZE_LOCAL(nlen,vlen) \ - xfs_attr_leaf_entsize_local(nlen,vlen) static inline int xfs_attr_leaf_entsize_local(int nlen, int vlen) { return ((uint)sizeof(xfs_attr_leaf_name_local_t) - 1 + (nlen) + (vlen) + XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); } -#define XFS_ATTR_LEAF_ENTSIZE_LOCAL_MAX(bsize) \ - xfs_attr_leaf_entsize_local_max(bsize) static inline int xfs_attr_leaf_entsize_local_max(int bsize) { return (((bsize) >> 1) + ((bsize) >> 2)); diff --git a/include/xfs_attr_sf.h b/include/xfs_attr_sf.h index ea22839..919756e 100644 --- a/include/xfs_attr_sf.h +++ b/include/xfs_attr_sf.h @@ -25,8 +25,6 @@ * to fit into the literal area of the inode. */ -struct xfs_inode; - /* * Entries are packed toward the top as tight as possible. */ @@ -54,7 +52,7 @@ typedef struct xfs_attr_sf_sort { __uint8_t valuelen; /* length of value */ __uint8_t flags; /* flags bits (see xfs_attr_leaf.h) */ xfs_dahash_t hash; /* this entry's hash value */ - char *name; /* name value, pointer into buffer */ + unsigned char *name; /* name value, pointer into buffer */ } xfs_attr_sf_sort_t; #define XFS_ATTR_SF_ENTSIZE_BYNAME(nlen,vlen) /* space name/value uses */ \ @@ -69,42 +67,4 @@ typedef struct xfs_attr_sf_sort { (be16_to_cpu(((xfs_attr_shortform_t *) \ ((dp)->i_afp->if_u1.if_data))->hdr.totsize)) -#if defined(XFS_ATTR_TRACE) -/* - * Kernel tracing support for attribute lists - */ -struct xfs_attr_list_context; -struct xfs_da_intnode; -struct xfs_da_node_entry; -struct xfs_attr_leafblock; - -#define XFS_ATTR_TRACE_SIZE 4096 /* size of global trace buffer */ -extern ktrace_t *xfs_attr_trace_buf; - -/* - * Trace record types. - */ -#define XFS_ATTR_KTRACE_L_C 1 /* context */ -#define XFS_ATTR_KTRACE_L_CN 2 /* context, node */ -#define XFS_ATTR_KTRACE_L_CB 3 /* context, btree */ -#define XFS_ATTR_KTRACE_L_CL 4 /* context, leaf */ - -void xfs_attr_trace_l_c(char *where, struct xfs_attr_list_context *context); -void xfs_attr_trace_l_cn(char *where, struct xfs_attr_list_context *context, - struct xfs_da_intnode *node); -void xfs_attr_trace_l_cb(char *where, struct xfs_attr_list_context *context, - struct xfs_da_node_entry *btree); -void xfs_attr_trace_l_cl(char *where, struct xfs_attr_list_context *context, - struct xfs_attr_leafblock *leaf); -void xfs_attr_trace_enter(int type, char *where, - struct xfs_attr_list_context *context, - __psunsigned_t a13, __psunsigned_t a14, - __psunsigned_t a15); -#else -#define xfs_attr_trace_l_c(w,c) -#define xfs_attr_trace_l_cn(w,c,n) -#define xfs_attr_trace_l_cb(w,c,b) -#define xfs_attr_trace_l_cl(w,c,l) -#endif /* XFS_ATTR_TRACE */ - #endif /* __XFS_ATTR_SF_H__ */ diff --git a/include/xfs_bit.h b/include/xfs_bit.h index bca7b24..f1e3c90 100644 --- a/include/xfs_bit.h +++ b/include/xfs_bit.h @@ -23,24 +23,16 @@ */ /* - * masks with n high/low bits set, 32-bit values & 64-bit values + * masks with n high/low bits set, 64-bit values */ -#define XFS_MASK32HI(n) xfs_mask32hi(n) -static inline __uint32_t xfs_mask32hi(int n) -{ - return (__uint32_t)-1 << (32 - (n)); -} -#define XFS_MASK64HI(n) xfs_mask64hi(n) static inline __uint64_t xfs_mask64hi(int n) { return (__uint64_t)-1 << (64 - (n)); } -#define XFS_MASK32LO(n) xfs_mask32lo(n) static inline __uint32_t xfs_mask32lo(int n) { return ((__uint32_t)1 << (n)) - 1; } -#define XFS_MASK64LO(n) xfs_mask64lo(n) static inline __uint64_t xfs_mask64lo(int n) { return ((__uint64_t)1 << (n)) - 1; diff --git a/include/xfs_bmap.h b/include/xfs_bmap.h index 7c9d12c..3651191 100644 --- a/include/xfs_bmap.h +++ b/include/xfs_bmap.h @@ -28,20 +28,6 @@ struct xfs_trans; extern kmem_zone_t *xfs_bmap_free_item_zone; /* - * DELTA: describe a change to the in-core extent list. - * - * Internally the use of xed_blockount is somewhat funky. - * xed_blockcount contains an offset much of the time because this - * makes merging changes easier. (xfs_fileoff_t and xfs_filblks_t are - * the same underlying type). - */ -typedef struct xfs_extdelta -{ - xfs_fileoff_t xed_startoff; /* offset of range */ - xfs_filblks_t xed_blockcount; /* blocks in range */ -} xfs_extdelta_t; - -/* * List of extents to be free "later". * The list is kept sorted on xbf_startblock. */ @@ -82,20 +68,32 @@ typedef struct xfs_bmap_free #define XFS_BMAPI_DELAY 0x002 /* delayed write operation */ #define XFS_BMAPI_ENTIRE 0x004 /* return entire extent, not trimmed */ #define XFS_BMAPI_METADATA 0x008 /* mapping metadata not user data */ -#define XFS_BMAPI_EXACT 0x010 /* allocate only to spec'd bounds */ -#define XFS_BMAPI_ATTRFORK 0x020 /* use attribute fork not data */ -#define XFS_BMAPI_ASYNC 0x040 /* bunmapi xactions can be async */ -#define XFS_BMAPI_RSVBLOCKS 0x080 /* OK to alloc. reserved data blocks */ -#define XFS_BMAPI_PREALLOC 0x100 /* preallocation op: unwritten space */ -#define XFS_BMAPI_IGSTATE 0x200 /* Ignore state - */ +#define XFS_BMAPI_ATTRFORK 0x010 /* use attribute fork not data */ +#define XFS_BMAPI_RSVBLOCKS 0x020 /* OK to alloc. reserved data blocks */ +#define XFS_BMAPI_PREALLOC 0x040 /* preallocation op: unwritten space */ +#define XFS_BMAPI_IGSTATE 0x080 /* Ignore state - */ /* combine contig. space */ -#define XFS_BMAPI_CONTIG 0x400 /* must allocate only one extent */ -/* XFS_BMAPI_DIRECT_IO 0x800 */ -#define XFS_BMAPI_CONVERT 0x1000 /* unwritten extent conversion - */ - /* need write cache flushing and no */ - /* additional allocation alignments */ +#define XFS_BMAPI_CONTIG 0x100 /* must allocate only one extent */ +/* + * unwritten extent conversion - this needs write cache flushing and no additional + * allocation alignments. When specified with XFS_BMAPI_PREALLOC it converts + * from written to unwritten, otherwise convert from unwritten to written. + */ +#define XFS_BMAPI_CONVERT 0x200 + +#define XFS_BMAPI_FLAGS \ + { XFS_BMAPI_WRITE, "WRITE" }, \ + { XFS_BMAPI_DELAY, "DELAY" }, \ + { XFS_BMAPI_ENTIRE, "ENTIRE" }, \ + { XFS_BMAPI_METADATA, "METADATA" }, \ + { XFS_BMAPI_ATTRFORK, "ATTRFORK" }, \ + { XFS_BMAPI_RSVBLOCKS, "RSVBLOCKS" }, \ + { XFS_BMAPI_PREALLOC, "PREALLOC" }, \ + { XFS_BMAPI_IGSTATE, "IGSTATE" }, \ + { XFS_BMAPI_CONTIG, "CONTIG" }, \ + { XFS_BMAPI_CONVERT, "CONVERT" } + -#define XFS_BMAPI_AFLAG(w) xfs_bmapi_aflag(w) static inline int xfs_bmapi_aflag(int w) { return (w == XFS_ATTR_FORK ? XFS_BMAPI_ATTRFORK : 0); @@ -107,7 +105,6 @@ static inline int xfs_bmapi_aflag(int w) #define DELAYSTARTBLOCK ((xfs_fsblock_t)-1LL) #define HOLESTARTBLOCK ((xfs_fsblock_t)-2LL) -#define XFS_BMAP_INIT(flp,fbp) xfs_bmap_init(flp,fbp) static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) { ((flp)->xbf_first = NULL, (flp)->xbf_count = 0, \ @@ -127,7 +124,7 @@ typedef struct xfs_bmalloca { struct xfs_bmbt_irec *gotp; /* extent after, or delayed */ xfs_extlen_t alen; /* i/o length asked/allocated */ xfs_extlen_t total; /* total blocks needed for xaction */ - xfs_extlen_t minlen; /* mininum allocation size (blocks) */ + xfs_extlen_t minlen; /* minimum allocation size (blocks) */ xfs_extlen_t minleft; /* amount must be left after alloc */ char eof; /* set if allocating past last extent */ char wasdel; /* replacing a delayed allocation */ @@ -137,36 +134,43 @@ typedef struct xfs_bmalloca { char conv; /* overwriting unwritten extents */ } xfs_bmalloca_t; -#if defined(__KERNEL__) && defined(XFS_BMAP_TRACE) /* - * Trace operations for bmap extent tracing + * Flags for xfs_bmap_add_extent*. */ -#define XFS_BMAP_KTRACE_DELETE 1 -#define XFS_BMAP_KTRACE_INSERT 2 -#define XFS_BMAP_KTRACE_PRE_UP 3 -#define XFS_BMAP_KTRACE_POST_UP 4 - -#define XFS_BMAP_TRACE_SIZE 4096 /* size of global trace buffer */ -#define XFS_BMAP_KTRACE_SIZE 32 /* size of per-inode trace buffer */ -extern ktrace_t *xfs_bmap_trace_buf; +#define BMAP_LEFT_CONTIG (1 << 0) +#define BMAP_RIGHT_CONTIG (1 << 1) +#define BMAP_LEFT_FILLING (1 << 2) +#define BMAP_RIGHT_FILLING (1 << 3) +#define BMAP_LEFT_DELAY (1 << 4) +#define BMAP_RIGHT_DELAY (1 << 5) +#define BMAP_LEFT_VALID (1 << 6) +#define BMAP_RIGHT_VALID (1 << 7) +#define BMAP_ATTRFORK (1 << 8) + +#define XFS_BMAP_EXT_FLAGS \ + { BMAP_LEFT_CONTIG, "LC" }, \ + { BMAP_RIGHT_CONTIG, "RC" }, \ + { BMAP_LEFT_FILLING, "LF" }, \ + { BMAP_RIGHT_FILLING, "RF" }, \ + { BMAP_ATTRFORK, "ATTR" } /* * Add bmap trace insert entries for all the contents of the extent list. + * + * Quite excessive tracing. Only do this for debug builds. */ +#if defined(__KERNEL) && defined(DEBUG) void xfs_bmap_trace_exlist( - const char *fname, /* function name */ struct xfs_inode *ip, /* incore inode pointer */ xfs_extnum_t cnt, /* count of entries in list */ - int whichfork); /* data or attr fork */ + int whichfork, + unsigned long caller_ip); /* data or attr fork */ #define XFS_BMAP_TRACE_EXLIST(ip,c,w) \ - xfs_bmap_trace_exlist(__func__,ip,c,w) - -#else /* __KERNEL__ && XFS_BMAP_TRACE */ - + xfs_bmap_trace_exlist(ip,c,w, _THIS_IP_) +#else #define XFS_BMAP_TRACE_EXLIST(ip,c,w) - -#endif /* __KERNEL__ && XFS_BMAP_TRACE */ +#endif /* * Convert inode from non-attributed to attributed. @@ -290,9 +294,7 @@ xfs_bmapi( xfs_extlen_t total, /* total blocks needed */ struct xfs_bmbt_irec *mval, /* output: map values */ int *nmap, /* i/o: mval size/count */ - xfs_bmap_free_t *flist, /* i/o: list extents to free */ - xfs_extdelta_t *delta); /* o: change made to incore - extents */ + xfs_bmap_free_t *flist); /* i/o: list extents to free */ /* * Map file blocks to filesystem blocks, simple version. @@ -326,8 +328,6 @@ xfs_bunmapi( xfs_fsblock_t *firstblock, /* first allocated block controls a.g. for allocs */ xfs_bmap_free_t *flist, /* i/o: list extents to free */ - xfs_extdelta_t *delta, /* o: change made to incore - extents */ int *done); /* set if not done yet */ /* @@ -340,6 +340,10 @@ xfs_check_nostate_extents( xfs_extnum_t idx, xfs_extnum_t num); +uint +xfs_default_attroffset( + struct xfs_inode *ip); + #ifdef __KERNEL__ /* @@ -356,15 +360,18 @@ xfs_bmap_finish( xfs_bmap_free_t *flist, /* i/o: list extents to free */ int *committed); /* xact committed or not */ +/* bmap to userspace formatter - copy to user & advance pointer */ +typedef int (*xfs_bmap_format_t)(void **, struct getbmapx *, int *); + /* - * Fcntl interface to xfs_bmapi. + * Get inode's extents as described in bmv, and format for output. */ int /* error code */ xfs_getbmap( xfs_inode_t *ip, - struct getbmap *bmv, /* user bmap structure */ - void __user *ap, /* pointer to user's array */ - int iflags); /* interface flags */ + struct getbmapx *bmv, /* user bmap structure */ + xfs_bmap_format_t formatter, /* format to user */ + void *arg); /* formatter arg */ /* * Check if the endoff is outside the last extent. If so the caller will grow @@ -387,17 +394,11 @@ xfs_bmap_count_blocks( int whichfork, int *count); -/* - * Search the extent records for the entry containing block bno. - * If bno lies in a hole, point to the next entry. If bno lies - * past eof, *eofp will be set, and *prevp will contain the last - * entry (null if none). Else, *lastxp will be set to the index - * of the found entry; *gotp will contain the entry. - */ -xfs_bmbt_rec_host_t * -xfs_bmap_search_multi_extents(struct xfs_ifork *, xfs_fileoff_t, int *, - xfs_extnum_t *, xfs_bmbt_irec_t *, xfs_bmbt_irec_t *); - +int +xfs_bmap_punch_delalloc_range( + struct xfs_inode *ip, + xfs_fileoff_t start_fsb, + xfs_fileoff_t length); #endif /* __KERNEL__ */ #endif /* __XFS_BMAP_H__ */ diff --git a/include/xfs_bmap_btree.h b/include/xfs_bmap_btree.h index a4555ab..0e66c4e 100644 --- a/include/xfs_bmap_btree.h +++ b/include/xfs_bmap_btree.h @@ -46,20 +46,12 @@ typedef struct xfs_bmdr_block { #define BMBT_STARTBLOCK_BITLEN 52 #define BMBT_BLOCKCOUNT_BITLEN 21 - -#define BMBT_USE_64 1 - -typedef struct xfs_bmbt_rec_32 -{ - __uint32_t l0, l1, l2, l3; -} xfs_bmbt_rec_32_t; -typedef struct xfs_bmbt_rec_64 -{ +typedef struct xfs_bmbt_rec { __be64 l0, l1; -} xfs_bmbt_rec_64_t; +} xfs_bmbt_rec_t; typedef __uint64_t xfs_bmbt_rec_base_t; /* use this for casts */ -typedef xfs_bmbt_rec_64_t xfs_bmbt_rec_t, xfs_bmdr_rec_t; +typedef xfs_bmbt_rec_t xfs_bmdr_rec_t; typedef struct xfs_bmbt_rec_host { __uint64_t l0, l1; @@ -76,26 +68,22 @@ typedef struct xfs_bmbt_rec_host { #define DSTARTBLOCKMASK \ (((((xfs_dfsbno_t)1) << DSTARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS) -#define ISNULLSTARTBLOCK(x) isnullstartblock(x) static inline int isnullstartblock(xfs_fsblock_t x) { return ((x) & STARTBLOCKMASK) == STARTBLOCKMASK; } -#define ISNULLDSTARTBLOCK(x) isnulldstartblock(x) static inline int isnulldstartblock(xfs_dfsbno_t x) { return ((x) & DSTARTBLOCKMASK) == DSTARTBLOCKMASK; } -#define NULLSTARTBLOCK(k) nullstartblock(k) static inline xfs_fsblock_t nullstartblock(int k) { ASSERT(k < (1 << STARTBLOCKVALBITS)); return STARTBLOCKMASK | (k); } -#define STARTBLOCKVAL(x) startblockval(x) static inline xfs_filblks_t startblockval(xfs_fsblock_t x) { return (xfs_filblks_t)((x) & ~STARTBLOCKMASK); @@ -224,7 +212,6 @@ extern xfs_fsblock_t xfs_bmbt_get_startblock(xfs_bmbt_rec_host_t *r); extern xfs_fileoff_t xfs_bmbt_get_startoff(xfs_bmbt_rec_host_t *r); extern xfs_exntst_t xfs_bmbt_get_state(xfs_bmbt_rec_host_t *r); -extern void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); extern xfs_filblks_t xfs_bmbt_disk_get_blockcount(xfs_bmbt_rec_t *r); extern xfs_fileoff_t xfs_bmbt_disk_get_startoff(xfs_bmbt_rec_t *r); @@ -236,7 +223,6 @@ extern void xfs_bmbt_set_startblock(xfs_bmbt_rec_host_t *r, xfs_fsblock_t v); extern void xfs_bmbt_set_startoff(xfs_bmbt_rec_host_t *r, xfs_fileoff_t v); extern void xfs_bmbt_set_state(xfs_bmbt_rec_host_t *r, xfs_exntst_t v); -extern void xfs_bmbt_disk_set_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); extern void xfs_bmbt_disk_set_allf(xfs_bmbt_rec_t *r, xfs_fileoff_t o, xfs_fsblock_t b, xfs_filblks_t c, xfs_exntst_t v); diff --git a/include/xfs_btree.h b/include/xfs_btree.h index 789fffd..82fafc6 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -41,7 +41,7 @@ extern kmem_zone_t *xfs_btree_cur_zone; /* * Generic btree header. * - * This is a comination of the actual format used on disk for short and long + * This is a combination of the actual format used on disk for short and long * format btrees. The first three fields are shared by both format, but * the pointers are different and should be used with care. * @@ -152,9 +152,7 @@ struct xfs_btree_ops { /* update btree root pointer */ void (*set_root)(struct xfs_btree_cur *cur, - union xfs_btree_ptr *nptr, int level_change); - int (*kill_root)(struct xfs_btree_cur *cur, struct xfs_buf *bp, - int level, union xfs_btree_ptr *newroot); + union xfs_btree_ptr *nptr, int level_change); /* block allocation / freeing */ int (*alloc_block)(struct xfs_btree_cur *cur, @@ -379,20 +377,6 @@ xfs_btree_read_bufl( int refval);/* ref count value for buffer */ /* - * Get a buffer for the block, return it read in. - * Short-form addressing. - */ -int /* error */ -xfs_btree_read_bufs( - struct xfs_mount *mp, /* file system mount point */ - struct xfs_trans *tp, /* transaction pointer */ - xfs_agnumber_t agno, /* allocation group number */ - xfs_agblock_t agbno, /* allocation group block number */ - uint lock, /* lock flags for read_buf */ - struct xfs_buf **bpp, /* buffer for agno/agbno */ - int refval);/* ref count value for buffer */ - -/* * Read-ahead the block, don't wait for it, don't return a buffer. * Long-form addressing. */ @@ -413,16 +397,6 @@ xfs_btree_reada_bufs( xfs_agblock_t agbno, /* allocation group block number */ xfs_extlen_t count); /* count of filesystem blocks */ -/* - * Set the buffer for level "lev" in the cursor to bp, releasing - * any previous buffer. - */ -void -xfs_btree_setbuf( - xfs_btree_cur_t *cur, /* btree cursor */ - int lev, /* level in btree */ - struct xfs_buf *bp); /* new buffer to set */ - /* * Common btree core entry points. @@ -432,7 +406,6 @@ int xfs_btree_decrement(struct xfs_btree_cur *, int, int *); int xfs_btree_lookup(struct xfs_btree_cur *, xfs_lookup_t, int *); int xfs_btree_update(struct xfs_btree_cur *, union xfs_btree_rec *); int xfs_btree_new_iroot(struct xfs_btree_cur *, int *, int *); -int xfs_btree_kill_iroot(struct xfs_btree_cur *); int xfs_btree_insert(struct xfs_btree_cur *, int *); int xfs_btree_delete(struct xfs_btree_cur *, int *); int xfs_btree_get_rec(struct xfs_btree_cur *, union xfs_btree_rec **, int *); diff --git a/include/xfs_btree_trace.h b/include/xfs_btree_trace.h index b3f5eb3..2d8a309 100644 --- a/include/xfs_btree_trace.h +++ b/include/xfs_btree_trace.h @@ -58,8 +58,6 @@ void xfs_btree_trace_argbi(const char *, struct xfs_btree_cur *, struct xfs_buf *, int, int); void xfs_btree_trace_argbii(const char *, struct xfs_btree_cur *, struct xfs_buf *, int, int, int); -void xfs_btree_trace_argfffi(const char *, struct xfs_btree_cur *, - xfs_dfiloff_t, xfs_dfsbno_t, xfs_dfilblks_t, int, int); void xfs_btree_trace_argi(const char *, struct xfs_btree_cur *, int, int); void xfs_btree_trace_argipk(const char *, struct xfs_btree_cur *, int, union xfs_btree_ptr, union xfs_btree_key *, int); @@ -71,24 +69,10 @@ void xfs_btree_trace_argr(const char *, struct xfs_btree_cur *, union xfs_btree_rec *, int); void xfs_btree_trace_cursor(const char *, struct xfs_btree_cur *, int, int); - -#define XFS_ALLOCBT_TRACE_SIZE 4096 /* size of global trace buffer */ -extern ktrace_t *xfs_allocbt_trace_buf; - -#define XFS_INOBT_TRACE_SIZE 4096 /* size of global trace buffer */ -extern ktrace_t *xfs_inobt_trace_buf; - -#define XFS_BMBT_TRACE_SIZE 4096 /* size of global trace buffer */ -#define XFS_BMBT_KTRACE_SIZE 32 /* size of per-inode trace buffer */ -extern ktrace_t *xfs_bmbt_trace_buf; - - #define XFS_BTREE_TRACE_ARGBI(c, b, i) \ xfs_btree_trace_argbi(__func__, c, b, i, __LINE__) #define XFS_BTREE_TRACE_ARGBII(c, b, i, j) \ xfs_btree_trace_argbii(__func__, c, b, i, j, __LINE__) -#define XFS_BTREE_TRACE_ARGFFFI(c, o, b, i, j) \ - xfs_btree_trace_argfffi(__func__, c, o, b, i, j, __LINE__) #define XFS_BTREE_TRACE_ARGI(c, i) \ xfs_btree_trace_argi(__func__, c, i, __LINE__) #define XFS_BTREE_TRACE_ARGIPK(c, i, p, k) \ @@ -104,7 +88,6 @@ extern ktrace_t *xfs_bmbt_trace_buf; #else #define XFS_BTREE_TRACE_ARGBI(c, b, i) #define XFS_BTREE_TRACE_ARGBII(c, b, i, j) -#define XFS_BTREE_TRACE_ARGFFFI(c, o, b, i, j) #define XFS_BTREE_TRACE_ARGI(c, i) #define XFS_BTREE_TRACE_ARGIPK(c, i, p, s) #define XFS_BTREE_TRACE_ARGIPR(c, i, p, r) diff --git a/include/xfs_da_btree.h b/include/xfs_da_btree.h index 70b710c..fe9f5a8 100644 --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -91,9 +91,9 @@ enum xfs_dacmp { * Structure to ease passing around component names. */ typedef struct xfs_da_args { - const uchar_t *name; /* string (maybe not NULL terminated) */ + const __uint8_t *name; /* string (maybe not NULL terminated) */ int namelen; /* length of string (maybe no NULL) */ - uchar_t *value; /* set of bytes (maybe contain NULLs) */ + __uint8_t *value; /* set of bytes (maybe contain NULLs) */ int valuelen; /* length of value */ int flags; /* argument flags (eg: ATTR_NOCREATE) */ xfs_dahash_t hashval; /* hash value of name */ @@ -125,6 +125,13 @@ typedef struct xfs_da_args { #define XFS_DA_OP_OKNOENT 0x0008 /* lookup/add op, ENOENT ok, else die */ #define XFS_DA_OP_CILOOKUP 0x0010 /* lookup to return CI name if found */ +#define XFS_DA_OP_FLAGS \ + { XFS_DA_OP_JUSTCHECK, "JUSTCHECK" }, \ + { XFS_DA_OP_RENAME, "RENAME" }, \ + { XFS_DA_OP_ADDNAME, "ADDNAME" }, \ + { XFS_DA_OP_OKNOENT, "OKNOENT" }, \ + { XFS_DA_OP_CILOOKUP, "CILOOKUP" } + /* * Structure to describe buffer(s) for a block. * This is needed in the directory version 2 format case, when @@ -185,7 +192,7 @@ typedef struct xfs_da_state { unsigned char inleaf; /* insert into 1->lf, 0->splf */ unsigned char extravalid; /* T/F: extrablk is in use */ unsigned char extraafter; /* T/F: extrablk is after new */ - xfs_da_state_blk_t extrablk; /* for double-splits on leafs */ + xfs_da_state_blk_t extrablk; /* for double-splits on leaves */ /* for dirv2 extrablk is data */ } xfs_da_state_t; @@ -202,7 +209,8 @@ typedef struct xfs_da_state { */ struct xfs_nameops { xfs_dahash_t (*hashname)(struct xfs_name *); - enum xfs_dacmp (*compname)(struct xfs_da_args *, const char *, int); + enum xfs_dacmp (*compname)(struct xfs_da_args *, + const unsigned char *, int); }; @@ -251,9 +259,9 @@ xfs_daddr_t xfs_da_reada_buf(struct xfs_trans *trans, struct xfs_inode *dp, int xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, xfs_dabuf_t *dead_buf); -uint xfs_da_hashname(const uchar_t *name_string, int name_length); +uint xfs_da_hashname(const __uint8_t *name_string, int name_length); enum xfs_dacmp xfs_da_compname(struct xfs_da_args *args, - const char *name, int len); + const unsigned char *name, int len); xfs_da_state_t *xfs_da_state_alloc(void); @@ -268,5 +276,6 @@ xfs_daddr_t xfs_da_blkno(xfs_dabuf_t *dabuf); extern struct kmem_zone *xfs_da_state_zone; extern struct kmem_zone *xfs_dabuf_zone; +extern const struct xfs_nameops xfs_default_nameops; #endif /* __XFS_DA_BTREE_H__ */ diff --git a/include/xfs_dfrag.h b/include/xfs_dfrag.h index da17820..20bdd93 100644 --- a/include/xfs_dfrag.h +++ b/include/xfs_dfrag.h @@ -46,10 +46,7 @@ typedef struct xfs_swapext /* * Syscall interface for xfs_swapext */ -int xfs_swapext(struct xfs_swapext __user *sx); - -int xfs_swap_extents(struct xfs_inode *ip, struct xfs_inode *tip, - struct xfs_swapext *sxp); +int xfs_swapext(struct xfs_swapext *sx); #endif /* __KERNEL__ */ diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index f28c088..dffba9b 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -18,32 +18,29 @@ #ifndef __XFS_DINODE_H__ #define __XFS_DINODE_H__ -struct xfs_buf; -struct xfs_mount; +#define XFS_DINODE_MAGIC 0x494e /* 'IN' */ +#define XFS_DINODE_GOOD_VERSION(v) (((v) == 1 || (v) == 2)) -#define XFS_DINODE_VERSION_1 1 -#define XFS_DINODE_VERSION_2 2 -#define XFS_DINODE_GOOD_VERSION(v) \ - (((v) == XFS_DINODE_VERSION_1 || (v) == XFS_DINODE_VERSION_2)) -#define XFS_DINODE_MAGIC 0x494e /* 'IN' */ - -/* - * Disk inode structure. - * This is just the header; the inode is expanded to fill a variable size - * with the last field expanding. It is split into the core and "other" - * because we only need the core part in the in-core inode. - */ typedef struct xfs_timestamp { __be32 t_sec; /* timestamp seconds */ __be32 t_nsec; /* timestamp nanoseconds */ } xfs_timestamp_t; /* - * Note: Coordinate changes to this structure with the XFS_DI_* #defines - * below, the offsets table in xfs_ialloc_log_di() and struct xfs_icdinode - * in xfs_inode.h. + * On-disk inode structure. + * + * This is just the header or "dinode core", the inode is expanded to fill a + * variable size the leftover area split into a data and an attribute fork. + * The format of the data and attribute fork depends on the format of the + * inode as indicated by di_format and di_aformat. To access the data and + * attribute use the XFS_DFORK_PTR, XFS_DFORK_DPTR, and XFS_DFORK_PTR macros + * below. + * + * There is a very similar struct icdinode in xfs_inode which matches the + * layout of the first 96 bytes of this structure, but is kept in native + * format instead of big endian. */ -typedef struct xfs_dinode_core { +typedef struct xfs_dinode { __be16 di_magic; /* inode magic # = XFS_DINODE_MAGIC */ __be16 di_mode; /* mode and type of file */ __u8 di_version; /* inode version */ @@ -70,33 +67,12 @@ typedef struct xfs_dinode_core { __be16 di_dmstate; /* DMIG state info */ __be16 di_flags; /* random flags, XFS_DIFLAG_... */ __be32 di_gen; /* generation number */ -} xfs_dinode_core_t; -#define DI_MAX_FLUSH 0xffff + /* di_next_unlinked is the only non-core field in the old dinode */ + __be32 di_next_unlinked;/* agi unlinked list ptr */ +} __attribute__((packed)) xfs_dinode_t; -typedef struct xfs_dinode -{ - xfs_dinode_core_t di_core; - /* - * In adding anything between the core and the union, be - * sure to update the macros like XFS_LITINO below. - */ - __be32 di_next_unlinked;/* agi unlinked list ptr */ - union { - xfs_bmdr_block_t di_bmbt; /* btree root block */ - xfs_bmbt_rec_32_t di_bmx[1]; /* extent list */ - xfs_dir2_sf_t di_dir2sf; /* shortform directory v2 */ - char di_c[1]; /* local contents */ - __be32 di_dev; /* device for S_IFCHR/S_IFBLK */ - uuid_t di_muuid; /* mount point value */ - char di_symlink[1]; /* local symbolic link */ - } di_u; - union { - xfs_bmdr_block_t di_abmbt; /* btree root block */ - xfs_bmbt_rec_32_t di_abmx[1]; /* extent list */ - xfs_attr_shortform_t di_attrsf; /* shortform attribute list */ - } di_a; -} xfs_dinode_t; +#define DI_MAX_FLUSH 0xffff /* * The 32 bit link count in the inode theoretically maxes out at UINT_MAX. @@ -107,50 +83,14 @@ typedef struct xfs_dinode #define XFS_MAXLINK_1 65535U /* - * Bit names for logging disk inodes only - */ -#define XFS_DI_MAGIC 0x0000001 -#define XFS_DI_MODE 0x0000002 -#define XFS_DI_VERSION 0x0000004 -#define XFS_DI_FORMAT 0x0000008 -#define XFS_DI_ONLINK 0x0000010 -#define XFS_DI_UID 0x0000020 -#define XFS_DI_GID 0x0000040 -#define XFS_DI_NLINK 0x0000080 -#define XFS_DI_PROJID 0x0000100 -#define XFS_DI_PAD 0x0000200 -#define XFS_DI_ATIME 0x0000400 -#define XFS_DI_MTIME 0x0000800 -#define XFS_DI_CTIME 0x0001000 -#define XFS_DI_SIZE 0x0002000 -#define XFS_DI_NBLOCKS 0x0004000 -#define XFS_DI_EXTSIZE 0x0008000 -#define XFS_DI_NEXTENTS 0x0010000 -#define XFS_DI_NAEXTENTS 0x0020000 -#define XFS_DI_FORKOFF 0x0040000 -#define XFS_DI_AFORMAT 0x0080000 -#define XFS_DI_DMEVMASK 0x0100000 -#define XFS_DI_DMSTATE 0x0200000 -#define XFS_DI_FLAGS 0x0400000 -#define XFS_DI_GEN 0x0800000 -#define XFS_DI_NEXT_UNLINKED 0x1000000 -#define XFS_DI_U 0x2000000 -#define XFS_DI_A 0x4000000 -#define XFS_DI_NUM_BITS 27 -#define XFS_DI_ALL_BITS ((1 << XFS_DI_NUM_BITS) - 1) -#define XFS_DI_CORE_BITS (XFS_DI_ALL_BITS & ~(XFS_DI_U|XFS_DI_A)) - -/* * Values for di_format */ -typedef enum xfs_dinode_fmt -{ - XFS_DINODE_FMT_DEV, /* CHR, BLK: di_dev */ - XFS_DINODE_FMT_LOCAL, /* DIR, REG: di_c */ - /* LNK: di_symlink */ - XFS_DINODE_FMT_EXTENTS, /* DIR, REG, LNK: di_bmx */ - XFS_DINODE_FMT_BTREE, /* DIR, REG, LNK: di_bmbt */ - XFS_DINODE_FMT_UUID /* MNT: di_uuid */ +typedef enum xfs_dinode_fmt { + XFS_DINODE_FMT_DEV, /* xfs_dev_t */ + XFS_DINODE_FMT_LOCAL, /* bulk data */ + XFS_DINODE_FMT_EXTENTS, /* struct xfs_bmbt_rec */ + XFS_DINODE_FMT_BTREE, /* struct xfs_bmdr_block */ + XFS_DINODE_FMT_UUID /* uuid_t */ } xfs_dinode_fmt_t; /* @@ -164,15 +104,17 @@ typedef enum xfs_dinode_fmt /* * Inode size for given fs. */ -#define XFS_LITINO(mp) ((mp)->m_litino) +#define XFS_LITINO(mp) \ + ((int)(((mp)->m_sb.sb_inodesize) - sizeof(struct xfs_dinode))) + #define XFS_BROOT_SIZE_ADJ \ (XFS_BTREE_LBLOCK_LEN - sizeof(xfs_bmdr_block_t)) /* * Inode data & attribute fork sizes, per inode. */ -#define XFS_DFORK_Q(dip) ((dip)->di_core.di_forkoff != 0) -#define XFS_DFORK_BOFF(dip) ((int)((dip)->di_core.di_forkoff << 3)) +#define XFS_DFORK_Q(dip) ((dip)->di_forkoff != 0) +#define XFS_DFORK_BOFF(dip) ((int)((dip)->di_forkoff << 3)) #define XFS_DFORK_DSIZE(dip,mp) \ (XFS_DFORK_Q(dip) ? \ @@ -187,23 +129,42 @@ typedef enum xfs_dinode_fmt XFS_DFORK_DSIZE(dip, mp) : \ XFS_DFORK_ASIZE(dip, mp)) -#define XFS_DFORK_DPTR(dip) ((dip)->di_u.di_c) +/* + * Return pointers to the data or attribute forks. + */ +#define XFS_DFORK_DPTR(dip) \ + ((char *)(dip) + sizeof(struct xfs_dinode)) #define XFS_DFORK_APTR(dip) \ - ((dip)->di_u.di_c + XFS_DFORK_BOFF(dip)) + (XFS_DFORK_DPTR(dip) + XFS_DFORK_BOFF(dip)) #define XFS_DFORK_PTR(dip,w) \ ((w) == XFS_DATA_FORK ? XFS_DFORK_DPTR(dip) : XFS_DFORK_APTR(dip)) + #define XFS_DFORK_FORMAT(dip,w) \ ((w) == XFS_DATA_FORK ? \ - (dip)->di_core.di_format : \ - (dip)->di_core.di_aformat) + (dip)->di_format : \ + (dip)->di_aformat) #define XFS_DFORK_NEXTENTS(dip,w) \ ((w) == XFS_DATA_FORK ? \ - be32_to_cpu((dip)->di_core.di_nextents) : \ - be16_to_cpu((dip)->di_core.di_anextents)) + be32_to_cpu((dip)->di_nextents) : \ + be16_to_cpu((dip)->di_anextents)) #define XFS_BUF_TO_DINODE(bp) ((xfs_dinode_t *)XFS_BUF_PTR(bp)) /* + * For block and character special files the 32bit dev_t is stored at the + * beginning of the data fork. + */ +static inline xfs_dev_t xfs_dinode_get_rdev(struct xfs_dinode *dip) +{ + return be32_to_cpu(*(__be32 *)XFS_DFORK_DPTR(dip)); +} + +static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev) +{ + *(__be32 *)XFS_DFORK_DPTR(dip) = cpu_to_be32(rdev); +} + +/* * Values for di_flags * There should be a one-to-one correspondence between these flags and the * XFS_XFLAG_s. diff --git a/include/xfs_dir2.h b/include/xfs_dir2.h index 1d9ef96..74a3b10 100644 --- a/include/xfs_dir2.h +++ b/include/xfs_dir2.h @@ -100,7 +100,7 @@ extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, struct xfs_dabuf *bp); -extern int xfs_dir_cilookup_result(struct xfs_da_args *args, const char *name, - int len); +extern int xfs_dir_cilookup_result(struct xfs_da_args *args, + const unsigned char *name, int len); #endif /* __XFS_DIR2_H__ */ diff --git a/include/xfs_dir2_data.h b/include/xfs_dir2_data.h index b816e02..efbc290 100644 --- a/include/xfs_dir2_data.h +++ b/include/xfs_dir2_data.h @@ -38,7 +38,7 @@ struct xfs_trans; /* * Directory address space divided into sections, - * spaces separated by 32gb. + * spaces separated by 32GB. */ #define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) #define XFS_DIR2_DATA_SPACE 0 diff --git a/include/xfs_dir2_node.h b/include/xfs_dir2_node.h index dde72db..82dfe71 100644 --- a/include/xfs_dir2_node.h +++ b/include/xfs_dir2_node.h @@ -75,8 +75,6 @@ xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) return ((db) % XFS_DIR2_MAX_FREE_BESTS(mp)); } -extern void xfs_dir2_free_log_bests(struct xfs_trans *tp, struct xfs_dabuf *bp, - int first, int last); extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args, struct xfs_dabuf *lbp); extern xfs_dahash_t xfs_dir2_leafn_lasthash(struct xfs_dabuf *bp, int *count); diff --git a/include/xfs_dir2_sf.h b/include/xfs_dir2_sf.h index deecc9d..6ac44b5 100644 --- a/include/xfs_dir2_sf.h +++ b/include/xfs_dir2_sf.h @@ -34,13 +34,6 @@ struct xfs_mount; struct xfs_trans; /* - * Maximum size of a shortform directory. - */ -#define XFS_DIR2_SF_MAX_SIZE \ - (XFS_DINODE_MAX_SIZE - (uint)sizeof(xfs_dinode_core_t) - \ - (uint)sizeof(xfs_agino_t)) - -/* * Inode number stored as 8 8-bit values. */ typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t; diff --git a/include/xfs_fs.h b/include/xfs_fs.h index 47c1e93..faac5af 100644 --- a/include/xfs_fs.h +++ b/include/xfs_fs.h @@ -113,22 +113,16 @@ struct getbmapx { #define BMV_IF_ATTRFORK 0x1 /* return attr fork rather than data */ #define BMV_IF_NO_DMAPI_READ 0x2 /* Do not generate DMAPI read event */ #define BMV_IF_PREALLOC 0x4 /* rtn status BMV_OF_PREALLOC if req */ -#define BMV_IF_VALID (BMV_IF_ATTRFORK|BMV_IF_NO_DMAPI_READ|BMV_IF_PREALLOC) -#ifdef __KERNEL__ -#define BMV_IF_EXTENDED 0x40000000 /* getpmapx if set */ -#endif +#define BMV_IF_DELALLOC 0x8 /* rtn status BMV_OF_DELALLOC if req */ +#define BMV_IF_NO_HOLES 0x10 /* Do not return holes */ +#define BMV_IF_VALID \ + (BMV_IF_ATTRFORK|BMV_IF_NO_DMAPI_READ|BMV_IF_PREALLOC| \ + BMV_IF_DELALLOC|BMV_IF_NO_HOLES) -/* bmv_oflags values - returned for for each non-header segment */ +/* bmv_oflags values - returned for each non-header segment */ #define BMV_OF_PREALLOC 0x1 /* segment = unwritten pre-allocation */ - -/* Convert getbmap <-> getbmapx - move fields from p1 to p2. */ -#define GETBMAP_CONVERT(p1,p2) { \ - p2.bmv_offset = p1.bmv_offset; \ - p2.bmv_block = p1.bmv_block; \ - p2.bmv_length = p1.bmv_length; \ - p2.bmv_count = p1.bmv_count; \ - p2.bmv_entries = p1.bmv_entries; } - +#define BMV_OF_DELALLOC 0x2 /* segment = delayed allocation */ +#define BMV_OF_LAST 0x4 /* segment is the last in the file */ /* * Structure for XFS_IOC_FSSETDM. @@ -300,7 +294,7 @@ typedef struct xfs_bstat { __s32 bs_extents; /* number of extents */ __u32 bs_gen; /* generation count */ __u16 bs_projid_lo; /* lower part of project id */ -#define bs_projid bs_projid_lo +#define bs_projid bs_projid_lo /* (previously just bs_projid) */ __u16 bs_forkoff; /* inode fork offset in bytes */ __u16 bs_projid_hi; /* higher part of project id */ unsigned char bs_pad[10]; /* pad space, unused */ @@ -432,10 +426,6 @@ typedef struct xfs_handle { #define XFS_IOC_GETXFLAGS FS_IOC_GETFLAGS #define XFS_IOC_SETXFLAGS FS_IOC_SETFLAGS #define XFS_IOC_GETVERSION FS_IOC_GETVERSION -/* 32-bit compat counterparts */ -#define XFS_IOC32_GETXFLAGS FS_IOC32_GETFLAGS -#define XFS_IOC32_SETXFLAGS FS_IOC32_SETFLAGS -#define XFS_IOC32_GETVERSION FS_IOC32_GETVERSION /* * ioctl commands that replace IRIX fcntl()'s @@ -484,6 +474,8 @@ typedef struct xfs_handle { #define XFS_IOC_ERROR_INJECTION _IOW ('X', 116, struct xfs_error_injection) #define XFS_IOC_ERROR_CLEARALL _IOW ('X', 117, struct xfs_error_injection) /* XFS_IOC_ATTRCTL_BY_HANDLE -- deprecated 118 */ +/* XFS_IOC_FREEZE -- FIFREEZE 119 */ +/* XFS_IOC_THAW -- FITHAW 120 */ #define XFS_IOC_FREEZE _IOWR('X', 119, int) #define XFS_IOC_THAW _IOWR('X', 120, int) #define XFS_IOC_FSSETDM_BY_HANDLE _IOW ('X', 121, struct xfs_fsop_setdm_handlereq) diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h index ccf554a..bb53854 100644 --- a/include/xfs_ialloc.h +++ b/include/xfs_ialloc.h @@ -20,6 +20,7 @@ struct xfs_buf; struct xfs_dinode; +struct xfs_imap; struct xfs_mount; struct xfs_trans; @@ -38,7 +39,6 @@ struct xfs_trans; /* * Make an inode pointer out of the buffer/offset. */ -#define XFS_MAKE_IPTR(mp,b,o) xfs_make_iptr(mp,b,o) static inline struct xfs_dinode * xfs_make_iptr(struct xfs_mount *mp, struct xfs_buf *b, int o) { @@ -49,7 +49,6 @@ xfs_make_iptr(struct xfs_mount *mp, struct xfs_buf *b, int o) /* * Find a free (set) bit in the inode bitmask. */ -#define XFS_IALLOC_FIND_FREE(fp) xfs_ialloc_find_free(fp) static inline int xfs_ialloc_find_free(xfs_inofree_t *fp) { return xfs_lowbit64(*fp); @@ -104,17 +103,14 @@ xfs_difree( xfs_ino_t *first_ino); /* first inode in deleted cluster */ /* - * Return the location of the inode in bno/len/off, - * for mapping it into a buffer. + * Return the location of the inode in imap, for mapping it into a buffer. */ int -xfs_dilocate( +xfs_imap( struct xfs_mount *mp, /* file system mount structure */ struct xfs_trans *tp, /* transaction pointer */ xfs_ino_t ino, /* inode to locate */ - xfs_fsblock_t *bno, /* output: block containing inode */ - int *len, /* output: num blocks in cluster*/ - int *off, /* output: index in block of inode */ + struct xfs_imap *imap, /* location map structure */ uint flags); /* flags for inode btree lookup */ /* @@ -154,23 +150,15 @@ xfs_ialloc_pagi_init( xfs_agnumber_t agno); /* allocation group number */ /* - * Lookup the first record greater than or equal to ino - * in the btree given by cur. + * Lookup a record by ino in the btree given by cur. */ -int xfs_inobt_lookup_ge(struct xfs_btree_cur *cur, xfs_agino_t ino, - __int32_t fcnt, xfs_inofree_t free, int *stat); - -/* - * Lookup the first record less than or equal to ino - * in the btree given by cur. - */ -int xfs_inobt_lookup_le(struct xfs_btree_cur *cur, xfs_agino_t ino, - __int32_t fcnt, xfs_inofree_t free, int *stat); +int xfs_inobt_lookup(struct xfs_btree_cur *cur, xfs_agino_t ino, + xfs_lookup_t dir, int *stat); /* * Get the data from the pointed-to record. */ -extern int xfs_inobt_get_rec(struct xfs_btree_cur *cur, xfs_agino_t *ino, - __int32_t *fcnt, xfs_inofree_t *free, int *stat); +extern int xfs_inobt_get_rec(struct xfs_btree_cur *cur, + xfs_inobt_rec_incore_t *rec, int *stat); #endif /* __XFS_IALLOC_H__ */ diff --git a/include/xfs_ialloc_btree.h b/include/xfs_ialloc_btree.h index 37e5dd0..f782ad0 100644 --- a/include/xfs_ialloc_btree.h +++ b/include/xfs_ialloc_btree.h @@ -32,15 +32,14 @@ struct xfs_mount; #define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ typedef __uint64_t xfs_inofree_t; -#define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) +#define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) #define XFS_INODES_PER_CHUNK_LOG (XFS_NBBYLOG + 3) -#define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) +#define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) +#define XFS_INOBT_MASK(i) ((xfs_inofree_t)1 << (i)) -#define XFS_INOBT_MASKN(i,n) xfs_inobt_maskn(i,n) static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) { - return (((n) >= XFS_INODES_PER_CHUNK ? \ - (xfs_inofree_t)0 : ((xfs_inofree_t)1 << (n))) - 1) << (i); + return ((n >= XFS_INODES_PER_CHUNK ? 0 : XFS_INOBT_MASK(n)) - 1) << i; } /* @@ -70,20 +69,6 @@ typedef struct xfs_inobt_key { typedef __be32 xfs_inobt_ptr_t; /* - * Bit manipulations for ir_free. - */ -#define XFS_INOBT_MASK(i) ((xfs_inofree_t)1 << (i)) -#define XFS_INOBT_IS_FREE(rp,i) \ - (((rp)->ir_free & XFS_INOBT_MASK(i)) != 0) -#define XFS_INOBT_SET_FREE(rp,i) ((rp)->ir_free |= XFS_INOBT_MASK(i)) -#define XFS_INOBT_CLR_FREE(rp,i) ((rp)->ir_free &= ~XFS_INOBT_MASK(i)) - -/* - * Maximum number of inode btree levels. - */ -#define XFS_IN_MAXLEVELS(mp) ((mp)->m_in_maxlevels) - -/* * block numbers in the AG. */ #define XFS_IBT_BLOCK(mp) ((xfs_agblock_t)(XFS_CNT_BLOCK(mp) + 1)) diff --git a/include/xfs_imap.h b/include/xfs_imap.h deleted file mode 100644 index f9ce628..0000000 --- a/include/xfs_imap.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2000,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_IMAP_H__ -#define __XFS_IMAP_H__ - -/* - * This is the structure passed to xfs_imap() to map - * an inode number to its on disk location. - */ -typedef struct xfs_imap { - xfs_daddr_t im_blkno; /* starting BB of inode chunk */ - uint im_len; /* length in BBs of inode chunk */ - xfs_agblock_t im_agblkno; /* logical block of inode chunk in ag */ - ushort im_ioffset; /* inode offset in block in "inodes" */ - ushort im_boffset; /* inode offset in block in bytes */ -} xfs_imap_t; - -struct xfs_mount; -struct xfs_trans; -int xfs_imap(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, - xfs_imap_t *, uint); - -#endif /* __XFS_IMAP_H__ */ diff --git a/include/xfs_inode.h b/include/xfs_inode.h index 7e6fc91..ca56544 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -18,8 +18,8 @@ #ifndef __XFS_INODE_H__ #define __XFS_INODE_H__ +struct posix_acl; struct xfs_dinode; -struct xfs_dinode_core; struct xfs_inode; /* @@ -84,6 +84,16 @@ typedef struct xfs_ifork { } xfs_ifork_t; /* + * Inode location information. Stored in the inode and passed to + * xfs_imap_to_bp() to get a buffer and dinode for a given inode. + */ +struct xfs_imap { + xfs_daddr_t im_blkno; /* starting BB of inode chunk */ + ushort im_len; /* length in BBs of inode chunk */ + ushort im_boffset; /* inode offset in block in bytes */ +}; + +/* * This is the xfs in-core inode structure. * Most of the on-disk inode is embedded in the i_d field. * @@ -112,8 +122,8 @@ typedef struct xfs_ictimestamp { } xfs_ictimestamp_t; /* - * NOTE: This structure must be kept identical to struct xfs_dinode_core - * in xfs_dinode.h except for the endianess annotations. + * NOTE: This structure must be kept identical to struct xfs_dinode + * in xfs_dinode.h except for the endianness annotations. */ typedef struct xfs_icdinode { __uint16_t di_magic; /* inode magic # = XFS_DINODE_MAGIC */ @@ -159,12 +169,6 @@ typedef struct xfs_icdinode { #define XFS_IFEXTIREC 0x08 /* Indirection array of extent blocks */ /* - * Flags for xfs_itobp(), xfs_imap() and xfs_dilocate(). - */ -#define XFS_IMAP_LOOKUP 0x1 -#define XFS_IMAP_BULKSTAT 0x2 - -/* * Fork handling. */ @@ -204,7 +208,6 @@ typedef struct xfs_icdinode { ((ip)->i_d.di_nextents = (n)) : \ ((ip)->i_d.di_anextents = (n))) - /* * Project quota id helpers (previously projid was 16bit only * and using two 16bit values to hold new 32bit projid was choosen @@ -227,8 +230,6 @@ xfs_set_projid(struct xfs_icdinode *i_d, #ifdef __KERNEL__ struct bhv_desc; -struct cred; -struct ktrace; struct xfs_buf; struct xfs_bmap_free; struct xfs_bmbt_irec; @@ -237,41 +238,21 @@ struct xfs_mount; struct xfs_trans; struct xfs_dquot; -#if defined(XFS_ILOCK_TRACE) -#define XFS_ILOCK_KTRACE_SIZE 32 -extern ktrace_t *xfs_ilock_trace_buf; -extern void xfs_ilock_trace(struct xfs_inode *, int, unsigned int, inst_t *); -#else -#define xfs_ilock_trace(i,n,f,ra) -#endif - typedef struct dm_attrs_s { __uint32_t da_dmevmask; /* DMIG event mask */ __uint16_t da_dmstate; /* DMIG state info */ __uint16_t da_pad; /* DMIG extra padding */ } dm_attrs_t; -typedef struct { - struct xfs_inode *ip_mnext; /* next inode in mount list */ - struct xfs_inode *ip_mprev; /* ptr to prev inode */ - struct xfs_mount *ip_mount; /* fs mount struct ptr */ -} xfs_iptr_t; - typedef struct xfs_inode { /* Inode linking and identification information. */ - struct xfs_inode *i_mnext; /* next inode in mount list */ - struct xfs_inode *i_mprev; /* ptr to prev inode */ struct xfs_mount *i_mount; /* fs mount struct ptr */ - struct list_head i_reclaim; /* reclaim list */ - struct inode *i_vnode; /* vnode backpointer */ struct xfs_dquot *i_udquot; /* user dquot */ struct xfs_dquot *i_gdquot; /* group dquot */ /* Inode location stuff */ xfs_ino_t i_ino; /* inode number (agno/agino)*/ - xfs_daddr_t i_blkno; /* blkno of inode buffer */ - ushort i_len; /* len of inode buffer */ - ushort i_boffset; /* off of inode in buffer */ + struct xfs_imap i_imap; /* location for xfs_imap() */ /* Extent information. */ xfs_ifork_t *i_afp; /* attribute fork pointer */ @@ -289,8 +270,6 @@ typedef struct xfs_inode { /* Miscellaneous state. */ unsigned short i_flags; /* see defined flags below */ unsigned char i_update_core; /* timestamps/size is dirty */ - unsigned char i_update_size; /* di_size field is dirty */ - unsigned int i_gen; /* generation count */ unsigned int i_delayed_blks; /* count of delay alloc blks */ xfs_icdinode_t i_d; /* most of ondisk inode */ @@ -298,25 +277,9 @@ typedef struct xfs_inode { xfs_fsize_t i_size; /* in-memory size */ xfs_fsize_t i_new_size; /* size when write completes */ atomic_t i_iocount; /* outstanding I/O count */ - /* Trace buffers per inode. */ -#ifdef XFS_INODE_TRACE - struct ktrace *i_trace; /* general inode trace */ -#endif -#ifdef XFS_BMAP_TRACE - struct ktrace *i_xtrace; /* inode extent list trace */ -#endif -#ifdef XFS_BTREE_TRACE - struct ktrace *i_btrace; /* inode bmap btree trace */ -#endif -#ifdef XFS_RW_TRACE - struct ktrace *i_rwtrace; /* inode read/write trace */ -#endif -#ifdef XFS_ILOCK_TRACE - struct ktrace *i_lock_trace; /* inode lock/unlock trace */ -#endif -#ifdef XFS_DIR2_TRACE - struct ktrace *i_dir_trace; /* inode directory trace */ -#endif + + /* VFS inode */ + struct inode i_vnode; /* embedded VFS inode */ } xfs_inode_t; #define XFS_ISIZE(ip) (((ip)->i_d.di_mode & S_IFMT) == S_IFREG) ? \ @@ -325,13 +288,13 @@ typedef struct xfs_inode { /* Convert from vfs inode to xfs inode */ static inline struct xfs_inode *XFS_I(struct inode *inode) { - return (struct xfs_inode *)inode->i_private; + return container_of(inode, struct xfs_inode, i_vnode); } /* convert from xfs inode to vfs inode */ static inline struct inode *VFS_I(struct xfs_inode *ip) { - return (struct inode *)ip->i_vnode; + return &ip->i_vnode; } /* @@ -389,6 +352,25 @@ xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned short flags) } /* + * Project quota id helpers (previously projid was 16bit only + * and using two 16bit values to hold new 32bit projid was choosen + * to retain compatibility with "old" filesystems). + */ +static inline prid_t +xfs_get_projid(struct xfs_inode *ip) +{ + return (prid_t)ip->i_d.di_projid_hi << 16 | ip->i_d.di_projid_lo; +} + +static inline void +xfs_set_projid(struct xfs_inode *ip, + prid_t projid) +{ + ip->i_d.di_projid_hi = (__uint16_t) (projid >> 16); + ip->i_d.di_projid_lo = (__uint16_t) (projid & 0xffff); +} + +/* * Manage the i_flush queue embedded in the inode. This completion * queue synchronizes processes attempting to flush the in-core * inode back to disk. @@ -411,17 +393,13 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) /* * In-core inode flags. */ -#define XFS_IGRIO 0x0001 /* inode used for guaranteed rate i/o */ -#define XFS_IUIOSZ 0x0002 /* inode i/o sizes have been explicitly set */ -#define XFS_IQUIESCE 0x0004 /* we have started quiescing for this inode */ -#define XFS_IRECLAIM 0x0008 /* we have started reclaiming this inode */ -#define XFS_ISTALE 0x0010 /* inode has been staled */ -#define XFS_IRECLAIMABLE 0x0020 /* inode can be reclaimed */ -#define XFS_INEW 0x0040 -#define XFS_IFILESTREAM 0x0080 /* inode is in a filestream directory */ -#define XFS_IMODIFIED 0x0100 /* XFS inode state possibly differs */ - /* to the Linux inode state. */ -#define XFS_ITRUNCATED 0x0200 /* 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. @@ -437,6 +415,14 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) #define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \ | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED) +#define XFS_LOCK_FLAGS \ + { XFS_IOLOCK_EXCL, "IOLOCK_EXCL" }, \ + { XFS_IOLOCK_SHARED, "IOLOCK_SHARED" }, \ + { XFS_ILOCK_EXCL, "ILOCK_EXCL" }, \ + { XFS_ILOCK_SHARED, "ILOCK_SHARED" }, \ + { XFS_IUNLOCK_NONOTIFY, "IUNLOCK_NONOTIFY" } + + /* * Flags for lockdep annotations. * @@ -470,15 +456,7 @@ 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) -/* - * Flags for xfs_iflush() - */ -#define XFS_IFLUSH_DELWRI_ELSE_SYNC 1 -#define XFS_IFLUSH_DELWRI_ELSE_ASYNC 2 -#define XFS_IFLUSH_SYNC 3 -#define XFS_IFLUSH_ASYNC 4 -#define XFS_IFLUSH_DELWRI 5 -#define XFS_IFLUSH_ASYNC_NOBLOCK 6 +extern struct lock_class_key xfs_iolock_reclaimable; /* * Flags for xfs_itruncate_start(). @@ -486,6 +464,10 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) #define XFS_ITRUNC_DEFINITE 0x1 #define XFS_ITRUNC_MAYBE 0x2 +#define XFS_ITRUNC_FLAGS \ + { XFS_ITRUNC_DEFINITE, "DEFINITE" }, \ + { XFS_ITRUNC_MAYBE, "MAYBE" } + /* * For multiple groups support: if S_ISGID bit is set in the parent * directory, group of new file is set to that of the parent, and @@ -496,22 +478,10 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) ((pip)->i_d.di_mode & S_ISGID)) /* - * Flags for xfs_iget() - */ -#define XFS_IGET_CREATE 0x1 -#define XFS_IGET_BULKSTAT 0x2 - -/* * xfs_iget.c prototypes. */ -void xfs_ihash_init(struct xfs_mount *); -void xfs_ihash_free(struct xfs_mount *); -xfs_inode_t *xfs_inode_incore(struct xfs_mount *, xfs_ino_t, - struct xfs_trans *); int xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, - uint, uint, xfs_inode_t **, xfs_daddr_t); -void xfs_iput(xfs_inode_t *, uint); -void xfs_iput_new(xfs_inode_t *, uint); + uint, uint, xfs_inode_t **); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); void xfs_iunlock(xfs_inode_t *, uint); @@ -519,18 +489,14 @@ void xfs_ilock_demote(xfs_inode_t *, uint); int xfs_isilocked(xfs_inode_t *, uint); uint xfs_ilock_map_shared(xfs_inode_t *); void xfs_iunlock_map_shared(xfs_inode_t *, uint); -void xfs_ireclaim(xfs_inode_t *); -int xfs_finish_reclaim(xfs_inode_t *, int, int); -int xfs_finish_reclaim_all(struct xfs_mount *, int); +void xfs_inode_free(struct xfs_inode *ip); /* * xfs_inode.c prototypes. */ -int xfs_iread(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, - xfs_inode_t **, xfs_daddr_t, uint); int xfs_ialloc(struct xfs_trans *, xfs_inode_t *, mode_t, - xfs_nlink_t, xfs_dev_t, struct cred *, prid_t, - int, struct xfs_buf **, boolean_t *, xfs_inode_t **); + xfs_nlink_t, xfs_dev_t, prid_t, int, + struct xfs_buf **, boolean_t *, xfs_inode_t **); uint xfs_ip2xflags(struct xfs_inode *); uint xfs_dic2xflags(struct xfs_dinode *); @@ -541,31 +507,49 @@ int xfs_itruncate_finish(struct xfs_trans **, xfs_inode_t *, xfs_fsize_t, int, int); int xfs_iunlink(struct xfs_trans *, xfs_inode_t *); -struct xfs_inode * xfs_inode_alloc(struct xfs_mount *, xfs_ino_t); -void xfs_idestroy(xfs_inode_t *); -void xfs_iextract(xfs_inode_t *); void xfs_iext_realloc(xfs_inode_t *, int, int); -void xfs_ipin(xfs_inode_t *); -void xfs_iunpin(xfs_inode_t *); +void xfs_iunpin_wait(xfs_inode_t *); int xfs_iflush(xfs_inode_t *, uint); -void xfs_iflush_all(struct xfs_mount *); -void xfs_ichgtime(xfs_inode_t *, int); -xfs_fsize_t xfs_file_last_byte(xfs_inode_t *); void xfs_lock_inodes(xfs_inode_t **, int, uint); void xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint); -void xfs_synchronize_atime(xfs_inode_t *); +void xfs_synchronize_times(xfs_inode_t *); +void xfs_mark_inode_dirty(xfs_inode_t *); void xfs_mark_inode_dirty_sync(xfs_inode_t *); +#define IHOLD(ip) \ +do { \ + ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \ + ihold(VFS_I(ip)); \ + trace_xfs_ihold(ip, _THIS_IP_); \ +} while (0) + +#define IRELE(ip) \ +do { \ + trace_xfs_irele(ip, _THIS_IP_); \ + iput(VFS_I(ip)); \ +} while (0) + #endif /* __KERNEL__ */ +/* + * Flags for xfs_iget() + */ +#define XFS_IGET_CREATE 0x1 +#define XFS_IGET_UNTRUSTED 0x2 + +int xfs_inotobp(struct xfs_mount *, struct xfs_trans *, + xfs_ino_t, struct xfs_dinode **, + struct xfs_buf **, int *, uint); int xfs_itobp(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, struct xfs_dinode **, - struct xfs_buf **, xfs_daddr_t, uint, uint); -void xfs_dinode_from_disk(struct xfs_icdinode *, - struct xfs_dinode_core *); -void xfs_dinode_to_disk(struct xfs_dinode_core *, + struct xfs_buf **, uint); +int xfs_iread(struct xfs_mount *, struct xfs_trans *, + struct xfs_inode *, uint); +void xfs_dinode_to_disk(struct xfs_dinode *, struct xfs_icdinode *); +void xfs_dinode_from_disk(struct xfs_icdinode *, + struct xfs_dinode *); void xfs_idestroy_fork(struct xfs_inode *, int); void xfs_idata_realloc(struct xfs_inode *, int, int); void xfs_iroot_realloc(struct xfs_inode *, int, int); @@ -573,17 +557,15 @@ int xfs_iread_extents(struct xfs_trans *, struct xfs_inode *, int); int xfs_iextents_copy(struct xfs_inode *, xfs_bmbt_rec_t *, int); xfs_bmbt_rec_host_t *xfs_iext_get_ext(xfs_ifork_t *, xfs_extnum_t); -void xfs_iext_insert(xfs_ifork_t *, xfs_extnum_t, xfs_extnum_t, - xfs_bmbt_irec_t *); +void xfs_iext_insert(struct xfs_inode *, xfs_extnum_t, xfs_extnum_t, + xfs_bmbt_irec_t *, int); void xfs_iext_add(xfs_ifork_t *, xfs_extnum_t, int); void xfs_iext_add_indirect_multi(xfs_ifork_t *, int, xfs_extnum_t, int); -void xfs_iext_remove(xfs_ifork_t *, xfs_extnum_t, int); +void xfs_iext_remove(struct xfs_inode *, xfs_extnum_t, int, int); void xfs_iext_remove_inline(xfs_ifork_t *, xfs_extnum_t, int); void xfs_iext_remove_direct(xfs_ifork_t *, xfs_extnum_t, int); void xfs_iext_remove_indirect(xfs_ifork_t *, xfs_extnum_t, int); void xfs_iext_realloc_direct(xfs_ifork_t *, int); -void xfs_iext_realloc_indirect(xfs_ifork_t *, int); -void xfs_iext_indirect_to_direct(xfs_ifork_t *); void xfs_iext_direct_to_inline(xfs_ifork_t *, xfs_extnum_t); void xfs_iext_inline_to_direct(xfs_ifork_t *, int); void xfs_iext_destroy(xfs_ifork_t *); diff --git a/include/xfs_inode_item.h b/include/xfs_inode_item.h index 81dcf94..d3dee61 100644 --- a/include/xfs_inode_item.h +++ b/include/xfs_inode_item.h @@ -103,26 +103,16 @@ typedef struct xfs_inode_log_format_64 { XFS_ILOG_ADATA | XFS_ILOG_AEXT | \ XFS_ILOG_ABROOT) -#define XFS_ILI_HOLD 0x1 -#define XFS_ILI_IOLOCKED_EXCL 0x2 -#define XFS_ILI_IOLOCKED_SHARED 0x4 - -#define XFS_ILI_IOLOCKED_ANY (XFS_ILI_IOLOCKED_EXCL | XFS_ILI_IOLOCKED_SHARED) - - -#define XFS_ILOG_FBROOT(w) xfs_ilog_fbroot(w) static inline int xfs_ilog_fbroot(int w) { return (w == XFS_DATA_FORK ? XFS_ILOG_DBROOT : XFS_ILOG_ABROOT); } -#define XFS_ILOG_FEXT(w) xfs_ilog_fext(w) static inline int xfs_ilog_fext(int w) { return (w == XFS_DATA_FORK ? XFS_ILOG_DEXT : XFS_ILOG_AEXT); } -#define XFS_ILOG_FDATA(w) xfs_ilog_fdata(w) static inline int xfs_ilog_fdata(int w) { return (w == XFS_DATA_FORK ? XFS_ILOG_DDATA : XFS_ILOG_ADATA); @@ -131,7 +121,7 @@ static inline int xfs_ilog_fdata(int w) #ifdef __KERNEL__ struct xfs_buf; -struct xfs_bmbt_rec_64; +struct xfs_bmbt_rec; struct xfs_inode; struct xfs_mount; @@ -141,21 +131,13 @@ typedef struct xfs_inode_log_item { struct xfs_inode *ili_inode; /* inode ptr */ xfs_lsn_t ili_flush_lsn; /* lsn at last flush */ xfs_lsn_t ili_last_lsn; /* lsn at last transaction */ - unsigned short ili_ilock_recur; /* lock recursion count */ - unsigned short ili_iolock_recur; /* lock recursion count */ - unsigned short ili_flags; /* misc flags */ + unsigned short ili_lock_flags; /* lock flags */ unsigned short ili_logged; /* flushed logged data */ unsigned int ili_last_fields; /* fields when flushed */ - struct xfs_bmbt_rec_64 *ili_extents_buf; /* array of logged + struct xfs_bmbt_rec *ili_extents_buf; /* array of logged data exts */ - struct xfs_bmbt_rec_64 *ili_aextents_buf; /* array of logged + struct xfs_bmbt_rec *ili_aextents_buf; /* array of logged attr exts */ - unsigned int ili_pushbuf_flag; /* one bit used in push_ail */ - -#ifdef DEBUG - uint64_t ili_push_owner; /* one who sets pushbuf_flag - above gets to push the buf */ -#endif #ifdef XFS_TRANS_DEBUG int ili_root_size; char *ili_orig_root; @@ -173,8 +155,8 @@ static inline int xfs_inode_clean(xfs_inode_t *ip) extern void xfs_inode_item_init(struct xfs_inode *, struct xfs_mount *); extern void xfs_inode_item_destroy(struct xfs_inode *); -extern void xfs_iflush_done(struct xfs_buf *, xfs_inode_log_item_t *); -extern void xfs_istale_done(struct xfs_buf *, xfs_inode_log_item_t *); +extern void xfs_iflush_done(struct xfs_buf *, struct xfs_log_item *); +extern void xfs_istale_done(struct xfs_buf *, struct xfs_log_item *); extern void xfs_iflush_abort(struct xfs_inode *); extern int xfs_inode_item_format_convert(xfs_log_iovec_t *, xfs_inode_log_format_t *); diff --git a/include/xfs_inum.h b/include/xfs_inum.h index 7a28191..b8e4ee4 100644 --- a/include/xfs_inum.h +++ b/include/xfs_inum.h @@ -72,7 +72,6 @@ struct xfs_mount; #if XFS_BIG_INUMS #define XFS_MAXINUMBER ((xfs_ino_t)((1ULL << 56) - 1ULL)) -#define XFS_INO64_OFFSET ((xfs_ino_t)(1ULL << 32)) #else #define XFS_MAXINUMBER ((xfs_ino_t)((1ULL << 32) - 1ULL)) #endif diff --git a/include/xfs_mount.h b/include/xfs_mount.h index ff200d1..94a02e1 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -18,7 +18,6 @@ #ifndef __XFS_MOUNT_H__ #define __XFS_MOUNT_H__ - typedef struct xfs_trans_reservations { uint tr_write; /* extent alloc trans */ uint tr_itruncate; /* truncate trans */ @@ -45,14 +44,15 @@ typedef struct xfs_trans_reservations { #ifndef __KERNEL__ -#define XFS_DADDR_TO_AGNO(mp,d) \ +#define xfs_daddr_to_agno(mp,d) \ ((xfs_agnumber_t)(XFS_BB_TO_FSBT(mp, d) / (mp)->m_sb.sb_agblocks)) -#define XFS_DADDR_TO_AGBNO(mp,d) \ +#define xfs_daddr_to_agbno(mp,d) \ ((xfs_agblock_t)(XFS_BB_TO_FSBT(mp, d) % (mp)->m_sb.sb_agblocks)) #else /* __KERNEL__ */ -struct cred; +#include "xfs_sync.h" + struct log; struct xfs_mount_args; struct xfs_inode; @@ -62,133 +62,9 @@ struct xfs_extdelta; struct xfs_swapext; struct xfs_mru_cache; struct xfs_nameops; - -/* - * Prototypes and functions for the Data Migration subsystem. - */ - -typedef int (*xfs_send_data_t)(int, struct xfs_inode *, - xfs_off_t, size_t, int, int *); -typedef int (*xfs_send_mmap_t)(struct vm_area_struct *, uint); -typedef int (*xfs_send_destroy_t)(struct xfs_inode *, dm_right_t); -typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct xfs_mount *, - struct xfs_inode *, dm_right_t, - struct xfs_inode *, dm_right_t, - const char *, const char *, mode_t, int, int); -typedef int (*xfs_send_mount_t)(struct xfs_mount *, dm_right_t, - char *, char *); -typedef void (*xfs_send_unmount_t)(struct xfs_mount *, struct xfs_inode *, - dm_right_t, mode_t, int, int); - -typedef struct xfs_dmops { - xfs_send_data_t xfs_send_data; - xfs_send_mmap_t xfs_send_mmap; - xfs_send_destroy_t xfs_send_destroy; - xfs_send_namesp_t xfs_send_namesp; - xfs_send_mount_t xfs_send_mount; - xfs_send_unmount_t xfs_send_unmount; -} xfs_dmops_t; - -#define XFS_SEND_DATA(mp, ev,ip,off,len,fl,lock) \ - (*(mp)->m_dm_ops->xfs_send_data)(ev,ip,off,len,fl,lock) -#define XFS_SEND_MMAP(mp, vma,fl) \ - (*(mp)->m_dm_ops->xfs_send_mmap)(vma,fl) -#define XFS_SEND_DESTROY(mp, ip,right) \ - (*(mp)->m_dm_ops->xfs_send_destroy)(ip,right) -#define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ - (*(mp)->m_dm_ops->xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl) -#define XFS_SEND_PREUNMOUNT(mp,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ - (*(mp)->m_dm_ops->xfs_send_namesp)(DM_EVENT_PREUNMOUNT,mp,b1,r1,b2,r2,n1,n2,mode,rval,fl) -#define XFS_SEND_MOUNT(mp,right,path,name) \ - (*(mp)->m_dm_ops->xfs_send_mount)(mp,right,path,name) -#define XFS_SEND_UNMOUNT(mp, ip,right,mode,rval,fl) \ - (*(mp)->m_dm_ops->xfs_send_unmount)(mp,ip,right,mode,rval,fl) - - -/* - * Prototypes and functions for the Quota Management subsystem. - */ - -struct xfs_dquot; -struct xfs_dqtrxops; +struct xfs_ail; struct xfs_quotainfo; -typedef int (*xfs_qminit_t)(struct xfs_mount *, uint *, uint *); -typedef int (*xfs_qmmount_t)(struct xfs_mount *, uint, uint); -typedef int (*xfs_qmunmount_t)(struct xfs_mount *); -typedef void (*xfs_qmdone_t)(struct xfs_mount *); -typedef void (*xfs_dqrele_t)(struct xfs_dquot *); -typedef int (*xfs_dqattach_t)(struct xfs_inode *, uint); -typedef void (*xfs_dqdetach_t)(struct xfs_inode *); -typedef int (*xfs_dqpurgeall_t)(struct xfs_mount *, uint); -typedef int (*xfs_dqvopalloc_t)(struct xfs_mount *, - struct xfs_inode *, uid_t, gid_t, prid_t, uint, - struct xfs_dquot **, struct xfs_dquot **); -typedef void (*xfs_dqvopcreate_t)(struct xfs_trans *, struct xfs_inode *, - struct xfs_dquot *, struct xfs_dquot *); -typedef int (*xfs_dqvoprename_t)(struct xfs_inode **); -typedef struct xfs_dquot * (*xfs_dqvopchown_t)( - struct xfs_trans *, struct xfs_inode *, - struct xfs_dquot **, struct xfs_dquot *); -typedef int (*xfs_dqvopchownresv_t)(struct xfs_trans *, struct xfs_inode *, - struct xfs_dquot *, struct xfs_dquot *, uint); -typedef void (*xfs_dqstatvfs_t)(struct xfs_inode *, bhv_statvfs_t *); -typedef int (*xfs_dqsync_t)(struct xfs_mount *, int flags); -typedef int (*xfs_quotactl_t)(struct xfs_mount *, int, int, xfs_caddr_t); - -typedef struct xfs_qmops { - xfs_qminit_t xfs_qminit; - xfs_qmdone_t xfs_qmdone; - xfs_qmmount_t xfs_qmmount; - xfs_qmunmount_t xfs_qmunmount; - xfs_dqrele_t xfs_dqrele; - xfs_dqattach_t xfs_dqattach; - xfs_dqdetach_t xfs_dqdetach; - xfs_dqpurgeall_t xfs_dqpurgeall; - xfs_dqvopalloc_t xfs_dqvopalloc; - xfs_dqvopcreate_t xfs_dqvopcreate; - xfs_dqvoprename_t xfs_dqvoprename; - xfs_dqvopchown_t xfs_dqvopchown; - xfs_dqvopchownresv_t xfs_dqvopchownresv; - xfs_dqstatvfs_t xfs_dqstatvfs; - xfs_dqsync_t xfs_dqsync; - xfs_quotactl_t xfs_quotactl; - struct xfs_dqtrxops *xfs_dqtrxops; -} xfs_qmops_t; - -#define XFS_QM_INIT(mp, mnt, fl) \ - (*(mp)->m_qm_ops->xfs_qminit)(mp, mnt, fl) -#define XFS_QM_MOUNT(mp, mnt, fl) \ - (*(mp)->m_qm_ops->xfs_qmmount)(mp, mnt, fl) -#define XFS_QM_UNMOUNT(mp) \ - (*(mp)->m_qm_ops->xfs_qmunmount)(mp) -#define XFS_QM_DONE(mp) \ - (*(mp)->m_qm_ops->xfs_qmdone)(mp) -#define XFS_QM_DQRELE(mp, dq) \ - (*(mp)->m_qm_ops->xfs_dqrele)(dq) -#define XFS_QM_DQATTACH(mp, ip, fl) \ - (*(mp)->m_qm_ops->xfs_dqattach)(ip, fl) -#define XFS_QM_DQDETACH(mp, ip) \ - (*(mp)->m_qm_ops->xfs_dqdetach)(ip) -#define XFS_QM_DQPURGEALL(mp, fl) \ - (*(mp)->m_qm_ops->xfs_dqpurgeall)(mp, fl) -#define XFS_QM_DQVOPALLOC(mp, ip, uid, gid, prid, fl, dq1, dq2) \ - (*(mp)->m_qm_ops->xfs_dqvopalloc)(mp, ip, uid, gid, prid, fl, dq1, dq2) -#define XFS_QM_DQVOPCREATE(mp, tp, ip, dq1, dq2) \ - (*(mp)->m_qm_ops->xfs_dqvopcreate)(tp, ip, dq1, dq2) -#define XFS_QM_DQVOPRENAME(mp, ip) \ - (*(mp)->m_qm_ops->xfs_dqvoprename)(ip) -#define XFS_QM_DQVOPCHOWN(mp, tp, ip, dqp, dq) \ - (*(mp)->m_qm_ops->xfs_dqvopchown)(tp, ip, dqp, dq) -#define XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, dq1, dq2, fl) \ - (*(mp)->m_qm_ops->xfs_dqvopchownresv)(tp, ip, dq1, dq2, fl) -#define XFS_QM_DQSTATVFS(ip, statp) \ - (*(ip)->i_mount->m_qm_ops->xfs_dqstatvfs)(ip, statp) -#define XFS_QM_DQSYNC(mp, flags) \ - (*(mp)->m_qm_ops->xfs_dqsync)(mp, flags) -#define XFS_QM_QUOTACTL(mp, cmd, id, addr) \ - (*(mp)->m_qm_ops->xfs_quotactl)(mp, cmd, id, addr) - #ifdef HAVE_PERCPU_SB /* @@ -214,6 +90,8 @@ 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) @@ -221,20 +99,24 @@ extern void xfs_icsb_sync_counters_locked(struct xfs_mount *, int); #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_ail { - struct list_head xa_ail; - uint xa_gen; - struct task_struct *xa_task; - xfs_lsn_t xa_target; -} xfs_ail_t; +/* 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 */ - spinlock_t m_ail_lock; /* fs AIL mutex */ - xfs_ail_t m_ail; /* fs active log item list */ + struct xfs_ail *m_ail; /* fs active log item list */ xfs_sb_t m_sb; /* copy of fs superblock */ spinlock_t m_sb_lock; /* sb counter lock */ struct xfs_buf *m_sb_bp; /* buffer for superblock */ @@ -247,10 +129,6 @@ typedef struct xfs_mount { xfs_agnumber_t m_agirotor; /* last ag dir inode alloced */ spinlock_t m_agirotor_lock;/* .. and lock protecting it */ xfs_agnumber_t m_maxagi; /* highest inode alloc group */ - struct xfs_inode *m_inodes; /* active inode list */ - struct list_head m_del_inodes; /* inodes to reclaim */ - mutex_t m_ilock; /* inode list mutex */ - uint m_ireclaims; /* count of calls to reclaim*/ uint m_readio_log; /* min read size log bytes */ uint m_readio_blocks; /* min read size blocks */ uint m_writeio_log; /* min write size log bytes */ @@ -283,19 +161,17 @@ typedef struct xfs_mount { uint m_inobt_mnr[2]; /* min inobt btree records */ uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */ uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ - uint m_in_maxlevels; /* XFS_IN_MAXLEVELS */ - struct xfs_perag *m_perag; /* per-ag accounting info */ - struct rw_semaphore m_peraglock; /* lock for m_perag (pointer) */ + uint m_in_maxlevels; /* max inobt btree levels. */ + struct radix_tree_root m_perag_tree; /* per-ag accounting info */ + spinlock_t m_perag_lock; /* lock for m_perag_tree */ struct mutex m_growlock; /* growfs mutex */ int m_fixedfsid[2]; /* unchanged for life of FS */ uint m_dmevmask; /* DMI events for this FS */ __uint64_t m_flags; /* global mount flags */ - uint m_attroffset; /* inode attribute offset */ uint m_dir_node_ents; /* #entries in a dir danode */ uint m_attr_node_ents; /* #entries in attr danode */ int m_ialloc_inos; /* inodes in inode allocation */ int m_ialloc_blks; /* blocks in inode allocation */ - int m_litino; /* size of inode union area */ int m_inoalign_mask;/* mask sb_inoalignmt if used */ uint m_qflags; /* quota status flags */ xfs_trans_reservations_t m_reservations;/* precomputed res values */ @@ -303,17 +179,12 @@ typedef struct xfs_mount { __uint64_t m_maxioffset; /* maximum inode offset */ __uint64_t m_resblks; /* total reserved blocks */ __uint64_t m_resblks_avail;/* available reserved blocks */ -#if XFS_BIG_INUMS - xfs_ino_t m_inoadd; /* add value for ino64_offset */ -#endif + __uint64_t m_resblks_save; /* reserved blks @ remount,ro */ int m_dalign; /* stripe unit */ int m_swidth; /* stripe width */ int m_sinoalign; /* stripe unit inode alignment */ int m_attr_magicpct;/* 37% of the blocksize */ int m_dir_magicpct; /* 37% of the dir blocksize */ - __uint8_t m_mk_sharedro; /* mark shared ro on unmount */ - __uint8_t m_inode_quiesce;/* call quiesce on new inodes. - field governed by m_ilock */ __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ int m_dirblksize; /* directory block sz--bytes */ @@ -324,23 +195,25 @@ typedef struct xfs_mount { uint m_chsize; /* size of next field */ struct xfs_chash *m_chash; /* fs private inode per-cluster * hash table */ - struct xfs_dmops *m_dm_ops; /* vector of DMI ops */ - struct xfs_qmops *m_qm_ops; /* vector of XQM ops */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB - xfs_icsb_cnts_t *m_sb_cnts; /* per-cpu superblock counters */ + 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 */ - bhv_vfs_sync_work_t m_sync_work; /* work item for VFS_SYNC */ + xfs_sync_work_t m_sync_work; /* work item for VFS_SYNC */ struct list_head m_sync_list; /* sync thread work item list */ spinlock_t m_sync_lock; /* work item list lock */ int m_sync_seq; /* sync thread generation no. */ wait_queue_head_t m_wait_single_sync_task; - struct vfsmount *m_vfsmount; + __int64_t m_update_flags; /* sb flags we need to update + on the next remount,rw */ + struct shrinker m_inode_shrink; /* inode reclaim shrinker */ + int64_t m_low_space[XFS_LOWSP_MAX]; + /* low free space thresholds */ } xfs_mount_t; /* @@ -349,8 +222,7 @@ typedef struct xfs_mount { #define XFS_MOUNT_WSYNC (1ULL << 0) /* for nfs - all metadata ops must be synchronous except for space allocations */ -#define XFS_MOUNT_INO64 (1ULL << 1) -#define XFS_MOUNT_DMAPI (1ULL << 2) /* dmapi is enabled */ +#define XFS_MOUNT_DELAYLOG (1ULL << 1) /* delayed logging is enabled */ #define XFS_MOUNT_WAS_CLEAN (1ULL << 3) #define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem operations, typically for @@ -362,10 +234,7 @@ typedef struct xfs_mount { #define XFS_MOUNT_ATTR2 (1ULL << 8) /* allow use of attr2 format */ #define XFS_MOUNT_GRPID (1ULL << 9) /* group-ID assigned from directory */ #define XFS_MOUNT_NORECOVERY (1ULL << 10) /* no recovery - dirty fs */ -#define XFS_MOUNT_SHARED (1ULL << 11) /* shared mount */ #define XFS_MOUNT_DFLT_IOSIZE (1ULL << 12) /* set default i/o size */ -#define XFS_MOUNT_OSYNCISOSYNC (1ULL << 13) /* o_sync is REALLY o_sync */ - /* osyncisdsync is now default*/ #define XFS_MOUNT_32BITINODES (1ULL << 14) /* do not create inodes above * 32 bits in size */ #define XFS_MOUNT_SMALL_INUMS (1ULL << 15) /* users wants 32bit inodes */ @@ -378,8 +247,6 @@ typedef struct xfs_mount { #define XFS_MOUNT_DIRSYNC (1ULL << 21) /* synchronous directory ops */ #define XFS_MOUNT_COMPAT_IOSIZE (1ULL << 22) /* don't report large preferred * I/O size in stat() */ -#define XFS_MOUNT_NO_PERCPU_SB (1ULL << 23) /* don't use per-cpu superblock - counters */ #define XFS_MOUNT_FILESTREAMS (1ULL << 24) /* enable the filestreams allocator */ #define XFS_MOUNT_NOATTR2 (1ULL << 25) /* disable use of attr2 format */ @@ -402,8 +269,8 @@ typedef struct xfs_mount { * Synchronous read and write sizes. This should be * better for NFSv2 wsync filesystems. */ -#define XFS_WSYNC_READIO_LOG 15 /* 32K */ -#define XFS_WSYNC_WRITEIO_LOG 14 /* 16K */ +#define XFS_WSYNC_READIO_LOG 15 /* 32k */ +#define XFS_WSYNC_WRITEIO_LOG 14 /* 16k */ /* * Allow large block sizes to be reported to userspace programs if the @@ -439,12 +306,21 @@ void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname, #define xfs_force_shutdown(m,f) \ xfs_do_force_shutdown(m, f, __FILE__, __LINE__) +#define SHUTDOWN_META_IO_ERROR 0x0001 /* write attempt to metadata failed */ +#define SHUTDOWN_LOG_IO_ERROR 0x0002 /* write attempt to the log failed */ +#define SHUTDOWN_FORCE_UMOUNT 0x0004 /* shutdown from a forced unmount */ +#define SHUTDOWN_CORRUPT_INCORE 0x0008 /* corrupt in-memory data structures */ +#define SHUTDOWN_REMOTE_REQ 0x0010 /* shutdown came from remote cell */ +#define SHUTDOWN_DEVICE_REQ 0x0020 /* failed all paths to the device */ + +#define xfs_test_for_freeze(mp) ((mp)->m_super->s_frozen) +#define xfs_wait_for_freeze(mp,l) vfs_check_frozen((mp)->m_super, (l)) + /* * Flags for xfs_mountfs */ #define XFS_MFSI_QUIET 0x40 /* Be silent if mount errors found */ -#define XFS_DADDR_TO_AGNO(mp,d) xfs_daddr_to_agno(mp,d) static inline xfs_agnumber_t xfs_daddr_to_agno(struct xfs_mount *mp, xfs_daddr_t d) { @@ -453,7 +329,6 @@ xfs_daddr_to_agno(struct xfs_mount *mp, xfs_daddr_t d) return (xfs_agnumber_t) ld; } -#define XFS_DADDR_TO_AGBNO(mp,d) xfs_daddr_to_agbno(mp,d) static inline xfs_agblock_t xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) { @@ -462,31 +337,16 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) } /* - * perag get/put wrappers for eventual ref counting - */ -static inline xfs_perag_t * -xfs_get_perag(struct xfs_mount *mp, xfs_ino_t ino) -{ - return &mp->m_perag[XFS_INO_TO_AGNO(mp, ino)]; -} - -static inline void -xfs_put_perag(struct xfs_mount *mp, xfs_perag_t *pag) -{ - /* nothing to see here, move along */ -} - -/* * Per-cpu superblock locking functions */ #ifdef HAVE_PERCPU_SB -STATIC_INLINE void +static inline void xfs_icsb_lock(xfs_mount_t *mp) { mutex_lock(&mp->m_icsb_mutex); } -STATIC_INLINE void +static inline void xfs_icsb_unlock(xfs_mount_t *mp) { mutex_unlock(&mp->m_icsb_mutex); @@ -505,40 +365,39 @@ typedef struct xfs_mod_sb { int64_t msb_delta; /* Change to make to specified field */ } xfs_mod_sb_t; -#define XFS_MOUNT_ILOCK(mp) mutex_lock(&((mp)->m_ilock)) -#define XFS_MOUNT_IUNLOCK(mp) mutex_unlock(&((mp)->m_ilock)) - extern int xfs_log_sbcount(xfs_mount_t *, uint); +extern __uint64_t xfs_default_resblks(xfs_mount_t *mp); extern int xfs_mountfs(xfs_mount_t *mp); -extern void xfs_mountfs_check_barriers(xfs_mount_t *mp); extern void xfs_unmountfs(xfs_mount_t *); extern int xfs_unmountfs_writesb(xfs_mount_t *); -extern int xfs_unmount_flush(xfs_mount_t *, int); extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); -extern int xfs_mod_incore_sb_unlocked(xfs_mount_t *, xfs_sb_field_t, - int64_t, int); extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, uint, int); +extern int xfs_mount_log_sb(xfs_mount_t *, __int64_t); extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); extern int xfs_readsb(xfs_mount_t *, int); extern void xfs_freesb(xfs_mount_t *); extern int xfs_fs_writable(xfs_mount_t *); -extern int xfs_syncsub(xfs_mount_t *, int, int *); -extern int xfs_sync_inodes(xfs_mount_t *, int, int *); extern int xfs_sb_validate_fsb_count(struct xfs_sb *, __uint64_t); -extern int xfs_dmops_get(struct xfs_mount *, struct xfs_mount_args *); -extern void xfs_dmops_put(struct xfs_mount *); -extern int xfs_qmops_get(struct xfs_mount *, struct xfs_mount_args *); -extern void xfs_qmops_put(struct xfs_mount *); +extern int xfs_dev_is_read_only(struct xfs_mount *, char *); -extern struct xfs_dmops xfs_dmcore_xfs; +extern void xfs_set_low_space_thresholds(struct xfs_mount *); #endif /* __KERNEL__ */ +/* + * perag get/put wrappers for ref counting + */ +struct xfs_perag *xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno); +struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *mp, xfs_agnumber_t agno, + int tag); +void xfs_perag_put(struct xfs_perag *pag); + extern void xfs_mod_sb(struct xfs_trans *, __int64_t); -extern xfs_agnumber_t xfs_initialize_perag(struct xfs_mount *, xfs_agnumber_t); +extern int xfs_initialize_perag(struct xfs_mount *, xfs_agnumber_t, + xfs_agnumber_t *); extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); diff --git a/include/xfs_quota.h b/include/xfs_quota.h index 12c4ec7..5d1f57d 100644 --- a/include/xfs_quota.h +++ b/include/xfs_quota.h @@ -18,6 +18,8 @@ #ifndef __XFS_QUOTA_H__ #define __XFS_QUOTA_H__ +struct xfs_trans; + /* * The ondisk form of a dquot structure. */ @@ -84,14 +86,20 @@ typedef struct xfs_dqblk { #define XFS_DQ_USER 0x0001 /* a user quota */ #define XFS_DQ_PROJ 0x0002 /* project quota */ #define XFS_DQ_GROUP 0x0004 /* a group quota */ -#define XFS_DQ_FLOCKED 0x0008 /* flush lock taken */ -#define XFS_DQ_DIRTY 0x0010 /* dquot is dirty */ -#define XFS_DQ_WANT 0x0020 /* for lookup/reclaim race */ -#define XFS_DQ_INACTIVE 0x0040 /* dq off mplist & hashlist */ -#define XFS_DQ_MARKER 0x0080 /* sentinel */ +#define XFS_DQ_DIRTY 0x0008 /* dquot is dirty */ +#define XFS_DQ_WANT 0x0010 /* for lookup/reclaim race */ +#define XFS_DQ_INACTIVE 0x0020 /* dq off mplist & hashlist */ #define XFS_DQ_ALLTYPES (XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP) +#define XFS_DQ_FLAGS \ + { XFS_DQ_USER, "USER" }, \ + { XFS_DQ_PROJ, "PROJ" }, \ + { XFS_DQ_GROUP, "GROUP" }, \ + { XFS_DQ_DIRTY, "DIRTY" }, \ + { XFS_DQ_WANT, "WANT" }, \ + { XFS_DQ_INACTIVE, "INACTIVE" } + /* * In the worst case, when both user and group quotas are on, * we can have a max of three dquots changing in a single transaction. @@ -187,18 +195,13 @@ typedef struct xfs_qoff_logformat { * to a single function. None of these XFS_QMOPT_* flags are meant to have * persistent values (ie. their values can and will change between versions) */ -#define XFS_QMOPT_DQLOCK 0x0000001 /* dqlock */ #define XFS_QMOPT_DQALLOC 0x0000002 /* alloc dquot ondisk if needed */ #define XFS_QMOPT_UQUOTA 0x0000004 /* user dquot requested */ #define XFS_QMOPT_PQUOTA 0x0000008 /* project dquot requested */ #define XFS_QMOPT_FORCE_RES 0x0000010 /* ignore quota limits */ #define XFS_QMOPT_DQSUSER 0x0000020 /* don't cache super users dquot */ #define XFS_QMOPT_SBVERSION 0x0000040 /* change superblock version num */ -#define XFS_QMOPT_QUOTAOFF 0x0000080 /* quotas are being turned off */ -#define XFS_QMOPT_UMOUNTING 0x0000100 /* filesys is being unmounted */ -#define XFS_QMOPT_DOLOG 0x0000200 /* log buf changes (in quotacheck) */ #define XFS_QMOPT_DOWARN 0x0000400 /* increase warning cnt if needed */ -#define XFS_QMOPT_ILOCKED 0x0000800 /* inode is already locked (excl) */ #define XFS_QMOPT_DQREPAIR 0x0001000 /* repair dquot if damaged */ #define XFS_QMOPT_GQUOTA 0x0002000 /* group dquot requested */ #define XFS_QMOPT_ENOSPC 0x0004000 /* enospc instead of edquot (prj) */ @@ -217,16 +220,9 @@ typedef struct xfs_qoff_logformat { #define XFS_QMOPT_RES_INOS 0x0800000 /* - * flags for dqflush and dqflush_all. - */ -#define XFS_QMOPT_SYNC 0x1000000 -#define XFS_QMOPT_ASYNC 0x2000000 -#define XFS_QMOPT_DELWRI 0x4000000 - -/* * flags for dqalloc. */ -#define XFS_QMOPT_INHERIT 0x8000000 +#define XFS_QMOPT_INHERIT 0x1000000 /* * flags to xfs_trans_mod_dquot. @@ -303,69 +299,77 @@ typedef struct xfs_dqtrx { long qt_delrtb_delta; /* delayed RT blk count changes */ } xfs_dqtrx_t; -/* - * Dquot transaction functions, used if quota is enabled. - */ -typedef void (*qo_dup_dqinfo_t)(struct xfs_trans *, struct xfs_trans *); -typedef void (*qo_mod_dquot_byino_t)(struct xfs_trans *, - struct xfs_inode *, uint, long); -typedef void (*qo_free_dqinfo_t)(struct xfs_trans *); -typedef void (*qo_apply_dquot_deltas_t)(struct xfs_trans *); -typedef void (*qo_unreserve_and_mod_dquots_t)(struct xfs_trans *); -typedef int (*qo_reserve_quota_nblks_t)( - struct xfs_trans *, struct xfs_mount *, - struct xfs_inode *, long, long, uint); -typedef int (*qo_reserve_quota_bydquots_t)( - struct xfs_trans *, struct xfs_mount *, - struct xfs_dquot *, struct xfs_dquot *, - long, long, uint); -typedef struct xfs_dqtrxops { - qo_dup_dqinfo_t qo_dup_dqinfo; - qo_free_dqinfo_t qo_free_dqinfo; - qo_mod_dquot_byino_t qo_mod_dquot_byino; - qo_apply_dquot_deltas_t qo_apply_dquot_deltas; - qo_reserve_quota_nblks_t qo_reserve_quota_nblks; - qo_reserve_quota_bydquots_t qo_reserve_quota_bydquots; - qo_unreserve_and_mod_dquots_t qo_unreserve_and_mod_dquots; -} xfs_dqtrxops_t; - -#define XFS_DQTRXOP(mp, tp, op, args...) \ - ((mp)->m_qm_ops->xfs_dqtrxops ? \ - ((mp)->m_qm_ops->xfs_dqtrxops->op)(tp, ## args) : 0) - -#define XFS_DQTRXOP_VOID(mp, tp, op, args...) \ - ((mp)->m_qm_ops->xfs_dqtrxops ? \ - ((mp)->m_qm_ops->xfs_dqtrxops->op)(tp, ## args) : (void)0) - -#define XFS_TRANS_DUP_DQINFO(mp, otp, ntp) \ - XFS_DQTRXOP_VOID(mp, otp, qo_dup_dqinfo, ntp) -#define XFS_TRANS_FREE_DQINFO(mp, tp) \ - XFS_DQTRXOP_VOID(mp, tp, qo_free_dqinfo) -#define XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, field, delta) \ - XFS_DQTRXOP_VOID(mp, tp, qo_mod_dquot_byino, ip, field, delta) -#define XFS_TRANS_APPLY_DQUOT_DELTAS(mp, tp) \ - XFS_DQTRXOP_VOID(mp, tp, qo_apply_dquot_deltas) -#define XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, ninos, fl) \ - XFS_DQTRXOP(mp, tp, qo_reserve_quota_nblks, mp, ip, nblks, ninos, fl) -#define XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, nb, ni, fl) \ - XFS_DQTRXOP(mp, tp, qo_reserve_quota_bydquots, mp, ud, gd, nb, ni, fl) -#define XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp) \ - XFS_DQTRXOP_VOID(mp, tp, qo_unreserve_and_mod_dquots) - -#define XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, ninos, flags) \ - XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, -(nblks), -(ninos), flags) -#define XFS_TRANS_RESERVE_QUOTA(mp, tp, ud, gd, nb, ni, f) \ - XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, nb, ni, \ - f | XFS_QMOPT_RES_REGBLKS) -#define XFS_TRANS_UNRESERVE_QUOTA(mp, tp, ud, gd, nb, ni, f) \ - XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, -(nb), -(ni), \ - f | XFS_QMOPT_RES_REGBLKS) - extern int xfs_qm_dqcheck(xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *); extern int xfs_mount_reset_sbqflags(struct xfs_mount *); -extern struct xfs_qmops xfs_qmcore_xfs; - #endif /* __KERNEL__ */ +#ifdef CONFIG_XFS_QUOTA +extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *); +extern void xfs_trans_free_dqinfo(struct xfs_trans *); +extern void xfs_trans_mod_dquot_byino(struct xfs_trans *, struct xfs_inode *, + uint, long); +extern void xfs_trans_apply_dquot_deltas(struct xfs_trans *); +extern void xfs_trans_unreserve_and_mod_dquots(struct xfs_trans *); +extern int xfs_trans_reserve_quota_nblks(struct xfs_trans *, + struct xfs_inode *, long, long, uint); +extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *, + struct xfs_mount *, struct xfs_dquot *, + struct xfs_dquot *, long, long, uint); + +extern int xfs_qm_vop_dqalloc(struct xfs_inode *, uid_t, gid_t, prid_t, uint, + struct xfs_dquot **, struct xfs_dquot **); +extern void xfs_qm_vop_create_dqattach(struct xfs_trans *, struct xfs_inode *, + struct xfs_dquot *, struct xfs_dquot *); +extern int xfs_qm_vop_rename_dqattach(struct xfs_inode **); +extern struct xfs_dquot *xfs_qm_vop_chown(struct xfs_trans *, + struct xfs_inode *, struct xfs_dquot **, struct xfs_dquot *); +extern int xfs_qm_vop_chown_reserve(struct xfs_trans *, struct xfs_inode *, + struct xfs_dquot *, struct xfs_dquot *, uint); +extern int xfs_qm_dqattach(struct xfs_inode *, uint); +extern int xfs_qm_dqattach_locked(struct xfs_inode *, uint); +extern void xfs_qm_dqdetach(struct xfs_inode *); +extern void xfs_qm_dqrele(struct xfs_dquot *); +extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *); +extern int xfs_qm_sync(struct xfs_mount *, int); +extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *); +extern void xfs_qm_mount_quotas(struct xfs_mount *); +extern void xfs_qm_unmount(struct xfs_mount *); +extern void xfs_qm_unmount_quotas(struct xfs_mount *); + +#else +#define xfs_qm_vop_dqalloc(ip, uid, gid, prid, flags, udqp, gdqp) ({ \ + *(udqp) = NULL; \ + *(gdqp) = NULL; \ + 0; \ +}) +#define xfs_trans_dup_dqinfo(tp, tp2) +#define xfs_trans_free_dqinfo(tp) +#define xfs_trans_mod_dquot_byino(tp, ip, fields, delta) +#define xfs_trans_apply_dquot_deltas(tp) +#define xfs_trans_unreserve_and_mod_dquots(tp) +#define xfs_trans_reserve_quota_nblks(tp, ip, blks, inos, flg) (0) +#define xfs_trans_reserve_quota_bydquots(tp, mp, uqp, gqp, blks, inos, flg) (0) +#define xfs_qm_vop_create_dqattach(tp, ip, u, g) +#define xfs_qm_vop_rename_dqattach(it) (0) +#define xfs_qm_vop_chown(tp, ip, old, new) (NULL) +#define xfs_qm_vop_chown_reserve(tp, ip, u, g, fl) (0) +#define xfs_qm_dqattach(ip, fl) (0) +#define xfs_qm_dqattach_locked(ip, fl) (0) +#define xfs_qm_dqdetach(ip) +#define xfs_qm_dqrele(d) +#define xfs_qm_statvfs(ip, s) +#define xfs_qm_sync(mp, flags) (0) +#define xfs_qm_newmount(mp, a, b) (0) +#define xfs_qm_mount_quotas(mp) +#define xfs_qm_unmount(mp) +#define xfs_qm_unmount_quotas(mp) +#endif /* CONFIG_XFS_QUOTA */ + +#define xfs_trans_unreserve_quota_nblks(tp, ip, nblks, ninos, flags) \ + xfs_trans_reserve_quota_nblks(tp, ip, -(nblks), -(ninos), flags) +#define xfs_trans_reserve_quota(tp, mp, ud, gd, nb, ni, f) \ + xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, nb, ni, \ + f | XFS_QMOPT_RES_REGBLKS) + #endif /* __XFS_QUOTA_H__ */ diff --git a/include/xfs_rtalloc.h b/include/xfs_rtalloc.h index 8d8dcd2..ff614c2 100644 --- a/include/xfs_rtalloc.h +++ b/include/xfs_rtalloc.h @@ -23,8 +23,8 @@ struct xfs_trans; /* Min and max rt extent sizes, specified in bytes */ #define XFS_MAX_RTEXTSIZE (1024 * 1024 * 1024) /* 1GB */ -#define XFS_DFL_RTEXTSIZE (64 * 1024) /* 64KB */ -#define XFS_MIN_RTEXTSIZE (4 * 1024) /* 4KB */ +#define XFS_DFL_RTEXTSIZE (64 * 1024) /* 64kB */ +#define XFS_MIN_RTEXTSIZE (4 * 1024) /* 4kB */ /* * Constants for bit manipulations. @@ -108,6 +108,9 @@ xfs_rtfree_extent( int /* error */ xfs_rtmount_init( struct xfs_mount *mp); /* file system mount structure */ +void +xfs_rtunmount_inodes( + struct xfs_mount *mp); /* * Get the bitmap and summary inodes into the mount structure @@ -144,8 +147,18 @@ xfs_growfs_rt( # define xfs_rtfree_extent(t,b,l) (ENOSYS) # define xfs_rtpick_extent(m,t,l,rb) (ENOSYS) # define xfs_growfs_rt(mp,in) (ENOSYS) -# define xfs_rtmount_init(m) (((mp)->m_sb.sb_rblocks == 0)? 0 : (ENOSYS)) +static inline int /* error */ +xfs_rtmount_init( + xfs_mount_t *mp) /* file system mount structure */ +{ + if (mp->m_sb.sb_rblocks == 0) + return 0; + + cmn_err(CE_WARN, "XFS: Not built with CONFIG_XFS_RT"); + return ENOSYS; +} # define xfs_rtmount_inodes(m) (((mp)->m_sb.sb_rblocks == 0)? 0 : (ENOSYS)) +# define xfs_rtunmount_inodes(m) #endif /* CONFIG_XFS_RT */ #endif /* __KERNEL__ */ diff --git a/include/xfs_sb.h b/include/xfs_sb.h index f88dc32..5dcc2d7 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -299,30 +299,34 @@ typedef enum { #define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS) -#ifdef __KERNEL__ static inline int xfs_sb_good_version(xfs_sb_t *sbp) { - return (((sbp->sb_versionnum >= XFS_SB_VERSION_1) && \ - (sbp->sb_versionnum <= XFS_SB_VERSION_3)) || \ - ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - !((sbp->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS) || \ - ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && \ - (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS))) && \ - (sbp->sb_shared_vn <= XFS_SB_MAX_SHARED_VN))); -} + /* We always support version 1-3 */ + if (sbp->sb_versionnum >= XFS_SB_VERSION_1 && + sbp->sb_versionnum <= XFS_SB_VERSION_3) + return 1; + + /* We support version 4 if all feature bits are supported */ + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) { + if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS) || + ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && + (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS))) + return 0; + +#ifdef __KERNEL__ + if (sbp->sb_shared_vn > XFS_SB_MAX_SHARED_VN) + return 0; #else -static inline int xfs_sb_good_version(xfs_sb_t *sbp) -{ - return (((sbp->sb_versionnum >= XFS_SB_VERSION_1) && \ - (sbp->sb_versionnum <= XFS_SB_VERSION_3)) || \ - ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - !((sbp->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS) || \ - ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && \ - (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS))) && \ - (!(sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT) || \ - (sbp->sb_shared_vn <= XFS_SB_MAX_SHARED_VN)))); + if ((sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT) && + sbp->sb_shared_vn > XFS_SB_MAX_SHARED_VN) + return 0; +#endif + + return 1; + } + + return 0; } -#endif /* __KERNEL__ */ /* * Detect a mismatched features2 field. Older kernels read/wrote @@ -335,123 +339,127 @@ static inline int xfs_sb_has_mismatched_features2(xfs_sb_t *sbp) static inline unsigned xfs_sb_version_tonew(unsigned v) { - return ((((v) == XFS_SB_VERSION_1) ? \ - 0 : \ - (((v) == XFS_SB_VERSION_2) ? \ - XFS_SB_VERSION_ATTRBIT : \ - (XFS_SB_VERSION_ATTRBIT | XFS_SB_VERSION_NLINKBIT))) | \ - XFS_SB_VERSION_4); + if (v == XFS_SB_VERSION_1) + return XFS_SB_VERSION_4; + + if (v == XFS_SB_VERSION_2) + return XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT; + + return XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT | + XFS_SB_VERSION_NLINKBIT; } static inline unsigned xfs_sb_version_toold(unsigned v) { - return (((v) & (XFS_SB_VERSION_QUOTABIT | XFS_SB_VERSION_ALIGNBIT)) ? \ - 0 : \ - (((v) & XFS_SB_VERSION_NLINKBIT) ? \ - XFS_SB_VERSION_3 : \ - (((v) & XFS_SB_VERSION_ATTRBIT) ? \ - XFS_SB_VERSION_2 : \ - XFS_SB_VERSION_1))); + if (v & (XFS_SB_VERSION_QUOTABIT | XFS_SB_VERSION_ALIGNBIT)) + return 0; + if (v & XFS_SB_VERSION_NLINKBIT) + return XFS_SB_VERSION_3; + if (v & XFS_SB_VERSION_ATTRBIT) + return XFS_SB_VERSION_2; + return XFS_SB_VERSION_1; } static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp) { - return ((sbp)->sb_versionnum == XFS_SB_VERSION_2) || \ - ((sbp)->sb_versionnum == XFS_SB_VERSION_3) || \ - ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_ATTRBIT)); + return sbp->sb_versionnum == XFS_SB_VERSION_2 || + sbp->sb_versionnum == XFS_SB_VERSION_3 || + (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT)); } static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) { - (sbp)->sb_versionnum = (((sbp)->sb_versionnum == XFS_SB_VERSION_1) ? \ - XFS_SB_VERSION_2 : \ - ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) ? \ - ((sbp)->sb_versionnum | XFS_SB_VERSION_ATTRBIT) : \ - (XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT))); + if (sbp->sb_versionnum == XFS_SB_VERSION_1) + sbp->sb_versionnum = XFS_SB_VERSION_2; + else if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) + sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; + else + sbp->sb_versionnum = XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT; } static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) { - return ((sbp)->sb_versionnum == XFS_SB_VERSION_3) || \ - ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); + return sbp->sb_versionnum == XFS_SB_VERSION_3 || + (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); } static inline void xfs_sb_version_addnlink(xfs_sb_t *sbp) { - (sbp)->sb_versionnum = ((sbp)->sb_versionnum <= XFS_SB_VERSION_2 ? \ - XFS_SB_VERSION_3 : \ - ((sbp)->sb_versionnum | XFS_SB_VERSION_NLINKBIT)); + if (sbp->sb_versionnum <= XFS_SB_VERSION_2) + sbp->sb_versionnum = XFS_SB_VERSION_3; + else + sbp->sb_versionnum |= XFS_SB_VERSION_NLINKBIT; } static inline int xfs_sb_version_hasquota(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_QUOTABIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); } static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) { - (sbp)->sb_versionnum = \ - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 ? \ - ((sbp)->sb_versionnum | XFS_SB_VERSION_QUOTABIT) : \ - (xfs_sb_version_tonew((sbp)->sb_versionnum) | \ - XFS_SB_VERSION_QUOTABIT)); + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) + sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT; + else + sbp->sb_versionnum = xfs_sb_version_tonew(sbp->sb_versionnum) | + XFS_SB_VERSION_QUOTABIT; } static inline int xfs_sb_version_hasalign(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_ALIGNBIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT); } static inline int xfs_sb_version_hasdalign(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); } static inline int xfs_sb_version_hasshared(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_SHAREDBIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT); } static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); } static inline int xfs_sb_version_haslogv2(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); } static inline int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); } static inline int xfs_sb_version_hassector(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_SECTORBIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT); } static inline int xfs_sb_version_hasasciici(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); } static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ - ((sbp)->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && + (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT); } /* @@ -466,22 +474,20 @@ static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) static inline int xfs_sb_version_haslazysbcount(xfs_sb_t *sbp) { - return (xfs_sb_version_hasmorebits(sbp) && \ - ((sbp)->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)); + return xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT); } static inline int xfs_sb_version_hasattr2(xfs_sb_t *sbp) { - return (xfs_sb_version_hasmorebits(sbp)) && \ - ((sbp)->sb_features2 & XFS_SB_VERSION2_ATTR2BIT); + return xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT); } static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) { - ((sbp)->sb_versionnum = \ - ((sbp)->sb_versionnum | XFS_SB_VERSION_MOREBITSBIT), \ - ((sbp)->sb_features2 = \ - ((sbp)->sb_features2 | XFS_SB_VERSION2_ATTR2BIT))); + sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; + sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; } static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp) @@ -514,7 +520,7 @@ static inline void xfs_sb_version_addprojid32bit(xfs_sb_t *sbp) #define XFS_HDR_BLOCK(mp,d) ((xfs_agblock_t)XFS_BB_TO_FSBT(mp,d)) #define XFS_DADDR_TO_FSB(mp,d) XFS_AGB_TO_FSB(mp, \ - XFS_DADDR_TO_AGNO(mp,d), XFS_DADDR_TO_AGBNO(mp,d)) + xfs_daddr_to_agno(mp,d), xfs_daddr_to_agbno(mp,d)) #define XFS_FSB_TO_DADDR(mp,fsbno) XFS_AGB_TO_DADDR(mp, \ XFS_FSB_TO_AGNO(mp,fsbno), XFS_FSB_TO_AGBNO(mp,fsbno)) diff --git a/include/xfs_trace.h b/include/xfs_trace.h index fef82d0..bf82f6e 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -1,9 +1,85 @@ #ifndef __TRACE_H__ #define __TRACE_H__ +#define trace_xfs_alloc_exact_done(a) ((void) 0) +#define trace_xfs_alloc_exact_notfound(a) ((void) 0) +#define trace_xfs_alloc_exact_error(a) ((void) 0) +#define trace_xfs_alloc_near_nominleft(a) ((void) 0) +#define trace_xfs_alloc_near_first(a) ((void) 0) +#define trace_xfs_alloc_near_greater(a) ((void) 0) +#define trace_xfs_alloc_near_lesser(a) ((void) 0) +#define trace_xfs_alloc_near_error(a) ((void) 0) +#define trace_xfs_alloc_size_neither(a) ((void) 0) +#define trace_xfs_alloc_size_noentry(a) ((void) 0) +#define trace_xfs_alloc_size_nominleft(a) ((void) 0) +#define trace_xfs_alloc_size_done(a) ((void) 0) +#define trace_xfs_alloc_size_error(a) ((void) 0) +#define trace_xfs_alloc_small_freelist(a) ((void) 0) +#define trace_xfs_alloc_small_notenough(a) ((void) 0) +#define trace_xfs_alloc_small_done(a) ((void) 0) +#define trace_xfs_alloc_small_error(a) ((void) 0) +#define trace_xfs_alloc_vextent_badargs(a) ((void) 0) +#define trace_xfs_alloc_vextent_nofix(a) ((void) 0) +#define trace_xfs_alloc_vextent_noagbp(a) ((void) 0) +#define trace_xfs_alloc_vextent_loopfailed(a) ((void) 0) +#define trace_xfs_alloc_vextent_allfailed(a) ((void) 0) + #define trace_xfs_log_recover_item_reorder_head(a,b,c,d) ((void) 0) #define trace_xfs_log_recover_item_reorder_tail(a,b,c,d) ((void) 0) #define trace_xfs_log_recover_item_add_cont(a,b,c,d) ((void) 0) #define trace_xfs_log_recover_item_add(a,b,c,d) ((void) 0) +#define trace_xfs_btree_corrupt(a,b) ((void) 0) +#define trace_xfs_da_btree_corrupt(a,b) ((void) 0) + +#define trace_xfs_free_extent(a,b,c,d,e,f,g) ((void) 0) +#define trace_xfs_agf(a,b,c,d) ((void) 0) + +#define trace_xfs_iext_insert(a,b,c,d,e) ((void) 0) +#define trace_xfs_iext_remove(a,b,c,d) ((void) 0) + +#define trace_xfs_dir2_grow_inode(a,b) ((void) 0) +#define trace_xfs_dir2_shrink_inode(a,b) ((void) 0) + +#define trace_xfs_dir2_leaf_to_node(a) ((void) 0) +#define trace_xfs_dir2_leaf_to_block(a) ((void) 0) +#define trace_xfs_dir2_leaf_addname(a) ((void) 0) +#define trace_xfs_dir2_leaf_lookup(a) ((void) 0) +#define trace_xfs_dir2_leaf_removename(a) ((void) 0) +#define trace_xfs_dir2_leaf_replace(a) ((void) 0) + +#define trace_xfs_dir2_block_addname(a) ((void) 0) +#define trace_xfs_dir2_block_to_leaf(a) ((void) 0) +#define trace_xfs_dir2_block_to_sf(a) ((void) 0) +#define trace_xfs_dir2_block_lookup(a) ((void) 0) +#define trace_xfs_dir2_block_removename(a) ((void) 0) +#define trace_xfs_dir2_block_replace(a) ((void) 0) + +#define trace_xfs_dir2_leafn_add(a,b) ((void) 0) +#define trace_xfs_dir2_leafn_remove(a,b) ((void) 0) +#define trace_xfs_dir2_leafn_moveents(a,b,c,d) ((void) 0) + +#define trace_xfs_dir2_node_to_leaf(a) ((void) 0) +#define trace_xfs_dir2_node_addname(a) ((void) 0) +#define trace_xfs_dir2_node_lookup(a) ((void) 0) +#define trace_xfs_dir2_node_removename(a) ((void) 0) +#define trace_xfs_dir2_node_replace(a) ((void) 0) + +#define trace_xfs_dir2_sf_to_block(a) ((void) 0) +#define trace_xfs_dir2_sf_addname(a) ((void) 0) +#define trace_xfs_dir2_sf_create(a) ((void) 0) +#define trace_xfs_dir2_sf_lookup(a) ((void) 0) +#define trace_xfs_dir2_sf_removename(a) ((void) 0) +#define trace_xfs_dir2_sf_replace(a) ((void) 0) +#define trace_xfs_dir2_sf_toino4(a) ((void) 0) +#define trace_xfs_dir2_sf_toino8(a) ((void) 0) + +#define trace_xfs_bmap_pre_update(a,b,c,d) ((void) 0) +#define trace_xfs_bmap_post_update(a,b,c,d) ((void) 0) +#define trace_xfs_extlist(a,b,c,d) ((void) 0) +#define trace_xfs_bunmap(a,b,c,d,e) ((void) 0) + +#define trace_xfs_perag_get(a,b,c,d) ((void) 0) +#define trace_xfs_perag_put(a,b,c,d) ((void) 0) + #endif /* __TRACE_H__ */ diff --git a/include/xfs_trans_space.h b/include/xfs_trans_space.h index 4ea2e50..7d2c920 100644 --- a/include/xfs_trans_space.h +++ b/include/xfs_trans_space.h @@ -47,7 +47,7 @@ #define XFS_DIRREMOVE_SPACE_RES(mp) \ XFS_DAREMOVE_SPACE_RES(mp, XFS_DATA_FORK) #define XFS_IALLOC_SPACE_RES(mp) \ - (XFS_IALLOC_BLOCKS(mp) + XFS_IN_MAXLEVELS(mp)-1) + (XFS_IALLOC_BLOCKS(mp) + (mp)->m_in_maxlevels - 1) /* * Space reservation values for various transactions. diff --git a/include/xfs_types.h b/include/xfs_types.h index 901d4ac..26d1867 100644 --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -21,14 +21,6 @@ #ifdef __KERNEL__ /* - * POSIX Extensions - */ -typedef unsigned char uchar_t; -typedef unsigned short ushort_t; -typedef unsigned int uint_t; -typedef unsigned long ulong_t; - -/* * Additional type declarations for XFS */ typedef signed char __int8_t; @@ -45,7 +37,7 @@ typedef __uint32_t prid_t; /* project ID */ typedef __uint32_t inst_t; /* an instruction */ typedef __s64 xfs_off_t; /* type */ -typedef __u64 xfs_ino_t; /* type */ +typedef unsigned long long xfs_ino_t; /* type */ typedef __s64 xfs_daddr_t; /* type */ typedef char * xfs_caddr_t; /* type */ typedef __u32 xfs_dev_t; @@ -111,8 +103,6 @@ typedef __uint64_t xfs_fileoff_t; /* block number in a file */ typedef __int64_t xfs_sfiloff_t; /* signed block number in a file */ typedef __uint64_t xfs_filblks_t; /* number of blocks in a file */ -typedef __uint8_t xfs_arch_t; /* architecture of an xfs fs */ - /* * Null values for the types. */ @@ -161,8 +151,8 @@ typedef enum { } xfs_btnum_t; struct xfs_name { - const char *name; - int len; + const unsigned char *name; + int len; }; #endif /* __XFS_TYPES_H__ */ diff --git a/libxfs/init.c b/libxfs/init.c index 75d043e..d59308d 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -374,6 +374,7 @@ manage_zones(int release) extern kmem_zone_t *xfs_da_state_zone; extern kmem_zone_t *xfs_btree_cur_zone; extern kmem_zone_t *xfs_bmap_free_item_zone; + extern kmem_zone_t *xfs_log_item_desc_zone; extern void xfs_dir_startup(); if (release) { /* free zone allocation */ @@ -385,6 +386,7 @@ manage_zones(int release) kmem_free(xfs_da_state_zone); kmem_free(xfs_btree_cur_zone); kmem_free(xfs_bmap_free_item_zone); + kmem_free(xfs_log_item_desc_zone); return; } /* otherwise initialise zone allocation */ @@ -402,6 +404,8 @@ manage_zones(int release) sizeof(xfs_btree_cur_t), "xfs_btree_cur"); xfs_bmap_free_item_zone = kmem_zone_init( sizeof(xfs_bmap_free_item_t), "xfs_bmap_free_item"); + xfs_log_item_desc_zone = kmem_zone_init( + sizeof(struct xfs_log_item_desc), "xfs_log_item_desc"); xfs_dir_startup(); } @@ -509,6 +513,109 @@ libxfs_dirv1_mount( mp->m_dirblkfsbs = 1; } +static int +libxfs_initialize_perag( + xfs_mount_t *mp, + xfs_agnumber_t agcount, + xfs_agnumber_t *maxagi) +{ + xfs_agnumber_t index, max_metadata; + xfs_agnumber_t first_initialised = 0; + xfs_perag_t *pag; + xfs_agino_t agino; + xfs_ino_t ino; + xfs_sb_t *sbp = &mp->m_sb; + int error = -ENOMEM; + + /* + * Walk the current per-ag tree so we don't try to initialise AGs + * that already exist (growfs case). Allocate and insert all the + * AGs we don't find ready for initialisation. + */ + for (index = 0; index < agcount; index++) { + pag = xfs_perag_get(mp, index); + if (pag) { + xfs_perag_put(pag); + continue; + } + if (!first_initialised) + first_initialised = index; + + pag = kmem_zalloc(sizeof(*pag), KM_MAYFAIL); + if (!pag) + goto out_unwind; + pag->pag_agno = index; + pag->pag_mount = mp; + + if (radix_tree_insert(&mp->m_perag_tree, index, pag)) { + error = -EEXIST; + goto out_unwind; + } + } + + /* + * If we mount with the inode64 option, or no inode overflows + * the legacy 32-bit address space clear the inode32 option. + */ + agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks - 1, 0); + ino = XFS_AGINO_TO_INO(mp, agcount - 1, agino); + + if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) && ino > XFS_MAXINUMBER_32) + mp->m_flags |= XFS_MOUNT_32BITINODES; + else + mp->m_flags &= ~XFS_MOUNT_32BITINODES; + + if (mp->m_flags & XFS_MOUNT_32BITINODES) { + /* + * Calculate how much should be reserved for inodes to meet + * the max inode percentage. + */ + if (mp->m_maxicount) { + __uint64_t icount; + + icount = sbp->sb_dblocks * sbp->sb_imax_pct; + do_div(icount, 100); + icount += sbp->sb_agblocks - 1; + do_div(icount, sbp->sb_agblocks); + max_metadata = icount; + } else { + max_metadata = agcount; + } + + for (index = 0; index < agcount; index++) { + ino = XFS_AGINO_TO_INO(mp, index, agino); + if (ino > XFS_MAXINUMBER_32) { + index++; + break; + } + + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 1; + if (index < max_metadata) + pag->pagf_metadata = 1; + xfs_perag_put(pag); + } + } else { + for (index = 0; index < agcount; index++) { + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 1; + xfs_perag_put(pag); + } + } + + if (maxagi) + *maxagi = index; + return 0; + +out_unwind: + kmem_free(pag); + for (; index > first_initialised; index--) { + pag = radix_tree_delete(&mp->m_perag_tree, index); + kmem_free(pag); + } + return error; +} + /* * Mount structure initialization, provides a filled-in xfs_mount_t * such that the numerous XFS_* macros can be used. If dev is zero, @@ -526,7 +633,6 @@ libxfs_mount( xfs_daddr_t d; xfs_buf_t *bp; xfs_sb_t *sbp; - size_t size; int error; mp->m_dev = dev; @@ -534,6 +640,7 @@ libxfs_mount( mp->m_logdev = logdev; mp->m_flags = (LIBXFS_MOUNT_32BITINODES|LIBXFS_MOUNT_32BITINOOPT); mp->m_sb = *sb; + INIT_RADIX_TREE(&mp->m_perag_tree, GFP_KERNEL); sbp = &(mp->m_sb); xfs_mount_common(mp, sb); @@ -645,16 +752,13 @@ libxfs_mount( return NULL; } - /* Allocate and initialize the per-ag data */ - size = sbp->sb_agcount * sizeof(xfs_perag_t); - if (size && (mp->m_perag = calloc(size, 1)) == NULL) { - fprintf(stderr, _("%s: failed to alloc %ld bytes: %s\n"), - progname, (long)size, strerror(errno)); + error = libxfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi); + if (error) { + fprintf(stderr, _("%s: perag init failed\n"), + progname); exit(1); } - mp->m_maxagi = xfs_initialize_perag(mp, sbp->sb_agcount); - /* * mkfs calls mount before the root inode is allocated. */ @@ -707,17 +811,16 @@ libxfs_rtmount_destroy(xfs_mount_t *mp) void libxfs_umount(xfs_mount_t *mp) { + struct xfs_perag *pag; + int agno; + libxfs_rtmount_destroy(mp); libxfs_icache_purge(); libxfs_bcache_purge(); - if (mp->m_perag) { - int agno; - for (agno = 0; agno < mp->m_maxagi; agno++) { - if (mp->m_perag[agno].pagb_list) - free(mp->m_perag[agno].pagb_list); - } - free(mp->m_perag); + for (agno = 0; agno < mp->m_maxagi; agno++) { + pag = radix_tree_delete(&mp->m_perag_tree, agno); + kmem_free(pag); } } diff --git a/libxfs/logitem.c b/libxfs/logitem.c index 0856ca6..0f2c14b 100644 --- a/libxfs/logitem.c +++ b/libxfs/logitem.c @@ -156,7 +156,7 @@ xfs_inode_item_init( iip->ili_inode = ip; iip->ili_format.ilf_type = XFS_LI_INODE; iip->ili_format.ilf_ino = ip->i_ino; - iip->ili_format.ilf_blkno = ip->i_blkno; - iip->ili_format.ilf_len = ip->i_len; - iip->ili_format.ilf_boffset = ip->i_boffset; + iip->ili_format.ilf_blkno = ip->i_imap.im_blkno; + iip->ili_format.ilf_len = ip->i_imap.im_len; + iip->ili_format.ilf_boffset = ip->i_imap.im_boffset; } diff --git a/libxfs/trans.c b/libxfs/trans.c index c5dd2ca..8f2fe55 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -577,7 +577,7 @@ inode_item_done( /* * Get the buffer containing the on-disk inode. */ - error = xfs_itobp(mp, NULL, ip, &dip, &bp, 0, 0, 0); + error = xfs_itobp(mp, NULL, ip, &dip, &bp, 0); if (error) { fprintf(stderr, _("%s: warning - itobp failed (%d)\n"), progname, error); diff --git a/libxfs/util.c b/libxfs/util.c index 077d2a2..bffbac0 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -28,7 +28,10 @@ * where it's no longer worth the hassle of maintaining common code. */ void -libxfs_ichgtime(xfs_inode_t *ip, int flags) +libxfs_trans_ichgtime( + struct xfs_trans *tp, + struct xfs_inode *ip, + int flags) { struct timespec tv; struct timeval stv; @@ -74,22 +77,26 @@ libxfs_iread( ip->i_ino = ino; ip->i_mount = mp; - /* - * Get pointer's to the on-disk inode and the buffer containing it. - * If the inode number refers to a block outside the file system - * then xfs_itobp() will return NULL. In this case we should - * return NULL as well. Set i_blkno to 0 so that xfs_itobp() will - * know that this is a new incore inode. - */ - error = xfs_itobp(mp, tp, ip, &dip, &bp, bno, 0, XFS_BUF_LOCK); - if (error) - return error; + /* + * Fill in the location information in the in-core inode. + */ + error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, 0); + if (error) + return error; + + /* + * Get pointers to the on-disk inode and the buffer containing it. + */ + error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp, XBF_LOCK, 0); + if (error) + return error; + dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); /* * If we got something that isn't an inode it means someone * (nfs or dmi) has a stale handle. */ - if (be16_to_cpu(dip->di_core.di_magic) != XFS_DINODE_MAGIC) { + if (be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC) { xfs_trans_brelse(tp, bp); return EINVAL; } @@ -101,18 +108,18 @@ libxfs_iread( * specific information. * Otherwise, just get the truly permanent information. */ - if (dip->di_core.di_mode) { - xfs_dinode_from_disk(&ip->i_d, &dip->di_core); + if (dip->di_mode) { + xfs_dinode_from_disk(&ip->i_d, dip); error = xfs_iformat(ip, dip); if (error) { xfs_trans_brelse(tp, bp); return error; } } else { - ip->i_d.di_magic = be16_to_cpu(dip->di_core.di_magic); - ip->i_d.di_version = dip->di_core.di_version; - ip->i_d.di_gen = be32_to_cpu(dip->di_core.di_gen); - ip->i_d.di_flushiter = be16_to_cpu(dip->di_core.di_flushiter); + ip->i_d.di_magic = be16_to_cpu(dip->di_magic); + ip->i_d.di_version = dip->di_version; + ip->i_d.di_gen = be32_to_cpu(dip->di_gen); + ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter); /* * Make sure to pull in the mode here as well in * case the inode is released without being used. @@ -140,7 +147,7 @@ libxfs_iread( * the new format. We don't change the version number so that we * can distinguish this from a real new format inode. */ - if (ip->i_d.di_version == XFS_DINODE_VERSION_1) { + if (ip->i_d.di_version == 1) { ip->i_d.di_nlink = ip->i_d.di_onlink; ip->i_d.di_onlink = 0; xfs_set_projid(&ip->i_d, 0); @@ -229,8 +236,8 @@ libxfs_ialloc( * here rather than here and in the flush/logging code. */ if (xfs_sb_version_hasnlink(&tp->t_mountp->m_sb) && - ip->i_d.di_version == XFS_DINODE_VERSION_1) { - ip->i_d.di_version = XFS_DINODE_VERSION_2; + ip->i_d.di_version == 1) { + ip->i_d.di_version = 2; /* * old link count, projid_lo/hi field, pad field * already zeroed @@ -246,7 +253,7 @@ libxfs_ialloc( ip->i_d.di_size = 0; ip->i_d.di_nextents = 0; ASSERT(ip->i_d.di_nblocks == 0); - xfs_ichgtime(ip, XFS_ICHGTIME_CHG|XFS_ICHGTIME_MOD); + xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG|XFS_ICHGTIME_MOD); /* * di_gen will have been taken care of in xfs_iread. */ @@ -398,7 +405,7 @@ libxfs_iflush_int(xfs_inode_t *ip, xfs_buf_t *bp) mp = ip->i_mount; /* set *dip = inode's place in the buffer */ - dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_boffset); + dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); ASSERT(ip->i_d.di_magic == XFS_DINODE_MAGIC); if ((ip->i_d.di_mode & S_IFMT) == S_IFREG) { @@ -419,7 +426,7 @@ libxfs_iflush_int(xfs_inode_t *ip, xfs_buf_t *bp) * because if the inode is dirty at all the core must * be. */ - xfs_dinode_to_disk(&dip->di_core, &ip->i_d); + xfs_dinode_to_disk(dip, &ip->i_d); /* * If this is really an old format inode and the superblock version @@ -427,28 +434,27 @@ libxfs_iflush_int(xfs_inode_t *ip, xfs_buf_t *bp) * convert back to the old inode format. If the superblock version * has been updated, then make the conversion permanent. */ - ASSERT(ip->i_d.di_version == XFS_DINODE_VERSION_1 || + ASSERT(ip->i_d.di_version == 1 || xfs_sb_version_hasnlink(&mp->m_sb)); - if (ip->i_d.di_version == XFS_DINODE_VERSION_1) { + if (ip->i_d.di_version == 1) { if (!xfs_sb_version_hasnlink(&mp->m_sb)) { /* * Convert it back. */ ASSERT(ip->i_d.di_nlink <= XFS_MAXLINK_1); - dip->di_core.di_onlink = cpu_to_be16(ip->i_d.di_nlink); + dip->di_onlink = cpu_to_be16(ip->i_d.di_nlink); } else { /* * The superblock version has already been bumped, * so just make the conversion to the new inode * format permanent. */ - ip->i_d.di_version = XFS_DINODE_VERSION_2; - dip->di_core.di_version = XFS_DINODE_VERSION_2; + ip->i_d.di_version = 2; + dip->di_version = 2; ip->i_d.di_onlink = 0; - dip->di_core.di_onlink = 0; + dip->di_onlink = 0; memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); - memset(&(dip->di_core.di_pad[0]), 0, - sizeof(dip->di_core.di_pad)); + memset(&(dip->di_pad[0]), 0, sizeof(dip->di_pad)); ASSERT(xfs_get_projid(ip->i_d) == 0); } } @@ -571,10 +577,11 @@ libxfs_alloc_file_space( xfs_trans_ijoin(tp, ip, 0); xfs_trans_ihold(tp, ip); - XFS_BMAP_INIT(&free_list, &firstfsb); + xfs_bmap_init(&free_list, &firstfsb); error = xfs_bmapi(tp, ip, startoffset_fsb, allocatesize_fsb, xfs_bmapi_flags, &firstfsb, 0, imapp, - &reccount, &free_list, NULL); + &reccount, &free_list); + if (error) break; diff --git a/libxfs/xfs.h b/libxfs/xfs.h index a9e2bf1..b3f8378 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -51,9 +51,9 @@ typedef __uint32_t inst_t; /* an instruction */ #define m_ddev_targp m_dev +#define xfs_error_level 0 #define STATIC static -#define STATIC_INLINE static inline #define ATTR_ROOT LIBXFS_ATTR_ROOT #define ATTR_SECURE LIBXFS_ATTR_SECURE @@ -83,10 +83,6 @@ typedef __uint32_t inst_t; /* an instruction */ #define XFS_WANT_CORRUPTED_RETURN(expr) \ { if (!(expr)) { return EFSCORRUPTED; } } -#define TRACE_FREE(s,a,b,x,f) ((void) 0) -#define TRACE_ALLOC(s,a) ((void) 0) -#define TRACE_MODAGF(a,b,c) ((void) 0) - #ifdef __GNUC__ #define __return_address __builtin_return_address(0) #endif @@ -99,6 +95,8 @@ typedef __uint32_t inst_t; /* an instruction */ #define spin_unlock(a) ((void) 0) #define likely(x) (x) #define unlikely(x) (x) +#define rcu_read_lock() ((void) 0) +#define rcu_read_unlock() ((void) 0) /* * random32 is used for di_gen inode allocation, it must be zero for libxfs @@ -190,6 +188,9 @@ roundup_pow_of_two(uint v) /* buffer management */ #define XFS_BUF_LOCK 0 #define XFS_BUF_TRYLOCK 0 +#define XBF_LOCK XFS_BUF_LOCK +#define XBF_TRYLOCK XFS_BUF_TRYLOCK +#define XBF_DONT_BLOCK 0 #define XFS_BUF_GETERROR(bp) 0 #define XFS_BUF_DONE(bp) ((bp)->b_flags |= LIBXFS_B_UPTODATE) #define XFS_BUF_ISDONE(bp) ((bp)->b_flags & LIBXFS_B_UPTODATE) @@ -204,14 +205,14 @@ roundup_pow_of_two(uint v) #define xfs_read_buf(mp,devp,blkno,len,f,bpp) \ (*(bpp) = libxfs_readbuf((devp), \ (blkno), (len), 1), 0) -#define xfs_buf_get_flags(devp,blkno,len,f) \ +#define xfs_buf_get(devp,blkno,len,f) \ (libxfs_getbuf((devp), (blkno), (len))) #define xfs_bwrite(mp,bp) libxfs_writebuf((bp), 0) -#define XFS_B_READ LIBXFS_BREAD -#define XFS_B_WRITE LIBXFS_BWRITE -#define xfs_biomove(bp,off,len,data,f) libxfs_iomove(bp,off,len,data,f) -#define xfs_biozero(bp,off,len) libxfs_iomove(bp,off,len,0,LIBXFS_BZERO) +#define XBRW_READ LIBXFS_BREAD +#define XBRW_WRITE LIBXFS_BWRITE +#define xfs_buf_iomove(bp,off,len,data,f) libxfs_iomove(bp,off,len,data,f) +#define xfs_buf_zero(bp,off,len) libxfs_iomove(bp,off,len,0,LIBXFS_BZERO) /* mount stuff */ #define XFS_MOUNT_32BITINODES LIBXFS_MOUNT_32BITINODES @@ -220,6 +221,9 @@ roundup_pow_of_two(uint v) #define XFS_MOUNT_WSYNC 0 /* ignored in userspace */ #define XFS_MOUNT_NOALIGN 0 /* ignored in userspace */ +#define xfs_icsb_modify_counters(mp, field, delta, rsvd) \ + xfs_mod_incore_sb(mp, field, delta, rsvd) + /* * Map XFS kernel routine names to libxfs versions */ @@ -234,7 +238,7 @@ roundup_pow_of_two(uint v) #define xfs_fs_cmn_err libxfs_fs_cmn_err #define xfs_bmap_finish libxfs_bmap_finish -#define xfs_ichgtime libxfs_ichgtime +#define xfs_trans_ichgtime libxfs_trans_ichgtime #define xfs_mod_incore_sb libxfs_mod_incore_sb #define xfs_trans_alloc libxfs_trans_alloc @@ -250,6 +254,7 @@ roundup_pow_of_two(uint v) #define xfs_trans_iget libxfs_trans_iget #define xfs_trans_ihold libxfs_trans_ihold #define xfs_trans_ijoin libxfs_trans_ijoin +#define xfs_trans_ijoin_ref libxfs_trans_ijoin_ref #define xfs_trans_inode_alloc_buf libxfs_trans_inode_alloc_buf #define xfs_trans_log_buf libxfs_trans_log_buf #define xfs_trans_log_inode libxfs_trans_log_inode @@ -263,7 +268,7 @@ roundup_pow_of_two(uint v) #define xfs_trans_agflist_delta(tp, d) #define xfs_trans_agbtree_delta(tp, d) -#define xfs_baread(a,b,c) ((void) 0) /* no readahead */ +#define xfs_buf_readahead(a,b,c) ((void) 0) /* no readahead */ #define xfs_btree_reada_bufl(m,fsb,c) ((void) 0) #define xfs_btree_reada_bufs(m,fsb,c,x) ((void) 0) #define xfs_buftrace(x,y) ((void) 0) /* debug only */ @@ -287,8 +292,12 @@ roundup_pow_of_two(uint v) #define xfs_iunlock(ip,mode) ((void) 0) /* space allocation */ -#define xfs_alloc_search_busy(tp,ag,b,len) ((void) 0) -#define xfs_alloc_mark_busy(tp,ag,b,len) ((void) 0) +#define xfs_alloc_busy_search(tp,ag,b,len) 0 +/* avoid unused variable warning */ +#define xfs_alloc_busy_insert(tp,ag,b,len) ({ \ + xfs_agnumber_t __foo = ag; \ + __foo = 0; \ +}) #define xfs_rotorstep 1 #define xfs_bmap_rtalloc(a) (ENOSYS) #define xfs_rtpick_extent(mp,tp,len,p) (ENOSYS) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 77013ab..a76512d 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -494,9 +494,6 @@ xfs_alloc_ag_vextent( */ if (args->agbno != NULLAGBLOCK) { xfs_agf_t *agf; /* allocation group freelist header */ -#ifdef XFS_ALLOC_TRACE - xfs_mount_t *mp = args->mp; -#endif long slen = (long)args->len; ASSERT(args->len >= args->minlen && args->len <= args->maxlen); @@ -511,12 +508,18 @@ xfs_alloc_ag_vextent( args->pag->pagf_freeblks -= args->len; ASSERT(be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length)); - TRACE_MODAGF(NULL, agf, XFS_AGF_FREEBLKS); xfs_alloc_log_agf(args->tp, args->agbp, XFS_AGF_FREEBLKS); - /* search the busylist for these blocks */ - xfs_alloc_search_busy(args->tp, args->agno, - args->agbno, args->len); + /* + * Search the busylist for these blocks and mark the + * transaction as synchronous if blocks are found. This + * avoids the need to block due to a synchronous log + * force to ensure correct ordering as the synchronous + * transaction will guarantee that for us. + */ + if (xfs_alloc_busy_search(args->mp, args->agno, + args->agbno, args->len)) + xfs_trans_set_sync(args->tp); } if (!args->isfl) xfs_trans_mod_sb(args->tp, @@ -555,57 +558,53 @@ xfs_alloc_ag_vextent_exact( * 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. @@ -614,20 +613,117 @@ 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_ALLOC("normal", 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: xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR); - TRACE_ALLOC("error", args); + trace_xfs_alloc_exact_error(args); + return error; +} + +/* + * 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; } @@ -648,7 +744,7 @@ xfs_alloc_ag_vextent_near( xfs_agblock_t gtbnoa; /* aligned ... */ xfs_extlen_t gtdiff; /* difference to right side entry */ xfs_extlen_t gtlen; /* length of right side entry */ - xfs_extlen_t gtlena; /* aligned ... */ + xfs_extlen_t gtlena = 0; /* aligned ... */ xfs_agblock_t gtnew; /* useful start bno of right side */ int error; /* error code */ int i; /* result code, temporary */ @@ -656,10 +752,8 @@ xfs_alloc_ag_vextent_near( xfs_agblock_t ltbno; /* start bno of left side entry */ xfs_agblock_t ltbnoa; /* aligned ... */ xfs_extlen_t ltdiff; /* difference to left side entry */ - /*REFERENCED*/ - xfs_agblock_t ltend; /* end bno of left side entry */ xfs_extlen_t ltlen; /* length of left side entry */ - xfs_extlen_t ltlena; /* aligned ... */ + xfs_extlen_t ltlena = 0; /* aligned ... */ xfs_agblock_t ltnew; /* useful start bno of left side */ xfs_extlen_t rlen; /* length of returned extent */ #if defined(DEBUG) && defined(__KERNEL__) @@ -782,12 +876,11 @@ xfs_alloc_ag_vextent_near( if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) goto error0; XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - ltend = ltbno + ltlen; - ASSERT(ltend <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); + ASSERT(ltbno + ltlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); args->len = blen; if (!xfs_alloc_fix_minleft(args)) { xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); - TRACE_ALLOC("nominleft", args); + trace_xfs_alloc_near_nominleft(args); return 0; } blen = args->len; @@ -796,7 +889,7 @@ xfs_alloc_ag_vextent_near( */ args->agbno = bnew; ASSERT(bnew >= ltbno); - ASSERT(bnew + blen <= ltend); + ASSERT(bnew + blen <= ltbno + ltlen); /* * Set up a cursor for the by-bno tree. */ @@ -810,7 +903,8 @@ xfs_alloc_ag_vextent_near( goto error0; xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR); - TRACE_ALLOC("first", args); + + trace_xfs_alloc_near_first(args); return 0; } /* @@ -900,211 +994,55 @@ 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. */ if (bno_cur_lt == NULL && bno_cur_gt == NULL) { - TRACE_ALLOC("neither", args); + trace_xfs_alloc_size_neither(args); 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 @@ -1121,14 +1059,14 @@ xfs_alloc_ag_vextent_near( j = 1; } else j = 0; + /* * Fix up the length and compute the useful address. */ - ltend = ltbno + ltlen; args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); xfs_alloc_fix_len(args); if (!xfs_alloc_fix_minleft(args)) { - TRACE_ALLOC("nominleft", args); + trace_xfs_alloc_near_nominleft(args); xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); return 0; @@ -1137,19 +1075,24 @@ xfs_alloc_ag_vextent_near( (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment, ltbno, ltlen, <new); ASSERT(ltnew >= ltbno); - ASSERT(ltnew + rlen <= ltend); + ASSERT(ltnew + rlen <= ltbno + ltlen); ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); args->agbno = ltnew; if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno, ltlen, ltnew, rlen, XFSA_FIXUP_BNO_OK))) goto error0; - TRACE_ALLOC(j ? "gt" : "lt", args); + + if (j) + trace_xfs_alloc_near_greater(args); + else + trace_xfs_alloc_near_lesser(args); + xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR); return 0; error0: - TRACE_ALLOC("error", args); + trace_xfs_alloc_near_error(args); if (cnt_cur != NULL) xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR); if (bno_cur_lt != NULL) @@ -1200,7 +1143,7 @@ xfs_alloc_ag_vextent_size( goto error0; if (i == 0 || flen == 0) { xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); - TRACE_ALLOC("noentry", args); + trace_xfs_alloc_size_noentry(args); return 0; } ASSERT(i == 1); @@ -1277,7 +1220,7 @@ xfs_alloc_ag_vextent_size( xfs_alloc_fix_len(args); if (rlen < args->minlen || !xfs_alloc_fix_minleft(args)) { xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); - TRACE_ALLOC("nominleft", args); + trace_xfs_alloc_size_nominleft(args); args->agbno = NULLAGBLOCK; return 0; } @@ -1300,11 +1243,11 @@ xfs_alloc_ag_vextent_size( args->agbno + args->len <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length), error0); - TRACE_ALLOC("normal", args); + trace_xfs_alloc_size_done(args); return 0; error0: - TRACE_ALLOC("error", args); + trace_xfs_alloc_size_error(args); if (cnt_cur) xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR); if (bno_cur) @@ -1363,7 +1306,7 @@ xfs_alloc_ag_vextent_small( be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length), error0); args->wasfromfl = 1; - TRACE_ALLOC("freelist", args); + trace_xfs_alloc_small_freelist(args); *stat = 0; return 0; } @@ -1385,17 +1328,17 @@ xfs_alloc_ag_vextent_small( */ if (flen < args->minlen) { args->agbno = NULLAGBLOCK; - TRACE_ALLOC("notenough", args); + trace_xfs_alloc_small_notenough(args); flen = 0; } *fbnop = fbno; *flenp = flen; *stat = 1; - TRACE_ALLOC("normal", args); + trace_xfs_alloc_small_done(args); return 0; error0: - TRACE_ALLOC("error", args); + trace_xfs_alloc_small_error(args); return error; } @@ -1629,26 +1572,25 @@ xfs_free_ag_extent( xfs_agf_t *agf; xfs_perag_t *pag; /* per allocation group data */ + pag = xfs_perag_get(mp, agno); + pag->pagf_freeblks += len; + xfs_perag_put(pag); + agf = XFS_BUF_TO_AGF(agbp); - pag = &mp->m_perag[agno]; be32_add_cpu(&agf->agf_freeblks, len); xfs_trans_agblocks_delta(tp, len); - pag->pagf_freeblks += len; XFS_WANT_CORRUPTED_GOTO( be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length), error0); - TRACE_MODAGF(NULL, agf, XFS_AGF_FREEBLKS); xfs_alloc_log_agf(tp, agbp, XFS_AGF_FREEBLKS); if (!isfl) xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len); XFS_STATS_INC(xs_freex); XFS_STATS_ADD(xs_freeb, len); } - TRACE_FREE(haveleft ? - (haveright ? "both" : "left") : - (haveright ? "right" : "none"), - agno, bno, len, isfl); + + trace_xfs_free_extent(mp, agno, bno, len, isfl, haveleft, haveright); /* * Since blocks move to the free list without the coordination @@ -1661,11 +1603,11 @@ xfs_free_ag_extent( * when the iclog commits to disk. If a busy block is allocated, * the iclog is pushed up to the LSN that freed the block. */ - xfs_alloc_mark_busy(tp, agno, bno, len); + xfs_alloc_busy_insert(tp, agno, bno, len); return 0; error0: - TRACE_FREE("error", agno, bno, len, isfl); + trace_xfs_free_extent(mp, agno, bno, len, isfl, -1, -1); if (bno_cur) xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR); if (cnt_cur) @@ -1701,6 +1643,25 @@ xfs_alloc_compute_maxlevels( } /* + * Find the length of the longest extent in an AG. + */ +xfs_extlen_t +xfs_alloc_longest_free_extent( + struct xfs_mount *mp, + struct xfs_perag *pag) +{ + xfs_extlen_t need, delta = 0; + + need = XFS_MIN_FREELIST_PAG(pag, mp); + if (need > pag->pagf_flcount) + delta = need - pag->pagf_flcount; + + if (pag->pagf_longest > delta) + return pag->pagf_longest - delta; + return pag->pagf_flcount > 0 || pag->pagf_longest > 0; +} + +/* * Decide whether to use this allocation group for this allocation. * If so, fix up the btree freelist's size. * @@ -1754,15 +1715,12 @@ xfs_alloc_fix_freelist( } if (!(flags & XFS_ALLOC_FLAG_FREEING)) { - need = XFS_MIN_FREELIST_PAG(pag, mp); - delta = need > pag->pagf_flcount ? need - pag->pagf_flcount : 0; /* * If it looks like there isn't a long enough extent, or enough * total blocks, reject it. */ - longest = (pag->pagf_longest > delta) ? - (pag->pagf_longest - delta) : - (pag->pagf_flcount > 0 || pag->pagf_longest > 0); + need = XFS_MIN_FREELIST_PAG(pag, mp); + longest = xfs_alloc_longest_free_extent(mp, pag); if ((args->minlen + args->alignment + args->minalignslop - 1) > longest || ((int)(pag->pagf_freeblks + pag->pagf_flcount - @@ -1925,10 +1883,12 @@ xfs_alloc_get_freelist( xfs_trans_brelse(tp, agflbp); if (be32_to_cpu(agf->agf_flfirst) == XFS_AGFL_SIZE(mp)) agf->agf_flfirst = 0; - pag = &mp->m_perag[be32_to_cpu(agf->agf_seqno)]; + + pag = xfs_perag_get(mp, be32_to_cpu(agf->agf_seqno)); be32_add_cpu(&agf->agf_flcount, -1); xfs_trans_agflist_delta(tp, -1); pag->pagf_flcount--; + xfs_perag_put(pag); logflags = XFS_AGF_FLFIRST | XFS_AGF_FLCOUNT; if (btreeblk) { @@ -1937,19 +1897,24 @@ xfs_alloc_get_freelist( logflags |= XFS_AGF_BTREEBLKS; } - TRACE_MODAGF(NULL, agf, logflags); xfs_alloc_log_agf(tp, agbp, logflags); *bnop = bno; /* - * As blocks are freed, they are added to the per-ag busy list - * and remain there until the freeing transaction is committed to - * disk. Now that we have allocated blocks, this list must be - * searched to see if a block is being reused. If one is, then - * the freeing transaction must be pushed to disk NOW by forcing - * to disk all iclogs up that transaction's LSN. - */ - xfs_alloc_search_busy(tp, be32_to_cpu(agf->agf_seqno), bno, 1); + * As blocks are freed, they are added to the per-ag busy list and + * remain there until the freeing transaction is committed to disk. + * Now that we have allocated blocks, this list must be searched to see + * if a block is being reused. If one is, then the freeing transaction + * must be pushed to disk before this transaction. + * + * We do this by setting the current transaction to a sync transaction + * which guarantees that the freeing transaction is on disk before this + * transaction. This is done instead of a synchronous log force here so + * that we don't sit and wait with the AGF locked in the transaction + * during the log force. + */ + if (xfs_alloc_busy_search(mp, be32_to_cpu(agf->agf_seqno), bno, 1)) + xfs_trans_set_sync(tp); return 0; } @@ -1980,6 +1945,8 @@ xfs_alloc_log_agf( sizeof(xfs_agf_t) }; + trace_xfs_agf(tp->t_mountp, XFS_BUF_TO_AGF(bp), fields, _RET_IP_); + xfs_btree_offsets(fields, offsets, XFS_AGF_NUM_BITS, &first, &last); xfs_trans_log_buf(tp, bp, (uint)first, (uint)last); } @@ -2033,7 +2000,8 @@ xfs_alloc_put_freelist( be32_add_cpu(&agf->agf_fllast, 1); if (be32_to_cpu(agf->agf_fllast) == XFS_AGFL_SIZE(mp)) agf->agf_fllast = 0; - pag = &mp->m_perag[be32_to_cpu(agf->agf_seqno)]; + + pag = xfs_perag_get(mp, be32_to_cpu(agf->agf_seqno)); be32_add_cpu(&agf->agf_flcount, 1); xfs_trans_agflist_delta(tp, 1); pag->pagf_flcount++; @@ -2044,14 +2012,13 @@ xfs_alloc_put_freelist( pag->pagf_btreeblks--; logflags |= XFS_AGF_BTREEBLKS; } + xfs_perag_put(pag); - TRACE_MODAGF(NULL, agf, logflags); xfs_alloc_log_agf(tp, agbp, logflags); ASSERT(be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp)); blockp = &agfl->agfl_bno[be32_to_cpu(agf->agf_fllast)]; *blockp = cpu_to_be32(bno); - TRACE_MODAGF(NULL, agf, logflags); xfs_alloc_log_agf(tp, agbp, logflags); xfs_trans_log_buf(tp, agflbp, (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl), @@ -2064,44 +2031,41 @@ xfs_alloc_put_freelist( * Read in the allocation group header (free/alloc section). */ int /* error */ -xfs_alloc_read_agf( - xfs_mount_t *mp, /* mount point structure */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_agnumber_t agno, /* allocation group number */ - int flags, /* XFS_ALLOC_FLAG_... */ - xfs_buf_t **bpp) /* buffer for the ag freelist header */ +xfs_read_agf( + struct xfs_mount *mp, /* mount point structure */ + struct xfs_trans *tp, /* transaction pointer */ + xfs_agnumber_t agno, /* allocation group number */ + int flags, /* XFS_BUF_ */ + struct xfs_buf **bpp) /* buffer for the ag freelist header */ { - xfs_agf_t *agf; /* ag freelist header */ + struct xfs_agf *agf; /* ag freelist header */ int agf_ok; /* set if agf is consistent */ - xfs_buf_t *bp; /* return value */ - xfs_perag_t *pag; /* per allocation group data */ int error; ASSERT(agno != NULLAGNUMBER); error = xfs_trans_read_buf( mp, tp, mp->m_ddev_targp, XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), - (flags & XFS_ALLOC_FLAG_TRYLOCK) ? XFS_BUF_TRYLOCK : 0U, - &bp); + XFS_FSS_TO_BB(mp, 1), flags, bpp); if (error) return error; - ASSERT(!bp || !XFS_BUF_GETERROR(bp)); - if (!bp) { - *bpp = NULL; + if (!*bpp) return 0; - } + + ASSERT(!XFS_BUF_GETERROR(*bpp)); + agf = XFS_BUF_TO_AGF(*bpp); + /* * Validate the magic number of the agf block. */ - agf = XFS_BUF_TO_AGF(bp); agf_ok = be32_to_cpu(agf->agf_magicnum) == XFS_AGF_MAGIC && XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) && be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) && be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) && - be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp); + be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp) && + be32_to_cpu(agf->agf_seqno) == agno; if (xfs_sb_version_haslazysbcount(&mp->m_sb)) agf_ok = agf_ok && be32_to_cpu(agf->agf_btreeblks) <= be32_to_cpu(agf->agf_length); @@ -2109,10 +2073,41 @@ xfs_alloc_read_agf( XFS_RANDOM_ALLOC_READ_AGF))) { XFS_CORRUPTION_ERROR("xfs_alloc_read_agf", XFS_ERRLEVEL_LOW, mp, agf); - xfs_trans_brelse(tp, bp); + xfs_trans_brelse(tp, *bpp); return XFS_ERROR(EFSCORRUPTED); } - pag = &mp->m_perag[agno]; + XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_AGF, XFS_AGF_REF); + return 0; +} + +/* + * Read in the allocation group header (free/alloc section). + */ +int /* error */ +xfs_alloc_read_agf( + struct xfs_mount *mp, /* mount point structure */ + struct xfs_trans *tp, /* transaction pointer */ + xfs_agnumber_t agno, /* allocation group number */ + int flags, /* XFS_ALLOC_FLAG_... */ + struct xfs_buf **bpp) /* buffer for the ag freelist header */ +{ + struct xfs_agf *agf; /* ag freelist header */ + struct xfs_perag *pag; /* per allocation group data */ + int error; + + ASSERT(agno != NULLAGNUMBER); + + error = xfs_read_agf(mp, tp, agno, + (flags & XFS_ALLOC_FLAG_TRYLOCK) ? XBF_TRYLOCK : 0, + bpp); + if (error) + return error; + if (!*bpp) + return 0; + ASSERT(!XFS_BUF_GETERROR(*bpp)); + + agf = XFS_BUF_TO_AGF(*bpp); + pag = xfs_perag_get(mp, agno); if (!pag->pagf_init) { pag->pagf_freeblks = be32_to_cpu(agf->agf_freeblks); pag->pagf_btreeblks = be32_to_cpu(agf->agf_btreeblks); @@ -2123,8 +2118,7 @@ xfs_alloc_read_agf( pag->pagf_levels[XFS_BTNUM_CNTi] = be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]); spin_lock_init(&pag->pagb_lock); - pag->pagb_list = kmem_zalloc(XFS_PAGB_NUM_SLOTS * - sizeof(xfs_perag_busy_t), KM_SLEEP); + pag->pagb_count = 0; pag->pagf_init = 1; } #ifdef DEBUG @@ -2139,8 +2133,7 @@ xfs_alloc_read_agf( be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi])); } #endif - XFS_BUF_SET_VTYPE_REF(bp, B_FS_AGF, XFS_AGF_REF); - *bpp = bp; + xfs_perag_put(pag); return 0; } @@ -2187,7 +2180,7 @@ xfs_alloc_vextent( args->minlen > args->maxlen || args->minlen > agsize || args->mod >= args->prod) { args->fsbno = NULLFSBLOCK; - TRACE_ALLOC("badargs", args); + trace_xfs_alloc_vextent_badargs(args); return 0; } minleft = args->minleft; @@ -2200,24 +2193,21 @@ xfs_alloc_vextent( * These three force us into a single a.g. */ args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno); - down_read(&mp->m_peraglock); - args->pag = &mp->m_perag[args->agno]; + args->pag = xfs_perag_get(mp, args->agno); args->minleft = 0; error = xfs_alloc_fix_freelist(args, 0); args->minleft = minleft; if (error) { - TRACE_ALLOC("nofix", args); + trace_xfs_alloc_vextent_nofix(args); goto error0; } if (!args->agbp) { - up_read(&mp->m_peraglock); - TRACE_ALLOC("noagbp", args); + trace_xfs_alloc_vextent_noagbp(args); break; } args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno); if ((error = xfs_alloc_ag_vextent(args))) goto error0; - up_read(&mp->m_peraglock); break; case XFS_ALLOCTYPE_START_BNO: /* @@ -2269,14 +2259,13 @@ xfs_alloc_vextent( * Loop over allocation groups twice; first time with * trylock set, second time without. */ - down_read(&mp->m_peraglock); for (;;) { - args->pag = &mp->m_perag[args->agno]; + args->pag = xfs_perag_get(mp, args->agno); if (no_min) args->minleft = 0; error = xfs_alloc_fix_freelist(args, flags); args->minleft = minleft; if (error) { - TRACE_ALLOC("nofix", args); + trace_xfs_alloc_vextent_nofix(args); goto error0; } /* @@ -2287,7 +2276,9 @@ xfs_alloc_vextent( goto error0; break; } - TRACE_ALLOC("loopfailed", args); + + trace_xfs_alloc_vextent_loopfailed(args); + /* * Didn't work, figure out the next iteration. */ @@ -2314,7 +2305,7 @@ xfs_alloc_vextent( if (args->agno == sagno) { if (no_min == 1) { args->agbno = NULLAGBLOCK; - TRACE_ALLOC("allfailed", args); + trace_xfs_alloc_vextent_allfailed(args); break; } if (flags == 0) { @@ -2328,8 +2319,8 @@ xfs_alloc_vextent( } } } + xfs_perag_put(args->pag); } - up_read(&mp->m_peraglock); if (bump_rotor || (type == XFS_ALLOCTYPE_ANY_AG)) { if (args->agno == sagno) mp->m_agfrotor = (mp->m_agfrotor + 1) % @@ -2355,9 +2346,10 @@ xfs_alloc_vextent( args->len); #endif } + xfs_perag_put(args->pag); return 0; error0: - up_read(&mp->m_peraglock); + xfs_perag_put(args->pag); return error; } @@ -2382,8 +2374,7 @@ xfs_free_extent( args.agno = XFS_FSB_TO_AGNO(args.mp, bno); ASSERT(args.agno < args.mp->m_sb.sb_agcount); args.agbno = XFS_FSB_TO_AGBNO(args.mp, bno); - down_read(&args.mp->m_peraglock); - args.pag = &args.mp->m_perag[args.agno]; + args.pag = xfs_perag_get(args.mp, args.agno); if ((error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING))) goto error0; #ifdef DEBUG @@ -2393,6 +2384,6 @@ xfs_free_extent( #endif error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, len, 0); error0: - up_read(&args.mp->m_peraglock); + xfs_perag_put(args.pag); return error; } diff --git a/libxfs/xfs_alloc_btree.c b/libxfs/xfs_alloc_btree.c index 4d55caf..b782d9d 100644 --- a/libxfs/xfs_alloc_btree.c +++ b/libxfs/xfs_alloc_btree.c @@ -36,12 +36,14 @@ xfs_allocbt_set_root( struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); int btnum = cur->bc_btnum; + struct xfs_perag *pag = xfs_perag_get(cur->bc_mp, seqno); ASSERT(ptr->s != 0); agf->agf_roots[btnum] = ptr->s; be32_add_cpu(&agf->agf_levels[btnum], inc); - cur->bc_mp->m_perag[seqno].pagf_levels[btnum] += inc; + pag->pagf_levels[btnum] += inc; + xfs_perag_put(pag); xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_ROOTS | XFS_AGF_LEVELS); } @@ -91,7 +93,7 @@ xfs_allocbt_free_block( xfs_agblock_t bno; int error; - bno = XFS_DADDR_TO_AGBNO(cur->bc_mp, XFS_BUF_ADDR(bp)); + bno = xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp)); error = xfs_alloc_put_freelist(cur->bc_tp, agbp, NULL, bno, 1); if (error) return error; @@ -107,7 +109,7 @@ xfs_allocbt_free_block( * disk. If a busy block is allocated, the iclog is pushed up to the * LSN that freed the block. */ - xfs_alloc_mark_busy(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1); + xfs_alloc_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1); xfs_trans_agbtree_delta(cur->bc_tp, -1); return 0; } @@ -125,6 +127,7 @@ xfs_allocbt_update_lastrec( { struct xfs_agf *agf = XFS_BUF_TO_AGF(cur->bc_private.a.agbp); xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); + struct xfs_perag *pag; __be32 len; int numrecs; @@ -168,7 +171,9 @@ xfs_allocbt_update_lastrec( } agf->agf_longest = len; - cur->bc_mp->m_perag[seqno].pagf_longest = be32_to_cpu(len); + pag = xfs_perag_get(cur->bc_mp, seqno); + pag->pagf_longest = be32_to_cpu(len); + xfs_perag_put(pag); xfs_alloc_log_agf(cur->bc_tp, cur->bc_private.a.agbp, XFS_AGF_LONGEST); } @@ -255,38 +260,6 @@ xfs_allocbt_key_diff( return (__int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; } -STATIC int -xfs_allocbt_kill_root( - struct xfs_btree_cur *cur, - struct xfs_buf *bp, - int level, - union xfs_btree_ptr *newroot) -{ - int error; - - XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); - XFS_BTREE_STATS_INC(cur, killroot); - - /* - * Update the root pointer, decreasing the level by 1 and then - * free the old root. - */ - xfs_allocbt_set_root(cur, newroot, -1); - error = xfs_allocbt_free_block(cur, bp); - if (error) { - XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); - return error; - } - - XFS_BTREE_STATS_INC(cur, free); - - xfs_btree_setbuf(cur, level, NULL); - cur->bc_nlevels--; - - XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); - return 0; -} - #ifdef DEBUG STATIC int xfs_allocbt_keys_inorder( @@ -398,7 +371,6 @@ static const struct xfs_btree_ops xfs_allocbt_ops = { .dup_cursor = xfs_allocbt_dup_cursor, .set_root = xfs_allocbt_set_root, - .kill_root = xfs_allocbt_kill_root, .alloc_block = xfs_allocbt_alloc_block, .free_block = xfs_allocbt_free_block, .update_lastrec = xfs_allocbt_update_lastrec, diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index 7ab37ff..aaeaec4 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -60,12 +60,12 @@ STATIC int xfs_attr_rmtval_remove(xfs_da_args_t *args); STATIC int xfs_attr_name_to_xname( struct xfs_name *xname, - const char *aname) + const unsigned char *aname) { if (!aname) return EINVAL; xname->name = aname; - xname->len = strlen(aname); + xname->len = strlen((char *)aname); if (xname->len >= MAXNAMELEN) return EFAULT; /* match IRIX behaviour */ @@ -87,9 +87,13 @@ xfs_inode_hasattr( * Overall external interface routines. *========================================================================*/ -int -xfs_attr_fetch(xfs_inode_t *ip, struct xfs_name *name, - char *value, int *valuelenp, int flags) +STATIC int +xfs_attr_get_int( + struct xfs_inode *ip, + struct xfs_name *name, + unsigned char *value, + int *valuelenp, + int flags) { xfs_da_args_t args; int error; @@ -134,8 +138,8 @@ xfs_attr_fetch(xfs_inode_t *ip, struct xfs_name *name, int xfs_attr_get( xfs_inode_t *ip, - const char *name, - char *value, + const unsigned char *name, + unsigned char *value, int *valuelenp, int flags) { @@ -152,7 +156,7 @@ xfs_attr_get( return error; xfs_ilock(ip, XFS_ILOCK_SHARED); - error = xfs_attr_fetch(ip, &xname, value, valuelenp, flags); + error = xfs_attr_get_int(ip, &xname, value, valuelenp, flags); xfs_iunlock(ip, XFS_ILOCK_SHARED); return(error); } @@ -160,7 +164,7 @@ xfs_attr_get( /* * Calculate how many blocks we need for the new attribute, */ -int +STATIC int xfs_attr_calc_size( struct xfs_inode *ip, int namelen, @@ -198,8 +202,12 @@ xfs_attr_calc_size( } STATIC int -xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, - char *value, int valuelen, int flags) +xfs_attr_set_int( + struct xfs_inode *dp, + struct xfs_name *name, + unsigned char *value, + int valuelen, + int flags) { xfs_da_args_t args; xfs_fsblock_t firstblock; @@ -212,8 +220,9 @@ xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, /* * Attach the dquots to the inode. */ - if ((error = XFS_QM_DQATTACH(mp, dp, 0))) - return (error); + error = xfs_qm_dqattach(dp, 0); + if (error) + return error; /* * If the inode doesn't have an attribute fork, add one. @@ -274,7 +283,7 @@ xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, } xfs_ilock(dp, XFS_ILOCK_EXCL); - error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, args.trans, dp, args.total, 0, + error = xfs_trans_reserve_quota_nblks(args.trans, dp, args.total, 0, rsvd ? XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES : XFS_QMOPT_RES_REGBLKS); if (error) { @@ -320,16 +329,15 @@ xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, if (mp->m_flags & XFS_MOUNT_WSYNC) { xfs_trans_set_sync(args.trans); } + + if (!error && (flags & ATTR_KERNOTIME) == 0) { + xfs_trans_ichgtime(args.trans, dp, + XFS_ICHGTIME_CHG); + } err2 = xfs_trans_commit(args.trans, XFS_TRANS_RELEASE_LOG_RES); xfs_iunlock(dp, XFS_ILOCK_EXCL); - /* - * Hit the inode change time. - */ - if (!error && (flags & ATTR_KERNOTIME) == 0) { - xfs_ichgtime(dp, XFS_ICHGTIME_CHG); - } return(error == 0 ? err2 : error); } @@ -337,7 +345,7 @@ xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, * It won't fit in the shortform, transform to a leaf block. * GROT: another possible req'mt for a double-split btree op. */ - XFS_BMAP_INIT(args.flist, args.firstblock); + xfs_bmap_init(args.flist, args.firstblock); error = xfs_attr_shortform_to_leaf(&args); if (!error) { error = xfs_bmap_finish(&args.trans, args.flist, @@ -387,6 +395,9 @@ xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, xfs_trans_set_sync(args.trans); } + if ((flags & ATTR_KERNOTIME) == 0) + xfs_trans_ichgtime(args.trans, dp, XFS_ICHGTIME_CHG); + /* * Commit the last in the sequence of transactions. */ @@ -394,13 +405,6 @@ xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name, error = xfs_trans_commit(args.trans, XFS_TRANS_RELEASE_LOG_RES); xfs_iunlock(dp, XFS_ILOCK_EXCL); - /* - * Hit the inode change time. - */ - if (!error && (flags & ATTR_KERNOTIME) == 0) { - xfs_ichgtime(dp, XFS_ICHGTIME_CHG); - } - return(error); out: @@ -414,8 +418,8 @@ out: int xfs_attr_set( xfs_inode_t *dp, - const char *name, - char *value, + const unsigned char *name, + unsigned char *value, int valuelen, int flags) { @@ -464,8 +468,9 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) /* * Attach the dquots to the inode. */ - if ((error = XFS_QM_DQATTACH(mp, dp, 0))) - return (error); + error = xfs_qm_dqattach(dp, 0); + if (error) + return error; /* * Start our first transaction of the day. @@ -534,6 +539,9 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) xfs_trans_set_sync(args.trans); } + if ((flags & ATTR_KERNOTIME) == 0) + xfs_trans_ichgtime(args.trans, dp, XFS_ICHGTIME_CHG); + /* * Commit the last in the sequence of transactions. */ @@ -541,13 +549,6 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) error = xfs_trans_commit(args.trans, XFS_TRANS_RELEASE_LOG_RES); xfs_iunlock(dp, XFS_ILOCK_EXCL); - /* - * Hit the inode change time. - */ - if (!error && (flags & ATTR_KERNOTIME) == 0) { - xfs_ichgtime(dp, XFS_ICHGTIME_CHG); - } - return(error); out: @@ -561,7 +562,7 @@ out: int xfs_attr_remove( xfs_inode_t *dp, - const char *name, + const unsigned char *name, int flags) { int error; @@ -586,7 +587,6 @@ xfs_attr_remove( return xfs_attr_remove_int(dp, &xname, flags); } - /*======================================================================== * External routines when attribute list is inside the inode *========================================================================*/ @@ -686,7 +686,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * Commit that transaction so that the node_addname() call * can manage its own transactions. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_node(args); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -787,7 +787,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) * If the result is small enough, shrink it all into the inode. */ if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { @@ -865,7 +865,7 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) * If the result is small enough, shrink it all into the inode. */ if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { @@ -924,7 +924,6 @@ xfs_attr_leaf_get(xfs_da_args_t *args) return(error); } - /*======================================================================== * External routines when attribute list size > XFS_LBSIZE(mp). *========================================================================*/ @@ -992,7 +991,7 @@ restart: * have been a b-tree. */ xfs_da_state_free(state); - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_node(args); if (!error) { error = xfs_bmap_finish(&args->trans, @@ -1033,7 +1032,7 @@ restart: * in the index/blkno/rmtblkno/rmtblkcnt fields and * in the index2/blkno2/rmtblkno2/rmtblkcnt2 fields. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_da_split(state); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -1145,7 +1144,7 @@ restart: * Check to see if the tree needs to be collapsed. */ if (retval && (state->path.active > 1)) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_da_join(state); if (!error) { error = xfs_bmap_finish(&args->trans, @@ -1281,7 +1280,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) * Check to see if the tree needs to be collapsed. */ if (retval && (state->path.active > 1)) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_da_join(state); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -1332,7 +1331,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) == XFS_ATTR_LEAF_MAGIC); if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { @@ -1522,7 +1521,6 @@ xfs_attr_node_get(xfs_da_args_t *args) return(retval); } - /*======================================================================== * External routines for manipulating out-of-line attribute values. *========================================================================*/ @@ -1537,7 +1535,7 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) xfs_bmbt_irec_t map[ATTR_RMTVALUE_MAPSIZE]; xfs_mount_t *mp; xfs_daddr_t dblkno; - xfs_caddr_t dst; + void *dst; xfs_buf_t *bp; int nmap, error, tmp, valuelen, blkcnt, i; xfs_dablk_t lblkno; @@ -1553,7 +1551,7 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) error = xfs_bmapi(args->trans, args->dp, (xfs_fileoff_t)lblkno, args->rmtblkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - NULL, 0, map, &nmap, NULL, NULL); + NULL, 0, map, &nmap, NULL); if (error) return(error); ASSERT(nmap >= 1); @@ -1564,13 +1562,14 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) dblkno = XFS_FSB_TO_DADDR(mp, map[i].br_startblock); blkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount); error = xfs_read_buf(mp, mp->m_ddev_targp, dblkno, - blkcnt, XFS_BUF_LOCK, &bp); + blkcnt, XBF_LOCK | XBF_DONT_BLOCK, + &bp); if (error) return(error); tmp = (valuelen < XFS_BUF_SIZE(bp)) ? valuelen : XFS_BUF_SIZE(bp); - xfs_biomove(bp, 0, tmp, dst, XFS_B_READ); + xfs_buf_iomove(bp, 0, tmp, dst, XBRW_READ); xfs_buf_relse(bp); dst += tmp; valuelen -= tmp; @@ -1594,7 +1593,7 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) xfs_inode_t *dp; xfs_bmbt_irec_t map; xfs_daddr_t dblkno; - xfs_caddr_t src; + void *src; xfs_buf_t *bp; xfs_dablk_t lblkno; int blkcnt, valuelen, nmap, error, tmp, committed; @@ -1624,14 +1623,14 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) /* * Allocate a single extent, up to the size of the value. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); nmap = 1; error = xfs_bmapi(args->trans, dp, (xfs_fileoff_t)lblkno, blkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA | XFS_BMAPI_WRITE, args->firstblock, args->total, &map, &nmap, - args->flist, NULL); + args->flist); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, &committed); @@ -1678,13 +1677,13 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) /* * Try to remember where we decided to put the value. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); nmap = 1; error = xfs_bmapi(NULL, dp, (xfs_fileoff_t)lblkno, args->rmtblkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, args->firstblock, 0, &map, &nmap, - NULL, NULL); + NULL); if (error) { return(error); } @@ -1695,16 +1694,16 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock), blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); - bp = xfs_buf_get_flags(mp->m_ddev_targp, dblkno, - blkcnt, XFS_BUF_LOCK); + bp = xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, + XBF_LOCK | XBF_DONT_BLOCK); ASSERT(bp); ASSERT(!XFS_BUF_GETERROR(bp)); tmp = (valuelen < XFS_BUF_SIZE(bp)) ? valuelen : XFS_BUF_SIZE(bp); - xfs_biomove(bp, 0, tmp, src, XFS_B_WRITE); + xfs_buf_iomove(bp, 0, tmp, src, XBRW_WRITE); if (tmp < XFS_BUF_SIZE(bp)) - xfs_biozero(bp, tmp, XFS_BUF_SIZE(bp) - tmp); + xfs_buf_zero(bp, tmp, XFS_BUF_SIZE(bp) - tmp); if ((error = xfs_bwrite(mp, bp))) {/* GROT: NOTE: synchronous write */ return (error); } @@ -1743,13 +1742,13 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) /* * Try to remember where we decided to put the value. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); nmap = 1; error = xfs_bmapi(NULL, args->dp, (xfs_fileoff_t)lblkno, args->rmtblkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, args->firstblock, 0, &map, &nmap, - args->flist, NULL); + args->flist); if (error) { return(error); } @@ -1763,8 +1762,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) /* * If the "remote" value is in the cache, remove it. */ - bp = xfs_incore(mp->m_ddev_targp, dblkno, blkcnt, - XFS_INCORE_TRYLOCK); + bp = xfs_incore(mp->m_ddev_targp, dblkno, blkcnt, XBF_TRYLOCK); if (bp) { XFS_BUF_STALE(bp); XFS_BUF_UNDELAYWRITE(bp); @@ -1784,11 +1782,11 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) blkcnt = args->rmtblkcnt; done = 0; while (!done) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_bunmapi(args->trans, args->dp, lblkno, blkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, 1, args->firstblock, args->flist, - NULL, &done); + &done); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, &committed); diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index f8f926f..d1f7a20 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -45,6 +45,7 @@ STATIC int xfs_attr_leaf_figure_balance(xfs_da_state_t *state, int *number_entries_in_blk1, int *number_usedbytes_in_blk1); + /* * Utility routines. */ @@ -63,7 +64,7 @@ STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index); * If namespace bits don't match return 0. * If all match then return 1. */ -STATIC_INLINE int +STATIC int xfs_attr_namesp_match(int arg_flags, int ondisk_flags) { return XFS_ATTR_NSP_ONDISK(ondisk_flags) == XFS_ATTR_NSP_ARGS_TO_ONDISK(arg_flags); @@ -120,7 +121,8 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) * minimum offset only needs to be the space required for * the btree root. */ - if (!dp->i_d.di_forkoff && dp->i_df.if_bytes > mp->m_attroffset) + if (!dp->i_d.di_forkoff && dp->i_df.if_bytes > + xfs_default_attroffset(dp)) dsize = XFS_BMDR_SPACE_CALC(MINDBTPTRS); break; @@ -263,6 +265,26 @@ xfs_attr_shortform_add(xfs_da_args_t *args, int forkoff) } /* + * After the last attribute is removed revert to original inode format, + * making all literal area available to the data fork once more. + */ +STATIC void +xfs_attr_fork_reset( + struct xfs_inode *ip, + struct xfs_trans *tp) +{ + xfs_idestroy_fork(ip, XFS_ATTR_FORK); + ip->i_d.di_forkoff = 0; + ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; + + ASSERT(ip->i_d.di_anextents == 0); + ASSERT(ip->i_afp == NULL); + + ip->i_df.if_ext_max = XFS_IFORK_DSIZE(ip) / sizeof(xfs_bmbt_rec_t); + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); +} + +/* * Remove an attribute from the shortform attribute list structure. */ int @@ -309,22 +331,10 @@ xfs_attr_shortform_remove(xfs_da_args_t *args) */ totsize -= size; if (totsize == sizeof(xfs_attr_sf_hdr_t) && - !(args->op_flags & XFS_DA_OP_ADDNAME) && - (mp->m_flags & XFS_MOUNT_ATTR2) && - (dp->i_d.di_format != XFS_DINODE_FMT_BTREE)) { - /* - * Last attribute now removed, revert to original - * inode format making all literal area available - * to the data fork once more. - */ - xfs_idestroy_fork(dp, XFS_ATTR_FORK); - dp->i_d.di_forkoff = 0; - dp->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; - ASSERT(dp->i_d.di_anextents == 0); - ASSERT(dp->i_afp == NULL); - dp->i_df.if_ext_max = - XFS_IFORK_DSIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); - xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE); + (mp->m_flags & XFS_MOUNT_ATTR2) && + (dp->i_d.di_format != XFS_DINODE_FMT_BTREE) && + !(args->op_flags & XFS_DA_OP_ADDNAME)) { + xfs_attr_fork_reset(dp, args->trans); } else { xfs_idata_realloc(dp, -size, XFS_ATTR_FORK); dp->i_d.di_forkoff = xfs_attr_shortform_bytesfit(dp, totsize); @@ -476,11 +486,11 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) sfe = &sf->list[0]; for (i = 0; i < sf->hdr.count; i++) { - nargs.name = (char *)sfe->nameval; + nargs.name = sfe->nameval; nargs.namelen = sfe->namelen; - nargs.value = (char *)&sfe->nameval[nargs.namelen]; + nargs.value = &sfe->nameval[nargs.namelen]; nargs.valuelen = sfe->valuelen; - nargs.hashval = xfs_da_hashname((char *)sfe->nameval, + nargs.hashval = xfs_da_hashname(sfe->nameval, sfe->namelen); nargs.flags = XFS_ATTR_NSP_ONDISK_TO_ARGS(sfe->flags); error = xfs_attr_leaf_lookup_int(bp, &nargs); /* set a->index */ @@ -522,7 +532,7 @@ xfs_attr_shortform_allfit(xfs_dabuf_t *bp, xfs_inode_t *dp) continue; /* don't copy partial entries */ if (!(entry->flags & XFS_ATTR_LOCAL)) return(0); - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, i); + name_loc = xfs_attr_leaf_name_local(leaf, i); if (name_loc->namelen >= XFS_ATTR_SF_ENTSIZE_MAX) return(0); if (be16_to_cpu(name_loc->valuelen) >= XFS_ATTR_SF_ENTSIZE_MAX) @@ -572,20 +582,7 @@ xfs_attr_leaf_to_shortform(xfs_dabuf_t *bp, xfs_da_args_t *args, int forkoff) if (forkoff == -1) { ASSERT(dp->i_mount->m_flags & XFS_MOUNT_ATTR2); ASSERT(dp->i_d.di_format != XFS_DINODE_FMT_BTREE); - - /* - * Last attribute was removed, revert to original - * inode format making all literal area available - * to the data fork once more. - */ - xfs_idestroy_fork(dp, XFS_ATTR_FORK); - dp->i_d.di_forkoff = 0; - dp->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; - ASSERT(dp->i_d.di_anextents == 0); - ASSERT(dp->i_afp == NULL); - dp->i_df.if_ext_max = - XFS_IFORK_DSIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); - xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE); + xfs_attr_fork_reset(dp, args->trans); goto out; } @@ -609,10 +606,10 @@ xfs_attr_leaf_to_shortform(xfs_dabuf_t *bp, xfs_da_args_t *args, int forkoff) if (!entry->nameidx) continue; ASSERT(entry->flags & XFS_ATTR_LOCAL); - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, i); - nargs.name = (char *)name_loc->nameval; + name_loc = xfs_attr_leaf_name_local(leaf, i); + nargs.name = name_loc->nameval; nargs.namelen = name_loc->namelen; - nargs.value = (char *)&name_loc->nameval[nargs.namelen]; + nargs.value = &name_loc->nameval[nargs.namelen]; nargs.valuelen = be16_to_cpu(name_loc->valuelen); nargs.hashval = be32_to_cpu(entry->hashval); nargs.flags = XFS_ATTR_NSP_ONDISK_TO_ARGS(entry->flags); @@ -927,14 +924,14 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int mapindex) * as part of this transaction (a split operation for example). */ if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, args->index); + name_loc = xfs_attr_leaf_name_local(leaf, args->index); name_loc->namelen = args->namelen; name_loc->valuelen = cpu_to_be16(args->valuelen); memcpy((char *)name_loc->nameval, args->name, args->namelen); memcpy((char *)&name_loc->nameval[args->namelen], args->value, be16_to_cpu(name_loc->valuelen)); } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); name_rmt->namelen = args->namelen; memcpy((char *)name_rmt->name, args->name, args->namelen); entry->flags |= XFS_ATTR_INCOMPLETE; @@ -945,7 +942,7 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int mapindex) args->rmtblkcnt = XFS_B_TO_FSB(mp, args->valuelen); } xfs_da_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, XFS_ATTR_LEAF_NAME(leaf, args->index), + XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), xfs_attr_leaf_entsize(leaf, args->index))); /* @@ -1535,10 +1532,10 @@ xfs_attr_leaf_remove(xfs_dabuf_t *bp, xfs_da_args_t *args) /* * Compress the remaining entries and zero out the removed stuff. */ - memset(XFS_ATTR_LEAF_NAME(leaf, args->index), 0, entsize); + memset(xfs_attr_leaf_name(leaf, args->index), 0, entsize); be16_add_cpu(&hdr->usedbytes, -entsize); xfs_da_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, XFS_ATTR_LEAF_NAME(leaf, args->index), + XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), entsize)); tmp = (be16_to_cpu(hdr->count) - args->index) @@ -1771,7 +1768,7 @@ xfs_attr_leaf_lookup_int(xfs_dabuf_t *bp, xfs_da_args_t *args) continue; } if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, probe); + name_loc = xfs_attr_leaf_name_local(leaf, probe); if (name_loc->namelen != args->namelen) continue; if (memcmp(args->name, (char *)name_loc->nameval, args->namelen) != 0) @@ -1781,7 +1778,7 @@ xfs_attr_leaf_lookup_int(xfs_dabuf_t *bp, xfs_da_args_t *args) args->index = probe; return(XFS_ERROR(EEXIST)); } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, probe); + name_rmt = xfs_attr_leaf_name_remote(leaf, probe); if (name_rmt->namelen != args->namelen) continue; if (memcmp(args->name, (char *)name_rmt->name, @@ -1821,7 +1818,7 @@ xfs_attr_leaf_getvalue(xfs_dabuf_t *bp, xfs_da_args_t *args) entry = &leaf->entries[args->index]; if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, args->index); + name_loc = xfs_attr_leaf_name_local(leaf, args->index); ASSERT(name_loc->namelen == args->namelen); ASSERT(memcmp(args->name, name_loc->nameval, args->namelen) == 0); valuelen = be16_to_cpu(name_loc->valuelen); @@ -1836,7 +1833,7 @@ xfs_attr_leaf_getvalue(xfs_dabuf_t *bp, xfs_da_args_t *args) args->valuelen = valuelen; memcpy(args->value, &name_loc->nameval[args->namelen], valuelen); } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); ASSERT(name_rmt->namelen == args->namelen); ASSERT(memcmp(args->name, name_rmt->name, args->namelen) == 0); valuelen = be32_to_cpu(name_rmt->valuelen); @@ -1929,7 +1926,7 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, * off for 6.2, should be revisited later. */ if (entry_s->flags & XFS_ATTR_INCOMPLETE) { /* skip partials? */ - memset(XFS_ATTR_LEAF_NAME(leaf_s, start_s + i), 0, tmp); + memset(xfs_attr_leaf_name(leaf_s, start_s + i), 0, tmp); be16_add_cpu(&hdr_s->usedbytes, -tmp); be16_add_cpu(&hdr_s->count, -1); entry_d--; /* to compensate for ++ in loop hdr */ @@ -1946,11 +1943,11 @@ xfs_attr_leaf_moveents(xfs_attr_leafblock_t *leaf_s, int start_s, entry_d->flags = entry_s->flags; ASSERT(be16_to_cpu(entry_d->nameidx) + tmp <= XFS_LBSIZE(mp)); - memmove(XFS_ATTR_LEAF_NAME(leaf_d, desti), - XFS_ATTR_LEAF_NAME(leaf_s, start_s + i), tmp); + memmove(xfs_attr_leaf_name(leaf_d, desti), + xfs_attr_leaf_name(leaf_s, start_s + i), tmp); ASSERT(be16_to_cpu(entry_s->nameidx) + tmp <= XFS_LBSIZE(mp)); - memset(XFS_ATTR_LEAF_NAME(leaf_s, start_s + i), 0, tmp); + memset(xfs_attr_leaf_name(leaf_s, start_s + i), 0, tmp); be16_add_cpu(&hdr_s->usedbytes, -tmp); be16_add_cpu(&hdr_d->usedbytes, tmp); be16_add_cpu(&hdr_s->count, -1); @@ -2062,12 +2059,12 @@ xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index) ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); if (leaf->entries[index].flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, index); - size = XFS_ATTR_LEAF_ENTSIZE_LOCAL(name_loc->namelen, + name_loc = xfs_attr_leaf_name_local(leaf, index); + size = xfs_attr_leaf_entsize_local(name_loc->namelen, be16_to_cpu(name_loc->valuelen)); } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, index); - size = XFS_ATTR_LEAF_ENTSIZE_REMOTE(name_rmt->namelen); + name_rmt = xfs_attr_leaf_name_remote(leaf, index); + size = xfs_attr_leaf_entsize_remote(name_rmt->namelen); } return(size); } @@ -2083,13 +2080,13 @@ xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int *local) { int size; - size = XFS_ATTR_LEAF_ENTSIZE_LOCAL(namelen, valuelen); - if (size < XFS_ATTR_LEAF_ENTSIZE_LOCAL_MAX(blocksize)) { + size = xfs_attr_leaf_entsize_local(namelen, valuelen); + if (size < xfs_attr_leaf_entsize_local_max(blocksize)) { if (local) { *local = 1; } } else { - size = XFS_ATTR_LEAF_ENTSIZE_REMOTE(namelen); + size = xfs_attr_leaf_entsize_remote(namelen); if (local) { *local = 0; } @@ -2137,11 +2134,11 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) #ifdef DEBUG if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, args->index); + name_loc = xfs_attr_leaf_name_local(leaf, args->index); namelen = name_loc->namelen; name = (char *)name_loc->nameval; } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); namelen = name_rmt->namelen; name = (char *)name_rmt->name; } @@ -2156,7 +2153,7 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args) if (args->rmtblkno) { ASSERT((entry->flags & XFS_ATTR_LOCAL) == 0); - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); name_rmt->valueblk = cpu_to_be32(args->rmtblkno); name_rmt->valuelen = cpu_to_be32(args->valuelen); xfs_da_log_buf(args->trans, bp, @@ -2203,7 +2200,7 @@ xfs_attr_leaf_setflag(xfs_da_args_t *args) xfs_da_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); if ((entry->flags & XFS_ATTR_LOCAL) == 0) { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); name_rmt->valueblk = 0; name_rmt->valuelen = 0; xfs_da_log_buf(args->trans, bp, @@ -2276,20 +2273,20 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) #ifdef DEBUG if (entry1->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf1, args->index); + name_loc = xfs_attr_leaf_name_local(leaf1, args->index); namelen1 = name_loc->namelen; name1 = (char *)name_loc->nameval; } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf1, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf1, args->index); namelen1 = name_rmt->namelen; name1 = (char *)name_rmt->name; } if (entry2->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf2, args->index2); + name_loc = xfs_attr_leaf_name_local(leaf2, args->index2); namelen2 = name_loc->namelen; name2 = (char *)name_loc->nameval; } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf2, args->index2); + name_rmt = xfs_attr_leaf_name_remote(leaf2, args->index2); namelen2 = name_rmt->namelen; name2 = (char *)name_rmt->name; } @@ -2306,7 +2303,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) XFS_DA_LOGRANGE(leaf1, entry1, sizeof(*entry1))); if (args->rmtblkno) { ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0); - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf1, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf1, args->index); name_rmt->valueblk = cpu_to_be32(args->rmtblkno); name_rmt->valuelen = cpu_to_be32(args->valuelen); xfs_da_log_buf(args->trans, bp1, @@ -2317,7 +2314,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args) xfs_da_log_buf(args->trans, bp2, XFS_DA_LOGRANGE(leaf2, entry2, sizeof(*entry2))); if ((entry2->flags & XFS_ATTR_LOCAL) == 0) { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf2, args->index2); + name_rmt = xfs_attr_leaf_name_remote(leaf2, args->index2); name_rmt->valueblk = 0; name_rmt->valuelen = 0; xfs_da_log_buf(args->trans, bp2, diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index cf1123a..5a626b0 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -65,7 +65,6 @@ xfs_bmap_add_extent( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd); /* OK to allocate reserved blocks */ @@ -83,7 +82,6 @@ xfs_bmap_add_extent_delay_real( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd); /* OK to allocate reserved blocks */ /* @@ -96,7 +94,6 @@ xfs_bmap_add_extent_hole_delay( xfs_extnum_t idx, /* extent number to update/insert */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp,/* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd); /* OK to allocate reserved blocks */ /* @@ -110,7 +107,6 @@ xfs_bmap_add_extent_hole_real( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork); /* data or attr fork */ /* @@ -123,8 +119,7 @@ xfs_bmap_add_extent_unwritten_real( xfs_extnum_t idx, /* extent number to update/insert */ xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta); /* Change made to incore extents */ + int *logflagsp); /* inode logging flags */ /* * xfs_bmap_alloc is called by xfs_bmapi to allocate an extent for a file. @@ -161,23 +156,10 @@ xfs_bmap_del_extent( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp,/* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd); /* OK to allocate reserved blocks */ /* - * Remove the entry "free" from the free item list. Prev points to the - * previous entry, unless "free" is the head of the list. - * - * Note: this requires user-space public scope for libxfs_iread - */ -void -xfs_bmap_del_free( - xfs_bmap_free_t *flist, /* free item list header */ - xfs_bmap_free_item_t *prev, /* previous item on list, if any */ - xfs_bmap_free_item_t *free); /* list item to be freed */ - -/* * Convert an extents-format file into a btree-format file. * The new file will have a root block (in the inode) and a single child block. */ @@ -219,71 +201,6 @@ xfs_bmap_isaeof( int whichfork, /* data or attribute fork */ char *aeof); /* return value */ -#ifdef XFS_BMAP_TRACE -/* - * Add bmap trace entry prior to a call to xfs_iext_remove. - */ -STATIC void -xfs_bmap_trace_delete( - const char *fname, /* function name */ - char *desc, /* operation description */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* index of entry(entries) deleted */ - xfs_extnum_t cnt, /* count of entries deleted, 1 or 2 */ - int whichfork); /* data or attr fork */ - -/* - * Add bmap trace entry prior to a call to xfs_iext_insert, or - * reading in the extents list from the disk (in the btree). - */ -STATIC void -xfs_bmap_trace_insert( - const char *fname, /* function name */ - char *desc, /* operation description */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* index of entry(entries) inserted */ - xfs_extnum_t cnt, /* count of entries inserted, 1 or 2 */ - xfs_bmbt_irec_t *r1, /* inserted record 1 */ - xfs_bmbt_irec_t *r2, /* inserted record 2 or null */ - int whichfork); /* data or attr fork */ - -/* - * Add bmap trace entry after updating an extent record in place. - */ -STATIC void -xfs_bmap_trace_post_update( - const char *fname, /* function name */ - char *desc, /* operation description */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* index of entry updated */ - int whichfork); /* data or attr fork */ - -/* - * Add bmap trace entry prior to updating an extent record in place. - */ -STATIC void -xfs_bmap_trace_pre_update( - const char *fname, /* function name */ - char *desc, /* operation description */ - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* index of entry to be updated */ - int whichfork); /* data or attr fork */ - -#define XFS_BMAP_TRACE_DELETE(d,ip,i,c,w) \ - xfs_bmap_trace_delete(__func__,d,ip,i,c,w) -#define XFS_BMAP_TRACE_INSERT(d,ip,i,c,r1,r2,w) \ - xfs_bmap_trace_insert(__func__,d,ip,i,c,r1,r2,w) -#define XFS_BMAP_TRACE_POST_UPDATE(d,ip,i,w) \ - xfs_bmap_trace_post_update(__func__,d,ip,i,w) -#define XFS_BMAP_TRACE_PRE_UPDATE(d,ip,i,w) \ - xfs_bmap_trace_pre_update(__func__,d,ip,i,w) -#else -#define XFS_BMAP_TRACE_DELETE(d,ip,i,c,w) -#define XFS_BMAP_TRACE_INSERT(d,ip,i,c,r1,r2,w) -#define XFS_BMAP_TRACE_POST_UPDATE(d,ip,i,w) -#define XFS_BMAP_TRACE_PRE_UPDATE(d,ip,i,w) -#endif /* XFS_BMAP_TRACE */ - /* * Compute the worst-case number of indirect blocks that will be used * for ip's delayed extent of length "len". @@ -310,18 +227,28 @@ xfs_bmap_validate_ret( #define xfs_bmap_validate_ret(bno,len,flags,mval,onmap,nmap) #endif /* DEBUG */ -#if defined(XFS_RW_TRACE) +STATIC int +xfs_bmap_count_tree( + xfs_mount_t *mp, + xfs_trans_t *tp, + xfs_ifork_t *ifp, + xfs_fsblock_t blockno, + int levelin, + int *count); + STATIC void -xfs_bunmap_trace( - xfs_inode_t *ip, - xfs_fileoff_t bno, - xfs_filblks_t len, - int flags, - inst_t *ra); -#else -#define xfs_bunmap_trace(ip, bno, len, flags, ra) -#endif /* XFS_RW_TRACE */ +xfs_bmap_count_leaves( + xfs_ifork_t *ifp, + xfs_extnum_t idx, + int numrecs, + int *count); +STATIC void +xfs_bmap_disk_count_leaves( + struct xfs_mount *mp, + struct xfs_btree_block *block, + int numrecs, + int *count); /* * Bmap internal routines. @@ -490,7 +417,6 @@ xfs_bmap_add_extent( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd) /* OK to use reserved data blocks */ { @@ -515,35 +441,26 @@ xfs_bmap_add_extent( * already extents in the list. */ if (nextents == 0) { - XFS_BMAP_TRACE_INSERT("insert empty", ip, 0, 1, new, NULL, - whichfork); - xfs_iext_insert(ifp, 0, 1, new); + xfs_iext_insert(ip, 0, 1, new, + whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0); + ASSERT(cur == NULL); ifp->if_lastex = 0; - if (!ISNULLSTARTBLOCK(new->br_startblock)) { + if (!isnullstartblock(new->br_startblock)) { XFS_IFORK_NEXT_SET(ip, whichfork, 1); - logflags = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); + logflags = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); } else logflags = 0; - /* DELTA: single new extent */ - if (delta) { - if (delta->xed_startoff > new->br_startoff) - delta->xed_startoff = new->br_startoff; - if (delta->xed_blockcount < - new->br_startoff + new->br_blockcount) - delta->xed_blockcount = new->br_startoff + - new->br_blockcount; - } } /* * Any kind of new delayed allocation goes here. */ - else if (ISNULLSTARTBLOCK(new->br_startblock)) { + else if (isnullstartblock(new->br_startblock)) { if (cur) ASSERT((cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL) == 0); if ((error = xfs_bmap_add_extent_hole_delay(ip, idx, new, - &logflags, delta, rsvd))) + &logflags, rsvd))) goto done; } /* @@ -554,7 +471,7 @@ xfs_bmap_add_extent( ASSERT((cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL) == 0); if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, new, - &logflags, delta, whichfork))) + &logflags, whichfork))) goto done; } else { xfs_bmbt_irec_t prev; /* old extent at offset idx */ @@ -569,27 +486,27 @@ xfs_bmap_add_extent( * in a delayed or unwritten allocation with a real one, or * converting real back to unwritten. */ - if (!ISNULLSTARTBLOCK(new->br_startblock) && + if (!isnullstartblock(new->br_startblock) && new->br_startoff + new->br_blockcount > prev.br_startoff) { if (prev.br_state != XFS_EXT_UNWRITTEN && - ISNULLSTARTBLOCK(prev.br_startblock)) { - da_old = STARTBLOCKVAL(prev.br_startblock); + isnullstartblock(prev.br_startblock)) { + da_old = startblockval(prev.br_startblock); if (cur) ASSERT(cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL); if ((error = xfs_bmap_add_extent_delay_real(ip, idx, &cur, new, &da_new, first, flist, - &logflags, delta, rsvd))) + &logflags, rsvd))) goto done; } else if (new->br_state == XFS_EXT_NORM) { ASSERT(new->br_state == XFS_EXT_NORM); if ((error = xfs_bmap_add_extent_unwritten_real( - ip, idx, &cur, new, &logflags, delta))) + ip, idx, &cur, new, &logflags))) goto done; } else { ASSERT(new->br_state == XFS_EXT_UNWRITTEN); if ((error = xfs_bmap_add_extent_unwritten_real( - ip, idx, &cur, new, &logflags, delta))) + ip, idx, &cur, new, &logflags))) goto done; } ASSERT(*curp == cur || *curp == NULL); @@ -602,7 +519,7 @@ xfs_bmap_add_extent( ASSERT((cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL) == 0); if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, - new, &logflags, delta, whichfork))) + new, &logflags, whichfork))) goto done; } } @@ -634,7 +551,7 @@ xfs_bmap_add_extent( nblks += cur->bc_private.b.allocated; ASSERT(nblks <= da_old); if (nblks < da_old) - xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, + xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, (int64_t)(da_old - nblks), rsvd); } /* @@ -667,7 +584,6 @@ xfs_bmap_add_extent_delay_real( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd) /* OK to use reserved data block allocation */ { xfs_btree_cur_t *cur; /* btree cursor */ @@ -684,26 +600,10 @@ xfs_bmap_add_extent_delay_real( xfs_filblks_t temp=0; /* value for dnew calculations */ xfs_filblks_t temp2=0;/* value for dnew calculations */ int tmp_rval; /* partial logging flags */ - enum { /* bit number definitions for state */ - LEFT_CONTIG, RIGHT_CONTIG, - LEFT_FILLING, RIGHT_FILLING, - LEFT_DELAY, RIGHT_DELAY, - LEFT_VALID, RIGHT_VALID - }; #define LEFT r[0] #define RIGHT r[1] #define PREV r[2] -#define MASK(b) (1 << (b)) -#define MASK2(a,b) (MASK(a) | MASK(b)) -#define MASK3(a,b,c) (MASK2(a,b) | MASK(c)) -#define MASK4(a,b,c,d) (MASK3(a,b,c) | MASK(d)) -#define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b))) -#define STATE_TEST(b) (state & MASK(b)) -#define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \ - ((state &= ~MASK(b)), 0)) -#define SWITCH_STATE \ - (state & MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG)) /* * Set up a bunch of variables to make the tests simpler. @@ -715,69 +615,80 @@ xfs_bmap_add_extent_delay_real( new_endoff = new->br_startoff + new->br_blockcount; ASSERT(PREV.br_startoff <= new->br_startoff); ASSERT(PREV.br_startoff + PREV.br_blockcount >= new_endoff); + /* * Set flags determining what part of the previous delayed allocation * extent is being replaced by a real allocation. */ - STATE_SET(LEFT_FILLING, PREV.br_startoff == new->br_startoff); - STATE_SET(RIGHT_FILLING, - PREV.br_startoff + PREV.br_blockcount == new_endoff); + if (PREV.br_startoff == new->br_startoff) + state |= BMAP_LEFT_FILLING; + if (PREV.br_startoff + PREV.br_blockcount == new_endoff) + state |= BMAP_RIGHT_FILLING; + /* * Check and set flags if this segment has a left neighbor. * Don't set contiguous if the combined extent would be too large. */ - if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { + if (idx > 0) { + state |= BMAP_LEFT_VALID; xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); - STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(LEFT.br_startblock)); + + if (isnullstartblock(LEFT.br_startblock)) + state |= BMAP_LEFT_DELAY; } - STATE_SET(LEFT_CONTIG, - STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) && - LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && - LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && - LEFT.br_state == new->br_state && - LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN); + + if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && + LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && + LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && + LEFT.br_state == new->br_state && + LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN) + state |= BMAP_LEFT_CONTIG; + /* * Check and set flags if this segment has a right neighbor. * Don't set contiguous if the combined extent would be too large. * Also check for all-three-contiguous being too large. */ - if (STATE_SET_TEST(RIGHT_VALID, - idx < - ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)) { + if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { + state |= BMAP_RIGHT_VALID; xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); - STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(RIGHT.br_startblock)); + + if (isnullstartblock(RIGHT.br_startblock)) + state |= BMAP_RIGHT_DELAY; } - STATE_SET(RIGHT_CONTIG, - STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) && - new_endoff == RIGHT.br_startoff && - new->br_startblock + new->br_blockcount == - RIGHT.br_startblock && - new->br_state == RIGHT.br_state && - new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN && - ((state & MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING)) != - MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING) || - LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount - <= MAXEXTLEN)); + + if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && + new_endoff == RIGHT.br_startoff && + new->br_startblock + new->br_blockcount == RIGHT.br_startblock && + new->br_state == RIGHT.br_state && + new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN && + ((state & (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | + BMAP_RIGHT_FILLING)) != + (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | + BMAP_RIGHT_FILLING) || + LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount + <= MAXEXTLEN)) + state |= BMAP_RIGHT_CONTIG; + error = 0; /* * Switch out based on the FILLING and CONTIG state bits. */ - switch (SWITCH_STATE) { - - case MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): + switch (state & (BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | + BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG)) { + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | + BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* * Filling in all of a previously delayed allocation extent. * The left and right neighbors are both contiguous with new. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|LC|RC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), LEFT.br_blockcount + PREV.br_blockcount + RIGHT.br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF|LC|RC", ip, idx - 1, - XFS_DATA_FORK); - XFS_BMAP_TRACE_DELETE("LF|RF|LC|RC", ip, idx, 2, XFS_DATA_FORK); - xfs_iext_remove(ifp, idx, 2); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + + xfs_iext_remove(ip, idx, 2, state); ip->i_df.if_lastex = idx - 1; ip->i_d.di_nextents--; if (cur == NULL) @@ -803,27 +714,20 @@ xfs_bmap_add_extent_delay_real( goto done; } *dnew = 0; - /* DELTA: Three in-core extents are replaced by one. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount + - RIGHT.br_blockcount; break; - case MASK3(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: /* * Filling in all of a previously delayed allocation extent. * The left neighbor is contiguous, the right is not. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|LC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), LEFT.br_blockcount + PREV.br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF|LC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + ip->i_df.if_lastex = idx - 1; - XFS_BMAP_TRACE_DELETE("LF|RF|LC", ip, idx, 1, XFS_DATA_FORK); - xfs_iext_remove(ifp, idx, 1); + xfs_iext_remove(ip, idx, 1, state); if (cur == NULL) rval = XFS_ILOG_DEXT; else { @@ -840,25 +744,21 @@ xfs_bmap_add_extent_delay_real( goto done; } *dnew = 0; - /* DELTA: Two in-core extents are replaced by one. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount; break; - case MASK3(LEFT_FILLING, RIGHT_FILLING, RIGHT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* * Filling in all of a previously delayed allocation extent. * The right neighbor is contiguous, the left is not. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|RC", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_startblock(ep, new->br_startblock); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount + RIGHT.br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF|RC", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + ip->i_df.if_lastex = idx; - XFS_BMAP_TRACE_DELETE("LF|RF|RC", ip, idx + 1, 1, XFS_DATA_FORK); - xfs_iext_remove(ifp, idx + 1, 1); + xfs_iext_remove(ip, idx + 1, 1, state); if (cur == NULL) rval = XFS_ILOG_DEXT; else { @@ -875,21 +775,18 @@ xfs_bmap_add_extent_delay_real( goto done; } *dnew = 0; - /* DELTA: Two in-core extents are replaced by one. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount + - RIGHT.br_blockcount; break; - case MASK2(LEFT_FILLING, RIGHT_FILLING): + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: /* * Filling in all of a previously delayed allocation extent. * Neither the left nor right neighbors are contiguous with * the new one. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_startblock(ep, new->br_startblock); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + ip->i_df.if_lastex = idx; ip->i_d.di_nextents++; if (cur == NULL) @@ -907,24 +804,22 @@ xfs_bmap_add_extent_delay_real( XFS_WANT_CORRUPTED_GOTO(i == 1, done); } *dnew = 0; - /* DELTA: The in-core extent described by new changed type. */ - temp = new->br_startoff; - temp2 = new->br_blockcount; break; - case MASK2(LEFT_FILLING, LEFT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: /* * Filling in the first part of a previous delayed allocation. * The left neighbor is contiguous. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|LC", ip, idx - 1, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), LEFT.br_blockcount + new->br_blockcount); xfs_bmbt_set_startoff(ep, PREV.br_startoff + new->br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|LC", ip, idx - 1, XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + temp = PREV.br_blockcount - new->br_blockcount; - XFS_BMAP_TRACE_PRE_UPDATE("LF|LC", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); ip->i_df.if_lastex = idx - 1; if (cur == NULL) @@ -944,28 +839,22 @@ xfs_bmap_add_extent_delay_real( goto done; } temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), - STARTBLOCKVAL(PREV.br_startblock)); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); - XFS_BMAP_TRACE_POST_UPDATE("LF|LC", ip, idx, XFS_DATA_FORK); + startblockval(PREV.br_startblock)); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); *dnew = temp; - /* DELTA: The boundary between two in-core extents moved. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount; break; - case MASK(LEFT_FILLING): + case BMAP_LEFT_FILLING: /* * Filling in the first part of a previous delayed allocation. * The left neighbor is not contiguous. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_startoff(ep, new_endoff); temp = PREV.br_blockcount - new->br_blockcount; xfs_bmbt_set_blockcount(ep, temp); - XFS_BMAP_TRACE_INSERT("LF", ip, idx, 1, new, NULL, - XFS_DATA_FORK); - xfs_iext_insert(ifp, idx, 1, new); + xfs_iext_insert(ip, idx, 1, new, state); ip->i_df.if_lastex = idx; ip->i_d.di_nextents++; if (cur == NULL) @@ -992,31 +881,28 @@ xfs_bmap_add_extent_delay_real( goto done; } temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), - STARTBLOCKVAL(PREV.br_startblock) - + startblockval(PREV.br_startblock) - (cur ? cur->bc_private.b.allocated : 0)); ep = xfs_iext_get_ext(ifp, idx + 1); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); - XFS_BMAP_TRACE_POST_UPDATE("LF", ip, idx + 1, XFS_DATA_FORK); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); *dnew = temp; - /* DELTA: One in-core extent is split in two. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; - case MASK2(RIGHT_FILLING, RIGHT_CONTIG): + case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* * Filling in the last part of a previous delayed allocation. * The right neighbor is contiguous with the new allocation. */ temp = PREV.br_blockcount - new->br_blockcount; - XFS_BMAP_TRACE_PRE_UPDATE("RF|RC", ip, idx, XFS_DATA_FORK); - XFS_BMAP_TRACE_PRE_UPDATE("RF|RC", ip, idx + 1, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, idx + 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, idx + 1), new->br_startoff, new->br_startblock, new->br_blockcount + RIGHT.br_blockcount, RIGHT.br_state); - XFS_BMAP_TRACE_POST_UPDATE("RF|RC", ip, idx + 1, XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); ip->i_df.if_lastex = idx + 1; if (cur == NULL) rval = XFS_ILOG_DEXT; @@ -1035,27 +921,21 @@ xfs_bmap_add_extent_delay_real( goto done; } temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), - STARTBLOCKVAL(PREV.br_startblock)); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); - XFS_BMAP_TRACE_POST_UPDATE("RF|RC", ip, idx, XFS_DATA_FORK); + startblockval(PREV.br_startblock)); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); *dnew = temp; - /* DELTA: The boundary between two in-core extents moved. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount + - RIGHT.br_blockcount; break; - case MASK(RIGHT_FILLING): + case BMAP_RIGHT_FILLING: /* * Filling in the last part of a previous delayed allocation. * The right neighbor is not contiguous. */ temp = PREV.br_blockcount - new->br_blockcount; - XFS_BMAP_TRACE_PRE_UPDATE("RF", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); - XFS_BMAP_TRACE_INSERT("RF", ip, idx + 1, 1, new, NULL, - XFS_DATA_FORK); - xfs_iext_insert(ifp, idx + 1, 1, new); + xfs_iext_insert(ip, idx + 1, 1, new, state); ip->i_df.if_lastex = idx + 1; ip->i_d.di_nextents++; if (cur == NULL) @@ -1082,15 +962,12 @@ xfs_bmap_add_extent_delay_real( goto done; } temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), - STARTBLOCKVAL(PREV.br_startblock) - + startblockval(PREV.br_startblock) - (cur ? cur->bc_private.b.allocated : 0)); ep = xfs_iext_get_ext(ifp, idx); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); - XFS_BMAP_TRACE_POST_UPDATE("RF", ip, idx, XFS_DATA_FORK); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); *dnew = temp; - /* DELTA: One in-core extent is split in two. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; case 0: @@ -1100,7 +977,7 @@ xfs_bmap_add_extent_delay_real( * This case is avoided almost all the time. */ temp = new->br_startoff - PREV.br_startoff; - XFS_BMAP_TRACE_PRE_UPDATE("0", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); r[0] = *new; r[1].br_state = PREV.br_state; @@ -1108,9 +985,7 @@ xfs_bmap_add_extent_delay_real( r[1].br_startoff = new_endoff; temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; r[1].br_blockcount = temp2; - XFS_BMAP_TRACE_INSERT("0", ip, idx + 1, 2, &r[0], &r[1], - XFS_DATA_FORK); - xfs_iext_insert(ifp, idx + 1, 2, &r[0]); + xfs_iext_insert(ip, idx + 1, 2, &r[0], state); ip->i_df.if_lastex = idx + 1; ip->i_d.di_nextents++; if (cur == NULL) @@ -1138,10 +1013,11 @@ xfs_bmap_add_extent_delay_real( } temp = xfs_bmap_worst_indlen(ip, temp); temp2 = xfs_bmap_worst_indlen(ip, temp2); - diff = (int)(temp + temp2 - STARTBLOCKVAL(PREV.br_startblock) - + diff = (int)(temp + temp2 - startblockval(PREV.br_startblock) - (cur ? cur->bc_private.b.allocated : 0)); if (diff > 0 && - xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, -((int64_t)diff), rsvd)) { + xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, + -((int64_t)diff), rsvd)) { /* * Ick gross gag me with a spoon. */ @@ -1151,67 +1027,51 @@ xfs_bmap_add_extent_delay_real( temp--; diff--; if (!diff || - !xfs_mod_incore_sb(ip->i_mount, - XFS_SBS_FDBLOCKS, -((int64_t)diff), rsvd)) + !xfs_icsb_modify_counters(ip->i_mount, + XFS_SBS_FDBLOCKS, + -((int64_t)diff), rsvd)) break; } if (temp2) { temp2--; diff--; if (!diff || - !xfs_mod_incore_sb(ip->i_mount, - XFS_SBS_FDBLOCKS, -((int64_t)diff), rsvd)) + !xfs_icsb_modify_counters(ip->i_mount, + XFS_SBS_FDBLOCKS, + -((int64_t)diff), rsvd)) break; } } } ep = xfs_iext_get_ext(ifp, idx); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); - XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx, XFS_DATA_FORK); - XFS_BMAP_TRACE_PRE_UPDATE("0", ip, idx + 2, XFS_DATA_FORK); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, idx + 2, state, _THIS_IP_); xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx + 2), - NULLSTARTBLOCK((int)temp2)); - XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx + 2, XFS_DATA_FORK); + nullstartblock((int)temp2)); + trace_xfs_bmap_post_update(ip, idx + 2, state, _THIS_IP_); *dnew = temp + temp2; - /* DELTA: One in-core extent is split in three. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; - case MASK3(LEFT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): - case MASK3(RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): - case MASK2(LEFT_FILLING, RIGHT_CONTIG): - case MASK2(RIGHT_FILLING, LEFT_CONTIG): - case MASK2(LEFT_CONTIG, RIGHT_CONTIG): - case MASK(LEFT_CONTIG): - case MASK(RIGHT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_LEFT_FILLING | BMAP_RIGHT_CONTIG: + case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: + case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_LEFT_CONTIG: + case BMAP_RIGHT_CONTIG: /* * These cases are all impossible. */ ASSERT(0); } *curp = cur; - if (delta) { - temp2 += temp; - if (delta->xed_startoff > temp) - delta->xed_startoff = temp; - if (delta->xed_blockcount < temp2) - delta->xed_blockcount = temp2; - } done: *logflagsp = rval; return error; #undef LEFT #undef RIGHT #undef PREV -#undef MASK -#undef MASK2 -#undef MASK3 -#undef MASK4 -#undef STATE_SET -#undef STATE_TEST -#undef STATE_SET_TEST -#undef SWITCH_STATE } /* @@ -1224,8 +1084,7 @@ xfs_bmap_add_extent_unwritten_real( xfs_extnum_t idx, /* extent number to update/insert */ xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta) /* Change made to incore extents */ + int *logflagsp) /* inode logging flags */ { xfs_btree_cur_t *cur; /* btree cursor */ xfs_bmbt_rec_host_t *ep; /* extent entry for idx */ @@ -1239,29 +1098,10 @@ xfs_bmap_add_extent_unwritten_real( /* left is 0, right is 1, prev is 2 */ int rval=0; /* return value (logging flags) */ int state = 0;/* state bits, accessed thru macros */ - xfs_filblks_t temp=0; - xfs_filblks_t temp2=0; - enum { /* bit number definitions for state */ - LEFT_CONTIG, RIGHT_CONTIG, - LEFT_FILLING, RIGHT_FILLING, - LEFT_DELAY, RIGHT_DELAY, - LEFT_VALID, RIGHT_VALID - }; #define LEFT r[0] #define RIGHT r[1] #define PREV r[2] -#define MASK(b) (1 << (b)) -#define MASK2(a,b) (MASK(a) | MASK(b)) -#define MASK3(a,b,c) (MASK2(a,b) | MASK(c)) -#define MASK4(a,b,c,d) (MASK3(a,b,c) | MASK(d)) -#define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b))) -#define STATE_TEST(b) (state & MASK(b)) -#define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \ - ((state &= ~MASK(b)), 0)) -#define SWITCH_STATE \ - (state & MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG)) - /* * Set up a bunch of variables to make the tests simpler. */ @@ -1277,68 +1117,78 @@ xfs_bmap_add_extent_unwritten_real( new_endoff = new->br_startoff + new->br_blockcount; ASSERT(PREV.br_startoff <= new->br_startoff); ASSERT(PREV.br_startoff + PREV.br_blockcount >= new_endoff); + /* * Set flags determining what part of the previous oldext allocation * extent is being replaced by a newext allocation. */ - STATE_SET(LEFT_FILLING, PREV.br_startoff == new->br_startoff); - STATE_SET(RIGHT_FILLING, - PREV.br_startoff + PREV.br_blockcount == new_endoff); + if (PREV.br_startoff == new->br_startoff) + state |= BMAP_LEFT_FILLING; + if (PREV.br_startoff + PREV.br_blockcount == new_endoff) + state |= BMAP_RIGHT_FILLING; + /* * Check and set flags if this segment has a left neighbor. * Don't set contiguous if the combined extent would be too large. */ - if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { + if (idx > 0) { + state |= BMAP_LEFT_VALID; xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); - STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(LEFT.br_startblock)); + + if (isnullstartblock(LEFT.br_startblock)) + state |= BMAP_LEFT_DELAY; } - STATE_SET(LEFT_CONTIG, - STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) && - LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && - LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && - LEFT.br_state == newext && - LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN); + + if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && + LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && + LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && + LEFT.br_state == newext && + LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN) + state |= BMAP_LEFT_CONTIG; + /* * Check and set flags if this segment has a right neighbor. * Don't set contiguous if the combined extent would be too large. * Also check for all-three-contiguous being too large. */ - if (STATE_SET_TEST(RIGHT_VALID, - idx < - ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)) { + if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { + state |= BMAP_RIGHT_VALID; xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); - STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(RIGHT.br_startblock)); + if (isnullstartblock(RIGHT.br_startblock)) + state |= BMAP_RIGHT_DELAY; } - STATE_SET(RIGHT_CONTIG, - STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) && - new_endoff == RIGHT.br_startoff && - new->br_startblock + new->br_blockcount == - RIGHT.br_startblock && - newext == RIGHT.br_state && - new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN && - ((state & MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING)) != - MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING) || - LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount - <= MAXEXTLEN)); + + if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && + new_endoff == RIGHT.br_startoff && + new->br_startblock + new->br_blockcount == RIGHT.br_startblock && + newext == RIGHT.br_state && + new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN && + ((state & (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | + BMAP_RIGHT_FILLING)) != + (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | + BMAP_RIGHT_FILLING) || + LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount + <= MAXEXTLEN)) + state |= BMAP_RIGHT_CONTIG; + /* * Switch out based on the FILLING and CONTIG state bits. */ - switch (SWITCH_STATE) { - - case MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): + switch (state & (BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | + BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG)) { + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | + BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* * Setting all of a previous oldext extent to newext. * The left and right neighbors are both contiguous with new. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|LC|RC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), LEFT.br_blockcount + PREV.br_blockcount + RIGHT.br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF|LC|RC", ip, idx - 1, - XFS_DATA_FORK); - XFS_BMAP_TRACE_DELETE("LF|RF|LC|RC", ip, idx, 2, XFS_DATA_FORK); - xfs_iext_remove(ifp, idx, 2); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + + xfs_iext_remove(ip, idx, 2, state); ip->i_df.if_lastex = idx - 1; ip->i_d.di_nextents -= 2; if (cur == NULL) @@ -1368,27 +1218,20 @@ xfs_bmap_add_extent_unwritten_real( RIGHT.br_blockcount, LEFT.br_state))) goto done; } - /* DELTA: Three in-core extents are replaced by one. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount + - RIGHT.br_blockcount; break; - case MASK3(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: /* * Setting all of a previous oldext extent to newext. * The left neighbor is contiguous, the right is not. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|LC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), LEFT.br_blockcount + PREV.br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF|LC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + ip->i_df.if_lastex = idx - 1; - XFS_BMAP_TRACE_DELETE("LF|RF|LC", ip, idx, 1, XFS_DATA_FORK); - xfs_iext_remove(ifp, idx, 1); + xfs_iext_remove(ip, idx, 1, state); ip->i_d.di_nextents--; if (cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1411,27 +1254,20 @@ xfs_bmap_add_extent_unwritten_real( LEFT.br_state))) goto done; } - /* DELTA: Two in-core extents are replaced by one. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount; break; - case MASK3(LEFT_FILLING, RIGHT_FILLING, RIGHT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* * Setting all of a previous oldext extent to newext. * The right neighbor is contiguous, the left is not. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|RC", ip, idx, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount + RIGHT.br_blockcount); xfs_bmbt_set_state(ep, newext); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF|RC", ip, idx, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); ip->i_df.if_lastex = idx; - XFS_BMAP_TRACE_DELETE("LF|RF|RC", ip, idx + 1, 1, XFS_DATA_FORK); - xfs_iext_remove(ifp, idx + 1, 1); + xfs_iext_remove(ip, idx + 1, 1, state); ip->i_d.di_nextents--; if (cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; @@ -1454,23 +1290,18 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } - /* DELTA: Two in-core extents are replaced by one. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount + - RIGHT.br_blockcount; break; - case MASK2(LEFT_FILLING, RIGHT_FILLING): + case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: /* * Setting all of a previous oldext extent to newext. * Neither the left nor right neighbors are contiguous with * the new one. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|RF", ip, idx, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_state(ep, newext); - XFS_BMAP_TRACE_POST_UPDATE("LF|RF", ip, idx, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + ip->i_df.if_lastex = idx; if (cur == NULL) rval = XFS_ILOG_DEXT; @@ -1486,32 +1317,27 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } - /* DELTA: The in-core extent described by new changed type. */ - temp = new->br_startoff; - temp2 = new->br_blockcount; break; - case MASK2(LEFT_FILLING, LEFT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: /* * Setting the first part of a previous oldext extent to newext. * The left neighbor is contiguous. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF|LC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), LEFT.br_blockcount + new->br_blockcount); xfs_bmbt_set_startoff(ep, PREV.br_startoff + new->br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|LC", ip, idx - 1, - XFS_DATA_FORK); - XFS_BMAP_TRACE_PRE_UPDATE("LF|LC", ip, idx, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_startblock(ep, new->br_startblock + new->br_blockcount); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF|LC", ip, idx, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + ip->i_df.if_lastex = idx - 1; if (cur == NULL) rval = XFS_ILOG_DEXT; @@ -1536,28 +1362,23 @@ xfs_bmap_add_extent_unwritten_real( LEFT.br_state)) goto done; } - /* DELTA: The boundary between two in-core extents moved. */ - temp = LEFT.br_startoff; - temp2 = LEFT.br_blockcount + - PREV.br_blockcount; break; - case MASK(LEFT_FILLING): + case BMAP_LEFT_FILLING: /* * Setting the first part of a previous oldext extent to newext. * The left neighbor is not contiguous. */ - XFS_BMAP_TRACE_PRE_UPDATE("LF", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); ASSERT(ep && xfs_bmbt_get_state(ep) == oldext); xfs_bmbt_set_startoff(ep, new_endoff); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); xfs_bmbt_set_startblock(ep, new->br_startblock + new->br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LF", ip, idx, XFS_DATA_FORK); - XFS_BMAP_TRACE_INSERT("LF", ip, idx, 1, new, NULL, - XFS_DATA_FORK); - xfs_iext_insert(ifp, idx, 1, new); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + + xfs_iext_insert(ip, idx, 1, new, state); ip->i_df.if_lastex = idx; ip->i_d.di_nextents++; if (cur == NULL) @@ -1580,29 +1401,23 @@ xfs_bmap_add_extent_unwritten_real( goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - /* DELTA: One in-core extent is split in two. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; - case MASK2(RIGHT_FILLING, RIGHT_CONTIG): + case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: /* * Setting the last part of a previous oldext extent to newext. * The right neighbor is contiguous with the new allocation. */ - XFS_BMAP_TRACE_PRE_UPDATE("RF|RC", ip, idx, - XFS_DATA_FORK); - XFS_BMAP_TRACE_PRE_UPDATE("RF|RC", ip, idx + 1, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); + trace_xfs_bmap_pre_update(ip, idx + 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("RF|RC", ip, idx, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, idx + 1), new->br_startoff, new->br_startblock, new->br_blockcount + RIGHT.br_blockcount, newext); - XFS_BMAP_TRACE_POST_UPDATE("RF|RC", ip, idx + 1, - XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); + ip->i_df.if_lastex = idx + 1; if (cur == NULL) rval = XFS_ILOG_DEXT; @@ -1626,24 +1441,19 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } - /* DELTA: The boundary between two in-core extents moved. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount + - RIGHT.br_blockcount; break; - case MASK(RIGHT_FILLING): + case BMAP_RIGHT_FILLING: /* * Setting the last part of a previous oldext extent to newext. * The right neighbor is not contiguous. */ - XFS_BMAP_TRACE_PRE_UPDATE("RF", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, PREV.br_blockcount - new->br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("RF", ip, idx, XFS_DATA_FORK); - XFS_BMAP_TRACE_INSERT("RF", ip, idx + 1, 1, new, NULL, - XFS_DATA_FORK); - xfs_iext_insert(ifp, idx + 1, 1, new); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + + xfs_iext_insert(ip, idx + 1, 1, new, state); ip->i_df.if_lastex = idx + 1; ip->i_d.di_nextents++; if (cur == NULL) @@ -1670,9 +1480,6 @@ xfs_bmap_add_extent_unwritten_real( goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - /* DELTA: One in-core extent is split in two. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; case 0: @@ -1681,19 +1488,18 @@ xfs_bmap_add_extent_unwritten_real( * newext. Contiguity is impossible here. * One extent becomes three extents. */ - XFS_BMAP_TRACE_PRE_UPDATE("0", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, new->br_startoff - PREV.br_startoff); - XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + r[0] = *new; r[1].br_startoff = new_endoff; r[1].br_blockcount = PREV.br_startoff + PREV.br_blockcount - new_endoff; r[1].br_startblock = new->br_startblock + new->br_blockcount; r[1].br_state = oldext; - XFS_BMAP_TRACE_INSERT("0", ip, idx + 1, 2, &r[0], &r[1], - XFS_DATA_FORK); - xfs_iext_insert(ifp, idx + 1, 2, &r[0]); + xfs_iext_insert(ip, idx + 1, 2, &r[0], state); ip->i_df.if_lastex = idx + 1; ip->i_d.di_nextents += 2; if (cur == NULL) @@ -1733,45 +1539,27 @@ xfs_bmap_add_extent_unwritten_real( goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - /* DELTA: One in-core extent is split in three. */ - temp = PREV.br_startoff; - temp2 = PREV.br_blockcount; break; - case MASK3(LEFT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): - case MASK3(RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): - case MASK2(LEFT_FILLING, RIGHT_CONTIG): - case MASK2(RIGHT_FILLING, LEFT_CONTIG): - case MASK2(LEFT_CONTIG, RIGHT_CONTIG): - case MASK(LEFT_CONTIG): - case MASK(RIGHT_CONTIG): + case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_LEFT_FILLING | BMAP_RIGHT_CONTIG: + case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: + case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: + case BMAP_LEFT_CONTIG: + case BMAP_RIGHT_CONTIG: /* * These cases are all impossible. */ ASSERT(0); } *curp = cur; - if (delta) { - temp2 += temp; - if (delta->xed_startoff > temp) - delta->xed_startoff = temp; - if (delta->xed_blockcount < temp2) - delta->xed_blockcount = temp2; - } done: *logflagsp = rval; return error; #undef LEFT #undef RIGHT #undef PREV -#undef MASK -#undef MASK2 -#undef MASK3 -#undef MASK4 -#undef STATE_SET -#undef STATE_TEST -#undef STATE_SET_TEST -#undef SWITCH_STATE } /* @@ -1785,7 +1573,6 @@ xfs_bmap_add_extent_hole_delay( xfs_extnum_t idx, /* extent number to update/insert */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd) /* OK to allocate reserved blocks */ { xfs_bmbt_rec_host_t *ep; /* extent record for idx */ @@ -1796,63 +1583,57 @@ xfs_bmap_add_extent_hole_delay( xfs_bmbt_irec_t right; /* right neighbor extent entry */ int state; /* state bits, accessed thru macros */ xfs_filblks_t temp=0; /* temp for indirect calculations */ - xfs_filblks_t temp2=0; - enum { /* bit number definitions for state */ - LEFT_CONTIG, RIGHT_CONTIG, - LEFT_DELAY, RIGHT_DELAY, - LEFT_VALID, RIGHT_VALID - }; - -#define MASK(b) (1 << (b)) -#define MASK2(a,b) (MASK(a) | MASK(b)) -#define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b))) -#define STATE_TEST(b) (state & MASK(b)) -#define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \ - ((state &= ~MASK(b)), 0)) -#define SWITCH_STATE (state & MASK2(LEFT_CONTIG, RIGHT_CONTIG)) ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); ep = xfs_iext_get_ext(ifp, idx); state = 0; - ASSERT(ISNULLSTARTBLOCK(new->br_startblock)); + ASSERT(isnullstartblock(new->br_startblock)); + /* * Check and set flags if this segment has a left neighbor */ - if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { + if (idx > 0) { + state |= BMAP_LEFT_VALID; xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); - STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(left.br_startblock)); + + if (isnullstartblock(left.br_startblock)) + state |= BMAP_LEFT_DELAY; } + /* * Check and set flags if the current (right) segment exists. * If it doesn't exist, we're converting the hole at end-of-file. */ - if (STATE_SET_TEST(RIGHT_VALID, - idx < - ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t))) { + if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { + state |= BMAP_RIGHT_VALID; xfs_bmbt_get_all(ep, &right); - STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(right.br_startblock)); + + if (isnullstartblock(right.br_startblock)) + state |= BMAP_RIGHT_DELAY; } + /* * Set contiguity flags on the left and right neighbors. * Don't let extents get too large, even if the pieces are contiguous. */ - STATE_SET(LEFT_CONTIG, - STATE_TEST(LEFT_VALID) && STATE_TEST(LEFT_DELAY) && - left.br_startoff + left.br_blockcount == new->br_startoff && - left.br_blockcount + new->br_blockcount <= MAXEXTLEN); - STATE_SET(RIGHT_CONTIG, - STATE_TEST(RIGHT_VALID) && STATE_TEST(RIGHT_DELAY) && - new->br_startoff + new->br_blockcount == right.br_startoff && - new->br_blockcount + right.br_blockcount <= MAXEXTLEN && - (!STATE_TEST(LEFT_CONTIG) || - (left.br_blockcount + new->br_blockcount + - right.br_blockcount <= MAXEXTLEN))); + if ((state & BMAP_LEFT_VALID) && (state & BMAP_LEFT_DELAY) && + left.br_startoff + left.br_blockcount == new->br_startoff && + left.br_blockcount + new->br_blockcount <= MAXEXTLEN) + state |= BMAP_LEFT_CONTIG; + + if ((state & BMAP_RIGHT_VALID) && (state & BMAP_RIGHT_DELAY) && + new->br_startoff + new->br_blockcount == right.br_startoff && + new->br_blockcount + right.br_blockcount <= MAXEXTLEN && + (!(state & BMAP_LEFT_CONTIG) || + (left.br_blockcount + new->br_blockcount + + right.br_blockcount <= MAXEXTLEN))) + state |= BMAP_RIGHT_CONTIG; + /* * Switch out based on the contiguity flags. */ - switch (SWITCH_STATE) { - - case MASK2(LEFT_CONTIG, RIGHT_CONTIG): + switch (state & (BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG)) { + case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: /* * New allocation is contiguous with delayed allocations * on the left and on the right. @@ -1860,66 +1641,56 @@ xfs_bmap_add_extent_hole_delay( */ temp = left.br_blockcount + new->br_blockcount + right.br_blockcount; - XFS_BMAP_TRACE_PRE_UPDATE("LC|RC", ip, idx - 1, - XFS_DATA_FORK); + + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp); - oldlen = STARTBLOCKVAL(left.br_startblock) + - STARTBLOCKVAL(new->br_startblock) + - STARTBLOCKVAL(right.br_startblock); + oldlen = startblockval(left.br_startblock) + + startblockval(new->br_startblock) + + startblockval(right.br_startblock); newlen = xfs_bmap_worst_indlen(ip, temp); xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1), - NULLSTARTBLOCK((int)newlen)); - XFS_BMAP_TRACE_POST_UPDATE("LC|RC", ip, idx - 1, - XFS_DATA_FORK); - XFS_BMAP_TRACE_DELETE("LC|RC", ip, idx, 1, XFS_DATA_FORK); - xfs_iext_remove(ifp, idx, 1); + nullstartblock((int)newlen)); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + + xfs_iext_remove(ip, idx, 1, state); ip->i_df.if_lastex = idx - 1; - /* DELTA: Two in-core extents were replaced by one. */ - temp2 = temp; - temp = left.br_startoff; break; - case MASK(LEFT_CONTIG): + case BMAP_LEFT_CONTIG: /* * New allocation is contiguous with a delayed allocation * on the left. * Merge the new allocation with the left neighbor. */ temp = left.br_blockcount + new->br_blockcount; - XFS_BMAP_TRACE_PRE_UPDATE("LC", ip, idx - 1, - XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp); - oldlen = STARTBLOCKVAL(left.br_startblock) + - STARTBLOCKVAL(new->br_startblock); + oldlen = startblockval(left.br_startblock) + + startblockval(new->br_startblock); newlen = xfs_bmap_worst_indlen(ip, temp); xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1), - NULLSTARTBLOCK((int)newlen)); - XFS_BMAP_TRACE_POST_UPDATE("LC", ip, idx - 1, - XFS_DATA_FORK); + nullstartblock((int)newlen)); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + ip->i_df.if_lastex = idx - 1; - /* DELTA: One in-core extent grew into a hole. */ - temp2 = temp; - temp = left.br_startoff; break; - case MASK(RIGHT_CONTIG): + case BMAP_RIGHT_CONTIG: /* * New allocation is contiguous with a delayed allocation * on the right. * Merge the new allocation with the right neighbor. */ - XFS_BMAP_TRACE_PRE_UPDATE("RC", ip, idx, XFS_DATA_FORK); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); temp = new->br_blockcount + right.br_blockcount; - oldlen = STARTBLOCKVAL(new->br_startblock) + - STARTBLOCKVAL(right.br_startblock); + oldlen = startblockval(new->br_startblock) + + startblockval(right.br_startblock); newlen = xfs_bmap_worst_indlen(ip, temp); xfs_bmbt_set_allf(ep, new->br_startoff, - NULLSTARTBLOCK((int)newlen), temp, right.br_state); - XFS_BMAP_TRACE_POST_UPDATE("RC", ip, idx, XFS_DATA_FORK); + nullstartblock((int)newlen), temp, right.br_state); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + ip->i_df.if_lastex = idx; - /* DELTA: One in-core extent grew into a hole. */ - temp2 = temp; - temp = new->br_startoff; break; case 0: @@ -1929,38 +1700,20 @@ xfs_bmap_add_extent_hole_delay( * Insert a new entry. */ oldlen = newlen = 0; - XFS_BMAP_TRACE_INSERT("0", ip, idx, 1, new, NULL, - XFS_DATA_FORK); - xfs_iext_insert(ifp, idx, 1, new); + xfs_iext_insert(ip, idx, 1, new, state); ip->i_df.if_lastex = idx; - /* DELTA: A new in-core extent was added in a hole. */ - temp2 = new->br_blockcount; - temp = new->br_startoff; break; } if (oldlen != newlen) { ASSERT(oldlen > newlen); - xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, + xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, (int64_t)(oldlen - newlen), rsvd); /* * Nothing to do for disk quota accounting here. */ } - if (delta) { - temp2 += temp; - if (delta->xed_startoff > temp) - delta->xed_startoff = temp; - if (delta->xed_blockcount < temp2) - delta->xed_blockcount = temp2; - } *logflagsp = 0; return 0; -#undef MASK -#undef MASK2 -#undef STATE_SET -#undef STATE_TEST -#undef STATE_SET_TEST -#undef SWITCH_STATE } /* @@ -1974,7 +1727,6 @@ xfs_bmap_add_extent_hole_real( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork) /* data or attr fork */ { xfs_bmbt_rec_host_t *ep; /* pointer to extent entry ins. point */ @@ -1985,90 +1737,80 @@ xfs_bmap_add_extent_hole_real( xfs_bmbt_irec_t right; /* right neighbor extent entry */ int rval=0; /* return value (logging flags) */ int state; /* state bits, accessed thru macros */ - xfs_filblks_t temp=0; - xfs_filblks_t temp2=0; - enum { /* bit number definitions for state */ - LEFT_CONTIG, RIGHT_CONTIG, - LEFT_DELAY, RIGHT_DELAY, - LEFT_VALID, RIGHT_VALID - }; - -#define MASK(b) (1 << (b)) -#define MASK2(a,b) (MASK(a) | MASK(b)) -#define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b))) -#define STATE_TEST(b) (state & MASK(b)) -#define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \ - ((state &= ~MASK(b)), 0)) -#define SWITCH_STATE (state & MASK2(LEFT_CONTIG, RIGHT_CONTIG)) ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT(idx <= ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); ep = xfs_iext_get_ext(ifp, idx); state = 0; + + if (whichfork == XFS_ATTR_FORK) + state |= BMAP_ATTRFORK; + /* * Check and set flags if this segment has a left neighbor. */ - if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { + if (idx > 0) { + state |= BMAP_LEFT_VALID; xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); - STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(left.br_startblock)); + if (isnullstartblock(left.br_startblock)) + state |= BMAP_LEFT_DELAY; } + /* * Check and set flags if this segment has a current value. * Not true if we're inserting into the "hole" at eof. */ - if (STATE_SET_TEST(RIGHT_VALID, - idx < - ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))) { + if (idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { + state |= BMAP_RIGHT_VALID; xfs_bmbt_get_all(ep, &right); - STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(right.br_startblock)); + if (isnullstartblock(right.br_startblock)) + state |= BMAP_RIGHT_DELAY; } + /* * We're inserting a real allocation between "left" and "right". * Set the contiguity flags. Don't let extents get too large. */ - STATE_SET(LEFT_CONTIG, - STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) && - left.br_startoff + left.br_blockcount == new->br_startoff && - left.br_startblock + left.br_blockcount == new->br_startblock && - left.br_state == new->br_state && - left.br_blockcount + new->br_blockcount <= MAXEXTLEN); - STATE_SET(RIGHT_CONTIG, - STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) && - new->br_startoff + new->br_blockcount == right.br_startoff && - new->br_startblock + new->br_blockcount == - right.br_startblock && - new->br_state == right.br_state && - new->br_blockcount + right.br_blockcount <= MAXEXTLEN && - (!STATE_TEST(LEFT_CONTIG) || - left.br_blockcount + new->br_blockcount + - right.br_blockcount <= MAXEXTLEN)); + if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && + left.br_startoff + left.br_blockcount == new->br_startoff && + left.br_startblock + left.br_blockcount == new->br_startblock && + left.br_state == new->br_state && + left.br_blockcount + new->br_blockcount <= MAXEXTLEN) + state |= BMAP_LEFT_CONTIG; + + if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && + new->br_startoff + new->br_blockcount == right.br_startoff && + new->br_startblock + new->br_blockcount == right.br_startblock && + new->br_state == right.br_state && + new->br_blockcount + right.br_blockcount <= MAXEXTLEN && + (!(state & BMAP_LEFT_CONTIG) || + left.br_blockcount + new->br_blockcount + + right.br_blockcount <= MAXEXTLEN)) + state |= BMAP_RIGHT_CONTIG; error = 0; /* * Select which case we're in here, and implement it. */ - switch (SWITCH_STATE) { - - case MASK2(LEFT_CONTIG, RIGHT_CONTIG): + switch (state & (BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG)) { + case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: /* * New allocation is contiguous with real allocations on the * left and on the right. * Merge all three into a single extent record. */ - XFS_BMAP_TRACE_PRE_UPDATE("LC|RC", ip, idx - 1, - whichfork); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), left.br_blockcount + new->br_blockcount + right.br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LC|RC", ip, idx - 1, - whichfork); - XFS_BMAP_TRACE_DELETE("LC|RC", ip, idx, 1, whichfork); - xfs_iext_remove(ifp, idx, 1); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + + xfs_iext_remove(ip, idx, 1, state); ifp->if_lastex = idx - 1; XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) - 1); if (cur == NULL) { - rval = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); + rval = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); } else { rval = XFS_ILOG_CORE; if ((error = xfs_bmbt_lookup_eq(cur, @@ -2091,26 +1833,22 @@ xfs_bmap_add_extent_hole_real( left.br_state))) goto done; } - /* DELTA: Two in-core extents were replaced by one. */ - temp = left.br_startoff; - temp2 = left.br_blockcount + - new->br_blockcount + - right.br_blockcount; break; - case MASK(LEFT_CONTIG): + case BMAP_LEFT_CONTIG: /* * New allocation is contiguous with a real allocation * on the left. * Merge the new allocation with the left neighbor. */ - XFS_BMAP_TRACE_PRE_UPDATE("LC", ip, idx - 1, whichfork); + trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), left.br_blockcount + new->br_blockcount); - XFS_BMAP_TRACE_POST_UPDATE("LC", ip, idx - 1, whichfork); + trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); + ifp->if_lastex = idx - 1; if (cur == NULL) { - rval = XFS_ILOG_FEXT(whichfork); + rval = xfs_ilog_fext(whichfork); } else { rval = 0; if ((error = xfs_bmbt_lookup_eq(cur, @@ -2126,26 +1864,23 @@ xfs_bmap_add_extent_hole_real( left.br_state))) goto done; } - /* DELTA: One in-core extent grew. */ - temp = left.br_startoff; - temp2 = left.br_blockcount + - new->br_blockcount; break; - case MASK(RIGHT_CONTIG): + case BMAP_RIGHT_CONTIG: /* * New allocation is contiguous with a real allocation * on the right. * Merge the new allocation with the right neighbor. */ - XFS_BMAP_TRACE_PRE_UPDATE("RC", ip, idx, whichfork); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_allf(ep, new->br_startoff, new->br_startblock, new->br_blockcount + right.br_blockcount, right.br_state); - XFS_BMAP_TRACE_POST_UPDATE("RC", ip, idx, whichfork); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + ifp->if_lastex = idx; if (cur == NULL) { - rval = XFS_ILOG_FEXT(whichfork); + rval = xfs_ilog_fext(whichfork); } else { rval = 0; if ((error = xfs_bmbt_lookup_eq(cur, @@ -2161,10 +1896,6 @@ xfs_bmap_add_extent_hole_real( right.br_state))) goto done; } - /* DELTA: One in-core extent grew. */ - temp = new->br_startoff; - temp2 = new->br_blockcount + - right.br_blockcount; break; case 0: @@ -2173,13 +1904,12 @@ xfs_bmap_add_extent_hole_real( * real allocation. * Insert a new entry. */ - XFS_BMAP_TRACE_INSERT("0", ip, idx, 1, new, NULL, whichfork); - xfs_iext_insert(ifp, idx, 1, new); + xfs_iext_insert(ip, idx, 1, new, state); ifp->if_lastex = idx; XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) + 1); if (cur == NULL) { - rval = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); + rval = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); } else { rval = XFS_ILOG_CORE; if ((error = xfs_bmbt_lookup_eq(cur, @@ -2193,27 +1923,11 @@ xfs_bmap_add_extent_hole_real( goto done; XFS_WANT_CORRUPTED_GOTO(i == 1, done); } - /* DELTA: A new extent was added in a hole. */ - temp = new->br_startoff; - temp2 = new->br_blockcount; break; } - if (delta) { - temp2 += temp; - if (delta->xed_startoff > temp) - delta->xed_startoff = temp; - if (delta->xed_blockcount < temp2) - delta->xed_blockcount = temp2; - } done: *logflagsp = rval; return error; -#undef MASK -#undef MASK2 -#undef STATE_SET -#undef STATE_TEST -#undef STATE_SET_TEST -#undef SWITCH_STATE } /* @@ -2404,10 +2118,10 @@ xfs_bmap_adjacent( fb_agno = nullfb ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, ap->firstblock); /* * If allocating at eof, and there's a previous real block, - * try to use it's last block as our starting point. + * try to use its last block as our starting point. */ if (ap->eof && ap->prevp->br_startoff != NULLFILEOFF && - !ISNULLSTARTBLOCK(ap->prevp->br_startblock) && + !isnullstartblock(ap->prevp->br_startblock) && ISVALID(ap->prevp->br_startblock + ap->prevp->br_blockcount, ap->prevp->br_startblock)) { ap->rval = ap->prevp->br_startblock + ap->prevp->br_blockcount; @@ -2436,7 +2150,7 @@ xfs_bmap_adjacent( * start block based on it. */ if (ap->prevp->br_startoff != NULLFILEOFF && - !ISNULLSTARTBLOCK(ap->prevp->br_startblock) && + !isnullstartblock(ap->prevp->br_startblock) && (prevbno = ap->prevp->br_startblock + ap->prevp->br_blockcount) && ISVALID(prevbno, ap->prevp->br_startblock)) { @@ -2477,7 +2191,7 @@ xfs_bmap_adjacent( * If there's a following (right) block, select a requested * start block based on it. */ - if (!ISNULLSTARTBLOCK(ap->gotp->br_startblock)) { + if (!isnullstartblock(ap->gotp->br_startblock)) { /* * Calculate gap to start of next block. */ @@ -2530,25 +2244,134 @@ xfs_bmap_adjacent( } STATIC int +xfs_bmap_btalloc_nullfb( + struct xfs_bmalloca *ap, + struct xfs_alloc_arg *args, + xfs_extlen_t *blen) +{ + struct xfs_mount *mp = ap->ip->i_mount; + struct xfs_perag *pag; + xfs_agnumber_t ag, startag; + int notinit = 0; + int error; + + if (ap->userdata && xfs_inode_is_filestream(ap->ip)) + args->type = XFS_ALLOCTYPE_NEAR_BNO; + else + args->type = XFS_ALLOCTYPE_START_BNO; + args->total = ap->total; + + /* + * Search for an allocation group with a single extent large enough + * for the request. If one isn't found, then adjust the minimum + * allocation size to the largest space found. + */ + startag = ag = XFS_FSB_TO_AGNO(mp, args->fsbno); + if (startag == NULLAGNUMBER) + startag = ag = 0; + + pag = xfs_perag_get(mp, ag); + while (*blen < ap->alen) { + if (!pag->pagf_init) { + error = xfs_alloc_pagf_init(mp, args->tp, ag, + XFS_ALLOC_FLAG_TRYLOCK); + if (error) { + xfs_perag_put(pag); + return error; + } + } + + /* + * See xfs_alloc_fix_freelist... + */ + if (pag->pagf_init) { + xfs_extlen_t longest; + longest = xfs_alloc_longest_free_extent(mp, pag); + if (*blen < longest) + *blen = longest; + } else + notinit = 1; + + if (xfs_inode_is_filestream(ap->ip)) { + if (*blen >= ap->alen) + break; + + if (ap->userdata) { + /* + * If startag is an invalid AG, we've + * come here once before and + * xfs_filestream_new_ag picked the + * best currently available. + * + * Don't continue looping, since we + * could loop forever. + */ + if (startag == NULLAGNUMBER) + break; + + error = xfs_filestream_new_ag(ap, &ag); + xfs_perag_put(pag); + if (error) + return error; + + /* loop again to set 'blen'*/ + startag = NULLAGNUMBER; + pag = xfs_perag_get(mp, ag); + continue; + } + } + if (++ag == mp->m_sb.sb_agcount) + ag = 0; + if (ag == startag) + break; + xfs_perag_put(pag); + pag = xfs_perag_get(mp, ag); + } + xfs_perag_put(pag); + + /* + * Since the above loop did a BUF_TRYLOCK, it is + * possible that there is space for this request. + */ + if (notinit || *blen < ap->minlen) + args->minlen = ap->minlen; + /* + * If the best seen length is less than the request + * length, use the best as the minimum. + */ + else if (*blen < ap->alen) + args->minlen = *blen; + /* + * Otherwise we've seen an extent as big as alen, + * use that as the minimum. + */ + else + args->minlen = ap->alen; + + /* + * set the failure fallback case to look in the selected + * AG as the stream may have moved. + */ + if (xfs_inode_is_filestream(ap->ip)) + ap->rval = args->fsbno = XFS_AGB_TO_FSB(mp, ag, 0); + + return 0; +} + +STATIC int xfs_bmap_btalloc( xfs_bmalloca_t *ap) /* bmap alloc argument struct */ { xfs_mount_t *mp; /* mount point structure */ xfs_alloctype_t atype = 0; /* type for allocation routines */ xfs_extlen_t align; /* minimum allocation alignment */ - xfs_agnumber_t ag; xfs_agnumber_t fb_agno; /* ag number of ap->firstblock */ - xfs_agnumber_t startag; + xfs_agnumber_t ag; xfs_alloc_arg_t args; xfs_extlen_t blen; - xfs_extlen_t delta; - xfs_extlen_t longest; - xfs_extlen_t need; xfs_extlen_t nextminlen = 0; - xfs_perag_t *pag; int nullfb; /* true if ap->firstblock isn't set */ int isaligned; - int notinit; int tryagain; int error; @@ -2595,107 +2418,9 @@ xfs_bmap_btalloc( args.firstblock = ap->firstblock; blen = 0; if (nullfb) { - if (ap->userdata && xfs_inode_is_filestream(ap->ip)) - args.type = XFS_ALLOCTYPE_NEAR_BNO; - else - args.type = XFS_ALLOCTYPE_START_BNO; - args.total = ap->total; - - /* - * Search for an allocation group with a single extent - * large enough for the request. - * - * If one isn't found, then adjust the minimum allocation - * size to the largest space found. - */ - startag = ag = XFS_FSB_TO_AGNO(mp, args.fsbno); - if (startag == NULLAGNUMBER) - startag = ag = 0; - notinit = 0; - down_read(&mp->m_peraglock); - while (blen < ap->alen) { - pag = &mp->m_perag[ag]; - if (!pag->pagf_init && - (error = xfs_alloc_pagf_init(mp, args.tp, - ag, XFS_ALLOC_FLAG_TRYLOCK))) { - up_read(&mp->m_peraglock); - return error; - } - /* - * See xfs_alloc_fix_freelist... - */ - if (pag->pagf_init) { - need = XFS_MIN_FREELIST_PAG(pag, mp); - delta = need > pag->pagf_flcount ? - need - pag->pagf_flcount : 0; - longest = (pag->pagf_longest > delta) ? - (pag->pagf_longest - delta) : - (pag->pagf_flcount > 0 || - pag->pagf_longest > 0); - if (blen < longest) - blen = longest; - } else - notinit = 1; - - if (xfs_inode_is_filestream(ap->ip)) { - if (blen >= ap->alen) - break; - - if (ap->userdata) { - /* - * If startag is an invalid AG, we've - * come here once before and - * xfs_filestream_new_ag picked the - * best currently available. - * - * Don't continue looping, since we - * could loop forever. - */ - if (startag == NULLAGNUMBER) - break; - - error = xfs_filestream_new_ag(ap, &ag); - if (error) { - up_read(&mp->m_peraglock); - return error; - } - - /* loop again to set 'blen'*/ - startag = NULLAGNUMBER; - continue; - } - } - if (++ag == mp->m_sb.sb_agcount) - ag = 0; - if (ag == startag) - break; - } - up_read(&mp->m_peraglock); - /* - * Since the above loop did a BUF_TRYLOCK, it is - * possible that there is space for this request. - */ - if (notinit || blen < ap->minlen) - args.minlen = ap->minlen; - /* - * If the best seen length is less than the request - * length, use the best as the minimum. - */ - else if (blen < ap->alen) - args.minlen = blen; - /* - * Otherwise we've seen an extent as big as alen, - * use that as the minimum. - */ - else - args.minlen = ap->alen; - - /* - * set the failure fallback case to look in the selected - * AG as the stream may have moved. - */ - if (xfs_inode_is_filestream(ap->ip)) - ap->rval = args.fsbno = XFS_AGB_TO_FSB(mp, ag, 0); + error = xfs_bmap_btalloc_nullfb(ap, &args, &blen); + if (error) + return error; } else if (ap->low) { if (xfs_inode_is_filestream(ap->ip)) args.type = XFS_ALLOCTYPE_FIRST_AG; @@ -2832,7 +2557,7 @@ xfs_bmap_btalloc( * Adjust the disk quota also. This was reserved * earlier. */ - XFS_TRANS_MOD_DQUOT_BYINO(mp, ap->tp, ap->ip, + xfs_trans_mod_dquot_byino(ap->tp, ap->ip, ap->wasdel ? XFS_TRANS_DQ_DELBCOUNT : XFS_TRANS_DQ_BCOUNT, (long) args.len); @@ -2903,7 +2628,7 @@ xfs_bmap_btree_to_extents( return error; xfs_bmap_add_free(cbno, 1, cur->bc_private.b.flist, mp); ip->i_d.di_nblocks--; - XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); xfs_trans_binval(tp, cbp); if (cur->bc_bufs[0] == cbp) cur->bc_bufs[0] = NULL; @@ -2911,7 +2636,7 @@ xfs_bmap_btree_to_extents( ASSERT(ifp->if_broot == NULL); ASSERT((ifp->if_flags & XFS_IFBROOT) == 0); XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); - *logflagsp = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); + *logflagsp = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); return 0; } @@ -2928,7 +2653,6 @@ xfs_bmap_del_extent( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *del, /* data to remove from extents */ int *logflagsp, /* inode logging flags */ - xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd) /* OK to allocate reserved blocks */ { @@ -2952,8 +2676,13 @@ xfs_bmap_del_extent( uint qfield; /* quota field to update */ xfs_filblks_t temp; /* for indirect length calculations */ xfs_filblks_t temp2; /* for indirect length calculations */ + int state = 0; XFS_STATS_INC(xs_del_exlist); + + if (whichfork == XFS_ATTR_FORK) + state |= BMAP_ATTRFORK; + mp = ip->i_mount; ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT((idx >= 0) && (idx < ifp->if_bytes / @@ -2965,8 +2694,8 @@ xfs_bmap_del_extent( del_endoff = del->br_startoff + del->br_blockcount; got_endoff = got.br_startoff + got.br_blockcount; ASSERT(got_endoff >= del_endoff); - delay = ISNULLSTARTBLOCK(got.br_startblock); - ASSERT(ISNULLSTARTBLOCK(del->br_startblock) == delay); + delay = isnullstartblock(got.br_startblock); + ASSERT(isnullstartblock(del->br_startblock) == delay); flags = 0; qfield = 0; error = 0; @@ -3018,7 +2747,7 @@ xfs_bmap_del_extent( } da_old = da_new = 0; } else { - da_old = STARTBLOCKVAL(got.br_startblock); + da_old = startblockval(got.br_startblock); da_new = 0; nblks = 0; do_fx = 0; @@ -3033,8 +2762,8 @@ xfs_bmap_del_extent( /* * Matches the whole extent. Delete the entry. */ - XFS_BMAP_TRACE_DELETE("3", ip, idx, 1, whichfork); - xfs_iext_remove(ifp, idx, 1); + xfs_iext_remove(ip, idx, 1, + whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0); ifp->if_lastex = idx; if (delay) break; @@ -3042,7 +2771,7 @@ xfs_bmap_del_extent( XFS_IFORK_NEXTENTS(ip, whichfork) - 1); flags |= XFS_ILOG_CORE; if (!cur) { - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); break; } if ((error = xfs_btree_delete(cur, &i))) @@ -3054,7 +2783,7 @@ xfs_bmap_del_extent( /* * Deleting the first part of the extent. */ - XFS_BMAP_TRACE_PRE_UPDATE("2", ip, idx, whichfork); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_startoff(ep, del_endoff); temp = got.br_blockcount - del->br_blockcount; xfs_bmbt_set_blockcount(ep, temp); @@ -3062,16 +2791,15 @@ xfs_bmap_del_extent( if (delay) { temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), da_old); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); - XFS_BMAP_TRACE_POST_UPDATE("2", ip, idx, - whichfork); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); da_new = temp; break; } xfs_bmbt_set_startblock(ep, del_endblock); - XFS_BMAP_TRACE_POST_UPDATE("2", ip, idx, whichfork); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); if (!cur) { - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); break; } if ((error = xfs_bmbt_update(cur, del_endoff, del_endblock, @@ -3085,21 +2813,20 @@ xfs_bmap_del_extent( * Deleting the last part of the extent. */ temp = got.br_blockcount - del->br_blockcount; - XFS_BMAP_TRACE_PRE_UPDATE("1", ip, idx, whichfork); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); ifp->if_lastex = idx; if (delay) { temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), da_old); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); - XFS_BMAP_TRACE_POST_UPDATE("1", ip, idx, - whichfork); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); da_new = temp; break; } - XFS_BMAP_TRACE_POST_UPDATE("1", ip, idx, whichfork); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); if (!cur) { - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); break; } if ((error = xfs_bmbt_update(cur, got.br_startoff, @@ -3114,7 +2841,7 @@ xfs_bmap_del_extent( * Deleting the middle of the extent. */ temp = del->br_startoff - got.br_startoff; - XFS_BMAP_TRACE_PRE_UPDATE("0", ip, idx, whichfork); + trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); new.br_startoff = del_endoff; temp2 = got_endoff - del_endoff; @@ -3174,22 +2901,22 @@ xfs_bmap_del_extent( } XFS_WANT_CORRUPTED_GOTO(i == 1, done); } else - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) + 1); } else { ASSERT(whichfork == XFS_DATA_FORK); temp = xfs_bmap_worst_indlen(ip, temp); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); temp2 = xfs_bmap_worst_indlen(ip, temp2); - new.br_startblock = NULLSTARTBLOCK((int)temp2); + new.br_startblock = nullstartblock((int)temp2); da_new = temp + temp2; while (da_new > da_old) { if (temp) { temp--; da_new--; xfs_bmbt_set_startblock(ep, - NULLSTARTBLOCK((int)temp)); + nullstartblock((int)temp)); } if (da_new == da_old) break; @@ -3197,14 +2924,12 @@ xfs_bmap_del_extent( temp2--; da_new--; new.br_startblock = - NULLSTARTBLOCK((int)temp2); + nullstartblock((int)temp2); } } } - XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx, whichfork); - XFS_BMAP_TRACE_INSERT("0", ip, idx + 1, 1, &new, NULL, - whichfork); - xfs_iext_insert(ifp, idx + 1, 1, &new); + trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); + xfs_iext_insert(ip, idx + 1, 1, &new, state); ifp->if_lastex = idx + 1; break; } @@ -3223,23 +2948,16 @@ xfs_bmap_del_extent( * Adjust quota data. */ if (qfield) - XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, qfield, (long)-nblks); + xfs_trans_mod_dquot_byino(tp, ip, qfield, (long)-nblks); /* * Account for change in delayed indirect blocks. * Nothing to do for disk quota accounting here. */ ASSERT(da_old >= da_new); - if (da_old > da_new) - xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, (int64_t)(da_old - da_new), - rsvd); - if (delta) { - /* DELTA: report the original extent. */ - if (delta->xed_startoff > got.br_startoff) - delta->xed_startoff = got.br_startoff; - if (delta->xed_blockcount < got.br_startoff+got.br_blockcount) - delta->xed_blockcount = got.br_startoff + - got.br_blockcount; + if (da_old > da_new) { + xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + (int64_t)(da_old - da_new), rsvd); } done: *logflagsp = flags; @@ -3249,8 +2967,6 @@ done: /* * Remove the entry "free" from the free item list. Prev points to the * previous entry, unless "free" is the head of the list. - * - * Note: this requires user-space public scope for libxfs_iread */ void xfs_bmap_del_free( @@ -3362,7 +3078,7 @@ xfs_bmap_extents_to_btree( *firstblock = cur->bc_private.b.firstblock = args.fsbno; cur->bc_private.b.allocated++; ip->i_d.di_nblocks++; - XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, 1L); + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, 1L); abp = xfs_btree_get_bufl(mp, tp, args.fsbno, 0); /* * Fill in the child block. @@ -3376,7 +3092,7 @@ xfs_bmap_extents_to_btree( nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); for (cnt = i = 0; i < nextents; i++) { ep = xfs_iext_get_ext(ifp, i); - if (!ISNULLSTARTBLOCK(xfs_bmbt_get_startblock(ep))) { + if (!isnullstartblock(xfs_bmbt_get_startblock(ep))) { arp->l0 = cpu_to_be64(ep->l0); arp->l1 = cpu_to_be64(ep->l1); arp++; cnt++; @@ -3403,11 +3119,32 @@ xfs_bmap_extents_to_btree( xfs_btree_log_recs(cur, abp, 1, be16_to_cpu(ablock->bb_numrecs)); ASSERT(*curp == NULL); *curp = cur; - *logflagsp = XFS_ILOG_CORE | XFS_ILOG_FBROOT(whichfork); + *logflagsp = XFS_ILOG_CORE | xfs_ilog_fbroot(whichfork); return 0; } /* + * Calculate the default attribute fork offset for newly created inodes. + */ +uint +xfs_default_attroffset( + struct xfs_inode *ip) +{ + struct xfs_mount *mp = ip->i_mount; + uint offset; + + if (mp->m_sb.sb_inodesize == 256) { + offset = XFS_LITINO(mp) - + XFS_BMDR_SPACE_CALC(MINABTPTRS); + } else { + offset = XFS_BMDR_SPACE_CALC(6 * MINABTPTRS); + } + + ASSERT(offset < XFS_LITINO(mp)); + return offset; +} + +/* * Helper routine to reset inode di_forkoff field when switching * attribute fork from local to extent format - we reset it where * possible to make space available for inline data fork extents. @@ -3419,15 +3156,18 @@ xfs_bmap_forkoff_reset( int whichfork) { if (whichfork == XFS_ATTR_FORK && - (ip->i_d.di_format != XFS_DINODE_FMT_DEV) && - (ip->i_d.di_format != XFS_DINODE_FMT_UUID) && - (ip->i_d.di_format != XFS_DINODE_FMT_BTREE) && - ((mp->m_attroffset >> 3) > ip->i_d.di_forkoff)) { - ip->i_d.di_forkoff = mp->m_attroffset >> 3; - ip->i_df.if_ext_max = XFS_IFORK_DSIZE(ip) / - (uint)sizeof(xfs_bmbt_rec_t); - ip->i_afp->if_ext_max = XFS_IFORK_ASIZE(ip) / - (uint)sizeof(xfs_bmbt_rec_t); + ip->i_d.di_format != XFS_DINODE_FMT_DEV && + ip->i_d.di_format != XFS_DINODE_FMT_UUID && + ip->i_d.di_format != XFS_DINODE_FMT_BTREE) { + uint dfl_forkoff = xfs_default_attroffset(ip) >> 3; + + if (dfl_forkoff > ip->i_d.di_forkoff) { + ip->i_d.di_forkoff = dfl_forkoff; + ip->i_df.if_ext_max = + XFS_IFORK_DSIZE(ip) / sizeof(xfs_bmbt_rec_t); + ip->i_afp->if_ext_max = + XFS_IFORK_ASIZE(ip) / sizeof(xfs_bmbt_rec_t); + } } } @@ -3502,12 +3242,14 @@ xfs_bmap_local_to_extents( xfs_iext_add(ifp, 0, 1); ep = xfs_iext_get_ext(ifp, 0); xfs_bmbt_set_allf(ep, 0, args.fsbno, 1, XFS_EXT_NORM); - XFS_BMAP_TRACE_POST_UPDATE("new", ip, 0, whichfork); + trace_xfs_bmap_post_update(ip, 0, + whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0, + _THIS_IP_); XFS_IFORK_NEXT_SET(ip, whichfork, 1); ip->i_d.di_nblocks = 1; - XFS_TRANS_MOD_DQUOT_BYINO(args.mp, tp, ip, + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, 1L); - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); } else { ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) == 0); xfs_bmap_forkoff_reset(ip->i_mount, ip, whichfork); @@ -3528,7 +3270,7 @@ done: * entry (null if none). Else, *lastxp will be set to the index * of the found entry; *gotp will contain the entry. */ -xfs_bmbt_rec_host_t * /* pointer to found extent entry */ +STATIC xfs_bmbt_rec_host_t * /* pointer to found extent entry */ xfs_bmap_search_multi_extents( xfs_ifork_t *ifp, /* inode fork pointer */ xfs_fileoff_t bno, /* block number searched for */ @@ -3578,8 +3320,6 @@ xfs_bmap_search_multi_extents( * *eofp will be set, and *prevp will contain the last entry (null if none). * Else, *lastxp will be set to the index of the found * entry; *gotp will contain the entry. - * - * Note this is public in libxfs for xfs_repair's phase6. */ xfs_bmbt_rec_host_t * /* pointer to found extent entry */ xfs_bmap_search_extents( @@ -3682,7 +3422,7 @@ xfs_bmap_add_attrfork( XFS_TRANS_PERM_LOG_RES, XFS_ADDAFORK_LOG_COUNT))) goto error0; xfs_ilock(ip, XFS_ILOCK_EXCL); - error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, blks, 0, rsvd ? + error = xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ? XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES : XFS_QMOPT_RES_REGBLKS); if (error) { @@ -3700,9 +3440,10 @@ xfs_bmap_add_attrfork( ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; } ASSERT(ip->i_d.di_anextents == 0); - IHOLD(ip); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + + xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + switch (ip->i_d.di_format) { case XFS_DINODE_FMT_DEV: ip->i_d.di_forkoff = roundup(sizeof(xfs_dev_t), 8) >> 3; @@ -3715,7 +3456,7 @@ xfs_bmap_add_attrfork( case XFS_DINODE_FMT_BTREE: ip->i_d.di_forkoff = xfs_attr_shortform_bytesfit(ip, size); if (!ip->i_d.di_forkoff) - ip->i_d.di_forkoff = mp->m_attroffset >> 3; + ip->i_d.di_forkoff = xfs_default_attroffset(ip) >> 3; else if (mp->m_flags & XFS_MOUNT_ATTR2) version = 2; break; @@ -3732,7 +3473,7 @@ xfs_bmap_add_attrfork( XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); ip->i_afp->if_flags = XFS_IFEXTENTS; logflags = 0; - XFS_BMAP_INIT(&flist, &firstblock); + xfs_bmap_init(&flist, &firstblock); switch (ip->i_d.di_format) { case XFS_DINODE_FMT_LOCAL: error = xfs_bmap_add_attrfork_local(tp, ip, &firstblock, &flist, @@ -3775,7 +3516,7 @@ xfs_bmap_add_attrfork( } if ((error = xfs_bmap_finish(&tp, &flist, &committed))) goto error2; - error = xfs_trans_commit(tp, XFS_TRANS_PERM_LOG_RES); + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); ASSERT(ip->i_df.if_ext_max == XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t)); return error; @@ -3812,7 +3553,7 @@ xfs_bmap_add_free( ASSERT(bno != NULLFSBLOCK); ASSERT(len > 0); ASSERT(len <= MAXEXTLEN); - ASSERT(!ISNULLSTARTBLOCK(bno)); + ASSERT(!isnullstartblock(bno)); agno = XFS_FSB_TO_AGNO(mp, bno); agbno = XFS_FSB_TO_AGBNO(mp, bno); ASSERT(agno < mp->m_sb.sb_agcount); @@ -3862,12 +3603,12 @@ xfs_bmap_compute_maxlevels( * (a signed 16-bit number, xfs_aextnum_t). * * Note that we can no longer assume that if we are in ATTR1 that - * the fork offset of all the inodes will be (m_attroffset >> 3) - * because we could have mounted with ATTR2 and then mounted back - * with ATTR1, keeping the di_forkoff's fixed but probably at - * various positions. Therefore, for both ATTR1 and ATTR2 - * we have to assume the worst case scenario of a minimum size - * available. + * the fork offset of all the inodes will be + * (xfs_default_attroffset(ip) >> 3) because we could have mounted + * with ATTR2 and then mounted back with ATTR1, keeping the + * di_forkoff's fixed but probably at various positions. Therefore, + * for both ATTR1 and ATTR2 we have to assume the worst case scenario + * of a minimum size available. */ if (whichfork == XFS_DATA_FORK) { maxleafents = MAXEXTNUM; @@ -4243,6 +3984,74 @@ error0: return XFS_ERROR(EFSCORRUPTED); } +#ifdef DEBUG +/* + * Add bmap trace insert entries for all the contents of the extent records. + */ +void +xfs_bmap_trace_exlist( + xfs_inode_t *ip, /* incore inode pointer */ + xfs_extnum_t cnt, /* count of entries in the list */ + int whichfork, /* data or attr fork */ + unsigned long caller_ip) +{ + xfs_extnum_t idx; /* extent record index */ + xfs_ifork_t *ifp; /* inode fork pointer */ + int state = 0; + + if (whichfork == XFS_ATTR_FORK) + state |= BMAP_ATTRFORK; + + ifp = XFS_IFORK_PTR(ip, whichfork); + ASSERT(cnt == (ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))); + for (idx = 0; idx < cnt; idx++) + trace_xfs_extlist(ip, idx, whichfork, caller_ip); +} + +/* + * Validate that the bmbt_irecs being returned from bmapi are valid + * given the callers original parameters. Specifically check the + * ranges of the returned irecs to ensure that they only extent beyond + * the given parameters if the XFS_BMAPI_ENTIRE flag was set. + */ +STATIC void +xfs_bmap_validate_ret( + xfs_fileoff_t bno, + xfs_filblks_t len, + int flags, + xfs_bmbt_irec_t *mval, + int nmap, + int ret_nmap) +{ + int i; /* index to map values */ + + ASSERT(ret_nmap <= nmap); + + for (i = 0; i < ret_nmap; i++) { + ASSERT(mval[i].br_blockcount > 0); + if (!(flags & XFS_BMAPI_ENTIRE)) { + ASSERT(mval[i].br_startoff >= bno); + ASSERT(mval[i].br_blockcount <= len); + ASSERT(mval[i].br_startoff + mval[i].br_blockcount <= + bno + len); + } else { + ASSERT(mval[i].br_startoff < bno + len); + ASSERT(mval[i].br_startoff + mval[i].br_blockcount > + bno); + } + ASSERT(i == 0 || + mval[i - 1].br_startoff + mval[i - 1].br_blockcount == + mval[i].br_startoff); + if ((flags & XFS_BMAPI_WRITE) && !(flags & XFS_BMAPI_DELAY)) + ASSERT(mval[i].br_startblock != DELAYSTARTBLOCK && + mval[i].br_startblock != HOLESTARTBLOCK); + ASSERT(mval[i].br_state == XFS_EXT_NORM || + mval[i].br_state == XFS_EXT_UNWRITTEN); + } +} +#endif /* DEBUG */ + + /* * Map file blocks to filesystem blocks. * File range is given by the bno/len pair. @@ -4268,13 +4077,12 @@ xfs_bmapi( xfs_extlen_t total, /* total blocks needed */ xfs_bmbt_irec_t *mval, /* output: map values */ int *nmap, /* i/o: mval size/count */ - xfs_bmap_free_t *flist, /* i/o: list extents to free */ - xfs_extdelta_t *delta) /* o: change made to incore extents */ + xfs_bmap_free_t *flist) /* i/o: list extents to free */ { xfs_fsblock_t abno; /* allocated block number */ xfs_extlen_t alen; /* allocated extent length */ xfs_fileoff_t aoff; /* allocated file offset */ - xfs_bmalloca_t bma; /* args for xfs_bmap_alloc */ + xfs_bmalloca_t bma = { 0 }; /* args for xfs_bmap_alloc */ xfs_btree_cur_t *cur; /* bmap btree cursor */ xfs_fileoff_t end; /* end of mapped file region */ int eof; /* we've hit the end of extents */ @@ -4289,7 +4097,7 @@ xfs_bmapi( xfs_extlen_t minlen; /* min allocation size */ xfs_mount_t *mp; /* xfs mount structure */ int n; /* current extent index */ - int nallocs; /* number of extents alloc\'d */ + int nallocs; /* number of extents alloc'd */ xfs_extnum_t nextents; /* number of extents in file */ xfs_fileoff_t obno; /* old block number (offset) */ xfs_bmbt_irec_t prev; /* previous file extent record */ @@ -4381,10 +4189,7 @@ xfs_bmapi( end = bno + len; obno = bno; bma.ip = NULL; - if (delta) { - delta->xed_startoff = NULLFILEOFF; - delta->xed_blockcount = 0; - } + while (bno < end && n < *nmap) { /* * Reading past eof, act as though there's a hole @@ -4394,7 +4199,7 @@ xfs_bmapi( got.br_startoff = end; inhole = eof || got.br_startoff > bno; wasdelay = wr && !inhole && !(flags & XFS_BMAPI_DELAY) && - ISNULLSTARTBLOCK(got.br_startblock); + isnullstartblock(got.br_startblock); /* * First, deal with the hole before the allocated space * that we found, if any. @@ -4405,19 +4210,13 @@ xfs_bmapi( * allocate the stuff asked for in this bmap call * but that wouldn't be as good. */ - if (wasdelay && !(flags & XFS_BMAPI_EXACT)) { + if (wasdelay) { alen = (xfs_extlen_t)got.br_blockcount; aoff = got.br_startoff; if (lastx != NULLEXTNUM && lastx) { ep = xfs_iext_get_ext(ifp, lastx - 1); xfs_bmbt_get_all(ep, &prev); } - } else if (wasdelay) { - alen = (xfs_extlen_t) - XFS_FILBLKS_MIN(len, - (got.br_startoff + - got.br_blockcount) - bno); - aoff = bno; } else { alen = (xfs_extlen_t) XFS_FILBLKS_MIN(len, MAXEXTLEN); @@ -4452,10 +4251,11 @@ xfs_bmapi( * adjusted later. We return if we haven't * allocated blocks already inside this loop. */ - if ((error = XFS_TRANS_RESERVE_QUOTA_NBLKS( - mp, NULL, ip, (long)alen, 0, + error = xfs_trans_reserve_quota_nblks( + NULL, ip, (long)alen, 0, rt ? XFS_QMOPT_RES_RTBLKS : - XFS_QMOPT_RES_REGBLKS))) { + XFS_QMOPT_RES_REGBLKS); + if (error) { if (n == 0) { *nmap = 0; ASSERT(cur == NULL); @@ -4478,13 +4278,13 @@ xfs_bmapi( -((int64_t)extsz), (flags & XFS_BMAPI_RSVBLOCKS)); } else { - error = xfs_mod_incore_sb(mp, + error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -((int64_t)alen), (flags & XFS_BMAPI_RSVBLOCKS)); } if (!error) { - error = xfs_mod_incore_sb(mp, + error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -((int64_t)indlen), (flags & XFS_BMAPI_RSVBLOCKS)); @@ -4494,7 +4294,7 @@ xfs_bmapi( (int64_t)extsz, (flags & XFS_BMAPI_RSVBLOCKS)); else if (error) - xfs_mod_incore_sb(mp, + xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, (int64_t)alen, (flags & XFS_BMAPI_RSVBLOCKS)); @@ -4504,8 +4304,8 @@ xfs_bmapi( if (XFS_IS_QUOTA_ON(mp)) /* unreserve the blocks now */ (void) - XFS_TRANS_UNRESERVE_QUOTA_NBLKS( - mp, NULL, ip, + xfs_trans_unreserve_quota_nblks( + NULL, ip, (long)alen, 0, rt ? XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS); @@ -4513,7 +4313,7 @@ xfs_bmapi( } ip->i_delayed_blks += alen; - abno = NULLSTARTBLOCK(indlen); + abno = nullstartblock(indlen); } else { /* * If first time, allocate and fill in @@ -4615,7 +4415,7 @@ xfs_bmapi( got.br_state = XFS_EXT_UNWRITTEN; } error = xfs_bmap_add_extent(ip, lastx, &cur, &got, - firstblock, flist, &tmp_logflags, delta, + firstblock, flist, &tmp_logflags, whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); logflags |= tmp_logflags; if (error) @@ -4629,8 +4429,8 @@ xfs_bmapi( aoff + alen); #ifdef DEBUG if (flags & XFS_BMAPI_DELAY) { - ASSERT(ISNULLSTARTBLOCK(got.br_startblock)); - ASSERT(STARTBLOCKVAL(got.br_startblock) > 0); + ASSERT(isnullstartblock(got.br_startblock)); + ASSERT(startblockval(got.br_startblock) > 0); } ASSERT(got.br_state == XFS_EXT_NORM || got.br_state == XFS_EXT_UNWRITTEN); @@ -4664,7 +4464,7 @@ xfs_bmapi( ASSERT((bno >= obno) || (n == 0)); ASSERT(bno < end); mval->br_startoff = bno; - if (ISNULLSTARTBLOCK(got.br_startblock)) { + if (isnullstartblock(got.br_startblock)) { ASSERT(!wr || (flags & XFS_BMAPI_DELAY)); mval->br_startblock = DELAYSTARTBLOCK; } else @@ -4686,7 +4486,7 @@ xfs_bmapi( ASSERT(mval->br_blockcount <= len); } else { *mval = got; - if (ISNULLSTARTBLOCK(mval->br_startblock)) { + if (isnullstartblock(mval->br_startblock)) { ASSERT(!wr || (flags & XFS_BMAPI_DELAY)); mval->br_startblock = DELAYSTARTBLOCK; } @@ -4696,8 +4496,12 @@ xfs_bmapi( * Check if writing previously allocated but * unwritten extents. */ - if (wr && mval->br_state == XFS_EXT_UNWRITTEN && - ((flags & (XFS_BMAPI_PREALLOC|XFS_BMAPI_DELAY)) == 0)) { + if (wr && + ((mval->br_state == XFS_EXT_UNWRITTEN && + ((flags & (XFS_BMAPI_PREALLOC|XFS_BMAPI_DELAY)) == 0)) || + (mval->br_state == XFS_EXT_NORM && + ((flags & (XFS_BMAPI_PREALLOC|XFS_BMAPI_CONVERT)) == + (XFS_BMAPI_PREALLOC|XFS_BMAPI_CONVERT))))) { /* * Modify (by adding) the state flag, if writing. */ @@ -4709,9 +4513,11 @@ xfs_bmapi( *firstblock; cur->bc_private.b.flist = flist; } - mval->br_state = XFS_EXT_NORM; + mval->br_state = (mval->br_state == XFS_EXT_UNWRITTEN) + ? XFS_EXT_NORM + : XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx, &cur, mval, - firstblock, flist, &tmp_logflags, delta, + firstblock, flist, &tmp_logflags, whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); logflags |= tmp_logflags; if (error) @@ -4801,25 +4607,17 @@ xfs_bmapi( ASSERT(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE || XFS_IFORK_NEXTENTS(ip, whichfork) > ifp->if_ext_max); error = 0; - if (delta && delta->xed_startoff != NULLFILEOFF) { - /* A change was actually made. - * Note that delta->xed_blockount is an offset at this - * point and needs to be converted to a block count. - */ - ASSERT(delta->xed_blockcount > delta->xed_startoff); - delta->xed_blockcount -= delta->xed_startoff; - } error0: /* * Log everything. Do this after conversion, there's no point in * logging the extent records if we've converted to btree format. */ - if ((logflags & XFS_ILOG_FEXT(whichfork)) && + if ((logflags & xfs_ilog_fext(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS) - logflags &= ~XFS_ILOG_FEXT(whichfork); - else if ((logflags & XFS_ILOG_FBROOT(whichfork)) && + logflags &= ~xfs_ilog_fext(whichfork); + else if ((logflags & xfs_ilog_fbroot(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE) - logflags &= ~XFS_ILOG_FBROOT(whichfork); + logflags &= ~xfs_ilog_fbroot(whichfork); /* * Log whatever the flags say, even if error. Otherwise we might miss * detecting a case where the data is changed, there's an error, @@ -4896,7 +4694,7 @@ xfs_bmapi_single( *fsb = NULLFSBLOCK; return 0; } - ASSERT(!ISNULLSTARTBLOCK(got.br_startblock)); + ASSERT(!isnullstartblock(got.br_startblock)); ASSERT(bno < got.br_startoff + got.br_blockcount); *fsb = got.br_startblock + (bno - got.br_startoff); ifp->if_lastex = lastx; @@ -4920,8 +4718,6 @@ xfs_bunmapi( xfs_fsblock_t *firstblock, /* first allocated block controls a.g. for allocs */ xfs_bmap_free_t *flist, /* i/o: list extents to free */ - xfs_extdelta_t *delta, /* o: change made to incore - extents */ int *done) /* set if not done yet */ { xfs_btree_cur_t *cur; /* bmap btree cursor */ @@ -4946,7 +4742,8 @@ xfs_bunmapi( int rsvd; /* OK to allocate reserved blocks */ xfs_fsblock_t sum; - xfs_bunmap_trace(ip, bno, len, flags, (inst_t *)__return_address); + trace_xfs_bunmap(ip, bno, len, flags, _RET_IP_); + whichfork = (flags & XFS_BMAPI_ATTRFORK) ? XFS_ATTR_FORK : XFS_DATA_FORK; ifp = XFS_IFORK_PTR(ip, whichfork); @@ -4979,10 +4776,7 @@ xfs_bunmapi( bno = start + len - 1; ep = xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, &prev); - if (delta) { - delta->xed_startoff = NULLFILEOFF; - delta->xed_blockcount = 0; - } + /* * Check to see if the given block number is past the end of the * file, back up to the last block if so... @@ -5028,7 +4822,7 @@ xfs_bunmapi( */ ASSERT(ep != NULL); del = got; - wasdel = ISNULLSTARTBLOCK(del.br_startblock); + wasdel = isnullstartblock(del.br_startblock); if (got.br_startoff < start) { del.br_startoff = start; del.br_blockcount -= start - got.br_startoff; @@ -5080,7 +4874,7 @@ xfs_bunmapi( } del.br_state = XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx, &cur, &del, - firstblock, flist, &logflags, delta, + firstblock, flist, &logflags, XFS_DATA_FORK, 0); if (error) goto error0; @@ -5123,7 +4917,7 @@ xfs_bunmapi( xfs_bmbt_get_all(xfs_iext_get_ext(ifp, lastx - 1), &prev); ASSERT(prev.br_state == XFS_EXT_NORM); - ASSERT(!ISNULLSTARTBLOCK(prev.br_startblock)); + ASSERT(!isnullstartblock(prev.br_startblock)); ASSERT(del.br_startblock == prev.br_startblock + prev.br_blockcount); if (prev.br_startoff < start) { @@ -5135,7 +4929,7 @@ xfs_bunmapi( prev.br_state = XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx - 1, &cur, &prev, firstblock, flist, &logflags, - delta, XFS_DATA_FORK, 0); + XFS_DATA_FORK, 0); if (error) goto error0; goto nodelete; @@ -5144,14 +4938,14 @@ xfs_bunmapi( del.br_state = XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx, &cur, &del, firstblock, flist, &logflags, - delta, XFS_DATA_FORK, 0); + XFS_DATA_FORK, 0); if (error) goto error0; goto nodelete; } } if (wasdel) { - ASSERT(STARTBLOCKVAL(del.br_startblock) > 0); + ASSERT(startblockval(del.br_startblock) > 0); /* Update realtime/data freespace, unreserve quota */ if (isrt) { xfs_filblks_t rtexts; @@ -5160,14 +4954,14 @@ xfs_bunmapi( do_div(rtexts, mp->m_sb.sb_rextsize); xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, (int64_t)rtexts, rsvd); - (void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, - NULL, ip, -((long)del.br_blockcount), 0, + (void)xfs_trans_reserve_quota_nblks(NULL, + ip, -((long)del.br_blockcount), 0, XFS_QMOPT_RES_RTBLKS); } else { - xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, + xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, (int64_t)del.br_blockcount, rsvd); - (void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, - NULL, ip, -((long)del.br_blockcount), 0, + (void)xfs_trans_reserve_quota_nblks(NULL, + ip, -((long)del.br_blockcount), 0, XFS_QMOPT_RES_REGBLKS); } ip->i_delayed_blks -= del.br_blockcount; @@ -5197,7 +4991,7 @@ xfs_bunmapi( goto error0; } error = xfs_bmap_del_extent(ip, tp, lastx, flist, cur, &del, - &tmp_logflags, delta, whichfork, rsvd); + &tmp_logflags, whichfork, rsvd); logflags |= tmp_logflags; if (error) goto error0; @@ -5254,25 +5048,17 @@ nodelete: ASSERT(ifp->if_ext_max == XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); error = 0; - if (delta && delta->xed_startoff != NULLFILEOFF) { - /* A change was actually made. - * Note that delta->xed_blockount is an offset at this - * point and needs to be converted to a block count. - */ - ASSERT(delta->xed_blockcount > delta->xed_startoff); - delta->xed_blockcount -= delta->xed_startoff; - } error0: /* * Log everything. Do this after conversion, there's no point in * logging the extent records if we've converted to btree format. */ - if ((logflags & XFS_ILOG_FEXT(whichfork)) && + if ((logflags & xfs_ilog_fext(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS) - logflags &= ~XFS_ILOG_FEXT(whichfork); - else if ((logflags & XFS_ILOG_FBROOT(whichfork)) && + logflags &= ~xfs_ilog_fext(whichfork); + else if ((logflags & xfs_ilog_fbroot(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE) - logflags &= ~XFS_ILOG_FBROOT(whichfork); + logflags &= ~xfs_ilog_fbroot(whichfork); /* * Log inode even in the error case, if the transaction * is dirty we'll need to shut down the filesystem. @@ -5330,7 +5116,202 @@ xfs_bmap_isaeof( */ *aeof = (off >= s.br_startoff && off < s.br_startoff + s.br_blockcount && - ISNULLSTARTBLOCK(s.br_startblock)) || + isnullstartblock(s.br_startblock)) || off >= s.br_startoff + s.br_blockcount; return 0; } + +/* + * Check if the endoff is outside the last extent. If so the caller will grow + * the allocation to a stripe unit boundary. + */ +int /* error */ +xfs_bmap_eof( + xfs_inode_t *ip, /* incore inode pointer */ + xfs_fileoff_t endoff, /* file offset in fsblocks */ + int whichfork, /* data or attribute fork */ + int *eof) /* result value */ +{ + xfs_fsblock_t blockcount; /* extent block count */ + int error; /* error return value */ + xfs_ifork_t *ifp; /* inode fork pointer */ + xfs_bmbt_rec_host_t *lastrec; /* extent record pointer */ + xfs_extnum_t nextents; /* number of file extents */ + xfs_fileoff_t startoff; /* extent starting file offset */ + + ASSERT(whichfork == XFS_DATA_FORK); + ifp = XFS_IFORK_PTR(ip, whichfork); + if (!(ifp->if_flags & XFS_IFEXTENTS) && + (error = xfs_iread_extents(NULL, ip, whichfork))) + return error; + nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + if (nextents == 0) { + *eof = 1; + return 0; + } + /* + * Go to the last extent + */ + lastrec = xfs_iext_get_ext(ifp, nextents - 1); + startoff = xfs_bmbt_get_startoff(lastrec); + blockcount = xfs_bmbt_get_blockcount(lastrec); + *eof = endoff >= startoff + blockcount; + return 0; +} + +/* + * Count fsblocks of the given fork. + */ +int /* error */ +xfs_bmap_count_blocks( + xfs_trans_t *tp, /* transaction pointer */ + xfs_inode_t *ip, /* incore inode */ + int whichfork, /* data or attr fork */ + int *count) /* out: count of blocks */ +{ + struct xfs_btree_block *block; /* current btree block */ + xfs_fsblock_t bno; /* block # of "block" */ + xfs_ifork_t *ifp; /* fork structure */ + int level; /* btree level, for checking */ + xfs_mount_t *mp; /* file system mount structure */ + __be64 *pp; /* pointer to block address */ + + bno = NULLFSBLOCK; + mp = ip->i_mount; + ifp = XFS_IFORK_PTR(ip, whichfork); + if ( XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS ) { + xfs_bmap_count_leaves(ifp, 0, + ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t), + count); + return 0; + } + + /* + * Root level must use BMAP_BROOT_PTR_ADDR macro to get ptr out. + */ + block = ifp->if_broot; + level = be16_to_cpu(block->bb_level); + ASSERT(level > 0); + pp = XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes); + bno = be64_to_cpu(*pp); + ASSERT(bno != NULLDFSBNO); + ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount); + ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks); + + if (unlikely(xfs_bmap_count_tree(mp, tp, ifp, bno, level, count) < 0)) { + XFS_ERROR_REPORT("xfs_bmap_count_blocks(2)", XFS_ERRLEVEL_LOW, + mp); + return XFS_ERROR(EFSCORRUPTED); + } + + return 0; +} + +/* + * Recursively walks each level of a btree + * to count total fsblocks is use. + */ +STATIC int /* error */ +xfs_bmap_count_tree( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_fsblock_t blockno, /* file system block number */ + int levelin, /* level in btree */ + int *count) /* Count of blocks */ +{ + int error; + xfs_buf_t *bp, *nbp; + int level = levelin; + __be64 *pp; + xfs_fsblock_t bno = blockno; + xfs_fsblock_t nextbno; + struct xfs_btree_block *block, *nextblock; + int numrecs; + + if ((error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, XFS_BMAP_BTREE_REF))) + return error; + *count += 1; + block = XFS_BUF_TO_BLOCK(bp); + + if (--level) { + /* Not at node above leaves, count this level of nodes */ + nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib); + while (nextbno != NULLFSBLOCK) { + if ((error = xfs_btree_read_bufl(mp, tp, nextbno, + 0, &nbp, XFS_BMAP_BTREE_REF))) + return error; + *count += 1; + nextblock = XFS_BUF_TO_BLOCK(nbp); + nextbno = be64_to_cpu(nextblock->bb_u.l.bb_rightsib); + xfs_trans_brelse(tp, nbp); + } + + /* Dive to the next level */ + pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); + bno = be64_to_cpu(*pp); + if (unlikely((error = + xfs_bmap_count_tree(mp, tp, ifp, bno, level, count)) < 0)) { + xfs_trans_brelse(tp, bp); + XFS_ERROR_REPORT("xfs_bmap_count_tree(1)", + XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + xfs_trans_brelse(tp, bp); + } else { + /* count all level 1 nodes and their leaves */ + for (;;) { + nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib); + numrecs = be16_to_cpu(block->bb_numrecs); + xfs_bmap_disk_count_leaves(mp, block, numrecs, count); + xfs_trans_brelse(tp, bp); + if (nextbno == NULLFSBLOCK) + break; + bno = nextbno; + if ((error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, + XFS_BMAP_BTREE_REF))) + return error; + *count += 1; + block = XFS_BUF_TO_BLOCK(bp); + } + } + return 0; +} + +/* + * Count leaf blocks given a range of extent records. + */ +STATIC void +xfs_bmap_count_leaves( + xfs_ifork_t *ifp, + xfs_extnum_t idx, + int numrecs, + int *count) +{ + int b; + + for (b = 0; b < numrecs; b++) { + xfs_bmbt_rec_host_t *frp = xfs_iext_get_ext(ifp, idx + b); + *count += xfs_bmbt_get_blockcount(frp); + } +} + +/* + * Count leaf blocks given a range of extent records originally + * in btree format. + */ +STATIC void +xfs_bmap_disk_count_leaves( + struct xfs_mount *mp, + struct xfs_btree_block *block, + int numrecs, + int *count) +{ + int b; + xfs_bmbt_rec_t *frp; + + for (b = 1; b <= numrecs; b++) { + frp = XFS_BMBT_REC_ADDR(mp, block, b); + *count += xfs_bmbt_disk_get_blockcount(frp); + } +} diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index a7a0805..ff51fdd 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -71,8 +71,7 @@ xfs_bmdr_to_bmbt( * This code must be in sync with the routines xfs_bmbt_get_startoff, * xfs_bmbt_get_startblock, xfs_bmbt_get_blockcount and xfs_bmbt_get_state. */ - -STATIC_INLINE void +STATIC void __xfs_bmbt_get_all( __uint64_t l0, __uint64_t l1, @@ -83,25 +82,25 @@ __xfs_bmbt_get_all( ext_flag = (int)(l0 >> (64 - BMBT_EXNTFLAG_BITLEN)); s->br_startoff = ((xfs_fileoff_t)l0 & - XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; + xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; #if XFS_BIG_BLKNOS - s->br_startblock = (((xfs_fsblock_t)l0 & XFS_MASK64LO(9)) << 43) | + s->br_startblock = (((xfs_fsblock_t)l0 & xfs_mask64lo(9)) << 43) | (((xfs_fsblock_t)l1) >> 21); #else #ifdef DEBUG { xfs_dfsbno_t b; - b = (((xfs_dfsbno_t)l0 & XFS_MASK64LO(9)) << 43) | + b = (((xfs_dfsbno_t)l0 & xfs_mask64lo(9)) << 43) | (((xfs_dfsbno_t)l1) >> 21); - ASSERT((b >> 32) == 0 || ISNULLDSTARTBLOCK(b)); + ASSERT((b >> 32) == 0 || isnulldstartblock(b)); s->br_startblock = (xfs_fsblock_t)b; } #else /* !DEBUG */ s->br_startblock = (xfs_fsblock_t)(((xfs_dfsbno_t)l1) >> 21); #endif /* DEBUG */ #endif /* XFS_BIG_BLKNOS */ - s->br_blockcount = (xfs_filblks_t)(l1 & XFS_MASK64LO(21)); + s->br_blockcount = (xfs_filblks_t)(l1 & xfs_mask64lo(21)); /* This is xfs_extent_state() in-line */ if (ext_flag) { ASSERT(s->br_blockcount != 0); /* saved for DMIG */ @@ -126,7 +125,7 @@ xfs_filblks_t xfs_bmbt_get_blockcount( xfs_bmbt_rec_host_t *r) { - return (xfs_filblks_t)(r->l1 & XFS_MASK64LO(21)); + return (xfs_filblks_t)(r->l1 & xfs_mask64lo(21)); } /* @@ -137,15 +136,15 @@ xfs_bmbt_get_startblock( xfs_bmbt_rec_host_t *r) { #if XFS_BIG_BLKNOS - return (((xfs_fsblock_t)r->l0 & XFS_MASK64LO(9)) << 43) | + return (((xfs_fsblock_t)r->l0 & xfs_mask64lo(9)) << 43) | (((xfs_fsblock_t)r->l1) >> 21); #else #ifdef DEBUG xfs_dfsbno_t b; - b = (((xfs_dfsbno_t)r->l0 & XFS_MASK64LO(9)) << 43) | + b = (((xfs_dfsbno_t)r->l0 & xfs_mask64lo(9)) << 43) | (((xfs_dfsbno_t)r->l1) >> 21); - ASSERT((b >> 32) == 0 || ISNULLDSTARTBLOCK(b)); + ASSERT((b >> 32) == 0 || isnulldstartblock(b)); return (xfs_fsblock_t)b; #else /* !DEBUG */ return (xfs_fsblock_t)(((xfs_dfsbno_t)r->l1) >> 21); @@ -161,7 +160,7 @@ xfs_bmbt_get_startoff( xfs_bmbt_rec_host_t *r) { return ((xfs_fileoff_t)r->l0 & - XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; + xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; } xfs_exntst_t @@ -175,16 +174,6 @@ xfs_bmbt_get_state( ext_flag); } -/* Endian flipping versions of the bmbt extraction functions */ -void -xfs_bmbt_disk_get_all( - xfs_bmbt_rec_t *r, - xfs_bmbt_irec_t *s) -{ - __xfs_bmbt_get_all(get_unaligned_be64(&r->l0), - get_unaligned_be64(&r->l1), s); -} - /* * Extract the blockcount field from an on disk bmap extent record. */ @@ -192,7 +181,7 @@ xfs_filblks_t xfs_bmbt_disk_get_blockcount( xfs_bmbt_rec_t *r) { - return (xfs_filblks_t)(be64_to_cpu(r->l1) & XFS_MASK64LO(21)); + return (xfs_filblks_t)(be64_to_cpu(r->l1) & xfs_mask64lo(21)); } /* @@ -203,7 +192,7 @@ xfs_bmbt_disk_get_startoff( xfs_bmbt_rec_t *r) { return ((xfs_fileoff_t)be64_to_cpu(r->l0) & - XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; + xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; } @@ -221,33 +210,33 @@ xfs_bmbt_set_allf( int extent_flag = (state == XFS_EXT_NORM) ? 0 : 1; ASSERT(state == XFS_EXT_NORM || state == XFS_EXT_UNWRITTEN); - ASSERT((startoff & XFS_MASK64HI(64-BMBT_STARTOFF_BITLEN)) == 0); - ASSERT((blockcount & XFS_MASK64HI(64-BMBT_BLOCKCOUNT_BITLEN)) == 0); + ASSERT((startoff & xfs_mask64hi(64-BMBT_STARTOFF_BITLEN)) == 0); + ASSERT((blockcount & xfs_mask64hi(64-BMBT_BLOCKCOUNT_BITLEN)) == 0); #if XFS_BIG_BLKNOS - ASSERT((startblock & XFS_MASK64HI(64-BMBT_STARTBLOCK_BITLEN)) == 0); + ASSERT((startblock & xfs_mask64hi(64-BMBT_STARTBLOCK_BITLEN)) == 0); r->l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)startoff << 9) | ((xfs_bmbt_rec_base_t)startblock >> 43); r->l1 = ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); #else /* !XFS_BIG_BLKNOS */ - if (ISNULLSTARTBLOCK(startblock)) { + if (isnullstartblock(startblock)) { r->l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)startoff << 9) | - (xfs_bmbt_rec_base_t)XFS_MASK64LO(9); - r->l1 = XFS_MASK64HI(11) | + (xfs_bmbt_rec_base_t)xfs_mask64lo(9); + r->l1 = xfs_mask64hi(11) | ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); } else { r->l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)startoff << 9); r->l1 = ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); } #endif /* XFS_BIG_BLKNOS */ } @@ -279,11 +268,11 @@ xfs_bmbt_disk_set_allf( int extent_flag = (state == XFS_EXT_NORM) ? 0 : 1; ASSERT(state == XFS_EXT_NORM || state == XFS_EXT_UNWRITTEN); - ASSERT((startoff & XFS_MASK64HI(64-BMBT_STARTOFF_BITLEN)) == 0); - ASSERT((blockcount & XFS_MASK64HI(64-BMBT_BLOCKCOUNT_BITLEN)) == 0); + ASSERT((startoff & xfs_mask64hi(64-BMBT_STARTOFF_BITLEN)) == 0); + ASSERT((blockcount & xfs_mask64hi(64-BMBT_BLOCKCOUNT_BITLEN)) == 0); #if XFS_BIG_BLKNOS - ASSERT((startblock & XFS_MASK64HI(64-BMBT_STARTBLOCK_BITLEN)) == 0); + ASSERT((startblock & xfs_mask64hi(64-BMBT_STARTBLOCK_BITLEN)) == 0); r->l0 = cpu_to_be64( ((xfs_bmbt_rec_base_t)extent_flag << 63) | @@ -292,17 +281,17 @@ xfs_bmbt_disk_set_allf( r->l1 = cpu_to_be64( ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21))); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21))); #else /* !XFS_BIG_BLKNOS */ - if (ISNULLSTARTBLOCK(startblock)) { + if (isnullstartblock(startblock)) { r->l0 = cpu_to_be64( ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)startoff << 9) | - (xfs_bmbt_rec_base_t)XFS_MASK64LO(9)); - r->l1 = cpu_to_be64(XFS_MASK64HI(11) | + (xfs_bmbt_rec_base_t)xfs_mask64lo(9)); + r->l1 = cpu_to_be64(xfs_mask64hi(11) | ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21))); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21))); } else { r->l0 = cpu_to_be64( ((xfs_bmbt_rec_base_t)extent_flag << 63) | @@ -310,7 +299,7 @@ xfs_bmbt_disk_set_allf( r->l1 = cpu_to_be64( ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21))); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21))); } #endif /* XFS_BIG_BLKNOS */ } @@ -318,7 +307,7 @@ xfs_bmbt_disk_set_allf( /* * Set all the fields in a bmap extent record from the uncompressed form. */ -void +STATIC void xfs_bmbt_disk_set_all( xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s) @@ -335,9 +324,9 @@ xfs_bmbt_set_blockcount( xfs_bmbt_rec_host_t *r, xfs_filblks_t v) { - ASSERT((v & XFS_MASK64HI(43)) == 0); - r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)XFS_MASK64HI(43)) | - (xfs_bmbt_rec_base_t)(v & XFS_MASK64LO(21)); + ASSERT((v & xfs_mask64hi(43)) == 0); + r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64hi(43)) | + (xfs_bmbt_rec_base_t)(v & xfs_mask64lo(21)); } /* @@ -349,21 +338,21 @@ xfs_bmbt_set_startblock( xfs_fsblock_t v) { #if XFS_BIG_BLKNOS - ASSERT((v & XFS_MASK64HI(12)) == 0); - r->l0 = (r->l0 & (xfs_bmbt_rec_base_t)XFS_MASK64HI(55)) | + ASSERT((v & xfs_mask64hi(12)) == 0); + r->l0 = (r->l0 & (xfs_bmbt_rec_base_t)xfs_mask64hi(55)) | (xfs_bmbt_rec_base_t)(v >> 43); - r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)) | + r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64lo(21)) | (xfs_bmbt_rec_base_t)(v << 21); #else /* !XFS_BIG_BLKNOS */ - if (ISNULLSTARTBLOCK(v)) { - r->l0 |= (xfs_bmbt_rec_base_t)XFS_MASK64LO(9); - r->l1 = (xfs_bmbt_rec_base_t)XFS_MASK64HI(11) | + if (isnullstartblock(v)) { + r->l0 |= (xfs_bmbt_rec_base_t)xfs_mask64lo(9); + r->l1 = (xfs_bmbt_rec_base_t)xfs_mask64hi(11) | ((xfs_bmbt_rec_base_t)v << 21) | - (r->l1 & (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); } else { - r->l0 &= ~(xfs_bmbt_rec_base_t)XFS_MASK64LO(9); + r->l0 &= ~(xfs_bmbt_rec_base_t)xfs_mask64lo(9); r->l1 = ((xfs_bmbt_rec_base_t)v << 21) | - (r->l1 & (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); } #endif /* XFS_BIG_BLKNOS */ } @@ -376,10 +365,10 @@ xfs_bmbt_set_startoff( xfs_bmbt_rec_host_t *r, xfs_fileoff_t v) { - ASSERT((v & XFS_MASK64HI(9)) == 0); - r->l0 = (r->l0 & (xfs_bmbt_rec_base_t) XFS_MASK64HI(1)) | + ASSERT((v & xfs_mask64hi(9)) == 0); + r->l0 = (r->l0 & (xfs_bmbt_rec_base_t) xfs_mask64hi(1)) | ((xfs_bmbt_rec_base_t)v << 9) | - (r->l0 & (xfs_bmbt_rec_base_t)XFS_MASK64LO(9)); + (r->l0 & (xfs_bmbt_rec_base_t)xfs_mask64lo(9)); } /* @@ -392,9 +381,9 @@ xfs_bmbt_set_state( { ASSERT(v == XFS_EXT_NORM || v == XFS_EXT_UNWRITTEN); if (v == XFS_EXT_NORM) - r->l0 &= XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN); + r->l0 &= xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN); else - r->l0 |= XFS_MASK64HI(BMBT_EXNTFLAG_BITLEN); + r->l0 |= xfs_mask64hi(BMBT_EXNTFLAG_BITLEN); } /* @@ -563,7 +552,7 @@ xfs_bmbt_alloc_block( cur->bc_private.b.allocated++; cur->bc_private.b.ip->i_d.di_nblocks++; xfs_trans_log_inode(args.tp, cur->bc_private.b.ip, XFS_ILOG_CORE); - XFS_TRANS_MOD_DQUOT_BYINO(args.mp, args.tp, cur->bc_private.b.ip, + xfs_trans_mod_dquot_byino(args.tp, cur->bc_private.b.ip, XFS_TRANS_DQ_BCOUNT, 1L); new->l = cpu_to_be64(args.fsbno); @@ -591,7 +580,7 @@ xfs_bmbt_free_block( ip->i_d.di_nblocks--; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); xfs_trans_binval(tp, bp); return 0; } @@ -752,12 +741,6 @@ xfs_bmbt_trace_enter( (void *)a0, (void *)a1, (void *)a2, (void *)a3, (void *)a4, (void *)a5, (void *)a6, (void *)a7, (void *)a8, (void *)a9, (void *)a10); - ktrace_enter(ip->i_btrace, - (void *)((__psint_t)type | (whichfork << 8) | (line << 16)), - (void *)func, (void *)s, (void *)ip, (void *)cur, - (void *)a0, (void *)a1, (void *)a2, (void *)a3, - (void *)a4, (void *)a5, (void *)a6, (void *)a7, - (void *)a8, (void *)a9, (void *)a10); } STATIC void @@ -806,6 +789,16 @@ xfs_bmbt_trace_record( } #endif /* XFS_BTREE_TRACE */ +/* Endian flipping versions of the bmbt extraction functions */ +void +xfs_bmbt_disk_get_all( + xfs_bmbt_rec_t *r, + xfs_bmbt_irec_t *s) +{ + __xfs_bmbt_get_all(get_unaligned_be64(&r->l0), + get_unaligned_be64(&r->l1), s); +} + static const struct xfs_btree_ops xfs_bmbt_ops = { .rec_len = sizeof(xfs_bmbt_rec_t), .key_len = sizeof(xfs_bmbt_key_t), diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 83c2114..02854db 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -59,7 +59,7 @@ xfs_btree_check_lblock( XFS_ERRTAG_BTREE_CHECK_LBLOCK, XFS_RANDOM_BTREE_CHECK_LBLOCK))) { if (bp) - xfs_buftrace("LBTREE ERROR", bp); + trace_xfs_btree_corrupt(bp, _RET_IP_); XFS_ERROR_REPORT("xfs_btree_check_lblock", XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); @@ -97,9 +97,9 @@ xfs_btree_check_sblock( XFS_ERRTAG_BTREE_CHECK_SBLOCK, XFS_RANDOM_BTREE_CHECK_SBLOCK))) { if (bp) - xfs_buftrace("SBTREE ERROR", bp); - XFS_ERROR_REPORT("xfs_btree_check_sblock", XFS_ERRLEVEL_LOW, - cur->bc_mp); + trace_xfs_btree_corrupt(bp, _RET_IP_); + XFS_CORRUPTION_ERROR("xfs_btree_check_sblock", + XFS_ERRLEVEL_LOW, cur->bc_mp, block); return XFS_ERROR(EFSCORRUPTED); } return 0; @@ -199,7 +199,7 @@ xfs_btree_del_cursor( */ for (i = 0; i < cur->bc_nlevels; i++) { if (cur->bc_bufs[i]) - xfs_btree_setbuf(cur, i, NULL); + xfs_trans_brelse(cur->bc_tp, cur->bc_bufs[i]); else if (!error) break; } @@ -670,8 +670,8 @@ xfs_btree_readahead_lblock( struct xfs_btree_block *block) { int rval = 0; - xfs_fsblock_t left = be64_to_cpu(block->bb_u.l.bb_leftsib); - xfs_fsblock_t right = be64_to_cpu(block->bb_u.l.bb_rightsib); + xfs_dfsbno_t left = be64_to_cpu(block->bb_u.l.bb_leftsib); + xfs_dfsbno_t right = be64_to_cpu(block->bb_u.l.bb_rightsib); if ((lr & XFS_BTCUR_LEFTRA) && left != NULLDFSBNO) { xfs_btree_reada_bufl(cur->bc_mp, left, 1); @@ -747,22 +747,19 @@ xfs_btree_readahead( * Set the buffer for level "lev" in the cursor to bp, releasing * any previous buffer. */ -void +STATIC void xfs_btree_setbuf( xfs_btree_cur_t *cur, /* btree cursor */ int lev, /* level in btree */ xfs_buf_t *bp) /* new buffer to set */ { struct xfs_btree_block *b; /* btree block */ - xfs_buf_t *obp; /* old buffer pointer */ - obp = cur->bc_bufs[lev]; - if (obp) - xfs_trans_brelse(cur->bc_tp, obp); + if (cur->bc_bufs[lev]) + xfs_trans_brelse(cur->bc_tp, cur->bc_bufs[lev]); cur->bc_bufs[lev] = bp; cur->bc_ra[lev] = 0; - if (!bp) - return; + b = XFS_BUF_TO_BLOCK(bp); if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { if (be64_to_cpu(b->bb_u.l.bb_leftsib) == NULLDFSBNO) @@ -783,7 +780,7 @@ xfs_btree_ptr_is_null( union xfs_btree_ptr *ptr) { if (cur->bc_flags & XFS_BTREE_LONG_PTRS) - return be64_to_cpu(ptr->l) == NULLFSBLOCK; + return be64_to_cpu(ptr->l) == NULLDFSBNO; else return be32_to_cpu(ptr->s) == NULLAGBLOCK; } @@ -794,7 +791,7 @@ xfs_btree_set_ptr_null( union xfs_btree_ptr *ptr) { if (cur->bc_flags & XFS_BTREE_LONG_PTRS) - ptr->l = cpu_to_be64(NULLFSBLOCK); + ptr->l = cpu_to_be64(NULLDFSBNO); else ptr->s = cpu_to_be32(NULLAGBLOCK); } @@ -858,8 +855,8 @@ xfs_btree_init_block( new->bb_numrecs = cpu_to_be16(numrecs); if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { - new->bb_u.l.bb_leftsib = cpu_to_be64(NULLFSBLOCK); - new->bb_u.l.bb_rightsib = cpu_to_be64(NULLFSBLOCK); + new->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); + new->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); } else { new->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK); new->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); @@ -900,7 +897,7 @@ xfs_btree_buf_to_ptr( ptr->l = cpu_to_be64(XFS_DADDR_TO_FSB(cur->bc_mp, XFS_BUF_ADDR(bp))); else { - ptr->s = cpu_to_be32(XFS_DADDR_TO_AGBNO(cur->bc_mp, + ptr->s = cpu_to_be32(xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp))); } } @@ -911,7 +908,7 @@ xfs_btree_ptr_to_daddr( union xfs_btree_ptr *ptr) { if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { - ASSERT(be64_to_cpu(ptr->l) != NULLFSBLOCK); + ASSERT(be64_to_cpu(ptr->l) != NULLDFSBNO); return XFS_FSB_TO_DADDR(cur->bc_mp, be64_to_cpu(ptr->l)); } else { @@ -931,13 +928,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); @@ -956,7 +953,7 @@ xfs_btree_get_buf_block( xfs_daddr_t d; /* need to sort out how callers deal with failures first */ - ASSERT(!(flags & XFS_BUF_TRYLOCK)); + ASSERT(!(flags & XBF_TRYLOCK)); d = xfs_btree_ptr_to_daddr(cur, ptr); *bpp = xfs_trans_get_buf(cur->bc_tp, mp->m_ddev_targp, d, @@ -987,7 +984,7 @@ xfs_btree_read_buf_block( int error; /* need to sort out how callers deal with failures first */ - ASSERT(!(flags & XFS_BUF_TRYLOCK)); + ASSERT(!(flags & XBF_TRYLOCK)); d = xfs_btree_ptr_to_daddr(cur, ptr); error = xfs_trans_read_buf(mp, cur->bc_tp, mp->m_ddev_targp, d, @@ -1823,7 +1820,7 @@ xfs_btree_lshift( /* * We add one entry to the left side and remove one for the right side. - * Accout for it here, the changes will be updated on disk and logged + * Account for it here, the changes will be updated on disk and logged * later. */ lrecs++; @@ -2394,7 +2391,7 @@ xfs_btree_new_iroot( xfs_btree_log_ptrs(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs)); *logflags |= - XFS_ILOG_CORE | XFS_ILOG_FBROOT(cur->bc_private.b.whichfork); + XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork); *stat = 1; XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); return 0; @@ -2891,7 +2888,7 @@ error0: * inode we have to copy the single block it was pointing to into the * inode. */ -int +STATIC int xfs_btree_kill_iroot( struct xfs_btree_cur *cur) { @@ -2988,13 +2985,50 @@ xfs_btree_kill_iroot( cur->bc_bufs[level - 1] = NULL; be16_add_cpu(&block->bb_level, -1); xfs_trans_log_inode(cur->bc_tp, ip, - XFS_ILOG_CORE | XFS_ILOG_FBROOT(cur->bc_private.b.whichfork)); + XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork)); cur->bc_nlevels--; out0: XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); return 0; } +/* + * Kill the current root node, and replace it with it's only child node. + */ +STATIC int +xfs_btree_kill_root( + struct xfs_btree_cur *cur, + struct xfs_buf *bp, + int level, + union xfs_btree_ptr *newroot) +{ + int error; + + XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); + XFS_BTREE_STATS_INC(cur, killroot); + + /* + * Update the root pointer, decreasing the level by 1 and then + * free the old root. + */ + cur->bc_ops->set_root(cur, newroot, -1); + + error = cur->bc_ops->free_block(cur, bp); + if (error) { + XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); + return error; + } + + XFS_BTREE_STATS_INC(cur, free); + + cur->bc_bufs[level] = NULL; + cur->bc_ra[level] = 0; + cur->bc_nlevels--; + + XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); + return 0; +} + STATIC int xfs_btree_dec_cursor( struct xfs_btree_cur *cur, @@ -3179,7 +3213,7 @@ xfs_btree_delrec( * Make it the new root of the btree. */ pp = xfs_btree_ptr_addr(cur, 1, block); - error = cur->bc_ops->kill_root(cur, bp, level, pp); + error = xfs_btree_kill_root(cur, bp, level, pp); if (error) goto error0; } else if (level > 0) { @@ -3475,7 +3509,7 @@ xfs_btree_delrec( XFS_BTREE_STATS_INC(cur, join); /* - * Fix up the the number of records and right block pointer in the + * Fix up the number of records and right block pointer in the * surviving block, and log it. */ xfs_btree_set_numrecs(left, lrecs + rrecs); diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index 40b52a4..3eb34d6 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -24,8 +24,6 @@ * Routines to implement directories as Btrees of hashed names. */ -static int xfs_error_level; - /*======================================================================== * Function prototypes for the kernel. *========================================================================*/ @@ -553,16 +551,14 @@ xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, xfs_da_intnode_t *node; xfs_da_node_entry_t *btree; int tmp; - xfs_mount_t *mp; node = oldblk->bp->data; - mp = state->mp; ASSERT(be16_to_cpu(node->hdr.info.magic) == XFS_DA_NODE_MAGIC); ASSERT((oldblk->index >= 0) && (oldblk->index <= be16_to_cpu(node->hdr.count))); ASSERT(newblk->blkno != 0); if (state->args->whichfork == XFS_DATA_FORK) - ASSERT(newblk->blkno >= mp->m_dirleafblk && - newblk->blkno < mp->m_dirfreeblk); + ASSERT(newblk->blkno >= state->mp->m_dirleafblk && + newblk->blkno < state->mp->m_dirfreeblk); /* * We may need to make some room before we insert the new node. @@ -1476,7 +1472,7 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, * This is implemented with some source-level loop unrolling. */ xfs_dahash_t -xfs_da_hashname(const uchar_t *name, int namelen) +xfs_da_hashname(const __uint8_t *name, int namelen) { xfs_dahash_t hash; @@ -1506,8 +1502,8 @@ xfs_da_hashname(const uchar_t *name, int namelen) enum xfs_dacmp xfs_da_compname( struct xfs_da_args *args, - const char *name, - int len) + const unsigned char *name, + int len) { return (args->namelen == len && memcmp(args->name, name, len) == 0) ? XFS_CMP_EXACT : XFS_CMP_DIFFERENT; @@ -1539,11 +1535,14 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) int nmap, error, w, count, c, got, i, mapi; xfs_trans_t *tp; xfs_mount_t *mp; + xfs_drfsbno_t nblks; dp = args->dp; mp = dp->i_mount; w = args->whichfork; tp = args->trans; + nblks = dp->i_d.di_nblocks; + /* * For new directories adjust the file offset and block count. */ @@ -1567,10 +1566,10 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) nmap = 1; ASSERT(args->firstblock != NULL); if ((error = xfs_bmapi(tp, dp, bno, count, - XFS_BMAPI_AFLAG(w)|XFS_BMAPI_WRITE|XFS_BMAPI_METADATA| + xfs_bmapi_aflag(w)|XFS_BMAPI_WRITE|XFS_BMAPI_METADATA| XFS_BMAPI_CONTIG, args->firstblock, args->total, &map, &nmap, - args->flist, NULL))) { + args->flist))) { return error; } ASSERT(nmap <= 1); @@ -1588,11 +1587,10 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) nmap = MIN(XFS_BMAP_MAX_NMAP, count); c = (int)(bno + count - b); if ((error = xfs_bmapi(tp, dp, b, c, - XFS_BMAPI_AFLAG(w)|XFS_BMAPI_WRITE| + xfs_bmapi_aflag(w)|XFS_BMAPI_WRITE| XFS_BMAPI_METADATA, args->firstblock, args->total, - &mapp[mapi], &nmap, args->flist, - NULL))) { + &mapp[mapi], &nmap, args->flist))) { kmem_free(mapp); return error; } @@ -1620,6 +1618,8 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) } if (mapp != &map) kmem_free(mapp); + /* account for newly allocated blocks in reserved blocks total */ + args->total -= dp->i_d.di_nblocks - nblks; *new_blkno = (xfs_dablk_t)bno; return 0; } @@ -1850,8 +1850,8 @@ xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, * the last block to the place we want to kill. */ if ((error = xfs_bunmapi(tp, dp, dead_blkno, count, - XFS_BMAPI_AFLAG(w)|XFS_BMAPI_METADATA, - 0, args->firstblock, args->flist, NULL, + xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA, + 0, args->firstblock, args->flist, &done)) == ENOSPC) { if (w != XFS_DATA_FORK) break; @@ -1896,8 +1896,6 @@ xfs_da_map_covers_blocks( /* * Make a dabuf. * Used for get_buf, read_buf, read_bufr, and reada_buf. - * - * Note: this requires user-space public scope for libxfs_da_read_bufr */ int xfs_da_do_buf( @@ -1957,8 +1955,8 @@ xfs_da_do_buf( if ((error = xfs_bmapi(trans, dp, (xfs_fileoff_t)bno, nfsb, XFS_BMAPI_METADATA | - XFS_BMAPI_AFLAG(whichfork), - NULL, 0, mapp, &nmap, NULL, NULL))) + xfs_bmapi_aflag(whichfork), + NULL, 0, mapp, &nmap, NULL))) goto exit0; } } else { @@ -2019,7 +2017,7 @@ xfs_da_do_buf( mappedbno, nmapped, 0, &bp); break; case 3: - xfs_baread(mp->m_ddev_targp, mappedbno, nmapped); + xfs_buf_readahead(mp->m_ddev_targp, mappedbno, nmapped); error = 0; bp = NULL; break; @@ -2077,7 +2075,7 @@ xfs_da_do_buf( (be32_to_cpu(free->hdr.magic) != XFS_DIR2_FREE_MAGIC), mp, XFS_ERRTAG_DA_READ_BUF, XFS_RANDOM_DA_READ_BUF))) { - xfs_buftrace("DA READ ERROR", rbp->bps[0]); + trace_xfs_da_btree_corrupt(rbp->bps[0], _RET_IP_); XFS_CORRUPTION_ERROR("xfs_da_do_buf(2)", XFS_ERRLEVEL_LOW, mp, info); error = XFS_ERROR(EFSCORRUPTED); @@ -2171,7 +2169,7 @@ kmem_zone_t *xfs_dabuf_zone; /* dabuf zone */ xfs_da_state_t * xfs_da_state_alloc(void) { - return kmem_zone_zalloc(xfs_da_state_zone, KM_SLEEP); + return kmem_zone_zalloc(xfs_da_state_zone, KM_NOFS); } /* @@ -2231,9 +2229,9 @@ xfs_da_buf_make(int nbuf, xfs_buf_t **bps, inst_t *ra) int off; if (nbuf == 1) - dabuf = kmem_zone_alloc(xfs_dabuf_zone, KM_SLEEP); + dabuf = kmem_zone_alloc(xfs_dabuf_zone, KM_NOFS); else - dabuf = kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_SLEEP); + dabuf = kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_NOFS); dabuf->dirty = 0; #ifdef XFS_DABUF_DEBUG dabuf->ra = ra; diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c index 71134f8..d475118 100644 --- a/libxfs/xfs_dir2.c +++ b/libxfs/xfs_dir2.c @@ -18,9 +18,7 @@ #include -struct xfs_name xfs_name_dotdot = {"..", 2}; - -extern const struct xfs_nameops xfs_default_nameops; +struct xfs_name xfs_name_dotdot = { (unsigned char *)"..", 2}; /* * ASCII case-insensitive (ie. A-Z) support for directories that was @@ -42,8 +40,8 @@ xfs_ascii_ci_hashname( STATIC enum xfs_dacmp xfs_ascii_ci_compname( struct xfs_da_args *args, - const char *name, - int len) + const unsigned char *name, + int len) { enum xfs_dacmp result; int i; @@ -223,7 +221,7 @@ xfs_dir_createname( int xfs_dir_cilookup_result( struct xfs_da_args *args, - const char *name, + const unsigned char *name, int len) { if (args->cmpresult == XFS_CMP_DIFFERENT) @@ -232,7 +230,7 @@ xfs_dir_cilookup_result( !(args->op_flags & XFS_DA_OP_CILOOKUP)) return EEXIST; - args->value = kmem_alloc(len, KM_MAYFAIL); + args->value = kmem_alloc(len, KM_NOFS | KM_MAYFAIL); if (!args->value) return ENOMEM; @@ -420,11 +418,14 @@ xfs_dir2_grow_inode( xfs_mount_t *mp; int nmap; /* number of bmap entries */ xfs_trans_t *tp; + xfs_drfsbno_t nblks; + + trace_xfs_dir2_grow_inode(args, space); - xfs_dir2_trace_args_s("grow_inode", args, space); dp = args->dp; tp = args->trans; mp = dp->i_mount; + nblks = dp->i_d.di_nblocks; /* * Set lowest possible block in the space requested. */ @@ -443,7 +444,7 @@ xfs_dir2_grow_inode( if ((error = xfs_bmapi(tp, dp, bno, count, XFS_BMAPI_WRITE|XFS_BMAPI_METADATA|XFS_BMAPI_CONTIG, args->firstblock, args->total, &map, &nmap, - args->flist, NULL))) + args->flist))) return error; ASSERT(nmap <= 1); if (nmap == 1) { @@ -475,8 +476,7 @@ xfs_dir2_grow_inode( if ((error = xfs_bmapi(tp, dp, b, c, XFS_BMAPI_WRITE|XFS_BMAPI_METADATA, args->firstblock, args->total, - &mapp[mapi], &nmap, args->flist, - NULL))) { + &mapp[mapi], &nmap, args->flist))) { kmem_free(mapp); return error; } @@ -517,7 +517,11 @@ xfs_dir2_grow_inode( */ if (mapp != &map) kmem_free(mapp); + + /* account for newly allocated blocks in reserved blocks total */ + args->total -= dp->i_d.di_nblocks - nblks; *dbp = xfs_dir2_da_to_db(mp, (xfs_dablk_t)bno); + /* * Update file's size if this is the data space and it grew. */ @@ -594,7 +598,8 @@ xfs_dir2_shrink_inode( xfs_mount_t *mp; xfs_trans_t *tp; - xfs_dir2_trace_args_db("shrink_inode", args, db, bp); + trace_xfs_dir2_shrink_inode(args, db); + dp = args->dp; mp = dp->i_mount; tp = args->trans; @@ -604,7 +609,7 @@ xfs_dir2_shrink_inode( */ if ((error = xfs_bunmapi(tp, dp, da, mp->m_dirblkfsbs, XFS_BMAPI_METADATA, 0, args->firstblock, args->flist, - NULL, &done))) { + &done))) { /* * ENOSPC actually can happen if we're in a removename with * no space reservation, and the resulting block removal diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index d197b0b..b614ea6 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -36,8 +36,8 @@ static xfs_dahash_t xfs_dir_hash_dot, xfs_dir_hash_dotdot; void xfs_dir_startup(void) { - xfs_dir_hash_dot = xfs_da_hashname(".", 1); - xfs_dir_hash_dotdot = xfs_da_hashname("..", 2); + xfs_dir_hash_dot = xfs_da_hashname((unsigned char *)".", 1); + xfs_dir_hash_dotdot = xfs_da_hashname((unsigned char *)"..", 2); } /* @@ -73,7 +73,8 @@ xfs_dir2_block_addname( __be16 *tagp; /* pointer to tag value */ xfs_trans_t *tp; /* transaction structure */ - xfs_dir2_trace_args("block_addname", args); + trace_xfs_dir2_block_addname(args); + dp = args->dp; tp = args->trans; mp = dp->i_mount; @@ -467,7 +468,8 @@ xfs_dir2_block_lookup( int error; /* error return value */ xfs_mount_t *mp; /* filesystem mount point */ - xfs_dir2_trace_args("block_lookup", args); + trace_xfs_dir2_block_lookup(args); + /* * Get the buffer, look up the entry. * If not found (ENOENT) then return, have no buffer. @@ -624,7 +626,8 @@ xfs_dir2_block_removename( int size; /* shortform size */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args("block_removename", args); + trace_xfs_dir2_block_removename(args); + /* * Look up the entry in the block. Gets the buffer and entry index. * It will always be there, the vnodeops level does a lookup first. @@ -700,7 +703,8 @@ xfs_dir2_block_replace( int error; /* error return value */ xfs_mount_t *mp; /* filesystem mount point */ - xfs_dir2_trace_args("block_replace", args); + trace_xfs_dir2_block_replace(args); + /* * Lookup the entry in the directory. Get buffer and entry index. * This will always succeed since the caller has already done a lookup. @@ -774,7 +778,8 @@ xfs_dir2_leaf_to_block( int to; /* block/leaf to index */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args_bb("leaf_to_block", args, lbp, dbp); + trace_xfs_dir2_leaf_to_block(args); + dp = args->dp; tp = args->trans; mp = dp->i_mount; @@ -921,7 +926,8 @@ xfs_dir2_sf_to_block( xfs_trans_t *tp; /* transaction pointer */ struct xfs_name name; - xfs_dir2_trace_args("sf_to_block", args); + trace_xfs_dir2_sf_to_block(args); + dp = args->dp; tp = args->trans; mp = dp->i_mount; @@ -943,10 +949,10 @@ xfs_dir2_sf_to_block( */ buf_len = dp->i_df.if_bytes; - buf = kmem_alloc(dp->i_df.if_bytes, KM_SLEEP); + buf = kmem_alloc(buf_len, KM_SLEEP); - memcpy(buf, sfp, dp->i_df.if_bytes); - xfs_idata_realloc(dp, -dp->i_df.if_bytes, XFS_DATA_FORK); + memcpy(buf, sfp, buf_len); + xfs_idata_realloc(dp, -buf_len, XFS_DATA_FORK); dp->i_d.di_size = 0; xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); /* diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 9a1aace..9ce2320 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -57,7 +57,8 @@ xfs_dir2_block_to_leaf( int needscan; /* need to rescan bestfree */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args_b("block_to_leaf", args, dbp); + trace_xfs_dir2_block_to_leaf(args); + dp = args->dp; mp = dp->i_mount; tp = args->trans; @@ -165,7 +166,8 @@ xfs_dir2_leaf_addname( xfs_trans_t *tp; /* transaction pointer */ xfs_dir2_db_t use_block; /* data block number */ - xfs_dir2_trace_args("leaf_addname", args); + trace_xfs_dir2_leaf_addname(args); + dp = args->dp; tp = args->trans; mp = dp->i_mount; @@ -526,7 +528,7 @@ xfs_dir2_leaf_addname( * Check the internal consistency of a leaf1 block. * Pop an assert if something is wrong. */ -void +STATIC void xfs_dir2_leaf_check( xfs_inode_t *dp, /* incore directory inode */ xfs_dabuf_t *bp) /* leaf's buffer */ @@ -881,7 +883,8 @@ xfs_dir2_leaf_lookup( xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args("leaf_lookup", args); + trace_xfs_dir2_leaf_lookup(args); + /* * Look up name in the leaf block, returning both buffers and index. */ @@ -1069,7 +1072,8 @@ xfs_dir2_leaf_removename( xfs_dir2_data_off_t oldbest; /* old value of best free */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args("leaf_removename", args); + trace_xfs_dir2_leaf_removename(args); + /* * Lookup the leaf entry, get the leaf and data blocks read in. */ @@ -1201,7 +1205,8 @@ xfs_dir2_leaf_replace( xfs_dir2_leaf_entry_t *lep; /* leaf entry */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args("leaf_replace", args); + trace_xfs_dir2_leaf_replace(args); + /* * Look up the entry. */ @@ -1381,7 +1386,9 @@ xfs_dir2_node_to_leaf( if (state->path.active > 1) return 0; args = state->args; - xfs_dir2_trace_args("node_to_leaf", args); + + trace_xfs_dir2_node_to_leaf(args); + mp = state->mp; dp = args->dp; tp = args->trans; diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index db88adc..e4e20d6 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -43,7 +43,7 @@ static int xfs_dir2_node_addname_int(xfs_da_args_t *args, /* * Log entries from a freespace block. */ -void +STATIC void xfs_dir2_free_log_bests( xfs_trans_t *tp, /* transaction pointer */ xfs_dabuf_t *bp, /* freespace buffer */ @@ -101,7 +101,8 @@ xfs_dir2_leaf_to_node( __be16 *to; /* pointer to freespace entry */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args_b("leaf_to_node", args, lbp); + trace_xfs_dir2_leaf_to_node(args); + dp = args->dp; mp = dp->i_mount; tp = args->trans; @@ -174,7 +175,8 @@ xfs_dir2_leafn_add( xfs_mount_t *mp; /* filesystem mount point */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args_sb("leafn_add", args, index, bp); + trace_xfs_dir2_leafn_add(args, index); + dp = args->dp; mp = dp->i_mount; tp = args->trans; @@ -689,8 +691,8 @@ xfs_dir2_leafn_moveents( int stale; /* count stale leaves copied */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args_bibii("leafn_moveents", args, bp_s, start_s, bp_d, - start_d, count); + trace_xfs_dir2_leafn_moveents(args, start_s, start_d, count); + /* * Silently return if nothing to do. */ @@ -911,7 +913,8 @@ xfs_dir2_leafn_remove( int needscan; /* need to rescan data frees */ xfs_trans_t *tp; /* transaction pointer */ - xfs_dir2_trace_args_sb("leafn_remove", args, index, bp); + trace_xfs_dir2_leafn_remove(args, index); + dp = args->dp; tp = args->trans; mp = dp->i_mount; @@ -1082,7 +1085,7 @@ xfs_dir2_leafn_remove( } xfs_dir2_leafn_check(dp, bp); /* - * Return indication of whether this leaf block is emtpy enough + * Return indication of whether this leaf block is empty enough * to justify trying to join it with a neighbor. */ *rval = @@ -1341,7 +1344,8 @@ xfs_dir2_node_addname( int rval; /* sub-return value */ xfs_da_state_t *state; /* btree cursor */ - xfs_dir2_trace_args("node_addname", args); + trace_xfs_dir2_node_addname(args); + /* * Allocate and initialize the state (btree cursor). */ @@ -1800,7 +1804,8 @@ xfs_dir2_node_lookup( int rval; /* operation return value */ xfs_da_state_t *state; /* btree cursor */ - xfs_dir2_trace_args("node_lookup", args); + trace_xfs_dir2_node_lookup(args); + /* * Allocate and initialize the btree cursor. */ @@ -1853,7 +1858,8 @@ xfs_dir2_node_removename( int rval; /* operation return value */ xfs_da_state_t *state; /* btree cursor */ - xfs_dir2_trace_args("node_removename", args); + trace_xfs_dir2_node_removename(args); + /* * Allocate and initialize the btree cursor. */ @@ -1922,7 +1928,8 @@ xfs_dir2_node_replace( int rval; /* internal return value */ xfs_da_state_t *state; /* btree cursor */ - xfs_dir2_trace_args("node_replace", args); + trace_xfs_dir2_node_replace(args); + /* * Allocate and initialize the btree cursor. */ diff --git a/libxfs/xfs_dir2_sf.c b/libxfs/xfs_dir2_sf.c index 77f30de..6b5e6d4 100644 --- a/libxfs/xfs_dir2_sf.c +++ b/libxfs/xfs_dir2_sf.c @@ -148,7 +148,8 @@ xfs_dir2_block_to_sf( xfs_dir2_sf_t *sfp; /* shortform structure */ xfs_ino_t temp; - xfs_dir2_trace_args_sb("block_to_sf", args, size, bp); + trace_xfs_dir2_block_to_sf(args); + dp = args->dp; mp = dp->i_mount; @@ -260,7 +261,8 @@ xfs_dir2_sf_addname( xfs_dir2_sf_t *sfp; /* shortform structure */ xfs_dir2_sf_entry_t *sfep = NULL; /* shortform entry */ - xfs_dir2_trace_args("sf_addname", args); + trace_xfs_dir2_sf_addname(args); + ASSERT(xfs_dir2_sf_lookup(args) == ENOENT); dp = args->dp; ASSERT(dp->i_df.if_flags & XFS_IFINLINE); @@ -633,7 +635,8 @@ xfs_dir2_sf_create( xfs_dir2_sf_t *sfp; /* shortform structure */ int size; /* directory size */ - xfs_dir2_trace_args_i("sf_create", args, pino); + trace_xfs_dir2_sf_create(args); + dp = args->dp; ASSERT(dp != NULL); @@ -688,7 +691,8 @@ xfs_dir2_sf_lookup( enum xfs_dacmp cmp; /* comparison result */ xfs_dir2_sf_entry_t *ci_sfep; /* case-insens. entry */ - xfs_dir2_trace_args("sf_lookup", args); + trace_xfs_dir2_sf_lookup(args); + xfs_dir2_sf_check(args); dp = args->dp; @@ -771,7 +775,8 @@ xfs_dir2_sf_removename( xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ xfs_dir2_sf_t *sfp; /* shortform structure */ - xfs_dir2_trace_args("sf_removename", args); + trace_xfs_dir2_sf_removename(args); + dp = args->dp; ASSERT(dp->i_df.if_flags & XFS_IFINLINE); @@ -862,7 +867,8 @@ xfs_dir2_sf_replace( xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ xfs_dir2_sf_t *sfp; /* shortform structure */ - xfs_dir2_trace_args("sf_replace", args); + trace_xfs_dir2_sf_replace(args); + dp = args->dp; ASSERT(dp->i_df.if_flags & XFS_IFINLINE); @@ -1005,7 +1011,8 @@ xfs_dir2_sf_toino4( xfs_dir2_sf_entry_t *sfep; /* new sf entry */ xfs_dir2_sf_t *sfp; /* new sf directory */ - xfs_dir2_trace_args("sf_toino4", args); + trace_xfs_dir2_sf_toino4(args); + dp = args->dp; /* @@ -1082,7 +1089,8 @@ xfs_dir2_sf_toino8( xfs_dir2_sf_entry_t *sfep; /* new sf entry */ xfs_dir2_sf_t *sfp; /* new sf directory */ - xfs_dir2_trace_args("sf_toino8", args); + trace_xfs_dir2_sf_toino8(args); + dp = args->dp; /* diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 32ae4b0..1fcafb6 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -18,73 +18,6 @@ #include -/* - * Internal functions. - */ - -/* - * Log specified fields for the inode given by bp and off. - */ -STATIC void -xfs_ialloc_log_di( - xfs_trans_t *tp, /* transaction pointer */ - xfs_buf_t *bp, /* inode buffer */ - int off, /* index of inode in buffer */ - int fields) /* bitmask of fields to log */ -{ - int first; /* first byte number */ - int ioffset; /* off in bytes */ - int last; /* last byte number */ - xfs_mount_t *mp; /* mount point structure */ - static const short offsets[] = { /* field offsets */ - /* keep in sync with bits */ - offsetof(xfs_dinode_core_t, di_magic), - offsetof(xfs_dinode_core_t, di_mode), - offsetof(xfs_dinode_core_t, di_version), - offsetof(xfs_dinode_core_t, di_format), - offsetof(xfs_dinode_core_t, di_onlink), - offsetof(xfs_dinode_core_t, di_uid), - offsetof(xfs_dinode_core_t, di_gid), - offsetof(xfs_dinode_core_t, di_nlink), - offsetof(xfs_dinode_core_t, di_projid_lo), - offsetof(xfs_dinode_core_t, di_projid_hi), - offsetof(xfs_dinode_core_t, di_pad), - offsetof(xfs_dinode_core_t, di_atime), - offsetof(xfs_dinode_core_t, di_mtime), - offsetof(xfs_dinode_core_t, di_ctime), - offsetof(xfs_dinode_core_t, di_size), - offsetof(xfs_dinode_core_t, di_nblocks), - offsetof(xfs_dinode_core_t, di_extsize), - offsetof(xfs_dinode_core_t, di_nextents), - offsetof(xfs_dinode_core_t, di_anextents), - offsetof(xfs_dinode_core_t, di_forkoff), - offsetof(xfs_dinode_core_t, di_aformat), - offsetof(xfs_dinode_core_t, di_dmevmask), - offsetof(xfs_dinode_core_t, di_dmstate), - offsetof(xfs_dinode_core_t, di_flags), - offsetof(xfs_dinode_core_t, di_gen), - offsetof(xfs_dinode_t, di_next_unlinked), - offsetof(xfs_dinode_t, di_u), - offsetof(xfs_dinode_t, di_a), - sizeof(xfs_dinode_t) - }; - - - ASSERT(offsetof(xfs_dinode_t, di_core) == 0); - ASSERT((fields & (XFS_DI_U|XFS_DI_A)) == 0); - mp = tp->t_mountp; - /* - * Get the inode-relative first and last bytes for these fields - */ - xfs_btree_offsets(fields, offsets, XFS_DI_NUM_BITS, &first, &last); - /* - * Convert to buffer offsets and log it. - */ - ioffset = off << mp->m_sb.sb_inodelog; - first += ioffset; - last += ioffset; - xfs_trans_log_buf(tp, bp, first, last); -} /* * Allocation group level functions. @@ -101,75 +34,35 @@ xfs_ialloc_cluster_alignment( } /* - * Lookup the record equal to ino in the btree given by cur. - */ -STATIC int /* error */ -xfs_inobt_lookup_eq( - struct xfs_btree_cur *cur, /* btree cursor */ - xfs_agino_t ino, /* starting inode of chunk */ - __int32_t fcnt, /* free inode count */ - xfs_inofree_t free, /* free inode mask */ - int *stat) /* success/failure */ -{ - cur->bc_rec.i.ir_startino = ino; - cur->bc_rec.i.ir_freecount = fcnt; - cur->bc_rec.i.ir_free = free; - return xfs_btree_lookup(cur, XFS_LOOKUP_EQ, stat); -} - -/* - * Lookup the first record greater than or equal to ino - * in the btree given by cur. + * Lookup a record by ino in the btree given by cur. */ int /* error */ -xfs_inobt_lookup_ge( +xfs_inobt_lookup( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agino_t ino, /* starting inode of chunk */ - __int32_t fcnt, /* free inode count */ - xfs_inofree_t free, /* free inode mask */ + xfs_lookup_t dir, /* <=, >=, == */ int *stat) /* success/failure */ { cur->bc_rec.i.ir_startino = ino; - cur->bc_rec.i.ir_freecount = fcnt; - cur->bc_rec.i.ir_free = free; - return xfs_btree_lookup(cur, XFS_LOOKUP_GE, stat); + cur->bc_rec.i.ir_freecount = 0; + cur->bc_rec.i.ir_free = 0; + return xfs_btree_lookup(cur, dir, stat); } /* - * Lookup the first record less than or equal to ino - * in the btree given by cur. - */ -int /* error */ -xfs_inobt_lookup_le( - struct xfs_btree_cur *cur, /* btree cursor */ - xfs_agino_t ino, /* starting inode of chunk */ - __int32_t fcnt, /* free inode count */ - xfs_inofree_t free, /* free inode mask */ - int *stat) /* success/failure */ -{ - cur->bc_rec.i.ir_startino = ino; - cur->bc_rec.i.ir_freecount = fcnt; - cur->bc_rec.i.ir_free = free; - return xfs_btree_lookup(cur, XFS_LOOKUP_LE, stat); -} - -/* - * Update the record referred to by cur to the value given - * by [ino, fcnt, free]. + * Update the record referred to by cur to the value given. * This either works (return 0) or gets an EFSCORRUPTED error. */ STATIC int /* error */ xfs_inobt_update( struct xfs_btree_cur *cur, /* btree cursor */ - xfs_agino_t ino, /* starting inode of chunk */ - __int32_t fcnt, /* free inode count */ - xfs_inofree_t free) /* free inode mask */ + xfs_inobt_rec_incore_t *irec) /* btree record */ { union xfs_btree_rec rec; - rec.inobt.ir_startino = cpu_to_be32(ino); - rec.inobt.ir_freecount = cpu_to_be32(fcnt); - rec.inobt.ir_free = cpu_to_be64(free); + rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino); + rec.inobt.ir_freecount = cpu_to_be32(irec->ir_freecount); + rec.inobt.ir_free = cpu_to_be64(irec->ir_free); return xfs_btree_update(cur, &rec); } @@ -179,9 +72,7 @@ xfs_inobt_update( int /* error */ xfs_inobt_get_rec( struct xfs_btree_cur *cur, /* btree cursor */ - xfs_agino_t *ino, /* output: starting inode of chunk */ - __int32_t *fcnt, /* output: number of free inodes */ - xfs_inofree_t *free, /* output: free inode mask */ + xfs_inobt_rec_incore_t *irec, /* btree record */ int *stat) /* output: success/failure */ { union xfs_btree_rec *rec; @@ -189,14 +80,136 @@ xfs_inobt_get_rec( error = xfs_btree_get_rec(cur, &rec, stat); if (!error && *stat == 1) { - *ino = be32_to_cpu(rec->inobt.ir_startino); - *fcnt = be32_to_cpu(rec->inobt.ir_freecount); - *free = be64_to_cpu(rec->inobt.ir_free); + irec->ir_startino = be32_to_cpu(rec->inobt.ir_startino); + irec->ir_freecount = be32_to_cpu(rec->inobt.ir_freecount); + irec->ir_free = be64_to_cpu(rec->inobt.ir_free); } return error; } /* + * Verify that the number of free inodes in the AGI is correct. + */ +#ifdef DEBUG +STATIC int +xfs_check_agi_freecount( + struct xfs_btree_cur *cur, + struct xfs_agi *agi) +{ + if (cur->bc_nlevels == 1) { + xfs_inobt_rec_incore_t rec; + int freecount = 0; + int error; + int i; + + error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); + if (error) + return error; + + do { + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + return error; + + if (i) { + freecount += rec.ir_freecount; + error = xfs_btree_increment(cur, 0, &i); + if (error) + return error; + } + } while (i == 1); + + if (!XFS_FORCED_SHUTDOWN(cur->bc_mp)) + ASSERT(freecount == be32_to_cpu(agi->agi_freecount)); + } + return 0; +} +#else +#define xfs_check_agi_freecount(cur, agi) 0 +#endif + +/* + * Initialise a new set of inodes. + */ +STATIC void +xfs_ialloc_inode_init( + struct xfs_mount *mp, + struct xfs_trans *tp, + xfs_agnumber_t agno, + xfs_agblock_t agbno, + xfs_agblock_t length, + unsigned int gen) +{ + struct xfs_buf *fbuf; + struct xfs_dinode *free; + int blks_per_cluster, nbufs, ninodes; + int version; + int i, j; + xfs_daddr_t d; + + /* + * Loop over the new block(s), filling in the inodes. + * For small block sizes, manipulate the inodes in buffers + * which are multiples of the blocks size. + */ + if (mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(mp)) { + blks_per_cluster = 1; + nbufs = length; + ninodes = mp->m_sb.sb_inopblock; + } else { + blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) / + mp->m_sb.sb_blocksize; + nbufs = length / blks_per_cluster; + ninodes = blks_per_cluster * mp->m_sb.sb_inopblock; + } + + /* + * Figure out what version number to use in the inodes we create. + * If the superblock version has caught up to the one that supports + * the new inode format, then use the new inode version. Otherwise + * use the old version so that old kernels will continue to be + * able to use the file system. + */ + if (xfs_sb_version_hasnlink(&mp->m_sb)) + version = 2; + else + version = 1; + + for (j = 0; j < nbufs; j++) { + /* + * Get the block. + */ + d = XFS_AGB_TO_DADDR(mp, agno, agbno + (j * blks_per_cluster)); + fbuf = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, + mp->m_bsize * blks_per_cluster, + XBF_LOCK); + ASSERT(fbuf); + ASSERT(!XFS_BUF_GETERROR(fbuf)); + + /* + * Initialize all inodes in this buffer and then log them. + * + * XXX: It would be much better if we had just one transaction + * to log a whole cluster of inodes instead of all the + * individual transactions causing a lot of log traffic. + */ + xfs_buf_zero(fbuf, 0, ninodes << mp->m_sb.sb_inodelog); + for (i = 0; i < ninodes; i++) { + int ioffset = i << mp->m_sb.sb_inodelog; + uint isize = sizeof(struct xfs_dinode); + + free = xfs_make_iptr(mp, fbuf, i); + free->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); + free->di_version = version; + free->di_gen = cpu_to_be32(gen); + free->di_next_unlinked = cpu_to_be32(NULLAGINO); + xfs_trans_log_buf(tp, fbuf, ioffset, ioffset + isize - 1); + } + xfs_trans_inode_alloc_buf(tp, fbuf); + } +} + +/* * Allocate new inodes in the allocation group specified by agbp. * Return 0 for success, else error code. */ @@ -208,24 +221,16 @@ xfs_ialloc_ag_alloc( { xfs_agi_t *agi; /* allocation group header */ xfs_alloc_arg_t args; /* allocation argument structure */ - int blks_per_cluster; /* fs blocks per inode cluster */ xfs_btree_cur_t *cur; /* inode btree cursor */ - xfs_daddr_t d; /* disk addr of buffer */ xfs_agnumber_t agno; int error; - xfs_buf_t *fbuf; /* new free inodes' buffer */ - xfs_dinode_t *free; /* new free inode structure */ - int i; /* inode counter */ - int j; /* block counter */ - int nbufs; /* num bufs of new inodes */ + int i; xfs_agino_t newino; /* new first inode's number */ xfs_agino_t newlen; /* new number of inodes */ - int ninodes; /* num inodes per buf */ xfs_agino_t thisino; /* current inode number, for loop */ - int version; /* inode version number to use */ int isaligned = 0; /* inode allocation at stripe unit */ /* boundary */ - unsigned int gen; + struct xfs_perag *pag; args.tp = tp; args.mp = tp->t_mountp; @@ -246,12 +251,12 @@ xfs_ialloc_ag_alloc( */ agi = XFS_BUF_TO_AGI(agbp); newino = be32_to_cpu(agi->agi_newino); + agno = be32_to_cpu(agi->agi_seqno); args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) + XFS_IALLOC_BLOCKS(args.mp); if (likely(newino != NULLAGINO && (args.agbno < be32_to_cpu(agi->agi_length)))) { - args.fsbno = XFS_AGB_TO_FSB(args.mp, - be32_to_cpu(agi->agi_seqno), args.agbno); + args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); args.type = XFS_ALLOCTYPE_THIS_BNO; args.mod = args.total = args.wasdel = args.isfl = args.userdata = args.minalignslop = 0; @@ -274,7 +279,7 @@ xfs_ialloc_ag_alloc( args.minalignslop = xfs_ialloc_cluster_alignment(&args) - 1; /* Allow space for the inode btree to split. */ - args.minleft = XFS_IN_MAXLEVELS(args.mp) - 1; + args.minleft = args.mp->m_in_maxlevels - 1; if ((error = xfs_alloc_vextent(&args))) return error; } else @@ -302,8 +307,7 @@ xfs_ialloc_ag_alloc( * For now, just allocate blocks up front. */ args.agbno = be32_to_cpu(agi->agi_root); - args.fsbno = XFS_AGB_TO_FSB(args.mp, - be32_to_cpu(agi->agi_seqno), args.agbno); + args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); /* * Allocate a fixed-size extent of inodes. */ @@ -314,7 +318,7 @@ xfs_ialloc_ag_alloc( /* * Allow space for the inode btree to split. */ - args.minleft = XFS_IN_MAXLEVELS(args.mp) - 1; + args.minleft = args.mp->m_in_maxlevels - 1; if ((error = xfs_alloc_vextent(&args))) return error; } @@ -326,8 +330,7 @@ xfs_ialloc_ag_alloc( if (isaligned && args.fsbno == NULLFSBLOCK) { args.type = XFS_ALLOCTYPE_NEAR_BNO; args.agbno = be32_to_cpu(agi->agi_root); - args.fsbno = XFS_AGB_TO_FSB(args.mp, - be32_to_cpu(agi->agi_seqno), args.agbno); + args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); args.alignment = xfs_ialloc_cluster_alignment(&args); if ((error = xfs_alloc_vextent(&args))) return error; @@ -338,78 +341,30 @@ xfs_ialloc_ag_alloc( return 0; } ASSERT(args.len == args.minlen); - /* - * Convert the results. - */ - newino = XFS_OFFBNO_TO_AGINO(args.mp, args.agbno, 0); - /* - * Loop over the new block(s), filling in the inodes. - * For small block sizes, manipulate the inodes in buffers - * which are multiples of the blocks size. - */ - if (args.mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(args.mp)) { - blks_per_cluster = 1; - nbufs = (int)args.len; - ninodes = args.mp->m_sb.sb_inopblock; - } else { - blks_per_cluster = XFS_INODE_CLUSTER_SIZE(args.mp) / - args.mp->m_sb.sb_blocksize; - nbufs = (int)args.len / blks_per_cluster; - ninodes = blks_per_cluster * args.mp->m_sb.sb_inopblock; - } - /* - * Figure out what version number to use in the inodes we create. - * If the superblock version has caught up to the one that supports - * the new inode format, then use the new inode version. Otherwise - * use the old version so that old kernels will continue to be - * able to use the file system. - */ - if (xfs_sb_version_hasnlink(&args.mp->m_sb)) - version = XFS_DINODE_VERSION_2; - else - version = XFS_DINODE_VERSION_1; /* + * Stamp and write the inode buffers. + * * Seed the new inode cluster with a random generation number. This * prevents short-term reuse of generation numbers if a chunk is * freed and then immediately reallocated. We use random numbers * rather than a linear progression to prevent the next generation * number from being easily guessable. */ - gen = random32(); - for (j = 0; j < nbufs; j++) { - /* - * Get the block. - */ - d = XFS_AGB_TO_DADDR(args.mp, be32_to_cpu(agi->agi_seqno), - args.agbno + (j * blks_per_cluster)); - fbuf = xfs_trans_get_buf(tp, args.mp->m_ddev_targp, d, - args.mp->m_bsize * blks_per_cluster, - XFS_BUF_LOCK); - ASSERT(fbuf); - ASSERT(!XFS_BUF_GETERROR(fbuf)); - /* - * Set initial values for the inodes in this buffer. - */ - xfs_biozero(fbuf, 0, ninodes << args.mp->m_sb.sb_inodelog); - for (i = 0; i < ninodes; i++) { - free = XFS_MAKE_IPTR(args.mp, fbuf, i); - free->di_core.di_magic = cpu_to_be16(XFS_DINODE_MAGIC); - free->di_core.di_version = version; - free->di_core.di_gen = cpu_to_be32(gen); - free->di_next_unlinked = cpu_to_be32(NULLAGINO); - xfs_ialloc_log_di(tp, fbuf, i, - XFS_DI_CORE_BITS | XFS_DI_NEXT_UNLINKED); - } - xfs_trans_inode_alloc_buf(tp, fbuf); - } + xfs_ialloc_inode_init(args.mp, tp, agno, args.agbno, args.len, + random32()); + + /* + * Convert the results. + */ + newino = XFS_OFFBNO_TO_AGINO(args.mp, args.agbno, 0); be32_add_cpu(&agi->agi_count, newlen); be32_add_cpu(&agi->agi_freecount, newlen); - agno = be32_to_cpu(agi->agi_seqno); - down_read(&args.mp->m_peraglock); - args.mp->m_perag[agno].pagi_freecount += newlen; - up_read(&args.mp->m_peraglock); + pag = xfs_perag_get(args.mp, agno); + pag->pagi_freecount += newlen; + xfs_perag_put(pag); agi->agi_newino = cpu_to_be32(newino); + /* * Insert records describing the new inode chunk into the btree. */ @@ -417,13 +372,17 @@ xfs_ialloc_ag_alloc( for (thisino = newino; thisino < newino + newlen; thisino += XFS_INODES_PER_CHUNK) { - if ((error = xfs_inobt_lookup_eq(cur, thisino, - XFS_INODES_PER_CHUNK, XFS_INOBT_ALL_FREE, &i))) { + cur->bc_rec.i.ir_startino = thisino; + cur->bc_rec.i.ir_freecount = XFS_INODES_PER_CHUNK; + cur->bc_rec.i.ir_free = XFS_INOBT_ALL_FREE; + error = xfs_btree_lookup(cur, XFS_LOOKUP_EQ, &i); + if (error) { xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); return error; } ASSERT(i == 0); - if ((error = xfs_btree_insert(cur, &i))) { + error = xfs_btree_insert(cur, &i); + if (error) { xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); return error; } @@ -444,7 +403,7 @@ xfs_ialloc_ag_alloc( return 0; } -STATIC_INLINE xfs_agnumber_t +STATIC xfs_agnumber_t xfs_ialloc_next_ag( xfs_mount_t *mp) { @@ -505,9 +464,8 @@ xfs_ialloc_ag_select( */ agno = pagno; flags = XFS_ALLOC_FLAG_TRYLOCK; - down_read(&mp->m_peraglock); for (;;) { - pag = &mp->m_perag[agno]; + pag = xfs_perag_get(mp, agno); if (!pag->pagi_init) { if (xfs_ialloc_read_agi(mp, tp, agno, &agbp)) { agbp = NULL; @@ -546,7 +504,7 @@ xfs_ialloc_ag_select( agbp = NULL; goto nextag; } - up_read(&mp->m_peraglock); + xfs_perag_put(pag); return agbp; } } @@ -554,28 +512,81 @@ unlock_nextag: if (agbp) xfs_trans_brelse(tp, agbp); nextag: + xfs_perag_put(pag); /* * No point in iterating over the rest, if we're shutting * down. */ - if (XFS_FORCED_SHUTDOWN(mp)) { - up_read(&mp->m_peraglock); + if (XFS_FORCED_SHUTDOWN(mp)) return NULL; - } agno++; if (agno >= agcount) agno = 0; if (agno == pagno) { - if (flags == 0) { - up_read(&mp->m_peraglock); + if (flags == 0) return NULL; - } flags = 0; } } } /* + * Try to retrieve the next record to the left/right from the current one. + */ +STATIC int +xfs_ialloc_next_rec( + struct xfs_btree_cur *cur, + xfs_inobt_rec_incore_t *rec, + int *done, + int left) +{ + int error; + int i; + + if (left) + error = xfs_btree_decrement(cur, 0, &i); + else + error = xfs_btree_increment(cur, 0, &i); + + if (error) + return error; + *done = !i; + if (i) { + error = xfs_inobt_get_rec(cur, rec, &i); + if (error) + return error; + XFS_WANT_CORRUPTED_RETURN(i == 1); + } + + return 0; +} + +STATIC int +xfs_ialloc_get_rec( + struct xfs_btree_cur *cur, + xfs_agino_t agino, + xfs_inobt_rec_incore_t *rec, + int *done, + int left) +{ + int error; + int i; + + error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_EQ, &i); + if (error) + return error; + *done = !i; + if (i) { + error = xfs_inobt_get_rec(cur, rec, &i); + if (error) + return error; + XFS_WANT_CORRUPTED_RETURN(i == 1); + } + + return 0; +} + +/* * Visible inode allocation functions. */ @@ -629,12 +640,13 @@ xfs_dialloc( int j; /* result code */ xfs_mount_t *mp; /* file system mount structure */ int offset; /* index of inode in chunk */ - xfs_agino_t pagino; /* parent's a.g. relative inode # */ - xfs_agnumber_t pagno; /* parent's allocation group number */ + xfs_agino_t pagino; /* parent's AG relative inode # */ + xfs_agnumber_t pagno; /* parent's AG number */ xfs_inobt_rec_incore_t rec; /* inode allocation record */ xfs_agnumber_t tagno; /* testing allocation group number */ xfs_btree_cur_t *tcur; /* temp cursor */ xfs_inobt_rec_incore_t trec; /* temp inode allocation record */ + struct xfs_perag *pag; if (*IO_agbp == NULL) { @@ -734,13 +746,13 @@ nextag: *inop = NULLFSINO; return noroom ? ENOSPC : 0; } - down_read(&mp->m_peraglock); - if (mp->m_perag[tagno].pagi_inodeok == 0) { - up_read(&mp->m_peraglock); + pag = xfs_perag_get(mp, tagno); + if (pag->pagi_inodeok == 0) { + xfs_perag_put(pag); goto nextag; } error = xfs_ialloc_read_agi(mp, tp, tagno, &agbp); - up_read(&mp->m_peraglock); + xfs_perag_put(pag); if (error) goto nextag; agi = XFS_BUF_TO_AGI(agbp); @@ -753,6 +765,9 @@ nextag: */ agno = tagno; *IO_agbp = NULL; + pag = xfs_perag_get(mp, agno); + + restart_pagno: cur = xfs_inobt_init_cursor(mp, tp, agbp, be32_to_cpu(agi->agi_seqno)); /* * If pagino is 0 (this is the root inode allocation) use newino. @@ -760,298 +775,315 @@ nextag: */ if (!pagino) pagino = be32_to_cpu(agi->agi_newino); -#ifdef DEBUG - if (cur->bc_nlevels == 1) { - int freecount = 0; - if ((error = xfs_inobt_lookup_ge(cur, 0, 0, 0, &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - do { - if ((error = xfs_inobt_get_rec(cur, &rec.ir_startino, - &rec.ir_freecount, &rec.ir_free, &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - freecount += rec.ir_freecount; - if ((error = xfs_btree_increment(cur, 0, &i))) - goto error0; - } while (i == 1); + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error0; - ASSERT(freecount == be32_to_cpu(agi->agi_freecount) || - XFS_FORCED_SHUTDOWN(mp)); - } -#endif /* - * If in the same a.g. as the parent, try to get near the parent. + * If in the same AG as the parent, try to get near the parent. */ if (pagno == agno) { - if ((error = xfs_inobt_lookup_le(cur, pagino, 0, 0, &i))) + int doneleft; /* done, to the left */ + int doneright; /* done, to the right */ + int searchdistance = 10; + + error = xfs_inobt_lookup(cur, pagino, XFS_LOOKUP_LE, &i); + if (error) goto error0; - if (i != 0 && - (error = xfs_inobt_get_rec(cur, &rec.ir_startino, - &rec.ir_freecount, &rec.ir_free, &j)) == 0 && - j == 1 && - rec.ir_freecount > 0) { + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + + error = xfs_inobt_get_rec(cur, &rec, &j); + if (error) + goto error0; + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + + if (rec.ir_freecount > 0) { /* * Found a free inode in the same chunk - * as parent, done. + * as the parent, done. */ + goto alloc_inode; } + + + /* + * In the same AG as parent, but parent's chunk is full. + */ + + /* duplicate the cursor, search left & right simultaneously */ + error = xfs_btree_dup_cursor(cur, &tcur); + if (error) + goto error0; + /* - * In the same a.g. as parent, but parent's chunk is full. + * Skip to last blocks looked up if same parent inode. */ - else { - int doneleft; /* done, to the left */ - int doneright; /* done, to the right */ + if (pagino != NULLAGINO && + pag->pagl_pagino == pagino && + pag->pagl_leftrec != NULLAGINO && + pag->pagl_rightrec != NULLAGINO) { + error = xfs_ialloc_get_rec(tcur, pag->pagl_leftrec, + &trec, &doneleft, 1); + if (error) + goto error1; + error = xfs_ialloc_get_rec(cur, pag->pagl_rightrec, + &rec, &doneright, 0); if (error) - goto error0; - ASSERT(i == 1); - ASSERT(j == 1); - /* - * Duplicate the cursor, search left & right - * simultaneously. - */ - if ((error = xfs_btree_dup_cursor(cur, &tcur))) - goto error0; - /* - * Search left with tcur, back up 1 record. - */ - if ((error = xfs_btree_decrement(tcur, 0, &i))) goto error1; - doneleft = !i; - if (!doneleft) { - if ((error = xfs_inobt_get_rec(tcur, - &trec.ir_startino, - &trec.ir_freecount, - &trec.ir_free, &i))) - goto error1; - XFS_WANT_CORRUPTED_GOTO(i == 1, error1); - } - /* - * Search right with cur, go forward 1 record. - */ - if ((error = xfs_btree_increment(cur, 0, &i))) + } else { + /* search left with tcur, back up 1 record */ + error = xfs_ialloc_next_rec(tcur, &trec, &doneleft, 1); + if (error) goto error1; - doneright = !i; - if (!doneright) { - if ((error = xfs_inobt_get_rec(cur, - &rec.ir_startino, - &rec.ir_freecount, - &rec.ir_free, &i))) - goto error1; - XFS_WANT_CORRUPTED_GOTO(i == 1, error1); - } - /* - * Loop until we find the closest inode chunk - * with a free one. - */ - while (!doneleft || !doneright) { - int useleft; /* using left inode - chunk this time */ + /* search right with cur, go forward 1 record. */ + error = xfs_ialloc_next_rec(cur, &rec, &doneright, 0); + if (error) + goto error1; + } + + /* + * Loop until we find an inode chunk with a free inode. + */ + while (!doneleft || !doneright) { + int useleft; /* using left inode chunk this time */ + + if (!--searchdistance) { /* - * Figure out which block is closer, - * if both are valid. - */ - if (!doneleft && !doneright) - useleft = - pagino - - (trec.ir_startino + - XFS_INODES_PER_CHUNK - 1) < - rec.ir_startino - pagino; - else - useleft = !doneleft; - /* - * If checking the left, does it have - * free inodes? - */ - if (useleft && trec.ir_freecount) { - /* - * Yes, set it up as the chunk to use. - */ - rec = trec; - xfs_btree_del_cursor(cur, - XFS_BTREE_NOERROR); - cur = tcur; - break; - } - /* - * If checking the right, does it have - * free inodes? - */ - if (!useleft && rec.ir_freecount) { - /* - * Yes, it's already set up. - */ - xfs_btree_del_cursor(tcur, - XFS_BTREE_NOERROR); - break; - } - /* - * If used the left, get another one - * further left. - */ - if (useleft) { - if ((error = xfs_btree_decrement(tcur, 0, - &i))) - goto error1; - doneleft = !i; - if (!doneleft) { - if ((error = xfs_inobt_get_rec( - tcur, - &trec.ir_startino, - &trec.ir_freecount, - &trec.ir_free, &i))) - goto error1; - XFS_WANT_CORRUPTED_GOTO(i == 1, - error1); - } - } - /* - * If used the right, get another one - * further right. + * Not in range - save last search + * location and allocate a new inode */ - else { - if ((error = xfs_btree_increment(cur, 0, - &i))) - goto error1; - doneright = !i; - if (!doneright) { - if ((error = xfs_inobt_get_rec( - cur, - &rec.ir_startino, - &rec.ir_freecount, - &rec.ir_free, &i))) - goto error1; - XFS_WANT_CORRUPTED_GOTO(i == 1, - error1); - } - } + xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); + pag->pagl_leftrec = trec.ir_startino; + pag->pagl_rightrec = rec.ir_startino; + pag->pagl_pagino = pagino; + goto newino; } - ASSERT(!doneleft || !doneright); + + /* figure out the closer block if both are valid. */ + if (!doneleft && !doneright) { + useleft = pagino - + (trec.ir_startino + XFS_INODES_PER_CHUNK - 1) < + rec.ir_startino - pagino; + } else { + useleft = !doneleft; + } + + /* free inodes to the left? */ + if (useleft && trec.ir_freecount) { + rec = trec; + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + cur = tcur; + + pag->pagl_leftrec = trec.ir_startino; + pag->pagl_rightrec = rec.ir_startino; + pag->pagl_pagino = pagino; + goto alloc_inode; + } + + /* free inodes to the right? */ + if (!useleft && rec.ir_freecount) { + xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); + + pag->pagl_leftrec = trec.ir_startino; + pag->pagl_rightrec = rec.ir_startino; + pag->pagl_pagino = pagino; + goto alloc_inode; + } + + /* get next record to check */ + if (useleft) { + error = xfs_ialloc_next_rec(tcur, &trec, + &doneleft, 1); + } else { + error = xfs_ialloc_next_rec(cur, &rec, + &doneright, 0); + } + if (error) + goto error1; } + + /* + * We've reached the end of the btree. because + * we are only searching a small chunk of the + * btree each search, there is obviously free + * inodes closer to the parent inode than we + * are now. restart the search again. + */ + pag->pagl_pagino = NULLAGINO; + pag->pagl_leftrec = NULLAGINO; + pag->pagl_rightrec = NULLAGINO; + xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + goto restart_pagno; } + /* - * In a different a.g. from the parent. + * In a different AG from the parent. * See if the most recently allocated block has any free. */ - else if (be32_to_cpu(agi->agi_newino) != NULLAGINO) { - if ((error = xfs_inobt_lookup_eq(cur, - be32_to_cpu(agi->agi_newino), 0, 0, &i))) +newino: + if (be32_to_cpu(agi->agi_newino) != NULLAGINO) { + error = xfs_inobt_lookup(cur, be32_to_cpu(agi->agi_newino), + XFS_LOOKUP_EQ, &i); + if (error) goto error0; - if (i == 1 && - (error = xfs_inobt_get_rec(cur, &rec.ir_startino, - &rec.ir_freecount, &rec.ir_free, &j)) == 0 && - j == 1 && - rec.ir_freecount > 0) { - /* - * The last chunk allocated in the group still has - * a free inode. - */ - } - /* - * None left in the last group, search the whole a.g. - */ - else { + + if (i == 1) { + error = xfs_inobt_get_rec(cur, &rec, &j); if (error) goto error0; - if ((error = xfs_inobt_lookup_ge(cur, 0, 0, 0, &i))) - goto error0; - ASSERT(i == 1); - for (;;) { - if ((error = xfs_inobt_get_rec(cur, - &rec.ir_startino, - &rec.ir_freecount, &rec.ir_free, - &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - if (rec.ir_freecount > 0) - break; - if ((error = xfs_btree_increment(cur, 0, &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + + if (j == 1 && rec.ir_freecount > 0) { + /* + * The last chunk allocated in the group + * still has a free inode. + */ + goto alloc_inode; } } } - offset = XFS_IALLOC_FIND_FREE(&rec.ir_free); + + /* + * None left in the last group, search the whole AG + */ + error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); + if (error) + goto error0; + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + + for (;;) { + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error0; + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + if (rec.ir_freecount > 0) + break; + error = xfs_btree_increment(cur, 0, &i); + if (error) + goto error0; + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + } + +alloc_inode: + offset = xfs_ialloc_find_free(&rec.ir_free); ASSERT(offset >= 0); ASSERT(offset < XFS_INODES_PER_CHUNK); ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % XFS_INODES_PER_CHUNK) == 0); ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino + offset); - XFS_INOBT_CLR_FREE(&rec, offset); + rec.ir_free &= ~XFS_INOBT_MASK(offset); rec.ir_freecount--; - if ((error = xfs_inobt_update(cur, rec.ir_startino, rec.ir_freecount, - rec.ir_free))) + error = xfs_inobt_update(cur, &rec); + if (error) goto error0; be32_add_cpu(&agi->agi_freecount, -1); xfs_ialloc_log_agi(tp, agbp, XFS_AGI_FREECOUNT); - down_read(&mp->m_peraglock); - mp->m_perag[tagno].pagi_freecount--; - up_read(&mp->m_peraglock); -#ifdef DEBUG - if (cur->bc_nlevels == 1) { - int freecount = 0; + pag->pagi_freecount--; + + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error0; - if ((error = xfs_inobt_lookup_ge(cur, 0, 0, 0, &i))) - goto error0; - do { - if ((error = xfs_inobt_get_rec(cur, &rec.ir_startino, - &rec.ir_freecount, &rec.ir_free, &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - freecount += rec.ir_freecount; - if ((error = xfs_btree_increment(cur, 0, &i))) - goto error0; - } while (i == 1); - ASSERT(freecount == be32_to_cpu(agi->agi_freecount) || - XFS_FORCED_SHUTDOWN(mp)); - } -#endif xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, -1); + xfs_perag_put(pag); *inop = ino; return 0; error1: xfs_btree_del_cursor(tcur, XFS_BTREE_ERROR); error0: xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + xfs_perag_put(pag); return error; } +STATIC int +xfs_imap_lookup( + struct xfs_mount *mp, + struct xfs_trans *tp, + xfs_agnumber_t agno, + xfs_agino_t agino, + xfs_agblock_t agbno, + xfs_agblock_t *chunk_agbno, + xfs_agblock_t *offset_agbno, + int flags) +{ + struct xfs_inobt_rec_incore rec; + struct xfs_btree_cur *cur; + struct xfs_buf *agbp; + int error; + int i; + + error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); + if (error) { + xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " + "xfs_ialloc_read_agi() returned " + "error %d, agno %d", + error, agno); + return error; + } + + /* + * Lookup the inode record for the given agino. If the record cannot be + * found, then it's an invalid inode number and we should abort. Once + * we have a record, we need to ensure it contains the inode number + * we are looking up. + */ + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); + error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i); + if (!error) { + if (i) + error = xfs_inobt_get_rec(cur, &rec, &i); + if (!error && i == 0) + error = EINVAL; + } + + xfs_trans_brelse(tp, agbp); + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + if (error) + return error; + + /* check that the returned record contains the required inode */ + if (rec.ir_startino > agino || + rec.ir_startino + XFS_IALLOC_INODES(mp) <= agino) + return EINVAL; + + /* for untrusted inodes check it is allocated first */ + if ((flags & XFS_IGET_UNTRUSTED) && + (rec.ir_free & XFS_INOBT_MASK(agino - rec.ir_startino))) + return EINVAL; + + *chunk_agbno = XFS_AGINO_TO_AGBNO(mp, rec.ir_startino); + *offset_agbno = agbno - *chunk_agbno; + return 0; +} /* - * Return the location of the inode in bno/off, for mapping it into a buffer. + * Return the location of the inode in imap, for mapping it into a buffer. */ -/*ARGSUSED*/ int -xfs_dilocate( - xfs_mount_t *mp, /* file system mount structure */ - xfs_trans_t *tp, /* transaction pointer */ +xfs_imap( + xfs_mount_t *mp, /* file system mount structure */ + xfs_trans_t *tp, /* transaction pointer */ xfs_ino_t ino, /* inode to locate */ - xfs_fsblock_t *bno, /* output: block containing inode */ - int *len, /* output: num blocks in inode cluster */ - int *off, /* output: index in block of inode */ - uint flags) /* flags concerning inode lookup */ + struct xfs_imap *imap, /* location map structure */ + uint flags) /* flags for inode btree lookup */ { xfs_agblock_t agbno; /* block number of inode in the alloc group */ - xfs_buf_t *agbp; /* agi buffer */ xfs_agino_t agino; /* inode number within alloc group */ xfs_agnumber_t agno; /* allocation group number */ int blks_per_cluster; /* num blocks per inode cluster */ xfs_agblock_t chunk_agbno; /* first block in inode chunk */ - xfs_agino_t chunk_agino; /* first agino in inode chunk */ - __int32_t chunk_cnt; /* count of free inodes in chunk */ - xfs_inofree_t chunk_free; /* mask of free inodes in chunk */ xfs_agblock_t cluster_agbno; /* first block in inode cluster */ - xfs_btree_cur_t *cur; /* inode btree cursor */ int error; /* error code */ - int i; /* temp state */ int offset; /* index of inode in its buffer */ - int offset_agbno; /* blks from chunk start to inode */ + xfs_agblock_t offset_agbno; /* blks from chunk start to inode */ ASSERT(ino != NULLFSINO); + /* * Split up the inode number into its parts. */ @@ -1061,25 +1093,28 @@ xfs_dilocate( if (agno >= mp->m_sb.sb_agcount || agbno >= mp->m_sb.sb_agblocks || ino != XFS_AGINO_TO_INO(mp, agno, agino)) { #ifdef DEBUG - /* no diagnostics for bulkstat, ino comes from userspace */ - if (flags & XFS_IMAP_BULKSTAT) + /* + * Don't output diagnostic information for untrusted inodes + * as they can be invalid without implying corruption. + */ + if (flags & XFS_IGET_UNTRUSTED) return XFS_ERROR(EINVAL); if (agno >= mp->m_sb.sb_agcount) { xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_dilocate: agno (%d) >= " + "xfs_imap: agno (%d) >= " "mp->m_sb.sb_agcount (%d)", agno, mp->m_sb.sb_agcount); } if (agbno >= mp->m_sb.sb_agblocks) { xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_dilocate: agbno (0x%llx) >= " + "xfs_imap: agbno (0x%llx) >= " "mp->m_sb.sb_agblocks (0x%lx)", (unsigned long long) agbno, (unsigned long) mp->m_sb.sb_agblocks); } if (ino != XFS_AGINO_TO_INO(mp, agno, agino)) { xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_dilocate: ino (0x%llx) != " + "xfs_imap: ino (0x%llx) != " "XFS_AGINO_TO_INO(mp, agno, agino) " "(0x%llx)", ino, XFS_AGINO_TO_INO(mp, agno, agino)); @@ -1088,84 +1123,81 @@ xfs_dilocate( #endif /* DEBUG */ return XFS_ERROR(EINVAL); } - if ((mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(mp)) || - !(flags & XFS_IMAP_LOOKUP)) { - offset = XFS_INO_TO_OFFSET(mp, ino); - ASSERT(offset < mp->m_sb.sb_inopblock); - *bno = XFS_AGB_TO_FSB(mp, agno, agbno); - *off = offset; - *len = 1; - return 0; - } + blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; - if (*bno != NULLFSBLOCK) { + + /* + * For bulkstat and handle lookups, we have an untrusted inode number + * that we have to verify is valid. We cannot do this just by reading + * the inode buffer as it may have been unlinked and removed leaving + * inodes in stale state on disk. Hence we have to do a btree lookup + * in all cases where an untrusted inode number is passed. + */ + if (flags & XFS_IGET_UNTRUSTED) { + error = xfs_imap_lookup(mp, tp, agno, agino, agbno, + &chunk_agbno, &offset_agbno, flags); + if (error) + return error; + goto out_map; + } + + /* + * If the inode cluster size is the same as the blocksize or + * smaller we get to the buffer by simple arithmetics. + */ + if (XFS_INODE_CLUSTER_SIZE(mp) <= mp->m_sb.sb_blocksize) { offset = XFS_INO_TO_OFFSET(mp, ino); ASSERT(offset < mp->m_sb.sb_inopblock); - cluster_agbno = XFS_FSB_TO_AGBNO(mp, *bno); - *off = ((agbno - cluster_agbno) * mp->m_sb.sb_inopblock) + - offset; - *len = blks_per_cluster; + + imap->im_blkno = XFS_AGB_TO_DADDR(mp, agno, agbno); + imap->im_len = XFS_FSB_TO_BB(mp, 1); + imap->im_boffset = (ushort)(offset << mp->m_sb.sb_inodelog); return 0; } + + /* + * If the inode chunks are aligned then use simple maths to + * find the location. Otherwise we have to do a btree + * lookup to find the location. + */ if (mp->m_inoalign_mask) { offset_agbno = agbno & mp->m_inoalign_mask; chunk_agbno = agbno - offset_agbno; } else { - down_read(&mp->m_peraglock); - error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); - up_read(&mp->m_peraglock); - if (error) { -#ifdef DEBUG - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_dilocate: " - "xfs_ialloc_read_agi() returned " - "error %d, agno %d", - error, agno); -#endif /* DEBUG */ - return error; - } - cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); - if ((error = xfs_inobt_lookup_le(cur, agino, 0, 0, &i))) { -#ifdef DEBUG - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_dilocate: " - "xfs_inobt_lookup_le() failed"); -#endif /* DEBUG */ - goto error0; - } - if ((error = xfs_inobt_get_rec(cur, &chunk_agino, &chunk_cnt, - &chunk_free, &i))) { -#ifdef DEBUG - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_dilocate: " - "xfs_inobt_get_rec() failed"); -#endif /* DEBUG */ - goto error0; - } - if (i == 0) { -#ifdef DEBUG - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_dilocate: " - "xfs_inobt_get_rec() failed"); -#endif /* DEBUG */ - error = XFS_ERROR(EINVAL); - } - xfs_trans_brelse(tp, agbp); - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + error = xfs_imap_lookup(mp, tp, agno, agino, agbno, + &chunk_agbno, &offset_agbno, flags); if (error) return error; - chunk_agbno = XFS_AGINO_TO_AGBNO(mp, chunk_agino); - offset_agbno = agbno - chunk_agbno; } + +out_map: ASSERT(agbno >= chunk_agbno); cluster_agbno = chunk_agbno + ((offset_agbno / blks_per_cluster) * blks_per_cluster); offset = ((agbno - cluster_agbno) * mp->m_sb.sb_inopblock) + XFS_INO_TO_OFFSET(mp, ino); - *bno = XFS_AGB_TO_FSB(mp, agno, cluster_agbno); - *off = offset; - *len = blks_per_cluster; + + imap->im_blkno = XFS_AGB_TO_DADDR(mp, agno, cluster_agbno); + imap->im_len = XFS_FSB_TO_BB(mp, blks_per_cluster); + imap->im_boffset = (ushort)(offset << mp->m_sb.sb_inodelog); + + /* + * If the inode number maps to a block outside the bounds + * of the file system then return NULL rather than calling + * read_buf and panicing when we get an error from the + * driver. + */ + if ((imap->im_blkno + imap->im_len) > + XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)) { + xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " + "(imap->im_blkno (0x%llx) + imap->im_len (0x%llx)) > " + " XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks) (0x%llx)", + (unsigned long long) imap->im_blkno, + (unsigned long long) imap->im_len, + XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)); + return XFS_ERROR(EINVAL); + } return 0; -error0: - xfs_trans_brelse(tp, agbp); - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); - return error; } /* @@ -1233,70 +1265,95 @@ xfs_ialloc_log_agi( xfs_trans_log_buf(tp, bp, first, last); } +#ifdef DEBUG +STATIC void +xfs_check_agi_unlinked( + struct xfs_agi *agi) +{ + int i; + + for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) + ASSERT(agi->agi_unlinked[i]); +} +#else +#define xfs_check_agi_unlinked(agi) +#endif + /* * Read in the allocation group header (inode allocation section) */ int -xfs_ialloc_read_agi( - xfs_mount_t *mp, /* file system mount structure */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_agnumber_t agno, /* allocation group number */ - xfs_buf_t **bpp) /* allocation group hdr buf */ +xfs_read_agi( + struct xfs_mount *mp, /* file system mount structure */ + struct xfs_trans *tp, /* transaction pointer */ + xfs_agnumber_t agno, /* allocation group number */ + struct xfs_buf **bpp) /* allocation group hdr buf */ { - xfs_agi_t *agi; /* allocation group header */ - int agi_ok; /* agi is consistent */ - xfs_buf_t *bp; /* allocation group hdr buf */ - xfs_perag_t *pag; /* per allocation group data */ - int error; + struct xfs_agi *agi; /* allocation group header */ + int agi_ok; /* agi is consistent */ + int error; ASSERT(agno != NULLAGNUMBER); - error = xfs_trans_read_buf( - mp, tp, mp->m_ddev_targp, + + error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1), 0, &bp); + XFS_FSS_TO_BB(mp, 1), 0, bpp); if (error) return error; - ASSERT(bp && !XFS_BUF_GETERROR(bp)); + + ASSERT(*bpp && !XFS_BUF_GETERROR(*bpp)); + agi = XFS_BUF_TO_AGI(*bpp); /* * Validate the magic number of the agi block. */ - agi = XFS_BUF_TO_AGI(bp); - agi_ok = - be32_to_cpu(agi->agi_magicnum) == XFS_AGI_MAGIC && - XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)); + agi_ok = be32_to_cpu(agi->agi_magicnum) == XFS_AGI_MAGIC && + XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)) && + be32_to_cpu(agi->agi_seqno) == agno; if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, XFS_RANDOM_IALLOC_READ_AGI))) { - XFS_CORRUPTION_ERROR("xfs_ialloc_read_agi", XFS_ERRLEVEL_LOW, + XFS_CORRUPTION_ERROR("xfs_read_agi", XFS_ERRLEVEL_LOW, mp, agi); - xfs_trans_brelse(tp, bp); + xfs_trans_brelse(tp, *bpp); return XFS_ERROR(EFSCORRUPTED); } - pag = &mp->m_perag[agno]; + + XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_AGI, XFS_AGI_REF); + + xfs_check_agi_unlinked(agi); + return 0; +} + +int +xfs_ialloc_read_agi( + struct xfs_mount *mp, /* file system mount structure */ + struct xfs_trans *tp, /* transaction pointer */ + xfs_agnumber_t agno, /* allocation group number */ + struct xfs_buf **bpp) /* allocation group hdr buf */ +{ + struct xfs_agi *agi; /* allocation group header */ + struct xfs_perag *pag; /* per allocation group data */ + int error; + + error = xfs_read_agi(mp, tp, agno, bpp); + if (error) + return error; + + agi = XFS_BUF_TO_AGI(*bpp); + pag = xfs_perag_get(mp, agno); if (!pag->pagi_init) { pag->pagi_freecount = be32_to_cpu(agi->agi_freecount); pag->pagi_count = be32_to_cpu(agi->agi_count); pag->pagi_init = 1; - } else { - /* - * It's possible for these to be out of sync if - * we are in the middle of a forced shutdown. - */ - ASSERT(pag->pagi_freecount == be32_to_cpu(agi->agi_freecount) || - XFS_FORCED_SHUTDOWN(mp)); - } - -#ifdef DEBUG - { - int i; - - for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) - ASSERT(agi->agi_unlinked[i]); } -#endif - XFS_BUF_SET_VTYPE_REF(bp, B_FS_AGI, XFS_AGI_REF); - *bpp = bp; + /* + * It's possible for these to be out of sync if + * we are in the middle of a forced shutdown. + */ + ASSERT(pag->pagi_freecount == be32_to_cpu(agi->agi_freecount) || + XFS_FORCED_SHUTDOWN(mp)); + xfs_perag_put(pag); return 0; } diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 17afc23..35dd96f 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -140,7 +140,7 @@ xfs_inobt_init_rec_from_cur( } /* - * intial value of ptr for lookup + * initial value of ptr for lookup */ STATIC void xfs_inobt_init_ptr_from_cur( @@ -163,38 +163,6 @@ xfs_inobt_key_diff( cur->bc_rec.i.ir_startino; } -STATIC int -xfs_inobt_kill_root( - struct xfs_btree_cur *cur, - struct xfs_buf *bp, - int level, - union xfs_btree_ptr *newroot) -{ - int error; - - XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); - XFS_BTREE_STATS_INC(cur, killroot); - - /* - * Update the root pointer, decreasing the level by 1 and then - * free the old root. - */ - xfs_inobt_set_root(cur, newroot, -1); - error = xfs_inobt_free_block(cur, bp); - if (error) { - XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); - return error; - } - - XFS_BTREE_STATS_INC(cur, free); - - cur->bc_bufs[level] = NULL; - cur->bc_nlevels--; - - XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); - return 0; -} - #ifdef DEBUG STATIC int xfs_inobt_keys_inorder( @@ -289,7 +257,6 @@ static const struct xfs_btree_ops xfs_inobt_ops = { .dup_cursor = xfs_inobt_dup_cursor, .set_root = xfs_inobt_set_root, - .kill_root = xfs_inobt_kill_root, .alloc_block = xfs_inobt_alloc_block, .free_block = xfs_inobt_free_block, .get_minrecs = xfs_inobt_get_minrecs, diff --git a/libxfs/xfs_inode.c b/libxfs/xfs_inode.c index 1c9ea3b..e4474fd 100644 --- a/libxfs/xfs_inode.c +++ b/libxfs/xfs_inode.c @@ -87,14 +87,14 @@ xfs_inobp_check( * We do basic validation checks on the buffer once it has been * retrieved from disk. */ -STATIC int +int xfs_imap_to_bp( xfs_mount_t *mp, xfs_trans_t *tp, - xfs_imap_t *imap, + struct xfs_imap *imap, xfs_buf_t **bpp, uint buf_flags, - uint imap_flags) + uint iget_flags) { int error; int i; @@ -110,7 +110,7 @@ xfs_imap_to_bp( "an error %d on %s. Returning error.", error, mp->m_fsname); } else { - ASSERT(buf_flags & XFS_BUF_TRYLOCK); + ASSERT(buf_flags & XBF_TRYLOCK); } return error; } @@ -131,12 +131,12 @@ xfs_imap_to_bp( dip = (xfs_dinode_t *)xfs_buf_offset(bp, (i << mp->m_sb.sb_inodelog)); - di_ok = be16_to_cpu(dip->di_core.di_magic) == XFS_DINODE_MAGIC && - XFS_DINODE_GOOD_VERSION(dip->di_core.di_version); + di_ok = be16_to_cpu(dip->di_magic) == XFS_DINODE_MAGIC && + XFS_DINODE_GOOD_VERSION(dip->di_version); if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP, XFS_RANDOM_ITOBP_INOTOBP))) { - if (imap_flags & XFS_IMAP_BULKSTAT) { + if (iget_flags & XFS_IGET_UNTRUSTED) { xfs_trans_brelse(tp, bp); return XFS_ERROR(EINVAL); } @@ -148,7 +148,7 @@ xfs_imap_to_bp( "daddr %lld #%d (magic=%x)", XFS_BUFTARG_NAME(mp->m_ddev_targp), (unsigned long long)imap->im_blkno, i, - be16_to_cpu(dip->di_core.di_magic)); + be16_to_cpu(dip->di_magic)); #endif xfs_trans_brelse(tp, bp); return XFS_ERROR(EFSCORRUPTED); @@ -167,6 +167,49 @@ xfs_imap_to_bp( } /* + * This routine is called to map an inode number within a file + * system to the buffer containing the on-disk version of the + * inode. It returns a pointer to the buffer containing the + * on-disk inode in the bpp parameter, and in the dip parameter + * it returns a pointer to the on-disk inode within that buffer. + * + * If a non-zero error is returned, then the contents of bpp and + * dipp are undefined. + * + * Use xfs_imap() to determine the size and location of the + * buffer to read from disk. + */ +int +xfs_inotobp( + xfs_mount_t *mp, + xfs_trans_t *tp, + xfs_ino_t ino, + xfs_dinode_t **dipp, + xfs_buf_t **bpp, + int *offset, + uint imap_flags) +{ + struct xfs_imap imap; + xfs_buf_t *bp; + int error; + + imap.im_blkno = 0; + error = xfs_imap(mp, tp, ino, &imap, imap_flags); + if (error) + return error; + + error = xfs_imap_to_bp(mp, tp, &imap, &bp, XBF_LOCK, imap_flags); + if (error) + return error; + + *dipp = (xfs_dinode_t *)xfs_buf_offset(bp, imap.im_boffset); + *bpp = bp; + *offset = imap.im_boffset; + return 0; +} + + +/* * This routine is called to map an inode to the buffer containing * the on-disk version of the inode. It returns a pointer to the * buffer containing the on-disk inode in the bpp parameter, and in @@ -176,15 +219,11 @@ xfs_imap_to_bp( * If a non-zero error is returned, then the contents of bpp and * dipp are undefined. * - * If the inode is new and has not yet been initialized, use xfs_imap() - * to determine the size and location of the buffer to read from disk. - * If the inode has already been mapped to its buffer and read in once, - * then use the mapping information stored in the inode rather than - * calling xfs_imap(). This allows us to avoid the overhead of looking - * at the inode btree for small block file systems (see xfs_dilocate()). - * We can tell whether the inode has been mapped in before by comparing - * its disk block address to 0. Only uninitialized inodes will have - * 0 for the disk block address. + * The inode is expected to already been mapped to its buffer and read + * in once, thus we can use the mapping information stored in the inode + * rather than calling xfs_imap(). This allows us to avoid the overhead + * of looking at the inode btree for small block file systems + * (see xfs_imap()). */ int xfs_itobp( @@ -193,51 +232,25 @@ xfs_itobp( xfs_inode_t *ip, xfs_dinode_t **dipp, xfs_buf_t **bpp, - xfs_daddr_t bno, - uint imap_flags, uint buf_flags) { - xfs_imap_t imap; xfs_buf_t *bp; int error; - if (ip->i_blkno == (xfs_daddr_t)0) { - imap.im_blkno = bno; - error = xfs_imap(mp, tp, ip->i_ino, &imap, - XFS_IMAP_LOOKUP | imap_flags); - if (error) - return error; + ASSERT(ip->i_imap.im_blkno != 0); - /* - * Fill in the fields in the inode that will be used to - * map the inode to its buffer from now on. - */ - ip->i_blkno = imap.im_blkno; - ip->i_len = imap.im_len; - ip->i_boffset = imap.im_boffset; - } else { - /* - * We've already mapped the inode once, so just use the - * mapping that we saved the first time. - */ - imap.im_blkno = ip->i_blkno; - imap.im_len = ip->i_len; - imap.im_boffset = ip->i_boffset; - } - ASSERT(bno == 0 || bno == imap.im_blkno); - - error = xfs_imap_to_bp(mp, tp, &imap, &bp, buf_flags, imap_flags); + error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp, buf_flags, 0); if (error) return error; if (!bp) { - ASSERT(buf_flags & XFS_BUF_TRYLOCK); + ASSERT(buf_flags & XBF_TRYLOCK); ASSERT(tp == NULL); *bpp = NULL; return EAGAIN; } - *dipp = (xfs_dinode_t *)xfs_buf_offset(bp, imap.im_boffset); + *dipp = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); *bpp = bp; return 0; } @@ -250,8 +263,6 @@ xfs_itobp( * pointers. For a file in B-tree format, only the root is immediately * brought in-core. The rest will be in-lined in if_extents when it * is first referenced (see xfs_iread_extents()). - * - * Note: this requires user-space public scope for libxfs_iread */ int xfs_iformat( @@ -266,55 +277,65 @@ xfs_iformat( XFS_IFORK_DSIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); error = 0; - if (unlikely(be32_to_cpu(dip->di_core.di_nextents) + - be16_to_cpu(dip->di_core.di_anextents) > - be64_to_cpu(dip->di_core.di_nblocks))) { + if (unlikely(be32_to_cpu(dip->di_nextents) + + be16_to_cpu(dip->di_anextents) > + be64_to_cpu(dip->di_nblocks))) { xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, "corrupt dinode %Lu, extent total = %d, nblocks = %Lu.", (unsigned long long)ip->i_ino, - (int)(be32_to_cpu(dip->di_core.di_nextents) + - be16_to_cpu(dip->di_core.di_anextents)), + (int)(be32_to_cpu(dip->di_nextents) + + be16_to_cpu(dip->di_anextents)), (unsigned long long) - be64_to_cpu(dip->di_core.di_nblocks)); + be64_to_cpu(dip->di_nblocks)); XFS_CORRUPTION_ERROR("xfs_iformat(1)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); return XFS_ERROR(EFSCORRUPTED); } - if (unlikely(dip->di_core.di_forkoff > ip->i_mount->m_sb.sb_inodesize)) { + if (unlikely(dip->di_forkoff > ip->i_mount->m_sb.sb_inodesize)) { xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, "corrupt dinode %Lu, forkoff = 0x%x.", (unsigned long long)ip->i_ino, - dip->di_core.di_forkoff); + dip->di_forkoff); XFS_CORRUPTION_ERROR("xfs_iformat(2)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); return XFS_ERROR(EFSCORRUPTED); } + if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) && + !ip->i_mount->m_rtdev)) { + xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, + "corrupt dinode %Lu, has realtime flag set.", + ip->i_ino); + XFS_CORRUPTION_ERROR("xfs_iformat(realtime)", + XFS_ERRLEVEL_LOW, ip->i_mount, dip); + return XFS_ERROR(EFSCORRUPTED); + } + switch (ip->i_d.di_mode & S_IFMT) { case S_IFIFO: case S_IFCHR: case S_IFBLK: case S_IFSOCK: - if (unlikely(dip->di_core.di_format != XFS_DINODE_FMT_DEV)) { + if (unlikely(dip->di_format != XFS_DINODE_FMT_DEV)) { XFS_CORRUPTION_ERROR("xfs_iformat(3)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); return XFS_ERROR(EFSCORRUPTED); } ip->i_d.di_size = 0; ip->i_size = 0; - ip->i_df.if_u2.if_rdev = be32_to_cpu(dip->di_u.di_dev); + ip->i_df.if_u2.if_rdev = xfs_dinode_get_rdev(dip); break; case S_IFREG: case S_IFLNK: case S_IFDIR: - switch (dip->di_core.di_format) { + switch (dip->di_format) { case XFS_DINODE_FMT_LOCAL: /* * no local regular files yet */ - if (unlikely((be16_to_cpu(dip->di_core.di_mode) & S_IFMT) == S_IFREG)) { + if (unlikely((be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFREG)) { xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, "corrupt inode %Lu " "(local format for regular file).", @@ -325,7 +346,7 @@ xfs_iformat( return XFS_ERROR(EFSCORRUPTED); } - di_size = be64_to_cpu(dip->di_core.di_size); + di_size = be64_to_cpu(dip->di_size); if (unlikely(di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, "corrupt inode %Lu " @@ -364,13 +385,26 @@ xfs_iformat( if (!XFS_DFORK_Q(dip)) return 0; ASSERT(ip->i_afp == NULL); - ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP); + ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP | KM_NOFS); ip->i_afp->if_ext_max = XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); - switch (dip->di_core.di_aformat) { + switch (dip->di_aformat) { case XFS_DINODE_FMT_LOCAL: atp = (xfs_attr_shortform_t *)XFS_DFORK_APTR(dip); size = be16_to_cpu(atp->hdr.totsize); + + if (unlikely(size < sizeof(struct xfs_attr_sf_hdr))) { + xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, + "corrupt inode %Lu " + "(bad attr fork size %Ld).", + (unsigned long long) ip->i_ino, + (long long) size); + XFS_CORRUPTION_ERROR("xfs_iformat(8)", + XFS_ERRLEVEL_LOW, + ip->i_mount, dip); + return XFS_ERROR(EFSCORRUPTED); + } + error = xfs_iformat_local(ip, dip, XFS_ATTR_FORK, size); break; case XFS_DINODE_FMT_EXTENTS: @@ -434,7 +468,7 @@ xfs_iformat_local( ifp->if_u1.if_data = ifp->if_u2.if_inline_data; else { real_size = roundup(size, 4); - ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP); + ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP | KM_NOFS); } ifp->if_bytes = size; ifp->if_real_bytes = real_size; @@ -561,7 +595,7 @@ xfs_iformat_btree( } ifp->if_broot_bytes = size; - ifp->if_broot = kmem_alloc(size, KM_SLEEP); + ifp->if_broot = kmem_alloc(size, KM_SLEEP | KM_NOFS); ASSERT(ifp->if_broot != NULL); /* * Copy and convert from the on-disk structure @@ -579,7 +613,7 @@ xfs_iformat_btree( void xfs_dinode_from_disk( xfs_icdinode_t *to, - xfs_dinode_core_t *from) + xfs_dinode_t *from) { to->di_magic = be16_to_cpu(from->di_magic); to->di_mode = be16_to_cpu(from->di_mode); @@ -614,7 +648,7 @@ xfs_dinode_from_disk( void xfs_dinode_to_disk( - xfs_dinode_core_t *to, + xfs_dinode_t *to, xfs_icdinode_t *from) { to->di_magic = cpu_to_be16(from->di_magic); @@ -661,7 +695,6 @@ xfs_iread_extents( int error; xfs_ifork_t *ifp; xfs_extnum_t nextents; - size_t size; if (unlikely(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE)) { XFS_ERROR_REPORT("xfs_iread_extents", XFS_ERRLEVEL_LOW, @@ -669,7 +702,6 @@ xfs_iread_extents( return XFS_ERROR(EFSCORRUPTED); } nextents = XFS_IFORK_NEXTENTS(ip, whichfork); - size = nextents * sizeof(xfs_bmbt_rec_t); ifp = XFS_IFORK_PTR(ip, whichfork); /* @@ -737,7 +769,7 @@ xfs_iroot_realloc( */ if (ifp->if_broot_bytes == 0) { new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(rec_diff); - ifp->if_broot = kmem_alloc(new_size, KM_SLEEP); + ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); ifp->if_broot_bytes = (int)new_size; return; } @@ -753,7 +785,7 @@ xfs_iroot_realloc( new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max); ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, (size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */ - KM_SLEEP); + KM_SLEEP | KM_NOFS); op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, ifp->if_broot_bytes); np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, @@ -779,7 +811,7 @@ xfs_iroot_realloc( else new_size = 0; if (new_size > 0) { - new_broot = kmem_alloc(new_size, KM_SLEEP); + new_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); /* * First copy over the btree block header. */ @@ -883,7 +915,8 @@ xfs_idata_realloc( real_size = roundup(new_size, 4); if (ifp->if_u1.if_data == NULL) { ASSERT(ifp->if_real_bytes == 0); - ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP); + ifp->if_u1.if_data = kmem_alloc(real_size, + KM_SLEEP | KM_NOFS); } else if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) { /* * Only do the realloc if the underlying size @@ -894,11 +927,12 @@ xfs_idata_realloc( kmem_realloc(ifp->if_u1.if_data, real_size, ifp->if_real_bytes, - KM_SLEEP); + KM_SLEEP | KM_NOFS); } } else { ASSERT(ifp->if_real_bytes == 0); - ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP); + ifp->if_u1.if_data = kmem_alloc(real_size, + KM_SLEEP | KM_NOFS); memcpy(ifp->if_u1.if_data, ifp->if_u2.if_inline_data, ifp->if_bytes); } @@ -908,64 +942,6 @@ xfs_idata_realloc( ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork)); } - - - -/* - * Map inode to disk block and offset. - * - * mp -- the mount point structure for the current file system - * tp -- the current transaction - * ino -- the inode number of the inode to be located - * imap -- this structure is filled in with the information necessary - * to retrieve the given inode from disk - * flags -- flags to pass to xfs_dilocate indicating whether or not - * lookups in the inode btree were OK or not - */ -int -xfs_imap( - xfs_mount_t *mp, - xfs_trans_t *tp, - xfs_ino_t ino, - xfs_imap_t *imap, - uint flags) -{ - xfs_fsblock_t fsbno; - int len; - int off; - int error; - - fsbno = imap->im_blkno ? - XFS_DADDR_TO_FSB(mp, imap->im_blkno) : NULLFSBLOCK; - error = xfs_dilocate(mp, tp, ino, &fsbno, &len, &off, flags); - if (error) - return error; - - imap->im_blkno = XFS_FSB_TO_DADDR(mp, fsbno); - imap->im_len = XFS_FSB_TO_BB(mp, len); - imap->im_agblkno = XFS_FSB_TO_AGBNO(mp, fsbno); - imap->im_ioffset = (ushort)off; - imap->im_boffset = (ushort)(off << mp->m_sb.sb_inodelog); - - /* - * If the inode number maps to a block outside the bounds - * of the file system then return NULL rather than calling - * read_buf and panicing when we get an error from the - * driver. - */ - if ((imap->im_blkno + imap->im_len) > - XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)) { - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "(imap->im_blkno (0x%llx) + imap->im_len (0x%llx)) > " - " XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks) (0x%llx)", - (unsigned long long) imap->im_blkno, - (unsigned long long) imap->im_len, - XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)); - return EINVAL; - } - return 0; -} - void xfs_idestroy_fork( xfs_inode_t *ip, @@ -1050,7 +1026,7 @@ xfs_iextents_copy( for (i = 0; i < nrecs; i++) { xfs_bmbt_rec_host_t *ep = xfs_iext_get_ext(ifp, i); start_block = xfs_bmbt_get_startblock(ep); - if (ISNULLSTARTBLOCK(start_block)) { + if (isnullstartblock(start_block)) { /* * It's a delayed allocation extent, so skip it. */ @@ -1078,8 +1054,6 @@ xfs_iextents_copy( * changed formats after being modified but before being flushed. * In these cases, the format always takes precedence, because the * format indicates the current state of the fork. - * - * Note: this requires user-space public scope for libxfs_iread */ /*ARGSUSED*/ void @@ -1157,15 +1131,16 @@ xfs_iflush_fork( case XFS_DINODE_FMT_DEV: if (iip->ili_format.ilf_fields & XFS_ILOG_DEV) { ASSERT(whichfork == XFS_DATA_FORK); - dip->di_u.di_dev = cpu_to_be32(ip->i_df.if_u2.if_rdev); + xfs_dinode_put_rdev(dip, ip->i_df.if_u2.if_rdev); } break; case XFS_DINODE_FMT_UUID: if (iip->ili_format.ilf_fields & XFS_ILOG_UUID) { ASSERT(whichfork == XFS_DATA_FORK); - memcpy(&dip->di_u.di_muuid, &ip->i_df.if_u2.if_uuid, - sizeof(uuid_t)); + memcpy(XFS_DFORK_DPTR(dip), + &ip->i_df.if_u2.if_uuid, + sizeof(uuid_t)); } break; @@ -1206,13 +1181,17 @@ xfs_iext_get_ext( */ void xfs_iext_insert( - xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_inode_t *ip, /* incore inode pointer */ xfs_extnum_t idx, /* starting index of new items */ xfs_extnum_t count, /* number of inserted items */ - xfs_bmbt_irec_t *new) /* items to insert */ + xfs_bmbt_irec_t *new, /* items to insert */ + int state) /* type of extent conversion */ { + xfs_ifork_t *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df; xfs_extnum_t i; /* extent record index */ + trace_xfs_iext_insert(ip, idx, new, state, _RET_IP_); + ASSERT(ifp->if_flags & XFS_IFEXTENTS); xfs_iext_add(ifp, idx, count); for (i = idx; i < idx + count; i++, new++) @@ -1455,13 +1434,17 @@ xfs_iext_add_indirect_multi( */ void xfs_iext_remove( - xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_inode_t *ip, /* incore inode pointer */ xfs_extnum_t idx, /* index to begin removing exts */ - int ext_diff) /* number of extents to remove */ + int ext_diff, /* number of extents to remove */ + int state) /* type of extent conversion */ { + xfs_ifork_t *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df; xfs_extnum_t nextents; /* number of extents in file */ int new_size; /* size of extents after removal */ + trace_xfs_iext_remove(ip, idx, state, _RET_IP_); + ASSERT(ext_diff > 0); nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); new_size = (nextents - ext_diff) * sizeof(xfs_bmbt_rec_t); @@ -1583,13 +1566,11 @@ xfs_iext_remove_indirect( xfs_extnum_t ext_diff; /* extents to remove in current list */ xfs_extnum_t nex1; /* number of extents before idx */ xfs_extnum_t nex2; /* extents after idx + count */ - int nlists; /* entries in indirection array */ int page_idx = idx; /* index in target extent list */ ASSERT(ifp->if_flags & XFS_IFEXTIREC); erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 0); ASSERT(erp != NULL); - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; nex1 = page_idx; ext_cnt = count; while (ext_cnt) { @@ -1743,7 +1724,7 @@ xfs_iext_inline_to_direct( /* * Resize an extent indirection array to new_size bytes. */ -void +STATIC void xfs_iext_realloc_indirect( xfs_ifork_t *ifp, /* inode fork pointer */ int new_size) /* new indirection array size */ @@ -1768,7 +1749,7 @@ xfs_iext_realloc_indirect( /* * Switch from indirection array to linear (direct) extent allocations. */ -void +STATIC void xfs_iext_indirect_to_direct( xfs_ifork_t *ifp) /* inode fork pointer */ { diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c index dde9678..32d2255 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_mount.c @@ -73,70 +73,36 @@ static const struct { { sizeof(xfs_sb_t), 0 } }; -xfs_agnumber_t -xfs_initialize_perag( - xfs_mount_t *mp, - xfs_agnumber_t agcount) +/* + * Reference counting access wrappers to the perag structures. + * Because we never free per-ag structures, the only thing we + * have to protect against changes is the tree structure itself. + */ +struct xfs_perag * +xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) { - xfs_agnumber_t index, max_metadata; - xfs_perag_t *pag; - xfs_agino_t agino; - xfs_ino_t ino; - xfs_sb_t *sbp = &mp->m_sb; - xfs_ino_t max_inum = XFS_MAXINUMBER_32; - - /* Check to see if the filesystem can overflow 32 bit inodes */ - agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks - 1, 0); - ino = XFS_AGINO_TO_INO(mp, agcount - 1, agino); - - /* Clear the mount flag if no inode can overflow 32 bits - * on this filesystem, or if specifically requested.. - */ - if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) && ino > max_inum) { - mp->m_flags |= XFS_MOUNT_32BITINODES; - } else { - mp->m_flags &= ~XFS_MOUNT_32BITINODES; + struct xfs_perag *pag; + int ref = 0; + + rcu_read_lock(); + pag = radix_tree_lookup(&mp->m_perag_tree, agno); + if (pag) { + ASSERT(atomic_read(&pag->pag_ref) >= 0); + ref = atomic_inc_return(&pag->pag_ref); } + trace_xfs_perag_get(mp, agno, ref, _RET_IP_); + rcu_read_unlock(); + return pag; +} - /* If we can overflow then setup the ag headers accordingly */ - if (mp->m_flags & XFS_MOUNT_32BITINODES) { - /* Calculate how much should be reserved for inodes to - * meet the max inode percentage. - */ - if (mp->m_maxicount) { - __uint64_t icount; - - icount = sbp->sb_dblocks * sbp->sb_imax_pct; - do_div(icount, 100); - icount += sbp->sb_agblocks - 1; - do_div(icount, sbp->sb_agblocks); - max_metadata = icount; - } else { - max_metadata = agcount; - } - for (index = 0; index < agcount; index++) { - ino = XFS_AGINO_TO_INO(mp, index, agino); - if (ino > max_inum) { - index++; - break; - } +void +xfs_perag_put(struct xfs_perag *pag) +{ + int ref; - /* This ag is preferred for inodes */ - pag = &mp->m_perag[index]; - pag->pagi_inodeok = 1; - if (index < max_metadata) - pag->pagf_metadata = 1; - xfs_initialize_perag_icache(pag); - } - } else { - /* Setup default behavior for smaller filesystems */ - for (index = 0; index < agcount; index++) { - pag = &mp->m_perag[index]; - pag->pagi_inodeok = 1; - xfs_initialize_perag_icache(pag); - } - } - return index; + ASSERT(atomic_read(&pag->pag_ref) > 0); + ref = atomic_dec_return(&pag->pag_ref); + trace_xfs_perag_put(pag->pag_mount, pag->pag_agno, ref, _RET_IP_); } void @@ -265,33 +231,10 @@ xfs_mount_common(xfs_mount_t *mp, xfs_sb_t *sbp) mp->m_sectbb_log = sbp->sb_sectlog - BBSHIFT; mp->m_agno_log = xfs_highbit32(sbp->sb_agcount - 1) + 1; mp->m_agino_log = sbp->sb_inopblog + sbp->sb_agblklog; - mp->m_litino = sbp->sb_inodesize - - ((uint)sizeof(xfs_dinode_core_t) + (uint)sizeof(xfs_agino_t)); mp->m_blockmask = sbp->sb_blocksize - 1; mp->m_blockwsize = sbp->sb_blocksize >> XFS_WORDLOG; mp->m_blockwmask = mp->m_blockwsize - 1; - /* - * Setup for attributes, in case they get created. - * This value is for inodes getting attributes for the first time, - * the per-inode value is for old attribute values. - */ - ASSERT(sbp->sb_inodesize >= 256 && sbp->sb_inodesize <= 2048); - switch (sbp->sb_inodesize) { - case 256: - mp->m_attroffset = XFS_LITINO(mp) - - XFS_BMDR_SPACE_CALC(MINABTPTRS); - break; - case 512: - case 1024: - case 2048: - mp->m_attroffset = XFS_BMDR_SPACE_CALC(6 * MINABTPTRS); - break; - default: - ASSERT(0); - } - ASSERT(mp->m_attroffset < XFS_LITINO(mp)); - mp->m_alloc_mxr[0] = xfs_allocbt_maxrecs(mp, sbp->sb_blocksize, 1); mp->m_alloc_mxr[1] = xfs_allocbt_maxrecs(mp, sbp->sb_blocksize, 0); mp->m_alloc_mnr[0] = mp->m_alloc_mxr[0] / 2; @@ -339,7 +282,7 @@ xfs_initialize_perag_data(xfs_mount_t *mp, xfs_agnumber_t agcount) for (index = 0; index < agcount; index++) { /* * read the agf, then the agi. This gets us - * all the inforamtion we need and populates the + * all the information we need and populates the * per-ag structures for us. */ error = xfs_alloc_pagf_init(mp, NULL, index, 0); @@ -349,12 +292,13 @@ xfs_initialize_perag_data(xfs_mount_t *mp, xfs_agnumber_t agcount) error = xfs_ialloc_pagi_init(mp, NULL, index); if (error) return error; - pag = &mp->m_perag[index]; + pag = xfs_perag_get(mp, index); ifree += pag->pagi_freecount; ialloc += pag->pagi_count; bfree += pag->pagf_freeblks; bfreelst += pag->pagf_flcount; btree += pag->pagf_btreeblks; + xfs_perag_put(pag); } /* * Overwrite incore superblock counters with just-read data @@ -396,18 +340,16 @@ xfs_mod_sb(xfs_trans_t *tp, __int64_t fields) last = 0; /* translate/copy */ - xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb, fields); /* find modified range */ + f = (xfs_sb_field_t)xfs_highbit64((__uint64_t)fields); + ASSERT((1LL << f) & XFS_SB_MOD_BITS); + last = xfs_sb_info[f + 1].offset - 1; f = (xfs_sb_field_t)xfs_lowbit64((__uint64_t)fields); ASSERT((1LL << f) & XFS_SB_MOD_BITS); first = xfs_sb_info[f].offset; - f = (xfs_sb_field_t)xfs_highbit64((__uint64_t)fields); - ASSERT((1LL << f) & XFS_SB_MOD_BITS); - last = xfs_sb_info[f + 1].offset - 1; - xfs_trans_log_buf(tp, bp, first, last); } diff --git a/logprint/log_misc.c b/logprint/log_misc.c index 253e146..707a93b 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -642,7 +642,7 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, int len, int *i, int num_ops) mode = dino.di_mode & S_IFMT; size = (int)dino.di_size; xlog_print_trans_inode_core(&dino); - *ptr += sizeof(xfs_dinode_core_t); + *ptr += sizeof(xfs_icdinode_t); if (*i == num_ops-1 && f->ilf_size == 3) { return 1; diff --git a/mkfs/proto.c b/mkfs/proto.c index 3723685..3021028 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -39,7 +39,7 @@ static long filesize(int fd); * (basically no fragmentation). */ #define MKFS_BLOCKRES_INODE \ - ((uint)(XFS_IALLOC_BLOCKS(mp) + (XFS_IN_MAXLEVELS(mp) - 1))) + ((uint)(XFS_IALLOC_BLOCKS(mp) + ((mp)->m_in_maxlevels - 1))) #define MKFS_BLOCKRES(rb) \ ((uint)(MKFS_BLOCKRES_INODE + XFS_DA_NODE_MAXDEPTH + \ (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1) + (rb))) @@ -201,7 +201,7 @@ rsvfile( if (ip->i_d.di_mode & S_IXGRP) ip->i_d.di_mode &= ~S_ISGID; - libxfs_ichgtime(ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + libxfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); ip->i_d.di_flags |= XFS_DIFLAG_PREALLOC; @@ -244,7 +244,7 @@ newfile( nb = XFS_B_TO_FSB(mp, len); nmap = 1; error = libxfs_bmapi(tp, ip, 0, nb, XFS_BMAPI_WRITE, first, nb, - &map, &nmap, flist, NULL); + &map, &nmap, flist); if (error) { fail(_("error allocating space for a file"), error); } @@ -436,7 +436,7 @@ parseproto( xname.len = name ? strlen(name) : 0; tp = libxfs_trans_alloc(mp, 0); flags = XFS_ILOG_CORE; - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); switch (fmt) { case IF_REGULAR: buf = newregfile(pp, &len); @@ -664,13 +664,13 @@ rtinit( libxfs_trans_ijoin(tp, rbmip, 0); libxfs_trans_ihold(tp, rbmip); bno = 0; - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); while (bno < mp->m_sb.sb_rbmblocks) { nmap = XFS_BMAP_MAX_NMAP; error = libxfs_bmapi(tp, rbmip, bno, (xfs_extlen_t)(mp->m_sb.sb_rbmblocks - bno), XFS_BMAPI_WRITE, &first, mp->m_sb.sb_rbmblocks, - map, &nmap, &flist, NULL); + map, &nmap, &flist); if (error) { fail(_("Allocation of the realtime bitmap failed"), error); @@ -701,13 +701,13 @@ rtinit( libxfs_trans_ijoin(tp, rsumip, 0); libxfs_trans_ihold(tp, rsumip); bno = 0; - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); while (bno < nsumblocks) { nmap = XFS_BMAP_MAX_NMAP; error = libxfs_bmapi(tp, rsumip, bno, (xfs_extlen_t)(nsumblocks - bno), XFS_BMAPI_WRITE, &first, nsumblocks, - map, &nmap, &flist, NULL); + map, &nmap, &flist); if (error) { fail(_("Allocation of the realtime summary failed"), error); @@ -733,7 +733,7 @@ rtinit( tp = libxfs_trans_alloc(mp, 0); if ((i = libxfs_trans_reserve(tp, 0, 0, 0, 0, 0))) res_failed(i); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); ebno = XFS_RTMIN(mp->m_sb.sb_rextents, bno + NBBY * mp->m_sb.sb_blocksize); error = libxfs_rtfree_extent(tp, bno, (xfs_extlen_t)(ebno-bno)); diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 5b3b9a7..1e4e966 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2611,10 +2611,11 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), args.mp = mp; args.agno = agno; args.alignment = 1; - args.pag = &mp->m_perag[agno]; + args.pag = xfs_perag_get(mp,agno); if ((c = libxfs_trans_reserve(tp, worst_freelist, 0, 0, 0, 0))) res_failed(c); libxfs_alloc_fix_freelist(&args, 0); + xfs_perag_put(args.pag); libxfs_trans_commit(tp, 0); } diff --git a/repair/attr_repair.c b/repair/attr_repair.c index fb686fa..7672e13 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -388,7 +388,7 @@ process_leaf_attr_local( { xfs_attr_leaf_name_local_t *local; - local = XFS_ATTR_LEAF_NAME_LOCAL(leaf, i); + local = xfs_attr_leaf_name_local(leaf, i); if (local->namelen == 0 || namecheck((char *)&local->nameval[0], local->namelen)) { do_warn(_("attribute entry %d in attr block %u, inode %llu " @@ -423,7 +423,7 @@ process_leaf_attr_local( return -1; } } - return XFS_ATTR_LEAF_ENTSIZE_LOCAL(local->namelen, + return xfs_attr_leaf_entsize_local(local->namelen, be16_to_cpu(local->valuelen)); } @@ -441,7 +441,7 @@ process_leaf_attr_remote( xfs_attr_leaf_name_remote_t *remotep; char* value; - remotep = XFS_ATTR_LEAF_NAME_REMOTE(leaf, i); + remotep = xfs_attr_leaf_name_remote(leaf, i); if (remotep->namelen == 0 || namecheck((char *)&remotep->name[0], remotep->namelen) || @@ -479,7 +479,7 @@ process_leaf_attr_remote( } free(value); out: - return XFS_ATTR_LEAF_ENTSIZE_REMOTE(remotep->namelen); + return xfs_attr_leaf_entsize_remote(remotep->namelen); bad_free_out: free(value); @@ -840,8 +840,8 @@ process_longform_attr( bno = blkmap_get(blkmap, 0); if ( bno == NULLDFSBNO ) { - if (dip->di_core.di_aformat == XFS_DINODE_FMT_EXTENTS && - be16_to_cpu(dip->di_core.di_anextents) == 0) + if (dip->di_aformat == XFS_DINODE_FMT_EXTENTS && + be16_to_cpu(dip->di_anextents) == 0) return(0); /* the kernel can handle this state */ do_warn(_("block 0 of inode %llu attribute fork is missing\n"), ino); @@ -958,7 +958,7 @@ process_attributes( int *repair) /* returned if we did repair */ { int err; - __u8 aformat = dip->di_core.di_aformat; + __u8 aformat = dip->di_aformat; xfs_attr_shortform_t *asf; asf = (xfs_attr_shortform_t *) XFS_DFORK_APTR(dip); diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c index 734e9a8..8735f92 100644 --- a/repair/dino_chunks.c +++ b/repair/dino_chunks.c @@ -62,7 +62,7 @@ check_aginode_block(xfs_mount_t *mp, } for (i = 0; i < mp->m_sb.sb_inopblock; i++) { - dino_p = XFS_MAKE_IPTR(mp, bp, i); + dino_p = xfs_make_iptr(mp, bp, i); if (!verify_uncertain_dinode(mp, dino_p, agno, XFS_OFFBNO_TO_AGINO(mp, agbno, i))) cnt++; @@ -674,7 +674,7 @@ process_inode_chunk( /* * make inode pointer */ - dino = XFS_MAKE_IPTR(mp, bplist[bp_index], cluster_offset); + dino = xfs_make_iptr(mp, bplist[bp_index], cluster_offset); agino = irec_offset + ino_rec->ino_startnum; /* @@ -767,7 +767,7 @@ process_inode_chunk( /* * make inode pointer */ - dino = XFS_MAKE_IPTR(mp, bplist[bp_index], cluster_offset); + dino = xfs_make_iptr(mp, bplist[bp_index], cluster_offset); agino = irec_offset + ino_rec->ino_startnum; is_used = 3; @@ -809,9 +809,9 @@ process_inode_chunk( * store on-disk nlink count for comparing in phase 7 */ set_inode_disk_nlinks(ino_rec, irec_offset, - dino->di_core.di_version > XFS_DINODE_VERSION_1 - ? be32_to_cpu(dino->di_core.di_nlink) - : be16_to_cpu(dino->di_core.di_onlink)); + dino->di_version > 1 + ? be32_to_cpu(dino->di_nlink) + : be16_to_cpu(dino->di_onlink)); } else { set_inode_free(ino_rec, irec_offset); diff --git a/repair/dinode.c b/repair/dinode.c index bf04c6e..2fa850d 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -43,27 +43,27 @@ int calc_attr_offset(xfs_mount_t *mp, xfs_dinode_t *dino) { - xfs_dinode_core_t *dinoc = &dino->di_core; - int offset = ((__psint_t) &dino->di_u) - - (__psint_t)dino; + int offset = (__psint_t)XFS_DFORK_DPTR(dino) - (__psint_t)dino; + xfs_bmdr_block_t *dfp; /* * don't worry about alignment when calculating offset * because the data fork is already 8-byte aligned */ - switch (dinoc->di_format) { + switch (dino->di_format) { case XFS_DINODE_FMT_DEV: offset += sizeof(xfs_dev_t); break; case XFS_DINODE_FMT_LOCAL: - offset += be64_to_cpu(dinoc->di_size); + offset += be64_to_cpu(dino->di_size); break; case XFS_DINODE_FMT_EXTENTS: - offset += be32_to_cpu(dinoc->di_nextents) * + offset += be32_to_cpu(dino->di_nextents) * sizeof(xfs_bmbt_rec_t); break; case XFS_DINODE_FMT_BTREE: - offset += be16_to_cpu(dino->di_u.di_bmbt.bb_numrecs) * + dfp = (xfs_bmdr_block_t *)XFS_DFORK_DPTR(dino); + offset += be16_to_cpu(dfp->bb_numrecs) * sizeof(xfs_bmbt_rec_t); break; default: @@ -79,9 +79,7 @@ calc_attr_offset(xfs_mount_t *mp, xfs_dinode_t *dino) int clear_dinode_attr(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_ino_t ino_num) { - xfs_dinode_core_t *dinoc = &dino->di_core; - - ASSERT(dinoc->di_forkoff != 0); + ASSERT(dino->di_forkoff != 0); if (!no_modify) fprintf(stderr, _("clearing inode %llu attributes\n"), @@ -90,16 +88,16 @@ clear_dinode_attr(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_ino_t ino_num) fprintf(stderr, _("would have cleared inode %llu attributes\n"), (unsigned long long)ino_num); - if (be16_to_cpu(dinoc->di_anextents) != 0) { + if (be16_to_cpu(dino->di_anextents) != 0) { if (no_modify) return(1); - dinoc->di_anextents = cpu_to_be16(0); + dino->di_anextents = cpu_to_be16(0); } - if (dinoc->di_aformat != XFS_DINODE_FMT_EXTENTS) { + if (dino->di_aformat != XFS_DINODE_FMT_EXTENTS) { if (no_modify) return(1); - dinoc->di_aformat = XFS_DINODE_FMT_EXTENTS; + dino->di_aformat = XFS_DINODE_FMT_EXTENTS; } /* get rid of the fork by clearing forkoff */ @@ -118,7 +116,7 @@ clear_dinode_attr(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_ino_t ino_num) XFS_DFORK_APTR(dino); asf->hdr.totsize = cpu_to_be16(sizeof(xfs_attr_sf_hdr_t)); asf->hdr.count = 0; - dinoc->di_forkoff = 0; /* got to do this after asf is set */ + dino->di_forkoff = 0; /* got to do this after asf is set */ } /* @@ -129,7 +127,7 @@ clear_dinode_attr(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_ino_t ino_num) /* ARGSUSED */ int -clear_dinode_core(xfs_dinode_core_t *dinoc, xfs_ino_t ino_num) +clear_dinode_core(xfs_dinode_t *dinoc, xfs_ino_t ino_num) { int dirty = 0; @@ -143,14 +141,13 @@ clear_dinode_core(xfs_dinode_core_t *dinoc, xfs_ino_t ino_num) } if (!XFS_DINODE_GOOD_VERSION(dinoc->di_version) || - (!fs_inode_nlink && dinoc->di_version > XFS_DINODE_VERSION_1)) { + (!fs_inode_nlink && dinoc->di_version > 1)) { dirty = 1; if (no_modify) return(1); - dinoc->di_version = (fs_inode_nlink) ? XFS_DINODE_VERSION_2 - : XFS_DINODE_VERSION_1; + dinoc->di_version = (fs_inode_nlink) ? 2 : 1; } if (be16_to_cpu(dinoc->di_mode) != 0) { @@ -252,7 +249,7 @@ clear_dinode_core(xfs_dinode_core_t *dinoc, xfs_ino_t ino_num) dinoc->di_anextents = 0; } - if (dinoc->di_version > XFS_DINODE_VERSION_1 && + if (dinoc->di_version > 1 && be32_to_cpu(dinoc->di_nlink) != 0) { dirty = 1; @@ -289,13 +286,13 @@ clear_dinode(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_ino_t ino_num) { int dirty; - dirty = clear_dinode_core(&dino->di_core, ino_num); + dirty = clear_dinode_core(dino, ino_num); dirty += clear_dinode_unlinked(mp, dino); /* and clear the forks */ if (dirty && !no_modify) - memset(&dino->di_u, 0, XFS_LITINO(mp)); + memset(XFS_DFORK_DPTR(dino), 0, XFS_LITINO(mp)); return(dirty); } @@ -868,7 +865,7 @@ get_agino_buf(xfs_mount_t *mp, return(NULL); } - *dipp = XFS_MAKE_IPTR(mp, bp, agino - + *dipp = xfs_make_iptr(mp, bp, agino - XFS_OFFBNO_TO_AGINO(mp, XFS_AGINO_TO_AGBNO(mp, irec->ino_startnum), 0)); @@ -1347,11 +1344,11 @@ process_lclinode( xfs_ino_t lino; lino = XFS_AGINO_TO_INO(mp, agno, ino); - if (whichfork == XFS_DATA_FORK && be64_to_cpu(dip->di_core.di_size) > + if (whichfork == XFS_DATA_FORK && be64_to_cpu(dip->di_size) > XFS_DFORK_DSIZE(dip, mp)) { do_warn( _("local inode %llu data fork is too large (size = %lld, max = %d)\n"), - lino, be64_to_cpu(dip->di_core.di_size), + lino, be64_to_cpu(dip->di_size), XFS_DFORK_DSIZE(dip, mp)); return(1); } else if (whichfork == XFS_ATTR_FORK) { @@ -1385,23 +1382,23 @@ process_symlink_extlist(xfs_mount_t *mp, xfs_ino_t lino, xfs_dinode_t *dino) int i; int max_blocks; - if (be64_to_cpu(dino->di_core.di_size) <= XFS_DFORK_DSIZE(dino, mp)) { - if (dino->di_core.di_format == XFS_DINODE_FMT_LOCAL) + if (be64_to_cpu(dino->di_size) <= XFS_DFORK_DSIZE(dino, mp)) { + if (dino->di_format == XFS_DINODE_FMT_LOCAL) return 0; do_warn(_("mismatch between format (%d) and size (%lld) in " - "symlink ino %llu\n"), dino->di_core.di_format, - be64_to_cpu(dino->di_core.di_size), lino); + "symlink ino %llu\n"), dino->di_format, + be64_to_cpu(dino->di_size), lino); return 1; } - if (dino->di_core.di_format == XFS_DINODE_FMT_LOCAL) { + if (dino->di_format == XFS_DINODE_FMT_LOCAL) { do_warn(_("mismatch between format (%d) and size (%lld) in " - "symlink inode %llu\n"), dino->di_core.di_format, - be64_to_cpu(dino->di_core.di_size), lino); + "symlink inode %llu\n"), dino->di_format, + be64_to_cpu(dino->di_size), lino); return 1; } rp = (xfs_bmbt_rec_t *)XFS_DFORK_DPTR(dino); - numrecs = be32_to_cpu(dino->di_core.di_nextents); + numrecs = be32_to_cpu(dino->di_nextents); /* * the max # of extents in a symlink inode is equal to the @@ -1471,7 +1468,6 @@ process_symlink( blkmap_t *blkmap) { xfs_dfsbno_t fsbno; - xfs_dinode_core_t *dinoc = &dino->di_core; xfs_buf_t *bp = NULL; char *symlink, *cptr, *buf_data; int i, size, amountdone; @@ -1483,9 +1479,9 @@ process_symlink( * the inode is structurally ok so we don't have to check * for that */ - if (be64_to_cpu(dinoc->di_size) >= MAXPATHLEN) { + if (be64_to_cpu(dino->di_size) >= MAXPATHLEN) { do_warn(_("symlink in inode %llu too long (%lld chars)\n"), - lino, be64_to_cpu(dinoc->di_size)); + lino, be64_to_cpu(dino->di_size)); return(1); } @@ -1494,13 +1490,13 @@ process_symlink( * get symlink contents into data area */ symlink = &data[0]; - if (be64_to_cpu(dinoc->di_size) <= XFS_DFORK_DSIZE(dino, mp)) { + if (be64_to_cpu(dino->di_size) <= XFS_DFORK_DSIZE(dino, mp)) { /* * local symlink, just copy the symlink out of the * inode into the data area */ memmove(symlink, XFS_DFORK_DPTR(dino), - be64_to_cpu(dinoc->di_size)); + be64_to_cpu(dino->di_size)); } else { /* * stored in a meta-data file, have to bmap one block @@ -1509,7 +1505,7 @@ process_symlink( i = size = amountdone = 0; cptr = symlink; - while (amountdone < be64_to_cpu(dinoc->di_size)) { + while (amountdone < be64_to_cpu(dino->di_size)) { fsbno = blkmap_get(blkmap, i); if (fsbno != NULLDFSBNO) bp = libxfs_readbuf(mp->m_dev, @@ -1523,7 +1519,7 @@ process_symlink( } buf_data = (char *)XFS_BUF_PTR(bp); - size = MIN(be64_to_cpu(dinoc->di_size) - amountdone, + size = MIN(be64_to_cpu(dino->di_size) - amountdone, XFS_FSB_TO_BB(mp, 1) * BBSIZE); memmove(cptr, buf_data, size); cptr += size; @@ -1532,12 +1528,12 @@ process_symlink( libxfs_putbuf(bp); } } - data[be64_to_cpu(dinoc->di_size)] = '\0'; + data[be64_to_cpu(dino->di_size)] = '\0'; /* * check for nulls */ - if (null_check(symlink, be64_to_cpu(dinoc->di_size))) { + if (null_check(symlink, be64_to_cpu(dino->di_size))) { do_warn( _("found illegal null character in symlink inode %llu\n"), lino); @@ -1547,7 +1543,7 @@ process_symlink( /* * check for any component being too long */ - if (be64_to_cpu(dinoc->di_size) >= MAXNAMELEN) { + if (be64_to_cpu(dino->di_size) >= MAXNAMELEN) { cptr = strchr(symlink, '/'); while (cptr != NULL) { @@ -1595,27 +1591,27 @@ process_misc_ino_types(xfs_mount_t *mp, /* * must also have a zero size */ - if (be64_to_cpu(dino->di_core.di_size) != 0) { + if (be64_to_cpu(dino->di_size) != 0) { switch (type) { case XR_INO_CHRDEV: do_warn(_("size of character device inode %llu != 0 " "(%lld bytes)\n"), lino, - be64_to_cpu(dino->di_core.di_size)); + be64_to_cpu(dino->di_size)); break; case XR_INO_BLKDEV: do_warn(_("size of block device inode %llu != 0 " "(%lld bytes)\n"), lino, - be64_to_cpu(dino->di_core.di_size)); + be64_to_cpu(dino->di_size)); break; case XR_INO_SOCK: do_warn(_("size of socket inode %llu != 0 " "(%lld bytes)\n"), lino, - be64_to_cpu(dino->di_core.di_size)); + be64_to_cpu(dino->di_size)); break; case XR_INO_FIFO: do_warn(_("size of fifo inode %llu != 0 " "(%lld bytes)\n"), lino, - be64_to_cpu(dino->di_core.di_size)); + be64_to_cpu(dino->di_size)); break; default: do_warn(_("Internal error - process_misc_ino_types, " @@ -1634,7 +1630,7 @@ process_misc_ino_types_blocks(xfs_drfsbno_t totblocks, xfs_ino_t lino, int type) { /* * you can not enforce all misc types have zero data fork blocks - * by checking dino->di_core.di_nblocks because atotblocks (attribute + * by checking dino->di_nblocks because atotblocks (attribute * blocks) are part of nblocks. We must check this later when atotblocks * has been calculated or by doing a simple check that anExtents == 0. * We must also guarantee that totblocks is 0. Thus nblocks checking @@ -1673,28 +1669,28 @@ process_misc_ino_types_blocks(xfs_drfsbno_t totblocks, xfs_ino_t lino, int type) static inline int dinode_fmt( - xfs_dinode_core_t *dinoc) + xfs_dinode_t *dino) { - return be16_to_cpu(dinoc->di_mode) & S_IFMT; + return be16_to_cpu(dino->di_mode) & S_IFMT; } static inline void change_dinode_fmt( - xfs_dinode_core_t *dinoc, + xfs_dinode_t *dino, int new_fmt) { - int mode = be16_to_cpu(dinoc->di_mode); + int mode = be16_to_cpu(dino->di_mode); ASSERT((new_fmt & ~S_IFMT) == 0); mode &= ~S_IFMT; mode |= new_fmt; - dinoc->di_mode = cpu_to_be16(mode); + dino->di_mode = cpu_to_be16(mode); } static int check_dinode_mode_format( - xfs_dinode_core_t *dinoc) + xfs_dinode_t *dinoc) { if (dinoc->di_format >= XFS_DINODE_FMT_UUID) return -1; /* FMT_UUID is not used */ @@ -1731,7 +1727,7 @@ check_dinode_mode_format( static int process_check_sb_inodes( xfs_mount_t *mp, - xfs_dinode_core_t *dinoc, + xfs_dinode_t *dinoc, xfs_ino_t lino, int *type, int *dirty) @@ -1827,17 +1823,16 @@ process_check_inode_sizes( xfs_ino_t lino, int type) { - xfs_dinode_core_t *dinoc = &dino->di_core; - xfs_fsize_t size = be64_to_cpu(dinoc->di_size); + xfs_fsize_t size = be64_to_cpu(dino->di_size); switch (type) { case XR_INO_DIR: if (size <= XFS_DFORK_DSIZE(dino, mp) && - dinoc->di_format != XFS_DINODE_FMT_LOCAL) { + dino->di_format != XFS_DINODE_FMT_LOCAL) { do_warn(_("mismatch between format (%d) and size " "(%lld) in directory ino %llu\n"), - dinoc->di_format, size, lino); + dino->di_format, size, lino); return 1; } if (size > XFS_DIR2_LEAF_OFFSET) { @@ -1907,17 +1902,17 @@ process_check_inode_sizes( static int process_check_inode_forkoff( xfs_mount_t *mp, - xfs_dinode_core_t *dinoc, + xfs_dinode_t *dino, xfs_ino_t lino) { - if (dinoc->di_forkoff == 0) + if (dino->di_forkoff == 0) return 0; - switch (dinoc->di_format) { + switch (dino->di_format) { case XFS_DINODE_FMT_DEV: - if (dinoc->di_forkoff != (roundup(sizeof(xfs_dev_t), 8) >> 3)) { + if (dino->di_forkoff != (roundup(sizeof(xfs_dev_t), 8) >> 3)) { do_warn(_("bad attr fork offset %d in dev inode %llu, " - "should be %d\n"), dinoc->di_forkoff, lino, + "should be %d\n"), dino->di_forkoff, lino, (int)(roundup(sizeof(xfs_dev_t), 8) >> 3)); return 1; } @@ -1925,15 +1920,15 @@ process_check_inode_forkoff( case XFS_DINODE_FMT_LOCAL: /* fall through ... */ case XFS_DINODE_FMT_EXTENTS: /* fall through ... */ case XFS_DINODE_FMT_BTREE: - if (dinoc->di_forkoff >= (XFS_LITINO(mp) >> 3)) { + if (dino->di_forkoff >= (XFS_LITINO(mp) >> 3)) { do_warn(_("bad attr fork offset %d in inode %llu, " - "max=%d\n"), dinoc->di_forkoff, lino, + "max=%d\n"), dino->di_forkoff, lino, XFS_LITINO(mp) >> 3); return 1; } break; default: - do_error(_("unexpected inode format %d\n"), dinoc->di_format); + do_error(_("unexpected inode format %d\n"), dino->di_format); break; } return 0; @@ -1944,24 +1939,24 @@ process_check_inode_forkoff( */ static int process_inode_blocks_and_extents( - xfs_dinode_core_t *dinoc, + xfs_dinode_t *dino, xfs_drfsbno_t nblocks, __uint64_t nextents, __uint64_t anextents, xfs_ino_t lino, int *dirty) { - if (nblocks != be64_to_cpu(dinoc->di_nblocks)) { + if (nblocks != be64_to_cpu(dino->di_nblocks)) { if (!no_modify) { do_warn(_("correcting nblocks for inode %llu, " "was %llu - counted %llu\n"), lino, - be64_to_cpu(dinoc->di_nblocks), nblocks); - dinoc->di_nblocks = cpu_to_be64(nblocks); + be64_to_cpu(dino->di_nblocks), nblocks); + dino->di_nblocks = cpu_to_be64(nblocks); *dirty = 1; } else { do_warn(_("bad nblocks %llu for inode %llu, " "would reset to %llu\n"), - be64_to_cpu(dinoc->di_nblocks), lino, nblocks); + be64_to_cpu(dino->di_nblocks), lino, nblocks); } } @@ -1970,16 +1965,16 @@ process_inode_blocks_and_extents( nextents, lino); return 1; } - if (nextents != be32_to_cpu(dinoc->di_nextents)) { + if (nextents != be32_to_cpu(dino->di_nextents)) { if (!no_modify) { do_warn(_("correcting nextents for inode %llu, " "was %d - counted %llu\n"), lino, - be32_to_cpu(dinoc->di_nextents), nextents); - dinoc->di_nextents = cpu_to_be32(nextents); + be32_to_cpu(dino->di_nextents), nextents); + dino->di_nextents = cpu_to_be32(nextents); *dirty = 1; } else { do_warn(_("bad nextents %d for inode %llu, would reset " - "to %llu\n"), be32_to_cpu(dinoc->di_nextents), + "to %llu\n"), be32_to_cpu(dino->di_nextents), lino, nextents); } } @@ -1989,16 +1984,16 @@ process_inode_blocks_and_extents( anextents, lino); return 1; } - if (anextents != be16_to_cpu(dinoc->di_anextents)) { + if (anextents != be16_to_cpu(dino->di_anextents)) { if (!no_modify) { do_warn(_("correcting anextents for inode %llu, " "was %d - counted %llu\n"), lino, - be16_to_cpu(dinoc->di_anextents), anextents); - dinoc->di_anextents = cpu_to_be16(anextents); + be16_to_cpu(dino->di_anextents), anextents); + dino->di_anextents = cpu_to_be16(anextents); *dirty = 1; } else { do_warn(_("bad anextents %d for inode %llu, would reset" - " to %llu\n"), be16_to_cpu(dinoc->di_anextents), + " to %llu\n"), be16_to_cpu(dino->di_anextents), lino, anextents); } } @@ -2021,19 +2016,18 @@ process_inode_data_fork( blkmap_t **dblkmap, int check_dups) { - xfs_dinode_core_t *dinoc = &dino->di_core; xfs_ino_t lino = XFS_AGINO_TO_INO(mp, agno, ino); int err = 0; - *nextents = be32_to_cpu(dinoc->di_nextents); - if (*nextents > be64_to_cpu(dinoc->di_nblocks)) + *nextents = be32_to_cpu(dino->di_nextents); + if (*nextents > be64_to_cpu(dino->di_nblocks)) *nextents = 1; - if (dinoc->di_format != XFS_DINODE_FMT_LOCAL && type != XR_INO_RTDATA) + if (dino->di_format != XFS_DINODE_FMT_LOCAL && type != XR_INO_RTDATA) *dblkmap = blkmap_alloc(*nextents, XFS_DATA_FORK); *nextents = 0; - switch (dinoc->di_format) { + switch (dino->di_format) { case XFS_DINODE_FMT_LOCAL: err = process_lclinode(mp, agno, ino, dino, XFS_DATA_FORK); *totblocks = 0; @@ -2053,7 +2047,7 @@ process_inode_data_fork( break; default: do_error(_("unknown format %d, ino %llu (mode = %d)\n"), - dinoc->di_format, lino, be16_to_cpu(dinoc->di_mode)); + dino->di_format, lino, be16_to_cpu(dino->di_mode)); } if (err) { @@ -2071,7 +2065,7 @@ process_inode_data_fork( * re-process data fork to set bitmap since the * bitmap wasn't set the first time through */ - switch (dinoc->di_format) { + switch (dino->di_format) { case XFS_DINODE_FMT_LOCAL: err = process_lclinode(mp, agno, ino, dino, XFS_DATA_FORK); @@ -2091,8 +2085,8 @@ process_inode_data_fork( break; default: do_error(_("unknown format %d, ino %llu (mode = %d)\n"), - dinoc->di_format, lino, - be16_to_cpu(dinoc->di_mode)); + dino->di_format, lino, + be16_to_cpu(dino->di_mode)); } if (no_modify && err != 0) @@ -2120,7 +2114,6 @@ process_inode_attr_fork( int extra_attr_check, int *retval) { - xfs_dinode_core_t *dinoc = &dino->di_core; xfs_ino_t lino = XFS_AGINO_TO_INO(mp, agno, ino); blkmap_t *ablkmap = NULL; int repair = 0; @@ -2128,12 +2121,12 @@ process_inode_attr_fork( if (!XFS_DFORK_Q(dino)) { *anextents = 0; - if (dinoc->di_aformat != XFS_DINODE_FMT_EXTENTS) { + if (dino->di_aformat != XFS_DINODE_FMT_EXTENTS) { do_warn(_("bad attribute format %d in inode %llu, "), - dinoc->di_aformat, lino); + dino->di_aformat, lino); if (!no_modify) { do_warn(_("resetting value\n")); - dinoc->di_aformat = XFS_DINODE_FMT_EXTENTS; + dino->di_aformat = XFS_DINODE_FMT_EXTENTS; *dirty = 1; } else do_warn(_("would reset value\n")); @@ -2141,11 +2134,11 @@ process_inode_attr_fork( return 0; } - *anextents = be16_to_cpu(dinoc->di_anextents); - if (*anextents > be64_to_cpu(dinoc->di_nblocks)) + *anextents = be16_to_cpu(dino->di_anextents); + if (*anextents > be64_to_cpu(dino->di_nblocks)) *anextents = 1; - switch (dinoc->di_aformat) { + switch (dino->di_aformat) { case XFS_DINODE_FMT_LOCAL: *anextents = 0; *atotblocks = 0; @@ -2167,7 +2160,7 @@ process_inode_attr_fork( break; default: do_warn(_("illegal attribute format %d, ino %llu\n"), - dinoc->di_aformat, lino); + dino->di_aformat, lino); err = 1; break; } @@ -2187,7 +2180,7 @@ process_inode_attr_fork( if (delete_attr_ok) { do_warn(_(", clearing attr fork\n")); *dirty += clear_dinode_attr(mp, dino, lino); - dinoc->di_aformat = XFS_DINODE_FMT_LOCAL; + dino->di_aformat = XFS_DINODE_FMT_LOCAL; } else { do_warn("\n"); *dirty += clear_dinode(mp, dino, lino); @@ -2206,7 +2199,7 @@ process_inode_attr_fork( } if (check_dups) { - switch (dinoc->di_aformat) { + switch (dino->di_aformat) { case XFS_DINODE_FMT_LOCAL: err = process_lclinode(mp, agno, ino, dino, XFS_ATTR_FORK); @@ -2223,7 +2216,7 @@ process_inode_attr_fork( break; default: do_error(_("illegal attribute fmt %d, ino %llu\n"), - dinoc->di_aformat, lino); + dino->di_aformat, lino); } if (no_modify && err != 0) { @@ -2247,7 +2240,7 @@ process_inode_attr_fork( /* clear attributes if not done already */ if (!no_modify) { *dirty += clear_dinode_attr(mp, dino, lino); - dinoc->di_aformat = XFS_DINODE_FMT_LOCAL; + dino->di_aformat = XFS_DINODE_FMT_LOCAL; } else { do_warn(_("would clear attr fork\n")); } @@ -2270,18 +2263,18 @@ process_inode_attr_fork( static int process_check_inode_nlink_version( - xfs_dinode_core_t *dinoc, + xfs_dinode_t *dino, xfs_ino_t lino) { int dirty = 0; - if (dinoc->di_version > XFS_DINODE_VERSION_1 && !fs_inode_nlink) { + if (dino->di_version > 1 && !fs_inode_nlink) { /* * do we have a fs/inode version mismatch with a valid * version 2 inode here that has to stay version 2 or * lose links? */ - if (be32_to_cpu(dinoc->di_nlink) > XFS_MAXLINK_1) { + if (be32_to_cpu(dino->di_nlink) > XFS_MAXLINK_1) { /* * yes. are nlink inodes allowed? */ @@ -2311,17 +2304,17 @@ process_check_inode_nlink_version( if (!no_modify) { do_warn(_("converting back to version 1,\n" "this may destroy %d links\n"), - be32_to_cpu(dinoc->di_nlink) - + be32_to_cpu(dino->di_nlink) - XFS_MAXLINK_1); - dinoc->di_version = XFS_DINODE_VERSION_1; - dinoc->di_nlink = cpu_to_be32(XFS_MAXLINK_1); - dinoc->di_onlink = cpu_to_be16(XFS_MAXLINK_1); + dino->di_version = 1; + dino->di_nlink = cpu_to_be32(XFS_MAXLINK_1); + dino->di_onlink = cpu_to_be16(XFS_MAXLINK_1); dirty = 1; } else { do_warn(_("would convert back to version 1,\n" "\tthis might destroy %d links\n"), - be32_to_cpu(dinoc->di_nlink) - + be32_to_cpu(dino->di_nlink) - XFS_MAXLINK_1); } } @@ -2337,9 +2330,9 @@ process_check_inode_nlink_version( do_warn(_("found version 2 inode %llu, "), lino); if (!no_modify) { do_warn(_("converting back to version 1\n")); - dinoc->di_version = XFS_DINODE_VERSION_1; - dinoc->di_onlink = cpu_to_be16( - be32_to_cpu(dinoc->di_nlink)); + dino->di_version = 1; + dino->di_onlink = cpu_to_be16( + be32_to_cpu(dino->di_nlink)); dirty = 1; } else { do_warn(_("would convert back to version 1\n")); @@ -2352,18 +2345,18 @@ process_check_inode_nlink_version( * to stay a version 2 inode. it should have a zero * onlink field, so clear it. */ - if (dinoc->di_version > XFS_DINODE_VERSION_1 && - dinoc->di_onlink != 0 && fs_inode_nlink > 0) { + if (dino->di_version > 1 && + dino->di_onlink != 0 && fs_inode_nlink > 0) { if (!no_modify) { do_warn(_("clearing obsolete nlink field in " "version 2 inode %llu, was %d, now 0\n"), - lino, be16_to_cpu(dinoc->di_onlink)); - dinoc->di_onlink = 0; + lino, be16_to_cpu(dino->di_onlink)); + dino->di_onlink = 0; dirty = 1; } else { do_warn(_("would clear obsolete nlink field in " "version 2 inode %llu, currently %d\n"), - lino, be16_to_cpu(dinoc->di_onlink)); + lino, be16_to_cpu(dino->di_onlink)); } } return dirty; @@ -2398,7 +2391,6 @@ process_dinode_int(xfs_mount_t *mp, { xfs_drfsbno_t totblocks = 0; xfs_drfsbno_t atotblocks = 0; - xfs_dinode_core_t *dinoc; int di_mode; int type; int retval = 0; @@ -2413,9 +2405,8 @@ process_dinode_int(xfs_mount_t *mp, *used = is_used; type = XR_INO_UNKNOWN; - dinoc = &dino->di_core; lino = XFS_AGINO_TO_INO(mp, agno, ino); - di_mode = be16_to_cpu(dinoc->di_mode); + di_mode = be16_to_cpu(dino->di_mode); /* * if in verify mode, don't modify the inode. @@ -2431,35 +2422,33 @@ process_dinode_int(xfs_mount_t *mp, */ ASSERT(uncertain == 0 || verify_mode != 0); - if (be16_to_cpu(dinoc->di_magic) != XFS_DINODE_MAGIC) { + if (be16_to_cpu(dino->di_magic) != XFS_DINODE_MAGIC) { retval = 1; if (!uncertain) do_warn(_("bad magic number 0x%x on inode %llu%c"), - be16_to_cpu(dinoc->di_magic), lino, + be16_to_cpu(dino->di_magic), lino, verify_mode ? '\n' : ','); if (!verify_mode) { if (!no_modify) { do_warn(_(" resetting magic number\n")); - dinoc->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); + dino->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); *dirty = 1; } else do_warn(_(" would reset magic number\n")); } } - if (!XFS_DINODE_GOOD_VERSION(dinoc->di_version) || - (!fs_inode_nlink && dinoc->di_version > XFS_DINODE_VERSION_1)) { + if (!XFS_DINODE_GOOD_VERSION(dino->di_version) || + (!fs_inode_nlink && dino->di_version > 1)) { retval = 1; if (!uncertain) do_warn(_("bad version number 0x%x on inode %llu%c"), - (__s8)dinoc->di_version, lino, + (__s8)dino->di_version, lino, verify_mode ? '\n' : ','); if (!verify_mode) { if (!no_modify) { do_warn(_(" resetting version number\n")); - dinoc->di_version = (fs_inode_nlink) ? - XFS_DINODE_VERSION_2 : - XFS_DINODE_VERSION_1; + dino->di_version = (fs_inode_nlink) ? 2 : 1; *dirty = 1; } else do_warn(_(" would reset version number\n")); @@ -2469,10 +2458,10 @@ process_dinode_int(xfs_mount_t *mp, /* * blow out of here if the inode size is < 0 */ - if ((xfs_fsize_t)be64_to_cpu(dinoc->di_size) < 0) { + if ((xfs_fsize_t)be64_to_cpu(dino->di_size) < 0) { if (!uncertain) do_warn(_("bad (negative) size %lld on inode %llu\n"), - be64_to_cpu(dinoc->di_size), lino); + be64_to_cpu(dino->di_size), lino); if (verify_mode) return 1; goto clear_bad_out; @@ -2522,7 +2511,7 @@ process_dinode_int(xfs_mount_t *mp, * free inodes since technically any format is legal * as we reset the inode when we re-use it. */ - if (di_mode != 0 && check_dinode_mode_format(dinoc) != 0) { + if (di_mode != 0 && check_dinode_mode_format(dino) != 0) { if (!uncertain) do_warn(_("bad inode format in inode %llu\n"), lino); if (verify_mode) @@ -2552,7 +2541,7 @@ process_dinode_int(xfs_mount_t *mp, *isa_dir = 1; break; case S_IFREG: - if (be16_to_cpu(dinoc->di_flags) & XFS_DIFLAG_REALTIME) + if (be16_to_cpu(dino->di_flags) & XFS_DIFLAG_REALTIME) type = XR_INO_RTDATA; else if (lino == mp->m_sb.sb_rbmino) type = XR_INO_RTBITMAP; @@ -2585,27 +2574,27 @@ process_dinode_int(xfs_mount_t *mp, /* * type checks for superblock inodes */ - if (process_check_sb_inodes(mp, dinoc, lino, &type, dirty) != 0) + if (process_check_sb_inodes(mp, dino, lino, &type, dirty) != 0) goto clear_bad_out; /* * only regular files with REALTIME or EXTSIZE flags set can have * extsize set, or directories with EXTSZINHERIT. */ - if (be32_to_cpu(dinoc->di_extsize) != 0) { + if (be32_to_cpu(dino->di_extsize) != 0) { if ((type == XR_INO_RTDATA) || - (type == XR_INO_DIR && (be16_to_cpu(dinoc->di_flags) & + (type == XR_INO_DIR && (be16_to_cpu(dino->di_flags) & XFS_DIFLAG_EXTSZINHERIT)) || - (type == XR_INO_DATA && (be16_to_cpu(dinoc->di_flags) & + (type == XR_INO_DATA && (be16_to_cpu(dino->di_flags) & XFS_DIFLAG_EXTSIZE))) { /* s'okay */ ; } else { do_warn(_("bad non-zero extent size %u for " "non-realtime/extsize inode %llu, "), - be32_to_cpu(dinoc->di_extsize), lino); + be32_to_cpu(dino->di_extsize), lino); if (!no_modify) { do_warn(_("resetting to zero\n")); - dinoc->di_extsize = 0; + dino->di_extsize = 0; *dirty = 1; } else do_warn(_("would reset to zero\n")); @@ -2621,7 +2610,7 @@ process_dinode_int(xfs_mount_t *mp, /* * check for illegal values of forkoff */ - if (process_check_inode_forkoff(mp, dinoc, lino) != 0) + if (process_check_inode_forkoff(mp, dino, lino) != 0) goto clear_bad_out; /* @@ -2649,7 +2638,7 @@ process_dinode_int(xfs_mount_t *mp, /* * correct space counters if required */ - if (process_inode_blocks_and_extents(dinoc, totblocks + atotblocks, + if (process_inode_blocks_and_extents(dino, totblocks + atotblocks, nextents, anextents, lino, dirty) != 0) goto clear_bad_out; @@ -2687,7 +2676,7 @@ process_dinode_int(xfs_mount_t *mp, * just leave nlinks alone. even if it's set wrong, * it'll be reset when read in. */ - *dirty += process_check_inode_nlink_version(dinoc, lino); + *dirty += process_check_inode_nlink_version(dino, lino); return retval; diff --git a/repair/dir.c b/repair/dir.c index 6e0d54b..3c44132 100644 --- a/repair/dir.c +++ b/repair/dir.c @@ -107,7 +107,7 @@ process_shortform_dir( sf = (xfs_dir_shortform_t *)XFS_DFORK_DPTR(dip); max_size = XFS_DFORK_DSIZE(dip, mp); num_entries = sf->hdr.count; - ino_dir_size = be64_to_cpu(dip->di_core.di_size); + ino_dir_size = be64_to_cpu(dip->di_size); *repair = 0; ASSERT(ino_dir_size <= max_size); @@ -338,7 +338,7 @@ process_shortform_dir( if (!no_modify) { tmp_elen = xfs_dir_sf_entsize_byentry(sf_entry); - be64_add_cpu(&dip->di_core.di_size, -tmp_elen); + be64_add_cpu(&dip->di_size, -tmp_elen); ino_dir_size -= tmp_elen; tmp_sfe = (xfs_dir_sf_entry_t *) @@ -425,7 +425,7 @@ process_shortform_dir( ino, (__int64_t) ino_dir_size, (__int64_t)((__psint_t) next_sfe - (__psint_t) sf)); - dip->di_core.di_size = cpu_to_be64((__psint_t)next_sfe + dip->di_size = cpu_to_be64((__psint_t)next_sfe - (__psint_t)sf); *dino_dirty = 1; *repair = 1; @@ -954,7 +954,7 @@ get_first_dblock_fsbno(xfs_mount_t *mp, return(fsbno); } - if (be64_to_cpu(dino->di_core.di_size) <= XFS_LBSIZE(mp)) + if (be64_to_cpu(dino->di_size) <= XFS_LBSIZE(mp)) return(fsbno); do { @@ -2551,7 +2551,7 @@ process_node_dir( /* * sanity check inode size */ - if (be64_to_cpu(dip->di_core.di_size) < + if (be64_to_cpu(dip->di_size) < (da_cursor.greatest_bno + 1) * mp->m_sb.sb_blocksize) { if ((xfs_fsize_t) da_cursor.greatest_bno * mp->m_sb.sb_blocksize > UINT_MAX) { @@ -2565,9 +2565,9 @@ process_node_dir( _("setting directory inode (%llu) size to %llu bytes, was %lld bytes\n"), ino, (xfs_dfiloff_t) (da_cursor.greatest_bno + 1) * mp->m_sb.sb_blocksize, - be64_to_cpu(dip->di_core.di_size)); + be64_to_cpu(dip->di_size)); - dip->di_core.di_size = cpu_to_be64((da_cursor.greatest_bno + 1) + dip->di_size = cpu_to_be64((da_cursor.greatest_bno + 1) * mp->m_sb.sb_blocksize); } return(0); @@ -2709,13 +2709,13 @@ process_dir( * is only called ONCE so all the subordinate routines will * fix '.' and junk '..' if they're bogus. */ - if (be64_to_cpu(dip->di_core.di_size) <= XFS_DFORK_DSIZE(dip, mp)) { + if (be64_to_cpu(dip->di_size) <= XFS_DFORK_DSIZE(dip, mp)) { dot = 1; dotdot = 1; if (process_shortform_dir(mp, ino, dip, ino_discovery, dino_dirty, parent, dirname, &repair)) res = 1; - } else if (be64_to_cpu(dip->di_core.di_size) <= XFS_LBSIZE(mp)) { + } else if (be64_to_cpu(dip->di_size) <= XFS_LBSIZE(mp)) { if (process_leaf_dir(mp, ino, dip, ino_discovery, dino_dirty, blkmap, &dot, &dotdot, parent, dirname, &repair)) diff --git a/repair/dir2.c b/repair/dir2.c index d0739fd..780f5cd 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -810,7 +810,7 @@ process_sf_dir2_fixoff( xfs_dir2_sf_entry_t *sfep; xfs_dir2_sf_t *sfp; - sfp = &dip->di_u.di_dir2sf; + sfp = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); sfep = xfs_dir2_sf_firstentry(sfp); offset = XFS_DIR2_DATA_FIRST_OFFSET; @@ -862,10 +862,10 @@ process_sf_dir2( xfs_dir2_sf_entry_t *tmp_sfep; xfs_ino_t zero = 0; - sfp = &dip->di_u.di_dir2sf; + sfp = (xfs_dir2_sf_t *)XFS_DFORK_DPTR(dip); max_size = XFS_DFORK_DSIZE(dip, mp); num_entries = sfp->hdr.count; - ino_dir_size = be64_to_cpu(dip->di_core.di_size); + ino_dir_size = be64_to_cpu(dip->di_size); offset = XFS_DIR2_DATA_FIRST_OFFSET; bad_offset = *repair = 0; @@ -1101,7 +1101,7 @@ process_sf_dir2( if (!no_modify) { tmp_elen = xfs_dir2_sf_entsize_byentry(sfp, sfep); - be64_add_cpu(&dip->di_core.di_size, -tmp_elen); + be64_add_cpu(&dip->di_size, -tmp_elen); ino_dir_size -= tmp_elen; tmp_sfep = (xfs_dir2_sf_entry_t *) @@ -1209,7 +1209,7 @@ process_sf_dir2( (__int64_t)((__psint_t)next_sfep - (__psint_t)sfp)); - dip->di_core.di_size = cpu_to_be64( + dip->di_size = cpu_to_be64( (__psint_t)next_sfep - (__psint_t)sfp); *dino_dirty = 1; *repair = 1; @@ -2073,20 +2073,20 @@ process_dir2( */ if (blkmap) last = blkmap_last_off(blkmap); - if (be64_to_cpu(dip->di_core.di_size) <= XFS_DFORK_DSIZE(dip, mp) && - dip->di_core.di_format == XFS_DINODE_FMT_LOCAL) { + if (be64_to_cpu(dip->di_size) <= XFS_DFORK_DSIZE(dip, mp) && + dip->di_format == XFS_DINODE_FMT_LOCAL) { dot = dotdot = 1; res = process_sf_dir2(mp, ino, dip, ino_discovery, dino_dirty, dirname, parent, &repair); } else if (last == mp->m_dirblkfsbs && - (dip->di_core.di_format == XFS_DINODE_FMT_EXTENTS || - dip->di_core.di_format == XFS_DINODE_FMT_BTREE)) { + (dip->di_format == XFS_DINODE_FMT_EXTENTS || + dip->di_format == XFS_DINODE_FMT_BTREE)) { res = process_block_dir2(mp, ino, dip, ino_discovery, dino_dirty, dirname, parent, blkmap, &dot, &dotdot, &repair); } else if (last >= mp->m_dirleafblk + mp->m_dirblkfsbs && - (dip->di_core.di_format == XFS_DINODE_FMT_EXTENTS || - dip->di_core.di_format == XFS_DINODE_FMT_BTREE)) { + (dip->di_format == XFS_DINODE_FMT_EXTENTS || + dip->di_format == XFS_DINODE_FMT_BTREE)) { res = process_leaf_node_dir2(mp, ino, dip, ino_discovery, dirname, parent, blkmap, &dot, &dotdot, &repair, last > mp->m_dirleafblk + mp->m_dirblkfsbs); diff --git a/repair/incore.h b/repair/incore.h index 99853fb..3d7e736 100644 --- a/repair/incore.h +++ b/repair/incore.h @@ -441,6 +441,9 @@ void clear_uncertain_ino_cache(xfs_agnumber_t agno); XFS_INOCF_SET_CF((ino_rec), (ino_offset)), \ XFS_INOBT_CLR_FREE((ino_rec), (ino_offset)) +#define XFS_INOBT_IS_FREE(ino_rec, ino_offset) \ + (((ino_rec)->ir_free & XFS_INOBT_MASK(ino_offset)) != 0) + #define is_inode_used(ino_rec, ino_offset) \ !XFS_INOBT_IS_FREE((ino_rec), (ino_offset)) diff --git a/repair/phase6.c b/repair/phase6.c index d056063..f7ae25e 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -35,7 +35,7 @@ static struct cred zerocr; static struct fsxattr zerofsx; static xfs_ino_t orphanage_ino; -static struct xfs_name xfs_name_dot = {".", 1}; +static struct xfs_name xfs_name_dot = {(unsigned char *)".", 1}; /* * Data structures used to keep track of directories where the ".." @@ -133,7 +133,7 @@ dir_hash_add( __uint32_t addr, xfs_ino_t inum, int namelen, - char *name) + unsigned char *name) { xfs_dahash_t hash = 0; int byaddr; @@ -346,7 +346,7 @@ dir_hash_see_all( static void dir_hash_dup_names(dir_hash_tab_t *hashtab) { - char *name; + unsigned char *name; dir_hash_ent_t *p; if (hashtab->names_duped) @@ -444,11 +444,11 @@ mk_rbmino(xfs_mount_t *mp) error); } - memset(&ip->i_d, 0, sizeof(xfs_dinode_core_t)); + memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); ip->i_d.di_magic = XFS_DINODE_MAGIC; ip->i_d.di_mode = S_IFREG; - ip->i_d.di_version = XFS_DINODE_VERSION_1; + ip->i_d.di_version = 1; ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS; ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; @@ -481,13 +481,13 @@ mk_rbmino(xfs_mount_t *mp) libxfs_trans_ijoin(tp, ip, 0); bno = 0; - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); while (bno < mp->m_sb.sb_rbmblocks) { nmap = XFS_BMAP_MAX_NMAP; error = libxfs_bmapi(tp, ip, bno, (xfs_extlen_t)(mp->m_sb.sb_rbmblocks - bno), XFS_BMAPI_WRITE, &first, mp->m_sb.sb_rbmblocks, - map, &nmap, &flist, NULL); + map, &nmap, &flist); if (error) { do_error( _("couldn't allocate realtime bitmap, error = %d\n"), @@ -543,7 +543,7 @@ fill_rbmino(xfs_mount_t *mp) */ nmap = 1; error = libxfs_bmapi(tp, ip, bno, 1, XFS_BMAPI_WRITE, - &first, 1, &map, &nmap, NULL, NULL); + &first, 1, &map, &nmap, NULL); if (error || nmap != 1) { do_error( _("couldn't map realtime bitmap block %llu, error = %d\n"), @@ -612,7 +612,7 @@ fill_rsumino(xfs_mount_t *mp) */ nmap = 1; error = libxfs_bmapi(tp, ip, bno, 1, XFS_BMAPI_WRITE, - &first, 1, &map, &nmap, NULL, NULL); + &first, 1, &map, &nmap, NULL); if (error || nmap != 1) { do_error( _("couldn't map realtime summary inode block %llu, error = %d\n"), @@ -677,11 +677,11 @@ mk_rsumino(xfs_mount_t *mp) error); } - memset(&ip->i_d, 0, sizeof(xfs_dinode_core_t)); + memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); ip->i_d.di_magic = XFS_DINODE_MAGIC; ip->i_d.di_mode = S_IFREG; - ip->i_d.di_version = XFS_DINODE_VERSION_1; + ip->i_d.di_version = 1; ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS; ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; @@ -708,7 +708,7 @@ mk_rsumino(xfs_mount_t *mp) * from mkfs) */ tp = libxfs_trans_alloc(mp, 0); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); nsumblocks = mp->m_rsumsize >> mp->m_sb.sb_blocklog; if ((error = libxfs_trans_reserve(tp, @@ -720,13 +720,13 @@ mk_rsumino(xfs_mount_t *mp) libxfs_trans_ijoin(tp, ip, 0); bno = 0; - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); while (bno < nsumblocks) { nmap = XFS_BMAP_MAX_NMAP; error = libxfs_bmapi(tp, ip, bno, (xfs_extlen_t)(nsumblocks - bno), XFS_BMAPI_WRITE, &first, nsumblocks, - map, &nmap, &flist, NULL); + map, &nmap, &flist); if (error) { do_error( _("couldn't allocate realtime summary inode, error = %d\n"), @@ -778,11 +778,11 @@ mk_root_dir(xfs_mount_t *mp) /* * take care of the core -- initialization from xfs_ialloc() */ - memset(&ip->i_d, 0, sizeof(xfs_dinode_core_t)); + memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); ip->i_d.di_magic = XFS_DINODE_MAGIC; ip->i_d.di_mode = (__uint16_t) mode|S_IFDIR; - ip->i_d.di_version = XFS_DINODE_VERSION_1; + ip->i_d.di_version = 1; ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS; ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; @@ -843,7 +843,7 @@ mk_orphanage(xfs_mount_t *mp) do_error(_("%d - couldn't iget root inode to obtain %s\n"), i, ORPHANAGE); - xname.name = ORPHANAGE; + xname.name = (unsigned char *)ORPHANAGE; xname.len = strlen(ORPHANAGE); if (libxfs_dir_lookup(NULL, pip, &xname, &ino, NULL) == 0) return ino; @@ -853,7 +853,7 @@ mk_orphanage(xfs_mount_t *mp) */ tp = libxfs_trans_alloc(mp, 0); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); nres = XFS_MKDIR_SPACE_RES(mp, xname.len); if ((i = libxfs_trans_reserve(tp, nres, XFS_MKDIR_LOG_RES(mp), 0, @@ -935,7 +935,7 @@ mv_orphanage( xfs_bmap_free_t flist; int err; int committed; - char fname[MAXPATHLEN + 1]; + unsigned char fname[MAXPATHLEN + 1]; int nres; int incr; ino_tree_node_t *irec; @@ -945,7 +945,7 @@ mv_orphanage( ASSERT(xfs_sb_version_hasdirv2(&mp->m_sb)); xname.name = fname; - xname.len = snprintf(fname, sizeof(fname), "%llu", + xname.len = snprintf((char *)fname, sizeof(fname), "%llu", (unsigned long long)ino); err = libxfs_iget(mp, NULL, orphanage_ino, 0, &orphanage_ip, 0); @@ -957,7 +957,7 @@ mv_orphanage( incr = 0; while (libxfs_dir_lookup(NULL, orphanage_ip, &xname, &entry_ino_num, NULL) == 0) - xname.len = snprintf(fname, sizeof(fname), "%llu.%d", + xname.len = snprintf((char *)fname, sizeof(fname), "%llu.%d", (unsigned long long)ino, ++incr); tp = libxfs_trans_alloc(mp, 0); @@ -989,7 +989,7 @@ mv_orphanage( libxfs_trans_ijoin(tp, orphanage_ip, 0); libxfs_trans_ijoin(tp, ino_p, 0); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); err = libxfs_dir_createname(tp, orphanage_ip, &xname, ino, &first, &flist, nres); if (err) @@ -1033,7 +1033,7 @@ mv_orphanage( libxfs_trans_ijoin(tp, orphanage_ip, 0); libxfs_trans_ijoin(tp, ino_p, 0); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); err = libxfs_dir_createname(tp, orphanage_ip, &xname, ino, &first, &flist, nres); @@ -1090,7 +1090,7 @@ mv_orphanage( libxfs_trans_ijoin(tp, orphanage_ip, 0); libxfs_trans_ijoin(tp, ino_p, 0); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); err = libxfs_dir_createname(tp, orphanage_ip, &xname, ino, &first, &flist, nres); if (err) @@ -1151,7 +1151,7 @@ map_first_dblock_fsbno(xfs_mount_t *mp, nmap = 1; error = libxfs_bmapi(NULL, ip, (xfs_fileoff_t) da_bno, 1, XFS_BMAPI_METADATA, &fblock, 0, - &map, &nmap, NULL, NULL); + &map, &nmap, NULL); if (error || nmap != 1) { if (!no_modify) do_error( @@ -1221,7 +1221,7 @@ _("bad dir/attr magic number in inode %llu, file bno = %u, fsbno = %llu\n"), nmap = 1; error = libxfs_bmapi(NULL, ip, (xfs_fileoff_t) da_bno, 1, XFS_BMAPI_METADATA, &fblock, 0, - &map, &nmap, NULL, NULL); + &map, &nmap, NULL); if (error || nmap != 1) { if (!no_modify) do_error( @@ -1438,7 +1438,7 @@ lf_block_dir_entry_check(xfs_mount_t *mp, */ if (!dir_hash_add(mp, hashtab, (da_bno << mp->m_sb.sb_blocklog) + be16_to_cpu(entry->nameidx), lino, - entry->namelen, (char *)namest->name)) { + entry->namelen, namest->name)) { nbad++; if (entry_junked(_("entry \"%s\" (ino %llu) in dir " "%llu is a duplicate name"), @@ -1606,7 +1606,7 @@ _("bad magic # (0x%x) for dir ino %llu leaf block (bno %u fsbno %llu)\n"), nmap = 1; error = libxfs_bmapi(NULL, ip, (xfs_fileoff_t)da_bno, 1, XFS_BMAPI_METADATA, &fblock, 0, - &map, &nmap, NULL, NULL); + &map, &nmap, NULL); if (error || nmap != 1) { if (!no_modify) do_error( @@ -1678,7 +1678,7 @@ longform_dir2_rebuild( if (pip.i_ino == NULLFSINO) pip.i_ino = mp->m_sb.sb_rootino; - XFS_BMAP_INIT(&flist, &firstblock); + xfs_bmap_init(&flist, &firstblock); tp = libxfs_trans_alloc(mp, 0); nres = XFS_REMOVE_SPACE_RES(mp); @@ -1696,7 +1696,7 @@ longform_dir2_rebuild( /* free all data, leaf, node and freespace blocks */ error = libxfs_bunmapi(tp, ip, 0, lastblock, XFS_BMAPI_METADATA, 0, - &firstblock, &flist, NULL, &done); + &firstblock, &flist, &done); if (error) { do_warn(_("xfs_bunmapi failed -- error - %d\n"), error); libxfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | @@ -1735,7 +1735,7 @@ longform_dir2_rebuild( libxfs_trans_ijoin(tp, ip, 0); libxfs_trans_ihold(tp, ip); - XFS_BMAP_INIT(&flist, &firstblock); + xfs_bmap_init(&flist, &firstblock); error = libxfs_dir_createname(tp, ip, &p->name, p->inum, &firstblock, &flist, nres); if (error) { @@ -1793,7 +1793,7 @@ dir2_kill_block( libxfs_trans_ihold(tp, ip); libxfs_da_bjoin(tp, bp); memset(&args, 0, sizeof(args)); - XFS_BMAP_INIT(&flist, &firstblock); + xfs_bmap_init(&flist, &firstblock); args.dp = ip; args.trans = tp; args.firstblock = &firstblock; @@ -1974,7 +1974,7 @@ longform_dir2_entry_check_data( libxfs_trans_ihold(tp, ip); libxfs_da_bjoin(tp, bp); libxfs_da_bhold(tp, bp); - XFS_BMAP_INIT(&flist, &firstblock); + xfs_bmap_init(&flist, &firstblock); if (be32_to_cpu(d->hdr.magic) != wantmagic) { do_warn(_("bad directory block magic # %#x for directory inode " "%llu block %d: "), @@ -2102,7 +2102,7 @@ longform_dir2_entry_check_data( * check for duplicate names in directory. */ if (!dir_hash_add(mp, hashtab, addr, inum, dep->namelen, - (char *)dep->name)) { + dep->name)) { nbad++; if (entry_junked(_("entry \"%s\" (ino %llu) in dir " "%llu is a duplicate name"), @@ -2724,7 +2724,7 @@ shortform_dir_entry_check(xfs_mount_t *mp, */ if (!dir_hash_add(mp, hashtab, (xfs_dir2_dataptr_t) (sf_entry - &sf->list[0]), lino, - sf_entry->namelen, (char *)sf_entry->name)) { + sf_entry->namelen, sf_entry->name)) { do_warn(_("entry \"%s\" (ino %llu) in dir %llu is a " "duplicate name"), fname, lino, ino); goto do_junkit; @@ -3051,7 +3051,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, */ if (!dir_hash_add(mp, hashtab, (xfs_dir2_dataptr_t) (sfep - xfs_dir2_sf_firstentry(sfp)), - lino, sfep->namelen, (char *)sfep->name)) { + lino, sfep->namelen, sfep->name)) { do_warn(_("entry \"%s\" (ino %llu) in dir %llu is a " "duplicate name"), fname, lino, ino); goto do_junkit; @@ -3397,7 +3397,7 @@ process_dir_inode( libxfs_trans_ijoin(tp, ip, 0); libxfs_trans_ihold(tp, ip); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); error = libxfs_dir_createname(tp, ip, &xfs_name_dotdot, ip->i_ino, &first, &flist, nres); @@ -3462,7 +3462,7 @@ process_dir_inode( libxfs_trans_ijoin(tp, ip, 0); libxfs_trans_ihold(tp, ip); - XFS_BMAP_INIT(&flist, &first); + xfs_bmap_init(&flist, &first); error = libxfs_dir_createname(tp, ip, &xfs_name_dot, ip->i_ino, &first, &flist, nres); diff --git a/repair/prefetch.c b/repair/prefetch.c index a70082f..d2fdf90 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -316,7 +316,7 @@ pf_read_exinode( xfs_dinode_t *dino) { pf_read_bmbt_reclist(args, (xfs_bmbt_rec_t *)XFS_DFORK_DPTR(dino), - be32_to_cpu(dino->di_core.di_nextents)); + be32_to_cpu(dino->di_nextents)); } static void @@ -328,23 +328,21 @@ pf_read_inode_dirs( int icnt = 0; int hasdir = 0; int isadir; - xfs_dinode_core_t *dinoc; for (icnt = 0; icnt < (XFS_BUF_COUNT(bp) >> mp->m_sb.sb_inodelog); icnt++) { - dino = XFS_MAKE_IPTR(mp, bp, icnt); - dinoc = &dino->di_core; + dino = xfs_make_iptr(mp, bp, icnt); /* * We are only prefetching directory contents in extents * and btree nodes for other inodes */ - isadir = (be16_to_cpu(dinoc->di_mode) & S_IFMT) == S_IFDIR; + isadir = (be16_to_cpu(dino->di_mode) & S_IFMT) == S_IFDIR; hasdir |= isadir; - if (dinoc->di_format <= XFS_DINODE_FMT_LOCAL) + if (dino->di_format <= XFS_DINODE_FMT_LOCAL) continue; - if (!isadir && (dinoc->di_format == XFS_DINODE_FMT_EXTENTS || + if (!isadir && (dino->di_format == XFS_DINODE_FMT_EXTENTS || args->dirs_only)) continue; @@ -353,25 +351,24 @@ pf_read_inode_dirs( * its directory data. It's a cut down version of * process_dinode_int() in dinode.c. */ - if (dinoc->di_format > XFS_DINODE_FMT_BTREE) + if (dino->di_format > XFS_DINODE_FMT_BTREE) continue; - if (be16_to_cpu(dinoc->di_magic) != XFS_DINODE_MAGIC) + if (be16_to_cpu(dino->di_magic) != XFS_DINODE_MAGIC) continue; - if (!XFS_DINODE_GOOD_VERSION(dinoc->di_version) || - (!fs_inode_nlink && dinoc->di_version > - XFS_DINODE_VERSION_1)) + if (!XFS_DINODE_GOOD_VERSION(dino->di_version) || + (!fs_inode_nlink && dino->di_version > 1)) continue; - if (be64_to_cpu(dinoc->di_size) <= XFS_DFORK_DSIZE(dino, mp)) + if (be64_to_cpu(dino->di_size) <= XFS_DFORK_DSIZE(dino, mp)) continue; - if ((dinoc->di_forkoff != 0) && - (dinoc->di_forkoff >= (XFS_LITINO(mp) >> 3))) + if ((dino->di_forkoff != 0) && + (dino->di_forkoff >= (XFS_LITINO(mp) >> 3))) continue; - switch (dinoc->di_format) { + switch (dino->di_format) { case XFS_DINODE_FMT_EXTENTS: pf_read_exinode(args, dino); break; diff --git a/repair/rt.c b/repair/rt.c index 7645128..d6ecd56 100644 --- a/repair/rt.c +++ b/repair/rt.c @@ -193,7 +193,7 @@ process_rtbitmap(xfs_mount_t *mp, extno = 0; error = 0; - end_bmbno = howmany(be64_to_cpu(dino->di_core.di_size), + end_bmbno = howmany(be64_to_cpu(dino->di_size), mp->m_sb.sb_blocksize); for (bmbno = 0; bmbno < end_bmbno; bmbno++) { -- 1.7.2.3 From karn@ka9q.net Mon Jan 10 04:56:25 2011 X-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 (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p0AAuOjB236972 for ; Mon, 10 Jan 2011 04:56:25 -0600 X-ASG-Debug-ID: 1294657115-726202bc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from homer.ka9q.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 29CBB1D1E6CA for ; Mon, 10 Jan 2011 02:58:35 -0800 (PST) Received: from homer.ka9q.net (homer.ka9q.net [75.60.237.89]) by cuda.sgi.com with ESMTP id 2S8EYCbjjtwxE1rp for ; Mon, 10 Jan 2011 02:58:35 -0800 (PST) Received: from [192.168.2.14] (helo=maggie.local) by homer.ka9q.net with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.72) (envelope-from ) id 1PcFSL-0000ZO-5m; Mon, 10 Jan 2011 02:58:33 -0800 Message-ID: <4D2AE656.6090807@ka9q.net> Date: Mon, 10 Jan 2011 02:58:30 -0800 From: Phil Karn 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: Dave Chinner CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: realtime partition support? Subject: Re: realtime partition support? References: <4D2724E0.9020801@philkarn.net> <20110108021728.GA28803@dastard> <4D27E11F.4030607@philkarn.net> <20110110003506.GE28803@dastard> In-Reply-To: <20110110003506.GE28803@dastard> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: homer.ka9q.net[75.60.237.89] X-Barracuda-Start-Time: 1294657116 X-Barracuda-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.51965 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 1/9/11 4:35 PM, Dave Chinner wrote: > Which often does not require IO because the path and inodes are > cached in memory. I'm thinking mainly of rapid file creation or deletion, such as tar xjf linux-2.6.37.tar.bz2 rm -rf linux-2.6.37 Most of the paths are likely cached, yes, but a lot of inodes are being rapidly created or deleted so there's a lot of log activity. > Not that much more quickly, because XFS uses readahead to hide a lot > of the directory traversal IO latency when it is not cached.... > As has already been suggested, "-o delaylog" is the solution to that > problem. Thanks for the suggestion. I hadn't even heard of delaylog until the other day as it's not in the manual page. I just tried it, and 'tar x' now completes far more quickly. But the output rate shown by 'vmstat' is still rather low, and it takes a very long time (minutes) for a subsequent 'sync' or 'umount' command to finish. And just now my system has deadlocked. The CPUs are all idle, there's no disk I/O, and commands referencing that filesystem hang. /, /boot and /home, which are on a separate SSD, seem OK. [I just noticed that there doesn't seem to be any checking of options to 'mount -o remount'; anything is silently accepted: $ sudo mount -o rw,remount,relatime,xyzzy,bletch /dev/md0 /big $ mount [....] /dev/md0 on /big type xfs (rw,relatime,xyzzy,bletch) $ Options are checked when explicitly mounting a file system not already mounted.] > >> Turning off the write barrier also speeds things up considerably, but >> that also makes me nervous. My system doesn't have a RAID controller >> with a nonvolatile cache but it is plugged into a UPS (actually a large >> solar power system with a battery bank) so unexpected loss of power is >> unlikely. Can I safely turn off the barrier? > > Should be safe. In 2.6.37 the overhead of barriers is greatly > reduced. IIRC, on most modern hardware they will most likely be > unnoticable, so disabling them is probably not necessary... I'm running stock 2.6.37 and here the effect of barrier/nobarrier on rapid file creation or deletion is dramatic, well over an order of magnitude. With barriers on, "vmstat" shows a bo (block output) rate of only several hundred kB/sec. With nobarrier, it jumps to 5-9 MB/s. This is on a RAID-5 array of four 2TB WDC WD20EARS (advanced format) drives. (The XFS blocksize is 4K, and I was careful to align the partitions on 4K boundaries.) According to hdparm, each drive is running at 3.0 Gb/s, write caching is enabled but multicount is off. The SATA controllers are Intel ICH10 82801JI with the ahci driver. On another system with another WDC drive of the same model connected to a Intel ICH9R 82801IR controller and the ata_piix driver, multicount is set to 16. Could this be because the drives on the first machine are in a RAID array while the second is standalone? Is it safe to change this setting with hdparm to see what happens? From michael.monnerie@is.it-management.at Mon Jan 10 07:23:42 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ADNfF4255265 for ; Mon, 10 Jan 2011 07:23:42 -0600 X-ASG-Debug-ID: 1294665950-7c7c004a0000-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 5E0681484EC7 for ; Mon, 10 Jan 2011 05:25:51 -0800 (PST) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id O7HeoFlje3aemEv0 for ; Mon, 10 Jan 2011 05:25: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 8D66D41D; Mon, 10 Jan 2011 14:25:49 +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 40DD9401C2F; Mon, 10 Jan 2011 14:25:48 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: multithread phase 2 Subject: Re: [PATCH] xfs_repair: multithread phase 2 Date: Mon, 10 Jan 2011 14:25:47 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.37-zmi; KDE/4.4.4; x86_64; ; ) Cc: Dave Chinner References: <1294620248-17098-1-git-send-email-david@fromorbit.com> <201101100857.53421@zmi.at> <20110110084122.GF28803@dastard> In-Reply-To: <20110110084122.GF28803@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1650099.Et3F0g51rS"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201101101425.48134@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1294665952 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0005 1.0000 -2.0180 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.51974 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 --nextPart1650099.Et3F0g51rS Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Montag, 10. Januar 2011 Dave Chinner wrote: > Pretty much > every sata disk supports NCQ these days, and default to a depth of > 32, which means we can have 32 concurrent reads in progress at once. > Phase 2 is all synchronous IO, so the only way to hide the IO > latency is to queue work to multiple threads and switch between the > threadsto work on another queue when the current one blocks waiting > for IO. This is interesting. Did you measure this with a rotating single disk?=20 Is the idle time between two synchronous reads bigger than the time=20 needed to move the disk head to another cylinder and read a sector? That=20 takes ~15ms on a normal disk, incredibly long compared to cpu speed.=20 Even with NCQ, the disk would have to swing the head a lot, and just=20 from thinking about it I wouldn't believe that it's faster like this. But I'm sure you tested it so I take it as given that it's like that.=20 Cool improvement, btw :-) =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/ --nextPart1650099.Et3F0g51rS 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) iEYEABECAAYFAk0rCNwACgkQzhSR9xwSCbSyCACdHz+28KANhrkKs8oS88W5NstK Kv0AmgJmVOsY12MjCcTv1vdalkJ3G8cU =WhJO -----END PGP SIGNATURE----- --nextPart1650099.Et3F0g51rS-- From j.fikar@gmail.com Mon Jan 10 09:53:52 2011 X-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, MISSING_HEADERS,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 p0AFrpHL007358 for ; Mon, 10 Jan 2011 09:53:52 -0600 X-ASG-Debug-ID: 1294674961-11ec01cd0000-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 1DB43161DE4C for ; Mon, 10 Jan 2011 07:56:02 -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 eC0GACapXP6UnplK for ; Mon, 10 Jan 2011 07:56:02 -0800 (PST) Received: by wyf22 with SMTP id 22so21411666wyf.26 for ; Mon, 10 Jan 2011 07:56:01 -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:cc:subject:references:in-reply-to :x-enigmail-version:content-type; bh=H5UamiQ7Cd2cKrutqXMVGc4Kkc3FCRte/LFst+n4ZU4=; b=mN+iXhmK7c3aRnaMPobXyzby/WDR9DYtPIWeJtEoqUISk653cOQLPE2c9/fLVBTu71 pJpP0H1NIfYrLH2YPB58N0UmOfKgdvlukqbMTbOAXYSVkyuuBBFKIV0lF7ymIxsukf7Z GcyEA7rY9ZYMvkgWqrTp2MW02WsjwOdhH6T3s= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:reply-to:user-agent:mime-version:cc:subject :references:in-reply-to:x-enigmail-version:content-type; b=gEnOEctVOvK2u+kfZXhQumr6qObFLG7c5eRPkbBQ6mgbN0j/0NQx4pIZmYpqXM8WZO m8a1LAg6p+2yk+qqifTSol9F4/vG/ytetY+OUkrndfAGeF018YztxxfR+OdtBt2/Tcv7 U5oKWs5DZgp7uzF3l3b4cq/JeAo+YHFIq1K68= Received: by 10.216.54.133 with SMTP id i5mr1963245wec.23.1294674909513; Mon, 10 Jan 2011 07:55:09 -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 o33sm14159060wej.37.2011.01.10.07.55.07 (version=SSLv3 cipher=RC4-MD5); Mon, 10 Jan 2011 07:55:08 -0800 (PST) Message-ID: <4D2B2BD6.60800@gmail.com> Date: Mon, 10 Jan 2011 16:55:02 +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 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 References: <4D13648B.8000105@sandeen.net> <4D138457.8020008@gmail.com> <20101229130903.GD1035@infradead.org> In-Reply-To: <20101229130903.GD1035@infradead.org> X-Enigmail-Version: 1.1.2 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enigB2BE0D89FCF0AFFD73513E1A" X-Barracuda-Connect: mail-wy0-f181.google.com[74.125.82.181] X-Barracuda-Start-Time: 1294674964 X-Barracuda-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.44 X-Barracuda-Spam-Status: No, SCORE=-0.44 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, MISSING_HEADERS X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.51984 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.58 MISSING_HEADERS Missing To: header 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) --------------enigB2BE0D89FCF0AFFD73513E1A Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On 12/29/2010 02:09 PM, Christoph Hellwig wrote: > Can you please apply the debug patch below and see what output fsr give= s > with it? the output is: #fsr/xfs_fsr -v -d fsr: cannot stat /dev/mapper/root no rw xfs file systems in mtab: /etc/mtab /dev/mapper/root is really missing, even though mount shows: /dev/mapper/root on / type xfs (rw,noatime,attr2,inode64,logbufs=3D8,logbsize=3D256k,noquota) maybe it gets lost during initrd? easy and dirty fix is ln -s /dev/root /dev/mapper/root but how to fix it for real? Honza --------------enigB2BE0D89FCF0AFFD73513E1A 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/ iEYEARECAAYFAk0rK9oACgkQp4S3GwoQQ3sTlACfdTjgcUYmr9rw7+QtP9x1KU8l racAoOFvHJE01keMiSe2vZu2RmAgyfI0 =O5Pb -----END PGP SIGNATURE----- --------------enigB2BE0D89FCF0AFFD73513E1A-- From gwehrman@sgi.com Mon Jan 10 10:42:17 2011 X-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,MIME_8BIT_HEADER 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 p0AGgHlJ012345 for ; Mon, 10 Jan 2011 10:42:17 -0600 Received: from goalpost.americas.sgi.com (goalpost.americas.sgi.com [128.162.232.54]) by relay1.corp.sgi.com (Postfix) with ESMTP id 42AFC8F846A; Mon, 10 Jan 2011 08:44:27 -0800 (PST) Received: by goalpost.americas.sgi.com (Postfix, from userid 14442) id 6151E26F66; Mon, 10 Jan 2011 10:40:58 -0600 (CST) Date: Mon, 10 Jan 2011 10:40:58 -0600 From: Geoffrey Wehrman To: =?iso-8859-1?Q?Larsen=2C_Tore_H=F8ivaag?= Cc: "xfs@oss.sgi.com" , Alexis Cousein Subject: Re: RedHat, Novell and SGI xfs kernel module api Message-ID: <20110110164058.GC19571@sgi.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.14 (2007-02-12) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Jan 10, 2011 at 08:35:44AM +0000, Larsen, Tore Høivaag wrote: | Hi, | | currently we are purchasing Redhat's ScaleFS, SGI's cxfs, and Novell SLES xfs. | | Having e.g. Redhat XFS play nicely with cxfs client is not trivial. Usually, I have to choose ScaleFS w/lvm2 volumes og RHEL, but if I want cxfs, But I can't have local xvm volumes on 3rd party hw. | | Is there plans to make an effort to making sure the xfs api is common from the vendors and play nicely with each other ? Comments? The community version of XFS is considered the defacto standard. I must compliment the community on doing an excellent job of maintaining on-disk compatibiltiy within XFS as it has evolved. On disk compatibility is really the most critical API to maintain for a filesystem. Novell (and Red Hat) XFS will tend to lag the community top-of-tree XFS some, as they are long life releases based on a fixed kernel version. This somewhat restricts how much code can be backported from top-of-tree XFS. At SGI, we are always working on CXFS to maintain full compatibility with community XFS. CXFS is really just a distributed layer on top of XFS, but we have to ship our own version of XFS with CXFS to provide all of the interfaces requried by CXFS. These interfaces have been removed from community XFS as they have no purpose outside of CXFS which is SGI proprietary software. -- Geoffrey Wehrman SGI Building 10 Office: (651)683-5496 2750 Blue Water Road Fax: (651)683-5098 Eagan, MN 55121 E-mail: gwehrman@sgi.com http://www.sgi.com/products/storage/software/ From BATV+2638a42680a75b1ab578+2696+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 10 12:48:23 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0AImKBo029101 for ; Mon, 10 Jan 2011 12:48:23 -0600 X-ASG-Debug-ID: 1294685432-3ff3004e0000-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 21A19FCDD36 for ; Mon, 10 Jan 2011 10:50:32 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id NDLYxPbRhaq9tIXo for ; Mon, 10 Jan 2011 10:50:32 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PcMp3-0000m6-Pl; Mon, 10 Jan 2011 18:50:29 +0000 Date: Mon, 10 Jan 2011 13:50:29 -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: <20110110185029.GB31325@infradead.org> References: <4D13648B.8000105@sandeen.net> <4D138457.8020008@gmail.com> <20101229130903.GD1035@infradead.org> <4D2B2BD6.60800@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D2B2BD6.60800@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: 1294685433 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, Jan 10, 2011 at 04:55:02PM +0100, Honza Fikar wrote: > On 12/29/2010 02:09 PM, Christoph Hellwig wrote: > > Can you please apply the debug patch below and see what output fsr gives > > with it? > > the output is: > > #fsr/xfs_fsr -v -d > fsr: cannot stat /dev/mapper/root > no rw xfs file systems in mtab: /etc/mtab > > /dev/mapper/root is really missing, even though mount shows: > > /dev/mapper/root on / type xfs > (rw,noatime,attr2,inode64,logbufs=8,logbsize=256k,noquota) > > maybe it gets lost during initrd? > > easy and dirty fix is ln -s /dev/root /dev/mapper/root There's no easy way for xfs to work around the fact that a device listed in /proc/mounts doesn't exist. This might be a fallout of the big dm naming mess that happened due to udev's insistance to be the only authority for device names. I'd recommend to report a bug to your distribution about the missing device name. From BATV+2638a42680a75b1ab578+2696+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 10 12:53:12 2011 X-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 (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p0AIrBPl029335 for ; Mon, 10 Jan 2011 12:53:12 -0600 X-ASG-Debug-ID: 1294685723-5a6503520000-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 4225FFCDDB5 for ; Mon, 10 Jan 2011 10:55:24 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id aspbWQoZ7IzHyClu for ; Mon, 10 Jan 2011 10:55:24 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PcMtm-0001dr-An; Mon, 10 Jan 2011 18:55:22 +0000 Date: Mon, 10 Jan 2011 13:55:22 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: multithread phase 2 Subject: Re: [PATCH] xfs_repair: multithread phase 2 Message-ID: <20110110185522.GC31325@infradead.org> References: <1294620248-17098-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294620248-17098-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: 1294685724 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 except for some trivial nitpicks below, Reviewed-by: Christoph Hellwig Btw, your previous patch used just "repair:" as the Subject prefix, while this one uses xfs_repair. I don't really care about, but we should standardize on one. The more recent usage seems to include the xfs_ prefix. > + scanfunc_bno : scanfunc_cnt, 0, > + (void *)agcnts); no need for the void cast. > +#define SCAN_THREADS 32 this is unused now. > + agcnts = malloc(mp->m_sb.sb_agcount * sizeof(*agcnts)); > + if (!agcnts) { > + do_abort(_("no memory for ag header counts\n")); > + return; > + } > + memset(agcnts, 0, mp->m_sb.sb_agcount * sizeof(*agcnts)); this could use a calloc. > break; > + case PHASE2_THREADS: > + phase2_threads = (int)strtol(val, NULL, 0); > + break; This option also needs to be documented in the man page. Also shouldn't we try to handle errors from strtol? Also maybe strtoul would be a better choice as we certainly don't want a negative number of threads. From BATV+2638a42680a75b1ab578+2696+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 10 13:15:48 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0AJFmAU032807 for ; Mon, 10 Jan 2011 13:15:48 -0600 X-ASG-Debug-ID: 1294687080-5a61035b0000-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 E1B6BFBB7FB for ; Mon, 10 Jan 2011 11:18:00 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id iS7fOO7io8a1qwnk for ; Mon, 10 Jan 2011 11:18:00 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PcNFd-0006Zw-O8; Mon, 10 Jan 2011 19:17:57 +0000 Date: Mon, 10 Jan 2011 14:17:57 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Michael Monnerie , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: multithread phase 2 Subject: Re: [PATCH] xfs_repair: multithread phase 2 Message-ID: <20110110191757.GA25029@infradead.org> References: <1294620248-17098-1-git-send-email-david@fromorbit.com> <201101100857.53421@zmi.at> <20110110084122.GF28803@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110110084122.GF28803@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: 1294687080 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, Jan 10, 2011 at 07:41:22PM +1100, Dave Chinner wrote: > On Mon, Jan 10, 2011 at 08:57:52AM +0100, Michael Monnerie wrote: > > On Montag, 10. Januar 2011 Dave Chinner wrote: > > > This patch uses 32-way threading which results in no noticable > > > slowdown on single SATA drives with NCQ, but results in ~10x > > > reduction in runtime on a 12 disk RAID-0 array. > > > > Is the fixed 32-way number reasonable, or shouldn't that be "number of > > available cpu cores"-way? Why threading when you have a single core cpu? > > Sure, 32-way is reasonable on a single disk and CPU. Pretty much > every sata disk supports NCQ these days, and default to a depth of > 32, which means we can have 32 concurrent reads in progress at once. > Phase 2 is all synchronous IO, so the only way to hide the IO > latency is to queue work to multiple threads and switch between the > threadsto work on another queue when the current one blocks waiting > for IO. The default queue depth for ATA NCQ actually is 31, not 32 for some odd reason. From BATV+2638a42680a75b1ab578+2696+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 10 13:16:16 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0AJGGH8032837 for ; Mon, 10 Jan 2011 13:16:16 -0600 X-ASG-Debug-ID: 1294687108-0c5d00a50000-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 C88C01D1FC0D for ; Mon, 10 Jan 2011 11:18:28 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id WP1rVZdDZODL2cDw for ; Mon, 10 Jan 2011 11:18:28 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PcNG6-0006b4-EY; Mon, 10 Jan 2011 19:18:26 +0000 Date: Mon, 10 Jan 2011 14:18:26 -0500 From: Christoph Hellwig To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: multithread phase 2 Subject: Re: [PATCH] xfs_repair: multithread phase 2 Message-ID: <20110110191826.GB25029@infradead.org> References: <1294620248-17098-1-git-send-email-david@fromorbit.com> <201101100857.53421@zmi.at> <20110110084122.GF28803@dastard> <201101101425.48134@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201101101425.48134@zmi.at> 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: 1294687108 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, Jan 10, 2011 at 02:25:47PM +0100, Michael Monnerie wrote: > On Montag, 10. Januar 2011 Dave Chinner wrote: > > Pretty much > > every sata disk supports NCQ these days, and default to a depth of > > 32, which means we can have 32 concurrent reads in progress at once. > > Phase 2 is all synchronous IO, so the only way to hide the IO > > latency is to queue work to multiple threads and switch between the > > threadsto work on another queue when the current one blocks waiting > > for IO. > > This is interesting. Did you measure this with a rotating single disk? Take a look at the patch description. From BATV+2638a42680a75b1ab578+2696+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 10 13:16:36 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0AJGajN032860 for ; Mon, 10 Jan 2011 13:16:36 -0600 X-ASG-Debug-ID: 1294687128-38a3008e0000-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 06C9D24C93E for ; Mon, 10 Jan 2011 11:18:48 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id GDftRxKlnhyvat9V for ; Mon, 10 Jan 2011 11:18:48 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PcNGS-0006bv-JY; Mon, 10 Jan 2011 19:18:48 +0000 Date: Mon, 10 Jan 2011 14:18:48 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/8] xfs: ensure sync write errors are returned Subject: Re: [PATCH 1/8] xfs: ensure sync write errors are returned Message-ID: <20110110191848.GC25029@infradead.org> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> <1294399825-1157-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294399825-1157-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: 1294687129 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, Jan 07, 2011 at 10:30:18PM +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 > 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 > Reviewed-by: Alex Elder Looks good, Reviewed-by: Christoph Hellwig From BATV+2638a42680a75b1ab578+2696+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 10 13:16:55 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0AJGsQ9032897 for ; Mon, 10 Jan 2011 13:16:55 -0600 X-ASG-Debug-ID: 1294687147-3ff0009d0000-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 77A0BFC4BDA for ; Mon, 10 Jan 2011 11:19:07 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 234ZerhlCejGCPiF for ; Mon, 10 Jan 2011 11:19:07 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PcNGk-0006d6-Qd; Mon, 10 Jan 2011 19:19:06 +0000 Date: Mon, 10 Jan 2011 14:19:06 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/8] xfs: factor common post-write isize handling code Subject: Re: [PATCH 2/8] xfs: factor common post-write isize handling code Message-ID: <20110110191906.GD25029@infradead.org> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> <1294399825-1157-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294399825-1157-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: 1294687147 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+2638a42680a75b1ab578+2696+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 10 13:17:09 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0AJH88s032916 for ; Mon, 10 Jan 2011 13:17:09 -0600 X-ASG-Debug-ID: 1294687160-3fec00aa0000-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 57832FC5A5D for ; Mon, 10 Jan 2011 11:19:21 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id w69BHnE4NHeCU3pM for ; Mon, 10 Jan 2011 11:19:21 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PcNGy-0006e4-M5; Mon, 10 Jan 2011 19:19:20 +0000 Date: Mon, 10 Jan 2011 14:19:20 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/8] xfs: factor post-write newsize updates Subject: Re: [PATCH 3/8] xfs: factor post-write newsize updates Message-ID: <20110110191920.GE25029@infradead.org> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> <1294399825-1157-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294399825-1157-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: 1294687161 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+2638a42680a75b1ab578+2696+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 10 13:20:53 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0AJKr91033447 for ; Mon, 10 Jan 2011 13:20:53 -0600 X-ASG-Debug-ID: 1294687386-0c6700b10000-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 560C01D1F412 for ; Mon, 10 Jan 2011 11:23:06 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id DMllbSlKAvcOhxt6 for ; Mon, 10 Jan 2011 11:23:06 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PcNKb-0007SL-VP; Mon, 10 Jan 2011 19:23:06 +0000 Date: Mon, 10 Jan 2011 14:23:05 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Subject: Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Message-ID: <20110110192305.GF25029@infradead.org> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> <1294399825-1157-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294399825-1157-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: 1294687386 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_ilock(ip, XFS_IOLOCK_EXCL); > + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL); this now takes i_mutex, which will be taken again by generic_file_splice_write. From BATV+2638a42680a75b1ab578+2696+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 10 13:22:32 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0AJMWaY033531 for ; Mon, 10 Jan 2011 13:22:32 -0600 X-ASG-Debug-ID: 1294687484-283e028f0000-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 AA7951D1F425 for ; Mon, 10 Jan 2011 11:24:44 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id j0AdyGiJd59g7E5N for ; Mon, 10 Jan 2011 11:24:44 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PcNMC-0007We-AE; Mon, 10 Jan 2011 19:24:44 +0000 Date: Mon, 10 Jan 2011 14:24:44 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write Subject: Re: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write Message-ID: <20110110192444.GG25029@infradead.org> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> <1294399825-1157-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294399825-1157-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: 1294687484 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_rw_ilock(ip, XFS_ILOCK_EXCL|*iolock); care to use normal spaces before/after operators? (also in a few other places) Otherwise looks good, Reviewed-by: Christoph Hellwig From BATV+2638a42680a75b1ab578+2696+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 10 13:22:58 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0AJMvdP033563 for ; Mon, 10 Jan 2011 13:22:58 -0600 X-ASG-Debug-ID: 1294687510-388e00b00000-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 7FBDD250075 for ; Mon, 10 Jan 2011 11:25:10 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id eHSjVeKlogyUAIer for ; Mon, 10 Jan 2011 11:25:10 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PcNMc-00089x-2O; Mon, 10 Jan 2011 19:25:10 +0000 Date: Mon, 10 Jan 2011 14:25:10 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 6/8] xfs: split buffered IO write path from xfs_file_aio_write Subject: Re: [PATCH 6/8] xfs: split buffered IO write path from xfs_file_aio_write Message-ID: <20110110192510.GH25029@infradead.org> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> <1294399825-1157-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294399825-1157-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: 1294687510 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+2638a42680a75b1ab578+2696+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 10 13:23:50 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0AJNoBO033614 for ; Mon, 10 Jan 2011 13:23:50 -0600 X-ASG-Debug-ID: 1294687562-389100af0000-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 085F5250085 for ; Mon, 10 Jan 2011 11:26:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id D2iYLun8JqwYyS60 for ; Mon, 10 Jan 2011 11:26:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PcNNS-0008By-JH; Mon, 10 Jan 2011 19:26:02 +0000 Date: Mon, 10 Jan 2011 14:26:02 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 7/8] xfs: factor common write setup code Subject: Re: [PATCH 7/8] xfs: factor common write setup code Message-ID: <20110110192602.GI25029@infradead.org> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> <1294399825-1157-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294399825-1157-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: 1294687563 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, Jan 07, 2011 at 10:30:24PM +1100, Dave Chinner wrote: > 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 > Reviewed-by: Alex Elder > --- > fs/xfs/linux-2.6/xfs_file.c | 128 +++++++++++++++++++----------------------- > 1 files changed, 58 insertions(+), 70 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c > index 9ce5e12..d6ff7ff 100644 > --- a/fs/xfs/linux-2.6/xfs_file.c > +++ b/fs/xfs/linux-2.6/xfs_file.c > @@ -620,6 +620,60 @@ out_lock: > } > + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|*iolock); it seems cleaner if we left this in the caller so that locking/unlocking is not spread over N different layers. Either way the patch looks correct, so: Reviewed-by: Christoph Hellwig From BATV+2638a42680a75b1ab578+2696+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 10 13:24:14 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0AJODju033641 for ; Mon, 10 Jan 2011 13:24:13 -0600 X-ASG-Debug-ID: 1294687585-3ff000be0000-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 0E555FCB2A2 for ; Mon, 10 Jan 2011 11:26:25 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id bxlPVStrAoaIIEDq for ; Mon, 10 Jan 2011 11:26:25 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PcNNp-0008Dm-DI; Mon, 10 Jan 2011 19:26:25 +0000 Date: Mon, 10 Jan 2011 14:26:25 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 8/8] xfs: serialise unaligned direct IOs Subject: Re: [PATCH 8/8] xfs: serialise unaligned direct IOs Message-ID: <20110110192625.GJ25029@infradead.org> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> <1294399825-1157-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294399825-1157-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: 1294687586 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+2638a42680a75b1ab578+2696+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 10 14:09:28 2011 X-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 p0AK9Quj036366 for ; Mon, 10 Jan 2011 14:09:28 -0600 X-ASG-Debug-ID: 1294690298-38a9013c0000-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 C32902503D3; Mon, 10 Jan 2011 12:11:38 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id dRGeo0spPkKyigAD; Mon, 10 Jan 2011 12:11:38 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PcO5a-0007tc-1K; Mon, 10 Jan 2011 20:11:38 +0000 Date: Mon, 10 Jan 2011 15:11:38 -0500 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 01/12] xfsprogs: some things aren't all that special Subject: Re: [PATCH 01/12] xfsprogs: some things aren't all that special Message-ID: <20110110201137.GA27277@infradead.org> References: <1293741599.2294.342.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1293741599.2294.342.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: 1294690298 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 30, 2010 at 02:39:59PM -0600, Alex Elder wrote: > 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(). I think Dave's resync of libxfs takes care of that bit. Either way it really should be a separate patch. Also you've stopped overwriting orphanage_ino if it already exists. I don't think this really matters as we won't have two inodes with the same name below the root inode. Either way it should be documented in the changelog. Otherwise the change looks good, Reviewed-by: Christoph Hellwig From BATV+2638a42680a75b1ab578+2696+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 10 14:11:23 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0AKBNoE036706 for ; Mon, 10 Jan 2011 14:11:23 -0600 X-ASG-Debug-ID: 1294690416-629303570000-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 5D7ED250726; Mon, 10 Jan 2011 12:13:36 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id iplkXAjPHWZL1hpT; Mon, 10 Jan 2011 12:13:36 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PcO7T-0007ve-VX; Mon, 10 Jan 2011 20:13:36 +0000 Date: Mon, 10 Jan 2011 15:13:35 -0500 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 02/12] xfsprogs: simplify leading '/' handling in generate_obfuscated_name() Subject: Re: [PATCH 02/12] xfsprogs: simplify leading '/' handling in generate_obfuscated_name() Message-ID: <20110110201335.GB27277@infradead.org> References: <1293741612.2294.354.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1293741612.2294.354.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: 1294690416 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 30, 2010 at 02:40:12PM -0600, Alex Elder wrote: > 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. The actual change looks good to me, but why would we ever have a / in the filename, and if we do why would we treat it special? From aelder@sgi.com Mon Jan 10 14:20:31 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0AKKV1u038486 for ; Mon, 10 Jan 2011 14:20:31 -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 D48593041F4; Mon, 10 Jan 2011 12:22:40 -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); Mon, 10 Jan 2011 14:22:37 -0600 Subject: Re: [PATCH 01/12] xfsprogs: some things aren't all that special From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20110110201137.GA27277@infradead.org> References: <1293741599.2294.342.camel@doink> <20110110201137.GA27277@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Mon, 10 Jan 2011 14:22:36 -0600 Message-ID: <1294690956.5374.48.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 10 Jan 2011 20:22:37.0457 (UTC) FILETIME=[1F602010:01CBB104] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, 2011-01-10 at 15:11 -0500, Christoph Hellwig wrote: > Also you've stopped overwriting orphanage_ino if it already exists. Actually, I had noticed I did more (or worse) than just that. Once orphanage_ino has been saved, my change no longer says it should avoid obfuscating it. (Or is that what you mean by "overwriting"?) Anyway, I noticed that problem the other day and thought I'd fix it if I had a chance to re-post. Thanks. -Alex From aelder@sgi.com Mon Jan 10 14:22:33 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0AKMXCE038591 for ; Mon, 10 Jan 2011 14:22:33 -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 7BA1A3041F7; Mon, 10 Jan 2011 12:24:46 -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); Mon, 10 Jan 2011 14:23:58 -0600 Subject: Re: [PATCH 02/12] xfsprogs: simplify leading '/' handling in generate_obfuscated_name() From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20110110201335.GB27277@infradead.org> References: <1293741612.2294.354.camel@doink> <20110110201335.GB27277@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Mon, 10 Jan 2011 14:23:57 -0600 Message-ID: <1294691037.5374.49.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 10 Jan 2011 20:23:58.0427 (UTC) FILETIME=[4FA32AB0:01CBB104] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, 2011-01-10 at 15:13 -0500, Christoph Hellwig wrote: > On Thu, Dec 30, 2010 at 02:40:12PM -0600, Alex Elder wrote: > > 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. > > The actual change looks good to me, but why would we ever have a / > in the filename, and if we do why would we treat it special? > This change was preserving the behavior that was there before. I didn't ask that question... It may well be that there's no need to even handle a filename starting with '/', but I didn't follow it back to see. -Alex From ms@citd.de Mon Jan 10 15:52:00 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ALpxGW046742 for ; Mon, 10 Jan 2011 15:52:00 -0600 X-ASG-Debug-ID: 1294696451-38a402a80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from enyo.dsw2k3.info (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 676C32509E3 for ; Mon, 10 Jan 2011 13:54:11 -0800 (PST) Received: from enyo.dsw2k3.info (enyo.dsw2k3.info [195.71.86.239]) by cuda.sgi.com with ESMTP id a6OjR5HZvpDc7E8X for ; Mon, 10 Jan 2011 13:54:11 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by enyo.dsw2k3.info (Postfix) with ESMTP id 3620AA68390; Mon, 10 Jan 2011 22:54:10 +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 enyo.dsw2k3.info Received: from enyo.dsw2k3.info ([127.0.0.1]) by localhost (enyo.dsw2k3.info [127.0.0.1]) (amavisd-new, port 10024) with LMTP id CSWbsUCCWYk7; Mon, 10 Jan 2011 22:53:54 +0100 (CET) Received: from citd.de (p4FC4D0D4.dip.t-dialin.net [79.196.208.212]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (Client did not present a certificate) by enyo.dsw2k3.info (Postfix) with ESMTPSA id 4B8BB98C8F5; Mon, 10 Jan 2011 22:53:53 +0100 (CET) Date: Mon, 10 Jan 2011 22:53:51 +0100 From: Matthias Schniedermeyer To: Christoph Hellwig Cc: Dave Chinner , Michael Monnerie , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: multithread phase 2 Subject: Re: [PATCH] xfs_repair: multithread phase 2 Message-ID: <20110110215351.GA26675@citd.de> References: <1294620248-17098-1-git-send-email-david@fromorbit.com> <201101100857.53421@zmi.at> <20110110084122.GF28803@dastard> <20110110191757.GA25029@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110110191757.GA25029@infradead.org> User-Agent: Mutt/1.5.19 (2009-01-05) X-Barracuda-Connect: enyo.dsw2k3.info[195.71.86.239] X-Barracuda-Start-Time: 1294696452 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-ASG-Whitelist: HEADER (^X-Barracuda-Connect: [^ ]+\.dsw2k3\.info\[) X-Virus-Status: Clean On 10.01.2011 14:17, Christoph Hellwig wrote: > On Mon, Jan 10, 2011 at 07:41:22PM +1100, Dave Chinner wrote: > > On Mon, Jan 10, 2011 at 08:57:52AM +0100, Michael Monnerie wrote: > > > On Montag, 10. Januar 2011 Dave Chinner wrote: > > > > This patch uses 32-way threading which results in no noticable > > > > slowdown on single SATA drives with NCQ, but results in ~10x > > > > reduction in runtime on a 12 disk RAID-0 array. > > > > > > Is the fixed 32-way number reasonable, or shouldn't that be "number of > > > available cpu cores"-way? Why threading when you have a single core cpu? > > > > Sure, 32-way is reasonable on a single disk and CPU. Pretty much > > every sata disk supports NCQ these days, and default to a depth of > > 32, which means we can have 32 concurrent reads in progress at once. > > Phase 2 is all synchronous IO, so the only way to hide the IO > > latency is to queue work to multiple threads and switch between the > > threadsto work on another queue when the current one blocks waiting > > for IO. > > The default queue depth for ATA NCQ actually is 31, not 32 for some odd > reason. AFAIR the original discussion it's because Depth 0 and 32 use the same value. And the knowledge that (HDD-)firmware tends to be buggy, so it was decided to stay on the safe side and not use "0/32". Bis denn -- Real Programmers consider "what you see is what you get" to be just as bad a concept in Text Editors as it is in women. No, the Real Programmer wants a "you asked for it, you got it" text editor -- complicated, cryptic, powerful, unforgiving, dangerous. From SRS0+4CZo+44+fromorbit.com=david@internode.on.net Mon Jan 10 16:24:11 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0AMOAVd048982 for ; Mon, 10 Jan 2011 16:24:11 -0600 X-ASG-Debug-ID: 1294698380-0c5203e50000-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 A349E1D20771 for ; Mon, 10 Jan 2011 14:26:21 -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 SLzxHDmokPXWbbVC for ; Mon, 10 Jan 2011 14:26:21 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 7069975-1927428 for multiple; Tue, 11 Jan 2011 08:56:19 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PcQBu-0006OG-5n; Tue, 11 Jan 2011 09:26:18 +1100 Date: Tue, 11 Jan 2011 09:26:18 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Subject: Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Message-ID: <20110110222618.GG28803@dastard> References: <1294399825-1157-1-git-send-email-david@fromorbit.com> <1294399825-1157-5-git-send-email-david@fromorbit.com> <20110110192305.GF25029@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110110192305.GF25029@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: 1294698382 X-Barracuda-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.52011 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, Jan 10, 2011 at 02:23:05PM -0500, Christoph Hellwig wrote: > > - xfs_ilock(ip, XFS_IOLOCK_EXCL); > > + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL); > > this now takes i_mutex, which will be taken again by > generic_file_splice_write. Ah, oops. I'll revert that bit - I thought we had test coverage of that interface. I guess we need a basic sanity test for this functionality. I'll write one. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+pOxJ+44+fromorbit.com=dave@internode.on.net Mon Jan 10 17:30:25 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ANUP35052713 for ; Mon, 10 Jan 2011 17:30:25 -0600 X-ASG-Debug-ID: 1294702355-403c00070000-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 61428250F24 for ; Mon, 10 Jan 2011 15:32:36 -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 1CyuRTCYOpB8uGyQ for ; Mon, 10 Jan 2011 15:32:36 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 7077316-1927428 for ; Tue, 11 Jan 2011 10:02:34 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcRE0-0006Uo-Jk for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:32:32 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PcRDs-0003v1-Ck for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:32:24 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfstests: add simple splice test Subject: [PATCH] xfstests: add simple splice test Date: Tue, 11 Jan 2011 10:32:24 +1100 Message-Id: <1294702344-15035-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: 1294702357 X-Barracuda-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.52015 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 don't have any coverage of the splice functionality provided by the kernel in xfstests. Add a simple test that uses the sendfile operation built into xfs_io to copy a file ensure we at least execute the code path in xfstests. Signed-off-by: Dave Chinner --- 249 | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 249.out | 2 ++ group | 1 + 3 files changed, 65 insertions(+), 0 deletions(-) create mode 100644 249 create mode 100644 249.out diff --git a/249 b/249 new file mode 100644 index 0000000..6fc972e --- /dev/null +++ b/249 @@ -0,0 +1,62 @@ +#! /bin/bash +# FS QA Test No. 249 +# +# simple splice(2) test. +# +#----------------------------------------------------------------------- +# Copyright (c) 2011 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=dchinner@redhat.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.* + rm -f $SRC $DST + _cleanup_testdir +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_setup_testdir + +echo "Feel the serenity." + +SRC=$TEST_DIR/$seq.src +DST=$TEST_DIR/$seq.dst + +$XFS_IO_PROG -f -c "pwrite -S 0xa5a55a5a 0 32768k" -c fsync $SRC > /dev/null 2>&1 +$XFS_IO_PROG -f -c "sendfile -i $SRC 0 32768k" -c fsync $DST > /dev/null 2>&1 + +diff $SRC $DST + +status=$? +exit diff --git a/249.out b/249.out new file mode 100644 index 0000000..592696f --- /dev/null +++ b/249.out @@ -0,0 +1,2 @@ +QA output created by 249 +Feel the serenity. diff --git a/group b/group index a40c98f..b94f543 100644 --- a/group +++ b/group @@ -362,3 +362,4 @@ deprecated 246 auto quick rw 247 auto quick rw 248 auto quick rw +249 auto quick rw -- 1.7.2.3 From SRS0+Vwyn+44+fromorbit.com=dave@internode.on.net Mon Jan 10 17:35:55 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ANZsGY052921 for ; Mon, 10 Jan 2011 17:35:55 -0600 X-ASG-Debug-ID: 1294702682-029a03890000-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 5D2F5153CFFF for ; Mon, 10 Jan 2011 15:38:02 -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 HOmWpwANNMgiAbZW for ; Mon, 10 Jan 2011 15:38:02 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52135506-1927428 for ; Tue, 11 Jan 2011 10:08:01 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcRJH-0006VL-Ue for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:37:59 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PcRJ9-0003yM-N5 for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:37:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/8] xfs: ensure sync write errors are returned Subject: [PATCH 1/8] xfs: ensure sync write errors are returned Date: Tue, 11 Jan 2011 10:37:41 +1100 Message-Id: <1294702668-15216-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294702668-15216-1-git-send-email-david@fromorbit.com> References: <1294702668-15216-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1294702685 X-Barracuda-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.52016 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_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 Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_file.c | 49 ++++++++++++++++++++---------------------- 1 files changed, 23 insertions(+), 26 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index ba8ad42..10b7fb4 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -574,7 +574,7 @@ xfs_file_aio_write( 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; + ssize_t ret = 0; int ioflags = 0; xfs_fsize_t isize, new_size; int iolock; @@ -590,9 +590,9 @@ xfs_file_aio_write( if (file->f_mode & FMODE_NOCMTIME) ioflags |= IO_INVIS; - error = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); - if (error) - return error; + ret = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); + if (ret) + return ret; count = ocount; if (count == 0) @@ -616,9 +616,9 @@ relock: xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); start: - error = -generic_write_checks(file, &pos, &count, + ret = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); - if (error) { + if (ret) { xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); goto out_unlock_mutex; } @@ -660,8 +660,8 @@ start: */ if (pos > ip->i_size) { - error = xfs_zero_eof(ip, pos, ip->i_size); - if (error) { + ret = -xfs_zero_eof(ip, pos, ip->i_size); + if (ret) { xfs_iunlock(ip, XFS_ILOCK_EXCL); goto out_unlock_internal; } @@ -674,8 +674,8 @@ start: * by root. This keeps people from modifying setuid and * setgid binaries. */ - error = -file_remove_suid(file); - if (unlikely(error)) + ret = file_remove_suid(file); + if (unlikely(ret)) goto out_unlock_internal; /* We can write back this queue in page reclaim */ @@ -684,10 +684,10 @@ start: if ((ioflags & IO_ISDIRECT)) { if (mapping->nrpages) { WARN_ON(need_i_mutex == 0); - error = xfs_flushinval_pages(ip, + ret = -xfs_flushinval_pages(ip, (pos & PAGE_CACHE_MASK), -1, FI_REMAPF_LOCKED); - if (error) + if (ret) goto out_unlock_internal; } @@ -720,24 +720,22 @@ start: } } else { 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, + ret = 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) + if (ret == -ENOSPC && !enospc) { + ret = xfs_flush_pages(ip, 0, -1, 0, FI_NONE); + if (ret) goto out_unlock_internal; enospc = 1; goto write_retry; } - ret = ret2; } current->backing_dev_info = NULL; @@ -753,7 +751,6 @@ write_retry: xfs_iunlock(ip, XFS_ILOCK_EXCL); } - error = -ret; if (ret <= 0) goto out_unlock_internal; @@ -762,23 +759,23 @@ write_retry: /* Handle various SYNC-type writes */ if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) { loff_t end = pos + ret - 1; - int error2; + int error, error2; xfs_iunlock(ip, iolock); if (need_i_mutex) mutex_unlock(&inode->i_mutex); - error2 = filemap_write_and_wait_range(mapping, pos, end); - if (!error) - error = error2; + error = filemap_write_and_wait_range(mapping, pos, end); if (need_i_mutex) mutex_lock(&inode->i_mutex); xfs_ilock(ip, iolock); error2 = -xfs_file_fsync(file, (file->f_flags & __O_SYNC) ? 0 : 1); - if (!error) - error = error2; + if (error) + ret = error; + else if (error2) + ret = error2; } out_unlock_internal: @@ -800,7 +797,7 @@ write_retry: out_unlock_mutex: if (need_i_mutex) mutex_unlock(&inode->i_mutex); - return -error; + return ret; } STATIC int -- 1.7.2.3 From SRS0+N/x4+44+fromorbit.com=dave@internode.on.net Mon Jan 10 17:36:01 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ANa0Wm052940 for ; Mon, 10 Jan 2011 17:36:01 -0600 X-ASG-Debug-ID: 1294702691-40ad003f0000-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 54228250F92 for ; Mon, 10 Jan 2011 15:38:12 -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 qiiR5hlTa0TicA69 for ; Mon, 10 Jan 2011 15:38:12 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52542243-1927428 for ; Tue, 11 Jan 2011 10:08:10 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcRJS-0006VX-1k for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:38:10 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PcRJJ-0003yR-Q9 for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:38:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/8] xfs: factor post-write newsize updates Subject: [PATCH 3/8] xfs: factor post-write newsize updates Date: Tue, 11 Jan 2011 10:37:43 +1100 Message-Id: <1294702668-15216-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294702668-15216-1-git-send-email-david@fromorbit.com> References: <1294702668-15216-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1294702693 X-Barracuda-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.52015 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 Signed-off-by: Dave Chinner Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig --- 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 b3915bf..c47d7dc0 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; } @@ -781,20 +793,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+qjs8+44+fromorbit.com=dave@internode.on.net Mon Jan 10 17:36:01 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ANa1FW052948 for ; Mon, 10 Jan 2011 17:36:01 -0600 X-ASG-Debug-ID: 1294702692-403e00420000-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 AED86250F96 for ; Mon, 10 Jan 2011 15:38:12 -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 908AwHA9ss34NeDo for ; Mon, 10 Jan 2011 15:38:12 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52103852-1927428 for ; Tue, 11 Jan 2011 10:08:11 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcRJS-0006Vb-6X for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:38:10 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PcRJJ-0003ye-Vz for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:38:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 6/8] xfs: split buffered IO write path from xfs_file_aio_write Subject: [PATCH 6/8] xfs: split buffered IO write path from xfs_file_aio_write Date: Tue, 11 Jan 2011 10:37:46 +1100 Message-Id: <1294702668-15216-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294702668-15216-1-git-send-email-david@fromorbit.com> References: <1294702668-15216-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1294702693 X-Barracuda-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.52015 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 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 Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_file.c | 146 ++++++++++++++++++++----------------------- 1 files changed, 69 insertions(+), 77 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 07ab0b6..ccd2959 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -738,58 +738,31 @@ 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 *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; - int ioflags = 0; + ssize_t ret; + int enospc = 0; xfs_fsize_t new_size; - int iolock; - size_t ocount = 0, count; - - 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; - - ret = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); - if (ret) - return ret; - - count = ocount; - if (count == 0) - return 0; - - xfs_wait_for_freeze(mp, SB_FREEZE_WRITE); - - if (XFS_FORCED_SHUTDOWN(mp)) - return -EIO; + size_t count = ocount; -relock: - if (ioflags & IO_ISDIRECT) { - ret = xfs_file_dio_aio_write(iocb, iovp, nr_segs, pos, - ocount, &iolock); - goto done_io; - } - iolock = XFS_IOLOCK_EXCL; + *iolock = XFS_IOLOCK_EXCL; + xfs_rw_ilock(ip, XFS_ILOCK_EXCL | *iolock); - xfs_rw_ilock(ip, XFS_ILOCK_EXCL|iolock); ret = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL | *iolock); + *iolock = 0; return ret; } @@ -797,67 +770,86 @@ relock: 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) { ret = -xfs_zero_eof(ip, pos, ip->i_size); if (ret) { xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); - goto out_unlock_internal; + return ret; } } xfs_rw_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. - */ ret = file_remove_suid(file); if (unlikely(ret)) - goto out_unlock_internal; + return ret; /* We can write back this queue in page reclaim */ current->backing_dev_info = mapping->backing_dev_info; - if (!(ioflags & IO_ISDIRECT)) { - int enospc = 0; - write_retry: - trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, ioflags); - ret = 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 (ret == -ENOSPC && !enospc) { - ret = xfs_flush_pages(ip, 0, -1, 0, FI_NONE); - if (ret) - goto out_unlock_internal; - enospc = 1; - goto write_retry; - } + trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, 0); + ret = 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 (ret == -ENOSPC && !enospc) { + ret = -xfs_flush_pages(ip, 0, -1, 0, FI_NONE); + if (ret) + return ret; + enospc = 1; + goto write_retry; } - current->backing_dev_info = NULL; + return ret; +} + +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; + int iolock; + size_t ocount = 0; + + XFS_STATS_INC(xs_write_calls); + + BUG_ON(iocb->ki_pos != pos); + + ret = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); + if (ret) + return ret; + + 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, &iolock); + else + ret = xfs_file_buffered_aio_write(iocb, iovp, nr_segs, pos, + ocount, &iolock); -done_io: xfs_aio_write_isize_update(inode, &iocb->ki_pos, ret); if (ret <= 0) - goto out_unlock_internal; + goto out_unlock; /* Handle various SYNC-type writes */ if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) { @@ -876,7 +868,7 @@ done_io: ret = error2; } - out_unlock_internal: +out_unlock: xfs_aio_write_newsize_update(ip); xfs_rw_iunlock(ip, iolock); return ret; -- 1.7.2.3 From SRS0+lT6B+44+fromorbit.com=dave@internode.on.net Mon Jan 10 17:36:02 2011 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 p0ANa1CP052949 for ; Mon, 10 Jan 2011 17:36:02 -0600 X-ASG-Debug-ID: 1294702692-4f9600010000-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 0F812153D00F for ; Mon, 10 Jan 2011 15:38:12 -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 Dgka04SGbUBfzr92 for ; Mon, 10 Jan 2011 15:38:12 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51786238-1927428 for ; Tue, 11 Jan 2011 10:08:11 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcRJS-0006Vd-8B for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:38:10 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PcRJK-0003yh-1M for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:38:02 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 7/8] xfs: factor common write setup code Subject: [PATCH 7/8] xfs: factor common write setup code Date: Tue, 11 Jan 2011 10:37:47 +1100 Message-Id: <1294702668-15216-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294702668-15216-1-git-send-email-david@fromorbit.com> References: <1294702668-15216-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1294702694 X-Barracuda-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.52016 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 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 Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_file.c | 123 +++++++++++++++++++----------------------- 1 files changed, 56 insertions(+), 67 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index ccd2959..41f3ceb 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -628,6 +628,58 @@ 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 = 0; + + error = generic_write_checks(file, pos, count, S_ISBLK(inode->i_mode)); + if (error) { + xfs_rw_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); + + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); + if (error) + return error; + + /* + * 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. + */ + return file_remove_suid(file); + +} + +/* * xfs_file_dio_aio_write - handle direct IO writes * * Lock the inode appropriately to prepare for and issue a direct IO write. @@ -652,7 +704,6 @@ xfs_file_dio_aio_write( struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; ssize_t ret = 0; - xfs_fsize_t new_size; size_t count = ocount; struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; @@ -673,45 +724,8 @@ xfs_file_dio_aio_write( *iolock = XFS_IOLOCK_SHARED; xfs_rw_ilock(ip, XFS_ILOCK_EXCL | *iolock); - ret = generic_write_checks(file, &pos, &count, - S_ISBLK(inode->i_mode)); - if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL | *iolock); - *iolock = 0; - return ret; - } - - 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) { - ret = -xfs_zero_eof(ip, pos, ip->i_size); - if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); - return ret; - } - } - xfs_rw_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. - */ - ret = file_remove_suid(file); - if (unlikely(ret)) + ret = xfs_file_aio_write_checks(file, &pos, &count, iolock); + if (ret) return ret; if (mapping->nrpages) { @@ -752,38 +766,13 @@ xfs_file_buffered_aio_write( struct xfs_inode *ip = XFS_I(inode); ssize_t ret; int enospc = 0; - xfs_fsize_t new_size; size_t count = ocount; *iolock = XFS_IOLOCK_EXCL; xfs_rw_ilock(ip, XFS_ILOCK_EXCL | *iolock); - ret = generic_write_checks(file, &pos, &count, - S_ISBLK(inode->i_mode)); - if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL | *iolock); - *iolock = 0; - return ret; - } - - 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) { - ret = -xfs_zero_eof(ip, pos, ip->i_size); - if (ret) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); - return ret; - } - } - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); - - ret = file_remove_suid(file); - if (unlikely(ret)) + ret = xfs_file_aio_write_checks(file, &pos, &count, iolock); + if (ret) return ret; /* We can write back this queue in page reclaim */ -- 1.7.2.3 From SRS0+N/x4+44+fromorbit.com=dave@internode.on.net Mon Jan 10 17:36:03 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ANa2Cu052964 for ; Mon, 10 Jan 2011 17:36:03 -0600 X-ASG-Debug-ID: 1294702693-029a038b0000-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 304ED153D00F for ; Mon, 10 Jan 2011 15:38:14 -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 2Aw9EeCf9dPwFSGg for ; Mon, 10 Jan 2011 15:38:14 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52542244-1927428 for ; Tue, 11 Jan 2011 10:08:11 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcRJH-0006VK-T4 for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:37:59 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PcRJ9-0003yK-Kx for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:37:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/8] xfs: prevent corruption due to overlapping AIO DIO V4 Subject: [PATCH 0/8] xfs: prevent corruption due to overlapping AIO DIO V4 Date: Tue, 11 Jan 2011 10:37:40 +1100 Message-Id: <1294702668-15216-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: 1294702695 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0357 1.0000 -1.7907 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.79 X-Barracuda-Spam-Status: No, SCORE=-1.79 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.52016 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 Version 4 addresses the splice write locking problem Christoph pointed out. It reverts the splice write locking change and adds a comment explaining why and the problems that need fixing. This version passes the recently posted splice sanity test for xfsqa. From SRS0+qjs8+44+fromorbit.com=dave@internode.on.net Mon Jan 10 17:36:08 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ANa7aa052993 for ; Mon, 10 Jan 2011 17:36:07 -0600 X-ASG-Debug-ID: 1294702697-75f801a20000-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 AF5791D20AF5 for ; Mon, 10 Jan 2011 15:38:18 -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 ZJqIGRMJQMxNRriK for ; Mon, 10 Jan 2011 15:38:18 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52810391-1927428 for ; Tue, 11 Jan 2011 10:08:17 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcRJS-0006Vg-A3 for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:38:10 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PcRJK-0003yk-36 for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:38:02 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 8/8] xfs: serialise unaligned direct IOs Subject: [PATCH 8/8] xfs: serialise unaligned direct IOs Date: Tue, 11 Jan 2011 10:37:48 +1100 Message-Id: <1294702668-15216-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294702668-15216-1-git-send-email-david@fromorbit.com> References: <1294702668-15216-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1294702699 X-Barracuda-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.52015 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 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 Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_file.c | 38 ++++++++++++++++++++++++++++---------- 1 files changed, 28 insertions(+), 10 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 41f3ceb..bdb35c4b 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -683,9 +683,24 @@ 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. * + * If there are cached pages or we're extending the file, we need IOLOCK_EXCL + * until we're sure the bytes at the new EOF have been zeroed and/or the cached + * pages are flushed out. + * + * In most cases the direct IO writes will be done holding 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 @iolock and errors indicated by * negative return values. */ @@ -705,6 +720,7 @@ xfs_file_dio_aio_write( struct xfs_mount *mp = ip->i_mount; ssize_t ret = 0; size_t count = ocount; + int unaligned_io = 0; struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; @@ -712,13 +728,10 @@ xfs_file_dio_aio_write( if ((pos & target->bt_smask) || (count & target->bt_smask)) return -XFS_ERROR(EINVAL); - /* - * For direct I/O, if there are cached pages or we're extending - * the file, we need IOLOCK_EXCL until we're sure the bytes at - * the new EOF have been zeroed and/or the cached pages are - * flushed out. - */ - 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; else *iolock = XFS_IOLOCK_SHARED; @@ -736,8 +749,13 @@ xfs_file_dio_aio_write( return ret; } - if (*iolock == XFS_IOLOCK_EXCL) { - /* demote the lock now the cached pages are gone */ + /* + * If we are doing unaligned IO, wait for all other IO to drain, + * otherwise demote the lock if we had to flush cached pages + */ + if (unaligned_io) + xfs_ioend_wait(ip); + else if (*iolock == XFS_IOLOCK_EXCL) { xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); *iolock = XFS_IOLOCK_SHARED; } -- 1.7.2.3 From SRS0+qjs8+44+fromorbit.com=dave@internode.on.net Mon Jan 10 17:36:10 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ANaAl8053012 for ; Mon, 10 Jan 2011 17:36:10 -0600 X-ASG-Debug-ID: 1294702701-403f003b0000-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 38745250F96 for ; Mon, 10 Jan 2011 15:38:22 -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 4B9bXFbrAnYlG1Bp for ; Mon, 10 Jan 2011 15:38:22 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52284165-1927428 for ; Tue, 11 Jan 2011 10:08:20 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcRJH-0006VM-W8 for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:38:00 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PcRJ9-0003yO-PN for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:37:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/8] xfs: factor common post-write isize handling code Subject: [PATCH 2/8] xfs: factor common post-write isize handling code Date: Tue, 11 Jan 2011 10:37:42 +1100 Message-Id: <1294702668-15216-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294702668-15216-1-git-send-email-david@fromorbit.com> References: <1294702668-15216-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1294702703 X-Barracuda-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.52015 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 Signed-off-by: Dave Chinner Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_file.c | 54 ++++++++++++++++++++++-------------------- 1 files changed, 28 insertions(+), 26 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 10b7fb4..b3915bf 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; 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; @@ -740,22 +753,11 @@ 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); if (ret <= 0) goto out_unlock_internal; - XFS_STATS_ADD(xs_write_bytes, ret); - /* Handle various SYNC-type writes */ if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) { loff_t end = pos + ret - 1; -- 1.7.2.3 From SRS0+qjs8+44+fromorbit.com=dave@internode.on.net Mon Jan 10 17:36:13 2011 X-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 (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p0ANaC4s053025 for ; Mon, 10 Jan 2011 17:36:12 -0600 X-ASG-Debug-ID: 1294702702-027b039e0000-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 1539C153D011 for ; Mon, 10 Jan 2011 15:38:22 -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 MLRNdMPcScneI8B3 for ; Mon, 10 Jan 2011 15:38:22 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52810403-1927428 for ; Tue, 11 Jan 2011 10:08:21 +1030 (CDT) Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcRJc-0006VZ-2h for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:38:20 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PcRJJ-0003yb-UL for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:38:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write Subject: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write Date: Tue, 11 Jan 2011 10:37:45 +1100 Message-Id: <1294702668-15216-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294702668-15216-1-git-send-email-david@fromorbit.com> References: <1294702668-15216-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1294702704 X-Barracuda-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.52016 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 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. This also removes the failed direct IO fallback path to buffered IO. XFS handles all direct IO cases without needing to fall back to buffered IO, so we can safely remove this unused path. This greatly simplifies the logic and locking needed in the write path. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_file.c | 179 ++++++++++++++++++++++++++++--------------- 1 files changed, 116 insertions(+), 63 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 941d7c2..07ab0b6 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -627,6 +627,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. + * + * Returns with locks held indicated by @iolock and errors indicated by + * negative return values. + */ +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 *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; + xfs_fsize_t new_size; + size_t count = ocount; + struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? + mp->m_rtdev_targp : mp->m_ddev_targp; + + *iolock = 0; + if ((pos & target->bt_smask) || (count & target->bt_smask)) + return -XFS_ERROR(EINVAL); + + /* + * For direct I/O, if there are cached pages or we're extending + * the file, we need IOLOCK_EXCL until we're sure the bytes at + * the new EOF have been zeroed and/or the cached pages are + * flushed out. + */ + if (mapping->nrpages || pos > ip->i_size) + *iolock = XFS_IOLOCK_EXCL; + else + *iolock = XFS_IOLOCK_SHARED; + xfs_rw_ilock(ip, XFS_ILOCK_EXCL | *iolock); + + ret = generic_write_checks(file, &pos, &count, + S_ISBLK(inode->i_mode)); + if (ret) { + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL | *iolock); + *iolock = 0; + return ret; + } + + 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) { + ret = -xfs_zero_eof(ip, pos, ip->i_size); + if (ret) { + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); + return ret; + } + } + xfs_rw_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. + */ + ret = file_remove_suid(file); + if (unlikely(ret)) + return ret; + + if (mapping->nrpages) { + WARN_ON(*iolock != XFS_IOLOCK_EXCL); + ret = -xfs_flushinval_pages(ip, (pos & PAGE_CACHE_MASK), -1, + FI_REMAPF_LOCKED); + if (ret) + return ret; + } + + if (*iolock == XFS_IOLOCK_EXCL) { + /* demote the lock now the cached pages are gone */ + xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); + *iolock = XFS_IOLOCK_SHARED; + } + + trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0); + ret = generic_file_direct_write(iocb, iovp, + &nr_segs, pos, &iocb->ki_pos, count, ocount); + + /* No fallback to buffered IO on errors for XFS. */ + ASSERT(ret < 0 || ret == count); + return ret; +} + STATIC ssize_t xfs_file_aio_write( struct kiocb *iocb, @@ -669,12 +779,12 @@ xfs_file_aio_write( relock: if (ioflags & IO_ISDIRECT) { - iolock = XFS_IOLOCK_SHARED; - } else { - iolock = XFS_IOLOCK_EXCL; + ret = xfs_file_dio_aio_write(iocb, iovp, nr_segs, pos, + ocount, &iolock); + goto done_io; } + iolock = XFS_IOLOCK_EXCL; -start: xfs_rw_ilock(ip, XFS_ILOCK_EXCL|iolock); ret = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); @@ -683,30 +793,6 @@ start: return ret; } - 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_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); - return XFS_ERROR(-EINVAL); - } - - /* - * For direct I/O, if there are cached pages or we're extending - * the file, we need IOLOCK_EXCL until we're sure the bytes at - * the new EOF have been zeroed and/or the cached pages are - * flushed out. Upgrade the I/O lock and start again. - */ - if (iolock != XFS_IOLOCK_EXCL && - (mapping->nrpages || pos > ip->i_size)) { - xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); - iolock = XFS_IOLOCK_EXCL; - goto start; - } - } - new_size = pos + count; if (new_size > ip->i_size) ip->i_new_size = new_size; @@ -745,41 +831,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(iolock != XFS_IOLOCK_EXCL); - ret = -xfs_flushinval_pages(ip, - (pos & PAGE_CACHE_MASK), - -1, FI_REMAPF_LOCKED); - if (ret) - goto out_unlock_internal; - } - - if (iolock == XFS_IOLOCK_EXCL) { - /* demote the lock now the cached pages are gone */ - xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); - iolock = XFS_IOLOCK_SHARED; - } - - 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_rw_iunlock(ip, iolock); - goto relock; - } - } else { + if (!(ioflags & IO_ISDIRECT)) { int enospc = 0; write_retry: @@ -801,6 +853,7 @@ write_retry: current->backing_dev_info = NULL; +done_io: xfs_aio_write_isize_update(inode, &iocb->ki_pos, ret); if (ret <= 0) -- 1.7.2.3 From SRS0+lT6B+44+fromorbit.com=dave@internode.on.net Mon Jan 10 17:36:12 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ANaCq4053026 for ; Mon, 10 Jan 2011 17:36:12 -0600 X-ASG-Debug-ID: 1294702702-75fe01af0000-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 316611D20AF7 for ; Mon, 10 Jan 2011 15:38:22 -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 jqzrotj4CJDyx0C4 for ; Mon, 10 Jan 2011 15:38:22 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51786252-1927428 for ; Tue, 11 Jan 2011 10:08:21 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcRJS-0006VY-3J for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:38:10 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PcRJJ-0003yZ-S8 for xfs@oss.sgi.com; Tue, 11 Jan 2011 10:38:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Subject: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Date: Tue, 11 Jan 2011 10:37:44 +1100 Message-Id: <1294702668-15216-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294702668-15216-1-git-send-email-david@fromorbit.com> References: <1294702668-15216-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1294702704 X-Barracuda-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.52015 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 need to obtain the i_mutex, i_iolock and i_ilock during the read and write paths. Add a set of wrapper functions to neatly encapsulate the lock ordering and shared/exclusive semantics to make the locking easier to follow and get right. Note that this changes some of the exclusive locking serialisation in that serialisation will occur against the i_mutex instead of the XFS_IOLOCK_EXCL. This does not change any behaviour, and it is arguably more efficient to use the mutex for such serialisation than the rw_sem. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_file.c | 136 ++++++++++++++++++++++++++----------------- 1 files changed, 82 insertions(+), 54 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index c47d7dc0..941d7c2 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -41,6 +41,40 @@ static const struct vm_operations_struct xfs_file_vm_ops; /* + * Locking primitives for read and write IO paths to ensure we consistently use + * and order the inode->i_mutex, ip->i_lock and ip->i_iolock. + */ +static inline void +xfs_rw_ilock( + struct xfs_inode *ip, + int type) +{ + if (type & XFS_IOLOCK_EXCL) + mutex_lock(&VFS_I(ip)->i_mutex); + xfs_ilock(ip, type); +} + +static inline void +xfs_rw_iunlock( + struct xfs_inode *ip, + int type) +{ + xfs_iunlock(ip, type); + if (type & XFS_IOLOCK_EXCL) + mutex_unlock(&VFS_I(ip)->i_mutex); +} + +static inline void +xfs_rw_ilock_demote( + struct xfs_inode *ip, + int type) +{ + xfs_ilock_demote(ip, type); + if (type & XFS_IOLOCK_EXCL) + mutex_unlock(&VFS_I(ip)->i_mutex); +} + +/* * xfs_iozero * * xfs_iozero clears the specified range of buffer supplied, @@ -262,22 +296,21 @@ xfs_file_aio_read( if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; - if (unlikely(ioflags & IO_ISDIRECT)) - mutex_lock(&inode->i_mutex); - xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (unlikely(ioflags & IO_ISDIRECT)) { + xfs_rw_ilock(ip, XFS_IOLOCK_EXCL); + if (inode->i_mapping->nrpages) { ret = -xfs_flushinval_pages(ip, (iocb->ki_pos & PAGE_CACHE_MASK), -1, FI_REMAPF_LOCKED); + if (ret) { + xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); + return ret; + } } - mutex_unlock(&inode->i_mutex); - if (ret) { - xfs_iunlock(ip, XFS_IOLOCK_SHARED); - return ret; - } - } + xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); + } else + xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); trace_xfs_file_read(ip, size, iocb->ki_pos, ioflags); @@ -285,7 +318,7 @@ xfs_file_aio_read( if (ret > 0) XFS_STATS_ADD(xs_read_bytes, ret); - xfs_iunlock(ip, XFS_IOLOCK_SHARED); + xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); return ret; } @@ -309,7 +342,7 @@ xfs_file_splice_read( if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return -EIO; - xfs_ilock(ip, XFS_IOLOCK_SHARED); + xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); trace_xfs_file_splice_read(ip, count, *ppos, ioflags); @@ -317,7 +350,7 @@ xfs_file_splice_read( if (ret > 0) XFS_STATS_ADD(xs_read_bytes, ret); - xfs_iunlock(ip, XFS_IOLOCK_SHARED); + xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); return ret; } @@ -338,10 +371,10 @@ xfs_aio_write_isize_update( *ppos = isize; if (*ppos > ip->i_size) { - xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_rw_ilock(ip, XFS_ILOCK_EXCL); if (*ppos > ip->i_size) ip->i_size = *ppos; - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); } } @@ -356,14 +389,22 @@ xfs_aio_write_newsize_update( struct xfs_inode *ip) { if (ip->i_new_size) { - xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_rw_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_rw_iunlock(ip, XFS_ILOCK_EXCL); } } +/* + * xfs_file_splice_write() does not use xfs_rw_ilock() because + * generic_file_splice_write() takes the i_mutex itself. This, in theory, + * couuld cause lock inversions between the aio_write path and the splice path + * if someone is doing concurrent splice(2) based writes and write(2) based + * writes to the same inode. The only real way to fix this is to re-implement + * the generic code here with correct locking orders. + */ STATIC ssize_t xfs_file_splice_write( struct pipe_inode_info *pipe, @@ -386,14 +427,13 @@ xfs_file_splice_write( if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return -EIO; - xfs_ilock(ip, XFS_IOLOCK_EXCL); + xfs_ilock(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL); new_size = *ppos + count; - xfs_ilock(ip, XFS_ILOCK_EXCL); if (new_size > ip->i_size) ip->i_new_size = new_size; - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); trace_xfs_file_splice_write(ip, count, *ppos, ioflags); @@ -604,7 +644,6 @@ xfs_file_aio_write( xfs_fsize_t new_size; int iolock; size_t ocount = 0, count; - int need_i_mutex; XFS_STATS_INC(xs_write_calls); @@ -631,21 +670,17 @@ xfs_file_aio_write( 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); } - xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); - start: + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|iolock); ret = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); if (ret) { - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); - goto out_unlock_mutex; + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); + return ret; } if (ioflags & IO_ISDIRECT) { @@ -654,16 +689,20 @@ start: mp->m_rtdev_targp : mp->m_ddev_targp; if ((pos & target->bt_smask) || (count & target->bt_smask)) { - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); + xfs_rw_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); + /* + * For direct I/O, if there are cached pages or we're extending + * the file, we need IOLOCK_EXCL until we're sure the bytes at + * the new EOF have been zeroed and/or the cached pages are + * flushed out. Upgrade the I/O lock and start again. + */ + if (iolock != XFS_IOLOCK_EXCL && + (mapping->nrpages || pos > ip->i_size)) { + xfs_rw_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; } } @@ -687,11 +726,11 @@ start: if (pos > ip->i_size) { ret = -xfs_zero_eof(ip, pos, ip->i_size); if (ret) { - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); goto out_unlock_internal; } } - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); /* * If we're writing the file then make sure to clear the @@ -708,7 +747,7 @@ start: if ((ioflags & IO_ISDIRECT)) { if (mapping->nrpages) { - WARN_ON(need_i_mutex == 0); + WARN_ON(iolock != XFS_IOLOCK_EXCL); ret = -xfs_flushinval_pages(ip, (pos & PAGE_CACHE_MASK), -1, FI_REMAPF_LOCKED); @@ -716,13 +755,10 @@ start: goto out_unlock_internal; } - if (need_i_mutex) { + if (iolock == XFS_IOLOCK_EXCL) { /* demote the lock now the cached pages are gone */ - xfs_ilock_demote(ip, XFS_IOLOCK_EXCL); - mutex_unlock(&inode->i_mutex); - + xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); iolock = XFS_IOLOCK_SHARED; - need_i_mutex = 0; } trace_xfs_file_direct_write(ip, count, iocb->ki_pos, ioflags); @@ -740,7 +776,7 @@ start: count -= ret; ioflags &= ~IO_ISDIRECT; - xfs_iunlock(ip, iolock); + xfs_rw_iunlock(ip, iolock); goto relock; } } else { @@ -775,14 +811,9 @@ write_retry: loff_t end = pos + ret - 1; int error, error2; - xfs_iunlock(ip, iolock); - if (need_i_mutex) - mutex_unlock(&inode->i_mutex); - + xfs_rw_iunlock(ip, iolock); error = filemap_write_and_wait_range(mapping, pos, end); - if (need_i_mutex) - mutex_lock(&inode->i_mutex); - xfs_ilock(ip, iolock); + xfs_rw_ilock(ip, iolock); error2 = -xfs_file_fsync(file, (file->f_flags & __O_SYNC) ? 0 : 1); @@ -794,10 +825,7 @@ write_retry: out_unlock_internal: xfs_aio_write_newsize_update(ip); - xfs_iunlock(ip, iolock); - out_unlock_mutex: - if (need_i_mutex) - mutex_unlock(&inode->i_mutex); + xfs_rw_iunlock(ip, iolock); return ret; } -- 1.7.2.3 From ajeet.yadav.77@gmail.com Mon Jan 10 20:18:44 2011 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,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID,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 p0B2IiGL060108 for ; Mon, 10 Jan 2011 20:18:44 -0600 X-ASG-Debug-ID: 1294712456-472602940000-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 D88451D1FB7C for ; Mon, 10 Jan 2011 18:20:56 -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 89icIR9wxUe8QpLc for ; Mon, 10 Jan 2011 18:20:56 -0800 (PST) Received: by qwe5 with SMTP id 5so22579198qwe.26 for ; Mon, 10 Jan 2011 18:20:56 -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=rfo0riKHAzRl6lslZRXRPcPw87rCDmmLFEkNcKvTdno=; b=vlpIVW5uy3dvaqjh8F9UkPyuDiKAJXTvAiZo0hKD5GQ6qkn9FnouUxmF1/ACWKWgpE rmgWDUy5ByAioGva3PactSUmppb8IbZEcEOGEuSxEGZJGEnenq+tDW7BTTb2vVpm4k13 Ltupj7ZJ2faflvC526kw43nvjdK0HdX3nBs0s= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=GrI43G8I7a+ulttAA7moak/PWd/fP31fO2eCFJHwvoNYtAcMDJJJrT0Dvok/clvM7g ZFGUczG0wpt7apGQk8nnmKxVpoCNBp2PX8CzOLAwb4yHnwcV9KWiOgp9Dk6IDcx/ur82 zZAZG0SqQqAarHvDWTHJbxPOb8V3Zlmy6AaME= MIME-Version: 1.0 Received: by 10.224.19.129 with SMTP id a1mr27980034qab.154.1294712456287; Mon, 10 Jan 2011 18:20:56 -0800 (PST) Received: by 10.220.165.198 with HTTP; Mon, 10 Jan 2011 18:20:56 -0800 (PST) Date: Tue, 11 Jan 2011 11:20:56 +0900 Message-ID: X-ASG-Orig-Subj: Help: Download xfstests and xfsqa Subject: Help: Download xfstests and xfsqa From: Ajeet Yadav To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0015175cb2c20b169f049988bcf6 X-Barracuda-Connect: mail-qw0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1294712456 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0008 1.0000 -2.0159 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=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.52026 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 --0015175cb2c20b169f049988bcf6 Content-Type: text/plain; charset=ISO-8859-1 What is xfsqa ? What is difference between xfstests and xfsqa ? Where I can find xfstests and xfsqa ? Do we already have precompiled xfstests and xfsqa for ARM and MIPS ? --0015175cb2c20b169f049988bcf6 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
What is xfsqa ?
=A0
What is difference between xfstests and xfsqa ?
=A0
Where I can find xfstests and xfsqa ?
=A0
Do we already have precompiled xfstests and xfsqa for ARM and MIPS ? --0015175cb2c20b169f049988bcf6-- From SRS0+sAg2+45+fromorbit.com=david@internode.on.net Mon Jan 10 22:48:28 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0B4mR4M066792 for ; Mon, 10 Jan 2011 22:48:28 -0600 X-ASG-Debug-ID: 1294721437-5da7036c0000-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 A5638FCFDC1 for ; Mon, 10 Jan 2011 20:50:37 -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 0l6Y13JLf4NDCY5w for ; Mon, 10 Jan 2011 20:50:37 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 40968647-1927428 for multiple; Tue, 11 Jan 2011 15:20:36 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PcWBl-0006zr-4i; Tue, 11 Jan 2011 15:50:33 +1100 Date: Tue, 11 Jan 2011 15:50:32 +1100 From: Dave Chinner To: Ajeet Yadav Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help: Download xfstests and xfsqa Subject: Re: Help: Download xfstests and xfsqa Message-ID: <20110111045032.GI28803@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: 1294721439 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0191 1.0000 -1.8968 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.80 X-Barracuda-Spam-Status: No, SCORE=-1.80 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.52035 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, Jan 11, 2011 at 11:20:56AM +0900, Ajeet Yadav wrote: > What is xfsqa ? A shorthand name for the xfstests test suite. > > What is difference between xfstests and xfsqa ? None - they are the same thing. > Where I can find xfstests and xfsqa ? http://xfs.org/index.php/Getting_the_latest_source_code > Do we already have precompiled xfstests and xfsqa for ARM and MIPS ? No, you download the source and compile it on your target platform. Cheers, Dave. -- Dave Chinner david@fromorbit.com From roel.vanmeer@bokxing.nl Tue Jan 11 02:10:17 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0B8AG0Q076714 for ; Tue, 11 Jan 2011 02:10:17 -0600 X-ASG-Debug-ID: 1294733547-35ed007b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bork.lsof.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D4477FD07AB for ; Tue, 11 Jan 2011 00:12:27 -0800 (PST) Received: from bork.lsof.org (bork.lsof.org [87.253.148.42]) by cuda.sgi.com with ESMTP id SWHXhVK1cLqL4HLS for ; Tue, 11 Jan 2011 00:12:27 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by bork.lsof.org (Postfix) with ESMTP id BB251BB1E for ; Tue, 11 Jan 2011 09:12:26 +0100 (CET) Received: from bork.lsof.org ([127.0.0.1]) by localhost (bork.lsof.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id rIuABDFXxAep for ; Tue, 11 Jan 2011 09:12:24 +0100 (CET) Received: from bork.lsof.org (localhost [127.0.0.1]) by bork.lsof.org (Postfix) with ESMTP id BBB1FB8D0 for ; Tue, 11 Jan 2011 09:12:24 +0100 (CET) Message-ID: X-Mailer: http://www.courier-mta.org/cone/ From: Roel van Meer To: xfs@oss.sgi.com X-ASG-Orig-Subj: XFS defaults in FAQ on kernel.org Subject: XFS defaults in FAQ on kernel.org Date: Tue, 11 Jan 2011 09:12:24 +0100 Mime-Version: 1.0 Content-Type: text/plain; format=flowed; charset="US-ASCII" Content-Disposition: inline Content-Transfer-Encoding: 7bit X-Barracuda-Connect: bork.lsof.org[87.253.148.42] X-Barracuda-Start-Time: 1294733548 X-Barracuda-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.52048 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 list, Seeing how many people are using unnecessary defaults for xfs, perhaps someone can mail the kernel.org guys to fix their FAQ item on XFS: Filesystem: xfs, mounted with "rw,noatime,nodiratime,nobarrier,logbsize=256k". (Found here: http://www.kernel.org/faq/#howdoesitwork ) I'm not sure how many people will look there for XFS info, but kernel.org might seem trustworthy enough for some people to blindly use this info, so we better make sure it's correct. Regards, Roel (helping Dave running a sed script across the internet) From sandeen@sandeen.net Tue Jan 11 09:36:04 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0BFa3m4096766 for ; Tue, 11 Jan 2011 09:36:04 -0600 X-ASG-Debug-ID: 1294760296-619d03570000-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 CCBE1253ABD for ; Tue, 11 Jan 2011 07:38: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 r7EV2SY1gRjqfsSp for ; Tue, 11 Jan 2011 07:38: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 1777248FF016 for ; Tue, 11 Jan 2011 09:38:16 -0600 (CST) Message-ID: <4D2C7967.2090801@sandeen.net> Date: Tue, 11 Jan 2011 09:38:15 -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: xfs-oss X-ASG-Orig-Subj: [PATCH xfstests] 243: remove test files before starting Subject: [PATCH xfstests] 243: remove test files before starting 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: 1294760296 X-Barracuda-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.52077 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 I found that overwriting existing files hides a bug in ext4 (since fixed). Removing the files before the test reliably reproduces it. Signed-off-by: Eric Sandeen --- diff --git a/243 b/243 index 8b2e647..48f7932 100755 --- a/243 +++ b/243 @@ -125,6 +125,9 @@ _require_xfs_io_falloc # Real QA test starts here. rm -f $seq.full +# Remove any leftover files from last run. +rm -f ${TEST_DIR}/test_? + # Begin test cases. echo "Test 1: Fallocate 40960 bytes and write 4096 bytes (buffered io)." \ >> $seq.full From aelder@oss.sgi.com Tue Jan 11 10:46:38 2011 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 p0BGkcmv100853 for ; Tue, 11 Jan 2011 10:46:38 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id p0BGkadI100594; Tue, 11 Jan 2011 10:46:36 -0600 Date: Tue, 11 Jan 2011 10:46:36 -0600 Message-Id: <201101111646.p0BGkadI100594@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-53-gd0eb2f3 X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: 05340d4ab2ec2b6b4962c1c41c6ea8fb550f947b X-Git-Newrev: d0eb2f38b250b7d6c993adf81b0e4ded0565497e 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 d0eb2f3 xfs: convert grant head manipulations to lockless algorithm 3f16b98 xfs: introduce new locks for the log grant ticket wait queues c8a09ff xfs: convert log grant heads to atomic variables 1c3cb9e xfs: convert l_tail_lsn to an atomic variable. 84f3c68 xfs: convert l_last_sync_lsn to an atomic variable 2ced19c xfs: make AIL tail pushing independent of the grant lock eb40a87 xfs: use wait queues directly for the log wait queues a69ed03 xfs: combine grant heads into a single 64 bit integer 663e496 xfs: rework log grant space calculations 3f336c6 xfs: fact out common grant head/log tail verification code 1054794 xfs: convert log grant ticket queues to list heads 9552e7f xfs: use AIL bulk delete function to implement single delete e605994 xfs: use AIL bulk update function to implement single updates 3013683 xfs: remove all the inodes on a buffer from the AIL in bulk c90821a xfs: consume iodone callback items on buffers as they are processed e677d0f xfs: reduce the number of AIL push wakeups 0e57f6a xfs: bulk AIL insertion during transaction commit eb3efa1 xfs: clean up xfs_ail_delete() b199c8a xfs: Pull EFI/EFD handling out from under the AIL lock 9c5f841 xfs: fix EFI transaction cancellation. 821eb21 xfs: connect up buffer reclaim priority hooks 430cbeb xfs: add a lru to the XFS buffer cache ff57ab2 xfs: convert xfsbud shrinker to a per-buftarg shrinker. 1a427ab xfs: convert pag_ici_lock to a spin lock 1a3e8f3 xfs: convert inode cache lookups to use RCU locking d95b7aa xfs: rcu free inodes 6e85756 xfs: don't truncate prealloc from frequently accessed inodes 055388a xfs: dynamic speculative EOF preallocation 622d814 xfs: use KM_NOFS for allocations during attribute list operations dcfcf20 xfs: provide a inode iolock lockdep class 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 d0eb2f38b250b7d6c993adf81b0e4ded0565497e Author: Dave Chinner Date: Tue Dec 21 12:29:14 2010 +1100 xfs: convert grant head manipulations to lockless algorithm 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 commit 3f16b9850743b702380f098ab5e0308cd6af1792 Author: Dave Chinner Date: Tue Dec 21 12:29:01 2010 +1100 xfs: introduce new locks for the log grant ticket wait queues 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 commit c8a09ff8ca2235bccdaea8a52fbd5349646a8ba4 Author: Dave Chinner Date: Sat Dec 4 00:02:40 2010 +1100 xfs: convert log grant heads to atomic variables 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 commit 1c3cb9ec07fabf0c0970adc46fd2a1f09c1186dd Author: Dave Chinner Date: Tue Dec 21 12:28:39 2010 +1100 xfs: convert l_tail_lsn to an atomic variable. 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 commit 84f3c683c4d3f36d3c3ed320babd960a332ac458 Author: Dave Chinner Date: Fri Dec 3 22:11:29 2010 +1100 xfs: convert l_last_sync_lsn to an atomic variable 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 commit 2ced19cbae5448b720919a494606c62095d4f4db Author: Dave Chinner Date: Tue Dec 21 12:09:20 2010 +1100 xfs: make AIL tail pushing independent of the grant lock 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 commit eb40a87500ac2f6be7eaf8ebb35610e6d0e60e9a Author: Dave Chinner Date: Tue Dec 21 12:09:01 2010 +1100 xfs: use wait queues directly for the log wait queues 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 commit a69ed03c24d4a336c23b7116127713d5a8c5ac4d Author: Dave Chinner Date: Tue Dec 21 12:08:20 2010 +1100 xfs: combine grant heads into a single 64 bit integer 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 commit 663e496a720a3a9fc08ea70b29724e8906b34e43 Author: Dave Chinner Date: Tue Dec 21 12:06:05 2010 +1100 xfs: rework log grant space calculations 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 commit 3f336c6fa17c2b3d14b3dd1bd6e64e9cc97b6359 Author: Dave Chinner Date: Tue Dec 21 12:02:52 2010 +1100 xfs: fact out common grant head/log tail verification code 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 commit 1054794198e39103cb986618c4c10ec2252b7089 Author: Dave Chinner Date: Tue Dec 21 12:02:25 2010 +1100 xfs: convert log grant ticket queues to list heads 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 commit 9552e7f2f3dd13a7580e488a7a3582332daad4f5 Author: Dave Chinner Date: Mon Dec 20 12:36:15 2010 +1100 xfs: use AIL bulk delete function to implement single delete 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 commit e60599492990d1b52c70e9ed2f8e062fe11ca937 Author: Dave Chinner Date: Mon Dec 20 12:34:26 2010 +1100 xfs: use AIL bulk update function to implement single updates 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 commit 3013683253ad04f67d8cfaa25be708353686b90a Author: Dave Chinner Date: Mon Dec 20 12:03:17 2010 +1100 xfs: remove all the inodes on a buffer from the AIL in bulk 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 commit c90821a26a8c90ad1e3116393b8a8260ab46bffb Author: Dave Chinner Date: Fri Dec 3 17:00:52 2010 +1100 xfs: consume iodone callback items on buffers as they are processed 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 commit e677d0f9548e2245ee3c2977661ca8ca165af188 Author: Dave Chinner Date: Fri Dec 17 20:08:04 2010 +1100 xfs: reduce the number of AIL push wakeups 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 commit 0e57f6a36f9be03e5abb755f524ee91c4aebe854 Author: Dave Chinner Date: Mon Dec 20 12:02:19 2010 +1100 xfs: bulk AIL insertion during transaction commit 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 commit eb3efa1249b6413be930bdf13d10b6238028a440 Author: Dave Chinner Date: Fri Dec 3 16:42:57 2010 +1100 xfs: clean up xfs_ail_delete() 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 commit b199c8a4ba11879df87daad496ceee41fdc6aa82 Author: Dave Chinner Date: Mon Dec 20 11:59:49 2010 +1100 xfs: Pull EFI/EFD handling out from under the AIL lock 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 commit 9c5f8414efd5eeed9f498d4170337a3eb126341f Author: Dave Chinner Date: Mon Dec 20 11:57:24 2010 +1100 xfs: fix EFI transaction cancellation. 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 commit 821eb21d97a8b686649c08b7284d0b9f34d0e138 Author: Dave Chinner Date: Thu Dec 2 16:31:13 2010 +1100 xfs: connect up buffer reclaim priority hooks 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 commit 430cbeb86fdcbbdabea7d4aa65307de8de425350 Author: Dave Chinner Date: Thu Dec 2 16:30:55 2010 +1100 xfs: add a lru to the XFS buffer cache 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 commit ff57ab21995a8636cfc72efeebb09cc6034d756f Author: Dave Chinner Date: Tue Nov 30 17:27:57 2010 +1100 xfs: convert xfsbud shrinker to a per-buftarg shrinker. 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 commit 1a427ab0c1b205d1bda8da0b77ea9d295ac23c57 Author: Dave Chinner Date: Thu Dec 16 17:08:41 2010 +1100 xfs: convert pag_ici_lock to a spin lock 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 commit 1a3e8f3da09c7082d25b512a0ffe569391e4c09a Author: Dave Chinner Date: Fri Dec 17 17:29:43 2010 +1100 xfs: convert inode cache lookups to use RCU locking 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 commit d95b7aaf9ab6738bef1ebcc52ab66563085e44ac Author: Dave Chinner Date: Thu Dec 16 16:41:39 2010 +1100 xfs: rcu free inodes 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 commit 6e857567dbbfe14dd6cc3f7414671b047b1ff5c7 Author: Dave Chinner Date: Thu Dec 23 12:02:31 2010 +1100 xfs: don't truncate prealloc from frequently accessed inodes 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 track of ->release calls made on a dirty 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 when the inode is dirty, there is a good chance that the inode is being accessed by the NFS server. Hence set a flag the first time ->release is called while there are delalloc blocks still outstanding on the inode. If this flag is set 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. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 055388a3188f56676c21e92962fc366ac8b5cb72 Author: Dave Chinner Date: Tue Jan 4 11:35:03 2011 +1100 xfs: dynamic speculative EOF preallocation 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 commit 622d81494fa32343a4b97b607619656c7a4a6d1a Author: Dave Chinner Date: Thu Dec 23 11:57:37 2010 +1100 xfs: use KM_NOFS for allocations during attribute list operations 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 Reviewed-by: Christoph Hellwig commit dcfcf20512cb517ac18b9433b676183fa1257911 Author: Dave Chinner Date: Thu Dec 23 11:57:13 2010 +1100 xfs: provide a inode iolock lockdep class 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 Reviewed-by: Christoph Hellwig 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/sv.h | 59 ---- fs/xfs/linux-2.6/xfs_aops.c | 425 ++++++++++-------------- fs/xfs/linux-2.6/xfs_aops.h | 16 + fs/xfs/linux-2.6/xfs_buf.c | 235 +++++++++----- fs/xfs/linux-2.6/xfs_buf.h | 22 +- fs/xfs/linux-2.6/xfs_export.c | 12 +- fs/xfs/linux-2.6/xfs_linux.h | 1 - fs/xfs/linux-2.6/xfs_super.c | 22 +- fs/xfs/linux-2.6/xfs_sync.c | 92 ++++-- fs/xfs/linux-2.6/xfs_trace.h | 59 ++-- fs/xfs/quota/xfs_dquot.c | 1 - fs/xfs/xfs_ag.h | 2 +- fs/xfs/xfs_alloc.c | 351 ++++++++------------ fs/xfs/xfs_attr_leaf.c | 4 +- fs/xfs/xfs_btree.c | 9 +- fs/xfs/xfs_buf_item.c | 32 ++- fs/xfs/xfs_buf_item.h | 11 - fs/xfs/xfs_extfree_item.c | 97 +++--- fs/xfs/xfs_extfree_item.h | 11 +- fs/xfs/xfs_fsops.c | 1 + 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 | 233 +++++--------- fs/xfs/xfs_iomap.h | 27 +-- fs/xfs/xfs_log.c | 739 +++++++++++++++++++---------------------- fs/xfs/xfs_log_cil.c | 17 +- fs/xfs/xfs_log_priv.h | 127 ++++++-- fs/xfs/xfs_log_recover.c | 620 ++++++++++++++--------------------- fs/xfs/xfs_mount.c | 23 ++- fs/xfs/xfs_mount.h | 14 + fs/xfs/xfs_trans.c | 79 +++++- 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 +++-- 38 files changed, 2009 insertions(+), 1921 deletions(-) delete mode 100644 fs/xfs/linux-2.6/sv.h hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Tue Jan 11 10:47:39 2011 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 p0BGlcG3100981 for ; Tue, 11 Jan 2011 10:47:38 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id p0BGlVgi100956; Tue, 11 Jan 2011 10:47:31 -0600 Date: Tue, 11 Jan 2011 10:47:31 -0600 Message-Id: <201101111647.p0BGlVgi100956@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-linus-merged, created. v2.6.37-rc4-5735-g92f1c00 X-Git-Refname: refs/heads/for-linus-merged X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 92f1c008ae79e32b83c0607d184b194f302bb3ee 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-merged has been created at 92f1c008ae79e32b83c0607d184b194f302bb3ee (commit) - Log ----------------------------------------------------------------- commit 92f1c008ae79e32b83c0607d184b194f302bb3ee Merge: e54be894eae10eca9892e965cc9532f5d5a11767 d0eb2f38b250b7d6c993adf81b0e4ded0565497e Author: Alex Elder Date: Mon Jan 10 21:35:55 2011 -0600 Merge branch 'master' into for-linus-merged This merge pulls the XFS master branch into the latest Linus master. This results in a merge conflict whose best fix is not obvious. I manually fixed the conflict, in "fs/xfs/xfs_iget.c". Dave Chinner had done work that resulted in RCU freeing of inodes separate from what Nick Piggin had done, and their results differed slightly in xfs_inode_free(). The fix updates Nick's call_rcu() with the use of VFS_I(), while incorporating needed updates to some XFS inode fields implemented in Dave's series. Dave's RCU callback function has also been removed. Signed-off-by: Alex Elder commit e54be894eae10eca9892e965cc9532f5d5a11767 Merge: 949f6711b83d2809d1ccb9d830155a65fdacdff9 c6c0ac664c86ff6408fadbed4913938c8a732e26 Author: Linus Torvalds Date: Mon Jan 10 16:10:33 2011 -0800 Merge branch 'driver-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6 * 'driver-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6: driver core: Document that device_rename() is only for networking sysfs: remove useless test from sysfs_merge_group driver-core: merge private parts of class and bus driver core: fix whitespace in class_attr_string commit 949f6711b83d2809d1ccb9d830155a65fdacdff9 Merge: 443e6221e465efa8efb752a8405a759ef1161af9 7959d55679e4360205c9ebc89d40a5503c53bae2 Author: Linus Torvalds Date: Mon Jan 10 16:04:53 2011 -0800 Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6 * 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6: (510 commits) staging: speakup: fix failure handling staging: usbip: remove double giveback of URB Staging: batman-adv: Remove batman-adv from staging Staging: hv: Use only one txf buffer per channel and kmalloc/GFP_KERNEL on initialize staging: hv: remove unneeded osd_schedule_callback staging: hv: convert channel_mgmt.c to not call osd_schedule_callback staging: hv: convert vmbus_on_msg_dpc to not call osd_schedule_callback staging: brcm80211: Fix WL_ logging macros Staging: IIO: DDS: AD9833 / AD9834 driver Staging: IIO: dds.h convenience macros Staging: IIO: Direct digital synthesis abi documentation staging: brcm80211: Convert ETHER_TYPE_802_1X to ETH_P_PAE staging: brcm80211: Remove unused ETHER_TYPE_ #defines staging: brcm80211: Remove ETHER_HDR_LEN, use ETH_HLEN staging: brcm80211: Convert ETHER_ADDR_LEN to ETH_ALEN staging: brcm80211: Convert ETHER_IS to is__ether_addr staging: brcm80211: Remove unused ether_ #defines and struct staging: brcm80211: Convert ETHER_IS_MULTI to is_multicast_ether_addr staging: brcm80211: Remove unused #defines ETHER__LOCALADDR Staging: comedi: Fix checkpatch.pl issues in file s526.c ... Fix up trivial conflict in drivers/video/udlfb.c commit 443e6221e465efa8efb752a8405a759ef1161af9 Merge: 0caca697a2d173c6beff3c24e7d9481b732bd131 1a7d946993aaf2a79e9c65abbe169a108e351bcb Author: Linus Torvalds Date: Mon Jan 10 15:39:48 2011 -0800 Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86 * 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86: (36 commits) sony-laptop: support new hotkeys on the P, Z and EC series platform/x86: Consistently select LEDS Kconfig options sony-laptop: fix sparse non-ANSI function warning intel_ips: fix sparse non-ANSI function warning Support KHLB2 in the compal laptop driver acer-wmi: Enabled Acer Launch Manager mode [PATCH] intel_pmic_gpio: modify EOI handling following change of kernel irq subsystem ACPI Thinkpad: We must always call va_end() after va_start() but do not do so in thinkpad_acpi.c::acpi_evalf() acer-wmi: Initialize wlan/bluetooth/wwan rfkill software block state acer-wmi: Detect the WiFi/Bluetooth/3G devices available acer-wmi: Add 3G rfkill sysfs file acer-wmi: Add acer wmi hotkey events support platform/x86: Kconfig: Replace select by depends on ACPI_WMI ideapad: pass ideapad_priv as argument (part 2) ideapad: pass ideapad_priv as argument (part 1) ideapad: add markups, unify comments and return result when init ideapad: add hotkey support ideapad: let camera power control entry under platform driver ideapad: add platform driver for ideapad fujitsu-laptop: fix compiler warning on pnp_ids ... commit 0caca697a2d173c6beff3c24e7d9481b732bd131 Merge: ecacc6c70cf77a52a22af66c879873202522d6ce 751c88a2c362a4a8985f9a2cb5daf7cd9ce1c4d0 Author: Linus Torvalds Date: Mon Jan 10 15:39:23 2011 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k: m68knommu: Need to check __get_user()/__put_user() result m68knommu: signal.c __user annotations m68knommu: Equivalent of "m68k: handle new gcc's" m68knommu: f_pcr has been gone since headers' merge m68knommu: Don't lose state if sigframe setup fails m68knommu: Handle multiple pending signals m68knommu: Switch to saner sigsuspend m68knommu: Don't bother with SA_ONESHOT m68k: Check __get_user()/__put_user() return value m68k: Missing syscall_trace() on sigreturn m68k: Fix stack mangling logics in sigreturn m68k: If we fail to set sigframe up, just leave regs alone... m68k: Don't lose state if sigframe setup fails m68k: Simplify the singlestepping handling in signals m68k: Switch to saner sigsuspend() m68k: Resetting sa_handler in local copy of k_sigaction is pointless m68k/sun3: Kill pte_unmap() warnings commit ecacc6c70cf77a52a22af66c879873202522d6ce Merge: e773202e227c8ebbf369b9b924e15cca4d93824b 4bfc2b2eccf48fef84b9adfe4f1bd8d5e6e1bc8d Author: Linus Torvalds Date: Mon Jan 10 14:52:44 2011 -0800 Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6 * 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6: [IA64] Avoid array overflow if there are too many cpus in SRAT table [IA64] Remove unlikely from cpu_is_offline [IA64] irq_ia64, use set_irq_chip [IA64] perfmon: Change vmalloc to vzalloc and drop memset. [IA64] eliminate race condition in smp_flush_tlb_mm commit e773202e227c8ebbf369b9b924e15cca4d93824b Merge: abf8792d0e1b203e303ed1c02437e0e10a39dcda d2a40972ec70bd2060d3c46050a101a9678d2991 Author: Linus Torvalds Date: Mon Jan 10 14:50:38 2011 -0800 Merge branch 'for-torvalds' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson * 'for-torvalds' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson: ux500: allow 5500 and 8500 to be built together ux500: modem_irq is only for 5500 ux500: dynamic SOC detection ux500: rename MOP board Kconfig ux500: remove build-time changing macros commit abf8792d0e1b203e303ed1c02437e0e10a39dcda Merge: e0e736fc0d33861335e2a132e4f688f7fd380c61 e14411da420bad7bdaae65cccd8787674e6c565e Author: Linus Torvalds Date: Mon Jan 10 14:50:08 2011 -0800 Merge branch 'msm-smp' of git://codeaurora.org/quic/kernel/davidb/linux-msm * 'msm-smp' of git://codeaurora.org/quic/kernel/davidb/linux-msm: msm: add SMP support for msm msm: hotplug: support cpu hotplug on msm msm: timer: SMP timer support for msm msm: scm-boot: Support for setting cold/warm boot addresses msm: Secure Channel Manager (SCM) support commit 7959d55679e4360205c9ebc89d40a5503c53bae2 Author: William Hubbs Date: Thu Dec 16 13:26:58 2010 -0600 staging: speakup: fix failure handling fix the failure handling in kobjects and the main function so that we release the virtual keyboard if we exit due to another failure. Signed-off-by: William Hubbs Signed-off-by: Greg Kroah-Hartman commit 7571f089d7522a95c103558faf313c7af8856ceb Author: MĂ¡rton NĂ©meth Date: Mon Dec 13 21:59:09 2010 +0100 staging: usbip: remove double giveback of URB In the vhci_urb_dequeue() function the TCP connection is checked twice. Each time when the TCP connection is closed the URB is unlinked and given back. Remove the second attempt of unlinking and giving back of the URB completely. This patch fixes the bug described at https://bugzilla.kernel.org/show_bug.cgi?id=24872 . Signed-off-by: MĂ¡rton NĂ©meth Cc: stable Signed-off-by: Greg Kroah-Hartman commit e0e736fc0d33861335e2a132e4f688f7fd380c61 Merge: a08948812b30653eb2c536ae613b635a989feb6f aeda4ac3efc29e4d55989abd0a73530453aa69ba Author: Linus Torvalds Date: Mon Jan 10 11:18:59 2011 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6: (30 commits) MAINTAINERS: Add tomoyo-dev-en ML. SELinux: define permissions for DCB netlink messages encrypted-keys: style and other cleanup encrypted-keys: verify datablob size before converting to binary trusted-keys: kzalloc and other cleanup trusted-keys: additional TSS return code and other error handling syslog: check cap_syslog when dmesg_restrict Smack: Transmute labels on specified directories selinux: cache sidtab_context_to_sid results SELinux: do not compute transition labels on mountpoint labeled filesystems This patch adds a new security attribute to Smack called SMACK64EXEC. It defines label that is used while task is running. SELinux: merge policydb_index_classes and policydb_index_others selinux: convert part of the sym_val_to_name array to use flex_array selinux: convert type_val_to_struct to flex_array flex_array: fix flex_array_put_ptr macro to be valid C SELinux: do not set automatic i_ino in selinuxfs selinux: rework security_netlbl_secattr_to_sid SELinux: standardize return code handling in selinuxfs.c SELinux: standardize return code handling in selinuxfs.c SELinux: standardize return code handling in policydb.c ... commit d2a40972ec70bd2060d3c46050a101a9678d2991 Author: Rabin Vincent Date: Wed Dec 8 11:08:01 2010 +0530 ux500: allow 5500 and 8500 to be built together Signed-off-by: Rabin Vincent Signed-off-by: Linus Walleij commit 5ec65521c99178a87f4c859101a92c36f4701fd7 Author: Rabin Vincent Date: Wed Dec 8 11:08:00 2010 +0530 ux500: modem_irq is only for 5500 Signed-off-by: Rabin Vincent [Modified to hit the right file] Signed-off-by: Linus Walleij commit abf12d719a2c9e45f7f90c02a3a25107206ed57a Author: Rabin Vincent Date: Wed Dec 8 11:07:59 2010 +0530 ux500: dynamic SOC detection Dynamically detect the DBx500 SOC an revision based on the ASIC ID. Signed-off-by: Rabin Vincent Signed-off-by: Linus Walleij commit 5dc55e0a39434ec8bec7978aef2dc00c91a530ba Author: Rabin Vincent Date: Wed Dec 8 11:07:58 2010 +0530 ux500: rename MOP board Kconfig Rename the MOP board Kconfig entries to the same name as the machine type, so that the machine_is_*() macros work correctly. Signed-off-by: Rabin Vincent [Updated to match changes in the tree] Signed-off-by: Linus Walleij commit 92389ca8362c42952c7ebb8a0350ac522dcde0f4 Author: Rabin Vincent Date: Wed Dec 8 11:07:57 2010 +0530 ux500: remove build-time changing macros To allow the possiblity of building U8500 and U5500 support in the same image. Signed-off-by: Rabin Vincent [Rebased to latest changes in Russells tree] Signed-off-by: Linus Walleij commit 1a7d946993aaf2a79e9c65abbe169a108e351bcb Author: Mattia Dongili Date: Sat Jan 8 18:47:29 2011 +0900 sony-laptop: support new hotkeys on the P, Z and EC series Add new mappings for assist, VAIO, zoom and eject buttons present on refurbished P, Z and EC models. Reported-by: Gyorgy Jeney Reported-by: Stephan Mueller Cc: Dmitry Torokhov Cc: Matthew Garrett Signed-off-by: Mattia Dongili Signed-off-by: Matthew Garrett commit a08948812b30653eb2c536ae613b635a989feb6f Merge: 0bd2cbcdfaff9cb22267d66fc843fa4f73f0c281 6099469805c24af14250e182bb9ca082b8a6b716 Author: Linus Torvalds Date: Mon Jan 10 08:57:46 2011 -0800 Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/staging * 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/staging: (44 commits) hwmon: Support for Dallas Semiconductor DS620 hwmon: driver for Sensirion SHT21 humidity and temperature sensor hwmon: Add humidity attribute to sysfs ABI hwmon: sysfs ABI updates hwmon: (via-cputemp) sync hotplug handling with coretemp/pkgtemp hwmon: (lm95241) Rewrite to avoid using macros hwmon: (applesmc) Fix checkpatch errors and fix value range checks hwmon: (applesmc) Update copyright information hwmon: (applesmc) Silence driver hwmon: (applesmc) Simplify feature sysfs handling hwmon: (applesmc) Dynamic creation of fan files hwmon: (applesmc) Extract all features generically hwmon: (applesmc) Handle new temperature format hwmon: (applesmc) Dynamic creation of temperature files hwmon: (applesmc) Introduce a register lookup table hwmon: (applesmc) Use pr_fmt and pr_ hwmon: (applesmc) Relax the severity of device init failure hwmon: (applesmc) Add MacBookAir3,1(3,2) support hwmon: (w83627hf) Use pr_fmt and pr_ hwmon: (w83627ehf) Use pr_fmt and pr_ ... commit 0bd2cbcdfaff9cb22267d66fc843fa4f73f0c281 Merge: 57cc7215b70856dc6bae8e55b00ecd7b1d7429b1 a081748735c5feb96b1365e78a5ff0fb6ca7e3a4 Author: Linus Torvalds Date: Mon Jan 10 08:57:03 2011 -0800 Merge branch 'next-devicetree' of git://git.secretlab.ca/git/linux-2.6 * 'next-devicetree' of git://git.secretlab.ca/git/linux-2.6: (29 commits) of/flattree: forward declare struct device_node in of_fdt.h ipmi: explicitly include of_address.h and of_irq.h sparc: explicitly cast negative phandle checks to s32 powerpc/405: Fix missing #{address,size}-cells in i2c node powerpc/5200: dts: refactor dts files powerpc/5200: dts: Change combatible strings on localbus powerpc/5200: dts: remove unused properties powerpc/5200: dts: rename nodes to prepare for refactoring dts files of/flattree: Update dtc to current mainline. of/device: Don't register disabled devices powerpc/dts: fix syntax bugs in bluestone.dts of: Fixes for OF probing on little endian systems of: make drivers depend on CONFIG_OF instead of CONFIG_PPC_OF of/flattree: Add of_flat_dt_match() helper function of_serial: explicitly include of_irq.h of/flattree: Refactor unflatten_device_tree and add fdt_unflatten_tree of/flattree: Reorder unflatten_dt_node of/flattree: Refactor unflatten_dt_node of/flattree: Add non-boottime device tree functions of/flattree: Add Kconfig for EARLY_FLATTREE ... Fix up trivial conflict in arch/sparc/prom/tree_32.c as per Grant. commit 0c51a4d8abd6ed5ba55f828840c6b78ab672644b Author: Mark Brown Date: Mon Jan 10 14:37:02 2011 +0000 platform/x86: Consistently select LEDS Kconfig options Currently the x86 platform devices are not consistent about selecting or depending on the LEDs Kconfig variables, and this inconsistency leads to Kconfig getting upset and refusing to offer LEDs (even on non-x86 platforms): drivers/platform/x86/Kconfig:422:error: recursive dependency detected! drivers/platform/x86/Kconfig:422: symbol EEEPC_WMI depends on ACPI_WMI drivers/platform/x86/Kconfig:438: symbol ACPI_WMI is selected by ACER_WMI drivers/platform/x86/Kconfig:18: symbol ACER_WMI depends on LEDS_CLASS drivers/leds/Kconfig:10: symbol LEDS_CLASS is selected by EEEPC_WMI Fix this by always selecting rather than depending on the symbols as slightly more drivers use this approach already and it seems more user friendly. Signed-off-by: Mark Brown Signed-off-by: Matthew Garrett commit a46a780835f394869e1fbbef8b528a1e02193e78 Author: Randy Dunlap Date: Sat Jan 8 19:56:44 2011 -0800 sony-laptop: fix sparse non-ANSI function warning Fix sparse warning for non-ANSI function declaration: drivers/platform/x86/sony-laptop.c:1134:35: warning: non-ANSI function declaration of function 'sony_nc_rfkill_update' Signed-off-by: Randy Dunlap Cc: Matthew Garrett Cc: Mattia Dongili Signed-off-by: Matthew Garrett commit 7027d8b570244f0fa3aaebccf0bcd8e95e172631 Author: Randy Dunlap Date: Sat Jan 8 19:55:40 2011 -0800 intel_ips: fix sparse non-ANSI function warning Fix sparse warning for non-ANSI function declaration: drivers/platform/x86/intel_ips.c:1477:25: warning: non-ANSI function declaration of function 'ips_link_to_i915_driver' Signed-off-by: Randy Dunlap Cc: Matthew Garrett Signed-off-by: Matthew Garrett commit 57cc7215b70856dc6bae8e55b00ecd7b1d7429b1 Author: Alexey Dobriyan Date: Mon Jan 10 08:18:25 2011 +0200 headers: kobject.h redux Remove kobject.h from files which don't need it, notably, sched.h and fs.h. Signed-off-by: Alexey Dobriyan Signed-off-by: Linus Torvalds commit 37721e1b0cf98cb65895f234d8c500d270546529 Author: Alexey Dobriyan Date: Mon Jan 10 08:17:10 2011 +0200 headers: path.h redux Remove path.h from sched.h and other files. Signed-off-by: Alexey Dobriyan Signed-off-by: Linus Torvalds commit 9f99a2f0e44663517b99b69a3e4a499d0ba877df Merge: 8c8ae4e8cd5a67467192f3361eeec463694f8ed8 110e7c7e4f8a61a34e0ab88fc9bdf4d5c6d220b2 Author: Linus Torvalds Date: Mon Jan 10 08:48:46 2011 -0800 Merge branch 'stable/bug-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen * 'stable/bug-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen: xen/event: validate irq before get evtchn by irq xen/fb: fix potential memory leak xen/fb: fix xenfb suspend/resume race. xen: disable ACPI NUMA for PV guests xen/irq: Cleanup the find_unbound_irq commit 8c8ae4e8cd5a67467192f3361eeec463694f8ed8 Merge: a1e8fad5900fa94adb500c6e0dfd60a307f7a3c9 d9b8ca8474fd4fdd43ba6d97a4fee8b49b978067 Author: Linus Torvalds Date: Mon Jan 10 08:48:29 2011 -0800 Merge branch 'stable/generic' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen * 'stable/generic' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen: xen: HVM X2APIC support apic: Move hypervisor detection of x2apic to hypervisor.h commit a1e8fad5900fa94adb500c6e0dfd60a307f7a3c9 Merge: e3166331a3288dd7184548896a1c7ab682f0dbe8 a45b0616e7ee9db4c1b2b9a4a79a974325fa9bf3 Author: Linus Torvalds Date: Mon Jan 10 08:38:01 2011 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6: slub: Fix a crash during slabinfo -v tracing/slab: Move kmalloc tracepoint out of inline code slub: Fix slub_lock down/up imbalance slub: Fix build breakage in Documentation/vm slub tracing: move trace calls out of always inlined functions to reduce kernel code size slub: move slabinfo.c to tools/slub/slabinfo.c commit e3166331a3288dd7184548896a1c7ab682f0dbe8 Merge: 1693ed284f14a288c29f7265f9d71103e4c10821 0719e1d23aab3b445c823404fd1b8b027757bb0a Author: Linus Torvalds Date: Mon Jan 10 08:29:25 2011 -0800 Merge branch 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6 * 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6: Documentation/kbuild: add info that 'choice' can have a symbol name kbuild: add numeric --set-val option to scripts/config headers_check: Fix warning text headers_check: better search for functions in headers scripts/coccinelle: update for compatability with Coccinelle 0.2.4 tags: put function prototypes back! Kconfig: fix single letter command in scripts/config gitignore: add scripts/recordmcount commit 1693ed284f14a288c29f7265f9d71103e4c10821 Merge: f28b1c8aaa97a68028bb894bffb1690185c62b01 ee81b786a07f1d6062d6e14b6152f1f6cc4bc63b Author: Linus Torvalds Date: Mon Jan 10 08:28:38 2011 -0800 Merge branch 'packaging' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6 * 'packaging' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6: deb-pkg: s/hdr/kernel_headers_/ && s/header/libc_headers_/ deb-pkg: Make deb-pkg generate a seperate linux-libc-dev deb kbuild: create linux-headers package in deb-pkg kbuild, deb-pkg: support overriding userland architecture kbuild, deb-pkg: select userland architecture based on UTS_MACHINE kbuild, deb-pkg: Fix build with paranoid umask commit f28b1c8aaa97a68028bb894bffb1690185c62b01 Merge: 0c05384a5a1af2352b8c244cf32f480ba6cbf024 39177ec36236fb71257e51d0d198437b84170911 Author: Linus Torvalds Date: Mon Jan 10 08:28:17 2011 -0800 Merge branch 'kconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6 * 'kconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6: nconf: handle comment entries within choice/endchoice kconfig: fix warning kconfig: Make expr_copy() take a const argument kconfig: simplify select-with-unmet-direct-dependency warning kconfig: add more S_INT and S_HEX consistency checks kconfig: fix `zconfdebug' extern declaration kconfig/conf: merge duplicate switch's case kconfig: fix typos kbuild/gconf: add dummy inline for bind_textdomain_codeset() kbuild/nconf: fix spaces damage kconfig: nuke second argument of conf_write_symbol() kconfig: do not define AUTOCONF_INCLUDED kconfig: the day kconfig warns about "select"-abuse has come commit 0c05384a5a1af2352b8c244cf32f480ba6cbf024 Merge: 1542dec1c9109fdcd1c53460f064096f24fc49d2 bc91c9f313309915f6ec767f56f78dcd0305b20f Author: Linus Torvalds Date: Mon Jan 10 08:27:52 2011 -0800 Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6 * 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6: mkuboot.sh: Fail if mkimage is missing gen_init_cpio: checkpatch fixes gen_init_cpio: Avoid race between call to stat() and call to open() modpost: Fix address calculation in reloc_location() Make fixdep error handling more explicit checksyscalls: Fix stand-alone usage modpost: Put .zdebug* section on white list kbuild: fix interaction of CONFIG_IKCONFIG and KCONFIG_CONFIG kbuild: export linux/{a.out,kvm,kvm_para}.h on headers_install_all kbuild: introduce HDR_ARCH_LIST for headers_install_all headers_install: check exit status of unifdef gen_init_cpio: remove leading `/' from file names scripts/genksyms: fix header usage fixdep: use hash table instead of a single array commit 1542dec1c9109fdcd1c53460f064096f24fc49d2 Merge: facc7a96d443d84060a8679c3fcc51d20d4981c3 2ad2c320a107aceeba984f97ab2a60064101f5d5 Author: Linus Torvalds Date: Mon Jan 10 08:22:33 2011 -0800 Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev * 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev: pata_platform: Remove CONFIG_HAVE_PATA_PLATFORM's dependencies. pata_hpt37x: actually limit HPT370 to UltraDMA/66 pata_hpt3x2n: coding style cleanup pata_hpt37x: coding style cleanup pata_hpt366: coding style cleanup pata_hpt3x2n: calculate average f_CNT pata_hpt3x2n: clarify about HPT371N support pata_hpt{37x|3x2n}: SATA mode filtering [libata] avoid needlessly passing around ptr to SCSI completion func [libata] new driver acard_ahci, for ATP8620 host controller commit facc7a96d443d84060a8679c3fcc51d20d4981c3 Merge: c8940eca75e6d1ea57f6c491a30bd1023c64c9ad 4ead36407b41eae942c8c9f70ef963cd369c90e2 Author: Linus Torvalds Date: Mon Jan 10 08:15:37 2011 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid: (34 commits) HID: roccat: Update sysfs attribute doc HID: roccat: don't use #pragma pack HID: roccat: Add support for Roccat Kone[+] v2 HID: roccat: reduce number of functions in kone and pyra drivers HID: roccat: declare meaning of pack pragma usage in driver headers HID: roccat: use class for char device for sysfs attribute creation sysfs: Introducing binary attributes for struct class HID: hidraw: add compatibility ioctl() for 32-bit applications. HID: hid-picolcd: Fix memory leak in picolcd_debug_out_report() HID: picolcd: fix misuse of logical operation in place of bitop HID: usbhid: base runtime PM on modern API HID: replace offsets values with their corresponding BTN_* defines HID: hid-mosart: support suspend/resume HID: hid-mosart: ignore buttons report HID: hid-picolcd: don't use flush_scheduled_work() HID: simplify an index check in hid_lookup_collection HID: Hoist assigns from ifs HID: Remove superfluous __inline__ HID: Use vzalloc for vmalloc/memset(,0...) HID: Add and use hid_: dev_ equivalents ... commit c8940eca75e6d1ea57f6c491a30bd1023c64c9ad Merge: 78c92a9fd4b6abbbc1fe1ec335c697cb4e63f252 3ae22e8c8ac39daf88ae32f047fb23825be7c646 Author: Linus Torvalds Date: Mon Jan 10 08:14:53 2011 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6: spi / PM: Support dev_pm_ops PM: Prototype the pm_generic_ operations PM / Runtime: Generic resume shouldn't set RPM_ACTIVE unconditionally PM: Use dev_name() in core device suspend and resume routines PM: Permit registration of parentless devices during system suspend PM: Replace the device power.status field with a bit field PM: Remove redundant checks from core device resume routines PM: Use a different list of devices for each stage of device suspend PM: Avoid compiler warning in pm_noirq_op() PM: Use pm_wakeup_pending() in __device_suspend() PM / Wakeup: Replace pm_check_wakeup_events() with pm_wakeup_pending() PM: Prevent dpm_prepare() from returning errors unnecessarily PM: Fix references to basic-pm-debugging.txt in drivers-testing.txt PM / Runtime: Add synchronous runtime interface for interrupt handlers (v3) PM / Hibernate: When failed, in_suspend should be reset PM / Hibernate: hibernation_ops->leave should be checked too Freezer: Fix a race during freezing of TASK_STOPPED tasks PM: Use proper ccflag flag in kernel/power/Makefile PM / Runtime: Fix comments to match runtime callback code commit 78c92a9fd4b6abbbc1fe1ec335c697cb4e63f252 Merge: b65f0d673a0280a49b80f44c9a62e5dfc1ec203f 410cf2bd3dc6ec1ed9e1b36b25b9d7aa927ed14e Author: Linus Torvalds Date: Mon Jan 10 08:14:02 2011 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6: firewire: use split transaction timeout only for split transactions firewire: ohci: consolidate context status flags firewire: ohci: cache the context run bit firewire: ohci: flush AT contexts after bus reset - addendum firewire: ohci: flush AT contexts after bus reset for OHCI 1.2 firewire: net: set carrier state at ifup firewire: net: add carrier detection firewire: net: ratelimit error messages firewire: ohci: restart iso DMA contexts on resume from low power mode firewire: ohci: restore GUID on resume. firewire: ohci: use common buffer for self IDs and AR descriptors firewire: ohci: optimize iso context checks in the interrupt handler firewire: make PHY packet header format consistent firewire: ohci: properly clear posted write errors firewire: ohci: flush MMIO writes in the interrupt handler firewire: ohci: fix AT context initialization error handling firewire: ohci: Asynchronous Reception rewrite firewire: core: Update WARN uses firewire: nosy: char device is not seekable commit b65f0d673a0280a49b80f44c9a62e5dfc1ec203f Merge: f3ea597251ac859a1c0e7b9e266877f1ac828009 365e215ce1f154e288ff0f7c9acbdf5421f57949 Author: Linus Torvalds Date: Mon Jan 10 07:50:40 2011 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2: nilfs2: unfold nilfs_dat_inode function nilfs2: do not pass sbi to functions which can get it from inode nilfs2: get rid of nilfs_mount_options structure nilfs2: simplify nilfs_mdt_freeze_buffer nilfs2: get rid of loaded flag from nilfs object nilfs2: fix a checkpatch error in page.c nilfs2: fiemap support nilfs2: mark buffer heads as delayed until the data is written to disk nilfs2: call nilfs_error inside bmap routines fs/nilfs2/super.c: Use printf extension %pV MAINTAINERS: add nilfs2 git tree entry commit f3ea597251ac859a1c0e7b9e266877f1ac828009 Merge: f9f265f35578c5fb2266d0e2a1aa5b57f6fdb36a 20054bd65703f7504a9daceabc2a060828fde36c Author: Linus Torvalds Date: Mon Jan 10 07:47:11 2011 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6: cifs: use CreationTime like an i_generation field cifs: switch cifs_open and cifs_create to use CIFSSMBUnixSetFileInfo cifs: show "acl" in DebugData Features when it's compiled in cifs: move "ntlmssp" and "local_leases" options out of experimental code cifs: replace some hardcoded values with preprocessor constants cifs: remove unnecessary locking around sequence_number [CIFS] Fix minor merge conflict in fs/cifs/dir.c CIFS: Simplify cifs_open code CIFS: Simplify non-posix open stuff (try #2) CIFS: Add match_port check during looking for an existing connection (try #4) CIFS: Simplify ipv*_connect functions into one (try #4) cifs: Support NTLM2 session security during NTLMSSP authentication [try #5] cifs: don't overwrite dentry name in d_revalidate commit 110e7c7e4f8a61a34e0ab88fc9bdf4d5c6d220b2 Author: Joe Jin Date: Fri Jan 7 14:50:12 2011 +0800 xen/event: validate irq before get evtchn by irq When retrieving the event channel number from irq, the irq number may not be valid under some conditions. So far that can be when we suspend/resume and irq ends with -1. Validate and return sanitized irq and provide diagnostics information. [v3: added unlikely on the WARN path] [v2: reworded the commit message] Signed-off-by: Joe Jin Signed-off-by: Konrad Rzeszutek Wilk Tested-by: Gurudas Pai Cc: Ian Campbell Cc: Jeremy Fitzhardinge Cc: Andrew Morton commit fc550e95921e109f3778a6b2dc560d63388810ab Author: Joe Jin Date: Fri Jan 7 18:20:54 2011 +0800 xen/fb: fix potential memory leak This patch fixes a potential memory leak when xenfb connect to the backend fails. Thanks for Ian's review and comments. [v2: reworded the commit message a bit] Signed-off-by: Konrad Rzeszutek Wilk Signed-off-by: Joe Jin Tested-by: Gurudas Pai Acked-by: Ian Campbell Cc: Jeremy Fitzhardinge Cc: Andrew Morton commit 731f3ab66a23dab28a359e87364f53d221b3d366 Author: Joe Jin Date: Fri Jan 7 18:17:17 2011 +0800 xen/fb: fix xenfb suspend/resume race. When migrating guests over a long period we hit this: <1>BUG: unable to handle kernel paging request at 0000000b819fdb98 <1>IP: [] notify_remote_via_irq+0x13/0x34 <4>PGD 94b10067 PUD 0 <0>Oops: 0000 [#1] SMP .. snip.. Call Trace: [] xenfb_send_event+0x5c/0x5e [] ? xen_restore_fl_direct_end+0x0/0x1 [] ? _spin_unlock_irqrestore+0x16/0x18 [] xenfb_refresh+0x1b1/0x1d7 [] ? sys_imageblit+0x1ac/0x458 [] xenfb_imageblit+0x2f/0x34 [] soft_cursor+0x1b5/0x1c8 [] bit_cursor+0x4b6/0x4d7 [] ? xen_restore_fl_direct_end+0x0/0x1 [] ? _spin_unlock_irqrestore+0x16/0x18 [] ? bit_cursor+0x0/0x4d7 [] fb_flashcursor+0xff/0x111 [] ? fb_flashcursor+0x0/0x111 [] worker_thread+0x14d/0x1ed [] ? autoremove_wake_function+0x0/0x3d [] ? _spin_unlock_irqrestore+0x16/0x18 [] ? worker_thread+0x0/0x1ed [] kthread+0x6e/0x76 [] child_rip+0xa/0x20 [] ? int_ret_from_sys_call+0x7/0x1b [] ? retint_restore_args+0x5/0x6 [] ? child_rip+0x0/0x20 Code: 6b ff 0c 8b 87 a4 db 9f 81 66 85 c0 74 08 0f b7 f8 e8 3b ff ff ff c9 c3 55 48 89 e5 48 83 ec 10 0f 1f 44 00 00 89 ff 48 6b ff 0c <8b> 87 a4 db 9f 81 66 85 c0 74 14 48 8d 75 f0 0f b7 c0 bf 04 00 RIP [] notify_remote_via_irq+0x13/0x34 RSP CR2: 0000000b819fdb98 ---[ end trace 098b4b74827595d0 ]--- The root cause of the panic is the race between the resume and reconnect to the backend. Clearing the 'update_wanted' flag of xenfb before disconnecting from the backend fixes this issue. Signed-off-by: Joe Jin Signed-off-by: Konrad Rzeszutek Wilk Tested-by: Gurudas Pai Acked-by: Ian Campbell Cc: Jeremy Fitzhardinge Cc: Andrew Morton commit c1f5db1a53a7286f6c818f71016ae6aced814d27 Author: Ian Campbell Date: Fri Dec 3 09:54:03 2010 +0000 xen: disable ACPI NUMA for PV guests Xen does not currently expose PV-NUMA information to PV guests. Therefore disable NUMA for the time being to prevent the kernel picking up on an host-level NUMA information which it might come across in the firmware. [ Added comment - Jeremy ] Signed-off-by: Ian Campbell Signed-off-by: Jeremy Fitzhardinge Signed-off-by: Konrad Rzeszutek Wilk commit f9f265f35578c5fb2266d0e2a1aa5b57f6fdb36a Merge: 7d44b0440147d83a65270205b22e7d365de28948 b9d41052794385f9d47ebb7acf4a772f3ad02398 Author: Linus Torvalds Date: Mon Jan 10 07:46:26 2011 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/dlm * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/dlm: dlm: sanitize work_start() in lowcomms.c dlm: reduce cond_resched during send dlm: use TCP_NODELAY dlm: Use cmwq for send and receive workqueues dlm: Handle application limited situations properly. commit 7d44b0440147d83a65270205b22e7d365de28948 Merge: 0dc1488527a3c01383a50e5df7187219567586a3 1baa26b2be92fe9917e2f7ef46d423b5dfa4da71 Author: Linus Torvalds Date: Mon Jan 10 07:43:54 2011 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse: fuse: fix ioctl ABI fuse: allow batching of FORGET requests fuse: separate queue for FORGET requests fuse: ioctl cleanup Fix up trivial conflict in fs/fuse/inode.c due to RCU lookup having done the RCU-freeing of the inode in fuse_destroy_inode(). commit 0dc1488527a3c01383a50e5df7187219567586a3 Author: Randy Dunlap Date: Sat Jan 8 19:40:33 2011 -0800 pipe_fs_i.h: fix kernel-doc warning Fix kernel-doc notation warnings in pipe_fs_i.h: Warning(include/linux/pipe_fs_i.h:58): No description found for parameter 'buffers' Signed-off-by: Randy Dunlap Signed-off-by: Linus Torvalds commit 175881db8916a5f5cdf920d32214caef588870fd Author: Randy Dunlap Date: Sat Jan 8 19:38:02 2011 -0800 hrtimer.h: fix kernel-doc warning Fix new kernel-doc notation warning in hrtimer.h: Warning(include/linux/hrtimer.h:150): Excess struct/union/enum/typedef member 'first' description in 'hrtimer_clock_base' Signed-off-by: Randy Dunlap Signed-off-by: Linus Torvalds commit 2a8c0c68487a68441e701f493f43fd547d87c8df Author: Randy Dunlap Date: Sat Jan 8 19:37:20 2011 -0800 fs: fix dcache.h kernel-doc notation Fix new kernel-doc notation warning in dcache.h: Warning(include/linux/dcache.h:316): Excess function parameter 'Returns' description in '__d_rcu_to_refcount' Signed-off-by: Randy Dunlap Cc: Nick Piggin Signed-off-by: Linus Torvalds commit 39191628ed169510db2f3f472e1ec14e08f9690f Author: Randy Dunlap Date: Sat Jan 8 19:36:21 2011 -0800 fs: fix namei.c kernel-doc notation Fix new kernel-doc notation warnings in fs/namei.c and spell ECHILD correctly. Warning(fs/namei.c:218): No description found for parameter 'flags' Warning(fs/namei.c:425): Excess function parameter 'Returns' description in 'nameidata_drop_rcu' Warning(fs/namei.c:478): Excess function parameter 'Returns' description in 'nameidata_dentry_drop_rcu' Warning(fs/namei.c:540): Excess function parameter 'Returns' description in 'nameidata_drop_rcu_last' Signed-off-by: Randy Dunlap Cc: Nick Piggin Signed-off-by: Linus Torvalds commit 365e215ce1f154e288ff0f7c9acbdf5421f57949 Author: Ryusuke Konishi Date: Mon Dec 27 00:07:30 2010 +0900 nilfs2: unfold nilfs_dat_inode function nilfs_dat_inode function was a wrapper to switch between normal dat inode and gcdat, a clone of the dat inode for garbage collection. This function got obsolete when the gcdat inode was removed, and now we can access the dat inode directly from a nilfs object. So, we will unfold the wrapper and remove it. Signed-off-by: Ryusuke Konishi commit bcbc8c648d6cc88f771435d8031c1a13e00945ed Author: Ryusuke Konishi Date: Mon Dec 27 00:05:49 2010 +0900 nilfs2: do not pass sbi to functions which can get it from inode This removes argument for passing nilfs_sb_info structure from nilfs_set_file_dirty and nilfs_load_inode_block functions. We can get a pointer to the structure from inodes. [Stephen Rothwell : fix conflict with commit b74c79e99389cd79b31fcc08f82c24e492e63c7e] Signed-off-by: Ryusuke Konishi commit 06df0f999247a3153c3ec284c7ada36ef785eb97 Author: Ryusuke Konishi Date: Mon Dec 27 00:04:06 2010 +0900 nilfs2: get rid of nilfs_mount_options structure Only mount_opt member is used in the nilfs_mount_options structure, and we can simplify it. Signed-off-by: Ryusuke Konishi commit a7a8447edef2cfa9b28cc3892993d9fafb362671 Author: Ryusuke Konishi Date: Mon Dec 27 00:03:02 2010 +0900 nilfs2: simplify nilfs_mdt_freeze_buffer nilfs_page_get_nth_block() function used in nilfs_mdt_freeze_buffer() always returns a valid buffer head, so its validity check can be removed. Signed-off-by: Ryusuke Konishi commit 888da23c2f70ca2e9897b725322a6456285ee9c4 Author: Ryusuke Konishi Date: Mon Dec 27 00:01:28 2010 +0900 nilfs2: get rid of loaded flag from nilfs object NILFS_LOADED flag of the nilfs object is not used now, so this will remove it. Signed-off-by: Ryusuke Konishi commit ae53a0a2ce2a89f1aa824a5fc6d2099907cfb409 Author: Ryusuke Konishi Date: Sun Dec 26 23:30:02 2010 +0900 nilfs2: fix a checkpatch error in page.c Will correct the following checkpatch error: ERROR: trailing whitespace #494: FILE: page.c:494: + $ Signed-off-by: Ryusuke Konishi commit 622daaff0a8975fb5c5b95f24f3234550ba32e92 Author: Ryusuke Konishi Date: Sun Dec 26 16:38:43 2010 +0900 nilfs2: fiemap support This adds fiemap to nilfs. Two new functions, nilfs_fiemap and nilfs_find_uncommitted_extent are added. nilfs_fiemap() implements the fiemap inode operation, and nilfs_find_uncommitted_extent() helps to get a range of data blocks whose physical location has not been determined. nilfs_fiemap() collects extent information by looping through nilfs_bmap_lookup_contig and nilfs_find_uncommitted_extent routines. Signed-off-by: Ryusuke Konishi commit 27e6c7a3ce29ae5fa5bec4ed5917f8508bfac120 Author: Ryusuke Konishi Date: Sun Dec 26 16:28:28 2010 +0900 nilfs2: mark buffer heads as delayed until the data is written to disk Nilfs does not allocate new blocks on disk until they are actually written to. To implement fiemap, we need to deal with such blocks. To allow successive fiemap patch to distinguish mapped but unallocated regions, this marks buffer heads of those new blocks as delayed and clears the flag after the blocks are written to disk. Signed-off-by: Ryusuke Konishi commit e828949e5b42bfd234ee537cdb7c5e3a577958a3 Author: Ryusuke Konishi Date: Fri Nov 19 15:26:20 2010 +0900 nilfs2: call nilfs_error inside bmap routines Some functions using nilfs bmap routines can wrongly return invalid argument error (i.e. -EINVAL) that bmap returns as an internal code for btree corruption. This fixes the issue by catching and converting the internal EINVAL to EIO and calling nilfs_error function inside bmap routines. Signed-off-by: Ryusuke Konishi commit b004a5eb0babec7ef91558f73315ef49e5a1f285 Author: Joe Perches Date: Tue Nov 9 16:35:21 2010 -0800 fs/nilfs2/super.c: Use printf extension %pV Using %pV reduces the number of printk calls and eliminates any possible message interleaving from other printk calls. Signed-off-by: Joe Perches Signed-off-by: Ryusuke Konishi commit af1761f268ff2a58f2ea22e9b9de6359f7b2048e Author: Ryusuke Konishi Date: Tue Nov 23 23:37:23 2010 +0900 MAINTAINERS: add nilfs2 git tree entry NILFS2 filesystem section of the MAINTAINERS file lacks an entry of scm tree. This adds it. Signed-off-by: Ryusuke Konishi commit 20054bd65703f7504a9daceabc2a060828fde36c Author: Jeff Layton Date: Fri Jan 7 11:30:27 2011 -0500 cifs: use CreationTime like an i_generation field Reduce false inode collisions by using the CreationTime like an i_generation field. This way, even if the server ends up reusing a uniqueid after a delete/create cycle, we can avoid matching the inode incorrectly. Signed-off-by: Jeff Layton Signed-off-by: Steve French commit aeda4ac3efc29e4d55989abd0a73530453aa69ba Merge: d2e7ad19229f982fc1eb731827d82ceac90abfb3 350e4f31e0eaf56dfc3b328d24a11bdf42a41fb8 Author: James Morris Date: Mon Jan 10 10:40:42 2011 +1100 Merge branch 'master' of git://git.infradead.org/users/eparis/selinux into next commit d44a9fe2c8af3fee8edb203e9b11e507851c50fa Author: Jeff Layton Date: Fri Jan 7 11:30:29 2011 -0500 cifs: switch cifs_open and cifs_create to use CIFSSMBUnixSetFileInfo We call CIFSSMBUnixSetPathInfo in these functions, but we have a filehandle since an open was just done. Switch these functions to use CIFSSMBUnixSetFileInfo instead. In practice, these codepaths are only used if posix opens are broken. Signed-off-by: Jeff Layton Signed-off-by: Steve French commit ca40b714b8f9f20118b7071cb7cf49954166dbdf Author: Jeff Layton Date: Fri Jan 7 11:30:29 2011 -0500 cifs: show "acl" in DebugData Features when it's compiled in ...and while we're at it, reduce the number of calls into the seq_* functions by prepending spaces to strings. Signed-off-by: Jeff Layton Signed-off-by: Steve French commit b4d6fcf13f417464c13c6fde46e87c495ba6b6ee Author: Jeff Layton Date: Fri Jan 7 11:30:28 2011 -0500 cifs: move "ntlmssp" and "local_leases" options out of experimental code I see no real need to leave these sorts of options under an EXPERIMENTAL ifdef. Since you need a mount option to turn this code on, that only blows out the testing matrix. local_leases has been under the EXPERIMENTAL tag for some time, but it's only the mount option that's under this label. Move it out from under this tag. The NTLMSSP code is also under EXPERIMENTAL, but it needs a mount option to turn it on, and in the future any distro will reasonably want this enabled. Go ahead and move it out from under the EXPERIMENTAL tag. Signed-off-by: Jeff Layton Acked-by: Suresh Jayaraman Signed-off-by: Steve French commit 1397f2ee4be65542fdc3460c7e8b6317779ea680 Author: Jeff Layton Date: Fri Jan 7 11:30:28 2011 -0500 cifs: replace some hardcoded values with preprocessor constants A number of places that deal with RFC1001/1002 negotiations have bare "15" or "16" values. Replace them with RFC_1001_NAME_LEN and RFC_1001_NAME_LEN_WITH_NULL. The patch also cleans up some checkpatch warnings for code surrounding the changes. This should apply cleanly on top of the patch to remove Local_System_Name. Reported-and-Reviwed-by: Shirish Pargaonkar Signed-off-by: Jeff Layton Signed-off-by: Steve French commit a0f8b4fb4cab4bc32caaf34fc0a0c9d5dd369186 Author: Jeff Layton Date: Fri Jan 7 11:30:28 2011 -0500 cifs: remove unnecessary locking around sequence_number The server->sequence_number is already protected by the srv_mutex. The GlobalMid_lock is unneeded here. Reviewed-by: Shirish Pargaonkar Signed-off-by: Jeff Layton Signed-off-by: Steve French commit 197a1eeb7f89c1d2ba93713398e9655899aa973e Author: Steve French Date: Sun Jan 9 23:26:56 2011 +0000 [CIFS] Fix minor merge conflict in fs/cifs/dir.c Signed-off-by: Steve French commit acc6f11272ce4f77c40b1a6292eb198fd6aaf8c3 Merge: 7e12eddb73d4f288b0339ee13832a34d6bc4fd90 0c21e3aaf6ae85bee804a325aa29c325209180fd Author: Steve French Date: Sun Jan 9 23:18:16 2011 +0000 Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6 Conflicts: fs/cifs/dir.c commit d2e7ad19229f982fc1eb731827d82ceac90abfb3 Merge: d03a5d888fb688c832d470b749acc5ed38e0bc1d 0c21e3aaf6ae85bee804a325aa29c325209180fd Author: James Morris Date: Mon Jan 10 09:46:24 2011 +1100 Merge branch 'master' into next Conflicts: security/smack/smack_lsm.c Verified and added fix by Stephen Rothwell Ok'd by Casey Schaufler Signed-off-by: James Morris commit 6099469805c24af14250e182bb9ca082b8a6b716 Author: Roland Stigge Date: Sun Jan 9 09:31:39 2011 -0500 hwmon: Support for Dallas Semiconductor DS620 Driver for Dallas Semiconductor DS620 temperature sensor and thermostat Signed-off-by: Roland Stigge Signed-off-by: Guenter Roeck commit a45b0616e7ee9db4c1b2b9a4a79a974325fa9bf3 Merge: 3c0eee3fe6a3a1c745379547c7e7c904aa64f6d5 8165984acf825917437debae519209073c32a5a7 Author: Pekka Enberg Date: Sun Jan 9 11:05:53 2011 +0200 Merge branch 'slab/next' into for-linus commit a081748735c5feb96b1365e78a5ff0fb6ca7e3a4 Author: Grant Likely Date: Sat Jan 8 21:42:42 2011 -0700 of/flattree: forward declare struct device_node in of_fdt.h This patch forward declares struct device_node to fix a compile error when of_fdt.h is included, but of.h is not. Alternately, including linux/of.h could have been added to of_fdt.h, but that pulls in a lot of unnecessary declarations when only working with the flattened form. Signed-off-by: Grant Likely commit 430400b86304ea729ba10f2966a8af67da60a37f Author: Urs Fleisch Date: Fri Jan 7 07:15:39 2011 +0000 hwmon: driver for Sensirion SHT21 humidity and temperature sensor Signed-off-by: Urs Fleisch Acked-by: Jonathan Cameron Signed-off-by: Guenter Roeck commit c6c2c1636e30bcd26c6b0d208324055a03c5ab9c Author: Guenter Roeck Date: Thu Jan 6 07:52:03 2011 -0800 hwmon: Add humidity attribute to sysfs ABI The humidity attribute is already supported by the sht15 driver, and another driver supporting it is about to be added. Make it official. Signed-off-by: Guenter Roeck Acked-by: Jonathan Cameron Acked-by: Jean Delvare commit 581693b51e44bb2c0cca16ab0c8d3cb535fd2ac8 Author: Guenter Roeck Date: Mon Jun 28 13:22:27 2010 -0700 hwmon: sysfs ABI updates Add attributes supported by various PMBus devices to hwmon sysfs ABI. Signed-off-by: Guenter Roeck commit ae9e0ce73e9fc55a620e0b3bd4a154330a7e64cc Author: Jan Beulich Date: Mon Dec 6 11:48:35 2010 -0500 hwmon: (via-cputemp) sync hotplug handling with coretemp/pkgtemp Signed-off-by: Jan Beulich Signed-off-by: Guenter Roeck commit 0f1deb4b820cfacf22492abd7b17e891dafc51ae Author: Davide Rizzo Date: Thu Nov 18 07:23:00 2010 -0800 hwmon: (lm95241) Rewrite to avoid using macros Signed-off-by: Davide Rizzo [guenter.roeck@ericsson.com: Formatting changes] Signed-off-by: Guenter Roeck commit 2bfe814826b7266a489895f731a777f8cbe37963 Author: Guenter Roeck Date: Wed Nov 10 10:42:21 2010 -0800 hwmon: (applesmc) Fix checkpatch errors and fix value range checks This patch fixes all checkpatch errors and most of the checkpatch warnings. It also fixes the range check in applesmc_store_fan_speed(). Signed-off-by: Guenter Roeck Acked-by: Henrik Rydberg commit 41e71f97174ba08fcca7f31bf448de92abc8862e Author: Henrik Rydberg Date: Tue Nov 9 15:15:11 2010 +0000 hwmon: (applesmc) Update copyright information With the preceding patches, git blame assigns about half of the file to the present author. Add a line to the copyright to reflect this. Signed-off-by: Henrik Rydberg Signed-off-by: Guenter Roeck commit 0b8ad5a57b75322e4b671ef420b5fe90e5154912 Author: Henrik Rydberg Date: Tue Nov 9 15:15:10 2010 +0000 hwmon: (applesmc) Silence driver Make the driver report a single line on success. Signed-off-by: Henrik Rydberg Signed-off-by: Guenter Roeck commit 0b0b5dff8967a4468f05174d0d74e1ed6e369776 Author: Henrik Rydberg Date: Tue Nov 9 15:15:09 2010 +0000 hwmon: (applesmc) Simplify feature sysfs handling Given the dynamic node construction method, the setup of the accelerometer, light sensor and keyboard backlight sysfs nodes can be simplified. This patch does not contain any logic changes. Signed-off-by: Henrik Rydberg Signed-off-by: Guenter Roeck commit 3eba2bf7c5fb7863412554cd73646cb80ac293ff Author: Henrik Rydberg Date: Tue Nov 9 15:15:08 2010 +0000 hwmon: (applesmc) Dynamic creation of fan files With the dynamic temperature group in place, the setup of fans can be simplified. This patch sets up the fans dynamically, removing a hundred lines of code. Signed-off-by: Henrik Rydberg Signed-off-by: Guenter Roeck commit 40ef06f1120bcc0a2ad483b5cd42f58c4df78a5b Author: Henrik Rydberg Date: Wed Nov 10 10:58:05 2010 +0000 hwmon: (applesmc) Extract all features generically With temperature keys being determined automatically, the dmi match data is only used to assign features that can easily be detected from the smc. This patch removes the dmi match data altogether, and reduces the match table to the main machine models. Signed-off-by: Henrik Rydberg Signed-off-by: Guenter Roeck commit dcdea2614ab9b7864a3ae620419d04e0cc4a65cc Author: Henrik Rydberg Date: Tue Nov 9 15:15:06 2010 +0000 hwmon: (applesmc) Handle new temperature format The recent Macbooks have temperature registers of a new type. This patch adds the logic to handle them. Signed-off-by: Henrik Rydberg Signed-off-by: Guenter Roeck commit 9792dadfce22ae1518c88577ac743a3077a85084 Author: Henrik Rydberg Date: Wed Nov 10 10:58:04 2010 +0000 hwmon: (applesmc) Dynamic creation of temperature files The current driver creates temperature files based on a list of temperature keys given per device. Apart from slow adaption to new machine models, the number of sensors also depends on the number of processors. This patch looks up the temperature keys dynamically, thereby supporting all models. Signed-off-by: Henrik Rydberg Signed-off-by: Guenter Roeck commit 5874583d5662de5550b0ed1c54a9dea70bcdcba4 Author: Henrik Rydberg Date: Wed Nov 10 10:58:03 2010 +0000 hwmon: (applesmc) Introduce a register lookup table One main problem with the current driver is the inability to quickly search for supported keys, resulting in detailed feature maps per machine model which are cumbersome to maintain. This patch adds a register lookup table, which enables binary search for supported keys. The lookup also reduces the io frequency, so the original mutex is replaced by locks around the actual io. Signed-off-by: Henrik Rydberg [guenter.roeck@ericsson.com: Added value range check to key_at_index_store()] Signed-off-by: Guenter Roeck commit 1ee7c71bd1aa9758f14e1be92310215a5bd0abe7 Author: Joe Perches Date: Tue Nov 9 15:15:03 2010 +0000 hwmon: (applesmc) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Henrik Rydberg Signed-off-by: Guenter Roeck commit 2344cd0c2e9ea8f3037be11fb997ddbeda0237ca Author: Henrik Rydberg Date: Tue Nov 9 15:15:02 2010 +0000 hwmon: (applesmc) Relax the severity of device init failure The device init is used to reset the accelerometer. Failure to reset is not severe enough to stop loading the module or to resume from hibernation. This patch relaxes failure to a warning and drops output in case of success. Cc: stable@kernel.org Signed-off-by: Henrik Rydberg Signed-off-by: Guenter Roeck commit 132af03233b493101a53010383b5abb5b9ff1e51 Author: Edgar Hucek Date: Tue Nov 9 15:15:01 2010 +0000 hwmon: (applesmc) Add MacBookAir3,1(3,2) support This patch add support for the MacBookAir3,1 and MacBookAir3,2 to the applesmc driver. [rydberg@euromail.se: minor cleanup] Cc: stable@kernel.org Signed-off-by: Edgar Hucek Signed-off-by: Henrik Rydberg Signed-off-by: Guenter Roeck commit 18de030f1dbaef0c13cf393899a298d978aa200f Author: Joe Perches Date: Wed Oct 20 06:51:55 2010 +0000 hwmon: (w83627hf) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit abdc6fd189405a83ebd20aa9facfbdf3c179d48a Author: Joe Perches Date: Wed Oct 20 06:51:54 2010 +0000 hwmon: (w83627ehf) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 9d72be0da16da10e27f6a8c01f877db6c513413d Author: Joe Perches Date: Wed Oct 20 06:51:53 2010 +0000 hwmon: (vt8231) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 5ed9ba6b87545d21b48e50a028bfb79f9812f89f Author: Joe Perches Date: Wed Oct 20 06:51:52 2010 +0000 hwmon: (vt1211) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 774f7827e13cfae720306ca44b83b93ab2a6b9be Author: Joe Perches Date: Wed Oct 20 06:51:51 2010 +0000 hwmon: (via686a) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit edb8d53c684da4062ac8c461727ddc1839336aa5 Author: Joe Perches Date: Wed Oct 20 06:51:50 2010 +0000 hwmon: (via-cputemp) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 512504e9f5489dbe85c80fd2c1b44ab5a8e0d5fa Author: Joe Perches Date: Wed Oct 20 06:51:49 2010 +0000 hwmon: (smsc47m1) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit bf1a85eff87eeb0651b1c5b348d51206ec7c0ef5 Author: Joe Perches Date: Wed Oct 20 06:51:48 2010 +0000 hwmon: (smsc47b397) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 4b2515dbb94341db01db3208f9f40658c5e2a251 Author: Joe Perches Date: Wed Oct 20 06:51:47 2010 +0000 hwmon: (sis5595) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 14a613cc23869d0ca69154bbc5816004fe201b17 Author: Joe Perches Date: Wed Oct 20 06:51:46 2010 +0000 hwmon: (pkgtemp) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 2caec1343e0cfe59bacf3d4f67d69ab6283cc75b Author: Joe Perches Date: Wed Oct 20 06:51:45 2010 +0000 hwmon: (pcf8591) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 5713017ec5e1a437ae4d0d196bce46d572eb7e1a Author: Joe Perches Date: Wed Oct 20 06:51:41 2010 +0000 hwmon: (lm70) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 63366d37ad5dbb4f208b517c88ea4bd41738dbf7 Author: Joe Perches Date: Wed Oct 20 06:51:40 2010 +0000 hwmon: (lis3lv02d) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 55d705cce829c37999f26a8d4f1dd701013e7920 Author: Joe Perches Date: Wed Oct 20 06:51:38 2010 +0000 hwmon: (ibmaem) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit c95df1ae69b85d5f306d86164e245aae614b852a Author: Joe Perches Date: Wed Oct 20 06:51:37 2010 +0000 hwmon: (core) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 1f923c7a6726b224b6b1b059da5a7f8e3dff1196 Author: Joe Perches Date: Wed Oct 20 06:51:36 2010 +0000 hwmon: (hwmon-vid) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 53ab0e6888925ae3ebe931c060120b0f11c1923c Author: Joe Perches Date: Wed Oct 20 06:51:35 2010 +0000 hwmon: (hp_accel) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 22d3b41281b4c1a55086fa4dff7abb4f0c36403e Author: Joe Perches Date: Wed Oct 20 06:51:34 2010 +0000 hwmon: (f71882fg) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit e54c5ad61f4e2c4fdfbdb8dff31fc604073d3550 Author: Joe Perches Date: Wed Oct 20 06:51:33 2010 +0000 hwmon: (f71805f) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 9c6e13b411cf0f656b7d7a78ec35bf0069f631bb Author: Joe Perches Date: Wed Oct 20 06:51:32 2010 +0000 hwmon: (dme1737) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit f8bb8925682f355dc20f721bda7021ef13e5869f Author: Joe Perches Date: Wed Oct 20 06:51:31 2010 +0000 hwmon: (coretemp) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit ac561494d48b92a41424cc87e2a02b545424643c Author: Joe Perches Date: Wed Oct 20 06:51:30 2010 +0000 hwmon: (asus_atk0110) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 4d630e2ba59a231c8e5031cc55e16737aa59af97 Author: Joe Perches Date: Wed Oct 20 06:51:29 2010 +0000 hwmon: (asb1000) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 2e991201e4ebffb1fb32873d72e2ee4b499269c3 Author: Joe Perches Date: Wed Oct 20 06:51:27 2010 +0000 hwmon: (adt7470) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit fe826749aec090c6f9ab48502bb9a7777572b85b Author: Joe Perches Date: Wed Oct 20 06:51:26 2010 +0000 hwmon: (abituguru3) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Added a few static strings to standardize logging messages. Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 28ebfa13f97265e415fbe19795500a6d922a6c86 Author: Joe Perches Date: Wed Oct 20 06:51:25 2010 +0000 hwmon: (abituguru) Use pr_fmt and pr_ Added #define pr_fmt KBUILD_MODNAME ": " fmt Converted printks to pr_ Coalesced any long formats Removed prefixes from formats Added a few static strings to standardize logging messages. Signed-off-by: Joe Perches Signed-off-by: Guenter Roeck commit 2ad2c320a107aceeba984f97ab2a60064101f5d5 Author: Nick Bowler Date: Fri Jan 7 21:32:02 2011 -0500 pata_platform: Remove CONFIG_HAVE_PATA_PLATFORM's dependencies. CONFIG_HAVE_PATA_PLATFORM, by virtue of where its defined, has a dependency on CONFG_ATA and CONFIG_ATA_SFF. This causes Kconfig warnings when it is selected by various architectures, such as warning: (ARCH_VEXPRESS && || ARCH_RPC && || MACH_VPAC270 && ARCH_PXA || MACH_REALVIEW_PB11MP && ARCH_REALVIEW || MACH_REALVIEW_PBA8 && ARCH_REALVIEW || MACH_REALVIEW_PBX && ARCH_REALVIEW || MACH_BAST_IDE && ARCH_S3C2410 || MACH_ANUBIS && ARCH_S3C2410) selects HAVE_PATA_PLATFORM which has unmet direct dependencies (ATA && ATA_SFF) Since this option is only used to control visibility of the CONFIG_PATA_PLATFORM option and isn't itself visible in the menu, it is straightforward to simply remove these dependencies rather than adjust all the architectures. Signed-off-by: Nick Bowler Signed-off-by: Jeff Garzik commit fc2698d5ec7e96ba2c94a942329cfa4c5d6085f7 Author: Sergei Shtylyov Date: Wed Jan 5 21:59:49 2011 +0300 pata_hpt37x: actually limit HPT370 to UltraDMA/66 The driver clearly tries to limit HPT370[A] to UltraDMA/66 if the PCI clock is less than 50 MHz but due to cut&paste type mistake this code has no effect... Signed-off-by: Sergei Shtylyov Signed-off-by: Jeff Garzik commit b197f13b53681c606e59d7d9a8a1d2d54fd363fe Author: Sergei Shtylyov Date: Tue Dec 28 23:11:36 2010 +0300 pata_hpt3x2n: coding style cleanup Fix 8 errors and 3 warnings given by checkpatch.pl: - *switch* and *case* not on the same indentation level; - no space between *for*/*switch*/*while* and open parenthesis; - space between an unary operator and its operand; - spaces before tabs; - lines over 80 characters. In addition to these changes, also do the following: - add new line after variable definitions; - fix the style of some multi-line comments. Signed-off-by: Sergei Shtylyov Signed-off-by: Jeff Garzik commit 49bfbd38bfc997e9081beabd758b2bd655d26a9c Author: Sergei Shtylyov Date: Tue Dec 28 23:09:27 2010 +0300 pata_hpt37x: coding style cleanup Fix 12 errors and 15 warnings given by checkpatch.pl: - *switch* and *case* not on the same indentation level; - no space between *for*/*switch*/*while* and open parenthesis; - space between an unary operator and its operand; - drive blacklist arrays not being *const*; - spaces before tabs; - lines over 80 characters. In addition to these changes, also do the following: - add new line after variable definitions; - fix the style of some multi-line comments. Signed-off-by: Sergei Shtylyov Signed-off-by: Jeff Garzik commit 28cd4b6b4850d7588f1033c3808314b6bc2150d5 Author: Sergei Shtylyov Date: Tue Dec 28 23:06:38 2010 +0300 pata_hpt366: coding style cleanup Fix 2 errors and 11 warnings given by checkpatch.pl: - *switch* and *case* not on the same indentation level; - no space between *switch* and open parenthesis; - drive blacklist arrays not being *const*; - spaces before tabs; - lines over 80 characters. In addition to these changes, also add new line after variable definition in hpt36x_init_chipset()... Signed-off-by: Sergei Shtylyov Signed-off-by: Jeff Garzik commit dfc7e3e37d4a22ed5fd3f6e8c9842cb1246fee4f Author: Sergei Shtylyov Date: Tue Dec 28 22:54:54 2010 +0300 pata_hpt3x2n: calculate average f_CNT Allow hpt3x2n_pci_clock() to calculate the average f_CNT register value iff HighPoint BIOS hasn't saved one, just like the 'pata_hpt37x' driver (reading the full 16-bit register, unlike what that driver does), so that this driver would work correctly on e.g. non-x86 machine with 66 MHz PCI. I'm not sure why Alan has only done this in one driver and not the other... Signed-off-by: Sergei Shtylyov Signed-off-by: Jeff Garzik commit 0ca646db68d1bd7184dfc41362d0dd9d56c0e57e Author: Sergei Shtylyov Date: Tue Dec 28 21:46:40 2010 +0300 pata_hpt3x2n: clarify about HPT371N support Commit 28e21c8c0d44cd63bad4c62f94ef0c5a1cb8402c (pata_hpt3x2n: Add HPT371N support and other bits) forgot to update the driver's Kconfig entry, heading comment, and module description (that also wrongly claims support of HPT302) which may confuse users... Signed-off-by: Sergei Shtylyov Signed-off-by: Jeff Garzik commit 8e834c2e6d51e053c6bd23fec1d95529f618f760 Author: Sergei Shtylyov Date: Sat Dec 25 22:44:01 2010 +0300 pata_hpt{37x|3x2n}: SATA mode filtering The Marvell bridge chips used on HighPoint SATA cards do not seem to support the UltraDMA modes 1, 2, and 3 as well as any MWDMA modes; these cards are based on HPT372/372A/372N/374 chips (judging from the vendor drivers), so the Linux drivers need to have a mode_filter() method for these chips... Signed-off-by: Sergei Shtylyov Signed-off-by: Jeff Garzik commit 0c21e3aaf6ae85bee804a325aa29c325209180fd Merge: 021db8e2bde53024a163fb4417a185de46fe77aa b2837fcf4994e699a4def002e26f274d95b387c1 Author: Linus Torvalds Date: Fri Jan 7 17:16:27 2011 -0800 Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/hch/hfsplus * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/hch/hfsplus: hfsplus: %L-to-%ll, macro correction, and remove unneeded braces hfsplus: spaces/indentation clean-up hfsplus: C99 comments clean-up hfsplus: over 80 character lines clean-up hfsplus: fix an artifact in ioctl flag checking hfsplus: flush disk caches in sync and fsync hfsplus: optimize fsync hfsplus: split up inode flags hfsplus: write up fsync for directories hfsplus: simplify fsync hfsplus: avoid useless work in hfsplus_sync_fs hfsplus: make sure sync writes out all metadata hfsplus: use raw bio access for partition tables hfsplus: use raw bio access for the volume headers hfsplus: always use hfsplus_sync_fs to write the volume header hfsplus: silence a few debug printks hfsplus: fix option parsing during remount Fix up conflicts due to VFS changes in fs/hfsplus/{hfsplus_fs.h,unicode.c} commit 021db8e2bde53024a163fb4417a185de46fe77aa Merge: 72eb6a791459c87a0340318840bb3bd9252b627b 07fe0351702b6f0c9749e80cdbcb758686b0fe9b Author: Linus Torvalds Date: Fri Jan 7 17:08:46 2011 -0800 Merge branch 'next-spi' of git://git.secretlab.ca/git/linux-2.6 * 'next-spi' of git://git.secretlab.ca/git/linux-2.6: (77 commits) spi/omap: Fix DMA API usage in OMAP MCSPI driver spi/imx: correct the test on platform_get_irq() return value spi/topcliff: Typo fix threhold to threshold spi/dw_spi Typo change diable to disable. spi/fsl_espi: change the read behaviour of the SPIRF spi/mpc52xx-psc-spi: move probe/remove to proper sections spi/dw_spi: add DMA support spi/dw_spi: change to EXPORT_SYMBOL_GPL for exported APIs spi/dw_spi: Fix too short timeout in spi polling loop spi/pl022: convert running variable spi/pl022: convert busy flag to a bool spi/pl022: pass the returned sglen to the DMA engine spi/pl022: map the buffers on the DMA engine spi/topcliff_pch: Fix data transfer issue spi/imx: remove autodetection spi/pxa2xx: pass of_node to spi device and set a parent device spi/pxa2xx: Modify RX-Tresh instead of busy-loop for the remaining RX bytes. spi/pxa2xx: Add chipselect support for Sodaville spi/pxa2xx: Consider CE4100's FIFO depth spi/pxa2xx: Add CE4100 support ... commit 72eb6a791459c87a0340318840bb3bd9252b627b Merge: 23d69b09b78c4876e134f104a3814c30747c53f1 55ee4ef30241a62b700f79517e6d5ef2ddbefa67 Author: Linus Torvalds Date: Fri Jan 7 17:02:58 2011 -0800 Merge branch 'for-2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu * 'for-2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu: (30 commits) gameport: use this_cpu_read instead of lookup x86: udelay: Use this_cpu_read to avoid address calculation x86: Use this_cpu_inc_return for nmi counter x86: Replace uses of current_cpu_data with this_cpu ops x86: Use this_cpu_ops to optimize code vmstat: User per cpu atomics to avoid interrupt disable / enable irq_work: Use per cpu atomics instead of regular atomics cpuops: Use cmpxchg for xchg to avoid lock semantics x86: this_cpu_cmpxchg and this_cpu_xchg operations percpu: Generic this_cpu_cmpxchg() and this_cpu_xchg support percpu,x86: relocate this_cpu_add_return() and friends connector: Use this_cpu operations xen: Use this_cpu_inc_return taskstats: Use this_cpu_ops random: Use this_cpu_inc_return fs: Use this_cpu_inc_return in buffer.c highmem: Use this_cpu_xx_return() operations vmstat: Use this_cpu_inc_return for vm statistics x86: Support for this_cpu_add, sub, dec, inc_return percpu: Generic support for this_cpu_add, sub, dec, inc_return ... Fixed up conflicts: in arch/x86/kernel/{apic/nmi.c, apic/x2apic_uv_x.c, process.c} as per Tejun. commit 23d69b09b78c4876e134f104a3814c30747c53f1 Merge: e744070fd4ff9d3114277e52d77afa21579adce2 569ff2de2e1c8ac67c8df3a7367d46d0d9460a35 Author: Linus Torvalds Date: Fri Jan 7 16:58:04 2011 -0800 Merge branch 'for-2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq * 'for-2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq: (33 commits) usb: don't use flush_scheduled_work() speedtch: don't abuse struct delayed_work media/video: don't use flush_scheduled_work() media/video: explicitly flush request_module work ioc4: use static work_struct for ioc4_load_modules() init: don't call flush_scheduled_work() from do_initcalls() s390: don't use flush_scheduled_work() rtc: don't use flush_scheduled_work() mmc: update workqueue usages mfd: update workqueue usages dvb: don't use flush_scheduled_work() leds-wm8350: don't use flush_scheduled_work() mISDN: don't use flush_scheduled_work() macintosh/ams: don't use flush_scheduled_work() vmwgfx: don't use flush_scheduled_work() tpm: don't use flush_scheduled_work() sonypi: don't use flush_scheduled_work() hvsi: don't use flush_scheduled_work() xen: don't use flush_scheduled_work() gdrom: don't use flush_scheduled_work() ... Fixed up trivial conflict in drivers/media/video/bt8xx/bttv-input.c as per Tejun. commit 4ead36407b41eae942c8c9f70ef963cd369c90e2 Author: Stefan Achatz Date: Fri Dec 10 19:43:34 2010 +0100 HID: roccat: Update sysfs attribute doc Updated sysfs attribute documentation to reflect recent changes in driver design. The device specific attributes moved from the driver to the respective roccat char device. Signed-off-by: Stefan Achatz Signed-off-by: Jiri Kosina commit 4d043101897768dfde30a6f2674fc7cec403d6b0 Author: Jiri Kosina Date: Thu Dec 9 14:29:34 2010 +0100 HID: roccat: don't use #pragma pack Replace #pragma pack ocurences with __atribute__((__packed__)); Signed-off-by: Jiri Kosina commit 47dbdbffe15b9582a41727766d43f1d4208e977e Author: Stefan Achatz Date: Fri Nov 26 19:57:42 2010 +0000 HID: roccat: Add support for Roccat Kone[+] v2 This patch adds support for Roccat Kone[+] gaming mouse. Kone[+] is an enhanced version of the old Kone with more memory for macros, a better sensor and more functionality. This driver is conceptual similar to the existing Kone and Pyra drivers. Userland tools can soon be found at http://sourceforge.net/projects/roccat Signed-off-by: Stefan Achatz Signed-off-by: Jiri Kosina commit 14a057f80f0c4d45a9e68009f8bcb6b246e87ca0 Author: Stefan Achatz Date: Fri Nov 26 19:57:38 2010 +0000 HID: roccat: reduce number of functions in kone and pyra drivers The profile number is now passed via bin_attribute->private instead of function parameter to reduce number of functions. Signed-off-by: Stefan Achatz Signed-off-by: Jiri Kosina commit bd3a2b96631dd86b06dca96aef00790084a11e15 Author: Stefan Achatz Date: Fri Nov 26 19:57:36 2010 +0000 HID: roccat: declare meaning of pack pragma usage in driver headers Using pack pragma to prevent padding bytes in binary data structures used for hardware communication. Explanation of these pragmas was requested. Signed-off-by: Stefan Achatz Signed-off-by: Jiri Kosina commit 5012aada506cb8b570e46579077c0ec5b82ebd5d Author: Stefan Achatz Date: Fri Nov 26 19:57:33 2010 +0000 HID: roccat: use class for char device for sysfs attribute creation Adding sysfs attributes to an already created device raises no userland notification. Now the device drivers associate the devices attributes with a class and use this for roccat event char device creation. Signed-off-by: Stefan Achatz Signed-off-by: Jiri Kosina commit c97415a72521071c235e0879f9a600014afd87b1 Author: Stefan Achatz Date: Fri Nov 26 19:57:29 2010 +0000 sysfs: Introducing binary attributes for struct class Added dev_bin_attrs to struct class similar to existing dev_attrs. Signed-off-by: Stefan Achatz Acked-by: Greg Kroah-Hartman Signed-off-by: Jiri Kosina commit a7153258b70ccbe3922fcee9ca4271d4f4c2bc55 Merge: ae5e49c79c051ea1d5ca91cbd4a0d22189067ba3 0fbf8ed976af5bb43cf9cf2492161eb9688fee0c Author: Jiri Kosina Date: Sat Jan 8 01:08:19 2011 +0100 Merge branches 'upstream' and 'upstream-fixes' into for-linus commit e14411da420bad7bdaae65cccd8787674e6c565e Author: Jeff Ohlstein Date: Tue Nov 30 13:06:36 2010 -0800 msm: add SMP support for msm Signed-off-by: Jeff Ohlstein Signed-off-by: David Brown commit 9f1890a5de2a5fcf4fd9ffa3115047eed834349c Author: Jeff Ohlstein Date: Thu Dec 2 12:11:27 2010 -0800 msm: hotplug: support cpu hotplug on msm Signed-off-by: Jeff Ohlstein Signed-off-by: David Brown commit 94790ec25fdd51dc4126cc176f2e104f80f87fcb Author: Jeff Ohlstein Date: Thu Dec 2 12:05:12 2010 -0800 msm: timer: SMP timer support for msm The msm provides timer hardware that is private to each core. Each timer has separate counter and match registers, so we create separate clock_event_devices for each core. For the global clocksource, use cpu 0's counter. Signed-off-by: Jeff Ohlstein Signed-off-by: David Brown commit 7b181446c68768e2f3231a0885095ee41261dcde Author: Stepan Moskovchenko Date: Thu Oct 14 19:19:21 2010 -0700 msm: scm-boot: Support for setting cold/warm boot addresses Add support for setting the cold boot address of core 1 and the warm boot addresses of cores 0 and 1 using a secure domain call. Signed-off-by: Stepan Moskovchenko Signed-off-by: David Brown commit 2a1eb58a86514037c8b59eb13a14b0e2a9cc0fb3 Author: Stephen Boyd Date: Fri Aug 27 10:01:23 2010 -0700 msm: Secure Channel Manager (SCM) support SCM is the protocol used to communicate between the secure and non-secure code executing on the applications processor. The non-secure side uses a physically contiguous buffer to pass information to the secure side; where the buffer conforms to a format that is agreed upon by both sides. The use of a buffer allows multiple pending requests to be in flight on the secure side. It also benefits use cases where the command or response buffer contains large chunks of data. Reviewed-by: Saravana Kannan Signed-off-by: Stephen Boyd Signed-off-by: David Brown commit e744070fd4ff9d3114277e52d77afa21579adce2 Merge: d004e4d3322340b6433caaef4a47ab8c933afb70 c9b5f501ef1580faa30c40c644b7691870462201 Author: Linus Torvalds Date: Fri Jan 7 14:55:48 2011 -0800 Merge branch 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: sched: Constify function scope static struct sched_param usage sched: Fix strncmp operation sched: Move sched_autogroup_exit() to free_signal_struct() sched: Fix struct autogroup memory leak sched: Mark autogroup_init() __init sched: Consolidate the name of root_task_group and init_task_group commit d004e4d3322340b6433caaef4a47ab8c933afb70 Merge: 128283a47e7cc6754db3d2704004c1ed728d26db 1c2a48cf65580a276552151eb8f78d78c55b828e Author: Linus Torvalds Date: Fri Jan 7 14:55:31 2011 -0800 Merge branch 'x86-apic-cleanups-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-apic-cleanups-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86: apic: Cleanup and simplify setup_local_APIC() x86: Further simplify mp_irq info handling x86: Unify 3 similar ways of saving mp_irqs info x86, ioapic: Avoid writing io_apic id if already correct x86, x2apic: Don't map lapic addr for preenabled x2apic systems x86, sfi: Use register_lapic_address() x86, apic: Use register_lapic_address() in init_apic_mapping() x86, apic: Remove early_init_lapic_mapping() x86, apic: Unify identical register_lapic_address() functions commit 128283a47e7cc6754db3d2704004c1ed728d26db Merge: 442d1ba237c81304ccfa33887094e843183645f7 6d5db4668796d903dc3bad2852c82073509c37d2 Author: Linus Torvalds Date: Fri Jan 7 14:54:03 2011 -0800 Merge branch 'mce-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp * 'mce-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp: EDAC, MCE: Fix NB error formatting EDAC, MCE: Use BIT_64() to eliminate warnings on 32-bit EDAC, MCE: Enable MCE decoding on F15h EDAC, MCE: Allow F15h bank 6 MCE injection EDAC, MCE: Shorten error report formatting EDAC, MCE: Overhaul error fields extraction macros EDAC, MCE: Add F15h FP MCE decoder EDAC, MCE: Add F15 EX MCE decoder EDAC, MCE: Add an F15h NB MCE decoder EDAC, MCE: No F15h LS MCE decoder EDAC, MCE: Add F15h CU MCE decoder EDAC, MCE: Add F15h IC MCE decoder EDAC, MCE: Add F15h DC MCE decoder EDAC, MCE: Select extended error code mask commit 442d1ba237c81304ccfa33887094e843183645f7 Merge: fb5131e1880ea1ba3ba7197cd5cc66c9c288f715 a135cef79a2927ecff800492a26cd314e9cba996 Author: Linus Torvalds Date: Fri Jan 7 14:53:42 2011 -0800 Merge branch 'edac-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp * 'edac-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp: amd64_edac: Disable DRAM ECC injection on K8 EDAC: Fixup scrubrate manipulation amd64_edac: Remove two-stage initialization amd64_edac: Check ECC capabilities initially amd64_edac: Carve out ECC-related hw settings amd64_edac: Remove PCI ECS enabling functions amd64_edac: Remove explicit Kconfig PCI dependency amd64_edac: Allocate driver instances dynamically amd64_edac: Rework printk macros amd64_edac: Rename CPU PCI devices amd64_edac: Concentrate per-family init even more amd64_edac: Cleanup the CPU PCI device reservation amd64_edac: Simplify CPU family detection amd64_edac: Add per-family init function amd64_edac: Use cached extended CPU model amd64_edac: Remove F11h support commit fb5131e1880ea1ba3ba7197cd5cc66c9c288f715 Merge: d074b104cefcb6e8ded55a53e62fed59a246f55d 8e1023016cf17152972b98bce6c144834a4916d5 Author: Linus Torvalds Date: Fri Jan 7 14:50:50 2011 -0800 Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6 * 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6: (65 commits) [S390] prevent unneccesary loops_per_jiffy recalculation [S390] cpuinfo: use get_online_cpus() instead of preempt_disable() [S390] smp: remove cpu hotplug messages [S390] mutex: enable spinning mutex on s390 [S390] mutex: Introduce arch_mutex_cpu_relax() [S390] cio: fix ccwgroup unregistration race condition [S390] perf: add DWARF register lookup for s390 [S390] cleanup ftrace backend functions [S390] ptrace cleanup [S390] smp/idle: call init_idle() before starting a new cpu [S390] smp: delay idle task creation [S390] dasd: Correct retry counter for terminated I/O. [S390] dasd: Add support for raw ECKD access. [S390] dasd: Prevent deadlock during suspend/resume. [S390] dasd: Improve handling of stolen DASD reservation [S390] dasd: do path verification for paths added at runtime [S390] dasd: add High Performance FICON multitrack support [S390] cio: reduce memory consumption of itcw structures [S390] nmi: enable machine checks early [S390] qeth: buffer count imbalance ... commit d074b104cefcb6e8ded55a53e62fed59a246f55d Merge: 31b6ca0af758a88e5e769b48cc6dde037ee37b96 c413521eb4e2d7ffd5ce432a144708d479054bd3 Author: Linus Torvalds Date: Fri Jan 7 14:50:14 2011 -0800 Merge branch 'rmobile-latest' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 * 'rmobile-latest' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6: (67 commits) ARM: mach-shmobile: update for SMP changes. ARM: mach-shmobile: update for GIC changes. ARM: mach-shmobile: Fix up clkdev fallout for SH73A0. dma: shdma: don't register the global die notifier multiple times ARM: mach-shmobile: Rely on run-time IRQ handlers ARM: mach-shmobile: Run-time IRQ handler for GIC ARM: mach-shmobile: Run-time IRQ handler for INTCA ARM: mach-shmobile: Enable CONFIG_MULTI_IRQ_HANDLER ARM: mach-shmobile: Use shared GIC entry macros ARM: mach-shmobile: mackerel: Add zboot support ARM: mach-shmobile: mackerel: Add HDMI sound support ARM: mach-shmobile: mackerel: add HDMI video support ARM: mach-shmobile: ap4evb: fixup clk_put timing of fsib_clk ARM: mach-shmobile: sh73a0: fix div4 table ARM: mach-shmobile: ap4/mackerel: modify wrong comment out of USB ARM: mach-shmobile: Mackerel VGA camera support mmc: sh_mmcif: make DMA support by the driver unconditional ARM: mach-shmobile: Add eMMC support through MMCIF on AG5EVM ARM: mach-shmobile: Use pullups for AG5EVM KEYSC pins ARM: mach-shmobile: sh73a0 GPIO pullup improvement ... commit 31b6ca0af758a88e5e769b48cc6dde037ee37b96 Merge: 56b85f32d530d09d6805488ad00775d4e0e3baab 554738da71004d96e06fb75f4772dfc3b0f47810 Author: Linus Torvalds Date: Fri Jan 7 14:45:47 2011 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (58 commits) Input: wacom_w8001 - support pen or touch only devices Input: wacom_w8001 - use __set_bit to set keybits Input: bu21013_ts - fix misuse of logical operation in place of bitop Input: i8042 - add Acer Aspire 5100 to the Dritek list Input: wacom - add support for digitizer in Lenovo W700 Input: psmouse - disable the synaptics extension on OLPC machines Input: psmouse - fix up Synaptics comment Input: synaptics - ignore bogus mt packet Input: synaptics - add multi-finger and semi-mt support Input: synaptics - report clickpad property input: mt: Document interface updates Input: fix double equality sign in uevent Input: introduce device properties hid: egalax: Add support for Wetab (726b) Input: include MT library as source for kerneldoc MAINTAINERS: Update input-mt entry hid: egalax: Add support for Samsung NB30 netbook hid: egalax: Document the new devices in Kconfig hid: egalax: Add support for Wetab hid: egalax: Convert to MT slots ... Fixed up trivial conflict in drivers/input/keyboard/Kconfig commit 56b85f32d530d09d6805488ad00775d4e0e3baab Merge: 3e5b08cbbf78bedd316904ab0cf3b27119433ee5 568389c257fa7d74ce36c2f78bad31965fded4cf Author: Linus Torvalds Date: Fri Jan 7 14:39:20 2011 -0800 Merge branch 'tty-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6 * 'tty-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6: (36 commits) serial: apbuart: Fixup apbuart_console_init() TTY: Add tty ioctl to figure device node of the system console. tty: add 'active' sysfs attribute to tty0 and console device drivers: serial: apbuart: Handle OF failures gracefully Serial: Avoid unbalanced IRQ wake disable during resume tty: fix typos/errors in tty_driver.h comments pch_uart : fix warnings for 64bit compile 8250: fix uninitialized FIFOs ip2: fix compiler warning on ip2main_pci_tbl specialix: fix compiler warning on specialix_pci_tbl rocket: fix compiler warning on rocket_pci_ids 8250: add a UPIO_DWAPB32 for 32 bit accesses 8250: use container_of() instead of casting serial: omap-serial: Add support for kernel debugger serial: fix pch_uart kconfig & build drivers: char: hvc: add arm JTAG DCC console support RS485 documentation: add 16C950 UART description serial: ifx6x60: fix memory leak serial: ifx6x60: free IRQ on error Serial: EG20T: add PCH_UART driver ... Fixed up conflicts in drivers/serial/apbuart.c with evil merge that makes the code look fairly sane (unlike either side). commit 4a198be7f072190a44033b7de6084b090b9885ee Author: Albert Astals Cid Date: Fri Jan 7 17:29:44 2011 -0500 Support KHLB2 in the compal laptop driver Add the KHLB2 model identifier to the list of supported models Signed-off-by: Albert Astals Cid Signed-off-by: Matthew Garrett commit 59ccf2f3d55c06fd34613f1f78de0279436a7b35 Author: From: Lee, Chun-Yi Date: Fri Jan 7 17:25:14 2011 -0500 acer-wmi: Enabled Acer Launch Manager mode Enabled Acer Launch Manager mode to disable the EC raw behavior for communication devices when WMID3 method available. And, we also add a ec_raw_mode kernel module option for enable The EC raw behavior mode when anyone what reset it back. When Acer Launch Manager mode enabled, EC will stop to touch any communication devices' RF state or power state that causes conflict with rfkill_input or any userland daemon to charge the rfkill rules. Signed-off-by: Lee, Chun-Yi Acked-by: Thomas Renninger Acked-by: Jiri Benc Acked-by: Dmitry Torokhov Signed-off-by: Carlos Corbacho Cc: Corentin Chary Signed-off-by: Matthew Garrett commit 456dc301cc3b547b2a674de3028f53fb1453e532 Author: Feng Tang Date: Fri Dec 31 09:48:20 2010 +0800 [PATCH] intel_pmic_gpio: modify EOI handling following change of kernel irq subsystem Latest kernel has many changes in IRQ subsystem and its interfaces, like adding "irq_eoi" for struct irq_chip, this patch will make it support both the new and old interface. Cc: Alek Du Signed-off-by: Feng Tang Signed-off-by: Matthew Garrett commit 213658516fd5e125eb7a97995f6cae8996f8015b Author: Jesper Juhl Date: Fri Dec 24 19:56:28 2010 +0100 ACPI Thinkpad: We must always call va_end() after va_start() but do not do so in thinkpad_acpi.c::acpi_evalf() Hi, In drivers/platform/x86/thinkpad_acpi.c::acpi_evalf() we don't always call va_end() after va_start(). This patch corrects that. Signed-off-by: Jesper Juhl Acked-by: Henrique de Moraes Holschuh Signed-off-by: Matthew Garrett commit 466449cfe797b8a5d82d25d0e0e08426d8dfba19 Author: Lee, Chun-Yi Date: Mon Dec 13 10:02:41 2010 +0800 acer-wmi: Initialize wlan/bluetooth/wwan rfkill software block state Initial wlan/bluetooth/wwan rfkill software block state when acer-wmi driver probe. Acer notebook can save the devices state and this patch can use it to initial the devices' rfkill state. Signed-off-by: Lee, Chun-Yi Acked-by: Thomas Renninger Cc: Carlos Corbacho Signed-off-by: Matthew Garrett commit 6c3df88f19375217f0dbfc6160e8c2a635f56c53 Author: Lee, Chun-Yi Date: Tue Dec 7 10:29:23 2010 +0800 acer-wmi: Detect the WiFi/Bluetooth/3G devices available Check the Acer OEM-specific Type AA to detect the WiFi/Bluetooth/3G devices available or not, and set the devices capability flag. Signed-off-by: Lee, Chun-Yi Reviewed-by: Jean Delvare Reviewed-by: Dmitry Torokhov Acked-by: Thomas Renninger Acked-by: Jiri Benc Cc: Carlos Corbacho Cc: Corentin Chary Signed-off-by: Matthew Garrett commit b3c9092b2fed427d45117d23ceb577ad8dc46a9a Author: Lee, Chun-Yi Date: Tue Dec 7 10:29:22 2010 +0800 acer-wmi: Add 3G rfkill sysfs file Add 3G rfkill sysfs file for provide userland to control 3G device on/off by using WMI method. Signed-off-by: Lee, Chun-Yi Acked-by: Thomas Renninger Acked-by: Jiri Benc Acked-by: Dmitry Torokhov Signed-off-by: Carlos Corbaho Cc: Corentin Chary Signed-off-by: Matthew Garrett commit 3fdca87d10f1d45b1c034da343e68beb082f9b84 Author: Lee, Chun-Yi Date: Tue Dec 7 10:29:20 2010 +0800 acer-wmi: Add acer wmi hotkey events support Add acer wmi hotkey event support. Install a wmi notify handler to transfer wmi event key to key code, then send out keycode through acer wmi input device to userland. Signed-off-by: Lee, Chun-Yi Acked-by: Dmitry Torokhov Acked-by: Thomas Renninger Acked-by: Jiri Benc Signed-off-by: Carlos Corbacho Cc: Corentin Chary Signed-off-by: Matthew Garrett commit e98062ed6dc46ed3270350e1040e19d44150d1d1 Author: Sedat Dilek Date: Wed Dec 8 11:20:26 2010 +0100 platform/x86: Kconfig: Replace select by depends on ACPI_WMI With 'make oldnoconfig' I see these warnings in linux-next (next-20101208): drivers/platform/x86/Kconfig:422:error: recursive dependency detected! drivers/platform/x86/Kconfig:422: symbol EEEPC_WMI depends on ACPI_WMI drivers/platform/x86/Kconfig:438: symbol ACPI_WMI is selected by ACER_WMI drivers/platform/x86/Kconfig:18: symbol ACER_WMI depends on LEDS_CLASS drivers/leds/Kconfig:10: symbol LEDS_CLASS is selected by EEEPC_WMI This patch replaces all "select on ACPI_WMI" by "depends on ACPI_WMI". Quote from David Woodhouse: "A better policy is: "NEVER USE SELECT"." Reported-and-tested-by: Sedat Dilek Signed-off-by: Sedat Dilek Acked-by: Randy Dunlap Signed-off-by: Matthew Garrett commit c1f73658edc8ac6f624968b47a276361ce032ca9 Author: Ike Panhc Date: Mon Dec 13 18:01:12 2010 +0800 ideapad: pass ideapad_priv as argument (part 2) Passing ideapad_priv as argument and try not to using too much global variable. This is part 2 for rfkill. Signed-off-by: Ike Panhc Signed-off-by: Matthew Garrett commit 8693ae846cad00e6c2c40e116ec1fc50c145b559 Author: Ike Panhc Date: Mon Dec 13 18:01:01 2010 +0800 ideapad: pass ideapad_priv as argument (part 1) Passing ideapad_priv as argument and try not to using too much global variable. This is part 1 for platform driver and input device. Signed-off-by: Ike Panhc Signed-off-by: Matthew Garrett commit a4b5a2794a27da870c2e16db390778a4683f95f8 Author: Ike Panhc Date: Mon Dec 13 18:00:48 2010 +0800 ideapad: add markups, unify comments and return result when init 1. Add markups on init and exit functions 2. Unify the comments in the same style 3. Return result when module initial Signed-off-by: Ike Panhc Signed-off-by: Matthew Garrett commit f63409ae91ff94e2192dafbeb00c278ba299f80e Author: Ike Panhc Date: Mon Dec 13 18:00:38 2010 +0800 ideapad: add hotkey support Hotkey enabled by this patch: Fn+F3: Video mode switch Fn+F5: software rfkill for wifi For some ideapad when push Fn+F3, hardware generates Super-P keys, those key will not be enabled by this patch. Thanks for Dave Hansen report the problem. If CONFIG_INPUT_SPARSEKMAP is not set, when building, you will have error message: ERROR: "sparse_keymap_setup" [drivers/platform/x86/ideapad-laptop.ko] undefined! ERROR: "sparse_keymap_free" [drivers/platform/x86/ideapad-laptop.ko] undefined! ERROR: "sparse_keymap_report_event" [drivers/platform/x86/ideapad-laptop.ko] undefined! To select INPUT_SPARSEKMAP solve this issue. Ref: http://lkml.org/lkml/2010/12/2/340 Signed-off-by: Ike Panhc Signed-off-by: Matthew Garrett commit c9f718d0c6b4cf8033aa0f5ac892d68ddfb865aa Author: Ike Panhc Date: Mon Dec 13 18:00:27 2010 +0800 ideapad: let camera power control entry under platform driver The entry was at /sys/devices/LNXSYSTM:00/../VPC2004:00/camera_power move to /sys/devices/platform/ideapad/camera_power Add document about usage of ideapad node in sysfs. Signed-off-by: Ike Panhc Signed-off-by: Matthew Garrett commit 98ee69191d3af68e2292528cbb16dcba3d8e2b81 Author: Ike Panhc Date: Mon Dec 13 18:00:15 2010 +0800 ideapad: add platform driver for ideapad Create /sys/devices/platform/ideapad for nodes of ideapad landing. Signed-off-by: Ike Panhc Signed-off-by: Matthew Garrett commit 9c23225006b695ceba31c035b287f5a7a0b0304e Author: Namhyung Kim Date: Wed Dec 8 00:04:14 2010 +0900 fujitsu-laptop: fix compiler warning on pnp_ids Annotate pnp_ids as '__used' to fix following warning: CC drivers/platform/x86/fujitsu-laptop.o drivers/platform/x86/fujitsu-laptop.c:1243: warning: ‘pnp_ids’ defined but not used Signed-off-by: Namhyung Kim Signed-off-by: Matthew Garrett commit e1e0dacba5af2b0cd8f9043d0b937296c90bc990 Author: Dan Carpenter Date: Mon Dec 6 16:44:23 2010 -0500 WMI: return error if wmi_create_device() fails The break resets the retval to 0 but we want to return an error code. This was introduced in c64eefd48c4 "WMI: embed struct device directly into wmi_block" Signed-off-by: Dan Carpenter Signed-off-by: Matthew Garrett Acked-by: Dmitry Torokhov commit d358cb55a4cc83c37fbaebc0e4401a573777c6ac Author: Corentin Chary Date: Mon Nov 29 08:14:14 2010 +0100 eeepc-wmi: never load if legacy device is enabled If legacy device (SB.ATKD - ASUS010) used by eeepc-laptop is enabled, don't allow eeepc-wmi to load because: - eeepc-laptop may be loaded, and can conflict with eeepc-wmi (they both try to register eeepc::touchpad led for example). - the WMI interface is inteded to be used when the OS is not detected as Win 7. And when this is the case, the ASUS010 device is disabled. Signed-off-by: Corentin Chary Signed-off-by: Matthew Garrett commit 62a75d83131c8887237d26a36ffeabd53c3640fd Author: Corentin Chary Date: Mon Nov 29 08:14:13 2010 +0100 eeepc-laptop: add a getter for touchpad led Allow te get the current led state in a more accurate way. Signed-off-by: Corentin Chary Signed-off-by: Matthew Garrett commit dfed65d56f9a94466bb4afd44ec8e900a6709cda Author: Corentin Chary Date: Mon Nov 29 08:14:12 2010 +0100 eeepc-wmi: remove unneeded static Signed-off-by: Corentin Chary Signed-off-by: Matthew Garrett commit 4c4edfa3d375109c1360ce786b9df984ca65d727 Author: Corentin Chary Date: Mon Nov 29 08:14:11 2010 +0100 eeepc-wmi: claim eeepc-wmi maintainership Since eeepc-wmi has currently no official maintainer, I claim maintainership of this driver, and add it to the acpi4asus project. Signed-off-by: Corentin Chary Signed-off-by: Matthew Garrett commit 2a3f0064f2a06d5a31cddb0e452681d9f884bd8c Author: Corentin Chary Date: Mon Nov 29 08:14:10 2010 +0100 eeepc-wmi: fix confusion between ctrl_param and retval Signed-off-by: Corentin Chary Signed-off-by: Matthew Garrett commit 8c1b2d83e82e11b9447d7fb3715d6c9764f6f28d Author: Corentin Chary Date: Mon Nov 29 08:14:09 2010 +0100 eeepc-wmi: add debugfs entries eeepc-wmi/ - debugfs root directory dev_id - current dev_id ctrl_param - current ctrl_param devs - call DEVS(dev_id, ctrl_param) and print result dsts - call DSTS(dev_id) and print result DEVS and DSTS are the main functions used in eeepc-wmi, this will allow to test new features without patching the drivers. Signed-off-by: Corentin Chary Signed-off-by: Matthew Garrett commit 4e37b42d5ac0d3f505bcdc09028f3fde82031593 Author: Corentin Chary Date: Mon Nov 29 08:14:08 2010 +0100 eeepc-wmi: use attribute group to manage attributes Signed-off-by: Corentin Chary Signed-off-by: Matthew Garrett commit ba48fdb969d0404d54f6fa0266373afecbbd19d7 Author: Corentin Chary Date: Mon Nov 29 08:14:07 2010 +0100 eeepc-wmi: add rfkill support for wlan, bluetooth and 3g wimax support is missing because I don't have any DSDT with WMI and wimax support. Most of the code comes from eeepc-laptop. Signed-off-by: Corentin Chary Signed-off-by: Matthew Garrett commit 084fca63128849c0961b3cfdb0cd0345e8f51ad8 Author: Corentin Chary Date: Mon Nov 29 08:14:06 2010 +0100 eeepc-wmi: add touchpad led support Most of the code comes from eeepc-laptop. Signed-off-by: Corentin Chary Signed-off-by: Matthew Garrett commit 27c136c8738f6bec10c26aaf0a486f19edef7bf7 Author: Corentin Chary Date: Mon Nov 29 08:14:05 2010 +0100 eeepc-wmi: rework eeepc_wmi_init and eeepc_wmi_exit The old code was using platform_driver.probe to initialize eeepc_wmi context. That's a mistake because if probe fail, eeepc_platform_register() won't tell anyone, and chaos will happen. Wrap add and remove code inside eeepc_wmi_add() / eeepc_wmi_remove(), and try to use the static platform_device only in eeepc_wmi_init() and eeepc_wmi_exit() The code is now very similar to eeepc-laptop, except eeepc_laptop_add and eeepc_laptop_remove are called from acpi_driver, not module init/exit functions, but WMI doesn't provide such functionalities (yet ?). Signed-off-by: Corentin Chary Signed-off-by: Matthew Garrett commit 72135d21b587debcbcc57e0dbcc8bcfa4dacb661 Author: Herton Ronaldo Krzesinski Date: Mon Dec 6 16:46:19 2010 -0500 classmate-laptop: add missing input_sync call Add missing input_sync call in cmpc_keys_handler function. Signed-off-by: Herton Ronaldo Krzesinski Signed-off-by: Matthew Garrett Acked-by: Thadeu Lima de Souza Cascardo commit 698e1641a37f833dd26ee2fde5eed426cd97880b Author: Herton Ronaldo Krzesinski Date: Tue Nov 30 16:30:43 2010 -0200 classmate-laptop: little optimization for cmpc_rfkill_block We don't need to call bios/acpi (cmpc_set_rfkill_wlan) if the blocked state is already set to the same value (little optimization). This can happen for example if we initialize the module with same initial hardware state (rfkill core always call cmpc_rfkill_block on initialization here). Also GWRI method only accepts 0 or 1 for setting rfkill block, as can be seen on AML code from acpidump->DSDT from a classmate sample I have, so should be fine setting state only to 0 or 1 directly. Signed-off-by: Herton Ronaldo Krzesinski Signed-off-by: Matthew Garrett Acked-by: Thadeu Lima de Souza Cascardo commit 58f6425eb92f54943878b0b3f9c1e51f99c2cb72 Author: Colin King Date: Fri Nov 19 15:40:02 2010 +0000 WMI: Cater for multiple events with same GUID WMI data blocks can contain WMI events with the same GUID but with different notifiy_ids, for example volume up/down hotkeys. This patch enables a single event handler to be registered and unregistered against all events with same GUID but different notify_ids. Since an event handler is passed the notify_id of an event it can can differentiate between the different events. The patch also ensures we only register and unregister a device per unique GUID. Signed-off-by: Colin Ian King Signed-off-by: Matthew Garrett commit 3098064d3b4a9bf9d2855b2a89599ad77695e324 Author: Joe Perches Date: Sun Nov 14 19:04:38 2010 -0800 drivers/platform/x86: Remove unnecessary semicolons Signed-off-by: Joe Perches Signed-off-by: Matthew Garrett commit 5369c02d951afc72d68f5f85089160a63d31ca37 Author: Sreedhara DS Date: Fri Oct 22 15:43:55 2010 +0100 intel_scu_ipc: Utility driver for intel scu ipc This driver implements ioctl and interfaces with intel scu ipc driver. It is used to access pmic/msic registers from user space and firmware update utility. Signed-off-by: Sreedhara DS [Extensive clean up and debug] Signed-off-by: Alan Cox Signed-off-by: Matthew Garrett commit ee81b786a07f1d6062d6e14b6152f1f6cc4bc63b Author: maximilian attems Date: Fri Jan 7 16:13:06 2011 +0100 deb-pkg: s/hdr/kernel_headers_/ && s/header/libc_headers_/ hdrpackage and headerpackage are not intuitive names, use proposed alternatives by Michel Marek. While touching them move the mkdir of the kernel_headers dir up and fix it for paranoid umask. CC: Theodore Ts'o Signed-off-by: maximilian attems Signed-off-by: Michal Marek commit 3e5b08cbbf78bedd316904ab0cf3b27119433ee5 Merge: da40d036fd716f0efb2917076220814b1e927ae1 2af10844eb6ed104f9505bf3a7ba3ceb02264f31 Author: Linus Torvalds Date: Fri Jan 7 13:16:28 2011 -0800 Merge branch 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6 * 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6: (144 commits) USB: add support for Dream Cheeky DL100B Webmail Notifier (1d34:0004) USB: serial: ftdi_sio: add support for TIOCSERGETLSR USB: ehci-mxc: Setup portsc register prior to accessing OTG viewport USB: atmel_usba_udc: fix freeing irq in usba_udc_remove() usb: ehci-omap: fix tll channel enable mask usb: ohci-omap3: fix trivial typo USB: gadget: ci13xxx: don't assume that PAGE_SIZE is 4096 USB: gadget: ci13xxx: fix complete() callback for no_interrupt rq's USB: gadget: update ci13xxx to work with g_ether USB: gadgets: ci13xxx: fix probing of compiled-in gadget drivers Revert "USB: musb: pm: don't rely fully on clock support" Revert "USB: musb: blackfin: pm: make it work" USB: uas: Use GFP_NOIO instead of GFP_KERNEL in I/O submission path USB: uas: Ensure we only bind to a UAS interface USB: uas: Rename sense pipe and sense urb to status pipe and status urb USB: uas: Use kzalloc instead of kmalloc USB: uas: Fix up the Sense IU usb: musb: core: kill unneeded #include's DA8xx: assign name to MUSB IRQ resource usb: gadget: g_ncm added ... Manually fix up trivial conflicts in USB Kconfig changes in: arch/arm/mach-omap2/Kconfig arch/sh/Kconfig drivers/usb/Kconfig drivers/usb/host/ehci-hcd.c and annoying chip clock data conflicts in: arch/arm/mach-omap2/clock3xxx_data.c arch/arm/mach-omap2/clock44xx_data.c commit da40d036fd716f0efb2917076220814b1e927ae1 Merge: aa58abc20fa85328a9f048e2626c0893691ff284 c32e061fa19893ce4acf95d97d5613a161f0f1b7 Author: Linus Torvalds Date: Fri Jan 7 12:47:02 2011 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (147 commits) [SCSI] arcmsr: fix write to device check [SCSI] lpfc: lower stack use in lpfc_fc_frame_check [SCSI] eliminate an unnecessary local variable from scsi_remove_target() [SCSI] libiscsi: use bh locking instead of irq with session lock [SCSI] libiscsi: do not take host lock in queuecommand [SCSI] be2iscsi: fix null ptr when accessing task hdr [SCSI] be2iscsi: fix gfp use in alloc_pdu [SCSI] libiscsi: add more informative failure message during iscsi scsi eh [SCSI] gdth: Add missing call to gdth_ioctl_free [SCSI] bfa: remove unused defintions and misc cleanups [SCSI] bfa: remove inactive functions [SCSI] bfa: replace bfa_assert with WARN_ON [SCSI] qla2xxx: Use sg_next to fetch next sg element while walking sg list. [SCSI] qla2xxx: Fix to avoid recursive lock failure during BSG timeout. [SCSI] qla2xxx: Remove code to not reset ISP82xx on failure. [SCSI] qla2xxx: Display mailbox register 4 during 8012 AEN for ISP82XX parts. [SCSI] qla2xxx: Don't perform a BIG_HAMMER if Get-ID (0x20) mailbox command fails on CNAs. [SCSI] qla2xxx: Remove redundant module parameter permission bits [SCSI] qla2xxx: Add sysfs node for displaying board temperature. [SCSI] qla2xxx: Code cleanup to remove unwanted comments and code. ... commit aa58abc20fa85328a9f048e2626c0893691ff284 Author: Dan Carpenter Date: Fri Jan 7 20:47:37 2011 +0100 input/tc3589x: fix compile error There was a semi-colon missing and it broke the compile. Signed-off-by: Dan Carpenter Cc: Dmitry Torokhov Signed-off-by: Linus Walleij Signed-off-by: Linus Torvalds commit 07fe0351702b6f0c9749e80cdbcb758686b0fe9b Author: Russell King - ARM Linux Date: Fri Jan 7 15:49:20 2011 +0000 spi/omap: Fix DMA API usage in OMAP MCSPI driver Running the latest kernel on the 4430SDP board with DMA API debugging enabled results in this: WARNING: at lib/dma-debug.c:803 check_unmap+0x19c/0x6f0() NULL NULL: DMA-API: device driver tries to free DMA memory it has not allocated [device address=0x000000008129901a] [size=260 bytes] Modules linked in: Backtrace: [] (dump_backtrace+0x0/0x10c) from [] (dump_stack+0x18/0x1c) r7:c1839dc0 r6:c0198578 r5:c0304b17 r4:00000323 [] (dump_stack+0x0/0x1c) from [] (warn_slowpath_common+0x58/0x70) [] (warn_slowpath_common+0x0/0x70) from [] (warn_slowpath_fmt+0x38/0x40) r8:c1839e40 r7:00000000 r6:00000104 r5:00000000 r4:8129901a [] (warn_slowpath_fmt+0x0/0x40) from [] (check_unmap+0x19c/0x6f0) r3:c03110de r2:c0304e6b [] (check_unmap+0x0/0x6f0) from [] (debug_dma_unmap_page+0x74/0x80) [] (debug_dma_unmap_page+0x0/0x80) from [] (omap2_mcspi_work+0x514/0xbf0) [] (omap2_mcspi_work+0x0/0xbf0) from [] (process_one_work+0x294/0x400) [] (process_one_work+0x0/0x400) from [] (worker_thread+0x220/0x3f8) [] (worker_thread+0x0/0x3f8) from [] (kthread+0x88/0x90) [] (kthread+0x0/0x90) from [] (do_exit+0x0/0x5fc) r7:00000013 r6:c005e924 r5:c0073848 r4:c1829ee0 ---[ end trace 1b75b31a2719ed20 ]--- I've no idea why this driver uses NULL for dma_unmap_single instead of the &spi->dev that is laying around just waiting to be used in that function - but it's an easy fix. Also replace this comment with a FIXME comment: /* Do DMA mapping "early" for better error reporting and * dcache use. Note that if dma_unmap_single() ever starts * to do real work on ARM, we'd need to clean up mappings * for previous transfers on *ALL* exits of this loop... */ as the comment is not true - we do work in dma_unmap() functions, particularly on ARMv6 and above. I've corrected the existing unmap functions but if any others are required they must be added ASAP. Signed-off-by: Russell King Acked-by: Tony Lindgren Signed-off-by: Grant Likely commit 4bfc2b2eccf48fef84b9adfe4f1bd8d5e6e1bc8d Merge: 01539ba2a706ab7d35fc0667dff919ade7f87d63 05f2f274c8a8747bbfb13ac8ee0c27d5f2ad8510 Author: Tony Luck Date: Fri Jan 7 09:17:33 2011 -0800 Pull misc2.6.38 into release branch commit 05f2f274c8a8747bbfb13ac8ee0c27d5f2ad8510 Author: Tony Luck Date: Fri Jan 7 09:11:55 2011 -0800 [IA64] Avoid array overflow if there are too many cpus in SRAT table acpi_numa_init() has to parse the whole SRAT table, even if the kernel wants to limit the number of cpus it will use (because the ones it is going to use may be described by entries at the end of the SRAT table). Avoid overflowing the node_cpuid array. Reported-by: Yinghai Lu Signed-off-by: Tony Luck commit 735759389b7143f95ae7badc97511e7e4729e873 Author: Richard Genoud Date: Fri Jan 7 15:26:01 2011 +0100 spi/imx: correct the test on platform_get_irq() return value The test "if (spi_imx->irq <= 0)" is not testing the IRQ value, but the return value of platform_get_irq(). As platform_get_irq() can return an error (-ENXIO) or the IRQ value it found, the test should be "if (spi_imx->irq < 0)" [grant.likely: Note: In general, Linux irq number 0 should also mean no irq, but arm still allows devices to be assigned 0, and the imx platform uses 0 for one of the spi devices, so this patch is needed for the device to work] Signed-off-by: Richard Genoud Signed-off-by: Grant Likely commit b4a45f5fe8078bfc10837dbd5b98735058bc4698 Merge: 01539ba2a706ab7d35fc0667dff919ade7f87d63 b3e19d924b6eaf2ca7d22cba99a517c5171007b6 Author: Linus Torvalds Date: Fri Jan 7 08:56:33 2011 -0800 Merge branch 'vfs-scale-working' of git://git.kernel.org/pub/scm/linux/kernel/git/npiggin/linux-npiggin * 'vfs-scale-working' of git://git.kernel.org/pub/scm/linux/kernel/git/npiggin/linux-npiggin: (57 commits) fs: scale mntget/mntput fs: rename vfsmount counter helpers fs: implement faster dentry memcmp fs: prefetch inode data in dcache lookup fs: improve scalability of pseudo filesystems fs: dcache per-inode inode alias locking fs: dcache per-bucket dcache hash locking bit_spinlock: add required includes kernel: add bl_list xfs: provide simple rcu-walk ACL implementation btrfs: provide simple rcu-walk ACL implementation ext2,3,4: provide simple rcu-walk ACL implementation fs: provide simple rcu-walk generic_check_acl implementation fs: provide rcu-walk aware permission i_ops fs: rcu-walk aware d_revalidate method fs: cache optimise dentry and inode for rcu-walk fs: dcache reduce branches in lookup path fs: dcache remove d_mounted fs: fs_struct use seqlock fs: rcu-walk for path lookup ... commit e68077856e599cd33d8cd5db15762df60c29d361 Author: maximilian attems Date: Sat Jan 1 16:44:13 2011 +0100 deb-pkg: Make deb-pkg generate a seperate linux-libc-dev deb userland dev likes latest incarnation of that userland API. make it easy to also build it on make deb-pkg invocation: dpkg-deb: building package `linux-libc-dev' in `../linux-libc-dev_2.6.32-rc6-4_amd64.deb'. Last year patch rebased on top of latest deb-pkg changes. Signed-off-by: maximilian attems Signed-off-by: Michal Marek commit d9b8ca8474fd4fdd43ba6d97a4fee8b49b978067 Author: Sheng Yang Date: Tue Dec 21 14:18:49 2010 +0800 xen: HVM X2APIC support This patch is similiar to Gleb Natapov's patch for KVM, which enable the hypervisor to emulate x2apic feature for the guest. By this way, the emulation of lapic would be simpler with x2apic interface(MSR), and faster. [v2: Re-organized 'xen_hvm_need_lapic' per Ian Campbell suggestion] Acked-by: Jeremy Fitzhardinge Signed-off-by: Sheng Yang Signed-off-by: Konrad Rzeszutek Wilk commit 2904ed8dd5a748c52caf4d8b09d3d9834b5932fa Author: Sheng Yang Date: Tue Dec 21 14:18:48 2010 +0800 apic: Move hypervisor detection of x2apic to hypervisor.h Then we can reuse it for Xen later. Acked-by: Jeremy Fitzhardinge Acked-by: Avi Kivity Acked-by: Ingo Molnar Signed-off-by: Sheng Yang Signed-off-by: Konrad Rzeszutek Wilk commit c9b5f501ef1580faa30c40c644b7691870462201 Author: Peter Zijlstra Date: Fri Jan 7 13:41:40 2011 +0100 sched: Constify function scope static struct sched_param usage Function-scope statics are discouraged because they are easily overlooked and can cause subtle bugs/races due to their global (non-SMP safe) nature. Linus noticed that we did this for sched_param - at minimum make the const. Suggested-by: Linus Torvalds Signed-off-by: Peter Zijlstra LKML-Reference: Message-ID: Signed-off-by: Ingo Molnar commit 524429c31b486c05449666b94613f59f729c0a84 Author: Hillf Danton Date: Thu Jan 6 20:58:12 2011 +0800 sched: Fix strncmp operation One of the operands, buf, is incorrect, since it is stripped and the correct address for subsequent string comparing could change if leading white spaces, if any, are removed from buf. It is fixed by replacing buf with cmp. Signed-off-by: Hillf Danton Signed-off-by: Peter Zijlstra LKML-Reference: Signed-off-by: Ingo Molnar commit 1c5354de90c900b369e2ebd36c3a065ede29eb93 Author: Mike Galbraith Date: Wed Jan 5 11:16:04 2011 +0100 sched: Move sched_autogroup_exit() to free_signal_struct() Per Oleg's suggestion, undo fork failure free/put_signal_struct change, and move sched_autogroup_exit() to free_signal_struct() instead. Signed-off-by: Mike Galbraith Reviewed-by: Oleg Nesterov Signed-off-by: Peter Zijlstra LKML-Reference: <1294222564.8369.6.camel@marge.simson.net> Signed-off-by: Ingo Molnar commit e9aa1dd19fe49b5aed3ca94aab87576e534d2a39 Author: Mike Galbraith Date: Wed Jan 5 11:11:25 2011 +0100 sched: Fix struct autogroup memory leak Seems I lost a change somewhere, leaking memory. sched: fix struct autogroup memory leak Add missing change to actually use autogroup_free(). Signed-off-by: Mike Galbraith Signed-off-by: Peter Zijlstra LKML-Reference: <1294222285.8369.2.camel@marge.simson.net> Signed-off-by: Ingo Molnar commit 0ca0873555c0abe17b28c25b19f82857c0ddd2bc Author: Yong Zhang Date: Fri Jan 7 12:43:45 2011 +0800 sched: Mark autogroup_init() __init autogroup_init() is only called at boot time. Signed-off-by: Yong Zhang Cc: Mike Galbraith Signed-off-by: Peter Zijlstra LKML-Reference: <1294375425-31065-1-git-send-email-yong.zhang0@gmail.com> Signed-off-by: Ingo Molnar commit 07e06b011db2b3300f6c975ebf293fc4c8c59942 Author: Yong Zhang Date: Fri Jan 7 15:17:36 2011 +0800 sched: Consolidate the name of root_task_group and init_task_group root_task_group is the leftover of USER_SCHED, now it's always same to init_task_group. But as Mike suggested, root_task_group is maybe the suitable name to keep for a tree. So in this patch: init_task_group --> root_task_group init_task_group_load --> root_task_group_load INIT_TASK_GROUP_LOAD --> ROOT_TASK_GROUP_LOAD Suggested-by: Mike Galbraith Signed-off-by: Yong Zhang Signed-off-by: Peter Zijlstra LKML-Reference: <20110107071736.GA32635@windriver.com> Signed-off-by: Ingo Molnar commit 39177ec36236fb71257e51d0d198437b84170911 Author: Peter Korsgaard Date: Thu Jan 6 16:42:45 2011 +0100 nconf: handle comment entries within choice/endchoice Equivalent to af6c1598 (kconfig: handle comment entries within choice/endchoice), but for nconfig instead. Implement support for comment entries within choice groups. Comment entries are displayed visually distinct from normal configs, and selecting them is a no-op. Signed-off-by: Peter Korsgaard Signed-off-by: Michal Marek commit bc91c9f313309915f6ec767f56f78dcd0305b20f Author: Roland Stigge Date: Fri Dec 17 17:19:17 2010 +0100 mkuboot.sh: Fail if mkimage is missing on building an uImage, I get: $ make uImage CHK include/linux/version.h CHK include/generated/utsrelease.h make[1]: `include/generated/mach-types.h' is up to date. CALL scripts/checksyscalls.sh CHK include/generated/compile.h Kernel: arch/arm/boot/Image is ready SHIPPED arch/arm/boot/compressed/lib1funcs.S AS arch/arm/boot/compressed/lib1funcs.o LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready UIMAGE arch/arm/boot/uImage "mkimage" command not found - U-Boot images will not be built Image arch/arm/boot/uImage is ready $ I.e. it says: "uImage is ready" even though the uImage file doesn't exist because mkimage is missing. I propose the attached patch. Signed-off-by: Roland Stigge Signed-off-by: Michal Marek commit 1c2a48cf65580a276552151eb8f78d78c55b828e Merge: 0aa002fe602939370e9476e5ec32b562000a0425 cb600d2f83c854ec3d6660063e4466431999489b Author: Ingo Molnar Date: Fri Jan 7 14:14:15 2011 +0100 Merge branch 'linus' into x86/apic-cleanups Conflicts: arch/x86/include/asm/io_apic.h Merge reason: Resolve the conflict, update to a more recent -rc base Signed-off-by: Ingo Molnar commit 751c88a2c362a4a8985f9a2cb5daf7cd9ce1c4d0 Author: Al Viro Date: Thu Oct 14 13:34:03 2010 -0400 m68knommu: Need to check __get_user()/__put_user() result Signed-off-by: Al Viro Acked-by: Greg Ungerer Signed-off-by: Geert Uytterhoeven commit 8972be4d44fbec0b2e1d7b68874fb61c5bf7b06a Author: Al Viro Date: Tue Oct 12 22:38:04 2010 -0400 m68knommu: signal.c __user annotations Signed-off-by: Al Viro Acked-by: Greg Ungerer Signed-off-by: Geert Uytterhoeven commit a19185c32dbe975ce1ee86f5fa457f69b1d7f53b Author: Al Viro Date: Tue Oct 12 22:26:22 2010 -0400 m68knommu: Equivalent of "m68k: handle new gcc's" ... from back in 2004; again, it's ifdefed out by CONFIG_FPU. Signed-off-by: Al Viro Acked-by: Greg Ungerer Signed-off-by: Geert Uytterhoeven commit e64f1b7520fa12c8e8e08161a2841ec5510774ac Author: Al Viro Date: Tue Oct 12 22:19:54 2010 -0400 m68knommu: f_pcr has been gone since headers' merge sure, it's effectively ifdefed out, but still... Signed-off-by: Al Viro Acked-by: Greg Ungerer Signed-off-by: Geert Uytterhoeven commit 089e449a82cd5ba8a858dfea88e754afb9341037 Author: Al Viro Date: Mon Oct 11 23:35:08 2010 -0400 m68knommu: Don't lose state if sigframe setup fails exact parallel to m68k analog Signed-off-by: Al Viro Acked-by: Greg Ungerer Signed-off-by: Geert Uytterhoeven commit d1574df7e01d427c2ed80ada11433a72907ca472 Author: Al Viro Date: Mon Oct 11 23:29:28 2010 -0400 m68knommu: Handle multiple pending signals we shouldn't bugger off to userland when there still are pending signals; among other things it makes e.g. SIGSEGV triggered by failure to build a sigframe to be delivered _now_ and not when we hit the next syscall or interrupt. Signed-off-by: Al Viro Acked-by: Greg Ungerer Signed-off-by: Geert Uytterhoeven commit 710e91e455caf5cfec02892d667b41f312ec166c Author: Al Viro Date: Mon Oct 11 17:09:20 2010 -0400 m68knommu: Switch to saner sigsuspend Signed-off-by: Al Viro Acked-by: Greg Ungerer Signed-off-by: Geert Uytterhoeven commit bf814b45d560b22e8657ca44d0ae6941ab9d8d36 Author: Al Viro Date: Mon Oct 11 16:56:23 2010 -0400 m68knommu: Don't bother with SA_ONESHOT Signed-off-by: Al Viro Acked-by: Greg Ungerer Signed-off-by: Geert Uytterhoeven commit 8c18194f6c0a638565f2074d1dcabfbe590f396d Author: Al Viro Date: Thu Oct 14 13:35:05 2010 -0400 m68k: Check __get_user()/__put_user() return value Signed-off-by: Al Viro Signed-off-by: Geert Uytterhoeven commit bd6f56a75bb2a65b3a1b8d14a9787fdaadae71c1 Author: Al Viro Date: Mon Oct 11 23:13:51 2010 -0400 m68k: Missing syscall_trace() on sigreturn If we leave sigreturn via ret_from_signal, we end up with syscall trace only on entry, leading to very unhappy strace, among other things. Note that this means different behaviours for signals delivered while we were in pagefault and for ones delivered while we were in interrupt... Signed-off-by: Al Viro Signed-off-by: Geert Uytterhoeven commit ea52b58ccbda49aeb23eb424ce05bba3cb0bc976 Author: Al Viro Date: Wed Oct 6 14:09:43 2010 -0400 m68k: Fix stack mangling logics in sigreturn a) we should hold modifying regs->format until we know we *will* be doing stack expansion; otherwise attacker can modify sigframe to have wrong ->sc_formatvec and install SIGSEGV handler. b) we should *not* mix copying saved extra stuff from userland with expanding the stack; once we'd done that manual memmove, we'd better not return to C, so cleanup is very hard to do. The easiest way is to copy it on stack first, making sure we won't overwrite on stack expansion. Fortunately that's easy to do... Signed-off-by: Al Viro Signed-off-by: Geert Uytterhoeven commit 90731d7537317ad5d9672187f7a1dff90b29bb12 Author: Al Viro Date: Sun Oct 3 01:36:58 2010 -0400 m68k: If we fail to set sigframe up, just leave regs alone... Same principle as with the previous patch - do not destroy the state if sigframe setup fails. Incidentally, it's actually _less_ work - we don't need to go through adjust_stack dance on failure if we don't touch regs->stkadj until we know we'd written sigframe out. Signed-off-by: Al Viro Signed-off-by: Geert Uytterhoeven commit f85741eb5fb2653fd9138b4bef68396615c720f7 Author: Al Viro Date: Sun Oct 3 01:15:49 2010 -0400 m68k: Don't lose state if sigframe setup fails If we'd failed in setup_frame(), we've no place to store the original sigmask. It's not an unrecoverable situation - we raise SIGSEGV, but that SIGSEGV might be successfully handled (e.g. on altstack). In that case we really don't want sa_mask of original signal permanently slapped on the set of blocked signals. Standard solution: have setup_frame()/setup_rt_frame() report failure and don't mess with the signal-related state if that has happened... Signed-off-by: Al Viro Signed-off-by: Geert Uytterhoeven commit 9e4930dbf17c1eba72631cd52a0c621da3d1a816 Author: Al Viro Date: Sat Oct 2 22:57:30 2010 -0400 m68k: Simplify the singlestepping handling in signals Instead of checking the return value of do_signal() we can just do the work (raise SIGTRAP and clear SR.T1) directly in handle_signal(), when setting the sigframe up. Simplifies the assembler glue and is closer to the way we do it on other targets. Note that do_delayed_trace does *not* disappear; it's still needed to deal with single-stepping through syscall, since 68040 doesn't raise the trace exception at all if the trap exception is pending. We hit it after returning from sys_...() if TIF_DELAYED_TRACE is set; all that has changed is that we don't reuse it for "single-step into the handler" codepath. As the result, do_signal() doesn't need to return anything anymore. Signed-off-by: Al Viro Signed-off-by: Geert Uytterhoeven commit e68847fee706c6fe74c9afc3288c3adfc131b1fa Author: Al Viro Date: Wed Sep 29 23:28:59 2010 -0400 m68k: Switch to saner sigsuspend() and saner do_signal() arguments, while we are at it Signed-off-by: Al Viro Signed-off-by: Geert Uytterhoeven commit 35fc157baf56db846afaeb5c730fa47e351cf0d2 Author: Al Viro Date: Wed Sep 29 23:10:47 2010 -0400 m68k: Resetting sa_handler in local copy of k_sigaction is pointless ... and had been such since the introduction of get_signal_to_deliver() Signed-off-by: Al Viro Signed-off-by: Geert Uytterhoeven commit 6d5db4668796d903dc3bad2852c82073509c37d2 Author: Borislav Petkov Date: Thu Nov 25 15:40:27 2010 +0100 EDAC, MCE: Fix NB error formatting Minor formatting fixup since the information which core was associated with the MCE is not always valid. Signed-off-by: Borislav Petkov commit 50adbbd8a8e572ad2533eace228c841ec84028a3 Author: Randy Dunlap Date: Sat Nov 13 11:44:26 2010 -0500 EDAC, MCE: Use BIT_64() to eliminate warnings on 32-bit Building for X86_32 produces shift count warnings, so use BIT_64() to eliminate the warnings. drivers/edac/mce_amd.c:778: warning: left shift count >= width of type drivers/edac/mce_amd.c:778: warning: left shift count >= width of type Signed-off-by: Randy Dunlap Cc: Doug Thompson Cc: bluesmoke-devel@lists.sourceforge.net Signed-off-by: Borislav Petkov commit bad11e031862294265145d87dd4be1ae4af0d57f Author: Borislav Petkov Date: Wed Sep 22 17:44:51 2010 +0200 EDAC, MCE: Enable MCE decoding on F15h Now that everything is inplace, enable MCE decoding on F15h. Make initcall routine a bit more readable. Signed-off-by: Borislav Petkov commit 1b07ca47ff2fbffbe09d8b0a0a25d8747a3cdcae Author: Borislav Petkov Date: Tue Nov 9 19:41:49 2010 +0100 EDAC, MCE: Allow F15h bank 6 MCE injection F15h adds a sixth MCE bank: adjust bank number check in the injection code. Signed-off-by: Borislav Petkov commit fa7ae8cc8c88c0679eab24c5a1b5d3b134a5f542 Author: Borislav Petkov Date: Wed Sep 22 17:42:27 2010 +0200 EDAC, MCE: Shorten error report formatting Shorten up MCi_STATUS flags and add BD's new deferred and poison types. Also, simplify formatting. Signed-off-by: Borislav Petkov commit 6245288232516aadf293f575d1812dafb4696aee Author: Borislav Petkov Date: Wed Sep 22 16:08:37 2010 +0200 EDAC, MCE: Overhaul error fields extraction macros Make macro names shorter thus making code shorter and more clear. Signed-off-by: Borislav Petkov commit b8f85c477bdf1fec98ea7cbe952fdb5f40eb0aa7 Author: Borislav Petkov Date: Wed Sep 22 15:37:58 2010 +0200 EDAC, MCE: Add F15h FP MCE decoder Add decoder for FP MCEs. Signed-off-by: Borislav Petkov commit 8259a7e5724c42c89d927b92cda3e0ab15b9ade9 Author: Borislav Petkov Date: Wed Sep 22 15:28:59 2010 +0200 EDAC, MCE: Add F15 EX MCE decoder Integrate the single FIROB signature into an expanded table along with the new BD MCE types. Signed-off-by: Borislav Petkov commit 05cd667d668eb08845dd49c02130e5223121b715 Author: Borislav Petkov Date: Wed Sep 22 15:06:24 2010 +0200 EDAC, MCE: Add an F15h NB MCE decoder by (almost) reusing the F10h one since the signatures are the same. Signed-off-by: Borislav Petkov commit b18434cad1740466f7a1c304ea4af0f4d3c874f1 Author: Borislav Petkov Date: Wed Sep 22 11:53:32 2010 +0200 EDAC, MCE: No F15h LS MCE decoder F15h BD doesn't generate LS MCEs so warn about it. Signed-off-by: Borislav Petkov commit 70fdb494aa8c82f76745d5a32b8abc505813557c Author: Borislav Petkov Date: Tue Sep 21 20:45:10 2010 +0200 EDAC, MCE: Add F15h CU MCE decoder MCE bank 2 is redefined from a BU to a CU (Combined Unit) bank on F15h. Add a decoder function for CU MCEs. Signed-off-by: Borislav Petkov commit 86039cd401e1780573733870f9c0bd458fc96ea2 Author: Borislav Petkov Date: Mon Nov 8 15:03:35 2010 +0100 EDAC, MCE: Add F15h IC MCE decoder Add support for decoding F15h IC MCEs. Signed-off-by: Borislav Petkov commit 25a4f8b05917f8137bfff8a3f8c6c8c1ac561208 Author: Borislav Petkov Date: Fri Sep 17 19:22:34 2010 +0200 EDAC, MCE: Add F15h DC MCE decoder Add a decoder for F15h DC MCEs to support the new types of DC MCEs introduced by the BD microarchitecture. Signed-off-by: Borislav Petkov commit 2be64bfac71378e1aa8c20031a499bd55e391244 Author: Borislav Petkov Date: Fri Sep 17 19:11:47 2010 +0200 EDAC, MCE: Select extended error code mask F15h enlarges the extended error code of an MCE to a 5-bit field (MCi_STATUS[20:16]). Add a mask variable which default 0xf is overridden on F15h. Signed-off-by: Borislav Petkov commit a135cef79a2927ecff800492a26cd314e9cba996 Author: Borislav Petkov Date: Fri Nov 26 19:24:44 2010 +0100 amd64_edac: Disable DRAM ECC injection on K8 K8 does not allow for an atomic RMW to a cacheline as F10h does so disable the error injection interface for it. Signed-off-by: Borislav Petkov commit 390944439f746824faec51b576f50cb5ef18745b Author: Borislav Petkov Date: Wed Nov 24 19:52:09 2010 +0100 EDAC: Fixup scrubrate manipulation Make the ->{get|set}_sdram_scrub_rate return the actual scrub rate bandwidth it succeeded setting and remove superfluous arg pointer used for that. A negative value returned still means that an error occurred while setting the scrubrate. Document this for future reference. Signed-off-by: Borislav Petkov commit 360b7f3c602ed80ce8c6b2585dcb76883a440c17 Author: Borislav Petkov Date: Fri Oct 15 19:25:38 2010 +0200 amd64_edac: Remove two-stage initialization Now that all prerequisites are in place, drop the two-stage driver instances initialization in favor of the following simple init sequence: 1. Probe PCI device: we only test ECC capabilities here and if none exit early. 2. If the hw supports ECC and it is/can be enabled, we init the per-node instance. Remove "amd64_" prefix from static functions touched, while at it. There actually should be no visible functional change resulting from this patch. Signed-off-by: Borislav Petkov commit 2299ef7114000f8e403797b7f9a972f54bc05fad Author: Borislav Petkov Date: Fri Oct 15 17:44:04 2010 +0200 amd64_edac: Check ECC capabilities initially Rework the code to check the hardware ECC capabilities at PCI probing time. We do all further initialization only if we actually can/have ECC enabled. While at it: 0. Fix function naming. 1. Simplify/clarify debug output. 2. Remove amd64_ prefix from the static functions 3. Reorganize code. Signed-off-by: Borislav Petkov commit ae7bb7c679e7ddba6c52d1a78a30f9bc868d9738 Author: Borislav Petkov Date: Thu Oct 14 16:01:30 2010 +0200 amd64_edac: Carve out ECC-related hw settings This is in preparation for the init path reorganization where we want only to 1) test whether a particular node supports ECC 2) can it be enabled and only then do the necessary allocation/initialization. For that, we need to decouple the ECC settings of the node from the instance's descriptor. The should be no functional change introduced by this patch. Signed-off-by: Borislav Petkov commit f1db274e1ba7004909de4a9cee62f631c030ba3e Author: Borislav Petkov Date: Thu Oct 14 14:37:13 2010 +0200 amd64_edac: Remove PCI ECS enabling functions PCI ECS is being enabled by default since 2.6.26 on AMD so this code is just superfluous now, remove it. Signed-off-by: Borislav Petkov commit 027dbd6f5d419c25750d6a26c5c46f46f2093a11 Author: Borislav Petkov Date: Wed Oct 13 22:12:15 2010 +0200 amd64_edac: Remove explicit Kconfig PCI dependency AMD_NB pulls in the dependency on PCI. Clarify/fix help text while at it. Signed-off-by: Borislav Petkov commit cc4d8860fc37dd315b16a43202400d822ab63221 Author: Borislav Petkov Date: Wed Oct 13 16:11:59 2010 +0200 amd64_edac: Allocate driver instances dynamically Remove static allocation in favor of dynamically allocating space for as many driver instances as northbridges present on the system. There should be no functional change resulting from this patch. Signed-off-by: Borislav Petkov commit 24f9a7fe3f19f3fd310f556364d01a22911724b3 Author: Borislav Petkov Date: Thu Oct 7 18:29:15 2010 +0200 amd64_edac: Rework printk macros Add a macro per printk level, shorten up error messages. Add relevant information to KERN_INFO level. No functional change. Signed-off-by: Borislav Petkov commit 8d5b5d9c7b86e44fda29a367db3ccd2815a52f7c Author: Borislav Petkov Date: Fri Oct 1 20:11:07 2010 +0200 amd64_edac: Rename CPU PCI devices Rename variables representing PCI devices to their BKDG names for faster search and shorter, clearer code. Signed-off-by: Borislav Petkov commit b8cfa02f833a614e80f851747c4ce14989a4cfd0 Author: Borislav Petkov Date: Fri Oct 1 19:35:38 2010 +0200 amd64_edac: Concentrate per-family init even more Move the remaining per-family init code into the proper place and simplify the rest of the initialization. Reorganize error handling in amd64_init_one_instance(). Signed-off-by: Borislav Petkov commit bbd0c1f675d7d64fc02393d4985a069be5037b54 Author: Borislav Petkov Date: Fri Oct 1 19:27:58 2010 +0200 amd64_edac: Cleanup the CPU PCI device reservation Shorten code and clarify comments, return proper -E* values on error. Signed-off-by: Borislav Petkov commit 0092b20d4cf3de243b5c82b410ee02644cec2707 Author: Borislav Petkov Date: Fri Oct 1 19:20:05 2010 +0200 amd64_edac: Simplify CPU family detection Concentrate CPU family detection in the per-family init function. Signed-off-by: Borislav Petkov commit 395ae783b384e5243804b07fba3e3f8379ddf1d6 Author: Borislav Petkov Date: Fri Oct 1 18:38:19 2010 +0200 amd64_edac: Add per-family init function Run a per-family init function which does all the settings based on the family this driver instance is running on. Move the scrubrate calculation in it and simplify code. Signed-off-by: Borislav Petkov commit 9f56da0e3c3269abe0b2745a54f1b082c3c14433 Author: Borislav Petkov Date: Fri Oct 1 19:44:53 2010 +0200 amd64_edac: Use cached extended CPU model ... instead of computing it needlessly again. Signed-off-by: Borislav Petkov commit 3ab0e7dc2e1d5598da609ec9a9bcd3b69b8fa654 Author: Borislav Petkov Date: Fri Oct 1 18:19:06 2010 +0200 amd64_edac: Remove F11h support F11h doesn't support DRAM ECC so whack it away. Signed-off-by: Borislav Petkov commit b3e19d924b6eaf2ca7d22cba99a517c5171007b6 Author: Nick Piggin Date: Fri Jan 7 17:50:11 2011 +1100 fs: scale mntget/mntput The problem that this patch aims to fix is vfsmount refcounting scalability. We need to take a reference on the vfsmount for every successful path lookup, which often go to the same mount point. The fundamental difficulty is that a "simple" reference count can never be made scalable, because any time a reference is dropped, we must check whether that was the last reference. To do that requires communication with all other CPUs that may have taken a reference count. We can make refcounts more scalable in a couple of ways, involving keeping distributed counters, and checking for the global-zero condition less frequently. - check the global sum once every interval (this will delay zero detection for some interval, so it's probably a showstopper for vfsmounts). - keep a local count and only taking the global sum when local reaches 0 (this is difficult for vfsmounts, because we can't hold preempt off for the life of a reference, so a counter would need to be per-thread or tied strongly to a particular CPU which requires more locking). - keep a local difference of increments and decrements, which allows us to sum the total difference and hence find the refcount when summing all CPUs. Then, keep a single integer "long" refcount for slow and long lasting references, and only take the global sum of local counters when the long refcount is 0. This last scheme is what I implemented here. Attached mounts and process root and working directory references are "long" references, and everything else is a short reference. This allows scalable vfsmount references during path walking over mounted subtrees and unattached (lazy umounted) mounts with processes still running in them. This results in one fewer atomic op in the fastpath: mntget is now just a per-CPU inc, rather than an atomic inc; and mntput just requires a spinlock and non-atomic decrement in the common case. However code is otherwise bigger and heavier, so single threaded performance is basically a wash. Signed-off-by: Nick Piggin commit c6653a838b1b2738561aff0b8c0f62a9b714bdd9 Author: Nick Piggin Date: Fri Jan 7 17:50:10 2011 +1100 fs: rename vfsmount counter helpers Suggested by Andreas, mnt_ prefix is clearer namespace, follows kernel conventions better, and is easier for tab complete. I introduced these names so I'll admit they were not good choices. Signed-off-by: Nick Piggin commit 9d55c369bb5e695e629bc35cba2ef607755b3bee Author: Nick Piggin Date: Fri Jan 7 17:50:09 2011 +1100 fs: implement faster dentry memcmp The standard memcmp function on a Westmere system shows up hot in profiles in the `git diff` workload (both parallel and single threaded), and it is likely due to the costs associated with trapping into microcode, and little opportunity to improve memory access (dentry name is not likely to take up more than a cacheline). So replace it with an open-coded byte comparison. This increases code size by 8 bytes in the critical __d_lookup_rcu function, but the speedup is huge, averaging 10 runs of each: git diff st user sys elapsed CPU before 1.15 2.57 3.82 97.1 after 1.14 2.35 3.61 96.8 git diff mt user sys elapsed CPU before 1.27 3.85 1.46 349 after 1.26 3.54 1.43 333 Elapsed time for single threaded git diff at 95.0% confidence: -0.21 +/- 0.01 -5.45% +/- 0.24% It's -0.66% +/- 0.06% elapsed time on my Opteron, so rep cmp costs on the fam10h seem to be relatively smaller, but there is still a win. Signed-off-by: Nick Piggin commit e1bb57826381199cc79fbf44e9dfeee58fc7b339 Author: Nick Piggin Date: Fri Jan 7 17:50:08 2011 +1100 fs: prefetch inode data in dcache lookup This makes single threaded git diff -1.25% +/- 0.05% elapsed time on my 2s12c24t Westmere system, and -0.86% +/- 0.05% on my 2s8c Barcelona, by prefetching the important first cacheline of the inode in while we do the actual name compare and other operations on the dentry. There was no measurable slowdown in the single file stat case, or the creat case (where negative dentries would be common). Signed-off-by: Nick Piggin commit 4b936885ab04dc6e0bb0ef35e0e23c1a7364d9e5 Author: Nick Piggin Date: Fri Jan 7 17:50:07 2011 +1100 fs: improve scalability of pseudo filesystems Regardless of how much we possibly try to scale dcache, there is likely always going to be some fundamental contention when adding or removing children under the same parent. Pseudo filesystems do not seem need to have connected dentries because by definition they are disconnected. Signed-off-by: Nick Piggin commit 873feea09ebc980cbd3631b767356ce1eee65ec1 Author: Nick Piggin Date: Fri Jan 7 17:50:06 2011 +1100 fs: dcache per-inode inode alias locking dcache_inode_lock can be replaced with per-inode locking. Use existing inode->i_lock for this. This is slightly non-trivial because we sometimes need to find the inode from the dentry, which requires d_inode to be stabilised (either with refcount or d_lock). Signed-off-by: Nick Piggin commit ceb5bdc2d246f6d81cf61ed70f325308a11821d2 Author: Nick Piggin Date: Fri Jan 7 17:50:05 2011 +1100 fs: dcache per-bucket dcache hash locking We can turn the dcache hash locking from a global dcache_hash_lock into per-bucket locking. Signed-off-by: Nick Piggin commit 626d607435617cc0f033522083e2bb195b81813c Author: Nick Piggin Date: Fri Jan 7 17:50:04 2011 +1100 bit_spinlock: add required includes Signed-off-by: Nick Piggin commit 4e35e6070b1ceed89c3bba2af4216c286fb1dafd Author: Nick Piggin Date: Fri Jan 7 17:50:03 2011 +1100 kernel: add bl_list Introduce a type of hlist that can support the use of the lowest bit in the hlist_head. This will be subsequently used to implement per-bucket bit spinlock for inode and dentry hashes, and may be useful in other cases such as network hashes. Reviewed-by: Paul E. McKenney Signed-off-by: Nick Piggin commit 880566e17c4fce0d998d92610d32fcb9506aa6dd Author: Nick Piggin Date: Fri Jan 7 17:50:02 2011 +1100 xfs: provide simple rcu-walk ACL implementation This simple implementation just checks for no ACLs on the inode, and if so, then the rcu-walk may proceed, otherwise fail it. Signed-off-by: Nick Piggin commit 258a5aa8dfc6294f5f7df892023ee4d3e57c9841 Author: Nick Piggin Date: Fri Jan 7 17:50:01 2011 +1100 btrfs: provide simple rcu-walk ACL implementation This simple implementation just checks for no ACLs on the inode, and if so, then the rcu-walk may proceed, otherwise fail it. Signed-off-by: Nick Piggin commit 73598611ade7c85f0c3d52ba5130103f6709c6d3 Author: Nick Piggin Date: Fri Jan 7 17:50:00 2011 +1100 ext2,3,4: provide simple rcu-walk ACL implementation This simple implementation just checks for no ACLs on the inode, and if so, then the rcu-walk may proceed, otherwise fail it. Signed-off-by: Nick Piggin commit 1e1743ebe35ec7e3c1fa732408358fbc614cbbe5 Author: Nick Piggin Date: Fri Jan 7 17:49:59 2011 +1100 fs: provide simple rcu-walk generic_check_acl implementation This simple implementation just checks for no ACLs on the inode, and if so, then the rcu-walk may proceed, otherwise fail it. This could easily be extended to put acls under RCU and check them under seqlock, if need be. But this implementation is enough to show the rcu-walk aware permissions code for path lookups is working, and will handle cases where there are no ACLs or ACLs in just the final element. This patch implicity converts tmpfs to rcu-aware permission check. Subsequent patches onvert ext*, xfs, and, btrfs. Each of these uses acl/permission code in a different way, so convert them all to provide templates and proof of concept. Signed-off-by: Nick Piggin commit b74c79e99389cd79b31fcc08f82c24e492e63c7e Author: Nick Piggin Date: Fri Jan 7 17:49:58 2011 +1100 fs: provide rcu-walk aware permission i_ops Signed-off-by: Nick Piggin commit 34286d6662308d82aed891852d04c7c3a2649b16 Author: Nick Piggin Date: Fri Jan 7 17:49:57 2011 +1100 fs: rcu-walk aware d_revalidate method Require filesystems be aware of .d_revalidate being called in rcu-walk mode (nd->flags & LOOKUP_RCU). For now do a simple push down, returning -ECHILD from all implementations. Signed-off-by: Nick Piggin commit 44a7d7a878c9cbb74f236ea755b25b6b2e26a9a9 Author: Nick Piggin Date: Fri Jan 7 17:49:56 2011 +1100 fs: cache optimise dentry and inode for rcu-walk Put dentry and inode fields into top of data structure. This allows RCU path traversal to perform an RCU dentry lookup in a path walk by touching only the first 56 bytes of the dentry. We also fit in 8 bytes of inline name in the first 64 bytes, so for short names, only 64 bytes needs to be touched to perform the lookup. We should get rid of the hash->prev pointer from the first 64 bytes, and fit 16 bytes of name in there, which will take care of 81% rather than 32% of the kernel tree. inode is also rearranged so that RCU lookup will only touch a single cacheline in the inode, plus one in the i_ops structure. This is important for directory component lookups in RCU path walking. In the kernel source, directory names average is around 6 chars, so this works. When we reach the last element of the lookup, we need to lock it and take its refcount which requires another cacheline access. Align dentry and inode operations structs, so members will be at predictable offsets and we can group common operations into head of structure. Signed-off-by: Nick Piggin commit fb045adb99d9b7c562dc7fef834857f78249daa1 Author: Nick Piggin Date: Fri Jan 7 17:49:55 2011 +1100 fs: dcache reduce branches in lookup path Reduce some branches and memory accesses in dcache lookup by adding dentry flags to indicate common d_ops are set, rather than having to check them. This saves a pointer memory access (dentry->d_op) in common path lookup situations, and saves another pointer load and branch in cases where we have d_op but not the particular operation. Patched with: git grep -E '[.>]([[:space:]])*d_op([[:space:]])*=' | xargs sed -e 's/\([^\t ]*\)->d_op = \(.*\);/d_set_d_op(\1, \2);/' -e 's/\([^\t ]*\)\.d_op = \(.*\);/d_set_d_op(\&\1, \2);/' -i Signed-off-by: Nick Piggin commit 5f57cbcc02cf18f6b22ef4066bb10afeb8f930ff Author: Nick Piggin Date: Fri Jan 7 17:49:54 2011 +1100 fs: dcache remove d_mounted Rather than keep a d_mounted count in the dentry, set a dentry flag instead. The flag can be cleared by checking the hash table to see if there are any mounts left, which is not time critical because it is performed at detach time. The mounted state of a dentry is only used to speculatively take a look in the mount hash table if it is set -- before following the mount, vfsmount lock is taken and mount re-checked without races. This saves 4 bytes on 32-bit, nothing on 64-bit but it does provide a hole I might use later (and some configs have larger than 32-bit spinlocks which might make use of the hole). Autofs4 conversion and changelog by Ian Kent : In autofs4, when expring direct (or offset) mounts we need to ensure that we block user path walks into the autofs mount, which is covered by another mount. To do this we clear the mounted status so that follows stop before walking into the mount and are essentially blocked until the expire is completed. The automount daemon still finds the correct dentry for the umount due to the follow mount logic in fs/autofs4/root.c:autofs4_follow_link(), which is set as an inode operation for direct and offset mounts only and is called following the lookup that stopped at the covered mount. At the end of the expire the covering mount probably has gone away so the mounted status need not be restored. But we need to check this and only restore the mounted status if the expire failed. XXX: autofs may not work right if we have other mounts go over the top of it? Signed-off-by: Nick Piggin commit c28cc36469554dc55540f059fbdc7fa22a2c31fc Author: Nick Piggin Date: Fri Jan 7 17:49:53 2011 +1100 fs: fs_struct use seqlock Use a seqlock in the fs_struct to enable us to take an atomic copy of the complete cwd and root paths. Use this in the RCU lookup path to avoid a thread-shared spinlock in RCU lookup operations. Multi-threaded apps may now perform path lookups with scalability matching multi-process apps. Operations such as stat(2) become very scalable for multi-threaded workload. Signed-off-by: Nick Piggin commit 31e6b01f4183ff419a6d1f86177cbf4662347cec Author: Nick Piggin Date: Fri Jan 7 17:49:52 2011 +1100 fs: rcu-walk for path lookup Perform common cases of path lookups without any stores or locking in the ancestor dentry elements. This is called rcu-walk, as opposed to the current algorithm which is a refcount based walk, or ref-walk. This results in far fewer atomic operations on every path element, significantly improving path lookup performance. It also avoids cacheline bouncing on common dentries, significantly improving scalability. The overall design is like this: * LOOKUP_RCU is set in nd->flags, which distinguishes rcu-walk from ref-walk. * Take the RCU lock for the entire path walk, starting with the acquiring of the starting path (eg. root/cwd/fd-path). So now dentry refcounts are not required for dentry persistence. * synchronize_rcu is called when unregistering a filesystem, so we can access d_ops and i_ops during rcu-walk. * Similarly take the vfsmount lock for the entire path walk. So now mnt refcounts are not required for persistence. Also we are free to perform mount lookups, and to assume dentry mount points and mount roots are stable up and down the path. * Have a per-dentry seqlock to protect the dentry name, parent, and inode, so we can load this tuple atomically, and also check whether any of its members have changed. * Dentry lookups (based on parent, candidate string tuple) recheck the parent sequence after the child is found in case anything changed in the parent during the path walk. * inode is also RCU protected so we can load d_inode and use the inode for limited things. * i_mode, i_uid, i_gid can be tested for exec permissions during path walk. * i_op can be loaded. When we reach the destination dentry, we lock it, recheck lookup sequence, and increment its refcount and mountpoint refcount. RCU and vfsmount locks are dropped. This is termed "dropping rcu-walk". If the dentry refcount does not match, we can not drop rcu-walk gracefully at the current point in the lokup, so instead return -ECHILD (for want of a better errno). This signals the path walking code to re-do the entire lookup with a ref-walk. Aside from the final dentry, there are other situations that may be encounted where we cannot continue rcu-walk. In that case, we drop rcu-walk (ie. take a reference on the last good dentry) and continue with a ref-walk. Again, if we can drop rcu-walk gracefully, we return -ECHILD and do the whole lookup using ref-walk. But it is very important that we can continue with ref-walk for most cases, particularly to avoid the overhead of double lookups, and to gain the scalability advantages on common path elements (like cwd and root). The cases where rcu-walk cannot continue are: * NULL dentry (ie. any uncached path element) * parent with d_inode->i_op->permission or ACLs * dentries with d_revalidate * Following links In future patches, permission checks and d_revalidate become rcu-walk aware. It may be possible eventually to make following links rcu-walk aware. Uncached path elements will always require dropping to ref-walk mode, at the very least because i_mutex needs to be grabbed, and objects allocated. Signed-off-by: Nick Piggin commit 3c22cd5709e8143444a6d08682a87f4c57902df3 Author: Nick Piggin Date: Fri Jan 7 17:49:51 2011 +1100 kernel: optimise seqlock Add branch annotations for seqlock read fastpath, and introduce __read_seqcount_begin and __read_seqcount_end functions, that can avoid the smp_rmb() if used carefully. These will be used by store-free path walking algorithm performance is critical and seqlocks are in use. Signed-off-by: Nick Piggin commit ff0c7d15f9787b7e8c601533c015295cc68329f8 Author: Nick Piggin Date: Fri Jan 7 17:49:50 2011 +1100 fs: avoid inode RCU freeing for pseudo fs Pseudo filesystems that don't put inode on RCU list or reachable by rcu-walk dentries do not need to RCU free their inodes. Signed-off-by: Nick Piggin commit fa0d7e3de6d6fc5004ad9dea0dd6b286af8f03e9 Author: Nick Piggin Date: Fri Jan 7 17:49:49 2011 +1100 fs: icache RCU free inodes RCU free the struct inode. This will allow: - Subsequent store-free path walking patch. The inode must be consulted for permissions when walking, so an RCU inode reference is a must. - sb_inode_list_lock to be moved inside i_lock because sb list walkers who want to take i_lock no longer need to take sb_inode_list_lock to walk the list in the first place. This will simplify and optimize locking. - Could remove some nested trylock loops in dcache code - Could potentially simplify things a bit in VM land. Do not need to take the page lock to follow page->mapping. The downsides of this is the performance cost of using RCU. In a simple creat/unlink microbenchmark, performance drops by about 10% due to inability to reuse cache-hot slab objects. As iterations increase and RCU freeing starts kicking over, this increases to about 20%. In cases where inode lifetimes are longer (ie. many inodes may be allocated during the average life span of a single inode), a lot of this cache reuse is not applicable, so the regression caused by this patch is smaller. The cache-hot regression could largely be avoided by using SLAB_DESTROY_BY_RCU, however this adds some complexity to list walking and store-free path walking, so I prefer to implement this at a later date, if it is shown to be a win in real situations. I haven't found a regression in any non-micro benchmark so I doubt it will be a problem. Signed-off-by: Nick Piggin commit 77812a1ef139d84270d27faacc0630c887411013 Author: Nick Piggin Date: Fri Jan 7 17:49:48 2011 +1100 fs: consolidate dentry kill sequence The tricky locking for disposing of a dentry is duplicated 3 times in the dcache (dput, pruning a dentry from the LRU, and pruning its ancestors). Consolidate them all into a single function dentry_kill. Signed-off-by: Nick Piggin commit ec33679d78f9d653a44ddba10b5fb824c06330a1 Author: Nick Piggin Date: Fri Jan 7 17:49:47 2011 +1100 fs: use RCU in shrink_dentry_list to reduce lock nesting Signed-off-by: Nick Piggin commit be182bff72fae6a3eb25624b39170c40b72f0909 Author: Nick Piggin Date: Fri Jan 7 17:49:46 2011 +1100 fs: reduce dcache_inode_lock width in lru scanning Signed-off-by: Nick Piggin commit 89e6054836a7b1e7500cd70a14b5579e752c9250 Author: Nick Piggin Date: Fri Jan 7 17:49:45 2011 +1100 fs: dcache reduce prune_one_dentry locking prune_one_dentry can avoid quite a bit of locking in the common case where ancestors have an elevated refcount. Alternatively, we could have gone the other way and made fewer trylocks in the case where d_count goes to zero, but is probably less common. Signed-off-by: Nick Piggin commit a734eb458ab2bd11479a27dd54f48e1b26a55845 Author: Nick Piggin Date: Fri Jan 7 17:49:44 2011 +1100 fs: dcache reduce d_parent locking Use RCU to simplify locking in dget_parent. Signed-off-by: Nick Piggin commit dc0474be3e27463d4d4a2793f82366eed906f223 Author: Nick Piggin Date: Fri Jan 7 17:49:43 2011 +1100 fs: dcache rationalise dget variants dget_locked was a shortcut to avoid the lazy lru manipulation when we already held dcache_lock (lru manipulation was relatively cheap at that point). However, how that the lru lock is an innermost one, we never hold it at any caller, so the lock cost can now be avoided. We already have well working lazy dcache LRU, so it should be fine to defer LRU manipulations to scan time. Signed-off-by: Nick Piggin commit 357f8e658bba8a085c4a5d4331e30894be8096b8 Author: Nick Piggin Date: Fri Jan 7 17:49:42 2011 +1100 fs: dcache reduce dcache_inode_lock dcache_inode_lock can be avoided in d_delete() and d_materialise_unique() in cases where it is not required. Signed-off-by: Nick Piggin commit 89ad485f01fd83c47f17a128db3bd7b89c0f244f Author: Nick Piggin Date: Fri Jan 7 17:49:41 2011 +1100 fs: dcache reduce locking in d_alloc Signed-off-by: Nick Piggin commit 61f3dee4af09528997a970280da240577bf60721 Author: Nick Piggin Date: Fri Jan 7 17:49:40 2011 +1100 fs: dcache reduce dput locking It is possible to run dput without taking data structure locks up-front. In many cases where we don't kill the dentry anyway, these locks are not required. Signed-off-by: Nick Piggin commit 58db63d086790eec2ed433f9d8c4962239809cf8 Author: Nick Piggin Date: Fri Jan 7 17:49:39 2011 +1100 fs: dcache avoid starvation in dcache multi-step operations Long lived dcache "multi-step" operations which retry on rename seq can be starved with a lot of rename activity. If they fail after the 1st pass, take the rename_lock for writing to avoid further starvation. Signed-off-by: Nick Piggin commit b5c84bf6f6fa3a7dfdcb556023a62953574b60ee Author: Nick Piggin Date: Fri Jan 7 17:49:38 2011 +1100 fs: dcache remove dcache_lock dcache_lock no longer protects anything. remove it. Signed-off-by: Nick Piggin commit 949854d02455080d20cd3e1db28a3a18daf7599d Author: Nick Piggin Date: Fri Jan 7 17:49:37 2011 +1100 fs: Use rename lock and RCU for multi-step operations The remaining usages for dcache_lock is to allow atomic, multi-step read-side operations over the directory tree by excluding modifications to the tree. Also, to walk in the leaf->root direction in the tree where we don't have a natural d_lock ordering. This could be accomplished by taking every d_lock, but this would mean a huge number of locks and actually gets very tricky. Solve this instead by using the rename seqlock for multi-step read-side operations, retry in case of a rename so we don't walk up the wrong parent. Concurrent dentry insertions are not serialised against. Concurrent deletes are tricky when walking up the directory: our parent might have been deleted when dropping locks so also need to check and retry for that. We can also use the rename lock in cases where livelock is a worry (and it is introduced in subsequent patch). Signed-off-by: Nick Piggin commit 9abca36087288fe28de4749c71ca003d4b9e3ed0 Author: Nick Piggin Date: Fri Jan 7 17:49:36 2011 +1100 fs: increase d_name lock coverage Cover d_name with d_lock in more cases, where there may be concurrent modification to it. Signed-off-by: Nick Piggin commit b23fb0a60379a95e10c671f646b259ea2558421e Author: Nick Piggin Date: Fri Jan 7 17:49:35 2011 +1100 fs: scale inode alias list Add a new lock, dcache_inode_lock, to protect the inode's i_dentry list from concurrent modification. d_alias is also protected by d_lock. Signed-off-by: Nick Piggin commit 2fd6b7f50797f2e993eea59e0a0b8c6399c811dc Author: Nick Piggin Date: Fri Jan 7 17:49:34 2011 +1100 fs: dcache scale subdirs Protect d_subdirs and d_child with d_lock, except in filesystems that aren't using dcache_lock for these anyway (eg. using i_mutex). Note: if we change the locking rule in future so that ->d_child protection is provided only with ->d_parent->d_lock, it may allow us to reduce some locking. But it would be an exception to an otherwise regular locking scheme, so we'd have to see some good results. Probably not worthwhile. Signed-off-by: Nick Piggin commit da5029563a0a026c64821b09e8e7b4fd81d3fe1b Author: Nick Piggin Date: Fri Jan 7 17:49:33 2011 +1100 fs: dcache scale d_unhashed Protect d_unhashed(dentry) condition with d_lock. This means keeping DCACHE_UNHASHED bit in synch with hash manipulations. Signed-off-by: Nick Piggin commit b7ab39f631f505edc2bbdb86620d5493f995c9da Author: Nick Piggin Date: Fri Jan 7 17:49:32 2011 +1100 fs: dcache scale dentry refcount Make d_count non-atomic and protect it with d_lock. This allows us to ensure a 0 refcount dentry remains 0 without dcache_lock. It is also fairly natural when we start protecting many other dentry members with d_lock. Signed-off-by: Nick Piggin commit 2304450783dfde7b0b94ae234edd0dbffa865073 Author: Nick Piggin Date: Fri Jan 7 17:49:31 2011 +1100 fs: dcache scale lru Add a new lock, dcache_lru_lock, to protect the dcache LRU list from concurrent modification. d_lru is also protected by d_lock, which allows LRU lists to be accessed without the lru lock, using RCU in future patches. Signed-off-by: Nick Piggin commit 789680d1ee9311cdf095241dc02bd9784d799cd1 Author: Nick Piggin Date: Fri Jan 7 17:49:30 2011 +1100 fs: dcache scale hash Add a new lock, dcache_hash_lock, to protect the dcache hash table from concurrent modification. d_hash is also protected by d_lock. Signed-off-by: Nick Piggin commit ec2447c278ee973d35f38e53ca16ba7f965ae33d Author: Nick Piggin Date: Fri Jan 7 17:49:29 2011 +1100 hostfs: simplify locking Remove dcache_lock locking from hostfs filesystem, and move it into dcache helpers. All that is required is a coherent path name. Protection from concurrent modification of the namespace after path name generation is not provided in current code, because dcache_lock is dropped before the path is used. Signed-off-by: Nick Piggin commit b1e6a015a580ad145689ad1d6b4aa0e03e6c868b Author: Nick Piggin Date: Fri Jan 7 17:49:28 2011 +1100 fs: change d_hash for rcu-walk Change d_hash so it may be called from lock-free RCU lookups. See similar patch for d_compare for details. For in-tree filesystems, this is just a mechanical change. Signed-off-by: Nick Piggin commit 621e155a3591962420eacdd39f6f0aa29ceb221e Author: Nick Piggin Date: Fri Jan 7 17:49:27 2011 +1100 fs: change d_compare for rcu-walk Change d_compare so it may be called from lock-free RCU lookups. This does put significant restrictions on what may be done from the callback, however there don't seem to have been any problems with in-tree fses. If some strange use case pops up that _really_ cannot cope with the rcu-walk rules, we can just add new rcu-unaware callbacks, which would cause name lookup to drop out of rcu-walk mode. For in-tree filesystems, this is just a mechanical change. Signed-off-by: Nick Piggin commit fb2d5b86aff355a27ebfc132d3c99f4a940cc3fe Author: Nick Piggin Date: Fri Jan 7 17:49:26 2011 +1100 fs: name case update method smpfs and ncpfs want to update a live dentry name in-place. Rather than have them open code the locking, provide a documented dcache API. Signed-off-by: Nick Piggin commit 2bc334dcc7c77be3700dd443d92a78603f76976b Author: Nick Piggin Date: Fri Jan 7 17:49:25 2011 +1100 jfs: dont overwrite dentry name in d_revalidate Use vfat's method for dealing with negative dentries to preserve case, rather than overwrite dentry name in d_revalidate, which is a bit ugly and also gets in the way of doing lock-free path walking. Signed-off-by: Nick Piggin commit 79eb4dde742fe2e9c9e301432b894a7410261ce7 Author: Nick Piggin Date: Fri Jan 7 17:49:24 2011 +1100 cifs: dont overwrite dentry name in d_revalidate Use vfat's method for dealing with negative dentries to preserve case, rather than overwrite dentry name in d_revalidate, which is a bit ugly and also gets in the way of doing lock-free path walking. Signed-off-by: Nick Piggin commit fe15ce446beb3a33583af81ffe6c9d01a75314ed Author: Nick Piggin Date: Fri Jan 7 17:49:23 2011 +1100 fs: change d_delete semantics Change d_delete from a dentry deletion notification to a dentry caching advise, more like ->drop_inode. Require it to be constant and idempotent, and not take d_lock. This is how all existing filesystems use the callback anyway. This makes fine grained dentry locking of dput and dentry lru scanning much simpler. Signed-off-by: Nick Piggin commit 5eef7fa905c814826f518aca2d414ca77508ce30 Author: Nick Piggin Date: Fri Jan 7 17:49:22 2011 +1100 fs: dcache documentation cleanup Remove redundant (and incorrect, since dcache RCU lookup) dentry locking documentation and point to the canonical document. Signed-off-by: Nick Piggin commit fbc8d4c04626e015b18cc61199f505920abb48f0 Author: Nick Piggin Date: Fri Jan 7 17:49:21 2011 +1100 config fs: avoid switching ->d_op on live dentry Switching d_op on a live dentry is racy in general, so avoid it. In this case it is a negative dentry, which is safer, but there are still concurrent ops which may be called on d_op in that case (eg. d_revalidate). So in general a filesystem may not do this. Fix configfs so as not to do this. Signed-off-by: Nick Piggin commit 5adcee1d8d32d7f305f6f5aaefdbf8f35adca177 Author: Nick Piggin Date: Fri Jan 7 17:49:20 2011 +1100 cgroup fs: avoid switching ->d_op on live dentry Switching d_op on a live dentry is racy in general, so avoid it. In this case it is a negative dentry, which is safer, but there are still concurrent ops which may be called on d_op in that case (eg. d_revalidate). So in general a filesystem may not do this. Fix cgroupfs so as not to do this. Signed-off-by: Nick Piggin commit 3e880fb5e4bb6a012035e3edd0586ee2817c2e24 Author: Nick Piggin Date: Fri Jan 7 17:49:19 2011 +1100 fs: use fast counters for vfs caches percpu_counter library generates quite nasty code, so unless you need to dynamically allocate counters or take fast approximate value, a simple per cpu set of counters is much better. The percpu_counter can never be made to work as well, because it has an indirection from pointer to percpu memory, and it can't use direct this_cpu_inc interfaces because it doesn't use static PER_CPU data, so code will always be worse. In the fastpath, it is the difference between this: incl %gs:nr_dentry # nr_dentry and this: movl percpu_counter_batch(%rip), %edx # percpu_counter_batch, movl $1, %esi #, movq $nr_dentry, %rdi #, call __percpu_counter_add # (plus I clobber registers) __percpu_counter_add: pushq %rbp # movq %rsp, %rbp #, subq $32, %rsp #, movq %rbx, -24(%rbp) #, movq %r12, -16(%rbp) #, movq %r13, -8(%rbp) #, movq %rdi, %rbx # fbc, fbc #APP # 216 "/home/npiggin/usr/src/linux-2.6/arch/x86/include/asm/thread_info.h" 1 movq %gs:kernel_stack,%rax #, pfo_ret__ # 0 "" 2 #NO_APP incl -8124(%rax) # .preempt_count movq 32(%rdi), %r12 # .counters, tcp_ptr__ #APP # 78 "lib/percpu_counter.c" 1 add %gs:this_cpu_off, %r12 # this_cpu_off, tcp_ptr__ # 0 "" 2 #NO_APP movslq (%r12),%r13 #* tcp_ptr__, tmp73 movslq %edx,%rax # batch, batch addq %rsi, %r13 # amount, count cmpq %rax, %r13 # batch, count jge .L27 #, negl %edx # tmp76 movslq %edx,%rdx # tmp76, tmp77 cmpq %rdx, %r13 # tmp77, count jg .L28 #, .L27: movq %rbx, %rdi # fbc, call _raw_spin_lock # addq %r13, 8(%rbx) # count, .count movq %rbx, %rdi # fbc, movl $0, (%r12) #,* tcp_ptr__ call _raw_spin_unlock # .L29: #APP # 216 "/home/npiggin/usr/src/linux-2.6/arch/x86/include/asm/thread_info.h" 1 movq %gs:kernel_stack,%rax #, pfo_ret__ # 0 "" 2 #NO_APP decl -8124(%rax) # .preempt_count movq -8136(%rax), %rax #, D.14625 testb $8, %al #, D.14625 jne .L32 #, .L31: movq -24(%rbp), %rbx #, movq -16(%rbp), %r12 #, movq -8(%rbp), %r13 #, leave ret .p2align 4,,10 .p2align 3 .L28: movl %r13d, (%r12) # count,* jmp .L29 # .L32: call preempt_schedule # .p2align 4,,6 jmp .L31 # .size __percpu_counter_add, .-__percpu_counter_add .p2align 4,,15 Signed-off-by: Nick Piggin commit 86c8749ede0c59e590de9267066932a26f1ce796 Author: Nick Piggin Date: Fri Jan 7 17:49:18 2011 +1100 vfs: revert per-cpu nr_unused counters for dentry and inodes The nr_unused counters count the number of objects on an LRU, and as such they are synchronized with LRU object insertion and removal and scanning, and protected under the LRU lock. Making it per-cpu does not actually get any concurrency improvements because of this lock, and summing the counter is much slower, and incrementing/decrementing it costs more code size and is slower too. These counters should stay per-LRU, which currently means global. Signed-off-by: Nick Piggin commit ccd35fb9f4da856b105ea0f1e0cab3702e8ae6ba Author: Nick Piggin Date: Fri Jan 7 17:49:17 2011 +1100 kernel: kmem_ptr_validate considered harmful This is a nasty and error prone API. It is no longer used, remove it. Signed-off-by: Nick Piggin commit 786a5e15b613a9cee4fc9139fc3113a5ab0fde79 Author: Nick Piggin Date: Fri Jan 7 17:49:16 2011 +1100 fs: d_validate fixes d_validate has been broken for a long time. kmem_ptr_validate does not guarantee that a pointer can be dereferenced if it can go away at any time. Even rcu_read_lock doesn't help, because the pointer might be queued in RCU callbacks but not executed yet. So the parent cannot be checked, nor the name hashed. The dentry pointer can not be touched until it can be verified under lock. Hashing simply cannot be used. Instead, verify the parent/child relationship by traversing parent's d_child list. It's slow, but only ncpfs and the destaged smbfs care about it, at this point. Signed-off-by: Nick Piggin commit 554738da71004d96e06fb75f4772dfc3b0f47810 Merge: 7b4b30689d688d9ca2e5c3859db6bbe1c35e6014 a6d38f889750ed6290728a19d9dad577b147c6d0 Author: Dmitry Torokhov Date: Thu Jan 6 22:34:59 2011 -0800 Merge branch 'next' into for-linus Conflicts: include/linux/input.h commit 01539ba2a706ab7d35fc0667dff919ade7f87d63 Merge: 9e9bc9736756f25d6c47b4eba0ebf25b20a6f153 dc69d1af9e8d9cbbabff88bb35a6782187a22229 Author: Linus Torvalds Date: Thu Jan 6 19:13:58 2011 -0800 Merge branch 'omap-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6 * 'omap-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6: (243 commits) omap2: Make OMAP2PLUS select OMAP_DM_TIMER OMAP4: hwmod data: Fix alignment and end of line in structurefields OMAP4: hwmod data: Move the DMA structures OMAP4: hwmod data: Move the smartreflex structures OMAP4: hwmod data: Fix missing SIDLE_SMART_WKUP in smartreflexsysc arm: omap: tusb6010: add name for MUSB IRQ arm: omap: craneboard: Add USB EHCI support omap2+: Initialize serial port for dynamic remuxing for n8x0 omap2+: Add struct omap_board_data and use it for platform level serial init omap2+: Allow hwmod state changes to mux pads based on the state changes omap2+: Add support for hwmod specific muxing of devices omap2+: Add omap_mux_get_by_name OMAP2: PM: fix compile error when !CONFIG_SUSPEND MAINTAINERS: OMAP: hwmod: update hwmod code, data maintainership OMAP4: Smartreflex framework extensions OMAP4: hwmod: Add inital data for smartreflex modules. OMAP4: PM: Program correct init voltages for scalable VDDs OMAP4: Adding voltage driver support OMAP4: Register voltage PMIC parameters with the voltage layer OMAP3: PM: Program correct init voltages for VDD1 and VDD2 ... Fix up trivial conflict in arch/arm/plat-omap/Kconfig commit c413521eb4e2d7ffd5ce432a144708d479054bd3 Author: Paul Mundt Date: Fri Jan 7 12:03:22 2011 +0900 ARM: mach-shmobile: update for SMP changes. There have likewise been some API updates, so we refactor to use the consolidated smp_prepare_cpus(). Signed-off-by: Paul Mundt commit c0312b33daa721a92633181fd4fe508484c81a2d Author: Paul Mundt Date: Fri Jan 7 12:02:11 2011 +0900 ARM: mach-shmobile: update for GIC changes. This fixes up the SMP support to use the refactored GIC APIs. Signed-off-by: Paul Mundt commit 6ef9f6fd8eb22f4838e9b0006d16936511e3f7f8 Author: Paul Mundt Date: Fri Jan 7 11:49:49 2011 +0900 ARM: mach-shmobile: Fix up clkdev fallout for SH73A0. Use the new linux/clkdev.h to get it building again. Signed-off-by: Paul Mundt commit 9e9bc9736756f25d6c47b4eba0ebf25b20a6f153 Merge: 3c0cb7c31c206aaedb967e44b98442bbeb17a6c4 e3c92215198cb6aa00ad38db2780faa6b72e0a3f Author: Linus Torvalds Date: Thu Jan 6 18:32:12 2011 -0800 Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6 * 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (255 commits) [media] radio-aimslab.c: Fix gcc 4.5+ bug [media] cx25821: Fix compilation breakage due to BKL dependency [media] v4l2-compat-ioctl32: fix compile warning [media] zoran: fix compiler warning [media] tda18218: fix compile warning [media] ngene: fix compile warning [media] DVB: IR support for TechnoTrend CT-3650 [media] cx23885, cimax2.c: Fix case of two CAM insertion irq [media] ir-nec-decoder: fix repeat key issue [media] staging: se401 depends on USB [media] staging: usbvideo/vicam depends on USB [media] soc_camera: Add the ability to bind regulators to soc_camedra devices [media] V4L2: Add a v4l2-subdev (soc-camera) driver for OmniVision OV2640 sensor [media] v4l: soc-camera: switch to .unlocked_ioctl [media] v4l: ov772x: simplify pointer dereference [media] ov9640: fix OmniVision OV9640 sensor driver's priv data retrieving [media] ov9640: use macro to request OmniVision OV9640 sensor private data [media] ivtv-i2c: Fix two warnings [media] staging/lirc: Update lirc TODO files [media] cx88: Remove the obsolete i2c_adapter.id field ... commit 04a186bd2c4d3fd7efdeb91d2e92f4624be3a764 Merge: e9d728f528f9548c8dd013899b23e662fa7b6bca 661382fe190475c17d0b3a6b5f0350b4f82f5939 Author: Paul Mundt Date: Fri Jan 7 11:03:37 2011 +0900 Merge branch 'common/dma' into rmobile-latest commit 661382fe190475c17d0b3a6b5f0350b4f82f5939 Author: Guennadi Liakhovetski Date: Thu Jan 6 17:04:50 2011 +0000 dma: shdma: don't register the global die notifier multiple times A recent patch has added a die notifier to the shdma driver, however, it registers a static die-notifier object in the probe routine, i.e., for each device instance. This is wrong and leads to a system lockup. This patch moves the die notifier registration to module init and exit routines respectively. Reported-by: Magnus Damm Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit e9d728f528f9548c8dd013899b23e662fa7b6bca Merge: 018a3fc7e3824ffcc80ad0160f9782c7d577c0c1 6155f77d09b968f591876f368d4843168910449e Author: Paul Mundt Date: Fri Jan 7 10:51:35 2011 +0900 Merge branch 'rmobile/smp' into rmobile-latest Conflicts: arch/arm/Kconfig arch/arm/mach-shmobile/include/mach/entry-macro-intc.S Signed-off-by: Paul Mundt commit 018a3fc7e3824ffcc80ad0160f9782c7d577c0c1 Author: Magnus Damm Date: Tue Dec 28 08:27:19 2010 +0000 ARM: mach-shmobile: Rely on run-time IRQ handlers Remove now unused IRQ demux code. All R-Mobile and SH-Mobile processors should register IRQ demux handlers during run-time. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit e74a9625f8dcf1a924345b24cec8476c52593df8 Author: Magnus Damm Date: Tue Dec 28 08:27:10 2010 +0000 ARM: mach-shmobile: Run-time IRQ handler for GIC Break-out GIC specific IRQ demux code from the file entry-macro-intc.S and register during run-time. Covers sh73a0. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 863b171952dba1a3ce9d345cfe4e93c9fdd42f49 Author: Magnus Damm Date: Tue Dec 28 08:27:01 2010 +0000 ARM: mach-shmobile: Run-time IRQ handler for INTCA Break-out INTC specific IRQ demux code from the file entry-macro-intc.S and register during run-time. Covers sh7367, sh7377 and sh7372. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 60f1435c3bab8b88712a4f96806e5ac9396aa49c Author: Magnus Damm Date: Tue Dec 28 08:26:52 2010 +0000 ARM: mach-shmobile: Enable CONFIG_MULTI_IRQ_HANDLER Always enable MULTI_IRQ_HANDLER on SH-Mobile. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 3dff8804fc087d55c593dda0ff78f475088ec57d Author: Magnus Damm Date: Wed Dec 22 12:17:09 2010 +0000 ARM: mach-shmobile: Use shared GIC entry macros Use the GIC demux code in asm/hardware/entry-macro-gic.S on the R-Mobile / SH-Mobile processors. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit eb6908a279dfbe2e1c1714c185e0f523a9749607 Author: Simon Horman Date: Thu Dec 9 00:47:15 2010 +0000 ARM: mach-shmobile: mackerel: Add zboot support When CONFIG_ZBOOT_ROM is selected, the resulting zImage file will be small boot loader and may be burned to rom or flash. Cc: Magnus Damm Cc: Kuninori Morimoto Signed-off-by: Simon Horman Signed-off-by: Paul Mundt commit 5e93c6b4ecd78b1bab49bad1dc2f6ed7ec0115ee Merge: 98d27b8abf413a310df6676f7d2128ada1cccc08 3c0cb7c31c206aaedb967e44b98442bbeb17a6c4 Author: Paul Mundt Date: Fri Jan 7 10:29:26 2011 +0900 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6 into rmobile-latest Conflicts: arch/arm/mach-shmobile/Kconfig Signed-off-by: Paul Mundt commit 3c0cb7c31c206aaedb967e44b98442bbeb17a6c4 Merge: f70f5b9dc74ca7d0a64c4ead3fb28da09dc1b234 404a02cbd2ae8bf256a2fa1169bdfe86bb5ebb34 Author: Linus Torvalds Date: Thu Jan 6 16:50:35 2011 -0800 Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm * 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm: (416 commits) ARM: DMA: add support for DMA debugging ARM: PL011: add DMA burst threshold support for ST variants ARM: PL011: Add support for transmit DMA ARM: PL011: Ensure IRQs are disabled in UART interrupt handler ARM: PL011: Separate hardware FIFO size from TTY FIFO size ARM: PL011: Allow better handling of vendor data ARM: PL011: Ensure error flags are clear at startup ARM: PL011: include revision number in boot-time port printk ARM: vexpress: add sched_clock() for Versatile Express ARM i.MX53: Make MX53 EVK bootable ARM i.MX53: Some bug fix about MX53 MSL code ARM: 6607/1: sa1100: Update platform device registration ARM: 6606/1: sa1100: Fix platform device registration ARM i.MX51: rename IPU irqs ARM i.MX51: Add ipu clock support ARM: imx/mx27_3ds: Add PMIC support ARM: DMA: Replace page_to_dma()/dma_to_page() with pfn_to_dma()/dma_to_pfn() mx51: fix usb clock support MX51: Add support for usb host 2 arch/arm/plat-mxc/ehci.c: fix errors/typos ... commit f70f5b9dc74ca7d0a64c4ead3fb28da09dc1b234 Merge: b69fc2efc9205d58c820eb2eb1caa6bf873b4b0d 09798eb9479da3413bdf96e7d22a84d8b21e05e1 Author: Linus Torvalds Date: Thu Jan 6 15:30:54 2011 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6: (25 commits) atyfb: Fix bootup hangs on sparc64. sparc: update copyright in piggyback.c sparc: unify strip command in boot/Makefile sparc: rename piggyback_32 to piggyback sparc: fix tftpboot.img for sparc64 on little-endian host sparc: add $BITS to piggyback arguments sparc: remove obsolete ELF support in piggyback_32.c sparc: additional comments to piggyback_32.c sparc: use _start for the start entry (like 64 bit does) sparc: use trapbase in setup_arch sparc: refactor piggy_32.c Added support for ampopts in APBUART driver. Used in AMP systems. APBUART: added raw AMBA vendor/device number to match against. SPARC/LEON: avoid AMBAPP name duplicates in openprom fs when REG is missing SPARC/LEON: added support for selecting Timer Core and Timer within core LEON: added raw AMBA vendor/device number to find TIMER, IRQCTRL SPARC/LEON: added support for IRQAMP IRQ Controller SPARC/LEON: find IRQCTRL and Timer via OF-Tree, instead of hardcoded. sparc: fix sparse warnings in arch/sparc/prom for 32 bit build sparc: remove unused prom tree functions ... commit 404a02cbd2ae8bf256a2fa1169bdfe86bb5ebb34 Merge: 28cdac6690cb113856293bf79b40de33dbd8f974 1051b9f0f9eab8091fe3bf98320741adf36b4cfa Author: Russell King Date: Thu Jan 6 22:33:32 2011 +0000 Merge branch 'devel-stable' into devel Conflicts: arch/arm/mach-pxa/clock.c arch/arm/mach-pxa/clock.h commit 28cdac6690cb113856293bf79b40de33dbd8f974 Merge: 4073723acb9cdcdbe4df9c0e0c376c65d1697e43 36bb94ba36f332de767cfaa3af6a5136435a3a9c Author: Russell King Date: Thu Jan 6 22:33:19 2011 +0000 Merge branch 'pgt' (early part) into devel commit 4073723acb9cdcdbe4df9c0e0c376c65d1697e43 Merge: 58daf18cdcab550262a5f4681e1f1e073e21965a 4ec3eb13634529c0bc7466658d84d0bbe3244aea Author: Russell King Date: Thu Jan 6 22:32:52 2011 +0000 Merge branch 'misc' into devel Conflicts: arch/arm/Kconfig arch/arm/common/Makefile arch/arm/kernel/Makefile arch/arm/kernel/smp.c commit 4ec3eb13634529c0bc7466658d84d0bbe3244aea Merge: 24056f525051a9e186af28904b396320e18bf9a0 15095bb0fe779c0403091bda7adce5fb3bb9ca35 Author: Russell King Date: Thu Jan 6 22:31:35 2011 +0000 Merge branch 'smp' into misc Conflicts: arch/arm/kernel/entry-armv.S arch/arm/mm/ioremap.c commit 24056f525051a9e186af28904b396320e18bf9a0 Author: Russell King Date: Mon Jan 3 11:29:28 2011 +0000 ARM: DMA: add support for DMA debugging Add ARM support for the DMA debug infrastructure, which allows the DMA API usage to be debugged. Signed-off-by: Russell King commit b69fc2efc9205d58c820eb2eb1caa6bf873b4b0d Merge: 84b7290cca16c61a167c7e1912cd84a479852165 c6d92e9b84da2002ee7a75b784834970ddfd3bfd Author: Linus Torvalds Date: Thu Jan 6 13:36:30 2011 -0800 Merge branch 'for-linus' of git://codeaurora.org/quic/kernel/davidb/linux-msm * 'for-linus' of git://codeaurora.org/quic/kernel/davidb/linux-msm: (35 commits) mmc: msm_sdcc: Check for only DATA_END interrupt to end a request mmc: msm_sdcc: Fix bug in PIO mode when data size is not word aligned mmc: msm_sdcc: Reset SDCC in case of data transfer errors mmc: msm_sdcc: Add prog done interrupt support mmc: msm_sdcc: Fix possible circular locking dependency warning MSM: Add USB support for MSM7x30 MSM: Add USB suport for QSD8x50 msm: initial framebuffer support msm: add handling for clocks tagged as CLK_MINMAX msm: trout: change name of pmdh_clk to mddi_clk msm: add CLK_MINMAX to pmdh_clk msm: trout: add gpio_to_irq msm: iommu: Use the correct memory allocation flag msm_serial: Remove redundant unlikely() msm: iommu: Miscellaneous code cleanup msm: iommu: Support cache-coherent memory access msm: iommu: Definitions for extended memory attributes msm: iommu: Kconfig dependency for the IOMMU API msm: iommu: Check if device is already attached msm: iommu: Kconfig item for cacheable page tables ... commit 84b7290cca16c61a167c7e1912cd84a479852165 Merge: 9858a38ea3a940762ae3028cce88f686d0e0c28b 1928e87bcf185f56008d0746f887b691c1cb8c4a Author: Linus Torvalds Date: Thu Jan 6 13:35:12 2011 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6: (55 commits) video: udlfb: Kill off special printk wrappers, use pr_fmt(). video: udlfb: Kill off some magic constants for EDID sizing. video: udlfb: deifdefify (yes, that's a word). fbdev: modedb: Add a new mode for 864x480 TAAL panels. drivers/video/i810/i810-i2c.c: fix i2c bus handling video: Fix the HGA framebuffer driver drivers/video/carminefb.c: improve error handling video: imxfb: Fix the maximum value for yres fbdev: sh_mobile_lcdcfb: Enable 32 bpp and 24 bpp support fbdev: sh_mipi_dsi: use platform provided register layout and values ARM: mach-shmobile: specify sh7372 MIPI DSI register layout fbdev: sh_mipi_dsi: support different register layouts ARM: mach-shmobile: improve MIPI DSI clock configuration fbdev: sh-mobile: implement MIPI DSI runtime PM support sisfb: eliminate compiler warnings sisfb: delete unused register I/O macros sisfb: replace setSISIDXREG with SiS_SetRegANDOR sisfb: replace andSISIDXREG with SiS_SetRegAND sisfb: replace orSISIDXREG with SiS_SetRegOR sisfb: replace outSISIDXREG with SiS_SetReg ... commit 9858a38ea3a940762ae3028cce88f686d0e0c28b Merge: abb359450f20c32ae03039d8736f12b1d561caf5 f862f904d357dc0d3612347a8dbabe6fae037fbb Author: Linus Torvalds Date: Thu Jan 6 13:34:45 2011 -0800 Merge branch 'sh-latest' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 * 'sh-latest' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6: sh: include Migo-R TS driver in Migo-R defconfig sh: correct definitions to access stack pointers sh: Tidy up SH-4A unaligned load support. dma: shdma: NMI support. sh: mach-sdk7786: Handle baseboard NMI source selection. sh: mach-rsk: Add polled GPIO buttons support for RSK+7203. sh: Break out cpuinfo_op procfs bits. sh: Enable optional gpiolib for all CPUs with pinmux tables. sh: migrate SH_CLK_MD to mode pin API. sh: machvec IO death. commit abb359450f20c32ae03039d8736f12b1d561caf5 Merge: cb600d2f83c854ec3d6660063e4466431999489b 4e3dbdb1392a83bd21a6ff8f6bc785495058d37c Author: Linus Torvalds Date: Thu Jan 6 12:30:19 2011 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1436 commits) cassini: Use local-mac-address prom property for Cassini MAC address net: remove the duplicate #ifdef __KERNEL__ net: bridge: check the length of skb after nf_bridge_maybe_copy_header() netconsole: clarify stopping message netconsole: don't announce stopping if nothing happened cnic: Fix the type field in SPQ messages netfilter: fix export secctx error handling netfilter: fix the race when initializing nf_ct_expect_hash_rnd ipv4: IP defragmentation must be ECN aware net: r6040: Return proper error for r6040_init_one dcb: use after free in dcb_flushapp() dcb: unlock on error in dcbnl_ieee_get() net: ixp4xx_eth: Return proper error for eth_init_one include/linux/if_ether.h: Add #define ETH_P_LINK_CTL for HPNA and wlan local tunnel net: add POLLPRI to sock_def_readable() af_unix: Avoid socket->sk NULL OOPS in stream connect security hooks. net_sched: pfifo_head_drop problem mac80211: remove stray extern mac80211: implement off-channel TX using hw r-o-c offload mac80211: implement hardware offload for remain-on-channel ... commit 4e3dbdb1392a83bd21a6ff8f6bc785495058d37c Author: Richard Mortimer Date: Thu Jan 6 11:50:30 2011 -0800 cassini: Use local-mac-address prom property for Cassini MAC address Fallback on the local-mac-address prom property if the Cassini device does not have an address programmed in the VPD ROM. This uses the same technique as implemented by the sungem driver. The problem was reported by Frans van Berckel using Debian kernel 2.6.34-7 on Sun Fire V440. udev was assigning a new eth device name on each reboot because the cassini driver was using a random MAC address. Fix tested on 2.6.34-7 and 2.6.37 Sun Fire V440. Compile tested against 2.6.36 davem/sparc-2.6.git Reported-by: Frans van Berckel Tested-by: Frans van Berckel Reviewed-by: Julian Calaby Reviewed-by: Sam Ravnborg Signed-off-by: Richard Mortimer Signed-off-by: David S. Miller commit 2ad0d9d413abc3380fc1d89a9da7f8db59d9746b Author: Changli Gao Date: Thu Jan 6 11:41:42 2011 -0800 net: remove the duplicate #ifdef __KERNEL__ Since we are already in #ifdef __KERNEL__, we don't need to check it again. Signed-off-by: Changli Gao Signed-off-by: David S. Miller commit 09798eb9479da3413bdf96e7d22a84d8b21e05e1 Author: David S. Miller Date: Wed Jan 5 13:08:06 2011 -0800 atyfb: Fix bootup hangs on sparc64. After commit 25edd6946a1d74e5e77813c2324a0908c68bcf9e ("sparc64: Get rid of indirect p1275 PROM call buffer.") we can't pass virtual addresses >4GB to PROM calls. Largely this is never necessary in drivers because we have a copy of the entire PROM device tree in the kernel and a set of of_*() interfaces to access it. Unfortunately there were some lingering prom calls in the atyfb driver, in particular prom_finddevice() was being called with an on-stack address which could be anywhere. This code is actually probing for information we already have, the PROM choosen console output device is stored in of_console_device so all of this nasty code consolidates into a one-line comparison. Next we have some prom_getintdefault() calls which are trivially transformed into the equivalent of_getintprop_default(). Special thanks to Fabio, who figured out exactly where the bootup was hanging. That made this bug trivial to fix. Reported-by: Fabio M. Di NItto Reported-by: Sam Ravnborg Reported-by: Frans van Berckel Signed-off-by: David S. Miller Signed-off-by: Fabio M. Di NItto commit f88de8de5a8c8a8a73960d4432ceef2d38b7f86f Author: Changli Gao Date: Sat Dec 25 03:41:30 2010 +0000 net: bridge: check the length of skb after nf_bridge_maybe_copy_header() Since nf_bridge_maybe_copy_header() may change the length of skb, we should check the length of skb after it to handle the ppoe skbs. Signed-off-by: Changli Gao Signed-off-by: David S. Miller commit 38cfb907a55f3223445151b517b6e4678b8c9d66 Author: Ferenc Wagner Date: Thu Jan 6 05:11:20 2011 +0000 netconsole: clarify stopping message Signed-off-by: Ferenc Wagner Signed-off-by: David S. Miller commit 141dfba342b672588799432d74a3b6be88b5d713 Author: Ferenc Wagner Date: Thu Jan 6 05:11:19 2011 +0000 netconsole: don't announce stopping if nothing happened Signed-off-by: Ferenc Wagner Signed-off-by: David S. Miller commit 68d7c1aa2fee6acb11fcb826a207e4b81d8a1f57 Author: Michael Chan Date: Wed Jan 5 15:14:13 2011 +0000 cnic: Fix the type field in SPQ messages The new firmware interface requires each Slow Path Queue (SPQ) message's type field to include the function number. The existing code does not do this consistently. We fix this by OR'ing in the function number into the type field centrally in cnic_submit_kwqe_16(). Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit cba85b532e4aabdb97f44c18987d45141fd93faa Author: Pablo Neira Ayuso Date: Thu Jan 6 11:25:00 2011 -0800 netfilter: fix export secctx error handling In 1ae4de0cdf855305765592647025bde55e85e451, the secctx was exported via the /proc/net/netfilter/nf_conntrack and ctnetlink interfaces instead of the secmark. That patch introduced the use of security_secid_to_secctx() which may return a non-zero value on error. In one of my setups, I have NF_CONNTRACK_SECMARK enabled but no security modules. Thus, security_secid_to_secctx() returns a negative value that results in the breakage of the /proc and `conntrack -L' outputs. To fix this, we skip the inclusion of secctx if the aforementioned function fails. This patch also fixes the dynamic netlink message size calculation if security_secid_to_secctx() returns an error, since its logic is also wrong. This problem exists in Linux kernel >= 2.6.37. Signed-off-by: Pablo Neira Ayuso Signed-off-by: David S. Miller commit f682cefa5ad204d3bfaa54a58046c66d2d035ac1 Author: Changli Gao Date: Wed Jan 5 04:23:23 2011 +0000 netfilter: fix the race when initializing nf_ct_expect_hash_rnd Since nf_ct_expect_dst_hash() may be called without nf_conntrack_lock locked, nf_ct_expect_hash_rnd should be initialized in the atomic way. In this patch, we use nf_conntrack_hash_rnd instead of nf_ct_expect_hash_rnd. Signed-off-by: Changli Gao Acked-by: Eric Dumazet Signed-off-by: David S. Miller commit 6623e3b24a5ebb07e81648c478d286a1329ab891 Author: Eric Dumazet Date: Wed Jan 5 07:52:55 2011 +0000 ipv4: IP defragmentation must be ECN aware RFC3168 (The Addition of Explicit Congestion Notification to IP) states : 5.3. Fragmentation ECN-capable packets MAY have the DF (Don't Fragment) bit set. Reassembly of a fragmented packet MUST NOT lose indications of congestion. In other words, if any fragment of an IP packet to be reassembled has the CE codepoint set, then one of two actions MUST be taken: * Set the CE codepoint on the reassembled packet. However, this MUST NOT occur if any of the other fragments contributing to this reassembly carries the Not-ECT codepoint. * The packet is dropped, instead of being reassembled, for any other reason. This patch implements this requirement for IPv4, choosing the first action : If one fragment had NO-ECT codepoint reassembled frame has NO-ECT ElIf one fragment had CE codepoint reassembled frame has CE Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 9c86c0f4ba49b39f909d7f18731b91e563e07065 Author: Axel Lin Date: Tue Jan 4 22:40:04 2011 +0000 net: r6040: Return proper error for r6040_init_one Return -ENOMEM instead of 0 for the case of mdiobus_alloc and kmalloc failure. Signed-off-by: Axel Lin Acked-by: Florian Fainelli Signed-off-by: David S. Miller commit 2a8fe003741aa90b6b9453e90af4bbb7bc42918c Author: Dan Carpenter Date: Tue Jan 4 21:03:44 2011 +0000 dcb: use after free in dcb_flushapp() The original code has a use after free bug because it's not using the _safe() version of the list_for_each_entry() macro. Signed-off-by: Dan Carpenter Signed-off-by: David S. Miller commit 70bfa2d2e1bfd90ef26758b5e2749f043a940037 Author: Dan Carpenter Date: Tue Jan 4 21:03:12 2011 +0000 dcb: unlock on error in dcbnl_ieee_get() There is a "goto nla_put_failure" hidden inside the NLA_PUT() macro, but we're holding the dcb_lock so we need to unlock first. Signed-off-by: Dan Carpenter Signed-off-by: David S. Miller commit cb600d2f83c854ec3d6660063e4466431999489b Merge: 47935a731b7b850a4c6c0e55ed0741e3dd25d889 d50d8fe192428090790e7178e9507e981e0b005b Author: Linus Torvalds Date: Thu Jan 6 11:12:17 2011 -0800 Merge branch 'x86-mm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-mm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, mm: Initialize initial_page_table before paravirt jumps commit 0c6610017459ed9642548694fe88971d3f4206aa Author: Axel Lin Date: Tue Jan 4 19:24:06 2011 +0000 net: ixp4xx_eth: Return proper error for eth_init_one Return PTR_ERR(port->phydev) instead of 1 if phy_connect failed. Signed-off-by: Axel Lin Acked-by: Krzysztof Halasa Signed-off-by: David S. Miller commit 47935a731b7b850a4c6c0e55ed0741e3dd25d889 Merge: 77a0dd54ba3c86b00ab7079bc3be5d82395ecab2 3fb82d56ad003e804923185316236f26b30dfdd5 fd35fbcdd1b2579a6e00a1545f7124e4005d0474 9e76a97efd31a08cb19d0ba12013b8fb4ad3e474 c8217b8305e5e75c23617f2f4cd262527d952c0a 3cf9b85b474e656a0856b88290c7a289ac5ea247 f6cd24777513fcc673d432cc29ef59881d3e4df1 Author: Linus Torvalds Date: Thu Jan 6 11:11:50 2011 -0800 Merge branches 'x86-alternatives-for-linus', 'x86-fpu-for-linus', 'x86-hwmon-for-linus', 'x86-paravirt-for-linus', 'core-locking-for-linus' and 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-alternatives-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, suspend: Avoid unnecessary smp alternatives switch during suspend/resume * 'x86-fpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86-64, asm: Use fxsaveq/fxrestorq in more places * 'x86-hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, hwmon: Add core threshold notification to therm_throt.c * 'x86-paravirt-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, paravirt: Use native_halt on a halt, not native_safe_halt * 'core-locking-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: locking, lockdep: Convert sprintf_symbol to %pS * 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: irq: Better struct irqaction layout commit 238c855805c853eaec95b0bc3065effb64f955a0 Author: Henry Ptasinski Date: Tue Jan 4 16:07:14 2011 +0000 include/linux/if_ether.h: Add #define ETH_P_LINK_CTL for HPNA and wlan local tunnel Ethertype used by HPNA control protocols (LARQ, rate, link, etc) and by Broadcom wlan drivers for local signalling. Signed-off-by: Henry Ptasinski Signed-off-by: David S. Miller commit 77a0dd54ba3c86b00ab7079bc3be5d82395ecab2 Merge: d7a5a18190d6f523b5d795bfd73f83cf13a3a383 cfa60917f0ba6eca83f41aef3cb4a7dd7736ac9f Author: Linus Torvalds Date: Thu Jan 6 11:09:57 2011 -0800 Merge branch 'x86-uv-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-uv-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, UV, BAU: Extend for more than 16 cpus per socket x86, UV: Fix the effect of extra bits in the hub nodeid register x86, UV: Add common uv_early_read_mmr() function for reading MMRs commit d7a5a18190d6f523b5d795bfd73f83cf13a3a383 Merge: 4f00b901d4233a78e6ca4d44c8c6fc5d38a3ee9e a8760eca6cf60ed303ad494ef45901f63165d2c8 Author: Linus Torvalds Date: Thu Jan 6 11:08:14 2011 -0800 Merge branch 'x86-tsc-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-tsc-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86: Check tsc available/disabled in the delayed init function x86: Improve TSC calibration using a delayed workqueue x86: Make tsc=reliable override boot time stability checks commit 7e12eddb73d4f288b0339ee13832a34d6bc4fd90 Author: Pavel Shilovsky Date: Thu Nov 25 17:20:20 2010 +0300 CIFS: Simplify cifs_open code Make the code more general for use in posix and non-posix open. Reviewed-by: Jeff Layton Signed-off-by: Pavel Shilovsky Signed-off-by: Steve French commit eeb910a6d46103594eb63e6eba1aeb02022368a4 Author: Pavel Shilovsky Date: Thu Nov 25 15:12:39 2010 +0300 CIFS: Simplify non-posix open stuff (try #2) Delete cifs_open_inode_helper and move non-posix open related things to cifs_nt_open function. Reviewed-by: Jeff Layton Signed-off-by: Pavel Shilovsky Signed-off-by: Steve French commit 4b886136df2b923b6fc6b2d83faa9554e84e05ab Author: Pavel Shilovsky Date: Mon Dec 13 22:18:07 2010 +0300 CIFS: Add match_port check during looking for an existing connection (try #4) If we have a share mounted by non-standard port and try to mount another share on the same host with standard port, we connect to the first share again - that's wrong. This patch fixes this bug. Signed-off-by: Pavel Shilovsky Reviewed-by: Jeff Layton Signed-off-by: Steve French commit a9f1b85e5ba80519dea6974e3574fa7a30cc5e29 Author: Pavel Shilovsky Date: Mon Dec 13 19:08:35 2010 +0300 CIFS: Simplify ipv*_connect functions into one (try #4) Make connect logic more ip-protocol independent and move RFC1001 stuff into a separate function. Also replace union addr in TCP_Server_Info structure with sockaddr_storage. Signed-off-by: Pavel Shilovsky Reviewed-and-Tested-by: Jeff Layton Signed-off-by: Steve French commit df8fbc241aa3c451248b1f19fff3a3f604b107f9 Author: Shirish Pargaonkar Date: Sat Dec 11 14:19:22 2010 -0600 cifs: Support NTLM2 session security during NTLMSSP authentication [try #5] Indicate to the server a capability of NTLM2 session security (NTLM2 Key) during ntlmssp protocol exchange in one of the bits of the flags field. If server supports this capability, send NTLM2 key even if signing is not required on the server. If the server requires signing, the session keys exchanged for NTLMv2 and NTLM2 session security in auth packet of the nlmssp exchange are same. Send the same flags in authenticate message (type 3) that client sent in negotiate message (type 1). Remove function setup_ntlmssp_neg_req Make sure ntlmssp negotiate and authenticate messages are zero'ed before they are built. Reported-and-Tested-by: Robbert Kouprie Signed-off-by: Shirish Pargaonkar Acked-by: Jeff Layton Signed-off-by: Steve French commit 262f86adcc0665872812a7458a5d03e19e0efe33 Author: Nick Piggin Date: Thu Nov 11 18:42:16 2010 +1100 cifs: don't overwrite dentry name in d_revalidate Instead, use fatfs's method for dealing with negative dentries to preserve case, rather than overwrite dentry name in d_revalidate, which is a bit ugly and also gets in the way of doing lock-free path walking. Signed-off-by: Nick Piggin Signed-off-by: Steve French commit 4f00b901d4233a78e6ca4d44c8c6fc5d38a3ee9e Merge: b4c6e2ea5e46b03c764a918f4999a77a3149979f 94462ad3b14739d158a1ab87bb30008c1e5a6bc1 Author: Linus Torvalds Date: Thu Jan 6 11:07:33 2011 -0800 Merge branch 'x86-security-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-security-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: module: Move RO/NX module protection to after ftrace module update x86: Resume trampoline must be executable x86: Add RO/NX protection for loadable kernel modules x86: Add NX protection for kernel data x86: Fix improper large page preservation commit b4c6e2ea5e46b03c764a918f4999a77a3149979f Merge: 6f46b120a96212b85cbdcb84a64c854dfd791ede 991cfffa7c19aa648546aff666595af896e568ba Author: Linus Torvalds Date: Thu Jan 6 11:06:31 2011 -0800 Merge branch 'x86-platform-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-platform-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, earlyprintk: Move mrst early console to platform/ and fix a typo x86, apbt: Setup affinity for apb timers acting as per-cpu timer ce4100: Add errata fixes for UART on CE4100 x86: platform: Move iris to x86/platform where it belongs x86, mrst: Check platform_device_register() return code x86/platform: Add Eurobraille/Iris power off support x86, mrst: Add explanation for using 1960 as the year offset for vrtc x86, mrst: Fix dependencies of "select INTEL_SCU_IPC" x86, mrst: The shutdown for MRST requires the SCU IPC mechanism x86: Ce4100: Add reboot_fixup() for CE4100 ce4100: Add PCI register emulation for CE4100 x86: Add CE4100 platform support x86: mrst: Set vRTC's IRQ to level trigger type x86: mrst: Add audio driver bindings rtc: Add drivers/rtc/rtc-mrst.c x86: mrst: Add vrtc driver which serves as a wall clock device x86: mrst: Add Moorestown specific reboot/shutdown support x86: mrst: Parse SFI timer table for all timer configs x86/mrst: Add SFI platform device parsing code commit 6f46b120a96212b85cbdcb84a64c854dfd791ede Merge: 4e1db5e58af8bc6ab4a651df279add41c48d3fc2 c7657ac0c3e4d4ab569296911164b7a2b0ff871a Author: Linus Torvalds Date: Thu Jan 6 11:06:09 2011 -0800 Merge branch 'x86-microcode-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-microcode-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, microcode, AMD: Cleanup code a bit x86, microcode, AMD: Replace vmalloc+memset with vzalloc commit 4e1db5e58af8bc6ab4a651df279add41c48d3fc2 Merge: 37d9a8c5ea8fc063841c133fc53cc168ee620762 eb48c9cb2053e7bb5f7f8f0371cb578a0d439450 Author: Linus Torvalds Date: Thu Jan 6 11:05:21 2011 -0800 Merge branch 'x86-mce-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-mce-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: apic, amd: Make firmware bug messages more meaningful mce, amd: Remove goto in threshold_create_device() mce, amd: Add helper functions to setup APIC mce, amd: Shorten local variables mci_misc_{hi,lo} mce, amd: Implement mce_threshold_block_init() helper function commit 37d9a8c5ea8fc063841c133fc53cc168ee620762 Merge: 017892c341033b3e961e695bc0bf1a815efcf92e 79250af2d5953b69380a6319b493862bf4ece972 Author: Linus Torvalds Date: Thu Jan 6 10:56:02 2011 -0800 Merge branch 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86: Fix included-by file reference comments x86, cpu: Only CPU features determine NX capabilities x86, cpu: Call verify_cpu during 32bit CPU startup x86, cpu: Clear XD_DISABLED flag on Intel to regain NX x86, cpu: Rename verify_cpu_64.S to verify_cpu.S commit 5f9251cb93237c9578160df9acc6ce9948ad8c52 Merge: 2c6607c611cb7bf0a6750bcea34a258144e302c5 06778b1c383afbdb88ffd837e117bec06a76f450 Author: David S. Miller Date: Thu Jan 6 10:55:42 2011 -0800 Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 commit 2c6607c611cb7bf0a6750bcea34a258144e302c5 Author: Eric Dumazet Date: Thu Jan 6 10:54:29 2011 -0800 net: add POLLPRI to sock_def_readable() Leonardo Chiquitto found poll() could block forever on tcp sockets and Urgent data was received, if the event flag only contains POLLPRI. He did a bisection and found commit 4938d7e0233 (poll: avoid extra wakeups in select/poll) was the source of the problem. Problem is TCP sockets use standard sock_def_readable() function for their sk_data_ready() handler, and sock_def_readable() doesnt signal POLLPRI. Only TCP is affected by the problem. Adding POLLPRI to the list of flags might trigger unnecessary schedules, but URGENT handling is such a seldom used feature this seems a good compromise. Thanks a lot to Leonardo for providing the bisection result and a test program as well. Reference : http://www.spinics.net/lists/netdev/msg151793.html Reported-and-bisected-by: Leonardo Chiquitto Signed-off-by: Eric Dumazet Tested-by: Eric Dumazet Signed-off-by: David S. Miller commit 017892c341033b3e961e695bc0bf1a815efcf92e Merge: 42cbd8efb0746b55112de45173219f76c54390da cb2ded37fd2e1039f96c8c892da024a8f033add5 Author: Linus Torvalds Date: Thu Jan 6 10:51:36 2011 -0800 Merge branch 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86: Fix APIC ID sizing bug on larger systems, clean up MAX_APICS confusion x86, acpi: Parse all SRAT cpu entries even above the cpu number limitation x86, acpi: Add MAX_LOCAL_APIC for 32bit x86: io_apic: Split setup_ioapic_ids_from_mpc() x86: io_apic: Fix CONFIG_X86_IO_APIC=n breakage x86: apic: Move probe_nr_irqs_gsi() into ioapic_init_mappings() x86: Allow platforms to force enable apic commit 42cbd8efb0746b55112de45173219f76c54390da Merge: dda5f0a372873bca5f0b1d1866d7784dffd8b675 f658bcfb2607bf0808966a69cf74135ce98e5c2d Author: Linus Torvalds Date: Thu Jan 6 10:50:28 2011 -0800 Merge branch 'x86-amd-nb-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-amd-nb-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, cacheinfo: Cleanup L3 cache index disable support x86, amd-nb: Cleanup AMD northbridge caching code x86, amd-nb: Complete the rename of AMD NB and related code commit 568389c257fa7d74ce36c2f78bad31965fded4cf Author: Thomas Gleixner Date: Fri Dec 17 11:16:17 2010 +0100 serial: apbuart: Fixup apbuart_console_init() commit 35c64e5d (drivers: serial: apbuart: Handle OF failures gracefully) missed that the modified grlib_apbuart_configure() function is called from apbuart_console_init() as well. Fix the fallout. Reported-by: Stephen Rothwell Signed-off-by: Thomas Gleixner Signed-off-by: Greg Kroah-Hartman commit dda5f0a372873bca5f0b1d1866d7784dffd8b675 Merge: 65b2074f84be2287e020839e93b4cdaaf60eb37c 88606e80da0e8d862a42ee19e5bb60b01b940ea7 Author: Linus Torvalds Date: Thu Jan 6 10:42:43 2011 -0800 Merge branch 'timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: MAINTAINERS: Update timer related entries timers: Use this_cpu_read timerqueue: Make timerqueue_getnext() static inline hrtimer: fix timerqueue conversion flub hrtimers: Convert hrtimers to use timerlist infrastructure timers: Fixup allmodconfig build issue timers: Rename timerlist infrastructure to timerqueue timers: Introduce timerlist infrastructure. hrtimer: Remove stale comment on curr_timer timer: Warn when del_timer_sync() is called in hardirq context timer: Del_timer_sync() can be used in softirq context timer: Make try_to_del_timer_sync() the same on SMP and UP posix-timers: Annotate lock_timer() timer: Permit statically-declared work with deferrable timers time: Use ARRAY_SIZE macro in timecompare.c timer: Initialize the field slack of timer_list timer_list: Remove alignment padding on 64 bit when CONFIG_TIMER_STATS time: Compensate for rounding on odd-frequency clocksources Fix up trivial conflict in MAINTAINERS commit 65b2074f84be2287e020839e93b4cdaaf60eb37c Merge: 28d9bfc37c861aa9c8386dff1ac7e9a10e5c5162 6bf4123760a5aece6e4829ce90b70b6ffd751d65 Author: Linus Torvalds Date: Thu Jan 6 10:23:33 2011 -0800 Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (30 commits) sched: Change wait_for_completion_*_timeout() to return a signed long sched, autogroup: Fix reference leak sched, autogroup: Fix potential access to freed memory sched: Remove redundant CONFIG_CGROUP_SCHED ifdef sched: Fix interactivity bug by charging unaccounted run-time on entity re-weight sched: Move periodic share updates to entity_tick() printk: Use this_cpu_{read|write} api on printk_pending sched: Make pushable_tasks CONFIG_SMP dependant sched: Add 'autogroup' scheduling feature: automated per session task groups sched: Fix unregister_fair_sched_group() sched: Remove unused argument dest_cpu to migrate_task() mutexes, sched: Introduce arch_mutex_cpu_relax() sched: Add some clock info to sched_debug cpu: Remove incorrect BUG_ON cpu: Remove unused variable sched: Fix UP build breakage sched: Make task dump print all 15 chars of proc comm sched: Update tg->shares after cpu.shares write sched: Allow update_cfs_load() to update global load sched: Implement demand based update_cfs_load() ... commit 28d9bfc37c861aa9c8386dff1ac7e9a10e5c5162 Merge: f3b0cfa9b017a9d4686c9b14b908a1685f97a077 4b95f135f606c87e4056b6d7fd3c5781c818858b Author: Linus Torvalds Date: Thu Jan 6 10:17:26 2011 -0800 Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (146 commits) tools, perf: Documentation for the power events API perf: Add calls to suspend trace point perf script: Make some lists static perf script: Use the default lost event handler perf session: Warn about errors when processing pipe events too perf tools: Fix perf_event.h header usage perf test: Clarify some error reports in the open syscall test x86, NMI: Add touch_nmi_watchdog to io_check_error delay x86: Avoid calling arch_trigger_all_cpu_backtrace() at the same time x86: Only call smp_processor_id in non-preempt cases perf timechart: Adjust perf timechart to the new power events perf: Clean up power events by introducing new, more generic ones perf: Do not export power_frequency, but power_start event perf test: Add test for counting open syscalls perf evsel: Auto allocate resources needed for some methods perf evsel: Use {cpu,thread}_map to shorten list of parameters perf tools: Refactor all_tids to hold nr and the map perf tools: Refactor cpumap to hold nr and the map perf evsel: Introduce per cpu and per thread open helpers perf evsel: Steal the counter reading routines from stat ... commit f3b0cfa9b017a9d4686c9b14b908a1685f97a077 Merge: 2af49b6058d857fa5b476db642d4452bf5833ecd 5bdb05f91b27b9361c4f348a4e05999f597df72e Author: Linus Torvalds Date: Thu Jan 6 10:07:05 2011 -0800 Merge branch 'core-futexes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'core-futexes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: futex: Add futex_q static initializer futex: Replace fshared and clockrt with combined flags futex: Cleanup stale fshared flag interfaces commit 2af49b6058d857fa5b476db642d4452bf5833ecd Merge: b08b27213384d1bd6eda04a2b6f788b4cdee0f34 394f4528c523d88daabd50f883a8d6b164075555 Author: Linus Torvalds Date: Thu Jan 6 10:06:26 2011 -0800 Merge branch 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: rcu: remove unused __list_for_each_rcu() macro rculist: fix borked __list_for_each_rcu() macro rcu: reduce __call_rcu()-induced contention on rcu_node structures rcu: limit rcu_node leaf-level fanout rcu: fine-tune grace-period begin/end checks rcu: Keep gpnum and completed fields synchronized rcu: Stop chasing QS if another CPU did it for us rcu: increase synchronize_sched_expedited() batching rcu: Make synchronize_srcu_expedited() fast if running readers rcu: fix race condition in synchronize_sched_expedited() rcu: update documentation/comments for Lai's adoption patch rcu,cleanup: simplify the code when cpu is dying rcu,cleanup: move synchronize_sched_expedited() out of sched.c rcu: get rid of obsolete "classic" names in TREE_RCU tracing rcu: Distinguish between boosting and boosted rcu: document TINY_RCU and TINY_PREEMPT_RCU tracing. rcu: add tracing for TINY_RCU and TINY_PREEMPT_RCU rcu: priority boosting for TINY_PREEMPT_RCU rcu: move TINY_RCU from softirq to kthread rcu: add priority-inversion testing to rcutorture commit b08b27213384d1bd6eda04a2b6f788b4cdee0f34 Merge: 8484baaa5065b460e5eb18ee721d8417251f7897 846f40455276617275284a4b76b89311b4aed0b9 Author: Linus Torvalds Date: Thu Jan 6 10:01:23 2011 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw * git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw: GFS2: Don't flush delete workqueue when releasing the transaction lock GFS2: fsck.gfs2 reported statfs error after gfs2_grow GFS2: Merge glock state fields into a bitfield GFS2: Fix uninitialised error value in previous patch GFS2: fix recursive locking during rindex truncates GFS2: reread rindex when necessary to grow rindex GFS2: Remove duplicate #defines from glock.h GFS2: Clean up of gdlm_lock function GFS2: Allow gfs2 to update quota usage values through the quotactl interface GFS2: fs/gfs2/glock.h: Add __attribute__((format(printf,2,3)) to gfs2_print_dbg GFS2: fs/gfs2/glock.c: Use printf extension %pV GFS2: Clean up duplicated setattr code GFS2: Remove unreachable calls to vmtruncate GFS2: fs/gfs2/glock.c: Convert sprintf_symbol to %pS GFS2: Change two WQ_RESCUERs into WQ_MEM_RECLAIM commit 8484baaa5065b460e5eb18ee721d8417251f7897 Author: Randy Dunlap Date: Wed Jan 5 16:28:43 2011 -0800 kernel-doc: code reorganization Move 'main' code vs. subroutines around so that they are not so intermixed, for better readability/understanding (relative to Perl). It was messy to follow the primary flow of code execution with the code being mixed. Now the code begins with data initialization, followed by all subroutines, then ends with the main code execution. This is almost totally source code movement, with a few changes as needed for forward declarations. Signed-off-by: Randy Dunlap Signed-off-by: Linus Torvalds commit d5ba92b7958e3ff2f0878e45b9b42cb6976853dd Author: Nicolas Kaiser Date: Wed Jan 5 16:27:53 2011 -0800 Documentation: update kernel-docs.txt Fixed typos, and removed duplicated entries. Signed-off-by: Nicolas Kaiser Signed-off-by: Randy Dunlap Signed-off-by: Linus Torvalds commit a40649781b9c10e192fad9f00a60c6d946da553f Author: Michael Prokop Date: Wed Jan 5 16:27:15 2011 -0800 Documentation/dontdiff: add further autogenerated files to ignore list Mainly resulting from (but not limited to) autogenerated files of lib/raid6 and drivers/gpu/drm/radeon. List generated as result of a diff of a clean 2.6.36 tree against a built one. Signed-off-by: Michael Prokop Signed-off-by: Randy Dunlap Signed-off-by: Linus Torvalds commit e3c92215198cb6aa00ad38db2780faa6b72e0a3f Author: Mauro Carvalho Chehab Date: Thu Jan 6 08:16:04 2011 -0200 [media] radio-aimslab.c: Fix gcc 4.5+ bug gcc 4.5+ doesn't properly evaluate some inlined expressions. A previous patch were proposed by Andrew Morton using noinline. However, the entire inlined function is bogus, so let's just remove it and be happy. Reported-by: Andrew Morton Cc: stable@kernel.org Signed-off-by: Mauro Carvalho Chehab commit 1928e87bcf185f56008d0746f887b691c1cb8c4a Merge: ca9c20ce2b383032b71bdae9ec0b468d428ca8d4 3c0eee3fe6a3a1c745379547c7e7c904aa64f6d5 Author: Paul Mundt Date: Thu Jan 6 18:27:34 2011 +0900 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6 Conflicts: drivers/video/sh_mobile_lcdcfb.c Signed-off-by: Paul Mundt commit f862f904d357dc0d3612347a8dbabe6fae037fbb Merge: 6f09e41d704fe0bc9157a5357480751d39361d01 3c0eee3fe6a3a1c745379547c7e7c904aa64f6d5 Author: Paul Mundt Date: Thu Jan 6 18:24:07 2011 +0900 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6 into sh-latest Conflicts: arch/sh/kernel/cpu/sh2a/clock-sh7201.c Signed-off-by: Paul Mundt commit ca9c20ce2b383032b71bdae9ec0b468d428ca8d4 Merge: 17ca20cb7d04a259c9194879f77466bde606dda5 81f6f3c1047392a22b9a20bbecf98c7f2d6f922a Author: Paul Mundt Date: Thu Jan 6 18:10:09 2011 +0900 Merge branch 'fbdev/udlfb' commit 81f6f3c1047392a22b9a20bbecf98c7f2d6f922a Author: Paul Mundt Date: Thu Jan 6 18:07:54 2011 +0900 video: udlfb: Kill off special printk wrappers, use pr_fmt(). This kills off all of the dl_xxx() printk wrappers and simply stubs in a pr_fmt() definition to accomplish the same thing. Signed-off-by: Paul Mundt commit b9f03a3cd06c6f8bbecfe08eae2a69cc0a13c690 Author: Paul Mundt Date: Thu Jan 6 18:04:02 2011 +0900 video: udlfb: Kill off some magic constants for EDID sizing. The edid length is fixed, so use the standard definition consistently. Signed-off-by: Paul Mundt commit 1a3e528cfc00a9d08114c5fa9e486a77633a425d Author: Paul Mundt Date: Thu Jan 6 17:29:24 2011 +0900 video: udlfb: deifdefify (yes, that's a word). udlfb selects all of the options it presently ifdef conditionalizes, so none of the statements have any effect outside of aggravating eye strain. Signed-off-by: Paul Mundt commit 6f09e41d704fe0bc9157a5357480751d39361d01 Author: Magnus Damm Date: Thu Jan 6 05:33:15 2011 +0000 sh: include Migo-R TS driver in Migo-R defconfig This patch enables the Migo-R specific touch screen driver in the Migo-R defconfig. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 17ca20cb7d04a259c9194879f77466bde606dda5 Author: Mayuresh Janorkar Date: Thu Jan 6 16:02:42 2011 +0900 fbdev: modedb: Add a new mode for 864x480 TAAL panels. This adds a new entry to the modedb for 864x480 TAAL panels, the default configuration for many OMAP boards. This enables omapfb to make use of the standard mode parsing. Signed-off-by: Mayuresh Janorkar Signed-off-by: Paul Mundt commit 748103e7235892bf9a3ee568d7d4dd7e5a3beece Author: Stefani Seibold Date: Mon Jan 3 09:28:59 2011 +0000 drivers/video/i810/i810-i2c.c: fix i2c bus handling These patch fix a longstanding bug in the i810 frame buffer driver. The handling of the i2c bus is wrong: A 1 bit should not written to the i2c, these will be done by switch the i2c to input. Driving an 1 bit active is against the i2c spec. An active driven of a 1 bit will result in very strange error, depending which side is the more powerful one. In my case it depends on the temperature of the Display-Controller-EEprom: With an cold eprom a got the correct EDID datas, with a warm one some of the 1 bits was 0 :-( The same bug is also in the intelfb driver in the file drivers/video/intelfb/intelfb_i2c.c. The functions intelfb_gpio_setscl() and intelfb_gpio_setsda() do drive the 1 bit active to the i2c bus. But since i have no card which is used by the intelfb driver i cannot fix it. Signed-off-by: Stefani Seibold Cc: Paul Mundt Cc: Jean Delvare Signed-off-by: Andrew Morton Signed-off-by: Paul Mundt commit 529ed806d4540d23ca2f68b28c3715d1566fc3ac Author: Brent Cook Date: Fri Dec 31 05:56:50 2010 +0000 video: Fix the HGA framebuffer driver Resurrected some old hardware and fixed up the hgafb driver to work again. Only tested with fbcon, since most fbdev-based software appears to only support 12bpp and up. It does not appear that this driver has worked for at least the entire 2.6.x series, perhaps since 2002. Hercules graphics hardware uses packed pixels horizontally, but rows are not linear. In other words, the pixels are not packed vertically. This means that custom imageblit, fillrect and copyarea need to be written specific to the hardware. * Removed the experimental acceleration option, since it is required for the hardware to work. * Fixed imageblit to work with fb_image's wider than 8 pixels. * Updated configuration text (HGA hardware is from 1984) Signed-off-by: Brent Cook Signed-off-by: Paul Mundt commit e045da7d835a28950543f5f10f0cb1905ca9bbaf Author: Julia Lawall Date: Sun Jan 2 14:27:42 2011 +0000 drivers/video/carminefb.c: improve error handling This code had an error handling goto to the wrong place, a misplaced release_mem_region, and a duplicated release_mem_region. The semantic match that finds the double release_mem_region is as follows: (http://coccinelle.lip6.fr/) // @r@ expression e1,e2,e3; position p1,p2,p3; @@ release_mem_region@p1(e1, e2)@p3; ... when != request_mem_region(e1,e2,e3) release_mem_region(e1, e2)@p2; @@ expression e <= r.e1,e3; expression r.e1,e2; position r.p1,r.p2,r.p3,p!=r.p1; @@ *release_mem_region(e1, e2)@p3; ... when != e = e3 *release_mem_region@p(e1, e2)@p2;// Signed-off-by: Julia Lawall Signed-off-by: Paul Mundt commit 7ee04fd5d5ff74f81d8eee128bc9346ab87c56b8 Author: Fabio Estevam Date: Fri Dec 24 12:28:24 2010 +0000 video: imxfb: Fix the maximum value for yres MX27 and MX25 have 10 bits in the YMAX field of LCDC Size Register. Fix the maximum value for yres. Signed-off-by: Fabio Estevam Signed-off-by: Paul Mundt commit 417d48274e755e537bae60461558c1f63a4e14de Author: Magnus Damm Date: Wed Jan 5 10:21:00 2011 +0000 fbdev: sh_mobile_lcdcfb: Enable 32 bpp and 24 bpp support This patch extends the LCDC driver with 24 bpp and 32 bpp support. These modes have been kept disabled earlier due to dependencies between the potential two LCDC channels that are exported as two separate framebuffer devices. The dependency boils down to a byte swap register that is shared between multiple channels. With this patch applied all single channel LCDC hardware can chose freely from 16, 24 and 32 bpp. Dual channel LCDC must stick to the same setup for both channels. Without this patch only 16 bpp is fully supported. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 98d27b8abf413a310df6676f7d2128ada1cccc08 Author: Kuninori Morimoto Date: Thu Jan 6 02:44:15 2011 +0000 ARM: mach-shmobile: mackerel: Add HDMI sound support Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit 12c4309b78854ba117ea38a9178018591abd16ab Author: Kuninori Morimoto Date: Thu Jan 6 02:44:09 2011 +0000 ARM: mach-shmobile: mackerel: add HDMI video support Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit 73674648e9bf3b0a75000b7e97edaac255cd73f7 Author: Kuninori Morimoto Date: Thu Jan 6 02:43:00 2011 +0000 ARM: mach-shmobile: ap4evb: fixup clk_put timing of fsib_clk fsib_clk will be used when fdiv_clk failed on fsi_hdmi_set_rate. Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit b27dcfb0670ea7352a67137f4ff7947c2a9f6892 Author: Jeff Garzik Date: Wed Nov 17 22:56:48 2010 -0500 [libata] avoid needlessly passing around ptr to SCSI completion func It's stored in struct scsi_cmnd->scsi_done, making several 'done' parameters to functions redundant. Signed-off-by: Jeff Garzik commit 02cdfcf043c5c6ebcbbaba1c35130b5fbcb10867 Author: David Milburn Date: Fri Nov 12 15:38:21 2010 -0600 [libata] new driver acard_ahci, for ATP8620 host controller Add support for Acard ATP8620 host controller. Based upon initial version by Jeff Garzik. Signed-off-by: David Milburn Signed-off-by: Jeff Garzik commit 3610cda53f247e176bcbb7a7cca64bc53b12acdb Author: David S. Miller Date: Wed Jan 5 15:38:53 2011 -0800 af_unix: Avoid socket->sk NULL OOPS in stream connect security hooks. unix_release() can asynchornously set socket->sk to NULL, and it does so without holding the unix_state_lock() on "other" during stream connects. However, the reverse mapping, sk->sk_socket, is only transitioned to NULL under the unix_state_lock(). Therefore make the security hooks follow the reverse mapping instead of the forward mapping. Reported-by: Jeremy Fitzhardinge Reported-by: Linus Torvalds Signed-off-by: David S. Miller commit a3c888fcda911fcb6e3c071aecf49ccb6effe79d Author: Andrew Morton Date: Wed Jan 5 23:49:53 2011 +0100 gen_init_cpio: checkpatch fixes Cc: Jesper Juhl Cc: Michal Marek Signed-off-by: Andrew Morton Signed-off-by: Michal Marek commit 44b8288308ac9da27eab7d7bdbf1375a568805c3 Author: Eric Dumazet Date: Wed Jan 5 10:35:02 2011 +0000 net_sched: pfifo_head_drop problem commit 57dbb2d83d100ea (sched: add head drop fifo queue) introduced pfifo_head_drop, and broke the invariant that sch->bstats.bytes and sch->bstats.packets are COUNTER (increasing counters only) This can break estimators because est_timer() handles unsigned deltas only. A decreasing counter can then give a huge unsigned delta. My mid term suggestion would be to change things so that sch->bstats.bytes and sch->bstats.packets are incremented in dequeue() only, not at enqueue() time. We also could add drop_bytes/drop_packets and provide estimations of drop rates. It would be more sensible anyway for very low speeds, and big bursts. Right now, if we drop packets, they still are accounted in byte/packets abolute counters and rate estimators. Before this mid term change, this patch makes pfifo_head_drop behavior similar to other qdiscs in case of drops : Dont decrement sch->bstats.bytes and sch->bstats.packets Signed-off-by: Eric Dumazet Acked-by: Hagen Paul Pfeifer Signed-off-by: David S. Miller commit 06778b1c383afbdb88ffd837e117bec06a76f450 Author: Johannes Berg Date: Wed Dec 22 10:15:52 2010 +0100 mac80211: remove stray extern Somehow this snuck into my earlier patch, and only now did I see a compiler warning: net/mac80211/led.c:218:13: warning: function '__ieee80211_create_tpt_led_trigger' with external linkage has definition Remove the stray extern. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 90fc4b3a5ba24f09af2a8c4a723651a328949460 Author: Johannes Berg Date: Sat Dec 18 17:20:48 2010 +0100 mac80211: implement off-channel TX using hw r-o-c offload When the driver has remain-on-channel offload, implement off-channel transmission using that primitive. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 21f83589644bb2ed98079bf1e2154c8e70ca6a6c Author: Johannes Berg Date: Sat Dec 18 17:20:47 2010 +0100 mac80211: implement hardware offload for remain-on-channel This allows drivers to support remain-on-channel offload if they implement smarter timing or need to use a device implementation like iwlwifi. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit c96e96354a6c9456cdf1f150eca504e2ea35301e Merge: dbbe68bb12b34f3e450da7a73c20e6fa1f85d63a 33af88138b859f515b365a074e0a014d7cdbf846 Author: John W. Linville Date: Wed Jan 5 16:06:25 2011 -0500 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem Conflicts: net/bluetooth/Makefile commit 4b95f135f606c87e4056b6d7fd3c5781c818858b Author: Jean Pihet Date: Wed Jan 5 19:49:02 2011 +0100 tools, perf: Documentation for the power events API Provides documentation for the following: - the new power trace API, - the old (legacy) power trace API, - the DEPRECATED Kconfig option usage. Signed-off-by: Jean Pihet Cc: Arjan van de Ven Cc: trenn@suse.de Cc: Len Brown Cc: Pavel Machek Cc: Rafael J. Wysocki Cc: Steven Rostedt Cc: Arnaldo Carvalho de Melo Cc: linux-pm@lists.linux-foundation.org LKML-Reference: <1294253342-29056-3-git-send-email-j-pihet@ti.com> Signed-off-by: Ingo Molnar commit 938cfed18bec2c7361f37efc954712a7cc42c353 Author: Jean Pihet Date: Wed Jan 5 19:49:01 2011 +0100 perf: Add calls to suspend trace point Uses the machine_suspend trace point, called from the generic kernel suspend_devices_and_enter function. Signed-off-by: Jean Pihet Acked-by: Rafael J. Wysocki Cc: Arjan van de Ven CC: Thomas Renninger Cc: Len Brown Cc: Pavel Machek Cc: Steven Rostedt Cc: Arnaldo Carvalho de Melo Cc: Peter Zijlstra Cc: linux-pm@lists.linux-foundation.org LKML-Reference: <1294253342-29056-2-git-send-email-j-pihet@ti.com> Signed-off-by: Ingo Molnar commit 0eefed84fe9e1eb90f4b089ead95904306b23233 Author: Geert Uytterhoeven Date: Sun Oct 31 21:23:55 2010 +0100 m68k/sun3: Kill pte_unmap() warnings Since commit 31c911329e048b715a1dfeaaf617be9430fd7f4e ("mm: check the argument of kunmap on architectures without highmem"), we get lots of warnings like arch/m68k/kernel/sys_m68k.c:508: warning: passing argument 1 of ‘kunmap’ from incompatible pointer type As m68k doesn't support highmem anyway, open code the calls to kmap() and kunmap() (the latter is a no-op) to kill the warnings, like is done on most other architectures without CONFIG_HIGHPTE. Signed-off-by: Geert Uytterhoeven Cc: Sam Creasey commit 33af88138b859f515b365a074e0a014d7cdbf846 Author: John W. Linville Date: Wed Jan 5 14:05:00 2011 -0500 ath9k: correct MODULE_PARM_DESC parameters for force_new_ani Signed-off-by: John W. Linville commit 18cb6e32e7aeea9c92af5793bee2b32536615502 Author: John W. Linville Date: Wed Jan 5 09:39:59 2011 -0500 ath5k: qualify global modparam_nohwcrypt variable Signed-off-by: John W. Linville commit 3e6109c57468ed320beefd2861fe2cc418cccfc2 Author: John W. Linville Date: Wed Jan 5 09:39:17 2011 -0500 ath9k: qualify global modparam_nohwcrypt variable Signed-off-by: John W. Linville commit 6303710d7aa62bfb154cd13ab5ab12cfa8baaf91 Merge: db98a6cfcc9ac951067c9a2cb60459b618fd7b10 d2460f4b2fa6dbdeec800414f9cf5b1fc8b71197 Author: John W. Linville Date: Wed Jan 5 14:35:41 2011 -0500 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 commit 58daf18cdcab550262a5f4681e1f1e073e21965a Merge: aa312be1987d43216e72ffce42bccf6bf81f62ed 0af85dda39d9b673aca8c0ebae004ea70f3efc93 Author: Russell King Date: Wed Jan 5 18:09:03 2011 +0000 Merge branch 'clksrc' into devel Conflicts: arch/arm/mach-vexpress/v2m.c arch/arm/plat-omap/counter_32k.c arch/arm/plat-versatile/Makefile commit aa312be1987d43216e72ffce42bccf6bf81f62ed Merge: 31edf274f9aff1ccd39934a0b2fce38f4405c656 8c11a94d86eb5489dc665bc566bf624e329d89fa 38d624361b2a82d6317c379aebf81b1b28210bb0 Author: Russell King Date: Wed Jan 5 18:08:31 2011 +0000 Merge branches 'mmci' and 'pl011-dma' into devel commit 31edf274f9aff1ccd39934a0b2fce38f4405c656 Merge: 3c0eee3fe6a3a1c745379547c7e7c904aa64f6d5 ed60453fa8f8fc3d034dfdf10371a99cc6905626 ac61d143ffe2a6db4d4bcf47c21a5159d6a1b644 28257f7fdee0facc3b7f934e82c2485f27120d41 b23065313297e750edd57ab6edfd36224826724e 50005a8deb38e5e6456ebd94e57adb321d4589de cf562b4a550b3cd9d602a05bc27aaaaa376947b4 3d09fbcd26851ffb2c40cec411b8e56db02520d1 8a9618f5dfca35edb0d7ab6374ff586e2e9e989b Author: Russell King Date: Wed Jan 5 18:08:10 2011 +0000 Merge branches 'ftrace', 'gic', 'io', 'kexec', 'mod', 'sa11x0', 'sh' and 'versatile' into devel commit 38d624361b2a82d6317c379aebf81b1b28210bb0 Author: Russell King Date: Wed Dec 22 17:59:16 2010 +0000 ARM: PL011: add DMA burst threshold support for ST variants ST Micro variants has some specific dma burst threshold compensation, which allows them to make better use of a DMA controller. Add support to set this up. Based on a patch from Linus Walleij. Acked-by: Linus Walleij Signed-off-by: Russell King commit 68b65f7305e54b822b2483c60de7d7b017526a92 Author: Russell King Date: Wed Dec 22 17:24:39 2010 +0000 ARM: PL011: Add support for transmit DMA Add DMA engine support for transmit to the PL011 driver. Based on a patch from Linus Walliej, with the following changes: - remove RX DMA support. As PL011 doesn't give us receive timeout interrupts, we only get notified of received data when the RX DMA has completed. This rather sucks for interactive use of the TTY. - remove abuse of completions. Completions are supposed to be for events, not to tell what condition buffers are in. Replace it with a simple 'queued' bool. - fix locking - it is only safe to access the circular buffer with the port lock held. - only map the DMA buffer when required - if we're ever behind an IOMMU this helps keep IOMMU usage down, and also ensures that we're legal when we change the scatterlist entry length. - fix XON/XOFF sending - we must send XON/XOFF characters out as soon as possible - waiting for up to 4095 characters in the DMA buffer to be sent first is not acceptable. - fix XON/XOFF receive handling - we need to stop DMA when instructed to by the TTY layer, and restart it again when instructed to. There is a subtle problem here: we must not completely empty the circular buffer with DMA, otherwise we will not be notified of XON. - change the 'enable_dma' flag into a 'using DMA' flag, and track whether we can use TX DMA by whether the channel pointer is non-NULL. This gives us more control over whether we use DMA in the driver. - we don't need to have the TX DMA buffer continually allocated for each port - instead, allocate it when the port starts up, and free it when it's shut down. Update the 'using DMA' flag if we get the buffer, and adjust the TTY FIFO size appropriately. - if we're going to use PIO to send characters, use the existing IRQ based functionality rather than reimplementing it. This also ensures we call uart_write_wakeup() at the appropriate time, otherwise we'll stall. - use DMA engine helper functions for type safety. - fix init when built as a module - we can't have to initcall functions, so we must settle on one. This means we can eliminate the deferred DMA initialization. - there is no need to terminate transfers on a failed prep_slave_sg() call - nothing has been setup, so nothing needs to be terminated. This avoids a potential deadlock in the DMA engine code (tasklet->callback->failed prepare->terminate->tasklet_disable which then ends up waiting for the tasklet to finish running.) - Dan says that the submission callback should not return an error: | dma_submit_error() is something I should have removed after commit | a0587bcf "ioat1: move descriptor allocation from submit to prep" all | errors should be notified by prep failing to return a descriptor | handle. Negative dma_cookie_t values are only returned by the | dma_async_memcpy* calls which translate a prep failure into -ENOMEM. So remove the error handling at that point. This also solves the potential deadlock mentioned in the previous comment. Acked-by: Linus Walleij Signed-off-by: Russell King commit 963cc981af620c7c07b5f6d1ab998b639e90ecb1 Author: Russell King Date: Wed Dec 22 17:16:09 2010 +0000 ARM: PL011: Ensure IRQs are disabled in UART interrupt handler As the DMA support introduces a separate interrupt-time callback, our interrupt handler will not be the only handler which takes the port lock, so we need to ensure that IRQs are disabled. We must use the _irqsave variant so we don't inadvertently enable interrupts. Acked-by: Linus Walleij Signed-off-by: Russell King commit ffca2b114c6a804d1307781df687e877a373a1c2 Author: Russell King Date: Wed Dec 22 17:13:05 2010 +0000 ARM: PL011: Separate hardware FIFO size from TTY FIFO size With DMA support, we need to tell the TTY subsystem that the DMA buffer is the size of the FIFO, otherwise things like tty_wait_until_sent() will time out too early. Keep (and use) the hardware value separately from the port->fifosize. This was part of a larger patch from Linus Walleij, with a little modification. Acked-by: Linus Walleij Signed-off-by: Russell King commit c19f12b5ef3adf3c139eabbe3d3d0201838b77b1 Author: Russell King Date: Wed Dec 22 17:48:26 2010 +0000 ARM: PL011: Allow better handling of vendor data Rather than copying all vendor data into the port structure, copy just that which is frequently used, and keep a pointer to the remaining vendor data structure. This makes it easier to add vendor quirks in the future. Acked-by: Linus Walleij Signed-off-by: Russell King commit 5063e2c567ee569cccfc01ebf80c898cb4e6833a Author: Russell King Date: Wed Dec 22 17:09:08 2010 +0000 ARM: PL011: Ensure error flags are clear at startup The error flags weren't being cleared upon UART startup, which can cause problems when we add DMA support. It's good practice to ensure that these flags are cleared anyway, so let's do so. This was part of a larger patch from Linus Walleij. Acked-by: Linus Walleij Signed-off-by: Russell King commit e8a7ba86ff993311f8712e5b3bb2e3892e82df5f Author: Russell King Date: Tue Dec 28 09:16:54 2010 +0000 ARM: PL011: include revision number in boot-time port printk Include the revision number of the PL011 primecell in the boot-time port printk to allow proper identification of the peripheral. Acked-by: Linus Walleij Signed-off-by: Russell King commit eccdfe2d245a882feacc4630c9bc29805e9929c8 Author: Arnaldo Carvalho de Melo Date: Tue Jan 4 16:32:52 2011 -0200 perf script: Make some lists static Not accessed outside builtin-script, so make them static. Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 6d8afb56300c53a250c6de0f973ef502e54aabf3 Author: Arnaldo Carvalho de Melo Date: Tue Jan 4 16:27:30 2011 -0200 perf script: Use the default lost event handler That already does what was being done here. The warning is now unconditionally given by __perf_session__process_pipe_events, just like for non pipe processing. Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 1109599458c06256064213dc44ca5f5fa8ee3833 Author: Arnaldo Carvalho de Melo Date: Tue Jan 4 16:25:15 2011 -0200 perf session: Warn about errors when processing pipe events too Just like we do at __perf_session__process_events Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit d030260ad33b482a371f999c7e9db79ef7a2111f Author: Stephane Eranian Date: Tue Jan 4 16:30:01 2011 +0200 perf tools: Fix perf_event.h header usage This patch fixes the usage of the perf_event.h header file between command modules and the supporting code in util. It is necessary to ensure that ALL files use the SAME perf_event.h header from the kernel source tree. There were a couple of #include mixed with #include "../../perf_event.h". This caused issues on some distros because of mismatch in the layout of struct perf_event_attr. That eventually led perf stat to segfault. Cc: David S. Miller Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Robert Richter Cc: Stephane Eranian LKML-Reference: <4d233cf0.2308e30a.7b00.ffffc187@mx.google.com> Signed-off-by: Stephane Eranian Signed-off-by: Arnaldo Carvalho de Melo commit 454a3bbe9b75eb8cbddffcf383fbb8e97ea78f52 Author: Arnaldo Carvalho de Melo Date: Tue Jan 4 10:40:08 2011 -0200 perf test: Clarify some error reports in the open syscall test Rebooted my devel machine, first thing I ran was perf test, that expects debugfs to be mounted, test fails. Be more clear about it. Also add missing newlines and add more informative message when sys_perf_event_open fails. Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit a7862aa90ffd1113bc2898ae6be2e4861b1f76cc Author: Mauro Carvalho Chehab Date: Wed Jan 5 12:31:15 2011 -0300 [media] cx25821: Fix compilation breakage due to BKL dependency drivers/staging/cx25821/cx25821-video.c: In function ‘video_open’: drivers/staging/cx25821/cx25821-video.c:817:8: error: implicit declaration of function ‘lock_kernel’ drivers/staging/cx25821/cx25821-video.c:834:9: error: implicit declaration of function ‘unlock_kernel’ This patch just adds a header with BKL function. It should be enough to avoid compilation breakage, but, as BKL will be removed, we need to properly fix it on a latter patch. Reported-by: Randy Dunlap Reported-by: Anca Emanuel Cc: Palash Bandyopadhyay Signed-off-by: Mauro Carvalho Chehab commit 74d91e3c6a66359bb754fb5d8a5b54fb6ba2f9a6 Author: Huang Ying Date: Tue Jan 4 22:38:09 2011 -0500 x86, NMI: Add touch_nmi_watchdog to io_check_error delay Prevent the long delay in io_check_error making NMI watchdog timeout. Signed-off-by: Huang Ying Signed-off-by: Don Zickus LKML-Reference: <1294198689-15447-3-git-send-email-dzickus@redhat.com> Signed-off-by: Ingo Molnar commit 554ec063982752e9a569ab9189eeffa3d96731b2 Author: Dongdong Deng Date: Tue Jan 4 22:38:08 2011 -0500 x86: Avoid calling arch_trigger_all_cpu_backtrace() at the same time The spin_lock_debug/rcu_cpu_stall detector uses trigger_all_cpu_backtrace() to dump cpu backtrace. Therefore it is possible that trigger_all_cpu_backtrace() could be called at the same time on different CPUs, which triggers and 'unknown reason NMI' warning. The following case illustrates the problem: CPU1 CPU2 ... CPU N trigger_all_cpu_backtrace() set "backtrace_mask" to cpu mask | generate NMI interrupts generate NMI interrupts ... \ | / \ | / The "backtrace_mask" will be cleaned by the first NMI interrupt at nmi_watchdog_tick(), then the following NMI interrupts generated by other cpus's arch_trigger_all_cpu_backtrace() will be taken as unknown reason NMI interrupts. This patch uses a test_and_set to avoid the problem, and stop the arch_trigger_all_cpu_backtrace() from calling to avoid dumping a double cpu backtrace info when there is already a trigger_all_cpu_backtrace() in progress. Signed-off-by: Dongdong Deng Reviewed-by: Bruce Ashfield Cc: fweisbec@gmail.com LKML-Reference: <1294198689-15447-2-git-send-email-dzickus@redhat.com> Signed-off-by: Ingo Molnar Signed-off-by: Don Zickus commit 9ab181fa9ff73a38fccd0a4f1c40a38dfe62b535 Author: Don Zickus Date: Tue Jan 4 22:38:07 2011 -0500 x86: Only call smp_processor_id in non-preempt cases There are some paths that walk the die_chain with preemption on. Make sure we are in an NMI call before we start doing anything. This was triggered by do_general_protection calling notify_die with DIE_GPF. Reported-by: Jan Kiszka Signed-off-by: Don Zickus LKML-Reference: <1294198689-15447-1-git-send-email-dzickus@redhat.com> Signed-off-by: Ingo Molnar commit aef1b9cef78ae65c6501850851cc3f61f9be477b Merge: 20c457b8587bee4644d998331d9e13be82e05b4c 3c0eee3fe6a3a1c745379547c7e7c904aa64f6d5 Author: Ingo Molnar Date: Wed Jan 5 14:22:08 2011 +0100 Merge commit 'v2.6.37' into perf/core Merge reason: Add the final .37 tree. Signed-off-by: Ingo Molnar commit 6bf4123760a5aece6e4829ce90b70b6ffd751d65 Author: NeilBrown Date: Wed Jan 5 12:50:16 2011 +1100 sched: Change wait_for_completion_*_timeout() to return a signed long wait_for_completion_*_timeout() can return: 0: if the wait timed out -ve: if the wait was interrupted +ve: if the completion was completed. As they currently return an 'unsigned long', the last two cases are not easily distinguished which can easily result in buggy code, as is the case for the recently added wait_for_completion_interruptible_timeout() call in net/sunrpc/cache.c So change them both to return 'long'. As MAX_SCHEDULE_TIMEOUT is LONG_MAX, a large +ve return value should never overflow. Signed-off-by: NeilBrown Cc: Peter Zijlstra Cc: J. Bruce Fields Cc: Andrew Morton Cc: Linus Torvalds LKML-Reference: <20110105125016.64ccab0e@notabene.brown> Signed-off-by: Ingo Molnar commit 27066fd484a32c80630136aa2b91c980f3198f9d Merge: 101e5f77bf35679809586e250b6c62193d2ed179 3c0eee3fe6a3a1c745379547c7e7c904aa64f6d5 Author: Ingo Molnar Date: Wed Jan 5 14:14:42 2011 +0100 Merge commit 'v2.6.37' into sched/core Merge reason: Merge the final .37 tree. Signed-off-by: Ingo Molnar commit cb2ded37fd2e1039f96c8c892da024a8f033add5 Author: Yinghai Lu Date: Tue Jan 4 16:38:52 2011 -0800 x86: Fix APIC ID sizing bug on larger systems, clean up MAX_APICS confusion Found one x2apic pre-enabled system, x2apic_mode suddenly get corrupted after register some cpus, when compiled CONFIG_NR_CPUS=255 instead of 512. It turns out that generic_processor_info() ==> phyid_set(apicid, phys_cpu_present_map) causes the problem. phys_cpu_present_map is sized by MAX_APICS bits, and pre-enabled system some cpus have an apic id > 255. The variable after phys_cpu_present_map may get corrupted silently: ffffffff828e8420 B phys_cpu_present_map ffffffff828e8440 B apic_verbosity ffffffff828e8444 B local_apic_timer_c2_ok ffffffff828e8448 B disable_apic ffffffff828e844c B x2apic_mode ffffffff828e8450 B x2apic_disabled ffffffff828e8454 B num_processors ... Actually phys_cpu_present_map is referenced via apic id, instead index. We should use MAX_LOCAL_APIC instead MAX_APICS. For 64-bit it will be 32768 in all cases. BSS will increase by 4k bytes on 64-bit: text data bss dec filename 21696943 4193748 12787712 38678403 vmlinux.before 21696943 4193748 12791808 38682499 vmlinux.after No change on 32bit. Finally we can remove MAX_APCIS that was rather confusing. Signed-off-by: Yinghai Lu Cc: H. Peter Anvin Cc: "Eric W. Biederman" LKML-Reference: <4D23BD9C.3070102@kernel.org> Signed-off-by: Ingo Molnar commit 8e1023016cf17152972b98bce6c144834a4916d5 Author: Heiko Carstens Date: Wed Jan 5 12:48:18 2011 +0100 [S390] prevent unneccesary loops_per_jiffy recalculation When the seqfile /proc/cpuinfo gets accesses for each possible cpu loops_per_jiffy gets recalculated. However its value is only needed on first access. In addition loops_per_jiffy should be recalculated when the machine reports a capability change. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 19726cec63aeadad127f9e72ee69240336e37f15 Author: Heiko Carstens Date: Wed Jan 5 12:48:17 2011 +0100 [S390] cpuinfo: use get_online_cpus() instead of preempt_disable() Use get_online_cpus() instead of preempt_disable() to make sure cpus don't go offline while accessing their per cpu data. The preempt_disable() stuff is old code which was used before get_online_cpus() was available. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 974de4d7e70a6d759457722a6f322cc86b480eea Author: Heiko Carstens Date: Wed Jan 5 12:48:16 2011 +0100 [S390] smp: remove cpu hotplug messages Get rid of messages that indicate if a cpu went online or offline. There is nothing special about this anymore and these messages might flood the kernel log buffer which makes debugging harder since more important messages might be overwritten. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit fa188ae1657d6edc7963d524ce9a0650fe725242 Author: Gerald Schaefer Date: Wed Jan 5 12:48:15 2011 +0100 [S390] mutex: enable spinning mutex on s390 This enables the spinning mutex feature on s390 by removing HAVE_DEFAULT_NO_SPIN_MUTEXES from arch/s390/Kconfig. Signed-off-by: Gerald Schaefer Signed-off-by: Martin Schwidefsky commit 34b133f8e94e39ff3cf4d1c1f67f2e07cdc3d54e Author: Gerald Schaefer Date: Wed Jan 5 12:48:14 2011 +0100 [S390] mutex: Introduce arch_mutex_cpu_relax() The spinning mutex implementation uses cpu_relax() in busy loops as a compiler barrier. Depending on the architecture, cpu_relax() may do more than needed in this specific mutex spin loops. On System z we also give up the time slice of the virtual cpu in cpu_relax(), which prevents effective spinning on the mutex. This patch replaces cpu_relax() in the spinning mutex code with arch_mutex_cpu_relax(), which can be defined by each architecture that selects HAVE_ARCH_MUTEX_CPU_RELAX. The default is still cpu_relax(), so this patch should not affect other architectures than System z for now. Signed-off-by: Gerald Schaefer Signed-off-by: Peter Zijlstra LKML-Reference: <1290437256.7455.4.camel@thinkpad> Signed-off-by: Ingo Molnar commit c03017544e3b2e60aa3c8ae451fac01595f1bf11 Author: Peter Oberparleiter Date: Wed Jan 5 12:48:13 2011 +0100 [S390] cio: fix ccwgroup unregistration race condition A race condition exists in the ccwgroup device unregistration code which can cause a kernel panic due to a use-after-free bug. This race condition might be triggered when all ccw devices associated with a ccwgroup device are removed at the same time (e.g. because the corresponding channel path becomes no longer available). Fix this race condition by clearing the references from the associated ccw devices to the ccw group device during unregistration of the ccw group device. Signed-off-by: Peter Oberparleiter Signed-off-by: Martin Schwidefsky commit f602be639e97024a77062368e123008c94b3109a Author: Heiko Carstens Date: Wed Jan 5 12:48:12 2011 +0100 [S390] perf: add DWARF register lookup for s390 Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 4cc9bed034d1ae588e5b773ee0edeb74ef3c0ff4 Author: Martin Schwidefsky Date: Wed Jan 5 12:48:11 2011 +0100 [S390] cleanup ftrace backend functions Signed-off-by: Martin Schwidefsky commit 5e9a26928f550157563cfc06ce12c4ae121a02ec Author: Martin Schwidefsky Date: Wed Jan 5 12:48:10 2011 +0100 [S390] ptrace cleanup Overhaul program event recording and the code dealing with the ptrace user space interface. Signed-off-by: Martin Schwidefsky commit da7f51c11d5fedca9ba779ee220063ccb4f0a27e Author: Heiko Carstens Date: Wed Jan 5 12:48:09 2011 +0100 [S390] smp/idle: call init_idle() before starting a new cpu Call init_idle() which (re-)initializes the idle task structure before it gets used on a new cpu. That way we can also get rid of the odd preempt_enable_no_resched() call we have in the cpu offline path within cpu_idle(). That call prevented preempt count imbalances between cpu hotplug operations. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit f230886b0b0f0ce604395481bea05f3c0ad8fc9e Author: Heiko Carstens Date: Wed Jan 5 12:48:08 2011 +0100 [S390] smp: delay idle task creation Delay idle task creation until a cpu gets set online instead of creating them for all possible cpus at system startup. For one cpu system this should safe more than 1 MB. On my debug system with lots of debug stuff enabled this saves 2 MB. Same as on x86. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 09a8e7adcf960bd6a7204f3f3b377a89ce22efbf Author: Stefan Haberland Date: Wed Jan 5 12:48:07 2011 +0100 [S390] dasd: Correct retry counter for terminated I/O. In case the DASD driver needs to term a running I/O the retry counter is decreased twice. Remove the unnecessary retry counter decrease in das_term_IO. Signed-off-by: Stefan Haberland Signed-off-by: Martin Schwidefsky commit e4dbb0f2b5dd6a836d0e5c60aa5f573e0bbcf76a Author: Stefan Haberland Date: Wed Jan 5 12:48:06 2011 +0100 [S390] dasd: Add support for raw ECKD access. Normal I/O operations through the DASD device driver give only access to the data fields of an ECKD device even for track based I/O. This patch extends the DASD device driver to give access to whole ECKD tracks including count, key and data fields. Signed-off-by: Stefan Haberland Signed-off-by: Martin Schwidefsky commit 6f272b9cec285a9610a2acf101f694bc58bed37e Author: Stefan Haberland Date: Wed Jan 5 12:48:05 2011 +0100 [S390] dasd: Prevent deadlock during suspend/resume. The freeze callback may set a stop bit so that a worker thread could not start I/O. The discipline specific freeze function waits for the worker to be completed. Set the stop_bit after the discipline specific freeze function has returned and no worker is running. Signed-off-by: Stefan Haberland Signed-off-by: Martin Schwidefsky commit 5a27e60dec59a95bd7f8ae9a19ae2ede4f76395b Author: Stefan Weinhuber Date: Wed Jan 5 12:48:04 2011 +0100 [S390] dasd: Improve handling of stolen DASD reservation If a DASD device has been reserved by a Linux system, and later this reservation is ‘stolen’ by a second system by means of an unconditional reserve, then the first system receives a notification about this fact. With this patch such an event can be either ignored, as before, or it can be used to let the device fail all I/O request, so that the device will not block anymore. Signed-off-by: Stefan Weinhuber Signed-off-by: Martin Schwidefsky commit a4d26c6aeceea330ee5e0fb6b017d57e3b252d29 Author: Stefan Weinhuber Date: Wed Jan 5 12:48:03 2011 +0100 [S390] dasd: do path verification for paths added at runtime When a new path is added at runtime, the CIO layer will call the drivers path_event callback. The DASD device driver uses this callback to trigger a path verification for the new path. The driver will use only those paths for I/O, which have been successfully verified. Signed-off-by: Stefan Weinhuber Signed-off-by: Martin Schwidefsky commit ef19298b406f93af4bb249f0776deb8366e97532 Author: Stefan Weinhuber Date: Wed Jan 5 12:48:02 2011 +0100 [S390] dasd: add High Performance FICON multitrack support Some storage systems support multitrack High Performance FICON requests, which read or write data to more than one track. This patch enables the DASD device driver to generate multitrack High Performance FICON requests. Signed-off-by: Stefan Weinhuber Signed-off-by: Martin Schwidefsky commit 9062014cb60194630272709da82d5879d563865e Author: Stefan Weinhuber Date: Wed Jan 5 12:48:01 2011 +0100 [S390] cio: reduce memory consumption of itcw structures Any list of indirect data adresses (TIDAL) used by a TCW must not cross a page boundary. The original itcw implementation complies with this restriction by allocating allmost twice as much memory as actually needed, so that in any case there is enough room for the full TIDAL, either above or below the page boundary. This patch implements an alternative method, by using a TTIC TIDAW to connect TIDAL parts below and above a page boundary. Signed-off-by: Stefan Weinhuber Signed-off-by: Martin Schwidefsky commit f3e1a273594c7d82b07102bd03e8adfe681f2864 Author: Heiko Carstens Date: Wed Jan 5 12:48:00 2011 +0100 [S390] nmi: enable machine checks early Until now machine checks for the swapper process of the IPL cpu are just implicitly (and more or less accidently) enabled when the first time the idle process goes into idle state and loads an enabled wait psw. Before that machine checks are disabled. So let's enable them explicitly in trap_init() so we have a well defined time when machine checks are enabled. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit aa3a41d009d433dd9775b356b2d70551816f1f3c Author: Jan Glauber Date: Wed Jan 5 12:47:59 2011 +0100 [S390] qeth: buffer count imbalance The used buffers counter is not incremented in case of an error so the counter can become negative. Increment the used buffers counter before checking for errors. Signed-off-by: Jan Glauber Signed-off-by: Martin Schwidefsky commit 4bc4e965d3e86897e4c7c487a477ccdf13db5b82 Author: Sebastian Ott Date: Wed Jan 5 12:47:58 2011 +0100 [S390] css: update subchannel descriptor Update the subchannel descriptor if we receive a "Installed parameters modified" crw. Signed-off-by: Sebastian Ott Signed-off-by: Martin Schwidefsky commit 1de3447a41ea72972966b4896a9f8d2b064bd23f Author: Martin Schwidefsky Date: Wed Jan 5 12:47:57 2011 +0100 [S390] 31 bit entry.S update. Make the code in the 31 bit entry.S code as similar as possible to the 64 bit version in entry64.S. That makes it easier to add new code to the first level interrupt handler that affects both 31 and 64 bit kernels. Signed-off-by: Martin Schwidefsky commit ce322ccd53f2505cf8b0ed204631d6ac054ac66a Author: Sebastian Ott Date: Wed Jan 5 12:47:56 2011 +0100 [S390] cio: obtain mdc value per channel path Add support to accumulate the number of 64K-bytes blocks all paths to a device at least support for a transport command. Signed-off-by: Sebastian Ott Signed-off-by: Martin Schwidefsky commit 37e8952174c6c239d1c86125e032fd6ad107a3e6 Author: Heiko Carstens Date: Wed Jan 5 12:47:55 2011 +0100 [S390] nohz: optimize arch_needs_cpu() arch_needs_cpu() gets always executed on the current cpu. Therefore the cpu parameter can be ignored it is possible to use __get_cpu_var() instead of per_cpu() to access the per_cpu variable, which will generate better code. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 90adac58d1a4daf3560739ff5b76497d5ece16c4 Author: Jan Glauber Date: Wed Jan 5 12:47:54 2011 +0100 [S390] qdio: cleanup SIGA sync Simplify the SIGA sync code and add unlikely annotations. In polling mode SBALs may be accessed without interrupt, so call SIGA sync before every scan. Signed-off-by: Jan Glauber Signed-off-by: Martin Schwidefsky commit 110da31709023de61735f2d8a3e52c20c23bb570 Author: Jan Glauber Date: Wed Jan 5 12:47:53 2011 +0100 [S390] qdio: remove enhanced SIGA HiperSocket devices only use one SBAL per qdio call without the enhanced SIGA feature. Since that feature is currently not used remove it from the qdio code so the compiler can generate better code for the HiperSocket outbound path. While at it mark the SIGA error conditions as unlikely. Signed-off-by: Jan Glauber Signed-off-by: Martin Schwidefsky commit 958c0ba403cb6a693b54be2389f9ef53377fa259 Author: Jan Glauber Date: Wed Jan 5 12:47:52 2011 +0100 [S390] qdio: use proper QEBSM operand for SIGA-R and SIGA-S If QIOASSIST is enabled for a qdio device the SIGA instruction requires a modified function code. This function code modifier was missing for SIGA-R and SIGA-S which can lead to a kernel panic caused by an operand exception. Cc: stable@kernel.org Signed-off-by: Jan Glauber Signed-off-by: Martin Schwidefsky commit 0195843bfda90a215f3b72c9aac2fd0bc9244b67 Author: Jan Glauber Date: Wed Jan 5 12:47:51 2011 +0100 [S390] qdio: outbound queue full counter Add a counter for outbound queue full events to the qdio statistics. Signed-off-by: Jan Glauber Signed-off-by: Martin Schwidefsky commit 3d6c76ff32bb9b2ebf6e859855d315eb42e3df50 Author: Jan Glauber Date: Wed Jan 5 12:47:50 2011 +0100 [S390] qdio: outbound tasklet scan threshold Introduce a scan treshold for the qdio outbound queues. By setting the threshold the driver can tell qdio after how much used SBALs qdio should schedule the outbound tasklet that scans the queue for finished SBALs. The threshold is specific by the drivers because a Hipersockets device is much faster in utilizing outbound buffers than a ZFCP or OSA device. The default values after how many used SBALs the tasklet should run are: OSA: > 31 SBALs Hipersockets: > 7 SBALs zfcp: > 55 SBALs Signed-off-by: Jan Glauber Signed-off-by: Martin Schwidefsky commit 4f325184f2d4c1f2258873b2a333005dc4dfcbc0 Author: Jan Glauber Date: Wed Jan 5 12:47:49 2011 +0100 [S390] qdio: prevent race for shared indicators If the shared indicator is used the following race leads to an inbound stall: Device CPU0 CPU1 ======================================================== non-shared DSCI =>1 ALSI => 1 Thin INT ALSI => 0 non-shared DSCI tasklets scheduled shared DSCI => 1 ALSI => 1 shared DSCI => 0 ALSI ? -> set Thin INT ALSI => 0 ALSI was set, shared DSCI => 1 After that no more interrupts occur because the DSCI is still set. Fix that race by only resetting the shared DSCI if it was actually set so the tasklets for all shared devices are scheduled and will run after the interrupt. Signed-off-by: Jan Glauber Signed-off-by: Martin Schwidefsky commit 078f8ecaa30718694d1e13d9f415b7ce75b3c968 Author: Felix Beck Date: Wed Jan 5 12:47:48 2011 +0100 [S390] Handling of 4096 bit RSA keys in CRT format. Also process 4096 bit RSA keys in CRT format. Handle them like the smaller keys and take care of the zero padding. Signed-off-by: Felix Beck Signed-off-by: Martin Schwidefsky commit c2567f8ffa2704f6f2f81013e9a590deca5a865f Author: Felix Beck Date: Wed Jan 5 12:47:47 2011 +0100 [S390] zcrypt: cope with cca restriction of cex3 The cca on the crypto adapter has a restriction in the size of the exponent if a key with a modulus bigger than 2048 bit is used. Thus in that case we have to avoid that the crypto device driver thinks the adapter is defect and sets it offline. Therfore a new member for the zcrypt_device struct called max_exp_bit_length is introduced. This will be set the first time the cca returns the error code function not implemented. If this is done with an adapter twice it will return -EINVAL. Signed-off-by: Felix Beck Signed-off-by: Martin Schwidefsky commit 2ade1fab026b4a103f0105ec4b47654fc2f729c7 Author: Felix Beck Date: Wed Jan 5 12:47:46 2011 +0100 [S390] zcrypt: support for 4096 bit keys for cex3c Definitions for CEX3 card types are changed to support 4096 bit RSA keys in the coprocessor. Signed-off-by: Felix Beck Signed-off-by: Ralph Wuerthner Signed-off-by: Martin Schwidefsky commit 3e309a66f52e042881f76cbfb9b6c2aa70163e02 Author: Felix Beck Date: Wed Jan 5 12:47:45 2011 +0100 [S390] zcrypt: support for 4096 bit keys for cex3a Definitions for CEX3 card types are changed to support 4096 bit RSA keys. Also new structs for the accelerator mode are needed. Additionaly when checking the length of key parts, the case for bigger (4096 bit) keys is needed. Signed-off-by: Felix Beck Signed-off-by: Ralph Wuerthner Signed-off-by: Martin Schwidefsky commit b1f933da570576d1f290ea4dc9b896404cbd285d Author: Felix Beck Date: Wed Jan 5 12:47:44 2011 +0100 [S390] zcrypt: Introduce check for 4096 bit support. Implemented an asm in the ap bus and made it accessible for the card specific parts of the zcrypt driver. Thus when a cex3a is recognized a check can be performed to dermine whether the card supports 4096 bit RSA keys. Signed-off-by: Felix Beck Signed-off-by: Martin Schwidefsky commit 2fcb3686e1601cff992e026dceeab1b22dc81178 Author: Michael Holzheu Date: Wed Jan 5 12:47:43 2011 +0100 [S390] hypfs: Move buffer allocation from open to read Currently the buffer for diagnose data is allocated in the open function of the debugfs file and is released in the close function. This has the drawback that a user (root) can pin that memory by not closing the file. This patch moves the buffer allocation to the read function. The buffer is automatically released after the buffer is copied to userspace. Signed-off-by: Michael Holzheu Signed-off-by: Martin Schwidefsky commit 6432c015b754fef910dd7468b16fffc2b975348a Author: Martin Schwidefsky Date: Wed Jan 5 12:47:42 2011 +0100 [S390] current_thread_info optimization Use thread_info lowcore field for current_thread_info(), saves an unnecessary calculation. Signed-off-by: Martin Schwidefsky commit b1b750918566c6c4e8ed6c9b3c0f05b4c0a8805c Author: Heiko Carstens Date: Wed Jan 5 12:47:41 2011 +0100 [S390] extint: get rid of early code plus cleanup Get rid of register/unregister_early_external_interrupt() and clean up the code while at it. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 98b799800c3e2f855ef2d2c6263e84fa5d1420a0 Author: Heiko Carstens Date: Wed Jan 5 12:47:40 2011 +0100 [S390] sclp: use register_external_interrupt() Use register_external_interrupt() instead of register_early_external_interrupt(). The early variant is not necessary since kmalloc works already. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit fb0a9d7e865afdae70829a64bb004a74ff67d29f Author: Heiko Carstens Date: Wed Jan 5 12:47:39 2011 +0100 [S390] pfault: delay register of pfault interrupt Use an early init call to initialize pfault. That way it is possible to use the register_external_interrupt() instead of the early variant. No need to enable pfault any earlier since it has only effect if user space processes are running. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 62d146ffe3adfed2747fc36138476c8417ce73a7 Author: Holger Dengler Date: Wed Jan 5 12:47:38 2011 +0100 [S390] ap bus: add support for irq statistics Add support for AP Bus I/O interrupt statistics in /proc/interrupts. Signed-off-by: Holger Dengler Signed-off-by: Felix Beck Signed-off-by: Martin Schwidefsky commit 85b81cdd0b038d580dedf6289df7de65826967d6 Author: Heiko Carstens Date: Wed Jan 5 12:47:37 2011 +0100 [S390] ctc: add support for irq statistics Add support for CTC I/O interrupt statistics in /proc/interrupts. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 355eb4022b92349f70cd69ce5b9572c71c0be226 Author: Heiko Carstens Date: Wed Jan 5 12:47:36 2011 +0100 [S390] claw: add support for irq statistics Add support for CLAW I/O interrupt statistics in /proc/interrupts. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 096a61682e86090e4e74118ff6fa6858ca73aa58 Author: Heiko Carstens Date: Wed Jan 5 12:47:35 2011 +0100 [S390] lcs: add support for irq statistics Add support for LCS I/O interrupt statistics in /proc/interrupts. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit f48198d592b0d680b9677bd69edd2290cd0c1f4f Author: Heiko Carstens Date: Wed Jan 5 12:47:34 2011 +0100 [S390] vmur: add support for irq statistics Add support for VMUR I/O interrupt statistics in /proc/interrupts. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit b86651721f18f40319efe94ed3eac2d26682e5b9 Author: Heiko Carstens Date: Wed Jan 5 12:47:33 2011 +0100 [S390] tape: add support for irq statistics Add support for ccw based tape I/O interrupt statistics in /proc/interrupts. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 3fe22f6bfd6f81aafd140d69578d3a2c39674664 Author: Heiko Carstens Date: Wed Jan 5 12:47:32 2011 +0100 [S390] 3270: add support for irq statistics Add support for 3270 I/O interrupt statistics in /proc/interrupts. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 12fae5858cd97181c92472c9bb5f098a7eca2ffe Author: Heiko Carstens Date: Wed Jan 5 12:47:31 2011 +0100 [S390] 3215: add support for irq statistics Add support for 3215 I/O interrupt statistics in /proc/interrupts. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 3283942b71eb5023184b378230f5f0e3fbb40991 Author: Heiko Carstens Date: Wed Jan 5 12:47:30 2011 +0100 [S390] dasd: add support for irq statistics Add support for DASD I/O interrupt statistics in /proc/interrupts. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 30d77c3e1cbdff304b16ae02cb56baaa308e42fd Author: Jan Glauber Date: Wed Jan 5 12:47:29 2011 +0100 [S390] qdio: add qdio interrupts to interrupt statistics Count traditional qdio interrupts and adapter interrupts for qdio in the interrupt statistics. Signed-off-by: Jan Glauber Signed-off-by: Martin Schwidefsky commit 052ff461c8427629aee887ccc27478fc7373237c Author: Heiko Carstens Date: Wed Jan 5 12:47:28 2011 +0100 [S390] irq: have detailed statistics for interrupt types Up to now /proc/interrupts only has statistics for external and i/o interrupts but doesn't split up them any further. This patch adds a line for every single interrupt source so that it is possible to easier tell what the machine is/was doing. Part of the output now looks like this; CPU0 CPU2 CPU4 EXT: 3898 4232 2305 I/O: 782 315 245 CLK: 1029 1964 727 [EXT] Clock Comparator IPI: 2868 2267 1577 [EXT] Signal Processor TMR: 0 0 0 [EXT] CPU Timer TAL: 0 0 0 [EXT] Timing Alert PFL: 0 0 0 [EXT] Pseudo Page Fault [...] NMI: 0 1 1 [NMI] Machine Checks Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 545b288dcbdea58a2ce2afba5f6a8302d31ac459 Author: Heiko Carstens Date: Wed Jan 5 12:47:27 2011 +0100 [S390] time: let local_tick_enable/disable() reprogram the clock comparator Let local_tick_enable/disable() reprogram the clock comparator so the function names make semantically more sense. Also that way the functions are more symmetric since normally each local_tick_enable() call usually would have a subsequent call to set_clock_comparator() anyway. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 17eb7a5cfa98627e5b34e9a9a33b4f04f1c8832d Author: Heiko Carstens Date: Wed Jan 5 12:47:26 2011 +0100 [S390] time: move local_tick_enable()/disable() to timex.h Move the two functions to timex.h where they make more sense than in hardirq.h. No functional change. Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 860dba45e81be2e1ba977617652ae36084daebaf Author: Martin Schwidefsky Date: Wed Jan 5 12:47:25 2011 +0100 [S390] add kprobes annotations Add kprobes annotations to get the massive 'probe kernel.function("*") {}' stress test working. Signed-off-by: Martin Schwidefsky commit 4a1886358b2d68f6f8745bfc10399c2376681acc Author: Martin Schwidefsky Date: Wed Jan 5 12:47:24 2011 +0100 [S390] kprobes: coding style Correct some minor coding style issues. Signed-off-by: Martin Schwidefsky commit 0e917cc3297f3274993d25b5972c2b1c6f763819 Author: Martin Schwidefsky Date: Wed Jan 5 12:47:23 2011 +0100 [S390] kprobes: restructure handler function Restructure the kprobe breakpoint handler function. Add comments to make it more comprehensible and add a sanity check for re-entering kprobes. Signed-off-by: Martin Schwidefsky commit 92b8cbf17ae98a118d3e4a123246a05130114d06 Author: Martin Schwidefsky Date: Wed Jan 5 12:47:22 2011 +0100 [S390] kprobes: jprobe save and restore Register %r14 and %r15 are already stored in jprobe_saved_regs, no need to store them a second time in jprobe_saved_r14 / jprobe_saved_r15. Signed-off-by: Martin Schwidefsky commit 371db06b017c518da2d69ae278c5978ebcd1041a Author: Martin Schwidefsky Date: Wed Jan 5 12:47:21 2011 +0100 [S390] kprobes: insn slots The s390 architecture can execute code on kmalloc/vmalloc memory. No need for the __ARCH_WANT_KPROBES_INSN_SLOT detour. Signed-off-by: Martin Schwidefsky commit b9599798f953084774da926caa8bafd7e244948e Author: Martin Schwidefsky Date: Wed Jan 5 12:47:20 2011 +0100 [S390] kprobes: activation and deactivation Replace set_current_kprobe/reset_current_kprobe/save_previous_kprobe/ restore_previous_kprobe with a simpler scheme push_kprobe/pop_kprobe. The mini kprobes stack can store up to two active kprobes. Signed-off-by: Martin Schwidefsky commit ba640a591574036ab22cd32b47897340b0605342 Author: Martin Schwidefsky Date: Wed Jan 5 12:47:19 2011 +0100 [S390] kprobes: instruction fixup Determine instruction fixup details in resume_execution, no need to do it beforehand. Remove fixup, ilen and reg from arch_specific_insn. Signed-off-by: Martin Schwidefsky commit 5a8b589f8a35b2c69d1819e3365825e4385a844c Author: Martin Schwidefsky Date: Wed Jan 5 12:47:18 2011 +0100 [S390] kprobes: instruction swap Move the definition of the helper structure ins_replace_args to the only place where it is used and drop the old member as it is not needed. Signed-off-by: Martin Schwidefsky commit fc0a1fea6b81095b6c0e01ec3407d04c8341974c Author: Martin Schwidefsky Date: Wed Jan 5 12:47:17 2011 +0100 [S390] kprobes: single step cleanup The saved interrupt mask and the saved control registers are only relevant while single stepping is set up. A secondary kprobe while kprobe single stepping is active may not occur. That makes is safe to remove the save and restore of kprobe_saved_imask / kprobe_save_ctl from save_previous_kprobe and restore_previous_kprobe. Move all single step related code to two functions, enable_singlestep and disable_singlestep. Signed-off-by: Martin Schwidefsky commit 35f2aaa79a2d484c8449f34461464a1e84e36e2b Author: Martin Schwidefsky Date: Wed Jan 5 12:47:16 2011 +0100 [S390] kprobes: single stepped breakpoint Remove special case of a kprobe on a breakpoint while a relocated instruction is single stepped. The only instruction that may cause a fault while kprobe single stepping is active is the relocated instruction. There is no kprobe on the instruction slot retrieved with get_insn_slot(). Signed-off-by: Martin Schwidefsky commit 6f9a3c330652b0fdb65d89e94977a8e79fe730e7 Author: Martin Schwidefsky Date: Wed Jan 5 12:47:15 2011 +0100 [S390] cleanup s390 Kconfig Make use of def_bool and def_tristate where possible and add sensible defaults to the config symbols where applicable. This shortens the defconfig file by another ~40 lines. Signed-off-by: Martin Schwidefsky commit 53ec24b1e6c7118a127cf029a1519a2ce55268ec Author: Felix Beck Date: Wed Jan 5 12:46:44 2011 +0100 [S390] zcrypt: Fix check to look for facility bits 2 & 65 Fix the check for ap interupts to look for facility bits 2 and 65. Make sure that we only register interrupts for aps, if the machine has ap interrupt support. This patch is relevant only for the 2.6.37 stable series. Cc: stable@kernel.org Signed-off-by: Felix Beck Signed-off-by: Martin Schwidefsky commit 0af85dda39d9b673aca8c0ebae004ea70f3efc93 Author: Russell King Date: Wed Dec 15 21:58:50 2010 +0000 ARM: vexpress: add sched_clock() for Versatile Express Add a sched_clock() implementation to Versatile Express using the new sched_clock() infrastructure for extending 32bit counters to full 64-bit nanoseconds. Tested-by: Will Deacon Signed-off-by: Russell King commit 1051b9f0f9eab8091fe3bf98320741adf36b4cfa Merge: cde9efef401563943d5a58eb9b7274bfdc08ca9b a58154d1c3535f451a409abbd0bda6770b2d9380 Author: Russell King Date: Wed Jan 5 10:23:38 2011 +0000 Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6 into devel-stable commit d3a23e1678a5827c38ed8a465ad91d65e59fa911 Author: Nick Piggin Date: Wed Jan 5 20:01:21 2011 +1100 Revert "fs: use RCU read side protection in d_validate" This reverts commit 3825bdb7ed920845961f32f364454bee5f469abb. You cannot dget() a dentry without having a reference, or holding a lock that guarantees it remains valid. Signed-off-by: Nick Piggin commit 97cbc8fb1e35e328073e84c4031bd338306397d6 Merge: 17d6ce11195fceda62af00beefde37e37a01337c 14bbb7c61557172e4482d4d97a5f56042a12b969 Author: Paul Mundt Date: Wed Jan 5 17:30:20 2011 +0900 Merge branch 'common/fbdev-mipi' of master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6 commit 025a10a76808cfd9e55dbf965d0f1453e4f8ae84 Merge: 6bf45a1018ff3cda8b6ef2fa7e023a023bc01dc8 f7dd3611c85f50a98e8f3b9b1d52aaf540ebeb7b c070c203cde0e019cd373d3247137be11961deb3 d0fb0c4b3fc9b31cc635e89b6a2f9aaa30bf75db Author: Paul Mundt Date: Wed Jan 5 17:25:29 2011 +0900 Merge branches 'rmobile/mmcif', 'rmobile/ag5' and 'rmobile/mackerel' into rmobile-latest Conflicts: arch/arm/mach-shmobile/Kconfig Signed-off-by: Paul Mundt commit 14bbb7c61557172e4482d4d97a5f56042a12b969 Author: Guennadi Liakhovetski Date: Wed Dec 29 08:12:29 2010 +0000 fbdev: sh_mipi_dsi: use platform provided register layout and values Different sh-mobile SoCs have variations in their MIPI DSI register layouts, besides, different LCD panels require different configuration parameters. This patch switches the driver to use platform-provided MIPI DSI parameters. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit 6fd465956e287f2bff8ff70ad4f27825dc3b468c Author: Guennadi Liakhovetski Date: Wed Dec 29 08:12:26 2010 +0000 ARM: mach-shmobile: specify sh7372 MIPI DSI register layout Prepare the ap4evb board for the MIPI DSI driver transition to support different register layouts. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit 38f3a8794236af422312d280bbe3801130cfa63b Author: Guennadi Liakhovetski Date: Wed Dec 29 08:12:22 2010 +0000 fbdev: sh_mipi_dsi: support different register layouts The register layout of the MIPI DSI unit on sh-mobile SoCs differ. Add platform parameters to support such variations. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit 0851d50dc12a844778a9b243e141f713cd8f074f Author: Guennadi Liakhovetski Date: Mon Dec 27 10:23:09 2010 +0000 ARM: mach-shmobile: improve MIPI DSI clock configuration Now, that the MIPI DSI driver implements runtime PM, we don't need anymore to configure clocks statically in the platform code. This patch also adds a DSITX1 clock definition for sh7372 and attaches PHY clocks to respective devices. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit 236782a5f3674d06865d822092b8a1ea65a44f96 Author: Guennadi Liakhovetski Date: Mon Dec 27 10:23:05 2010 +0000 fbdev: sh-mobile: implement MIPI DSI runtime PM support On SH-Mobile platforms using runtime PM with the MIPI DSI driver switches the DSI Tx link clock on PM events. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit c070c203cde0e019cd373d3247137be11961deb3 Author: Takashi YOSHII Date: Wed Dec 22 14:15:08 2010 +0000 ARM: mach-shmobile: sh73a0: fix div4 table sh73a0 has divisor[12] setting as 1/7 on FRQCRA. Signed-off-by: Takashi YOSHII Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit d0fb0c4b3fc9b31cc635e89b6a2f9aaa30bf75db Author: Kuninori Morimoto Date: Tue Dec 28 05:54:53 2010 +0000 ARM: mach-shmobile: ap4/mackerel: modify wrong comment out of USB Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit ae37c8de74734f640f757be64ddb85f19f042626 Author: Magnus Damm Date: Wed Dec 22 14:47:40 2010 +0000 ARM: mach-shmobile: Mackerel VGA camera support Add VGA camera support to the Mackerel board using soc_camera_platform. The VGA camera module is hooked up using the 8-bit CEU bus, and it is constantly bursting out frames in fixed video mode setting. The camera module does not allow any I2C control. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit eac676e531214f1e276645613acae7d7c4529035 Author: Roel Kluin Date: Sat Jan 1 18:36:36 2011 +0000 sh: correct definitions to access stack pointers A definition like: #define regs_return_value(regs) ((regs)->regs[0]) called with regs_return_value(foo) will be preprocessed to: ((foo)->foo[0]) ^^^ So to fix this to ensure the preprocessor compiles such calls correctly. Signed-off-by: Roel Kluin Signed-off-by: Paul Mundt commit f7dd3611c85f50a98e8f3b9b1d52aaf540ebeb7b Author: Guennadi Liakhovetski Date: Wed Dec 29 07:59:25 2010 +0000 mmc: sh_mmcif: make DMA support by the driver unconditional Simplify the driver by removing the possibility to build it without the DMA support and remove the respective Kconfig parameter. Signed-off-by: Guennadi Liakhovetski Acked-by: Magnus Damm Signed-off-by: Paul Mundt commit 050855887236701c5e7ff803b42265824ce99885 Author: Sam Ravnborg Date: Tue Jan 4 11:39:19 2011 +0000 sparc: update copyright in piggyback.c Update copyright info in piggyback.c to include info from piggyback_64.c. Include my own copyright too. Signed-off-by: Sam Ravnborg Cc: Josip Rodin Cc: Jakub Jelinek Signed-off-by: David S. Miller commit 9202db2202288f0013c3285b291d8281a8190962 Author: Sam Ravnborg Date: Tue Jan 4 11:39:18 2011 +0000 sparc: unify strip command in boot/Makefile Include an additional "Kernel is ready" print for zImage Signed-off-by: Sam Ravnborg Signed-off-by: David S. Miller commit 56818a6f9105ac016ecf5907f7cb63bcdab639fe Author: Sam Ravnborg Date: Tue Jan 4 11:39:17 2011 +0000 sparc: rename piggyback_32 to piggyback Now that we use the same piggyback for 32 and 64 bit we can drop the _32 suffix. Include some trivial unification in the Makefile now that 32 and 64 bit can share the same piggyback command. Signed-off-by: Sam Ravnborg Signed-off-by: David S. Miller commit 1075c4ef707ca83afbeb0950094436eb0245ec86 Author: Sam Ravnborg Date: Tue Jan 4 11:39:16 2011 +0000 sparc: fix tftpboot.img for sparc64 on little-endian host piggyback_32 adapted to support sparc64: - locating "HdrS" differs for sparc and sparc64 - sparc64 updates a_text, a_data + a_bss in the final a.out header Updated Makefile to use piggyback_32 for sparc64. Deleted the now unused piggyback_64.c piggyback_32.c is host endian neutral and works on both little-endian and big-endian hosts. This fixes a long standing bug where sparc64 could not generate tftpboot.img on a x86 host. Signed-off-by: Sam Ravnborg Signed-off-by: David S. Miller commit a020bb17b7046cd97ea6924ca99325b6e516bc2d Author: Sam Ravnborg Date: Tue Jan 4 11:39:15 2011 +0000 sparc: add $BITS to piggyback arguments Add new option to piggyback that identify if this is for 32 or 64 bit. Use this information to determine the alignment used. Signed-off-by: Sam Ravnborg Signed-off-by: David S. Miller commit 571e08f6e2ddd6ec5d547358f55342726c063072 Author: Sam Ravnborg Date: Tue Jan 4 11:39:14 2011 +0000 sparc: remove obsolete ELF support in piggyback_32.c As we always convert to a.out there is no need to support ELF. Removing ELF support because: - it is not used - it simplifies code to support a.out only Signed-off-by: Sam Ravnborg Signed-off-by: David S. Miller commit 9c239053045568abf960b01e4eb2c7205e3cd7d6 Author: Sam Ravnborg Date: Tue Jan 4 11:39:13 2011 +0000 sparc: additional comments to piggyback_32.c While reverse engineering the functionality of piggyback I missed that the code was actually commented. So I added a few comments. Signed-off-by: Sam Ravnborg Signed-off-by: David S. Miller commit b2a39b0d8ec2ce2bdcff4e01572b4e885220254d Author: Sam Ravnborg Date: Tue Jan 4 11:39:12 2011 +0000 sparc: use _start for the start entry (like 64 bit does) We use "_start" in 64 bit - do the same in 32 bit. It is always good to be consistent. Signed-off-by: Sam Ravnborg Signed-off-by: David S. Miller commit e405ae76af19cd2c85335b842f880a2bc98ba785 Author: Sam Ravnborg Date: Tue Jan 4 11:39:11 2011 +0000 sparc: use trapbase in setup_arch start and trapbase point to the same address. But using start to assing to sparc_ttable looked confusing. Replace this with the use of trapbase. Signed-off-by: Sam Ravnborg Signed-off-by: David S. Miller commit 2fe74fa9662f8df51e6ef18227089f54cc07e16a Author: Sam Ravnborg Date: Tue Jan 4 11:39:10 2011 +0000 sparc: refactor piggy_32.c Refactoring to increase readability (a little). - sort includes - spaces around operators - small helpers introduced - added a few comments Signed-off-by: Sam Ravnborg Signed-off-by: David S. Miller commit 3c0eee3fe6a3a1c745379547c7e7c904aa64f6d5 Author: Linus Torvalds Date: Tue Jan 4 16:50:19 2011 -0800 Linux 2.6.37 commit 65f42886e24be2197b1263f138eabf40c6774d00 Merge: 8a87694ed159d7abd2c9ed657416696c05db2252 9fc3bbb4a752f108cf096d96640f3b548bbbce6c Author: Linus Torvalds Date: Tue Jan 4 13:55:49 2011 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: ipv4/route.c: respect prefsrc for local routes bridge: stp: ensure mac header is set bridge: fix br_multicast_ipv6_rcv for paged skbs atl1: fix oops when changing tx/rx ring params drivers/atm/atmtcp.c: add missing atm_dev_put starfire: Fix dma_addr_t size test for MIPS tg3: fix return value check in tg3_read_vpd() Broadcom CNIC core network driver: fix mem leak on allocation failures in cnic_alloc_uio_rings() ISDN, Gigaset: Fix memory leak in do_disconnect_req() CAN: Use inode instead of kernel address for /proc file skfp: testing the wrong variable in skfp_driver_init() ppp: allow disabling multilink protocol ID compression ehea: Avoid changing vlan flags ueagle-atm: fix PHY signal initialization race commit dbbe68bb12b34f3e450da7a73c20e6fa1f85d63a Merge: 7b26e5ebd8b27b0126a84ae7f9a42aa8293d6c48 9fc3bbb4a752f108cf096d96640f3b548bbbce6c Author: David S. Miller Date: Tue Jan 4 11:57:25 2011 -0800 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 commit db98a6cfcc9ac951067c9a2cb60459b618fd7b10 Author: roel kluin Date: Mon Jan 3 12:03:44 2011 -0800 libertas: down_interruptible() can return -EINTR, not EINTR Fix test in lbs_spi_thread(). down_interruptible() can return -EINTR, but not EINTR. Signed-off-by: Roel Kluin Cc: Dan Williams Signed-off-by: Andrew Morton Signed-off-by: John W. Linville commit b5c34f662a3519d34f9634a14d8de638fdbe0ca3 Author: Johannes Berg Date: Mon Jan 3 19:51:09 2011 +0100 mac80211: fix some key comments and code The key documentation is slightly out of date, fix that. Also, the list entry in the key struct is no longer used that way, so list_del_init() isn't necessary any more there. Finally, ieee80211_key_link() is no longer invoked under RCU read lock, but rather with an appropriate station lock held. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit cc72128750700d01c31f583a355c5f8f809498bb Author: Sujith Manoharan Date: Mon Jan 3 21:22:18 2011 +0530 ath9k_htc: Fix packet injection To inject a packet in monitor mode, a dummy station has to be associated with the monitor interface in the target. Failing to do this would result in a firmware crash on the device. Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit a8851d10aadb46b25db4459aa0d1150c957d2bc1 Author: Dan Carpenter Date: Mon Jan 3 08:46:29 2011 +0300 ath5k: ath5k_eeprom_mode_from_channel() returns signed ath5k_eeprom_mode_from_channel() returns -1 on error but we're storing the result in "ee_mode" which is an unsigned char. This breaks the error handling. This patch makes "ee_mode" an int. Signed-off-by: Dan Carpenter Signed-off-by: John W. Linville commit 2ae79d52cdac733037490486792a53de9fb8d6b6 Author: Mohammed Shafi Shajakhan Date: Fri Dec 31 20:49:00 2010 +0530 ath9k : few rate control clean ups Remove some obvious looking dead code and rename few functions Signed-off-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit 707e634326448190bfe2d937c44ec05c8dea63c4 Author: Christian Lamparter Date: Thu Dec 30 17:29:53 2010 +0100 Revert "mac80211: temporarily disable reorder release timer" This reverts enables the reorder release timer once again. The issues laid out in: Have been addressed by: mac80211: serialize rx path workers mac80211: ignore PSM bit of reordered frames Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit 24a8fdad35835e8d71f7c4b978a246fafed2e7b4 Author: Christian Lamparter Date: Thu Dec 30 17:25:29 2010 +0100 mac80211: serialize rx path workers This patch addresses the issue of serialization between the main rx path and various reorder release timers. It converts the previously local "frames" queue into a global rx queue [rx_skb_queue]. This way, everyone (be it the main rx-path or some reorder release timeout) can add frames to it. Only one active rx handler worker [ieee80211_rx_handlers] is needed. All other threads which have lost the race of "runnning_rx_handler" can now simply "return", knowing that the thread who had the "edge" will also take care of their workload. Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit 1186488b4a4d4871e40cb1604ba3ede3d4b7cc90 Author: Rajkumar Manoharan Date: Thu Dec 30 19:07:44 2010 +0530 ath9k: fix beacon restart on channel change Restart the beacon timers only if the beacon was already configured. Otherwise beacons timers are restarted unnecessarily in unassociated state too. Cc: stable@kernel.org Signed-off-by: Rajkumar Manoharan Signed-off-by: John W. Linville commit bd8027a72a1af95efd1dc8ea6df2fd9724c885b2 Author: Mohammed Shafi Shajakhan Date: Thu Dec 30 12:18:01 2010 +0530 Revert "ath9k: Parse DTIM period from mac80211" This reverts commit 0ce3bcfc84900a64347b0fe1140229bd81314008. Event though with the above commit we obtain the configured DTIM period from the AP rather than always hardcoding it to '1', this seems to cause problems under the following scenarios: * Preventing association with broken AP's * Adds latency in roaming So its better to always use the safe value of '1' for dtim period Cc: Jouni Malinen Signed-off-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit ff039c6fb372c87a3cc4fd25bb846790cb35edb8 Author: Bob Copeland Date: Wed Dec 29 17:09:02 2010 -0500 cfg80211: fix transposition of words in printk Fixes the misplaced article in the following: "cfg80211: Updating information on frequency 5785 MHz for 20 a MHz width channel with regulatory rule:" Signed-off-by: Bob Copeland Signed-off-by: John W. Linville commit f76b57b47e5fd423f9827c7b0ba7bbd06cca6b9b Author: Joel A Fernandes Date: Tue Dec 28 19:28:11 2010 -0600 mac80211: Fix mesh portal communication with other mesh nodes. Fixed a bug where if a mesh interface has a different MAC address from its bridge interface, then it would not be able to send data traffic to any other mesh node. This also adds support for communication between mesh nodes and external bridged nodes by using a 6 address format if the source is a node within the mesh and the destination is an external node proxied by a mesh portal. Signed-off-by: Joel A Fernandes Signed-off-by: John W. Linville commit 1c30cc19081c16b1fe73ac13f2cb2abc009cdcc4 Author: Felix Fietkau Date: Tue Dec 28 15:46:16 2010 +0100 ath9k_hw: fix dma descriptor rx error bit parsing An Rx DMA descriptor can have multiple error bits set, and some error bits (e.g. MIC failure) are filtered by the driver based on other criteria. Remove the 'else' in various error bit checks so that all error information is properly passed to the driver. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 1e1f4ad25fab29ca48b1166e74a81e9c89ddf0fb Author: Sujith Manoharan Date: Tue Dec 28 14:28:52 2010 +0530 ath9k_htc: Move LED/RFKILL code to htc_drv_gpio.c And add the copyright/license header. Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit 039a07215e0fca00c450f4bf1dc9b458bdfe8559 Author: Sujith Manoharan Date: Tue Dec 28 14:28:37 2010 +0530 ath9k_htc: Fix fast channel change When returning to the operating channel, a full HW reset has to be done instead of a fast channel change. Since sw_scan_complete() is called after the config() call for the home channel, we end up doing a FCC. Fix this issue by checking the OFFCHANNEL flag to determine FCC. Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit 73908674c6957082e8ab57daed57d2bb97a1ebba Author: Sujith Manoharan Date: Tue Dec 28 14:28:27 2010 +0530 ath9k_htc: Handle FATAL events The device has to be reset when a FATAL event is received. Not doing so would leave the card in a non-working state. Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit 66e3547431a8738416b508badfb9f326d11dabcc Author: Sujith Manoharan Date: Tue Dec 28 14:28:14 2010 +0530 ath9k_htc: Move work cancellation outside of mutex There is no need to lock the various work cancellation calls. This will be helpful when handling FATAL events. Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit ff8f59b5bbdf1527235b8c88d859c7d23691324f Author: Sujith Manoharan Date: Tue Dec 28 14:28:05 2010 +0530 ath9k_htc: Handle pending URBs properly When doing a channel change, the pending URBs have to be killed properly on calling htc_stop(). This fixes the probe response timeout seen when sending UDP traffic at a high rate and running background scan at the same time. Cc: stable Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit ee832d3e9e72abf83931205a2f5379944be501c2 Author: Mohammed Shafi Shajakhan Date: Tue Dec 28 13:06:26 2010 +0530 ath9k: Few clean ups in beacon config parameters Some minor clean ups in assigning values to beacon config parameters Signed-off-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit 4cfda47b69d0a37e5fc0292addba6d0f5f671a14 Author: Christian Lamparter Date: Mon Dec 27 23:21:26 2010 +0100 mac80211: ignore PSM bit of reordered frames This patch tackles one of the problems of my reorder release timer patch from August. => What if the reorder release triggers and ap_sta_ps_end (called by ieee80211_rx_h_sta_process) accidentally clears the WLAN_STA_PS_STA flag, because 100ms ago - when the STA was still active - frames were put into the reorder buffer. Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit 5af3c1d195a6169a925a929e800dc4fce2a545ae Author: Helmut Schaa Date: Mon Dec 27 15:07:35 2010 +0100 rt2x00: Fix comment about removed spinlock The comment doesn't match the code anymore. Fix that. Signed-off-by: Helmut Schaa Acked-by: Gertjan van Wingerde Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 48103d25c4ca00a1d0692895f9aa68fcac6bc6af Author: Helmut Schaa Date: Mon Dec 27 15:07:16 2010 +0100 rt2x00: Remove unused interface spinlock Since the last user of intf->lock is gone we can safely remove it. Signed-off-by: Helmut Schaa Acked-by: Gertjan van Wingerde Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit bfe6a15d60671993eb3d4ac396b1f442ae08581c Author: Helmut Schaa Date: Mon Dec 27 15:06:57 2010 +0100 rt2x00: Simplify intf->delayed_flags locking Instead of protecting delayed_flags with a spinlock use atomic bitops to make the code more readable. Signed-off-by: Helmut Schaa Acked-by: Gertjan van Wingerde Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit f833eea0a77b0910ea202468175bfc80470d44d0 Author: Helmut Schaa Date: Mon Dec 27 15:06:36 2010 +0100 rt2x00: Remove superfluous assignment of mpdu_density The tx desciptor already gets initialized to 0. Hence, there's no need to explicitly assign 0 to mpdu_density here. Signed-off-by: Helmut Schaa Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 11f16aefcc07178972f149f1a1d53e6868481394 Author: Ismael Luceno Date: Mon Dec 27 15:06:17 2010 +0100 rt2x00: Fix panic on frame padding for rt2800 usb devices Backtrace: rt2800usb_write_tx_data rt2x00queue_write_tx_frame rt2x00mac_tx invoke_tx_handlers __ieee80211_tx ieee80211_tx virt_to_head_page ieee80211_xmit ieee80211_tx_skb ieee80211_scan_work schedule ieee80211_scan_work process_one_work ... It tried to expand the skb past it's end using skb_put. So I replaced it with a call to skb_padto, which takes the issue into account. Signed-off-by: Ismael Luceno Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 736e3acadce8438e610b897af2b1c472ed58444b Author: Gertjan van Wingerde Date: Mon Dec 27 15:05:55 2010 +0100 rt2x00: Fix pointer errors. Fix some pointer errors in the various calls to memcpy, memset and memmove. Although none of these errors are fatal (the expression used now results in the same pointer value) it is better to use the proper expression. All errors are having to deal with arrays. Signed-off-by: Gertjan van Wingerde Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit a39fd6be19bde021314262a6d2193b3792c808db Author: Gertjan van Wingerde Date: Mon Dec 27 15:05:35 2010 +0100 rt2x00: remove intf->mac field. The mac field of the rt2x00_intf structure is written to once and used twice. In both these uses the mac address is available via other means. Remove this field as it does not appear to be necessary. Signed-off-by: Gertjan van Wingerde Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 773d1b98268a9effac047fd2ab1c47bf9f7a9e5f Author: Gertjan van Wingerde Date: Mon Dec 27 15:05:14 2010 +0100 rt2x00: Remove intf->bssid field. The bssid field in struct rt2x00_intf is only written to once, and is never read from. Remove this field, as it appears to not be needed. Signed-off-by: Gertjan van Wingerde Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 5235189c8edddf2eb32982f814bc858b55e6350a Author: Johannes Stezenbach Date: Mon Dec 27 15:04:54 2010 +0100 rt2x00: allow txstatus_fifo w/o txstatus_tasklet When DRIVER_REQUIRE_TXSTATUS_FIFO is set, intialize the txstatus_fifo, but initialize rt2x00dev->txstatus_tasklet only when both DRIVER_REQUIRE_TXSTATUS_FIFO and rt2x00dev->ops->lib->txstatus_tasklet are set. This allows the txstatus_fifo to be used by rt2800usb which does not use txstatus_tasklet. Signed-off-by: Johannes Stezenbach Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit c4d63244218bf93d1f0cdf4389e0906df8f506c1 Author: Johannes Stezenbach Date: Mon Dec 27 15:04:29 2010 +0100 rt2x00: simplify txstatus_fifo handling Signed-off-by: Johannes Stezenbach Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 97e2c40269e168df986daf94af1c62e07d4fc599 Author: Christian Lamparter Date: Sun Dec 26 18:22:29 2010 +0100 carl9170: fix usb pm suspend->resume woes This patch revamps some common code-paths which are shared between (re-)initialization and suspend/resume subroutines. It also adds some helpful comments about quirks and associated difficulties. It's quite big, but it should fix #25382: And hopefully the code is robust enough to deal with all possible suspend/resume scenarios without requiring the user to do any sort of manual and possibly dangerous work. Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit 3b386510f49ff5c6e6ac1001da4f3c922ae7de3f Author: Christian Lamparter Date: Sun Dec 26 18:22:16 2010 +0100 carl9170: reduce channel change delay By removing two "safety" msleeps (and an echo nop), the channel change delay is effectively halved. Previously, the delay could be as long as 260 ms and the device could not go off-channel without risking to miss the next DTIM beacon [interval ~307 ms]. Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit 9fc3bbb4a752f108cf096d96640f3b548bbbce6c Author: Joel Sing Date: Mon Jan 3 20:24:20 2011 +0000 ipv4/route.c: respect prefsrc for local routes The preferred source address is currently ignored for local routes, which results in all local connections having a src address that is the same as the local dst address. Fix this by respecting the preferred source address when it is provided for local routes. This bug can be demonstrated as follows: # ifconfig dummy0 192.168.0.1 # ip route show table local | grep local.*dummy0 local 192.168.0.1 dev dummy0 proto kernel scope host src 192.168.0.1 # ip route change table local local 192.168.0.1 dev dummy0 \ proto kernel scope host src 127.0.0.1 # ip route show table local | grep local.*dummy0 local 192.168.0.1 dev dummy0 proto kernel scope host src 127.0.0.1 We now establish a local connection and verify the source IP address selection: # nc -l 192.168.0.1 3128 & # nc 192.168.0.1 3128 & # netstat -ant | grep 192.168.0.1:3128.*EST tcp 0 0 192.168.0.1:3128 192.168.0.1:33228 ESTABLISHED tcp 0 0 192.168.0.1:33228 192.168.0.1:3128 ESTABLISHED Signed-off-by: Joel Sing Signed-off-by: David S. Miller commit c9e57f0fdccf74ef7884fed61d212e524b9c4bcd Author: Christian Lamparter Date: Sun Dec 26 18:21:53 2010 +0100 carl9170: add missing return-value check This patch adds a forgotten bail-out path. Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit bb007554fe1f66c4796c7c7ae7bfc735fc8213f7 Author: Bob Copeland Date: Sun Dec 26 12:10:05 2010 -0500 ath5k: fix cycle counter inconsistent locking ath5k_reset is called from process context and takes the cc_lock with plain spin_lock(), but cc_lock can also be taken from tasklets in softirq context. Thus we need to at least use spin_lock_bh. This fixes the following lockdep warning: [ 19.967874] sky2 0000:01:00.0: eth0: enabling interface [ 19.982761] ieee80211 phy0: device now idle [ 20.904809] NET: Registered protocol family 17 [ 21.243857] ieee80211 phy0: device no longer idle - scanning [ 21.404343] [ 21.404346] ================================= [ 21.404450] [ INFO: inconsistent lock state ] [ 21.404518] 2.6.37-rc7-wl+ #242 [ 21.404582] --------------------------------- [ 21.404650] inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage. [ 21.404721] kworker/u:4/982 [HC0[0]:SC1[3]:HE1:SE0] takes: [ 21.404792] (&(&common->cc_lock)->rlock){+.?...}, at: [] ath5k_ani_calibration+0x29/0x5d9 [ath5k] [ 21.405011] {SOFTIRQ-ON-W} state was registered at: [ 21.405011] [] __lock_acquire+0x62f/0x13c1 [ 21.405011] [] lock_acquire+0xd5/0xf1 [ 21.405011] [] _raw_spin_lock+0x45/0x72 [ 21.405011] [] ath5k_reset+0x2c0/0x349 [ath5k] [ 21.405011] [] ath5k_start+0xb8/0x139 [ath5k] [ 21.405011] [] ieee80211_do_open+0x13f/0x819 [mac80211] [ 21.405011] [] ieee80211_open+0x63/0x66 [mac80211] [ 21.405011] [] __dev_open+0x8d/0xb6 [ 21.405011] [] __dev_change_flags+0x9d/0x114 [ 21.405011] [] dev_change_flags+0x18/0x44 [ 21.405011] [] do_setlink+0x23f/0x521 [ 21.405011] [] rtnl_setlink+0xe6/0xea [ 21.405011] [] rtnetlink_rcv_msg+0x18a/0x1a0 [ 21.405011] [] netlink_rcv_skb+0x35/0x7b [ 21.405011] [] rtnetlink_rcv+0x20/0x27 [ 21.405011] [] netlink_unicast+0x1bb/0x21e [ 21.405011] [] netlink_sendmsg+0x23b/0x288 [ 21.405011] [] sock_sendmsg+0xac/0xc4 [ 21.405011] [] sys_sendmsg+0x152/0x1a2 [ 21.405011] [] sys_socketcall+0x214/0x275 [ 21.405011] [] sysenter_do_call+0x12/0x36 [ 21.405011] irq event stamp: 138032 [ 21.405011] hardirqs last enabled at (138032): [] _raw_spin_unlock_irqrestore+0x3b/0x5e [ 21.405011] hardirqs last disabled at (138031): [] _raw_spin_lock_irqsave+0x18/0x7e [ 21.405011] softirqs last enabled at (138024): [] ieee80211_tx_skb+0x47/0x49 [mac80211] [ 21.405011] softirqs last disabled at (138027): [] do_softirq+0x63/0xb4 [ 21.405011] [ 21.405011] other info that might help us debug this: [ 21.405011] 3 locks held by kworker/u:4/982: [ 21.405011] #0: (name){+.+.+.}, at: [] process_one_work+0x1b8/0x41b [ 21.405011] #1: ((&(&local->scan_work)->work)){+.+.+.}, at: [] process_one_work+0x1b8/0x41b [ 21.405011] #2: (&local->mtx){+.+.+.}, at: [] ieee80211_scan_work+0x32/0x4a4 [mac80211] [ 21.405011] [ 21.405011] stack backtrace: [ 21.405011] Pid: 982, comm: kworker/u:4 Not tainted 2.6.37-rc7-wl+ #242 [ 21.405011] Call Trace: [ 21.405011] [] ? printk+0x1d/0x25 [ 21.405011] [] print_usage_bug+0x181/0x18b [ 21.405011] [] ? check_usage_forwards+0x0/0xb6 [ 21.405011] [] mark_lock+0x2a0/0x4aa [ 21.405011] [] ? trace_hardirqs_off+0xb/0xd [ 21.405011] [] __lock_acquire+0x5ba/0x13c1 [ 21.405011] [] ? trace_hardirqs_off_caller+0x18/0x8d [ 21.405011] [] ? trace_hardirqs_off+0xb/0xd [ 21.405011] [] ? local_clock+0x2c/0x4f [ 21.405011] [] ? save_trace+0x2/0xa0 [ 21.405011] [] ? mark_held_locks+0x43/0x5b [ 21.405011] [] ? _raw_spin_unlock_irqrestore+0x3b/0x5e [ 21.405011] [] ? ath5k_ani_calibration+0x29/0x5d9 [ath5k] [ 21.405011] [] lock_acquire+0xd5/0xf1 [ 21.405011] [] ? ath5k_ani_calibration+0x29/0x5d9 [ath5k] [ 21.405011] [] _raw_spin_lock_bh+0x4a/0x77 [ 21.405011] [] ? ath5k_ani_calibration+0x29/0x5d9 [ath5k] [ 21.405011] [] ath5k_ani_calibration+0x29/0x5d9 [ath5k] [ 21.405011] [] ? mark_held_locks+0x43/0x5b [ 21.405011] [] ath5k_tasklet_ani+0x1d/0x27 [ath5k] [ 21.405011] [] tasklet_action+0x96/0x137 [ 21.405011] [] __do_softirq+0xde/0x1c3 [ 21.405011] [] ? arch_get_unmapped_area_topdown+0x3b/0x127 [ 21.405011] [] ? __do_softirq+0x0/0x1c3 [ 21.405011] [] ? irq_exit+0x3d/0x49 [ 21.405011] [] ? do_IRQ+0x98/0xac [ 21.405011] [] ? common_interrupt+0x2e/0x34 [ 21.405011] [] ? sys_unshare+0x57/0x226 [ 21.405011] [] ? queue_delayed_work+0x1/0x27 [ 21.405011] [] ? ieee80211_queue_delayed_work+0x2e/0x33 [mac80211] [ 21.405011] [] ? ieee80211_scan_work+0x45f/0x4a4 [mac80211] [ 21.405011] [] ? process_one_work+0x26e/0x41b [ 21.405011] [] ? process_one_work+0x1b8/0x41b [ 21.405011] [] ? ieee80211_scan_work+0x0/0x4a4 [mac80211] [ 21.405011] [] ? worker_thread+0x18a/0x2a5 [ 21.405011] [] ? _raw_spin_unlock_irqrestore+0x47/0x5e [ 21.405011] [] ? worker_thread+0x0/0x2a5 [ 21.405011] [] ? kthread+0x67/0x6c [ 21.405011] [] ? kthread+0x0/0x6c [ 21.405011] [] ? kernel_thread_helper+0x6/0x10 Signed-off-by: Bob Copeland Acked-by: Bruno Randolf Signed-off-by: John W. Linville commit 44cefead807daf96d0f43eb494b1eb5edb5454bf Author: Brian Prodoehl Date: Sat Dec 25 14:34:43 2010 -0500 ath9k: fix spur mitigation no-spur case for AR9002 For the AR9002, the spur frequency read from the EEPROM is mangled before being compared against AR_NO_SPUR. This results in the driver trying to set up the spur mitigation for bogus spurs, rather than cleanly breaking out. Signed-off-by: Brian Prodoehl Signed-off-by: John W. Linville commit ad9082adfc0a6bdcef1bad2f22485575479d7a9d Author: Akinobu Mita Date: Sat Dec 25 15:03:58 2010 +0900 airo: use simple_write_to_buffer Simplify write file operation for /proc files by using simple_write_to_buffer(). Signed-off-by: Akinobu Mita Cc: "John W. Linville" Cc: linux-wireless@vger.kernel.org Cc: netdev@vger.kernel.org Signed-off-by: John W. Linville commit 52671e43dbfb0e0dfa5fab604cb3984bd1d777a6 Author: Senthil Balasubramanian Date: Thu Dec 23 21:06:57 2010 +0530 ath9k: spin_lock_bh is not required within tasklet context. Disabling BH is not required while running from a tasklet context and so replace spin_lock_bh with just spin_lock. Signed-off-by: Senthil Balasubramanian Signed-off-by: John W. Linville commit cd017f25e391dfabaca185bb4a5aefd02fd6c0ca Author: Stanislaw Gruszka Date: Thu Dec 23 15:12:30 2010 +0100 iwlagn: fix scan tx antenna setting on 5Ghz band Looks that we do not set correctly antennas when scanning on 5Ghz band and when bluetooth is enabled, because priv->cfg->scan_tx_antennas[band] is only defined for IEEE80211_BAND_2GHZ. To fix we check band before limiting antennas to first one. This allow to remove hard coded cfg->scan_tx_antennas[band]. Signed-off-by: Stanislaw Gruszka Acked-by: Wey-Yi Guy Signed-off-by: John W. Linville commit cd2c5486526b744fb505e18c9d981b35feaf283a Author: Bruno Randolf Date: Wed Dec 22 19:20:32 2010 +0900 ath5k: Move mac80211 functions into new file Move mac80211 functions into new file mac80211-ops.c to have a better separation and to make base.c smaller. Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit 7b26e5ebd8b27b0126a84ae7f9a42aa8293d6c48 Author: Francois-Xavier Le Bail Date: Tue Jan 4 09:10:20 2011 +0000 net: typos in comments in include/linux/igmp.h There are typos in comments in include/linux/igmp.h: 83 #define IGMP_HOST_MEMBERSHIP_QUERY 0x11 /* From RFC1112 */ 84 #define IGMP_HOST_MEMBERSHIP_REPORT 0x12 /* Ditto */ [snip] 88 #define IGMPV2_HOST_MEMBERSHIP_REPORT 0x16 /* V2 version of 0x11 */ 89 #define IGMP_HOST_LEAVE_MESSAGE 0x17 90 #define IGMPV3_HOST_MEMBERSHIP_REPORT 0x22 /* V3 version of 0x11 */ The line 88 and 90 are about REPORT messages. The IGMP_HOST_MEMBERSHIP_REPORT (IGMP V1) value is 0x12. So the comment on line 88 must be /* V2 version of 0x12 */, and the comment on line 90 must be /* V3 version of 0x12 */. Signed-off-by: Francois-Xavier Le Bail Signed-off-by: David S. Miller commit 0511af9e9a43c64dd7e23e642c9087710688768c Merge: 782a9e31e81956a271375c0ba8d46fbb0480983e 003ea98195eebdfcf476317b517e8c29a25b9d10 Author: John W. Linville Date: Tue Jan 4 14:26:34 2011 -0500 Merge branch 'wireless-next-2.6' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-2.6 commit 782a9e31e81956a271375c0ba8d46fbb0480983e Merge: 5c4bc1ce917d93ce8f7dd498fbec6881b3d7743a 17f9cc3124c97f50a19a7597e5f29f915b5b835c Author: John W. Linville Date: Tue Jan 4 14:25:28 2011 -0500 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/padovan/bluetooth-next-2.6 commit d2460f4b2fa6dbdeec800414f9cf5b1fc8b71197 Author: Johannes Berg Date: Mon Jan 3 19:42:24 2011 +0100 mac80211: add missing synchronize_rcu commit ad0e2b5a00dbec303e4682b403bb6703d11dcdb2 Author: Johannes Berg Date: Tue Jun 1 10:19:19 2010 +0200 mac80211: simplify key locking removed the synchronization against RCU and thus opened a race window where we can use a key for TX while it is already freed. Put a synchronisation into the right place to close that window. Reported-by: Jussi Kivilinna Cc: stable@kernel.org [2.6.36+] Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 919bbad580445801c22ef6ccbe624551fee652bd Author: Milton Miller Date: Thu Dec 30 02:01:03 2010 -0600 mac80211: fix mesh forwarding when ratelimited too Commit b51aff057c9d0ef6c529dc25fd9f775faf7b6c63 said: Under memory pressure, the mac80211 mesh code may helpfully print a message that it failed to clone a mesh frame and then will proceed to crash trying to use it anyway. Fix that. Avoid the reference whenever the frame copy is unsuccessful regardless of the debug message being suppressed or printed. Cc: stable@kernel.org [2.6.27+] Signed-off-by: Milton Miller Signed-off-by: John W. Linville commit f28f3313aa97dcb46954f90f596d75f8faf4626e Author: Daniel Hellstrom Date: Tue Jan 4 01:41:35 2011 +0000 Added support for ampopts in APBUART driver. Used in AMP systems. Signed-off-by: Daniel Hellstrom Signed-off-by: David S. Miller commit d89ddf0da8f0a140d4dc2e2dbc594fb278e33db5 Author: Daniel Hellstrom Date: Tue Jan 4 01:41:34 2011 +0000 APBUART: added raw AMBA vendor/device number to match against. Signed-off-by: Daniel Hellstrom Signed-off-by: David S. Miller commit 9663eb21fcfeb1ed9afd73d14bbc4198796cfc7b Author: Daniel Hellstrom Date: Tue Jan 4 01:41:33 2011 +0000 SPARC/LEON: avoid AMBAPP name duplicates in openprom fs when REG is missing When the REG property is not available the NODE-ID is used as an unique identifier in order to avoid filesystem name duplicates in /proc/openprom filesystem Signed-off-by: Daniel Hellstrom Signed-off-by: David S. Miller commit 2791c1a4390085789e37347fc49f7d189fedae88 Author: Daniel Hellstrom Date: Tue Jan 4 01:41:32 2011 +0000 SPARC/LEON: added support for selecting Timer Core and Timer within core The ability to select Timer Core and Timer instance for system clock makes it possible for multiple AMP systems to coexist. Signed-off-by: Daniel Hellstrom Signed-off-by: David S. Miller commit 9742e72cd1e24ede007daa8f3eb1cece66f0fd0f Author: Daniel Hellstrom Date: Tue Jan 4 01:41:31 2011 +0000 LEON: added raw AMBA vendor/device number to find TIMER, IRQCTRL Signed-off-by: Daniel Hellstrom Signed-off-by: David S. Miller commit e2305e37d4c82ef55be54e9edc8a7e2250739b4f Author: Daniel Hellstrom Date: Tue Jan 4 01:41:30 2011 +0000 SPARC/LEON: added support for IRQAMP IRQ Controller Needed for LEON AMP systems where different CPUs are routed to different IRQ controllers. This patch selects the IRQ Controller which has been routed to the boot CPU, it is up to the boot loader to configure the IRQ controller. Signed-off-by: Daniel Hellstrom Signed-off-by: David S. Miller commit 53aea7caf2e27108912b9b9dbc5bfe18dbbaec9d Author: Daniel Hellstrom Date: Tue Jan 4 01:41:29 2011 +0000 SPARC/LEON: find IRQCTRL and Timer via OF-Tree, instead of hardcoded. Signed-off-by: Daniel Hellstrom Signed-off-by: David S. Miller commit 554d1d027b19265c4aa3f718b3126d2b86e09a08 Author: Stanislaw Gruszka Date: Thu Dec 23 12:38:21 2010 +0100 iwlagn: enable only rfkill interrupt when device is down Since commit 6cd0b1cb872b3bf9fc5de4536404206ab74bafdd "iwlagn: fix hw-rfkill while the interface is down", we enable interrupts when device is not ready to receive them. However hardware, when it is in some inconsistent state, can generate other than rfkill interrupts and crash the system. I can reproduce crash with "kernel BUG at drivers/net/wireless/iwlwifi/iwl-agn.c:1010!" message, when forcing firmware restarts. To fix only enable rfkill interrupt when down device and after probe. I checked patch on laptop with 5100 device, rfkill change is still passed to user space when device is down. Signed-off-by: Stanislaw Gruszka Cc: stable@kernel.org Acked-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 8a87694ed159d7abd2c9ed657416696c05db2252 Author: Christoph Hellwig Date: Tue Jan 4 07:14:24 2011 +0100 remove trim_fs method from Documentation/filesystems/Locking The ->trim_fs has been removed meanwhile, so remove it from the documentation as well. Signed-off-by: Christoph Hellwig Reported-by: Ryusuke Konishi Signed-off-by: Linus Torvalds commit 36f54ff67bc78c6d8dc4a90ac257165e05fdd8da Author: Hans Verkuil Date: Fri Dec 31 12:34:32 2010 -0300 [media] v4l2-compat-ioctl32: fix compile warning drivers/media/video/v4l2-compat-ioctl32.c: In function 'get_v4l2_format32': drivers/media/video/v4l2-compat-ioctl32.c:169:2: warning: case value '0' not in enumerated type 'enum v4l2_buf_type' drivers/media/video/v4l2-compat-ioctl32.c: In function 'put_v4l2_format32': drivers/media/video/v4l2-compat-ioctl32.c:200:2: warning: case value '0' not in enumerated type 'enum v4l2_buf_type' Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 1a5e5af0d2111fdc39c6f2275ed2a9e2e6dd69e2 Author: Hans Verkuil Date: Fri Dec 31 12:30:56 2010 -0300 [media] zoran: fix compiler warning drivers/media/video/zoran/zoran_driver.c: In function 'zoran_dqbuf': drivers/media/video/zoran/zoran_driver.c:2197:21: warning: 'bs.frame' may be used uninitialized in this function Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 0c8fc77e481a3bfc243336085a3fe1fc71f9c1fb Author: Hans Verkuil Date: Fri Dec 31 12:26:53 2010 -0300 [media] tda18218: fix compile warning drivers/media/common/tuners/tda18218.c: In function 'tda18218_wr_regs': drivers/media/common/tuners/tda18218.c:58:5: warning: 'ret' may be used uninitialized in this function Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 4f77b86c665ff6a167edfdf152ebfa997783fa17 Author: Hans Verkuil Date: Fri Dec 31 12:25:32 2010 -0300 [media] ngene: fix compile warning drivers/media/dvb/ngene/ngene-core.c: In function 'ngene_start': drivers/media/dvb/ngene/ngene-core.c:1308:16: warning: unused variable 'flags' Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit e6de30d63eb17c5cbb7affdfc71df95286bfa7d9 Author: françois romieu Date: Mon Jan 3 15:08:37 2011 +0000 r8169: more 8168dp support. Adapted from version 8.019.00 of Realtek's r8168 driver Signed-off-by: Francois Romieu Cc: Hayes Signed-off-by: David S. Miller commit 650e8d5d1fdd5e55869136e2df54287a4432d87f Author: françois romieu Date: Mon Jan 3 15:08:29 2011 +0000 r8169: rtl_csi_access_enable rename. Newer 8168 needs a slightly different rtl_csi_access_enable. This patch separates some noise from the real thing. No functional change. Signed-off-by: Francois Romieu Cc: Hayes Signed-off-by: David S. Miller commit b646d90053f887c1bc243191e693a9b02d09f2c2 Author: françois romieu Date: Mon Jan 3 15:08:21 2011 +0000 r8169: magic. Adapted from version 8.019.00 of Realtek's r8168 driver. Signed-off-by: Francois Romieu Cc: Hayes Signed-off-by: David S. Miller commit 065c27c184d64aeb9ae107c0ef7026ea3642b15b Author: françois romieu Date: Mon Jan 3 15:08:12 2011 +0000 r8169: phy power ops Bits from : - version 8.019.00 of Realtek's 8168 driver - version 1.019.00 of Realtek's 8101 driver Plain old 8169 (PCI) devices do not seem to need anything akin to it. Signed-off-by: Francois Romieu Cc: Hayes Signed-off-by: David S. Miller commit c0e45c1ca3162acb2e77b3d9e152ce6e7b6fa3f5 Author: françois romieu Date: Mon Jan 3 15:08:04 2011 +0000 r8169: 8168DP specific MII registers access methods. Adapted from version 8.019.00 of Realtek's r8168 driver and amended per Hayes Wang's correction : - OCPDR_GPHY_REG_SHIFT must be 16, not 12 - the reg should be at bit 16 ~ 22, whence OCPDR_REG_MASK Signed-off-by: Francois Romieu Cc: Hayes Signed-off-by: David S. Miller commit 4da19633429f67c794b013488348550f457298c4 Author: françois romieu Date: Mon Jan 3 15:07:55 2011 +0000 r8169: use device dependent methods to access the MII registers. Current mdio_{read/write} needs device specific information to work correctly with newer chipsets. Signed-off-by: Francois Romieu Cc: Hayes Signed-off-by: David S. Miller commit f0298f8143e89ac4da306e14b9aa1927e93916d0 Author: françois romieu Date: Mon Jan 3 15:07:42 2011 +0000 r8169: identify different registers. Documentation (sort of). The location are the same, the values are the same but it is just accidental. Note that the 810x could cope with a smaller value as it does not support jumbo frames. Signed-off-by: Francois Romieu Cc: Hayes Signed-off-by: David S. Miller commit bca03d5f32c8ee9b5cfa1d32640a63fded6cb3c0 Author: françois romieu Date: Mon Jan 3 15:07:31 2011 +0000 r8169: remove the firmware of RTL8111D. The binary file of the firmware is moved to linux-firmware repository. The firmwares are rtl_nic/rtl8168d-1.fw and rtl_nic/rtl8168d-2.fw. The driver goes along if the firmware couldn't be found. However, it is suggested to be done with the suitable firmware. Some wrong PHY parameters are directly corrected in the driver. Simple firmware checking added per Ben Hutchings suggestion. Signed-off-by: Hayes Wang Signed-off-by: Francois Romieu Cc: Ben Hutchings Signed-off-by: David S. Miller commit 101e5f77bf35679809586e250b6c62193d2ed179 Author: Mike Galbraith Date: Fri Dec 31 09:32:30 2010 +0100 sched, autogroup: Fix reference leak The cgroup exit mess also uncovered a struct autogroup reference leak. copy_process() was simply freeing vs putting the signal_struct, stranding a reference. Signed-off-by: Mike Galbraith Signed-off-by: Peter Zijlstra Cc: Oleg Nesterov LKML-Reference: <1293784350.6839.2.camel@marge.simson.net> Signed-off-by: Ingo Molnar commit 4f8219875a0dad2cfad9e93a3fafcd9626db98d2 Author: Mike Galbraith Date: Thu Dec 16 15:09:52 2010 +0100 sched, autogroup: Fix potential access to freed memory Oleg pointed out that the /proc interface kref_get() useage may race with the final put during autogroup_move_group(). A signal->autogroup assignment may be in flight when the /proc interface dereference, leaving them taking a reference to an already dead group. Reported-by: Oleg Nesterov Signed-off-by: Mike Galbraith Signed-off-by: Peter Zijlstra LKML-Reference: <1292508592.5940.28.camel@maggy.simson.net> Signed-off-by: Ingo Molnar commit a58154d1c3535f451a409abbd0bda6770b2d9380 Author: Yong Shen Date: Tue Jan 4 14:22:56 2011 +0800 ARM i.MX53: Make MX53 EVK bootable 1. Add entries to Kconfig 2. Add machine definition 3. Add Uart platform data, pad setting and base address 4. Adjust GPIO irq number Signed-off-by: Yong Shen Signed-off-by: Sascha Hauer commit 644b1d586d6670262501057ae99d893fadb012de Author: Yong Shen Date: Tue Jan 4 14:22:55 2011 +0800 ARM i.MX53: Some bug fix about MX53 MSL code 1. pll_base address should return right value 2. uart parent clk is from pll3 Signed-off-by: Yong Shen Signed-off-by: Sascha Hauer commit ae5e49c79c051ea1d5ca91cbd4a0d22189067ba3 Author: Alan Ott Date: Tue Jan 4 00:37:22 2011 -0500 HID: hidraw: add compatibility ioctl() for 32-bit applications. Added the ioctl function to the compat_ioctl pointer in the file_operations struct. Before this, some ioctls would fail for 32-bit apps on 64-bit systems. Signed-off-by: Alan Ott Acked-by: Arnd Bergmann Signed-off-by: Jiri Kosina commit d50d8fe192428090790e7178e9507e981e0b005b Author: Rusty Russell Date: Tue Jan 4 17:20:54 2011 +1030 x86, mm: Initialize initial_page_table before paravirt jumps v2.6.36-rc8-54-gb40827f (x86-32, mm: Add an initial page table for core bootstrapping) made x86 boot using initial_page_table and broke lguest. For 2.6.37 we simply cut & paste the initialization code into lguest (da32dac10126 "lguest: populate initial_page_table"), now we fix it properly by doing that initialization before the paravirt jump. Signed-off-by: Rusty Russell Acked-by: Jeremy Fitzhardinge Cc: lguest Cc: Linus Torvalds Cc: Andrew Morton Cc: Peter Zijlstra LKML-Reference: <201101041720.54535.rusty@rustcorp.com.au> Signed-off-by: Ingo Molnar commit bc030d6cb9532877c1c5a3f5e7123344fa24a285 Merge: d3bd058826aa8b79590cca6c8e6d1557bf576ada 387c31c7e5c9805b0aef8833d1731a5fe7bdea14 Author: Ingo Molnar Date: Tue Jan 4 09:43:42 2011 +0100 Merge commit 'v2.6.37-rc8' into x86/apic Conflicts: arch/x86/include/asm/io_apic.h Merge reason: move to a fresh -rc, resolve the conflict. Signed-off-by: Ingo Molnar commit 6706125e291bd3dddd269e043323a6ab93ccd5fb Author: Yong Zhang Date: Fri Dec 31 21:58:58 2010 +0800 sched: Remove redundant CONFIG_CGROUP_SCHED ifdef CONFIG_[FAIR|RT]_GROUP_SCHED always means CONFIG_CGROUP_SCHED Signed-off-by: Yong Zhang Cc: Peter Zijlstra LKML-Reference: <1293803938-8157-1-git-send-email-yong.zhang0@gmail.com> Signed-off-by: Ingo Molnar commit 410cf2bd3dc6ec1ed9e1b36b25b9d7aa927ed14e Author: Clemens Ladisch Date: Mon Dec 13 14:56:02 2010 +0100 firewire: use split transaction timeout only for split transactions Instead of starting the split transaction timeout timer when any request is submitted, start it only when the destination's ACK_PENDING has been received. This prevents us from using a timeout that is too short, and, if the controller's AT queue is emptying very slowly, from cancelling a packet that has not yet been sent. Signed-off-by: Clemens Ladisch Signed-off-by: Stefan Richter commit 693a50b511818e07a131efc944cba1a504b63d3d Author: Stefan Richter Date: Sat Jan 1 15:17:05 2011 +0100 firewire: ohci: consolidate context status flags "firewire: ohci: restart iso DMA contexts on resume from low power mode" added the flag struct context.active and "firewire: ohci: cache the context run bit" added struct context.running. These flags contain the same information; combine them. Also, normalize whitespace in pci_resume(). Signed-off-by: Stefan Richter commit 386a4153a2c1455e424f280d636efa3c91864466 Author: Clemens Ladisch Date: Fri Dec 24 14:42:46 2010 +0100 firewire: ohci: cache the context run bit The DMA context run control bit is entirely controlled by software, so it is safe to cache it. This allows the driver to avoid doing an additional MMIO read when queueing an AT packet. Signed-off-by: Clemens Ladisch Signed-off-by: Stefan Richter commit 78dec56d6a56322e1b728d51f3a7def416d36b34 Author: Stefan Richter Date: Sat Jan 1 15:15:40 2011 +0100 firewire: ohci: flush AT contexts after bus reset - addendum Add comments - on why bus_reset_tasklet flushes AT queues, - that commit 76f73ca1b291 can possibly be reverted now. Signed-off-by: Stefan Richter Acked-by: Jarod Wilson commit 672d8eafe38e9324055b8c0d0ad6e95c43b6d52a Author: Rob Herring Date: Tue Nov 16 14:33:51 2010 -0600 ipmi: explicitly include of_address.h and of_irq.h of_address.h and of_irq.h are implicitly included on powerpc. Adding them fixes builds on non-powerpc platforms. Signed-off-by: Rob Herring Signed-off-by: Grant Likely commit 20c457b8587bee4644d998331d9e13be82e05b4c Author: Thomas Renninger Date: Mon Jan 3 17:50:45 2011 +0100 perf timechart: Adjust perf timechart to the new power events builtin-timechart must only pass -e power:xy events if they are supported by the running kernel, otherwise try to fetch the old power:power{start,end} events. For this I added the tiny helper function: int is_valid_tracepoint(const char *event_string) to parse-events.[hc], which could be more generic as an interface and support hardware/software/... events, not only tracepoints, but someone else could extend that if needed... Signed-off-by: Thomas Renninger Acked-by: Arjan van de Ven Acked-by: Jean Pihet LKML-Reference: <1294073445-14812-4-git-send-email-trenn@suse.de> Signed-off-by: Ingo Molnar commit 25e41933b58777f2d020c3b0186b430ea004ec28 Author: Thomas Renninger Date: Mon Jan 3 17:50:44 2011 +0100 perf: Clean up power events by introducing new, more generic ones Add these new power trace events: power:cpu_idle power:cpu_frequency power:machine_suspend The old C-state/idle accounting events: power:power_start power:power_end Have now a replacement (but we are still keeping the old tracepoints for compatibility): power:cpu_idle and power:power_frequency is replaced with: power:cpu_frequency power:machine_suspend is newly introduced. Jean Pihet has a patch integrated into the generic layer (kernel/power/suspend.c) which will make use of it. the type= field got removed from both, it was never used and the type is differed by the event type itself. perf timechart userspace tool gets adjusted in a separate patch. Signed-off-by: Thomas Renninger Signed-off-by: Ingo Molnar Acked-by: Arjan van de Ven Acked-by: Jean Pihet Cc: Arnaldo Carvalho de Melo Cc: Peter Zijlstra Cc: Linus Torvalds Cc: rjw@sisk.pl LKML-Reference: <1294073445-14812-3-git-send-email-trenn@suse.de> Signed-off-by: Ingo Molnar LKML-Reference: <1290072314-31155-2-git-send-email-trenn@suse.de> commit 61a0d49c33c7fd57c14895e5b0760bd02b65ac1f Author: Thomas Renninger Date: Mon Jan 3 17:50:43 2011 +0100 perf: Do not export power_frequency, but power_start event power_frequency moved to drivers/cpufreq/cpufreq.c which has to be compiled in, no need to export it. intel_idle can a be module though... Signed-off-by: Thomas Renninger Signed-off-by: Ingo Molnar Acked-by: Jean Pihet Cc: Jean Pihet Cc: Arjan van de Ven Cc: rjw@sisk.pl LKML-Reference: <1294073445-14812-2-git-send-email-trenn@suse.de> Signed-off-by: Ingo Molnar LKML-Reference: <1290072314-31155-2-git-send-email-trenn@suse.de> commit 928585536ff5a8f320e60efc60e2b7ef2a5f548d Merge: cc2221969906a166a638aecdbae84a3d0462719e d854861c4292a4e675a5d3bfd862c5f7421c81e8 Author: Ingo Molnar Date: Tue Jan 4 08:10:28 2011 +0100 Merge branch 'perf/test' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux-2.6 into perf/core commit cc2221969906a166a638aecdbae84a3d0462719e Merge: 56f4c400349157289b474a3fd49ee96acab0a4d7 387c31c7e5c9805b0aef8833d1731a5fe7bdea14 Author: Ingo Molnar Date: Tue Jan 4 08:08:51 2011 +0100 Merge commit 'v2.6.37-rc8' into perf/core Merge reason: pick up latest -rc. Signed-off-by: Ingo Molnar commit 55ee4ef30241a62b700f79517e6d5ef2ddbefa67 Author: Christoph Lameter Date: Thu Dec 16 12:15:15 2010 -0600 gameport: use this_cpu_read instead of lookup Signed-off-by: Christoph Lameter Acked-by: "H. Peter Anvin" Signed-off-by: Tejun Heo commit 357089fca91f639dd005ae0721f5f932b4f276ab Author: Christoph Lameter Date: Thu Dec 16 12:14:43 2010 -0600 x86: udelay: Use this_cpu_read to avoid address calculation The code will use a segment prefix instead of doing the lookup and calculation. Signed-off-by: Christoph Lameter Acked-by: "H. Peter Anvin" Signed-off-by: Tejun Heo commit 42bb8d56953a06de50941d6d3df89dc3023bb92d Author: Michael Chan Date: Mon Jan 3 15:21:46 2011 +0000 cnic: Do not call bnx2i when bnx2i is calling cnic_unregister_driver() We should call bnx2i to send the iSCSI netlink message earlier in cnic_unregister_device(). By the time cnic_unregister_driver() is called, bnx2i may have freed data structures used by the upcalls. Update version to 2.2.12. Reviewed-by: Benjamin Li Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit 57045c996fb4e035f1d152b7e04315fc223352e9 Author: Michael Chan Date: Mon Jan 3 15:21:45 2011 +0000 cnic: Do not allow iSCSI and FCoE on bnx2x multi-function mode Because the hardware does not yet support these in this mode. Reviewed-by: Benjamin Li Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit 4a3a255289e7e322b8044286cce85031990f888a Author: Andres Salomon Date: Thu Nov 11 22:42:06 2010 -0800 sparc: explicitly cast negative phandle checks to s32 When we switched sparc from using 'int's to 'phandle's (which is a u32), we neglected to do anything with the various checks for -1. For those tests, explicitly cast the phandles to s32. Signed-off-by: Andres Salomon Acked-by: David S. Miller Signed-off-by: Grant Likely commit d854861c4292a4e675a5d3bfd862c5f7421c81e8 Author: Arnaldo Carvalho de Melo Date: Tue Jan 4 00:16:20 2011 -0200 perf test: Add test for counting open syscalls To test the use of the perf_evsel class on something other than the tools from where we refactored code to create it. It calls open() N times and then checks if the event created to monitor it returns N events. [acme@felicio linux]$ perf test 1: vmlinux symtab matches kallsyms: Ok 2: detect open syscall event: Ok [acme@felicio linux]$ It does. Cc: Frederic Weisbecker Cc: Han Pingtian Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 4eed11d5e24540dc133003b6e8f904cb747ac4bb Author: Arnaldo Carvalho de Melo Date: Tue Jan 4 00:13:17 2011 -0200 perf evsel: Auto allocate resources needed for some methods While writing the first user of the routines created from the ad-hoc routines in the existing builtins I noticed that the resulting set of calls was too long, reduce it by doing some best effort allocations. Tools that need to operate on multiple threads and cpus should pre-allocate enough resources by explicitely calling the perf_evsel__alloc_{fd,counters} methods. Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 86bd5e8603b00b06189328c6d7034d2dc434d6bb Author: Arnaldo Carvalho de Melo Date: Mon Jan 3 23:09:46 2011 -0200 perf evsel: Use {cpu,thread}_map to shorten list of parameters Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 5c98d466e49267a9221f30958d45cd06f794269a Author: Arnaldo Carvalho de Melo Date: Mon Jan 3 17:53:33 2011 -0200 perf tools: Refactor all_tids to hold nr and the map So that later, we can pass the thread_map instance instead of (thread_num, thread_map) for things like perf_evsel__open and friends, just like was done with cpu_map. Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 60d567e2d9187379d642f6aba7c8a52b3fd5d261 Author: Arnaldo Carvalho de Melo Date: Mon Jan 3 17:49:48 2011 -0200 perf tools: Refactor cpumap to hold nr and the map So that later, we can pass the cpu_map instance instead of (nr_cpus, cpu_map) for things like perf_evsel__open and friends. Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 48290609c0d265f5dac0fca6fd4e3c5732542f67 Author: Arnaldo Carvalho de Melo Date: Mon Jan 3 17:48:12 2011 -0200 perf evsel: Introduce per cpu and per thread open helpers Abstracting away the loops needed to create the various event fd handlers. The users have to pass a confiruged perf->evsel.attr field, which is already usable after perf_evsel__new (constructor) time, using defaults. Comes out of the ad-hoc routines in builtin-stat, that now uses it. Fixed a small silly bug where we were die()ing before killing our children, dysfunctional family this one 8-) Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit c52b12ed2511e6c031a0295fd903ea72b93701fb Author: Arnaldo Carvalho de Melo Date: Mon Jan 3 17:45:52 2011 -0200 perf evsel: Steal the counter reading routines from stat Making them hopefully generic enough to be used in 'perf test', well see. Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 989d873fc5b6a96695b97738dea8d9f02a60f8ab Merge: d9a1abe4844e7591cd82e167a1a09e6546f6c45e 04228460a3ded723b2da09141c76c45ddd712caf Author: Linus Torvalds Date: Mon Jan 3 16:37:01 2011 -0800 Merge master.kernel.org:/home/rmk/linux-2.6-arm * master.kernel.org:/home/rmk/linux-2.6-arm: ARM: pxa: fix page table corruption on resume ARM: it8152: add IT8152_LAST_IRQ definition to fix build error ARM: pxa: PXA_ESERIES depends on FB_W100. ARM: 6605/1: Add missing include "asm/memory.h" ARM: 6540/1: Stop irqsoff trace on return to user ARM: 6537/1: update Nomadik, U300 and Ux500 maintainers ARM: 6536/1: Add missing SZ_{32,64,128} ARM: fix cache-feroceon-l2 after stack based kmap_atomic() ARM: fix cache-xsc3l2 after stack based kmap_atomic() ARM: get rid of kmap_high_l1_vipt() ARM: smp: avoid incrementing mm_users on CPU startup ARM: pxa: PXA_ESERIES depends on FB_W100. commit d9a1abe4844e7591cd82e167a1a09e6546f6c45e Author: Andrew Morton Date: Mon Jan 3 14:59:11 2011 -0800 arch/mn10300/kernel/irq.c: fix build Addresses https://bugzilla.kernel.org/show_bug.cgi?id=25702 Reported-by: Martin Ettl Cc: David Howells Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 867c20265459d30a01b021a9c1e81fb4c5832aa9 Author: Mimi Zohar Date: Mon Jan 3 14:59:10 2011 -0800 ima: fix add LSM rule bug If security_filter_rule_init() doesn't return a rule, then not everything is as fine as the return code implies. This bug only occurs when the LSM (eg. SELinux) is disabled at runtime. Adding an empty LSM rule causes ima_match_rules() to always succeed, ignoring any remaining rules. default IMA TCB policy: # PROC_SUPER_MAGIC dont_measure fsmagic=0x9fa0 # SYSFS_MAGIC dont_measure fsmagic=0x62656572 # DEBUGFS_MAGIC dont_measure fsmagic=0x64626720 # TMPFS_MAGIC dont_measure fsmagic=0x01021994 # SECURITYFS_MAGIC dont_measure fsmagic=0x73636673 < LSM specific rule > dont_measure obj_type=var_log_t measure func=BPRM_CHECK measure func=FILE_MMAP mask=MAY_EXEC measure func=FILE_CHECK mask=MAY_READ uid=0 Thus without the patch, with the boot parameters 'tcb selinux=0', adding the above 'dont_measure obj_type=var_log_t' rule to the default IMA TCB measurement policy, would result in nothing being measured. The patch prevents the default TCB policy from being replaced. Signed-off-by: Mimi Zohar Cc: James Morris Acked-by: Serge Hallyn Cc: David Safford Cc: Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 301a3da358b4af84915f575479e4f0885be47b73 Author: Grant Likely Date: Mon Jan 3 15:02:47 2011 -0700 powerpc/405: Fix missing #{address,size}-cells in i2c node Signed-off-by: Grant Likely commit c8bf6b52af670496f1e8145600e74a3ef3942a4c Author: John Bonesio Date: Wed Nov 17 15:28:56 2010 -0800 powerpc/5200: dts: refactor dts files This patch creates mpc5200b.dtsi containing the information for the MPC5200b SoC then modifies all of the dts files for MPC5200b based systems to use mpc5200b.dtsi. Signed-off-by: John Bonesio Signed-off-by: Grant Likely commit 11946c826d02a16521edc777d88470a6a0fe1441 Author: John Bonesio Date: Wed Nov 17 15:28:47 2010 -0800 powerpc/5200: dts: Change combatible strings on localbus This patch changes some incorrect compatible strings on the local plus bus node in dts files for MPC5200b based systems. Signed-off-by: John Bonesio Signed-off-by: Grant Likely commit 6847317377c871c6e7a8d54e5849bcd0f9b11eb4 Author: John Bonesio Date: Wed Nov 17 15:28:39 2010 -0800 powerpc/5200: dts: remove unused properties This patch remove unused properties in dts files in preparation of refactoring the dts files for MPC5200b based boards. Signed-off-by: John Bonesio Signed-off-by: Grant Likely commit abf1e27fbb4200a010b8fcb1be8cc02485744862 Author: John Bonesio Date: Wed Nov 17 15:28:30 2010 -0800 powerpc/5200: dts: rename nodes to prepare for refactoring dts files This patch renames nodes in dts fils for MPC5200b files to prepare for refactoring of these files later. When refactoring it will be easier to verify the results if the node names aren't changing at the same time. Signed-off-by: John Bonesio Signed-off-by: Grant Likely commit 658f29a51e9830e620bb9a1ce3534b318a38bfeb Author: John Bonesio Date: Wed Nov 17 15:28:20 2010 -0800 of/flattree: Update dtc to current mainline. Pull in recent changes from the main dtc repository. These changes primarily allow multiple device trees to be declared which are merged by dtc. This feature allows us to include a basic dts file and then provide more information for the specific system through the merging functionality. Changes pulled from git://git.jdl.com/software/dtc.git commit id: 37c0b6a0, "dtc: Add code to make diffing trees easier" Signed-off-by: John Bonesio Signed-off-by: Grant Likely commit cd1e65044d4473cca9a01bae7b7938f065044a4b Author: Grant Likely Date: Mon Jan 3 15:51:11 2011 -0700 of/device: Don't register disabled devices Device nodes with the property status="disabled" are not usable and so don't register them when parsing the device tree for devices. Signed-off-by: Grant Likely Cc: Hollis Blanchard Cc: Deepak Saxena Cc: Scott Wood , Cc: David Gibson Cc: Benjamin Herrenschmidt commit cf562b4a550b3cd9d602a05bc27aaaaa376947b4 Author: Jochen Friedrich Date: Mon Jan 3 12:19:00 2011 +0100 ARM: 6607/1: sa1100: Update platform device registration Replace some magic numbers with constants and add interrupt definitions. Signed-off-by: Jochen Friedrich Signed-off-by: Russell King commit 4f444e2b59dd4255d121b57ec41a4a8c5d6bce46 Author: Jochen Friedrich Date: Mon Jan 3 12:09:05 2011 +0100 ARM: 6606/1: sa1100: Fix platform device registration Since commit 7a5b4e16c880f8350d255dc188f81622905618c1, simpad devices don't boot anymore, since platform devices are registered too early. Fix by moving the registration from map_io to arch_initcall as done on other sa1100 boards. Signed-off-by: Jochen Friedrich Acked-by: Kristoffer Ericson Signed-off-by: Russell King commit 04228460a3ded723b2da09141c76c45ddd712caf Merge: 7c0ab43e6ab09d72dc8dbac2521b2f819ccc4026 24c78557741395e038e83f25367cf2bfd7f582b8 Author: Russell King Date: Mon Jan 3 22:55:21 2011 +0000 Merge branch 'fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 commit 82b662dc41027527675740de15344d1b4e34958e Author: Clemens Ladisch Date: Fri Dec 24 14:40:15 2010 +0100 firewire: ohci: flush AT contexts after bus reset for OHCI 1.2 The OHCI 1.2 (draft) specification, clause 7.2.3.3, allows and recommends that, after a bus reset, the controller does not flush all the packets in the AT queues. Therefore, the driver has to do this itself. Signed-off-by: Clemens Ladisch Signed-off-by: Stefan Richter commit 1a9180a20f3a314fda3e96b77570cad3864b2896 Author: Tomas Winkler Date: Mon Jan 3 11:08:58 2011 +0000 net/bridge: fix trivial sparse errors net/bridge//br_stp_if.c:148:66: warning: conversion of net/bridge//br_stp_if.c:148:66: int to net/bridge//br_stp_if.c:148:66: int enum umh_wait net/bridge//netfilter/ebtables.c:1150:30: warning: Using plain integer as NULL pointer Signed-off-by: Tomas Winkler Signed-off-by: David S. Miller commit ebd80880c55364d2850e1ff569869245142318e0 Author: Sedat Dilek Date: Mon Jan 3 11:22:15 2011 +0000 depca: Fix section mismatch derived from depca_isa_probe() This fixes the following warning: WARNING: drivers/net/depca.o(.data+0x0): Section mismatch in reference from the variable depca_isa_driver to the function .init.text:depca_isa_probe() The variable depca_isa_driver references the function __init depca_isa_probe() If the reference is valid then annotate the variable with __init* or __refdata (see linux/init.h) or name the variable: *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console, Tested with linux-next (next-20101231) Signed-off-by: Sedat Dilek Signed-off-by: David S. Miller commit 1170bed04e2acf720de9ccceabe40ff8c56c9c79 Author: Sedat Dilek Date: Mon Jan 3 11:15:58 2011 +0000 smsc-ircc2: Fix section mismatch derived from smsc_ircc_pnp_probe() This fixes the following warning: drivers/net/irda/smsc-ircc2.o(.data+0x18): Section mismatch in reference from the variable smsc_ircc_pnp_driver to the function .init.text:smsc_ircc_pnp_probe() The variable smsc_ircc_pnp_driver references the function __init smsc_ircc_pnp_probe() If the reference is valid then annotate the variable with __init* or __refdata (see linux/init.h) or name the variable: *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console, Tested with linux-next (next-20101231) Signed-off-by: Sedat Dilek Signed-off-by: David S. Miller commit cbad832239e70b91502a5e6ce1fc53a464ad6345 Author: Sedat Dilek Date: Mon Jan 3 11:06:58 2011 +0000 ksz884x: Fix section mismatch derived from pcidev_init() This fixes the following warning: WARNING: drivers/net/ksz884x.o(.data+0x18): Section mismatch in reference from the variable pci_device_driver to the function .init.text:pcidev_init() The variable pci_device_driver references the function __init pcidev_init() If the reference is valid then annotate the variable with __init* or __refdata (see linux/init.h) or name the variable: *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console, Tested with linux-next (next-20101231) Signed-off-by: Sedat Dilek Signed-off-by: David S. Miller commit 6bd121e2d4dcabb145d390a7131ec83102dfb838 Author: Grant Likely Date: Mon Jan 3 14:06:17 2011 -0700 powerpc/dts: fix syntax bugs in bluestone.dts Signed-off-by: Grant Likely commit da81c3b9825c826bfb06a4dcc0524c671985eb68 Author: Rob Herring Date: Tue Nov 16 14:33:50 2010 -0600 of: Fixes for OF probing on little endian systems Fixes for sdhci-of and ipmi drivers. Auditing all drivers using of_get_property did not find other occurrences likely to be used on LE platforms. Signed-off-by: Rob Herring Signed-off-by: Grant Likely commit 236cdc7bc718566a7e7cb9f763b51a8dcad88cbe Author: Rob Herring Date: Mon Jan 3 11:56:38 2011 -0600 of: make drivers depend on CONFIG_OF instead of CONFIG_PPC_OF Some OF drivers could likely be used on non-powerpc OF based platforms, so fix the kconfig depends to be CONFIG_OF instead of CONFIG_PPC_OF. Compile tested on ARM and sparc. Signed-off-by: Rob Herring Signed-off-by: Grant Likely commit 39980292fda20b38baf95bfa577db8b678eecc86 Author: Eric Dumazet Date: Mon Jan 3 10:35:22 2011 +0000 ifb: add performance flags Le lundi 03 janvier 2011 Ă  11:40 -0800, David Miller a Ă©crit : > From: Jarek Poplawski > Date: Mon, 3 Jan 2011 20:37:03 +0100 > > > On Sun, Jan 02, 2011 at 09:24:36PM +0100, Eric Dumazet wrote: > >> Le mercredi 29 dĂ©cembre 2010 ?? 00:07 +0100, Jarek Poplawski a Ă©crit : > >> > >> > Ingress is before vlans handler so these features and the > >> > NETIF_F_HW_VLAN_TX flag seem useful for ifb considering > >> > dev_hard_start_xmit() checks. > >> > >> OK, here is v2 of the patch then, thanks everybody. > >> > >> > >> [PATCH v2 net-next-2.6] ifb: add performance flags > >> > >> IFB can use the full set of features flags (NETIF_F_SG | > >> NETIF_F_FRAGLIST | NETIF_F_TSO | NETIF_F_NO_CSUM | NETIF_F_HIGHDMA) to > >> avoid unnecessary split of some packets (GRO for example) > >> > >> Changli suggested to also set vlan_features, > > > > He also suggested more GSO flags of which especially NETIF_F_TSO6 > > seems interesting (wrt GRO)? > > I think at least TSO6 would very much be appropriate here. Yes, why not, I am only wondering why loopback / dummy (and others ?) only set NETIF_F_TSO :) Since I want to play with ECN, I might also add NETIF_F_TSO_ECN ;) For other flags, I really doubt it can matter on ifb ? [PATCH v3 net-next-2.6] ifb: add performance flags IFB can use the full set of features flags (NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_TSO | NETIF_F_NO_CSUM | NETIF_F_HIGHDMA) to avoid unnecessary split of some packets (GRO for example) Changli suggested to also set vlan_features, NETIF_F_TSO6, NETIF_F_TSO_ECN. Jarek suggested to add NETIF_F_HW_VLAN_TX as well. Signed-off-by: Eric Dumazet Cc: Changli Gao Cc: Jarek Poplawski Cc: Pawel Staszewski Signed-off-by: David S. Miller commit 5f66dd35b49ea81a03e71bfd74c28364f4e32d21 Author: Sam Ravnborg Date: Mon Jan 3 08:27:55 2011 +0000 sparc: fix sparse warnings in arch/sparc/prom for 32 bit build Fix following sparse warnings: arch/sparc/prom/bootstr_32.c:32:35: warning: Using plain integer as NULL pointer arch/sparc/prom/memory.c:61:13: warning: symbol 'prom_meminit' was not declared. Should it be static? arch/sparc/prom/misc_32.c:74:1: error: symbol 'prom_halt' redeclared with different type (originally declared at arch/sparc/include/asm/oplib_32.h:67) - different modifiers arch/sparc/prom/ranges.c:16:26: warning: symbol 'promlib_obio_ranges' was not declared. Should it be static? arch/sparc/prom/ranges.c:17:5: warning: symbol 'num_obio_ranges' was not declared. Should it be static? arch/sparc/prom/ranges.c:39:1: warning: symbol 'prom_adjust_ranges' was not declared. Should it be static? arch/sparc/prom/ranges.c:69:13: warning: symbol 'prom_ranges_init' was not declared. Should it be static? arch/sparc/prom/tree_32.c:286:22: warning: Using plain integer as NULL pointer arch/sparc/prom/tree_32.c:286:38: warning: Using plain integer as NULL pointer None of the warnings indicated any serious issues. We are now sparse clean for 32 bit build in arch/sparc/prom. Signed-off-by: Sam Ravnborg Signed-off-by: David S. Miller commit 0dfb33a0d7e2d9316eb4441a065ddd173f87223e Author: Eric Dumazet Date: Mon Jan 3 08:11:38 2011 +0000 sch_red: report backlog information Provide child qdisc backlog (byte count) information so that "tc -s qdisc" can report it to user. packet count is already correctly provided. qdisc red 11: parent 1:11 limit 60Kb min 15Kb max 45Kb ecn Sent 3116427684 bytes 1415782 pkt (dropped 8, overlimits 7866 requeues 0) rate 242385Kbit 13630pps backlog 13560b 8p requeues 0 marked 7865 early 1 pdrop 7 other 0 Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 7f891cf1fc0d5d5c5b359caec77e5383e1d55986 Author: Shmulik Ravid Date: Mon Jan 3 08:04:59 2011 +0000 dcbnl: more informed return values for new dcbnl routines More accurate return values for the following (new) dcbnl routines: dcbnl_getdcbx() dcbnl_setdcbx() dcbnl_getfeatcfg() dcbnl_setfeatcfg() Signed-off-by: Shmulik Ravid Signed-off-by: David S. Miller commit e6f26129ebbb0071016e2526036f42036ccf30e1 Author: Florian Westphal Date: Mon Jan 3 04:16:28 2011 +0000 bridge: stp: ensure mac header is set commit bf9ae5386bca8836c16e69ab8fdbe46767d7452a (llc: use dev_hard_header) removed the skb_reset_mac_header call from llc_mac_hdr_init. This seems fine itself, but br_send_bpdu() invokes ebtables LOCAL_OUT. We oops in ebt_basic_match() because it assumes eth_hdr(skb) returns a meaningful result. Cc: acme@ghostprotocols.net References: https://bugzilla.kernel.org/show_bug.cgi?id=24532 Signed-off-by: Florian Westphal Signed-off-by: David S. Miller commit 87e609760b5304ef0c0c53cf4d0b29fde9812e1b Author: Michal Simek Date: Mon Jan 3 00:32:36 2011 +0000 ll_temac: Fix section mismatch from the temac_of_probe Replace __init by __devinit. Warning message: WARNING: vmlinux.o(.data+0xbc14): Section mismatch in reference from the variable temac_of_driver to the function .init.text:temac_of_probe() The variable temac_of_driver references the function __init temac_of_probe() If the reference is valid then annotate the variable with __init* or __refdata (see linux/init.h) or name the variable: *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console, Signed-off-by: Michal Simek Acked-by: Grant Likely Signed-off-by: David S. Miller commit 68763c890eb2a60f9b50a061502f94e0cf20fdfe Author: Michal Simek Date: Sun Jan 2 22:54:09 2011 +0000 trivial: Fix typo fault in netdevice.h Signed-off-by: Michal Simek Signed-off-by: David S. Miller commit 9f84f8886b98a9411ee20a10ca390487507037b9 Author: amit salecha Date: Sun Jan 2 21:58:45 2011 +0000 netxen: update driver version 4.0.75 Signed-off-by: Amit Kumar Salecha Signed-off-by: David S. Miller commit e4baaf719807ffc87c6321f3914b93dd512b64c4 Author: Sucheta Chakraborty Date: Sun Jan 2 21:58:44 2011 +0000 netxen: enable LRO based on NETIF_F_LRO o Enable/disable LRO in device based on NETIF_F_LRO flag, instead of using driver private flag. o Disable LRO, if rx csum offloading is off. David Miller, You should use netdev_info() instead of dev_info(). Signed-off-by: Sucheta Chakraborty Signed-off-by: Amit Kumar Salecha Signed-off-by: David S. Miller commit 03ed6a3aa600c48593c3984812fda2d5945ddb46 Merge: 4c37a4b53de2d08c469a6e4304cf2a17178200aa a0a2b71bb750ffe9b3faa317cb6317f4ad109383 Author: Linus Torvalds Date: Mon Jan 3 11:51:22 2011 -0800 Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: perf: Fix callchain hit bad cast on ascii display arch/x86/oprofile/op_model_amd.c: Perform initialisation on a single CPU watchdog: Improve initialisation error message and documentation commit 4c37a4b53de2d08c469a6e4304cf2a17178200aa Merge: d45fa563a62c908d0e9a581d4f091fed6371ebd0 8fd0bda511406ef0e9dcce9be055d7ab931e92ba Author: Linus Torvalds Date: Mon Jan 3 11:50:26 2011 -0800 Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6 * 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: [media] em28xx: radio_fops should also use unlocked_ioctl [media] wm8775: Revert changeset fcb9757333 to avoid a regression [media] cx25840: Prevent device probe failure due to volume control ERANGE error commit d45fa563a62c908d0e9a581d4f091fed6371ebd0 Merge: a1cf11d8f673a3ad91012c5da96beed06ecefde1 8f33d5277fada0291ea495f7fd44a3e7b7aa41d3 Author: Linus Torvalds Date: Mon Jan 3 11:48:54 2011 -0800 Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx * 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx: dmaengine: provide dummy functions for DMA_ENGINE=n mv_xor: fix race in tasklet function commit a1cf11d8f673a3ad91012c5da96beed06ecefde1 Author: Jan Beulich Date: Mon Jan 3 15:07:02 2011 +0000 name_to_dev_t() must not call __init code The function can't be __init itself (being called from some sysfs handler), and hence none of the functions it calls can be either. Signed-off-by: Jan Beulich Acked-by: Randy Dunlap Signed-off-by: Linus Torvalds commit cfa60917f0ba6eca83f41aef3cb4a7dd7736ac9f Author: Cliff Wickman Date: Mon Jan 3 12:03:53 2011 -0600 x86, UV, BAU: Extend for more than 16 cpus per socket Fix a hard-coded limit of a maximum of 16 cpu's per socket. The UV Broadcast Assist Unit code initializes by scanning the cpu topology of the system and assigning a master cpu for each socket and UV hub. That scan had an assumption of a limit of 16 cpus per socket. With Westmere we are going over that limit. The UV hub hardware will allow up to 32. If the scan finds the system has gone over that limit it returns an error and we print a warning and fall back to doing TLB shootdowns without the BAU. Signed-off-by: Cliff Wickman Cc: # .37.x LKML-Reference: Signed-off-by: Ingo Molnar commit 9d89081d698132b5f964aea88112f76492563ee9 Author: Tomas Winkler Date: Mon Jan 3 11:26:08 2011 -0800 bridge: fix br_multicast_ipv6_rcv for paged skbs use pskb_may_pull to access ipv6 header correctly for paged skbs It was omitted in the bridge code leading to crash in blind __skb_pull since the skb is cloned undonditionally we also simplify the the exit path this fixes bug https://bugzilla.kernel.org/show_bug.cgi?id=25202 Dec 15 14:36:40 User-PC hostapd: wlan0: STA 00:15:00:60:5d:34 IEEE 802.11: authenticated Dec 15 14:36:40 User-PC hostapd: wlan0: STA 00:15:00:60:5d:34 IEEE 802.11: associated (aid 2) Dec 15 14:36:40 User-PC hostapd: wlan0: STA 00:15:00:60:5d:34 RADIUS: starting accounting session 4D0608A3-00000005 Dec 15 14:36:41 User-PC kernel: [175576.120287] ------------[ cut here ]------------ Dec 15 14:36:41 User-PC kernel: [175576.120452] kernel BUG at include/linux/skbuff.h:1178! Dec 15 14:36:41 User-PC kernel: [175576.120609] invalid opcode: 0000 [#1] SMP Dec 15 14:36:41 User-PC kernel: [175576.120749] last sysfs file: /sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/uevent Dec 15 14:36:41 User-PC kernel: [175576.121035] Modules linked in: approvals binfmt_misc bridge stp llc parport_pc ppdev arc4 iwlagn snd_hda_codec_realtek iwlcore i915 snd_hda_intel mac80211 joydev snd_hda_codec snd_hwdep snd_pcm snd_seq_midi drm_kms_helper snd_rawmidi drm snd_seq_midi_event snd_seq snd_timer snd_seq_device cfg80211 eeepc_wmi usbhid psmouse intel_agp i2c_algo_bit intel_gtt uvcvideo agpgart videodev sparse_keymap snd shpchp v4l1_compat lp hid video serio_raw soundcore output snd_page_alloc ahci libahci atl1c Dec 15 14:36:41 User-PC kernel: [175576.122712] Dec 15 14:36:41 User-PC kernel: [175576.122769] Pid: 0, comm: kworker/0:0 Tainted: G W 2.6.37-rc5-wl+ #3 1015PE/1016P Dec 15 14:36:41 User-PC kernel: [175576.123012] EIP: 0060:[] EFLAGS: 00010283 CPU: 1 Dec 15 14:36:41 User-PC kernel: [175576.123193] EIP is at br_multicast_rcv+0xc95/0xe1c [bridge] Dec 15 14:36:41 User-PC kernel: [175576.123362] EAX: 0000001c EBX: f5626318 ECX: 00000000 EDX: 00000000 Dec 15 14:36:41 User-PC kernel: [175576.123550] ESI: ec512262 EDI: f5626180 EBP: f60b5ca0 ESP: f60b5bd8 Dec 15 14:36:41 User-PC kernel: [175576.123737] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 Dec 15 14:36:41 User-PC kernel: [175576.123902] Process kworker/0:0 (pid: 0, ti=f60b4000 task=f60a8000 task.ti=f60b0000) Dec 15 14:36:41 User-PC kernel: [175576.124137] Stack: Dec 15 14:36:41 User-PC kernel: [175576.124181] ec556500 f6d06800 f60b5be8 c01087d8 ec512262 00000030 00000024 f5626180 Dec 15 14:36:41 User-PC kernel: [175576.124181] f572c200 ef463440 f5626300 3affffff f6d06dd0 e60766a4 000000c4 f6d06860 Dec 15 14:36:41 User-PC kernel: [175576.124181] ffffffff ec55652c 00000001 f6d06844 f60b5c64 c0138264 c016e451 c013e47d Dec 15 14:36:41 User-PC kernel: [175576.124181] Call Trace: Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? sched_clock+0x8/0x10 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? enqueue_entity+0x174/0x440 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? sched_clock_cpu+0x131/0x190 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? select_task_rq_fair+0x2ad/0x730 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? nf_iterate+0x71/0x90 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? br_handle_frame_finish+0x184/0x220 [bridge] Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? br_handle_frame_finish+0x0/0x220 [bridge] Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? br_handle_frame+0x189/0x230 [bridge] Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? br_handle_frame_finish+0x0/0x220 [bridge] Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? br_handle_frame+0x0/0x230 [bridge] Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? __netif_receive_skb+0x1b6/0x5b0 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? skb_copy_bits+0x110/0x210 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? netif_receive_skb+0x6f/0x80 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? ieee80211_deliver_skb+0x8c/0x1a0 [mac80211] Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? ieee80211_rx_handlers+0xeb6/0x1aa0 [mac80211] Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? __netif_receive_skb+0x380/0x5b0 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? sched_clock_local+0xb2/0x190 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? default_spin_lock_flags+0x8/0x10 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? _raw_spin_lock_irqsave+0x2f/0x50 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? ieee80211_prepare_and_rx_handle+0x201/0xa90 [mac80211] Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? ieee80211_rx+0x2a4/0x830 [mac80211] Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? iwl_update_stats+0xa6/0x2a0 [iwlcore] Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? iwlagn_rx_reply_rx+0x292/0x3b0 [iwlagn] Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? _raw_spin_lock_irqsave+0x2f/0x50 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? iwl_rx_handle+0xe7/0x350 [iwlagn] Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? iwl_irq_tasklet+0xf7/0x5c0 [iwlagn] Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? __rcu_process_callbacks+0x201/0x2d0 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? tasklet_action+0xc5/0x100 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? __do_softirq+0x97/0x1d0 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? nmi_stack_correct+0x2f/0x34 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? __do_softirq+0x0/0x1d0 Dec 15 14:36:41 User-PC kernel: [175576.124181] Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? irq_exit+0x65/0x70 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? do_IRQ+0x52/0xc0 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? common_interrupt+0x30/0x38 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? intel_idle+0xc2/0x160 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? cpuidle_idle_call+0x6b/0x100 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? cpu_idle+0x8a/0xf0 Dec 15 14:36:41 User-PC kernel: [175576.124181] [] ? start_secondary+0x1e8/0x1ee Cc: David Miller Cc: Johannes Berg Cc: Stephen Hemminger Signed-off-by: Tomas Winkler Signed-off-by: David S. Miller commit 0cf445ceaf43be31c5fc70b0e2d5fdccb291c925 Author: Paul Gortmaker Date: Sat Jan 1 13:28:30 2011 +0000 netdev: Update status of 8390 based drivers in MAINTAINERS With the original 8 bit ISA ne1000 card being over 20 years old, it only makes sense to consider ne.c and all the other toplevel 8390 based driver files as legacy for obsolete hardware. The most recent thing made in large quantities that was 8390 based were those crazy PCI ne2k clones - and even they are now 10+ years old. Also remove myself as maintainer, since the only changes to these drivers going forward will be the generic API type changes that touch all drivers. Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit f08c3117c349ea56bd57be347b0b5f8be8c3143c Author: Paul Gortmaker Date: Sat Jan 1 13:15:01 2011 +0000 net/Space: delete orphaned externs from deleted drivers The drivers associated with the prototypes in this commit have been deleted some time ago, but the externs escaped detection. Using a simple "git grep" shows that these references are historical artefacts, only mentioned by the deleted lines. Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 2f32c867219734b06abc980d4812f67b6d6fe517 Author: J. K. Cliburn Date: Sat Jan 1 05:02:12 2011 +0000 atl1: fix oops when changing tx/rx ring params Commit 3f5a2a713aad28480d86b0add00c68484b54febc zeroes out the statistics message block (SMB) and coalescing message block (CMB) when adapter ring resources are freed. This is desirable behavior, but, as a side effect, the commit leads to an oops when atl1_set_ringparam() attempts to alter the number of rx or tx elements in the ring buffer (by using ethtool -G, for example). We don't want SMB or CMB to change during this operation. Modify atl1_set_ringparam() to preserve SMB and CMB when changing ring parameters. Cc: stable@kernel.org Signed-off-by: Jay Cliburn Reported-by: Tõnu Raitviir Signed-off-by: David S. Miller commit a0a2b71bb750ffe9b3faa317cb6317f4ad109383 Merge: c7c25802b39c443b3745cfa973dc49a97a3491f8 d425de5436a620de506f9e4119bf8daa1cb93718 Author: Ingo Molnar Date: Mon Jan 3 19:59:24 2011 +0100 Merge branch 'perf/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing into perf/urgent commit 70d544d0576775a2b3923a7e68cb49b0313d80c9 Author: Arnaldo Carvalho de Melo Date: Mon Jan 3 16:51:39 2011 -0200 perf evsel: Delete the event selectors at exit Freeing all the possibly allocated resources, reducing complexity on each tool exit path. Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 1e7972cc5c16e06f258b0278d8c9adfb5aa75c68 Author: Arnaldo Carvalho de Melo Date: Mon Jan 3 16:50:55 2011 -0200 perf util: Move do_read from session to util Not really something to be exported from session.c. Rename it to 'readn' as others did in the past. Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit daec78a09de3df5fbfbbd167da0304d49d7fcfe5 Author: Arnaldo Carvalho de Melo Date: Mon Jan 3 16:49:44 2011 -0200 perf evsel: Adopt MATCH_EVENT macro from 'stat' Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 69aad6f1ee69546dea8535ab8f3da9f445d57328 Author: Arnaldo Carvalho de Melo Date: Mon Jan 3 16:39:04 2011 -0200 perf tools: Introduce event selectors Out of ad-hoc code and global arrays with hard coded sizes. This is the first step on having a library that will be first used on regression tests in the 'perf test' tool. [acme@felicio linux]$ size /tmp/perf.before text data bss dec hex filename 1273776 97384 5104416 6475576 62cf38 /tmp/perf.before [acme@felicio linux]$ size /tmp/perf.new text data bss dec hex filename 1275422 97416 1392416 2765254 2a31c6 /tmp/perf.new Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit c32e061fa19893ce4acf95d97d5613a161f0f1b7 Author: roel kluin Date: Sat Jan 1 19:40:23 2011 +0100 [SCSI] arcmsr: fix write to device check Use command->sc_data_direction instead of trying (incorrectly) to figure it out from the command itself [jejb: fix up compile failure] Signed-off-by: Roel Kluin Acked-by: NickCheng Signed-off-by: James Bottomley commit 474ffb74c75ea9845860ffb24cdc127eda0d5657 Author: Tomas Henzl Date: Wed Dec 22 16:52:40 2010 +0100 [SCSI] lpfc: lower stack use in lpfc_fc_frame_check according to checkstack the lpfc_fc_frame_check occupies the first place in stack usage: make checkstack objdump -d vmlinux $(find . -name '*.ko') | \ perl /root/rpmbuild/BUILD/kernel-2.6.32/linux-2.6.32.x86_64/scripts/checkstack.pl x86_64 0x000013f4 lpfc_fc_frame_check [lpfc]: 1936 ... This change makes the rctl_names static, thus not on stack. Signed-off-by: Tomas Henzl Acked-by: James Smart Signed-off-by: James Bottomley commit 9e76a97efd31a08cb19d0ba12013b8fb4ad3e474 Author: R, Durgadoss Date: Mon Jan 3 17:22:04 2011 +0530 x86, hwmon: Add core threshold notification to therm_throt.c This patch adds code to therm_throt.c to notify core thermal threshold events. These thresholds are supported by the IA32_THERM_INTERRUPT register. The status/log for the same is monitored using the IA32_THERM_STATUS register. The necessary #defines are in msr-index.h. A call back is added to mce.h, to further notify the thermal stack, about the threshold events. Signed-off-by: Durgadoss R LKML-Reference: Signed-off-by: H. Peter Anvin commit 41511704b678f7b101a76e58d6c6b7bbe2a9ad70 Author: Alan Stern Date: Mon Nov 15 16:04:56 2010 -0500 [SCSI] eliminate an unnecessary local variable from scsi_remove_target() Signed-off-by: Alan Stern Signed-off-by: James Bottomley commit 96de6d447f40612acb93f81a561a834177cca685 Author: Sascha Hauer Date: Mon Dec 6 11:37:30 2010 +0100 ARM i.MX51: rename IPU irqs Signed-off-by: Sascha Hauer commit b848169b37f71c494ea59b260ba665290c23c350 Author: Sascha Hauer Date: Mon Dec 6 09:13:21 2010 +0100 ARM i.MX51: Add ipu clock support Signed-off-by: Sascha Hauer commit 24c78557741395e038e83f25367cf2bfd7f582b8 Author: Aric D. Blumer Date: Wed Dec 29 11:18:29 2010 -0500 ARM: pxa: fix page table corruption on resume Before this patch, the following error would sometimes occur after a resume on pxa3xx: /path/to/mm/memory.c:144: bad pmd 8040542e. The problem was that a temporary page table mapping was being improperly restored. The PXA3xx resume code creates a temporary mapping of resume_turn_on_mmu to avoid a prefetch abort. The pxa3xx_resume_after_mmu code requires that the r1 register holding the address of this mapping not be modified, however, resume_turn_on_mmu does modify it. It is mostly correct in that r1 receives the base table address, but it may also get other bits in 13:0. This results in pxa3xx_resume_after_mmu restoring the original mapping to the wrong place, corrupting memory and leaving the temporary mapping in place. Signed-off-by: Matt Reimer Signed-off-by: Eric Miao commit 823a2df258627b80df2e75056b850424a8eb5fed Author: Mike Rapoport Date: Wed Dec 29 09:06:26 2010 +0200 ARM: it8152: add IT8152_LAST_IRQ definition to fix build error The commit 6ac6b817f3f4c23c5febd960d8deb343e13af5f3 (ARM: pxa: encode IRQ number into .nr_irqs) removed definition of ITE_LAST_IRQ which caused the following build error: CC arch/arm/common/it8152.o arch/arm/common/it8152.c: In function 'it8152_init_irq': arch/arm/common/it8152.c:86: error: 'IT8152_LAST_IRQ' undeclared (first use in this function) arch/arm/common/it8152.c:86: error: (Each undeclared identifier is reported only once arch/arm/common/it8152.c:86: error: for each function it appears in.) make[2]: *** [arch/arm/common/it8152.o] Error 1 Defining the IT8152_LAST_IRQ in the arch/arm/include/hardware/it8152.c fixes the build. Signed-off-by: Mike Rapoport Signed-off-by: Eric Miao commit 82427de2c7c39ee7bcaa4cb0260b4e9b9ab19eb8 Author: Lennert Buytenhek Date: Wed Dec 15 07:20:16 2010 +0800 ARM: pxa: PXA_ESERIES depends on FB_W100. As arch/arm/mach-pxa/eseries.c references w100fb_gpio_{read,write}() directly. Signed-off-by: Lennert Buytenhek Signed-off-by: Eric Miao commit d425de5436a620de506f9e4119bf8daa1cb93718 Author: Frederic Weisbecker Date: Mon Jan 3 16:13:11 2011 +0100 perf: Fix callchain hit bad cast on ascii display ipchain__fprintf_graph() casts the number of hits in a branch as an int, which means we lose its highests bits. This results in meaningless number of callchain hits in perf.data that have a high number of hits recorded, typically those that have callchain branches hits appearing more than INT_MAX. This happens easily as those are pondered by the event period. Reported-by: Nick Piggin Signed-off-by: Frederic Weisbecker Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Arnaldo Carvalho de Melo Cc: Paul Mackerras commit c67a3e09a5316bb34a14e2751cee719339934235 Author: Fabio Estevam Date: Mon Jan 3 11:16:39 2011 -0200 ARM: imx/mx27_3ds: Add PMIC support MX27_3DS board has a MC13783 PMIC connected to the CSPI2 port. Add support for the PMIC. Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit c7c25802b39c443b3745cfa973dc49a97a3491f8 Author: Robert Richter Date: Mon Jan 3 12:15:14 2011 +0100 arch/x86/oprofile/op_model_amd.c: Perform initialisation on a single CPU Disable preemption in init_ibs(). The function only checks the ibs capabilities and sets up pci devices (if necessary). It runs only on one cpu but operates with the local APIC and some MSRs, thus it is better to disable preemption. [ 7.034377] BUG: using smp_processor_id() in preemptible [00000000] code: modprobe/483 [ 7.034385] caller is setup_APIC_eilvt+0x155/0x180 [ 7.034389] Pid: 483, comm: modprobe Not tainted 2.6.37-rc1-20101110+ #1 [ 7.034392] Call Trace: [ 7.034400] [] debug_smp_processor_id+0xd2/0xf0 [ 7.034404] [] setup_APIC_eilvt+0x155/0x180 [ ... ] Addresses https://bugzilla.kernel.org/show_bug.cgi?id=22812 Reported-by: Signed-off-by: Robert Richter Cc: oprofile-list@lists.sourceforge.net Cc: Peter Zijlstra Cc: Frederic Weisbecker Cc: Rafael J. Wysocki Cc: Dan Carpenter Cc: Andrew Morton Cc: [2.6.37.x] LKML-Reference: <20110103111514.GM4739@erda.amd.com> [ small cleanups ] Signed-off-by: Ingo Molnar commit 8fd0bda511406ef0e9dcce9be055d7ab931e92ba Author: Hans Verkuil Date: Sat Dec 18 09:59:51 2010 -0300 [media] em28xx: radio_fops should also use unlocked_ioctl em28xx uses core assisted locking, so it shouldn't use .ioctl. The .ioctl callback was replaced by .unlocked_ioctl for video nodes, but not for radio nodes. This is now corrected. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 9eedd96301cad8ab58ee8c1e579677d0a75c2ba1 Author: Russell King Date: Mon Jan 3 00:00:17 2011 +0000 ARM: DMA: Replace page_to_dma()/dma_to_page() with pfn_to_dma()/dma_to_pfn() Replace the page_to_dma() and dma_to_page() macros with their PFN equivalents. This allows us to map parts of memory which do not have a struct page allocated to them to bus addresses. This will be used internally by dma_alloc_coherent()/dma_alloc_writecombine(). Build tested on Versatile, OMAP1, IOP13xx and KS8695. Tested-by: Janusz Krzysztofik Signed-off-by: Russell King commit 46e67acd5d4cacda758e871eebd15cef4e2c2665 Author: Mauro Carvalho Chehab Date: Mon Jan 3 09:09:56 2011 -0200 [media] wm8775: Revert changeset fcb9757333 to avoid a regression It seems that cx88 and ivtv use wm8775 on some different modes. The patch that added support for a board with wm8775 broke ivtv boards with this device. As we're too close to release 2.6.37, let's just revert it. Reported-by: Andy Walls Reported-by: Eric Sharkey Reported-by: Auric Reported by: David Gesswein Signed-off-by: Mauro Carvalho Chehab commit f23b7952d37c69c0caa6c8dfb85dbf2eb9e5fcaa Author: Andy Walls Date: Sun Dec 5 19:42:30 2010 -0300 [media] cx25840: Prevent device probe failure due to volume control ERANGE error This patch fixes a regression that crept into 2.6.36. The volume control scale in the cx25840 driver has an unusual mapping from register values to v4l2 volume control values. Enforce the mapping limits, so that the default volume control setting does not fall out of bounds to prevent the cx25840 module device probe from failing. Signed-off-by: Andy Walls Cc: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit cde9efef401563943d5a58eb9b7274bfdc08ca9b Merge: 50401d77ee4904673042dd737eed436067cc23f5 60ebe1568fd15b7ffa101acc645069e27d546ed6 Author: Russell King Date: Mon Jan 3 10:31:54 2011 +0000 Merge branch 'ux500-core' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson into devel-stable commit 50401d77ee4904673042dd737eed436067cc23f5 Merge: 206323c181371f3d5fab36c6d33e1fac09b61082 760efe6910d5743084b586d3d0a3b65aea96fb2f Author: Russell King Date: Mon Jan 3 10:31:38 2011 +0000 Merge branch 'master' of git://git.infradead.org/users/cbou/linux-cns3xxx into devel-stable commit 8f33d5277fada0291ea495f7fd44a3e7b7aa41d3 Author: Guennadi Liakhovetski Date: Wed Dec 22 14:46:46 2010 +0100 dmaengine: provide dummy functions for DMA_ENGINE=n This lets drivers, optionally using the dmaengine, build with DMA_ENGINE unselected. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Dan Williams commit 8333f65ef094e47020cd01452b4637e7daf5a77f Author: Saeed Bishara Date: Tue Dec 21 16:53:39 2010 +0200 mv_xor: fix race in tasklet function use mv_xor_slot_cleanup() instead of __mv_xor_slot_cleanup() as the former function aquires the spin lock that needed to protect the drivers data. Cc: Signed-off-by: Saeed Bishara Signed-off-by: Dan Williams commit 711669e5b80b6f2d88f61ed8a9681f83d8cbd201 Author: Arnaud Patard (Rtp) Date: Mon Dec 20 16:48:58 2010 +0100 mx51: fix usb clock support Current code doesn't really enable the usb clocks so if they're disabled when booting linux, the kernel/machine will hang as soon as someone is trying to read a usb register Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit 8305ed75d1418f02933a48bcabdbb5032d885628 Author: Arnaud Patard (Rtp) Date: Mon Dec 20 16:48:57 2010 +0100 MX51: Add support for usb host 2 Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit 08406f540c7ce4cfed96fb240906eee04b9e3eb7 Author: Arnaud Patard (Rtp) Date: Mon Dec 20 16:48:56 2010 +0100 arch/arm/plat-mxc/ehci.c: fix errors/typos This patch is fixing some issues : - MXC_OTG_UCTRL_OPM_BIT is for USBCTRL register and not PHYCTRL register. - the MXC_EHCI_WAKEUP_ENABLED check was only clearing the bits so never allows to set them. Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit 0d95b75e2dd736b23f7cc0971d2f2aacea7f3e49 Author: Fabio Estevam Date: Tue Dec 21 16:38:22 2010 -0200 ARM: mx3/mx31_3ds: Add support for USB Host2 port Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit 1c50e67263a6ab8abb9234e2357bd02134fb4b99 Author: Fabio Estevam Date: Tue Dec 21 16:38:21 2010 -0200 ARM: mx3/mx31_3ds: Add support for OTG host mode Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit 460d30a329a4186192598131505d9f75e6c5e2bc Author: Fabio Estevam Date: Wed Dec 22 12:25:32 2010 -0200 ARM: imx/mx25_3ds: Add USB support Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit 96cf4239c72af1fa099affc720731bad2f86927b Author: Fabio Estevam Date: Wed Dec 22 12:25:31 2010 -0200 ARM: imx/mx27_3ds: Add USB OTG support Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit 130a0ddad9e8f48250dd0e4a5f35aa8afa9d1c5f Author: Fabio Estevam Date: Wed Dec 22 12:25:30 2010 -0200 ARM: mx3/mx35_3ds: Add USB OTG Host mode Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit 1fef891761ddcbd7e57ec3961a0fb748003222ac Merge: d3d4b60b12369eded0ea0c5dffee0888ec4d80cd 1d3f33d541312acd34bd2fa780396d111a0f73b1 Author: Sascha Hauer Date: Mon Jan 3 10:15:11 2011 +0100 Merge branch 'sgu/mxs-core-v8' of git://git.pengutronix.de/git/ukl/linux-2.6 into imx-for-2.6.38-new commit 7c0ab43e6ab09d72dc8dbac2521b2f819ccc4026 Author: Axel Lin Date: Mon Jan 3 02:26:53 2011 +0100 ARM: 6605/1: Add missing include "asm/memory.h" This patch fixes below build error by adding the missing asm/memory.h, which is needed for arch_is_coherent(). $ make pxa3xx_defconfig; make CC init/do_mounts_rd.o In file included from include/linux/list_bl.h:5, from include/linux/rculist_bl.h:7, from include/linux/dcache.h:7, from include/linux/fs.h:381, from init/do_mounts_rd.c:3: include/linux/bit_spinlock.h: In function 'bit_spin_unlock': include/linux/bit_spinlock.h:61: error: implicit declaration of function 'arch_is_coherent' make[1]: *** [init/do_mounts_rd.o] Error 1 make: *** [init] Error 2 Signed-off-by: Axel Lin Acked-by: Peter Huewe Signed-off-by: Russell King commit d3d4b60b12369eded0ea0c5dffee0888ec4d80cd Author: Richard Zhao Date: Thu Dec 30 19:25:06 2010 +0800 arm: mx50: add mx50 reference design board support Add basic function and uart device support. Signed-off-by: Richard Zhao Signed-off-by: Sascha Hauer commit 3d5a44be308203a9a192a77037fb613c2f82ed85 Author: Richard Zhao Date: Thu Dec 30 19:25:05 2010 +0800 arm: mx50: add core functions support except clock Add core definitions and memory map, gpio, irq, iomux, uart device support. Signed-off-by: Richard Zhao Signed-off-by: Sascha Hauer commit 02226a20bcfb01322d4a168f2ed6a6e4366796fd Author: Richard Zhao Date: Thu Dec 30 19:25:03 2010 +0800 arm: mx5: mx51/53 have different mxc_cpu_type definition Signed-off-by: Richard Zhao Acked-by: Uwe Kleine-König Signed-off-by: Sascha Hauer commit dca3abf8d071cb78bac8c8f50259e9fe3a81a4bd Author: Richard Zhao Date: Thu Dec 30 19:25:02 2010 +0800 arm: mx51: define mx51's own MXC_GPIO_IRQS mx5 SoCs have different GPIO port count. Signed-off-by: Richard Zhao Acked-by: Uwe Kleine-König Signed-off-by: Sascha Hauer commit b086e97b20f150e81609a04ed7da92e12d77f1b0 Author: Richard Zhao Date: Thu Dec 30 19:25:01 2010 +0800 arm: plat-mxc: add full parameter macro to define gpio port Signed-off-by: Richard Zhao Acked-by: Uwe Kleine-König Signed-off-by: Sascha Hauer commit 626d90c884591005fdaa9464de81731aab23b864 Author: Richard Zhao Date: Thu Dec 30 19:25:00 2010 +0800 ARM: mx5: use config to define boot related addresses Signed-off-by: Richard Zhao Acked-by: Uwe Kleine-König Signed-off-by: Sascha Hauer commit 1f42be484ffc5559a29466c82adac7dd472d4439 Author: Sam Ravnborg Date: Sat Jan 1 12:53:11 2011 +0000 sparc: remove unused prom tree functions Remove the following unused funtions: prom_nodematch() prom_firstprop() prom_node_has_property() Also declare a few local functions static. Signed-off-by: Sam Ravnborg Signed-off-by: David S. Miller commit a7e4236511c678bf012901faf3c285d199a1adc8 Author: Sam Ravnborg Date: Sat Jan 1 12:53:10 2011 +0000 sparc: remove unused prom cpu functions Remove the following unused funtions: prom_stopcpu() prom_idlecpu() prom_restartcpu() Signed-off-by: Sam Ravnborg Signed-off-by: David S. Miller commit efef2e497717958d9c8bde24998c5a915dd04cd5 Author: Sam Ravnborg Date: Sat Jan 1 12:53:09 2011 +0000 sparc: drop prom/palloc.c None of the functions was used. Signed-off-by: Sam Ravnborg Signed-off-by: David S. Miller commit 743ceeed277c77a7e6751649ad0c4fa42af8063b Author: Sam Ravnborg Date: Sat Jan 1 12:53:08 2011 +0000 sparc: drop prom/devmap.c None of the functions was used. Signed-off-by: Sam Ravnborg Signed-off-by: David S. Miller commit 551423748a4eba55f2eb0fc250d757986471f187 Author: Ben Hutchings Date: Sun Jan 2 23:02:42 2011 +0000 watchdog: Improve initialisation error message and documentation The error message 'NMI watchdog failed to create perf event...' does not make it clear that this is a fatal error for the watchdog. It also currently prints the error value as a pointer, rather than extracting the error code with PTR_ERR(). Fix that. Add a note to the description of the 'nowatchdog' kernel parameter to associate it with this message. Reported-by: Cesare Leonardi Signed-off-by: Ben Hutchings Cc: 599368@bugs.debian.org Cc: 608138@bugs.debian.org Cc: Don Zickus Cc: Frederic Weisbecker Cc: # .37.x and later LKML-Reference: <1294009362.3167.126.camel@localhost> Signed-off-by: Ingo Molnar commit b518a64983cbf2ff31aed530898de2d80e4573d5 Author: Maurus Cuelenaere Date: Sun Jan 2 14:48:16 2011 -0500 hwmon: (s3c-hwmon) Fix compilation The owner field was removed from struct attribute in 6fd69dc578fa0b1bbc3aad70ae3af9a137211707, so don't assign it anymore. Signed-off-by: Maurus Cuelenaere Signed-off-by: Guenter Roeck commit 0fbf8ed976af5bb43cf9cf2492161eb9688fee0c Author: Jesper Juhl Date: Sun Jan 2 22:17:00 2011 +0100 HID: hid-picolcd: Fix memory leak in picolcd_debug_out_report() We have a memory leak in drivers/hid/hid-picolcd.c::picolcd_debug_out_report() in an error path.. We are not always freeing the memory allocated to 'buff' - this patch makes sure we always kfree() what we allocate with kmalloc() when it is no longer needed. Signed-off-by: Jesper Juhl Signed-off-by: Jiri Kosina commit 9109f4eb847b7c0be61ae25fb21b1ce2acc9c2d6 Merge: a1a54303d1c58709a0c16402942d6dede2f69f43 d0dfc6b74a0c6e9ee46b62713256e2b025244d3c Author: Linus Torvalds Date: Sun Jan 2 10:44:21 2011 -0800 Merge branch 'kvm-updates/2.6.37' of git://git.kernel.org/pub/scm/virt/kvm/kvm * 'kvm-updates/2.6.37' of git://git.kernel.org/pub/scm/virt/kvm/kvm: KVM: i8259: initialize isr_ack KVM: MMU: Fix incorrect direct gfn for unpaged mode shadow commit a1a54303d1c58709a0c16402942d6dede2f69f43 Merge: d864b7b4d69d2fd5a3f129d27ad0bb4fc81cc32b ea78484bd508d582f543ff727c9a53a381c15895 Author: Linus Torvalds Date: Sun Jan 2 10:43:51 2011 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: ALSA: hda: Use LPIB quirk for Dell Inspiron m101z/1120 sound: Prevent buffer overflow in OSS load_mixer_volumes ASoC: codecs: wm8753: Fix register cache incoherency ASoC: codecs: wm9090: Fix register cache incoherency ASoC: codecs: wm8962: Fix register cache incoherency ASoC: codecs: wm8955: Fix register cache incoherency ASoC: codecs: wm8904: Fix register cache incoherency ASoC: codecs: wm8741: Fix register cache incoherency ASoC: codecs: wm8523: Fix register cache incoherency ASoC: codecs: max98088: Fix register cache incoherency ASoC: codecs: Add missing control_type initialization commit d864b7b4d69d2fd5a3f129d27ad0bb4fc81cc32b Merge: 3643e0e87c13c670a0fdcd0c34401b38b36ff021 7ad1227818f09242cfe9bf1845fd24211f5f99bd Author: Linus Torvalds Date: Sun Jan 2 10:37:19 2011 -0800 Merge branch 'rc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6 * 'rc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6: kconfig: fix undesirable side effect of adding "visible" menu attribute commit 15095bb0fe779c0403091bda7adce5fb3bb9ca35 Author: Russell King Date: Sun Jan 2 15:05:21 2011 +0000 ARM: TWD: enable one-shot mode Allow one shot timer mode to be used with the TWD. This allows NOHZ mode to be used on SMP systems using the TWD localtimer. Tested on Versatile Express and U8500. Tested-by: Linus Walleij Signed-off-by: Russell King commit ea78484bd508d582f543ff727c9a53a381c15895 Merge: e03fa055bc126e536c7f65862e08a9b143138ea9 776065e36de1d5eb9e33ff908352fef4050ab38d Author: Takashi Iwai Date: Sun Jan 2 11:01:55 2011 +0100 Merge branch 'fix/asoc' into for-linus commit d0dfc6b74a0c6e9ee46b62713256e2b025244d3c Author: Avi Kivity Date: Fri Dec 31 10:52:15 2010 +0200 KVM: i8259: initialize isr_ack isr_ack is never initialized. So, until the first PIC reset, interrupts may fail to be injected. This can cause Windows XP to fail to boot, as reported in the fallout from the fix to https://bugzilla.kernel.org/show_bug.cgi?id=21962. Reported-and-tested-by: Nicolas Prochazka Signed-off-by: Avi Kivity commit 40cd201e37073b3e2281cf2c73fcf5674f22267f Author: Paul Gortmaker Date: Sat Jan 1 14:56:18 2011 -0800 tipc: update log.h re-include protection to reflect new name The tipc/dbg.h file was recently renamed to tipc/log.h, but the re-include define was not updated accordingly. Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 0885a30b699a2c96d892b61cc48e8ba68fe87bfc Author: stephen hemminger Date: Fri Dec 31 15:34:27 2010 +0000 sky2: implement 64 bit stats This implements 64 bit statistics support and fixes races when reading counter values. The PHY counters can only be accessed 16 bits at a time, so they are subject to carry races. NB: * TX/RX counters are maintained in software because the the hardware packet count is only a 32 bit value. * Error counters are really only 32 bit. * Old 32 bit counter fields in dev->stats still used for some software counters Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller commit a016892cd6eb8d3dd9769021b088917ac7371abd Author: Allan Stephens Date: Fri Dec 31 18:59:35 2010 +0000 tipc: remove extraneous braces from single statements Cleans up TIPC's source code to eliminate the presence of unnecessary use of {} around single statements. These changes are purely cosmetic and do not alter the operation of TIPC in any way. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit e3ec9c7d5eea9adf2c604c623c987360cc700b88 Author: Allan Stephens Date: Fri Dec 31 18:59:34 2010 +0000 tipc: remove zeroing assignments to static global variables Cleans up TIPC's source code to eliminate the needless initialization of static variables to zero. These changes are purely cosmetic and do not alter the operation of TIPC in any way. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 2db9983a4318818845193bd577879c0620705e82 Author: Allan Stephens Date: Fri Dec 31 18:59:33 2010 +0000 tipc: split variable assignments out of conditional expressions Cleans up TIPC's source code to eliminate assigning values to variables within conditional expressions, improving code readability and reducing warnings from various code checker tools. These changes are purely cosmetic and do not alter the operation of TIPC in any way. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 0e65967e33be61e5f67727edd4ea829b47676fc0 Author: Allan Stephens Date: Fri Dec 31 18:59:32 2010 +0000 tipc: cleanup various cosmetic whitespace issues Cleans up TIPC's source code to eliminate deviations from generally accepted coding conventions relating to leading/trailing white space and white space around commas, braces, cases, and sizeof. These changes are purely cosmetic and do not alter the operation of TIPC in any way. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 25860c3bd5bd1db236d4fd5826d76127d677dc28 Author: Paul Gortmaker Date: Fri Dec 31 18:59:31 2010 +0000 tipc: recode getsockopt error handling for better readability The existing code for the copy to user and error handling at the end of getsockopt isn't easy to follow, due to the excessive use of if/else. By simply using return where appropriate, it can be made smaller and easier to follow at the same time. Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit e83504f72456809cdbdbc91700d3ba6370c9da1c Author: Allan Stephens Date: Fri Dec 31 18:59:30 2010 +0000 tipc: remove pointless check for NULL prior to kfree It is acceptable to call kfree() with NULL, so these checks are not serving any useful purpose. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 886ef52a8ce6930a9d0c58267d5b5038ac3e8d30 Author: Allan Stephens Date: Fri Dec 31 18:59:29 2010 +0000 tipc: remove redundant #includes Eliminates a number of #include statements that no longer serve any useful purpose. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 6e7e309c62ab584348e0fef90c8e3e48f634dba1 Author: Allan Stephens Date: Fri Dec 31 18:59:28 2010 +0000 tipc: Finish streamlining of debugging code Completes the simplification of TIPC's debugging capabilities. By default TIPC includes no debugging code, and any debugging code added by developers that calls the dbg() and dbg_macros() is compiled out. If debugging support is enabled, TIPC prints out some additional data about its internal state when certain abnormal conditions occur, and any developer-added calls to the TIPC debug macros are compiled in. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 8d64a5ba58157dedc61f3f1f51e1c5d66f32a484 Author: Allan Stephens Date: Fri Dec 31 18:59:27 2010 +0000 tipc: Prune down link-specific debugging code Eliminates most link-specific debugging code in TIPC, which is now largely unnecessary. All calls to the link-specific debugging macros have been removed, as are the macros themselves; in addition, the optional allocation of print buffers to hold debugging information for each link endpoint has been removed. The ability for TIPC to print out helpful diagnostic information when link retransmit failures occur has been retained for the time being, as an aid in tracking down the cause of such failures. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 7ced6890bf81d311ab2ea846f92d5f3d0951c08c Author: Allan Stephens Date: Fri Dec 31 18:59:26 2010 +0000 tipc: remove dump() and tipc_dump_dbg() Eliminates calls to two debugging macros that are being completely obsoleted, as well as any associated debugging routines that are no longer required. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit b29f14284989b3d0b3a5ce268b5b1fc4df9c5795 Author: Allan Stephens Date: Fri Dec 31 18:59:25 2010 +0000 tipc: remove calls to dbg() and msg_dbg() Eliminates obsolete calls to two of TIPC's main debugging macros, as well as a pair of associated debugging routines that are no longer required. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit f5e75269f59f7c3816f23314b924895e4ecf8409 Author: Allan Stephens Date: Fri Dec 31 18:59:24 2010 +0000 tipc: rename dbg.[ch] to log.[ch] As the first step in removing obsolete debugging code from TIPC the files that implement TIPC's non-debug-related log buffer subsystem are renamed to better reflect their true nature. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 5af5479296fba0ace5d5cab84045de5b19bde3fe Author: Allan Stephens Date: Fri Dec 31 18:59:23 2010 +0000 tipc: Remove internal linked list of node objects Eliminates a sorted list TIPC uses to keep track of the neighboring nodes it has links to, since this duplicates information already present in the internal array of node object pointers. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit b0c1e928c85023c73780b5d9873406ccf1cd8019 Author: Allan Stephens Date: Fri Dec 31 18:59:22 2010 +0000 tipc: Remove user registry subsystem Eliminates routines, data structures, and files that make up TIPC's user registry. The user registry is no longer needed since the native API routines that utilized it no longer exist and there are no longer any internal TIPC services that use it. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit aa70200e001fc4d76552c974c94f65ab26020203 Author: Allan Stephens Date: Fri Dec 31 18:59:21 2010 +0000 tipc: Eliminate use of user registry by topology service Simplifies TIPC's network topology service so that it no longer registers its ports with the user registry, since the service doesn't take advantage of any of the registry's capabilities. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 7a488fd3d40a127d0d6057ecd2696f39e11e63c3 Author: Allan Stephens Date: Fri Dec 31 18:59:20 2010 +0000 tipc: Eliminate use of user registry by configuration service Simplifies TIPC's configuration service so that it no longer registers its port with the user registry, since the service doesn't take advantage of any of the registry's capabilities. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 8f92df6ad49da958d97e171762d0a97a3dc738f1 Author: Allan Stephens Date: Fri Dec 31 18:59:19 2010 +0000 tipc: Remove prototype code for supporting multiple clusters Eliminates routines, data structures, and files that were intended to allow TIPC to support a network containing multiple clusters. Currently, TIPC supports only networks consisting of a single cluster within a single zone, so this code is unnecessary. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 51a8e4dee7653698ba4c6e7de71053665f075273 Author: Allan Stephens Date: Fri Dec 31 18:59:18 2010 +0000 tipc: Remove prototype code for supporting inter-cluster routing Eliminates routines and data structures that were intended to allow TIPC to route messages to other clusters. Currently, TIPC supports only networks consisting of a single cluster within a single zone, so this code is unnecessary. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 08c80e9a031df0a8f0269477a32f5eae47d7a146 Author: Allan Stephens Date: Fri Dec 31 18:59:17 2010 +0000 tipc: Remove prototype code for supporting slave nodes Simplifies routines and data structures that were intended to allow TIPC to support slave nodes (i.e. nodes that did not have links to all of the other nodes in its cluster, forcing TIPC to route messages that it could not deliver directly through a non-slave node). Currently, TIPC supports only networks containing non-slave nodes, so this code is unnecessary. Note: The latest edition of the TIPC 2.0 Specification has eliminated the concept of slave nodes entirely. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 51f98a8d70583b18cb08b19353aeed5efb0244af Author: Allan Stephens Date: Fri Dec 31 18:59:16 2010 +0000 tipc: Remove prototype code for supporting multiple zones Eliminates routines, data structures, and files that were intended to allows TIPC to support a network containing multiple zones. Currently, TIPC supports only networks consisting of a single cluster within a single zone, so this code is unnecessary. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit aa6027cacdd912ce884953714fcc7392b6155bc6 Author: Eric Dumazet Date: Sat Jan 1 05:22:46 2011 +0000 tg3: fix warnings In case CONFIG_PM_SLEEP is disabled, we dont need tg3_suspend() and tg3_resume(). drivers/net/tg3.c:15056: warning: ‘tg3_suspend’ defined but not used drivers/net/tg3.c:15110: warning: ‘tg3_resume’ defined but not used Signed-off-by: Eric Dumazet Cc: Rafael J. Wysocki Cc: Michael Chan Cc: Matt Carlson Signed-off-by: David S. Miller commit a4f740cf33f7f6c164bbde3c0cdbcc77b0c4997c Author: Grant Likely Date: Sat Oct 30 11:49:09 2010 -0400 of/flattree: Add of_flat_dt_match() helper function This patch adds of_flat_dt_match() which tests a node for compatibility with a list of values and converts the relevant powerpc platform code to use it. This approach simplifies the board support code a bit. Signed-off-by: Grant Likely Reviewed-by: Stephen Neuendorffer commit 77e58efd134b553d723fd963f436920a6aaaa6df Author: Justin P. Mattock Date: Fri Dec 31 09:50:31 2010 -0800 spi/topcliff: Typo fix threhold to threshold Signed-off-by: Justin P. Mattock Signed-off-by: Grant Likely commit b9556f9a1abdc56a179ac7ba6053469373b6de0f Author: Julia Lawall Date: Wed Dec 29 04:01:03 2010 +0000 drivers/atm/atmtcp.c: add missing atm_dev_put The earlier call to atm_dev_lookup increases the reference count of dev, so decrease it on the way out. The semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // @@ expression x, E; constant C; @@ x = atm_dev_lookup(...); ... when != false x != NULL when != true x == NULL when != \(E = x\|x = E\) when != atm_dev_put(dev); *return -C; // Signed-off-by: Julia Lawall Signed-off-by: David S. Miller commit 7dbf6acdbad2fbc6eea72b58404461dcb7c6d9d2 Author: stephen hemminger Date: Thu Dec 30 08:52:29 2010 +0000 skge: Do not use legacy PCI power management The skge driver used the legacy PCI power management, and did its own PCI callbacks. Use the same code model as Rafael's changes to sky2. Let the PCI subsystem take care of all the PCI-specific aspects of device handling during system power transitions. Compile tested only (so far). Signed-off-by: Stephen Hemminger Acked-by: Rafael J. Wysocki Signed-off-by: David S. Miller commit 18c8d82ae5b802c5d82e0dfbcc08b1b568955f46 Author: Eric Dumazet Date: Fri Dec 31 12:48:55 2010 -0800 sfq: fix slot_dequeue_head() slot_dequeue_head() should make sure slot skb chain is correct in both ways, or we can crash if all possible flows are in use. Jarek pointed out slot_queue_init() can now be done in sfq_init() once, instead each time a flow is setup. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit eeaeb068f1393b4db4861481bf594bcd1c3eda7a Author: Eric Dumazet Date: Tue Dec 28 21:53:33 2010 +0000 sch_sfq: allow big packets and be fair SFQ is currently 'limited' to small packets, because it uses a 15bit allotment number per flow. Introduce a scale by 8, so that we can handle full size TSO/GRO packets. Use appropriate handling to make sure allot is positive before a new packet is dequeued, so that fairness is respected. Signed-off-by: Eric Dumazet Acked-by: Jarek Poplawski Cc: Patrick McHardy Signed-off-by: David S. Miller commit f4d5900a99dbc354ef1ba384d445ff80ae4d77b4 Author: Ben Hutchings Date: Wed Dec 29 04:26:17 2010 +0000 starfire: Fix dma_addr_t size test for MIPS Commit 56543af "starfire: use BUILD_BUG_ON for netdrv_addr_t" revealed that the preprocessor condition used to find the size of dma_addr_t yielded the wrong result for some architectures and configurations. This was kluged for 64-bit PowerPC in commit 3e502e6 by adding yet another case to the condition. However, 64-bit MIPS configurations are not detected reliably either. This should be fixed by using CONFIG_ARCH_DMA_ADDR_T_64BIT, but that isn't yet defined everywhere it should be. Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 824f5f38d3005c346a043dedcfe8b048b699b81a Author: David Sterba Date: Wed Dec 29 03:40:31 2010 +0000 tg3: fix return value check in tg3_read_vpd() Besides -ETIMEDOUT and -EINTR, pci_read_vpd may return other error values like -ENODEV or -EINVAL which are ignored due to the buggy check, but the data are not read from VPD anyway and this is checked subsequently with at most 3 needless loop iterations. This does not show up as a runtime bug. CC: Matt Carlson CC: Michael Chan Signed-off-by: David Sterba Signed-off-by: David S. Miller commit f7e4c9775ea648deed4a8193951e50d0c7706173 Author: Jesper Juhl Date: Fri Dec 31 11:18:48 2010 -0800 Broadcom CNIC core network driver: fix mem leak on allocation failures in cnic_alloc_uio_rings() We are leaking memory in drivers/net/cnic.c::cnic_alloc_uio_rings() if either of the calls to dma_alloc_coherent() fail. This patch fixes it by freeing both the memory allocated with kzalloc() and memory allocated with previous calls to dma_alloc_coherent() when there's a failure. Thanks to Joe Perches for suggesting a better implementation than my initial version. Signed-off-by: Jesper Juhl Acked-by: Michael Chan Signed-off-by: David S. Miller commit 2393c944d5d60eedaede80273ede8a816b5fa3e0 Author: Jesper Juhl Date: Sun Dec 26 09:59:58 2010 +0000 ISDN, Gigaset: Fix memory leak in do_disconnect_req() Hi, In drivers/isdn/gigaset/capi.c::do_disconnect_req() we will leak the memory allocated (with kmalloc) to 'b3cmsg' if the call to alloc_skb() fails. ... b3cmsg = kmalloc(sizeof(*b3cmsg), GFP_KERNEL); allocation here ------^ if (!b3cmsg) { dev_err(cs->dev, "%s: out of memory\n", __func__); send_conf(iif, ap, skb, CAPI_MSGOSRESOURCEERR); return; } capi_cmsg_header(b3cmsg, ap->id, CAPI_DISCONNECT_B3, CAPI_IND, ap->nextMessageNumber++, cmsg->adr.adrPLCI | (1 << 16)); b3cmsg->Reason_B3 = CapiProtocolErrorLayer1; b3skb = alloc_skb(CAPI_DISCONNECT_B3_IND_BASELEN, GFP_KERNEL); if (b3skb == NULL) { dev_err(cs->dev, "%s: out of memory\n", __func__); send_conf(iif, ap, skb, CAPI_MSGOSRESOURCEERR); return; leak here ------^ ... This leak is easily fixed by just kfree()'ing the memory allocated to 'b3cmsg' right before we return. The following patch does that. Signed-off-by: Jesper Juhl Acked-by: Tilman Schmidt Signed-off-by: David S. Miller commit 0f333d10e3f689640b229c8cf00b16ea51ce4951 Author: Rafael J. Wysocki Date: Sun Dec 26 08:44:32 2010 +0000 sky2: Do not use legacy PCI power management The sky2 driver uses the legacy PCI power management, so it has to do some PCI-specific things in its ->suspend() and ->resume() callbacks, which isn't necessary and should better be done by the PCI sybsystem-level power management code. Moreover, it uses device_set_wakeup_enable() incorrectly (that function should be used when the WoL setting is changed rather than during suspend). Convert sky2 to the new PCI power management framework and make it let the PCI subsystem take care of all the PCI-specific aspects of device handling during system power transitions. Tested on a desktop machine with a Marvell 88E8056 PCI-E adapter. Signed-off-by: Rafael J. Wysocki Acked-by: Stephen Hemminger Signed-off-by: David S. Miller commit c866b7eac073198cef03ea6bac2dc978635a9f5c Author: Rafael J. Wysocki Date: Sat Dec 25 12:56:23 2010 +0000 tg3: Do not use legacy PCI power management The tg3 driver uses the legacy PCI power management, so it has to do some PCI-specific things in its ->suspend() and ->resume() callbacks, which isn't necessary and should better be done by the PCI sybsystem-level power management code. Convert tg3 to the new PCI power management framework and make it let the PCI subsystem take care of all the PCI-specific aspects of device handling during system power transitions. Tested on HP nx6325 with a NetXtreme BCM5788 adapter. Signed-off-by: Rafael J. Wysocki Signed-off-by: David S. Miller commit 9f260e0efa4766e56d0ac14f1aeea6ee5eb8fe83 Author: Dan Rosenberg Date: Sun Dec 26 06:54:53 2010 +0000 CAN: Use inode instead of kernel address for /proc file Since the socket address is just being used as a unique identifier, its inode number is an alternative that does not leak potentially sensitive information. CC-ing stable because MITRE has assigned CVE-2010-4565 to the issue. Signed-off-by: Dan Rosenberg Acked-by: Oliver Hartkopp Signed-off-by: David S. Miller commit f5260f02e7903bb10e45b1bf3500eab6425edf5c Author: Dan Carpenter Date: Sat Dec 25 12:23:42 2010 +0000 USB: cdc_ether: remove unneeded check We already verified that "dev->udev->actconfig->extralen" was non-zero so "len" is non-zero here as well. Signed-off-by: Dan Carpenter Acked-by: Oliver Neukum Signed-off-by: David S. Miller commit 0268102d53c872b42e214f95492065c8058b042e Author: Michael Chan Date: Fri Dec 31 11:04:02 2010 -0800 bnx2: Update firmware and version Update MIPS firmware to 6.2.1, with improved small packet performance in RSS mode, and iSCSI CID allocation bug fix on 5708. Update driver version to 2.0.21. Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit a29ba9d2d84889686a3af1c5a6023f28be75ccba Author: Michael Chan Date: Fri Dec 31 11:03:14 2010 -0800 bnx2: Free IRQ before freeing status block memory When changing ring size, we free all memory including status block memory. If we're in INTA mode and sharing IRQ, the IRQ handler can be called and it will reference the NULL status block pointer. Because of the lockless design of the IRQ handler, there is no simple way to synchronize and prevent this. So we avoid this problem by freeing the IRQ handler before freeing the status block memory. Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit 0438a1b24437cf007ed0e0f5f6b414d5b49468dc Author: Amit Kumar Salecha Date: Fri Dec 31 10:55:38 2010 -0800 netxen: update module description This driver supports only Intelligent Ethernet Adapters. Signed-off-by: Amit Kumar Salecha Signed-off-by: David S. Miller commit 7c14c3f10e6dcd7f70e49f77b6e1ae605c4861e6 Author: Shmulik Ravid Date: Thu Dec 30 06:27:10 2010 +0000 dcbnl: cleanup A couple of small cleanups for patches: [net-next-2.6 PATCH 1/3] dcbnl: add support for ieee8021Qaz attributes [net-next-2.6 PATCH 2/3] dcbnl: add appliction tlv handlers [net-next-2.6 PATCH 3/3] net_dcb: add application notifiers Signed-off-by: Shmulik Ravid Signed-off-by: David S. Miller commit 785b9b1aebcb748fb7627ad4c12dffb7f4f91b55 Author: Shmulik Ravid Date: Thu Dec 30 06:27:03 2010 +0000 bnx2x: adding dcbnl support Adding dcbnl implementation to bnx2x allowing users to manage the embedded DCBX engine. This patch is dependent on the following patches: [net-next-2.6 PATCH 1/3] dcbnl: add support for ieee8021Qaz attributes [net-next-2.6 PATCH 2/3] dcbnl: add appliction tlv handlers [net-next-2.6 PATCH 3/3] net_dcb: add application notifiers Signed-off-by: Shmulik Ravid Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit ea45fe4e176a42d2396878f530cfdc8265bef37b Author: Shmulik Ravid Date: Thu Dec 30 06:26:55 2010 +0000 dcbnl: adding DCBX feature flags get-set Adding a pair of set-get routines to dcbnl for setting the negotiation flags of the various DCB features. Conforms to the CEE flavor of DCBX The user sets these flags (enable, advertise, willing) for each feature to be used by the DCBX engine. The 'get' routine returns which of the features is enabled after the negotiation. This patch is dependent on the following patches: [net-next-2.6 PATCH 1/3] dcbnl: add support for ieee8021Qaz attributes [net-next-2.6 PATCH 2/3] dcbnl: add appliction tlv handlers [net-next-2.6 PATCH 3/3] net_dcb: add application notifiers Signed-off-by: Shmulik Ravid Signed-off-by: David S. Miller commit 6241b6259b16aa390ff4bf50f520685b3801200b Author: Shmulik Ravid Date: Thu Dec 30 06:26:48 2010 +0000 dcbnl: adding DCBX engine capability Adding an optional DCBX capability and a pair for get-set routines for setting the device DCBX mode. The DCBX capability is a bit field of supported attributes. The user is expected to set the DCBX mode with a subset of the advertised attributes. This patch is dependent on the following patches: [net-next-2.6 PATCH 1/3] dcbnl: add support for ieee8021Qaz attributes [net-next-2.6 PATCH 2/3] dcbnl: add appliction tlv handlers [net-next-2.6 PATCH 3/3] net_dcb: add application notifiers Signed-off-by: Shmulik Ravid Acked-by: John Fastabend Signed-off-by: David S. Miller commit 96b99684e365f28d49bdb1221ca022b75cb91a98 Author: John Fastabend Date: Thu Dec 30 09:26:37 2010 +0000 net_dcb: add application notifiers DCBx applications priorities can be changed dynamically. If application stacks are expected to keep the skb priority consistent with the dcbx priority the stack will need to be notified when these changes occur. This patch adds application notifiers for the stack to register with. Signed-off-by: John Fastabend Signed-off-by: David S. Miller commit 9ab933ab2cc80f04690d6aa385b1110075c5e507 Author: John Fastabend Date: Thu Dec 30 09:26:31 2010 +0000 dcbnl: add appliction tlv handlers This patch adds application tlv handlers. Networking stacks may use the application priority to set the skb priority of their stack using the negoatiated dcbx priority. This patch provides the dcb_{get|set}app() routines for the stack to query these parameters. Notice lower layer drivers can use the dcbnl_ops routines if additional handling is needed. Perhaps in the firmware case for example Signed-off-by: John Fastabend Signed-off-by: Shmulik Ravid Signed-off-by: David S. Miller commit 3e29027af43728c2a91fe3f735ab2822edaf54a8 Author: John Fastabend Date: Thu Dec 30 09:25:46 2010 +0000 dcbnl: add support for ieee8021Qaz attributes The IEEE8021Qaz is the IEEE standard version of CEE. The standard has had enough significant changes from the CEE version that many of the CEE attributes have no meaning in the new spec or do not easily map to IEEE standards. Rather then attempt to create a complicated mapping between CEE and IEEE standards this patch adds a nested IEEE attribute to the list of DCB attributes. The policy is, [DCB_ATTR_IFNAME] [DCB_ATTR_STATE] ... [DCB_ATTR_IEEE] [DCB_ATTR_IEEE_ETS] [DCB_ATTR_IEEE_PFC] [DCB_ATTR_IEEE_APP_TABLE] [DCB_ATTR_IEEE_APP] ... The following dcbnl_rtnl_ops routines were added to handle the IEEE standard, int (*ieee_getets) (struct net_device *, struct ieee_ets *); int (*ieee_setets) (struct net_device *, struct ieee_ets *); int (*ieee_getpfc) (struct net_device *, struct ieee_pfc *); int (*ieee_setpfc) (struct net_device *, struct ieee_pfc *); int (*ieee_getapp) (struct net_device *, struct dcb_app *); int (*ieee_setapp) (struct net_device *, struct dcb_app *); Signed-off-by: John Fastabend Signed-off-by: David S. Miller commit bfcf72e4426da2fd8f8081a641385ffc3ccc2282 Author: Mike Christie Date: Fri Dec 31 02:22:22 2010 -0600 [SCSI] libiscsi: use bh locking instead of irq with session lock The session lock is taken in threads, timers, and bottom halves like softirqs and tasklets. All the code but iscsi_conn/session_failure take the session lock with the spin_lock_bh call. This was done because I thought some offload drivers would be calling these functions from a irq. They never did, so this patch has iscsi_conn/session_failure use the bh locking. Signed-off-by: Mike Christie Signed-off-by: James Bottomley commit f41d472179a0d7c8e8160c85180ab1124947068e Author: Mike Christie Date: Fri Dec 31 02:22:21 2010 -0600 [SCSI] libiscsi: do not take host lock in queuecommand iscsi_tcp, ib_iser, cxgb*, be2iscsi and bnx2i do not use the host lock and do not take the session lock against a irq, so this patch drops the DEF_SCSI_QCMD use. Instead we just take the session lock and disable bhs. Signed-off-by: Mike Christie Signed-off-by: James Bottomley commit 1227633a441363642cdbaf38c4241d071e917095 Author: Mike Christie Date: Fri Dec 31 02:22:20 2010 -0600 [SCSI] be2iscsi: fix null ptr when accessing task hdr If alloc_pdu fails then the task->hdr pointer may not be set. This adds a check for this case in the cleanup callback. Signed-off-by: Mike Christie Signed-off-by: James Bottomley commit bc7accec8788ada4f459461194c2b8fad94ed239 Author: Mike Christie Date: Fri Dec 31 02:22:19 2010 -0600 [SCSI] be2iscsi: fix gfp use in alloc_pdu The pdu allication callout is called from a spin lock and in the IO path so we cannot use GFP_KERNEL. This has the driver use GFP_ATOMIC. Signed-off-by: Mike Christie Signed-off-by: James Bottomley commit df4da5cdfca05b37b366b9c69925b68586969c1c Author: Mike Christie Date: Fri Dec 31 02:22:18 2010 -0600 [SCSI] libiscsi: add more informative failure message during iscsi scsi eh This adds a more informative error code and message for the iscsi scsi eh session drop paths. This allows you to distinguish if the session was dropped due to a connection failure vs the iscsi layer dropping the session due to scsi eh failure processing. Signed-off-by: Mike Christie Signed-off-by: James Bottomley commit 5c10007560589a2335a77cbc92347b1474518296 Author: Julia Lawall Date: Wed Dec 29 15:57:54 2010 +0100 [SCSI] gdth: Add missing call to gdth_ioctl_free Add missing call to gdth_ioctl_free before aborting. The semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // @@ expression buf,ha,len,addr,E; @@ buf = gdth_ioctl_alloc(ha, len, FALSE, &addr) ... when != false buf != NULL when != true buf == NULL when != \(E = buf\|buf = E\) when != gdth_ioctl_free(ha, len, buf, addr) *return ...; // Signed-off-by: Julia Lawall Signed-off-by: James Bottomley commit 9d1da730ee17e712c25c0b1e51653048f92d2385 Author: David Henningsson Date: Sun Dec 26 10:23:58 2010 -0300 [media] DVB: IR support for TechnoTrend CT-3650 Based on Waling Dijkstra's discovery that the IR works the same as on the TT-1500, this patch has been rewritten to fit with the rc_core infrastructure. Signed-off-by: David Henningsson Signed-off-by: Mauro Carvalho Chehab commit ebce9a3331f4dd1f39856dc4b79f539eb25f7f64 Author: Igor M. Liplianin Date: Fri Dec 31 02:04:38 2010 -0300 [media] cx23885, cimax2.c: Fix case of two CAM insertion irq For example boot up with two CAM inserted. Signed-off-by: Abylay Ospan Signed-off-by: Mauro Carvalho Chehab commit 21d33014108671cc6b02feda088f32bf26ce532d Author: Mariusz BiaÅ‚oÅ„czyk Date: Wed Dec 29 19:48:43 2010 -0300 [media] ir-nec-decoder: fix repeat key issue Fixing the problem with NEC protocol and repeating keys under the following circumstances. The problem occurs when there is a repeat code without properly decoded scancode. This leads to repeat the wrong (last decoded) scancode. An example from real life: I am pressing volume down, then several minutes later i am pressing volume up, but the real scancode is wrongly decoded and only a repeat event is emitted, so as a result volume is going down while i am holding volume up button. The patch fixes above problem using rc_keyup timeout (as pointed by Mauro). It just prevents key repeats if they appear after rc_keyup. Signed-off-by: Mariusz BiaÅ‚oÅ„czyk Signed-off-by: Mauro Carvalho Chehab commit 8f4bfadd200477acb6dcf41a45919dd37d01a6db Author: Jing Huang Date: Sun Dec 26 21:50:10 2010 -0800 [SCSI] bfa: remove unused defintions and misc cleanups This patch removes unused functions, data strucutres, and definitions. It also includes misc comment and formatting cleanups. Signed-off-by: Jing Huang Signed-off-by: James Bottomley commit 2f2f40a45845e52fbbe07bcd3e09ccff44feb01b Author: Jing Huang Date: Sun Dec 26 21:48:53 2010 -0800 [SCSI] bfa: remove inactive functions This patch removes some inactive functions and macros. Signed-off-by: Jing Huang Signed-off-by: James Bottomley commit d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359a Author: Jing Huang Date: Sun Dec 26 21:46:35 2010 -0800 [SCSI] bfa: replace bfa_assert with WARN_ON Signed-off-by: Jing Huang Signed-off-by: James Bottomley commit 2f263d9d4f0432e4f7a708c95fab82f83ec14947 Author: Justin P. Mattock Date: Thu Dec 30 15:07:51 2010 -0800 spi/dw_spi Typo change diable to disable. Signed-off-by: Justin P. Mattock Signed-off-by: Grant Likely commit ef98a2c0f2856f6b2aa87fd32d5b192afaeae518 Author: Randy Dunlap Date: Thu Dec 30 15:23:41 2010 -0300 [media] staging: se401 depends on USB Fix build errors by adding "depends on USB": ERROR: "usb_register_driver" [drivers/staging/se401/se401.ko] undefined! ERROR: "usb_alloc_urb" [drivers/staging/se401/se401.ko] undefined! ERROR: "usb_submit_urb" [drivers/staging/se401/se401.ko] undefined! ERROR: "usb_control_msg" [drivers/staging/se401/se401.ko] undefined! ERROR: "usb_free_urb" [drivers/staging/se401/se401.ko] undefined! ERROR: "usb_kill_urb" [drivers/staging/se401/se401.ko] undefined! ERROR: "usb_deregister" [drivers/staging/se401/se401.ko] undefined! Signed-off-by: Randy Dunlap Signed-off-by: Mauro Carvalho Chehab commit 798cf3144f8b7466533cf738740478e472677a01 Author: Randy Dunlap Date: Thu Dec 30 15:23:38 2010 -0300 [media] staging: usbvideo/vicam depends on USB Fix build errors by adding "depends on USB": ERROR: "usb_register_driver" [drivers/staging/usbvideo/vicam.ko] undefined! ERROR: "usb_bulk_msg" [drivers/staging/usbvideo/vicam.ko] undefined! ERROR: "usb_control_msg" [drivers/staging/usbvideo/vicam.ko] undefined! ERROR: "usb_deregister" [drivers/staging/usbvideo/vicam.ko] undefined! ERROR: "usb_get_dev" [drivers/staging/usbvideo/usbvideo.ko] undefined! ERROR: "usb_put_dev" [drivers/staging/usbvideo/usbvideo.ko] undefined! ERROR: "usb_free_urb" [drivers/staging/usbvideo/usbvideo.ko] undefined! ERROR: "usb_submit_urb" [drivers/staging/usbvideo/usbvideo.ko] undefined! ERROR: "usb_set_interface" [drivers/staging/usbvideo/usbvideo.ko] undefined! ERROR: "usb_kill_urb" [drivers/staging/usbvideo/usbvideo.ko] undefined! ERROR: "usb_register_driver" [drivers/staging/usbvideo/usbvideo.ko] undefined! ERROR: "usb_deregister" [drivers/staging/usbvideo/usbvideo.ko] undefined! ERROR: "usb_alloc_urb" [drivers/staging/usbvideo/usbvideo.ko] undefined! Signed-off-by: Randy Dunlap Signed-off-by: Mauro Carvalho Chehab commit 96e442c1b2ef2ba9476e5da2607ba666ce09664d Author: Alberto Panizzo Date: Thu Dec 2 07:43:37 2010 -0300 [media] soc_camera: Add the ability to bind regulators to soc_camedra devices In certain machines, camera devices are supplied directly by a number of regulators. This patch add the ability to drive these regulators directly by the soc_camera driver. Signed-off-by: Alberto Panizzo Signed-off-by: Guennadi Liakhovetski Signed-off-by: Mauro Carvalho Chehab commit 3153ac9c6208892ee237caccdbe2290f8247e236 Author: Alberto Panizzo Date: Thu Dec 2 11:53:28 2010 -0300 [media] V4L2: Add a v4l2-subdev (soc-camera) driver for OmniVision OV2640 sensor Signed-off-by: Alberto Panizzo Signed-off-by: Guennadi Liakhovetski Signed-off-by: Mauro Carvalho Chehab commit b6a633c18ba83c0c8e96759a31d356bfb77e2b5f Author: Guennadi Liakhovetski Date: Sat Dec 25 17:40:26 2010 -0300 [media] v4l: soc-camera: switch to .unlocked_ioctl Use the V4L mutex infrastructure in soc-camera core and drivers and switch to .unlocked_ioctl. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Mauro Carvalho Chehab commit c85bb69af09988f728aca825c11267c9d06ba32e Author: Guennadi Liakhovetski Date: Thu Dec 30 08:37:06 2010 -0300 [media] v4l: ov772x: simplify pointer dereference Use a more direct way to obtain a pointer to struct ov772x_priv, where the subdevice is available. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Mauro Carvalho Chehab commit 63c9718c1a4595d51f5b70ed4aed6cee5aea875b Author: David Cohen Date: Wed Dec 8 09:13:59 2010 -0300 [media] ov9640: fix OmniVision OV9640 sensor driver's priv data retrieving OmniVision OV9640 driver wasn't requesting properly its private data on I2C remove and video_probe functions. It was retrieving the V4L2 subdev struct address instead of priv struct's one. This patch fixes such problem. Signed-off-by: David Cohen Signed-off-by: Guennadi Liakhovetski Signed-off-by: Mauro Carvalho Chehab commit f7b74f76a3a5bcad4d2e8db76834253a63977545 Author: David Cohen Date: Wed Dec 8 09:13:58 2010 -0300 [media] ov9640: use macro to request OmniVision OV9640 sensor private data This cleanup patch creates macro to request OmniVision OV9640 private data, which increases readability. Signed-off-by: David Cohen Signed-off-by: Guennadi Liakhovetski Signed-off-by: Mauro Carvalho Chehab commit 3643e0e87c13c670a0fdcd0c34401b38b36ff021 Merge: e983dc2428164698571e1dd1b25c4322181adbac cc6455f82edd3f9da3b03870d41cde3cb22ad40d Author: Linus Torvalds Date: Thu Dec 30 12:09:26 2010 -0800 Merge branch 'drm-intel-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ickle/drm-intel * 'drm-intel-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ickle/drm-intel: drm/i915/dvo: Report LVDS attached to ch701x as connected Revert "drm/i915/bios: Reverse order of 100/120 Mhz SSC clocks" drm/i915: Verify Ironlake eDP presence on DP_A using the capability fuse drm/i915, intel_ips: When i915 loads after IPS, make IPS relink to i915. drm/i915/sdvo: Add hdmi connector properties after initing the connector drm/i915: Set the required VFMUNIT clock gating disable on Ironlake. commit e983dc2428164698571e1dd1b25c4322181adbac Author: Nitin Gupta Date: Thu Dec 30 04:07:58 2010 -0500 Revert "Staging: zram: work around oops due to startup ordering snafu" This reverts commit 7e24cce38a99f373450db67bf576fe73e8168d66 because it was never appropriate for mainline. Do not check for init flag before starting I/O - zram module is unusable without this fix. The oops mentioned in the reverted commit message was actually a problem only with the zram version as present in project's own repository where we allocate struct zram_stats_cpu upon device initialization. OTOH, In mainline/staging version of zram, we allocate struct stats upfront, so this oops cannot happen in mainline version. Checking for init_done flag in zram_make_request() results in a *no-op* for any I/O operation since we simply always return success. This flag is actually set when the first write occurs on a zram disk which triggers its initialization. Bug report: https://bugzilla.kernel.org/show_bug.cgi?id=25722 Reported-by: Dennis Jansen Signed-off-by: Nitin Gupta Cc: Anton Blanchard Cc: Andrew Morton Cc: Greg Kroah-Hartman Signed-off-by: Linus Torvalds commit ff20f1779b7f60a9682aa8d62f8ca3b650e4c360 Merge: ebb76ce16daf6908dc030dec1c00827d37129fe5 0bc463426ab5eb39e76df637b29a4f191d01b8a0 Author: Linus Torvalds Date: Thu Dec 30 10:07:44 2010 -0800 Merge branch 'merge-spi' of git://git.secretlab.ca/git/linux-2.6 * 'merge-spi' of git://git.secretlab.ca/git/linux-2.6: spi/m68knommu: Coldfire QSPI platform support spi/omap2_mcspi.c: Force CS to be in inactive state after off-mode transition commit ebb76ce16daf6908dc030dec1c00827d37129fe5 Author: KAMEZAWA Hiroyuki Date: Wed Dec 29 14:07:11 2010 -0800 memcg: fix wrong VM_BUG_ON() in try_charge()'s mm->owner check At __mem_cgroup_try_charge(), VM_BUG_ON(!mm->owner) is checked. But as commented in mem_cgroup_from_task(), mm->owner can be NULL in some racy case. This check of VM_BUG_ON() is bad. A possible story to hit this is at swapoff()->try_to_unuse(). It passes mm_struct to mem_cgroup_try_charge_swapin() while mm->owner is NULL. If we can't get proper mem_cgroup from swap_cgroup information, mm->owner is used as charge target and we see NULL. Cc: Daisuke Nishimura Cc: KOSAKI Motohiro Reported-by: Hugh Dickins Reported-by: Thomas Meyer Signed-off-by: KAMEZAWA Hiroyuki Reviewed-by: Balbir Singh Signed-off-by: Hugh Dickins Cc: stable@kernel.org Signed-off-by: Linus Torvalds commit b83be6f20a0e468f715b14225c9f897538dfe5ad Author: Christoph Hellwig Date: Thu Dec 16 12:04:54 2010 +0100 update Documentation/filesystems/Locking Mostly inspired by all the recent BKL removal changes, but a lot of older updates also weren't properly recorded. Signed-off-by: Christoph Hellwig Signed-off-by: Linus Torvalds commit 9804ed9e840c461f88b290dea43173e3eed37102 Author: Mauro Carvalho Chehab Date: Thu Dec 30 11:58:37 2010 -0300 [media] ivtv-i2c: Fix two warnings Fix two gcc warnings: drivers/media/video/ivtv/ivtv-i2c.c:170: warning: cast from pointer to integer of different size drivers/media/video/ivtv/ivtv-i2c.c:171: warning: cast from pointer to integer of different size $ gcc --version gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48) They seem bogus, but, as the original code also has problems with LE/BE, just change its implementation to be clear. Signed-off-by: Mauro Carvalho Chehab commit abfd013b665d21f57bc4b2e455b23c4cece0df9f Author: Mauro Carvalho Chehab Date: Thu Dec 30 09:51:19 2010 -0300 [media] staging/lirc: Update lirc TODO files Signed-off-by: Mauro Carvalho Chehab commit 6a23a520c07ba556ea2317b1f72f3d2eb002f991 Author: Mauro Carvalho Chehab Date: Thu Dec 30 09:05:12 2010 -0300 [media] cx88: Remove the obsolete i2c_adapter.id field Signed-off-by: Mauro Carvalho Chehab commit d7c7235695ef9cbbdc20bdeb8554dbf10f576ca1 Author: Andy Walls Date: Tue Dec 28 22:49:50 2010 -0300 [media] lirc_zilog: Remove use of deprecated struct i2c_adapter.id field Remove use of deprecated struct i2c_adapter.id field. In the process, perform different detection of the HD PVR's Z8 IR microcontroller versus the other Hauppauge cards with the Z8 IR microcontroller. Also added a comment about probe() function behavior that needs to be fixed. Signed-off-by: Andy Walls Signed-off-by: Mauro Carvalho Chehab commit a9cd591e29b6b50e1212de7b7a86ccd270f5c2a6 Author: Andy Walls Date: Tue Dec 28 22:47:46 2010 -0300 [media] ir-kbd-i2c: Add HD PVR IR Rx support to ir-kbd-i2c Add HD PVR IR Rx support to ir-kbd-i2c Signed-off-by: Andy Walls Signed-off-by: Mauro Carvalho Chehab commit ea6c06033f01216df504b0f337a350778a3bc80e Author: Andy Walls Date: Tue Dec 28 22:46:13 2010 -0300 [media] hdpvr: Add I2C and ir-kdb-i2c registration of the Zilog Z8 IR chip Adds I2C registration of the Zilog Z8F0811 IR microcontroller for either lirc_zilog or ir-kbd-i2c to use. This is a required step in removing lirc_zilog's use of the deprecated struct i2c_adapter.id field. Signed-off-by: Andy Walls Signed-off-by: Mauro Carvalho Chehab commit 41ca2b1ac269e2ed64e2562b91fa61cab0b19e7a Author: Mauro Carvalho Chehab Date: Thu Dec 30 08:37:33 2010 -0300 [media] Remove staging/lirc/lirc_i2c driver This driver duplicates the same functionality found at ir-kbd-i2c. There were a few missing key parsers that were added by the previous patches. The only thing left on lirc_i2c driver is the IR parsing for Asus TV-Box and Creative/VisionTek BreakOut-Box. Those devices use pcf8574 chip for IR. They are old video adapters with TV tuners. Their code were never merged upstream, and they are not chipped anymore. So, it is very unlikely that someone would have interests on porting them to the Linux Kernel. Due to that, let's remove lirc_i2c, as all the remaining functionality are already mapped via ir-kbd-i2c. Signed-off-by: Mauro Carvalho Chehab commit 8a6334fc91de3f58bbd3051d6f088e7f71a3becd Author: Mauro Carvalho Chehab Date: Thu Dec 30 10:25:12 2010 -0300 [media] ivtv-i2c: Don't use IR legacy mode for Zilog IR The Zilog IR entries are already handled by IR new code. So, remove its usage from the legacy IR support. Acked-by: Andy Walls Signed-off-by: Mauro Carvalho Chehab commit e1e2c57565635310209566a31a300e593f74cc22 Author: Mauro Carvalho Chehab Date: Thu Dec 30 08:31:10 2010 -0300 [media] ivtv: Add Adaptec Remote Controller lirc-i2c implements a get key logic for the Adaptec Remote Controller, at address 0x6b. The only driver that seems to have an Adaptec device is ivtv: $ git grep -i adaptec drivers/media drivers/media/video/cs53l32a.c: * cs53l32a (Adaptec AVC-2010 and AVC-2410) i2c ivtv driver. drivers/media/video/cs53l32a.c: * Audio source switching for Adaptec AVC-2410 added by Trev Jackson drivers/media/video/cs53l32a.c: /* Set cs53l32a internal register for Adaptec 2010/2410 setup */ drivers/media/video/ivtv/ivtv-cards.c:/* Adaptec VideOh! AVC-2410 card */ drivers/media/video/ivtv/ivtv-cards.c: { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ADAPTEC, 0x0093 }, drivers/media/video/ivtv/ivtv-cards.c: .name = "Adaptec VideOh! AVC-2410", drivers/media/video/ivtv/ivtv-cards.c:/* Adaptec VideOh! AVC-2010 card */ drivers/media/video/ivtv/ivtv-cards.c: { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ADAPTEC, 0x0092 }, drivers/media/video/ivtv/ivtv-cards.c: .name = "Adaptec VideOh! AVC-2010", drivers/media/video/ivtv/ivtv-cards.h:#define IVTV_CARD_AVC2410 7 /* Adaptec AVC-2410 */ drivers/media/video/ivtv/ivtv-cards.h:#define IVTV_CARD_AVC2010 8 /* Adaptec AVD-2010 (No Tuner) */ drivers/media/video/ivtv/ivtv-cards.h:#define IVTV_PCI_ID_ADAPTEC 0x9005 drivers/media/video/ivtv/ivtv-driver.c: "\t\t\t 8 = Adaptec AVC-2410\n" drivers/media/video/ivtv/ivtv-driver.c: "\t\t\t 9 = Adaptec AVC-2010\n" drivers/media/video/ivtv/ivtv-i2c.c: 0x6b, /* Adaptec IR */ There are two Adaptec cards defined there, but AVC-2010 doesn't have a remote controller. So, the logic at lirc_i2c seems to be for Adaptec AVC-2410. As we'll remove lirc_i2c from kernel, move the getkey code to ivtv driver, and use it for AVC-2410. Reviewed-by: Andy Walls Acked-by: Andy Walls Signed-off-by: Mauro Carvalho Chehab commit 1c0eb0ffb0d541bf05a4b422a629fa5986799313 Author: Mauro Carvalho Chehab Date: Thu Dec 30 08:02:51 2010 -0300 [media] cx88: Add RC logic for Leadtek PVR 2000 Currently, lirc-i2c has a decoding logic for Leadtek Remote Control. Move it to cx88, as we intend to remove lirc-i2c. For now, initialize LIRC remote keytable with RC_MAP_EMPTY, as we don't know its keymap yet. It would be nice to later check if is there any file on LIRC userspace with that keytable. Signed-off-by: Mauro Carvalho Chehab commit b22374544b981b82f7319a02e6b718fc796e9cfa Author: Mauro Carvalho Chehab Date: Thu Dec 30 08:01:01 2010 -0300 [media] bttv-input: Add a note about PV951 RC When comparing lirc-i2c and ir-kbd-i2c/bttv-input logic, a difference was noticed. As lirc-i2c will be removed soon, store the difference on a comment inside ir-kbd-i2c, in order to preserve the knowledge we have about that remote controller. Signed-off-by: Mauro Carvalho Chehab commit 8c11a94d86eb5489dc665bc566bf624e329d89fa Author: Russell King Date: Tue Dec 28 19:40:40 2010 +0000 ARM: mmci: Clean up MMCI announcement printk Make the MMCI announcement printk say which primecell part number has been found. Display the revision as an unsigned decimal, and display only the first 8 hex digits of the base address unless it's larger. Signed-off-by: Russell King commit cc6455f82edd3f9da3b03870d41cde3cb22ad40d Author: Chris Wilson Date: Thu Dec 30 12:54:00 2010 +0000 drm/i915/dvo: Report LVDS attached to ch701x as connected As we have already detected something attached to the chip during initialisation, always report the LVDS connector status as connected during probing. Signed-off-by: Chris Wilson commit bcfbbce822d219eb587acaba8a6e062bbeae4761 Author: Chris Wilson Date: Thu Dec 30 09:07:15 2010 +0000 Revert "drm/i915/bios: Reverse order of 100/120 Mhz SSC clocks" As I feared, whilst this fixed the clocks for the Lenovo U160, it broke many other machines. So lets reverts commit 448f53a1ede54eb854d036abf and search for the real bug. Reported-and-tested-by: Travis Hume [et al] Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=25842 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=32698 Signed-off-by: Chris Wilson commit e03fa055bc126e536c7f65862e08a9b143138ea9 Author: Daniel T Chen Date: Tue Dec 28 17:20:02 2010 -0500 ALSA: hda: Use LPIB quirk for Dell Inspiron m101z/1120 Sjoerd Simons reports that, without using position_fix=1, recording experiences overruns. Work around that by applying the LPIB quirk for his hardware. Reported-and-tested-by: Sjoerd Simons Cc: Signed-off-by: Daniel T Chen Signed-off-by: Takashi Iwai commit d81a12bc29ae4038770e05dce4ab7f26fd5880fb Author: Dan Rosenberg Date: Sat Dec 25 16:23:40 2010 -0500 sound: Prevent buffer overflow in OSS load_mixer_volumes The load_mixer_volumes() function, which can be triggered by unprivileged users via the SOUND_MIXER_SETLEVELS ioctl, is vulnerable to a buffer overflow. Because the provided "name" argument isn't guaranteed to be NULL terminated at the expected 32 bytes, it's possible to overflow past the end of the last element in the mixer_vols array. Further exploitation can result in an arbitrary kernel write (via subsequent calls to load_mixer_volumes()) leading to privilege escalation, or arbitrary kernel reads via get_mixer_levels(). In addition, the strcmp() may leak bytes beyond the mixer_vols array. Signed-off-by: Dan Rosenberg Cc: stable Signed-off-by: Takashi Iwai commit c1955b5f3a95717ce1f5235f6e9968da068e3183 Author: Tejun Heo Date: Sat Dec 18 16:30:48 2010 +0100 x86: Use this_cpu_inc_return for nmi counter this_cpu_inc_return() saves us a memory access there. Reviewed-by: Pekka Enberg Reviewed-by: Mathieu Desnoyers Acked-by: H. Peter Anvin Acked-by: Tejun Heo Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit 7b543a5334ff4ea2e3ad3b777fc23cdb8072a988 Author: Tejun Heo Date: Sat Dec 18 16:30:05 2010 +0100 x86: Replace uses of current_cpu_data with this_cpu ops Replace all uses of current_cpu_data with this_cpu operations on the per cpu structure cpu_info. The scala accesses are replaced with the matching this_cpu ops which results in smaller and more efficient code. In the long run, it might be a good idea to remove cpu_data() macro too and use per_cpu macro directly. tj: updated description Cc: Yinghai Lu Cc: Ingo Molnar Acked-by: H. Peter Anvin Acked-by: Tejun Heo Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit 0a3aee0da4402aa19b66e458038533c896fb80c6 Author: Tejun Heo Date: Sat Dec 18 16:28:55 2010 +0100 x86: Use this_cpu_ops to optimize code Go through x86 code and replace __get_cpu_var and get_cpu_var instances that refer to a scalar and are not used for address determinations. Cc: Yinghai Lu Cc: Ingo Molnar Acked-by: Tejun Heo Acked-by: "H. Peter Anvin" Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit 56f4c400349157289b474a3fd49ee96acab0a4d7 Merge: 32ae2ade462146729580117d9886cc9efd83dfbe da169f5df2764a6a937cb3b07562e269edfb1c0e Author: Ingo Molnar Date: Thu Dec 30 11:26:45 2010 +0100 Merge branch 'core' of git://git.kernel.org/pub/scm/linux/kernel/git/rric/oprofile into perf/core commit 61ea3aa5bf309333c6655ccef825b4a765bff219 Author: Hans Verkuil Date: Wed Dec 29 14:38:44 2010 -0300 [media] timblogiw: fix compile warning Fix 64-bit compile warning: drivers/media/video/timblogiw.c: In function ‘timblogiw_dma_filter_fn’: drivers/media/video/timblogiw.c:151: warning: cast from pointer to integer of different size drivers/media/video/timblogiw.c: In function ‘timblogiw_open’: drivers/media/video/timblogiw.c:670: warning: cast to pointer from integer of different size Signed-off-by: Hans Verkuil Cc: Richard Rojförs Signed-off-by: Mauro Carvalho Chehab commit 657f2271050beabe725ba101c1d840f51a41f33d Author: Hans Verkuil Date: Wed Dec 29 14:29:55 2010 -0300 [media] v4l: fix handling of v4l2_input.capabilities The v4l core sets the v4l2_input.capabilities field based on the supplied v4l2_ioctl_ops. However, several drivers do a memset or memcpy of the v4l2_input struct, thus overwriting that field incorrectly. Either remove the memset (which is already done by the v4l core), or add the proper capabilities field in case of a memcpy. The same is also true for v4l2_output, but that only affected the ivtv driver. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 3ea2b673a55cee528f83653e711d09425ed4d8b6 Author: Hans Verkuil Date: Wed Dec 29 14:28:13 2010 -0300 [media] em28xx: fix incorrect s_ctrl error code and wrong call to res_free Calling subdevs to handle s_ctrl returned a non-zero return code even if everything went fine. Calling STREAMOFF if no STREAMON happened earlier would hit a BUG_ON in res_free. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 02ac04805e6a753610d7dd1716181ccbd8e366af Author: Hans Verkuil Date: Wed Dec 29 14:27:05 2010 -0300 [media] v4l2-ctrls: only check def for menu, integer and boolean controls The 'def' field is only valid for menus, integers and booleans. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 513521eaee4375a1a0da0b73c7131a165a9fe4d9 Author: Hans Verkuil Date: Wed Dec 29 14:25:52 2010 -0300 [media] v4l2-ctrls: use const char * const * for the menu arrays This prevents checkpatch warnings generated when defining 'static const char *foo[]' arrays. It makes sense to use const char * const * anyway since the pointers in the array are indeed const. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 6d6a48e51fd3bcb40c5b88d0f9690ba960eedfd2 Author: Hans Verkuil Date: Wed Dec 29 13:53:21 2010 -0300 [media] usbvision: coding style Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 52cb0bf275debe4ec8950157f11b9d9f14447a88 Author: Hans Verkuil Date: Sun Dec 19 20:33:51 2010 -0300 [media] usbvision: convert // to /* */ Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 5490a7cbe65d63c6ec45f1013287af1e390c95d7 Author: Hans Verkuil Date: Sun Dec 19 20:21:36 2010 -0300 [media] usbvision: get rid of camelCase Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit c627b9d1f580f26fe99a8045d37a57f91e9aef66 Author: Hans Verkuil Date: Sat Dec 18 11:06:09 2010 -0300 [media] usbvision: convert to unlocked_ioctl Convert driver to use core-assisted locking. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit a6d38f889750ed6290728a19d9dad577b147c6d0 Author: Ping Cheng Date: Fri Dec 24 13:16:53 2010 -0800 Input: wacom_w8001 - support pen or touch only devices Not all penabled devices support touch. The same holds true for touch devices, so we should be setting up devices according to the results returned when we query the hardware. Signed-off-by: Ping Cheng Signed-off-by: Dmitry Torokhov commit 0bc463426ab5eb39e76df637b29a4f191d01b8a0 Author: Jate Sujjavanich Date: Wed Sep 29 09:44:32 2010 -0400 spi/m68knommu: Coldfire QSPI platform support After grabbing a msg from the msgq, the mcfqspi_work function calls list_del_init on the mcfqspi->msgq which unintentionally deletes the rest of the list before it can be processed. If qspi call was made using spi_sync, this can result in a process hang. Signed-off-by: Jate Sujjavanich Acked-by: Steven King Signed-off-by: Grant Likely commit 477ca3ad6ac5cdbd5bd40941fc22c6eedc9aa90d Author: Mingkai Hu Date: Wed Dec 1 17:29:18 2010 +0800 spi/fsl_espi: change the read behaviour of the SPIRF The user must read N bytes of SPIRF (1 <= N <= 4) that do not exceed the amount of data in the receive FIFO, so read the SPIRF byte by byte when the data in receive FIFO is less than 4 bytes. On Simics, when read N bytes that exceed the amout of data in receive FIFO, we can't read the data out, that is we can't clear the rx FIFO, then the CPU will loop on the espi rx interrupt. Signed-off-by: Mingkai Hu Signed-off-by: Grant Likely commit 73930a85cf38d72851305fcf640c07b4c13aa405 Author: Rob Herring Date: Wed Nov 17 17:50:23 2010 -0600 of_serial: explicitly include of_irq.h On PPC, of_irq.h gets implicitly included, but on other platforms it does not. Signed-off-by: Rob Herring Signed-off-by: Grant Likely commit fe14042358fac0673d4b6362a73796fd64379938 Author: Stephen Neuendorffer Date: Thu Nov 18 15:55:02 2010 -0800 of/flattree: Refactor unflatten_device_tree and add fdt_unflatten_tree unflatten_device_tree has two dependencies on things that happen during boot time. Firstly, it references the initial device tree directly. Secondly, it allocates memory using the early boot allocator. This patch factors out these dependencies and uses the new __unflatten_device_tree function to implement a driver-visible fdt_unflatten_tree function, which can be used to unflatten a blob after boot time. V2: - remove extra __va() call - make dt_alloc functions return void *. This doesn't fix the general strangeness in this code that constantly casts back and forth between unsigned long and __be32 * Signed-off-by: Stephen Neuendorffer Signed-off-by: Grant Likely commit 57d00ecf90cc9854973da2960012b734acc26e51 Author: Stephen Neuendorffer Date: Thu Nov 18 15:55:01 2010 -0800 of/flattree: Reorder unflatten_dt_node Move unflatten_dt_node to be grouped with non-__init functions. Signed-off-by: Stephen Neuendorffer Signed-off-by: Grant Likely commit a40d6c4cf12d87980c10b230df435d0f56adc40b Author: Stephen Neuendorffer Date: Thu Nov 18 15:55:00 2010 -0800 of/flattree: Refactor unflatten_dt_node unflatten_dt_node is a helper function that does most of the work to convert a device tree blob into tree of device nodes. This code now uses a passed-in blob instead of using the single boot-time blob, allowing it to be called in more contexts. Signed-off-by: Stephen Neuendorffer Signed-off-by: Grant Likely commit 9706a36e35c4ce04f28a62cfe1205b4e3b0dd13c Author: Stephen Neuendorffer Date: Thu Nov 18 15:54:59 2010 -0800 of/flattree: Add non-boottime device tree functions In preparation for providing run-time handling of device trees, factor out some of the basic functions so that they take an arbitrary blob, rather than relying on the single boot-time tree. V2: - functions have of_fdt_* names - removed find_flat_dt_string - blob argument is first Signed-off-by: Stephen Neuendorffer Signed-off-by: Grant Likely commit e6ce1324e4f08b0d984340201a125806dae0e9a6 Author: Stephen Neuendorffer Date: Thu Nov 18 15:54:56 2010 -0800 of/flattree: Add Kconfig for EARLY_FLATTREE The device tree code is now in two pieces: some which can be used generically on any platform which selects CONFIG_OF_FLATTREE, and some early which is used at boot time on only a few architectures. This patch segregates the early code so that only those architectures which care about it need compile it. This also means that some of the requirements in the early code (such as a cmd_line variable) that most architectures (e.g. X86) don't provide can be ignored. Signed-off-by: Stephen Neuendorffer [grant.likely@secretlab.ca: remove extra blank line addition] [grant.likely@secretlab.ca: fixed incorrect #ifdef CONFIG_EARLY_FLATTREE check] [grant.likely@secretlab.ca: Made OF_EARLY_FLATTREE select instead of depend on OF_FLATTREE] Signed-off-by: Grant Likely commit 7ad1227818f09242cfe9bf1845fd24211f5f99bd Author: Jan Beulich Date: Thu Dec 9 08:11:38 2010 +0000 kconfig: fix undesirable side effect of adding "visible" menu attribute This lead to non-selected, non-user-selectable options to be written out to .config. This is not only pointless, but also preventing the user to be prompted should any of those options eventually become visible (e.g. by de-selecting the *_AUTO options the "visible" attribute was added for. Furthermore it is quite logical for the "visible" attribute of a menu to control the visibility of all contained prompts, which is what the patch does. Signed-off-by: Jan Beulich Signed-off-by: Michal Marek commit 42ce7fd6319bed8ecb26d656c476365da46b29e9 Author: Gregory CLEMENT Date: Wed Dec 29 11:52:53 2010 +0100 spi/omap2_mcspi.c: Force CS to be in inactive state after off-mode transition When SPI wake up from OFF mode, CS is in the wrong state: force it to the inactive state. During the system life, I monitored the CS behavior using a oscilloscope. I also activated debug in omap2_mcspi, so I saw when driver disable the clocks and restore context when device is not used.Each time the CS was in the correct state. It was only when system was put suspend to ram with off-mode activated that on resume the CS was in wrong state( ie activated). Changelog: * Change from v1 to v2: - Rebase on linus/master (after 2.6.37-rc1) - Do some clean-up and fix indentation on both patches - Add more explanations for patch 2 * Change from v2 to v3: - Use directly resume function of spi_master instead of using function - from spi_device as Grant Likely pointed it out. - Force this transition explicitly for each CS used by a device. * Change from v3 to v4: - Patch clean-up according to Kevin Hilman and checkpatch. - Now force CS to be in inactive state only if it was inactive when it was suspended. * Change from v4 to v5: - Rebase on linus/master (after 2.6.37-rc3) - Collapse some lines as pointed by Grant Likely - Fix a spelling * Change from v5 to v6: - Rebase on linus/master (after 2.6.37-rc7) - Use CONFIG_SUSPEND instead of CONFIG_PM - Didn't use legacy PM methods anymore. Instead, add a struct dev_pm_ops and add the resume method there. - Fix multi-line comment style * Change from v6 to v7: - Rebase on linus/master (after 2.6.37-rc8) - Drop an extra line Signed-off-by: Gregory CLEMENT Acked-by: David Brownell Reviewed-by: Kevin Hilman Signed-off-by: Grant Likely commit 60ebe1568fd15b7ffa101acc645069e27d546ed6 Author: Sundar Iyer Date: Fri Dec 3 20:35:50 2010 +0530 ux500: add TC35893 keypad platform data Signed-off-by: Sundar Iyer Signed-off-by: Linus Walleij commit 09c730a488c32c2cadb31cdb8dcc4df528441197 Author: Sundar Iyer Date: Tue Dec 21 15:53:31 2010 +0530 input/tc3589x: add tc3589x keypad support Add support for the keypad controller module found on the TC3589X devices. This driver default adds the support for TC35893 device. Signed-off-by: Sundar Iyer Acked-by: Dmitry Torokhov [Some minor fixups for compilation] Signed-off-by: Linus Walleij commit 4ef9e11d6867f88951e30db910fa015300e31871 Author: Hillf Danton Date: Wed Dec 29 21:55:28 2010 +0800 fix freeing user_struct in user cache When racing on adding into user cache, the new allocated from mm slab is freed without putting user namespace. Since the user namespace is already operated by getting, putting has to be issued. Signed-off-by: Hillf Danton Acked-by: Serge Hallyn Cc: stable@kernel.org Signed-off-by: Linus Torvalds commit 96aebafa63418f447ddc823e40da341cc40553dd Author: Jesper Juhl Date: Fri Dec 24 21:28:56 2010 +0100 gen_init_cpio: Avoid race between call to stat() and call to open() In usr/gen_init_cpio.c::cpio_mkfile() a call to stat() is made based on pathname, subsequently the file is open()'ed and then the value of the initial stat() call is used to allocate a buffer. This is not safe since the file may change between the call to stat() and the call to open(). Safer to just open() the file and then do fstat() using the filedescriptor returned by open. Signed-off-by: Jesper Juhl Acked-by: Jeff Garzik Signed-off-by: Michal Marek commit cd8d60a20a4516016c117ac0f1ac7b06ff606f7e Author: Theodore Ts'o Date: Fri Dec 24 09:42:10 2010 -0500 kbuild: create linux-headers package in deb-pkg Create a linux-headers-$KVER.deb package which can be used to build external modules without having the source tree around. Signed-off-by: "Theodore Ts'o" Signed-off-by: Michal Marek commit 649497d1a3676020802ebba04a3d9bb31253adb5 Author: Avi Kivity Date: Tue Dec 28 12:09:07 2010 +0200 KVM: MMU: Fix incorrect direct gfn for unpaged mode shadow We use the physical address instead of the base gfn for the four PAE page directories we use in unpaged mode. When the guest accesses an address above 1GB that is backed by a large host page, a BUG_ON() in kvm_mmu_set_gfn() triggers. Resolves: https://bugzilla.kernel.org/show_bug.cgi?id=21962 Reported-and-tested-by: Nicolas Prochazka KVM-Stable-Tag. Signed-off-by: Avi Kivity commit 427aacfe1d0c540bf80e5243d18ba1272f9b756f Author: Dmitri Belimov Date: Tue Dec 28 21:49:07 2010 -0300 [media] tm6000: Fix mutex unbalance Hi Fix never unlocked mutex. No more crash after removing USB stick. With my best regards, Dmitry. Signed-off-by: Beholder Intl. Ltd. Dmitry Belimov Signed-off-by: Mauro Carvalho Chehab commit aa777a88b2d73f710b86b955e0c738af91e9e452 Author: Jean-François Moine Date: Tue Dec 28 07:39:13 2010 -0300 [media] gspca - sonixj: Bad clock for om6802 in 640x480 Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 71e84ea7f082eb02df6ef40f55d2c4a998f6e1df Author: Jean-François Moine Date: Tue Dec 28 07:35:27 2010 -0300 [media] gspca - stv06xx/st6422: Use the new video control mechanism Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 7e5f9059a807ce9b7a12b2402f5aeae9557c8049 Author: Jean-François Moine Date: Tue Dec 28 07:24:18 2010 -0300 [media] gspca - vc032x: Cleanup source Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 7fbee99aa2c73bdf47add9de58f646fa7713e7e5 Author: Jean-François Moine Date: Tue Dec 28 07:17:40 2010 -0300 [media] gspca - zc3xx: The sensor of the VF0250 is a GC0303 Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 49fb5e60f7e907126aac10af6577fac6fde684f6 Author: Jean-François Moine Date: Tue Dec 28 07:09:34 2010 -0300 [media] gspca - zc3xx: Use the new video control mechanism Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 7d55a84b0af47b2ec55e16c6dbc8df62a72ac749 Author: Jean-François Moine Date: Tue Dec 28 07:02:32 2010 -0300 [media] gspca - zc3xx: Keep sorted the device table Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 2bbf53bd176e36d1574eeec53bf710d94703535e Author: Jean-François Moine Date: Tue Dec 28 07:01:04 2010 -0300 [media] gspca: Bad comment Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 0aeb5ec74b0a95f1699040f0262a6fd5507d6e8f Author: Jean-François Moine Date: Tue Dec 28 06:59:04 2010 -0300 [media] gspca - pac7302/pac7311: Fix some warnings Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit d85185902fb669a92d4934b926f8016368e1ad06 Author: Jean-François Moine Date: Tue Dec 28 06:55:01 2010 -0300 [media] gspca - main: Fix some warnings Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 66832aef0694807f487a8ccc8871cea4e80d78c5 Author: Hans Verkuil Date: Mon Dec 27 12:27:50 2010 -0300 [media] bt819: the ioctls in the header are internal to the kernel Remove bt819.h from ioctl-number.txt and make a note in the header that these ioctls are for internal use only. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit b9218f2f15cdff8991ba041993bf40962c49fdd0 Author: Hans Verkuil Date: Mon Dec 27 12:22:46 2010 -0300 [media] saa6588: rename rds.h to saa6588.h The naming of the media/rds.h header suggested that it was a generic RDS header, when in fact it is just a saa6588 module API that is internal to the kernel. Rename the header and the struct and defines in it to make this clear. Also removed the header include in radio-si470x.h (not used anymore) and from ioctl-number.txt (it's internal to the kernel and never called from userspace). Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit a519d70e0cf346e946202ffcbeaf57a1748d0c03 Author: Vasiliy Kulikov Date: Fri Nov 19 15:41:49 2010 -0300 [media] media: video: pvrusb2: fix memory leak Use put_device() instead of kfree() because of device name leak. Signed-off-by: Vasiliy Kulikov Acked-by: Mike Isely Signed-off-by: Mauro Carvalho Chehab commit 9028f58f5d7e810a0e88b508ebe6a69daf7e3273 Author: Alexey Chernov <4ernov@gmail.com> Date: Mon Dec 6 17:09:53 2010 -0300 [media] support of GoTView PCI-E X5 3D Hybrid in cx23885 Some comments: 1. Everything initialize properly except radio. 2. All analog inputs (TV, composite, S-Video) are tested by myself in several TV norms (SECAM-D, PAL, NTSC), everything work fine. So the patch adds general support/detection of the card with working analog part, DVB part is not supported for now. Signed-off-by: Alexey Chernov <4ernov@gmail.com> Reviewed-by: Steven Toth Signed-off-by: Mauro Carvalho Chehab commit 5f63306d82131371f464c0e5b7ebe6a23a84c768 Author: Dan Carpenter Date: Mon Dec 27 21:04:58 2010 -0300 [media] cx231xx: use bitwise negate instead of logical Bitwise negate was intended here. INPUT_SEL_MASK is 0x30. Signed-off-by: Dan Carpenter Signed-off-by: Mauro Carvalho Chehab commit a3fa904ec79b94f0db7faed010ff94d42f7d1d47 Author: Mauro Carvalho Chehab Date: Mon Oct 25 17:51:15 2010 -0300 [media] em28xx: Fix audio input for Terratec Grabby The audio input line was wrong. Fix it. Cc: stable@kernel.org Signed-off-by: Mauro Carvalho Chehab commit b5fff5445a077af897e670e98ea54b9b440f8b63 Author: Mauro Carvalho Chehab Date: Tue Dec 28 08:13:50 2010 -0300 [media] cardlist: Update lists for em28xx and saa7134 PS.: The cardlists are auto-generated via scripts. Signed-off-by: Mauro Carvalho Chehab commit b7a0f2e793a52b306e682a0e2e9a0b6f0f0a730e Author: Ramiro Morales Date: Sun Dec 26 18:13:30 2010 -0300 [media] saa7134: Add support for Compro VideoMate Vista M1F Signed-off-by: Pavel Osnova Signed-off-by: Ramiro Morales Signed-off-by: Mauro Carvalho Chehab commit 44c6e2a7c2ec76dd495a0f330f9beac572a2fdd7 Author: Ang Way Chuang Date: Fri Dec 24 02:40:46 2010 -0300 [media] cx88-dvb.c: DVB net latency using Hauppauge HVR4000 A Hauppauge HVR 4000 is used on a School On Internet Asia (SOI Asia) project in order to carry IP traffic over ULE. However, there is an issue with high latency jitter. My boss, Husni, identified the problem and provided a patch for it. The default buffer size of 32 TS frames on cx88 causes the high latency, so our deployment changes that to 6 TS frames. This patch made the buffer size tunable, while keeping the default buffer size of 32 TS frames unchanged. Signed-off-by: Achmad Husni Thamrin Signed-off-by: Mauro Carvalho Chehab commit fe04164647588ec55937e6d696da1ebeca04d000 Author: Dan Carpenter Date: Thu Dec 23 16:38:53 2010 -0300 [media] cx231xxx: fix typo in saddr_len check The original code compared "saddr_len" with zero twice in a nonsensical way. I asked the list, and Andy Walls and Sri Deevi say that the second check should be if "saddr_len == 1". Signed-off-by: Dan Carpenter Signed-off-by: Srinivasa Deevi Signed-off-by: Mauro Carvalho Chehab commit 50155c25bf346b65fec8e215131df397b0a5ee6e Author: Anatolij Gustschin Date: Wed Dec 22 17:31:59 2010 -0300 [media] fsl_viu: add VIDIOC_QUERYSTD and VIDIOC_G_STD support VIDIOC_QUERYSTD and VIDIOC_G_STD ioctls are currently not supported in the FSL VIU driver. The decoder subdevice driver saa7115 extended by previous patch supports QUERYSTD for saa711x, so we add the appropriate ioctls to the VIU driver to be able to determine the video input's standard. Signed-off-by: Anatolij Gustschin Signed-off-by: Mauro Carvalho Chehab commit f9d7d787842e92bc768d282f37fc3056c5441ddb Author: Anatolij Gustschin Date: Wed Dec 22 17:31:58 2010 -0300 [media] saa7115: allow input standard autodetection for more chips Autodetect input's standard using field frequency detection feature (FIDT in status byte at 0x1F) of the chips saa7111/ saa7111a/saa7113/saa7114/saa7118. Signed-off-by: Anatolij Gustschin Signed-off-by: Mauro Carvalho Chehab commit 641d21167f66ef4c574ef4f586fec0ae32179acd Author: Dmitri Belimov Date: Wed Dec 22 05:57:46 2010 -0300 [media] tm6000: rework and fix IR Hi This patch didn't kill Stefan's remotes and just for upload my good part of code. 1. Add some code for show IR activity 2. Add filter for IR remotes 3. Split remotes to different types. 4. Fix stop interrupt pipe when isoc pipe started. When we decide general way of IR I'll add support our remotes. For our customers I'll made custom temporary patch without this part. Signed-off-by: Beholder Intl. Ltd. Dmitry Belimov Signed-off-by: Mauro Carvalho Chehab commit db9285f79b12286a3b525b41ab275796679c1dfa Author: David Henningsson Date: Mon Dec 27 15:45:19 2010 -0300 [media] MEDIA: RC: Provide full scancodes for TT-1500 remote control Add 0x15 prefix to scancodes for TT-1500 remote control. Signed-off-by: David Henningsson Signed-off-by: Mauro Carvalho Chehab commit 730726a6f90740a5954ca2fb1c74fad6f44a2c42 Author: David Henningsson Date: Mon Dec 27 15:41:58 2010 -0300 [media] DVB: Set scanmask for Budget/SAA7146 cards These devices do not return the full command+address, so set scanmask accordingly. Signed-off-by: David Henningsson Signed-off-by: Mauro Carvalho Chehab commit 2d5ca76f2b39a31313d7e54224c78b7b311e7dce Author: Mauro Carvalho Chehab Date: Mon Dec 27 18:17:12 2010 -0300 [media] dabusb: Move it to staging to be deprecated dabusb driver were conceived as an experimental driver for a test device. The driver never supported any shipped product, and, while there were some updates on it in 2003, for an ancient product, those changes were never submitted upstream. Also, there's no DocBook for its API, nor any upstream discussion. So, better to remove it, on .39. If later needed, we may rescue it from git logs. For now, let's move it to staging. Acked-by: Deti Fliegl Cc: Deti Fliegl Signed-off-by: Mauro Carvalho Chehab commit 0170f6bcb243cb9e86c953652f8e62fccb8108f1 Author: Mauro Carvalho Chehab Date: Mon Dec 27 13:00:04 2010 -0300 [media] streamzap: Fix a compilation warning when compiled builtin drivers/media/rc/streamzap.c: In function ‘streamzap_probe’: drivers/media/rc/streamzap.c:460:2: warning: statement with no effect Cc: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 465a9e3a2f494b0887db63b7b10bb9370145d9bc Author: Mauro Carvalho Chehab Date: Mon Dec 27 12:58:02 2010 -0300 [media] af9013: Fix a compilation warning drivers/media/dvb/frontends/af9013.c: In function ‘af9013_update_signal_strength.clone.0’: drivers/media/dvb/frontends/af9013.c:967:6: warning: ‘ret’ may be used uninitialized in this function Cc: Antti Palosaari Signed-off-by: Mauro Carvalho Chehab commit 187e7d3b9b4e0b6b1c171846592e679e58a84cd2 Author: Mauro Carvalho Chehab Date: Mon Dec 27 12:16:47 2010 -0300 [media] stv090x: Fix some compilation warnings A few typos at the driver are causing the following warnings: drivers/media/dvb/frontends/stv090x.c: In function ‘stv090x_start_search’: drivers/media/dvb/frontends/stv090x.c:1486:27: warning: comparison between ‘enum stv090x_search’ and ‘enum stv090x_delsys’ drivers/media/dvb/frontends/stv090x.c:1487:24: warning: comparison between ‘enum stv090x_search’ and ‘enum stv090x_delsys’ drivers/media/dvb/frontends/stv090x.c: In function ‘stv090x_optimize_track’: drivers/media/dvb/frontends/stv090x.c:2943:2: warning: case value ‘4’ not in enumerated type ‘enum stv090x_delsys’ The first two are due to the lack of using the delsys types STV090x_DVBS1/STV090x_DSS instead of STV090x_SEARCH_DVBS1/STV090x_SEARCH_DSS The second one is due to the usage of STV090x_UNKNOWN (enum stv090x_modulation) instead of STV090x_ERROR (enum stv090x_delsys). Cc: Manu Abraham Signed-off-by: Mauro Carvalho Chehab commit 95f18be2e4f74255b46fcc23a9718cca9c7375c9 Author: Mauro Carvalho Chehab Date: Mon Dec 27 12:00:03 2010 -0300 [media] gspca: Fix a warning for using len before filling it The check for status errors is now before the check for len. That's ok. However, the error printk's for the status error prints the URB length. This generates this error: drivers/media/video/gspca/gspca.c: In function ‘fill_frame’: drivers/media/video/gspca/gspca.c:305:9: warning: ‘len’ may be used uninitialized in this function The fix is as simple as moving the len init to happen before the checks. Cc: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 2e94b53c55d00b4d4d4b9e65007566f7fbffab7a Author: Mauro Carvalho Chehab Date: Mon Dec 27 11:55:07 2010 -0300 [media] dib7000m/dib7000p: Add support for TRANSMISSION_MODE_4K Fixes several warnings: drivers/media/dvb/frontends/dib7000m.c: In function ‘dib7000m_set_channel’: drivers/media/dvb/frontends/dib7000m.c:808:3: warning: case value ‘255’ not in enumerated type ‘fe_transmit_mode_t’ drivers/media/dvb/frontends/dib7000m.c:869:3: warning: case value ‘255’ not in enumerated type ‘fe_transmit_mode_t’ drivers/media/dvb/frontends/dib7000m.c: In function ‘dib7000m_tune’: drivers/media/dvb/frontends/dib7000m.c:1023:3: warning: case value ‘255’ not in enumerated type ‘fe_transmit_mode_t’ drivers/media/dvb/frontends/dib7000m.c:1033:3: warning: case value ‘255’ not in enumerated type ‘fe_transmit_mode_t’ drivers/media/dvb/frontends/dib7000m.c:1043:3: warning: case value ‘255’ not in enumerated type ‘fe_transmit_mode_t’ drivers/media/dvb/frontends/dib7000p.c: In function ‘dib7000p_set_channel’: drivers/media/dvb/frontends/dib7000p.c:720:3: warning: case value ‘255’ not in enumerated type ‘fe_transmit_mode_t’ drivers/media/dvb/frontends/dib7000p.c:773:3: warning: case value ‘255’ not in enumerated type ‘fe_transmit_mode_t’ drivers/media/dvb/frontends/dib7000p.c: In function ‘dib7000p_tune’: drivers/media/dvb/frontends/dib7000p.c:997:3: warning: case value ‘255’ not in enumerated type ‘fe_transmit_mode_t’ drivers/media/dvb/frontends/dib7000p.c:1007:3: warning: case value ‘255’ not in enumerated type ‘fe_transmit_mode_t’ drivers/media/dvb/frontends/dib7000p.c:1017:3: warning: case value ‘255’ not in enumerated type ‘fe_transmit_mode_t’ The drivers were prepared to support 4K carriers, but as the define were added later, they were using a "magic" value of 255. Cc: Patrick Boettcher Signed-off-by: Mauro Carvalho Chehab commit d78aa7292ad38b22ccb9cdba99293cedb52fb342 Author: Mauro Carvalho Chehab Date: Mon Dec 27 11:47:17 2010 -0300 [media] lirc_zilog: Fix a warning drivers/staging/lirc/lirc_zilog.c: In function ‘send_code’: drivers/staging/lirc/lirc_zilog.c:886:1: warning: label ‘done’ defined but not used Signed-off-by: Mauro Carvalho Chehab commit fce50ac80e38b1d205939ff7d4777536701263a6 Author: Mauro Carvalho Chehab Date: Mon Dec 27 11:44:50 2010 -0300 [media] radio-wl1273: Fix two warnings drivers/media/radio/radio-wl1273.c: In function ‘wl1273_fm_upload_firmware_patch’: drivers/media/radio/radio-wl1273.c:675:2: warning: ‘n’ may be used uninitialized in this function drivers/media/radio/radio-wl1273.c:675:2: warning: ‘i’ may be used uninitialized in this function Those vars are never initialized, and the debug message makes no sense, as it will show just two random values. Cc: Matti J. Aaltonen Signed-off-by: Mauro Carvalho Chehab commit 9ae2ae35f8a8a13997b9ec719ae7c151a2182e80 Author: Mauro Carvalho Chehab Date: Mon Dec 27 11:41:14 2010 -0300 [media] dmxdev: Fix a compilation warning due to a bad type drivers/media/dvb/dvb-core/dmxdev.c: In function ‘dvb_dmxdev_start_feed’: drivers/media/dvb/dvb-core/dmxdev.c:583:13: warning: comparison between ‘enum dmx_ts_pes’ and ‘enum ’ Signed-off-by: Mauro Carvalho Chehab commit 1035758d5bdcd6c2f7308a35185f1d6f3b6b5443 Author: Mauro Carvalho Chehab Date: Mon Dec 27 11:14:52 2010 -0300 [media] feature_removal_schedule.txt: mark VIDIOC_*_OLD ioctls to die There are some old broken definitions of ioctl's, where the read/write arguments were marked wrong. The last one were added on 2.6.6 kernel. Remove them, in order to cleanup some copy_from_user/copy_to_user logic done inside V4L core. Signed-off-by: Mauro Carvalho Chehab commit 0334c8a52a8578f7aef501a14f78004f931efe20 Author: Mauro Carvalho Chehab Date: Mon Dec 27 09:41:05 2010 -0300 [media] staging/lirc: Fix compilation when LIRC=m drivers/staging/lirc/lirc_bt829.c:141: undefined reference to `lirc_register_driver' drivers/built-in.o:(.rodata+0x20f68): undefined reference to `lirc_dev_fop_read' drivers/built-in.o:(.rodata+0x20f7c): undefined reference to `lirc_dev_fop_poll' drivers/built-in.o:(.rodata+0x20f8c): undefined reference to `lirc_dev_fop_open' drivers/built-in.o:(.rodata+0x20f94): undefined reference to `lirc_dev_fop_close' drivers/built-in.o:(.rodata+0x21030): undefined reference to `lirc_dev_fop_open' drivers/built-in.o:(.rodata+0x21038): undefined reference to `lirc_dev_fop_close' This happens when .config is like: CONFIG_LIRC=m CONFIG_IR_LIRC_CODEC=m CONFIG_LIRC_STAGING=y CONFIG_LIRC_BT829=y Don't allow that. Signed-off-by: Mauro Carvalho Chehab commit 22efe507705a8437255114f98d0d514524460be0 Author: Mauro Carvalho Chehab Date: Mon Dec 27 08:30:34 2010 -0300 [media] omap_vout: Remove an obsolete comment This comment mentions a field that doesn't exist, and talks about videodev.h that got removed. So, it doesn't make any sense to keep it. Reviewed-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 55fe25b418640fad04190103274841b2c907bacd Author: Mauro Carvalho Chehab Date: Mon Dec 27 08:27:05 2010 -0300 [media] Remove the old V4L1 v4lgrab.c file This example file uses the old V4L1 API. It also doesn't use libv4l. So, it is completely obsolete. A good example already exists at v4l-utils (v4l2grab.c): http://git.linuxtv.org/v4l-utils.git Reviewed-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 1fb03673b9eddb55a08174d0952c0a1c2438997e Author: Mauro Carvalho Chehab Date: Mon Dec 27 08:24:58 2010 -0300 [media] Fix videodev.h references at the V4L DocBook Reviewed-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 38af87869e7a255b6ba0f41bf53d2e7b0a54d13b Author: Mauro Carvalho Chehab Date: Mon Dec 27 08:13:12 2010 -0300 [media] Documentation/ioctl/ioctl-number.txt: Remove some now freed ioctl ranges The V4L1 removal patches removed a few ioctls. Update it at the docspace. Signed-off-by: Mauro Carvalho Chehab commit 88ae7624a6fe890e5a8ca57b25420f66e1389f8b Author: Mauro Carvalho Chehab Date: Mon Dec 27 07:47:54 2010 -0300 [media] V4L1 removal: Remove linux/videodev.h There's no sense on keeping it on 2.6.38, as nobody is using it anymore, at the kernel tree, and installing it at the userspace API. As two deprecated drivers still need it, move it to their internal directories. Reviewed-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 58c66df3e38ffb1d59cc5162bb9e07c859288034 Author: Mauro Carvalho Chehab Date: Mon Dec 27 07:38:48 2010 -0300 [media] Remove VIDEO_V4L1 Kconfig option There's no sense on keeping VIDEO_V4L1 Kconfig option just because of two deprecated drivers moved to staging scheduled to die on 2.6.39. Reviewed-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit f74e3d0eea5fd766230a0ef0d1c24a7960d6f8c2 Author: Mauro Carvalho Chehab Date: Mon Dec 27 07:33:41 2010 -0300 [media] staging: Add TODO files for se401 and usbvideo/vicam Signed-off-by: Mauro Carvalho Chehab commit ddda424999817fbc17adf9013feb066903382ede Author: Andy Walls Date: Sun Dec 19 21:59:56 2010 -0300 [media] ivtv: Return EFAULT when copy_from_user() fails in ivtv_write_vbi_from_user() If write() on a VBI device node fails due to a bad buffer pointer from userspace, we should notify the application properly with EFAULT, per the V4L2 API spec. Signed-off-by: Andy Walls Signed-off-by: Mauro Carvalho Chehab commit b0c45686c8e8aecc7b0cd04d9b6af48d74418d53 Author: Andy Walls Date: Sat Dec 18 10:48:17 2010 -0300 [media] ivtv: ivtv_write_vbi() should use copy_from_user() for user data buffers ivtv_write_vbi() is used for both VBI data that came from the driver internally and VBI data that came from the user. However, it did not use copy_from_user() for reading the VBI data from the user buffers. This change adds a new version of the function, ivtv_write_vbi_from_user(), that uses copy_from_user() to read the VBI data provided via user buffers. This should resolve a sparse build warning reported by Dave Gilbert. Reported-by: Dr. David Alan Gilbert Signed-off-by: Andy Walls Signed-off-by: Mauro Carvalho Chehab commit 754f9969c323559a12bce1475f3c1e6574129856 Author: Andy Walls Date: Sat Dec 11 20:38:20 2010 -0300 [media] cx18: Only allocate a struct cx18_dvb for the DVB TS stream The cx18_stream struct contained a struct cx18_dvb for every stream object, most of which were for analog capture. Now we only allocate the cx18_dvb object for the DTV TS stream. Signed-off-by: Andy Walls Signed-off-by: Mauro Carvalho Chehab commit fa98447f09641adeeaf02b94133649f03b74d159 Author: Andy Walls Date: Sat Dec 11 12:31:45 2010 -0300 [media] ivtv, cx18: Make ioremap failure messages more useful for users The error messages these drivers emitted for ioremap() failures were misleading and not helpful for users. Reworded those messages to help the user take action to resolve vmalloc address space exhaustion. Signed-off-by: Andy Walls Signed-off-by: Mauro Carvalho Chehab commit 0a58d713062fb49952b9b082514a48a0c83b269d Author: Hans Verkuil Date: Sat Dec 25 08:01:38 2010 -0300 [media] stk-webcam: remove V4L1 compatibility code, replace with V4L2 controls Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 439105b122dfa21fbce7201d0f30b5eeac95c918 Author: Hans Verkuil Date: Sat Dec 25 07:46:56 2010 -0300 [media] feature-removal: update V4L1 removal status While the V4L1 compatibility module has been removed, we still have two V4L1 drivers that prevent full V4L1 removal. Those drivers have been moved to staging and will be removed in 2.6.39, together with the last V4L1 support. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 39c3d488452ae206cfc8afda0db041ee55d01c3c Author: Hans Verkuil Date: Sat Dec 25 07:44:33 2010 -0300 [media] cpia, stradis: remove deprecated V4L1 drivers Nobody stepped in to convert these drivers to V4L2, so they are now removed from the kernel. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 71bb2876a3b2af8e6fd5ac20921ee0de9e07d809 Author: Hans Verkuil Date: Sat Dec 25 07:36:55 2010 -0300 [media] se401: deprecate driver, move to staging The se401 driver is deprecated and is moved to staging. If no one will convert this driver to V4L2, then it will be removed in 2.6.39. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 745da4280f272840976d47afba22ed853f07e1b2 Author: Hans Verkuil Date: Sat Dec 25 07:27:47 2010 -0300 [media] usbvideo: deprecate the vicam driver Move usbvideo to staging and mark it deprecated. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 5772dcaa790851ec068afcd0d1f160d801b1126e Author: Hans Verkuil Date: Sat Dec 25 07:20:34 2010 -0300 [media] usbvideo: remove deprecated drivers Remove ibmcam, konicawc and ultracam drivers. There are replaced by gspca drivers. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit e4ea644d3e59436f12e43df5d17fdf4fcf7c5fa7 Author: Hans Verkuil Date: Sat Dec 25 07:15:22 2010 -0300 [media] documentation: update some files to reflect the V4L1 compat removal Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 41d9931c5ae014fbab8bf612c70b8e7ff16f4641 Author: Hans Verkuil Date: Sat Dec 25 07:04:16 2010 -0300 [media] videobuf-dma-sg: remove obsolete comments Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit ad1ecf8639e51ab8066cd4f37fd36b6b7cbdd8b3 Author: Hans Verkuil Date: Sat Dec 25 06:58:01 2010 -0300 [media] zoran: remove V4L1 compat code and zoran custom ioctls All the functionality is now handled through V4L2. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 08af245de0cf6ab5f4ed008ee2bb99273774fce0 Author: Hans Verkuil Date: Fri Dec 24 10:33:19 2010 -0300 [media] V4L: remove V4L1 compatibility mode Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit b69a219e0e97441dbeb0262cf85468b61a161399 Author: Jean-François Moine Date: Sat Dec 25 14:01:42 2010 -0300 [media] gspca - ov534_9: Remove an useless instruction Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 7a5a414ccb5bfc0fe277ef1a0e9d1e492a6f083c Author: Jean-François Moine Date: Sat Dec 25 13:58:45 2010 -0300 [media] gspca - ov519: Bad detection of some ov7670 sensors Tested-by: jim smyth Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 668f44a603dd4b3468cecd7d8d6dc525207db94e Author: Jean-François Moine Date: Sat Dec 25 13:46:14 2010 -0300 [media] gspca: Use the global error status for get/set streamparm Also, in ov534, don't check the parm type. Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 76ebc16b87592350e4ea70681855171adf73f055 Author: Jean-François Moine Date: Sat Dec 25 13:22:21 2010 -0300 [media] gspca - main: Check the isoc packet status before its length When an error is set for an isochronous packet, the length of the packet may be null. In this case, the error was not detected and the image was not discarded as it should be. Reported-by: Franck Bourdonnec Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit f2c5d92ecd4c69a4f86e76d19cb7663f2ebf4781 Author: Jean-François Moine Date: Sat Dec 25 13:19:59 2010 -0300 [media] gspca - sq930x: Fix a bad comment Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit efd3769269f2ef9a0ad452ea8298b3edcb2f5a62 Author: Jean-François Moine Date: Sat Dec 25 13:11:54 2010 -0300 [media] gspca - sq930x: Some detected sensors are not handled yet These are OmniVision's OV7660 and OV9630. Don't register the webcam when they are found. Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 3ebd17946448df50b9082412d09955c87a112721 Author: Jean-François Moine Date: Sat Dec 25 13:07:57 2010 -0300 [media] gspca - sq930x: Don't register a webcam when there are USB errors Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 634b4770539de63581ccdb554426547ced6ded01 Author: Theodore Kilgore Date: Fri Dec 24 17:06:04 2010 -0300 [media] gspca - sq905c: Adds the Lego Bionicle This patch adds the Vendor:Product number of the Lego Bionicle camera to the existing gspca/sq905c.c and also a line for the camera in gspca.txt. The camera works "out of the box" with these small changes. So this is just in time for Christmas. Think of the children. Signed-off-by: Theodore Kilgore Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit a19a5cd7b328ae457f79092e711d4bd888e1ca50 Author: Pete Eberlein Date: Mon Dec 20 19:18:59 2010 -0300 [media] s2255drv: remove BKL Remove BKL ioctl and use unlocked_ioctl with core-assisted locking instead. Signed-off-by: Pete Eberlein Signed-off-by: Mauro Carvalho Chehab commit 07e80305babb27a332ce0f04a3c38ce495cbe711 Author: Marek Szyprowski Date: Mon Dec 20 14:39:25 2010 -0300 [media] v4l: mem2mem_testdev: remove BKL usage Remove usage of BKL by usign per-device mutex. Signed-off-by: Marek Szyprowski CC: Pawel Osciak Signed-off-by: Mauro Carvalho Chehab commit dcd745b723efc875ec5a8f44be028bd0704b12d6 Author: Dan Carpenter Date: Mon Dec 20 09:53:16 2010 -0300 [media] timblogiw: too large value for strncpy() This is a copy and paste error. It should be using sizeof(cap->driver) instead of sizeof(cap->card). Signed-off-by: Dan Carpenter Cc: Richard Rojförs Signed-off-by: Mauro Carvalho Chehab commit ef330dc2e794c932fcbde3f8abd3f12780d78b47 Author: Jesper Juhl Date: Sat Dec 18 19:05:02 2010 -0300 [media] saa7164: Remove pointless conditional and save a few bytes in saa7164_downloadfirmware() Hi, release_firmware() just does nothing if passed a NULL pointer. So there's no reason to test before the call in saa7164-fw.c::saa7164_downloadfirmware(). Removing the pointless conditional also saves a few bytes. before: text data bss dec hex filename 7943 112 2144 10199 27d7 drivers/media/video/saa7164/saa7164-fw.o after: text data bss dec hex filename 7931 112 2136 10179 27c3 drivers/media/video/saa7164/saa7164-fw.o Signed-off-by: Jesper Juhl Cc: Steven Toth Signed-off-by: Mauro Carvalho Chehab commit 10304ca65f8871ad9f6725a7480522034184f55f Author: Sam Doshi Date: Sat Dec 18 12:58:54 2010 -0300 [media] drivers:media:dvb: add USB PIDs for Elgato EyeTV Sat Adds USB PIDs for the Elgato EyeTV Sat device. This device is a clone of the Terratec S7. Signed-off-by: Sam Doshi Signed-off-by: Mauro Carvalho Chehab commit c3353330508aee4390442df2d7f6ce0ef5006185 Author: Anatolij Gustschin Date: Fri Dec 17 06:40:50 2010 -0300 [media] media: fsl-viu: fix support for streaming with mmap method Streaming using mmap didn't work in the VIU driver. We need to start/stop DMA in streamon/streamoff and free the buffers on release. Add appropriate driver extension now. Signed-off-by: Anatolij Gustschin Signed-off-by: Mauro Carvalho Chehab commit 2a72b39e516bf772e707d5a080d5d07b1c8ac0c0 Author: Dan Carpenter Date: Fri Dec 10 09:39:34 2010 -0300 [media] zoran: bit-wise vs logical and zr->frame_num is a counter and && was intended here instead of &. Signed-off-by: Dan Carpenter Signed-off-by: Mauro Carvalho Chehab commit 75aecc3af22ae9063c96457d530f281a1e2d3276 Author: Malcolm Priestley Date: Tue Dec 7 19:49:24 2010 -0300 [media] DM04/QQBOX Frontend attach change On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote: > Em 27-11-2010 11:13, Malcolm Priestley escreveu: > > Driver Version v1.73 - Frontend attach change. > > To stop double rc registration in multi tuner environment or firmware change. > > > > Signed-off-by: Malcolm Priestley > > > > > > +static int lme_name(struct dvb_usb_adapter *adap) > > +{ > > + struct lme2510_state *st = adap->dev->priv; > > + const char *desc = adap->dev->desc->name; > > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"}; > > + char *name = adap->fe->ops.info.name; > > + > > + strcpy(name, desc); > > + strcat(name, fe_name[st->tuner_config]); > > Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size. > Driver Version v1.74 Amended patch with change to strlcpy/strlcat. Signed-off-by: Malcolm Priestley Signed-off-by: Mauro Carvalho Chehab commit c59a9bfabfc2a6359f046652c6bfa0a82fb17a05 Author: Randy Dunlap Date: Tue Dec 7 15:50:09 2010 -0300 [media] media: fix em28xx build, needs hardirq.h Fix em28xx build by adding hardirq.h header file: drivers/media/video/em28xx/em28xx-vbi.c:49: error: implicit declaration of function 'in_interrupt' Reported-by: Zimny Lech Signed-off-by: Randy Dunlap Signed-off-by: Mauro Carvalho Chehab commit 4c8b8698053c986f5f5249878eab70cb028a1023 Author: Vasiliy Kulikov Date: Fri Nov 26 14:06:35 2010 -0300 [media] rc: ir-lirc-codec: fix potential integer overflow 'n' may be bigger than MAX_INT*sizeof(int), if so checking of truncated (int)(n/sizeof(int)) for LIRCBUF_SIZE overflow and then using nontruncated 'count' doesn't make sense. Also n may be up to sizeof(int)-1 bytes bigger than expected, so check value of (n % sizeof(int)) too. Signed-off-by: Vasiliy Kulikov Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 87d1a50ce45168cbaec10397e876286a398052c1 Author: Matti Aaltonen Date: Fri Dec 10 11:41:34 2010 -0300 [media] V4L2: WL1273 FM Radio: TI WL1273 FM radio driver This module implements V4L2 controls for the Texas Instruments WL1273 FM Radio and handles the communication with the chip. Signed-off-by: Matti J. Aaltonen Signed-off-by: Mauro Carvalho Chehab commit 383268a8e282fb549dabe3a33ccafc9434ab6006 Author: Matti Aaltonen Date: Fri Dec 10 11:41:33 2010 -0300 [media] MFD: WL1273 FM Radio: MFD driver for the FM radio This is the core of the WL1273 FM radio driver, it connects the two child modules. The two child drivers are drivers/media/radio/radio-wl1273.c and sound/soc/codecs/wl1273.c. The radio-wl1273 driver implements the V4L2 interface and communicates with the device. The ALSA codec offers digital audio, without it only analog audio is available. Signed-off-by: Matti J. Aaltonen Acked-by: Samuel Ortiz Signed-off-by: Mauro Carvalho Chehab commit 00765f16f116b45aa67de306ac923ed4ba262bf9 Author: Hans de Goede Date: Sun Dec 12 15:55:03 2010 -0300 [media] gspca_sonixb: Add support for 0c45:602a Add support for cameras with the HV7131D sensor, such as the 0c45:602a Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab commit 2b3e284a89dfa53eb42b6470e4c03e5ddfdb24c5 Author: Hans de Goede Date: Sun Dec 12 08:55:04 2010 -0300 [media] gspca_sonixb: Rewrite start of frame detection Our old start of frame detection code wrongly assumes that the sof marker always lives at the beginning of the frame. At least for the 0c45:602a camera this is not the case. This patch also improves the framerate from 28 fps to 30 fps with the 0c45:6005 and 0c45:6007 Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab commit d6746d55da0819edbe913a1447b1ab0e7b440241 Author: Hans de Goede Date: Fri Dec 10 12:28:15 2010 -0300 [media] gspca_sonixb: Make sonixb handle 0c45:6007 instead of sn9c102 I've a 0c45:6007 camera and it works fine with the gspca_sonixb driver, so make that handle it instead of the deprecated sn9c102 driver. Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab commit 788e5d4dc825ffc2eb863272d9a57fb93490dd92 Author: Mauro Carvalho Chehab Date: Fri Dec 17 14:47:27 2010 -0300 [media] cx231xx: Fix IR keymap for Pixelview SBTVD Hybrid Signed-off-by: Mauro Carvalho Chehab commit 12007419b766b316998499bd07c6586928230729 Author: Mauro Carvalho Chehab Date: Fri Dec 17 14:39:29 2010 -0300 [media] Add a keymap for Pixelview 002-T remote Signed-off-by: Mauro Carvalho Chehab commit e330289ed40f76819d6a13e682203c6fc9a86304 Author: Mauro Carvalho Chehab Date: Fri Dec 17 14:22:09 2010 -0300 [media] cx231xx: Fix inverted bits for RC on PV Hybrid At Pixelview SBTVD Hybrid, the bits sent by the IR are inverted. Due to that, the existing keytables produce wrong codes. Signed-off-by: Mauro Carvalho Chehab commit 49aefd2bcda80d33497f0f26702c67e372cacef3 Author: Stephen Rothwell Date: Mon Nov 22 23:35:17 2010 -0300 [media] timblogiw: const and __devinitdata do not mix This fixes the following error in PowerPC builds: drivers/media/video/timblogiw.c: In function 'timblogiw_probe': drivers/media/video/timblogiw.c:749: error: timblogiw_ioctl_ops causes a section type conflict Signed-off-by: Stephen Rothwell Signed-off-by: Mauro Carvalho Chehab commit d162e7aac24bfd8b96881582368f976e7e464c25 Author: Mauro Carvalho Chehab Date: Tue Dec 7 19:39:33 2010 -0300 [media] gspca/sn9c20x: Fix support for mt9m001 (mi1300) sensor Support for mt9m001 (mi1300) is broken: - Table is incomplete; - Only one resolution is currently supported by the driver; - Resolution is incomplete; - it complains about broken JPEG headers. Use the same init found on em28xx driver, and properly report the output format as 8-bits GRAY. Acked-by: Jean-Francois Moine Signed-off-by: Mauro Carvalho Chehab commit d4b416f26279bbbe07faaff1c9cd19d6b3709b2e Author: Mauro Carvalho Chehab Date: Tue Dec 7 17:19:09 2010 -0300 [media] gspca core: Fix regressions gspca breaking devices with audio Changeset 35680ba broke several devices: - Sony Playstation Eye (1415:2000); - Gigaware model 25-234 (0c45:628f); - Logitech Messenger Plus (046d:08f6). Probably more devices were broken by this change. What happens is that several devices don't need to save some bandwidth for audio. Also, as pointed by Hans de Goede , the logic that implements the bandwidth reservation for audio is broken, since it will reduce the alt number twice, on devices with audio. So, let's just revert the broken logic, and think on a better solution for usb 1.1 devices with audio that can't use the maximum packetsize. Acked-by: Jean-Francois Moine Signed-off-by: Mauro Carvalho Chehab commit 86701c1d6a3ecae2f0e6771c730364d334d5a142 Author: Mauro Carvalho Chehab Date: Tue Dec 7 14:47:10 2010 -0300 [media] gspca/sn9c20x: Get rid of scale "magic" numbers Use macros for the supported scales, instead of using magic numbers from 0 to 3. Code become cleaner by using macros for it. Acked-by: Jean-Francois Moine Signed-off-by: Mauro Carvalho Chehab commit e78567d227ecd40543508342ba39a3dfba5af14f Author: Mauro Carvalho Chehab Date: Mon Dec 6 06:53:05 2010 -0300 [media] gspca/sn9c20x: Test if sensor is a OV sensor Instead of just assuming a ov9650 sensor based on USB ID, double-check it, by reading the sensor ID. Acked-by: Jean-Francois Moine Signed-off-by: Mauro Carvalho Chehab commit dd89aec47325a251eeaf39ee4b84adb521270cba Author: Richard Zidlicky Date: Wed Dec 1 20:52:49 2010 -0300 [media] keycodes for DSR-0112 remote bundled with Haupauge MiniStick Add kycodes for DSR-0112 remote that comes together with Haupauge MiniStick http://lirc.sourceforge.net/remotes/hauppauge/DSR-0112.jpg [mchehab@redhat.com: Fix KEY_PREVIOUS to match the definition for the other model] Signed-off-by: Richard Zidlicky Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 8350e1551c27ee784ded579fd224846972d4b0d3 Author: Joe Perches Date: Tue Nov 30 18:42:07 2010 -0300 [media] media: Remove unnecessary casts of usb_get_intfdata Signed-off-by: Joe Perches Signed-off-by: Mauro Carvalho Chehab commit 9124544320bd36d5aa21769d17a5781ba729aebf Author: Philippe Bourdin Date: Sun Oct 31 09:57:58 2010 -0300 [media] Terratec Cinergy Hybrid T USB XS I found that the problems people have reported with the USB-TV-stick "Terratec Cinergy Hybrid T USB XS" (USB-ID: 0ccd:0042) are coming from a wrong header file in the v4l-sources. Attached is a diff, which fixes the problem (tested successfully here). Obviously the USB-ID has been associated with a wrong chip: EM2880 instead of EM2882, which would be correct. Reported-by: Philippe Bourdin Signed-off-by: Mauro Carvalho Chehab commit b395cbac36e58a55729fe7e6262a3f0b1691bced Author: Vasiliy Kulikov Date: Fri Nov 26 14:06:41 2010 -0300 [media] media: rc: lirc_dev: check kobject_set_name() result kobject_set_name() may fail with -ENOMEM, check for it. Signed-off-by: Vasiliy Kulikov Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 801c73c04ad57689dc9b47baf62cbb23f954d987 Author: David Härdeman Date: Thu Nov 25 18:36:27 2010 -0300 [media] rc-core: add loopback driver This patch adds a loopback driver to rc-core which I've found useful for running scripted tests of different parts of rc-core without having to fiddle with real hardware. Basically it emulates hardware with a learning and a non-learning receiver and two transmitters (which correspond to the two receivers). TX data that is sent is fed back as input on the corresponding receiver, which allows for debugging of IR decoders, keymaps, etc. Signed-off-by: David Härdeman Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit dea8a39fb569c23084c857ccdbf70a95ea3bf7dc Author: Mauro Carvalho Chehab Date: Mon Nov 29 07:46:13 2010 -0300 [media] rc-core: Initialize return value to zero At ir_setkeycode, if INPUT_KEYMAP_BY_INDEX is used, the routine may return an invalid value if not error. Signed-off-by: Mauro Carvalho Chehab commit b7c7a4bed8d695933ae172031556de9de30ae598 Author: Mauro Carvalho Chehab Date: Sun Nov 28 11:48:26 2010 -0300 [media] bttv: remove custom_irq and gpioq from bttv struct The RC5 old decoder used custom_irq to indicate the need of handling the IRQ on a different way. Instead of doing it, let the core just call the bttv input IRQ handler, and add the code there to call the legacy decoder. While here, remove the gpioq waitqueue, as this is not used anywhere, and add a debug msg to help removing the legacy RC5 code. Signed-off-by: Mauro Carvalho Chehab commit 5ae094cea1b4f3715ee6ea4f49d0b36d564f90e7 Author: Dan Carpenter Date: Thu Nov 18 00:56:37 2010 -0300 [media] cx231xx: stray unlock on error path The lock isn't held here and doesn't need to be unlocked. The code has been like this since the driver was merged. Signed-off-by: Dan Carpenter Signed-off-by: Mauro Carvalho Chehab commit 5ad1a55542dd69d2c6aa7db5ca79073d693bbfed Author: Paul Bender Date: Wed Nov 17 16:56:17 2010 -0300 [media] rc: fix sysfs entry for mceusb and streamzap When trying to create persistent device names for mceusb and streamzap devices, I noticed that their respective drivers are not creating the rc device as a child of the USB device. Rather it creates it as virtual device. As a result, udev cannot use the USB device information to create persistent device names for event and lirc devices associated with the rc device. Not having persistent device names makes it more difficult to make use of the devices in userspace as their names can change. Forward-ported to media_tree staging/for_v2.6.38 and tested with both streamzap and mceusb devices: $ ll /dev/input/by-id/ ... lrwxrwxrwx. 1 root root 9 Nov 17 17:06 usb-Streamzap__Inc._Streamzap_Remote_Control-event-if00 -> ../event6 lrwxrwxrwx. 1 root root 9 Nov 17 17:05 usb-Topseed_Technology_Corp._eHome_Infrared_Transceiver_TS000BzY-event-if00 -> ../event5 Previously, nada. Signed-off-by: Paul Bender Tested-by: Jarod Wilson Signed-off-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 5df465df7bd9c352289ca63d4d9f78299be72c7d Author: Nicolas Kaiser Date: Fri Nov 19 17:42:40 2010 -0300 [media] drivers/media: nuvoton: fix chip id probe v2 Make sure we have a matching chip id high and one or the other of the chip id low values. Print the values if the probe fails. Signed-off-by: Nicolas Kaiser Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit ecfc95eb7410c04c23f59b02931e8f8b3aa4a5b3 Author: Joe Perches Date: Mon Nov 15 17:13:54 2010 -0300 [media] ngene-core.c: Remove unnecessary casts of pci_get_drvdata Signed-off-by: Joe Perches Signed-off-by: Mauro Carvalho Chehab commit b1dc614a81258eb7ff482892e7bc894f1089c144 Author: Joe Perches Date: Mon Nov 15 00:04:28 2010 -0300 [media] drivers/media/video: Remove unnecessary semicolons Signed-off-by: Joe Perches Signed-off-by: Mauro Carvalho Chehab commit a363436396ad68509db4513c886055cc067a184c Author: Alexey Chernov <4ernov@gmail.com> Date: Thu Oct 28 18:12:02 2010 -0300 [media] Patch for cx18 module with added support of GoTView PCI DVD3 Hybrid tuner I've got code which adds support of GoTView PCI DVD3 Hybrid tuner in cx18 module and Andy Walls in ivtv mailing-list gave me some advice on making a patch and sending it here. So here's the patch against staging/2.6.37-rc1 branch (the tutorial recommends to include it as plain text but if it's the case I can surely send as an attachment): Several comments on the patch: 1. Both users on the official Gotview forum and support said that PCI DVD3 is very similar to Yuan MPC718 card so the main part of code is taken from Yuan configuration. Some users reported it to work properly. 2. Everything is being initialized correctly including analog, dvb, radio and alsa parts. Analogue part and alsa virtual card is tested by myself using original Gotview card. [mchehab@redhat.com: Whitespace cleanups] Signed-off-by: Alexey Chernov <4ernov@gmail.com> Signed-off-by: Andy Walls Signed-off-by: Mauro Carvalho Chehab commit 97108cf682566a79ad49f165435bddbb91844d9a Author: Mauro Carvalho Chehab Date: Mon Nov 22 15:50:51 2010 -0300 [media] Fix parameter description for disable_ir It seems that a wrong cut-and-paste error were done here. Reported-by: Jeremy Kerr Signed-off-by: Mauro Carvalho Chehab commit eac8ae087ac66b21de94fee3e920210b43d43076 Author: Mariusz BiaÅ‚oÅ„czyk Date: Mon Nov 15 15:50:13 2010 -0300 [media] Fix rc-tbs-nec table after converting the cx88 driver to ir-core The patch fixes the rc-tbs-nec table after converting drivers/media/video/cx88 to ir-core (commit ba7e90c9f878e0ac3c0614a5446fe5c62ccc33ec). It is also adds two missing buttons (10- and 10+) with its definition (KEY_10CHANNELSUP and KEY_10CHANNELSDOWN). [mchehab@redhat.com: move keycode numbers to 0x1b8/0x1b9 as requested by the input Maintainer] Signed-off-by: Mariusz BiaÅ‚oÅ„czyk Signed-off-by: Mauro Carvalho Chehab commit 0e835087dfe7db19f1f072046f5e116d4ec6662b Author: Dan Carpenter Date: Wed Nov 17 02:13:39 2010 -0300 [media] lirc_dev: add some __user annotations Sparse complains because there are no __user annotations. drivers/media/rc/lirc_dev.c:156:27: warning: incorrect type in initializer (incompatible argument 2 (different address spaces)) drivers/media/rc/lirc_dev.c:156:27: expected int ( *read )( ... ) drivers/media/rc/lirc_dev.c:156:27: got int ( extern [toplevel] * )( ... ) Signed-off-by: Dan Carpenter Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 829ba9fe34246f1f5e813b6bf84171d36e776734 Author: David HĂƒÂ¤rdeman Date: Fri Nov 19 20:43:27 2010 -0300 [media] rc-core: fix some leftovers from the renaming patches Fix some minor comments etc which are leftover from the old naming scheme. Signed-off-by: David Härdeman Signed-off-by: Mauro Carvalho Chehab commit 3938e0cfeb812e7b66f4e1cb6e34eb2e6864c6a2 Author: David HĂƒÂ¤rdeman Date: Fri Nov 19 20:43:17 2010 -0300 [media] bttv: merge ir decoding timers Similarly to saa7134, bttv_ir has two timers, only one of which is used at a time and which serve the same purpose. Merge them. Signed-off-by: David Härdeman Signed-off-by: Mauro Carvalho Chehab commit edb4c25ca3a7997660500692eca3510eac9726e5 Author: David HĂƒÂ¤rdeman Date: Fri Nov 19 20:43:12 2010 -0300 [media] bttv: rename struct card_ir to bttv_ir bttv_ir is more consistent with all other structs used in the same driver. Also, clean up the struct to remove commented out members and the work_struct which is unused. [mchehab@redhat.com: fix a warning at bttv_rc5_timer_end] Signed-off-by: David Härdeman Signed-off-by: Mauro Carvalho Chehab commit 7c8352d18ddbe37cff8ad71175a11739662ef899 Author: David HĂƒÂ¤rdeman Date: Fri Nov 19 20:42:57 2010 -0300 [media] saa7134: merge saa7134_card_ir->timer and saa7134_card_ir->timer_end Both timers are used for a similar purpose. Merging them allows for some minor simplifications. Signed-off-by: David Härdeman Signed-off-by: Mauro Carvalho Chehab commit 651c7a5f7f2f7277f8fc4fb38e89c79845ec9bf9 Author: David HĂƒÂ¤rdeman Date: Fri Nov 19 20:42:51 2010 -0300 [media] saa7134: some minor cleanups Mostly using appropriate data types and constants (e.g. int -> bool). Signed-off-by: David Härdeman Signed-off-by: Mauro Carvalho Chehab commit b0ddb0f364f926785f50a8cea8a399ba63e3c227 Author: David HĂƒÂ¤rdeman Date: Fri Nov 19 20:42:46 2010 -0300 [media] saa7134: use full keycode for BeholdTV Using the full keycode for BeholdTV hardware makes another module parameter unnecessary. Signed-off-by: David Härdeman Signed-off-by: Mauro Carvalho Chehab commit a29df8579ab2779605b181a38ac7fb99796666df Author: David HĂƒÂ¤rdeman Date: Fri Nov 19 20:42:41 2010 -0300 [media] saa7134: remove unused module parameter ir_rc5_remote_gap is a leftover from ir-common, remove it. Signed-off-by: David Härdeman Signed-off-by: Mauro Carvalho Chehab commit 622d9f5d302e99dc7a06cb442e9d9ff2bb0f59b5 Author: Hans de Goede Date: Tue Nov 16 12:32:09 2010 -0300 [media] pwc: failure to submit an urb is a fatal error Failure to submit an urb is a fatal error, make isoc_init return an error when this happens rather then only log it. Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab commit c7d18867c82657a97f0bdb90ba1151b251b6a29b Author: Hans de Goede Date: Tue Nov 16 12:26:00 2010 -0300 [media] pwc: Also set alt setting to alt0 when no error occured isoc_cleanup contains a check to not set the altsetting to alt0 when the device was unplugged, but the check currently is buggy, and causes the alt setting to only be set to 0 if an error occured while streaming. Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab commit 3751e288bcf3d77652ef979edc0b3ea8b21d8b97 Author: Hans de Goede Date: Tue Nov 16 11:39:25 2010 -0300 [media] pwc: do not start isoc stream on /dev/video open pwc was starting streaming on /dev/video# open rather then on STREAM_ON. Now that the v4l1 compat code is removed from the pwc driver there is no reason left to do this. So this patch changes the pwc driver to delay starting the isoc stream (and thus using valuable usb bandwidth) until the application does a STREAM_ON Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab commit a931910d3be6f63464befb2dde94ec58a6eaf5c1 Author: Mauro Carvalho Chehab Date: Mon Nov 22 13:22:37 2010 -0300 [media] stb6100: warning cleanup drivers/media/dvb/frontends/stb6100.c:120: warning: ‘stb6100_normalise_regs’ defined but not used Signed-off-by: Mauro Carvalho Chehab commit 03c9a806e30c3904e5b5702874eebc1a4f2082bd Author: Mauro Carvalho Chehab Date: Wed Nov 17 16:05:05 2010 -0300 [media] rc: Rename IR raw interface to ir-raw.c Signed-off-by: Mauro Carvalho Chehab commit d100e659b61a735c3343b3d82c1c009b04072cdd Author: Mauro Carvalho Chehab Date: Wed Nov 17 15:56:53 2010 -0300 [media] rc: use rc_map_ prefix for all rc map tables Signed-off-by: Mauro Carvalho Chehab commit 2f4f58d689dd71dea67407b74405a3c43e797cb1 Author: Mauro Carvalho Chehab Date: Wed Nov 17 15:46:09 2010 -0300 [media] rc: Name RC keymap tables as rc_map_table Remote keytables had different names all over the place. Part of the fault is due to a bad naming when rc subsystem was created, but there were lots of old names that were still here. Use a common standard for everything. Patch generated by this script: for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,ir_scancode,rc_map_table,g <$i >a && mv a $i; done for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,ir_codes_,rc_map_,g <$i >a && mv a $i; done for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,rc_key_map,rc_map_table,g <$i >a && mv a $i; done for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,rc_map_table_size,rc_map_size,g <$i >a && mv a $i; done Signed-off-by: Mauro Carvalho Chehab commit b088ba658b3438056dab4d744701364db3f08b9a Author: Mauro Carvalho Chehab Date: Wed Nov 17 14:28:27 2010 -0300 [media] rc: Properly name the rc_map struct The struct that describes a rc mapping had an weird and long name. We should properly name it, to make easier for developers to work with it, and to avoid confusion. Basically, generated by this script: for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,ir_scancode_table,rc_map,g <$i >a && mv a $i; done for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,rc_tab,rc_map,g <$i >a && mv a $i; done (and manually fixed where needed) Signed-off-by: Mauro Carvalho Chehab commit 52b661449aecc47e652a164c0d8078b31e10aca0 Author: Mauro Carvalho Chehab Date: Wed Nov 17 14:20:52 2010 -0300 [media] rc: Rename remote controller type to rc_type instead of ir_type for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,IR_TYPE,RC_TYPE,g <$i >a && mv a $i; done for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,ir_type,rc_type,g <$i >a && mv a $i; done Signed-off-by: Mauro Carvalho Chehab commit 29e3ec19d5c88d534ced219d3962d67243e4d310 Author: Mauro Carvalho Chehab Date: Wed Nov 17 14:12:46 2010 -0300 [media] cx231xx: Properly name rc_map name rc_map is confusing, as it may be understood as another thing. Properly rename the field to indicate its usage. Signed-off-by: Mauro Carvalho Chehab commit ca86674b8a93ea11c4bb6f4dd0113b1adf1fa841 Author: Mauro Carvalho Chehab Date: Wed Nov 17 13:53:11 2010 -0300 [media] Rename all public generic RC functions from ir_ to rc_ Those functions are not InfraRed specific. So, rename them to properly reflect it. Signed-off-by: Mauro Carvalho Chehab commit 6bda96447cef24fbf97a798b1ea664224d5fdc25 Author: Mauro Carvalho Chehab Date: Wed Nov 17 13:28:38 2010 -0300 [media] rc: rename the remaining things to rc_core The Remote Controller subsystem is meant to be used not only by Infra Red but also for similar types of Remote Controllers. The core is not specific to Infra Red. As such, rename: - ir-core.h to rc-core.h - IR_CORE to RC_CORE - namespace inside rc-core.c/rc-core.h To be consistent with the other changes. No functional change on this patch. Signed-off-by: Mauro Carvalho Chehab commit a6e3b81f6198654207c4e972e7ed91931e53e93c Author: Mauro Carvalho Chehab Date: Wed Nov 17 10:05:29 2010 -0300 [media] rc: Remove ir-common.h Signed-off-by: Mauro Carvalho Chehab commit bce8d0fe4af4b3a1e46e66cd6116d6389ad0cc22 Author: Mauro Carvalho Chehab Date: Wed Nov 17 09:58:09 2010 -0300 [media] rc: remove ir-common module Something weird happened with commit 740069e6e043403199dbe2b42256722fb814f6ae. Instead of dong the right thing, it got somehow corrupted and reverted the rc changes. Thanks to David Härdeman for pointing me about the problem. This patch should be merged with 740069e6e04 before sending upstream. Signed-off-by: Mauro Carvalho Chehab commit 1697c8dfba72fd182d670a68dca157f64dd3b1f2 Author: Manu Abraham Date: Sun Nov 14 16:01:47 2010 -0300 [media] stb0899: fix diseqc messages getting lost - Some badly written applications in conjuction with certain SEC devices do send too many messages causing the DiSEqC bus to get congested. As a result, the end devices do get confused and hence do not respond. The issue was found by Julian Scheel. Signed-off-by: Manu Abraham Signed-off-by: Mauro Carvalho Chehab commit f14bfe94e459cb070a489e1786f26d54e9e7b5de Author: Manu Abraham Date: Sun Nov 14 15:52:10 2010 -0300 [media] stb6100: Improve tuner performance - Reduce the amount of white noise present, which causes the demodulator a significant time to acquire a frontend lock on a whole. Frontend shows a large significant improvement in performance. Thanks to Peter Nayler for helping to identify the potential hotspots and fixing them. Signed-off-by: Manu Abraham Signed-off-by: Mauro Carvalho Chehab commit 3037fd14302d635426996fb7f6fcf7cb98dc15b9 Author: Ben Hutchings Date: Sun Nov 14 14:56:00 2010 -0300 [media] Mantis: Rename gpio_set_bits to mantis_gpio_set_bits This function is declared extern and exported, and should not be given a generic name which may conflict with gpiolib in future. Signed-off-by: Ben Hutchings Signed-off-by: Manu Abraham Signed-off-by: Mauro Carvalho Chehab commit a22407faba57c3624beea1a9fad7cbdcf5a19a1a Author: Bjørn Mork Date: Sun Nov 14 14:24:36 2010 -0300 [media] Mantis: use dvb_attach to avoid double dereferencing on module removal Convert the driver to use the dvb_attach macro to avoid the hard dependency on the frontend drivers. The hard dependecy will result in loading a number of unused frontends, and unwanted automatic dereferencing. This fixes a bug where unloading the mantis driver will derefence any attached frontend twice, which will cause an oops if the same frontend is used by another driver. Signed-off-by: Bjørn Mork Signed-off-by: Manu Abraham Signed-off-by: Mauro Carvalho Chehab commit 9c81496a88b04206d0607b23b298b6529da1fcb0 Author: Marko Ristola Date: Sun Nov 14 14:09:04 2010 -0300 [media] Mantis: append tasklet maintenance for DVB stream delivery After dvb-core has called mantis-fe->stop_feed(dvbdmxfeed) the last time (count to zero), no data should ever be copied with dvb_dmx_swfilter() by a tasklet: the target structure might be in an unusable state. Caller of mantis_fe->stop_feed() assumes that feeding is stopped after stop_feed() has been called, ie. dvb_dmx_swfilter() isn't running, and won't be called. There is a risk that dvb_dmx_swfilter() references freed resources (memory or spinlocks or ???) causing instabilities. Thus tasklet_disable(&mantis->tasklet) must be called inside of mantis-fe->stop_feed(dvbdmxfeed) when necessary. Signed-off-by: Marko Ristola Signed-off-by: Manu Abraham Signed-off-by: Mauro Carvalho Chehab commit 116d588ea21cf0278a4de1e3272e9c3220a647e7 Author: Manu Abraham Date: Thu Feb 11 04:11:05 2010 -0300 [media] Mantis, hopper: use MODULE_DEVICE_TABLE use the macro to make modules auto-loadable Thanks to Ozan ÇaÄŸlayan for pointing it out Signed-off-by: Manu Abraham Signed-off-by: Mauro Carvalho Chehab commit e6f199f3e7e10112adfa80700ecc00b056b5a62e Author: Wolfram Sang Date: Wed Nov 10 09:28:19 2010 -0300 [media] i2c: Remove obsolete cleanup for clientdata A few new i2c-drivers came into the kernel which clear the clientdata-pointer on exit. This is obsolete meanwhile, so fix it and hope the word will spread. Signed-off-by: Wolfram Sang Acked-by: Guennadi Liakhovetski Signed-off-by: Mauro Carvalho Chehab commit c0ff9f4c24a2571943c0d0991c2cb9ac90dc1915 Author: Wolfram Sang Date: Wed Nov 10 11:14:13 2010 -0300 [media] media: video: do not clear 'driver' from an i2c_client The i2c-core does this already. Reported-by: Jean Delvare Signed-off-by: Wolfram Sang Acked-by: Guennadi Liakhovetski Signed-off-by: Mauro Carvalho Chehab commit 9a9dcb4a19c29ec01e7d249e3dae2d589af86480 Author: Jesper Juhl Date: Mon Nov 8 20:08:41 2010 -0300 [media] cx231xx-417: Remove unnecessary casts of void ptr returning alloc function return values Hi, The [vk][cmz]alloc(_node) family of functions return void pointers which it's completely unnecessary/pointless to cast to other pointer types since that happens implicitly. This patch removes such casts from drivers/media/ Signed-off-by: Jesper Juhl Signed-off-by: Mauro Carvalho Chehab commit 9c0147b6941e082f52dcbb9688d0e6e5f359744f Author: Randy Dunlap Date: Wed Nov 24 16:41:09 2010 -0300 [media] timblogiw: fix kconfig & build error timblogiw uses dma() interfaces and it selects TIMB_DMA for that support. However, drivers/dma/ is not built unless CONFIG_DMA_ENGINE is enabled, so select/enable that symbol also. drivers/built-in.o: In function `timblogiw_close': timblogiw.c:(.text+0x4419fe): undefined reference to `dma_release_channel' drivers/built-in.o: In function `buffer_release': timblogiw.c:(.text+0x441a8d): undefined reference to `dma_sync_wait' drivers/built-in.o: In function `timblogiw_open': timblogiw.c:(.text+0x44212b): undefined reference to `__dma_request_channel' Signed-off-by: Randy Dunlap Signed-off-by: Andrew Morton Signed-off-by: Mauro Carvalho Chehab commit c091575c8b35b39b8f271e0d4b692329a705240a Author: Richard RĂƒÂ¶jfors Date: Mon Nov 8 10:45:48 2010 -0300 [media] mfd: Add timberdale video-in driver to timberdale This patch defines platform data for the video-in driver and adds it to all configurations of timberdale. Signed-off-by: Richard Röjfors Acked-by: Samuel Ortiz Signed-off-by: Mauro Carvalho Chehab commit 9eae42e5a216059a146b3fbbe24b4fdc0b10c723 Author: Richard Röjfors Date: Mon Nov 8 10:45:44 2010 -0300 [media] media: Add timberdale video-in driver This patch adds the timberdale video-in driver. The video IP of timberdale delivers the video data via DMA. The driver uses the DMA api to handle DMA transfers, and make use of the V4L2 video buffers to handle buffers against user space. If available the driver uses an encoder to get/set the video standard Signed-off-by: Richard Röjfors Signed-off-by: Mauro Carvalho Chehab commit 36d89f7de4a4937848de86d9b35cb03a9f0357e1 Author: Joe Perches Date: Sun Nov 7 17:48:21 2010 -0300 [media] drivers/staging/cx25821: Use pr_fmt and pr_ Fix several defects with bad line continuation uses that introduce whitespace. Fix several defects with lines missing "\n". Standardize prefixes via pr_fmt. Remove internal cx25821 prefixes. Standardize :%s():" ... __func__ uses. Coalesce long formats. Add KERN_ prefixes via pr_ to printks. Signed-off-by: Joe Perches Signed-off-by: Mauro Carvalho Chehab commit 13d28e4917fb6cf6898e8998f01ab83b3f468aeb Author: Matthias Schwarzott Date: Sun Nov 7 10:57:13 2010 -0300 [media] IX2505V: i2c transfer error code ignored It seems that ix2505v driver ignores a i2c error in ix2505v_read_status_reg. This looks like a typing error using (ret = 1) instead of correct (ret == 1). Acked-by: Malcolm Priestley Signed-off-by: Matthias Schwarzott Cc: stable@kernel.org Signed-off-by: Mauro Carvalho Chehab commit 62c7cdd8a16025e4d5596b8e61352960745f3707 Author: Jean Delvare Date: Sun Nov 7 12:54:39 2010 -0300 [media] TM6000: Drop unused macro Signed-off-by: Jean Delvare Cc: Michel Ludwig Cc: Stefan Ringel Signed-off-by: Mauro Carvalho Chehab commit 7bd444ede7285cad4ed5047ff954432325fe7f95 Author: Jean Delvare Date: Sun Nov 7 12:53:44 2010 -0300 [media] TM6000: Clean-up i2c initialization Usage of templates for large structures is a bad idea, as it wastes a lot of space. Manually initializing the few fields we need is way more efficient. Also set the algorithm data const, use strlcpy instead of strcpy, fix a small race (device data must always be set before registering said device) and properly return error on adapter registration failure. Signed-off-by: Jean Delvare Cc: Michel Ludwig Cc: Stefan Ringel Signed-off-by: Mauro Carvalho Chehab commit 8ea43d0a2f87b8460f46ddb7b42b5eb17c5385d2 Author: Mauro Carvalho Chehab Date: Sat Nov 13 16:49:10 2010 -0300 [media] rc: Remove ir-common module Now, just one old bttv board uses the old RC5 raw decoding routines. Its conversion to rc-core requires the generation of IRQ data for both positive and negative transitions at the IRQ line. I'm not sure if bttv driver supports it or if the transitions will be reliable enough. So, due to the lack of hardware for testing, the better for now is to just move the legacy routines to bttv driver, and wait for someone with a Nebula Digi could help to port it to use also rc-core raw decoders. Acked-by: Hermann Pitton Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 6c7e653ff668d939174aa7023736f4a40fd2be08 Author: Mauro Carvalho Chehab Date: Sat Nov 13 16:19:54 2010 -0300 [media] saa7134: Remove legacy IR decoding logic inside the module The only IR left still using the old raw decoders on saa7134 is ENCORE FM 5.3. As it is now using the standard rc-core raw decoders, lots of old code can be removed from saa7134. Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 70de39183a8b5ba0a0cd884ff46c1d81dbe939db Author: Mauro Carvalho Chehab Date: Sat Nov 13 16:23:06 2010 -0300 [media] saa7134: use rc-core raw decoders for Encore FM 5.3 Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit c1937f8e3490fedec2c75383df07cd8a7154c545 Author: Stefan Ringel Date: Tue Nov 9 13:50:28 2010 -0300 [media] tm6000: add revision check adding chip revision check Signed-off-by: Stefan Ringel Signed-off-by: Mauro Carvalho Chehab commit 101b25b55ec48354bc40b9102b4f7922c9ad9eae Author: Joe Perches Date: Fri Nov 5 00:07:39 2010 -0300 [media] drivers/media: Use vzalloc Signed-off-by: Joe Perches Signed-off-by: Mauro Carvalho Chehab commit 42e142f6b72493b5daec9950c4c83d20ccf56a0d Author: Jean-François Moine Date: Sat Nov 13 05:10:27 2010 -0300 [media] gspca - ov519: New sensor ov7660 with bridge ov530 (ov519) [mchehab@redhat.com: Some CodingStyle fixes] Tested-by: Anca Emanuel Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 7491f785dd02bc35551e0463d798959b15644c1d Author: Jean-François Moine Date: Sat Nov 13 03:56:41 2010 -0300 [media] gspca - ov519: Re-initialize the webcam at resume time Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit b4e96ea30a211c0979e9e0ea10f39dfa50afb8fa Author: Jean-François Moine Date: Fri Nov 12 16:13:17 2010 -0300 [media] gspca - ov519: Initialize the ov519 snapshot register Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 5927abcb21d0dd10c960517453e37302acf2269e Author: Jean-François Moine Date: Fri Nov 12 15:32:29 2010 -0300 [media] gspca - ov519: Change the ov519 start and stop sequences - start and stop streaming are done via the FRAR - streaming suspend (for control change) is done by video reset Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit a23acec4bca79f2168a5aeacc8d85386b70ae522 Author: Jean-François Moine Date: Fri Nov 12 15:07:35 2010 -0300 [media] gspca - ov519: Simplify the LED control functions Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit e2817029b3f139bd85360536153467bd8f7f863b Author: Jean-François Moine Date: Fri Nov 12 13:59:48 2010 -0300 [media] gspca - ov519: Check the disabled controls at start time only Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 858ea5e941fad6a2f38d0c9722bbb842d46662fb Author: Jean-François Moine Date: Fri Nov 12 13:53:10 2010 -0300 [media] gspca - ov519: Clearer debug and error messages Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit f8f20188e863dfb43ac53364da0b8865d37c97e2 Author: Jean-François Moine Date: Fri Nov 12 07:54:02 2010 -0300 [media] gspca - ov519: Propagate errors to higher level Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 83db76886c0b0a32a0c8d35b4dc3dc1d8f1287d4 Author: Jean-François Moine Date: Fri Nov 12 07:14:08 2010 -0300 [media] gspca - ov519: Define the disabled controls in a table Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 218678032589895f29f4ee01b9c330caaab44274 Author: Jean-François Moine Date: Fri Nov 12 06:12:09 2010 -0300 [media] gspca - ov519: Set their numbers in the ov519 and ov7670 register names Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 87bae740fd50df49337017b3ccbed9dbaeaad610 Author: Jean-François Moine Date: Fri Nov 12 05:31:34 2010 -0300 [media] gspca - ov519: Cleanup source - move hexadecimal value to lowercase - remove/add empty lines and spaces - comment unused macros - change some comments Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 9be1d6cde936dcf9a325eeee01ed64005c98d456 Author: Nicolas Kaiser Date: Fri Nov 12 04:32:35 2010 -0300 [media] gspca - cpia1: Fix error check It looks to me like it was intended to check the return value at this point. Signed-off-by: Nicolas Kaiser Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 7bbe6b8d1f63c2f7482c93d8cd986b1774e6436d Author: Jean-François Moine Date: Thu Nov 11 08:27:24 2010 -0300 [media] gspca - ov519: Define the sensor types in an enum This patch also checks if the sensor is well detected at connection time. Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit d6fa66384b38165126ce2866b4bdff756c6fc761 Author: Jean-François Moine Date: Thu Nov 11 08:05:50 2010 -0300 [media] gspca - ov519: Reduce the size of some variables Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 9d1593a84c09e57a9565baab931a6cf116120e05 Author: Jean-François Moine Date: Thu Nov 11 08:04:06 2010 -0300 [media] gspca - ov519: Change types '__xx' to 'xx' Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit d65174c06f2bf4ff73d1c71960be317b89561c06 Author: Jean-François Moine Date: Thu Nov 11 06:20:42 2010 -0300 [media] gspca - ov519: Don't do USB exchanges after disconnection Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 14653e64e9db48e91cbd00fba335a6a459e66cc9 Author: Jean-François Moine Date: Thu Nov 11 06:17:01 2010 -0300 [media] gspca - ov519: Handle the snapshot on capture stop when CONFIG_INPUT=m Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit c0b33bdc5b8d9c1120dece660480d4dd86b817ee Author: Hans de Goede Date: Wed Oct 27 09:12:30 2010 -0300 [media] gspca-stv06xx: support bandwidth changing stv06xx devices have only one altsetting, but the actual used bandwidth can be programmed through a register. We were already setting this register lower then the max packetsize of the altsetting indicates. This patch makes the gspca-stv06xx update the usb descriptor for the alt setting to reflect the actual packetsize in use, so that the usb subsystem uses the correct information for scheduling usb transfers. This patch also tries to fallback to lower speeds in case a ENOSPC error is received when submitting urbs, but currently this is only supported with stv06xx cams with the pb0100 sensor, as this is the only one for which we know how to change the framerate. This patch is based on an initial incomplete patch by Lee Jones Signed-off-by: Lee Jones Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab commit bc25068495b110fcdf35a22f43d32637e99fd018 Author: Steven Toth Date: Fri Nov 12 18:32:36 2010 -0300 [media] saa7164: Checkpatch compliance cleanup Checkpatch compliance cleanup across files in the saa7164 driver. Signed-off-by: Steven Toth Signed-off-by: Mauro Carvalho Chehab commit 0e72cc8b8d48ba05e705f432fb99aaa0ea6737c6 Author: Dan Carpenter Date: Tue Nov 2 00:22:23 2010 -0300 [media] saa7164: make buffer smaller This isn't a runtime bug, it's just to make static checkers happy. In vidioc_querycap() we copy a saa7164_dev ->name driver array into a v4l2_capability -> driver array. The ->driver array is only 16 chars long so ->name also can't be more than 16 characters. The ->name gets set in v4l2_capability() and it always is less than 16 characters so we can easily make the buffer smaller. Signed-off-by: Dan Carpenter Signed-off-by: Mauro Carvalho Chehab commit 76e4a9a7164263d8ffe816920f84a91e7dfee444 Author: Axel Lin Date: Mon Nov 1 06:25:39 2010 -0300 [media] tea6415c: return -EIO if i2c_check_functionality fails If the adapter does not support I2C_FUNC_SMBUS_WRITE_BYTE, return -EIO instead of 0. Signed-off-by: Axel Lin Acked-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 1ce6a1433572c650247480e1bbbca6bd61db7874 Author: Joe Perches Date: Sat Oct 30 18:08:31 2010 -0300 [media] drivers/media/video: Update WARN uses Add missing newlines. Signed-off-by: Joe Perches Signed-off-by: Mauro Carvalho Chehab commit 9e21ccaa69674e1b0aa887722801258f7de842db Author: VDR User Date: Sat Oct 30 15:49:49 2010 -0300 [media] dvb-usb-gp8psk: get firmware and fpga versions This patch adds retrieval of firmware and FPGA versions of Genpix devices. That information is useful for users who experience performance differences with the various firmware versions, and may want to use a specific firmware that best suits their needs. Example dmesg output: gp8psk: FW Version = 2.09.4 (0x20904) Build 2009/04/02 gp8psk: FPGA Version = 1 Signed-off-by: Derek Kelly Signed-off-by: Mauro Carvalho Chehab commit 141bb0dc2d0ad03202aef7c070555cd970ca6bf9 Author: Mauro Carvalho Chehab Date: Thu Nov 11 08:14:16 2010 -0300 [media] cx231xx: Fix i2c support at cx231xx-input There was a bug at cx231xx-input, where it were registering the remote controls twice, one via ir-kbd-i2c and another directly. Also, the patch that added rc_register_device() broke compilation for it. This patch fixes cx231xx-input by fixing the depends on, to point to the new symbol, and initializing the scanmask via platform_data. While here, also fix Kconfig symbol change for IR core dependencies. Signed-off-by: Mauro Carvalho Chehab commit 2eb258327722de3ed4d84ce1b9add2bad21a0ec4 Author: Mauro Carvalho Chehab Date: Fri Nov 12 09:02:40 2010 -0300 [media] ir-kbd-i2c: add rc_dev as a parameter to the driver There are several fields on rc_dev that drivers can benefit. Allow drivers to pass it as a parameter to the driver. For now, the rc_dev parameter is optional. If drivers don't pass it, create them internally. However, the best is to create rc_dev inside the drivers, in order to fill other fields, like open(), close(), driver_name, etc. So, a latter patch making it mandatory and changing the caller drivers is welcome. Signed-off-by: Mauro Carvalho Chehab commit 5b2e303f6df1e0b1a903950c5d613a20c8c71a37 Author: David Härdeman Date: Fri Oct 29 16:08:28 2010 -0300 [media] rc-core: convert winbond-cir Move winbond-cir from drivers/input/misc/ into drivers/media/rc/ and convert it to use rc-core. Signed-off-by: David Härdeman Signed-off-by: Mauro Carvalho Chehab commit d8b4b5822f51e2142b731b42c81e3f03eec475b2 Author: David HĂƒÂ¤rdeman Date: Fri Oct 29 16:08:23 2010 -0300 [media] ir-core: make struct rc_dev the primary interface This patch merges the ir_input_dev and ir_dev_props structs into a single struct called rc_dev. The drivers and various functions in rc-core used by the drivers are also changed to use rc_dev as the primary interface when dealing with rc-core. This means that the input_dev is abstracted away from the drivers which is necessary if we ever want to support multiple input devs per rc device. The new API is similar to what the input subsystem uses, i.e: rc_device_alloc() rc_device_free() rc_device_register() rc_device_unregister() [mchehab@redhat.com: Fix compilation on mceusb and cx231xx, due to merge conflicts] Signed-off-by: David Härdeman Acked-by: Jarod Wilson Tested-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 4c7b355df6e7f05304e05f6b7a286e59a5f1cc54 Author: David Härdeman Date: Wed Nov 10 11:04:19 2010 -0300 [media] rc-core: Code cleanup after merging rc-sysfs and rc-map into rc-main [mchehab@redhat.com: this patch were originally bundled with some renaming stuff and with the file merges, as seen at: https://patchwork.kernel.org/patch/291092/. Instead of using the original approach, I wrote the rename patches and the code merge as separate changes, then applied the difference on this patch. This way, it is easier to see the real changes at the code, and will be easier to merge upstream, especially if some conflict rises on the renaming patches] Signed-off-by: David Härdeman Acked-by: Jarod Wilson Tested-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 631493ecacd81f1af74de459c1d16f7ffa6c82c0 Author: Mauro Carvalho Chehab Date: Tue Nov 9 23:44:27 2010 -0300 [media] rc-core: merge rc-map.c into rc-main.c With this change, all rc-core functions are into just one file, except for the rc-raw specific functions. Signed-off-by: Mauro Carvalho Chehab commit bc2a6c5719efd74ce841ad0f0c9b6ea2590da6da Author: Mauro Carvalho Chehab Date: Tue Nov 9 23:18:24 2010 -0300 [media] rc-core: Merge rc-sysfs.c into rc-main.c Signed-off-by: Mauro Carvalho Chehab commit f62de675f796a992011c598c405a3d6fada9aa20 Author: Mauro Carvalho Chehab Date: Tue Nov 9 23:09:57 2010 -0300 [media] Rename rc-core files from ir- to rc- As protocol decoders are specific to InfraRed, keep their names as-is. Signed-off-by: Mauro Carvalho Chehab commit 32cf86f6d16367db5a10039c1dd938a2427d697c Author: Mauro Carvalho Chehab Date: Tue Nov 9 23:00:14 2010 -0300 [media] rename drivers/media/IR to drives/media/rc Signed-off-by: Mauro Carvalho Chehab commit 3ffea4988be3f3fa65f2104ba31eff2b5e0e82a0 Author: David HĂƒÂ¤rdeman Date: Fri Oct 29 16:08:12 2010 -0300 [media] ir-core: more cleanups of ir-functions.c cx88 only depends on VIDEO_IR because it needs ir_extract_bits(). Move that function to ir-core.h and make it inline. Lots of drivers had dependencies on VIDEO_IR when they really wanted IR_CORE. The only remaining drivers to depend on VIDEO_IR are bt8xx and saa7134 (ir_rc5_timer_end is the only function exported by ir-functions). Rename VIDEO_IR -> IR_LEGACY to give a hint to anyone writing or converting drivers to IR_CORE that they do not want a dependency on IR_LEGACY. Signed-off-by: David Härdeman Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 62c6503125389763a74911408d984c5dd09eeb97 Author: David HĂƒÂ¤rdeman Date: Fri Oct 29 16:08:07 2010 -0300 [media] ir-core: remove remaining users of the ir-functions keyhandlers This patch removes the remaining usages of the ir_input_nokey() and ir_input_keydown() functions provided by drivers/media/IR/ir-functions.c by using the corresponding functionality in ir-core instead. Signed-off-by: David Härdeman Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 2997137be8eba5bf9c07a24d5fda1f4225f9ca7d Author: David Härdeman Date: Fri Oct 29 16:08:02 2010 -0300 [media] ir-core: convert drivers/media/video/cx88 to ir-core This patch converts the cx88 driver (for sampling hw) to use the decoders provided by ir-core instead of the separate ones provided by ir-functions (and gets rid of those). The value for MO_DDS_IO had a comment saying it corresponded to a 4kHz samplerate. That comment was unfortunately misleading. The actual samplerate was something like 3250Hz. The current value has been derived by analyzing the elapsed time between interrupts for different values (knowing that each interrupt corresponds to 32 samples). Thanks to Mariusz Bialonczyk for testing my patches (about one a day for two weeks!) on actual hardware. Signed-off-by: David Härdeman Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 00df055ae315c9c8792dc4d012e6ad9c4d527e87 Author: Jarkko Nikula Date: Fri Oct 29 11:31:39 2010 -0300 [media] radio-si4713: Add regulator framework support Convert the driver to use regulator framework instead of set_power callback. This with gpio_reset platform data provide cleaner way to manage chip VIO, VDD and reset signal inside the driver. Signed-off-by: Jarkko Nikula Cc: Eduardo Valentin Signed-off-by: Mauro Carvalho Chehab commit bf797165f099296b622bcdcea1126a113e0aaac4 Author: Devin Heitmueller Date: Sat Oct 9 15:09:17 2010 -0300 [media] au0828: enable VBI timeout when calling read() without streamon() Because some clients (e.g. tvtime) will just open the filehandle and call read() instead of explicitly calling streamon first, we need to make sure the VBI timeout routine gets enabled in this case. Signed-off-by: Devin Heitmueller Signed-off-by: Mauro Carvalho Chehab commit 78ca500559b5a4f16a95c198b3e7bdfac8455bf8 Author: Devin Heitmueller Date: Sat Oct 9 14:43:53 2010 -0300 [media] au0828: fixes for timeout on no video The first pass of fixes to cause the driver to continue streaming even when there is no video arriving over the ITU656 bus were not adequate. Continue the work from the previous patch. Signed-off-by: Devin Heitmueller Signed-off-by: Mauro Carvalho Chehab commit 6e04b7b95a5bd2da0aa5df05fc09a1f0d6615666 Author: Devin Heitmueller Date: Wed Sep 1 22:03:43 2010 -0300 [media] au0828: continue video streaming even when no ITU-656 coming in We need the au0828 to continue delivering frames even when the device is not delivering video, or else applications such as tvtime will block indefinitely. Unfortunately, the au8522 doesn't have any sort of free-running mode or "blue screen on no video" like some other decoders. This work was sponsored by GetWellNetwork Inc. Signed-off-by: Devin Heitmueller Signed-off-by: Mauro Carvalho Chehab commit 301c9f26d7ded6e274a99c3a447a9a36790a3f3e Author: Devin Heitmueller Date: Sun Jun 27 18:12:42 2010 -0300 [media] au8522: Handle differences in comb filter config for s-video input Tweak the comb filter config when in s-video mode to match the Hauppauge Windows driver values (based on register dumps). This work was sponsored by GetWellNetwork Inc. Signed-off-by: Devin Heitmueller Signed-off-by: Mauro Carvalho Chehab commit d2c194ce4781d62bf671aa6b65a2fccb39feb50e Author: Devin Heitmueller Date: Sun Jun 27 18:01:40 2010 -0300 [media] au8522: fix clamp control for different video modes Straighten out the clamp control configurations for the various video modes, based off of register diffs done against the Hauppauge Windows driver. This work was sponsored by GetWellNetwork Inc. Signed-off-by: Devin Heitmueller Signed-off-by: Mauro Carvalho Chehab commit 2428a2ed6a7cbc7be6db5c70c3838a4bf0de9f48 Author: Devin Heitmueller Date: Sun Jun 27 17:40:42 2010 -0300 [media] au8522: cleanup code which disables audio decoder Cleanup the routine which disables the audio decoder. In particular, the i2s output was being shut off but the audio processor itself was not, resulting in more power being consumed than needed. Signed-off-by: Devin Heitmueller Signed-off-by: Mauro Carvalho Chehab commit bde3bb9a67d2cd260df6be9726c9c360a0e3cee9 Author: Devin Heitmueller Date: Mon Jul 5 13:05:16 2010 -0300 [media] au0828: Fix field alignment for video frames delivered by driver Fix the alignment of fields being delivered by the driver, which was resulting in jerky video when there was horizontal motion (since the bottom field of the frame was being sent with the top field of the previous frame) This work was sponsored by GetWellNetwork Inc. Signed-off-by: Devin Heitmueller Signed-off-by: Mauro Carvalho Chehab commit 83f859c5a6d6e01d671f002c0ade3498b4a4b245 Author: Devin Heitmueller Date: Fri Jun 25 01:33:39 2010 -0300 [media] au0828: set max packets per URB to match Windows driver We had the max packets per URB set to an incredibly low "10" as opposed to the Windows driver which has it as 128. Set the value to match the Windows driver, which will reduce interrupts considerably. This work was sponsored by GetWellNetwork Inc. Signed-off-by: Devin Heitmueller Signed-off-by: Mauro Carvalho Chehab commit 88464106f97fe1c143bda2b4019b07c3069d454c Author: Devin Heitmueller Date: Sun Jun 13 17:31:22 2010 -0300 [media] au8522: Properly set default brightness The chip's default value for the brightness didn't match what we were sending back in the queryctrl ioctl(), so if the application actually set the brightness to the "default", it would actually end up being way too bright. This work was sponsored by GetWellNetwork Inc. Signed-off-by: Devin Heitmueller Signed-off-by: Mauro Carvalho Chehab commit 1d00d6c1ff13607974fcd9469aa9466fcd253c3a Author: Jean-François Moine Date: Fri Oct 29 13:58:22 2010 -0300 [media] gspca: Convert some uppercase hexadecimal values to lowercase Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit a79cc7b9182abb2e3936a26064dec414b417f1d1 Author: Jean-François Moine Date: Fri Oct 29 08:10:37 2010 -0300 [media] gspca - sonixj: Simplify and clarify the hv7131r probe function Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit d581bcd78be567af7026e3d13b54ec7df8db8b82 Author: Jean-François Moine Date: Fri Oct 29 08:01:01 2010 -0300 [media] gspca - zc3xx: Bad clocksetting for mt9v111_3 with 640x480 resolution The bad value prevented the autogain to work correctly and some images were truncated. Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit a23c1947f4da31d9aac9bfc05ef22d8148b2f106 Author: Jean-François Moine Date: Fri Oct 29 07:57:03 2010 -0300 [media] gspca - main: Fix a small code error Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 0b8851b6c3934a56eb1a4ff284ab5133065e0cb8 Author: Jean-François Moine Date: Fri Oct 29 07:56:06 2010 -0300 [media] gspca - main: Version change Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 614d06917de2823d598a4b231256d08074044235 Author: Hans de Goede Date: Wed Oct 27 07:42:28 2010 -0300 [media] gspca_ov519: generate release button event on stream stop if needed Generate a release button event when the button is still pressed when the stream stops. Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab commit e0657be5615f666f261206ed62c3f0dc2527956e Author: Hans de Goede Date: Wed Oct 27 06:38:07 2010 -0300 [media] gspca_xirlink_cit: Add support camera button gspca_xirlink_cit: Add support camera button Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab commit 2c4e776aa370a7a1619c7ada0604e9003fe1d92a Author: Hans de Goede Date: Tue Oct 26 17:21:33 2010 -0300 [media] gspca_xirlink_cit: Frames have a 4 byte footer At least on the ibm netcam pro frames have a 4 byte footer, take this into account when calculating sizeimage. Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab commit bc46bae6373c87897959c7aa8fb9f6c4218695b8 Author: Hans de Goede Date: Tue Oct 26 11:18:59 2010 -0300 [media] gspca_xirlink_cit: various usb bandwidth allocation improvements / fixes The following usb bandwidth allocation changes were made to the ibm netcam pro code: - Don't restart negotiation at max packet size on stop0, as that gets called by gspca_main during negotiation. Move this to sd_isoc_init. - Don't ask for full bandwidth when running at 160x120, that does not need full bandwidth - Make minimum acceptable bandwidth depend upon resolution [mchehab@redhat.com: Fix CodingStyle problems at switch statements] Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab commit 2661da47daefd4f22f9fdc7e9294a1cb9edf515b Author: Hans de Goede Date: Tue Oct 26 05:16:32 2010 -0300 [media] gspca: only set gspca->int_urb if submitting it succeeds Currently alloc_and_submit_int_urb() is setting gspca->int_urb as soon as the allocation has succeeded, but if the subsequent submit fails, the urb gets destroyed. And then later will get destroyed again in gspca_input_destroy_urb() because gspca->int_urb is set, leading to a double free. Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab commit 314b3e0881c6acb4f40e07565ac1a7798c7698a3 Author: Hans de Goede Date: Tue Oct 26 05:15:46 2010 -0300 [media] gspca: submit interrupt urbs *after* isoc urbs Currently gspca supported usb-1.1 webcams for which we support the input button through an interrupt endpoint won't stream (not enough bandwidth error) when used through an USB-2.0 hub. After much debugging I've found out that the cause for this is that the ehci-sched.c schedeling code does not like it when there are already urb's scheduled when (large) isoc urbs are queued. By moving the submission of the interrupt urbs to after submitting the isoc urbs the camera starts working again through usb-2.0 hubs. Note that this does not fix isoc. streaming through a usb-hub while another 1.1 usb device (like the microphone of the same cam) is also active at the same time :( I've spend a long time analyzing the linux kernel ehci scheduler code, resulting in this (long) mail: http://www.spinics.net/lists/linux-usb/msg37982.html The conclusion of the following mail thread is that yes there are several issues when using usb-1.1 devices through a usb-2.0 hub, but these are not easily fixable in the current code. Fixing this in ehci-sched.c requires an almost full rewrite, which is not bound to happen anytime soon. So with this patch gspca driven usb-1.1 webcams will atleast work when connected through an usb-2.0 hub when the microphone is not used. As an added bonus this patch avoids extra destroy/create input urb cycles when we end up falling back to a lower speed alt setting because of bandwidth limitations. Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab commit 25ad9847ca09f744b4cfea362d339c8b5b49765c Author: Malcolm Priestley Date: Thu Nov 4 17:17:51 2010 -0300 [media] lmedm04: change USB Timeouts to avoid troubles DM04/QQBOX USB Timing change. Improved timing to avoid USB corruptions on some systems. Signed-off-by: Malcolm Priestley Signed-off-by: Mauro Carvalho Chehab commit afcd0806094d9ae0d944f30776edc075e4584b96 Author: Malcolm Priestley Date: Tue Nov 2 18:02:08 2010 -0300 [media] Documentation/lmedm04: Fix firmware extract information Corrected Firmware Information for LG on LME2510. Signed-off-by: Malcolm Priestley Signed-off-by: Mauro Carvalho Chehab commit f23e6616ac2dc560db0ee8733024ebe90de9161a Author: Malcolm Priestley Date: Wed Oct 27 19:50:36 2010 -0300 [media] lmed04: Improve frontend handling Improved frontend handling. Frontend now remains open at all times, with signal lock, snr & signal level polled from Interupt. Updated driver for DM04/QQBOX USB DVB-S BOXES to version 1.70. Signed-off-by: Malcolm Priestley Signed-off-by: Mauro Carvalho Chehab commit ea7c681e899bda3fceb37815d63d201c3b4be920 Author: Daniel Drake Date: Wed Oct 27 10:55:00 2010 -0300 [media] cafe_ccic: fix colorspace corruption on resume If you suspend and resume during video capture, the video colours are corrupted on resume. This is because the sensor is being unconditionally powered off during the resume path. Only power down during resume if the camera is not in use, and correctly reconfigure the sensor during resume. Fixes http://dev.laptop.org/ticket/10190 Signed-off-by: Daniel Drake Acked-by: Jonathan Corbet Signed-off-by: Mauro Carvalho Chehab commit c429e7b62a54bf34c1995b45faeaeb84104f1705 Author: Joe Perches Date: Mon Oct 25 23:44:25 2010 -0300 [media] drivers/media: Removed unnecessary KERN_s from dprintk uses Converted if (debug >= 2) printk(KERN_DEBUG... to if debug >= 2) dprintk(...) Signed-off-by: Joe Perches Signed-off-by: Mauro Carvalho Chehab commit 1bc25f7d6c0f353d3c73252048fe03a3d8f0e6b8 Author: Mauro Carvalho Chehab Date: Sat Oct 23 13:35:58 2010 -0300 [media] cx231xx: Add IR support for Pixelview Hybrid SBTVD Signed-off-by: Mauro Carvalho Chehab commit 9ab66912e0cd671fbea1b99e8a37d11b14d50baf Author: Mauro Carvalho Chehab Date: Sat Oct 23 13:28:33 2010 -0300 [media] cx231xx: Add a driver for I2C-based IR Although cx231xx has a very good IR support, already supported by mceusb driver, some designs decided to add a separate I2C microcontroller chip in order to handle IR. Due to that, add a glue to ir-kbd-i2c is needed, in order to support those devices. Signed-off-by: Mauro Carvalho Chehab commit f0551efc77b0f34a93a14d2bf96051612e352a39 Author: Mauro Carvalho Chehab Date: Sun Oct 3 07:01:26 2010 -0300 [media] Add DVB support for SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG Signed-off-by: Mauro Carvalho Chehab commit 68541cdaadecbc280cd50122f11fdbb249a2ae29 Author: Mauro Carvalho Chehab Date: Sun Oct 3 05:27:59 2010 -0300 [media] Add support for Kworld SBTVD board Signed-off-by: Mauro Carvalho Chehab commit 7572f9c5575c721f43b575a71fda1ecd896e0327 Author: Mauro Carvalho Chehab Date: Sun Oct 3 16:48:49 2010 -0300 [media] mb86a20s: add support for serial streams By comparing the traffic between Pixelview (cx23102-based and Kworld (saa7134-based), the only difference is at register 0xd5. After some tests, It seems that it is used to change mode between serial and parallel. Signed-off-by: Mauro Carvalho Chehab commit 55fa288deca4b17e539ba49a9b0d0ed474afa6f8 Author: Mauro Carvalho Chehab Date: Wed Sep 29 11:07:08 2010 -0300 [media] cx231xx: use callback to set agc on PixelView Signed-off-by: Mauro Carvalho Chehab commit ede676c72d0b18f1c15300f7874370e771489a1c Author: Mauro Carvalho Chehab Date: Mon Sep 27 23:44:27 2010 -0300 [media] add digital support for PV SBTVD hybrid Signed-off-by: Mauro Carvalho Chehab commit 9417bc6dd9de85944501f8f4ce8dd0e64135ca82 Author: Mauro Carvalho Chehab Date: Sun Sep 26 20:44:31 2010 -0300 [media] Add analog support for Pixelvied Hybrid SBTVD Signed-off-by: Mauro Carvalho Chehab commit b9ede79ada766eec535e1230970bd885489d5990 Author: Mauro Carvalho Chehab Date: Mon Sep 27 20:52:43 2010 -0300 [media] add a driver for mb86a20s This adds the trivial bits to mb86a20s. As the driver won't touch at the channel/layer parameters, this may not be enough for receiving all channels, especially ISDB-Tsb, but the driver worked properly for receiving video channels on my tests. Signed-off-by: Mauro Carvalho Chehab commit ca3dfd6a6f8364c1d51e548adb4564702f1141e9 Author: Mauro Carvalho Chehab Date: Fri Sep 10 17:29:14 2010 -0300 [media] em28xx: Add support for Leadership ISDB-T This device uses an em2874B + Sharp 921 One Seg frontend. Signed-off-by: Douglas Schilling Landgraf Signed-off-by: Mauro Carvalho Chehab commit 3a509bb11acded0dfebbfcc740d85e0774b0769a Author: Mauro Carvalho Chehab Date: Fri Sep 10 16:49:47 2010 -0300 [media] Re-write the s921 frontend On our tests with Leadership ISDBT, the s921 frontend were not work. As its design contained some weird things, it ended to be easier to just re-write it, getting another frontend as an example (cx24123). As the old s921 driver weren't used, there's no regression. Some info from the old frontend were used as a way to double check the behavior that were noticed on the USB dumps retrieved from Leadership driver. Signed-off-by: Douglas Schilling Landgraf Signed-off-by: Mauro Carvalho Chehab commit 94a544a4e8d05a027613443c529c399c39cc3371 Merge: 496a2e360a34e1f41c336d23947f800216cb9bdf 21486af0f34d03b813b023d7a2b887b329f60486 Author: Grant Likely Date: Wed Dec 29 01:05:14 2010 -0700 Merge branch 'spi' of git://git.linutronix.de/users/bigeasy/soda into spi/next * 'spi' of git://git.linutronix.de/users/bigeasy/soda into spi/next spi/pxa2xx: register driver properly spi/pxa2xx: add support for shared IRQ handler spi/pxa2xx: Use define for SSSR_TFL_MASK instead of plain numbers arm/pxa2xx: reorgazine SSP and SPI header files spi/pxa2xx: Add CE4100 support spi/pxa2xx: Consider CE4100's FIFO depth spi/pxa2xx: Add chipselect support for Sodaville spi/pxa2xx: Modify RX-Tresh instead of busy-loop for the remaining RX bytes. spi/pxa2xx: pass of_node to spi device and set a parent device commit 496a2e360a34e1f41c336d23947f800216cb9bdf Merge: 5aa68b85951aec91d6a955d1de861325fc9a3ba1 23ce17adb7fc33a4353abe4b57a03f555cced57b Author: Grant Likely Date: Wed Dec 29 00:47:29 2010 -0700 Merge branch 'for-grant' of git://arago-project.org/git/projects/linux-davinci into spi/next * 'for-grant' of git://arago-project.org/git/projects/linux-davinci into spi/next spi: davinci: fix checkpatch errors spi: davinci: whitespace cleanup spi: davinci: remove unused variable 'pdata' spi: davinci: set chip-select mode in SPIDEF only once spi: davinci: enable both activation and deactivation of chip-selects spi: davinci: remove unnecessary data transmit on CS disable spi: davinci: enable GPIO lines to be used as chip selects spi: davinci: simplify prescalar calculation spi: davinci: remove 'wait_enable' platform data member spi: davinci: make chip-slect specific parameters really chip-select specific spi: davinci: consolidate setup of SPIFMTn in one function spi: davinci: setup chip-select timers values only if timer enabled spi: davinci: add support for wait enable timeouts spi: davinci: remove unused members of davinci_spi_slave spi: davinci: eliminate the single member structure davinci_spi_slave spi: davinci: eliminate unnecessary update of davinci_spi->count spi: davinci: simplify calculation of edma acount value spi: davinci: check for NULL buffer pointer before using it spi: davinci: remove unnecessary disable of SPI spi: davinci: remove unnecessary 'count' variable in driver private data spi: davinci: remove unnecessary completion variable initialization spi: davinci: remove non-useful interrupt mode support spi: davinci: simplify poll mode transfers spi: davinci: add support for interrupt mode spi: davinci: configure the invariable bits in spipc0 only once spi: davinci: remove unnecessary function davinci_spi_bufs_prep() spi: davinci: remove unnecessary call to davinci_spi_setup_transfer() spi: davinci: do not store DMA channel information per chip select spi: davinci: always start transmit DMA spi: davinci: do not use temporary buffer if no transmit data provided spi: davinci: always start receive DMA spi: davinci: use edma_write_slot() to setup EDMA PaRAM slot spi: davinci: fix DMA event generation stoppage spi: davinci: fix EDMA CC errors at end of transfers spi: davinci: handle DMA completion errors correctly spi: davinci: remove usage of additional completion variables for DMA spi: davinci: let DMA operation be specified on per-device basis spi: davinci: remove non-useful "clk_internal" platform data spi: davinci: enable and power-up SPI only when required spi: davinci: setup the driver owner spi: davinci: add additional comments spi: davinci: add EF Johnson Technologies copyright spi: davinci: removed unused #defines spi: davinci: remove unnecessary typecast spi: davinci: do not treat Tx interrupt being set as error spi: davinci: do not allocate DMA channels during SPI device setup spi: davinci: remove unnecessary private data member 'region_size' spi: davinci: shorten variable names spi: davinci: kconfig: add manufacturer name to prompt string commit 387c31c7e5c9805b0aef8833d1731a5fe7bdea14 Author: Linus Torvalds Date: Tue Dec 28 17:05:48 2010 -0800 Linux 2.6.37-rc8 commit 6f7f41851cc4508b672ab71dd48a154712faf15c Merge: 82cd19cd93727d494c530ddd6a7338033c3fd86e e1e359273576ee8fe27021356b064c772ed29af3 Author: Linus Torvalds Date: Tue Dec 28 15:54:24 2010 -0800 Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: ring_buffer: Off-by-one and duplicate events in ring_buffer_read_page commit 82cd19cd93727d494c530ddd6a7338033c3fd86e Merge: b52e2a6d6d05421dea6b6a94582126af8cd5cca2 5cdd2de0a76d0ac47f107c8a7b32d75d25768dc1 Author: Linus Torvalds Date: Tue Dec 28 15:53:54 2010 -0800 Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86/microcode: Fix double vfree() and remove redundant pointer checks before vfree() commit 776065e36de1d5eb9e33ff908352fef4050ab38d Author: Lars-Peter Clausen Date: Tue Dec 28 21:38:03 2010 +0100 ASoC: codecs: wm8753: Fix register cache incoherency The multi-component patch(commit f0fba2ad1) moved the allocation of the register cache from the driver to the ASoC core. Most drivers where adjusted to this, but the wm8753 driver still uses its own register cache for its private functions, while functions from the ASoC core use the generic cache. Furthermore the generic cache uses zero-based numbering while the wm8753 cache uses one-based numbering. Thus we end up with two from each other incoherent caches, which leads to undefined behaviour and crashes. This patch fixes the issue by changing the wm8753 driver to use the generic register cache in its private functions. Signed-off-by: Lars-Peter Clausen Signed-off-by: Mark Brown commit da280f51d0b341282b4181eb3235f774b0446584 Author: Lars-Peter Clausen Date: Tue Dec 28 21:38:02 2010 +0100 ASoC: codecs: wm9090: Fix register cache incoherency The multi-component patch(commit f0fba2ad1) moved the allocation of the register cache from the driver to the ASoC core. Most drivers where adjusted to this, but the wm9090 driver still uses its own register cache for its private functions, while functions from the ASoC core use the generic cache. Thus we end up with two from each other incoherent caches, which can lead to undefined behaviour. This patch fixes the issue by changing the wm9090 driver to use the generic register cache in its private functions. Signed-off-by: Lars-Peter Clausen Signed-off-by: Mark Brown Cc: stable@kernel.org (for 2.6.37 only) commit 7f87e30ef29951f4509a7f86acf00e1ba48af54a Author: Lars-Peter Clausen Date: Tue Dec 28 21:38:01 2010 +0100 ASoC: codecs: wm8962: Fix register cache incoherency The multi-component patch(commit f0fba2ad1) moved the allocation of the register cache from the driver to the ASoC core. Most drivers where adjusted to this, but the wm8962 driver still uses its own register cache for its private functions, while functions from the ASoC core use the generic cache. Thus we end up with two from each other incoherent caches, which can lead to undefined behaviour. This patch fixes the issue by changing the wm8962 driver to use the generic register cache in its private functions. Signed-off-by: Lars-Peter Clausen Signed-off-by: Mark Brown Cc: stable@kernel.org (for 2.6.37 only) commit 715920d04c787ed718327da53cf51689e51ef3ce Author: Lars-Peter Clausen Date: Tue Dec 28 21:38:00 2010 +0100 ASoC: codecs: wm8955: Fix register cache incoherency The multi-component patch(commit f0fba2ad1) moved the allocation of the register cache from the driver to the ASoC core. Most drivers where adjusted to this, but the wm8955 driver still uses its own register cache for its private functions, while functions from the ASoC core use the generic cache. Thus we end up with two from each other incoherent caches, which can lead to undefined behaviour. This patch fixes the issue by changing the wm8955 driver to use the generic register cache in its private functions. Signed-off-by: Lars-Peter Clausen Signed-off-by: Mark Brown Cc: stable@kernel.org (for 2.6.37 only) commit f578a188e8b21be623b48bb0eb3a92174c2e5b82 Author: Lars-Peter Clausen Date: Tue Dec 28 21:37:59 2010 +0100 ASoC: codecs: wm8904: Fix register cache incoherency The multi-component patch(commit f0fba2ad1) moved the allocation of the register cache from the driver to the ASoC core. Most drivers where adjusted to this, but the wm8904 driver still uses its own register cache for its private functions, while functions from the ASoC core use the generic cache. Thus we end up with two from each other incoherent caches, which can lead to undefined behaviour. This patch fixes the issue by changing the wm8904 driver to use the generic register cache in its private functions. Signed-off-by: Lars-Peter Clausen Cc: Ian Lartey Cc: Dimitris Papastamos Signed-off-by: Mark Brown Cc: stable@kernel.org (for 2.6.37 only) commit 52ca353bc8597dcc1d6d7abc03eecc1b452d79c9 Author: Lars-Peter Clausen Date: Tue Dec 28 21:37:58 2010 +0100 ASoC: codecs: wm8741: Fix register cache incoherency The multi-component patch(commit f0fba2ad1) moved the allocation of the register cache from the driver to the ASoC core. Most drivers where adjusted to this, but the wm8741 driver still uses its own register cache for its private functions, while functions from the ASoC core use the generic cache. Thus we end up with two from each other incoherent caches, which can lead to undefined behaviour. This patch fixes the issue by changing the wm8741 driver to use the generic register cache in its private functions. Signed-off-by: Lars-Peter Clausen Cc: Ian Lartey Cc: Dimitris Papastamos Signed-off-by: Mark Brown Cc: stable@kernel.org (for 2.6.37 only) commit beebca312009e9567d5e0229ea6b82bdf9a864cf Author: Lars-Peter Clausen Date: Tue Dec 28 21:37:57 2010 +0100 ASoC: codecs: wm8523: Fix register cache incoherency The multi-component patch(commit f0fba2ad1) moved the allocation of the register cache from the driver to the ASoC core. Most drivers where adjusted to this, but the wm8523 driver still uses its own register cache for its private functions, while functions from the ASoC core use the generic cache. Thus we end up with two from each other incoherent caches, which can lead to undefined behaviour. This patch fixes the issue by changing the wm8523 driver to use the generic register cache in its private functions. Signed-off-by: Lars-Peter Clausen Cc: Ian Lartey Cc: Dimitris Papastamos Signed-off-by: Mark Brown Cc: stable@kernel.org (for 2.6.37 only) commit d24eb0db9c8a7ceecae860bdc636ed1e8a86943a Author: Lars-Peter Clausen Date: Tue Dec 28 21:37:56 2010 +0100 ASoC: codecs: max98088: Fix register cache incoherency The multi-component patch(commit f0fba2ad1) moved the allocation of the register cache from the driver to the ASoC core. Most drivers where adjusted to this, but the max98088 driver still uses its own register cache for its private functions, while functions from the ASoC core use the generic cache. Thus we end up with two from each other incoherent caches, which can lead to undefined behaviour. This patch fixes the issue by changing the max98088 driver to use the generic register cache in its private functions. Signed-off-by: Lars-Peter Clausen Cc: Peter Hsiang Signed-off-by: Mark Brown Cc: stable@kernel.org (for 2.6.37 only) commit 7f984b55acb6530bf854bfcac13104228f3336c1 Author: Lars-Peter Clausen Date: Tue Dec 28 21:08:57 2010 +0100 ASoC: codecs: Add missing control_type initialization Some codec drivers do not initialize the control_type field in their private device struct, but still use it when calling snd_soc_codec_set_cache_io. This patch fixes the issue by properly initializing it in the drivers probe functions. Signed-off-by: Lars-Peter Clausen Signed-off-by: Mark Brown Cc: stable@kernel.org (for 2.6.37 only) commit e7d282535c94cddc208c03b7cd0815f70d676a0e Author: Joe Perches Date: Thu Dec 9 23:16:55 2010 -0800 [IA64] Remove unlikely from cpu_is_offline cpu_is_offline already uses unlikely internally. Signed-off-by: Joe Perches Signed-off-by: Tony Luck commit 409e590572d980c314e989e94176bcb060130fae Author: Jiri Slaby Date: Mon Nov 22 10:41:19 2010 +0100 [IA64] irq_ia64, use set_irq_chip Don't access desc->chip directly, because them chip member will disappear some time later. Signed-off-by: Jiri Slaby Cc: Thomas Gleixner Signed-off-by: Tony Luck commit e21763dbce76d3a07ead438f8811b3e4bce0825b Author: Jesper Juhl Date: Sat Oct 30 21:35:58 2010 +0200 [IA64] perfmon: Change vmalloc to vzalloc and drop memset. vzalloc() nicely zeroes memory for us, so we don't have to do a vmalloc() and then manually memset() the returned memory when all we want is for it to be zero. Patch changes this for pfm_rvmalloc(). Signed-off-by: Jesper Juhl Signed-off-by: Tony Luck commit 75c1c91cb92806f960fcd6e53d2a0c21f343081c Author: Dimitri Sivanich Date: Tue Dec 28 13:34:42 2010 -0600 [IA64] eliminate race condition in smp_flush_tlb_mm A race condition exists within smp_call_function_many() when called from smp_flush_tlb_mm(). On rare occasions the cpu_vm_mask can be cleared while smp_call_function_many is executing, occasionally resulting in a hung process. Make a copy of the mask prior to calling smp_call_function_many(). Signed-off-by: Dimitri Sivanich Signed-off-by: Tony Luck commit a7dd6027e55992dd7c409a71a4a2b576fda2f7c2 Author: Dan Carpenter Date: Thu Dec 23 20:15:39 2010 +0000 vxge: remove duplicated part of check This is just a cleanup to make the static checkers happy. We don't need to check "own" twice. Signed-off-by: Dan Carpenter Acked-by: Ram Vepa Signed-off-by: David S. Miller commit 4a5fc4e179d79c79ad87bfc12a2d7e9b2371e40c Author: Dan Carpenter Date: Thu Dec 23 19:17:34 2010 +0000 skfp: testing the wrong variable in skfp_driver_init() The intent here was to test if the allocation failed but we tested "SharedMemSize" instead of "SharedMemAddr" by mistake. Signed-off-by: Dan Carpenter Reviewed-by: Jiri Pirko Signed-off-by: David S. Miller commit d39cd5e99a0ad88aba6793fb5e5f34e29cda6e6f Author: stephen hemminger Date: Mon Dec 20 17:58:33 2010 +0000 ppp: allow disabling multilink protocol ID compression Linux would not connect to other router running old version Cisco IOS (12.0). This is most likely a bug in that version of IOS, since it is fixed in later versions. As a workaround this patch allows a module parameter to be set to disable compressing the protocol ID. See: https://bugzilla.vyatta.com/show_bug.cgi?id=3979 RFC 1990 allows an implementation to formulate MP fragments as if protocol compression had been negotiated. This allows us to always send compressed protocol IDs. But some implementations don't accept MP fragments with compressed protocol IDs. This parameter allows us to interoperate with them. The default value of the configurable parameter is the same as the current behavior: protocol compression is enabled. If protocol compression is disabled we will not send compressed protocol IDs. This is based on an earlier patch by Bob Gilligan (using a sysctl). Module parameter is writable to allow for enabling even if ppp is already loaded for other uses. Signed-off-by: Stephen Hemminger Acked-by: Eric Dumazet Acked-by: Paul Mackerras Signed-off-by: David S. Miller commit c4711786986af0cce654f493426ee0a1055e4b17 Author: Breno Leitao Date: Mon Dec 20 09:02:37 2010 +0000 ehea: Avoid changing vlan flags This patch avoids disabling the vlan flags using ethtool. Signed-off-by: Breno Leitao Signed-off-by: David S. Miller commit 12f188f2e59394ec1f1c8c0a4439f48ec16bc336 Author: Dan Williams Date: Sun Dec 19 08:17:50 2010 +0000 ueagle-atm: fix PHY signal initialization race A race exists when initializing ueagle-atm devices where the generic atm device may not yet be created before the driver attempts to initialize it's PHY signal state, which checks whether the atm device has been created or not. This often causes the sysfs 'carrier' attribute to be '1' even though no signal has actually been found. uea_probe usbatm_usb_probe driver->bind (uea_bind) uea_boot kthread_run(uea_kthread) uea_kthread usbatm_atm_init uea_start_reset atm_dev_register UPDATE_ATM_SIGNAL UPDATE_ATM_SIGNAL checks whether the ATM device has been created and if not, will not update the PHY signal state. Because of the race that does not always happen in time, and the PHY signal state remains ATM_PHY_SIG_FOUND even though no signal exists. To fix the race, just create the kthread during initialization, and only after initialization is complete, start the thread that reboots the device and initializes PHY state. [ 3030.490931] uea_probe: calling usbatm_usb_probe [ 3030.490946] ueagle-atm 8-2:1.0: usbatm_usb_probe: trying driver ueagle-atm with vendor=1110, product=9031, ifnum 0 [ 3030.493691] uea_bind: setting usbatm [ 3030.496932] usb 8-2: [ueagle-atm] using iso mode [ 3030.497283] ueagle-atm 8-2:1.0: usbatm_usb_probe: using 3021 byte buffer for rx channel 0xffff880125953508 [ 3030.497292] usb 8-2: [ueagle-atm] (re)booting started [ 3030.497298] uea_start_reset: atm dev (null) [ 3030.497306] ueagle-atm 8-2:1.0: usbatm_usb_probe: using 3392 byte buffer for tx channel 0xffff8801259535b8 [ 3030.497374] usbatm_usb_probe: about to init [ 3030.497379] usbatm_usb_probe: calling usbatm_atm_init [ 3030.497384] usbatm_atm_init: creating atm device! Signed-off-by: Dan Williams Signed-off-by: David S. Miller commit b52e2a6d6d05421dea6b6a94582126af8cd5cca2 Merge: bec41d5b8417ccb98e4752affa24e1dc563d99f9 994e0b2c3646ce0ca0e4546e6b10c5cf66b976bf Author: Linus Torvalds Date: Tue Dec 28 11:23:50 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6: PCI hotplug: Fix unexpected driver unregister in pciehp_acpi.c commit bec41d5b8417ccb98e4752affa24e1dc563d99f9 Merge: 92a8cd42673f119896df7e964976c18952eb9970 24d8c0293b04ad207648bb2a0dbfebff8b47d166 Author: Linus Torvalds Date: Tue Dec 28 11:23:30 2010 -0800 Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6 * 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: [media] v4l: soc-camera: fix multiple simultaneous user case commit 92a8cd42673f119896df7e964976c18952eb9970 Merge: 88a58101608f1416f4c1ec81d88faed258a34b3d 274476f8fe0b6ac9bac542cc39de12c3dd0f43f6 Author: Linus Torvalds Date: Tue Dec 28 11:22:58 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc: mmc: Fix re-probing with PM_POST_RESTORE notification mmc: atmel-mci: fix multiblock SDIO transfers mmc: at91_mci: fix multiblock SDIO transfers commit 88a58101608f1416f4c1ec81d88faed258a34b3d Author: Imre Kaloz Date: Mon Dec 27 22:59:57 2010 +0100 ARM: fix IXP4xx build failure arm: export dma_set_coherent_mask While a regression was fixed with commit 710224fa2750cf (arm: fix "arm: fix pci_set_consistent_dma_mask for dmabounce devices"), a new one was introduced as dma_set_coherent_mask wasn't exported for modules. This patch takes care for this issue. Signed-off-by: Imre Kaloz Signed-off-by: Krzysztof HaÅ‚asa Signed-off-by: Linus Torvalds commit 1873bb8115e678ad9fd0aac9dbbc68383bc36e06 Author: Ahmed S. Darwish Date: Sat Dec 25 11:57:09 2010 +0200 RAMOOPS: Don't overflow over non-allocated regions The current code mis-calculates the ramoops header size, leading to an overflow over the next record at best, or over a non-allocated region at worst. Fix that calculation. Signed-off-by: Ahmed S. Darwish Acked-by: Marco Stornelli Cc: stable@kernel.org Signed-off-by: Linus Torvalds commit 202b6ca149dc90d3d81772413e1e1c0b65e83012 Author: Ping Cheng Date: Fri Dec 24 13:13:25 2010 -0800 Input: wacom_w8001 - use __set_bit to set keybits This makes code safer and easier to read. Signed-off-by: Ping Cheng Signed-off-by: Dmitry Torokhov commit 5c461b913a16aed8afa285a1d00414791a9afe33 Merge: ef11e701f32fb0cd5c5f0f6fb9a9e28fab151219 4f56ce929cab45a3a6e1a81700da52bb9bdbfc0f Author: Dmitry Torokhov Date: Mon Dec 27 17:33:20 2010 -0800 Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rydberg/input-mt into next commit ef11e701f32fb0cd5c5f0f6fb9a9e28fab151219 Author: David Sterba Date: Mon Dec 27 17:20:01 2010 -0800 Input: bu21013_ts - fix misuse of logical operation in place of bitop Signed-off-by: David Sterba Acked-by: Linus Walleij Signed-off-by: Dmitry Torokhov commit a06a09c802c869426cfe8c405c381c985c3b25b2 Author: Pali RohĂ¡r Date: Mon Dec 27 17:21:45 2010 -0800 Input: i8042 - add Acer Aspire 5100 to the Dritek list This patch adds notebook Acer Aspire 5100 to the list of Dritek HW. Acer Aspire 5100 needs Dritek keyboard extension to support all Fn keys. Signed-off-by: Pali RohĂ¡r Tested-by: Pali RohĂ¡r Signed-off-by: Dmitry Torokhov commit 731ece41fb1047816303295a0cdfed90a528137e Author: Olof Johansson Date: Fri Dec 10 02:09:23 2010 -0600 modpost: Fix address calculation in reloc_location() This patch fixes a segfault in modpost that is observed when the gold linker is used to link the input objects. The problem is that reloc_location (modpost.c) is computing the address of the relocation target incorrectly. Here, elf->hdr points to the beginning of the ELF file in memory, sechdr points to the relocation section header, section is the index of the section being relocated, and sechdrs[section].sh_offset would be the offset of that section, relative to the beginning of the ELF file. Adding elf->hdr + sechdrs[section].sh_offset gives you the address of the beginning of the section, and adding r->r_offset to that gives you the address of the location to be relocated. You do not need to subtract sechdrs[section].sh_addr from that -- the result of this is an address outside the file, and causes the segfault when addend_386_rel tries to dereference it. This bug is not observed when GNU ld is used to link the inputs. The object file ubuntu/omnibook/omnibook.o is the result of an ld -r of several other files. When GNU ld does an ld -r, it sets the vaddr field for each section to 0, but gold lays out the section addresses sequentially instead: Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .text PROGBITS 00000000 000034 004794 00 AX 0 0 4 [ 2] .data PROGBITS 0000b9d0 0047c8 0009c0 00 WA 0 0 4 [ 3] .bss NOBITS 000162f8 005188 00013c 00 WA 0 0 4 [ 4] .rodata.str1.1 PROGBITS 00004f2d 0052c4 001b1a 01 AMS 0 0 1 [ 5] .init.text PROGBITS 00004794 006dde 0005fa 00 AX 0 0 1 [ 6] .exit.text PROGBITS 00004d8e 0073d8 00018a 00 AX 0 0 1 ... So the bug in the tool remained undiscovered because the section's vaddr always happened to be 0. Signed-off-by: Raymes Khoury Signed-off-by: Olof Johansson Signed-off-by: Michal Marek commit c8217b8305e5e75c23617f2f4cd262527d952c0a Author: Cliff Wickman Date: Mon Dec 13 10:51:57 2010 -0600 x86, paravirt: Use native_halt on a halt, not native_safe_halt halt() should use native_halt() safe_halt() uses native_safe_halt() If CONFIG_PARAVIRT=y, halt() is defined in arch/x86/include/asm/paravirt.h as static inline void halt(void) { PVOP_VCALL0(pv_irq_ops.safe_halt); } Otherwise (no CONFIG_PARAVIRT) halt() in arch/x86/include/asm/irqflags.h is static inline void halt(void) { native_halt(); } So it looks to me like the CONFIG_PARAVIRT case of using native_safe_halt() for a halt() is an oversight. Am I missing something? It probably hasn't shown up as a problem because the local apic is disabled on a shutdown or restart. But if we disable interrupts and call halt() we shouldn't expect that the halt() will re-enable interrupts. Signed-off-by: Cliff Wickman LKML-Reference: Signed-off-by: H. Peter Anvin commit 32ae2ade462146729580117d9886cc9efd83dfbe Author: Franck Bui-Huu Date: Thu Dec 23 16:04:23 2010 +0100 perf probe: Fix short file name probe location reporting After adding probes, perf-probe(1) reports the probes locations which include filenames for certain cases. But for short file names (whose length < 32), perf-probe didn't display the name correctly. It actually skipped the first character. Here's an example where 'icmp.c' was screwed: $ perf probe -n -a "icmp.c;sk=*" Add new events: probe:icmp_push_reply (on @cmp.c) probe:icmp_reply (on @cmp.c) probe:icmp_reply_1 (on @cmp.c) probe:icmp_send (on @cmp.c) probe:icmp_send_1 (on @cmp.c) probe:icmp_error (on @cmp.c) probe:icmp_error_1 (on @cmp.c) probe:icmp_error_2 (on @cmp.c) probe:icmp_error_3 (on @cmp.c) This patch fixes this bug in synthesize_perf_probe_point(). Acked-by: Masami Hiramatsu Cc: Masami Hiramatsu LKML-Reference: Signed-off-by: Franck Bui-Huu Signed-off-by: Arnaldo Carvalho de Melo commit 0597fcd08b858df83b9f20afd6035311d92c48f8 Author: Arnaud Lacombe Date: Thu Dec 23 03:25:16 2010 -0500 kconfig: fix warning In file included from scripts/kconfig/zconf.tab.c:2502: scripts/kconfig/expr.c:1033: warning: no previous prototype for 'expr_simplify_unmet_dep' Reported-by: Stephen Rothwell Signed-off-by: Arnaud Lacombe Signed-off-by: Michal Marek commit ffc96d628b651b69b39909fc3e9e8f465df1eed3 Merge: c816d7c64e82cae69fa5c7365474d37444a97ccf 29c185e5c681ca00d863d161eda7eadb93e32ee5 Author: Linus Torvalds Date: Mon Dec 27 10:36:27 2010 -0800 Merge branch 'nommu-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/nommu-2.6 * 'nommu-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/nommu-2.6: nommu: Provide stubbed alloc/free_vm_area() implementation. nommu: Fix up vmalloc_node() symbol export regression. commit c816d7c64e82cae69fa5c7365474d37444a97ccf Merge: b094a870ae33426442b0cbcf8025f1ef919d1def 30f2ba38011247ad95bffbf0743a0dc0656a5eb7 Author: Linus Torvalds Date: Mon Dec 27 10:34:09 2010 -0800 Merge branch 'sh-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 * 'sh-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6: sh: intc: Initialize radix tree gfp mask explicitly. sh: Fix up SH7201 clkfwk build. sh: mach-se: Fix up SE7206 build. sh: Fix up SH4-202 clkfwk build. commit b094a870ae33426442b0cbcf8025f1ef919d1def Merge: 4e838c7e6ebaf7b2febaafe2cd598a44fdceb094 cb59bfc59024115279de0d7612558caa72ec95f1 Author: Linus Torvalds Date: Mon Dec 27 10:33:30 2010 -0800 Merge branch 'fbdev-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6 * 'fbdev-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6: fbdev: sh_mobile_lcdc: increase maximum framebuffer size to support 1080p video: imxfb: Fix the maximum value for yres fb: fix overlapping test off-by-one. fbdev: sh-mobile: retrieve and propagate display sizes from EDID fbdev: sh-mobile: restore display size configuration commit 4e838c7e6ebaf7b2febaafe2cd598a44fdceb094 Merge: bbbcde9d9614683fbeb41f00728cfbfb7f75a7ad ff5dd32b997a5a5ce3f4256257991133d694da0b Author: Linus Torvalds Date: Mon Dec 27 10:25:02 2010 -0800 Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev * 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev: pata_cs5536: avoid implicit MSR API inclusion on x86-64 commit 86280a208825d55ba988420b6b0ed2d6b9ec80f8 Author: David Sterba Date: Mon Dec 27 16:27:43 2010 +0100 HID: picolcd: fix misuse of logical operation in place of bitop CC: Bruno PrĂ©mont CC: Jiri Kosina Signed-off-by: David Sterba Signed-off-by: Jiri Kosina commit cb59bfc59024115279de0d7612558caa72ec95f1 Author: Guennadi Liakhovetski Date: Thu Nov 4 11:06:06 2010 +0000 fbdev: sh_mobile_lcdc: increase maximum framebuffer size to support 1080p LCDC hardware can support 1920x1080 formats, adjust the driver to cover them. Besides, instead of guessing some "reasonable" validity checks, only verify values in .fb_check_var(), that we are sure, we cannot support. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit 60328917e6019c7f8a2e70c08d433a05ba9fcfb7 Author: Fabio Estevam Date: Fri Dec 24 10:28:24 2010 -0200 video: imxfb: Fix the maximum value for yres MX27 and MX25 have 10 bits in the YMAX field of LCDC Size Register. Fix the maximum value for yres. Signed-off-by: Fabio Estevam Signed-off-by: Paul Mundt commit 5cdd2de0a76d0ac47f107c8a7b32d75d25768dc1 Author: Jesper Juhl Date: Sat Dec 25 19:57:41 2010 +0100 x86/microcode: Fix double vfree() and remove redundant pointer checks before vfree() In arch/x86/kernel/microcode_intel.c::generic_load_microcode() we have this: while (leftover) { ... if (get_ucode_data(mc, ucode_ptr, mc_size) || microcode_sanity_check(mc) < 0) { vfree(mc); break; } ... } if (mc) vfree(mc); This will cause a double free of 'mc'. This patch fixes that by just removing the vfree() call in the loop since 'mc' will be freed nicely just after we break out of the loop. There's also a second change in the patch. I noticed a lot of checks for pointers being NULL before passing them to vfree(). That's completely redundant since vfree() deals gracefully with being passed a NULL pointer. Removing the redundant checks yields a nice size decrease for the object file. Size before the patch: text data bss dec hex filename 4578 240 1032 5850 16da arch/x86/kernel/microcode_intel.o Size after the patch: text data bss dec hex filename 4489 240 984 5713 1651 arch/x86/kernel/microcode_intel.o Signed-off-by: Jesper Juhl Acked-by: Tigran Aivazian Cc: Shaohua Li LKML-Reference: Signed-off-by: Ingo Molnar commit 17f7f4d9fcce8f1b75b5f735569309dee7665968 Merge: 041110a439e21cd40709ead4ffbfa8034619ad77 d7c1255a3a21e98bdc64df8ccf005a174d7e6289 Author: David S. Miller Date: Sun Dec 26 22:37:05 2010 -0800 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 Conflicts: net/ipv4/fib_frontend.c commit ff5dd32b997a5a5ce3f4256257991133d694da0b Author: Jeff Garzik Date: Sun Dec 26 19:42:15 2010 -0500 pata_cs5536: avoid implicit MSR API inclusion on x86-64 We don't need or want MSR usage here, on x86-64. x86-64 was disabled intentionally in Kconfig, but commit 9272dcc232b84ccb027d6861077934055d42764d changed that. drivers/ata/pata_cs5536.c:47:1: warning: "rdmsr" redefined In file included from arch/x86/include/asm/irqflags.h:60, from include/linux/irqflags.h:15, from arch/x86/include/asm/system.h:11, from arch/x86/include/asm/processor.h:17, from include/linux/prefetch.h:14, from include/linux/list.h:7, from include/linux/module.h:9, from drivers/ata/pata_cs5536.c:33: arch/x86/include/asm/paravirt.h:146:1: warning: this is the location of the previous definition drivers/ata/pata_cs5536.c:48:1: warning: "wrmsr" redefined arch/x86/include/asm/paravirt.h:154:1: warning: this is the location of the previous definition Reported-by: Stephen Rothwell Signed-off-by: Jeff Garzik commit bbbcde9d9614683fbeb41f00728cfbfb7f75a7ad Merge: d7c1255a3a21e98bdc64df8ccf005a174d7e6289 5acdb1af907d5908b4942d425c0983f353dd8fc5 cde44d1740bcb3dcfecbf792a71826431e61686e Author: Len Brown Date: Sun Dec 26 17:05:07 2010 -0500 Merge branches 'bugzilla-25412' and 'bugzilla-25302' into release commit 5acdb1af907d5908b4942d425c0983f353dd8fc5 Author: Rafael J. Wysocki Date: Sun Dec 26 12:47:06 2010 +0100 ACPI / ACPICA: Disable GPEs during initialization GPEs with corresponding _Lxx/_Exx control methods need to be disabled during initialization in case they have been enabled by the BIOS, so that they don't fire up until they are enabled by acpi_update_gpes(). References: https://bugzilla.kernel.org/show_bug.cgi?id=25412 Signed-off-by: Rafael J. Wysocki Signed-off-by: Len Brown commit d7c1255a3a21e98bdc64df8ccf005a174d7e6289 Merge: d3c7e1ab043abd7706db4fbccf327df9e62f7990 fc75fc8339e7727167443469027540b283daac71 Author: Linus Torvalds Date: Sun Dec 26 12:06:56 2010 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (42 commits) ipv4: dont create routes on down devices epic100: hamachi: yellowfin: Fix skb allocation size sundance: Fix oopses with corrupted skb_shared_info Revert "ipv4: Allow configuring subnets as local addresses" USB: mcs7830: return negative if auto negotiate fails irda: prevent integer underflow in IRLMP_ENUMDEVICES tcp: fix listening_get_next() atl1c: Do not use legacy PCI power management mac80211: fix mesh forwarding MAINTAINERS: email address change net: Fix range checks in tcf_valid_offset(). net_sched: sch_sfq: fix allot handling hostap: remove netif_stop_queue from init mac80211/rt2x00: add ieee80211_tx_status_ni() typhoon: memory corruption in typhoon_get_drvinfo() net: Add USB PID for new MOSCHIP USB ethernet controller MCS7832 variant net_sched: always clone skbs ipv6: Fragment locally generated tunnel-mode IPSec6 packets as needed. netlink: fix gcc -Wconversion compilation warning asix: add USB ID for Logitec LAN-GTJ U2A ... commit 003ea98195eebdfcf476317b517e8c29a25b9d10 Author: Wey-Yi Guy Date: Wed Dec 15 08:06:23 2010 -0800 iwlwifi: remove reference to Gen2 The correct name should be used for the newer devices, remove reference to Gen2 Signed-off-by: Wey-Yi Guy commit bdb84fec61aab7047b1b108b6b6824c003bc4d11 Author: Johannes Berg Date: Wed Dec 15 06:07:56 2010 -0800 iwlagn: fix FH error # iw wlan0 interface add moni0 type monitor flags control # ip link set moni0 up causes a continuous spew of FH_ERROR from the device. Fix this by not setting the CTL2HOST filter by itself -- CTL + promisc works fine. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit e88735d711948a580741fd337afd4ec11c395174 Author: Wey-Yi Guy Date: Sat Dec 11 08:46:56 2010 -0800 iwlwifi: remove extra string For "led_mode" module parameters, string "led_mode" is duplicated twice, remove one. Signed-off-by: Wey-Yi Guy commit fc75fc8339e7727167443469027540b283daac71 Author: Eric Dumazet Date: Wed Dec 22 04:39:39 2010 +0000 ipv4: dont create routes on down devices In ip_route_output_slow(), instead of allowing a route to be created on a not UPed device, report -ENETUNREACH immediately. # ip tunnel add mode ipip remote 10.16.0.164 local 10.16.0.72 dev eth0 # (Note : tunl1 is down) # ping -I tunl1 10.1.2.3 PING 10.1.2.3 (10.1.2.3) from 192.168.18.5 tunl1: 56(84) bytes of data. (nothing) # ./a.out tunl1 # ip tunnel del tunl1 Message from syslogd@shelby at Dec 22 10:12:08 ... kernel: unregister_netdevice: waiting for tunl1 to become free. Usage count = 3 After patch: # ping -I tunl1 10.1.2.3 connect: Network is unreachable Reported-by: Nicolas Dichtel Signed-off-by: Eric Dumazet Reviewed-by: Octavian Purdila Signed-off-by: David S. Miller commit 7a36df8a857edee8cd8967cbe99a85574d22f482 Author: Jarek Poplawski Date: Sat Dec 25 07:39:59 2010 +0000 epic100: hamachi: yellowfin: Fix skb allocation size Joel Soete reported oopses during pppoe over sundance NIC, caused by a bug in skb allocation and dma mapping code, where skb_reserve() bytes weren't taken into account. As a followup to the patch: "sundance: Fix oopses with corrupted skb_shared_info" very similar code is fixed here for three other drivers. Signed-off-by: Jarek Poplawski Cc: Joel Soete Cc: Eric Dumazet Signed-off-by: David S. Miller commit 78a36f25478432835f2f1e46202b71ff3ae454ff Author: Jarek Poplawski Date: Sat Dec 25 05:12:17 2010 +0000 sundance: Fix oopses with corrupted skb_shared_info Joel Soete reported oopses at the beginning of pppoe connections since v2.6.35. After debugging the bug was found in sundance skb allocation and dma mapping code, where skb_reserve() bytes aren't taken into account. This is an old bug, only uncovered by some change in 2.6.35. Initial debugging patch by: Eric Dumazet Reported-by: Joel Soete Tested-by: Joel Soete Signed-off-by: Jarek Poplawski Cc: Eric Dumazet Signed-off-by: David S. Miller commit 041110a439e21cd40709ead4ffbfa8034619ad77 Merge: a1a5da57d0884017b8c3a011a28d4f5e08a2ea4f 2316aa2aee254c126e688b53a3a105b82bc3f368 Author: David S. Miller Date: Sat Dec 25 19:20:38 2010 -0800 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/jkirsher/net-next-2.6 commit a1a5da57d0884017b8c3a011a28d4f5e08a2ea4f Author: Rasesh Mody Date: Thu Dec 23 21:45:10 2010 +0000 bna: Update the driver version to 2.3.2.3 Signed-off-by: Debashis Dutt Signed-off-by: Rasesh Mody Signed-off-by: David S. Miller commit 1d32f7696286eef9e5644eb57e79a36756274357 Author: Rasesh Mody Date: Thu Dec 23 21:45:09 2010 +0000 bna: IOC failure auto recovery fix Change Details: - Made IOC auto_recovery synchronized and not timer based. - Only one PCI function will attempt to recover and reinitialize the ASIC on a failure, that too after all the active PCI functions acknowledge the IOC failure. Signed-off-by: Debashis Dutt Signed-off-by: Rasesh Mody Signed-off-by: David S. Miller commit aad75b66f1d3784514351f06bc589c55d5325bc8 Author: Rasesh Mody Date: Thu Dec 23 21:45:08 2010 +0000 bna: Restore VLAN filter table Change Details: - Retrieve the VLAN configuration from the networking stack and apply it to the base interface during ifconfig up Signed-off-by: Debashis Dutt Signed-off-by: Rasesh Mody Signed-off-by: David S. Miller commit ce9b9f383775e6de74ca4c93d5c643dc3d76dd3c Author: Rasesh Mody Date: Thu Dec 23 21:45:07 2010 +0000 bna: Removed unused code Change Details: - Remove unused APIs and code cleanup Signed-off-by: Debashis Dutt Signed-off-by: Rasesh Mody Signed-off-by: David S. Miller commit 2c7d38210ff8e65f8961699bce92c273c77d113c Author: Rasesh Mody Date: Thu Dec 23 21:45:06 2010 +0000 bna: IOC uninit check and misc cleanup Change Details: - Added a check in ioc firmware lock function to see if IOC is in BFI_IOC_UNINIT state or not. If it is not in UNINIT state and the last IOC boot was not done by OS driver, force IOC state to BFI_IOC_UNINIT - Unused macro and API cleanup Signed-off-by: Debashis Dutt Signed-off-by: Rasesh Mody Signed-off-by: David S. Miller commit f7c0fa4cd5dcf58dd95b216d2c33444a3b4a44e0 Author: Rasesh Mody Date: Thu Dec 23 21:45:05 2010 +0000 bna: Fix for TX queue Change Details: - Call netif_wake_queue() if we have freed up sufficient elements at the end of completion processing - Add netif_queue_stopped counter back to bnad_drv_stats {} - Get netif_queue_stopped value from stack - Remove BUG_ON() on value returned by pci_unmap_addr() Signed-off-by: Debashis Dutt Signed-off-by: Rasesh Mody Signed-off-by: David S. Miller commit 886f7fedb0cee56acca7620d89186669273d3d56 Author: Rasesh Mody Date: Thu Dec 23 21:45:04 2010 +0000 bna: Enable pure priority tagged packet reception and rxf uninit cleanup fix Change Details: - Enable reception of pure priority tagged packets by default by turning on VLAN Id = 0 - Clear the promiscuous mode, all multicast mode flags when bna_rxf_uninit is called Signed-off-by: Debashis Dutt Signed-off-by: Rasesh Mody Signed-off-by: David S. Miller commit 815f41e74031d6dc6d6dd988f58c03a1d72d02b9 Author: Rasesh Mody Date: Thu Dec 23 21:45:03 2010 +0000 bna: Fix ethtool register dump and reordered an API Change Details: - Removed semaphore register dump from ethtool - Moved netif_carrier_off() call to before calling bna_init() Signed-off-by: Debashis Dutt Signed-off-by: Rasesh Mody Signed-off-by: David S. Miller commit 0613ecfc94b13e86c9ff1252fd63e35a94475cd6 Author: Rasesh Mody Date: Thu Dec 23 21:45:02 2010 +0000 bna: Port enable disable sync and txq priority fix Change Details: - Fixed port enable/disable sync through a change in LL port state machine - Change txq->priority masking to 0x7 (3 bits) from 0x3 (2 bits) Signed-off-by: Debashis Dutt Signed-off-by: Rasesh Mody Signed-off-by: David S. Miller commit be7fa3263a15d3f278c3bfbf606ec169aaa3a920 Author: Rasesh Mody Date: Thu Dec 23 21:45:01 2010 +0000 bna: TxRx and datapath fix Change Details: - Check HW ready condition before accessing h/w register in data-path - Postpone clean-up of data buffers to the data-path restart path and wait in the cleanup routines for in-flight DMA to complete - Separate out Tx completion processing from Rx poll routine Signed-off-by: Debashis Dutt Signed-off-by: Rasesh Mody Signed-off-by: David S. Miller commit 24d8c0293b04ad207648bb2a0dbfebff8b47d166 Author: Guennadi Liakhovetski Date: Sat Dec 25 18:29:52 2010 -0300 [media] v4l: soc-camera: fix multiple simultaneous user case A recent patch has introduced a regression, whereby a second open of an soc-camera video device breaks the running capture. This patch fixes this bug by guaranteeing, that video buffers get initialised only during the first open of the device node. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Mauro Carvalho Chehab commit ce0ac9e1851364fa67c991659ce1db05ab82c6ae Author: Arnaldo Carvalho de Melo Date: Sat Dec 25 18:33:12 2010 -0200 perf script: Fix event ordering settings to work with older kernels If we don't use .ordering_requires_timestamps we'll end up trying to order events with no timestamps when running on older kernels. Problem introduced in eac23d1c. After the last three fixes, perf scripting is back working, tested with new perf userspace on old and new (with sample_id_all) kernels. Cc: Frederic Weisbecker Cc: Ian Munsie Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi Cc: Torok Edwin LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 3ae22e8c8ac39daf88ae32f047fb23825be7c646 Author: Mark Brown Date: Sat Dec 25 15:32:27 2010 +0100 spi / PM: Support dev_pm_ops Allow SPI drivers to use runtime PM and other dev_pm_ops features by implementing dev_pm_ops for the bus. The existing bus specific suspend and resume functions will be called if a driver does not provide dev_pm_ops allowing for transition to the new model. Signed-off-by: Mark Brown Acked-by: Grant Likely Signed-off-by: Rafael J. Wysocki commit a43d3f08c64125edbdfdc3d3aa512d3e37321f37 Author: Arnaldo Carvalho de Melo Date: Sat Dec 25 12:12:25 2010 -0200 perf record: Fix use of sample_id_all userspace with !sample_id_all kernels Check if parse_single_tracepoint_event has already asked for PERF_SAMPLE_TIME. This is kludgy but short term fix for problems introduced by eac23d1c that broke 'perf script' by having different sample_types when using multiple tracepoint events when we use a perf binary that tries to use sample_id_all on an older kernel. We need to move counter creation to perf_session, support different sample_types, etc. Ongoing work on the perf test infrastructure needs this so that we can create counters to monitor threads generating specific events, etc. Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi Cc: Torok Edwin Cc: Ian Munsie LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 765532c8aaac624b5f8687af6d319c6a1138a257 Author: Arnaldo Carvalho de Melo Date: Thu Dec 23 13:10:22 2010 -0200 perf script: Finish the rename from trace to script The scripts have calls to 'perf trace' that need to be converted to 'perf script', do it. This problem was introduced in 133dc4c. Reported-by: Torok Edwin Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi Cc: Torok Edwin LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 2316aa2aee254c126e688b53a3a105b82bc3f368 Author: Greg Rose Date: Thu Dec 2 07:12:26 2010 +0000 ixgbevf: Add X540 VF device support to the ixgbevf driver The X540 introduces a new Virtual Function device ID so that the X540 VF device can be distinguished from the 82599 VF device. The X540 VF device will have additional capability over the 82599 VF device so it is necessary to be able to discern the difference. Signed-off-by: Greg Rose Signed-off-by: Jeff Kirsher commit a985b6c31ff230a1246d921afbfc0f6a1386be83 Author: Greg Rose Date: Thu Nov 18 03:02:52 2010 +0000 ixgbe: Add anti-spoofing feature support Add support for the anti-spoofing feature in the HW. Packets from VF devices with spoofed MAC addresses or VLAN tags will be blocked and a counter incremented. During the watchdog timer the spoofed packet dropped counter is read and if it is non-zero then a warning message is displayed on the host VMM's console. Signed-off-by: Greg Rose Signed-off-by: Jeff Kirsher commit 3377eba79e15671799876f82d30446e656aac5ad Author: Greg Rose Date: Tue Dec 7 08:16:45 2010 +0000 ixgbe: Add SR-IOV feature support to X540 Add X540 specific feature support to X540 Signed-off-by: Greg Rose Signed-off-by: Jeff Kirsher commit d3306c2974481ff9c539de22a37bb667e8694be2 Author: Greg Rose Date: Thu Nov 18 03:03:23 2010 +0000 ixgbe: Warn on VF attempt to override Administratively set MAC/VLAN Print warnings to the system log when the VF attempts to override MAC/VLAN settings that were configured by the VMM Host administrator using the ip link set commands. Signed-off-by: Greg Rose Signed-off-by: Jeff Kirsher commit 031d7952ee63e1aa679f7e87700e3281f4de4ba2 Author: Williams, Mitch A Date: Thu Dec 9 03:23:56 2010 +0000 igbvf: add support for i350 VF device Add support to igbvf for the new i350 virtual function device. Signed-off-by: Mitch Williams Signed-off-by: Jeff Kirsher commit 0e512bfc2c0cd6072387092f8d1ac8e1a758965b Author: Alexander Duyck Date: Thu Nov 18 03:12:30 2010 +0000 igbvf: force link checking when mailbox timeout has occurred This change forces the link down when a mailbox timeout has occurred. Previously it was possible for a mailbox timeout to occur but for the interface to stay up. The problem with this was that it became possible for an interface to stay up and miss multiple requests resulting in a possible issue since the interface will be running in an unknown state. Signed-off-by: Alexander Duyck Signed-off-by: Jeff Kirsher commit 13800469d40bf4dc9fbed17f4692b2ebe94d4526 Author: Greg Rose Date: Sat Nov 6 02:08:26 2010 +0000 igb: Add Anti-spoofing feature support Add support for the anti-spoofing feature in the HW. Packets from VF devices with spoofed MAC addresses or VLAN tags will be blocked and an event generated. When the watchdog task runs it will call a function to check if any spoof events occurred. If an event was detected then a warning message is dumped to the system log. Signed-off-by: Greg Rose Signed-off-by: Jeff Kirsher commit 1b5dda331ff8646a70d247cace45a60035937a9b Author: Gasparakis, Joseph Date: Thu Dec 9 01:41:01 2010 +0000 igb: Some fine tuning This patch does the following: 1. Changes the existing supported device id's so now DH89xxCC is not supported when EEPROM is not read. 2. Adds two more device ids for DH89xxCC in backplane mode and SFP. 3. Driver now initializes previously possibly uninitialized value in igb_reset_mdicnfg_82580(). Signed-off-by: Joseph Gasparakis Signed-off-by: Jeff Kirsher commit a6b5ea353845b3f3d9ac4317c0b3be9cc37c259b Author: Greg Rose Date: Sat Nov 6 05:42:59 2010 +0000 igb: Warn on attempt to override administratively set MAC/VLAN Print a warning message to the system log when the VF attempts to override administratively set MAC/VLAN configuration. Signed-off-by: Greg Rose Signed-off-by: Jeff Kirsher commit 8fa7e0f739b70db14e788efba4960bfc1873d550 Author: Greg Rose Date: Sat Nov 6 05:43:21 2010 +0000 igb: Fix overwrite of the VF's flags The vf flags were being overwritten causing the flag that indicates that the PF has set the VF MAC address to get cleared. This would allow the VF to override the MAC address assigned by the Host VMM using the ip link set command. Signed-off-by: Greg Rose Signed-off-by: Jeff Kirsher commit b1cdfead0e532d7614b5d5b97044df94cc8945ae Author: Bruce Allan Date: Sat Dec 11 05:53:47 2010 +0000 e1000e: checkpatch warnings - braces WARNING: braces {} are not necessary for any arm of this statement WARNING: braces {} are not necessary for single statement blocks Signed-off-by: Bruce Allan Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit 6480641eb741cabbba8e196d4f17db7fb80d101c Author: Bruce Allan Date: Sat Dec 11 05:53:42 2010 +0000 e1000e: checkpatch error - open braces ERROR: that open brace { should be on the previous line Signed-off-by: Bruce Allan Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit 184125a389cf2c81980de5d5f365c786cc76d229 Author: Bruce Allan Date: Sat Dec 11 05:53:37 2010 +0000 e1000e: checkpatch error - trailing statements ERROR: trailing statements should be on next line Signed-off-by: Bruce Allan Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit f0f1a172b2a9e26319b9aa95fa6c322ebb01089d Author: Bruce Allan Date: Sat Dec 11 05:53:32 2010 +0000 e1000e: checkpatch error - macro panethesis ERROR: Macros with complex values should be enclosed in parenthesis Signed-off-by: Bruce Allan Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit 68f20d948c86bd6bbc075052f6b6c45b8f56957e Author: Jeff Kirsher Date: Fri Dec 17 12:14:34 2010 +0000 Documentation/networking: Update Intel Wired LAN docs - Update the Intel Wired LAN documentation with the latest URL for ethtool. - replace "Ethtool" with "ethtool" Signed-off-by: Jeff Kirsher Tested-by: Emil Tantilov commit cde44d1740bcb3dcfecbf792a71826431e61686e Author: Len Brown Date: Fri Dec 24 21:43:16 2010 -0500 Revert "ACPI battery: update status upon sysfs query" This reverts commit 3138b32d5e0998ba3cbd1c74bdc1887d74c5279b. as it caused a crash upon battery removal: https://bugzilla.kernel.org/show_bug.cgi?id=25302 Signed-off-by: Len Brown commit d3c7e1ab043abd7706db4fbccf327df9e62f7990 Merge: dfe80f63293ece364795c2e87805882c9ec3a266 4bdac7da5237170b1392f39ebee99d235043fad8 Author: Linus Torvalds Date: Fri Dec 24 13:00:37 2010 -0800 Merge branch 'merge' of git://git.secretlab.ca/git/linux-2.6 * 'merge' of git://git.secretlab.ca/git/linux-2.6: spi/mpc52xx-spi: fix annotation for remove()-pointer spi/fsl_espi: fix wrong setting of the address in the command buffer spi/fsl_espi: change the read behaviour of the SPIRF of/i2c: Fix request module by alias powerpc/mpc5200: include fs.h in mpc52xx_gpt.c commit dfe80f63293ece364795c2e87805882c9ec3a266 Merge: a4790c9457ae973d598bbd5ce58f9eaa2dd1576b e5005b15c91f3362036067bde5210d5c78af2f0d Author: Linus Torvalds Date: Fri Dec 24 13:00:16 2010 -0800 Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev * 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev: libata: issue DIPM enable commands with LPM state updated libata: no special completion processing for EH commands pata_mpc52xx: driver needs BMDMA pata_cs5536: Add support for non-X86_32 platforms libata-sff: fix HSM_ST_ERR handling in __ata_sff_port_intr() commit a4790c9457ae973d598bbd5ce58f9eaa2dd1576b Merge: 08da5a32b7789289f48f3037b64df2945b5dafc2 bcbea798f8f1492052c23ceb4fbc2a96013a3865 Author: Linus Torvalds Date: Fri Dec 24 12:59:09 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu: percpu: print out alloc information with KERN_DEBUG instead of KERN_INFO kthread_work: make lockdep happy commit 08da5a32b7789289f48f3037b64df2945b5dafc2 Merge: eda4b716ea1f2a647a39cebae66b3fae4c4b80e4 29687512c0b084957112cc2c0743ce34cd0d5055 Author: Linus Torvalds Date: Fri Dec 24 12:58:43 2010 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6: [SCSI] fix up documentation for change in ->queuecommand to lockless calling [SCSI] bfa: rename log_level to bfa_log_level commit e5005b15c91f3362036067bde5210d5c78af2f0d Author: Tejun Heo Date: Thu Dec 9 16:13:15 2010 +0100 libata: issue DIPM enable commands with LPM state updated Low level drivers may behave differently depending on the current link->lpm_policy. During ata_eh_set_lpm(), DIPM enable commands are issued after the successful completion of ap->ops->set_lpm(), which means that the controller is already in the target state. This causes DIPM enable commands to be processed with mismatching controller power state and link->lpm_policy value. In ahci, link->lpm_policy is used to ignore certain PHY events if LPM is enabled; however, as DIPM commands are issued with stale link->lpm_policy, they sometimes end up triggering these conditions and get aborted leading to LPM configuration failure. Fix it by updating link->lpm_policy before issuing DIPM enable commands. Signed-off-by: Tejun Heo Reported-by: Kyle McMartin Cc: stable@kernel.org Signed-off-by: Jeff Garzik commit f08dc1ac6b15c681f4643d8da1700e06c3855608 Author: Tejun Heo Date: Thu Dec 9 15:59:32 2010 +0100 libata: no special completion processing for EH commands ata_qc_complete() contains special handling for certain commands. For example, it schedules EH for device revalidation after certain configurations are changed. These shouldn't be applied to EH commands but they were. In most cases, it doesn't cause an actual problem because EH doesn't issue any command which would trigger special handling; however, ACPI can issue such commands via _GTF which can cause weird interactions. Restructure ata_qc_complete() such that EH commands are always passed on to __ata_qc_complete(). stable: Please apply to -stable only after 2.6.38 is released. Signed-off-by: Tejun Heo Reported-by: Kyle McMartin Cc: stable@kernel.org Signed-off-by: Jeff Garzik commit 869934adfc8391ec2e198ed81260e1a42cd9c575 Author: Wolfram Sang Date: Wed Dec 22 16:50:10 2010 +0100 pata_mpc52xx: driver needs BMDMA Found by this build-error if BMDMA is disabled: drivers/ata/pata_mpc52xx.c: In function 'mpc52xx_ata_init_one': drivers/ata/pata_mpc52xx.c:662: error: 'ata_bmdma_interrupt' undeclared (first use in this function) ... Move the Kconfig entry to the proper location as needed since 9a7780c9acb821fe1c2b6fc53f74cc2556ff5364 (libata-sff: make BMDMA optional) Signed-off-by: Wolfram Sang Signed-off-by: Jeff Garzik commit 9272dcc232b84ccb027d6861077934055d42764d Author: Wu Zhangjin Date: Fri Dec 24 21:39:08 2010 +0800 pata_cs5536: Add support for non-X86_32 platforms pata_cs5536 does work on the other platforms(e.g. Loongson, a MIPS variant), so, remove the dependency of X86_32 and fix the building errors under the other platforms via only reserving the X86_32 specific parts for X86_32. pata_amd also supports cs5536 IDE controller, but this one saves about 33k for the compressed kernel image(vmlinuz for MIPS). Signed-off-by: Zhang Le Signed-off-by: Chen Jie Signed-off-by: Wu Zhangjin Signed-off-by: Jeff Garzik commit 687a993339c4f3a63654746230da3aab8bbdbffd Author: Tejun Heo Date: Fri Dec 3 15:19:13 2010 +0100 libata-sff: fix HSM_ST_ERR handling in __ata_sff_port_intr() While separating out BMDMA irq handler from SFF, commit c3b28894 (libata-sff: separate out BMDMA irq handler) incorrectly made __ata_sff_port_intr() consider an IRQ to be an idle one if the host state was transitioned to HSM_ST_ERR by ata_bmdma_port_intr(). This makes BMDMA drivers ignore IRQs reporting host bus error which leads to timeouts instead of triggering EH immediately. Fix it by making __ata_sff_port_intr() consider the IRQ to be an idle one iff the state is HSM_ST_IDLE. This is equivalent to adding HSM_ST_ERR to the "break"ing case but less error-prone. Signed-off-by: Tejun Heo Reported-by: Antonio Toma Cc: stable@kernel.org Signed-off-by: Jeff Garzik commit 5aa68b85951aec91d6a955d1de861325fc9a3ba1 Author: Wolfram Sang Date: Fri Dec 17 15:44:00 2010 +0100 spi/mpc52xx-psc-spi: move probe/remove to proper sections Probe/remove should be in __devinit/__devexit. Found by a section-mismatch warning. Also, copy do_remove() over to remove(). Signed-off-by: Wolfram Sang Signed-off-by: Grant Likely commit dc69d1af9e8d9cbbabff88bb35a6782187a22229 Author: Ben Gamari Date: Fri Dec 24 02:48:09 2010 +0000 omap2: Make OMAP2PLUS select OMAP_DM_TIMER It appears that arch/arm/mach-omap2/timer-gp.o is needed by OMAP2PLUS. Since timer-gp.o has direct dependencies on omap_dm_timer_*, it seems correct for the architecture to depend upon OMAP_DM_TIMER, otherwise unsuspecting integrators will be faced with a whole bunch of linker errors at the end of their kernel build: arch/arm/mach-omap2/built-in.o: In function `omap2_gp_timer_set_mode': /home/bgamari/trees/linux-2.6/arch/arm/mach-omap2/timer-gp.c:84: undefined reference to `omap_dm_timer_stop' /home/bgamari/trees/linux-2.6/arch/arm/mach-omap2/timer-gp.c:88: undefined reference to `omap_dm_timer_get_fclk' /home/bgamari/trees/linux-2.6/arch/arm/mach-omap2/timer-gp.c:90: undefined reference to `omap_dm_timer_set_load_start' ... Signed-off-by: Ben Gamari Signed-off-by: Tony Lindgren commit fe13471c4b546e07ddbaf5fb2209b50c14b99b20 Author: Benoit Cousson Date: Thu Dec 23 22:30:32 2010 +0000 OMAP4: hwmod data: Fix alignment and end of line in structurefields In order to be fully aligned with the Python generator output, change a couple of fields. - Add tab in class structures to align attributes - Add a comma at the end of the following line to simplify the generation by having always the same eol: ".pre_shutdown = &omap2_wd_timer_disable," - Add a blank line before the first entry of the omap44xx_hwmods array. Signed-off-by: Benoit Cousson Cc: Paul Walmsley Tested-by: G, Manjunath Kondaiah Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit d7cf5f33fc68573d7bb9d4fc244ea1a3ed0b011b Author: Benoit Cousson Date: Thu Dec 23 22:30:31 2010 +0000 OMAP4: hwmod data: Move the DMA structures The merge of the DMA series on top of the already modified omap_hwmod_data_44xx.c put the dma_system structures at the wrong position in the file. Re-order it properly. Signed-off-by: Benoit Cousson Cc: Paul Walmsley Tested-by: G, Manjunath Kondaiah Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 1f6a717f1c000bb6184fe09c5ae99bad5965cadf Author: Benoit Cousson Date: Thu Dec 23 22:30:30 2010 +0000 OMAP4: hwmod data: Move the smartreflex structures The merge of the SR series on top of the already modified omap_hwmod_data_44xx.c moved the smartreflex structures at the wrong position in the file. - Re-order the structures properly. Signed-off-by: Benoit Cousson Cc: Thara Gopinath Tested-by: G, Manjunath Kondaiah Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 4d218826ad9ba5ab0b2d7e0a2b14f2a1e48a5e0b Author: Benoit Cousson Date: Thu Dec 23 22:30:29 2010 +0000 OMAP4: hwmod data: Fix missing SIDLE_SMART_WKUP in smartreflexsysc Add the missing SIDLE_SMART_WKUP flag in idlemodes field of the smartreflex sysconfig structure. Signed-off-by: Benoit Cousson Cc: Paul Walmsley Cc: Thara Gopinath Tested-by: G, Manjunath Kondaiah Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 569ff2de2e1c8ac67c8df3a7367d46d0d9460a35 Author: Tejun Heo Date: Fri Dec 24 16:14:20 2010 +0100 usb: don't use flush_scheduled_work() flush_scheduled_work() is being deprecated. Directly flush or cancel work items instead. * u_ether, isp1301_omap, speedtch conversions are straight-forward. * ochi-hcd should only flush when quirk_nec() is true as otherwise the work wouldn't have been initialized. * In oti6858, cancel_delayed_work() + flush_scheduled_work() -> cancel_delayed_work_sync(). Signed-off-by: Tejun Heo Acked-by: Greg Kroah-Hartman Cc: David Brownell Cc: Duncan Sands Cc: linux-usb@vger.kernel.org commit 37c95bfe944babae817bfcf02c996729c9a3335d Author: Tejun Heo Date: Fri Dec 24 16:14:20 2010 +0100 speedtch: don't abuse struct delayed_work speedtch directly uses the internal timer and work members of a struct delayed_work. Use a separate work item and timer instead. * Nicolas Kaiser discovered that timer init was missing. Fixed. Signed-off-by: Tejun Heo Acked-by: Greg Kroah-Hartman Tested-by: Nicolas Kaiser Cc: Duncan Sands Cc: linux-usb@vger.kernel.org commit 8c71778cbf2c8beaefaa2dee5478aa0622d96682 Author: Tejun Heo Date: Fri Dec 24 16:14:20 2010 +0100 media/video: don't use flush_scheduled_work() This patch converts the remaining users of flush_scheduled_work() in media/video. * bttv-input.c and cx23885-input.c don't use workqueue at all. No need to flush. * Make omap24xxcam.c and saa7134-empress.c flush the used work directly. * In fd_defio.c, replace cancel_delayed_work() + flush_scheduled_work() with cancel_delayed_work_sync(). While at it, replace the deprecated cancel_rearming_delayed_work() with cancel_delayed_work_sync(). Signed-off-by: Tejun Heo Cc: Mauro Carvalho Chehab commit 707bcf326bd50c875d82bd2e7c31dcfb92b7e813 Author: Tejun Heo Date: Fri Dec 24 16:14:20 2010 +0100 media/video: explicitly flush request_module work Video drivers request submodules using a work during probe and calls flush_scheduled_work() on exit to make sure the work is complete before being unloaded. This patch makes these drivers flush the work directly instead of using flush_scheduled_work(). While at it, relocate request_submodules() call in saa7134_initdev() right right before successful return as in other drivers to avoid failing after the work is scheduled and returning failure without the work still active. This is in preparation for the deprecation of flush_scheduled_work(). Signed-off-by: Tejun Heo Cc: Mauro Carvalho Chehab commit 883624a08cb4144343e7362d9fff0e2c69613ebf Author: Tejun Heo Date: Fri Dec 24 16:14:20 2010 +0100 ioc4: use static work_struct for ioc4_load_modules() There is no reason to dynamically allocate work_struct for ioc4_load_modules(). It makes the code more complex and makes it impossible to flush the work directly. Use static work ioc4_load_modules_work instead and flush it directly on exit. This removes the use of flush_scheduled_work() which is being deprecated. Signed-off-by: Tejun Heo Cc: Brent Casavant commit ee4569a3a75e1a5ed53b0c4ff4d9fc456aa98ef1 Author: Tejun Heo Date: Fri Dec 24 16:14:20 2010 +0100 init: don't call flush_scheduled_work() from do_initcalls() The call to flush_scheduled_work() in do_initcalls() is there to make sure all works queued to system_wq by initcalls finish before the init sections are dropped. However, the call doesn't make much sense at this point - there already are multiple different workqueues and different subsystems are free to create and use their own. Ordering requirements are and should be expressed explicitly. Drop the call to prepare for the deprecation and removal of flush_scheduled_work(). Andrew suggested adding sanity check where the workqueue code checks whether any pending or running work has the work function in the init text section. However, checking this for running works requires the worker to keep track of the current function being executed, and checking only the pending works will miss most cases. As a violation will almost always be caught by the usual page fault mechanism, I don't think it would be worthwhile to make the workqueue code track extra state just for this. Signed-off-by: Tejun Heo Cc: Andrew Morton commit 6dca467a76bb0ed71d65143b235e0ef80e44436f Author: Tejun Heo Date: Fri Dec 24 16:00:18 2010 +0100 s390: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. * tape_3590: Create and use tape_3590_wq instead of the system_wq. * tape_block: Directly flush requeue_task on cleanup instead of using flush_scheduled_work(). Signed-off-by: Tejun Heo Cc: Martin Schwidefsky Cc: Heiko Carstens Cc: linux390@de.ibm.com Cc: linux-s390@vger.kernel.org commit 9db8995be5e1869b5effa117909bc285e06fc09b Author: Tejun Heo Date: Fri Dec 24 16:00:17 2010 +0100 rtc: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. On removal, directly cancel the work, and flush the uie_task in rtc-dev.c::clear_uie(). Signed-off-by: Tejun Heo Cc: Alessandro Zummo Cc: rtc-linux@googlegroups.com commit 0d9ee5b2e9aac981fa063339daf04320eac610d1 Author: Tejun Heo Date: Fri Dec 24 16:00:17 2010 +0100 mmc: update workqueue usages Workqueue creation API has been updated and flush_scheduled_work() is deprecated and scheduled to be removed. * core/core.c: Use alloc_ordered_workqueue() instead of create_singlethread_workqueue(). This removes an unnecessary rescuer. * host/omap.c: Create, use and flush mmc_omap_wq instead of the system_wq. * Flush host->mmc_carddetect_work directly on removal instead of using flush_scheduled_work(). Signed-off-by: Tejun Heo Cc: Chris Ball Cc: linux-mmc@vger.kernel.org commit afdb32f2e463a195c104555ac9a8cdd39a2b6561 Author: Tejun Heo Date: Fri Dec 24 16:00:17 2010 +0100 mfd: update workqueue usages flush_scheduled_work() is deprecated and scheduled to be removed. * In menelaus, flush menelaus->work directly on probe failure. Also, make sure the work isn't running on removal. * In tps65010, cancel_delayed_work() + flush_scheduled_work() -> cancel_delayed_work_sync(). While at it, remove unnecessary (void) casts on return value, and use schedule_delayed_work() and to_delayed_work() instead of using delayed_work's internal work field. Signed-off-by: Tejun Heo Cc: Samuel Ortiz commit 0d9c76aedbac3ad8ac4e99a2b441bc3f91dd6679 Author: Tejun Heo Date: Fri Dec 24 16:00:17 2010 +0100 dvb: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. * Flush the used works directly. * Replace the deprecated cancel_rearming_delayed_work() + flush_scheduled_work() -> cancel_delayed_work_sync(). * Make sure mantis->uart_work isn't running on exit. Signed-off-by: Tejun Heo Cc: Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org commit 99ef21216b4f85c56392ed41500d2f07f58cc360 Author: Tejun Heo Date: Fri Dec 24 15:59:07 2010 +0100 leds-wm8350: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush led->work on removal instead. Signed-off-by: Tejun Heo Cc: Richard Purdie commit 0d26aa704e5bbca5a1ee9fdf0d02277ceb507eee Author: Tejun Heo Date: Fri Dec 24 15:59:07 2010 +0100 mISDN: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush ch->workq when freeing channel and cancel it on release. Signed-off-by: Tejun Heo Cc: Karsten Keil Cc: netdev@vger.kernel.org commit d9c612eb6e9ccb8192e6c4d609dbbf178020c672 Author: Tejun Heo Date: Fri Dec 24 15:59:07 2010 +0100 macintosh/ams: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush ams_info.worker on detach instead. Signed-off-by: Tejun Heo commit a6665944ef83b6a2db8fc5b323c9fca92375a643 Author: Tejun Heo Date: Fri Dec 24 15:59:07 2010 +0100 vmwgfx: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush info->deferred_work on removal instead. Signed-off-by: Tejun Heo Cc: Thomas Hellstrom commit 2e5c44c92046c41607794666ffc0d6945945acb0 Author: Tejun Heo Date: Fri Dec 24 15:59:07 2010 +0100 tpm: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush chip->work instead. Signed-off-by: Tejun Heo Cc: Debora Velarde Cc: Rajiv Andrade commit 3514870f06a7907bc46361aebc3daf5ea4e97eeb Author: Tejun Heo Date: Fri Dec 24 15:59:07 2010 +0100 sonypi: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush sonypi_device.input_work on removal instead. Signed-off-by: Tejun Heo Cc: Mattia Dongili commit 42565999d1e0b8a0c5b4a0d475c26cf3d567e85e Author: Tejun Heo Date: Fri Dec 24 15:59:07 2010 +0100 hvsi: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly cancel hp->writer and flush hp->handshaker instead. Signed-off-by: Tejun Heo Cc: Benjamin Herrenschmidt Cc: Paul Mackerras commit 30d65030fd14fd3696d927c5e452bee84c589b09 Author: Tejun Heo Date: Fri Dec 24 15:59:06 2010 +0100 xen: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush info->work instead. Signed-off-by: Tejun Heo Cc: Jeremy Fitzhardinge Cc: Konrad Rzeszutek Wilk commit 0ead5c86ac4c9903da93c76716135bc29d9cd83b Author: Tejun Heo Date: Fri Dec 24 15:59:06 2010 +0100 gdrom: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush work on removal instead. Signed-off-by: Tejun Heo Cc: Jens Axboe commit 8aa0f413848708bca329c52358ae7a1a0e395b4e Author: Tejun Heo Date: Fri Dec 24 15:59:06 2010 +0100 floppy: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush floppy_work instead. Signed-off-by: Tejun Heo Cc: Jens Axboe commit 539253f6e13feedfa7bb6a3112c6707ebdf11e74 Author: Tejun Heo Date: Fri Dec 24 15:59:06 2010 +0100 sh: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush psw->work on removal instead. Signed-off-by: Tejun Heo Cc: Paul Mundt Cc: linux-sh@vger.kernel.org commit fe413ec322e26179c788c678f24434b94cca34f0 Author: Tejun Heo Date: Fri Dec 24 15:59:06 2010 +0100 arm/sharpsl: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush toggle_charger and sharpsl_bat works on suspend instead. Signed-off-by: Tejun Heo Cc: Russell King commit 5d8e4bddc635dd61ab8b3bcb75c59934e9c1e19f Author: Tejun Heo Date: Fri Dec 24 15:59:06 2010 +0100 ncpfs: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush the used works on stop instead. Signed-off-by: Tejun Heo Cc: Petr Vandrovec commit f094cfc6c382cec7b2c77dd7798576684153acbb Author: Tejun Heo Date: Fri Dec 24 15:59:06 2010 +0100 drm/ttm: use cancel_delayed_work_sync() in ttm_bo Make ttm_bo::ttm_bo_device_release call cancel_delayed_work_sync() instead of calling cancel_delayed_work() followed by flush_scheduled_work(). This is to prepare for the deprecation and removal of flush_scheduled_work(). Signed-off-by: Tejun Heo Cc:: Thomas Hellstrom Cc:: Dave Airlie commit 404437efc713b6c6fc8e2dc02978624bf4586e2d Author: Tejun Heo Date: Fri Dec 24 15:59:06 2010 +0100 pcmcia/ipwireless: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush the used works instead. Signed-off-by: Tejun Heo Acked-by: Jiri Kosina Acked-by: David Sterba commit 9b00a8182987e8b7028d97c2bee3319ef383b57a Author: Tejun Heo Date: Fri Dec 24 15:59:06 2010 +0100 ocfs2: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. * cancel_delayed_work() + flush_schedule_work() -> cancel_delayed_work_sync(). * flush qs->qs_work directly on exit instead. Signed-off-by: Tejun Heo Acked-by: Joel Becker Cc: Mark Fasheh commit 7f6b0db9f63ba423d989e29f6318fe7e68760421 Author: Tejun Heo Date: Fri Dec 24 15:59:06 2010 +0100 net/dsa: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush dst->link_poll_work on remove instead. Signed-off-by: Tejun Heo Acked-by: Lennert Buytenhek commit 158fa67753e1eb3edfa5a2d1868666d89d1cf09f Author: Tejun Heo Date: Fri Dec 24 15:59:06 2010 +0100 isdn/capi: make kcapi use a separate workqueue flush_scheduled_work() is deprecated and will be removed. Because kcapi uses fire-and-forget type works, it's impossible to flush each work explicitly. Create and use a dedicated workqueue instead. Please note that with recent workqueue changes, each workqueue doesn't reserve a lot of resources and using it as a flush domain is fine. Signed-off-by: Tejun Heo Acked-by: Jan Kiszka commit 7fa5e85a0ab9ed5d2d8b77eec7976c88a5911bda Author: Tejun Heo Date: Fri Dec 24 15:59:05 2010 +0100 isdn/capi: unregister capictr notifier after init failure capidrv_init() could leave capictr notifier dangling after init failure. Fix it. Signed-off-by: Tejun Heo Acked-by: Jan Kiszka commit 62bcb91573425975d6ad2389d7ab1d8feca88ab4 Author: Mark Brown Date: Fri Dec 24 15:04:41 2010 +0100 PM: Prototype the pm_generic_ operations The pm_generic_ operations are all exported but are not prototyped in any header file for direct use. Do so. [rjw: Added extern.] Signed-off-by: Mark Brown Signed-off-by: Rafael J. Wysocki commit 4b31db8a16fa0d4d6a0fa42d044e7a4f4dad3641 Author: Rafael J. Wysocki Date: Fri Dec 24 15:04:06 2010 +0100 PM / Runtime: Generic resume shouldn't set RPM_ACTIVE unconditionally The __pm_generic_resume() function changes the given device's runtime PM status to RPM_ACTIVE if its driver's callback returns 0, but it only should do that if the rumtime PM is enabled for the device. Signed-off-by: Rafael J. Wysocki commit 5c1a07ab3e78ef68fc9ccf419c969e8ed88d7cb6 Author: Rafael J. Wysocki Date: Fri Dec 24 15:03:34 2010 +0100 PM: Use dev_name() in core device suspend and resume routines Use dev_name() wherever applicable in drivers/base/power/main.c. Signed-off-by: Rafael J. Wysocki commit b64959e6158d6dcb640fc22d7f43b94ad1c91135 Author: Rafael J. Wysocki Date: Thu Dec 16 17:11:45 2010 +0100 PM: Permit registration of parentless devices during system suspend The registration of a new parentless device during system suspend will not lead to any complications affecting the PM core (the device will be effectively seen after the subsequent resume has completed), so remove the code used for detection of such events. Signed-off-by: Rafael J. Wysocki commit b8c76f6aed0ab7df73a6410f3f82de2c831bb144 Author: Rafael J. Wysocki Date: Thu Dec 16 00:51:21 2010 +0100 PM: Replace the device power.status field with a bit field The device power.status field is too complicated for its purpose (storing the information about whether or not the device is in the "active" state from the PM core's point of view), so replace it with a bit field and modify all of its users accordingly. Signed-off-by: Rafael J. Wysocki commit 5b219a51fdceaf76e0e18da57c7efb9e5586e567 Author: Rafael J. Wysocki Date: Thu Dec 16 00:51:08 2010 +0100 PM: Remove redundant checks from core device resume routines Since a separate list of devices is used to link devices that have completed each stage of suspend (or resume), it is not necessary to check dev->power.status in the core device resume routines any more. Signed-off-by: Rafael J. Wysocki commit 8a43a9ab7b329aa8590f8a064df9bf8c80987507 Author: Rafael J. Wysocki Date: Thu Dec 16 00:50:30 2010 +0100 PM: Use a different list of devices for each stage of device suspend Instead of keeping all devices in the same list during system suspend and resume, regardless of what suspend-resume callbacks have been executed for them already, use separate lists of devices that have had their ->prepare(), ->suspend() and ->suspend_noirq() callbacks executed. This will allow us to simplify the core device suspend and resume routines. Signed-off-by: Rafael J. Wysocki commit 2cbb3ce1ad19e66858a4284dd6c4bb958162c483 Author: Rafael J. Wysocki Date: Wed Dec 15 00:17:29 2010 +0100 PM: Avoid compiler warning in pm_noirq_op() The compiler complains that calltime may be uninitialized in pm_noirq_op(), so add extra initialization for that variable to avoid the warning. Signed-off-by: Rafael J. Wysocki commit d83f905e126f8cbc5e4addc5d1a64aea785b732e Author: Rafael J. Wysocki Date: Fri Dec 3 23:14:26 2010 +0100 PM: Use pm_wakeup_pending() in __device_suspend() Before starting to suspend a device in __device_suspend() check if there's a request to abort the power transition and return -EBUSY in that case. Signed-off-by: Rafael J. Wysocki commit a2867e08c8e3bdbc00caf56bc3bdde19ccc058e3 Author: Rafael J. Wysocki Date: Fri Dec 3 22:58:31 2010 +0100 PM / Wakeup: Replace pm_check_wakeup_events() with pm_wakeup_pending() To avoid confusion with the meaning and return value of pm_check_wakeup_events() replace it with pm_wakeup_pending() that will work the other way around (ie. return true when system-wide power transition should be aborted). Signed-off-by: Rafael J. Wysocki commit 1e75227ef0571031cd18536ab768ee35667ec5b9 Author: Rafael J. Wysocki Date: Fri Dec 3 22:58:05 2010 +0100 PM: Prevent dpm_prepare() from returning errors unnecessarily Currently dpm_prepare() returns error code if it finds that a device being suspended has a pending runtime resume request. However, it should not do that if the checking for wakeup events is not enabled. On the other hand, if the checking for wakeup events is enabled, it can return error when a wakeup event is detected, regardless of its source. Signed-off-by: Rafael J. Wysocki commit 7ac4dcabdb482d4e74c9d36782d00bc6c4c01619 Author: Jon Mason Date: Wed Dec 1 00:14:55 2010 +0100 PM: Fix references to basic-pm-debugging.txt in drivers-testing.txt basic-pm-debugging.txt is located in Documentation/power/ not Documents/power/. Change the references in Documentation/power/drivers-testing.txt to reflect the location. Signed-off-by: Jon Mason Signed-off-by: Rafael J. Wysocki commit c7b61de5b7b17f0df34dc7d2f8b9576f8bd36fce Author: Alan Stern Date: Wed Dec 1 00:14:42 2010 +0100 PM / Runtime: Add synchronous runtime interface for interrupt handlers (v3) This patch (as1431c) makes the synchronous runtime-PM interface suitable for use in interrupt handlers. Subsystems can call the new pm_runtime_irq_safe() function to tell the PM core that a device's runtime_suspend and runtime_resume callbacks should be invoked with interrupts disabled and the spinlock held. This permits the pm_runtime_get_sync() and the new pm_runtime_put_sync_suspend() routines to be called from within interrupt handlers. When a device is declared irq-safe in this way, the PM core increments the parent's usage count, so the parent will never be runtime suspended. This prevents difficult situations in which an irq-safe device can't resume because it is forced to wait for its non-irq-safe parent. Signed-off-by: Alan Stern Signed-off-by: Rafael J. Wysocki commit 5262a47502adcfc3a64403120768f528418a3b79 Author: MyungJoo Ham Date: Fri Nov 26 23:07:56 2010 +0100 PM / Hibernate: When failed, in_suspend should be reset When hibernation failed due to an error in swsusp_write() called by hibernate(), it skips calling "power_down()" and returns. When hibernate() is called again (probably after fixing up so that swsusp_write() wouldn't fail again), before "in_suspend = 1" of create_image is called, in_suspend should be 0. However, because hibernate() did not reset "in_suspend" after a failure, it's already 1. This patch fixes such inconsistency of "in_suspend" value. Signed-off-by: MyungJoo Ham Signed-off-by: Kyungmin Park Signed-off-by: Rafael J. Wysocki commit 5729c63a51f0f8a351e0f1dc7b3250ebac12c309 Author: MyungJoo Ham Date: Fri Nov 26 23:07:48 2010 +0100 PM / Hibernate: hibernation_ops->leave should be checked too Because hibernate calls hibernation_ops->leave() without checking whether hibernation_ops->leave is NULL or not, hiberantion_set_ops should WARN_ON if hibernation_ops->leave is NULL. This patch added one more condition to check hibernation_ops->leave. Signed-off-by: MyungJoo Ham Signed-off-by: Kyungmin Park Acked-by: Pavel Machek Signed-off-by: Rafael J. Wysocki commit 8cfe400ca54fd1ed96f962bea5f7e20b09b6d69f Author: Tejun Heo Date: Fri Nov 26 23:07:27 2010 +0100 Freezer: Fix a race during freezing of TASK_STOPPED tasks After calling freeze_task(), try_to_freeze_tasks() see whether the task is stopped or traced and if so, considers it to be frozen; however, nothing guarantees that either the task being frozen sees TIF_FREEZE or the freezer sees TASK_STOPPED -> TASK_RUNNING transition. The task being frozen may wake up and not see TIF_FREEZE while the freezer fails to notice the transition and believes the task is still stopped. This patch fixes the race by making freeze_task() always go through fake_signal_wake_up() for applicable tasks. The function goes through the target task's scheduler lock and thus guarantees that either the target sees TIF_FREEZE or try_to_freeze_task() sees TASK_RUNNING. Signed-off-by: Tejun Heo Signed-off-by: Rafael J. Wysocki commit 133f1128b2bf178a1976b17c54bd14ce6feb90bf Author: Tracey Dent Date: Thu Nov 25 23:41:29 2010 +0100 PM: Use proper ccflag flag in kernel/power/Makefile Use the ccflags-$ flag instead of EXTRA_CFLAGS because EXTRA_CFLAGS is deprecated and should now be switched. According to (documentation/kbuild/makefiles.txt). Signed-off-by: Tracey Dent Signed-off-by: Rafael J. Wysocki commit 6675bc056790b403d198a173498d377187754142 Author: Aaro Koskinen Date: Thu Nov 25 23:41:19 2010 +0100 PM / Runtime: Fix comments to match runtime callback code Commit 05aa55dddb9ee4045c320661068bea78dad6a6e5 changed routines to succeed if the driver handler is not defined. Comments were not updated. Signed-off-by: Aaro Koskinen Signed-off-by: Rafael J. Wysocki commit 30f2ba38011247ad95bffbf0743a0dc0656a5eb7 Author: Paul Mundt Date: Fri Dec 24 19:38:37 2010 +0900 sh: intc: Initialize radix tree gfp mask explicitly. Presently the root node is initialized by way of kzalloc on the parent data structure, which by chance happens to do the bulk of what an explicit initialization does with GFP_NOWAIT semantics. This however is more by luck than by design, and as we ideally want to permit radix node allocations access to the emergency pools anyways, add in the proper initializer with the desired mask. Signed-off-by: Paul Mundt commit 1dee92bba36b491dbcc15e2cba40501403237f96 Author: Paul Mundt Date: Fri Dec 24 19:19:23 2010 +0900 sh: Tidy up SH-4A unaligned load support. The current implementation was rather tied to the packed_struct.h definitions, which immediately began to clash when the packed_struct.h types changed and drivers began to include packed_struct.h directly. In order to support this sort of use it's necessary to get out of the way with regards to namespace collisions, and at the same time we can also kill off some duplicate code now that the unaligned headers are a bit more broken out. Signed-off-by: Paul Mundt commit 3d29005ab8d828e36108ecc2338612ce3acdd86f Author: Shiraz Hashim Date: Thu Dec 23 11:32:41 2010 +0100 ARM: 6541/1: move sev definition to common system.h include file sev is used to send wakeup event to other cores in ARMv6K and above. This has been moved from platform specific part to standard common ARM header file (asm/system.h). Also introduced wfi() and wfe(). Signed-off-by: Shiraz Hashim Signed-off-by: Russell King commit 78368c79944b12f91bcacb0b0b030c36016264e8 Author: Srinidhi Kasagar Date: Wed Dec 22 13:18:58 2010 +0100 ARM: 6539/1: ux500: remove unnecessary barrier from the secondary startup Signed-off-by: srinidhi kasagar Acked-by: Linus Walleij Signed-off-by: Russell King commit 67cfa23ac9df810d1fbf3a06b7f408243350ecfe Author: Russell King Date: Tue Dec 21 10:42:20 2010 +0000 Revert "ARM: relax ioremap prohibition (309caa9) for -final and -stable" This reverts commit 06c1088, as promised in the warning message. commit dec12e62c03d26bbc7a142f067215a3a43cce7d0 Author: Russell King Date: Thu Dec 16 13:49:34 2010 +0000 ARM: provide an early platform initialization hook This allows platforms to hook into the initialization early to setup things like scheduler clocks, etc. Signed-off-by: Russell King commit 8ff1443c5439ecee7472b80cf12ecfc337e6ee98 Author: Russell King Date: Mon Dec 20 10:18:36 2010 +0000 ARM: simplify early machine init hooks Rather than storing each machine init hook separately, store a pointer to the machine description record and dereference this instead. This pointer is only available while the init sections are present, which is not a problem as we only use it from init code. Signed-off-by: Russell King commit cd544ce754ac2432ffcc0626ea802d2b30876b50 Author: Magnus Damm Date: Wed Dec 22 13:20:08 2010 +0100 ARM: 6538/1: Subarch IRQ handler macros V3 Per subarch interrupt handler macros V3. This patch breaks out code from the irq_handler macro into arch_irq_handler and arch_irq_handler_default. The macros are put in the header file "entry-macro-multi.S" The arch_irq_handler_default macro is designed to be used by irq_handler in entry-armv.S while arch_irq_handler is suitable for per-subarch use. Signed-off-by: Magnus Damm Signed-off-by: Russell King commit 521086412ee423fbdfc7da81f257239c43f707b4 Author: eric miao Date: Mon Dec 13 09:42:34 2010 +0100 ARM: 6532/1: Allow machine to specify it's own IRQ handlers at run-time Normally different ARM platform has different way to decode the IRQ hardware status and demultiplex to the corresponding IRQ handler. This is highly optimized by macro irq_handler in entry-armv.S, and each machine defines their own macro to decode the IRQ number. However, this prevents multiple machine classes to be built into a single kernel. By allowing each machine to specify thier own handler, and making function pointer 'handle_arch_irq' to point to it at run time, this can be solved. And introduce CONFIG_MULTI_IRQ_HANDLER to allow both solutions to work. Comparing with the highly optimized macro of irq_handler, the new function must be written with care not to lose too much performance. And the IPI stuff on SMP is expected to move to the provided arch IRQ handler as well. The assembly code to invoke handle_arch_irq is optimized by Russell King. Signed-off-by: Eric Miao Acked-by: Nicolas Pitre Signed-off-by: Russell King commit d13e5edd7284bedcf5952e1b6490e39ad843cb91 Author: Todd Android Poynor Date: Thu Dec 23 01:52:44 2010 +0100 ARM: 6540/1: Stop irqsoff trace on return to user If the irqsoff tracer is in use, stop tracing the interrupt disable interval when returning to userspace. Tracing userspace execution time as interrupts disabled time is not helpful for kernel performance analysis purposes. Only do so if the irqsoff tracer is enabled, to avoid overhead for lockdep, which doesn't care. Signed-off-by: Todd Poynor Signed-off-by: Russell King commit 875728807ff001b67a1e0535de5ad2cd3c41d47c Author: Linus Walleij Date: Wed Dec 22 09:18:29 2010 +0100 ARM: 6537/1: update Nomadik, U300 and Ux500 maintainers Adding in self as maintainer for Nomadik and Ux500, I'm running an active -next tree for that stuff now. Extend file matchers to cover a few more relevant drivers and add git references. Cc: Alessandro Rubini Acked-by: Srinidhi Kasagar Signed-off-by: Linus Walleij Signed-off-by: Russell King commit 537de3a67c0c86586eacffde40673b727242dc3a Author: Stephen Warren Date: Wed Dec 22 04:52:05 2010 +0100 ARM: 6536/1: Add missing SZ_{32,64,128} ... and also remove misleading comment stating that this header is auto-generated. Signed-off-by: Stephen Warren Acked-by: Uwe Kleine-Knig Signed-off-by: Russell King commit 206323c181371f3d5fab36c6d33e1fac09b61082 Merge: 25cf0398bdf365d027e171116aa4a281e9cd3c1c 28bd2c341120db346f30b3ba11b4eac06b2cc981 Author: Russell King Date: Fri Dec 24 09:36:37 2010 +0000 Merge branch 'davinci-next' of git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-davinci into devel-stable commit 55271024a735d0c3234e6ca7e0914b05aab7fbac Author: Wolfram Sang Date: Wed Nov 17 13:00:50 2010 +0100 powerpc/pcm{030,032}: add pagesize to dts Signed-off-by: Wolfram Sang Signed-off-by: Grant Likely commit 45efe847971e6274a04eea75a0745d8015b54d37 Author: Wolfram Sang Date: Wed Nov 17 13:00:49 2010 +0100 misc/at24: add more sanity checks for parameters Side-effects happen when passing 0 to either io_limit or page_size. Give an error in case of this misconfiguration. Signed-off-by: Wolfram Sang Signed-off-by: Grant Likely commit 9ed030d728f3bd03b6e869357da02725afda19a7 Author: Wolfram Sang Date: Wed Nov 17 13:00:48 2010 +0100 misc/at24: parse device tree data Information about the pagesize and read-only-status may also come from the devicetree. Parse this data, too, and act accordingly. While we are here, change the initialization printout a bit. write_max is useful to know to detect performance bottlenecks, the rest is superfluous. Signed-off-by: Wolfram Sang Signed-off-by: Grant Likely commit 4bdac7da5237170b1392f39ebee99d235043fad8 Author: Wolfram Sang Date: Fri Dec 17 15:33:58 2010 +0100 spi/mpc52xx-spi: fix annotation for remove()-pointer Signed-off-by: Wolfram Sang Signed-off-by: Grant Likely commit 0dd2c96f19b0cffaeb437e50fa5da195920c6e78 Author: Mingkai Hu Date: Tue Dec 21 09:27:02 2010 +0800 spi/fsl_espi: fix wrong setting of the address in the command buffer Or else we can't operate on the right address when the trans length is greater than 65535. Signed-off-by: Mingkai Hu Signed-off-by: Grant Likely commit e6289d63a6f39237a027dcee46366ba158cb8406 Author: Mingkai Hu Date: Tue Dec 21 09:26:07 2010 +0800 spi/fsl_espi: change the read behaviour of the SPIRF The user must read N bytes of SPIRF (1 <= N <= 4) that do not exceed the amount of data in the receive FIFO, so read the SPIRF byte by byte when the data in receive FIFO is less than 4 bytes. On Simics, when read N bytes that exceed the amount of data in receive FIFO, we can't read the data out, that is we can't clear the rx FIFO, then the CPU will loop on the espi rx interrupt. Signed-off-by: Mingkai Hu Signed-off-by: Grant Likely commit 020862648445d7c1b12ea213c152f27def703f3b Author: David Daney Date: Tue Nov 16 14:42:14 2010 -0800 of/i2c: Fix request module by alias If we are registering an i2c device that has a device tree node like this real-world example: rtc@68 { compatible = "dallas,ds1337"; reg = <0x68>; }; of_i2c_register_devices() will try to load a module called ds1337.ko. There is no such module, so it will fail. If we look in modules.alias we will find entries like these: . . . alias i2c:ds1339 rtc_ds1307 alias i2c:ds1338 rtc_ds1307 alias i2c:ds1337 rtc_ds1307 alias i2c:ds1307 rtc_ds1307 alias i2c:ds1374 rtc_ds1374 . . . The module we want is really called rtc_ds1307.ko. If we request a module called "i2c:ds1337", the userspace module loader will do the right thing (unless it is busybox) and load rtc_ds1307.ko. So we add the I2C_MODULE_PREFIX to the request_module() string. Signed-off-by: David Daney Signed-off-by: Grant Likely commit 194588604765ac803f98fb9d19a36f6b835f4620 Author: David Daney Date: Wed Oct 27 18:03:47 2010 -0700 of/mdio: Fix some endianness problems. In of_mdiobus_register(), the __be32 *addr variable is dereferenced. This will not work on little-endian targets. Also since it is unsigned, checking for less than zero is redundant. Fix these two issues. Signed-off-by: David Daney [grant.likely@secretlab.ca: removed goto] Signed-off-by: Grant Likely commit 7063c0d942a1af2993531fbe52b4c74c1db818c4 Author: Feng Tang Date: Fri Dec 24 13:59:11 2010 +0800 spi/dw_spi: add DMA support dw_spi driver in upstream only supports PIO mode, and this patch will support it to cowork with the Designware dma controller used on Intel Moorestown platform, at the same time it provides a general framework to support dw_spi core to cowork with dma controllers on other platforms It has been tested with a Option GTM501L 3G modem and Infenion 60x60 modem. To use DMA mode, DMA controller 2 of Moorestown has to be enabled Also change the dma interface suggested by Linus Walleij. Acked-by: Linus Walleij Signed-off-by: Feng Tang [Typo fix and renames to match intel_mid_dma renaming] Signed-off-by: Vinod Koul Signed-off-by: Alan Cox Signed-off-by: Grant Likely commit 79290a2aa2fd1c179a285218472092475630dc0e Author: Feng Tang Date: Fri Dec 24 13:59:10 2010 +0800 spi/dw_spi: change to EXPORT_SYMBOL_GPL for exported APIs Signed-off-by: Feng Tang Signed-off-by: Grant Likely commit ebf45b7d029eb065819bfede8b30455630d76c68 Author: Feng Tang Date: Fri Dec 24 13:59:09 2010 +0800 spi/dw_spi: Fix too short timeout in spi polling loop The SPI polling loop timeout only works with HZ=100 as the loop was actually too short. Also add appropriate cpu_relax() in the busy wait loops... Signed-off-by: Arjan van de Ven Signed-off-by: Alan Cox Signed-off-by: Feng Tang Signed-off-by: Grant Likely commit 5e8b821de333f472d33e3052a8dd1c43bf3ce433 Author: Linus Walleij Date: Wed Dec 22 23:13:59 2010 +0100 spi/pl022: convert running variable This variable is a bool but defined an int and defined completely backwards. This makes the code more readable. Signed-off-by: Linus Walleij Signed-off-by: Grant Likely commit dec5a581eb5b7d1abc90885d897d2468f1e60b21 Author: Linus Walleij Date: Wed Dec 22 23:13:48 2010 +0100 spi/pl022: convert busy flag to a bool Signed-off-by: Linus Walleij Signed-off-by: Grant Likely commit 082086f2ce53c69260396e977d29972128def1d7 Author: Linus Walleij Date: Wed Dec 22 23:13:37 2010 +0100 spi/pl022: pass the returned sglen to the DMA engine The sglen return by the dma_map_sg() should be passed to the DMA engine, not the one passed in. If we one day have a DMA mapper that can coalesce entries, this will bug due to a too large number of entries being passed in. Reported-by: Russell King Signed-off-by: Linus Walleij Signed-off-by: Grant Likely commit b729889686afb7d4366e07fe9c2f7a2737166462 Author: Linus Walleij Date: Wed Dec 22 23:13:07 2010 +0100 spi/pl022: map the buffers on the DMA engine The struct device for the DMA engine is the apropriate one to use when mapping/unmapping buffers. This is because the memory which is addressable by DMA is determined by the DMA engine rather than the device. Reported-by: Russell King Signed-off-by: Linus Walleij Signed-off-by: Grant Likely commit acd0acb65ec907a9e872bbaa7ad811a518b49b45 Author: Dave Airlie Date: Tue Dec 21 01:41:15 2010 +0000 fb: fix overlapping test off-by-one. On my system with a radeon x2, the first GPU was not overlapping vesa but the test decided it was. Signed-off-by: Dave Airlie Reviewed-by: Michel Dänzer Signed-off-by: Paul Mundt commit 9d32af66aa3a0e28d95fc607e208795ef6cc993a Author: Tomoya MORINAGA Date: Fri Dec 24 11:40:50 2010 +0900 spi/topcliff_pch: Fix data transfer issue It seems spi_topcliff_pch of linux-2.6.37-rc6 degraded by previous patch. In fact, data transfer fails on evaluation board testing. I found like the following register miss-setting line. Using this patch, I have confirmed data transfer can work well. Signed-off-by: Tomoya MORINAGA Signed-off-by: Grant Likely commit 27f1acccd4d310e941d2e879445324595e2fe463 Author: Paul Mundt Date: Fri Dec 24 12:15:57 2010 +0900 sh: Fix up SH7201 clkfwk build. The master clock initialization for SH7201 was wholly bogus. Users of the legacy API must initialize the clock rate through the struct clk itself rather than returning the clock frequency. Given that the init function itself is void, returning the frequency isn't terribly effective. Signed-off-by: Paul Mundt commit 29c185e5c681ca00d863d161eda7eadb93e32ee5 Author: Paul Mundt Date: Fri Dec 24 12:08:30 2010 +0900 nommu: Provide stubbed alloc/free_vm_area() implementation. Now that these have been introduced in to the vmalloc API, sync up the nommu side of things. At present we don't deal with VMAs as such, so for the time being these will simply BUG() out. In the future it should be possible to support this interface by layering on top of the vm_regions. Signed-off-by: Paul Mundt commit 9a14f653dfe349c0916e6a78c413effa2fa3f001 Author: Paul Mundt Date: Fri Dec 24 11:50:34 2010 +0900 nommu: Fix up vmalloc_node() symbol export regression. Commit e1ca778 ("mm: add vzalloc() and vzalloc_node() helpers") ended up accidentally deleting the vmalloc_node() symbol export, resulting in: "vmalloc_node" [net/core/pktgen.ko] undefined! "vmalloc_node" [net/netfilter/x_tables.ko] undefined! regressions. Signed-off-by: Paul Mundt commit 27434f0af0fecba71fa58407715028d2b9550956 Author: Paul Mundt Date: Fri Dec 24 11:30:10 2010 +0900 sh: mach-se: Fix up SE7206 build. With some recent tidying of duplicate register definitions the se7206 IRQ code broke: arch/sh/boards/mach-se/7206/irq.c: error: 'INTC_ICR' undeclared (first use in this function) arch/sh/boards/mach-se/7206/irq.c: error: (Each undeclared identifier is reported only once arch/sh/boards/mach-se/7206/irq.c: error: for each function it appears in.) Fix it up. Signed-off-by: Paul Mundt commit 638fa4aad5bbb75c8f0d558aa15dcb543de5fc31 Author: Paul Mundt Date: Fri Dec 24 11:27:29 2010 +0900 sh: Fix up SH4-202 clkfwk build. Some of the SH4-202 code was overlooked in the set_rate() API conversion, resulting in: arch/sh/kernel/cpu/sh4/clock-sh4-202.c: error: too many arguments to function 'clk->ops->set_rate' Fix it up. Signed-off-by: Paul Mundt commit 893421745a052100b981401b7c5c6dc8708fb8a0 Author: Uwe Kleine-König Date: Wed Nov 24 10:05:46 2010 +0100 spi/imx: remove autodetection There are no machines in-tree that still use the driver name as device name. So save a few bytes and remove it. Signed-off-by: Uwe Kleine-König Acked-by: Jason Wang Signed-off-by: Grant Likely commit eda4b716ea1f2a647a39cebae66b3fae4c4b80e4 Merge: 55fb78a3a80348d87b2e3d79f61f8a9252dd86f5 7d8f98769e7f4bc29c38789daeb416c6a7d7c241 Author: Linus Torvalds Date: Thu Dec 23 16:36:48 2010 -0800 Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2 * 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2: ocfs2: Fix system inodes cache overflow. ocfs2: Hold ip_lock when set/clear flags for indexed dir. ocfs2: Adjust masklog flag values Ocfs2: Teach 'coherency=full' O_DIRECT writes to correctly up_read i_alloc_sem. ocfs2/dlm: Migrate lockres with no locks if it has a reference commit 55fb78a3a80348d87b2e3d79f61f8a9252dd86f5 Merge: 08861c713c1314d5b7329a290b5d53ad711112c3 8a7411a24350bac141271755c66f40c56b0535ae Author: Linus Torvalds Date: Thu Dec 23 16:25:31 2010 -0800 Merge branch 'linus-hot-fix' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 * 'linus-hot-fix' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: ext4: fix on-line resizing regression commit 08861c713c1314d5b7329a290b5d53ad711112c3 Merge: e82bb314eab2e25a7657f34450665160a5a6cc2b 7693457547b729d9010a6014bbb8572b085f58d4 Author: Linus Torvalds Date: Thu Dec 23 16:04:32 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: ALSA: hda - Fix GPIO2-fixup for Sony laptops ALSA: hda - Try to find an empty control index when it's occupied ALSA: hda - Fix conflict of d-mic capture volume controls ALSA: hda - Don't apply ALC269-specific initialization to ALC275 ALSA: hda - Add fix-up for Sony VAIO with ALC275 codecs ALSA: pcm: remember to always call va_end() on stuff that we va_start() ALSA: HDA: Add auto-mute for Thinkpad SL410/SL510 commit e82bb314eab2e25a7657f34450665160a5a6cc2b Merge: 79534f237f05cac7f728cc957efdcc17603e38cd 501aaa110a4269c99eff9736a81b5f93bb8b59be Author: Linus Torvalds Date: Thu Dec 23 15:59:23 2010 -0800 Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6 * 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (21 commits) [media] mceusb: set a default rx timeout [media] mceusb: fix inverted mask inversion logic [media] mceusb: add another Fintek device ID [media] lirc_dev: fixes in lirc_dev_fop_read() [media] lirc_dev: stray unlock in lirc_dev_fop_poll() [media] rc: fix sysfs entry for mceusb and streamzap [media] streamzap: merge timeout space with trailing space [media] mceusb: fix keybouce issue after parser simplification [media] IR: add tv power scancode to rc6 mce keymap [media] mceusb: buffer parsing fixups for 1st-gen device [media] mceusb: fix up reporting of trailing space [media] nuvoton-cir: improve buffer parsing responsiveness [media] mceusb: add support for Conexant Hybrid TV RDU253S [media] s5p-fimc: Fix output DMA handling in S5PV310 IP revisions [media] s5p-fimc: Use correct fourcc code for 32-bit RGB format [media] s5p-fimc: Convert m2m driver to unlocked_ioctl [media] s5p-fimc: Explicitly add required header file [media] s5p-fimc: Fix vidioc_g_crop/cropcap on camera sensor [media] s5p-fimc: BKL lock removal - compilation fix [media] soc-camera: fix static build of the sh_mobile_csi2.c driver ... commit 79534f237f05cac7f728cc957efdcc17603e38cd Merge: 3fc5e98d8cf85e0d77fc597b49e9268dff67400e 2ce494a3dac331fdbb2590e5fa0598956dd21b8b 7f8595bfacef279f06c82ec98d420ef54f2537e0 Author: Linus Torvalds Date: Thu Dec 23 15:39:40 2010 -0800 Merge branches 'perf-fixes-for-linus' and 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: perf probe: Fix to support libdwfl older than 0.148 perf tools: Fix lazy wildcard matching perf buildid-list: Fix error return for success perf buildid-cache: Fix symbolic link handling perf symbols: Stop using vmlinux files with no symbols perf probe: Fix use of kernel image path given by 'k' option * 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, kexec: Limit the crashkernel address appropriately commit 3fc5e98d8cf85e0d77fc597b49e9268dff67400e Author: David Howells Date: Wed Dec 22 16:24:13 2010 +0000 KEYS: Don't call up_write() if __key_link_begin() returns an error In construct_alloc_key(), up_write() is called in the error path if __key_link_begin() fails, but this is incorrect as __key_link_begin() only returns with the nominated keyring locked if it returns successfully. Without this patch, you might see the following in dmesg: ===================================== [ BUG: bad unlock balance detected! ] ------------------------------------- mount.cifs/5769 is trying to release lock (&key->sem) at: [] request_key_and_link+0x263/0x3fc but there are no more locks to release! other info that might help us debug this: 3 locks held by mount.cifs/5769: #0: (&type->s_umount_key#41/1){+.+.+.}, at: [] sget+0x278/0x3e7 #1: (&ret_buf->session_mutex){+.+.+.}, at: [] cifs_get_smb_ses+0x35a/0x443 [cifs] #2: (root_key_user.cons_lock){+.+.+.}, at: [] request_key_and_link+0x10a/0x3fc stack backtrace: Pid: 5769, comm: mount.cifs Not tainted 2.6.37-rc6+ #1 Call Trace: [] ? request_key_and_link+0x263/0x3fc [] print_unlock_inbalance_bug+0xca/0xd5 [] lock_release_non_nested+0xc1/0x263 [] ? request_key_and_link+0x263/0x3fc [] ? request_key_and_link+0x263/0x3fc [] lock_release+0x17d/0x1a4 [] up_write+0x23/0x3b [] request_key_and_link+0x263/0x3fc [] ? cifs_get_spnego_key+0x61/0x21f [cifs] [] request_key+0x41/0x74 [] cifs_get_spnego_key+0x200/0x21f [cifs] [] CIFS_SessSetup+0x55d/0x1273 [cifs] [] cifs_setup_session+0x90/0x1ae [cifs] [] cifs_get_smb_ses+0x37f/0x443 [cifs] [] cifs_mount+0x1aa1/0x23f3 [cifs] [] ? alloc_debug_processing+0xdb/0x120 [] ? cifs_get_spnego_key+0x1ef/0x21f [cifs] [] cifs_do_mount+0x165/0x2b3 [cifs] [] vfs_kern_mount+0xaf/0x1dc [] do_kern_mount+0x4d/0xef [] do_mount+0x6f4/0x733 [] sys_mount+0x88/0xc2 [] system_call_fastpath+0x16/0x1b Reported-by: Jeff Layton Signed-off-by: David Howells Reviewed-and-Tested-by: Jeff Layton Signed-off-by: Linus Torvalds commit 44658a11f312fb9217674cb90b1a11cbe17fd18d Author: Andres Salomon Date: Tue Dec 21 13:04:52 2010 -0800 cs5535-gpio: handle GPIO regs where higher (clear) bits are set The default for non-READ_BACK GPIO regs is to have the clear bits set; this means that our original errata fix was too simplistic. This changes it to the following behavior: - when setting GPIOs, ignore the higher order bits (they're for clearing, we don't need to care about them). - when clearing GPIOs, keep all the bits, but unset (via XOR) the lower order bit that negates the clear bit that we care about. That is, if we're clearing GPIO 26 (val = 0x04000000), we first XOR what's currently in the register with 0x0400 (GPIO 26's SET bit), and then OR that with the GPIO 26's CLEAR bit. Tested-by: Daniel Drake Signed-off-by: Andres Salomon Signed-off-by: Linus Torvalds commit 001851659354cce436b749a793f3512a53394d80 Author: Andres Salomon Date: Tue Dec 21 13:04:42 2010 -0800 cs5535-gpio: don't apply errata #36 to edge detect GPIOs The edge detect status GPIOs function differently from the other atomic model CS5536 GPIO registers; writing 1 to the high bits clears the GPIO, but writing 1 to the lower bits also clears the bit. This means that read-modify-write doesn't actually work for it, so don't apply the errata here. If a negative edge status gets lost after resume.. well, we tried our best! Tested-by: Daniel Drake Signed-off-by: Andres Salomon Signed-off-by: Linus Torvalds commit 0131d8973c8b9bd9d40fee8fae24eab24821efdb Author: Sebastian Andrzej Siewior Date: Wed Dec 1 10:54:46 2010 +0100 of/address: use proper endianess in get_flags This patch changes u32 to __be32 for all "ranges", "prop" and "addr" and such. Those variables are pointing to the device tree which contains integers in big endian format. Most functions are doing it right because of_read_number() is doing the right thing for them. of_bus_isa_get_flags(), of_bus_pci_get_flags() and of_bus_isa_map() were accessing the data directly and were doing it wrong. Signed-off-by: Sebastian Andrzej Siewior Acked-by: Benjamin Herrenschmidt Signed-off-by: Grant Likely commit aa5cbf8a70f57c5360ce1bfef692b357c866ae7f Author: Giridhar Malavali Date: Tue Dec 21 16:00:27 2010 -0800 [SCSI] qla2xxx: Use sg_next to fetch next sg element while walking sg list. Signed-off-by: Giridhar Malavali Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit 900a36e3277ac9109fe364a6a1420c71265f9377 Author: Giridhar Malavali Date: Tue Dec 21 16:00:26 2010 -0800 [SCSI] qla2xxx: Fix to avoid recursive lock failure during BSG timeout. Signed-off-by: Giridhar Malavali Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit 0ce87911491d4167198b863c102c7e4d09202561 Author: Giridhar Malavali Date: Tue Dec 21 16:00:25 2010 -0800 [SCSI] qla2xxx: Remove code to not reset ISP82xx on failure. Signed-off-by: Giridhar Malavali Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit bc5c2aad17b045ea28ab69e6149c8130ab20731e Author: Andrew Vasquez Date: Tue Dec 21 16:00:24 2010 -0800 [SCSI] qla2xxx: Display mailbox register 4 during 8012 AEN for ISP82XX parts. Signed-off-by: Andrew Vasquez Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit 7a44b86e777fc5d7a267df984d12b05fca59f487 Author: Andrew Vasquez Date: Tue Dec 21 16:00:23 2010 -0800 [SCSI] qla2xxx: Don't perform a BIG_HAMMER if Get-ID (0x20) mailbox command fails on CNAs. The semantics we employ now in the driver, performing a BIG_HAMMER in the event of Get-ID (0x20) mailbox command failing, should only be done for FC. On FC configurations, it makes sense since advertising is only really performed once, so a BIG_HAMMER to reinitiate the process is needed to restart. Under FCoE, this is not needed, as there's a continous stream of advertisements/ACks at the protocol layer to initiate a relogin/reinitialization process. Signed-off-by: Andrew Vasquez Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit f2019cb117f29ffaff961b5f6d5b3148d473de1d Author: Joe Carnuccio Date: Tue Dec 21 16:00:22 2010 -0800 [SCSI] qla2xxx: Remove redundant module parameter permission bits For driver module parameters that have permission bits set to (S_IRUGO|S_IRUSR), remove the second term since it is already included in the first term. S_IRUGO comes defined as (S_IRUSR|S_IRGRP|S_IROTH). Signed-off-by: Joe Carnuccio Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit 794a5691147652387f4a2ffa890c5c1983e38849 Author: Andrew Vasquez Date: Tue Dec 21 16:00:21 2010 -0800 [SCSI] qla2xxx: Add sysfs node for displaying board temperature. Signed-off-by: Andrew Vasquez Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit 10fbb7dd36eb3014fe4b928e596d89e036ee6210 Author: Giridhar Malavali Date: Tue Dec 21 16:00:20 2010 -0800 [SCSI] qla2xxx: Code cleanup to remove unwanted comments and code. Signed-off-by: Giridhar Malavali Signed-off-by: Lalit Chandivade Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit 710fc04da1abe48a33d54afb1ba33dbeceafb6e1 Author: Dirk Brandewie Date: Wed Dec 22 11:57:29 2010 -0800 microblaze/of: Use generic rule to build dtb's Modify arch/powerpc/boot/Makefile to use dtc command in scripts/Makefile.lib Signed-off-by: Dirk Brandewie Signed-off-by: Grant Likely commit 63849340621f7f5f963e4a9b9ba76add3ad54612 Author: Dirk Brandewie Date: Wed Dec 22 11:57:28 2010 -0800 of/powerpc: Use generic rule to build dtb's Modify arch/powerpc/boot/Makefile to use dtc command in scripts/Makefile.lib Signed-off-by: Dirk Brandewie Signed-off-by: Grant Likely commit c9e8fd5cfb7de50139a8aa0f70f9fe03311cdd01 Author: Madhuranath Iyengar Date: Tue Dec 21 16:00:19 2010 -0800 [SCSI] qla2xxx: Fix for memory wedge on fw halt for ISP82XX Signed-off-by: Swapnil Nagle Signed-off-by: Karen Higgins Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit 21090cbe95189d4ce6135fc8fec2f416b3eb227f Author: Madhuranath Iyengar Date: Tue Dec 21 16:00:18 2010 -0800 [SCSI] qla2xxx: Update FCP priority information to firmware before sending IOs The FCP priority info was not being updated properly in certain situations. Here are the changes that needs to be done to take care of this issue: 1. No need to check fcport->state for FCS_UNCONFIGURED in qla24xx_update_fcport_fcp_prio(), since an invalid loop id check is already performed which is sufficient. 2. Add the missing qla24xx_update_fcport_fcp_prio() function call within qla2x00_update_fcport() function, so that the priority info is updated on every port addition or change. 3. Perform proper adapter types checking. 4. Other changes, associated with DEBUG/printk's and parameter passing. Signed-off-by: Saurav Kashyap Signed-off-by: Andrew Vasquez Signed-off-by: Giridhar Malavali Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit 4052bd57234f119cef13b8997fcc852e2b2ce992 Author: Joe Carnuccio Date: Tue Dec 21 16:00:17 2010 -0800 [SCSI] qla2xxx: Fixed zero test on new_config in qla2x00_process_loopback(). Fixed the incorrect zero test on array new_config[]. Signed-off-by: Joe Carnuccio Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit ff8073fffc708a4959c2dd159c834f2516ce9703 Author: Andrew Vasquez Date: Tue Dec 21 16:00:16 2010 -0800 [SCSI] qla2xxx: Populate FCP_PRIO location for no *FLT* case Signed-off-by: Andrew Vasquez Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit 8ae598d02517af967685a671303c4ed10cded3c4 Author: Dan Carpenter Date: Tue Dec 21 16:00:15 2010 -0800 [SCSI] qla2xxx: list cursors are not null This is just a cleanup. The unneeded NULL check annoys static checkers because we already derefenced it and the we check it and then (if it's not the _safe() version) we dereference it again without checking. And the static checker is all, "Wah? Is it null or not?" Signed-off-by: Dan Carpenter Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit aab94339cd85d726abeae78fc02351fc1910e6a4 Author: Dirk Brandewie Date: Wed Dec 22 11:57:26 2010 -0800 of: Add support for linking device tree blobs into vmlinux This patch adds support for linking device tree blob(s) into vmlinux. Modifies asm-generic/vmlinux.lds.h to add linking .dtb sections into vmlinux. To maintain compatiblity with the of/fdt driver code platforms MUST copy the blob to a non-init memory location before the kernel frees the .init.* sections in the image. Modifies scripts/Makefile.lib to add a kbuild command to compile DTS files to device tree blobs and a rule to create objects to wrap the blobs for linking. STRUCT_ALIGNMENT is defined in vmlinux.lds.h for use in the rule to create wrapper objects for the dtb in Makefile.lib. The STRUCT_ALIGN() macro in vmlinux.lds.h is modified to use the STRUCT_ALIGNMENT definition. The DTB's are placed on 32 byte boundries to allow parsing the blob with driver/of/fdt.c during early boot without having to copy the blob to get the structure alignment GCC expects. A DTB is linked in by adding the DTB object to the list of objects to be linked into vmlinux in the archtecture specific Makefile using obj-y += foo.dtb.o Signed-off-by: Dirk Brandewie Acked-by: Michal Marek [grant.likely@secretlab.ca: cleaned up whitespace inconsistencies] Signed-off-by: Grant Likely commit 579d12b58abb4bd1161728f0a4a2524258ecf0a3 Author: Saurav Kashyap Date: Tue Dec 21 16:00:14 2010 -0800 [SCSI] qla2xxx: Added support for quiescence mode for ISP82xx. Support is added for quiescence mode. This feature is for P3P adapters. Any of the functions can put the firmware into quiescence state. All the others have to ack that request. During quiescence mode current commands are processed and all the new incoming I/Os are blocked. Loop resync is performed after firmware comes out of quiescence state. Signed-off-by: Saurav Kashyap Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit d3bd058826aa8b79590cca6c8e6d1557bf576ada Author: Yinghai Lu Date: Thu Dec 16 19:09:58 2010 -0800 x86, acpi: Parse all SRAT cpu entries even above the cpu number limitation Recent Intel new system have different order in MADT, aka will list all thread0 at first, then all thread1. But SRAT table still old order, it will list cpus in one socket all together. If the user have compiled limited NR_CPUS or boot with nr_cpus=, could have missed to put some cpus apic id to node mapping into apicid_to_node[]. for example for 4 sockets system with 64 cpus with nr_cpus=32 will get crash... [ 9.106288] Total of 32 processors activated (136190.88 BogoMIPS). [ 9.235021] divide error: 0000 [#1] SMP [ 9.235315] last sysfs file: [ 9.235481] CPU 1 [ 9.235592] Modules linked in: [ 9.245398] [ 9.245478] Pid: 2, comm: kthreadd Not tainted 2.6.37-rc1-tip-yh-01782-ge92ef79-dirty #274 /Sun Fire x4800 [ 9.265415] RIP: 0010:[] [] select_task_rq_fair+0x4f0/0x623 ... [ 9.645938] RIP [] select_task_rq_fair+0x4f0/0x623 [ 9.665356] RSP [ 9.665568] ---[ end trace 2296156d35fdfc87 ]--- So let just parse all cpu entries in SRAT. Also add apicid checking with MAX_LOCAL_APIC, in case We could out of boundaries of apicid_to_node[]. it fixes following bug too. https://bugzilla.kernel.org/show_bug.cgi?id=22662 -v2: expand to 32bit according to hpa need to add MAX_LOCAL_APIC for 32bit Reported-and-Tested-by: Wu Fengguang Reported-by: Bjorn Helgaas Tested-by: Myron Stowe Signed-off-by: Yinghai Lu LKML-Reference: <4D0AD486.9020704@kernel.org> Signed-off-by: H. Peter Anvin commit 56d91f132c9be66e98cce1b1e77a28027048bb26 Author: Yinghai Lu Date: Thu Dec 16 19:09:24 2010 -0800 x86, acpi: Add MAX_LOCAL_APIC for 32bit We should use MAX_LOCAL_APIC for max apic ids and MAX_APICS as number of local apics. Also apic_version[] array should use MAX_LOCAL_APICs. Signed-off-by: Yinghai Lu LKML-Reference: <4D0AD464.2020408@kernel.org> Signed-off-by: H. Peter Anvin commit 994e0b2c3646ce0ca0e4546e6b10c5cf66b976bf Author: Rafael J. Wysocki Date: Sat Dec 18 13:29:45 2010 +0100 PCI hotplug: Fix unexpected driver unregister in pciehp_acpi.c If pcie_ports_disabled is set, pcie_port_service_register() returns error code and select_detection_mode() should not attempt to unregister dummy_driver and use dummy_slots. It should return PCIEHP_DETECT_ACPI immediately instead. Reviewed-by: Kenji Kaneshige Acked-by: Kenji Kaneshige Signed-off-by: Rafael J. Wysocki Signed-off-by: Jesse Barnes commit 6ec1e077e36c5469a6f901ca9abbd9bd5d23e6ae Author: Felipe Balbi Date: Thu Dec 23 12:17:49 2010 -0800 arm: omap: tusb6010: add name for MUSB IRQ commit fcf173e4511193b1efeccb0f22a8c641b464353b (add names for IRQs in structure resource) forgot to take care of tusb6010 making it fail to probe due to a missing resource. Fix it. Signed-off-by: Felipe Balbi Signed-off-by: Tony Lindgren commit 840b929680c0d79f5248724d1b6b6d3f2ca3159e Author: Srinath Date: Thu Dec 23 12:17:48 2010 -0800 arm: omap: craneboard: Add USB EHCI support AM3517/05 Craneboard has one EHCI interface on board using port1. GPIO35 is used as power enable. GPIO38 is used as port1 PHY reset. History: http://marc.info/?l=linux-omap&w=2&r=1&s=Craneboard%253A%2BAdd%2BUSB%2BEHCI%2Bsupport&q=b Signed-off-by: Srinath Signed-off-by: Felipe Balbi Signed-off-by: Tony Lindgren commit e058464990c2ef1f3ecd6b83a154913c3c06f02a Author: David S. Miller Date: Thu Dec 23 12:03:57 2010 -0800 Revert "ipv4: Allow configuring subnets as local addresses" This reverts commit 4465b469008bc03b98a1b8df4e9ae501b6c69d4b. Conflicts: net/ipv4/fib_frontend.c As reported by Ben Greear, this causes regressions: > Change 4465b469008bc03b98a1b8df4e9ae501b6c69d4b caused rules > to stop matching the input device properly because the > FLOWI_FLAG_MATCH_ANY_IIF is always defined in ip_dev_find(). > > This breaks rules such as: > > ip rule add pref 512 lookup local > ip rule del pref 0 lookup local > ip link set eth2 up > ip -4 addr add 172.16.0.102/24 broadcast 172.16.0.255 dev eth2 > ip rule add to 172.16.0.102 iif eth2 lookup local pref 10 > ip rule add iif eth2 lookup 10001 pref 20 > ip route add 172.16.0.0/24 dev eth2 table 10001 > ip route add unreachable 0/0 table 10001 > > If you had a second interface 'eth0' that was on a different > subnet, pinging a system on that interface would fail: > > [root@ct503-60 ~]# ping 192.168.100.1 > connect: Invalid argument Reported-by: Ben Greear Signed-off-by: David S. Miller commit 8a7411a24350bac141271755c66f40c56b0535ae Author: Theodore Ts'o Date: Mon Dec 20 22:30:36 2010 -0500 ext4: fix on-line resizing regression https://bugzilla.kernel.org/show_bug.cgi?id=25352 This regression was caused by commit a31437b85: "ext4: use sb_issue_zeroout in setup_new_group_blocks", by accidentally dropping the code which reserved the block group descriptor and inode table blocks. Signed-off-by: "Theodore Ts'o" commit e1928c86c4829703b800c81cc9edc939b5634e6f Author: Michael Chan Date: Thu Dec 23 07:43:04 2010 +0000 cnic: Add FCoE support on 57712 - Connection ID (cid) management - Slow-path command and response support - Update version to 2.2.11. Reviewed-by: Bhanu Prakash Gollapudi Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit e21ba414eed8a233eadb79bb6b158ac7ceb35025 Author: Michael Chan Date: Thu Dec 23 07:43:03 2010 +0000 cnic: Add kcq2 support on 57712 The kcq2 (2nd kernel work queue) is used by FCoE on 57712 devices. Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit 42ecbb8426aa229167d7f9d4b4e20f24bf42cb24 Author: Eddie Wai Date: Thu Dec 23 07:43:02 2010 +0000 cnic: Call cm_connect_complete() immediately on error If we get a path_resp error from userspace, call cm_connect_complete() immediately with error so that bnx2i can react to the error faster. Signed-off-by: Eddie Wai Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit eaaa6e9c222d5c398488ed4216f0fd94e4b81759 Author: Michael Chan Date: Thu Dec 23 08:38:30 2010 +0000 cnic: Check device state before reading the kcq pointer in IRQ If the device is down, the kcq pointer may be NULL. Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit 4aacb7afb6afd78efe26427e74fa56a5fc72fad3 Author: Michael Chan Date: Thu Dec 23 07:43:01 2010 +0000 cnic: Support NIC Partition mode Add a common function cnic_read_bnx2x_iscsi_mac() to read the iSCSI MAC address at any specified shared memory location. In NIC Partition mode, we need to get the MAC address from the MF_CFG area of shared memory. Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit 5159fdc1e6cb4000f482faebeeba0be91611276d Author: Michael Chan Date: Thu Dec 23 07:42:59 2010 +0000 cnic: Use proper client and connection IDs on iSCSI ring Use the IDs specified by the bnx2x driver when initializing the ring. We don't have to make code changes when these IDs change in the future. Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit 939b82e5bde56a98c72eccde2e3a88d32bffad4a Author: Michael Chan Date: Thu Dec 23 07:42:58 2010 +0000 cnic: Improve ->iscsi_nl_msg_send() 1. Change first parameter from cnic_dev to ulp_handle which is the hba pointer. All other similar upcalls are using hba pointer. The callee can then directly reference the hba without conversion. 2. Change return value from void to int so that an error code can be passed back. This allows the operation to be retried. Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit 8adc9240f98a816f7e9b3d93b9446a790110e062 Author: Michael Chan Date: Thu Dec 23 07:42:57 2010 +0000 cnic: Prevent "scheduling while atomic" when calling ->cnic_init() cnic_dev_list is protected by rtnl_lock and cnic_dev_lock spin_lock during modifications. When looping on cnic_dev_list and calling ->cnic_init(), we should just hold rtnl_lock since ->cnic_init() may sleep. Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit 9b09336072796378dac46df63bcd43291b24fd12 Author: Michael Chan Date: Thu Dec 23 07:42:56 2010 +0000 cnic: Fix iSCSI TCP port endian order. Pass the TCP port parameter for iSCSI connections to the firmware in proper endian order. Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit 5e2f55c6aaf4865081c46bf53664c8b5da8dc49e Author: Wolfram Sang Date: Wed Dec 22 16:42:55 2010 +0100 powerpc/mpc5200: include fs.h in mpc52xx_gpt.c Fix build errors like these (from a randconfig and my defconfig for a custom board): src/arch/powerpc/platforms/52xx/mpc52xx_gpt.c:549: error: dereferencing pointer to incomplete type: 1 errors in 1 logs src/arch/powerpc/platforms/52xx/mpc52xx_gpt.c:636: error: implicit declaration of function 'nonseekable_open': 1 errors in 1 logs src/arch/powerpc/platforms/52xx/mpc52xx_gpt.c:657: error: variable 'mpc52xx_wdt_fops' has initializer but incomplete type: 1 errors in 1 logs src/arch/powerpc/platforms/52xx/mpc52xx_gpt.c:658: error: excess elements in struct initializer: 1 errors in 1 logs src/arch/powerpc/platforms/52xx/mpc52xx_gpt.c:658: error: unknown field 'owner' specified in initializer: 1 errors in 1 logs ... Reported-by: Geert Uytterhoeven Signed-off-by: Wolfram Sang Cc: Grant Likely Cc: Benjamin Herrenschmidt Cc: Andrew Morton Signed-off-by: Grant Likely commit 0e214ad81545a35c5e62a4c2d6cf7275fd7a545f Author: Dan Carpenter Date: Fri Dec 17 03:25:43 2010 +0000 USB: mcs7830: return negative if auto negotiate fails The original code returns 0 on success and 1 on failure. In fact, at this point, "ret" is already either zero or a negative error code so we can just return it directly. Signed-off-by: Dan Carpenter Signed-off-by: David S. Miller commit a130883d9528eefb66285728ba6a232d8fff9465 Merge: d9f4fbaf7053af43e6c72909c2aff18654717aed 65a6538a56d4c7ae8465f2a8420ddc65877b6779 Author: David S. Miller Date: Thu Dec 23 10:13:30 2010 -0800 Merge branch 'for-davem' of ssh://master.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 commit fdac1e0697356ac212259f2147aa60c72e334861 Author: Dan Rosenberg Date: Wed Dec 22 13:58:27 2010 +0000 irda: prevent integer underflow in IRLMP_ENUMDEVICES If the user-provided len is less than the expected offset, the IRLMP_ENUMDEVICES getsockopt will do a copy_to_user() with a very large size value. While this isn't be a security issue on x86 because it will get caught by the access_ok() check, it may leak large amounts of kernel heap on other architectures. In any event, this patch fixes it. Signed-off-by: Dan Rosenberg Signed-off-by: David S. Miller commit d9f4fbaf7053af43e6c72909c2aff18654717aed Author: Jiri Kosina Date: Wed Dec 22 23:23:38 2010 +0000 tcp: cleanup of cwnd initialization in tcp_init_metrics() Commit 86bcebafc5e7f5 ("tcp: fix >2 iw selection") fixed a case when congestion window initialization has been mistakenly omitted by introducing cwnd label and putting backwards goto from the end of the function. This makes the code unnecessarily tricky to read and understand on a first sight. Shuffle the code around a little bit to make it more obvious. Signed-off-by: Jiri Kosina Signed-off-by: David S. Miller commit 1bde5ac49398a064c753bb490535cfad89e99a5f Author: Eric Dumazet Date: Thu Dec 23 09:32:46 2010 -0800 tcp: fix listening_get_next() Alexey Vlasov found /proc/net/tcp could sometime loop and display millions of sockets in LISTEN state. In 2.6.29, when we converted TCP hash tables to RCU, we left two sk_next() calls in listening_get_next(). We must instead use sk_nulls_next() to properly detect an end of chain. Reported-by: Alexey Vlasov Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit e1e359273576ee8fe27021356b064c772ed29af3 Author: David Sharp Date: Wed Dec 22 16:38:24 2010 -0800 ring_buffer: Off-by-one and duplicate events in ring_buffer_read_page Fix two related problems in the event-copying loop of ring_buffer_read_page. The loop condition for copying events is off-by-one. "len" is the remaining space in the caller-supplied page. "size" is the size of the next event (or two events). If len == size, then there is just enough space for the next event. size was set to rb_event_ts_length, which may include the size of two events if the first event is a time-extend, in order to assure time- extends are kept together with the event after it. However, rb_advance_reader always advances by one event. This would result in the event after any time-extend being duplicated. Instead, get the size of a single event for the memcpy, but use rb_event_ts_length for the loop condition. Signed-off-by: David Sharp LKML-Reference: <1293064704-8101-1-git-send-email-dhsharp@google.com> LKML-Reference: Signed-off-by: Steven Rostedt commit 7693457547b729d9010a6014bbb8572b085f58d4 Merge: 5058cbf2c45c27e6f56f7a30b0bbe69efbd09936 7039c74cb54652ba6d726ad4d2a42dbac95a97be Author: Takashi Iwai Date: Thu Dec 23 16:37:31 2010 +0100 Merge branch 'fix/hda' into for-linus commit 7039c74cb54652ba6d726ad4d2a42dbac95a97be Author: Takashi Iwai Date: Thu Dec 23 16:35:34 2010 +0100 ALSA: hda - Fix GPIO2-fixup for Sony laptops The fix-up entries by the commit 2785591a9760c677a7ee6f541e751c23086f5bfd ALSA: hda - Add fix-up for Sony VAIO with ALC275 codecs weren't applied in the right position. They had to be before the quirk entry matching to all Sony devices. Signed-off-by: Takashi Iwai commit 94462ad3b14739d158a1ab87bb30008c1e5a6bc1 Author: Steven Rostedt Date: Mon Nov 29 13:15:42 2010 -0500 module: Move RO/NX module protection to after ftrace module update The commit: 84e1c6bb38eb318e456558b610396d9f1afaabf0 x86: Add RO/NX protection for loadable kernel modules Broke the function tracer with this output: ------------[ cut here ]------------ WARNING: at kernel/trace/ftrace.c:1014 ftrace_bug+0x114/0x171() Hardware name: Precision WorkStation 470 Modules linked in: i2c_core(+) Pid: 86, comm: modprobe Not tainted 2.6.37-rc2+ #68 Call Trace: [] warn_slowpath_common+0x85/0x9d [] ? __process_new_adapter+0x7/0x34 [i2c_core] [] ? __process_new_adapter+0x7/0x34 [i2c_core] [] warn_slowpath_null+0x1a/0x1c [] ftrace_bug+0x114/0x171 [] ? __process_new_adapter+0x7/0x34 [i2c_core] [] ftrace_process_locs+0x1ae/0x274 [] ? __process_new_adapter+0x7/0x34 [i2c_core] [] ftrace_module_notify+0x39/0x44 [] notifier_call_chain+0x37/0x63 [] __blocking_notifier_call_chain+0x46/0x5b [] blocking_notifier_call_chain+0x14/0x16 [] sys_init_module+0x73/0x1f3 [] system_call_fastpath+0x16/0x1b ---[ end trace 2aff4f4ca53ec746 ]--- ftrace faulted on writing [] __process_new_adapter+0x7/0x34 [i2c_core] The cause was that the module text was set to read only before ftrace could convert the calls to mcount to nops. Thus, the conversions failed due to not being able to write to the text locations. The simple fix is to move setting the module to read only after the module notifiers are called (where ftrace sets the module mcounts to nops). Reported-by: Peter Zijlstra Acked-by: Rusty Russell Signed-off-by: Steven Rostedt commit 104db7ff1d9d01a03a2568a156b19e1fd972e8bf Merge: 4a7863cc2eb5f9804f1c4e9156619a801cd7f14f 32b2b6ec57a3adb3ab7215fbf36ec61c15de06ee Author: Ingo Molnar Date: Thu Dec 23 14:19:45 2010 +0100 Merge branch 'perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux-2.6 into perf/core commit 394f4528c523d88daabd50f883a8d6b164075555 Merge: 90a8a73c06cc32b609a880d48449d7083327e11a 3c2dcf2aed5ea22ecf65a9a871c4963faec421b3 Author: Ingo Molnar Date: Thu Dec 23 12:57:04 2010 +0100 Merge branch 'rcu/next' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-2.6-rcu into core/rcu commit 4d3024428f5c3ef5295e6f6fb257ae118b3f93a1 Author: Chris Wilson Date: Tue Dec 14 19:21:29 2010 +0000 drm/i915: Verify Ironlake eDP presence on DP_A using the capability fuse Signed-off-by: Chris Wilson commit 63ee41d794d9c555f84205517a68509848988760 Author: Eric Anholt Date: Mon Dec 20 18:40:06 2010 -0800 drm/i915, intel_ips: When i915 loads after IPS, make IPS relink to i915. The IPS driver is designed to be able to run detached from i915 and just not enable GPU turbo in that case, in order to avoid module dependencies between the two drivers. This means that we don't know what the load order between the two is going to be, and we had previously only supported IPS after (optionally) i915, but not i915 after IPS. If the wrong order was chosen, you'd get no GPU turbo, and something like half the possible graphics performance. Signed-off-by: Eric Anholt Signed-off-by: Chris Wilson Cc: stable@kernel.org commit f797d22121404eac7b63f1291409f96bcab51c11 Author: Chris Wilson Date: Thu Dec 23 09:43:48 2010 +0000 drm/i915/sdvo: Add hdmi connector properties after initing the connector Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=25012 Reported-by: Tõnu Raitviir Signed-off-by: Chris Wilson commit 06f37751af77192b424b2b0ff17dc08de65faba0 Author: Eric Anholt Date: Tue Dec 14 10:06:46 2010 -0800 drm/i915: Set the required VFMUNIT clock gating disable on Ironlake. It's required by the specs, but we don't know why. Let's not find out why. Signed-off-by: Eric Anholt Signed-off-by: Chris Wilson commit 5058cbf2c45c27e6f56f7a30b0bbe69efbd09936 Merge: 5aad6c5f7733b94e666e3bf8b57beb7bbee15886 87a1c8aaa0bced8acf4cd64672362492460c31ae Author: Takashi Iwai Date: Thu Dec 23 10:28:26 2010 +0100 Merge branch 'fix/misc' into for-linus commit 7b4b30689d688d9ca2e5c3859db6bbe1c35e6014 Author: Ajay Ramaswamy Date: Thu Dec 23 01:19:39 2010 -0800 Input: wacom - add support for digitizer in Lenovo W700 Signed-off-by: Ajay Ramaswamy Reviewed-by: Ping Cheng Signed-off-by: Dmitry Torokhov commit 1afe206ab6998ecd5f5485e02006b0578720a691 Author: Takashi Iwai Date: Thu Dec 23 10:17:52 2010 +0100 ALSA: hda - Try to find an empty control index when it's occupied When a mixer control element was already created with the given name, try to find another index for avoiding conflicts, instead of breaking with an error. This makes the driver more robust. Signed-off-by: Takashi Iwai commit ef8313bb1a22e7d2125d9d758aa8a81f1de91d81 Author: Andres Salomon Date: Thu Dec 23 01:19:38 2010 -0800 Input: psmouse - disable the synaptics extension on OLPC machines OLPC has switched to a Synaptics touchpad. It turns out that it's pretty useless in absolute mode. This patch looks for an OLPC system (via DMI tables), and refuses to init Synaptics mode in that scenario (falling back to relative mode). Signed-off-by: Andres Salomon Signed-off-by: Dmitry Torokhov commit 7ee99161a4febe53c906cb9becc596075fd6193e Author: Andres Salomon Date: Thu Dec 23 01:18:28 2010 -0800 Input: psmouse - fix up Synaptics comment Minor comment fixup for typos and grammar. Noticed while adding a separate workaround. Signed-off-by: Andres Salomon Signed-off-by: Dmitry Torokhov commit 2d7ec12b902ae00920cee50d98757376b2fa9467 Author: Takashi Iwai Date: Thu Dec 23 10:16:05 2010 +0100 ALSA: hda - Fix conflict of d-mic capture volume controls When the d-mics are assigned to the same purpose of another analog mic pins, the driver doesn't compute the index properly, resulting in an error with "existing control". This patch fixes it. Signed-off-by: Takashi Iwai commit 26e20a108caca6231c6a5ec659f815a866904751 Merge: 691513f70d3957939a318da970987b876c720861 90a8a73c06cc32b609a880d48449d7083327e11a Author: Ingo Molnar Date: Thu Dec 23 09:48:41 2010 +0100 Merge commit 'v2.6.37-rc7' into x86/security commit cfb13c5db08c90311a5defdde9a0328ee788cca5 Merge: 4b6ba8aacbb3185703b797286547d0f8f3859b02 90a8a73c06cc32b609a880d48449d7083327e11a Author: Grant Likely Date: Thu Dec 23 00:41:14 2010 -0700 Merge commit 'v2.6.37-rc7' into devicetree/next commit 5f7bb3a439ce51ae8b92ca1dc93b91712224b69a Author: adam radford Date: Tue Dec 14 19:11:56 2010 -0800 [SCSI] megaraid_sas: Documentation update The following patch updates the Documentation/scsi/ChangeLog.megaraid_sas file. Signed-off-by: Adam Radford Signed-off-by: James Bottomley commit 9c915a8c99bce637226aa09cb05fc18486b229cb Author: adam radford Date: Tue Dec 21 13:34:31 2010 -0800 [SCSI] megaraid_sas: Add 9565/9285 specific code This patch adds MegaRAID 9265/9285 (Device id 0x5b) specific code Signed-off-by: Adam Radford Signed-off-by: James Bottomley commit cd50ba8ede5cd3c4606a8e5d163913da5ff36ad7 Author: adam radford Date: Tue Dec 21 10:23:23 2010 -0800 [SCSI] megaraid_sas: Add struct megasas_instance_template changes The following patch adds struct megasas_instance_template changes to the megaraid_sas driver, and changes all code to use the new instance entries: irqreturn_t (*service_isr )(int irq, void *devp); void (*tasklet)(unsigned long); u32 (*init_adapter)(struct megasas_instance *); u32 (*build_and_issue_cmd) (struct megasas_instance *, struct scsi_cmnd *); void (*issue_dcmd) (struct megasas_instance *instance, struct megasas_cmd *cmd); Signed-off-by: Adam Radford Signed-off-by: James Bottomley commit b6d5d8808b4c563a56414a4c4c6d652b5f87c088 Author: adam radford Date: Tue Dec 14 18:56:07 2010 -0800 [SCSI] megaraid_sas: Use lowest memory bar for SR-IOV VF support The following patch modifies the megaraid_sas driver to select the lowest memory bar available so the driver will work in SR-IOV VF environments where the memory bar mapping changes. Signed-off-by: Adam Radford Signed-off-by: James Bottomley commit 80d9da98b4034edd31f6bacdb96c7489c4460173 Author: adam radford Date: Tue Dec 21 10:17:40 2010 -0800 [SCSI] megaraid_sas: Add MSI-X support and msix_disable module parameter This patch adds MSI-X support and 'msix_disable' module parameter to the megaraid_sas driver. Signed-off-by: Adam Radford Signed-off-by: James Bottomley commit 46081b166415acb66d4b3150ecefcd9460bb48a1 Author: FUJITA Tomonori Date: Mon Dec 20 18:44:45 2010 +0200 [SCSI] st: Increase success probability in driver buffer allocation Modify allocation to try the minimum possible page order allowed by the HBA scatter/gather segment limit in allocation of the driver's internal buffer. This increases the probability of successful allocation. The allocation may still fail if this minimum order is > 0. Signed-off-by: FUJITA Tomonori Signed-off-by: Kai Makisara Reported-by: Lukas Kolbe Signed-off-by: James Bottomley commit 373daacfce9ea0091cb3027572354ddebefb8ebb Author: Kai Makisara Date: Mon Dec 20 18:43:39 2010 +0200 [SCSI] st: Store page order before driver buffer allocation The order of the pages allocated for the driver buffer must be stored before allocation because it is used in freeing already allocated pages if allocation fails. Signed-off-by: Kai Makisara Reported-by: Lukas Kolbe Signed-off-by: James Bottomley commit a87e3a67d57472f40da2218793ff6d25c4518498 Author: Douglas Gilbert Date: Fri Dec 17 19:16:06 2010 -0500 [SCSI] scsi_debug: set resid to indicate no data-in when medium error set resid to the requested data-in length when a MEDIUM ERROR is simulated. This implies no valid data is returned in the data-in buffer Signed-off-by: Douglas Gilbert Signed-off-by: James Bottomley commit a8733c7baf457b071528e385a0b7d4aaec79287c Author: James Bottomley Date: Fri Dec 17 15:36:34 2010 -0500 [SCSI] fix medium error problems with some arrays which can cause data corruption Our current handling of medium error assumes that data is returned up to the bad sector. This assumption holds good for all disk devices, all DIF arrays and most ordinary arrays. However, an LSI array engine was recently discovered which reports a medium error without returning any data. This means that when we report good data up to the medium error, we've reported junk originally in the buffer as good. Worse, if the read consists of requested data plus a readahead, and the error occurs in readahead, we'll just strip off the readahead and report junk up to userspace as good data with no error. The fix for this is to have the error position computation take into account the amount of data returned by the driver using the scsi residual data. Unfortunately, not every driver fills in this data, but for those who don't, it's set to zero, which means we'll think a full set of data was transferred and the behaviour will be identical to the prior behaviour of the code (believe the buffer up to the error sector). All modern drivers seem to set the residual, so that should fix up the LSI failure/corruption case. Reported-by: Douglas Gilbert Cc: Stable Tree Signed-off-by: James Bottomley commit e819eb8687767cefca7b6abf5ac6d5efcf581eeb Merge: ca5f73a05ebfbf74ea9874d5eaad8d63d7e69b4f 0f16830e9f6de0a44cf1e473ffa80cbe612d5beb Author: Linus Torvalds Date: Wed Dec 22 19:47:37 2010 -0800 Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 * 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: drm: Include the connector name in the output_poll_execute() debug message drm/radeon/kms: fix bug in r600_gpu_is_lockup drm/radeon/kms: reorder display resume to avoid problems drm/radeon/kms/evergreen: reset the grbm blocks at resume and init drm/radeon/kms: fix evergreen asic reset Revert "drm: Don't try and disable an encoder that was never enabled" drm/radeon: Add early unregister of firmware fb's drm/radeon: use aperture size not vram size for overlap tests drm/radeon/kms/evergreen: flush hdp cache when flushing gart tlb drm/radeon/kms: disable the r600 cb offset checker for linear surfaces drm/radeon/kms: disable ss fixed ref divide drm/i915/bios: Reverse order of 100/120 Mhz SSC clocks agp/intel: Fix missed cached memory flags setting in i965_write_entry() drm/i915/sdvo: Only use the SDVO pin if it is in the valid range drm/i915/ringbuffer: Handle wrapping of the autoreported HEAD drm/i915/dp: Fix I2C/EDID handling with active DisplayPort to DVI converter commit ca5f73a05ebfbf74ea9874d5eaad8d63d7e69b4f Merge: 97dbf37d89b6d387a5fe79ffe3b72c37ec12db43 b93cef556162b0f33399bfe5f307c54f51554e09 Author: Linus Torvalds Date: Wed Dec 22 19:47:04 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6: mfd: Support additional parent IDs for wm831x mfd: Fix ab8500-core interrupt ffs bit bug mfd: Supply IRQ base for WM832x devices watchdog: Fix null pointer dereference while accessing rdc321x platform_data gpio: Fix null pointer dereference while accessing rdc321x platform_data commit 97dbf37d89b6d387a5fe79ffe3b72c37ec12db43 Author: Sebastian Andrzej Siewior Date: Tue Dec 21 17:24:31 2010 -0800 drivers/spi/spi.c: don't release the spi device twice This was fixed by David Lamparter in v2.6.36-rc5 3486008 ("spi: free children in spi_unregister_master, not siblings") and broken again in v2.6.37-rc1~2^2~4 during the merge of 2b9603a0 ("spi: enable spi_board_info to be registered after spi_master"). Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: David Lamparter Cc: Grant Likely Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 4be2c95d1f7706ca0e74499f2bd118e1cee19669 Author: Jeff Mahoney Date: Tue Dec 21 17:24:30 2010 -0800 taskstats: pad taskstats netlink response for aligment issues on ia64 The taskstats structure is internally aligned on 8 byte boundaries but the layout of the aggregrate reply, with two NLA headers and the pid (each 4 bytes), actually force the entire structure to be unaligned. This causes the kernel to issue unaligned access warnings on some architectures like ia64. Unfortunately, some software out there doesn't properly unroll the NLA packet and assumes that the start of the taskstats structure will always be 20 bytes from the start of the netlink payload. Aligning the start of the taskstats structure breaks this software, which we don't want. So, for now the alignment only happens on architectures that require it and those users will have to update to fixed versions of those packages. Space is reserved in the packet only when needed. This ifdef should be removed in several years e.g. 2012 once we can be confident that fixed versions are installed on most systems. We add the padding before the aggregate since the aggregate is already a defined type. Commit 85893120 ("delayacct: align to 8 byte boundary on 64-bit systems") previously addressed the alignment issues by padding out the pid field. This was supposed to be a compatible change but the circumstances described above mean that it wasn't. This patch backs out that change, since it was a hack, and introduces a new NULL attribute type to provide the padding. Padding the response with 4 bytes avoids allocating an aligned taskstats structure and copying it back. Since the structure weighs in at 328 bytes, it's too big to do it on the stack. Signed-off-by: Jeff Mahoney Reported-by: Brian Rogers Cc: Jeff Mahoney Cc: Guillaume Chazarain Cc: Balbir Singh Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 4e06fd14d5fa78826397c891654a37e5a36ee827 Author: Will Newton Date: Tue Dec 21 17:24:29 2010 -0800 include/linux/unaligned: pack the whole struct rather than just the field The current packed struct implementation of unaligned access adds the packed attribute only to the field within the unaligned struct rather than to the struct as a whole. This is not sufficient to enforce proper behaviour on architectures with a default struct alignment of more than one byte. For example, the current implementation of __get_unaligned_cpu16 when compiled for arm with gcc -O1 -mstructure-size-boundary=32 assumes the struct is on a 4 byte boundary so performs the load of the 16bit packed field as if it were on a 4 byte boundary: __get_unaligned_cpu16: ldrh r0, [r0, #0] bx lr Moving the packed attribute to the struct rather than the field causes the proper unaligned access code to be generated: __get_unaligned_cpu16: ldrb r3, [r0, #0] @ zero_extendqisi2 ldrb r0, [r0, #1] @ zero_extendqisi2 orr r0, r3, r0, asl #8 bx lr Signed-off-by: Will Newton Cc: Arnd Bergmann Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 91facc22dec964683aef88f5620a790a6e46b98a Author: Johannes Berg Date: Tue Dec 21 17:24:28 2010 -0800 led_class: fix typo in blink API When I added led_blink_set I had a typo: the return value of the hw offload is a regular error code that is zero when succesful, and in that case software emulation should not be used, rather than the other way around. Signed-off-by: Johannes Berg Cc: Richard Purdie Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 5a2d6e31c683b361b5012aec1768c994fea3f25a Author: Axel Lin Date: Tue Dec 21 17:24:27 2010 -0800 backlight: cr_bllcd.c: fix a memory leak Signed-off-by: Axel Lin Cc: Thomas Hellstrom Cc: Alan Hourihane Cc: Richard Purdie Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 0d1836c366157994474afd29632992375a3dd20c Author: Michal Nazarewicz Date: Tue Dec 21 17:24:26 2010 -0800 mm/migrate.c: fix compilation error GCC complained about update_mmu_cache() not being defined in migrate.c. Including seems to solve the problem. Signed-off-by: Michal Nazarewicz Signed-off-by: Kyungmin Park Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 118364948fad7b6c0469ef2d3ddaee447d7a0b5f Author: Wolfram Sang Date: Tue Dec 21 17:24:24 2010 -0800 rtc: rs5c372: fix buffer size Match the buffer size to the amount of initialized values. Before, it was one too big and thus destroyed the neighbouring register causing the clock to run at false speeds. Reported-by: Andre van Rooyen Signed-off-by: Wolfram Sang Cc: Alessandro Zummo Cc: Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 6900609612d26ca6ba11935613aa9db112613a48 Author: Andres Salomon Date: Tue Dec 21 17:24:23 2010 -0800 MAINTAINERS: update geode entry Remove Jordan as the geode maintainer (he's not been interested in geode for some time), and add myself as the maintainer. Signed-off-by: Andres Salomon Cc: Daniel Drake Cc: Jordan Crouse Cc: Chris Ball Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit e254811c205ec539b648cff54a7852ee8dcd2e5e Author: Aaro Koskinen Date: Tue Dec 21 17:24:22 2010 -0800 gpiolib: gpio_request_one(): add missing gpio_free() If GPIO request succeeds, but configuration fails, it should be released. Signed-off-by: Aaro Koskinen Acked-by: Eric Miao Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit d153ba64450b9371158c6516d6cac120faace44c Author: Wu Fengguang Date: Tue Dec 21 17:24:21 2010 -0800 writeback: do uninterruptible sleep in balance_dirty_pages() Using TASK_INTERRUPTIBLE in balance_dirty_pages() seems wrong. If it's going to do that then it must break out if signal_pending(), otherwise it's pretty much guaranteed to degenerate into a busywait loop. Plus we *do* want these processes to appear in D state and to contribute to load average. So it should be TASK_UNINTERRUPTIBLE. -- Andrew Morton Signed-off-by: Wu Fengguang Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit f06328d7721ad3852c45eb2a10a0c8f9439b5f33 Author: Prasad Joshi Date: Tue Dec 21 17:24:20 2010 -0800 logfs: fix "Kernel BUG at readwrite.c:1193" This happens when __logfs_create() tries to write a new inode to the disk which is full. __logfs_create() associates the transaction pointer with inode. During the logfs_write_inode() function call chain this transaction pointer is moved from inode to page->private using function move_inode_to_page (do_write_inode() -> inode_to_page() -> move_inode_to_page) When the write inode fails, the transaction is aborted and iput is called on the failed inode. During delete_inode the same transaction pointer associated with the page is getting used. Thus causing kernel BUG. The patch checks for error in write_inode() and restores the page->private to NULL. Addresses https://bugzilla.kernel.org/show_bug.cgi?id=20162 Signed-off-by: Prasad Joshi Cc: Joern Engel Cc: Florian Mickler Cc: "Rafael J. Wysocki" Cc: Maciej Rutecki Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit eabb26cacdec33ca6f6fcaee762b57c2205169ca Author: Prasad Joshi Date: Tue Dec 21 17:24:19 2010 -0800 logfs: fix deadlock in logfs_get_wblocks, hold and wait on super->s_write_mutex do_logfs_journal_wl_pass() should use GFP_NOFS for memory allocation GC code calls btree_insert32 with GFP_KERNEL while holding a mutex super->s_write_mutex. The same mutex is used in address_space_operations->writepage(), and a call to writepage() could be triggered as a result of memory allocation in btree_insert32, causing a deadlock. Addresses https://bugzilla.kernel.org/show_bug.cgi?id=20342 Signed-off-by: Prasad Joshi Cc: Joern Engel Cc: Florian Mickler Cc: "Rafael J. Wysocki" Cc: Maciej Rutecki Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 7a2d19bced51af31d2c9ff55219400ed0a6c012f Author: Mel Gorman Date: Tue Dec 21 17:24:18 2010 -0800 mm: vmscan: tracepoint: account for scanned pages similarly for both ftrace and vmstat When correlating ftrace results with /proc/vmstat, I noticed that the reporting scripts value for "pages scanned" differed significantly. Both values were "right" depending on how you look at it. The difference is due to vmstat only counting scanning of the inactive list towards pages scanned. The analysis script for the tracepoint counts active and inactive list yielding a far higher value than vmstat. The resulting scanning/reclaim ratio looks much worse. The tracepoint is ok but this patch updates the reporting script so that the report values for scanned are similar to vmstat. Signed-off-by: Mel Gorman Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit dd9e5efe3aa9fc5b1ce484a531ecdba3a7a30bbf Author: Minchan Kim Date: Tue Dec 21 17:24:16 2010 -0800 mm/compaction.c: avoid double mem_cgroup_del_lru() del_page_from_lru_list() already called mem_cgroup_del_lru(). So we must not call it again. It adds unnecessary overhead. It was not a runtime bug because the TestClearPageCgroupAcctLRU() early in mem_cgroup_del_lru_list() will prevent any double-deletion, etc. Signed-off-by: Minchan Kim Acked-by: Balbir Singh Acked-by: KAMEZAWA Hiroyuki Acked-by: Mel Gorman Reviewed-by: Johannes Weiner Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 0b50c691f93a973136dc821ef11372ffdfae9646 Author: Tony Lindgren Date: Wed Dec 22 18:42:36 2010 -0800 omap2+: Initialize serial port for dynamic remuxing for n8x0 Use omap_serial_init_port so we can let the serial code handle the remuxing of the RX pads. Note that this patch alone is not enough and additional GPIO related patches are needed. Only initialize uart3_rx_irrx pin, the other uart pins can be stay static. Signed-off-by: Tony Lindgren commit 40e44399301b6dbd997408a184140b79b77f632d Author: Tony Lindgren Date: Wed Dec 22 18:42:35 2010 -0800 omap2+: Add struct omap_board_data and use it for platform level serial init This is needed to pass board specific data such as pads used to the platform level driver init code. Signed-off-by: Tony Lindgren commit 8d9af88f55be89fa4c897ded3204ef12c947731e Author: Tony Lindgren Date: Wed Dec 22 18:42:35 2010 -0800 omap2+: Allow hwmod state changes to mux pads based on the state changes Allow hwmod state changes to mux pads based on the state changes. By default, only enable and disable the pads. In some rare cases dynamic remuxing for the idles states is needed, this can be done by passing the enable, idle, and off pads from board-*.c file along with OMAP_DEVICE_PAD_REMUX flag. Thanks to Paul Walmsley for the comments on the hwmod related changes. Signed-off-by: Tony Lindgren commit 9796b323b5a1940f9ec62c3a6cf7e442bf540d53 Author: Tony Lindgren Date: Wed Dec 22 18:42:35 2010 -0800 omap2+: Add support for hwmod specific muxing of devices This allows adding hwmod specific pads dynamically during the platform device init. Note that we don't currently have the hwmod specific signals listed in the hwmod data, but struct omap_hwmod_mux_info will make that possible if necessary. Signed-off-by: Tony Lindgren commit 8419fdbaf2118a0a169441be82f09f7be93a5ca1 Author: Tony Lindgren Date: Wed Dec 22 18:42:35 2010 -0800 omap2+: Add omap_mux_get_by_name Do this by splitting _omap_mux_init_signal as it already has most of the necessary features. Based on an earlier patch by Dan Murphy . Cc: Dan Murphy Signed-off-by: Tony Lindgren commit b7e03ec9a6b9d0c0cb1e435026d46dfcd78e48ac Merge: 762e30239cce9ff0d82227ade663feed2f6283d8 b51aff057c9d0ef6c529dc25fd9f775faf7b6c63 Author: David S. Miller Date: Wed Dec 22 17:34:40 2010 -0800 Merge branch 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 commit 17f9cc3124c97f50a19a7597e5f29f915b5b835c Author: Gustavo F. Padovan Date: Wed Dec 22 23:00:34 2010 -0200 Bluetooth: Improve handling of HCI control channel in bind Does not allow any channel different of HCI_CHANNEL_RAW and HCI_CHANNEL_CONTROL to bind. Signed-off-by: Gustavo F. Padovan commit 23bb57633df97ede067ea26f3cdc8a7ba2cd8109 Author: Johan Hedberg Date: Tue Dec 21 23:01:27 2010 +0200 Bluetooth: Fix __hci_request synchronization for hci_open_dev The initialization function used by hci_open_dev (hci_init_req) sends many different HCI commands. The __hci_request function should only return when all of these commands have completed (or a timeout occurs). Several of these commands cause hci_req_complete to be called which causes __hci_request to return prematurely. This patch fixes the issue by adding a new hdev->req_last_cmd variable which is set during the initialization procedure. The hci_req_complete function will no longer mark the request as complete until the command matching hdev->req_last_cmd completes. Signed-off-by: Johan Hedberg Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit c71e97bfaadfa727669fcfcf12301744fd169091 Author: Johan Hedberg Date: Mon Dec 13 21:07:07 2010 +0200 Bluetooth: Add management events for controller addition & removal This patch adds Bluetooth Management interface events for controller addition and removal. The events correspond to the existing HCI_DEV_REG and HCI_DEV_UNREG stack internal events. Signed-off-by: Johan Hedberg Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit f7b64e69c7c75c8e9f2d5e23edec8de1ce883bcc Author: Johan Hedberg Date: Mon Dec 13 21:07:06 2010 +0200 Bluetooth: Add read_info management command This patch implements the read_info command which is used to fetch basic info about an adapter. Signed-off-by: Johan Hedberg Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit faba42eb2a8cf905ed26d540c3c93d429e327224 Author: Johan Hedberg Date: Mon Dec 13 21:07:05 2010 +0200 Bluetooth: Add read_index_list management command This patch implements the read_index_list command through which userspace can get a list of current adapter indices. Signed-off-by: Johan Hedberg Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit 02d981292ad3149e8e5f37cffbccedab1a8576d8 Author: Johan Hedberg Date: Mon Dec 13 21:07:04 2010 +0200 Bluetooth: Add read_version management command This patch implements the initial read_version command that userspace will use before any other management interface operations. Signed-off-by: Johan Hedberg Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit e41d8b4e131a41f2a3b74aaa783b16aa46376d8e Author: Johan Hedberg Date: Mon Dec 13 21:07:03 2010 +0200 Bluetooth: Add error handling for managment command handlers The command handlers for bluetooth management messaging should be able to report errors (such as memory allocation failures) to the higher levels in the call stack. Signed-off-by: Johan Hedberg Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit 762e30239cce9ff0d82227ade663feed2f6283d8 Author: Rafael J. Wysocki Date: Wed Dec 22 03:07:52 2010 +0000 atl1c: Do not use legacy PCI power management The atl1c driver uses the legacy PCI power management, so it has to do some PCI-specific things in its ->suspend() and ->resume() callbacks and they are not done correctly. Convert atl1c to the new PCI power management framework and make it let the PCI subsystem handle all of the PCI-specific aspects of device handling during system power transitions. Signed-off-by: Rafael J. Wysocki Signed-off-by: David S. Miller commit f622691c91cd1bb27d03a5caa8a43822572c62bc Author: Tomoya Date: Wed Dec 22 03:00:39 2010 +0000 pch_can: Fix array miss-pointing issue Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit 05fad3e72e98e57274b8930a08f8b476048f5022 Author: Kevin Hilman Date: Wed Dec 22 23:04:17 2010 +0000 OMAP2: PM: fix compile error when !CONFIG_SUSPEND When CONFIG_SUSPEND is not enabled, none of the system PM methods are used, so do not compile them in. Thanks to Charles Manning for reporting the problem and proposing an initial patch. Reported-by: Charles Manning Signed-off-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 1c4655651f1377297425525b250b2e4b5462015b Merge: f400c82efb474b2ccf01c796b60b36408f7845a3 b35cecf978e33bf8f4be0f36ffe00fe10f381c4a Author: Tony Lindgren Date: Wed Dec 22 15:08:05 2010 -0800 Merge branch 'pm-sr' of ssh://master.kernel.org/pub/scm/linux/kernel/git/khilman/linux-omap-pm into omap-for-linus commit f400c82efb474b2ccf01c796b60b36408f7845a3 Author: Paul Walmsley Date: Mon Dec 6 19:08:54 2010 -0700 MAINTAINERS: OMAP: hwmod: update hwmod code, data maintainership Add myself and BenoĂ®t as co-maintainers of the OMAP hwmod core code. (The OMAP hwmod code manages the integration of IP blocks on the OMAP SoC family.) Add BenoĂ®t as the maintainer of OMAP4-based SoC hwmod mode. Signed-off-by: Paul Walmsley Signed-off-by: BenoĂ®t Cousson Signed-off-by: Tony Lindgren commit 25cf0398bdf365d027e171116aa4a281e9cd3c1c Merge: 9326845f45650f6af9953a4b6a31e89b54fab82f 59bdd133561a432c4655146e283caf85fa64c2fb Author: Russell King Date: Wed Dec 22 22:46:24 2010 +0000 Merge branch 'devel' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 into devel-stable commit 09c85a440d113a8e6f32bc616423d7684970c37c Merge: ee81e7a0a86a3b40837de4a5f514c2d3758af20e a74b74a5555c741ed3df896096e33b853995631e Author: Russell King Date: Wed Dec 22 22:45:48 2010 +0000 Merge branch 'fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 commit 1da0c89c66753860ccfe81eb327c25db46c2a24a Author: Russell King Date: Wed Dec 15 21:56:47 2010 +0000 ARM: versatile: convert sched_clock() to use new infrastructure Convert versatile platforms to use the new sched_clock() infrastructure for extending 32bit counters to full 64-bit nanoseconds. Tested-by: Will Deacon Signed-off-by: Russell King commit f06a1624621527ef597ae4b3b795553fc1b2eff2 Author: Russell King Date: Wed Dec 15 21:55:06 2010 +0000 ARM: orion: convert sched_clock() to use new infrastructure Convert orion platforms to use the new sched_clock() infrastructure for extending 32bit counters to full 64-bit nanoseconds. Acked-by: Nicolas Pitre Signed-off-by: Russell King commit dc548fbbd2ecd0fc3b02301d551e5f8e19ae58fd Author: Russell King Date: Wed Dec 15 21:53:51 2010 +0000 ARM: omap: convert sched_clock() to use new infrastructure Convert omap to use the new sched_clock() infrastructure for extending 32bit counters to full 64-bit nanoseconds. Tested-by: Santosh Shilimkar Signed-off-by: Russell King commit ec05aa139939d9c7b790041a379f0e752b2f1a4d Author: Russell King Date: Wed Dec 15 21:53:02 2010 +0000 ARM: nomadik: convert sched_clock() to use new infrastructure Convert nomadik platforms to use the new sched_clock() infrastructure for extending 32bit counters to full 64-bit nanoseconds. Acked-by: Linus Walleij Signed-off-by: Russell King commit 08f26b1ef25a2f7b52afcb805d260fd5a000a7f6 Author: Russell King Date: Wed Dec 15 21:52:10 2010 +0000 ARM: iop: convert sched_clock() to use new infrastructure Convert iop platforms to use the new sched_clock() infrastructure for extending 32bit counters to full 64-bit nanoseconds. Signed-off-by: Russell King commit 5c21b7ca2c1cca3758a1d357dd57987c96ad1aa0 Author: Russell King Date: Wed Dec 15 21:50:14 2010 +0000 ARM: u300: convert sched_clock() to use new infrastructure Convert u300 to use the new sched_clock() infrastructure for extending 32bit counters to full 64-bit nanoseconds. Acked-by: Linus Walleij Signed-off-by: Russell King commit e3f4c0ab916334e861fc49eeb2673a8c13e978e7 Author: Russell King Date: Wed Dec 15 21:49:42 2010 +0000 ARM: tegra: convert sched_clock() to use new infrastructure Convert tegra to use the new sched_clock() infrastructure for extending 32bit counters to full 64-bit nanoseconds. Tested-by: Olof Johansson Signed-off-by: Russell King commit 5094b92f1c7d0f21c5d4411ba7415bac0684210f Author: Russell King Date: Wed Dec 15 21:49:06 2010 +0000 ARM: sa1100: convert sched_clock() to use new infrastructure Convert sa1100 to use the new sched_clock() infrastructure for extending 32bit counters to full 64-bit nanoseconds. Signed-off-by: Russell King commit 7ce830188199c23aaeaf0c5ccc28b73c32b6df02 Author: Russell King Date: Wed Dec 15 21:48:15 2010 +0000 ARM: pxa: convert sched_clock() to use new infrastructure Convert pxa to use the new sched_clock() infrastructure for extending 32bit counters to full 64-bit nanoseconds. Tested-by: Eric Miao Signed-off-by: Russell King commit 28bb7bc61a8cd48716d38d9c153fdc524f09870a Author: Russell King Date: Wed Dec 15 21:46:48 2010 +0000 ARM: mmp: convert sched_clock() to use new infrastructure Convert mmp to use the new sched_clock() infrastructure for extending 32bit counters to full 64-bit nanoseconds. Signed-off-by: Russell King commit 5b0d495c067d843c52fc1f9edbca29d5e9368b10 Author: Russell King Date: Wed Dec 15 21:23:13 2010 +0000 ARM: ixp4xx: convert sched_clock() to use new infrastructure Convert ixp4xx to use the new sched_clock() infrastructure for extending 32bit counters to full 64-bit nanoseconds. Tested-by: Mikael Pettersson Signed-off-by: Russell King commit 112f38a4a31668eb6a7d91d128296a26afdf7c4b Author: Russell King Date: Wed Dec 15 19:23:07 2010 +0000 ARM: sched_clock: provide common infrastructure for sched_clock() Provide common sched_clock() infrastructure for platforms to use to create a 64-bit ns based sched_clock() implementation from a counter running at a non-variable clock rate. This implementation is based upon maintaining an epoch for the counter and an epoch for the nanosecond time. When we desire a sched_clock() time, we calculate the number of counter ticks since the last epoch update, convert this to nanoseconds and add to the epoch nanoseconds. We regularly refresh these epochs within the counter wrap interval. We perform a similar calculation as above, and store the new epochs. We read and write the epochs in such a way that sched_clock() can easily (and locklessly) detect when an update is in progress, and repeat the loading of these constants when they're known not to be stable. The one caveat is that sched_clock() is not called in the middle of an update. We achieve that by disabling IRQs. Finally, if the clock rate is known at compile time, the counter to ns conversion factors can be specified, allowing sched_clock() to be tightly optimized. We ensure that these factors are correct by providing an initialization function which performs a run-time check. Acked-by: Peter Zijlstra Tested-by: Santosh Shilimkar Tested-by: Will Deacon Tested-by: Mikael Pettersson Tested-by: Eric Miao Tested-by: Olof Johansson Tested-by: Jamie Iles Reviewed-by: Nicolas Pitre Signed-off-by: Russell King commit b5776c4a6d0afc13697e8452b9ebe1cc4d961b74 Author: john stultz Date: Thu Dec 16 19:03:27 2010 +0000 Fix rounding in clocks_calc_mult_shift() Russell King reports: | On the ARM dev boards, we have a 32-bit counter running at 24MHz. Calling | clocks_calc_mult_shift(&mult, &shift, 24MHz, NSEC_PER_SEC, 60) gives | us a multiplier of 2796202666 and a shift of 26. | | Over a large counter delta, this produces an error - lets take a count | from 362976315 to 4280663372: | | (4280663372-362976315) * 2796202666 / 2^26 - (4280663372-362976315) * (1000/24) | => -38.91872422891230269990 | | Can we do better? | | (4280663372-362976315) * 2796202667 / 2^26 - (4280663372-362976315) * (1000/24) | 19.45936211449532822051 | | which is about twice as good as the 2796202666 multiplier. | | Looking at the equivalent divisions obtained, 2796202666 / 2^26 gives | 41.66666665673255920410ns per tick, whereas 2796202667 / 2^26 gives | 41.66666667163372039794ns. The actual value wanted is 1000/24 = | 41.66666666666666666666ns. Fix this by ensuring we round to nearest when calculating the multiplier. Signed-off-by: John Stultz Tested-by: Santosh Shilimkar Tested-by: Will Deacon Tested-by: Mikael Pettersson Tested-by: Eric Miao Tested-by: Olof Johansson Tested-by: Jamie Iles Signed-off-by: Russell King commit 5e06b6492e53ab2a4e467763a9ee9f70b032c301 Author: Russell King Date: Wed Dec 15 19:19:25 2010 +0000 ARM: ensure all sched_clock() implementations are notrace marked ftrace requires sched_clock() to be notrace. Ensure that all implementations are so marked. Also make sure that they include linux/sched.h Also ensure OMAP clocksource read functions are marked notrace as they're used for sched_clock() too. Tested-by: Santosh Shilimkar Tested-by: Will Deacon Tested-by: Mikael Pettersson Tested-by: Eric Miao Tested-by: Olof Johansson Signed-off-by: Russell King commit 684e94cbcb5add60356d124166e40feb2174f0f1 Author: Colin Cross Date: Wed Nov 17 16:20:15 2010 -0800 ARM: tegra: timer: Separate clocksource and sched_clock tegra_clocksource_read should not use cnt32_to_63, wrapping is already handled in the clocksource code. Move the cnt32_to_63 into the sched_clock function, and replace the use of clocksource mult and shift with a multiplication by 1000 to convert us to ns. Acked-by: John Stultz Acked-by: Linus Walleij Tested-by: Olof Johansson Signed-off-by: Colin Cross Signed-off-by: Russell King commit 11e718a6535c0c7a375b24c3ad60a98b988090c8 Author: Russell King Date: Mon Dec 13 13:21:52 2010 +0000 ARM: realview/versatile: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Tested-by: Will Deacon Signed-off-by: Russell King commit 2218543fe0c40ce36fa165c5003072cc8b236c34 Author: Russell King Date: Mon Dec 13 13:21:41 2010 +0000 ARM: stmp: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Signed-off-by: Russell King commit 1d0ac3cdf3d31ba84499c3a914aa2b54eecbf2af Author: Russell King Date: Mon Dec 13 13:21:33 2010 +0000 ARM: orion: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Acked-by: Nicolas Pitre Signed-off-by: Russell King commit e0387320c32d4b9852e6436233274003e82318a6 Author: Russell King Date: Mon Dec 13 13:21:21 2010 +0000 ARM: spear: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Acked-by: Viresh Kumar Signed-off-by: Russell King commit 8492fd28987732e42f33a3711299927e8905d448 Author: Russell King Date: Mon Dec 13 13:20:49 2010 +0000 ARM: nomadik: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Acked-by: Linus Walleij Signed-off-by: Russell King commit 509e1f0fd7627a5b8d2da9e8c2b4ab1c2743c5f6 Author: Russell King Date: Mon Dec 13 13:20:35 2010 +0000 ARM: mxc: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Acked-by: Sascha Hauer Signed-off-by: Russell King commit d28b116b9239b603f790a5ed6f0c5fe329561b49 Author: Russell King Date: Mon Dec 13 13:20:23 2010 +0000 ARM: iop: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Signed-off-by: Russell King commit 894cf56b1a64b65360086c2c890c2ae7f257793f Author: Russell King Date: Mon Dec 13 13:20:06 2010 +0000 ARM: nuc: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Acked-by: Wan zongshun Signed-off-by: Russell King commit da797478c1ba05a858c7719a02ce0856a5bb69ce Author: Russell King Date: Mon Dec 13 13:19:55 2010 +0000 ARM: U300: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Acked-by: Linus Walleij Signed-off-by: Russell King commit 6b46340a18e7552656097119d121b4b42049dde1 Author: Russell King Date: Mon Dec 13 13:19:44 2010 +0000 ARM: tcc8k: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Signed-off-by: Russell King commit 2c760b5b52a56e8b92c384dc9611e23fd4980d03 Author: Russell King Date: Mon Dec 13 13:19:35 2010 +0000 ARM: SA11x0: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Signed-off-by: Russell King commit 71c874529904818a2888a650425369e0842ff28d Author: Russell King Date: Mon Dec 13 13:19:22 2010 +0000 ARM: s5pv310: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Acked-by: Kukjin Kim Signed-off-by: Russell King commit f62ae0ce4369effc432ea25df09c88d7aa08965e Author: Russell King Date: Mon Dec 13 13:19:11 2010 +0000 ARM: PXA: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Tested-by: Eric Miao Signed-off-by: Russell King commit 8437c25e78c3af2b31bf6c8942494e34e267f446 Author: Russell King Date: Mon Dec 13 13:18:44 2010 +0000 ARM: omap: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Tested-by: Santosh Shilimkar Signed-off-by: Russell King commit b460ddbbe29a45cc13e3f13314ec9aed7e9412f2 Author: Russell King Date: Mon Dec 13 13:18:32 2010 +0000 ARM: ns9xxx: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Signed-off-by: Russell King commit 4f9272bfe8fca7e6d9e2f44eb78fd2c3ecdf9a0e Author: Russell King Date: Mon Dec 13 13:18:21 2010 +0000 ARM: netx: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Signed-off-by: Russell King commit ff9c9772480f06bc7164217b93ebb99fc088539f Author: Russell King Date: Mon Dec 13 13:18:12 2010 +0000 ARM: MSM: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Tested-By: Jeff Ohlstein Acked-by: David Brown Signed-off-by: Russell King commit 5975f496e07e0f1e396939308b815f99907440ea Author: Russell King Date: Mon Dec 13 13:18:04 2010 +0000 ARM: mmp: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Signed-off-by: Russell King commit 594cbf2f4ceaaacc706eb1302ff139a61092ec6f Author: Russell King Date: Mon Dec 13 13:17:52 2010 +0000 ARM: lpc32xx: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Signed-off-by: Russell King commit b7c7c50adcf0d9c901542c5db8d795fe226bb454 Author: Russell King Date: Mon Dec 13 13:17:40 2010 +0000 ARM: ixp4xx: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Tested-by: Mikael Pettersson Signed-off-by: Russell King commit 08963dab7c6b0ba6a687cb008299eabbbeff7282 Author: Russell King Date: Mon Dec 13 13:17:24 2010 +0000 ARM: integrator: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Signed-off-by: Russell King commit 7c044be50d4bdc33e039a65956b8a927feecaaa3 Author: Russell King Date: Mon Dec 13 13:17:12 2010 +0000 ARM: davinci: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Acked-by: Kevin Hilman Tested-by: Kevin Hilman Signed-off-by: Russell King commit 6eda51192fb1c767f792e92c67b9a4fd73c1fcba Author: Russell King Date: Mon Dec 13 13:16:39 2010 +0000 ARM: bcmring: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Acked-By: Scott Branden Acked-By: Jiandong Zheng Signed-off-by: Russell King commit 32b2b6ec57a3adb3ab7215fbf36ec61c15de06ee Author: Franck Bui-Huu Date: Wed Dec 22 17:37:13 2010 +0100 perf probe: Fix wrong warning in __show_one_line() if read(1) errors happen This was introduced by commit fde52dbd7f71934aba4e150f3d1d51e826a08850. Cc: H. Peter Anvin Cc: Masami Hiramatsu Cc: Ingo Molnar Cc: Thomas Gleixner LKML-Reference: Signed-off-by: Franck Bui-Huu Signed-off-by: Arnaldo Carvalho de Melo commit d3678758048308049cdad31ec3eae063be17c0db Author: Arnaldo Carvalho de Melo Date: Tue Dec 21 23:38:37 2010 -0200 perf test: Look forward for symbol aliases Not just before, fixing these false positives: [acme@mica linux]$ perf test -v 1 1: vmlinux symtab matches kallsyms: --- start --- Looking at the vmlinux_path (6 entries long) Using //lib/modules/2.6.37-rc5-00180-ge06b6bf/build/vmlinux for symbols 0xffffffff81058dc0: diff name v: sys_vm86old k: sys_ni_syscall 0xffffffff81058dc0: diff name v: sys_vm86 k: sys_ni_syscall 0xffffffff81058dc0: diff name v: sys_subpage_prot k: sys_ni_syscall 0xffffffff810b5f7c: diff name v: probe_kernel_write k: __probe_kernel_write 0xffffffff810b5fe5: diff name v: probe_kernel_read k: __probe_kernel_read 0xffffffff811bc380: diff name v: __memset k: memset 0xffffffff81384a98: diff name v: __sched_text_start k: sleep_on_common 0xffffffff81386750: diff name v: __sched_text_end k: _raw_spin_trylock 0xffffffff8138cee8: diff name v: __irqentry_text_start k: do_IRQ 0xffffffff8138f079: diff name v: __start_notes k: _etext 0xffffffff8138f079: diff name v: __stop_notes k: _etext ---- end ---- vmlinux symtab matches kallsyms: FAILED! [acme@mica linux]$ Some are weak functions, others are just markers, etc. They get in the rb tree with the same addr, so we need to look around to find the symbol with the same name. We were looking just at the previous entries with the same addr, look forward too. Cc: Frederic Weisbecker Cc: Han Pingtian Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Paul Mackerras Cc: Stephane Eranian LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit b35cecf978e33bf8f4be0f36ffe00fe10f381c4a Author: Thara Gopinath Date: Wed Aug 18 12:23:12 2010 +0530 OMAP4: Smartreflex framework extensions This patch extends the smartreflex framework to support OMAP4. The changes are minor like compiling smartreflex Kconfig option for OMAP4 also, and a couple of OMAP4 checks in the smartreflex framework. The change in sr_device.c where new logic has to be introduced for reading the efuse registers is due to the fact that in OMAP4 the efuse registers are 24 bit aligned. A __raw_readl will fail for non-32 bit aligned address and hence the 8-bit read and shift. Signed-off-by: Thara Gopinath Signed-off-by: Kevin Hilman commit fb200cfb2330b959eabc94e2f2c15717ce8466af Author: Benoit Cousson Date: Wed Aug 18 12:22:52 2010 +0530 OMAP4: hwmod: Add inital data for smartreflex modules. This patch adds the hwmod details for OMAP4 smartreflex modules. Signed-off-by: Benoit Cousson Signed-off-by: Kevin Hilman commit 1376ee1d191b32d0be6d2956f1a6f3dd63251e2e Author: Thara Gopinath Date: Sat May 29 22:02:25 2010 +0530 OMAP4: PM: Program correct init voltages for scalable VDDs By default the system boots up at nominal voltage for every voltage domain in the system. This patch puts vdd_mpu, vdd_iva and vdd_core to the correct boot up voltage as per the opp tables specified. This patch implements this by matching the rate of the main clock of the voltage domain with the opp table and picking up the correct voltage. Signed-off-by: Thara Gopinath Signed-off-by: Kevin Hilman commit bd38107b565a41d994aa22db0962ffcc34ebef02 Author: Thara Gopinath Date: Fri Dec 10 23:15:23 2010 +0530 OMAP4: Adding voltage driver support OMAP4 has three scalable voltage domains vdd_mpu, vdd_iva and vdd_core. This patch adds the voltage tables and other configurable voltage processor and voltage controller settings to control these three scalable domains in OMAP4. Signed-off-by: Thara Gopinath Signed-off-by: Kevin Hilman commit 3b01a413c196c91040d41c86e5b56f76bb369f74 Author: Arnaldo Carvalho de Melo Date: Wed Dec 22 01:08:36 2010 -0200 perf symbols: Improve kallsyms symbol end addr calculation For kallsyms we don't have the symbol address end, so we do an extra pass and set the symbol end addr as being the start of the next minus one. But this was being done just after we filtered the symbols of a particular type (functions, variables), so the symbol end was sometimes after what it really is. Fixing up symbol end also was falling apart when we have symbol aliases, then the end address of all but the last alias was being set to be before its start. Fix it up by checking for symbol aliases and making the kallsyms__parse routine use the next symbol, whatever its type, as the limit for the previous symbol, passing that end address to the callback. This was detected by the 'perf test' synthetic paranoid regression tests, fix it up so that even that case doesn't mislead us. Cc: Frederic Weisbecker Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Paul Mackerras Cc: Stephane Eranian LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 7bc3ed9ae632b9c94d3721d555d3452e24ca8ee3 Author: Thara Gopinath Date: Fri Dec 10 23:15:16 2010 +0530 OMAP4: Register voltage PMIC parameters with the voltage layer TWL6030 is the power IC used along with OMAP4 in OMAP4 SDPs, blaze boards and panda boards. This patch registers the OMAP4 PMIC specific information with the voltage layer. This also involves implementing a different formula for voltage to vsel and vsel to voltage calculations from TWL4030. Signed-off-by: Thara Gopinath Signed-off-by: Kevin Hilman commit 1482d8be5525eccdec6286677d40af29da03a30c Author: Thara Gopinath Date: Sat May 29 22:02:25 2010 +0530 OMAP3: PM: Program correct init voltages for VDD1 and VDD2 By default the system boots up at nominal voltage for every voltage domain in the system. This patch puts VDD1 and VDD2 to the correct boot up voltage as per the opp tables specified. This patch implements this by matching the rate of the main clock of the voltage domain with the opp table and picking up the correct voltage. Signed-off-by: Thara Gopinath Signed-off-by: Kevin Hilman commit 077fceca3a5db69791d64723ffba1caad2f03a08 Author: Thara Gopinath Date: Wed Oct 27 20:29:37 2010 +0530 OMAP3: PM: Adding debug support to Voltage and Smartreflex drivers This patch adds debug support to the voltage and smartreflex drivers. This means a whole bunch of voltage processor and smartreflex parameters are now visible through the pm debugfs. The voltage parameters can be viewed at /debug/voltage/vdd_/ and the smartreflex parameters can be viewed at /debug/voltage/vdd_/smartreflex/ Also smartreflex n-target values are now exposed out at /debug/voltage/vdd_/smartreflex/nvalue/ This is a read-write interface which means user has the flexibility to change the n-target values for any opp. Signed-off-by: Thara Gopinath Signed-off-by: Kevin Hilman commit fbc319f67660ede23cc22f3af5df559693f8062e Author: Thara Gopinath Date: Fri Dec 10 22:51:05 2010 +0530 OMAP3: PM: Register TWL4030 pmic info with the voltage driver. This patch registers the TWL4030 PMIC specific informtion with the voltage driver. Failing this patch the voltage driver is unware of the formula to use for vsel to voltage and vice versa conversion and lot of other PMIC dependent parameters. This file is based on the arch/arm/plat-omap opp_twl_tpl.c file by Paul Walmsley. The original file is replaced by this file. Signed-off-by: Thara Gopinath Signed-off-by: Kevin Hilman commit fa765823a3cbb9ce1b13ce2832109a50d899c471 Author: Thara Gopinath Date: Sat May 29 22:02:25 2010 +0530 OMAP3: PM: Adding smartreflex class3 driver Smartreflex Class3 implementation continuously monitors silicon performance and instructs the Voltage Processors to increase or decrease the voltage. This patch adds smartreflex class 3 driver. This driver hooks up with the generic smartreflex driver smartreflex.c to abstract out class specific implementations out of the generic driver. Class3 driver is chosen as the default class driver for smartreflex. If any other class driver needs to be implemented, the init of that driver should be called from the board file. That way the new class driver will over-ride the Class3 driver. Signed-off-by: Thara Gopinath Signed-off-by: Kevin Hilman commit d34427267186827dfd62bd8cf726601fffb22534 Author: Thara Gopinath Date: Sat May 29 22:02:24 2010 +0530 OMAP3: PM: Adding smartreflex hwmod data This patch adds the smartreflex hwmod data for OMAP3430 and OMAP3630. Signed-off-by: Thara Gopinath Signed-off-by: Kevin Hilman commit 0c0a5d61ed9319e7e666990a7888f3b00868ac20 Author: Thara Gopinath Date: Sat May 29 22:02:23 2010 +0530 OMAP3: PM: Adding smartreflex device file. This patch adds support for device registration of various smartreflex module present in the system. This patch introduces the platform data for smartreflex devices which include the efused n-target vaules, a parameter to indicate whether smartreflex autocompensation needs to be enabled on init or not. An API omap_enable_smartreflex_on_init is provided for the board files to enable smartreflex autocompensation during system boot up. Signed-off-by: Thara Gopinath Signed-off-by: Kevin Hilman commit 984aa6dbf4ca5be806fee217311c9cc68e8f2e88 Author: Thara Gopinath Date: Sat May 29 22:02:22 2010 +0530 OMAP3: PM: Adding smartreflex driver support. SmartReflex modules do adaptive voltage control for real-time voltage adjustments. With Smartreflex the power supply voltage can be adapted to the silicon performance(manufacturing process, temperature induced performance, age induced performance etc). There are differnet classes of smartreflex implementation. Class-0: Manufacturing Test Calibration Class-1: Boot-Time Software Calibration Class-2: Continuous Software Calibration Class-3: Continuous Hardware Calibration Class-4: Fully Integrated Power Management OMAP3 has two smartreflex modules one associated with VDD MPU and the other associated with VDD CORE. This patch adds support for smartreflex driver. The driver is designed for Class-1 , Class-2 and Class-3 support and is a platform driver. Smartreflex driver can be enabled through a Kconfig option "SmartReflex support" under "System type"->"TI OMAP implementations" menu. Smartreflex autocompensation feature can be enabled runtime through a debug fs option. To enable smartreflex autocompensation feature echo 1 > /debug/voltage/vdd_/smartreflex/autocomp To disable smartreflex autocompensation feature echo 0 > /debug/voltage/vdd_/smartreflex/autocomp where X can be mpu, core , iva etc. This patch contains code originally in linux omap pm branch. Major contributors to this driver are Lesly A M, Rajendra Nayak, Kalle Jokiniemi, Paul Walmsley, Nishant Menon, Kevin Hilman. Signed-off-by: Thara Gopinath Signed-off-by: Kevin Hilman commit 3b92408c7dfeb918fdd2f9fadc73177a59ad621c Author: Thara Gopinath Date: Wed Aug 18 16:21:58 2010 +0530 OMAP: Introduce voltage domain information in the hwmod structures This patch extends the device hwmod structure to contain info about the voltage domain to which the device belongs to. This is needed to support a device based DVFS where the device knows which voltage domain it belongs to. Signed-off-by: Thara Gopinath Signed-off-by: Kevin Hilman commit 2f34ce81b8c05c900e45bd88595cc154f7bb5957 Author: Thara Gopinath Date: Sat May 29 22:02:21 2010 +0530 OMAP3: PM: Adding voltage driver support. This patch adds voltage driver support for OMAP3. The driver allows configuring the voltage controller and voltage processors during init and exports APIs to enable/disable voltage processors, scale voltage and reset voltage. The driver maintains the global voltage table on a per VDD basis which contains the various voltages supported by the VDD along with per voltage dependent data like smartreflex efuse offset, errminlimit and voltage processor errorgain. The driver also allows the voltage parameters dependent on the PMIC to be passed from the PMIC file through an API. The driver allows scaling of VDD voltages either through "vc bypass method" or through "vp forceupdate method" the choice being configurable through the board file. This patch contains code originally in linux omap pm branch smartreflex driver. Major contributors to this driver are Lesly A M, Rajendra Nayak, Kalle Jokiniemi, Paul Walmsley, Nishant Menon, Kevin Hilman. The separation of PMIC parameters into a separate structure which can be populated from the PMIC file is based on the work of Lun Chang from Motorola in an internal tree. Signed-off-by: Thara Gopinath [khilman: fixed link error for OMAP2-only defconfig] Signed-off-by: Kevin Hilman commit a3ba81131aca243bfecfa78c42edec0cd69f72d6 Author: Ben Gamari Date: Wed Dec 22 13:30:14 2010 -0500 Make fixdep error handling more explicit Also add missing error handling to fstat call Signed-off-by: Ben Gamari Signed-off-by: Michal Marek commit 4a7863cc2eb5f9804f1c4e9156619a801cd7f14f Author: Don Zickus Date: Wed Dec 22 14:00:03 2010 -0500 x86, nmi_watchdog: Remove ARCH_HAS_NMI_WATCHDOG and rely on CONFIG_HARDLOCKUP_DETECTOR The x86 arch has shifted its use of the nmi_watchdog from a local implementation to the global one provide by kernel/watchdog.c. This shift has caused a whole bunch of compile problems under different config options. I attempt to simplify things with the patch below. In order to simplify things, I had to come to terms with the meaning of two terms ARCH_HAS_NMI_WATCHDOG and CONFIG_HARDLOCKUP_DETECTOR. Basically they mean the same thing, the former on a local level and the latter on a global level. With the old x86 nmi watchdog gone, there is no need to rely on defining the ARCH_HAS_NMI_WATCHDOG variable because it doesn't make sense any more. x86 will now use the global implementation. The changes below do a few things. First it changes the few places that relied on ARCH_HAS_NMI_WATCHDOG to use CONFIG_X86_LOCAL_APIC (the former was an alias for the latter anyway, so nothing unusual here). Those pieces of code were relying more on local apic functionality the nmi watchdog functionality, so the change should make sense. Second, I removed the x86 implementation of touch_nmi_watchdog(). It isn't need now, instead x86 will rely on kernel/watchdog.c's implementation. Third, I removed the #define ARCH_HAS_NMI_WATCHDOG itself from x86. And tweaked the include/linux/nmi.h file to tell users to look for an externally defined touch_nmi_watchdog in the case of ARCH_HAS_NMI_WATCHDOG _or_ CONFIG_HARDLOCKUP_DETECTOR. This changes removes some of the ugliness in that file. Finally, I added a Kconfig dependency for CONFIG_HARDLOCKUP_DETECTOR that said you can't have ARCH_HAS_NMI_WATCHDOG _and_ CONFIG_HARDLOCKUP_DETECTOR. You can only have one nmi_watchdog. Tested with ARCH=i386: allnoconfig, defconfig, allyesconfig, (various broken configs) ARCH=x86_64: allnoconfig, defconfig, allyesconfig, (various broken configs) Hopefully, after this patch I won't get any more compile broken emails. :-) v3: changed a couple of 'linux/nmi.h' -> 'asm/nmi.h' to pick-up correct function prototypes when CONFIG_HARDLOCKUP_DETECTOR is not set. Signed-off-by: Don Zickus Cc: Peter Zijlstra Cc: fweisbec@gmail.com LKML-Reference: <1293044403-14117-1-git-send-email-dzickus@redhat.com> Signed-off-by: Ingo Molnar commit 5c4bc1ce917d93ce8f7dd498fbec6881b3d7743a Author: Chaoming Li Date: Wed Dec 22 10:56:02 2010 -0600 rtlwifi: Fix large packet issue An RX buffer is set to 9100 bytes to receive 8K AMSDU; however, an skb of this size fails in the kernel. Signed-off-by: Chaoming Li Signed-off-by: Larry Finger Signed-off-by: John W. Linville commit 172128468f61e16e1427238278b9ad775584aa89 Author: Johannes Berg Date: Wed Dec 22 10:15:30 2010 +0100 mac80211: cleanup select_queue There's a redundant rcu_read_lock/unlock pair, a redundant variable, and a few redundant accesses to the 1d_to_ac array. Fix this to make the code neater and easier to follow. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit db7ec38d8e99f449856c11ffaef363a8eb5af90f Author: Mohammed Shafi Shajakhan Date: Wed Dec 22 12:20:12 2010 +0530 ath9k: Reset keycache on resume It looks like some hardware registers are left into undefined state after suspend/resume. At minimum, this can cause odd issues related to key cache and hardware trying to encrypt/decrypt frames unexpectedly. This seems to happen even when there is no keys configured, i.e., hardware can end up touching TX frames just based of invalid key cache context even if the driver is not asking a specific entry to be used. In addition, RX can likely be affected. This patch fixes this issue. Signed-off-by: Jouni Malinen Signed-off-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit e6d8a817d00793eecd063b1548bbc954ab62b124 Author: Larry Finger Date: Tue Dec 21 19:40:40 2010 -0600 rtlwifi: rtl8192ce: Fix driver problem when radio switch off at module load If the radio enable switch is off when the driver is loaded, it is not possible to get radio output until the driver is unloaded and reloaded with the switch on. Signed-off-by: Larry Finger Signed-off-by: John W. Linville commit 40d70dd12200ffeacfe9caaa8242e3ad2995bb5d Author: Jussi Kivilinna Date: Tue Dec 21 22:44:49 2010 +0200 rndis_wlan: add support for set_power_mgmt Signed-off-by: Jussi Kivilinna Signed-off-by: John W. Linville commit 49b35bd3f5bbc6997b24b04e9d4896f00cee3528 Author: Jussi Kivilinna Date: Tue Dec 21 22:44:42 2010 +0200 rndis_wlan: add support for set_cqm_rssi_config Device poller already reads current RSSI, so add support for set_cqm_rssi_config there. Signed-off-by: Jussi Kivilinna Signed-off-by: John W. Linville commit a3463a1fdc9aa0881760e54efbd62742275601a5 Author: Jussi Kivilinna Date: Tue Dec 21 22:44:34 2010 +0200 rndis_wlan: remove unused variable from priv structure Signed-off-by: Jussi Kivilinna Signed-off-by: John W. Linville commit c2aa413279cde7c867fc90b07f83fff3c1e9e98d Author: Jussi Kivilinna Date: Tue Dec 21 22:44:27 2010 +0200 rndis_wlan: constify rndis_config_ops Signed-off-by: Jussi Kivilinna Signed-off-by: John W. Linville commit 21b27beca73ad7d2829fe9cc3e48054f69e3d9d3 Author: Jussi Kivilinna Date: Tue Dec 21 22:44:20 2010 +0200 rndis_wlan: turn radio off before interface is bring up Radio should be off when interface is down. Signed-off-by: Jussi Kivilinna Signed-off-by: John W. Linville commit 0b578021745b61b2ff89f6bacbac5db08a9a8089 Author: Jussi Kivilinna Date: Tue Dec 21 22:44:12 2010 +0200 rndis_wlan: do not set default_key if not WEP key rndis_set_default_key did call add_wep_key to set default key on device, even if key is WPA. This caused rndis_wlan not work with wpa_supplicant in nl80211 mode (causing disconnect from AP). Signed-off-by: Jussi Kivilinna Signed-off-by: John W. Linville commit bfe3850b0cfca6ba64395e2705d9a51cd044f374 Author: Jussi Kivilinna Date: Tue Dec 21 22:44:05 2010 +0200 rndis_wlan: scanning, workaround device returning incorrect bssid-list item count. Sometimes device returns wrong number of items in bssid-list. Appears that some specific beacons trigger this problem and leads to very poor scanning results. Workaround by ignoring num_items received from device and walkthrough full bssid-list buffer. v2: Fix buffer range checks and reading next item length. Old code read behind buffer on last item but didn't use those values as 'count' would also reach zero. Also fix resizing of buffer if device has larger buffer, old code assumed that BSSID-list OID would return same buffer size when it really can return yet another new larger length. Tested-by: LuĂ­s Picciochi Signed-off-by: Jussi Kivilinna Signed-off-by: John W. Linville commit ab72efdf107e5b0e0a05efb8f24cc6c598ae31ea Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 21 21:29:44 2010 +0100 b43: N-PHY: enable support for PHYs rev 3 and higher Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit d4814e69eec24f46a9f0a6d57b80e0a6add594c7 Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 21 23:57:48 2010 +0100 b43: N-PHY: update 2056 radio on channel switch on rev3+ Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit d41446467320b7cbe550a85c44fd9d3cb12c119d Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 21 19:40:18 2010 +0100 b43: N-PHY: use correct channel tables for rev4+ Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit aca434d36f38754392f53e7b16f90eab66ae95e0 Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 21 11:50:22 2010 +0100 b43: N-PHY: avoid PHY hangs for rev 3 and 4 Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 94a5b0452410f8bdff27aa13592bec046fb6095d Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 21 11:50:21 2010 +0100 b43: N-PHY: add init tables for 2056 radio Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit ea7ee14b8a6371f006d73333ef2b7fe929b6dab0 Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 21 17:13:44 2010 +0100 b43: N-PHY: implement radio 2056 init steps Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit e41596a118a5cb15a045ef773dc117b2596e6a86 Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 21 11:50:19 2010 +0100 b43: use correct firmware for newer cores Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit d0ce2d170585b7061a08af061d64ebb08c6782dd Author: Vasanthakumar Thiagarajan Date: Tue Dec 21 01:42:43 2010 -0800 ath9k_hw: Fix bug in eeprom data length validation for AR9485 The size of the eeprom data is 1088 bytes for AR9485. But a sanity check is done against 4K which would result in a 'potential read past the end of the buffer' smatch complaint. Reported-by: Dan Carpenter Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 0207c0c51a37659a92232e665f2a7fadec170556 Author: Bruno Randolf Date: Tue Dec 21 17:30:43 2010 +0900 ath5k: Use helper function to get eeprom mode from channel Introduce a helper function to get the EEPROM mode from channel and remove multiple similar switch statements. Also since it's now easy to get the EEPROM mode from the channel, use them inside the functions which need it, instead of passing a redundant ee_mode parameter. Signed-off-by: Bruno Randolf Acked-by: Nick Kossifidis Signed-off-by: John W. Linville commit 26a51ad7f285236ca593c57cffcaadd40514084a Author: Bruno Randolf Date: Tue Dec 21 17:30:37 2010 +0900 ath5k: Remove ATH5K_INI_RFGAIN defines, use band instead Remove redundant defines. Signed-off-by: Bruno Randolf Acked-by: Nick Kossifidis Signed-off-by: John W. Linville commit 51f00622e5664ae77fd6c8670ddd402d9b77ccc8 Author: Bruno Randolf Date: Tue Dec 21 17:30:32 2010 +0900 ath5k: Track current TX power separately from max TX power Add a new variable to keep track of the currently configured tx power. Before max_pwr was re-used for keeping the maximum allowed power as well as the current configuration. Doing a min() on it allows you to lower the txpower, but how would you be able to make it higher again? This patch fixes that by adding a new variable ah_cur_pwr which is used instead of txp_max_pwr to keep the current configuration. txp_max_pwr is used to check if we are within the limits. Another problem fixed by this patch is that it avoids setting a zero txpower when things are initialized first and the current power is not yet set. Signed-off-by: Bruno Randolf Acked-by: Nick Kossifidis Signed-off-by: John W. Linville commit 56bd29d361a53f3bf6b815b5bf570a23bdc55b35 Author: Bruno Randolf Date: Tue Dec 21 17:30:26 2010 +0900 ath5k: Separate powertable setup and writing And rename functions which write the powertable to make it clearer. Signed-off-by: Bruno Randolf Acked-by: Nick Kossifidis Signed-off-by: John W. Linville commit 26c7fc436422de5d6d2b491f777e965e96f5c3a2 Author: Bruno Randolf Date: Tue Dec 21 17:30:20 2010 +0900 ath5k: Simplify powertable recalculation Let ath5k_hw_txpower() decide if it can re-use the powertable or if it has to be recalculated instead of passing a 'fast' flag from the outside. Signed-off-by: Bruno Randolf Acked-by: Nick Kossifidis Signed-off-by: John W. Linville commit 6dab55bf7eb52ca21d5e6c97b97f70875fe41ddc Author: Dan Carpenter Date: Tue Dec 21 06:59:06 2010 +0300 ath9k: unlock on error path in ath9k_change_interface() There is a missing unlock when we hit the "No beacon slot available" error condition. Signed-off-by: Dan Carpenter Signed-off-by: John W. Linville commit 8d6a686a0d20d39c202fdfc6fa7f1daf1d6e3b35 Author: Hauke Mehrtens Date: Tue Dec 21 02:01:56 2010 +0100 rtlwifi: Use pci_pcie_cap() Use function pci_pcie_cap() instead of accessing struct member directly. Signed-off-by: Hauke Mehrtens Tested-by: Larry Finger Signed-off-by: John W. Linville commit e40b5faabc34f61fdf17b40d2e31837461ddc467 Author: Hauke Mehrtens Date: Tue Dec 21 02:01:55 2010 +0100 ath9k: Use pci_is_pcie() Use function pci_is_pcie() instead of accessing struct member directly. CC: Luis R. Rodriguez Signed-off-by: Hauke Mehrtens Signed-off-by: John W. Linville commit e98b06b09be0fc459806aa4d2c301cfaf268c570 Author: Hauke Mehrtens Date: Tue Dec 21 02:01:54 2010 +0100 ath5k: Use pci_is_pcie() Use function pci_is_pcie() instead of accessing struct member directly. CC: Luis R. Rodriguez Signed-off-by: Hauke Mehrtens Signed-off-by: John W. Linville commit 2cdb9a42f3b4c97088ea0768dbee55ee8863f233 Author: Hauke Mehrtens Date: Tue Dec 21 02:01:53 2010 +0100 rt2x00: Use pci_is_pcie() Use function pci_is_pcie() instead of accessing struct member directly. Signed-off-by: Hauke Mehrtens Acked-by: Gertjan van Wingerde Acked-by: Ivo van Doorn Signed-off-by: John W. Linville commit 6b740aaa005474a7b135d3c554b9295c73eaab95 Author: Hauke Mehrtens Date: Tue Dec 21 02:01:52 2010 +0100 ssb: Use pci_is_pcie() Use function pci_is_pcie() instead of accessing struct member directly. CC: Michael Buesch Signed-off-by: Hauke Mehrtens Signed-off-by: John W. Linville commit 750de29109770f6b50daecc4c44aaa50a9e0075b Author: Hauke Mehrtens Date: Tue Dec 21 02:01:51 2010 +0100 wl12xx: remove unnecessary import No function declared in gpio.h is used here. Signed-off-by: Hauke Mehrtens Acked-by: Luciano Coelho Signed-off-by: John W. Linville commit 63d9faf665ba27c65f0cf118df05a412d3dfd39d Author: Hauke Mehrtens Date: Tue Dec 21 02:01:50 2010 +0100 wl1251: remove unnecessary import No function declared in gpio.h is used here. Signed-off-by: Hauke Mehrtens Acked-by: Kalle Valo Signed-off-by: John W. Linville commit afe68d0a8f5961652e26cea39d74e2cc820de841 Author: Luis R. Rodriguez Date: Mon Dec 20 11:29:59 2010 -0500 ath9k: fix aphy / wiphy idle mismatch ath9k supports its own set of virtual wiphys, and it uses the mac80211 idle notifications to know when a device needs to be idle or not. We recently changed ath9k to force idle on driver stop() and on resume but forgot to take into account ath9k's own virtual wiphy idle states. These are used internally by ath9k to check if the device's radio should be powered down on each idle call. Without this change its possible that the device could have been forced off but the virtual wiphy idle was left on. Cc: stable@kernel.org Cc: Paul Stewart Cc: Amod Bodas Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit d584747be838775cebbf5937c20b24da6899e3e8 Author: Rajkumar Manoharan Date: Mon Dec 20 14:39:51 2010 +0530 ath9k: Fix warnings on card removal The recently added warning message on power change failure is not needed on device removal. ath: Failed to wakeup in 500us ------------[ cut here ]------------ WARNING: at drivers/net/wireless/ath/ath9k/hw.c:1618 ath9k_hw_setpower+0x61f/0x630 [ath9k_hw]() Hardware name: 64756D6 Pid: 540, comm: kworker/u:3 Not tainted 2.6.37-rc6-wl #37 Call Trace: [] warn_slowpath_common+0x7a/0xb0 [] ? ath9k_iowrite32+0x0/0x90 [ath9k] [] warn_slowpath_null+0x15/0x20 [] ath9k_hw_setpower+0x61f/0x630 [ath9k_hw] [] ath9k_ps_wakeup+0x85/0xd0 [ath9k] [] ath9k_configure_filter+0x25/0x80 [ath9k] [] ieee80211_configure_filter+0x133/0x190 [mac80211] [] ieee80211_do_stop+0x132/0x540 [mac80211] [] ? _raw_spin_unlock_bh+0x1f/0x30 [] ? dev_deactivate+0x1c3/0x1e0 [] ieee80211_stop+0x15/0x20 [mac80211] [] __dev_close+0x56/0x90 Signed-off-by: Rajkumar Manoharan Signed-off-by: John W. Linville commit 97dcec5715a381362c88d1542e52c63147764d3c Author: Sujith Manoharan Date: Mon Dec 20 08:02:42 2010 +0530 ath9k_htc: Fix warning on device removal The commit "ath9k_hw: warn if we cannot change the power to the chip" introduced a new warning to indicate chip powerup failures, but this is not required for devices that have been removed. Handle USB device removal properly by checking for unplugged status. For PCI devices, this warning will still be seen when the card is pulled out, not sure how to check for card removal. Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit 2af10844eb6ed104f9505bf3a7ba3ceb02264f31 Merge: 73bc7d315f56e260071bdb5f15e25b53bddc1402 90a8a73c06cc32b609a880d48449d7083327e11a Author: Greg Kroah-Hartman Date: Wed Dec 22 12:25:34 2010 -0800 USB: Merge 2.6.37-rc5 into usb-next This is to resolve the conflict in the file, drivers/usb/gadget/composite.c that was due to a revert in Linus's tree needed for the 2.6.37 release. Reported-by: Stephen Rothwell Signed-off-by: Greg Kroah-Hartman commit 28bd2c341120db346f30b3ba11b4eac06b2cc981 Author: Sekhar Nori Date: Mon Dec 20 21:31:34 2010 +0530 davinci: am18x/da850/omap-l138 evm: add support for higher speed grades Apart from the regular AM18x/DA850/OMAP-L138 SoC operating at 300MHz, these SoCs have variants that can operate at a maximum of 456MHz. Variants at 408Mhz and 375 Mhz are available as well. Not all silicon is qualified to run at higher speeds and unfortunately the maximum speed the chip can support can only be determined from the label on the package (not software readable). The EVM hardware for all these variants is the same (except for the actual SoC populated). U-Boot on the EVM sets up ATAG_REVISION to inform the OS regarding the speed grade supported by the silicon. We use this information to pass on the speed grade information to the SoC code. Signed-off-by: Sekhar Nori Signed-off-by: Kevin Hilman commit 39e145500458bd68d1d33adfa256886900b1597b Author: Sekhar Nori Date: Mon Dec 20 21:31:33 2010 +0530 davinci: am18x/da850/omap-l138: add support for higher speed grades AM18x/DA850/OMAP-L138 SoCs have variants that can operate at a maximum of 456 MHz at 1.3V operating point. Also the 1.2V operating point has a variant that can support a maximum of 375 MHz. This patch adds three new OPPs (456 MHz, 408 MHz and 372 MHz) to the list of DA850 OPPs. Not all silicon is qualified to run at higher speeds and unfortunately the maximum speed the chip can support can only be determined from the label on the package (not software readable). Because of this, we depend on the maximum speed grade information to be provided to us in some board specific way. The board informs the maximum speed grade information by setting the da850_max_speed variable. Signed-off-by: Sekhar Nori Signed-off-by: Kevin Hilman commit 9cc3049911d0166d54247cf2471802eb5293c66c Author: Ben Gardiner Date: Thu Dec 9 16:51:07 2010 -0500 da850-evm: KEYBOARD_GPIO_POLLED Kconfig conditional Use the mach-davinci/Kconfig to enable gpio-keys-polled as default when da850-evm machine is enabled. Signed-off-by: Ben Gardiner CC: Kevin Hilman CC: "Nori, Sekhar" CC: Gabor Juhos Signed-off-by: Kevin Hilman commit 70b3093963feefbf122672f9fe5f916db5338ca0 Author: Ben Gardiner Date: Thu Dec 9 16:51:06 2010 -0500 da850-evm: add baseboard GPIO expander buttons, switches and LEDs This patch adds a pca953x platform device for the tca6416 found on the evm baseboard. The tca6416 is a GPIO expander, also found on the UI board at a separate I2C address. The pins of the baseboard IO expander are connected to software reset, deep sleep enable, test points, a push button, DIP switches and LEDs. Add support for the push button, DIP switches and LEDs and test points (as free GPIOs). The reset and deep sleep enable connections are reserved by the setup routine so that userspace can't toggle those lines. The existing tca6416-keypad driver was not employed because there was no apararent way to register the LEDs connected to gpio's on the tca6416 while simultaneously registering the tca6416-keypad instance. Signed-off-by: Ben Gardiner Reviewed-by: Chris Cordahi CC: Govindarajan, Sriramakrishnan Reviewed-by: Sekhar Nori Reviewed-by: Dmitry Torokhov CC: Gabor Juhos Signed-off-by: Kevin Hilman commit 53c2897d36153830d4d34324bedf23a641602cc9 Author: Ben Gardiner Date: Thu Dec 9 16:51:05 2010 -0500 da850-evm: extract defines for SEL{A,B,C} pins in UI expander The setup and teardown methods of the UI expander reference the SEL_{A,B,C} pins by 'magic number' in each function. This uses the common enum for their offsets in the expander setup and teardown functions. Signed-off-by: Ben Gardiner Reviewed-by: Chris Cordahi Reviewed-by: Sekhar Nori Signed-off-by: Sekhar Nori CC: Victor Rodriguez Signed-off-by: Kevin Hilman commit 75929f5e2bcba7cc328fcf9a3d7ba7076946ac3a Author: Ben Gardiner Date: Thu Dec 9 16:51:04 2010 -0500 da850-evm: add UI Expander pushbuttons This patch adds EV_KEYs for each of the 8 pushbuttons on the UI board via a gpio-key device. The expander is a tca6416; it controls the SEL_{A,B,C} lines which enable and disable the peripherals found on the UI board in addition to the 8 pushbuttons mentioned above. The reason the existing tca6416-keypad driver is not employed is because there was no aparent way to keep the gpio lines used as SEL_{A,B,C} registered while simultaneously registering the pushbuttons as a tca6416-keypad instance. Some experimentation with the polling interval was performed; we were searching for the largest polling interval that did not affect the feel of the responsiveness of the buttons. It is very subjective but 200ms seems to be a good value that accepts firm pushes but rejects very light ones. The key values assigned to the buttons were arbitrarily chosen to be F1-F8. Signed-off-by: Ben Gardiner Reviewed-by: Chris Cordahi CC: Govindarajan, Sriramakrishnan Reviewed-by: Sekhar Nori Signed-off-by: Sekhar Nori CC: Kevin Hilman CC: Gabor Juhos Signed-off-by: Kevin Hilman commit ee09b3c1cff0335137dc1b146488e4352f640f13 Author: Eric Dumazet Date: Wed Dec 22 11:39:59 2010 -0800 sfq: fix sfq class stats handling sfq_walk() runs without qdisc lock. By the time it selects a non empty hash slot and sfq_dump_class_stats() is run (with lock held), slot might have been freed : We then access q->slots[SFQ_EMPTY_SLOT], out of bounds, and crash in slot_queue_walk() On previous kernels, bug is here but out of bounds qs[SFQ_DEPTH] and allot[SFQ_DEPTH] are located in struct sfq_sched_data, so no illegal memory access happens, only possibly wrong data reported to user. Also, slot_dequeue_tail() should make sure slot skb chain is correctly terminated, or sfq_dump_class_stats() can access freed skbs. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 65a6538a56d4c7ae8465f2a8420ddc65877b6779 Author: Luciano Coelho Date: Tue Dec 21 16:02:17 2010 +0200 mac80211: check for CONFIG_MAC80211_LEDS in the tpt_led_trigger declaration If CONFIG_MAC80211_LEDS is not set, ieee80211_i.h was failing to compile, because struct led_trigger is only declared when CONFIG_LEDS_TRIGGERS is set. This patch adds ifdefs around the tpt_led_trigger declaration in ieee80211_i.h to avoid the problem. Signed-off-by: Luciano Coelho Acked-by: Johannes Berg Signed-off-by: John W. Linville commit 67408c8c7b9daf28b50e33be3541334c07d15789 Author: Johannes Berg Date: Tue Nov 30 08:59:23 2010 +0100 mac80211: selective throughput LED trigger active The throughput LED trigger was always active when the radio was enabled. In most cases that's likely the desired behaviour, but iwlwifi requires it to be only active when one of the virtual interfaces is actually "connected" in some way. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit e1e5406854378dfada3f33c7192b012083a5b8e0 Author: Johannes Berg Date: Tue Nov 30 08:58:45 2010 +0100 mac80211: add throughput based LED blink trigger iwlwifi and other drivers like to blink their LED based on throughput. Implement this generically in mac80211, based on a throughput table the driver specifies. That way, drivers can set the blink frequencies depending on their desired behaviour and max throughput. All the drivers need to do is provide an LED class device, best with blink hardware offload. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit fe67c913f1ec2a01aaa9176c80ef36eaf87d705d Author: Johannes Berg Date: Sat Nov 27 20:02:59 2010 +0100 mac80211: make LED trigger names available early The throughput trigger will require doing LED classdev/trigger handling before register_hw(), so drivers should have access to the trigger names before it. If trigger registration fails, this will still make the trigger name available, but that's not a big problem since the default trigger will the simply not be found. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 808601b75804475c9022f6375e76b7c62c99a10a Merge: c10abbb26513f4ccff89c4d80912cb4d36fcd3e8 f17f9726c27c3921e00a5750e85070e6dd7e1ff7 Author: Tony Lindgren Date: Wed Dec 22 11:32:24 2010 -0800 Merge branch 'integration-2.6.38-for-tony' of git://git.pwsan.com/linux-2.6 into omap-for-linus commit c10abbb26513f4ccff89c4d80912cb4d36fcd3e8 Merge: 4931445b94f49672028b81ace9d4eee8ddf19ab2 da1f026b532ce944d74461497dc6d8c16456466e Author: Tony Lindgren Date: Wed Dec 22 11:30:12 2010 -0800 Merge branches 'devel-gpmc' and 'devel-misc' into omap-for-linus commit 63e35cd9bd4c8ae085c8b9a70554595b529c4100 Merge: 503b1a529a6b62b31904bab4699752c523cf76b2 3d986b25b5faa50ba6afd94f60f270b6c3061e5e Author: John W. Linville Date: Wed Dec 22 14:27:21 2010 -0500 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem Conflicts: drivers/net/wireless/iwlwifi/iwl-1000.c drivers/net/wireless/iwlwifi/iwl-6000.c drivers/net/wireless/iwlwifi/iwl-core.h commit da1f026b532ce944d74461497dc6d8c16456466e Author: Janusz Krzysztofik Date: Mon Dec 20 21:09:22 2010 +0000 Keyboard: omap-keypad: use matrix_keypad.h Most keypad drivers make use of the defined macros, structures and inline functions. Convert omap-keypad driver to use those as well, as suggested by a compile time warning, hardcoded into the OMAP . Created against linux-2.6.37-rc5. Tested on Amstrad Delta. Compile tested with omap1_defconfig and omap2plus_defconfig shrinked to board-h4. Signed-off-by: Janusz Krzysztofik Reviewed-by: Aaro Koskinen Acked-by: Dmitry Torokhov Signed-off-by: Tony Lindgren commit 4e012e5f246d4da924b14d453452fd0838d4e03b Author: Arno Steffen Date: Wed Dec 22 18:14:36 2010 +0000 OMAP3: fix typo in OMAP3_IVA_MASK OMAP3_IVA_MASK should use OMAP3_IVA_SHIFT instead of OMAP3_SGX_SHIFT Signed-off-by: Arno Steffen Signed-off-by: Tony Lindgren commit 6d38c4b4f1df70f953633c27ebcdc2712e9039bc Author: Jarkko Nikula Date: Tue Dec 21 17:46:01 2010 +0000 omap: rx51: Remove tvout code that plays with gpio 40 Commit 60d24ee "Added video data to support tvout on rx51" added code that tries to assign gpio 40 as OMAP DSS reset_gpio for tvout. This is wrong since this gpio has nothing to do with OMAP DSS but it is used to control one switch that selects is the audio jack connected to tvout or audio circuitry. This switch is already supported by the RX51 ASoC driver so there is no need to control it elsewhere. Switch is contolled with ALSA control 'Jack Function' and tvout can be selected with following example: amixer -D hw:0 set 'Jack Function' 'TV-OUT' Signed-off-by: Jarkko Nikula Cc: Srikar Acked-by: Tomi Valkeinen Signed-off-by: Tony Lindgren commit 31bbb4f035c13a73d1ebc2626663971723cbd28f Author: Jarkko Nikula Date: Tue Dec 21 17:25:35 2010 +0000 omap: rx51: Add vdda_dac supply for tvout Commmit 60d24ee "Added video data to support tvout on rx51" broke the DSS on RX51/N900 since it added DSS VENC support but a patch adding needed supply is missing from tree and no framebuffers are initialized. This patch is basically cleaned up version of original one: http://marc.info/?l=linux-omap&m=129070041402418&w=2 Signed-off-by: Jarkko Nikula Cc: Srikar Cc: Mark Brown Acked-by: Tomi Valkeinen Signed-off-by: Tony Lindgren commit b5b9945b2b139ca922b49062053f34486ca64cca Author: Jarkko Nikula Date: Tue Dec 21 17:25:34 2010 +0000 omap: rx51: Cleanup vdds_sdi supply construction It is much more cleaner to use REGULATOR_SUPPLY macro and a device name instead of having a reference to rx51_display_device.dev with #if defined() guards. Signed-off-by: Jarkko Nikula Acked-by: Tomi Valkeinen Signed-off-by: Tony Lindgren commit 3cfeb0c33f5cbcc6dde371392877ef3101b8f805 Author: John W. Linville Date: Mon Dec 20 15:16:53 2010 -0500 rtl818x: move rtl8180 and rtl8187 to separate subdirectories These drivers share one header file, but nothing else. Worse, both drivers use the rtl8225 part with different register settings. The results has been some ugly naming -- let's simplify that. Signed-off-by: John W. Linville Acked-by: Hin-Tak Leung Acked-by: Larry Finger Acked-by: Herton Ronaldo Krzesinski commit b51aff057c9d0ef6c529dc25fd9f775faf7b6c63 Author: Johannes Berg Date: Wed Dec 22 10:15:07 2010 +0100 mac80211: fix mesh forwarding Under memory pressure, the mac80211 mesh code may helpfully print a message that it failed to clone a mesh frame and then will proceed to crash trying to use it anyway. Fix that. Cc: stable@kernel.org [2.6.27+] Signed-off-by: Johannes Berg Acked-by: Javier Cardona Signed-off-by: John W. Linville commit 68229689b6dc950bea4b81dd60563884f4a7e1c5 Author: Oliver Neukum Date: Wed Dec 22 15:33:40 2010 +0100 HID: usbhid: base runtime PM on modern API This patch doesn't alter functionality, but removes a dedicated kernel thread. Signed-off-by: Oliver Neukum Tested-by: Maulik Mankad Signed-off-by: Jiri Kosina commit f17f9726c27c3921e00a5750e85070e6dd7e1ff7 Author: Jon Hunter Date: Thu Dec 9 23:13:40 2010 +0100 OMAP4: clock data: Add missing fixed divisors The following OMAP4 clocks have the following fixed divisors that determine the frequency at which these clocks operate. These dividers are defined by the PRCM specification and without these dividers the rates of the below clocks are calculated incorrectly. This may cause internal peripherals using these clocks to operate at the wrong frequency. - abe_24m_fclk (freq = divided-by-8) - ddrphy_ck (freq = parent divided-by-2) - dll_clk_div_ck (freq = parent divided-by-2) - per_hs_clk_div_ck (freq = parent divided-by-2) - usb_hs_clk_div_ck (freq = parent divided-by-3) - func_12m_fclk (freq = parent divided-by-16) - func_24m_clk (freq = parent divided-by-4) - func_24mc_fclk (freq = parent divided-by-8) - func_48mc_fclk (freq = divided-by-4) - lp_clk_div_ck (freq = divided-by-16) - per_abe_24m_fclk (freq = divided-by-4) Signed-off-by: Jon Hunter Signed-off-by: Benoit Cousson Signed-off-by: Paul Walmsley Cc: Kevin Hilman Cc: Rajendra Nayak commit 9bf8391846db849509a6aa6f1f0659843ca30662 Author: Vishwanath BS Date: Tue Oct 5 19:35:34 2010 +0530 OMAP3: SDRC: Add comments on Errata i520 for Global SW reset This patch adds comments on precaution to be taken if Global Warm reset is used as the means to trigger system reset. Signed-off-by: Vishwanath BS [paul@pwsan.com: fixed typos, one mentioned by Sanjeev] Signed-off-by: Paul Walmsley Cc: Sanjeev Premi commit 9fb67204d7a00a6444bc121f221527034613d338 Merge: 8c1df4002aa425973d7d25ffa56c042acd953bed 287050d390264402e11bea8b811859e42e8faa29 Author: Ingo Molnar Date: Wed Dec 22 12:46:12 2010 +0100 Merge branch 'tip/perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace into perf/core commit bcbea798f8f1492052c23ceb4fbc2a96013a3865 Author: Tejun Heo Date: Wed Dec 22 14:19:14 2010 +0100 percpu: print out alloc information with KERN_DEBUG instead of KERN_INFO Now that percpu allocator is mostly stable, there is no reason to print alloc information with KERN_INFO and clutter the boot messages. Switch it to KERN_DEBUG. Signed-off-by: Tejun Heo Cc: Ingo Molnar Cc: Mike Travis commit d8850ba425d9823d3184bd52f065899dac4689f9 Author: Jack Steiner Date: Tue Nov 30 13:55:40 2010 -0600 x86, UV: Fix the effect of extra bits in the hub nodeid register UV systems can be partitioned into multiple independent SSIs. Large partitioned systems may have extra bits in the node_id register. These bits are used when the total memory on all SSIs exceeds 16TB. These extra bits need to be ignored when calculating x2apic_extra_bits. Signed-off-by: Jack Steiner LKML-Reference: <20101130195926.972776133@sgi.com> Signed-off-by: Ingo Molnar commit e681041388e61ecd7f99dba66b3c1db11a564d92 Author: Jack Steiner Date: Tue Nov 30 13:55:39 2010 -0600 x86, UV: Add common uv_early_read_mmr() function for reading MMRs Early in boot, reading MMRs from the UV hub controller require calls to early_ioremap()/early_iounmap(). Rather than duplicating code, add a common function to do the map/read/unmap. Signed-off-by: Jack Steiner LKML-Reference: <20101130195926.834804371@sgi.com> Signed-off-by: Ingo Molnar commit 36bb94ba36f332de767cfaa3af6a5136435a3a9c Author: Russell King Date: Tue Nov 16 08:40:36 2010 +0000 ARM: pgtable: provide RDONLY page table bit rather than WRITE bit Signed-off-by: Russell King commit 9522d7e4cb5e0858122fc55d33a2c07728f0b10d Author: Russell King Date: Tue Nov 16 00:23:31 2010 +0000 ARM: pgtable: invert L_PTE_EXEC to L_PTE_XN The hardware page tables use an XN bit 'execute never'. Historically, we've had a Linux 'execute allow' bit, in the positive sense. Get rid of this artifact as future hardware will continue to have the XN sense. Signed-off-by: Russell King commit e926f4495e202500a6265987277fab217e235f08 Author: Russell King Date: Sun Nov 21 11:55:37 2010 +0000 ARM: pgtable: remove FIRST_USER_PGD_NR FIRST_USER_PGD_NR is now unnecessary, as this has been replaced by FIRST_USER_ADDRESS except in the architecture code. Fix up the last usage of FIRST_USER_PGD_NR, and remove the definition. Signed-off-by: Russell King commit af3813d6a5bf8d0f71b23d3ce458fa5f9916c6b7 Author: Russell King Date: Sun Nov 21 11:48:16 2010 +0000 ARM: pgtable: use conventional page table code for identity mappings Remove some knowledge of our 2-level page table layout from the identity mapping code - we assume that a step size of PGDIR_SIZE will allow us to step over all entries. While this is true today, it won't be true in the near future. Signed-off-by: Russell King commit 614dd0585f376a25c638abbed9c5fbd21d7baece Author: Russell King Date: Sun Nov 21 11:41:57 2010 +0000 ARM: pgtable: collect up identity mapping functions We have two places where we create identity mappings - one when we bring secondary CPUs online, and one where we setup some mappings for soft- reboot. Combine these two into a single implementation. Also collect the identity mapping deletion function. Signed-off-by: Russell King commit 26bbf0b57a0848932f725076bcb1245ca696e8d3 Author: Russell King Date: Sun Nov 21 11:30:36 2010 +0000 ARM: pgtable: remove L2 cache flushes for SMP page table bring-up The MMU is always configured to read page tables from the L2 cache so there's little point flushing them out of the L2 cache back to RAM. Remove these flushes. Signed-off-by: Russell King commit d30e45eeabefadc6039d7f876a59e5f5f6cb11c6 Author: Russell King Date: Tue Nov 16 00:16:01 2010 +0000 ARM: pgtable: switch order of Linux vs hardware page tables This switches the ordering of the Linux vs hardware page tables in each page, thereby eliminating some of the arithmetic in the page table walks. As we now place the Linux page table at the beginning of the page, we can deal with the offset in the pgt by simply masking it away, along with the other control bits. This also makes the arithmetic all be positive, rather than a mixture. Signed-off-by: Russell King commit b93cef556162b0f33399bfe5f307c54f51554e09 Author: Mark Brown Date: Thu Dec 2 16:25:43 2010 +0000 mfd: Support additional parent IDs for wm831x Some newer device revisions add a second parent ID. Support this in the device validity checks done at startup. Signed-off-by: Mark Brown Cc: stable@kernel.org Signed-off-by: Samuel Ortiz commit 88aec4f7b67b5889ba5b4beac2d2c1400451c318 Author: Mattias Wallin Date: Thu Dec 2 15:06:49 2010 +0100 mfd: Fix ab8500-core interrupt ffs bit bug We want to find the first set bit on value, not status. Signed-off-by: Mattias Wallin Signed-off-by: Samuel Ortiz commit bd7c72ed18d719c1fb0fdf6ff9042d8ab78fdf71 Author: Mark Brown Date: Wed Nov 24 18:01:39 2010 +0000 mfd: Supply IRQ base for WM832x devices Without this the IRQ base will not be correctly configured for the subdevices. Signed-off-by: Mark Brown Cc: stable@kernel.org Signed-off-by: Samuel Ortiz commit 3b3c1f24e96c411a95daabb6af9e09c5381f713b Author: Florian Fainelli Date: Fri Nov 26 10:39:55 2010 +0100 watchdog: Fix null pointer dereference while accessing rdc321x platform_data rdc321x-wdt currently fetches its driver specific data by using the platform_device->platform_data pointer, this is wrong because the mfd device which registers our platform_device has been added using mfd_add_device() which sets the platform_device->driver_data pointer instead. Signed-off-by: Florian Fainelli CC: stable@kernel.org Signed-off-by: Samuel Ortiz commit fa6469cb5b2d16703464c344b943e2c025cb7858 Author: Florian Fainelli Date: Fri Nov 26 10:39:54 2010 +0100 gpio: Fix null pointer dereference while accessing rdc321x platform_data rdc321x-gpio currently fetches its driver specific data by using the platform_device->platform_data pointer, this is wrong because the mfd device which registers our platform_device has been added using mfd_add_device() which sets the platform_device->driver_data pointer instead. Signed-off-by: Florian Fainelli CC: stable@kernel.org Signed-off-by: Samuel Ortiz commit 8c1df4002aa425973d7d25ffa56c042acd953bed Merge: 6c529a266bdc590a870ee2d2092ff6527eff427b 21dd9ae5a4e9f717f3957ec934dd3158129436b8 Author: Ingo Molnar Date: Wed Dec 22 11:54:50 2010 +0100 Merge branch 'perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux-2.6 into perf/core commit 6c529a266bdc590a870ee2d2092ff6527eff427b Merge: 7639dae0ca11038286bbbcda05f2bef601c1eb8d 90a8a73c06cc32b609a880d48449d7083327e11a Author: Ingo Molnar Date: Wed Dec 22 11:53:20 2010 +0100 Merge commit 'v2.6.37-rc7' into perf/core Merge reason: Pick up the latest -rc. Signed-off-by: Ingo Molnar commit 7d8f98769e7f4bc29c38789daeb416c6a7d7c241 Author: Tao Ma Date: Wed Dec 22 17:50:30 2010 +0800 ocfs2: Fix system inodes cache overflow. When we store system inodes cache in ocfs2_super, we use a array for global system inodes. But unfortunately, the range is calculated wrongly which makes it overflow and pollute ocfs2_super->local_system_inodes. This patch fix it by setting the range properly. The corresponding bug is ossbug1303. http://oss.oracle.com/bugzilla/show_bug.cgi?id=1303 Cc: stable@kernel.org Signed-off-by: Tao Ma Signed-off-by: Joel Becker commit 2ce494a3dac331fdbb2590e5fa0598956dd21b8b Merge: 90a8a73c06cc32b609a880d48449d7083327e11a 3b4694de3596edac0159524b15a4a06945875421 Author: Ingo Molnar Date: Wed Dec 22 11:31:03 2010 +0100 Merge branch 'perf/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux-2.6 into perf/urgent commit 4f56ce929cab45a3a6e1a81700da52bb9bdbfc0f Author: Henrik Rydberg Date: Sat Dec 18 15:42:30 2010 +0100 Input: synaptics - ignore bogus mt packet In multitouch mode, at least one device (fw: 7.4 id: 0x1c0b1) sometimes sends a final main packet with x == 1. Since the normal values are above 1472, this is clearly bogus. At the same time, a two-finger touch is signaled, even though only one finger was on the pad to begin with. This patch ignores the packet altogether, removing the problem. Acked-by: Chris Bagwell Acked-by: Chase Douglas Acked-by: Dmitry Torokhov Signed-off-by: Henrik Rydberg commit 4f32e9b1f812fd6c00cc85a127583fefbdedaedc Author: Yong Zhang Date: Wed Dec 22 10:27:53 2010 +0100 kthread_work: make lockdep happy spinlock in kthread_worker and wait_queue_head in kthread_work both should be lockdep sensible, so change the interface to make it suiltable for CONFIG_LOCKDEP. tj: comment update Reported-by: Nicolas Signed-off-by: Yong Zhang Signed-off-by: Andy Walls Tested-by: Andy Walls Cc: Tejun Heo Cc: Andrew Morton Signed-off-by: Tejun Heo commit 11c8ea81cc639c2ea56f94a9cdaa6242ff13a3af Author: Linus Walleij Date: Fri Dec 17 21:16:23 2010 +0100 ux500: rename modem IRQ and MBOX files Suffix the U5500 modem IRQ and MBOX files with *-db5500* so that we clearly know the SoC they belong to, in line with the rest of the files in mach-ux500. Cc: Stefan Nilsson Cc: Martin Persson Signed-off-by: Linus Walleij commit 6bf45a1018ff3cda8b6ef2fa7e023a023bc01dc8 Author: Takashi YOSHII Date: Wed Dec 22 06:35:30 2010 +0000 ARM: mach-shmobile: Add eMMC support through MMCIF on AG5EVM Adding platform resources, PFC setting and release reset pin for eMMC on ag5evm. [damm@opensource.se: Add MSTP code for MMCIF] Signed-off-by: Takashi YOSHII Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 5d7814728d80ee56d02e99cc2ab0850c8625a047 Author: Takashi YOSHII Date: Wed Dec 22 06:30:19 2010 +0000 ARM: mach-shmobile: Use pullups for AG5EVM KEYSC pins Follow up to pfc-sh73a0.c's pull-up support. Change GPIO_FN_KEYINx to GPIO_FN_KEYINx_PU. Signed-off-by: Takashi YOSHII Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit a0794fd019820d3d5e9d73ffd61b5bbcac818f18 Author: Takashi YOSHII Date: Wed Dec 22 06:26:06 2010 +0000 ARM: mach-shmobile: sh73a0 GPIO pullup improvement On SH-Mobile, Pull UP/Downs can be controlled independently from Function selectors (by lower nibble of PFCR). It means people may want to use GPIO_FN_xxx_PU/PD in addition to GPIO_IN_PU/PD which is currently supported. This patch adds pull-up version for some input signals on KEYSC, MMC, FSIA as well as SDHI1. Signed-off-by: Takashi YOSHII Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 019c4ae313ccf5d253be32197e002c626d8bd678 Author: Magnus Damm Date: Wed Dec 22 06:14:05 2010 +0000 ARM: mach-shmobile: sh73a0 CPGA fix for KEYSC Fix the sh73a0 KEYSC clock control by adding MSTP403 to mstp_clks[]. Use KEYSC instead of KEYSC0 in comments. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 8c1ac08b38af0c477ae32df9f4625b7dbddea1ea Author: Guennadi Liakhovetski Date: Tue Dec 21 11:46:35 2010 +0100 fbdev: sh-mobile: retrieve and propagate display sizes from EDID Monitor EDID contains information about physical display sizes. Retrieve it and propagate to the framebuffer driver. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit e0b9fb26266778cc749365b98041c5b7ef6f10f8 Author: Guennadi Liakhovetski Date: Tue Dec 21 11:46:26 2010 +0100 fbdev: sh-mobile: restore display size configuration An earlier patch replaced open-coded video-mode configuration from platform data by a call to fb_videomode_to_var(), thereby setting ofdisplay sizes have been accidentally lost. Restore them. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit 752a4a95e3c96a8e8d3405b16d292f13e8c7856b Merge: bc3f67a3e1b20756d4bfa5886a6b8fd0c068e6a4 90a8a73c06cc32b609a880d48449d7083327e11a Author: Grant Likely Date: Wed Dec 22 00:10:01 2010 -0700 Merge commit 'v2.6.37-rc7' into spi/next commit 60a0e5d972bad6927b63aede7a1cfe758b8251ad Author: Santosh Shilimkar Date: Tue Dec 21 22:37:29 2010 -0700 OMAP4: clock data: Keep L3INSTR clock domain modulemode under HW control L3INSTR clock domain is read only register and its reset value is HW_AUTO. The modules withing this clock domain needs to be kept under hardware control. MODULEMODE: - 0x0: Module is disable by software. Any INTRCONN access to module results in an error, except if resulting from a module wakeup (asynchronous wakeup). - 0x1: Module is managed automatically by hardware according to clock domain transition. A clock domain sleep transition put module into idle. A wakeup domain transition put it back into function. If CLKTRCTRL=3, any INTRCONN access to module is always granted. Module clocks may be gated according to the clock domain state. This patch keeps CM_L3INSTR_L3_3_CLKCTRL, CM_L3INSTR_L3_INSTR_CLKCTRL and CM_L3INSTR_INTRCONN_WP1_CLKCTRL module mode under hardware control by using ENABLE_ON_INIT flag. Without this the OMAP4 device OFF mode SAR restore phase aborts during interconnect register restore phase. This can be also handled by doing explicit a clock enable and disable in the low power code since there is no direct module associated with it. But that seems not necessary since the clock domain is under HW control. Signed-off-by: Rajendra Nayak Signed-off-by: Santosh Shilimkar Acked-by: Benoit Cousson Signed-off-by: Paul Walmsley commit 80f093657371b3ebb1d05354a698088bf7b21c15 Author: Santosh Shilimkar Date: Tue Dec 21 22:37:28 2010 -0700 OMAP4: powerdomain: Remove L3INIT_PD OFF state On OMAP4, there is an issue when L3INIT transitions to OFF mode without device OFF. The SAR restore mechanism will not get triggered without wakeup from device OFF and hence the USB host and USB TLL context will not be restored. Hardware team recommended to remove the OFF state support for L3INIT_PD since there is no power impact. It will be removed on next OMAP revision (OMAP4440 and beyond). Hence this patch removed the OFF state from L3INIT_PD. The deepest state supported on L3INIT_PD is OSWR just like CORE_PD and PER_PD Signed-off-by: Santosh Shilimkar [b-cousson@ti.com: update the changelog with next OMAP info] Signed-off-by: Benoit Cousson Signed-off-by: Paul Walmsley commit 474e7aeb6a5ac78071cc9b841889fcf026524e97 Author: Rajendra Nayak Date: Tue Dec 21 22:37:28 2010 -0700 OMAP4: powerdomain: l4per pwrdm does not support OFF The l4per power domain in ES2.0 does support only RET and ON states. The previous ES1.0 HW database was wrong and thus fixed on ES2. Change the pwrsts field to reflect that. Signed-off-by: Rajendra Nayak Acked-by: Benoit Cousson Signed-off-by: Paul Walmsley commit 33de32b3ebcb4f7f77f10a1b42493352f00c6a30 Author: Rajendra Nayak Date: Tue Dec 21 22:37:28 2010 -0700 OMAP4: PM: Do not assume clkdm supports hw transitions omap_set_pwrdm_state today assumes a clkdm supports hw_auto transitions and hence leaves some which do not support this in sw wkup state preventing low power transitions. Signed-off-by: Rajendra Nayak Signed-off-by: Santosh Shilimkar Acked-by: Benoit Cousson Acked-by: Kevin Hilman Signed-off-by: Paul Walmsley commit 71a488dbcc4acbc9b845491a368b30ecd7484089 Author: Rajendra Nayak Date: Tue Dec 21 22:37:27 2010 -0700 OMAP4: PM: Use the low-power state change feature on OMAP4 For pwrdm's which support LOWPOWERSTATECHANGE, do not try waking up the domain to put it back to deeper sleep state. Signed-off-by: Rajendra Nayak Signed-off-by: Santosh Shilimkar Acked-by: Benoit Cousson Cc: Kevin Hilman Acked-by: Kevin Hilman Signed-off-by: Paul Walmsley commit 73bc7d315f56e260071bdb5f15e25b53bddc1402 Author: Melchior FRANZ Date: Wed Dec 22 02:04:33 2010 +0100 USB: add support for Dream Cheeky DL100B Webmail Notifier (1d34:0004) So far the USBLED driver only supports Delcom's "USB Visual Signal Indicator" (http://www.delcomproducts.com/products_USBLMP.asp). The driver generates virtual files "red", "green", and "blue" under the device's /sys/ directory, where color values can be read from and written to. This patch adds support for Dream Cheeky's "DL100B Webmail Notifier" (http://www.dreamcheeky.com/webmail-notifier -- available from several shops, such as http://www.conrad.at/ce/de/product/777048/USB-WEBMAIL). This device isn't as pretty as Delcom's, but it's *far* cheaper, and its 3 LEDs can be set in 32 brightness steps each. The grey envelope contour can easily be removed, leaving a rather neutral white box (with a few small holes), which is useful for generic signalling purposes. Of course, the small circuit board can easily be put into a prettier case. The DL100B device pretends to be a HID, but the HID descriptor shows that it's not overly useful as such (see below). The patch therefore removes the "HID-ness" (hid-core.c, hid-ids.h), and adds the necessary commands to usbled.c. The protocol info comes from the developer's manual that Dream Cheeky kindly provided (815DeveloperManual.pdf). HID descriptor: 0: 05 01 Usage Page 'Generic Desktop Controls' 2: 09 10 Usage 'Reserved' 4: a1 01 Collection 'Application (mouse, keyboard)' 6: 05 00 Usage Page 'Undefined' 8: 19 10 Usage Minimum = 16 10: 29 11 Usage Maximum = 17 12: 15 00 Logical Minimum = 0 14: 25 0f Logical Maximum = 15 16: 75 08 Report Size = 8 18: 95 08 Report Count = 8 20: 91 02 Output data *var abs lin pref-state null-pos non-vol bit-field 22: 19 10 Usage Minimum = 16 24: 29 11 Usage Maximum = 17 26: 15 00 Logical Minimum = 0 28: 25 0f Logical Maximum = 15 30: 75 08 Report Size = 8 32: 95 08 Report Count = 8 34: 81 00 Input data array abs lin pref-state null-pos non-vol bit-field 36: c0 End Collection Signed-off-by: Melchior FRANZ Signed-off-by: Greg Kroah-Hartman commit 5010f3db952b19cd353d1e90838818922d995697 Author: Magnus Damm Date: Tue Dec 21 08:40:59 2010 +0000 ARM: mach-shmobile: sh73a0 TMU support Add support for 2 TMU timer channels on sh73a0. One timer channel is used for clocksource and the other is used for clockevents. All channels in the same TMU block share MSTP bit as usual. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 5f53a56af50c002cdb091914aa98df80b1b28ec8 Author: Magnus Damm Date: Tue Dec 21 08:37:32 2010 +0000 ARM: mach-shmobile: sh73a0 INTCS support Add INTCS support for the sh73a0 processor. The interrupts on the sh73a0 processor are managed through controllers such as GIC, INTCS and INTCA. The ARM cores use the GIC as primary interrupt controller and the INTCS and INTCA are hanging off the GIC as cascaded interrupt controllers. Peripherals connected both to the GIC and the INTC controllers should if possible only use the GIC. If no GIC connection is available then INTCS and INTCA may be used instead. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 354e4157d9e1529cf71c7041a22fde2fd113642b Author: Kuninori Morimoto Date: Tue Dec 21 11:20:45 2010 +0000 ARM: mach-shmobile: mackerel: fixup default memory size Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit 6081dc348f122cdb76093b2fc6cf5742c968cb69 Author: Kevin Hilman Date: Tue Dec 21 21:31:55 2010 -0700 OMAP: PM noop: implement context loss count for non-omap_devices For devices which have not (yet) been converted to use omap_device, implement the context loss counter using the "brutal method" as originally proposed by Paul Walmsley[1]. The dummy context loss counter is incremented every time it is checked, but only when off-mode is enabled. When off-mode is disabled, the dummy counter stops incrementing. Tested on 36xx/Zoom3 using MMC driver, which is currently the only in-tree user of this API. This patch should be reverted after all devices are converted to using omap_device. [1] http://marc.info/?l=linux-omap&m=129176260000626&w=2 Signed-off-by: Kevin Hilman [paul@pwsan.com: fixed compile warning; fixed to compile on OMAP1] Signed-off-by: Paul Walmsley commit c80705aa7074045e7431ed2ebeb0f7d5773615ab Author: Kevin Hilman Date: Tue Dec 21 21:31:55 2010 -0700 OMAP: PM: implement context loss count APIs Implement OMAP PM layer omap_pm_get_dev_context_loss_count() API by creating similar APIs at the omap_device and omap_hwmod levels. The omap_hwmod level call is the layer with access to the powerdomain core, so it is the place where the powerdomain is queried to get the context loss count. The new APIs return an unsigned value that can wrap as the context-loss count grows. However, the wrapping is not important as the role of this function is to determine context loss by checking for any difference in subsequent calls to this function. Note that these APIs at each level can return zero when no context loss is detected, or on errors. This is to avoid returning error codes which could potentially be mistaken for large context loss counters. NOTE: only works for devices which have been converted to use omap_device/omap_hwmod. Longer term, we could possibly remove this API from the OMAP PM layer, and instead directly use the omap_device level API. Signed-off-by: Kevin Hilman Signed-off-by: Paul Walmsley commit 7f595674e08b8b4d3faf64a19bccc95445d7ed35 Author: Kevin Hilman Date: Tue Dec 21 21:31:55 2010 -0700 OMAP2+: powerdomain: add API to get context loss count Add new powerdomain API u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm) for checking how many times the powerdomain has lost context. The loss count is the sum of the powerdomain off-mode counter, the logic off counter and the per-bank memory off counter. Signed-off-by: Kevin Hilman [paul@pwsan.com: removed bogus return value on error; improved kerneldoc; tweaked commit message] Signed-off-by: Paul Walmsley commit 0a01aa211da8530dc6a3ff3a725f2edd3464c46f Author: Hari Kanigeri Date: Tue Dec 21 21:18:56 2010 -0700 OMAP4: clocks: add dummy clock for mailbox In omap4, there is no explicit configuration register to enable mailbox clocks. Defining dummy clock for mailbox clock module to keep the mailbox driver backward compatible with previous omaps. Signed-off-by: Hari Kanigeri Acked-by: BenoĂ®t Cousson Signed-off-by: Paul Walmsley commit a36795c1278112af2a78f93c99b7586cb7e2a0a2 Author: Jon Hunter Date: Tue Dec 21 21:31:43 2010 -0700 OMAP: clock: fix configuration of J-Type DPLLs to work for OMAP3 and OMAP4 J-Type DPLLs have additional configuration parameters that need to be programmed when setting the multipler and divider for the DPLL. These parameters being the sigma delta divider (SD_DIV) for the DPLL and the digital controlled oscillator (DCO) to be used by the DPLL. The current code is implemented specifically to configure the OMAP3630 PER J-Type DPLL. The OMAP4430 USB DPLL is also a J-Type DPLL and so this code needs to be updated to work for both OMAP3 and OMAP4 devices and any other future devices that have J-TYPE DPLLs. For the OMAP3630 PER DPLL both the SD_DIV and DCO paramenters are used but for the OMAP4430 USB DPLL only the SD_DIV field is used. The current implementation will only program the SD_DIV and DCO fields if the DPLL has both and hence this does not work for OMAP4430. In order to make the code more generic add two new fields to the dpll_data structure for the SD_DIV field and DCO field bit-masks and only program these fields if the masks are defined for a specific DPLL. This simplifies the code and allows us to remove the flag DPLL_NO_DCO_SEL. Tested on OMAP36xx Zoom3 and OMAP4 Blaze. Signed-off-by: Jon Hunter [paul@pwsan.com: removed explicit inlining and added '_' prefix on lookup_*() functions; added testing info to commit message; added 35xx comments back in] Signed-off-by: Paul Walmsley commit b183aaf7274245bb0241d81176cb6b06a3b01ca6 Author: Charulatha V Date: Tue Dec 21 21:31:43 2010 -0700 OMAP3: clock: Update clock domain name for mcspi fck Update clock3xxx_data for mcspi1-4 with appropriate clock domain name. Signed-off-by: Charulatha V Signed-off-by: Govindraj.R Signed-off-by: Paul Walmsley commit 7cffa6b888c77e9386a6b886ef10bc57aac464ec Author: Benoit Cousson Date: Tue Dec 21 21:31:28 2010 -0700 OMAP4: hwmod data: Add SIDLE_SMART_WKUP modes to several IPs uart, gpio, wd_timer and i2c does support the new smart-idle with wakeup added in OMAP4. Add the flag to allow the hwmod core to enable this mode when applicable. Signed-off-by: Benoit Cousson Signed-off-by: Paul Walmsley Cc: Kevin Hilman Cc: Rajendra Nayak commit 86009eb326afde34ffdc5648cd344aa86b8d58d4 Author: Benoit Cousson Date: Tue Dec 21 21:31:28 2010 -0700 OMAP2+: hwmod: Add wakeup support for new OMAP4 IPs The new OMAP4 IPs introduced a new idle mode named smart-idle with wakeup. This new idlemode replaces the enawakeup for the new IPs but seems to coexist as well for some legacy IPs (UART, GPIO, MCSPI...) Add the new SIDLE_SMART_WKUP flag to mark the IPs that support this capability. The omap_hwmod_44xx_data.c will have to be updated to add this new flag. Enable this new mode when applicable in _enable_wakeup, _enable_sysc and _idle_sysc. Signed-off-by: Benoit Cousson Tested-by: Sebastien Guiriec Signed-off-by: Paul Walmsley Cc: Kevin Hilman Cc: Rajendra Nayak commit f2dd7e09db3e18e4c053810b72fe026685d9bf0c Author: Rajendra Nayak Date: Tue Dec 21 21:31:28 2010 -0700 OMAP2+: hwmod: Disable clocks when hwmod enable fails In cases where a module (hwmod) does not become accesible on enabling the main clocks (can happen if there are external clocks needed for the module to become accesible), make sure the clocks are not left enabled. This ensures that when the requisite external dependencies are met a omap_hwmod_enable and omap_hwmod_idle/shutdown would rightly enable and disable clocks using clk framework. Leaving the clocks enabled in the error case causes additional usecounting at the clock framework level leaving the clock enabled forever. Signed-off-by: Rajendra Nayak Signed-off-by: Benoit Cousson Signed-off-by: Paul Walmsley Cc: Kevin Hilman commit ce35b2446945c506cb02960eab2072f56efdf1c0 Author: Benoit Cousson Date: Tue Dec 21 21:31:28 2010 -0700 OMAP2+: hwmod: Remove omap_hwmod_mutex The hwmod list will be built are init time and never be modified at runtime. There is no need anymore to protect the list from concurrent accesses using a mutex. Signed-off-by: Benoit Cousson Signed-off-by: Paul Walmsley Cc: Kevin Hilman commit 01592df95049a6f3d4abb0571ae1c7cb6e9d1cd7 Author: Benoit Cousson Date: Tue Dec 21 21:31:28 2010 -0700 OMAP2+: hwmod: Mark functions used only during initialization with __init _register, _find_mpu_port_index and _find_mpu_rt_base are static APIs that will be used only during the omap_hwmod initialization phase. There is no need to keep them for runtime. Signed-off-by: Benoit Cousson Signed-off-by: Paul Walmsley Cc: Kevin Hilman commit 0102b62789af5aed92cea4cf7f36afaa1ab12c72 Author: Benoit Cousson Date: Tue Dec 21 21:31:27 2010 -0700 OMAP2+: hwmod: Make omap_hwmod_register private and remove omap_hwmod_unregister Do not allow omap_hwmod_register to be used outside the core hwmod code. An omap_hwmod should be registered only at init time. Remove the omap_hwmod_unregister that is not used today since the hwmod list will be built once at init time and never be modified at runtime. Signed-off-by: Benoit Cousson Signed-off-by: Paul Walmsley Cc: Kevin Hilman commit 50ebb7772c8975086dbfc3d21be74dd806650df4 Author: Benoit Cousson Date: Tue Dec 21 21:08:34 2010 -0700 OMAP2430: hwmod data: Use common dev_attr for i2c1 and i2c2 Since i2c1 and i2c2 are using the same data, remove the two previous instances and use a common i2c_dev_attr one. Moreover, that will fix the following warning: arch/arm/mach-omap2/omap_hwmod_2430_data.c:485: warning: 'i2c_dev_attr' defined but not used Signed-off-by: Benoit Cousson Acked-by: Rajendra Nayak Signed-off-by: Paul Walmsley Cc: Charulatha V commit 5a7ddcbdaf1bb7603422fb6188156ccc39711b0f Author: Kevin Hilman Date: Tue Dec 21 21:08:34 2010 -0700 OMAP2+: omap_hwmod: fix wakeup enable/disable for consistency In the omap_hwmod core, most of the SYSCONFIG register helper functions do not directly write the register, but instead just modify a value passed in. This patch converts the _enable_wakeup() and _disable_wakeup() helper functions to take a value argument and only modify it instead of actually writing the register. This makes the wakeup helpers consistent with the other helper functions and avoids unintentional problems like the following. This problem was found after discovering that GPIO wakeups were no longer functional. The root cause was that the ENAWAKEUP bit of the SYSCONFIG register was being unintentionaly overwritten, leaving wakeups disabled after the following two commits were combined: commit: 9980ce53c97392a3dbdc9d1ac3e455d79b4167ed OMAP: hwmod: Enable module wakeup if in smartidle commit: 78f26e872f77b6312273216de1a8f836c6f2e143 OMAP: hwmod: Set autoidle after smartidle during _sysc_enable There resulting in code in _enable_sysc() was this: /* * XXX The clock framework should handle this, by * calling into this code. But this must wait until the * clock structures are tagged with omap_hwmod entries */ if ((oh->flags & HWMOD_SET_DEFAULT_CLOCKACT) && (sf & SYSC_HAS_CLOCKACTIVITY)) _set_clockactivity(oh, oh->class->sysc->clockact, &v); _write_sysconfig(v, oh); so here, 'v' has wakeups disabled. /* If slave is in SMARTIDLE, also enable wakeup */ if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE)) _enable_wakeup(oh); Here wakeup is enabled in the SYSCONFIG register (but 'v' is not updated) /* * Set the autoidle bit only after setting the smartidle bit * Setting this will not have any impact on the other modules. */ if (sf & SYSC_HAS_AUTOIDLE) { idlemode = (oh->flags & HWMOD_NO_OCP_AUTOIDLE) ? 0 : 1; _set_module_autoidle(oh, idlemode, &v); _write_sysconfig(v, oh); } And here, SYSCONFIG is updated again using 'v', which does not have wakeups enabled, resulting in ENAWAKEUP being cleared. Special thanks to Benoit Cousson for pointing out that wakeups were supposed to be automatically enabled when a hwmod is enabled, and thus helping target the root cause of this problem. Signed-off-by: Paul Walmsley Cc: Benoit Cousson Signed-off-by: Benoit Cousson Signed-off-by: Kevin Hilman commit b399bca897802db3f342b6f3032a19ab8f2af99b Author: Benoit Cousson Date: Tue Dec 21 21:08:34 2010 -0700 OMAP4: hwmod & clock data: Fix GPIO opt_clks and ocp_if iclk Fix opt clocks name in clock framework and hwmod. Add the missing iclk in the ocp_if structure. Add the HWMOD_CONTROL_OPT_CLKS_IN_RESET flag to ensure the the GPIO optional clock is enable during reset. Signed-off-by: Benoit Cousson Tested-by: Charulatha V Signed-off-by: Paul Walmsley Cc: Rajendra Nayak commit 8f25bdc55d619bdd469a90b82743248680422507 Author: Benoit Cousson Date: Tue Dec 21 21:08:34 2010 -0700 OMAP4: hwmod data: Add IVA and DSP Add IVA and DSP hwmods in order to allow the pm code to initialize properly the processors devices during omap2_init_processor_devices. It will avoid the following warnings. _init_omap_device: could not find omap_hwmod for iva _init_omap_device: could not find omap_hwmod for dsp Signed-off-by: Benoit Cousson Signed-off-by: Paul Walmsley Cc: Kevin Hilman commit 659fa8222c0ca1061d74cb3282614c017f415fe5 Author: Benoit Cousson Date: Tue Dec 21 21:08:34 2010 -0700 OMAP4: hwmod data: Fix missing address in DMM and EMIF_FW The DMM is a piece of interconnect that need to be configured properly for the tiler functionnality. It thus exposes some configuration registers that were missing previously. Signed-off-by: Benoit Cousson Signed-off-by: Paul Walmsley commit 0cfe8751bbb8703bc77beb031eb6f4edf3d601d3 Author: Benoit Cousson Date: Tue Dec 21 21:08:33 2010 -0700 OMAP4: hwmod data: Add SYSS_HAS_RESET_STATUS flag Update the data for GPIO, UART, WD_TIMER and I2C in order to support the new reset status flag introduce in the following commit: commit 2cb068149c365f1c2b10f2ece6786139527dcc16 OMAP: hwmod: Fix softreset status check for some new OMAP4 IPs Without this flag properly set, the reset is done, but the hwmod core code will not wait for the reset completion to continue its excecution. Signed-off-by: Benoit Cousson Tested-by: Charulatha V Signed-off-by: Paul Walmsley Cc: Rajendra Nayak Cc: Govindraj.R Cc: Kevin Hilman commit 3b54baad8a79cc252e9d6a5ccc796b4c8b2b7173 Author: Benoit Cousson Date: Tue Dec 21 21:08:33 2010 -0700 OMAP4: hwmod data: Fix hwmod entries order The original OMAP4 hwmod data files is fully generated from HW database. But since the file is introduced incrementaly along with driver that uses the data, it has to be splitted by the driver owner and then re-merged by the maintainer. Because of the similarity of the data, git is completely lost during such merge and thus the data does not look like the original one at the end. Re-order properly the structures to stay in sync with original data set. This makes it much easier to diff the autogenerated script output with what's in mainline, see differences, and generate patches for those diffs. The goal is to stay in sync with the autogenerated data from now on. Add a comment that does contain all the IPs that can have a hwmod, but do not have it in the file for the moment. It gives a good indication of the progress. Signed-off-by: Benoit Cousson [paul@pwsan.com: updated to apply against current core integration branch, commit message slightly amplified; fixed opt_clks_cnt whitespace] Signed-off-by: Paul Walmsley Cc: Rajendra Nayak Cc: Govindraj.R Cc: Charulatha V Cc: Kevin Hilman commit 65ae65c9058eb41e9566ffd12699607c68b23e5f Author: Janusz Krzysztofik Date: Tue Dec 21 21:08:15 2010 -0700 OMAP1: clock_data: use runtime cpu / machine checks Otherwise multi-omap1 configurations may set wrong clock speed. Created and tested against l-o master on Amstrad Delta. Signed-off-by: Janusz Krzysztofik Signed-off-by: Paul Walmsley commit 1124d2f9186ec9e42e1c3f78c20199ba2cb597e2 Author: Paul Walmsley Date: Tue Dec 21 21:08:14 2010 -0700 OMAP2/3: SRAM: add comment about crashes during a TLB miss Some users were observing crashes during the execution of CORE DVFS code from OCM RAM -- a locally-modified copy of the linux-omap code. Richard Woodruff tracked this down to a DTLB miss which had been inadvertently and intermittently caused by the local modifications. (The TLB miss caused the ARM MMU to attempt to walk the page tables stored in SDRAM, which was not possible since SDRAM is off-line for a portion of the CORE DVFS OCM RAM code.) Add a note to the OMAP2 & OMAP3 CORE DVFS SRAM code to warn others that changes may result in crashes here if they are not carefully tested. Signed-off-by: Paul Walmsley Cc: Richard Woodruff Cc: Jon Hunter Cc: Nishanth Menon commit f1f4b7703f8fd165ece458ae97ebddb2b62b2ce3 Author: Paul Walmsley Date: Tue Dec 21 21:08:14 2010 -0700 OMAP3: clock: fix incorrect rate display when switching MPU rate at boot The OMAP3 clock code contains some legacy code to allow the MPU rate to be specified as a kernel command line parameter. If the 'mpurate' parameter is specified, the kernel will attempt to switch the MPU rate to this rate during boot. As part of this process, a short message "Switched to new clocking rate" is generated -- and in this message, the "Core" clock rate and "MPU" clock rate are transposed. This patch ensures that the clock rates are displayed in the correct order. Thanks to Bruno Guerin for reporting this bug and proposing a fix. Thanks to Richard Woodruff for reviewing the problem and passing the report on. Signed-off-by: Paul Walmsley Cc: Bruno Guerin Cc: Richard Woodruff commit 553d239aadc75bee70c7858ac4548d073cb3daff Author: Paul Walmsley Date: Tue Dec 21 21:08:14 2010 -0700 OMAP3: clock: clarify usage of struct clksel_rate.flags and struct omap_clk.cpu Clarify the usage of the struct omap_clk.cpu flags (e.g., CK_*) to use bits only for individual SoC variants (e.g., CK_3430ES1, CK_3505, etc.). Superset flags, such as CK_3XXX or CK_AM35XX, are now defined as disjunctions of individual SoC variant flags. This simplifies the definition and use of these flags. struct omap_clk record definitions can now simply specify the bitmask of actual SoCs that the records are valid for. The clock init code can simply set a single CPU type mask bit for the SoC that is currently in use, and test against that, rather than needing to set some combination of flags. Similarly, clarify the use of struct clksel_rate.flags. The bit allocated for RATE_IN_3XXX has been reassigned, and RATE_IN_3XXX has been defined as a disjunction of the 34xx and 36xx rate flags. The advantages are the same as the above. Clarify the usage of struct omap_clk.cpu flags such as CK_34XX to only apply to the SoCs that they name, e.g., OMAP34xx chips. The previous practice caused significantly different SoCs, such as OMAP36xx, to be included in CK_34XX. In my opinion, this is much more intuitive. Similarly, clarify the use of struct clksel_rate.flags, such that RATE_IN_3430ES2PLUS now only applies to 34xx chips with ES level >= 2 - it does not apply to OMAP36xx. ... At some point, it probably makes sense to collapse the CK_* and RATE_IN_* flags together into a single bitfield, and possibly use the existing CHIP_IS_OMAP* flags for platform detection. ... This all seems to work fine on OMAP34xx and OMAP36xx Beagle. Not sure if it works on Sitara or the TI816X, unfortunately I don't have any here to test with. Signed-off-by: Paul Walmsley commit d4521f6731756c82a76d3e791c3ec2d28b38f97e Author: Paul Walmsley Date: Tue Dec 21 21:08:14 2010 -0700 OMAP2xxx clock: fix dss2_fck recalc to use clksel dss2_fck is a clksel clock, and therefore its rate should be recalculated with the clksel mechanism. This was working in early 2009, but was one of the casualties of the big OMAP clock merge between 2.6.29 and 2.6.30. Signed-off-by: Paul Walmsley commit cb13459b38c8f2e99df4923d2a71ce6db99f2436 Author: Rajendra Nayak Date: Tue Dec 21 21:08:14 2010 -0700 OMAP4: clock data: Export control to enable/disable CORE/PER M3 clocks The CORE and PER M3 post dividers are different from the rest of the DPLL post dividers as in they go to SCRM, and are used there to export clocks for instance used by external sensor. There is no automatic HW dependency in PRCM to manage them. Hence these two clocks (dpll post dividers) should be managed by SW and explicitly enabled/disabled. Add control in clock framework to handle that. Signed-off-by: Rajendra Nayak Signed-off-by: Benoit Cousson Signed-off-by: Paul Walmsley commit e0cb70c565acffb210ffa2a4590637d1844d13c5 Author: Rajendra Nayak Date: Tue Dec 21 21:08:14 2010 -0700 OMAP4: clock data: Add SCRM auxiliary clock nodes Add support for auxiliary clocks nodes which are part of SCRM. Signed-off-by: Rajendra Nayak Signed-off-by: Benoit Cousson Signed-off-by: Paul Walmsley commit 768ab94f8b2b16a23fa10900430c10ec44f2643e Author: Jonathan Bergsagel Date: Tue Dec 21 21:08:13 2010 -0700 OMAP4: clock data: Add missing fields in iva_hsd_byp_clk_mux_ck Add register address, mask and link to the clksel structure that were missing in the IVA DPLL mux clock node. Signed-off-by: Jonathan Bergsagel Signed-off-by: Benoit Cousson Signed-off-by: Paul Walmsley Cc: Rajendra Nayak commit 032b5a7e3aa7dca8a13a79ff6a59232d307552a3 Author: Thara Gopinath Date: Tue Dec 21 21:08:13 2010 -0700 OMAP4: clock data: Add missing DPLL x2 clock nodes This patch extends the OMAP4 clock data to include various x2 clock nodes between DPLL and HS dividers as the clock framework skips a x2 while calculating the dpll locked frequency. The clock database extensions are autogenerated using the scripts maintained by Benoit Cousson. Signed-off-by: Benoit Cousson Signed-off-by: Thara Gopinath [paul@pwsan.com: fixed merge conflicts against v2.6.37-rc5; dropped dpll_mpu_x2_ck on advice from BenoĂ®t] Signed-off-by: Paul Walmsley Cc: Rajendra Nayak commit ae4b4fc1bb59ad8802800a8103a6519acadcc9cf Author: Benoit Cousson Date: Tue Dec 21 21:08:13 2010 -0700 OMAP3: clock data: Add "wkup_clkdm" in sr1_fck and sr2_fck The smartreflex modules belong to an ALWON_FCLK clock domain that does not have any SW control. The gating of that interface clock is triggered by a transition of the WKUP clock domain to idle. Attach both smartreflex instances on OMAP3 to the WKUP clock domain. The missing clock domain field in srX_fck clock nodes was reported by Kevin during the discussion about smartreflex on OMAP3: https://patchwork.kernel.org/patch/199342/ Signed-off-by: Benoit Cousson Signed-off-by: Paul Walmsley Cc: Kevin Hilman commit d9b98f5f9e20389c43370539ef3de4aba7cf1d79 Author: Benoit Cousson Date: Tue Dec 21 21:08:13 2010 -0700 OMAP4: clock data: Add control for pad_clks_ck and slimbus_clk The gating of pad_clks and slimbus_ck is controlled by the PRCM, but since the clock source is external, this is the SW responsability to gate / un-gate it when the mcpdm or slimbus module need to be used. There is no autogating possible with such external clock. Add SW control to enable / disable this SW gating in the pad_clks_ck and slimbus_clk clock node. Signed-off-by: Benoit Cousson Signed-off-by: Sebastien Guiriec Signed-off-by: Paul Walmsley Cc: Rajendra Nayak commit 596efe4792c50163578578bd4fe470f97652aad7 Author: Paul Walmsley Date: Tue Dec 21 21:05:16 2010 -0700 OMAP3: control/PM: move padconf save code to mach-omap2/control.c Move the padconf save code from pm34xx.c to the System Control Module code in mach-omap2/control.c. This is part of the general push to move direct register access from middle-layer core code to low-level core code, so the middle-layer code can be abstracted to work on multiple platforms and cleaned up. In the medium-to-long term, this code should be called by the mux layer code, not the PM idle code. This is because, according to the TRM, saving the padconf only needs to be done when the padconf changes[1]. Signed-off-by: Paul Walmsley Cc: Kevin Hilman Cc: Tony Lindgren Tested-by: Rajendra Nayak Tested-by: Santosh Shilimkar 1. OMAP34xx Multimedia Device Silicon Revision 3.1.x [Rev. ZH] [SWPU222H] Section 4.11.4 "Device Off-Mode Sequences" commit 72e06d087204f3bc9acf281717b90ebf0b9731f7 Author: Paul Walmsley Date: Tue Dec 21 21:05:16 2010 -0700 OMAP2+: powerdomain: move header file from plat-omap to mach-omap2 The OMAP powerdomain code and data is all OMAP2+-specific. This seems unlikely to change any time soon. Move plat-omap/include/plat/powerdomain.h to mach-omap2/powerdomain.h. The primary point of doing this is to remove the temptation for unrelated upper-layer code to access powerdomain code and data directly. As part of this process, remove the references to powerdomain data from the GPIO "driver" and the OMAP PM no-op layer, both in plat-omap. Change the DSPBridge code to point to the new location for the powerdomain headers. The DSPBridge code should not be including the powerdomain headers; these should be removed. Signed-off-by: Paul Walmsley Cc: Kevin Hilman Cc: Omar Ramirez Luna Cc: Felipe Contreras Cc: Greg Kroah-Hartman commit 1540f214065982e6cbc6b8da1fe65a15e358f7c5 Author: Paul Walmsley Date: Tue Dec 21 21:05:15 2010 -0700 OMAP2+: clockdomain: move header file from plat-omap to mach-omap2 The OMAP clockdomain code and data is all OMAP2+-specific. This seems unlikely to change any time soon. Move plat-omap/include/plat/clockdomain.h to mach-omap2/clockdomain.h. The primary point of doing this is to remove the temptation for unrelated upper-layer code to access clockdomain code and data directly. DSPBridge also uses the clockdomain headers for some reason, so, modify it also. The DSPBridge code should not be including the clockdomain headers; these should be removed. Signed-off-by: Paul Walmsley Cc: Kevin Hilman Cc: Omar Ramirez Luna Cc: Felipe Contreras Cc: Greg Kroah-Hartman Tested-by: Rajendra Nayak Tested-by: Santosh Shilimkar commit 55ae35073b1c76f24c3736cf797c40d9932b19aa Author: Paul Walmsley Date: Tue Dec 21 21:05:15 2010 -0700 OMAP2/3: clockdomain: remove unneeded .clkstctrl_reg, remove some direct CM register accesses Reverse some of the effects of commit 84c0c39aec31a09571fc08a752a2f4da0fe9fcf2 ("ARM: OMAP4: PM: Make OMAP3 Clock-domain framework compatible for OMAP4"). On OMAP2/3, the CM_CLKSTCTRL register is at a constant offset from the powerdomain's CM instance. Also, remove some of the direct CM register access from the clockdomain code, moving it to the OMAP2/3 CM code instead. The intention here is to simplify the clockdomain code. (The long-term goal is to move all direct CM register access across the OMAP core code to the appropriate cm*.c file.) Signed-off-by: Paul Walmsley Tested-by: Rajendra Nayak Tested-by: Santosh Shilimkar commit bd2122ca358fbd5c8e94869ae731a0951b36c757 Author: Paul Walmsley Date: Tue Dec 21 21:05:15 2010 -0700 OMAP4: clockdomains: add OMAP4 PRCM data and OMAP4 support Add PRCM partition, CM instance register address offset, and clockdomain register address offset to each OMAP4 struct clockdomain record. Add OMAP4 clockdomain code to use this new data to access registers properly. While here, clean up some nearby clockdomain code to allocate auto variables in my recollection of Linus's preferred style. The autogeneration scripts have been updated. Signed-off-by: Paul Walmsley Cc: Rajendra Nayak Cc: Santosh Shilimkar Cc: BenoĂ®t Cousson Tested-by: Rajendra Nayak Tested-by: Santosh Shilimkar commit e4156ee52fe617c2c2d80b5db993ff4bf07d7c3c Author: Paul Walmsley Date: Tue Dec 21 21:05:15 2010 -0700 OMAP4: CM instances: add clockdomain register offsets In OMAP4 CM instances, some registers (CM_CLKSTCTRL, CM_STATICDEP, CM_DYNAMICDEP, and the module-specific registers underneath) are organized by clockdomain. Add the clockdomain offset macros to the appropriate PRCM module header files. This data was almost completely autogenerated from the TI hardware database; the autogeneration scripts have been updated. Signed-off-by: Paul Walmsley Cc: BenoĂ®t Cousson Tested-by: Rajendra Nayak Tested-by: Santosh Shilimkar commit b170fbe1f9f1aa38773b1bcf064ab65951ce739d Author: Paul Walmsley Date: Tue Dec 21 21:05:15 2010 -0700 OMAP2+: clockdomains: split the clkdm hwsup enable/disable function Split _omap2_clkdm_set_hwsup() into _disable_hwsup() and _enable_hwsup(). While here, also document that the autodeps are deprecated and that they should be removed at the earliest opportunity. The documentation has been fixed for _{enable,disable}_hwsup(), thanks to Kevin Hilman for pointing out that those functions still had placeholder documentation in an earlier patch revision. Signed-off-by: Paul Walmsley Cc: Kevin Hilman Tested-by: Santosh Shilimkar Tested-by: Rajendra Nayak commit a64bb9cda8b12f599766c7dfe81770d2082a133a Author: Paul Walmsley Date: Tue Dec 21 21:05:14 2010 -0700 OMAP4: powerdomains: add PRCM partition data; use OMAP4 PRM functions OMAP4 powerdomain control registers are split between the PRM hardware module and the PRCM_MPU local PRCM. Add this PRCM partition information to each OMAP4 powerdomain record, and convert the OMAP4 powerdomain function implementations to use the OMAP4 PRM instance functions. Also fixes a potential null pointer dereference of pwrdm->name. The autogeneration scripts have been updated. Signed-off-by: Paul Walmsley Cc: Rajendra Nayak Cc: Santosh Shilimkar Cc: BenoĂ®t Cousson Tested-by: Santosh Shilimkar Tested-by: Rajendra Nayak commit c4d7e58fb52c632d8e33cd23a4917d7a7f8302ac Author: Paul Walmsley Date: Tue Dec 21 21:05:14 2010 -0700 OMAP2/3: PRM/CM: prefix OMAP2 PRM/CM functions with "omap2_" Now that OMAP4-specific PRCM functions have been added, distinguish the existing OMAP2/3-specific PRCM functions by prefixing them with "omap2_". This patch should not result in any functional change. Signed-off-by: Paul Walmsley Cc: Kevin Hilman Cc: Jarkko Nikula Cc: Peter Ujfalusi Cc: Liam Girdwood Cc: Mark Brown Tested-by: Santosh Shilimkar Tested-by: Rajendra Nayak commit dac9a77120e2724e22696f06f3ecb4838da1e3e4 Author: Paul Walmsley Date: Tue Dec 21 21:05:14 2010 -0700 OMAP4: PRCM: move global reset function for OMAP4 to an OMAP4-specific file Move the OMAP4 global software reset function to the OMAP4-specific prm44xx.c file, where it belongs. Part of the long-term process of moving all of the direct PRCM register writes into lower-layer code. Also add OCP barriers on OMAP2/3/4 to reduce the chance that the MPU will continue executing while the system is supposed to be resetting itself. Signed-off-by: Paul Walmsley Tested-by: Santosh Shilimkar Tested-by: Rajendra Nayak commit 2ace831ffc8feaffb8bc03da89ff43d948efdc97 Author: Paul Walmsley Date: Tue Dec 21 21:05:14 2010 -0700 OMAP4: PRCM: add OMAP4-specific accessor/mutator functions In some ways, the OMAP4 PRCM register layout is quite different than the OMAP2/3 PRCM register layout. For example, on OMAP2/3, from a register layout point of view, all CM instances were located in the CM subsystem, and all PRM instances were located in the PRM subsystem. OMAP4 changes this. Now, for example, some CM instances, such as WKUP_CM and EMU_CM, are located in the system PRM subsystem. And a "local PRCM" exists for the MPU - this PRCM combines registers that would normally appear in both CM and PRM instances, but uses its own register layout which matches neither the OMAP2/3 PRCM layout nor the OMAP4 PRCM layout. To try to deal with this, introduce some new functions, omap4_cminst* and omap4_prminst*. The former is to be used when writing to a CM instance register (no matter what subsystem or hardware module it exists in), and the latter, similarly, with PRM instance registers. To determine which "PRCM partition" to write to, the functions take a PRCM instance ID argument. Subsequent patches add these partition IDs to the OMAP4 powerdomain and clockdomain definitions. As far as I can see, there's really no good way to handle these types of register access inconsistencies. This patch seemed like the least bad approach. Moving forward, the long-term goal is to remove all direct PRCM register access from the PM code. PRCM register access should go through layers such as the powerdomain and clockdomain code that can hide the details of how to interact with the specific hardware variant. While here, rename cm4xxx.c to cm44xx.c to match the naming convention of the other OMAP4 PRCM files. Thanks to Santosh Shilimkar , Rajendra Nayak , and BenoĂ®t Cousson for some comments. Signed-off-by: Paul Walmsley Cc: BenoĂ®t Cousson Cc: Rajendra Nayak Cc: Santosh Shilimkar commit 227fb925d3d3c5e565c1f1323a530564509195f2 Author: Don Fry Date: Tue Dec 21 19:58:15 2010 -0800 MAINTAINERS: email address change My ISP has changed and therefore my email address. Signed-off-by: Don Fry Signed-off-by: David S. Miller commit 17d6ce11195fceda62af00beefde37e37a01337c Author: Aaro Koskinen Date: Mon Dec 20 23:50:22 2010 +0200 sisfb: eliminate compiler warnings Convert some bit masks to 8-bit values to avoid the following compiler warnings: drivers/video/sis/sis_main.c:3858: warning: large integer implicitly truncated to unsigned type drivers/video/sis/init301.c:5855: warning: large integer implicitly truncated to unsigned type drivers/video/sis/init301.c:5869: warning: large integer implicitly truncated to unsigned type Signed-off-by: Aaro Koskinen Cc: Thomas Winischhofer Signed-off-by: Paul Mundt commit 114776776a8e38fff5772efeef68fc3fdde76a82 Author: Aaro Koskinen Date: Mon Dec 20 23:50:21 2010 +0200 sisfb: delete unused register I/O macros Delete unused register I/O macros. Signed-off-by: Aaro Koskinen Cc: Thomas Winischhofer Signed-off-by: Paul Mundt commit ad78adb4e814104510da421a38cfe89ab018a8b1 Author: Aaro Koskinen Date: Mon Dec 20 23:50:20 2010 +0200 sisfb: replace setSISIDXREG with SiS_SetRegANDOR Replace setSISIDXREG() with SiS_SetRegANDOR(). Signed-off-by: Aaro Koskinen Cc: Thomas Winischhofer Signed-off-by: Paul Mundt commit 667a8b4114641895c90f8c98db1678c0bfa056df Author: Aaro Koskinen Date: Mon Dec 20 23:50:19 2010 +0200 sisfb: replace andSISIDXREG with SiS_SetRegAND Replace andSISIDXREG() with SiS_SetRegAND(). Signed-off-by: Aaro Koskinen Cc: Thomas Winischhofer Signed-off-by: Paul Mundt commit 27799d6c40828d5983fb1778ad3089740b946af8 Author: Aaro Koskinen Date: Mon Dec 20 23:50:18 2010 +0200 sisfb: replace orSISIDXREG with SiS_SetRegOR Replace orSISIDXREG() with SiS_SetRegOR(). Signed-off-by: Aaro Koskinen Cc: Thomas Winischhofer Signed-off-by: Paul Mundt commit 44b751bbe1fb6e7a75bbdee2d0c5f3ee133d6b0f Author: Aaro Koskinen Date: Mon Dec 20 23:50:17 2010 +0200 sisfb: replace outSISIDXREG with SiS_SetReg Replace outSISIDXREG() with SiS_SetReg(). Signed-off-by: Aaro Koskinen Cc: Thomas Winischhofer Signed-off-by: Paul Mundt commit e57d413681b6d9c3d256eeac1e34f0d1b8b81e26 Author: Aaro Koskinen Date: Mon Dec 20 23:50:16 2010 +0200 sisfb: replace inSISIDXREG with SiS_GetReg Replace inSISIDXREG() with SiS_GetReg(). Signed-off-by: Aaro Koskinen Cc: Thomas Winischhofer Signed-off-by: Paul Mundt commit 63e13f8e2b4873b97d78567de8ad4dbcc63740db Author: Aaro Koskinen Date: Mon Dec 20 23:50:15 2010 +0200 sisfb: replace outSISREG with SiS_SetRegByte Replace outSISREG() with SiS_SetRegByte(). Signed-off-by: Aaro Koskinen Cc: Thomas Winischhofer Signed-off-by: Paul Mundt commit 1e1687d78bcaba01c7a22ef8564af2029e8e9919 Author: Aaro Koskinen Date: Mon Dec 20 23:50:14 2010 +0200 sisfb: replace inSISREG with SiS_GetRegByte Replace inSISREG() with SiS_GetRegByte(). Signed-off-by: Aaro Koskinen Cc: Thomas Winischhofer Signed-off-by: Paul Mundt commit f0611a5c220e50dec65041b10bd2fe9484f061a6 Author: Paul Walmsley Date: Tue Dec 21 15:30:56 2010 -0700 OMAP3: PRM/CM: separate CM context save/restore; remove PRM context save/restore The OMAP3 PRM module is in the WKUP powerdomain, which is always powered when the chip is powered, so it shouldn't be necessary to save and restore those PRM registers. Remove the PRM register save/restore code, which should save several microseconds during off-mode entry/exit, since PRM register accesses are relatively slow. While doing so, move the CM register save/restore code into CM-specific code. The CM module has been distinct from the PRM module since 2430. This patch includes some minor changes to pm34xx.c. Signed-off-by: Paul Walmsley Cc: Kevin Hilman Cc: Rajendra Nayak Cc: Tero Kristo Cc: Kalle Jokiniemi Reviewed-by: Kevin Hilman Tested-by: Kevin Hilman Tested-by: Santosh Shilimkar Tested-by: Rajendra Nayak commit f48b9644ef330a13c6bb16ca85c2efdbe7e25558 Author: Aaro Koskinen Date: Mon Dec 20 23:50:13 2010 +0200 sisfb: change register I/O functions to use fixed size types Use fixed-sized types (u8, u16, u32) instead of plain C types. Signed-off-by: Aaro Koskinen Cc: Thomas Winischhofer Signed-off-by: Paul Mundt commit e68046b72e9b35d054e3d98d71dc2c69d7e88e1e Author: Aaro Koskinen Date: Mon Dec 20 23:50:12 2010 +0200 sisfb: remove duplicate function declarations Remove duplicate register I/O function declarations by moving them into a common header file. Signed-off-by: Aaro Koskinen Cc: Thomas Winischhofer Signed-off-by: Paul Mundt commit b5b7dda7b5d9126d531ffa212b6a89d72aeac90a Author: Aaro Koskinen Date: Mon Dec 20 23:50:11 2010 +0200 sisfb: delete HAVE_CONFIG_H checks Delete unneeded HAVE_CONFIG_H checks. Signed-off-by: Aaro Koskinen Cc: Thomas Winischhofer Signed-off-by: Paul Mundt commit 679c489fffe1ca426de1faa1ba51f0413149d139 Author: Aaro Koskinen Date: Mon Dec 20 23:50:10 2010 +0200 sisfb: eliminate unused variable compiler warning Eliminate the following compiler warning on non-x86 platforms by limiting the variable scope: drivers/video/sis/sis_main.c:4108: warning: unused variable 'temp' Signed-off-by: Aaro Koskinen Cc: Thomas Winischhofer Signed-off-by: Paul Mundt commit 7ccbefe07ea0a3570e44d1ec13a307552ee4dadd Merge: 623eb15647fc35c5a8cd38985d5958240eb072c1 90a8a73c06cc32b609a880d48449d7083327e11a Author: Paul Mundt Date: Wed Dec 22 12:56:10 2010 +0900 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 commit 59fb659b065f52fcc2deed293cfbfc58f890376c Author: Paul Walmsley Date: Tue Dec 21 15:30:55 2010 -0700 OMAP2/3: PRCM: split OMAP2/3-specific PRCM code into OMAP2/3-specific files In preparation for adding OMAP4-specific PRCM accessor/mutator functions, split the existing OMAP2/3 PRCM code into OMAP2/3-specific files. Most of what was in mach-omap2/{cm,prm}.{c,h} has now been moved into mach-omap2/{cm,prm}2xxx_3xxx.{c,h}, since it was OMAP2xxx/3xxx-specific. This process also requires the #includes in each of these files to be changed to reference the new file name. As part of doing so, add some comments into plat-omap/sram.c and plat-omap/mcbsp.c, which use "sideways includes", to indicate that these users of the PRM/CM includes should not be doing so. Thanks to Felipe Contreras for comments on this patch. Signed-off-by: Paul Walmsley Cc: Jarkko Nikula Cc: Peter Ujfalusi Cc: Liam Girdwood Cc: Omar Ramirez Luna Acked-by: Omar Ramirez Luna Cc: Felipe Contreras Acked-by: Felipe Contreras Cc: Greg Kroah-Hartman Acked-by: Mark Brown Reviewed-by: Kevin Hilman Tested-by: Kevin Hilman Tested-by: Rajendra Nayak Tested-by: Santosh Shilimkar commit cdb54c4457d68994da7c2e16907adfbfc130060d Author: Paul Walmsley Date: Tue Dec 21 15:30:55 2010 -0700 OMAP4: PRCM: rename _MOD macros to _INST Back in the OMAP2/3 PRCM interface days, the macros that referred to the offsets of individual PRM/CM instances from the top of the PRM/CM hardware modules were incorrectly suffixed with "_MOD". (They should have been suffixed with something like "_INST" or "_INSTANCE".) These days, now that we have better contact with the OMAP hardware people, we know that this naming is wrong. And in fact in OMAP4, there are actual hardware module offsets inside the instances, so the incorrect naming gets confusing very quickly for anyone who knows the hardware. Fix this naming for OMAP4, before things get too far along, by changing "_MOD" to "_INST" on the end of these macros. So, for example, OMAP4430_CM2_INSTR_MOD becomes OMAP4430_CM2_INSTR_INST. This unfortunately creates quite a large diff, but it is a straightforward rename. This patch should not result in any functional changes. The autogeneration scripts have been updated accordingly. Signed-off-by: Paul Walmsley Cc: BenoĂ®t Cousson Cc: Rajendra Nayak Cc: Santosh Shilimkar Reviewed-by: Kevin Hilman Tested-by: Kevin Hilman Tested-by: Santosh Shilimkar Tested-by: Rajendra Nayak commit 0f318fd52d7e251c5f48416c3e7156acc680d81c Author: Benoit Cousson Date: Tue Dec 21 15:30:54 2010 -0700 OMAP4: PRCM: Add SCRM header file Add the header file with scrm registers absolute address, offset and bitfields. Signed-off-by: Benoit Cousson Signed-off-by: Rajendra Nayak [paul@pwsan.com: renamed OMAP4_SCRM to OMAP4_SCRM_BASE] Signed-off-by: Paul Walmsley commit d198b514bd9e94930ee0b9ca1cad0a51f5e29608 Author: Paul Walmsley Date: Tue Dec 21 15:30:54 2010 -0700 OMAP4: PRCM: reorganize existing OMAP4 PRCM header files Split the existing cm44xx.h file into cm1_44xx.h and cm2_44xx.h files so they match their underlying OMAP hardware modules. Add clockdomain offset information. Add header files for the MPU local PRCM, prcm_mpu44xx.h, and for the SCRM, scrm44xx.h. SCRM register offsets still need to be added; TI should do this. Move the "_MOD" macros out of the prcm-common.h header file, into the header file of the hardware module that they belong to. For example, OMAP4430_PRM_*_MOD macros have been moved into the prm44xx.h header. Adjust #includes of all files that used the old PRCM header file names to point to the new filenames. The autogeneration scripts have been updated accordingly. Signed-off-by: Paul Walmsley Cc: BenoĂ®t Cousson Cc: Rajendra Nayak Reviewed-by: Kevin Hilman Tested-by: Kevin Hilman Tested-by: Rajendra Nayak Tested-by: Santosh Shilimkar commit f5f9d132d1c212bf3828c7926d95f79e0c20d243 Author: Paul Walmsley Date: Tue Dec 21 15:30:53 2010 -0700 OMAP3: control/PRCM: move CONTROL_PADCONF_SYS_NIRQ save/restore to SCM code For some reason, the PRCM context save/restore code also saves and restores a single System Control Module register, CONTROL_PADCONF_SYS_NIRQ. This is probably just an error -- the register should be handled by SCM code -- so this patch moves it there. If this register really does need to be saved and restored before the rest of the PRCM registers, the code to do so should live in the SCM code, and the PM code should call this separate function. This register pertains to devices with a stacked modem, so this patch is unlikely to affect most OMAP devices out there. Signed-off-by: Paul Walmsley Cc: Kevin Hilman Reviewed-by: Kevin Hilman Tested-by: Kevin Hilman Tested-by: Santosh Shilimkar Tested-by: Rajendra Nayak commit 166353bd75587a2158d713af1b9489a79e0ce297 Author: Paul Walmsley Date: Tue Dec 21 20:01:21 2010 -0700 OMAP3: control/PRCM: add omap3_ctrl_write_boot_mode() Get rid of the open-coded scratchpad write in mach-omap2/prcm.c and replace it with an actual API, omap3_ctrl_write_boot_mode(). While there, get rid of the gratuitous omap_writel(). There's not much documentation available for what should wind up in the scratchpad here, so more documentation would be appreciated. Also, at some point, we should formalize our treatment of the scratchpad; right now, accesses to the scratchpad are not well-documented. Signed-off-by: Paul Walmsley Reviewed-by: Kevin Hilman Tested-by: Kevin Hilman Tested-by: Santosh Shilimkar commit dc0b3a701499bb7727314d7a9c764f7486db4802 Author: Paul Walmsley Date: Tue Dec 21 20:01:20 2010 -0700 OMAP2+: clockdomains: move clockdomain static data to .c files Static data should be declared in .c files, not .h files. It should be possible to #include .h files at any point without creating multiple copies of the same data. We converted the clock data to .c files some time ago. This patch does the same for the clockdomain data. Signed-off-by: Paul Walmsley Reviewed-by: Kevin Hilman Tested-by: Kevin Hilman Tested-by: Santosh Shilimkar Tested-by: Rajendra Nayak commit 6e01478ae8a4322c9a2b2d6efed50196265ed5f2 Author: Paul Walmsley Date: Tue Dec 21 20:01:20 2010 -0700 OMAP2+: powerdomains: move powerdomain static data to .c files Static data should be declared in .c files, not .h files. It should be possible to #include .h files at any point without creating multiple copies of the same data. We converted the clock data to .c files some time ago. This patch does the same for the powerdomain data. Signed-off-by: Paul Walmsley Cc: Rajendra Nayak Cc: Santosh Shilimkar Reviewed-by: Kevin Hilman Tested-by: Kevin Hilman Tested-by: Santosh Shilimkar Tested-by: Rajendra Nayak commit 4b4f62c4672805466652a785070cc2ac8a398e16 Author: Santosh Shilimkar Date: Tue Dec 21 20:01:19 2010 -0700 OMAP4: powerdomain: Add pwrdm_clear_all_prev_pwrst Like OMAP3, OMAP4430 ES2 has additional bitfields in PWRSTST register which help identify the previous power state entered by the powerdomain. Add pwrdm_clear_all_prev_pwrst to the OMAP4 powerdomains implementation to support this. Signed-off-by: Santosh Shilimkar Signed-off-by: Rajendra Nayak [paul@pwsan.com: clarified commit message] Signed-off-by: Paul Walmsley Cc: Benoit Cousson Cc: Kevin Hilman Reviewed-by: Kevin Hilman Tested-by: Kevin Hilman Tested-by: Santosh Shilimkar Tested-by: Rajendra Nayak commit 9b7fc907d9378f86eb6b823bbe84ec9ed584b091 Author: Rajendra Nayak Date: Tue Dec 21 20:01:19 2010 -0700 OMAP: powerdomain: Arch specific funcs for mem control Define the following architecture specific funtions for omap2/3/4 .pwrdm_set_mem_onst .pwrdm_set_mem_retst .pwrdm_read_mem_pwrst .pwrdm_read_prev_mem_pwrst .pwrdm_read_mem_retst .pwrdm_clear_all_prev_pwrst .pwrdm_enable_hdwr_sar .pwrdm_disable_hdwr_sar .pwrdm_wait_transition .pwrdm_set_lowpwrstchange Convert the platform-independent framework to call these functions. Signed-off-by: Rajendra Nayak [paul@pwsan.com: rearranged Makefile changes] Signed-off-by: Paul Walmsley Cc: Benoit Cousson Cc: Kevin Hilman Reviewed-by: Kevin Hilman Tested-by: Kevin Hilman Tested-by: Santosh Shilimkar commit 12627578523d2d9396cae76b1dad0ed3dccf1730 Author: Rajendra Nayak Date: Tue Dec 21 20:01:18 2010 -0700 OMAP: powerdomain: Arch specific funcs for logic control Define the following architecture specific funtions for omap2/3/4 .pwrdm_set_logic_retst .pwrdm_read_logic_pwrst .pwrdm_read_prev_logic_pwrst .pwrdm_read_logic_retst Convert the platform-independent framework to call these functions. Signed-off-by: Rajendra Nayak Signed-off-by: Paul Walmsley Cc: Benoit Cousson Cc: Kevin Hilman Reviewed-by: Kevin Hilman Tested-by: Kevin Hilman Tested-by: Santosh Shilimkar Tested-by: Rajendra Nayak commit f327e07b0ef9c60a6018799c9f04de10101d8e5a Author: Rajendra Nayak Date: Tue Dec 21 20:01:18 2010 -0700 OMAP: powerdomain: Arch specific funcs for state control Define the following architecture specific funtions for omap2/3/4 .pwrdm_set_next_pwrst .pwrdm_read_next_pwrst .pwrdm_read_pwrst .pwrdm_read_prev_pwrst Convert the platform-independent framework to call these functions. Signed-off-by: Rajendra Nayak [paul@pwsan.com: remove remaining static allocations in powerdomains.h file; remove path in file header comments, rearranged Makefile changes] Signed-off-by: Paul Walmsley Cc: Benoit Cousson Cc: Kevin Hilman Reviewed-by: Kevin Hilman Tested-by: Kevin Hilman Tested-by: Santosh Shilimkar Tested-by: Rajendra Nayak commit 3b1e8b21fcbd686445f0bb42f84701b4621cdec6 Author: Rajendra Nayak Date: Tue Dec 21 20:01:18 2010 -0700 OMAP: powerdomain: Infrastructure to put arch specific code Put infrastructure in place, so arch specific func pointers can be hooked up to the platform-independent part of the framework. This is in preparation of splitting the powerdomain framework into platform-independent part (for all omaps) and platform-specific parts. Signed-off-by: Rajendra Nayak Signed-off-by: Paul Walmsley Cc: Benoit Cousson Cc: Kevin Hilman Reviewed-by: Kevin Hilman Tested-by: Kevin Hilman Tested-by: Santosh Shilimkar Tested-by: Rajendra Nayak commit 74bea6b9881f4b32f6c0379e46d2f5e16fd34a07 Author: Rajendra Nayak Date: Tue Dec 21 20:01:17 2010 -0700 OMAP: powerdomain: Move static allocations from powerdomains.h to a .c file powerdomains.h header today has only static definitions. Adding any function declarations into it and including it in multiple source file is expected to cause issues. Hence move all the static definitions from powerdomains.h file into powerdomains_data.c file. Also, create a new powerdomain section of the mach-omap2/Makefile, and rearrange the prcm-common part of the Makefile, now that the powerdomain code is in its own Makefile section. Signed-off-by: Rajendra Nayak [paul@pwsan.com: rearrange Makefile changes, tweaked commit message] Signed-off-by: Paul Walmsley Reviewed-by: Kevin Hilman Tested-by: Kevin Hilman Tested-by: Santosh Shilimkar Tested-by: Rajendra Nayak commit ff2516fbef20ed9edd9cc2fc8b8b48d5cb5a932f Author: Paul Walmsley Date: Tue Dec 21 15:39:15 2010 -0700 OMAP2+: wd_timer: disable on boot via hwmod postsetup mechanism The OMAP watchdog timer IP blocks require a specific set of register writes to occur before they will be disabled[1], even if the device clocks appear to be disabled in the CM_*CLKEN registers. In the MPU watchdog case, failure to execute this reset sequence will eventually cause the watchdog to reset the OMAP unexpectedly. Previously, the code to disable this watchdog was manually called from mach-omap2/devices.c during device initialization. This causes the watchdog to be unconditionally disabled for a portion of kernel initialization. This should be controllable by the board-*.c files, since some system integrators will want full watchdog coverage of kernel initialization. Also, the watchdog disable code was not connected to the hwmod shutdown code. This means that calling omap_hwmod_shutdown() will not, in fact, disable the watchdog, and the goal of omap_hwmod_shutdown() is to be able to shutdown any on-chip OMAP device. To resolve the latter problem, populate the pre_shutdown pointer in the watchdog timer hwmod classes with a function that executes the watchdog shutdown sequence. This allows the hwmod code to fully disable the watchdog. Then, to allow some board files to support watchdog coverage throughout kernel initialization, add common code to mach-omap2/io.c to cause the MPU watchdog to be disabled on boot unless a board file specifically requests it to remain enabled. Board files can do this by changing the watchdog timer hwmod's postsetup state between the omap2_init_common_infrastructure() and omap2_init_common_devices() function calls. 1. OMAP34xx Multimedia Device Silicon Revision 3.1.x Rev. ZH [SWPU222H], Section 16.4.3.6, "Start/Stop Sequence for WDTs (Using WDTi.WSPR Register)" Signed-off-by: Paul Walmsley Cc: BenoĂ®t Cousson Cc: Kevin Hilman Cc: Charulatha Varadarajan commit 81fbc5ef9b22df2e2198dd0c530719a263a8d1c5 Author: Paul Walmsley Date: Tue Dec 21 19:56:17 2010 -0700 OMAP2+: wd_timer: separate watchdog disable code from the rest of mach-omap2/devices.c Split the wd_timer disable code out into its own file, mach-omap2/wd_timer.c; it belongs in its own file rather than cluttering up devices.c. Signed-off-by: Paul Walmsley Cc: Charulatha Varadarajan commit 233cbe5b94096f95ba7bca2162d63275b0b90b5b Author: Rajendra Nayak Date: Tue Dec 14 12:42:36 2010 -0700 OMAP2+: hwmod: Update the sysc_cache in case module context is lost Do not skip the sysc programming in the hmwod framework based on the cached value alone, since at times the module might have lost context (due to the Powerdomain in which the module belongs transitions to either Open Switch RET or OFF). Identifying if a module has lost context requires atleast one register read, and since a register read has more latency than a write, it makes sense to do a blind write always. Signed-off-by: Rajendra Nayak Acked-by: Kevin Hilman Signed-off-by: Paul Walmsley Cc: Benoit Cousson Cc: Santosh Shilimkar commit b56b7bc8d9293b64e7a459527ae78078902751ff Author: Paul Walmsley Date: Tue Dec 14 12:42:36 2010 -0700 OMAP2+: hwmod: fix a warning, add some docs, remove unused fields Trivial cleanup and documentation changes on the hwmod code and data: - add some hwmod documentation to indicate flags that should be moved outside the static hwmod data in a future patch - remove some unused fields in the struct omap_hwmod_ocp_if and struct omap_hwmod structures Signed-off-by: Paul Walmsley Cc: BenoĂ®t Cousson commit dc6d1cda044b24c3d9f8e4af0431887ebe3488ef Author: Paul Walmsley Date: Tue Dec 14 12:42:35 2010 -0700 OMAP2+: hwmod: upgrade per-hwmod mutex to a spinlock Change the per-hwmod mutex to a spinlock. (The per-hwmod lock serializes most post-initialization hwmod operations such as enable, idle, and shutdown.) Spinlocks are needed, because in some cases, hwmods must be enabled from timer interrupt disabled-context, such as an ISR. The current use-case that is driving this is the OMAP GPIO block ISR: it can trigger interrupts even with its clocks disabled, but these clocks are needed for register accesses in the ISR to succeed. This patch also effectively reverts commit 848240223c35fcc71c424ad51a8e8aef42d3879c - this patch makes _omap_hwmod_enable() and _omap_hwmod_init() static, renames them back to _enable() and _idle(), and changes their callers to call the spinlocking versions. Previously, since omap_hwmod_{enable,init}() attempted to take mutexes, these functions could not be called while the timer interrupt was disabled; but now that the functions use spinlocks and save and restore the IRQ state, it is appropriate to call them directly. Kevin Hilman originally proposed this patch - thanks Kevin. Signed-off-by: Paul Walmsley Cc: Kevin Hilman Cc: BenoĂ®t Cousson commit bd36179eec2827cd60b4a8c6e180cc030c74a4ec Author: Paul Walmsley Date: Tue Dec 14 12:42:35 2010 -0700 OMAP2+: hwmod: add support for per-class custom device reset functions The standard omap_hwmod.c _reset() code relies on an IP block's OCP_SYSCONFIG.SOFTRESET register bit to reset the IP block. This works for most IP blocks on the chip, but unfortunately not all. For example, initiator-only IP blocks often don't have any MPU-accessible OCP-header registers, and therefore the MPU can't write to any OCP_SYSCONFIG registers in that block. Other IP blocks, such as the IVA and I2C, require a specialized reset sequence. Since we need to be able to reset these IP blocks as well, allow custom IP block reset functions to be passed into the hwmod code via a per-hwmod-class reset function pointer, struct omap_hwmod_class.reset. If .reset is non-null, then the hwmod _reset() code will call the custom function instead of the standard OCP SOFTRESET-based code. As part of this change, rename most of the existing _reset() function code to _ocp_softreset(), to indicate more clearly that it does not work for all cases. Signed-off-by: Paul Walmsley Cc: BenoĂ®t Cousson Cc: Paul Hunt Cc: Stanley Liu commit 2092e5ccf89db09ebde94e9aabd3c86d5fa05c6c Author: Paul Walmsley Date: Tue Dec 14 12:42:35 2010 -0700 OMAP2+: hwmod: add postsetup state Allow board files and OMAP core code to control the state that some or all of the hwmods end up in at the end of _setup() (called by omap_hwmod_late_init() ). Reimplement the old skip_setup_idle code in terms of this new postsetup state code. There are two use-cases for this patch: the !CONFIG_PM_RUNTIME case, in which all IP blocks should stay enabled after _setup() finishes; and the MPU watchdog case, in which the watchdog IP block should enter idle if watchdog coverage of kernel initialization is desired, and should be disabled otherwise. Signed-off-by: Paul Walmsley Cc: BenoĂ®t Cousson Cc: Kevin Hilman Cc: Charulatha Varadarajan commit e4dc8f507c3066d6fcece988d99b6d766c46af85 Author: Paul Walmsley Date: Tue Dec 14 12:42:34 2010 -0700 OMAP2+: hwmod: allow custom pre-shutdown functions Some OMAP IP blocks, such as the watchdog timers, cannot be completely shut down via the standard hwmod shutdown mechanism. This patch enables the hwmod data files to supply a pointer to a custom pre-shutdown function via the struct omap_hwmod_class.pre_shutdown function pointer. If the struct omap_hwmod_class.pre_shutdown function pointer is non-null, the function will be executed before the existing hwmod shutdown code runs. Signed-off-by: Paul Walmsley Cc: BenoĂ®t Cousson commit 4805734bcc5a6b28b527a13a5c1603a2912c9f48 Author: Paul Walmsley Date: Tue Dec 21 15:25:10 2010 -0700 OMAP2+: io: split omap2_init_common_hw() Split omap2_init_common_hw() into two functions. The first, omap2_init_common_infrastructure(), initializes the hwmod code and data, the OMAP PM code, and the clock code and data. The second, omap2_init_common_devices(), handles any other early device initialization that, for whatever reason, has not been or cannot be moved to initcalls or early platform devices. This patch is required for the hwmod postsetup patch, which allows board files to change the state that hwmods should be placed into at the conclusion of the hwmod _setup() function. For example, for a board whose creators wish to ensure watchdog coverage across the entire kernel boot process, code to change the watchdog's postsetup state will be added in the board-*.c file between the omap2_init_common_infrastructure() and omap2_init_common_devices() function calls. Signed-off-by: Paul Walmsley Cc: Tony Lindgren commit 5b59cc2fc2ff90369d6aa7862caaba3cf45b5075 Author: Raghuveer Murthy Date: Tue Dec 21 14:14:34 2010 +0000 OMAP4: Pandaboard: Fix MMC card detect gpio line commit bf56f0a6668cd (2.6.37-rc1), from Nishanth Menon attempted to fix card detection for PandaBoard, unfortunately, the fix missed to initialize .gpio_cd member of omap2_hsmmc_info. This results in a default value of '0', which is a valid GPIO line. On PandaBoard, the side effect of this is that GPIO line 0 controls the powering TFP410 DVI chip, and without the fix DVI chip is inadvertently powered. Tested-by: David Anders Acked-by: Nishanth Menon Signed-off-by: Kishore Kadiyala Signed-off-by: Raghuveer Murthy Signed-off-by: Tony Lindgren commit 79c5f68dc221df729417823d4981373f4762d8eb Author: Thomas Weber Date: Tue Dec 21 11:07:09 2010 +0000 OMAP3: Devkit8000: Add DEBUG_LL support Add support for DEBUG_LL for Devkit8000. Devkit8000 uses uart 3 for debug output. Signed-off-by: Thomas Weber Signed-off-by: Tony Lindgren commit d858addf10a00e663e438d7607f18496d30f1d1b Author: Daniel Morsing Date: Tue Dec 21 10:23:13 2010 +0000 OMAP2: Devkit8000: Use _cansleep GPIO functions for displayreset lines The display reset lines are connected to a TPS65930 which may sleep when changing GPIO values. Use the appropriate function to silence a nasty warning from gpiolib. Signed-off-by: Daniel Morsing Acked-by: Thomas Weber Signed-off-by: Tony Lindgren commit b9e7683bbca638967a56e5d7fd4035a947109621 Merge: bb3613aa34a81a5e2f1227ccdb801fde04a7da10 53da4ce23809ca33405001b0ae117e60b7feced1 Author: Tony Lindgren Date: Tue Dec 21 17:05:57 2010 -0800 Merge branch 'pm-opp' of ssh://master.kernel.org/pub/scm/linux/kernel/git/khilman/linux-omap-pm into omap-for-linus commit bb3613aa34a81a5e2f1227ccdb801fde04a7da10 Merge: 6971071cdda79cad5f53ba390e466d696e7e9006 bb1c9034b3ce7f29d3d178a87b42b767611d6574 Author: Tony Lindgren Date: Tue Dec 21 16:53:00 2010 -0800 Merge branch 'pm-next' of ssh://master.kernel.org/pub/scm/linux/kernel/git/khilman/linux-omap-pm into omap-for-linus commit 6971071cdda79cad5f53ba390e466d696e7e9006 Merge: 4584acc3ee236424b5d0b52f143d980cae3c2be5 f31cc9622d75c1c6f041d786698daa425c0425c2 Author: Tony Lindgren Date: Tue Dec 21 16:48:20 2010 -0800 Merge branch 'devel-dma' into omap-for-linus commit 0f16830e9f6de0a44cf1e473ffa80cbe612d5beb Author: Chris Wilson Date: Tue Dec 21 22:49:28 2010 +0000 drm: Include the connector name in the output_poll_execute() debug message Always useful to know just which connector was polled and had its status updated. Signed-off-by: Chris Wilson Signed-off-by: Dave Airlie commit bb1c9034b3ce7f29d3d178a87b42b767611d6574 Author: Jean Pihet Date: Sat Dec 18 16:49:57 2010 +0100 OMAP3: ASM sleep code format rework Cosmetic fixes to the code: - white spaces and tabs, - alignement, - comments rephrase and typos, - multi-line comments Tested on N900 and Beagleboard with full RET and OFF modes, using cpuidle and suspend. Signed-off-by: Jean Pihet Acked-by: Santosh Shilimkar Tested-by: Nishanth Menon Signed-off-by: Kevin Hilman commit 8352129166b8270253a746f336a4429b349b023d Author: Jean Pihet Date: Sat Dec 18 16:44:46 2010 +0100 OMAP3: add comments for low power code errata Errata covered: - 1.157 & 1.185 - i443 - i581 Tested on N900 and Beagleboard with full RET and OFF modes, using cpuidle and suspend. Signed-off-by: Jean Pihet Acked-by: Santosh Shilimkar Tested-by: Nishanth Menon Signed-off-by: Kevin Hilman commit f7dfe3d8a98b7c4869c09826e3a65663cb9c71be Author: Jean Pihet Date: Sat Dec 18 16:44:45 2010 +0100 OMAP3: rework of the ASM sleep code execution paths - Reworked and simplified the execution paths for better readability and to avoid duplication of code, - Added comments on the entry and exit points and the interaction with the ROM code for OFF mode restore, - Reworked the existing comments for better readability. Tested on N900 and Beagleboard with full RET and OFF modes, using cpuidle and suspend. Signed-off-by: Jean Pihet Acked-by: Santosh Shilimkar Tested-by: Nishanth Menon Signed-off-by: Kevin Hilman commit 1e81bc015a444e0f908451642b0197199d0c6fa4 Author: Jean Pihet Date: Sat Dec 18 16:44:44 2010 +0100 OMAP3: re-organize the ASM sleep code Organize the code in the following sections: - register access macros, - API functions, - internal functions. Tested on N900 and Beagleboard with full RET and OFF modes, using cpuidle and suspend. Signed-off-by: Jean Pihet Acked-by: Santosh Shilimkar Tested-by: Nishanth Menon Signed-off-by: Kevin Hilman commit fe360e1c8693bca175338da4c53078b0be807c52 Author: Jean Pihet Date: Sat Dec 18 16:44:43 2010 +0100 OMAP3: remove hardcoded values from the ASM sleep code Using macros from existing include files for registers addresses. Tested on N900 and Beagleboard with full RET and OFF modes, using cpuidle and suspend. Based on original patch from Vishwa. Signed-off-by: Jean Pihet Cc: Vishwanath BS Acked-by: Santosh Shilimkar Tested-by: Nishanth Menon Signed-off-by: Kevin Hilman commit b4b36fd94e4ca99b3258ff24c2c58cdde67085e0 Author: Jean Pihet Date: Sat Dec 18 16:44:42 2010 +0100 OMAP2+: use global values for the SRAM PA addresses The SRAM PA addresses are locally defined and used at different places, i.e. SRAM management code and idle sleep code. The macros are now defined at a centralized place, for easier maintenance. Tested on N900 and Beagleboard with full RET and OFF modes, using cpuidle and suspend. Signed-off-by: Jean Pihet Acked-by: Santosh Shilimkar Tested-by: Nishanth Menon Signed-off-by: Kevin Hilman commit d3cdfd2a15d87d040a5f553231b979fbc28b98e7 Author: Jean Pihet Date: Sat Dec 18 16:44:41 2010 +0100 OMAP3: remove unused code from the ASM sleep code Remove unused code: - macros, - variables, - unused semaphore locking API. This API shall be added back when needed, - infinite loops for debug. Tested on N900 and Beagleboard with full RET and OFF modes, using cpuidle and suspend. Signed-off-by: Jean Pihet Acked-by: Santosh Shilimkar Reviewed-by: Nishanth Menon Tested-by: Nishanth Menon Signed-off-by: Kevin Hilman commit cc1b6028878646a2419b27e5f590b5e9fe01dc3d Author: Eduardo Valentin Date: Mon Dec 20 14:05:09 2010 -0600 OMAP3630: PM: Erratum i583: disable coreoff if < ES1.2 Limitation i583: Self_Refresh Exit issue after OFF mode Issue: When device is waking up from OFF mode, then SDRC state machine sends inappropriate sequence violating JEDEC standards. Impact: OMAP3630 < ES1.2 is impacted as follows depending on the platform: CS0: for 38.4MHz as internal sysclk, DDR content seen to be stable, while for all other sysclk frequencies, varied levels of instability seen based on varied parameters. CS1: impacted This patch takes option #3 as recommended by the Silicon erratum: Avoid core power domain transitioning to OFF mode. Power consumption impact is expected in this case. To do this, we route core OFF requests to RET request on the impacted revisions of silicon. Acked-by: Jean Pihet [nm@ti.com: rebased the code to 2.6.37-rc2- short circuit code changed a bit] Signed-off-by: Nishanth Menon Signed-off-by: Eduardo Valentin Signed-off-by: Kevin Hilman commit 80723c3fe457a5d29c178da4ac72983f47b37ed7 Author: Nishanth Menon Date: Mon Dec 20 14:05:08 2010 -0600 OMAP3: PM: make omap3_cpuidle_update_states independent of enable_off_mode Currently omap3_cpuidle_update_states makes whole sale decision on which C states to update based on enable_off_mode variable Instead, achieve the same functionality by independently providing mpu and core deepest states the system is allowed to achieve and update the idle states accordingly. Acked-by: Santosh Shilimkar Acked-by: Jean Pihet Signed-off-by: Nishanth Menon [khilman: fixed additional user of this API in OMAP CPUidle driver] Signed-off-by: Kevin Hilman commit c4236d2e7913d18d058a018f0d19473eb6a11a3c Author: Peter 'p2' De Schrijver Date: Mon Dec 20 14:05:07 2010 -0600 OMAP3630: PM: Disable L2 cache while invalidating L2 cache While coming out of MPU OSWR/OFF states, L2 controller is reseted. The reset behavior is implementation specific as per ARMv7 TRM and hence $L2 needs to be invalidated before it's use. Since the AUXCTRL register is also reconfigured, disable L2 cache before invalidating it and re-enables it afterwards. This is as per Cortex-A8 ARM documentation. Currently this is identified as being needed on OMAP3630 as the disable/enable is done from "public side" while, on OMAP3430, this is done in the "secure side". Cc: Kevin Hilman Cc: Tony Lindgren Acked-by: Jean Pihet Acked-by: Santosh Shilimkar [nm@ti.com: ported to 2.6.37-rc2, added hooks to enable the logic only on 3630] Signed-off-by: Nishanth Menon Signed-off-by: Eduardo Valentin Signed-off-by: Peter 'p2' De Schrijver Signed-off-by: Kevin Hilman commit 458e999eb14a301d4176783c8fcb277f5d009b4e Author: Nishanth Menon Date: Mon Dec 20 14:05:06 2010 -0600 OMAP3630: PM: Erratum i608: disable RTA Erratum id: i608 RTA (Retention Till Access) feature is not supported and leads to device stability issues when enabled. This impacts modules with embedded memories on OMAP3630 Workaround is to disable RTA on boot and coming out of core off. For disabling RTA coming out of off mode, we do this by overriding the restore pointer for 3630 as the first point of entry before caches are touched and is common for GP and HS devices. To disable earlier than this could be possible by modifying the PPA for HS devices, but not for GP devices. Cc: Kevin Hilman Cc: Tony Lindgren Acked-by: Jean Pihet Acked-by: Santosh Shilimkar [ambresh@ti.com: co-developer] Signed-off-by: Ambresh K Signed-off-by: Nishanth Menon Signed-off-by: Kevin Hilman commit 8cdfd83473d9b408b924b5d32777ac3fddd251ff Author: Nishanth Menon Date: Mon Dec 20 14:05:05 2010 -0600 OMAP3: pm: introduce errata handling Introduce errata handling for OMAP3. This patch introduces errata variable and stub for initialization which will be filled up by follow-on patches. Signed-off-by: Nishanth Menon Signed-off-by: Kevin Hilman commit 9d93b8a2c8c78972f0a3d15a820288dbb3968bf2 Author: Peter 'p2' De Schrijver Date: Mon Dec 20 14:05:04 2010 -0600 OMAP3: PM: Erratum i581 support: dll kick strategy Erratum i581 impacts OMAP3 platforms. PRCM DPLL control FSM removes SDRC_IDLEREQ before DPLL3 locks causing the DPLL not to be locked at times. IMPORTANT: *) This is not a complete workaround implementation as recommended by the silicon erratum. This is a support logic for detecting lockups and attempting to recover where possible and is known to provide stability in multiple platforms. *) This code is mostly important for inactive and retention. The ROM code waits for the maximum DLL lock time when resuming from off mode. So for off mode this code isn't really needed. *) counters are introduced here for eventual export to userspace once the cleanups are completed. This should eventually get refactored as part of cleanups to sleep34xx.S Cc: Kevin Hilman Cc: Tony Lindgren Signed-off-by: Peter 'p2' De Schrijver Signed-off-by: Kevin Hilman commit 0bd40535365c318e331f5e872030a710d5746167 Author: Richard Woodruff Date: Mon Dec 20 14:05:03 2010 -0600 OMAP3: PM: Update clean_l2 to use v7_flush_dcache_all Analysis in TI kernel with ETM showed that using cache mapped flush in kernel instead of SO mapped flush cost drops by 65% (3.39mS down to 1.17mS) for clean_l2 which is used during sleep sequences. Overall: - speed up - unfortunately there isn't a good alternative flush method today - code reduction and less maintenance and potential bug in unmaintained code This also fixes the bug with the clean_l2 function usage. Reported-by: Tony Lindgren Cc: Kevin Hilman Cc: Tony Lindgren Acked-by: Santosh Shilimkar Acked-by: Jean Pihet [nm@ti.com: ported rkw's proposal to 2.6.37-rc2] Signed-off-by: Nishanth Menon Signed-off-by: Richard Woodruff Signed-off-by: Kevin Hilman commit e29ff7290e826d5c7fda906d99233713a47a92c8 Author: Alex Deucher Date: Tue Dec 21 16:05:38 2010 -0500 drm/radeon/kms: fix bug in r600_gpu_is_lockup We were using the lockup struct from the wrong union. Signed-off-by: Alex Deucher Cc: Jerome Glisse Signed-off-by: Dave Airlie commit 53da4ce23809ca33405001b0ae117e60b7feced1 Author: Kevin Hilman Date: Thu Dec 9 09:13:48 2010 -0600 OMAP3: remove OPP interfaces from OMAP PM layer With new OPP layer, OPP users will access OPP API directly instead of using OMAP PM layer, so remove all notions of OPPs from the OMAP PM layer. Acked-by: Paul Walmsley Signed-off-by: Nishanth Menon Signed-off-by: Kevin Hilman commit f5a6422d4e0e85a9c7f5522d3321254bfdfa7f04 Author: Nishanth Menon Date: Thu Dec 9 09:13:47 2010 -0600 omap4: opp: add OPP table data This patch adds OPP tables for OMAP4. New file has been added to keep the OMAP4 opp tables and the registration of these tables with the generic opp framework by OMAP SoC OPP interface. Based on: http://dev.omapzoom.org/?p=santosh/kernel-omap4-base.git;a=blob;f=arch/arm/mach-omap2/opp44xx_data.c;h=252e3d0cb6050a64f390b9311c1c4977d74f762a;hb=refs/heads/omap4_next Signed-off-by: Thara Gopinath Signed-off-by: Nishanth Menon Signed-off-by: Kevin Hilman commit fd1478cd61624479c89e35602925459d74505ff3 Author: Nishanth Menon Date: Thu Dec 9 09:13:46 2010 -0600 omap: opp: add OMAP3 OPP table data and common init Add OPP data for OMAP34xx and OMAP36xx and initialization functions to populate OPP tables based on current SoC. introduce an OMAP generic opp initialization routine which OMAP3 and OMAP4+ SoCs can use to register their OPP definitions. Cc: Thomas Petazzoni Signed-off-by: Kevin Hilman Signed-off-by: Nishanth Menon Signed-off-by: Kevin Hilman commit 1cbbe37ac5c78fb59ce02f639d6c4f69b610cf5e Author: Thara Gopinath Date: Mon Dec 20 21:17:21 2010 +0530 OMAP: pm.c correct the initcall for an early init. omap2_common_pm_init is the API where generic system devices like mpu, l3 etc get initialized. This has to happen really early on during the boot and not at a later time. This is especially important with the new opp changes as these devices need to be built before the opp tables init happen. Today both are device initcalls and it works just because of the order of compilation. Making this postcore_initcall is ideal because the omap device layer init happens as a core_initcall and typically rest of the driver/device inits are arch_initcall or something lower. Signed-off-by: Thara Gopinath Signed-off-by: Kevin Hilman commit c166381d4013fd32512f124c237f4213ae9888e9 Author: Jean Pihet Date: Thu Dec 9 18:39:58 2010 +0100 OMAP2+: disable idle early in the suspend sequence Some bad interaction between the idle and the suspend paths has been identified: the idle code is called during the suspend enter and exit sequences. This could cause corruption or lock-up of resources. The solution is to move the calls to disable_hlt at the very beginning of the suspend sequence (ex. in omap3_pm_begin instead of omap3_pm_prepare), and the call to enable_hlt at the very end of the suspend sequence (ex. in omap3_pm_end instead of omap3_pm_finish). Tested with RET and OFF on Beagle and OMAP3EVM. Signed-off-by: Jean Pihet Cc: Kevin Hilman Signed-off-by: Kevin Hilman commit 503b1a529a6b62b31904bab4699752c523cf76b2 Merge: 4b4f54670859074cf7670cc6fa96fe34a65846d9 215faf9c5f6e319e97edea9e178123e07825c14d Author: David S. Miller Date: Tue Dec 21 13:26:15 2010 -0800 Merge branch '20101221_static_const' of git://repo.or.cz/linux-2.6/trivial-mods commit 4b4f54670859074cf7670cc6fa96fe34a65846d9 Author: Denis Kirjanov Date: Tue Dec 21 02:02:26 2010 +0000 sundance: Program station address into HW Program adapter's StationAddress register when changing device MAC address Signed-off-by: Denis Kirjanov Signed-off-by: David S. Miller commit 24de5285dce378e4170e068f2662236d2b46c033 Author: Denis Kirjanov Date: Tue Dec 21 02:01:36 2010 +0000 sundance: Wrap up acceess to ASICCtrl high word with a macro Wrap up acceess to ASICCtrl high word with a macro Signed-off-by: Denis Kirjanov Signed-off-by: David S. Miller commit 3b4694de3596edac0159524b15a4a06945875421 Author: Masami Hiramatsu Date: Fri Dec 17 22:12:18 2010 +0900 perf probe: Fix to support libdwfl older than 0.148 Since the libdwfl library before 0.148 fails to analyze live kernel debuginfo, 'perf probe --list' compiled with those old libdwfl sometimes crashes. To avoid that bug, perf probe does not use libdwfl's live kernel analysis routine when it is compiled with older libdwfl. Side effect: perf with older libdwfl doesn't support listing probe in modules with source code line. Those could be shown by symbol+offset. Cc: 2nddept-manager@sdl.hitachi.co.jp Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Srikar Dronamraju Cc: Steven Rostedt LKML-Reference: <20101217131218.24123.62424.stgit@ltc236.sdl.hitachi.co.jp> Signed-off-by: Masami Hiramatsu Signed-off-by: Arnaldo Carvalho de Melo commit ea187cfbb9a3de73e7bd7b7125ae345d92d4384b Author: Masami Hiramatsu Date: Fri Dec 17 22:12:00 2010 +0900 perf tools: Fix lazy wildcard matching Fix lazy wildcard matching to ignore space after wild card. Cc: 2nddept-manager@sdl.hitachi.co.jp Cc: Frederic Weisbecker Cc: Hitoshi Mitake Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Srikar Dronamraju Cc: Steven Rostedt LKML-Reference: <20101217131200.24123.8202.stgit@ltc236.sdl.hitachi.co.jp> Signed-off-by: Masami Hiramatsu Signed-off-by: Arnaldo Carvalho de Melo commit da521b2c4f046383bc8941604174bc0e8bffb430 Author: David S. Miller Date: Tue Dec 21 12:43:16 2010 -0800 net: Fix range checks in tcf_valid_offset(). This function has three bugs: 1) The offset should be valid most of the time, this is just a sanity check, therefore we should use "likely" not "unlikely" 2) This is the only place where we can check for arithmetic overflow of the pointer plus the length. 3) The existing range checks are off by one, the valid range is skb->head to skb_tail_pointer(), inclusive. Based almost entirely upon a patch by Ralph Loader. Reported-by: Ralph Loader Signed-off-by: David S. Miller commit 12b16dadbc2406144d408754f96d0f44aa016239 Author: Eric Dumazet Date: Wed Dec 15 19:45:28 2010 +0000 filter: optimize accesses to ancillary data We can translate pseudo load instructions at filter check time to dedicated instructions to speed up filtering and avoid one switch(). libpcap currently uses SKF_AD_PROTOCOL, but custom filters probably use other ancillary accesses. Note : I made the assertion that ancillary data was always accessed with BPF_LD|BPF_?|BPF_ABS instructions, not with BPF_LD|BPF_?|BPF_IND ones (offset given by K constant, not by K + X register) On x86_64, this saves a few bytes of text : # size net/core/filter.o.* text data bss dec hex filename 4864 0 0 4864 1300 net/core/filter.o.new 4944 0 0 4944 1350 net/core/filter.o.old Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit cb8f404893bab40431f7eeb2511454031b07e7df Author: Tejun Heo Date: Tue Dec 14 06:09:59 2010 +0000 bnx2: remove cancel_work_sync() from remove_one Michael pointed out that bnx2_close() already cancels bp->reset_task and thus it is guaranteed to be idle when bnx2_remove_one() is called. Remove the unnecessary cancel_work_sync() in remove_one. Signed-off-by: Tejun Heo Acked-by: Michael Chan Signed-off-by: David S. Miller commit a13c13273a206e0c4b9a814277fb50529457abe7 Merge: 34a52f363ab6bcf6d50a65c153dec03f3fb32653 c04bfc6b223662c42a77727342c1df7d39e686a2 Author: David S. Miller Date: Tue Dec 21 12:17:29 2010 -0800 Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/bwh/sfc-next-2.6 commit 4931445b94f49672028b81ace9d4eee8ddf19ab2 Author: Adrian Hunter Date: Thu Dec 9 11:22:50 2010 +0200 OMAP2/3: OneNAND: add 104MHz support Add GPMC timings for 104MHz OneNAND. Signed-off-by: Adrian Hunter Signed-off-by: Tony Lindgren commit a3551f5b0c3ca7aaa053e554e3ee766983b5d713 Author: Adrian Hunter Date: Thu Dec 9 10:48:27 2010 +0200 OMAP2/3: GPMC: put sync_clk value in picoseconds instead of nanoseconds The calculations done with sync_clk are anyway in picoseconds and switching to picoseconds allows sync_clk values that are not a whole number of nanoseconds - which is sometimes the case. Signed-off-by: Adrian Hunter Signed-off-by: Tony Lindgren commit 274476f8fe0b6ac9bac542cc39de12c3dd0f43f6 Author: Takashi Iwai Date: Fri Dec 10 08:40:31 2010 +0100 mmc: Fix re-probing with PM_POST_RESTORE notification In the error-path where PM notifies PM_POST_RESTORE, the rescan-blockage should be cleared as well. Otherwise it'll be never re-probed. Also, as a bonus, this fixes a bug in S4 with user-mode suspend in the current code, as it sends PM_POST_RESTORE instead of PM_POST_HIBERNATION wrongly. Cc: Signed-off-by: Takashi Iwai Signed-off-by: Chris Ball commit 2f1d791882d21a4002a719fb016a1ac21c8bd6b7 Author: Nicolas Ferre Date: Fri Dec 10 19:14:32 2010 +0100 mmc: atmel-mci: fix multiblock SDIO transfers Based on report made by Yauhen in: "MMC: Fix multiblock SDIO transfers in AT91 MCI" patch, I report those changes to the brother driver: atmel-mci. So, this patch sets SDIO transfer types: SDIO block and SDIO byte transfers instead of using ordinary MMC block transfers. It is checking opcode for SDIO CMD53 and setting transfer type in MCI_CMDR register properly. Reported-by: Yauhen Kharuzhy Cc: Signed-off-by: Nicolas Ferre Acked-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Chris Ball commit a2255ff45143001fecbc5e5a4b58fcb999d393ae Author: Yauhen Kharuzhy Date: Thu Nov 25 12:11:51 2010 +0200 mmc: at91_mci: fix multiblock SDIO transfers The AT91 MCI has special SDIO transfer types: SDIO block and SDIO byte transfers, but at91_mci driver doesn't use them and handles all SDIO transfers as ordinary MMC block transfers. This causes problems for multiple-block SDIO transfers (in particular for 256-bytes blocks). Fix this situation by checking the opcode for SDIO CMD53 and setting the transfer type in the AT91_MCI_CMDR register properly. This patch was tested with libertas SDIO driver: problem with TX timeouts on big packets was eliminated. Signed-off-by: Yauhen Kharuzhy Cc: Signed-off-by: Nicolas Ferre Acked-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Chris Ball commit 90a8a73c06cc32b609a880d48449d7083327e11a Author: Linus Torvalds Date: Tue Dec 21 11:26:40 2010 -0800 Linux 2.6.37-rc7 commit 21dd9ae5a4e9f717f3957ec934dd3158129436b8 Author: Franck Bui-Huu Date: Mon Dec 20 15:18:05 2010 +0100 perf probe: Handle gracefully some stupid and buggy line syntaxes Currently perf probe doesn't handle those incorrect syntaxes: $ perf probe -L sched.c:++13 $ perf probe -L sched.c:-+13 $ perf probe -L sched.c:10000000000000000000000000000+13 This patches rewrites parse_line_range_desc() to handle them. As a bonus, it reports more useful error messages instead of: "Tailing with invalid character...". Acked-by: Masami Hiramatsu Cc: Masami Hiramatsu LKML-Reference: <1292854685-8230-7-git-send-email-fbuihuu@gmail.com> Signed-off-by: Franck Bui-Huu Signed-off-by: Arnaldo Carvalho de Melo commit c6d92e9b84da2002ee7a75b784834970ddfd3bfd Merge: ba119204ff6ff722dcec387b305d9c2d23380726 5155e2c70fc50bc475911dab5dba2f80130523c7 Author: David Brown Date: Tue Dec 21 10:53:43 2010 -0800 Merge branch 'msm-usb' into for-next * msm-usb: MSM: Add USB support for MSM7x30 MSM: Add USB suport for QSD8x50 commit 34a52f363ab6bcf6d50a65c153dec03f3fb32653 Author: Dan Carpenter Date: Mon Dec 20 21:34:56 2010 +0000 stmmac: unwind properly in stmmac_dvr_probe() The original code had a several problems: *) It had potential null dereferences of "priv" and "res". *) It released the memory region before it was aquired. *) It didn't free "ndev" after it was allocated. *) It didn't call unregister_netdev() after calling stmmac_probe(). Signed-off-by: Dan Carpenter Signed-off-by: David S. Miller commit 4b97f8e10893e2c8f64a2795901bdb447a3308f4 Author: Dan Carpenter Date: Mon Dec 20 21:04:02 2010 +0000 bnx2x: remove bogus check We dereferenced params on the line before so it's too late to check if params is NULL. In fact, params can never be NULL and strict_cos is either 0 or 1 so that part of the check is bogus too. Let's remove it. Signed-off-by: Dan Carpenter Acked-by: Eilon Greenstein Signed-off-by: David S. Miller commit 70978182d431e0348e6ef711d0f962d12c03bc46 Author: Eric Dumazet Date: Mon Dec 20 21:22:51 2010 +0000 net: timestamp cloned packet in dev_queue_xmit_nit Le vendredi 17 dĂ©cembre 2010 Ă  10:26 +0100, Eric Dumazet a Ă©crit : > > I think we can add this after latest Changli patch : > > He does one skb_clone() before calling the sniffers. > We could set timestamp on this clone, instead of original skb. > > Problem solved. > [PATCH net-next-2.6] net: timestamp cloned packet in dev_queue_xmit_nit Now we do one clone of skb if at least one sniffer might take packet, we also can do the skb timestamping on the clone and let original packet unchanged. This is a generalization of commit 8caf153974f2 (net: sch_netem: Fix an inconsistency in ingress netem timestamps.) This way, we can have a good idea when packets are delivered to our stack (tcpdump -i ifb0), while a tcpdump on original device gives timestamps right before ingressing. This also speedup our stack, avoiding taking timestamps if not needed. Signed-off-by: Eric Dumazet Cc: Changli Gao Cc: Patrick McHardy Cc: Jarek Poplawski Acked-by: Changli Gao Signed-off-by: David S. Miller commit e9ccc998b70fbe59626f393bb0328402159c6b5c Author: Nicholas Bellinger Date: Fri Dec 17 13:11:16 2010 -0800 [SCSI] Add missing SPC-4 CDB and MAINTENANCE_[IN,OUT] service action definitions This patch adds a handful of missing CDBs defs that are used by TCM persistent reservation logic in the SPC-4 defined CDB exclusion table for registrations and reservations. This includes a number of missing MI_* and MO_* prefixed service actions defs for MAINTENANCE_IN and MAINTENANCE_OUT that are mentioned wrt to persistent registration and reservation status for the SCSI Initiator Port. Signed-off-by: Nicholas A. Bellinger Signed-off-by: James Bottomley commit 3f1530c1e1f7fc570672f4a54565949070fad05f Author: adam radford Date: Tue Dec 14 18:51:48 2010 -0800 [SCSI] megaraid_sas: Update GPL headers. This patch updates the GPL headers in megaraid_sas_base.c and megaraid_sas.h. Signed-off-by: Adam Radford Signed-off-by: James Bottomley commit 0d49016bbab4fe9164710b1d4bbae116b89b7f7e Author: adam radford Date: Tue Dec 14 19:17:17 2010 -0800 [SCSI] megaraid_sas: Rename megaraid_sas.c to megaraid_sas_base.c This patch renames megaraid_sas.c to megaraid_sas_base.c to facilitate other files in the compile. Signed-off-by: Adam Radford Signed-off-by: James Bottomley commit fd01a6632da253210c3dbc7814bc6eceda96623d Author: Hillf Danton Date: Thu Dec 16 14:26:37 2010 -0600 [SCSI] fix the return value of scsi_target_queue_read() It seems that zero should be returned if scsi_target_is_busy(starget) is true, no matter if sdev is on the starved list. Signed-off-by: Hillf Danton Reviewed-by: Mike Christie Signed-off-by: James Bottomley commit db422318cbca55168cf965f655471dbf8be82433 Author: Menny Hamburger Date: Thu Dec 16 14:57:07 2010 -0500 [SCSI] scsi_dh: propagate SCSI device deletion Currently, when scsi_dh_activate() returns with an error (e.g. SCSI_DH_NOSYS) the activate_complete callback is not called and the error is not propagated to DM mpath. When a SCSI device attached to a device handler is deleted, userland processes currently performing I/O on the device will have their I/O hang forever. - Set SCSI_DH_NOSYS error when the handler is in the process of being deleted (e.g. the SCSI device is in a SDEV_CANCEL or SDEV_DEL state). - Set SCSI_DH_DEV_OFFLINED error when device is in SDEV_OFFLINE state. - Call the activate_complete callback function directly from scsi_dh_activate if an error has been set (when either the scsi_dh internal data has already been deleted or is in the process of being deleted). The patch was tested in an iSCSI environment, RDAC H/W handler and multipath. In the following reproduction process, dd will I/O hang forever and the only way to release it will be to reboot the machine: 1) Perform I/O on a multipath device: dd if=/dev/dm-0 of=/dev/zero bs=8k count=1000000 & 2) Delete all slave SCSI devices contained in the mpath device: I) In an iSCSI environment, the easiest way to do this is by stopping iSCSI: /etc/init.d/iscsi stop II) Another way to delete the devices is by applying the following bash scriptlet: dm_devs=$(ls /sys/block/ | grep dm- | xargs) for dm_dev in $dm_devs; do devices=$(ls /sys/block/$dm_dev/slaves) for device in $devices; do echo 1 > /sys/block/$device/device/delete done done NOTE: when DM mpath's fail_path uses blk_abort_queue this scsi_dh change isn't strictly required. However, DM mpath's call to blk_abort_queue will soon be reverted because it has proven to be unsafe due to a race (between blk_abort_queue and scsi_request_fn) that can lead to list corruption. Therefore we cannot rely on blk_abort_queue via fail_path, but even if we could this scsi_dh change is still preferrable. Signed-off-by: Menny Hamburger Signed-off-by: Mike Snitzer Reviewed-by: Babu Moger Signed-off-by: James Bottomley commit 35dd3039e09cd46ca3a8733ff1c817bf7b7b19ce Author: Stephen M. Cameron Date: Thu Dec 16 13:01:03 2010 -0600 [SCSI] hpsa: do not consider RAID level to be part of device identity Otherwise, after doing a RAID level migration, the disk will be disruptively removed and re-added as a different disk on rescan. Signed-off-by: Stephen M. Cameron Signed-off-by: James Bottomley commit a0b89872b305bd0f6f5af1dd26274a3f057a2303 Author: Stephen M. Cameron Date: Thu Dec 16 13:00:58 2010 -0600 [SCSI] hpsa: do not consider firmware revision when looking for device changes. The firmware may have been updated, in which case, it's the same device, and in that case, we do not want to remove and add the device, we want to let it continue as is. Signed-off-by: Stephen M. Cameron Signed-off-by: James Bottomley commit 774342844f368a0c3ba907f192d844ae337d01aa Author: James Smart Date: Wed Dec 15 17:58:20 2010 -0500 [SCSI] lpfc 8.3.20: Update lpfc driver version to 8.3.20 Signed-off-by: Alex Iannicelli Signed-off-by: James Smart Signed-off-by: James Bottomley commit 4042629e426da5ff0c793276a61103bd3f6b2183 Author: James Smart Date: Wed Dec 15 17:58:10 2010 -0500 [SCSI] lpfc 8.3.20: Updates to FC discovery commands Updated commands used for ELS to utilize VPI Allocate RPI at node creation time and pass in ELS commnads. Signed-off-by: Alex Iannicelli Signed-off-by: James Smart Signed-off-by: James Bottomley commit 2fcee4bf874a8ae72ada68b62728d1fdeb30e3d4 Author: James Smart Date: Wed Dec 15 17:57:46 2010 -0500 [SCSI] lpfc 8.3.20: Implement new SLI4 init procedures based on if_type Implement new SLI4 init procedures based on if_type: - Add structure changes for new SLIPORT registers and BAR changes. - Update register names to be consistent with inteface spec terms. - Added union to encapsulate Hardward error registers. - Rework lpfc_sli4_post_status_check() around SLI-4's SLI_INTF type - Removed the lpfc_sli4_fw_cfg_check routine - Segmented driver logic to include evaluation of the if_type to engage different behaviors. Signed-off-by: Alex Iannicelli Signed-off-by: James Smart Signed-off-by: James Bottomley commit 70f3c073362ef7b5e55c92b83eb2dd9a7fb4e9bf Author: James Smart Date: Wed Dec 15 17:57:33 2010 -0500 [SCSI] lpfc 8.3.20: Implement the FC and SLI async event handlers Implement the FC and SLI async event handlers: - Updated MQ_CREATE_EXT mailbox structure to include fc and SLI async events. - Added the SLI trailer code. - Split physical field into type and number to reflect latest SLI spec. - Changed lpfc_acqe_fcoe to lpfc_acqe_fip to reflect latest Spec changes. - Added lpfc_acqe_fc_la structure for FC link attention async events. - Added lpfc_acqe_sli structure for sli async events. - Added lpfc_sli4_async_fc_evt routine to handle fc la async events. - Added lpfc_sli4_async_sli routine to handle sli async events. - Moved LPFC_TRAILER_CODE_FC to be handled by its own handler function. Signed-off-by: Alex Iannicelli Signed-off-by: James Smart Signed-off-by: James Bottomley commit be858b65cf9701e75bc49ed38c56e5b51ff281cd Author: James Smart Date: Wed Dec 15 17:57:20 2010 -0500 [SCSI] lpfc 8.3.20: Critical fixes - Use for iocbq->context1 to hold the ndlp pointer. - Set ndlp in all iocbs generated from ioctl functions. - Turn parity and serr bits back on after performing sli4 board reset. Signed-off-by: Alex Iannicelli Signed-off-by: James Smart Signed-off-by: James Bottomley commit 395eb20238f5f1d5fba0ae284760a68095dd9e66 Author: Krishna Gudipati Date: Mon Dec 13 16:23:51 2010 -0800 [SCSI] bfa: Update the driver version to 2.3.2.3 Signed-off-by: Krishna Gudipati Signed-off-by: James Bottomley commit 15821f05b78dbeb2f897d1d22576449103a4d8d5 Author: Krishna Gudipati Date: Mon Dec 13 16:23:27 2010 -0800 [SCSI] bfa: io tag handling and minor bug fix. Fix iotag handling: 1) Update and check io tag for retry case. 2) Clearing upper 3 bits in io tag when an IO completes. The 3 upper bits in io tags are used for counting FCP exchange retry. Un-cleared bits will cause firmware to access invalid memory when the same io tag is used for an IO to a target that doesn't support FCP exchange retry. 3) Only check the effective bits when validating an iotag. Other minor fixes: 1) Added trace to get FC header type with assert of unhandled packet received. Ignore the type FC_TYPE_FC_FSS (FC_XS). 2) Fixed the adapter info display check - to check for fcmode flag even. Signed-off-by: Krishna Gudipati Signed-off-by: James Bottomley commit b704495c6707013806d1b66507a967896e2b4a7c Author: Krishna Gudipati Date: Mon Dec 13 16:17:42 2010 -0800 [SCSI] bfa: direct attach mode fix. - Direct attach is not working due to the check of PID in fcxp_send request. - Added logic to set the lps->lp_pid with the PID assigned for n2n mode. Signed-off-by: Krishna Gudipati Signed-off-by: James Bottomley commit f1d584d70f31f54e0a559049906f42db89e2746d Author: Krishna Gudipati Date: Mon Dec 13 16:17:11 2010 -0800 [SCSI] bfa: IOC auto recovery fix. - Made IOC auto_recovery synchronized and not timer based. - Only one PCI function will attempt to recover and reinitialize the ASIC on a failure, after all the active PCI fns acknowledge the IOC failure. Signed-off-by: Krishna Gudipati Signed-off-by: James Bottomley commit f3a060ca57903daaf2f1a88c6c25832619b2a74f Author: Krishna Gudipati Date: Mon Dec 13 16:16:50 2010 -0800 [SCSI] bfa: Store port configuration in flash for persistency. When the bfa driver is loaded a flogi is sent without the knowledge of trunking configuration. This normal flogi causes the switch ports which had trunking enabled to go to persistent offline. Solution is to store the port configuration (which has trunking info) in the flash for persistency. The firmware will read this configuration when the very first fcport enable is received. Signed-off-by: Krishna Gudipati Signed-off-by: James Bottomley commit 4e78efefa3c083240bd47153ffa99642bfdc7811 Author: Krishna Gudipati Date: Mon Dec 13 16:16:09 2010 -0800 [SCSI] bfa: IOC fwtrace save logic & state machine fixes. - Move fw trace save logic to bfa_ioc_sm_fail_entry(), so that fw trace is saved irrespective of the cause of the failure. - Make bfa_ioc_sm_fail() a failure parking state. - Rename bfa_ioc_sm_initfail() to a more appropriate bfa_ioc_sm_fail_retry() as it is no longer a parking state. Signed-off-by: Krishna Gudipati Signed-off-by: James Bottomley commit da99dcc98dd66a2de4864645bcafffd93cf5a62f Author: Maggie Zhang Date: Thu Dec 9 19:13:20 2010 -0800 [SCSI] bfa: remove unused functions and misc cleanups Remove unused functions and fix checkpatch errors. Misc cleanups in comment and formatting. Signed-off-by: Maggie Zhang Signed-off-by: Jing Huang Signed-off-by: James Bottomley commit f16a17507b09e10e0cccc4d675ccbfe030d51ef1 Author: Maggie Zhang Date: Thu Dec 9 19:12:32 2010 -0800 [SCSI] bfa: remove all OS wrappers Remove OS wrapper functions/macros, and as a result remove bfa_os_inc.h. Signed-off-by: Maggie Zhang Signed-off-by: Jing Huang Signed-off-by: James Bottomley commit f314878ab95d4802ddde066096f7b30087cea7ba Author: Maggie Zhang Date: Thu Dec 9 19:11:39 2010 -0800 [SCSI] bfa: remove all SCSI IO callbacks Remove SCSI IO callbacks, and as a result remove bfa_cb_ioim.h. Signed-off-by: Maggie Zhang Signed-off-by: Jing Huang Signed-off-by: James Bottomley commit e3e7d3eebb08735c8a14cd27f76dac784e9a9b75 Author: Maggie Zhang Date: Thu Dec 9 19:10:27 2010 -0800 [SCSI] bfa: scatter gather processing change Modified scatter gather processing to use the kernel provided scsi_for_each_sg() macro. 1) Instead of allocating and setting up sgpg in bfa_ioim_sge_setup(), we only do allocation. As a result, we remove bfa_ioim_sgpg_setup() and rename bfa_ioim_sge_setup() to bfa_ioim_sgpg_alloc(). 2) bfa_ioim_send_ioreq() call scsi_for_each_sg() to handle both inline and sgpg setup. Signed-off-by: Maggie Zhang Signed-off-by: Jing Huang Signed-off-by: James Bottomley commit b77ee1fb10e4b76dc61094b3678d805be0e4f7ba Author: Maggie Zhang Date: Thu Dec 9 19:09:26 2010 -0800 [SCSI] bfa: remove a file with small size Removed bfa_drv.c, merged it to bfa_core.c and modified Makefile. Signed-off-by: Maggie Zhang Signed-off-by: Jing Huang Signed-off-by: James Bottomley commit f7f73812e95077c19a2801bbf4f483fcdab5232f Author: Maggie Zhang Date: Thu Dec 9 19:08:43 2010 -0800 [SCSI] bfa: clean up one line functions Cleaned up one line functions. Signed-off-by: Maggie Zhang Signed-off-by: Jing Huang Signed-off-by: James Bottomley commit df0f1933eb5454a5c481311837076056557467ad Author: Maggie Zhang Date: Thu Dec 9 19:07:46 2010 -0800 [SCSI] bfa: remove unused and empty functions Removed unused and empty functions. Signed-off-by: Maggie Zhang Signed-off-by: Jing Huang Signed-off-by: James Bottomley commit 402c6eec1bd04581c04de758e4efddc020b78f91 Author: Robert Jennings Date: Thu Dec 9 14:03:59 2010 -0600 [SCSI] ibmvfc: Improve ibmvfc_async_desc memory layout By changing field ordering we can avoid a couple of memory holes in the tables that use the ibmvfc_async_desc structure. Signed-off-by: Robert Jennings Acked-by: Brian King Signed-off-by: James Bottomley commit 058548ae23f5811d0ccdb39d5ad40f078aca63ef Author: Stephen Hemminger Date: Thu Dec 9 09:37:56 2010 -0800 [SCSI] iscsi: add module alias Since iscsi transport can be built as a module and uses netlink socket to communicate. The module should have an alias to autoload when socket of NETLINK_ISCSI type is requested. Signed-off-by: Stephen Hemminger Acked-by: Mike Christie Signed-off-by: James Bottomley commit 0d81b4e8dcc4177726f30a1ac8df1f726d2a7c0c Author: Christof Schmitt Date: Wed Dec 8 17:30:46 2010 +0100 [SCSI] zfcp: Add allow_lun_scan module parameter The zfcpdump tool requires a method to attach exactly one LUN. The easiest way to achieve this is to add a new zfcp module parameter. When allow_lun_scan is set to "false", zfcp only accepts LUNs that have been configured through the unit_add sysfs interface. Reviewed-by: Swen Schillig Signed-off-by: Christof Schmitt Signed-off-by: James Bottomley commit 51780d2c38a7294c2c302ae9d2ea517bd4153dec Author: Christof Schmitt Date: Thu Dec 2 15:16:18 2010 +0100 [SCSI] zfcp: Add __init declaration to zfcp_cache_hw_align The function zfcp_cache_hw_align is only called from zfcp_module_init, so it should be declared with __init as well. Reviewed-by: Steffen Maier Signed-off-by: Christof Schmitt Signed-off-by: James Bottomley commit 3d63d3b4fb5fb3674f2d97725e187cbfa22562bc Author: Christof Schmitt Date: Thu Dec 2 15:16:17 2010 +0100 [SCSI] zfcp: Move qdio setup from erp to zfcp_qdio.c Initialization of the qdio waitqueue should happen when the qdio data is initialized and the QDIOUP flag should be handled in the qdio code as well. Adjust the code accordingly and remove the superfluos function zfcp_erp_adapter_strategy_open_qdio. Reviewed-by: Steffen Maier Signed-off-by: Christof Schmitt Signed-off-by: James Bottomley commit ea4a3a6ac40e2a585654808d4aefb39a6d57dca0 Author: Swen Schillig Date: Thu Dec 2 15:16:16 2010 +0100 [SCSI] zfcp: Redesign of the debug tracing final cleanup. This patch is the final cleanup of the redesign from the zfcp tracing. Structures and elements which were used by multiple areas of the former debug tracing are now changed to the new scheme. Signed-off-by: Swen Schillig Signed-off-by: Christof Schmitt Signed-off-by: James Bottomley commit 250a1352b95e1db3216e5c5d4f4365bea5122f4a Author: Swen Schillig Date: Thu Dec 2 15:16:15 2010 +0100 [SCSI] zfcp: Redesign of the debug tracing for SCSI records. This patch is the continuation to redesign the zfcp tracing to a more straight-forward and easy to extend scheme. This patch deals with all trace records of the zfcp SCSI area. Signed-off-by: Swen Schillig Signed-off-by: Christof Schmitt Signed-off-by: James Bottomley commit a54ca0f62f953898b05549391ac2a8a4dad6482b Author: Swen Schillig Date: Thu Dec 2 15:16:14 2010 +0100 [SCSI] zfcp: Redesign of the debug tracing for HBA records. This patch is the continuation to redesign the zfcp tracing to a more straight-forward and easy to extend scheme. This patch deals with all trace records of the zfcp HBA area. Signed-off-by: Swen Schillig Signed-off-by: Christof Schmitt Signed-off-by: James Bottomley commit 2c55b750a884b86dea8b4cc5f15e1484cc47a25c Author: Swen Schillig Date: Thu Dec 2 15:16:13 2010 +0100 [SCSI] zfcp: Redesign of the debug tracing for SAN records. This patch is the continuation to redesign the zfcp tracing to a more straight-forward and easy to extend scheme. This patch deals with all trace records of the zfcp SAN area. Signed-off-by: Swen Schillig Signed-off-by: Christof Schmitt Signed-off-by: James Bottomley commit ae0904f60fab7cb20c48d32eefdd735e478b91fb Author: Swen Schillig Date: Thu Dec 2 15:16:12 2010 +0100 [SCSI] zfcp: Redesign of the debug tracing for recovery actions. The tracing environment of the zfcp LLD has become very bulky and hard to maintain. Small changes involve a large modification process which is error-prone and not effective. This patch is the first of a set to redesign the zfcp tracing to a more straight-forward and easy to extend scheme. It removes all interpretation and visualization parts and focuses on bare logging of the information. This patch deals with all trace records of the zfcp error recovery. Signed-off-by: Swen schillig Signed-off-by: Christof Schmitt Signed-off-by: James Bottomley commit 6b57b159709dcb4d53e64738f2d1f73b36e41601 Author: Vikas Chaudhary Date: Thu Dec 2 22:13:00 2010 -0800 [SCSI] qla4xxx: Update driver version to 5.02.00-k5 Signed-off-by: Vikas Chaudhary Signed-off-by: Ravi Anand Signed-off-by: James Bottomley commit 7d01d0698f450ed8cc9fd4557f88a3309c868d44 Author: Vikas Chaudhary Date: Thu Dec 2 22:12:51 2010 -0800 [SCSI] qla4xxx: Updated the Copyright header Signed-off-by: Vikas Chaudhary Signed-off-by: Ravi Anand Signed-off-by: James Bottomley commit 3930b8c1f3582d43757cbcc9b7ecaf05f6b4a66e Author: Vikas Chaudhary Date: Thu Dec 2 22:12:47 2010 -0800 [SCSI] qla4xxx: do not reset hba if ql4xdontresethba is set Signed-off-by: Vikas Chaudhary Signed-off-by: Ravi Anand Signed-off-by: James Bottomley commit d56a1f7b39631806ee3d49445a65da6288b099b4 Author: Lalit Chandivade Date: Thu Dec 2 22:12:45 2010 -0800 [SCSI] qla4xxx: do not check for fw hung if reset retry is in progress Signed-off-by: Vikas Chaudhary Signed-off-by: Lalit Chandivade Signed-off-by: Ravi Anand Signed-off-by: James Bottomley commit e128271b7bcb9c8955cadbf2e18f8af288979e6b Author: Prasanna Mumbai Date: Thu Dec 2 22:12:43 2010 -0800 [SCSI] qla4xxx: cache new IP address acquired via DHCP Prior to firmware state change from ACQUIRING to READY, an 0x8029 AEN is received. Added code to check previous state being ACQUIRING in order to update the ip address in the driver. Signed-off-by: Vikas Chaudhary Signed-off-by: Prasanna Mumbai Signed-off-by: Ravi Anand Signed-off-by: James Bottomley commit 4cd83cbef878b5d0d4c65ac0a20d12a8bf9f551d Author: Lalit Chandivade Date: Thu Dec 2 22:12:40 2010 -0800 [SCSI] qla4xxx: Fail initialization if qla4_8xxx_pci_mem_write_2M fails Since if fw load is failing, running on incomplete fw load would be fatal. Signed-off-by: Vikas Chaudhary Signed-off-by: Lalit Chandivade Signed-off-by: Ravi Anand Signed-off-by: James Bottomley commit fe998527e3f1f5a6eeab5baa23ac2b60ae47e96b Author: Lalit Chandivade Date: Thu Dec 2 22:12:36 2010 -0800 [SCSI] qla4xxx: put device in FAILED state for 82XX initialization failure Signed-off-by: Vikas Chaudhary Signed-off-by: Lalit Chandivade Signed-off-by: Ravi Anand Signed-off-by: James Bottomley commit e6b07df8b0f1530a8ed606f6f464487520d74ad9 Author: Lalit Chandivade Date: Thu Dec 2 22:12:27 2010 -0800 [SCSI] qla4xxx: do not process interrupt unconditionally in mailbox command do not process interrupt unconditionally, process interrupt only in polling mode Signed-off-by: Vikas Chaudhary Signed-off-by: Lalit Chandivade Signed-off-by: Ravi Anand Signed-off-by: James Bottomley commit 6790d4fecf4373016e2983f913bcc0f1cdfa8ca0 Author: Karen Higgins Date: Thu Dec 2 22:12:22 2010 -0800 [SCSI] qla4xxx: use correct fw_ddb_index in abort task Signed-off-by: Vikas Chaudhary Signed-off-by: Karen Higgins Signed-off-by: Ravi Anand Signed-off-by: James Bottomley commit a1fc26baae41e00a3ecfd99bbe91aa2435045625 Author: Swapnil Nagle Date: Thu Dec 2 22:12:15 2010 -0800 [SCSI] qla4xxx: memory wedge with peg_halt test in loop Signed-off-by: Swapnil Nagle Signed-off-by: Vikas Chaudhary Signed-off-by: Ravi Anand Signed-off-by: James Bottomley commit 61391d314e856030b2b40b5d6ea22b93de0f1fed Author: Shyam Sundar Date: Thu Dec 2 22:12:08 2010 -0800 [SCSI] qla4xxx: initialize MSI in correct way IRQF_SHARED flag should not be set when calling request_irq for MSI since this interrupt mechanism cannot be shared like standard INTx Signed-off-by: Vikas Chaudhary Signed-off-by: Shyam Sundar Signed-off-by: Ravi Anand Signed-off-by: James Bottomley commit 3e1350c4dc8900476c4db2066c00f13e9e939817 Author: Vikas Chaudhary Date: Thu Dec 2 22:12:03 2010 -0800 [SCSI] qla4xxx: Drop use of IRQF_DISABLE IRQF_DISABLE flag is deprecated and this flag is a NOOP in kernel. Signed-off-by: Vikas Chaudhary Signed-off-by: Ravi Anand Signed-off-by: James Bottomley commit 5f0e385fdafb7d6c8ded6464fa6421c735d96caf Author: Joe Eykholt Date: Tue Nov 30 16:20:18 2010 -0800 [SCSI] libfc: fix statistics for FCP input/output megabytes The statistics for InputMegabytes and OutputMegabytes are misnamed. They're accumulating bytes, not megabytes. The statistic returned via /sys must be in megabytes, however, which is what the HBA-API wants. The FCP code needs to accumulate it in bytes and then divide by 1,000,000 (not 2^20) before it presented via sysfs. This affects fcoe.ko only, not fnic. The fnic driver correctly by accumulating bytes and then converts to megabytes. I checked that libhbalinux is using the /sys file directly without conversion. BTW, qla2xxx does divide by 2^20, which I'm not fixing here. Signed-off-by: Joe Eykholt Signed-off-by: Robert Love Signed-off-by: James Bottomley commit ba9cd5d095b42271588c20ccd6ddd561d0e4cc1e Author: Joe Eykholt Date: Tue Nov 30 16:20:12 2010 -0800 [SCSI] libfcoe: change fip_select to return new FCF Neaten several calls to fip_select() by having it return the pointer to the new FCF. Signed-off-by: Joe Eykholt Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 981c1154b240ee77133a478fcd3853ac18111672 Author: Joe Eykholt Date: Tue Nov 30 16:20:07 2010 -0800 [SCSI] libfcoe: reorder FCF list to put latest advertiser first When there are several FCFs to choose from, the one most likely to accept a FLOGI on certian switches is the one that last answered a multicast solicit. So, when receiving an advertisement, move the FCF to the front of the list so that it gets chosen first among those with the same priority. Without this, more FLOGIs need to be sent in a test with multiple FCFs and a switch in NPV mode, but it still eventually finds one that accepts the FLOGI. Signed-off-by: Joe Eykholt Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 9069f5c433e402be5707f37f3d0dfb376659c1e4 Author: Joe Eykholt Date: Tue Nov 30 16:20:02 2010 -0800 [SCSI] libfcoe: add debug message for FCF destination MAC When multiple FCFs to the same fabric exist, the debug messages all look alike. Change the message to include the MAC address. Signed-off-by: Joe Eykholt Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 794d98e77f5901ceded697f1633463e88f078038 Author: Joe Eykholt Date: Tue Nov 30 16:19:56 2010 -0800 [SCSI] libfcoe: retry rejected FLOGI to another FCF if possible Switches using multiple-FCFs may reject FLOGI in order to balance the load between multiple FCFs. Even though the FCF was available, it may have more load at the point we actually send the FLOGI. If the FLOGI fails, select a different FCF if possible, among those with the same priority. If no other FCF is available, just deliver the reject to libfc for retry. Signed-off-by: Joe Eykholt Signed-off-by: Robert Love Signed-off-by: James Bottomley commit b69ae0ae3f322d9a6bc4e209049b5b6e193ad652 Author: Joe Eykholt Date: Tue Nov 30 16:19:51 2010 -0800 [SCSI] libfcoe: fix checking of conflicting fabrics in fcoe_ctlr_select() The check for conflicting fabrics in fcoe_ctlr_select() ignores any FCFs that aren't usable. This is a minor problem now but becomes more pronounced after later patches. Signed-off-by: Joe Eykholt Signed-off-by: Robert Love Signed-off-by: James Bottomley commit c47036a7cd378533495d8cc06a7cf8a881072a9d Author: Joe Eykholt Date: Tue Nov 30 16:19:46 2010 -0800 [SCSI] libfcoe: move some timer code to make it reusable. Move some of the code in fcoe_ctlr_timer_work() to fcoe_ctlr_select() so that it can be shared with another function in a forthcoming patch. Signed-off-by: Joe Eykholt Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 69316ee2e375c5af0cf1f8d2d30f9aa277f0b454 Author: Joe Eykholt Date: Tue Nov 30 16:19:40 2010 -0800 [SCSI] libfcoe: update FIP FCF announcements Move the announcement code to a separate function for reuse in a forthcoming patch. For messages regarding FCF timeout and selection, use the previously-announced FCF MAC address (dest_addr) in the fcoe_ctlr struct. Only print (announce) the FCF if it is new. Print MAC for timed-out or deselected FCFs. Signed-off-by: Joe Eykholt Signed-off-by: Robert Love Signed-off-by: James Bottomley commit b5fe5e953c65cd0ec4e9ffd001072700e5b89317 Author: Yi Zou Date: Tue Nov 30 16:19:35 2010 -0800 [SCSI] libfc: fix fc_tm_done not freeing the allocated fsp pkt Frame should be freed in fc_tm_done, this is an updated patch on the one initially submitted by Hillf Danton. Signed-off-by: Hillf Danton Signed-off-by: Yi Zou Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 3a91090fe0df10091c5612db8528ee7a822ab83d Author: Yi Zou Date: Tue Nov 30 16:19:30 2010 -0800 [SCSI] libfc: the timeout for the REC itself is 2 * R_A_TOV_els The timeout for the exchange carrying REC itself is 2 * R_A_TOV_els. Signed-off-by: Yi Zou Signed-off-by: Robert Love Signed-off-by: James Bottomley commit ea3e2e72eeb3e8a9440a5da965914f9b12088626 Author: Yi Zou Date: Tue Nov 30 16:19:25 2010 -0800 [SCSI] libfc: fix exchange being deleted when the abort itself is timed out Should not continue when the abort itself is being timeout since in that case the exchange will be deleted and relesased. We still want to call the associated response handler to let the layer, e.g., fcp, know the exchange itself is being timed out. Signed-off-by: Yi Zou Signed-off-by: Robert Love Signed-off-by: James Bottomley commit d889b30a9196c453120ca54323fe80acb4c27b94 Author: Yi Zou Date: Tue Nov 30 16:19:20 2010 -0800 [SCSI] libfc: do not fc_io_compl on fsp w/o any scsi_cmnd associated Do not call fc_io_compl() on fsp w/o any scsi_cmnd, e.g., lun reset is built inside fc_fcp, not from a scsi command from queuecommnd from scsi-ml, so in in case target is buggy that is invalid flags in the FCP_RSP, as we have seen in some SAN Blaze target where all bits in flags are 0, we do not want to call io_compl on this fsp. [ Comment block added by Robert Love ] Signed-off-by: Yi Zou Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 9b90dc80ba2e566a48585174b1e5ab00e16f0456 Author: Yi Zou Date: Tue Nov 30 16:19:15 2010 -0800 [SCSI] libfc: add print of exchange id for debugging fc_fcp This is very helpful to match up the corresponding exchange to the actual I/O described by the fsp, particularly when you do a side-by-side comparison of the syslog with your trace. Signed-off-by: Yi Zou Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 11aa99001afdbe5fe152e833aa1fea82b85dbeda Author: Joe Perches Date: Tue Nov 30 16:19:09 2010 -0800 [SCSI] drivers/scsi/fcoe: Update WARN uses Add missing newlines. Signed-off-by: Joe Perches Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 0e9e3d3b155c35d5750805c2b8bb6d5b6e6a3bfb Author: Hillf Danton Date: Tue Nov 30 16:19:04 2010 -0800 [SCSI] libfc: fix memory leakage in remote port There seems rdata should get put before return. Signed-off-by: Hillf Danton Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 72e0daad555bc0ca2e7abd68593087d098d866a8 Author: Hillf Danton Date: Tue Nov 30 16:18:59 2010 -0800 [SCSI] libfc: fix memory leakage in local port There seems info should get freed when error encountered. Signed-off-by: Hillf Danton Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 2d6dfb005e24d7e3404f4c0d333a94b050059173 Author: Hillf Danton Date: Tue Nov 30 16:18:54 2010 -0800 [SCSI] libfc: fix memory leakage in local port There seems info should get freed when error encountered. Signed-off-by: Hillf Danton Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 05fee645e96e732a79ad083cab8ddd4efd108e2c Author: john fastabend Date: Tue Nov 30 16:18:49 2010 -0800 [SCSI] libfc: remove tgt_flags from fc_fcp_pkt struct We can easily remove the tgt_flags from fc_fcp_pkt struct and use rpriv->tgt_flags directly where needed. Signed-off-by: John Fastabend Signed-off-by: Robert Love Signed-off-by: James Bottomley commit e0883a3c3e7766b390971a49bf728004816c9520 Author: john fastabend Date: Tue Nov 30 16:18:44 2010 -0800 [SCSI] libfc: use rport timeout values for fcp recovery Use the rport value for rec_tov for timeout values when sending fcp commands. Currently, defaults are being used which may or may not match the advertised values. The default may cause i/o to timeout on networks that set this value larger then the default value. To make the timeout more configurable in the non-REC mode we remove the FC_SCSI_ER_TIMEOUT completely allowing the scsi-ml to do the timeout. This removes an unneeded timer and allows the i/o timeout to be configured using the scsi-ml knobs. Signed-off-by: John Fastabend Signed-off-by: Robert Love Signed-off-by: James Bottomley commit ac17ea8d7d45d0495316edff13faa0dfd6bb2225 Author: john fastabend Date: Tue Nov 30 16:18:39 2010 -0800 [SCSI] libfc: incorrect scsi host byte codes returned to scsi-ml The fcp packet recovery handler fc_fcp_recover() is called when errors occurr in a fcp session. Currently it is generically setting the status code to FC_CMD_RECOVERY for all error types. This results in DID_BUS_BUSY errors being returned to the scsi-ml. DID_BUS_BUSY errors indicate "BUS stayed busy through time out period" according to scsi.h. Many of the error reported by fc_rcp_recovery() are pkt errors. Here we update fc_fcp_recovery to use better host byte codes. With certain FAST FAIL flags set DID_BUS_BUSY and DID_ERROR will have different behaviors this was causing dm multipath to fail quickly in some cases where a retry would be a better action. Signed-off-by: John Fastabend Signed-off-by: Robert Love Signed-off-by: James Bottomley commit e90ff5ef0aab1d40f0e92a44d66f8d45a20d8c95 Author: Hillf Danton Date: Tue Nov 30 16:18:33 2010 -0800 [SCSI] libfc: fix stats computation in fc_queuecommand() There seems accumulation needed. Signed-off-by: Hillf Danton Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 530994d69e5b6b4eca2db4a21b6d945d13646053 Author: Hillf Danton Date: Tue Nov 30 16:18:28 2010 -0800 [SCSI] libfc: fix mem leak in fc_seq_assign() There is a typo cleaned, which triggers memory leakage. Signed-off-by: Hillf Danton Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 3c2c3bf23cbef8eed6cf815715d0bece5cb7b5ec Author: Robert Love Date: Tue Nov 30 16:18:23 2010 -0800 [SCSI] libfc: Fix incorrect locking and unlocking in FCP The error handler grabs the si->scsi_queue_lock, but in the case where the fsp pointer is NULL it releases the scsi_host lock. This can lead to a variety of system hangs depending on which is used first- the scsi_host lock or the scsi_queue_lock. This patch simply unlocks the correct lock when fcp is NULL. Signed-off-by: Robert Love Tested-by: Ross Brattain Signed-off-by: James Bottomley commit 2034c19ce8f8503aa14cb1e763fbfe60316aaa8e Author: Hillf Danton Date: Tue Nov 30 16:18:17 2010 -0800 [SCSI] libfc: tune fc_exch_em_alloc() to be O(2) For allocating new exch from pool, scanning for free slot in exch array fluctuates when exch pool is close to exhaustion. The fluctuation is smoothed, and the scan looks to be O(2). Signed-off-by: Hillf Danton Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 8236554a27af870ecd1cd588d9558ccdc212037b Author: Hillf Danton Date: Tue Nov 30 16:18:12 2010 -0800 [SCSI] libfc: fix mem leak in fc_exch_recv_seq_resp() There seems that ep should get released, or it will no longer get freed. Signed-off-by: Hillf Danton Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 80e736f8a37bebeb5bff18f2aec31caab4104b8b Author: Yi Zou Date: Tue Nov 30 16:18:07 2010 -0800 [SCSI] libfc: fix NULL pointer dereference bug in fc_fcp_pkt_release This happens when then tearing down the fcoe interface with active I/O. The back trace shows dead000000200200 in RAX, i.e., LIST_POISON2, indicating that the fsp is already being dequeued, which is probably why no complaining was seen in fc_fcp_destroy() about outstanding fsp not freed, since we dequeue it in the end of fc_io_compl() before releasing it. The bug is due to the fact that we have already destroyed lport's scsi_pkt_pool while on-going i/o is still accessing it through fc_fcp_pkt_release(), like this trace or the similar code path from scsi-ml to fc_eh_abort, etc. This is fixed by moving the fc_fcp_destroy() after lport is detached from scsi-ml since fc_fcp_destroy is supposed to called only once where no lport lock is taken, otherwise the fc_fcp_pkt_release() would have to grab the lport lock. BUG: unable to handle kernel NULL pointer dereference at (null) ....... RIP: 0010:[<0000000000000000>] [<(null)>] (null) RSP: 0018:ffff8803270f7b88 EFLAGS: 00010282 RAX: dead000000200200 RBX: ffff880197d2fbc0 RCX: 0000000000005908 RDX: ffff880195ea6d08 RSI: 0000000000000282 RDI: ffff880180f4fec0 RBP: ffff8803270f7bc0 R08: ffff880197d2fbe0 R09: 0000000000000000 R10: ffff88032867f090 R11: 0000000000000000 R12: ffff880195ea6d08 R13: 0000000000000282 R14: ffff880180f4fec0 R15: 0000000000000000 FS: 0000000000000000(0000) GS:ffff8801b5820000(0000) knlGS:0000000000000000 CS: 0010 DS: 0018 ES: 0018 CR0: 000000008005003b CR2: 0000000000000000 CR3: 00000001a6eae000 CR4: 00000000000006e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Process fc_rport_eq (pid: 5278, threadinfo ffff8803270f6000, task ffff880326254ab0) Stack: ffffffffa02c39ca ffff8803270f7ba0 ffff88019331cbc0 ffff880197d2fbc0 0000000000000000 ffff8801a8c895e0 ffff8801a8c895e0 ffff8803270f7c10 ffffffffa02c4962 ffff8803270f7be0 ffffffff814c94ab ffff8803270f7c10 Call Trace: [] ? fc_io_compl+0x10a/0x530 [libfc] [] fc_fcp_complete_locked+0x72/0x150 [libfc] [] ? _spin_unlock_bh+0x1b/0x20 [] ? fc_exch_done+0x3f/0x60 [libfc] [] fc_fcp_retry_cmd+0x4f/0x60 [libfc] [] fc_fcp_recv+0x9b0/0xc30 [libfc] [] ? _call_console_drivers+0x4a/0x80 [] ? lock_timer_base+0x3c/0x70 [] ? try_to_del_timer_sync+0x7b/0xe0 [] fc_exch_mgr_reset+0x1df/0x250 [libfc] [] ? fc_fcp_recv+0x0/0xc30 [libfc] [] fc_rport_work+0xf2/0x4e0 [libfc] [] ? prepare_to_wait+0x4e/0x80 [] ? fc_rport_work+0x0/0x4e0 [libfc] [] worker_thread+0x170/0x2a0 [] ? autoremove_wake_function+0x0/0x40 [] ? worker_thread+0x0/0x2a0 [] kthread+0x96/0xa0 [] child_rip+0xa/0x20 [] ? kthread+0x0/0xa0 [] ? child_rip+0x0/0x20 Code: Bad RIP value. RIP [<(null)>] (null) RSP CR2: 0000000000000000 Signed-off-by: Yi Zou Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 12137f5c28284cc51b5f50932c8d02a5823fcd3c Author: Hillf Danton Date: Tue Nov 30 16:18:01 2010 -0800 [SCSI] libfc: remove define of fc_seq_exch in fc_exch.c The define for fc_seq_exch is unnecessary, since it also appears in scsi/libfc.h Signed-off-by: Hillf Danton Signed-off-by: Robert Love Signed-off-by: James Bottomley commit 50444a340028119ce5ba45d60b4cf44e3e6e1b32 Author: Maggie Date: Mon Nov 29 18:26:32 2010 -0800 [SCSI] bfa: fix endianess sparse check warnings First round of fix for the endianess check warnings from make C=2 CF="-D__CHECK_ENDIAN__". Signed-off-by: Maggie Signed-off-by: James Bottomley commit 52f94b6fd0d1ff9d935c52f8a6360834ed871d92 Author: Maggie Date: Mon Nov 29 18:21:32 2010 -0800 [SCSI] bfa: fix regular sparse check warnings. Fix all sparse check warnings from make C=2. Signed-off-by: Maggie Signed-off-by: James Bottomley commit 3db86353abba4549f665fbdde8572d619566afbb Author: Eddie Wai Date: Tue Nov 23 15:29:32 2010 -0800 [SCSI] bnx2i: Updated version to 2.6.2.2 Signed-off-by: Eddie Wai Signed-off-by: James Bottomley commit 11cec1e2e9d94bcda3446f52a868a2099a2eba4f Author: Eddie Wai Date: Tue Nov 23 15:29:31 2010 -0800 [SCSI] bnx2i: Updated copyright and maintainer info Signed-off-by: Eddie Wai Signed-off-by: James Bottomley commit a91031a6526441ff36552d53363037c3bbca0c5b Author: Eddie Wai Date: Tue Nov 23 15:29:30 2010 -0800 [SCSI] bnx2i: Cleaned up various error conditions in ep_connect/disconnect Various error conditions inside ep_connect and ep_disconnect were either not being handled or not being handled correctly. This patch fixes all those issues. Signed-off-by: Eddie Wai Acked-by: Anil Veerabhadrappa Reviewed-by: Mike Christie Signed-off-by: James Bottomley commit bee348770dcaeafa57bbd32129ce0cb16a4342d6 Author: Eddie Wai Date: Tue Nov 23 15:29:29 2010 -0800 [SCSI] bnx2i: Added return code check for chip kwqe submission request Added the handling for cases when a chip request is made to the CNIC module but the hardware is not ready to accept. This would lead to many unnecessary wait timeouts. This code adds check in the connect establishment and destruction path. Signed-off-by: Eddie Wai Reviewed-by: Mike Christie Signed-off-by: James Bottomley commit 842158d7b7bc3b1a49c31f43ac20414234c33a8d Author: Eddie Wai Date: Tue Nov 23 15:29:28 2010 -0800 [SCSI] bnx2i: Modified the bnx2i stop path to compensate for in progress ops The stop path has been augmented to wait a max of 10s for all in progress offload and destroy activities to complete before proceeding to terminate all active connections (via iscsid or forcefully). Note that any new offload and destroy requests are now blocked and return to the caller immediately. Signed-off-by: Eddie Wai Acked-by: Anil Veerabhadrappa Reviewed-by: Benjamin Li Reviewed-by: Michael Chan Reviewed-by: Mike Christie Signed-off-by: James Bottomley commit 016ef69076f3e8f9e42f31152157f46812d25566 Author: Eddie Wai Date: Tue Nov 23 15:29:27 2010 -0800 [SCSI] bnx2i: Removed the dynamic registration of CNIC The code no longer needs to dynamically register and unregister the CNIC device. The CNIC device will be kept registered until module unload. Signed-off-by: Eddie Wai Reviewed-by: Michael Chan Reviewed-by: Mike Christie Signed-off-by: James Bottomley commit 7a2962c77ced218faeeb7b5eda48abfebc578df2 Author: Eddie Wai Date: Tue Nov 23 15:29:26 2010 -0800 [SCSI] bnx2i: Added mutex lock protection to conn_get_param Added net_dev mutex lock protection before accessing the csk parameters. Signed-off-by: Eddie Wai Reviewed-by: Benjamin Li Reviewed-by: Mike Christie Signed-off-by: James Bottomley commit 252e44805bcfff5de2e05dd126f69a18e0b760f0 Author: Eddie Wai Date: Tue Nov 23 15:29:25 2010 -0800 [SCSI] bnx2i: Allow to abort the connection if connect request times out In the situation where the connect completion response arrives after the connect request has already timed out, the connection was not being aborted but only the resource was being freed. This creates a problem for 5771X (10g) as the chip flags this with an assertion. This change will properly aborts the connection before freeing the resource. Signed-off-by: Eddie Wai Reviewed-by: Mike Christie Signed-off-by: James Bottomley commit 94810e824df1509ad3ba401e57f74b922fd928c5 Author: Eddie Wai Date: Tue Nov 23 15:29:24 2010 -0800 [SCSI] bnx2i: Fixed the remote TCP RST handling for the 570X (1g) Modified the handling of the remote TCP RST code so the chip can now flush the tx pipe accordingly upon a remote TCP RST reception. Signed-off-by: Eddie Wai Reviewed-by: Mike Christie Signed-off-by: James Bottomley commit 5bf3f39f9bda2750145a7da69ea9ae76d0054956 Author: Eddie Wai Date: Tue Nov 23 15:29:23 2010 -0800 [SCSI] bnx2i: Fixed a cid leak issue for 5771X (10g) A cid leak issue was found when the connect destroy request exceeded the driver's disconnection timeout. This will lead to a cid resource leak issue. The fix is to allow the cid cleanup even when this happens. Signed-off-by: Eddie Wai Acked-by: Anil Veerabhadrappa Reviewed-by: Michael Chan Reviewed-by: Mike Christie Signed-off-by: James Bottomley commit cf464fc5eb272f3f5964560ef2b8d632333afe0d Author: Eddie Wai Date: Tue Nov 23 15:29:22 2010 -0800 [SCSI] bnx2i: Fixed the endian bug in the TMF LUN cmd send Added a be32_to_cpu call for the TMF LUN wqe. Signed-off-by: Eddie Wai Reviewed-by: Mike Christie Signed-off-by: James Bottomley commit 8eea2f55a65b9471276e78e5c86ddd19c4c0365c Author: Eddie Wai Date: Tue Nov 23 15:29:21 2010 -0800 [SCSI] bnx2i: Added fix for NOP-Out response panic from unsolicited NOP-In The patch fixes the following situations where NOP-Out pkt is called for: - local unsolicited NOP-Out requests (requesting no NOP-In response) - local NOP-Out responses to unsolicited NOP-In requests kernel panic is observed due to double session spin_lock requests; one in the bnx2i_process_nopin_local_cmpl routine in bnx2i_hwi.c and the other in the iscsi_put_task routine in libiscsi.c The proposed fix is to export the currently static __iscsi_put_task() routine and have bnx2i call it directly instead of the iscsi_put_task() routine which holds the session spin lock. Signed-off-by: Eddie Wai Reviewed-by: Michael Chan Reviewed-by: Anil Veerabhadrappa Acked-by: Benjamin Li Reviewed-by: Mike Christie Signed-off-by: James Bottomley commit 5ee32576269f33b66c6dbc98144aead1e74a1e91 Author: Eddie Wai Date: Tue Nov 23 15:29:20 2010 -0800 [SCSI] bnx2i: Fixed bugs in the handling of unsolicited NOP-Ins Unsolicited NOP-Ins are placed in the receive queue of the hardware which requires to be read out regardless if the receive pipe is suspended or not. This patch adds the disposal of this RQ element under this condition. Also fixed the bug in the unsolicited NOP-In handling routine which checks for the RESERVED_ITT. Signed-off-by: Eddie Wai Reviewed-by: Michael Chan Reviewed-by: Benjamin Li Reviewed-by: Mike Christie Signed-off-by: James Bottomley commit f0cebfb0177f26e214adca3511f37c089d1317f8 Author: Kashyap, Desai Date: Sat Nov 13 04:42:28 2010 +0530 [SCSI] mpt2sas: Bump version 07.100.00.00 Signed-off-by: Kashyap Desai Signed-off-by: James Bottomley commit 37aaa78b8144d48d77bcd69a3353c88c0686df9e Author: Kashyap, Desai Date: Sat Nov 13 04:41:32 2010 +0530 [SCSI] mpt2sas: Debug string changes from target to device. Changing debug print to correct string. Signed-off-by: Kashyap Desai Signed-off-by: James Bottomley commit b41c09d1afc2708b3fab395085f538e1fce9b571 Author: Kashyap, Desai Date: Sat Nov 13 04:40:51 2010 +0530 [SCSI] mpt2sas: Sanity check for phy count is added using max phy count Fix oops loading driver when there is direct attached SEP device The driver set max phys count to the value reported in sas iounit page zero. However this page doesn't take into account additional virutal phys. When sas topology event arrives, the phy count is larger than expected, and the driver accesses memory array beyond the end of allocated space, then oops. Manufacturing page 8 contains the info on direct attached phys. For this fix will making sure that sas topology event is not processing phys greater than the expected phy count. Signed-off-by: Kashyap Desai Signed-off-by: James Bottomley commit a93c6b45df57332b1703e0dc6f99a1bafc17f5e3 Author: Kashyap, Desai Date: Sat Nov 13 04:39:11 2010 +0530 [SCSI] mpt2sas: change queue depth with reason argument more appropriately change_queue_depth callback API changed The change_queue_depth callback changed where there is now an additional parameter called reason, with SCSI_QDEPTH_DEFAULT, SCSI_QDEPTH_QFULL, and SCSI_QDEPTH_RAMP_UP codes. Signed-off-by: Kashyap Desai Signed-off-by: James Bottomley commit 90d2a672250b9d6e5c700f2d2c07c19d6fad064a Author: Kashyap, Desai Date: Sat Nov 13 04:37:36 2010 +0530 [SCSI] mpt2sas: Remove code for TASK_SET_FULL from driver. remove support for MPI2_EVENT_TASK_SET_FULL This event is obsoleted, so this processing of this event needs to be removed from the driver. The controller firmware is going to handle TASK_SET_FULL, the driver doesn't need to do anything. Even though we are removing the EVENT handling, the behavour has not changed between driver versions becuase fimrware will still be handling queue throttling, and retrying of commands when the target device queues are full. Signed-off-by: Kashyap Desai Signed-off-by: James Bottomley commit 7d061402590efc37d553a9155dbf41277675c179 Author: Kashyap, Desai Date: Sat Nov 13 04:36:14 2010 +0530 [SCSI] mpt2sas: MPI 2.0 Header updated MPI2 Rev header files. 1) Removed Task Set Full Event. Modified description of Disable SCSI Initiator Task Set Full Handling bit in the Flags field of IO Unit Page 1. Modified the descriptions for the three queue depth fields in SAS IO Unit Page 1. (2) Added new value for the Current Operation bits of the Flags field in the RAID Volume Indicator Structure to indicate that the Make Data Consistent operation is running. (3) Added a value of 0x6 to various SAS link rate fields to indicate an attached PHY that is not using any commonly supported settings. (4) Added Volume Not Consistent bit to the VolumeStatusFlags field of RAID Volume Page 0. (5) Added a new value for the IncompatibleReason field of RAID Physical Disk Page 0 to indicate an incompatible media type. (6) Added Diagnostic Data Upload tool for the Toolbox Request. Signed-off-by: Kashyap Desai Signed-off-by: James Bottomley commit 7f6f794dee50ba33710145140f39de59f5ec764e Author: Kashyap, Desai Date: Sat Nov 13 04:35:30 2010 +0530 [SCSI] mpt2sas: Modify code to support Expander switch Issue : Switch swap doesn't work when device missing delay is enabled. (1) add support to individually add and remove phys to and from existing ports. This replaces the routine _transport_delete_duplicate_port. (2) _scsih_sas_host_refresh - was modified to change the link rate from zero to 1.5 GB rate when the firmware reports there is an attached device with zero link. (3) add new function mpt2sas_device_remove, this is wrapper function deletes some redundant code through out driver by combining into one subrountine (4) two subroutines were modified so the sas_device, raid_device, and port lists are traversed once when objects are deleted from the list. Previously it was looping back each time an object was deleted from the list. Signed-off-by: Kashyap Desai Signed-off-by: James Bottomley commit 35f805b52c94f8e6cb22907ef32517132a15cb96 Author: Kashyap, Desai Date: Sat Nov 13 04:34:06 2010 +0530 [SCSI] mpt2sas: Create a pool of chain buffer instead of dedicated per IOs Create a pool of chain buffers, instead of dedicated per IO: This enahancment is to address memory allocation failure when asking for more than 2300 IOs per host. There is just not enough contiquious DMA physical memory to make one single allocation to hold both message frames and chain buffers when asking for more than 2300 request. In order to address this problem we will have to allocate memory for each chain buffer in a seperate individual memory allocation, placing each chain element of 128 bytes onto a pool of available chains, which can be shared amoung all request. Signed-off-by: Kashyap Desai Signed-off-by: James Bottomley commit 6cb8ef573fd4c2bd72248f492fe336133660148d Author: Kashyap, Desai Date: Sat Nov 13 04:32:18 2010 +0530 [SCSI] mpt2sas: Added loadtime para for IOMissingDelay and DMD Ability to override/set the ReportDeviceMissingDelay and IODeviceMissingDelay from driver: Add new command line option missing_delay, this is an array, where the first element is the device missing delay, and the second element is io missing delay. The driver will program sas iounit page 1 with the new setting when the driver loads. This is programmed to the current and persistent configuration page so this takes immediately, as will be sticky across host reboots. Signed-off-by: Kashyap Desai Signed-off-by: James Bottomley commit dd3741d30300f9cf1adc046773a4bb87252d96ac Author: Kashyap, Desai Date: Sat Nov 13 04:31:14 2010 +0530 [SCSI] mpt2sas: Added sanity check for cb_idx and smid access. Sometime it is seen that controller firmware returns an invalid system message id (smid). the oops is occurring becuase mpt_callbacks pointer is referenced to either null or invalid virtual address. this is due to cb_idx set incorrectly from routine _base_get_cb_idx. the cb_idx was set incorrectly becuase there is no check to make sure smid is less than maxiumum anticapted smid. to fix this issue, we add a check in _base_get_cb_idx to make sure smid is not greater than ioc->hba_queue_depth. in addition, a similar check was added to make sure the reply address was less than the largest anticapated address. Newer firmware has sovled this issue, however it good to have this sanity check. Signed-off-by: Kashyap Desai Signed-off-by: James Bottomley commit 363fa50fc35357b1361fb63b0726335de993374a Author: Kashyap, Desai Date: Sat Nov 13 04:29:20 2010 +0530 [SCSI] mpt2sas: Removed compiler warnnings when logging is disabled The compiler throws warning messages while compiling without CONFIG_SCSI_MPT2SAS_LOGGING. Set proper ifdef for CONFIG_SCSI_MPT2SAS_LOGGING to avoid warnnings. Signed-off-by: Kashyap Desai Signed-off-by: James Bottomley commit 1f768e91e1fcd9f0df657783847347a833fdc573 Author: James Smart Date: Sat Nov 20 23:12:11 2010 -0500 [SCSI] lpfc 8.3.19: Update lpfc driver version to 8.3.19 Signed-off-by: Alex Iannicelli Signed-off-by: James Smart Signed-off-by: James Bottomley commit eb7a339e67dceec30f70a5cbed8e2bf6d8318f20 Author: James Smart Date: Sat Nov 20 23:12:02 2010 -0500 [SCSI] lpfc 8.3.19: Change heartbeat to default to disabled Signed-off-by: Alex Iannicelli Signed-off-by: James Smart Signed-off-by: James Bottomley commit 19ca760979e4be41a3eb215fb8d0e96637161947 Author: James Smart Date: Sat Nov 20 23:11:55 2010 -0500 [SCSI] lpfc 8.3.19: Added support for ELS RRQ command Added support for ELS RRQ command - Add new routine lpfc_set_rrq_active() to track XRI qualifier state. - Add new module parameter lpfc_enable_rrq to control RRQ operation. - Add logic to ELS RRQ completion handler and xri qualifier timeout to clear XRI qualifier state. - Use OX_ID from XRI_ABORTED_CQE for RRQ payload. - Tie abort and XRI_ABORTED_CQE andler to RRQ generation. Signed-off-by: Alex Iannicelli Signed-off-by: James Smart Signed-off-by: James Bottomley commit 76a95d75ede64e4f1684ddb8c626fdfdb641bda2 Author: James Smart Date: Sat Nov 20 23:11:48 2010 -0500 [SCSI] lpfc 8.3.19: Add SLI4 FC Discovery support Add SLI4 FC Discovery support - Replace READ_LA and READ_LA64 with READ_TOPOLOGY mailbox command. - Converted the old READ_LA structure to use bf_set/get instead of bit fields. - Rename HBA_FCOE_SUPPORT flag to HBA_FCOE_MODE. Flag now indicates function is running as SLI-4 FC or FCoE port. Make sure flag reset each time READ_REV completed as it can dynamically change. - Removed BDE union in the READ_TOPOLOGY mailbox command and added a define to define the ALPA MAP SIZE. Added FC Code for async events. - Added code to support new 16G link speed. - Define new set of values to keep track of valid user settable link speeds. - Used new link speed definitions to define link speed max and bitmap. - Redefined FDMI Port sppeds to be hax values and added the 16G value. - Added new CQE trailer code for FC Events. - Add lpfc_issue_init_vfi and lpfc_init_vfi_cmpl routines. - Replace many calls to the initial_flogi routine with lpfc_issue_init_vfi. - Add vp and vpi fields to the INIT_VFI mailbox command. - Addapt lpfc_hba_init_link routine for SLI4 use. - Use lpfc_hba_init_link call from lpfc_sli4_hba_setup. - Add a check for FC mode to register the FCFI before init link. - Convert lpfc_sli4_init_vpi to be called without a vpi (get it from vport). Signed-off-by: Alex Iannicelli Signed-off-by: James Smart Signed-off-by: James Bottomley commit 085c647c3377c3e39c8c572278507b1e1c7e7bf7 Author: James Smart Date: Sat Nov 20 23:11:37 2010 -0500 [SCSI] lpfc 8.3.19: Add latest SLI4 Hardware initialization support - Add the Lancer FC and FCoE PCI IDs - Add new SLI4 INTF register definitions - Implement new SLI4 doorbell register Signed-off-by: Alex Iannicelli Signed-off-by: James Smart Signed-off-by: James Bottomley commit 63e801ce685d151c5faca8f491adc2ad2e732259 Author: James Smart Date: Sat Nov 20 23:14:19 2010 -0500 [SCSI] lpfc 8.3.19: Fix critical errors and crashes Fix critical errors and crashes - Replace LOF_SECURITY with LOG_SECURITY - When calculating diag test memory size, use full size with header. - Return LS_RJT with status=UNSUPPORTED on unrecognized ELS's - Correct NULL pointer dereference when lpfc_create_vport_work_array() returns NULL. - Added code to handle CVL when port is in LPFC_VPORT_FAILED state. - In lpfc_do_scr_ns_plogi, check the nodelist for FDMI_DID and reuse the resource. - Check for generic request 64 and calculate the sgl offset for the request and reply sgls, also calculate the xmit length using only the request bde. Signed-off-by: Alex Iannicelli Signed-off-by: James Smart Signed-off-by: James Bottomley commit 98db519573e805f9f7e988fb5661da951fcb16b1 Author: James Bottomley Date: Mon Oct 25 15:53:41 2010 -0500 [SCSI] fix id computation in scsi_eh_target_reset() The current code in scsi_eh_target_reset() has an off by one error that actually sends spurious extra resets. Since there's no real need to reset the targets in numerical order, simply chunk up the command recovery list doing target resets and pulling matching targets out of the list (that also makes the loop O(N) instead of O(N^2). [mike christie found and fixed a list_splice -> list_splice_init problem] Reported-by: Hillf Danton Signed-off-by: James Bottomley commit 110def851fc823bb1a4584cb6308e30e5ffb3e05 Author: Wayne Boyer Date: Thu Nov 4 09:36:16 2010 -0700 [SCSI] ipr: fix mailbox register definition and add a delay before reading The definition for the mailbox register for new adapters was incorrect. The value has been updated to the correct offset. After an adapter reset, the mailbox register on the new adapters takes a number of seconds to stabilize. A delay has been added before reading the register. Signed-off-by: Wayne Boyer Acked-by: Brian King Signed-off-by: James Bottomley commit 0cb992eda1f7e7672775032378690baa87c0e13d Author: Wayne Boyer Date: Thu Nov 4 09:35:58 2010 -0700 [SCSI] ipr: fix lun assignment and comparison The lun value was not getting set up correctly for all devices attached to the new 64 bit adapters. The fix is to move the logic to earlier in the ipr_init_res_entry routine such that the value does get set correctly for all devices. Then the ipr_is_same_device comparison function was using the wrong lun value in the logic for the new adapters. Change this to use the correct lun value. Signed-off-by: Wayne Boyer Acked-by: Brian King Signed-off-by: James Bottomley commit 24d720b726c1a85f1962831ac30ad4d2ef8276b1 Author: Luben Tuikov Date: Fri Oct 22 21:24:36 2010 -0700 [SCSI] Retrieve the Caching mode page Some kernel transport drivers unconditionally disable retrieval of the Caching mode page. One such for example is the BBB/CBI transport over USB.  Such a restraint is too harsh as some devices do support the Caching mode page. Unconditionally enabling the retrieval of this mode page over those transports at their transport code level may result in some devices failing and becoming unusable. This patch implements a method of retrieving the Caching mode page without unconditionally enabling it in the transports which unconditionally disable it. The idea is to ask for all supported pages, page code 0x3F, and then search for the Caching mode page in the mode parameter data returned. The sd driver already asks for all the mode pages supported by the attached device by setting the page code to 0x3F in order to find out if the media is write protected by reading the WP bit in the Device Specific Parameter field. It then attempts to retrieve only the Caching mode page by setting the page code to 8 and actually attempting to retrieve it if and only if the transport allows it. The method implemented here is that if the transport doesn't allow retrieval of the Caching mode page and the device is not RBC, then we ask for all pages supported by setting the page code to 0x3F (similarly to how the WP bit is retrieved above), and then we search for the Caching mode page in the mode parameter data returned. With this patch, devices over SATA, report this (no change): Oct 22 18:45:58 localhost kernel: sd 0:0:0:0: [sda] 976773168 512-byte logical blocks: (500 GB/465 GiB) Oct 22 18:45:58 localhost kernel: sd 0:0:0:0: Attached scsi generic sg0 type 0 Oct 22 18:45:58 localhost kernel: sd 0:0:0:0: [sda] Write Protect is off Oct 22 18:45:58 localhost kernel: sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00 Oct 22 18:45:58 localhost kernel: sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA Smart devices report their Caching mode page. This is a change where we'd previously see the kernel making assumption about the device's cache being write-through: Oct 22 18:45:58 localhost kernel: sd 6:0:0:0: Attached scsi generic sg2 type 0 Oct 22 18:45:58 localhost kernel: sd 6:0:0:0: [sdb] 610472646 4096-byte logical blocks: (2.50 TB/2.27 TiB) Oct 22 18:45:58 localhost kernel: sd 6:0:0:0: [sdb] Write Protect is off Oct 22 18:45:58 localhost kernel: sd 6:0:0:0: [sdb] Mode Sense: 47 00 10 08 Oct 22 18:45:58 localhost kernel: sd 6:0:0:0: [sdb] Write cache: enabled, read cache: enabled, supports DPO and FUA And "dumb" devices over BBB, are correctly shown not to support reporting the Caching mode page: Oct 22 18:49:06 localhost kernel: sd 7:0:0:0: [sdc] 15663104 512-byte logical blocks: (8.01 GB/7.46 GiB) Oct 22 18:49:06 localhost kernel: sd 7:0:0:0: [sdc] Write Protect is off Oct 22 18:49:06 localhost kernel: sd 7:0:0:0: [sdc] Mode Sense: 23 00 00 00 Oct 22 18:49:06 localhost kernel: sd 7:0:0:0: [sdc] No Caching mode page present Oct 22 18:49:06 localhost kernel: sd 7:0:0:0: [sdc] Assuming drive cache: write through Signed-off-by: Luben Tuikov Signed-off-by: James Bottomley commit 00f0254ed9b19164d416dc2e3c2e81eda55a6faf Author: Dan Williams Date: Fri Oct 1 13:55:52 2010 -0700 [SCSI] libsas: fix definition of wideport, include local sas address To date libsas has only looked at the attached sas address when determining the formation of wide ports. The specification and some hardware expects that phys with different addresses will not form a wide port unless the local peer phys also match each other. Introduce a flag to select stricter behavior at sas_register_ha() time. The flag can be dropped once it is known that all libsas users expect the same behavior. Current drivers just initialize this field to zero and get the traditional behavior. Reported-by: Patrick Thomson Signed-off-by: Dan Williams Signed-off-by: James Bottomley commit 3ff5588d3f8afad65ded52ac0e4191462fe034cb Author: Alan Stern Date: Tue Sep 7 11:44:01 2010 -0400 [SCSI] sd: improve logic and efficiecy of media-change detection This patch (as1415) improves the formerly incomprehensible logic in sd_media_changed() (the current code refers to "changed" as a state, whereas in fact it is a relation between two states). It also adds a big comment so that everyone can understand what is really going on. The patch also improves efficiency by not reporting a media change when no medium was ever present. If no medium was present the last time we checked and there's still no medium, it's not necessary to tell the caller that a change occurred. Doing so merely causes the caller to attempt to revalidate a non-existent disk, which is a waste of time. Signed-off-by: Alan Stern Signed-off-by: James Bottomley commit fde52dbd7f71934aba4e150f3d1d51e826a08850 Author: Franck Bui-Huu Date: Mon Dec 20 15:18:04 2010 +0100 perf probe: Don't always consider EOF as an error when listing source code When listing a whole file or a function which is located at the end, perf-probe -L output wrongly: "Source file is shorter than expected.". This is because show_one_line() always consider EOF as an error. This patch fixes this by not considering EOF as an error when dumping the trailing lines. Otherwise it's still an error and perf-probe still outputs its warning. Acked-by: Masami Hiramatsu Cc: Masami Hiramatsu LKML-Reference: <1292854685-8230-6-git-send-email-fbuihuu@gmail.com> Signed-off-by: Franck Bui-Huu Signed-off-by: Arnaldo Carvalho de Melo commit 9d95b580a8d64ef4d1660a21a9de0658fe29f041 Author: Franck Bui-Huu Date: Mon Dec 20 15:18:03 2010 +0100 perf probe: Fix line range description since a single file is allowed $ perf-probe -L sched.c is currently allowed but not documented. Cc: Masami Hiramatsu LKML-Reference: <1292854685-8230-5-git-send-email-fbuihuu@gmail.com> Signed-off-by: Franck Bui-Huu Signed-off-by: Arnaldo Carvalho de Melo commit 44b81e929b0c00e703a31a3d634b668bb27eb1c8 Author: Franck Bui-Huu Date: Mon Dec 20 15:18:02 2010 +0100 perf probe: Clean up redundant tests in show_line_range() It also removes some superflous parentheses. Cc: Masami Hiramatsu LKML-Reference: <1292854685-8230-4-git-send-email-fbuihuu@gmail.com> Signed-off-by: Franck Bui-Huu Signed-off-by: Arnaldo Carvalho de Melo commit befe341468f4e61ecaf337a0237f2aab76817437 Author: Franck Bui-Huu Date: Mon Dec 20 15:18:01 2010 +0100 perf probe: Rewrite show_one_line() to make it simpler Cc: Masami Hiramatsu LKML-Reference: <1292854685-8230-3-git-send-email-fbuihuu@gmail.com> Signed-off-by: Franck Bui-Huu Signed-off-by: Arnaldo Carvalho de Melo commit 62c15fc49bd1b35d79b34ea96f132ab435e2215a Author: Franck Bui-Huu Date: Mon Dec 20 15:18:00 2010 +0100 perf probe: Make -L display the absolute path of the dumped file The actual file used by 'perf probe -L sched.c' is reported in the ouput of the command. But it's simply displayed as it has been given to the command (simply sched.c) which is too ambiguous to be really usefull since several sched.c files can be found into the same project and we also don't know which search path has been used. Acked-by: Masami Hiramatsu Cc: Masami Hiramatsu LKML-Reference: <1292854685-8230-2-git-send-email-fbuihuu@gmail.com> Signed-off-by: Franck Bui-Huu Signed-off-by: Arnaldo Carvalho de Melo commit 0e43e5d222095ca2d1d825dd2e4fa158bdc4cc9b Author: Masami Hiramatsu Date: Fri Dec 17 22:12:11 2010 +0900 perf probe: Cleanup messages Add new lines for error or debug messages, change dwarf related words to more generic words (or just removed). Cc: 2nddept-manager@sdl.hitachi.co.jp Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Srikar Dronamraju Cc: Steven Rostedt LKML-Reference: <20101217131211.24123.40437.stgit@ltc236.sdl.hitachi.co.jp> Signed-off-by: Masami Hiramatsu Signed-off-by: Arnaldo Carvalho de Melo commit ec5761eab318e50e69fcf8e63e9edaef5949c067 Author: David Ahern Date: Thu Dec 9 13:27:07 2010 -0700 perf symbols: Add symfs option for off-box analysis using specified tree The symfs argument allows analysis of perf.data file using a locally accessible filesystem tree with debug symbols - e.g., tree created during image builds, sshfs mount, loop mounted KVM disk images, USB keys, initrds, etc. Anything with an OS tree can be analyzed from anywhere without the need to populate a local data store with build-ids. Commiter notes: o Fixed up symfs="/" variants handling. o prefixed DSO__ORIG_GUEST_KMODULE case with symfs too, avoiding use of files outside the symfs directory. LKML-Reference: <1291926427-28846-1-git-send-email-daahern@cisco.com> Signed-off-by: David Ahern Signed-off-by: Arnaldo Carvalho de Melo commit eac23d1c384b55e4bbb89ea9e5a6bb77fb4d1140 Author: Ian Munsie Date: Thu Dec 9 16:33:53 2010 +1100 perf record,report,annotate,diff: Process events in order This patch changes perf report to ask for the ID info on all events be default if recording from multiple CPUs. Perf report, annotate and diff will now process the events in order if the kernel is able to provide timestamps on all events. This ensures that events such as COMM and MMAP which are necessary to correctly interpret samples are processed prior to those samples so that they are attributed correctly. Before: # perf record ./cachetest # perf report # Events: 6K cycles # # Overhead Command Shared Object Symbol # ........ ....... ................. ............................... # 74.11% :3259 [unknown] [k] 0x4a6c 1.50% cachetest ld-2.11.2.so [.] 0x1777c 1.46% :3259 [kernel.kallsyms] [k] .perf_event_mmap_ctx 1.25% :3259 [kernel.kallsyms] [k] restore 0.74% :3259 [kernel.kallsyms] [k] ._raw_spin_lock 0.71% :3259 [kernel.kallsyms] [k] .filemap_fault 0.66% :3259 [kernel.kallsyms] [k] .memset 0.54% cachetest [kernel.kallsyms] [k] .sha_transform 0.54% :3259 [kernel.kallsyms] [k] .copy_4K_page 0.54% :3259 [kernel.kallsyms] [k] .find_get_page 0.52% :3259 [kernel.kallsyms] [k] .trace_hardirqs_off 0.50% :3259 [kernel.kallsyms] [k] .__do_fault After: # perf report # Events: 6K cycles # # Overhead Command Shared Object Symbol # ........ ....... ................. ............................... # 44.28% cachetest cachetest [.] sumArrayNaive 22.53% cachetest cachetest [.] sumArrayOptimal 6.59% cachetest ld-2.11.2.so [.] 0x1777c 2.13% cachetest [unknown] [k] 0x340 1.46% cachetest [kernel.kallsyms] [k] .perf_event_mmap_ctx 1.25% cachetest [kernel.kallsyms] [k] restore 0.74% cachetest [kernel.kallsyms] [k] ._raw_spin_lock 0.71% cachetest [kernel.kallsyms] [k] .filemap_fault 0.66% cachetest [kernel.kallsyms] [k] .memset 0.54% cachetest [kernel.kallsyms] [k] .copy_4K_page 0.54% cachetest [kernel.kallsyms] [k] .find_get_page 0.54% cachetest [kernel.kallsyms] [k] .sha_transform 0.52% cachetest [kernel.kallsyms] [k] .trace_hardirqs_off 0.50% cachetest [kernel.kallsyms] [k] .__do_fault Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Thomas Gleixner LKML-Reference: <1291872833-839-1-git-send-email-imunsie@au1.ibm.com> Signed-off-by: Ian Munsie Signed-off-by: Arnaldo Carvalho de Melo commit 21ef97f05a7da5bc23b26cb34d6746f83ca9bf20 Author: Ian Munsie Date: Fri Dec 10 14:09:16 2010 +1100 perf session: Fallback to unordered processing if no sample_id_all If we are running the new perf on an old kernel without support for sample_id_all, we should fall back to the old unordered processing of events. If we didn't than we would *always* process events without timestamps out of order, whether or not we hit a reordering race. In other words, instead of there being a chance of not attributing samples correctly, we would guarantee that samples would not be attributed. While processing all events without timestamps before events with timestamps may seem like an intuitive solution, it falls down as PERF_RECORD_EXIT events would also be processed before any samples. Even with a workaround for that case, samples before/after an exec would not be attributed correctly. This patch allows commands to indicate whether they need to fall back to unordered processing, so that commands that do not care about timestamps on every event will not be affected. If we do fallback, this will print out a warning if report -D was invoked. This patch adds the test in perf_session__new so that we only need to test once per session. Commands that do not use an event_ops (such as record and top) can simply pass NULL in it's place. Acked-by: Thomas Gleixner Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Thomas Gleixner LKML-Reference: <1291951882-sup-6069@au1.ibm.com> Signed-off-by: Ian Munsie Signed-off-by: Arnaldo Carvalho de Melo commit 0719e1d23aab3b445c823404fd1b8b027757bb0a Author: Yann E. MORIN Date: Thu Dec 16 00:19:00 2010 +0100 Documentation/kbuild: add info that 'choice' can have a symbol name Changeset 5a1aa8a1 added the possibility to name a choice, and to have the same choice be defined multiple times. But the documentation was forgotten, so this updates it accordingly. Thanks to Arnaud Lacombe for pointing it to me in the first place: http://www.spinics.net/lists/linux-kbuild/msg03940.html Signed-off-by: "Yann E. MORIN" Cc: Roman Zippel Cc: Arnaud Lacombe Signed-off-by: Michal Marek commit fec6e5252b542e748871c88f8455e69ae73ea156 Author: Henrik Rydberg Date: Tue Dec 21 18:11:25 2010 +0100 Input: synaptics - add multi-finger and semi-mt support The Synaptics 2.7 series of touchpads support a mode for reporting two sets of X/Y/Pressure data (advanced gesture mode). By default, these devices report only single finger data, depriving userspace of the nowadays ubiquitous two-finger scroll gesture. Enabling advanced gesture mode also enables the multi-finger report, although the device does not claim that capability. Up to three fingers can be reported this way. While two or three fingers are touching, the normal packet is prepended by a reduced finger packet of lower resolution. From the two packets (which do not represent the actual fingers), the bounding rectangle of the individual contacts can be extracted. This information is sufficient to perform scaling gestures and a limited form of rotation gesture. The behavior has been coined semi-mt capability, and is signaled to userspace via the INPUT_PROP_SEMI_MT device property. Work to decode the advanced gesture packet: Takashi Iwai. Cleanup and testing of the original patch: Chase Douglas. Minor cleanup and testing: Chris Bagwell. Finalization and semi-mt support: Henrik Rydberg. Reported-by: Tobyn Bertram Signed-off-by: Takashi Iwai Signed-off-by: Chase Douglas Signed-off-by: Chris Bagwell Acked-by: Dmitry Torokhov Signed-off-by: Henrik Rydberg commit c14890a8e54977f895773d393d6a640d6d698fb8 Author: Henrik Rydberg Date: Thu Dec 16 09:52:23 2010 +0100 Input: synaptics - report clickpad property With the new input property interface, it is possible to report the special quirks of a device using ioctl/sysfs. This patch sets up the device as a pointer, and reports the clickpad functionality via the INPUT_PROP_BUTTONPAD property. Acked-by: Chase Douglas Signed-off-by: Henrik Rydberg commit 17742dc743716eebbf5892add0e0bf91f541fc39 Author: Michal Marek Date: Mon Dec 20 16:06:44 2010 +0100 kconfig: Make expr_copy() take a const argument Fixes scripts/kconfig/expr.c: In function ‘expr_get_leftmost_symbol’: scripts/kconfig/expr.c:1026:2: warning: passing argument 1 of ‘expr_copy’ discards qualifiers from pointer target type scripts/kconfig/expr.c:67:14: note: expected ‘struct expr *’ but argument is of type ‘const struct expr *’ Signed-off-by: Michal Marek commit 1137c56b7420c801147e0863845c03b07554721a Author: Arnaud Lacombe Date: Sun Sep 26 16:24:08 2010 -0400 kconfig: simplify select-with-unmet-direct-dependency warning This is an attempt to simplify the expressing printed by kconfig when a symbol is selected but still has direct unmet dependency. First, the symbol reverse dependency is split in sub-expression. Then, each sub-expression is checked to ensure that it does not contains the unmet dependency. This removes the false-positive symbols and fixed symbol which already have the correct dependency. Finally, only the symbol responsible of the "select" is printed, instead of its full dependency tree. CC: Catalin Marinas Signed-off-by: Arnaud Lacombe Signed-off-by: Michal Marek commit b080ac8ad47aeeb845d8d11924f09255cf49b5e9 Author: Marcelo Roberto Jimenez Date: Thu Dec 16 21:34:51 2010 +0100 ARM: 6459/2: sa1100: Add nanoEngine PCI support. This patch adds nanoEngine's PCI support. Signed-off-by: Marcelo Roberto Jimenez Signed-off-by: Russell King commit fa87672ab30ce6564393778b8cbc67fc32712a30 Author: Marcelo Roberto Jimenez Date: Mon Oct 18 22:41:29 2010 +0100 ARM: 6458/1: pcmcia: Adds nanoEngine PCMCIA support. This patch adds nanoEngine PCMCIA support, with support for two sockets. In order to have a fully functional pcmcia subsystem in a BSE nanoEngine board you should carefully read this: http://cambuca.ldhs.cetuc.puc-rio.br/nanoengine/ Acked-by: Dominik Brodowski Signed-off-by: Marcelo Roberto Jimenez Signed-off-by: Russell King commit 17b38ebb6a32250a220d6af77293f7e3f9c62a6e Author: Marcelo Roberto Jimenez Date: Mon Oct 18 22:39:05 2010 +0100 ARM: 6457/1: pcmcia: Fix checkpatch.pl issues in drivers/pcmcia/soc_common.c. This patch fixes checkpatch.pl issues in drivers/pcmcia/soc_common.c. Signed-off-by: Marcelo Roberto Jimenez Signed-off-by: Russell King commit d2ccb52d88dcb7eb3539d0e0c77a7028b8d46037 Author: Marcelo Roberto Jimenez Date: Thu Dec 16 21:31:32 2010 +0100 ARM: 6455/2: Better use of the RTC framework for sa11xx. This patch uses the RTC framework to treat some common ioctl. In particular, it fixes the behaviour of rtc_irq_set_freq(), which did not work as expected because the timer was not beeing retriggered. Signed-off-by: Marcelo Roberto Jimenez Signed-off-by: Russell King commit 47bb3b31ab2c95e275b850a291794a29aaaa31cd Author: Marcelo Roberto Jimenez Date: Mon Oct 18 22:32:48 2010 +0100 ARM: 6451/1: sa1100: Fix checkpatch.pl issues in arch/arm/mach-sa1100/cpu-sa1110.c. This patch fixes checkpatch.pl issues in arch/arm/mach-sa1100/cpu-sa1110.c. Signed-off-by: Marcelo Roberto Jimenez Signed-off-by: Russell King commit 9f15d2caca102c4b79e34562296bcbf982665cb2 Author: Marcelo Roberto Jimenez Date: Thu Dec 16 20:51:30 2010 +0100 ARM: 6447/3: sa1100: Put nanoEngine support back in the kernel Adds Bright Star Engineering's nanoEngine board support to the kernel. Also: - Adds the nanoEngine memory chip to arch/arm/mach-sa1100/cpu-sa1110.c (Micron MT48LC8M16A2TG-75). - Increase in the sdram_params->name[] field length to accomodate the name of the memory chip. - Clean up of header content and order of arch/arm/mach-sa1100/cpu-sa1110.c Signed-off-by: Marcelo Roberto Jimenez Signed-off-by: Russell King commit 29687512c0b084957112cc2c0743ce34cd0d5055 Author: James Bottomley Date: Thu Dec 16 09:22:24 2010 -0500 [SCSI] fix up documentation for change in ->queuecommand to lockless calling The current doc still says we call it with the host lock held, which is going to cause confusion. Signed-off-by: James Bottomley commit 215faf9c5f6e319e97edea9e178123e07825c14d Author: Joe Perches Date: Tue Dec 21 02:16:10 2010 -0800 drivers/net/*/: Use static const Using static const generally increases object text and decreases data size. It also generally decreases overall object size. Signed-off-by: Joe Perches commit 75a84eb5d144dc761e1bb0f7dcacbf2b5cee562c Author: Joe Perches Date: Tue Dec 21 02:16:09 2010 -0800 tulip: Use DEFINE_PCI_DEVICE_TABLE and static const Moves the PCI table to the right read-only section. Using static const generally increases object text and decreases data size. It also generally decreases overall object size. Signed-off-by: Joe Perches commit 5591c75dc345d93d353d2ab2962824648a73efe4 Author: Joe Perches Date: Tue Dec 21 02:16:09 2010 -0800 usb: Use static const, consolidate code Using static const generally increases object text and decreases data size. It also generally decreases overall object size. Consolidate duplicated code into new fix_crc_bug function and declare data in that function static const. Signed-off-by: Joe Perches commit b6bc765067ece933cc3dc7f5e95665a89100b1d5 Author: Joe Perches Date: Tue Dec 21 02:16:08 2010 -0800 drivers/net/*.c: Use static const Using static const generally increases object text and decreases data size. It also generally decreases overall object size. Signed-off-by: Joe Perches commit 895950c2a6565d9eefda4a38b00fa28537e39fcb Author: Joe Perches Date: Tue Dec 21 02:16:08 2010 -0800 tg3: Use DEFINE_PCI_DEVICE_TABLE Moves the PCI tables to the right read-only section. Signed-off-by: Joe Perches commit c793bec550c68a1da1034090b43a886e8fee5eb0 Author: Kailang Yang Date: Tue Dec 21 09:14:13 2010 +0100 ALSA: hda - Don't apply ALC269-specific initialization to ALC275 ALC275 doesn't require the ALC269 (and its variants) specific init sequences. Add the check of codec id. Signed-off-by: Kailang Yang Signed-off-by: Takashi Iwai commit 2785591a9760c677a7ee6f541e751c23086f5bfd Author: Kailang Yang Date: Tue Dec 21 09:09:53 2010 +0100 ALSA: hda - Add fix-up for Sony VAIO with ALC275 codecs Set GPIO2 for some Sony VAIO with ALC275 to fix speaker output. Signed-off-by: Kailang Yang Signed-off-by: Takashi Iwai commit 87a1c8aaa0bced8acf4cd64672362492460c31ae Author: Jesper Juhl Date: Tue Dec 21 00:03:17 2010 +0100 ALSA: pcm: remember to always call va_end() on stuff that we va_start() The Coverity checker spotted that we do not always remember to call va_end() on 'args' in failure paths in snd_pcm_hw_rule_add(). Here's a patch to fix that up (compile tested only) - it also removes some annoying trailing whitespace that caught my eye while I was in the area.. Signed-off-by: Jesper Juhl Signed-off-by: Takashi Iwai commit e5fcdb7ed856b714c878ad470040fe832cbe462b Merge: 7bddaaca472a08bb8a80b653855a1e921b440578 093d804611b9a38fe59753b37c29f840518406a9 Author: Linus Torvalds Date: Mon Dec 20 21:34:16 2010 -0800 Merge branch 'tty-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6 * 'tty-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6: n_gsm: gsm_data_alloc buffer allocation could fail and it is not being checked n_gsm: Fix message length handling when building header commit 7bddaaca472a08bb8a80b653855a1e921b440578 Merge: 9d5004fcf6e4e8caa9efbc25c9f85059b165329c dbb442b85a1d82f91cfe0524c4f9b3a5196a10ca Author: Linus Torvalds Date: Mon Dec 20 21:33:12 2010 -0800 Merge branch 'usb-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6 * 'usb-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6: Revert "USB: gadget: Allow function access to device ID data during bind()" USB: misc: uss720.c: add another vendor/product ID USB: usb-storage: unusual_devs entry for the Samsung YP-CP3 USB: gadget: Remove suspended sysfs file before freeing cdev USB: core: Add input prompt and help text for USB_OTG config USB: ftdi_sio: Add D.O.Tec PID xhci: Fix issue with port array setup and buggy hosts. commit 356f039822b8d802138f7121c80d2a9286976dbd Author: Nandita Dukkipati Date: Mon Dec 20 14:15:56 2010 +0000 TCP: increase default initial receive window. This patch changes the default initial receive window to 10 mss (defined constant). The default window is limited to the maximum of 10*1460 and 2*mss (when mss > 1460). draft-ietf-tcpm-initcwnd-00 is a proposal to the IETF that recommends increasing TCP's initial congestion window to 10 mss or about 15KB. Leading up to this proposal were several large-scale live Internet experiments with an initial congestion window of 10 mss (IW10), where we showed that the average latency of HTTP responses improved by approximately 10%. This was accompanied by a slight increase in retransmission rate (0.5%), most of which is coming from applications opening multiple simultaneous connections. To understand the extreme worst case scenarios, and fairness issues (IW10 versus IW3), we further conducted controlled testbed experiments. We came away finding minimal negative impact even under low link bandwidths (dial-ups) and small buffers. These results are extremely encouraging to adopting IW10. However, an initial congestion window of 10 mss is useless unless a TCP receiver advertises an initial receive window of at least 10 mss. Fortunately, in the large-scale Internet experiments we found that most widely used operating systems advertised large initial receive windows of 64KB, allowing us to experiment with a wide range of initial congestion windows. Linux systems were among the few exceptions that advertised a small receive window of 6KB. The purpose of this patch is to fix this shortcoming. References: 1. A comprehensive list of all IW10 references to date. http://code.google.com/speed/protocols/tcpm-IW10.html 2. Paper describing results from large-scale Internet experiments with IW10. http://ccr.sigcomm.org/drupal/?q=node/621 3. Controlled testbed experiments under worst case scenarios and a fairness study. http://www.ietf.org/proceedings/79/slides/tcpm-0.pdf 4. Raw test data from testbed experiments (Linux senders/receivers) with initial congestion and receive windows of both 10 mss. http://research.csc.ncsu.edu/netsrv/?q=content/iw10 5. Internet-Draft. Increasing TCP's Initial Window. https://datatracker.ietf.org/doc/draft-ietf-tcpm-initcwnd/ Signed-off-by: Nandita Dukkipati Acked-by: Eric Dumazet Signed-off-by: David S. Miller commit eda83e3b63e88351310c13c99178eb4634f137b2 Author: Eric Dumazet Date: Mon Dec 20 12:54:58 2010 +0000 net_sched: sch_sfq: better struct layouts Here is a respin of patch. I'll send a short patch to make SFQ more fair in presence of large packets as well. Thanks [PATCH v3 net-next-2.6] net_sched: sch_sfq: better struct layouts This patch shrinks sizeof(struct sfq_sched_data) from 0x14f8 (or more if spinlocks are bigger) to 0x1180 bytes, and reduce text size as well. text data bss dec hex filename 4821 152 0 4973 136d old/net/sched/sch_sfq.o 4627 136 0 4763 129b new/net/sched/sch_sfq.o All data for a slot/flow is now grouped in a compact and cache friendly structure, instead of being spreaded in many different points. struct sfq_slot { struct sk_buff *skblist_next; struct sk_buff *skblist_prev; sfq_index qlen; /* number of skbs in skblist */ sfq_index next; /* next slot in sfq chain */ struct sfq_head dep; /* anchor in dep[] chains */ unsigned short hash; /* hash value (index in ht[]) */ short allot; /* credit for this slot */ }; Signed-off-by: Eric Dumazet Cc: Jarek Poplawski Cc: Patrick McHardy Signed-off-by: David S. Miller commit 9d5004fcf6e4e8caa9efbc25c9f85059b165329c Merge: 453434cf3fdcd3954bb52460e37d4945a0913d3e 361cf40519a491f68b28ad90225e4611c4bf8e12 Author: Linus Torvalds Date: Mon Dec 20 21:32:20 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client: ceph: handle partial result from get_user_pages ceph: mark user pages dirty on direct-io reads ceph: fix null pointer dereference in ceph_init_dentry for nfs reexport ceph: fix direct-io on non-page-aligned buffers ceph: fix msgr_init error path commit 453434cf3fdcd3954bb52460e37d4945a0913d3e Author: Linus Torvalds Date: Mon Dec 20 21:21:49 2010 -0800 Fix build error in drivers/block/cciss.c .. caused by a missing semi-colon, introduced in commit 0fc13c8995cd ("cciss: fix cciss_revalidate panic"). Reported-by: Stephen Rothwell Reported-by: Thiago Farina Cc: Jens Axboe Signed-off-by: Linus Torvalds commit 4584acc3ee236424b5d0b52f143d980cae3c2be5 Merge: f0c61d3d3c319def8feebb99682ae0223a41dffe c7d3e9e801d72e86eb8a0f311453192a84f14412 b89cd71a159b5edca4c429687e4af01708eb1b26 Author: Tony Lindgren Date: Mon Dec 20 19:13:40 2010 -0800 Merge branches 'devel-iommu-mailbox' and 'devel-l2x0' into omap-for-linus commit a93f344d3c04e4b84490c65f2a574387c593be40 Author: Alex Deucher Date: Mon Dec 20 11:22:29 2010 -0500 drm/radeon/kms: reorder display resume to avoid problems On resume, we were attemping to unblank the displays before the timing and plls had be reprogrammed which led to atom timeouts waiting for things that are not yet programmed. Re-program the mode first, then reset the dpms state. This fixes the infamous atombios timeouts on resume. Signed-off-by: Alex Deucher Cc: stable@kernel.org Signed-off-by: Dave Airlie commit 86f5c9edbb3bac37cc8cee6528a929005ba72aad Author: Alex Deucher Date: Mon Dec 20 12:35:04 2010 -0500 drm/radeon/kms/evergreen: reset the grbm blocks at resume and init This fixes module reloading and resume as the gfx block seems to be left in a bad state in some cases. Signed-off-by: Alex Deucher Cc: stable@kernel.org Signed-off-by: Dave Airlie commit 9f0c4f9c2f835eee1bbb93f96bf9483d56f1892b Author: Alex Deucher Date: Mon Dec 20 12:35:03 2010 -0500 drm/radeon/kms: fix evergreen asic reset Only reset the grbm blocks, srbm tends to lock the GPU if not done properly and in most cases is not necessary. Also, no need to call asic init after reset the grbm blocks. Signed-off-by: Alex Deucher Cc: stable@kernel.org Reviewed-by: Jerome Glisse Signed-off-by: Dave Airlie commit f0c61d3d3c319def8feebb99682ae0223a41dffe Author: Jarkko Nikula Date: Sat Dec 18 18:17:10 2010 +0000 omap: rx51: Switch rx51_tpa6130a2_data __initdata to__initdata_or_module If the TPA6130 is compiled as module the id and power_gpio values are arbitrary at module probing time since the rx51_tpa6130a2_data was marked as __initdata. Fix this by using __initdata_or_module. Then __initdata is defined only if the kernel is built without CONFIG_MODULES and omitted otherwise. Signed-off-by: Jarkko Nikula Signed-off-by: Tony Lindgren commit f861fc1766888858db6abd57adae3af7abc286ca Author: Grazvydas Ignotas Date: Sun Dec 19 22:33:36 2010 +0000 omap: pandora: fix wifi support After commit ed919b0 "mmc: sdio: fix runtime PM anomalies by introducing MMC_CAP_POWER_OFF_CARD" it is required to specify MMC_CAP_POWER_OFF_CARD to have runtime PM support. As the wl1251 driver expects card to be powered down when it's not used, wifi will no longer work after interface is brought down at least once without functioning runtime PM. Fix this by declaring MMC_CAP_POWER_OFF_CARD for MMC3. Signed-off-by: Grazvydas Ignotas Signed-off-by: Tony Lindgren commit d920e52020bcad791b12137deea341665160b974 Author: Raghuveer Murthy Date: Fri Dec 17 18:15:07 2010 -0800 OMAP4: Pandaboard: Add omap_reserve functionality This patch adds omap_reserve functionality to board-omap4panda.c. Helps in the reserving boot time memory in SDRAM, used here for framebuffer allocation. This patch is in similar lines to commit id 71ee7dad9b6991, from Russell king Cc: Russell King Cc: linux-arm-kernel@lists.infradead.org Signed-off-by: Raghuveer Murthy [tony@atomide.com: fixed to be before .map_io as pointed out by Russell King] Signed-off-by: Tony Lindgren commit f389f4cb46e69fe2cea81e21fd01efc4daf07c8e Author: Hemanth V Date: Fri Dec 17 18:15:08 2010 -0800 omap4: Add platform changes for PWM LED Register TWL6030 PWM, which is used as charging LED Signed-off-by: Hemanth V Signed-off-by: Tony Lindgren commit d048aca2e2e023204c10ca6b705642c1de54d95c Author: Hemanth V Date: Fri Dec 17 18:15:08 2010 -0800 omap4: Add platform changes for Ambient Light sensor Register BH1780GLI Ambient light sensor, which is an I2C device for 4430SDP board. Signed-off-by: Hemanth V Signed-off-by: Tony Lindgren commit 70e77760639625e6ec4564c262552e6002eb5ba6 Author: Laurent Pinchart Date: Fri Dec 17 18:15:08 2010 -0800 omap3: igepv2: LED gpio-led:green:d1 is active low Make sure the LED is turned off at boot time, and configure the GPIO LED device as active low. Signed-off-by: Laurent Pinchart Acked-by: Enric Balletbo i Serra Signed-off-by: Tony Lindgren commit 62d8e9e2613032c6c8397b554b5f789131bb3d60 Author: Laurent Pinchart Date: Fri Dec 17 18:15:07 2010 -0800 omap3: igepv2: Don't call gpio_set_value right aftergpio_direction_output gpio_direction_output() has a value argument, there's no need to call gpio_set_value() explicitly right after. Signed-off-by: Laurent Pinchart Acked-by: Enric Balletbo i Serra Signed-off-by: Tony Lindgren commit 65dd4c1626b396af839881708fdf3bc726a16f73 Author: Tony Lindgren Date: Fri Dec 17 18:37:08 2010 -0800 omap1: Fix innovator FPGA init for multi-omap No need to call this early from init_irq. Also recent changes initialize GPIO now later, so calling gpio_request from init_irq will make it fail. While at it, also remove the unnecessary EXPORT_SYMBOL. Signed-off-by: Tony Lindgren commit da07c0cff295d887427ad2519e452ee3c27e47ff Author: Marc Zyngier Date: Mon Dec 20 18:48:16 2010 -0800 Fix IGEPv2 second MMC channel power supply Commit 72f381ba056 (omap3: Remove VMMC2 regulator on IGEP v2) removed an unused regulator entry, but left the second MMC channel (used by the Libertas WLAN module) without link to power regulator. This causes the SDIO module to fail being detected. This patch adds the two regulators that actually feed the WLAN module (1v8 from the TWL4030 VIO LDO, and a fixed 3v3). With that patch, the second channel is properly detected. Details of the power supply implementation were kindly provided by Enric Balletbo i Serra. Also change vmmc1 to use symbolic names instead of direct device reference. Tested on an IGEPv2 Rev-B. Signed-off-by: Marc Zyngier Acked-by: Enric Balletbo i Serra Cc: Tony Lindgren Signed-off-by: Tony Lindgren commit cd303e1712e3ebdf174bb378bb8df851eac2701a Author: Anand Gadiyar Date: Mon Dec 20 18:48:16 2010 -0800 omap2430: hwmod: remove stray declaration Patch "OMAP2xxx: hwmod: add I2C hwmods for OMAP2420, 2430" in linux-next as of 20101203 introduced the following build warning - fix this by removing the stray i2c_dev_attr. arch/arm/mach-omap2/omap_hwmod_2430_data.c:483: warning: 'i2c_dev_attr' defined but not used Signed-off-by: Anand Gadiyar Cc: Kevin Hilman Signed-off-by: Tony Lindgren commit 60d24eeda7c7e3b0551f5a349224c7cc721206bd Author: Srikar Date: Mon Dec 20 18:48:16 2010 -0800 Added video data to support tvout on rx51 To support tvout on rx51,added Intilization data, tvout as display device and enabled venc through gpio on rx51 Signed-off-by: Srikar Signed-off-by: Tony Lindgren commit caeeb4aadfbff8d8efbb055594c0459cff94adad Author: Jarkko Nikula Date: Mon Dec 20 18:48:16 2010 -0800 omap: rx51: Add supplies and data for codec b part ofTLV320AIC34 Upcoming ASoC core and tlv320aic3x changes makes possible to take b part of TLV320AIC34 into use on RX51/N900. Prepare to this by adding virtual supplies and platform data for b part of the codec. Signed-off-by: Jarkko Nikula Signed-off-by: Tony Lindgren commit 91db7b2985555bd0456ad30440dd615c985fc9c6 Author: Jarkko Nikula Date: Mon Dec 20 18:48:15 2010 -0800 omap: rx51: Remove extra tlv320aic3x.h inclusion Remove second tlv320aic3x.h inclusion that came along the commit f0fba2a "ASoC: multi-component - ASoC Multi-Component Support". Signed-off-by: Jarkko Nikula Cc: Liam Girdwood Signed-off-by: Tony Lindgren commit 5690597fc648c92b94771993a56c7e4f614874bf Author: Aaro Koskinen Date: Mon Dec 20 18:48:15 2010 -0800 arm: mach-omap2: Kconfig: fix incorrect option There is no MFD config option, MFD_SUPPORT should be selected instead. This will prevent build errors when trying out different configurations. Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit 434c23a7ef48763fd8d4adfb0edebb4237770f9d Author: Aaro Koskinen Date: Mon Dec 20 18:48:15 2010 -0800 arm: mach-omap2: hsmmc_reset: fix clk_get() error handling clk_get() return value should be checked with IS_ERR(). Furthermore, clocks should be put and disabled properly. Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit 92971021c632876108ea2e06290a56a9157578f5 Author: Dave Airlie Date: Tue Dec 21 12:47:56 2010 +1000 Revert "drm: Don't try and disable an encoder that was never enabled" This reverts commit 541cc966915b6756e54c20eebe60ae957afdb537. Wei Yonjun reported this caused a regression against Intel VGA hotplug on his G33 hw. Signed-off-by: Dave Airlie commit f31cc9622d75c1c6f041d786698daa425c0425c2 Author: G, Manjunath Kondaiah Date: Mon Dec 20 18:27:19 2010 -0800 OMAP: DMA: Convert DMA library into platform driver Convert DMA library into DMA platform driver and make use of platform data provided by hwmod data base for OMAP2+ onwards. For OMAP1 processors, the DMA driver in mach-omap uses resource structures for getting platform data. Thanks to Tony Lindgren for fixing various omap1 issues and testing the same on OSK5912 board. Signed-off-by: G, Manjunath Kondaiah Tested-by: Kevin Hilman Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 59de3cf1ce9a961ba9ab657707727db2111e72fa Author: G, Manjunath Kondaiah Date: Mon Dec 20 18:27:19 2010 -0800 OMAP2+: DMA: hwmod: Device registration Prepare OMAP2+ DMA to use hwmod infrastructure so that DMA can register as platform device. Signed-off-by: G, Manjunath Kondaiah Tested-by: Kevin Hilman Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 6568f7c43a72f9631910e26092ef3ecf67cc99eb Author: G, Manjunath Kondaiah Date: Mon Dec 20 18:27:19 2010 -0800 OMAP1: DMA: Implement in platform device model Implement OMAP1 DMA as platform device and add support for registering through platform device layer using resource structures. Signed-off-by: G, Manjunath Kondaiah Signed-off-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 531ce0d57caf7e49073608873de6976558fd7e4f Author: Benoit Cousson Date: Mon Dec 20 18:27:19 2010 -0800 OMAP4: hwmod data: add system DMA Add OMAP4 DMA hwmod data. In addition to original dma hwmod data, the following changes are added. 1. DMA device attributes structure is introduced for diffenrenciating OMAP cpu's based on DMA features. Signed-off-by: Benoit Cousson Signed-off-by: G, Manjunath Kondaiah Tested-by: Kevin Hilman Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 01438ab6a49b63ef02b2eb44b63345a09792f982 Author: G, Manjunath Kondaiah Date: Mon Dec 20 18:27:19 2010 -0800 OMAP3: hwmod data: add system DMA Add OMAP3 DMA hwmod data Signed-off-by: G, Manjunath Kondaiah Tested-by: Kevin Hilman Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 82cbd1aebafd126f40a8ed0725a6feb6ed710576 Author: G, Manjunath Kondaiah Date: Mon Dec 20 18:27:18 2010 -0800 OMAP2430: hwmod data: add system DMA Add OMAP2430 DMA hwmod data and also add required DMA device attributes. Signed-off-by: G, Manjunath Kondaiah Acked-by: Paul Walmsley Signed-off-by: Tony Lindgren commit 745685df95961ebbf0bcafcf28f31217a75070ae Author: G, Manjunath Kondaiah Date: Mon Dec 20 18:27:18 2010 -0800 OMAP2420: hwmod data: add system DMA Add OMAP2420 DMA hwmod data and also add required DMA device attributes. Signed-off-by: G, Manjunath Kondaiah Acked-by: Paul Walmsley Signed-off-by: Tony Lindgren commit d3c9be2f42223f256d06b2b69ed26afdcb02f64a Author: G, Manjunath Kondaiah Date: Mon Dec 20 18:27:18 2010 -0800 OMAP: DMA: Introduce errata handling feature Implement errata handling to use flags instead of cpu_is_* and cpu_class_* in the code. The errata flags are initialized at init time and during runtime we are using the errata variable (via the IS_DMA_ERRATA macro) to execute the required errata workaround. Reused errata handling patch from: Peter Ujfalusi https://patchwork.kernel.org/patch/231191/ Changes to above patch: 1. Changes are done for converting all the existing errata work arounds to use this feature. 2. Detailed description for each errata is added. 3. Fixed bug in SET_DMA_ERRATA macro 4. Bit shifting in macro definitions are replaced with BIT() macro Signed-off-by: G, Manjunath Kondaiah Tested-by: Kevin Hilman Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit a4c537c7f60704691efc5f833b3d440252275c3b Author: G, Manjunath Kondaiah Date: Mon Dec 20 18:27:17 2010 -0800 OMAP: DMA: Replace read/write macros with functions Prepare DMA library to get converted into DMA driver using platform device model and hwmod infrastucture(for omap2+, resource structures for omap1) The low level read/write macros are replaced with static inline functions and register offsets are handled through static register offset tables mapped through enumeration constants. These low level read/write functions along with static register offset tables will be moved to respective mach-omap dma files in the later patches of this series. There are no functionality changes with these changes except change in logic for handling 16bit registers of OMAP1. Signed-off-by: G, Manjunath Kondaiah Tested-by: Kevin Hilman Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit f7bb0d9ab29e3159e22c3bfc843bd37c7d3c91a0 Author: Benoit Cousson Date: Thu Dec 9 14:24:16 2010 +0000 I2C: i2c-omap: Change device name: i2c_omap -> omap_i2c The convention for omap device naming is omap_XXX. Rename the device and driver name in order to stick to this naming convention. Change device name in clock nodes as well. Signed-off-by: Benoit Cousson Cc: Kevin Hilman Cc: Rajendra Nayak Cc: Ben Dooks Acked-by: Paul Walmsley Acked-by: Ben Dooks Signed-off-by: Tony Lindgren commit 05f185c774992f1d9edb646a3ecfdabdc8e358f3 Author: Marek Belisko Date: Mon Dec 6 13:23:48 2010 +0000 omap1: pm_bus: Fix compilation warning Fix following compilation warning: arch/arm/mach-omap1/pm_bus.c: In function 'omap1_pm_runtime_resume': arch/arm/mach-omap1/pm_bus.c:51: warning: unused variable 'ret' Signed-off-by: Marek Belisko Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 16c8a3b0c193dca0826dde77423ec4f7a81ed9f6 Author: Marek Belisko Date: Mon Dec 6 12:49:05 2010 +0000 omap1: htc_herald: Fix compilation warning Patch fix following compilation warning: arch/arm/mach-omap1/board-htcherald.c:442: warning: large integer implicitly truncated to unsigned type Hopefully this is just a typo. Signed-off-by: Marek Belisko Signed-off-by: Tony Lindgren commit 374b8cfd61f33b3c1dd4b0f4c2b1bb20079d3090 Author: Benoit Cousson Date: Thu Dec 9 14:24:17 2010 +0000 omap: serial: Change device name: omap-hsuart -> omap_uart The naming convention for omap_device is omap_XXX. Rename the device and driver name in order to stick to this naming convention. Remove the hs prefix that is implicit for every OMAP uarts. Signed-off-by: Benoit Cousson Acked-by: Govindraj Raja Cc: Paul Walmsley Cc: Kevin Hilman Signed-off-by: Tony Lindgren commit a56f7428d7534f162fbb089c5c79012bf38a7c29 Author: Benjamin Herrenschmidt Date: Wed Oct 6 16:39:07 2010 +0000 drm/radeon: Add early unregister of firmware fb's Without this, we attempt the handover too late, the firmware fb might be accessing the chip simultaneously to us re-initializing various parts of it, which might frighten babies or cause all sort of nasty psychologic trauma to kitten. Signed-off-by: Benjamin Herrenschmidt [danvet: add cc: stable, forward ported and compile-fixed for X86] Signed-off-by: Daniel Vetter [airlied: move to even earlier in module load.] Signed-off-by: Dave Airlie commit d9993be65a77f500ae926176baa264816bfe3816 Merge: c4266263249f22479eb1abb1a1709c38240b1597 aa3e219997e4b949be4199660936099ded0b401f Author: David S. Miller Date: Mon Dec 20 13:24:14 2010 -0800 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 commit aa3e219997e4b949be4199660936099ded0b401f Author: Eric Dumazet Date: Mon Dec 20 13:18:16 2010 -0800 net_sched: sch_sfq: fix allot handling When deploying SFQ/IFB here at work, I found the allot management was pretty wrong in sfq, even changing allot from short to int... We should init allot for each new flow, not using a previous value found in slot. Before patch, I saw bursts of several packets per flow, apparently denying the default "quantum 1514" limit I had on my SFQ class. class sfq 11:1 parent 11: (dropped 0, overlimits 0 requeues 0) backlog 0b 7p requeues 0 allot 11546 class sfq 11:46 parent 11: (dropped 0, overlimits 0 requeues 0) backlog 0b 1p requeues 0 allot -23873 class sfq 11:78 parent 11: (dropped 0, overlimits 0 requeues 0) backlog 0b 5p requeues 0 allot 11393 After patch, better fairness among each flow, allot limit being respected, allot is positive : class sfq 11:e parent 11: (dropped 0, overlimits 0 requeues 86) backlog 0b 3p requeues 86 allot 596 class sfq 11:94 parent 11: (dropped 0, overlimits 0 requeues 0) backlog 0b 3p requeues 0 allot 1468 class sfq 11:a4 parent 11: (dropped 0, overlimits 0 requeues 0) backlog 0b 4p requeues 0 allot 650 class sfq 11:bb parent 11: (dropped 0, overlimits 0 requeues 0) backlog 0b 3p requeues 0 allot 596 Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit c4266263249f22479eb1abb1a1709c38240b1597 Author: Eric Dumazet Date: Wed Dec 15 08:18:36 2010 +0000 net_sched: sch_sfq: add backlog info in sfq_dump_class_stats() We currently return for each active SFQ slot the number of packets in queue. We can also give number of bytes accounted for these packets. tc -s class show dev ifb0 Before patch : class sfq 11:3d9 parent 11: (dropped 0, overlimits 0 requeues 0) backlog 0b 3p requeues 0 allot 1266 After patch : class sfq 11:3e4 parent 11: (dropped 0, overlimits 0 requeues 0) backlog 4380b 3p requeues 0 allot 1212 Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit ba119204ff6ff722dcec387b305d9c2d23380726 Merge: cf7d7e5a1980d1116ee152d25dac382b112b9c17 0c521ccbd0c9ad5623ff9b37b20b3ff9d4ad65a7 Author: David Brown Date: Mon Dec 20 13:11:10 2010 -0800 Merge branches 'msm-core' and 'msm-mmc' into for-next * msm-core: (28 commits) msm: initial framebuffer support msm: add handling for clocks tagged as CLK_MINMAX msm: trout: change name of pmdh_clk to mddi_clk msm: add CLK_MINMAX to pmdh_clk msm: trout: add gpio_to_irq msm: iommu: Use the correct memory allocation flag msm_serial: Remove redundant unlikely() msm: iommu: Miscellaneous code cleanup msm: iommu: Support cache-coherent memory access msm: iommu: Definitions for extended memory attributes msm: iommu: Kconfig dependency for the IOMMU API msm: iommu: Check if device is already attached msm: iommu: Kconfig item for cacheable page tables msm: iommu: Don't flush page tables if no devices attached msm: iommu: Mark functions with the right section names msm: iommu: Support for the 2nd GFX core's IOMMU msm: iommu: Revise GFX2D0 IOMMU contexts and M2V mappings msm: iommu: Revise GFX3D IOMMU contexts and M2V mappings msm: iommu: Use more consistent naming in platform data msm: iomap: Addresses and IRQs for 2nd GFX core IOMMU ... * msm-mmc: (33 commits) mmc: msm_sdcc: Check for only DATA_END interrupt to end a request mmc: msm_sdcc: Fix bug in PIO mode when data size is not word aligned mmc: msm_sdcc: Reset SDCC in case of data transfer errors mmc: msm_sdcc: Add prog done interrupt support mmc: msm_sdcc: Fix possible circular locking dependency warning msm: initial framebuffer support msm: add handling for clocks tagged as CLK_MINMAX msm: trout: change name of pmdh_clk to mddi_clk msm: add CLK_MINMAX to pmdh_clk msm: trout: add gpio_to_irq msm: iommu: Use the correct memory allocation flag msm_serial: Remove redundant unlikely() msm: iommu: Miscellaneous code cleanup msm: iommu: Support cache-coherent memory access msm: iommu: Definitions for extended memory attributes msm: iommu: Kconfig dependency for the IOMMU API msm: iommu: Check if device is already attached msm: iommu: Kconfig item for cacheable page tables msm: iommu: Don't flush page tables if no devices attached msm: iommu: Mark functions with the right section names ... commit 0c521ccbd0c9ad5623ff9b37b20b3ff9d4ad65a7 Author: Sahitya Tummala Date: Wed Dec 8 15:03:07 2010 +0530 mmc: msm_sdcc: Check for only DATA_END interrupt to end a request The current code checks for both DATA_END and DATA_BLK_END bits in MCI_STATUS register and ends a request only if both are set at a time. The hardware doesn't always set DATA_BLK_END when DATA_END is set. But DATA_END status itself is sufficient condition from hardware that data transfer is done and hence, check for only DATA_END interrupt in software to end a request. Signed-off-by: Sahitya Tummala Signed-off-by: David Brown commit 71dd9106af54de0f758875fa4b595af42a327448 Author: Sahitya Tummala Date: Wed Dec 8 15:03:06 2010 +0530 mmc: msm_sdcc: Fix bug in PIO mode when data size is not word aligned The current code for PIO doesn't transfer whole data when data size is not in multiple of 4 bytes. The last few bytes are not written to the card resulting in no DATAEND interrupt from SDCC. This patch allows data transfer for non-aligned data size in PIO mode. Signed-off-by: Sahitya Tummala Signed-off-by: David Brown commit b08bb35d1a5ee5426198eb3a2861008c2e9e6fc4 Author: Sahitya Tummala Date: Wed Dec 8 15:03:05 2010 +0530 mmc: msm_sdcc: Reset SDCC in case of data transfer errors SDCC uses an asynchronous FIFOs for data synchronization (one for TX and one for RX). For any error when DPSM (Data path state machine) is involved the transfer is terminated with the remaining data stuck inside FIFOs. Reset the controller in case of data errors to ensure that any left over data in FIFOs is flushed out and DPSM is in good state. The following problems are observed without this reset functionality - 1. After the card is removed in an unsafe way (removed when there is an on going data transfer), the card will not be detected upon its next insertion. This is because the controller wouldn't respond to few initialization commands. 2. When an error occurs for a data transfer in non-DMA mode, sometimes we get spurious PIO interrupt after the request is processed. Signed-off-by: Sahitya Tummala Signed-off-by: David Brown commit d5137bdd91b8267ada3973806443013f4bf079f6 Author: Sahitya Tummala Date: Wed Dec 8 15:03:04 2010 +0530 mmc: msm_sdcc: Add prog done interrupt support Enable prog done interrupt for stop command(CMD12) that is sent after a multi-block write(CMD25). The PROG_DONE bit is set when the card has finished its programming and is ready for next data. After every write request the card will be polled for ready status using CMD13. For a multi-block write(CMD25) before sending CMD13, stop command (CMD12) will be sent. If we enable prog done interrupt for CMD12, then CMD13 polling can be avoided. The prog done interrupt means that the card is done with its programming and is ready for next request. Signed-off-by: Sahitya Tummala Signed-off-by: David Brown commit 62612cf9d97068dc75b48a7a3044ee907a3283ec Author: Sahitya Tummala Date: Wed Dec 8 15:03:03 2010 +0530 mmc: msm_sdcc: Fix possible circular locking dependency warning In the context of request processing thread, data mover lock is acquired after the host lock. In another context, in the completion handler of data mover the locks are acquired in the reverse order, resulting in possible circular lock dependency warning. Hence, schedule a tasklet to process the dma completion so as to avoid nested locks. Signed-off-by: Sahitya Tummala Signed-off-by: David Brown commit 3d986b25b5faa50ba6afd94f60f270b6c3061e5e Author: John W. Linville Date: Thu Dec 16 14:59:49 2010 -0500 rtlwifi: use alloc_workqueue create_workqueue is deprecated. The workqueue usage does not seem to demand any special treatment, so do not set any flags either. Signed-off-by: John W. Linville Tested-by: Larry Finger Acked-by: Tejun Heo commit d4d5dc3d6f86cc70f08e45b840f3e681588d2718 Author: Felix Fietkau Date: Sun Dec 19 00:31:55 2010 +0100 ath9k: do not limit the chainmask to 1 for legacy mode Restricting the chainmask to 1 for legacy mode disables useful features such as MRC, and it reduces the available transmit power. I can't think of a good reason to do this in legacy mode, so let's just get rid of that code. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit f1a8abb0459e96765bd1d300f434256d8dfac73d Author: Felix Fietkau Date: Sun Dec 19 00:31:54 2010 +0100 ath9k_hw: fix PA predistortion HT40 mask The commit 'ath9k_hw: Disable PAPRD for rates with low Tx power' changed the code that sets the PAPRD rate masks to use only either the HT20 mask or the HT40 mask. This is wrong, as the hardware can still use HT20 rates even when configured for HT40, and the operating channel mode does not affect PAPRD operation. The register for the HT40 rate mask is applied as a mask on top of the other registers to selectively disable PAPRD for specific rates on HT40 packets only. This patch changes the code back to the old behavior which matches the intended use of these registers. While with current cards this should not make any practical difference (according to Atheros, the HT20 and HT40 mask should always be equal), it is more correct that way, and maybe the HT40 mask will be used for some rare corner cases in the future. Cc: Vasanthakumar Thiagarajan Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit f8a0a781488ec7288d1049e5d2022850aa98f7b6 Author: Felix Fietkau Date: Sat Dec 18 19:30:50 2010 +0100 mac80211: fix potentially redundant skb data copying When an skb is shared, it needs to be duplicated, along with its data buffer. If the skb does not have enough headroom, using skb_copy might cause the data buffer to be copied twice (once by skb_copy and once by pskb_expand_head). Fix this by using skb_clone initially and letting ieee80211_skb_resize sort out the rest. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 4cd06a344db752f513437138953af191cbe9a691 Author: Felix Fietkau Date: Sat Dec 18 19:30:49 2010 +0100 mac80211: skip unnecessary pskb_expand_head calls If the skb is not cloned and we don't need any extra headroom, there is no point in reallocating the skb head. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 489ee9195a7de9e6bc833d639ff6b553ffdad90e Author: Felix Fietkau Date: Sat Dec 18 19:30:48 2010 +0100 mac80211: fix initialization of skb->cb in ieee80211_subif_start_xmit The change 'mac80211: Fix BUG in pskb_expand_head when transmitting shared skbs' added a check for copying the skb if it's shared, however the tx info variable still points at the cb of the old skb Signed-off-by: Felix Fietkau Acked-by: Helmut Schaa Signed-off-by: John W. Linville commit ae29fbb189c7a80677500c718c9ce08095ccde01 Author: Dan Carpenter Date: Sat Dec 18 11:52:10 2010 +0300 wl1251: wl12xx_get_platform_data() returns an ERR_PTR wl12xx_get_platform_data() returns an ERR_PTR on failure and it never returns a NULL. Signed-off-by: Dan Carpenter Acked-by: Kalle Valo Signed-off-by: John W. Linville commit d704300fa546a613ec3821b908528b20685cb92a Author: Larry Finger Date: Fri Dec 17 19:36:25 2010 -0600 rtlwifi: Fix use of mutex in interrupt code A previous conversion from semaphoreto mutexes missed the fact that one of the semaphores was used in interrupt code. Fixed by changing to a spinlock. Signed-off-by: Larry Finger Signed-off-by: John W. Linville commit f0b3e4b7307f02a203029441b0473a84aebc6435 Author: Larry Finger Date: Fri Dec 17 16:04:11 2010 -0600 MAINTAINERS: Fix typo in rtl8192ce entry Signed-off-by: Larry Finger Signed-off-by: John W. Linville commit b1c1d0003d6d07c3b269340b8ac3fd2b42fd5ebe Author: Mohammed Shafi Shajakhan Date: Fri Dec 17 20:44:36 2010 +0530 ath9k: Properly initialize channel table for 2GHz ath9k channel table for 2Ghz does not seems to initialize the 'band' parameter.Though it does not seems to cause any visible issue it looks odd when we initialize the 'band' parameter for 5Ghz channel table while not so for 2Ghz. Signed-off-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit 18db45c46eae31cee7cfdfd7e671b0201dcdbcd8 Author: Anisse Astier Date: Fri Dec 17 11:45:01 2010 +0100 rtl8192ce: Fix typo in Kconfig description Signed-off-by: Anisse Astier Signed-off-by: John W. Linville commit 55821324dc6a10fab36871534a322bad159fad79 Author: Felix Fietkau Date: Fri Dec 17 00:57:01 2010 +0100 ath9k_hw: remove baseband rfsilent support When rfkill is enabled, ath9k_hw unnecessarily configured the baseband to turn off based on GPIO input, however that code was hardcoded to GPIO 0 instead of ah->rfkill_gpio. Since ath9k uses software rfkill anyway, this code is completely unnecessary and should be removed in case anything else ever uses GPIO 0. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 4b3ba66a47311770b21e7aba481f4f2a90ba3084 Author: Felix Fietkau Date: Fri Dec 17 00:57:00 2010 +0100 ath9k: fix queue depth check for forming new aggregates To improve aggregation length, there should not be more than two fully formed A-MPDU frames in the hardware queue. To ensure this, the code checks the tx queue length before forming new A-MPDUs. This can reduce the throughput (or maybe even starve out A-MPDU traffic) when too many non-aggregated frames are in the queue. Fix this by keeping track of pending A-MPDU frames (even when they're sent out as single frames), but exclude rate control probing frames to improve performance. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 5c405b5c3e435fd332058c59ee58eaa1ac9c513a Author: John W. Linville Date: Thu Dec 16 15:43:36 2010 -0500 rtl8192ce: drop 'rtl8192c-' prefix from files Signed-off-by: John W. Linville Tested-by: Larry Finger commit 61ad5394590c5c5338ab4ec50553d809a9996d50 Author: Javier Cardona Date: Thu Dec 16 17:23:34 2010 -0800 mac80211: Remove unused third address from mesh address extension header. The Mesh Control header only includes 0, 1 or 2 addresses. If there is one address, it should be interpreted as Address 4. If there are 2, they are interpreted as Addresses 5 and 6 (Address 4 being the 4th address in the 802.11 header). The address extension used to hold up to 3 addresses instead of the current 2. I'm not sure which draft version changed this, but it is very unlikely that it will change again given the state of the approval process of this draft. See section 7.1.3.6.3 in current draft (8.0). Also, note that the extra address that I'm removing was not being used, so this change has no effect on over-the-air frame formats. But I thought I better remove it before someone does start using it. Signed-off-by: Javier Cardona Signed-off-by: John W. Linville commit 3de135dba9341a3d10a7a5b9533ce11cb77d4f4d Author: Bruno Randolf Date: Thu Dec 16 11:30:33 2010 +0900 ath5k: Set available antenna information for cfg80211 Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit 39fd5de4472b7b222c6cec78d72b069133f694e4 Author: Bruno Randolf Date: Thu Dec 16 11:30:28 2010 +0900 nl80211: Export available antennas Export the information which antennas are available for configuration as TX or RX antennas via nl80211. Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit 7f531e03abf0162df3966c4fa5fa6fdd9302cb6b Author: Bruno Randolf Date: Thu Dec 16 11:30:22 2010 +0900 cfg80211: Separate available antennas for RX and TX As has been pointed out by Daniel Halperin some devices (e.g. Intel IWL5100) can only TX from a subset of RX antennas, so use separate availability masks for RX and TX. Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit c7108a7111cd9e592d6ad498be37276dbea75d2b Author: Javier Cardona Date: Thu Dec 16 17:37:50 2010 -0800 mac80211: Send mesh non-HWMP path selection frames to userspace Let path selection frames for protocols other than HWMP be sent to userspace via NL80211_CMD_REGISTER_FRAME. Also allow userspace to send and receive mesh path selection frames. Signed-off-by: Javier Cardona Signed-off-by: John W. Linville commit c80d545da3f7c0e534ccd4a780f322f80a92cff1 Author: Javier Cardona Date: Thu Dec 16 17:37:49 2010 -0800 mac80211: Let userspace enable and configure vendor specific path selection. Userspace will now be allowed to toggle between the default path selection algorithm (HWMP, implemented in the kernel), and a vendor specific alternative. Also in the same patch, allow userspace to add information elements to mesh beacons. This is accordance with the Extensible Path Selection Framework specified in version 7.0 of the 802.11s draft. Signed-off-by: Javier Cardona Signed-off-by: John W. Linville commit 24bdd9f4c9af75b33b438d60381a67626de0128d Author: Javier Cardona Date: Thu Dec 16 17:37:48 2010 -0800 mac80211: Rename mesh_params to mesh_config to prepare for mesh_setup Mesh parameters can be to setup a mesh or to configure it. This patch renames the ambiguous name mesh_params to mesh_config in preparation for mesh_setup. Signed-off-by: Javier Cardona Signed-off-by: John W. Linville commit b2b7ab22fa2e619c20917e825c0da7212ca2efc9 Author: Meelis Roos Date: Fri Dec 17 23:27:50 2010 +0200 hostap: remove netif_stop_queue from init Fix runtime warning with backtrace from hostap by removing netif_stop_queue() call before register_netdev. Tested to work fine on hostap_pci Prism 2.5. (This removes a warning about calling netif_stop_queue before register_netdev is called. -- JWL) Signed-off-by: Meelis Roos Acked-by: David S. Miller Signed-off-by: John W. Linville commit 9f333281a7da4c3a59bccc0cb53f7590eb850d93 Author: Johannes Stezenbach Date: Tue Nov 30 16:49:23 2010 +0100 mac80211/rt2x00: add ieee80211_tx_status_ni() All rt2x00 drivers except rt2800pci call ieee80211_tx_status() from a workqueue, which causes "NOHZ: local_softirq_pending 08" messages. To fix it, add ieee80211_tx_status_ni() similar to ieee80211_rx_ni() which can be called from process context, and call it from rt2x00lib_txdone(). For the rt2800pci special case a driver flag is introduced. https://bugzilla.kernel.org/show_bug.cgi?id=24892 Signed-off-by: Johannes Stezenbach Signed-off-by: John W. Linville commit f955e1415f381c7fa6ebe8630cd1fe5a694e8f4a Author: Dan Carpenter Date: Mon Dec 20 03:03:15 2010 +0000 vmxnet3: locking problems in xmit There were several paths that didn't release their locks. Signed-off-by: Dan Carpenter Signed-off-by: Bhavesh Davda Signed-off-by: David S. Miller commit 914e5cea14b2e4651cdb0707e0936b43246deda0 Author: Dan Carpenter Date: Mon Dec 20 10:43:02 2010 -0800 typhoon: memory corruption in typhoon_get_drvinfo() info->version only has space for 32 characters but my UTS_RELEASE is "2.6.37-rc6-next-20101217-05817-ge935fc8-dirty" so it doesn't fit. This is supposed to be the version of the driver, not the kernel version. This driver doesn't have a version so lets just leave it blank. Signed-off-by: Dan Carpenter Signed-off-by: David S. Miller commit bbccc16c8a27d75dabe88326f7074181493a3b69 Author: Andreas Mohr Date: Mon Dec 20 10:38:47 2010 -0800 net: Add USB PID for new MOSCHIP USB ethernet controller MCS7832 variant Due to active notification of the new MCS7832 version by the manufacturer (Mr. Milton; thanks!) -- quote: "functionality same as MCS7830", I'm now submitting this patch (on -rc6), intended for networking.git and -stable. - add MCS7832 USB PID to be able to support this new device variant, too - add related descriptions Signed-off-by: Andreas Mohr Signed-off-by: David S. Miller commit 6561a3b12d62ed5317e6ac32182d87a03f62c8dc Author: David S. Miller Date: Sun Dec 19 21:11:20 2010 -0800 ipv4: Flush per-ns routing cache more sanely. Flush the routing cache only of entries that match the network namespace in which the purge event occurred. Signed-off-by: David S. Miller Acked-by: Eric Dumazet commit 782615aea84e57dc7f2f922cea823df3de635a78 Author: Breno Leitao Date: Mon Dec 20 10:35:25 2010 -0800 ehea: Fixing some message level Currently there are some info message that is set as error, and an error message that is set as debug. This patch just fixes it. Signed-off-by: Breno Leitao Signed-off-by: David S. Miller commit 8cad7f06e3b1d3f9a28bb7385e8fc09d5e1bf84c Merge: 92d7c9b2312474ce1259d71b4e50e01ae9fa95ea 0e4d413af1a9ddd12f82617734eb535007e186a8 Author: Linus Torvalds Date: Mon Dec 20 10:35:04 2010 -0800 Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6 * 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: [media] gspca - sonixj: Better handling of the bridge registers 0x01 and 0x17 [media] gspca - sonixj: Add the bit definitions of the bridge reg 0x01 and 0x17 [media] gspca - sonixj: Set the flag for some devices [media] gspca - sonixj: Add a flag in the driver_info table [media] gspca - sonixj: Fix a bad probe exchange [media] gspca - sonixj: Move bridge init to sd start [media] bttv: remove unneeded locking comments [media] bttv: fix mutex use before init (BZ#24602) [media] Don't export format_by_forcc on two different drivers commit c8efcc2589464ac70255bb83e10cad61c7c6d295 Author: Tejun Heo Date: Mon Dec 20 19:32:04 2010 +0100 workqueue: allow chained queueing during destruction Currently, destroy_workqueue() makes the workqueue deny all new queueing by setting WQ_DYING and flushes the workqueue once before proceeding with destruction; however, there are cases where work items queue more related work items. Currently, such users need to explicitly flush the workqueue multiple times depending on the possible depth of such chained queueing. This patch updates the queueing path such that a work item can queue further work items on the same workqueue even when WQ_DYING is set. The flush on destruction is automatically retried until the workqueue is empty. This guarantees that the workqueue is empty on destruction while allowing chained queueing. The flush retry logic whines if it takes too many retries to drain the workqueue. Signed-off-by: Tejun Heo Cc: James Bottomley commit 53320fe3bb1b1eef1aaff8dd47aae530ebeeb1e5 Author: Sven Eckelmann Date: Mon Dec 20 10:32:03 2010 -0800 batman-adv: Return hna count on local buffer fill hna_local_fill_buffer must return the number of added hna entries and not the last checked hash bucket. Signed-off-by: Sven Eckelmann Signed-off-by: David S. Miller commit 58231186c4532821cb815a3a3248ca02ce5f6f0d Author: Joe Perches Date: Mon Dec 20 10:30:06 2010 -0800 pktgen: Remove unnecessary prefix from pr_ Remove "pktgen: " prefix string from one pr_info. pr_fmt adds it, so this is a duplicate. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 8816624222b12e5d7e291e9d1973fc42b994eb6b Author: Jing Huang Date: Thu Dec 9 17:11:53 2010 -0800 [SCSI] bfa: rename log_level to bfa_log_level Rename log_level to bfa_log_level to make the global variable more bfa specific and avoid clashes with other drivers which was causing a build failure. Signed-off-by: Jing Huang Signed-off-by: James Bottomley commit 173021072e86a0a5b3d2271347493a3e0d5f68e8 Author: Changli Gao Date: Mon Dec 20 04:35:30 2010 +0000 net_sched: always clone skbs Pawel reported a panic related to handling shared skbs in ixgbe incorrectly. So we need to revert my previous patch to work around this bug. Instead of reverting the patch completely, I just revert the essential lines, so we can add the previous optimization back more easily in future. commit 3511c9132f8b1e1b5634e41a3331c44b0c13be70 Author: Changli Gao Date: Sat Oct 16 13:04:08 2010 +0000 net_sched: remove the unused parameter of qdisc_create_dflt() Reported-by: Pawel Staszewski Signed-off-by: Changli Gao Acked-by: Eric Dumazet Signed-off-by: David S. Miller commit 92d7c9b2312474ce1259d71b4e50e01ae9fa95ea Merge: 9e0afb9437c68be62085d74407b169732108a929 1cf215a5b43950d1a304373037828158057ff9fc Author: Linus Torvalds Date: Mon Dec 20 09:59:08 2010 -0800 Merge branch 'rmobile-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 * 'rmobile-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6: ARM: mach-shmobile: INTC interrupt priority level demux fix ARM: mach-shmobile: fix compile warning in mm/init.c commit 9e0afb9437c68be62085d74407b169732108a929 Merge: 7aeb3be341cc7f1fbf2b98fbef980a816736fe8e 65ada547d68dc075aa06df92fe325bff07cbc606 Author: Linus Torvalds Date: Mon Dec 20 09:53:50 2010 -0800 Merge branch 'sh-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 * 'sh-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6: clocksource: sh_cmt: Remove nested spinlock fix commit 7aeb3be341cc7f1fbf2b98fbef980a816736fe8e Merge: 07058599b486fe342f371200ac4718fedbe9a354 e13416ae7f378f9963ceca596ac464d4120093f3 Author: Linus Torvalds Date: Mon Dec 20 09:49:54 2010 -0800 Merge branch 'fbdev-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6 * 'fbdev-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6: OMAP: OMAPFB: disable old omapfb for OMAP4 builds OMAP: DSS: VRAM: Align start & size of vram to 2M commit 07058599b486fe342f371200ac4718fedbe9a354 Merge: 7f8635cc9e66a26d7280ba680b044fa2f65104af cb1868869dce7b751b670aadfc1f1360bc224b29 Author: Linus Torvalds Date: Mon Dec 20 09:46:46 2010 -0800 Merge branch 's5p-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung * 's5p-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung: ARM: S5PV210: update MAX8998 platform data to get rid of WARN() ARM S3C24XX: Fix compilation of PM code for S3C2416 ARM: S3C24XX: Fix CONFIG_S3C_DEV_NAND Kconfig entry commit 7f8635cc9e66a26d7280ba680b044fa2f65104af Merge: 3cb50ddf97a0a1ca4c68bc12fa1e727a6b45fbf2 0fc13c8995cd96f4123de400c71c223d80400ed9 Author: Linus Torvalds Date: Mon Dec 20 09:19:46 2010 -0800 Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block * 'for-linus' of git://git.kernel.dk/linux-2.6-block: cciss: fix cciss_revalidate panic block: max hardware sectors limit wrapper block: Deprecate QUEUE_FLAG_CLUSTER and use queue_limits instead blk-throttle: Correct the placement of smp_rmb() blk-throttle: Trim/adjust slice_end once a bio has been dispatched block: check for proper length of iov entries earlier in blk_rq_map_user_iov() drbd: fix for spin_lock_irqsave in endio callback drbd: don't recvmsg with zero length commit 3cb50ddf97a0a1ca4c68bc12fa1e727a6b45fbf2 Author: Al Viro Date: Mon Dec 20 15:53:18 2010 +0000 Fix btrfs b0rkage Buggered-in: 76dda93c6ae2 ("Btrfs: add snapshot/subvolume destroy ioctl") Signed-off-by: Al Viro Acked-by: Chris Mason Signed-off-by: Linus Torvalds commit b8da46d3d55807037b58f14621a0949f18053bde Author: Nicolas Pitre Date: Mon Dec 20 00:29:32 2010 -0500 clarify a usage constraint for cnt32_to_63() The cnt32_to_63 algorithm relies on proper counter data evaluation ordering to work properly. This was missing from the provided documentation. Let's augment the documentation with the missing usage constraint and fix the only instance that got it wrong. Signed-off-by: Nicolas Pitre Acked-by: David Howells Signed-off-by: Linus Torvalds commit de5e9d58200aafea4a33abcadcd12eb69eaba5c4 Merge: 55ec86f848a5f872fd43f5d7206464a0af419110 050c6c9b896625d9fa498265be17b82c5fc65257 Author: Linus Torvalds Date: Mon Dec 20 09:05:26 2010 -0800 Merge branch 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: sched: Remove debugging check commit faabfa0816916b0a7cfc93f6a9be382830658c80 Author: Russell King Date: Mon Dec 20 16:58:19 2010 +0000 ARM: SMP: ensure frame pointer is reinitialized for soft-CPU hotplug When we soft-CPU hotplug a CPU, we reset the stack pointer and jump back to start_secondary(). This allows us to restart as if the CPU was actually reset. However, we weren't resetting the frame pointer, which could cause problems with backtracing. Reset the frame pointer to zero (which means no parent frame) just like the early assembly code also does. Signed-off-by: Russell King commit 1d3f33d541312acd34bd2fa780396d111a0f73b1 Author: Shawn Guo Date: Mon Dec 13 20:55:03 2010 +0800 ARM: mxs: Add build configuration for mxs Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit 4afbbb7c1b20dc10513c522849735a3293243af8 Author: Shawn Guo Date: Sat Dec 18 21:39:35 2010 +0800 ARM: mxs: Add initial mx28evk support Add initial mx28evk support with duart and fec0. Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit 55cf4183d371e00cf4a2fc4fb9a25ae3d806ff87 Author: Shawn Guo Date: Mon Dec 20 22:57:44 2010 +0800 ARM: mxs: Add initial mx23evk support Add initial mx23evk support with duart. Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit b9a2ada8ff2ace20b1518a18872319d8619fe1ab Author: Shawn Guo Date: Thu Dec 9 23:12:47 2010 +0800 ARM: mxs: Dynamically allocate fec devices Dynamically allocate fec devices for MX28, which gets dual fec interface. Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit dc38ad4052a50b9e73fdcc970ecdd4f69ee9d97a Author: Shawn Guo Date: Thu Dec 9 23:12:46 2010 +0800 ARM: mxs: Dynamically allocate duart devices Dynamically allocate duart devices for MX23 and MX28. Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit faff3dc947738ce7c905a4a2936a089d3fa9ddda Author: Shawn Guo Date: Thu Dec 9 23:12:45 2010 +0800 ARM: mxs: Add static memory mapping Create static memory mapping for MX23 and MX28. Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit 30a7585ff7464ceb1dceb941700654923becb769 Author: Shawn Guo Date: Sat Dec 18 21:39:33 2010 +0800 ARM: mxs: Add clock support Add clock for MXS-based SoCs, MX23 and MX28. Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit bf985969e27b507f734435a99df8bf745a3dbb2b Author: Shawn Guo Date: Mon Dec 20 22:57:43 2010 +0800 ARM: mxs: Add iomux support MXS-based SoCs implements iomux functions in block PINCTRL. Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit fba311fcf0987396f2760553fbe01ab61ec67139 Author: Shawn Guo Date: Sat Dec 18 21:39:31 2010 +0800 ARM: mxs: Add gpio support MXS-based SoCs implement gpio support in block PINCTRL. Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit 4e472096fa4ef751e7ea90e304d971843a1e350d Author: Shawn Guo Date: Sat Dec 18 21:39:30 2010 +0800 ARM: mxs: Add timer support There are 2 versions of the timrot on Freescale MXS-based SoCs. The v1 on MX23 only gets 16 bits counter, while v2 on MX28 extends the counter to 32 bits. The implementation uses two timers, one for clock_event and another for clocksource. MX28 uses timrot 0 and 1, while MX23 uses 0 and 2. Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit 41fa75bc09d31c47d6606233b60f595524c28cd4 Author: Shawn Guo Date: Mon Dec 20 22:57:42 2010 +0800 ARM: mxs: Add low-level debug UART support - DEBUG_LL support, which is incompatible with multi-soc MXS image because of different DUART base address on MX23 and MX28 - uncompress message support Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit 501aaa110a4269c99eff9736a81b5f93bb8b59be Author: Jarod Wilson Date: Thu Dec 16 12:40:16 2010 -0300 [media] mceusb: set a default rx timeout Its possible for the call to read rx timeout from the hardware to fail, in which case we end up with a bogus rx timeout value. Set a default one when filling in the rc struct, and we'll just overwrite it later w/the value from hardware, but if that read fails, we've at least got a sane rx timeout value to work with (1000ms is the default value I've seen returned on most if not all mceusb hardware). Signed-off-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit d8cc7fd7e6371026c15254a35e618d2e5c5bf562 Author: Jarod Wilson Date: Wed Dec 15 19:20:55 2010 -0300 [media] mceusb: fix inverted mask inversion logic As it turns out, somewhere along the way, we managed to invert the meaning of the tx_mask_inverted flag. Looking back over the old lirc driver, tx_mask_inverted was set to 0 if the device was in tx_mask_list. Now we have a tx_mask_inverted flag set to 1 for all the devices that were in the list, and set tx_mask_inverted to that flag value, which is actually the opposite of what we used to set, causing set_tx_mask to use the wrong mask setting option. Since there seem to be more devices with inverted masks than not (using the original device as the baseline for inverted vs. normal), lets just call the ones currently marked as inverted normal instead, and flip the if/else actions that key off of the inverted flag. Note: the problem only cropped up if a call to set_tx_mask was made, if no mask was set, the device would work just fine, which is why this managed to slip though w/o getting noticed until now. Tested successfully by myself and Dennis Gilmore. Reported-by: Dennis Gilmore Signed-off-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit fbb1f1b0db9b196928157f97515a7ea537310ebc Author: Jarod Wilson Date: Thu Dec 16 13:27:11 2010 -0300 [media] mceusb: add another Fintek device ID Signed-off-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 250f7a5f62a08985af5cf7728ae7ba9edbfdc0a9 Author: Dan Carpenter Date: Wed Nov 17 02:20:15 2010 -0300 [media] lirc_dev: fixes in lirc_dev_fop_read() This makes several changes but they're in one function and sort of related: "buf" was leaked on error. The leak if we try to read an invalid length is the main concern because it could be triggered over and over. If the copy_to_user() failed, then the original code returned the number of bytes remaining. read() is supposed to be the opposite way, where we return the number of bytes copied. I changed it to just return -EFAULT on errors. Also I changed the debug output from "-EFAULT" to just "" because it isn't -EFAULT necessarily. And since we go though that path if the length is invalid now, there was another debug print that I removed. Signed-off-by: Dan Carpenter Reviewed-by: Jarod Wilson Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 5c769a68beaee924e1dc90bf06e1b087b1d46237 Author: Dan Carpenter Date: Wed Nov 17 02:12:23 2010 -0300 [media] lirc_dev: stray unlock in lirc_dev_fop_poll() We shouldn't unlock here. I think this was a cut and paste error. Signed-off-by: Dan Carpenter Acked-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 635f76b2aa8ef3e8436dedddc8baa6f7f438dc40 Author: Paul Bender Date: Thu Dec 16 13:23:07 2010 -0300 [media] rc: fix sysfs entry for mceusb and streamzap When trying to create persistent device names for mceusb and streamzap devices, I noticed that their respective drivers are not creating the rc device as a child of the USB device. Rather it creates it as virtual device. As a result, udev cannot use the USB device information to create persistent device names for event and lirc devices associated with the rc device. Not having persistent device names makes it more difficult to make use of the devices in userspace as their names can change. Signed-off-by: Paul Bender Signed-off-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 1338c925a95cf2b95909d7967b4ebddefa255c02 Author: Jarod Wilson Date: Wed Nov 17 12:25:45 2010 -0300 [media] streamzap: merge timeout space with trailing space There are cases where we get an ending space, and our trailing timeout space then gets sent right after it, which breaks repeat, at least for lirc userspace decoding. Merge the two spaces by way of using ir_raw_event_store_filter, set a timeout value, and we're back to good. Successfully tested with streamzap and windows mce remotes. Signed-off-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 2ee95db222137429407dfcd6801b0f1a8c689771 Author: Jarod Wilson Date: Fri Nov 12 19:49:04 2010 -0300 [media] mceusb: fix keybouce issue after parser simplification Something I failed to notice while testing the mceusb RLE buffer decoding simplification patches was that we were getting an extra event from the previously pressed key. As was pointed out to me on irc by Maxim, this is actually due to using ir_raw_event_store_with_filter without having set up a timeout value. The hardware has a timeout value we're now reading and storing, which properly enables the transition to idle in the raw event storage process, and makes IR decode behave correctly w/o keybounce. Also remove no-longer-used ir_raw_event struct from mceusb_dev struct and add as-yet-unused enable flags for carrier reports and learning mode, which I'll hopefully start wiring up sooner than later. While looking into that, found evidence that 0x9f 0x15 responses are only non-zero when the short-range learning sensor is used, so correct the debug spew message, and then suppress it when using the standard long-range sensor. Signed-off-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 2d6e588c48d4ce6e5d6a2cec3f98ca9e23b2ac2c Author: Jarod Wilson Date: Tue Nov 9 18:42:37 2010 -0300 [media] IR: add tv power scancode to rc6 mce keymap And clean up some stray spaces. Signed-off-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 29b4494b1ff0157c1816ce8e2aea2abfdeb7f763 Author: Jarod Wilson Date: Tue Nov 9 18:41:46 2010 -0300 [media] mceusb: buffer parsing fixups for 1st-gen device If we pass in an offset, we shouldn't skip 2 bytes. And the first-gen hardware generates a constant stream of interrupts, always with two header bytes, and if there's been no IR, with nothing else. Bail from ir processing without calling ir_handle_raw_event when we get such a buffer delivered to us. Signed-off-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 1cd50f25614226e99ac7a1518311e8474ea024e3 Author: Jarod Wilson Date: Tue Nov 9 18:41:03 2010 -0300 [media] mceusb: fix up reporting of trailing space We were storing a bunch of spaces at the end of each signal, rather than a single long space. The in-kernel decoders were actually okay with this, but lirc isn't. As suggested by David Härdeman, switch to storing samples using ir_raw_event_store_with_filter, which auto-merges the consecutive space samples for us. This also allows us to bypass having to store rawir samples in our device struct, further simplifying the buffer parsing state machine. Both in-kernel decoders and lirc are happy again with this change. Also included in this patch is proper parsing of 0x9f 0x01 commands, the removal of some magic number usage and some printk spew fixups. Signed-off-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit b7582815b3fc772e23ee5da884e9a2307bdc1025 Author: Jarod Wilson Date: Tue Nov 9 18:11:04 2010 -0300 [media] nuvoton-cir: improve buffer parsing responsiveness Rather than waiting for trigger bits, the formula for which was slightly messy, and apparently, not actually 100% complete for some remotes, just call ir_raw_event_handle whenever we finish parsing a chunk of data from the rx fifo, similar to mceusb, as well as whenever we see an 'end of signal data' 0x80 packet. Signed-off-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 6f6c625d32852ab2fbfd131ba9a1e5d55ff8032c Author: Jarod Wilson Date: Fri Oct 29 00:07:39 2010 -0300 [media] mceusb: add support for Conexant Hybrid TV RDU253S Another multi-function Conexant device. Interface 0 is IR, though on this model, TX isn't wired up at all, so I've mixed in support for models without TX (and verified that lircd says TX isn't supported when trying to send w/this device). Signed-off-by: Jarod Wilson Signed-off-by: Mauro Carvalho Chehab commit 798174ab6257dc2ba2ee91e242e21491c3922355 Author: Sylwester Nawrocki Date: Thu Nov 25 10:49:21 2010 -0300 [media] s5p-fimc: Fix output DMA handling in S5PV310 IP revisions FIMC IP in S5Pv310 series has extended DMA status registers and some bit fields are marked as reserved comparing to S5PC100/110. Use correct registers for getting DMA write pointer in each SoC variant supported by the driver. Signed-off-by: Sylwester Nawrocki Signed-off-by: Kyungmin Park Signed-off-by: Mauro Carvalho Chehab commit a8365fc205180209bfefaf9d454736bb44071a0f Author: Sylwester Nawrocki Date: Thu Nov 25 09:44:48 2010 -0300 [media] s5p-fimc: Use correct fourcc code for 32-bit RGB format Replace V4L2_PIX_FMT_RGB24 code with V4L2_PIX_FMT_RGB32 since the hardware uses 24-bits for actual pixel data but pixels are 4-byte aligned in memory. Signed-off-by: Sylwester Nawrocki Signed-off-by: Kyungmin Park Signed-off-by: Mauro Carvalho Chehab commit 69e05e837d3b90ea2c58c1117092b8eb4fd4519b Author: Sylwester Nawrocki Date: Thu Nov 18 07:36:34 2010 -0300 [media] s5p-fimc: Convert m2m driver to unlocked_ioctl Signed-off-by: Sylwester Nawrocki Signed-off-by: Kyungmin Park Signed-off-by: Mauro Carvalho Chehab commit aee7126c4e4c0c776ed227751627c151877f2d59 Author: Sylwester Nawrocki Date: Mon Nov 22 14:49:06 2010 -0300 [media] s5p-fimc: Explicitly add required header file Reported by: Dan Carpenter Signed-off-by: Sylwester Nawrocki Signed-off-by: Kyungmin Park Signed-off-by: Mauro Carvalho Chehab commit e004e02f3a121e5293ef56eaca6ee6d4ad60bc64 Author: Sylwester Nawrocki Date: Thu Nov 25 11:01:51 2010 -0300 [media] s5p-fimc: Fix vidioc_g_crop/cropcap on camera sensor Create separate vidioc_g_crop/vidioc_s_crop handlers for capture video node and so image cropping parameters are properly queried at FIMC input (image sensor) and not at FIMC output. Signed-off-by: Sylwester Nawrocki Signed-off-by: Kyungmin Park Signed-off-by: Mauro Carvalho Chehab commit 09b693f0bdf360b6a8e099f26c771c9fca4c3447 Author: Sylwester Nawrocki Date: Tue Nov 30 06:23:10 2010 -0300 [media] s5p-fimc: BKL lock removal - compilation fix Adapt to recent videobuf_queue_dma_contig_init signature change. Signed-off-by: Sylwester Nawrocki Signed-off-by: Kyungmin Park Signed-off-by: Mauro Carvalho Chehab commit cd05e79f72d318d57e625825a5212e3fb90ea4a3 Author: Guennadi Liakhovetski Date: Wed Oct 20 10:14:57 2010 -0300 [media] soc-camera: fix static build of the sh_mobile_csi2.c driver The test for driver->owner != NULL in sh_mobile_ceu_camera.c is unneeded and it breaks the static build of sh_mobile_csi2.c. Remove it. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Mauro Carvalho Chehab commit 42cc37fe20cc680fb58fe12ae5ba718d683b8ca2 Author: Baruch Siach Date: Wed Oct 27 04:03:52 2010 -0300 [media] mx2_camera: fix pixel clock polarity configuration When SOCAM_PCLK_SAMPLE_FALLING, just leave CSICR1_REDGE unset, otherwise we get the inverted behaviour. Signed-off-by: Baruch Siach Signed-off-by: Guennadi Liakhovetski Signed-off-by: Mauro Carvalho Chehab commit 623eb15647fc35c5a8cd38985d5958240eb072c1 Author: Alexey Charkov Date: Mon Dec 20 16:09:57 2010 +0300 fbdev: Modify vsync timing calculation in wm8505fb This removes the '+1' in vsync timing calculation for wm8505fb to directly use values provided from the board setup code. Signed-off-by: Alexey Charkov Signed-off-by: Paul Mundt commit a7f53284e97af9670a68993c31f61a4e62a19ea5 Author: Alexey Charkov Date: Mon Dec 20 16:03:14 2010 +0300 fbdev: Minor cleanup in WM8505-related code This replaces the last remaining driver name reference with the macro for uniformity in wm8505fb. In addition, the error return path in wmt_ge_rops.c is made more uniform by getting rid of goto's in remaining places. Signed-off-by: Alexey Charkov Signed-off-by: Paul Mundt commit 521bc83b0fcda6f323f1de0e7bf137401a8145a2 Author: Andres Salomon Date: Fri Dec 17 19:00:13 2010 -0800 s1d13xxxfb: drop unused code Silence warnings such as - drivers/video/s1d13xxxfb.c:421: warning: ‘bltbit_wait_bitset’ defined but not used Just drop the unused code. Signed-off-by: Andres Salomon Signed-off-by: Paul Mundt commit 4959212c18669f254daa0ae796ad676b67939ba2 Author: Jingoo Han Date: Fri Dec 17 16:45:46 2010 +0900 s3c-fb: add support for runtime pm This patch adds support for runtime pm using the functions. - pm_runtime_get_sync() - pm_runtime_put_sync() pm_runtime_get_sync() and pm_runtime_put_sync() are called when open or release function of framebufer driver is called to inform the system if hardware is idle or not. Signed-off-by: Jingoo Han Signed-off-by: Paul Mundt commit 55f88eccf9c288eed2f93f9ca7d7fe4dd2da762e Author: Asbjoern Sloth Toennesen Date: Sun Dec 12 17:39:40 2010 +0000 kbuild, deb-pkg: support overriding userland architecture Usefull if building for sparc64 userland, because the sparc and sparc64 userlands use the same 64-bit kernel, making it impossible to always select the correct userland architecture for the resulting debian package. Might also be usefull, if you want a i386 userland with a amd64 kernel. Example usage: make KBUILD_DEBARCH=i386 deb-pkg LKML-reference: Signed-off-by: Asbjoern Sloth Toennesen Reviewed-by: WANG Cong Acked-by: maximilian attems Signed-off-by: Michal Marek commit 8bcee1832d23869c2cdb6886ae5210b0143256f0 Merge: 5ce2a2ddb5d75d5e2371e58011fc21351bf278cb 1cf215a5b43950d1a304373037828158057ff9fc Author: Paul Mundt Date: Tue Dec 21 00:40:51 2010 +0900 Merge branch 'rmobile/urgent' into rmobile-latest Conflicts: arch/arm/mach-shmobile/include/mach/entry-macro.S Signed-off-by: Paul Mundt commit 5ce2a2ddb5d75d5e2371e58011fc21351bf278cb Author: Magnus Damm Date: Mon Dec 20 11:00:19 2010 +0000 ARM: mach-shmobile: Bump up NR_IRQS to 1024 Increase NR_IRQS from 512 to 1024 on SH-Mobile ARM. Needed to support vectors in the sh73a0 INTCS block. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 6155f77d09b968f591876f368d4843168910449e Author: Magnus Damm Date: Mon Dec 20 11:04:50 2010 +0000 ARM: mach-shmobile: Clean up headsmp.S Use PAGE_OFFSET and PHYS_OFFSET for secondary_startup entry point as recommended by Russell King. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 56e78dafc4137f86abf6f5f07282afa39ead4056 Author: Yusuke Goda Date: Mon Dec 20 01:06:04 2010 +0000 ARM: mach-shmobile: mackerel: Add GPS support Signed-off-by: Yusuke Goda Signed-off-by: Paul Mundt commit 59bdd133561a432c4655146e283caf85fa64c2fb Author: Marek Vasut Date: Tue Oct 19 17:06:49 2010 +0200 ARM: pxa: Add Balloon3 NAND ready check Signed-off-by: Marek Vasut Signed-off-by: Eric Miao commit 1b9169d8a0fe2b41fbbb8d152c8108190865f3cf Author: Marek Vasut Date: Tue Oct 19 16:19:32 2010 +0200 ARM: pxa: Update Balloon3 for new FPGA firmware The new FPGA firmware in Balloon3 uses different methods to control it's bus control lines. In the new version, there are separate registers to set/clear bus control lines. This patch updates affected places. Signed-off-by: Marek Vasut Signed-off-by: Eric Miao commit e60f137b715b0a19b84502c23a09c5af9107399d Author: Marek Vasut Date: Tue Oct 19 16:17:24 2010 +0200 ARM: pxa: Fix number of IRQs on Balloon3 Signed-off-by: Marek Vasut Signed-off-by: Eric Miao commit 03b505eae6a276b8c38b6222694afb6cea10b1cc Author: Russell King Date: Mon Dec 20 14:44:32 2010 +0000 ARM: SMP: split out software TLB maintainence broadcasting smp.c is becoming too large, so split out the TLB maintainence broadcasting into a separate smp_tlb.c file. Signed-off-by: Russell King commit 10034aabca9032246762daaca3152f3e79380ea0 Author: Russell King Date: Mon Dec 20 14:28:02 2010 +0000 ARM: localtimer: clean up local timer on hot unplug When a CPU is hot unplugged, the generic tick code cleans up the clock event device, but fails to call down to the device's set_mode function to actually shut the device down. To work around this, we've historically had a local_timer_stop() callback out of the hotplug code. However, this adds needless complexity when we have the clock event device itself available. Explicitly call the clock event device's set_mode function with CLOCK_EVT_MODE_UNUSED, so that the hardware can be cleanly shutdown without any special external callbacks. When/if the generic code is fixed, percpu_timer_stop() can be killed off. Signed-off-by: Russell King commit e3d9c625f5e4158014e041f492b46e38ad10987e Author: Russell King Date: Sun Dec 19 11:36:33 2010 +0000 ARM: CPU hotplug: fix hard-coded control register constants Use the definition we've provided in asm/system.h rather than numeric constants. Signed-off-by: Russell King commit e9882777d992b76e0b80deadd66ad886c25f5d1f Author: Russell King Date: Sun Dec 19 11:33:12 2010 +0000 ARM: CPU hotplug: add Versatile Express hotplug CPU support Signed-off-by: Russell King commit d4450261e546953c4a1ce8b48e29164a57c6ed33 Author: Russell King Date: Sun Dec 19 11:30:43 2010 +0000 ARM: CPU hotplug: fix reporting of spurious wakeups The original scheme for reporting spurious wakeups was broken - it tried to use printk() from a context which wasn't coherent with the other CPUs, which risks corrupting the printk() data. Fix this by noting the number spurious wakeups, and only report them when we are properly woken - when we will be coherent with the rest of the system. Signed-off-by: Russell King commit 58613cd1d4f8c2d5f25b6c57ad7fbed80e75a67b Author: Russell King Date: Sat Dec 18 12:34:39 2010 +0000 ARM: smp: improve CPU bringup failure diagnostics We used to print a bland error message which gave no clue as to the failure when we failed to bring up a secondary CPU. Resolve this by separating the two failure cases. If boot_secondary() fails, we print a message indicating the returned error code from boot_secondary(): "CPU%u: failed to boot: %d\n", cpu, ret. However, if boot_secondary() succeeded, but the CPU did not appear to mark itself online within the timeout, indicate that it failed to come online: "CPU%u: failed to come online\n", cpu Signed-off-by: Russell King commit 90b44199e83ec780d6def11a602d825dc68438e3 Author: Russell King Date: Sat Dec 18 10:59:49 2010 +0000 ARM: VFP: re-initialize VFP coprocessor access enables on CPU hotplug We can not guarantee that VFP will be enabled when CPU hotplug brings a CPU back online from a reset state. Add a hotplug CPU notifier to ensure that the VFP coprocessor access is enabled whenever a CPU comes back online. Signed-off-by: Russell King commit 3705ff6da538aff6dba535e2e9cbcbb9456d0d53 Author: Russell King Date: Sat Dec 18 10:53:12 2010 +0000 ARM: Fix subtle race in CPU pen_release hotplug code There is a subtle race in the CPU hotplug code, where a CPU which has been offlined can online itself before being requested, which results in things going astray on the next online/offline cycle. What happens in the normal online/offline/online cycle is: CPU0 CPU3 requests boot of CPU3 pen_release = 3 flush cache line checks pen_release, reads 3 starts boot pen_release = -1 ... requests CPU3 offline ... ... dies ... checks pen_release, reads -1 requests boot of CPU3 pen_release = 3 flush cache line checks pen_release, reads 3 starts boot pen_release = -1 However, as the write of -1 of pen_release is not fully flushed back to memory, and the checking of pen_release is done with caches disabled, this allows CPU3 the opportunity to read the old value of pen_release: CPU0 CPU3 requests boot of CPU3 pen_release = 3 flush cache line checks pen_release, reads 3 starts boot pen_release = -1 ... requests CPU3 offline ... ... dies ... checks pen_release, reads 3 starts boot pen_release = -1 requests boot of CPU3 pen_release = 3 flush cache line Fix this by grouping the write of pen_release along with its cache line flushing code to ensure that any update to pen_release is always pushed out to physical memory. Signed-off-by: Russell King commit ed3768a8d9dc2d345d4f27eb44ee1e4825056c08 Author: Dave Martin Date: Wed Dec 1 15:39:23 2010 +0100 ARM: 6516/1: Allow SMP_ON_UP to work with Thumb-2 kernels. * __fixup_smp_on_up has been modified with support for the THUMB2_KERNEL case. For THUMB2_KERNEL only, fixups are split into halfwords in case of misalignment, since we can't rely on unaligned accesses working before turning the MMU on. No attempt is made to optimise the aligned case, since the number of fixups is typically small, and it seems best to keep the code as simple as possible. * Add a rotate in the fixup_smp code in order to support CPU_BIG_ENDIAN, as suggested by Nicolas Pitre. * Add an assembly-time sanity-check to ALT_UP() to ensure that the content really is the right size (4 bytes). (No check is done for ALT_SMP(). Possibly, this could be fixed by splitting the two uses ot ALT_SMP() (ALT_SMP...SMP_UP versus ALT_SMP...SMP_UP_B) into two macros. In the first case, ALT_SMP needs to expand to >= 4 bytes, not == 4.) * smp_mpidr.h (which implements ALT_SMP()/ALT_UP() manually due to macro limitations) has not been modified: the affected instruction (mov) has no 16-bit encoding, so the correct instruction size is satisfied in this case. * A "mode" parameter has been added to smp_dmb: smp_dmb arm @ assumes 4-byte instructions (for ARM code, e.g. kuser) smp_dmb @ uses W() to ensure 4-byte instructions for ALT_SMP() This avoids assembly failures due to use of W() inside smp_dmb, when assembling pure-ARM code in the vectors page. There might be a better way to achieve this. * Kconfig: make SMP_ON_UP depend on (!THUMB2_KERNEL || !BIG_ENDIAN) i.e., THUMB2_KERNEL is now supported, but only if !BIG_ENDIAN (The fixup code for Thumb-2 currently assumes little-endian order.) Tested using a single generic realview kernel on: ARM RealView PB-A8 (CONFIG_THUMB2_KERNEL={n,y}) ARM RealView PBX-A9 (SMP) Signed-off-by: Dave Martin Acked-by: Nicolas Pitre Signed-off-by: Russell King commit 86e62b93368cffca9111996e3ed9e5b7bf6f0af3 Author: Russell King Date: Tue Nov 30 18:24:57 2010 +0000 ARM: SMP: remove smp_mpidr.h With "ARM: CPU hotplug: remove bug checks in platform_cpu_die()", we now do not use hard_smp_processor_id(), we no longer need to read the hardware processor ID. Remove the include providing this function. Signed-off-by: Russell King commit f36d340122ae8744e64af0a92a6f77b97542c0a4 Author: Russell King Date: Tue Nov 30 12:21:30 2010 +0000 ARM: CPU hotplug: ensure correct ordering of unplug Don't call idle_task_exit() with interrupts disabled, and ensure that we have a memory barrier after interrupts are disabled but before signalling that this CPU has shut down. Signed-off-by: Russell King commit bbc81fd4327f9ed4480b05981e38acd48b1d184a Author: Russell King Date: Tue Nov 30 11:12:30 2010 +0000 ARM: CPU hotplug: remove bug checks in platform_cpu_die() platform_cpu_die() is entered from the CPU's own idle thread, which can not be migrated to other CPUs. Moreover, the 'cpu' argument comes from the thread info, which will always be the 'current' CPU. So remove this useless bug check. Signed-off-by: Russell King commit 3c030beabf937b1d3b4ecaedfd1fb2f1e2aa0c70 Author: Russell King Date: Tue Nov 30 11:07:35 2010 +0000 ARM: CPU hotplug: move cpu_killed completion to core code We always need to wait for the dying CPU to reach a safe state before taking it down, irrespective of the requirements of the platform. Move the completion code into the ARM SMP hotplug code rather than having each platform re-implement this. Signed-off-by: Russell King commit 2c0136dba4e43b0916ccc9ecc7f11e6d6b73f046 Author: Russell King Date: Fri Dec 3 15:00:49 2010 +0000 ARM: SMP: consolidate trace_hardirqs_off() into common SMP code All platforms call trace_hardirqs_off() in their secondary startup code, so move this into the core SMP code - it doesn't need to be in the per-platform code. Signed-off-by: Russell King commit 05c74a6cbcfb416286a947668ba32f63d99fe74a Author: Russell King Date: Fri Dec 3 11:09:48 2010 +0000 ARM: SMP: consolidate the common parts of smp_prepare_cpus() There is a certain amount of smp_prepare_cpus() which doesn't belong in the platform support code - that is, code which is invariant to the SMP implementation. Move this code into arch/arm/kernel/smp.c, and add a platform_ prefix to the original function. Signed-off-by: Russell King commit aec66ba1f75c2030cf66f5a21d1c81aa83aa5d95 Author: Russell King Date: Thu Dec 2 19:10:01 2010 +0000 ARM: SMP: get rid of references to poke_milo and Milo Milo is an old boot loader, which is no longer relevant for these platforms. References to it are misleading. Move the code out of poke_milo(), and remove references to milo in comments. Signed-off-by: Russell King commit fd778f0ad7dda1108281410ddca0d07936256d3c Author: Russell King Date: Thu Dec 2 18:09:37 2010 +0000 ARM: SMP: get rid of get_core_count() We don't need this small function as well as scu_get_core_count() Signed-off-by: Russell King commit 8975b6c0fdd57e061f4d1040163778ceaf340ad8 Author: Russell King Date: Fri Dec 3 19:29:53 2010 +0000 ARM: SMP: Clean up ncores sanity checks scu_get_core_count() never returns zero cores, so we don't need to check and correct if ncores is zero. Tegra was missing the check against NR_CPUS, leading to a potential bitfield overflow if this becomes the case. Signed-off-by: Russell King commit bbc3d14e9aca023bb98e580aa1c9350af8effdb1 Author: Russell King Date: Fri Dec 3 10:42:58 2010 +0000 ARM: SMP: move CPU number sanity checks to smp_init_cpus() Ensure that the number of CPUs is sanity checked before setting the number of possible CPUs. This avoids any chance of overflowing the cpu_possible bitmap. Signed-off-by: Russell King commit 28e18293cf0f8d23a0950d7b1d2212d11af494dc Author: Russell King Date: Thu Dec 2 09:53:54 2010 +0000 ARM: SMP: ensure smp_send_stop() waits for CPUs to stop Wait for CPUs to indicate that they've stopped, after sending the stop IPI, rather than blindly continuing on and hoping that they've stopped in time. Print a warning if we fail to stop the other CPUs. Signed-off-by: Russell King commit 0eb0511d176534674600a1986c3c766756288908 Author: Russell King Date: Mon Nov 22 12:06:28 2010 +0000 ARM: SMP: use more sane register allocation for __fixup_smp_on_up Use r0,r3-r6 rather than r0,r3,r4,r6,r7, which makes it easier to understand which registers can be modified. Also document which registers hold values which must be preserved. Signed-off-by: Russell King commit b54992fe1b4bad7b7488d58b8696e4e8974fdab0 Author: Russell King Date: Mon Nov 15 14:46:46 2010 +0000 ARM: SMP: collect IPI and local timer IRQs for /proc/stat The IPI and local timer interrupts weren't being properly accounted for in /proc/stat. Collect them from the irq_stat structure, and return their sum. Reviewed-by: Catalin Marinas Signed-off-by: Russell King commit 4a88abd7b48e8ec8084b1252d0f5ebdab43c2508 Author: Russell King Date: Mon Nov 15 14:40:29 2010 +0000 ARM: SMP: provide individual IPI interrupt statistics This separates out the individual IPI interrupt counts from the total IPI count, which allows better visibility of what IPIs are being used for. Reviewed-by: Catalin Marinas Signed-off-by: Russell King commit 3534cccd26afdfd3ce0915a4942afca185f2a39b Author: Bjorn Forsman Date: Wed Nov 3 00:46:04 2010 +0100 ARM: pxa/colibri: setup pins for USB host port 3 Tested on a Colibri Evaluation Board Rev.2.1 with a Colibri PXA310 module. Signed-off-by: Bjorn Forsman Signed-off-by: Marek Vasut commit e97d0fac8492dd6566f71f9c81ed453c2105f459 Author: Mark F. Brown Date: Mon Dec 13 22:56:59 2010 -0500 ARM: mmp: refactored 5V regulator support using fixed-regulator Signed-off-by: Mark F. Brown Reviewed-by: Mark Brown Signed-off-by: Eric Miao commit a8fb0b55314144a37755729d3b40b027b0020e3c Author: Eric Miao Date: Sat Dec 18 21:57:07 2010 +0800 ARM: mmp: correct the naming of GPIOxx_GPIO definitions Signed-off-by: Eric Miao commit 5fe2acce127638ccf1123e8a079ca12e8db5b7c1 Author: Marek Vasut Date: Mon Aug 9 06:13:06 2010 +0200 ARM: pxa: Add gpio-leds and vibrator support to PalmTC Signed-off-by: Marek Vasut Acked-by: Haojian Zhuang Signed-off-by: Eric Miao commit 4c6a832d2841a3bacc3327380dfc0660c22a71fb Author: Marek Vasut Date: Mon Aug 9 05:01:45 2010 +0200 ARM: pxa: Modularize Palm Tungsten|C Signed-off-by: Marek Vasut Signed-off-by: Eric Miao commit fd62999bad9fc3b176ef6bc9d2a71be940efd908 Author: Marek Vasut Date: Wed Aug 11 05:04:53 2010 +0200 ARM: pxa: Colibri PXA320 PCMCIA driver Signed-off-by: Marek Vasut Acked-by: Daniel Mack Signed-off-by: Eric Miao commit c085052bc52d7caaca1172aabbedc06777253961 Author: Eric Miao Date: Mon Nov 29 22:56:00 2010 +0800 ARM: pxa: add clock for static memory controller Signed-off-by: Eric Miao commit a3172e5413a06af772c6ad34c0f68a2ebbdbcf86 Author: Marek Vasut Date: Thu Aug 12 01:45:05 2010 +0200 ARM: pxa: Rename Colibri evalboard Rename colibri-pxa270-evalboard to colibri-evalboard as this board is used with all Colibri modules. Signed-off-by: Marek Vasut Acked-by: Daniel Mack Signed-off-by: Eric Miao commit 072e1ae73c65496355279505de378b33c916e364 Author: Marek Vasut Date: Thu Aug 12 01:30:39 2010 +0200 ARM: pxa: Add M41T00 RTC support into Colibri evalboard Signed-off-by: Marek Vasut Acked-by: Daniel Mack Signed-off-by: Eric Miao commit 9b6956f45132f9bf696e9f6c2e457bdfa8e08721 Author: Marek Vasut Date: Thu Aug 12 01:18:38 2010 +0200 ARM: pxa: Push Colibri evalboard MFP into module files This change -- pushing the MFP configuration back into Module files -- is necessary because some evalboards can be used with multiple modules, where MFP differs from module to module. Therefore MFP isn't board-specific, but module-specific and the module should preconfigure itself for the board. (And there is also the C preprocesor limitation and conflicting #define-s) Signed-off-by: Marek Vasut Acked-by: Daniel Mack Signed-off-by: Eric Miao commit 960c0acaabf603e39b121ae5c0580aaca6f8aa7b Author: Marek Vasut Date: Wed Aug 11 03:32:53 2010 +0200 ARM: pxa: Toradex Colibri PXA270 CF support This driver also contains structures to eventually support PXA320. This is planned to be added in a later patch. Signed-off-by: Marek Vasut Acked-by: Daniel Mack Signed-off-by: Eric Miao commit a4257af5b0c5479bb81597579841e9daaeccd7f6 Author: Marek Vasut Date: Wed Nov 3 16:26:42 2010 +0100 ARM: pxa: Add pxa320 PCMCIA check On PXA320, there's only one PCMCIA slot available. Check for cases where the user would want to register multiple. Also, rework failpath. Signed-off-by: Marek Vasut Signed-off-by: Eric Miao commit ef6c84454f8567d4968c210d7d194fb711ed3739 Author: Haojian Zhuang Date: Wed Nov 24 11:54:25 2010 +0800 ARM: pxa: add iwmmx support for PJ4 iwmmxt is used in XScale, XScale3, Mohawk and PJ4 core. But the instructions of accessing CP0 and CP1 is changed in PJ4. Append more files to support iwmmxt in PJ4 core. Signed-off-by: Zhou Zhu Signed-off-by: Haojian Zhuang Acked-by: Nicolas Pitre Signed-off-by: Eric Miao commit f13cd4170ee789f63b3c9585c1ae34e028bd549d Author: Russell King Date: Mon Nov 15 14:33:51 2010 +0000 ARM: fix /proc/interrupts formatting As per x86, align the initial column according to how many IRQs we have. Also, provide an english explaination for the 'LOC:' and 'IPI:' lines. Reviewed-by: Catalin Marinas Signed-off-by: Russell King commit cab8c6f3053c1b147bba825844c8e208f8b3b9f4 Author: Russell King Date: Mon Nov 15 14:20:41 2010 +0000 ARM: SMP: move ipi_count into irq_stat structure Move the ipi_count into irq_stat, which allows the ipi_data structure to be entirely removed. Reviewed-by: Catalin Marinas Signed-off-by: Russell King commit 46c48f222f568decb881a552caa1c8f9c96c521e Author: Russell King Date: Mon Nov 15 14:15:03 2010 +0000 ARM: SMP: provide accessors for irq_stat data Provide __inc_irq_stat() and __get_irq_stat() to increment and read the irq stat counters. Reviewed-by: Catalin Marinas Signed-off-by: Russell King commit ec405ea9fe5fdeb40824edba7082803b3e98f176 Author: Russell King Date: Mon Nov 15 13:38:06 2010 +0000 ARM: include local timer irq stats only when local timers configured Reviewed-by: Catalin Marinas Signed-off-by: Russell King commit e3fbb087650df130788d8e3ac29875ee56819249 Author: Russell King Date: Mon Dec 20 14:47:19 2010 +0000 ARM: SMP: remove send_ipi_message() send_ipi_message() does nothing except call smp_cross_call(). As this is a static function, nothing external to this file calls it, so we can easily clean up this now unnecessary indirection. Signed-off-by: Russell King commit 6e5f6856427abe5418f535cb46c454ae8ea7f8e7 Author: Geert Uytterhoeven Date: Wed Aug 25 12:22:40 2010 +0200 checksyscalls: Fix stand-alone usage The usage help in the comments - refers to the wrong script name, - doesn't mention that $srctree must be set. Hence correct the script name, and derive the source tree path from the script path, so we no longer need to rely on $srctree being set by the caller. Signed-off-by: Geert Uytterhoeven Acked-by: Sam Ravnborg Signed-off-by: Michal Marek commit 22f075a8d8bb5a8d203392df809739c1817e578f Author: Henrik Rydberg Date: Mon Dec 20 15:09:27 2010 +0100 input: mt: Document interface updates This patch documents the recent input-mt interface changes. Signed-off-by: Henrik Rydberg commit 763eef8b5b64dbbfc0f6273af9a57024069785a9 Author: Vincent Guittot Date: Fri Dec 3 18:18:39 2010 +0100 ux500: add debugfs support for powerdebug Signed-off-by: Vincent Guittot Signed-off-by: Linus Walleij commit abda3a24a99998279fe890ea8a789ebe4d605d78 Author: Samuel Ortiz Date: Mon Dec 20 13:01:30 2010 +0100 mfd: Use dummy_irq_chip for tc3589x This also converts tc3589x to the new irq API. Cc: Rabin Vincent Signed-off-by: Samuel Ortiz Signed-off-by: Linus Walleij commit ee81e7a0a86a3b40837de4a5f514c2d3758af20e Merge: 1ae1b5f053cf36bd0f913e83f3b136fec8152d4d 6d3e6d3640052cac958d61c44597cc216f6ee09f Author: Russell King Date: Mon Dec 20 11:03:35 2010 +0000 Merge branch 'kmap_atomic_fixes' of git://git.linaro.org/people/nico/linux commit 289569f902dc70fc42b8c7cab627f9d615a720f1 Author: Shawn Guo Date: Sat Dec 18 21:39:28 2010 +0800 ARM: mxs: Add interrupt support Add Interrupt Collector (ICOLL) support for MXS-based. Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit 65d7d94405dcc1845ad2680eeb6af43ced74fdc4 Author: Shawn Guo Date: Sat Dec 18 21:39:27 2010 +0800 ARM: mxs: Add reset routines - The mxs wdog is implemented in RTC block. - There is a generic software reset routine for most modules on mxs. Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit 022c92befa539174125b0a1b5e52dd57affefe9f Author: David Henningsson Date: Fri Dec 17 20:43:04 2010 +0100 ALSA: HDA: Add auto-mute for Thinkpad SL410/SL510 BugLink: http://launchpad.net/bugs/580006 SKU turns off auto-mute for these machines, so ignore the SKU. Signed-off-by: David Henningsson Signed-off-by: Takashi Iwai commit fcd3027abbbcc26248714eddae40af3fb3c8a82e Author: Henrik Rydberg Date: Sat Dec 18 20:28:26 2010 +0100 Input: fix double equality sign in uevent Looking at the uevent stream for input devices, all properties are on the form "A=B" except the bitmap values, which are on the form "A==B". This bug has been around at least since 2007, and the input uevent code has been untouched since. The recent addition of device properties suggests this is a good time for a remedy. Acked-by: Dmitry Torokhov Signed-off-by: Henrik Rydberg commit 85b7720039fc000b561c20fe2aaa3b54cddae4a7 Author: Henrik Rydberg Date: Sat Dec 18 20:51:13 2010 +0100 Input: introduce device properties Today, userspace sets up an input device based on the data it emits. This is not always enough; a tablet and a touchscreen may emit exactly the same data, for instance, but the former should be set up with a pointer whereas the latter does not need to. Recently, a new type of touchpad has emerged where the buttons are under the pad, which changes logic without changing the emitted data. This patch introduces a new ioctl, EVIOCGPROP, which enables user access to a set of device properties useful during setup. The properties are given as a bitmap in the same fashion as the event types, and are also made available via sysfs, uevent and /proc/bus/input/devices. Acked-by: Ping Cheng Acked-by: Chase Douglas Acked-by: Dmitry Torokhov Signed-off-by: Henrik Rydberg commit 4c306a9291a077879fc3e933326caac3bc319caa Author: Shan Wei Date: Sun Dec 19 21:59:35 2010 -0800 net: kill unused macros These macros never be used, so remove them. Signed-off-by: Shan Wei Signed-off-by: David S. Miller commit ba27d85c96c57111ae8acfa959643e5ce8e4bcbe Author: Tejun Heo Date: Wed Dec 15 04:03:29 2010 +0000 vxge: add missing flush of reset_task Commit 6e07ebd84 (drivers/net: remove unnecessary flush_scheduled_work() calls) incorrectly removed the flush call without replacing it with the appropriate work specific operation. Fix it by flushing vdev->reset_task explicitly. Pointed out by Jon Mason. Signed-off-by: Tejun Heo Cc: Jon Mason Acked-by: Jon Mason Signed-off-by: David S. Miller commit 71d9dec24dce548bf699815c976cf063ad9257e2 Author: Changli Gao Date: Wed Dec 15 19:57:25 2010 +0000 net: increase skb->users instead of skb_clone() In dev_queue_xmit_nit(), we have to clone skbs as we need to mangle skbs, however, we don't need to clone skbs for all the packet_types. Except for the first packet_type, we increase skb->users instead of skb_clone(). Signed-off-by: Changli Gao Acked-by: Eric Dumazet Signed-off-by: David S. Miller commit 1a75972c61f2c224eb5283c183f9f6b17fb09b6b Author: Eric Dumazet Date: Tue Dec 14 22:39:58 2010 +0000 ifb: use netif_receive_skb() instead of netif_rx() In ri_tasklet(), we run from softirq, so can directly handle packet through netif_receive_skb() instead of netif_rx(). There is no risk of recursion. Signed-off-by: Eric Dumazet Acked-by: Changli Gao Signed-off-by: David S. Miller commit ad0081e43af6de3fecf308b0d098f9611835766b Author: David Stevens Date: Fri Dec 17 11:42:42 2010 +0000 ipv6: Fragment locally generated tunnel-mode IPSec6 packets as needed. This patch modifies IPsec6 to fragment IPv6 packets that are locally generated as needed. This version of the patch only fragments in tunnel mode, so that fragment headers will not be obscured by ESP in transport mode. Signed-off-by: David L Stevens Acked-by: Herbert Xu Signed-off-by: David S. Miller commit 68d3059665c4a57223f855eb02f9ab7ce5b3a593 Author: Dave Airlie Date: Mon Dec 20 10:54:48 2010 +1000 drm/radeon: use aperture size not vram size for overlap tests This fixes a problem where the wrong card conflicts with vesafb in my x2 system. Signed-off-by: Dave Airlie commit 050c6c9b896625d9fa498265be17b82c5fc65257 Author: Ingo Molnar Date: Sun Dec 19 23:24:27 2010 +0100 sched: Remove debugging check Linus reported that the new warning introduced by commit f26f9aff6aaf "Sched: fix skip_clock_update optimization" triggers. The need_resched flag can be set by other CPUs asynchronously so this debug check is bogus - remove it. Reported-by: Linus Torvalds Cc: Peter Zijlstra Cc: Mike Galbraith LKML-Reference: Signed-off-by: Ingo Molnar commit 3c5728edbeb44819dba25a3c1b56702c87c9e419 Author: Jonas Aaberg Date: Wed Dec 15 08:36:02 2010 +0100 ux500: platsmp: Fix section mismatch Signed-off-by: Jonas Aaberg Signed-off-by: Linus Walleij commit 556fb03869ad4d14e5336093a7a8565456a26c21 Author: Sundar Iyer Date: Fri Dec 3 20:35:38 2010 +0530 mach-ux500: add STMPE1601 platform data Signed-off-by: Sundar Iyer [Minor fixups to GPIO enumerators] Signed-off-by: Linus Walleij commit e43abe6f98641e40460d74a002f09c7751db48f9 Author: Sundar Iyer Date: Fri Dec 3 20:35:36 2010 +0530 mach-ux500: move keymaps to new file Move keylayouts to a dedicated file and plug these keylayouts for input platform data. This will make addition of new and custom keylayouts localized. Signed-off-by: Sundar Iyer Signed-off-by: Linus Walleij commit 55ec86f848a5f872fd43f5d7206464a0af419110 Merge: 21228e455756be11fbbcae7e1a184ad9d842f687 147dd5610c8d1bacb88a6c1dfdaceaf257946ed0 d949750fed168b6553ca11ed19e4affd19d7a4d7 Author: Linus Torvalds Date: Sun Dec 19 10:44:54 2010 -0800 Merge branches 'x86-fixes-for-linus' and 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86-32: Make sure we can map all of lowmem if we need to x86, vt-d: Handle previous faults after enabling fault handling x86: Enable the intr-remap fault handling after local APIC setup x86, vt-d: Fix the vt-d fault handling irq migration in the x2apic mode x86, vt-d: Quirk for masking vtd spec errors to platform error handling logic x86, xsave: Use alloc_bootmem_align() instead of alloc_bootmem() bootmem: Add alloc_bootmem_align() x86, gcc-4.6: Use gcc -m options when building vdso x86: HPET: Chose a paranoid safe value for the ETIME check x86: io_apic: Avoid unused variable warning when CONFIG_GENERIC_PENDING_IRQ=n * 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: perf: Fix off by one in perf_swevent_init() perf: Fix duplicate events with multiple-pmu vs software events ftrace: Have recordmcount honor endianness in fn_ELF_R_INFO scripts/tags.sh: Add magic for trace-events tracing: Fix panic when lseek() called on "trace" opened for writing commit 21228e455756be11fbbcae7e1a184ad9d842f687 Merge: 0a59228168d3722b71f8e3dbc623316fb4be78f4 8e92c20183ed0579d94501311b81c42b65cb2129 Author: Linus Torvalds Date: Sun Dec 19 10:37:37 2010 -0800 Merge branch 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: sched: Fix the irqtime code for 32bit sched: Fix the irqtime code to deal with u64 wraps nohz: Fix get_next_timer_interrupt() vs cpu hotplug Sched: fix skip_clock_update optimization sched: Cure more NO_HZ load average woes commit 593e9d70fb0f1ece1cf2a61c701dec35d8e41f8d Author: Sundar Iyer Date: Mon Dec 13 09:33:18 2010 +0530 mfd/tc3589x: add suspend/resume support Acked-by: Samuel Ortiz Signed-off-by: Sundar Iyer Signed-off-by: Linus Walleij commit 523bc3820f023169671e9726b8dc075669d14bec Author: Sundar Iyer Date: Mon Dec 13 09:33:17 2010 +0530 mfd/tc3589x: undo gpio module reset during chip init Skip putting the GPIO module into a reset during the chip init. This makes sure to preserve any existing GPIO configurations done by pre-kernel boot code. Acked-by: Samuel Ortiz Signed-off-by: Sundar Iyer Signed-off-by: Linus Walleij commit bd77efd0cea80865d4cfcc1e4b62789c51a74b2d Author: Sundar Iyer Date: Mon Dec 13 09:33:16 2010 +0530 mfd/tc3589x: fix random interrupt misses On the TC35892, a random delayed interrupt clear (GPIO IC) write locks up the child interrupts. In such a case, the original interrupt is active and not yet acknowledged. Re-check the IRQST bit for any pending interrupts and handle those. Acked-by: Samuel Ortiz Signed-off-by: Sundar Iyer Signed-off-by: Linus Walleij commit 611b7590afa6e6c6b0942b1d3efef17fbb348ef5 Author: Sundar Iyer Date: Mon Dec 13 09:33:15 2010 +0530 mfd/tc3589x: add block identifier for multiple child devices Add block identifier to be able to add multiple mfd clients to the mfd core Acked-by: Samuel Ortiz Signed-off-by: Sundar Iyer Signed-off-by: Linus Walleij commit 20406ebff4a298e6e3abbc1717a90bb3e55dc820 Author: Sundar Iyer Date: Mon Dec 13 09:33:14 2010 +0530 mfd/tc3589x: rename tc35892 structs/registers to tc359x Most of the register layout, client IRQ numbers on the TC35892 is shared also by other variants. Make this generic as tc3589x Acked-by: Samuel Ortiz Signed-off-by: Sundar Iyer Signed-off-by: Linus Walleij commit f4e8afdc7ab1b5a0962be02a9dd15d29a81f4c53 Author: Sundar Iyer Date: Mon Dec 13 09:33:13 2010 +0530 mfd/tc35892: rename tc35892 core driver to tc3589x Rename the tc35892 core/gpio drivers to tc3589x to include new variants in the same mfd core Acked-by: Samuel Ortiz Signed-off-by: Sundar Iyer Signed-off-by: Linus Walleij commit c6eda6c5eeb357ff231121619fb49d2bc0605faf Author: Sundar Iyer Date: Mon Dec 13 09:33:12 2010 +0530 mfd/tc35892: rename tc35892 header to tc3589x Rename the header file to include further variants within the same mfd core driver Acked-by: Samuel Ortiz Signed-off-by: Sundar Iyer Signed-off-by: Linus Walleij commit d5d228158e77998a1659c1783fb204f275fab93b Author: Sundar Iyer Date: Mon Dec 13 09:33:11 2010 +0530 mach-ux500: deprecate spi support for ab8500 Acked-by: Samuel Ortiz Signed-off-by: Sundar Iyer Signed-off-by: Linus Walleij commit 6d3e6d3640052cac958d61c44597cc216f6ee09f Author: Nicolas Pitre Date: Thu Dec 16 14:56:34 2010 -0500 ARM: fix cache-feroceon-l2 after stack based kmap_atomic() Since commit 3e4d3af501 "mm: stack based kmap_atomic()", it is actively wrong to rely on fixed kmap type indices (namely KM_L2_CACHE) as kmap_atomic() totally ignores them and a concurrent instance of it may happily reuse any slot for any purpose. Because kmap_atomic() is now able to deal with reentrancy, we can get rid of the ad hoc mapping here. While the code is made much simpler, there is a needless cache flush introduced by the usage of __kunmap_atomic(). It is not clear if the performance difference to remove that is worth the cost in code maintenance (I don't think there are that many highmem users on that platform anyway) but that should be reconsidered when/if someone cares enough to do some measurements. Signed-off-by: Nicolas Pitre commit 25cbe45440ea89a3b0f6f7ed326d3d476d53068b Author: Nicolas Pitre Date: Wed Dec 15 23:29:04 2010 -0500 ARM: fix cache-xsc3l2 after stack based kmap_atomic() Since commit 3e4d3af501 "mm: stack based kmap_atomic()", it is actively wrong to rely on fixed kmap type indices (namely KM_L2_CACHE) as kmap_atomic() totally ignores them and a concurrent instance of it may happily reuse any slot for any purpose. Because kmap_atomic() is now able to deal with reentrancy, we can get rid of the ad hoc mapping here, and we even don't have to disable IRQs anymore (highmem case). While the code is made much simpler, there is a needless cache flush introduced by the usage of __kunmap_atomic(). It is not clear if the performance difference to remove that is worth the cost in code maintenance (I don't think there are that many highmem users on that platform if at all anyway). Signed-off-by: Nicolas Pitre commit 39af22a79232373764904576f31572f1db76af10 Author: Nicolas Pitre Date: Wed Dec 15 15:14:45 2010 -0500 ARM: get rid of kmap_high_l1_vipt() Since commit 3e4d3af501 "mm: stack based kmap_atomic()", it is no longer necessary to carry an ad hoc version of kmap_atomic() added in commit 7e5a69e83b "ARM: 6007/1: fix highmem with VIPT cache and DMA" to cope with reentrancy. In fact, it is now actively wrong to rely on fixed kmap type indices (namely KM_L1_CACHE) as kmap_atomic() totally ignores them now and a concurrent instance of it may reuse any slot for any purpose. Signed-off-by: Nicolas Pitre commit 991a86e182203913b71607f0695955d7e23075d7 Author: Linus Walleij Date: Fri Dec 10 09:35:53 2010 +0100 ARM: 6530/1: mmci: partially revert clock divisor code I misread the datasheet as if bypass mode was not available at all on the ux500's, I was wrong. It is there, the datasheet just states that you should not have to use it. Signed-off-by: Linus Walleij Signed-off-by: Russell King commit b70a67f938e4a7544ca4dea2856b88f3c47669ff Author: Linus Walleij Date: Mon Dec 6 09:24:14 2010 +0100 ARM: 6526/1: mmci: corrected calculation of clock div for ux500 The Ux500 variant of this block has a different divider. The value used right now is too big and which means a loss in performance. This fix corrects it. Also expand the math comments a bit so it's clear what's happening. Further the Ux500 variant does not like if we use the BYPASS bit, instead we are supposed to set the clock divider to zero. Signed-off-by: Ulf Hansson Signed-off-by: Linus Walleij Signed-off-by: Russell King commit 132b16325fae0742a02075894af16197e83febe8 Author: Russell King Date: Mon Dec 13 13:14:55 2010 +0000 ARM: AT91: update clock source registration In d7e81c2 (clocksource: Add clocksource_register_hz/khz interface) new interfaces were added which simplify (and optimize) the selection of the divisor shift/mult constants. Switch over to using this new interface. Acked-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Russell King commit 40cc52440073903f3b7477a3391c4ca0761445d0 Author: Russell King Date: Sun Dec 19 15:43:34 2010 +0000 ARM: clockevents: fix IOP clock events initialization Ensure that no interrupt is pending before registering the clock event device, and properly initialize the periodic tick in the ->set_mode callback. Signed-off-by: Russell King commit 19e5eebb8eaa5ca3ff8aa18cb57ccb7a9f67277d Author: Paul Turner Date: Wed Dec 15 19:10:18 2010 -0800 sched: Fix interactivity bug by charging unaccounted run-time on entity re-weight Mike Galbraith reported poor interactivity[*] when the new shares distribution code was combined with autogroups. The root cause turns out to be a mis-ordering of accounting accrued execution time and shares updates. Since update_curr() is issued hierarchically, updating the parent entity weights to reflect child enqueue/dequeue results in the parent's unaccounted execution time then being accrued (vs vruntime) at the new weight as opposed to the weight present at accumulation. While this doesn't have much effect on processes with timeslices that cross a tick, it is particularly problematic for an interactive process (e.g. Xorg) which incurs many (tiny) timeslices. In this scenario almost all updates are at dequeue which can result in significant fairness perturbation (especially if it is the only thread, resulting in potential {tg->shares, MIN_SHARES} transitions). Correct this by ensuring unaccounted time is accumulated prior to manipulating an entity's weight. [*] http://xkcd.com/619/ is perversely Nostradamian here. Signed-off-by: Paul Turner Signed-off-by: Peter Zijlstra Cc: Mike Galbraith Cc: Linus Torvalds LKML-Reference: <20101216031038.159704378@google.com> Signed-off-by: Ingo Molnar commit 43365bd7ff37979d2afdccbe953299ed64a4649b Author: Paul Turner Date: Wed Dec 15 19:10:17 2010 -0800 sched: Move periodic share updates to entity_tick() Long running entities that do not block (dequeue) require periodic updates to maintain accurate share values. (Note: group entities with several threads are quite likely to be non-blocking in many circumstances). By virtue of being long-running however, we will see entity ticks (otherwise the required update occurs in dequeue/put and we are done). Thus we can move the detection (and associated work) for these updates into the periodic path. This restores the 'atomicity' of update_curr() with respect to accounting. Signed-off-by: Paul Turner Signed-off-by: Peter Zijlstra LKML-Reference: <20101216031038.067028969@google.com> Signed-off-by: Ingo Molnar commit ca680888d5d0d03862ec311a83c6a1c7a1e00a01 Merge: 40dc11ffb35e8c4e8fa71092048e0f8de9db758c b0c3844d8af6b9f3f18f31e1b0502fbefa2166be Author: Ingo Molnar Date: Sun Dec 19 16:35:08 2010 +0100 Merge commit 'v2.6.37-rc6' into sched/core Merge reason: Update to the latest -rc. Signed-off-by: Ingo Molnar commit c16714704bb35165e5b85d927873dcc643772648 Author: Stefan Richter Date: Fri Dec 17 22:22:33 2010 +0100 firewire: net: set carrier state at ifup At ifup, carrier status would be shown on even if it actually was off. Also add an include for ethtool_ops rather than to rely on the one from netdevice.h. Note, we can alas not use fwnet_device_mutex to serialize access to dev->peer_count (as I originally wanted). This would cause a lock inversion: - fwnet_probe | takes fwnet_device_mutex + register_netdev | takes rtnl_mutex - devinet_ioctl | takes rtnl_mutex + fwnet_open | ...must not take fwnet_device_mutex Hence use the dev->lock spinlock for serialization. Signed-off-by: Stefan Richter commit 18bb36f9fab5980efeff063755c037a622f0231c Author: Maxim Levitsky Date: Wed Dec 8 04:22:57 2010 +0200 firewire: net: add carrier detection To make userland, e.g. NetworkManager work with firewire, we need to detect whether cable is plugged or not. Simple and correct way of doing that is just counting number of peers. No peers - no link and vice versa. Signed-off-by: Stefan Richter commit da169f5df2764a6a937cb3b07562e269edfb1c0e Author: Robert Richter Date: Fri Sep 24 15:54:43 2010 +0200 oprofile, x86: Add support for 6 counters (AMD family 15h) This patch adds support for up to 6 hardware counters for AMD family 15h cpus. There is a new MSR range for hardware counters beginning at MSRC001_0200 Performance Event Select (PERF_CTL0). Signed-off-by: Robert Richter commit 30570bced107243d5227527dd5317b22883dcf0c Author: Robert Richter Date: Tue Aug 31 10:44:38 2010 +0200 oprofile, x86: Add support for AMD family 15h This patch adds support for AMD family 15h (Interlagos/Valencia/ Zambezi) cpus. Signed-off-by: Robert Richter commit d03a5d888fb688c832d470b749acc5ed38e0bc1d Author: Tetsuo Handa Date: Sun Dec 19 12:54:22 2010 +0900 MAINTAINERS: Add tomoyo-dev-en ML. MAINTAINERS: Add tomoyo-dev-en ML. Signed-off-by: Tetsuo Handa Signed-off-by: James Morris commit d1ed113f1669390da9898da3beddcc058d938587 Author: stephen hemminger Date: Thu Dec 16 17:42:54 2010 +0000 ipv6: remove duplicate neigh_ifdown When device is being set to down, neigh_ifdown was being called twice. Once from addrconf notifier and once from ndisc notifier. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller commit bc3ef6605ea325e41b586a76aadc3f731c317504 Author: stephen hemminger Date: Thu Dec 16 17:42:40 2010 +0000 ipv6: fib6_ifdown cleanup Remove (unnecessary) casts to make code cleaner. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller commit 0a59228168d3722b71f8e3dbc623316fb4be78f4 Merge: 2ba16c4f456eb63f54b1d8b065377d41a1cd6a14 81711cee933599fa114abb0d258d8bbabef8adfb Author: Linus Torvalds Date: Sat Dec 18 10:28:54 2010 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile * git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile: arch/tile: handle rt_sigreturn() more cleanly arch/tile: handle CLONE_SETTLS in copy_thread(), not user space commit 2ba16c4f456eb63f54b1d8b065377d41a1cd6a14 Merge: 46bdfe6a50b88942f5323f837a3afd93a1c86e60 081d835fa4ce70ad1e42ac76de850a49e23a1557 Author: Linus Torvalds Date: Sat Dec 18 10:23:29 2010 -0800 Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/upstream-linus * 'upstream' of git://git.linux-mips.org/pub/scm/upstream-linus: MIPS: Fix build errors in sc-mips.c commit 46bdfe6a50b88942f5323f837a3afd93a1c86e60 Merge: c15524a40a1603dc56a8691c4f50172fb86c23d8 a2c606d53ab71dee6410f10ef0adf67321d60e06 Author: Linus Torvalds Date: Sat Dec 18 10:13:24 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6: x86: avoid high BIOS area when allocating address space x86: avoid E820 regions when allocating address space x86: avoid low BIOS area when allocating address space resources: add arch hook for preventing allocation in reserved areas Revert "resources: support allocating space within a region from the top down" Revert "PCI: allocate bus resources from the top down" Revert "x86/PCI: allocate space from the end of a region, not the beginning" Revert "x86: allocate space within a region top-down" Revert "PCI: fix pci_bus_alloc_resource() hang, prefer positive decode" PCI: Update MCP55 quirk to not affect non HyperTransport variants commit b89cd71a159b5edca4c429687e4af01708eb1b26 Author: Santosh Shilimkar Date: Fri Nov 19 23:01:06 2010 +0530 omap4: l2x0: Enable early BRESP bit The AXI protocol specifies that the write response can only be sent back to an AXI master when the last write data has been accepted. This optimization enables the PL310 to send the write response of certain write transactions as soon as the store buffer accepts the write address. This behavior is not compatible with the AXI protocol and is disabled by default. You enable this optimization by setting the Early BRESP Enable bit in the Auxiliary Control Register (bit [30]). Signed-off-by: Santosh Shilimkar Signed-off-by: Mans Rullgard Tested-by: Nishanth Menon Signed-off-by: Tony Lindgren commit b0f20ff9d7e347c284ea7718597c978a2969ad7b Author: Santosh Shilimkar Date: Fri Nov 19 23:01:05 2010 +0530 omap4: l2x0: Set share override bit Clearing bit 22 in the PL310 Auxiliary Control register (shared attribute override enable) has the side effect of transforming Normal Shared Non-cacheable reads into Cacheable no-allocate reads. Coherent DMA buffers in Linux always have a Cacheable alias via the kernel linear mapping and the processor can speculatively load cache lines into the PL310 controller. With bit 22 cleared, Non-cacheable reads would unexpectedly hit such cache lines leading to buffer corruption Signed-off-by: Santosh Shilimkar Tested-by: Nishanth Menon Signed-off-by: Tony Lindgren commit 11e0264046e00544eb044fafc27125babd105e41 Author: Mans Rullgard Date: Fri Nov 19 23:01:04 2010 +0530 omap4: l2x0: enable instruction and data prefetching Enabling L2 prefetching improves performance as shown on Panda ES2.1 board with mem test, and it has measurable impact on performances. I think we should consider it, even though it damages "writes" a bit. (rebased to k.org) Usually the prefetch is used at both levels together L1 + L2, however, to enable the CP15 prefetch engines, these are under security, and on GP devices, we cannot enable it(e.g. on PandaBoard). However, just enabling PL310 prefetch seems to provide performance improvement, as shown in the data below (from Ubuntu) and would be a great thing to pull in. What prefetch does is enable automatic next line prefetching. With this enabled, whenever the PL310 receives a cachable read request, it automatically prefetches the following cache line as well. Measurement Data: == STOCK 10.10 WITHOUT PATCH ======================== ~# ./memspeed size 8388608 8192k 8M offset 8388608, 0 buffers 0x2aaad000 0x2b2ad000 copy libc 133 MB/s copy Android v5 273 MB/s copy Android NEON 235 MB/s copy INT32 116 MB/s copy ASM ARM 187 MB/s copy ASM VLDM 64 204 MB/s copy ASM VLDM 128 173 MB/s copy ASM VLD1 216 MB/s read ASM ARM 286 MB/s read ASM VLDM 242 MB/s read ASM VLD1 286 MB/s write libc 1947 MB/s write ASM ARM 1943 MB/s write ASM VSTM 1942 MB/s write ASM VST1 1935 MB/s 10.10 + PATCH ============= ~# ./memspeed size 8388608 8192k 8M offset 8388608, 0 buffers 0x2ab17000 0x2b317000 copy libc 129 MB/s copy Android v5 256 MB/s copy Android NEON 356 MB/s copy INT32 127 MB/s copy ASM ARM 321 MB/s copy ASM VLDM 64 337 MB/s copy ASM VLDM 128 321 MB/s copy ASM VLD1 350 MB/s read ASM ARM 496 MB/s read ASM VLDM 470 MB/s read ASM VLD1 488 MB/s write libc 1701 MB/s write ASM ARM 1682 MB/s write ASM VSTM 1693 MB/s write ASM VST1 1681 MB/s Signed-off-by: Mans Rullgard Signed-off-by: Santosh Shilimkar Tested-by: Nishanth Menon Signed-off-by: Tony Lindgren commit 1773e60a816b28f4084810f96e9195aaaa7fb8c3 Author: Santosh Shilimkar Date: Fri Nov 19 23:01:03 2010 +0530 omap4: l2x0: Construct the AUXCTRL value using defines This patch removes the hardcoded value of auxctrl value and construct it using bitfields Bit 25 is reserved and is always set to 1. Same value of this bit is retained in this patch Signed-off-by: Santosh Shilimkar Tested-by: Nishanth Menon Signed-off-by: Tony Lindgren commit 0aaa6f8f1da195ae1a993d3e9c80d600480cf947 Author: Santosh Shilimkar Date: Fri Nov 19 23:01:02 2010 +0530 ARM: l2x0: Add aux control register bitfields This patch adds the PL310 Auxiliary Control Register bitfields so that SOC's can use these bit fields to construct the AUXCTRL value to be passed/programmed instead of hardcoding it. Signed-off-by: Santosh Shilimkar Acked-by: Catalin Marinas Signed-off-by: Tony Lindgren commit 7c83912062c801738d7d19acaf8f7fec25ea663c Author: Christoph Lameter Date: Tue Dec 14 10:28:46 2010 -0600 vmstat: User per cpu atomics to avoid interrupt disable / enable Currently the operations to increment vm counters must disable interrupts in order to not mess up their housekeeping of counters. So use this_cpu_cmpxchg() to avoid the overhead. Since we can no longer count on preremption being disabled we still have some minor issues. The fetching of the counter thresholds is racy. A threshold from another cpu may be applied if we happen to be rescheduled on another cpu. However, the following vmstat operation will then bring the counter again under the threshold limit. The operations for __xxx_zone_state are not changed since the caller has taken care of the synchronization needs (and therefore the cycle count is even less than the optimized version for the irq disable case provided here). The optimization using this_cpu_cmpxchg will only be used if the arch supports efficient this_cpu_ops (must have CONFIG_CMPXCHG_LOCAL set!) The use of this_cpu_cmpxchg reduces the cycle count for the counter operations by %80 (inc_zone_page_state goes from 170 cycles to 32). Signed-off-by: Christoph Lameter commit 20b876918c065818b3574a426d418f68b4f8ad19 Author: Christoph Lameter Date: Tue Dec 14 10:28:45 2010 -0600 irq_work: Use per cpu atomics instead of regular atomics The irq work queue is a per cpu object and it is sufficient for synchronization if per cpu atomics are used. Doing so simplifies the code and reduces the overhead of the code. Before: christoph@linux-2.6$ size kernel/irq_work.o text data bss dec hex filename 451 8 1 460 1cc kernel/irq_work.o After: christoph@linux-2.6$ size kernel/irq_work.o text data bss dec hex filename 438 8 1 447 1bf kernel/irq_work.o Cc: Peter Zijlstra Signed-off-by: Christoph Lameter commit 05c2d088d0eb904e50460b04d77324c26cef4637 Merge: 3ea9f6833c8f865a221b59ce37d7650dcf3b3e17 8270137a0d50507a5b40f880db636527045b8466 Author: Tejun Heo Date: Sat Dec 18 15:54:36 2010 +0100 Merge branch 'this_cpu_ops' into for-2.6.38 commit 8270137a0d50507a5b40f880db636527045b8466 Author: Christoph Lameter Date: Tue Dec 14 10:28:47 2010 -0600 cpuops: Use cmpxchg for xchg to avoid lock semantics Use cmpxchg instead of xchg to realize this_cpu_xchg. xchg will cause LOCK overhead since LOCK is always implied but cmpxchg will not. Baselines: xchg() = 18 cycles (no segment prefix, LOCK semantics) __this_cpu_xchg = 1 cycle (simulated using this_cpu_read/write, two prefixes. Looks like the cpu can use loop optimization to get rid of most of the overhead) Cycles before: this_cpu_xchg = 37 cycles (segment prefix and LOCK (implied by xchg)) After: this_cpu_xchg = 11 cycle (using cmpxchg without lock semantics) Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit 7296e08abac0a22a2534a4f6e493c764f2c77583 Author: Christoph Lameter Date: Tue Dec 14 10:28:44 2010 -0600 x86: this_cpu_cmpxchg and this_cpu_xchg operations Provide support as far as the hardware capabilities of the x86 cpus allow. Define CONFIG_CMPXCHG_LOCAL in Kconfig.cpu to allow core code to test for fast cpuops implementations. V1->V2: - Take out the definition for this_cpu_cmpxchg_8 and move it into a separate patch. tj: - Reordered ops to better follow this_cpu_* organization. - Renamed macro temp variables similar to their existing neighbours. Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit 2b7124428561c7c3cfa4a58cc4c6feea53f3148e Author: Christoph Lameter Date: Sat Dec 18 15:54:04 2010 +0100 percpu: Generic this_cpu_cmpxchg() and this_cpu_xchg support Generic code to provide new per cpu atomic features this_cpu_cmpxchg this_cpu_xchg Fallback occurs to functions using interrupts disable/enable to ensure correct per cpu atomicity. Fallback to regular cmpxchg and xchg is not possible since per cpu atomic semantics include the guarantee that the current cpus per cpu data is accessed atomically. Use of regular cmpxchg and xchg requires the determination of the address of the per cpu data before regular cmpxchg or xchg which therefore cannot be atomically included in an xchg or cmpxchg without segment override. tj: - Relocated new ops to conform better to the general organization. - This patch contains a trivial comment fix. Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit 9326845f45650f6af9953a4b6a31e89b54fab82f Merge: 2f841ed13b9f10037e25ddf417d01700ecd886d0 5af244fdf2a2405b2181da2a32636f3ca5ef162e Author: Russell King Date: Sat Dec 18 14:28:31 2010 +0000 Merge git://git.kernel.org/pub/scm/linux/kernel/git/nico/orion into devel-stable commit 2f841ed13b9f10037e25ddf417d01700ecd886d0 Merge: 961ec6daa7b14f376c30d447a830fa4783a2112c 8fbf397c3389c1dedfa9ee412715046ab28fd82d Author: Russell King Date: Sat Dec 18 14:27:55 2010 +0000 Merge branch 'hw-breakpoint' of git://repo.or.cz/linux-2.6/linux-wd into devel-stable commit 1ae1b5f053cf36bd0f913e83f3b136fec8152d4d Author: Russell King Date: Sat Dec 18 13:57:00 2010 +0000 ARM: smp: avoid incrementing mm_users on CPU startup We should not be incrementing mm_users when we startup a secondary CPU - doing so results in mm_users incrementing by one each time we hotplug a CPU, which will eventually wrap, and will cause problems. Other architectures such as x86 do not increment mm_users, but only mm_count, so we follow that pattern. Signed-off-by: Russell King commit a79a9ad94acdbd0106491f5a444167636562460f Author: Haojian Zhuang Date: Wed Nov 24 11:54:22 2010 +0800 ARM: pxa: sanitize IRQ registers access based on offset Signed-off-by: Eric Miao Signed-off-by: Haojian Zhuang commit 3f408fa071418183742110f7314d6b596916e31e Author: Haojian Zhuang Date: Wed Nov 24 11:54:21 2010 +0800 ARM: mmp: select CPU_PJ4 Since CPU_PJ4 is shared between PXA95x and MMP2, select CPU_PJ4 in MMP2 configuration. Signed-off-by: Haojian Zhuang Signed-off-by: Eric Miao commit c9b5ef47dc9d154a79f320eeaddc4bc9684ae1ea Author: Haojian Zhuang Date: Wed Nov 24 11:54:20 2010 +0800 ARM: pxa: support saarb platform Saarb platform is a handheld platform that supports Marvell PXA955 silicon. Signed-off-by: Haojian Zhuang Signed-off-by: Eric Miao commit a4553358d94b4a1f3e6f24aacfd076022ac14855 Author: Haojian Zhuang Date: Wed Nov 24 11:54:19 2010 +0800 ARM: pxa: support pxa95x The core of PXA955 is PJ4. Add new PJ4 support. And add new macro CONFIG_PXA95x. Signed-off-by: Haojian Zhuang Signed-off-by: Eric Miao commit aae8224ddd72e045bb92eaf6b73b89282c771c69 Author: Eric Miao Date: Tue Nov 23 17:07:48 2010 +0800 ARM: pxa: introduce pxa3xx_clock_sysclass for clock suspend/resume Signed-off-by: Haojian Zhuang Signed-off-by: Eric Miao commit 4dd295a73e80b55c3fec25555bf0a5d253023740 Author: Andy Ross Date: Thu Dec 16 15:53:19 2010 -0800 hid: egalax: Add support for Wetab (726b) This patch adds support for another Wetab device (726b), and grabs it accordingly in hid-core. [rydberg@euromail.se: rename and log message changes] Signed-off-by: Andy Ross Signed-off-by: Jiri Kosina Signed-off-by: Henrik Rydberg commit c7d3e9e801d72e86eb8a0f311453192a84f14412 Merge: 28257f7fdee0facc3b7f934e82c2485f27120d41 1cd25df4e53b9507f7abbb8aff8ce2ba644a1468 Author: Tony Lindgren Date: Fri Dec 17 19:19:50 2010 -0800 Merge branch 'for_2.6.38' of git://gitorious.org/iommu_mailbox/iommu_mailbox into devel-iommu-mailbox commit 6bc56aaecce78113500b150f1f1506029145a370 Author: Anand Gadiyar Date: Fri Dec 3 17:26:56 2010 +0000 omap: remove dead wdt code in plat-omap/devices.c Commit f2ce62312650 (OMAP: WDT: Split OMAP1 and OMAP2PLUS device registration) removed omap_init_wdt and related structures from plat-omap/devices.c. However a subsequent commit or merge seems to have reintroduced these by accident. The caller of omap_init_wdt was also removed by that commit, and this did not get restored. So we have the following build warning now: CC arch/arm/plat-omap/devices.o arch/arm/plat-omap/devices.c:252: warning: 'omap_init_wdt' defined but not used Fix this by removing this dead code. Signed-off-by: Anand Gadiyar Cc: Tony Lindgren Signed-off-by: Tony Lindgren commit fe297dde5ae8f8bf67d3a87759289a99b48ecb2c Author: John Rigby Date: Wed Dec 1 05:57:51 2010 +0000 OMAP4: enable smc instruction in new assembler versions New assemblers need -march=armv7-a+sec on command line or .arch_extension sec inline to enable use of the smc instruction. This patch uses as-instr to check the latter to conditionally enable the former in AFLAGS for files that use smc. Checked on both old and new binutils to verify that it does not break old versions. Signed-off-by: John Rigby Signed-off-by: Tony Lindgren commit 1a6b59232bbaf612265e364c9e06ba1d15bbe7e0 Author: Bryan Wu Date: Wed Dec 8 02:41:25 2010 +0000 omap: kill all section mismatch warning for omap2plus_defconfig This patch will kill following section mismatch warnings: WARNING: vmlinux.o(.text+0x24a00): Section mismatch in reference from the function zoom_twl_gpio_setup() to the (unknown reference) .init.data:(unknown) The function zoom_twl_gpio_setup() references the (unknown reference) __initdata (unknown). This is often because zoom_twl_gpio_setup lacks a __initdata annotation or the annotation of (unknown) is wrong. WARNING: vmlinux.o(.text+0x24bfc): Section mismatch in reference from the function cm_t35_twl_gpio_setup() to the (unknown reference) .init.data:(unknown) The function cm_t35_twl_gpio_setup() references the (unknown reference) __initdata (unknown). This is often because cm_t35_twl_gpio_setup lacks a __initdata annotation or the annotation of (unknown) is wrong. WARNING: vmlinux.o(.data+0x1d3e0): Section mismatch in reference from the variable h4_config to the (unknown reference) .init.data:(unknown) The variable h4_config references the (unknown reference) __initdata (unknown) If the reference is valid then annotate the variable with __init* or __refdata (see linux/init.h) or name the variable: *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console, WARNING: vmlinux.o(.data+0x1dc08): Section mismatch in reference from the variable sdp2430_config to the (unknown reference) .init.data:(unknown) The variable sdp2430_config references the (unknown reference) __initdata (unknown) If the reference is valid then annotate the variable with __init* or __refdata (see linux/init.h) or name the variable: *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console, WARNING: vmlinux.o(.data+0x1e1d8): Section mismatch in reference from the variable apollon_config to the (unknown reference) .init.data:(unknown) The variable apollon_config references the (unknown reference) __initdata (unknown) If the reference is valid then annotate the variable with __init* or __refdata (see linux/init.h) or name the variable: *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console, Signed-off-by: Bryan Wu Cc: Paul Walmsley Signed-off-by: Tony Lindgren commit 7c50152f0851e44ef7491546a29fddbbea47735b Author: Ohad Ben-Cohen Date: Wed Nov 24 10:04:50 2010 +0000 omap: boards w/ wl12xx should select REGULATOR_FIXED_VOLTAGE Power to the wl12xx wlan device is controlled by a fixed regulator. Boards that have the wl12xx should select REGULATOR_FIXED_VOLTAGE so users will not be baffled. Signed-off-by: Ohad Ben-Cohen Signed-off-by: Tony Lindgren commit 447b8da5d78ac8f2815a7824c0eb4ad66ba3e11e Author: Jean Pihet Date: Wed Nov 17 17:52:11 2010 +0000 OMAP3: add comments for erratas i540 and i478 workarounds Add comments and IDs for the following erratas: - i540: MPU cannot exit from Standby, - i478: Unexpected Cold-Reset is generated when device is coming back from OFF mode Signed-off-by: Jean Pihet Signed-off-by: Tony Lindgren commit fea83f6a9b0a90fefca16ac3534e308f6c34144b Merge: df127ee375af4cb40b979605e0c336fc79bd38e7 2d200665c37f544f648d77a05a06ab63328f0d3a Author: Tony Lindgren Date: Fri Dec 17 15:14:02 2010 -0800 Merge branch 'devel-board' into omap-for-linus commit 2d200665c37f544f648d77a05a06ab63328f0d3a Author: Aaro Koskinen Date: Fri Dec 17 15:13:47 2010 -0800 arm: omap: add minimal support for RM-680 Add minimal support for Nokia RM-680 board. Tested with omap2plus_defconfig. Signed-off-by: Aaro Koskinen [tony@atomide.com: updated to remove omap_gpio_init Signed-off-by: Tony Lindgren commit 20dbeb1081327aefaac7044d9908c97bf445858c Author: Aaro Koskinen Date: Fri Dec 17 15:13:46 2010 -0800 arm: omap: sdram-nokia: add 97.6/195.2 MHz timing data Introduce 97.6/195.2 MHz memory timing data. Based on patches by Eduardo Valentin, Igor Dmitriev and Juha Keski-Saari. Signed-off-by: Aaro Koskinen Cc: Eduardo Valentin Cc: Igor Dmitriev Signed-off-by: Tony Lindgren commit 15d24e118d51601a5cc2f021005aa7354b03b1c8 Author: Aaro Koskinen Date: Fri Dec 17 15:13:46 2010 -0800 arm: omap: sdram-nokia: delete redundant timing data 41.5 MHz SDRAM clock is not usable. Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit 2b1af87ace4776f0d0c3513923a79529fc1b5a00 Author: Aaro Koskinen Date: Fri Dec 17 15:13:46 2010 -0800 arm: omap: sdram-nokia: improve error handling Actually check for errors: print an error log and return NULL. Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit e5f5b5422d064b7a393e39332da31af68e975f91 Author: Aaro Koskinen Date: Fri Dec 17 15:13:45 2010 -0800 arm: omap: sdram-nokia: use array to list timings Use an array to make it easier to add new values. Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit fbd208e9772005c193459d1a0575c0787ad52f69 Author: Aaro Koskinen Date: Fri Dec 17 15:13:45 2010 -0800 arm: omap: sdram-nokia: prepare for new memory timings Rename the current timings to indicate they're for 166 MHz. Based on patches by Eduardo Valentin and Juha Keski-Saari. Signed-off-by: Aaro Koskinen Cc: Eduardo Valentin Signed-off-by: Tony Lindgren commit fcd8d84633902fd1717d80f36a38b8a4305ca3d4 Author: Aaro Koskinen Date: Fri Dec 17 15:13:44 2010 -0800 arm: omap: add sdram-nokia.h Add a header file for Nokia SDRAM functions. Based on patches by Juha Keski-Saari. Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit 6c3bc4eb5608665b7330b3d2044fca976cbd1a50 Author: Aaro Koskinen Date: Fri Dec 17 15:13:44 2010 -0800 arm: omap: rename board-rx51-sdram.c to sdram-nokia.c Rename the file and functions so that it can be reused by future Nokia boards. Based on patches by Juha Keski-Saari. Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit 7f8595bfacef279f06c82ec98d420ef54f2537e0 Author: H. Peter Anvin Date: Thu Dec 16 19:20:41 2010 -0800 x86, kexec: Limit the crashkernel address appropriately Keep the crash kernel address below 512 MiB for 32 bits and 896 MiB for 64 bits. For 32 bits, this retains compatibility with earlier kernel releases, and makes it work even if the vmalloc= setting is adjusted. For 64 bits, we should be able to increase this substantially once a hard-coded limit in kexec-tools is fixed. Signed-off-by: H. Peter Anvin Cc: Vivek Goyal Cc: Stanislaw Gruszka Cc: Yinghai Lu LKML-Reference: <20101217195035.GE14502@redhat.com> commit 81711cee933599fa114abb0d258d8bbabef8adfb Author: Chris Metcalf Date: Tue Dec 14 16:07:25 2010 -0500 arch/tile: handle rt_sigreturn() more cleanly The current tile rt_sigreturn() syscall pattern uses the common idiom of loading up pt_regs with all the saved registers from the time of the signal, then anticipating the fact that we will clobber the ABI "return value" register (r0) as we return from the syscall by setting the rt_sigreturn return value to whatever random value was in the pt_regs for r0. However, this breaks in our 64-bit kernel when running "compat" tasks, since we always sign-extend the "return value" register to properly handle returned pointers that are in the upper 2GB of the 32-bit compat address space. Doing this to the sigreturn path then causes occasional random corruption of the 64-bit r0 register. Instead, we stop doing the crazy "load the return-value register" hack in sigreturn. We already have some sigreturn-specific assembly code that we use to pass the pt_regs pointer to C code. We extend that code to also set the link register to point to a spot a few instructions after the usual syscall return address so we don't clobber the saved r0. Now it no longer matters what the rt_sigreturn syscall returns, and the pt_regs structure can be cleanly and completely reloaded. Signed-off-by: Chris Metcalf commit bc4cf2bb271b2d557fc510426755da786fc985be Author: Chris Metcalf Date: Tue Dec 14 15:57:49 2010 -0500 arch/tile: handle CLONE_SETTLS in copy_thread(), not user space Previously we were just setting up the "tp" register in the new task as started by clone() in libc. However, this is not quite right, since in principle a signal might be delivered to the new task before it had its TLS set up. (Of course, this race window still exists for resetting the libc getpid() cached value in the new task, in principle. But in any case, we are now doing this exactly the way all other architectures do it.) This change is important for 2.6.37 since the tile glibc we will be submitting upstream will not set TLS in user space any more, so it will only work on a kernel that has this fix. It should also be taken for 2.6.36.x in the stable tree if possible. Signed-off-by: Chris Metcalf Cc: stable commit b581a7f9c3abc6c7afacd021747543d32ff17adb Author: Rafael J. Wysocki Date: Fri Dec 17 22:34:01 2010 +0100 ACPI: Execute _PRW for devices reported as inactive or not present If a device is reported as inactive or not present by its _STA control method, acpi_bus_check_add() skips it without evaluating its _PRW method. This leads to a problem when the device's _PRW method points to a GPE, because in that case the GPE may be enabled by ACPICA during the subsequent acpi_update_gpes() call which, in turn, may cause a GPE storm to appear. To avoid this issue, make acpi_bus_check_add() evaluate _PRW for inactive or not present devices and register the wakeup GPE information returned by them, so that acpi_update_gpes() does not enable their GPEs unnecessarily. Signed-off-by: Rafael J. Wysocki Reported-by: Matthew Garrett Signed-off-by: Len Brown commit 0e4d413af1a9ddd12f82617734eb535007e186a8 Author: Jean-Francois Moine Date: Tue Dec 14 16:17:40 2010 -0300 [media] gspca - sonixj: Better handling of the bridge registers 0x01 and 0x17 The initial values of the registers 0x01 and 0x17 are taken from the sensor table at capture start and updated according to the flag PDN_INV. Their values are updated at each step of the capture initialization and memorized for reuse in capture stop. This patch also fixed automatically some bad hardcoded values of these registers. Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 4fd350ee2bf129acb933ad5104bc4754b2c7c9ef Author: Jean-Francois Moine Date: Tue Dec 14 16:16:58 2010 -0300 [media] gspca - sonixj: Add the bit definitions of the bridge reg 0x01 and 0x17 Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit b2272a49e7df37732d73988f00468ce31e1ebc92 Author: Jean-Francois Moine Date: Tue Dec 14 16:16:16 2010 -0300 [media] gspca - sonixj: Set the flag for some devices The flag PDN_INV indicates that the sensor pin S_PWR_DN has not the same value as other webcams with the same sensor. For now, only two webcams have been so detected: the Microsoft's VX1000 and VX3000. Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit c6c14330717f9850b4b4c054b81424b9979cd07d Author: Jean-Francois Moine Date: Tue Dec 14 16:15:37 2010 -0300 [media] gspca - sonixj: Add a flag in the driver_info table Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 4f67f3adefadbb056c1ce2c228916701b566e6fc Author: Jean-Francois Moine Date: Tue Dec 14 16:15:00 2010 -0300 [media] gspca - sonixj: Fix a bad probe exchange Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 5e68f400aad4e2c29e2531cc4413c459fa88cb62 Author: Jean-Francois Moine Date: Tue Dec 14 16:14:10 2010 -0300 [media] gspca - sonixj: Move bridge init to sd start Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab commit 692e42df12e8427219958468301f3d03ca5f0f0d Author: Brandon Philips Date: Fri Dec 17 12:58:22 2010 -0300 [media] bttv: remove unneeded locking comments After Mauro's "bttv: Fix locking issues due to BKL removal code" there are a number of comments that are no longer needed about lock ordering. Remove them. Signed-off-by: Brandon Philips Signed-off-by: Mauro Carvalho Chehab commit 587f0d5d6d44e3529028bf197d424f866fb2411d Author: Mauro Carvalho Chehab Date: Wed Dec 15 18:45:42 2010 -0300 [media] bttv: fix mutex use before init (BZ#24602) Fix a regression where bttv driver causes oopses when loading, since it were using some non-initialized mutexes. While it would be possible to fix the issue, there are some other lock troubles, like to the presence of lock code at free_btres_lock(). It is possible to fix, but the better is to just use the core-assisted locking schema. This way, V4L2 core will serialize access to all ioctl's/open/close/mmap/read/poll operations, avoiding to have two processes accessing the hardware at the same time. Also, as there's just one lock, instead of 3, there's no risk of dead locks. The net result is a cleaner code, with just one lock. Reported-by: Dan Carpenter Reported-by: Brandon Philips Reported-by: Chris Clayton Reported-by: Torsten Kaiser Tested-by: Chris Clayton Tested-by: Torsten Kaiser Signed-off-by: Mauro Carvalho Chehab commit 3c2dcf2aed5ea22ecf65a9a871c4963faec421b3 Author: Paul E. McKenney Date: Wed Dec 15 21:12:15 2010 -0800 rcu: remove unused __list_for_each_rcu() macro Signed-off-by: Paul E. McKenney commit 8a9c1cee26c0ece23b38c45b92b724438878f842 Author: Mariusz Kozlowski Date: Wed Dec 15 23:11:12 2010 +0100 rculist: fix borked __list_for_each_rcu() macro This restores parentheses blance. Signed-off-by: Mariusz Kozlowski Signed-off-by: Paul E. McKenney commit b52573d2796274f7f31cfeff7185c320adcd4f12 Author: Paul E. McKenney Date: Tue Dec 14 17:36:02 2010 -0800 rcu: reduce __call_rcu()-induced contention on rcu_node structures When the current __call_rcu() function was written, the expedited APIs did not exist. The __call_rcu() implementation therefore went to great lengths to detect the end of old grace periods and to start new ones, all in the name of reducing grace-period latency. Now the expedited APIs do exist, and the usage of __call_rcu() has increased considerably. This commit therefore causes __call_rcu() to avoid worrying about grace periods unless there are a large number of RCU callbacks stacked up on the current CPU. Signed-off-by: Paul E. McKenney commit 0209f6490b030f35349a2bb71294f3fd75b0f36d Author: Paul E. McKenney Date: Tue Dec 14 16:07:52 2010 -0800 rcu: limit rcu_node leaf-level fanout Some recent benchmarks have indicated possible lock contention on the leaf-level rcu_node locks. This commit therefore limits the number of CPUs per leaf-level rcu_node structure to 16, in other words, there can be at most 16 rcu_data structures fanning into a given rcu_node structure. Prior to this, the limit was 32 on 32-bit systems and 64 on 64-bit systems. Note that the fanout of non-leaf rcu_node structures is unchanged. The organization of accesses to the rcu_node tree is such that references to non-leaf rcu_node structures are much less frequent than to the leaf structures. Signed-off-by: Paul E. McKenney commit 121dfc4b3eba9e2f3c42d35205a3510cc65b9931 Author: Paul E. McKenney Date: Fri Dec 10 15:02:47 2010 -0800 rcu: fine-tune grace-period begin/end checks Use the CPU's bit in rnp->qsmask to determine whether or not the CPU should try to report a quiescent state. Handle overflow in the check for rdp->gpnum having fallen behind. Signed-off-by: Paul E. McKenney commit 5ff8e6f0535fe730e921ca347bc38dcb9e01791a Author: Frederic Weisbecker Date: Fri Dec 10 22:11:11 2010 +0100 rcu: Keep gpnum and completed fields synchronized When a CPU that was in an extended quiescent state wakes up and catches up with grace periods that remote CPUs completed on its behalf, we update the completed field but not the gpnum that keeps a stale value of a backward grace period ID. Later, note_new_gpnum() will interpret the shift between the local CPU and the node grace period ID as some new grace period to handle and will then start to hunt quiescent state. But if every grace periods have already been completed, this interpretation becomes broken. And we'll be stuck in clusters of spurious softirqs because rcu_report_qs_rdp() will make this broken state run into infinite loop. The solution, as suggested by Lai Jiangshan, is to ensure that the gpnum and completed fields are well synchronized when we catch up with completed grace periods on their behalf by other cpus. This way we won't start noting spurious new grace periods. Suggested-by: Lai Jiangshan Signed-off-by: Frederic Weisbecker Cc: Paul E. McKenney Cc: Ingo Molnar Cc: Thomas Gleixner Cc: Peter Zijlstra Cc: Steven Rostedt commit 20377f32dcb77941d450728da18cce5b1a7faec5 Author: Frederic Weisbecker Date: Fri Dec 10 22:11:10 2010 +0100 rcu: Stop chasing QS if another CPU did it for us When a CPU is idle and others CPUs handled its extended quiescent state to complete grace periods on its behalf, it will catch up with completed grace periods numbers when it wakes up. But at this point there might be no more grace period to complete, but still the woken CPU always keeps its stale qs_pending value and will then continue to chase quiescent states even if its not needed anymore. This results in clusters of spurious softirqs until a new real grace period is started. Because if we continue to chase quiescent states but we have completed every grace periods, rcu_report_qs_rdp() is puzzled and makes that state run into infinite loops. As suggested by Lai Jiangshan, just reset qs_pending if someone completed every grace periods on our behalf. Suggested-by: Lai Jiangshan Signed-off-by: Frederic Weisbecker Cc: Paul E. McKenney Cc: Ingo Molnar Cc: Thomas Gleixner Cc: Peter Zijlstra Cc: Steven Rostedt Signed-off-by: Paul E. McKenney commit e27fc9641e8ddc8146f8e01f06e5eba2469698de Author: Tejun Heo Date: Mon Nov 22 21:36:11 2010 -0800 rcu: increase synchronize_sched_expedited() batching The fix in commit #6a0cc49 requires more than three concurrent instances of synchronize_sched_expedited() before batching is possible. This patch uses a ticket-counter-like approach that is also not unrelated to Lai Jiangshan's Ring RCU to allow sharing of expedited grace periods even when there are only two concurrent instances of synchronize_sched_expedited(). This commit builds on Tejun's original posting, which may be found at http://lkml.org/lkml/2010/11/9/204, adding memory barriers, avoiding overflow of signed integers (other than via atomic_t), and fixing the detection of batching. Signed-off-by: Tejun Heo Signed-off-by: Paul E. McKenney commit b4aa9e05a61b845541fa6f5b1d246976922601f0 Merge: 1dc0f3c54ce1df957f99c17b145488fd03eb1a59 4b8fe66300acb2fba8b16d62606e0d30204022fc Author: David S. Miller Date: Fri Dec 17 12:27:22 2010 -0800 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 Conflicts: drivers/net/bnx2x/bnx2x.h drivers/net/wireless/iwlwifi/iwl-1000.c drivers/net/wireless/iwlwifi/iwl-6000.c drivers/net/wireless/iwlwifi/iwl-core.h drivers/vhost/vhost.c commit 4b8fe66300acb2fba8b16d62606e0d30204022fc Author: Dmitry V. Levin Date: Fri Dec 17 12:03:14 2010 -0800 netlink: fix gcc -Wconversion compilation warning $ cat << EOF | gcc -Wconversion -xc -S -o/dev/null - unsigned f(void) {return NLMSG_HDRLEN;} EOF : In function 'f': :3:26: warning: negative integer implicitly converted to unsigned type Signed-off-by: Dmitry V. Levin Signed-off-by: Kirill A. Shutemov Signed-off-by: David S. Miller commit f4680d3db71f13d2764340a9880745bf54f2469d Author: Arnaud Ebalard Date: Wed Dec 15 12:16:30 2010 +0000 asix: add USB ID for Logitec LAN-GTJ U2A Logitec LAN-GTJ U2A (http://www.pro.logitec.co.jp/pro/g/gLAN-GTJU2A/) USB 2.0 10/10/1000 Ethernet adapter is based on ASIX AX88178 chipset. This patch adds missing USB ID for the device. Signed-off-by: Arnaud Ebalard Signed-off-by: David S. Miller commit 081d835fa4ce70ad1e42ac76de850a49e23a1557 Author: Kevin Cernekee Date: Tue Nov 2 22:28:01 2010 -0700 MIPS: Fix build errors in sc-mips.c Seen with malta_defconfig on Linus' tree: CC arch/mips/mm/sc-mips.o arch/mips/mm/sc-mips.c: In function 'mips_sc_is_activated': arch/mips/mm/sc-mips.c:77: error: 'config2' undeclared (first use in this function) arch/mips/mm/sc-mips.c:77: error: (Each undeclared identifier is reported only once arch/mips/mm/sc-mips.c:77: error: for each function it appears in.) arch/mips/mm/sc-mips.c:81: error: 'tmp' undeclared (first use in this function) make[2]: *** [arch/mips/mm/sc-mips.o] Error 1 make[1]: *** [arch/mips/mm] Error 2 make: *** [arch/mips] Error 2 [Ralf: Cosmetic changes to minimize the number of arguments passed to mips_sc_is_activated] Signed-off-by: Kevin Cernekee Patchwork: https://patchwork.linux-mips.org/patch/1752/ Signed-off-by: Ralf Baechle commit 1dc0f3c54ce1df957f99c17b145488fd03eb1a59 Author: Rajesh Borundia Date: Thu Dec 16 22:59:02 2010 +0000 qlcnic: reset pci function unconditionally during probe Some boot code drivers dont have cleanup routine, so pci function remains in unknown state prior to driver load. So during driver load issue FLR unconditionally. Update driver version to 5.0.14. Signed-off-by: Rajesh Borundia Signed-off-by: Amit Kumar Salecha Signed-off-by: David S. Miller commit b5006dcb10a4b19e86f413b46787c55bd0d1277b Author: Rajesh Borundia Date: Thu Dec 16 22:59:01 2010 +0000 qlcnic: fix ocm window register offset calculation OCM window register offset was calculated incorrectly for pci function greater than zero. Signed-off-by: Rajesh Borundia Signed-off-by: Amit Kumar Salecha Signed-off-by: David S. Miller commit c75822a3091a899d982d59cd2b4454fe7c3e0318 Author: Sucheta Chakraborty Date: Thu Dec 16 22:59:00 2010 +0000 qlcnic: fix LED test when interface is down. When interface is down, create temporary context to config LED. Signed-off-by: Sucheta Chakraborty Signed-off-by: Amit Kumar Salecha Signed-off-by: David S. Miller commit 46814e08d80f87449b5adb3d549a3cae6f9f8148 Author: Ben Hutchings Date: Fri Dec 17 10:16:23 2010 -0800 tehuti: Firmware filename is tehuti/bdx.bin My conversion of tehuti to use request_firmware() was confused about the filename of the firmware blob. Change the driver to match the blob. Signed-off-by: Ben Hutchings Signed-off-by: Andy Gospodarek Signed-off-by: David S. Miller commit a2c606d53ab71dee6410f10ef0adf67321d60e06 Author: Bjorn Helgaas Date: Thu Dec 16 10:39:02 2010 -0700 x86: avoid high BIOS area when allocating address space This prevents allocation of the last 2MB before 4GB. The experiment described here shows Windows 7 ignoring the last 1MB: https://bugzilla.kernel.org/show_bug.cgi?id=23542#c27 This patch ignores the top 2MB instead of just 1MB because H. Peter Anvin says "There will be ROM at the top of the 32-bit address space; it's a fact of the architecture, and on at least older systems it was common to have a shadow 1 MiB below." Acked-by: H. Peter Anvin Signed-off-by: Bjorn Helgaas Signed-off-by: Jesse Barnes commit 4dc2287c1805e7fe8a7cb90bbcd44abee8cdb914 Author: Bjorn Helgaas Date: Thu Dec 16 10:38:56 2010 -0700 x86: avoid E820 regions when allocating address space When we allocate address space, e.g., to assign it to a PCI device, don't allocate anything mentioned in the BIOS E820 memory map. On recent machines (2008 and newer), we assign PCI resources from the windows described by the ACPI PCI host bridge _CRS. On many Dell machines, these windows overlap some E820 reserved areas, e.g., BIOS-e820: 00000000bfe4dc00 - 00000000c0000000 (reserved) pci_root PNP0A03:00: host bridge window [mem 0xbff00000-0xdfffffff] If we put devices at 0xbff00000, they don't work, probably because that's really RAM, not I/O memory. This patch prevents that by removing the 0xbfe4dc00-0xbfffffff area from the "available" resource. I'm not very happy with this solution because Windows solves the problem differently (it seems to ignore E820 reserved areas and it allocates top-down instead of bottom-up; details at comment 45 of the bugzilla below). That means we're vulnerable to BIOS defects that Windows would not trip over. For example, if BIOS described a device in ACPI but didn't mention it in E820, Windows would work fine but Linux would fail. Reference: https://bugzilla.kernel.org/show_bug.cgi?id=16228 Acked-by: H. Peter Anvin Signed-off-by: Bjorn Helgaas Signed-off-by: Jesse Barnes commit 30919b0bf356a8ee0ef4f7d38ca8ad99b96820b2 Author: Bjorn Helgaas Date: Thu Dec 16 10:38:51 2010 -0700 x86: avoid low BIOS area when allocating address space This implements arch_remove_reservations() so allocate_resource() can avoid any arch-specific reserved areas. This currently just avoids the BIOS area (the first 1MB), but could be used for E820 reserved areas if that turns out to be necessary. We previously avoided this area in pcibios_align_resource(). This patch moves the test from that PCI-specific path to a generic path, so *all* resource allocations will avoid this area. Acked-by: H. Peter Anvin Signed-off-by: Bjorn Helgaas Signed-off-by: Jesse Barnes commit fcb119183c73bf0781009713f303e28b1fb13d3e Author: Bjorn Helgaas Date: Thu Dec 16 10:38:46 2010 -0700 resources: add arch hook for preventing allocation in reserved areas This adds arch_remove_reservations(), which an arch can implement if it needs to protect part of the address space from allocation. Sometimes that can be done by just putting a region in the resource tree, but there are cases where that doesn't work well. For example, x86 BIOS E820 reservations are not related to devices, so they may overlap part of, all of, or more than a device resource, so they may not end up at the correct spot in the resource tree. Acked-by: H. Peter Anvin Signed-off-by: Bjorn Helgaas Signed-off-by: Jesse Barnes commit c0f5ac5426f7fd82b23dd5c6a1e633b290294a08 Author: Bjorn Helgaas Date: Thu Dec 16 10:38:41 2010 -0700 Revert "resources: support allocating space within a region from the top down" This reverts commit e7f8567db9a7f6b3151b0b275e245c1cef0d9c70. Acked-by: H. Peter Anvin Signed-off-by: Bjorn Helgaas Signed-off-by: Jesse Barnes commit 6db45b76eaa08133187f2cb44d496de7e9503aa8 Author: Bjorn Helgaas Date: Thu Dec 16 10:38:36 2010 -0700 Revert "PCI: allocate bus resources from the top down" This reverts commit b126b4703afa4010b161784a43650337676dd03b. We're going back to the old behavior of allocating from bus resources in _CRS order. Acked-by: H. Peter Anvin Signed-off-by: Bjorn Helgaas Signed-off-by: Jesse Barnes commit d14125ecfee05473de46f06d992db109308c57a3 Author: Bjorn Helgaas Date: Thu Dec 16 10:38:31 2010 -0700 Revert "x86/PCI: allocate space from the end of a region, not the beginning" This reverts commit dc9887dc02e37bcf83f4e792aa14b07782ef54cf. Acked-by: H. Peter Anvin Signed-off-by: Bjorn Helgaas Signed-off-by: Jesse Barnes commit 5e52f1c5e85fdc3831eeae8b546577e94a586f81 Author: Bjorn Helgaas Date: Thu Dec 16 10:38:25 2010 -0700 Revert "x86: allocate space within a region top-down" This reverts commit 1af3c2e45e7a641e774bbb84fa428f2f0bf2d9c9. Acked-by: H. Peter Anvin Signed-off-by: Bjorn Helgaas Signed-off-by: Jesse Barnes commit ac57cd5ee1935d1e60de86d75f13f377775f1c96 Author: Bjorn Helgaas Date: Thu Dec 16 10:38:20 2010 -0700 Revert "PCI: fix pci_bus_alloc_resource() hang, prefer positive decode" This reverts commit 82e3e767c21fef2b1b38868e20eb4e470a1e38e3. We're going back to considering bus resources in the order we found them (in _CRS order, when we're using _CRS), so we don't need to define any ordering. Acked-by: H. Peter Anvin Signed-off-by: Bjorn Helgaas Signed-off-by: Jesse Barnes commit 361cf40519a491f68b28ad90225e4611c4bf8e12 Author: Henry C Chang Date: Fri Dec 17 09:55:59 2010 -0800 ceph: handle partial result from get_user_pages The get_user_pages() helper can return fewer than the requested pages. Error out in that case, and clean up the partial result. Signed-off-by: Henry C Chang Signed-off-by: Sage Weil commit b6aa5901c7a2bd90d0b6b9866300d2648b2568f3 Author: Henry C Chang Date: Wed Dec 15 20:45:41 2010 -0800 ceph: mark user pages dirty on direct-io reads For read operation, we have to set the argument _write_ of get_user_pages to 1 since we will write data to pages. Also, we need to SetPageDirty before releasing these pages. Signed-off-by: Henry C Chang Signed-off-by: Sage Weil commit 92cf765237e2787eb168096305c448caf25ac7f8 Author: Sage Weil Date: Fri Dec 17 09:53:41 2010 -0800 ceph: fix null pointer dereference in ceph_init_dentry for nfs reexport The fh_to_dentry etc. methods use ceph_init_dentry(), which assumes that d_parent is defined. It isn't for those callers, so check! Signed-off-by: Sage Weil commit c15524a40a1603dc56a8691c4f50172fb86c23d8 Merge: a6ac1f0af4b39f41fa69477cc44621c612403374 c20b4dd31820a551d0fb60bf27b99345905c2eb6 Author: Linus Torvalds Date: Fri Dec 17 09:45:25 2010 -0800 Merge branch 'for_linus' of git://github.com/at91linux/linux-2.6-at91 * 'for_linus' of git://github.com/at91linux/linux-2.6-at91: at91: Refactor Stamp9G20 and PControl G20 board file at91: Fix uhpck clock rate in upll case commit a6ac1f0af4b39f41fa69477cc44621c612403374 Merge: 508817e7cd8cb585148d12b5673202142ece2330 3e26f23091da06d02fa62da14c95f3688d27857c Author: Linus Torvalds Date: Fri Dec 17 09:32:39 2010 -0800 Merge branch 'kvm-updates/2.6.37' of git://git.kernel.org/pub/scm/virt/kvm/kvm * 'kvm-updates/2.6.37' of git://git.kernel.org/pub/scm/virt/kvm/kvm: KVM: Fix preemption counter leak in kvm_timer_init() KVM: enlarge number of possible CPUID leaves KVM: SVM: Do not report xsave in supported cpuid KVM: Fix OSXSAVE after migration commit 508817e7cd8cb585148d12b5673202142ece2330 Merge: 8efc1a1a22e6daf9d669e6095460c77df683c325 f08f5a0add20834d3f3d876dfe08005a5df656db Author: Linus Torvalds Date: Fri Dec 17 09:31:59 2010 -0800 Merge branch 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6 * 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6: PM / Runtime: Fix pm_runtime_suspended() PM / Hibernate: Restore old swap signature to avoid user space breakage PM / Hibernate: Fix PM_POST_* notification with user-space suspend commit 8efc1a1a22e6daf9d669e6095460c77df683c325 Merge: 74280817e5013af83089a5dd511f6fb3b2362e09 673eb9ff33e26ee6f4278cdab06749aef1bbef5b Author: Linus Torvalds Date: Fri Dec 17 09:28:17 2010 -0800 Merge branch 'bkl_removal' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6 * 'bkl_removal' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: [media] uvcvideo: Convert to unlocked_ioctl [media] uvcvideo: Lock stream mutex when accessing format-related information [media] uvcvideo: Move mmap() handler to uvc_queue.c [media] uvcvideo: Move mutex lock/unlock inside uvc_free_buffers [media] uvcvideo: Lock controls mutex when querying menus [media] v4l2-dev: fix race condition [media] V4L: improve the BKL replacement heuristic [media] v4l2-dev: use mutex_lock_interruptible instead of plain mutex_lock [media] cx18: convert to unlocked_ioctl [media] radio-timb: convert to unlocked_ioctl [media] sh_vou: convert to unlocked_ioctl [media] cafe_ccic: replace ioctl by unlocked_ioctl [media] et61x251_core: trivial conversion to unlocked_ioctl [media] sn9c102: convert to unlocked_ioctl [media] BKL: trivial ioctl -> unlocked_ioctl video driver conversions [media] typhoon: convert to unlocked_ioctl [media] si4713: convert to unlocked_ioctl [media] tea5764: convert to unlocked_ioctl [media] cadet: use unlocked_ioctl [media] BKL: trivial BKL removal from V4L2 radio drivers commit 74280817e5013af83089a5dd511f6fb3b2362e09 Merge: a3383e8372c0c11238f9bb9777929bfc3a2d320a 5aad6c5f7733b94e666e3bf8b57beb7bbee15886 Author: Linus Torvalds Date: Fri Dec 17 09:27:30 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: ALSA: hda - Fix conflict of Mic Boot controls ALSA: HDA: Enable subwoofer on Asus G73Jw ALSA: HDA: Fix auto-mute on Lenovo Edge 14 ASoC: Fix bias power down of non-DAPM codec ASoC: WM8580: Fix R8 initial value ASoC: fix deemphasis control in wm8904/55/60 codecs commit 403047754cf690b012369b8fb563b738b88086e6 Author: Tejun Heo Date: Fri Dec 17 15:47:04 2010 +0100 percpu,x86: relocate this_cpu_add_return() and friends - include/linux/percpu.h: this_cpu_add_return() and friends were located next to __this_cpu_add_return(). However, the overall organization is to first group by preemption safeness. Relocate this_cpu_add_return() and friends to preemption-safe area. - arch/x86/include/asm/percpu.h: Relocate percpu_add_return_op() after other more basic operations. Relocate [__]this_cpu_add_return_8() so that they're first grouped by preemption safeness. Signed-off-by: Tejun Heo Cc: Christoph Lameter commit 5aad6c5f7733b94e666e3bf8b57beb7bbee15886 Merge: 8cd1fd2526a78eaa1785a8ae3fe9f45a8ddd0e17 862af8adbe6b9ccb7c00c13717b1f92465f79aa2 Author: Takashi Iwai Date: Fri Dec 17 15:28:37 2010 +0100 Merge branch 'fix/asoc' into for-linus commit 8cd1fd2526a78eaa1785a8ae3fe9f45a8ddd0e17 Merge: d70ab7f7ee0692efc880d772dc5c212174d67e3b 53e8c3239bcc7b89c76179fd33fb6faa3413c00d Author: Takashi Iwai Date: Fri Dec 17 15:28:33 2010 +0100 Merge branch 'fix/hda' into for-linus commit 53e8c3239bcc7b89c76179fd33fb6faa3413c00d Author: Takashi Iwai Date: Fri Dec 17 15:23:41 2010 +0100 ALSA: hda - Fix conflict of Mic Boot controls Due to the recent change for multiple mics assignment, we need to handle the index of each Mic Boost control respectively. Otherwise the driver gets the control element conflicts, and gives the unsable state. Reference: kernel bug 25002 https://bugzilla.kernel.org/show_bug.cgi?id=25002 Reported-and-tested-by: Adam Williamson Signed-off-by: Takashi Iwai commit 3ea9f6833c8f865a221b59ce37d7650dcf3b3e17 Author: Christoph Lameter Date: Wed Dec 8 17:42:23 2010 +0100 connector: Use this_cpu operations The patch was originally in the use cpuops patchset but it needs an inc_return and is therefore dependent on an extension of the cpu ops. Fixed up and verified that it compiles. get_seq can benefit from this_cpu_operations. Address calculation is avoided and the increment is done using an xadd. Cc: Scott James Remnant Cc: Mike Frysinger Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit b2e4ae69757cdfef4c612a04f097c1e20489a565 Author: Christoph Lameter Date: Mon Dec 6 11:40:07 2010 -0600 xen: Use this_cpu_inc_return __this_cpu_inc_return reduces code and simplifies code. Cc: Jeremy Fitzhardinge Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter commit cd85fc58cd71bf6b89612efafb9a84e655ed7d66 Author: Christoph Lameter Date: Wed Dec 8 17:42:22 2010 +0100 taskstats: Use this_cpu_ops Use this_cpu_inc_return in one place and avoid ugly __raw_get_cpu in another. V3->V4: - Fix off by one. V4-V4f: - Use &listener_array Cc: Michael Holzheu Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit b29c617af3b09d150d3889836c24d39564b39180 Author: Christoph Lameter Date: Mon Dec 6 11:40:06 2010 -0600 random: Use this_cpu_inc_return __this_cpu_inc can create a single instruction to do the same as __get_cpu_var()++. Cc: Richard Kennedy Cc: Matt Mackall Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit ee1be8626355e6a1f3f8c44e2351ff2661c5998d Author: Christoph Lameter Date: Mon Dec 6 11:40:05 2010 -0600 fs: Use this_cpu_inc_return in buffer.c __this_cpu_inc can create a single instruction with the same effect as the _get_cpu_var(..)++ construct in buffer.c. Cc: Wu Fengguang Cc: Christoph Hellwig Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit cfb824349556904b319464139be5c75fce983b0d Author: Christoph Lameter Date: Mon Dec 6 11:40:03 2010 -0600 highmem: Use this_cpu_xx_return() operations Use this_cpu operations to optimize access primitives for highmem. The main effect is the avoidance of address calculations through the use of a segment prefix. V3->V4 - kmap_atomic_idx: Do not return a value. - Use __this_cpu_dec without HIGHMEM_DEBUG Cc: Peter Zijlstra Cc: Catalin Marinas Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit 908ee0f122bf2a67414854af5b90c6621d186a71 Author: Christoph Lameter Date: Mon Dec 6 11:40:02 2010 -0600 vmstat: Use this_cpu_inc_return for vm statistics this_cpu_inc_return() saves us a memory access there. Code size does not change. V1->V2: - Fixed the location of the __per_cpu pointer attributes - Sparse checked V2->V3: - Move fixes to __percpu attribute usage to earlier patch Reviewed-by: Pekka Enberg Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit 275c8b93288ef0c2281e414e069ea8ed4bad03f7 Merge: 909ea96468096b07fbb41aaf69be060d92bd9271 8f1d97c79eb65de1d05799d6b81d79cd94169114 Author: Tejun Heo Date: Fri Dec 17 15:16:46 2010 +0100 Merge branch 'this_cpu_ops' into for-2.6.38 commit 8f1d97c79eb65de1d05799d6b81d79cd94169114 Author: Christoph Lameter Date: Mon Dec 6 11:40:00 2010 -0600 x86: Support for this_cpu_add, sub, dec, inc_return Supply an implementation for x86 in order to generate more efficient code. V2->V3: - Cleanup - Remove strange type checking from percpu_add_return_op. tj: - Dropped unused typedef from percpu_add_return_op(). - Renamed ret__ to paro_ret__ in percpu_add_return_op(). - Minor indentation adjustments. Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit a663ffff1d2e94a7c549a37d08ed9169ce83bdd6 Author: Christoph Lameter Date: Mon Dec 6 11:39:59 2010 -0600 percpu: Generic support for this_cpu_add, sub, dec, inc_return Introduce generic support for this_cpu_add_return etc. The fallback is to realize these operations with simpler __this_cpu_ops. tj: - Reformatted __cpu_size_call_return2() to make it more consistent with its neighbors. - Dropped unnecessary temp variable ret__ from __this_cpu_generic_add_return(). Reviewed-by: Tejun Heo Reviewed-by: Mathieu Desnoyers Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit 909ea96468096b07fbb41aaf69be060d92bd9271 Author: Christoph Lameter Date: Wed Dec 8 16:22:55 2010 +0100 core: Replace __get_cpu_var with __this_cpu_read if not used for an address. __get_cpu_var() can be replaced with this_cpu_read and will then use a single read instruction with implied address calculation to access the correct per cpu instance. However, the address of a per cpu variable passed to __this_cpu_read() cannot be determined (since it's an implied address conversion through segment prefixes). Therefore apply this only to uses of __get_cpu_var where the address of the variable is not used. Cc: Pekka Enberg Cc: Hugh Dickins Cc: Thomas Gleixner Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit 780f36d8b3fa9572f731d4fb85067b2e45e6f993 Author: Christoph Lameter Date: Mon Dec 6 11:16:29 2010 -0600 xen: Use this_cpu_ops Use this_cpu_ops to reduce code size and simplify things in various places. V3->V4: Move instance of this_cpu_inc_return to a later patchset so that this patch can be applied without infrastructure changes. Cc: Jeremy Fitzhardinge Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit c7b92516a9c68fa5403879225a5a19974a801ef6 Author: Christoph Lameter Date: Mon Dec 6 11:16:28 2010 -0600 fs: Use this_cpu_xx operations in buffer.c Optimize various per cpu area operations through these new percpu operations. These operations avoid address calculations through the use of segment prefixes and multiple memory references through RMW instructions etc. Reduces code size: Before: christoph@linux-2.6$ size fs/buffer.o text data bss dec hex filename 19169 80 28 19277 4b4d fs/buffer.o After: christoph@linux-2.6$ size fs/buffer.o text data bss dec hex filename 19138 80 28 19246 4b2e fs/buffer.o V3->V4: - Move the use of this_cpu_inc_return into a later patch so that this one can go in without percpu infrastructure changes. Cc: Wu Fengguang Cc: Christoph Hellwig Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit 5309665dcc1143d659d82568da8d00f0e08a58f9 Author: Christoph Lameter Date: Mon Dec 6 11:16:26 2010 -0600 fakekey: Simplify speakup_fake_key_pressed through this_cpu_ops The whole function can be expressed as a simple this_cpu_read() operation. The function overhead is now likely multiple times that of the single instruction that is executed in it. Sedat: fixed compile failure caused by an extra ')'. Cc: William Hubbs Cc: Sedat Dilek Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit b76834bc1b6db0a0923eed85c81b1113021b0612 Author: Christoph Lameter Date: Mon Dec 6 11:16:25 2010 -0600 kprobes: Use this_cpu_ops Use this_cpu ops in various places to optimize per cpu data access. Cc: Jason Baron Cc: Namhyung Kim Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit 4a6f4fe8377720e5a279fdbb769946c242e936d3 Author: Christoph Lameter Date: Mon Dec 6 11:16:24 2010 -0600 drivers: Replace __get_cpu_var with __this_cpu_read if not used for an address. __get_cpu_var() can be replaced with this_cpu_read and will then use a single read instruction with implied address calculation to access the correct per cpu instance. However, the address of a per cpu variable passed to __this_cpu_read() cannot be determed (since its an implied address conversion through segment prefixes). Therefore apply this only to uses of __get_cpu_var where the addres of the variable is not used. V3->V4: - Move one instance of this_cpu_inc_return to a later patch so that this one can go in without percpu infrastructrure changes. Sedat: fixed compile failure caused by an extra ')'. Cc: Neil Horman Cc: Martin Schwidefsky Cc: Sedat Dilek Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit 12938a9220a38d555e38dc9b40021e664b99a1f1 Author: Christoph Lameter Date: Mon Dec 6 11:16:20 2010 -0600 vmstat: Optimize zone counter modifications through the use of this cpu operations this cpu operations can be used to slightly optimize the function. The changes will avoid some address calculations and replace them with the use of the percpu segment register. If one would have this_cpu_inc_return and this_cpu_dec_return then it would be possible to optimize inc_zone_page_state and dec_zone_page_state even more. V1->V2: - Fix __dec_zone_state overflow handling - Use s8 variables for temporary storage. V2->V3: - Put __percpu annotations in correct places. Reviewed-by: Pekka Enberg Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit 819a72af8d6653daa48334f24ce0a935ccdd33c7 Author: Christoph Lameter Date: Mon Dec 6 11:16:19 2010 -0600 percpucounter: Optimize __percpu_counter_add a bit through the use of this_cpu() options. The this_cpu_* options can be used to optimize __percpu_counter_add a bit. Avoids some address arithmetic and saves 12 bytes. Before: 00000000000001d3 <__percpu_counter_add>: 1d3: 55 push %rbp 1d4: 48 89 e5 mov %rsp,%rbp 1d7: 41 55 push %r13 1d9: 41 54 push %r12 1db: 53 push %rbx 1dc: 48 89 fb mov %rdi,%rbx 1df: 48 83 ec 08 sub $0x8,%rsp 1e3: 4c 8b 67 30 mov 0x30(%rdi),%r12 1e7: 65 4c 03 24 25 00 00 add %gs:0x0,%r12 1ee: 00 00 1f0: 4d 63 2c 24 movslq (%r12),%r13 1f4: 48 63 c2 movslq %edx,%rax 1f7: 49 01 f5 add %rsi,%r13 1fa: 49 39 c5 cmp %rax,%r13 1fd: 7d 0a jge 209 <__percpu_counter_add+0x36> 1ff: f7 da neg %edx 201: 48 63 d2 movslq %edx,%rdx 204: 49 39 d5 cmp %rdx,%r13 207: 7f 1e jg 227 <__percpu_counter_add+0x54> 209: 48 89 df mov %rbx,%rdi 20c: e8 00 00 00 00 callq 211 <__percpu_counter_add+0x3e> 211: 4c 01 6b 18 add %r13,0x18(%rbx) 215: 48 89 df mov %rbx,%rdi 218: 41 c7 04 24 00 00 00 movl $0x0,(%r12) 21f: 00 220: e8 00 00 00 00 callq 225 <__percpu_counter_add+0x52> 225: eb 04 jmp 22b <__percpu_counter_add+0x58> 227: 45 89 2c 24 mov %r13d,(%r12) 22b: 5b pop %rbx 22c: 5b pop %rbx 22d: 41 5c pop %r12 22f: 41 5d pop %r13 231: c9 leaveq 232: c3 retq After: 00000000000001d3 <__percpu_counter_add>: 1d3: 55 push %rbp 1d4: 48 63 ca movslq %edx,%rcx 1d7: 48 89 e5 mov %rsp,%rbp 1da: 41 54 push %r12 1dc: 53 push %rbx 1dd: 48 89 fb mov %rdi,%rbx 1e0: 48 8b 47 30 mov 0x30(%rdi),%rax 1e4: 65 44 8b 20 mov %gs:(%rax),%r12d 1e8: 4d 63 e4 movslq %r12d,%r12 1eb: 49 01 f4 add %rsi,%r12 1ee: 49 39 cc cmp %rcx,%r12 1f1: 7d 0a jge 1fd <__percpu_counter_add+0x2a> 1f3: f7 da neg %edx 1f5: 48 63 d2 movslq %edx,%rdx 1f8: 49 39 d4 cmp %rdx,%r12 1fb: 7f 21 jg 21e <__percpu_counter_add+0x4b> 1fd: 48 89 df mov %rbx,%rdi 200: e8 00 00 00 00 callq 205 <__percpu_counter_add+0x32> 205: 4c 01 63 18 add %r12,0x18(%rbx) 209: 48 8b 43 30 mov 0x30(%rbx),%rax 20d: 48 89 df mov %rbx,%rdi 210: 65 c7 00 00 00 00 00 movl $0x0,%gs:(%rax) 217: e8 00 00 00 00 callq 21c <__percpu_counter_add+0x49> 21c: eb 04 jmp 222 <__percpu_counter_add+0x4f> 21e: 65 44 89 20 mov %r12d,%gs:(%rax) 222: 5b pop %rbx 223: 41 5c pop %r12 225: c9 leaveq 226: c3 retq Reviewed-by: Pekka Enberg Reviewed-by: Tejun Heo Reviewed-by: Mathieu Desnoyers Acked-by: H. Peter Anvin Signed-off-by: Christoph Lameter Signed-off-by: Tejun Heo commit e72df0b847adf064e64bcbd5141f0031524e723e Author: Tejun Heo Date: Fri Dec 10 17:02:49 2010 +0100 MAINTAINERS: Add percpu allocator entry Add me and Christoph Lameter as maintainers for the percpu memory allocator. Signed-off-by: Tejun Heo Cc: Christoph Lameter Acked-by: Christoph Lameter commit c20b4dd31820a551d0fb60bf27b99345905c2eb6 Author: Christian Glindkamp Date: Thu Dec 9 11:15:59 2010 +0100 at91: Refactor Stamp9G20 and PControl G20 board file As PControl G20 is a carrier board for the Stamp9G20 SoM, some code can be shared. Therefore board-stamp9g20.c is refactored to allow reusing the SoM initialization and board-pcontrol-g20.c is modified to use it. Signed-off-by: Christian Glindkamp Signed-off-by: Nicolas Ferre commit 8251544f9e28058e54c4f35b7cd13b0d191d7555 Author: Ryan Mallon Date: Wed Jun 2 12:55:36 2010 +1200 at91: Fix uhpck clock rate in upll case The uhpck clock should be divided from the utmi clock, not its parent (main). This change is mostly cosmetic as the uhpck rate value is not used anywhere except for the debugfs clock output. Signed-off-by: Ryan Mallon Signed-off-by: Nicolas Ferre commit 41491b9adc6ba47b73100991e9295ae70c58db0f Author: Yusuke Goda Date: Wed Dec 15 08:31:04 2010 +0000 ARM: mach-shmobile: mackerel: Add mmcif support v2 Add comment of J22 and OCR field. Signed-off-by: Yusuke Goda Signed-off-by: Paul Mundt commit 1cf215a5b43950d1a304373037828158057ff9fc Author: Magnus Damm Date: Fri Dec 17 15:15:48 2010 +0900 ARM: mach-shmobile: INTC interrupt priority level demux fix Fix interrupt priority level handling on SH-Mobile ARM. SH-Mobile ARM platforms using multiple interrupt priority levels need this patch to fix a potential dead lock that may occur if multiple interrupts with different levels are pending simultaneously. The default INTC configuration is to use the same priority level for all interrupts, so this issue does not trigger by default. It is however common for board code to override the interrupt priority for certain interrupt sources depending on the application. Without this fix such boards may lock up. In detail, this patch updates the INTC code in entry-macro.S to make sure that the INTLVLA register gets set as expected. To trigger this bug modify the board specific code to adjust the interrupt priority level for the ethernet chip. After changing the priority level simply use flood ping to drown the board with interrupts. This patch applies to INTCA-based processors such as sh7372, sh7377 and sh7372. GIC-based processors are not affected. Suitable for v2.6.37-rc and stable from v2.6.34 to v2.6.36. Cc: stable@kernel.org Signed-off-by: Magnus Damm Tested-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit 676b14c36de5bea83f7666e5f5965188426b97a7 Author: Magnus Damm Date: Wed Dec 15 10:59:24 2010 +0000 ARM: mach-shmobile: fix compile warning in mm/init.c Turn down the warning noise from the compiler, basically a SH-Mobile specific version of the patch located in the RMK patch tracker: 6484/1: "fix compile warning in mm/init.c", Without this patch the following warning triggers: CC arch/arm/kernel/sys_arm.o arch/arm/mm/init.c: In function 'mem_init': arch/arm/mm/init.c:606: warning: format '%08lx' expects type 'long unsigned int', but argument 12 has type 'unsigned int' CC arch/arm/kernel/traps.o Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 65ada547d68dc075aa06df92fe325bff07cbc606 Author: Takashi YOSHII Date: Fri Dec 17 07:25:09 2010 +0000 clocksource: sh_cmt: Remove nested spinlock fix There are control flow that sh_cmt_set_next() does double spin-lock. The callers sh_cmt_{start,stop}() already have lock. But another callers sh_cmt_clock_event_{start,next}() does not. Now sh_cmt_set_next() does not lock by itself. All the callers should hold spin-lock before calling it. [damm@opensource.se: use __sh_cmt_set_next() to simplify code] [damm@opensource.se: added stable, suitable for v2.6.35 + v2.6.36] Cc: stable@kernel.org Signed-off-by: Takashi YOSHII Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 03aa18f550900855c1d3d17ac83c14a3d668d344 Author: Paul Mundt Date: Fri Dec 17 19:16:10 2010 +0900 dma: shdma: NMI support. Presently DMA transfers are interrupted and aborted by the NMI. This implements some basic logic for more gracefully handling and clearing each controller's NMIF flag via the NMI die chain, needed to resume transfers post-NMI. Reported-by: Michael Szafranek Signed-off-by: Paul Mundt commit 76496f8f2e104b8bb08db09c063a6817d18829a6 Author: Paul Mundt Date: Fri Dec 17 18:58:04 2010 +0900 sh: mach-sdk7786: Handle baseboard NMI source selection. The on-board NMI switch is routed through and mangled by the FPGA prior to its delivery to the NMI pin, so add some glue for the various configuration options. The default is to unmask it and enable all input sources. Signed-off-by: Paul Mundt commit 0fc13c8995cd96f4123de400c71c223d80400ed9 Author: Stephen M. Cameron Date: Fri Dec 17 09:01:37 2010 +0100 cciss: fix cciss_revalidate panic If you delete a logical drive, and then run BLKRRPART (e.g. via fdisk) on a logical drive which is "after" the deleted logical drive in the h->drv[] array, then cciss_revalidate panics because it will access the null pointer h->drv[x] when x hits the deleted drive. Signed-off-by: Stephen M. Cameron Cc: stable@kernel.org Signed-off-by: Jens Axboe commit 72d4cd9f38b5ed96b75df4c622be25e1c2648dd3 Author: Mike Snitzer Date: Fri Dec 17 08:34:20 2010 +0100 block: max hardware sectors limit wrapper Implement blk_limits_max_hw_sectors() and make blk_queue_max_hw_sectors() a wrapper around it. DM needs this to avoid setting queue_limits' max_hw_sectors and max_sectors directly. dm_set_device_limits() now leverages blk_limits_max_hw_sectors() logic to establish the appropriate max_hw_sectors minimum (PAGE_SIZE). Fixes issue where DM was incorrectly setting max_sectors rather than max_hw_sectors (which caused dm_merge_bvec()'s max_hw_sectors check to be ineffective). Signed-off-by: Mike Snitzer Cc: stable@kernel.org Acked-by: Martin K. Petersen Signed-off-by: Jens Axboe commit e692cb668fdd5a712c6ed2a2d6f2a36ee83997b4 Author: Martin K. Petersen Date: Wed Dec 1 19:41:49 2010 +0100 block: Deprecate QUEUE_FLAG_CLUSTER and use queue_limits instead When stacking devices, a request_queue is not always available. This forced us to have a no_cluster flag in the queue_limits that could be used as a carrier until the request_queue had been set up for a metadevice. There were several problems with that approach. First of all it was up to the stacking device to remember to set queue flag after stacking had completed. Also, the queue flag and the queue limits had to be kept in sync at all times. We got that wrong, which could lead to us issuing commands that went beyond the max scatterlist limit set by the driver. The proper fix is to avoid having two flags for tracking the same thing. We deprecate QUEUE_FLAG_CLUSTER and use the queue limit directly in the block layer merging functions. The queue_limit 'no_cluster' is turned into 'cluster' to avoid double negatives and to ease stacking. Clustering defaults to being enabled as before. The queue flag logic is removed from the stacking function, and explicitly setting the cluster flag is no longer necessary in DM and MD. Reported-by: Ed Lin Signed-off-by: Martin K. Petersen Acked-by: Mike Snitzer Cc: stable@kernel.org Signed-off-by: Jens Axboe commit cb1868869dce7b751b670aadfc1f1360bc224b29 Author: Marek Szyprowski Date: Fri Dec 17 14:47:42 2010 +0900 ARM: S5PV210: update MAX8998 platform data to get rid of WARN() This patch adds new entries required by the new version of MAX8998 driver. Without them, the driver fails to init. See commit 50f19a4596 Signed-off-by: Marek Szyprowski Signed-off-by: Kyungmin Park Signed-off-by: Kukjin Kim commit 0f8f9c2b6c1326e99e51729a5d4aeb9c3ce164e1 Author: Yauhen Kharuzhy Date: Fri Dec 17 14:45:01 2010 +0900 ARM S3C24XX: Fix compilation of PM code for S3C2416 S3C2416 PM code uses low-level sleep routines from S3C2412 code, but these routines are compiled only for S3C2412 SoC. Split S3C2412_PM to two parts: S3C2412_PM, S3C2412_PM_SLEEP and select last in S3C2416's Kconfig. Signed-off-by: Yauhen Kharuzhy Signed-off-by: Kukjin Kim commit 258b78c364b9d3f730b5e3187fc500d472b5c237 Author: Kukjin Kim Date: Fri Dec 3 21:22:42 2010 +0900 ARM: S3C24XX: Fix CONFIG_S3C_DEV_NAND Kconfig entry Should be CONFIG_S3C_DEV_NAND instead of CONFIG_S3C_DEVICE_NAND. Cc: Ben Dooks Signed-off-by: Kukjin Kim commit 147dd5610c8d1bacb88a6c1dfdaceaf257946ed0 Author: H. Peter Anvin Date: Thu Dec 16 19:11:09 2010 -0800 x86-32: Make sure we can map all of lowmem if we need to A relocatable kernel can be anywhere in lowmem -- and in the case of a kdump kernel, is likely to be fairly high. Since the early page tables map everything from address zero up we need to make sure we allocate enough brk that we can map all of lowmem if we need to. Reported-by: Stanislaw Gruszka Signed-off-by: H. Peter Anvin Tested-by: Yinghai Lu LKML-Reference: <4D0AD3ED.8070607@kernel.org> commit 29ba5fed1bbd09c2cba890798c8f9eaab251401d Author: stephen hemminger Date: Thu Dec 16 11:28:12 2010 +0000 ipv6: don't flush routes when setting loopback down When loopback device is being brought down, then keep the route table entries because they are special. The entries in the local table for linklocal routes and ::1 address should not be purged. This is a sub optimal solution to the problem and should be replaced by a better fix in future. Signed-off-by: Stephen Hemminger Acked-by: "Eric W. Biederman" Signed-off-by: David S. Miller commit b7b8de087384cc1954a8cd075af3f9e5977caa2e Author: Werner Fink Date: Fri Dec 3 12:48:23 2010 +0100 TTY: Add tty ioctl to figure device node of the system console. This has been in the SuSE kernels for a very long time. Signed-off-by: Werner Fink Signed-off-by: Greg Kroah-Hartman commit fbc92a3455577ab17615cbcb91826399061bd789 Author: Kay Sievers Date: Wed Dec 1 18:51:05 2010 +0100 tty: add 'active' sysfs attribute to tty0 and console device tty: add 'active' sysfs attribute to tty0 and console device Userspace can query the actual virtual console, and the configured console devices behind /dev/tt0 and /dev/console. The last entry in the list of devices is the active device, analog to the console= kernel command line option. The attribute supports poll(), which is raised when the virtual console is changed or /dev/console is reconfigured. Signed-off-by: Kay Sievers Signed-off-by: Greg Kroah-Hartman index 0000000..b138b66 commit dbb442b85a1d82f91cfe0524c4f9b3a5196a10ca Author: Greg Kroah-Hartman Date: Thu Dec 16 15:52:30 2010 -0800 Revert "USB: gadget: Allow function access to device ID data during bind()" This reverts commit 1ab83238740ff1e1773d5c13ecac43c60cf4aec4. Turns out this doesn't allow for the device ids to be overridden properly, so we need to revert the thing. Reported-by: Jef Driesen Cc: Robert Lukassen Cc: stable Signed-off-by: Greg Kroah-Hartman commit a3383e8372c0c11238f9bb9777929bfc3a2d320a Merge: 68a4ec9c03461e94a9577cf499069621bb074833 7d13162332f2b67a941d18cee20f1c0413e020de Author: Linus Torvalds Date: Thu Dec 16 15:45:49 2010 -0800 Merge branch 'for-linus' of git://git.infradead.org/users/eparis/notify * 'for-linus' of git://git.infradead.org/users/eparis/notify: fanotify: fill in the metadata_len field on struct fanotify_event_metadata fanotify: split version into version and metadata_len fanotify: Dont try to open a file descriptor for the overflow event fanotify: Introduce FAN_NOFD fanotify: do not leak user reference on allocation failure inotify: stop kernel memory leak on file creation failure fanotify: on group destroy allow all waiters to bypass permission check fanotify: Dont allow a mask of 0 if setting or removing a mark fanotify: correct broken ref counting in case adding a mark failed fanotify: if set by user unset FMODE_NONOTIFY before fsnotify_perm() is called fanotify: remove packed from access response message fanotify: deny permissions when no event was sent commit ecc1624a2fff45780959efbcb73ace18fdb3c58d Author: Thomas Sailer Date: Tue Dec 14 16:04:05 2010 +0100 USB: misc: uss720.c: add another vendor/product ID Fabio Battaglia report that he has another cable that works with this driver, so this patch adds its vendor/product ID. Signed-off-by: Thomas Sailer Cc: stable Signed-off-by: Greg Kroah-Hartman commit d73a9b3001f29271c2e9f2a806b05a431c5d9591 Author: Vitaly Kuznetsov Date: Tue Dec 14 10:16:49 2010 -0500 USB: usb-storage: unusual_devs entry for the Samsung YP-CP3 Add an unusual_devs entry for the Samsung YP-CP3 MP4 player. User was getting the following errors in dmesg: usb 2-6: reset high speed USB device using ehci_hcd and address 2 usb 2-6: reset high speed USB device using ehci_hcd and address 2 usb 2-6: reset high speed USB device using ehci_hcd and address 2 usb 2-6: USB disconnect, address 2 sd 3:0:0:0: [sdb] Assuming drive cache: write through sdb:<2>ldm_validate_partition_table(): Disk read failed. Dev sdb: unable to read RDB block 0 unable to read partition table Signed-off-by: Vitaly Kuznetsov Acked-by: Alan Stern CC: Matthew Dharm CC: stable@kernel.org Signed-off-by: Greg Kroah-Hartman commit daba58035a044cae75488175a96cc18362a64518 Author: Pavankumar Kondeti Date: Thu Dec 16 14:32:25 2010 +0530 USB: gadget: Remove suspended sysfs file before freeing cdev cdev struct is accessed in suspended sysfs show function. So remove sysfs file before freeing the cdev in composite_unbind. Signed-off-by: Pavankumar Kondeti Signed-off-by: Greg Kroah-Hartman commit f4ce9084476dc518bfd0f35f62f4bd0a130893e0 Author: Pavankumar Kondeti Date: Thu Dec 16 14:32:24 2010 +0530 USB: core: Add input prompt and help text for USB_OTG config bd6882 commit (usb: gadget: fix Kconfig warning) removes the duplicate USB_OTG config from gadget/Kconfig. But does not copy the input prompt and help text to the original config defined in core/Kconfig. Add them now. Signed-off-by: Pavankumar Kondeti Signed-off-by: Greg Kroah-Hartman commit 68a4ec9c03461e94a9577cf499069621bb074833 Merge: b3444d164be8f977f4133ef0c6f4a18f2741373f c9bace7ca1e2aeb95754ebc92c8f88a9f215691d Author: Linus Torvalds Date: Thu Dec 16 15:45:25 2010 -0800 Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/upstream-linus * 'upstream' of git://git.linux-mips.org/pub/scm/upstream-linus: (28 commits) MIPS: Add a CONFIG_FORCE_MAX_ZONEORDER Kconfig option. MIPS: LD/SD o32 macro GAS fix update MIPS: Alchemy: fix build with SERIAL_8250=n MIPS: Rename mips_dma_cache_sync back to dma_cache_sync MIPS: MT: Fix typo in comment. SSB: Fix nvram_get on BCM47xx platform MIPS: BCM47xx: Swap serial console if ttyS1 was specified. MIPS: BCM47xx: Use sscanf for parsing mac address MIPS: BCM47xx: Fill values for b43 into SSB sprom MIPS: BCM47xx: Do not read config from CFE MIPS: FDT size is a be32 MIPS: Fix CP0 COUNTER clockevent race MIPS: Fix regression on BCM4710 processor detection MIPS: JZ4740: Fix pcm device name MIPS: Separate two consecutive loads in memset.S MIPS: Send proper signal and siginfo on FP emulator faults. MIPS: AR7: Fix loops per jiffies on TNETD7200 devices MIPS: AR7: Fix double ar7_gpio_init declaration MIPS: Rework GENERIC_HARDIRQS Kconfig. MIPS: Alchemy: Add return value check for strict_strtoul() ... commit 63d5e5a727240b317b0c2fa2abeb32b367aea196 Author: Sven Eckelmann Date: Thu Dec 16 23:28:17 2010 +0100 Staging: batman-adv: Remove batman-adv from staging batman-adv is now moved to net/batman-adv/ and can be removed from staging. Signed-off-by: Sven Eckelmann Cc: David S. Miller Signed-off-by: Greg Kroah-Hartman commit 7edc3453e54432a9f1c636b6481f1107c9db19bd Author: Eric Dumazet Date: Wed Dec 15 23:52:55 2010 +0000 ifb: fix a lockdep splat After recent ifb changes, we must use lockless __skb_dequeue() since lock is not anymore initialized. Signed-off-by: Eric Dumazet Cc: Jamal Hadi Salim Cc: Changli Gao Acked-by: Changli Gao Signed-off-by: David S. Miller commit 7d743b7e952261f4d9ee091100b6403f3ce8a2af Author: Wei Yongjun Date: Tue Dec 14 16:10:41 2010 +0000 sctp: fix the return value of getting the sctp partial delivery point Get the sctp partial delivery point using SCTP_PARTIAL_DELIVERY_POINT socket option should return 0 if success, not -ENOTSUPP. Signed-off-by: Wei Yongjun Acked-by: Vlad Yasevich Signed-off-by: David S. Miller commit 0d0b16727f24f8258eeb33818347ca0f4557f982 Author: MichaÅ‚ MirosÅ‚aw Date: Tue Dec 14 15:24:08 2010 +0000 net: Fix drivers advertising HW_CSUM feature to use csum_start Some drivers are using skb_transport_offset(skb) instead of skb->csum_start for NETIF_F_HW_CSUM offload. This does not matter now, but if someone implements checksumming of encapsulated packets then this will break silently. TSO output paths are left as they are, since they are for IP+TCP only (might be worth converting though). Signed-off-by: MichaÅ‚ MirosÅ‚aw Signed-off-by: David S. Miller commit 55508d601dab7df5cbcc7a63f4be8620eface204 Author: MichaÅ‚ MirosÅ‚aw Date: Tue Dec 14 15:24:08 2010 +0000 net: Use skb_checksum_start_offset() Replace skb->csum_start - skb_headroom(skb) with skb_checksum_start_offset(). Note for usb/smsc95xx: skb->data - skb->head == skb_headroom(skb). Signed-off-by: MichaÅ‚ MirosÅ‚aw Signed-off-by: David S. Miller commit 04fb451eff978ca059399eab83d5594b073caf6f Author: MichaÅ‚ MirosÅ‚aw Date: Tue Dec 14 15:24:08 2010 +0000 net: Introduce skb_checksum_start_offset() Introduce skb_checksum_start_offset() to replace repetitive calculation. Signed-off-by: MichaÅ‚ MirosÅ‚aw Signed-off-by: David S. Miller commit 0b7967503dc97864f283a3a06fbe23e041876138 Author: MichaÅ‚ MirosÅ‚aw Date: Tue Dec 14 12:35:13 2010 +0000 net/veth: Fix packet checksumming We can't change ip_summed from CHECKSUM_PARTIAL to CHECKSUM_NONE or CHECKSUM_UNNECESSARY because checksum in packet's headers is not valid and will cause invalid checksum when frame is forwarded. Signed-off-by: MichaÅ‚ MirosÅ‚aw Signed-off-by: David S. Miller commit 76d661586c8131453ba75a2e027c1f21511a893a Author: David Stevens Date: Tue Dec 14 08:42:16 2010 +0000 bridge: fix IPv6 queries for bridge multicast snooping This patch fixes a missing ntohs() for bridge IPv6 multicast snooping. Signed-off-by: David L Stevens Acked-by: Herbert Xu Signed-off-by: David S. Miller commit fcbdf09d9652c8919dcf47072e3ae7dcb4eb98ac Author: Octavian Purdila Date: Thu Dec 16 14:26:56 2010 -0800 net: fix nulls list corruptions in sk_prot_alloc Special care is taken inside sk_port_alloc to avoid overwriting skc_node/skc_nulls_node. We should also avoid overwriting skc_bind_node/skc_portaddr_node. The patch fixes the following crash: BUG: unable to handle kernel paging request at fffffffffffffff0 IP: [] udp4_lib_lookup2+0xad/0x370 [] __udp4_lib_lookup+0x282/0x360 [] __udp4_lib_rcv+0x31e/0x700 [] ? ip_local_deliver_finish+0x65/0x190 [] ? ip_local_deliver+0x88/0xa0 [] udp_rcv+0x15/0x20 [] ip_local_deliver_finish+0x65/0x190 [] ip_local_deliver+0x88/0xa0 [] ip_rcv_finish+0x32d/0x6f0 [] ? netif_receive_skb+0x99c/0x11c0 [] ip_rcv+0x2bb/0x350 [] netif_receive_skb+0x99c/0x11c0 Signed-off-by: Leonard Crestez Signed-off-by: Octavian Purdila Acked-by: Eric Dumazet Signed-off-by: David S. Miller commit 2984961c388381c1830f95e1c2dc2137301b1009 Author: Ivan Vecera Date: Tue Dec 14 05:43:19 2010 +0000 be2net: use mutex instead of spin lock for mbox_lock Since the mbox polling uses the schedule_timeout, the mbox_lock should be a mutex and not a spin lock. The commit f25b03a replaced udelay() with schedule_timeout() but didn't change mbox_lock to semaphore or mutex. Signed-off-by: Ivan Vecera Signed-off-by: David S. Miller commit bc2ce894e113ed95b92541134b002fdc641e8080 Author: Eric Dumazet Date: Thu Dec 16 14:08:34 2010 -0800 tcp: relax tcp_paws_check() Some windows versions have wrong RFC1323 implementations, with SYN and SYNACKS messages containing zero tcp timestamps. We relaxed in commit fc1ad92dfc4e363 the passive connection case (Windows connects to a linux machine), but the reverse case (linux connects to a Windows machine) has an analogue problem when tsvals from windows machine are 'negative' (high order bit set) : PAWS triggers and we drops incoming messages. Fix this by making zero ts_recent value special, allowing frame to be processed. Based on a report and initial patch from Dmitiy Balakin Bugzilla reference : https://bugzilla.kernel.org/show_bug.cgi?id=24842 Reported-by: dmitriy.balakin@nicneiron.ru Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 49c2fa08a77a7eefa4cbc73601f64984aceacfa7 Author: Neil Horman Date: Wed Dec 8 09:47:48 2010 -0500 PCI: Update MCP55 quirk to not affect non HyperTransport variants I wrote this quirk awhile ago to properly setup MCP55 chips on hypertransport busses so that interrupts reached whatever cpu happend to boot the kdump kernel. while that works well, it was recently shown to me that a a non-hypertransport variant of the MCP55 exists, and on those system the register that this quirk manipulates causes hangs if you write to it. Since the quirk was only meant to handle errors found on MCP55 chips that have a HT interface, this patch adds a filter to make sure the chip is an HT capable before making the needed register adjustment. This lets the broken MCP55s work with kdump while not breaking the non-HT variants. Resolves https://bugzilla.kernel.org/show_bug.cgi?id=23952 Tested successfully by the reporter and myself. Cc: stable@kernel.org Reported-by: Mathieu BĂ©rard Acked-by: Vivek Goyal Signed-off-by: Neil Horman Signed-off-by: Jesse Barnes commit 1121584f5db8a99a7ad94c6c5d62431b3187ad98 Author: H.J. Lu Date: Wed Dec 15 17:11:22 2010 -0800 modpost: Put .zdebug* section on white list "as --compress-debug-sections" will generate compressed debug sections with section names ".zdebug*". This patch puts .zdebug* section on white list. Signed-off-by: H.J. Lu Signed-off-by: Michal Marek commit 443457242beb6716b43db4d62fe148eab5515505 Author: Octavian Purdila Date: Mon Dec 13 12:44:07 2010 +0000 net: factorize sync-rcu call in unregister_netdevice_many Add dev_close_many and dev_deactivate_many to factorize another sync-rcu operation on the netdevice unregister path. $ modprobe dummy numdummies=10000 $ ip link set dev dummy* up $ time rmmod dummy Without the patch With the patch real 0m 24.63s real 0m 5.15s user 0m 0.00s user 0m 0.00s sys 0m 6.05s sys 0m 5.14s Signed-off-by: Octavian Purdila Signed-off-by: David S. Miller commit 5155e2c70fc50bc475911dab5dba2f80130523c7 Author: Pavankumar Kondeti Date: Wed Dec 8 13:37:08 2010 +0530 MSM: Add USB support for MSM7x30 Add USB OTG, peripheral and host devices. This patch also adds usb_phy_clk which is required for resetting the PHY. VBUS power up and shutdown routines depends on PMIC module. As PMIC driver is unavailable, configure USB in peripheral only mode. Signed-off-by: Pavankumar Kondeti Signed-off-by: David Brown commit 7032d512cff979319f308e02223d0cf39b6e9a91 Author: Pavankumar Kondeti Date: Wed Dec 8 13:37:07 2010 +0530 MSM: Add USB suport for QSD8x50 OTG driver takes care of putting hardware into low power mode. Hence make peripheral and host devices as children of OTG device and let runtime PM takes care of notifying peripheral and host state to OTG device. VBUS power up and shutdown routines are implemented by modem processor. As RPC infrastructure is not available, configure USB in peripheral only mode. Signed-off-by: Pavankumar Kondeti Signed-off-by: David Brown commit c6c8fea29769d998d94fcec9b9f14d4b52b349d3 Author: Sven Eckelmann Date: Mon Dec 13 11:19:28 2010 +0000 net: Add batman-adv meshing protocol B.A.T.M.A.N. (better approach to mobile ad-hoc networking) is a routing protocol for multi-hop ad-hoc mesh networks. The networks may be wired or wireless. See http://www.open-mesh.org/ for more information and user space tools. Signed-off-by: Sven Eckelmann Signed-off-by: David S. Miller commit c466cd2bb9cee2e576fc9663b828f51e322d7b4b Author: Greg Kroah-Hartman Date: Thu Dec 16 13:40:42 2010 -0800 USB: serial: ftdi_sio: add support for TIOCSERGETLSR Willem-Jan noticed that the ftdi_sio driver did not support the TIOCSERGETLSR ioctl, and some userspace programs rely on it. This patch adds the support. Reported-by: Willem-Jan de Hoog Tested-by: Willem-Jan de Hoog Signed-off-by: Greg Kroah-Hartman commit 0247a7bcd4273fa10c4aba9b3f567c659bab2d2b Author: Fabio Estevam Date: Wed Dec 15 22:31:28 2010 -0200 USB: ehci-mxc: Setup portsc register prior to accessing OTG viewport In order to read/write to the i.MX OTG viewport register it is necessary to setup the PORTSCx register first. By default i.MX OTG port is configured for USB serial PHY. In order to use a ULPI PHY the PORTSCx register needs to be configured properly. commit 724c852 (USB: ehci/mxc: compile fix) placed the PORTSC setup after the OTG viewport is accessed and this causes ULPI read/write to fail. Revert the PORTSC setup order. Tested on a MX31PDK board with a ISP1504 transceiver: ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver mxc-ehci mxc-ehci.0: initializing i.MX USB Controller ULPI transceiver vendor/product ID 0x04cc/0x1504 Found NXP ISP1504 ULPI transceiver. ULPI integrity check: passed. Signed-off-by: Fabio Estevam Signed-off-by: Greg Kroah-Hartman commit 2c8245c4990e75d86ab30bb0af9bb90cbe04985d Author: Rob Emanuele Date: Tue Dec 14 19:00:30 2010 +0100 USB: atmel_usba_udc: fix freeing irq in usba_udc_remove() Add a free_irq() call on vbus gpio when we remove udc so that the vbus irq is properly released. Signed-off-by: Rob Emanuele Signed-off-by: Nicolas Ferre Acked-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Greg Kroah-Hartman commit 6ef9fc657bd69c708ada2ee9fd3b2e13f7600a3d Author: Anand Gadiyar Date: Mon Dec 13 22:00:34 2010 +0530 usb: ehci-omap: fix tll channel enable mask The TLL channel enable code searches for the wrong mask, and could end up enabling the wrong port. Fix this. Signed-off-by: Anand Gadiyar Signed-off-by: Greg Kroah-Hartman commit a0c9e95dfc6898dbc178d7b962916f3823434e6e Author: Keshava Munegowda Date: Mon Dec 13 22:00:51 2010 +0530 usb: ohci-omap3: fix trivial typo This is the ohci-omap3 driver, not ehci-omap. Correct this obvious typo. Signed-off-by: Keshava Munegowda Signed-off-by: Anand Gadiyar Signed-off-by: Greg Kroah-Hartman commit 0a313c4d2435ed0d86cf2295514f02de34cecd88 Author: Artem Leonenko Date: Tue Dec 14 23:47:06 2010 -0800 USB: gadget: ci13xxx: don't assume that PAGE_SIZE is 4096 Page size for transaction descriptors for CI13XXX has nothing common with page size from MM. Using platform and configuration specific PAGE_SIZE is wrong. Signed-off-by: Artem Leonenko Signed-off-by: Greg Kroah-Hartman commit 7c25a82684364da44643cbe3bdbd0f8835293767 Author: Artem Leonenko Date: Tue Dec 14 23:46:55 2010 -0800 USB: gadget: ci13xxx: fix complete() callback for no_interrupt rq's CI13xxx UDC driver doesn't call complete() callback for requests with flag no_interrupt set. Thus gadget drivers (like g_ether) are never notifed about successfully (or not) transmitted requests. As a result in case of g_ether and queued request with no_interrupt=1 fields g_ether is never notifed about sent packets and TX stalls. Solution: treat no_interrupt flag like all other UDC drivers do and call complete() callback for all requests. Signed-off-by: Artem Leonenko Signed-off-by: Greg Kroah-Hartman commit d9bb9c1820cb2a7aeb5e42a5470cf208002d9aa8 Author: Artem Leonenko Date: Tue Dec 14 23:45:50 2010 -0800 USB: gadget: update ci13xxx to work with g_ether There is one nasty scenario when CI13xxx driver fails: a) two or more rx requests are queued (g_ether does that) b) rx request completed, interrupt fires and ci13xxx dequeues rq c) request complete() callback gets called and in turn it calls ep_queue() c1) in ep_queue() request gets added to the TAIL of the rx queue list d) ep gets primed with rq from (b) e) interrupt fires f) request gets popped from queue head for hw dequeue G) requets from queue head wasn't enqueued g1) isr_tr_complete_low() doesn't enqueue more requests and it doesn't prime EP, rx traffic stalls Solution: a) enque queued requests ASAP, i.e. before calling complete() callback. b) don't HW enqueue and prime endpoint with recently added request and use the oldest request in the queue. Fixed issues: a) ep_queue() may return an error code despite request was successfully added to the queue (if _hardware_enqueue() fails) b) Added requests are always processed in LIFO order, even if they are added in complete() callback c) Finally more than two and more queued requests are processed consistently, even if they were added in complete() callback The fix was successfully tested on MIPS based SoC with 4KEc CPU core and CI13612 USB core. Board successfully boots with NFS root using g_ether on ci13xxx udc. Signed-off-by: Artem Leonenko Signed-off-by: Greg Kroah-Hartman commit 6549e8b7f34b456d5689b98c2c0cf38c98414e47 Author: Artem Leonenko Date: Tue Dec 14 23:46:40 2010 -0800 USB: gadgets: ci13xxx: fix probing of compiled-in gadget drivers Built-in gadget drivers have NULL-ifed unbind() function. Checking whether unbind() is NULL will never let any compiled into kernel driver attach. Signed-off-by: Artem Leonenko Signed-off-by: Greg Kroah-Hartman commit b236da6931e2482bfe44a7865dd4e7bb036f3496 Author: Changli Gao Date: Tue Dec 14 03:09:15 2010 +0000 net: use NUMA_NO_NODE instead of the magic number -1 Signed-off-by: Changli Gao Signed-off-by: David S. Miller commit caafa84251b886feb6cdf23d50e2cc99dcdaaaf3 Author: Taku Izumi Date: Sun Dec 12 19:04:43 2010 +0000 bonding: add the debugfs interface to see RLB hash table This patch provices the debugfs interface to see RLB hash table like the following: # cat /sys/kernel/debug/bonding/bond0/rlb_hash_table SourceIP DestinationIP Destination MAC DEV 10.124.196.205 10.124.196.205 ff:ff:ff:ff:ff:ff eth4 10.124.196.205 10.124.196.81 00:19:99:XX:XX:XX eth3 10.124.196.205 10.124.196.1 00:21:d8:XX:XX:XX eth0 This is helpful to check if the receive load balancing works as expected. Signed-off-by: Taku Izumi Signed-off-by: Jay Vosburgh Signed-off-by: David S. Miller commit 411204a5a1ec1a35363d8ef450c77e2b8235da4d Author: Taku Izumi Date: Sun Dec 12 19:03:24 2010 +0000 bonding: migrate some macros from bond_alb.c to bond_alb.h This patch simply migrates some macros from bond_alb.c to bond_alb.h. Signed-off-by: Taku Izumi Signed-off-by: Jay Vosburgh Signed-off-by: David S. Miller commit ad6bad3efbb82206837daad8cba2bc9343d778bf Author: Dimitris Michailidis Date: Tue Dec 14 21:36:55 2010 +0000 cxgb4: NUMA-aware Tx queue allocations Allocate Tx queue memory on the node indicated by the new netdev_queue_numa_node_read. Signed-off-by: Dimitris Michailidis Signed-off-by: David S. Miller commit 23d88e1d3e4a5b807ce6725f9294b7b9dfcd89a1 Author: Dimitris Michailidis Date: Tue Dec 14 21:36:54 2010 +0000 cxgb4: extend VPD parsing Current code parses the VPD RO section for keywords but makes static assumptions about the location of the section. Remove them and parse the VPD to find it. Signed-off-by: Dimitris Michailidis Signed-off-by: David S. Miller commit 005b5717faac22264c1f61908ec5ac5b98108d99 Author: Joe Perches Date: Tue Dec 14 21:36:53 2010 +0000 cxgb4: add const to static arrays Patch originally from Joe Perches, unmodified. Signed-off-by: Joe Perches Signed-off-by: Dimitris Michailidis Signed-off-by: David S. Miller commit 8f3a76769ee50a839282f70d07d5f3429524b68a Author: Dimitris Michailidis Date: Tue Dec 14 21:36:52 2010 +0000 cxgb4: remove a bitmap The driver keeps a bitmap of the netdevs it registered so it knows what to unregister later. Remove that and look at reg_state instead. Signed-off-by: Dimitris Michailidis Signed-off-by: David S. Miller commit b1a3c2b698ec333edc86bf8b5a636162ca309870 Author: Dimitris Michailidis Date: Tue Dec 14 21:36:51 2010 +0000 cxgb4: remove the name field from the adapter structure Remove a field the driver uses to keep track of the name of the first netdev it manages to register. Do this by changing the registration loop to stop the first time it fails so the first registered device is trivial to tell. Signed-off-by: Dimitris Michailidis Signed-off-by: David S. Miller commit ba27816cd8167c64652406d86ca78bcc5989f20f Author: Dimitris Michailidis Date: Tue Dec 14 21:36:50 2010 +0000 cxgb4: correct formatting of MSI-X interrupt names The last byte of the buffer for MSI-X names could not be used due to a bogus -1. Also do not explicitly clear the last byte, snprintf will do the right thing. Signed-off-by: Dimitris Michailidis Signed-off-by: David S. Miller commit 8cd18ac47f9642bcd0d30d4b3521359b1896c208 Author: Dimitris Michailidis Date: Tue Dec 14 21:36:49 2010 +0000 cxgb4: allocate more space for MSI-X interrupt names Currently MSI-X names for netdevs with long names are truncated in /proc/interrupts due to insufficient space. Use IFNAMSIZ to size the needed space. Signed-off-by: Dimitris Michailidis Signed-off-by: David S. Miller commit 118969ed21b6895045b0a5a8a32feac1c9341096 Author: Dimitris Michailidis Date: Tue Dec 14 21:36:48 2010 +0000 cxgb4: print port information after registering each netdev Print information about each port when its netdev is registered instead of looping separately over the ports at the end. The bulk of this patch is due to indentation change. Signed-off-by: Dimitris Michailidis Signed-off-by: David S. Miller commit 7d5e77aafa39f3210b6273a44fe07508e837c3cb Author: Dimitris Michailidis Date: Tue Dec 14 21:36:47 2010 +0000 cxgb4: distinguish between 1-lane KR/KX and 4-lane KR/KX/KX4 ports And fix the supported flags ethtool reports for the two cases. Signed-off-by: Dimitris Michailidis Signed-off-by: David S. Miller commit a57cabe09f843a3f71277c485494496b3b9ee84a Author: Dimitris Michailidis Date: Tue Dec 14 21:36:46 2010 +0000 cxgb4: set the number of queues before device registration The number of queues is known early, move the calls to netif_set_real_num_[rt]x_queues before register_netdev. Signed-off-by: Dimitris Michailidis Signed-off-by: David S. Miller commit ec16400823ce63bc0cfe89df78c6b7bf4a4d684b Author: Dimitris Michailidis Date: Tue Dec 14 21:36:45 2010 +0000 cxgb4: do not read the clock frequency from VPD No need to read the clock frequency from VPD, we already get it a bit later from FW, after any potential adjustments. Signed-off-by: Dimitris Michailidis Signed-off-by: David S. Miller commit ef306b50b983be4873aed453c1feeaab22f3a098 Author: Dimitris Michailidis Date: Tue Dec 14 21:36:44 2010 +0000 cxgb4: enable PCIe relaxed ordering Enable relaxed ordering for descriptor reads and packet I/O. Signed-off-by: Dimitris Michailidis Signed-off-by: David S. Miller commit 986d730a696277520084180071ac4873aac63905 Author: Vladislav Zolotarov Date: Mon Dec 13 05:44:50 2010 +0000 bnx2x: update version to 1.62.00-2 Signed-off-by: Vladislav Zolotarov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit b0200e250b5eef29e5ed8aa17979499affcc11cd Author: Vladislav Zolotarov Date: Mon Dec 13 22:34:37 2010 +0200 bnx2x: remove old FW files Signed-off-by: Dmitry Kravkov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit 5928c8baf67a36f553fe23a1b7820c7745e8bb2e Author: Vladislav Zolotarov Date: Mon Dec 13 05:44:35 2010 +0000 bnx2x: replace FW to 6.2.5 Includes FCoE releated fixes in FW flows Signed-off-by: Dmitry Kravkov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit 40392d4e49c29bf5e939803d804dc8c7b600f297 Author: Vladislav Zolotarov Date: Mon Dec 13 22:28:42 2010 +0200 bnx2x: add FW 6.2.5 files Signed-off-by: Dmitry Kravkov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit bcab15c5d780bafb38311f00fcb263d03d2b00f1 Author: Vladislav Zolotarov Date: Mon Dec 13 05:44:25 2010 +0000 bnx2x: Add DCB/PFC support - link layer Add appropriate HW DCB/PFC configuration Signed-off-by: Dmitry Kravkov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit e4901dde12d92b70dd13fa8b3bbc9df7a6129aab Author: Vladislav Zolotarov Date: Mon Dec 13 05:44:18 2010 +0000 bnx2x: add DCB support Adding DCB initialization and handling on 57712 FW/HW Signed-off-by: Dmitry Kravkov Signed-off-by: Shmulik Ravid-Rabinovitz Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit 8307fa3e86a83924dd7f8310ce1e051f34986fe8 Author: Vladislav Zolotarov Date: Mon Dec 13 05:44:09 2010 +0000 bnx2x: add a select queue callback This callback required to allow FCoE traffic to be sent on separate priority queue from other L2 traffic, which is managed by PFC in HW. Signed-off-by: Vladislav Zolotarov Signed-off-by: Shmulik Ravid-Rabinovitz Signed-off-by: Dmitry Kravkov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit ec6ba945211b1c1f97d3d19fe60f166c9a92241d Author: Vladislav Zolotarov Date: Mon Dec 13 05:44:01 2010 +0000 bnx2x: add FCoE ring Includes new driver structures and FW/HW configuration for FCoE ring Signed-off-by: Vladislav Zolotarov Signed-off-by: Shmulik Ravid-Rabinovitz Signed-off-by: Dmitry Kravkov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit a3d22a68d752ccc1a01bb0a64dd70b7a98bf9e23 Author: Vladislav Zolotarov Date: Mon Dec 13 06:27:10 2010 +0000 bnx2x: Take the distribution range definition out of skb_tx_hash() Move the calcualation of the Tx hash for a given hash range into a separate function and define the skb_tx_hash(), which calculates a Tx hash for a [0; dev->real_num_tx_queues - 1] hash values range, using this function (__skb_tx_hash()). Signed-off-by: Vladislav Zolotarov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit 35c64e5d13c3d7d8c4ad061ad5e20498b9160c24 Author: Thomas Gleixner Date: Thu Dec 16 13:06:35 2010 +0000 drivers: serial: apbuart: Handle OF failures gracefully The apbuart driver depends on OF and relies on everything being available. So if it's probed on a platform which has OF support, but no device tree is available it crashes. Triggered by the upcoming x86 OF support in randconfig testing. Further it's inconsistent vs. the probing and exiting from the of_match loop. Make it robust and consistent: - check the availablility of OF nodes before dereferencing - return -ENODEV when the device tree lookup fails - return -ENODEV when no uart port configuration is found - return -ENODEV when invalid uart port configuration is found Remove the enum_done check while at it. Driver init functions are only called once. Remove the pointless vendor and device queries as well. Reported-by: Ingo Molnar Signed-off-by: Thomas Gleixner Cc: Grant Likely Cc: Kristoffer Glembo Signed-off-by: Greg Kroah-Hartman commit 3f960dbb9dfe29ff283810624c4340c79fde87f5 Author: Govindraj.R Date: Thu Dec 16 18:12:47 2010 +0530 Serial: Avoid unbalanced IRQ wake disable during resume To avoid unbalanced IRQ wake disable, ensure that wakeups are disabled only when wakeups have been successfully enabled. Tested on OMAP3630SDP/ZOOM3. Signed-off-by: Govindraj.R Reported-by: Paul Walmsley Cc: Santosh Shilimkar Acked-by: Kevin Hilman Signed-off-by: Greg Kroah-Hartman commit 6ce5b1ce5f6922db32599e73bcb22f5cdcbf241f Author: Timur Tabi Date: Mon Dec 13 14:08:53 2010 -0600 tty: fix typos/errors in tty_driver.h comments Fix various typos and other errors in comments of tty_driver.h. The most significant is the wrong name of a function for the description of TTY_DRIVER_DYNAMIC_DEV. Signed-off-by: Timur Tabi Signed-off-by: Greg Kroah-Hartman commit 1c5189976ffc130416e808f41049c12615a6380c Author: Tomoya MORINAGA Date: Thu Dec 16 16:13:29 2010 +0900 pch_uart : fix warnings for 64bit compile Fix the following warnings drivers/serial/pch_uart.c: In function ‘dma_handle_rx’: drivers/serial/pch_uart.c:685:24: warning: cast from pointer to integer of different size drivers/serial/pch_uart.c: In function ‘dma_handle_tx’: drivers/serial/pch_uart.c:778:23: warning: cast from pointer to integer of different size drivers/serial/pch_uart.c: In function ‘pch_uart_init_port’: drivers/serial/pch_uart.c:1289:20: warning: cast to pointer from integer of different size drivers/serial/pch_uart.c: In function ‘pch_uart_exit_port’: drivers/serial/pch_uart.c:1328:2: warning: cast from pointer to integer of different size Signed-off-by: Tomoya MORINAGA Reported-by: Greg Kroah-Hartman Signed-off-by: Greg Kroah-Hartman commit 093d804611b9a38fe59753b37c29f840518406a9 Author: Ken Mills Date: Mon Dec 13 15:28:03 2010 +0000 n_gsm: gsm_data_alloc buffer allocation could fail and it is not being checked gsm_data_alloc buffer allocation could fail and it is not being checked. Add check for allocated buffer and return if the buffer allocation fails. Signed-off-by: Ken Mills Signed-off-by: Alan Cox Cc: stable@kernel.org Signed-off-by: Greg Kroah-Hartman commit be7a7411d63ccad165d66fe8e0b11b2ee336159b Author: Ken Mills Date: Mon Dec 13 15:27:27 2010 +0000 n_gsm: Fix message length handling when building header Fix message length handling when building header When the message length is greater than 127, the length field in the header is built incorrectly. According to the spec, when the length is less than 128 the length field is a single byte formatted as: bbbbbbb1. When it is greater than 127 then the field is two bytes of the format: bbbbbbb0 bbbbbbbb. Signed-off-by: Ken Mills Signed-off-by: Alan Cox Cc: stable@kernel.org Signed-off-by: Greg Kroah-Hartman commit f88a4a9b65a6f3422b81be995535d0e69df11bb8 Author: Ben Hutchings Date: Mon Dec 13 08:20:24 2010 +0000 bonding/vlan: Fix mangled NAs on slaves without VLAN tag insertion bond_na_send() attempts to insert a VLAN tag in between building and sending packets of the respective formats. If the slave does not implement hardware VLAN tag insertion then vlan_put_tag() will mangle the network-layer header because the Ethernet header is not present at this point (unlike in bond_arp_send()). Fix this by adding the tag out-of-line and relying on dev_hard_start_xmit() to insert it inline if necessary. Signed-off-by: Ben Hutchings Signed-off-by: Jay Vosburgh Reviewed-by: Jesse Gross Signed-off-by: David S. Miller commit ffa95ed50f9fb2d8faaa6bd73086a7056ea46a06 Author: Ben Hutchings Date: Mon Dec 13 08:19:56 2010 +0000 bonding: Change active slave quietly when bond is down bond_change_active_slave() may be called when a slave is added, even if the bond has not been brought up yet. It may then attempt to send packets, and further it may use mcast_work which is uninitialised before the bond is brought up. Add the necessary checks for netif_running(bond->dev). Signed-off-by: Ben Hutchings Signed-off-by: Jay Vosburgh Signed-off-by: David S. Miller commit 8387451e558853f7b513790c0070e3b6f0c135aa Author: Ben Hutchings Date: Mon Dec 13 08:19:28 2010 +0000 bonding/vlan: Remove redundant VLAN tag insertion logic A bond may have a mixture of slave devices with and without hardware VLAN tag insertion capability. Therefore it always claims this capability and performs software VLAN tag insertion if the slave does not. Since commit 7b9c60903714bf0a19d746b228864bad3497284e, this has also been done by dev_hard_start_xmit(). The result is that VLAN- tagged skbs are now double-tagged when transmitted through slave devices without hardware VLAN tag insertion! Remove the now-redundant logic from bond_dev_queue_xmit(). Signed-off-by: Ben Hutchings Signed-off-by: Jay Vosburgh Reviewed-by: Jesse Gross Signed-off-by: David S. Miller commit 42dccd1f757d674a6604077a61d1577d1578c755 Author: Ken Kawasaki Date: Mon Dec 13 02:27:24 2010 +0000 axnet_cs: move id (0x1bf, 0x2328) to axnet_cs axnet_cs: Accton EN2328 or compatible (id: 0x01bf, 0x2328) uses Asix chip. So it works better with axnet_cs instead of pcnet_cs. Signed-off-by: Ken Kawasaki Signed-off-by: David S. Miller commit 45241e50e3e741ee2a148693888b48e90e806de9 Author: Hank Janssen Date: Mon Dec 13 16:23:36 2010 -0800 Staging: hv: Use only one txf buffer per channel and kmalloc/GFP_KERNEL on initialize Correct issue with not checking kmalloc return value. This fix now only uses one receive buffer for all hv_utils channels, and will do only one kmalloc on init and will return with a -ENOMEM if kmalloc fails on initialize. And properly clean up memory on failure. Thanks to Evgeniy Polyakov for pointing this out. And thanks to Jesper Juhl and Ky Srinivasan for suggesting a better implementation of my original patch. Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Reviewed-by: Jesper Juhl Cc: Evgeniy Polyakov Cc: Jesper Juhl Cc: Ky Srinivasan Signed-off-by: Greg Kroah-Hartman commit 244ba85606b567e6e990d2fac61e3bde5ff8f0ad Author: Timo Teräs Date: Wed Dec 15 20:48:10 2010 +0200 staging: hv: remove unneeded osd_schedule_callback No one calls it anymore, so remove it. Reviewed-By: Hank Janssen Cc: Haiyang Zhang Signed-off-by: Timo Teräs Signed-off-by: Greg Kroah-Hartman commit 4b2f9abea52af3782d349080fca5e189b0693792 Author: Timo Teräs Date: Wed Dec 15 20:48:09 2010 +0200 staging: hv: convert channel_mgmt.c to not call osd_schedule_callback The additional abstraction is unneeded. The three calls are assumed to not be pending simultaneously: - vmbus_onoffer queues work exactly once when a new channel is created, the channel is not attached to lists until the work is executed - vmbus_onoffer_rescind is received only when the channel is active it is enough to process the work once - free_channel is called exactly once when the channel is getting destroyed; I assumed that vmbus_process_rescind_offer cannot be pending while free_channel is called Reviewed-By: Hank Janssen Cc: Haiyang Zhang Signed-off-by: Timo Teräs Signed-off-by: Greg Kroah-Hartman commit bf6506f60c46c8a709df534408cc6d470df657ff Author: Timo Teräs Date: Wed Dec 15 20:48:08 2010 +0200 staging: hv: convert vmbus_on_msg_dpc to not call osd_schedule_callback The additional abstraction is unneeded. This also fixes a sleeping while atomic issue as osd_schedule_callback can sleep which is not allowed for vmbus_on_msg_dpc running in a tasklet. Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=16701 Reviewed-By: Hank Janssen Cc: Haiyang Zhang Signed-off-by: Timo Teräs Cc: stable Signed-off-by: Greg Kroah-Hartman commit d3052b557a1c94c21f50465702fa886753ce6b43 Author: Andrey Vagin Date: Sat Dec 11 15:20:11 2010 +0000 ipv6: delete expired route in ip6_pmtu_deliver The first big packets sent to a "low-MTU" client correctly triggers the creation of a temporary route containing the reduced MTU. But after the temporary route has expired, new ICMP6 "packet too big" will be sent, rt6_pmtu_discovery will find the previous EXPIRED route check that its mtu isn't bigger then in icmp packet and do nothing before the temporary route will not deleted by gc. I make the simple experiment: while :; do time ( dd if=/dev/zero bs=10K count=1 | ssh hostname dd of=/dev/null ) || break; done The "time" reports real 0m0.197s if a temporary route isn't expired, but it reports real 0m52.837s (!!!!) immediately after a temporare route has expired. Signed-off-by: Andrey Vagin Signed-off-by: David S. Miller commit f4528696d803749892eac27422a6fd7748cffee1 Author: Joe Perches Date: Tue Dec 14 12:51:52 2010 -0800 staging: brcm80211: Fix WL_ logging macros These macros use the equivalent of "#define WL_(x) printk x" which requires an extra level of parentheses. Convert the macros to use the normal WL_(fmt, args...) style and remove the extra parentheses from the uses. Add format argument verification using no_printk as appropriate. Couple of spelling typo fixes in the formats and argument alignment at the same time. Also coalesced long formats. Signed-off-by: Joe Perches Signed-off-by: Greg Kroah-Hartman commit af3e5bd5f650163c2e12297f572910a1af1b8236 Author: Hillf Danton Date: Fri Dec 10 18:54:11 2010 +0000 bonding: Fix slave selection bug. The returned slave is incorrect, if the net device under check is not charged yet by the master. Signed-off-by: Hillf Danton Signed-off-by: David S. Miller commit 12b9d5bf76bfa20d3207ef24fca9c8254a586a58 Author: Michael Hennerich Date: Tue Dec 14 17:04:02 2010 +0100 Staging: IIO: DDS: AD9833 / AD9834 driver Changes since RFC/v1: IIO: Apply list review feedback Apply list review feedback: Rename attributes to fit IIO convention used in other drivers. Fix typos. Provide ddsX_out_enable as opposed to ddsX_out_disable. Use proper __devexit marking. Use strict_strtoul() to avoid negatives. Changes since v2: IIO: ad9834.c: Apply more list review feedback Update use of dds convenience macros. Fix tabbing. Remove superfluous brackets. Keep output disabled after probe. Remove unnecessary code. Signed-off-by: Michael Hennerich Reviewed-by: Datta Shubhrajyoti Acked-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit 4851d97d87c8dfa8c97037965690cdefe99a767d Author: Michael Hennerich Date: Tue Dec 14 17:04:01 2010 +0100 Staging: IIO: dds.h convenience macros Changes since RFC/v1: IIO: Apply list review feedback Apply list review feedback: Rename attributes to fit IIO convention used in other drivers. Provide ddsX_out_enable as opposed to ddsX_out_disable. Fix typos. Changes since v2: IIO: dds.h: Apply more list review feedback Fix mixture of X and [n] notation for indices. Remove duplicated descriptions. Add store methods to some dds convenience macros. Signed-off-by: Michael Hennerich Reviewed-by: Jonathan Cameron Acked-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit f8ce33bbd57a0c9c302ebb273fd963c5efb1a264 Author: Michael Hennerich Date: Tue Dec 14 17:04:00 2010 +0100 Staging: IIO: Direct digital synthesis abi documentation Changes since RFC/v1: IIO: Apply list review feedback: Apply list review feedback: Restructure documentation according to list feedback. Rename attributes to fit IIO convention used in other drivers. Fix typos. Provide ddsX_out_enable as opposed to ddsX_out_disable Changes since v2: IIO: sysfs-bus-iio-dds: Apply more list review feedback Fix mixture of X and [n] notation for indices. Fix some wording in the descriptions. Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit 8a09d6d80c90c02f2f8c89f69c702cab0c8d9b42 Author: Larry Finger Date: Thu Dec 16 11:13:57 2010 -0600 rtlwifi: Switch locking from semaphores to mutexes Signed-off-by: Larry Finger Signed-off-by: John W. Linville commit 3cf0c8ad94ba1ba241b970cd19c11a4f3cea93c2 Author: Larry Finger Date: Thu Dec 16 09:13:21 2010 -0600 rtl8192ce: Update MAINTAINERS Signed-off-by: Larry Finger Signed-off-by: John W. Linville commit f15a4bb2637253680f09f0161d51e22446b6478f Author: Bruno Randolf Date: Thu Dec 16 16:22:20 2010 +0900 ath5k: Fix survey The old survey implementation was broken and returned nonsense data. Clear cycle counters and survey data on reset. Since the cycle counters easily overflow it's better to keep a local version of collected survey data (in ms resolution, instead of clockrate) and update this every time survey is retrieved. If survey is retrieved often enough to avoid cycle counter overflows this works fine, otherwise we could update survey more often, like ath9k does. Still only the survey for the current channel is kept. Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit 4aea248dd7a67097d683a97f94a0aeaf0d248f3f Author: Larry Finger Date: Wed Dec 15 22:55:34 2010 -0600 rtl8192ce: Fix build on powerpc After merge of the rtl8192ce driver, a powerpc build fails with: drivers/net/wireless/rtlwifi/rtl8192ce/rtl8192c-sw.c: In function 'rtl92c_init_sw_vars': drivers/net/wireless/rtlwifi/rtl8192ce/rtl8192c-sw.c:76: error: implicit declaration of function 'vmalloc' drivers/net/wireless/rtlwifi/rtl8192ce/rtl8192c-sw.c:76: warning: cast to pointer from integer of different size drivers/net/wireless/rtlwifi/rtl8192ce/rtl8192c-sw.c: In function 'rtl92c_deinit_sw_vars': drivers/net/wireless/rtlwifi/rtl8192ce/rtl8192c-sw.c:91: error: implicit declaration of function 'vfree' The problem is fixed by explicitly including the appropriate header. Signed-off-by: Larry Finger Signed-off-by: John W. Linville commit 931299cf87701962ea1811dc216f48f3f7a4ebc8 Author: Luis R. Rodriguez Date: Wed Dec 15 19:24:12 2010 -0800 ath: fix NULL pointer dereference on reg_notifier() The reg_notifier() was recently updated as being capable of having the request passed as NULL, fix ath to follow this API change. Without this we end up oopsing: BUG: unable to handle kernel NULL pointer dereference at 0000000000000004 IP: [] ath_reg_notifier_apply+0x5b/0xa0 [ath] PGD b4c4c067 PUD b4c4d067 PMD 0 Oops: 0000 [#1] SMP DEBUG_PAGEALLOC last sysfs file: /sys/devices/pci0000:00/0000:00:1b.0/uevent CPU 1 Modules linked in: Pid: 436, comm: modprobe Not tainted 2.6.37-rc5-wl+ #36 6460DWU/6460DWU RIP: 0010:[] [] ath_reg_notifier_apply+0x5b/0xa0 [ath] RSP: 0018:ffff8800b6f6baa8 EFLAGS: 00010246 RAX: ffff8800b527b254 RBX: ffff8800b532c180 RCX: 0000000000000018 RDX: ffff8800b530c108 RSI: 0000000000000000 RDI: ffff8800b532c180 RBP: ffff8800b6f6baa8 R08: ffff8800b532f268 R09: 0000000000000235 R10: 00000000000016ad R11: 0000000000000018 R12: 0000000000000000 R13: 0000000000000016 R14: ffff8800b532f268 R15: 0000000000000011 FS: 00007f0c53104700(0000) GS:ffff8800bed00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b CR2: 0000000000000004 CR3: 00000000b6531000 CR4: 00000000000006e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Process modprobe (pid: 436, threadinfo ffff8800b6f6a000, task ffff8800b404dc40) Stack: ffff8800b6f6bac8 ffffffffa03ea651 ffff8800b532c180 ffff8800b527b254 ffff8800b6f6bb38 ffffffffa01835ca ffffffffa019ed00 00000000a019ed80 0000000000000002 ffff880000000002 ffffffffa0366140 0000000010aee572 Call Trace: [] ath9k_reg_notifier+0x41/0x50 [ath9k] [] wiphy_update_regulatory+0x4ba/0x5a0 [cfg80211] [] ? ieee80211_register_hw+0xa0/0x5b0 [mac80211] [] ? ieee80211_register_hw+0xa0/0x5b0 [mac80211] [] wiphy_register+0x1d4/0x360 [cfg80211] [] ? __kmalloc+0x108/0x1c0 [] ieee80211_register_hw+0x183/0x5b0 [mac80211] [] ath9k_init_device+0x66b/0x850 [ath9k] [] ath_pci_probe+0x2f6/0x3c0 [ath9k] [] ? default_spin_lock_flags+0x9/0x10 [] local_pci_probe+0x5f/0xd0 [] pci_device_probe+0x101/0x120 [] ? driver_sysfs_add+0x7a/0xb0 [] driver_probe_device+0x96/0x1c0 [] __driver_attach+0x9b/0xa0 [] ? __driver_attach+0x0/0xa0 [] bus_for_each_dev+0x68/0x90 [] driver_attach+0x1e/0x20 [] bus_add_driver+0xe9/0x290 [] ? ath9k_init+0x0/0x4d [ath9k] [] driver_register+0x80/0x150 [] ? ath9k_init+0x0/0x4d [ath9k] [] ? ath9k_init+0x0/0x4d [ath9k] [] __pci_register_driver+0x56/0xd0 [] ath_pci_init+0x23/0x30 [ath9k] [] ath9k_init+0x2b/0x4d [ath9k] [] do_one_initcall+0x43/0x190 [] sys_init_module+0xbb/0x200 [] system_call_fastpath+0x16/0x1b Code: RIP [] ath_reg_notifier_apply+0x5b/0xa0 [ath] RSP CR2: 0000000000000004 ---[ end trace 6d03d3c7eda9f06b ]--- Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit 2784fe915cd25adf23ea28534019308d8a144721 Author: Luis R. Rodriguez Date: Wed Dec 15 19:24:11 2010 -0800 cfg80211: fix null pointer dereference with a custom regulatory request Once we moved the core regulatory request to the queue and let the scheduler process it last_request will have been left NULL until the schedular decides to process the first request. When this happens and we are loading a driver with a custom regulatory request like all Atheros drivers we end up with a NULL pointer dereference. We fix this by checking if the request was a custom one. BUG: unable to handle kernel NULL pointer dereference at 0000000000000004 IP: [] freq_reg_info_regd.clone.2+0x27/0x130 [cfg80211] PGD 71f91067 PUD 712b2067 PMD 0 Oops: 0000 [#1] PREEMPT SMP last sysfs file: /sys/devices/pci0000:00/0000:00:1d.7/usb2/2-1/firmware/2-1/loading CPU 0 Modules linked in: ath9k_htc(+) ath9k_common ath9k_hw ath Pid: 3094, comm: insmod Tainted: G W 2.6.37-rc5-wl #16 INVALID/28427ZQ RIP: 0010:[] [] freq_reg_info_regd.clone.2+0x27/0x130 [cfg80211] RSP: 0018:ffff88007045db78 EFLAGS: 00010282 RAX: 0000000000000000 RBX: ffffffffa047d9a0 RCX: ffff88007045dbd0 RDX: 0000000000004e20 RSI: 000000000024cde0 RDI: ffff8800700483e0 RBP: ffff88007045db98 R08: ffffffffa02f5b40 R09: 0000000000000001 R10: 000000000000000e R11: 0000000000000001 R12: 0000000000000000 R13: ffff88007004e3b0 R14: 0000000000000000 R15: ffff880070048340 FS: 00007f635a707700(0000) GS:ffff880077400000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b CR2: 0000000000000004 CR3: 00000000708a9000 CR4: 00000000000006f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Process insmod (pid: 3094, threadinfo ffff88007045c000, task ffff8800713e3ec0) Stack: ffffffffa047d9a0 0000000000000000 ffff88007004e3b0 0000000000000000 ffff88007045dc08 ffffffffa016e147 000000007045dc08 0000000000000002 ffff8800700483e0 ffffffffa02f5b40 ffff88007045dbd8 0000000000000000 Call Trace: [] wiphy_apply_custom_regulatory+0x137/0x1d0 [cfg80211] [] ? ath9k_reg_notifier+0x0/0x50 [ath9k_htc] [] ath_regd_init+0x347/0x430 [ath] [] ath9k_htc_probe_device+0x6c5/0x960 [ath9k_htc] [] ath9k_htc_hw_init+0xc/0x30 [ath9k_htc] [] ath9k_hif_usb_probe+0x216/0x3b0 [ath9k_htc] [] usb_probe_interface+0x10c/0x210 [usbcore] [] driver_probe_device+0x96/0x1c0 [] __driver_attach+0xa3/0xb0 [] ? __driver_attach+0x0/0xb0 [] bus_for_each_dev+0x5e/0x90 [] driver_attach+0x19/0x20 [] bus_add_driver+0x168/0x320 [] driver_register+0x71/0x140 [] ? __raw_spin_lock_init+0x38/0x70 [] usb_register_driver+0xdc/0x190 [usbcore] [] ? ath9k_htc_init+0x0/0x4f [ath9k_htc] [] ath9k_hif_usb_init+0x1e/0x20 [ath9k_htc] [] ath9k_htc_init+0x2b/0x4f [ath9k_htc] [] do_one_initcall+0x3f/0x180 [] sys_init_module+0xbb/0x200 [] system_call_fastpath+0x16/0x1b Code: RIP [] freq_reg_info_regd.clone.2+0x27/0x130 [cfg80211] RSP CR2: 0000000000000004 ---[ end trace 79e4193601c8b713 ]--- Reported-by: Sujith Manoharan Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit 45ef6a0bcc9cd8f13004789ec6decb52e1d3045c Author: Vasanthakumar Thiagarajan Date: Wed Dec 15 07:30:53 2010 -0800 ath9k_hw: Configure appropriate Tx power when PAPRD fails Target Tx power available in eeprom is for PAPRD. If PAPRD fails, paprd scale factor needs to be detected from this target tx power. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 7072bf62fb7abe5a91389d6271da520f29c79326 Author: Vasanthakumar Thiagarajan Date: Wed Dec 15 07:30:52 2010 -0800 ath9k_hw: Disable PAPRD for rates with low Tx power When the drop in Tx power for a particular mcs rate exceeds the paprd scale factor, paprd may not work properly. Disable paprd for any such rates. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 8698bca6b53d1f6641850b270de9c953078ed1ce Author: Vasanthakumar Thiagarajan Date: Wed Dec 15 07:30:51 2010 -0800 ath9k_hw: Add a helper to get paprd scale factor Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 0b2084bc578128be866d6fc9926ed887c3432bb1 Author: Vasanthakumar Thiagarajan Date: Wed Dec 15 07:30:50 2010 -0800 ath9k_hw: Tx IQ cal changes for AR9003 Add multiple Tx IQ cal support to improve EVM accross different power levels. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 895ad7eb21ed228444169dbbff44f3dccfc7e006 Author: Vasanthakumar Thiagarajan Date: Wed Dec 15 07:30:49 2010 -0800 ath9k_hw: Move get_streams() to hw.h This helper can be used in multiple places. Also make it inline returning u8. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit d8a8440e3f1f0cdd23074c6d2d8cbbde204a4374 Author: Vasanthakumar Thiagarajan Date: Wed Dec 15 07:30:48 2010 -0800 ath9k_hw: Remove unnecessary Rx IQ cal register configuration in ar9003_hw_tx_iq_cal() Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 7e68b746681289c00e8fd818fdd0144c6896d425 Author: Vasanthakumar Thiagarajan Date: Wed Dec 15 07:30:47 2010 -0800 ath9k_hw: Remove delay during regwrite of analog shift registers This is not needed for AR9003. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit cf4e594ea7e55555e81647b74a3a8e8b2826a529 Author: Jouni Malinen Date: Thu Dec 16 00:52:40 2010 +0200 nl80211: Add notification for dropped Deauth/Disassoc Add a new notification to indicate that a received, unprotected Deauthentication or Disassociation frame was dropped due to management frame protection being in use. This notification is needed to allow user space (e.g., wpa_supplicant) to implement SA Query procedure to recover from association state mismatch between an AP and STA. This is needed to avoid getting stuck in non-working state when MFP (IEEE 802.11w) is used and a protected Deauthentication or Disassociation frame is dropped for any reason. After that, the station would silently discard any unprotected Deauthentication or Disassociation frame that could be indicating that the AP does not have association for the STA (when the Reason Code would be 6 or 7). IEEE Std 802.11w-2009, 11.13 describes this recovery mechanism. Signed-off-by: Jouni Malinen Signed-off-by: John W. Linville commit 5928b91acae97622a6f2e679eb7a9f19bed68e3e Merge: 7d5f01ad536afebde9a1c81d985f8d0eaf2a9ab6 248daa084cee4b212ff4408e9c9b05b3bdc0da0d Author: John W. Linville Date: Thu Dec 16 15:21:33 2010 -0500 Merge branch 'wl12xx-next' of git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx commit fcbdbed01633bac6271708d86d569e06ed3e4c34 Author: Joe Perches Date: Mon Dec 13 16:57:04 2010 -0800 staging: brcm80211: Convert ETHER_TYPE_802_1X to ETH_P_PAE Remove now unused #define. Signed-off-by: Joe Perches Acked-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit d7ec915abc98795a4cb88e369e2918696dd0ea01 Author: Joe Perches Date: Mon Dec 13 16:57:03 2010 -0800 staging: brcm80211: Remove unused ETHER_TYPE_ #defines Signed-off-by: Joe Perches Acked-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit d659a3ec838866482779f594c4520f553468c492 Author: Joe Perches Date: Mon Dec 13 16:57:02 2010 -0800 staging: brcm80211: Remove ETHER_HDR_LEN, use ETH_HLEN Signed-off-by: Joe Perches Acked-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit b8d6307894a73a10be6395b8ed3ffb3cb9255f9d Author: Joe Perches Date: Mon Dec 13 16:57:01 2010 -0800 staging: brcm80211: Convert ETHER_ADDR_LEN to ETH_ALEN Add an #include of to include/proto/ethernet.h Convert ETHER_ADDR_LEN, remove the #define for ETHER_ADDR_LEN. Signed-off-by: Joe Perches Acked-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit ed9568687e82c56017ca1aacf6eda9902939bf4a Author: Joe Perches Date: Mon Dec 13 16:57:00 2010 -0800 staging: brcm80211: Convert ETHER_IS to is__ether_addr Use the normal kernel calls and remove the #defines for ETHER_IS_BCAST and ETHER_IS_NULLADDR. Add #include for etherdevice.h where necessary. Signed-off-by: Joe Perches Acked-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit 47c6de7d37619d105de0367aece9ab10288225bc Author: Joe Perches Date: Mon Dec 13 16:56:59 2010 -0800 staging: brcm80211: Remove unused ether_ #defines and struct These are unused, just remove them. Signed-off-by: Joe Perches Acked-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit 3ca5ada504a41d9a8afd1e25f85f11d1761efa5f Author: Joe Perches Date: Mon Dec 13 16:56:58 2010 -0800 staging: brcm80211: Convert ETHER_IS_MULTI to is_multicast_ether_addr Use the standard kernel function. Change callers to add .octet to addressing to avoid warnings. Add #include where necessary. Signed-off-by: Joe Perches Acked-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit ee417a79567030ce726e9627aa52779e47c49ff0 Author: Joe Perches Date: Mon Dec 13 16:56:57 2010 -0800 staging: brcm80211: Remove unused #defines ETHER__LOCALADDR Signed-off-by: Joe Perches Acked-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit c9c62f4e2c9b526c5cbade3f3a61f126e6587c16 Author: Xenofon Foukas Date: Wed Dec 15 19:44:20 2010 +0200 Staging: comedi: Fix checkpatch.pl issues in file s526.c This patch fixes the following issues in s526.c: WARNING: printk() should include KERN_ facility level WARNING: line over 80 characters ERROR: do not use C99 // comments WARNING: space prohibited between function name and open parenthesis '(' WARNING: braces {} are not necessary for any arm of this statement WARNING: suspect code indent for conditional statements (16, 16) Signed-off-by: Xenofon Foukas Signed-off-by: Greg Kroah-Hartman commit 3555a4c35e59c0217983f5df0cfe39a9fa65c2df Author: Xenofon Foukas Date: Wed Dec 15 00:14:30 2010 +0200 Staging: comedi: Fix coding style issues in ii_pci20kc.c This patch fixes the following issues in file ii_pci20kc.c: WARNING: please, no space before tabs WARNING: unnecessary whitespace before a quoted newline WARNING: line over 80 characters Signed-off-by: Xenofon Foukas Signed-off-by: Greg Kroah-Hartman commit 91cda632ebc6ea84fd7a45efb6d4452c34985731 Author: Marek Belisko Date: Tue Dec 14 14:02:55 2010 +0100 staging: ft1000: Fix kernel panic when use ioctl. During ioctl testing was observed kernel panic beuase file->private_data pointer was not correctly set when debugfs file was created. Add correct pointer setup. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 0ce72ea3b2f29e5755b095a5b217b9bab8386a03 Author: Marek Belisko Date: Tue Dec 14 14:02:54 2010 +0100 staging: ft1000: Fix camelcase variable names. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit c346541f3d8c6e90b6aadc0511c27a6de15fdee5 Author: Marek Belisko Date: Tue Dec 14 09:42:28 2010 +0100 staging: ft1000: Rename ft1000_chdev.c to ft1000_debug.c. Name of old file was misleading because it is currently updated to debugfs so change also file name. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit dab56ffe9acc59a6cbe8f857a95adf75f42970b9 Author: Marek Belisko Date: Tue Dec 14 09:42:27 2010 +0100 staging: ft1000: Fix camelcase function names. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 8c3d90921604951e306a898669c46a88578c5848 Author: L. Alberto GimĂ©nez Date: Tue Dec 14 02:01:55 2010 +0100 Staging: rt2860: Sanitize DBGPRINT_ERR macro Cleaner implementation. Avoids the need of the double parenthesis to call the macro. Signed-off-by: L. Alberto GimĂ©nez Signed-off-by: Greg Kroah-Hartman commit 3be305fd7c0d07cdbb175467b4fe706ea10eb732 Author: L. Alberto GimĂ©nez Date: Tue Dec 14 02:01:54 2010 +0100 Staging: rt2860: include KERN_* in printk Fix checkpatch complains. Signed-off-by: L. Alberto GimĂ©nez Signed-off-by: Greg Kroah-Hartman commit c9bace7ca1e2aeb95754ebc92c8f88a9f215691d Author: David Daney Date: Mon Oct 11 14:52:45 2010 -0700 MIPS: Add a CONFIG_FORCE_MAX_ZONEORDER Kconfig option. For huge page support with base page size of 16K or 32K, we have to increase the MAX_ORDER so that huge pages can be allocated. [Ralf: I don't think a user should have to configure obscure constants like this but for the time being this will have to suffice.] Signed-off-by: David Daney To: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/1685/ Signed-off-by: Ralf Baechle commit 82b89152f00f7ad17844d5614d5011e8d7944ac9 Author: Maciej W. Rozycki Date: Sun Oct 10 10:42:12 2010 +0100 MIPS: LD/SD o32 macro GAS fix update I am about to commit: http://sourceware.org/ml/binutils/2010-10/msg00033.html that fixes a problem with the LD/SD macro currently implemented by GAS for the o32 ABI in an inconsistent way. This is best illustrated with a simple program, which I'm copying here from the message above for easier reference: $ cat ld.s ld $5,32767($4) ld $5,32768($4) This gets assebled into the following output: $ mips-linux-as -32 -mips3 -o ld.o ld.s $ mips-linux-objdump -d ld.o ld.o: file format elf32-tradbigmips Disassembly of section .text: 00000000 <.text>: 0: dc857fff ld a1,32767(a0) 4: 3c010001 lui at,0x1 8: 00810821 addu at,a0,at c: 8c258000 lw a1,-32768(at) 10: 8c268004 lw a2,-32764(at) ... Oops! The GAS fix makes the macro behave in a consistent way and pairs of LW/SW instructions to be output as appropriate regardless of the size of the offset associated with the address used. The machine instruction is still available, but to reach it macros have to be disabled first. This has a side effect of requiring the use of a machine-addressable memory operand. As some platforms require 64-bit operations for accesses to some I/O registers LD/SD instructions are used in a couple of places in Linux regardless of the ABI selected. Here's a fix for some pieces of code affected I've been able to track down. The fix should be backwards compatible with all supported binutils releases in existence and can be used as a reference for any other places or off-tree code. The use of the "R" constraint guarantees a machine-addressable operand. Signed-off-by: Maciej W. Rozycki Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/1680/ Signed-off-by: Ralf Baechle commit cf745a39dcb10ef80c4a2ff38448f57b69d4c4eb Author: Manuel Lauss Date: Mon Oct 25 18:44:11 2010 +0200 MIPS: Alchemy: fix build with SERIAL_8250=n In commit 7d172bfe ("Alchemy: Add UART PM methods") I introduced platform PM methods which call a function of the 8250 driver; this patch works around link failures when the kernel is built without 8250 support. Signed-off-by: Manuel Lauss To: Linux-MIPS Patchwork: https://patchwork.linux-mips.org/patch/1737/ Signed-off-by: Ralf Baechle commit a3aad4aaf871045ab1dd9c99be6c1ace881d8eb0 Author: Ralf Baechle Date: Thu Dec 9 19:14:09 2010 +0000 MIPS: Rename mips_dma_cache_sync back to dma_cache_sync This fixes IP22 and IP28 build errors. Signed-off-by: Ralf Baechle commit d002aaadf84c081623a0a8502c122d1492fbd47c Author: Ralf Baechle Date: Wed Dec 1 17:33:17 2010 +0000 MIPS: MT: Fix typo in comment. Signed-off-by: Ralf Baechle commit 3f84622d7c7818077f5e6cf4b8a0d1b10dc65147 Author: Hauke Mehrtens Date: Sat Nov 27 19:26:32 2010 +0100 SSB: Fix nvram_get on BCM47xx platform The nvram_get function was never in the mainline kernel, it only existed in an external OpenWrt patch. Use nvram_getenv function, which is in mainline and use an include instead of an extra function declaration. et0macaddr contains the mac address in text from like 00:11:22:33:44:55. We have to parse it before adding it into macaddr. nvram_parse_macaddr will be merged into asm/mach-bcm47xx/nvram.h through the MIPS git tree and will be available soon. It will not build now without nvram_parse_macaddr, but it hasn't before either. Signed-off-by: Hauke Mehrtens To: linux-mips@linux-mips.org Cc: mb@bu3sch.de Cc: netdev@vger.kernel.org Cc: Hauke Mehrtens Acked-by: Michael Buesch Patchwork: https://patchwork.linux-mips.org/patch/1849/ Signed-off-by: Ralf Baechle commit 1690a7f9ab83f5c823f3044275a4a771a059d5bb Author: Hauke Mehrtens Date: Sat Nov 27 17:46:01 2010 +0100 MIPS: BCM47xx: Swap serial console if ttyS1 was specified. Some devices like the Netgear WGT634U are using ttyS1 for default console output. We should switch to that console if it was given in the kernel_args parameters. Signed-off-by: Hauke Mehrtens To: linux-mips@linux-mips.org Cc: Hauke Mehrtens Patchwork: https://patchwork.linux-mips.org/patch/1848/ Signed-off-by: Ralf Baechle commit 59833fcf48ee7b7c8a01e590aa7b7212305c3077 Author: Hauke Mehrtens Date: Sat Nov 27 17:46:00 2010 +0100 MIPS: BCM47xx: Use sscanf for parsing mac address Instead of writing own function for parsing the mac address we now use sscanf. Signed-off-by: Hauke Mehrtens To: linux-mips@linux-mips.org Cc: Hauke Mehrtens Patchwork: https://patchwork.linux-mips.org/patch/1847/ Signed-off-by: Ralf Baechle commit 2aa088d6fd8a6c6e6020ea46b70141f0b7ccf5d2 Author: Hauke Mehrtens Date: Sat Nov 27 17:45:59 2010 +0100 MIPS: BCM47xx: Fill values for b43 into SSB sprom Fill the sprom with all available values from the nvram. Most of these new values are needed for the b43 or b43legacy driver. Parts of this patch have been in OpenWRT for a long time and were written by Michael Buesch. Signed-off-by: Hauke Mehrtens To: linux-mips@linux-mips.org Cc: Hauke Mehrtens Patchwork: https://patchwork.linux-mips.org/patch/1846/ Signed-off-by: Ralf Baechle commit 825710843640dd173bc4b2ea99f1296923e4aa06 Author: Hauke Mehrtens Date: Sat Nov 27 17:45:58 2010 +0100 MIPS: BCM47xx: Do not read config from CFE The config options read out here are not stored in CFE but only in NVRAM on the devices. Remove reading from CFE and only access the NVRAM. Reading out CFE does not harm but is useless here. Signed-off-by: Hauke Mehrtens To: linux-mips@linux-mips.org Cc: Hauke Mehrtens Patchwork: https://patchwork.linux-mips.org/patch/1845/ Signed-off-by: Ralf Baechle commit e31fee7c3a197d88d1d0ced0e8600386da27fec4 Author: Thomas Chou Date: Wed Nov 24 15:35:48 2010 +0800 MIPS: FDT size is a be32 The totalsize field was be32. And the reserve bootmem would cause failure. Signed-off-by: Thomas Chou To: devicetree-discuss@lists.ozlabs.org Cc: linux-kernel@vger.kernel.org Cc: linux-mips@linux-mips.org Cc: grant.likely@secretlab.ca Cc: David Daney Cc: Dezhong Diao Patchwork: https://patchwork.linux-mips.org/patch/1838/ Signed-off-by: Ralf Baechle commit 5878fc936aebf592cca418ca50773cd578f7daf4 Author: Kevin Cernekee Date: Tue Nov 23 10:26:44 2010 -0800 MIPS: Fix CP0 COUNTER clockevent race Consider the following test case: write_c0_compare(read_c0_count()); Even if the counter doesn't increment during execution, this might not generate an interrupt until the counter wraps around. The CPU may perform the comparison each time CP0 COUNT increments, not when CP0 COMPARE is written. If mips_next_event() is called with a very small delta, and CP0 COUNT increments during the calculation of "cnt += delta", it is possible that CP0 COMPARE will be written with the current value of CP0 COUNT. If this is detected, the function should return -ETIME, to indicate that the interrupt might not have actually gotten scheduled. Signed-off-by: Kevin Cernekee Cc: linux-mips@linux-mips.org Cc: linux-kernel@vger.kernel.org Patchwork: https://patchwork.linux-mips.org/patch/1836/ Signed-off-by: Ralf Baechle commit 190fca3e40a65303eac35ac4fbae4f1f1342431c Author: Kevin Cernekee Date: Tue Nov 23 10:26:45 2010 -0800 MIPS: Fix regression on BCM4710 processor detection BCM4710 uses the BMIPS32 core (like BCM6345), not the MIPS 4Kc core as was previously believed. Signed-off-by: Kevin Cernekee Tested-by: Alexandros C. Couloumbis Patchwork: https://patchwork.linux-mips.org/patch/1837/ Signed-off-by: Ralf Baechle commit 4afdea81821880d0fc35e6c7ff54eeed9ec0614d Author: Lars-Peter Clausen Date: Thu Nov 11 19:08:52 2010 +0100 MIPS: JZ4740: Fix pcm device name As part the ASoC multi-component patch (commit f0fba2ad) the jz4740 pcm driver was renamed to 'jz4740-pcm-audio'. Adjust the device name accordingly. Signed-off-by: Lars-Peter Clausen Cc: linux-mips@linux-mips.org Cc: linux-kernel@vger.kernel.org Patchwork: https://patchwork.linux-mips.org/patch/1770/ Signed-off-by: Ralf Baechle commit e5674ad6ca9f1020c2bcc009a55becba3c30d8a3 Author: Tony Wu Date: Wed Nov 10 21:48:15 2010 +0800 MIPS: Separate two consecutive loads in memset.S partial_fixup is used in noreorder block. Separating two consecutive loads can save one cycle on processors with GPR intrelock and can fix load-use on processors that need a load delay slot. Also do so for fwd_fixup. [Ralf: Only R2000/R3000 class processors are lacking the the load-user interlock and even some of those got it retrofitted. With R2000/R3000 being fairly uncommon these days the impact of this bug should be minor.] Signed-off-by: Tony Wu To: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/1768/ Signed-off-by: Ralf Baechle commit 515b029d005b5694cf612a0a5ca6f861a7e45362 Author: David Daney Date: Thu Oct 21 16:32:26 2010 -0700 MIPS: Send proper signal and siginfo on FP emulator faults. We were unconditionally sending SIGBUS with an empty siginfo on FP emulator faults. This differs from what happens when real floating point hardware would get a fault. For most faults we need to send SIGSEGV with the faulting address filled in in the struct siginfo. Reported-by: Camm Maguire Signed-off-by: David Daney To: linux-mips@linux-mips.org Cc: Camm Maguire Patchwork: https://patchwork.linux-mips.org/patch/1727/ Signed-off-by: Ralf Baechle commit 0bc6791707694c77b3543de39f77972a65de917a Author: Florian Fainelli Date: Sun Oct 31 23:49:58 2010 +0100 MIPS: AR7: Fix loops per jiffies on TNETD7200 devices TNETD7200 run their CPU clock faster than the default CPU clock we assume. In order to have the correct loops per jiffies settings, initialize clocks right before setting mips_hpt_frequency. As a side effect, we can no longer use msleep in clocks.c which requires other parts of the kernel to be initialized, so replace these with mdelay. Signed-off-by: Florian Fainelli To: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/1749/ Signed-off-by: Ralf Baechle commit ff42d62047e45075c54a5543bd4f110dfd032d11 Author: Florian Fainelli Date: Sun Oct 31 23:49:57 2010 +0100 MIPS: AR7: Fix double ar7_gpio_init declaration Signed-off-by: Florian Fainelli To: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/1748/ Signed-off-by: Ralf Baechle commit 3bd27e329ca80f4946efdd12bf1f5a9bf0886e76 Author: David Daney Date: Fri Nov 5 15:12:48 2010 -0700 MIPS: Rework GENERIC_HARDIRQS Kconfig. Recent changes to CONFIG_GENERIC_HARDIRQS have caused us to start getting: warning: (SMP && SYS_SUPPORTS_SMP) selects IRQ_PER_CPU which has unmet direct dependencies (HAVE_GENERIC_HARDIRQS) Rearranging our Kconfig quiets the message. Signed-off-by: David Daney To: linux-mips@linux-mips.org Cc: Thomas Gleixner Patchwork: https://patchwork.linux-mips.org/patch/1757/ Signed-off-by: Ralf Baechle commit 690ca2ce0c824e8d3da7b2e273c2c873ab96d1e6 Author: Yoichi Yuasa Date: Mon Nov 8 17:23:52 2010 +0900 MIPS: Alchemy: Add return value check for strict_strtoul() arch/mips/alchemy/devboards/prom.c: In function 'prom_init': arch/mips/alchemy/devboards/prom.c:60: error: ignoring return value of 'strict_strtoul', declared with attribute warn_unused_result Signed-off-by: Yoichi Yuasa Cc: linux-mips Patchwork: https://patchwork.linux-mips.org/patch/1761/ Signed-off-by: Ralf Baechle commit ec79812580e360081b58c3e2e8b5b69b8080b5a0 Author: Wu Zhangjin Date: Mon Nov 8 21:25:24 2010 +0800 MIPS: Loongson: Add return value check for strict_strtoul() cc1: warnings being treated as errors arch/mips/loongson/common/env.c: In function 'prom_init_env': arch/mips/loongson/common/env.c:49: error: ignoring return value of 'strict_strtol', declared with attribute warn_unused_result arch/mips/loongson/common/env.c:50: error: ignoring return value of 'strict_strtol', declared with attribute warn_unused_result arch/mips/loongson/common/env.c:51: error: ignoring return value of 'strict_strtol', declared with attribute warn_unused_result arch/mips/loongson/common/env.c:52: error: ignoring return value of 'strict_strtol', declared with attribute warn_unused_result Signed-off-by: Wu Zhangjin Cc: linux-mips Patchwork: https://patchwork.linux-mips.org/patch/1762/ Signed-off-by: Ralf Baechle commit 863abad4f644b6c12bc8176206b35fa7e7cfe1a9 Author: Jesper Juhl Date: Sat Oct 30 18:37:16 2010 +0200 MIPS: VPE loader: Check vmalloc return value in vpe_open The return value of the vmalloc() call in arch/mips/kernel/vpe.c::vpe_open() is not checked, so we potentially store a null pointer in v->pbuffer. Add a check for a null return and then return -ENOMEM in that case. [Ralf: The check added by Jesper's original patch is where it logically should be. Adding it eleminated the need for the checks in a few other places, so I removed them. There still is a zillion of other things that need to be fixed in this file / API.] Signed-off-by: Jesper Juhl Cc: linux-mips@linux-mips.org Cc: linux-kernel@vger.kernel.org Patchwork: https://patchwork.linux-mips.org/patch/1747/ Signed-off-by: Ralf Baechle commit d62c9ced7ca783e64ff4d9d3d1340cfe2284d47b Author: David Daney Date: Mon Nov 1 17:43:08 2010 -0700 MIPS: compat: Don't clobber personality bits in 32-bit sys_personality(). If PER_LINUX32 has been set on a 32-bit kernel, only twiddle with the low-order personality bits, let the upper bits pass through. Signed-off-by: David Daney To: linux-mips@linux-mips.org Cc: Camm Maguire Patchwork: https://patchwork.linux-mips.org/patch/1751/ Signed-off-by: Ralf Baechle commit 1c0d52b9b5e6ca277c13d6fece9c34ed3159423d Author: David Daney Date: Mon Nov 1 17:43:07 2010 -0700 MIPS: Don't clobber personality high bits. The high bits of current->personality carry settings that we don't want to clobber on each exec. Only clobber them if the lower bits that indicate either PER_LINUX or PER_LINUX32 are invalid. The clobbering prevents us from using useful bits like ADDR_NO_RANDOMIZE. Reported-by: Camm Maguire Signed-off-by: David Daney Cc: Camm Maguire Patchwork: https://patchwork.linux-mips.org/patch/1750/ Signed-off-by: Ralf Baechle commit 1d210386f6ef9000b1cd723cf453c5eb0377e722 Author: Lars-Peter Clausen Date: Thu Nov 4 23:25:57 2010 +0100 MIPS: jz4740: Fix section mismatch in prom.c This patch fixes the following section mismatch: WARNING: arch/mips/built-in.o(.text+0xc): Section mismatch in reference from the function jz4740_init_cmdline() to the variable .init.data:arcs_cmdline While were at it, make jz4740_init_cmdline static as well. Signed-off-by: Lars-Peter Clausen Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/1755/ Signed-off-by: Ralf Baechle commit fe749aab1d21cbb4d87527a7df8799583c233496 Author: Lars-Peter Clausen Date: Thu Nov 4 23:25:56 2010 +0100 MIPS: jz4740: qi_lb60: Fix gpio for the 6th row of the keyboard matrix This patch fixes the gpio number for the 6th row of the keyboard matrix. (And fixes a typo in my name...) Signed-off-by: Lars-Peter Clausen Cc: linux-mips@linux-mips.org Cc: stable@kernel.org Signed-off-by: https://patchwork.linux-mips.org/patch/1754/ Signed-off-by: Ralf Baechle commit a989ff898f9740651d00388c33bdf4f2a7914920 Author: Al Viro Date: Thu Nov 4 11:13:59 2010 +0000 MIPS: Don't stomp on caller's ->regs[2] in copy_thread() We never needed that (->regs[2] is overwritten on return from syscall paths with return value of syscall, so storing it there early made no sense) and with new restart logics since d27240bf7e61d2656de18e158ec910a902030847 it has become really bad - we lose the original syscall number before the place where we decide that we might need a syscall restart. Note that for child we do need the assignment to regs[2] - it won't go through the normal return from syscall path. [Ralf: Issue found and reported by LluĂ­s; initial investigations by me; bug finally found and patch by Al; testing by me and LluĂ­s.] Signed-off-by: Al Viro Tested-by: LluĂ­s Batlle i Rossell Signed-off-by: Ralf Baechle commit 2b3e50234eafc40a04f5f4a2b7bb24b506fd7e87 Author: Ralf Baechle Date: Tue Nov 2 19:38:53 2010 +0000 MIPS: Swarm: Fix typo in symbol name: RTC_M4LT81 -> RTC_M41T81 Signed-off-by: Ralf Baechle commit 36facadd9ea98f8415d0dbb63e0763b7ee9d3911 Merge: 2faa83e2a519abea1055d156ce1b42b8fa57e87b 0b83ae960cd7d4a5ee02786ecf41ab45688999bf Author: Greg Kroah-Hartman Date: Thu Dec 16 10:05:06 2010 -0800 Merge branch 'usb-next' into musb-merge * usb-next: (132 commits) USB: uas: Use GFP_NOIO instead of GFP_KERNEL in I/O submission path USB: uas: Ensure we only bind to a UAS interface USB: uas: Rename sense pipe and sense urb to status pipe and status urb USB: uas: Use kzalloc instead of kmalloc USB: uas: Fix up the Sense IU usb: musb: core: kill unneeded #include's DA8xx: assign name to MUSB IRQ resource usb: gadget: g_ncm added usb: gadget: f_ncm.c added usb: gadget: u_ether: prepare for NCM usb: pch_udc: Fix setup transfers with data out usb: pch_udc: Fix compile error, warnings and checkpatch warnings usb: add ab8500 usb transceiver driver USB: gadget: Implement runtime PM for MSM bus glue driver USB: gadget: Implement runtime PM for ci13xxx gadget USB: gadget: Add USB controller driver for MSM SoC USB: gadget: Introduce ci13xxx_udc_driver struct USB: gadget: Initialize ci13xxx gadget device's coherent DMA mask USB: gadget: Fix "scheduling while atomic" bugs in ci13xxx_udc USB: gadget: Separate out PCI bus code from ci13xxx_udc ... commit 2faa83e2a519abea1055d156ce1b42b8fa57e87b Author: Greg Kroah-Hartman Date: Thu Dec 16 10:04:17 2010 -0800 Revert "USB: musb: pm: don't rely fully on clock support" This reverts commit 32d5dc9520f0c6f60f691dd478741c774e292406. Needed to properly merge the musb changes that are in the usb-next branch into Linus's tree. Acked-by: Felipe Balbi Signed-off-by: Greg Kroah-Hartman commit 224acb1839f5fbb4ba85a440f6dd30dfb0e561b6 Author: Greg Kroah-Hartman Date: Thu Dec 16 10:03:27 2010 -0800 Revert "USB: musb: blackfin: pm: make it work" This reverts commit 1e393c6eece048052d4131ec4dad3b98e35a98e2. Needed to properly merge the musb changes that are in the usb-next branch into Linus's tree. Acked-by: Felipe Balbi Signed-off-by: Greg Kroah-Hartman commit 350e4f31e0eaf56dfc3b328d24a11bdf42a41fb8 Author: Eric Paris Date: Thu Dec 16 11:46:51 2010 -0500 SELinux: define permissions for DCB netlink messages Commit 2f90b865 added two new netlink message types to the netlink route socket. SELinux has hooks to define if netlink messages are allowed to be sent or received, but it did not know about these two new message types. By default we allow such actions so noone likely noticed. This patch adds the proper definitions and thus proper permissions enforcement. Signed-off-by: Eric Paris commit 67b989a0c17e34a7c2c095e58a2f3d1b4408e3cb Merge: 56a8bd6dcf81693e61a712097216904f3a4ab536 69479f8da68f1930b2078b2ebf6533fb00339918 Author: Dmitry Torokhov Date: Thu Dec 16 09:17:48 2010 -0800 Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rydberg/input-mt into next Conflicts: drivers/input/Makefile commit b2837fcf4994e699a4def002e26f274d95b387c1 Author: Anton Salikhmetov Date: Thu Dec 16 18:08:41 2010 +0200 hfsplus: %L-to-%ll, macro correction, and remove unneeded braces Clean-up based on checkpatch.pl report against unnecessary braces (`{' and `}'), non-standard format option %Lu (%llu recommended) as well as one trailing statement in a macro definition which should have been on the next line. Signed-off-by: Anton Salikhmetov Signed-off-by: Christoph Hellwig commit 20b7643d8ee44254fc972d42655bace81e7ab50a Author: Anton Salikhmetov Date: Thu Dec 16 18:08:40 2010 +0200 hfsplus: spaces/indentation clean-up Fix incorrect spaces and indentation reported by checkpatch.pl. Signed-off-by: Anton Salikhmetov Signed-off-by: Christoph Hellwig commit 21f2296a598c4089e0a9bdf54634269ac913a693 Author: Anton Salikhmetov Date: Thu Dec 16 18:08:39 2010 +0200 hfsplus: C99 comments clean-up Match coding style restriction against C99 comments where checkpatch.pl reported errors about their usage. Signed-off-by: Anton Salikhmetov Signed-off-by: Christoph Hellwig commit 2753cc281c9a0e8a0a45ee2b8110866a9fe63bdd Author: Anton Salikhmetov Date: Thu Dec 16 18:08:38 2010 +0200 hfsplus: over 80 character lines clean-up Match coding style line length limitation where checkpatch.pl reported over-80-character-line warnings. Signed-off-by: Anton Salikhmetov Signed-off-by: Christoph Hellwig commit 596276c3571e2108f4b336be545ece2eacf3da59 Author: Anton Salikhmetov Date: Thu Dec 16 14:44:51 2010 +0200 hfsplus: fix an artifact in ioctl flag checking Fix a flag checking artifact in hfsplus_ioctl_getflags() routine found while doing clean-up against assignments inside `if's. Signed-off-by: Anton Salikhmetov Signed-off-by: Christoph Hellwig commit b3444d164be8f977f4133ef0c6f4a18f2741373f Merge: 4ef5c68f0a40a95d63c210ba7e3751540e1cb1f1 da32dac101263fb5b155407507c548e3ac2a6a2a Author: Linus Torvalds Date: Thu Dec 16 08:51:57 2010 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus * git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus: lguest: populate initial_page_table lguest: restore boot speed lguest: fix crash lguest_time_init commit 4ef5c68f0a40a95d63c210ba7e3751540e1cb1f1 Merge: 9fe4145530e6072cc838beb95ca68cada8c56909 947b10ae0aeda89fc066a7470fdba55f72b0b8fc Author: Linus Torvalds Date: Thu Dec 16 08:34:22 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2: nilfs2: fix regression of garbage collection ioctl commit 9fe4145530e6072cc838beb95ca68cada8c56909 Merge: b0c3844d8af6b9f3f18f31e1b0502fbefa2166be ab4e0192196b8d4e43a3945742d4996da934a86f Author: Linus Torvalds Date: Thu Dec 16 08:33:44 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: define separate EVIOCGKEYCODE_V2/EVIOCSKEYCODE_V2 Input: wacom - add another Bamboo Pen ID (0xd4) commit f08f5a0add20834d3f3d876dfe08005a5df656db Author: Rafael J. Wysocki Date: Thu Dec 16 17:11:58 2010 +0100 PM / Runtime: Fix pm_runtime_suspended() There are some situations (e.g. in __pm_generic_call()), where pm_runtime_suspended() is used to decide whether or not to execute a device's (system) ->suspend() callback. The callback is not executed if pm_runtime_suspended() returns true, but it does so for devices that don't even support runtime PM, because the power.disable_depth device field is ignored by it. This leads to problems (i.e. devices are not suspened when they should), so rework pm_runtime_suspended() so that it returns false if the device's power.disable_depth field is different from zero. Signed-off-by: Rafael J. Wysocki Cc: stable@kernel.org commit be8cd644c49dca4212e975455c8e7119b848ebe8 Author: Rafael J. Wysocki Date: Sat Dec 11 21:46:44 2010 +0100 PM / Hibernate: Restore old swap signature to avoid user space breakage Commit 3624eb0 (PM / Hibernate: Modify signature used to mark swap) attempted to modify hibernate signature used to mark swap partitions containing hibernation images, so that old kernels don't try to handle compressed images. However, this change broke resume from hibernation on Fedora 14 that apparently doesn't pass the resume= argument to the kernel and tries to trigger resume from early user space. This doesn't work, because the signature is now different, so the old signature has to be restored to avoid the problem. Addresses https://bugzilla.kernel.org/show_bug.cgi?id=22732 . Reported-by: Dr. David Alan Gilbert Reported-by: Zhang Rui Reported-by: Pascal Chapperon Signed-off-by: Rafael J. Wysocki commit 1497dd1d29c6a53fcd3c80f7ac8d0e0239e7389e Author: Takashi Iwai Date: Fri Dec 10 00:16:39 2010 +0100 PM / Hibernate: Fix PM_POST_* notification with user-space suspend The user-space hibernation sends a wrong notification after the image restoration because of thinko for the file flag check. RDONLY corresponds to hibernation and WRONLY to restoration, confusingly. Signed-off-by: Takashi Iwai Signed-off-by: Rafael J. Wysocki Cc: stable@kernel.org commit 846f40455276617275284a4b76b89311b4aed0b9 Author: Steven Whitehouse Date: Thu Dec 16 15:18:48 2010 +0000 GFS2: Don't flush delete workqueue when releasing the transaction lock There is no requirement to flush the delete workqueue before a gfs2 filesystem is suspended. The workqueue's work will just be suspended along with the rest of the tasks on the filesystem. The resolves a deadlock situation where the transaction lock's demotion code was trying to flush the delete workqueue while at the same time, the workqueue was waiting for the transaction lock. The delete workqueue is flushed by gfs2_make_fs_ro() already, so that umount/remount are correctly protected anyway. Signed-off-by: Steven Whitehouse commit 7d5f01ad536afebde9a1c81d985f8d0eaf2a9ab6 Author: Sedat Dilek Date: Thu Dec 16 12:46:23 2010 +0100 iwlwifi: Fix error: struct iwl_lq_sta has no member named dbg_fixed_rate While compiling linux-next (next-20101216) I fell over this breakage: ... drivers/net/wireless/iwlwifi/iwl-agn-rs.c: In function ‘iwl_rs_rate_init’: drivers/net/wireless/iwlwifi/iwl-agn-rs.c:2876:8: error: ‘struct iwl_lq_sta’ has no member named ‘dbg_fixed_rate’ dbg_fixed_rate is only used when CONFIG_MAC80211_DEBUGFS is set: [ drivers/net/wireless/iwlwifi/iwl-agn-rs.h ] ... #ifdef CONFIG_MAC80211_DEBUGFS struct dentry *rs_sta_dbgfs_scale_table_file; struct dentry *rs_sta_dbgfs_stats_table_file; struct dentry *rs_sta_dbgfs_rate_scale_data_file; struct dentry *rs_sta_dbgfs_tx_agg_tid_en_file; u32 dbg_fixed_rate; #endif The issue was introduced by commit a1da077bc36368eb7d6312e7e49260f0a3d92c77: "iwlwifi: clear dbg_fixed_rate during init" Signed-off-by: Sedat Dilek Signed-off-by: John W. Linville commit e13416ae7f378f9963ceca596ac464d4120093f3 Merge: b0c3844d8af6b9f3f18f31e1b0502fbefa2166be b99ddbf83c064382b145d2156cc819d1eb4fc54d Author: Paul Mundt Date: Thu Dec 16 23:38:41 2010 +0900 Merge branch 'for-paul-rc' of git://gitorious.org/linux-omap-dss2/linux into fbdev-fixes-for-linus * 'for-paul-rc' of git://gitorious.org/linux-omap-dss2/linux: OMAP: OMAPFB: disable old omapfb for OMAP4 builds OMAP: DSS: VRAM: Align start & size of vram to 2M commit e137478b56fd79c397b5c5c74fc08c049a42835a Author: John W. Linville Date: Thu Dec 16 09:20:16 2010 -0500 rtlwifi: convert to __packed notation Use "__packed" instead of "__attribute__ ((packed))"... Signed-off-by: John W. Linville commit bbde588bfacb990542eed043d89c8591d4ae9211 Author: Arnaldo Carvalho de Melo Date: Thu Dec 16 09:43:47 2010 -0200 perf buildid-list: Fix error return for success It was always returning -1 (255), confusing test scripts. Reported-by: Han Pingtian Cc: Frederic Weisbecker Cc: Han Pingtian Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 68a7a771ad0e2959983729bf88cbc74a7014438f Author: Franck Bui-Huu Date: Fri Dec 10 22:06:26 2010 +0100 perf buildid-cache: Fix symbolic link handling This was broken since link(2) doesn't dereference symbolic links. Instead 'filename' becomes a symbolic link to the same file that 'name' refers to. This had the bad effect to create dangling symlinks in the case that even can't be removed with perf-buildid-cache(1). LKML-Reference: Signed-off-by: Franck Bui-Huu Signed-off-by: Arnaldo Carvalho de Melo commit c3a34e06db25a8c74e196517732d65cdb56028ec Author: Franck Bui-Huu Date: Fri Dec 10 14:07:14 2010 +0100 perf symbols: Stop using vmlinux files with no symbols Fail if the kernel image contains no symbol, allowing using other images in the vmlinux search path that may have a usable symtab. Acked-by: Masami Hiramatsu Cc: 2nddept-manager@sdl.hitachi.co.jp Cc: Francis Moreau Cc: Franck Bui-Huu Cc: Masami Hiramatsu LPU-Reference: Signed-off-by: Franck Bui-Huu Signed-off-by: Arnaldo Carvalho de Melo commit fd930ff91e7fda18f7790984a98489a85edb7c71 Author: Franck Bui-Huu Date: Fri Dec 10 14:06:03 2010 +0100 perf probe: Fix use of kernel image path given by 'k' option Users were not being able to have the explicitely specified vmlinux pathname used, instead a search on the vmlinux path was always being made. Reported-by: Francis Moreau Acked-by: Masami Hiramatsu Cc: 2nddept-manager@sdl.hitachi.co.jp Cc: Francis Moreau Cc: Franck Bui-Huu Cc: Masami Hiramatsu LPU-Reference: Signed-off-by: Franck Bui-Huu Signed-off-by: Arnaldo Carvalho de Melo commit 3e26f23091da06d02fa62da14c95f3688d27857c Author: Avi Kivity Date: Thu Dec 16 12:16:34 2010 +0200 KVM: Fix preemption counter leak in kvm_timer_init() Based on a patch from Thomas Meyer. Signed-off-by: Avi Kivity commit 7639dae0ca11038286bbbcda05f2bef601c1eb8d Author: Peter Zijlstra Date: Tue Dec 14 21:26:40 2010 +0100 perf, x86: Provide a PEBS capable cycle event Signed-off-by: Peter Zijlstra LKML-Reference: Signed-off-by: Ingo Molnar commit abe43400579d5de0078c2d3a760e6598e183f871 Author: Peter Zijlstra Date: Wed Nov 17 23:17:37 2010 +0100 perf: Sysfs enumeration Simple sysfs emumeration of the PMUs. Use a "event_source" bus, and add PMU devices using their name. Each PMU device has a type attribute which contrains the value needed for perf_event_attr::type to identify this PMU. This is the minimal stub needed to start using this interface, we'll consider extending the sysfs usage later. Cc: Kay Sievers Cc: Greg KH Signed-off-by: Peter Zijlstra LKML-Reference: <20101117222056.316982569@chello.nl> Signed-off-by: Ingo Molnar commit 2e80a82a49c4c7eca4e35734380f28298ba5db19 Author: Peter Zijlstra Date: Wed Nov 17 23:17:36 2010 +0100 perf: Dynamic pmu types Extend the perf_pmu_register() interface to allow for named and dynamic pmu types. Because we need to support the existing static types we cannot use dynamic types for everything, hence provide a type argument. If we want to enumerate the PMUs they need a name, provide one. Signed-off-by: Peter Zijlstra LKML-Reference: <20101117222056.259707703@chello.nl> Signed-off-by: Ingo Molnar commit 9f58a205c62d0dad1df38d076324a89b1a0f1d65 Author: Peter Zijlstra Date: Wed Nov 17 23:17:35 2010 +0100 init: Initialized IDR earlier perf_event_init() wants to start using IDR trees, its needs in turn are satisfied by mm_init(). Signed-off-by: Peter Zijlstra LKML-Reference: <20101117222056.206992649@chello.nl> Signed-off-by: Ingo Molnar commit 24a24bb6ff3dc3a09bb131241be920ecc3f0e519 Author: Peter Zijlstra Date: Wed Nov 17 23:17:33 2010 +0100 perf: Move perf_event_init() into main.c Currently we call perf_event_init() from sched_init(). In order to make it more obvious move it to the cannnonical location. Signed-off-by: Peter Zijlstra LKML-Reference: <20101117222056.093629821@chello.nl> Signed-off-by: Ingo Molnar commit 4407204c5c9037763aadce39b025529dfbfcac9e Author: Peter Zijlstra Date: Wed Dec 8 15:56:23 2010 +0100 perf, x86: Detect broken BIOSes that corrupt the PMU Some BIOSes use PMU resources, which can cause various bugs: - Non-working or erratic PMU based statistics - the PMU can end up counting the wrong thing, resulting in misleading statistics - Profiling can stop working or it can profile the wrong thing - A non-working or erratic NMI watchdog that cannot be relied on - The kernel may disturb whatever thing the BIOS tries to use the PMU for - possibly causing hardware malfunction in extreme cases. - ... and other forms of potential misbehavior Various forms of such misbehavior has been observed in practice - there are BIOSes that just corrupt the PMU state, consequences be damned. The PMU is a CPU resource that is handled by the kernel and the BIOS stealing+corrupting it is not acceptable nor robust, so we detect it, warn about it and further refuse to touch the PMU ourselves. Signed-off-by: Peter Zijlstra Cc: Jason Wessel Cc: Don Zickus Cc: Linus Torvalds Cc: Thomas Gleixner Cc: "H. Peter Anvin" LKML-Reference: Signed-off-by: Ingo Molnar commit 69479f8da68f1930b2078b2ebf6533fb00339918 Author: Dmitry Torokhov Date: Thu Dec 9 01:08:26 2010 -0800 Input: include MT library as source for kerneldoc Signed-off-by: Dmitry Torokhov Signed-off-by: Henrik Rydberg commit 7f9c2454010159e871e9416dcf64b1e6bfce78be Author: Henrik Rydberg Date: Tue Dec 7 09:18:28 2010 +0100 MAINTAINERS: Update input-mt entry The input multitouch core is now located in its own file, and maintained via a git tree. Update the maintainers entry accordingly. Signed-off-by: Henrik Rydberg commit 28906ad6d7c8a8090f720cf7c39461df0b1460f6 Author: Richard Nauber Date: Tue Dec 14 22:36:18 2010 +0100 hid: egalax: Add support for Samsung NB30 netbook The Samsung NB30 touch has a DWAV dual-touch device. This patch adds the NB30 to the list of supported devices, and grabs it accordingly in hid-core. [rydberg@euromail.se: rename and log message changes] Signed-off-by: Richard Nauber Signed-off-by: Jiri Kosina Signed-off-by: Henrik Rydberg commit e12b355b57b4d330be3479b1e9a518cfed59866c Author: Henrik Rydberg Date: Mon Nov 29 14:40:11 2010 +0100 hid: egalax: Document the new devices in Kconfig Add the new supported devices to the kernel menu config help text. Signed-off-by: Jiri Kosina Cc: Stephane Chatty Signed-off-by: Henrik Rydberg commit 006b20fe4c69189b0d854e5eabf269e50ca86cdd Merge: 5f29805a4f4627e766f862ff9f10c14f5f314359 d949750fed168b6553ca11ed19e4affd19d7a4d7 Author: Ingo Molnar Date: Thu Dec 16 11:22:25 2010 +0100 Merge branch 'perf/urgent' into perf/core Merge reason: We want to apply a dependent patch. Signed-off-by: Ingo Molnar commit d949750fed168b6553ca11ed19e4affd19d7a4d7 Merge: ce677831a4abd0f9f957c90ac6f6a0d0472bafb4 e63233f75a1a6bfa97ffb52a20cc6801a4c63fb2 Author: Ingo Molnar Date: Thu Dec 16 11:21:24 2010 +0100 Merge branch 'tip/perf/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace into perf/urgent commit 8e92c20183ed0579d94501311b81c42b65cb2129 Author: Peter Zijlstra Date: Thu Dec 9 14:15:34 2010 +0100 sched: Fix the irqtime code for 32bit Since the irqtime accounting is using non-atomic u64 and can be read from remote cpus (writes are strictly cpu local, reads are not) we have to deal with observing partial updates. When we do observe partial updates the clock movement (in particular, ->clock_task movement) will go funny (in either direction), a subsequent clock update (observing the full update) will make it go funny in the oposite direction. Since we rely on these clocks to be strictly monotonic we cannot suffer backwards motion. One possible solution would be to simply ignore all backwards deltas, but that will lead to accounting artefacts, most notable: clock_task + irq_time != clock, this inaccuracy would end up in user visible stats. Therefore serialize the reads using a seqcount. Reviewed-by: Venkatesh Pallipadi Reported-by: Mikael Pettersson Tested-by: Mikael Pettersson Signed-off-by: Peter Zijlstra LKML-Reference: <1292242434.6803.200.camel@twins> Signed-off-by: Ingo Molnar commit fe44d62122829959e960bc699318d58966922a69 Author: Peter Zijlstra Date: Thu Dec 9 14:15:34 2010 +0100 sched: Fix the irqtime code to deal with u64 wraps Some ARM systems have a short sched_clock() [ which needs to be fixed too ], but this exposed a bug in the irq_time code as well, it doesn't deal with wraps at all. Fix the irq_time code to deal with u64 wraps by re-writing the code to only use delta increments, which avoids the whole issue. Reviewed-by: Venkatesh Pallipadi Reported-by: Mikael Pettersson Tested-by: Mikael Pettersson Signed-off-by: Peter Zijlstra LKML-Reference: <1292242433.6803.199.camel@twins> Signed-off-by: Ingo Molnar commit ce677831a4abd0f9f957c90ac6f6a0d0472bafb4 Author: Dan Carpenter Date: Sun Oct 24 21:50:42 2010 +0200 perf: Fix off by one in perf_swevent_init() The perf_swevent_enabled[] array has PERF_COUNT_SW_MAX elements. Signed-off-by: Dan Carpenter Signed-off-by: Peter Zijlstra LKML-Reference: <20101024195041.GT5985@bicker> Signed-off-by: Ingo Molnar commit 4e93db23bf95cd763c9182b5d6187412fe6ce747 Author: Henrik Rydberg Date: Mon Nov 29 07:27:49 2010 +0100 hid: egalax: Add support for Wetab The Wetab tablet dual-touch controller works the same way as the one in the Joojoo tablet. This patch adds the Wetab to the list of supported devices, and grabs it accordingly in hid-core. Signed-off-by: Jiri Kosina Cc: Stephane Chatty Signed-off-by: Henrik Rydberg commit f7bc8046b33b9fb2e61318f885cc5d94e0a6b805 Author: Henrik Rydberg Date: Mon Dec 6 14:04:21 2010 +0100 hid: egalax: Convert to MT slots The firmware in the joojoo reports touches sequentially, one per report, which confuses the current driver. A further complication is the absense of any indication of a touch frame. This patch converts the driver to the MT slots protocol, and outputs one full touch frame per report. This way, proper handling for both firmwares is ensured. Tested-by: Philipp Merkel Cc: Stephane Chatty Signed-off-by: Jiri Kosina Signed-off-by: Henrik Rydberg commit 17c760687f1270af9bd798d938198caa7d5aa3eb Author: Henrik Rydberg Date: Mon Oct 11 21:20:51 2010 +0200 hid: egalax: Add event filtering Use estimated signal-to-noise ratios to reduce noise and limit the amount of events emitted. Signed-off-by: Jiri Kosina Cc: Stephane Chatty Signed-off-by: Henrik Rydberg commit 80a469e4f4d01ad96447f85cc71a379ec82ffe2d Author: Henrik Rydberg Date: Mon Oct 11 21:16:43 2010 +0200 hid: egalax: Report zero as minimum pressure The firmware reports a logical minimum of one, but in order for userspace applications to correctly map all reported values to non-zero pressure, the driver needs to report a logical minimum of zero. Fixed with this patch. Tested-by: Philipp Merkel Cc: Stephane Chatty Signed-off-by: Jiri Kosina Signed-off-by: Henrik Rydberg commit b88cbd3a007608a224fad5413de6170c75afd5a7 Author: Henrik Rydberg Date: Wed Oct 13 22:18:32 2010 +0200 hid: egalax: Correct for device resolution report error The firmware of both supported devices report a X/Y maximum of 4095, whereas in reality, it is eight times larger. Fixed with this patch. Signed-off-by: Jiri Kosina Cc: Stephane Chatty Signed-off-by: Henrik Rydberg commit 4a864183fb28ddf553e5b0b47858bc3c518dae94 Author: Henrik Rydberg Date: Sat Nov 27 17:56:17 2010 +0100 hid: egalax: Setup input device manually The hid core does not yet handle input filtering. Take over the setup of the input device, so that proper signal-to-noise ratios can be used. Signed-off-by: Jiri Kosina Cc: Stephane Chatty Signed-off-by: Henrik Rydberg commit e42a98b520bb22535687ead3120e80edc268279a Author: Henrik Rydberg Date: Mon Dec 6 10:05:43 2010 +0100 input: mt: Add hovering distance axis Touch devices capable of hovering, i.e., fingers detected a distance from the surface, are not supported by the current input MT protocol. This patch adds ABS_MT_DISTANCE, which may be used to indicate the distance between the contact and the surface. Signed-off-by: Henrik Rydberg commit c5f4dec1ceb6ab773bbbefbe64a7c990c7d6b17f Author: Henrik Rydberg Date: Wed Dec 15 13:50:34 2010 +0100 input: mt: Move tracking and pointer emulation to input-mt The drivers using the type B protocol all report tracking information the same way. The contact id is semantically equivalent to ABS_MT_SLOT, and the handling of ABS_MT_TRACKING_ID only complicates the driver. The situation can be improved upon by providing a common pointer emulation code, thereby removing the need for the tracking id in the driver. This patch moves all tracking event handling over to the input core, simplifying both the existing drivers and the ones currently in preparation. Acked-by: Ping Cheng Acked-by: Jiri Kosina Signed-off-by: Henrik Rydberg commit 8cde81001626c4c60b26ef2eb5fc522885ed9fd0 Author: Henrik Rydberg Date: Sat Nov 27 10:50:54 2010 +0100 input: mt: Collect slots initialization code The MT slots devices all follow the same initialization pattern of creating slots and hinting about buffer size. Let drivers call an initialization function instead, and make sure it can be called repeatedly without side effects. Signed-off-by: Henrik Rydberg commit 47c78e891323513e9909729b44033e2c6649e2b7 Author: Henrik Rydberg Date: Sat Nov 27 09:16:48 2010 +0100 input: mt: Break out slots handling In preparation for common code to handle a larger set of MT slots devices, move the slots handling over to a separate file. Signed-off-by: Henrik Rydberg commit 8ac33dc86d37ca76d282aa112d4f2794a731064e Author: Tao Ma Date: Wed Dec 15 16:30:00 2010 +0800 ocfs2: Hold ip_lock when set/clear flags for indexed dir. When we set/clear the dyn_features for an inode we hold the ip_lock. So do it when we set/clear OCFS2_INDEXED_DIR_FL also. Signed-off-by: Tao Ma Signed-off-by: Joel Becker commit 41b41a26d4d6e4e3ad877d02377844ab9552dc16 Author: Sunil Mushran Date: Thu Dec 9 18:20:38 2010 -0800 ocfs2: Adjust masklog flag values Two masklogs had the same flag value. Signed-off-by: Sunil Mushran Signed-off-by: Joel Becker commit 56a8bd6dcf81693e61a712097216904f3a4ab536 Author: Tony SIM Date: Wed Dec 15 23:39:25 2010 -0800 Input: add ST1232 touchscreen controller driver This patch introduces support for Sitronix ST1232 integrated capacitive touchscreen with LCD module. The touchscreen is multitouch capable and can report coordinates of up to two contact points. Signed-off-by: Tony SIM Reviewed-by: Trilok Soni Acked-by: Henrik Rydberg Signed-off-by: Dmitry Torokhov commit da32dac101263fb5b155407507c548e3ac2a6a2a Author: Rusty Russell Date: Thu Dec 16 17:03:15 2010 -0600 lguest: populate initial_page_table Two x86 patches broke lguest: 1) v2.6.35-492-g72d7c3b, which changed x86 to use the memblock allocator. In lguest, the host places linear page tables at the top of mem, which used to be enough to get us up to the swapper_pg_dir page tables. With the first patch, the direct mapping tables used that memory: Before: kernel direct mapping tables up to 4000000 @ 7000-1a000 After: kernel direct mapping tables up to 4000000 @ 3fed000-4000000 I initially fixed this by lying about the amount of memory we had, so the kernel wouldn't blatt the lguest boot pagetables (yuk!), but then... 2) v2.6.36-rc8-54-gb40827f, which made x86 boot use initial_page_table. This was initialized in a part of head_32.S which isn't executed by lguest; it is then copied into swapper_pg_dir. So we have to initialize it; and anyway we switch to it before we blatt the old tables, so that fixes the previous damage as well. For the moment, I cut & pasted the code into lguest's boot code, but next merge window I will merge them. Signed-off-by: Rusty Russell Cc: Jeremy Fitzhardinge Cc: Konrad Rzeszutek Wilk To: x86@kernel.org commit bb4093deb259ea9c92415796a6a139e35272f8a8 Author: Rusty Russell Date: Thu Dec 16 17:03:15 2010 -0600 lguest: restore boot speed lguest is dumb and drops *all* the pagetables for set_pte (which is only used for kernel mapping manipulation, so it's OK without highmem). But it's used a lot in boot, too. As a guest optimization, we suppressed this flushing until the first page switch. Now we have initial_page_table, that happens much earlier, so extend the heuristic to wait until we switch to something other than the swapper_pg_dir or initial_page_table. As measured on my laptop under kvm, this dropped the time-to-mount-root from 48 seconds to 4.3 seconds. Signed-off-by: Rusty Russell commit bb6f1d9a99f1947d91693de62ed54ac3bf1e2dfe Author: Rusty Russell Date: Thu Dec 16 17:03:13 2010 -0600 lguest: fix crash lguest_time_init fe25c7fc2e "x86: lguest: Convert to new irq chip functions" converted enable_lguest_irq() to take a struct irq_data *, but didn't fix the one internal caller. Signed-off-by: Rusty Russell To: x86@kernel.org commit f113fe4e844be15394edcbc32b0ec196cdd0a0ff Author: Eric Miao Date: Tue Nov 23 17:00:03 2010 +0800 ARM: pxa: introduce pxa2xx_clock_sysclass for clock suspend/resume Signed-off-by: Eric Miao commit 2a125dd56b3a853701063fe8a678ad7603e385fd Author: Eric Miao Date: Mon Nov 22 22:48:49 2010 +0800 ARM: pxa: remove get_memclk_frequency_10khz() Introduce 'struct clk' for memory and remove get_memclk_frequency_10khz(). Signed-off-by: Eric Miao commit 4029813c89926ae5d78cc2dff49d845d934424f6 Author: Eric Miao Date: Mon Nov 22 10:49:55 2010 +0800 ARM: pxa: separate the clock support into clock-{pxa2xx,pxa3xx}.c Signed-off-by: Eric Miao commit 2e8581e756ddbd0dea8b0d4059e9a82d2929de01 Author: Eric Miao Date: Mon Nov 22 09:41:39 2010 +0800 ARM: pxa: replace duplicated macro DEFINE_PXA3_CK() with DEFINE_CK() Signed-off-by: Eric Miao commit bb71bdd31b48efa2b9834f1a47eb5f657e3c217c Author: Haojian Zhuang Date: Wed Nov 17 19:03:36 2010 +0800 ARM: pxa: redefine irqs.h Define all IRQs in irqs.h. If some IRQs are sharing one IRQ number, define them together. If some IRQs are sharing same name with different IRQ number, define different IRQ. Signed-off-by: Haojian Zhuang Cc: Eric Miao Signed-off-by: Eric Miao commit d04e67cd1d088762c17e8edf08fbc14e4af1981a Author: Haojian Zhuang Date: Wed Nov 17 19:03:35 2010 +0800 ARM: pxa: redefine the cpu_is_pxa3xx After introducing pxa930/pxa935 and new silicons, original cpuid rules of XScale generation 3 can't fit new silicons. Now redefine the rule of PXA3xx. Only PXA300/PXA310/PXA320/PXA930/PXA935 are family members of PXA3xx. PXA930/PXA935 are family members of PXA93x. PXA93x can be considered as PXA3xx + CP. Signed-off-by: Haojian Zhuang Cc: Eric Miao Signed-off-by: Eric Miao commit d38bdf48f30f5dc0fac4c1ab656aff74f6804f07 Author: Haojian Zhuang Date: Thu Nov 25 14:21:32 2010 +0800 ARM: mmp: fix the typo - MMP2 is compatible with ARMv7 Signed-off-by: Haojian Zhuang Signed-off-by: Eric Miao commit 13dee960f37b3769baa0eae9d1de4a7ca9a2e999 Author: Haojian Zhuang Date: Thu Nov 25 11:33:13 2010 +0800 ARM: mmp: append brownstone support Signed-off-by: Haojian Zhuang Signed-off-by: Eric Miao commit 7bdba92dcaefdc69c339db9e23861e5e21d3a2c4 Author: cxie4 Date: Tue Nov 23 10:43:22 2010 +0800 ARM: mmp: add usb clock for pxa168/pxa910 Signed-off-by: Chao Xie Signed-off-by: Eric Miao commit aa11781671279c67d56b95c4d73cde5cd1a6d594 Author: Daniel Mack Date: Thu Nov 4 14:44:01 2010 -0400 ARM: pxa/raumfeld: enable PXA3XX_GCU driver Signed-off-by: Daniel Mack Signed-off-by: Eric Miao commit 364dbdf3b6c31a4a5fb7a6d479e7aafb4a7a10b6 Author: Daniel Mack Date: Thu Nov 4 14:44:00 2010 -0400 video: add driver for PXA3xx 2D graphics accelerator This adds a driver for the the 2D graphics accelerator found on PXA3xx processors. Only resource mapping, interrupt handling and a simple ioctl handler is done by the kernel part, the rest of the logic is implemented in DirectFB userspace. Graphic applications greatly benefit for line drawing, blend, and rectangle and triangle filling operations. Benchmarks done on a PXA303 using the df_dok benchmarking tool follow, where the value in square brackets show the CPU usage during that test. Without accelerator (benchmarking 256x252 on 480x262 RGB16 (16bit)): Anti-aliased Text 3.016 secs ( 65.649 KChars/sec) [ 99.6%] Fill Rectangle 3.021 secs ( 175.107 MPixel/sec) [ 98.0%] Fill Rectangle (blend) 3.582 secs ( 3.602 MPixel/sec) [ 99.7%] Fill Rectangles [10] 3.177 secs ( 182.753 MPixel/sec) [ 98.1%] Fill Rectangles [10] (blend) 18.020 secs ( 3.580 MPixel/sec) [ 98.7%] Fill Spans 3.019 secs ( 145.306 MPixel/sec) [ 98.0%] Fill Spans (blend) 3.616 secs ( 3.568 MPixel/sec) [ 99.4%] Blit 3.074 secs ( 39.874 MPixel/sec) [ 98.0%] Blit 180 3.020 secs ( 32.042 MPixel/sec) [ 98.0%] Blit with format conversion 3.005 secs ( 19.321 MPixel/sec) [ 99.6%] Blit from 32bit (blend) 4.792 secs ( 2.692 MPixel/sec) [ 98.7%] With accelerator: Anti-aliased Text 3.056 secs (* 36.518 KChars/sec) [ 21.3%] Fill Rectangle 3.015 secs (* 115.543 MPixel/sec) [ 8.9%] Fill Rectangle (blend) 3.180 secs (* 20.286 MPixel/sec) [ 1.8%] Fill Rectangles [10] 3.251 secs (* 119.062 MPixel/sec) [ 1.2%] Fill Rectangles [10] (blend) 6.293 secs (* 20.502 MPixel/sec) [ 0.3%] Fill Spans 3.051 secs (* 97.264 MPixel/sec) [ 35.7%] Fill Spans (blend) 3.377 secs (* 15.282 MPixel/sec) [ 17.8%] Blit 3.046 secs (* 27.533 MPixel/sec) [ 2.6%] Blit 180 3.098 secs (* 27.070 MPixel/sec) [ 2.2%] Blit with format conversion 3.131 secs (* 39.148 MPixel/sec) [ 2.8%] Blit from 32bit (blend) 3.346 secs (* 11.568 MPixel/sec) [ 0.8%] Signed-off-by: Daniel Mack Tested-by: Sven Neumann Cc: Eric Miao Cc: Denis Oliver Kropp Cc: Sven Neumann Cc: Haojian Zhuang Signed-off-by: Eric Miao commit fe805986b20a86257e6de8cb12a7e5b991925aab Author: Zhangfei Gao Date: Wed Nov 3 01:15:32 2010 -0400 ARM: mmp: add sd card to jasper Signed-off-by: Zhangfei Gao Acked-by: Haojian Zhuang Signed-off-by: Eric Miao commit 5382f419c128c85af3933958d73b18ed063d0264 Author: Zhangfei Gao Date: Wed Sep 29 16:18:51 2010 -0400 ARM: mmp: add mmc resource Signed-off-by: Zhangfei Gao Acked-by: Haojian Zhuang Signed-off-by: Eric Miao commit ad68bb9f7a3cd47396635a5e3895215af57579da Author: Marek Vasut Date: Wed Nov 3 16:29:35 2010 +0100 ARM: pxa: Access SMEMC via virtual addresses This is important because on PXA3xx, the physical mapping of SMEMC registers differs from the one on PXA2xx. In order to get PCMCIA working on both PXA2xx and PXA320, the PCMCIA driver was adjusted accordingly as well. Also, various places in the kernel had to be patched to use __raw_read/__raw_write. Signed-off-by: Marek Vasut Acked-by: Haojian Zhuang Signed-off-by: Eric Miao commit 851982c1b6ca18cedf6d01e4529a0c1ddb30771e Author: Marek Vasut Date: Mon Oct 11 02:20:19 2010 +0200 ARM: pxa: Introduce pxa{25x,27x,3xx}_map_io() This patch introduces pxa2xx_map_io() and pxa3xx_map_io() to distinguish between PXA25x/PXA27x and PXA3xx memory mapping. Also, fixup for platforms broken after introducing pxa{25x,27x}_map_io() and pxa3xx_map_io() is included. Signed-off-by: Marek Vasut Signed-off-by: Eric Miao commit 64ed267bdac799485a938dd2cba8243ba383cd5f Author: Eric Miao Date: Wed Oct 13 14:51:25 2010 +0800 ARM: pxa: introduce addr-map.h for large bus addresses and ranges Signed-off-by: Eric Miao commit ead67b6e6679b14befb0cef59db60e2853e19cd8 Author: Eric Miao Date: Wed Oct 13 10:38:56 2010 +0800 ARM: pxa: remove un-used mapping of camera registers The camera registers start and range are encoded into the platform device, and are actually handled by ioremap()'ed, thus the mapping in pxa_map_io() is not necessary. Signed-off-by: Eric Miao commit a74b74a5555c741ed3df896096e33b853995631e Author: Lennert Buytenhek Date: Wed Dec 15 07:20:16 2010 +0800 ARM: pxa: PXA_ESERIES depends on FB_W100. As arch/arm/mach-pxa/eseries.c references w100fb_gpio_{read,write}() directly. Signed-off-by: Lennert Buytenhek Signed-off-by: Eric Miao commit 947b10ae0aeda89fc066a7470fdba55f72b0b8fc Author: Ryusuke Konishi Date: Thu Dec 16 09:57:57 2010 +0900 nilfs2: fix regression of garbage collection ioctl On 2.6.37-rc1, garbage collection ioctl of nilfs was broken due to the commit 263d90cefc7d82a0 ("nilfs2: remove own inode hash used for GC"), and leading to filesystem corruption. The patch doesn't queue gc-inodes for log writer if they are reused through the vfs inode cache. Here, gc-inode is the inode which buffers blocks to be relocated on GC. That patch queues gc-inodes in nilfs_init_gcinode() function, but this function is not called when they don't have I_NEW flag. Thus, some of live blocks are wrongly overrode without being moved to new logs. This resolves the problem by moving the gc-inode queueing to an outer function to ensure it's done right. Signed-off-by: Ryusuke Konishi commit ab226e21ad34f6ef52e00d2ab399d2364b4cdfee Author: Henry C Chang Date: Wed Dec 15 20:41:54 2010 -0800 ceph: fix direct-io on non-page-aligned buffers The user buffer may be 512-byte aligned, not page-aligned. We were assuming the buffer was page-aligned and only accounting for non-page-aligned io offsets. Signed-off-by: Henry C Chang Signed-off-by: Sage Weil commit b0c3844d8af6b9f3f18f31e1b0502fbefa2166be Author: Linus Torvalds Date: Wed Dec 15 17:24:48 2010 -0800 Linux 2.6.37-rc6 commit c01c8106f43ec7e460eeb56c7a8ae666acdfe5a0 Merge: a4851d8f7d6351a395d36ae8fdcf41745a832d76 52f6c5ad430e41736133acac179607b224eaaa11 Author: Linus Torvalds Date: Wed Dec 15 17:24:05 2010 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: crypto: ghash-intel - ghash-clmulni-intel_glue needs err.h commit 6f2f48a9a061a94d059f89c69472f467839cc616 Author: Alex Deucher Date: Wed Dec 15 11:01:56 2010 -0500 drm/radeon/kms/evergreen: flush hdp cache when flushing gart tlb Make sure vram changes hit memory. This mirrors the 6xx/7xx behavior. Signed-off-by: Alex Deucher Signed-off-by: Dave Airlie commit a1a8213392b29c2b427567b86e2ccfe88ded58cc Author: Alex Deucher Date: Mon Dec 13 14:03:09 2010 -0500 drm/radeon/kms: disable the r600 cb offset checker for linear surfaces There are too many strange corner cases triggered in old userspace drivers out there to that it's nearly impossible to not break some obscure app. Cc: Jean Delvare Signed-off-by: Alex Deucher Signed-off-by: Dave Airlie commit e5fd205f28f83b3514dc5049b2d1388b10065a6d Author: Alex Deucher Date: Sun Dec 12 23:27:23 2010 -0500 drm/radeon/kms: disable ss fixed ref divide Seems to cause problems on certain laptops Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=24462 Signed-off-by: Alex Deucher Tested-by: Luca Tettamanti Signed-off-by: Dave Airlie commit 044102798ddb0a0e5f43ef7fe0ad0e84b0b5e3a0 Merge: a4851d8f7d6351a395d36ae8fdcf41745a832d76 448f53a1ede54eb854d036abf54573281412d650 Author: Dave Airlie Date: Thu Dec 16 10:03:47 2010 +1000 Merge remote branch 'intel/drm-intel-fixes' of /ssd/git/drm-next into drm-fixes * 'intel/drm-intel-fixes' of /ssd/git/drm-next: drm/i915/bios: Reverse order of 100/120 Mhz SSC clocks agp/intel: Fix missed cached memory flags setting in i965_write_entry() drm/i915/sdvo: Only use the SDVO pin if it is in the valid range drm/i915/ringbuffer: Handle wrapping of the autoreported HEAD drm/i915/dp: Fix I2C/EDID handling with active DisplayPort to DVI converter commit 0b83ae960cd7d4a5ee02786ecf41ab45688999bf Author: Matthew Wilcox Date: Wed Dec 15 15:44:06 2010 -0500 USB: uas: Use GFP_NOIO instead of GFP_KERNEL in I/O submission path If swap is on a UAS device, we could recurse into the driver by using GFP_KERNEL. Using GFP_NOIO ensures we won't. Reported-by: James Bottomley Signed-off-by: Matthew Wilcox Signed-off-by: Greg Kroah-Hartman commit 89dc29051b626756e69db12f3ffb22e49a817bfe Author: Matthew Wilcox Date: Wed Dec 15 15:44:05 2010 -0500 USB: uas: Ensure we only bind to a UAS interface While all existing UAS devices use alternate interface 1, this is not guaranteed, and it has caused confusion with people trying to bind the uas driver to non-uas devices. Signed-off-by: Matthew Wilcox Signed-off-by: Greg Kroah-Hartman commit 92a3f767f5cd079351ae04a337c40266e9c6048f Author: Matthew Wilcox Date: Wed Dec 15 15:44:04 2010 -0500 USB: uas: Rename sense pipe and sense urb to status pipe and status urb The spec calls this the status pipe. While it is used to receive sense IUs, it is also used to receive other IUs, so this can be confusing. Reported-by: Luben Tuikov Signed-off-by: Matthew Wilcox Signed-off-by: Greg Kroah-Hartman commit ac563cfd528033ee6e3bb4801b5c73468d0145c8 Author: Matthew Wilcox Date: Wed Dec 15 15:44:03 2010 -0500 USB: uas: Use kzalloc instead of kmalloc The IUs are not being fully initialised by the driver (due to the reserved space). Since we should be zeroing reserved fields, use kzalloc to do it for us. Reported-by: Luben Tuikov Signed-off-by: Matthew Wilcox Signed-off-by: Greg Kroah-Hartman commit 4400ef311e10666a2e5acf97d040df89cb880cb2 Author: Matthew Wilcox Date: Wed Dec 15 15:44:02 2010 -0500 USB: uas: Fix up the Sense IU Add a comment to the Sense IU data structure that it's also used for Read Ready and Write Ready. Remove the 'service response' element since it's gone from the current draft (04). Signed-off-by: Matthew Wilcox Signed-off-by: Greg Kroah-Hartman commit ab60bd0b92ec57c98df08616b7d0664be5551eae Author: Arnaud Lacombe Date: Sun Dec 5 01:29:25 2010 -0500 kconfig: add more S_INT and S_HEX consistency checks This patch add more number consistency checkg, trying to catch the following situation: config FOO0 hex default 42 config FOO1 string config BAR0 int default FOO1 config BAR1 hex default FOO1 config FOO2 hex default 42h config FOO3 int default "1bar" Signed-off-by: Arnaud Lacombe Signed-off-by: Michal Marek commit 50bc0ef42c76879f5d68a88c7063603dc0c9789b Author: Daniel Walker Date: Mon Dec 13 14:35:11 2010 -0800 msm: initial framebuffer support Initial framebuffer components. Add board-trout-panel.c as well as platform parts to enable the framebuffer. This code comes directly from Google's tree. Signed-off-by: Daniel Walker Signed-off-by: David Brown commit 3a790bbe790e79a9744adf105ed135624a590f5b Author: Daniel Walker Date: Mon Dec 13 14:35:10 2010 -0800 msm: add handling for clocks tagged as CLK_MINMAX CLK_MINMAX is used to denote clocks that have a wide variation in possible frequencies. This handling just sets the min and max values to the same value. Signed-off-by: Daniel Walker Signed-off-by: David Brown commit 304a09c3251c7c74660fc2ff9c590edf3d4bdd7e Author: Daniel Walker Date: Mon Dec 13 14:35:09 2010 -0800 msm: trout: change name of pmdh_clk to mddi_clk This clock is used in the framebuffer driver as mddi_clk. This just changes the name to match that. This also mirrors a change in Google tree. Signed-off-by: Daniel Walker Signed-off-by: David Brown commit 078dde9311dd067a76275ea2c903623cec504e31 Author: Daniel Walker Date: Mon Dec 13 14:35:08 2010 -0800 msm: add CLK_MINMAX to pmdh_clk This adds in the CLK_MINMAX flag to the pmdh_clk since it's actual a min/max clock instead of a single frequency clock. Signed-off-by: Daniel Walker Signed-off-by: David Brown commit 940f2efc28564c478033b075bcfc8e7b694831e1 Author: Daniel Walker Date: Mon Dec 13 14:35:07 2010 -0800 msm: trout: add gpio_to_irq trout has gpiolib support and interrupt support, but was missing the gpio_to_irq function. This adds that functions which should allow proper translation. Signed-off-by: Daniel Walker Signed-off-by: David Brown commit 294b2dea83ba0a6d6034a7521bc62c317efab17b Author: Stepan Moskovchenko Date: Fri Dec 10 14:12:03 2010 -0800 msm: iommu: Use the correct memory allocation flag Change msm_iommu_map to use GFP_ATOMIC instead of GFP_KERNEL due to the fact that the call occurs within a spinlock-protected region. Signed-off-by: Stepan Moskovchenko Signed-off-by: David Brown commit 38cd6b4f52a75926fd81fc85f53f5067dcd809f7 Author: Shan Wei Date: Wed Dec 15 14:27:28 2010 +0800 wireless:mac80211: kill unuse macro MESH_CFG_CMP_LEN in mesh.h Commit 00d3f14c has removed the references of this macro, but left it only. So remove this definition. commit 00d3f14cf9f12c21428121026a5e1d5f65926447 Author: Johannes Berg Date: Tue Feb 10 21:26:00 2009 +0100 mac80211: use cfg80211s BSS infrastructure Remove all the code from mac80211 to keep track of BSSes and use the cfg80211-provided code completely. Signed-off-by: Shan Wei Signed-off-by: John W. Linville commit 2b7e6bce41b6b944bd4302cf0914e2a6f4bc704b Author: Mohammed Shafi Shajakhan Date: Wed Dec 15 13:02:46 2010 +0530 ath9k: Add comments for making pm-qos as modparam PM-QOS value can be user specified via module parameter. This patch adds few comments regarding this in the driver code. Signed-off-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit 64c6e50c0732b793e4bd5fd2954b7bef088f83f8 Author: Sujith Manoharan Date: Wed Dec 15 07:47:23 2010 +0530 ath9k_htc: Remove PCI specific configuration This is not required for USB devices. Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit bd2ce6e43f65127bc723e7fcc044758cf8113260 Author: Sujith Manoharan Date: Wed Dec 15 07:47:10 2010 +0530 mac80211: Add timeout to BA session start API Allow drivers or rate control algorithms to specify BlockAck session timeout when initiating an ADDBA transaction. This is useful in cases where maintaining persistent BA sessions does not incur any overhead. The current timeout value of 5000 TUs is retained for all non ath9k/ath9k_htc drivers. Signed-off-by: Sujith Manoharan Reviewed-by: Johannes Berg Signed-off-by: John W. Linville commit a293911d4fd5e8593dbf478399a77f990d466269 Author: Johannes Berg Date: Tue Dec 14 17:54:28 2010 +0100 nl80211: advertise maximum remain-on-channel duration With the upcoming hardware offload implementation, some devices will have a different maximum duration for the remain-on-channel command. Advertise the maximum duration in mac80211, and make mac80211 set it. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 14a085e77063090fb12ad391d0f4d46e593be225 Author: Wey-Yi Guy Date: Tue Dec 14 07:38:58 2010 -0800 iwlagn: fix witespace damage patch "iwlagn: check ready in iwlagn_bss_info_changed()" introduce whitespace, fix it please merge with the previous patch Reported by: Johannes Berg Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 4dc3530df7c0428b41c00399a7ee8c929406d181 Author: Mohammed Shafi Shajakhan Date: Tue Dec 14 13:18:28 2010 +0530 ath9k: Make PM-QOS value as user configurable This patch allows the pm-qos value to be user configurable by making it as a module parameter.This will help our customers to configure the pm-qos value according to the effect in throughput due to the DMA latency problem which was observed in Intel Pinetrail platforms. The tested value of '55' will be filled as the default pm-qos-value incase the user does not specifies pm-qos value as a module parameter. example usage: sudo modprobe ath9k pmqos=65 Cc: Senthilkumar Balasubramanian Signed-off-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit 17b3c17ecde36db5db7760a2802990b3129a4d65 Merge: 1fcfe76a760e78d7774a254608557c84071b0cfb 65af8dea26aa89ae4a810bdaa05545a8e670b636 Author: John W. Linville Date: Wed Dec 15 16:37:55 2010 -0500 Merge branch 'wireless-next-2.6' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-2.6 Conflicts: drivers/net/wireless/iwlwifi/iwl-1000.c drivers/net/wireless/iwlwifi/iwl-6000.c drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c drivers/net/wireless/iwlwifi/iwl-core.h commit 1fcfe76a760e78d7774a254608557c84071b0cfb Merge: 0c8173385e549f95cd80c3fff5aab87b4f881d8d 56e6417b49132d4f56e9f2241d31942b90b46315 Author: John W. Linville Date: Wed Dec 15 16:33:28 2010 -0500 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 Conflicts: drivers/net/wireless/iwlwifi/iwl-1000.c drivers/net/wireless/iwlwifi/iwl-6000.c drivers/net/wireless/iwlwifi/iwl-core.h commit 0c8173385e549f95cd80c3fff5aab87b4f881d8d Author: Larry Finger Date: Wed Dec 8 11:12:31 2010 -0600 rtl8192ce: Add new driver Signed-off-by: Larry Finger Signed-off-by: John W. Linville commit a4851d8f7d6351a395d36ae8fdcf41745a832d76 Merge: 667c78afaec0ac500908e191e8f236e9578d7b1f 6d5c3aa84b3e431f2d0fc39c73c867d1a4dd8cff Author: Linus Torvalds Date: Wed Dec 15 12:41:17 2010 -0800 Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 * 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: ext4: fix typo which broke '..' detection in ext4_find_entry() ext4: Turn off multiple page-io submission by default commit 667c78afaec0ac500908e191e8f236e9578d7b1f Author: Jeremy Fitzhardinge Date: Wed Dec 8 12:39:12 2010 -0800 xen: Provide a variant of __RING_SIZE() that is an integer constant expression Without this, gcc 4.5 won't compile xen-netfront and xen-blkfront, where this is being used to specify array sizes. Signed-off-by: Jan Beulich Signed-off-by: Jeremy Fitzhardinge Cc: Jens Axboe Cc: David Miller Cc: Stable Kernel Signed-off-by: Linus Torvalds commit 6c965ff5e7ca844494f1dcf0ec0440146db01294 Author: Daniel Walker Date: Thu Dec 9 15:45:27 2010 -0800 MAINTAINERS: update MSM git tree The MSM main git tree has changed over to this new address. Signed-off-by: Daniel Walker Signed-off-by: Linus Torvalds commit 462e635e5b73ba9a4c03913b77138cd57ce4b050 Author: Tavis Ormandy Date: Thu Dec 9 15:29:42 2010 +0100 install_special_mapping skips security_file_mmap check. The install_special_mapping routine (used, for example, to setup the vdso) skips the security check before insert_vm_struct, allowing a local attacker to bypass the mmap_min_addr security restriction by limiting the available pages for special mappings. bprm_mm_init() also skips the check, and although I don't think this can be used to bypass any restrictions, I don't see any reason not to have the security check. $ uname -m x86_64 $ cat /proc/sys/vm/mmap_min_addr 65536 $ cat install_special_mapping.s section .bss resb BSS_SIZE section .text global _start _start: mov eax, __NR_pause int 0x80 $ nasm -D__NR_pause=29 -DBSS_SIZE=0xfffed000 -f elf -o install_special_mapping.o install_special_mapping.s $ ld -m elf_i386 -Ttext=0x10000 -Tbss=0x11000 -o install_special_mapping install_special_mapping.o $ ./install_special_mapping & [1] 14303 $ cat /proc/14303/maps 0000f000-00010000 r-xp 00000000 00:00 0 [vdso] 00010000-00011000 r-xp 00001000 00:19 2453665 /home/taviso/install_special_mapping 00011000-ffffe000 rwxp 00000000 00:00 0 [stack] It's worth noting that Red Hat are shipping with mmap_min_addr set to 4096. Signed-off-by: Tavis Ormandy Acked-by: Kees Cook Acked-by: Robert Swiecki [ Changed to not drop the error code - akpm ] Reviewed-by: James Morris Signed-off-by: Linus Torvalds commit 7d13162332f2b67a941d18cee20f1c0413e020de Author: Eric Paris Date: Tue Dec 7 15:27:57 2010 -0500 fanotify: fill in the metadata_len field on struct fanotify_event_metadata The fanotify_event_metadata now has a field which is supposed to indicate the length of the metadata portion of the event. Fill in that field as well. Based-in-part-on-patch-by: Alexey Zaytsev Signed-off-by: Eric Paris commit 62731fa0c893515dc6cbc3e0a2879a92793c735f Author: Alexey Zaytsev Date: Mon Nov 22 00:33:03 2010 +0000 fanotify: split version into version and metadata_len To implement per event type optional headers we are interested in knowing how long the metadata structure is. This patch slits the __u32 version field into a __u8 version and a __u16 metadata_len field (with __u8 left over). This should allow for backwards compat ABI. Signed-off-by: Alexey Zaytsev [rewrote descrtion and changed object sizes and ordering - eparis] Signed-off-by: Eric Paris commit 82cc4f5cb8be6dede34c32a814ab1470409e1840 Merge: 2a27a03d3a891e87ca33d27a858b4db734a4cbab 56e6417b49132d4f56e9f2241d31942b90b46315 Author: David S. Miller Date: Wed Dec 15 09:43:13 2010 -0800 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 commit 1cd25df4e53b9507f7abbb8aff8ce2ba644a1468 Author: Felipe Contreras Date: Mon Oct 11 09:53:49 2010 +0000 OMAP: iommu: make iva2 iommu selectable It seems dsp-link will do this, and tidspbridge too at some point, but right now it's not possible to select CONFIG_MPU_BRIDGE_IOMMU. Cc: Fernando Guzman Lugo Cc: Yogesh Marathe Signed-off-by: Felipe Contreras commit 5cdc5bd8b2b1190cb54548c03194b154b4892e2a Merge: 6c34d2888221ca3df81e29f598873b4fb6cf838d e4a2b3565fc7ac2d70361a36337be57a59d783da Author: Greg Kroah-Hartman Date: Wed Dec 15 09:29:38 2010 -0800 Merge branch 'musb-hw' of git://gitorious.org/usb/usb into musb * 'musb-hw' of git://gitorious.org/usb/usb: (43 commits) usb: musb: core: kill unneeded #include's DA8xx: assign name to MUSB IRQ resource arm: OMAP4430: musb: Configure musb to OTG mode usb: musb: Adding musb support for OMAP4430 usb: otg: TWL6030: Add twl6030_usb file for compilation mfd: TWL6030: OMAP4: Registering the TWL6030-usb device usb: musb: TWL6030: Selecting TWL6030_USB transceiver usb: otg: Kconfig: Add Kconfig option for TWL6030 transceiver. usb: otg: Adding twl6030-usb transceiver driver for OMAP4430 mfd: TWL6030: USBOTG VBUS event generation on usb: musb: add support for ux500 platform musb: am35x: fix compile error due to control apis arm: omap4: enable usb on 4430sdp usb: musb: drop board_set_vbus usb: musb: drop musb_platform_suspend/resume usb: musb: blackfin: usb dev_pm_ops structure usb: musb: am35x: usb dev_pm_ops structure usb: musb: omap2430: use dev_pm_ops structure usb: musb: omap2430: drop the nops usb: musb: mark musb_save/restore_context static ... commit c7f4ab26e3bcdaeb3e19ec658e3ad9092f1a6ceb Author: Guzman Lugo, Fernando Date: Wed Dec 15 00:54:03 2010 +0000 OMAP: iommu: create new api to set valid da range Some IOMMUs cannot use the whole 0x0 - 0xFFFFFFFF range. With this new API the valid range can be set. Signed-off-by: Fernando Guzman Lugo Acked-by: Hiroshi DOYU commit 9205a109fbeee180254bb5a4020eb71d50735944 Author: Guzman Lugo, Fernando Date: Wed Dec 15 00:54:02 2010 +0000 OMAP: iovmm: replace __iounmap with iounmap __iounmap function is wrong for OMAP architecture, instead use iounmap which will call to the correct function. Signed-off-by: Fernando Guzman Lugo Acked-by: Hiroshi DOYU commit ad1081210f3c91874f9fe9b48c3934c7db9714b7 Author: Guzman Lugo, Fernando Date: Wed Dec 15 00:54:01 2010 +0000 OMAP: iovmm: add superpages support to fixed da address This patch adds superpages support to fixed ad address inside iommu_kmap function. Signed-off-by: Fernando Guzman Lugo Acked-by: Hiroshi DOYU commit ba6e1f4ff41314906d81e6d96e646cdeafe42827 Author: Guzman Lugo, Fernando Date: Wed Dec 15 00:54:00 2010 +0000 OMAP: iovmm: no gap checking for fixed address If some fixed da address is wanted to be mapped and the page is freed but it is used as gap, the mapping will fail. This patch is fixing that and olny keeps the gap for not fixed address. Signed-off-by: Fernando Guzman Lugo Acked-by: Hiroshi DOYU commit 5af244fdf2a2405b2181da2a32636f3ca5ef162e Author: Mike Rapoport Date: Mon Nov 15 11:48:33 2010 +0200 [ARM] Dove: add support for multi-purpose pins configuration Signed-off-by: Mike Rapoport Acked-by: Saeed Bishara Signed-off-by: Nicolas Pitre commit 8d4ce4cd7480ccd8412d4391d063733d6fc52f5c Author: Mike Rapoport Date: Mon Nov 15 11:48:32 2010 +0200 [ARM] Dove: add support for GPIOs 64-71 Signed-off-by: Mike Rapoport Acked-by: Saeed Bishara Signed-off-by: Nicolas Pitre commit 248daa084cee4b212ff4408e9c9b05b3bdc0da0d Author: Luciano Coelho Date: Wed Dec 15 16:10:12 2010 +0200 wl12xx_sdio_test: rename files to match current style Change some file names and Kconfig settings so that this new module matches the new way of using wl12xx instead of wl1271. Also fix SDIO power enabling and disabling to match the latest way of doing it. Cc: Roger Quadros Signed-off-by: Luciano Coelho commit f0a6332ce221614fbd0731af92f668892fa4b700 Author: Jonas Aaberg Date: Wed Dec 15 08:37:00 2010 +0100 kbuild: add numeric --set-val option to scripts/config Add new option to scripts/config for changing .config numeric values Acked-by: Linus Walleij Signed-off-by: Jonas Aaberg Signed-off-by: Michal Marek commit ee1ae4d7b1c9a8b73e232fa33dc733be59368ff6 Author: Sascha Hauer Date: Wed Dec 15 09:56:35 2010 +0100 ARM i.MX51: Full iomux support This iomux file has been constructed from the Freescale pinmux tool. It contains all pins from the tool, but the datasheet lists some configurations not present in the tool, these are not yet added. Signed-off-by: Sascha Hauer commit 4ce2c1e8e899831dd152bd0d534a60da6fb1582a Author: Arnaud Lacombe Date: Sun Dec 5 01:41:18 2010 -0500 kconfig: fix `zconfdebug' extern declaration This symbol is only exist if YYDEBUG is defined. Signed-off-by: Arnaud Lacombe Signed-off-by: Michal Marek commit bf128f5265625b8015789ea8f12b3582dc29faa3 Author: Arnaud Lacombe Date: Sun Dec 5 01:41:17 2010 -0500 kconfig/conf: merge duplicate switch's case Signed-off-by: Arnaud Lacombe Signed-off-by: Michal Marek commit 579fb8e741fecef7dfd64afcc7b0b0c68ea207cc Author: Arnaud Lacombe Date: Sun Dec 5 01:41:16 2010 -0500 kconfig: fix typos Signed-off-by: Arnaud Lacombe Signed-off-by: Michal Marek commit 1ebfa5198ee96f34f2ee4ae95c92318f07341fbd Author: Arnaud Lacombe Date: Sun Dec 5 01:41:15 2010 -0500 kbuild/gconf: add dummy inline for bind_textdomain_codeset() This symbols is used by gconf. Signed-off-by: Arnaud Lacombe Signed-off-by: Michal Marek commit fe04ce0bf955eaf53f7e4cd6bb35976fa94e0925 Author: Arnaud Lacombe Date: Sun Dec 5 01:41:14 2010 -0500 kbuild/nconf: fix spaces damage Signed-off-by: Arnaud Lacombe Signed-off-by: Michal Marek commit 6742f554db14da94172da9eb1875a1aa944a827f Author: Juuso Oikarinen Date: Mon Dec 13 09:52:37 2010 +0200 wl12xx: Change TX queue to be per AC With the current single-queue implementation traffic priorization is not working correctly - when using multiple BE streams and one, say VI stream, the VI stream will share bandwidth almost equally with the BE streams. To fix the issue, implement per AC queues, which are emptied in priority order to the firmware. To keep it relatively simple, maintain a global buffer count and global queue stop/wake instead of per-AC. With these changes, priorization appears to work just fine. Signed-off-by: Juuso Oikarinen Signed-off-by: Luciano Coelho commit 17c1755c24d83f9fd0509b64c76cc43fc60cc642 Author: Eliad Peller Date: Sun Dec 12 12:15:35 2010 +0200 wl12xx: allow runtime changing of debug_level Currently, the debug level is set in compilation time (by the DEBUG_LEVEL const). This method has the advantage of compiling only the relevant messages, while optimizing out the unused ones. In order to allow runtime control over the debug_level, while optimizing out messages when debug messages are not needed, we combine some methods: 1. use dynamic_debug (pr_debug) rather then printk. 2. add debug_level module param in order to set debug level during insmod. 3. add debug_level sysfs file in order to allow dynamic control over the debug level. Since patches for pr_debug_hex_dump() implementation haven't been applied yet, we are still temporarly using print_hex_dump(). Signed-off-by: Eliad Peller Signed-off-by: Luciano Coelho commit ea559b460509b241cc1a3f36eebe0b2b634b3cf2 Author: Guy Eilam Date: Thu Dec 9 16:54:59 2010 +0200 wl1271: fixed problem with WPS IEs in probe requests Inclusion of a WPS IE in probe requests caused a problem in the driver due to the maximum size of the probe request template and the max_scan_ie_len values at initialization. Increased the size of probe request template to the maximum size allowed by the firmware. Struct wl12xx_probe_req_template, which was only used for calculating the max size of the probe request template, is no longer used and needed. max_scan_ie_len is used for validating the size of additional IEs in scan requests. Initialized the max_scan_ie_len field to the maximum size of the probe request template minus the ieee80211 header size. Signed-off-by: Guy Eilam Signed-off-by: Luciano Coelho commit 0dce631092f410bb22b21b3d47ef20d69389dfd9 Author: Arnaud Lacombe Date: Sun Dec 5 01:33:16 2010 -0500 kconfig: nuke second argument of conf_write_symbol() Replacing S_TRISTATE by S_BOOLEAN is a no-op for conf_write_symbol(). Signed-off-by: Arnaud Lacombe [mmarek: Fix unused variable warning in conf_write()] Signed-off-by: Michal Marek commit c5312772156bb5f9b2e95e4c91526d578426a069 Author: Eliad Peller Date: Thu Dec 9 11:31:27 2010 +0200 wl12xx: add auto-arp support The auto-arp feature of wl12xx allows the firmware to automatically response to arp requests asking for its ip. in order to use it, we configure the arp response template and enable the corresponding bit in wl1271_acx_arp_filter (along with passing its ip) Signed-off-by: Eliad Peller Signed-off-by: Luciano Coelho commit b69eb80bf7a6922fef8056d42b06124a7de31501 Author: Roger Quadros Date: Wed Dec 1 11:58:54 2010 +0200 wl1271_sdio_test: Add module for sdio RX/TX testing This module enables individually generating RX and TX traffic over the SDIO bus on which the WL1271 chipset is connected. This is required to perform RF interference testing. The module takes 2 module parameters 'rx' and 'tx'. To generate RX traffic: modprobe wl1271_sdio_test rx=1 To generate TX traffic: modprobe wl1271_sdio_test tx=1 To generate both RX & TX traffic, set both rx and tx to 1. You can change the testing configuration at runtime by changing the rx & tx values at /sys/modules/wl1271_sdio_test/ To stop testing simply unload the module. Signed-off-by: Roger Quadros Reviewed-by: Carlos Chinea Signed-off-by: Luciano Coelho commit fb6a6819fad0d71b47577a51709440a9f8441f0a Author: Luciano Coelho Date: Fri Dec 3 17:05:40 2010 +0200 wl12xx: disable 11a channels when wl->enable_11a is known Disabling the 11a channels when not supported in the reg_notify function was not working as it should, because when the driver is initiailizing (and registering itself with mac80211), it would get the reg notification too early. At that point the driver wouldn't have received the NVS yet, so it wouldn't know whether 11a was supported. To fix this, we disable 11a channels when we read the NVS instead. Also, it is easier (and still safe) to set n_channels to zero instead of setting the disabled flag on every 11a channel. Signed-off-by: Luciano Coelho commit 6e71fabe9e60b1c6db587fbeac349848647920ab Author: Arnaud Lacombe Date: Sun Dec 5 01:31:57 2010 -0500 kconfig: do not define AUTOCONF_INCLUDED AUTOCONF_INCLUDED is not checked is not used within the tree and its parent header, `autoconf.h', is safe to be re-included. Signed-off-by: Arnaud Lacombe Signed-off-by: Michal Marek commit 8fbf397c3389c1dedfa9ee412715046ab28fd82d Author: Will Deacon Date: Wed Dec 1 17:37:45 2010 +0000 ARM: hw_breakpoint: do not fail initcall if monitor mode is disabled The debug registers can only be manipulated from software if monitor debug mode is enabled. On some cores, this can never be enabled (i.e. the corresponding bit in the DSCR is RAZ/WI). This patch ensures we can handle this hardware configuration and fail gracefully, rather than blow up the kernel during boot. Reported-by: Cyril Chemparathy Signed-off-by: Will Deacon commit 52f6c5ad430e41736133acac179607b224eaaa11 Author: Randy Dunlap Date: Wed Dec 15 17:58:57 2010 +0800 crypto: ghash-intel - ghash-clmulni-intel_glue needs err.h Add missing header file: arch/x86/crypto/ghash-clmulni-intel_glue.c:256: error: implicit declaration of function 'IS_ERR' arch/x86/crypto/ghash-clmulni-intel_glue.c:257: error: implicit declaration of function 'PTR_ERR' Signed-off-by: Randy Dunlap Signed-off-by: Herbert Xu commit 96f3e2568456402769f3998e111746941f549dc6 Author: Lothar WaĂŸmann Date: Mon Nov 22 09:39:51 2010 +0100 MXC IOMUX-V3 replace struct pad_desc with bitmapped cookie (step 2) This patch actually replaces the 'struct pad_desc' with a u64 cookie to facilitate adding platform specific pad_ctrl settings to an existing pad definition. So, instead of: iomux_v3_cfg_t power_key = MX51_PAD_EIM_A27__GPIO_2_21; power_key.pad_ctrl = MX51_GPIO_PAD_CTRL_2; mxc_iomux_v3_setup_pad(&power_key); one can write: mxc_iomux_v3_setup_pad((MX51_PAD_EIM_A27__GPIO_2_21 & ~MUX_PAD_CTRL_MASK) | MX51_GPIO_PAD_CTRL_2); Patch applies to branch 'imx-for-2.6.38' of git://git.pengutronix.de/git/imx/linux-2.6 Signed-Off-By: Lothar WaĂŸmann Signed-off-by: Sascha Hauer commit ed41390fa57a21d06e6e3a3c4bc238bab8957fbb Author: Tejun Heo Date: Tue Dec 14 16:23:10 2010 +0100 workqueue: deprecate cancel_rearming_delayed_work[queue]() There's no in-kernel user left for these two obsolete functions. Mark them deprecated and schedule for removal during 2.6.39 cycle. Signed-off-by: Tejun Heo Acked-by: David S. Miller commit afe2c511fb2d75f1515081ff1be15bd79cfe722d Author: Tejun Heo Date: Tue Dec 14 16:21:17 2010 +0100 workqueue: convert cancel_rearming_delayed_work[queue]() users to cancel_delayed_work_sync() cancel_rearming_delayed_work[queue]() has been superceded by cancel_delayed_work_sync() quite some time ago. Convert all the in-kernel users. The conversions are completely equivalent and trivial. Signed-off-by: Tejun Heo Acked-by: "David S. Miller" Acked-by: Greg Kroah-Hartman Acked-by: Evgeniy Polyakov Cc: Jeff Garzik Cc: Benjamin Herrenschmidt Cc: Mauro Carvalho Chehab Cc: netdev@vger.kernel.org Cc: Anton Vorontsov Cc: David Woodhouse Cc: "J. Bruce Fields" Cc: Neil Brown Cc: Alex Elder Cc: xfs-masters@oss.sgi.com Cc: Christoph Lameter Cc: Pekka Enberg Cc: Andrew Morton Cc: netfilter-devel@vger.kernel.org Cc: Trond Myklebust Cc: linux-nfs@vger.kernel.org commit b99ddbf83c064382b145d2156cc819d1eb4fc54d Author: Tomi Valkeinen Date: Tue Dec 14 14:39:06 2010 +0200 OMAP: OMAPFB: disable old omapfb for OMAP4 builds Build fails when OMAP4 and FB_OMAP are defined: drivers/built-in.o: In function `omapfb_do_probe': drivers/video/omap/omapfb_main.c:1773: undefined reference to `omap2_int_ctrl' Old omapfb does not work on OMAP4, and never will. Change the omapfb build dependency so that old omapfb depends on OMAP1/2/3, fixing the build for plain OMAP4 builds. Reported-by: Russell King Signed-off-by: Tomi Valkeinen commit 4422c04bbb09f1864e2ce27296457f86d4167fe2 Author: Tomi Valkeinen Date: Tue Dec 14 14:16:59 2010 +0200 OMAP: DSS: VRAM: Align start & size of vram to 2M Align the start address and size of VRAM area to 2M as per comments from Russell King: > > So, why SZ_2M? > > Firstly, that's the granularity which we allocate page tables - one > Linux page table covers 2MB of memory. We want to avoid creating page > tables for the main memory mapping as that increases TLB pressure through > the use of additional TLB entries, and more page table walks. > > Plus, we never used to allow the kernel's direct memory mapping to be > mapped at anything less than section size - this restriction has since > been lifted due to OMAP SRAM problems, but I'd rather we stuck with it > to ensure that we have proper behaviour from all parts of the system. > > Secondly, we don't want to end up with lots of fragmentation at the end > of the memory mapping as that'll reduce performance, not only by making > the pfn_valid() search more expensive. > > Emsuring a minimum allocation size and alignment makes sure that the > regions can be coalesced together into one block, and minimises run-time > expenses. > > So please, 2MB, or if you object, at the _very_ _least_ 1MB. But > definitely not PAGE_SIZE. Signed-off-by: Tomi Valkeinen Acked-by: Tony Lindgren commit ac612407932be18697b5ae9da0a80f138b8bea8e Author: David Henningsson Date: Wed Dec 15 09:18:18 2010 +0100 ALSA: HDA: Enable subwoofer on Asus G73Jw Set default association/sequence right on pin 0x17 in order for the automatic parser to recognize the subwoofer correctly. Signed-off-by: David Henningsson Signed-off-by: Takashi Iwai commit ab4e0192196b8d4e43a3945742d4996da934a86f Author: Dmitry Torokhov Date: Tue Dec 14 23:53:21 2010 -0800 Input: define separate EVIOCGKEYCODE_V2/EVIOCSKEYCODE_V2 The desire to keep old names for the EVIOCGKEYCODE/EVIOCSKEYCODE while extending them to support large scancodes was a mistake. While we tried to keep ABI intact (and we succeeded in doing that, programs compiled on older kernels will work on newer ones) there is still a problem with recompiling existing software with newer kernel headers. New kernel headers will supply updated ioctl numbers and kernel will expect that userspace will use struct input_keymap_entry to set and retrieve keymap data. But since the names of ioctls are still the same userspace will happily compile even if not adjusted to make use of the new structure and will start miraculously fail in the field. To avoid this issue let's revert EVIOCGKEYCODE/EVIOCSKEYCODE definitions and add EVIOCGKEYCODE_V2/EVIOCSKEYCODE_V2 so that userspace can explicitly select the style of ioctls it wants to employ. Reviewed-by: Henrik Rydberg Acked-by: Jarod Wilson Acked-by: Mauro Carvalho Chehab Signed-off-by: Dmitry Torokhov commit fe67b24010c66a14d84117ac67d23ed1bcb18a71 Author: David Henningsson Date: Wed Dec 15 08:01:46 2010 +0100 ALSA: HDA: Fix auto-mute on Lenovo Edge 14 BugLink: http://launchpad.net/bugs/690530 The SKU value of this machine dictates that auto-mute should be disabled. Since the SKU value is similar to the PCI SSID, the most likely conclusion is that the SKU value should be ignored. Signed-off-by: David Henningsson Signed-off-by: Takashi Iwai commit 3b1826cebe1d534ec05417a29b9a9f82651a5cb5 Author: Mimi Zohar Date: Mon Dec 13 16:53:13 2010 -0500 encrypted-keys: style and other cleanup Cleanup based on David Howells suggestions: - use static const char arrays instead of #define - rename init_sdesc to alloc_sdesc - convert 'unsigned int' definitions to 'size_t' - revert remaining 'const unsigned int' definitions to 'unsigned int' Signed-off-by: Mimi Zohar Acked-by: David Howells Signed-off-by: James Morris commit 1f35065a9e2573427ce3fd6c4a40b355c2ddfb92 Author: Mimi Zohar Date: Mon Dec 13 16:53:12 2010 -0500 encrypted-keys: verify datablob size before converting to binary Verify the hex ascii datablob length is correct before converting the IV, encrypted data, and HMAC to binary. Reported-by: David Howells Signed-off-by: Mimi Zohar Acked-by: David Howells Signed-off-by: James Morris commit 1bdbb4024c309e470711b434a24fb356fc92edea Author: Mimi Zohar Date: Mon Dec 13 16:53:11 2010 -0500 trusted-keys: kzalloc and other cleanup Cleanup based on David Howells suggestions: - replace kzalloc, where possible, with kmalloc - revert 'const unsigned int' definitions to 'unsigned int' Signed-off-by: David Safford Acked-by: Mimi Zohar Acked-by: David Howells Signed-off-by: James Morris commit bc5e0af0b36b6cc9de301074426c279fc9b72675 Author: Mimi Zohar Date: Mon Dec 13 16:53:10 2010 -0500 trusted-keys: additional TSS return code and other error handling Previously not all TSS return codes were tested, as they were all eventually caught by the TPM. Now all returns are tested and handled immediately. This patch also fixes memory leaks in error and non-error paths. Signed-off-by: David Safford Acked-by: Mimi Zohar Acked-by: David Howells Acked-by: Serge E. Hallyn Signed-off-by: James Morris commit df127ee375af4cb40b979605e0c336fc79bd38e7 Author: Tony Lindgren Date: Tue Dec 14 19:17:31 2010 -0800 omap: Fix setting omap_irq_base for 2430 We need to test for 24xx not 242x. Otherwise interrupts won't work. Reported-by: Rajendra Nayak Signed-off-by: Tony Lindgren commit 0fcdcfbbc98f70f559e4b36773a69972489a6d8f Merge: 6d5e93c2aa1248b25f9de0eaca1dca038e31d79d 2d64672ed38721b7a3815009d79bfb90a1f34a17 Author: Linus Torvalds Date: Tue Dec 14 18:50:10 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq: workqueue: It is likely that WORKER_NOT_RUNNING is true MAINTAINERS: Add workqueue entry workqueue: check the allocation of system_unbound_wq commit 6d5e93c2aa1248b25f9de0eaca1dca038e31d79d Merge: 3d0b6087f3f2c88caef25e1455ff8db0816d4e11 589a594be1fb8815b3f18e517be696c48664f728 Author: Linus Torvalds Date: Tue Dec 14 18:49:40 2010 -0800 Merge branch 'for-linus' of git://neil.brown.name/md * 'for-linus' of git://neil.brown.name/md: md: protect against NULL reference when waiting to start a raid10. md: fix bug with re-adding of partially recovered device. md: fix possible deadlock in handling flush requests. md: move code in to submit_flushes. md: remove handling of flush_pending in md_submit_flush_data commit 3d0b6087f3f2c88caef25e1455ff8db0816d4e11 Author: Major Lee Date: Fri Dec 10 10:13:49 2010 +0000 dw_spi: Fix missing final read in some polling situations There is a possibility that the last word of a transaction will be lost if data is not ready. Re-read in poll_transfer() to solve this issue when poll_mode is enabled. Verified on SPI touch screen device. Signed-off-by: Major Lee Signed-off-by: Alan Cox Signed-off-by: Linus Torvalds commit 54efdfeb49f03adfd0196935335890469ed314b9 Author: Alan Cox Date: Tue Dec 14 15:29:08 2010 +0000 i2c_intel_mid: Fix slash in sysfs name This gets caught by the new sanity check code. Instead of the slash use a different symbol. This was originally found by Major Lee who proposed a rather more complex patch which changed the name according to the chip type. On the basis that we are in a late -rc and making Linus grumpy isn't always a good idea (however fun) this is a simple alternative. Signed-off-by: Alan Cox Signed-off-by: Linus Torvalds commit 6d5c3aa84b3e431f2d0fc39c73c867d1a4dd8cff Author: Aaro Koskinen Date: Tue Dec 14 21:45:31 2010 -0500 ext4: fix typo which broke '..' detection in ext4_find_entry() There should be a check for the NUL character instead of '0'. Fortunately the only thing that cares about this is NFS serving, which is why we didn't notice this in the merge window testing. Reported-by: Phil Carmody Signed-off-by: Aaro Koskinen Signed-off-by: "Theodore Ts'o" commit dbd9fd63bdc7d73f3822a5e9dfaa6654e530518c Merge: ec5d043f2809b9aaf14e6676ddb0dc8c3a6dc8de 21b6e4c7106b2d68a6710506d8706608272fd78b Author: Linus Torvalds Date: Tue Dec 14 17:37:08 2010 -0800 Merge branch 'sh-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 * 'sh-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6: sh: wire up accept4 syscall (non-multiplexed path) sh: Enable deprecated IRQ chip APIs for MFD and GPIOLIB drivers. commit ec5d043f2809b9aaf14e6676ddb0dc8c3a6dc8de Merge: fc47e672ee2a8dfcde7673997c8b1e0cec38e2c9 c2015dc88a57090bcf67ab7cfcdbc34671598d36 Author: Linus Torvalds Date: Tue Dec 14 17:36:35 2010 -0800 Merge branch 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6 * 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6: OMAP2: PRCM: fix some SHIFT macros that were actually bitmasks OMAP2+: PM/serial: fix console semaphore acquire during suspend OMAP1: SRAM: fix size for OMAP1611 SoCs arm: omap2: io: fix clk_get() error check arm: plat-omap: counter_32k: use IS_ERR() instead of NULL check omap: nand: remove hardware ECC as default omap: zoom: wl1271 slot is MMC_CAP_POWER_OFF_CARD omap: PM debug: fix wake-on-timer debugfs dependency commit fc47e672ee2a8dfcde7673997c8b1e0cec38e2c9 Merge: 478b2a34e7d496b0cc3ae7696362740f954c91ba 85b093bcc5322baa811a03ec73de0909c157f181 Author: Linus Torvalds Date: Tue Dec 14 17:36:10 2010 -0800 Merge master.kernel.org:/home/rmk/linux-2.6-arm * master.kernel.org:/home/rmk/linux-2.6-arm: ARM: 6535/1: V6 MPCore v6_dma_inv_range and v6_dma_flush_range RWFO fix ARM: 6534/1: Make CONFIG_FPE_NWFPE depend on !CONFIG_THUMB2_KERNEL ARM: 6533/1: Thumb-2: Make CONFIG_THUMB2_KERNEL depend on !CPU_V6 Change bcmring Maintainer list. ARM: Update mach-types ARM: 6528/1: Use CTR for the I-cache line size on ARMv7 ARM: 6527/1: Use CTR instead of CCSIDR for the D-cache line size on ARMv7 ARM: pxa/palm: fix ifdef around gen_nand driver registration ARM: pxa: fix pxa2xx-flash section mismatch ARM: mmp2: remove not used clk_rtc commit 478b2a34e7d496b0cc3ae7696362740f954c91ba Merge: b4fe2a03422e6bd20bd8df5e428109a85c9ea961 595a251c0740785fd3c0d2156d78578c7479811e Author: Linus Torvalds Date: Tue Dec 14 17:34:00 2010 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6: sparc: Write to prom console using indirect buffer. sparc: Delete prom_*getchar(). sparc: Pass buffer pointer all the way down to prom_{get,put}char(). sparc: Do not export prom_nb{get,put}char(). sparc64: Delete prom_setcallback(). sparc64: Unexport prom_service_exists(). sparc: Kill prom devops_{32,64}.c sparc: Remove prom_pathtoinode() sparc64: Delete prom_puts() unused. SPARC/LEON: removed constant timer initialization as if HZ=100, now it reflects the value of HZ commit b4fe2a03422e6bd20bd8df5e428109a85c9ea961 Merge: 85cb7f1264c4d9e60ccdce52740238222e77ccd0 2a27a03d3a891e87ca33d27a858b4db734a4cbab Author: Linus Torvalds Date: Tue Dec 14 17:33:40 2010 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (75 commits) pppoe.c: Fix kernel panic caused by __pppoe_xmit WAN: Fix a TX IRQ causing BUG() in PC300 and PCI200SYN drivers. bnx2x: Advance a version number to 1.60.01-0 bnx2x: Fixed a compilation warning bnx2x: LSO code was broken on BE platforms qlge: Fix deadlock when cancelling worker. net: fix skb_defer_rx_timestamp() cxgb4vf: Ingress Queue Entry Size needs to be 64 bytes phy: add the IC+ IP1001 driver atm: correct sysfs 'device' link creation and parent relationships MAINTAINERS: remove me from tulip SCTP: Fix SCTP_SET_PEER_PRIMARY_ADDR to accpet v4mapped address enic: Bug Fix: Pass napi reference to the isr that services receive queue ipv6: fix nl group when advertising a new link connector: add module alias net: Document the kernel_recvmsg() function r8169: Fix runtime power management hso: IP checksuming doesn't work on GE0301 option cards xfrm: Fix xfrm_state_migrate leak net: Convert netpoll blocking api in bonding driver to be a counter ... commit 85cb7f1264c4d9e60ccdce52740238222e77ccd0 Merge: 3373c3ddb26848beee7b8a96fb98d89533dbf9d7 7c03b87048f2467087ae7e51392e5fb57ea8f58b Author: Linus Torvalds Date: Tue Dec 14 17:32:56 2010 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6: [SCSI] hpsa: fix redefinition of PCI_DEVICE_ID_CISSF [SCSI] qla2xxx: Update version number to 8.03.05-k0. [SCSI] qla2xxx: Properly set the return value in qla2xxx_eh_abort function. [SCSI] qla2xxx: Correct issue where NPIV-config data was not being allocated for 82xx parts. [SCSI] qla2xxx: Change MSI initialization from using incorrect request_irq parameter. [SCSI] qla2xxx: Populate Command Type 6 LUN field properly. [SCSI] zfcp: Issue FCP command without holding SCSI host_lock [SCSI] zfcp: Prevent usage w/o holding a reference [SCSI] zfcp: No ERP escalation on gpn_ft eval [SCSI] zfcp: Correct false abort data assignment. [SCSI] zfcp: Fix common FCP request reception [SCSI] Eliminate error handler overload of the SCSI serial number [SCSI] pmcraid: disable msix and expand device config entry [SCSI] bsg: correct fault if queue object removed while dev_t open [SCSI] osd: checking NULL instead of ERR_PTR() commit 3373c3ddb26848beee7b8a96fb98d89533dbf9d7 Merge: 3907969596091f429b7864cfe4e473a227876a96 8863ada9c47503bb93eba5e3a9ba88e6311db31f Author: Linus Torvalds Date: Tue Dec 14 14:35:04 2010 -0800 Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/linux-2.6-kgdb * 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/linux-2.6-kgdb: kgdboc,input: Fix regression with keyboard release key and early debugging commit 3907969596091f429b7864cfe4e473a227876a96 Merge: 66ef6aa63defa54b2c7e8edcc69e0641d2bb61ef 23437b5c50f523a87ca5c02fd883b069ca8be7f3 Author: Linus Torvalds Date: Tue Dec 14 14:33:33 2010 -0800 Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 * 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6: ACPI / PM: Do not save/restore NVS on Sony Vaio VGN-NW130D ACPI/HEST: adjust section selection ACPI: eliminate unused variable warning for !ACPI_SLEEP ACPI/PNP: avoid section mismatch warning ACPI thermal: remove two unused functions ACPI: fix a section mismatch ACPI, APEI, use raw spinlock in ERST ACPI: video: fix build for CONFIG_ACPI=n ACPI: video: fix build for VIDEO_OUTPUT_CONTROL=n ACPI: fix allowing to add/remove multiple _OSI strings acpi: fix _OSI string setup regression ACPI: EC: Add another dmi match entry for MSI hardware ACPI battery: update status upon sysfs query ACPI ac: update AC status upon sysfs query ACPI / PM: Do not refcount power resources that can't be turned on ACPI / PM: Check device state before refcounting power resources commit 66ef6aa63defa54b2c7e8edcc69e0641d2bb61ef Merge: 1c00802d3f62769a88e46212fae6f38082d30731 56b9aea3b740be7665be100872a913da9bdc653b Author: Linus Torvalds Date: Tue Dec 14 14:33:13 2010 -0800 Merge branch 'idle-release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-idle-2.6 * 'idle-release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-idle-2.6: intel_idle: recognize ARAT on WSM-EX commit 85b093bcc5322baa811a03ec73de0909c157f181 Author: Valentine Barshak Date: Tue Dec 14 00:03:16 2010 +0100 ARM: 6535/1: V6 MPCore v6_dma_inv_range and v6_dma_flush_range RWFO fix Cache ownership must be acquired by reading/writing data from the cache line to make cache operation have the desired effect on the SMP MPCore CPU. However, the ownership is never acquired in the v6_dma_inv_range function when cleaning the first line and flushing the last one, in case the address is not aligned to D_CACHE_LINE_SIZE boundary. Fix this by reading/writing data if needed, before performing cache operations. While at it, fix v6_dma_flush_range to prevent RWFO outside the buffer. Cc: stable@kernel.org Signed-off-by: Valentine Barshak Signed-off-by: George G. Davis Acked-by: Catalin Marinas Signed-off-by: Russell King commit 593c252a731389ffdd00d4cb2d20192c47aa18c1 Author: Dave Martin Date: Mon Dec 13 21:56:03 2010 +0100 ARM: 6534/1: Make CONFIG_FPE_NWFPE depend on !CONFIG_THUMB2_KERNEL Because the nwfpe support is unlikely to be used on new platforms and requires CONFIG_OABI_COMPAT, which is not generally used with ARMv7+, we shouldn't expect to build nwfpe support into a Thumb-2 kernel. At present, nwfpe contains assembly code which isn't Thumb-2 compatible, and for now it doesn't appear useful to port this code. All ARMv7-A/R platforms necessarily have VFPv3 hardware floating- point natively, making emulation unnecessary. Signed-off-by: Dave Martin Acked-by: Catalin Marinas Acked-by: Nicolas Pitre Acked-by: Santosh Shilimkar Signed-off-by: Russell King commit 6e6fc998b8c127fe06b9350a1f16e41bfe4f109d Author: Dave Martin Date: Mon Dec 13 21:53:53 2010 +0100 ARM: 6533/1: Thumb-2: Make CONFIG_THUMB2_KERNEL depend on !CPU_V6 This makes sense, because Thumb-2 code can't execute on plain ARMv6 processors. This will avoid accidentally configuring a broken kernel where the config otherwise would allow multiple architecture versions to coexist in the same kernel. Not adding !CPU_V5 etc., because the chance of anyone trying to put v5 and v7 in the same kernel is low, and I'm not aware of any mach which can do this. These could be added later if it matters. Note that the rules may need to be refined if support for the ARM1156J(F)-S processor is later added to the kernel, since this processor supports the rare ARMv6T2 extensions, which add support for Thumb-2 and a few other ARMv7 features. Signed-off-by: Dave Martin Acked-by: Catalin Marinas Acked-by: Nicolas Pitre Acked-by: Santosh Shilimkar Signed-off-by: Russell King commit 41263fc6716dea402125c95f38ed83ebf59d5172 Author: Ben Gardiner Date: Tue Dec 14 11:39:44 2010 -0500 kbuild: fix interaction of CONFIG_IKCONFIG and KCONFIG_CONFIG If you try to build a kernel with KCONFIG_CONFIG set (to a value not equal to .config) and that config sets CONFIG_IKCONFIG then the build will fail with: make[1]: *** No rule to make target `.config', needed by \ `kernel/config_data.gz'. Stop. because the kernel/Makefile contains a direct reference to .config. This issue has been present since the introduction of KCONFIG_CONFIG in 14cdd3c402bf7c66f0bcd76e290f0770a54a4b21. Signed-off-by: Ben Gardiner CC: Roman Zippel CC: Michal Marek Reviewed-by: Michal Marek Signed-off-by: Michal Marek commit 448f53a1ede54eb854d036abf54573281412d650 Author: Chris Wilson Date: Tue Dec 14 20:06:20 2010 +0000 drm/i915/bios: Reverse order of 100/120 Mhz SSC clocks Fixes the lack of output on the LVDS panel of the Lenovo U160. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=31596 Reported-and-tested-by: Dirk Gouders Cc: stable@kernel.org Signed-off-by: Chris Wilson commit d6db46675dba21203378b6993068ec04bb53389c Author: Jiandong Zheng Date: Tue Dec 14 21:55:49 2010 +0000 Change bcmring Maintainer list. I am Jiandong Zheng working on BCMRING in Broadcom Canada Ltd. I am replacing Leo Chen (leochen@broadcom.com) as "ARM/BCMRING ARM ARCHITECTURE" and "ARM/BCMRING MTD NAND DRIVER" maintainer from Broadcom as he is no longer the maintainer of these components. Signed-off-by: Jiandong Zheng Acked-by: Scott Branden Signed-off-by: Russell King commit 1c00802d3f62769a88e46212fae6f38082d30731 Merge: dc99bf78238a7554578a319d8fd06655151121a3 e504b84805c574cf18d705c610c9e4a8f6e61017 Author: Linus Torvalds Date: Tue Dec 14 13:37:12 2010 -0800 Merge branch 'fbdev-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6 * 'fbdev-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6: fbdev: Fix fb_find_nearest_mode refresh comparison commit dc99bf78238a7554578a319d8fd06655151121a3 Merge: 5d43a1de26f37080b75d7c0cf2a0b97523457568 0a6bf658c3b9d1d0e520d320b6392c8680c2e381 Author: Linus Torvalds Date: Tue Dec 14 13:36:26 2010 -0800 Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/staging * 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/staging: hwmon: (ltc4215) make sysfs file match the alarm cause commit 5d43a1de26f37080b75d7c0cf2a0b97523457568 Merge: 7103b71b0ff6a5d8d71438e63dfc539a6f0a61bd 59a609d9b59be9452f168fe228befea53d5962ff Author: Linus Torvalds Date: Tue Dec 14 13:35:47 2010 -0800 Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx * 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx: dmaengine: at_hdmac: fix buffer transfer size specification fsldma: fix issue of slow dma dmaengine i.MX SDMA: initialize on module_init dma : EG20T PCH: Fix miss-setting DMA descriptor intel_mid_dma: fix section mismatch warnings dmaengine: imx-sdma: fix bug in buffer descriptor initialization drivers/dma/ppc4xx: Use printf extension %pR for struct resource drivers/dma/ioat: Use the ccflag-y instead of EXTRA_CFLAGS drivers/dma/: Use the ccflag-y instead of EXTRA_CFLAGS dma: intel_mid_dma: fix double free on mid_setup_dma error path dma: imx-dma: fix imxdma_probe error path commit 7103b71b0ff6a5d8d71438e63dfc539a6f0a61bd Merge: a49cd5f6e9035151c1a0ba1e27fe155f0b82f1d6 7182afea8d1afd432a17c18162cc3fd441d0da93 Author: Linus Torvalds Date: Tue Dec 14 13:34:25 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: IB/uverbs: Handle large number of entries in poll CQ commit a49cd5f6e9035151c1a0ba1e27fe155f0b82f1d6 Merge: 353495a5abcee1368a93f71b0e49390f96f24fb4 9993e0fe0f5f29c69e79efcb271ffc9843002985 Author: Linus Torvalds Date: Tue Dec 14 13:33:52 2010 -0800 Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6 * 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6: firewire: ohci: fix regression with Agere FW643 rev 06, disable MSI firewire: ohci: fix regression with VIA VT6315, disable MSI commit 353495a5abcee1368a93f71b0e49390f96f24fb4 Merge: f9ae3e125ceb8226c94d7d0c640927fa8b7f256a 1b39ed0cf51193f3ba03044369ab4d144712a9b8 Author: Linus Torvalds Date: Tue Dec 14 13:33:21 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6: regulator: tps6586x: correct register table regulator: tps6586x: Handle both enable reg/bits being the same regulator: tps6586x: Fix TPS6586X_DVM to store goreg/bit regulator: tps6586x: Add missing bit mask generation commit f9ae3e125ceb8226c94d7d0c640927fa8b7f256a Merge: 6371e82307237dede71f884ad8e8e11faa75e8be d70ab7f7ee0692efc880d772dc5c212174d67e3b Author: Linus Torvalds Date: Tue Dec 14 13:32:40 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: ALSA: HDA: Quirk for Dell Vostro 320 to make microphone work ALSA: hda - Reset sample sizes and max bitrates when reading ELD ALSA: hda - Always allow basic audio irrespective of ELD info ALSA: hda - Do not wrongly restrict min_channels based on ELD ASoC: Correct WM8962 interrupt mask register read ASoC: WM8580: Debug BCLK and sample size ASoC: Fix resource leak if soc_register_ac97_dai_link failed ASoC: Hold client_mutex while calling snd_soc_instantiate_cards() ASoC: Fix swap of left and right channels for WM8993/4 speaker boost gain ASoC: Fix off by one error in WM8994 EQ register bank size ALSA: hda: Use position_fix=1 for Acer Aspire 5538 to enable capture on internal mic ALSA: hda - Enable jack sense for Thinkpad Edge 13 ALSA: hda - Fix ThinkPad T410[s] docking station line-out ALSA: hda: Use model=lg quirk for LG P1 Express to enable playback and capture commit 6371e82307237dede71f884ad8e8e11faa75e8be Merge: c3606c60a91969cc42c12bae71a022ca56de83d2 e726f3c368e7c1919a7166ec09c5705759f1a69d Author: Linus Torvalds Date: Tue Dec 14 13:32:19 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp: amd64_edac: Fix interleaving check EDAC: Correct MiB_TO_PAGES() macro EDAC: Fix workqueue-related crashes commit c3606c60a91969cc42c12bae71a022ca56de83d2 Merge: d5f04ff5fba75e3e9607a65f46cfbfbdf8d69ce4 f3886f85cfde578f1d0ba6e40ac5f9d70043923b Author: Linus Torvalds Date: Tue Dec 14 13:31:49 2010 -0800 Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 * 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: drm/radeon/kms: don't apply 7xx HDP flush workaround on AGP drm: use after free in drm_queue_vblank_event() drm/kms: remove spaces from connector names (v2) commit d5f04ff5fba75e3e9607a65f46cfbfbdf8d69ce4 Merge: 5111711d3ed8f4f1012cac3ec3f2b463b549fbfd 8b0f1840a46449e1946fc88860ef3ec8d6b1c2c7 Author: Linus Torvalds Date: Tue Dec 14 13:31:23 2010 -0800 Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging * 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging: hwmon: (adm1026) Allow 1 as a valid divider value hwmon: (adm1026) Fix setting fan_div hwmon: (it87) Fix manual fan speed control on IT8721F commit ba9effa2ecdc08325bd297d541b4207b2df38184 Author: Kirill A. Shutemov Date: Mon Dec 13 19:10:29 2010 +0200 kbuild: export linux/{a.out,kvm,kvm_para}.h on headers_install_all Export linux/a.out.h, linux/kvm.h and linux/kvm_para.h on headers_install_all if at least one architecture has appropriate files in arch-dependent headers. Signed-off-by: Kirill A. Shutemov Signed-off-by: Michal Marek commit f6820308e025d645d9d766c97586badd4ddb8754 Author: Kirill A. Shutemov Date: Mon Dec 13 19:10:28 2010 +0200 kbuild: introduce HDR_ARCH_LIST for headers_install_all Using HDR_ARCH_LIST you can specify subset of architectures you want to get headers for. Signed-off-by: Kirill A. Shutemov Signed-off-by: Michal Marek commit 56e6417b49132d4f56e9f2241d31942b90b46315 Author: Eduardo Costa Date: Tue Dec 14 14:37:59 2010 -0600 p54usb: New USB ID for Gemtek WUBI-100GW This USB ID is for the WUBI-100GW 802.11g Wireless LAN USB Device that uses p54usb. Signed-off-by: Larry Finger Signed-off-by: Eduardo Costa Cc: Stable Signed-off-by: John W. Linville commit 8990c1bc4be46473ad19bf2fa612ca57286f3df4 Merge: 2979076fbf17a0947d6eba367b0cac19c907c160 c8ddb2713c624f432fa5fe3c7ecffcdda46ea0d4 Author: Michal Marek Date: Tue Dec 14 22:01:55 2010 +0100 Merge commit 'v2.6.37-rc1' into kbuild/kbuild commit d33e455337ea2c71d09d7f4367d6ad6dd32b6965 Author: David S. Miller Date: Tue Dec 14 13:01:14 2010 -0800 net: Abstract default MTU metric calculation behind an accessor. Like RTAX_ADVMSS, make the default calculation go through a dst_ops method rather than caching the computation in the routing cache entries. Now dst metrics are pretty much left as-is when new entries are created, thus optimizing metric sharing becomes a real possibility. Signed-off-by: David S. Miller commit 88606e80da0e8d862a42ee19e5bb60b01b940ea7 Author: Thomas Gleixner Date: Tue Dec 14 21:37:13 2010 +0100 MAINTAINERS: Update timer related entries Bring the existing file list up to date and add a new entry for timekeeping and ntp. Assign John Stultz to this new entry so he gets all the blame :) Signed-off-by: Thomas Gleixner Cc: John Stultz commit 1449032be17abb69116dbc393f67ceb8bd034f92 Author: Theodore Ts'o Date: Tue Dec 14 15:27:50 2010 -0500 ext4: Turn off multiple page-io submission by default Jon Nelson has found a test case which causes postgresql to fail with the error: psql:t.sql:4: ERROR: invalid page header in block 38269 of relation base/16384/16581 Under memory pressure, it looks like part of a file can end up getting replaced by zero's. Until we can figure out the cause, we'll roll back the change and use block_write_full_page() instead of ext4_bio_write_page(). The new, more efficient writing function can be used via the mount option mblk_io_submit, so we can test and fix the new page I/O code. To reproduce the problem, install postgres 8.4 or 9.0, and pin enough memory such that the system just at the end of triggering writeback before running the following sql script: begin; create temporary table foo as select x as a, ARRAY[x] as b FROM generate_series(1, 10000000 ) AS x; create index foo_a_idx on foo (a); create index foo_b_idx on foo USING GIN (b); rollback; If the temporary table is created on a hard drive partition which is encrypted using dm_crypt, then under memory pressure, approximately 30-40% of the time, pgsql will issue the above failure. This patch should fix this problem, and the problem will come back if the file system is mounted with the mblk_io_submit mount option. Reported-by: Jon Nelson Signed-off-by: "Theodore Ts'o" commit 9fe146aef44afe5ec677d8150b6ae94e09b773f7 Merge: 6389aa73ab8c15084fce18307a8e198eaff818da 4e53f78e5b06c073a5c10814c72e98c1ca8a9f10 Author: David S. Miller Date: Tue Dec 14 11:33:23 2010 -0800 Merge branch 'vhost-net-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost commit ac61d143ffe2a6db4d4bcf47c21a5159d6a1b644 Author: Russell King Date: Mon Dec 6 10:38:14 2010 +0000 ARM: GIC: move enablement of PPI interrupts to gic.c Avoid adding nasty genirq-specific code to local timers to enable PPI interrupts. Instead, provide a gic function to do this. Signed-off-by: Russell King commit 7627dc802a98aebebc6a34e5b6558ea4717c968c Author: Russell King Date: Sun Dec 5 08:51:38 2010 +0000 ARM: GIC: private a standard get_irqnr_preamble assembler macro Provide a standard get_irqnr_preamble assembler macro for platforms to use, which retrieves the base address of the GIC CPU interface from gic_cpu_base_addr. Allow platforms to override this by defining HAVE_GET_IRQNR_PREAMBLE. Reviewed-by: Catalin Marinas Tested-by: Abhijeet Dharmapurikar Signed-off-by: Russell King commit bef8f9ee32511a28f1c9a7d3b8c51cdac030b564 Author: Russell King Date: Sat Dec 4 16:50:58 2010 +0000 ARM: GIC: move gic_data[] initialization into gic_init() This avoids writing unnecessarily to gic_data[] from other CPUs, making this a mostly read-only variable. Reviewed-by: Catalin Marinas Tested-by: Abhijeet Dharmapurikar Signed-off-by: Russell King commit ff2e27ae0b17f53a6a289c87d325f706598f3788 Author: Russell King Date: Sat Dec 4 16:13:29 2010 +0000 ARM: GIC: consolidate gic_cpu_base_addr to common GIC code Every architecture using the GIC has a gic_cpu_base_addr pointer for GIC 0 for their entry assembly code to use to decode the cause of the current interrupt. Move this into the common GIC code. Reviewed-by: Catalin Marinas Tested-by: Abhijeet Dharmapurikar Signed-off-by: Russell King commit 384895330e0f3954d9478fd0853145f9c169df12 Author: Russell King Date: Sat Dec 4 16:01:03 2010 +0000 ARM: GIC: Remove MMIO address from gic_cpu_init, rename to gic_secondary_init We don't need to re-pass the base address for the CPU interfaces to the GIC for secondary CPUs, as it will never be different from the boot CPU - and even if it was, we'd overwrite the boot CPU's base address. Get rid of this argument, and rename to gic_secondary_init(). Reviewed-by: Catalin Marinas Tested-by: Abhijeet Dharmapurikar Signed-off-by: Russell King commit b580b899dd05a007ad232ee49a07b32d91876462 Author: Russell King Date: Sat Dec 4 15:55:14 2010 +0000 ARM: GIC: provide a single initialization function for boot CPU Provide gic_init() which initializes the GIC distributor and current CPU's GIC interface for the boot (or single) CPU. Reviewed-by: Catalin Marinas Tested-by: Abhijeet Dharmapurikar Signed-off-by: Russell King commit 5111711d3ed8f4f1012cac3ec3f2b463b549fbfd Merge: e13cf63f2bbd38721af557f0205da994ea068427 c1ac3ffcd0bc7e9617f62be8c7043d53ab84deac Author: Linus Torvalds Date: Tue Dec 14 11:09:05 2010 -0800 Merge branch 'for-2.6.37' of git://linux-nfs.org/~bfields/linux * 'for-2.6.37' of git://linux-nfs.org/~bfields/linux: nfsd: Fix possible BUG_ON firing in set_change_info sunrpc: prevent use-after-free on clearing XPT_BUSY commit e13cf63f2bbd38721af557f0205da994ea068427 Merge: 073f21ae1319348f4f8630003b7901e3be254327 83a50de97fe96aca82389e061862ed760ece2283 Author: Linus Torvalds Date: Tue Dec 14 11:08:13 2010 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable * git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable: Btrfs: prevent RAID level downgrades when space is low Btrfs: account for missing devices in RAID allocation profiles Btrfs: EIO when we fail to read tree roots Btrfs: fix compiler warnings Btrfs: Make async snapshot ioctl more generic Btrfs: pwrite blocked when writing from the mmaped buffer of the same page Btrfs: Fix a crash when mounting a subvolume Btrfs: fix sync subvol/snapshot creation Btrfs: Fix page leak in compressed writeback path Btrfs: do not BUG if we fail to remove the orphan item for dead snapshots Btrfs: fixup return code for btrfs_del_orphan_item Btrfs: do not do fast caching if we are allocating blocks for tree_root Btrfs: deal with space cache errors better Btrfs: fix use after free in O_DIRECT commit 073f21ae1319348f4f8630003b7901e3be254327 Merge: 497b5b13c9e946651991e0296374a15d38590ce1 7572777eef78ebdee1ecb7c258c0ef94d35bad16 Author: Linus Torvalds Date: Tue Dec 14 11:07:39 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse: fuse: verify ioctl retries fuse: fix ioctl when server is 32bit commit 497b5b13c9e946651991e0296374a15d38590ce1 Merge: e97b71ded9ebe527681961c9e6f5ba99f6711974 05340d4ab2ec2b6b4962c1c41c6ea8fb550f947b Author: Linus Torvalds Date: Tue Dec 14 11:06:17 2010 -0800 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs * 'for-linus' of git://oss.sgi.com/xfs/xfs: xfs: log timestamp changes to the source inode in rename commit e97b71ded9ebe527681961c9e6f5ba99f6711974 Merge: 38971ce2fac484249d697fe48a9b0851a0b62572 1cd275f609ba46c8cae3ee77e499c54a0d13a983 Author: Linus Torvalds Date: Tue Dec 14 11:02:15 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client: ceph: fix ioctl magic ceph: Behave better when handling file lock replies. ceph: pass lock information by struct file_lock instead of as individual params. ceph: Handle file locks in replies from the MDS. ceph: avoid possible null deref in readdir after dir llseek commit 6389aa73ab8c15084fce18307a8e198eaff818da Merge: 0dbaee3b37e118a96bb7b8eb0d9bbaeeb46264be 1d212aa96e1b63459486f729af9a3fa38768b801 Author: David S. Miller Date: Tue Dec 14 10:52:54 2010 -0800 Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 commit 38971ce2fac484249d697fe48a9b0851a0b62572 Merge: caa4a59574a39e6574664e82b92455d41eca27a8 5b362ac3799ff4225c40935500f520cad4d7ed66 Author: Linus Torvalds Date: Tue Dec 14 08:51:12 2010 -0800 Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6 * 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6: NFS: Fix panic after nfs_umount() nfs: remove extraneous and problematic calls to nfs_clear_request nfs: kernel should return EPROTONOSUPPORT when not support NFSv4 NFS: Fix fcntl F_GETLK not reporting some conflicts nfs: Discard ACL cache on mode update NFS: Readdir cleanups NFS: nfs_readdir_search_for_cookie() don't mark as eof if cookie not found NFS: Fix a memory leak in nfs_readdir Call the filesystem back whenever a page is removed from the page cache NFS: Ensure we use the correct cookie in nfs_readdir_xdr_filler commit caa4a59574a39e6574664e82b92455d41eca27a8 Merge: 6313e3c21743cc88bb5bd8aa72948ee1e83937b6 545c988b2018a593f24d291b66776a0d08525acd Author: Linus Torvalds Date: Tue Dec 14 08:49:15 2010 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6: cifs: remove bogus remapping of error in cifs_filldir() cifs: allow calling cifs_build_path_to_root on incomplete cifs_sb cifs: fix check of error return from is_path_accessable cifs: remove Local_System_Name cifs: fix use of CONFIG_CIFS_ACL cifs: add attribute cache timeout (actimeo) tunable commit d52784eb3607bf887628742f99041b4f18d7d1de Author: akpm@linux-foundation.org Date: Tue Nov 30 13:52:14 2010 -0800 headers_check: Fix warning text Fix the warning text too, per Randy. Cc: Alexander Shishkin Cc: Michal Marek Cc: Randy Dunlap Cc: Stephen Hemminger Cc: WANG Cong Signed-off-by: Andrew Morton Signed-off-by: Michal Marek commit de323f22a83b024b7432e813609c6efb74b1bbfc Author: akpm@linux-foundation.org Date: Tue Nov 30 13:51:13 2010 -0800 headers_check: better search for functions in headers Some headers don't bother with "extern" in function prototypes, which results in said prototypes being unnoticed and exported to userland. This patch slightly improves detection of such cases by checking for C type names as well in the beginning of a line. Signed-off-by: Alexander Shishkin Cc: Stephen Hemminger Cc: Michal Marek Cc: WANG Cong Cc: Randy Dunlap Signed-off-by: Andrew Morton Signed-off-by: Michal Marek commit 2979076fbf17a0947d6eba367b0cac19c907c160 Author: Mike Frysinger Date: Tue Nov 23 19:54:02 2010 -0500 headers_install: check exit status of unifdef If unifdef fails for any reason (like segfaulting), we should be aborting the install steps. So check its exit status in this unlikely scenario. Reported-by: Diego Elio PettenĂ² Signed-off-by: Mike Frysinger Signed-off-by: Michal Marek commit 2d64672ed38721b7a3815009d79bfb90a1f34a17 Author: Steven Rostedt Date: Fri Dec 3 23:12:33 2010 -0500 workqueue: It is likely that WORKER_NOT_RUNNING is true Running the annotate branch profiler on three boxes, including my main box that runs firefox, evolution, xchat, and is part of the distcc farm, showed this with the likelys in the workqueue code: correct incorrect % Function File Line ------- --------- - -------- ---- ---- 96 996253 99 wq_worker_sleeping workqueue.c 703 96 996247 99 wq_worker_waking_up workqueue.c 677 The likely()s in this case were assuming that WORKER_NOT_RUNNING will most likely be false. But this is not the case. The reason is (and shown by adding trace_printks and testing it) that most of the time WORKER_PREP is set. In worker_thread() we have: worker_clr_flags(worker, WORKER_PREP); [ do work stuff ] worker_set_flags(worker, WORKER_PREP, false); (that 'false' means not to wake up an idle worker) The wq_worker_sleeping() is called from schedule when a worker thread is putting itself to sleep. Which happens most of the time outside of that [ do work stuff ]. The wq_worker_waking_up is called by the wakeup worker code, which is also callod outside that [ do work stuff ]. Thus, the likely and unlikely used by those two functions are actually backwards. Remove the annotation and let gcc figure it out. Acked-by: Tejun Heo Signed-off-by: Steven Rostedt Signed-off-by: Tejun Heo commit 3e6cd7a4b6a04cf354a18c9d2e7ecec8fa1772fb Author: Tejun Heo Date: Fri Dec 10 17:20:23 2010 +0100 MAINTAINERS: Add workqueue entry Signed-off-by: Tejun Heo commit 1874542d952bbea01997191aee868b472555fd9a Author: Florian Fainelli Date: Tue Dec 14 11:56:56 2010 +0100 HID: replace offsets values with their corresponding BTN_* defines Instead of using magic values, use their corresponding BTN_* defines from linux/input.h. Signed-off-by: Florian Fainelli Signed-off-by: Jiri Kosina commit 71f4566084eb592fe545f05f7dff41fa9aa42e0b Author: Chris Wilson Date: Tue Dec 14 11:29:23 2010 +0000 agp/intel: Fix missed cached memory flags setting in i965_write_entry() This fixes regression from a6963596a13e62f8e65b1cf3403a330ff2db407c, that missed to set cached memory type in GTT entry. Signed-off-by: Zhenyu Wang Signed-off-by: Chris Wilson commit c25bcd340033bf5b8dc30c16a99e64259f099446 Author: Benjamin Tissoires Date: Mon Dec 13 15:59:13 2010 +0100 HID: hid-mosart: support suspend/resume The device has 2 modes. The first one is an emulation of a touchscreen by sending left and right button, and the second mode is the one used in dual-touch (sending trackingID, touch and else). In case of a suspend/resume, the device switch back to the first mode described above (with left and right buttons). This adds a hook in .reset_resume for the device to be switched to the correct mode (I just copied the code in mosart_probe). Signed-off-by: Benjamin Tissoires Signed-off-by: Jiri Kosina commit ad6d42670279da8f33f633f8a96a67cd7ef3b1da Author: Benjamin Tissoires Date: Tue Dec 14 11:38:18 2010 +0100 HID: hid-mosart: ignore buttons report This commit allows the device to be recognized as a touchscreen, and not a touchpad by xf86-input-evdev. The device has 2 modes. The first one is an emulation of a touchscreen by sending left and right button, and the second mode is the one used in dual-touch (sending trackingID, touch and else). That's why there is a hid report containing left and right buttons (9000001 and 9000002). The point is that xorg relies on these fields to determine if it's a touchpad or a touchscreen. Clearing the report (return -1) makes xorg detecting it out of the box as a quite pleasant (dual)touchscreen. Signed-off-by: Benjamin Tissoires Acked-by: Chase Douglas Signed-off-by: Jiri Kosina commit 72f4d57923d2aa651db060a71a6f6211654c119e Author: Magnus Damm Date: Tue Dec 14 16:57:11 2010 +0900 ARM: mach-shmobile: sh73a0 SMP support Add SMP support for ag5evm and the sh73a0 processor. Onlining and offlining works well, but at this point offlined processor cores are not put into sleep mode. There is no spinlock for syncing the secondary core with the first one in this implementation. The code instead relies on the cpu_online() check in __cpu_up(). Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 4d7ec69576ca4427478405190bd32e560f06fe99 Author: Magnus Damm Date: Tue Dec 14 16:57:03 2010 +0900 ARM: mach-shmobile: Enable SMP support Allow SMP to be enabled on R-Mobile / SH-Mobile. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 1c51ed4fb9f11fa1e0873aa2d5b28f42a85ac299 Author: Magnus Damm Date: Tue Dec 14 16:56:55 2010 +0900 ARM: mach-shmobile: SMP base support Add SMP base support for R-Mobile / SH-Mobile processors. This patch contains all base code to support CONFIG_SMP regardless of ARCH_SHMOBILE processor type. Both local timer and CPU hotplug are supported, but no processor specific code is included. At this point only the default behavior is in place, so a single core will always be used even though CONFIG_SMP is enabled on multicore systems. The SMP Kconfig entry for arch/arm/Kconfig is excluded from this patch to simplify merging. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 6dff7da2adbba9c5cd1b3a3f67191fe3471c663c Author: Yusuke Goda Date: Tue Dec 14 14:18:03 2010 +0900 ARM: mach-shmobile: mackerel: Add sdhi support Signed-off-by: Yusuke Goda Signed-off-by: Paul Mundt commit 09dd7ded60019d6a4fd2ae20a08c4ad2bc3ed3e9 Author: Magnus Damm Date: Tue Dec 14 16:15:35 2010 +0900 ARM: mach-shmobile: Fix up pinmux entries in Makefile Compiling in multiple CPUs into the same kernel binary requires a Makefile update. With this patch in place it is possible to enable the pinmux code for both the SH7372 and the SH7377. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 3b80ffdef001ac7ff53bdcb80ad2baadb5953f91 Author: Joe Perches Date: Mon Dec 13 13:42:21 2010 -0800 video: mx3fb: Use vsprintf extension %pR for struct resource Signed-off-by: Joe Perches Signed-off-by: Paul Mundt commit e504b84805c574cf18d705c610c9e4a8f6e61017 Author: Andrew Kephart Date: Mon Dec 13 09:46:34 2010 -0600 fbdev: Fix fb_find_nearest_mode refresh comparison Refresh rate nearness is not calculated or reset when nearest resolution changes. This patch resets the refresh rate differential measurement whenever a new nearest resolution is discovered. This fixes two error cases; first, wherein the first mode's refresh rate differential is never calculated and second, when the closest refresh rate from a previous nearest resolution is erroneously preserved. Signed-off-by: Andrew Kephart Signed-off-by: Paul Mundt commit 21b6e4c7106b2d68a6710506d8706608272fd78b Author: Carmelo AMOROSO Date: Mon Dec 13 10:20:26 2010 +0000 sh: wire up accept4 syscall (non-multiplexed path) Signed-off-by: Carmelo Amoroso Signed-off-by: Paul Mundt commit 28a4f908acb342350b9ecbfcdf0a999cb83e05aa Author: Fabio Estevam Date: Mon Dec 13 10:47:05 2010 -0200 ARM: mx5: check for error in ioremap Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit bb477de2efc560e55c4a830329273661f3664bc8 Author: Arnaud Patard (Rtp) Date: Wed Dec 1 09:37:17 2010 +0100 Fix imx cpufreq driver as module When building as module: ERROR: "cpufreq_gov_performance" [arch/arm/plat-mxc/cpufreq.ko] undefined! WARNING: modpost: Found 1 section mismatch(es). To see full details build your kernel with: 'make CONFIG_DEBUG_SECTION_MISMATCH=y' make[1]: *** [__modpost] Error 1 make: *** [modules] Error 2 It's due to the driver using CPUFREQ_DEFAULT_GOVERNOR, even it should not (see commit 8122c6cea033e8034e99d3b10a4e3f377ce23994 in Linus tree), so remove it. Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit cdc3f10630ecddb7870e087ff9679eef3d7b4e21 Author: Peter Horton Date: Mon Dec 6 11:37:38 2010 +0000 mx51: support FIQ on TZIC, revised Add support for FIQ on mx51 TZIC TZIC changes tested with FIQ audio on an mx51 board AVIC changes build with mx3_defconfig, not tested Signed-off-by: Peter Horton Signed-off-by: Sascha Hauer commit 8be9252f7ccde4148e4b203bf64d38ae66b111e4 Author: Fabio Estevam Date: Tue Dec 7 17:14:45 2010 -0200 ARM: imx/mx27_3ds: Add watchdog support Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit bfdde3a90b6d1c508e4f305dd385efd234fcdd66 Author: Fabio Estevam Date: Tue Dec 7 17:14:44 2010 -0200 ARM: mx3/mx31_3ds: Add watchdog support Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit f25972233fbe4b60dc4b514def4caf40aa1bb85a Author: Peter Horton Date: Fri Dec 3 17:07:28 2010 +0000 mx51: add SSI3 Add SSI3 to MX51 Signed-off-by: Peter Horton Signed-off-by: Sascha Hauer commit 2c1f4672f0711e7f23ae49cbb7541088126fe576 Author: Fabio Estevam Date: Tue Dec 7 14:16:04 2010 -0200 watchdog: imx: use clk_get to acquire the watchdog clock Use clk_get to acquire the watchdog clock and also avoid hardcoding the clock name. Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit 59a609d9b59be9452f168fe228befea53d5962ff Author: Nicolas Ferre Date: Mon Dec 13 13:48:41 2010 +0100 dmaengine: at_hdmac: fix buffer transfer size specification Buffer transfer size is the number of transfers to be performed in relation with the width of the _source_ interface. So in the DMA_FROM_DEVICE case, it should be the register width that should be taken into account. Signed-off-by: Nicolas Ferre Signed-off-by: Dan Williams commit 8863ada9c47503bb93eba5e3a9ba88e6311db31f Author: Jason Wessel Date: Wed Dec 1 13:01:01 2010 -0600 kgdboc,input: Fix regression with keyboard release key and early debugging The commit 111c182340cd22e238ab1cc6564df336c6ebd7cb (kgdboc: reset input devices (keyboards) when exiting debugger) introduced a regression in early debugging such that you get a kernel oops on continue (with the go command) if you boot a kernel with: earlyprintk=vga ekgdboc=kbd kgdbwait The restore kgdboc_restore_input() routine schedules work for the purpose of sending key release events for any keys that were in the depressed state prior to entering the kernel debugger. A simple fix to the crash is to not invoke the schedule_work() if the kernel system_state is anything other than SYSTEM_RUNNING. Signed-off-by: Jason Wessel Acked-by: Dmitry Torokhov Reviewed-by: Sergei Shtylyov commit d96c9043d1588f04c7f467167f653c07d83232d5 Author: Sage Weil Date: Mon Dec 13 20:30:28 2010 -0800 ceph: fix msgr_init error path create_workqueue() returns NULL on failure. Signed-off-by: Sage Weil commit 23437b5c50f523a87ca5c02fd883b069ca8be7f3 Merge: 6cc5615f7c4decd7b6c4da9317d0e0b5fbdf7290 291a73c9be15f12046a7291ec0bf7176a58d4f14 Author: Len Brown Date: Mon Dec 13 22:40:54 2010 -0500 Merge branch 'bugzilla-23002' into release commit 291a73c9be15f12046a7291ec0bf7176a58d4f14 Author: Rafael J. Wysocki Date: Sun Dec 12 21:10:42 2010 +0100 ACPI / PM: Do not save/restore NVS on Sony Vaio VGN-NW130D The saving of the NVS memory area during suspend and restoring it during resume causes problems to appear on Sony Vaio VGN-NW130D, so blacklist that machine to avoid those problems. Addresses https://bugzilla.kernel.org/show_bug.cgi?id=23002 Signed-off-by: Rafael J. Wysocki Reported-and-tested-by: Adriano Signed-off-by: Len Brown commit 83a50de97fe96aca82389e061862ed760ece2283 Author: Chris Mason Date: Mon Dec 13 15:06:46 2010 -0500 Btrfs: prevent RAID level downgrades when space is low The extent allocator has code that allows us to fill allocations from any available block group, even if it doesn't match the raid level we've requested. This was put in because adding a new drive to a filesystem made with the default mkfs options actually upgrades the metadata from single spindle dup to full RAID1. But, the code also allows us to allocate from a raid0 chunk when we really want a raid1 or raid10 chunk. This can cause big trouble because mkfs creates a small (4MB) raid0 chunk for data and metadata which then goes unused for raid1/raid10 installs. The allocator will happily wander in and allocate from that chunk when things get tight, which is not correct. The fix here is to make sure that we provide duplication when the caller has asked for it. It does all the dups to be any raid level, which preserves the dup->raid1 upgrade abilities. Signed-off-by: Chris Mason commit cd02dca56442e1504fd6bc5b96f7f1870162b266 Author: Chris Mason Date: Mon Dec 13 14:56:23 2010 -0500 Btrfs: account for missing devices in RAID allocation profiles When we mount in RAID degraded mode without adding a new device to replace the failed one, we can end up using the wrong RAID flags for allocations. This results in strange combinations of block groups (raid1 in a raid10 filesystem) and corruptions when we try to allocate blocks from single spindle chunks on drives that are actually missing. The first device has two small 4MB chunks in it that mkfs creates and these are usually unused in a raid1 or raid10 setup. But, in -o degraded, the allocator will fall back to these because the mask of desired raid groups isn't correct. The fix here is to count the missing devices as we build up the list of devices in the system. This count is used when picking the raid level to make sure we continue using the same levels that were in place before we lost a drive. Signed-off-by: Chris Mason commit 7f99d946e71e71d484b7543b49e990508e70d0c0 Author: Suresh Siddha Date: Tue Nov 30 22:22:29 2010 -0800 x86, vt-d: Handle previous faults after enabling fault handling Fault handling is getting enabled after enabling the interrupt-remapping (as the success of interrupt-remapping can affect the apic mode and hence the fault handling mode). Hence there can potentially be some faults between the window of enabling interrupt-remapping in the vt-d and the fault-handling of the vt-d units. Handle any previous faults after enabling the vt-d fault handling. For v2.6.38 cleanup, need to check if we can remove the dmar_fault() in the enable_intr_remapping() and see if we can enable fault handling along with enabling intr-remapping. Signed-off-by: Suresh Siddha LKML-Reference: <20101201062244.630417138@intel.com> Cc: stable@kernel.org [v2.6.32+] Acked-by: Chris Wright Signed-off-by: H. Peter Anvin commit 7f7fbf45c6b748074546f7f16b9488ca71de99c1 Author: Kenji Kaneshige Date: Tue Nov 30 22:22:28 2010 -0800 x86: Enable the intr-remap fault handling after local APIC setup Interrupt-remapping gets enabled very early in the boot, as it determines the apic mode that the processor can use. And the current code enables the vt-d fault handling before the setup_local_APIC(). And hence the APIC LDR registers and data structure in the memory may not be initialized. So the vt-d fault handling in logical xapic/x2apic modes were broken. Fix this by enabling the vt-d fault handling in the end_local_APIC_setup() A cleaner fix of enabling fault handling while enabling intr-remapping will be addressed for v2.6.38. [ Enabling intr-remapping determines the usage of x2apic mode and the apic mode determines the fault-handling configuration. ] Signed-off-by: Kenji Kaneshige LKML-Reference: <20101201062244.541996375@intel.com> Signed-off-by: Suresh Siddha Cc: stable@kernel.org [v2.6.32+] Acked-by: Chris Wright Signed-off-by: H. Peter Anvin commit 086e8ced65d9bcc4a8e8f1cd39b09640f2883f90 Author: Kenji Kaneshige Date: Wed Dec 1 09:40:32 2010 -0800 x86, vt-d: Fix the vt-d fault handling irq migration in the x2apic mode In x2apic mode, we need to set the upper address register of the fault handling interrupt register of the vt-d hardware. Without this irq migration of the vt-d fault handling interrupt is broken. Signed-off-by: Kenji Kaneshige LKML-Reference: <1291225233.2648.39.camel@sbsiddha-MOBL3> Signed-off-by: Suresh Siddha Cc: stable@kernel.org [v2.6.32+] Acked-by: Chris Wright Tested-by: Takao Indoh Signed-off-by: H. Peter Anvin commit 254e42006c893f45bca48f313536fcba12206418 Author: Suresh Siddha Date: Mon Dec 6 12:26:30 2010 -0800 x86, vt-d: Quirk for masking vtd spec errors to platform error handling logic On platforms with Intel 7500 chipset, there were some reports of system hang/NMI's during kexec/kdump in the presence of interrupt-remapping enabled. During kdump, there is a window where the devices might be still using old kernel's interrupt information, while the kdump kernel is coming up. This can cause vt-d faults as the interrupt configuration from the old kernel map to null IRTE entries in the new kernel etc. (with out interrupt-remapping enabled, we still have the same issue but in this case we will see benign spurious interrupt hit the new kernel). Based on platform config settings, these platforms seem to generate NMI/SMI when a vt-d fault happens and there were reports that the resulting SMI causes the system to hang. Fix it by masking vt-d spec defined errors to platform error reporting logic. VT-d spec related errors are already handled by the VT-d OS code, so need to report the same error through other channels. Signed-off-by: Suresh Siddha LKML-Reference: <1291667190.2675.8.camel@sbsiddha-MOBL3.sc.intel.com> Cc: stable@kernel.org [v2.6.32+] Reported-by: Max Asbock Reported-and-tested-by: Takao Indoh Acked-by: Chris Wright Acked-by: Kenji Kaneshige Signed-off-by: H. Peter Anvin commit 3fb82d56ad003e804923185316236f26b30dfdd5 Author: Suresh Siddha Date: Tue Nov 23 16:11:40 2010 -0800 x86, suspend: Avoid unnecessary smp alternatives switch during suspend/resume During suspend, we disable all the non boot cpus. And during resume we bring them all back again. So no need to do alternatives_smp_switch() in between. On my core 2 based laptop, this speeds up the suspend path by 15msec and the resume path by 5 msec (suspend/resume speed up differences can be attributed to the different P-states that the cpu is in during suspend/resume). Signed-off-by: Suresh Siddha LKML-Reference: <1290557500.4946.8.camel@sbsiddha-MOBL3.sc.intel.com> Cc: Rafael J. Wysocki Signed-off-by: H. Peter Anvin commit 10340ae130fb70352eae1ae8a00b7906d91bf166 Author: Suresh Siddha Date: Tue Nov 16 13:23:51 2010 -0800 x86, xsave: Use alloc_bootmem_align() instead of alloc_bootmem() Alignment of alloc_bootmem() depends on the value of L1_CACHE_SHIFT. What we need here, however, is 64 byte alignment. Use alloc_bootmem_align() and explicitly specify the alignment instead. This fixes a kernel boot crash reported by Jody when the cpu in .config is set to MPENTIUMII but the kernel is booted on a xsave-capable CPU. Reported-by: Jody Bruchon Signed-off-by: Suresh Siddha LKML-Reference: <20101116212442.059967454@sbsiddha-MOBL3.sc.intel.com> Signed-off-by: H. Peter Anvin Cc: commit 53dde5f385bc56e312f78b7cb25ffaf8efd4735d Author: Suresh Siddha Date: Tue Nov 16 13:23:50 2010 -0800 bootmem: Add alloc_bootmem_align() Add an alloc_bootmem_align() interface to allocate bootmem with specified alignment. This is necessary to be able to allocate the xsave area in a subsequent patch. Signed-off-by: Suresh Siddha LKML-Reference: <20101116212441.977574826@sbsiddha-MOBL3.sc.intel.com> Acked-by: H. Peter Anvin Signed-off-by: H. Peter Anvin Cc: commit de2a8cf98ecdde25231d6c5e7901e2cffaf32af9 Author: H. Peter Anvin Date: Mon Dec 13 16:01:38 2010 -0800 x86, gcc-4.6: Use gcc -m options when building vdso The vdso Makefile passes linker-style -m options not to the linker but to gcc. This happens to work with earlier gcc, but fails with gcc 4.6. Pass gcc-style -m options, instead. Note: all currently supported versions of gcc supports -m32, so there is no reason to conditionalize it any more. Reported-by: H. J. Lu Signed-off-by: H. Peter Anvin LKML-Reference: Cc: commit 65af8dea26aa89ae4a810bdaa05545a8e670b636 Author: Wey-Yi Guy Date: Wed Dec 8 07:51:50 2010 -0800 iwlagn: code clean up to remove duplicate code Multiple devices use almost the same .cfg with minor differences. Use macro and remove the duplication. By doing this, reduce the chance for mistake while modify .cfg parameters Signed-off-by: Wey-Yi Guy commit f21dd005df95e0fc6a578342c61b5333ce2abc2b Author: Wey-Yi Guy Date: Wed Dec 8 15:34:52 2010 -0800 iwlwifi: keep track of bt coex enable/disable stage For debugging purpose, keep track of the bt coex enable/disable state. Signed-off-by: Wey-Yi Guy commit 50619ac9ba48f5ab0c6bcfa10f5d50e4115cdca8 Author: Wey-Yi Guy Date: Tue Dec 7 08:06:31 2010 -0800 iwlwifi: do not reload fw if WiMAX own the RF For WiFi/WiMAX combo devices, if WiMAX own the RF, WiFi driver try to access RF and fail. This is the W/A to To avoid WiFi keep reloading firmware and try to access RF again. Signed-off-by: Wey-Yi Guy commit 33c68770a8605d84aea35c2cd90009edfc4b161a Author: Wey-Yi Guy Date: Fri Dec 3 10:33:36 2010 -0800 iwlagn: More detail tx power logging For enhanced tx power table in EEPROM, add more detail logging to help debugging Signed-off-by: Wey-Yi Guy commit d058ff8b9255b2a15bcb040cc9901baca66dc9c4 Author: Wey-Yi Guy Date: Fri Dec 3 10:33:35 2010 -0800 iwlwifi: use IWL_DEBUG_EEPROM for EEPROM related info For logging EEPROM related info, instead of using IWL_DEBUG_INFO, use the dedicated logging (IWL_DEBUG_EEPROM) for easier debugging Signed-off-by: Wey-Yi Guy commit fb4c32bba1e0941db5972e2b612cbfdf10522a43 Author: Wey-Yi Guy Date: Fri Dec 3 10:33:34 2010 -0800 iwlwifi: add new EEPROM debug log type Adding new debug type to log EEPROM related data Signed-off-by: Wey-Yi Guy commit c6fc108776e77e38e099d5b13c4f57a2172c6698 Author: Johannes Berg Date: Thu Dec 9 12:56:42 2010 -0800 iwlagn: remove old EEPROM TX power reading This removes the old TX power reading code, it isn't necessary since the new code is able to read all the various EEPROM layouts due to relying on information contained in the EEPROM. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit 8d6748ca73a0caffed4304a47a9cb4cd0aba361e Author: Johannes Berg Date: Thu Dec 9 09:30:14 2010 -0800 iwlagn: implement layout-agnostic EEPROM reading The current EEPROM reading code has some layout assumptions that now turned out to be false with some newer versions of the EEPROM. Luckily, we can avoid all such assumptions by using data in the EEPROM itself, so implement using that. However, for risk mitigation purposes, keep the old reading code for current hardware for now. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit e7362a0069f8448bb346d65f07d98b319f243e30 Author: Johannes Berg Date: Tue Nov 30 11:03:44 2010 -0800 iwlagn: rename enhanced txpower fields Some fields we didn't previously use from the enhanced TX power structure will be needed in the next patch, so rename them to their correct names to be able to use them and change code reading them accordingly. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit 17423ea8776362100b0a9a162cdd4b16b886a4a2 Author: Wey-Yi Guy Date: Mon Dec 6 11:51:39 2010 -0800 iwlagn: rx antenna diversity For the new 1x1 devices, hw and uCode will support rx antenna diversity, but we need to indicate 1x1 device to AccessPoint to make sure it won't use MIMO. Signed-off-by: Wey-Yi Guy commit 9decde95be8a77a16f5668544bee45d41a7ae665 Author: Johannes Berg Date: Tue Nov 30 13:24:36 2010 -0800 iwlagn: fix debug variable access The compiler correctly warns: iwl-agn-tx.c: In function ‘iwlagn_tx_status_reply_compressed_ba’: iwl-agn-tx.c:1240: warning: ‘bitmap’ may be used uninitialized in this function Move the debug print to the branch that reads the bitmap, and move the variables too so it's more obvious where they are needed. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit ae0b693c12cc78913085733d28e0e0e6020db6f4 Author: Shanyu Zhao Date: Thu Dec 2 11:02:28 2010 -0800 iwlagn: check ready in iwlagn_bss_info_changed() In function iwlagn_bss_info_changed(), we need to check if the driver is ready before doing real work. Also, the previously put WARN() is removed because the vif is not guaranteed to be valid. uCode restart routine will clear the vif. Signed-off-by: Shanyu Zhao Signed-off-by: Wey-Yi Guy commit a1da077bc36368eb7d6312e7e49260f0a3d92c77 Author: Shanyu Zhao Date: Thu Dec 2 11:02:54 2010 -0800 iwlwifi: clear dbg_fixed_rate during init This prevent bad fixed_rate keeps crashing uCode in an endless loop. Signed-off-by: Shanyu Zhao Signed-off-by: Wey-Yi Guy commit 4fb33244d17b973f17cbc7cf8b7efd0875950474 Author: Wey-Yi Guy Date: Mon Nov 29 10:45:16 2010 -0800 iwlagn: change led compensation for 6005 and 6030 devices For both 6005 and 6030 devices, change the led compensation to 57 Signed-off-by: Wey-Yi Guy commit f3c677b997757326e1f29d33060719a6a5091950 Author: Forrest Shi Date: Thu Dec 9 16:14:04 2010 +0800 fsldma: fix issue of slow dma Fixed fsl dma slow issue by initializing dma mode register with bandwidth control. It boosts dma performance and should works with 85xx board. Signed-off-by: Forrest Shi Signed-off-by: Li Yang Signed-off-by: Dan Williams commit 0dbaee3b37e118a96bb7b8eb0d9bbaeeb46264be Author: David S. Miller Date: Mon Dec 13 12:52:14 2010 -0800 net: Abstract default ADVMSS behind an accessor. Make all RTAX_ADVMSS metric accesses go through a new helper function, dst_metric_advmss(). Leave the actual default metric as "zero" in the real metric slot, and compute the actual default value dynamically via a new dst_ops AF specific callback. For stacked IPSEC routes, we use the advmss of the path which preserves existing behavior. Unlike ipv4/ipv6, DecNET ties the advmss to the mtu and thus updates advmss on pmtu updates. This inconsistency in advmss handling results in more raw metric accesses than I wish we ended up with. Signed-off-by: David S. Miller commit cc6f02dd490dac4ad821d5077b934c9b37037cd0 Author: Eric Dumazet Date: Mon Dec 13 12:50:49 2010 -0800 net: change ip_default_ttl documentation Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit cfb7e5f187e787bb1430decea339fdea6a669f92 Author: Tomoya Date: Sun Dec 12 20:24:26 2010 +0000 pch_can: Replace netif_rx to netif_receive_skb Since this driver is implemented as NAPI, netif_receive_skb must be used not netif_rx. Signed-off-by: Tomoya MORINAGA Acked-by: Marc Kleine-Budde Signed-off-by: David S. Miller commit 0c78ab76a05cd788af0383354ffe819e0617f6a0 Author: Tomoya Date: Sun Dec 12 20:24:25 2010 +0000 pch_can: Add setting TEC/REC statistics processing Add setting TEC/REC statistics processing. Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit fea9294c5f2902c45613681ad995ca27899d2016 Author: Tomoya Date: Sun Dec 12 20:24:24 2010 +0000 pch_can: Optimize "if" condition in rx/tx processing For reduce "if" condition, easy to read/understand the code, optimize "if" condition in rx/tx processing. Signed-off-by: Tomoya MORINAGA Acked-by: Marc Kleine-Budde Signed-off-by: David S. Miller commit 3332bc5446e034566e8a56bf7a7cd479ca35bd6d Author: Tomoya Date: Sun Dec 12 20:24:23 2010 +0000 pch_can: Fix incorrect return processing Fix incorrect return processing. Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit a6f6d6b51b110e661ae5f862d60c27da4970bec6 Author: Tomoya Date: Sun Dec 12 20:24:22 2010 +0000 pch_can: Move MSI processing to probe/remove processing Currently, in case this driver is integrated as module, and when this module is re-installed, no interrupts is to be occurred. For the above issue, move MSI processing to open/release processing. Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit c755145649fa73bd197ac1a73d141047c61b543a Author: Tomoya Date: Sun Dec 12 20:24:21 2010 +0000 pch_can: Comment optimization Comment optimization Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit d06848be64e13d5d1d73e581fb185e815893d8b7 Author: Tomoya Date: Sun Dec 12 20:24:20 2010 +0000 pch_can: Fix miss-setting status issue Modify miss-setting status issue at suspend. Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit 0e0805c4063d0611e282bb7fdebe2e223bfe7220 Author: Tomoya Date: Sun Dec 12 20:24:19 2010 +0000 pch_can: Fix bit timing calculation issue Modify like use calculated value directly passed by CAN core module. Signed-off-by: Tomoya MORINAGA Acked-by: Marc Kleine-Budde Signed-off-by: David S. Miller commit 8714fcaca63203fe10331fe530ff48d3dd31de4e Author: Tomoya Date: Sun Dec 12 20:24:18 2010 +0000 pch_can: Delete unnecessary/redundant code Delete unnecessary/redundant code Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit 9388b166a323f8f7e35eb7a0d17b297ca695fa91 Author: Tomoya Date: Sun Dec 12 20:24:17 2010 +0000 pch_can: Fix coding rule violation Fix coding rule violation. Signed-off-by: Tomoya MORINAGA Acked-by: Marc Kleine-Budde Signed-off-by: David S. Miller commit 435b4efe93d4cec3aa0b36e8707df8d292d3641b Author: Tomoya Date: Sun Dec 12 20:24:16 2010 +0000 pch_can: Replace netdev_dbg instead of dev_dbg partly For easy to readable, use netdev_dbg instead of dev_dbg partly Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit e91530ea959295a31911488c62088d5c372032ea Author: Tomoya Date: Sun Dec 12 20:24:15 2010 +0000 pch_can: Change Copyright and module description Currently, Copyright and module description are not formal. Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit 44c9aa890a2587f48920485b7487bc6d516dbbdf Author: Tomoya Date: Sun Dec 12 20:24:14 2010 +0000 pch_can: Reduce register access For improve tx/rx speed, reduce register access. Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit ca2b004e89484e89b1815157fae2d7f933c5af9e Author: Tomoya Date: Sun Dec 12 20:24:13 2010 +0000 pch_can: Change functions type Currently, these two functions spec(returned value) is unnatural. Thus, change the return value's spec Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit bd58cbc322e97550af5e12584324b7117180435d Author: Tomoya Date: Sun Dec 12 20:24:12 2010 +0000 pch_can: Rename function/macro name For easy to read/understand, Rename function/macro name. Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit 7f2bc50efeaeb1dff62ef7e128ae36499fbcf35d Author: Tomoya Date: Sun Dec 12 20:24:11 2010 +0000 pch_can: Fix warnings Currently, in case CONFIG_PM is disabled, compiler outputs warnings. Move six functions which are used only CONFIG_PM is enabled, into "#ifdef CONFIG_PM" area. Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit 1d5b4b2778e8e40f42ae5d9556777583f3556d81 Author: Tomoya Date: Sun Dec 12 20:24:10 2010 +0000 pch_can: Improve rx processing Replace complex "goto" to "do~while". For easy to read/understand, it divides a rx function into some functions. Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit 8ac9702b9d5d81b819fc7d6b4f6abad22af01f3c Author: Tomoya Date: Sun Dec 12 20:24:09 2010 +0000 pch_can: Fix endianness issue there is endianness issue both Tx and Rx. Currently, data is set like below. Register: MSB--LSB x x D0 D1 x x D2 D3 x x D4 D5 x x D6 D7 But Data to be sent must be set like below. Register: MSB--LSB x x D1 D0 x x D3 D2 x x D5 D4 x x D7 D6 (x means reserved area.) Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit e489ccebf14657774fd877dc841b458703730586 Author: Tomoya Date: Sun Dec 12 20:24:08 2010 +0000 pch_can: Divide poll function To easy to read/understand, divide poll function into two sub-functions. Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit 76d94b232940ca91e9b26c590cb7312ab88ff722 Author: Tomoya Date: Sun Dec 12 20:24:07 2010 +0000 pch_can: Add flow control processing Currently, there is no flow control processing. Thus, Add flow control processing as when there is no empty of tx buffer, netif_stop_queue is called. When there is empty buffer, netif_wake_queue is called. Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit 412b31334b831a8c2909afaca017c5a236ac2dd0 Author: Wolfgang Kufner Date: Mon Dec 13 12:39:39 2010 +0100 rt2x00: Fix firmware loading regression on x86_64. Commit 6175ddf06b6172046a329e3abfd9c901a43efd2e changes the way memcpy_toio() works for x86_64, causing firmware loading to fail for some Ralink WLAN devices with the rt2800pci driver since linux 2.6.34. This causes the log message: "phy0 -> rt2800pci_load_firmware: Error - PBF system register not ready.". Fix this by using __iowrite32_copy instead of memcpy_toio(). Signed-off-by: Wolfgang Kufner Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 739fd9405416e22732e46a9226a8cac379bd57fc Author: Wolfgang Kufner Date: Mon Dec 13 12:39:12 2010 +0100 rt2x00: Pad beacon to multiple of 32 bits. Pad beacon to a multiple of 32 bits in preparation for the change from memcpy_toio() to __iowrite32_copy() in register_multiwrite(). Signed-off-by: Wolfgang Kufner Acked-by: Helmut Schaa Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit e85b4c04646f7fa62ebf0afe11cd8dffde689da7 Author: Johannes Stezenbach Date: Mon Dec 13 12:38:49 2010 +0100 rt2x00: remove stray semicolon The stray semicolon after DEBUG_PRINTK_MSG causes things like "if (...) WARNING(...); else {}" to fail with syntax error. Signed-off-by: Johannes Stezenbach Acked-by: Gertjan van Wingerde Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit f615e9a38a8e6239d35891a05f2ac1159088780a Author: Ivo van Doorn Date: Mon Dec 13 12:36:38 2010 +0100 rt2x00: Fix WMM Queue naming The Queue names were incorrectly copied from the legacy drivers, as a result the queue names were inversed to what was expected. This renames the queues using this mapping: QID_AC_BK -> QID_AC_VO (priority 0) QID_AC_BE -> QID_AC_VI (priority 1) QID_AC_VI -> QID_AC_BE (priority 2) QID_AC_VO -> QID_AC_BK (priority 3) Note that this was a naming problem only, which didn't affect the assignment of frames to their respective queues. Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit dba5dc1ae9764902f46d5225c9ff40e4f7b614c7 Author: Ivo van Doorn Date: Mon Dec 13 12:36:18 2010 +0100 rt2x00: Introduce extra queue entry sanity flag Add a queue entry flag ENTRY_DATA_STATUS_PENDING, which can be used to indicate a queue entry has returned from the hardware and is waiting for status processing. Using this flag we can add some extra sanity checks to prevent queue corruption. Signed-off-by: Ivo van Doorn Acked-by: Helmut Schaa Signed-off-by: John W. Linville commit 64e7d72384c2ecef5a892b2243623af265dd83cc Author: Ivo van Doorn Date: Mon Dec 13 12:36:00 2010 +0100 rt2x00: Cleanup RX index counting Add the rt2x00_dmastart function to rt2x00lib which marks the queue_entry as "owned by device", and increased the Q_INDEX number. This cleanups up the index handling by rt2x00lib which at until so far used hackish approaches to keep the RX queue index numbering sane. The rt2x00pci.c changes are from Helmut Schaa Signed-off-by: Ivo van Doorn Signed-off-by: Helmut Schaa Signed-off-by: John W. Linville commit 5be65609fec2e331c7d804471be3d59089a30d98 Author: Ivo van Doorn Date: Mon Dec 13 12:35:40 2010 +0100 rt2x00: Add "flush" queue command Add a new command to the queue handlers: "flush", this moves the flush() callback from mac80211 into rt2x00queue and adds support for flushing the RX queue as well. Signed-off-by: Ivo van Doorn Acked-by: Helmut Schaa Signed-off-by: John W. Linville commit 0b7fde54f94979edc67bbf86b5adba702ebfefe8 Author: Ivo van Doorn Date: Mon Dec 13 12:35:17 2010 +0100 rt2x00: Protect queue control with mutex Add wrapper functions in rt2x00queue.c to start & stop queues. This control must be protected using a mutex. Queues can also be paused which will halt the flow of packets between the driver and mac80211. This doesn't require a mutex protection. Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit dbba306f2ae574450a7a5133d6637fe6f5fafc72 Author: Ivo van Doorn Date: Mon Dec 13 12:34:54 2010 +0100 rt2x00: Reorganize queue callback functions As part of the queue refactoring, change the queue callback function names to have 3 different actions: start, kick & stop. We can now also remove the STATE_RADIO_RX_ON/STATE_RADIO_RX_OFF device_state flags, and replace the usage with using the start_queue/stop_queue callback functions. This streamlines the RX queue handling to the similar approach as all other queues. Signed-off-by: Ivo van Doorn Acked-by: Helmut Schaa Signed-off-by: John W. Linville commit 5450b7e2f0b47e52175b31399d8186a74ef3c46d Author: Ivo van Doorn Date: Mon Dec 13 12:34:22 2010 +0100 rt2x00: Introduce 3 queue commands in drivers (start, kick, stop). As part of the queue refactoring, we now introduce 3 queue commands: start, kick, stop. - Start: will enable a queue, for TX this will not mean anything, while for beacons and RX this will update the registers to enable the queue. - Kick: This will kick all pending frames to the hardware. This is needed for the TX queue to push all frames to the HW after the queue has been started - Stop: This will stop the queue in the hardware, and cancel any pending work (So this doesn't mean the queue is empty after a stop!). Move all code from the drivers into the appropriate functions, and link those calls to the old rt2x00lib callback functions (we will fix this later when we refactor the queue control inside rt2x00lib). Signed-off-by: Ivo van Doorn Acked-by: Helmut Schaa Signed-off-by: John W. Linville commit 094a1d92fdb18c4455758b1c33e99d647c837ee9 Author: Johannes Stezenbach Date: Mon Dec 13 12:34:00 2010 +0100 rt2x00: trivial: add missing \n on warnings Signed-off-by: Johannes Stezenbach Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 89b25f60e08180d7e00e6239398b467142aaec01 Author: Helmut Schaa Date: Mon Dec 13 12:33:36 2010 +0100 rt2x00: Don't frequently reset beacon interval in AdHoc mode Commit 0204464329c17ba6d293e1899f71223599a0e582 "Check for specific changed flags when updating the erp config" changed the way in which a new beacon interval gets handled. However, due to a bug in rt2800usb and rt2800pci the beacon interval was reset during each scan, thus causing problems in AdHoc mode. Fix this by not cleaning up the beacon interval when killing the beacon queue but just prevent the device from sending out beacons. Reported-by: Wolfgang Kufner Signed-off-by: Helmut Schaa Acked-by: Gertjan van Wingerde Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit a061a93b6eb8db8227b251666436da1e344771a0 Author: Gertjan van Wingerde Date: Mon Dec 13 12:33:12 2010 +0100 rt2x00: Ensure TX-ed frames are returned in the original state. Recent changes to the TX-done code of rt2x00 resulted in TX-ed frames not being returned to mac80211 in the original state, and therefore with insufficient headroom for re-transmissions. Fix this by reverting the changes done and by ensuring we remove the inserted L2pad by moving the header backwards instead of the data forwards. At the same time also make sure that the rt2x00queue_remove_l2pad will not move any memory when a frame has no data at all. Signed-off-by: Gertjan van Wingerde Acked-by: Helmut Schaa Cc: Jay Hung Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit d7bb5f845f437662296adbfeaab8fbfce1c32289 Author: Johannes Stezenbach Date: Mon Dec 13 12:32:49 2010 +0100 rt2x00: fix hang when unplugging USB device in use When an rt2x00 USB device is unplugged while in use, it reliably hangs the whole system. After some time the watchdog prints: BUG: soft lockup - CPU#0 stuck for 64s! [kworker/u:0:5] ... [] (usb_submit_urb+0x0/0x2ac) from [] (rt2x00usb_kick_rx_entry+0xb4/0xe8 [rt2x00usb]) [] (rt2x00usb_kick_rx_entry+0x0/0xe8 [rt2x00usb]) from [] (rt2x00usb_clear_entry+x28/0x2c [rt2x00usb]) [] (rt2x00usb_clear_entry+0x0/0x2c [rt2x00usb]) from [] (rt2x00lib_rxdone+0x2e0/0x2f8 [rt2x00lib]) [] (rt2x00lib_rxdone+0x0/0x2f8 [rt2x00lib]) from [] (rt2x00usb_work_rxdone+0x54/0x74 [rt2x00usb]) [] (rt2x00usb_work_rxdone+0x0/0x74 [rt2x00usb]) from [] (process_one_work+0x20c/0x35c) Clear the DEVICE_STATE_PRESENT flag when usb_submit_urb() returns -ENODEV to fix this. Signed-off-by: Johannes Stezenbach Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 8d4ff3f3045e57f57634559c063bf70993a1d00a Author: RA-Jay Hung Date: Mon Dec 13 12:32:22 2010 +0100 rt2x00: Add RF chip definition Add RF chip definition Signed-off-by: RA-Jay Hung Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 977206d79fdc9fc1b153e0b52c56e0be59586f37 Author: Helmut Schaa Date: Mon Dec 13 12:31:58 2010 +0100 rt2x00: Implement get_survey callback for rt2800 Implement the get_survey callback to allow user space to read statistics about the current channel condition. Signed-off-by: Helmut Schaa Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 38c8a566fcfe080c910bb6b348d40121df2b8e88 Author: RA-Jay Hung Date: Mon Dec 13 12:31:27 2010 +0100 rt2x00: Add rt2800 EEPROM definition Add and modify NIC Configuration and LED definition of EEPROM Signed-off-by: RA-Jay Hung Acked-by: Gertjan van Wingerde Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 7a7793ef078e56fa395f96567630032c44ab5951 Author: Felix Fietkau Date: Mon Dec 13 08:40:56 2010 +0100 ath9k_hw: update AR9003 initvals to improve carrier leak calibration/correction Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit e172e0f8c25a513d253c07b1dc1d7e3c66a811ff Author: Felix Fietkau Date: Mon Dec 13 08:40:55 2010 +0100 ath9k_hw: update AR9003 initvals for improved radar detection Reduces the likelihood of false pulse detects in the hardware Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 1bf38661822049931a0ab8d2b43153b26cc919f6 Author: Felix Fietkau Date: Mon Dec 13 08:40:54 2010 +0100 ath9k_hw: fix PA predistortion training power selection The EEPROM contains scale factors for the tx power, which define the range of allowable difference between target power and training power. If the difference is too big, PA predistortion cannot be used. For 2.4 GHz there is only one scale factor, for 5 GHz there are three, depending on the specific frequency range. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 1782352d4908c79d195b43e0c1b6b109e0d93d05 Author: Felix Fietkau Date: Mon Dec 13 08:40:53 2010 +0100 ath9k_hw: fix the PA predistortion rate mask The EEPROM PAPRD rate mask fields only contain mask values for actual rates in the low 25 bits. The upper bits are reserved for tx power scale values. Add the proper mask definitions and use them before writing the values to the register. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 7607cbe2ad6931400c5d15ced342ab329ab8f92c Author: Felix Fietkau Date: Mon Dec 13 08:40:52 2010 +0100 ath9k: fix PA predistortion thermal measurement handling To be able to measure the thermal values correctly for PAPRD, we need to send training frames before setting up the gain table for the measurement, and then again afterwards for the actual training. For further improvement, send training frames at MCS0 instead of 54 MBit/s legacy. That way we can use the No-ACK flag for the transmission, which speeds up PAPRD training in general, as the hardware won't have to retransmit and wait for ACK timeout (was previously set to 4 * 6 transmission attempts). Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit caabf2bf228cd6b1c6197dbb25bddb4682d30c9d Author: Felix Fietkau Date: Mon Dec 13 08:40:51 2010 +0100 ath9k_hw: fix the slot time setting for long distance links Testing shows that adjusting the slot time based on the coverage class produces very high latencies and very low throughput on long distance links. Adjusting only the ACK timeout and leaving the slot time at the regular values - while technically not optimal for CSMA - works a lot better on long links (tested with 10 km distance) Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 4357c6bfc83d4e8b1f18588f640be27bf4b0d0f7 Author: Felix Fietkau Date: Mon Dec 13 08:40:50 2010 +0100 ath9k_hw: initialize ah->slottime (u32) -1 is not particularly useful as a slottime default, so even though the ath9k_hw default should never get used, it's better to pick something sane here. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 452d7dd816744efb5d0c22c2b038f2ffa5c7ec14 Author: Sujith Manoharan Date: Mon Dec 13 07:39:32 2010 +0530 ath9k_htc: Add Ubiquiti wifistation ext to supported devices Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit 62a957e99f6edced4a87f79cc49bfca42fe9a1a0 Author: Felix Fietkau Date: Sun Dec 12 00:51:14 2010 +0100 ath9k_hw: remove ah->txpower_indexoffset Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 5f65c309be7b9eae06136a5e7df43ea08b25d3f9 Author: Felix Fietkau Date: Sun Dec 12 00:51:13 2010 +0100 ath9k_hw: remove ah->beacon_interval Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 6da5a720bab3866ba23a37841f6a61d96e498a3f Author: Felix Fietkau Date: Sun Dec 12 00:51:12 2010 +0100 ath9k_hw: clean up SREV version checks There's no need to have separate callbacks for pre-AR9003 vs AR9003 SREV version checks, so just merge those into one function. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit df3c8b2b10b47429d2f3fe79d00daa38a3381aad Author: Felix Fietkau Date: Sun Dec 12 00:51:11 2010 +0100 ath9k_hw: remove antenna configuration eeprom ops and variables AR9280 based hardware with 3 antennas and slow antenna diversity has not been seen in the wild and ath9k does not support that form of antenna diversity, so remove the EEPROM ops for it. These EEPROM ops are currently only used for setting the AR_PHY_SWITCH_COM register, which is being done in the EEPROM specific file already. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 940cd2c12ebff688cfdc14f21c4b0e5b845ad47f Author: Felix Fietkau Date: Sun Dec 12 00:51:10 2010 +0100 ath9k_hw: merge the ar9287 version of ath9k_hw_get_gain_boundaries_pdadcs Also add a comment about a potential array overrun that needs to be reviewed. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 115277a3bc0683d04da797268ddafdc3bf67ca33 Author: Felix Fietkau Date: Sun Dec 12 00:51:09 2010 +0100 ath9k_hw: merge ath9k_hw_get_gain_boundaries_pdadcs between eeprom_def.c and eeprom_4k.c Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 4ddfcd7daf57247ff718b849a152d97a80b7ae4d Author: Felix Fietkau Date: Sun Dec 12 00:51:08 2010 +0100 ath9k_hw: clean up duplicate and unnused eeprom related defines AR*_MAX_RATE_POWER => MAX_RATE_POWER AR*_EEPROM_MODAL_SPURS => AR_EEPROM_MODAL_SPURS AR*_OPFLAGS_* => AR5416_OPFLAGS_* ... Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 040b74f741b20dbf07359716d5c540356a036ade Author: Felix Fietkau Date: Sun Dec 12 00:51:07 2010 +0100 ath9k_hw: only use the PCIe disable register write sequence for AR5416 Newer chips do not need this, and maybe these register writes could have negative side effects on newer hardware. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 248a38d0ed754bf9f002e66f3d607e12ae6a673c Author: Felix Fietkau Date: Fri Dec 10 21:16:46 2010 +0100 ath9k: fix sequence number assigment for non-AMPDU QoS data frames wireless-testing commit 04caf863750bc7e042d1e8d57e5ce9d6326ab435 ('ath9k: more tx setup cleanups') merged tx path code for HT vs non-HT frames, however it did not pass the tid pointer to ath_tx_send_normal, causing an inconsistency between AMPDU vs non-AMPDU sequence number handling. Fix this by always passing in the tid pointer for all QoS data frames. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 207aba6018a7b1757b5248ced2b280d20790c498 Author: Johannes Berg Date: Fri Dec 10 17:10:44 2010 +0100 mac80211: support IBSS RSN with SW crypto When software crypto is used, mac80211 will support IBSS RSN, it doesn't depend on the driver in that case. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 9abbfb27dd96361187bb3872b2c349a76f5e09e9 Author: Sujith Manoharan Date: Fri Dec 10 11:27:06 2010 +0530 ath9k: Use power save wrappers for TSF get/set The HW has to be awake when accessing registers. Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit 44316cb1e97a1e7f76eb3f07e5b0ba91d72e9693 Author: Bing Zhao Date: Thu Dec 9 18:24:41 2010 -0800 ieee80211: add Parameter Set Count bitmask WMM IE QoS Info field lower 4 bits: Parameter Set Count Signed-off-by: Bing Zhao Signed-off-by: John W. Linville commit 91f44b02992f632ac6c070f985cd58d5acee4199 Author: Tim Harvey Date: Thu Dec 9 13:15:45 2010 -0800 mac80211 default tx_last_beacon false (congestion) The 802.11 spec states that the STA that generated the last Beacon frame shall be the STA that response to a probe request. This is important for congestion reduction when a probe request is received - only 1 node in an adhoc BSS will transmit a response. While mac80211 drivers should provide the tx_last_beacon function to report if they transmitted the last beacon many do not. As an attempt to reduce probe response congestion default this to 0 such that a node not implementing this capability does not contribute to unnecessary congestion. In a modern medium sized office environment I see upwards of 100 probe requests per second received at a given node from various hardware/OS/drivers doing zeroconf 'active probing' as opposed to passively listening for beacons. With a modest 10-node adhoc network consisting of drivers that do not implement this tx_last_beacon feature, I have seen this result in the simultaneous xmit of probe responses accumulating to 500 probe responses per second because of collisions which brings the adhoc network to its knees as well as causes needless congestion. Signed-off-by: John W. Linville commit 42ab135fe78025910bed8ff56e00a375f2b04db1 Author: RafaÅ‚ MiÅ‚ecki Date: Thu Dec 9 20:56:01 2010 +0100 b43: rename TMS defines, drop useless condition from core reset As discussed we do not know band width at core reset time and it is not a good idea to reset whole just to change band. So just set unconditionally 20 MHz band width as default during core reset. As for defines PHY clock changed to band width in specs and it makes much more sens to call defines by band width which is self-explainable. Updated specs do not mention 0 value, but comparing to old ones you can notice lineral relation between PHY clock speed and band width. So it makes sense for 0x0 value to be 10 MHz band width. Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit d242b90adf4e1918ac86433dfbb32a1136515bdd Author: RafaÅ‚ MiÅ‚ecki Date: Thu Dec 9 20:56:00 2010 +0100 b43: N-PHY: use designed function and macro for writing tables Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit ea85ffd627b5da346b348d784fafec0ce4632d4d Author: RafaÅ‚ MiÅ‚ecki Date: Thu Dec 9 20:55:59 2010 +0100 b43: N-PHY: one more fix for order of tables initialization I missed that part in previous reordering. Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit f61afc291a64d0362258f5a1ab45c828fe15ab04 Author: RafaÅ‚ MiÅ‚ecki Date: Thu Dec 9 20:55:58 2010 +0100 b43: N-PHY: use correct bit for controlling MAC and PHY Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit f7e0104c1a4e77cc4f23d5969b0677bdc4f62c63 Author: Johannes Berg Date: Thu Dec 9 19:49:02 2010 +0100 mac80211: support separate default keys Add support for split default keys (unicast and multicast) in mac80211. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit dbd2fd656f2060abfd3a16257f8b51ec60f6d2ed Author: Johannes Berg Date: Thu Dec 9 19:58:59 2010 +0100 cfg80211/nl80211: separate unicast/multicast default TX keys Allow userspace to specify that a given key is default only for unicast and/or multicast transmissions. Only WEP keys are for both, WPA/RSN keys set here are GTKs for multicast only. For more future flexibility, allow to specify all combiations. Wireless extensions can only set both so use nl80211; WEP keys (connect keys) must be set as default for both (but 802.1X WEP is still possible). Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 897bed8b4320774e56f282cdc1cceb4d77442797 Author: Johannes Berg Date: Thu Dec 9 19:49:00 2010 +0100 mac80211: clean up RX key checks Using the default key for "any key set" isn't quite what we should do. It works, but with the upcoming changes it makes life unnecessarily complex, so do something better here and really check for "any key". Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit f33fdcf1b3a02fb92971a577d194ec6c579374af Author: Mohammed Shafi Shajakhan Date: Thu Dec 9 21:48:54 2010 +0530 ath9k: clean up hardware code for beacon handling The registers TBTT_TIMER ,DMA_BEACON_ALERT ,NEXT_SWBA are need to be configured only for AP and IBSS mode. SWBA register is used for generating software interrupts so that beacon frames will be created by the software.DMA beacon alert register is to indicate the hardware to DMA the contents of beacon buffer to PCU buffer and TBTT to start transmitting the packet buffer to the base band. Clearly these things are not needed for station/monitor mode so remove configuring them. Cc: doug dahlby Signed-off-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit 01123e233193a544c85b622e1690f44532052c5b Author: Sven Neumann Date: Thu Dec 9 15:05:24 2010 +0100 cfg80211: update information elements in cached BSS struct When a cached BSS struct is updated because a new beacon was received, the code replaces the cached information elements by the IEs from the new beacon. However it did not update the pub.information_elements and pub.len_information_elements fields leaving them either pointing to the old beacon IEs or in an inconsistent state where the data is replaced by the new beacon IEs but len_information_elements still has its value from the first beacon. Fix this by updating the information elements fields if they are pointing to beacon IEs. Signed-off-by: Sven Neumann Reviewed-by: Johannes Berg Signed-off-by: John W. Linville commit 998d516d9546eba04dd99ae49a78acb0cf770478 Author: Rajkumar Manoharan Date: Wed Dec 8 20:01:05 2010 +0530 ath: Missed to clear key4 of micentry key4 of micentry is used, if ATH_CRYPT_CAP_MIC_COMBINED is set. But is not cleared on key cache reset. Cc: stable@kernel.org Signed-off-by: Rajkumar Manoharan Signed-off-by: John W. Linville commit 6b3b991dbdb66a65a2167abbd9503e519fa999f3 Author: Rajkumar Manoharan Date: Wed Dec 8 19:38:55 2010 +0530 ath9k: Add change_interface callback Add support to change interface type without bringing down the interface. Signed-off-by: Rajkumar Manoharan Signed-off-by: John W. Linville commit a7ffac9591a2a0ee74c431396ae475a8d0caa51e Author: Bruno Randolf Date: Wed Dec 8 13:59:24 2010 +0900 cfg80211: Add antenna availability information Add a field to wiphy for the hardware to report the availble antennas for configuration. Only if this is set to something bigger than zero, will the anntenna configuration ops be executed. Allthough this could be a simple number of antennas, I defined it as a bitmap of antennas which are available for configuration, since it's more consistent with the rest of the antenna API and there could be cases where the hardware allows only configuration of certain antennas. As it does not make much of a difference in size or normal usage, I think it's better to be able to support this, in case the need arises. The antenna configuration is now also checked against the availabe antennas and rejected if it does not match. Signed-off-by: Bruno Randolf -- v3: always apply available antenna mask (for "all" antennas case). v2: reject antenna configurations which don't match the available antennas Signed-off-by: John W. Linville commit a08e7ade9ddf4fe79576f953cc5c1725e944d26c Author: Luis R. Rodriguez Date: Tue Dec 7 15:13:20 2010 -0800 ath9k: fix assumptions for idle calls on suspend/resume mac80211 will notify drivers when to go idle and ath9k assumed that it would get further notifications for idle states after a device stop() config call but as per agreed semantics the idle state of the radio is left up to driver after mac80211 issues the stop() callback. The driver is resposnbile for ensuring the device remains idle after that even between suspend / resume calls. This fixes suspend/resume when you issue suspend and resume twice on ath9k when ath9k_stop() was already called. We need to put the radio to full sleep in order for resume to work correctly. What might seem fishy is we are turning the radio off after resume. The reason why we do this is because we know we should not have anything enabled after a mac80211 tells us to stop(), if we resume and never get a start() we won't get another stop() by mac80211 so to be safe always bring the 802.11 device with the radio disabled after resume, this ensures that if we suspend we already have the radio disabled and only a start() will ever trigger it on. Cc: stable@kernel.org Cc: Paul Stewart Cc: Amod Bodas Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit c2731b814e2aaaa40072ee761b7373c052d86e37 Author: Luis R. Rodriguez Date: Tue Dec 7 15:13:19 2010 -0800 ath9k: Fix power save count imbalance on ath_radio_enable() Upon a failure we never call ath9k_ps_restore() on ath_radio_enable(), this will throw off the sc->ps_usecount. When the sc->ps_usecount is > 0 we never put the chip to full sleep. This drains battery, and will also make the chip fail upon resume with: ath: Starting driver with initial channel: 5745 MHz ath: timeout (100000 us) on reg 0x7000: 0xdeadbeef & 0x00000003 != 0x00000000 This would make the chip useless upon resume. I cannot prove this can happen but in theory it is so best to avoid this race completely and not have users complain about a broken device after resume. Cc: stable@kernel.org Cc: Paul Stewart Cc: Amod Bodas Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit 1d212aa96e1b63459486f729af9a3fa38768b801 Merge: 8c4877a4128e7931077b024a891a4b284d8756a3 b7613370db5ba66ad81e41cd3a5417fde4d5e03c Author: John W. Linville Date: Mon Dec 13 15:20:45 2010 -0500 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem commit 249fab773dd5f689318c969ed649c4db077cdfc3 Author: Eric Dumazet Date: Mon Dec 13 12:16:14 2010 -0800 net: add limits to ip_default_ttl ip_default_ttl should be between 1 and 255 Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 8808f64171deec62346888e156e3adb636e2a31a Author: Herton Ronaldo Krzesinski Date: Mon Dec 13 11:43:51 2010 -0200 mac80211: avoid calling ieee80211_work_work unconditionally On suspend, there might be usb wireless drivers which wrongly trigger the warning in ieee80211_work_work. If an usb driver doesn't have a suspend hook, the usb stack will disconnect the device. On disconnect, a mac80211 driver calls ieee80211_unregister_hw, which calls dev_close, which calls ieee80211_stop, and in the end calls ieee80211_work_purge-> ieee80211_work_work. The problem is that this call to ieee80211_work_purge comes after mac80211 is suspended, triggering the warning even when we don't have work queued in work_list (the expected case when already suspended), because it always calls ieee80211_work_work. So, just call ieee80211_work_work in ieee80211_work_purge if we really have to abort work. This addresses the warning reported at https://bugzilla.kernel.org/show_bug.cgi?id=24402 Signed-off-by: Herton Ronaldo Krzesinski Signed-off-by: John W. Linville commit 16cad7fba037b34ca32cc0adac65bc089d969fb8 Author: Christian Lamparter Date: Sat Dec 11 12:19:48 2010 +0100 p54usb: add 5 more USBIDs This patch adds five more USBIDs to the table. Source: http://www.linuxant.com/pipermail/driverloader/2005q3/002307.html http://wireless.kernel.org/en/users/Drivers/p54/devices (by M. Davis) Cc: Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit c926d006c1514cfb3572893f41f2324e96823661 Author: Tim Harvey Date: Thu Dec 9 10:43:13 2010 -0800 mac80211: Fix NULL-pointer deference on ibss merge when not ready dev_open will eventually call ieee80211_ibss_join which sets up the skb used for beacons/probe-responses however it is possible to receive beacons that attempt to merge before this occurs causing a null pointer dereference. Check ssid_len as that is the last thing set in ieee80211_ibss_join. This occurs quite easily in the presence of adhoc nodes with hidden SSID's revised previous patch to check further up based on irc feedback Signed-off-by: Tim Harvey Reviewed-by: Johannes Berg Signed-off-by: John W. Linville commit 4a55d5852adbe66722fb1636c82c7864cd5be441 Author: Sven Neumann Date: Thu Dec 9 09:38:36 2010 +0100 libertas: fix potential NULL-pointer dereference The code wants to check if there's a channel and it is not disabled, but it used to check if channel is not NULL and accessed the channel struct if this check failed. Signed-off-by: Sven Neumann Acked-by: Dan Williams Signed-off-by: John W. Linville commit 68433b73b104bff388aac376631d32abbbd872b0 Author: Chris Mason Date: Mon Dec 13 14:47:58 2010 -0500 Btrfs: EIO when we fail to read tree roots If we just get a plain IO error when we read tree roots, the code wasn't properly sending that error up the chain. This allowed mounts to continue when they should failed, and allowed operations on partially setup root structs. The end result was usually oopsen on spinlocks that hadn't been spun up correctly. Signed-off-by: Chris Mason commit b9d41052794385f9d47ebb7acf4a772f3ad02398 Author: Namhyung Kim Date: Mon Dec 13 13:42:24 2010 -0600 dlm: sanitize work_start() in lowcomms.c The create_workqueue() returns NULL if failed rather than ERR_PTR(). Fix error checking and remove unnecessary variable 'error'. Signed-off-by: Namhyung Kim Cc: Tejun Heo Signed-off-by: David Teigland commit 10c38c3306c04ec26b1536d30b8b11ccab32faa5 Merge: 6942fec92d3d1b6918425730de31b4c6d0d5c196 d9319560b86839506c2011346b1f2e61438a3c73 Author: John W. Linville Date: Mon Dec 13 14:41:23 2010 -0500 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6 commit c4d6fd40df38eb4c187565d48807f5f902481ba8 Author: Maxim Levitsky Date: Mon Nov 29 04:09:53 2010 +0200 firewire: net: ratelimit error messages Unfortunately its easy to trigger such error messages by removing the cable while sending streams of data over the link. Such errors are normal, and therefore this patch stops firewire-net from flooding the kernel log with these errors, by combining series of same errors together. Signed-off-by: Maxim Levitsky (Stefan R:) Eventually we should remove this logging when firewire-net and related firewire-ohci facilities have been stabilized. Signed-off-by: Stefan Richter commit dd23736e092035b71df1117482b71fdfb5634239 Author: Maxim Levitsky Date: Mon Nov 29 04:09:50 2010 +0200 firewire: ohci: restart iso DMA contexts on resume from low power mode Restore iso channels DMA so that iso channels could continue to work after resume from RAM/disk. Signed-off-by: Maxim Levitsky Signed-off-by: Stefan Richter commit 8662b6b029636c35e5876e184d90daf6b0072667 Author: Maxim Levitsky Date: Mon Nov 29 04:09:49 2010 +0200 firewire: ohci: restore GUID on resume. Some lousy BIOSes, e.g. my Aspire 5720 BIOS forget to restore the GUID register on resume from RAM. Fix that by setting it to the last value that was read from it. Signed-off-by: Maxim Levitsky Signed-off-by: Stefan Richter commit ec766a7970126f99665992c0b0b10bd60a4d6208 Author: Clemens Ladisch Date: Tue Nov 30 08:25:17 2010 +0100 firewire: ohci: use common buffer for self IDs and AR descriptors The buffers used for the selfIDs packets and the AR request and response descriptors end up using three pages because dma_alloc_coherent() allocates at least one page per call. However, these data structures would all fit into 4 KB, so we can save space by using a common buffer for them. Signed-off-by: Clemens Ladisch Signed-off-by: Stefan Richter commit 2dd5bed59356e03610bebe1a37c397788df50b9b Author: Clemens Ladisch Date: Tue Nov 30 08:25:05 2010 +0100 firewire: ohci: optimize iso context checks in the interrupt handler When the isochRx/isochTx bit is clear, we do not need to read the corresponding iso interrupt event register. Signed-off-by: Clemens Ladisch Signed-off-by: Stefan Richter commit 5b06db166c4d38638980283505259fa165d4f369 Author: Clemens Ladisch Date: Tue Nov 30 08:24:47 2010 +0100 firewire: make PHY packet header format consistent Change the header of PHY packets to be sent to include a pseudo transaction code. This makes the header consistent with that of received PHY packets, and allows at_context_queue_packet() and log_ar_at_event() to see the packet type directly instead of having to deduce it from the header length or even from the header contents. Signed-off-by: Clemens Ladisch Signed-off-by: Stefan Richter commit 8327b37b18addfc6f8cf41a2f1a4490b656377b9 Author: Clemens Ladisch Date: Tue Nov 30 08:24:32 2010 +0100 firewire: ohci: properly clear posted write errors To remove the error information from the controller's queue and to allow more posted writes, the driver has to read the failed posted write address before clearing the postedWriteErr interrupt bit. Signed-off-by: Clemens Ladisch (Stefan R:) The spec is somewhat fuzzy about the actual requirements. To err on the safe side, let's do these two read accesses. Signed-off-by: Stefan Richter commit e597e9898abe45beff4696159c7fe5c96f53e581 Author: Clemens Ladisch Date: Tue Nov 30 08:24:19 2010 +0100 firewire: ohci: flush MMIO writes in the interrupt handler Make sure that interrupt event clear bit writes are executed before the interrupt handler returns. Signed-off-by: Clemens Ladisch Signed-off-by: Stefan Richter commit c088ab30ebf184afae01d919c77cebcfdce39df3 Author: Clemens Ladisch Date: Tue Nov 30 08:24:01 2010 +0100 firewire: ohci: fix AT context initialization error handling Add proper error handling for the context_init() calls. Signed-off-by: Clemens Ladisch Signed-off-by: Stefan Richter commit 7a39d8b82165462729d09066bddb395a19025acd Author: Clemens Ladisch Date: Fri Nov 26 08:57:31 2010 +0100 firewire: ohci: Asynchronous Reception rewrite Move the AR DMA descriptors out of the buffer pages, and map the buffer pages linearly into the kernel's address space. This allows the driver to ignore any page boundaries in the DMA data and thus to avoid any copying around of packet payloads. This fixes the bug where S800 packets that are so big (> 4080 bytes) that they can be split over three pages were not handled correctly. Due to the changed algorithm, we can now use arbitrarily many buffer pages, which improves performance because the controller can more easily unload its DMA FIFO. Furthermore, using streaming DMA mappings should improve perfomance on architectures where coherent DMA mappings are not cacheable. Even on other architectures, the caching behaviour should be improved slightly because the CPU no longer writes to the buffer pages. v2: Detect the last filled buffer page by searching the descriptor's residual count value fields in order (like in the old code), instead of going backwards through the transfer status fields; it looks as if some controllers do not set the latter correctly. v3: Fix an old resume bug that would now make the handler run into a BUG_ON, and replace that check with more useful error handling. Increase the buffer size for better performance with non-TI chips. Signed-off-by: Clemens Ladisch Maxim Levitsky writes: Works almost perfectly. I can still see RCODE_BUSY errors sometimes, not very often though. 64K here eliminates these errors completely. This is most likely due to nouveau drivers and lowest perf level I use to lower card temperature. That increases latencies too much I think. Besides that the IO is just perfect. Tested-by: Maxim Levitsky Signed-off-by: Stefan Richter commit a388eb1727c15a7da1f64fcf16e60fcb7aca40bd Author: Haiyang Zhang Date: Fri Dec 10 12:04:00 2010 -0800 staging: hv: Convert camel cased struct fields in rndis.h to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 53d21fdbf4d38dcfe27173d746acf74ea1a19958 Author: Haiyang Zhang Date: Fri Dec 10 12:03:59 2010 -0800 staging: hv: Convert camel cased struct fields in netvsc.h to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 72a2f5bd53bf83302f4dcfe8500d4ec440545d27 Author: Haiyang Zhang Date: Fri Dec 10 12:03:58 2010 -0800 staging: hv: Convert camel cased struct fields in netvsc_api.h to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 9c26aa0d763a8390177f50ae841148706a249793 Author: Haiyang Zhang Date: Fri Dec 10 12:03:57 2010 -0800 staging: hv: Convert camel cased functions in rndis_filter.c to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit c2a4efddc73bfd44479fc8d84dadbb352c4efb07 Author: Haiyang Zhang Date: Fri Dec 10 12:03:56 2010 -0800 staging: hv: Convert camel cased variables in rndis_filter.c to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 5a71ae303c0f82968d93d86724c1d94d753b34d7 Author: Haiyang Zhang Date: Fri Dec 10 12:03:55 2010 -0800 staging: hv: Convert camel cased functions in netvsc.c to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 85799a37553f89b23797ec4f69e45f6c5e9109df Author: Haiyang Zhang Date: Fri Dec 10 12:03:54 2010 -0800 staging: hv: Convert camel cased variables in netvsc.c to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit e1b8a37ede8b47dbad002ec61a67706b70b23ccf Author: L. Alberto GimĂ©nez Date: Sun Dec 12 18:56:30 2010 +0100 Staging: rt2860: Avoid extern in .c file rt28xx_close and rt28xx_open are already declared in a file included in rt_config.h, so there is no need to declare them again. Signed-off-by: L. Alberto GimĂ©nez Signed-off-by: Greg Kroah-Hartman commit ced17a68b727d8509a4bde0b2ee7d0d120371e66 Author: L. Alberto GimĂ©nez Date: Sun Dec 12 18:56:29 2010 +0100 Staging: rt2860: Clean spaces before tabs Fix checkpatch complains Signed-off-by: L. Alberto GimĂ©nez Signed-off-by: Greg Kroah-Hartman commit 6292817d58637f85dd623cfe563c7f5ec4f4c470 Author: Ruben Smits Date: Sat Dec 11 08:26:18 2010 +0100 staging: comedi: add support for newer jr3 1-channel pci board add DEVICE_ID to table Signed-off-by: Ruben Smits Cc: stable Signed-off-by: Greg Kroah-Hartman commit ed271e049d4e0bf8c6586c9626964a01d1c62fa2 Author: Xenofon Foukas Date: Fri Dec 10 21:07:25 2010 +0200 Staging: comedi: Fix coding style issues in ni_tiocmd.c This patch fixes the following issues in ni_tiocmd.c: WARNING: braces {} are not necessary for any arm of this statement WARNING: braces {} are not necessary for single statement blocks WARNING: printk() should include KERN_ facility level WARNING: line over 80 characters __func__ should be used instead of gcc specific __FUNCTION__ ERROR: that open brace { should be on the previous line WARNING: EXPORT_SYMBOL(foo); should immediately follow its function/variable Signed-off-by: Xenofon Foukas Signed-off-by: Greg Kroah-Hartman commit 448d40140196b33f63a0a3f3f8bcad8f14c9c432 Author: Marek Belisko Date: Mon Dec 13 10:39:20 2010 +0100 staging: ft1000: Always extract device number from netdev name. Using gCardIndex as global variable was not correctly used because for every plugged device was set to 0 in init_ft1000_netdev. Remove global definition. Use it locally and for every plugged device extract number from net device name. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 8c4877a4128e7931077b024a891a4b284d8756a3 Author: Joe Perches Date: Mon Dec 13 10:05:14 2010 -0800 ehea: Use the standard logging functions Remove ehea_error, ehea_info and ehea_debug macros. Use pr_fmt, pr_, netdev_ and netif_ as appropriate. Fix messages to use trailing "\n", some messages had an extra one as the old ehea_ macros added a trailing "\n". Coalesced long format strings. Signed-off-by: Joe Perches Signed-off-by: Breno Leitao Signed-off-by: David S. Miller commit 0a6bf658c3b9d1d0e520d320b6392c8680c2e381 Author: Ira W. Snyder Date: Mon Dec 13 11:42:30 2010 -0500 hwmon: (ltc4215) make sysfs file match the alarm cause The ltc4215 driver used the chip's "power good" status bit to provide the power1_alarm file. This is wrong: the chip is really reporting the status of one of the monitored voltages. Change the sysfs file from power1_alarm to in2_min_alarm instead. This matches the voltage that the chip is raising an alarm for. Signed-off-by: Ira W. Snyder Signed-off-by: Guenter Roeck commit 5f29805a4f4627e766f862ff9f10c14f5f314359 Author: Don Zickus Date: Mon Dec 13 10:31:58 2010 -0500 x86, watchdog: Compile fix when CONFIG_LOCAL_APIC not enabled When adjusting the code to handle removing the old nmi watchdog, I forgot to consider the compile case when the local apic is not enabled. This change fixes the following build error: arch/x86/kernel/apic/hw_nmi.c:28:6: error: redefinition of ‘touch_nmi_watchdog’ Signed-off-by: Don Zickus Acked-by: Randy Dunlap Cc: Randy Dunlap Cc: Stephen Rothwell Cc: Rakib Mullick LKML-Reference: <20101213153719.GD18577@redhat.com> Signed-off-by: Ingo Molnar commit 862af8adbe6b9ccb7c00c13717b1f92465f79aa2 Author: Jarkko Nikula Date: Fri Dec 10 20:53:55 2010 +0200 ASoC: Fix bias power down of non-DAPM codec Currently bias of non-DAPM codec will be powered down (standby/off) whenever there is a stream stop. This is wrong in simultaneous playback/capture since the bias is put down immediately after stopping the first stream. Fix this by using the codec->active count when figuring out the needed bias level after stream stop. Signed-off-by: Jarkko Nikula Acked-by: Liam Girdwood Signed-off-by: Mark Brown commit fb410aef0314ef183fe6da879d29536311971a20 Author: Shawn Guo Date: Thu Dec 9 23:12:37 2010 +0800 ARM: mxs: Add helper definition and function Add helper definition and function for MXS-based. Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit b0b6e42aa63fbd00a3b509e75702aca4be8618cd Author: Shawn Guo Date: Mon Dec 13 20:54:58 2010 +0800 ARM: mxs: Add core definitions Add core definitions for MXS-based SoC MX23 and MX28. Signed-off-by: Shawn Guo Signed-off-by: Uwe Kleine-König commit f1c18071ad70e2a78ab31fc26a18fcfa954a05c6 Author: Thomas Gleixner Date: Mon Dec 13 12:43:23 2010 +0100 x86: HPET: Chose a paranoid safe value for the ETIME check commit 995bd3bb5 (x86: Hpet: Avoid the comparator readback penalty) chose 8 HPET cycles as a safe value for the ETIME check, as we had the confirmation that the posted write to the comparator register is delayed by two HPET clock cycles on Intel chipsets which showed readback problems. After that patch hit mainline we got reports from machines with newer AMD chipsets which seem to have an even longer delay. See http://thread.gmane.org/gmane.linux.kernel/1054283 and http://thread.gmane.org/gmane.linux.kernel/1069458 for further information. Boris tried to come up with an ACPI based selection of the minimum HPET cycles, but this failed on a couple of test machines. And of course we did not get any useful information from the hardware folks. For now our only option is to chose a paranoid high and safe value for the minimum HPET cycles used by the ETIME check. Adjust the minimum ns value for the HPET clockevent accordingly. Reported-Bistected-and-Tested-by: Markus Trippelsdorf Signed-off-by: Thomas Gleixner LKML-Reference: Cc: Simon Kirby Cc: Borislav Petkov Cc: Andreas Herrmann Cc: John Stultz commit a8760eca6cf60ed303ad494ef45901f63165d2c8 Author: Thomas Gleixner Date: Mon Dec 13 11:28:02 2010 +0100 x86: Check tsc available/disabled in the delayed init function The delayed TSC init function does not check whether the system has no TSC or TSC is disabled at the kernel command line, which results in a crash in the work queue based extended calibration due to division by zero because the basic calibration never happened. Add the missing checks and do not touch TSC when not available or disabled. Signed-off-by: Thomas Gleixner Cc: John Stultz commit 598e227ea9af687547d46bff6906151e728f7b7b Merge: 2818b19102fdc414248f772c46af176d36520ae7 f6d84f4a7df8057247a3f1723169586af3882436 cd8ab0041d131e8e210c4b5ded7257da50473dcb Author: Paul Mundt Date: Mon Dec 13 15:36:36 2010 +0900 Merge branches 'rmobile/ag5' and 'rmobile/mackerel' into rmobile-latest commit c43328e890b9e3a4ab8e8cb1020a8b1e9fda9ed1 Merge: 7d0dbea312a6508389241b4fb6cda1c4d1e32d6e 80fbf8382e110656ea67327300f16cfd2488a9bf 852af59f6084bf1c48df16d2728216705621d598 Author: Paul Mundt Date: Mon Dec 13 15:35:10 2010 +0900 Merge branches 'sh/urgent' and 'sh/rsk-updates' into sh-latest commit 852af59f6084bf1c48df16d2728216705621d598 Author: Paul Mundt Date: Mon Dec 13 15:33:16 2010 +0900 sh: mach-rsk: Add polled GPIO buttons support for RSK+7203. Now that there's an upstream polled gpio-keys driver, add the outstanding platform data for it. Signed-off-by: Paul Mundt commit 323e126f0c5995f779d7df7fd035f6e8fed8764d Author: David S. Miller Date: Sun Dec 12 21:55:08 2010 -0800 ipv4: Don't pre-seed hoplimit metric. Always go through a new ip4_dst_hoplimit() helper, just like ipv6. This allowed several simplifications: 1) The interim dst_metric_hoplimit() can go as it's no longer userd. 2) The sysctl_ip_default_ttl entry no longer needs to use ipv4_doint_and_flush, since the sysctl is not cached in routing cache metrics any longer. 3) ipv4_doint_and_flush no longer needs to be exported and therefore can be marked static. When ipv4_doint_and_flush_strategy was removed some time ago, the external declaration in ip.h was mistakenly left around so kill that off too. We have to move the sysctl_ip_default_ttl declaration into ipv4's route cache definition header net/route.h, because currently net/ip.h (where the declaration lives now) has a back dependency on net/route.h Signed-off-by: David S. Miller commit 80fbf8382e110656ea67327300f16cfd2488a9bf Author: Paul Mundt Date: Mon Dec 13 14:59:51 2010 +0900 sh: Enable deprecated IRQ chip APIs for MFD and GPIOLIB drivers. There are still quite a number of MFD and GPIO expander drivers that are using the old irq_chip APIs that haven't had a chance to update during the .37 cycle, resulting in allyes/modconfig errors on some configurations. Mark Brown has done most of the legwork to get these fixed up in .38, so this should just be a .37 stop-gap that we can drop at the end of the .38 merge window. Reported-by: Mark Brown Signed-off-by: Paul Mundt commit a02e4b7dae455151c423e2f69ef222c502a321fd Author: David S. Miller Date: Sun Dec 12 21:39:02 2010 -0800 ipv6: Demark default hoplimit as zero. This is for consistency with ipv4. Using "-1" makes no sense. It was made this way a long time ago merely to be consistent with how the ipv6 socket hoplimit "default" is stored. Signed-off-by: David S. Miller commit 5170ae824ddf1988a63fb12cbedcff817634c444 Author: David S. Miller Date: Sun Dec 12 21:35:57 2010 -0800 net: Abstract RTAX_HOPLIMIT metric accesses behind helper. Signed-off-by: David S. Miller commit abbf46ae0e4954584eac599bec73502c1c805e9e Author: David S. Miller Date: Sun Dec 12 21:14:46 2010 -0800 ipv6: Use ip6_dst_hoplimit() instead of direct dst_metric() calls. Signed-off-by: David S. Miller commit cd8ab0041d131e8e210c4b5ded7257da50473dcb Author: Tony SIM Date: Thu Dec 9 01:55:55 2010 +0000 ARM: mach-shmobile: mackerel: Add keypad tca6408a support This patch maps key0/key1/key2/key3 as HOME/MENU/BACK/POWER buttons on mackerel board. Signed-off-by: Tony SIM Signed-off-by: Paul Mundt commit 819c1a651fec6b370211609ce6eceefd20cf31e4 Merge: 440e2e4759805437f89f7eda78de72cb46729d04 9f1ee150fc7039eb65039ab17d9a95dfa6250133 Author: Russell King Date: Sun Dec 12 23:45:39 2010 +0000 Merge branch 'fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 commit 440e2e4759805437f89f7eda78de72cb46729d04 Author: Russell King Date: Sun Dec 12 23:24:28 2010 +0000 ARM: Update mach-types Signed-off-by: Russell King commit da30e0ac0f9a521f0cfec8145ddd1ad131f66d61 Author: Catalin Marinas Date: Tue Dec 7 16:56:29 2010 +0100 ARM: 6528/1: Use CTR for the I-cache line size on ARMv7 The current implementation of the v7_coherent_*_range function assumes that the D and I cache lines have the same size, which is incorrect architecturally. This patch adds the icache_line_size macro which reads the CTR register. The main loop in v7_coherent_*_range is split in two independent loops or the D and I caches. This also has the performance advantage that the DSB is moved outside the main loop. Reported-by: Kevin Sapp Signed-off-by: Catalin Marinas Signed-off-by: Russell King commit f91e2c3bd427239c198351f44814dd39db91afe0 Author: Catalin Marinas Date: Tue Dec 7 16:52:04 2010 +0100 ARM: 6527/1: Use CTR instead of CCSIDR for the D-cache line size on ARMv7 The current implementation of the dcache_line_size macro reads the L1 cache size from the CCSIDR register. This, however, is not guaranteed to be the smallest cache line in the cache hierarchy. The patch changes to the macro to use the more architecturally correct CTR register. Reported-by: Kevin Sapp Signed-off-by: Catalin Marinas Signed-off-by: Russell King commit 2a27a03d3a891e87ca33d27a858b4db734a4cbab Author: Andrej Ota Date: Sun Dec 12 15:06:16 2010 -0800 pppoe.c: Fix kernel panic caused by __pppoe_xmit __pppoe_xmit function return value was invalid resulting in additional call to kfree_skb on already freed skb. This resulted in memory corruption and consequent kernel panic after PPPoE peer terminated the link. This fixes commit 55c95e738da85373965cb03b4f975d0fd559865b. Reported-by: Gorik Van Steenberge Reported-by: Daniel Kenzelmann Reported-by: Denys Fedoryshchenko Reported-by: Pawel Staszewski Diagnosed-by: Andrej Ota Diagnosed-by: Eric Dumazet Tested-by: Denys Fedoryshchenko Tested-by: Pawel Staszewski Signed-off-by: Jarek Poplawski Signed-off-by: Andrej Ota Signed-off-by: David S. Miller commit eaff9453d3e2b63969af93e9d42a85e803060121 Author: Krzysztof Halasa Date: Sun Dec 12 12:06:47 2010 +0000 WAN: Fix a TX IRQ causing BUG() in PC300 and PCI200SYN drivers. We must not wake the TX queue without free TX descriptors. sca_xmit() expects at least one free descriptor and BUGs otherwise. Problem reported and fix tested by Bernie Innocenti and Ward Vandewege. Signed-off-by: Krzysztof HaÅ‚asa Signed-off-by: David S. Miller commit 9f5449611c9d6d7bdcae8020a197d8b4d9b6443c Author: Vladislav Zolotarov Date: Sun Dec 12 04:12:29 2010 +0000 bnx2x: Advance a version number to 1.60.01-0 Signed-off-by: Vladislav Zolotarov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit 372e43eb2fc34001250e27d63f99c20e46ea58a7 Author: Vladislav Zolotarov Date: Sun Dec 12 04:12:12 2010 +0000 bnx2x: Fixed a compilation warning bnx2x_src_init_t2() is used only when BCM_CNIC is defined. So, to avoid a compilation warning, we won't define it unless BCM_CNIC is defined. Signed-off-by: Vladislav Zolotarov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit 099978b434d4924594516db540ccc50652e7cc94 Author: Vladislav Zolotarov Date: Sun Dec 12 04:11:45 2010 +0000 bnx2x: LSO code was broken on BE platforms Make the LSO code work on BE platforms: parsing_data field of a parsing BD (PBD) for 57712 was improperly composed which made FW read wrong values for TCP header's length and offset and, as a result, the corresponding PCI device was performing bad DMA reads triggering EEH. Signed-off-by: Vladislav Zolotarov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit 4d7b6b5d247aa71ea27709b9eac1ba6e752fbe87 Author: Ron Mercer Date: Sat Dec 11 11:06:50 2010 +0000 qlge: Fix deadlock when cancelling worker. Removing usage of rtnl_lock() to protect firmware interface registers. These registers are accessed in some worker threads and can create a deadlock if rtnl_lock is taken by upper layers while the worker is still pending. We remove rtnl_lock and use a driver mutex just while mailboxes are accessed. Signed-off-by: Ron Mercer Signed-off-by: David S. Miller commit bce5feeab418fb1df9ce1c3fcc14f0aacf740208 Author: David S. Miller Date: Sun Dec 12 14:57:53 2010 -0800 sparc: Eliminate prom_stdin. Completely unused. Based upon a patch by Julian Calaby. Signed-off-by: David S. Miller commit 154337688bfa970453836e65a27de011aba55331 Author: Julian Calaby Date: Fri Dec 3 17:56:45 2010 +0000 sparc: prom: Sanitize return value from prom_nbputchar() Signed-off-by: Julian Calaby Signed-off-by: David S. Miller commit 36eac2130cdbac08606bb2c05775e52ab79b163c Merge: a19faf0250e09b16cac169354126404bc8aa342b e4dde731ae70072338352c6f8fb75fd04a42cf8d Author: David S. Miller Date: Sun Dec 12 14:16:51 2010 -0800 Merge branch 'vhost-net' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost commit 7496351ad87e61e96b49dd7b43c6534e3401f566 Author: Christoph Lameter Date: Tue Nov 30 14:05:53 2010 -0600 timers: Use this_cpu_read Eric asked for this. [tglx: Because it generates faster code according to Erics ] Signed-off-by: Christoph Lameter Cc: Pekka Enberg Cc: Eric Dumazet Cc: Mathieu Desnoyers Cc: Tejun Heo Cc: linux-mm@kvack.org LKML-Reference: Signed-off-by: Thomas Gleixner commit 1635953305694ece16d99078ca6d32f3d4e7eb36 Author: Tejun Heo Date: Sun Dec 12 16:45:15 2010 +0100 hostap: don't use flush_scheduled_work() flush_scheduled_work() is on its way out. Drop flush_scheduled_work() from prism2_free_local_data() and replace it with explicit flushing of work items on the respective free functions. Work items in ap_data are flushed from hostap_free_data() and the ones in local_info from prism2_free_local_data(). Flush is used instead of cancel as some process and free items from queue. Signed-off-by: Tejun Heo Cc: "David S. Miller" Cc: Jes Sorensen Cc: netdev@vger.kernel.org commit 781ba4567698be9db7ca94d827c4b38d8583c168 Author: Tejun Heo Date: Sun Dec 12 16:45:14 2010 +0100 i2400m: drop i2400m_schedule_work() i2400m implements dynamic work allocation and queueing mechanism in i2400_schedule_work(); however, this is only used for reset and recovery which can be served equally well with preallocated per device works. Replace i2400m_schedule_work() with two work structs in struct i2400m. These works are explicitly canceled when the device is released making calls to flush_scheduled_work(), which is being deprecated, unnecessary. Signed-off-by: Tejun Heo Cc: "David S. Miller" Cc: Inaky Perez-Gonzalez Cc: linux-wimax@intel.com Cc: netdev@vger.kernel.org commit fe8998c5e3b173f3d5c450bbde6173e7fbe5158d Author: Tejun Heo Date: Sun Dec 12 16:45:14 2010 +0100 sungem: update gp->reset_task flushing gp->reset_task_pending is always set right before reset_task is scheduled and as there is no synchronization between the setting and scheduling, busy looping on reset_task_pending before flushing reset_task doesn't really buy anything. Directly flush gp->reset_task on suspend and cancel on detach. Signed-off-by: Tejun Heo Cc: "David S. Miller" Cc: netdev@vger.kernel.org commit 760141a53e5d72d4cc1d8c6e2a0232a24bedb36b Author: Tejun Heo Date: Sun Dec 12 16:45:14 2010 +0100 igb[v],ixgbe: don't use flush_scheduled_work() All three drivers use flush_scheduled_work() similarly during driver detach. Replace it with explicit cancels. Signed-off-by: Tejun Heo Cc: "David S. Miller" Cc: e1000-devel@lists.sourceforge.net Cc: netdev@vger.kernel.org commit 9beb4896cec71e40738a7752072174fbf0d5b7b4 Author: Tejun Heo Date: Sun Dec 12 16:45:14 2010 +0100 iseries_veth: don't use flush_scheduled_work() flush_scheduled_work() is on its way out. Remove its usage from iseries_veth. * Cancelling a delayed work, queueing it for immediate execution if cancelled and then waiting for completion can be done by simply calling flush_delayed_work_sync(). * Explicitly cancel cnx->statemachine_wq on module unload. Signed-off-by: Tejun Heo Cc: "David S. Miller" Cc: Santiago Leon Cc: netdev@vger.kernel.org commit f5c35cc191afd08d660e6db0fecc9f431dc8f273 Author: Tejun Heo Date: Sun Dec 12 16:45:14 2010 +0100 ehea: don't use flush_scheduled_work() Directly cancel port->reset_task from ehea_shutdown_single_port() instead. As this cancels the work for each port on driver detach, flushing system_wq from ehea_remove() or ehea_module_exit() is no longer necessary. Signed-off-by: Tejun Heo Cc: Breno Leitao Cc: netdev@vger.kernel.org commit 3d6b892bcc4c810071e36d8aff25aa171f55f93d Author: Tejun Heo Date: Sun Dec 12 16:45:14 2010 +0100 ehea: kill unused ehea_rereg_mr_task ehea_rereg_mr_task is not used. Remove it and drop @work parameter from ehea_rereg_mrs(). Signed-off-by: Tejun Heo Cc: Breno Leitao Cc: netdev@vger.kernel.org commit 23f333a2bfafba80339315b724808982a9de57d9 Author: Tejun Heo Date: Sun Dec 12 16:45:14 2010 +0100 drivers/net: don't use flush_scheduled_work() flush_scheduled_work() is on its way out. This patch contains simple conversions to replace flush_scheduled_work() usage with direct cancels and flushes. Directly cancel the used works on driver detach and flush them in other cases. The conversions are mostly straight forward and the only dangers are, * Forgetting to cancel/flush one or more used works. * Cancelling when a work should be flushed (ie. the work must be executed once scheduled whether the driver is detaching or not). I've gone over the changes multiple times but it would be much appreciated if you can review with the above points in mind. Signed-off-by: Tejun Heo Cc: "David S. Miller" Cc: Jay Cliburn Cc: Michael Chan Cc: Divy Le Ray Cc: e1000-devel@lists.sourceforge.net Cc: Vasanthy Kolluri Cc: Samuel Ortiz Cc: Lennert Buytenhek Cc: Andrew Gallatin Cc: Francois Romieu Cc: Ramkrishna Vepa Cc: Matt Carlson Cc: David Brownell Cc: Shreyas Bhatewara Cc: netdev@vger.kernel.org commit 6e07ebd84eef00be9e169a6d15a0bc20b06578fa Author: Tejun Heo Date: Sun Dec 12 16:45:14 2010 +0100 drivers/net: remove unnecessary flush_scheduled_work() calls janz-ican3, sh_eth, skge and vxge don't use workqueue at all and there is no reason to flush the system_wq. Drop flush_scheduled_work() calls and references to workqueue. Signed-off-by: Tejun Heo Cc: "David S. Miller" Cc: Wolfgang Grandegger Cc: Stephen Hemminger Cc: Ramkrishna Vepa Cc: Sivakumar Subramani Cc: Sreenivasa Honnur Cc: Jon Mason Cc: netdev@vger.kernel.org commit 5878730be4e3d0c9527d6f2f688874e38acacc98 Author: Joe Perches Date: Sat Oct 30 14:08:27 2010 -0700 firewire: core: Update WARN uses Add missing newlines. Signed-off-by: Joe Perches Signed-off-by: Stefan Richter commit 9993e0fe0f5f29c69e79efcb271ffc9843002985 Author: Stefan Richter Date: Tue Dec 7 20:32:40 2010 +0100 firewire: ohci: fix regression with Agere FW643 rev 06, disable MSI Agere FW643 rev 06, listed as "11c1:5901 (rev 06) (prog-if 10 [OHCI])", produced SBP-2 I/O errors since kernel 2.6.36. Disabling MSI fixes it. Since MSI work on Agere FW643-E (same vendor and device ID, but rev 07), introduce a device revision field into firewire-ohci's quirks list so that different quirks can be defined for older and newer revisions. Reported-by: Jonathan Isom Signed-off-by: Stefan Richter Cc: # 2.6.36.y commit 60a74a6ff86b4e90b9558956589390efdeb4e924 Author: Stefan Richter Date: Sat Oct 23 13:18:56 2010 +0200 firewire: nosy: char device is not seekable Amend .open handler accordingly and remove the .llseek handler. .llseek = NULL means no_llseek (return error) since commit 776c163b1b93. The only client that uses this interface is nosy-dump in linux/tools/firewire and it knows not to seek in this char dev. Signed-off-by: Stefan Richter commit af0cdf4947818becfe209610b209315578645ab4 Author: Stefan Richter Date: Tue Dec 7 19:16:02 2010 +0100 firewire: ohci: fix regression with VIA VT6315, disable MSI "VIA Technologies, Inc. VT6315 Series Firewire Controller [1106:3403]" does not generate any interrupts if Message Signaled Interrupts were enabled. This is a regression since kernel 2.6.36 in which MSI support was added to firewire-ohci. Hence blacklist MSI on all VIA controllers. Reported-by: Robin Cook Signed-off-by: Stefan Richter Cc: # 2.6.36.y commit ad1184c6cf067a13e8cb2a4e7ccc407f947027d0 Author: Manuel Lauss Date: Sat Dec 11 09:53:42 2010 +0000 net: au1000_eth: remove unused global variable. The driver global au_macs[] is unused in the entire kernel tree, so remove it. Signed-off-by: Manuel Lauss Signed-off-by: David S. Miller commit 85a564983aff948b9ea8b6e734b3e80b5755d12a Author: Jon Mason Date: Fri Dec 10 15:40:04 2010 +0000 s2io: Using static const generally increases object text and decreases data size. It also generally decreases overall object size. text data bss dec hex filename 109387 389 24432 134208 20c40 drivers/net/s2io.o.old 109358 389 24432 134179 20c23 drivers/net/s2io.o.new Signed-off-by: Joe Perches Acked-by: Jon Mason Signed-off-by: David S. Miller commit 11410b62cf9bdaed5863696c7994286a900424c7 Author: Jon Mason Date: Fri Dec 10 15:40:03 2010 +0000 s2io: Update Driver Version Update Driver Version Signed-off-by: Jon Mason Signed-off-by: David S. Miller commit c0dbf37e78c5c1e3e6cfeb39de30518fdde33e83 Author: Jon Mason Date: Fri Dec 10 15:40:02 2010 +0000 s2io: make strings at tables const Put immutable data in read/only section. Signed-off-by: Stephen Hemminger Signed-off-by: Jon Mason Signed-off-by: David S. Miller commit 1853e2e15dc95ff3430530941b5856581251ef70 Author: Jon Mason Date: Fri Dec 10 15:40:01 2010 +0000 s2io: rx_ring_sz bounds checking modparm rx_ring_sz can be set to be greater than the maximum allowable number of blocks. This results in an array overrun when probing the driver, and causes memory corruption. Also, the MAX_RX_DESC_1 multiply the max number of rings by max number of blocker per ring by 127, but the driver does the same calculation with 127+1. This results in the possibility of the value being set being larger than the maximum allowable value. Finally, clean-up the s2io_ethtool_gringparam code to be more intuitive. Signed-off-by: Jon Mason Signed-off-by: David S. Miller commit c4ffafa51bb0bea648a4ca119033a95057799c9d Author: Tejun Heo Date: Sat Dec 11 17:51:36 2010 +0100 HID: hid-picolcd: don't use flush_scheduled_work() flush_scheduled_work() is deprecated and scheduled to be removed. Directly flush picolcd_fb_cleanup on exit instead. Signed-off-by: Tejun Heo Cc: Jiri Kosina Signed-off-by: Jiri Kosina commit 45f74264e18449cf3c93cccaf098ee6e9524ab78 Author: Thomas Gleixner Date: Sat Dec 11 12:34:34 2010 +0100 timerqueue: Make timerqueue_getnext() static inline No point in calling a function just to dereference a pointer. Signed-off-by: Thomas Gleixner Cc: John Stultz commit e4a2b3565fc7ac2d70361a36337be57a59d783da Author: Sergei Shtylyov Date: Fri Dec 10 22:48:28 2010 +0300 usb: musb: core: kill unneeded #include's musb_core.c #include's a bunch of ARM and DaVinci specific headers, goodness knows why -- it happily compiles without them... Signed-off-by: Sergei Shtylyov Signed-off-by: Felipe Balbi commit 5a166f4f9999355720f829e94cf3bd306bae6f8b Author: Sergei Shtylyov Date: Fri Dec 10 20:23:06 2010 +0300 DA8xx: assign name to MUSB IRQ resource Commit fcf173e4511193b1efeccb0f22a8c641b464353b (usb: musb: add names for IRQs in structure resource) forgot to assign name to the DA8xx MUSB IRQ resource. Because of that MUSB driver fails to load on DA8xx machines. Signed-off-by: Sergei Shtylyov Signed-off-by: Felipe Balbi commit 57a7872fa0f03e90be0fa224b9ea533f5b03ee4f Author: Kevin Granade Date: Fri Dec 10 23:04:02 2010 -0800 Input: wacom - add another Bamboo Pen ID (0xd4) Add the features struct and device table entry to enable yet another version of Wacom Bamboo Pen (CTL460, Product ID 0xD4). Signed-off-by: Kevin Granade Acked-by: Ping Cheng Signed-off-by: Dmitry Torokhov commit 6cc5615f7c4decd7b6c4da9317d0e0b5fbdf7290 Merge: a5dc4f898c2a0f66e2cefada6c687db82ba2fcbc 3138b32d5e0998ba3cbd1c74bdc1887d74c5279b 12b3b5afed67e08aa641d30e57df20dab2e33432 bec4f22a2dbd5a26079cbddbcadf38f8c7e5381f 12d3206466d2074ef0684aaf7759ae01a0a92560 Author: Len Brown Date: Sat Dec 11 02:02:02 2010 -0500 Merge branches 'bugzilla-15418', 'bugzilla-21722', 'bugzilla-22932', 'misc-2.6.37' and 'osi-regression' into release commit bec4f22a2dbd5a26079cbddbcadf38f8c7e5381f Author: Jan Beulich Date: Tue Dec 7 14:58:44 2010 +0000 ACPI/HEST: adjust section selection Properly const-, __init-, and __read_mostly-annotate this code. Signed-off-by: Jan Beulich Signed-off-by: Len Brown commit 091aad6af4ab29af693ced5d6970ceee9d5981c8 Author: Jan Beulich Date: Tue Dec 7 14:52:25 2010 +0000 ACPI: eliminate unused variable warning for !ACPI_SLEEP Signed-off-by: Jan Beulich Signed-off-by: Len Brown commit 66c3ec4f1f70ee87833363166b594855631d7ba6 Author: Jan Beulich Date: Tue Dec 7 15:05:49 2010 +0000 ACPI/PNP: avoid section mismatch warning Signed-off-by: Jan Beulich Signed-off-by: Len Brown commit b9047599695ae835252ba3d6a19eada98c19dc89 Author: Zhang Rui Date: Wed Dec 8 10:40:26 2010 +0800 ACPI thermal: remove two unused functions When CONFIG_CPU_FREQ=n ... drivers/acpi/processor_thermal.c:159:12: warning: ‘acpi_thermal_cpufreq_increase’ defined but not used drivers/acpi/processor_thermal.c:163:12: warning: ‘acpi_thermal_cpufreq_decrease’ defined but not used Remove unused declaration of ‘acpi_thermal_cpufreq_increase’ and ‘acpi_thermal_cpufreq_decrease’ Signed-off-by: Zhang Rui Signed-off-by: Len Brown commit 32d47eeff05981bfb89a95747eb182bc12630d58 Author: Zhang Rui Date: Wed Dec 8 10:40:36 2010 +0800 ACPI: fix a section mismatch WARNING: drivers/acpi/acpi.o(.text+0xeda): Section mismatch in reference from the function acpi_os_initialize1() to the function .init.text:set_osi_linux() The function acpi_os_initialize1() references the function __init set_osi_linux(). Signed-off-by: Zhang Rui Signed-off-by: Len Brown commit 3b38bb5f7f06356a89bb2cbf92ad346025e95192 Author: Huang Ying Date: Thu Dec 2 10:40:53 2010 +0800 ACPI, APEI, use raw spinlock in ERST ERST writing may be used in NMI or Machine Check Exception handler. So it need to use raw spinlock instead of normal spinlock. This patch fixes it. Signed-off-by: Huang Ying Signed-off-by: Len Brown commit b72512ed706efb26087fcbbc5f98ed64ac1230d5 Author: Chris Wilson Date: Sun Sep 5 14:51:49 2010 +0100 ACPI: video: fix build for CONFIG_ACPI=n In file included from drivers/gpu/drm/i915/intel_opregion.c:30: include/acpi/video.h:22: warning: ‘struct acpi_device’ declared inside parameter list ... include/acpi/video.h:24: error: ‘ENODEV’ undeclared (first use in this function) Signed-off-by: Chris Wilson Signed-off-by: Len Brown commit 3353bebe7c89725ab2f476b9d8d618259402d52e Author: Len Brown Date: Tue Nov 30 18:21:46 2010 -0500 ACPI: video: fix build for VIDEO_OUTPUT_CONTROL=n drivers/built-in.o: In function `acpi_video_bus_put_devices': video.c:(.text+0x79663): undefined reference to `video_output_unregister' drivers/built-in.o: In function `acpi_video_bus_add': video.c:(.text+0x7b0b3): undefined reference to `video_output_register' Signed-off-by: Len Brown commit 12d3206466d2074ef0684aaf7759ae01a0a92560 Author: Lin Ming Date: Thu Dec 9 16:51:06 2010 +0800 ACPI: fix allowing to add/remove multiple _OSI strings commit b0ed7a91(ACPICA/ACPI: Add new host interfaces for _OSI suppor) introduced another regression that only one _OSI string can be added or removed. Now multiple _OSI strings can be added or removed, for example acpi_osi=Linux acpi_osi=FreeBSD acpi_osi="!Windows 2006" Signed-off-by: Lin Ming Signed-off-by: Len Brown commit d90aa92c0c1625d7f02050e4d2924805840cda3d Author: Lin Ming Date: Thu Dec 9 16:50:52 2010 +0800 acpi: fix _OSI string setup regression commit b0ed7a91(ACPICA/ACPI: Add new host interfaces for _OSI suppor) introduced a regression that _OSI string setup fails. There are 2 paths to setup _OSI string. DMI: acpi_dmi_osi_linux -> set_osi_linux -> acpi_osi_setup -> copy _OSI string to osi_setup_string Boot command line: acpi_osi_setup -> copy _OSI string to osi_setup_string Later, acpi_osi_setup_late will be called to handle osi_setup_string. If _OSI string is "Linux" or "!Linux", then the call path is, acpi_osi_setup_late -> acpi_cmdline_osi_linux -> set_osi_linux -> acpi_osi_setup -> copy _OSI string to osi_setup_string This actually never installs _OSI string(acpi_install_interface not called), but just copy the _OSI string to osi_setup_string. This patch fixes the regression. Reported-and-tested-by: Lukas Hejtmanek Signed-off-by: Lin Ming Signed-off-by: Len Brown commit b007c389d3e09b823eccda1503390fa2a9adca0d Author: John Stultz Date: Fri Dec 10 22:19:53 2010 -0800 hrtimer: fix timerqueue conversion flub In converting the hrtimers to timerqueue, I missed a spot in hrtimer_run_queues where we loop running timers. We end up not pulling the new next value out and instead just use the last next value, causing boot time hangs in some cases. The proper fix is to pull timerqueue_getnext each iteration instead of using a local next value. Reported-by: Ingo Molnar Signed-off-by: John Stultz commit 9835fd7321a67feba6432e63bf2cba43f5a56bd9 Author: Carolyn Wyborny Date: Mon Nov 22 17:17:21 2010 +0000 igb: Add new function to read part number from EEPROM in string format New adapters will have part numbers stored in string format rather than simple hex format. This function will read part number formats in either hex or string. Signed-off-by: Carolyn Wyborny Signed-off-by: Jeff Kirsher commit c920aa8b87bfec3dbd926ae777430e613e5088df Author: Bruce Allan Date: Wed Dec 1 08:45:24 2010 +0000 e1000e: increment the driver version Signed-off-by: Bruce Allan Tested-by: Jeff Pieper Signed-off-by: Jeff Kirsher commit 61c758166701c4f156c0aba10260f5729b1a6f43 Author: Bruce Allan Date: Thu Dec 9 23:04:25 2010 +0000 e1000e: static analysis tools complain of a possible null ptr p dereference Adding this default case resolves the issue. v2- Removed "break" in default case based on feedback Signed-off-by: Bruce Allan Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit e9262447233037e9336d5866628821156a17366f Author: Bruce Allan Date: Wed Nov 24 06:02:06 2010 +0000 e1000e: minor error message corrections Correct error messages when setting up Rx resources and when checking module parameters. Signed-off-by: Bruce Allan Tested-by: Jeff Pieper Signed-off-by: Jeff Kirsher commit 36b973df713e1395b79896de667ad7dbb1925fa7 Author: Bruce Allan Date: Wed Nov 24 07:42:43 2010 +0000 e1000e: prevent null ptr dereference in e1000_tx_queue() tx_desc can be dereferenced as a null pointer when count is passed in as 0. Signed-off-by: Bruce Allan Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit 073287c037083497ebaaf75ead469b769f218615 Author: Bruce Allan Date: Wed Nov 24 06:01:51 2010 +0000 e1000e: support new PBA format from EEPROM Provide support to e1000e for displaying the new format of the PBA found in the EEPROM. The unique PBA identifier is no longer restricted to hexadecimal numbers and must now be read and displayed as a string. Signed-off-by: Bruce Allan Tested-by: Jeff Pieper Signed-off-by: Jeff Kirsher commit 664dc878ed6f0476b875547547a49e06f7a4e73b Author: Bruce Allan Date: Wed Nov 24 06:01:46 2010 +0000 e1000e: 82579 PHY incorrectly identified during init During init, reading the 2 PHY ID registers back-to-back in the default fast mode could return invalid data (all F's) and in slow mode could return data to the second read the data from the first read. To resolve the issue in fast mode, set to slow mode before any PHY accesses; to resolve the issue in slow mode, put in a delay for every 82579 PHY access. Since this PHY is currently only paired with the pch2lan MAC and the PHY type is not known before the first PHY access which can fail this way, check for this based on MAC-type. Signed-off-by: Bruce Allan Tested-by: Jeff Pieper Signed-off-by: Jeff Kirsher commit ce54afd16d874ac07378a8bb55d26f7f5b613c0e Author: Bruce Allan Date: Wed Nov 24 06:01:41 2010 +0000 e1000e: 82577/8/9 mis-configured OEM bits during S0->Sx The LPLU (Low Power Link Up) and Gigabit Disable bits (a.k.a. OEM bits) were being configured incorrectly when device goes to D3 state. Signed-off-by: Bruce Allan Tested-by: Jeff Pieper Signed-off-by: Jeff Kirsher commit d9c76f99c2a79feb413e3e751362d59c0f5323f6 Author: Bruce Allan Date: Wed Nov 24 06:01:35 2010 +0000 e1000e: 82571 Serdes can fail to get link When link partner is sending continuous Config symbols, the 82571 Serdes FIFO can overflow resulting in Invalid bit getting set. To resolve this, if Sync and Config bits are both 1 ignore the Invalid bit and restart auto-negotiation. Signed-off-by: Bruce Allan Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit cbd006cb7d4e7b76c6febf7f51e970bced132914 Author: Bruce Allan Date: Wed Nov 24 06:01:30 2010 +0000 e1000e: 82577/8 must acquire h/w semaphore before workaround The workaround function e1000_configure_k1_pchlan() assumes the h/w semaphore is already acquired. This was originally missed when setting up the part for the ethtool loopback test. Signed-off-by: Bruce Allan Tested-by: Jeff Pieper Signed-off-by: Jeff Kirsher commit ed5c2b0b78e5467f7948bef92b21f3c76823f392 Author: Bruce Allan Date: Wed Nov 24 06:01:25 2010 +0000 e1000e: 82574/82583 performance improvement Increasing the transmit fifo by 4K (by decreasing the receive fifo size specified in .pba by the same amount) increases Tx performance. Signed-off-by: Bruce Allan Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit a82a14f4cdcfedb27eacec8eb4d9e47d42c10d43 Author: Bruce Allan Date: Wed Nov 24 06:01:20 2010 +0000 e1000e: 82571-based mezzanine card can fail ethtool link test On certain 82571-based mezzanine NICs in some blade servers, the ethtool link test can fail due to the serdes_has_link flag not set correctly. Signed-off-by: Bruce Allan Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit 9633e63bb1d82c02950983d5d3317e6656b11c8e Author: Holger Eitzenberger Date: Wed Nov 17 15:43:52 2010 +0000 e1000e: fix double initialization in blink path The kernel goes BUG() at the time 'ethtool -p eth0 3' comes back, which is due to adapter->led_blink_task initialized several times. At the time it is still running this results in a corrupted task_list of the associated workqueue. The fix is to move the workqueue initialization to the probe function instead. Signed-off-by: Holger Eitzenberger Reviewed-by: Jesse Brandeburg Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit 9fe93afdd07aba52a018eb52784124579a80470e Author: Don Skidmore Date: Fri Dec 3 09:33:54 2010 +0000 ixgbe: cleanup string function calls to use bound checking versions. Some minor cleanup to use string calls that use bound checks just to be extra safe. Signed-off-by: Don Skidmore Tested-by: Stephen Ko Signed-off-by: Jeff Kirsher commit 5136cad37b276e3e11c4f8ad0bcf9cb2eec0e5af Author: Emil Tantilov Date: Wed Dec 1 05:47:05 2010 +0000 ixgbe: fix ntuple support commit f62bbb5e62c6e4a91fb222d22bc46e8d4d7e59ef ixgbe: Update ixgbe to use new vlan accleration. removed ETH_FLAG_NTUPLE from the supported flags. This patch puts it back on to allow for setting ntuple via ethtool. CC: Jesse Gross Signed-off-by: Emil Tantilov Tested-by: Stephen Ko Signed-off-by: Jeff Kirsher commit d994653db465616a7bf27703e733170c47488cdf Author: Don Skidmore Date: Thu Dec 9 06:55:19 2010 +0000 ixgbe: fix X540 to use it's own info struct This patch enables X540 hardware to use it's own set of support functions. This is useful as it has no need of SFP+ support. A couple minor bugs with the eeprom semaphore were also cleaned up. Signed-off-by: Don Skidmore Tested-by: Stephen Ko Signed-off-by: Jeff Kirsher commit 2b264909c660717a67da997a181a4a4f551ef9b6 Author: Don Skidmore Date: Thu Dec 9 06:55:14 2010 +0000 ixgbe: fix X540 phy id to correct value The existing PHY ID for X540 was from early production hardware and is no longer correct. This patch corrects that. Signed-off-by: Don Skidmore Tested-by: Stephen Ko Signed-off-by: Jeff Kirsher commit ae54496f9e8d40c89e5668205c181dccfa9ecda1 Author: Emil Tantilov Date: Sat Dec 4 05:35:17 2010 +0000 ixgb: Don't check for vlan group on transmit Based on a patch from Jesse Gross. Enable vlan tag insertion even when vlan group is not configured. For ixgb HW both CTRL0.VME and VLE bit in the Tx descriptor need to be set in order to enable HW acceleration. Introduced separate functions for enabling/disabling of vlan tag stripping similar to ixgbe. CC: Jesse Gross Signed-off-by: Emil Tantilov Tested-by: Jeff Pieper Signed-off-by: Jeff Kirsher commit 667445008db3f45a760c235d771be0c9671e59e5 Author: Jeff Kirsher Date: Wed Dec 1 19:59:50 2010 +0000 Intel Wired LAN drivers: Use static const Based on work by Joe Perches Using static const to decrease data and overall object size. CC: Joe Perches Signed-off-by: Jeff Kirsher Tested-by: Emil Tantilov commit 19a0b67afd174c4db261d587b5c67704dcd53c17 Author: Dean Nelson Date: Thu Nov 11 05:50:25 2010 +0000 e1000: fix return value not set on error Dean noticed that 'err' wasn't being set when the "goto err_dma" statement is executed in the following hunk from the commit. It's value will be zero as a result of a successful call to e1000_init_hw_struct(). This patch changes the error condition to be correctly propagated. CC: stable@kernel.org Signed-off-by: Dean Nelson Signed-off-by: Jesse Brandeburg Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit fa795e6b9c59a14c80a475428df7e4cb97396f47 Author: Jeff Kirsher Date: Fri Dec 10 00:09:08 2010 -0800 MAINTAINERS: Update Intel Wired LAN info Update with Intel Wired Ethernet public git trees. Signed-off-by: Jeff Kirsher commit dabee56860bc6b617c7ea481bb9b00fba41c9c48 Author: Jeff Kirsher Date: Fri Dec 10 00:01:44 2010 -0800 Documentation/networking/ixgbevf.txt: Update documentation Update Intel Wired LAN ixgbevf documentation. Signed-off-by: Jeff Kirsher commit 872857a84e18f4bf9b56b298309a977b2ce77b5b Author: Jeff Kirsher Date: Thu Dec 9 23:55:47 2010 -0800 Documentation/networking/ixgbe.txt: Update ixgbe documentation Update Intel Wired LAN ixgbe documentation. Signed-off-by: Jeff Kirsher commit f2be1429798785c6b7d4747ac1fda2c40b3f26eb Author: Jeff Kirsher Date: Thu Dec 9 23:49:34 2010 -0800 Documentation/networking/igbvf.txt: Update documentation Update Intel Wired LAN igbvf documentation. Signed-off-by: Jeff Kirsher commit 1ffd7246445038569f4c2f4b39bda1e71e68f1a2 Author: Jeff Kirsher Date: Thu Dec 9 23:47:39 2010 -0800 Documentation/networking/igb.txt: update documentation Update Intel Wired LAN igb documentation. v2- Updated the ethtool support link, removed the LRO section and anti-spoofing sections. Signed-off-by: Jeff Kirsher commit 072ed34fa97374b390a2493fa281ec8a7888b312 Author: Jeff Kirsher Date: Thu Dec 9 23:44:42 2010 -0800 Documentation/networking/e1000e.txt: Update documentation Update Intel Wired LAN e1000e documentation. Signed-off-by: Jeff Kirsher commit 96c3c0330dea8856f02fc59e25c866d6d5eebed5 Author: Jeff Kirsher Date: Thu Dec 9 23:42:00 2010 -0800 Documentation/networking/e1000.txt: Update documentation Update Intel Wired LAN e1000 documentation. Signed-off-by: Jeff Kirsher commit c2015dc88a57090bcf67ab7cfcdbc34671598d36 Author: Paul Walmsley Date: Mon Dec 6 20:52:40 2010 +0000 OMAP2: PRCM: fix some SHIFT macros that were actually bitmasks After Charu's GPIO hwmod patches, GPIO initialization on N800 emits the following messages for all GPIO banks: omap_hwmod: gpio1: cannot be enabled (3) This is due to OMAP24XX_ST_GPIOS_SHIFT being defined as a bitmask. Fix this and also fix two other macros that had the same problem. Thanks to Tony Lindgren for originally reporting this bug. Signed-off-by: Paul Walmsley Signed-off-by: Tony Lindgren commit a5d62a149bb8f5359aff7ed7dce339752fbabfd9 Author: David S. Miller Date: Fri Dec 10 16:49:24 2010 -0800 isdn: Fix printed out copy_from_user() return value after previous change. Signed-off-by: David S. Miller commit 23bcbf1b63350ed529f7dfb8a5c459e6e0c1a3ca Merge: 6313e3c21743cc88bb5bd8aa72948ee1e83937b6 595a251c0740785fd3c0d2156d78578c7479811e Author: David S. Miller Date: Fri Dec 10 16:34:10 2010 -0800 Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6 commit f073c7ca29a4a7e14060d9d3ddf09bfbb7cd9cc0 Author: Taku Izumi Date: Thu Dec 9 15:17:13 2010 +0000 bonding: add the debugfs facility to the bonding driver This patch provides the debugfs facility to the bonding driver. The "bonding" directory is created in the debugfs root and directories of each bonding interface (like bond0, bond1...) are created in that. # mount -t debugfs none /sys/kernel/debug # ls /sys/kernel/debug/bonding bond0 bond1 Signed-off-by: Taku Izumi Signed-off-by: Jay Vosburgh Signed-off-by: David S. Miller commit 6c2c9d964e71770e7d6efc1a82f3621005d12185 Author: Roopa Prabhu Date: Fri Dec 10 12:02:33 2010 +0000 enic: Move enic port profile handling code to a new 802.1Qbh provisioning info type Signed-off-by: Roopa Prabhu Signed-off-by: David Wang Signed-off-by: Christian Benvenuti Signed-off-by: David S. Miller commit a19faf0250e09b16cac169354126404bc8aa342b Author: Eric Dumazet Date: Sun Dec 5 18:50:32 2010 +0000 net: fix skb_defer_rx_timestamp() After commit c1f19b51d1d8 (net: support time stamping in phy devices.), kernel might crash if CONFIG_NETWORK_PHY_TIMESTAMPING=y and skb_defer_rx_timestamp() handles a packet without an ethernet header. Fixes kernel bugzilla #24102 Reference: https://bugzilla.kernel.org/show_bug.cgi?id=24102 Reported-and-tested-by: Andrew Watts Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 36accaed22347f4b09cbc3c9fe2c1163a3575ea1 Author: Dan Carpenter Date: Fri Dec 10 02:40:09 2010 +0000 isdn: return -EFAULT if copy_from_user() fails We should be returning -EFAULT here. Mostly this patch is to silence a smatch warning. The upper levels of this driver turn all non-zero return values from isar_load_firmware() into 1. Signed-off-by: Dan Carpenter Signed-off-by: David S. Miller commit 5d52040d4d1eabb56a4d51b760ab8f74eabb9001 Author: Jon Mason Date: Fri Dec 10 14:03:02 2010 +0000 vxge: update driver version Update vxge driver version to 2.5.1 Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit b55e7b153f698bb027102759388d0c09542f68bd Author: Jon Mason Date: Fri Dec 10 14:03:01 2010 +0000 vxge: independent interrupt moderation Configure the workload clock register and TIM register for independent interrupt moderation based on the individual vpath utilization instead of common link utilization. This greatly improves latency. Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit 9c1638871671721e8f3693a0dfbb0e2e05b08742 Author: Jon Mason Date: Fri Dec 10 14:03:00 2010 +0000 vxge: hotplug stall When hot-unplugging a vxge adapter while running, the driver's remove routine prints warning and then stalls the calling thread. This is due to vxge_remove calling vxge_device_unregister to unregister the netdev before calling flush_scheduled_work clear any pending work. Swapping the order of these two functions resolves the issue. Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit 2e41f6449c561e6e3f572e11d0f2240bd51104db Author: Jon Mason Date: Fri Dec 10 14:02:59 2010 +0000 vxge: transmit timeout deadlock Use a workqueue to handle the device reset during a transmit timeout, as there can be a deadlock during bringup. Also, set the netif carrier off before the watchdog reset is started to prevent the timeout from reoccurring while still processing the first. Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit dc66daa9be40369ead5a4ee33c6bcfb44cb3c8ee Author: Jon Mason Date: Fri Dec 10 14:02:58 2010 +0000 vxge: use pci_request_region() Only BAR0 is ever accessed, thus making the calls to pci_request_regions overkill. Change calls of pci_request_regions to pci_request_region to reduce the size of the mapped area. Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit c92bf70dcb9d08f821e4c9f09f8fc328495ba998 Author: Jon Mason Date: Fri Dec 10 14:02:57 2010 +0000 vxge: fix crash of VF when unloading PF Calling pci_disable_sriov when unloading a SR-IOV physical function driver from a host when a guest is using a virtual function from that device can cause a host crash or VM crash. The crash is caused by the virtual config space no longer being present when PF is removed (due to the pci_disable_sriov). This can be avoided by not calling pci_disable_sriov to disable the PCI space when shutting down the PF. Each function in the X3100 operates independently and in this case will operate properly in the absence of the PF. Also, added improved logic in the detection of SR-IOV initialization. Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit 528f727279ae840db8a06c94f5e82cdaeb00da6f Author: Jon Mason Date: Fri Dec 10 14:02:56 2010 +0000 vxge: code cleanup and reorganization Move function locations to remove the need for internal declarations and other misc clean-ups. Signed-off-by: Jon Mason Signed-off-by: Arpit Patel Signed-off-by: David S. Miller commit deef4b522b814593407cfd56216840c2b75e9f15 Author: Herbert Xu Date: Thu Dec 9 17:38:11 2010 +0000 bridge: Use consistent NF_DROP returns in nf_pre_routing The nf_pre_routing functions in bridging have collected two distinct ways of returning NF_DROP over the years, inline and via goto. There is no reason for preferring either one. So this patch arbitrarily picks the inline variant and converts the all the gotos. Also removes a redundant comment. Signed-off-by: Herbert Xu Signed-off-by: David S. Miller commit c053fd96d0d3d18c721f880b8fdd0b925894d9c4 Author: Changli Gao Date: Fri Dec 10 16:02:20 2010 -0800 af_packet: use swap() instead of the open coded macro XC() Signed-off-by: Changli Gao Signed-off-by: David S. Miller commit ed4ba4b5b96742d29225308ccccbdb1810b63064 Author: Ben Hutchings Date: Thu Dec 9 12:10:25 2010 +0000 netdev: Use default implementation of ethtool_ops::get_link where possible Various drivers are using implementations of ethtool_ops::get_link that are equivalent to the default ethtool_op_get_link(). Change them to use that instead. Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit e596e6e4d578f2639416e620d367a3af34814a40 Author: Ben Hutchings Date: Thu Dec 9 12:08:35 2010 +0000 ethtool: Report link-down while interface is down While an interface is down, many implementations of ethtool_ops::get_link, including the default, ethtool_op_get_link(), will report the last link state seen while the interface was up. In general the current physical link state is not available if the interface is down. Define ETHTOOL_GLINK to reflect whether the interface *and* any physical port have a working link, and consistently return 0 when the interface is down. Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit c710245caa41060e983cc9cb5ffcc020e02ca45f Author: Casey Leedom Date: Thu Dec 9 09:38:24 2010 +0000 cxgb4vf: Ingress Queue Entry Size needs to be 64 bytes Was using L1_CACHE_BYTES for the Ingress Queue Entry Size but it really needs to be 64 bytes in order to support the largest message sizes. Signed-off-by: Casey Leedom Signed-off-by: David S. Miller commit 377ecca9ba6d98f31517e2322075e94d1be94561 Author: Giuseppe CAVALLARO Date: Wed Dec 8 23:05:13 2010 +0000 phy: add the IC+ IP1001 driver This patch adds the IC+ IP1001 (Gigabit Ethernet Transceiver) driver. I've had to add an additional delay (2ns) to adjust RX clock phase at GMII/ RGMII interface (according to the PHY data-sheet). This helps to have the RGMII working on some ST platforms. Signed-off-by: Giuseppe Cavallaro Signed-off-by: David S. Miller commit d9ca676bcb26e1fdff9265a3e70f697cd381c889 Author: Dan Williams Date: Wed Dec 8 19:40:47 2010 +0000 atm: correct sysfs 'device' link creation and parent relationships The ATM subsystem was incorrectly creating the 'device' link for ATM nodes in sysfs. This led to incorrect device/parent relationships exposed by sysfs and udev. Instead of rolling the 'device' link by hand in the generic ATM code, pass each ATM driver's bus device down to the sysfs code and let sysfs do this stuff correctly. Signed-off-by: Dan Williams Signed-off-by: David S. Miller commit fb890ae7d615f4b4f5689144b6832230ab2046aa Author: Kyle McMartin Date: Thu Dec 9 09:50:08 2010 +0000 MAINTAINERS: remove me from tulip It was a nice idea, but -ENOTIME and -ENOHW. I never got around to doing a lot of the clean up that I intended to. Signed-off-by: Kyle McMartin Acked-by: Grant Grundler Signed-off-by: David S. Miller commit 29639059a0122d95b34b5475bd9fee3910b401a3 Author: Roopa Prabhu Date: Wed Dec 8 13:54:03 2010 +0000 enic: Use VF mac set by IFLA_VF_MAC in port profile provisioning data This patch adds support in enic 802.1Qbh port profile provisioning code to use the mac address set by IFLA_VF_MAC. For now we handle this mac as a special case for a VM mac address sent to us by libvirt. The VM mac address is sent to the switch along with the rest of the port profile provisioning data. This patch also adds calls to register and deregister the mac address during port profile association/deassociation. Signed-off-by: Roopa Prabhu Signed-off-by: David Wang Signed-off-by: Christian Benvenuti Signed-off-by: David S. Miller commit 0b1c00fc3e9f8d658e0632da7e7ee57bed779ec7 Author: Roopa Prabhu Date: Wed Dec 8 13:53:58 2010 +0000 enic: Add ndo_set_vf_mac support for enic dynamic devices This patch implements the ndo_set_vf_mac netdev operation for enic dynamic devices. It treats the mac address set by IFLA_VF_MAC as a special case to use it in the port profile provisioning data. Signed-off-by: Roopa Prabhu Signed-off-by: David Wang Signed-off-by: Christian Benvenuti Signed-off-by: David S. Miller commit 319d7e847355ec7e03d3c865917b2b0e2e592fb8 Author: Roopa Prabhu Date: Wed Dec 8 13:19:58 2010 +0000 enic: Add ndo_set_rx_mode support for enic vnics Add ndo_set_rx_mode support to register unicast and multicast address filters for enic devices Signed-off-by: Roopa Prabhu Signed-off-by: Vasanthy Kolluri Signed-off-by: David Wang Signed-off-by: Christian Benvenuti Signed-off-by: David S. Miller commit a8d764b9832d3cc86019f71916665dd2d337d7c2 Author: Junchang Wang Date: Wed Dec 8 16:55:16 2010 +0000 pktgen: adding prefetchw() call We know for sure pktgen is going to write skb->data right after *_alloc_skb, causing unnecessary cache misses. Idea is to add a prefetchw() call to prefetch the first cache line indicated by skb->data. On systems with Adjacent Cache Line Prefetch, it's probably two cache lines are prefetched. With this patch, pktgen on Intel SR1625 server with two E5530 quad-core processors and a single ixgbe-based NIC went from 8.63Mpps to 9.03Mpps, with 4.6% improvement. Signed-off-by: Junchang Wang Acked-by: Eric Dumazet Signed-off-by: David S. Miller commit 40a010395cd66053f07bffeb3da5e44683bac30e Author: Wei Yongjun Date: Tue Dec 7 17:11:09 2010 +0000 SCTP: Fix SCTP_SET_PEER_PRIMARY_ADDR to accpet v4mapped address SCTP_SET_PEER_PRIMARY_ADDR does not accpet v4mapped address, using v4mapped address in SCTP_SET_PEER_PRIMARY_ADDR socket option will get -EADDRNOTAVAIL error if v4map is enabled. This patch try to fix it by mapping v4mapped address to v4 address if allowed. Signed-off-by: Wei Yongjun Acked-by: Vlad Yasevich Signed-off-by: David S. Miller commit e4f05af136016958f52455da3070ca6622439b10 Author: Ondrej Puzman Date: Sat Dec 4 21:17:38 2010 +0100 8250: fix uninitialized FIFOs I have found a bug in 8250.c driver which causes that 16550A uart FIFOs are not turned on during initialization if they are manually configured by setserial. UART is then working only as plain 16450 without FIFOs. On systems with higher interrupt latency this causes buffer overruns and loss of received data when using higher communication speeds. I'm working for a company which produces industrial computers. These devices typically contain high number (8 or more) of traditional 16550A uarts - we use TL16C554A chips, but that is not much relevant. UARTs are connected to the CPU by ISA bus (Celeron based devices) or LPC bus (Atom based devices). In the Linux the UARTs are using standard 8250.c driver and are initialized using setserial command: setserial /dev/ttyS4 uart 16550A port 0x3E0 irq 10 baud_base 115200 This executes the UART initialization through serial8250_startup() function. At the beginning of the function up->capabilities is initialized from uart_config: up->capabilities = uart_config[up->port.type].flags; Please note that neither up->port.fifosize nor up->tx_loadsz is initialized here!! Later in the same function serial8250_clear_fifos() is called and disables FIFOs. The above comment says that they will be reenabled in set_termios (they won't ...) After serial8250_startup() the serial8250_set_termios() is called. In this function the following check fails because up->port.fifosize is zero because it is not initialized correctly. if (up->capabilities & UART_CAP_FIFO && up->port.fifosize > 1) { if (baud < 2400) fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1; else fcr = uart_config[up->port.type].fcr; } fcr variable remains zero and in the end the FCR register is set to zero which results in disabled FIFOs even if the UART type is 16550A. This is also true for other types of UARTs with FIFOs. If the UART is autoconfigured via 'setserial /dev/ttySx autoconfig' then port.fifosize and tx_loadsz are initialized correctly in the autoconfig() function and the UART is working correctly then. I checked the source codes and I can say that this bug is present in 2.6.x series of kernels for a couple of years. Namely I can confirm its presence in 2.6.16.57, 2.6.32.24 and 2.6.36.1 (tested all of them on our hardware). I think it was not noticed before because not many people use manually configured non PNP UARTs on ISA/LPC bus these days. Also the data loss caused by buffer overruns occures only if IRQ latency is higher then time needed to receive one character on given communication speed. For example our hardware looses received characters only if the UARTs are connected throught LPC bus with SERIRQ (serial IRQ transport) and not if they are connected to ISA bus because LPC SERIRQ has higher interrupt latency then parallel ISA interupt lines. Here is the patch to correct the bug created against 2.6.36.1: Signed-off-by: Ondrej Puzman Signed-off-by: Greg Kroah-Hartman commit 53139e36cdd7bbc5efcbdc5e70fbff66e2da3c09 Author: Namhyung Kim Date: Tue Dec 7 23:27:43 2010 +0900 ip2: fix compiler warning on ip2main_pci_tbl Annotate ip2main_pci_tbl as '__used' to fix following warning: CC drivers/char/ip2/ip2main.o drivers/char/ip2/ip2main.c:3227: warning: ‘ip2main_pci_tbl’ defined but not used Signed-off-by: Namhyung Kim Cc: "Michael H. Warfield" Signed-off-by: Greg Kroah-Hartman commit fd0f5c54eeb66e3e89e3cdd34c5abf8d5fbcf61c Author: Namhyung Kim Date: Tue Dec 7 23:27:42 2010 +0900 specialix: fix compiler warning on specialix_pci_tbl Annotate specialx_pci_tbl as '__used' to fix following warning: CC drivers/char/specialix.o drivers/char/specialix.c:2358: warning: ‘specialx_pci_tbl’ defined but not used Signed-off-by: Namhyung Kim Cc: Roger Wolff Signed-off-by: Greg Kroah-Hartman commit 6835a209f6c24b3704aa58d8b558a513a5a08c52 Author: Namhyung Kim Date: Tue Dec 7 23:27:41 2010 +0900 rocket: fix compiler warning on rocket_pci_ids Annotate rocket_pci_ids as '__used' to fix following warning: CC drivers/char/rocket.o drivers/char/rocket.c:1767: warning: ‘rocket_pci_ids’ defined but not used Signed-off-by: Namhyung Kim Signed-off-by: Greg Kroah-Hartman commit a3ae0fc34f58e7163b7724feb3d77aa4603f0dc3 Author: Jamie Iles Date: Wed Dec 1 23:39:36 2010 +0000 8250: add a UPIO_DWAPB32 for 32 bit accesses Some platforms contain a Synopsys DesignWare APB UART that is attached to a 32-bit APB bus where sub-word accesses are not allowed. Add a new IO type (UPIO_DWAPB32) that performs 32 bit acccesses to the UART. v2: - don't test for 32 bit in the output fast path, provide a separate dwabp32_serial_out() function. Refactor dwabp_serial_out() so that we can reuse the LCR saving code. v3: - rebased on top of "8250: use container_of() instead of casting" Signed-off-by: Jamie Iles Signed-off-by: Greg Kroah-Hartman commit 49d5741be27aa90301b89bf254972b355ed9c8ee Author: Jamie Iles Date: Wed Dec 1 23:39:35 2010 +0000 8250: use container_of() instead of casting The 8250 driver structure uart_8250_port took advantage of the fact that the struct uart_port was the first member of its structure and used an explicit cast to convert to the derived class. Replace the explicit casts with container_of() for safety and clarity. Signed-off-by: Jamie Iles Signed-off-by: Greg Kroah-Hartman commit 1b41dbc1296269797efbb2b0837732b74de4731d Author: Cosmin Cojocar Date: Sun Dec 5 16:15:10 2010 +0100 serial: omap-serial: Add support for kernel debugger The kgdb invokes the poll_put_char and poll_get_char when communicating with the host. This patch also changes the initialization order because the kgdb will check at the very beginning, if there is a valid serial driver. Signed-off-by: Cosmin Cojocar Signed-off-by: Greg Kroah-Hartman commit 5ac387d983149d4658aad17242d24eef85a43fa8 Author: Randy Dunlap Date: Thu Dec 2 09:19:48 2010 -0800 serial: fix pch_uart kconfig & build The dma_request_channel/dma_release_channel interfaces are not built when DMADEVICES is not enabled, so make the driver depend on DMADEVICES. Also, the help text says that the driver enables & uses PCH_DMA, which is not enabled, so select that. ERROR: "__dma_request_channel" [drivers/serial/pch_uart.ko] undefined! ERROR: "dma_release_channel" [drivers/serial/pch_uart.ko] undefined! Signed-off-by: Randy Dunlap Cc: Tomoya MORINAGA Reported-by: Zimny Lech Signed-off-by: Greg Kroah-Hartman commit 4afb7527ac8cc7bd8f03570e12f6eed0eca03363 Author: stephen hemminger Date: Mon Dec 6 12:33:01 2010 +0000 sfc: convert references to LRO to GRO This driver now uses Generic Receive Offload, not the older LRO. Change references to LRO in names and comments. Signed-off-by: Stephen Hemminger Acked-by: Ben Hutchings Signed-off-by: David S. Miller commit 79aeec5822cea63cf732bbc0c9f3337542352616 Author: Vasanthy Kolluri Date: Wed Dec 8 13:05:45 2010 +0000 enic: Bug Fix: Pass napi reference to the isr that services receive queue Pass reference to napi instead of enic device to the isr that services receive queue. Signed-off-by: Vasanthy Kolluri Signed-off-by: Roopa Prabhu Signed-off-by: David Wang Signed-off-by: David S. Miller commit 376d940ee91318cc6becefbb9454bb4454d7473f Author: Tobias Klauser Date: Thu Dec 9 04:37:48 2010 +0000 inet6: Remove redundant unlikely() IS_ERR() already implies unlikely(), so it can be omitted here. Signed-off-by: Tobias Klauser Signed-off-by: David S. Miller commit 0e51d67ebb8e109a0990a13dafa937fb469aa3fb Author: Tobias Klauser Date: Thu Dec 9 04:50:22 2010 +0000 stmmac: Remove redundant unlikely() IS_ERR() already implies unlikely(), so it can be omitted here. Signed-off-by: Tobias Klauser Signed-off-by: David S. Miller commit 040253c931e336360453c8d81f76d1b010b2b5e7 Author: Martin Willi Date: Wed Dec 8 04:37:51 2010 +0000 xfrm: Traffic Flow Confidentiality for IPv6 ESP Add TFC padding to all packets smaller than the boundary configured on the xfrm state. If the boundary is larger than the PMTU, limit padding to the PMTU. Signed-off-by: Martin Willi Acked-by: Herbert Xu Signed-off-by: David S. Miller commit d979e20f2b9f8a50c8d5f889e0b5d78580440d1f Author: Martin Willi Date: Wed Dec 8 04:37:50 2010 +0000 xfrm: Traffic Flow Confidentiality for IPv4 ESP Add TFC padding to all packets smaller than the boundary configured on the xfrm state. If the boundary is larger than the PMTU, limit padding to the PMTU. Signed-off-by: Martin Willi Acked-by: Herbert Xu Signed-off-by: David S. Miller commit 35d2856b4693e8de5d616307b56cef296b839157 Author: Martin Willi Date: Wed Dec 8 04:37:49 2010 +0000 xfrm: Add Traffic Flow Confidentiality padding XFRM attribute The XFRMA_TFCPAD attribute for XFRM state installation configures Traffic Flow Confidentiality by padding ESP packets to a specified length. Signed-off-by: Martin Willi Acked-by: Herbert Xu Signed-off-by: David S. Miller commit 957fca95e3521e471aac4c2e4cfbc21f399bdd84 Author: Changli Gao Date: Sat Dec 4 15:01:52 2010 +0000 ifb: use the lockless variants of skb_queue rq and tq are both protected by tx queue lock, so we can simply use the lockless variants of skb_queue. skb_queue_splice_tail_init() is used instead of the open coded and slow one. Signed-off-by: Changli Gao Signed-off-by: Jamal Hadi Salim Signed-off-by: David S. Miller commit c6350362cbb19882ba0eb3578cc1abc07e6ea204 Author: Changli Gao Date: Fri Dec 3 19:55:20 2010 +0000 ifb: remove unused macro TX_TIMEOUT Signed-off-by: Changli Gao Signed-off-by: Jamal Hadi Salim Signed-off-by: David S. Miller commit e1f91505025db74c261962dc16d58f79b9b0c83c Author: Changli Gao Date: Fri Dec 3 19:55:19 2010 +0000 ifb: remove the useless debug stats These debug stats are not exported, and become useless. Signed-off-by: Changli Gao Signed-off-by: Jamal Hadi Salim Signed-off-by: David S. Miller commit 6c34d2888221ca3df81e29f598873b4fb6cf838d Author: Yauheni Kaliuta Date: Wed Dec 8 13:12:06 2010 +0200 usb: gadget: g_ncm added This patches makes possible to use composite framework and f_ncm NCM function driver to build a standalone NCM gadget device. Signed-off-by: Yauheni Kaliuta Signed-off-by: Greg Kroah-Hartman commit 9f6ce4240a2bf456402c15c06768059e5973f28c Author: Yauheni Kaliuta Date: Wed Dec 8 13:12:05 2010 +0200 usb: gadget: f_ncm.c added Initial submittion of NCM link function driver. The driver's logic is based on f_ecm driver and does not use most of the NCM advantages like frame grouping and alignment. Signed-off-by: Yauheni Kaliuta Signed-off-by: Greg Kroah-Hartman commit 5c1168dbc508282f7717a4472477d52d64403060 Author: Yauheni Kaliuta Date: Wed Dec 8 13:12:04 2010 +0200 usb: gadget: u_ether: prepare for NCM NCM is a Network Control Model, subclass of USB CDC class, specification is available at http://www.usb.org/developers/devclass_docs This patch makes possible for u_ether to use multiply of wMaxPacketSize predefined size transfers without ZLP (Zero Length Packet), required by NCM spec. Signed-off-by: Yauheni Kaliuta Signed-off-by: Greg Kroah-Hartman commit a6a5ff26975c87a97f88c6ea077c325ff20c4cf2 Author: Jan Glauber Date: Wed Dec 8 02:58:01 2010 +0000 qeth: buffer count imbalance The used buffers counter is not incremented in case of an error so the counter can become negative. Increment the used buffers counter before checking for errors. Signed-off-by: Jan Glauber Signed-off-by: Frank Blaschka Signed-off-by: David S. Miller commit 91d4576bfe87980b1b86305c29912d96b96ce98e Author: Frank Blaschka Date: Wed Dec 8 02:58:00 2010 +0000 qeth: l3 add vlan hdr in passthru frames OSA l3 mode is hw accelerated VLAN only for IPv4. Take care we add the vlan hdr to a passthru frame in the device driver. Signed-off-by: Frank Blaschka Signed-off-by: David S. Miller commit f154b79cd7db221240ab6e8e4d844d3a3f10b04c Author: Einar Lueck Date: Wed Dec 8 02:57:59 2010 +0000 qeth: support VIPA add/del in offline mode Only work through the IP adddress to do list if the card is UP or SOFTSETUP. Enables to configure VIPA add/del in offline mode. Signed-off-by: Einar Lueck Signed-off-by: Frank Blaschka Signed-off-by: David S. Miller commit d0ddf30fdd2b98fb547ffa33bb79a7a96ef8d7dd Author: Einar Lueck Date: Wed Dec 8 02:57:58 2010 +0000 qeth: support ipv6 query arp cache for HiperSockets Function qeth_l3_arp_query now queries for IPv6 addresses, too, if QETH_QARP_WITH_IPV6 is passed as parameter to the ioctl. HiperSockets and GuestLAN in HiperSockets mode provide corresponding entries. Signed-off-by: Einar Lueck Signed-off-by: Frank Blaschka Signed-off-by: David S. Miller commit ff176a4e2972bdc7a8d65cdcb0bd0d26ab1528cf Author: Richard Röjfors Date: Tue Dec 7 17:28:33 2010 +0100 usb: pch_udc: Fix setup transfers with data out This patch fixes an issue where the driver does not handle out data in setup transactions. The per endpoint cached status register is cleared in the pch_udc_svc_control_out function. When there is out data available the function pch_udc_svc_data_out is called which tries to pick it up the status, which now is cleared to 0. When the status is 0, the function doesn't start reading the data from the FIFO. There is a second bug in all this, pch_udc_svc_data_out takes the endpoint number (0 for EP0), while pch_udc_svc_control_out passes the endpoint index (1 for EP0). Effectively pch_udc_svc_data_out picks up the wrong internal ep structure. This patch makes sure to put back the cached status and pass the endpoint number rather than index when calling pch_udc_svc_data_out. Signed-off-by: Richard Röjfors Signed-off-by: Greg Kroah-Hartman commit 49e208346616328e535b5d6ecd510ab38f210858 Author: Richard Röjfors Date: Tue Dec 7 17:28:30 2010 +0100 usb: pch_udc: Fix compile error, warnings and checkpatch warnings Building pch_udc in linux-next fails, this patch fixes the a compile error: drivers/usb/gadget/pch_udc.c: In function ‘usb_gadget_register_driver’: drivers/usb/gadget/pch_udc.c:2645: error: ‘struct usb_gadget_driver’ has no member named ‘bind’ drivers/usb/gadget/pch_udc.c:2664: error: ‘struct usb_gadget_driver’ has no member named ‘bind’ And a couple of compiler warnings and checkpatch warnings. Signed-off-by: Richard Röjfors Signed-off-by: Greg Kroah-Hartman commit 969152341e852ae7a5e1b11c33ef6244f3cb3579 Author: Mian Yousaf Kaukab Date: Tue Dec 7 15:00:09 2010 +0100 usb: add ab8500 usb transceiver driver Basic driver for ab8500 usb otg transceiver TODO: -Regulators support -Host and OTG testing -Interface with PRCMU -Charging support Signed-off-by: Mian Yousaf Kaukab Acked-by: Linus Walleij Signed-off-by: Greg Kroah-Hartman commit 2d0cdcc5a0e4e5e467fc4be4d00cc6c531c80b64 Author: Pavankumar Kondeti Date: Tue Dec 7 17:54:05 2010 +0530 USB: gadget: Implement runtime PM for MSM bus glue driver OTG driver takes care of putting hardware in low power mode. Hence not registered for any runtime PM callbacks. Signed-off-by: Pavankumar Kondeti Signed-off-by: Greg Kroah-Hartman commit c036019ed2b729cb9517806c2b388b4f4323a904 Author: Pavankumar Kondeti Date: Tue Dec 7 17:54:04 2010 +0530 USB: gadget: Implement runtime PM for ci13xxx gadget The actual suspend/resume work is delegated to bus glue driver, which is responsible for putting hardware in low power mode. Signed-off-by: Pavankumar Kondeti Signed-off-by: Greg Kroah-Hartman commit 33f82f387b9cb27bc903e1368fce88b73213910a Author: Pavankumar Kondeti Date: Tue Dec 7 17:54:03 2010 +0530 USB: gadget: Add USB controller driver for MSM SoC MSM SoC has chipidea USB controller. So use ci13xxx_udc core. This driver depends on transceiver driver for clock control, PHY initialization, VBUS detection. Register for notify_event callback to perform MSM specific quirks after controller is reset and stopped. Signed-off-by: Pavankumar Kondeti Signed-off-by: Greg Kroah-Hartman commit f01ef5748f4c4dcd2e49ccb7d75dc113219559d2 Author: Pavankumar Kondeti Date: Tue Dec 7 17:54:02 2010 +0530 USB: gadget: Introduce ci13xxx_udc_driver struct Introduces ci13xxx_udc_driver struct for bus glue drivers to hint ci13xxx_udc core about their special requirements. The flags include avoiding hardware register access when controller is not in peripheral mode, enabling pull-up upon VBUS, disabling streaming mode and dependency on transceiver driver. Initialize gadget_ops in udc_probe so that transceiver can notify VBUS presence even when no gadget driver is bounded. A notify_event callback is embedded in the same struct. This patch implements two events called CONTROLLER_RESET_EVENT and CONTROLLER_STOPPED_EVENT to notify the bus glue driver after resetting and stopping the controller for performing SoC specific quirks. Signed-off-by: Pavankumar Kondeti Signed-off-by: Greg Kroah-Hartman commit 61948ee4d525174cceee2135a38a482124fcc02c Author: Pavankumar Kondeti Date: Tue Dec 7 17:54:01 2010 +0530 USB: gadget: Initialize ci13xxx gadget device's coherent DMA mask dma_alloc_coherent() which is internally called by dma_pool_alloc() flags a warning if device's coherent DMA mask. Hence initialize gadget device's coherent DMA mask to it's parent mask. Signed-off-by: Pavankumar Kondeti Signed-off-by: Greg Kroah-Hartman commit 0a91efa2f951d790969dec96fb675ca7869eca83 Author: Pavankumar Kondeti Date: Tue Dec 7 17:54:00 2010 +0530 USB: gadget: Fix "scheduling while atomic" bugs in ci13xxx_udc dma_pool_alloc() require sleeping context when called with GFP_KERNEL argument. Hence release the spin lock before calling dma_pool_alloc(). usb_ep_alloc_request can also be called with non-atomic GFP flags. Hence get rid off spin lock while allocation request memory. Use GFP_ATOMIC flag for allocating request for ep0 in interrupt handler. Signed-off-by: Pavankumar Kondeti Signed-off-by: Greg Kroah-Hartman commit 409a15da9851b6e6a5e1c5787be31a987184b7cf Author: Pavankumar Kondeti Date: Tue Dec 7 17:53:59 2010 +0530 USB: gadget: Separate out PCI bus code from ci13xxx_udc Move PCI bus code from ci13xxx_udc to a new file ci13xxx_pci. SoC's which has MIPS USB core can include the ci13xxx_udc and keep bus glue code in their respective gadget controller drivers. Signed-off-by: Pavankumar Kondeti Signed-off-by: Greg Kroah-Hartman commit 87c0104af742af2acfcbd685f2b9a40f33770dc0 Author: Pavankumar Kondeti Date: Tue Dec 7 17:53:58 2010 +0530 USB: OTG: msm: Add support for power management Implement runtime and system pm ops to put hardware into low power mode (LPM). As part of LPM, USB clocks are turned off, PHY is put into suspend state and PHY comparators are turned off if VBUS/Id notifications are not required from PHY. Signed-off-by: Pavankumar Kondeti Signed-off-by: Greg Kroah-Hartman commit 8bb6a164b906bb7ca319202f85b30e3ef096cd65 Author: Pavankumar Kondeti Date: Tue Dec 7 17:53:57 2010 +0530 USB: EHCI: msm: Add support for power management Enable runtime PM and mark no_callbacks flag. OTG device, parent of HCD takes care of putting hardware into low power mode. Adjust port power wakeup flags during system suspend and resume. Signed-off-by: Pavankumar Kondeti Signed-off-by: Greg Kroah-Hartman commit b0848aea10da186372582f33152efdda43944f26 Author: Pavankumar Kondeti Date: Tue Dec 7 17:53:56 2010 +0530 USB: EHCI: Add MSM Host Controller driver This patch adds support for EHCI compliant HSUSB Host controller found on MSM chips. The root hub has a single port and TT is built into it. This driver depends on OTG driver for PHY initialization, clock management and powering up VBUS. Signed-off-by: Pavankumar Kondeti Signed-off-by: Greg Kroah-Hartman commit e0c201f339fe7fc38d1b0f6f4755ff627686c7e0 Author: Pavankumar Kondeti Date: Tue Dec 7 17:53:55 2010 +0530 USB: Add MSM OTG Controller driver This driver implements PHY initialization, clock management, ULPI IO ops and simple OTG state machine to kick host/peripheral based on Id/VBUS line status. VBUS/Id lines are tied to a reference voltage on some boards. Hence provide debugfs interface to select host/peripheral mode. Signed-off-by: Pavankumar Kondeti Signed-off-by: Greg Kroah-Hartman commit 05570297ecbe834b1756b522412b68eaffb9ab11 Author: Alex He Date: Tue Dec 7 10:10:08 2010 +0800 USB: EHCI: ASPM quirk of ISOC on AMD SB800 When ASPM PM Feature is enabled on UMI link, devices that use ISOC stream of data transfer may be exposed to longer latency causing less than optimal per- formance of the device. The longer latencies are normal and are due to link wake time coming out of low power state which happens frequently to save power when the link is not active. The following code will make exception for certain features of ASPM to be by passed and keep the logic normal state only when the ISOC device is connected and active. This change will allow the device to run at optimal performance yet minimize the impact on overall power savings. Signed-off-by: Alex He Acked-by: David Brownell Cc: stable Signed-off-by: Greg Kroah-Hartman commit 66921edd7df109196bd1a41309c17896ea0913d7 Author: Peter Huewe Date: Thu Dec 9 23:27:35 2010 +0100 USB: serial: usb_wwan: Add missing uaccess.h / fix build failure This patch fixes a build failure[1] by adding the missing uaccess.h needed for copy_from_user and copy_to_user References: http://kisskb.ellerman.id.au/kisskb/buildresult/3607218/ Signed-off-by: Peter Huewe Signed-off-by: Greg Kroah-Hartman commit 352a337832774a6929c16b569abe9cedc3db01cc Author: Guennadi Liakhovetski Date: Thu Dec 9 22:46:29 2010 +0100 USB: otg: fix link breakage, when the NOP USB Xceiver is a module If the NOP USB OTG transceiver driver is built as a module, the otg.h header declares external functions, but if they are referenced from the kernel proper, as, e.g., in the OMAP3 case, where the omap3evm board is calling the usb_nop_xceiv_register() function, linkage breaks. This patch fixes this problem. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Greg Kroah-Hartman commit 537baabbdfebe7f9514f05b62eac91b4bfa0bdf2 Author: Tobias Klauser Date: Thu Dec 9 15:52:39 2010 +0100 usb: gadget: f_fs: Remove redundant unlikely() IS_ERR() already implies unlikely(), so it can be omitted here. Signed-off-by: Tobias Klauser Signed-off-by: Greg Kroah-Hartman commit 16325f18eaa6066c4b913a5661fc8190ce564f7c Author: Tobias Ollmann Date: Thu Dec 9 14:24:27 2010 +0100 USB: host: uhci-q: Fixed minor coding style issues Fixed coding style issues (delete trailing whitespaces, break long line) Signed-off-by: Tobias Ollmann Signed-off-by: Greg Kroah-Hartman commit 34404082bbdc5d981fa8eb2f9f5dfaae74463877 Author: Uwe Kleine-König Date: Mon Dec 6 17:38:24 2010 +0100 usb: gadget/imx-udc: fix interrupt name again Commit 06c3859 (usb: gadget/imx-udc: remove usage of deprecated symbol USBD_INT0) was a bit precipitant because the name used instead didn't match the usual naming scheme for irqs on arm/imx. I renamed the irq to the right name in e083000 (ARM: imx: dynamically allocate imx_udc device) when 06c3859 didn't hit Linus' tree, so I missed to add a compat #define. This patch allows compiling imx_udc.c with and without e083000. Signed-off-by: Uwe Kleine-König Signed-off-by: Greg Kroah-Hartman commit 8170344cb8aaa726bf1afae83288946b7cfcb556 Author: Namhyung Kim Date: Tue Dec 7 01:03:32 2010 +0900 USB: whci-hcd: fix compiler warning Annotate whci_hcd_id_table as '__used' to fix following warning: CC drivers/usb/host/whci/hcd.o drivers/usb/host/whci/hcd.c:359: warning: ‘whci_hcd_id_table’ defined but not used Signed-off-by: Namhyung Kim Signed-off-by: Greg Kroah-Hartman commit c07224005dd3fe746246acadc9be652a588a4d7f Author: Jiri Pirko Date: Thu Dec 9 03:40:30 2010 +0000 net/ipv6/udp.c: fix typo in flush_stack() skb1 should be passed as parameter to sk_rcvqueues_full() here. Signed-off-by: Jiri Pirko Signed-off-by: David S. Miller commit 3dd1462e82bcab7625cec129952f26dae7a8b742 Author: Jan Beulich Date: Tue Dec 7 14:54:09 2010 +0000 Btrfs: fix compiler warnings ... regarding an unused function when !MIGRATION, and regarding a printk() format string vs argument mismatch. Signed-off-by: Jan Beulich Signed-off-by: Chris Mason commit fdfb1e4f6c61477a61890b64974d65cdc3a98702 Author: Li Zefan Date: Fri Dec 10 06:41:56 2010 +0000 Btrfs: Make async snapshot ioctl more generic If we had reserved some bytes in struct btrfs_ioctl_vol_args, we wouldn't have to create a new structure for async snapshot creation. Here we convert async snapshot ioctl to use a more generic ABI, as we'll add more ioctls for snapshots/subvolumes in the future, readonly snapshots for example. Signed-off-by: Li Zefan Signed-off-by: Chris Mason commit 914ee295af418e936ec20a08c1663eaabe4cd07a Author: Xin Zhong Date: Thu Dec 9 09:30:14 2010 +0000 Btrfs: pwrite blocked when writing from the mmaped buffer of the same page This problem is found in meego testing: http://bugs.meego.com/show_bug.cgi?id=6672 A file in btrfs is mmaped and the mmaped buffer is passed to pwrite to write to the same page of the same file. In btrfs_file_aio_write(), the pages is locked by prepare_pages(). So when btrfs_copy_from_user() is called, page fault happens and the same page needs to be locked again in filemap_fault(). The fix is to move iov_iter_fault_in_readable() before prepage_pages() to make page fault happen before pages are locked. And also disable page fault in critical region in btrfs_copy_from_user(). Reviewed-by: Yan, Zheng Signed-off-by: Zhong, Xin Signed-off-by: Chris Mason commit f106e82caaa0d943e47cacc184f5b40d538e0044 Author: Li Zefan Date: Tue Dec 7 01:51:26 2010 +0000 Btrfs: Fix a crash when mounting a subvolume We should drop dentry before deactivating the superblock, otherwise we can hit this bug: BUG: Dentry f349a690{i=100,n=/} still in use (1) [unmount of btrfs loop1] ... Steps to reproduce the bug: # mount /dev/loop1 /mnt # mkdir save # btrfs subvolume snapshot /mnt save/snap1 # umount /mnt # mount -o subvol=save/snap1 /dev/loop1 /mnt (crash) Reported-by: Michael Niederle Signed-off-by: Li Zefan Signed-off-by: Chris Mason commit 75eaa0e22c055e38982df267d0f84cc510ba38bf Author: Sage Weil Date: Fri Dec 10 00:36:28 2010 +0000 Btrfs: fix sync subvol/snapshot creation We were incorrectly taking the async path even for the sync ioctls by passing in &transid unconditionally. There's ample room for further cleanup here, but this keeps the fix simple. Signed-off-by: Sage Weil Reviewed-by: Li Zefan Signed-off-by: Chris Mason commit 24ae63656a165c870c0d69fcc8aac1dc35e25e34 Author: Yan, Zheng Date: Mon Dec 6 07:02:36 2010 +0000 Btrfs: Fix page leak in compressed writeback path "start + num_bytes >= actual_end" can happen when compressed page writeback races with file truncation. In that case we need unlock and release pages past the end of file. Signed-off-by: Yan, Zheng Signed-off-by: Chris Mason commit 84cd948cb11041f205242de457e680b9bb872a36 Author: Josef Bacik Date: Wed Dec 8 12:24:01 2010 -0500 Btrfs: do not BUG if we fail to remove the orphan item for dead snapshots Not being able to delete an orphan item isn't a horrible thing. The worst that happens is the next time around we try and do the orphan cleanup and we can't find the referenced object and just delete the item and move on. Signed-off-by: Josef Bacik commit 457de4383ec6144df7d5a82cdfb110c825305a51 Author: David S. Miller Date: Fri Dec 10 13:16:09 2010 -0800 ipv6: Fix 'release_it' logic in tcp_v6_get_peer() We accidently set it to "true" for the case where we are using a route bound peer. Signed-off-by: David S. Miller commit 5363cdc3c5da9bd431552cf5989ab481596f0c6d Author: Florian Faber Date: Wed Dec 1 10:11:08 2010 +0100 USB: ftdi_sio: Add D.O.Tec PID Add FTDI PID to identify D.O.Tec devices correctly. Signed-off-by: Florian Faber Cc: stable Signed-off-by: Greg Kroah-Hartman commit 4c0833bcd4d302fe783b9f8286a00ca2999d6200 Author: Tobias Klauser Date: Fri Dec 10 03:18:04 2010 +0000 bridge: Fix return values of br_multicast_add_group/br_multicast_new_group If br_multicast_new_group returns NULL, we would return 0 (no error) to the caller of br_multicast_add_group, which is not what we want. Instead br_multicast_new_group should return ERR_PTR(-ENOMEM) in this case. Also propagate the error number returned by br_mdb_rehash properly. Signed-off-by: Tobias Klauser Signed-off-by: David S. Miller commit e91db5cd6f2203ef2a93ce8770f2728e9107c4f7 Merge: 5f75a1042feca37c0a436ba42a4b1f7f75c35778 0a54917c3fc295cb61f3fb52373c173fd3b69f48 Author: David S. Miller Date: Fri Dec 10 12:51:02 2010 -0800 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 commit 5f75a1042feca37c0a436ba42a4b1f7f75c35778 Author: Nicolas Dichtel Date: Tue Dec 7 23:38:31 2010 +0000 ipv6: fix nl group when advertising a new link New idev are advertised with NL group RTNLGRP_IPV6_IFADDR, but should use RTNLGRP_IPV6_IFINFO. Bug was introduced by commit 8d7a76c9. Signed-off-by: Wang Xuefu Signed-off-by: Nicolas Dichtel Acked-by: Thomas Graf Signed-off-by: David S. Miller commit 3700c3c2934467d53d443682f020cc5c1f75f1f2 Author: Stephen Hemminger Date: Fri Dec 10 12:27:49 2010 -0800 connector: add module alias Since connector can be built as a module and uses netlink socket to communicate. The module should have an alias to autoload when socket of NETLINK_CONNECTOR type is requested. Signed-off-by: Stephen Hemminger Acked-by: Evgeniy Polyakov Signed-off-by: David S. Miller commit 998adc3dda59f811966b3ccb21eb223680b25ec4 Author: John Stultz Date: Mon Sep 20 19:19:17 2010 -0700 hrtimers: Convert hrtimers to use timerlist infrastructure Converts the hrtimer code to use the new timerlist infrastructure Signed-off-by: John Stultz LKML Reference: <1290136329-18291-3-git-send-email-john.stultz@linaro.org> Reviewed-by: Thomas Gleixner CC: Alessandro Zummo CC: Thomas Gleixner CC: Richard Cochran commit 9bb99b147018945366c763b3d4d7008927dc8557 Author: John Stultz Date: Mon Dec 6 13:32:12 2010 -0800 timers: Fixup allmodconfig build issue Adds missed EXPORT_SYMBOL lines that cause the following build failures with allmodconfig: ERROR: "timerqueue_add" [drivers/rtc/rtc-core.ko] undefined! ERROR: "timerqueue_getnext" [drivers/rtc/rtc-core.ko] undefined! ERROR: "timerqueue_del" [drivers/rtc/rtc-core.ko] undefined! Reported-by: Ingo Molnar Reported-by: Thomas Gleixner Signed-off-by: John Stultz commit c04bfc6b223662c42a77727342c1df7d39e686a2 Author: Ben Hutchings Date: Fri Dec 10 01:24:16 2010 +0000 sfc: Remove ancient support for nesting of TX stop Long before this driver went into mainline, it had support for multiple TX queues per port, with lockless TX enabled. Since Linux did not know anything of this, filling up any hardware TX queue would stop the core TX queue and multiple hardware TX queues could fill up before the scheduler reacted. Thus it was necessary to keep a count of how many TX queues were stopped and to wake the core TX queue only when all had free space again. The driver also previously (ab)used the per-hardware-queue stopped flag as a counter to deal with various things that can inhibit TX, but it no longer does that. Remove the per-channel tx_stop_count, tx_stop_lock and per-hardware-queue stopped count and just use the networking core queue state directly. Signed-off-by: Ben Hutchings commit 6ecfd0c70c05531b2850649d0cec46833cd6c381 Author: Ben Hutchings Date: Fri Dec 10 01:19:53 2010 +0000 sfc: Remove unused field and comment on a previously removed field Signed-off-by: Ben Hutchings commit 1f5a24794a54588ea3a9efd521be31d826e0b9d7 Author: John Stultz Date: Thu Dec 9 12:02:18 2010 -0800 timers: Rename timerlist infrastructure to timerqueue Thomas pointed out a namespace collision between the new timerlist infrastructure I introduced and the existing timer_list.c So to avoid confusion, I've renamed the timerlist infrastructure to timerqueue. Reported-by: Thomas Gleixner Signed-off-by: John Stultz commit 79b357c2171ab3e52148503f0efa66d64a13413e Merge: b2d6fef51223a1913c0d3230df4252ab49990bc1 5de62b86d2f5cf3459cb02ecb7a4530787bbd898 Author: Tony Lindgren Date: Fri Dec 10 11:37:47 2010 -0800 Merge branch 'devel-gpio' into omap-for-linus commit eaa7dcde1d092c792cbca4be81d2e506e84c6122 Merge: cf78f8ee3de7d8d5b47d371c95716d0e4facf1c4 b7ec19af63b467e30189984fb24e6157603608e3 Author: David S. Miller Date: Fri Dec 10 11:22:57 2010 -0800 Merge branch 'dccp' of git://eden-feed.erg.abdn.ac.uk/net-next-2.6 commit c1249c0aae4c93a753c70496ab2e9a51430a6f02 Author: Martin Lucina Date: Fri Dec 10 00:04:05 2010 +0000 net: Document the kernel_recvmsg() function Signed-off-by: Martin Lucina Signed-off-by: David S. Miller commit e4fbce740f078bbc925ba5c86648d9c883968479 Author: Rafael J. Wysocki Date: Wed Dec 8 15:32:14 2010 +0000 r8169: Fix runtime power management I noticed that one of the post-2.6.36 patches broke runtime PM of the r8169 on my MSI Wind test machine in such a way that the link was not brought up after reconnecting the network cable. In the process of debugging the issue I realized that we only should invoke the runtime PM functions in rtl8169_check_link_status() when link change is reported and if we do so, the problem goes away. Moreover, this allows rtl8169_runtime_idle() to be simplified quite a bit. Signed-off-by: Rafael J. Wysocki Acked-by: Francois Romieu Signed-off-by: David S. Miller commit 983bbfd091be5b3e1a729f31cce29431fbff2d27 Author: Greg Kroah-Hartman Date: Fri Dec 10 10:56:18 2010 -0800 Staging: iio: fix up world writable sysfs files. You should not be able to write to sysfs files from any user. Cc: Graf Yang Cc: Michael Hennerich Cc: Jonathan Cameron Cc: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 64d74c6cbe52fbec90ead8f3bf53bfb10a1540d5 Author: Greg Kroah-Hartman Date: Fri Dec 10 10:55:27 2010 -0800 Staging: ft1000: fix world writable debugfs file You should not be able to write to a debugfs file from any user. Cc: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit b8b739941eb57ec4c5fc87a73e7e7b554cf395fb Author: Greg Kroah-Hartman Date: Fri Dec 10 10:46:30 2010 -0800 Staging: cxt1e1: rename global log_level variable The driver should not have such a generic global variable name. Reported-by: Zimny Lech Cc: Bob Beers Signed-off-by: Greg Kroah-Hartman commit bc657f6e9130108651915fe37624e47638c46e0f Author: Mark Allyn Date: Fri Dec 10 07:37:48 2010 -0800 staging: sep: fix comments in sep_get_static_pool_addr_handler Original comments were inaccurate Signed-off-by: Mark Allyn Signed-off-by: Greg Kroah-Hartman commit e91eb2ff1f713837caebbb86a06974cd4b3e8e46 Author: Dan Carpenter Date: Fri Dec 10 15:41:18 2010 +0300 Staging: rtl8192u: add missing curly braces The if condition was ignored in the original code and we just used the default channel. Signed-off-by: Dan Carpenter Signed-off-by: Greg Kroah-Hartman commit cf78f8ee3de7d8d5b47d371c95716d0e4facf1c4 Merge: 1e13f863ca88014d9550876c05c939fdab1017d1 c39d35ebffeea5996a6f8fd8430fae9acfb8aeaf Author: David S. Miller Date: Fri Dec 10 10:20:43 2010 -0800 Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/bwh/sfc-next-2.6 commit 5b362ac3799ff4225c40935500f520cad4d7ed66 Author: Chuck Lever Date: Fri Dec 10 12:31:14 2010 -0500 NFS: Fix panic after nfs_umount() After a few unsuccessful NFS mount attempts in which the client and server cannot agree on an authentication flavor both support, the client panics. nfs_umount() is invoked in the kernel in this case. Turns out nfs_umount()'s UMNT RPC invocation causes the RPC client to write off the end of the rpc_clnt's iostat array. This is because the mount client's nrprocs field is initialized with the count of defined procedures (two: MNT and UMNT), rather than the size of the client's proc array (four). The fix is to use the same initialization technique used by most other upper layer clients in the kernel. Introduced by commit 0b524123, which failed to update nrprocs when support was added for UMNT in the kernel. BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=24302 BugLink: http://bugs.launchpad.net/bugs/683938 Reported-by: Stefan Bader Tested-by: Stefan Bader Cc: stable@kernel.org # >= 2.6.32 Signed-off-by: Chuck Lever Signed-off-by: Trond Myklebust commit 1e13f863ca88014d9550876c05c939fdab1017d1 Merge: f404c2fea37e02bec7c8b6edddf5edd22ca60505 f435d9eea01309aa7b6c1f134569a7b5957918ae Author: David S. Miller Date: Fri Dec 10 09:50:47 2010 -0800 Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 Conflicts: drivers/net/wireless/ath/ath9k/ar9003_eeprom.c commit b2d6fef51223a1913c0d3230df4252ab49990bc1 Author: Tony Lindgren Date: Fri Dec 10 09:46:25 2010 -0800 omap1: Delete old defconfigs Please use omap1_defconfig instead, or search online for a more optimized defconfig for your omap1 board. Signed-off-by: Tony Lindgren commit 6cfce27c14aad746fe6f1b0bbeefab52b8b6217f Author: Tony Lindgren Date: Fri Dec 10 09:46:24 2010 -0800 omap1: Add omap1_defconfig The omap1_defconfig this should be eventually usable for booting all omap1 machines. Generated based on: $ grep ARCH_OMAP1=y arch/arm/configs/* | cut -d: -f1 | xargs cat | \ sort | uniq >> arch/arm/configs/omap1_defconfig Then change few things manually, like use Nokia 770 CONFIG_CMDLINE as it does not allow setting it in the bootloader. Finally ran make savedefconfig on it. Signed-off-by: Tony Lindgren commit 7f9187c26fd120bd2f0ce089e5f46c4bd3c4193b Author: Tony Lindgren Date: Fri Dec 10 09:46:24 2010 -0800 omap1: Add initcall checks for omap1 and booted board Otherwise multi-omap1 configurations will fail. Tested-by: Janusz Krzysztofik Signed-off-by: Tony Lindgren commit df1e9d1c218ba696e376cad371b57c0109fe98c9 Author: Tony Lindgren Date: Fri Dec 10 09:46:24 2010 -0800 omap: Split omap_read/write functions for omap1 and omap2+ Otherwise multi-omap1 support for omap1 won't work as the cpu_class_is_omap1() won't work until the SoC is detected. Note that eventually these will go away, please use ioremap + read/write instead. Signed-off-by: Tony Lindgren commit 67b738ef32df7ec429004866d2a739a3775894d2 Merge: c451278c2864e253a4bb303b596a29edc3bb527c 5d190c40100793a6dfc37bf325677c10f3c80edf Author: Tony Lindgren Date: Fri Dec 10 09:44:39 2010 -0800 Merge branch 'devel-omap-irq' into omap-for-linus commit 5d190c40100793a6dfc37bf325677c10f3c80edf Author: Tony Lindgren Date: Thu Dec 9 15:49:23 2010 -0800 omap2+: Initialize omap_irq_base for entry-macro.S from platform code This way we can use the generic omap SoC detection code instead. Signed-off-by: Tony Lindgren commit 22ca466847ad477d060baed84733c495bc6e81c8 Author: Kevin Hilman Date: Fri Nov 19 07:25:30 2010 -0800 davinci: kconfig: select at24 eeprom for selected boards Ensure that the at24 eeprom driver is selected for certain boards that need boot data (e.g. MAC address) from EEPROM. Signed-off-by: Kevin Hilman commit 3506f27731439bf6ff3bfa86f04e0104f7edad68 Author: Ben Gardiner Date: Fri Nov 19 16:43:04 2010 -0500 da850-evm, trivial: use da850_evm prefix for consistency There was a single case of 'da850evm' prefix in the board-da850-evm.c file where the reset of the prefixes were 'da850_evm'; change it to 'da850_evm' for consistency. Signed-off-by: Ben Gardiner Acked-by: Sekhar Nori Signed-off-by: Kevin Hilman commit d5539ca0a5c9abd5cbf9ddcbbc1c2a507b5fd63c Author: Ben Gardiner Date: Fri Nov 19 09:17:35 2010 -0500 da850-evm: allow pca953x module build Change the mach-davinci Kconfig file so that GPIO_PCA953X is default when MACH_DAVINCI_DA850_EVM is set instead of always selecting. This allows users to compile pca953x as a module. Signed-off-by: Ben Gardiner CC: Sergei Shtylyov CC: Nori, Sekhar Reviewed-by: Kevin Hilman Signed-off-by: Kevin Hilman commit 47e7cb148a12f6f825302a85cd2b78a0948be741 Author: Ben Gardiner Date: Mon Nov 15 09:42:52 2010 -0500 davinci: da850-evm: UI expander gpio_set_value can sleep, use _cansleep When the RMII PHY on the UI board is enabled with CONFIG_DA850_UI_RMII then then following will be printed to the console when warnings are also enabled: WARNING: at drivers/gpio/gpiolib.c:1567 __gpio_set_value+0x4c/0x5c() Modules linked in: [] (unwind_backtrace+0x0/0xf8) from [] (warn_slowpath_common+0x4c/0x64) [] (warn_slowpath_common+0x4c/0x64) from [] (warn_slowpath_null+0x1c/0x24) [] (warn_slowpath_null+0x1c/0x24) from [] (__gpio_set_value+0x4c/0x5c) [] (__gpio_set_value+0x4c/0x5c) from [] (da850_evm_ui_expander_setup+0x1e4/0x2 44) [] (da850_evm_ui_expander_setup+0x1e4/0x244) from [] (pca953x_probe+0x1f8/0x29 0) Traced the WARN_ON to the gpio_set_value(rmii_sel,0) call in da850_evm_setup_emac_rmii. Replacing the call with the _cansleep variant results in no more warning. Also replacing the gpio_set_value calls in the teardown function. Signed-off-by: Ben Gardiner Reviewed-by: Chris Cordahi Signed-off-by: Kevin Hilman commit 12cdd3d71954c2cd6dd556eec25dd7d346735831 Author: Nicolas Kaiser Date: Mon Nov 15 19:40:28 2010 +0100 davinci: aemif: signedness bug in davinci_aemif_setup_timing() aemif_calc_rate() can return a negative error value, so all the variables that get tested for this value need to be signed. The maximum bit width of WSETUP(WSETUP_MAX) appears to be 30 bits (0xf << 26). Using a signed instead of an unsigned integer shouldn't make a difference here. Signed-off-by: Nicolas Kaiser Acked-by: Sekhar Nori Signed-off-by: Kevin Hilman commit 1a07bfb5215e11227403f121097ed72187dc3241 Author: Nicolas Kaiser Date: Mon Oct 25 14:41:18 2010 +0200 davinci: psc: simplify if-statement A common do-while loop can be factored out from the end of the branches. Signed-off-by: Nicolas Kaiser Signed-off-by: Kevin Hilman commit ced98628bf6ca7705b2d06df9c71a80cd1cd49bb Author: Cyril Chemparathy Date: Wed Oct 20 17:49:57 2010 -0400 davinci: minor tnetv107x clock tree fixes This patch applies the following modifications to the tnetv107x clock tree: - reparent tnetv107x usb clocks to usbss - mark timer1 as always enabled - enable set_rate on pll divider output clocks - adjust tnetv107x tsc sysclk rate lower to fix invalid reset defaults Signed-off-by: Cyril Chemparathy Signed-off-by: Kevin Hilman commit b1d05be61f5d29118c2934e684628a5034186825 Author: Cyril Chemparathy Date: Wed Oct 20 17:49:56 2010 -0400 davinci: use divide ratio limits from pll_data This patch modifies the sysclk rate setting code to use the divider mask specified in pll_data. Without this, devices with different divider ranges (e.g. tnetv107x) fail. Signed-off-by: Cyril Chemparathy Signed-off-by: Kevin Hilman commit 6d1c57c84cc474a0fa63aadaa260b13dc5c7d68b Author: Andreas Gaeer Date: Wed Oct 6 10:38:55 2010 +0200 davinci: Implement sched_clock() Overwrite the default implementation of sched_clock that is based on jiffies by something more precise. This improves timestamps in ftrace. Implementation is copied from OMAP platform code. Signed-off-by: Andreas Gaeer Signed-off-by: Kevin Hilman commit 2ade0c1d9d93b7642212657ef76f4a1e30233711 Merge: 504499f22c08a03e2e19dc88d31aa0ecd2ac815e 6313e3c21743cc88bb5bd8aa72948ee1e83937b6 Author: Jiri Kosina Date: Fri Dec 10 15:19:18 2010 +0100 Merge branch 'master' into upstream commit 504499f22c08a03e2e19dc88d31aa0ecd2ac815e Author: Joe Perches Date: Thu Dec 9 19:29:08 2010 -0800 HID: simplify an index check in hid_lookup_collection Save the struct hid_collection * in a temporary to shorten the generated code a bit and perhaps improve readability. $ size drivers/hid/hid-core.o* text data bss dec hex filename 16460 78 8 16546 40a2 drivers/hid/hid-core.o.new 16469 78 8 16555 40ab drivers/hid/hid-core.o.old Signed-off-by: Joe Perches Signed-off-by: Jiri Kosina commit a3789a1783d37f2772ba5046b26416c98dfe1bfa Author: Joe Perches Date: Thu Dec 9 19:29:07 2010 -0800 HID: Hoist assigns from ifs Signed-off-by: Joe Perches Signed-off-by: Jiri Kosina commit 16ee4cc82b5dbb81a5dbfedcdb268b9467fe4605 Author: Joe Perches Date: Thu Dec 9 19:29:05 2010 -0800 HID: Remove superfluous __inline__ Signed-off-by: Joe Perches Signed-off-by: Jiri Kosina commit fe2580204d8bbcd18540736a283ed0b784c6a024 Author: Joe Perches Date: Thu Dec 9 19:29:04 2010 -0800 HID: Use vzalloc for vmalloc/memset(,0...) Signed-off-by: Joe Perches Signed-off-by: Jiri Kosina commit 4291ee305e9bb0699504a66f0e2b7aefcf0512a5 Author: Joe Perches Date: Thu Dec 9 19:29:03 2010 -0800 HID: Add and use hid_: dev_ equivalents Neaten current uses of dev_ by adding and using hid specific hid_ macros. Convert existing uses of dev_ uses to hid_. Convert hid-pidff printk uses to hid_. Remove err_hid and use hid_err instead. Add missing newlines to logging messages where necessary. Coalesce format strings. Add and use pr_fmt(fmt) KBUILD_MODNAME ": " fmt Other miscellaneous changes: Add const struct hid_device * argument to hid-core functions extract() and implement() so hid_ can be used by them. Fix bad indentation in hid-core hid_input_field function that calls extract() function above. Signed-off-by: Joe Perches Signed-off-by: Jiri Kosina commit 09e7200221a04ab899e15a0a3cf4b230afd1ab86 Author: Hema HK Date: Fri Dec 10 18:11:42 2010 +0530 arm: OMAP4430: musb: Configure musb to OTG mode Enabling the musb OTG mode for SDP and PANDA boards. Signed-off-by: Hema HK Cc: Tony Lindgren Signed-off-by: Felipe Balbi commit 594632efbb9a4ac323cbf8dbf37c608d418ca8c1 Author: Hema HK Date: Fri Dec 10 18:10:51 2010 +0530 usb: musb: Adding musb support for OMAP4430 OMAP4430 supports UTMI and ULPI types of transceiver interface. In UTMI mode: The PHY is embedded within OMAP4430. The transceiver functionality is split between the twl6030 PMIC chip and OMAP4430. The VBUS, ID pin sensing and OTG SRP generation part is integrated in TWL6030 and UTMI PHY functionality is embedded within the OMAP4430. There is no direct interactions between the MUSB controller and TWL6030 chip to communicate the session-valid, session-end and ID-GND events. It has to be done through a software by setting/resetting bits in one of the control module register of OMAP4430 which in turn toggles the appropriate signals to MUSB controller. musb driver is register for blocking notifications from the transceiver driver to get the event notifications for connect/disconnect and ID-GND. Based on these events call the transceiver init/shutdown function to configure the transceiver to toggle the VBUS valid, session end and ID_GND signals to musb and power on/off the internal PHY. For ID_GND event notifications, toggle the ID_GND signal and then wait for musb to be configured as "A" device, and then call the transceiver function to set the VBUS. In OTG mode and musb as a host, When the Micro A connector used, VBUS is turned on and session bit set. When the device is connected, enumeration goes through. When the device disconnected from the other end of the connector(ID is still grounded), link will detect the disconnect and end the session. When the device is connected back, there are no events generated in the TWL6030-usb, and link is already down. So the device is not detected. Removed the session bit disable code which will recognize the connect of the device. Limitation: In OTG host mode, if device is connected during boot, it does not get detected. If disconnect and connect it back or connect after boot only it works. Fix for this, I will submit seperate patch later. Signed-off-by: Hema HK Signed-off-by: Felipe Balbi commit 221946d04aa9bd3cffd93e4876bcb2e616941df9 Author: Hema HK Date: Fri Dec 10 18:10:37 2010 +0530 usb: otg: TWL6030: Add twl6030_usb file for compilation Add the twl6030_usb transceiver file for compilation. Signed-off-by: Hema HK Signed-off-by: Felipe Balbi commit e70357e35c522776d9f56f6800af4ed7a5bdbaaf Author: Hema HK Date: Fri Dec 10 18:09:52 2010 +0530 mfd: TWL6030: OMAP4: Registering the TWL6030-usb device Registering the twl6030-usb transceiver device as a child to twl6030 core. Removed the NOP transceiver init call from board file. Populated twl4030_usb_data platform data structure with the function pointers for OMAP4430 internal PHY operation to be used by twl630-usb driver. Signed-off-by: Hema HK Cc: Samuel Ortiz Cc: Tony Lindgren Signed-off-by: Felipe Balbi commit 0aa002fe602939370e9476e5ec32b562000a0425 Author: Tejun Heo Date: Thu Dec 9 11:47:21 2010 +0100 x86: apic: Cleanup and simplify setup_local_APIC() setup_local_APIC() is used to setup local APIC early during CPU initialization and already assumes that preemption is disabled on entry. However, The function unnecessarily disables and enables preemption and uses smp_processor_id() multiple times in and out of the nested preemption disabled section. This gives the wrong impression that the function might be able to handle being called with preemption enabled and/or migrated to another processor in the middle. Make it clear that the function is always called with preemption disabled, drop the confusing preemption disable block and call smp_processor_id() once at the beginning of the function. Signed-off-by: Tejun Heo Acked-by: Cyrill Gorcunov Reviewed-by: Pekka Enberg Cc: Yinghai Lu Cc: brgerst@gmail.com LKML-Reference: <4D00B3B9.7060702@kernel.org> Signed-off-by: Thomas Gleixner commit 4c42fbc99fc8656efc7d2b5e92be0d430ccefdc6 Author: Hema HK Date: Fri Dec 10 18:09:35 2010 +0530 usb: musb: TWL6030: Selecting TWL6030_USB transceiver Selecting the twl6030-usb for OMAP4430SDP and OMAP4PANDA boards and adding OMAP4 internal phy code for compilation Signed-off-by: Hema HK Cc: Tony Lindgren Signed-off-by: Felipe Balbi commit 6b296123cc1d958fe5045114f7ae0c1e19cbb29a Author: Hema HK Date: Fri Dec 10 18:08:48 2010 +0530 usb: otg: Kconfig: Add Kconfig option for TWL6030 transceiver. Added the TWL6030-usb transceiver option in the Kconfig Signed-off-by: Hema HK Cc: David Brownell Signed-off-by: Felipe Balbi commit c33fad0c37481c4ba5c8b98cb62de3f4d95a44da Author: Hema HK Date: Fri Dec 10 17:58:20 2010 +0530 usb: otg: Adding twl6030-usb transceiver driver for OMAP4430 Adding the twl6030-usb transceiver support for OMAP4 musb driver. OMAP4 supports 2 types of transceiver interface. 1. UTMI: The PHY is embedded within OMAP4. The transceiver functionality is split between the twl6030 PMIC chip and OMAP4430. The VBUS, ID pin sensing and OTG SRP generation part is integrated in TWL6030 and UTMI PHY functionality is embedded within the OMAP4430. There is no direct interactions between the MUSB controller and TWL6030 chip to communicate the session-valid, session-end and ID-GND events. It has to be done through a software by setting/resetting bits in one of the control module register of OMAP4430 which in turn toggles the appropriate signals to MUSB controller. The internal transceiver has functional clocks and powerdown bits to powerdown the PHY for power saving. Since there is no option available for having 2 transceiver drivers for one USB controller, internal PHY specific APIs are passed through plaform_data function pointers to use in the twl6030-usb transceiver driver. 2. ULPI interface is provided for off-chip transceivers. Signed-off-by: Hema HK Cc: Tony Lindgren Cc: David Brownell Signed-off-by: Felipe Balbi commit 77b1d3fa88dcb9d6e885926f972c421e4069b849 Author: Hema HK Date: Fri Dec 10 17:55:37 2010 +0530 mfd: TWL6030: USBOTG VBUS event generation on With TWL6030-usb, VBUS SESS_VLD and SESS_END events are not generated as expected. When these interrupts are enabled, charger VBUS detection interrupt does not get generated. So USBOTG has to be dependent on charger VBUS interrupts. So added one bit for USBOTG and changed the handler to call the USBOTG handler whenever there is a charger VBUS interrpt. VBUS SESS_VLD and SESS_END event generation issue is under debug with HW team. This fix might not be required once after fixing the issue. Signed-off-by: Balaji TK Signed-off-by: Hema HK Cc: Samuel Ortiz Signed-off-by: Felipe Balbi commit b7ec19af63b467e30189984fb24e6157603608e3 Author: Shan Wei Date: Fri Dec 10 12:49:23 2010 +0100 dccp: remove unused macros Remove macros which have been unused since the initial implementation (commit 7c657876b63cb1d8a2ec06f8fc6c37bb8412e66c, [DCCP]: Initial implementation from Tue Aug 9 20:14:34 2005 -0700). Signed-off-by: Shan Wei Acked-by: Gerrit Renker commit 4bc36fd31b07054bdf7378cca7162c10598f3eff Author: Mian Yousaf Kaukab Date: Thu Dec 9 13:05:01 2010 +0100 usb: musb: add support for ux500 platform Initial support for u8500 and u5500 platform. Signed-off-by: Mian Yousaf Kaukab Acked-by: Linus Walleij Signed-off-by: Felipe Balbi commit a9c037832e9624e240c5019d0e01e9352e8f638d Author: Ajay Kumar Gupta Date: Tue Dec 7 18:57:45 2010 +0530 musb: am35x: fix compile error due to control apis commit 4814ced5116e3b73dc4f63eec84999739fc8ed11 (OMAP: control: move plat-omap/control.h to mach-omap2/control.h) moved to another location, preventing drivers from accessing it, so we need to pass function pointers from arch code to be able to talk to internal PHY on AM35x. Signed-off-by: Ajay Kumar Gupta Signed-off-by: Felipe Balbi commit 46960847ef3e3a5d395121635fffa5dfa279fe90 Author: Felipe Balbi Date: Tue Dec 7 09:57:59 2010 +0200 arm: omap4: enable usb on 4430sdp Let musb work on 4430sdp as well. We can now test any problems with multi-omap builds. Signed-off-by: Felipe Balbi commit 92b48df24eec49ed1eb0ec9c5f6165d8282153ea Author: Felipe Balbi Date: Thu Dec 2 14:30:06 2010 +0200 usb: musb: drop board_set_vbus that's not used anymore. So let's drop it. Signed-off-by: Felipe Balbi commit 784173723e2fd23332af948a90612950964cd140 Author: Felipe Balbi Date: Thu Dec 2 13:17:53 2010 +0200 usb: musb: drop musb_platform_suspend/resume all glue layers are now fully moved to the new setup. We are now using dev_pm_ops to implement suspend/resume functionality and thus, musb_platform_suspend/resume has become deprecated and useless. This patch drops those function pointers and its uses. Signed-off-by: Felipe Balbi commit fcd22e3b1f12e026dfefca20c97ff550a0e11b2b Author: Felipe Balbi Date: Thu Dec 2 13:13:09 2010 +0200 usb: musb: blackfin: usb dev_pm_ops structure instead of using musb_platform_suspend_resume, we can use dev_pm_ops and let platform_device core handle when to call musb_core's suspend and glue layer's suspend. Signed-off-by: Felipe Balbi commit 6f783e287c074afe1e9cf3f32ded9948e184b45e Author: Felipe Balbi Date: Thu Dec 2 12:53:22 2010 +0200 usb: musb: am35x: usb dev_pm_ops structure instead of using musb_platform_suspend_resume, we can use dev_pm_ops and let platform_device core handle when to call musb_core's suspend and glue layer's suspend. Signed-off-by: Felipe Balbi commit c20aebb92796cf54ae8171ad7f53a8fa7c61d2d8 Author: Felipe Balbi Date: Thu Dec 2 12:44:40 2010 +0200 usb: musb: omap2430: use dev_pm_ops structure instead of using musb_platform_suspend/resume, we can use dev_pm_ops and let the platform_device core handle when to call musb_core's suspend and glue layer's suspend. Signed-off-by: Felipe Balbi commit e6326358a43a9ac23f6df69ed1f4707c0d1ac473 Author: Felipe Balbi Date: Thu Dec 2 12:35:59 2010 +0200 usb: musb: omap2430: drop the nops we don't need those nops, so drop them. Signed-off-by: Felipe Balbi commit 3c8a5fcc051c05cfdd8e3f0d37ba3c183d509cb9 Author: Felipe Balbi Date: Thu Dec 2 12:28:39 2010 +0200 usb: musb: mark musb_save/restore_context static those aren't used outside musb_core.c, so mark them as static. Signed-off-by: Felipe Balbi commit 496351413a227a6c0ea1a704d3d4c775d413fd08 Author: Felipe Balbi Date: Thu Dec 2 12:27:35 2010 +0200 usb: musb: drop musb_platform_save/restore_context ... that can be easily folded into the musb_platform_suspend/resume calls. Signed-off-by: Felipe Balbi commit fa56df915d101770a495569473b4c13b1904087b Author: Felipe Balbi Date: Thu Dec 2 10:55:29 2010 +0200 usb: musb: drop the set_clock magic now that platform glue layer handles clock completely, that function is completely useless for us. Drop it. Signed-off-by: Felipe Balbi commit 0349176120aa3024e96ae4fd7dc0e0181dc55f52 Author: Felipe Balbi Date: Thu Dec 2 09:57:08 2010 +0200 usb: musb: move clock handling to glue layer musb core doesn't need to know about platform specific details. So start moving clock handling to platform glue layer and make musb core agnostic about that. Signed-off-by: Felipe Balbi commit 3b7029670d39d22f288ece95254e9ba5ceddd6ba Author: Felipe Balbi Date: Thu Dec 2 09:51:00 2010 +0200 usb: musb: mark ->set_clock deprecated ... we will completely drop that need by moving clock handling to platform glue layer. Marking as deprecated will allow us to catch all users easily. Signed-off-by: Felipe Balbi commit f7ec94370f417fedad4db1054228ef958d48b926 Author: Felipe Balbi Date: Thu Dec 2 09:48:58 2010 +0200 usb: musb: pass platform_ops via platform_data ... then we don't need to export any symbols from glue layer to musb_core. Signed-off-by: Felipe Balbi commit a023c631f546ef95d58969385825a47652ab9039 Author: Felipe Balbi Date: Thu Dec 2 09:42:50 2010 +0200 usb: musb: blackfin: give it a context structure that structure currently only holds a device pointer to our own platform_device and musb's platform_device, but soon it will hold pointers to our clock structures and glue-specific bits and pieces. Signed-off-by: Felipe Balbi commit e6480faa1067af91ab403fd3aaf6db2fe1134b13 Author: Felipe Balbi Date: Thu Dec 2 09:40:34 2010 +0200 usb: musb: da8xx: give it a context structure that structure currently only holds a device pointer to our own platform_device and musb's platform_device, but soon it will hold pointers to our clock structures and glue-specific bits and pieces. Signed-off-by: Felipe Balbi commit e110de4d5358f2e67c333d23d608cbabe26b6220 Author: Felipe Balbi Date: Thu Dec 2 09:38:12 2010 +0200 usb: musb: davinci: give it a context structure that structure currently only holds a device pointer to our own platform_device and musb's platform_device, but soon it will hold pointers to our clock structures and glue-specific bits and pieces. Signed-off-by: Felipe Balbi commit 1add75d2bd1a44553e2c40e30db5f90a500dc1ab Author: Felipe Balbi Date: Thu Dec 2 09:35:58 2010 +0200 usb: musb: tusb6010: give it a context structure that structure currently only holds a device pointer to our own platform_device and musb's platform_device, but soon it will hold pointers to our clock structures and glue-specific bits and pieces. Signed-off-by: Felipe Balbi commit 0919dfc12a43d5ea21411e67984c268e84d05204 Author: Felipe Balbi Date: Thu Dec 2 09:33:24 2010 +0200 usb: musb: am35x: give it a context structure that structure currently only holds a device pointer to our own platform_device and musb's platform_device, but soon it will hold pointers to our clock structures and glue-specific bits and pieces. Signed-off-by: Felipe Balbi commit a3cee12aa9129b576c5403a31e37d0e0113235b3 Author: Felipe Balbi Date: Thu Dec 2 09:27:29 2010 +0200 usb: musb: omap2430: give it a context structure that structure currently only holds a device pointer to our own platform_device and musb's platform_device, but soon it will hold pointers to our clock structures and glue-specific bits and pieces. Signed-off-by: Felipe Balbi commit 9cb0308eec7a965136fe9fc6d1be3548c01a4a1e Author: Felipe Balbi Date: Thu Dec 2 09:21:05 2010 +0200 usb: musb: split blackfin to its own platform_driver Just adding its own platform_driver, not really using it yet. Later patches will come to split power management code from musb_core and move it completely to HW glue layer. Signed-off-by: Felipe Balbi commit 8ceae51ed5d1739d4ed5c4b947d12ff1d7df0e89 Author: Felipe Balbi Date: Thu Dec 2 09:19:35 2010 +0200 usb: musb: split da8xx to its own platform_driver Just adding its own platform_driver, not really using it yet. When all HW glue layers are converted, more patches will come to split power management code from musb_core and move it completely to HW glue layer. Signed-off-by: Felipe Balbi commit 73b089b052a69020b953312a624a6e1eb5b81fab Author: Felipe Balbi Date: Thu Dec 2 09:16:55 2010 +0200 usb: musb: split davinci to its own platform_driver Just adding its own platform_driver, not really using it yet. When all HW glue layers are converted, more patches will come to split power management code from musb_core and move it completely to HW glue layer. Signed-off-by: Felipe Balbi commit 18688fbeb09665725c842291bbadd88295a359e1 Author: Felipe Balbi Date: Thu Dec 2 09:13:54 2010 +0200 usb: musb: split tusb6010 to its own platform_driver Just adding its own platform_driver, not really using it yet. When all HW glue layers are converted, more patches will come to split power management code from musb_core and move it completely to HW glue layer. Signed-off-by: Felipe Balbi commit ce40c5767a0ea1e77ca5d0b73269cb86301a35cf Author: Felipe Balbi Date: Thu Dec 2 09:06:51 2010 +0200 usb: musb: split am35x to its own platform_driver Just adding its own platform_driver, not really using it yet. When all HW glue layers are converted, more patches will come to split power management code from musb_core and move it completely to HW glue layer. Signed-off-by: Felipe Balbi commit dc09886bfa781e2b442301116c18199519e36f0f Author: Felipe Balbi Date: Wed Dec 1 15:01:11 2010 +0200 usb: musb: split omap2430 to its own platform_driver Just adding its own platform_driver, not really using it yet. When all HW glue layers are converted, more patches will come to split power management code from musb_core and move it completely to HW glue layer. Signed-off-by: Felipe Balbi commit 05ac10dd6862a3fcce33d2203fbb2ef285e3ca87 Author: Felipe Balbi Date: Thu Dec 2 08:49:26 2010 +0200 usb: musb: trivial search and replace patch change all ocurrences of musb_hdrc to musb-hdrc. We will call glue layer drivers musb-, so in order to keep things somewhat standard, let's change the underscore into a dash. Signed-off-by: Felipe Balbi commit 7c925546427a0428b84bc5ba1f28b3698e492072 Author: Felipe Balbi Date: Wed Dec 1 14:23:48 2010 +0200 usb: musb: add Kconfig options for each glue layer This will make things simpler when choosing which glue layer to compile. It avoids a lot of magic around the "default" Kconfig option and lets the user choose what exactly s/he wants to compile. Signed-off-by: Felipe Balbi commit 7421107b293cace2fc081731306d447ecd8517ab Author: Felipe Balbi Date: Wed Dec 1 13:53:27 2010 +0200 usb: musb: hold context on musb structure when we start splitting HW glue layer, it's gonna make it easier to re-use that structure. Signed-off-by: Felipe Balbi commit 1ea7f352d832d5abe43d5e9198098acb4d611ba3 Author: Felipe Balbi Date: Wed Dec 1 13:48:54 2010 +0200 arm: omap4: panda: initialize musb initialize the musb port on pandaboard. Signed-off-by: Ming Lei Signed-off-by: Felipe Balbi commit f404c2fea37e02bec7c8b6edddf5edd22ca60505 Author: Vladislav Zolotarov Date: Wed Dec 8 01:43:37 2010 +0000 bnx2x: Update version number and a date. Signed-off-by: Vladislav Zolotarov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit 5cd737c2e84bebf532f536f7addfdd75162bba04 Author: Vladislav Zolotarov Date: Wed Dec 8 01:43:29 2010 +0000 bnx2x: Fixed a compilation warning bnx2x_src_init_t2() is used only when BCM_CNIC is defined. So, to avoid a compilation warning, we won't define it unless BCM_CNIC is defined. Signed-off-by: Vladislav Zolotarov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit d245a1111251d77c804e9fe362e9f70aba856e1e Author: Vladislav Zolotarov Date: Wed Dec 8 01:43:17 2010 +0000 bnx2x: Use dma_alloc_coherent() semantics for ILT memory allocation Signed-off-by: Vladislav Zolotarov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit 2297a2da5a8507bf6596dc30ace3483c00bd85ed Author: Vladislav Zolotarov Date: Wed Dec 8 01:43:09 2010 +0000 bnx2x: LSO code was broken on BE platforms Make the LSO code work on BE platforms: parsing_data field of a parsing BD (PBD) for 57712 was improperly composed which made FW read wrong values for TCP header's length and offset and, as a result, the corresponding PCI device was performing bad DMA reads triggering EEH. Signed-off-by: Vladislav Zolotarov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit 4bc65dd8d88671712d71592a83374cfb0b5fce7a Author: Eric Dumazet Date: Tue Dec 7 22:26:15 2010 +0000 filter: use size of fetched data in __load_pointer() __load_pointer() checks data we fetch from skb is included in head portion, but assumes we fetch one byte, instead of up to four. This wont crash because we have extra bytes (struct skb_shared_info) after head, but this can read uninitialized bytes. Fix this using size of the data (1, 2, 4 bytes) in the test. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 6934d33556b366d22392a415ca09d720fed6a442 Author: Thomas Bogendoerfer Date: Tue Dec 7 22:21:52 2010 +0000 hso: IP checksuming doesn't work on GE0301 option cards There is definitly a problem, that some option cards send up broken IP pakets leading to corrupted IP packets. These corruptions aren't detected, because the driver claims that the packets are already checksummed. This change removes the CHECKSUM_UNNECESSARY option and let IP detect broken data. Signed-off-by: Thomas Bogendoerfer Signed-off-by: David S. Miller commit 78347c8c6b2ddf20535bc1b18d749a3bbdea2a60 Author: Thomas Egerer Date: Mon Dec 6 23:28:56 2010 +0000 xfrm: Fix xfrm_state_migrate leak xfrm_state_migrate calls kfree instead of xfrm_state_put to free a failed state. According to git commit 553f9118 this can cause memory leaks. Signed-off-by: Thomas Egerer Signed-off-by: Steffen Klassert Acked-by: Herbert Xu Signed-off-by: David S. Miller commit fb4fa76a1fa59340154c42d998d700e1f8bf21e0 Author: Neil Horman Date: Mon Dec 6 09:05:50 2010 +0000 net: Convert netpoll blocking api in bonding driver to be a counter A while back I made some changes to enable netpoll in the bonding driver. Among them was a per-cpu flag that indicated we were in a path that held locks which could cause the netpoll path to block in during tx, and as such the tx path should queue the frame for later use. This appears to have given rise to a regression. If one of those paths on which we hold the per-cpu flag yields the cpu, its possible for us to come back on a different cpu, leading to us clearing a different flag than we set. This results in odd netpoll drops, and BUG backtraces appearing in the log, as we check to make sure that we only clear set bits, and only set clear bits. I had though briefly about changing the offending paths so that they wouldn't sleep, but looking at my origional work more closely, it doesn't appear that a per-cpu flag is warranted. We alrady gate the checking of this flag on IFF_IN_NETPOLL, so we don't hit this in the normal tx case anyway. And practically speaking, the normal use case for netpoll is to only have one client anyway, so we're not going to erroneously queue netpoll frames when its actually safe to do so. As such, lets just convert that per-cpu flag to an atomic counter. It fixes the rescheduling bugs, is equivalent from a performance perspective and actually eliminates some code in the process. Tested by the reporter and myself, successfully Reported-by: Liang Zheng CC: Jay Vosburgh CC: Andy Gospodarek CC: David S. Miller Signed-off-by: Neil Horman Signed-off-by: David S. Miller commit 60d509c823cca21e77d537bd356785f7cfe8f0d1 Author: Jozsef Kadlecsik Date: Fri Dec 3 02:39:01 2010 +0000 The new jhash implementation The current jhash.h implements the lookup2() hash function by Bob Jenkins. However, lookup2() is outdated as Bob wrote a new hash function called lookup3(). The patch replaces the lookup2() implementation of the 'jhash*' functions with that of lookup3(). You can read a longer comparison of the two and other hash functions at http://burtleburtle.net/bob/hash/doobs.html. Signed-off-by: Jozsef Kadlecsik Acked-by: Rusty Russell Signed-off-by: David S. Miller commit 68835aba4d9b74e2f94106d13b6a4bddc447c4c8 Author: Eric Dumazet Date: Tue Nov 30 19:04:07 2010 +0000 net: optimize INET input path further Followup of commit b178bb3dfc30 (net: reorder struct sock fields) Optimize INET input path a bit further, by : 1) moving sk_refcnt close to sk_lock. This reduces number of dirtied cache lines by one on 64bit arches (and 64 bytes cache line size). 2) moving inet_daddr & inet_rcv_saddr at the beginning of sk (same cache line than hash / family / bound_dev_if / nulls_node) This reduces number of accessed cache lines in lookups by one, and dont increase size of inet and timewait socks. inet and tw sockets now share same place-holder for these fields. Before patch : offsetof(struct sock, sk_refcnt) = 0x10 offsetof(struct sock, sk_lock) = 0x40 offsetof(struct sock, sk_receive_queue) = 0x60 offsetof(struct inet_sock, inet_daddr) = 0x270 offsetof(struct inet_sock, inet_rcv_saddr) = 0x274 After patch : offsetof(struct sock, sk_refcnt) = 0x44 offsetof(struct sock, sk_lock) = 0x48 offsetof(struct sock, sk_receive_queue) = 0x68 offsetof(struct inet_sock, inet_daddr) = 0x0 offsetof(struct inet_sock, inet_rcv_saddr) = 0x4 compute_score() (udp or tcp) now use a single cache line per ignored item, instead of two. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit e83df17f178360a8e7874441bca04a710c869e42 Author: Kevin Hilman Date: Wed Dec 8 22:40:40 2010 +0000 OMAP2+: PM/serial: fix console semaphore acquire during suspend commit 0d8e2d0dad98a693bad88aea6876ac8b94ad95c6 (OMAP2+: PM/serial: hold console semaphore while OMAP UARTs are disabled) added use of the console semaphore to protect UARTs from being accessed after disabled during idle, but this causes problems in suspend. During suspend, the console semaphore is acquired by the console suspend method (console_suspend()) so the try_acquire_console_sem() will always fail and suspend will be aborted. To fix, introduce a check so the console semaphore is only attempted during idle, and not during suspend. Also use the same check so that the console semaphore is not prematurely released during resume. Thanks to Paul Walmsley for suggesting adding the same check during resume. Cc: Paul Walmsley Tested-by: Jean Pihet Tested-by: Paul Walmsley Signed-off-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 88ab8a8445838785e38af378740ab57f8cb6cb8a Author: Xenofon Foukas Date: Sat Dec 4 00:17:55 2010 +0200 Staging: comedi: Fix coding style issues in drivers.c This patch fixes line over 80 characters warning issues found in file drivers.c Signed-off-by: Xenofon Foukas Signed-off-by: Greg Kroah-Hartman commit fd599985e649c71162495d307a2fd1bbddc258e4 Author: Mark Allyn Date: Thu Dec 9 09:32:53 2010 -0800 Staging: sep: eliminate kernel crash due to null parameter in dma_alloc_coherent Signed-off-by: Mark Allyn Signed-off-by: Greg Kroah-Hartman commit 653bf0cfa55896b74d8cbe7e561401813ca359ad Author: Mark Allyn Date: Thu Dec 9 09:32:38 2010 -0800 Staging: sep: ensure that caller id buffer is little endian Signed-off-by: Mark Allyn Signed-off-by: Greg Kroah-Hartman commit c100fa4d6142271cc6d228fd84a5da2390ec5ec1 Author: Mark Allyn Date: Thu Dec 9 09:32:26 2010 -0800 Staging: sep: reduce 64 and 32 bit compile warnings Signed-off-by: Mark Allyn Signed-off-by: Greg Kroah-Hartman commit be38efe11748684d54ff86810443979a59b96cfc Author: Mark Allyn Date: Thu Dec 9 09:32:13 2010 -0800 Staging: sep: limit time to wait for reconfig shared area complete Signed-off-by: Mark Allyn Signed-off-by: Greg Kroah-Hartman commit 8f9346a091ac523afa73643aae69f74f0f8a6e80 Author: Mark Allyn Date: Thu Dec 9 09:31:57 2010 -0800 Staging: sep: remove completed items in TODO Signed-off-by: Mark Allyn Signed-off-by: Greg Kroah-Hartman commit 0dd12c44510c342282145c8048b447a13ce78a32 Author: Mark Allyn Date: Thu Dec 9 09:31:43 2010 -0800 Staging: sep: remove code for Moorestown device The Moorestown (older device) will be added to driver later. Signed-off-by: Mark Allyn Signed-off-by: Greg Kroah-Hartman commit 08740c97e191d4d5bb1f472a6ec0fa24ebdbc8bc Author: Mark Allyn Date: Thu Dec 9 09:31:31 2010 -0800 Staging: sep: initialize driver copy of send and receive count with device Signed-off-by: Mark Allyn Signed-off-by: Greg Kroah-Hartman commit 843f65c669c1164897dc5ef79c0df00cb66490bf Author: Mark Allyn Date: Thu Dec 9 09:31:18 2010 -0800 Staging: sep: clean up error checking in probe function Add pci_disable Signed-off-by: Mark Allyn Signed-off-by: Greg Kroah-Hartman commit b0daf59c5fc9ac6c65645ffb40156f5d5a0052a4 Author: Mark Allyn Date: Thu Dec 9 09:30:31 2010 -0800 Staging: sep: sram_addr is 32 bit; this is not a kernel address, but device internal value This does not have to be 64 bits wide Signed-off-by: Mark Allyn Signed-off-by: Greg Kroah-Hartman commit e957b063abdf0f005ba2c298345c75aa7ac4c22a Author: Mark Allyn Date: Thu Dec 9 09:30:17 2010 -0800 Staging: sep: remove spaces at end of lines Signed-off-by: Mark Allyn Signed-off-by: Greg Kroah-Hartman commit f15662755f7eb3db4a416d52af24771cc208e7b0 Author: Mark Allyn Date: Thu Dec 9 09:30:03 2010 -0800 Staging: sep: remove virtual address being passed to user space application Signed-off-by: Mark Allyn Signed-off-by: Greg Kroah-Hartman commit c5e61563e26b5a43646393c5f5020d172b2767c7 Author: Marek Belisko Date: Thu Dec 9 16:13:54 2010 +0100 staging: ft1000: Add file header to ft1000_proc.c Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit e2398c61272f378b257b3107fdb960e0b642eeb6 Author: Marek Belisko Date: Thu Dec 9 16:13:53 2010 +0100 staging: ft1000: Remove dead code. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 96ff77f7350576d1b25908b59f15d2ab5222c432 Author: Marek Belisko Date: Thu Dec 9 16:13:52 2010 +0100 staging: ft1000: Fix coding style. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 85d47cff4ea2ab0d5380ba649ac4515d1a5bcf23 Author: Marek Belisko Date: Thu Dec 9 16:13:51 2010 +0100 staging: ft1000: Coding style fix in ft1000ReadProc. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 92914cc8bb6d2d710d102051c9bb7566b0ac75a0 Author: Marek Belisko Date: Thu Dec 9 16:13:50 2010 +0100 staging: ft1000: Fix coding style in ft1000NotifyProc. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 1c46282421c8b31b37323f7b007c4562ce17578c Author: Marek Belisko Date: Thu Dec 9 16:13:49 2010 +0100 staging: ft1000: Use return value for ft1000InitProc. Add checking for return value ft1000InitProc and cleanup if something fail. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 04c6620117488c0ccc612da5f2bcbcde025e9301 Author: Marek Belisko Date: Thu Dec 9 16:13:48 2010 +0100 staging: ft1000: Fix coding style. Fix coding style in ft1000CleanupProc and ft1000InitProc functions. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 5fd866fb6401cf6a912e75e1b9c4b906bf42434e Author: Marek Belisko Date: Thu Dec 9 16:13:47 2010 +0100 staging: ft1000: Fix proc initialization handling. Cleaning proc entries when error occures was not handled correctly. So fix and also add proper cleaning. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 115884118a65c18af290476e44ca6c76a2c0a694 Author: Marek Belisko Date: Thu Dec 9 11:26:53 2010 +0100 staging: ft1000: Fix debug messages. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 05371d1861df75c7d89985760c9ce75fc806f4b8 Author: Marek Belisko Date: Thu Dec 9 11:26:52 2010 +0100 staging: ft1000: Remove unused headers. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit c82632d247ce839bfb001723ad1988d30d9febb9 Author: Marek Belisko Date: Thu Dec 9 11:26:51 2010 +0100 staging: ft1000: Remove dead code. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 4d791234f484002d57f634e3d90ca2cd51ed144e Author: Marek Belisko Date: Thu Dec 9 11:26:50 2010 +0100 staging: ft1000: Fix camelcase functions and variables. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 67e9f9e26b7d8862ec2e2a3ac0e56590088e9281 Author: Marek Belisko Date: Thu Dec 9 11:26:49 2010 +0100 staging: ft1000: Remove unused variable. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit e34dc580dc4a76106755b88ada5903eaa427c9f4 Author: Marek Belisko Date: Thu Dec 9 11:26:48 2010 +0100 staging: ft1000: Remove unused pdevobj array. We don't need to store pointer to device in some local array because we always pass to debugfs correct device pointer. So remove it. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 6d96940b2de8f8ac2bc938ea9249ed380cf906e0 Author: Marek Belisko Date: Thu Dec 9 11:26:47 2010 +0100 staging: ft1000: Fix private data pointer usage. Assign private data pointer to device for usage in file operations. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 9119dee1ce32453dfe24656091d69f8d57397fe0 Author: Marek Belisko Date: Thu Dec 9 11:26:46 2010 +0100 staging: ft1000: Convert char device to debugfs. Character device was used only for debugging purposes. Convert it to debugfs functionality. For every plugged device create new directory with one file. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 372058f1b4b3603a7e0c26f38d6eb20a3dd8c453 Author: Randy Dunlap Date: Thu Dec 9 09:38:34 2010 -0800 staging: solo6010 depends on I2C This driver uses i2c interfaces, so it should depend on I2C (unless someone wants to break it into pieces or make it more config-dependent). drivers/staging/solo6x10/solo6010-i2c.c:47: error: implicit declaration of function 'i2c_transfer' drivers/staging/solo6x10/solo6010-i2c.c:299: error: implicit declaration of function 'i2c_add_adapter' drivers/staging/solo6x10/solo6010-i2c.c:310: error: implicit declaration of function 'i2c_del_adapter' Signed-off-by: Randy Dunlap Cc: Ben Collins Signed-off-by: Greg Kroah-Hartman commit 0e0792fef4ea8e9f8f90819ad97918f61e467855 Author: Roland Vossen Date: Thu Dec 9 19:36:08 2010 +0100 staging: brcm80211: removed ap related comments Code cleanup, reaction on the 2nd email from Dan Carpenter. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit 6f475b71605c7ebf6f5b06b8e4dc58f672b4f9b5 Author: Namhyung Kim Date: Fri Dec 10 01:40:25 2010 +0900 Staging: sm7xx: use DEFINE_PCI_DEVICE_TABLE Convert 'const struct pci_device_id xxx[]' to 'DEFINE_PCI_DEVICE_TABLE(xxx)'. Signed-off-by: Namhyung Kim Signed-off-by: Greg Kroah-Hartman commit 5eaa53de2d9acd9dbcf737b247a0bb0788e79fdf Author: Namhyung Kim Date: Fri Dec 10 01:40:27 2010 +0900 Staging: rtl8192e: use DEFINE_PCI_DEVICE_TABLE Convert 'const struct pci_device_id xxx[]' to 'DEFINE_PCI_DEVICE_TABLE(xxx)'. Signed-off-by: Namhyung Kim Signed-off-by: Greg Kroah-Hartman commit 94ab896367d5d6e0bc3064852569c1ff9658ec9c Author: Namhyung Kim Date: Fri Dec 10 01:40:26 2010 +0900 Staging: cx25821: use DEFINE_PCI_DEVICE_TABLE Convert 'const struct pci_device_id xxx[]' to 'DEFINE_PCI_DEVICE_TABLE(xxx)'. Signed-off-by: Namhyung Kim Signed-off-by: Greg Kroah-Hartman commit abb9eb75a34cbd34ee4e9160ac349eff91b926d8 Author: Namhyung Kim Date: Fri Dec 10 01:40:28 2010 +0900 Staging: phison: use DEFINE_PCI_DEVICE_TABLE Convert 'const struct pci_device_id xxx[]' to 'DEFINE_PCI_DEVICE_TABLE(xxx)'. Signed-off-by: Namhyung Kim Signed-off-by: Greg Kroah-Hartman commit 270b64bb4cf27a2ad7819bad89d8c9d8a66ba1b8 Author: Namhyung Kim Date: Fri Dec 10 01:40:29 2010 +0900 Staging: vme_tsi148: use DEFINE_PCI_DEVICE_TABLE Convert 'const struct pci_device_id xxx[]' to 'DEFINE_PCI_DEVICE_TABLE(xxx)'. Signed-off-by: Namhyung Kim Signed-off-by: Greg Kroah-Hartman commit 2cea0cf284048b03a06e4370709cd751ddb9354e Author: Namhyung Kim Date: Fri Dec 10 01:40:30 2010 +0900 Staging: vme_ca91cx42: use DEFINE_PCI_DEVICE_TABLE Convert 'const struct pci_device_id xxx[]' to 'DEFINE_PCI_DEVICE_TABLE(xxx)'. Signed-off-by: Namhyung Kim Signed-off-by: Greg Kroah-Hartman commit 310d605293f0ab6dc9c7fe7a3cb5c850c60527b4 Author: Tobias Klauser Date: Thu Dec 9 16:01:07 2010 +0100 staging: brcm80211: Remove redundant unlikely() IS_ERR() already implies unlikely(), so it can be omitted here. Signed-off-by: Tobias Klauser Signed-off-by: Greg Kroah-Hartman commit 28dd31983f6c3a4d89369ff8f0c93de2cda868db Author: Kevin Hilman Date: Wed Dec 8 01:02:12 2010 +0000 OMAP1: SRAM: fix size for OMAP1611 SoCs Kernel was failing to boot on omap1611 based OSK boards due to mis-configured SRAM size. Existing code was using a hard-coded value for 250k, which was then rounded down by PAGE_SIZE. Increasing this to 256k allows kernel to boot on omap1611 SoCs. Problem reported by and initial fix suggested by Tim Bird. Thanks to Tony Lindgren for helping diagnose the problem to being specific to OMAP1611 and not affecting OMAP1610/OMAP1623. Reported-by: Tim Bird Signed-off-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 1f0613158ea14b399fd7a16470630a729ba9d0c3 Author: Chen, Chien-Chia Date: Thu Dec 9 10:52:08 2010 +0800 Staging: rt2860: fix previous patch error Somehow Greg messed up the last patch and missed a chunk. This patch contains the missing chunk. Acked-by: Lee, Chun-Yi Signed-off-by: Chen, Chien-Chia Cc: stable Signed-off-by: Greg Kroah-Hartman commit 03a9e5126147c9f92aeba4b34f62b15b625087fb Author: Tony Lindgren Date: Thu Dec 9 15:49:23 2010 -0800 omap1: Use asm_irq_flags for entry-macro.S Initialize asm_irq_flags in omap_init_irq and use it in get_irqnr_and_base to detect between omap7xx and omap15xx/16xx. Note that both INT_1510_IH2_IRQ and INT_1510_IH2_IRQ are defined as 0, so use INT_1510_IH2_IRQ for both of them. Tested-by: Janusz Krzysztofik Signed-off-by: Tony Lindgren commit c451278c2864e253a4bb303b596a29edc3bb527c Merge: 7b045c96cd1405597a6a2e98bc53a4ac01d835b1 5403187f83c12c6f4c03547e0cc05bac0310be7b Author: Tony Lindgren Date: Thu Dec 9 15:48:03 2010 -0800 Merge branch 'devel-cleanup' into omap-for-linus commit 39c99f12f15c8bf8257985d9b2a2548a03d18c00 Author: Tristan Ye Date: Tue Dec 7 14:35:07 2010 +0800 Ocfs2: Teach 'coherency=full' O_DIRECT writes to correctly up_read i_alloc_sem. Due to newly-introduced 'coherency=full' O_DIRECT writes also takes the EX rw_lock like buffered writes did(rw_level == 1), it turns out messing the usage of 'level' in ocfs2_dio_end_io() up, which caused i_alloc_sem being failed to get up_read'd correctly. This patch tries to teach ocfs2_dio_end_io to understand well on all locking stuffs by explicitly introducing a new bit for i_alloc_sem in iocb's private data, just like what we did for rw_lock. Signed-off-by: Tristan Ye Signed-off-by: Joel Becker commit 388c4bcb4e63e88fb1f312a2f5f9eb2623afcf5b Author: Sunil Mushran Date: Fri Nov 19 15:06:50 2010 -0800 ocfs2/dlm: Migrate lockres with no locks if it has a reference o2dlm was not migrating resources with zero locks because it assumed that that resource would get purged by dlm_thread. However, some usage patterns involve creating and dropping locks at a high rate leading to the migrate thread seeing zero locks but the purge thread seeing an active reference. When this happens, the dlm_thread cannot purge the resource and the migrate thread sees no reason to migrate that resource. The spell is broken when the migrate thread catches the resource with a lock. The fix is to make the migrate thread also consider the reference map. This usage pattern can be triggered by userspace on userdlm locks and flocks. Signed-off-by: Sunil Mushran Signed-off-by: Joel Becker commit 67b96c182c36c83cd6881122b4a7922b2634047b Merge: efc70d241f5c7fc0a9f1c2a01781ed946d9dbe21 ddbc24b72c2c3f3f0182bbc2cb70b31c52a6f45b Author: Ingo Molnar Date: Fri Dec 10 00:31:30 2010 +0100 Merge branch 'perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux-2.6 into perf/core commit efc70d241f5c7fc0a9f1c2a01781ed946d9dbe21 Author: Ingo Molnar Date: Fri Dec 10 00:27:23 2010 +0100 perf, sparc: Fix CONFIG_PERF_EVENTS=y build error Fix a typo in: 004417a6d468: perf, arch: Cleanup perf-pmu init vs lockup-detector Which caused a build failure on Sparc, reported by Stephen Rothwell. Reported-by: Stephen Rothwell Cc: David S. Miller Signed-off-by: Peter Zijlstra Signed-off-by: Ingo Molnar commit 5dc3055879b8f659f62abb7c3d1eaa4d02e36d65 Author: Don Zickus Date: Mon Nov 29 17:07:17 2010 -0500 x86, NMI: Add back unknown_nmi_panic and nmi_watchdog sysctls Originally adapted from Huang Ying's patch which moved the unknown_nmi_panic to the traps.c file. Because the old nmi watchdog was deleted before this change happened, the unknown_nmi_panic sysctl was lost. This re-adds it. Also, the nmi_watchdog sysctl was re-implemented and its documentation updated accordingly. Patch-inspired-by: Huang Ying Signed-off-by: Don Zickus Reviewed-by: Cyrill Gorcunov Acked-by: Yinghai Lu Cc: fweisbec@gmail.com LKML-Reference: <1291068437-5331-3-git-send-email-dzickus@redhat.com> Signed-off-by: Ingo Molnar commit 96a84c20d635fb1e98ab92f9fc517c4441f5c424 Author: Don Zickus Date: Mon Nov 29 17:07:16 2010 -0500 lockup detector: Compile fixes from removing the old x86 nmi watchdog My patch that removed the old x86 nmi watchdog broke other arches. This change reverts a piece of that patch and puts the change in the correct spot. Signed-off-by: Don Zickus Reviewed-by: Cyrill Gorcunov Cc: fweisbec@gmail.com Cc: yinghai@kernel.org LKML-Reference: <1291068437-5331-2-git-send-email-dzickus@redhat.com> Signed-off-by: Ingo Molnar commit a5dc4f898c2a0f66e2cefada6c687db82ba2fcbc Author: Alexey Starikovskiy Date: Thu Dec 9 17:07:54 2010 -0500 ACPI: EC: Add another dmi match entry for MSI hardware http://bugzilla.kernel.org/show_bug.cgi?id=15418 Signed-off-by: Alexey Starikovskiy cc: stable@kernel.org Signed-off-by: Len Brown commit dc6bbc991b0c408daad5df43e5851f1d369e50f7 Author: Tobias Klauser Date: Thu Dec 9 15:51:32 2010 +0100 msm_serial: Remove redundant unlikely() IS_ERR() already implies unlikely(), so it can be omitted here. Signed-off-by: Tobias Klauser Signed-off-by: David Brown commit 7c03b87048f2467087ae7e51392e5fb57ea8f58b Author: Mike Miller Date: Wed Dec 1 11:16:07 2010 -0600 [SCSI] hpsa: fix redefinition of PCI_DEVICE_ID_CISSF PCI_DEVICE_ID_CISSF is defined as 323b in pci_ids.h but redefined as 3fff in hpsa.c. The ID of 3fff will _never_ ship as a standalone controller. It is intended only as part a complete storage solution. As such, this patch removes the redefinition and the StorageWorks P1210m from the product table. It also removes a duplicate line for the "unknown" controller support. Signed-off-by: James Bottomley commit d1b758ebc2a82d738092cb42e742470f9d0ea53e Author: Konrad Rzeszutek Wilk Date: Thu Dec 9 14:53:29 2010 -0500 xen/irq: Cleanup the find_unbound_irq The "find_unbound_irq" is a bit unusual - it allocates virtual IRQ (event channels) in reverse order. This means starting at the "top" of the available IRQs (nr_irqs) down to the GSI/MSI IRQs (nr_irqs_gsi). Lets document this and also make the variables easier to understand. Signed-off-by: Konrad Rzeszutek Wilk commit 0e3fa13f4ee110de007bca3bf395b77997319fc8 Author: Feng Tang Date: Wed Dec 8 15:18:57 2010 +0800 x86: Further simplify mp_irq info handling assign_to_mp_irq() is copying the struct mpc_intsrc members one by one. That's silly. Use memcpy() and let the compiler figure it out. Same for the identical function assign_to_mpc_intsrc() mp_irq_mpc_intsrc_cmp() is comparing the struct members one by one, but no caller ever checks the different return codes. Use memcmp() instead. Remove the extra printk in MP_ioapic_info() Signed-off-by: Feng Tang Cc: Yinghai Lu Cc: "Alan Cox Cc: Len Brown LKML-Reference: <20101208151857.212f0018@feng-i7> Signed-off-by: Thomas Gleixner commit 2d8009ba67f9503ceadf9d5a3b5637cee291ea8d Author: Feng Tang Date: Fri Nov 19 11:33:35 2010 +0800 x86: Unify 3 similar ways of saving mp_irqs info There are 3 places defining similar functions of saving IRQ vector info into mp_irqs[] array: mmparse/acpi/mrst. Replace the redundant code by a common function in io_apic.c as it's only called when CONFIG_X86_IO_APIC=y Signed-off-by: Feng Tang Cc: Alan Cox Cc: Len Brown Cc: Yinghai Lu LKML-Reference: <20101207133204.4d913c5a@feng-i7> Signed-off-by: Thomas Gleixner commit 60d79fd99ff3b9c692b260a4d53a203f537c052a Author: Yinghai Lu Date: Tue Dec 7 00:59:49 2010 -0800 x86, ioapic: Avoid writing io_apic id if already correct For 32bit mptable path, setup_ids_from_mpc() always writes the io_apic id register, even there is no change needed. Skip the write, when readout and mptable match. Signed-off-by: Yinghai Lu Cc: Sebastian Siewior LKML-Reference: <4CFDF785.7010401@kernel.org> Signed-off-by: Thomas Gleixner commit 0450193bffed6e4b6160c4a5ccb0df158eba7d2a Author: Yinghai Lu Date: Tue Dec 7 00:55:56 2010 -0800 x86, x2apic: Don't map lapic addr for preenabled x2apic systems If x2apic is preenabled and used by the kernel, we don't need to map the lapic address. That mapping will never be used. So just skip that in register_lapic_address() Signed-off-by: Yinghai Lu Cc: Suresh Siddha Cc: "Eric W. Biederman" LKML-Reference: <4CFDF69C.9070501@kernel.org> Signed-off-by: Thomas Gleixner commit 53301f36f316a6519c464b0ef2a155386c20be19 Author: Yinghai Lu Date: Tue Dec 7 00:55:47 2010 -0800 x86, sfi: Use register_lapic_address() register_lapic_address() and mp_sfi_register_lapic_address() are almost identical. Use the common function. Signed-off-by: Yinghai Lu Cc: Suresh Siddha Cc: "Eric W. Biederman" Cc: Len Brown LKML-Reference: <4CFDF693.6000908@kernel.org> Signed-off-by: Thomas Gleixner commit 326a2e6bae250b1172c0ae80f3b259d79e9cb56c Author: Yinghai Lu Date: Tue Dec 7 00:55:38 2010 -0800 x86, apic: Use register_lapic_address() in init_apic_mapping() Remove the printk as well, we don't want to print when nothing changed. We print in register_lapic_address() already. Signed-off-by: Yinghai Lu Cc: Suresh Siddha Cc: "Eric W. Biederman" LKML-Reference: <4CFDF68A.7020902@kernel.org> Signed-off-by: Thomas Gleixner commit f1157141636848f52c5f74040bed0ba355cf59b7 Author: Yinghai Lu Date: Tue Dec 7 00:55:29 2010 -0800 x86, apic: Remove early_init_lapic_mapping() It is almost the same as smp_register_lapic_addr(). We just need to let smp_read_mpc() call smp_register_lapic_addr() when early==1. Add the apic_printk to smp_register_lapic_address() Signed-off-by: Yinghai Lu Cc: Suresh Siddha Cc: "Eric W. Biederman" LKML-Reference: <4CFDF681.3030509@kernel.org> Signed-off-by: Thomas Gleixner commit c0104d38a740b25662c592c71f6907676510289c Author: Yinghai Lu Date: Tue Dec 7 00:55:17 2010 -0800 x86, apic: Unify identical register_lapic_address() functions They are the same, move the common function to apic.c to allow further cleanups. Signed-off-by: Yinghai Lu Cc: Suresh Siddha Cc: "Eric W. Biederman" Cc: Len Brown LKML-Reference: <4CFDF675.4060305@kernel.org> Signed-off-by: Thomas Gleixner commit 3138b32d5e0998ba3cbd1c74bdc1887d74c5279b Author: Zhang Rui Date: Wed Dec 8 10:40:49 2010 +0800 ACPI battery: update status upon sysfs query Sometimes the Battery driver doesn't get notifications when it's plugged/unplugged. And this results in the incorrect Battery status reported by the power supply sysfs I/F. Update Battery status first when querying from sysfs. http://marc.info/?l=linux-acpi&m=128855015826728&w=2 Tested_by: Seblu Signed-off-by: Zhang Rui Signed-off-by: Len Brown commit 3151dbb04ad5a5bd6358371c0bfb457216d00205 Author: Zhang Rui Date: Wed Dec 8 10:40:45 2010 +0800 ACPI ac: update AC status upon sysfs query http://marc.info/?l=linux-acpi&m=128855015826728&w=2 https://bugzilla.kernel.org/show_bug.cgi?id=21722 Tested_by: Seblu Signed-off-by: Zhang Rui Signed-off-by: Len Brown commit 63abf3edaf42d0b9f278df90fe41c7ed4796b6b1 Author: Chris Wilson Date: Wed Dec 8 16:48:21 2010 +0000 drm/i915/sdvo: Only use the SDVO pin if it is in the valid range BIOSes. Can't live without them (apparently), definitely can't live with them. Reported-by: Ben Gamari Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=24312 Signed-off-by: Chris Wilson commit f8bbeabc34aa945ab4275abc9a4dfde0aea798ca Author: Sarah Sharp Date: Thu Dec 9 10:29:00 2010 -0800 xhci: Fix issue with port array setup and buggy hosts. Fix two bugs with the port array setup. The first bug will only show up with broken xHCI hosts with Extended Capabilities registers that have duplicate port speed entries for the same port. The idea with the original code was to set the port_array entry to -1 if the duplicate port speed entry said the port was a different speed than the original port speed entry. That would mean that later, the port would not be exposed to the USB core. Unfortunately, I forgot a continue statement, and the port_array entry would just be overwritten in the next line. The second bug would happen if there are conflicting port speed registers (so that some entry in port_array is -1), or one of the hardware port registers was not described in the port speed registers (so that some entry in port_array is 0). The code that sets up the usb2_ports array would accidentally claim those ports. That wouldn't really cause any user-visible issues, but it is a bug. This patch should go into the stable trees that have the port array and USB 3.0 port disabling prevention patches. Signed-off-by: Sarah Sharp Cc: stable@kernel.org commit 13d38d9df26b5b9a5ad5f9fbc065078bc42a8748 Author: Madhuranath Iyengar Date: Tue Nov 23 16:52:50 2010 -0800 [SCSI] qla2xxx: Update version number to 8.03.05-k0. Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit 69abf61ea1005bc362b678639a4ae219e23829f3 Author: Saurav Kashyap Date: Tue Nov 23 16:52:49 2010 -0800 [SCSI] qla2xxx: Properly set the return value in qla2xxx_eh_abort function. A return value is not set for the successful case and it has a garbage value. This fix will set the default value to SUCCESS and in case of any failures it is changed. Signed-off-by: Saurav Kashyap Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit 087c621e22f49c326cdc65d98c6fc0737ac13533 Author: Andrew Vasquez Date: Tue Nov 23 16:52:48 2010 -0800 [SCSI] qla2xxx: Correct issue where NPIV-config data was not being allocated for 82xx parts. This would cause a panic while reading the NPIV-config data. Cc: stable@kernel.org Signed-off-by: Andrew Vasquez Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit 7992abfc8b851456f2dfac3229ecb3a5e5637df0 Author: Mike Hernandez Date: Tue Nov 23 16:52:47 2010 -0800 [SCSI] qla2xxx: Change MSI initialization from using incorrect request_irq parameter. IRQF_SHARED flag should not be set when calling request_irq for MSI since this interrupt mechanism cannot be shared like standard INTx. Signed-off-by: Mike Hernandez Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit 85727e1f78bd8392a0657ad6a4ff85fef1cc4a6d Author: Mike Hernandez Date: Tue Nov 23 16:52:46 2010 -0800 [SCSI] qla2xxx: Populate Command Type 6 LUN field properly. Use the host_to_fcp_swap call to correctly populate the LUN field in the Command Type 6 path. This field is used during LUN reset cleanup and must match the field used in the FCP command. Cc: stable@kernel.org Signed-off-by: Mike Hernandez Signed-off-by: Madhuranath Iyengar Signed-off-by: James Bottomley commit 7e1fea731da8c1b5fcf5d8e157befd389b030760 Author: Josef Bacik Date: Wed Dec 8 12:22:34 2010 -0500 Btrfs: fixup return code for btrfs_del_orphan_item If the orphan item doesn't exist, we return 1, which doesn't make any sense to the callers. Instead return -ENOENT if we didn't find the item. Thanks, Signed-off-by: Josef Bacik commit b8399dee478db7939cd0d6fda8ecacddf2facd03 Author: Josef Bacik Date: Wed Dec 8 09:15:11 2010 -0500 Btrfs: do not do fast caching if we are allocating blocks for tree_root Since the fast caching uses normal tree locking, we can possibly deadlock if we get to the caching via a btrfs_search_slot() on the tree_root. So just check to see if the root we are on is the tree root, and just don't do the fast caching. Reported-by: Sage Weil Signed-off-by: Josef Bacik commit 2b20982e3154266106573beac2a4d4ba57a2789a Author: Josef Bacik Date: Fri Dec 3 13:17:53 2010 -0500 Btrfs: deal with space cache errors better Currently if the space cache inode generation number doesn't match the generation number in the space cache header we will just fail to load the space cache, but we won't mark the space cache as an error, so we'll keep getting that error each time somebody tries to cache that block group until we actually clear the thing. Fix this by marking the space cache as having an error so we only get the message once. This patch also makes it so that we don't try and setup space cache for a block group that isn't cached, since we won't be able to write it out anyway. None of these problems are actual problems, they are just annoying and sub-optimal. Thanks, Signed-off-by: Josef Bacik commit 955256f2c3e25c94ad373c43fbc38d2ac8af2a71 Author: Josef Bacik Date: Fri Nov 19 09:41:10 2010 -0500 Btrfs: fix use after free in O_DIRECT This fixes a bug where we use dip after we have freed it. Instead just use the file_offset that was passed to the function. Thanks, Signed-off-by: Josef Bacik commit defb3519a64141608725e2dac5a5aa9a3c644bae Author: David S. Miller Date: Wed Dec 8 21:16:57 2010 -0800 net: Abstract away all dst_entry metrics accesses. Use helper functions to hide all direct accesses, especially writes, to dst_entry metrics values. This will allow us to: 1) More easily change how the metrics are stored. 2) Implement COW for metrics. In particular this will help us put metrics into the inetpeer cache if that is what we end up doing. We can make the _metrics member a pointer instead of an array, initially have it point at the read-only metrics in the FIB, and then on the first set grab an inetpeer entry and point the _metrics member there. Signed-off-by: David S. Miller Acked-by: Eric Dumazet commit 6942fec92d3d1b6918425730de31b4c6d0d5c196 Author: Wey-Yi Guy Date: Thu Dec 9 10:09:14 2010 -0800 iwlagn: implement layout-agnostic EEPROM reading From: Johannes Berg The current EEPROM reading code has some layout assumptions that now turned out to be false with some newer versions of the EEPROM. Luckily, we can avoid all such assumptions by using data in the EEPROM itself, so implement using that. However, for risk mitigation purposes, keep the old reading code for current hardware for now. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit cbf68a668d0e41527572c762824a1b6a9225d33f Author: Johannes Berg Date: Tue Nov 30 11:03:44 2010 -0800 iwlagn: rename enhanced txpower fields Some fields we didn't previously use from the enhanced TX power structure will be needed in the next patch, so rename them to their correct names to be able to use them and change code reading them accordingly. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit 51ddafcbc735155a7e946b8b6ff19fcd5351375b Merge: d834a9dcecae834cd6b2bc5e50e1907738d9cf6a 991cfffa7c19aa648546aff666595af896e568ba Author: Thomas Gleixner Date: Thu Dec 9 18:19:13 2010 +0100 Merge branch 'x86/platform' into x86/apic-cleanups Reason: apic cleanup series depends on x86/apic, x86/amd-nb and x86/platform Signed-off-by: Thomas Gleixner commit d834a9dcecae834cd6b2bc5e50e1907738d9cf6a Merge: a38c5380ef9f088be9f49b6e4c5d80af8b1b5cd4 f658bcfb2607bf0808966a69cf74135ce98e5c2d Author: Thomas Gleixner Date: Thu Dec 9 18:17:25 2010 +0100 Merge branch 'x86/amd-nb' into x86/apic-cleanups Reason: apic cleanup series depends on x86/apic, x86/amd-nb x86/platform Conflicts: arch/x86/include/asm/io_apic.h Signed-off-by: Thomas Gleixner commit 4720dd1b3858f0da2593188cb1e57eb0d3bc4af2 Author: Thomas Gleixner Date: Thu Dec 9 17:43:21 2010 +0100 x86: io_apic: Avoid unused variable warning when CONFIG_GENERIC_PENDING_IRQ=n arch/x86/kernel/apic/io_apic.c: In function 'ack_apic_level': arch/x86/kernel/apic/io_apic.c:2433: warning: unused variable 'desc' Signed-off-by: Andrew Morton LKML-Reference: <201010272107.o9RL7rse018212@imap1.linux-foundation.org> Signed-off-by: Thomas Gleixner commit e55f87531c2c1eb071a296df7eb67f83d5f0b5df Author: Christof Schmitt Date: Thu Nov 18 14:53:18 2010 +0100 [SCSI] zfcp: Issue FCP command without holding SCSI host_lock Interrupting the connection to the FCP channel while I/O requests are being issued can lead to this deadlock. scsi_dispatch_cmd already holds the host_lock while the recovery trigger tries to acquire the host_lock again when iterating through the scsi_devices. INFO: lockdep is turned off. BUG: spinlock lockup on CPU#1, blast/9660, 0000000078f38878 CPU: 1 Not tainted 2.6.35.7SWEN2 #2 Process blast (pid: 9660, task: 0000000071f75940, ksp: 0000000074393ac0) 0000000074393640 00000000743935c0 0000000000000002 0000000000000000 0000000074393660 00000000743935d8 00000000743935d8 00000000005590c2 0000000000000000 0000000078f38878 0000000026ede800 0000000078f38878 000000000000000d 040000000000000c 0000000074393628 0000000000000000 0000000000000000 0000000000100b2a 00000000743935c0 0000000074393600 Call Trace: ([<0000000000100a32>] show_trace+0xee/0x144) [<00000000003be202>] do_raw_spin_lock+0x112/0x178 [<000000000055d408>] _raw_spin_lock_irqsave+0x90/0xb0 [<00000000003f1514>] __scsi_iterate_devices+0x38/0xbc [<00000000004849b0>] zfcp_erp_clear_adapter_status+0xd0/0x16c [<000000000048587a>] zfcp_erp_adapter_reopen+0x3a/0xb4 [<0000000000489812>] zfcp_fsf_req_send+0x166/0x180 [<000000000048c8d6>] zfcp_fsf_fcp_cmnd+0x272/0x408 [<000000000048f864>] zfcp_scsi_queuecommand+0x11c/0x1e0 [<00000000003f1f2a>] scsi_dispatch_cmd+0x1d6/0x324 [<00000000003f9910>] scsi_request_fn+0x42c/0x56c [<00000000003828ae>] __blk_run_queue+0x86/0x140 [<000000000037f742>] elv_insert+0x11a/0x208 [<000000000038104c>] blk_insert_cloned_request+0x84/0xe4 [<000003c0032b7c64>] dm_dispatch_request+0x6c/0x94 [dm_mod] [<000003c0032b7d5c>] map_request+0xd0/0x100 [dm_mod] [<000003c0032b9a78>] dm_request_fn+0xec/0x1bc [dm_mod] [<0000000000382c0e>] generic_unplug_device+0x5a/0x6c [<000003c0032b7f98>] dm_unplug_all+0x74/0x9c [dm_mod] [<00000000001d1272>] sync_page+0x76/0x9c [<00000000001d12ba>] sync_page_killable+0x22/0x60 [<000000000055a768>] __wait_on_bit_lock+0xc0/0x124 [<00000000001d1140>] __lock_page_killable+0x78/0x84 [<00000000001d351c>] generic_file_aio_read+0x5a4/0x7e8 [<0000000000228ec0>] do_sync_read+0xc8/0x12c [<0000000000229edc>] vfs_read+0xac/0x1ac [<000000000022a0d8>] SyS_read+0x58/0xa8 [<00000000001146de>] sysc_noemu+0x10/0x16 [<00000200000493c4>] 0x200000493c4 INFO: lockdep is turned off. Call zfcp_fsf_fcp_cmnd without the host_lock and disable the interrupts when acquiring the req_q_lock. According to the patch description in "[PATCH] Eliminate error handler overload of the SCSI serial number", the serial_number is not used, so simply drop the queuecommand wrapper function and run zfcp_scsi_queuecommand without holding the host_lock. Reviewed-by: Swen Schillig Signed-off-by: Christof Schmitt Signed-off-by: James Bottomley commit 14718e3cd8e9c6937114cebbf3ce5d504328da8c Author: Swen Schillig Date: Wed Nov 17 14:23:43 2010 +0100 [SCSI] zfcp: Prevent usage w/o holding a reference The ERP got values assigned for which no reference was taken. This can lead to an unpredictable race condition. Fix this by only assigning the values which are required and for which a reference was pulled or is held implicitly. Signed-off-by: Swen Schillig Signed-off-by: Christof Schmitt Signed-off-by: James Bottomley commit d3e1088d68735eb7da12f79a0c3c0d951cbc89f1 Author: Swen Schillig Date: Wed Nov 17 14:23:42 2010 +0100 [SCSI] zfcp: No ERP escalation on gpn_ft eval If the evaluation of GPN_FT requests wants to remove an invalid port from the system the zfcp_erp_port_shutdown function is triggered. Depending on the system status a superior action (e.g. adapter reopen) is required. This can lead to an invalid mem access of the port struct which might be freed at the time since the superior action is not holding a reference of the port which triggered this ERP action. Signed-off-by: Swen Schillig Signed-off-by: Christof Schmitt Signed-off-by: James Bottomley commit 6fbf25e86beef1c6719e760a241a7aef9ad145e3 Author: Swen Schillig Date: Wed Nov 17 14:23:41 2010 +0100 [SCSI] zfcp: Correct false abort data assignment. The request data assignment between the fsf abort initiator and its corresponding handler is not consistent and leads to an unpredictable behaviour, e.g. kernel panic. This patch fixes this issue and assigns the correct value. Signed-off-by: Swen Schillig Signed-off-by: Christof Schmitt Signed-off-by: James Bottomley commit 5bfb2c31487eaff3840e02548e6acf89a048765b Author: Swen Schillig Date: Wed Nov 17 14:23:40 2010 +0100 [SCSI] zfcp: Fix common FCP request reception The reception of a common FCP request should only be evaluated if the corresponding SCSI request data is available. Therefore put the information under the lock protection and verify the existence before processing. This fixes the following kernel panic. Unable to handle kernel pointer dereference at virtual kernel address 0000000180000000 Oops: 003b [#1] PREEMPT SMP DEBUG_PAGEALLOC CPU: 0 Not tainted 2.6.35.7-45.x.20101007-s390xdefault #1 Process blast (pid: 9711, task: 00000000a3be8e40, ksp: 00000000b221bac0) Krnl PSW : 0704300180000000 0000000000489878 (zfcp_fsf_fcp_handler_common+0x4c/0x3a0) R:0 T:1 IO:1 EX:1 Key:0 M:1 W:0 P:0 AS:0 CC:3 PM:0 EA:3 Krnl GPRS: 00000000b663c1b8 0000000180000000 000000007ab5bdf0 0000000000000000 00000000b0ccd800 0000000000000018 07000000a3be8e78 00000000b5d3e600 000000007ab5bdf0 0000000000000066 00000000b72137f0 00000000b72137f0 0000000000000000 00000000005a8178 00000000bdf37a60 00000000bdf379f0 Krnl Code: 0000000000489866: e3c030000004 lg %r12,0(%r3) 000000000048986c: e310c0000004 lg %r1,0(%r12) 0000000000489872: e31011e00004 lg %r1,480(%r1) >0000000000489878: 581011ec l %r1,492(%r1) 000000000048987c: a774001c brc 7,4898b4 0000000000489880: b91400b1 lgfr %r11,%r1 0000000000489884: 5810405c l %r1,92(%r4) 0000000000489888: 5510d00c cl %r1,12(%r13) Call Trace: ([<000000000010d344>] debug_event_common+0x22c/0x244) [<000000000048a0b4>] zfcp_fsf_fcp_cmnd_handler+0x2c/0x3b4 [<000000000048b5b6>] zfcp_fsf_req_complete+0x1b6/0x9dc [<000000000048bede>] zfcp_fsf_reqid_check+0x102/0x138 [<000000000048e478>] zfcp_qdio_int_resp+0x70/0x110 [<000000000044a1ec>] qdio_kick_handler+0xb0/0x19c [<000000000044c228>] __tiqdio_inbound_processing+0x30c/0xebc [<000000000014a5fc>] tasklet_action+0x1b4/0x1e8 [<000000000014b676>] __do_softirq+0x106/0x1cc [<000000000010d91a>] do_softirq+0xe6/0xec [<000000000014b0c8>] irq_exit+0xd4/0xd8 [<00000000004307ec>] do_IRQ+0x7c0/0xf54 [<0000000000114d28>] io_return+0x0/0x16 [<000000000055fef0>] sub_preempt_count+0x50/0xe4 ([<00000000b1f873c0>] 0xb1f873c0) [<000000000055e25a>] _raw_spin_unlock+0x46/0x74 [<0000000000241c40>] __d_lookup+0x288/0x2c8 [<000000000023502c>] do_lookup+0x7c/0x25c [<0000000000237fa8>] link_path_walk+0x5e4/0xe2c [<0000000000238a00>] path_walk+0x98/0x148 [<0000000000238c98>] do_path_lookup+0x74/0xc0 [<000000000023989c>] user_path_at+0x64/0xa4 [<000000000022e366>] vfs_fstatat+0x4e/0xb0 [<000000000022e4d6>] SyS_newstat+0x2e/0x54 [<00000000001146de>] sysc_noemu+0x10/0x16 [<0000020000153456>] 0x20000153456 INFO: lockdep is turned off. Last Breaking-Event-Address: [<000000000048a0ae>] zfcp_fsf_fcp_cmnd_handler+0x26/0x3b4 Signed-off-by: Swen Schillig Signed-off-by: Christof Schmitt Signed-off-by: James Bottomley commit 459dbf72e4d2b4aa13620e6b70d54f098547bf13 Author: James Bottomley Date: Wed Nov 17 10:10:57 2010 -0600 [SCSI] Eliminate error handler overload of the SCSI serial number The error handler is using the test cmd->serial_number == 0 in the abort routines to signal that the command to be aborted has already completed normally. This design was to close a race window in the original error handler where a command could go through the normal completion routines after it timed out but before error handling was started. Mike Anderson pointed out that when we converted our timeout and softirq completions, we picked up atomicity here because the block layer now mediates this with the REQ_ATOM_COMPLETE flag and guarantees that *either* the command times out or our done routine is called, but ensures we can't get both occurring. That makes the serial number zero check redundant and it can be removed. Signed-off-by: James Bottomley commit 5da61410054d125e63aeab9cc7a11874a69465c0 Author: Anil Ravindranath Date: Tue Nov 16 13:43:41 2010 -0800 [SCSI] pmcraid: disable msix and expand device config entry Firmware requires a larger configuration entry size than the driver currently allows, and MSI-X pretty much doesn't work with current FW, so disable it for now. Signed-off-by: Anil Ravindranath Signed-off-by: James Bottomley commit c7a841f3aca469187db76842676951a672fd27d1 Author: James Smart Date: Sun Nov 14 11:12:04 2010 -0500 [SCSI] bsg: correct fault if queue object removed while dev_t open This patch corrects an issue in bsg that results in a general protection fault if an LLD is removed while an application is using an open file handle to a bsg device, and the application issues an ioctl. The fault occurs because the class_dev is NULL, having been cleared in bsg_unregister_queue() when the driver was removed. With this patch, a check is made for the class_dev, and the application will receive ENXIO if the related object is gone. Signed-off-by: Carl Lajeunesse Signed-off-by: James Smart Signed-off-by: James Bottomley commit 057f02a38e67a944a2d0b89bb0111efb9dbe6e6e Author: Dan Carpenter Date: Fri Nov 12 07:31:46 2010 +0300 [SCSI] osd: checking NULL instead of ERR_PTR() bio_map_kern() returns ERR_PTRs on failure and never returns NULL. [jejb: remove redundant unlikely spotted by Tobias Klauser] Signed-off-by: Dan Carpenter Acked-by: Boaz Harrosh Signed-off-by: James Bottomley commit 2c6cb1053ad8b61ab9fb50b578d0ffea959f7583 Author: Rakib Mullick Date: Thu Dec 9 14:47:34 2010 +0600 x86: Address 'unused' warning in hw_nmi.c again arch/x86/kernel/apic/hw_nmi.c:29: warning: backtrace_mask defined but not used commit 0e2af2a9(x86, hw_nmi: Move backtrace_mask declaration under ARCH_HAS_NMI_WATCHDOG) addressed this warning, but it was reintroduced by commit 5f2b0ba4(x86, nmi_watchdog: Remove the old nmi_watchdog). Move backtrace_mask into the #ifdef arch_trigger_all_cpu_backtrace section again. Signed-off-by: Rakib Mullick Cc: Don Zickus Cc: Frederic Weisbecker LKML-Reference: Signed-off-by: Thomas Gleixner commit b7613370db5ba66ad81e41cd3a5417fde4d5e03c Author: John W. Linville Date: Thu Dec 9 09:08:47 2010 -0500 ath: fix build break with ATH_DBG_WARN_ON_ONCE Description by Hauke: "If CONFIG_ATH_DEBUG=y is set ATH_DBG_WARN_ON_ONCE uses WARN_ON_ONCE and returns something, but if CONFIG_ATH_DEBUG is not set it does not return anything. Now ATH_DBG_WARN_ON_ONCE is used in the boolean expression in an if case and is not returning anything and causes a compile error. CC [M] /drivers/net/wireless/ath/ath9k/main.o /drivers/net/wireless/ath/ath9k/main.c: In function ‘ath_isr’: /drivers/net/wireless/ath/ath9k/main.c:769: error: expected expression before ‘do’ make[5]: *** [/drivers/net/wireless/ath/ath9k/main.o] Error 1 make[4]: *** [/drivers/net/wireless/ath/ath9k] Error 2" Reported-by: Hauke Mehrtens Signed-off-by: John W. Linville commit ddbc24b72c2c3f3f0182bbc2cb70b31c52a6f45b Author: Arnaldo Carvalho de Melo Date: Thu Dec 9 12:20:20 2010 -0200 perf session: Remove unneeded dump_printf calls Since we check at the beginning of the callers, no need to ask if dump_trace is set multiple times. Cc: Frederic Weisbecker Cc: Ian Munsie Cc: Ingo Molnar Cc: Thomas Gleixner LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit ba74f0640d963ccc914ac533cb0ba133ee07bcf2 Author: Thomas Gleixner Date: Tue Dec 7 12:49:01 2010 +0000 perf session: Split out user event processing Simplify further. Cc: Frederic Weisbecker Cc: Ian Munsie Cc: Ingo Molnar Cc: Peter Zijlstra LKML-Reference: <20101207124551.110956235@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit 3dfc2c0aee789843d18f6e4675658e6879465a56 Author: Thomas Gleixner Date: Tue Dec 7 12:48:58 2010 +0000 perf session: Split out sample preprocessing Simplify the code a bit. Cc: Frederic Weisbecker Cc: Ian Munsie Cc: Ingo Molnar Cc: Peter Zijlstra LKML-Reference: <20101207124551.014649793@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit 532e7269c01098f0be6e08113c6947ec6ed11bfa Author: Thomas Gleixner Date: Tue Dec 7 12:48:55 2010 +0000 perf session: Move dump code to event delivery path Preparatory patch for ordered perf report -D Acked-by: Ian Munsie Cc: Frederic Weisbecker Cc: Ian Munsie Cc: Ingo Molnar Cc: Peter Zijlstra LKML-Reference: <20101207124550.918655066@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit f74725dcf2f6931c26bc65e77e34e693eeb8441c Author: Thomas Gleixner Date: Tue Dec 7 12:48:53 2010 +0000 perf session: Add file_offset to event delivery function Preparatory patch for ordered output of perf report -D Acked-by: Ian Munsie Cc: Frederic Weisbecker Cc: Ian Munsie Cc: Ingo Molnar Cc: Peter Zijlstra LKML-Reference: <20101207124550.818568607@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit e4c2df132fef60a28b851abc1859a531e64f350c Author: Thomas Gleixner Date: Tue Dec 7 12:48:50 2010 +0000 perf session: Store file offset in sample_queue Preparatory patch for ordered output of perf report -D. Acked-by: Ian Munsie Cc: Frederic Weisbecker Cc: Ian Munsie Cc: Ingo Molnar Cc: Peter Zijlstra LKML-Reference: <20101207124550.725128545@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit 4e53f78e5b06c073a5c10814c72e98c1ca8a9f10 Author: Michael S. Tsirkin Date: Mon Nov 29 19:16:37 2010 +0200 tools/virtio: virtio_test tool This is the userspace part of the tool: it includes a bunch of stubs for linux APIs, somewhat simular to linuxsched. This makes it possible to recompile the ring code in userspace. A small test example is implemented combining this with vhost_test module. Signed-off-by: Michael S. Tsirkin commit 71ccc212e5b28dfcc870b6db6589c2df264fdc6a Author: Michael S. Tsirkin Date: Mon Nov 29 19:09:01 2010 +0200 vhost test module This adds a test module for vhost infrastructure. Intentionally not tied to kbuild to prevent people from installing and loading it accidentally. Signed-off-by: Michael S. Tsirkin commit 28831ee60b79bed50958c9cb0d2e76cdc98406f9 Author: Michael S. Tsirkin Date: Mon Nov 29 10:22:10 2010 +0200 vhost: better variable name in logging We really store a page offset in write_address, so rename it write_page to avoid confusion. Signed-off-by: Jason Wang Signed-off-by: Michael S. Tsirkin commit b7ee1d01c5ff3bf2e51c8565ea00823cdbc2a9f3 Author: Sedat Dilek Date: Tue Dec 7 22:35:50 2010 +0100 ath5k: Fix modinfo does not list alias -> pci-id lines The AHB bus support patchset moved the table "Known PCI ids" from base.c to pci.c - unfortunately, MODULE_DEVICE_TABLE() was not transferred. With this fix 'modinfo ath5k' lists the alias -> pci-id lines, again. The issue was introduced by: commit e5b046d86fac609f636d127a38de94a175c7e83b "ath5k: Move PCI bus functions to separate file." Signed-off-by: Sedat Dilek Signed-off-by: John W. Linville commit 6a66bbd693c12f71697c61207aa18bc5a12da0ab Author: Chase Douglas Date: Wed Dec 8 15:08:04 2010 -0800 HID: magicmouse: Don't report REL_{X,Y} for Magic Trackpad With the recent switch to having the hid layer handle standard axis initialization, the Magic Trackpad now reports relative axes. This would be fine in the normal mode, but the driver puts the device in multitouch mode where no relative events are generated. Also, userspace software depends on accurate axis information for device type detection. Thus, ignoring the relative axes from the Magic Trackpad is best. Signed-off-by: Chase Douglas Signed-off-by: Jiri Kosina commit 3bf9be40ff76b6df136f14a497167c116b2b3c53 Author: Michael S. Tsirkin Date: Mon Nov 29 10:19:07 2010 +0200 vhost: correctly set bits of dirty pages Fix two bugs in dirty page logging: When counting pages we should increase address by 1 instead of VHOST_PAGE_SIZE. Make log_write() correctly process requests that cross pages with write_address not starting at page boundary. Reported-by: Jason Wang Signed-off-by: Michael S. Tsirkin commit a290aec88a9c4747353ea7aa9b2569bd61297c3c Author: Jason Wang Date: Mon Nov 29 13:48:40 2010 +0800 vhost: fix typos in comment Signed-off-by: Jason Wang Signed-off-by: Michael S. Tsirkin commit bf5e0bd27f7cbaca4d52ae395bbf3715775efebd Author: Michael S. Tsirkin Date: Sun Nov 14 17:33:25 2010 +0200 vhost: remove unused include vhost.c does not need to know about sockets, don't include sock.h Signed-off-by: Michael S. Tsirkin commit 9aefcab0de472ee2b3ab195a6827ddd4b170e3a7 Author: Thomas Gleixner Date: Tue Dec 7 12:48:47 2010 +0000 perf session: Consolidate the dump code The dump code used by perf report -D is scattered all over the place. Move it to separate functions. Acked-by: Ian Munsie Cc: Frederic Weisbecker Cc: Ian Munsie Cc: Ingo Molnar Cc: Peter Zijlstra LKML-Reference: <20101207124550.625434869@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit 79a14c1f458d598642bf11f09512c83d33a114e6 Author: Thomas Gleixner Date: Tue Dec 7 12:48:44 2010 +0000 perf session: Dont queue events w/o timestamps If the event has no timestamp assigned then the parse code sets it to ~0ULL which causes the ordering code to enqueue it at the end. Process it right away. Reported-by: Ian Munsie Cc: Frederic Weisbecker Cc: Ian Munsie Cc: Ingo Molnar Cc: Peter Zijlstra LKML-Reference: <20101207124550.528788441@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit 3835bc00c5b2d8e337a6e9d7b44f47e02760dba3 Author: Thomas Gleixner Date: Tue Dec 7 12:48:42 2010 +0000 perf event: Prevent unbound event__name array access event__name[] is missing an entry for PERF_RECORD_FINISHED_ROUND, but we happily access the array from the dump code. Make event__name[] static and provide an accessor function, fix up all callers and add the missing string. Cc: Frederic Weisbecker Cc: Ian Munsie Cc: Ingo Molnar Cc: Peter Zijlstra LKML-Reference: <20101207124550.432593943@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit b226a5a72901bc9c73d639ea2e53e6c304bf3b74 Author: David Ahern Date: Tue Dec 7 19:39:46 2010 -0700 perf report: Allow user to specify path to kallsyms file This is useful for analyzing a perf data file on a different system than the one data was collected on and still include symbols from loaded kernel modules in the output. Commiter note: Updated the man page accordingly. LKML-Reference: <1291775986-16475-1-git-send-email-daahern@cisco.com> Signed-off-by: David Ahern Signed-off-by: Arnaldo Carvalho de Melo commit 8c0a6bfef165ccdbf5d73afb9dd660107b0c98d5 Author: Chris Wilson Date: Thu Dec 9 12:56:37 2010 +0000 drm/i915/ringbuffer: Handle wrapping of the autoreported HEAD If the tail advances beyond the autoreport HEAD value, then we need to fallback to an uncached read of the HEAD register in order to ascertain the correct amount of remaining space in the ringbuffer. Reported-by: Fang, Xun Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=32259 Signed-off-by: Chris Wilson commit a0968628097380be52db8b4664da98fc425546a5 Author: Seungwhan Youn Date: Thu Dec 9 18:07:52 2010 +0900 ASoC: WM8580: Fix R8 initial value Acc to WM8580 manual, the default value for R8 is 0x10, not 0x1c. Signed-off-by: Seungwhan Youn Acked-by: Liam Girdwood Signed-off-by: Mark Brown Cc: stable@kernel.org commit 3f343f8512c7882a3637d9aea4ec6b3801cbcdc5 Author: Dmitry Artamonow Date: Wed Dec 8 23:36:17 2010 +0300 ASoC: fix deemphasis control in wm8904/55/60 codecs Deemphasis control's .get callback should update control's value instead of returning it - return value of callback function is used for indicating error or success of operation. Signed-off-by: Dmitry Artamonow Acked-by: Liam Girdwood Signed-off-by: Mark Brown Cc: stable@kernel.org commit 1b39ed0cf51193f3ba03044369ab4d144712a9b8 Author: Danny Huang Date: Wed Dec 1 13:37:31 2010 -0700 regulator: tps6586x: correct register table Correct the register table for SM2, LDO8, RTC Change-Id: I45348cec5ffbb7da9bd7523764fb611b537236b8 Signed-off-by: Danny Huang Signed-off-by: Olof Johansson Signed-off-by: Stephen Warren Acked-by: Mark Brown Signed-off-by: Liam Girdwood commit 1dbcf35cb5b775e564a793a338c7c3eb65fc6980 Author: Danny Huang Date: Wed Dec 1 13:37:30 2010 -0700 regulator: tps6586x: Handle both enable reg/bits being the same Change-Id: I40400bb65eab496bb1becd26b37a9653b99d4f41 Signed-off-by: Danny Huang Signed-off-by: Olof Johansson Signed-off-by: Stephen Warren Acked-by: Mark Brown (Split into separate patches) Signed-off-by: Liam Girdwood commit 64db657b5a45f1676d421e2bdfb7d4910dce87d3 Author: Danny Huang Date: Wed Dec 1 13:37:29 2010 -0700 regulator: tps6586x: Fix TPS6586X_DVM to store goreg/bit Change-Id: Idacf5e1e51dbbbcd5ea93f310a4e907977e7359e Signed-off-by: Danny Huang Signed-off-by: Olof Johansson Signed-off-by: Stephen Warren Acked-by: Mark Brown (Split into separate patches) (Minor formatting fixes) Signed-off-by: Liam Girdwood commit 4f58670709af7b890eceab325e9e470f209459ca Author: Danny Huang Date: Wed Dec 1 13:37:28 2010 -0700 regulator: tps6586x: Add missing bit mask generation Change-Id: I76eaceb31b56264f6978af15db1e6fc7e2e01b5a Signed-off-by: Danny Huang Signed-off-by: Olof Johansson Signed-off-by: Stephen Warren Acked-by: Mark Brown (Split into separate patches) Signed-off-by: Liam Girdwood commit 7c1a70e99819d723cde610d83de48a8ab01ec609 Author: Martin Persson Date: Wed Dec 8 15:13:42 2010 +0100 ux500: Add cpufreq support for u8500 Signed-off-by: Martin Persson Signed-off-by: Linus Walleij commit e0befb23dfed4d4d0de9d97dac936ccc0bbec093 Author: Martin Persson Date: Wed Dec 8 15:13:28 2010 +0100 ux500: Add prcmu support for operating points Adds support in PRCMU driver to handle CPU and APE operating points. Signed-off-by: Martin Persson Signed-off-by: Linus Walleij commit f3886f85cfde578f1d0ba6e40ac5f9d70043923b Author: Alex Deucher Date: Wed Dec 8 10:05:34 2010 -0500 drm/radeon/kms: don't apply 7xx HDP flush workaround on AGP It should be required for all 7xx asics, but seems to cause problems on some AGP 7xx chips. Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=19002 Signed-off-by: Alex Deucher Reported-and-Tested-by: Duncan <1i5t5.duncan@cox.net> Cc: stable@kernel.org Signed-off-by: Dave Airlie commit 6f331623b99e1900e3a664bbe6e95406ff4b27f4 Author: Dan Carpenter Date: Thu Dec 9 08:35:40 2010 +0300 drm: use after free in drm_queue_vblank_event() The "e" pointer is either NULL or freed when we call drm_vblank_put(dev, e->pipe) on the error path. Just pass the "pipe" variable directly instead. I changed another caller to use "pipe" as well for consistency. Signed-off-by: Dan Carpenter Signed-off-by: Dave Airlie commit d70ab7f7ee0692efc880d772dc5c212174d67e3b Merge: 58936b29c4c3e633a92bb918409fe1f0ca148144 2a7b1a00206895cfa444fd83477dca67a88a9d25 Author: Takashi Iwai Date: Thu Dec 9 08:24:32 2010 +0100 Merge branch 'fix/asoc' into for-linus commit 58936b29c4c3e633a92bb918409fe1f0ca148144 Merge: 2ff38c9fbaa86264ad819117ab137361067ab5f1 8a96b1e02029aa512199b1b6d281dcede9ed81f1 Author: Takashi Iwai Date: Thu Dec 9 08:24:25 2010 +0100 Merge branch 'fix/hda' into for-linus commit 8a96b1e02029aa512199b1b6d281dcede9ed81f1 Author: David Henningsson Date: Thu Dec 9 07:17:27 2010 +0100 ALSA: HDA: Quirk for Dell Vostro 320 to make microphone work BugLink: http://launchpad.net/497546 Confirmed that the ideapad model works better than the current quirk for Dell Vostro 320. Cc: stable@kernel.org (2.6.35+) Signed-off-by: David Henningsson Signed-off-by: Takashi Iwai commit e76116ca9671e2e5239054a40303b94feab585ad Author: Alex Deucher Date: Wed Dec 8 19:09:42 2010 -0500 drm/kms: remove spaces from connector names (v2) Grub doesn't parse spaces in parameters correctly, so this makes it impossible to force video= parameters for kms on the grub kernel command line. v2: shorten the names to make them easier to type. Reported-by: Sergej Pupykin Cc: Sergej Pupykin Signed-off-by: Alex Deucher Cc: stable@kernel.org Signed-off-by: Dave Airlie commit 589a594be1fb8815b3f18e517be696c48664f728 Author: NeilBrown Date: Thu Dec 9 17:02:14 2010 +1100 md: protect against NULL reference when waiting to start a raid10. When we fail to start a raid10 for some reason, we call md_unregister_thread to kill the thread that was created. Unfortunately md_thread() will then make one call into the handler (raid10d) even though md_wakeup_thread has not been called. This is not safe and as md_unregister_thread is called after mddev->private has been set to NULL, it will definitely cause a NULL dereference. So fix this at both ends: - md_thread should only call the handler if THREAD_WAKEUP has been set. - raid10 should call md_unregister_thread before setting things to NULL just like all the other raid modules do. This is applicable to 2.6.35 and later. Cc: stable@kernel.org Reported-by: "Citizen" Signed-off-by: NeilBrown commit 1a855a0606653d2d82506281e2c686bacb4b2f45 Author: NeilBrown Date: Thu Dec 9 16:36:28 2010 +1100 md: fix bug with re-adding of partially recovered device. With v0.90 metadata, a hot-spare does not become a full member of the array until recovery is complete. So if we re-add such a device to the array, we know that all of it is as up-to-date as the event count would suggest, and so it a bitmap-based recovery is possible. However with v1.x metadata, the hot-spare immediately becomes a full member of the array, but it record how much of the device has been recovered. If the array is stopped and re-assembled recovery starts from this point. When such a device is hot-added to an array we currently lose the 'how much is recovered' information and incorrectly included it as a full in-sync member (after bitmap-based fixup). This is wrong and unsafe and could corrupt data. So be more careful about setting saved_raid_disk - which is what guides the re-adding of devices back into an array. The new code matches the code in slot_store which does a similar thing, which is encouraging. This is suitable for any -stable kernel. Reported-by: "Dailey, Nate" Cc: stable@kernel.org Signed-off-by: NeilBrown commit a035fc3e2531703b539f23bec4ca7943cfc69349 Author: NeilBrown Date: Thu Dec 9 16:17:51 2010 +1100 md: fix possible deadlock in handling flush requests. As recorded in https://bugzilla.kernel.org/show_bug.cgi?id=24012 it is possible for a flush request through md to hang. This is due to an interaction between the recursion avoidance in generic_make_request, the insistence in md of only having one flush active at a time, and the possibility of dm (or md) submitting two flush requests to a device from the one generic_make_request. If a generic_make_request call into dm causes two flush requests to be queued (as happens if the dm table has two targets - they get one each), these two will be queued inside generic_make_request. Assume they are for the same md device. The first is processed and causes 1 or more flush requests to be sent to lower devices. These get queued within generic_make_request too. Then the second flush to the md device gets handled and it blocks waiting for the first flush to complete. But it won't complete until the two lower-device requests complete, and they haven't even been submitted yet as they are on the generic_make_request queue. The deadlock can be broken by using a separate thread to submit the requests to lower devices. md has such a thread readily available: md_wq. So use it to submit these requests. Reported-by: Giacomo Catenazzi Tested-by: Giacomo Catenazzi Signed-off-by: NeilBrown commit a7a07e69653acf8540daa1da053cd84bf86e8e66 Author: NeilBrown Date: Thu Dec 9 16:04:25 2010 +1100 md: move code in to submit_flushes. submit_flushes is called from exactly one place. Move the code that is before and after that call into submit_flushes. This has not functional change, but will make the next patch smaller and easier to follow. Signed-off-by: NeilBrown commit 2b74e12e567feb4163e32815bce0be57489e73b9 Author: NeilBrown Date: Thu Dec 9 15:59:01 2010 +1100 md: remove handling of flush_pending in md_submit_flush_data None of the functions called between setting flush_pending to 1, and atomic_dec_and_test can change flush_pending, or will anything running in any other thread (as ->flush_bio is not NULL). So the atomic_dec_and_test will always succeed. So remove the atomic_sec and the atomic_dec_and_test. Signed-off-by: NeilBrown commit 4e085e76cbe558b79b54cbab772f61185879bc64 Author: David S. Miller Date: Wed Dec 8 18:42:23 2010 -0800 econet: Fix crash in aun_incoming(). Unconditional use of skb->dev won't work here, try to fetch the econet device via skb_dst()->dev instead. Suggested by Eric Dumazet. Reported-by: Nelson Elhage Tested-by: Nelson Elhage Signed-off-by: David S. Miller commit 84b3cdc38cd2882d7ac3c2ae4b6faf5c199874e3 Author: David S. Miller Date: Wed Dec 8 18:41:03 2010 -0800 can: slcan: Add missing linux/sched.h include. drivers/net/can/slcan.c: In function 'slcan_open': drivers/net/can/slcan.c:568: error: dereferencing pointer to incomplete type Reported-by: Stephen Rothwell Signed-off-by: David S. Miller commit 7182afea8d1afd432a17c18162cc3fd441d0da93 Author: Dan Carpenter Date: Wed Oct 13 09:13:12 2010 +0000 IB/uverbs: Handle large number of entries in poll CQ In ib_uverbs_poll_cq() code there is a potential integer overflow if userspace passes in a large cmd.ne. The calls to kmalloc() would allocate smaller buffers than intended, leading to memory corruption. There iss also an information leak if resp wasn't all used. Unprivileged userspace may call this function, although only if an RDMA device that uses this function is present. Fix this by copying CQ entries one at a time, which avoids the allocation entirely, and also by moving this copying into a function that makes sure to initialize all memory copied to userspace. Special thanks to Jason Gunthorpe for his help and advice. Cc: Signed-off-by: Dan Carpenter [ Monkey around with things a bit to avoid bad code generation by gcc when designated initializers are used. - Roland ] Signed-off-by: Roland Dreier commit 38ef4c2e437d11b5922723504b62824e96761459 Author: Serge E. Hallyn Date: Wed Dec 8 15:19:01 2010 +0000 syslog: check cap_syslog when dmesg_restrict Eric Paris pointed out that it doesn't make sense to require both CAP_SYS_ADMIN and CAP_SYSLOG for certain syslog actions. So require CAP_SYSLOG, not CAP_SYS_ADMIN, when dmesg_restrict is set. (I'm also consolidating the now common error path) Signed-off-by: Serge E. Hallyn Acked-by: Eric Paris Acked-by: Kees Cook Signed-off-by: James Morris commit be3e5b32462790b91c14d5869fbabaf5bfe7c901 Author: Peter Huewe Date: Tue Dec 7 23:44:33 2010 +0100 staging/zram: Fix sparse warning 'Using plain integer as NULL pointer' This patch fixes the warning generated by sparse: "Using plain integer as NULL pointer" by replacing the offending 0s with NULL. Signed-off-by: Peter Huewe Signed-off-by: Greg Kroah-Hartman commit 597a1e7cccc9a5a0c47629267ac4b23bf8654578 Author: Peter Huewe Date: Tue Dec 7 23:38:02 2010 +0100 staging/line6: Fix sparse warning 'Using plain integer as NULL pointer' This patch fixes the warning generated by sparse: "Using plain integer as NULL pointer" by replacing the offending 0s with NULL. Signed-off-by: Peter Huewe Signed-off-by: Greg Kroah-Hartman commit fb657461abf6842b8f7603370ff349f42814ac5b Author: Henry Ptasinski Date: Wed Dec 8 13:18:04 2010 -0800 staging: brcm80211: fix documentation on installing firmware Fix the documentation to have the current firmware filenames and use the correct path. Signed-off-by: Henry Ptasinski Signed-off-by: Greg Kroah-Hartman commit 818c07b894df8c3a6399800bcc632569cbc1e70a Author: Henry Ptasinski Date: Wed Dec 8 13:09:49 2010 -0800 MAINTAINERS: update the entry for the BRCM80211 driver This time with Signed-off-by ... Removed Nohee, added Roland, Arend and Dowan. Changes were previously made to drivers/staging/brcm80211{README,TODO}, but MAINTAINERS was missed. Signed-off-by: Henry Ptasinski Signed-off-by: Greg Kroah-Hartman commit baffa2f609863b879703c4b757d63558b2caebdb Author: Roland Vossen Date: Wed Dec 8 20:16:02 2010 +0100 staging: brcm80211: removed unused struct wlc_ap_info Code cleanup, reaction on the email from Dan Carpenter. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit 08db27dc8d829e6df007cd079fdfa83584f66544 Author: Roland Vossen Date: Tue Dec 7 17:45:46 2010 +0100 staging: brcm80211: replaced typedef wlc_pub_t by struct wlc_pub Code cleanup Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit c41c858f695b6626e2fc0729edc0dd26b091f354 Author: Roland Vossen Date: Tue Dec 7 17:45:45 2010 +0100 staging: brcm80211: replaced typedef wlccore_t by struct wlccore Code cleanup Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit f077f7185ce19adc234b96c6f9fb815301770c26 Author: Roland Vossen Date: Tue Dec 7 17:45:44 2010 +0100 staging: brcm80211: replaced typedef wlcband_t by struct wlcband Code cleanup. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit 17d766510b9630cfa723a6711e314565a048c234 Author: Roland Vossen Date: Tue Dec 7 17:45:43 2010 +0100 staging: brcm80211: replaced typedef hnddma_t by struct hnddma_pub Code cleanup. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit 6cdeaef203155bd7f12d362e5345323cfecde58a Author: Roland Vossen Date: Tue Dec 7 17:45:42 2010 +0100 staging: brcm80211: replaced typedef wl_if_t by struct wl_if Code cleanup. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit d65ddb58325ba2c4fef70f6c9ff542df81e5cdb3 Author: Roland Vossen Date: Tue Dec 7 17:45:41 2010 +0100 staging: brcm80211: replaced typedef bmac_pmq_t by struct bmac_pmq Code cleanup. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit 299f8a4658e055d9f9713f7bed45860474544e68 Author: Roland Vossen Date: Tue Dec 7 17:45:40 2010 +0100 staging: brcm80211: replaced typedef antsel_info_t by struct antsel_info Code cleanup. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit 0e4934748948b5886c965fe56207b41d3abd58e7 Author: Roland Vossen Date: Tue Dec 7 17:45:39 2010 +0100 staging: brcm80211: replaced typedef wlc_ap_info_t by struct wlc_ap_info Code cleanup. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit 1f2fd4531d37553e4613f8f5e79cf199f47a82d2 Author: Roland Vossen Date: Tue Dec 7 17:45:38 2010 +0100 staging: brcm80211: replaced typedef ampdu_info_t by struct ampdu_info Code cleanup. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit 4dc79de1e39957575a784cf79bb214e54a42d44e Author: Roland Vossen Date: Tue Dec 7 17:45:37 2010 +0100 staging: brcm80211: replaced typedef wlc_if_t by struct wlc_if Code cleanup. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit 41224eb2dfe76fffc95cf9613c5bb2f4a518ddbf Author: Roland Vossen Date: Tue Dec 7 17:45:36 2010 +0100 staging: brcm80211: removed unused macro's and typedefs from wpa.h Code cleanup. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit 0dedc37070ba1eabb2d1c7aa7899c7a9100ecf30 Author: Roland Vossen Date: Tue Dec 7 17:45:35 2010 +0100 staging: brcm80211: removed unused typedefs Code cleanup. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit 1226056d9608d241db4b558a0d88a347ad5c66ae Author: Chen, Chien-Chia Date: Wed Dec 8 14:20:33 2010 -0800 Staging: rt3090: Fix RT3090 scan AP function Fix RT3090 scan AP function. This patch fixes the rt3090 wireless module failed to scan AP around due to Windows driver causing rt3090 module unable to scan AP in Linux. Acked-by: Lee, Chun-Yi Signed-off-by: Chen, Chien-Chia Cc: stable Signed-off-by: Greg Kroah-Hartman commit fe6c791570efe717946ea7b7dd50aec96b70d551 Merge: f8bf5681cf15f77692c8ad8cb95d059ff7c622c9 f19872575ff7819a3723154657a497d9bca66b33 Author: David S. Miller Date: Wed Dec 8 13:15:38 2010 -0800 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 Conflicts: drivers/net/wireless/ath/ath9k/ar9003_eeprom.c net/llc/af_llc.c commit 393934c6b5c8d00f9d1ae20670d4a770f07a418a Merge: 69f4aab1157d2a386e7ea4de77cc253629d1b4f2 0a54917c3fc295cb61f3fb52373c173fd3b69f48 Author: John W. Linville Date: Wed Dec 8 16:23:31 2010 -0500 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 Conflicts: drivers/net/wireless/ath/ath9k/ath9k.h drivers/net/wireless/ath/ath9k/main.c drivers/net/wireless/ath/ath9k/xmit.c commit 69f4aab1157d2a386e7ea4de77cc253629d1b4f2 Author: Luis R. Rodriguez Date: Tue Dec 7 15:13:23 2010 -0800 ath9k_hw: warn if we cannot change the power to the chip Suspend requires the device to be in fullsleep otherwise upon resume the device becomes unresponsive. We need to ensure that when we want the device to go to sleep it yields to the request, otherwise we'll have a useless devices upon resume. Warn when changing the power fails as we need to look into these issues. Cc: Paul Stewart Cc: Amod Bodas Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit ff9f0b639f33c92a89b0799263ab625444be6ee1 Author: Luis R. Rodriguez Date: Tue Dec 7 15:13:22 2010 -0800 ath9k: skip ATH9K_INT_TIM_TIMER when we are idle We should not be idle when we get the ATH9K_INT_TIM_TIMER, otherwise its a sign of something broken in our design with our idle state machine and mac80211. Skip these and WARN once just in case this is triggerable. Cc: Paul Stewart Cc: Amod Bodas signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit b7e8941b2df518186d9f7679c007f6b619bb4e89 Author: Amitkumar Karwar Date: Tue Dec 7 13:43:03 2010 -0800 cfg80211: add some element IDs in enum ieee80211_eid 1)WLAN_EID_BSS_COEX_2040 2)WLAN_EID_OVERLAP_BSS_SCAN_PARAM 3)WLAN_EID_EXT_CAPABILITY Signed-off-by: Amitkumar Karwar Signed-off-by: John W. Linville commit 692d2c0fb36c02ad07d54641c26f48e644b27fbd Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 7 21:56:00 2010 +0100 b43: rename config option for N-PHY, drop BROKEN Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 82a52043c7801f83c7387deb45bf9323af04644b Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 7 21:55:59 2010 +0100 b43: fix split of N-PHY devices into supported and not (based on PHY rev) Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit abc1f7cd531f80a8468ab654f1dfd35d58bd2490 Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 7 21:55:58 2010 +0100 b43: set TMS to work with current band width for N-PHY Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit c7455cf988f06ba578cc6a680392426fce382ca1 Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 7 21:55:57 2010 +0100 b43: N-PHY: silence warnings Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 2f886750118c1781d3b53268bf25519aef1d4d71 Author: Ben Greear Date: Tue Dec 7 11:27:01 2010 -0800 mac80211: Show max number of probe tries in debug message. Signed-off-by: Ben Greear Signed-off-by: John W. Linville commit 155180803c95c7b14b355f60431bef45116c151e Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 7 09:42:07 2010 +0100 b43: flush PHY writes when needed Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 755fd183b89bc8a302669b6f35cd98faee473f7a Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 7 09:42:06 2010 +0100 b43: N-PHY: implement own maskset This let us avoid double addressing while still having reg check. Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit f00fe7f6d14ab7bbd4655f55eae71bbd73ef766d Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 7 09:42:05 2010 +0100 b43: N-PHY: reorder and optimize tables initialization Order was changed in specs. For writing arrays we have designed bulk function which makes use of auto increment and do not write table address over and over. Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 857581bdf1a3b36bfd42609d6f5433bd83397127 Author: RafaÅ‚ MiÅ‚ecki Date: Tue Dec 7 09:42:04 2010 +0100 b43: N-PHY: update init tables Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit a9927ba3c5f3c5f6b0e8fa7557452335edeaf5fa Author: Ben Greear Date: Mon Dec 6 21:13:49 2010 -0800 ath9k: Check for NULL sta in ath_tx_start It can be NULL according to docs, and logging showed it to be NULL in practice. Signed-off-by: Ben Greear Signed-off-by: John W. Linville commit 80d7e403c97b712e302ec37e9beceff1dbdc9402 Author: Helmut Schaa Date: Fri Nov 19 12:40:26 2010 +0100 mac80211: Apply ht_opmode changes in ieee80211_change_bss Cc: Johannes Berg Signed-off-by: Helmut Schaa Signed-off-by: John W. Linville commit 50b12f597be354a5a224f05c65c54c0667e57aec Author: Helmut Schaa Date: Fri Nov 19 12:40:25 2010 +0100 cfg80211: Add new BSS attribute ht_opmode Add a new BSS attribute to allow hostapd to set the current HT opmode. Otherwise drivers won't be able to set up protection for HT rates in AP mode. Cc: Johannes Berg Signed-off-by: Helmut Schaa Signed-off-by: John W. Linville commit f19872575ff7819a3723154657a497d9bca66b33 Author: Eric Dumazet Date: Tue Dec 7 12:20:47 2010 +0000 tcp: protect sysctl_tcp_cookie_size reads Make sure sysctl_tcp_cookie_size is read once in tcp_cookie_size_check(), or we might return an illegal value to caller if sysctl_tcp_cookie_size is changed by another cpu. Signed-off-by: Eric Dumazet Cc: Ben Hutchings Cc: William Allen Simpson Signed-off-by: David S. Miller commit ad9f4f50fe9288bbe65b7dfd76d8820afac6a24c Author: Eric Dumazet Date: Tue Dec 7 12:03:55 2010 +0000 tcp: avoid a possible divide by zero sysctl_tcp_tso_win_divisor might be set to zero while one cpu runs in tcp_tso_should_defer(). Make sure we dont allow a divide by zero by reading sysctl_tcp_tso_win_divisor exactly once. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 0a54917c3fc295cb61f3fb52373c173fd3b69f48 Author: David Kilroy Date: Sun Dec 5 15:43:55 2010 +0000 orinoco: fix TKIP countermeasure behaviour Enable the port when disabling countermeasures, and disable it on enabling countermeasures. This bug causes the response of the system to certain attacks to be ineffective. It also prevents wpa_supplicant from getting scan results, as wpa_supplicant disables countermeasures on startup - preventing the hardware from scanning. wpa_supplicant works with ap_mode=2 despite this bug because the commit handler re-enables the port. The log tends to look like: State: DISCONNECTED -> SCANNING Starting AP scan for wildcard SSID Scan requested (ret=0) - scan timeout 5 seconds EAPOL: disable timer tick EAPOL: Supplicant port status: Unauthorized Scan timeout - try to get results Failed to get scan results Failed to get scan results - try scanning again Setting scan request: 1 sec 0 usec Starting AP scan for wildcard SSID Scan requested (ret=-1) - scan timeout 5 seconds Failed to initiate AP scan. Reported by: Giacomo Comes Signed-off by: David Kilroy Cc: stable@kernel.org Signed-off-by: John W. Linville commit ba34fcee476d11e7c9df95932787a22a96ff6e68 Author: David Kilroy Date: Sun Dec 5 15:45:58 2010 +0000 orinoco: clear countermeasure setting on commit ... and interface up. In these situations, you are usually trying to connect to a new AP, so keeping TKIP countermeasures active is confusing. This is already how the driver behaves (inadvertently). However, querying SIOCGIWAUTH may tell userspace that countermeasures are active when they aren't. Clear the setting so that the reporting matches what the driver has done.. Signed-off by: David Kilroy Cc: stable@kernel.org Signed-off-by: John W. Linville commit 7e2447075690860e2cea96b119fc9cadbaa7e83c Author: Helmut Schaa Date: Thu Dec 2 18:44:09 2010 +0100 mac80211: Fix BUG in pskb_expand_head when transmitting shared skbs mac80211 doesn't handle shared skbs correctly at the moment. As a result a possible resize can trigger a BUG in pskb_expand_head. [ 676.030000] Kernel bug detected[#1]: [ 676.030000] Cpu 0 [ 676.030000] $ 0 : 00000000 00000000 819662ff 00000002 [ 676.030000] $ 4 : 81966200 00000020 00000000 00000020 [ 676.030000] $ 8 : 819662e0 800043c0 00000002 00020000 [ 676.030000] $12 : 3b9aca00 00000000 00000000 00470000 [ 676.030000] $16 : 80ea2000 00000000 00000000 00000000 [ 676.030000] $20 : 818aa200 80ea2018 80ea2000 00000008 [ 676.030000] $24 : 00000002 800ace5c [ 676.030000] $28 : 8199a000 8199bd20 81938f88 80f180d4 [ 676.030000] Hi : 0000026e [ 676.030000] Lo : 0000757e [ 676.030000] epc : 801245e4 pskb_expand_head+0x44/0x1d8 [ 676.030000] Not tainted [ 676.030000] ra : 80f180d4 ieee80211_skb_resize+0xb0/0x114 [mac80211] [ 676.030000] Status: 1000a403 KERNEL EXL IE [ 676.030000] Cause : 10800024 [ 676.030000] PrId : 0001964c (MIPS 24Kc) [ 676.030000] Modules linked in: mac80211_hwsim rt2800lib rt2x00soc rt2x00pci rt2x00lib mac80211 crc_itu_t crc_ccitt cfg80211 compat arc4 aes_generic deflate ecb cbc [last unloaded: rt2800pci] [ 676.030000] Process kpktgend_0 (pid: 97, threadinfo=8199a000, task=81879f48, tls=00000000) [ 676.030000] Stack : ffffffff 00000000 00000000 00000014 00000004 80ea2000 00000000 00000000 [ 676.030000] 818aa200 80f180d4 ffffffff 0000000a 81879f78 81879f48 81879f48 00000018 [ 676.030000] 81966246 80ea2000 818432e0 80f1a420 80203050 81814d98 00000001 81879f48 [ 676.030000] 81879f48 00000018 81966246 818432e0 0000001a 8199bdd4 0000001c 80f1b72c [ 676.030000] 80203020 8001292c 80ef4aa2 7f10b55d 801ab5b8 81879f48 00000188 80005c90 [ 676.030000] ... [ 676.030000] Call Trace: [ 676.030000] [<801245e4>] pskb_expand_head+0x44/0x1d8 [ 676.030000] [<80f180d4>] ieee80211_skb_resize+0xb0/0x114 [mac80211] [ 676.030000] [<80f1a420>] ieee80211_xmit+0x150/0x22c [mac80211] [ 676.030000] [<80f1b72c>] ieee80211_subif_start_xmit+0x6f4/0x73c [mac80211] [ 676.030000] [<8014361c>] pktgen_thread_worker+0xfac/0x16f8 [ 676.030000] [<8002ebe8>] kthread+0x7c/0x88 [ 676.030000] [<80008e0c>] kernel_thread_helper+0x10/0x18 [ 676.030000] [ 676.030000] [ 676.030000] Code: 24020001 10620005 2502001f <0200000d> 0804917a 00000000 2502001f 00441023 00531021 Fix this by making a local copy of shared skbs prior to mangeling them. To avoid copying the skb unnecessarily move the skb_copy call below the checks that don't need write access to the skb. Also, move the assignment of nh_pos and h_pos below the skb_copy to point to the correct skb. It would be possible to avoid another resize of the copied skb by using skb_copy_expand instead of skb_copy but that would make the patch more complex. Also, shared skbs are a corner case right now, so the resize shouldn't matter much. Cc: Johannes Berg Signed-off-by: Helmut Schaa Cc: stable@kernel.org Signed-off-by: John W. Linville commit f933ebed7888a9a7d73ebeeb6bcbb3f710c423b4 Author: Sujith Manoharan Date: Wed Dec 1 12:30:27 2010 +0530 ath9k_htc: Fix suspend/resume The HW has to be set to FULLSLEEP mode during suspend, when no interface has been brought up. Not doing this would break resume, as the chip won't be powered up at all. Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit b93996cf67d47597efad03d5e5431c7b8b11e688 Author: Javier Cardona Date: Tue Dec 7 13:37:56 2010 -0800 ath5k: Put the right tsf value in mesh beacons Signed-off-by: Javier Cardona Signed-off-by: John W. Linville commit c26d5339424e68f8643cf3448986c4f77b941a65 Author: Javier Cardona Date: Tue Dec 7 13:36:55 2010 -0800 ath5k: Prevent mesh interfaces from being counted as ad-hoc This results in an erroneus num_adhoc_vifs count, as the this counter was incremented but not decremented for mesh interfaces. Signed-off-by: Javier Cardona Signed-off-by: John W. Linville commit d82b577b8cf89a17cab932db272769dfc69a98df Author: Javier Cardona Date: Tue Dec 7 13:35:55 2010 -0800 ath5k: Fix beaconing in mesh mode This patch fixes the oops below when attempting to bring up a mesh interface on ath5k hardware. [ 128.933099] kernel BUG at drivers/net/wireless/ath/ath5k/base.c:197! [ 128.933099] invalid opcode: 0000 [#1] (...) [ 128.933099] Call Trace: [ 128.933099] [] ? ath5k_beacon_update+0x57/0x1f8 [ath5k] [ 128.933099] [] ? __sysfs_add_one+0x28/0x76 [ 128.933099] [] ? ath5k_bss_info_changed+0x13f/0x173 [ath5k] [ 128.933099] [] ? ieee80211_config_beacon+0xc0/0x17e [mac80211] [ 128.933099] [] ? ieee80211_bss_info_change_notify+0x182/0x18b [mac80211] [ 128.933099] [] ? ath5k_bss_info_changed+0x0/0x173 [ath5k] [ 128.933099] [] ? ieee80211_config_beacon+0x16d/0x17e [mac80211] [ 128.933099] [] ? ieee80211_add_beacon+0x34/0x39 [mac80211] [ 128.933099] [] ? ieee80211s_init+0xf8/0x10f [mac80211] [ 128.933099] [] ? ieee80211_mesh_init_sdata+0xdb/0x154 [mac80211] Signed-off-by: Javier Cardona Signed-off-by: John W. Linville commit 229bd792be0bad245b78ed8f119952733a4752e5 Author: David Kilroy Date: Tue Dec 7 18:50:42 2010 +0000 orinoco: initialise priv->hw before assigning the interrupt The interrupt handler takes a lock - but since commit bcad6e80f3f this lock goes through an indirection specified in the hermes_t structure. We must therefore initialise the structure before setting up the interrupt handler. Fix orinoco_cs and spectrum_cs Bisected by: Matt Domsch Signed-off by: David Kilroy Cc: stable@kernel.org Signed-off-by: John W. Linville commit c7757fdb41dfcf6add9f8a4576eb85aa5e77a4eb Author: Breno Leitao Date: Wed Dec 8 12:19:14 2010 -0800 ehea: Fixing LRO configuration In order to set LRO on ehea, the user must set a module parameter, which is not the standard way to do so. This patch adds a way to set LRO using the ethtool tool. Signed-off-by: Breno Leitao Signed-off-by: David S. Miller commit 67631510a318d5a930055fe927607f483716e100 Author: Tom Herbert Date: Wed Dec 8 12:16:33 2010 -0800 tcp: Replace time wait bucket msg by counter Rather than printing the message to the log, use a mib counter to keep track of the count of occurences of time wait bucket overflow. Reduces spam in logs. Signed-off-by: Tom Herbert Signed-off-by: David S. Miller commit 171995e5d82dcc92bea37a7d2a2ecc21068a0f19 Author: Apollon Oikonomopoulos Date: Tue Dec 7 09:43:30 2010 +0000 x25: decrement netdev reference counts on unload x25 does not decrement the network device reference counts on module unload. Thus unregistering any pre-existing interface after unloading the x25 module hangs and results in unregister_netdevice: waiting for tap0 to become free. Usage count = 1 This patch decrements the reference counts of all interfaces in x25_link_free, the way it is already done in x25_link_device_down for NETDEV_DOWN events. Signed-off-by: Apollon Oikonomopoulos Signed-off-by: David S. Miller commit 408cc293c29ada769ae772420a39961320da1854 Author: Joe Jin Date: Mon Dec 6 03:00:59 2010 +0000 driver/net/benet: fix be_cmd_multicast_set() memcpy bug Regarding benet be_cmd_multicast_set() function, now using netdev_for_each_mc_addr() helper for mac address copy, but when copying to req->mac[] did not increase of the index. Cc: Sathya Perla Cc: Subbu Seetharaman Cc: Sarveshwar Bandi Cc: Ajit Khaparde Signed-off-by: Joe Jin Signed-off-by: David S. Miller commit e8d34a884e4ff118920bb57664def8a73b1b784f Author: Michal Marek Date: Mon Dec 6 02:39:12 2010 +0000 l2tp: Fix modalias of l2tp_ip Using the SOCK_DGRAM enum results in "net-pf-2-proto-SOCK_DGRAM-type-115", so use the numeric value like it is done in net/dccp. Signed-off-by: Michal Marek Signed-off-by: David S. Miller commit 0c62fc6dd02c8d793c75ae76a9b6881fc36388ad Author: Nelson Elhage Date: Wed Dec 8 10:13:55 2010 -0800 econet: Do the correct cleanup after an unprivileged SIOCSIFADDR. We need to drop the mutex and do a dev_put, so set an error code and break like the other paths, instead of returning directly. Signed-off-by: Nelson Elhage Signed-off-by: David S. Miller commit 083384755252cde25af187acf1807a0f5edb901f Merge: 35d9b0c906ad92d32a0b8db5daa6fabfcc2f068d e8f149924a3111015d16dfbbb4816cfc75ba53cd Author: David S. Miller Date: Wed Dec 8 12:13:23 2010 -0800 Merge branch 'sfc-2.6.37' of git://git.kernel.org/pub/scm/linux/kernel/git/bwh/sfc-2.6 commit 8316f33766a82907c694267ff911e45e256f09f9 Author: David Flynn Date: Wed Dec 8 16:10:21 2010 +0000 drm/i915/dp: Fix I2C/EDID handling with active DisplayPort to DVI converter The DisplayPort standard (1.1a) states that: The I2C-over-AUX Reply field is valid only when Native AUX CH Reply field is AUX_ACK (00). When Native AUX CH Reply field is not 00, then, I2C-over-AUX Reply field must be 00 and be ignored. This fixes broken EDID reading when using an active DisplayPort to duallink DVI converter. If the AUX CH replier chooses to defer the transaction, a short read occurs and erroneous data is returned as the i2c reply due to a lack of length checking and failure to check for AUX ACK. As a result, broken EDIDs can look like: 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 00: bc bc bc ff bc bc bc ff bc bc bc ac bc bc bc 45 ???.???.???????E 10: bc bc bc 10 bc bc bc 34 bc bc bc ee bc bc bc 4c ???????4???????L 20: bc bc bc 50 bc bc bc 00 bc bc bc 40 bc bc bc 00 ???P???.???@???. 30: bc bc bc 01 bc bc bc 01 bc bc bc a0 bc bc bc 40 ???????????????@ 40: bc bc bc 00 bc bc bc 00 bc bc bc 00 bc bc bc 55 ???.???.???.???U 50: bc bc bc 35 bc bc bc 31 bc bc bc 20 bc bc bc fc ???5???1??? ???? 60: bc bc bc 4c bc bc bc 34 bc bc bc 46 bc bc bc 00 ???L???4???F???. 70: bc bc bc 38 bc bc bc 11 bc bc bc 20 bc bc bc 20 ???8??????? ??? 80: bc bc bc ff bc bc bc ff bc bc bc ff bc bc bc ff ???.???.???.???. ... which can lead to: [drm:drm_edid_block_valid] *ERROR* EDID checksum is invalid, remainder [drm:drm_edid_block_valid] *ERROR* Raw EDID: <3>30 30 30 30 30 30 30 32 38 32 30 32 63 63 31 61 000000028202cc1a <3>28 00 02 8c 00 00 00 00 18 00 00 00 00 00 00 00 (............... <3>20 4c 61 73 74 20 62 65 61 63 6f 6e 3a 20 33 32 Last beacon: 32 <3>32 30 6d 73 20 61 67 6f 46 00 05 8c 00 00 00 00 20ms agoF....... <3>36 00 00 00 00 00 00 00 00 0c 57 69 2d 46 69 20 6.........Wi-Fi <3>52 6f 75 74 65 72 01 08 82 84 8b 96 24 30 48 6c Router......$0Hl <3>03 01 01 06 02 00 00 2a 01 00 2f 01 00 32 04 0c .......*../..2.. <3>12 18 60 dd 09 00 10 18 02 00 00 01 00 00 18 00 ..`............. Signed-off-by: David Flynn [ickle: fix up some surrounding checkpatch warnings] Signed-off-by: Chris Wilson Cc: stable@kernel.org commit c277443cfc29b1623b4923219ff0bdb48b91b589 Author: Peter Zijlstra Date: Wed Dec 8 15:29:02 2010 +0100 perf: Stop all counters on reboot Use the reboot notifier to detach all running counters on reboot, this solves a problem with kexec where the new kernel doesn't expect running counters (rightly so). It will however decrease the coverage of the NMI watchdog. Making a kexec specific reboot notifier callback would be best, however that would require touching all notifier callback handlers as they are not properly structured to deal with new state. As a compromise, place the perf reboot notifier at the very last position in the list. Reported-by: Yinghai Lu Signed-off-by: Peter Zijlstra Cc: Vivek Goyal Cc: Eric W. Biederman Cc: Jason Wessel Cc: Don Zickus LKML-Reference: Signed-off-by: Ingo Molnar commit c079c791c5a0627fc7b752d31d72e274e0596ba8 Author: Peter Zijlstra Date: Thu Nov 25 08:56:17 2010 +0100 perf, amd: Remove the nb lock Since all the hotplug stuff is serialized by the hotplug mutex, do away with the amd_nb_lock. Cc: Stephane Eranian Signed-off-by: Peter Zijlstra LKML-Reference: Signed-off-by: Ingo Molnar commit 40dc11ffb35e8c4e8fa71092048e0f8de9db758c Author: Eric Dumazet Date: Fri Nov 26 17:22:16 2010 +0100 printk: Use this_cpu_{read|write} api on printk_pending __get_cpu_var() is a bit inefficient, lets use __this_cpu_read() and __this_cpu_write() to manipulate printk_pending. printk_needs_cpu(cpu) is called only for the current cpu : Use faster __this_cpu_read(). Remove the redundant unlikely on (cpu_is_offline(cpu)) test: # size kernel/printk.o* text data bss dec hex filename 9942 756 263488 274186 42f0a kernel/printk.o.new 9990 756 263488 274234 42f3a kernel/printk.o.old Signed-off-by: Eric Dumazet Cc: Heiko Carstens Cc: H. Peter Anvin Cc: Christoph Lameter Signed-off-by: Peter Zijlstra LKML-Reference: <1290788536.2855.237.camel@edumazet-laptop> Signed-off-by: Ingo Molnar commit 806c09a7db457be3758e14b1f152761135d89af5 Author: Dario Faggioli Date: Tue Nov 30 19:51:33 2010 +0100 sched: Make pushable_tasks CONFIG_SMP dependant As noted by Peter Zijlstra at https://lkml.org/lkml/2010/11/10/391 (while reviewing other stuff, though), tracking pushable tasks only makes sense on SMP systems. Signed-off-by: Dario Faggioli Acked-by: Steven Rostedt Acked-by: Gregory Haskins Signed-off-by: Peter Zijlstra LKML-Reference: <1291143093.2697.298.camel@Palantir> Signed-off-by: Ingo Molnar commit 8e9255e6a2141e050d51bc4d96dbef494a87d653 Merge: 5091faa449ee0b7d73bc296a93bca9540fc51d0a 6313e3c21743cc88bb5bd8aa72948ee1e83937b6 Author: Ingo Molnar Date: Wed Dec 8 20:15:26 2010 +0100 Merge branch 'linus' into sched/core Merge reason: we want to queue up dependent cleanup Signed-off-by: Ingo Molnar commit dbd87b5af055a0cc9bba17795c9a2b0d17795389 Author: Heiko Carstens Date: Wed Dec 1 10:11:09 2010 +0100 nohz: Fix get_next_timer_interrupt() vs cpu hotplug This fixes a bug as seen on 2.6.32 based kernels where timers got enqueued on offline cpus. If a cpu goes offline it might still have pending timers. These will be migrated during CPU_DEAD handling after the cpu is offline. However while the cpu is going offline it will schedule the idle task which will then call tick_nohz_stop_sched_tick(). That function in turn will call get_next_timer_intterupt() to figure out if the tick of the cpu can be stopped or not. If it turns out that the next tick is just one jiffy off (delta_jiffies == 1) tick_nohz_stop_sched_tick() incorrectly assumes that the tick should not stop and takes an early exit and thus it won't update the load balancer cpu. Just afterwards the cpu will be killed and the load balancer cpu could be the offline cpu. On 2.6.32 based kernel get_nohz_load_balancer() gets called to decide on which cpu a timer should be enqueued (see __mod_timer()). Which leads to the possibility that timers get enqueued on an offline cpu. These will never expire and can cause a system hang. This has been observed 2.6.32 kernels. On current kernels __mod_timer() uses get_nohz_timer_target() which doesn't have that problem. However there might be other problems because of the too early exit tick_nohz_stop_sched_tick() in case a cpu goes offline. The easiest and probably safest fix seems to be to let get_next_timer_interrupt() just lie and let it say there isn't any pending timer if the current cpu is offline. I also thought of moving migrate_[hr]timers() from CPU_DEAD to CPU_DYING, but seeing that there already have been fixes at least in the hrtimer code in this area I'm afraid that this could add new subtle bugs. Signed-off-by: Heiko Carstens Signed-off-by: Peter Zijlstra LKML-Reference: <20101201091109.GA8984@osiris.boeblingen.de.ibm.com> Cc: stable@kernel.org Signed-off-by: Ingo Molnar commit f26f9aff6aaf67e9a430d16c266f91b13a5bff64 Author: Mike Galbraith Date: Wed Dec 8 11:05:42 2010 +0100 Sched: fix skip_clock_update optimization idle_balance() drops/retakes rq->lock, leaving the previous task vulnerable to set_tsk_need_resched(). Clear it after we return from balancing instead, and in setup_thread_stack() as well, so no successfully descheduled or never scheduled task has it set. Need resched confused the skip_clock_update logic, which assumes that the next call to update_rq_clock() will come nearly immediately after being set. Make the optimization robust against the waking a sleeper before it sucessfully deschedules case by checking that the current task has not been dequeued before setting the flag, since it is that useless clock update we're trying to save, and clear unconditionally in schedule() proper instead of conditionally in put_prev_task(). Signed-off-by: Mike Galbraith Reported-by: Bjoern B. Brandenburg Tested-by: Yong Zhang Signed-off-by: Peter Zijlstra Cc: stable@kernel.org LKML-Reference: <1291802742.1417.9.camel@marge.simson.net> Signed-off-by: Ingo Molnar commit 0f004f5a696a9434b7214d0d3cbd0525ee77d428 Author: Peter Zijlstra Date: Tue Nov 30 19:48:45 2010 +0100 sched: Cure more NO_HZ load average woes There's a long-running regression that proved difficult to fix and which is hitting certain people and is rather annoying in its effects. Damien reported that after 74f5187ac8 (sched: Cure load average vs NO_HZ woes) his load average is unnaturally high, he also noted that even with that patch reverted the load avgerage numbers are not correct. The problem is that the previous patch only solved half the NO_HZ problem, it addressed the part of going into NO_HZ mode, not of comming out of NO_HZ mode. This patch implements that missing half. When comming out of NO_HZ mode there are two important things to take care of: - Folding the pending idle delta into the global active count. - Correctly aging the averages for the idle-duration. So with this patch the NO_HZ interaction should be complete and behaviour between CONFIG_NO_HZ=[yn] should be equivalent. Furthermore, this patch slightly changes the load average computation by adding a rounding term to the fixed point multiplication. Reported-by: Damien Wyart Reported-by: Tim McGrath Tested-by: Damien Wyart Tested-by: Orion Poplawski Tested-by: Kyle McMartin Signed-off-by: Peter Zijlstra Cc: stable@kernel.org Cc: Chase Douglas LKML-Reference: <1291129145.32004.874.camel@laptop> Signed-off-by: Ingo Molnar commit 5167695753c63444a9e6cbbef136200a16c7a225 Author: Peter Zijlstra Date: Tue Dec 7 14:18:20 2010 +0100 perf: Fix duplicate events with multiple-pmu vs software events Because the multi-pmu bits can share contexts between struct pmu instances we could get duplicate events by iterating the pmu list. Signed-off-by: Peter Zijlstra Signed-off-by: Thomas Gleixner LKML-Reference: Signed-off-by: Ingo Molnar commit e726f3c368e7c1919a7166ec09c5705759f1a69d Author: Borislav Petkov Date: Mon Dec 6 16:20:25 2010 +0100 amd64_edac: Fix interleaving check When matching error address to the range contained by one memory node, we're in valid range when node interleaving 1. is disabled, or 2. enabled and when the address bits we interleave on match the interleave selector on this node (see the "Node Interleaving" section in the BKDG for an enlightening example). Thus, when we early-exit, we need to reverse the compound logic statement properly. Cc: Signed-off-by: Borislav Petkov commit 76f04f2591e60fa76e70a2736965bc810bf1c764 Author: Andrei Konovalov Date: Tue Dec 7 07:48:00 2010 -0500 EDAC: Correct MiB_TO_PAGES() macro This corrects the misprint introduced when moving '#if PAGE_SHIFT' from i7core_edac.c to edac_core.h (commit e9144601d364d5b81f3e63949337f8507eb58dca) Cc: Mauro Carvalho Chehab Signed-off-by: Andrei Konovalov Signed-off-by: Borislav Petkov commit bb31b3122c0dd07d2d958da17a50ad771ce79e2b Author: Borislav Petkov Date: Thu Dec 2 17:48:35 2010 +0100 EDAC: Fix workqueue-related crashes 00740c58541b6087d78418cebca1fcb86dc6077d changed edac_core to un-/register a workqueue item only if a lowlevel driver supplies a polling routine. Normally, when we remove a polling low-level driver, we go and cancel all the queued work. However, the workqueue unreg happens based on the ->op_state setting, and edac_mc_del_mc() sets this to OP_OFFLINE _before_ we cancel the work item, leading to NULL ptr oops on the workqueue list. Fix it by putting the unreg stuff in proper order. Cc: #36.x Reported-and-tested-by: Tobias Karnat LKML-Reference: <1291201307.3029.21.camel@Tobias-Karnat> Signed-off-by: Borislav Petkov commit f8bf5681cf15f77692c8ad8cb95d059ff7c622c9 Author: Namhyung Kim Date: Tue Dec 7 04:49:06 2010 +0000 isdn/hisax: fix compiler warning on hisax_pci_tbl Annotate hisax_pci_tbl as '__used' to fix following warning: CC drivers/isdn/hisax/config.o drivers/isdn/hisax/config.c:1920: warning: ‘hisax_pci_tbl’ defined but not used Signed-off-by: Namhyung Kim Signed-off-by: David S. Miller commit 545c988b2018a593f24d291b66776a0d08525acd Author: Suresh Jayaraman Date: Mon Dec 6 13:45:50 2010 +0530 cifs: remove bogus remapping of error in cifs_filldir() As the FIXME points out correctly, now filldir() itself returns -EOVERFLOW if it not possible to represent the inode number supplied by the filesystem in the field provided by userspace. Signed-off-by: Suresh Jayaraman Reviewed-by: Jeff Layton Signed-off-by: Steve French commit 920b8d913bd3d963d5c88bca160a272b71e0c95a Author: Changli Gao Date: Tue Dec 7 05:05:18 2010 +0000 af_packet: fix freeing pg_vec twice on error path It is introduced in: commit 0e3125c755445664f00ad036e4fc2cd32fd52877 Author: Neil Horman Date: Tue Nov 16 10:26:47 2010 -0800 packet: Enhance AF_PACKET implementation to not require high order contiguous memory allocation (v4) Signed-off-by: Changli Gao Signed-off-by: David S. Miller commit f6dafa95d1a48f73ab4a5b0f7dc0dcb72817e051 Author: Changli Gao Date: Tue Dec 7 04:26:16 2010 +0000 af_packet: eliminate pgv_to_page on some arches Some arches don't need flush_dcache_page(), and don't implement it, so we can eliminate pgv_to_page() calls on those arches. Signed-off-by: Changli Gao Signed-off-by: David S. Miller commit 15c2d75f49189e1769c5e8f5f099d03d055c4910 Author: Eric Dumazet Date: Tue Dec 7 00:30:37 2010 +0000 net: call dev_queue_xmit_nit() after skb_dst_drop() Avoid some atomic ops on dst refcount, calling dev_queue_xmit_nit() after skb_dst_drop() in dev_hard_start_xmit(). When queueing a packet into af_packet socket, we drop dst anyway. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 62ab0812137ec4f9884dd7de346238841ac03283 Author: Eric Dumazet Date: Mon Dec 6 20:50:09 2010 +0000 filter: constify sk_run_filter() sk_run_filter() doesnt write on skb, change its prototype to reflect this. Fix two af_packet comments. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 38f49e8801565674c424896c3dcb4228410b43a8 Author: Roger Luethi Date: Mon Dec 6 00:59:40 2010 +0000 via-rhine: hardware VLAN support This patch adds VLAN hardware support for Rhine chips. The driver uses up to 3 additional bytes of buffer space when extracting 802.1Q headers; PKT_BUF_SZ should still be sufficient. The initial code was provided by David Lv. I reworked it to use standard kernel facilities. Coding style clean up mostly follows via-velocity. Adapted to new interface for VLAN acceleration (per request of Jesse Gross). Signed-off-by: David Lv Signed-off-by: Roger Luethi drivers/net/via-rhine.c | 326 +++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 312 insertions(+), 14 deletions(-) Signed-off-by: David S. Miller commit 941666c2e3e0f9f6a1cb5808d02352d445bd702c Author: Eric Dumazet Date: Sun Dec 5 01:23:53 2010 +0000 net: RCU conversion of dev_getbyhwaddr() and arp_ioctl() Le dimanche 05 dĂ©cembre 2010 Ă  09:19 +0100, Eric Dumazet a Ă©crit : > Hmm.. > > If somebody can explain why RTNL is held in arp_ioctl() (and therefore > in arp_req_delete()), we might first remove RTNL use in arp_ioctl() so > that your patch can be applied. > > Right now it is not good, because RTNL wont be necessarly held when you > are going to call arp_invalidate() ? While doing this analysis, I found a refcount bug in llc, I'll send a patch for net-2.6 Meanwhile, here is the patch for net-next-2.6 Your patch then can be applied after mine. Thanks [PATCH] net: RCU conversion of dev_getbyhwaddr() and arp_ioctl() dev_getbyhwaddr() was called under RTNL. Rename it to dev_getbyhwaddr_rcu() and change all its caller to now use RCU locking instead of RTNL. Change arp_ioctl() to use RCU instead of RTNL locking. Note: this fix a dev refcount bug in llc Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit a2d4b65d477aad1fe8c7218781a031fa9cf5abfc Merge: 01b0c5cfb23f19837650aa53495ace6d0fd7d3f8 04910265078f08a73208beab70ed2a3cce4a919f Author: David S. Miller Date: Wed Dec 8 10:01:00 2010 -0800 Merge branch 'dccp' of git://eden-feed.erg.abdn.ac.uk/net-next-2.6 commit 35d9b0c906ad92d32a0b8db5daa6fabfcc2f068d Author: Eric Dumazet Date: Sun Dec 5 02:03:26 2010 +0000 llc: fix a device refcount imbalance Le dimanche 05 dĂ©cembre 2010 Ă  12:23 +0100, Eric Dumazet a Ă©crit : > Le dimanche 05 dĂ©cembre 2010 Ă  09:19 +0100, Eric Dumazet a Ă©crit : > > > Hmm.. > > > > If somebody can explain why RTNL is held in arp_ioctl() (and therefore > > in arp_req_delete()), we might first remove RTNL use in arp_ioctl() so > > that your patch can be applied. > > > > Right now it is not good, because RTNL wont be necessarly held when you > > are going to call arp_invalidate() ? > > While doing this analysis, I found a refcount bug in llc, I'll send a > patch for net-2.6 Oh well, of course I must first fix the bug in net-2.6, and wait David pull the fix in net-next-2.6 before sending this rcu conversion. Note: this patch should be sent to stable teams (2.6.34 and up) [PATCH net-2.6] llc: fix a device refcount imbalance commit abf9d537fea225 (llc: add support for SO_BINDTODEVICE) added one refcount imbalance in llc_ui_bind(), because dev_getbyhwaddr() doesnt take a reference on device, while dev_get_by_index() does. Fix this using RCU locking. And since an RCU conversion will be done for 2.6.38 for dev_getbyhwaddr(), put the rcu_read_lock/unlock exactly at their final place. Signed-off-by: Eric Dumazet Cc: stable@kernel.org Cc: Octavian Purdila Signed-off-by: David S. Miller commit 01b0c5cfb23f19837650aa53495ace6d0fd7d3f8 Author: Thiago Farina Date: Sat Dec 4 15:22:46 2010 +0000 net/9p/protocol.c: Remove duplicated macros. Use the macros already provided by kernel.h file. Signed-off-by: Thiago Farina Signed-off-by: David S. Miller commit 75c1c82566f23dd539fb7ccbf57a1caa7ba82628 Author: Changli Gao Date: Sat Dec 4 14:09:08 2010 +0000 ifb: goto resched directly if error happens and dp->tq isn't empty If we break the loop when there are still skbs in tq and no skb in rq, the skbs will be left in txq until new skbs are enqueued into rq. In rare cases, no new skb is queued, then these skbs will stay in rq forever. After this patch, if tq isn't empty when we break the loop, we goto resched directly. Signed-off-by: Changli Gao Signed-off-by: Jamal Hadi Salim Signed-off-by: David S. Miller commit aa9421041128abb4d269ee1dc502ff65fb3b7d69 Author: Changli Gao Date: Sat Dec 4 02:31:41 2010 +0000 net: init ingress queue The dev field of ingress queue is forgot to initialized, then NULL pointer dereference happens in qdisc_alloc(). Move inits of tx queues to netif_alloc_netdev_queues(). Signed-off-by: Changli Gao Acked-by: Eric Dumazet Signed-off-by: David S. Miller commit b1afde60f2b9ee8444fba4e012dc99a3b28d224d Author: Nandita Dukkipati Date: Fri Dec 3 13:33:44 2010 +0000 tcp: Bug fix in initialization of receive window. The bug has to do with boundary checks on the initial receive window. If the initial receive window falls between init_cwnd and the receive window specified by the user, the initial window is incorrectly brought down to init_cwnd. The correct behavior is to allow it to remain unchanged. Signed-off-by: Nandita Dukkipati Signed-off-by: David S. Miller commit ce9aeb583a1071304d0e4ab8db600bfc8a6a1b44 Author: Dimitris Michailidis Date: Fri Dec 3 10:39:04 2010 +0000 cxgb4: fix MAC address hash filter Fix the calculation of the inexact hash-based MAC address filter. It's 64 bits but current code is missing a ULL. Results in filtering out some legitimate packets. Signed-off-by: Dimitris Michailidis Signed-off-by: David S. Miller commit a1044e36e457fb6dbdf90ce756d578b251d99b5e Author: Oliver Hartkopp Date: Thu Dec 2 10:57:59 2010 +0000 can: add slcan driver for serial/USB-serial CAN adapters This patch adds support for serial/USB-serial CAN adapters implementing the LAWICEL ASCII protocol for CAN frame transport over serial lines. The driver implements the SLCAN line discipline and is heavily based on the slip.c driver. Therefore the code style remains similar to slip.c to be able to apply changes of the SLIP driver to the SLCAN driver easily. For more details see the slcan Kconfig entry. Signed-off-by: Oliver Hartkopp Signed-off-by: David S. Miller commit 58e481f66e31e9976558f3e4f709baf9201052fe Author: Andy Shevchenko Date: Thu Dec 2 02:45:08 2010 +0000 atm: lanai: use kernel's '%pM' format option to print MAC Signed-off-by: Andy Shevchenko Cc: Chas Williams Cc: linux-atm-general@lists.sourceforge.net Signed-off-by: David S. Miller commit c1ac3ffcd0bc7e9617f62be8c7043d53ab84deac Author: Neil Brown Date: Thu Dec 2 11:14:30 2010 +1100 nfsd: Fix possible BUG_ON firing in set_change_info If vfs_getattr in fill_post_wcc returns an error, we don't set fh_post_change. For NFSv4, this can result in set_change_info triggering a BUG_ON. i.e. fh_post_saved being zero isn't really a bug. So: - instead of BUGging when fh_post_saved is zero, just clear ->atomic. - if vfs_getattr fails in fill_post_wcc, take a copy of i_ctime anyway. This will be used i seg_change_info, but not overly trusted. - While we are there, remove the pointless 'if' statements in set_change_info. There is no harm setting all the values. Signed-off-by: NeilBrown Cc: stable@kernel.org Signed-off-by: J. Bruce Fields commit e83293233faf6e49870e7bfdcddf5374cb463d54 Author: Kim Lilliestierna XX Date: Tue Nov 30 09:11:22 2010 +0000 CAIF: Fix U5500 compile error for shared memory driver Rearrange pr_fmt so it compiles. Signed-off-by: Sjur Braendeland Signed-off-by: David S. Miller commit 4f58605e6b7ae30a0d048af6a868582768e6754c Merge: b8eb3a1046f68a5b8f284830d971c62688cd606b d89197c7f34934fbb0f96d938a0d6cfe0b8bcb1c Author: David S. Miller Date: Wed Dec 8 08:13:01 2010 -0800 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 commit 73c1160ce377d8fc6d84cb630ebf9658808bec49 Author: Andre Przywara Date: Wed Dec 1 12:17:44 2010 +0100 KVM: enlarge number of possible CPUID leaves Currently the number of CPUID leaves KVM handles is limited to 40. My desktop machine (AthlonII) already has 35 and future CPUs will expand this well beyond the limit. Extend the limit to 80 to make room for future processors. KVM-Stable-Tag. Signed-off-by: Andre Przywara Signed-off-by: Avi Kivity commit 24d1b15f72abe3465e871d11cfc9dc34d1aab8b2 Author: Joerg Roedel Date: Tue Dec 7 17:15:05 2010 +0100 KVM: SVM: Do not report xsave in supported cpuid To support xsave properly for the guest the SVM module need software support for it. As long as this is not present do not report the xsave as supported feature in cpuid. As a side-effect this patch moves the bit() helper function into the x86.h file so that it can be used in svm.c too. KVM-Stable-Tag. Signed-off-by: Joerg Roedel Signed-off-by: Avi Kivity commit 3ea3aa8cf67d3bbe00a19b6a4013d19efa7d0f41 Author: Sheng Yang Date: Wed Dec 8 10:49:43 2010 +0800 KVM: Fix OSXSAVE after migration CPUID's OSXSAVE is a mirror of CR4.OSXSAVE bit. We need to update the CPUID after migration. KVM-Stable-Tag. Signed-off-by: Sheng Yang Signed-off-by: Avi Kivity commit 8b0f1840a46449e1946fc88860ef3ec8d6b1c2c7 Author: Gabriele Gorla Date: Wed Dec 8 16:27:22 2010 +0100 hwmon: (adm1026) Allow 1 as a valid divider value Allow 1 as a valid div value as specified in the ADM1026 datasheet. Signed-off-by: Gabriele Gorla Cc: stable@kernel.org Signed-off-by: Jean Delvare commit 52bc9802ce849d0d287cc5fe76d06b0daa3986ca Author: Gabriele Gorla Date: Wed Dec 8 16:27:22 2010 +0100 hwmon: (adm1026) Fix setting fan_div Prevent setting fan_div from stomping on other fans that share the same I2C register. Signed-off-by: Gabriele Gorla Cc: stable@kernel.org Signed-off-by: Jean Delvare commit 6229cdb23648d0c2875b3fb102cdaf4bf08fcfa4 Author: Jean Delvare Date: Wed Dec 8 16:27:22 2010 +0100 hwmon: (it87) Fix manual fan speed control on IT8721F The manual fan speed control logic of the IT8721F is much different from what older devices had. Update the code to properly support that. Signed-off-by: Jean Delvare Acked-by: Guenter Roeck commit d9319560b86839506c2011346b1f2e61438a3c73 Author: Jun Nie Date: Tue Dec 7 14:03:38 2010 +0800 Bluetooth: add NULL pointer check in HCI If we fail to find a hci device pointer in hci_uart, don't try to deref the NULL one we do have. Signed-off-by: Jun Nie Signed-off-by: Gustavo F. Padovan commit 6313e3c21743cc88bb5bd8aa72948ee1e83937b6 Merge: 6dde39be39e636c1d41e73590668d5903b11535b e7a3481c0246c8e45e79c629efd63b168e91fcda 18483b81ee7e70ee68d4b18be618be5cfcc0b290 61ab25447ad6334a74e32f60efb135a3467223f8 Author: Linus Torvalds Date: Wed Dec 8 06:40:59 2010 -0800 Merge branches 'x86-fixes-for-linus', 'perf-fixes-for-linus' and 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86/pvclock: Zero last_value on resume * 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: perf record: Fix eternal wait for stillborn child perf header: Don't assume there's no attr info if no sample ids is provided perf symbols: Figure out start address of kernel map from kallsyms perf symbols: Fix kallsyms kernel/module map splitting * 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: nohz: Fix printk_needs_cpu() return value on offline cpus printk: Fix wake_up_klogd() vs cpu hotplug commit 6dde39be39e636c1d41e73590668d5903b11535b Merge: f8f5d4f11dc7d321fb372b09fc8767069a18bf30 599bbb9de0fe9c494a223a34d790b353ad4d69f8 Author: Linus Torvalds Date: Wed Dec 8 06:34:39 2010 -0800 Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 * 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: drm/i915: i915 cannot provide switcher services. drm/radeon/kms: fix vram base calculation on rs780/rs880 drm/radeon/kms: fix formatting of vram and gtt info drm/radeon/kms: forbid big bo allocation (fdo 31708) v3 drm: Don't try and disable an encoder that was never enabled drm: Add missing drm_vblank_put() along queue vblank error path drm/i915/dp: Only apply the workaround if the select is still active drm/i915: Emit a request to clear a flushed and idle ring for unbusy bo drm/i915/lvds: Always restore panel-fitter when enabling the LVDS drm/i915/ringbuffer: Only print an error on the second attempt to reset head drm/i915: announce to userspace that the bsd ring is coherent agp/intel: Fix wrong kunmap in i830_cleanup() drm/i915: Factor in pixel-repeat in FDI M/N calculation drm/i915: Death to the unnecessary 64bit divide drm/i915: Clean conflicting modesetting registers upon init drm/i915: Apply a workaround for transitioning from DP on pipe B to HDMI. drm/i915: Always set the DP transcoder config to 8BPC. commit f8f5d4f11dc7d321fb372b09fc8767069a18bf30 Merge: 2cedcc4f122934c3ad38dfb2a400b98a62703e6d 47d092352c132a2d0ee4156b5dca263eaad2c17f Author: Linus Torvalds Date: Wed Dec 8 06:34:02 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: wacom - add new Bamboo PT (0xdb) Input: add input driver for polled GPIO buttons Input: turbografx - fix reference counting Input: synaptics - fix handling of 2-button ClickPads Input: wacom - add IDs for two new Bamboo PTs Input: document struct input_absinfo Input: add keycodes for touchpad on/off keys Input: usbtouchscreen - add support for LG Flatron T1710B commit 28257f7fdee0facc3b7f934e82c2485f27120d41 Author: Russell King Date: Wed Dec 8 13:57:48 2010 +0000 ARM: io: simplify ioremap* and iounmap definitions We don't need to repeat the same definitions of the ioremap*(), once in terms of __arch_ioremap() and again in terms of __arm_ioremap(). Instead, if the platform hasn't provided an __arch_ioremap, define this to be __arm_ioremap, and only define the ioremap*() set using __arch_ioremap. Signed-off-by: Russell King commit a0b7bd0829194c03921915a68ee4a331ee394223 Author: Russell King Date: Wed Dec 8 13:49:04 2010 +0000 ARM: io: make iounmap() a simple macro Defining iounmap() with arguments prevents it from being used as a function pointer, causing platforms to work around this. Instead, define it to be a simple macro. Do the same for __arch_io(re|un)map too. Signed-off-by: Russell King commit 5bea7660bba973dc5e8e9d92b11fb1dd5b524ebf Author: Dmitry Torokhov Date: Tue Dec 7 23:02:48 2010 -0800 HID: add hid_hw_open/close/power() handlers Instead of exposing the guts of hid->ll_driver relationship to HID sub-drivers provide these helpers to encapsulate the details. Signed-off-by: Dmitry Torokhov Signed-off-by: Jiri Kosina commit 20e218a77fc0b0576817b6b204fe5b9391a5b209 Author: Rabin Vincent Date: Wed Dec 8 17:18:46 2010 +0530 ux500: fix 5500 PER6 clock rate The DB5500 PER6 clock rate is the same as the DB8500 one, i.e. 133.33 MHz. Signed-off-by: Rabin Vincent Signed-off-by: Linus Walleij commit 22039b7cc54a636f80434e9b149fcdec148c4cb9 Author: Rabin Vincent Date: Wed Dec 8 11:07:56 2010 +0530 ux500: remove ambiguous irq macros Remove the irq number macros which don't specify which SoC they're for. Signed-off-by: Rabin Vincent Signed-off-by: Linus Walleij commit 01afdd1353ca83904f430be4f6202d1a20912f4d Author: Rabin Vincent Date: Wed Dec 8 11:07:55 2010 +0530 ux500: rework gpio registration Rework gpio registration to remove build-time changing macros. Signed-off-by: Rabin Vincent Signed-off-by: Linus Walleij commit 8d568ae5362c00c5b0b8e61bceb1829c8051002e Author: Rabin Vincent Date: Wed Dec 8 11:07:54 2010 +0530 nomadik-gpio: use dev name if no name is specified Platforms may choose not to provide an additional name for the GPIO block. Signed-off-by: Rabin Vincent Signed-off-by: Linus Walleij commit ec4a637d35d4e05d1f43a68d647fb2453891379a Author: Carl-Johan Irekvist Date: Wed Dec 8 11:07:53 2010 +0530 ux500: fix uncompressor UART address for U5500 The uncompress code for zImage uses the UART to print status messages, this was hard coded to use UART2 for the U8500 platform. This patch checks at run time which platform it is run on. U5500 uses UART0 as console UART. Signed-off-by: Carl-Johan Irekvist Signed-off-by: Rabin Vincent Signed-off-by: Linus Walleij commit e8b1cc3a341684dfc02fd02f52308752b031668c Author: Per Forlin Date: Sun Dec 5 13:35:12 2010 +0100 ux500: Add DMA support for U5500 Add basic DMA configuration for u5500 supporting memcpy. Make way for SDI0 dma support by setting SDI0 to -1, indicating it will be configured in runtime. Signed-off-by: Per Forlin Signed-off-by: Linus Walleij commit bab263e0ce624b05bdcf568e83a9ca4ce71f5e3d Author: Per Forlin Date: Sun Dec 5 12:49:03 2010 +0100 ux500: Add eMMC support in U5500. U5500 now boots from sdi0 (onboard eMMC). Change machine type to U5500. Adjust uart and sdi0 clock rates for u5500. All necessary clocks must be enabled before Linux starts because there is no clock tree support in u5500 yet. Signed-off-by: Per Forlin Signed-off-by: Linus Walleij commit 9b04f8b9070e60fe9d335613ec538223c159a5c9 Author: Per Forlin Date: Sun Dec 5 12:27:05 2010 +0100 ux500: Call prmcu_init only for u8500 PRCMU driver only supports u8500. Don't initialize prcmu if running on u5500. Signed-off-by: Per Forlin Signed-off-by: Linus Walleij commit 592b2f254d68b6eb8665658cc7d8fc3cd61ebc94 Author: Sundar Iyer Date: Fri Dec 3 20:35:52 2010 +0530 mach-ux500: clean up checkpatch spits Signed-off-by: Sundar Iyer Signed-off-by: Linus Walleij commit f306954c9b69aa21bd26724c59ac8c98b7d6e003 Author: Sundar Iyer Date: Fri Dec 3 20:35:51 2010 +0530 mach-ux500: explicit enable MTU TCR in the kernel PRCM_TCR enables the various timers in the system. This must be achieved before any of the MTUs are usable for kernel usage. Explicit enabling of this in the kernel makes it independent of bootloader actions. Signed-off-by: Sundar Iyer Signed-off-by: Linus Walleij commit dacdc96cd33dee876c704aaed78f41515abe8a81 Author: Rabin Vincent Date: Fri Dec 3 20:35:37 2010 +0530 nomadik-gpio: allow sleep mode dir/pull to differ from normal mode In the nomadik GPIO pin configuration, allow the sleep mode direction and pull configurations to differ from the ones for the normal state. PIN_SLPM_PULL_*, PIN_SLPM_INPUT, PIN_SLPM_OUTPUT* macros are provided for this. Since the hardware does not allow seperate configurations for sleep mode and normal mode, this is implemented by having software remux the configurations as necessary. Reviewed-by: Srinidhi KASAGAR Signed-off-by: Rabin Vincent Signed-off-by: Mian Yousaf Kaukab Signed-off-by: Linus Walleij commit edaa86a4142474c99e4741efb6a916067978a1ee Author: Linus Walleij Date: Thu Dec 2 12:05:18 2010 +0100 ux500: minor revision to the eMMC/SD config A small fixup for the v1(.0) ASIC. Signed-off-by: Linus Walleij commit a5de3dc240eb4e58f02b199ed529c17b65f9adfb Author: Mattias Wallin Date: Thu Dec 2 13:46:00 2010 +0100 mach-ux500: AB8500 irqs is taken from header file This patch removes the dublicated define for number of interrupts and instead include the needed header file. Signed-off-by: Mattias Wallin Signed-off-by: Linus Walleij commit fcbd458e95316fe5031f1b8eaf5e66ce8f3c3146 Author: Mattias Wallin Date: Thu Dec 2 16:20:42 2010 +0100 ARM: ux500: prcmu db8500 v2 support This patch adds support for db8500 chip version 2. The TCDM memory address of the PRCMU is changed and dynamic detection of that is added. Signed-off-by: Mattias Wallin Acked-by: Linus Walleij commit fbf1eadf950da1f5f5ed2e454d2f191f90fe1ebe Author: Rabin Vincent Date: Wed Sep 29 19:46:32 2010 +0530 ux500: rework device registration Change the Ux500 devices to be dynamically allocated and added by calling functions instead of referencing structures, thereby allowing 5500 and other derivatives' support to be added without having to duplicate structures, use fixup functions, or use compile-time macros. Signed-off-by: Rabin Vincent Signed-off-by: Linus Walleij commit 1bde668c8afa279d81b8f26b2120b906f38f7822 Author: Linus Walleij Date: Thu Sep 9 22:29:34 2010 +0200 ux500: use _cansleep GPIO functions Similar to the patch to MMCI this silences similar messages from the platform code. Signed-off-by: Linus Walleij commit b8410a150fbc4e61a28032637dc0ae7e8609131d Author: Rabin Vincent Date: Mon Aug 9 19:18:17 2010 +0530 ux500: mop500: add TC35892 and MicroSD slot support Acked-by: Linus Walleij Signed-off-by: Rabin Vincent Signed-off-by: Linus Walleij commit 0bbaee3a58c379c4f7bab9635c71d7bad9c422a2 Author: Anssi Hannula Date: Tue Dec 7 21:19:23 2010 +0200 ALSA: hda - Reset sample sizes and max bitrates when reading ELD When a new HDMI/DP device is plugged in, hdmi_update_short_audio_desc() is called for every SAD (Short Audio Descriptor) in the ELD data. For LPCM coding type SAD defines the supported sample sizes. For several other coding types (such as AC-3), a maximum bitrate is defined. The maximum bitrate and sample size fields are not always cleared. Therefore, if a device is unplugged and a different one is plugged in, and the coding types of some SAD positions differ between the devices, the old max_bitrate or sample_bits values will persist if the new SADs do not define those values. The leftover max_bitrate and sample_bits do not cause any issues other than wrongly showing up in eld#X.Y procfs file and kernel log. Fix that by always clearing sample_bits and max_bitrate when reading SADs. Signed-off-by: Anssi Hannula Signed-off-by: Takashi Iwai commit 80f1dc7cc9341b160beb9c833edc1cd131f45a7f Author: Tony SIM Date: Tue Dec 7 09:12:14 2010 +0000 ARM: mach-shmobile: mackerel: Add Accelerometer sensor support Signed-off-by: Tony SIM Signed-off-by: Paul Mundt commit 356c6f654d1c03e2ae45ef58b267e83dfd1a17f2 Author: Dmitry Torokhov Date: Tue Dec 7 22:11:09 2010 -0800 Input: cma3000_d0x_i2c - add MODULE_DEVICE_TABLE This should allow loading this module automatically on systems that have such device. Signed-off-by: Dmitry Torokhov commit 599bbb9de0fe9c494a223a34d790b353ad4d69f8 Author: Dave Airlie Date: Mon Dec 6 12:42:46 2010 +1000 drm/i915: i915 cannot provide switcher services. it has a DSM but the switcher is done via WMI. Signed-off-by: Dave Airlie commit b8a3d6bcbc85d7636d9f2adede8479ce2999c232 Author: Tony SIM Date: Tue Dec 7 02:54:00 2010 -0800 Input: tca6416-keypad - add support for tca6408a Support 8-bit tca6408a I/O expander as a keypad. Signed-off-by: Tony SIM Signed-off-by: Dmitry Torokhov commit 47d092352c132a2d0ee4156b5dca263eaad2c17f Author: David Foley Date: Tue Dec 7 21:05:59 2010 -0800 Input: wacom - add new Bamboo PT (0xdb) Adds new Bamboo Pen & Touch model - Bamboo P & T Special Edition Medium (CTH661/L; Product ID = 0xdb). Tested-by: Tobias Verbeke Signed-off-by: David Foley Acked-by: Ping Cheng Signed-off-by: Dmitry Torokhov commit 2df485a774ba59c3f43bfe84107672c1d9b731a0 Author: Trond Myklebust Date: Tue Dec 7 22:39:17 2010 -0500 nfs: remove extraneous and problematic calls to nfs_clear_request When a nfs_page is freed, nfs_free_request is called which also calls nfs_clear_request to clean out the lock and open contexts and free the pagecache page. However, a couple of places in the nfs code call nfs_clear_request themselves. What happens here if the refcount on the request is still high? We'll be releasing contexts and freeing pointers while the request is possibly still in use. Remove those bare calls to nfs_clear_context. That should only be done when the request is being freed. Note that when doing this, we need to watch out for tests of req->wb_page. Previously, nfs_set_page_tag_locked() and nfs_clear_page_tag_locked() would check the value of req->wb_page to figure out if the page is mapped into the nfsi->nfs_page_tree. We now indicate the page is mapped using the new bit PG_MAPPED in req->wb_flags . Reported-by: Jeff Layton Signed-off-by: Trond Myklebust commit e281f7ec95fbbf905c10e11c83231f3d9090c22f Author: Aaro Koskinen Date: Tue Nov 30 14:17:58 2010 +0000 arm: omap2: io: fix clk_get() error check clk_get() return value should be checked with IS_ERR(). Signed-off-by: Aaro Koskinen Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit ed2849d3ecfa339435818eeff28f6c3424300cec Author: NeilBrown Date: Tue Nov 16 16:55:19 2010 +1100 sunrpc: prevent use-after-free on clearing XPT_BUSY When an xprt is created, it has a refcount of 1, and XPT_BUSY is set. The refcount is *not* owned by the thread that created the xprt (as is clear from the fact that creators never put the reference). Rather, it is owned by the absence of XPT_DEAD. Once XPT_DEAD is set, (And XPT_BUSY is clear) that initial reference is dropped and the xprt can be freed. So when a creator clears XPT_BUSY it is dropping its only reference and so must not touch the xprt again. However svc_recv, after calling ->xpo_accept (and so getting an XPT_BUSY reference on a new xprt), calls svc_xprt_recieved. This clears XPT_BUSY and then svc_xprt_enqueue - this last without owning a reference. This is dangerous and has been seen to leave svc_xprt_enqueue working with an xprt containing garbage. So we need to hold an extra counted reference over that call to svc_xprt_received. For safety, any time we clear XPT_BUSY and then use the xprt again, we first get a reference, and the put it again afterwards. Note that svc_close_all does not need this extra protection as there are no threads running, and the final free can only be called asynchronously from such a thread. Signed-off-by: NeilBrown Cc: stable@kernel.org Signed-off-by: J. Bruce Fields commit 2cedcc4f122934c3ad38dfb2a400b98a62703e6d Merge: 6142e05f30b101adeafb0d12e35983f44f68233e 812c4e40c27b6ea103ecfbf91d43654356629b81 Author: Linus Torvalds Date: Tue Dec 7 17:13:50 2010 -0800 Merge branch 'fixes/2637-rc5/s3c24xx' of git://git.fluff.org/bjdooks/linux * 'fixes/2637-rc5/s3c24xx' of git://git.fluff.org/bjdooks/linux: ARM: S3C24XX: Fix mess with gpio {set,get}_pull callbacks ARM: mini2440: Fix Kconfig to allow kernel to build ARM: S3C2412: Fix typo in CONFIG_CPU_S3C2412_ONLY definition ARM: S3C2443: Select properly ARM core type ARM: SMDK2416: Select MACH_SMDK, S3C_DEV_NAND, S3C_DEV_USB_HOST commit 812c4e40c27b6ea103ecfbf91d43654356629b81 Author: Vasily Khoruzhick Date: Wed Dec 1 08:29:23 2010 +0200 ARM: S3C24XX: Fix mess with gpio {set,get}_pull callbacks Currently the {set,get}_pull callbacks of the s3c24xx_gpiocfg_default structure are initalized via s3c_gpio_{get,set}pull_1up. This results in a linker error when only CONFIG_CPU_S3C2442 is selected: arch/arm/plat-s3c24xx/built-in.o:(.data+0x13f4): undefined reference to `s3c_gpio_getpull_1up' arch/arm/plat-s3c24xx/built-in.o:(.data+0x13f8): undefined reference to `s3c_gpio_setpull_1up' The s3c2442 has pulldowns instead of pullups compared to the s3c2440. The method of controlling them is the same though. So this patch modifies the existing s3c_gpio_{get,set}pull_1up helper functions to take an additional parameter deciding whether the pin has a pullup or pulldown. The s3c_gpio_{get,set}pull_1{down,up} functions then wrap that functions passing either S3C_GPIO_PULL_UP or S3C_GPIO_PULL_DOWN. Furthermore this patch sets up the s3c24xx_gpiocfg_default.{get,set}_pull fields in the s3c244{0,2}_map_io function to the new pulldown helper functions. Based on patch from "Lars-Peter Clausen" Signed-off-by: Vasily Khoruzhick Signed-off-by: Ben Dooks commit a40c406cbdd28dcca3483065bc2ba794cf5aaab7 Author: Johan Hedberg Date: Wed Dec 8 00:21:07 2010 +0200 Bluetooth: Make hci_send_to_sock usable for management control sockets In order to send data to management control sockets the function should: - skip checks intended for raw HCI data and stack internal events - make sure RAW HCI data or stack internal events don't go to management control sockets In order to accomplish this the patch adds a new member to the bluetooth skb private data to flag skb's that are destined for management control sockets. Signed-off-by: Johan Hedberg Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit 0381101fd6a73c7d6b545044dc1472d019fc64e3 Author: Johan Hedberg Date: Wed Dec 8 00:21:06 2010 +0200 Bluetooth: Add initial Bluetooth Management interface callbacks Add initial code for handling Bluetooth Management interface messages. Signed-off-by: Johan Hedberg Acked-by: Marcel Holtmann Acked-by: Andrei Emeltchenko Signed-off-by: Gustavo F. Padovan commit c02178d22b3ef2d18c38c96151600ee1c7ed94f0 Author: Johan Hedberg Date: Wed Dec 8 00:21:05 2010 +0200 Bluetooth: Add Bluetooth Management interface definitions Add initial definitions for the new Bluetooth Management interface to the bluetooth headers. Signed-off-by: Johan Hedberg Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit 0de1b7e800188782973598158e0acbb9e08e6c99 Author: Mi Jinlong Date: Sat Oct 30 10:19:33 2010 +0800 nfs: kernel should return EPROTONOSUPPORT when not support NFSv4 When nfs client(kernel) don't support NFSv4, maybe user build kernel without NFSv4, there is a problem. Using command "mount SERVER-IP:/nfsv3 /mnt/" to mount NFSv3 filesystem, mount should should success, but fail and get error: "mount.nfs: an incorrect mount option was specified" System call mount "nfs"(not "nfs4") with "vers=4", if CONFIG_NFS_V4 is not defined, the "vers=4" will be parsed as invalid argument and kernel return EINVAL to nfs-utils. About that, we really want get EPROTONOSUPPORT rather than EINVAL. This path make sure kernel parses argument success, and return EPROTONOSUPPORT at nfs_validate_mount_data(). Signed-off-by: Mi Jinlong Signed-off-by: Trond Myklebust commit 21ac19d484a8ffb66f64487846c8d53afef04d2b Author: Sergey Vlasov Date: Sun Nov 28 21:04:05 2010 +0000 NFS: Fix fcntl F_GETLK not reporting some conflicts The commit 129a84de2347002f09721cda3155ccfd19fade40 (locks: fix F_GETLK regression (failure to find conflicts)) fixed the posix_test_lock() function by itself, however, its usage in NFS changed by the commit 9d6a8c5c213e34c475e72b245a8eb709258e968c (locks: give posix_test_lock same interface as ->lock) remained broken - subsequent NFS-specific locking code received F_UNLCK instead of the user-specified lock type. To fix the problem, fl->fl_type needs to be saved before the posix_test_lock() call and restored if no local conflicts were reported. Reference: https://bugzilla.kernel.org/show_bug.cgi?id=23892 Tested-by: Alexander Morozov Signed-off-by: Sergey Vlasov Cc: Signed-off-by: Trond Myklebust commit 08a22b392a141c201d7ed4d435de942aa853acd3 Author: Aneesh Kumar K.V Date: Wed Dec 1 10:42:16 2010 +0000 nfs: Discard ACL cache on mode update An update of mode bits can result in ACL value being changed. We need to mark the acl cache invalid when we update mode. Similarly we need to update file attribute when we change ACL value Signed-off-by: Aneesh Kumar K.V Signed-off-by: Trond Myklebust commit 5de62b86d2f5cf3459cb02ecb7a4530787bbd898 Author: Tony Lindgren Date: Tue Dec 7 16:26:58 2010 -0800 omap1: Fix gpio mpuio bank to work for multi-omap for 7xx/15xx/16xx We need to divide the 15xx/16xx offset by 2 for 7xx. Use bank->stride for that. This allows us to get rid of the duplicate defines for the MPUIO registers. Note that this will cause omap-keypad.c driver to not work on 7xx. However, the right fix there is to move over to matrix_keypad instead as suggested by Cory Maccarrone and Janusz Krzysztofik . Cc: Cory Maccarrone Acked-by: Janusz Krzysztofik Signed-off-by: Tony Lindgren commit 77640aabd7558e43b65bc1a0311be2dbb42c3ff8 Author: Varadarajan, Charulatha Date: Tue Dec 7 16:26:57 2010 -0800 OMAP: GPIO: Implement GPIO as a platform device Implement GPIO as a platform device. GPIO APIs are used in machine_init functions. Hence it is required to complete GPIO probe before board_init. Therefore GPIO device register and driver register are implemented as postcore_initcalls. omap_gpio_init() does nothing now and this function would be removed in the next patch as it's usage is spread across most of the board files. Inorder to convert GPIO as platform device, modifications are required in clockxxxx_data.c file for OMAP1 so that device names can be used to obtain clock instead of getting clocks by name/NULL ptr. Use runtime pm APIs (pm_runtime_put*/pm_runtime_get*) for enabling or disabling the clocks, modify sysconfig settings and remove usage of clock FW APIs. Note 1: Converting GPIO driver to use runtime PM APIs is not done as a separate patch because GPIO clock names are different for various OMAPs and are different for some of the banks in the same CPU. This would need usage of cpu_is checks and bank id checks while using clock FW APIs in the gpio driver. Hence while making GPIO a platform driver framework, PM runtime APIs are used directly. Note 2: While implementing GPIO as a platform device, pm runtime APIs are used as mentioned above and modification is not done in gpio's prepare for idle/ resume after idle functions. This would be done in the next patch series and GPIO driver would be made to use dev_pm_ops instead of sysdev_class in that series only. Due to the above, the GPIO driver implicitly relies on CM_AUTOIDLE = 1 on its iclk for power management to work, since the driver never disables its iclk. This would be taken care in the next patch series (see Note 3 below). Refer to http://www.mail-archive.com/linux-omap@vger.kernel.org/msg39112.html for more details. Note 3: only pm_runtime_get_sync is called in gpio's probe() and pm_runtime_put* is never called. This is to make the implementation similar to the existing GPIO code. Another patch series would be sent to correct this. In OMAP3 and OMAP4 gpio's debounce clocks are optional clocks. They are enabled/ disabled whenever required using clock framework APIs TODO: 1. Cleanup the GPIO driver. Use function pointers and register offest pointers instead of using hardcoded values 2. Remove all cpu_is_ checks and OMAP specific macros 3. Remove usage of gpio_bank array so that only instance specific information is used in driver code 4. Rename 'method'/ avoid it's usage 5. Fix the non-wakeup gpios handling for OMAP2430, OMAP3 & OMAP4 6. Modify gpio's prepare for idle/ resume after idle functions to use runtime pm implentation. Signed-off-by: Charulatha V Signed-off-by: Rajendra Nayak Reviewed-by: Basak, Partha Acked-by: Kevin Hilman [tony@atomide.com: updated for bank specific revision and updated boards] Signed-off-by: Tony Lindgren commit f547170fe721f145b7b7d6eb8b252e45f489dc4b Author: Varadarajan, Charulatha Date: Tue Dec 7 16:26:57 2010 -0800 OMAP2+: GPIO: device registration Use omap_device_build() API to do platform_device_register of GPIO devices. For OMAP2+ chips, the device specific data defined in the centralized hwmod database will be used. gpio_init needs to be done before machine_init functions access gpio APIs. Hence gpio_init is made as a postcore_initcall. Signed-off-by: Charulatha V Acked-by: Benoit Cousson Reviewed-by: Basak, Partha Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 9780a9cfa7b1f913d5f7099290e77b381a8b01d5 Author: Benoit Cousson Date: Tue Dec 7 16:26:57 2010 -0800 OMAP4: hwmod data: Add GPIO Add GPIO hwmod data for OMAP4 Signed-off-by: Benoit Cousson Signed-off-by: Charulatha V Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 70034d38fbfd0f98a49367d36aa72f776a9e663a Author: Varadarajan, Charulatha Date: Tue Dec 7 16:26:57 2010 -0800 OMAP3: hwmod data: Add GPIO Add GPIO hwmod data for OMAP3 Also remove "omap34xx.h" header file as it is not required anymore. Signed-off-by: Charulatha V Signed-off-by: Rajendra Nayak Acked-by: Benoit Cousson Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit aeac0e441045974757e901b46719980a98c270a5 Author: Varadarajan, Charulatha Date: Tue Dec 7 16:26:56 2010 -0800 OMAP2430: hwmod data: Add GPIO Add GPIO hwmod data for OMAP2430 Also remove "omap24xx.h" header file as it is not required anymore. Signed-off-by: Charulatha V Acked-by: Benoit Cousson Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 59c348c38fbe85e6e86c711b9a38c37315008d9e Author: Varadarajan, Charulatha Date: Tue Dec 7 16:26:56 2010 -0800 OMAP2420: hwmod data: Add GPIO Add GPIO hwmod data for OMAP2420 and add the required GPIO device attributes in the gpio header file Also remove "omap24xx.h" header file as it is not required anymore. Signed-off-by: Charulatha V Acked-by: Benoit Cousson Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 9d52342c27b7b43c4a7b24bac24ff7bee0b80e07 Author: Varadarajan, Charulatha Date: Tue Dec 7 16:26:56 2010 -0800 OMAP7xx: GPIO: Introduce support for GPIO init Add support for handling OMAP7xx specific gpio_init by providing platform device data and doing device registration. Signed-off-by: Charulatha V Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 87fe6229c75a2ca1ebfa1e9e937cba2535e961a8 Author: Varadarajan, Charulatha Date: Tue Dec 7 16:26:56 2010 -0800 OMAP16xx: GPIO: Introduce support for GPIO init Add support for handling OMAP16xx specific gpio_init by providing platform device data and doing device registration. Signed-off-by: Charulatha V Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit c95d10bc49d50a9bc0f63a6eae79bb2707dabfdc Author: Varadarajan, Charulatha Date: Tue Dec 7 16:26:56 2010 -0800 OMAP15xx: GPIO: Introduce support for GPIO init Add support for handling OMAP15xx specific gpio_init by providing platform device data and doing device registration. Signed-off-by: Charulatha V Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 9a748053f5f58a77cd71864f1d7b804175b0e47d Author: Tony Lindgren Date: Tue Dec 7 16:26:56 2010 -0800 OMAP: GPIO: Make omap_gpio_show_rev bank specific Otherwise GPIO init on 16xx may try to access uninitialized GPIO bank as the MPUIO bank does not have a revision register. Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 2fae7fbed072705d91e09ed393b2e580b2d895fc Author: Varadarajan, Charulatha Date: Tue Dec 7 16:26:55 2010 -0800 OMAP: GPIO: prepare for platform driver Prepare for implementing GPIO as a platform driver. Modifies omap_gpio_init() to make use of omap_gpio_chip_init() and omap_gpio_mod_init(). omap_gpio_mod_init() does the module init by clearing the status register and initializing the GPIO control register. omap_gpio_chip_init() initializes the chip request, free, get, set and other function pointers and sets the gpio irq handler. This is only to reorganize the code so that the "omap gpio platform driver implementation patch" looks cleaner and better to review. Signed-off-by: Charulatha V Acked-by: Kevin Hilman Signed-off-by: Tony Lindgren commit c2cdaffe0bb32015e84af8e31f73e620ba271165 Author: Tony Lindgren Date: Tue Dec 7 16:26:55 2010 -0800 omap: Fix gpio_request calls to happen as arch_initcall Looks like some boards are calling gpio_request from init_irq. This will make the request_irq fail, as GPIO will be initialized as postcore_initcall. Reported-by: Paul Walmsley Signed-off-by: Tony Lindgren commit 7b045c96cd1405597a6a2e98bc53a4ac01d835b1 Author: Tony Lindgren Date: Tue Dec 7 16:25:41 2010 -0800 omap: Don't select mux by default for each board This should be only selected in CONFIG_ARCH_OMAP2PLUS_TYPICAL to make it easy to disable. Signed-off-by: Tony Lindgren commit 6722a7238d062b747fc03b35d3371b935bcc965d Author: Shubhrajyoti D Date: Tue Dec 7 16:25:41 2010 -0800 omap: McBSP: Make the free variable update more readable Using true/false instead of 1/0 to update the free variable. Signed-off-by: Shubhrajyoti D Acked-by: Jarkko Nikula Signed-off-by: Tony Lindgren commit 5f3b7284cb35c9e3eead279cb35f017b9735bb43 Author: Jarkko Nikula Date: Tue Dec 7 16:25:40 2010 -0800 omap: McBSP: Fix potential memory leak in omap_mcbsp_remove Function omap_mcbsp_probe allocates struct omap_mcbsp *mcbsp but it is not freed in omap_mcbsp_remove. Fix this, remove unneeded structure cleanups and clk_disable calls since they are not needed here. This is not problem currently but becomes if the mcbsp driver is ever modularized. Signed-off-by: Jarkko Nikula Signed-off-by: Tony Lindgren commit b1cc4c55c69efed3ebbb2a13e4c77a2a1a4a6bc9 Author: Evgeny Kuznetsov Date: Tue Dec 7 16:25:40 2010 -0800 omap: Ptr "isr_reg" tracked as NULL was dereferenced Value of "isr_reg" pointer is depend on configuration and GPIO method. Potentially it may have NULL value and it is dereferenced later in code. Warning and exit from function are added in this case. Signed-off-by: Evgeny Kuznetsov Signed-off-by: Tony Lindgren commit be40f7a3d7b53c1a44e11b376b4a395d6b91f58d Author: Tony Lindgren Date: Tue Dec 7 16:25:40 2010 -0800 omap: Fix undefined reference to omap2_i2c_mux_pins In some cases we can get error function `omap2_i2c_add_bus': arch/arm/plat-omap/i2c.c:136: undefined reference to `omap2_i2c_mux_pins' arch/arm/plat-omap/i2c.c:141: undefined reference to `omap_hwmod_lookup' arch/arm/plat-omap/i2c.c:157: undefined reference to `omap_device_build' Signed-off-by: Tony Lindgren commit c989a7fc139ec8975fdc230e2de42f3c4555880e Author: Sascha Hauer Date: Mon Dec 6 11:09:57 2010 +0100 dmaengine i.MX SDMA: initialize on module_init The firmware framework gets initialized during fs_initcall time, so we are not allowed to call request_firmware earlier. Signed-off-by: Sascha Hauer Signed-off-by: Dan Williams commit 8961d52d4cc52edf5672f8f2712c57162b736793 Author: Alex Deucher Date: Fri Dec 3 14:37:22 2010 -0500 drm/radeon/kms: fix vram base calculation on rs780/rs880 Avoid overflowing a 32 bit value. Signed-off-by: Alex Deucher Cc: stable@kernel.org Signed-off-by: Dave Airlie commit dd7cc55a258400440aff5869d3e1e111142297cd Author: Alex Deucher Date: Fri Dec 3 14:37:21 2010 -0500 drm/radeon/kms: fix formatting of vram and gtt info print the full 64 bit values. Signed-off-by: Alex Deucher Signed-off-by: Dave Airlie commit 93225b0d7bc030f4a93165347a65893685822d70 Author: Jerome Glisse Date: Fri Dec 3 16:38:19 2010 -0500 drm/radeon/kms: forbid big bo allocation (fdo 31708) v3 Forbid allocating buffer bigger than visible VRAM or GTT, also properly set lpfn field. v2 - use max macro - silence warning v3 - don't explicitly set range limit - use min macro Cc: stable Signed-off-by: Jerome Glisse Signed-off-by: Dave Airlie commit 541cc966915b6756e54c20eebe60ae957afdb537 Author: Chris Wilson Date: Mon Dec 6 11:24:07 2010 +0000 drm: Don't try and disable an encoder that was never enabled Prevents code that assumes that the encoder is active when asked to be disabled from dying a horrible death. Reported-by: Daniel Vetter Signed-off-by: Chris Wilson Signed-off-by: Dave Airlie commit ea5d552c73707645c53d42e8a71c9a4d9cbb85c1 Author: Chris Wilson Date: Wed Dec 1 19:41:31 2010 +0000 drm: Add missing drm_vblank_put() along queue vblank error path Signed-off-by: Chris Wilson Cc: Kristian Høgsberg Acked-by: Jesse Barnes Signed-off-by: Dave Airlie commit e516c7df4cfe335a2ea220480cfac558dc738ae4 Merge: 81e8d2162566379adcf4b3700f03845c62577145 1b39d6f37622f1da70aa2cfd38bfff9a52c13e05 Author: Dave Airlie Date: Wed Dec 8 09:30:59 2010 +1000 Merge branch 'drm-intel-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ickle/drm-intel into drm-fixes commit 943d8d8bca431d6c93f17bf38f4b09c65e0a81d7 Author: Tomoya MORINAGA Date: Wed Dec 1 19:49:48 2010 +0900 dma : EG20T PCH: Fix miss-setting DMA descriptor Currently, in case of using scatter/gather mode, head of data is not sent to destination. The cause is second descriptor address is set to NEXT. The NEXT must have head of descriptor address. This patch sets head of descriptor address to the NEXT. Acked-by: Yong Wang Signed-off-by: Tomoya MORINAGA [dan.j.williams@intel.com: fixed up usage of virt_to_phys()] Signed-off-by: Dan Williams commit 1b39d6f37622f1da70aa2cfd38bfff9a52c13e05 Author: Chris Wilson Date: Mon Dec 6 11:20:45 2010 +0000 drm/i915/dp: Only apply the workaround if the select is still active As we may try to power down the link at various times, it is not necessarily still coupled with an encoder and so we must be careful not to depend upon an operation that is only valid when the link is still attached to a pipe. Fixes regression in 5bddd17. Reported-and-tested-by: Daniel Vetter Signed-off-by: Chris Wilson Cc: stable@kernel.org [after applying 5bddd17] commit 00b4ade1f1968b55bb57a91c1f09a40fc33f72a0 Author: Paul Walmsley Date: Tue Dec 7 04:30:57 2010 +0000 OMAP1: I2C: fix device initialization Commit 4d17aeb1c5b2375769446d13012a98e6d265ec13 ("OMAP: I2C: split device registration and convert OMAP2+ to omap_device") broke I2C on OMAP1. The following messages appear at boot: i2c_omap i2c_omap.1: failure requesting irq 0 i2c_omap: probe of i2c_omap.1 failed with error -22 Investigation revealed that a chunk of code is missing from the original plat-omap/i2c.c file which configured the IRQ and base address for the I2C block on OMAP1. Upon adding this back, the OMAP1 I2C block seems to initialize correctly. Thanks to Cory Maccarrone for reporting the bug, and apologies for the breakage. Signed-off-by: Paul Walmsley Cc: Janusz Krzysztofik Tested-by: Cory Maccarrone Signed-off-by: Tony Lindgren commit 7659a193f94c0003dd06e9e874d19bade1a8c952 Author: Javier Cardona Date: Tue Dec 7 10:41:47 2010 -0800 mac80211: Fix compilation error when mesh is disabled Wrap mesh sections inside CONFIG_MAC80211_MESH to fix compilation problems reported by Stephen Rothwell, Larry Finger and Bruno Randolf. Signed-off-by: John W. Linville commit cae6b74d907e2abd22d496fe30417b088d3302cf Author: Mohammed Shafi Shajakhan Date: Tue Dec 7 21:23:16 2010 +0530 ath9k: Remove dead code in recv.c The structure struct ieee80211_rx_status *rxs is no longer needed to be passed to ath_rx_send_to_mac80211 function Signed-off-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit 0ce3bcfc84900a64347b0fe1140229bd81314008 Author: Mohammed Shafi Shajakhan Date: Tue Dec 7 21:14:15 2010 +0530 ath9k: Parse DTIM period from mac80211 With the current save power save implementation we assume a dtim period of 1.This value is assigned based on a sanity check in the driver eventhough we had not parsed it from mac80211.This patch obtains the actual DTIM period from AP by parsing it from mac80211.Yet for handling multicast traffic we may still have it as fixed rather than parsing it from mac80211 .This does not breaks power save or anything as the sleep duration is currently fixed in the driver.This patch may serve to improve power save in the future by using dtim period for sleep duration and using correct dtim period adhoc mode. Signed-off-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit aaef24b4c9f5db726e618977b74ffef924360de5 Author: Mohammed Shafi Shajakhan Date: Tue Dec 7 20:40:58 2010 +0530 ath9k: Properly use unlikely check macro AUTOSLEEP feature is enabled only for AR9271 and AR9003 version chipsets.So unlikely macro should be used only to check whether auto-sleep feature is enabled Signed-off-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit caa0a99acd2c4eb0a8d4e9caae397291e4cf743a Author: Sujith Manoharan Date: Tue Dec 7 16:32:02 2010 +0530 ath9k_htc: Fix panic on FW download failure Use the correct error condition exit in case firmware download fails for some reason. Not doing so results in a panic: usb 1-3: ath9k_htc: Transferred FW: ar9271.fw, size: 51280 usb 1-3: ath9k_htc: Firmware - ar9271.fw download failed usb 1-3: ath9k_htc: Target is unresponsive Failed to initialize the device INFO: trying to register non-static key. the code is fine but needs lockdep annotation. turning off the locking correctness validator. Pid: 2823, comm: insmod Tainted: G W 2.6.37-rc4-wl #11 Call Trace: [] __lock_acquire+0xe3e/0x1d00 [] ? restore_args+0x0/0x30 [] ? vprintk+0x321/0x500 [] lock_acquire+0xa0/0x190 [] ? usb_kill_anchored_urbs+0x1c/0x80 [usbcore] [] _raw_spin_lock_irq+0x48/0x60 [] ? usb_kill_anchored_urbs+0x1c/0x80 [usbcore] [] ? printk+0x3c/0x3f [] usb_kill_anchored_urbs+0x1c/0x80 [usbcore] [] ath9k_hif_usb_dealloc_urbs+0x18/0x40 [ath9k_htc] [] ath9k_hif_usb_probe+0x227/0x3d0 [ath9k_htc] [] usb_probe_interface+0x10c/0x210 [usbcore] [] driver_probe_device+0x96/0x1c0 [] __driver_attach+0xa3/0xb0 [] ? __driver_attach+0x0/0xb0 [] bus_for_each_dev+0x5e/0x90 [] driver_attach+0x19/0x20 [] bus_add_driver+0x168/0x320 [] driver_register+0x71/0x140 [] ? __raw_spin_lock_init+0x38/0x70 [] usb_register_driver+0xdc/0x190 [usbcore] [] ? ath9k_htc_init+0x0/0x4f [ath9k_htc] [] ath9k_hif_usb_init+0x1e/0x20 [ath9k_htc] [] ath9k_htc_init+0x2b/0x4f [ath9k_htc] [] do_one_initcall+0x3f/0x180 [] sys_init_module+0xbb/0x200 [] system_call_fastpath+0x16/0x1b Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit 692d6b175b392512881ab374567e900fc825d487 Author: Sujith Manoharan Date: Tue Dec 7 16:31:54 2010 +0530 ath9k_htc: Add support for handling TX power configuration Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit 0b5ead91cda63e0db964dadc77601233434f60cb Author: Sujith Manoharan Date: Tue Dec 7 16:31:38 2010 +0530 ath9k_htc: Cleanup device identification ath.ko is a common module shared between ath5k, ar9170usb, ath9k and ath9k_htc. Adding driver specific data to the shared structure would impact all the drivers. Handling USB device recognition for devices specific to ath9k_htc can be handled within the driver itself. Also, AR7010 refers to the processor used in both AR9280/AR9287 based devices. Rename the device enumerations accordingly. While at it, check properly for the bus type when choosing the EEPROM base address for UB95. Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit c658e5db01117bf2a321a9a782754dd5b10e2f15 Author: Felix Fietkau Date: Tue Dec 7 04:40:18 2010 +0100 mac80211: fix a compiler warning net/mac80211/mlme.c: In function 'ieee80211_sta_work': net/mac80211/mlme.c:1981: warning: too many arguments for format Introduced by commit 04ac3c0ee2c773c321ec472d892635a20556f34d ("mac80211: speed up AP probing using nullfunc frames"). Reported-by: Stephen Rothwell Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 22d8d9f81b8b054df2f7f82daffcb71608f411e4 Author: Bruno Randolf Date: Tue Dec 7 11:08:12 2010 +0900 ath5k: Use capabilities information for the number of TX queues One thing I missed in my WME series: Older hardware does not have enough hardware queues to support WME. In this case we just set up one data queue. Use the capability information to decide how many queues to set up. Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit 5c6d1125f8dbd1bfef39e38fbc2837003be78a59 Author: Jarkko Sakkinen Date: Tue Dec 7 13:34:01 2010 +0200 Smack: Transmute labels on specified directories In a situation where Smack access rules allow processes with multiple labels to write to a directory it is easy to get into a situation where the directory gets cluttered with files that the owner can't deal with because while they could be written to the directory a process at the label of the directory can't write them. This is generally the desired behavior, but when it isn't it is a real issue. This patch introduces a new attribute SMACK64TRANSMUTE that instructs Smack to create the file with the label of the directory under certain circumstances. A new access mode, "t" for transmute, is made available to Smack access rules, which are expanded from "rwxa" to "rwxat". If a file is created in a directory marked as transmutable and if access was granted to perform the operation by a rule that included the transmute mode, then the file gets the Smack label of the directory instead of the Smack label of the creating process. Note that this is equivalent to creating an empty file at the label of the directory and then having the other process write to it. The transmute scheme requires that both the access rule allows transmutation and that the directory be explicitly marked. Signed-off-by: Jarkko Sakkinen Signed-off-by: Casey Schaufler commit d7fd1b50a51be3fe6554fbab8953fa8a3ff4009b Author: Ben Greear Date: Mon Dec 6 13:13:07 2010 -0800 ath9k: Make DMA warning in ath_stoprecv WARN_ON_ONCE. This decreases spammage in the log. A single line message will still be printed, so users can be aware that problem exists. Signed-off-by: Ben Greear Acked-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit 1435894dcd263fdbdd5e1ea2a684289dff187c34 Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:28:00 2010 -0800 ath9k: Add device id of AR9485 to pci table Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit a95f1600081211433c5ff6f3668061c821552e9f Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:59 2010 -0800 ath9k_hw: Disable MRC CCK for AR9485 Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 11441fb8b700bd782ae72d3dd87453fc5bc2ff12 Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:58 2010 -0800 ath9k_hw: Setup paprd only for supported chains Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 7090ad1416d0311677c43728494c6028aa2436b6 Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:57 2010 -0800 ath9k_hw: Program appropriate register for temperature compensation cal for AR9485 Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 858b7e36e82cc03cb77b64f096b64446a24a346a Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:56 2010 -0800 ath9k_hw: Add IQ cal changes for AR9485 Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 73ff5fc0a86b28b77e02a6963b388d1dbfa0a263 Author: Eric Paris Date: Tue Dec 7 16:17:28 2010 -0500 selinux: cache sidtab_context_to_sid results sidtab_context_to_sid takes up a large share of time when creating large numbers of new inodes (~30-40% in oprofile runs). This patch implements a cache of 3 entries which is checked before we do a full context_to_sid lookup. On one system this showed over a x3 improvement in the number of inodes that could be created per second and around a 20% improvement on another system. Any time we look up the same context string sucessivly (imagine ls -lZ) we should hit this cache hot. A cache miss should have a relatively minor affect on performance next to doing the full table search. All operations on the cache are done COMPLETELY lockless. We know that all struct sidtab_node objects created will never be deleted until a new policy is loaded thus we never have to worry about a pointer being dereferenced. Since we also know that pointer assignment is atomic we know that the cache will always have valid pointers. Given this information we implement a FIFO cache in an array of 3 pointers. Every result (whether a cache hit or table lookup) will be places in the 0 spot of the cache and the rest of the entries moved down one spot. The 3rd entry will be lost. Races are possible and are even likely to happen. Lets assume that 4 tasks are hitting sidtab_context_to_sid. The first task checks against the first entry in the cache and it is a miss. Now lets assume a second task updates the cache with a new entry. This will push the first entry back to the second spot. Now the first task might check against the second entry (which it already checked) and will miss again. Now say some third task updates the cache and push the second entry to the third spot. The first task my check the third entry (for the third time!) and again have a miss. At which point it will just do a full table lookup. No big deal! Signed-off-by: Eric Paris commit 31faff815bd9d87c370f799dff03948ed362d260 Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:55 2010 -0800 ath9k_hw: Define IQcal correction coefficient registers using index Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 6559e83ebd2cac06c54ebb2b7f635cf2e434f25c Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:54 2010 -0800 ath9k_hw: Program appropriate chianmask for AR9485 before starting AGC/IQ cal Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 5f139eba4174d9a3343efc7cfb8a0a9cb184c647 Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:53 2010 -0800 ath9k_hw: Configure power control only for the supported chains Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit dd040f76cef0cc977b83e905a16b68d41322b735 Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:52 2010 -0800 ath9k_hw: Read and configure turnning caps to regulate freq accuracy Right now it is done for only AR9485, will be done for ar9003 also after proper testing. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit ab09b5b4beda8b33a117bf6fbbb2b5aa8f566129 Author: Vasanthakumar Thiagarajan Date: Tue Dec 7 02:20:39 2010 -0800 ath9k_hw: Configure internal regulator for AR9485 Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 47e84dfb411fcaa51e12d94ab82570ec3aa86e32 Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:49 2010 -0800 ath9k_hw: Read and configure antenna diversity control for AR9485 Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 9936e65fae6d95c2acc2438c60a8f4908130530e Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:48 2010 -0800 ath9k_hw: Configure xpa bias level for AR9485 Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit d9a2545ac713e26ab8c8eee741d2da1626cebd6e Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:47 2010 -0800 ath9k: Read spur channel information from eeprom for AR9485 Also spur channel count and range is different for AR9485. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 272ceba892208013a45847276a00ccae54e2b94a Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:46 2010 -0800 ath9k_hw: Add a helper function to get spur channel pointer from cal data for AR9003 family This helper function would be used for AR9485. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 85dd0921e686ed2f0283cef358a91ecaa36ccc8f Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:45 2010 -0800 ath9k_hw: Find chansel of AR_PHY_65NM_CH0_SYNTH7 for AR9485 Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit d09b17f73fd8f475f33d0b8311d7b5a0bed67c67 Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:44 2010 -0800 ath9k: Configure pll control for AR9485 Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 47c80de62e9d6d262a829502d689a8b56add8d3d Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:43 2010 -0800 ath9k_hw: Find the maximum number of chains that hw supports Have it in ah->caps. This will be used during various calibrations. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 8060e169e02fe855f5533b5ef6af1f23ae2db0c4 Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:42 2010 -0800 ath9k: Enable extended synch for AR9485 to fix L0s recovery issue Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 7f1c7a6ac57ff0482219aa3f62eb9d0f8fe65867 Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:41 2010 -0800 ath9k: Disable TX STBC for AR9485 Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 784ad50324ec531fa4ab22586fe305657cc6e307 Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:40 2010 -0800 ath9k_hw: Disable LDPC for AR9485 Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 60e0c3a782f9060327751492dac949210154759b Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:39 2010 -0800 ath9k_hw: Eeeprom changes for AR9485 Calibration data are stored at 4k address (0xfff). The cal data for AR9485 is not compressed so its lengh can exceed 1024 limit, take care of that. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit ff48ba464e3503149657c60d46e8f4e9b4ed27fa Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:38 2010 -0800 ath9k_hw: Initialize tx/rx gain table from initvals.h for AR9485 Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit c88457eb83fb6db7a3286a685ecc6e33a7aac49d Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:37 2010 -0800 ath9k_hw: Initialize mode registers for AR9485 Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 3050c9146b2a4c98a916192fac2867c0023ec2b1 Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:36 2010 -0800 ath9k_hw: Enable hw initialization for AR9485 Also make it a supported mac Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit d9c803e1864d563b07382eb1bb8979cd70b1001e Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:35 2010 -0800 ath9k_hw: Add initvals.h for AR9485 Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 3bbb780cca79dfe0200d33afb95a8990acde65b9 Author: Vasanthakumar Thiagarajan Date: Mon Dec 6 04:27:34 2010 -0800 ath9k_hw: Define hw version macros for AR9485 AR9485 is a single chain and single band (2.4 Ghz) chip. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit b7555ec7c604f2f00e432579dac29df5ce525433 Author: John W. Linville Date: Tue Dec 7 14:13:49 2010 -0500 ath5k: remove MODULE_VERSION Since this is updated manually and sporadically, it is fairly useless anyway. Signed-off-by: John W. Linville commit a1cbc7a88985976267a851a2e1080578711b3b0d Author: Joe Perches Date: Thu Dec 2 19:12:38 2010 -0800 ath: Fix ath_dbg access beyond array bound ar9300RateSize is not necessarily a power of 4. Change ar9003_hw_set_target_power_eeprom to print the targetPowerValT2 array one per line. ath9k_hw_ar9300_set_txpower repeated the output 4 times per line, change it to print the targetPowerValT2 value one per line. Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit 226afe68fdbd1aa3680158aca0a3631cbd019626 Author: Joe Perches Date: Thu Dec 2 19:12:37 2010 -0800 ath: Convert ath_print to ath_dbg Remove ath/debug.h and the includes of these files. Coalesce long formats. Correct a few misspellings and missing "\n"s from these logging messages. Remove unnecessary trailing space before a newline. Remove ARRAY_SIZE casts, use printf type %zu Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit 3800276a40751539a920ef8e0537ef2e19126799 Author: Joe Perches Date: Thu Dec 2 19:12:36 2010 -0800 ath: Convert ath_print(.., ATH_DBG_FATAL to ath_err So these errors are always emitted at KERN_ERR level. Remove ARRAY_SIZE casts, use printf type %zu Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit 21a99f934949807dc0c9dc7642bbf0081b7582f9 Author: Joe Perches Date: Thu Dec 2 19:12:35 2010 -0800 ath: Add and use ath_printk and ath_ Add ath_printk and ath_ similar to dev_printk and dev_ from device.h This allows a more gradual rename of ath_print to to ath_dbg or perhaps ath_debug. This basically removes debug.h leaving only an #define ath_printk ath_dbg there and moving all the ATH_DBG_ enums to ath.h I do not think there's much purpose for struct ath_common * being passed to the ath_printk functions, but perhaps there might be. Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit fdbf3ceeb659f0b3c0e8dd79b331b7ac05910f1e Author: Lino Sanfilippo Date: Wed Nov 24 18:26:04 2010 +0100 fanotify: Dont try to open a file descriptor for the overflow event We should not try to open a file descriptor for the overflow event since this will always fail. Signed-off-by: Lino Sanfilippo Signed-off-by: Eric Paris commit e9a3854fd4ff3907e6c200a3980e19365ee695e9 Author: Lino Sanfilippo Date: Wed Nov 24 18:22:09 2010 +0100 fanotify: Introduce FAN_NOFD FAN_NOFD is used in fanotify events that do not provide an open file descriptor (like the overflow_event). Signed-off-by: Lino Sanfilippo Signed-off-by: Eric Paris commit 26379198937fcc9bbe7be76be695d06df8334eaa Author: Eric Paris Date: Tue Nov 23 23:48:26 2010 -0500 fanotify: do not leak user reference on allocation failure If fanotify_init is unable to allocate a new fsnotify group it will return but will not drop its reference on the associated user struct. Drop that reference on error. Reported-by: Vegard Nossum Signed-off-by: Eric Paris commit a2ae4cc9a16e211c8a128ba10d22a85431f093ab Author: Eric Paris Date: Tue Nov 23 18:18:37 2010 -0500 inotify: stop kernel memory leak on file creation failure If inotify_init is unable to allocate a new file for the new inotify group we leak the new group. This patch drops the reference on the group on file allocation failure. Reported-by: Vegard Nossum cc: stable@kernel.org Signed-off-by: Eric Paris commit 09e5f14e57c70f9d357862bb56e57026c51092a1 Author: Lino Sanfilippo Date: Fri Nov 19 10:58:07 2010 +0100 fanotify: on group destroy allow all waiters to bypass permission check When fanotify_release() is called, there may still be processes waiting for access permission. Currently only processes for which an event has already been queued into the groups access list will be woken up. Processes for which no event has been queued will continue to sleep and thus cause a deadlock when fsnotify_put_group() is called. Furthermore there is a race allowing further processes to be waiting on the access wait queue after wake_up (if they arrive before clear_marks_by_group() is called). This patch corrects this by setting a flag to inform processes that the group is about to be destroyed and thus not to wait for access permission. [additional changelog from eparis] Lets think about the 4 relevant code paths from the PoV of the 'operator' 'listener' 'responder' and 'closer'. Where operator is the process doing an action (like open/read) which could require permission. Listener is the task (or in this case thread) slated with reading from the fanotify file descriptor. The 'responder' is the thread responsible for responding to access requests. 'Closer' is the thread attempting to close the fanotify file descriptor. The 'operator' is going to end up in: fanotify_handle_event() get_response_from_access() (THIS BLOCKS WAITING ON USERSPACE) The 'listener' interesting code path fanotify_read() copy_event_to_user() prepare_for_access_response() (THIS CREATES AN fanotify_response_event) The 'responder' code path: fanotify_write() process_access_response() (REMOVE A fanotify_response_event, SET RESPONSE, WAKE UP 'operator') The 'closer': fanotify_release() (SUPPOSED TO CLEAN UP THE REST OF THIS MESS) What we have today is that in the closer we remove all of the fanotify_response_events and set a bit so no more response events are ever created in prepare_for_access_response(). The bug is that we never wake all of the operators up and tell them to move along. You fix that in fanotify_get_response_from_access(). You also fix other operators which haven't gotten there yet. So I agree that's a good fix. [/additional changelog from eparis] [remove additional changes to minimize patch size] [move initialization so it was inside CONFIG_FANOTIFY_PERMISSION] Signed-off-by: Lino Sanfilippo Signed-off-by: Eric Paris commit 1734dee4e3a296cb72b4819fc2e7ef2440737dff Author: Lino Sanfilippo Date: Mon Nov 22 18:46:33 2010 +0100 fanotify: Dont allow a mask of 0 if setting or removing a mark In mark_remove_from_mask() we destroy marks that have their event mask cleared. Thus we should not allow the creation of those marks in the first place. With this patch we check if the mask given from user is 0 in case of FAN_MARK_ADD. If so we return an error. Same for FAN_MARK_REMOVE since this does not have any effect. Signed-off-by: Lino Sanfilippo Signed-off-by: Eric Paris commit fa218ab98c31eeacd12b89501e6b99d146ea56cc Author: Lino Sanfilippo Date: Tue Nov 9 18:18:16 2010 +0100 fanotify: correct broken ref counting in case adding a mark failed If adding a mount or inode mark failed fanotify_free_mark() is called explicitly. But at this time the mark has already been put into the destroy list of the fsnotify_mark kernel thread. If the thread is too slow it will try to decrease the reference of a mark, that has already been freed by fanotify_free_mark(). (If its fast enough it will only decrease the marks ref counter from 2 to 1 - note that the counter has been increased to 2 in add_mark() - which has practically no effect.) This patch fixes the ref counting by not calling free_mark() explicitly, but decreasing the ref counter and rely on the fsnotify_mark thread to cleanup in case adding the mark has failed. Signed-off-by: Lino Sanfilippo Signed-off-by: Eric Paris commit b1085ba80cd2784400a7beec3fda5099198ed01c Author: Lino Sanfilippo Date: Fri Nov 5 17:05:27 2010 +0100 fanotify: if set by user unset FMODE_NONOTIFY before fsnotify_perm() is called Unsetting FMODE_NONOTIFY in fsnotify_open() is too late, since fsnotify_perm() is called before. If FMODE_NONOTIFY is set fsnotify_perm() will skip permission checks, so a user can still disable permission checks by setting this flag in an open() call. This patch corrects this by unsetting the flag before fsnotify_perm is called. Signed-off-by: Lino Sanfilippo Signed-off-by: Eric Paris commit 88d60c32765716289abeb362c44adf6c35c6824c Author: Eric Paris Date: Mon Nov 8 18:19:22 2010 -0500 fanotify: remove packed from access response message Since fanotify has decided to be careful about alignment and packing rather than rely on __attribute__((packed)) for multiarch support. Since this attribute isn't doing anything on fanotify_response we just drop it. This does not break API/ABI. Suggested-by: Tvrtko Ursulin Signed-off-by: Eric Paris commit ecf6f5e7d68471b08603f7c20143ac236602364f Author: Eric Paris Date: Mon Nov 8 18:08:14 2010 -0500 fanotify: deny permissions when no event was sent If no event was sent to userspace we cannot expect userspace to respond to permissions requests. Today such requests just hang forever. This patch will deny any permissions event which was unable to be sent to userspace. Reported-by: Tvrtko Ursulin Signed-off-by: Eric Paris commit 0ab82b04ac83a05bda3ef8499f415fc6fd6ee206 Author: Eliad Peller Date: Fri Dec 3 02:16:23 2010 +0200 mac80211: fix dynamic-ps/pm_qos magic numbers mac80211 uses pm_qos (/dev/network_latency) in order to determine the dynamic ps timeout (or disable the dynamic-ps at all in some cases). commit ff616381 added a comparison for the current network_latency against one high value (1900ms), and against the default value (2000sec, rather than the commented 2sec). however, the representation of 1900ms was incorrect: 1900ms = 1900000us ( != 1900000000 ) fix it by using USEC_TO_MSEC/SEC consts. Signed-off-by: Eliad Peller Signed-off-by: John W. Linville commit 329b32fedc94fd9158f1635ac64f4ae6a00d374c Author: David Kilroy Date: Thu Dec 2 18:19:21 2010 +0000 orinoco: allow IW_AUTH_MFP to pass through The card doesn't support MFP, so silently accept DISABLED and OPTIONAL settings. This avoids the following failure in wpa_supplicant logs: State: SCANNING -> ASSOCIATING wpa_driver_wext_set_operstate: operstate 0->0 (DORMANT) netlink: Operstate: linkmode=-1, operstate=5 wpa_driver_wext_associate wpa_driver_wext_set_drop_unencrypted wpa_driver_wext_set_psk wpa_driver_wext_associate: assoc failed because set_auth_param(IW_AUTH_MFP) failed Association request to the driver failed Signed-off by: David Kilroy Reported by: Giacomo Comes Signed-off-by: John W. Linville commit 541a45a142df281c974d74eac2066138fc107b23 Author: Bruno Randolf Date: Thu Dec 2 19:12:43 2010 +0900 nl80211/mac80211: Report signal average Extend nl80211 to report an exponential weighted moving average (EWMA) of the signal value. Since the signal value usually fluctuates between different packets, an average can be more useful than the value of the last packet. This uses the recently added generic EWMA library function. -- v2: fix ABI breakage and change factor to be a power of 2. Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit e8f149924a3111015d16dfbbb4816cfc75ba53cd Author: Ben Hutchings Date: Tue Dec 7 19:47:34 2010 +0000 sfc: Fix NAPI list corruption during ring reallocation Call netif_napi_{add,del}() on the NAPI contexts in the new and old channels, respectively. Since efx_init_napi() cannot fail, make its return type void. Signed-off-by: Ben Hutchings commit 884a963fa1c828a5c5fa7a46b2877dd463bfd47c Author: Rajkumar Manoharan Date: Tue Dec 7 17:42:18 2010 +0530 ath9k: fix beacon resource related race condition The beacon tasklet is accesssing the bslot info for beacon generation. Meanwhile the same slot can be freed on interface deletion. Current the remove_interface disables the beacon alert after freeing the slot. This may leads to null pointer access. This patch disables SWBA and kills the beacon tasklet to prevent access to the slot to be freed. After releasing the slot, swba will be enabled again upon the availablity of beaconing interfaces. Signed-off-by: Rajkumar Manoharan Signed-off-by: John W. Linville commit 38852b20c8b6d97618204ac64abbf14f0080393e Author: Senthil Balasubramanian Date: Mon Dec 6 19:09:27 2010 +0530 ath9k: Fix STA disconnect issue due to received MIC failed bcast frames AR_RxKeyIdxValid will not be set for bcast/mcast frames and so relying this status for MIC failed frames is buggy. Due to this, MIC failure events for broadcast frames are not sent to supplicant resulted in AP disconnecting the STA. Able to pass Wifi Test case 5.2.18 with this fix. Cc: Stable (2.6.36+) Signed-off-by: Senthil Balasubramanian Signed-off-by: John W. Linville commit 080e1a259acea10b6df8e2a8e49b47481940220a Author: Felix Fietkau Date: Sun Dec 5 20:17:53 2010 +0100 ath9k: fix a DMA related race condition on reset When ath_drain_all_txq fails to stop DMA, it issues a hw reset. This reset happens at a very problematic point in time, when the hardware rx path has not been stopped yet. This could lead to memory corruption, hardware hangs or other issues. To fix these issues, simply remove the reset entirely and check the tx DMA stop status to prevent problems with fast channel changes. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 841051602e3fa18ea468fe5a177aa92b6eb44b56 Author: Matteo Croce Date: Fri Dec 3 02:25:08 2010 +0100 ath9k: fix bug in tx power The ath9k driver subtracts 3 dBm to the txpower as with two radios the signal power is doubled. The resulting value is assigned in an u16 which overflows and makes the card work at full power. Cc: stable@kernel.org Signed-off-by: Matteo Croce Signed-off-by: John W. Linville commit 94dec6a2d20a26a779b63bb584e48db5fb0ddb53 Author: Ben Hutchings Date: Tue Dec 7 19:24:45 2010 +0000 sfc: Fix crash in legacy onterrupt handler during ring reallocation If we are using a legacy interrupt, our IRQ may be shared and our interrupt handler may be called even though interrupts are disabled on the NIC. When we change ring sizes, we reallocate the event queue and the interrupt handler may use an invalid pointer when called for another device's interrupt. Maintain a legacy_irq_enabled flag and test that at the top of the interrupt handler. Note that this problem results from the need to work around broken INT_ISR0 reads, and does not affect the legacy interrupt handler for Falcon A1. Signed-off-by: Ben Hutchings commit 6142e05f30b101adeafb0d12e35983f44f68233e Author: David Howells Date: Tue Dec 7 17:41:40 2010 +0000 MN10300: Fix interrupt mask alteration function call name in gdbstub Fix the name of interrupt mask alteration function (ie the local_change_intr_mask_level() fn) called in gdbstub to have an arch_ prefix to match the definition in asm/irqflags.h. Signed-off-by: David Howells Signed-off-by: Linus Torvalds commit 7d161b7f41e24203b54b0f18ae0d26c18a6c6fab Author: Jeff Layton Date: Tue Dec 7 02:10:35 2010 -0500 cifs: allow calling cifs_build_path_to_root on incomplete cifs_sb It's possible that cifs_mount will call cifs_build_path_to_root on a newly instantiated cifs_sb. In that case, it's likely that the master_tlink pointer has not yet been instantiated. Fix this by having cifs_build_path_to_root take a cifsTconInfo pointer as well, and have the caller pass that in. Reported-and-Tested-by: Robbert Kouprie Signed-off-by: Jeff Layton Signed-off-by: Steve French commit 03ceace5c6923ffbcf2b4d2e37afbffbdb5d4a67 Author: Jeff Layton Date: Mon Dec 6 21:07:33 2010 -0500 cifs: fix check of error return from is_path_accessable This function will return 0 if everything went ok. Commit 9d002df4 however added a block of code after the following check for rc == -EREMOTE. With that change and when rc == 0, doing the "goto mount_fail_check" here skips that code, leaving the tlink_tree and master_tlink pointer unpopulated. That causes an oops later in cifs_root_iget. Reported-and-Tested-by: Robbert Kouprie Signed-off-by: Jeff Layton Signed-off-by: Steve French commit 1baa26b2be92fe9917e2f7ef46d423b5dfa4da71 Author: Miklos Szeredi Date: Tue Dec 7 20:16:56 2010 +0100 fuse: fix ioctl ABI In kernel ABI version 7.16 and later FUSE_IOCTL_RETRY reply from a unrestricted IOCTL request shall return with an array of 'struct fuse_ioctl_iovec' instead of 'struct iovec'. This fixes the ABI ambiguity of 32bit vs. 64bit. Reported-by: "ccmail111" Signed-off-by: Miklos Szeredi CC: Tejun Heo commit 02c048b919455aaa38628563cdcc2e691c8a9f53 Author: Miklos Szeredi Date: Tue Dec 7 20:16:56 2010 +0100 fuse: allow batching of FORGET requests Terje Malmedal reports that a fuse filesystem with 32 million inodes on a machine with lots of memory can take up to 30 minutes to process FORGET requests when all those inodes are evicted from the icache. To solve this, create a BATCH_FORGET request that allows up to about 8000 FORGET requests to be sent in a single message. This request is only sent if userspace supports interface version 7.16 or later, otherwise fall back to sending individual FORGET messages. Reported-by: Terje Malmedal Signed-off-by: Miklos Szeredi commit 07e77dca8a1f17a724a9b7449f0ca02e70e9d057 Author: Miklos Szeredi Date: Tue Dec 7 20:16:56 2010 +0100 fuse: separate queue for FORGET requests Terje Malmedal reports that a fuse filesystem with 32 million inodes on a machine with lots of memory can go unresponsive for up to 30 minutes when all those inodes are evicted from the icache. The reason is that FORGET messages, sent when the inode is evicted, are queued up together with regular filesystem requests, and while the huge queue of FORGET messages are processed no other filesystem operation can proceed. Since a full fuse request structure is allocated for each inode, these take up quite a bit of memory as well. To solve these issues, create a slim 'fuse_forget_link' structure containing just the minimum of information required to send the FORGET request and chain these on a separate queue. When userspace is asking for a request make sure that FORGET and non-FORGET requests are selected fairly: for each 8 non-FORGET allow 16 FORGET requests. This will make sure FORGETs do not pile up, yet other requests are also allowed to proceed while the queued FORGETs are processed. Reported-by: Terje Malmedal Signed-off-by: Miklos Szeredi commit 8ac835056ca39b242d98332f46e4d65428a8b7db Author: Miklos Szeredi Date: Tue Dec 7 20:16:56 2010 +0100 fuse: ioctl cleanup Get rid of unnecessary page_address()-es. Signed-off-by: Miklos Szeredi CC: Tejun Heo commit 3dc86429032910bdf762adeb2969112bb303924c Author: Anssi Hannula Date: Tue Dec 7 20:56:19 2010 +0200 ALSA: hda - Always allow basic audio irrespective of ELD info Commit bbbe33900d1f3c added functionality to restrict PCM parameters based on ELD info (derived from EDID data) of the audio sink. However, according to CEA-861-D no SAD is needed for basic audio (32/44.1/48kHz stereo 16-bit audio), which is instead indicated with a basic audio flag in the CEA EDID Extension. The flag is not present in ELD. However, as all audio capable sinks are required to support basic audio, we can assume it to be always available. Fix allowed audio formats with sinks that have SADs (Short Audio Descriptors) which do not completely overlap with the basic audio formats (there are no reports of affected devices so far) by always assuming that basic audio is supported. Reported-by: Stephen Warren Signed-off-by: Anssi Hannula Cc: stable@kernel.org Signed-off-by: Takashi Iwai commit 4b0dbdb17f846a8887e5f7fbeea2deb0703236bd Author: Anssi Hannula Date: Tue Dec 7 18:41:35 2010 +0200 ALSA: hda - Do not wrongly restrict min_channels based on ELD Commit bbbe33900d1f3c added functionality to restrict PCM parameters based on ELD info (derived from EDID data) of the audio sink. However, it wrongly assumes that the bits 0-2 of the first byte of CEA Short Audio Descriptors mean a supported number of channels. In reality, they mean the maximum number of channels (as per CEA-861-D 7.5.2). This means that the channel count can only be used to restrict max_channels, not min_channels. Restricting min_channels causes us to deny opening the device in stereo mode if the sink only has SADs that declare larger numbers of channels (like Primare SP32 AV Processor does). Fix that by not restricting min_channels based on ELD information. Signed-off-by: Anssi Hannula Reported-by: Jean-Yves Avenard Tested-by: Jean-Yves Avenard Cc: stable@kernel.org Signed-off-by: Takashi Iwai commit c39d35ebffeea5996a6f8fd8430fae9acfb8aeaf Author: Ben Hutchings Date: Tue Dec 7 19:11:26 2010 +0000 sfc: Generalise filter spec initialisation Move search_depth arrays into per-table state. Define initialisation function efx_filter_init_rx() which sets everything apart from the match fields. Define efx_filter_set_{ipv4_local,ipv4_full,eth_local}() to set the match fields. This allows some simplification of callers and later support for additional protocols and more flexible matching using multiple calls to these functions. Signed-off-by: Ben Hutchings commit 47c716cbf638a16583441d78be3fc24345eab636 Author: Trond Myklebust Date: Tue Dec 7 12:44:56 2010 -0500 NFS: Readdir cleanups No functional changes, but clarify the code. Signed-off-by: Trond Myklebust commit a96efbc1fc8e4540dc1d561bb5e42a16a7b472d5 Author: Fabio Estevam Date: Mon Dec 6 16:38:34 2010 -0200 ARM: mx5/mx51_babbage: Add watchdog support Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit 7f77f91dc0171ac11a8b95ba761144d732d4e907 Author: Fabio Estevam Date: Mon Dec 6 16:38:33 2010 -0200 ARM: mx5: add watchdog clocks Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit 8c2efec3cd5fcc6240da8931222ccab556a40ff3 Author: Fabio Estevam Date: Mon Dec 6 16:38:32 2010 -0200 ARM: mx5: add support for the two watchdog modules MX51 has two watchdog modules. Add support for both of them. Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit 8891681af928f1da795cd4bd59043e5e0fadd6c8 Author: Ben Hutchings Date: Tue Dec 7 19:02:27 2010 +0000 sfc: Remove filter table IDs from filter functions The separation between filter tables is largely an internal detail and it may be removed in future hardware. To prepare for that: - Merge table ID with filter index to make an opaque filter ID - Wrap efx_filter_table_clear() with a function that clears filters from both RX tables, which is all that the current caller requires Signed-off-by: Ben Hutchings commit bcd7278d8a423a255e45f4d10afe564328f1885f Author: Bob Peterson Date: Tue Dec 7 13:58:56 2010 -0500 GFS2: fsck.gfs2 reported statfs error after gfs2_grow When you do gfs2_grow it failed to take the very last rgrp into account when adding up the new free space due to an off-by-one error. It was not reading the last rgrp from the rindex because of a check for "<=" that should have been "<". Therefore, fsck.gfs2 was finding (and fixing) an error with the system statfs file. Signed-off-by: Bob Peterson commit ce56d169976488e888878eed5f1bc304cf116c43 Author: Martin Michlmayr Date: Mon Dec 6 21:53:16 2010 +0000 Kirkwood: Add support for 6282 based QNAP devices Add support for the QNAP NAS devices based on Marvell's 6282 Kirkwood chip (TS-119P+, TS-219P+ and TS-419P+). The differences to the 6281 based devices are: - Ethernet PHY address - GPIOs used for buttons (TS-119P+/TS-219P+) Signed-off-by: Martin Michlmayr Acked-by: Saeed Bishara Signed-off-by: Nicolas Pitre commit 4bba1c34e0a70d0db2506e1b68f69d7edc8afd78 Author: Ash Hughes Date: Tue Nov 30 21:53:09 2010 +0000 [ARM] Orion: added Buffalo LS-CHL support Adds support for Buffalo Linkstation Live v3 (LS-CHL) NAS drives. Signed-off-by: Ash Hughes Acked-by: Lennert Buytenhek Signed-off-by: Nicolas Pitre commit ea3398a1ae54cd3403f3cc0f6aa498c7452c681a Merge: 03fa6fc5a68242ddd7cc3ba4255fe6f65b21ce41 cf7d7e5a1980d1116ee152d25dac382b112b9c17 Author: Greg Kroah-Hartman Date: Tue Dec 7 10:47:56 2010 -0800 Staging: Merge 2.6.37-rc5 into staging-next This was done to handle a number of conflicts in the batman-adv and winbond drivers properly. It also now allows us to fix up the sysfs attributes properly that were not in the .37 release due to them being only in this tree at the time. Signed-off-by: Greg Kroah-Hartman commit ac33ac610dc613b2b1c938f8b61eef651ab72563 Author: Ben Hutchings Date: Tue Dec 7 18:29:52 2010 +0000 sfc: Log start and end of ethtool self-test at INFO level Add message at start of self-test and increase log level of message at end of self-test, so that any other messages produced during the test are clearly associated with it. Signed-off-by: Ben Hutchings commit 18fb5fe40ce7f789b5cfc3aa81ff1e6175b0a5be Author: Trond Myklebust Date: Tue Dec 7 12:41:58 2010 -0500 NFS: nfs_readdir_search_for_cookie() don't mark as eof if cookie not found If we're searching for a specific cookie, and it isn't found in the page cache, we should try an uncached_readdir(). To do so, we return EBADCOOKIE, but we don't set desc->eof. Signed-off-by: Trond Myklebust commit 81e8d2162566379adcf4b3700f03845c62577145 Merge: ff43fa8b41fe93cc62bb571a1bfeb487a3f79901 25c9170ed64a6551beefe9315882f754e14486f4 Author: Linus Torvalds Date: Tue Dec 7 08:14:28 2010 -0800 Merge branch 'irq-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip * 'irq-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: genirq: Fix incorrect proc spurious output commit ff43fa8b41fe93cc62bb571a1bfeb487a3f79901 Merge: c2048b0a0a6e589d9813766489f78185cbabcdc6 8b14d7b22c61f17ccb869e0047d9df6dd9f50a9f Author: Linus Torvalds Date: Tue Dec 7 08:14:04 2010 -0800 Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86 * 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86: wmi: use memcmp instead of strncmp to compare GUIDs ACPI, hp-wmi: Fix memory leak in acpi query msi-wmi: fix semantically incorrect use of keycode instead of scancode msi-wmi: Add mute key support asus-laptop: add wimax and wwan support eeepc-wmi: fix compiler warning ibm_rtl: _RTL_ is not available in UEFI mode ibm_rtl: Loosen the DMI criteria to all IBM machines drivers/platform/x86/thinkpad_acpi.c: delete double assignment eeepc-wmi: add cpufv sysfs documentation toshiba_acpi.c: Add key_entry for a lone FN keypress ibm_rtl: fix printk format warning commit c2048b0a0a6e589d9813766489f78185cbabcdc6 Merge: de47de7404e29df8de82f5822b4fde1a6ed97b54 8d7bfb4a891d606d52e1a99cf7231b4417b935dc Author: Linus Torvalds Date: Tue Dec 7 08:04:08 2010 -0800 Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6 * 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6: [S390] css: fix rsid evaluation for 2nd crw [S390] nohz/s390: fix arch_needs_cpu() return value on offline cpus commit ff2109f5f94ff75f45e0c8d2d1d56fefdf20733f Author: Tracey Dent Date: Sun Nov 21 15:03:12 2010 +0000 Net: bluetooth: Makefile: Remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit 2a7b1a00206895cfa444fd83477dca67a88a9d25 Author: Mark Brown Date: Tue Dec 7 15:32:38 2010 +0000 ASoC: Correct WM8962 interrupt mask register read Fix mismerge from the out of tree BSP where this support was developed. Signed-off-by: Mark Brown commit 6b464321d276e448d478c99202c19d83f2bd25f4 Author: Jassi Brar Date: Tue Dec 7 19:23:07 2010 +0900 ASoC: WM8580: Debug BCLK and sample size In case of SNDRV_PCM_FORMAT_S32_LE, we need to set WM8580_AIF_LENGTH_32, rather than WM8580_AIF_LENGTH_24. Also, the BCLK has to be 64fs, for sample size of 20, 24 and 32 bits. Signed-off-by: Jassi Brar Acked-by: Liam Girdwood Signed-off-by: Mark Brown commit de47de7404e29df8de82f5822b4fde1a6ed97b54 Author: Ian Kent Date: Tue Dec 7 13:04:00 2010 +0800 autofs4 - remove ioctl mutex (bz23142) With the recent changes to remove the BKL a mutex was added to the ioctl entry point for calls to the old ioctl interface. This mutex needs to be removed because of the need for the expire ioctl to call back to the daemon to perform a umount and receive a completion status (via another ioctl). This should be fine as the new ioctl interface uses much of the same code and it has been used without a mutex for around a year without issue, as was the original intention. Ref: Bugzilla bug 23142 Signed-off-by: Ian Kent Acked-by: Arnd Bergmann Signed-off-by: Linus Torvalds commit 681e36924788aeea2717c07cc42a21c9c86d7559 Author: Axel Lin Date: Tue Dec 7 20:56:30 2010 +0800 ASoC: Fix resource leak if soc_register_ac97_dai_link failed Properly free the resources in the case of soc_register_ac97_dai_link failure. Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown commit 33d6eb570b1f3fe5ba93cef465c5be66535c2c9a Author: Valentine Barshak Date: Mon Dec 6 18:16:11 2010 +0300 HID: Consolidate device existence checks in hiddev_ioctl Currently, if the device has been removed before hiddev_ioctl(), the -EIO is returned. If it's removed while hiddev_ioctl() is in progress, some commands are still processed fine, others return -ENODEV. This change takes the "existancelock" before processing ioctl commands and releases it at the end. If the device has been removed, always returns -ENODEV. Signed-off-by: Valentine Barshak Signed-off-by: Jiri Kosina commit 1a8e8fab790ea7af81b8f964fdec706ad1ec2271 Author: Valentine Barshak Date: Mon Dec 6 17:51:41 2010 +0300 HID: Fix race between disconnect and hiddev_ioctl A USB HID device can be disconnected at any time. If this happens right before or while hiddev_ioctl is in progress, the hiddev_ioctl tries to access invalid hiddev->hid pointer. When the hid device is disconnected, the hiddev_disconnect() ends up with a call to hid_device_release() which frees hid_device, but doesn't set the hiddev->hid pointer to NULL. If the deallocated memory region has been re-used by the kernel, this can cause a crash or memory corruption. Since disconnect can happen at any time, we can't initialize struct hid_device *hid = hiddev->hid at the beginning of ioctl and then use it. This change checks hiddev->exist flag while holding the existancelock and uses hid_device only if it exists. Signed-off-by: Valentine Barshak Signed-off-by: Jiri Kosina commit b38aa89600be39b3e10c5b6529aed2e66518598e Author: Ian Munsie Date: Mon Nov 29 11:53:07 2010 +1100 perf makefile: Allow strong and weak functions in LIB_OBJS When we build perf we place all of the .o files from the library files (util, arch/x/util, etc) into libperf.a which is then linked into perf. The problem is that the linker will by default only consider .o files within the .a archive if they are necessary to satisfy an unresolved symbol. As weak functions are not unresolved, it will not consider a .o file from the archive containing the strong versions of weak functions unless it requires it for another reason. This patch adds the --whole-archive flags to the linker when passing in the libperf.a file to ensure that it will consider every .o file in the archive, not just what it believes that it needs. The end result is that weak functions can now be overridden by strong variants of them in the libperf.a file. Cc: "tom.leiming" Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1290991642-sup-5890@au1.ibm.com> Signed-off-by: Ian Munsie Signed-off-by: Arnaldo Carvalho de Melo commit 7af4c0932437f97938eef67e553c8d211f9edf33 Author: Jesper Juhl Date: Sat Oct 30 15:56:54 2010 +0200 percpu: zero memory more efficiently in mm/percpu.c::pcpu_mem_alloc() Don't do vmalloc() + memset() when vzalloc() will do. tj: dropped unnecessary temp variable ptr. Signed-off-by: Jesper Juhl Signed-off-by: Tejun Heo commit 04910265078f08a73208beab70ed2a3cce4a919f Author: Tomasz Grobelny Date: Sat Dec 4 13:39:13 2010 +0100 dccp qpolicy: Parameter checking of cmsg qpolicy parameters Ensure that cmsg->cmsg_type value is valid for qpolicy that is currently in use. Signed-off-by: Tomasz Grobelny Signed-off-by: Gerrit Renker commit 871a2c16c21b988688b4ab1a78eadd969765c0a3 Author: Tomasz Grobelny Date: Sat Dec 4 13:38:01 2010 +0100 dccp: Policy-based packet dequeueing infrastructure This patch adds a generic infrastructure for policy-based dequeueing of TX packets and provides two policies: * a simple FIFO policy (which is the default) and * a priority based policy (set via socket options). Both policies honour the tx_qlen sysctl for the maximum size of the write queue (can be overridden via socket options). The priority policy uses skb->priority internally to assign an u32 priority identifier, using the same ranking as SO_PRIORITY. The skb->priority field is set to 0 when the packet leaves DCCP. The priority is supplied as ancillary data using cmsg(3), the patch also provides the requisite parsing routines. Signed-off-by: Tomasz Grobelny Signed-off-by: Gerrit Renker commit 7a1948768c2998f5bddb2327696cbe3161f468ed Author: Chris Wilson Date: Tue Dec 7 10:38:40 2010 +0000 drm/i915: Emit a request to clear a flushed and idle ring for unbusy bo In order for bos to retire eventually, a request must be sent down the ring. This is expected, for example, by occlusion queries for which mesa will wait upon (whilst running glean) before issuing more batches and so the normal activity upon the ring is suspended and we need to emit a request to clear the idle ring. Reported-by: Jinjin, Wang Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=30380 Signed-off-by: Chris Wilson commit e745a6676c76280f9721adeec79b08a0f2dfcc21 Author: Magnus Damm Date: Tue Nov 16 01:07:19 2010 +0100 ARM: 6481/1: Use shared GIC entry macros on OMAP Common GIC entry macro for omap Signed-off-by: Tony Lindgren Signed-off-by: Magnus Damm Acked-by: Santosh Shilimkar Signed-off-by: Russell King commit c91a2bd70a617a638e157a7e99d4b21ee0e7b1cf Author: Magnus Damm Date: Tue Nov 16 01:03:34 2010 +0100 ARM: 6480/1: Use shared GIC entry macros on Vexpress Use the GIC demux code in asm/hardware/entry-macro-gic.S on the Versatile Express subarchitecture. Signed-off-by: Magnus Damm Signed-off-by: Russell King commit 5488324a6cbae617d103c42944827d82d8f5efd4 Author: Magnus Damm Date: Tue Nov 16 01:02:06 2010 +0100 ARM: 6479/1: Use shared GIC entry macros on UX500 Use the GIC demux code in asm/hardware/entry-macro-gic.S on the UX500 subarchitecture. Signed-off-by: Magnus Damm Signed-off-by: Russell King commit 0005b349d5dc71471e1d47bd3efbf93f685620e1 Author: Magnus Damm Date: Tue Nov 16 01:00:40 2010 +0100 ARM: 6478/1: Use shared GIC entry macros on Tegra Use the GIC demux code in asm/hardware/entry-macro-gic.S on the Tegra subarchitecture. Signed-off-by: Magnus Damm Acked-by: Olof Johansson Signed-off-by: Russell King commit c4d8c80f59f0611d747399a774ebef71f517a30c Author: Magnus Damm Date: Tue Nov 16 00:58:43 2010 +0100 ARM: 6477/1: Use shared GIC entry macros on Realview Use the GIC demux code in asm/hardware/entry-macro-gic.S on the Realview subarchitecture. Signed-off-by: Magnus Damm Signed-off-by: Russell King commit 960351fb8e980f0aa6682f11630ff98d3a18e2c0 Author: Magnus Damm Date: Tue Nov 16 00:54:55 2010 +0100 ARM: 6476/1: Use shared GIC entry macros on CNS3XXX Use the GIC demux code in asm/hardware/entry-macro-gic.S on the CNS3XXX subarchitecture. Signed-off-by: Magnus Damm Signed-off-by: Russell King commit 161d1907607a5a562a152058c8daf1780ce7a00b Author: Magnus Damm Date: Tue Nov 16 00:48:07 2010 +0100 ARM: 6475/1: Introduce asm/hardware/entry-macro-gic.S This patch is the identical GIC demux implementation merge V3. Instead of implementing same code over and over simply share it in entry-macro-gic.S. The shared code is based on the realview implementation. Each GIC demux instance still has to setup the base address of the controller using the get_irqnr_preamble macro. The rest of the GIC specific code can be shared. Signed-off-by: Magnus Damm Acked-by: Srinidhi Kasagar Signed-off-by: Russell King commit 743411b3f3e96e8ac4cae73551a0a95392fed1ea Author: Felipe Balbi Date: Wed Dec 1 13:22:05 2010 +0200 usb: musb: make all glue layer export struct musb_platform_ops preparing to a big refactor on musb code. We need to be able to compile in all glue layers (or at least all ARM-based ones) together and have a working binary. While preparing for that, we move every glue layer to export only one symbol, which is a struct musb_platform_ops, and make all other functions static. Later patches will come to allow for compiling all glue layers together and have a working binary. Signed-off-by: Felipe Balbi commit 75b5293a5d176cd9caf6dc590da4f3458c048c3c Merge: 10a18d7dc0d9f12483c95ffc234118e9b80edfeb ce47dc56a2241dc035160a85bc5e34283cdd622c Author: Ingo Molnar Date: Tue Dec 7 07:51:14 2010 +0100 Merge branch 'perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux-2.6 into perf/core commit 10a18d7dc0d9f12483c95ffc234118e9b80edfeb Merge: f984ba4eb575e4a27ed28a76d4126d2aa9233c32 cf7d7e5a1980d1116ee152d25dac382b112b9c17 Author: Ingo Molnar Date: Tue Dec 7 07:49:48 2010 +0100 Merge commit 'v2.6.37-rc5' into perf/core Merge reason: Pick up the latest -rc. Signed-off-by: Ingo Molnar commit 3ca8abb84522f4b773678726db6ebd6fc277bc96 Author: Felipe Balbi Date: Thu Oct 21 13:56:40 2010 +0300 usb: musb: introduce struct musb_platform_ops This will be passed to musb_core by platform glue layer in order to make it easier to compile support for several HW glue layers. Later patches will come using this structure and also moving HW glue layers to its own platform driver; the idea is to be able to handle platform peculiarities in a manner which doesn't affect one another. Signed-off-by: Felipe Balbi commit cfa969e385a23e4c85f50e0ed5de25a2e18bf9d4 Author: David S. Miller Date: Mon Dec 6 20:45:28 2010 -0800 Revert "ehea: Use the standard logging functions" This reverts commit 539995d18649023199986424d140f1d620372ce5. As reported by Stephen Rothwell, this breaks the build. Signed-off-by: David S. Miller commit cf7d7e5a1980d1116ee152d25dac382b112b9c17 Author: Linus Torvalds Date: Mon Dec 6 20:09:04 2010 -0800 Linux 2.6.37-rc5 commit 086b17046c068ef3fa6e69c03c786b39ca617a0a Merge: da8f2e246183ae109f87694ee3f06e8fcca2931b 226291aa4641fa13cb5dec3bcb3379faa83009e2 Author: Linus Torvalds Date: Mon Dec 6 20:08:25 2010 -0800 Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2 * 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2: ocfs2_connection_find() returns pointer to bad structure ocfs2: char is not always signed Ocfs2: Stop tracking a negative dentry after dentry_iput(). ocfs2: fix memory leak fs/ocfs2/dlm: Use GFP_ATOMIC under spin_lock commit da8f2e246183ae109f87694ee3f06e8fcca2931b Author: Olof Johansson Date: Mon Dec 6 19:36:32 2010 -0600 ARM: tegra: fix regression from addruart rewrite Commit 0ea129300982 ("arm: return both physical and virtual addresses from addruart") took out the test for MMU on/off but didn't switch the ldr instructions to no longer be conditionals based on said test. Fix that. Signed-off-by: Olof Johansson Acked-by: Colin Cross Signed-off-by: Linus Torvalds commit 0e7d0c860a0dee49dacb7bbb248d1eba637075ad Author: Gabor Juhos Date: Mon Dec 6 17:14:47 2010 -0800 Input: add input driver for polled GPIO buttons The existing gpio-keys driver can be usable only for GPIO lines with interrupt support. Several devices have buttons connected to a GPIO line which is not capable to generate interrupts. This patch adds a new input driver using the generic GPIO layer and the input-polldev to support such buttons. [Ben Gardiner Signed-off-by: Ben Gardiner Tested-by: Ben Gardiner Signed-off-by: Dmitry Torokhov commit 03fa6fc5a68242ddd7cc3ba4255fe6f65b21ce41 Author: Hank Janssen Date: Mon Dec 6 12:26:51 2010 -0800 staging: hv: Convert camel case local variables in blkvsc.c to lowercase Convert camel case local variables in blkvsc.c to lowercase Signed-off-by: Abhishek Kane Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 2e6484acd28bb5223942d2608387af3ec9bf56f1 Author: Hank Janssen Date: Mon Dec 6 12:26:50 2010 -0800 staging: hv: Convert camel case function names in blkvsc.c to lowercase Convert camel case function names in blkvsc.c to lowercase Signed-off-by: Abhishek Kane Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit f638859e3203d1ae933e7f2114cca68f1ac407db Author: Hank Janssen Date: Mon Dec 6 12:26:49 2010 -0800 staging: hv: Convert camel case local variables in storvsc.c to lowercase Convert camel case local variables in storvsc.c to lowercase Signed-off-by: Abhishek Kane Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 02e37db7148a5ee98a742a0ff2f7e3acc406049b Author: Hank Janssen Date: Mon Dec 6 12:26:48 2010 -0800 staging: hv: Convert camel case function names in storvsc.c to lowercase Convert camel case function names in storvsc.c to lowercase Signed-off-by: Abhishek Kane Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 3d8cdf22b314f84cc4ae85ed650ccd37150a7562 Author: Hank Janssen Date: Mon Dec 6 12:26:47 2010 -0800 staging: hv: Convert camel case struct fields in storvsc.c to lowercase Convert camel cased struct fields in storvsc.c to lowercase Signed-off-by: Abhishek Kane Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit eb4f3e0aa6bef825b964159923e38a0e4c027084 Author: Hank Janssen Date: Mon Dec 6 12:26:46 2010 -0800 staging: hv: Convert camel case functions in storvsc_api.h to lowercase Convert camel case functions in storvsc_api.h to lowercase Signed-off-by: Abhishek Kane Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 8a046024a7cbbe9e4c16f4e34dda0f0dbcbc6723 Author: Hank Janssen Date: Mon Dec 6 12:26:45 2010 -0800 staging: hv: Convert camel case struct fields in storvsc_api.h to lowercase Convert camel case struct fields in vstorage.h to lowercase Signed-off-by: Abhishek Kane Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit d2aaba455fed75f231fe30fccfd25bcb8d8ff305 Author: Hank Janssen Date: Mon Dec 6 12:26:44 2010 -0800 staging: hv: Convert camel case struct fields in vstorage.h to lowercase Convert camel case struct fields in vstorage.h to lowercase Signed-off-by: Abhishek Kane Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 37db526463a5ad1c96cd803d49fddbf069bbf9b9 Author: Dan Carpenter Date: Mon Dec 6 10:03:38 2010 +0300 Staging: Beceem: more checkpatch.pl changes to InterfaceInit.c The only checkpatch.pl issues remaining still remaining are line length complaints. Signed-off-by: Dan Carpenter Signed-off-by: Greg Kroah-Hartman commit 07a7f68800a490bc1140de778e196f66ef4596d9 Author: Dan Carpenter Date: Mon Dec 6 10:03:13 2010 +0300 Staging: Beceem: improve debug printk statements These are just small changes. Some grammar and wording changes. I added new lines to the end of all the print statements. Signed-off-by: Dan Carpenter Signed-off-by: Greg Kroah-Hartman commit 6b74705e15d5c87181008f1ac984df7faaad55c9 Author: Dan Carpenter Date: Mon Dec 6 10:02:55 2010 +0300 Staging: Beceem: use after free in bcm_exit() We can't call class_destroy() until after the driver has been deregistered. It leads to a NULL deref on module unload. Signed-off-by: Dan Carpenter Signed-off-by: Greg Kroah-Hartman commit cd0b0ebfbe134b9c98fa8e628732b0e41b2cb48c Author: Dan Carpenter Date: Mon Dec 6 10:02:36 2010 +0300 Staging: Beceem: remove old kernel compatibility code This drops compatability for everything from 2.4 to 2.6.35. Now it only works on the latest kernel. Signed-off-by: Dan Carpenter Signed-off-by: Greg Kroah-Hartman commit c2a0b162dbce1534cf4e71914597419ae83a70d9 Author: Dan Carpenter Date: Mon Dec 6 10:02:11 2010 +0300 Staging: Beceem: white space changes to InterfaceInit.c This patch only changes: 1) spaces, tabs, and newline characters. 2) comment styles. The compiled object file is the same before and after except for line number changes. Signed-off-by: Dan Carpenter Signed-off-by: Greg Kroah-Hartman commit 2a314742d300edc2010d50a006c77ceb04c75119 Author: Dan Carpenter Date: Mon Dec 6 10:01:41 2010 +0300 Staging: Beceem: use lower case "int" instead of "INT" This patch changes: INT => int ULONG => unsigned long VOID => void Signed-off-by: Dan Carpenter Signed-off-by: Greg Kroah-Hartman commit 85c0b1760a7c259679d188bef58866fc641deca5 Author: Dan Carpenter Date: Mon Dec 6 10:01:16 2010 +0300 Staging: Beceem: add USB id for BCSM250 Mobile WiMAX Signed-off-by: Dan Carpenter Cc: stable Signed-off-by: Greg Kroah-Hartman commit e304151f150104412c9a304dffd6dc5c160ea336 Author: Roland Vossen Date: Mon Dec 6 22:42:48 2010 +0100 staging: brcm80211: replaced wlc_hw_info_t by struct wlc_hw_info Part of code cleanup effort. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit 8538576474e162e4967532a80305d17e871f2fa5 Author: Arend van Spriel Date: Sat Dec 4 16:35:43 2010 +0100 staging: brcm80211: remove macro usage for sk_buff release PKTFREE macro calls osl_pktfree. This function has been renamed to pkt_buf_free_skb as it comprises of functionality additional to dev_kfree_skb(_any) function and to get rid of the OSL concept in this driver. Reviewed-by: Brett Rudley Reviewed-by: Dowan Kim Signed-off-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit f09e02322ed36feafba6e3a6373e0bcd93730ce6 Author: Arend van Spriel Date: Sat Dec 4 16:35:42 2010 +0100 staging: brcm80211: remove macro usage for sk_buff allocation PKTGET macro calls osl_pktget. This function has been renamed to pkt_buf_get_skb as it comprises of functionality additional to dev_alloc_skb function and to get rid of the OSL concept in this driver. Reviewed-by: Brett Rudley Reviewed-by: Dowan Kim Signed-off-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit c6a9e1fc715763175842014a83a9ea70f7e19ace Author: Roland Vossen Date: Sat Dec 4 08:38:02 2010 +0100 staging: brcm80211: replaced wlc_info_t by struct wlc_info. Part of code cleanup effort. Global replace of wlc_info_t with struct wlc_info. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit e63449b7171fa19d1d2404179665d5ed146e8990 Author: Brett Rudley Date: Fri Dec 3 18:00:26 2010 -0800 staging: brcm80211: Removing cruft from osl.h Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 326a67977c15715d627525deade9e859f5cd5646 Author: Brett Rudley Date: Fri Dec 3 18:00:25 2010 -0800 staging: brcm80211: migrate register ops macros to bcmutils.h Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 8968af14f8e2d636fa5b4c055e240c1f359b8716 Author: Brett Rudley Date: Fri Dec 3 18:00:24 2010 -0800 staging: brcm80211: move dma specific macros from osl to dma code Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 411ee44ad30b2a8c99c3b225a3cf381ec37b000e Author: Brett Rudley Date: Fri Dec 3 16:30:39 2010 -0800 staging: brcm80211: move fullmac-only code from osl to fullmac files Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit ec7957049668b4fcf755cd8a085cfe258d77fc9b Author: Brett Rudley Date: Fri Dec 3 16:30:38 2010 -0800 staging: brcm80211: Remove unused softmac macros Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 7a9b48b3d3e0f373dc996efde56a5bff0944d8de Author: Brett Rudley Date: Fri Dec 3 16:30:37 2010 -0800 staging: brcm80211: Move osl_pub into osl Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 98ede2ed46cef38e98c8341d410323895f60570e Author: Brett Rudley Date: Fri Dec 3 16:30:36 2010 -0800 staging: brcm80211: OSLREGOPS is unused, remove checks for it. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit cb9675f3282f5565cc9e3698cc847355c1194871 Author: Vasiliy Kulikov Date: Fri Nov 26 17:06:02 2010 +0000 arm: plat-omap: counter_32k: use IS_ERR() instead of NULL check clk_get() returns ERR_PTR() on error, not NULL. Signed-off-by: Vasiliy Kulikov Acked-by: Kevin Hilman [tony@atomide.com: updated to include err.h to compile on omap1] Signed-off-by: Tony Lindgren commit 859158bfab7e72af440622fb9731bcaef4e7d6dc Author: Sukumar Ghorai Date: Fri Nov 19 14:45:26 2010 +0000 omap: nand: remove hardware ECC as default Commit 2c01946c6b9ebaa5a89710bc42ca224a7f52f227 (omap3 nand: cleanup virtual address usages) wrongly enabled CONFIG_MTD_NAND_OMAP_HWECC which breaks boards like beagle and pandora that use software ECC for write. Boards like beagle and pandora uses sw ecc for write (e.g. binary flushed from u-boot) and read from kernel. Signed-off-by: Sukumar Ghorai Acked-by: David Woodhouse [tony@atomide.com: updated comments] Signed-off-by: Tony Lindgren commit f811036476d7c8a9b594ebcdcf481bdbe497eb13 Author: Ohad Ben-Cohen Date: Fri Nov 26 23:59:24 2010 +0000 omap: zoom: wl1271 slot is MMC_CAP_POWER_OFF_CARD This patch complements ed919b0 "mmc: sdio: fix runtime PM anomalies by introducing MMC_CAP_POWER_OFF_CARD" by declaring MMC_CAP_POWER_OFF_CARD on the ZOOM's wl1271 mmc slot. This is required in order not to break runtime PM support for the wl1271 sdio driver. Signed-off-by: Ohad Ben-Cohen Signed-off-by: Chris Ball Signed-off-by: Tony Lindgren commit 7787d2c2f440cc7854bed3d039bf4cc59d9e7897 Merge: 60658f8a293750b59a8a844bf5c387139af9500a c9e664f1fdf34aa8cede047b206deaa8f1945af0 Author: Linus Torvalds Date: Mon Dec 6 15:51:14 2010 -0800 Merge branch 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6 * 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6: PM / Hibernate: Fix memory corruption related to swap PM / Hibernate: Use async I/O when reading compressed hibernation image commit cd38557d78554fd4318fe448f728a8d7ff1cbabb Author: Ben Hutchings Date: Mon Nov 15 23:53:11 2010 +0000 sfc: Use TX push whenever adding descriptors to an empty queue Whenever we add DMA descriptors to a TX ring and update the ring pointer, the TX DMA engine must first read the new DMA descriptors and then start reading packet data. However, all released Solarflare 10G controllers have a 'TX push' feature that allows us to reduce latency by writing the first new DMA descriptor along with the pointer update. This is only useful when the queue is empty. The hardware should ignore the pushed descriptor if the queue is not empty, but this check is buggy, so we must do it in software. In order to tell whether a TX queue is empty, we need to compare the previous transmission count (write_count) and completion count (read_count). However, if we do that every time we update the ring pointer then read_count may ping-pong between the caches of two CPUs running the transmission and completion paths for the queue. Therefore, we split the check for an empty queue between the completion path and the transmission path: - Add an empty_read_count field representing a point at which the completion path saw the TX queue as empty. - Add an old_write_count field for use on the completion path. - On the completion path, whenever read_count reaches or passes old_write_count the TX queue may be empty. We then read write_count, set empty_read_count if read_count == write_count, and update old_write_count. - On the transmission path, we read empty_read_count. If it's set, we compare it with the value of write_count before the current set of descriptors was added. If they match, the queue really is empty and we can use TX push. Signed-off-by: Ben Hutchings commit e506147271229d6c53b42c6a9897db67b5cfdb6d Author: Ben Hutchings Date: Mon Dec 6 22:58:41 2010 +0000 sfc: Remove locking from implementation of efx_writeo_paged() It is not necessary to serialise writes to the paged 128-bit registers. However, if we don't then we must always write the last dword separately, not as part of a qword write. Signed-off-by: Ben Hutchings commit 1a29cc40115c011895143c5f8278dee49423d5df Author: Ben Hutchings Date: Mon Dec 6 22:55:33 2010 +0000 sfc: Add compile-time checks for correctness of paged register writes Signed-off-by: Ben Hutchings commit 494bdf1b0fd58688d055f1b66c34b0844dcfc1fa Author: Ben Hutchings Date: Mon Dec 6 22:55:18 2010 +0000 sfc: Remove redundant memory barriers between MMIOs Signed-off-by: Ben Hutchings commit 9f2f6cd07a09bc0af1f2950189e426569561d1e6 Author: Ben Hutchings Date: Mon Dec 6 22:55:00 2010 +0000 sfc: Expand/correct comments on collector behaviour and function usage Document exactly which registers and functions have special behaviour, and why races on writes to descriptor pointers are safe. Signed-off-by: Ben Hutchings commit 51c56f40ef41ca780ff001d59727eda03fa39374 Author: Ben Hutchings Date: Wed Nov 10 18:46:40 2010 +0000 sfc: Use ACCESS_ONCE when copying efx_tx_queue::read_count Signed-off-by: Ben Hutchings commit ab28c12a8e6fea875b6757052e211772f62fa771 Author: Ben Hutchings Date: Mon Dec 6 22:53:15 2010 +0000 sfc: Reorder struct efx_nic to separate fields by volatility Place the regularly updated fields (locks, MAC stats, etc.) on a separate cache-line from fields which are mostly constant. This should reduce cache misses for access to the latter on the data path. Signed-off-by: Ben Hutchings commit c9e664f1fdf34aa8cede047b206deaa8f1945af0 Author: Rafael J. Wysocki Date: Fri Dec 3 22:57:45 2010 +0100 PM / Hibernate: Fix memory corruption related to swap There is a problem that swap pages allocated before the creation of a hibernation image can be released and used for storing the contents of different memory pages while the image is being saved. Since the kernel stored in the image doesn't know of that, it causes memory corruption to occur after resume from hibernation, especially on systems with relatively small RAM that need to swap often. This issue can be addressed by keeping the GFP_IOFS bits clear in gfp_allowed_mask during the entire hibernation, including the saving of the image, until the system is finally turned off or the hibernation is aborted. Unfortunately, for this purpose it's necessary to rework the way in which the hibernate and suspend code manipulates gfp_allowed_mask. This change is based on an earlier patch from Hugh Dickins. Signed-off-by: Rafael J. Wysocki Reported-by: Ondrej Zary Acked-by: Hugh Dickins Reviewed-by: KAMEZAWA Hiroyuki Cc: stable@kernel.org commit 60658f8a293750b59a8a844bf5c387139af9500a Merge: 771f8bc71c31c6bd103cdec283012253f352ab1c f444a57ca10fa7c199f1daf1cebd1fd329004992 Author: Linus Torvalds Date: Mon Dec 6 14:49:51 2010 -0800 Merge master.kernel.org:/home/rmk/linux-2.6-arm * master.kernel.org:/home/rmk/linux-2.6-arm: ARM: 6524/1: GIC irq desciptor bug fix ARM: 6523/1: iop: ensure sched_clock() is notrace ARM: 6456/1: Fix for building DEBUG with sa11xx_base.c as a module. ARM: 6519/1: kuser: Fix incorrect cmpxchg syscall in kuser helpers ARM: 6505/1: kprobes: Don't HAVE_KPROBES when CONFIG_THUMB2_KERNEL is selected ARM: 6508/1: vexpress: Correct data alignment in headsmp.S for CONFIG_THUMB2_KERNEL ARM: 6507/1: RealView: Correct data alignment in headsmp.S for CONFIG_THUMB2_KERNEL ARM: 6504/1: Thumb-2: Fix long-distance conditional branches in head.S for Thumb-2. ARM: 6503/1: Thumb-2: Restore sensible zImage header layout for CONFIG_THUMB2_KERNEL ARM: 6502/1: Thumb-2: Fix CONFIG_THUMB2_KERNEL breakage in compressed/head.S ARM: 6501/1: Thumb-2: Correct data alignment for CONFIG_THUMB2_KERNEL in mm/proc-v7.S ARM: 6500/1: Thumb-2: Correct data alignment for CONFIG_THUMB2_KERNEL in kernel/head.S ARM: 6499/1: Thumb-2: Correct data alignment for CONFIG_THUMB2_KERNEL in bootp/init.S ARM: 6498/1: vfp: Correct data alignment for CONFIG_THUMB2_KERNEL ARM: 6497/1: kexec: Correct data alignment for CONFIG_THUMB2_KERNEL ARM: 6496/1: GIC: Do not try to register more then NR_IRQS interrupts ARM: cns3xxx: Fix build with CONFIG_PCI=y commit 884639996814585ef7079daa9e03a1eb562e235c Author: Jeff Layton Date: Mon Nov 22 15:31:03 2010 -0500 cifs: remove Local_System_Name ...this string is zeroed out and nothing ever changes it. Signed-off-by: Jeff Layton Signed-off-by: Steve French commit 9f339caf8454f0c21983111350ede93983db4340 Author: Bojan Smojver Date: Thu Nov 25 23:41:39 2010 +0100 PM / Hibernate: Use async I/O when reading compressed hibernation image This is a fix for reading LZO compressed image using async I/O. Essentially, instead of having just one page into which we keep reading blocks from swap, we allocate enough of them to cover the largest compressed size and then let block I/O pick them all up. Once we have them all (and here we wait), we decompress them, as usual. Obviously, the very first block we still pick up synchronously, because we need to know the size of the lot before we pick up the rest. Also fixed the copyright line, which I've forgotten before. Signed-off-by: Bojan Smojver Signed-off-by: Rafael J. Wysocki commit 8b14d7b22c61f17ccb869e0047d9df6dd9f50a9f Author: Thadeu Lima de Souza Cascardo Date: Sun Nov 28 19:46:50 2010 -0200 wmi: use memcmp instead of strncmp to compare GUIDs While looking for the duplicates in /sys/class/wmi/, I couldn't find them. The code that looks for duplicates uses strncmp in a binary GUID, which may contain zero bytes. The right function is memcmp, which is also used in another section of wmi code. It was finding 49142400-C6A3-40FA-BADB-8A2652834100 as a duplicate of 39142400-C6A3-40FA-BADB-8A2652834100. Since the first byte is the fourth printed, they were found as equal by strncmp. Signed-off-by: Thadeu Lima de Souza Cascardo Signed-off-by: Matthew Garrett Cc: stable@kernel.org commit 40fe7d88ab3eb711b307fab1b92aa6870914c975 Author: Tobias Klauser Date: Thu Dec 2 07:22:05 2010 +0000 net: cris/eth_v10: Use net_device_stats from struct net_device_stats struct net_device has its own struct net_device_stats member, so use this one instead of a private copy in struct net_local. Note: This patch was not even compile tested. Signed-off-by: Tobias Klauser Signed-off-by: David S. Miller commit b27d50a9ff5cf2775b7a4daf571a0cc72d013b9c Author: Tobias Klauser Date: Thu Dec 2 07:20:39 2010 +0000 net: emaclite: Omit private ndo_get_stats function xemaclite_get_stats() just returns dev->stats so we can leave it out alltogether and let dev_get_stats() do the job. Signed-off-by: Tobias Klauser Signed-off-by: David S. Miller commit e176bbc5893bef36a0909de31dea97865660a7c9 Author: Tobias Klauser Date: Thu Dec 2 07:20:05 2010 +0000 net: am79c961a: Omit private ndo_get_stats function am79c961_getstats() just returns dev->stats so we can leave it out alltogether and let dev_get_stats() do the job. Signed-off-by: Tobias Klauser Acked-by: Russell King Signed-off-by: David S. Miller commit 9f91170773d852e65e4fc36e1f8173ce614f62e1 Author: Don Skidmore Date: Fri Dec 3 13:24:05 2010 +0000 ixgbe: fix enum type mismatch on disable laser Fixes a recent bug on the patch (c6ecf39a10ceec3e97096e2a8d3eadcecd593422) that disabled the laser on ifconfig down. Compilers were seeing a enum mismatch. Signed-off-by Don Skidmore Signed-off-by: Jeff Kirsher Signed-off-by: David S. Miller commit a7f5a5fcd9f13afd3471a0de8c1fdaa8f989497c Author: Don Skidmore Date: Fri Dec 3 13:23:30 2010 +0000 ixgbe: fix for link failure on SFP+ DA cables This patch helps prevent FW/SW semaphore collision from leading to link establishment failure. The collision might mess up the PHY registers so we reset the PHY. However there are SFI/KR areas in the PHY that are not reset with a Reset_AN so we need to change LMS to reset it. Also wait until AN state machine is AN_GOOD Signed-off-by: Don Skidmore Tested-by: Stephen Ko Signed-off-by: Jeff Kirsher Signed-off-by: David S. Miller commit b8eb3a1046f68a5b8f284830d971c62688cd606b Author: Don Skidmore Date: Wed Dec 1 20:54:53 2010 +0000 ixgbe: fix possible NULL pointer deference in shutdown path After freeing the rings we were not zeroing out the ring count values. This patch now clears these counts correctly. Reported-by: Yinghai Lu Signed-off-by: Don Skidmore Tested-by: Stephen Ko Signed-off-by: Jeff Kirsher Signed-off-by: David S. Miller commit 8917a3c0b7d1557548f50bfe3f0e18e0354e38f6 Author: David Shwatrz Date: Thu Dec 2 09:01:55 2010 +0000 Fix a typo in datagram.c and sctp/socket.c. Hi, This patch fixes a typo in net/core/datagram.c and in net/sctp/socket.c Regards, David Shwartz Signed-off-by: David Shwartz Signed-off-by: David S. Miller commit 22de94de7de78b8de2fb1f2df5aa85b5556cfcfd Author: Stanislaw Gruszka Date: Fri Dec 3 15:41:48 2010 +0100 iwlwifi: jiffies based tx queues watchdog This patch replace monitor/recover timer by watchdog based on time stamp. New code allow to discover hangs more precisely. Timeout values are currently doubled monitoring period values of previous timer. This have to be tuned based of firmware timing capabilities. Tested on 3945, 4965, 5300, 6300. Signed-off-by: Stanislaw Gruszka Acked-by: Wey-Yi Guy Signed-off-by: John W. Linville commit abc471dc31be15f9fee5ec77f25d31b927d334b9 Author: Stanislaw Gruszka Date: Fri Dec 3 15:41:47 2010 +0100 iwl3945: prevent too frequent firmware resets Similarly like on iwlagn, initialize reset duration on iwl3945 to prevent too frequent firmware resets. Signed-off-by: Stanislaw Gruszka Acked-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 29cbe68c516a48a9a88b3226878570c6cbd83c02 Author: Johannes Berg Date: Fri Dec 3 09:20:44 2010 +0100 cfg80211/mac80211: add mesh join/leave commands Instead of tying mesh activity to interface up, add join and leave commands for mesh. Since we must be backward compatible, let cfg80211 handle joining a mesh if a mesh ID was pre-configured when the device goes up. Note that this therefore must modify mac80211 as well since mac80211 needs to lose the logic to start the mesh on interface up. We now allow querying mesh parameters before the mesh is connected, which simply returns defaults. Setting them (internally renamed to "update") is only allowed while connected. Specify them with the new mesh join command instead where needed. In mac80211, beaconing must now also follow the mesh enabled/not enabled state, which is done by testing the mesh ID. Signed-off-by: Javier Cardona Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit bd90fdcc5fbd99a2a778999610420cf793bd1be2 Author: Johannes Berg Date: Fri Dec 3 09:20:43 2010 +0100 nl80211: refactor mesh parameter parsing I'm going to need this in a new place later. Tested-by: Javier Cardona Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit f9e10ce4cf86945eb5efcab31284c971877ed012 Author: Johannes Berg Date: Fri Dec 3 09:20:42 2010 +0100 cfg80211: require add_virtual_intf to return new dev cfg80211 used to do all its bookkeeping in the notifier, but some new stuff will have to use local variables so make the callback return the netdev pointer. Tested-by: Javier Cardona Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 09b174702601079c3a04806754be30ffbd70db4d Author: Johannes Berg Date: Fri Dec 3 09:20:41 2010 +0100 mac80211: move mesh filter adjusting Logically, the filter adjusting belongs with starting/stopping mesh, not interface up/down, so move it there. Tested-by: Javier Cardona Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 45904f21655cf4f0ae7d0fab5906fe51bf56ecf4 Author: Javier Cardona Date: Fri Dec 3 09:20:40 2010 +0100 nl80211/mac80211: define and allow configuring mesh element TTL The TTL in path selection information elements is different from the mesh ttl used in mesh data frames. Version 7.03 of the 11s draft calls this ttl 'Element TTL'. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit b9e61f11f47035e3b4545b51fb547fef48eb3096 Author: Nick Kossifidis Date: Fri Dec 3 06:12:39 2010 +0200 ath5k: Include tx ack reporting on hw flags * Since we report tx acks to the protocol stack, add the needed flag to hw_flags. This way we'll also use the new AP probing mechanism. Signed-off-by: Nick Kossifidis Tested-by: Sedat Dilek Signed-off-by: John W. Linville commit f0e134a53ad95ba7a393b299ae56c9bdcaed8aec Author: Nick Kossifidis Date: Fri Dec 3 06:09:38 2010 +0200 ath5k: Fix reporting of RX dma stop failure * Correctly report failure to stop RX DMA Signed-off-by: Nick Kossifidis Tested-by: Sedat Dilek Signed-off-by: John W. Linville commit 344b54b971bc5578281264fb6896e13b4120352b Author: Nick Kossifidis Date: Fri Dec 3 06:07:13 2010 +0200 ath5k: Disable ANI during reset * Stop ANI durring reset to prevent false PHY error reports Signed-off-by: Nick Kossifidis Tested-by: Sedat Dilek Signed-off-by: John W. Linville commit 19252ecb672d3f35959c576d1d26b9aca350f5bf Author: Nick Kossifidis Date: Fri Dec 3 06:05:19 2010 +0200 ath5k: Always free tx buffers before reset * Always free tx buffers before reset, since we also empty hw queues. If we don't and a queue gets stuck, we'll never decrease txq_len and sw will keep thinking the queue is still stuck even after reset. Signed-off-by: Nick Kossifidis Tested-by: Sedat Dilek Signed-off-by: John W. Linville commit 2d5311e4e8272fd398fc1cf278f12fd6dee4074b Author: Eric Dumazet Date: Wed Dec 1 20:46:24 2010 +0000 filter: add a security check at install time We added some security checks in commit 57fe93b374a6 (filter: make sure filters dont read uninitialized memory) to close a potential leak of kernel information to user. This added a potential extra cost at run time, while we can perform a check of the filter itself, to make sure a malicious user doesnt try to abuse us. This patch adds a check_loads() function, whole unique purpose is to make this check, allocating a temporary array of mask. We scan the filter and propagate a bitmask information, telling us if a load M(K) is allowed because a previous store M(K) is guaranteed. (So that sk_run_filter() can possibly not read unitialized memory) Note: this can uncover application bug, denying a filter attach, previously allowed. Signed-off-by: Eric Dumazet Cc: Dan Rosenberg Cc: Changli Gao Acked-by: Changli Gao Signed-off-by: David S. Miller commit ae9c416d686db74f67d73c1bebf1e3a7e8b3c5b5 Author: Changli Gao Date: Wed Dec 1 20:07:31 2010 +0000 net: arp: use assignment Only when dont_send is 0, arp_filter() is consulted, so we can simply assign the return value of arp_filter() to dont_send instead. Signed-off-by: Changli Gao Signed-off-by: David S. Miller commit 6464281161e46254ac39505ad41d21dbe7d1738f Author: Sathya Perla Date: Wed Dec 1 01:04:17 2010 +0000 be2net: Handle out of buffer completions for lancer If Lancer chip does not have posted RX buffers, it posts an RX completion entry with the same frag_index as the last valid completion. The Error bit is also set. In BE, a flush completion is indicated with a zero value for num_rcvd in the completion. Such completions don't carry any data and are not processed. This patch refactors code to handle both cases with the same code. Signed-off-by: Padmanabh Ratnakar Signed-off-by: Sathya Perla Signed-off-by: David S. Miller commit 359a972fae84242efa26b86bf09c3ac3784405ba Author: Sathya Perla Date: Wed Dec 1 01:03:36 2010 +0000 be2net: FW init cmd fix for lancer Lancer can use the same pattern as BE to indicate a driver load to the FW. Signed-off-by: Padmanabh Ratnakar Signed-off-by: Sathya Perla Signed-off-by: David S. Miller commit 63657b9c319588cd35ed869e19cc6255dbef0d20 Author: Sathya Perla Date: Wed Dec 1 01:02:28 2010 +0000 be2net: Fix be_dev_family_check() return value check Signed-off-by: Sathya Perla Signed-off-by: David S. Miller commit c56b4d90123b77e29a91b9b96bb791f929139d8e Author: Changli Gao Date: Wed Dec 1 02:52:57 2010 +0000 af_packet: remove pgv.flags As we can check if an address is vmalloc address with is_vmalloc_addr(), we remove pgv.flags. Then we may get more pg_vecs. Signed-off-by: Changli Gao Signed-off-by: David S. Miller commit 0af55bb58f8fa7865004ac48d16affe125ac1b7f Author: Changli Gao Date: Wed Dec 1 02:52:20 2010 +0000 af_packet: use vmalloc_to_page() instead for the addresss returned by vmalloc() The following commit causes the pgv->buffer may point to the memory returned by vmalloc(). And we can't use virt_to_page() for the vmalloc address. This patch introduces a new inline function pgv_to_page(), which calls vmalloc_to_page() for the vmalloc address, and virt_to_page() for the __get_free_pages address. We used to increase page pointer to get the next page at the next page address, after Neil's patch, it is wrong, as the physical address may be not continuous. This patch also fixes this issue. commit 0e3125c755445664f00ad036e4fc2cd32fd52877 Author: Neil Horman Date: Tue Nov 16 10:26:47 2010 -0800 packet: Enhance AF_PACKET implementation to not require high order contiguous memory allocation (v4) Signed-off-by: Changli Gao Signed-off-by: David S. Miller commit f7fce74e387e0563e5a165704664aa5ee8b2f48b Author: Eric Dumazet Date: Wed Dec 1 06:03:06 2010 +0000 net: kill an RCU warning in inet_fill_link_af() commits 9f0f7272 (ipv4: AF_INET link address family) and cf7afbfeb8c (rtnl: make link af-specific updates atomic) used incorrect __in_dev_get_rcu() in RTNL protected contexts, triggering PROVE_RCU warnings. Switch to __in_dev_get_rtnl(), wich is more appropriate, since we hold RTNL. Based on a report and initial patch from Amerigo Wang. Reported-by: Amerigo Wang Signed-off-by: Eric Dumazet Cc: Thomas Graf Reviewed-by: WANG Cong Signed-off-by: David S. Miller commit 06a9701f4b3e3381dea96fee1cc8a3bb41b0a1f1 Author: Eric Dumazet Date: Wed Dec 1 01:37:42 2010 +0000 __in_dev_get_rtnl() can use rtnl_dereference() If caller holds RTNL, we dont need a memory barrier (smp_read_barrier_depends) included in rcu_dereference(). Just use rtnl_dereference() to properly document the assertions. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit da2033c282264bfba4e339b7cb3df62adb5c5fc8 Author: Eric Dumazet Date: Tue Nov 30 21:45:56 2010 +0000 filter: add SKF_AD_RXHASH and SKF_AD_CPU Add SKF_AD_RXHASH and SKF_AD_CPU to filter ancillary mechanism, to be able to build advanced filters. This can help spreading packets on several sockets with a fast selection, after RPS dispatch to N cpus for example, or to catch a percentage of flows in one queue. tcpdump -s 500 "cpu = 1" : [0] ld CPU [1] jeq #1 jt 2 jf 3 [2] ret #500 [3] ret #0 # take 12.5 % of flows (average) tcpdump -s 1000 "rxhash & 7 = 2" : [0] ld RXHASH [1] and #7 [2] jeq #2 jt 3 jf 4 [3] ret #1000 [4] ret #0 Signed-off-by: Eric Dumazet Cc: Rui Acked-by: Changli Gao Signed-off-by: David S. Miller commit 539995d18649023199986424d140f1d620372ce5 Author: Joe Perches Date: Tue Nov 30 08:18:44 2010 +0000 ehea: Use the standard logging functions Remove ehea_error, ehea_info and ehea_debug macros. Use pr_fmt, pr_, netdev_ and netif_ as appropriate. Fix messages to use trailing "\n", some messages had an extra one as the old ehea_ macros added a trailing "\n". Coalesced long format strings. Uncompiled/untested. Signed-off-by: Joe Perches Signed-off-by: Breno Leitao Signed-off-by: David S. Miller commit 7903264402546f45f9bac8ad2bfdb00d00eb124a Author: MichaÅ‚ MirosÅ‚aw Date: Tue Nov 30 06:38:00 2010 +0000 net: Fix too optimistic NETIF_F_HW_CSUM features NETIF_F_HW_CSUM is a superset of NETIF_F_IP_CSUM+NETIF_F_IPV6_CSUM, but some drivers miss the difference. Fix this and also fix UFO dependency on checksumming offload as it makes the same mistake in assumptions. Signed-off-by: MichaÅ‚ MirosÅ‚aw Acked-by: Jon Mason Signed-off-by: David S. Miller commit 900d495a189dc3ff5952b98a77d18e3018f8286c Author: Alexey Orishko Date: Mon Nov 29 23:23:28 2010 +0000 USB CDC NCM host driver The patch provides USB CDC NCM host driver support in the Linux Kernel. Changes: drivers/net/usb/cdc_ncm.c: - initial submission of the CDC NCM host driver; - verified on Intel 32/64 bit, Intel Atom, ST-Ericsson U8500 (ARM) - throughput measured over 100 Mbits duplex; - driver supports 16-bit NTB format only, but it is more than enough for transfers up to 64K; - driver can handle up to 32 datagrams in received NTB; - timer is used to collect several packets in Tx direction drivers/net/usb/Kconfig: - a new entry to compile CDC NCM host driver drivers/net/usb/Makefile: - a new entry to compile CDC NCM host driver Signed-off-by: Alexey Orishko Signed-off-by: David S. Miller commit 073285fd392f6dc901da7c698d46e1e2a7e26436 Author: Alexey Orishko Date: Mon Nov 29 23:23:27 2010 +0000 usbnet: changes for upcoming cdc_ncm driver Changes: include/linux/usb/usbnet.h: - a new flag to indicate driver's capability to accumulate IP packets in Tx direction and extract several packets from single skb in Rx direction. drivers/net/usb/usbnet.c: - the procedure of counting packets in usbnet was updated due to the accumulating of IP packets in the driver - no short packets are sent if indicated by the flag in driver_info structure Signed-off-by: Alexey Orishko Signed-off-by: David S. Miller commit d84938c9be85f4738a350ef44210789fef915cb7 Author: Nick Kossifidis Date: Fri Dec 3 06:03:00 2010 +0200 ath5k: Always write tx powertable on hw * By skipping tx power table calibration we also skip setting tx power table on hw. Make sure we always write tx power table on hw since it gets cleared on reset. Signed-off-by: Nick Kossifidis Tested-by: Sedat Dilek Signed-off-by: John W. Linville commit 04ac3c0ee2c773c321ec472d892635a20556f34d Author: Felix Fietkau Date: Thu Dec 2 21:01:08 2010 +0100 mac80211: speed up AP probing using nullfunc frames If the nullfunc frame used to probe the AP was not acked, there is no point in waiting for the probe timeout, so advance to the next try (or disconnect) immediately. If we do reach the probe timeout without having received a tx status, the connection is probably really bad and worth disconnecting. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 75706d0e9d19601534446982b70102bb9327169b Author: Felix Fietkau Date: Thu Dec 2 21:01:07 2010 +0100 mac80211: remove a redundant check ieee80211_is_nullfunc() implies ieee80211_is_data() Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit af5568843594fb71055debe36e521fa8072fcecc Author: Bruno Randolf Date: Thu Dec 2 19:50:37 2010 +0900 lib: Improve EWMA efficiency by using bitshifts Using bitshifts instead of division and multiplication should improve performance. That requires weight and factor to be powers of two, but i think this is something we can live with. Thanks to Peter Zijlstra for the improved formula! Signed-off-by: Bruno Randolf -- v2: use log2.h functions Signed-off-by: John W. Linville commit 5dcc03fe29537edd7819f5b121bf3d779693f37b Author: Bruno Randolf Date: Thu Dec 2 19:12:31 2010 +0900 ath5k: Use EWMA factor of 1024 instead of 1000 This prepares the only place which uses the EWMA library so far for the performance improved implementation coming up, which requires factor and weight to be a power of two. Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit 9a10a870e09f1fd50fd024d55232b4b72cf4e387 Author: Joe Perches Date: Wed Dec 1 09:37:55 2010 -0800 MAINTAINERS: Add ATH GENERIC UTILITIES This file pattern is not currently shown as maintained by atheros. Perhaps it should be? Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit c1ce5a74d113f221d40625bd3ad83df2db2695b7 Author: Helmut Schaa Date: Wed Dec 1 16:34:45 2010 +0100 mac80211: Update last_tx_rate only for data frames The last_tx_rate field was also updated for non-data frames that are often sent with a lower rate (for example management frames at 1 Mbps). This is confusing when the data rate is actually much higher. Hence, only update the last_tx_rate field with tx rate information gathered from last data frames. If the rate control algorithm filled in txrc.reported_rate we don't need to verify this information. Cc: Johannes Berg Signed-off-by: Helmut Schaa Signed-off-by: John W. Linville commit 5f79ed3b1aa7af260c82ba714b90907070aeca7a Merge: 09f921f83faa49cdea25abfb98c439c01526b89d 9f28ebc381ca00af0f9033a29776775068344b06 Author: John W. Linville Date: Mon Dec 6 15:52:27 2010 -0500 Merge branch 'wireless-next-2.6' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-2.6 commit f435d9eea01309aa7b6c1f134569a7b5957918ae Merge: 5ee493767352314893520ac40aec5bb07d0147e0 09f921f83faa49cdea25abfb98c439c01526b89d Author: John W. Linville Date: Mon Dec 6 15:35:34 2010 -0500 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem commit 79df1baeec29022e4181f2964187b88661ef5517 Author: Jeff Layton Date: Mon Dec 6 12:52:08 2010 -0500 cifs: fix use of CONFIG_CIFS_ACL Some of the code under CONFIG_CIFS_ACL is dependent upon code under CONFIG_CIFS_EXPERIMENTAL, but the Kconfig options don't reflect that dependency. Move more of the ACL code out from under CONFIG_CIFS_EXPERIMENTAL and under CONFIG_CIFS_ACL. Also move find_readable_file out from other any sort of Kconfig option and make it a function normally compiled in. Reported-and-Acked-by: Randy Dunlap Signed-off-by: Jeff Layton Signed-off-by: Steve French commit 991cfffa7c19aa648546aff666595af896e568ba Author: Feng Tang Date: Fri Dec 3 11:51:37 2010 +0800 x86, earlyprintk: Move mrst early console to platform/ and fix a typo Move the code to arch/x86/platform/mrst/. Also fix a typo to use the correct config option: ONFIG_EARLY_PRINTK_MRST Signed-off-by: Feng Tang Cc: alan@linux.intel.com LKML-Reference: <1291348298-21263-1-git-send-email-feng.tang@intel.com> Signed-off-by: Thomas Gleixner commit 5ee493767352314893520ac40aec5bb07d0147e0 Author: Matt Carlson Date: Mon Dec 6 08:28:54 2010 +0000 tg3: Update version to 3.116 This patch updates the tg3 version to 3.116. Signed-off-by: Matt Carlson Reviewed-by: Benjamin Li Signed-off-by: David S. Miller commit a386b9011a4687470e6168e2f2a08c468f25f72f Author: Matt Carlson Date: Mon Dec 6 08:28:53 2010 +0000 tg3: Relax EEE thresholds The hardware defaults to fairly aggressive EEE thresholds. While there appear to be no ill effects, this patch relaxes them, just as a precaution. Signed-off-by: Matt Carlson Reviewed-by: Benjamin Li Signed-off-by: David S. Miller commit a6b68dab169e2a51e59f43504f1279cbc2afcde8 Author: Matt Carlson Date: Mon Dec 6 08:28:52 2010 +0000 tg3: Minor EEE code tweaks The first hunk of this patch makes sure that the driver checks for the appropriate preconditions before checking if EEE negotiation succeeded. More specifically the link needs to be full duplex for EEE to be enabled. The second and third hunks of this patch fix a bug where the eee advertisement register would be programmed with extra bits set. The fourth hunk of this patch makes sure the EEE capability flag is not set for 5718 A0 devices and that the device is not a serdes device. None of these modifications are strictly necessary. The driver / hardware still does the right thing. They are submitted primarily for correctness. Signed-off-by: Matt Carlson Reviewed-by: Benjamin Li Signed-off-by: David S. Miller commit 699c019385fcb13498a5a3a8bd368f04f1d4a223 Author: Matt Carlson Date: Mon Dec 6 08:28:51 2010 +0000 tg3: Fix 57765 EEE support EEE support in the 57765 internal phy will not enable after a phy reset unless it sees that EEE is supported in the MAC. This patch moves the code that programs the CPMU EEE registers to a place before the phy reset. Signed-off-by: Matt Carlson Reviewed-by: Benjamin Li Signed-off-by: David S. Miller commit 3110f5f5545a645c50ef66b1f705d08dfd1df404 Author: Matt Carlson Date: Mon Dec 6 08:28:50 2010 +0000 tg3: Move EEE definitions into mdio.h In commit 52b02d04c801fff51ca49ad033210846d1713253 entitled "tg3: Add EEE support", Ben Hutchings had commented that the EEE advertisement register will be in a standard location. This patch moves that definition into mdio.h and changes the code to use it. Signed-off-by: Matt Carlson Reviewed-by: Benjamin Li Signed-off-by: David S. Miller commit 8fc2f9956127d2b85280c07e69aeb08b9bd85150 Author: Matt Carlson Date: Mon Dec 6 08:28:49 2010 +0000 tg3: Raise the jumbo frame BD flag threshold The current transmit routines set the jumbo frame BD flag too aggressively. This can reduce performance for common cases. This patch raises the jumbo flag threshold to 1518, up from 1500. Signed-off-by: Matt Carlson Reviewed-by: Benjamin Li Signed-off-by: David S. Miller commit 183f732c3f3f307d5673e17b69de6894e1dd2918 Author: Johan Hedberg Date: Mon Dec 6 15:56:17 2010 +0200 Bluetooth: Fix initial RFCOMM DLC security level Due to commit 63ce0900 connections initiated through TTYs created with "rfcomm bind ..." would have security level BT_SECURITY_SDP instead of BT_SECURITY_LOW. This would cause instant connection failure between any two SSP capable devices due to the L2CAP connect request to RFCOMM being sent before authentication has been performed. This patch fixes the regression by always initializing the DLC security level to BT_SECURITY_LOW. Signed-off-by: Johan Hedberg Acked-by: Luiz Augusto von Dentz Signed-off-by: Gustavo F. Padovan commit 1cd275f609ba46c8cae3ee77e499c54a0d13a983 Author: Sage Weil Date: Mon Dec 6 09:45:22 2010 -0800 ceph: fix ioctl magic The ioctl magic was inadvertently changed in 571dba52. Signed-off-by: Sage Weil commit df6bd743b6f06b066c1c3ba7f2853a6e8d61468c Author: Gustavo F. Padovan Date: Mon Jun 14 02:26:15 2010 -0300 Bluetooth: Don't accept ConfigReq if we aren't in the BT_CONFIG state If such event happens we shall reply with a Command Reject, because we are not expecting any configure request. Signed-off-by: Gustavo F. Padovan Signed-off-by: Marcel Holtmann commit 46bcf14f44d8f31ecfdc8b6708ec15a3b33316d9 Author: Eric Dumazet Date: Mon Dec 6 09:29:43 2010 -0800 filter: fix sk_filter rcu handling Pavel Emelyanov tried to fix a race between sk_filter_(de|at)tach and sk_clone() in commit 47e958eac280c263397 Problem is we can have several clones sharing a common sk_filter, and these clones might want to sk_filter_attach() their own filters at the same time, and can overwrite old_filter->rcu, corrupting RCU queues. We can not use filter->rcu without being sure no other thread could do the same thing. Switch code to a more conventional ref-counting technique : Do the atomic decrement immediately and queue one rcu call back when last reference is released. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 18483b81ee7e70ee68d4b18be618be5cfcc0b290 Author: Arnaldo Carvalho de Melo Date: Mon Dec 6 15:13:38 2010 -0200 perf record: Fix eternal wait for stillborn child When execvp fails to find the specified command on the path we won't get SIGCHLD, so send a SIGUSR1 and exit right away. Current situation would require a SIGINT performed by the user and would produce meaningless summary. Now: [acme@emilia linux]$ ./foo -bash: ./foo: No such file or directory [acme@emilia linux]$ perf record ./foo ./foo: No such file or directory [acme@emilia linux]$ Acked-by: Thomas Gleixner Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi Cc: Thomas Gleixner LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit f984ba4eb575e4a27ed28a76d4126d2aa9233c32 Author: Masami Hiramatsu Date: Fri Dec 3 18:54:34 2010 +0900 kprobes: Use text_poke_smp_batch for unoptimizing Use text_poke_smp_batch() on unoptimization path for reducing the number of stop_machine() issues. If the number of unoptimizing probes is more than MAX_OPTIMIZE_PROBES(=256), kprobes unoptimizes first MAX_OPTIMIZE_PROBES probes and kicks optimizer for remaining probes. Signed-off-by: Masami Hiramatsu Cc: Rusty Russell Cc: Frederic Weisbecker Cc: Ananth N Mavinakayanahalli Cc: Jason Baron Cc: Mathieu Desnoyers Cc: 2nddept-manager@sdl.hitachi.co.jp Cc: Peter Zijlstra Cc: Steven Rostedt LKML-Reference: <20101203095434.2961.22657.stgit@ltc236.sdl.hitachi.co.jp> Signed-off-by: Ingo Molnar commit cd7ebe2298ff1c3112232878678ce5fe6be8a15b Author: Masami Hiramatsu Date: Fri Dec 3 18:54:28 2010 +0900 kprobes: Use text_poke_smp_batch for optimizing Use text_poke_smp_batch() in optimization path for reducing the number of stop_machine() issues. If the number of optimizing probes is more than MAX_OPTIMIZE_PROBES(=256), kprobes optimizes first MAX_OPTIMIZE_PROBES probes and kicks optimizer for remaining probes. Changes in v5: - Use kick_kprobe_optimizer() instead of directly calling schedule_delayed_work(). - Rescheduling optimizer outside of kprobe mutex lock. Changes in v2: - Allocate code buffer and parameters in arch_init_kprobes() instead of using static arraies. - Merge previous max optimization limit patch into this patch. So, this patch introduces upper limit of optimization at once. Signed-off-by: Masami Hiramatsu Cc: Rusty Russell Cc: Frederic Weisbecker Cc: Ananth N Mavinakayanahalli Cc: Jason Baron Cc: Mathieu Desnoyers Cc: 2nddept-manager@sdl.hitachi.co.jp Cc: Peter Zijlstra Cc: Steven Rostedt LKML-Reference: <20101203095428.2961.8994.stgit@ltc236.sdl.hitachi.co.jp> Signed-off-by: Ingo Molnar commit 7deb18dcf0478940ac979de002db1ed8ba6531dc Author: Masami Hiramatsu Date: Fri Dec 3 18:54:22 2010 +0900 x86: Introduce text_poke_smp_batch() for batch-code modifying Introduce text_poke_smp_batch(). This function modifies several text areas with one stop_machine() on SMP. Because calling stop_machine() is heavy task, it is better to aggregate text_poke requests. ( Note: I've talked with Rusty about this interface, and he would not like to expand stop_machine() interface, since it is not for generic use. ) Signed-off-by: Masami Hiramatsu Acked-by: Steven Rostedt Cc: Rusty Russell Cc: Frederic Weisbecker Cc: Ananth N Mavinakayanahalli Cc: Jason Baron Cc: Mathieu Desnoyers Cc: Jan Beulich Cc: 2nddept-manager@sdl.hitachi.co.jp LKML-Reference: <20101203095422.2961.51217.stgit@ltc236.sdl.hitachi.co.jp> Signed-off-by: Ingo Molnar commit 0490cd1f9d99569d3bd64e17adc88db06a5007be Author: Masami Hiramatsu Date: Fri Dec 3 18:54:16 2010 +0900 kprobes: Reuse unused kprobe Reuse unused (waiting for unoptimizing and no user handler) kprobe on given address instead of returning -EBUSY for registering a new kprobe. Signed-off-by: Masami Hiramatsu Cc: Rusty Russell Cc: Frederic Weisbecker Cc: Ananth N Mavinakayanahalli Cc: Jason Baron Cc: Mathieu Desnoyers Cc: 2nddept-manager@sdl.hitachi.co.jp LKML-Reference: <20101203095416.2961.39080.stgit@ltc236.sdl.hitachi.co.jp> Signed-off-by: Ingo Molnar commit 6274de4984a630b45c6934b3ee62e5692c745328 Author: Masami Hiramatsu Date: Fri Dec 3 18:54:09 2010 +0900 kprobes: Support delayed unoptimizing Unoptimization occurs when a probe is unregistered or disabled, and is heavy because it recovers instructions by using stop_machine(). This patch delays unoptimization operations and unoptimize several probes at once by using text_poke_smp_batch(). This can avoid unexpected system slowdown coming from stop_machine(). Changes in v5: - Split this patch into several cleanup patches and this patch. - Fix some text_mutex lock miss. - Use bool instead of int for behavior flags. - Add additional comment for (un)optimizing path. Changes in v2: - Use dynamic allocated buffers and params. Signed-off-by: Masami Hiramatsu Cc: Rusty Russell Cc: Frederic Weisbecker Cc: Ananth N Mavinakayanahalli Cc: Jason Baron Cc: Mathieu Desnoyers Cc: 2nddept-manager@sdl.hitachi.co.jp LKML-Reference: <20101203095409.2961.82733.stgit@ltc236.sdl.hitachi.co.jp> Signed-off-by: Ingo Molnar commit 61f4e13ffd85c037a942c5b7fd13f2b0c3162862 Author: Masami Hiramatsu Date: Fri Dec 3 18:54:03 2010 +0900 kprobes: Separate kprobe optimizing code from optimizer Separate kprobe optimizing code from optimizer, this will make easy to introducing unoptimizing code in optimizer. Signed-off-by: Masami Hiramatsu Cc: Rusty Russell Cc: Frederic Weisbecker Cc: Ananth N Mavinakayanahalli Cc: Jason Baron Cc: Mathieu Desnoyers Cc: 2nddept-manager@sdl.hitachi.co.jp LKML-Reference: <20101203095403.2961.91201.stgit@ltc236.sdl.hitachi.co.jp> Signed-off-by: Ingo Molnar commit 6f0f1dd71953d4243c11e490dd49ef24ebaf6c0b Author: Masami Hiramatsu Date: Fri Dec 3 18:53:57 2010 +0900 kprobes: Cleanup disabling and unregistering path Merge disabling kprobe to unregistering kprobe function and add comments for disabing/unregistring process. Current unregistering code disables(disarms) kprobes after checking target kprobe status. This patch changes it to disabling kprobe first after that it changing the kprobe's state. This allows to share probe disabling code between disable_kprobe() and unregister_kprobe(). Signed-off-by: Masami Hiramatsu Cc: Rusty Russell Cc: Frederic Weisbecker Cc: Ananth N Mavinakayanahalli Cc: Jason Baron Cc: Mathieu Desnoyers Cc: 2nddept-manager@sdl.hitachi.co.jp LKML-Reference: <20101203095356.2961.30152.stgit@ltc236.sdl.hitachi.co.jp> Signed-off-by: Ingo Molnar commit 6d8e40a85ef72a0514ebd00748eb18cab432b200 Author: Masami Hiramatsu Date: Fri Dec 3 18:53:50 2010 +0900 kprobes: Rename old_p to more appropriate name Rename irrelevant uses of "old_p" to more appropriate names. Originally, "old_p" just meant "the old kprobe on given address" but current code uses that name as "just another kprobe" or something like that. This patch renames those pointer names to more appropriate one for maintainability. Signed-off-by: Masami Hiramatsu Cc: Rusty Russell Cc: Frederic Weisbecker Cc: Ananth N Mavinakayanahalli Cc: Jason Baron Cc: Mathieu Desnoyers Cc: 2nddept-manager@sdl.hitachi.co.jp LKML-Reference: <20101203095350.2961.48110.stgit@ltc236.sdl.hitachi.co.jp> Signed-off-by: Ingo Molnar commit f444a57ca10fa7c199f1daf1cebd1fd329004992 Merge: 87507500b7fc3620e467abb617a3452f0cccc72d 44266416f786514ec43a0d15ad951c34566b99c9 Author: Russell King Date: Mon Dec 6 15:39:23 2010 +0000 Merge branch 'for-rmk-fixes' of git://git.infradead.org/users/cbou/linux-cns3xxx commit e4d2ebcab11b308b5b59073578efd33eccd55d46 Author: Feng Tang Date: Fri Dec 3 11:51:38 2010 +0800 x86, apbt: Setup affinity for apb timers acting as per-cpu timer Commit a5ef2e70 "x86: Sanitize apb timer interrupt handling" forgot the affinity setup when cleaning up the code, this patch just adds the forgotten part Signed-off-by: Feng Tang Cc: Jacob Pan Cc: Alan Cox LKML-Reference: <1291348298-21263-2-git-send-email-feng.tang@intel.com> Signed-off-by: Thomas Gleixner commit 5ec6960f6f0c7be9cc6e5506fdf0070add3b6e08 Author: Dirk Brandewie Date: Mon Nov 22 06:28:48 2010 -0800 ce4100: Add errata fixes for UART on CE4100 This patch enables the UART on the CE4100. The UART has a couple of issues that need to be worked around. First the UART is mostly PC compatible except that it is clocked eight times faster than a standard PC so the default configuration provided in arch/x86/include/asm/serial.h needs to be overridden. Second the TX interrupt may not be set correctly all the time. Lastly accessing the UART via I/O space for early_prink() hangs the chip when the IOAPIC is enabled. A custom mem_serial_in() is provided to work around the TX interrupt issue. The configuration issues are dealt with in the call back registered with the 8250 driver via serial8250_set_isa_configurator() Signed-off-by: Dirk Brandewie LKML-Reference: <1290436128-17958-1-git-send-email-dirk.brandewie@gmail.com> Signed-off-by: Thomas Gleixner commit ce47dc56a2241dc035160a85bc5e34283cdd622c Author: Chris Samuel Date: Sat Nov 13 13:35:06 2010 +1100 perf tools: Catch a few uncheck calloc/malloc's There were a few stray calloc()'s and malloc()'s which were not having their return values checked for success. As the calling code either already coped with failure or didn't actually care we just return -ENOMEM at that point. Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra Signed-off-by: Chris Samuel LKML-Reference: <4CDDF95A.1050400@csamuel.org> Signed-off-by: Arnaldo Carvalho de Melo commit 965bb6beaf70862d3846e330ea7a14996d82c499 Author: Stephane Eranian Date: Fri Dec 3 17:52:01 2010 +0200 perf script: Fix compiler warning in builtin_script.c:is_top_script() Fix annoying compiler warning in the is_top_script() function. The issue was that a const char * was cast into a char * to call ends_with(). We fix the users of ends_with() instead. Some are passing a char *, but it is okay to cast the return value of ends_with() to char * (because we understand what ends_with() does). Cc: David S. Miller Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Robert Richter Cc: Stephane Eranian LKML-Reference: <4cf92096.17edd80a.1540.5d60@mx.google.com> Signed-off-by: Stephane Eranian Signed-off-by: Arnaldo Carvalho de Melo commit cbf41645f35224798cb61641766e6a16e141ffe4 Author: Thomas Gleixner Date: Sun Dec 5 14:32:55 2010 +0100 perf session: Sort all events if ordered_samples=true Now that we have timestamps on FORK, EXIT, COMM, MMAP events we can sort everything in time order. This fixes the following observed problem: mmap(file1) -> pagefault() -> munmap(file1) mmap(file2) -> pagefault() -> munmap(file2) Resulted in decoding both pagefaults in file2 because the file1 map was already replaced by the file2 map when the map address was identical. With all events sorted we decode both pagefaults correctly. Cc: Frederic Weisbecker Cc: Ian Munsie Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian LKML-Reference: Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit e4e18d568b0e833c75c1f7833e1690cdde8f4d76 Author: Akihiro Nagai Date: Fri Dec 3 12:58:53 2010 +0900 perf options: add OPT_CALLBACK_DEFAULT_NOOPT Add new macro OPT_CALLBACK_DEFAULT_NOOPT for parse_options. It enables to pass the default value (opt->defval) to the callback function processing options require no argument. Reviewed-by: Masami Hiramatsu Cc: Ingo Molnar Cc: Masami Hiramatsu Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <20101203035853.7827.17502.stgit@localhost6.localdomain6> Signed-off-by: Akihiro Nagai Signed-off-by: Arnaldo Carvalho de Melo commit 1437a30aae865d83c7d96e3401f503a73fffe14d Author: Ian Munsie Date: Mon Dec 6 13:37:04 2010 +1100 perf hist: Better displaying of unresolved DSOs and symbols In the event that a DSO has not been identified, just print out [unknown] instead of the instruction pointer as we previously were doing, which is pretty meaningless for a shared object (at least to the users perspective). The IP we print out is fairly meaningless in general anyway - it's just one (the first) of the many addresses that were lumped together as unidentified, and could span many shared objects and symbols. In reality if we see this [unknown] output then the report -D output is going to be more useful anyway as we can see all the different address that it represents. If we are printing the symbols we are still going to see this IP in that column anyway since they shouldn't resolve either. This patch also changes the symbol address printouts so that they print out 0x before the address, are left aligned, and changes the %L format string (which relies on a glibc bug) to %ll. Before: 74.11% :3259 4a6c [k] 4a6c After: 74.11% :3259 [unknown] [k] 0x4a6c Cc: Frederic Weisbecker Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian LKML-Reference: <1291603026-11785-2-git-send-email-imunsie@au1.ibm.com> Signed-off-by: Ian Munsie Signed-off-by: Arnaldo Carvalho de Melo commit a38c5380ef9f088be9f49b6e4c5d80af8b1b5cd4 Author: Sebastian Andrzej Siewior Date: Fri Nov 26 17:50:20 2010 +0100 x86: io_apic: Split setup_ioapic_ids_from_mpc() Sodaville needs to setup the IO_APIC ids as the boot loader leaves them uninitialized. Split out the setter function so it can be called unconditionally from the sodaville board code. Signed-off-by: Sebastian Andrzej Siewior Cc: Yinghai Lu LKML-Reference: <20101126165020.GA26361@www.tglx.de> Signed-off-by: Thomas Gleixner commit 1dcb4f38e5bc28dfce0f8c7eef184a090b03bfc7 Author: Axel Lin Date: Mon Dec 6 16:48:03 2010 +0800 ASoC: Hold client_mutex while calling snd_soc_instantiate_cards() As the comments of snd_soc_instantiate_cards() said, snd_soc_instantiate_cards() must be called with client_mutex. Signed-off-by: Axel Lin Signed-off-by: Mark Brown commit ed8cc471d75365f8590c76f580def899d58028c0 Author: Uk Kim Date: Sun Dec 5 17:26:07 2010 +0900 ASoC: Fix swap of left and right channels for WM8993/4 speaker boost gain SPKOUTL_BOOST start from third bit, SPKOUTLR_BOOST start from 0 bit. Signed-off-by: Uk Kim Acked-by: Liam Girdwood Signed-off-by: Mark Brown Cc: stable@kernel.org commit 3fcc0afbb9c93f3599ba03273e59915670b6c2c2 Author: Uk Kim Date: Sun Dec 5 17:32:16 2010 +0900 ASoC: Fix off by one error in WM8994 EQ register bank size Signed-off-by: Uk Kim Acked-by: Liam Girdwood Signed-off-by: Mark Brown Cc: stable@kernel.org commit 4a55c18e2023096c8684fae5fa1cfa96a03172ff Author: Will Deacon Date: Mon Nov 29 17:06:53 2010 +0000 ARM: hw_breakpoint: fix warnings generated by sparse sparse doesn't like per-cpu accesses such as: static DEFINE_PER_CPU(struct perf_event *, foo[MAXLEN]); struct perf_event **bar = __get_cpu_var(foo); and shouts quite loudly about it: | warning: incorrect type in assignment (different modifiers) | expected struct perf_event **slots | got struct perf_event *[noderef] * This patch adds casts to these sorts of assignments in hw_breakpoint.c in order to silence the warnings. Reported-by: Russell King Signed-off-by: Will Deacon commit ce9b1b09520789223f72a9fefd5f0e329f8d89d0 Author: Will Deacon Date: Thu Nov 25 12:59:31 2010 +0000 ARM: ptrace: fix style issue with hw_breakpoint interface This patch fixes a trivial style issue in ptrace.c. Signed-off-by: Will Deacon commit 3ce70b2e24cd35cc9f2df8cf5205b8ab4e6178e1 Author: Will Deacon Date: Wed Dec 1 17:05:24 2010 +0000 ARM: hw_breakpoint: disallow per-cpu breakpoints without overflow handler Single-stepping a breakpoint requires us to disable it temporarily so that we don't get stuck in a recursive debug trap. With per-cpu breakpoints this presents a problem where an interrupt can be taken before the single-step has completed and a new task is eventually scheduled. This new task will not hit the breakpoint because it will have been disabled during the previous handling code. This patch disallows per-cpu breakpoints on ARM when an overflow handler is not present. A similar effect can be created by placing breakpoints on a shell and then running applications there. Signed-off-by: Will Deacon commit 9ebb3cbcc39d4e61ae6751167086acfb5c201e6f Author: Will Deacon Date: Wed Dec 1 14:12:13 2010 +0000 ARM: hw_breakpoint: unify single-stepping code for watchpoints and breakpoints The single-stepping code is currently different depending on whether we are stepping over a breakpoint or a watchpoint. There is no good reason for this, so let's sort it out. This patch adds functions for enabling/disabling single-step for a particular hw_breakpoint and integrates this with the exception handling code. Signed-off-by: Will Deacon commit 93a04a3416da12647c47840ebe2bb812fcb801d0 Author: Will Deacon Date: Mon Nov 29 16:56:01 2010 +0000 ARM: hw_breakpoint: do not allocate new breakpoints with preemption disabled The watchpoint single-stepping code calls register_user_hw_breakpoint to register a mismatch breakpoint for stepping over the watchpoint. This is performed with preemption disabled, which is unsafe as we may end up scheduling whilst in_atomic(). Furthermore, using the perf API is rather overkill since we are already in the hw-breakpoint backend and only require access to reserved breakpoints anyway. This patch reworks the watchpoint stepping code so that we don't require another perf_event for the mismatch breakpoint. Instead, we hold a separate arch_hw_breakpoint_ctrl struct inside the watchpoint which is used exclusively for stepping. We can check whether or not stepping is enabled when installing or uninstalling the watchpoint and operate on the breakpoint accordingly. Signed-off-by: Will Deacon commit 0017ff42ac37ff6aeb87d0b006c5d32b9a39f5fc Author: Will Deacon Date: Sun Nov 28 15:09:36 2010 +0000 ARM: hw_breakpoint: don't advertise reserved breakpoints To permit handling of watchpoint exceptions without signalling a debugger, it is necessary to reserve breakpoint registers for in-kernel use only. This patch ensures that we record and subtract the number of reserved breakpoints from the number of usable breakpoint registers that we advertise to userspace via the ptrace API. Signed-off-by: Will Deacon commit 7e20269647169e7ea08a62bdc4979a3ba32e615c Author: Will Deacon Date: Sun Nov 28 14:57:24 2010 +0000 ARM: hw_breakpoint: disable preemption during debug exception handling On ARM, debug exceptions occur in the form of data or prefetch aborts. One difference is that debug exceptions require access to per-cpu banked registers and data structures which are not saved in the low-level exception code. For kernels built with CONFIG_PREEMPT, there is an unlikely scenario that the debug handler ends up running on a different CPU from the one that originally signalled the event, resulting in random data being read from the wrong registers. This patch adds a debug_entry macro to the low-level exception handling code which checks whether the taken exception is a debug exception. If it is, the preempt count for the faulting process is incremented. After the debug handler has finished, the count is decremented. Acked-by: Catalin Marinas Signed-off-by: Will Deacon commit 6ee33c2712fcdff2568d9bbadb25c8e5a7c36212 Author: Will Deacon Date: Thu Nov 25 12:01:54 2010 +0000 ARM: hw_breakpoint: correct and simplify alignment fixup code The current hw_breakpoint code tries to fix up the alignment of breakpoints so that we can make use of sparse byte-address-select bits in the control register and give the illusion that we can set breakpoints on unaligned addresses. Although this works on v6 cores, v7 forbids this behaviour, instead requiring breakpoints to be set on aligned addresses and have contiguous byte-address-select ranges depending on the instruction set in use. For ARM the only supported size is 4 bytes, whilst Thumb-2 also permits 2 byte breakpoints (watchpoints can be of 1, 2, 4 or 8 bytes long). This patch simplifies the alignment fixup code so that we require addresses to be aligned to the size of the corresponding breakpoint. This allows us to handle the common case of breaking on a half-word aligned Thumb-2 instruction and also allows us to set byte watchpoints on arbitrary addresses. Signed-off-by: Will Deacon commit 7d99331e4793b52d488e911876ef11d843c6c8c9 Author: Will Deacon Date: Wed Nov 24 17:45:49 2010 +0000 ARM: hw_breakpoint: reset control registers in hotplug path The ARMv7 debug architecture doesn't make any guarantees about the contents of debug control registers following a debug logic reset. This patch ensures that we reset the control registers when a cpu comes ONLINE (for example, with hotplug) so that when we enable monitor mode while inserting a breakpoint we won't exhibit random behaviour. Signed-off-by: Will Deacon commit ac88e07122fc0eb5cbad403be97ef02c317a06b7 Author: Will Deacon Date: Wed Nov 24 16:51:17 2010 +0000 ARM: hw_breakpoint: ensure OS lock is clear before writing to debug registers ARMv7 architects a system for saving and restoring the debug registers across low-power modes. At the heart of this system is a lock register which, when set, forbids writes to the debug registers. While locked, writes to debug registers via the co-processor interface will result in undefined instruction traps. Linux currently doesn't make use of this feature because we update the debug registers on context switch anyway, however the status of the lock is IMPLEMENTATION DEFINED on reset. This patch ensures that the lock is cleared during boot so that we can write to the debug registers safely. Signed-off-by: Will Deacon commit 87507500b7fc3620e467abb617a3452f0cccc72d Author: Chao Xie Date: Mon Dec 6 07:01:10 2010 +0100 ARM: 6524/1: GIC irq desciptor bug fix gic_set_cpu will directly use irq_desc[]. If CONFIG_SPARSE_IRQ is enabled, there is no irq_desc[]. So we need use irq_to_desc(irq) to get the descriptor for irq. Signed-off-by: Chao Xie Acked-by: Kyungmin Park Signed-off-by: Russell King commit dd5a089edfa51a74692604b4b427953d8e16bc35 Author: Daniel T Chen Date: Sun Dec 5 08:43:14 2010 -0500 ALSA: hda: Use position_fix=1 for Acer Aspire 5538 to enable capture on internal mic BugLink: https://launchpad.net/bugs/685161 The reporter of the bug states that he must use position_fix=1 to enable capture for the internal microphone, so set it for his machine's PCI SSID. Verified using 2.6.35 and the 2010-12-04 alsa-driver build. Reported-and-tested-by: Ralph Wabel Cc: Signed-off-by: Daniel T Chen Signed-off-by: Takashi Iwai commit 0e44e059588e1d91f3a1974d2ce3348864d1d799 Merge: 96886c4361f1ae3f6c775d7c9295e2d557101d0f e8a7e48bb248a1196484d3f8afa53bded2b24e71 Author: Sascha Hauer Date: Mon Dec 6 09:36:17 2010 +0100 Merge commit 'v2.6.37-rc4' into imx-for-2.6.38 Done to resolve merge conflict: Conflicts: arch/arm/mach-mx25/devices-imx25.h Signed-off-by: Sascha Hauer commit 771f8bc71c31c6bd103cdec283012253f352ab1c Merge: 31c67c755363c7e7821221e72f8594ab8995764d 37d57443d5d810c6ef49e93586b046e7d4774818 Author: Linus Torvalds Date: Sun Dec 5 16:45:02 2010 -0800 Merge branch 'slab/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6 * 'slab/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6: slub: Fix a crash during slabinfo -v commit 31c67c755363c7e7821221e72f8594ab8995764d Merge: 47ad504c56235c7c7c0020e631651420a55c74e7 307991055b0ce65d53dc1eb501c456c10eb36360 Author: Linus Torvalds Date: Sun Dec 5 16:41:13 2010 -0800 Merge branch 'rc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6 * 'rc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6: initramfs: Really fix build break on symbol-prefixed archs [media] Fix Kconfig errors due to two visible menus i2c/algos: convert Kconfig to use the menu's `visible' keyword media/video: convert Kconfig to use the menu's `visible' keyword Revert "i2c: Fix Kconfig dependencies" kconfig: regen parser kconfig: add an option to determine a menu's visibility commit 47ad504c56235c7c7c0020e631651420a55c74e7 Merge: 7b2a69ba7055da9a04eb96aa7b38c8e3280aaaa5 7bfbeae9c78fb9404ccbd62a25c82f5860432ac9 Author: Linus Torvalds Date: Sun Dec 5 16:40:31 2010 -0800 Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6 * 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6: parisc: Fix GSC PS/2 driver name for keyboard and mouse parisc: KittyHawk LCD fix parisc: convert the rest of the irq handlers to simple/percpu parisc: fix dino/gsc interrupts parisc: remove redundant initialization in sigsegv path of sys_rt_sigreturn commit 7b2a69ba7055da9a04eb96aa7b38c8e3280aaaa5 Author: Eric W. Biederman Date: Sun Dec 5 15:51:21 2010 -0800 Revert "vfs: show unreachable paths in getcwd and proc" Because it caused a chroot ttyname regression in 2.6.36. As of 2.6.36 ttyname does not work in a chroot. It has already been reported that screen breaks, and for me this breaks an automated distribution testsuite, that I need to preserve the ability to run the existing binaries on for several more years. glibc 2.11.3 which has a fix for this is not an option. The root cause of this breakage is: commit 8df9d1a4142311c084ffeeacb67cd34d190eff74 Author: Miklos Szeredi Date: Tue Aug 10 11:41:41 2010 +0200 vfs: show unreachable paths in getcwd and proc Prepend "(unreachable)" to path strings if the path is not reachable from the current root. Two places updated are - the return string from getcwd() - and symlinks under /proc/$PID. Other uses of d_path() are left unchanged (we know that some old software crashes if /proc/mounts is changed). Signed-off-by: Miklos Szeredi Signed-off-by: Al Viro So remove the nice sounding, but ultimately ill advised change to how /proc/fd symlinks work. Signed-off-by: "Eric W. Biederman" Signed-off-by: Linus Torvalds commit 4a50bfe365a977f634311504484342fbfffe855c Author: Russell King Date: Sun Dec 5 23:06:22 2010 +0000 ARM: Ensure experimental options are so marked It is kernel-wide policy that options depending on EXPERIMENTAL should also have '(EXPERIMENTAL)' in their option text, and options with '(EXPERIMENTAL)' depend on EXPERIMENTAL. Ensure that all ARM options comply with this. Signed-off-by: Russell King commit 2a1292fd4cf1558b4a60781227d503c9111d9075 Author: Chris Wilson Date: Sun Dec 5 19:21:18 2010 +0000 drm/i915/lvds: Always restore panel-fitter when enabling the LVDS Linus Torvalds pointed out that our code was unbalanced when powering on the panel with respect to the power off sequence in that we were failing to restore the panel-fitter. The consequence of this would be that across a simple DPMS off/on for a non-native mode, without an intervening modeset, the panel fitter would remain disabled and the output would shift on the panel. Reported-by: Linus Torvalds Signed-off-by: Chris Wilson commit 6fd0d56e3bc1abfb237b8824261b613e21e77bc8 Author: Chris Wilson Date: Sun Dec 5 20:42:33 2010 +0000 drm/i915/ringbuffer: Only print an error on the second attempt to reset head There's not much we can do here but hope for the best. However the first failure happens quite frequently and if often remedied by the second attempt to reset HEAD. So only print the error if that attempt also fails. Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=19802 Reported-by: Thomas Meyer Signed-off-by: Chris Wilson Cc: stable@kernel.org commit bbf0c6b3620b3872929ef7d3c392ce436889110f Author: Daniel Vetter Date: Sun Dec 5 11:30:40 2010 +0100 drm/i915: announce to userspace that the bsd ring is coherent Otherwise we can't really fix the abi-braindeadness of forcing libva to manually wait for rendering when switching rings. Which in turn makes implementing hw semaphores a pointless exercise (at least for ironlake). [Also added the relaxed fencing param to explain the jump in numbering - relaxed fencing is in -next.] Signed-off-by: Daniel Vetter Signed-off-by: Chris Wilson commit 136711be41ec97f7f1a9c3a5e8535eb7da5fea59 Author: Takashi Iwai Date: Sat Dec 4 16:13:06 2010 +0100 agp/intel: Fix wrong kunmap in i830_cleanup() Add a missing NULL check and fix the wrong address passed to kunmap() in i830_cleanup(). Cc: stable@kernel.org Signed-off-by: Takashi Iwai [danvet: added cc stable] Signed-off-by: Daniel Vetter Signed-off-by: Chris Wilson commit 3d09fbcd26851ffb2c40cec411b8e56db02520d1 Author: Kuninori Morimoto Date: Wed Dec 1 07:40:16 2010 +0100 ARM: 6514/1: mach-shmobile: Add zboot support for SuperH Mobile ARM When CONFIG_ZBOOT_ROM is selected, the resulting zImage file will be small boot loader and may be burned to rom or flash. This is the board-specific portion of this patch-set. Signed-off-by: Kuninori Morimoto Signed-off-by: Simon Horman Acked-by: Magnus Damm Signed-off-by: Russell King commit 9a4af112bd252be801a433fc3bef793b7b487c3c Author: Kuninori Morimoto Date: Wed Dec 1 07:45:00 2010 +0100 ARM: 6515/1: Add zboot support for SuperH Mobile ARM When CONFIG_ZBOOT_ROM is selected, the resulting zImage file will be small boot loader and may be burned to rom or flash. This is the non-board-specific framework portion of this patch-set. Signed-off-by: Kuninori Morimoto Signed-off-by: Simon Horman Acked-by: Magnus Damm Signed-off-by: Russell King commit 0385ebc0c9b16fc2d8262c082843165313f7b1e4 Author: Russell King Date: Sat Dec 4 17:45:55 2010 +0000 ARM: move high-usage mostly read variables in setup.c to __read_mostly Signed-off-by: Russell King commit daf8741675562197d4fb4c4e9d773f53494203a5 Author: Russell King Date: Sat Dec 4 17:08:32 2010 +0000 ARM: implement support for read-mostly sections As our SMP implementation uses MESI protocols. Grouping together data which is mostly only read together means that we avoid unnecessary cache line bouncing when this code shares a cache line with other data. In other words, cache lines associated with read-mostly data are expected to spend most of their time in shared state. Signed-off-by: Russell King commit 0b05da7200dd56a5364c4d9cf5441715c1d706ed Author: Hans Ulli Kroll Date: Thu Dec 2 12:32:15 2010 +0100 ARM: 6520/1: Kconfig: add new symbol MIGHT_HAVE_PCI Today more boards with arm cpu have selectable pci bus. This patch makes this more scalable and remove line continuations in Kconfig Acked-by: Arnd Bergmann Signed-off-by: Hans Ulli Kroll Signed-off-by: Russell King commit 9c90a61c7e4286aa5a38b314a2d8f5a1e70b5135 Author: Arnaldo Carvalho de Melo Date: Thu Dec 2 10:25:28 2010 -0200 perf tools: Ask for ID PERF_SAMPLE_ info on all PERF_RECORD_ events So that we can use -T == --timestamp, asking for PERF_SAMPLE_TIME: $ perf record -aT $ perf report -D | grep PERF_RECORD_ 3 5951915425 0x47530 [0x58]: PERF_RECORD_SAMPLE(IP, 1): 16811/16811: 0xffffffff8138c1a2 period: 215979 cpu:3 3 5952026879 0x47588 [0x90]: PERF_RECORD_SAMPLE(IP, 1): 16811/16811: 0xffffffff810cb480 period: 215979 cpu:3 3 5952059959 0x47618 [0x38]: PERF_RECORD_FORK(6853:6853):(16811:16811) 3 5952138878 0x47650 [0x78]: PERF_RECORD_SAMPLE(IP, 1): 16811/16811: 0xffffffff811bac35 period: 431478 cpu:3 3 5952375068 0x476c8 [0x30]: PERF_RECORD_COMM: find:6853 3 5952395923 0x476f8 [0x50]: PERF_RECORD_MMAP 6853/6853: [0x400000(0x25000) @ 0]: /usr/bin/find 3 5952413756 0x47748 [0xa0]: PERF_RECORD_SAMPLE(IP, 1): 6853/6853: 0xffffffff810d080f period: 859332 cpu:3 3 5952419837 0x477e8 [0x58]: PERF_RECORD_MMAP 6853/6853: [0x3f44600000(0x21d000) @ 0]: /lib64/ld-2.5.so 3 5952437929 0x47840 [0x48]: PERF_RECORD_MMAP 6853/6853: [0x7fff7e1c9000(0x1000) @ 0x7fff7e1c9000]: [vdso] 3 5952570127 0x47888 [0x58]: PERF_RECORD_MMAP 6853/6853: [0x3f46200000(0x218000) @ 0]: /lib64/libselinux.so.1 3 5952623637 0x478e0 [0x58]: PERF_RECORD_MMAP 6853/6853: [0x3f44a00000(0x356000) @ 0]: /lib64/libc-2.5.so 3 5952675720 0x47938 [0x58]: PERF_RECORD_MMAP 6853/6853: [0x3f44e00000(0x204000) @ 0]: /lib64/libdl-2.5.so 3 5952710080 0x47990 [0x58]: PERF_RECORD_MMAP 6853/6853: [0x3f45a00000(0x246000) @ 0]: /lib64/libsepol.so.1 3 5952847802 0x479e8 [0x58]: PERF_RECORD_SAMPLE(IP, 1): 6853/6853: 0xffffffff813897f0 period: 1142536 cpu:3 First column is the cpu and the second the timestamp. That way we can investigate problems in the event stream. If the new perf binary is run on an older kernel, it will disable this feature automatically. Tested-by: Thomas Gleixner Reviewed-by: Thomas Gleixner Acked-by: Ian Munsie Acked-by: Thomas Gleixner Cc: FrĂ©dĂ©ric Weisbecker Cc: Ian Munsie Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Paul Mackerras Cc: Stephane Eranian LKML-Reference: <1291318772-30880-5-git-send-email-acme@infradead.org> Signed-off-by: Arnaldo Carvalho de Melo commit 640c03ce837fe8d4b56342aba376ea0da3960459 Author: Arnaldo Carvalho de Melo Date: Thu Dec 2 14:10:21 2010 -0200 perf session: Parse sample earlier At perf_session__process_event, so that we reduce the number of lines in eache tool sample processing routine that now receives a sample_data pointer already parsed. This will also be useful in the next patch, where we'll allow sample the identity fields in MMAP, FORK, EXIT, etc, when it will be possible to see (cpu, timestamp) just after before every event. Also validate callchains in perf_session__process_event, i.e. as early as possible, and keep a counter of the number of events discarded due to invalid callchains, warning the user about it if it happens. There is an assumption that was kept that all events have the same sample_type, that will be dealt with in the future, when this preexisting limitation will be removed. Tested-by: Thomas Gleixner Reviewed-by: Thomas Gleixner Acked-by: Ian Munsie Acked-by: Thomas Gleixner Cc: FrĂ©dĂ©ric Weisbecker Cc: Ian Munsie Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Paul Mackerras Cc: Stephane Eranian LKML-Reference: <1291318772-30880-4-git-send-email-acme@infradead.org> Signed-off-by: Arnaldo Carvalho de Melo commit c980d1091810df13f21aabbce545fd98f545bbf7 Author: Arnaldo Carvalho de Melo Date: Sat Dec 4 23:02:20 2010 -0200 perf events: Make sample_type identity fields available in all PERF_RECORD_ events If perf_event_attr.sample_id_all is set it will add the PERF_SAMPLE_ identity info: TID, TIME, ID, CPU, STREAM_ID As a trailer, so that older perf tools can process new files, just ignoring the extra payload. With this its possible to do further analysis on problems in the event stream, like detecting reordering of MMAP and FORK events, etc. V2: Fixup header size in comm, mmap and task processing, as we have to take into account different sample_types for each matching event, noticed by Thomas Gleixner. Thomas also noticed a problem in v2 where if we didn't had space in the buffer we wouldn't restore the header size. Tested-by: Thomas Gleixner Reviewed-by: Thomas Gleixner Acked-by: Ian Munsie Acked-by: Peter Zijlstra Acked-by: Thomas Gleixner Cc: FrĂ©dĂ©ric Weisbecker Cc: Ian Munsie Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Paul Mackerras Cc: Stephane Eranian Cc: Thomas Gleixner LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 6844c09d849aeb00e8ddfe9525e8567a531c22d0 Author: Arnaldo Carvalho de Melo Date: Fri Dec 3 16:36:35 2010 -0200 perf events: Separate the routines handling the PERF_SAMPLE_ identity fields Those will be made available in sample like events like MMAP, EXEC, etc in a followup patch. So precalculate the extra id header space and have a separate routine to fill them up. V2: Thomas noticed that the id header needs to be precalculated at inherit_events too: LKML-Reference: Tested-by: Thomas Gleixner Reviewed-by: Thomas Gleixner Acked-by: Ian Munsie Acked-by: Peter Zijlstra Acked-by: Thomas Gleixner Cc: FrĂ©dĂ©ric Weisbecker Cc: Ian Munsie Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Paul Mackerras Cc: Stephane Eranian Cc: Thomas Gleixner LKML-Reference: <1291318772-30880-2-git-send-email-acme@infradead.org> Signed-off-by: Arnaldo Carvalho de Melo commit 614b6780eb0c393d2fb49ff62d61f29b877bd07e Author: Thomas Gleixner Date: Fri Dec 3 16:24:32 2010 -0200 perf events: Fix event inherit fallout of precalculated headers The precalculated header size is not updated when an event is inherited. That results in bogus sample entries for all child events. Bug introduced in c320c7b. Cc: Frederic Weisbecker Cc: Ian Munsie Cc: Ingo Molnar Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian LKML-Reference: Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit cf2f9c59807f173b1c6a537fde7c83c8da876e56 Author: Dan Williams Date: Sat Dec 4 14:53:32 2010 -0800 intel_mid_dma: fix section mismatch warnings Rename intel_mid_dma_pci to intel_mid_dma_pci_driver to pick up the applied annotations of that suffix. Reported-by: Signed-off-by: Dan Williams commit d2f5c276ea4b7b7e1b953926bac9d0b148fcce4e Author: Anatolij Gustschin Date: Mon Nov 22 18:35:18 2010 +0100 dmaengine: imx-sdma: fix bug in buffer descriptor initialization Currently while submitting scatterlists with more than one SG entry the DMA buffer address from the first SG entry is inserted into all initialized DMA buffer descriptors. This is due to the typo in the for_each_sg() loop where the scatterlist pointer is used for obtaining the DMA buffer address and _not_ the SG list iterator. As a result all received data will be written only into the first DMA buffer while reading. While writing the data from the first DMA buffer is send to the device multiple times. This caused the filesystem destruction on the MMC card when using DMA in mxcmmc driver. Signed-off-by: Anatolij Gustschin Acked-by: Sascha Hauer Signed-off-by: Dan Williams commit a584bff5efae8c1d026e3a930e3d13a90264fafc Author: Joe Perches Date: Fri Nov 12 13:37:54 2010 -0800 drivers/dma/ppc4xx: Use printf extension %pR for struct resource Using %pR standardizes the struct resource output. Signed-off-by: Joe Perches Signed-off-by: Dan Williams commit bca364d30d63825f36a03dcacf390943d4c2cb74 Author: Tracey Dent Date: Sat Nov 6 17:01:37 2010 -0400 drivers/dma/ioat: Use the ccflag-y instead of EXTRA_CFLAGS Changed Makefile to use -y instead of -objs. Following (documentation/kbuild/makefiles.txt). Signed-off-by: Tracey Dent Signed-off-by: Andrew Morton Signed-off-by: Dan Williams commit 7bfbeae9c78fb9404ccbd62a25c82f5860432ac9 Author: Guy Martin Date: Tue Nov 2 15:23:08 2010 +0000 parisc: Fix GSC PS/2 driver name for keyboard and mouse Fix kernel warnings caused by the driver name of GSC PS/2 containing '/'. The following warnings are observed on a K410 system : [ 10.700000] name 'GSC PS/2 keyboard' [ 10.732000] ------------[ cut here ]------------ [ 10.772000] WARNING: at fs/proc/generic.c:323 [ 10.828000] Modules linked in: [ 10.916000] [ 10.916000] YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI [ 10.936000] PSW: 00000000000001000000000000001111 Not tainted [ 10.992000] r00-03 0004000f 104fe3e0 10201ea0 00000000 [ 11.060000] r04-07 4fc405c8 00000006 4fc405c8 4fc40694 [ 11.124000] r08-11 4fc40708 10438aa0 00000001 1043bfc8 [ 11.184000] r12-15 104ff2a0 104ff2a0 4fc38634 104ff2a0 [ 11.248000] r16-19 f0001570 10479af0 f000006c 1044fe50 [ 11.308000] r20-23 00000000 00000028 104cd858 00000000 [ 11.372000] r24-27 ffffffff 0000000e 1044fe10 1043bbe0 [ 11.436000] r28-31 0000002b 00000078 4fc40800 0000000d [ 11.496000] sr00-03 00000000 00000000 00000000 00000000 [ 11.560000] sr04-07 00000000 00000000 00000000 00000000 [ 11.624000] [ 11.688000] IASQ: 00000000 00000000 IAOQ: 10201ea0 10201ea4 [ 11.704000] IIR: 03ffe01f ISR: 00000000 IOR: 0000000d [ 11.772000] CPU: 0 CR30: 4fc40000 CR31: f01043b0 [ 11.836000] ORIG_R28: 4fc40940 [ 11.904000] IAOQ[0]: __xlate_proc_name+0x90/0xd0 [ 11.940000] IAOQ[1]: __xlate_proc_name+0x94/0xd0 [ 11.996000] RP(r2): __xlate_proc_name+0x90/0xd0 [ 12.052000] Backtrace: [ 12.108000] [<10257790>] vsnprintf+0x290/0x4f4 [ 12.136000] [ 12.188000] ---[ end trace 91bf6ece17e322dd ]--- [ 12.208000] serio: GSC PS/2 keyboard port at 0x0001c000 irq 19 @ 10:12:7 [ 12.264000] name 'GSC PS/2 mouse' [ 12.344000] ------------[ cut here ]------------ [ 12.384000] WARNING: at fs/proc/generic.c:323 [ 12.436000] Modules linked in: [ 12.524000] [ 12.528000] YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI [ 12.544000] PSW: 00000000000001000000000000001111 Tainted: G W [ 12.600000] r00-03 0004000f 104fe3e0 10201ea0 00000000 [ 12.680000] r04-07 4fc405c8 00000006 4fc405c8 4fc40694 [ 12.740000] r08-11 4fc40708 10438aa0 00000001 1043bfc8 [ 12.804000] r12-15 104ff2a0 104ff2a0 4fc38634 104ff2a0 [ 12.868000] r16-19 f0001570 10479af0 f000006c 1044fe50 [ 12.928000] r20-23 00000000 00000025 104cd858 00000000 [ 12.992000] r24-27 ffffffff 0000000e 1044fe10 1043bbe0 [ 13.056000] r28-31 00000028 00000078 4fc40800 0000000d [ 13.116000] sr00-03 00000000 00000000 00000000 00000000 [ 13.180000] sr04-07 00000000 00000000 00000000 00000000 [ 13.244000] [ 13.308000] IASQ: 00000000 00000000 IAOQ: 10201ea0 10201ea4 [ 13.324000] IIR: 03ffe01f ISR: 00000000 IOR: 0000000d [ 13.392000] CPU: 0 CR30: 4fc40000 CR31: f01043b0 [ 13.456000] ORIG_R28: 4fc40940 [ 13.524000] IAOQ[0]: __xlate_proc_name+0x90/0xd0 [ 13.560000] IAOQ[1]: __xlate_proc_name+0x94/0xd0 [ 13.616000] RP(r2): __xlate_proc_name+0x90/0xd0 [ 13.672000] Backtrace: [ 13.728000] [<10257790>] vsnprintf+0x290/0x4f4 [ 13.756000] [ 13.808000] ---[ end trace 91bf6ece17e322de ]--- [ 13.828000] serio: GSC PS/2 mouse port at 0x00020100 irq 19 @ 10:12:8 Signed-off-by: Guy Martin Acked-by: Helge Deller Signed-off-by: Kyle McMartin commit 79a04296231171157031d0bd8cd4038317e13cf2 Author: Guy Martin Date: Sat Nov 6 16:24:29 2010 +0000 parisc: KittyHawk LCD fix K class aka KittyHawk don't have LED support on their LCD. Installing HP-UX confirmed this. The current led_wq fills the LCD with black characters each time it runs. The patch prevents the led_wq workqueue and its proc entry to be created for KittyHawk machines. It also increase min_cmd_delay as currently, one character out of two is lost when a string is sent to the LCD. Signed-off-by: Guy Martin Signed-off-by: Kyle McMartin commit 51890613f2bfa70453a5cc22c91c63946dd311cd Author: James Bottomley Date: Fri Dec 3 02:01:05 2010 +0000 parisc: convert the rest of the irq handlers to simple/percpu The generic conversion eliminates the spurious no_ack and no_end routines, converts all the cascaded handlers to handle_simple_irq() and makes iosapic use a modified handle_percpu_irq() to become the same as the CPU irq's. This isn't an essential change, but it eliminates the mask/unmask overhead of handle_level_irq(). Signed-off-by: James Bottomley Tested-by: Helge Deller Signed-off-by: Kyle McMartin commit d16cd297d288e48482c3c261db434a2e13bd9f20 Author: James Bottomley Date: Thu Dec 2 23:36:47 2010 +0000 parisc: fix dino/gsc interrupts The essential problem we're currently having is that dino (and gsc) is a cascaded CPU interrupt. Under the old __do_IRQ() handler, our CPU interrupts basically did an ack followed by an end. In the new scheme, we replaced them with level handlers which do a mask, an ack and then an unmask (but no end). Instead, with the renaming of end to eoi, we actually want to call the percpu flow handlers, because they actually have all the characteristics we want. This patch does the conversion and gets my C360 booting again. Signed-off-by: James Bottomley Signed-off-by: Kyle McMartin commit 49078f7d108f132582e5af46304c317b55f83948 Author: Chris Wilson Date: Sat Dec 4 07:45:57 2010 +0000 drm/i915: Factor in pixel-repeat in FDI M/N calculation Fixes the modesetting on the secondary panel of the Libretto W100 and presumably many more Ironlake laptops with SDVO LVDS displays. Reported-and-tested-by: Matthew Willoughby Signed-off-by: Chris Wilson Cc: stable@kernel.org commit a5542a0f9aca5588a0afd0489c26d858405bfecb Author: Rabin Vincent Date: Sat Dec 4 06:20:52 2010 +0100 ARM: 6523/1: iop: ensure sched_clock() is notrace Include sched.h to ensure sched_clock() has the notrace annotation, and mark any functions it calls as notrace too. Include sched.h to ensure sched_clock() has the notrace annotation, and mark any functions it calls as notrace too. Acked-by: Dan Williams Signed-off-by: Rabin Vincent Signed-off-by: Russell King commit b9f515e3e3861abbaa093359f7c6f31283695228 Author: Marcelo Roberto Jimenez Date: Mon Oct 18 22:38:08 2010 +0100 ARM: 6456/1: Fix for building DEBUG with sa11xx_base.c as a module. This patch fixes a compilation issue when compiling PCMCIA SA1100 support as a module with PCMCIA_DEBUG enabled. The symbol soc_pcmcia_debug was not beeing exported. ARM: pcmcia: Fix for building DEBUG with sa11xx_base.c as a module. This patch fixes a compilation issue when compiling PCMCIA SA1100 support as a module with PCMCIA_DEBUG enabled. The symbol soc_pcmcia_debug was not beeing exported. Cc: Signed-off-by: Marcelo Roberto Jimenez Signed-off-by: Russell King commit ed60453fa8f8fc3d034dfdf10371a99cc6905626 Author: Rabin Vincent Date: Tue Nov 30 17:36:48 2010 +0100 ARM: 6511/1: ftrace: add ARM support for C version of recordmcount Depending on the compiler version, ARM GCC calls the mcount function either __gnu_mcount_nc or mcount. Acked-by: Steven Rostedt Signed-off-by: Rabin Vincent Signed-off-by: Russell King commit cd3478f2bd8f2cec19f9247a8a9cd711cbe37683 Author: Rabin Vincent Date: Tue Nov 30 17:33:53 2010 +0100 ARM: 6509/1: ftrace: ignore any ftrace.o in C version of recordmcount arch/arm/kernel/ftrace.c references mcount like kernel/tracing/ftrace.c, so change the exclusion filter to match any ftrace.o. Acked-by: Steven Rostedt Signed-off-by: Rabin Vincent Signed-off-by: Russell King commit 961ec6daa7b14f376c30d447a830fa4783a2112c Author: Will Deacon Date: Thu Dec 2 18:01:49 2010 +0100 ARM: 6521/1: perf: use raw_spinlock_t for pmu_lock For kernels built with PREEMPT_RT, critical sections protected by standard spinlocks are preemptible. This is not acceptable on perf as (a) we may be scheduled onto a different CPU whilst reading/writing banked PMU registers and (b) the latency when reading the PMU registers becomes unpredictable. This patch upgrades the pmu_lock spinlock to a raw_spinlock instead. Reported-by: Jamie Iles Signed-off-by: Will Deacon Signed-off-by: Russell King commit 4d6b7a779be34e1df296abc1dc555134a8cf34af Author: Will Deacon Date: Tue Nov 30 18:15:53 2010 +0100 ARM: 6512/1: perf: fix warnings generated by sparse Russell reported a number of warnings coming from sparse when checking the ARM perf_event.c files: | perf_event.c seems to also have problems too: | | CHECK arch/arm/kernel/perf_event.c | arch/arm/kernel/perf_event.c:37:1: warning: symbol 'pmu_lock' was not declared. Should it be static? | arch/arm/kernel/perf_event.c:70:1: warning: symbol 'cpu_hw_events' was not declared. Should it be static? | arch/arm/kernel/perf_event.c:1006:1: warning: symbol 'armv6pmu_enable_event' was not declared. Should it be static? | arch/arm/kernel/perf_event.c:1113:1: warning: symbol 'armv6pmu_stop' was not declared. Should it be static? | arch/arm/kernel/perf_event.c:1956:6: warning: symbol 'armv7pmu_enable_event' was not declared. Should it be static? | arch/arm/kernel/perf_event.c:3072:14: warning: incorrect type in argument 1 (different address spaces) | arch/arm/kernel/perf_event.c:3072:14: expected void const volatile [noderef] * | arch/arm/kernel/perf_event.c:3072:14: got struct frame_tail *tail | arch/arm/kernel/perf_event.c:3074:49: warning: incorrect type in argument 2 (different address spaces) | arch/arm/kernel/perf_event.c:3074:49: expected void const [noderef] *from | arch/arm/kernel/perf_event.c:3074:49: got struct frame_tail *tail This patch resolves these issues so we can live in silence again. Reported-by: Russell King Signed-off-by: Will Deacon Signed-off-by: Russell King commit b23065313297e750edd57ab6edfd36224826724e Author: Per Fransson Date: Fri Dec 3 10:53:38 2010 +0100 ARM: 6522/1: kexec: Add call to non-crashing cores through IPI When kexec is used to start a crash kernel the other cores are notified. These non-crashing cores will save their state in the crash notes and then do nothing. Signed-off-by: Per Fransson Signed-off-by: Russell King commit 55afd264cdd5d5848753e90884ed596e11bce0ff Author: Dave Martin Date: Wed Dec 1 18:12:43 2010 +0100 ARM: 6519/1: kuser: Fix incorrect cmpxchg syscall in kuser helpers The existing code invokes the syscall with rubbish in r7, due to what looks like an incorrect literal load idiom. Reviewed-by: Will Deacon Signed-off-by: Dave Martin Acked-by: Catalin Marinas Signed-off-by: Russell King commit cd849ae9cd291117c0f7e0e8d531ab62a906e308 Author: Dave Martin Date: Wed Dec 1 18:05:14 2010 +0100 ARM: 6518/1: kexec: Fix crash_setup_regs() for ARMv7 and CONFIG_THUMB2_KERNEL * Fix kexec build failure with CONFIG_THUMB2_KERNEL. * Avoids deprecated/forbidden sp and pc usage in for ARMv7 onwards, retaining compatibility with older architecture versions. * The pc value saved to newregs is now aligned on a predictable instruction boundary. (stmia { ... pc } or str pc has implementation-defined results in most versions of the ARM architecutre, and is prohibited (unpredictable) in Thumb-2.) * Switch to named inline asm arguments (else I get readily confused ...) The resulting code should be compatible with all architecture versions >= v3, with or without CONFIG_THUMB2_KERNEL. Reviewed-by: Will Deacon Tested-by: Mika Westerberg Signed-off-by: Dave Martin Acked-by: Catalin Marinas Signed-off-by: Russell King commit 0946b8c5c5982088a26da7ad99e8bcf57f972fb5 Author: Dave Martin Date: Wed Dec 1 18:05:13 2010 +0100 ARM: 6517/1: kexec: Add missing memory clobber to inline asm in crash_setup_regs() Currently, the inline asm is passed &newregs->ARM_r0 as in input, when modifying multiple fields of newregs. It's plausible to assume that GCC will assume newregs->ARM_r0 is modified when passed the address, but unfortunately this assumption is incorrect. Also, GCC has no way to guess that the other ARM_r* fields are modified without the addition of a "memory" clobber. Signed-off-by: Dave Martin Acked-by: Catalin Marinas Acked-by: Will Deacon Signed-off-by: Russell King commit ef61d4e6d88da80dc2b417cf8ad3c77aa94f0c8f Author: Manoj Iyer Date: Fri Dec 3 18:43:55 2010 -0600 ALSA: hda - Enable jack sense for Thinkpad Edge 13 Added a quirk to cxt5066_cfg_tbl to enable jack sense for ThinkPad Edge 13. Reference: http://launchpad.net/bugs/685015 Signed-off-by: Manoj Iyer Signed-off-by: Takashi Iwai commit 37d57443d5d810c6ef49e93586b046e7d4774818 Author: Tero Roponen Date: Wed Dec 1 20:04:20 2010 +0200 slub: Fix a crash during slabinfo -v Commit f7cb1933621bce66a77f690776a16fe3ebbc4d58 ("SLUB: Pass active and inactive redzone flags instead of boolean to debug functions") missed two instances of check_object(). This caused a lot of warnings during 'slabinfo -v' finally leading to a crash: BUG ext4_xattr: Freepointer corrupt ... BUG buffer_head: Freepointer corrupt ... BUG ext4_alloc_context: Freepointer corrupt ... ... BUG: unable to handle kernel NULL pointer dereference at 0000000000000008 IP: [] file_sb_list_del+0x1c/0x35 PGD 79d78067 PUD 79e67067 PMD 0 Oops: 0002 [#1] SMP last sysfs file: /sys/kernel/slab/:t-0000192/validate This patch fixes the problem by converting the two missed instances. Acked-by: Christoph Lameter Signed-off-by: Tero Roponen Signed-off-by: Pekka Enberg commit 8165984acf825917437debae519209073c32a5a7 Author: Tero Roponen Date: Wed Dec 1 20:04:20 2010 +0200 slub: Fix a crash during slabinfo -v Commit f7cb1933621bce66a77f690776a16fe3ebbc4d58 ("SLUB: Pass active and inactive redzone flags instead of boolean to debug functions") missed two instances of check_object(). This caused a lot of warnings during 'slabinfo -v' finally leading to a crash: BUG ext4_xattr: Freepointer corrupt ... BUG buffer_head: Freepointer corrupt ... BUG ext4_alloc_context: Freepointer corrupt ... ... BUG: unable to handle kernel NULL pointer dereference at 0000000000000008 IP: [] file_sb_list_del+0x1c/0x35 PGD 79d78067 PUD 79e67067 PMD 0 Oops: 0002 [#1] SMP last sysfs file: /sys/kernel/slab/:t-0000192/validate This patch fixes the problem by converting the two missed instances. Acked-by: Christoph Lameter Signed-off-by: Tero Roponen Signed-off-by: Pekka Enberg commit 22ed1113a9adda6e193c329119a384362da01289 Author: Chris Wilson Date: Sat Dec 4 01:01:29 2010 +0000 drm/i915: Death to the unnecessary 64bit divide Use the hardware DDA to calculate the ratio with as much accuracy as is possible. Signed-off-by: Chris Wilson Cc: stable@kernel.org commit 3d44661ad1f6336345a9f7765afef6d0aeac543e Author: Roland Vossen Date: Wed Dec 1 21:38:31 2010 +0100 staging: brcm80211: added firmware validation Fix for https://bugzilla.kernel.org/show_bug.cgi?id=21872 New function wl_check_firmwares() checks validity of all firmware images loaded from user space. Signed-off-by: Roland Vossen Cc: stable Signed-off-by: Greg Kroah-Hartman commit fe4bfb30fe5788100a70c0ed96ddd8c6186eb9c4 Merge: 367576b813ed66a000e66ec18f7082bbc84c05d7 e3e9887ee9de36d8e2bef972ad74a42abd7a44c4 Author: Greg Kroah-Hartman Date: Fri Dec 3 12:12:29 2010 -0800 Merge branch 'sh/ehci' of master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6 into work * 'sh/ehci' of master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6: sh: Convert to USB_ARCH_HAS_OHCI/EHCI selects. usb: ehci-sh: Add missing ehci helpers. usb: ehci-sh: Fix up fault in shutdown path. sh: Add EHCI support for SH7786. usb: ehci-hcd: Add support for SuperH EHCI. usb: ohci-sh: Set IRQ as shared. commit 367576b813ed66a000e66ec18f7082bbc84c05d7 Merge: 16350a7258a3158807f3fafe33f1bb22b8ddd127 0607f8622953541e95030ab011258d9f1f381357 Author: Greg Kroah-Hartman Date: Fri Dec 3 12:10:06 2010 -0800 Merge branch 'for-next' of git://gitorious.org/usb/usb into usb-next * 'for-next' of git://gitorious.org/usb/usb: usb: musb: gadget: prevent a NULL pointer dereference usb: musb: add names for IRQs in structure resource usb: musb: remove board_data parameter from musb_platform_init() commit 16350a7258a3158807f3fafe33f1bb22b8ddd127 Author: Namhyung Kim Date: Thu Dec 2 05:52:22 2010 +0900 uwb: fix compiler warning on i1480_est_id_table Annotate i1480_est_id_table as '__used' to fix following warning: CC drivers/uwb/i1480/i1480-est.o drivers/uwb/i1480/i1480-est.c:94: warning: ‘i1480_est_id_table’ defined but not used Signed-off-by: Namhyung Kim Cc: David Vrabel Signed-off-by: Greg Kroah-Hartman commit fc33b0eb38ccbd3080a4885e8f742a72a085261d Author: Namhyung Kim Date: Thu Dec 2 05:52:21 2010 +0900 uwb: fix compiler warning on whcrc_id_table Annotate whcrc_id_table as '__used' to fix following warning: CC drivers/uwb/whc-rc.o drivers/uwb/whc-rc.c:452: warning: ‘whcrc_id_table’ defined but not used Signed-off-by: Namhyung Kim Cc: David Vrabel Signed-off-by: Greg Kroah-Hartman commit df4fedeaa623f6af0b72c0089000b5ea5540ed22 Author: Richard Röjfors Date: Wed Dec 1 11:53:00 2010 +0100 usb: g_audio: Fix crash at driver removal If g_audio fails to open the sound control device, it crashes at removal: Insertion: [ 4143.836536] g_audio gadget: unable to open sound control device file: /dev/snd/controlC0 [ 4143.836543] g_audio gadget: we need at least one control device [ 4143.836551] g_audio gadget: Linux USB Audio Gadget, version: Dec 18, 2008 [ 4143.836558] g_audio gadget: g_audio ready Removal: [ 4146.802643] BUG: unable to handle kernel paging request at 00023018 [ 4146.802655] IP: [] filp_close+0xa/0x5b [ 4146.802674] *pdpt = 0000000015426001 *pde = 0000000000000000 [ 4146.802684] Oops: 0000 [#1] PREEMPT SMP [ 4146.802692] last sysfs file: /sys/power/state [ 4146.802701] Modules linked in: g_audio(-) ioh_udc fuse asix usbnet [last unloaded: g_audio] [ 4146.802719] [ 4146.802728] Pid: 1394, comm: rmmod Not tainted 2.6.33.5-26.1-ivi #1 To be filled by O.E.M./To be filled by O.E.M. [ 4146.802738] EIP: 0060:[] EFLAGS: 00010206 CPU: 0 [ 4146.802746] EIP is at filp_close+0xa/0x5b [ 4146.802753] EAX: 00023000 EBX: 00023000 ECX: 00000046 EDX: df842680 [ 4146.802760] ESI: e071cd4c EDI: df842680 EBP: ddbbbef0 ESP: ddbbbee4 [ 4146.802768] DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 [ 4146.802776] Process rmmod (pid: 1394, ti=ddbba000 task=dd95a4f0 task.ti=ddbba000) [ 4146.802782] Stack: [ 4146.802787] d540c280 e071cd4c df2bc000 ddbbbefc e071b82c df11e440 ddbbbf04 e071c622 [ 4146.802804] <0> ddbbbf28 e071c47f 00000008 e071cd74 df11e464 df2bc01c df2bc000 e071ce68 [ 4146.802822] <0> 00000880 ddbbbf38 e07fd1b8 e071cef0 00000000 ddbbbf40 e071b9f4 ddbbbf48 [ 4146.802842] Call Trace: [ 4146.802857] [] ? gaudio_cleanup+0x87/0xe0 [g_audio] [ 4146.802869] [] ? audio_unbind+0x8/0xc [g_audio] [ 4146.802881] [] ? composite_unbind+0x8d/0xcb [g_audio] [ 4146.802895] [] ? usb_gadget_unregister_driver+0x7b/0xc0 [ioh_udc] [ 4146.802908] [] ? usb_composite_unregister+0x15/0x17 [g_audio] [ 4146.802920] [] ? cleanup+0xd/0xf [g_audio] [ 4146.802932] [] ? sys_delete_module+0x185/0x1dd [ 4146.802944] [] ? do_page_fault+0x248/0x276 [ 4146.802956] [] ? sysenter_do_call+0x12/0x26 [ 4146.802962] Code: 12 5f 3a 00 8b 43 04 8b 40 0c 0f b3 30 3b 73 44 73 03 89 73 44 89 f8 e8 f1 61 3a 00 5b 5e 5f 5d c3 55 89 e5 57 89 d7 56 53 89 c3 <8b> 40 18 85 c0 75 0f 68 32 15 5e c1 31 f6 e8 52 39 3a 00 5a eb [ 4146.803058] EIP: [] filp_close+0xa/0x5b SS:ESP 0068:ddbbbee4 [ 4146.803071] CR2: 0000000000023018 [ 4146.803112] ---[ end trace 0989a7e023da0434 ]--- This patch makes sure not to assign the_card if gaudio_open_snd_dev fails, since the parent function will deallocate the card. Also make sure all filp's in gaudio_open_snd_dev is assigned NULL upon error and gaudio_close_snd_dev only cleanups when the filp's are non-NULL. Signed-off-by: Richard Röjfors Cc: David Brownell Signed-off-by: Greg Kroah-Hartman commit b62c99b17c2c513eaf6b77a76907a13a1beb86d3 Author: Emilio G. Cota Date: Fri Dec 3 14:20:51 2010 +0000 staging/vme_user: add missing calls to vme_master_free calls in .remove Signed-off-by: Emilio G. Cota Acked-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit 4740a0846069f6d4cbba9e328a9d92e6dd76110d Author: Emilio G. Cota Date: Fri Dec 3 13:44:15 2010 +0000 staging/vme/vme_user: use __dev{init, exit} for .probe and .remove Signed-off-by: Emilio G. Cota [martyn.welch@ge.com: Fixed checkpatch line length warnings] Signed-off-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit 1daa38d379932bde0d2036c2e10ced3e8842b74f Author: Emilio G. Cota Date: Fri Dec 3 09:05:08 2010 +0000 staging/vme_user: fix usage of the slave resources after they've been freed buf_unalloc() frees the memory buffers allocated with vme_alloc_consistent. The associated VME resource is needed in both vme_alloc_consistent and vme_free_consistent; however the slave VME resources are being freed before the calls to vme_free_consistent are made, which means the buffers are never returned. Fix this by freeing the VME resources only after the consistent buffers have been returned. Signed-off-by: Emilio G. Cota Acked-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit 11e8896474495dec7ce19a542f67def847ec208f Merge: 8338fded137681bc3c1e99a69ac937a4fb016fe4 512b109ec9620d037d6d2f6bd1bae9ce34dd6779 Author: Linus Torvalds Date: Fri Dec 3 11:30:57 2010 -0800 Merge branch '2.6.37-rc4-pvhvm-fixes' of git://xenbits.xen.org/people/sstabellini/linux-pvhvm * '2.6.37-rc4-pvhvm-fixes' of git://xenbits.xen.org/people/sstabellini/linux-pvhvm: xen: unplug the emulated devices at resume time xen: fix save/restore for PV on HVM guests with pirq remapping xen: resume the pv console for hvm guests too xen: fix MSI setup and teardown for PV on HVM guests xen: use PHYSDEVOP_get_free_pirq to implement find_unbound_pirq commit ca44ac386181ba710a9ab6db900d6c1e5451b366 Author: Changli Gao Date: Mon Nov 29 22:48:46 2010 +0000 net: don't reallocate skb->head unless the current one hasn't the needed extra size or is shared skb head being allocated by kmalloc(), it might be larger than what actually requested because of discrete kmem caches sizes. Before reallocating a new skb head, check if the current one has the needed extra size. Do this check only if skb head is not shared. Signed-off-by: Changli Gao Cc: Eric Dumazet Acked-by: Eric Dumazet Signed-off-by: David S. Miller commit 2e18edf75d586d9044c1f1e6b1bc8e7c26c4149f Author: Ben Dooks Date: Fri Dec 3 18:00:06 2010 +0000 ARM: mini2440: Fix Kconfig to allow kernel to build The MACH_MINI2440 entry requires the backlight LED driver, but this subsystem has not been enabled and the select of LEDS_TRIGGER_BACKLIGHT alone is insufficient to enable the necessary bits of the LED driver. Add NEW_LEDS, LEDS_CLASS and LEDS_TRIGGER to the select to allow the kernel to link. This fixes the following error: drivers/built-in.o: In function `led_trigger_set': /home/ben/linux.git/drivers/leds/led-triggers.c:116: undefined reference to `led_brightness_set' Signed-off-by: Ben Dooks commit 8338fded137681bc3c1e99a69ac937a4fb016fe4 Merge: 9cd6315357eccb768d9062cb43e3dc741e922020 29dcbc5c25d6d8140337e96bf503c8475092c586 805e3f495057aa5307ad4e3d6dc7073d4733c691 Author: Linus Torvalds Date: Fri Dec 3 10:08:52 2010 -0800 Merge branches 'upstream/core' and 'upstream/bugfix' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen * 'upstream/core' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen: xen: allocate irq descs on any NUMA node xen: prevent crashes with non-HIGHMEM 32-bit kernels with largeish memory xen: use default_idle xen: clean up "extra" memory handling some more * 'upstream/bugfix' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen: xen: x86/32: perform initial startup on initial_page_table xen: don't bother to stop other cpus on shutdown/reboot commit 47f1c6c9ffdec0c0e5a2c2709bd63c7380b325c4 Author: Chris Wilson Date: Fri Dec 3 15:37:31 2010 +0000 drm/i915: Clean conflicting modesetting registers upon init If we leave the registers in a conflicting state then when we attempt to teardown the active mode, we will not disable the pipes and planes in the correct order -- leaving a plane reading from a disabled pipe and possibly leading to undefined behaviour. Reported-and-tested-by: Andy Whitcroft Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=32078 Signed-off-by: Chris Wilson Cc: stable@kernel.org commit 289700dbc40c78741f17e2304ed4ac0db3c3afd3 Author: Don Skidmore Date: Fri Dec 3 03:32:58 2010 +0000 ixgbe: add support for new format of PBA numbers The new PBA format is stored as a string. This patch allows the driver to support both the old and new format. Signed-off-by: Don Skidmore Tested-by: Stephen Ko Signed-off-by: Jeff Kirsher Signed-off-by: David S. Miller commit dbffcb210f45239ea530e0a71470e48abefe4210 Author: Don Skidmore Date: Fri Dec 3 03:32:34 2010 +0000 ixgbe: add support for 82599 FCoE SKU Add both NIC and backplane support for FCoE enabled devices IDs. Signed-off-by: Don Skidmore Tested-by: Stephen Ko Signed-off-by: Jeff Kirsher Signed-off-by: David S. Miller commit 0b077feac00a8b7b0afbab3274b2e74b749bc917 Author: Don Skidmore Date: Fri Dec 3 03:32:13 2010 +0000 ixgbe: add WOL support for SFP+ subdevice This patch will add wake on LAN support to the dev/sub_dev 10FB 11A9. This will also include ixgbe ethtool support for this device. Signed-off-by: Don Skidmore Tested-by: Stephen Ko Signed-off-by: Jeff Kirsher Signed-off-by: David S. Miller commit c6ecf39a10ceec3e97096e2a8d3eadcecd593422 Author: Don Skidmore Date: Fri Dec 3 03:31:51 2010 +0000 ixgbe: fix link behavior for SFP+ when driver is brought down We have had several requests to have ifconfig down command disable the SFP+ laser and thus make link go down. Likewise on ifconfig up the laser would be enabled and link would come up. This patch enables that behavior. Signed-off-by: Don Skidmore Tested-by: Stephen Ko Signed-off-by: Jeff Kirsher Signed-off-by: David S. Miller commit e4d849b8113b0cf7b6ebfa9ee4c47bd514ea49d3 Author: Anirban Chakraborty Date: Thu Dec 2 20:42:08 2010 +0000 qlcnic: Updated driver version to 5.0.13 Signed-off-by: Anirban Chakraborty Signed-off-by: David S. Miller commit 40839129f77903cbbb7f232e2e2ab08dfe4a4f8d Author: Sritej Velaga Date: Thu Dec 2 20:41:56 2010 +0000 qlcnic: LICENSE file for qlcnic Signed-off-by: Sritej Velaga Signed-off-by: Anirban Chakraborty Signed-off-by: David S. Miller commit 091056b2ad04df09a3cb78a4c4ea098709b98eb3 Author: Amit Kumar Salecha Date: Thu Dec 2 20:41:43 2010 +0000 qlcnic: validate eswitch config values for PF Currently driver set default eswitch configuration values for PF function, instead of validating values sent by application. Signed-off-by: Amit Kumar Salecha Signed-off-by: Anirban Chakraborty Signed-off-by: David S. Miller commit 97319a270da37a5eab14a770f1417d8229245270 Author: Sucheta Chakraborty Date: Thu Dec 2 20:41:23 2010 +0000 qlcnic: Disable loopback support Loopback mode can not be supported in CNA mode. Removing it until FW is fixed. Signed-off-by: Sucheta Chakraborty Signed-off-by: Anirban Chakraborty Signed-off-by: David S. Miller commit 9cd6315357eccb768d9062cb43e3dc741e922020 Merge: 88063dd69b124721e18a59535d4f35266fcb867f 2ff38c9fbaa86264ad819117ab137361067ab5f1 Author: Linus Torvalds Date: Fri Dec 3 09:20:41 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: ASoC: omap: N810: Don't select CONFIG_OMAP_MUX but make it as dependency ALSA: hda: Use "alienware" model quirk for another SSID ASoC: WM8731: Fix incorrect mask for bypass path disable s6105-ipcam: fix compilation s6000-pcm: fix compilation s6000-i2s: fix compilation ASoC: Fix missing spin_unlock_irqrestore ALSA: Fix SNDCTL_DSP_RESET ioctl for OSS emulation ASoC: Add missing dev_set_drvdata in p1022_ds_probe ASoC: Add missing dev_set_drvdata in mpc8610_hpcd_probe ASoC: Remove unneeded !! operations while checking return value of nuc900_checkready ASoC: Fix compile error for nuc900-pcm.c ASoC: Fix prototype for nuc900_ac97_probe and nuc900_ac97_remove ASoC: Fix compile error for nuc900-ac97.c ALSA: hda: Use BIOS auto-parsing instead of existing model quirk for MEDION MD2 commit 88063dd69b124721e18a59535d4f35266fcb867f Merge: df9d38ebda762e54ed0b142c2c47b2f57a145ab2 7ac760c2f78ddd8e1bd633767b01becfbbf96720 Author: Linus Torvalds Date: Fri Dec 3 09:20:21 2010 -0800 Merge branch 'linux-next' of git://git.infradead.org/ubi-2.6 * 'linux-next' of git://git.infradead.org/ubi-2.6: UBI: fix corrupted PEB detection for NOR flash commit df9d38ebda762e54ed0b142c2c47b2f57a145ab2 Merge: 47337ad65f823358609865c5dff77404744bc38e a9fc749224bfb69686322643678f89e00303ee21 Author: Linus Torvalds Date: Fri Dec 3 09:19:54 2010 -0800 Merge branch 'sh-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 * 'sh-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6: sh: se/7724: Remove FSI/B of GPIO init code sh: se/7724: Update clock framework of FSI clock to non-legacy sh: Assume new page cache pages have dirty dcache lines. sh: boards: mach-se: use IS_ERR() instead of NULL check sh: Add div6_reparent_clks to clock framework for FSI dma: shdma: add a MODULE_ALIAS() to allow module autoloading commit 47337ad65f823358609865c5dff77404744bc38e Merge: a9df42e1175d30545ffa1e17a3df1b39c107d33a 16cdd4336fdca9b50f991b591005b5f6416f82c4 Author: Linus Torvalds Date: Fri Dec 3 09:19:31 2010 -0800 Merge branch 'fbdev-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6 * 'fbdev-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/fbdev-2.6: lxfb: Maintain video processor palette through suspend/resume video: da8xx: Register IRQ as last thing in driver probing. framebuffer: fix fbcmap.c kernel-doc warning commit a9df42e1175d30545ffa1e17a3df1b39c107d33a Author: David Howells Date: Fri Dec 3 15:59:50 2010 +0000 MN10300: Implement asm/syscall.h Implement asm/syscall.h for the MN10300 arch. Signed-off-by: David Howells Signed-off-by: Linus Torvalds commit 7e300bc8e6736d41e7b92978f415572ac60fd59b Author: Ben Hutchings Date: Thu Dec 2 13:48:28 2010 +0000 sfc: Store MAC address from NVRAM in net_device::perm_addr For some reason we failed to make this change when perm_addr was introduced. Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 02ebc26865c2755720d2ede90a5ab27c45741823 Author: Ben Hutchings Date: Thu Dec 2 13:48:20 2010 +0000 sfc: Use current MAC address, not NVRAM MAC address, for WoL filter Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 4f3907e9a600a46d8c946469ce6636080310d12e Author: Steve Hodgson Date: Thu Dec 2 13:48:14 2010 +0000 sfc: When waking a stopped tx_queue, only lock that tx_queue Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 78d4189d6b000898db2d9a9d745468f1322cbc71 Author: Ben Hutchings Date: Thu Dec 2 13:47:56 2010 +0000 sfc: Update kernel-doc to match earlier move of Toeplitz hash key Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit cef68bde74f083d83c18ce870ed834e82ee0ae5a Author: Ben Hutchings Date: Thu Dec 2 13:47:51 2010 +0000 sfc: Move xmac_poll_required into struct falcon_nic_data Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 40641ed93cd53561f7d53b5fd5ed656b35f3aabd Author: Ben Hutchings Date: Thu Dec 2 13:47:45 2010 +0000 sfc: Move Falcon global event handling to falcon.c Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 4833f02a2972b7da4c8a15e1e329db0f984a75d9 Author: Ben Hutchings Date: Thu Dec 2 13:47:35 2010 +0000 sfc: Move mdio_lock to struct falcon_nic_data We only have direct access to MDIO on Falcon, so move this out of struct efx_nic. Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 4de92180258ac661bbce0f0065c9c81633ac862b Author: Ben Hutchings Date: Thu Dec 2 13:47:29 2010 +0000 sfc: Move SPI state to struct falcon_nic_data We only have direct access to SPI on Falcon, so move all this state out of struct efx_nic. Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 90b7a4ee610bf1d14120f5e0618ae2a3568394a5 Author: Ben Hutchings Date: Thu Dec 2 13:47:17 2010 +0000 sfc: Remove unnecessary inclusion of various private header files Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 6a8872c54d177abd900a0cf165b76ecb4803f052 Author: Ben Hutchings Date: Thu Dec 2 13:47:10 2010 +0000 sfc: Expose Falcon BootROM config through MTD, not ethtool The ethtool EEPROM interface is really meant for exposing chip configuration, not BootROM configuration. Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 6c88b0b6dc886e49c0e6ee21d677c2e380bde688 Author: Ben Hutchings Date: Thu Dec 2 13:47:01 2010 +0000 sfc: Remove broken automatic fallback for invalid Falcon chip/board config If the Falcon board config is invalid, we cannot proceed - we do not have a valid board type to pass to falcon_probe_board(), and if we kluge that to work with an unknown board then other initialisation code will crash. Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 18e3ee2cf96adf072deeb291eed670f2c23bb2fc Author: Steve Hodgson Date: Thu Dec 2 13:46:55 2010 +0000 sfc: Fix event based MCDI completion and MC REBOOT/CMDDONE ordering issue The mcfw *never* sends CMDDONE when rebooting. Changing this so that it always sends CMDDONE *before* REBOOT is easy on Siena, but it's not obvious that we could guarantee to be able to implement this on future hardware. Given this, I'm less convinced that the protocol should be changed. To reiterate the failure mode: The driver sees this: issue command receive REBOOT event Was that reboot event sent before the command was issued, or in response to the command? If the former then there will be a subsequent CMDDONE event, if the latter, then there will be no CMDDONE event. Options to resolve this are: 1. REBOOT always completes an outstanding mcdi request, and we set the credits count to ignore a subsequent CMDDONE event with mismatching seqno. 2. REBOOT never completes an outstanding mcdi request. If there is no CMDDONE event then we rely on the mcdi timeout code to complete the outstanding request, incurring a 10s delay. I'd argue that (2) is tidier, but that incurring a 10s delay is a little needless. Let's go with (1). Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 3157183a90fdbd686f939d2f032b675f7e9983d6 Author: Ben Hutchings Date: Thu Dec 2 13:46:37 2010 +0000 sfc: Clear RXIN_SEL when soft-resetting QT2025C When we enable PMA/PMD loopback this automatically sets RXIN_SEL (inverse polarity for RXIN). We need to clear that bit during the soft-reset sequence, as it is not done automatically. Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit adc1d234116c22247e3886fb6e9bef450a0110f2 Author: Ben Hutchings Date: Thu Dec 2 13:46:31 2010 +0000 sfc: Read-to-clear LM87 alarm/interrupt status at start of day We do not want to shut down the board based on a fault that has already been cleared. Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 71839f7d162f973f5931d30d1376a2dc5c0bed5a Author: Ben Hutchings Date: Thu Dec 2 13:46:24 2010 +0000 sfc: Distinguish critical and non-critical over-temperature conditions Set both the 'maximum' and critical temperature limits for LM87 hardware monitors on Falcon boards. Do not shut down a port until the critical temperature is reached, but warn as soon as the 'maximum' temperature is reached. Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 4484cd7dedecf59aee0775c6658f95bdee65f277 Author: Ben Hutchings Date: Thu Dec 2 13:46:14 2010 +0000 sfc: Fix condition for no-op in set_phy_flash_cfg() Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit f18ca364617d5e1fdd7300e025473496e397db4b Author: Ben Hutchings Date: Thu Dec 2 13:46:09 2010 +0000 sfc: Reduce log level for MCDI error response in efx_mcdi_rpc() Some errors are expected, e.g. when sending new commands to an MC running old firmware. Only the caller of efx_mcdi_rpc() can decide what is a real error. Therefore log the error responses with netif_dbg(). Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller commit 287050d390264402e11bea8b811859e42e8faa29 Author: Steven Rostedt Date: Thu Dec 2 16:46:18 2010 -0500 tracing: Add TRACE_EVENT_CONDITIONAL() There are instances in the kernel that we only want to trace a tracepoint when a certain condition is set. But we do not want to test for that condition in the core kernel. If we test for that condition before calling the tracepoin, then we will be performing that test even when tracing is not enabled. This is 99.99% of the time. We currently can just filter out on that condition, but that happens after we write to the trace buffer. We just wasted time writing to the ring buffer for an event we never cared about. This patch adds: TRACE_EVENT_CONDITION() and DEFINE_EVENT_CONDITION() These have a new TP_CONDITION() argument that comes right after the TP_ARGS(). This condition can use the parameters of TP_ARGS() in the TRACE_EVENT() to determine if the tracepoint should be traced or not. The TP_CONDITION() will be placed in a if (cond) trace; For example, for the tracepoint sched_wakeup, it is useless to trace a wakeup event where the caller never actually wakes anything up (where success == 0). So adding: TP_CONDITION(success), which uses the "success" parameter of the wakeup tracepoint will have it only trace when we have successfully woken up a task. Acked-by: Mathieu Desnoyers Acked-by: Frederic Weisbecker Cc: Arjan van de Ven Cc: Thomas Gleixner Signed-off-by: Steven Rostedt commit 7ac760c2f78ddd8e1bd633767b01becfbbf96720 Author: Artem Bityutskiy Date: Thu Dec 2 06:34:01 2010 +0200 UBI: fix corrupted PEB detection for NOR flash My new shiny code for corrupted PEB detection has NOR specific bug. We tread PEB as corrupted and preserve it, if 1. EC header is OK. 2. VID header is corrupted. 3. data area is not "all 0xFFs" In case of NOR we have 'nor_erase_prepare()' quirk, which invalidates the headers before erasing the PEB. And we invalidate first the VID header, and then the EC header. So if a power cut happens after we have invalidated the VID header, but before we have invalidated the EC header, we end up with a PEB which satisfies the above 3 conditions, and the scanning code will treat it as corrupted, and will print scary warnings, wrongly. This patch fixes the issue by firt invalidating the EC header, then invalidating the VID header. In case of power cut inbetween, we still just lose the EC header, and UBI can deal with this situation gracefully. Thanks to Anatolij Gustschin for tracking this down. Signed-off-by: Artem Bityutskiy Reported-by: Anatolij Gustschin Tested-by: Anatolij Gustschin commit 3a253445e327d0295bbe51bcbec5f44f86b54a8c Author: John Baboval Date: Thu Dec 2 11:21:31 2010 -0500 ALSA: hda - Fix ThinkPad T410[s] docking station line-out On the docking station for the Lenovo T410 and T410s, the line-out doesn't work. The trouble seems to be that it generates a plug event, but then doesn't report that the jack is connected. So automute mutes the jack when you plug something into it. The following patch (next message) fixes it. Signed-off-by: John Baboval Signed-off-by: Takashi Iwai commit a1087ef6abedf0bfd60e5e3fddf33192cb2c1325 Author: Julia Lawall Date: Wed Nov 24 15:54:18 2010 +0100 scripts/coccinelle: update for compatability with Coccinelle 0.2.4 For doubleinit.cocci, Coccinelle 0.2.4 requires a comma after ... in a field list. Coccinelle also now behaves gracefully when a definition is provided for a virtual that doesn't exist, so there is no need for the semantic patch code to check for this case. Updated the documentation to reflect the fact that the best results will now be obtained with Coccinelle version 0.2.4 or later. Signed-off-by: Julia Lawall commit 77c4d5cdb81d25a45fbdfb84dd3348121219a072 Author: Daniel T Chen Date: Thu Dec 2 22:45:45 2010 -0500 ALSA: hda: Use model=lg quirk for LG P1 Express to enable playback and capture BugLink: https://launchpad.net/bugs/595482 The original reporter states that audible playback from the internal speaker is inaudible despite the hardware being properly detected. To work around this symptom, he uses the model=lg quirk to properly enable both playback, capture, and jack sense. Another user corroborates this workaround on separate hardware. Add this PCI SSID to the quirk table to enable it for further LG P1 Expresses. Reported-and-tested-by: Philip Peitsch Tested-by: nikhov Cc: [2.6.32+] Signed-off-by: Daniel T Chen Signed-off-by: Takashi Iwai commit 96886c4361f1ae3f6c775d7c9295e2d557101d0f Author: Arnaud Patard (Rtp) Date: Fri Nov 26 15:20:52 2010 +0100 iMX51: introduce IMX_GPIO_NR Currently, to define a GPIO number, we're using something like : #define EFIKAMX_PCBID0 (2*32 + 16) to define GPIO 3 16. This is not really readable and it's error prone imho (note the 3 vs 2). So, I'm introducing a new macro to define this in a better way. Now, the code sample become : #define EFIKAMX_PCBID0 IMX_GPIO_NR(3, 16) v2: - move to gpio.h - add parens & spaces - switch to IMX_GPIO_NR instead of MX51_GPIO_NR Signed-off-by: Arnaud Patard Cc: Amit Kucheria Cc: Sascha Hauer Cc: Eric BĂ©nard Signed-off-by: Sascha Hauer commit b99545cb59dc0a55507100a1335f4fd0ed521032 Author: Fabio Estevam Date: Fri Nov 26 12:25:59 2010 -0200 ARM: mx5: dynamically allocate imx2-wdt devices Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit d94ed1287e11f91e4f4096838179984b0206be5e Author: Fabio Estevam Date: Fri Nov 26 12:25:58 2010 -0200 ARM: mx5: introduce SOC_IMX51 Introduce SOC_IMX51 to keep consistency with the other i.MX devices Signed-off-by: Fabio Estevam Acked-by: Uwe Kleine-König Signed-off-by: Sascha Hauer commit abebbb468050ad63caed55fdb7a6bfce732e9a7f Author: Vasiliy Kulikov Date: Fri Nov 26 20:05:55 2010 +0300 arm: dma: check clk_get() result clk_get() may return ERR_PTR(), if so propagate return code as imx_dma_init() return code. Signed-off-by: Vasiliy Kulikov Signed-off-by: Sascha Hauer commit 0ef51953be84cf910cdf5d9a6b8ccb75fd3dd10c Author: Arnaud Patard (Rtp) Date: Fri Nov 26 15:27:53 2010 +0100 mx5: Fix efikamx build Commit 124bf94a "ARM: imx: fix name for functions adding sdhci-esdhc-imx devices" changed some devices and Kconfig entry and didn't change every places it should have. It's breaking efikamx build. I've fixed 3ds Kconfig entry as I believe it's broken there too. Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit 4c6c32b3f856346158161a8c9824b4dd2bff0893 Author: Uwe Kleine-König Date: Mon Nov 29 08:58:14 2010 +0100 ARM: mx25: fix offset for usb host controller In commit 2c20b9f (ARM: mx25: dynamically allocate mxc-ehci devices) I changed the offset to the value specified in the reference manual intending to test this change on hardware. This slipped through and now prooved to be wrong. So fix it and add a comment about the documentation being wrong. Reported-by: Jaume Ribot Cc: Michael Trimarchi Cc: Shawn Guo Signed-off-by: Uwe Kleine-König Signed-off-by: Sascha Hauer commit 29bb6afcb077bd153c7738e73840dde808132fb5 Author: Eric BĂ©nard Date: Sat Nov 27 09:15:38 2010 +0100 plat-mxc/ehci.c: fix compile breakage commits 2eb42d5c287f5e883a4b3ebe668ba880caa351e5 and 9e1dde33876ba83ad586c336647fff133d0f5472 renamed some defines but didn't fix all the places where these defines are used leading to a compile failure for USB on i.MX31, 35 and 27. Signed-off-by: Eric BĂ©nard Signed-off-by: Sascha Hauer commit 4e5cf41eeb254b7e50666496ac5697188b31320b Author: Sascha Hauer Date: Thu Nov 4 15:50:38 2010 +0100 ARM i.MX SDMA: Add ROM script addresses to platform_data Signed-off-by: Sascha Hauer commit 5b28aa319bba96987316425a1131813d87cbab35 Author: Sascha Hauer Date: Wed Oct 6 15:41:15 2010 +0200 dmaengine i.MX SDMA: Allow to run without firmware The SDMA firmware consists of a ROM part and a RAM part. The ROM part is always present in the SDMA engine and is sufficient for many cases. This patch allows to pass in platform data containing the script addresses in ROM, so loading a firmware is optional now. Signed-off-by: Sascha Hauer Acked-by: Dan Williams commit 87e51107323a84e26a5004337217fc954e8d9545 Author: Tracey Dent Date: Sat Nov 6 17:01:36 2010 -0400 drivers/dma/: Use the ccflag-y instead of EXTRA_CFLAGS Use the ccflag-y flag instead of EXTRA_CFLAGS because EXTRA_CFLAGS is deprecated and should now be switched. According to (documentation/kbuild/makefiles.txt). Signed-off-by: Tracey Dent Acked-by: Linus Walleij Signed-off-by: Andrew Morton Signed-off-by: Dan Williams commit 51a1efe2e84493439db32c07471e835c752a7923 Author: Axel Lin Date: Tue Nov 2 09:52:17 2010 +0800 dma: intel_mid_dma: fix double free on mid_setup_dma error path We should not call kfree(dma) in mid_setup_dma error path because the memory is allocated in intel_mid_dma_probe and will be freed in intel_mid_dma_probe error path if mid_setup_dma return error. Signed-off-by: Axel Lin Signed-off-by: Dan Williams commit cbeae41888bddb2d8c23db281de5f38f4be6a9bb Author: Axel Lin Date: Tue Nov 2 09:12:57 2010 +0800 dma: imx-dma: fix imxdma_probe error path otherwise, i will be -1 inside the latest iteration of the while loop. Signed-off-by: Axel Lin Acked-by: Sascha Hauer Signed-off-by: Dan Williams commit 0df7095205cbf6ea1cdfe6254e0d6a3b823caa3b Author: Russell King Date: Thu Dec 2 19:16:56 2010 +0000 ARM: SMP: remove IRQ-disabling for smp_cross_call() As we've now removed the spinlock and bitmask, we have nothing left which requires interrupts to be disabled when sending an IPI. All current IPI-sending implementations use the GIC, which also does not require interrupts disabled when calling gic_raise_softirq(). Remove the now unnecessary IRQ disable. Signed-off-by: Russell King commit 24480d980e9063b3ebd0dfdf2f396c305956c356 Author: Russell King Date: Mon Nov 15 09:54:18 2010 +0000 ARM: SMP: avoid using bitmasks and locks for IPIs, use hardware instead Avoid using bitmasks and locks in the percpu area for IPIs, and instead use individual software generated interrupts to identify the reason for the IPI. This avoids the problems of having spinlocks in the percpu area. Reviewed-by: Catalin Marinas Signed-off-by: Russell King commit ad3b6993b9c5482e8a2ec5aed181538c921fdcbd Author: Russell King Date: Mon Nov 15 09:42:08 2010 +0000 ARM: SMP: pass an ipi number to smp_cross_call() This allows us to use smp_cross_call() to trigger a number of different software generated interrupts, rather than combining them all on one SGI. Recover the SGI number via do_IPI. Reviewed-by: Catalin Marinas Signed-off-by: Russell King commit d92e04713c6323e09a0d0fdfa0d7cbcedb175e49 Author: Russell King Date: Mon Nov 15 09:36:18 2010 +0000 ARM: remove obsolete smp_cross_call_done() smp_cross_call_done() was removed long ago (see 78d236c - remove useless smp_cross_call_done()). Remove those which have been subsequently merged. Reviewed-by: Catalin Marinas Signed-off-by: Russell King commit f6d84f4a7df8057247a3f1723169586af3882436 Author: Magnus Damm Date: Fri Dec 3 07:22:31 2010 +0000 ARM: mach-shmobile: AG5 clock framework improvements This patch improves the state of the AG5 clock framework support. The main clock parent is automatically detected, but most of the clocks are not used by any driver or subsystem at this point. More work is needed for support of multi media hardware such as FSI and/or LCDC/MIPI-DSI. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit a9fc749224bfb69686322643678f89e00303ee21 Merge: fa3c9f3de2504bb09f8ad512f89837751a3eb741 c44352c5357210172b3c30df61e0bc603ffc700e Author: Paul Mundt Date: Fri Dec 3 14:42:29 2010 +0900 Merge branch 'sh/urgent' into sh-fixes-for-linus commit c44352c5357210172b3c30df61e0bc603ffc700e Author: Nobuhiro Iwamatsu Date: Fri Dec 3 05:37:54 2010 +0000 sh: se/7724: Remove FSI/B of GPIO init code se7724 board does not have FSI/B. Signed-off-by: Nobuhiro Iwamatsu Signed-off-by: Paul Mundt commit e17ca5cf3c5b2a769bcde2c37cf0d96f08c8cb17 Author: Nobuhiro Iwamatsu Date: Fri Dec 3 05:37:53 2010 +0000 sh: se/7724: Update clock framework of FSI clock to non-legacy Signed-off-by: Nobuhiro Iwamatsu Signed-off-by: Paul Mundt commit ebb27386ffd2fcd0fad141e0eee97b8070f94ee2 Merge: 6d20e8406f0942228a73000663c2b33f488103ea 59e57c622c3502346e8f930421ebc482d639520c Author: Steve French Date: Fri Dec 3 03:52:43 2010 +0000 Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6 commit 59e57c622c3502346e8f930421ebc482d639520c Merge: 33dd94ae1ccbfb7bf0fb6c692bc3d1c4269e6177 83ed79c561da20019cb24944f535530d73b2d615 Author: Linus Torvalds Date: Thu Dec 2 17:40:04 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid: HID: length resolution should be reported units/mm HID: add support for F430 Force Feedback Wheel HID: egalax: Use kzalloc HID: Remove KERN_DEBUG from dbg_hid use Manually fixed trivial conflict in drivers/hid/hid-input.c (due to removal of KERN_DEBUG from dbg_hid use clashing with new keycode interface switch) commit 9f5ead76d402f591ab810e71eae59ec28bf39eb9 Author: Kevin Hilman Date: Wed Dec 1 10:55:46 2010 +0000 omap: PM debug: fix wake-on-timer debugfs dependency Wakeup-on-timer code does not have/need debugfs dependency. Move the function out of debugfs ifdef. Fixes compile error when CONFIG_DEBUG_FS is disabled but PM debug is enabled. Reported-by: Tony Lindgren Signed-off-by: Kevin Hilman Signed-off-by: Tony Lindgren commit 5403187f83c12c6f4c03547e0cc05bac0310be7b Author: Aaro Koskinen Date: Thu Dec 2 15:51:24 2010 +0000 arm: mach-omap2: rx51: clean up dummy onenand init When OneNAND support is disabled, the platform code defines NULL board_onenand_data and empty init function for us. By utilizing this we can avoid cluttering board files with dummy definitions/wrappers. Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit a1a92e6fccadbba1846a081f21d0c12a10addd56 Author: Aaro Koskinen Date: Thu Dec 2 15:51:23 2010 +0000 arm: mach-omap2: n8x0: clean up dummy onenand init When OneNAND support is disabled, the platform code defines NULL board_onenand_data and empty init function for us. By utilizing this we can avoid cluttering board files with dummy definitions/wrappers. Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit 7203f8a48bb63015ebe58a6f2a38aec1cb208b9d Author: Aaro Koskinen Date: Thu Dec 2 13:25:40 2010 +0000 arm: mach-omap2: remove NULL board_mux from board files If CONFIG_OMAP_MUX is not enabled, we can define board_mux in the header file instead of forcing every single board to define it. Signed-off-by: Aaro Koskinen [tony@atomide.com: updated for combined board-zoom files] Signed-off-by: Tony Lindgren commit 08ec0c58fb8a05d3191d5cb6f5d6f81adb419798 Author: John Stultz Date: Tue Jul 27 17:00:00 2010 -0700 x86: Improve TSC calibration using a delayed workqueue Boot to boot the TSC calibration may vary by quite a large amount. While normal variance of 50-100ppm can easily be seen, the quick calibration code only requires 500ppm accuracy, which is the limit of what NTP can correct for. This can cause problems for systems being used as NTP servers, as every time they reboot it can take hours for them to calculate the new drift error caused by the calibration. The classic trade-off here is calibration accuracy vs slow boot times, as during the calibration nothing else can run. This patch uses a delayed workqueue to calibrate the TSC over the period of a second. This allows very accurate calibration (in my tests only varying by 1khz or 0.4ppm boot to boot). Additionally this refined calibration step does not block the boot process, and only delays the TSC clocksoure registration by a few seconds in early boot. If the refined calibration strays 1% from the early boot calibration value, the system will fall back to already calculated early boot calibration. Credit to Andi Kleen who suggested using a timer quite awhile back, but I dismissed it thinking the timer calibration would be done after the clocksource was registered (which would break things). Forgive me for my short-sightedness. This patch has worked very well in my testing, but TSC hardware is quite varied so it would probably be good to get some extended testing, possibly pushing inclusion out to 2.6.39. Signed-off-by: John Stultz LKML-Reference: <1289003985-29060-1-git-send-email-johnstul@us.ibm.com> Reviewed-by: Thomas Gleixner CC: Thomas Gleixner CC: Ingo Molnar CC: Martin Schwidefsky CC: Clark Williams CC: Andi Kleen commit b0f969009f647cd473c5e559aeec9c4229d12f87 Merge: 3561d43fd289f590fdae672e5eb831b8d5cf0bf6 d3b8f889a220aed825accc28eb64ce283a0d51ac Author: John Stultz Date: Thu Dec 2 16:47:52 2010 -0800 Merge remote branch 'tip/x86/tsc' into fortglx/2.6.38/tip/x86/tsc Conflicts: Documentation/kernel-parameters.txt commit 87de5ac782761a3ebf806e434e8c9cc205a87274 Author: John Stultz Date: Mon Sep 20 17:42:46 2010 -0700 timers: Introduce timerlist infrastructure. The timerlist infrastructure is a thin layer over the rbtree code that implements a simple list of timers sorted by an expires value, and a getnext function that provides a pointer to the earliest timer. This infrastructure allows drivers and other kernel infrastructure to easily implement timers without duplicating code. Signed-off-by: John Stultz LKML Reference: <1290136329-18291-2-git-send-email-john.stultz@linaro.org> Reviewed-by: Thomas Gleixner CC: Alessandro Zummo CC: Thomas Gleixner CC: Richard Cochran commit 29dcbc5c25d6d8140337e96bf503c8475092c586 Author: Jeremy Fitzhardinge Date: Thu Dec 2 16:14:27 2010 -0800 xen: allocate irq descs on any NUMA node Allocate irq descs on any NUMA node (we don't care) rather than specifically node 0, which may not exist. (At the moment NUMA is meaningless within a domain, so any info the kernel has is just from an SRAT table we haven't suppressed/disabled.) Signed-off-by: Jeremy Fitzhardinge commit 2a4c92fa24e1853d0e21f9e6e45859b832240f94 Author: Jeremy Fitzhardinge Date: Thu Dec 2 15:30:06 2010 -0800 xen: prevent crashes with non-HIGHMEM 32-bit kernels with largeish memory If this is a non-HIGHMEM 32-bit kernel, then the page structures only go up to the limit of addressable memory, even if more memory is physically present. Don't try to add that extra memory to the balloon. Signed-off-by: Jeremy Fitzhardinge commit 33dd94ae1ccbfb7bf0fb6c692bc3d1c4269e6177 Author: Nelson Elhage Date: Thu Dec 2 14:31:21 2010 -0800 do_exit(): make sure that we run with get_fs() == USER_DS If a user manages to trigger an oops with fs set to KERNEL_DS, fs is not otherwise reset before do_exit(). do_exit may later (via mm_release in fork.c) do a put_user to a user-controlled address, potentially allowing a user to leverage an oops into a controlled write into kernel memory. This is only triggerable in the presence of another bug, but this potentially turns a lot of DoS bugs into privilege escalations, so it's worth fixing. I have proof-of-concept code which uses this bug along with CVE-2010-3849 to write a zero to an arbitrary kernel address, so I've tested that this is not theoretical. A more logical place to put this fix might be when we know an oops has occurred, before we call do_exit(), but that would involve changing every architecture, in multiple places. Let's just stick it in do_exit instead. [akpm@linux-foundation.org: update code comment] Signed-off-by: Nelson Elhage Cc: KOSAKI Motohiro Cc: Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit a0b0f58cdd32ab363a600a294ddaa90f0c32de8c Author: KOSAKI Motohiro Date: Thu Dec 2 14:31:20 2010 -0800 ksm: annotate ksm_thread_mutex is no deadlock source commit 62b61f611e ("ksm: memory hotremove migration only") caused the following new lockdep warning. ======================================================= [ INFO: possible circular locking dependency detected ] ------------------------------------------------------- bash/1621 is trying to acquire lock: ((memory_chain).rwsem){.+.+.+}, at: [] __blocking_notifier_call_chain+0x69/0xc0 but task is already holding lock: (ksm_thread_mutex){+.+.+.}, at: [] ksm_memory_callback+0x3a/0xc0 which lock already depends on the new lock. the existing dependency chain (in reverse order) is: -> #1 (ksm_thread_mutex){+.+.+.}: [] lock_acquire+0xaa/0x140 [] __mutex_lock_common+0x44/0x3f0 [] mutex_lock_nested+0x48/0x60 [] ksm_memory_callback+0x3a/0xc0 [] notifier_call_chain+0x8c/0xe0 [] __blocking_notifier_call_chain+0x7e/0xc0 [] blocking_notifier_call_chain+0x16/0x20 [] memory_notify+0x1b/0x20 [] remove_memory+0x1cc/0x5f0 [] memory_block_change_state+0xfd/0x1a0 [] store_mem_state+0xe2/0xf0 [] sysdev_store+0x20/0x30 [] sysfs_write_file+0xe6/0x170 [] vfs_write+0xc8/0x190 [] sys_write+0x54/0x90 [] system_call_fastpath+0x16/0x1b -> #0 ((memory_chain).rwsem){.+.+.+}: [] __lock_acquire+0x155a/0x1600 [] lock_acquire+0xaa/0x140 [] down_read+0x51/0xa0 [] __blocking_notifier_call_chain+0x69/0xc0 [] blocking_notifier_call_chain+0x16/0x20 [] memory_notify+0x1b/0x20 [] remove_memory+0x56e/0x5f0 [] memory_block_change_state+0xfd/0x1a0 [] store_mem_state+0xe2/0xf0 [] sysdev_store+0x20/0x30 [] sysfs_write_file+0xe6/0x170 [] vfs_write+0xc8/0x190 [] sys_write+0x54/0x90 [] system_call_fastpath+0x16/0x1b But it's a false positive. Both memory_chain.rwsem and ksm_thread_mutex have an outer lock (mem_hotplug_mutex). So they cannot deadlock. Thus, This patch annotate ksm_thread_mutex is not deadlock source. [akpm@linux-foundation.org: update comment, from Hugh] Signed-off-by: KOSAKI Motohiro Acked-by: Hugh Dickins Cc: Andrea Arcangeli Cc: Andi Kleen Cc: KAMEZAWA Hiroyuki Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 20d6c96b5f1cad5c5da4641945ec17a1d9a1afc8 Author: KOSAKI Motohiro Date: Thu Dec 2 14:31:19 2010 -0800 mem-hotplug: introduce {un}lock_memory_hotplug() Presently hwpoison is using lock_system_sleep() to prevent a race with memory hotplug. However lock_system_sleep() is a no-op if CONFIG_HIBERNATION=n. Therefore we need a new lock. Signed-off-by: KOSAKI Motohiro Cc: Andi Kleen Cc: Kamezawa Hiroyuki Suggested-by: Hugh Dickins Acked-by: Hugh Dickins Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 4fe65cab844e6d3d7d310e66a501d5e7242ecb54 Author: Andrew Morton Date: Thu Dec 2 14:31:19 2010 -0800 Documentation/filesystems/vfs.txt: fix ->repeasepage() description ->releasepage() does not remove the page from the mapping. Acked-by: Neil Brown Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 64141da587241301ce8638cc945f8b67853156ec Author: Jeremy Fitzhardinge Date: Thu Dec 2 14:31:18 2010 -0800 vmalloc: eagerly clear ptes on vunmap On stock 2.6.37-rc4, running: # mount lilith:/export /mnt/lilith # find /mnt/lilith/ -type f -print0 | xargs -0 file crashes the machine fairly quickly under Xen. Often it results in oops messages, but the couple of times I tried just now, it just hung quietly and made Xen print some rude messages: (XEN) mm.c:2389:d80 Bad type (saw 7400000000000001 != exp 3000000000000000) for mfn 1d7058 (pfn 18fa7) (XEN) mm.c:964:d80 Attempt to create linear p.t. with write perms (XEN) mm.c:2389:d80 Bad type (saw 7400000000000010 != exp 1000000000000000) for mfn 1d2e04 (pfn 1d1fb) (XEN) mm.c:2965:d80 Error while pinning mfn 1d2e04 Which means the domain tried to map a pagetable page RW, which would allow it to map arbitrary memory, so Xen stopped it. This is because vm_unmap_ram() left some pages mapped in the vmalloc area after NFS had finished with them, and those pages got recycled as pagetable pages while still having these RW aliases. Removing those mappings immediately removes the Xen-visible aliases, and so it has no problem with those pages being reused as pagetable pages. Deferring the TLB flush doesn't upset Xen because it can flush the TLB itself as needed to maintain its invariants. When unmapping a region in the vmalloc space, clear the ptes immediately. There's no point in deferring this because there's no amortization benefit. The TLBs are left dirty, and they are flushed lazily to amortize the cost of the IPIs. This specific motivation for this patch is an oops-causing regression since 2.6.36 when using NFS under Xen, triggered by the NFS client's use of vm_map_ram() introduced in 56e4ebf877b60 ("NFS: readdir with vmapped pages") . XFS also uses vm_map_ram() and could cause similar problems. Signed-off-by: Jeremy Fitzhardinge Cc: Nick Piggin Cc: Bryan Schumaker Cc: Trond Myklebust Cc: Alex Elder Cc: Dave Chinner Cc: Christoph Hellwig Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 853ff88324a248a9f5da6e110850223db353ec07 Author: Andres Salomon Date: Thu Dec 2 14:31:17 2010 -0800 cs5535-gpio: apply CS5536 errata workaround for GPIOs The AMD Geode CS5536 Companion Device Silicon Revision B1 Specification Update mentions the follow as issue #36: "Atomic write transactions to the atomic GPIO High Bank Feature Bit registers should only affect the bits selected [...]" "after Suspend, an atomic write transaction [...] will clear all non-selected bits of the accessed register." In other words, writing to the high bank for a single GPIO bit will clear every other GPIO bit (but only sometimes after a suspend). The workaround described is obvious and simple; do a read-modify-write. This patch does that, and documents why we're doing it. Signed-off-by: Andres Salomon Cc: Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 238af8751f64a75f8b638193353b1c31ea32e738 Author: Frederic Weisbecker Date: Thu Dec 2 14:31:16 2010 -0800 reiserfs: don't acquire lock recursively in reiserfs_acl_chmod reiserfs_acl_chmod() can be called by reiserfs_set_attr() and then take the reiserfs lock a second time. Thereafter it may call journal_begin() that definitely requires the lock not to be nested in order to release it before taking the journal mutex because the reiserfs lock depends on the journal mutex already. So, aviod nesting the lock in reiserfs_acl_chmod(). Reported-by: Pawel Zawora Signed-off-by: Frederic Weisbecker Tested-by: Pawel Zawora Cc: Jeff Mahoney Cc: [2.6.32.x+] Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 0bae35e14b68f5e7075bc96e5ea608b42bdf8f59 Author: Johannes Berg Date: Thu Dec 2 14:31:14 2010 -0800 leds: fix up dependencies It's not useful to build LED triggers when there's no LEDs that can be triggered by them. Therefore, fix up the dependencies so that this cannot happen, and fix a few users that select triggers to depend on LEDS_CLASS as well (there is also one user that also selects LEDS_CLASS, which is OK). Signed-off-by: Johannes Berg Reported-by: Randy Dunlap Acked-by: Randy Dunlap Tested-by: Ingo Molnar Cc: Arnd Hannemann Cc: Michal Hocko Cc: Richard Purdie Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit e172662d113ceb22db727a979bb35b9c02f703b5 Author: Wu Fengguang Date: Thu Dec 2 14:31:13 2010 -0800 vmstat: fix dirty threshold ordering The nr_dirty_[background_]threshold fields are misplaced before the numa_* fields, and users will read strange values. This is the right order. Before patch, nr_dirty_background_threshold will read as 0 (the value from numa_miss). numa_hit 128501 numa_miss 0 numa_foreign 0 numa_interleave 7388 numa_local 128501 numa_other 0 nr_dirty_threshold 144291 nr_dirty_background_threshold 72145 Signed-off-by: Wu Fengguang Cc: Michael Rubin Reviewed-by: KOSAKI Motohiro Reviewed-by: Minchan Kim Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 55cfaa3cbdd29c4919ecb5fb8965c310f357e48c Author: Zeng Zhaoming Date: Thu Dec 2 14:31:13 2010 -0800 mm/mempolicy.c: add rcu read lock to protect pid structure find_task_by_vpid() should be protected by rcu_read_lock(), to prevent free_pid() reclaiming pid. Signed-off-by: Zeng Zhaoming Cc: "Paul E. McKenney" Cc: KOSAKI Motohiro Cc: Christoph Lameter Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 1f64d69c7ad2e48e697493e45590679f7a69b7b2 Author: Dean Nelson Date: Thu Dec 2 14:31:12 2010 -0800 mm/hugetlb.c: avoid double unlock_page() in hugetlb_fault() Have hugetlb_fault() call unlock_page(page) only if it had previously called lock_page(page). Setting CONFIG_DEBUG_VM=y and then running the libhugetlbfs test suite, resulted in the tripping of VM_BUG_ON(!PageLocked(page)) in unlock_page() having been called by hugetlb_fault() when page == pagecache_page. This patch remedied the problem. Signed-off-by: Dean Nelson Cc: Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit 5bddd17fec58f253cddd0bc9eab2cd9eb1bbab4a Author: Eric Anholt Date: Thu Nov 18 09:32:59 2010 +0800 drm/i915: Apply a workaround for transitioning from DP on pipe B to HDMI. This workaround only applies to Ironlake. Signed-off-by: Eric Anholt Signed-off-by: Chris Wilson Cc: stable@kernel.org commit 220cad3cbf553f893432919b458da36489373fc6 Author: Eric Anholt Date: Thu Nov 18 09:32:58 2010 +0800 drm/i915: Always set the DP transcoder config to 8BPC. The pipe is always set to 8BPC, but here we were leaving whatever previous bits were set by the BIOS in place. Signed-off-by: Eric Anholt Tested-by: Keith Packard Signed-off-by: Chris Wilson Cc: stable@kernel.org commit b924dcf0038b8f83e65b44f679ad480d44f85aa6 Author: Allan Stephens Date: Tue Nov 30 12:01:03 2010 +0000 tipc: Delete tipc_ownidentity() Moves the content of the native API routine tipc_ownidentity() into the sole routine that calls it, since it can no longer be called in isolation. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 12bae479ee414f45ad8fe93530f5b6ea241bde3f Author: Allan Stephens Date: Tue Nov 30 12:01:02 2010 +0000 tipc: Eliminate obsolete native API forwarding routines Moves the content of each native API message forwarding routine into the sole routine that calls it, since the forwarding routines no longer be called in isolation. Also removes code in each routine that altered the outgoing message's importance level since this is now no longer possible. The previous function mapping (parent function, and child API) was as follows: tipc_send2name \--tipc_forward2name tipc_send2port \--tipc_forward2port tipc_send_buf2port \--tipc_forward_buf2port After this commit, the children don't exist and their functionality is completely in the respective parent. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 471450f7ec24ccd9ac24e6f05cd9358d40c09d03 Author: Allan Stephens Date: Tue Nov 30 12:01:01 2010 +0000 tipc: Eliminate an unused symbolic constant in link code Removes a symbol that is not referenced anywhere by TIPC's link code. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 52fe7b725e0a1360d36c720ee87ab1e559df69db Author: Allan Stephens Date: Tue Nov 30 12:01:00 2010 +0000 tipc: Eliminate useless initialization when creating subscriber Removes initialization of a local variable that is always assigned a different value before it is referenced. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 38f232eae20cefed2e2379d77c54babb0de6d024 Author: Allan Stephens Date: Tue Nov 30 12:00:59 2010 +0000 tipc: Remove unused domain argument from multicast send routine Eliminates an unused argument from tipc_multicast(), now that this routine can no longer be called by kernel-based applications. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit a5c2af9922a94a875c5f4b2dcd357a1c399b7ea6 Author: Allan Stephens Date: Tue Nov 30 12:00:58 2010 +0000 tipc: Remove support for TIPC mode change callback Eliminates support for the callback routine invoked when TIPC changes its mode of operation from inactive to standalone or from standalone to networked. This callback was part of TIPC's obsolete native API and is not used by TIPC internally. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 528c771e87c3fa661bc6983b5bf0ba464d9f7c3a Author: Allan Stephens Date: Tue Nov 30 12:00:57 2010 +0000 tipc: Delete useless function prototypes Removes several function declarations that aren't used anywhere, either because they reference routines that no longer exist or because all users of the function reference it after it has already been defined. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 28cc937eac00805e8b9c6e7ed7d590567378187f Author: Allan Stephens Date: Tue Nov 30 12:00:56 2010 +0000 tipc: Eliminate useless return value when disabling a bearer Modifies bearer_disable() to return void since it always indicates success anyway. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit 8d71919d7afc4ade0d9de09e1d50fbf9168c368d Author: Allan Stephens Date: Tue Nov 30 12:00:55 2010 +0000 tipc: Delete unused configuration service structure definition Removes a structure definition that is no longer used by TIPC's configuration service. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit c80262829769419e19527f972672e8df0480235a Author: Allan Stephens Date: Tue Nov 30 12:00:54 2010 +0000 tipc: Remove obsolete inclusions of header files Gets rid of #include statements that are no longer required as a result of the merging of obsolete native API header file content into other TIPC include files. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit d265fef6ddf9042195aae551e1fde211c2a1588b Author: Allan Stephens Date: Tue Nov 30 12:00:53 2010 +0000 tipc: Remove obsolete native API files and exports As part of the removal of TIPC's native API support it is no longer necessary for TIPC to export symbols for routines that can be called by kernel-based applications, nor for it to have header files that kernel-based applications can include to access the declarations for those routines. This commit eliminates the exporting of symbols by TIPC and migrates the contents of each obsolete native API include file into its corresponding non-native API equivalent. The code which was migrated in this commit was migrated intact, in that there are no technical changes combined with the relocation. Signed-off-by: Allan Stephens Signed-off-by: Paul Gortmaker Signed-off-by: David S. Miller commit dca9b2404a6d6579828da2425c051462701efd3f Author: Shan Wei Date: Wed Dec 1 18:05:17 2010 +0000 net: kill unused macros from head file These macros have been defined for several years since v2.6.12-rc2(tracing by git), but never be used. So remove them. Signed-off-by: Shan Wei Signed-off-by: David S. Miller commit b672083ed36a49c323737b7c7e1d5264a7c193af Author: Shan Wei Date: Wed Dec 1 18:05:12 2010 +0000 ipv6: use ND_REACHABLE_TIME and ND_RETRANS_TIMER instead of magic number ND_REACHABLE_TIME and ND_RETRANS_TIMER have defined since v2.6.12-rc2, but never been used. So use them instead of magic number. This patch also changes original code style to read comfortably . Thank YOSHIFUJI Hideaki for pointing it out. Signed-off-by: Shan Wei Signed-off-by: David S. Miller commit 97b1ce25e8fc27f74703537ec09d4996c7a6e38a Author: Shan Wei Date: Wed Dec 1 18:04:50 2010 +0000 tcp: use TCP_BASE_MSS to set basic mss value TCP_BASE_MSS is defined, but not used. commit 5d424d5a introduce this macro, so use it to initial sysctl_tcp_base_mss. commit 5d424d5a674f782d0659a3b66d951f412901faee Author: John Heffner Date: Mon Mar 20 17:53:41 2006 -0800 [TCP]: MTU probing Signed-off-by: Shan Wei Signed-off-by: David S. Miller commit a9527a3b621e507c85b639c183c3aa22afd4eb61 Author: Shan Wei Date: Wed Dec 1 18:04:43 2010 +0000 net: snmp: fix the wrong ICMP_MIB_MAX value __ICMP_MIB_MAX is equal to the total number of icmp mib, So no need to add 1. This wastes 4/8 bytes memory. Change it to be same as ICMP6_MIB_MAX, TCP_MIB_MAX, UDP_MIB_MAX. Signed-off-by: Shan Wei Signed-off-by: David S. Miller commit e7dfc8dbdf9a7fa1ef04c63100a71f4102b82ed3 Author: Alexander V. Lukyanov Date: Tue Nov 30 03:57:39 2010 +0000 tulip: fix hang in dmfe driver on sending of big packet This patch fixes hang in dmfe driver on attempt of sending a big packet. Without this patch the code stops the queue and never wakes it again. Signed-off-by: Alexander V. Lukyanov Acked-by: Eric Dumazet Signed-off-by: David S. Miller commit fe27d4b012273640e033be80f143bdc54daa8e16 Merge: ad9c2b048b605fbc8d50526e330b88abdd631ab2 676dac4b1bee0469d6932f698aeb77e8489f5861 Author: James Morris Date: Fri Dec 3 08:21:01 2010 +1100 Merge branch 'smack-next-master' into next commit f8e9616108c7003e6499c162459258f11c9dc85e Author: Vlad Lungu Date: Mon Nov 29 22:52:52 2010 +0000 stmmac: priv->lock can be used uninitialized To reproduce: if connman (http://connman.net/) is started, inserting the stmmac module triggers a "BUG: spinlock bad magic on CPU#0". Registering the device in stmmac_probe() sends a notification to connman which brings the interface up before the lock is initialized. Signed-off-by: Vlad Lungu Signed-off-by: David S. Miller commit 415103f9932d45f7927f4b17e3a9a13834cdb9a1 Author: Eric Paris Date: Thu Dec 2 16:13:40 2010 -0500 SELinux: do not compute transition labels on mountpoint labeled filesystems selinux_inode_init_security computes transitions sids even for filesystems that use mount point labeling. It shouldn't do that. It should just use the mount point label always and no matter what. This causes 2 problems. 1) it makes file creation slower than it needs to be since we calculate the transition sid and 2) it allows files to be created with a different label than the mount point! # id -Z staff_u:sysadm_r:sysadm_t:s0-s0:c0.c1023 # sesearch --type --class file --source sysadm_t --target tmp_t Found 1 semantic te rules: type_transition sysadm_t tmp_t : file user_tmp_t; # mount -o loop,context="system_u:object_r:tmp_t:s0" /tmp/fs /mnt/tmp # ls -lZ /mnt/tmp drwx------. root root system_u:object_r:tmp_t:s0 lost+found # touch /mnt/tmp/file1 # ls -lZ /mnt/tmp -rw-r--r--. root root staff_u:object_r:user_tmp_t:s0 file1 drwx------. root root system_u:object_r:tmp_t:s0 lost+found Whoops, we have a mount point labeled filesystem tmp_t with a user_tmp_t labeled file! Signed-off-by: Eric Paris Reviewed-by: Reviewed-by: James Morris commit 2989042ca86b94bf4ffa9486921bb300ad44225f Author: Tomoya Date: Mon Nov 29 18:19:52 2010 +0000 can: EG20T PCH: Delete unnecessary spin_lock Delete unnecessary spin_lock for accessing Message Object. Since all message objects are divided into tx/rx area completely, spin_lock processing is unnecessary. Signed-off-by: Tomoya MORINAGA Acked-by: Marc Kleine-Budde Signed-off-by: David S. Miller commit d68f6837c4972b0433e41f8bee4b2b8205610f31 Author: Tomoya Date: Mon Nov 29 18:16:15 2010 +0000 can: EG20T PCH: Enumerate LEC macros For easy to readable, LEC #define macros are replaced to enums. Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit 15ffc8fddf72712cc45d51c64bd500760ec63c80 Author: Tomoya Date: Mon Nov 29 18:15:02 2010 +0000 can: EG20T PCH: Change Message Object Index For easy to readable, add Message Object index like below. PCH_RX_OBJ_START PCH_RX_OBJ_END PCH_TX_OBJ_START PCH_TX_OBJ_END Signed-off-by: Tomoya MORINAGA Signed-off-by: David S. Miller commit 8339a7ed562719e040ca783bf59fa2d614d10ac9 Author: Tomoya Date: Mon Nov 29 18:11:52 2010 +0000 can: EG20T PCH: Separate Interface Register(IF1/IF2) CAN register of Intel PCH EG20T has 2 sets of interface register. To reduce whole of code size, separate interface register. As a result, the number of function also can be reduced. Signed-off-by: Tomoya MORINAGA Acked-by: Marc Kleine-Budde Signed-off-by: David S. Miller commit 94c35de9a918665d9354efe2bafc29ba4b37497a Merge: 8733cb29d60fd2ca6c1f50f69f9b90fbfcd1879b 251d380034c6c34efe75ffb89d863558ba68ec6a Author: Linus Torvalds Date: Thu Dec 2 12:59:11 2010 -0800 Merge branch 'staging-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6 * 'staging-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6: (27 commits) Staging: rt2870: Add USB ID for Buffalo Airstation WLI-UC-GN staging: easycap needs smp_lock.h, fixes build error Staging: batman-adv: ensure that eth_type_trans gets linear memory Staging: batman-adv: Don't remove interface with spinlock held staging: brcm80211: updated maintainers contact information staging: fix winbond build, needs delay.h Staging: line6: fix up my fixup for some sysfs attribute permissions Staging: zram: fix up my fixup for some sysfs attribute permissions Staging: udlfb: fix up my fixup for some sysfs attribute permissions Staging: samsung-laptop: fix up my fixup for some sysfs attribute permissions Staging: iio: adis16220: fix up my fixup for some sysfs attribute permissions Staging: frontier: fix up my fixup for some sysfs attribute permissions Staging: asus_oled: fix up my fixup for some sysfs attribute permissions staging: spectra: fix build error Staging: intel_sst: fix memory leak Staging: rtl8712: signedness bug in init staging: rtl8187se: Change panic to warn when RF switch turned off staging: comedi: fix memory leak Staging: quickstart: free after input_unregister_device() Staging: speakup: free after input_unregister_device() ... commit 8733cb29d60fd2ca6c1f50f69f9b90fbfcd1879b Merge: eed5ee1a3ab3020168cd67fdde2500452b0628c9 318af55ddd38bdaaa2b57f5c3bd394f3ce3a2610 Author: Linus Torvalds Date: Thu Dec 2 12:58:36 2010 -0800 Merge branch 'driver-core-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6 * 'driver-core-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6: uio: Change mail address of Hans J. Koch driver core: prune docs about device_interface driver core: the development tree has switched to git commit eed5ee1a3ab3020168cd67fdde2500452b0628c9 Merge: 435a5aebf609624bdf7c5a9a7705c260d0076195 a5880a9e5bb40fbae55de60051d69a29091053c3 Author: Linus Torvalds Date: Thu Dec 2 12:58:16 2010 -0800 Merge branch 'tty-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6 * 'tty-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6: serial: mfd: adjust the baud rate setting TTY: open/hangup race fixup TTY: don't allow reopen when ldisc is changing NET: wan/x25, fix ldisc->open retval TTY: ldisc, fix open flag handling serial8250: Mark console as CON_ANYTIME commit 435a5aebf609624bdf7c5a9a7705c260d0076195 Merge: 2e5c26de1d9a8e824b6c098ee393edac1b6050f9 b7a5100bc29c2cc252bf6f1e247ae14fd733fbb8 Author: Linus Torvalds Date: Thu Dec 2 12:57:35 2010 -0800 Merge branch 'usb-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6 * 'usb-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6: USB: fix autosuspend bug in usb-serial USB: ehci: disable LPM and PPCD for nVidia MCP89 chips USB: serial: ftdi_sio: Vardaan USB RS422/485 converter PID added USB: yurex: add .llseek fop to file_operations USB: ftdi_sio: Add ID for RT Systems USB-29B radio cable usb: musb: do not use dma for control transfers usb: musb: gadget: fix compilation warning usb: musb: clear RXCSR_AUTOCLEAR before PIO read usb: musb: unmap dma buffer when switching to PIO xhci: Don't let the USB core disable SuperSpeed ports. xhci: Setup array of USB 2.0 and USB 3.0 ports. xhci: Fix reset-device and configure-endpoint commands commit 09f921f83faa49cdea25abfb98c439c01526b89d Merge: 4cebb34caa5122216a1e2451eae9e0fc47ec2589 d89197c7f34934fbb0f96d938a0d6cfe0b8bcb1c Author: John W. Linville Date: Thu Dec 2 15:46:37 2010 -0500 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 Conflicts: drivers/net/wireless/ath/ath9k/ar9003_eeprom.c commit d5c21fc6155549e7f92fdeb039227f2b8e597e98 Author: Matthias Brugger Date: Thu Dec 2 14:13:04 2010 +0100 staging: adis16255 delete driver This patch deletes the adis16255 driver from staging as a similar implementation exists inside the iio subsystem. Signed-off-by: Matthias Brugger Acked-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit d1f521c16a4d7e46bbb9c6968076f80be995e0ed Author: Peter Huewe Date: Thu Dec 2 00:43:34 2010 +0100 staging/sep: Fix printk format warning This patch fixes gcc's complaints about the wrong format string for size_t arguments: "format '%x' expects type 'unsigned int', but argument has type 'size_t'" Signed-off-by: Peter Huewe Signed-off-by: Greg Kroah-Hartman commit dda16b23e32cf2351aa03590f43cc8a2873dc6a9 Author: Peter Huewe Date: Thu Dec 2 00:43:33 2010 +0100 staging/sep: Fix sparse warning 'Using plain integer as NULL pointer' This patch fixes the warning generated by sparse: "Using plain integer as NULL pointer" by replacing the offending 0s with NULL. Signed-off-by: Peter Huewe Signed-off-by: Greg Kroah-Hartman commit eb6b420da13fee2edc30b7bde67c0c8993c4c30d Author: Peter Huewe Date: Thu Dec 2 00:43:32 2010 +0100 staging/sep: Fix sparse warning 'do-while statement is not a compound statement' This patch fixes the warning generated by sparse: 'do-while statement is not a compound statement' by adding the necessary brackets around the do block Signed-off-by: Peter Huewe Signed-off-by: Greg Kroah-Hartman commit ff29ee8f9301c38f28d4d22fe49373d3b996956e Author: Arend van Spriel Date: Thu Dec 2 15:44:52 2010 +0100 staging: brcm80211: remove redundant CHIPREV macro The CHIPREV macro simply expands to the macro argument so it is redundant and as such removed. Reviewed-by: Roland Vossen Signed-off-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit dfa26436109d06f233a0ad735731cfb2d0c6ab5a Author: Arend van Spriel Date: Thu Dec 2 15:44:51 2010 +0100 staging: brcm80211: remove redundant CHIPID macro The CHIPID macro simply expands to the macro argument so it is redundant and as such removed. Reviewed-by: Roland Vossen Signed-off-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit 92246bcbd7730eaaec0c29a2adc1cb4b4451ed9e Author: Arend van Spriel Date: Thu Dec 2 15:44:50 2010 +0100 staging: brcm80211: remove redundant CHIPTYPE macro The CHIPTYPE macro simply expands to the macro argument so it is redundant and as such removed. Reviewed-by: Roland Vossen Signed-off-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit c523ea78ec9a33586fa7a73859de7c462097cdfc Author: Brett Rudley Date: Wed Dec 1 15:36:39 2010 -0800 staging: brcm80211: absorb linux_osl.h into osl.h Move code from linux_osl.h into osl.h and delete linux_osl.h, which created a bunch of checkpatch errors... I fixed most but volatile warnings will have to be dealt with later. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit df880a42dc4086ba7ff16f6ccb255e78fc0dc374 Author: Brett Rudley Date: Wed Dec 1 15:36:38 2010 -0800 staging: brcm80211: Remove unused code from osl.h Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 4cebb34caa5122216a1e2451eae9e0fc47ec2589 Author: Felix Fietkau Date: Thu Dec 2 10:27:21 2010 +0100 ath5k: Fix reset and interrupts for AHB type of devices. On WiSoc we cannot access mac register before it is resetted. It will crash hardware otherwise. Signed-off-by: Felix Fietkau Signed-off-by: Wojciech Dubowik Signed-off-by: John W. Linville commit a0b907ee2a71052fefdf6151764095f3f97b3275 Author: Felix Fietkau Date: Thu Dec 2 10:27:16 2010 +0100 ath5k: Add AHB bus support. AHB specific functions are now in ahb.c file. AHB bus is compiled in when CONFIG_ATHEROS_AR231X is set in kernel. All other platforms will use PCI bus. Signed-off-by: Felix Fietkau Signed-off-by: Wojciech Dubowik Signed-off-by: John W. Linville commit c31b5c9c806b1fbdc9e98885d897664a0d482989 Author: Felix Fietkau Date: Thu Dec 2 10:27:11 2010 +0100 ath5k: Add initial registers values for radio RF2317 chip. Signed-off-by: Felix Fietkau Signed-off-by: Wojciech Dubowik Signed-off-by: John W. Linville commit e7aecd327d80b2f156b54769013aaccb2a20645a Author: Felix Fietkau Date: Thu Dec 2 10:27:06 2010 +0100 ath5k: Add a function to read chipset's MAC revision Add bus dependent revision read function which is used to determine chipset's MAC before hardware is initialized. Signed-off-by: Felix Fietkau Signed-off-by: Wojciech Dubowik Signed-off-by: John W. Linville commit 8efa5d7d6ad307ae2d220def37ca89594062c40d Author: Felix Fietkau Date: Thu Dec 2 10:27:06 2010 +0100 ath5k: Check if pci pdev struct is initialized in common functions. To be able to support other busses than PCI check if pci device structure is initialized. Signed-off-by: Felix Fietkau Signed-off-by: Wojciech Dubowik Signed-off-by: John W. Linville commit 4aa5d783c9e1c72e4950ff34f388077ccecac74a Author: Felix Fietkau Date: Thu Dec 2 10:27:01 2010 +0100 ath5k: Use generic eeprom read from common ath_bus_opts struct. Signed-off-by: Felix Fietkau Signed-off-by: Wojciech Dubowik Signed-off-by: John W. Linville commit e5b046d86fac609f636d127a38de94a175c7e83b Author: Felix Fietkau Date: Thu Dec 2 10:27:01 2010 +0100 ath5k: Move PCI bus functions to separate file. Signed-off-by: Felix Fietkau Signed-off-by: Wojciech Dubowik Signed-off-by: John W. Linville commit 132b1c3ee38ea6fa0501004fd0f19acb554e5a44 Author: Felix Fietkau Date: Thu Dec 2 10:26:56 2010 +0100 ath5k: Introduce ath5k_init_softc function as in ath9k Split pci initialization into hardware specific functions and softc structure initialization. Make function naming similar to ones ath9k. Introduce ath_bus_opts in ath5k for later AHB bus integration. Signed-off-by: Felix Fietkau Signed-off-by: Wojciech Dubowik Signed-off-by: John W. Linville commit aeae4ac9090462ea38387dcdbac4f01b944af6a4 Author: Felix Fietkau Date: Thu Dec 2 10:26:51 2010 +0100 ath5k: Use Generic DMA for later support of AHB bus. Signed-off-by: Felix Fietkau Signed-off-by: Wojciech Dubowik Signed-off-by: John W. Linville commit c30ae138aa0570665725166679bdf4207041c8df Merge: 78b8595691c34478a51d1c2bcbbb0f6ec8a28247 be21871f24b0fcd8d0d09c8090385c9cec80efa3 Author: John W. Linville Date: Thu Dec 2 15:17:46 2010 -0500 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-next-2.6 commit 78b8595691c34478a51d1c2bcbbb0f6ec8a28247 Author: Andy Shevchenko Date: Thu Dec 2 14:45:07 2010 +0200 wireless: ray_cs: use '%pm' format option to print MAC Signed-off-by: Andy Shevchenko Cc: "John W. Linville" Cc: linux-wireless@vger.kernel.org Signed-off-by: John W. Linville commit 547025d5d4d1056fb4b5a0c9c3c0d5c2fe22c082 Author: Bruno Randolf Date: Thu Dec 2 16:23:12 2010 +0900 cfg80211: Add documentation for antenna ops The last patch with the same title was for mac80211 ops, accidentally. Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit c1927d7a8fab07171d08f7a3a8b7e5fe87bb70d4 Author: Johannes Berg Date: Wed Dec 1 09:43:35 2010 +0100 mac80211: publish SMPS docs Create a new chapter about SMPS in the driver API part of the mac80211 book and populate it with the existing docs. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit f6b8bef3634a5c9ea326b3ab0c9615fdac5f18ab Author: Johannes Berg Date: Wed Dec 1 09:43:34 2010 +0100 mac80211: document station handling Add some existing documentation about station handling to a new chapter about advanced APIs. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit eebbb348df5a8c239a6300188907dec7e427bf70 Author: Johannes Berg Date: Wed Dec 1 09:43:33 2010 +0100 mac80211: publish interface iteration docs Publish the documentation for the interface iteration functions in the right section of the book. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit e16c01030b8794992590ff9b1b1e4b1b89e0cad3 Author: Johannes Berg Date: Wed Dec 1 09:43:32 2010 +0100 mac80211: document aggregation Include the aggregation documentation in the docbook, split up by public and internal docs. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit cf6cb7ab59e0b37afe6e76b2e444479bf86bf933 Author: Johannes Berg Date: Wed Dec 1 09:43:31 2010 +0100 mac80211: publish some rate control docs Add an API chapter to the rate control part of the mac80211 book and populate it with some existing documentation. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 625208138550562fd3bc731f53f43cb66a3be70a Author: Johannes Berg Date: Wed Dec 1 09:43:30 2010 +0100 mac80211: publish some misc docs There isn't a clear TX documentation yet, so put these into the misc section for now. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 7bcfda13fea4a8770deaf4b22093dc2708760128 Author: Johannes Berg Date: Wed Dec 1 09:43:29 2010 +0100 mac80211: publish docs for _ni functions Put them along with their "regular" versions for now, we should write more docs in the future. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit d7ae30f073a179a9cebd663e7502843ddf4ba672 Author: Johannes Berg Date: Wed Dec 1 09:43:28 2010 +0100 mac80211: document workqueue Create a new chapter for the mac80211 workqueue that contains the documentation written for it. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 2e54a7a20cf7c02ee17c56488fedb8cd3d2c2f35 Author: Johannes Berg Date: Wed Dec 1 09:43:27 2010 +0100 cfg80211: include CQM packet loss docs Just include them in the list of functions, there aren't any more detailed docs (yet). Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 6a0141175b6026e13652339e607a35f4b6687f27 Author: Sujith Manoharan Date: Wed Dec 1 12:30:09 2010 +0530 ath9k_htc: Remove unused structures Signed-off-by: Sujith Manoharan Signed-off-by: John W. Linville commit b2767363192d5937e0f61f05b1b6b881da9ee55a Author: Joe Perches Date: Tue Nov 30 13:42:08 2010 -0800 wireless: Remove unnecessary casts of usb_get_intfdata Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit e7797bf2c0297098056a95b6b03ea5a9a3285e36 Author: RafaÅ‚ MiÅ‚ecki Date: Tue Nov 30 22:33:16 2010 +0100 b43: N-PHY: fix code path on PHY init Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 76b002bd6dfdd66c58669cbdfa5cd92084b6936e Author: RafaÅ‚ MiÅ‚ecki Date: Tue Nov 30 22:33:15 2010 +0100 b43: N-PHY: use defines for RSSI types Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 99f6c2ef1e968c0dbdfa8c5b8f2869129b860d88 Author: RafaÅ‚ MiÅ‚ecki Date: Tue Nov 30 22:33:14 2010 +0100 b43: N-PHY: fix RSSI selection Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 44b23b488d44e56d467764ecb661830e5b02b308 Author: Joe Perches Date: Tue Nov 30 12:19:11 2010 -0800 ath9k: hif_usb: Reduce indent 1 column Invert test and return early. Move variable declarations to local scope. Don't initialize variables to 0 unnecessarily. Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit eb272441fc14ad126abfa46de8a9c58bda8added Author: Ben Greear Date: Mon Nov 29 14:13:22 2010 -0800 ath9k: Move debugfs under ieee80211/[phyname]/ath9k/ This fixes debugfs problems when a phy is renamed, and is able to remove a bit of code that is no longer needed. Signed-off-by: Ben Greear Signed-off-by: John W. Linville commit db3949c4506a21633469d71f2915cf660eea0a35 Author: David S. Miller Date: Thu Dec 2 11:52:07 2010 -0800 tcp: Implement ipv6 ->get_peer() and ->tw_get_peer(). Now ipv6 timewait recycling is fully implemented and enabled. Signed-off-by: David S. Miller commit 493f377d6dd56f4e98b198d637fe714ab124681b Author: David S. Miller Date: Thu Dec 2 12:14:29 2010 -0800 tcp: Add timewait recycling bits to ipv6 connect code. This will also improve handling of ipv6 tcp socket request backlog when syncookies are not enabled. When backlog becomes very deep, last quarter of backlog is limited to validated destinations. Previously only ipv4 implemented this logic, but now ipv6 does too. Now we are only one step away from enabling timewait recycling for ipv6, and that step is simply filling in the implementation of tcp_v6_get_peer() and tcp_v6_tw_get_peer(). Signed-off-by: David S. Miller commit bafbb8df076de1e3b63914473a403fba96b88f3c Author: Greg Kroah-Hartman Date: Thu Dec 2 12:12:46 2010 -0800 Staging: hv: remove vmbus_on_event_dpc() Just call VmbusOnEvents() as that's all the function did, so we can remove it. Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 2e5c26de1d9a8e824b6c098ee393edac1b6050f9 Merge: 75318ec3277d1fc46ecc129d7ef880b269fd9ee0 4fc3680894ff5739e7474b6633e962bfbdf0d3d8 Author: Linus Torvalds Date: Thu Dec 2 12:11:31 2010 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog * git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog: watchdog: it8712f_wdt: add note to Kconfig watchdog: gef_wdt: include fs.h watchdog: bcm63xx_wdt: improve platform part. watchdog: iTCO_wdt: TCO Watchdog patch for Intel Patsburg PCH commit cef6dbfa8ef6b8c474e020a24758aa848a2632fa Author: Greg Kroah-Hartman Date: Thu Dec 2 12:11:25 2010 -0800 Staging: hv: make some vmbus_drv functions static Now that vmbus_drv.c is merged with vmbus.c, some of the newly global functions can now be marked static. Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 75318ec3277d1fc46ecc129d7ef880b269fd9ee0 Merge: 8cb280c90f9cfaab3ba3afbace0b1711dee80d0c 7adce751ce79bcb6d0a591e6b94d76631c9a232c Author: Linus Torvalds Date: Thu Dec 2 12:10:56 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: IB: Fix information leak in marshalling code IB/pack: Remove some unused code added by the IBoE patches IB/mlx4: Fix IBoE link state IB/mlx4: Fix IBoE reported link rate mlx4_core: Workaround firmware bug in query dev cap IB/mlx4: Fix memory ordering of VLAN insertion control bits MAINTAINERS: Update NetEffect entry commit 6d26e38fa2085ab3ba37a52e34caf46f8e049544 Author: Greg Kroah-Hartman Date: Thu Dec 2 12:08:08 2010 -0800 Staging: hv: merge VmbusInitialize into vmbus_bus_init No need to have two functions for this. Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 0bdb250c69251499f53a4ac6f9dae117da490696 Author: Greg Kroah-Hartman Date: Thu Dec 2 12:04:59 2010 -0800 Staging: hv: remove gDriver variable It's only set and never used anymore, so remove it. Gotta love static variables with a "global" hungarian notatation on the name... Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 6c884555f23d0c73f7e71ce977ee4dd882532c0f Author: Greg Kroah-Hartman Date: Thu Dec 2 12:04:00 2010 -0800 Staging: hv: call VmbusInitialize directly from vmbus_bus_init() No need to pass a function pointer to a function in the same file. Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 36199a992aba4f3ea1bc0430f04655e99010a65d Author: Greg Kroah-Hartman Date: Thu Dec 2 11:59:22 2010 -0800 Staging: hv: remove vmbus.c Merge the functions into vmbus_drv.c as there's no need to have them separate anymore. It will also make unwinding some of the function and pointer mess easier, as well as making functions static in the future. Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 8cbe6e66889d2e4dbea37b2fc6f276bd69d1ef67 Author: RafaÅ‚ MiÅ‚ecki Date: Sun Nov 28 12:59:45 2010 +0100 b43: N-PHY: fix RSSI calibration Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 8c1d5a7a2230a162af709fa118f051e0d18ff427 Author: RafaÅ‚ MiÅ‚ecki Date: Sun Nov 28 12:59:44 2010 +0100 b43: N-PHY: initialize perical variable, add missing call to CCA reset Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 161d540c8ef31e5adbced3248873024476e2c26f Author: RafaÅ‚ MiÅ‚ecki Date: Sun Nov 28 12:59:43 2010 +0100 b43: N-PHY: implement very basic TX power control management Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 40277cabfee7c8ef45055155895dcbef0f983c63 Author: RafaÅ‚ MiÅ‚ecki Date: Sun Nov 28 12:59:42 2010 +0100 b43: N-PHY: swap values for radio registers 0x3b and 0x3c Specs were updated plus we become wl compatible. Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit aa3bf280dd3214db5b9e1f8cad7c5868ccbe71b7 Author: Hauke Mehrtens Date: Sun Nov 28 12:22:52 2010 +0100 ssb: Add sysfs attributes to ssb devices Make it possible to read out the attributes, till now only show on dmesg, through sysfs. This patch was some time in OpenWrt. Signed-off-by: Bernhard Loos Signed-off-by: Hauke Mehrtens Signed-off-by: John W. Linville commit 172c69a47675dc1ca9c7243c031d8d77701bccc0 Author: RafaÅ‚ MiÅ‚ecki Date: Sun Nov 28 10:39:35 2010 +0100 ssb: extract indexes for power tables Signed-off-by: RafaÅ‚ MiÅ‚ecki Acked-by: Michael Buesch Signed-off-by: John W. Linville commit 6d20e8406f0942228a73000663c2b33f488103ea Author: Suresh Jayaraman Date: Wed Dec 1 14:42:28 2010 +0530 cifs: add attribute cache timeout (actimeo) tunable Currently, the attribute cache timeout for CIFS is hardcoded to 1 second. This means that the client might have to issue a QPATHINFO/QFILEINFO call every 1 second to verify if something has changes, which seems too expensive. On the other hand, if the timeout is hardcoded to a higher value, workloads that expect strict cache coherency might see unexpected results. Making attribute cache timeout as a tunable will allow us to make a tradeoff between performance and cache metadata correctness depending on the application/workload needs. Add 'actimeo' tunable that can be used to tune the attribute cache timeout. The default timeout is set to 1 second. Also, display actimeo option value in /proc/mounts. It appears to me that 'actimeo' and the proposed (but not yet merged) 'strictcache' option cannot coexist, so care must be taken that we reset the other option if one of them is set. Changes since last post: - fix option parsing and handle possible values correcly Reviewed-by: Jeff Layton Signed-off-by: Suresh Jayaraman Signed-off-by: Steve French commit 1953ecfc293911311f04d8c19f04d2249a30707b Author: Greg Kroah-Hartman Date: Thu Dec 2 11:28:28 2010 -0800 Staging: hv: rename the vmbus to "hyperv" This changes the name of the bus in sysfs from "vmbus" to "hyperv" which is the name it should show (vmbus is way to generic). Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit d89197c7f34934fbb0f96d938a0d6cfe0b8bcb1c Author: John W. Linville Date: Thu Dec 2 14:10:58 2010 -0500 Revert "ath9k: Fix STA disconnect issue due to received MIC failed bcast frames" This reverts commit 916448e77f6bcaaa7f13c3de0c3851783ae2bfd0. "As far as I can tell, either of these patches breaks multiple VIF scenarios. I'm not sure exactly why, but I had to revert this to get any of my interfaces to associate." -- Ben Greear http://marc.info/?l=linux-wireless&m=129123368719339&w=2 Signed-off-by: John W. Linville commit f67e07eb3decd7840b621fba37fd600adfdf99f8 Author: Felix Fietkau Date: Wed Dec 1 19:07:47 2010 +0100 ath9k_hw: fix more bitfield related endian issues A few LNA control related flags were also specified as a bitfields, however for some strange reason they were written in big-endian order this time. Fix this by using flags instead. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit e702ba18f25887c76d26c8a85cc1706463c62e9a Author: Felix Fietkau Date: Wed Dec 1 19:07:46 2010 +0100 ath9k_hw: fix endian issues with CTLs on AR9003 Parsing data using bitfields is messy, because it makes endian handling much harder. AR9002 and earlier got it right, AR9003 got it wrong. This might lead to either using too high or too low tx power values, depending on frequency and eeprom settings. Fix it by getting rid of the CTL related bitfields entirely and use masks instead. Signed-off-by: Felix Fietkau Cc: stable@kernel.org Signed-off-by: John W. Linville commit 9306990a656d9cfd8bf3586938012729c1f2ea50 Author: Vasanthakumar Thiagarajan Date: Tue Nov 30 23:24:09 2010 -0800 ath9k: Fix bug in reading input gpio state for ar9003 The register which gives input gpio state is 0x404c for ar9003, currently 0x4048 is wrongly used. This will disable RF and make it unusable on some of AR9003. Cc:stable@kernel.org Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 1937721f5637b53c794124cf4fd9edad0eb315ef Merge: 916448e77f6bcaaa7f13c3de0c3851783ae2bfd0 be93112accb42c5586a459683d71975cc70673ca Author: John W. Linville Date: Thu Dec 2 14:00:51 2010 -0500 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6 commit ae4694b2d3e4c0f47c0e804a68417be57e5daf85 Author: David S. Miller Date: Thu Dec 2 10:59:22 2010 -0800 ipv6: Create inet6_csk_route_req(). Brother of ipv4's inet_csk_route_req(). Signed-off-by: David S. Miller commit 15c054251ab84895ec043e90826612c1a3d6d4f1 Author: David S. Miller Date: Thu Dec 2 10:16:06 2010 -0800 ipv6: Add rt6_get_peer() helper. To go along side ipv4's rt_get_peer(). Signed-off-by: David S. Miller commit a69a6691d71cc24979ce29394478218307a77a84 Author: Greg Kroah-Hartman Date: Thu Dec 2 09:42:18 2010 -0800 Staging: hv: remove struct vmbus_driver It's only a wrapper for the struct hv_driver structure, so just use that instead, as there are no other fields left in it at the moment. Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 98293a279cc0ff085ead7c032c6b8cb7b6ad7e88 Author: Greg Kroah-Hartman Date: Thu Dec 2 09:16:04 2010 -0800 Staging: hv: remove OnChildDeviceAdd vmbus_driver callback It's only ever set to one function, so just call that function instead. Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 8cb280c90f9cfaab3ba3afbace0b1711dee80d0c Merge: 8fed709f343346a77888c2eef8f2d41bc637bef6 c76febef574fd86566bbdf1a73a547a439115c25 Author: Linus Torvalds Date: Thu Dec 2 09:13:36 2010 -0800 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs * 'for-linus' of git://oss.sgi.com/xfs/xfs: xfs: only run xfs_error_test if error injection is active xfs: avoid moving stale inodes in the AIL xfs: delayed alloc blocks beyond EOF are valid after writeback xfs: push stale, pinned buffers on trylock failures xfs: fix failed write truncation handling. commit 21486af0f34d03b813b023d7a2b887b329f60486 Author: Sebastian Andrzej Siewior Date: Fri Oct 8 18:11:19 2010 +0200 spi/pxa2xx: pass of_node to spi device and set a parent device the of_node will auto-publish devices which are added to the device tree. Signed-off-by: Sebastian Andrzej Siewior commit 579d3bb2ac1a351bbf536480a9ab38199bbf901d Author: Sebastian Andrzej Siewior Date: Mon Nov 22 17:12:17 2010 -0800 spi/pxa2xx: Modify RX-Tresh instead of busy-loop for the remaining RX bytes. After all TX bytes are sent, the driver spins while the SPI core is busy and then it spins for a "short" period of time until RX bytes are available. On Sodavile the busy flag disappears pretty quick and after that it takes approx ~130ms (sometimes less but not much) until there are bytes available in the RX FIFO. This patch removes the busy loop and modifies the RX threshould so we get woken up once the remainings bytes arrived. Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: Dirk Brandewie commit 2a8626a9e2d86d114a2d9f813a1acebf9d53dd10 Author: Sebastian Andrzej Siewior Date: Mon Nov 22 17:12:17 2010 -0800 spi/pxa2xx: Add chipselect support for Sodaville The SPI core on Sodaville supports chip selects. Its configuration moved into the SSSR register at bit 0 and 1. Thus Sodaville can be hooked up with up to 4 devices. This patch ensures that the bits which are otherwiese reserved are only touched on Sodaville and not on any other PXAs. Also it makes sure that the status register does not lose the CS information while clearing the ROR bit. Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: Dirk Brandewie commit 2d6e882bada0ca7828347647c5b1091bf5f18fee Author: Greg Kroah-Hartman Date: Thu Dec 2 08:50:58 2010 -0800 Staging: hv: remove GetChannelOffers vmbus_driver callback It's only ever set to one function, so just call that function instead. Actually, that wrapper function only ever called vmbus_request_offers() so just call that function instead, no need for a do-nothing intermediate step here. Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit c722bd3e2cb92be7afec346894faa29605436c1a Author: Greg Kroah-Hartman Date: Thu Dec 2 08:47:11 2010 -0800 Staging: hv: remove OnEventDpc vmbus_driver callback It's only ever set to one function, so just call that function instead. Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 4a1494fc101b05f895ef52b9d01769d382c5a6e2 Author: Greg Kroah-Hartman Date: Thu Dec 2 08:44:48 2010 -0800 Staging: hv: remove OnMsgDpc vmbus_driver callback It's only ever set to one function, so just call that function instead. Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 097e310329fb69c928aa44b517a547e4a17658fd Author: Greg Kroah-Hartman Date: Thu Dec 2 08:41:05 2010 -0800 Staging: hv: remove OnIsr vmbus_driver callback It's only ever set to one function, so just call that function instead. Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 9f28ebc381ca00af0f9033a29776775068344b06 Author: Wey-Yi Guy Date: Fri Nov 26 13:24:19 2010 -0800 iwlagn: name change for bt_ch_announce module parameter Change the module parameter name to bt_ch_inhibition from bt_ch_announce to better describe the functionality In order to allow Bluetooth to activate a smart AFH mechanism and to maximize its available bandwidth the WiFi will request BT Core to inhibit its activity in channels that interfere with WiFi activity (and vice versa) if bt_ch_inhibition is enabled Set module parameter "bt_ch_inhibition=0" will disable the channel inhibition function Signed-off-by: Wey-Yi Guy commit adb90a00371a9a06a55c7b7ed7b38152f8e960c3 Author: Wey-Yi Guy Date: Fri Nov 26 11:09:42 2010 -0800 iwlwifi: check for STATUS_EXIT_PENDING when send RXON command If driver is on the way down, there is no need to send RXON to uCode, check the condition before continuous the process. Signed-off-by: Wey-Yi Guy commit 8b3ee29626031155c7844988ebe4321c151c03a2 Author: Wey-Yi Guy Date: Thu Nov 18 11:41:48 2010 -0800 iwlagn: remove structure name reference to gen2 Give the corresponding name for .cfg data structure Signed-off-by: Wey-Yi Guy commit e7cad69cdab4d6f0caadbcdd58b54214243ba98a Author: Grumbach, Emmanuel Date: Thu Nov 18 03:47:38 2010 -0800 iwlagn: Enable PCI L1 ACTIVE state after uCode has been loaded PCI L1 Active needs to be disabled while loading the uCode so that the bus doesn't go to sleep. The enablement of L1 Active should be done after the uCode has sent the ALIVE response. The enablement of L1 Active was missing. Enabling L1 Active allows to save power if the BIOS / bus driver allows it. I measured the power consumption while not associated and idle/associated: L1 Active disabled: 39 mA = 130mW L1 Active enabled: 6 mA = 20 mW Signed-off-by: Emmanuel Grumbach Signed-off-by: Wey-Yi Guy commit 40b97c2fe96a476f1c228345f0c6a2d135a8b226 Author: Wey-Yi Guy Date: Wed Nov 17 14:17:53 2010 -0800 iwlagn: fix race condition when reprogram sta During reprogram stations, do not send link quality command. uCode will crash if receive link quality command for invalid station Signed-off-by: Wey-Yi Guy commit 9d8bd71ad4f295f80450b5089d239c3135802699 Author: Greg Kroah-Hartman Date: Thu Dec 2 08:34:45 2010 -0800 Staging: hv: remove OnChildDeviceRemove vmbus_driver callback It's only ever set to one function, so just call that function instead. Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 2ff38c9fbaa86264ad819117ab137361067ab5f1 Merge: c949e3d685b661412bfcd93d9c5956f125c1e060 af745bd724e304cc94a88a2fb43d53baffbd63a5 Author: Takashi Iwai Date: Thu Dec 2 17:33:53 2010 +0100 Merge branch 'fix/asoc' into for-linus commit af745bd724e304cc94a88a2fb43d53baffbd63a5 Merge: 2062ea522bb58bb2aeee86d051b37136491ccd65 0ffd22b694b739b3dc3f80bc93726b581e8e8af5 Author: Takashi Iwai Date: Thu Dec 2 17:31:18 2010 +0100 Merge branch 'for-2.6.37' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/asoc-2.6 into fix/asoc commit 9205307cd88f09e51f2c4aeba79266317a299853 Author: Greg Kroah-Hartman Date: Thu Dec 2 08:25:17 2010 -0800 Staging: hv: remove OnChildDeviceDestroy vmbus_driver callback No one ever calls it so get rid of it, it's pointless. Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 89733aa9cca016a542dc621d147a32d6b0fcdad5 Author: Greg Kroah-Hartman Date: Thu Dec 2 08:22:41 2010 -0800 Staging: hv: remove OnChildDeviceCreate vmbus_driver callback It's only ever set to one function, so just call that function instead. Cc: Haiyang Zhang Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit c949e3d685b661412bfcd93d9c5956f125c1e060 Merge: 37fa84d8e647e584bf1b71bdff0330049e34f5ef 0defe09ca70daccdc83abd9c3c24cd89ae6a1141 Author: Takashi Iwai Date: Thu Dec 2 17:14:50 2010 +0100 Merge branch 'fix/hda' into for-linus commit 8fed709f343346a77888c2eef8f2d41bc637bef6 Merge: 53f517a1f61ce69bf67898891d5b14ffaada0003 06c63f9396133f312c5a49c2285c2c8015e80934 Author: Linus Torvalds Date: Thu Dec 2 08:06:16 2010 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/lrg/voltage-2.6: regulator: fix kernel-doc for set_consumer_device_supply regulator: enable supply regulator only when use count is zero regulator: twl-regulator - fix twlreg_set_mode regulator: lock supply in regulator enable regulator: Return proper error for regulator_register() regulator: Ensure enough delay time for enabling regulator regulator: Remove a redundant device_remove_file call in create_regulator regulator: Staticise mc13783_powermisc_rmw() regulator: regulator disable supply fix commit 53f517a1f61ce69bf67898891d5b14ffaada0003 Merge: 04ed0978d5ca5a3460a6f1f7443f8147a183669f 9a1f8b34aa539000da17a06235e4bec254d0bfb5 Author: Linus Torvalds Date: Thu Dec 2 08:05:56 2010 -0800 Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6 * 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: [media] v4l: Remove module_name argument to the v4l2_i2c_new_subdev* functions [media] v4l: Remove hardcoded module names passed to v4l2_i2c_new_subdev* (2) commit 04ed0978d5ca5a3460a6f1f7443f8147a183669f Merge: 8520eeaa1235ee78d32558b6a57e02b236c9e588 dfc5606dc51381186de765243bab340c8e021868 Author: Linus Torvalds Date: Thu Dec 2 08:05:22 2010 -0800 Merge branch 'rbd-sysfs' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client * 'rbd-sysfs' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client: rbd: replace the rbd sysfs interface commit 8520eeaa1235ee78d32558b6a57e02b236c9e588 Merge: fb82155d5c401a5cf2bc2f555cb807f0bed035bb ba03864872691c0bb580a7fb47388da337ef4aa2 Author: Linus Torvalds Date: Thu Dec 2 08:04:21 2010 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6 * git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6: cifs: fix parsing of hostname in dfs referrals cifs: display fsc in /proc/mounts cifs: enable fscache iff fsc mount option is used explicitly cifs: allow fsc mount option only if CONFIG_CIFS_FSCACHE is set cifs: Handle extended attribute name cifs_acl to generate cifs acl blob (try #4) cifs: Misc. cleanup in cifsacl handling [try #4] cifs: trivial comment fix for cifs_invalidate_mapping [CIFS] fs/cifs/Kconfig: CIFS depends on CRYPTO_HMAC cifs: don't take extra tlink reference in initiate_cifs_search cifs: Percolate error up to the caller during get/set acls [try #4] cifs: fix another memleak, in cifs_root_iget cifs: fix potential use-after-free in cifs_oplock_break_put commit e63233f75a1a6bfa97ffb52a20cc6801a4c63fb2 Author: John Reiser Date: Mon Nov 22 19:41:44 2010 -0800 ftrace: Have recordmcount honor endianness in fn_ELF_R_INFO It looks to me like the change which introduced "virtual functions" forgot about cross-platform endianness. Thank you to Arnaud for supplying before+after data files do_mounts*.o. This fixes a MIPS build failure triggered by recordmcount. Reported-by: Arnaud Lacombe Tested-by: Arnaud Lacombe Acked-by: Wu Zhangjin Acked-by: Ralf Baechle Signed-off-by: John Reiser Signed-off-by: Steven Rostedt commit 11de3b11e08cac26d59e88efaf4e316701883552 Author: Trond Myklebust Date: Wed Dec 1 14:17:06 2010 -0500 NFS: Fix a memory leak in nfs_readdir We need to ensure that the entries in the nfs_cache_array get cleared when the page is removed from the page cache. To do so, we use the freepage address_space operation. Change nfs_readdir_clear_array to use kmap_atomic(), so that the function can be safely called from all contexts. Finally, modify the cache_page_release helper to call nfs_readdir_clear_array directly, when dealing with an anonymous page from 'uncached_readdir'. Signed-off-by: Trond Myklebust commit 6072d13c429373c5d63b69dadbbef40a9b035552 Author: Linus Torvalds Date: Wed Dec 1 13:35:19 2010 -0500 Call the filesystem back whenever a page is removed from the page cache NFS needs to be able to release objects that are stored in the page cache once the page itself is no longer visible from the page cache. This patch adds a callback to the address space operations that allows filesystems to perform page cleanups once the page has been removed from the page cache. Original patch by: Linus Torvalds [trondmy: cover the cases of invalidate_inode_pages2() and truncate_inode_pages()] Signed-off-by: Trond Myklebust commit 676dac4b1bee0469d6932f698aeb77e8489f5861 Author: Casey Schaufler Date: Thu Dec 2 06:43:39 2010 -0800 This patch adds a new security attribute to Smack called SMACK64EXEC. It defines label that is used while task is running. Exception: in smack_task_wait() child task is checked for write access to parent task using label inherited from the task that forked it. Fixed issues from previous submit: - SMACK64EXEC was not read when SMACK64 was not set. - inode security blob was not updated after setting SMACK64EXEC - inode security blob was not updated when removing SMACK64EXEC commit 512b109ec9620d037d6d2f6bd1bae9ce34dd6779 Author: Stefano Stabellini Date: Wed Dec 1 14:51:44 2010 +0000 xen: unplug the emulated devices at resume time Early after being resumed we need to unplug again the emulated devices. Signed-off-by: Stefano Stabellini commit 9a069c33c53c2e72ec1b76106be73df044af0195 Author: Stefano Stabellini Date: Wed Dec 1 14:51:44 2010 +0000 xen: fix save/restore for PV on HVM guests with pirq remapping Re-map and re-bind all the pirqs at resume time. Signed-off-by: Stefano Stabellini commit 6411fe69b8c4fd7811339c88c1843d562099fa2b Author: Stefano Stabellini Date: Wed Dec 1 14:51:44 2010 +0000 xen: resume the pv console for hvm guests too Signed-off-by: Stefano Stabellini commit 15664125f7cadcb6d725cb2d9b90f9715397848d Author: Peter Zijlstra Date: Wed Nov 24 10:43:55 2010 +0100 scripts/tags.sh: Add magic for trace-events Make tags find the trace-event definitions Acked-by: WANG Cong Signed-off-by: Peter Zijlstra LKML-Reference: <1290591835.2072.438.camel@laptop> Signed-off-by: Steven Rostedt commit af42b8d12f8adec6711cb824549a0edac6a4ae8f Author: Stefano Stabellini Date: Wed Dec 1 14:51:44 2010 +0000 xen: fix MSI setup and teardown for PV on HVM guests When remapping MSIs into pirqs for PV on HVM guests, qemu is responsible for doing the actual mapping and unmapping. We only give qemu the desired pirq number when we ask to do the mapping the first time, after that we should be reading back the pirq number from qemu every time we want to re-enable the MSI. This fixes a bug in xen_hvm_setup_msi_irqs that manifests itself when trying to enable the same MSI for the second time: the old MSI to pirq mapping is still valid at this point but xen_hvm_setup_msi_irqs would try to assign a new pirq anyway. A simple way to reproduce this bug is to assign an MSI capable network card to a PV on HVM guest, if the user brings down the corresponding ethernet interface and up again, Linux would fail to enable MSIs on the device. Signed-off-by: Stefano Stabellini commit e5fc7345412d5e4758fcef55a74354c5cbefd61e Author: Stefano Stabellini Date: Wed Dec 1 14:51:44 2010 +0000 xen: use PHYSDEVOP_get_free_pirq to implement find_unbound_pirq Use the new hypercall PHYSDEVOP_get_free_pirq to ask Xen to allocate a pirq. Remove the unsupported PHYSDEVOP_get_nr_pirqs hypercall to get the amount of pirq available. This fixes find_unbound_pirq that otherwise would return a number starting from nr_irqs that might very well be out of range in Xen. The symptom of this bug is that when you passthrough an MSI capable pci device to a PV on HVM guest, Linux would fail to enable MSIs on the device. Signed-off-by: Stefano Stabellini commit 1036dc169f4cc6e5b753b1596d285d1cc3311a23 Author: Juuso Oikarinen Date: Mon Nov 29 12:05:53 2010 +0200 wl12xx: Remove 11j channels from the supported channels list. Because we don't support them at this stage. Signed-off-by: Juuso Oikarinen Signed-off-by: Luciano Coelho commit 870c367cf829466f315de785ac613dd94eff5c50 Author: Roger Quadros Date: Mon Nov 29 16:24:57 2010 +0200 wl1271: Add wl1271_load_firmware() and export some functions For the SDIO testing module we need to load the firmware but not boot it. wl1271_load_firmware() is meant to do just the firmware loading part. We also export some functions so they are usable in the testing module. Signed-off-by: Roger Quadros Signed-off-by: Luciano Coelho commit 43a598d5e40485fcfbebe0700077e83afd803ed5 Author: Luciano Coelho Date: Tue Nov 30 14:58:46 2010 +0200 wl12xx: fix illegal memset if debugfs is not enabled If we try to reset the debugfs statistics when debugfs is not configured in the kernel, we're memset an illegal pointer, because it has never been allocated. So check whether we have debugfs enabled by looking into the wl->rootdir before trying to reset the fw_stats struct. Reported-by: Joerie de Gram Signed-off-by: Luciano Coelho commit d60080ae06b98790036104f07fa897cfc151ce12 Author: Eliad Peller Date: Wed Nov 24 12:53:16 2010 +0200 wl1271: move wl12xx debugfs directory to under wiphy's debugfs Use per-device debugfs path, so multiple devices won't collide. in order to use wl->hw->wiphy->debugfsdir, we have to move the debugfs creation from wl1271_debugfs_init() to wl1271_register_hw(). Reported-by: Johannes Berg Signed-off-by: Eliad Peller Signed-off-by: Luciano Coelho commit 7cb2cea9f0f207f819db9823413fa263175b6230 Author: Eliad Peller Date: Wed Nov 24 12:53:15 2010 +0200 wl1271: use debugfs_remove_recursive Documentation/filesystems/debugfs.txt: """ Once upon a time, debugfs users were required to remember the dentry pointer for every debugfs file they created so that all files could be cleaned up. We live in more civilized times now, though, and debugfs users can call: void debugfs_remove_recursive(struct dentry *dentry); """ Signed-off-by: Eliad Peller Signed-off-by: Luciano Coelho commit 4fc3680894ff5739e7474b6633e962bfbdf0d3d8 Author: Wim Van Sebroeck Date: Thu Dec 2 14:03:29 2010 +0000 watchdog: it8712f_wdt: add note to Kconfig On some motherboards the it8712f watchdog does not work unless the game port was enabled. see Bug 13140. We therefor add a note to Kconfig. Signed-off-by: Wim Van Sebroeck commit f6e0722fc3a35ff818c86ffbc414f7592a8119cf Author: Wolfram Sang & Martyn Welch Date: Thu Dec 2 00:11:16 2010 +0100 watchdog: gef_wdt: include fs.h Add missing include "linux/fs.h". This fixes compile failure. Signed-off-by: Wolfram Sang Signed-off-by: Martyn Welch Signed-off-by: Wim Van Sebroeck commit e6c3b699b2f6fcba7036c079b6f16bf9556c7f0d Author: Wim Van Sebroeck Date: Sat Oct 23 20:59:42 2010 +0000 watchdog: bcm63xx_wdt: improve platform part. * fix devinit and devexit sections * fix platform removal code so that the iounmap happens after the removal of the timer. * changes the reboot_notifier by a platform shutdown method. Signed-off-by: Wim Van Sebroeck commit c54fb811745967732bc9e31d837e0c9925e12b4b Author: Seth Heasley Date: Wed Nov 17 12:15:08 2010 -0700 watchdog: iTCO_wdt: TCO Watchdog patch for Intel Patsburg PCH This patch adds an additional LPC Controller DeviceID for the Intel Patsburg PCH for TCO Watchdog. Signed-off-by: Seth Heasley Signed-off-by: Wim Van Sebroeck commit 43f901fbc8ba94bfa8d58155ba9378d7a13af636 Author: Thomas Chou Date: Wed Oct 6 15:13:53 2010 +0800 gen_init_cpio: remove leading `/' from file names When we extracted the generated cpio archive using "cpio -id" command, it complained, cpio: Removing leading `/' from member names var/run cpio: Removing leading `/' from member names var/lib cpio: Removing leading `/' from member names var/lib/misc It is worse with the latest "cpio" or "pax", which tries to overwrite the host file system with the leading '/'. So the leading '/' of file names should be removed. This is consistent with the initramfs come with major distributions such as Fedora or Debian, etc. Signed-off-by: Thomas Chou Acked-by: Mike Frysinger Signed-off-by: Michal Marek commit 0a18a9386c056028799938960f91be338c4ff349 Author: Uwe Kleine-König Date: Thu Nov 4 10:24:16 2010 +0100 tags: put function prototypes back! Commit 7db86dc (ctags: usability fix) removed function prototypes from tags file claiming "It makes no real sense to include function prototypes". But it is useful for quickly determining which header file developer needs to include to fix compilation. Now if someone wants to remove forward declarations (which I agree are baggage), write a postprocessing script. Signed-off-by: Alexey Dobriyan Signed-off-by: Uwe Kleine-König Signed-off-by: Michal Marek commit ff0fba0bca4182e022c0a2ac0f3e63508e86e9f1 Author: Omar Ramirez Luna Date: Fri Oct 22 20:10:58 2010 -0500 OMAP: mailbox: fix detection for previously supported chips Fix the mailbox detection for OMAP3630 and 2430, also minor cleanup on conditional ifdef's that could affect it. Given that 2430 has an iva too, include it, as the same steps for omap3 apply. Signed-off-by: Omar Ramirez Luna Acked-by: Hiroshi Doyu commit 5d783731c683161d5d921c2ed03a43d6d31cf418 Author: Omar Ramirez Luna Date: Wed Dec 1 14:15:08 2010 -0600 OMAP: mailbox: remove unreachable return Remove unreachable return statement. Signed-off-by: Omar Ramirez Luna Acked-by: Benoit Cousson Acked-by: Hiroshi Doyu commit 582563074a691eb45cb22d2eca70eed8f2091c5f Author: Kanigeri, Hari Date: Mon Nov 29 20:24:14 2010 +0000 OMAP: mailbox: add notification support for multiple readers In the current mailbox driver, the mailbox internal pointer for callback can be directly manipulated by the Users, so a second User can easily corrupt the first user's callback pointer. The initial effort to correct this issue can be referred here: https://patchwork.kernel.org/patch/107520/ Along with fixing the above stated issue, this patch adds the flexibility option to register notifications from multiple readers to the events received on a mailbox instance. The discussion regarding this can be referred here. http://www.mail-archive.com/linux-omap@vger.kernel.org/msg30671.html Signed-off-by: Hari Kanigeri Signed-off-by: Fernando Guzman Lugo Acked-by: Hiroshi Doyu commit a42743c26a53a2a5f2b2018a9659ab3fb604d5bc Author: Kanigeri, Hari Date: Mon Nov 29 20:24:13 2010 +0000 OMAP: mailbox: send message in process context Schedule the Tasklet to send only when mailbox fifo is full and there are pending messages in kfifo, else send the message directly in the Process context. This would avoid needless scheduling of Tasklet for every message transfer Signed-off-by: Hari Kanigeri Acked-by: Hiroshi Doyu commit ab66ac3007cb3e59fe80dfcf36aff243d3008cb9 Author: Kanigeri, Hari Date: Mon Nov 29 20:24:12 2010 +0000 OMAP: mailbox: fix checkpatch warnings Fix the following checkpatch warnings observed in mailbox module. WARNING: please, no space for starting a line, excluding comments + fail_alloc_rxq:$ WARNING: please, no space for starting a line, excluding comments + fail_alloc_txq:$ WARNING: please, no space for starting a line, excluding comments + fail_request_irq:$ WARNING: line over 80 characters + mbox_kfifo_size = max_t(unsigned int, mbox_kfifo_size, sizeof(mbox_msg_t)); Signed-off-by: Hari Kanigeri Acked-by: Hiroshi Doyu commit d2295042b783c2b17d93cd5ab786bbfd4f2f5c90 Author: Fernando Guzman Lugo Date: Mon Nov 29 20:24:11 2010 +0000 OMAP: mailbox: change full flag per mailbox queue instead of global The variable rq_full flag is a global variable, so if there are multiple mailbox users there will be conflicts. Now there is a full flag per mailbox queue. Reported-by: Ohad Ben-Cohen Signed-off-by: Fernando Guzman Lugo Signed-off-by: Hari Kanigeri Acked-by: Hiroshi Doyu commit 0ffd22b694b739b3dc3f80bc93726b581e8e8af5 Author: Jarkko Nikula Date: Wed Dec 1 11:01:20 2010 +0200 ASoC: omap: N810: Don't select CONFIG_OMAP_MUX but make it as dependency Not all omap boards use kernel based pin multiplexing so CONFIG_SND_OMAP_SOC_N810 should not select it by default as it can make harm to other boards in multi-board kernels. Therefore put CONFIG_OMAP_MUX as a dependency to N810 ASoC machine driver. Thanks to Tony Lindgren for noticing. Signed-off-by: Jarkko Nikula Cc: Tony Lindgren Acked-by: Mark Brown Acked-by: Tony Lindgren Signed-off-by: Liam Girdwood commit a44a11e9a049b491445bfbd93969d23c49047714 Author: Arnaud Lacombe Date: Thu Nov 4 00:16:08 2010 -0400 kconfig: the day kconfig warns about "select"-abuse has come CC: catalin.marinas@arm.com Signed-off-by: Arnaud Lacombe Signed-off-by: Michal Marek commit 83ed79c561da20019cb24944f535530d73b2d615 Author: Dmitry Torokhov Date: Thu Dec 2 11:49:06 2010 +0100 HID: length resolution should be reported units/mm Input ABI requires reporting resolution on main axes in units per millimeter, not units per inch, so we need to convert accordingly. Tested-by: Nikolai Kondrashov Acked-by: Nikolai Kondrashov Signed-off-by: Dmitry Torokhov Signed-off-by: Jiri Kosina commit e4b546a3643fbfc510d5ef7db538e4d3ab00effb Merge: b3d006c0e745bfd2dab4984ffe3279d5cf4e926a d7470b6afca85ed4388fff57fc9d89f5a3be02ff Author: Ingo Molnar Date: Thu Dec 2 11:20:11 2010 +0100 Merge branch 'perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux-2.6 into perf/core commit 0defe09ca70daccdc83abd9c3c24cd89ae6a1141 Author: Daniel T Chen Date: Wed Dec 1 19:16:07 2010 -0500 ALSA: hda: Use "alienware" model quirk for another SSID BugLink: https://launchpad.net/bugs/683695 The original reporter states that headphone jacks do not appear to work. Upon inspecting his codec dump, and upon further testing, it is confirmed that the "alienware" model quirk is correct. Reported-and-tested-by: Cody Thierauf Cc: [2.6.32+] Signed-off-by: Daniel T Chen Signed-off-by: Takashi Iwai commit 56b9aea3b740be7665be100872a913da9bdc653b Author: Len Brown Date: Thu Dec 2 01:19:32 2010 -0500 intel_idle: recognize ARAT on WSM-EX We erroneously ignored the Always Running APIC Timer on WSM-EX. Move the check for ARAT down so that it can apply to any/all models. Signed-off-by: Len Brown commit a757ee2216211278680dd8ac869aabe7b4a9970d Author: Mauro Carvalho Chehab Date: Thu Dec 2 01:57:03 2010 -0200 [media] Don't export format_by_forcc on two different drivers Drivers should append their name on exported symbols, to avoid conflicts with allyesconfig: drivers/staging/built-in.o: In function `format_by_fourcc': /home/v4l/work_trees/linus/drivers/staging/cx25821/cx25821-video.c:96: multiple definition of `format_by_fourcc' drivers/media/built-in.o:/home/v4l/work_trees/linus/drivers/media/common/saa7146_video.c:88: first defined here Let's rename both occurences with a small shellscript: for i in drivers/staging/cx25821/*.[ch]; do sed s,format_by_fourcc,cx25821_format_by_fourcc,g <$i >a && mv a $i; done for i in drivers/media/common/saa7146*.[ch]; do sed s,format_by_fourcc,saa7146_format_by_fourcc,g <$i >a && mv a $i; done for i in include/media/saa7146*.[ch]; do sed s,format_by_fourcc,saa7146_format_by_fourcc,g <$i >a && mv a $i; done Signed-off-by: Mauro Carvalho Chehab commit ccb7c410ddc054b8c1ae780319bc98ae092d3854 Author: David S. Miller Date: Wed Dec 1 18:09:13 2010 -0800 timewait_sock: Create and use getpeer op. The only thing AF-specific about remembering the timestamp for a time-wait TCP socket is getting the peer. Abstract that behind a new timewait_sock_ops vector. Support for real IPV6 sockets is not filled in yet, but curiously this makes timewait recycling start to work for v4-mapped ipv6 sockets. Signed-off-by: David S. Miller commit 4399ce402c7c837dec80bf9fb40d079b39b9265a Author: David S. Miller Date: Wed Dec 1 17:29:08 2010 -0800 inetpeer: Fix incorrect comment about inetpeer struct size. Now with ipv6 support it is no longer less than 64 bytes. Signed-off-by: David S. Miller commit 8790ca172a1550949804a2ad59ccea310f680c9f Author: David S. Miller Date: Wed Dec 1 17:28:18 2010 -0800 inetpeer: Kill use of inet_peer_address_t typedef. They are verboten these days. Signed-off-by: David S. Miller commit 7adce751ce79bcb6d0a591e6b94d76631c9a232c Merge: 91a4d157d0c18bd18fd95f90b67cb10d11701cca 21d606090ec1aacc998276f5af34c43a88f01218 e3d33cb13202cd51378c8d61e92a96183cc0e6fd Author: Roland Dreier Date: Wed Dec 1 16:33:47 2010 -0800 Merge branches 'misc', 'mlx4' and 'nes' into for-next commit 91a4d157d0c18bd18fd95f90b67cb10d11701cca Author: Vasiliy Kulikov Date: Sun Nov 14 09:22:52 2010 +0000 IB: Fix information leak in marshalling code ib_ucm_init_qp_attr() and ucma_init_qp_attr() pass struct ib_uverbs_qp_attr with reserved, qp_state, {ah_attr,alt_ah_attr}{reserved,->grh.reserved} fields uninitialized to copy_to_user(). This leads to leaking of contents of kernel stack memory to userspace. Signed-off-by: Vasiliy Kulikov Signed-off-by: Roland Dreier commit f55864a4f435e47ad413be7016f38877b096bb5b Author: Or Gerlitz Date: Mon Nov 29 07:20:50 2010 +0000 IB/pack: Remove some unused code added by the IBoE patches Remove unused functions added by commit ff7f5aab354d ("IB/pack: IBoE UD packet packing support"). Signed-off-by: Or Gerlitz commit 21d606090ec1aacc998276f5af34c43a88f01218 Author: Eli Cohen Date: Thu Nov 11 21:05:58 2010 +0000 IB/mlx4: Fix IBoE link state Use netif_running() and netif_carrier_ok() to report link state, exactly as is done to report Ethernet link state in sysfs. Signed-off-by: Eli Cohen Signed-off-by: Roland Dreier commit 328266c561153a0c19084088d5dacd40632dc7ae Author: Eli Cohen Date: Mon Nov 15 14:04:39 2010 +0000 IB/mlx4: Fix IBoE reported link rate The link rate is the product of the link speed in the link width. For Etherent ports the rate is 10G, so we use 1 for the width and 4 for speed to get the correct rate. Signed-off-by: Eli Cohen Signed-off-by: Roland Dreier commit 58d74bb1d9f79bb56b2ea51d2ca06a28fa0fce02 Author: Eli Cohen Date: Wed Nov 10 12:52:37 2010 +0000 mlx4_core: Workaround firmware bug in query dev cap ConnectX firmware is supposed to report the number blue flame registers per page as log2 of the value. However, due to a firmware bug, it reports actual number. This patch works around this by checking if the number of registers calculated fits within a page. If it does not, we use 8 registers per page. Signed-off-by: Eli Cohen Signed-off-by: Roland Dreier commit dfc5606dc51381186de765243bab340c8e021868 Author: Yehuda Sadeh Date: Fri Nov 19 14:51:04 2010 -0800 rbd: replace the rbd sysfs interface The new interface creates directories per mapped image and under each it creates a subdir per available snapshot. This allows keeping a cleaner interface within the sysfs guidelines. The ABI documentation was updated too. Acked-by: Greg Kroah-Hartman Signed-off-by: Yehuda Sadeh Signed-off-by: Sage Weil commit be21871f24b0fcd8d0d09c8090385c9cec80efa3 Author: Andrei Emeltchenko Date: Wed Dec 1 16:58:26 2010 +0200 Bluetooth: clean up legal text Remove extra spaces from legal text so that legal stuff looks the same for all bluetooth code. Signed-off-by: Andrei Emeltchenko Signed-off-by: Gustavo F. Padovan commit 70f23020e6d89155504b5b39f22505f4aec6fa6f Author: Andrei Emeltchenko Date: Wed Dec 1 16:58:25 2010 +0200 Bluetooth: clean up hci code Do not use assignment in IF condition, remove extra spaces, fixing typos, simplify code. Signed-off-by: Andrei Emeltchenko Signed-off-by: Gustavo F. Padovan commit 894718a6be69d8cfd191dc291b42be32a1e4851b Author: Andrei Emeltchenko Date: Wed Dec 1 16:58:24 2010 +0200 Bluetooth: clean up l2cap code Do not initialize static vars to zero, macros with complex values shall be enclosed with (), remove unneeded braces. Signed-off-by: Andrei Emeltchenko Signed-off-by: Gustavo F. Padovan commit 285b4e90318dcf421a00b2ac3fe8ab713f3281e3 Author: Andrei Emeltchenko Date: Wed Dec 1 16:58:23 2010 +0200 Bluetooth: clean up rfcomm code Remove extra spaces, assignments in if statement, zeroing static variables, extra braces. Fix includes. Signed-off-by: Andrei Emeltchenko Signed-off-by: Gustavo F. Padovan commit 735cbc4784a084b7a76c43c69f9dba683bb3b48b Author: Andrei Emeltchenko Date: Wed Dec 1 16:58:22 2010 +0200 Bluetooth: clean up sco code Do not use assignments in IF condition, remove extra spaces Signed-off-by: Andrei Emeltchenko Signed-off-by: Gustavo F. Padovan commit b78d7b4f204a6ba1901af36c95e10fded9816054 Author: Anderson Lizardo Date: Mon Nov 29 12:15:50 2010 -0400 Bluetooth: Fix error handling for l2cap_init() create_singlethread_workqueue() may fail with errors such as -ENOMEM. If this happens, the return value is not set to a negative value and the module load will succeed. It will then crash on module unload because of a destroy_workqueue() call on a NULL pointer. Additionally, the _busy_wq workqueue is not being destroyed if any errors happen on l2cap_init(). Signed-off-by: Anderson Lizardo Signed-off-by: Gustavo F. Padovan commit eeb366564be7c311b31c70821d18a43a8a57f9bc Author: Gustavo F. Padovan Date: Mon Nov 1 18:43:53 2010 +0000 Bluetooth: Get rid of __rfcomm_get_sock_by_channel() rfcomm_get_sock_by_channel() was the only user of this function, so I merged both into rfcomm_get_sock_by_channel(). The socket lock now should be hold outside of rfcomm_get_sock_by_channel() once we hold and release it inside the same function now. Signed-off-by: Gustavo F. Padovan commit e0f0cb56364958223f0cb1f1b0b0eecf1b8dcb95 Author: Gustavo F. Padovan Date: Mon Nov 1 18:43:53 2010 +0000 Bluetooth: Get rid of __l2cap_get_sock_by_psm() l2cap_get_sock_by_psm() was the only user of this function, so I merged both into l2cap_get_sock_by_psm(). The socket lock now should be hold outside of l2cap_get_sock_by_psm() once we hold and release it inside the same function now. Signed-off-by: Gustavo F. Padovan commit cc11b9c14da4ca1c545b424dae2ae8fb1ab04063 Author: Andrei Emeltchenko Date: Mon Nov 22 13:21:37 2010 +0200 Bluetooth: do not use assignment in if condition Fix checkpatch errors like: "ERROR: do not use assignment in if condition" Simplify code and fix one long line. Signed-off-by: Andrei Emeltchenko Acked-by: Ville Tervo Signed-off-by: Gustavo F. Padovan commit 940a9eea80946b64b96bd8af1fc71b30c602d057 Author: Andrei Emeltchenko Date: Wed Nov 3 12:32:45 2010 +0200 Bluetooth: timer check sk is not owned before freeing In timer context we might delete l2cap channel used by krfcommd. The check makes sure that sk is not owned. If sk is owned we restart timer for HZ/5. Signed-off-by: Andrei Emeltchenko Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit a49184c229535ebedbb659214db2d4d1d77b7c07 Author: Andrei Emeltchenko Date: Wed Nov 3 12:32:44 2010 +0200 Bluetooth: Check sk is not owned before freeing l2cap_conn Check that socket sk is not locked in user process before removing l2cap connection handler. lock_sock and release_sock do not hold a normal spinlock directly but instead hold the owner field. This means bh_lock_sock can still execute even if the socket is "locked". More info can be found here: http://www.linuxfoundation.org/collaborate/workgroups/networking/socketlocks krfcommd kernel thread may be preempted with l2cap tasklet which remove l2cap_conn structure. If krfcommd is in process of sending of RFCOMM reply (like "RFCOMM UA" reply to "RFCOMM DISC") then kernel crash happens. ... [ 694.175933] Unable to handle kernel NULL pointer dereference at virtual address 00000000 [ 694.184936] pgd = c0004000 [ 694.187683] [00000000] *pgd=00000000 [ 694.191711] Internal error: Oops: 5 [#1] PREEMPT [ 694.196350] last sysfs file: /sys/devices/platform/hci_h4p/firmware/hci_h4p/loading [ 694.260375] CPU: 0 Not tainted (2.6.32.10 #1) [ 694.265106] PC is at l2cap_sock_sendmsg+0x43c/0x73c [l2cap] [ 694.270721] LR is at 0xd7017303 ... [ 694.525085] Backtrace: [ 694.527587] [] (l2cap_sock_sendmsg+0x0/0x73c [l2cap]) from [] (sock_sendmsg+0xb8/0xd8) [ 694.537292] [] (sock_sendmsg+0x0/0xd8) from [] (kernel_sendmsg+0x48/0x80) Signed-off-by: Andrei Emeltchenko Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit d31dbf6e5989b2fd9a30ec5b25436e94f009d6df Author: Vasiliy Kulikov Date: Sat Oct 30 18:26:31 2010 +0400 Bluetooth: hidp: fix information leak to userland Structure hidp_conninfo is copied to userland with version, product, vendor and name fields unitialized if both session->input and session->hid are NULL. It leads to leaking of contents of kernel stack memory. Signed-off-by: Vasiliy Kulikov Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit 3185fbd9d7bb166992f072440b3329f58bf2c60a Author: Vasiliy Kulikov Date: Sat Oct 30 18:26:26 2010 +0400 Bluetooth: cmtp: fix information leak to userland Structure cmtp_conninfo is copied to userland with some padding fields unitialized. It leads to leaking of contents of kernel stack memory. Signed-off-by: Vasiliy Kulikov Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit 5520d20f68310fc158dcbbecfd5eac5cdfc5a241 Author: Vasiliy Kulikov Date: Sat Oct 30 18:26:21 2010 +0400 Bluetooth: bnep: fix information leak to userland Structure bnep_conninfo is copied to userland with the field "device" that has the last elements unitialized. It leads to leaking of contents of kernel stack memory. Signed-off-by: Vasiliy Kulikov Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit 127178d24c7eb2df53b1ba2b6f6f743e88178a1b Author: Johan Hedberg Date: Thu Nov 18 22:22:29 2010 +0200 Bluetooth: Automate remote name requests In Bluetooth there are no automatic updates of remote device names when they get changed on the remote side. Instead, it is a good idea to do a manual name request when a new connection gets created (for whatever reason) since at this point it is very cheap (no costly baseband connection creation needed just for the sake of the name request). So far userspace has been responsible for this extra name request but tighter control is needed in order not to flood Bluetooth controllers with two many commands during connection creation. It has been shown that some controllers simply fail to function correctly if they get too many (almost) simultaneous commands during connection creation. The simplest way to acheive better control of these commands is to move their sending completely to the kernel side. This patch inserts name requests into the sequence of events that the kernel performs during connection creation. It does this after the remote features have been successfully requested and before any pending authentication requests are performed. The code will work sub-optimally with userspace versions that still do the name requesting themselves (it shouldn't break anything though) so it is recommended to combine this with a userspace software version that doesn't have automated name requests. Signed-off-by: Johan Hedberg Signed-off-by: Gustavo F. Padovan commit 392599b95d76f4f3102d8614bdc1957795cd1a3a Author: Johan Hedberg Date: Thu Nov 18 22:22:28 2010 +0200 Bluetooth: Create a unified authentication request function This patch adds a single function that's responsible for requesting authentication for outgoing connections. This is preparation for the next patch which will add automated name requests and thereby move the authentication requests to a different location. Signed-off-by: Johan Hedberg Signed-off-by: Gustavo F. Padovan commit ccd556fe334914bf2e465eb5bc480d49cd4406d7 Author: Johan Hedberg Date: Wed Nov 10 17:11:51 2010 +0200 Bluetooth: Simplify remote features callback function logic The current remote and remote extended features event callbacks logic can be made simpler by using a label and goto statements instead of the current multiple levels of nested if statements. Signed-off-by: Johan Hedberg Signed-off-by: Gustavo F. Padovan commit 17f490bcedd7b6677140b2d49efe9e9e6b84de60 Merge: 61790c5f3c5f158821821a00797d94504531839f be93112accb42c5586a459683d71975cc70673ca Author: Gustavo F. Padovan Date: Wed Dec 1 21:04:09 2010 -0200 Merge git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6 into test commit 2cb22a7a5624603b9db3571fc65489f5389b512c Author: Roland Vossen Date: Wed Dec 1 21:37:34 2010 +0100 staging: brcm80211: replaced typedef struct wl_info_t by struct wl_info. Part of the code cleanup effort. CodingStyle doc advises to restrict the usage of typedefs. Also moved several function declarations from .c to .h file because this typedef replace operation induced checkpatch.pl warnings. Signed-off-by: Roland Vossen Signed-off-by: Greg Kroah-Hartman commit 01d11441fd7ede922e10008986ecdb0a84256bc5 Author: Randy Dunlap Date: Wed Dec 1 11:16:35 2010 -0800 staging: brcm80211 needs lots of delay.h Fix lots of errors like: drivers/staging/brcm80211/phy/wlc_phy_n.c:17613: error: implicit declaration of function 'mdelay' drivers/staging/brcm80211/util/nicpci.c:246: error: implicit declaration of function 'udelay' Signed-off-by: Randy Dunlap Cc: Brett Rudley Cc: Henry Ptasinski Cc: Dowan Kim Cc: Roland Vossen Cc: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit a043b26646444eba28e5010965dbf61bc3ba5277 Author: Brett Rudley Date: Tue Nov 30 20:32:51 2010 -0800 staging: brcm80211: bcmp => memcmp s/bcmp/memcmp/ Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 9249ede9d4d9dbf41ab6545a7a43fd5f6e5aa620 Author: Brett Rudley Date: Tue Nov 30 20:09:49 2010 -0800 staging: brcm80211: bzero => memset s/bzero/memset/g Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit c10407ac459577f6b58f3db0777b6d0d53a3be9f Author: Brett Rudley Date: Tue Nov 30 17:35:09 2010 -0800 staging: brcm80211: remove OSL_SYSUPTIME_SUPPORT Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit c53d201371bf45cdb5b843ade52edd8903bb72f6 Author: Brett Rudley Date: Tue Nov 30 15:22:15 2010 -0800 staging: brcm80211: Remove bogus gcc version checking Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit f5343314f62ba392ec069210ae342bc32c4ce367 Author: Brett Rudley Date: Tue Nov 30 15:22:14 2010 -0800 staging: brcm80211: Remove unused PKTFREESETCB Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 954c7a6c960bcedf28e8b5dcdcd6fe68d8c6c110 Author: Brett Rudley Date: Tue Nov 30 15:22:13 2010 -0800 staging: brcm80211: Remove OSL_DMADDRWIDTH Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit b834517572d19d34c9cd9adb878aec3138db9224 Author: David Chosrova Date: Wed Dec 1 13:42:16 2010 +0100 Staging: rtl8192u: check return code kmalloc. This patch checks the return code of kmalloc when trying to allocate memory for priv->rx_urb in rtl8192_usb_initendpoints(), return -ENOMEM when failed. Signed-off-by: David Chosrova Signed-off-by: Greg Kroah-Hartman commit 8c66be9203d891ea37346a78925f0e6534b98bd3 Author: Michael Hennerich Date: Wed Dec 1 17:34:39 2010 +0100 staging: iio: dds: ad9832: Fix kconfig description The AD9832 driver doesn't support the AD9833 and AD9834 Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit 0e7a3e7a746b5dc6ccf9896e882441c4fdbfd09a Author: David Chosrova Date: Mon Nov 29 21:50:48 2010 +0100 Staging: rtl8192u: remove dead code to disable dot11d This patch removes all the ENABLE_DOT11D ifdefs. It is always defined for driver. DOT11D has to do with regulatory domains. What prompted this patch was a warning message in Sparse. drivers/staging/rtl8192u/r8192U_core.c:247:1: warning: "eqMacAddr" redefined in file included from drivers/staging/rtl8192u/:81:81: drivers/staging/rtl8192u/dot11d.h:35:1: warning: this is the location of the previous definition Now there are no ifdefs around dot11d.h it made no sense to have this second definition, so I removed that macro as well. ( Thanks Dan ;-) ). Acked-by. Dan Carpenter Signed-off-by: David Chosrova Signed-off-by: Greg Kroah-Hartman commit 2894c6cd0ea84c30fc028ba92f8e61fbe7971e65 Author: Pekka Enberg Date: Sun Nov 28 23:00:08 2010 +0200 Staging: w35und: Kill struct wb_usb This patch kills struct wb_usb which now only contains a pointer to struct usb_device. Cc: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit 9be98819d31c4e105ad028ee092d27a46a9e298a Author: Pekka Enberg Date: Sun Nov 28 23:00:07 2010 +0200 Staging: w35und: Remove unused fields from struct wb_usb This patch removes two unused fields from struct wb_usb: - DetectCount which is always zero - IsUsb20 which is a write-only struct member Cc: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit 4398954e5f91e340f5a2db53d219b6562e3e1bf0 Author: Pekka Enberg Date: Sun Nov 28 23:00:06 2010 +0200 Staging: w35und: Kill wblinux_f.h header The wblinux_f.h header file doesn't contain anything that's actually used. Kill it. Cc: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit 01b5ceeca5aa45735a987420c83228a9778a791f Author: Pekka Enberg Date: Sun Nov 28 23:00:05 2010 +0200 Staging: w35und: Merge mlmetxrx.c to mds.c This patch merges mlmetxrx.c to mds.c because it's small and the functions are only used in mto.c. Cc: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit 37b0544a4a455609cbf25fa56441a6f1221dec85 Author: Pekka Enberg Date: Sun Nov 28 23:00:04 2010 +0200 Staging: w35und: Kill _IBSS_BEACON_SEQ_STICK_ This patch kills the _IBSS_BEACON_SEQ_STICK_ ifdefs because the macro is never defined. Cc: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit 9618386a4e58e0459932846d9b07fa81225840d3 Author: Pekka Enberg Date: Sun Nov 28 23:00:03 2010 +0200 Staging: w35und: Kill write-only ->TxToggle This patch removes ->TxToggle from struct wb35_mds because it's a write only struct member. Cc: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit 9255650cbf997762bd667896b0b86661cd81c9b4 Author: Pekka Enberg Date: Sun Nov 28 23:00:02 2010 +0200 Staging: w35und: Kill Vendor2 ifdef from hal_init_hardware The Vendor2 macro is never defined so remove the ifdef'd block from hal_init_hardware(). Cc: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit ddee7e28e7d5e4ba2b8537c6a59b035745c250bb Author: Pekka Enberg Date: Sun Nov 28 23:00:01 2010 +0200 Staging: w35und: Remove empty sysdef.h header The sysdef.h header is empty now so kill it. Cc: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit 2855bb79d75ad1419b1f54008f861a39517acfd5 Author: Pekka Enberg Date: Sun Nov 28 23:00:00 2010 +0200 Staging: w35und: Use pr_debug() for debugging Use pr_debug() for debugging printk's and kill the FULL_DEBUG macro. It would be even better to use dev_dbg() but unfortunately looking up struct device in the current code structure makes things very ugly. Please note that I dropped the DataDmp() calls from RFSynthesizer_SwitchingChannel() because that function doesn't exist. Cc: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit a4170e3dddc5eb88d23dd5f6e7c9cdefc244001e Author: Pekka Enberg Date: Sun Nov 28 22:59:59 2010 +0200 Staging: w35und: Kill unused code in mac_structures.h This patch kills tons of unused macros and struct definitions from mac_structures.h. Cc: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit c84fa49f61798b6248cef56876f1643db3b7b2f3 Author: Pekka Enberg Date: Sun Nov 28 22:59:58 2010 +0200 Staging: w35und: Kill WPA2 definitions The _WPA2_ macro is always defined but the data structures that are wrapped by it are never used. Kill them. Cc: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit 1140bd9f30f4d6dac6b53365a70819ecd4cc8c54 Author: Pekka Enberg Date: Sun Nov 28 22:59:57 2010 +0200 Staging: w35und: Kill _USE_FALLBACK_RATE_ macro The _USE_FALLBACK_RATE_ macro parametrizes DEFAULT_RATE_RETRY_LIMIT. It's only used in Mxx_initial() in reg.c where _USE_FALLBACK_RATE_ is always defined because the reg.c file includes sysdef.h at the top. It's therefore safe to remove the _USE_FALLBACK_RATE_ macro. Cc: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit ac5435b9800f313bdcd6a43444ceb1d89f241a5e Author: Pekka Enberg Date: Sun Nov 28 22:59:56 2010 +0200 Staging: w35und: Remove unused defines from sysdef.h This patch removes all the defines in sysdef.h that are not used at all. Cc: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit a5b10629edfa521071ccdb3b1e0e7fb350a044db Author: Herb Shiu Date: Tue Nov 23 13:58:29 2010 -0800 ceph: Behave better when handling file lock replies. Fill in the local lock with response data if appropriate, and don't call posix_lock_file when reading locks. Signed-off-by: Herb Shiu Acked-by: Greg Farnum Signed-off-by: Sage Weil commit 637ae8d547390df75bad42a7e9cb65e625119767 Author: Herb Shiu Date: Tue Nov 23 13:42:23 2010 -0800 ceph: pass lock information by struct file_lock instead of as individual params. Signed-off-by: Herb Shiu Acked-by: Greg Farnum Signed-off-by: Sage Weil commit 25933abdd8c562182ca6dc9f8c4c2cc8265c3a80 Author: Herb Shiu Date: Wed Dec 1 14:14:38 2010 -0800 ceph: Handle file locks in replies from the MDS. Previously the kernel client incorrectly assumed everything was a directory. Signed-off-by: Herb Shiu Acked-by: Greg Farnum Signed-off-by: Sage Weil commit 884ea892763d4dfba509743f65961c782c0442db Author: Sage Weil Date: Mon Nov 22 22:58:06 2010 -0800 ceph: avoid possible null deref in readdir after dir llseek last may be NULL, but we dereference it in the else branch without checking. Normally it doesn't trigger because last == NULL when fpos == 2, but it could happen on a newly opened dir if the user seeks forward. Reported-by: Dan Carpenter Signed-off-by: Sage Weil commit 673eb9ff33e26ee6f4278cdab06749aef1bbef5b Author: Laurent Pinchart Date: Sun Nov 21 16:54:56 2010 -0300 [media] uvcvideo: Convert to unlocked_ioctl The uvcvideo driver now locks all ioctls correctly on its own, the BKL isn't needed anymore. Signed-off-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab commit 6947756dfcecc493062a46e77f6bf51dddb5be75 Author: Laurent Pinchart Date: Sun Nov 21 13:36:34 2010 -0300 [media] uvcvideo: Lock stream mutex when accessing format-related information The stream mutex protects access to the struct uvc_streaming ctrl, cur_format and cur_frame fields as well as to the hardware probe control. Lock it appropriately. Signed-off-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab commit 4aa275975beee41fd542a0f6df8cd0fee06089bf Author: Laurent Pinchart Date: Sun Nov 21 15:18:08 2010 -0300 [media] uvcvideo: Move mmap() handler to uvc_queue.c The mmap() implementation belongs to the video buffers queue, move it there. Signed-off-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab commit 8e815e1763b8d4e5adf0dc14bde8c55329cf95a8 Author: Laurent Pinchart Date: Sun Nov 21 14:46:44 2010 -0300 [media] uvcvideo: Move mutex lock/unlock inside uvc_free_buffers Callers outside uvc_queue.c should not be forced to lock/unlock the queue mutex manually. Move the mutex operations inside uvc_free_buffers(). Signed-off-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab commit 23d9f3ef23f0dc4bb20ccd5540b9a91ff08da08f Author: Laurent Pinchart Date: Sun Nov 21 07:58:54 2010 -0300 [media] uvcvideo: Lock controls mutex when querying menus uvc_find_control() must be called with the controls mutex locked. Fix uvc_query_v4l2_menu() accordingly. Signed-off-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab commit ca9afe6f87b569cdf8e797395381f18ae23a2905 Author: Hans Verkuil Date: Fri Nov 26 06:54:53 2010 -0300 [media] v4l2-dev: fix race condition The unregister function had a race condition with the v4l2_open function. Ensure that both functions test and clear the REGISTER flag from within a critical section. Thanks to Laurent Pinchart for finding this race. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 879aa24d6394aa04b690a600a41ff500441ad384 Author: Hans Verkuil Date: Fri Nov 26 06:47:28 2010 -0300 [media] V4L: improve the BKL replacement heuristic The BKL replacement mutex had some serious performance side-effects on V4L drivers. It is replaced by a better heuristic that works around the worst of the side-effects. Read the v4l2-dev.c comments for the whole sorry story. This is a temporary measure only until we can convert all v4l drivers to use unlocked_ioctl. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 2877842de8cbf6272b0a851cb12587b7dd8c2afb Author: Hans Verkuil Date: Fri Nov 26 06:43:51 2010 -0300 [media] v4l2-dev: use mutex_lock_interruptible instead of plain mutex_lock Where reasonable use mutex_lock_interruptible instead of mutex_lock. Also fix the poll, read and write error codes when called with an unregistered device (e.g. after a USB device was disconnected). Poll must return POLLERR|POLLHUP and read/write must return -ENODEV. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 78b055be2710b63cb196fc37669f3b662fecc9e4 Author: Hans Verkuil Date: Fri Nov 19 17:04:31 2010 -0300 [media] cx18: convert to unlocked_ioctl Also added locking around snd_cx18_pcm_ioctl as a precaution as requested by Andy Walls. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 4f68775b7dfc6115169f689a42535486bf10977e Author: Hans Verkuil Date: Tue Nov 16 18:13:06 2010 -0300 [media] radio-timb: convert to unlocked_ioctl Signed-off-by: Hans Verkuil Acked-by: Richard Röjfors Signed-off-by: Mauro Carvalho Chehab commit 697566939dc60048fca6e6dd69c7e089aaeb7ff8 Author: Hans Verkuil Date: Tue Nov 16 18:12:16 2010 -0300 [media] sh_vou: convert to unlocked_ioctl Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 20aa5bb9dc4b5aba1b4d0f15aa92c4e83721a343 Author: Hans Verkuil Date: Sun Nov 14 13:09:21 2010 -0300 [media] cafe_ccic: replace ioctl by unlocked_ioctl Trivial change, approved by Jonathan Corbet . Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit ca2621963de3934613f8aa63e19c03b1751707ae Author: Hans Verkuil Date: Sun Nov 14 11:17:00 2010 -0300 [media] et61x251_core: trivial conversion to unlocked_ioctl Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit feecf93d6b16887bf7e12fcc604bfba9048b2fa5 Author: Hans Verkuil Date: Sun Nov 14 11:13:39 2010 -0300 [media] sn9c102: convert to unlocked_ioctl Trivial conversion, this driver used a mutex already. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 61df3c9b3fe6a7e47d25b27ae4df0ecdb07b8fbd Author: Hans Verkuil Date: Sun Nov 14 10:09:38 2010 -0300 [media] BKL: trivial ioctl -> unlocked_ioctl video driver conversions These drivers could be trivially converted to unlocked_ioctl since they already did locking. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit d2c998f7453af7ad416bc38d09ae9d453d2fac5e Author: Hans Verkuil Date: Sun Nov 14 09:49:34 2010 -0300 [media] typhoon: convert to unlocked_ioctl Convert the typhoon driver from ioctl to unlocked_ioctl. When doing this I noticed a bug where curfreq was not initialized correctly to mutefreq (it wasn't multiplied by 16). The initialization is now also done before the device node is created. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 725ea8cf1c1f5ba53177d20d2d2f6dbc139b643e Author: Hans Verkuil Date: Sun Nov 14 09:48:24 2010 -0300 [media] si4713: convert to unlocked_ioctl Convert ioctl to unlocked_ioctl. Note that for this driver the locking is done inside the sub-device. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit ee71e42321cced11fecb989d743ad9cdb0c384ea Author: Hans Verkuil Date: Sun Nov 14 09:46:23 2010 -0300 [media] tea5764: convert to unlocked_ioctl Convert from ioctl to unlocked_ioctl using the v4l2 core lock. Also removed the 'exclusive access' limitation. There was no need for it and it violates the v4l2 spec as well. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 1cccee0b84e3445a142d0e9edcbf66b677b2e7e5 Author: Hans Verkuil Date: Sun Nov 14 09:43:52 2010 -0300 [media] cadet: use unlocked_ioctl Converted from ioctl to unlocked_ioctl. This driver already used an internal lock, but it was missing in cadet_open and cadet_release and it was not used correctly in cadet_read. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 32958fdd1663aeaa23b5edbfbb0db684ffd4e20e Author: Hans Verkuil Date: Sun Nov 14 09:36:23 2010 -0300 [media] BKL: trivial BKL removal from V4L2 radio drivers The patch converts a bunch of V4L2 radio drivers to unlocked_ioctl. These are all simple conversions: most already had a lock and so the ioctl fop could simply be replaced by unlocked_ioctl. radio-miropcm20.c was converted to use the new V4L2 core lock. While doing this work I noticed that many of these drivers initialized some more fields or muted audio or something like that *after* creating the device node. This should be done before the device node is created to prevent problems. Especially hal tends to grab a device node as soon as it is created. In one or two cases the mutex_init was even done after the device creation! Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab commit 12b3b5afed67e08aa641d30e57df20dab2e33432 Author: Rafael J. Wysocki Date: Thu Nov 25 00:03:32 2010 +0100 ACPI / PM: Do not refcount power resources that can't be turned on If turning on a power resource fails, do not reference count it, since it cannot be in use in that case. Signed-off-by: Rafael J. Wysocki Signed-off-by: Len Brown commit 212967c69afd348342548272aedbe4d46a9325d6 Author: Rafael J. Wysocki Date: Thu Nov 25 00:02:36 2010 +0100 ACPI / PM: Check device state before refcounting power resources Commit 3e384ee6c687cb397581ee8f9440fc8220cfac80 (ACPI / PM: Fix reference counting of power resources) introduced a regression by causing fan power resources to be turned on and reference counted unnecessarily during resume, so on some boxes fans are always on after resume. Fix the problem by checking if the current device state is different from the new state before reference counting and turning on power resources in acpi_power_transition(). Addresses https://bugzilla.kernel.org/show_bug.cgi?id=22932 . Signed-off-by: Rafael J. Wysocki Reported-and-tested-by: Maciej Rutecki Signed-off-by: Len Brown commit d7470b6afca85ed4388fff57fc9d89f5a3be02ff Author: Stephane Eranian Date: Wed Dec 1 18:49:05 2010 +0200 perf stat: Add csv-style output This patch adds an option (-x/--field-separator) to print counts using a CSV-style output. The user can pass a custom separator. This makes it very easy to import counts directly into your favorite spreadsheet without having to write scripts. Example: $ perf stat --field-separator=, -a -- sleep 1 4009.961740,task-clock-msecs 13,context-switches 2,CPU-migrations 189,page-faults 9596385684,cycles 3493659441,instructions 872897069,branches 41562,branch-misses 22424,cache-references 1289,cache-misses Works also in non-aggregated mode: $ perf stat -x , -a -A -- sleep 1 CPU0,1002.526168,task-clock-msecs CPU1,1002.528365,task-clock-msecs CPU2,1002.523360,task-clock-msecs CPU3,1002.519878,task-clock-msecs CPU0,1,context-switches CPU1,5,context-switches CPU2,5,context-switches CPU3,6,context-switches CPU0,0,CPU-migrations CPU1,1,CPU-migrations CPU2,0,CPU-migrations CPU3,1,CPU-migrations CPU0,2,page-faults CPU1,6,page-faults CPU2,9,page-faults CPU3,174,page-faults CPU0,2399439771,cycles CPU1,2380369063,cycles CPU2,2399142710,cycles CPU3,2373161192,cycles CPU0,872900618,instructions CPU1,873030960,instructions CPU2,872714525,instructions CPU3,874460580,instructions CPU0,221556839,branches CPU1,218134342,branches CPU2,218161730,branches CPU3,218284093,branches CPU0,18556,branch-misses CPU1,1449,branch-misses CPU2,3447,branch-misses CPU3,12714,branch-misses CPU0,8330,cache-references CPU1,313844,cache-references CPU2,47993728,cache-references CPU3,826481,cache-references CPU0,272,cache-misses CPU1,5360,cache-misses CPU2,1342193,cache-misses CPU3,13992,cache-misses This second version adds the ability to name a separator and uses field-separator as the long option to be consistent with perf report. Commiter note: Since we enabled --big-num by default in 201e0b0 and -x can't be used with it, we need to notice if the user explicitely enabled or disabled -B, add code to disable big_num if the user didn't explicitely set --big_num when -x is used. Cc: David S. Miller Cc: Frederik Weisbecker Cc: Ingo Molnar Cc: paulus@samba.org Cc: Peter Zijlstra Cc: Robert Richter LKML-Reference: <4cf68aa7.0fedd80a.5294.1203@mx.google.com> Signed-off-by: Stephane Eranian Signed-off-by: Arnaldo Carvalho de Melo commit 6dcdd1b3694a4fa2b85167a9c860c7613a7553c7 Author: David McCullough Date: Mon Nov 29 19:32:34 2010 +0000 net/ipv6/sit.c: return unhandled skb to tunnel4_rcv I found a problem using an IPv6 over IPv4 tunnel. When CONFIG_IPV6_SIT was enabled, the packets would be rejected as net/ipv6/sit.c was catching all IPPROTO_IPV6 packets and returning an ICMP port unreachable error. I think this patch fixes the problem cleanly. I believe the code in net/ipv4/tunnel4.c:tunnel4_rcv takes care of it properly if none of the handlers claim the skb. Signed-off-by: David McCullough Acked-by: Eric Dumazet Signed-off-by: David S. Miller commit 67d5288049f46f816181f63eaa8f1371877ad8ea Author: Jon Mason Date: Mon Nov 29 18:02:47 2010 +0000 vxge: update driver version Update vxge driver version Signed-off-by: Jon Mason Signed-off-by: David S. Miller commit ead5d238146981f922e3848fac83825d87c518f0 Author: Jon Mason Date: Mon Nov 29 18:02:46 2010 +0000 vxge: use strcpy for strings Use strncpy instead of memcpy when working on strings Signed-off-by: Jon Mason Signed-off-by: David S. Miller commit 1bacdbb341e8c92c58651f06727318c3d0c1c30e Author: Jon Mason Date: Mon Nov 29 18:02:45 2010 +0000 vxge: remove unnecessary printks Remove printks for ring blocks, fifo blocks, and rx doorbell mode as they clutter the dmesg output during modprobe and provide no useful information. Signed-off-by: Jon Mason Signed-off-by: David S. Miller commit 8afe7c8acd33bc52c56546e73e46e9d546269e2c Author: stephen hemminger Date: Mon Nov 29 09:47:49 2010 +0000 ipip: add module alias for tunl0 tunnel device If ipip is built as a module the 'ip tunnel add' command would fail because the ipip module was not being autoloaded. Adding an alias for the tunl0 device name cause dev_load() to autoload it when needed. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller commit 4da6a738ffdb99b88efbe5b4c4fe521ca453640d Author: stephen hemminger Date: Mon Nov 29 09:47:48 2010 +0000 gre: add module alias for gre0 tunnel device If gre is built as a module the 'ip tunnel add' command would fail because the ip_gre module was not being autoloaded. Adding an alias for the gre0 device name cause dev_load() to autoload it when needed. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller commit 407d6fcbfdd011bcc2dd9e6923c5cca00abbfc6f Author: stephen hemminger Date: Mon Nov 29 09:47:47 2010 +0000 gre: minor cleanups Use strcpy() rather the sprintf() for the case where name is getting generated. Fix indentation. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller commit f2cd2d3e9b3ef960612e362f0ad129d735452df2 Author: Eric Dumazet Date: Mon Nov 29 08:14:37 2010 +0000 net sched: use xps information for qdisc NUMA affinity Allocate qdisc memory according to NUMA properties of cpus included in xps map. To be effective, qdisc should be (re)setup after changes of /sys/class/net/eth/queues/tx-/xps_cpus I added a numa_node field in struct netdev_queue, containing NUMA node if all cpus included in xps_cpus share same node, else -1. Signed-off-by: Eric Dumazet Cc: Ben Hutchings Cc: Tom Herbert Signed-off-by: David S. Miller commit 0793f83f0ec2142d06abe53570417c8d95e0310a Author: Dmitry Kravkov Date: Wed Dec 1 12:39:28 2010 -0800 bnx2x: Add Nic partitioning mode (57712 devices) NIC partitioning is another flavor of multi function - having few PCI functions share the same physical port. Unlike the currently supported mode of multi-function which depends on the switch configuration and uses outer-VLAN, the NPAR mode is switch independent and uses the MAC addresses to distribute incoming packets to the different functions. This patch adds the specific HW setting of the NPAR mode and some distinctions between switch dependent (SD) and switch independent (SI) multi-function (MF) modes where the configuration is not the same. Advance driver version to 1.60.00-6 Signed-off-by: Dmitry Kravkov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit 201e0b06efee80ce090579aa165c65c3d0836d95 Author: Arnaldo Carvalho de Melo Date: Wed Dec 1 17:53:27 2010 -0200 perf stat: Use --big-num format by default [acme@mica linux]$ perf stat ls > /dev/null Performance counter stats for 'ls': 1.512532 task-clock-msecs # 0.801 CPUs 2 context-switches # 0.001 M/sec 0 CPU-migrations # 0.000 M/sec 241 page-faults # 0.159 M/sec 2,973,331 cycles # 1965.797 M/sec 1,460,802 instructions # 0.491 IPC 314,642 branches # 208.023 M/sec 18,475 branch-misses # 5.872 % cache-references cache-misses 0.001887676 seconds time elapsed To get the previous behaviour just use --no-big-num: [acme@mica linux]$ perf stat --no-big-num ls > /dev/null Performance counter stats for 'ls': 1.468014 task-clock-msecs # 0.795 CPUs 1 context-switches # 0.001 M/sec 0 CPU-migrations # 0.000 M/sec 241 page-faults # 0.164 M/sec 2900254 cycles # 1975.631 M/sec 1437991 instructions # 0.496 IPC 310905 branches # 211.786 M/sec 17912 branch-misses # 5.761 % cache-references cache-misses 0.001845435 seconds time elapsed [acme@mica linux]$ Suggested-by: Ingo Molnar Cc: FrĂ©dĂ©ric Weisbecker Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Paul Mackerras Cc: Stephane Eranian LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 8c207692fc8fa3ea1a5ff97ad698efb09a81975a Author: Shawn Bohrer Date: Tue Nov 30 19:57:19 2010 -0600 perf stat: Document missing options Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1291168642-11402-12-git-send-email-shawn.bohrer@gmail.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit f68d6bd451782b58c2b563dc86f0a81ba106c30c Author: Shawn Bohrer Date: Tue Nov 30 19:57:20 2010 -0600 perf test: Fix spelling mistake in documentation Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1291168642-11402-13-git-send-email-shawn.bohrer@gmail.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit 646420f1bcf6ddf3e150f92a5f2a8bd7d6057ff8 Author: Shawn Bohrer Date: Tue Nov 30 19:57:22 2010 -0600 perf trace: Document missing options Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1291168642-11402-15-git-send-email-shawn.bohrer@gmail.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit 2e7a988198b11877d844d147ec81c7caea82c314 Author: Shawn Bohrer Date: Tue Nov 30 19:57:21 2010 -0600 perf top: Document missing options Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1291168642-11402-14-git-send-email-shawn.bohrer@gmail.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit 1eacc94a66ce347abbf75f223361b21461331383 Author: Shawn Bohrer Date: Tue Nov 30 19:57:18 2010 -0600 perf sched: Document missing options Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1291168642-11402-11-git-send-email-shawn.bohrer@gmail.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit e04fffc321aeebab4962cfc120952272f2d1df98 Author: Shawn Bohrer Date: Tue Nov 30 19:57:17 2010 -0600 perf report: Document missing options Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1291168642-11402-10-git-send-email-shawn.bohrer@gmail.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit 08dbd7e3fa2398910713b21399cca7c6e4b43011 Author: Shawn Bohrer Date: Tue Nov 30 19:57:16 2010 -0600 perf record: Document missing options Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1291168642-11402-9-git-send-email-shawn.bohrer@gmail.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit 9d5b7f5b2b2c1ceade1fbbaefb2bd9167436329d Author: Shawn Bohrer Date: Tue Nov 30 19:57:15 2010 -0600 perf probe: Fix spelling mistake in documentation Acked-by: Masami Hiramatsu Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1291168642-11402-8-git-send-email-shawn.bohrer@gmail.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit 4aace251519745977f4b5ddf625b630b4807be3a Author: Shawn Bohrer Date: Tue Nov 30 19:57:14 2010 -0600 perf lock: Document missing options Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1291168642-11402-7-git-send-email-shawn.bohrer@gmail.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit 5c0ef0ab077c8bdb224540fea60473439be1bdb4 Author: Shawn Bohrer Date: Tue Nov 30 19:57:13 2010 -0600 perf kvm: Document missing options Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1291168642-11402-6-git-send-email-shawn.bohrer@gmail.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit 5ea4f857850450dc1442144a00547d6623d79d78 Author: Shawn Bohrer Date: Tue Nov 30 19:57:12 2010 -0600 perf diff: Document missing options Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1291168642-11402-5-git-send-email-shawn.bohrer@gmail.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit 342955593af08f185279e074b3d77719d2f23b82 Author: Shawn Bohrer Date: Tue Nov 30 19:57:11 2010 -0600 perf diff: Fix displacement and modules options short flag The --displacement and --modules options to perf diff both use -m as a short flag. Change --displacement to use -M since other perf commands use -m, --modules. Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1291168642-11402-4-git-send-email-shawn.bohrer@gmail.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit b6a535dbf615e168e796eec7318c77d1a3b7047f Author: Shawn Bohrer Date: Tue Nov 30 19:57:10 2010 -0600 perf buildid-list: Document missing options Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1291168642-11402-3-git-send-email-shawn.bohrer@gmail.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit 1968ad911d0769e58a484bb721d275814baf9f2f Author: Shawn Bohrer Date: Tue Nov 30 19:57:09 2010 -0600 perf annotate: Document missing options. Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1291168642-11402-2-git-send-email-shawn.bohrer@gmail.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit d13a2cb63d06fe2e3067c7d40f9a5946abd614c8 Author: David Strand Date: Wed Dec 1 11:43:08 2010 -0800 bonding: check for assigned mac before adopting the slaves mac address Restore the check for an unassigned mac address before adopting the first slaves as it's own. The change in behavior was introduced by: commit c20811a79e671a6a1fe86a8c1afe04aca8a7f085 Author: Jiri Pirko bonding: move dev_addr cpy to bond_enslave Signed-off-by: David Strand Signed-off-by: Jay Vosburgh Signed-off-by: David S. Miller commit 6c08af030212d1a34593397bb01f262ff31c3629 Author: Hauke Mehrtens Date: Sat Nov 27 06:47:43 2010 +0000 b44: fix workarround for wap54g10 The code for the b44_wap54g10_workaround was never included, because the config option was wrong. The nvram_get function was never in mainline kernel, only in external OpenWrt patches. The code should be compiled in when CONFIG_BCM47XX is selected and not when CONFIG_SSB_DRIVER_MIPS is selected, because nvram_getenv is only available on bcm47xx platforms and now in the mainline kernel code. Using an include is better than a second function declaration, to fix this when the function signature changes. Signed-off-by: Hauke Mehrtens Signed-off-by: David S. Miller commit e27535b9c6e071d461be33b75a33047c9bb4c0ce Author: Eli Cohen Date: Wed Nov 17 13:39:43 2010 +0000 IB/mlx4: Fix memory ordering of VLAN insertion control bits We must fully update the control segment before marking it as valid, so that hardware doesn't start executing it before we're ready. Signed-off-by: Eli Cohen [ Move VLAN control bit setting to before wmb(). - Roland ] Signed-off-by: Roland Dreier commit e3d33cb13202cd51378c8d61e92a96183cc0e6fd Author: Chien Tung Date: Tue Nov 2 16:29:54 2010 +0000 MAINTAINERS: Update NetEffect entry Correct web link as www.neteffect.com is no longer valid. Remove Chien Tung as maintainer. I am moving on to other responsibilities at Intel. Thanks for all the fish. Signed-off-by: Chien Tung Signed-off-by: Roland Dreier commit 381601e5bbae78d7c18d946fe874a63957edea13 Author: Anders Franzen Date: Wed Nov 24 05:47:18 2010 +0000 Make the ip6_tunnel reflect the true mtu. The ip6_tunnel always assumes it consumes 40 bytes (ip6 hdr) of the mtu of the underlaying device. So for a normal ethernet bearer, the mtu of the ip6_tunnel is 1460. However, when creating a tunnel the encap limit option is enabled by default, and it consumes 8 bytes more, so the true mtu shall be 1452. I dont really know if this breaks some statement in some RFC, so this is a request for comments. Signed-off-by: Anders Franzen Signed-off-by: David S. Miller commit 04a6b516cdc6efc2500b52a540cf65be8c5aaf9e Author: Vivek Goyal Date: Wed Dec 1 19:34:52 2010 +0100 blk-throttle: Correct the placement of smp_rmb() o I was discussing what are the variable being updated without spin lock and why do we need barriers and Oleg pointed out that location of smp_rmb() should be between read of td->limits_changed and tg->limits_changed. This patch fixes it. o Following is one possible sequence of events. Say cpu0 is executing throtl_update_blkio_group_read_bps() and cpu1 is executing throtl_process_limit_change(). cpu0 cpu1 tg->limits_changed = true; smp_mb__before_atomic_inc(); atomic_inc(&td->limits_changed); if (!atomic_read(&td->limits_changed)) return; if (tg->limits_changed) do_something; If cpu0 has updated tg->limits_changed and td->limits_changed, we want to make sure that if update to td->limits_changed is visible on cpu1, then update to tg->limits_changed should also be visible. Oleg pointed out to ensure that we need to insert an smp_rmb() between td->limits_changed read and tg->limits_changed read. o I had erroneously put smp_rmb() before atomic_read(&td->limits_changed). This patch fixes it. Reported-by: Oleg Nesterov Signed-off-by: Vivek Goyal Signed-off-by: Jens Axboe commit d1ae8ffdfaa16b2ab2e9346e81cf0ab6eaaae347 Author: Vivek Goyal Date: Wed Dec 1 19:34:46 2010 +0100 blk-throttle: Trim/adjust slice_end once a bio has been dispatched o During some testing I did following and noticed throttling stops working. - Put a very low limit on a cgroup, say 1 byte per second. - Start some reads, this will set slice_end to a very high value. - Change the limit to higher value say 1MB/s - Now IO unthrottles and finishes as expected. - Try to do the read again but IO is not limited to 1MB/s as expected. o What is happening. - Initially low value of limit sets slice_end to a very high value. - During updation of limit, slice_end is not being truncated. - Very high value of slice_end leads to keeping the existing slice valid for a very long time and new slice does not start. - tg_may_dispatch() is called in blk_throtle_bio(), and trim_slice() is not called in this path. So slice_start is some old value and practically we are able to do huge amount of IO. o There are many ways it can be fixed. I have fixed it by trying to adjust/cleanup slice_end in trim_slice(). Generally we extend slices if bio is big and can't be dispatched in one slice. After dispatch of bio, readjust the slice_end to make sure we don't end up with huge values. Signed-off-by: Vivek Goyal Signed-off-by: Jens Axboe commit be93112accb42c5586a459683d71975cc70673ca Author: Bala Shanmugam Date: Fri Nov 26 17:35:46 2010 +0530 Bluetooth: Add new PID for Atheros 3011 Atheros 3011 has small sflash firmware and needs to be blacklisted in transport driver to load actual firmware in DFU driver. Signed-off-by: Bala Shanmugam Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit 61faddf661a65a179751dc9fd209cb694d9a28af Author: Stefan Seyfried Date: Tue Nov 30 21:49:08 2010 +0100 Bluetooth: Fix log spamming in btusb due to autosuspend If a device is autosuspended an inability to resubmit URBs is to be expected. Check the error code and only log real errors. (Now that autosuspend is default enabled for btusb, those log messages were happening all the time e.g. with a BT mouse) Signed-off-by: Stefan Seyfried Signed-off-by: Oliver Neukum Acked-by: Marcel Holtmann Signed-off-by: Gustavo F. Padovan commit 8ed9e0e1b602a0bcdc3bef52ec05fdab5b484341 Author: Namhyung Kim Date: Wed Dec 1 09:19:45 2010 -0800 Input: turbografx - fix reference counting The ref-count of parport gained from parport_find_number() was not released in normal path. Signed-off-by: Namhyung Kim Signed-off-by: Dmitry Torokhov commit 0aded708d125a3ff7e5abaea9c2d9c6d7ebbfdcd Author: Trond Myklebust Date: Tue Nov 30 21:56:32 2010 -0500 NFS: Ensure we use the correct cookie in nfs_readdir_xdr_filler We need to use the cookie from the previous array entry, not the actual cookie that we are searching for (except for the case of uncached_readdir). Signed-off-by: Trond Myklebust commit d0777f2c3eda180e3fc549e0efbe741014f17689 Author: Sebastian Andrzej Siewior Date: Mon Nov 22 17:12:16 2010 -0800 spi/pxa2xx: Consider CE4100's FIFO depth For PXA the default threshold is FIFO_DEPTH / 2. Adjust this value for CE4100. Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: Dirk Brandewie commit d6ea3df0d470fb9260db93883f97764cf9f0e562 Author: Sebastian Andrzej Siewior Date: Wed Nov 24 10:17:14 2010 +0100 spi/pxa2xx: Add CE4100 support Sodaville's SPI controller is very much the same as in PXA25x. The difference: - The RX/TX FIFO is only 4 words deep instead of 16 - No DMA support - The SPI controller offers a CS functionality Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: Dirk Brandewie commit 307991055b0ce65d53dc1eb501c456c10eb36360 Merge: 1198c6d45a1ef5f4f7fdfbf33ef7d270493ec575 9b4320b77bab4031649c484da1c595f39c2e43cd Author: Michal Marek Date: Wed Dec 1 13:13:56 2010 +0100 Merge branch 'kconfig_fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-next into kbuild/rc-fixes commit 1198c6d45a1ef5f4f7fdfbf33ef7d270493ec575 Author: Hendrik Brueckner Date: Mon Nov 29 14:38:50 2010 -0800 initramfs: Really fix build break on symbol-prefixed archs Define the __initramfs_size variable using VMLINUX_SYMBOL() to take care of symbol-prefixed architectures, for example, blackfin. Signed-off-by: Hendrik Brueckner Cc: Mike Frysinger Cc: Hendrik Brueckner , Cc: Michal Marek Cc: Sam Ravnborg Signed-off-by: Andrew Morton [mmarek: leave out Makefile change, since d63f6d1 already takes care of the SYMBOL_PREFIX define] Signed-off-by: Michal Marek commit 2062ea522bb58bb2aeee86d051b37136491ccd65 Author: Dimitris Papastamos Date: Wed Dec 1 09:38:55 2010 +0000 ASoC: WM8731: Fix incorrect mask for bypass path disable According to the datasheet the bypass path enable/disable is bit 3 therefore we need 0x8 and not 0x4. Signed-off-by: Dimitris Papastamos Acked-by: Liam Girdwood Signed-off-by: Mark Brown commit 8348c259dd6a6019a8fa01b0a3443409480f7b9d Author: Sebastian Andrzej Siewior Date: Mon Nov 22 17:12:15 2010 -0800 arm/pxa2xx: reorgazine SSP and SPI header files The PXA-SPI driver relies on some files / defines which are arm specific and are within the ARM tree. The CE4100 SoC which is x86 has also the SPI core. This patch moves the ssp and spi files from arm/mach-pxa and plat-pxa to include/linux where the CE4100 can access them. This move got verified by building the following defconfigs: cm_x2xx_defconfig corgi_defconfig em_x270_defconfig ezx_defconfig imote2_defconfig pxa3xx_defconfig spitz_defconfig zeus_defconfig raumfeld_defconfig magician_defconfig Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: Dirk Brandewie commit 4a25605fb71f02b4f80091df91f777225a0309c5 Author: Sebastian Andrzej Siewior Date: Mon Nov 22 17:12:15 2010 -0800 spi/pxa2xx: Use define for SSSR_TFL_MASK instead of plain numbers Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: Dirk Brandewie commit 49cbb1e0b6dcba9170e72fdf40c75fc24cadba4b Author: Sebastian Andrzej Siewior Date: Mon Nov 22 17:12:14 2010 -0800 spi/pxa2xx: add support for shared IRQ handler This is required in case the interrupt line is shared with other devices. Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: Dirk Brandewie commit 50005a8deb38e5e6456ebd94e57adb321d4589de Author: Russell King Date: Fri Nov 12 13:04:16 2010 +0000 ARM: module: ignore unwind for sections not marked SHF_ALLOC If a section is not marked with SHF_ALLOC, it will be discarded by the module code. Therefore, it is not correct to register the unwind tables. Signed-off-by: Russell King commit 8931360eb9c6ec8bd30efef579cef81917a2fcf3 Author: Russell King Date: Fri Nov 12 13:02:46 2010 +0000 ARM: module: clean up handling of ELF unwind tables There's no need to keep pointers to the ELF sections available while the module is loaded - we only need the section pointers while we're finding and registering the unwind tables, which can all be done during the finalize stage of loading. Signed-off-by: Russell King commit 16cdd4336fdca9b50f991b591005b5f6416f82c4 Author: Daniel Drake Date: Tue Nov 30 20:34:52 2010 +0000 lxfb: Maintain video processor palette through suspend/resume The Geode X driver uses both of the LX's palettes, one for gamma correction and one for colormaps. The kernel driver currently only backs up the one used for colormaps during suspend/resume. If you mess with gamma settings and do a suspend/resume, colors go funny. Fix this by backing up the video proc palette during suspend/resume, alongside the display controller one which is already handled. Signed-off-by: Daniel Drake Acked-by: Andres Salomon Signed-off-by: Paul Mundt commit 93c176f39fedaeff854ccb7681d626d65bdffe52 Author: Caglar Akyuz Date: Tue Nov 30 20:04:14 2010 +0000 video: da8xx: Register IRQ as last thing in driver probing. Following commit exposed a bug in driver: "fbdev: da8xx/omap-l1xx: implement double buffering" Bug is, if interrupt handler is called before initialization is finished, raster controller is enabled and following register modifications causes hardware to stay in a broken state. By looking at this one may say that proper locking is missing in this driver, and a more proper fix should be prepared. However, aformentioned commit causes a regression in the driver and some fix to current one should be applied first. Signed-off-by: Caglar Akyuz Signed-off-by: Paul Mundt commit 8d7bfb4a891d606d52e1a99cf7231b4417b935dc Author: Sebastian Ott Date: Wed Dec 1 10:08:02 2010 +0100 [S390] css: fix rsid evaluation for 2nd crw Use correct bit positions of rsid field. Signed-off-by: Sebastian Ott Signed-off-by: Martin Schwidefsky commit 398812159e328478ae49b4bd01f0d71efea96c39 Author: Heiko Carstens Date: Wed Dec 1 10:08:01 2010 +0100 [S390] nohz/s390: fix arch_needs_cpu() return value on offline cpus This fixes the same problem as described in the patch "nohz: fix printk_needs_cpu() return value on offline cpus" for the arch_needs_cpu() primitive: arch_needs_cpu() may return 1 if called on offline cpus. When a cpu gets offlined it schedules the idle process which, before killing its own cpu, will call tick_nohz_stop_sched_tick(). That function in turn will call arch_needs_cpu() in order to check if the local tick can be disabled. On offline cpus this function should naturally return 0 since regardless if the tick gets disabled or not the cpu will be dead short after. That is besides the fact that __cpu_disable() should already have made sure that no interrupts on the offlined cpu will be delivered anyway. In this case it prevents tick_nohz_stop_sched_tick() to call select_nohz_load_balancer(). No idea if that really is a problem. However what made me debug this is that on 2.6.32 the function get_nohz_load_balancer() is used within __mod_timer() to select a cpu on which a timer gets enqueued. If arch_needs_cpu() returns 1 then the nohz_load_balancer cpu doesn't get updated when a cpu gets offlined. It may contain the cpu number of an offline cpu. In turn timers get enqueued on an offline cpu and not very surprisingly they never expire and cause system hangs. This has been observed 2.6.32 kernels. On current kernels __mod_timer() uses get_nohz_timer_target() which doesn't have that problem. However there might be other problems because of the too early exit tick_nohz_stop_sched_tick() in case a cpu goes offline. This specific bug was indrocuded with 3c5d92a0 "nohz: Introduce arch_needs_cpu". In this case a cpu hotplug notifier is used to fix the issue in order to keep the normal/fast path small. All we need to do is to clear the condition that makes arch_needs_cpu() return 1 since it is just a performance improvement which is supposed to keep the local tick running for a short period if a cpu goes idle. Nothing special needs to be done except for clearing the condition. Cc: stable@kernel.org Acked-by: Peter Zijlstra Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky commit 0607f8622953541e95030ab011258d9f1f381357 Author: Felipe Balbi Date: Wed Dec 1 11:03:54 2010 +0200 usb: musb: gadget: prevent a NULL pointer dereference Case we can't allocate struct musb_request, prevent a NULL pointer dereference by returning early. Signed-off-by: Felipe Balbi commit fcf173e4511193b1efeccb0f22a8c641b464353b Author: Hema Kalliguddi Date: Wed Sep 29 11:26:39 2010 -0500 usb: musb: add names for IRQs in structure resource Soon resource data will get automatically populated from a set of autogenerated data from TI's hardware database for the OMAP platform. Such database, might not have resources at the expected order by the current drivers. While we could hack in some exceptions to that tool to generate resources in a specific order, it seems less fragile to use the resource name instead. That way, no matter what order the resources are generated, the driver still work. Modified the OMAP, Blackfin and Davinci architecture files to add the name of the IRQs in the resource structures and musb driver to use the platform_get_irq_byname() api to get the device and dma irq numbers instead of using the index. Cc: Tony Lindgren Acked-by: Kevin Hilman Acked-by: Mike Frysinger Signed-off-by: Hema HK Signed-off-by: Felipe Balbi commit ea65df57c2eea803535a071752efb030c46a11f5 Author: Hema Kalliguddi Date: Wed Sep 22 19:27:40 2010 -0500 usb: musb: remove board_data parameter from musb_platform_init() Removed the board_data parameter being passed to musb_platform_init function as board_data can be extracted from device structure which is already member of musb structure. Acked-by: Kevin Hilman Cc: Tony Lindgren Signed-off-by: Hema HK Signed-off-by: Felipe Balbi commit b3d006c0e745bfd2dab4984ffe3279d5cf4e926a Merge: 4c635a4e04700a371ef7e4d4bb33ed88747e801e 133dc4c39c57eeef2577ca5b4ed24765b7a78ce2 Author: Ingo Molnar Date: Wed Dec 1 09:18:12 2010 +0100 Merge branch 'perf/rename' into perf/core Merge reason: This is an older commit under testing that was not pushed yet - merge it. Also fix up the merge in command-list.txt. Signed-off-by: Ingo Molnar Acked-by: Tom Zanussi commit 3bfa321e662edf90fb8123a02c987c2965fa50bb Author: Yan Li Date: Tue Nov 30 23:51:03 2010 -0800 Input: synaptics - fix handling of 2-button ClickPads Lenovo S10-3t's ClickPad is a 2-button ClickPad that reports BTN_LEFT and BTN_RIGHT as normal touchpad, unlike the 1-button ClickPad used in HP mini 210 that reports solely BTN_MIDDLE. In 0xc0-cap response, the 1-button ClickPad has the 20-bit set while 2-button ClickPad has the 8-bit set. This patch makes the kernel only handle 1-button ClickPad specially, and treat 2-button ClickPad in the same fashion as regular touchpads. This fixes kernel bug #18122 and MeeGo bug #4807. Signed-off-by: Yan Li Signed-off-by: Dmitry Torokhov commit a318e6b1a04c9d8882712508eb9c8a061796c06b Author: David Foley Date: Tue Nov 30 23:45:46 2010 -0800 Input: wacom - add IDs for two new Bamboo PTs Add two new Bamboo Pen & Touch models: Bamboo Comic Medium (CTH661/S1; Product ID = 0xd8) Bamboo P & T Special Edition Small (CTH461/L; Product ID = 0xdA) Tested-by: IRIE Shinsuke Tested-by: Andrea Cadeddu Signed-off-by: David Foley Reviewed-by: Ping Cheng Signed-off-by: Dmitry Torokhov commit 25c9170ed64a6551beefe9315882f754e14486f4 Author: Kenji Kaneshige Date: Tue Nov 30 17:36:08 2010 +0900 genirq: Fix incorrect proc spurious output Since commit a1afb637(switch /proc/irq/*/spurious to seq_file) all /proc/irq/XX/spurious files show the information of irq 0. Current irq_spurious_proc_open() passes on NULL as the 3rd argument, which is used as an IRQ number in irq_spurious_proc_show(), to the single_open(). Because of this, all the /proc/irq/XX/spurious file shows IRQ 0 information regardless of the IRQ number. To fix the problem, irq_spurious_proc_open() must pass on the appropreate data (IRQ number) to single_open(). Signed-off-by: Kenji Kaneshige Reviewed-by: Yong Zhang LKML-Reference: <4CF4B778.90604@jp.fujitsu.com> Cc: stable@kernel.org [2.6.33+] Signed-off-by: Thomas Gleixner commit fa3c9f3de2504bb09f8ad512f89837751a3eb741 Merge: 193006f7e3b1abd42d7a3677b54fa2996461a842 55661fc1f105ed75852e937bf8ea408270eb0cca Author: Paul Mundt Date: Wed Dec 1 16:39:08 2010 +0900 Merge branch 'sh/cachetlb' into sh-fixes-for-linus commit 86b17f76f462db460d6d916e105a4c44cb353e36 Author: Dmitry Torokhov Date: Mon Nov 29 23:33:04 2010 -0800 Input: document struct input_absinfo Add documentation for struct input_absinfo that is used in EVIOCGABS and EVIOCSABS ioctl and specify units of measure used for reporting resolution for an axis. Acked-by: Henrik Rydberg Signed-off-by: Dmitry Torokhov commit 0417596f66dd6621f4fd46563c7c56a95311dbe8 Author: Bastien Nocera Date: Mon Nov 29 23:33:05 2010 -0800 Input: add keycodes for touchpad on/off keys Some laptops will have a "touchpad toggle" soft button, which expects user-space to turn off the touchpad themselves, some other devices will do this in hardware, but send key events telling us that the touchpad has been turned off/on. KEY_TOUCHPAD_ON/KEY_TOUCHPAD_OFF will be used by user-space to show a popup with the status of the touchpad. Signed-off-by: Bastien Nocera Signed-off-by: Dmitry Torokhov commit da0c490115de026618a7fdcd886602da44392a50 Author: Joe Perches Date: Mon Nov 29 23:33:07 2010 -0800 Input: use pr_fmt and pr_ Signed-off-by: Joe Perches Signed-off-by: Dmitry Torokhov commit 4eb3c30b2e034b673df3e8f21b497e39f3911a02 Author: Joe Perches Date: Mon Nov 29 23:33:07 2010 -0800 Input: i8042 - use pr_, pr_fmt, fix dbg and __FILE__ use Standardized message logging prefixes. Removed \n from dbg macro, added \n to each dbg call site. Removed direct use of __FILE__ from dbg, converted to pr_fmt(fmt) Added non-debug printf argument verification of dbg calls Removed "i8042.c" from printks, converted to pr_ Signed-off-by: Joe Perches Signed-off-by: Dmitry Torokhov commit b029ffafe89cf4b97cf39e0225a5205cbbf9e02f Author: Hemanth V Date: Tue Nov 30 23:03:54 2010 -0800 Input: add CMA3000 accelerometer driver Add support for CMA3000 Tri-axis accelerometer, which supports Motion detect, Measurement and Free fall modes. CMA3000 supports both I2C/SPI bus for communication, currently the driver supports I2C based communication. Signed-off-by: Hemanth V Reviewed-by: Jonathan Cameron Reviewed-by: Sergio Aguirre Reviewed-by: Shubhrajyoti Signed-off-by: Dmitry Torokhov commit e3e9887ee9de36d8e2bef972ad74a42abd7a44c4 Author: Paul Mundt Date: Wed Dec 1 15:58:58 2010 +0900 sh: Convert to USB_ARCH_HAS_OHCI/EHCI selects. This switches over to selects for the subtypes to enable OHCI/EHCI support explicitly rather than littering the usb Kconfig with subtype dependencies. Suggested-by: David Daney Signed-off-by: Paul Mundt commit 1a44d72a4058f870c305a23aa5cbc4cacb6758ea Author: Kuninori Morimoto Date: Wed Dec 1 00:31:46 2010 +0000 ARM: mach-shmobile: mackerel: Add FSI-AK4643 support Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit d44deb35c26c74d0f1ebea95a5fc386f72d210f7 Author: Kuninori Morimoto Date: Tue Nov 30 06:52:18 2010 +0000 ARM: mach-shmobile: mackerel: Add LEDs support you can control it by echo 0 > /sys/class/leds/led0/brightness echo 1 > /sys/class/leds/led0/brightness Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit 55661fc1f105ed75852e937bf8ea408270eb0cca Author: Paul Mundt Date: Wed Dec 1 15:39:51 2010 +0900 sh: Assume new page cache pages have dirty dcache lines. This follows the ARM change c01778001a4f5ad9c62d882776235f3f31922fdd ("ARM: 6379/1: Assume new page cache pages have dirty D-cache") for the same rationale: There are places in Linux where writes to newly allocated page cache pages happen without a subsequent call to flush_dcache_page() (several PIO drivers including USB HCD). This patch changes the meaning of PG_arch_1 to be PG_dcache_clean and always flush the D-cache for a newly mapped page in update_mmu_cache(). This addresses issues seen with executing binaries from MMC, in addition to some of the other HCDs that don't explicitly do cache management for their pipe-in buffers. Requested-by: Yoshihiro Shimoda Signed-off-by: Paul Mundt commit 595a251c0740785fd3c0d2156d78578c7479811e Author: David S. Miller Date: Tue Nov 30 20:15:58 2010 -0800 sparc: Write to prom console using indirect buffer. sparc64 systems have a restriction in that passing in buffer addressses above 4GB to prom calls is not reliable. We end up violating this when we do prom console writes, because we use an on-stack buffer to translate '\n' into '\r\n'. So instead, do this translation into an intermediate buffer, which is in the kernel image and thus below 4GB, then pass that to the PROM console write calls. On the 32-bit side we don't have to deal with any of these issues, so the new prom_console_write_buf() uses the existing prom_nbputchar() implementation. However we can now mark those routines static. Since the 64-bit side completely uses new code we can delete the putchar bits as they are now completely unused. Signed-off-by: David S. Miller commit fb82155d5c401a5cf2bc2f555cb807f0bed035bb Merge: 22a5b566c8c442b0b35b3b106795e2f2b3578096 3074adc8b6d9bf28b574a58241b958057a69a7a0 Author: Linus Torvalds Date: Tue Nov 30 20:13:35 2010 -0800 Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 * 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: drm/radeon/kms: add workaround for dce3 ddc line vbios bug drm/radeon/kms: fix interlaced and doublescan handling drm/radeon/kms: fix typos in disabled vbios code Revert "drm/i915/dp: use VBT provided eDP params if available" drm/i915: Clear pfit registers when not used by any outputs drm: record monitor status in output_poll_execute drm: Set connector DPMS status to ON in drm_crtc_helper_set_config drm/i915: fix regression due to ba3d8d749b01548b9 Revert "drm/radeon/kms: fix typo in r600 cs checker" drm/i915/sdvo: Always add a 30ms delay to make SDVO TV detection reliable MAINTAINERS: INTEL DRM DRIVERS list (intel-gfx) is subscribers-only drm/i915/sdvo: Always fallback to querying the shared DDC line drm/i915: Handle pagefaults in execbuffer user relocations drm/i915/sdvo: Only enable HDMI encodings only if the commandset is supported drm/radeon/kms: fix resume regression for some r5xx laptops drm/radeon/kms: fix regression in rs4xx i2c setup drm/i915: Only save/restore cursor regs if !KMS drm/i915: Prevent integer overflow when validating the execbuffer commit 3074adc8b6d9bf28b574a58241b958057a69a7a0 Author: Alex Deucher Date: Tue Nov 30 00:15:10 2010 -0500 drm/radeon/kms: add workaround for dce3 ddc line vbios bug fixes: https://bugzilla.kernel.org/show_bug.cgi?id=23752 Signed-off-by: Alex Deucher Cc:stable@kernel.org Signed-off-by: Dave Airlie commit c49948f4bd39e27dd06a1cdb0c3743ca2a734f5e Author: Alex Deucher Date: Tue Nov 30 15:46:47 2010 -0500 drm/radeon/kms: fix interlaced and doublescan handling Signed-off-by: Alex Deucher Cc: stable@kernel.org Signed-off-by: Dave Airlie commit 0ec80d645661dda50acd417bdfcb33df2e5dd31e Author: Alex Deucher Date: Tue Nov 30 19:11:45 2010 -0500 drm/radeon/kms: fix typos in disabled vbios code 6xx/7xx was hitting the wrong BUS_CNTL reg and bits. Signed-off-by: Alex Deucher Cc: stable@kernel.org Signed-off-by: Dave Airlie commit 150f8815bbd15c1a91f74033c048fadcd5f3c715 Merge: c5027dec02c96964847fa68d512318ee5f6f7a19 3cf2efb1a7c68d55d60dcb2ed9609e1a2fc25952 Author: Dave Airlie Date: Wed Dec 1 12:10:34 2010 +1000 Merge remote branch 'intel/drm-intel-fixes' of /ssd/git/drm-next into drm-fixes * 'intel/drm-intel-fixes' of /ssd/git/drm-next: Revert "drm/i915/dp: use VBT provided eDP params if available" drm/i915: Clear pfit registers when not used by any outputs drm/i915: fix regression due to ba3d8d749b01548b9 commit 22a5b566c8c442b0b35b3b106795e2f2b3578096 Merge: 114279be2120a916e8a04feeb2ac976a10016f2f 3b24f0950bc55ca604a9f0da3ca894f9315cb573 Author: Linus Torvalds Date: Tue Nov 30 17:57:57 2010 -0800 Merge branch 'for_linus' of git://github.com/at91linux/linux-2.6-at91 * 'for_linus' of git://github.com/at91linux/linux-2.6-at91: at91/board-yl-9200: fix typo in video support atmel_spi: fix warning In function 'atmel_spi_dma_map_xfer' at91/picotux200: remove commenting usb device and dataflash support at91: rename rm9200ek and rm9200dk board file name at91rm9200ek: fix warning: 'ek_mmc_data' defined but not used at91rm9200dk: fix warning: 'dk_mmc_data' defined but not used at91: Convert remaining boards to new-style UART initialization at91: merge all at91rm9200 defconfig in one single file commit 114279be2120a916e8a04feeb2ac976a10016f2f Author: Oleg Nesterov Date: Tue Nov 30 20:56:02 2010 +0100 exec: copy-and-paste the fixes into compat_do_execve() paths Note: this patch targets 2.6.37 and tries to be as simple as possible. That is why it adds more copy-and-paste horror into fs/compat.c and uglifies fs/exec.c, this will be cleanuped later. compat_copy_strings() plays with bprm->vma/mm directly and thus has two problems: it lacks the RLIMIT_STACK check and argv/envp memory is not visible to oom killer. Export acct_arg_size() and get_arg_page(), change compat_copy_strings() to use get_arg_page(), change compat_do_execve() to do acct_arg_size(0) as do_execve() does. Add the fatal_signal_pending/cond_resched checks into compat_count() and compat_copy_strings(), this matches the code in fs/exec.c and certainly makes sense. Signed-off-by: Oleg Nesterov Cc: KOSAKI Motohiro Cc: stable@kernel.org Signed-off-by: Linus Torvalds commit 3c77f845722158206a7209c45ccddc264d19319c Author: Oleg Nesterov Date: Tue Nov 30 20:55:34 2010 +0100 exec: make argv/envp memory visible to oom-killer Brad Spengler published a local memory-allocation DoS that evades the OOM-killer (though not the virtual memory RLIMIT): http://www.grsecurity.net/~spender/64bit_dos.c execve()->copy_strings() can allocate a lot of memory, but this is not visible to oom-killer, nobody can see the nascent bprm->mm and take it into account. With this patch get_arg_page() increments current's MM_ANONPAGES counter every time we allocate the new page for argv/envp. When do_execve() succeds or fails, we change this counter back. Technically this is not 100% correct, we can't know if the new page is swapped out and turn MM_ANONPAGES into MM_SWAPENTS, but I don't think this really matters and everything becomes correct once exec changes ->mm or fails. Reported-by: Brad Spengler Reviewed-and-discussed-by: KOSAKI Motohiro Signed-off-by: Oleg Nesterov Cc: stable@kernel.org Signed-off-by: Linus Torvalds commit a5880a9e5bb40fbae55de60051d69a29091053c3 Author: Feng Tang Date: Fri Nov 19 11:01:48 2010 +0800 serial: mfd: adjust the baud rate setting Previous baud rate setting code only has been tested with 3.5M/9600/ 115200/230400/460800 bps, and recently we got a 3M bps device to test, which needs to modify current MUL register setting, and with this patch 2.5M/2M/1.5M/1M/0.5M should also work as they just use a MUL value scale down from 3M's. Also got some reference register setting from silicon guys for different baud rates, which tries to keep the pre-scalar register value to 16. Signed-off-by: Feng Tang Cc: stable Signed-off-by: Greg Kroah-Hartman commit 16c63f8ea49c3fcb9eac7ebc511f5c821d3c55c2 Author: Daniel Walker Date: Tue Nov 30 11:25:39 2010 -0800 drivers: char: hvc: add arm JTAG DCC console support This driver adds a basic console that uses the arm JTAG DCC to transfer data back and forth. It has support for ARMv6 and ARMv7. This console is created under the HVC driver, and should be named /dev/hvcX (or /dev/hvc0 for example). Cc: Tony Lindgren Acked-by: Arnd Bergmann Acked-by: Nicolas Pitre Cc: Mike Frysinger Signed-off-by: Daniel Walker Signed-off-by: Greg Kroah-Hartman commit de6f86ce51341559dc3c9c9f5c562da12fcfcb31 Author: Yegor Yefremov Date: Mon Nov 22 11:06:32 2010 +0100 RS485 documentation: add 16C950 UART description Add a notion about 16C950 UART, that is using DTR signal for RS485 mode. Signed-off-by: Yegor Yefremov Signed-off-by: Greg Kroah-Hartman commit a4fb0b228e284107b9bdf44769bbdc80efd660e1 Author: Vasiliy Kulikov Date: Fri Nov 19 21:41:45 2010 +0300 serial: ifx6x60: fix memory leak If tty_register_driver() failed then tty_driver is still alive. Free it with put_tty_driver(). Signed-off-by: Vasiliy Kulikov Signed-off-by: Greg Kroah-Hartman commit badb9533abbbba70df099765afe4ae432b442430 Author: Vasiliy Kulikov Date: Fri Nov 19 21:42:03 2010 +0300 serial: ifx6x60: free IRQ on error If second request_irq() failed then the first IRQ must be freed in error handling code. Signed-off-by: Vasiliy Kulikov Signed-off-by: Greg Kroah-Hartman commit 3c6a483275f47a2ef7119309ad3d791c10cf30da Author: Tomoya MORINAGA Date: Wed Nov 17 09:55:54 2010 +0900 Serial: EG20T: add PCH_UART driver UART driver of Intel EG20T(Topcliff) PCH Intel EG20T PCH is the platform controller hub that is going to be used in Intel's general embedded platform. All IO peripherals in Intel EG20T PCH are actually devices sitting on AMBA bus. Intel EG20T PCH has UART I/F. Using this I/F, it is able to access system devices connected to UART. Signed-off-by: Tomoya MORINAGA Acked-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 095e24b0ea75b2bdc532b39b04530993442f237f Author: Dirk Brandewie Date: Wed Nov 17 07:35:20 2010 -0800 Serial: ce4100: Add PCI UART support for the ce4100 This patch adds support for the PCI UART on the ce4100. Signed-off-by: Dirk Brandewie Signed-off-by: Greg Kroah-Hartman commit 0ae86689d88bebba16c2db899f845446578d53b3 Merge: e7cddda48c7f892a3fb5c10a6f41a4395f46c0c2 6aa85a5ae610106d89e50c7e1f760c56d12f9bc4 Author: Greg Kroah-Hartman Date: Tue Nov 30 17:04:33 2010 -0800 Merge branch 'omap4-ehci-for-greg' of git://dev.omapzoom.org/pub/scm/anand/linux-omap-usb into usb-next * 'omap4-ehci-for-greg' of git://dev.omapzoom.org/pub/scm/anand/linux-omap-usb: omap4: 4430sdp: enable the ehci port on 4430SDP arm: omap4: select USB_ARCH_HAS_EHCI arm: omap4: usb: add platform init code for EHCI arm: omap4: add USBHOST and related base addresses usb: ehci-omap: Add OMAP4 support omap: usb: ehci: introduce HSIC mode usb: ehci-omap: add helpers for checking port mode usb: ehci-omap: use clkdev aliases for functional clocks omap: clock: add clkdev aliases for EHCI clocks usb: ehci: introduce CONFIG_USB_EHCI_HCD_OMAP usb: ehci-omap: don't hard-code TLL channel count usb: ehci-omap: update clock names to be more generic commit 4c635a4e04700a371ef7e4d4bb33ed88747e801e Author: Corey Ashford Date: Tue Nov 30 14:27:01 2010 -0800 perf tools: fix event parsing of comma-separated tracepoint events There are number of issues that prevent the use of multiple tracepoint events being specified in a -e/--event switch, separated by commas. For example, perf stat -e irq:irq_handler_entry,irq:irq_handler_exit ... fails because the tracepoint event parsing code doesn't recognize the comma separator properly. This patch corrects those issues. Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Julia Lawall Cc: Paul Mackerras Cc: Peter Zijlstra Reported-by: Michael Ellerman LKML-Reference: <1291156021-17711-1-git-send-email-cjashfor@linux.vnet.ibm.com> Signed-off-by: Corey Ashford Signed-off-by: Arnaldo Carvalho de Melo commit 3e8e24f2fc66d32eb0e570e4117dfd05227047e6 Author: Don Zickus Date: Tue Nov 30 17:12:13 2010 -0500 perf packaging: add memcpy to perf MANIFEST There seems to be a new dependency on arch/*/lib/memcpy*.S when compiling the perf tool. Make sure that file is included in the MANIFEST when creating the tarball. Cc: Ingo Molnar LKML-Reference: <1291155133-3499-2-git-send-email-dzickus@redhat.com> Signed-off-by: Don Zickus Signed-off-by: Arnaldo Carvalho de Melo commit e7cddda48c7f892a3fb5c10a6f41a4395f46c0c2 Author: cxie4 Date: Tue Nov 30 13:35:15 2010 +0800 USB: pxa: Add USB client support for Marvell PXA9xx/PXA168 chips This patch add USB client support Marvell PXA9xx/PXA168 chips. The USB controller in PXA9xx/PXA168 is a High-Speed OTG controller. The available endpoints is different between PXA9xx and PXA168. NOTE: It is the first version of Marvell PXA9xx/PXA168 USB controller driver. The support for OTG mode will be added in later patch. PXA9xx and PXA168 has integrated UTMI PHY in the chips. The initialization for the PHY is a little different between PXA9xx and PXA168. Signed-off-by: Chao Xie Signed-off-by: Greg Kroah-Hartman commit b48d7f50e6f16478304170eaf5c2d1a540ba5e31 Author: Paul Mundt Date: Tue Nov 30 17:57:02 2010 +0900 usb: Add in missing EHCI helpers. Several of the EHCI glue drivers either predate or were merged in the same timeframe as API changes at the USB core level, resulting in some missing endpoint_reset and clear_tt_buffer_complete callbacks. This fixes up all of ehci-atmel, mxc, w90x900, and xilinx-of to tie in the new helpers, which brings them in line with everyone else. Reported-by: Alan Stern Signed-off-by: Paul Mundt Signed-off-by: Greg Kroah-Hartman commit 7fc56f0d9908fe140a01387d59954e3d0a2e7744 Author: Luo Andy Date: Tue Nov 23 10:41:21 2010 +0800 usb: gadget: langwell_udc: add usb test mode support This patch adds test mode support for Langwell gadget driver. Signed-off-by: Henry Yuan Signed-off-by: Andy Luo Signed-off-by: Greg Kroah-Hartman commit b23f2f94136884ebeb1b5e2196f4a53086444afa Author: Hao Wu Date: Mon Nov 29 15:17:03 2010 +0800 usb: composite gadget: set vbus_draw current limitation during suspend This patch modifies the composite gadget to set vbus_draw current limitation during suspend state. This current limitation in suspend state shouldn't be more than 2.5mA Signed-off-by: Hao Wu Signed-off-by: Greg Kroah-Hartman commit c3d6450e741da08c3bc2e2ba06d743c27540abac Author: Jarkko Nikula Date: Tue Nov 30 17:58:25 2010 +0200 usb: otg: twl4030-usb: Fix unbalanced regulator disables at module removal Function twl4030_usb_remove can cause unbalanced regulator disables in twl4030_phy_power if the cable is not connected. Regulator enable/disable calls are in balance only if the twl4030_phy_resume was called prior the twl4030_usb_remove, that is, the cable was connected. Fix this by checking the 'asleep' variable in twl4030_usb_remove since that variable is used to check state in other functions. Signed-off-by: Jarkko Nikula Cc: Felipe Balbi Signed-off-by: Greg Kroah-Hartman commit 02303f73373aa1da19dbec510ec5a4e2576f9610 Author: Dan Williams Date: Fri Nov 19 16:04:00 2010 -0600 usb-wwan: implement TIOCGSERIAL and TIOCSSERIAL to avoid blocking close(2) Some devices (ex ZTE 2726) simply don't respond at all when data is sent to some of their USB interfaces. The data gets stuck in the TTYs queue and sits there until close(2), which them blocks because closing_wait defaults to 30 seconds (even though the fd is O_NONBLOCK). This is rarely desired. Implement the standard mechanism to adjust closing_wait and let applications handle it how they want to. Signed-off-by: Dan Williams commit 73f35c60d5c4a98061fc0f94505bf26fd4bb1a1c Author: Jesper Juhl Date: Tue Nov 9 00:10:52 2010 +0100 USB: Remove unnecessary casts of void ptr returning alloc function return values Hi, The [vk][cmz]alloc(_node) family of functions return void pointers which it's completely unnecessary/pointless to cast to other pointer types since that happens implicitly. This patch removes such casts from drivers/usb/ Signed-off-by: Jesper Juhl commit b17ea167c5fb50dcd5dce5b874a467f04eec886d Author: Pete Zaitcev Date: Tue Nov 16 21:51:19 2010 -0700 usbmon: correct length for isochronous Usually the usbmon returns the amount of data specified in urb->transfer_buffer_length for output submissions and urb->actual_length for input callbacks. However, for Isochronous input transfers, this is not enough, since the returned data buffer may contain "holes". One easy way to fix this is to use urb->transfer_buffer_length, but this often transfers a whole lot of unused data, so we find how much was actually used instead. Original patch by MĂ¡rton NĂ©meth. See also kernel bug 22182. Signed-off-by: Pete Zaitcev Signed-off-by: MĂ¡rton NĂ©meth Signed-off-by: Greg Kroah-Hartman commit 33069739d1c2f03734d5b5b003593e9552d412c1 Author: Stepan Moskovchenko Date: Fri Nov 12 19:30:00 2010 -0800 msm: iommu: Miscellaneous code cleanup Remove some unneeded assignments and messages, restructure a failure path in iova_to_phys, and make __flush_iotlb return int in preparation for adding IOMMU clock control. Signed-off-by: Stepan Moskovchenko Signed-off-by: Daniel Walker commit 100832c9b6adb3d63407416931caeba3f3b9a777 Author: Stepan Moskovchenko Date: Mon Nov 15 18:20:08 2010 -0800 msm: iommu: Support cache-coherent memory access Add support for allowing IOMMU memory transactions to be cache coherent, eliminating the need for software cache management in certain situations. This can lead to improvements in performance and power usage, assuming the multimedia core's access pattern exhibits spatial locality and that its working set fits into the cache. Signed-off-by: Stepan Moskovchenko Signed-off-by: Daniel Walker commit 08bd6839783319085ee0db4c888534e626225774 Author: Stepan Moskovchenko Date: Mon Nov 15 18:19:35 2010 -0800 msm: iommu: Definitions for extended memory attributes Add the register field definitions and memory attribute definitions that will be needed to support IOMMU transactions with cache-coherent memory access. Signed-off-by: Stepan Moskovchenko Signed-off-by: Daniel Walker commit 0ab84745ef65043a616b36b26bec58e1cb62a742 Author: Stepan Moskovchenko Date: Fri Nov 12 19:29:57 2010 -0800 msm: iommu: Kconfig dependency for the IOMMU API Make the IOMMU driver select the IOMMU API in the kernel configuration. Signed-off-by: Stepan Moskovchenko Signed-off-by: Daniel Walker commit 00d4b2bb03b9ed27f28336b0a68f2bd7f67caa40 Author: Stepan Moskovchenko Date: Fri Nov 12 19:29:56 2010 -0800 msm: iommu: Check if device is already attached An IOMMU device can only be attached to one IOMMU domain at any given time. Check whether the device is already attached to a domain before allowing it to be attached to another domain. If so, return busy. Signed-off-by: Stepan Moskovchenko Signed-off-by: Daniel Walker commit 2607b0a26094b2d2d174c3e27b2ecc9c49d86f40 Author: Stepan Moskovchenko Date: Mon Nov 15 17:46:10 2010 -0800 msm: iommu: Kconfig item for cacheable page tables Add a Kconfig item to allow the IOMMU page tables to be coherent in the L2 cache. This generally reduces IOTLB miss latencies and has been shown to improve multimedia performance. Signed-off-by: Stepan Moskovchenko Signed-off-by: Daniel Walker commit b7a5100bc29c2cc252bf6f1e247ae14fd733fbb8 Merge: 8244272341f00cab845cabc445dbd3665fc01f87 07a8cdd2bb17a4da68136d963b8bc71959bd31a5 Author: Greg Kroah-Hartman Date: Tue Nov 30 15:52:04 2010 -0800 Merge branch 'for-greg' of git://gitorious.org/usb/usb into work commit 8244272341f00cab845cabc445dbd3665fc01f87 Merge: abf03184a31a3286fc0ab30f838ddee8ba9f9b7b 6dd0a3a7e0793dbeae1b951f091025d8cf896cb4 Author: Greg Kroah-Hartman Date: Tue Nov 30 15:38:41 2010 -0800 Merge branch 'for-usb-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sarah/xhci into work commit 5b1c144475a7f2d0ab34d0b9b8414ab18b02a283 Author: Arnaldo Carvalho de Melo Date: Tue Nov 30 17:48:53 2010 -0200 perf debug: Simplify trace_event No need to check that many times if debug_trace is on. Cc: FrĂ©dĂ©ric Weisbecker Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Paul Mackerras Cc: Stephane Eranian LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 12c7a35ee6a1c605e740733f2cbd5b5079f09f0f Author: David S. Miller Date: Tue Nov 30 14:53:05 2010 -0800 sparc: Delete prom_*getchar(). Completely unused. Signed-off-by: David S. Miller commit 52aa8c539dad56728527de664f368915ff44badf Merge: 55a4e78952286d498d89a399d845e7cfaa8ddd56 032a6424aeea7333a8dafc8cc05dd10b09c62680 Author: Tony Lindgren Date: Tue Nov 30 14:46:36 2010 -0800 Merge branch 'ctrl-wip/mux-omap4-v4' of git://gitorious.org/omap-pm/linux into omap-for-linus commit 55a4e78952286d498d89a399d845e7cfaa8ddd56 Merge: 9c7bc451e41abf78b0fd856a9f916f7d39e26297 27b1fec2caa668c162cd1a862c69e087df277fae Author: Tony Lindgren Date: Tue Nov 30 14:45:49 2010 -0800 Merge branch 'pm-hwmod-i2c' of ssh://master.kernel.org/pub/scm/linux/kernel/git/khilman/linux-omap-pm into omap-for-linus commit e62cac1fd035b4cde707285008499dbe71955a86 Author: David S. Miller Date: Tue Nov 30 14:33:29 2010 -0800 sparc: Pass buffer pointer all the way down to prom_{get,put}char(). This gets us closer to being able to eliminate the use of dynamic and stack based buffers, so that we can adhere to the "no buffer addresses above 4GB" rule for PROM calls. Signed-off-by: David S. Miller commit 1d9bc6dc5b6b9cc9299739f0245ce4841f066b92 Author: Eric Paris Date: Mon Nov 29 15:47:09 2010 -0500 SELinux: merge policydb_index_classes and policydb_index_others We duplicate functionality in policydb_index_classes() and policydb_index_others(). This patch merges those functions just to make it clear there is nothing special happening here. Signed-off-by: Eric Paris commit ac76c05becb6beedbb458d0827d3deaa6f479a72 Author: Eric Paris Date: Mon Nov 29 15:47:09 2010 -0500 selinux: convert part of the sym_val_to_name array to use flex_array The sym_val_to_name type array can be quite large as it grows linearly with the number of types. With known policies having over 5k types these allocations are growing large enough that they are likely to fail. Convert those to flex_array so no allocation is larger than PAGE_SIZE Signed-off-by: Eric Paris commit 23bdecb000c806cf4ec52764499a600f7200d7a9 Author: Eric Paris Date: Mon Nov 29 15:47:09 2010 -0500 selinux: convert type_val_to_struct to flex_array In rawhide type_val_to_struct will allocate 26848 bytes, an order 3 allocations. While this hasn't been seen to fail it isn't outside the realm of possibiliy on systems with severe memory fragmentation. Convert to flex_array so no allocation will ever be bigger than PAGE_SIZE. Signed-off-by: Eric Paris commit c41ab6a1b9028de33e74101cb0aae13098a56fdb Author: Eric Paris Date: Mon Nov 29 15:47:09 2010 -0500 flex_array: fix flex_array_put_ptr macro to be valid C Using flex_array_put_ptr() results in a compile error "error: lvalue required as unary ‘&’ operand" fix the casting order to fix this. Signed-off-by: Eric Paris commit c9e86a9b95f198d7df49b25fcd808ee39cba218f Author: Eric Paris Date: Mon Nov 29 15:46:39 2010 -0500 SELinux: do not set automatic i_ino in selinuxfs selinuxfs carefully uses i_ino to figure out what the inode refers to. The VFS used to generically set this value and we would reset it to something useable. After 85fe4025c616 each filesystem sets this value to a default if needed. Since selinuxfs doesn't use the default value and it can only lead to problems (I'd rather have 2 inodes with i_ino == 0 than one pointing to the wrong data) lets just stop setting a default. Signed-off-by: Eric Paris Acked-by: James Morris commit 7ae9f23cbd3ef9daff7f768da4bfd4c56b19300d Author: Eric Paris Date: Tue Nov 23 11:40:09 2010 -0500 selinux: rework security_netlbl_secattr_to_sid security_netlbl_secattr_to_sid is difficult to follow, especially the return codes. Try to make the function obvious. Signed-off-by: Eric Paris commit 4b02b524487622ce1cf472123899520b583f47dc Author: Eric Paris Date: Tue Nov 23 11:40:08 2010 -0500 SELinux: standardize return code handling in selinuxfs.c selinuxfs.c has lots of different standards on how to handle return paths on error. For the most part transition to rc=errno if (failure) goto out; [...] out: cleanup() return rc; Instead of doing cleanup mid function, or having multiple returns or other options. This doesn't do that for every function, but most of the complex functions which have cleanup routines on error. Signed-off-by: Eric Paris commit b77a493b1dc8010245feeac001e5c7ed0988678f Author: Eric Paris Date: Tue Nov 23 11:40:08 2010 -0500 SELinux: standardize return code handling in selinuxfs.c selinuxfs.c has lots of different standards on how to handle return paths on error. For the most part transition to rc=errno if (failure) goto out; [...] out: cleanup() return rc; Instead of doing cleanup mid function, or having multiple returns or other options. This doesn't do that for every function, but most of the complex functions which have cleanup routines on error. Signed-off-by: Eric Paris commit 9398c7f794078dc1768cc061b3da8cdd59f179a5 Author: Eric Paris Date: Tue Nov 23 11:40:08 2010 -0500 SELinux: standardize return code handling in policydb.c policydb.c has lots of different standards on how to handle return paths on error. For the most part transition to rc=errno if (failure) goto out; [...] out: cleanup() return rc; Instead of doing cleanup mid function, or having multiple returns or other options. This doesn't do that for every function, but most of the complex functions which have cleanup routines on error. Signed-off-by: Eric Paris commit 9c7bc451e41abf78b0fd856a9f916f7d39e26297 Merge: 2862945bf5262d516583477ce420a2f122306f43 662b083a87a3489f3f19c6e0651c1b99b0de5df0 1cb125caf2e0fdece14f72efbb3516f5c5fe1de9 Author: Tony Lindgren Date: Tue Nov 30 14:13:15 2010 -0800 Merge branches 'devel-cleanup', 'devel-serial' and 'devel-board' into omap-for-linus commit ad9c2b048b605fbc8d50526e330b88abdd631ab2 Author: Tetsuo Handa Date: Tue Nov 30 11:06:47 2010 +0900 security: Fix comment of security_key_permission Comment for return value of security_key_permission() has been wrong since it was added in 2.6.15. Signed-off-by: Tetsuo Handa Signed-off-by: James Morris commit 662b083a87a3489f3f19c6e0651c1b99b0de5df0 Author: Andrei Emeltchenko Date: Tue Nov 30 14:11:49 2010 -0800 omap: Serial: Define register access modes in LCR Access to some registers depends on register access mode Three different modes are available for OMAP (at least) • Operational mode LCR_REG[7] = 0x0 • Configuration mode A LCR_REG[7] = 0x1 and LCR_REG[7:0]! = 0xBF • Configuration mode B LCR_REG[7] = 0x1 and LCR_REG[7:0] = 0xBF Define access modes and remove redefinitions and magic numbers in serial drivers (and later in bluetooth driver). Signed-off-by: Andrei Emeltchenko Acked-by: Govindraj.R Acked-by: Greg Kroah-Hartman Signed-off-by: Tony Lindgren commit 498cb95175c29ed96bf32f30df2d11ec1c7f3879 Author: Andrei Emeltchenko Date: Tue Nov 30 14:11:49 2010 -0800 OMAP: Serial: Define OMAP uart MDR1 reg and remove magic numbers Define MDR1 register serial definitions used in serial and bluetooth drivers. Change magic number to ones defined in serial_reg for omap1/2 serial driver. Remove redefined MDR1 register definitions in omap-serial driver. Signed-off-by: Andrei Emeltchenko Acked-by: G, Manjunath Kondaiah Acked-by: Govindraj.R Acked-by: Greg Kroah-Hartman Signed-off-by: Tony Lindgren commit 5c891f3840a7a330c96d7203d4bb5be6fa033724 Author: Thomas Gleixner Date: Tue Nov 30 17:49:55 2010 +0000 perf session: Allocate chunks of sample objects The ordered sample code allocates singular reference objects struct sample_queue which have 48byte size on 64bit and 20 bytes on 32bit. That's silly. Allocate ~64k sized chunks and hand them out. Performance gain: ~ 15% Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Frederic Weisbecker LKML-Reference: <20101130163820.398713983@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit f6f41eb9ccc0e6fad0ccba4c5e0a97de935db734 Author: Stepan Moskovchenko Date: Fri Nov 12 19:29:54 2010 -0800 msm: iommu: Don't flush page tables if no devices attached Don't flush the page tables on an IOMMU domain if there are no IOMMU devices attached to the domain. The act of attaching to the domain will cause an implicit flush of those areas if the page tables are configured to not be L2 cacheable. Signed-off-by: Stepan Moskovchenko Signed-off-by: Daniel Walker commit 020bb75a6deeca5ebeae531dc7378c157affc8fd Author: Thomas Gleixner Date: Tue Nov 30 17:49:53 2010 +0000 perf session: Cache sample objects When the sample queue is flushed we free the sample reference objects. Though we need to malloc new objects when we process further. Stop the malloc/free orgy and cache the already allocated object for resuage. Only allocate when the cache is empty. Performance gain: ~ 10% Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Frederic Weisbecker LKML-Reference: <20101130163820.338488630@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit 516cbc793eb4be5123289d067b54dfcdabeddb25 Author: Stepan Moskovchenko Date: Fri Nov 12 19:29:53 2010 -0800 msm: iommu: Mark functions with the right section names Mark the init and exit functions as __init and __exit where appropriate. Signed-off-by: Stepan Moskovchenko Signed-off-by: Daniel Walker commit e8952e3b32701817705b216b492a9be4fa5cbefc Author: Stepan Moskovchenko Date: Fri Nov 12 19:29:52 2010 -0800 msm: iommu: Support for the 2nd GFX core's IOMMU Add the platform data and resources needed for the second 2D graphics core's IOMMU. Signed-off-by: Stepan Moskovchenko Signed-off-by: Daniel Walker commit ff25ff842ea6afd58ccc2e3f386ee5ac540b6a63 Author: Stepan Moskovchenko Date: Fri Nov 12 19:29:51 2010 -0800 msm: iommu: Revise GFX2D0 IOMMU contexts and M2V mappings Based on recommendations from chip designers, optimize the Machine ID to translation context mappings for the first 2D core's IOMMU. Remove the "gfx2d0_texv3_smmu" context, as it is no longer needed under the new mapping scheme. Signed-off-by: Stepan Moskovchenko Signed-off-by: Daniel Walker commit fe17420784a6d3602e98f798731369fa05936cbe Author: Thomas Gleixner Date: Tue Nov 30 17:49:49 2010 +0000 perf session: Keep file mmaped instead of malloc/memcpy Profiling perf with perf revealed that a large part of the processing time is spent in malloc/memcpy/free in the sample ordering code. That code copies the data from the mmap into malloc'ed memory. That's silly. We can keep the mmap and just store the pointer in the queuing data structure. For 64 bit this is not a problem as we map the whole file anyway. On 32bit we keep 8 maps around and unmap the oldest before mmaping the next chunk of the file. Performance gain: 2.95s -> 1.23s (Faktor 2.4) Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Frederic Weisbecker LKML-Reference: <20101130163820.278787719@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit 55b44629f599a2305265ae9c77f9d9bcfd6ddc17 Author: Thomas Gleixner Date: Tue Nov 30 17:49:46 2010 +0000 perf session: Use sensible mmap size On 64bit we can map the whole file in one go, on 32bit we can at least map 32MB and not map/unmap tiny chunks of the file. Base the progress bar on 1/16 of the data size. Preparatory patch to get rid of the malloc/memcpy/free of trace data. Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Frederic Weisbecker LKML-Reference: <20101130163820.213687773@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit d6513281c5f728d138ba895d600b9788e51508b1 Author: Thomas Gleixner Date: Tue Nov 30 17:49:44 2010 +0000 perf session: Simplify termination checks No need to check twice. Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Frederic Weisbecker LKML-Reference: <20101130163820.152886642@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit 85b99952ccd3d84707661d8ae103c710daca1c8a Author: Thomas Gleixner Date: Tue Nov 30 17:49:41 2010 +0000 perf session: Move ui_progress_update in __perf_session__process_events() The progress bar is changed when the file offset changes. This happens only when the next mmap is done. No need to call ui_progress_update() for every event. Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Frederic Weisbecker LKML-Reference: <20101130163820.094836523@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit 0331ee0cf4187dcdc2b184cf701d8b58bf9ff637 Author: Thomas Gleixner Date: Tue Nov 30 17:49:38 2010 +0000 perf session: Cleanup __perf_session__process_events() Replace the pseudo C++ self argument with session and give the mmap related variables a sensible name. shift is a complete misnomer - it took me several rounds of cursing to figure out that it's not a shift value. Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Frederic Weisbecker LKML-Reference: <20101130163820.029687218@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit a5fcd5f59a2658a579533d6774e871aea7ab5e92 Author: Stepan Moskovchenko Date: Fri Nov 12 19:29:50 2010 -0800 msm: iommu: Revise GFX3D IOMMU contexts and M2V mappings Based on recommendations from chip designers, optimize the Machine ID to translation context mappings for the 3D core's IOMMU. Remove the the "gfx3d_smmu" context device, as it is no longer needed under the new mapping scheme. Signed-off-by: Stepan Moskovchenko [dwalker@codeaurora.org: updated commit text] Signed-off-by: Daniel Walker commit 28990f75e66b36faf6ce56747890009d4e250243 Author: Thomas Gleixner Date: Tue Nov 30 17:49:35 2010 +0000 perf session: Use appropriate pointer type instead of silly typecasting There is no reason to use a struct sample_event pointer in struct sample_queue and type cast it when flushing the queue. Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Frederic Weisbecker LKML-Reference: <20101130163819.969462809@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit 12943325cda3be10819e047cd8b5032a4fef6080 Author: Stepan Moskovchenko Date: Fri Nov 12 19:29:49 2010 -0800 msm: iommu: Use more consistent naming in platform data Rename all the IOMMU platform devices so that the names are more consistent with the rest of the codebase. Signed-off-by: Stepan Moskovchenko Signed-off-by: Daniel Walker commit c4bd2eebee37b885b47ec48961923b671148703f Author: Stepan Moskovchenko Date: Fri Nov 12 19:29:48 2010 -0800 msm: iomap: Addresses and IRQs for 2nd GFX core IOMMU Add register addresses and IRQ numbers for the IOMMU used for the second 2D graphics core. Signed-off-by: Stepan Moskovchenko Signed-off-by: Daniel Walker commit 23513c3b39207c569da2c8afdced62ec43b4a272 Author: Stepan Moskovchenko Date: Fri Nov 12 19:29:47 2010 -0800 msm: iommu: Increase maximum MID size to 5 bits On msm8x60, the MID field on the AXI connection to the IOMMU can be up to five bits wide. Thus, allow the IOMMU context platform data to map up to 32 MIDs. Signed-off-by: Stepan Moskovchenko Signed-off-by: Daniel Walker commit a1225decc43849a73f7e4c333c3fdbbb8a9c1e65 Author: Thomas Gleixner Date: Tue Nov 30 17:49:33 2010 +0000 perf session: Fix list sort algorithm The homebrewn sort algorithm fails to sort in time order. One of the problem spots is that it fails to deal with equal timestamps correctly. My first gut reaction was to replace the fancy list with an rbtree, but the performance is 3 times worse. Rewrite it so it works. Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Frederic Weisbecker LKML-Reference: <20101130163819.908482530@linutronix.de> Signed-off-by: Thomas Gleixner Signed-off-by: Arnaldo Carvalho de Melo commit 70cc2c00d7471f21120befeb7fc107c856e3985b Author: Gregory Bean Date: Wed Nov 24 11:53:52 2010 -0800 msm: gpio: Add irq support to v2 gpiolib. Complete the MSM v2 gpio subsystem by adding irq_chip. Signed-off-by: Gregory Bean Signed-off-by: Daniel Walker commit 0cc2fc1f2f5f1fcf6699b43d73ca3e753ef63582 Author: Gregory Bean Date: Wed Nov 24 11:53:51 2010 -0800 msm: gpio: Add v2 gpio support to MSM SoCs. Beginning with the MSM8x60, the hardware block responsible for gpio support changes. Provide gpiolib support for the new v2 architecture. Cc: Baruch Siach Cc: Pavan Kondeti Signed-off-by: Gregory Bean Signed-off-by: Daniel Walker commit 1cb125caf2e0fdece14f72efbb3516f5c5fe1de9 Author: Srinath Date: Tue Nov 16 14:26:58 2010 -0800 omap: AM3517/05: Add craneboard support Craneboard is a hardware development platform based on the Sitara AM3517 ARM Cortex - A8 microprocessor device. This is a low cost reference design. This patch adds basic board file. Detailed support will follow in subsequent patches. [1] http://www.ti.com/arm [2] http://www.mistralsolutions.com/products/craneboard.php Signed-off-by: Srinath Signed-off-by: Tony Lindgren commit 9632f9890e76aa7a78f719b0b3b572f65e3e968b Author: Janusz Krzysztofik Date: Tue Nov 16 14:26:57 2010 -0800 OMAP1: drop AMS_DELTA_FIQ config option This patches removes a config option that was used to select a FIQ handler to be build for Amstrad Delta, as required by the on-board serio interface driver. Not having any problem reports received since it was introduced in 2.6.35, the FIQ handler can now be built and initialized by default, thus reqiring no extra config option. Signed-off-by: Janusz Krzysztofik Signed-off-by: Tony Lindgren commit c6c4dea4011278f03ab8a3c8329fba9098d2a892 Author: Felipe Balbi Date: Mon Nov 8 06:56:15 2010 +0000 arm: omap: zoom: substitute gpio number with symbolic name It's easier to understand what that number means and also avoids problems if we ever have to change it. Signed-off-by: Felipe Balbi Signed-off-by: Tony Lindgren commit 20826853853aa1e1ba219ea65f1e6ba3bd662495 Author: Felipe Balbi Date: Mon Nov 8 06:56:14 2010 +0000 arm: omap: combine zoom2 and zoom3 board-files They are extremely similar anyway, let's get rid of one file. While at that, also remove the empty zoom_config variable. Signed-off-by: Felipe Balbi Signed-off-by: Tony Lindgren commit 235228ba21e34ba732b413c12259bac386f83283 Author: Enric Balletbo i Serra Date: Sat Oct 23 16:49:00 2010 +0000 omap3: IGEP v2: Improve igep2_flash_init() function The changes are: - Use 'for' loop instead 'while' loop. - No need to initialize ret to 0, we're assigning it right after. - No need to check for onenandcs < GPMC_CS_NUM here, it will always be true. Signed-off-by: Enric Balletbo i Serra Signed-off-by: Tony Lindgren commit ae3e033362430f2684bb3519456c88d14e182f01 Author: Enric Balletbo i Serra Date: Sat Oct 23 16:48:59 2010 +0000 omap3: IGEP v2: Remove igep2_config array omap_board_config_size is implicitly initialized to 0 in plat-omap/common.c, get_config() won't dereference omap_board_config, so we can remove the empty igep2_config array. Signed-off-by: Enric Balletbo i Serra Signed-off-by: Tony Lindgren commit c320c7b7d380e630f595de1236d9d085b035d5b4 Author: Arnaldo Carvalho de Melo Date: Wed Oct 20 12:50:11 2010 -0200 perf events: Precalculate the header space for PERF_SAMPLE_ fields PERF_SAMPLE_{CALLCHAIN,RAW} have variable lenghts per sample, but the others can be precalculated, reducing a bit the per sample cost. Acked-by: Peter Zijlstra Cc: FrĂ©dĂ©ric Weisbecker Cc: Ian Munsie Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Paul Mackerras Cc: Stephane Eranian LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 6aa85a5ae610106d89e50c7e1f760c56d12f9bc4 Author: Keshava Munegowda Date: Sun Nov 21 23:23:42 2010 +0530 omap4: 4430sdp: enable the ehci port on 4430SDP The OMAP4 SDP has an SMSC3320 PHY hooked up to EHCI on Port1. The PHY power is controlled by GPIO 157. Turn on the PHY power, and register the controller at init. Signed-off-by: Keshava Munegowda Signed-off-by: Anand Gadiyar Acked-by: Tony Lindgren commit 56976b6ac4047ec456e2ba7e516ed2e9d96c3acf Author: Anand Gadiyar Date: Sun Nov 21 23:23:42 2010 +0530 arm: omap4: select USB_ARCH_HAS_EHCI The OMAP4 has an on-chip EHCI controller. Select USB_ARCH_HAS_EHCI to allow the EHCI driver to be built on OMAP4. Signed-off-by: Anand Gadiyar Acked-by: Tony Lindgren commit becf0737cf25bd0084ed85ccb1ab6c902e600a3c Author: Anand Gadiyar Date: Sun Nov 21 23:23:41 2010 +0530 arm: omap4: usb: add platform init code for EHCI - Add platform init code for EHCI on OMAP4 - Add pad configuration for PHY and TLL modes Signed-off-by: Anand Gadiyar Acked-by: Tony Lindgren commit 811406c2e69281b0e498d25a42902817299b6b3d Author: Anand Gadiyar Date: Sun Nov 21 23:23:41 2010 +0530 arm: omap4: add USBHOST and related base addresses Add base addresses for USBHOST, USBTLL, EHCI and OHCI to the header file. This will disappear when the drivers are converted to use the hwmod database, however this patch is needed until then. Signed-off-by: Anand Gadiyar Acked-by: Tony Lindgren commit 4792a15bf0f388838c3e16636f961c99bc2f3572 Author: Anand Gadiyar Date: Sun Nov 21 23:23:42 2010 +0530 usb: ehci-omap: Add OMAP4 support Update the ehci-omap glue layer to support the controller in the OMAP4. Major differences from OMAP3 is that the OMAP4 has per-port clocking, and supports ULPI output clocking mode. The old input clocking mode is not supported. Also, there are only 2 externally available ports as against 3 in the OMAP3. The third port is internally tied off and should not be used. Signed-off-by: Keshava Munegowda Signed-off-by: Anand Gadiyar commit 1ed85659a29287bda958a9429461f4a1b0a033be Author: Anand Gadiyar Date: Sun Nov 21 23:23:41 2010 +0530 omap: usb: ehci: introduce HSIC mode The EHCI controller in OMAP4 supports a new interface mode - HSIC. Add this to the list of modes supported on OMAP3. Signed-off-by: Anand Gadiyar Acked-by: Tony Lindgren commit a42ccdc14de388a35ad0e8057543369351395eb9 Author: Anand Gadiyar Date: Sun Nov 21 23:23:41 2010 +0530 usb: ehci-omap: add helpers for checking port mode Introduce helper functions to test port mode. These checks are performed in several places in the driver, and these helpers improve readability. Signed-off-by: Anand Gadiyar commit c5dff5545c97ab33bdb2a529a2375966ceb0700c Author: Anand Gadiyar Date: Sun Nov 21 23:23:41 2010 +0530 usb: ehci-omap: use clkdev aliases for functional clocks Use the recently updated aliases to get functional clocks needed by the driver. This allows the driver to acquire OMAP4-specific clocks without having to use different clock names for OMAP3 and OMAP4. Signed-off-by: Anand Gadiyar commit 5467e16d891090d54d036044e66f94b89b1c3683 Author: Anand Gadiyar Date: Sun Nov 21 23:23:41 2010 +0530 omap: clock: add clkdev aliases for EHCI clocks Add clkdev aliases for the USBHOST and USBTLL clocks on OMAP3 and OMAP4, so that the driver can refer to the clocks using a common alias. This will disappear when the driver is converted to use the hwmod database, but until then this patch is needed. Signed-off-by: Anand Gadiyar Acked-by: Paul Walmsley Acked-by: Tony Lindgren commit 7f124f4b353672bc150af959910cfc2a9778260a Author: Keshava Munegowda Date: Sun Nov 21 23:23:41 2010 +0530 usb: ehci: introduce CONFIG_USB_EHCI_HCD_OMAP Introduce the CONFIG_USB_EHCI_HCD_OMAP option to select EHCI support on OMAP3 and later chips. This scales better than having a long line of dependencies for each new OMAP with EHCI support. Signed-off-by: Keshava Munegowda Signed-off-by: Anand Gadiyar commit c072604115ab50d023eb5c33d4f3229400e441f4 Author: Keshava Munegowda Date: Sun Nov 21 23:23:40 2010 +0530 usb: ehci-omap: don't hard-code TLL channel count Make the TLL channel count a parameter instead of a hardcoded value. This allows us to be flexible with future OMAP revisions which could have a different number of channels. Signed-off-by: Keshava Munegowda Signed-off-by: Anand Gadiyar commit 6dba39e278b81665a838f37a75fe37b89f3ce610 Author: Keshava Munegowda Date: Sun Nov 21 23:23:40 2010 +0530 usb: ehci-omap: update clock names to be more generic Rename usbhost2_120m_fck to usbhost_hs_fck and usbhost1_48m_fck to usbhost_fs_fck, to better reflect the clocks' functionalities. In OMAP4, the frequencies for the corresponding clocks are not necessarily the same as with OMAP3, however the functionalities are. Signed-off-by: Keshava Munegowda Signed-off-by: Anand Gadiyar commit ba03864872691c0bb580a7fb47388da337ef4aa2 Author: Jeff Layton Date: Tue Nov 30 15:14:48 2010 -0500 cifs: fix parsing of hostname in dfs referrals The DFS referral parsing code does a memchr() call to find the '\\' delimiter that separates the hostname in the referral UNC from the sharename. It then uses that value to set the length of the hostname via pointer subtraction. Instead of subtracting the start of the hostname however, it subtracts the start of the UNC, which causes the code to pass in a hostname length that is 2 bytes too long. Regression introduced in commit 1a4240f4. Reported-and-Tested-by: Robbert Kouprie Signed-off-by: Jeff Layton Cc: Wang Lei Cc: David Howells Cc: stable@kernel.org Signed-off-by: Steve French commit 3f419d2d487821093ee46e898b5f8747f9edc9cd Author: David S. Miller Date: Mon Nov 29 13:37:14 2010 -0800 inet: Turn ->remember_stamp into ->get_peer in connection AF ops. Then we can make a completely generic tcp_remember_stamp() that uses ->get_peer() as a helper, minimizing the AF specific code and minimizing the eventual code duplication when we implement the ipv6 side of TW recycling. Signed-off-by: David S. Miller commit b3419363808f2481b24a817f491878e1795db4c7 Author: David S. Miller Date: Tue Nov 30 12:27:11 2010 -0800 ipv6: Add infrastructure to bind inet_peer objects to routes. They are only allowed on cached ipv6 routes. Signed-off-by: David S. Miller commit 672f007d65f50468a4a1e55825fe58e5b035324d Author: David S. Miller Date: Tue Nov 30 12:20:00 2010 -0800 inetpeer: Add inet_getpeer_v6() Now that all of the infrastructure is in place, we can add the ipv6 shorthand for peer creation. Signed-off-by: David S. Miller commit 021e9299113363cc1b713f86b2cba30b8e6cb5dd Author: David S. Miller Date: Tue Nov 30 12:12:23 2010 -0800 inetpeer: Add v6 peers tree, abstract root properly. Add the ipv6 peer tree instance, and adapt remaining direct references to 'v4_peers' as needed. Signed-off-by: David S. Miller commit 026630450244b8f8d1baf54548be0800aa1823ed Author: David S. Miller Date: Tue Nov 30 12:08:53 2010 -0800 inetpeer: Abstract address comparisons. Now v4 and v6 addresses will both work properly. Signed-off-by: David S. Miller commit b534ecf1cd26f094497da6ae28a6ab64cdbe1617 Author: David S. Miller Date: Tue Nov 30 11:54:19 2010 -0800 inetpeer: Make inet_getpeer() take an inet_peer_adress_t pointer. And make an inet_getpeer_v4() helper, update callers. Signed-off-by: David S. Miller commit 582a72da9a41be9227dc931d728ae2906880a589 Author: David S. Miller Date: Tue Nov 30 11:53:55 2010 -0800 inetpeer: Introduce inet_peer_address_t. Currently only the v4 aspect is used, but this will change. Signed-off-by: David S. Miller commit 98158f5a853cafd33b254ae0eacc0dd69f90b93b Author: David S. Miller Date: Tue Nov 30 11:41:59 2010 -0800 inetpeer: Abstract out the tree root accesses. Instead of directly accessing "peer", change to code to operate using a "struct inet_peer_base *" pointer. This will facilitate the addition of a seperate tree for ipv6 peer entries. Signed-off-by: David S. Miller commit 61790c5f3c5f158821821a00797d94504531839f Author: Stanislaw Gruszka Date: Tue Nov 30 15:33:40 2010 +0100 iwlagn: fix microcode error on 4965 Commit dbbf1755b09eef8ff6dd21c8dafe1606f051ce12 "iwlwifi: use antenna information in EEPROM" caused 4965 device breakage with "Microcode SW error detected. Restarting 0x82000000." message. This patch reverts 4965 part of that commit. Signed-off-by: Stanislaw Gruszka Acked-by: Johannes Berg Acked-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 08ca944eb240b2299e743c76b43fbc7c2dd251de Author: Helmut Schaa Date: Tue Nov 30 12:19:34 2010 +0100 mac80211: Minor optimization in ieee80211_rx_h_data Remove a superfluous ieee80211_is_data check as that was checked a few lines before already and we wont't get here for non-data frames at all. Second, the frame was already converted to 802.3 header format and reading the fc and addr1 fields was only possible because the 802.3 header is short enough and didn't overwrite the relevant parts of the 802.11 header. Make the code more obvious by checking the ethernet header's h_dest field. Furthermore reorder the conditions to reduce the number of checks when dynamic powersave is not needed (AP mode for example). Signed-off-by: Helmut Schaa Reviewed-by: Johannes Berg Signed-off-by: John W. Linville commit 20ed3166c84d145589a89d8cde12aa32cf2d17f4 Author: Johannes Stezenbach Date: Tue Nov 30 16:49:23 2010 +0100 mac80211/rt2x00: add ieee80211_tx_status_ni() All rt2x00 drivers except rt2800pci call ieee80211_tx_status() from a workqueue, which causes "NOHZ: local_softirq_pending 08" messages. To fix it, add ieee80211_tx_status_ni() similar to ieee80211_rx_ni() which can be called from process context, and call it from rt2x00lib_txdone(). For the rt2800pci special case a driver flag is introduced. Signed-off-by: Johannes Stezenbach Signed-off-by: John W. Linville commit 4352fab5c2a1a602447d711c84d149bf2f0bc7ba Author: Nick Kossifidis Date: Tue Nov 23 21:53:28 2010 +0200 ath5k: Set turbo bit on rf bank 2 * A diff between rfbuffer settings of turbo and non-turbo modes indicates there is a bit on bank 2 related to turbo operation (it's set on turbo modes). This bit is present on all radios except RF5413 that seems to have a completely different bank 2. Also since 2317 has the same rf-registers locations with 2425 and since the bit exists on 2317 I assume it also exists on 2425/2417). So in case we use turbo mode (40MHz) enable it on bank modification. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit 8c2b418a07b4dc77d7efadb890ba9ad1a4161c3f Author: Nick Kossifidis Date: Tue Nov 23 21:51:38 2010 +0200 ath5k: Clean up turbo mode initvals/rfregs * Clean up what's left of turbo mode, since we handle all register modifications (rfbuffer comes next) on code there is no need to have duplicated arrays. * Rename change_channel to skip_pcu on initvals.c as we did on reset.c Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit acb091d67c5c9649cf5d25055ef6fd64239a6762 Author: Nick Kossifidis Date: Tue Nov 23 21:49:53 2010 +0200 ath5k: Cleanup turbo channel flags * Clean up CHANNEL_T(URBO), use AR5K_BWMODE_40MHZ instead Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit 73a06a683455f472cc09ad249064c66a41e29e39 Author: Nick Kossifidis Date: Tue Nov 23 21:48:32 2010 +0200 ath5k: Use correct clock when setting ofdm timings * Use correct clock value when setting OFDM timings on non-default bwmodes. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit 3bb17654605965226e5b322dbc22ece5ff354ac5 Author: Nick Kossifidis Date: Tue Nov 23 21:45:21 2010 +0200 ath5k: Skip tx power setting on AR5210 for now * Don't return -EINVAL when trying to set tx power on RF5110 because AR5210 reset will fail. We need to add support for RF5110 and AR5210 eeprom in the future but for now just skip it. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit b02f5d1a17c652a74098f2a04db7fb8e6220057e Author: Nick Kossifidis Date: Tue Nov 23 21:44:02 2010 +0200 ath5k: Tweak phy activate to rx start delay based on bwmode * Tweak phy activation -> rx delay for different bwmodes Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit c2b0ebef262e0a9b64f7ea8ec837cfc29605bef7 Author: Nick Kossifidis Date: Tue Nov 23 21:42:22 2010 +0200 ath5k: No need to save/restore staid flags on reset * Since we set antenna flags on phy init and ack bitrate mode on pcu init, there is no need to save/restore sta_id flags on ath5k_hw_reset. Also we don't need to re-set our mac address because it's not affected by resets. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit 8aec7af99b1e4594c4bb9e1c48005e6111f97e8e Author: Nick Kossifidis Date: Tue Nov 23 21:39:28 2010 +0200 ath5k: Support synth-only channel change for AR2413/AR5413 * Add synth-only channel change for AR2413/5413. When we call ath5k_reset with a channel ath5k_hw_reset will first try to set channel on PHY while PHY is running instead of doing a normal full reset. To do this phy_init has to change to implement this functionality. * Clean up change_channel flag, what it really did was skip PCU registers when setting initvals. This is done because on reset PCU registers are not affected (except the registers we set in pcu init and -due to hw problems- TSF). Use a new skip_pcu flag that's not misleading instead. In the future we might use that to also skip PCU reset and save us the TSF etc problems (needs testing because standard practice is to reset everything). * Use fast channel change only when setting channel, and set skip_pcu to false only on init. When we reset the card due to DMA or PHY problems skip pcu but never do a fast channel change. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit 4c57581d939fd0f8f244b9730812069f4dac308a Author: Nick Kossifidis Date: Tue Nov 23 21:37:30 2010 +0200 ath5k: Skip powertable setting when we are on the same channel * Only set power table if we are changing channel/mode there is no need to recalculate and reset the power table all the time. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit f08fbf6cf4a31c8df52b21440c7a7e6fbe474b28 Author: Nick Kossifidis Date: Tue Nov 23 21:33:22 2010 +0200 ath5k: Update PLL programming for turbo/half/quarter * Set correct PLL settings for each bwmode Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit a2677fe4298c61f0e93c063e59815bf21c530c4a Author: Nick Kossifidis Date: Tue Nov 23 21:28:15 2010 +0200 ath5k: Update spur mitigation filter for turbo/half/quarter * Add spur mitigation filter support for half/quarter and turbo. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit b2b4c69f682a2868411899a77842061dd745884f Author: Nick Kossifidis Date: Tue Nov 23 21:26:13 2010 +0200 ath5k: Tweak power detector delays on RF5111/RF5112 * Tweak power detector delays on AR5111/AR5112 when using half/quarter modes. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit 71ba1c30851575b43ba76b0f9c26ff5567e8136c Author: Nick Kossifidis Date: Tue Nov 23 21:24:54 2010 +0200 ath5k: Always set IFS intervals on reset * Make sure we always set IFS timings even if no coverage class is set. If we don't we'll miss the needed changes for different bwmodes. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit 473cae27620c27377e278a6f92aaa483060e3c19 Author: Nick Kossifidis Date: Tue Nov 23 21:21:50 2010 +0200 ath5k: Use turbo flag on DCU * Set AR5K_DCU_GBL_IFS_MISC_TURBO_MODE flag on DCU when operating on 40MHz Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit eeb8832b3181d6ca8593051b68c466e5d2653bb3 Author: Nick Kossifidis Date: Tue Nov 23 21:19:45 2010 +0200 ath5k: Set all IFS intervals, not just slot time * Replace set_slot_time with set_ifs_intervals that also sets the various inter-frame space intervals based on current bwmode. * Clean up AR5210 mess from reset_tx_queue, AR5210 only has one data queue and we set IFS intervals for that queue on set_ifs_intervals so there is nothing left to do for 5210 on reset_tx_queue. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit 61cde037234c4b8e6497a23f5f236c64cbf9d41d Author: Nick Kossifidis Date: Tue Nov 23 21:12:23 2010 +0200 ath5k: Extend rate_duration * Extend ieee80211_generic_frame_duration to support the various bwmodes. * Better document what's going on with ack bitrates and update write_rate_duration to support the standard ack bitrates (when we don't set the high bit). * Get rid of set_ack_bitrate_high and introduce a flag on ath5k_hw for this (we only called the function on init anyway so there is no difference). Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit 3017fcab416d8d1ee48ca16aa9a3062f600dab8e Author: Nick Kossifidis Date: Tue Nov 23 21:09:11 2010 +0200 ath5k: Extend get_default_sifs/slot_time * Extend get_default_sifs/slot_time to include timings for turbo half and quarter rate modes. * AR5210 code for now uses timings already on core clock units instead of usecs so rename them (we 'll clean it up later). Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit 25ddfa195735934256fda55bb4f2d749c19386ff Author: Nick Kossifidis Date: Tue Nov 23 21:07:04 2010 +0200 ath5k: Move tx retries setting outside reset_tx_queue * Move setting of tx retry limits on a separate function (we 'll clean up this AR5210 mess later) Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit b405086ba47678a5b8f6e7cd835a3d27ebb6f744 Author: Nick Kossifidis Date: Tue Nov 23 21:04:43 2010 +0200 ath5k: Increase PHY settling parameters for turo mode * On turbo mode increase PHY settling times, note that we only increase switch settling time on AR5212 as indicated by initvals. * A few cleanups: Move frame control settings for AR5210 from reset_tx_queue to tweak_initvals and remove phy_scal settings from tweak_initvals (we tweak them alread on set_sleep_clock). Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit 325089ab5847f5c1e43f42bb90d32f981867c4c1 Author: Nick Kossifidis Date: Tue Nov 23 21:02:20 2010 +0200 ath5k: Small cleanup on tweak_initvals * Now that we properly set rx/tx latencies for AR5311 remove that old buggy part of code left inside ath5k_hw_tweak_initval_settings that was never executed (you can't have an RF5112 radio on a mac older than AR5212). Also use a magic value for 5311 PHY_SCAL value. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit c297560206adf0cda8ce38ef9b20b0a025754c4d Author: Nick Kossifidis Date: Tue Nov 23 21:00:37 2010 +0200 ath5k: Put core clock initialization on a new function * Handle all usec parameters in one function. It's much cleaner this way. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit fa3d2feeff4723cce8d4722902492d60b7f75fcc Author: Nick Kossifidis Date: Tue Nov 23 20:58:34 2010 +0200 ath5k: Add new field on ath5k_hw to track bandwidth modes * Prepare for half/quarter/turbo support, introduce a new ah_bwmode parameter and get rid of ah_turbo. Bwmode stands for "bandwidth mode" and can have 4 values, default (20MHz), turbo (40MHz), half rate (10MHz), and quarter rate (5MHz). Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit 14fae2d4b61b890cea58d63091406b86ec9bafcd Author: Nick Kossifidis Date: Tue Nov 23 20:55:17 2010 +0200 ath5k: Use new function to stop beacon queue * Since we only use ath5k_hw_stop_tx_dma to stop the beacon queue, introduce a new function ath5k_hw_stop_beacon_queue so that we can use that instead and have better control. In the future we can add more beacon queue specific stuff there (maybe tweak beacon timers or something), for now just call ath5k_hw_stop_tx_dma. * Also since we don't call ath5k_hw_stop_rx/tx_dma from outside dma.c, make them static. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit e8325ed87457e07b9ceeb1e7a31df787dd7ee106 Author: Nick Kossifidis Date: Tue Nov 23 20:52:24 2010 +0200 ath5k: Check RXE when setting RXDP * Make sure we are not trying to set RXDP while RX is active, for now ignore the return value. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit f7317ba2d669c1b54fb31ed7834361a700a79217 Author: Nick Kossifidis Date: Tue Nov 23 20:50:16 2010 +0200 ath5k: Use DCU early termination correctly * DCU early termination should be used to quickly flush QCU according to docs so don't enable it for all queues, enable it only when stopping each queue and disable it when we are done. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit b3a28e68d5c8d788a4e538a119a5d326545add8a Author: Nick Kossifidis Date: Tue Nov 23 20:47:31 2010 +0200 ath5k: Debug DMA timeouts * Increase timeouts on ath5k_hw_stop_tx_dma and also wait for tx queue to stop before checking for pending frames * Add a new debug level to debug dma start/stop Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit 80dac9eecbdb95f61b9b3c7081e02412155982b7 Author: Nick Kossifidis Date: Tue Nov 23 20:45:38 2010 +0200 ath5k: Use new dma_stop function on base.c * Since we stop rx/tx dma and pcu durring reset there is no need to call ath5k_hw_stop_rx/tx_dma before, also there is no need to call them durring stop_locked since we can use ath5k_hw_dma_stop for both. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit e088f23be166635b3938571c00c686094efa7cc4 Author: Nick Kossifidis Date: Tue Nov 23 20:43:18 2010 +0200 ath5k: Stop PCU on reset * Stop PCU receive logic (DRU) durring reset We need to be sure pcu is not active when trying to stop rx dma right now this is done on ath5k_reset (base.c) but later we are going to clean it up. Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit d41174fabdae348c6583cf05aeb329da232c342c Author: Nick Kossifidis Date: Tue Nov 23 20:41:15 2010 +0200 ath5k: Add new function to stop rx/tx DMA * Add a new function to stop rx/tx dma and use in when reset starts Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit 9320b5c4a7260d9593102f378201d17e3f030739 Author: Nick Kossifidis Date: Tue Nov 23 20:36:45 2010 +0200 ath5k: Reset cleanup and generic cleanup * No functional changes * Clean up reset: Introduce init functions for each unit and call them instead of having everything inside ath5k_hw_reset (it's just c/p for now so nothing changes except calling order -I tested it with various cards and it's ok-) * Further cleanups: ofdm_timings belongs to phy.c rate_duration belongs to pcu.c clock functions are general and belong to reset.c (more to follow) * Reorder functions for better organization: We start with helpers and other functions follow in categories, init functions are last Signed-off-by: Nick Kossifidis Signed-off-by: John W. Linville commit ea066d5a91f2610116dcd27054f749e4f07799d8 Author: Mohammed Shafi Shajakhan Date: Tue Nov 23 20:42:27 2010 +0530 ath9k: Add support for Adaptive Power Management This feature is to mitigate the problem of certain 3 stream chips that exceed the PCIe power requirements.An EEPROM flag controls which chips have APM enabled which is basically read from miscellaneous configuration element of the EEPROM header. This workaround will reduce power consumption by using 2 Tx chains for Single and Double stream rates (5 GHz only).All self generated frames (regardless of rate) are sent on 2 chains when this feature is enabled(Chip Limitation). Cc: Paul Shaw Signed-off-by: Mohammed Shafi Shajakhan Tested-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit 916448e77f6bcaaa7f13c3de0c3851783ae2bfd0 Author: Senthil Balasubramanian Date: Tue Nov 30 20:15:39 2010 +0530 ath9k: Fix STA disconnect issue due to received MIC failed bcast frames AR_RxKeyIdxValid will not be set for bcast/mcast frames and so relying this status for MIC failed frames is buggy. Due to this, MIC failure events for broadcast frames are not sent to supplicant resulted in AP disconnecting the STA. Able to pass Wifi Test case 5.2.18 with this fix. Cc: Stable (2.6.36+) Signed-off-by: Senthil Balasubramanian Signed-off-by: John W. Linville commit 8e26d5ad2f9c038609d42eebc676cd1107709eef Author: Senthil Balasubramanian Date: Tue Nov 30 20:15:38 2010 +0530 mac80211: Fix STA disconnect due to MIC failure Th commit titled "mac80211: clean up rx handling wrt. found_sta" removed found_sta variable which caused a MIC failure event to be reported twice for a single failure to supplicant resulted in STA disconnect. This should fix WPA specific countermeasures WiFi test case (5.2.17) issues with mac80211 based drivers which report MIC failure events in rx status. Cc: Stable (2.6.37) Signed-off-by: Senthil Balasubramanian Signed-off-by: John W. Linville commit abf03184a31a3286fc0ab30f838ddee8ba9f9b7b Author: Alan Stern Date: Mon Nov 29 10:17:22 2010 -0500 USB: fix autosuspend bug in usb-serial This patch (as1437) fixes a bug in the usb-serial autosuspend handling. Since the usb-serial core now has autosuspend support, it must set the .supports_autosuspend member in every serial driver it registers. Otherwise the usb_autopm_get_interface() call won't work. This fixes Bugzilla #23012. Signed-off-by: Alan Stern CC: stable@kernel.org Reported-by: Kevin Smith Reported-and-tested-by: Simon Gerber Reported-and-tested-by: Matteo Croce Signed-off-by: Greg Kroah-Hartman commit a85b4e7f4481c5a1ca89fa63c9c871151965075e Author: Brian J. Tarricone Date: Sun Nov 21 21:15:52 2010 -0800 USB: ehci: disable LPM and PPCD for nVidia MCP89 chips Tested on MacBookAir3,1. Without this, we get EPROTO errors when fetching device config descriptors. Signed-off-by: Brian Tarricone Reported-by: Benoit Gschwind Tested-by: Edgar Hucek Cc: stable Signed-off-by: Greg Kroah-Hartman commit 6fdbad8021151a9e93af8159a6232c8f26415c09 Author: Jacques Viviers Date: Wed Nov 24 11:56:38 2010 +0200 USB: serial: ftdi_sio: Vardaan USB RS422/485 converter PID added Add the PID for the Vardaan Enterprises VEUSB422R3 USB to RS422/485 converter. It uses the same chip as the FTDI_8U232AM_PID 0x6001. This should also work with the stable branches for: 2.6.31, 2.6.32, 2.6.33, 2.6.34, 2.6.35, 2.6.36 Signed-off-by: Jacques Viviers Cc: stable Signed-off-by: Greg Kroah-Hartman commit 27f485b5b27926878ffc8f528bdefeb25e6bd3d3 Author: Tomoki Sekiyama Date: Mon Nov 22 19:29:23 2010 +0900 USB: yurex: add .llseek fop to file_operations Default llseek operation behavior was changed by the patch named "vfs: make no_llseek the default" after the yurex driver had been merged, so the llseek to yurex is now ignored. This patch add llseek fop with default_llseek to yurex driver to catch up to the change. Signed-off-by: Tomoki Sekiyama Signed-off-by: Greg Kroah-Hartman commit 28942bb6a9dd4e2ed793675e515cfb8297ed355b Author: Michael Stuermer Date: Thu Nov 18 00:45:43 2010 +0100 USB: ftdi_sio: Add ID for RT Systems USB-29B radio cable Another variant of the RT Systems programming cable for ham radios. Signed-off-by: Michael Stuermer Cc: stable Signed-off-by: Greg Kroah-Hartman commit 2c31333a8fde7e26936a9f5371d02ff12c490993 Author: Christian Lamparter Date: Mon Nov 29 20:53:23 2010 +0100 mac80211: ignore non-bcast mcast deauth/disassoc franes This patch fixes an curious issue due to insufficient rx frame filtering. Saqeb Akhter reported frequent disconnects while streaming videos over samba: > [ 1166.512087] wlan1: deauthenticated from 30:46:9a:10:49:f7 (Reason: 7) > [ 1526.059997] wlan1: deauthenticated from 30:46:9a:10:49:f7 (Reason: 7) > [ 2125.324356] wlan1: deauthenticated from 30:46:9a:10:49:f7 (Reason: 7) > [...] The reason is that the device generates frames with slightly bogus SA/TA addresses. e.g.: [ 2314.402316] Ignore 9f:1f:31:f8:64:ff [ 2314.402321] Ignore 9f:1f:31:f8:64:ff [ 2352.453804] Ignore 0d:1f:31:f8:64:ff [ 2352.453808] Ignore 0d:1f:31:f8:64:ff ^^ the group-address flag is set! (the correct SA/TA would be: 00:1f:31:f8:64:ff) Since the AP does not know from where the frames come, it generates a DEAUTH response for the (invalid) mcast address. This mcast deauth frame then passes through all filters and tricks the stack into thinking that the AP brutally kicked us! This patch fixes the problem by simply ignoring non-broadcast, group-addressed deauth/disassoc frames. Cc: Jouni Malinen Cc: Johannes Berg Reported-by: Saqeb Akhter Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit cf63495d0dbe435b475a44672f5dee150da6471b Author: David Kilroy Date: Wed Nov 24 20:33:02 2010 +0000 orinoco: abort scan on interface down This fixes the problem causing the following trace: ------------[ cut here ]------------ WARNING: at linux-2.6.34/net/wireless/core.c:633 wdev_cleanup_work+0xb7/0xe0 [cfg80211]() Hardware name: Latitude C840 Pid: 707, comm: cfg80211 Not tainted 2.6.34.7-0.5-desktop #1 Call Trace: [] try_stack_unwind+0x173/0x190 [] dump_trace+0x3f/0xe0 [] show_trace_log_lvl+0x4b/0x60 [] show_trace+0x18/0x20 [] dump_stack+0x6d/0x72 [] warn_slowpath_common+0x6e/0xb0 [] warn_slowpath_null+0x13/0x20 [] wdev_cleanup_work+0xb7/0xe0 [cfg80211] [] run_workqueue+0x79/0x170 [] worker_thread+0x83/0xe0 [] kthread+0x74/0x80 [] kernel_thread_helper+0x6/0x10 ---[ end trace 3f0348b3b0c6f4ff ]--- Reported by: Giacomo Comes Signed-off-by: David Kilroy Signed-off-by: John W. Linville commit 37a09f07459753e7c98d4e21f1c61e8756923f81 Author: Trond Myklebust Date: Tue Nov 30 12:42:34 2010 -0500 NFS: Fix a readdirplus bug When comparing filehandles in the helper nfs_same_file(), we should not be using 'strncmp()': filehandles are not null terminated strings. Instead, we should just use the existing helper nfs_compare_fh(). Signed-off-by: Trond Myklebust Signed-off-by: Linus Torvalds commit 364829b1263b44aa60383824e4c1289d83d78ca7 Author: Slava Pestov Date: Wed Nov 24 15:13:16 2010 -0800 tracing: Fix panic when lseek() called on "trace" opened for writing The file_ops struct for the "trace" special file defined llseek as seq_lseek(). However, if the file was opened for writing only, seq_open() was not called, and the seek would dereference a null pointer, file->private_data. This patch introduces a new wrapper for seq_lseek() which checks if the file descriptor is opened for reading first. If not, it does nothing. Cc: Signed-off-by: Slava Pestov LKML-Reference: <1290640396-24179-1-git-send-email-slavapestov@google.com> Signed-off-by: Steven Rostedt commit 60e677373be9c0bf7c9a22937601d5a40e51c042 Author: Franck Bui-Huu Date: Tue Nov 30 12:50:14 2010 +0100 perf header: Don't assume there's no attr info if no sample ids is provided This primarily fixes perf-report, which didn't report the correct type of event if perf-record was called to record one event different from 'cycles': $ perf record -e instructions true [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.007 MB perf.data (~295 samples) ] $ perf report | head -n1 # Events: 7 cycles LPU-Reference: Signed-off-by: Franck Bui-Huu commit d214afbd81405d4da2c5745fe867e6b313fd4178 Author: Ming Lei Date: Thu Nov 25 19:27:25 2010 +0800 perf symbols: Figure out start address of kernel map from kallsyms On ARM, module symbol start address is ahead of kernel symbol start address, so we can't suppose that the start address of kernel map always is zero, otherwise may cause incorrect .start and .end of kernel map (caused by fixup) when there are modules loaded, then map_groups__find may return incorrect map for symbol query. This patch always figures out the start address of kernel map from /proc/kallsyms if the file is available, so fix the issues on ARM for module loaded case. This patch fixes the following issues on ARM when modules are loaded: - vmlinux symbol can't be found by kallsyms maps doing 'perf test' - module symbols are parsed mistakenlly when doing 'perf top'/'perf report' Cc: Ian Munsie Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Tom Zanussi LKML-Reference: <20101125192725.62d31b42@tom-lei> Signed-off-by: Ming Lei Signed-off-by: Arnaldo Carvalho de Melo commit 8a9533123f43f2cdb3eb601c17ff2ad336882eff Author: Arnaldo Carvalho de Melo Date: Mon Nov 29 12:44:15 2010 -0200 perf symbols: Fix kallsyms kernel/module map splitting On ARM, module addresss space is ahead of kernel space, so the module symbols are handled before kernel symbol in dso__split_kallsyms, then was causing one map to be created for each kernel symbol. Reported-by: Ming Lei Tested-by: Ming Lei Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Mike Galbraith Cc: Ming Lei Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Tom Zanussi LKML-Reference: <20101124144540.GB15875@ghostprotocols.net> Signed-off-by: Arnaldo Carvalho de Melo commit 3b24f0950bc55ca604a9f0da3ca894f9315cb573 Author: Jean-Christophe PLAGNIOL-VILLARD Date: Sun Nov 21 11:24:07 2010 +0800 at91/board-yl-9200: fix typo in video support for the epson frambuffer support it's CONFIG_FB_S1D13XXX not CONFIG_FB_S1D135XX Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Nicolas Ferre commit 214b574ab81236e7740243985d63a1d6a61231a2 Author: Jean-Christophe PLAGNIOL-VILLARD Date: Sat Nov 20 14:52:53 2010 +0800 atmel_spi: fix warning In function 'atmel_spi_dma_map_xfer' passing argument 2 of 'dma_map_single' discards qualifiers from pointer target type Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Nicolas Ferre commit 82d5b5c8da769184a9bc2cc2adc90555f4aa90b0 Author: Jean-Christophe PLAGNIOL-VILLARD Date: Sun Nov 21 10:31:19 2010 +0800 at91/picotux200: remove commenting usb device and dataflash support as based on http://www.picotux.com/pt200/picotux200.pdf these board does not have such I/O Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Nicolas Ferre commit 985f554d8f0c2cf5bda5720921cb48654420d6b1 Author: Jean-Christophe PLAGNIOL-VILLARD Date: Fri Nov 19 22:34:38 2010 +0800 at91: rename rm9200ek and rm9200dk board file name to be a few more concistant with the other boards as ek is for evaluation kit and dk for development kit Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Andrew Victor commit 55d83b0a6eb61d159a4a6d269745ee019f9f5f91 Author: Jean-Christophe PLAGNIOL-VILLARD Date: Fri Nov 19 22:31:35 2010 +0800 at91rm9200ek: fix warning: 'ek_mmc_data' defined but not used Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Andrew Victor commit 8e79d2d4e7147eb6dfd075d7cb200c666566a9e0 Author: Jean-Christophe PLAGNIOL-VILLARD Date: Fri Nov 19 22:31:03 2010 +0800 at91rm9200dk: fix warning: 'dk_mmc_data' defined but not used Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Andrew Victor commit 8ae8cd978bc773e916e0b51a76fe3f096fa31069 Author: Jean-Christophe PLAGNIOL-VILLARD Date: Fri Nov 19 22:23:28 2010 +0800 at91: Convert remaining boards to new-style UART initialization Convert the following AT91RM9200-based boards to the new-style UART initialization: - Ajeco 1ARM Single Board Computer - Sperry-Sun KAFA board - picotux 200 Remove the deprecated at91_init_serial Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Andrew Victor commit 47a25380e37f44db7202093ca92e4af569c34f55 Author: Steven Whitehouse Date: Tue Nov 30 15:49:31 2010 +0000 GFS2: Merge glock state fields into a bitfield We can only merge the fields into a bitfield if the locking rules for them are the same. In this case gl_spin covers all of the fields (write side) but a couple of them are used with GLF_LOCK as the read side lock, which should be ok since we know that the field in question won't be changing at the time. The gl_req setting has to be done earlier (in glock.c) in order to place it under gl_spin. The gl_reply setting also has to be brought under gl_spin in order to comply with the new rules. This saves 4*sizeof(unsigned int) per glock. Signed-off-by: Steven Whitehouse Cc: Bob Peterson commit e06dfc492870e1d380f02722cde084b724dc197b Author: Steven Whitehouse Date: Tue Nov 30 15:46:02 2010 +0000 GFS2: Fix uninitialised error value in previous patch Signed-off-by: Steven Whitehouse commit 086d8334cf73b3bb695b82dd864a7a8b00d96b7e Author: Benjamin Marzinski Date: Tue Nov 23 23:52:55 2010 -0600 GFS2: fix recursive locking during rindex truncates When you truncate the rindex file, you need to avoid calling gfs2_rindex_hold, since you already hold it. However, if you haven't already read in the resource groups, you need to do that. Signed-off-by: Benjamin Marzinski Signed-off-by: Steven Whitehouse commit 7572777eef78ebdee1ecb7c258c0ef94d35bad16 Author: Miklos Szeredi Date: Tue Nov 30 16:39:27 2010 +0100 fuse: verify ioctl retries Verify that the total length of the iovec returned in FUSE_IOCTL_RETRY doesn't overflow iov_length(). Signed-off-by: Miklos Szeredi CC: Tejun Heo CC: [2.6.31+] commit d9d318d39dd5cb686660504a3565aac453709ccc Author: Miklos Szeredi Date: Tue Nov 30 16:39:27 2010 +0100 fuse: fix ioctl when server is 32bit If a 32bit CUSE server is run on 64bit this results in EIO being returned to the caller. The reason is that FUSE_IOCTL_RETRY reply was defined to use 'struct iovec', which is different on 32bit and 64bit archs. Work around this by looking at the size of the reply to determine which struct was used. This is only needed if CONFIG_COMPAT is defined. A more permanent fix for the interface will be to use the same struct on both 32bit and 64bit. Reported-by: "ccmail111" Signed-off-by: Miklos Szeredi CC: Tejun Heo CC: [2.6.31+] commit 0489b3f5eba735413ccedd425651cf41d6b1f7c5 Author: Benjamin Marzinski Date: Tue Nov 30 09:38:35 2010 -0600 GFS2: reread rindex when necessary to grow rindex When GFS2 grew the filesystem, it was never rereading the rindex file during the grow. This is necessary for large grows when the filesystem is almost full, and GFS2 needs to use some of the space allocated earlier in the grow to complete it. Now, if GFS2 fails to reserve the necessary space and the rindex file is not uptodate, it rereads it. Also, the only difference between gfs2_ri_update() and gfs2_ri_update_special() was that gfs2_ri_update_special() didn't clear out the existing resource groups, since you knew that it was only called when there were no resource groups. Attempting to clear out the resource groups when there are none takes almost no time, and rarely happens, so I simply removed gfs2_ri_update_special(). Signed-off-by: Benjamin Marzinski Signed-off-by: Steven Whitehouse commit 0b1246e6776c79719ff4a3afd9c38fba99b99d5a Author: Steven Whitehouse Date: Tue Nov 30 15:33:04 2010 +0000 GFS2: Remove duplicate #defines from glock.h There are a number of duplicated #defines in glock.h plus one which is unused. This removes the extra definitions. Signed-off-by: Steven Whitehouse commit 06c63f9396133f312c5a49c2285c2c8015e80934 Author: Randy Dunlap Date: Thu Nov 18 15:02:26 2010 -0800 regulator: fix kernel-doc for set_consumer_device_supply Fix kernel-doc warning for set_consumer_device_supply(): Warning(drivers/regulator/core.c:912): missing initial short description on line: * set_consumer_device_supply: Bind a regulator to a symbolic supply Signed-off-by: Randy Dunlap Cc: Liam Girdwood Cc: Mark Brown Acked-by: Mark Brown Signed-off-by: Liam Girdwood commit f3c18a87f3ddcfd31b16f689d01eb6adcc99de74 Author: Bengt Jonsson Date: Wed Nov 10 11:06:22 2010 +0100 regulator: enable supply regulator only when use count is zero Supply regulators are disabled only when the last reference count is removed on the child regulator (the use count goes from 1 to 0). This patch changes the behaviour of enable so the supply regulator is enabled only when the use count of the child regulator goes from 0 to 1. Signed-off-by: Bengt Jonsson Acked-by: Linus Walleij Acked-by: Mark Brown Signed-off-by: Liam Girdwood commit b9e26bc804e611d879353cd953cb17db1c52d307 Author: Axel Lin Date: Fri Oct 22 16:38:22 2010 +0800 regulator: twl-regulator - fix twlreg_set_mode The Singular Message is 16 bits: DEV_GRP[15:13] MT[12] RES_ID[11:4] RES_STATE[3:0] Current implementation return immedially after sucessfuly write MSB part. To properly set mode, we need to write the complete message ( MSB and LSB ). In twl.h, now we have defines for PM Master module register offsets, use it instead of hard coded 0x15/0x16. Use "message & 0xff" to ensure we send correct value for LSB. Signed-off-by: Axel Lin Acked-by: Mark Brown Tested-by: Lesly Arackal Manuel Signed-off-by: Liam Girdwood commit 3aa713e76e8f562c0d28faf18873c4f1836b17c9 Author: Mattias Wallin Date: Thu Nov 4 11:01:31 2010 +0100 regulator: lock supply in regulator enable This patch add locks around regulator supply enable. Signed-off-by: Mattias Wallin Acked-by: Mark Brown Signed-off-by: Liam Girdwood commit 7727da22e820a96ab394db2fc0ab58f7f7ecb323 Author: Axel Lin Date: Fri Nov 5 15:27:17 2010 +0800 regulator: Return proper error for regulator_register() Signed-off-by: Axel Lin Acked-by: Mark Brown Signed-off-by: Liam Girdwood commit e36c1df8e18183ba2c691fe766a52c94020cdc5e Author: Axel Lin Date: Fri Nov 5 21:51:32 2010 +0800 regulator: Ensure enough delay time for enabling regulator Integer division will truncate the result, this patch ensures we have enough delay time for enabling regulator. Signed-off-by: Axel Lin Acked-by: Mark Brown Signed-off-by: Liam Girdwood commit aa7a74040a989eeb7a9265550a2538863e842a93 Author: Axel Lin Date: Fri Nov 5 15:25:12 2010 +0800 regulator: Remove a redundant device_remove_file call in create_regulator We already have device_remove_file() in error path, no need to call it before goto link_name_err. Signed-off-by: Axel Lin Acked-by: Mark Brown Signed-off-by: Liam Girdwood commit 59c700cf20a6eefb68187df3468ffa0b11d5e9a4 Author: Mark Brown Date: Wed Nov 3 00:08:04 2010 -0400 regulator: Staticise mc13783_powermisc_rmw() It is not used outside this driver so no need to make the symbol global. Signed-off-by: Mark Brown Acked-by: Alberto Panizzo Signed-off-by: Liam Girdwood commit b12a1e29af595d05612153bcb85258193bbf9382 Author: Mattias Wallin Date: Tue Nov 2 14:55:34 2010 +0100 regulator: regulator disable supply fix This patch fixes a disable failure when regulator supply is used. A while loop in regulator disable checks for supply pointer != NULL but the pointer is not always updated, resulting in the while loop running too many times causing a disable failure. Signed-off-by: Mattias Wallin Acked-by: Linus Walleij Acked-by: Mark Brown Signed-off-by: Liam Girdwood commit 5091faa449ee0b7d73bc296a93bca9540fc51d0a Author: Mike Galbraith Date: Tue Nov 30 14:18:03 2010 +0100 sched: Add 'autogroup' scheduling feature: automated per session task groups A recurring complaint from CFS users is that parallel kbuild has a negative impact on desktop interactivity. This patch implements an idea from Linus, to automatically create task groups. Currently, only per session autogroups are implemented, but the patch leaves the way open for enhancement. Implementation: each task's signal struct contains an inherited pointer to a refcounted autogroup struct containing a task group pointer, the default for all tasks pointing to the init_task_group. When a task calls setsid(), a new task group is created, the process is moved into the new task group, and a reference to the preveious task group is dropped. Child processes inherit this task group thereafter, and increase it's refcount. When the last thread of a process exits, the process's reference is dropped, such that when the last process referencing an autogroup exits, the autogroup is destroyed. At runqueue selection time, IFF a task has no cgroup assignment, its current autogroup is used. Autogroup bandwidth is controllable via setting it's nice level through the proc filesystem: cat /proc//autogroup Displays the task's group and the group's nice level. echo > /proc//autogroup Sets the task group's shares to the weight of nice task. Setting nice level is rate limited for !admin users due to the abuse risk of task group locking. The feature is enabled from boot by default if CONFIG_SCHED_AUTOGROUP=y is selected, but can be disabled via the boot option noautogroup, and can also be turned on/off on the fly via: echo [01] > /proc/sys/kernel/sched_autogroup_enabled ... which will automatically move tasks to/from the root task group. Signed-off-by: Mike Galbraith Acked-by: Linus Torvalds Acked-by: Peter Zijlstra Cc: Markus Trippelsdorf Cc: Mathieu Desnoyers Cc: Paul Turner Cc: Oleg Nesterov [ Removed the task_group_path() debug code, and fixed !EVENTFD build failure. ] Signed-off-by: Ingo Molnar LKML-Reference: <1290281700.28711.9.camel@maggy.simson.net> Signed-off-by: Ingo Molnar commit ed7c84d54837b182c5f56f821ef213c8ca817a91 Author: Dave Martin Date: Mon Nov 29 19:43:29 2010 +0100 ARM: 6505/1: kprobes: Don't HAVE_KPROBES when CONFIG_THUMB2_KERNEL is selected Currently, the kprobes implementation for ARM only supports the ARM instruction set, so it only works if CONFIG_THUMB2_KERNEL is not enabled. Until kprobes is updated to work with Thumb-2, turning it on will cause horrible things to happen, so this patch disables it for now. Signed-off-by: Dave Martin Acked-by: Nicolas Pitre Signed-off-by: Russell King commit 618d9c8f9e554b5eaaca3f8e55a28e1a928a8571 Author: Dave Martin Date: Tue Nov 30 13:05:10 2010 +0100 ARM: 6508/1: vexpress: Correct data alignment in headsmp.S for CONFIG_THUMB2_KERNEL Directives such as .long and .word do not magically cause the assembler location counter to become aligned in gas. As a result, using these directives in code sections can result in misaligned data words when building a Thumb-2 kernel (CONFIG_THUMB2_KERNEL). This is a Bad Thing, since the ABI permits the compiler to assume that fundamental types of word size or above are word- aligned when accessing them from C. If the data is not really word-aligned, this can cause impaired performance and stray alignment faults in some circumstances. In general, the following rules should be applied when using data word declaration directives inside code sections: * .quad and .double: .align 3 * .long, .word, .single, .float: .align (or .align 2) * .short: No explicit alignment required, since Thumb-2 instructions are always 2 or 4 bytes in size. immediately after an instruction. Reviewed-by: Will Deacon Signed-off-by: Dave Martin Acked-by: Catalin Marinas Signed-off-by: Russell King commit 725ca4adaea07460accd4622d44bcc7eaa34da09 Author: Dave Martin Date: Tue Nov 30 13:04:36 2010 +0100 ARM: 6507/1: RealView: Correct data alignment in headsmp.S for CONFIG_THUMB2_KERNEL Directives such as .long and .word do not magically cause the assembler location counter to become aligned in gas. As a result, using these directives in code sections can result in misaligned data words when building a Thumb-2 kernel (CONFIG_THUMB2_KERNEL). This is a Bad Thing, since the ABI permits the compiler to assume that fundamental types of word size or above are word- aligned when accessing them from C. If the data is not really word-aligned, this can cause impaired performance and stray alignment faults in some circumstances. In general, the following rules should be applied when using data word declaration directives inside code sections: * .quad and .double: .align 3 * .long, .word, .single, .float: .align (or .align 2) * .short: No explicit alignment required, since Thumb-2 instructions are always 2 or 4 bytes in size. immediately after an instruction. Reviewed-by: Will Deacon Signed-off-by: Dave Martin Acked-by: Catalin Marinas Signed-off-by: Russell King commit a75e5248c51af1eaeed936be6bd3497b93f09685 Author: Dave Martin Date: Mon Nov 29 19:43:28 2010 +0100 ARM: 6504/1: Thumb-2: Fix long-distance conditional branches in head.S for Thumb-2. The 32-bit conditional branches in Thumb-2 have a shorter range (+/-512K) than their ARM counterparts (+/-32MB). The linker does not currently generate trampolines to extend the range of these Thumb-2 conditional branches, resulting in link errors when vmlinux is sufficiently large, e.g.: head.o:(.text+0x464): relocation truncated to fit: R_ARM_THM_JUMP19 This patch forces the longer-range, unconditional branch encoding by use of an explicit IT instruction. The resulting branches are triggered on the same conditions as before. Signed-off-by: Dave Martin Signed-off-by: Russell King commit 26e5ca93dda9425f8ff78ccb2f9b193328087e45 Author: Dave Martin Date: Mon Nov 29 19:43:27 2010 +0100 ARM: 6503/1: Thumb-2: Restore sensible zImage header layout for CONFIG_THUMB2_KERNEL The code which makes up the zImage header intends to leave a 32-byte gap followed by a branch to the real entry point, a magic number, and a word containing the absolute entry point address. This gets messed up with with CONFIG_THUMB2_KERNEL, because the size of the initial padding NOPs changes. Instead, the header can be made fully compatible by restoring it to ARM. In the Thumb-2 case, we can replace the initial NOPs with a sequence which switches to Thumb and jumps to the real entry point. As a consequence, the zImage entry point is now always ARM, so no special magic is needed any more for the uImage rules in the Thumb-2 case. Signed-off-by: Dave Martin Acked-by: Catalin Marinas Acked-by: Nicolas Pitre Signed-off-by: Russell King commit bfa64c4ab1235b732542f11f4e0005e1774f779a Author: Dave Martin Date: Mon Nov 29 19:43:26 2010 +0100 ARM: 6502/1: Thumb-2: Fix CONFIG_THUMB2_KERNEL breakage in compressed/head.S Some instruction operand combinations are used here which are nor permitted in Thumb-2. In particular, most uses of pc as an operand are disallowed in Thumb-2, and deprecated in ARM from ARMv7 onwards. The modified code introduced by this patch should be compatible with all architecture versions >= v3, with or without CONFIG_THUMB2_KERNEL. Reviewed-by: Will Deacon Signed-off-by: Dave Martin Acked-by: Catalin Marinas Acked-by: Nicolas Pitre Signed-off-by: Russell King commit 6323875db20fd8ca8c8fbbd608bc377f2d4c8cf5 Author: Dave Martin Date: Mon Nov 29 19:43:25 2010 +0100 ARM: 6501/1: Thumb-2: Correct data alignment for CONFIG_THUMB2_KERNEL in mm/proc-v7.S Directives such as .long and .word do not magically cause the assembler location counter to become aligned in gas. As a result, using these directives in code sections can result in misaligned data words when building a Thumb-2 kernel (CONFIG_THUMB2_KERNEL). This is a Bad Thing, since the ABI permits the compiler to assume that fundamental types of word size or above are word- aligned when accessing them from C. If the data is not really word-aligned, this can cause impaired performance and stray alignment faults in some circumstances. In general, the following rules should be applied when using data word declaration directives inside code sections: * .quad and .double: .align 3 * .long, .word, .single, .float: .align (or .align 2) * .short: No explicit alignment required, since Thumb-2 instructions are always 2 or 4 bytes in size. immediately after an instruction. In this specific case, we can achieve the desired alignment by forcing a 32-bit branch instruction using the W() macro, since the assembler location counter is already 32-bit aligned in this case. Reviewed-by: Will Deacon Signed-off-by: Dave Martin Acked-by: Catalin Marinas Signed-off-by: Russell King commit 4f79a5dd7c3e316e2230dc0ee665c40a39023a81 Author: Dave Martin Date: Mon Nov 29 19:43:24 2010 +0100 ARM: 6500/1: Thumb-2: Correct data alignment for CONFIG_THUMB2_KERNEL in kernel/head.S Directives such as .long and .word do not magically cause the assembler location counter to become aligned in gas. As a result, using these directives in code sections can result in misaligned data words when building a Thumb-2 kernel (CONFIG_THUMB2_KERNEL). This is a Bad Thing, since the ABI permits the compiler to assume that fundamental types of word size or above are word- aligned when accessing them from C. If the data is not really word-aligned, this can cause impaired performance and stray alignment faults in some circumstances. In general, the following rules should be applied when using data word declaration directives inside code sections: * .quad and .double: .align 3 * .long, .word, .single, .float: .align (or .align 2) * .short: No explicit alignment required, since Thumb-2 instructions are always 2 or 4 bytes in size. immediately after an instruction. Reviewed-by: Will Deacon Signed-off-by: Dave Martin Acked-by: Catalin Marinas Signed-off-by: Russell King commit 077248fcce5edabb1b77ba3269e6c72341769d94 Author: Dave Martin Date: Mon Nov 29 19:43:23 2010 +0100 ARM: 6499/1: Thumb-2: Correct data alignment for CONFIG_THUMB2_KERNEL in bootp/init.S Directives such as .long and .word do not magically cause the assembler location counter to become aligned in gas. As a result, using these directives in code sections can result in misaligned data words when building a Thumb-2 kernel (CONFIG_THUMB2_KERNEL). This is a Bad Thing, since the ABI permits the compiler to assume that fundamental types of word size or above are word- aligned when accessing them from C. If the data is not really word-aligned, this can cause impaired performance and stray alignment faults in some circumstances. In general, the following rules should be applied when using data word declaration directives inside code sections: * .quad and .double: .align 3 * .long, .word, .single, .float: .align (or .align 2) * .short: No explicit alignment required, since Thumb-2 instructions are always 2 or 4 bytes in size. immediately after an instruction. Reviewed-by: Will Deacon Signed-off-by: Dave Martin Acked-by: Catalin Marinas Signed-off-by: Russell King commit 7eb25ebee894ba2f8a591a83e45accc091ced19f Author: Dave Martin Date: Mon Nov 29 19:43:22 2010 +0100 ARM: 6498/1: vfp: Correct data alignment for CONFIG_THUMB2_KERNEL Directives such as .long and .word do not magically cause the assembler location counter to become aligned in gas. As a result, using these directives in code sections can result in misaligned data words when building a Thumb-2 kernel (CONFIG_THUMB2_KERNEL). This is a Bad Thing, since the ABI permits the compiler to assume that fundamental types of word size or above are word- aligned when accessing them from C. If the data is not really word-aligned, this can cause impaired performance and stray alignment faults in some circumstances. In general, the following rules should be applied when using data word declaration directives inside code sections: * .quad and .double: .align 3 * .long, .word, .single, .float: .align (or .align 2) * .short: No explicit alignment required, since Thumb-2 instructions are always 2 or 4 bytes in size. immediately after an instruction. Reviewed-by: Will Deacon Signed-off-by: Dave Martin Acked-by: Catalin Marinas Signed-off-by: Russell King commit bc8b57f08c53344d13e3b5e644c56c0355899b47 Author: Dave Martin Date: Mon Nov 29 19:43:21 2010 +0100 ARM: 6497/1: kexec: Correct data alignment for CONFIG_THUMB2_KERNEL Directives such as .long and .word do not magically cause the assembler location counter to become aligned in gas. As a result, using these directives in code sections can result in misaligned data words when building a Thumb-2 kernel (CONFIG_THUMB2_KERNEL). This is a Bad Thing, since the ABI permits the compiler to assume that fundamental types of word size or above are word- aligned when accessing them from C. If the data is not really word-aligned, this can cause impaired performance and stray alignment faults in some circumstances. In general, the following rules should be applied when using data word declaration directives inside code sections: * .quad and .double: .align 3 * .long, .word, .single, .float: .align (or .align 2) * .short: No explicit alignment required, since Thumb-2 instructions are always 2 or 4 bytes in size. immediately after an instruction. Reviewed-by: Will Deacon Signed-off-by: Dave Martin Acked-by: Catalin Marinas Signed-off-by: Russell King commit cb5d39b3a1440eca79c742d95f1d78180c272286 Author: Mika Westerberg Date: Thu Nov 18 19:14:52 2010 +0100 ARM: 6487/1: add CONFIG_CRASH_DUMP to Kconfig Add CONFIG_CRASH_DUMP configuration option which is used by dump capture kernels. Signed-off-by: Mika Westerberg Signed-off-by: Russell King commit 4b3bf7aef94fc337610d78fce0d960e2ee1d5a8f Author: Mika Westerberg Date: Thu Nov 18 19:13:19 2010 +0100 ARM: 6486/1: provide zero vmcore_elf64_check_arch() Since we don't support 64-bit ELF vmcores. This also prevents the following warning: fs/proc/vmcore.c: In function 'parse_crash_elf64_headers': fs/proc/vmcore.c:502: warning: passing argument 1 of 'elf_check_arch' from incompatible pointer type Signed-off-by: Mika Westerberg Signed-off-by: Russell King commit 9833c39400c3e6ee19daeded6910df648741611e Author: Mika Westerberg Date: Fri Nov 19 09:29:24 2010 +0100 ARM: 6485/5: proc/vmcore - allow archs to override vmcore_elf_check_arch() Allow architectures to redefine this macro if needed. This is useful for example in architectures where 64-bit ELF vmcores are not supported. Specifying zero vmcore_elf64_check_arch() allows compiler to optimize away unnecessary parts of parse_crash_elf64_headers(). We also rename the macro to vmcore_elf64_check_arch() to reflect that it is used for 64-bit vmcores only. Signed-off-by: Mika Westerberg Signed-off-by: Russell King commit e6afec9b6808eff6dc392ac07c1552e87aebcdf7 Author: Pawel Moll Date: Fri Nov 26 13:45:43 2010 +0100 ARM: 6496/1: GIC: Do not try to register more then NR_IRQS interrupts This change limits number of GIC-originating interrupts to the platform maximum (defined by NR_IRQS) while still initialising all distributor registers. Signed-off-by: Pawel Moll Signed-off-by: Russell King commit 9f1ee150fc7039eb65039ab17d9a95dfa6250133 Author: Marek Vasut Date: Sat Nov 6 23:34:03 2010 +0100 ARM: pxa/palm: fix ifdef around gen_nand driver registration Reported-by: Rafael Gandolfi Signed-off-by: Marek Vasut Signed-off-by: Eric Miao commit f9d1bf755315a66353a7f42319cff471b36fffb3 Author: Marek Vasut Date: Sun Oct 10 00:34:28 2010 +0200 ARM: pxa: fix pxa2xx-flash section mismatch Signed-off-by: Marek Vasut Acked-by: Haojian Zhuang Signed-off-by: Eric Miao commit 1db550118c46d96f371de5b3d0bd51edb148bd54 Author: Jason Chagas Date: Mon Nov 15 09:50:12 2010 +0800 ARM: mmp2: remove not used clk_rtc RTC clock will remain at 32KHz and powered on, there is no need for it at this moment. Signed-off-by: Jason Chagas Signed-off-by: Eric Miao commit b76fb39d49f67a484a6adc8f041d9ad833f6860e Author: Daniel Glöckner Date: Tue Nov 30 01:00:18 2010 +0100 s6105-ipcam: fix compilation When the s6105-ipcam ASoC driver had been converted to the multi-component API, a single reference to a former structure element remained, blocking successful compilation. Signed-off-by: Daniel Glöckner Acked-by: Liam Girdwood Signed-off-by: Mark Brown commit 9e4ea718d3c53f9f2a65ddddf95ffd7743be458e Author: Daniel Glöckner Date: Tue Nov 30 01:00:17 2010 +0100 s6000-pcm: fix compilation s6000_soc_platform has lost its forward declaration and there no longer is a name element in it, so use a string constant when calling request_irq. Signed-off-by: Daniel Glöckner Acked-by: Liam Girdwood Signed-off-by: Mark Brown commit b1d36b1c3573fd5adecbd313d30a8bdc8d7fbc5e Author: Daniel Glöckner Date: Tue Nov 30 01:00:16 2010 +0100 s6000-i2s: fix compilation A semicolon was missing. Signed-off-by: Daniel Glöckner Acked-by: Liam Girdwood Signed-off-by: Mark Brown commit 3f1af9d26fb02a99a60a045b8ae93ccc6fe50b97 Author: Axel Lin Date: Mon Nov 29 17:42:47 2010 +0800 ASoC: Fix missing spin_unlock_irqrestore In nuc900_dma_hw_params(), if snd_pcm_lib_malloc_pages failed it returns without calling spin_unlock_irqrestore(). Since snd_pcm_lib_malloc_pages() does not touch struct nuc900_audio, we don't need to hold the lock while calling snd_pcm_lib_malloc_pages(). Fix it by moving spin_lock_irqsave() down to after snd_pcm_lib_malloc_pages(). In nuc900_dma_prepare(), spin_unlock_irqrestore() is missing in the error path. Fix it by removing the return in default case. Signed-off-by: Axel Lin Acked-by: Wan ZongShun Acked-by: Liam Girdwood Signed-off-by: Mark Brown commit 921169ca2f7c8a0a2ccda2ce33c465dfe3ae30ef Author: Steven Whitehouse Date: Mon Nov 29 12:50:38 2010 +0000 GFS2: Clean up of gdlm_lock function The DLM never returns -EAGAIN in response to dlm_lock(), and even if it did, the test in gdlm_lock() was wrong anyway. Once that test is removed, it is possible to greatly simplify this code by simply using a "normal" error return code (0 for success). We then no longer need the LM_OUT_ASYNC return code which can be removed. Signed-off-by: Steven Whitehouse commit 802ec9b6682349d9d9c92a9e55f44324d2954f41 Author: Abhijith Das Date: Thu Nov 18 11:26:46 2010 -0500 GFS2: Allow gfs2 to update quota usage values through the quotactl interface With this patch the gfs2_set_dqblk() function will be able to update the quota usage block count (FS_DQ_BCOUNT) in addition to the already supported FS_DQ_BHARD (limit) and FS_DQ_BSOFT (warn) fields of the dquot structure. Signed-off-by: Abhi Das Signed-off-by: Steven Whitehouse commit edc221d00bd5c6da0e5c67701f3782b72796619f Author: Joe Perches Date: Wed Nov 10 13:19:06 2010 -0800 GFS2: fs/gfs2/glock.h: Add __attribute__((format(printf,2,3)) to gfs2_print_dbg Functions that use printf formatting, especially those that use %pV, should have their uses of printf format and arguments checked by the compiler. Signed-off-by: Joe Perches Signed-off-by: Steven Whitehouse commit 5e69069c1afb655b5f1a154856ccdb4bb7327b81 Author: Joe Perches Date: Tue Nov 9 16:35:20 2010 -0800 GFS2: fs/gfs2/glock.c: Use printf extension %pV Using %pV reduces the number of printk calls and eliminates any possible message interleaving from other printk calls. Signed-off-by: Joe Perches Signed-off-by: Steven Whitehouse commit 2ae51ed7b548c1d943d080da617515e801ea5c3e Author: Steven Whitehouse Date: Wed Nov 10 15:14:57 2010 +0000 GFS2: Clean up duplicated setattr code While preparing the last patch I noticed that the gfs2_setattr_simple code had been duplicated into two other places. This patch updates those to call gfs2_setattr_simple rather than open coding it. Signed-off-by: Steven Whitehouse commit 9e55cd53728719ac3a3234a6618259ab8e203a10 Author: Steven Whitehouse Date: Tue Nov 9 14:09:53 2010 +0000 GFS2: Remove unreachable calls to vmtruncate Suggested-by: Christoph Hellwig Signed-off-by: Steven Whitehouse commit cc18152eb7c27653199546bd14e991a451ab8d1b Author: Joe Perches Date: Fri Nov 5 16:12:36 2010 -0700 GFS2: fs/gfs2/glock.c: Convert sprintf_symbol to %pS Signed-off-by: Joe Perches Signed-off-by: Steven Whitehouse commit d2115778c7ea0df2201f1ad9aab948c49ffa1078 Author: Steven Whitehouse Date: Wed Nov 3 19:58:53 2010 +0000 GFS2: Change two WQ_RESCUERs into WQ_MEM_RECLAIM The WQ_RESCUER flag should only be used internally to the workqueue implementation. Signed-off-by: Steven Whitehouse Acked-by: Tejun Heo commit b94ca0792d49f5856570ba66f53acd69cd0917fc Author: Eric Benard Date: Fri Oct 15 11:27:17 2010 +0200 at91: merge all at91rm9200 defconfig in one single file About all options present in each file are activated in the single file. Signed-off-by: Eric Benard Tested-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Nicolas Ferre commit 822bc180a7f7a7bc5fcaaea195f41b487cc8cae8 Author: Paul Turner Date: Mon Nov 29 16:55:40 2010 -0800 sched: Fix unregister_fair_sched_group() In the flipping and flopping between calling unregister_fair_sched_group() on a per-cpu versus per-group basis we ended up in a bad state. Remove from the list for the passed cpu as opposed to some arbitrary index. ( This fixes explosions w/ autogroup as well as a group creation/destruction stress test. ) Reported-by: Stephen Rothwell Signed-off-by: Paul Turner Cc: Peter Zijlstra Cc: Mike Galbraith LKML-Reference: <20101130005740.080828123@google.com> Signed-off-by: Ingo Molnar commit 3cf2efb1a7c68d55d60dcb2ed9609e1a2fc25952 Author: Chris Wilson Date: Mon Nov 29 10:09:55 2010 +0000 Revert "drm/i915/dp: use VBT provided eDP params if available" This reverts commit 869184a675662bddcdf76c5b95665272facff2b8. This is required for the Sony Vaio Jesse was working on at the time, but breaks most other eDP machines - machines that were working in earlier kernels. Reported-and-tested-by: Dave Airlie Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=31188 Tested-by: Zhao Jian Signed-off-by: Chris Wilson commit 4acf89fb3bbb01ba9de4a7cc102e46095a12c94e Author: Yauhen Kharuzhy Date: Sun Nov 28 20:30:27 2010 +0200 ARM: S3C2412: Fix typo in CONFIG_CPU_S3C2412_ONLY definition Dependency on (CPU_S3C2416 is not selected) was defined as "!CPU_2416", instead of "!CPU_S3C2416". Fix it. Signed-off-by: Yauhen Kharuzhy Signed-off-by: Ben Dooks commit 71f608ef56c987c5325c3aaf9c3fadd4ddc77f64 Author: Yauhen Kharuzhy Date: Sun Nov 28 20:30:23 2010 +0200 ARM: S3C2443: Select properly ARM core type Select ARM920T core when compiling kernel for s3c2443. Signed-off-by: Yauhen Kharuzhy Signed-off-by: Ben Dooks commit 4249f8acf993046948dc1f2e74244fe484c8cb8f Author: Yauhen Kharuzhy Date: Sun Nov 28 20:30:19 2010 +0200 ARM: SMDK2416: Select MACH_SMDK, S3C_DEV_NAND, S3C_DEV_USB_HOST Enable compilation of platform devices and initialization code used in SMDK2416 board file. Signed-off-by: Yauhen Kharuzhy Signed-off-by: Ben Dooks commit 60686aa0086a14f8b15c83a09f3df1eebe3aab3c Author: Takashi Iwai Date: Tue Nov 30 08:14:21 2010 +0100 ALSA: Fix SNDCTL_DSP_RESET ioctl for OSS emulation In OSS emulation, SNDCTL_DSP_RESET ioctl needs the reset of the internal buffer state in addition to drop of the running streams. Otherwise the succeeding access becomes inconsistent. Tested-by: Amit Nagal Cc: Signed-off-by: Takashi Iwai commit 46fdb0937f26124700fc9fc80da4776330cc00d3 Author: Paul E. McKenney Date: Tue Oct 26 02:11:40 2010 -0700 rcu: Make synchronize_srcu_expedited() fast if running readers The synchronize_srcu_expedited() function is currently quick if there are no active readers, but will delay a full jiffy if there are any. If these readers leave their SRCU read-side critical sections quickly, this is way too long to wait. So this commit first waits ten microseconds, and only then falls back to jiffy-at-a-time waiting. Reported-by: Avi Kivity Reported-by: Marcelo Tosatti Tested-by: Takuya Yoshikawa Signed-off-by: Paul E. McKenney commit db3a8920995484e5e9a0abaf3bad2c7311b163db Author: Paul E. McKenney Date: Mon Oct 25 07:39:22 2010 -0700 rcu: fix race condition in synchronize_sched_expedited() The new (early 2010) implementation of synchronize_sched_expedited() uses try_stop_cpu() to force a context switch on every CPU. It also permits concurrent calls to synchronize_sched_expedited() to share a single call to try_stop_cpu() through use of an atomically incremented synchronize_sched_expedited_count variable. Unfortunately, this is subject to failure as follows: o Task A invokes synchronize_sched_expedited(), try_stop_cpus() succeeds, but Task A is preempted before getting to the atomic increment of synchronize_sched_expedited_count. o Task B also invokes synchronize_sched_expedited(), with exactly the same outcome as Task A. o Task C also invokes synchronize_sched_expedited(), again with exactly the same outcome as Tasks A and B. o Task D also invokes synchronize_sched_expedited(), but only gets as far as acquiring the mutex within try_stop_cpus() before being preempted, interrupted, or otherwise delayed. o Task E also invokes synchronize_sched_expedited(), but only gets to the snapshotting of synchronize_sched_expedited_count. o Tasks A, B, and C all increment synchronize_sched_expedited_count. o Task E fails to get the mutex, so checks the new value of synchronize_sched_expedited_count. It finds that the value has increased, so (wrongly) assumes that its work has been done, returning despite there having been no expedited grace period since it began. The solution is to have the lowest-numbered CPU atomically increment the synchronize_sched_expedited_count variable within the synchronize_sched_expedited_cpu_stop() function, which is under the protection of the mutex acquired by try_stop_cpus(). However, this also requires that piggybacking tasks wait for three rather than two instances of try_stop_cpu(), because we cannot control the order in which the per-CPU callback function occur. Cc: Tejun Heo Cc: Lai Jiangshan Signed-off-by: Paul E. McKenney commit 2d999e03b7c8305b4385dd20992e4ed3e827177b Author: Paul E. McKenney Date: Wed Oct 20 12:06:18 2010 -0700 rcu: update documentation/comments for Lai's adoption patch Lai's RCU-callback immediate-adoption patch changes the RCU tracing output, so update tracing.txt. Also update a few comments to clarify the synchronization design. Signed-off-by: Paul E. McKenney commit 29494be71afe2a16ad04e344306a620d7cc22d06 Author: Lai Jiangshan Date: Wed Oct 20 14:13:06 2010 +0800 rcu,cleanup: simplify the code when cpu is dying When we handle the CPU_DYING notifier, the whole system is stopped except for the current CPU. We therefore need no synchronization with the other CPUs. This allows us to move any orphaned RCU callbacks directly to the list of any online CPU without needing to run them through the global orphan lists. These global orphan lists can therefore be dispensed with. This commit makes thes changes, though currently victimizes CPU 0 @@@. Signed-off-by: Lai Jiangshan Signed-off-by: Paul E. McKenney commit 7b27d5475f86186914e54e4a6bb994e9a985337b Author: Lai Jiangshan Date: Thu Oct 21 11:29:05 2010 +0800 rcu,cleanup: move synchronize_sched_expedited() out of sched.c The first version of synchronize_sched_expedited() used the migration code in the scheduler, and was therefore implemented in kernel/sched.c. However, the more recent version of this code no longer uses the migration code, so this commit moves it to the main RCU source files. Signed-off-by: Lai Jiangshan Signed-off-by: Paul E. McKenney commit deb7a41815a8a32d4f9ea2af7a48ed1175222cec Author: Paul E. McKenney Date: Thu Sep 30 21:33:32 2010 -0700 rcu: get rid of obsolete "classic" names in TREE_RCU tracing The TREE_RCU tracing had obsolete rcuclassic_trace_init() and rcuclassic_trace_cleanup() function names. This commit brings them up to date: rcutree_trace_init() and rcutree_trace_cleanup(), respectively. Signed-off-by: Paul E. McKenney commit e940cc804ec212e483f91167b93d1740c2fd3415 Author: Paul E. McKenney Date: Thu Nov 4 14:55:26 2010 -0700 rcu: Distinguish between boosting and boosted RCU priority boosting's tracing did not distinguish between ongoing boosting and completion of boosting. This commit therefore adds this capability. Signed-off-by: Paul E. McKenney Signed-off-by: Paul E. McKenney commit 8e79e1f9615b83d1e1d26b328d1b776111ca0cf7 Author: Paul E. McKenney Date: Thu Nov 4 14:31:19 2010 -0700 rcu: document TINY_RCU and TINY_PREEMPT_RCU tracing. Add the required verbiage to Documentation/RCU/trace.txt. Signed-off-by: Paul E. McKenney Signed-off-by: Paul E. McKenney commit 9e571a82f0cb205a65a0ea41657f19f22b7fabb8 Author: Paul E. McKenney Date: Thu Sep 30 21:26:52 2010 -0700 rcu: add tracing for TINY_RCU and TINY_PREEMPT_RCU Add tracing for the tiny RCU implementations, including statistics on boosting in the case of TINY_PREEMPT_RCU and RCU_BOOST. Signed-off-by: Paul E. McKenney Signed-off-by: Paul E. McKenney commit 24278d148316d2180be6df40e06db013d8b232b8 Author: Paul E. McKenney Date: Mon Sep 27 17:25:23 2010 -0700 rcu: priority boosting for TINY_PREEMPT_RCU Add priority boosting, but only for TINY_PREEMPT_RCU. This is enabled by the default-off RCU_BOOST kernel parameter. The priority to which to boost preempted RCU readers is controlled by the RCU_BOOST_PRIO kernel parameter (defaulting to real-time priority 1) and the time to wait before boosting the readers blocking a given grace period is controlled by the RCU_BOOST_DELAY kernel parameter (defaulting to 500 milliseconds). Signed-off-by: Paul E. McKenney Signed-off-by: Paul E. McKenney commit 7d0dbea312a6508389241b4fb6cda1c4d1e32d6e Merge: 5c4986b8a9ddd9cf649abe38a102866f7809b1d2 193006f7e3b1abd42d7a3677b54fa2996461a842 Author: Paul Mundt Date: Tue Nov 30 14:55:11 2010 +0900 Merge branch 'sh/urgent' into sh-latest commit 2818b19102fdc414248f772c46af176d36520ae7 Merge: 0ae26c8cf71f3c65b69a40d45c48e6c6195ac617 25338f2e09fcbaa0470841c928bf0e718ca13382 Author: Paul Mundt Date: Tue Nov 30 14:53:45 2010 +0900 Merge branch 'rmobile/mackerel' into rmobile-latest Conflicts: arch/arm/mach-shmobile/Kconfig arch/arm/mach-shmobile/Makefile Signed-off-by: Paul Mundt commit 476428f8c3bb6679f8f52bf2b935ac40bc9c7358 Author: Suresh Jayaraman Date: Wed Nov 24 17:49:07 2010 +0530 cifs: display fsc in /proc/mounts Reviewed-by: Jeff Layton Signed-off-by: Suresh Jayaraman Signed-off-by: Steve French commit 0ae26c8cf71f3c65b69a40d45c48e6c6195ac617 Merge: 1ad2096c4eba144522d87541c4024b8c84e95051 208c7dc2727ec0fbc678da5e749bcc178c08463d d8e7943d821d8ee7f48ff38f6f7c509297c88402 Author: Paul Mundt Date: Tue Nov 30 14:50:10 2010 +0900 Merge branches 'rmobile/ag5' and 'rmobile/mmcif' into rmobile-latest commit b81209de2455c6051cf67f2acd8ec26ccb8caf83 Author: Suresh Jayaraman Date: Wed Nov 24 17:49:06 2010 +0530 cifs: enable fscache iff fsc mount option is used explicitly Currently, if CONFIG_CIFS_FSCACHE is set, fscache is enabled on files opened as read-only irrespective of the 'fsc' mount option. Fix this by enabling fscache only if 'fsc' mount option is specified explicitly. Remove an extraneous cFYI debug message and fix a typo while at it. Reported-by: Jeff Layton Acked-by: Jeff Layton Signed-off-by: Suresh Jayaraman Signed-off-by: Steve French commit 607a569da4cf289fd8eb3887080ed3b212e3112d Author: Suresh Jayaraman Date: Wed Nov 24 17:49:05 2010 +0530 cifs: allow fsc mount option only if CONFIG_CIFS_FSCACHE is set Currently, it is possible to specify 'fsc' mount option even if CONFIG_CIFS_FSCACHE has not been set. The option is being ignored silently while the user fscache functionality to work. Fix this by raising error when the CONFIG option is not set. Reported-by: Jeff Layton Reviewed-by: Jeff Layton Signed-off-by: Suresh Jayaraman Signed-off-by: Steve French commit fbeba8bb16d7c50362e28f3f91a79fb414903199 Author: Shirish Pargaonkar Date: Sat Nov 27 11:37:54 2010 -0600 cifs: Handle extended attribute name cifs_acl to generate cifs acl blob (try #4) Add extended attribute name system.cifs_acl Get/generate cifs/ntfs acl blob and hand over to the invoker however it wants to parse/process it under experimental configurable option CIFS_ACL. Do not get CIFS/NTFS ACL for xattr for attribute system.posix_acl_access Signed-off-by: Shirish Pargaonkar Signed-off-by: Steve French commit 78415d2d306bfed0a0ac351aec6c69759d007224 Author: Shirish Pargaonkar Date: Sat Nov 27 11:37:26 2010 -0600 cifs: Misc. cleanup in cifsacl handling [try #4] Change the name of function mode_to_acl to mode_to_cifs_acl. Handle return code in functions mode_to_cifs_acl and cifs_acl_to_fattr. Signed-off-by: Shirish Pargaonkar Signed-off-by: Steve French commit d8e7943d821d8ee7f48ff38f6f7c509297c88402 Merge: df73af86b6e737f357aae85e0b5e621516117780 22efa0fee32d9e7f6f6fbc396a872b5708d86048 Author: Paul Mundt Date: Tue Nov 30 14:42:55 2010 +0900 Merge branch 'common/mmcif' into rmobile/mmcif commit 25338f2e09fcbaa0470841c928bf0e718ca13382 Author: Kuninori Morimoto Date: Tue Nov 30 04:37:33 2010 +0000 ARM: mach-shmobile: mackerel: Add USB1(Host) support Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit 67bace72ee64f6a11cfb914b91d9d6bd47e80ed8 Author: Kyle McMartin Date: Mon Nov 29 20:34:38 2010 -0500 parisc: remove redundant initialization in sigsegv path of sys_rt_sigreturn Noticed-by: Randy Dunlap Signed-off-by: Kyle McMartin commit 805e3f495057aa5307ad4e3d6dc7073d4733c691 Author: Ian Campbell Date: Wed Nov 3 15:32:21 2010 +0000 xen: x86/32: perform initial startup on initial_page_table Only make swapper_pg_dir readonly and pinned when generic x86 architecture code (which also starts on initial_page_table) switches to it. This helps ensure that the generic setup paths work on Xen unmodified. In particular clone_pgd_range writes directly to the destination pgd entries and is used to initialise swapper_pg_dir so we need to ensure that it remains writeable until the last possible moment during bring up. This is complicated slightly by the need to avoid sharing kernel PMD entries when running under Xen, therefore the Xen implementation must make a copy of the kernel PMD (which is otherwise referred to by both intial_page_table and swapper_pg_dir) before switching to swapper_pg_dir. Signed-off-by: Ian Campbell Cc: Borislav Petkov Cc: H. Peter Anvin Cc: Jeremy Fitzhardinge Signed-off-by: Jeremy Fitzhardinge commit acfa747baf73922021a047f2d87a2d866f5dbab5 Author: Jiri Slaby Date: Mon Nov 29 10:16:54 2010 +0100 TTY: open/hangup race fixup Like in the "TTY: don't allow reopen when ldisc is changing" patch, this one fixes a TTY WARNING as described in the option 1) there: 1) __tty_hangup from tty_ldisc_hangup to tty_ldisc_enable. During this section tty_lock is held. However tty_lock is temporarily dropped in the middle of the function by tty_ldisc_hangup. The fix is to introduce a new flag which we set during the unlocked window and check it in tty_reopen too. The flag is TTY_HUPPING and is cleared after TTY_HUPPED is set. While at it, remove duplicate TTY_HUPPED set_bit. The one after calling ops->hangup seems to be more correct. But anyway, we hold tty_lock, so there should be no difference. Also document the function it does that kind of crap. Nicely reproducible with two forked children: static void do_work(const char *tty) { if (signal(SIGHUP, SIG_IGN) == SIG_ERR) exit(1); setsid(); while (1) { int fd = open(tty, O_RDWR|O_NOCTTY); if (fd < 0) continue; if (ioctl(fd, TIOCSCTTY)) continue; if (vhangup()) continue; close(fd); } exit(0); } Signed-off-by: Jiri Slaby Reported-by: Reported-by: Kyle McMartin Cc: Alan Cox Cc: stable Signed-off-by: Greg Kroah-Hartman commit e2efafbf139d2bfdfe96f2901f03189fecd172e4 Author: Jiri Slaby Date: Mon Nov 29 10:16:53 2010 +0100 TTY: don't allow reopen when ldisc is changing There are many WARNINGs like the following reported nowadays: WARNING: at drivers/tty/tty_io.c:1331 tty_open+0x2a2/0x49a() Hardware name: Latitude E6500 Modules linked in: Pid: 1207, comm: plymouthd Not tainted 2.6.37-rc3-mmotm1123 #3 Call Trace: [] warn_slowpath_common+0x80/0x98 [] warn_slowpath_null+0x15/0x17 [] tty_open+0x2a2/0x49a [] chrdev_open+0x11d/0x146 ... This means tty_reopen is called without TTY_LDISC set. For further considerations, note tty_lock is held in tty_open. TTY_LDISC is cleared in: 1) __tty_hangup from tty_ldisc_hangup to tty_ldisc_enable. During this section tty_lock is held. However tty_lock is temporarily dropped in the middle of the function by tty_ldisc_hangup. 2) tty_release via tty_ldisc_release till the end of tty existence. If tty->count <= 1, tty_lock is taken, TTY_CLOSING bit set and then tty_ldisc_release called. tty_reopen checks TTY_CLOSING before checking TTY_LDISC. 3) tty_set_ldisc from tty_ldisc_halt to tty_ldisc_enable. We: * take tty_lock, set TTY_LDISC_CHANGING, put tty_lock * call tty_ldisc_halt (clear TTY_LDISC), tty_lock is _not_ held * do some other work * take tty_lock, call tty_ldisc_enable (set TTY_LDISC), put tty_lock I cannot see how 2) can be a problem, as there I see no race. OTOH, 1) and 3) can happen without problems. This patch the case 3) by checking TTY_LDISC_CHANGING along with TTY_CLOSING in tty_reopen. 1) will be fixed in the following patch. Nicely reproducible with two processes: while (1) { fd = open("/dev/ttyS1", O_RDWR); if (fd < 0) { warn("open"); continue; } close(fd); } -------- while (1) { fd = open("/dev/ttyS1", O_RDWR); ld1 = 0; ld2 = 2; while (1) { ioctl(fd, TIOCSETD, &ld1); ioctl(fd, TIOCSETD, &ld2); } close(fd); } Signed-off-by: Jiri Slaby Reported-by: Cc: Kyle McMartin Cc: Alan Cox Cc: stable Signed-off-by: Greg Kroah-Hartman commit 6a20bd45fda271bd57e3ba41b3de3009797f4b5e Author: Jiri Slaby Date: Thu Nov 25 00:27:55 2010 +0100 NET: wan/x25, fix ldisc->open retval We should never return positive values from ldisc->open, tty layer doesn't (and never did) expect that. If we do that, weird things like warnings in tty_ldisc_close happen. Not sure if dev->base_addr is used somehow now. Signed-off-by: Jiri Slaby Cc: Alan Cox Cc: Andrew Hendry Cc: linux-x25@vger.kernel.org Tested-by: Sergey Lapin Signed-off-by: Greg Kroah-Hartman commit 7f90cfc505d613f4faf096e0d84ffe99208057d9 Author: Jiri Slaby Date: Thu Nov 25 00:27:54 2010 +0100 TTY: ldisc, fix open flag handling When a concrete ldisc open fails in tty_ldisc_open, we forget to clear TTY_LDISC_OPEN. This causes a false warning on the next ldisc open: WARNING: at drivers/char/tty_ldisc.c:445 tty_ldisc_open+0x26/0x38() Hardware name: System Product Name Modules linked in: ... Pid: 5251, comm: a.out Tainted: G W 2.6.32-5-686 #1 Call Trace: [] ? warn_slowpath_common+0x5e/0x8a [] ? warn_slowpath_null+0xa/0xc [] ? tty_ldisc_open+0x26/0x38 [] ? tty_set_ldisc+0x218/0x304 ... So clear the bit when failing... Introduced in c65c9bc3efa (tty: rewrite the ldisc locking) back in 2.6.31-rc1. Signed-off-by: Jiri Slaby Cc: Alan Cox Reported-by: Sergey Lapin Tested-by: Sergey Lapin Cc: stable Signed-off-by: Greg Kroah-Hartman commit 93ae86e759299718c611bc543b9b1633bf32905a Author: Mimi Zohar Date: Mon Nov 29 16:20:04 2010 -0500 keys: add missing include file for trusted and encrypted keys This patch fixes the linux-next powerpc build errors as reported by Stephen Rothwell. Reported-by: Stephen Rothwell Signed-off-by: Mimi Zohar Tested-by: Rajiv Andrade Signed-off-by: James Morris commit 31e323cca9d5c8afd372976c35a5d46192f540d1 Author: Jeremy Fitzhardinge Date: Mon Nov 29 14:16:53 2010 -0800 xen: don't bother to stop other cpus on shutdown/reboot Xen will shoot all the VCPUs when we do a shutdown hypercall, so there's no need to do it manually. In any case it will fail because all the IPI irqs have been pulled down by this point, so the cross-CPU calls will simply hang forever. Until change 76fac077db6b34e2c6383a7b4f3f4f7b7d06d8ce the function calls were not synchronously waited for, so this wasn't apparent. However after that change the calls became synchronous leading to a hang on shutdown on multi-VCPU guests. Signed-off-by: Jeremy Fitzhardinge Cc: Stable Kernel Cc: Alok Kataria commit c6c0ac664c86ff6408fadbed4913938c8a732e26 Author: Michael Ellerman Date: Thu Nov 25 09:44:07 2010 +1100 driver core: Document that device_rename() is only for networking Document that device_rename() is not to be used by anything other than the network core. Signed-off-by: Michael Ellerman Signed-off-by: Greg Kroah-Hartman commit dd318575ff0aae91ac4cbcc5b60c184e59267212 Author: Johannes Berg Date: Mon Nov 29 11:09:16 2010 +0100 mac80211: fix RX aggregation locking The RX aggregation locking documentation was wrong, which led Christian to also code the timer timeout handling for it somewhat wrongly. Fix the documentation, the two places that need to hold the reorder lock across accesses to the structure, and the debugfs code that should just use RCU. Also, remove acquiring the sta->lock across reorder timeouts since it isn't necessary, and change a few places to GFP_KERNEL because the code path here doesn't need atomic allocations as I noticed when reviewing all this. Signed-off-by: Johannes Berg Acked-by: Christian Lamparter Signed-off-by: John W. Linville commit 8b7f8532d15631776ce8bec2bbbc58f6aad738d1 Author: Felix Fietkau Date: Sun Nov 28 19:37:48 2010 +0100 ath9k: fix software retry counter tracking The recent tx path cleanups moved the software retry count tracking from the ath_buf to the skb cb, however the actual counter update referred to the wrong location, confusing block-ack window tracking. Fix this by using the retries counter in the struct ath_frame_info. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 81fc2a332045dc1dae24f24d3e2dc4656f2cc498 Author: Rajkumar Manoharan Date: Fri Nov 26 23:24:33 2010 +0530 Revert "ath9k_htc: Handle monitor mode properly for HTC devices" This reverts commit 446fad5a5b6be765c8ec39bfdbbc6c7aa63fbcbb. The change had broken the packet injection on monitoring mode. Signed-off-by: Rajkumar Manoharan Signed-off-by: John W. Linville commit 8c5e9c830a04ece8f0c35db2c1e0f6d87bd64894 Author: Vasanthakumar Thiagarajan Date: Fri Nov 26 06:10:07 2010 -0800 ath9k: Remove code which enables btcoex based on subsys id Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 8f5dcb1cfb71ce832f53a4723deba72e6695078b Author: Vasanthakumar Thiagarajan Date: Fri Nov 26 06:10:06 2010 -0800 ath9k: Reintroduce modparam to enable btcoex It is not ideal to enable btcoex based on subsys id as it is not unique, they are so random. It is also a pain keeping all of them in a table to enable btcoex for a particular hw. Going back to the old idea. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit f30221e4ec62d905b56d5e8f7ccab6b406a97cf5 Author: Johannes Berg Date: Thu Nov 25 10:02:30 2010 +0100 mac80211: implement off-channel mgmt TX This implements the new off-channel TX API in mac80211 with a new work item type. The operation doesn't add a new work item when we're on the right channel and there's no wait time so that for example p2p probe responses will be transmitted without delay. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit f7ca38dfe58c20cb1aa2ed9643187e8b194b5bae Author: Johannes Berg Date: Thu Nov 25 10:02:29 2010 +0100 nl80211/cfg80211: extend mgmt-tx API for off-channel With p2p, it is sometimes necessary to transmit a frame (typically an action frame) on another channel than the current channel. Enable this through the CMD_FRAME API, and allow it to wait for a response. A new command allows that wait to be aborted. However, allow userspace to specify whether or not it wants to allow off-channel TX, it may actually want to use the same channel only. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit e030d58e8860f1c87b17631dbdd70747cbe1fb5b Author: Alan Stern Date: Mon Nov 15 15:46:07 2010 -0500 sysfs: remove useless test from sysfs_merge_group Dan Carpenter pointed out that the new sysfs_merge_group() and sysfs_unmerge_group() routines requires their grp argument to be non-NULL, because they dereference grp to obtain the list of attributes. Hence it's pointless for the routines to include a test and special-case handling for when grp is NULL. This patch (as1433) removes the unneeded tests. Signed-off-by: Alan Stern CC: Dan Carpenter Signed-off-by: Greg Kroah-Hartman commit 251d380034c6c34efe75ffb89d863558ba68ec6a Author: John Tapsell Date: Thu Mar 25 13:30:45 2010 +0000 Staging: rt2870: Add USB ID for Buffalo Airstation WLI-UC-GN BugLink: http://bugs.launchpad.net/bugs/441990 This was tested to successfully enable the hardware. Signed-off-by: John Tapsell Signed-off-by: Stefan Bader CC: stable@kernel.org Signed-off-by: Greg Kroah-Hartman commit 4960b8fe1b0602195e2170bb94d50edc47d36d73 Author: Marek Belisko Date: Wed Nov 24 10:42:39 2010 +0100 staging: ft1000: Fix goto error logic. Fix goto error logic which could lead to kernel panics because kthread_stop() is called in not correct error conditions. Seen it sometimes when dsp_reload() fails then I got kernel panic. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit c20ec76157747434652e721cdd4dccd8654ad370 Author: Joe Perches Date: Mon Nov 29 07:42:02 2010 +0000 forcedeth: Use netdev_dbg for printk(KERN_DEBUG Use the normal debugging functions. Print mac address when using random_ether_addr. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit ef46ffbc2841dddebe521764c06673474ca5d041 Author: Joe Perches Date: Mon Nov 29 07:42:01 2010 +0000 forcedeth: Remove netdev_dbg uses These were probably just for initial driver debugging and have not been enabled in builds in git history. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit b2ba08e606dfd106a394c3ac7a56c497b4c8f230 Author: Joe Perches Date: Mon Nov 29 07:42:00 2010 +0000 forcedeth: Convert dev_printk( to dev_( Use vsprintf extension %pM for a mac address in one instance. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit cd66328bdab782ee40d17b573a3067a591cb7b4f Author: Joe Perches Date: Mon Nov 29 07:41:59 2010 +0000 forcedeth: Separate vendor specific initializations into functions Neaten the phy_init function by adding and calling vendor specific functions. object size is reduced by ~1kb: $ size drivers/net/forcedeth.o.* text data bss dec hex filename 83475 1848 19304 104627 198b3 drivers/net/forcedeth.o.new 84459 1848 19544 105851 19d7b drivers/net/forcedeth.o.old Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit c41d41e1687dcf344f55dd15c7121532e5c195d4 Author: Joe Perches Date: Mon Nov 29 07:41:58 2010 +0000 forcedeth: Add function init_realtek_8211b Deduplicate the code use for the init/reset of this device. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 1d397f3698ec438c3c14abf45bfac88cca1882d9 Author: Joe Perches Date: Mon Nov 29 07:41:57 2010 +0000 forcedeth: Convert pr_ to netdev_ Use netdev_ when a struct net_device * is available. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 294a554e274f961ac33c7d739d5b912bd0005f5b Author: Joe Perches Date: Mon Nov 29 07:41:56 2010 +0000 forcedeth: Use pr_fmt and pr_ Convert printks to pr_. Remove "forcedeth: " from some calls as it's now added by pr_fmt. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit f52dafc1a67c98baa9b6fa1866a4caa4be4831fb Author: Joe Perches Date: Mon Nov 29 07:41:55 2010 +0000 forcedeth: Convert remaining dprintk to netdev_dbg The remaining dprintk uses are emitted as KERN_INFO. Change these dprintk uses to netdev_dbg. Remove the now unused dprintk macros. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit e649985b4ab1e86b3a389cf0d7c48f9cb1e27ae6 Author: Joe Perches Date: Mon Nov 29 07:41:54 2010 +0000 forcedeth: Use print_hex_dump Use the standard code to emit hex dumps. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 6b80858d2c0a378894b9df35d3703d62b0b12dbc Author: Joe Perches Date: Mon Nov 29 07:41:53 2010 +0000 forcedeth: convert dprintk(KERN_DEBUG to netdev_dbg Use the more standard macro to preface netdev->name. Fix casting on resource use. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 344d0dce5164d0bf2d73cf10510fe08ed8cf8248 Author: Joe Perches Date: Mon Nov 29 07:41:52 2010 +0000 forcedeth: Change reg_delay arguments and use Move the printk out of reg_delay and make the callers emit a message on error. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit e999fb057436c2167d5ee3f5c82753e953981525 Author: Marek Belisko Date: Tue Nov 23 13:29:28 2010 +0100 staging: ft1000: Remove functions which create devices in kernel space. Remove exec_mknod() and rm_mknod() helpers which was used for device nodes creating/removing in kernel space. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 5c5e138b590a748c57d54b39634cda974ab9af1d Author: Christian Lamparter Date: Fri Nov 26 23:29:23 2010 +0100 carl9170: fix carl9170_tx_prepare typo commit: "carl9170: revamp carl9170_tx_prepare" introduced a peculiar bug that would only show up if the the module parameter noht is set to 1. Then all outbound voice, video and background frames would each invoke a (bogus) RTS/CTS handshake. Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit 7dff3125534c1d035a910052335a3a39fbb31aa7 Author: Jouni Malinen Date: Fri Nov 26 20:41:55 2010 +0200 mac80211: Fix frame injection using non-AP vif In order for frame injection to work properly for some use cases (e.g., finding the station entry and keys for encryption), mac80211 needs to find the correct sdata entry. This works when the main vif is in AP mode, but commit a2c1e3dad516618cb0fbfb1a62c36d0b0744573a broke this particular use case for station main vif. While this type of injection is quite unusual operation, it has some uses and we should fix it. Do this by changing the monitor vif sdata selection to allow station vif to be selected instead of limiting it to just AP vifs. We still need to skip some iftypes to avoid selecting unsuitable vif for injection. Signed-off-by: Jouni Malinen Signed-off-by: John W. Linville commit 46047784b8cdcfc916f6c1cccee0c18dd1223dfd Author: Rajkumar Manoharan Date: Fri Nov 26 23:24:31 2010 +0530 ath9k: Disable SWBA interrupt on remove_interface while removing beaconing mode interface, SWBA interrupt was never disabled when there are no other beaconing interfaces. Cc: stable@kernel.org Signed-off-by: Rajkumar Manoharan Signed-off-by: John W. Linville commit c426ee247e40a70490f3d67d3c9c7d1aba54516f Author: Johannes Berg Date: Fri Nov 26 11:38:04 2010 +0100 ath9k/carl9170: advertise P2P With some upcoming changes we'd like to use the interface types for P2P capability tests. Enable them now so that when we add those tests in wpa_supplicant, nothing will break. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 98c316e348bedffa730e6f1e4baeb8a3c3e0f28b Author: Gabor Juhos Date: Thu Nov 25 18:26:07 2010 +0100 ath9k: use per-device struct for pm_qos_* operations The ath9k driver uses a shared pm_qos_request_list structure for all devices. This causes the following warning if more than one device is present in the system: WARNING: at kernel/pm_qos_params.c:234 ath9k_init_device+0x5e8/0x6b0() pm_qos_add_request() called for already added request Modules linked in: Call Trace: [<802b1cdc>] dump_stack+0x8/0x34 [<8007dd90>] warn_slowpath_common+0x78/0xa4 [<8007de44>] warn_slowpath_fmt+0x2c/0x38 [<801b0828>] ath9k_init_device+0x5e8/0x6b0 [<801bc508>] ath_pci_probe+0x2dc/0x39c [<80176254>] pci_device_probe+0x64/0xa4 [<8019471c>] driver_probe_device+0xbc/0x188 [<80194854>] __driver_attach+0x6c/0xa4 [<80193e20>] bus_for_each_dev+0x60/0xb0 [<80193580>] bus_add_driver+0xcc/0x268 [<80194c08>] driver_register+0xe0/0x198 [<801764e0>] __pci_register_driver+0x50/0xe0 [<80365f48>] ath9k_init+0x3c/0x6c [<8006050c>] do_one_initcall+0xfc/0x1d8 [<80355340>] kernel_init+0xd4/0x174 [<800639a4>] kernel_thread_helper+0x10/0x18 ---[ end trace 5345fc6f870564a6 ]--- This patch fixes that warning by using a separate pm_qos_request_list sructure for each device. Signed-off-by: Gabor Juhos Signed-off-by: John W. Linville commit 16ccdf0dbc84b11bc8b7fdbad66804d06a683554 Author: Sven Neumann Date: Wed Nov 24 16:02:00 2010 +0000 libertas: fix invalid access card->priv must not be accessed after lbs_remove_card() was called as lbs_remove_card() frees card->priv via free_netdev(). For libertas_sdio this is a regression introduced by 23b149c1890f9. The correct fix to the issue described there is simply to remove the assignment. This flag is set at the appropriate time inside lbs_remove_card anyway. Reported-by: Daniel Drake Signed-off-by: Sven Neumann Signed-off-by: Daniel Drake Signed-off-by: John W. Linville commit 517ff43146b17a0d067125f098f675d1e0ac2d82 Author: Daniel Drake Date: Wed Nov 24 16:00:49 2010 +0000 libertas: fix memory corruption in lbs_remove_card() "priv" is stored at the end of the wiphy structure, which is freed during the call to lbs_cfg_free(). It must not be touched afterwards. Remove the unnecessary NULL assignment causing this memory corruption. Signed-off-by: Daniel Drake Signed-off-by: John W. Linville commit 6efe04ee4109a9d3fc0d419667f54861628b0d45 Author: Al Cho Date: Fri Nov 26 19:07:27 2010 +0800 staging: keucr: fix keucr init other coding style fix keucr init.c other coding style but not from checkpatch.pl. replace ternary conditional "?:" with if/else. Signed-off-by: Al Cho Signed-off-by: Greg Kroah-Hartman commit e93192acff4eaf7024c2450d91f3de69258f1f12 Author: Al Cho Date: Fri Nov 26 19:06:39 2010 +0800 staging: keucr: fix keucr init coding style fix keucr init.c init.h coding style. only fix coding style check by checkpatch.pl. Signed-off-by: Al Cho Signed-off-by: Greg Kroah-Hartman commit 280740a9016db986758db811bbc998acc79e5551 Author: Vasiliy Kulikov Date: Fri Nov 26 20:06:53 2010 +0300 staging: msm: tvenc: fix error handling Driver init() function should return error code. Also fix tvenc_clk leak. Signed-off-by: Vasiliy Kulikov Signed-off-by: Greg Kroah-Hartman commit 8956110dbbb75773d851854e6e11cd8428fce71a Author: Randy Dunlap Date: Wed Nov 24 11:46:09 2010 -0800 staging: fix intel_sst/intelmid sound build SND_INTELMID selects 3 SND_* kconfig symbols, but that is useless if the SOUND & SND symbols in their hierarchy are not enabled, so make this symbol depend on SOUND & SND. ERROR: "snd_pcm_period_elapsed" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_card_create" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_pcm_hw_constraint_integer" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_device_new" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_pcm_set_ops" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_jack_new" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_pcm_lib_free_pages" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_pcm_lib_ioctl" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_pcm_lib_malloc_pages" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_ctl_new1" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_pcm_lib_preallocate_pages_for_all" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_card_free" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_card_register" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_jack_report" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_pcm_new" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! ERROR: "snd_ctl_add" [drivers/staging/intel_sst/snd-intelmid.ko] undefined! Signed-off-by: Randy Dunlap Signed-off-by: Greg Kroah-Hartman commit fa7a1db200ecb7a5912722a563646935700765a8 Author: Brett Rudley Date: Tue Nov 23 15:30:02 2010 -0800 staging: brcm80211: Remove BUSTYPE macro BUSTYPE isn't used in this configuration. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit c95e66e1fae810110410b59f411110ca671ffb28 Author: Arend van Spriel Date: Tue Nov 23 22:20:31 2010 +0100 staging: brcm80211: remove unused dhd_ops_virt variable definition The variable dhd_ops_virt was used before although its use was rather limited as can be found in previous commit: | commit 4fd68ae1a558043a2cc4ea2faf7235e71c3241aa | Author: Julia Lawall | Date: Tue Oct 26 12:25:33 2010 +0200 | | drivers/staging/brcm80211/brcmfmac/dhd_linux.c: delete double assignment | Reviewed-by: Roland Vossen Reviewed-by: Brett Rudley Signed-off-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit 3be727c8f076cafaf26a1ceda4cad85f5166c8a3 Author: Arend van Spriel Date: Tue Nov 23 22:20:30 2010 +0100 staging: brcm80211: remove some more packet related macros macros PKTHEADROOM and PKTTAILROOM have been replaced by native skbuff functions and macros PKTALLOCED and PKTUNALLOC have been removed. Reviewed-by: Roland Vossen Reviewed-by: Brett Rudley Signed-off-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit 54991ad6d05186bd0324dbdc9c64c5b7952e74c4 Author: Arend van Spriel Date: Tue Nov 23 14:06:24 2010 +0100 staging: brcm80211: removed packet macros for accessing sk_buff fields With the packet storage type changed from void pointer to struct sk_buff pointer there is no need for macros for accessing these fields through casting. These can now be accessed directly. Reviewed-by: Brett Rudley Signed-off-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit c26b1378a71de617fb5ba7da8b6fdc882caed0e8 Author: Arend van Spriel Date: Tue Nov 23 14:06:23 2010 +0100 staging: brcm80211: change packet buffer type to native struct sk_buff The packet queues now store struct sk_buff pointer and subsequently all driver code handling packets now use struct sk_buff as package storage type. Next step will be getting rid of packet macros. Reviewed-by: Brett Rudley Signed-off-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit b6eb5c0f71af22f7b44353a01241fff9a02997af Author: Arend van Spriel Date: Tue Nov 23 14:06:22 2010 +0100 staging: brcm80211: remove unneccessary packets funtion prototype The prototype for function pktsegcnt in bmcutils.h is not defined nor used anywhere in the driver so it can be removed. Reviewed-by: Brett Rudley Signed-off-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit 7c8bc0147f54ecb43f48d9e898ad7f85cb934db7 Author: Arend van Spriel Date: Tue Nov 23 08:04:29 2010 +0100 staging: brcm80211: add include file for using semaphore related definitions Source wl_iw.c uses semaphore definitions and as such should include . Signed-off-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit 57d8cd23c2a0d261bdc959201dd4a33a2080bdfb Author: Brett Rudley Date: Mon Nov 22 16:58:52 2010 -0800 staging: brcm80211: OSL shrink: Remove OSL_PCI_READ/WRITE_CONFIG Replace OSL layer PCI READ/WRITE macros with native calls. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit b99bca8bba85aad229d711522442e8bc30a07068 Merge: 3b93ff030204ca36fb1e9917743bbf22a423e527 857cf1d1e623467622eff3a6b0edc720dcafdd52 Author: Greg Kroah-Hartman Date: Mon Nov 29 11:21:25 2010 -0800 Merge branch 'work' into staging-next commit 857cf1d1e623467622eff3a6b0edc720dcafdd52 Author: Greg Kroah-Hartman Date: Mon Nov 29 11:18:08 2010 -0800 Staging: sep: do not select the driver by default The Kconfig file should not have 'y' as the default, especially as the driver will crash a machine if it is loaded and the hardware is not present. Reported-by: Stephen Rothwell Cc: Mark Allyn Cc: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 77148625e10d0fda50d05e92d199c0df17b66e9a Merge: a41778694806ac1ccd4b1dafed1abef8d5ba98ac 51cce8a590c4696d62bfacc63378d1036084cef7 Author: David S. Miller Date: Mon Nov 29 11:19:09 2010 -0800 Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 commit 3b93ff030204ca36fb1e9917743bbf22a423e527 Author: Greg Kroah-Hartman Date: Mon Nov 29 11:18:08 2010 -0800 Staging: sep: do not select the driver by default The Kconfig file should not have 'y' as the default, especially as the driver will crash a machine if it is loaded and the hardware is not present. Cc: Mark Allyn Cc: Alan Cox Signed-off-by: Greg Kroah-Hartman commit da3f825bc71b420e129b6344be0e3e863ebf8a42 Author: Alan Cox Date: Wed Nov 24 19:39:20 2010 +0000 Staging: sep: Fix crash if a device is not found The existing code works mostly by luck. The PCI probe is done by the register and completes before the register returns thus allowing the other init code to run in time. Without a SEP or if unlucky this doesn't occur and you get an OOPS which for some reason causes grumpiness. As the season of good b^Hcheer is supposed to be approaching we should probably fix it. Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 6f89be93ce6e718a51215336845c70ada06627ba Author: Alan Cox Date: Wed Nov 24 19:39:07 2010 +0000 Staging: sep: clean up a couple of spots missed in pass one Another copy_user case and some formatting of dbg Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 2bb3af58d0f712c728cf1230539044d94c9a3be0 Author: Alan Cox Date: Wed Nov 24 19:38:54 2010 +0000 Staging: sep: cant is an angular inclination So use can't instead. Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 6eb44c531763ff50325822bac749e92938782795 Author: Alan Cox Date: Wed Nov 24 19:38:39 2010 +0000 Staging: sep: Make SEP consistent SEP is initials so make it consistent in the driver, ditto DMA and DCB Consistent capitalisation of comment leads Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 7c9eb69123a634c8551e8887bda03c2e549da233 Author: Alan Cox Date: Wed Nov 24 19:38:21 2010 +0000 Staging: sep: Use kzalloc when needed Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit da14e55130785db243a98523b57ddf56d6c6320a Author: Alan Cox Date: Wed Nov 24 19:38:02 2010 +0000 Staging: sep: clean up some of the obvious sillies Various assignments are done but not used dev_dbg formatting is a bit weird and wraps when not needed Take out some of the blank lines and reformat a bit to reduce view size Remove some comments that are obvious Fix else formatting Remove some user triggerable dev_warns Fix copy_from_user error return cases (-EFAULT not bytes copied) Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit d1bb83213d5b7b3a4e3db59179917a433f82762c Author: Alan Cox Date: Wed Nov 24 19:34:52 2010 +0000 Staging: sep: Fix the kernel-doc in SEP The long blurb goes at the end Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 4c8e2a1f3d5e6b63ebfd26f324a2b24194af37fa Author: Alan Cox Date: Wed Nov 24 19:34:25 2010 +0000 Staging: sep: clean up caller_id function This is called on a kmalloc/memset object. Remove everything that isn't a set to zero Oh look 8) Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 8d80e4e2da31be71b8c1a5def986e10831d2aada Author: Alan Cox Date: Wed Nov 24 19:34:08 2010 +0000 Staging: sep: netlink - what netlink Kill unused stuff Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 266aa856f2c3aeddadd2fcf186d119af10539c3e Author: Alan Cox Date: Wed Nov 24 19:33:55 2010 +0000 Staging: sep: handle the memrar stuff in the headers Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 62a8c3a32e4143812ed8e0f3783ef1ea40dc87e4 Author: Alan Cox Date: Wed Nov 24 19:33:43 2010 +0000 Staging: sep: handle the rar definition stuff in the header SEP isn't the only driver that may need to handle both cases easily Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit de92e3a3b25dd0cda00a07b30c325785b5c2d939 Author: Alan Cox Date: Wed Nov 24 19:33:26 2010 +0000 Staging: sep: minimal fix for wrong include Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 62877913ba55b3f2e5ac34dbc1a2975868ea8d25 Author: Vinod Koul Date: Mon Nov 22 10:33:51 2010 +0000 Staging: sst: add ioctls for post processing algorithm interface This patch adds two new ioctls to intel_sst_ctrl device. This i/f can be used by application to send algorithm parameters Signed-off-by: Vinod Koul [This will need further discussion in the context of the final ALSA interface but is fine for staging, ie anyone who relies on it should expect changes Also fixed a missing kmalloc fail check] Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 79a35ad57300f78c7250eeeca57b602e06ff402a Author: Vinod Koul Date: Mon Nov 22 10:33:40 2010 +0000 Staging: sst: Construct fw string name runtime The firmware name for each platform is appended by PCI id of device. This patch makes use of pci id to construct the string rather than hardcode the string. Signed-off-by: Vinod Koul Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 964c6975e8a4314c451d420f1cb54880ab535433 Author: Vinod Koul Date: Mon Nov 22 10:33:28 2010 +0000 Staging: sst: Add runtime PM support This adds runtime PM support for audio driver. This also fixes LPA audio mode for moorestown platform Signed-off-by: Vinod Koul Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 951c44e0dbfaa580d5b4fb13427ab93ee252636a Author: Sven Eckelmann Date: Mon Nov 22 00:56:07 2010 +0100 Staging: batman-adv: Use kernel functions to identify broadcasts linux/etherdevice.h already provides functions to classify different ethernet addresses. These inlineable functions should be used instead of custom functions. The check for multicast together with multicast can also be replaced with a single test for multicast because for every ethernet address x following is always true: is_broadcast_ether_addr(x) => is_multicast_ether_addr(x) or when looking more at the implementation: (FF:FF:FF:FF:FF:FF == x) => [(01:00:00:00:00:00 & x) != 00:00:00:00:00:00] Reported-by: Tobias Klauser Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 8cab2fbe6dacfdd3b122c450d2fffde6ac06a8b6 Author: Sven Eckelmann Date: Mon Nov 22 00:56:06 2010 +0100 Staging: batman-adv: Use kernel version min macro The kernel headers already provide different versions of a min/max macro which should be used by all modules according to Documentation/CodingStyle. Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 003db3b2ad61c2964d624b0786cf8202e9a92c8e Author: Marek Lindner Date: Mon Nov 22 00:56:05 2010 +0100 Staging: batman-adv: add gateway IPv6 support by filtering DHCPv6 messages Some additional checks will be needed in case of extension headers like the fragmentation or hop-by-hop (for jumbo frames for example) headers or ipsec stuff. But this patch should do for most people for now, the rest can be added with a later one. Signed-off-by: Marek Lindner Acked-by: Linus LĂ¼ssing Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit c9c556b63b19c8b52de5c5ea6f47ab16fc540e47 Author: Marek Lindner Date: Mon Nov 22 00:56:04 2010 +0100 Staging: batman-adv: best gw DHCP filter 802.1Q support The DHCP filter inspects packets to determine whether or not to send them via ethernet unicast. This patch adds 802.1Q (vlan) support for this check. Signed-off-by: Marek Lindner [sven.eckelmann@gmx.de: Rework on top of current version] Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 6c3a42db6ca46204b35f0cdb8abfa9e4771641ef Author: Marek Lindner Date: Mon Nov 22 00:56:03 2010 +0100 Staging: batman-adv: send DHCP requests directly to the chosen gw If the gateway client mode is active batman-adv will send the broadcasted DHCP requests via unicast to the currently selected best gateway. Therefore attached clients can profit from batman's knowledge about the network topology. Signed-off-by: Marek Lindner [sven.eckelmann@gmx.de: Rework on top of current version] Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit dfaf9dd3459cac02411cebf418e8469aa0d8ca5d Author: Marek Lindner Date: Mon Nov 22 00:56:02 2010 +0100 Staging: batman-adv: adding gateway functionality Via the /sys filesystem you can change the gateway mode of a node using gw_mode. Adjustments to it can be done using gw_bandwidth for server mode and gw_sel_class for client mode. Signed-off-by: Marek Lindner [sven.eckelmann@gmx.de: Rework on top of current version] Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 7a18deb7b03e4112af5add8498889f9b2b36d59f Author: Sven Eckelmann Date: Mon Nov 22 00:56:01 2010 +0100 Staging: batman-adv: Limit spin_locks to spin_lock_bh spin_lock_irqsave disables the IRQs and stores them inside the flags provided by the caller. This is needed to protect a bottom half handler or a user context critical section from being interrupted by an interrupt handler which also tries to acquire the spinlock and locks forever. The linux device drivers will receive the packets inside an interrupt handler and the network infrastructure will process them inside bottom half. Thus batman-adv will only run in user context and bottom half handlers. We can conclude that batman-adv doesn't share its own spinlocks with real interrupt handlers. This makes it possible to exchange the quite complex spin_lock_irqsave with spin_lock_bh which only stops bottom halves from running on the current cpu, but allows interrupt handlers to take over to keep the interrupt latency low. Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit bd204952cf161404eae0aa6478fb1b4c586ac678 Author: Sven Eckelmann Date: Mon Nov 22 00:56:00 2010 +0100 Staging: batman-adv: Rewrite hash using hlist_* The hash implementation is a complete implementation of a hash using buckets as hash entries and overflow buckets attached to them. The kernel already provides datastructures hlist_head and hlist_node which can be used to implement an hash using lists as hash buckets. So it is better to implement heavily used functionality on top of those instead of providing a full hash implementation. The rewrite changes the behavior of some functions slightly: * hash_add add elements to the front instead of the tail * hash_iterate doesn't provide pointer to access bucket->data directly, but it can be accessed using hlist_entry Reported-by: David S. Miller Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit a3238c3b379146a2d480dfee4c7f76c4692d7466 Author: Sven Eckelmann Date: Mon Nov 22 00:55:59 2010 +0100 Staging: batman-adv: Make hash_iterate inlineable hash_iterate is next to the function pointers the most called function related to hashes which benefits from inlining as it is uses in loops. Reported-by: David S. Miller Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 60eb502436910fb8118639e2ce4d7a4f732b6754 Author: Sven Eckelmann Date: Mon Nov 22 00:55:58 2010 +0100 Staging: batman-adv: Move hash callback related function to header To enable inlining of the function pointers hashdata_choose_cb, hashdata_choose_cb and hashdata_free_cb, also the hash functions which uses them must be inlined by the called function. This should increase the performance, but also increases the size of the generated machine code slightly. Reported-by: David S. Miller Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 6d5e654240dc14ded3d74aa5df6857572ba9f5e3 Author: Sven Eckelmann Date: Mon Nov 22 00:55:57 2010 +0100 Staging: batman-adv: Remove hashdata_choose_cb from hash Function pointers cannot be inlined by a compiler and thus always has the overhead of an call. hashdata_choose_cb's are one of the most often called function pointers and its overhead must kept relative low. As first step, every function which uses this function pointer takes it as parameter instead of storing it inside the hash abstraction structure. This not generate any performance gain right now. The called functions must also be able to be inlined by the calling functions to enable inlining of the function pointer. Reported-by: David S. Miller Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 51f3d8a27c1a1ac6aced25ea93fc5c0520e9256c Author: Sven Eckelmann Date: Mon Nov 22 00:55:56 2010 +0100 Staging: batman-adv: Remove hashdata_compare_cb from hash Function pointers cannot be inlined by a compiler and thus always has the overhead of an call. hashdata_compare_cb's are one of the most often called function pointers and its overhead must kept relative low. As first step, every function which uses this function pointer takes it as parameter instead of storing it inside the hash abstraction structure. This not generate any performance gain right now. The called functions must also be able to be inlined by the calling functions to enable inlining of the function pointer. Reported-by: David S. Miller Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 1341a00ad356dfb21978ce4e5e979024558042d2 Author: Linus LĂ¼ssing Date: Mon Nov 22 00:55:55 2010 +0100 Staging: batman-adv: Make hop_penalty configurable via sysfs When having a mixed topology of both very mobile and rather static nodes, you are usually best advised to set the originator interval on all nodes to a level best suited for the most mobile node. However, if most of the nodes are rather static, this can create a lot of undesired overhead as a trade-off then. If setting the interval too low on the static nodes, a mobile node might be chosen as a router for too long, not switching away from it fast enough because of its mobility and the low frequency of ogms of static nodes. Exposing the hop_penalty is especially useful for the stated scenario: A static node can keep the default originator interval, a mobile node can select a quicker one resulting in faster route updates towards this mobile node. Additionally, such a mobile node could select a higher hop penalty (or even set it to 255 to disable acting as a router for other nodes) to make it less desirable, letting other nodes avoid selecting this mobile node as a router. Signed-off-by: Linus LĂ¼ssing Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 1623948f879069b33d07986aa95e3b9969322ff4 Author: Linus LĂ¼ssing Date: Mon Nov 22 00:55:54 2010 +0100 Staging: batman-adv: Ommit storing struct device in sysfs functions We actually do not need an extra struct device variable, therefore replacing them with defines that directly get the bat_priv or net_device. This further reduces the code size in bat_sysfs.c and especially shortens some macros. Signed-off-by: Linus LĂ¼ssing Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit add9e1722755072f40d79104db04e350b25624d9 Author: Linus LĂ¼ssing Date: Mon Nov 22 00:55:53 2010 +0100 Staging: batman-adv: Wrapper functions for sysfs storing Sysfs configuration options that just took a boolean value (enable(d)/disable(d)/0/1) and integer setting basically all had the same structure. To avoid even more copy and pasting in the future and to make introducing new configuration parameters for batman-adv simpler, more generic wrapper functions are being introduced with this commit. They can deal with boolean and unsigned integer parameters, storing them in the specified atomic_t variables. Signed-off-by: Linus LĂ¼ssing Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 641ee3f8f4375bde4e216aacd26d286a34efed61 Author: Linus LĂ¼ssing Date: Mon Nov 22 00:55:52 2010 +0100 Staging: batman-adv: Unify sysfs file names with their bat_priv atomics Both sysfs entries and variable names shall be as descriptive as possible while not exceeding a certain length. This patch renames bat_priv atomics to be equally descriptive with their according sysfs entries. Unifying sysfs and bat_priv atomic names also makes it easier to find each others pendant. The reduced ("type"-)information which was previously indicated with a _enabled for booleans got substituted by a comment in bat_priv. This patch has also been done in regards for the future BAT_ATTR_* macros (they only need one name argument instead of a file and variable name). Signed-off-by: Linus LĂ¼ssing Signed-off-by: Marek Lindner Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 420193573f1191b22e08f85ead41c090d283dd05 Author: Marek Lindner Date: Mon Nov 22 00:55:51 2010 +0100 Staging: batman-adv: softif bridge loop avoidance By connecting multiple batman-adv mesh nodes to the same ethernet segment a loop can be created when the soft-interface is bridged into that ethernet segment. A simple visualization of the loop involving the most common case - a LAN as ethernet segment: node1 <-- LAN --> node2 | | wifi <-- mesh --> wifi Packets from the LAN (e.g. ARP broadcasts) will circle forever from node1 or node2 over the mesh back into the LAN. This patch adds the functionality to detect other batman-adv nodes connected to the LAN and select a 'gateway' to talk to the non-batman-adv devices on this LAN. All traffic from and to the mesh will be handled by this gateway to avoid the loop. OGMs received via the soft-interface are interpreted as 'port announcements' to locate potential batman-adv nodes. The patch can also deal with vlans on top of batX and offers a list of LAN neighbors via debugfs. Signed-off-by: Marek Lindner [sven.eckelmann@gmx.de: Rework on top of current version] Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 225f7b0b950d141819a8d9694141571b349e563d Author: Andreas Langer Date: Mon Nov 22 00:55:50 2010 +0100 Staging: batman-adv: reassemble fragmented skb if mtu allows it Signed-off-by: Andreas Langer Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 9061109ab18352c73b5dda426043dbb6d5e2dae7 Author: Andreas Langer Date: Mon Nov 22 00:55:49 2010 +0100 Staging: batman-adv: fragment forwarded packets If a packet is too big to be forwarded over an interface it will be fragmented on-the-fly (if fragmentation is enabled). Signed-off-by: Andreas Langer Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit b8cd75445e842b11a0a8ff1e763303a575c21c77 Author: Andreas Langer Date: Mon Nov 22 00:55:48 2010 +0100 Staging: batman-adv: remove redundant is_my_mac() check in route_unicast_packet Callers should check the if the received packet is for us before it calls route_unicast_packet. Signed-off-by: Andreas Langer Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit f3cc7595d242a22a9ffba91979d2cd4e4e815424 Author: Andreas Langer Date: Mon Nov 22 00:55:47 2010 +0100 Staging: batman-adv: move skb reassembly of fragmented packets into dedicated function Signed-off-by: Andreas Langer Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 8bbde32cf5bd9dbe2f53d562f563b465c0829b23 Author: Andreas Langer Date: Mon Nov 22 00:55:46 2010 +0100 Staging: batman-adv: add frag_ prefix to all fragmentation related functions Signed-off-by: Andreas Langer Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 49b588e79f7c85aec05008a945fdf17d281e83f9 Author: Andreas Langer Date: Mon Nov 22 00:55:45 2010 +0100 Staging: batman-adv: restructure fragmentation to handle batman unicast packets The unicast_frag_send_skb() function expected 'raw' packets (without any batman-adv header) to fragment them. This needs to be changed, so that this function is able to fragment packets that already traveled inside the mesh but need to be fragmented now. Signed-off-by: Andreas Langer Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 3f427604d669031343af8e6ecd8d1cc7a6408ab2 Author: Marek Lindner Date: Mon Nov 22 00:55:44 2010 +0100 Staging: batman-adv: use rcu callbacks when freeing batman_if Signed-off-by: Marek Lindner Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit b4abfcd4c79ec12340b4c68e3a211badd3c90e20 Author: Marek Lindner Date: Mon Nov 22 00:55:43 2010 +0100 Staging: batman-adv: convert batman_if custom refcounting to kref functions Signed-off-by: Marek Lindner Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit bd27509f49ab841bc10fd604ccd9e7f9914b7120 Author: Sven Eckelmann Date: Mon Nov 22 00:55:42 2010 +0100 Staging: batman-adv: Don't remove interface with spinlock held We call a lot of the netdevice code when holding if_list_lock which will spin the whole time. This is not necessary because we only want to protect the access to the list to be serialized. An extra queue can be used which hold all interfaces which should be removed and then use that queue without any locks for netdevice cleanup. Reported-by: Rafal Lesniak Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 43fc987224a45dc53ccc302df5889230d9587921 Author: Sven Eckelmann Date: Mon Nov 22 00:55:41 2010 +0100 Staging: batman-adv: Add new sysfs files to README Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 2f1646788f4d3cd2ce5cb24d13096afbd8782665 Author: Marek Lindner Date: Mon Nov 22 00:55:40 2010 +0100 Staging: batman-adv: ensure that eth_type_trans gets linear memory eth_type_trans tries to pull data with the length of the ethernet header from the skb. We only ensured that enough data for the first ethernet header and the batman header is available in non-paged memory of the skb and not for the ethernet after the batman header. eth_type_trans would fail sometimes with drivers which don't ensure that all there data is perfectly linearised. Reported-by: Rafal Lesniak Signed-off-by: Marek Lindner Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 4f26559156eae1b616ef2d0d168bd25f493e02f4 Author: Sven Eckelmann Date: Mon Nov 22 00:55:39 2010 +0100 Staging: batman-adv: Replace Andrew Lunn as Staging maintainer Andrew Lunn didn't submit patches to staging since a while and may not be the right person for new patches. Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 4f76548299196e0fd880469a39552ccde797474b Author: Michael Hennerich Date: Tue Nov 23 11:40:13 2010 +0100 staging: iio: dac: ad5446: Remove unused sign member from chip specific information structure Remove unused sign member from chip specific information structure Fix typos Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit d846263da4c6032b7a9440d335794ef8d3e76dfb Author: Michael Hennerich Date: Tue Nov 23 11:14:16 2010 +0100 staging: iio: dac: ad5446: Enable driver support for AD5620/AD5640/AD5660 DA converters Initial support for single channel, 12-/14-/16-Bit nanoDAC with On-Chip Reference staging: iio: dac: ad5446: Fix according to review feedback Review feedback by Jonathan Cameron: Use kernel doc style to document headers. Turn data into a union Add some comments for clarity Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit f386caa3cd74231cd86c813fe4453e3d6e39876c Author: Jonathan Cameron Date: Mon Nov 22 23:31:16 2010 +0000 staging: iio: documentation rewrite and cleanup of sysfs documetation Change to capital syntax for documetation e.g. 'inX-inY_raw' Use multiple 'What:' entries rather than wild cards or options so as to make the documentation clearer and easier to search. Some trivial spelling fixes. Signed-off-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit fe34604844c151668579cb6ad52f75a5c651bed9 Author: Jonathan Cameron Date: Mon Nov 22 23:09:48 2010 +0000 staging: iio: adis16260 add suppport for adis16255 and adis16250. Unusual element is addition of 'negate' and 'axis' platform data to ensure we support all the functionality of the adis16255 driver currently in staging. Signed-off-by: Jonathan Cameron Acked-by: Matthias Brugger Signed-off-by: Greg Kroah-Hartman commit a9672951a5c4e57e048895d868a2172962ef7ffd Author: Jonathan Cameron Date: Mon Nov 22 23:09:47 2010 +0000 staging: iio: adis16260 add id table support Signed-off-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit 2b4756aa36909a94596752db341a0a2c8bb8c6ea Author: Michael Hennerich Date: Mon Nov 22 14:35:32 2010 +0100 staging: iio: adc: Enable driver support for ad7887 AD converter Enable support for AD7887: SPI Micropower, 2-Channel, 125 kSPS, 12-Bit ADC staging: iio: adc: Fix according to review feedback Review feedback by Jonathan Cameron: Combine statements. Document struct members. Remove redundant variable initialization. Simplify multichannel scan from ring logic. Fix coding style. [v2] staging: iio: adc: ad7887: Fix typos Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit b5a49481754a5cbfdc47bd701208f77c5c9010c6 Author: Michael Hennerich Date: Mon Nov 22 11:15:23 2010 +0100 staging: iio: dac: Enable driver support for AD5444 and AD5446 DA converters Enable support for AD5444 and AD5446: 12-/14-Bit High Bandwidth Multiplying DACs with Serial Interface. staging: iio: dac: Add support for AD5541A, AD5512A digital to analog convertors staging: iio: dac: Fix according to review feedback Review feedback by Jonathan Cameron: Remove spurious new line. Document struct members. Remove redundant variable initialization. Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit 95bd48578bbe66fa5d16029c59dfbe95749a5f0b Author: Huang Weiyi Date: Sat Nov 20 20:06:18 2010 +0800 staging: brcm80211: remove duplicated #include Remove duplicated #include('s) in drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c Signed-off-by: Huang Weiyi Signed-off-by: Greg Kroah-Hartman commit 72f9fc7c8150873d51c61cfb885dc7fbb075d62a Author: Randy Dunlap Date: Mon Nov 22 12:12:37 2010 -0800 staging: easycap needs smp_lock.h, fixes build error Add header file to fix build error: drivers/staging/easycap/easycap_main.c:4251: error: implicit declaration of function 'lock_kernel' drivers/staging/easycap/easycap_main.c:4254: error: implicit declaration of function 'unlock_kernel' Signed-off-by: Randy Dunlap Signed-off-by: Jiri Kosina Signed-off-by: Greg Kroah-Hartman commit b6faaae1a15a352d68b3e3cd8b840e56709820bf Author: Marek Lindner Date: Mon Nov 22 12:34:49 2010 +0100 Staging: batman-adv: ensure that eth_type_trans gets linear memory eth_type_trans tries to pull data with the length of the ethernet header from the skb. We only ensured that enough data for the first ethernet header and the batman header is available in non-paged memory of the skb and not for the ethernet after the batman header. eth_type_trans would fail sometimes with drivers which don't ensure that all there data is perfectly linearised. The failure was noticed through a kernel bug Oops generated by the skb_pull inside eth_type_trans. Reported-by: Rafal Lesniak Signed-off-by: Marek Lindner Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 9ee898739b7e4d292abed911008b3f91b442118a Author: Sven Eckelmann Date: Mon Nov 22 12:34:50 2010 +0100 Staging: batman-adv: Don't remove interface with spinlock held We call a lot of the netdevice code when holding if_list_lock which will spin the whole time. This is not necessary because we only want to protect the access to the list to be serialized. An extra queue can be used which hold all interfaces which should be removed and then use that queue without any locks for netdevice cleanup. We create a "scheduling while atomic" Oops when calling different netdevice related functions inside a spinlock protected area on a preemtible kernel. Reported-by: Rafal Lesniak Signed-off-by: Sven Eckelmann Signed-off-by: Greg Kroah-Hartman commit 6df78338e7af7960b67fa00aa2a5c63986a23d3c Author: Arend van Spriel Date: Sat Nov 20 12:07:16 2010 +0100 staging: brcm80211: updated maintainers contact information Open-source development team extended so contacts updated. Reviewed-by: Brett Rudley Signed-off-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit c5d1b51d3559664920136b45f4d2366ed9a9e8be Author: Chris Wilson Date: Mon Nov 29 18:00:23 2010 +0000 drm/i915: Clear pfit registers when not used by any outputs ... otherwise the panel-fitter may be left enabled with random settings and cause unintended filtering (i.e. blurring of native modes on external panels). Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=31942 Reported-and-tested-by: Ben Kohler Tested-by: Ciprian Docan Signed-off-by: Chris Wilson commit 8d7ee9c498e29026aa2a99db40c0032bfe2d4fdf Merge: 412dc7f368bf10a8049a8a4c41abbfd0108742e7 72083646528d4887b920deb71b37e09bc7d227bb Author: Greg Kroah-Hartman Date: Mon Nov 29 10:44:22 2010 -0800 Merge branch 'master' into work commit 39a545559f8d5f13e8a4a7dfddcaad0e2ba9bcfb Author: Axel Lin Date: Mon Nov 29 14:55:58 2010 +0800 ASoC: Add missing dev_set_drvdata in p1022_ds_probe Otherwise, calling dev_get_drvdata in p1022_ds_remove returns NULL. Signed-off-by: Axel Lin Acked-by: Timur Tabi Acked-by: Liam Girdwood Signed-off-by: Mark Brown commit 67bd489aa309a680b1462ad635df29e8825152d2 Author: Axel Lin Date: Mon Nov 29 14:54:58 2010 +0800 ASoC: Add missing dev_set_drvdata in mpc8610_hpcd_probe Otherwise, calling dev_get_drvdata in mpc8610_hpcd_remove returns NULL. Signed-off-by: Axel Lin Acked-by: Timur Tabi Acked-by: Liam Girdwood Signed-off-by: Mark Brown commit 3f90e5028a03be4496a04e4599b16f4420ff1304 Author: Axel Lin Date: Mon Nov 29 17:43:39 2010 +0800 ASoC: Remove unneeded !! operations while checking return value of nuc900_checkready I think this unneededd !! operations just reduce the readability. Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown commit a7a9820bae19775df1d6cc70d2571ee26e099413 Author: Axel Lin Date: Mon Nov 29 17:40:53 2010 +0800 ASoC: Fix compile error for nuc900-pcm.c This patch fixes below error: CC sound/soc/nuc900/nuc900-pcm.o sound/soc/nuc900/nuc900-pcm.c: In function 'nuc900_dma_open': sound/soc/nuc900/nuc900-pcm.c:267: error: 'nuc900_ac97_data' undeclared (first use in this function) sound/soc/nuc900/nuc900-pcm.c:267: error: (Each undeclared identifier is reported only once sound/soc/nuc900/nuc900-pcm.c:267: error: for each function it appears in.) sound/soc/nuc900/nuc900-pcm.c: At top level: sound/soc/nuc900/nuc900-pcm.c:337: error: expected ',' or ';' before 'static' sound/soc/nuc900/nuc900-pcm.c:354: error: 'nuc900_soc_platform_probe' undeclared here (not in a function) make[3]: *** [sound/soc/nuc900/nuc900-pcm.o] Error 1 make[2]: *** [sound/soc/nuc900] Error 2 make[1]: *** [sound/soc] Error 2 make: *** [sound] Error 2 Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown commit e3edefbd4a9071daf388978355f69c37fbeae261 Author: Axel Lin Date: Mon Nov 29 17:40:05 2010 +0800 ASoC: Fix prototype for nuc900_ac97_probe and nuc900_ac97_remove This patch fixes below compile warning: CC sound/soc/nuc900/nuc900-ac97.o sound/soc/nuc900/nuc900-ac97.c:300: warning: initialization from incompatible pointer type sound/soc/nuc900/nuc900-ac97.c:301: warning: initialization from incompatible pointer type Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown commit 5a8f1d4701a50bc2a1e112f6c8e7d30f63597eae Author: Axel Lin Date: Mon Nov 29 17:39:10 2010 +0800 ASoC: Fix compile error for nuc900-ac97.c Fix below compile error by add a missing ';'. CC sound/soc/nuc900/nuc900-ac97.o sound/soc/nuc900/nuc900-ac97.c:300: warning: initialization from incompatible pointer type sound/soc/nuc900/nuc900-ac97.c:301: warning: initialization from incompatible pointer type sound/soc/nuc900/nuc900-ac97.c:318: error: expected ',' or ';' before 'static' sound/soc/nuc900/nuc900-ac97.c:405: error: 'nuc900_ac97_drvprobe' undeclared here (not in a function) make[3]: *** [sound/soc/nuc900/nuc900-ac97.o] Error 1 make[2]: *** [sound/soc/nuc900] Error 2 make[1]: *** [sound/soc] Error 2 make: *** [sound] Error 2 Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown commit 523fb8c867650196bef830d5dd9315d9975a9b7e Author: Suresh Jayaraman Date: Mon Nov 29 22:39:47 2010 +0530 cifs: trivial comment fix for cifs_invalidate_mapping Only the callers check whether the invalid_mapping flag is set and not cifs_invalidate_mapping(). Signed-off-by: Suresh Jayaraman Signed-off-by: Steve French commit a41778694806ac1ccd4b1dafed1abef8d5ba98ac Author: Eric Dumazet Date: Sun Nov 28 21:43:02 2010 +0000 xps: add __rcu annotations Avoid sparse warnings : add __rcu annotations and use rcu_dereference_protected() where necessary. Signed-off-by: Eric Dumazet Cc: Tom Herbert Signed-off-by: David S. Miller commit b02038a17b271e0f70616c54e4eccb5cc33d1b74 Author: Eric Dumazet Date: Sun Nov 28 05:43:24 2010 +0000 xps: NUMA allocations for per cpu data store_xps_map() allocates maps that are used by single cpu, it makes sense to use NUMA allocations. Signed-off-by: Eric Dumazet Cc: Tom Herbert Signed-off-by: David S. Miller commit 49b4a6546fac02f58784f0744e0f99a6562ccc03 Author: Shan Wei Date: Mon Nov 29 00:14:58 2010 +0000 sctp: kill unused macros in head file 1. SCTP_CMD_NUM_VERBS,SCTP_CMD_MAX These two macros have never been used for several years since v2.6.12-rc2. 2.sctp_port_rover,sctp_port_alloc_lock The commit 063930 abandoned global variables of port_rover and port_alloc_lock, but still keep two macros to refer to them. So, remove them now. commit 06393009000779b00a558fd2f280882cc7dc2008 Author: Stephen Hemminger Date: Wed Oct 10 17:30:18 2007 -0700 [SCTP]: port randomization Signed-off-by: Shan Wei Signed-off-by: David S. Miller commit d65c3768afb47fb93c43fbfcafef53502edaaa85 Author: Simon Wood Date: Mon Nov 29 17:41:23 2010 +0100 HID: add support for F430 Force Feedback Wheel This patch adds USB IDs to enable force feedback on the Thrustmaster F430 wheel. Antonio did the work, I just converted to git patch to include in Kernel. Reported-by: Antonio Orefice Signed-off-by: Simon Wood Signed-off-by: Jiri Kosina commit 44266416f786514ec43a0d15ad951c34566b99c9 Author: Anton Vorontsov Date: Mon Nov 29 18:46:22 2010 +0300 ARM: cns3xxx: Fix build with CONFIG_PCI=y commit 6338a6aa7c082f11d55712251e14178c68bf5869 ("ARM: 6269/1: Add 'code' parameter for hook_fault_code()") breaks CNS3xxx build: CC arch/arm/mach-cns3xxx/pcie.o pcie.c: In function 'cns3xxx_pcie_init': pcie.c:373: warning: passing argument 4 of 'hook_fault_code' makes integer from pointer without a cast pcie.c:373: error: too few arguments to function 'hook_fault_code' This commit fixes the small issue. Cc: stable@kernel.org [36] Signed-off-by: Anton Vorontsov commit 7f51439a3c078393e7618a636fea403afa35948c Author: Konstantin Sinyuk Date: Tue Nov 16 08:55:03 2010 +0200 [ARM] Dove: add support for CM-A510 machine. This patch adds support for CM-A510 machine Signed-off-by: Konstantin Sinyuk Signed-off-by: Mike Rapoport Reviewed-by: Saeed Bishara Signed-off-by: Nicolas Pitre commit 1ccb53a4f3d0bfd65889fcfe988d829633641f49 Author: Evgeniy Dushistov Date: Tue Nov 9 22:46:17 2010 +0300 [ARM] mv78xx: wrong cpu1 window base register address The constant DDR_WINDOW_CPU1_BASE has wrong value. Because of that mv78xx0_mbus_dram_info is not filled properly on start, and in its turn drivers, that used mv78xx0_mbus_dram_info, in my case mv643xx_eth.c, not work on second core. According to MV76100, MV78100, and MV78200 DiscoveryTM Innovation Series CPU Family Functional Specifications address should be 0x1570. Signed-off-by: Evgeniy Dushistov Acked-by: Lennert Buytenhek Signed-off-by: Nicolas Pitre commit 760efe6910d5743084b586d3d0a3b65aea96fb2f Author: Mac Lin Date: Thu Nov 25 23:58:00 2010 +0800 USB: cns3xxx: Add EHCI and OHCI bus glue for cns3xxx SOCs The CNS3XXX SOC has include USB EHCI and OHCI compatible controllers. This patch adds the necessary glue logic to allow ehci-hcd and ohci-hcd drivers to work on CNS3XXX The EHCI and OHCI controllers share a common clock control and reset bit, therefore additional check for the timming of enabling and disabling is required. The USB bit of PLL Power Down Control is also shared by OTG, 24MHzUART clock, Crypto clock, PCIe reference clock, and Clock Scale Generator. Therefore we only ensure it is enabled, while not disabling it. Signed-off-by: Mac Lin Acked-by: Alan Stern Acked-by: Greg Kroah-Hartman Signed-off-by: Anton Vorontsov commit 5478755616ae2ef1ce144dded589b62b2a50d575 Author: Xiaotian Feng Date: Mon Nov 29 10:03:55 2010 +0100 block: check for proper length of iov entries earlier in blk_rq_map_user_iov() commit 9284bcf checks for proper length of iov entries in blk_rq_map_user_iov(). But if the map is unaligned, kernel will break out the loop without checking for the proper length. So we need to check the proper length before the unalign check. Signed-off-by: Xiaotian Feng Cc: stable@kernel.org Signed-off-by: Jens Axboe commit e4dde731ae70072338352c6f8fb75fd04a42cf8d Author: Michael S. Tsirkin Date: Mon Nov 29 10:19:07 2010 +0200 vhost: correctly set bits of dirty pages Fix two bugs in dirty page logging: When counting pages we should increase address by 1 instead of VHOST_PAGE_SIZE. Make log_write() correctly process requests that cross pages with write_address not starting at page boundary. Reported-by: Jason Wang Signed-off-by: Michael S. Tsirkin commit ac70eb1305d5a81efd1e32327d7e79be15a63a5a Author: Daniel T Chen Date: Sat Nov 27 13:58:04 2010 -0500 ALSA: hda: Use BIOS auto-parsing instead of existing model quirk for MEDION MD2 BugLink: https://launchpad.net/bugs/682199 A 2.6.35 (Ubuntu Maverick) user, burningphantom1, reported a regression in audio: playback was inaudible through both speakers and headphones. In commit 272a527c04 of sound-2.6.git, a new model was added with this machine's PCI SSID. Fortunately, it is now sufficient to use the auto model for BIOS auto-parsing instead of the existing quirk. Playback, capture, and jack sense were verified working for both 2.6.35 and the alsa-driver snapshot from 2010-11-27 when model=auto is used. Reported-and-tested-by: burningphantom1 Cc: [2.6.35+] Signed-off-by: Daniel T Chen Signed-off-by: Takashi Iwai commit eb87e6770a9b1ad54b13fcfe80a1346d0c257536 Author: Kuninori Morimoto Date: Mon Nov 29 06:19:52 2010 +0000 ARM: mach-shmobile: mackerel: Add lost GPIO_FN_LCDD 18 - 23 RGB24 bus needs 18-23 pin Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit c5027dec02c96964847fa68d512318ee5f6f7a19 Author: Keith Packard Date: Fri Nov 26 10:45:59 2010 -0800 drm: record monitor status in output_poll_execute In order to correctly report monitor connected status changes, the previous monitor status must be recorded in the connector->status value instead of being discarded. Signed-off-by: Keith Packard Signed-off-by: Dave Airlie commit bf9dc102e284a5aa78c73fc9d72e11d5ccd8669f Author: Keith Packard Date: Fri Nov 26 10:45:58 2010 -0800 drm: Set connector DPMS status to ON in drm_crtc_helper_set_config When setting a new crtc configuration, force the DPMS state of all connectors to ON. Otherwise, they'll be left at OFF and a future mode set that disables the specified connector will not turn the connector off. Signed-off-by: Keith Packard Signed-off-by: Dave Airlie commit f4f0c135de9d359e22172adfb1d30ddcb38c00a7 Author: Kuninori Morimoto Date: Mon Nov 29 13:25:22 2010 +0900 ARM: mach-shmobile: mackerel: Add mackerel defconfig Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit 4b82b68925d19ab32159ba94b30768f705812e0f Author: Kuninori Morimoto Date: Mon Nov 29 02:21:48 2010 +0000 ARM: mach-shmobile: mackerel: document switch and pin modes. Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit 11fee467a119afac02d336bf41dcd9c4db2b6106 Author: Kuninori Morimoto Date: Mon Nov 29 02:21:43 2010 +0000 ARM: mach-shmobile: mackerel: Add LCDC support Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit 2264c151efa632fa8aab7377d13d9aa1476547bf Author: Kuninori Morimoto Date: Mon Nov 29 02:21:37 2010 +0000 ARM: mach-shmobile: mackerel: Add SMSC support Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit 920adc75d51d23fe3e8a7ce2c946b2b24e6f7742 Author: Kuninori Morimoto Date: Mon Nov 29 02:21:21 2010 +0000 ARM: mach-shmobile: Add mackerel board support Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit 208c7dc2727ec0fbc678da5e749bcc178c08463d Author: Kuninori Morimoto Date: Mon Nov 29 02:10:08 2010 +0000 ARM: mach-shmobile: ag5evm: Add FSI resources Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit 193006f7e3b1abd42d7a3677b54fa2996461a842 Author: Vasiliy Kulikov Date: Fri Nov 26 17:06:28 2010 +0000 sh: boards: mach-se: use IS_ERR() instead of NULL check clk_get() returns ERR_PTR() on error, not NULL. Signed-off-by: Vasiliy Kulikov Reviewed-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit 4bd5d259e451d35380de2fcd1a3510ae22d000a3 Author: Kuninori Morimoto Date: Fri Nov 26 09:40:22 2010 +0000 sh: Add div6_reparent_clks to clock framework for FSI Current clk_ops doesn't support .init which is used to select external clock on ecovec without CONFIG_SH_CLK_CPG_LEGACY. To solve this problem, this patch add div6_reparent_clks to clock-sh7724. This patch solve compile error too. Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit 22efa0fee32d9e7f6f6fbc396a872b5708d86048 Author: Simon Horman Date: Sat Nov 27 00:11:55 2010 +0000 sh, mmc: Use defines when setting CE_CLK_CTRL The 16-19th bits of CE_CLK_CTRL set the MMC clock frequency. Cc: Yusuke Goda Cc: Magnus Damm Signed-off-by: Simon Horman Signed-off-by: Paul Mundt commit 1ae0affedce1d3e401991fbe7f2674753f0a7641 Author: Simon Horman Date: Fri Nov 26 23:02:58 2010 +0000 mmc, sh: Correct value for reset This resolves a regression that I introduced in "mmc, sh: Move constants to sh_mmcif.h". Having examined the manual and tested the code on an AP4EVB board it seems that the correct sequence is. 1) Write 1 to bit 31 and zeros to all other bits 2) Write zero to all bits Cc: Yusuke Goda Cc: Magnus Damm Signed-off-by: Simon Horman Signed-off-by: Paul Mundt commit 7211a1bae6eac26539eb2d77a26fcd1bccef8137 Author: Simon Horman Date: Fri Nov 26 23:02:57 2010 +0000 sh, mmc: Make mmcif_update_progress static inline extern inline doesn't make much sense Cc: Yusuke Goda Cc: Magnus Damm Signed-off-by: Simon Horman Signed-off-by: Paul Mundt commit e9248fbd6b6f7ef1917bfffe998654e40dfb4cfd Author: Scott J. Goldman Date: Sat Nov 27 10:33:55 2010 +0000 vmxnet3: fix compilation when RSS is disabled If RSS is disabled, we can ifdef out some RSS specific code. This fixes the compile error found by Randy Dunlap. Signed-off-by: Scott J. Goldman Reviewed-by: Bhavesh Davda Signed-off-by: David S. Miller commit bf26414510103448ad3dc069c7422462f03ea3d7 Author: Tom Herbert Date: Fri Nov 26 08:36:09 2010 +0000 xps: Add CONFIG_XPS This patch adds XPS_CONFIG option to enable and disable XPS. This is done in the same manner as RPS_CONFIG. This is also fixes build failure in XPS code when SMP is not enabled. Signed-off-by: Tom Herbert Signed-off-by: David S. Miller commit 8fa9208e305e24978b897d6ea057604444ce77e1 Author: Frank Blaschka Date: Fri Nov 26 02:41:20 2010 +0000 qeth: l3 fix len in tso hdr The tso hdr is longer then the regular l3 hdr. Fix the calculation of the total len by accounting the size of the tso hdr. Signed-off-by: Frank Blaschka Signed-off-by: David S. Miller commit 2b6203bb7d85e6a2ca2088b8684f30be70246ddf Author: Ursula Braun Date: Fri Nov 26 02:41:19 2010 +0000 qeth: enable interface setup if LAN is offline Device initialization of a qeth device contains a STARTLAN step. This step may fail, if cable is not yet plugged in. The qeth device stays in state HARDSETUP until cable is plugged in. This prevents further preparational initialization steps of the qeth device and its network interface. This patch makes sure initialization of qeth device continues, even though cable is not yet plugged in. Once carrier is available, qeth is notified, triggers a recovery which results in a working network interface. Signed-off-by: Ursula Braun Signed-off-by: Frank Blaschka Signed-off-by: David S. Miller commit cdac082e051136a021f28d0f63c56e916b541253 Author: Joe Perches Date: Fri Nov 26 02:41:18 2010 +0000 drivers/s390/net: Remove unnecessary semicolons Signed-off-by: Joe Perches Signed-off-by: Frank Blaschka Signed-off-by: David S. Miller commit f3aa3136d9c15ff693198eb34701a74bb0b6b969 Author: Sachin Sant Date: Fri Nov 26 02:41:17 2010 +0000 qeth lcs: convert mc rwlock to RCU Commit 1d7138de878d1d4210727c1200193e69596f93b3 igmp: RCU conversion of in_dev->mc_list converted rwlock to RCU. Update the s390 network drivers(qeth & lcs) code to adapt to this change. V2 : Changes based on suggestions given by Eric Dumazet Signed-off-by: Sachin Sant Signed-off-by: Ursula Braun Signed-off-by: Frank Blaschka Signed-off-by: David S. Miller commit 5e9559689735f760f3a1fb9b2aafeb4d8efbf8f5 Author: Giuseppe Cavallaro Date: Sun Nov 28 18:10:53 2010 -0800 stmmac: fix stmmac_resume removing not yet used shutdown flag The commit to convert to use the dev_pm_ops struct introduces a bug. The shutdown flag is not yet used because the hibernation on memory is done by using the freeze callback. Thanks to Vlad for having reported it. Reported-by: Vlad Lungu Signed-off-by: Giuseppe Cavallaro Signed-off-by: David S. Miller commit de855b992d75e49816eb09231764e7a63a4f555d Author: Szymon Janc Date: Sat Nov 27 08:39:48 2010 +0000 forcedeth: use usleep_range not msleep for small sleeps Signed-off-by: Szymon Janc Signed-off-by: David S. Miller commit 34cf97eb255b09751f1eb1b5573813e9ea3fe21f Author: Szymon Janc Date: Sat Nov 27 08:39:46 2010 +0000 forcedeth: do not use assignment in if conditions Signed-off-by: Szymon Janc Signed-off-by: David S. Miller commit 5504e1397cc860e61fbb68c56e7a10db613275fd Author: Szymon Janc Date: Sat Nov 27 08:39:45 2010 +0000 forcedeth: include and instead of and as suggested by checkpatch Signed-off-by: Szymon Janc Signed-off-by: David S. Miller commit 9b03b06b65856f70564c53654d44053f3072379e Author: Szymon Janc Date: Sat Nov 27 08:39:44 2010 +0000 forcedeth: remove unnecessary checks before kfree Signed-off-by: Szymon Janc Signed-off-by: David S. Miller commit 78aea4fc67a7534d5f5bbb0419a2bcb50b0547c9 Author: Szymon Janc Date: Sat Nov 27 08:39:43 2010 +0000 forcedeth: fix multiple code style issues Signed-off-by: Szymon Janc Signed-off-by: David S. Miller commit 47c05314328d9c40f6006783dc4c1e3080bd2914 Author: Joe Perches Date: Sun Nov 28 00:02:59 2010 +0000 zd1211rw: document need for kmalloc cast Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit e80be0b0ee307a2801e57cf36333d3d659e4bcc6 Author: Joe Perches Date: Sat Nov 27 23:05:45 2010 +0000 vxge: remove unnecessary [kv][mcz]alloc casts Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit f3167460144cd2c24b964a32d40d32f851b5d5f4 Author: Joe Perches Date: Sat Nov 27 23:05:44 2010 +0000 qlcnic: remove unnecessary [kv][mcz]alloc casts Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 0acdf68f495793143802dd4f3e47918dddcceed7 Author: Joe Perches Date: Sat Nov 27 23:05:43 2010 +0000 netxen: remove unnecessary [kv][mcz]alloc casts Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit b4e0d5f0791bd6dd12a1c1edea0340969c7c1f90 Author: Casey Schaufler Date: Wed Nov 24 17:12:10 2010 -0800 Smack: UDS revision This patch addresses a number of long standing issues with the way Smack treats UNIX domain sockets. All access control was being done based on the label of the file system object. This is inconsistant with the internet domain, in which access is done based on the IPIN and IPOUT attributes of the socket. As a result of the inode label policy it was not possible to use a UDS socket for label cognizant services, including dbus and the X11 server. Support for SCM_PEERSEC on UDS sockets is also provided. Signed-off-by: Casey Schaufler Signed-off-by: James Morris commit 7e70cb4978507cf31d76b90e4cfb4c28cad87f0c Author: Mimi Zohar Date: Tue Nov 23 18:55:35 2010 -0500 keys: add new key-type encrypted Define a new kernel key-type called 'encrypted'. Encrypted keys are kernel generated random numbers, which are encrypted/decrypted with a 'trusted' symmetric key. Encrypted keys are created/encrypted/decrypted in the kernel. Userspace only ever sees/stores encrypted blobs. Changelog: - bug fix: replaced master-key rcu based locking with semaphore (reported by David Howells) - Removed memset of crypto_shash_digest() digest output - Replaced verification of 'key-type:key-desc' using strcspn(), with one based on string constants. - Moved documentation to Documentation/keys-trusted-encrypted.txt - Replace hash with shash (based on comments by David Howells) - Make lengths/counts size_t where possible (based on comments by David Howells) Could not convert most lengths, as crypto expects 'unsigned int' (size_t: on 32 bit is defined as unsigned int, but on 64 bit is unsigned long) - Add 'const' where possible (based on comments by David Howells) - allocate derived_buf dynamically to support arbitrary length master key (fixed by Roberto Sassu) - wait until late_initcall for crypto libraries to be registered - cleanup security/Kconfig - Add missing 'update' keyword (reported/fixed by Roberto Sassu) - Free epayload on failure to create key (reported/fixed by Roberto Sassu) - Increase the data size limit (requested by Roberto Sassu) - Crypto return codes are always 0 on success and negative on failure, remove unnecessary tests. - Replaced kzalloc() with kmalloc() Signed-off-by: Mimi Zohar Signed-off-by: David Safford Reviewed-by: Roberto Sassu Signed-off-by: James Morris commit d00a1c72f7f4661212299e6cb132dfa58030bcdb Author: Mimi Zohar Date: Tue Nov 23 17:50:34 2010 -0500 keys: add new trusted key-type Define a new kernel key-type called 'trusted'. Trusted keys are random number symmetric keys, generated and RSA-sealed by the TPM. The TPM only unseals the keys, if the boot PCRs and other criteria match. Userspace can only ever see encrypted blobs. Based on suggestions by Jason Gunthorpe, several new options have been added to support additional usages. The new options are: migratable= designates that the key may/may not ever be updated (resealed under a new key, new pcrinfo or new auth.) pcrlock=n extends the designated PCR 'n' with a random value, so that a key sealed to that PCR may not be unsealed again until after a reboot. keyhandle= specifies the sealing/unsealing key handle. keyauth= specifies the sealing/unsealing key auth. blobauth= specifies the sealed data auth. Implementation of a kernel reserved locality for trusted keys will be investigated for a possible future extension. Changelog: - Updated and added examples to Documentation/keys-trusted-encrypted.txt - Moved generic TPM constants to include/linux/tpm_command.h (David Howell's suggestion.) - trusted_defined.c: replaced kzalloc with kmalloc, added pcrlock failure error handling, added const qualifiers where appropriate. - moved to late_initcall - updated from hash to shash (suggestion by David Howells) - reduced worst stack usage (tpm_seal) from 530 to 312 bytes - moved documentation to Documentation directory (suggestion by David Howells) - all the other code cleanups suggested by David Howells - Add pcrlock CAP_SYS_ADMIN dependency (based on comment by Jason Gunthorpe) - New options: migratable, pcrlock, keyhandle, keyauth, blobauth (based on discussions with Jason Gunthorpe) - Free payload on failure to create key(reported/fixed by Roberto Sassu) - Updated Kconfig and other descriptions (based on Serge Hallyn's suggestion) - Replaced kzalloc() with kmalloc() (reported by Serge Hallyn) Signed-off-by: David Safford Signed-off-by: Mimi Zohar Signed-off-by: James Morris commit c749ba912e87ccebd674ae24b97462176c63732e Author: Mimi Zohar Date: Tue Nov 23 18:54:16 2010 -0500 key: add tpm_send command Add internal kernel tpm_send() command used to seal/unseal keys. Changelog: - replaced module_put in tpm_send() with new tpm_chip_put() wrapper (suggested by David Howells) - Make tpm_send() cmd argument a 'void *' (suggested by David Howells) Signed-off-by: David Safford Signed-off-by: Mimi Zohar Acked-by: David Howells Acked-by: Serge E. Hallyn Signed-off-by: James Morris commit a0e39349d80d8b5deeb264fb190bd064f7063252 Author: Mimi Zohar Date: Tue Nov 23 17:50:32 2010 -0500 tpm: add module_put wrapper For readability, define a tpm_chip_put() wrapper to call module_put(). Replace existing module_put() calls with the wrapper. (Change based on trusted/encrypted patchset review by David Howells.) Signed-off-by: Mimi Zohar Signed-off-by: David Safford Acked-by: David Howells Acked-by: Serge E. Hallyn Signed-off-by: James Morris commit dc88e46029486ed475c71fe1bb696d39511ac8fe Author: Mimi Zohar Date: Tue Nov 23 17:50:31 2010 -0500 lib: hex2bin converts ascii hexadecimal string to binary Similar to the kgdb_hex2mem() code, hex2bin converts a string to binary using the hex_to_bin() library call. Changelog: - Replace parameter names with src/dst (based on David Howell's comment) - Add 'const' where needed (based on David Howell's comment) - Replace int with size_t (based on David Howell's comment) Signed-off-by: Mimi Zohar Acked-by: Serge E. Hallyn Acked-by: David Howells Signed-off-by: James Morris commit ce6ada35bdf710d16582cc4869c26722547e6f11 Author: Serge E. Hallyn Date: Thu Nov 25 17:11:32 2010 +0000 security: Define CAP_SYSLOG Privileged syslog operations currently require CAP_SYS_ADMIN. Split this off into a new CAP_SYSLOG privilege which we can sanely take away from a container through the capability bounding set. With this patch, an lxc container can be prevented from messing with the host's syslog (i.e. dmesg -c). Changelog: mar 12 2010: add selinux capability2:cap_syslog perm Changelog: nov 22 2010: . port to new kernel . add a WARN_ONCE if userspace isn't using CAP_SYSLOG Signed-off-by: Serge Hallyn Acked-by: Andrew G. Morgan Acked-By: Kees Cook Cc: James Morris Cc: Michael Kerrisk Cc: Stephen Smalley Cc: "Christopher J. PeBenito" Cc: Eric Paris Signed-off-by: James Morris commit 1d6d75684d869406e5bb2ac5d3ed9454f52d0cab Merge: 074e61ec3751da9ab88ee66d3818574556c03489 0f639a3c5ca63dd76ee07de9b02ebf0178ce9a17 Author: James Morris Date: Mon Nov 29 08:27:07 2010 +1100 Merge branch 'master' into next commit c661c4a2b0d64c33afc9018a406162b1f8ac5617 Author: Breno Leitao Date: Thu Nov 25 07:53:55 2010 +0000 cxgb3: Removing unused return variable Currently the ret variable is not used for anything other than receive the value of the t3_adapter_error(), which will always be 0, because the reset parameter is 0. Signed-off-by: Breno Leitao Signed-off-by: David S. Miller commit 82a39eb6b3829a02e235656feddb4542517fcabc Author: Jozsef Kadlecsik Date: Thu Nov 25 03:15:07 2010 +0000 ipv6: Prepare the tree for un-inlined jhash. jhash is widely used in the kernel and because the functions are inlined, the cost in size is significant. Also, the new jhash functions are slightly larger than the previous ones so better un-inline. As a preparation step, the calls to the internal macros are replaced with the plain jhash function calls. Signed-off-by: Jozsef Kadlecsik Signed-off-by: David S. Miller commit aa285b1740f5b13e5a2606a927f3129954583d78 Author: Timo Teräs Date: Tue Nov 23 04:03:45 2010 +0000 xfrm: fix gre key endianess fl->fl_gre_key is network byte order contrary to fl->fl_icmp_*. Make xfrm_flowi_{s|d}port return network byte order values for gre key too. Signed-off-by: Timo Teräs Signed-off-by: David S. Miller commit 6a632625c7da7594d059b88dae0e9c591af147ba Author: Jonas Bonn Date: Thu Nov 25 02:30:32 2010 +0000 ethoc: remove division from loops Calculating the BD entry using a modulus operation isn't optimal, especially inside the loop. This patch removes the modulus operations in favour of: i) simply checking for wrapping in the case of cur_rx ii) forcing num_tx to be a power of two and using it to mask out the entry from cur_tx The also prevents possible issues related overflow of the cur_rx and cur_tx counters. Signed-off-by: Jonas Bonn Signed-off-by: David S. Miller commit 4f64bcb2fc093a3a9d7d41220004491ce88e4dd3 Author: Jonas Bonn Date: Thu Nov 25 02:30:31 2010 +0000 ethoc: fix function return type update_ethoc_tx_stats doesn't need to return anything so make its return type void in order to avoid an unnecessary cast when the function is called. Signed-off-by: Jonas Bonn Signed-off-by: David S. Miller commit 8dac428ae9ae54d8e8540ac157d92925dd7ebed8 Author: Jonas Bonn Date: Thu Nov 25 02:30:30 2010 +0000 ethoc: rework mdio read/write MDIO read and write were checking whether a timeout had expired to determine whether to recheck the result of the MDIO operation. Under heavy CPU usage, however, it was possible for the timeout to expire before the routine got around to be able to check a second time even, thus erroneousy returning an -EBUSY. This patch changes the the MDIO IO routines to try up to five times to complete the operation before giving up, thus lessening the dependency on CPU load. This resolves a problem whereby a ping flood would keep the CPU so busy that the above problem would manifest itself; the MDIO command to check link status would fail and the interface would erroneously be shut down. Signed-off-by: Jonas Bonn Signed-off-by: David S. Miller commit fa98eb0e867c6c16e239545d4deb7ad8f40631b3 Author: Jonas Bonn Date: Thu Nov 25 02:30:29 2010 +0000 ethoc: rework interrupt handling The old interrupt handling was incorrect in that it did not account for the fact that the interrupt source bits get set irregardless of whether or not their corresponding mask is set. This patch fixes that by masking off the source bits for masked interrupts. Furthermore, the handling of transmission events is moved to the NAPI polling handler alongside the reception handler, thus preventing a whole bunch of interrupts during heavy traffic. Signed-off-by: Jonas Bonn Signed-off-by: David S. Miller commit 20f70ddd6558a39a89dba4af675686c5a8dbd7b3 Author: Jonas Bonn Date: Thu Nov 25 02:30:28 2010 +0000 ethoc: Double check pending RX packet An interrupt may occur between checking bd.stat and clearing the interrupt source register which would result in the packet going totally unnoticed as the interrupt will be missed. Double check bd.stat after clearing the interrupt source register to guard against such an occurrence. Signed-off-by: Jonas Bonn Signed-off-by: David S. Miller commit 7438a5455734d109fdf18d97147dc57a6dbe5a44 Author: Adam Edvardsson Date: Thu Nov 25 02:30:27 2010 +0000 ethoc: enable interrupts after napi_complete Occasionally, it seems that some race is causing the interrupts to not be reenabled otherwise with the end result that networking just stops working. Enabling interrupts after calling napi_complete is more in line with what other drivers do. Signed-off-by: Jonas Bonn Signed-off-by: David S. Miller commit eac0d3ff5a92de410964fdf0d072314821ca39fc Author: Jonas Bonn Date: Thu Nov 25 02:30:26 2010 +0000 ethoc: remove unused spinlock Signed-off-by: Jonas Bonn Signed-off-by: David S. Miller commit e0f4258be2515afce8ef1e6fb22312525c281798 Author: Jonas Bonn Date: Thu Nov 25 02:30:25 2010 +0000 ethoc: Add device tree configuration This patch adds the ability to describe ethernet devices via a flattened device tree. As device tree remains an optional feature, these bits all need to be guarded by CONFIG_OF ifdefs. MAC address is settable via the device tree parameter "local-mac-address"; however, the selection of the phy id is limited to probing, for now. Signed-off-by: Jonas Bonn Signed-off-by: David S. Miller commit 85beb5869a4f6abb52a7cf8e01de6fa57e9ee47d Author: Steven Rostedt Date: Wed Nov 24 16:23:34 2010 -0500 tracing/slab: Move kmalloc tracepoint out of inline code The tracepoint for kmalloc is in the slab inlined code which causes every instance of kmalloc to have the tracepoint. This patch moves the tracepoint out of the inline code to the slab C file, which removes a large number of inlined trace points. objdump -dr vmlinux.slab| grep 'jmpq.* Signed-off-by: Pekka Enberg commit 3f0a069a1d5c0ccace735e3a62c1bcef53e4c354 Author: andrew hendry Date: Thu Nov 25 02:18:45 2010 +0000 X25 remove bkl in call user data length ioctl Signed-off-by: Andrew Hendry Signed-off-by: David S. Miller commit 74a7e440807d34e586e9feb8e14851b5c80fbfe5 Author: andrew hendry Date: Thu Nov 25 02:18:43 2010 +0000 X25 remove bkl from causediag ioctls Signed-off-by: Andrew Hendry Signed-off-by: David S. Miller commit 5b7958dfa5db758e36e92e1790075b470b4947f8 Author: andrew hendry Date: Thu Nov 25 02:18:40 2010 +0000 X25 remove bkl from calluserdata ioctls Signed-off-by: Andrew Hendry Signed-off-by: David S. Miller commit f90de660678cf553f63c387945830a2e4d26dd3e Author: andrew hendry Date: Thu Nov 25 02:18:35 2010 +0000 X25 remove bkl in facility ioctls Signed-off-by: Andrew Hendry Signed-off-by: David S. Miller commit 5595a1a5997953dbd8c5df7c2f7d4b3a2eb2be4b Author: andrew hendry Date: Thu Nov 25 02:18:15 2010 +0000 X25 remove bkl in subscription ioctls Signed-off-by: Andrew Hendry Signed-off-by: David S. Miller commit 5892b9e9ebdde50fbd524570d61ceb74f8be33f3 Author: Vladislav Zolotarov Date: Sun Nov 28 00:23:35 2010 +0000 bnx2x: Use helpers instead of direct access to the shinfo(skb) fields Signed-off-by: Vladislav Zolotarov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit 9ab4650f718a0e1cb8792bab4ef97efca4ac75c2 Author: Dinh Nguyen Date: Mon Nov 15 11:30:01 2010 -0600 ARM: imx: Get the silicon version from the IIM module Instead of reading the silicon version from ROM, we should read the SREV register from the IIM. Freescale has dropped all support for MX51 REV1.0, only MX51 REV 2.0 and 3.0 are valid. Signed-off-by: Dinh Nguyen Signed-off-by: Sascha Hauer commit be7ff1afec25f2700ca85e3956a2cb3a7b74acd5 Author: Michael Chan Date: Wed Nov 24 13:48:55 2010 +0000 bnx2: Remove config access to non-standard registers In KVM passthrough mode, the driver may not have config access to non-standard registers. The BNX2_PCICFG_MISC_CONFIG config register access to setup mailbox swapping can be done using MMIO. Update version to 2.0.20. Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit a5dac108d57072eec4d6745f32c162524509f2cb Author: Eddie Wai Date: Wed Nov 24 13:48:54 2010 +0000 bnx2: Fix reset bug on 5709 The 5709 chip requires the BNX2_MISC_NEW_CORE_CTL_DMA_ENABLE bit to be cleared and polling for pending DMAs to complete before chip reset. Without this step, we've seen NMIs during repeated resets of the chip. Signed-off-by: Eddie Wai Signed-off-by: Michael Chan Signed-off-by: David S. Miller commit 19eb5cc559f716dc98ce03a5bad6030fdc71e897 Author: John Fastabend Date: Wed Nov 24 13:14:50 2010 +0000 8021q: vlan device is lockless do not transfer real_num_{tx|rx}_queues Now that the vlan device is lockless and single queue do not transfer the real num queues. This is causing a BUG_ON to occur. kernel BUG at net/8021q/vlan.c:345! Call Trace: [] ? fib_rules_event+0x28/0x1b0 [] notifier_call_chain+0x55/0x80 [] raw_notifier_call_chain+0x16/0x20 [] call_netdevice_notifiers+0x37/0x70 [] netdev_features_change+0x16/0x20 [] ixgbe_fcoe_enable+0xae/0x100 [ixgbe] [] vlan_dev_fcoe_enable+0x2a/0x30 [8021q] [] fcoe_create+0x163/0x630 [fcoe] [] ? mmap_region+0x255/0x5a0 [] param_attr_store+0x50/0x80 [] module_attr_store+0x26/0x30 [] sysfs_write_file+0xf2/0x180 [] vfs_write+0xc8/0x190 [] sys_write+0x51/0x90 [] system_call_fastpath+0x16/0x1b Signed-off-by: John Fastabend Signed-off-by: David S. Miller commit 5a0d2268d259886f0c87131639d19eb4a67b4532 Author: Eric Dumazet Date: Tue Nov 23 10:42:02 2010 +0000 net: add netif_tx_queue_frozen_or_stopped When testing struct netdev_queue state against FROZEN bit, we also test XOFF bit. We can test both bits at once and save some cycles. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit d3c15cab213becc49a6f2ad7f48a59513a5f17dd Author: Shan Wei Date: Wed Nov 24 21:47:56 2010 +0000 ipv6: kill two unused macro definition 1. IPV6_TLV_TEL_DST_SIZE This has not been using for several years since created. 2. RT6_INFO_LEN commit 33120b30 kill all RT6_INFO_LEN's references, but only this definition remained. commit 33120b30cc3b8665204d4fcde7288638b0dd04d5 Author: Alexey Dobriyan Date: Tue Nov 6 05:27:11 2007 -0800 [IPV6]: Convert /proc/net/ipv6_route to seq_file interface Signed-off-by: Shan Wei Signed-off-by: David S. Miller commit a40c9f88b5e3da500ddab9440e5ddac170c12281 Author: Uwe Kleine-König Date: Tue Nov 23 22:57:47 2010 +0000 net: add some KERN_CONT markers to continuation lines Cc: netdev@vger.kernel.org Signed-off-by: Uwe Kleine-König Signed-off-by: David S. Miller commit 5a6f95e653adf52ee1ff09cd5e66c2640c65ff66 Author: Rajesh Borundia Date: Tue Nov 23 03:08:27 2010 +0000 netxen: avoid using reset_devices as it may become obsolete In kdump environment do not depend on reset_devices parameter to reset the device as the parameter may become obsolete. Instead use an adapter specific mechanism to determine if the device needs a reset. Driver maintains a count of number of pci functions probed and decrements the count when remove handler of that pci function is called. If the first probe, probe of function 0, detects the count as non zero then reset the device. Signed-off-by: Rajesh Borundia Signed-off-by: Amit Kumar Salecha Signed-off-by: David S. Miller commit b0044bcfa95ddf2e317863fb29121c284b6725ca Author: Rajesh Borundia Date: Tue Nov 23 01:25:21 2010 +0000 qlcnic: avoid using reset_devices as it may become obsolete. In kdump environment do not depend upon reset_devices parameter to reset the pci function as this parameter may become obsolete. Instead use an adapter specific mechanism to determine if the pci function needs to be reset. Per function refcount is maintained in driver, which is set in probe and reset in remove handler of adapter. If the probe detects the count as non zero then reset the function. Signed-off-by: Rajesh Borundia Signed-off-by: Amit Kumar Salecha Signed-off-by: David S. Miller commit 5584b8078a60e34ec7d37c9b67a0f3d389a1a2f6 Author: Shan Wei Date: Mon Nov 22 23:00:42 2010 +0000 sctp: kill unused macro definition These macros have been existed for several years since v2.6.12-rc2. But they never be used. So remove them now. Signed-off-by: Shan Wei Signed-off-by: David S. Miller commit ce06b9d6d33fd2ed799b6e825d68fe95077da354 Author: Dmitry Torokhov Date: Sun Nov 28 16:37:14 2010 +0100 HID: hid-core - rename hid_blacklist to hid_have_special_driver To avoid confusion with hid_blacklist describing various quirks in usbhid code, let's rename this one. Signed-off-by: Dmitry Torokhov Signed-off-by: Jiri Kosina commit de18a29e0fa3904894b4e02fae0e712cd43f740c Author: Daniel Vetter Date: Sat Nov 27 22:30:41 2010 +0100 drm/i915: fix regression due to ba3d8d749b01548b9 We don't track gpu flush request in any special way. So even with obj->write_domain == 0, a gpu flush might be outstanding but no yet executed. Even worse, the latest request might use the object only for reading. So and unconditional call to object_wait_rendering is needed for !pipelined. Hence revert that patch fully and untangle the flushing from the synchronization again. Reported-by: Keith Packard Tested-by: Keith Packard Signed-off-by: Daniel Vetter Signed-off-by: Chris Wilson commit e7a3481c0246c8e45e79c629efd63b168e91fcda Author: Jeremy Fitzhardinge Date: Mon Oct 25 16:53:46 2010 -0700 x86/pvclock: Zero last_value on resume If the guest domain has been suspend/resumed or migrated, then the system clock backing the pvclock clocksource may revert to a smaller value (ie, can be non-monotonic across the migration/save-restore). Make sure we zero last_value in that case so that the domain continues to see clock updates. Signed-off-by: Jeremy Fitzhardinge Signed-off-by: Ingo Molnar commit cf7afbfeb8ceb0187348d0a1a0db61305e25f05f Author: Thomas Graf Date: Mon Nov 22 01:31:54 2010 +0000 rtnl: make link af-specific updates atomic As David pointed out correctly, updates to af-specific attributes are currently not atomic. If multiple changes are requested and one of them fails, previous updates may have been applied already leaving the link behind in a undefined state. This patch splits the function parse_link_af() into two functions validate_link_af() and set_link_at(). validate_link_af() is placed to validate_linkmsg() check for errors as early as possible before any changes to the link have been made. set_link_af() is called to commit the changes later. This method is not fail proof, while it is currently sufficient to make set_link_af() inerrable and thus 100% atomic, the validation function method will not be able to detect all error scenarios in the future, there will likely always be errors depending on states which are f.e. not protected by rtnl_mutex and thus may change between validation and setting. Also, instead of silently ignoring unknown address families and config blocks for address families which did not register a set function the errors EAFNOSUPPORT respectively EOPNOSUPPORT are returned to avoid comitting 4 out of 5 update requests without notifying the user. Signed-off-by: Thomas Graf Signed-off-by: David S. Miller commit 89bf67f1f080c947c92f8773482d9e57767ca292 Author: Eric Dumazet Date: Mon Nov 22 00:15:06 2010 +0000 drivers/net: use vzalloc() Use vzalloc() and vzalloc_node() in net drivers Signed-off-by: Eric Dumazet Acked-by: Jon Mason Signed-off-by: David S. Miller commit fe6d2a38b2076cba515dc95b5dc1589a7ab51c17 Author: Sathya Perla Date: Sun Nov 21 23:25:50 2010 +0000 be2net: adding support for Lancer family of CNAs Key changes are: - EQ ids are not assigned consecutively in Lancer. So, fix mapping of MSIx vector to EQ-id. - BAR mapping and some req locations different for Lancer. - TCP,UDP,IP checksum fields must be compulsorily set in TX wrb for TSO in Lancer. - CEV_IST reg not present in Lancer; so, peek into event queue to check for new entries - cq_create and mcc_create cmd interface is different for Lancer; handle accordingly Signed-off-by: Padmanabh Ratnakar Signed-off-by: Sathya Perla Signed-off-by: David S. Miller commit a115413de13ae6beb0cbfc198afe385a261ab284 Author: Lars Ellenberg Date: Sat Nov 13 20:42:29 2010 +0100 drbd: fix for spin_lock_irqsave in endio callback In commit 9b7f76dc37919ea36caa9680a3f765e5b19b25fb, Author: Lars Ellenberg Date: Wed Aug 11 23:40:24 2010 +0200 drbd: new configuration parameter c-min-rate a bad chunk slipped through, which is now reverted as well, restoring the correct irqsave for the endio callback. This patch also add comments at both req_mod() and in the endio callback so it should not happen again. Signed-off-by: Philipp Reisner Signed-off-by: Lars Ellenberg commit c13f7e1a94007c4381814e7daf033e3e8f0663f3 Author: Lars Ellenberg Date: Fri Oct 29 23:32:01 2010 +0200 drbd: don't recvmsg with zero length This should fix a performance degradation we observed recently. If we don't expect any subheader, we should not call into the tcp stack, as that may add considerable latency if there is no data available at this point. For a synthetic synchronous write load with single outstanding writes, this additional latency when processing the "unplug remote" packet added up to a performance degradation factor >= 10. Signed-off-by: Philipp Reisner Signed-off-by: Lars Ellenberg commit 068ffaa8bfb67c2ddb3ecaf38cc90f94a1a92fe3 Author: Arnaldo Carvalho de Melo Date: Sat Nov 27 02:41:01 2010 -0200 perf tools: Fix lost and unknown events handling Fix it by explaining what can be happening and giving the number of processed and lost events. Also holler if unknown events were found, that can be due to processing a perf.data file collected using a newer tool where newer events got added on reporting using an older perf tool, that or a bug, so ask for a report to be made. Works on both --tui and --stdio. Suggested-by: Thomas Gleixner Cc: FrĂ©dĂ©ric Weisbecker Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Paul Mackerras Cc: Stephane Eranian Cc: Thomas Gleixner LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit 008f29d3865828bb27e35d6d3fa889d0853b469f Author: Shawn Bohrer Date: Sun Nov 21 10:09:39 2010 -0600 perf trace: Handle DT_UNKNOWN on filesystems that don't support d_type Some filesystems like xfs and reiserfs will return DT_UNKNOWN for the d_type. Handle this case by calling stat() to determine the type. Cc: Andreas Schwab Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1290355779-3276-1-git-send-email-sbohrer@rgmadvisors.com> Signed-off-by: Shawn Bohrer Signed-off-by: Arnaldo Carvalho de Melo commit 9d1faba5fe410558099f13cfada2eab03186769d Author: Ian Munsie Date: Thu Nov 25 15:12:53 2010 +1100 perf symbols: Correct final kernel map guesses If a 32bit userspace perf is running on a 64bit kernel, the end of the final map in the kernel would incorrectly be set to 2^32-1 rather than 2^64-1. Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra LKML-Reference: <1290658375-10342-1-git-send-email-imunsie@au1.ibm.com> Signed-off-by: Ian Munsie Signed-off-by: Arnaldo Carvalho de Melo commit 37982ba0a0630066a6a0844a66aedaf91c66db84 Author: Arnaldo Carvalho de Melo Date: Fri Nov 26 18:31:54 2010 -0200 perf events: Default to using event__process_lost Tool developers have to fill in a 'perf_event_ops' method table to specify how to handle each event, so far the ones that were not explicitely especified would get a stub that would just discard the event. Change that so that tool developers can get the lost event details and the total number of such events at the end of 'perf report -D' output. Suggested-by: Thomas Gleixner Cc: Frederic Weisbecker Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian CC: Thomas Gleixner Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit baa2f6cedbfae962f04281a31f08ec29667d31a0 Author: Arnaldo Carvalho de Melo Date: Fri Nov 26 19:39:15 2010 -0200 perf record: Add option to disable collecting build-ids Collecting build-ids for long running sessions may take a long time because it needs to traverse the whole just collected perf.data stream of events, marking the DSOs that had hits and then looking for the .note.gnu.build-id ELF section. For things like the 'trace' tool that records and right away consumes the data on systems where its unlikely that the DSOs being monitored will change while 'trace' runs, it is desirable to remove build id collection, so add a -B/--no-buildid option to perf record to allow such use case. Longer term we'll avoid all this if we, at DSO load time, in the kernel, take advantage of this slow code path to collect the build-id and stash it somewhere, so that we can insert it in the PERF_RECORD_MMAP event. Reported-by: Thomas Gleixner Cc: Frederic Weisbecker Cc: Mike Galbraith Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Thomas Gleixner Cc: Tom Zanussi LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit f6e3354d02aa1f30672e3671098c12cb49c7da25 Author: Russell King Date: Tue Nov 16 00:22:09 2010 +0000 ARM: pgtable: introduce pteval_t to represent a pte value This makes everywhere dealing with pte values use the same type. Signed-off-by: Russell King commit 97092e0c56830457af0639f6bd904537a150ea4a Author: Russell King Date: Tue Nov 16 00:16:01 2010 +0000 ARM: pgtable: use phys_addr_t for physical addresses Ensure that physical addresses are typed as phys_addr_t Signed-off-by: Russell King commit 6e4beb5e682953212da48ebb9e5c90408b8d38ae Author: Russell King Date: Sun Nov 21 23:48:55 2010 +0000 ARM: pgtable: use pXd_none_or_clear_bad() in pgd_free() Remove knowledge of the 2-level wrapping in pgd_free(), and use the pXd_none_or_clear_bad() macros when checking the entries. Signed-off-by: Russell King commit b0d03745b18c39b8e86e70f7778f2093d2cd4ed7 Author: Russell King Date: Sun Nov 21 11:00:56 2010 +0000 ARM: pgtable: get rid of get_pgd_slow()/free_pgd_slow() These old names are just aliases for pgd_alloc/pgd_free. Just use the new names. Signed-off-by: Russell King commit 69529c0eb76469168f1dd5851f363dbab17ce8fd Author: Russell King Date: Tue Nov 16 00:19:55 2010 +0000 ARM: pgtable: directly pass pgd/pmd/pte to their error functions Rather than passing the pte value to __pte_error, pass the raw pte_t cookie instead. Do the same for pmd and pgd functions. Signed-off-by: Russell King commit b510b049b549500816280f7ceaa087cfefdec581 Author: Russell King Date: Fri Nov 26 20:35:25 2010 +0000 ARM: pgtable: group pte functions together Signed-off-by: Russell King commit 4eec4b1396ac6a6a602b4521d40e9cf596ab776d Author: Russell King Date: Fri Nov 26 20:12:12 2010 +0000 ARM: pgtable: group pgd functions and data together Signed-off-by: Russell King commit cf36797f35676dafae9d44484391ac7f56b2485a Author: Mac Lin Date: Tue Nov 23 00:32:44 2010 +0800 ARM: cns3xxx: Add architecture definition for EHCI/OHCI controller This patch add plateform_device for EHCI and OHCI controller on CNS3XXX. Power reference count (usb_pwr_ref) is used to control enabling and disabling the single clock control for both EHCI and OHCI controller. It also removes EHCI/OHCI unused virtual address definitions. Signed-off-by: Mac Lin Signed-off-by: Anton Vorontsov commit 38e64ba0f13918d11e50bbd5bb775781ccd6439d Author: Mac Lin Date: Tue Nov 23 00:32:43 2010 +0800 ARM: cns3xxx: Add new and export the old power management functions This patch adds cns3xxx_pwr_clk_dis, and exports these power management functions that may be used by many other device drivers on CNS3XXX. Signed-off-by: Mac Lin Signed-off-by: Anton Vorontsov commit df8f4d2f3ef9ca2154f7bd531492a83c4ab4558a Author: Anton Vorontsov Date: Fri Nov 26 20:48:35 2010 +0300 ARM: cns3xxx: Make cns3xxx_pwr_soft_rst_force() to actually reset blocks commit 6eb5d146d4535 ("ARM: cns3xxx: Use IO memory accessors everywhere") breaks cns3xxx_pwr_soft_rst_force() function, so that it doesn't write cleared bit into the register. This patch fixes the issue by adding the necessary __raw_writel(). Signed-off-by: Anton Vorontsov commit eb9b2b69d3bdfe9cd98cd9b2c5715346a0f0140d Author: Russell King Date: Fri Nov 26 17:39:28 2010 +0000 ARM: pgtable: move pgprot functions to one place Rather than scattering them throughout the file, group them together. Signed-off-by: Russell King commit af86da5318136eb49c0453c2e2be3280ee5d18d9 Author: Cyrill Gorcunov Date: Fri Nov 26 14:32:09 2010 +0300 perf, x86: P4 PMU - describe config format Add description of .config in a sake of RAW events. At least this should bring some light to those who will be reading this code. Signed-off-by: Cyrill Gorcunov Reviewed-by: Stephane Eranian Cc: Lin Ming Signed-off-by: Ingo Molnar commit 004417a6d468e24399e383645c068b498eed84ad Author: Peter Zijlstra Date: Thu Nov 25 18:38:29 2010 +0100 perf, arch: Cleanup perf-pmu init vs lockup-detector The perf hardware pmu got initialized at various points in the boot, some before early_initcall() some after (notably arch_initcall). The problem is that the NMI lockup detector is ran from early_initcall() and expects the hardware pmu to be present. Sanitize this by moving all architecture hardware pmu implementations to initialize at early_initcall() and move the lockup detector to an explicit initcall right after that. Cc: paulus Cc: davem Cc: Michael Cree Cc: Deng-Cheng Zhu Acked-by: Paul Mundt Acked-by: Will Deacon Signed-off-by: Peter Zijlstra LKML-Reference: <1290707759.2145.119.camel@laptop> Signed-off-by: Ingo Molnar commit 5ef428c4b5950dddce7311e84321abb3aff7ebb0 Author: Andi Kleen Date: Thu Nov 18 11:47:31 2010 +0100 x86: Set cpu masks before calling CPU_STARTING notifiers When booting up a CPU set the various topology masks before calling the CPU_STARTING notifier. This way the notifier can actually use the masks. This is needed for a perf change. Signed-off-by: Andi Kleen Signed-off-by: Peter Zijlstra LKML-Reference: <1290077254-12165-2-git-send-email-andi@firstfloor.org> Signed-off-by: Ingo Molnar commit 963988262c3c8f4234f64a0dde59446a295e07bb Author: Peter Zijlstra Date: Wed Nov 24 18:55:29 2010 +0100 perf: Ignore non-sampling overflows Some arch implementations call perf_event_overflow() by 'accident', ignore this. Reported-by: Francis Moreau Signed-off-by: Peter Zijlstra LKML-Reference: Signed-off-by: Ingo Molnar commit 5d508e820a23d9b6e8a149dfaa8ba5cbedf3d95c Author: Franck Bui-Huu Date: Tue Nov 23 16:21:45 2010 +0100 perf: Don't bother to init the hrtimer for no SW sampling counters Signed-off-by: Franck Bui-Huu Signed-off-by: Peter Zijlstra LKML-Reference: <1290525705-6265-3-git-send-email-fbuihuu@gmail.com> Signed-off-by: Ingo Molnar commit 2e939d1da9b5628642314c1e68b4319e61263c94 Author: Franck Bui-Huu Date: Tue Nov 23 16:21:44 2010 +0100 perf: Limit event refresh to sampling event Signed-off-by: Franck Bui-Huu Signed-off-by: Peter Zijlstra LKML-Reference: <1290525705-6265-2-git-send-email-fbuihuu@gmail.com> Signed-off-by: Ingo Molnar commit 6c7e550f13f8ad82efb6a5653ae628c2543c1768 Author: Franck Bui-Huu Date: Tue Nov 23 16:21:43 2010 +0100 perf: Introduce is_sampling_event() and use it when appropriate. Signed-off-by: Franck Bui-Huu Signed-off-by: Peter Zijlstra LKML-Reference: <1290525705-6265-1-git-send-email-fbuihuu@gmail.com> Signed-off-by: Ingo Molnar commit 35d3778a8fe3c8b4a7513565e34d3bde00ce43ec Author: Peter Zijlstra Date: Wed Nov 24 10:43:55 2010 +0100 scripts/tags.sh: Add magic for trace-events Make tags find the trace-event definitions Signed-off-by: Peter Zijlstra Acked-by: WANG Cong LKML-Reference: <1290591835.2072.438.camel@laptop> Signed-off-by: Ingo Molnar commit 6c869e772c72d509d0db243a56c205ef48a29baf Merge: e4e91ac410356da3a518188f371e9d3b52ee38ee ee6dcfa40a50fe12a3ae0fb4d2653c66c3ed6556 Author: Ingo Molnar Date: Fri Nov 26 15:07:02 2010 +0100 Merge branch 'perf/urgent' into perf/core Conflicts: arch/x86/kernel/apic/hw_nmi.c Merge reason: Resolve conflict, queue up dependent patch. Signed-off-by: Ingo Molnar commit b7a2b39d9b7703ccf068f549c8dc3465fc41d015 Author: Nikanth Karthikesan Date: Fri Nov 26 12:37:09 2010 +0530 sched: Remove unused argument dest_cpu to migrate_task() Remove unused argument, 'dest_cpu' of migrate_task(), and pass runqueue, as it is always known at the call site. Signed-off-by: Nikanth Karthikesan Signed-off-by: Peter Zijlstra LKML-Reference: <201011261237.09187.knikanth@suse.de> Signed-off-by: Ingo Molnar commit 335d7afbfb71faac833734a94240c1e07cf0ead8 Author: Gerald Schaefer Date: Mon Nov 22 15:47:36 2010 +0100 mutexes, sched: Introduce arch_mutex_cpu_relax() The spinning mutex implementation uses cpu_relax() in busy loops as a compiler barrier. Depending on the architecture, cpu_relax() may do more than needed in this specific mutex spin loops. On System z we also give up the time slice of the virtual cpu in cpu_relax(), which prevents effective spinning on the mutex. This patch replaces cpu_relax() in the spinning mutex code with arch_mutex_cpu_relax(), which can be defined by each architecture that selects HAVE_ARCH_MUTEX_CPU_RELAX. The default is still cpu_relax(), so this patch should not affect other architectures than System z for now. Signed-off-by: Gerald Schaefer Signed-off-by: Peter Zijlstra LKML-Reference: <1290437256.7455.4.camel@thinkpad> Signed-off-by: Ingo Molnar commit 22a867d81707b0a2720bb5f65255265b95d30526 Merge: 5bb6b1ea67a73f0665a41726dd7138977b992c6c 3561d43fd289f590fdae672e5eb831b8d5cf0bf6 Author: Ingo Molnar Date: Fri Nov 26 15:03:27 2010 +0100 Merge commit 'v2.6.37-rc3' into sched/core Merge reason: Pick up latest fixes. Signed-off-by: Ingo Molnar commit e4e91ac410356da3a518188f371e9d3b52ee38ee Merge: ea7872b9d6a81101f6ba0ec141544a62fea35876 3561d43fd289f590fdae672e5eb831b8d5cf0bf6 Author: Ingo Molnar Date: Fri Nov 26 15:04:42 2010 +0100 Merge commit 'v2.6.37-rc3' into perf/core Merge reason: Pick up latest fixes. Signed-off-by: Ingo Molnar commit 61ab25447ad6334a74e32f60efb135a3467223f8 Author: Heiko Carstens Date: Fri Nov 26 13:00:59 2010 +0100 nohz: Fix printk_needs_cpu() return value on offline cpus This patch fixes a hang observed with 2.6.32 kernels where timers got enqueued on offline cpus. printk_needs_cpu() may return 1 if called on offline cpus. When a cpu gets offlined it schedules the idle process which, before killing its own cpu, will call tick_nohz_stop_sched_tick(). That function in turn will call printk_needs_cpu() in order to check if the local tick can be disabled. On offline cpus this function should naturally return 0 since regardless if the tick gets disabled or not the cpu will be dead short after. That is besides the fact that __cpu_disable() should already have made sure that no interrupts on the offlined cpu will be delivered anyway. In this case it prevents tick_nohz_stop_sched_tick() to call select_nohz_load_balancer(). No idea if that really is a problem. However what made me debug this is that on 2.6.32 the function get_nohz_load_balancer() is used within __mod_timer() to select a cpu on which a timer gets enqueued. If printk_needs_cpu() returns 1 then the nohz_load_balancer cpu doesn't get updated when a cpu gets offlined. It may contain the cpu number of an offline cpu. In turn timers get enqueued on an offline cpu and not very surprisingly they never expire and cause system hangs. This has been observed 2.6.32 kernels. On current kernels __mod_timer() uses get_nohz_timer_target() which doesn't have that problem. However there might be other problems because of the too early exit tick_nohz_stop_sched_tick() in case a cpu goes offline. Easiest way to fix this is just to test if the current cpu is offline and call printk_tick() directly which clears the condition. Alternatively I tried a cpu hotplug notifier which would clear the condition, however between calling the notifier function and printk_needs_cpu() something could have called printk() again and the problem is back again. This seems to be the safest fix. Signed-off-by: Heiko Carstens Signed-off-by: Peter Zijlstra Cc: stable@kernel.org LKML-Reference: <20101126120235.406766476@de.ibm.com> Signed-off-by: Ingo Molnar commit 49f4138346b3cec2706adff02658fe27ceb1e46f Author: Heiko Carstens Date: Fri Nov 26 13:42:47 2010 +0100 printk: Fix wake_up_klogd() vs cpu hotplug wake_up_klogd() may get called from preemptible context but uses __raw_get_cpu_var() to write to a per cpu variable. If it gets preempted between getting the address and writing to it, the cpu in question could be offline if the process gets scheduled back and hence writes to the per cpu data of an offline cpu. This buggy behaviour was introduced with fa33507a "printk: robustify printk, fix #2" which was supposed to fix a "using smp_processor_id() in preemptible" warning. Let's use this_cpu_write() instead which disables preemption and makes sure that the outlined scenario cannot happen. Signed-off-by: Heiko Carstens Acked-by: Eric Dumazet Signed-off-by: Peter Zijlstra LKML-Reference: <20101126124247.GC7023@osiris.boeblingen.de.ibm.com> Signed-off-by: Ingo Molnar commit 2f6724b24525fc989c0707974b23d96b36132385 Author: Juuso Oikarinen Date: Wed Nov 24 08:16:57 2010 +0200 wl1271: Fix setting of the hardware connection monitoring probe-req template The probe-request template used in the hardware connection monitoring feature thus far has been an empty one, without the SSID IE and without supported rate IEs. This causes problems with some AP's. Additionally, after connected scans, the template for connection maintenance would remain to be the one last used for scanning - potentially incorrect. Fix these by getting a pre-filled directed probe-request template for the associated-to AP from mac80211. Signed-off-by: Juuso Oikarinen Signed-off-by: Luciano Coelho commit 573c67cf819d52d2e12adf75a9a8cfbd216190a3 Author: Luciano Coelho Date: Fri Nov 26 13:44:59 2010 +0200 wl12xx: disable 11a channels when regulatory changes if 11a is not supported Instead of simply not scanning for the 11a channels when not supported by the hardware, disable the channels in reg_notify. This centralizes the decision on whether to scan 5GHz channel in one place and allows userspace to know exactly which channels are in use. Based on Juuso Oikarinen's idea. Cc: Juuso Oikarinen Signed-off-by: Luciano Coelho Reviewed-by: Juuso Oikarinen commit e5cba24e3f018d4beb6acd101a82483c98f91ce7 Author: Hitoshi Mitake Date: Fri Nov 26 12:06:44 2010 +0100 workqueue: check the allocation of system_unbound_wq I found a trivial bug on initialization of workqueue. Current init_workqueues doesn't check the result of allocation of system_unbound_wq, this should be checked like other queues. Signed-off-by: Hitoshi Mitake Cc: Arjan van de Ven Cc: David Howells Signed-off-by: Tejun Heo commit 65500fa94aaeb3475e39c0c5180f188014164ca4 Author: Linus Walleij Date: Thu Nov 4 13:06:59 2010 +0100 ARM: 6467/1: amba: optional PrimeCell core voltage switch On some contemporary sub-micron SoCs, peripherals on the chip have power domain switches, i.e. the voltage to the core may be turned off to conserve power. In the Ux500 we have this for out PrimeCell derivates. This patch makes it possible to specify an (optional) regulator to handle the voltage domain switch on AMBA PrimeCells, modeled very similar to how block clocks are handled. Additional amba_vcore_[enable|disable] calls are supplied to make it possible introduce optional powering off of the core voltage. Using this will require code to spool/unspool any core HW state. Cc: Rabin Vincent Cc: Bengt Jonsson Cc: Jonas Aaberg Signed-off-by: Linus Walleij Signed-off-by: Russell King commit 283a1b92e25fe3a62c766a042f96dad2eefa7d17 Author: Russell King Date: Mon Nov 8 10:11:19 2010 +0000 ARM: always build swp_emulate as ARMv7 swp_emulate is only used on ARMv7+, and includes ARMv7+ assembly instructions. Allow the assembler to accept ARMv7 instructions, but leave the compiler's code generation options alone. Signed-off-by: Russell King commit 6d803ba736abb5e122dede70a4720e4843dd6df4 Author: Jean-Christop PLAGNIOL-VILLARD Date: Wed Nov 17 10:04:33 2010 +0100 ARM: 6483/1: arm & sh: factorised duplicated clkdev.c factorise some generic infrastructure to assist looking up struct clks for the ARM & SH architecture. as the code is identical at 99% put the arch specific code for allocation as example in asm/clkdev.h Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD Acked-by: Paul Mundt Signed-off-by: Russell King commit fbd29a14af42d374ddce9c16ff5f7805e69c764f Author: Sebastian Andrzej Siewior Date: Fri Nov 19 09:00:11 2010 -0800 spi/pxa2xx: register driver properly use platform_driver_register instead of platform_driver_probe. The latter only checks available devices at the time of calling. So if a device gets inserter at a later point in time then the driver will never play with it. Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: Dirk Brandewie commit 83cf1eecfe9afee99d6b86f963187acd414c019d Merge: f1690d17d2c7afa2a2079e3c91eb2bca8c1c5ecd 0e341af835fdf553820a1fa98341b93ab32ce466 Author: Russell King Date: Fri Nov 26 10:28:11 2010 +0000 Merge branch 'ftrace' of git://github.com/rabinv/linux-2.6 into devel-stable commit f1690d17d2c7afa2a2079e3c91eb2bca8c1c5ecd Merge: 612275ad3966dd7ba491d5fe94e894a3861c9062 43eab87828fee65f89f4088736b2b7a187390a2f Author: Russell King Date: Fri Nov 26 10:26:43 2010 +0000 Merge branch 'perf-split' of git://linux-arm.org/linux-2.6-wd into devel-stable commit 612275ad3966dd7ba491d5fe94e894a3861c9062 Merge: 698fd6a2c3ca05ec796072defb5c415289a86cdc 176bfc44417544724e6df0831a7f576f4a56283d Author: Russell King Date: Fri Nov 26 10:26:10 2010 +0000 Merge branch 'for-russell' of git://codeaurora.org/quic/kernel/dwalker/linux-msm into devel-stable commit 6e9d4476063a820764ec063bf683379c38ea1e18 Author: Paul Mundt Date: Fri Nov 26 16:48:31 2010 +0900 usb: ehci-sh: Add missing ehci helpers. The ehci-sh driver was missing tie-ins for endpoint_reset and clear_tt_buffer_complete, add them in. Reported-by: Alan Stern Signed-off-by: Paul Mundt commit c1e0774d74481fdc3082d2096a99a3aa411a71f1 Author: Paul Mundt Date: Fri Nov 26 16:43:38 2010 +0900 usb: ehci-sh: Fix up fault in shutdown path. We can't use the generic usb_hcd_platform_shutdown helper on account of the fact we don't stash the hcd pointer in the driver data, so we provide our own shutdown handler. Signed-off-by: Paul Mundt commit ea7872b9d6a81101f6ba0ec141544a62fea35876 Author: Hitoshi Mitake Date: Thu Nov 25 16:04:53 2010 +0900 perf bench: Add feature that measures the performance of the arch/x86/lib/memcpy_64.S memcpy routines via 'perf bench mem' This patch ports arch/x86/lib/memcpy_64.S to perf bench mem memcpy for benchmarking memcpy() in userland with tricky and dirty way. util/include/asm/cpufeature.h, util/include/asm/dwarf2.h, and util/include/linux/linkage.h are mostly dummy files with small wrappers, so that we are able to include memcpy_64.S unmodified. Signed-off-by: Hitoshi Mitake Cc: h.mitake@gmail.com Cc: Miao Xie Cc: Ma Ling Cc: Zhao Yakui Cc: Peter Zijlstra Cc: Arnaldo Carvalho de Melo Cc: Paul Mackerras Cc: Frederic Weisbecker Cc: Steven Rostedt Cc: Andi Kleen LKML-Reference: <1290668693-27068-2-git-send-email-mitake@dcl.info.waseda.ac.jp> Signed-off-by: Ingo Molnar commit 49ce8fc651794878189fd5f273228832cdfb5be9 Author: Hitoshi Mitake Date: Thu Nov 25 16:04:52 2010 +0900 perf bench: Print both of prefaulted and no prefaulted results by default After applying this patch, perf bench mem memcpy prints both of prefualted and without prefaulted score of memcpy(). New options --no-prefault and --only-prefault are added to print single result, mainly for scripting usage. Usage example: | mitake@X201i:~/linux/.../tools/perf% ./perf bench mem memcpy -l 500MB | # Running mem/memcpy benchmark... | # Copying 500MB Bytes ... | | 634.969014 MB/Sec | 4.828062 GB/Sec (with prefault) | mitake@X201i:~/linux/.../tools/perf% ./perf bench mem memcpy -l 500MB --only-prefault | # Running mem/memcpy benchmark... | # Copying 500MB Bytes ... | | 4.705192 GB/Sec (with prefault) | mitake@X201i:~/linux/.../tools/perf% ./perf bench mem memcpy -l 500MB --no-prefault | # Running mem/memcpy benchmark... | # Copying 500MB Bytes ... | | 642.725568 MB/Sec Signed-off-by: Hitoshi Mitake Cc: h.mitake@gmail.com Cc: Miao Xie Cc: Ma Ling Cc: Zhao Yakui Cc: Peter Zijlstra Cc: Arnaldo Carvalho de Melo Cc: Paul Mackerras Cc: Frederic Weisbecker Cc: Steven Rostedt Cc: Andi Kleen LKML-Reference: <1290668693-27068-1-git-send-email-mitake@dcl.info.waseda.ac.jp> Signed-off-by: Ingo Molnar commit cffd9348a3ae87ac98a4b3c03a5359e28ad50b93 Author: Michael Hennerich Date: Wed Nov 24 09:33:59 2010 +0000 fbdev: bfin_adv7393fb: new Blackfin ADV7393 driver Driver for ADV7393 add-on card for multiple Blackfin boards. Signed-off-by: Michael Hennerich Signed-off-by: Bryan Wu Signed-off-by: Mike Frysinger Signed-off-by: Paul Mundt commit dbcc465a3c8d81da132cc1dd4e5fbf731172477f Author: Michael Hennerich Date: Wed Nov 24 09:33:58 2010 +0000 fbdev: bf537-lq035: new Blackfin Sharp LQ035 framebuffer driver For LCDs hooked up to BF537-STAMP boards. Signed-off-by: Michael Hennerich Signed-off-by: Bryan Wu Signed-off-by: Mike Frysinger Signed-off-by: Paul Mundt commit 22a95949d03548cb346d81d71ce6c64dc273f421 Author: Randy Dunlap Date: Fri Nov 26 05:20:25 2010 +0000 framebuffer: fix fbcmap.c kernel-doc warning Fix kernel-doc warning in fbcmap.c: Warning(drivers/video/fbcmap.c:92): No description found for parameter 'flags' Signed-off-by: Randy Dunlap Signed-off-by: Paul Mundt commit e536fb6f9dc3908ad4c642414002ec9daf590ed7 Merge: a235e4c9302509ac5956bbbffa22eb5ed9fcdc54 ba84cd1f2b5dd49bda9300c5a11373f7e14c3c66 Author: Dave Airlie Date: Fri Nov 26 10:45:03 2010 +1000 Merge remote branch 'intel/drm-intel-fixes' of /ssd/git/drm-next into drm-fixes * 'intel/drm-intel-fixes' of /ssd/git/drm-next: drm/i915/sdvo: Always add a 30ms delay to make SDVO TV detection reliable MAINTAINERS: INTEL DRM DRIVERS list (intel-gfx) is subscribers-only drm/i915/sdvo: Always fallback to querying the shared DDC line drm/i915: Handle pagefaults in execbuffer user relocations drm/i915/sdvo: Only enable HDMI encodings only if the commandset is supported drm/i915: Only save/restore cursor regs if !KMS drm/i915: Prevent integer overflow when validating the execbuffer commit a235e4c9302509ac5956bbbffa22eb5ed9fcdc54 Author: Alex Deucher Date: Wed Nov 24 22:26:55 2010 -0500 Revert "drm/radeon/kms: fix typo in r600 cs checker" This reverts commit d33ef52d9db8a36900dd53f2e32db9a521ace259. This change seems to expose a bug in the 3D driver tiggered by certain apps, so revert it to keep userspace working. Reported-by: Rafael J. Wysocki Cc: Rafael J. Wysocki Signed-off-by: Alex Deucher Signed-off-by: Dave Airlie commit 43eab87828fee65f89f4088736b2b7a187390a2f Author: Will Deacon Date: Sat Nov 13 19:04:32 2010 +0000 ARM: perf: separate PMU backends into multiple files The ARM perf_event.c file contains all PMU backends and, as new PMUs are introduced, will continue to grow. This patch follows the example of x86 and splits the PMU implementations into separate files which are then #included back into the main file. Compile-time guards are added to each PMU file to avoid compiling in code that is not relevant for the version of the architecture which we are targetting. Acked-by: Jean Pihet Signed-off-by: Will Deacon commit 629948310e4270e9b32c37b4a65a8cd5d6ebf38a Author: Will Deacon Date: Sat Nov 13 18:45:27 2010 +0000 ARM: perf: encode PMU name in arm_pmu structure Currently, perf uses the PMU ID as an index into a string table to look up the name of a given PMU. This patch encodes the name of a PMU directly into the arm_pmu structure so that PMU-specific code can be factored out into separate files. Acked-by: Jamie Iles Acked-by: Jean Pihet Signed-off-by: Will Deacon commit 3cb314bae2191b432a7e898abf865db880f6d07d Author: Will Deacon Date: Sat Nov 13 17:37:46 2010 +0000 ARM: perf: add _init() functions to PMUs In preparation for separating the PMU-specific code, this patch adds self-contained init functions to each PMU, therefore removing any PMU-specific knowledge from the PMU-agnostic init_hw_perf_events function. Acked-by: Jamie Iles Acked-by: Jean Pihet Signed-off-by: Will Deacon commit 59a98a1e56edea4d7d9c5f4ce9d50e271a04993c Author: Will Deacon Date: Sat Nov 13 17:18:36 2010 +0000 ARM: perf: avoid exposing internal stop function for v6 PMU Unlike other pmu functions, armv6pmu_pmu_stop is not declared static. This patch adds the missing keyword. Acked-by: Jamie Iles Signed-off-by: Will Deacon commit 84fee97a026ca085f08381054513f9e24689a303 Author: Will Deacon Date: Sat Nov 13 17:13:56 2010 +0000 ARM: perf: consolidate common PMU behaviour The functions for mapping PMU events (perf, cache and raw) are common between all PMU types and differ only in the data on which they operate. This patch implements common definitions of these mapping functions and changes the arm_pmu struct to hold pointers to the data which they require. This is in anticipation of separating out the PMU-specific code into separate files. Acked-by: Jamie Iles Acked-by: Jean Pihet Signed-off-by: Will Deacon commit 01660dfc37933c92dbb7c5718aea61f88025d71f Author: Arnaud Lacombe Date: Mon Nov 8 18:31:53 2010 -0500 scripts/genksyms: fix header usage FreeBSD does not like when __STDC__ is defined, use the standard instead. Signed-off-by: Arnaud Lacombe Signed-off-by: Michal Marek commit b9e4b1e0cd401e915e3ba97afc152946f78f9f0b Author: Dennis KĂ¼gler Date: Tue Nov 23 21:40:09 2010 +0100 HID: Add support for Perixx PERIBOARD-707 (Plus) This patch adds support for the media keys of the Perixx PERIBOARD-707 (Plus) keyboard / remote control. Signed-off-by: Dennis KĂ¼gler Signed-off-by: Jiri Kosina commit 45f53cc90e8f0e46ab024d0bc1de49ebee0dc583 Author: Andi Kleen Date: Fri Nov 5 12:06:05 2010 +0100 Kconfig: fix single letter command in scripts/config The one letter commands in scripts/config didn't work and always printed usage. Fix this here. Cc: erick@openchill.org Reported-by: erick@openchill.org Signed-off-by: Andi Kleen Signed-off-by: Michal Marek commit 6e5b86924a633f5b6eefb051404339a5a7bb005e Author: AmĂ©rico Wang Date: Fri Nov 5 14:16:10 2010 +0800 gitignore: add scripts/recordmcount This file is generated, should be ignored by git. Signed-off-by: WANG Cong Signed-off-by: Michal Marek commit 10f26fa64200095af0e5d80a980e47877865e4b7 Author: Asbjoern Sloth Toennesen Date: Fri Nov 5 13:30:08 2010 +0000 kbuild, deb-pkg: select userland architecture based on UTS_MACHINE Instead of creating the debian package for the compiling userland, create it for a userland matching the kernel thats being compiled. This patch supports all Lenny release architectures, and Linux-based architecture candidates for Squeeze. If it can't find a proper Debian userspace it displays a warning, and fallback to let deb-gencontrol use the host's userspace arch. Eg. with this patch the following make command: make ARCH=i386 deb-pkg will output an i386 Debian package instead of an amd64 one, when run on an amd64 machine. Signed-off-by: Asbjoern Sloth Toennesen Acked-by: maximilian attems Signed-off-by: Michal Marek commit 1ad2096c4eba144522d87541c4024b8c84e95051 Merge: c4d73e7d75a54451d6e073c118ba2b8d87bd350d df73af86b6e737f357aae85e0b5e621516117780 Author: Paul Mundt Date: Thu Nov 25 16:45:43 2010 +0900 Merge branch 'rmobile/mmcif' into rmobile-latest commit e5843341e3ad8ff00332376cd0745026e4b5d45f Author: Guennadi Liakhovetski Date: Wed Nov 24 09:48:10 2010 +0000 dma: shdma: add a MODULE_ALIAS() to allow module autoloading Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit 696d6e178a95d95dbb222d89e5e91a6fa9911440 Author: Kuninori Morimoto Date: Wed Nov 24 07:41:14 2010 +0000 ARM: mach-shmobile: clock-sh73a0: modify MSTP order This patch permuted clock arrays in the order of MSTP Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit df73af86b6e737f357aae85e0b5e621516117780 Author: Guennadi Liakhovetski Date: Wed Nov 24 10:05:26 2010 +0000 ARM: mach-shmobile: enable MMCIF DMA on ap4evb Have to add DMA slave configuration to enable DMA for the sh7372 MMCIF controller. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit a782d688e9c6f9ca9a7a9a28e8e2876969ddef53 Author: Guennadi Liakhovetski Date: Wed Nov 24 10:05:22 2010 +0000 mmc: sh_mmcif: add DMA support The MMCIF controller on sh-mobile platforms can use the DMA controller for data transfers. Interface to the SH dmaengine driver to enable DMA. We also have to lower the maximum number of segments to match with the number od DMA descriptors on SuperH, this doesn't significantly affect driver's PIO performance. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit e47bf32aa8de06ec72e18b4fbbd880caeedb0088 Author: Guennadi Liakhovetski Date: Wed Nov 24 10:05:18 2010 +0000 mmc: sh_mmcif: cosmetic clean up Replace pr_* with respective dev_*, sort headers alphabetically, remove an unused struct member, superfluous variable initialisations and type-casts. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit 6d11dc14e608d637b09277c7b499f2f46b29cc35 Author: Guennadi Liakhovetski Date: Wed Nov 24 10:05:15 2010 +0000 ARM: mach-shmobile: add DMA defines for MMCIF on sh7372 Add DMA slave IDs and slave definitions for MMCIF on sh7372. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit aa0787a90c70587db6934547bb7687efc30062c7 Author: Guennadi Liakhovetski Date: Wed Nov 24 10:05:12 2010 +0000 mmc: sh_mmcif: switch to completion, fix flags In sh_mmcif.c an event is used as a completion, switch over. When a wait_for_completion*_timeout() returns, it suffices to check the remaining time, setting an additional flag before waking up the waiting task only reduces the race window, but does not eliminate it. This patch switches the driver to use a completion to signal an interrupt, the only case, when an interrupt should not wake up the waiter, is when an automatic CMD12 completes. Also fix MODULE_ALIAS. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit 2d3e4e7652f1db2de0fe8798a1a9be460ac9057b Merge: 698fd6a2c3ca05ec796072defb5c415289a86cdc da1d39e3903bc35be2b5e8d2116fdd5d337244d4 Author: Paul Mundt Date: Thu Nov 25 16:26:14 2010 +0900 Merge branch 'common/mmcif' into rmobile/mmcif commit 9a67d761b39614c0495dcab9a204e21a9f4c4d31 Author: Wey-Yi Guy Date: Thu Nov 18 10:40:03 2010 -0800 iwlagn: minor change in bt coex normal LUT Minor changes in LUT Signed-off-by: Wey-Yi Guy commit 506aa156fa736e9f9ce476239c9549ebbf6b08ea Author: Wey-Yi Guy Date: Wed Nov 24 17:25:03 2010 -0800 iwlagn: use different kill mask when SCO active use different kill_ack_mask and kill_cts_mask when detect SCO is active. Signed-off-by: Wey-Yi Guy commit 638514ff5d5845c6eba8c266ea04325be6e7d106 Author: Wey-Yi Guy Date: Wed Nov 17 12:13:55 2010 -0800 iwlagn: Offical name for 100/130 device Change to offical name for 100 devices: "Intel(R) Centrino(R) Wireless-N 100" Change to offical name for 130 devices: "Intel(R) Centrino(R) Wireless-N 130" Signed-off-by: Wey-Yi Guy commit d2eceef02e717751d4f6a01eddea6f241d63c213 Author: Wey-Yi Guy Date: Wed Nov 17 12:13:54 2010 -0800 iwlagn: Offical name for 6000g2b device Change to offical name for 6000g2b devices: "Intel(R) Centrino(R) Wireless-N 1030" "Intel(R) Centrino(R) Advanced-N 6230" Signed-off-by: Wey-Yi Guy commit 55017ab87831b3ca449b81b83b180baac2895666 Author: Wey-Yi Guy Date: Wed Nov 17 12:13:53 2010 -0800 iwlagn: Offical name for 6000g2a device Change to offical name for 6000g2a devices: "Intel(R) Centrino(R) Advanced-N 6205" Signed-off-by: Wey-Yi Guy commit f9dc6467223319acaea64d95ff208409e4e48d07 Author: Wey-Yi Guy Date: Wed Nov 17 12:13:52 2010 -0800 iwlagn: Offical name for 6050g2 device Change to offical name for 6050g2 devices: "Intel(R) Centrino(R) Wireless-N 6150" Signed-off-by: Wey-Yi Guy commit 0c4ac342997c9597706a8fcbb0ccf920b3d33570 Author: Johannes Berg Date: Wed Nov 17 11:33:27 2010 -0800 iwlwifi: use mac80211 AC defines Instead of hardcoding the numbers that must match mac80211, use the constants. Not that this means we could change the constants, but at least this way it's clearer. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit 6fb5511ab96d9f31be747bab842f96227a5c7aec Author: Johannes Berg Date: Tue Nov 16 11:55:02 2010 -0800 iwlagn: advertise reliable TX status Our hardware has reliable TX status, but we're not currently advertising that to mac80211. Since the packet loss monitoring will depend on it, advertise it. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit 2e34034e8c9755ff144379d410d5227926e91cce Author: Johannes Berg Date: Tue Nov 16 11:51:38 2010 -0800 iwlagn: fix station powersave accounting for aggregation Since aggregation queues are station-specific, the device will not reject packets in them but rather will stop the appropriate aggregation queues when a station goes to sleep. I forgot to account for this in the driver, so if a station went to sleep that had aggregation enabled, traffic would stop indefinitely. Fix this by only accounting frames queued on the normal AC queues for associated station. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit 67158b67cea0c92dba1dda74cde926d149cc1a2e Author: Johannes Berg Date: Tue Nov 16 11:51:04 2010 -0800 iwlagn: remove powersave warning Through races, a packet may be enqueued for transmission to a station while that station is going to sleep, in which case the warning here triggers. Instead of warning, check the condition -- if this packet is not a PS-poll response then we still enqueue it but it will be rejected by the device since the station is marked as asleep. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit dbbf1755b09eef8ff6dd21c8dafe1606f051ce12 Author: Wey-Yi Guy Date: Mon Nov 15 13:43:07 2010 -0800 iwlwifi: use antenna information in EEPROM The valid tx/rx antenna information is part of EEPROM, so use it to configure the device. For few cases, the EEPROM did not reflect the correct antenna, but it is too late to modify the EEPROM, so overwrite with .cfg parameters Signed-off-by: Wey-Yi Guy commit 4b7384f936817489a4172b9c5d946f63f479ca15 Author: Wey-Yi Guy Date: Mon Nov 15 13:56:10 2010 -0800 iwlwifi: remove unused define was not used, remove it Signed-off-by: Wey-Yi Guy commit 2862945bf5262d516583477ce420a2f122306f43 Author: Aaro Koskinen Date: Thu Nov 18 19:59:51 2010 +0200 arm: omap2: timer-gp: delete unused variable Delete a redundant local variable. Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit 7489ffcea62e0b990d3557746d19a47e83e07042 Author: Aaro Koskinen Date: Thu Nov 18 19:59:50 2010 +0200 arm: omap1: board-ams-delta: fix cast Use IOMEM() macro to get rid of the following sparse warning: arch/arm/mach-omap1/board-ams-delta.c:319:36: warning: incorrect type in initializer (different address spaces) arch/arm/mach-omap1/board-ams-delta.c:319:36: expected void [noderef] *membase arch/arm/mach-omap1/board-ams-delta.c:319:36: got void * Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit 87aedfe25a754a3ab49a7cfdb8f81bc882bc34fa Author: Aaro Koskinen Date: Thu Nov 18 19:59:49 2010 +0200 arm: omap1: mbox: delete unused variable Delete unused variable from probe(). Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit dba5e190fcbe2a76b1a867ec6cbe9d7009e43708 Author: Aaro Koskinen Date: Thu Nov 18 19:59:48 2010 +0200 arm: omap1: mbox: make variables static Make some variables static to get rid of the following warnings: arch/arm/mach-omap1/mailbox.c:136:18: warning: symbol 'mbox_dsp_info' was not declared. Should it be static? arch/arm/mach-omap1/mailbox.c:142:18: warning: symbol 'omap1_mboxes' was not declared. Should it be static? Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit e6f168212243452eae7c0d0c20c2f6e213933fc8 Author: Aaro Koskinen Date: Thu Nov 18 19:59:47 2010 +0200 arm: omap1: make some functions static Make some functions static to get rid of the following sparse warnings: arch/arm/mach-omap1/mcbsp.c:177:12: warning: symbol 'omap1_mcbsp_init' was not declared. Should it be static? arch/arm/mach-omap1/mux.c:346:22: warning: symbol 'omap1_cfg_reg' was not declared. Should it be static? arch/arm/plat-omap/dma.c:177:5: warning: symbol 'omap_dma_in_1510_mode' was not declared. Should it be static? arch/arm/plat-omap/sram.c:273:12: warning: symbol 'omap1_sram_init' was not declared. Should it be static? Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit 706afddaf53522b67c81a0b1b38bdccd4d4ff00c Author: Aaro Koskinen Date: Thu Nov 18 19:59:46 2010 +0200 arm: omap1: add missing includes Add missing includes to get rid of the following sparse warnings: arch/arm/mach-omap1/devices.c:225:13: warning: symbol 'omap1_camera_init' was not declared. Should it be static? arch/arm/mach-omap1/flash.c:15:6: warning: symbol 'omap1_set_vpp' was not declared. Should it be static? arch/arm/mach-omap1/serial.c:190:6: warning: symbol 'omap_serial_wake_trigger' was not declared. Should it be static? arch/arm/mach-omap1/time.c:252:18: warning: symbol 'omap_timer' was not declared. Should it be static? Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren commit 51cce8a590c4696d62bfacc63378d1036084cef7 Merge: 2fe66ec242d3f76e3b0101f36419e7e5405bcff3 4f8559383c41262b50dc758e2e310f257ce6a14d Author: John W. Linville Date: Wed Nov 24 16:49:20 2010 -0500 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem commit 4f8559383c41262b50dc758e2e310f257ce6a14d Author: Felix Fietkau Date: Sat Nov 20 03:08:48 2010 +0100 ath9k_hw: remove ath9k_hw_stoppcurecv It is no longer used anywhere Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit fa6e15e0b5952fd2cd99fc6d4f4473f6b9da18df Author: Rajkumar Manoharan Date: Fri Nov 19 16:53:22 2010 +0530 ath9k_htc: Identify devices using driver_info Categorize AR7010 & AR9287 devices based on driver_info of usb_device_id, instead of PIDs. This avoids per-device cases and minimize code changes for new device addition. Signed-off-by: Rajkumar Manoharan Signed-off-by: John W. Linville commit f7ec8fb4d6f8f3ecb8b11e9e46ece95aa66139cc Author: Rajkumar Manoharan Date: Fri Nov 19 16:53:21 2010 +0530 ath9k_hw: Fix eeprom offset for AR9287 devices (PCI/USB) AR9287 devices (PCI/USB) use different eeprom start location to read nvram. New devices might endup with same devid. So use driver_info to set offset, instead of devid. driver_info is valid for HTC devices alone which is filled in usb_device_id. Signed-off-by: Rajkumar Manoharan Signed-off-by: John W. Linville commit 64f121708342afec306ce52920cc9982f4f1008f Author: Rajkumar Manoharan Date: Fri Nov 19 16:53:20 2010 +0530 ath9k_htc: Add driver_info in usb device list Added driver_info to identify AR7010, R9287 HTC devices. Signed-off-by: Rajkumar Manoharan Signed-off-by: John W. Linville commit bedbbb959d2c1d1dbb4c2215f5b7074b1da3030a Author: Rajkumar Manoharan Date: Fri Nov 19 16:53:19 2010 +0530 ath: Add a driver_info bitmask field The driver_info stores the device category information which is used to load appropriate device firmware, select firmware offset and eeprom starting location. The driver_info is accessed across ath9k_htc and ath9k_hw. Hence placed under common structure. Signed-off-by: Rajkumar Manoharan Signed-off-by: John W. Linville commit 35162ba75900209755628ccf7357763797037ba6 Author: Wey-Yi Guy Date: Tue Nov 23 10:58:56 2010 -0800 iwlwifi: advance power management support For 6000g2b and up, adding advance power management support for better power consumption Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 1f37daf3233ccda5072f715d6c322d84833cdd92 Author: Wey-Yi Guy Date: Tue Nov 23 10:58:55 2010 -0800 iwlwifi: power management checking for shadow register If shadow register is enable, modify the power management command to inform uCode Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit e366176e5c7f37d2d4cd0708e63b939e3fa3b5c6 Author: Wey-Yi Guy Date: Tue Nov 23 10:58:54 2010 -0800 iwlwifi: consider BT for power management Check the BT PSPoll flag when fill PM command to uCode Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 97badb0eefc9b6f23f864c5348b695be35f05882 Author: Wey-Yi Guy Date: Tue Nov 23 10:58:53 2010 -0800 iwlwifi: add more power management flags Adding additional power management option available for the device. Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit eeb1f83fa8f96501331cc17b73c57999e3a1ec5d Author: Wey-Yi Guy Date: Tue Nov 23 10:58:52 2010 -0800 iwlagn: name change for BT config flag Bit 7 of BT config flag is used to enable/disable PSPoll sync. Make the name to match it. Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 99ba2a14283be96a682e04455061c08a46bbf4ec Author: Johannes Berg Date: Wed Nov 24 08:10:06 2010 +0100 mac80211: implement packet loss notification For drivers that have accurate TX status reporting we can report the number of consecutive lost packets to userspace using the new cfg80211 CQM event. The threshold is fixed right now, this may need to be improved in the future. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit c063dbf52b998b852122dff07a8b8dd430b38437 Author: Johannes Berg Date: Wed Nov 24 08:10:05 2010 +0100 cfg80211: allow using CQM event to notify packet loss This adds the ability for drivers to use CQM events to notify about packet loss for specific stations (which could be the AP for the managed mode case). Since the threshold might be determined by the driver (it isn't passed in right now) it will be passed out of the driver to userspace in the event. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 79b1c460a0b55e55981c25c56597c4d5d2872de3 Author: Bruno Randolf Date: Wed Nov 24 14:34:41 2010 +0900 cfg80211: Add documentation for antenna ops Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit 48124d1a91fb77defc9734b4556350d59671fb2c Author: Luis R. Rodriguez Date: Tue Nov 23 15:05:02 2010 -0800 mac80211: avoid aggregation for VO traffic This should help with latency issues which can happen when using aggregation. Cc: Felix Fietkau Cc: Matt Smith Cc: Senthil Balasubramanian Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit c8b576061d87e2a4fb100e70c6a6dae189b3a310 Author: Luis R. Rodriguez Date: Tue Nov 23 15:05:01 2010 -0800 ath9k: avoid aggregation for VO traffic This should help with latency issues which can happen when using aggregation. Cc: Matt Smith Cc: Senthil Balasubramanian Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit 72a8a3edd630995662bdc85957206685f376f9c4 Author: Felix Fietkau Date: Tue Nov 23 03:10:32 2010 +0100 mac80211: reduce the number of retries for nullfunc probing Since nullfunc frames are transmitted as unicast frames, they're more reliable than the broadcast probe requests, so we need fewer retries to figure out whether the AP is really gone. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 4e5ff37692df35c8826f1291204841b174d3c3ce Author: Felix Fietkau Date: Tue Nov 23 03:10:31 2010 +0100 mac80211: use nullfunc instead of probe request for connection monitoring nullfunc frames are better for connection monitoring, because probe requests are answered even if the AP has already dropped the connection, whereas nullfunc frames from an unassociated station will trigger a disassoc/deauth frame from the AP (WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA), which allows the station to reconnect immediately instead of waiting until it attempts to transmit the next unicast frame. This only works on hardware with reliable tx ACK reporting, any other hardware needs to fall back to the probe request method. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit dd5b4cc71cd09c33e1579cc6d5720656e94e52de Author: Felix Fietkau Date: Mon Nov 22 20:58:24 2010 +0100 cfg80211/mac80211: improve ad-hoc multicast rate handling - store the multicast rate as an index instead of the rate value (reduces cpu overhead in a hotpath) - validate the rate values (must match a bitrate in at least one sband) Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 46090979a55a0dc2cdb3d939f94fa47742108194 Author: Felix Fietkau Date: Tue Nov 23 20:28:03 2010 +0100 mac80211: probe the AP when resuming Check the connection by probing the AP (either using nullfunc or a probe request). If nullfunc probing is supported and the assoc is no longer valid, the AP will send a disassoc/deauth immediately. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 7ccc8bd7593634d827e8bc55898a5038e29848b5 Author: Felix Fietkau Date: Fri Nov 19 22:55:38 2010 +0100 mac80211: calculate beacon loss time accurately Instead of using a fixed 2 second timeout, calculate beacon loss interval from the advertised beacon interval and a frame count. With this beacon loss happens after N (default 7) consecutive frames are missed which for a typical setup (100TU beacon interval) is ~700ms (or ~1/3 previous). Signed-off-by: Sam Leffler Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit c8a7972c3b3633bf90daf50b135665d8ca4838c4 Author: Felix Fietkau Date: Fri Nov 19 22:55:37 2010 +0100 mac80211: restart beacon miss timer on system resume from suspend Signed-off-by: Paul Stewart Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 0b81c23d2e3a8589514fa69b2f153f006a4ad773 Author: RafaÅ‚ MiÅ‚ecki Date: Thu Nov 18 21:11:43 2010 +0100 b43: N-PHY: little cleanups Remove some typos, warnings, initialize some values to follow wl's code path. Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit a529cecd29ecf1e5416316ae06ce515bf67b5d5a Author: RafaÅ‚ MiÅ‚ecki Date: Thu Nov 18 21:11:42 2010 +0100 b43: N-PHY: rev2: save and restore PHY regs on RSSI poll Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit fee613b77df721781b9794945f0f1a8f535456ff Author: RafaÅ‚ MiÅ‚ecki Date: Thu Nov 18 21:11:41 2010 +0100 b43: N-PHY: fix BPHY init Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit bec186452b4cfecff9e2c579bfd4016119d39614 Author: RafaÅ‚ MiÅ‚ecki Date: Thu Nov 18 13:28:00 2010 +0100 b43: N-PHY: init BPHY when needed Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit a5d3598de086cd38f71fe2fec43ac3ca97bb24bb Author: RafaÅ‚ MiÅ‚ecki Date: Thu Nov 18 13:27:59 2010 +0100 b43: N-PHY: fix some typos, conditions, set gain_boost Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit c0f05b9879a324937f14270e4a14d661d2beca63 Author: RafaÅ‚ MiÅ‚ecki Date: Thu Nov 18 13:27:58 2010 +0100 b43: N-PHY: minor fixes to match specs Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 69a3229edcf0c354e1cd93a811843fba7b6e1472 Author: RafaÅ‚ MiÅ‚ecki Date: Thu Nov 18 13:27:57 2010 +0100 b43: N-PHY: fix values for PHY regs in channel tables of 2055 radio Additional comment by Larry Finger : This change deserves a bit more explanation. You might include something like "These tables came from reverse engineering the 5.10.56.46 version of the Broadcom driver. Trace comparisons between b43 and the current Broadcom driver (5.10.120.0) show byte reversals for the PHY register writes." Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit e9c0268f02f8970149158a9b7ea1e5c1c45c819d Author: Joe Perches Date: Tue Nov 16 19:56:49 2010 -0800 net/wireless: Use pr_ and netdev_ No change in output for pr_ prefixes. netdev_ output is different, arguably improved. Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit d7a066c92394f3e777351de0c903beeb8a08af76 Merge: ccb14354017272ddac002e859a2711610b6af174 e476a5a41ad67d0e2b4a652820c49a3923eb936b Author: John W. Linville Date: Wed Nov 24 16:19:24 2010 -0500 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 commit ccb14354017272ddac002e859a2711610b6af174 Author: John W. Linville Date: Wed Nov 24 16:18:36 2010 -0500 Revert "nl80211/mac80211: Report signal average" This reverts commit 86107fd170bc379869250eb7e1bd393a3a70e8ae. This patch inadvertantly changed the userland ABI. Signed-off-by: John W. Linville commit 1d24eb4815d1e0e8b451ecc546645f8ef1176d4f Author: Tom Herbert Date: Sun Nov 21 13:17:27 2010 +0000 xps: Transmit Packet Steering This patch implements transmit packet steering (XPS) for multiqueue devices. XPS selects a transmit queue during packet transmission based on configuration. This is done by mapping the CPU transmitting the packet to a queue. This is the transmit side analogue to RPS-- where RPS is selecting a CPU based on receive queue, XPS selects a queue based on the CPU (previously there was an XPS patch from Eric Dumazet, but that might more appropriately be called transmit completion steering). Each transmit queue can be associated with a number of CPUs which will use the queue to send packets. This is configured as a CPU mask on a per queue basis in: /sys/class/net/eth/queues/tx-/xps_cpus The mappings are stored per device in an inverted data structure that maps CPUs to queues. In the netdevice structure this is an array of num_possible_cpu structures where each structure holds and array of queue_indexes for queues which that CPU can use. The benefits of XPS are improved locality in the per queue data structures. Also, transmit completions are more likely to be done nearer to the sending thread, so this should promote locality back to the socket on free (e.g. UDP). The benefits of XPS are dependent on cache hierarchy, application load, and other factors. XPS would nominally be configured so that a queue would only be shared by CPUs which are sharing a cache, the degenerative configuration woud be that each CPU has it's own queue. Below are some benchmark results which show the potential benfit of this patch. The netperf test has 500 instances of netperf TCP_RR test with 1 byte req. and resp. bnx2x on 16 core AMD XPS (16 queues, 1 TX queue per CPU) 1234K at 100% CPU No XPS (16 queues) 996K at 100% CPU Signed-off-by: Tom Herbert Signed-off-by: David S. Miller commit 3853b5841c01a3f492fe137afaad9c209e5162c6 Author: Tom Herbert Date: Sun Nov 21 13:17:29 2010 +0000 xps: Improvements in TX queue selection In dev_pick_tx, don't do work in calculating queue index or setting the index in the sock unless the device has more than one queue. This allows the sock to be set only with a queue index of a multi-queue device which is desirable if device are stacked like in a tunnel. We also allow the mapping of a socket to queue to be changed. To maintain in order packet transmission a flag (ooo_okay) has been added to the sk_buff structure. If a transport layer sets this flag on a packet, the transmit queue can be changed for the socket. Presumably, the transport would set this if there was no possbility of creating OOO packets (for instance, there are no packets in flight for the socket). This patch includes the modification in TCP output for setting this flag. Signed-off-by: Tom Herbert Signed-off-by: David S. Miller commit 22f4fbd9bd283ef85126e511171932a4af703776 Author: Eric Dumazet Date: Wed Nov 24 11:41:56 2010 -0800 infiniband: remove dev_base_lock use dev_base_lock is the legacy way to lock the device list, and is planned to disappear. (writers hold RTNL, readers hold RCU lock) Convert rdma_translate_ip() and update_ipv6_gids() to RCU locking. Signed-off-by: Eric Dumazet Acked-by: Roland Dreier Signed-off-by: David S. Miller commit bba14de98753cb6599a2dae0e520714b2153522d Author: Eric Dumazet Date: Tue Nov 23 14:09:15 2010 +0000 scm: lower SCM_MAX_FD Lower SCM_MAX_FD from 255 to 253 so that allocations for scm_fp_list are halved. (commit f8d570a4 added two pointers in this structure) scm_fp_dup() should not copy whole structure (and trigger kmemcheck warnings), but only the used part. While we are at it, only allocate needed size. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 456b61bca8ee324ab6c18b065e632c9a8c88aa39 Author: Eric Dumazet Date: Tue Nov 23 13:12:15 2010 +0000 ipv6: mcast: RCU conversion ipv6_sk_mc_lock rwlock becomes a spinlock. readers (inet6_mc_check()) now takes rcu_read_lock() instead of read lock. Writers dont need to disable BH anymore. struct ipv6_mc_socklist objects are reclaimed after one RCU grace period. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 2757a15f08adbed9480c30bdb4e9a0bbf2b6f33a Author: Giuseppe CAVALLARO Date: Wed Nov 24 02:38:17 2010 +0000 stmmac: update the driver version Signed-off-by: Giuseppe Cavallaro Signed-off-by: David S. Miller commit 874bd42d24c2a74f5dbd65e81e175982240fecd8 Author: Giuseppe CAVALLARO Date: Wed Nov 24 02:38:11 2010 +0000 stmmac: convert to dev_pm_ops. This patch updates the PM support using the dev_pm_ops and reviews the hibernation support. Signed-off-by: Giuseppe Cavallaro Signed-off-by: David S. Miller commit 293bb1c41b728d4aa248fe8a0acd2b9066ff5c34 Author: Giuseppe CAVALLARO Date: Wed Nov 24 02:38:05 2010 +0000 stmmac: add init/exit callback in plat_stmmacenet_data struct This patch adds in the plat_stmmacenet_data the init and exit callbacks that can be used for invoking specific platform functions. For example, on ST targets, these call the PAD manager functions to set PIO lines and syscfg registers. The patch removes the stmmac_claim_resource only used on STM Kernels as well. Signed-off-by: Giuseppe Cavallaro Signed-off-by: David S. Miller commit 9dfeb4d953f914bd3bb56ce60e22ee84687399ce Author: Giuseppe CAVALLARO Date: Wed Nov 24 02:37:58 2010 +0000 stmmac: tidy-up stmmac_priv structure This patch tidies-up the stmmac_priv structure that had many fileds alredy defined in the plat_stmmacenet_data structure. Signed-off-by: Giuseppe Cavallaro Signed-off-by: David S. Miller commit b340007f79941297c44a7dfba4d3c587ff81590f Author: Vladislav Zolotarov Date: Wed Nov 24 11:09:50 2010 -0800 bnx2x: Do interrupt mode initialization and NAPIs adding before register_netdev() Move the interrupt mode configuration and NAPIs adding before a register_netdev() call to prevent netdev->open() from running before these functions are done. Advance a driver version number. Signed-off-by: Vladislav Zolotarov Signed-off-by: Eilon Greenstein Reported-by: Michael Chan Signed-off-by: David S. Miller commit e1210d127d11fc40d229648c9754aa60776ef796 Author: Eric Dumazet Date: Wed Nov 24 03:45:10 2010 +0000 bnx2x: Disable local BHes to prevent a dead-lock situation According to Eric's suggestion: Disable local BHes to prevent a dead-lock situation between sch_direct_xmit() (Soft_IRQ context) and bnx2x_tx_int (called by bnx2x_run_loopback() - syscall context), as both are taking a netif_tx_lock(). Signed-off-by: Eric Dumazet Signed-off-by: Vladislav Zolotarov Signed-off-by: Eilon Greenstein Signed-off-by: David S. Miller commit 37a118452cbc9c0cf0d23bfd16d3ca56058be754 Author: Matt Carlson Date: Wed Nov 24 08:31:54 2010 +0000 tg3: Remove tg3_config_info definition This structure isn't used anywhere in the driver. Signed-off-by: Matt Carlson Reviewed-by: Michael Chan Signed-off-by: David S. Miller commit 2e1e3291d4727e14c8f0f48df561afb1a5c26ffe Author: Matt Carlson Date: Wed Nov 24 08:31:53 2010 +0000 tg3: Enable phy APD for 5717 and later asic revs This patch enables the gphy autopowerdown feature in the phy for all new devices that support it. Signed-off-by: Matt Carlson Reviewed-by: Michael Chan Signed-off-by: David S. Miller commit 4bae65c892b4ff9a2797cbfa8526a5f9aaf1b2ed Author: Matt Carlson Date: Wed Nov 24 08:31:52 2010 +0000 tg3: use dma_alloc_coherent() instead of pci_alloc_consistent() Using dma_alloc_coherent() permits to use GFP_KERNEL allocations instead of GFP_ATOMIC ones. Its better when a machine is out of memory, because this allows driver to sleep to get its memory and succeed its init, especially when allocating high order pages. Signed-off-by: Eric Dumazet Signed-off-by: Matt Carlson Reviewed-by: Michael Chan Signed-off-by: David S. Miller commit b92b9040f6e4997b895b7b9c655a158354d28964 Author: Matt Carlson Date: Wed Nov 24 08:31:51 2010 +0000 tg3: Reenable TSS for 5719 All TSS bugs have been fixed in the 5719. This patch reenables the feature. Signed-off-by: Matt Carlson Reviewed-by: Michael Chan Signed-off-by: David S. Miller commit deabaac8beeccdfee5358c0cd4c63258f28f3a74 Author: Matt Carlson Date: Wed Nov 24 08:31:50 2010 +0000 tg3: Enable mult rd DMA engine on 5719 The multiple DMA read engine bugs have been fixed on the 5719. This patch reenables support for this feature. Signed-off-by: Matt Carlson Reviewed-by: Michael Chan Signed-off-by: David S. Miller commit 07ae8fc00bcc97d2f896b257da225a0789b0aa5d Author: Matt Carlson Date: Wed Nov 24 08:31:49 2010 +0000 tg3: Reorg tg3_napi members This patch reorders and realigns the tg3_napi members for a ~3-4% performance improvement on small packet performance tests. Signed-off-by: Matt Carlson Reviewed-by: Michael Chan Signed-off-by: David S. Miller commit cf79003d598b1f82a4caa0564107283b4f560e14 Author: Matt Carlson Date: Wed Nov 24 08:31:48 2010 +0000 tg3: Fix 5719 internal FIFO overflow problem Under load, there an internal FIFO can overflow on the 5719. The fix is to scale back the PCIe maximum read request size based on the current link speed and width. Signed-off-by: Matt Carlson Reviewed-by: Michael Chan Signed-off-by: David S. Miller commit d2394e6bb1aa636f3bd142cb6f7845a4332514b5 Author: Matt Carlson Date: Wed Nov 24 08:31:47 2010 +0000 tg3: Always turn on APE features in mac_mode reg The APE needs certain bits in the mac_mode register to be enabled for traffic to flow correctly. This patch changes the code to always enable these bits in the presence of the APE. Signed-off-by: Matt Carlson Reviewed-by: Michael Chan Signed-off-by: David S. Miller commit b75cc0e4c1caac63941d96a73b2214e8007b934b Author: Matt Carlson Date: Wed Nov 24 08:31:46 2010 +0000 tg3: Assign correct tx margin for 5719 Commit d309a46e42542223946d3a9e4e239fdc945cb53e, entitled "tg3: 5719: Prevent tx data corruption", was supposed to contain the tx margin adjustment but it looks like it somehow was omitted. This patch fixes the problem. Signed-off-by: Matt Carlson Reviewed-by: Michael Chan Signed-off-by: David S. Miller commit 5093eedc8bdfd7d906836a44a248f66a99e27d22 Author: Matt Carlson Date: Wed Nov 24 08:31:45 2010 +0000 tg3: Apply 10Mbps fix to all 57765 revisions Commit a977dbe8445b8a81d6127c4aa9112a2c29a1a008, entitled "tg3: Reduce 57765 core clock when link at 10Mbps" needs to be applied to all revisions of the 57765 asic rev, not just the A0 revision. Signed-off-by: Matt Carlson Reviewed-by: Michael Chan Signed-off-by: David S. Miller commit ba84cd1f2b5dd49bda9300c5a11373f7e14c3c66 Author: Chris Wilson Date: Wed Nov 24 17:37:17 2010 +0000 drm/i915/sdvo: Always add a 30ms delay to make SDVO TV detection reliable Commit d09c23de intended to add a 30ms delay to give the ADD time to detect any TVs connected. However, it used the sdvo->is_tv flag to do so which is dependent upon the previous detection result and not whether the output supports TVs. Signed-off-by: Chris Wilson Cc: stable@kernel.org commit 53c96dfdd0c0ccbba7aee84c60ce0f2aa466413f Author: Zeng Zhaoming Date: Fri Nov 19 00:46:19 2010 +0800 ACPI, hp-wmi: Fix memory leak in acpi query Free acpi return memory after query. Signed-off-by: Zeng Zhaoming Signed-off-by: Matthew Garrett commit a80e1cd70144fe7727f2e2d838611b6b8cf8a6d5 Author: Anisse Astier Date: Thu Nov 18 13:00:54 2010 +0100 msi-wmi: fix semantically incorrect use of keycode instead of scancode I didn't know the difference between the two when I wrote this code in commit c30116c6f0d26cd6e46dfa578163d573ef4730b2. Signed-off-by: Anisse Astier Signed-off-by: Matthew Garrett commit 92f61cbc614fb422759790739cbd3e5a68c9a6fc Author: Anisse Astier Date: Thu Nov 18 13:00:53 2010 +0100 msi-wmi: Add mute key support Add new MUTE key seen on Medion Akoya AIO PC P4010D using MSI motherboard (Product Name: MS-7621) Reported-and-tested-by: Mark Huijgen Signed-off-by: Anisse Astier Signed-off-by: Matthew Garrett commit ba1ff5be52163a97ac4ce8bc51beae2c96861a43 Author: Corentin Chary Date: Sun Nov 14 17:40:12 2010 +0100 asus-laptop: add wimax and wwan support Asus UL30A has a 3G chip, but the radio is disabled by default. The DSDT also reference a WIMAX device, which is not present on this model. This patch adds two new files: wwan and wimax to control WWAN and WIMAX devices. It does not use rfkill, because like WLED and BLED, we don't know yet that the two ACPI functions will always control the radio, they may control only the leds on some hardware. We may add rfkill switchs later. Signed-off-by: Corentin Chary Signed-off-by: Matthew Garrett commit 67fa38ec097a3e270ab175636338185017b49fa7 Author: Dmitry Torokhov Date: Wed Nov 3 11:14:01 2010 -0700 eeepc-wmi: fix compiler warning This fixes the following: CC [M] drivers/platform/x86/eeepc-wmi.o drivers/platform/x86/eeepc-wmi.c:322: warning: initialization from incompatible pointer type Signed-off-by: Dmitry Torokhov Signed-off-by: Matthew Garrett commit 1d37db77c1aa199ae9a4114af7c0412c8417e949 Author: Vernon Mauery Date: Tue Nov 2 13:08:11 2010 -0700 ibm_rtl: _RTL_ is not available in UEFI mode Some of the IBM servers that are supported by ibm_rtl can run in both Legacy mode (BIOS) and in UEFI mode. When running in UEFI mode, it is possible that the EBDA table exists but cannot be mapped and reports errors. We need to make sure that by default we don't try to probe the machines if they are running in UEFI mode. Signed-off-by: Vernon Mauery Signed-off-by: Matthew Garrett commit a2262260f9eaee4acd56b5624b5d2bf4be9bb38a Author: Vernon Mauery Date: Tue Nov 2 13:08:10 2010 -0700 ibm_rtl: Loosen the DMI criteria to all IBM machines Allow all IBM machines to pass the DMI check so that we don't have to add them one by one to the driver. Any IBM machine that has the _RTL_ table in the EBDA will work. Signed-off-by: Vernon Mauery Signed-off-by: Matthew Garrett commit d41014b92d60a6b375aad9b6ebc52201ee58df70 Author: Julia Lawall Date: Tue Oct 26 12:25:37 2010 +0200 drivers/platform/x86/thinkpad_acpi.c: delete double assignment Delete successive assignments to the same location. A simplified version of the semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // @@ expression i; @@ *i = ...; i = ...; // Signed-off-by: Julia Lawall Signed-off-by: Matthew Garrett commit e599ab2556006398ba9aad536a58eedad515e807 Author: Chris Bagwell Date: Mon Oct 25 21:08:39 2010 -0500 eeepc-wmi: add cpufv sysfs documentation Based on cpufv text from sysfs-platform-eeepc-laptop that has almost same behavior. Signed-off-by: Chris Bagwell Signed-off-by: Matthew Garrett Acked-by: Corentin Chary commit a49010f53b723ed0711d645ec43bde498c6756dc Author: Jon Dowland Date: Wed Oct 27 00:24:59 2010 +0100 toshiba_acpi.c: Add key_entry for a lone FN keypress A lone FN key press on a Toshiba PortĂ©gĂ© R700 without another key in conjunction results in an ACPI event and a spurious error message on the console. Add a key entry to map this event to a KEY_FN keypress. This prevents the console message. Signed-off-by: Jon Dowland Signed-off-by: Matthew Garrett commit c72b844ed2f55c442b464e382a2eb2ecab5292a8 Author: Randy Dunlap Date: Fri Oct 22 16:18:47 2010 -0700 ibm_rtl: fix printk format warning Fix printk format warning: drivers/platform/x86/ibm_rtl.c:305:warning: format '%#llx' expects type 'long long unsigned int', but argument 2 has type 'phys_addr_t' Signed-off-by: Randy Dunlap Cc: Keith Mannthey Cc: Vernon Mauery Cc: platform-driver-x86@vger.kernel.org Cc: Matthew Garrett Signed-off-by: Matthew Garrett commit b66ff7a2cd411a2245c984793a7eb98ee91771f9 Author: Dinh Nguyen Date: Mon Nov 15 11:30:00 2010 -0600 ARM: imx: Add mx53 support to common msl functions. Add mx53 support to cpu.c and mm.c. Signed-off-by: Dinh Nguyen Signed-off-by: Sascha Hauer commit c0abefd30b2c9db015df4914a95d268ecdb39b00 Author: Dinh Nguyen Date: Mon Nov 15 11:29:59 2010 -0600 ARM: imx: Add core definitions for MX53 Add iomux, clocks, and memory map for Freescale's MX53 SoC. Add cpu_is_mx53 function to common.h. Add 3 more banks of gpio's to mxc_gpio_ports. Add MX53 phys offset address. Signed-off-by: Dinh Nguyen Signed-off-by: Sascha Hauer commit 374daa4f9019f75da1addb3f31a22df1966a5baa Author: Fabio Estevam Date: Wed Nov 10 07:00:02 2010 -0800 mx51_babbage: Add SPI flash support MX51 Babbage has an AT45DB321 SPI Flash connected to eCSPI1. Add support for it. Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer Acked-by: Uwe Kleine-König commit 76586d35eb31192bf3f395c2e02cef8a57e3558c Author: Sascha Hauer Date: Thu Nov 4 23:09:18 2010 +0100 ARM i.MX27 pm: return gracefully on different socs Code called from an initcall can be maybe called for machines it's not intended for. So check for valid machines and return gracefully if an incompatible machine is found. Signed-off-by: Sascha Hauer commit 92fcdc9d1054a630f224657dc675e03bf3bb62ed Author: Sascha Hauer Date: Thu Nov 4 23:08:17 2010 +0100 ARM i.MX51: return gracefully on different socs Code called from an initcall can be maybe called for machines it's not intended for. So check for valid machines and return gracefully if an incompatible machine is found. Signed-off-by: Sascha Hauer commit 8bffb77e198df83224a6a258291bd41c05ab84d1 Author: Sascha Hauer Date: Thu Nov 4 23:07:56 2010 +0100 ARM i.MX DMA: return gracefully on different socs Code called from an initcall can be maybe called for machines it's not intended for. So check for valid machines and return gracefully if an incompatible machine is found. Signed-off-by: Sascha Hauer commit ec4bb253fcc5c07519b5e701d2c87100aef0d2ba Author: Sascha Hauer Date: Fri Nov 5 09:47:21 2010 +0100 ARM i.MX51: Make CONFIG_MXC_TZIC an invisible option There's no point showing this option to the user. The correct value will be selected anyway. Signed-off-by: Sascha Hauer commit c7259df3af03aee00985e9bb64fb2afa593f703f Author: Sascha Hauer Date: Fri Nov 5 09:37:22 2010 +0100 ARM i.MX irq: Compile avic irq code only on SoCs that need it This patch adds a Kconfig option for the avic irq controller and lets the SoCs that need it select this option. Also, as we have two irq controllers for i.MX, irq.c is not appropriate anymore, so rename it to avic.c Signed-off-by: Sascha Hauer commit 7608d7d2b4a146f560436f5b99b1b93d30049e4e Author: Sascha Hauer Date: Thu Nov 4 21:20:43 2010 +0100 ARM i.MX51 boards: Do not use PHYS_OFFSET PHYS_OFFSET may become a variable once the runtime PHYS_OFFSET patch is merged, so use MX51_PHYS_OFFSET for boot_params. Signed-off-by: Sascha Hauer commit db037126656fb75482c09fb8673d97a5b44bcbae Author: Fabio Estevam Date: Wed Nov 3 14:39:13 2010 -0700 mx51_3ds: Add esdhc support Add support for esdhc on mx51_3ds board. Signed-off-by: Fabio Estevam Acked-by: Uwe Kleine-König Signed-off-by: Sascha Hauer commit 28d6a7a2f37a349a2292e52a87d76f06f55dc9d8 Author: Arnaud Patard (Rtp) Date: Wed Nov 3 15:54:36 2010 +0100 imx: fix iomux v3 Commit "ARM: i.MX IOMUX-V3 replace struct pad_desc with bitmapped cookie" (b705cb4d42e95a4a43a8945571c8613e71526c3d) introduced a typo which was preventing my efikamx to boot. This patch is fixing that. Signed-off-by: Arnaud Patard Tested-by: Fabio Estevam Signed-off-by: Sascha Hauer commit c2932bf47001697fc48e89f1d136532703ed4779 Author: Arnaud Patard (Rtp) Date: Wed Oct 27 14:40:55 2010 +0200 efikamx: add reset The efikamx board is using a gpio to reset the board so add support for it Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit c6e34a4cbe8d4e126c3f603d11cce6979952cbb1 Author: Arnaud Patard (Rtp) Date: Wed Oct 27 14:40:54 2010 +0200 efikamx: add spi nor support On efikamx, uboot is stored on a nor spi flash. Add support for it Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit 0dea1c74642fb46cb94282719dafe7c2a7d3068f Author: Arnaud Patard (Rtp) Date: Wed Oct 27 14:40:53 2010 +0200 imx51: fix gpio_4_24 and gpio_4_25 pad configuration s/NO_PAD_CTRL/MX51_GPIO_PAD_CTRL/ Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit fcbd0c5f20918c6db0c72d4e7546880833713f9c Author: Arnaud Patard (Rtp) Date: Wed Oct 27 14:40:52 2010 +0200 efikamx: add support for power key This patch adds support for power key button of the efika mx. It's connected on GPIO 2 31. Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit 9d2c0ef76f429c038de27e1b734d65a67dbc8088 Author: Arnaud Patard (Rtp) Date: Wed Oct 27 14:40:51 2010 +0200 efikamx: add leds support The efika mx a 3 leds (1 blue, 1 red, 1 green) connected on GPIOS 3 13/14/15. Also, some special care is done for default trigger of blue led for mmc as the mmc host used is different between hw revisions Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit 82df68ad26c1cb4c31e1a2750c0020038dd77cc6 Author: Arnaud Patard (Rtp) Date: Wed Oct 27 14:40:50 2010 +0200 imx51: add gpio mode for csi1 {h,v}sync Add definitions for configuring CSI1_{H,V}SYNC as GPIO Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit a96eb148c74a09bc872b1490141d98811a3c7dbd Author: Arnaud Patard (Rtp) Date: Wed Oct 27 14:40:49 2010 +0200 efikamx: add mmc support The efika mx is using a esdhc host for mmc support. Now that the sdhci has support for it, enable it. Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit 0a7d48712f9a279464d2587e52e60fdc81f9a65a Author: Arnaud Patard (Rtp) Date: Wed Oct 27 14:40:48 2010 +0200 imx51: enhance iomux configuration for esdhc support - add definition to configure pads as ESDHC{1,2} WP and CD Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit db9d42348f6f5b37ae658a506bf80fa935dc1b0a Author: Arnaud Patard (Rtp) Date: Wed Oct 27 14:40:47 2010 +0200 imx51: fix iomux configuration - ALT0 is used to set GPIO mode of GPIO_1_{2,3,4,5,6,7,8,9} but it's ALT1 for GPIO_1_{0,1}. Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit f1dd361b679977d449b7d10ddc9b5fcdfa8c0ca9 Author: Arnaud Patard (Rtp) Date: Wed Oct 27 14:40:46 2010 +0200 efikamx: read board id read board id value from the GPIO3_16/17/11 Signed-off-by: Arnaud Patard Signed-off-by: Sascha Hauer commit bd02a9e5eee6335f23f1fff52a1e5c8e1783c49e Author: Fabio Estevam Date: Wed Oct 27 10:31:06 2010 -0700 mx31_3ds: Add touchscreen support On the mx31_3ds board the touchscreen feature is provided by MC13783 PMIC. Signed-off-by: Fabio Estevam Signed-off-by: Sascha Hauer commit 8f5260c8c1a1f9b25dfedd5ca749e4faef1b3eb9 Author: Lothar WaĂŸmann Date: Tue Oct 26 14:28:31 2010 +0200 ARM: i.MX IOMUX-V3 replace struct pad_desc with bitmapped cookie The following patch is a first step to convert the 'struct pad_desc' to a bitmapped cookie to facilitate adding platform specific pullup or drive strength definitions to existing pad definitions without need to rewrite the complete pad def. The patch wraps 'struct pad_desc' in an opaque data type and introduces macros to access the individual members. This patch does not constitute any functional change! Signed-off-by: Lothar WaĂŸmann Signed-off-by: Sascha Hauer commit cc840f77036fa0a141951967cd010014f088b5e0 Author: Joe Perches Date: Tue Nov 23 22:36:42 2010 -0800 MAINTAINERS: INTEL DRM DRIVERS list (intel-gfx) is subscribers-only Mark it so. Signed-off-by: Joe Perches Signed-off-by: Chris Wilson commit 2a85927c79634e89b9cd683dd2bae65966d9b216 Merge: 3561d43fd289f590fdae672e5eb831b8d5cf0bf6 124bf94a9f9b52341562628cd56b252e7d820ee8 Author: Sascha Hauer Date: Wed Nov 24 08:24:29 2010 +0100 Merge branch 'imx-for-2.6.38' of git://git.pengutronix.de/git/ukl/linux-2.6 into imx-for-2.6.38 commit c4d73e7d75a54451d6e073c118ba2b8d87bd350d Merge: 0421860a5a75b59a76b7a864a172eb090e3d0785 fd34f85832550d419e8b70f284ad545cdde0664f 421b446abeec55bed1251fab80cb5c12be58b773 Author: Paul Mundt Date: Wed Nov 24 15:34:46 2010 +0900 Merge branches 'rmobile/ag5' and 'rmobile/fsi-despair' into rmobile-latest commit fd34f85832550d419e8b70f284ad545cdde0664f Author: Paul Mundt Date: Wed Nov 24 15:22:09 2010 +0900 mailmap: Fix up Takashi YOSHII's attribution. Signed-off-by: Paul Mundt commit aae0f73604ff4bf65d0e4f5d4a10f214a6c98282 Author: Kuninori Morimoto Date: Wed Nov 24 05:03:33 2010 +0000 ARM: mach-shmobile: ag5evm: remove unused define Signed-off-by: Kuninori Morimoto Signed-off-by: Paul Mundt commit 8e67b22a13e53335657b595bc4e4c01a559f8845 Author: Yoshii Takashi Date: Fri Nov 19 13:21:32 2010 +0000 ARM: mach-shmobile: ag5evm i2c_shmobile support. Just add port multiplex settings to enable i2c modules. Signed-off-by: Takashi YOSHII Signed-off-by: Paul Mundt commit b028f94b76319e1b86103b767ca1c22546a5e7e7 Author: Yoshii Takashi Date: Fri Nov 19 13:20:45 2010 +0000 ARM: mach-shmobile: sh73a0 i2c_shmobile support. Platform device resource/data definition for CPU, and clkdev entries Signed-off-by: Takashi YOSHII Signed-off-by: Paul Mundt commit 2d22d486601b2eaedd1c8dd5dc1c4602cab896ef Author: Yoshii Takashi Date: Fri Nov 19 13:15:46 2010 +0000 ARM: mach-shmobile: ag5evm: scan keyboard support This consists of platform device resources/data for the board, and simple clvdev entry for MSTP bit for keysc module. This support only 49 of 80 key-switches on the board. Signed-off-by: Takashi YOSHII Signed-off-by: Paul Mundt commit 0c1dab89ee0e483f382391d6aec77db4affb0931 Author: Chris Wilson Date: Tue Nov 23 22:37:01 2010 +0000 drm/i915/sdvo: Always fallback to querying the shared DDC line On a few devices, like the Mac Mini, the CRT DDC pins are shared between the analog connector and the digital connector. In this scenario, rely on the EDID to determine if a digital panel is connected to the digital connector. Reported-and-tested-by: Tino Keitel Signed-off-by: Chris Wilson commit bcf50e2775bbc3101932d8e4ab8c7902aa4163b4 Author: Chris Wilson Date: Sun Nov 21 22:07:12 2010 +0000 drm/i915: Handle pagefaults in execbuffer user relocations Currently if we hit a pagefault when applying a user relocation for the execbuffer, we bail and return EFAULT to the application. Instead, we need to unwind, drop the dev->struct_mutex, copy all the relocation entries to a vmalloc array (to avoid any potential circular deadlocks when resolving the pagefault), retake the mutex and then apply the relocations. Afterwards, we need to again drop the lock and copy the vmalloc array back to userspace. v2: Incorporate feedback from Daniel Vetter. Reported-by: Daniel Vetter Signed-off-by: Chris Wilson Reviewed-by: Daniel Vetter commit 2fe66ec242d3f76e3b0101f36419e7e5405bcff3 Author: Eric Paris Date: Tue Nov 23 06:28:08 2010 +0000 SELinux: indicate fatal error in compat netfilter code The SELinux ip postroute code indicates when policy rejected a packet and passes the error back up the stack. The compat code does not. This patch sends the same kind of error back up the stack in the compat code. Based-on-patch-by: Paul Moore Signed-off-by: Eric Paris Reviewed-by: Paul Moore Signed-off-by: David S. Miller commit 04f6d70f6e64900a5d70a5fc199dd9d5fa787738 Author: Eric Paris Date: Tue Nov 23 06:28:02 2010 +0000 SELinux: Only return netlink error when we know the return is fatal Some of the SELinux netlink code returns a fatal error when the error might actually be transient. This patch just silently drops packets on potentially transient errors but continues to return a permanant error indicator when the denial was because of policy. Based-on-comments-by: Paul Moore Signed-off-by: Eric Paris Reviewed-by: Paul Moore Signed-off-by: David S. Miller commit 34a2d313c51f47cae50ccb89f4196462665f2c48 Author: Christoph Hellwig Date: Tue Nov 23 14:38:21 2010 +0100 hfsplus: flush disk caches in sync and fsync Flush the disk cache in fsync and sync to make sure data actually is on disk on completion of these system calls. There is a nobarrier mount option to disable this behaviour. It's slightly misnamed now that barrier actually are gone, but it matches the name used by all major filesystems. Signed-off-by: Christoph Hellwig commit e34947056076ca5467ee8256d2d9cbc594a79b37 Author: Christoph Hellwig Date: Tue Nov 23 14:38:15 2010 +0100 hfsplus: optimize fsync Avoid doing unessecary work in fsync. Do nothing unless the inode was marked dirty, and only write the various metadata inodes out if they contain any dirty state from this inode. This is archived by adding three new dirty bits to the hfsplus-specific inode which are set in the correct places. Signed-off-by: Christoph Hellwig commit b33b7921db14abcd10c30d0ccfc68e364f5ef7fe Author: Christoph Hellwig Date: Tue Nov 23 14:38:13 2010 +0100 hfsplus: split up inode flags Split the flags field in the hfsplus inode into an extent_state flag that is locked by the extent_lock, and a new flags field that uses atomic bitops. The second will grow more flags in the next patch. Signed-off-by: Christoph Hellwig commit eb29d66d4f2dc98a81ae590bbdddc8cfa8964d73 Author: Christoph Hellwig Date: Tue Nov 23 14:38:10 2010 +0100 hfsplus: write up fsync for directories fsync is supposed to not just work on regular files, but also on directories. Fortunately enough hfsplus_file_fsync works just fine for directories, so we can just wire it up. Signed-off-by: Christoph Hellwig commit 281469766bdde2d14bc73e1fec347e6dd7f63319 Author: Christoph Hellwig Date: Tue Nov 23 14:38:06 2010 +0100 hfsplus: simplify fsync Remove lots of code we don't need from fsync, we just need to call ->write_inode on the inode if it's dirty, for which sync_inode_metadata is a lot more efficient than write_inode_now, and we need to write out the various metadata inodes, which we now do explicitly instead of by calling ->sync_fs. Signed-off-by: Christoph Hellwig commit f02e26f8d90f8cde98314c72c2e890bc281a8346 Author: Christoph Hellwig Date: Tue Nov 23 14:38:02 2010 +0100 hfsplus: avoid useless work in hfsplus_sync_fs There is no reason to write out the metadata inodes or volume headers during a non-blocking sync, as we are almost guaranteed to dirty them again during the inode writeouts. Signed-off-by: Christoph Hellwig commit 7dc4f001123f9ebe3b010a6c26acd18698ad205f Author: Christoph Hellwig Date: Tue Nov 23 14:37:57 2010 +0100 hfsplus: make sure sync writes out all metadata hfsplus stores all metadata except for the volume headers in special inodes. While these are marked hashed and periodically written out by the flusher threads, we can't rely on that for sync. For the case of a data integrity sync the VM has life-lock avoidance code that avoids writing inodes again that are redirtied during the sync, which is something that can happen easily for hfsplus. So make sure we explicitly write out the metadata inodes at the beginning of hfsplus_sync_fs. Signed-off-by: Christoph Hellwig commit 358f26d52680cb150907302d4334359de7dd2d59 Author: Christoph Hellwig Date: Tue Nov 23 14:37:51 2010 +0100 hfsplus: use raw bio access for partition tables Switch the hfsplus partition table reding for cdroms to use our bio helpers. Again we don't rely on any caching in the buffer_heads, and this gets rid of the last buffer_head use in hfsplus. Signed-off-by: Christoph Hellwig commit 52399b171dfaea02b6944cd6feba49b624147126 Author: Christoph Hellwig Date: Tue Nov 23 14:37:47 2010 +0100 hfsplus: use raw bio access for the volume headers The hfsplus backup volume header is located two blocks from the end of the device. In case of device sizes that are not 4k aligned this means we can't access it using buffer_heads when using the default 4k block size. Switch to using raw bios to read/write all buffer headers. We were not relying on any caching behaviour of the buffer heads anyway. Additionally always read in the backup volume header during mount to verify that we can actually read it. Signed-off-by: Christoph Hellwig commit 3b5ce8ae31e3c66655207907527476bbd3e5063b Author: Christoph Hellwig Date: Tue Nov 23 14:37:43 2010 +0100 hfsplus: always use hfsplus_sync_fs to write the volume header Remove opencoded writing of the volume header in hfsplus_fill_super and hfsplus_put_super and offload it to hfsplus_sync_fs. In the put_super case this means we only write the superblock once instead of twice. Signed-off-by: Christoph Hellwig commit 6d1bbfc4c0458c514126ccf7d6ce9232d9dbc872 Author: Christoph Hellwig Date: Tue Nov 23 14:37:40 2010 +0100 hfsplus: silence a few debug printks Turn a few noisy debug printks that show up during xfstests into complied out debug print statements. Signed-off-by: Christoph Hellwig commit 5bb6b1ea67a73f0665a41726dd7138977b992c6c Author: Peter Zijlstra Date: Fri Nov 19 21:11:09 2010 +0100 sched: Add some clock info to sched_debug Add more clock information to /proc/sched_debug, Thomas wanted to see the sched_clock_stable state. Requested-by: Thomas Gleixner Signed-off-by: Peter Zijlstra LKML-Reference: Signed-off-by: Ingo Molnar commit 51a96c77815e7f139892a6e9c8275a50e9baebdf Author: Peter Zijlstra Date: Fri Nov 19 20:37:53 2010 +0100 cpu: Remove incorrect BUG_ON Oleg mentioned that there is no actual guarantee the dying cpu's migration thread is actually finished running when we get there, so replace the BUG_ON() with a spinloop waiting for it. Reported-by: Oleg Nesterov Signed-off-by: Peter Zijlstra LKML-Reference: Signed-off-by: Ingo Molnar commit 2e01f4740a874b6085da6ebf541e7ffde9a72bf2 Author: Dhaval Giani Date: Thu Nov 18 15:44:54 2010 +0100 cpu: Remove unused variable GCC warns us about: kernel/cpu.c: In function ‘take_cpu_down’: kernel/cpu.c:200:15: warning: unused variable ‘cpu’ This variable is unused since param->hcpu is directly used later on in cpu_notify. Signed-off-by: Dhaval Giani Signed-off-by: Peter Zijlstra LKML-Reference: <1290091494.1145.5.camel@gondor.retis> Signed-off-by: Ingo Molnar commit 70caf8a6c13c2279b35f2ad6b644815533d6c476 Author: Peter Zijlstra Date: Sat Nov 20 00:53:51 2010 +0100 sched: Fix UP build breakage The recent cgroup-scheduling rework caused a UP build problem. Cc: Paul Turner Signed-off-by: Peter Zijlstra LKML-Reference: Signed-off-by: Ingo Molnar commit 28d0686cf7b14e30243096bd874d3f80591ed392 Author: Erik Gilling Date: Fri Nov 19 18:08:51 2010 -0800 sched: Make task dump print all 15 chars of proc comm Signed-off-by: Erik Gilling Signed-off-by: John Stultz Signed-off-by: Peter Zijlstra LKML-Reference: <1290218934-8544-3-git-send-email-john.stultz@linaro.org> Signed-off-by: Ingo Molnar commit 6735329934e9acc1941a991ed6f6ad4be3e082a5 Author: Juuso Oikarinen Date: Thu Nov 18 15:19:02 2010 +0200 wl12xx: Fix kernel crash related to hw recovery and interface shutdown It is possible that the op_remove_interface function is invoked exactly at the same time has hw recovery is started. In this case it is possible for the interface to be already removed in the op_remove_interface call, which currently leads to a kernel warning and a subsequent kernel crash. Fix this by ignoring the op_remove_interface call if the interface is already down at that point. Signed-off-by: Juuso Oikarinen Tested-by: Tuomas Katila Signed-off-by: Luciano Coelho commit bc15fde77fc5d9ec2eec6066a5ab554ea1266a0a Author: Jeremy Fitzhardinge Date: Mon Nov 22 17:17:50 2010 -0800 xen: use default_idle We just need the idle loop to drop into safe_halt, which default_idle() is perfectly capable of doing. There's no need to duplicate it. Signed-off-by: Jeremy Fitzhardinge commit c2d0879112825cddddd6c4f9b2645ff32acd6dc5 Author: Jeremy Fitzhardinge Date: Mon Nov 22 16:31:35 2010 -0800 xen: clean up "extra" memory handling some more Make sure that extra_pages is added for all E820_RAM regions beyond mem_end - completely excluded regions as well as the remains of partially included regions. Also makes sure the extra region is not unnecessarily high, and simplifies the logic to decide which regions should be added. Signed-off-by: Jeremy Fitzhardinge commit f8afa42b01c7a9f45b7cbaadb0481a0eeb96f18d Author: Felix Fietkau Date: Mon Nov 22 18:26:51 2010 +0100 ath9k_htc: fix eeprom access wireless-testing commit a05b5d45049d60a06a1b12976150572304a51928 ath9k: add support for reading eeprom from platform data on PCI devices This change moved the initialization of the AH_USE_EEPROM flag from ath9k_hw to ath9k. This needs to be added to ath9k_htc as well Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 02d2ebb2a0aa2cae0446289c8f927067aec06079 Author: Felix Fietkau Date: Mon Nov 22 15:39:39 2010 +0100 ath9k_hw: fix A-MPDU key search issues on AR9003 Under load, a large number of frames can produce decryption errors, even when no key cache update is being done. Performing a key search for every single frame in an A-MPDU improves reliability. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 7253965a1cfbd22dd20f92b7a054e831777e284e Author: Joe Perches Date: Sat Nov 20 18:39:03 2010 -0800 zd1211rw: Use const Mark arrays const that are unmodified after initializations. text data bss dec hex filename 19291 56 4136 23483 5bbb drivers/net/wireless/zd1211rw/zd_chip.o.old 19291 56 4136 23483 5bbb drivers/net/wireless/zd1211rw/zd_chip.o.new Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit f4e16e41d62ddc75704a0344567a807ebb41a929 Author: Joe Perches Date: Sat Nov 20 18:39:01 2010 -0800 rt2x00: Use static const Using static const generally increases object text and decreases data size. It also generally decreases overall object size. text data bss dec hex filename 40197 56 8336 48589 bdcd drivers/net/wireless/rt2x00/rt2800lib.o.new 40205 56 8336 48597 bdd5 drivers/net/wireless/rt2x00/rt2800lib.o.old Signed-off-by: Joe Perches Acked-by: Gertjan van Wingerde Signed-off-by: John W. Linville commit 22288a5847df30fb8ba298914f144c3b1d6e1fbe Author: Joe Perches Date: Sat Nov 20 18:39:00 2010 -0800 rndis_wlan: Use static const Using static const generally increases object text and decreases data size. It also generally decreases overall object size. text data bss dec hex filename 41757 2205 9896 53858 d262 drivers/net/wireless/rndis_wlan.o.old 41653 2205 9880 53738 d1ea drivers/net/wireless/rndis_wlan.o.new Changed functions rndis_set_oid and set_bssid to take const *'s. Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit ff273b91ff04e6f232234b70c45101074a0daa27 Author: Joe Perches Date: Sat Nov 20 18:38:59 2010 -0800 ray_cs: Use static const Using static const generally increases object text and decreases data size. It also generally decreases overall object size. text data bss dec hex filename 42607 3581 8536 54724 d5c4 drivers/net/wireless/ray_cs.o.new 42603 3585 8536 54724 d5c4 drivers/net/wireless/ray_cs.o.old Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit 482e039f2a6546ee2ecf718ae6c02e84d1a7f00b Author: Joe Perches Date: Sat Nov 20 18:38:58 2010 -0800 libertas: Use static const Using static const generally increases object text and decreases data size. It also generally decreases overall object size. text data bss dec hex filename 3650 56 704 4410 113a drivers/net/wireless/libertas/rx.o.new 3695 56 704 4455 1167 drivers/net/wireless/libertas/rx.o.old 27328 964 5240 33532 82fc drivers/net/wireless/libertas/cfg.o.new 27328 964 5240 33532 82fc drivers/net/wireless/libertas/cfg.o.old Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit 20407ed8a5bb271dd8e8bd4678e1d3dadeb318bd Author: Joe Perches Date: Sat Nov 20 18:38:57 2010 -0800 iwlwifi: Use static const Using static const generally increases object text and decreases data size. It also generally decreases overall object size. text data bss dec hex filename 48644 57 12120 60821 ed95 drivers/net/wireless/b43/phy_n.o.new 48661 57 12120 60838 eda6 drivers/net/wireless/b43/phy_n.o.old 37906 86 7904 45896 b348 drivers/net/wireless/iwlwifi/iwl-agn-lib.o.new 37937 86 7904 45927 b367 drivers/net/wireless/iwlwifi/iwl-agn-lib.o.old 37781 523 6752 45056 b000 drivers/net/wireless/iwlwifi/iwl-3945.o.new 37781 523 6752 45056 b000 drivers/net/wireless/iwlwifi/iwl-3945.o.old Changed b43_nphy_write_clip_detection to take a const u16 * Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit 5b4bc649e18539a5d5a5482670d77f3f72de0eea Author: Joe Perches Date: Sat Nov 20 18:38:56 2010 -0800 b43: Use static const Using static const generally increases object text and decreases data size. It also generally decreases overall object size. text data bss dec hex filename 5502 56 1336 6894 1aee drivers/net/wireless/b43/phy_common.o.new 5511 56 1336 6903 1af7 drivers/net/wireless/b43/phy_common.o.old Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit 3370a895454ad814d0fb5f50352cea4e51d7392f Author: Joe Perches Date: Sat Nov 20 18:38:55 2010 -0800 atmel: Use static const Using static const generally increases object text and decreases data size. It also generally decreases overall object size. text data bss dec hex filename 42578 720 8528 51826 ca72 drivers/net/wireless/atmel.o.old 42578 720 8528 51826 ca72 drivers/net/wireless/atmel.o.new Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit 5653a63d85300dbed71b76ab7ada03808bdfb170 Author: Joe Perches Date: Sat Nov 20 18:38:54 2010 -0800 carl9170: Use static const Using static const generally increases object text and decreases data size. It also generally decreases overall object size. text data bss dec hex filename 1897 56 672 2625 a41 drivers/net/wireless/ath/carl9170/cmd.o.new 1897 56 672 2625 a41 drivers/net/wireless/ath/carl9170/cmd.o.old Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit 07b2fa5a2368accf0fe6cb16e7eca6d1150554ed Author: Joe Perches Date: Sat Nov 20 18:38:53 2010 -0800 ath9k: Use static const Using static const generally increases object text and decreases data size. It also generally decreases overall object size. text data bss dec hex filename 11161 56 2136 13353 3429 drivers/net/wireless/ath/ath9k/ar9003_paprd.o.new 11167 56 2136 13359 342f drivers/net/wireless/ath/ath9k/ar9003_paprd.o.old 15428 56 3056 18540 486c drivers/net/wireless/ath/ath9k/eeprom_4k.o.old 15451 56 3056 18563 4883 drivers/net/wireless/ath/ath9k/eeprom_4k.o.new 14087 56 2560 16703 413f drivers/net/wireless/ath/ath9k/eeprom_9287.o.old 14036 56 2560 16652 410c drivers/net/wireless/ath/ath9k/eeprom_9287.o.new 10041 56 2384 12481 30c1 drivers/net/wireless/ath/ath9k/ani.o.new 10088 56 2384 12528 30f0 drivers/net/wireless/ath/ath9k/ani.o.old 9316 1580 2304 13200 3390 drivers/net/wireless/ath/ath9k/htc_drv_init.o.new 9316 1580 2304 13200 3390 drivers/net/wireless/ath/ath9k/htc_drv_init.o.old 16483 56 3432 19971 4e03 drivers/net/wireless/ath/ath9k/ar9003_phy.o.new 16517 56 3432 20005 4e25 drivers/net/wireless/ath/ath9k/ar9003_phy.o.old 18221 104 2960 21285 5325 drivers/net/wireless/ath/ath9k/rc.o.old 18203 104 2960 21267 5313 drivers/net/wireless/ath/ath9k/rc.o.new 19985 56 4288 24329 5f09 drivers/net/wireless/ath/ath9k/eeprom_def.o.new 20040 56 4288 24384 5f40 drivers/net/wireless/ath/ath9k/eeprom_def.o.old 23997 56 4984 29037 716d drivers/net/wireless/ath/ath9k/ar5008_phy.o.old 23846 56 4984 28886 70d6 drivers/net/wireless/ath/ath9k/ar5008_phy.o.new 24285 56 3184 27525 6b85 drivers/net/wireless/ath/ath9k/ar9003_eeprom.o.old 24101 56 3184 27341 6acd drivers/net/wireless/ath/ath9k/ar9003_eeprom.o.new 6834 56 1032 7922 1ef2 drivers/net/wireless/ath/ath9k/ar9002_phy.o.old 6780 56 1032 7868 1ebc drivers/net/wireless/ath/ath9k/ar9002_phy.o.new 36211 64 8624 44899 af63 drivers/net/wireless/ath/ath9k/hw.o.new 36401 64 8624 45089 b021 drivers/net/wireless/ath/ath9k/hw.o.old 9281 56 1496 10833 2a51 drivers/net/wireless/ath/ath9k/ar9003_calib.o.old 9150 56 1496 10702 29ce drivers/net/wireless/ath/ath9k/ar9003_calib.o.new Use ARRAY_SIZE instead of a magic number. Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit 8b22523b045858042c6700f556f840853de163ea Author: Joe Perches Date: Sat Nov 20 18:38:52 2010 -0800 ath5k: Use static const Using static const generally increases object text and decreases data size. It also generally decreases overall object size. text data bss dec hex filename 11266 56 2464 13786 35da drivers/net/wireless/ath/ath5k/ani.o.old 11181 56 2464 13701 3585 drivers/net/wireless/ath/ath5k/ani.o.new Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit 85be3d98dbc8d9cff9411c52c619c3752737b7b4 Author: Joe Perches Date: Sat Nov 20 18:38:51 2010 -0800 ar9170: Use const Mark an array const. Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit a9ab21133581580f6907abbc33fd3870e75dc935 Author: Christian Lamparter Date: Sat Nov 20 16:53:26 2010 +0100 carl9170: fix init-self regression The commit: "carl9170: tx path review" introduced a regression. gcc (with -Winit-self): tx.c:1264: warning: ‘super’ is used uninitialized in this function Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit 3b1d6dfaaf89694c2aa56fe9a6b0f0221b98a209 Author: Huang Weiyi Date: Sat Nov 20 20:06:02 2010 +0800 libertas: remove duplicated #include Remove duplicated #include('s) in drivers/net/wireless/libertas/cfg.c Signed-off-by: Huang Weiyi Signed-off-by: John W. Linville commit e1566d1f322b41b1ac3acf33407a0cfe2a311b75 Author: Felix Fietkau Date: Sat Nov 20 03:08:46 2010 +0100 ath9k: fix recursive locking in the tx flush path Signed-off-by: Felix Fietkau Tested-by: Ben Greear Signed-off-by: John W. Linville commit 33e808c383477e821163f133c2e3e671879c28b6 Author: Dmitry Torokhov Date: Mon Nov 22 12:53:23 2010 -0800 Input: iforce - clean up Makefile Use -y notation to specify list of objects comprising iforce module and conditionally pull in USB and RS232 support. Also remove custom compiler flags and rely on general makefile rules for enabling warnings. Signed-off-by: Dmitry Torokhov commit ebde50d5a49122c164f81958a03993e1c947c0b6 Author: Dmitry Torokhov Date: Mon Nov 22 12:39:28 2010 -0800 Input: clean up Makefile (use input-core-y) The proper way to specify multi-source object is to use -y instead of -obj (which is deprecated) as it allows conditional inclusion of modules in the list. Signed-off-by: Dmitry Torokhov commit b5bb2f2beb4d54597fd54075480fc4874a9c08dc Author: Johannes Berg Date: Thu Nov 18 12:08:10 2010 -0800 iwlwifi: fix modular 3945 only build If only 3945 is selected, and is a module, build fails because iwl-legacy.c won't be compiled. Fix this by adding it to the build correctly. This doesn't happen for 4965 because it is a bool option, not tristate, since it's built into the AGN module. Reported-by: Randy Dunlap Tested-by: Randy Dunlap Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 18890d4b89d8507ad09289f6f57a71591c7e9e83 Author: Helmut Schaa Date: Fri Nov 19 08:11:01 2010 +0100 mac80211: Disable hw crypto for GTKs on AP VLAN interfaces When using AP VLAN interfaces, each VLAN interface should be in its own broadcast domain. Hostapd achieves this by assigning different GTKs to different AP VLAN interfaces. However, mac80211 drivers are not aware of AP VLAN interfaces and as such mac80211 sends the GTK to the driver in the context of the base AP mode interface. This causes problems when multiple AP VLAN interfaces are used since the driver will use the same key slot for the different GTKs (there's no way for the driver to distinguish the different GTKs from different AP VLAN interfaces). Thus, only the clients associated to one AP VLAN interface (the one that was created last) can actually use broadcast traffic. Fix this by not programming any GTKs for AP VLAN interfaces into the hw but fall back to using software crypto. The GTK for the underlying AP interface is still sent to the driver. That means, broadcast traffic to stations associated to an AP VLAN interface is encrypted in software whereas broadcast traffic to stations associated to the non-VLAN AP interface is encrypted in hardware. Cc: Johannes Berg Signed-off-by: Helmut Schaa Signed-off-by: John W. Linville commit b2e253cf300c5e33f49b7dd8b593bfc722177401 Author: Luis R. Rodriguez Date: Wed Nov 17 21:46:09 2010 -0800 cfg80211: Fix regulatory bug with multiple cards and delays When two cards are connected with the same regulatory domain if CRDA had a delayed response then cfg80211's own set regulatory domain would still be the world regulatory domain. There was a bug on cfg80211's logic such that it assumed that once you pegged a request as the last request it was already the currently set regulatory domain. This would mean we would race setting a stale regulatory domain to secondary cards which had the same regulatory domain since the alpha2 would match. We fix this by processing each regulatory request atomically, and only move on to the next one once we get it fully processed. In the case CRDA is not present we will simply world roam. This issue is only present when you have a slow system and the CRDA processing is delayed. Because of this it is not a known regression. Without this fix when a delay is present with CRDA the second card would end up with an intersected regulatory domain and not allow it to use the channels it really is designed for. When two cards with two different regulatory domains were inserted you'd end up rejecting the second card's regulatory domain request. This fails with mac80211_hswim's regtest=2 (two requests, same alpha2) and regtest=3 (two requests, different alpha2) module parameter options. This was reproduced and tested against mac80211_hwsim using this CRDA delayer: #!/bin/bash echo $COUNTRY >> /tmp/log sleep 2 /sbin/crda.orig And these regulatory tests: modprobe mac80211_hwsim regtest=2 modprobe mac80211_hwsim regtest=3 Reported-by: Mark Mentovai Signed-off-by: Luis R. Rodriguez Tested-by: Mark Mentovai Tested-by: Bruno Randolf Signed-off-by: John W. Linville commit b0e2880b0518ad11af20c7c93ec5cac93f9f03b0 Author: Luis R. Rodriguez Date: Wed Nov 17 21:46:08 2010 -0800 cfg80211: move mutex locking to reg_process_pending_hints() This will be required in the next patch and it makes the next patch easier to review. Signed-off-by: Luis R. Rodriguez Tested-by: Mark Mentovai Tested-by: Bruno Randolf Signed-off-by: John W. Linville commit f333a7a2f49e2a9b46f8d18962bd750b18beeecd Author: Luis R. Rodriguez Date: Wed Nov 17 21:46:07 2010 -0800 cfg80211: move reg_work and reg_todo above These will be used earlier in the next few patches. Signed-off-by: Luis R. Rodriguez Tested-by: Mark Mentovai Tested-by: Bruno Randolf Signed-off-by: John W. Linville commit 31e99729ae66d8b74316547c40eed15172f14ea8 Author: Luis R. Rodriguez Date: Wed Nov 17 21:46:06 2010 -0800 cfg80211: put core regulatory request into queue This will simplify the synchronization for pending requests. Without this we have a race between the core and when we restore regulatory settings, although this is unlikely its best to just avoid that race altogether. Signed-off-by: Luis R. Rodriguez Tested-by: Mark Mentovai Tested-by: Bruno Randolf Signed-off-by: John W. Linville commit 8ce469999552b0c3325350cd9b4be417f2bbfc23 Author: RafaÅ‚ MiÅ‚ecki Date: Wed Nov 17 22:14:37 2010 +0100 b43: rfkill: use HI enabled bit for all devices Devices which use LO enabled bit are covered by b43legacy Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 176bfc44417544724e6df0831a7f576f4a56283d Author: Daniel Walker Date: Tue Sep 7 13:33:05 2010 -0700 arm: kconfig: dis-allow hotplug on MSM MSM doesn't support hotplug, so we prevent it from being selected in Kconfig. Signed-off-by: Daniel Walker commit 89c3dedf477da9c8d42d3a63d16875e52f74108b Author: Daniel Walker Date: Mon Nov 22 12:35:41 2010 -0800 arm: kconfig: enable SMP for MSM targets This just adds ARCH_MSM_SCORPIONMP to allow SMP selection for MSM. MSM is unique in that it doesn't enable SCU or TWD. Signed-off-by: Daniel Walker commit 8933f90c777c5728822206a2313c9c1361f5274f Author: RafaÅ‚ MiÅ‚ecki Date: Thu Oct 14 22:58:58 2010 +0200 b43: N-PHY: add 2056 radio channels tables Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 840fd8ff64f7b6c9cbfa9b7d0419f015f33303ff Merge: b84a7d3d9e7cd5a25f4fd32142cebdf4481a74a4 9e2e7422d059f9b98c3a0810df92a1ff660ade2f Author: John W. Linville Date: Mon Nov 22 15:28:30 2010 -0500 Merge branch 'wireless-next-2.6' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-2.6 commit c89ad7372232b69fd37edf90d6f5d2a8d6381214 Author: Gustavo F. Padovan Date: Mon Nov 1 19:08:50 2010 +0000 Bluetooth: Fix not returning proper error in SCO Return 0 in that situation could lead to errors in the caller. Signed-off-by: Gustavo F. Padovan commit 09910509ebc74643e94fe6f3feb4c23b019aeb34 Author: Glenn Sommer Date: Mon Nov 22 12:00:05 2010 -0800 Input: usbtouchscreen - add support for LG Flatron T1710B I've recently got my hands on a LG Flatron T1710B touchscreen. As other LG products, this seems to use the ITM panel. Signed-off-by: Glenn Sommer Signed-off-by: Dmitry Torokhov commit eb06acdc85585f28864261f28659157848762ee4 Author: Sridhar Samudrala Date: Thu Oct 28 13:10:50 2010 +0000 macvlan: Introduce 'passthru' mode to takeover the underlying device With the current default 'vepa' mode, a KVM guest using virtio with macvtap backend has the following limitations. - cannot change/add a mac address on the guest virtio-net - cannot create a vlan device on the guest virtio-net - cannot enable promiscuous mode on guest virtio-net To address these limitations, this patch introduces a new mode called 'passthru' when creating a macvlan device which allows takeover of the underlying device and passing it to a guest using virtio with macvtap backend. Only one macvlan device is allowed in passthru mode and it inherits the mac address from the underlying device and sets it in promiscuous mode to receive and forward all the packets. Signed-off-by: Sridhar Samudrala ------------------------------------------------------------------------- Signed-off-by: David S. Miller commit e5700c740da2cb9f5a3aa978cd1fa3a79916ba04 Author: Tracey Dent Date: Sun Nov 21 15:03:28 2010 +0000 Net: wanrouter: Makefile: Remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit fdb26195f494988fc155c204aab0f0953ba7ec6f Author: Tracey Dent Date: Sun Nov 21 15:03:27 2010 +0000 Net: sunrpc: auth_gss: Makefile: Remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit 9ed05ad3c0629f434b18d20c51162f9bbb4f5d31 Author: Tracey Dent Date: Sun Nov 21 15:03:26 2010 +0000 Net: rxrpc: Makefile: Remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit 094f2faaa2c4973e50979158f655a1d31a97ba98 Author: Tracey Dent Date: Sun Nov 21 15:03:25 2010 +0000 Net: rds: Makefile: Remove deprecated items Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Also, use the ccflags-$ flag instead of EXTRA_CFLAGS because EXTRA_CFLAGS is deprecated and should now be switched. Last but not least, took out if-conditionals. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit 927a41f50c83b539fde5c01911f4968d717199bf Author: Tracey Dent Date: Sun Nov 21 15:03:24 2010 +0000 Net: phonet: Makefile: Remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit 64387df8da1e4f178a47d53930288a46a357a479 Author: Tracey Dent Date: Sun Nov 21 15:03:23 2010 +0000 Net: lapb: Makefile: Remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit 94ee288e94ab31cefe2c5af3b59c25a1374ca3e5 Author: Tracey Dent Date: Sun Nov 21 15:03:22 2010 +0000 Net: irda: irnet: Makefile: Remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit cd30c62024904951392e21a200fe5427a6286736 Author: Tracey Dent Date: Sun Nov 21 15:03:21 2010 +0000 Net: irda: irlan: Makefile: Remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit f91c4ae4989322ed5cd10b5247e1a7bd3868a84e Author: Tracey Dent Date: Sun Nov 21 15:03:20 2010 +0000 Net: irda: ircomm: Makefile: Remove deprecated kbuild goal defintions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit 4de58dfebe6882dc1e8e8dc5ec062e28e99623cd Author: Tracey Dent Date: Sun Nov 21 15:03:19 2010 +0000 Net: ipv6: netfiliter: Makefile: Remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit 6b8ff8c517008d93a6da62b106072a12dea8cb7c Author: Tracey Dent Date: Sun Nov 21 15:03:18 2010 +0000 Net: ipv4: netfilter: Makefile: Remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit cc0bdac399b1881626cd5512f292e396c9c96685 Author: Tracey Dent Date: Sun Nov 21 15:03:17 2010 +0000 Net: econet: Makefile: Remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit 22674a24b44ac53f244ef6edadd02021a270df5a Author: Tracey Dent Date: Sun Nov 21 15:03:16 2010 +0000 Net: dns_resolver: Makefile: Remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit fa13bc3daa5954ce58f68fd34fb1611df6ea6e6f Author: Tracey Dent Date: Sun Nov 21 15:03:15 2010 +0000 Net: ceph: Makefile: remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit bac14e017830bd204b3a1bd55f42b0841c02e995 Author: Tracey Dent Date: Sun Nov 21 15:03:14 2010 +0000 Net: can: Makefile: Remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit a3106d032fb17283c96fa041f8285e6926ae074d Author: Tracey Dent Date: Sun Nov 21 15:03:13 2010 +0000 Net: caif: Makefile: Remove deprecated items Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Also, use the ccflags-$ flag instead of EXTRA_CFLAGS because EXTRA_CFLAGS is deprecated and should now be switched. Last but not least, took out if-conditionals. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit 87217502d4f45a9925c5eda5b2179f1220e87537 Author: Tracey Dent Date: Sun Nov 21 15:03:12 2010 +0000 Net: bluetooth: Makefile: Remove deprecated kbuild goal definitions Changed Makefile to use -y instead of -objs because -objs is deprecated and not mentioned in Documentation/kbuild/makefiles.txt. Signed-off-by: Tracey Dent Signed-off-by: David S. Miller commit b84a7d3d9e7cd5a25f4fd32142cebdf4481a74a4 Author: Juuso Oikarinen Date: Mon Nov 22 12:59:08 2010 +0200 wl12xx: Unset bssid filter, ssid and bssid from firmware on disassoc On the disassociation event from the mac80211, the wl12xx driver does not clear the chipset configuration related to the AP - i.e. it does not perform a DISCONNECT and then a JOIN with zero SSID and dummy BSSID. Also, it does not unset the BSSID filter. Often this is not a problem, as the above is performed upon entering idle state. But if a scenario arises where a new association is attempted without cycling through idle state, the new association will fail. Fix this by resetting the firmware state on disassociation. Signed-off-by: Juuso Oikarinen Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho commit 68d069c45f73e8aeda0249891daec1f7e2f0e067 Author: Arik Nemtsov Date: Mon Nov 8 10:51:07 2010 +0100 wl1271: add support for HW TX fragmentation Indicate to mac80211 we support HW fragmentation. Support updates of the fragmentation threshold via the set_frag_threshold callback. Signed-off-by: Arik Nemtsov Signed-off-by: Luciano Coelho commit fa97f46b30357a50f3ee193e6f82864f95bc55ec Author: Juuso Oikarinen Date: Wed Nov 10 11:27:20 2010 +0100 Revert "wl1271: Change supported channel order for a more optimal scan" This reverts commit fa21c7a9e4be439e217fe72edbd39b643b643791. The reverted patch caused more harm than benefit. Signed-off-by: Juuso Oikarinen Reviewed-by: Luciano Coelho Tested-by: Tuomas Katila Signed-off-by: Luciano Coelho commit b7417d930afdc214daa24299912d984e7f4f390a Author: Juuso Oikarinen Date: Wed Nov 10 11:27:19 2010 +0100 wl1271: Prevent ad-hoc and active scanning on 11a DFS frequencies The wl1271 does not support radar detection. Hence, prevent ad-hoc and active scanning on frequencies requiring DFS. Signed-off-by: Juuso Oikarinen Tested-by: Tuomas Katila Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho commit 91433029e42e58d8536299f32fa55cf589adff35 Author: Gery Kahn Date: Sun Nov 7 10:04:20 2010 +0100 wl1271: cleanup unused code of calibration structures The cleanup unused code for calibration procedures. Signed-off-by: Gery Kahn Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho commit 00d201001bd4e8a46e3d03c970abcb72256c368b Author: Shahar Levi Date: Mon Nov 8 11:20:10 2010 +0000 wl1271: Change wl12xx Files Names All files name prefix removed due to the fact that wl12xx driver supports wl1271 and wl1273. Also the definition in Kconfig and header files changed respectively. Signed-off-by: Shahar Levi Signed-off-by: Luciano Coelho commit 9a1f8b34aa539000da17a06235e4bec254d0bfb5 Author: Laurent Pinchart Date: Fri Sep 24 10:16:44 2010 -0300 [media] v4l: Remove module_name argument to the v4l2_i2c_new_subdev* functions The argument isn't used anymore by the functions, remove it. Signed-off-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab commit aa2d8cbe169b7328eeabc9e2debccf5aee6f9199 Author: Laurent Pinchart Date: Sat Oct 23 09:13:37 2010 -0300 [media] v4l: Remove hardcoded module names passed to v4l2_i2c_new_subdev* (2) With the v4l2_i2c_new_subdev* functions now supporting loading modules based on modaliases, replace the hardcoded module name passed to those functions by NULL in the cafe-ccic, via-camera and s5p-fimc drivers. All corresponding I2C modules have been checked, and all of them include a module aliases table with names corresponding to what the drivers modified here use. Signed-off-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab commit 691513f70d3957939a318da970987b876c720861 Author: Lin Ming Date: Mon Nov 22 14:03:28 2010 +0100 x86: Resume trampoline must be executable commit 5bd5a452(x86: Add NX protection for kernel data) marked the trampoline area NX - which unsurprisingly breaks resume and cpu hotplug. Revert the portion of that commit, which touches the trampoline. Originally-from: Lin Ming LKML-Reference: <1290410581.2405.24.camel@minggr.sh.intel.com> Cc: Matthieu Castet Cc: Siarhei Liakh Cc: Xuxian Jiang Cc: Ingo Molnar Cc: Arjan van de Ven Cc: Andi Kleen Tested-by: Peter Zijlstra Signed-off-by: Thomas Gleixner commit 9b4320b77bab4031649c484da1c595f39c2e43cd Author: Mauro Carvalho Chehab Date: Tue Nov 9 14:29:05 2010 -0300 [media] Fix Kconfig errors due to two visible menus Use the new visible Kconfig keyword to avoid producing error for two menus that are visible only if Tuner/frontend customise options are enabled. Signed-off-by: Mauro Carvalho Chehab commit c38bd4ffc7f24a99a14f9c776276e816f5de2509 Author: Arnaud Lacombe Date: Sat Nov 6 18:30:27 2010 -0300 i2c/algos: convert Kconfig to use the menu's `visible' keyword Signed-off-by: Arnaud Lacombe Signed-off-by: Mauro Carvalho Chehab commit 37e3273ee52fb995c1f531fa1d98d190cc35e1bc Author: Arnaud Lacombe Date: Sat Nov 6 18:30:26 2010 -0300 media/video: convert Kconfig to use the menu's `visible' keyword Signed-off-by: Arnaud Lacombe Signed-off-by: Mauro Carvalho Chehab commit dfc518dd6b5c5e00f98906eaa5c7d716d856c098 Author: Arnaud Lacombe Date: Sat Nov 6 18:30:25 2010 -0300 Revert "i2c: Fix Kconfig dependencies" This reverts commit 0a57274ea026c2b7670683947b6cc08b195148cf. Signed-off-by: Arnaud Lacombe Signed-off-by: Mauro Carvalho Chehab commit 09899c93b183870b122c94317f63344df43368e9 Author: Arnaud Lacombe Date: Sat Nov 6 18:30:24 2010 -0300 kconfig: regen parser Signed-off-by: Arnaud Lacombe Signed-off-by: Mauro Carvalho Chehab commit da79de97d254145dcb7c08c978b1093eac15ec9c Author: Chris Wilson Date: Mon Nov 22 11:12:46 2010 +0000 drm/i915/sdvo: Only enable HDMI encodings only if the commandset is supported As we conflated intel_sdvo->is_hdmi with both having HDMI support on the ADD along with having HDMI support on the monitor, we would attempt to use HDMI encodings even if the interface did not support those commands. Reported-by: Simon Farnsworth Signed-off-by: Chris Wilson Tested-by: Simon Farnsworth Reviewed-by: Simon Farnsworth commit 86e187ff9bce9fbed7bfed92ae34f491cf1af50f Author: Arnaud Lacombe Date: Sat Nov 6 18:30:23 2010 -0300 kconfig: add an option to determine a menu's visibility This option is aimed to add the possibility to control a menu's visibility without adding dependency to the expression to all the submenu. Signed-off-by: Arnaud Lacombe Acked-by: Mauro Carvalho Chehab Tested-by: Mauro Carvalho Chehab Signed-off-by: Mauro Carvalho Chehab commit 07a8cdd2bb17a4da68136d963b8bc71959bd31a5 Author: Anand Gadiyar Date: Thu Nov 18 18:54:17 2010 +0530 usb: musb: do not use dma for control transfers The Inventra DMA engine used with the MUSB controller in many SoCs cannot use DMA for control transfers on EP0, but can use DMA for all other transfers. The USB core maps urbs for DMA if hcd->self.uses_dma is true. (hcd->self.uses_dma is true for MUSB as well). Split the uses_dma flag into two - one that says if the controller needs to use PIO for control transfers, and another which says if the controller uses DMA (for all other transfers). Also, populate this flag for all MUSB by default. (Tested on OMAP3 and OMAP4 boards, with EHCI and MUSB HCDs simultaneously in use). Signed-off-by: Maulik Mankad Signed-off-by: Santosh Shilimkar Signed-off-by: Anand Gadiyar Cc: Oliver Neukum Cc: Alan Stern Cc: Praveena NADAHALLY Cc: Ajay Kumar Gupta Signed-off-by: Felipe Balbi commit bb324b08165d5656d221af013ed9994a54e455be Author: Ajay Kumar Gupta Date: Mon Nov 22 14:22:41 2010 +0530 usb: musb: gadget: fix compilation warning Fixes below compilation warning when musb driver is compiled for PIO mode: drivers/usb/musb/musb_gadget.c: In function 'musb_g_rx': drivers/usb/musb/musb_gadget.c:840: warning: label 'exit' defined but not used Signed-off-by: Ajay Kumar Gupta Signed-off-by: Felipe Balbi commit e75df37165c639b06213ec88b4763c3e50a7f079 Author: Ming Lei Date: Tue Nov 16 23:37:37 2010 +0800 usb: musb: clear RXCSR_AUTOCLEAR before PIO read If RXCSR_AUTOCLEAR flag is not cleard before PIO reading, one packet may be recieved by musb fifo, but no chance to notify software, so cause packet loss, follows the detailed process: - PIO read one packet - musb fifo auto clear the MUSB_RXCSR_RXPKTRDY - musb continue to recieve the next packet, and MUSB_RXCSR_RXPKTRDY is set - software clear the MUSB_RXCSR_RXPKTRDY, so there is no chance for musb to notify software that the 2nd recieved packet. The patch does fix the g_ether issue below: - use fifo_mode 3 to enable double buffer - 'ping -s 1024 IP_OF_BEAGLE_XM' - one usb packet of 512 byte is lost, so ping failed, which can be observed by wireshark note: Beagle xm takes musb rtl1.8 and may fallback to pio mode for unaligned buffer. Signed-off-by: Ming Lei Signed-off-by: Felipe Balbi commit 92d2711f5dc15bf956546923a5718e74853f9912 Author: Hema Kalliguddi Date: Mon Nov 15 04:24:01 2010 -0600 usb: musb: unmap dma buffer when switching to PIO Buffer is mapped to dma when dma channel is allocated. If, for some reason, dma channel programming fails, musb code will fallback to PIO mode to transfer that request. In that case, we need to unmap the buffer back to CPU. MUSB RTL1.8 and above cannot handle buffers which are not 32bit aligned. That happens to every request sent by g_ether gadget driver. Since the buffer sent was unaligned, we need to fallback to PIO. Because of that, g_ether was failing due to missing buffer unmapping. With this patch and [1] g_ether works fine with all MUSB revisions. Verified with OMAP3630 board, which has MUSB RTL1.8 using g_ether and g_zero. [1] http://www.spinics.net/lists/linux-usb/msg38400.html Signed-off-by: Hema HK Signed-off-by: Felipe Balbi commit 4ab0fbd3a29067e1540f05093ae4ed07645d18c8 Merge: f3c91c1deaf8493526d8216be94c33e963f00962 3561d43fd289f590fdae672e5eb831b8d5cf0bf6 Author: Chris Wilson Date: Mon Nov 22 08:47:43 2010 +0000 Merge remote branch 'linus' into drm-intel-fixes commit f09830ab15bfb7eb4e832e44189b5b5883309811 Author: Axel Lin Date: Sun Nov 21 22:27:13 2010 -0800 Input: ct82c710 - remove a redundant serio_register_port() We already call serio_register_port() in ct82c710_probe(), thus remove a redundant serio_register_port() in ct82c710_init(). Looks like this bug is introduced by 916d83cfe5da1cda454d8b0ae233f06b58bd7f91 "Input: ct82c710 - convert to the new platform device interface" [dtor@mail.ru: also move printk to where we register port] Signed-off-by: Axel Lin Signed-off-by: Dmitry Torokhov commit ebcc019926269e7e123d55ec92ff00c2688ca343 Author: Axel Lin Date: Sun Nov 21 22:27:09 2010 -0800 Input: ams_delta_serio - fix wrong kfree in ams_delta_serio_exit serio_unregister_port() will call put_device() to free the memory. Thus remove kfree(ams_delta_serio) after serio_unregister_port(ams_delta_serio). Signed-off-by: Axel Lin Signed-off-by: Dmitry Torokhov commit 0e86eb29def648664c2c0fa605f5b5bad84247cb Author: Axel Lin Date: Sun Nov 21 22:23:06 2010 -0800 Input: ps2mult - fix wrong kfree in ps2mult_connect error path Signed-off-by: Axel Lin Signed-off-by: Dmitry Torokhov commit f24d86f1a49505cdea56728b853a5d0a3f8e3d11 Author: Alex Deucher Date: Fri Nov 19 23:27:04 2010 +0000 drm/radeon/kms: fix resume regression for some r5xx laptops I had removed this when I switched the atom indirect io methods to use the io bar rather than the mmio bar, but it appears it's still needed. Reported-by: Mark Lord Signed-off-by: Alex Deucher Cc: stable@kernel.org Signed-off-by: Dave Airlie commit 791cfe2684a74ed7155254816ff9e89e6064277c Author: Alex Deucher Date: Sun Nov 21 10:58:05 2010 -0500 drm/radeon/kms: fix regression in rs4xx i2c setup typo in my last i2c rework. Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=23222 Signed-off-by: Alex Deucher Cc: stable@kernel.org Signed-off-by: Dave Airlie commit 551eaff1b384cc107eab6332ba8424b3ca1f304b Author: Eric Dumazet Date: Sun Nov 21 10:26:44 2010 -0800 pktgen: allow faster module unload Unloading pktgen module needs ~6 seconds on a 64 cpus machine, to stop 64 kthreads. Add a pktgen_exiting variable to let kernel threads die faster, so that kthread_stop() doesnt have to wait too long for them. This variable is not tested in fast path. Note : Before exiting from pktgen_thread_worker(), we must make sure kthread_stop() is waiting for this thread to be stopped, like its done in kernel/softirq.c Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 20a95a2169d1cd3da50cf65ba882d0e27a4a2d4f Author: Jan Engelhardt Date: Sat Nov 20 18:07:21 2010 +0000 netns: let net_generic take pointer-to-const args This commit is same in nature as v2.6.37-rc1-755-g3654654; the network namespace itself is not modified when calling net_generic, so the parameter can be const. Signed-off-by: Jan Engelhardt Signed-off-by: David S. Miller commit bbce5a59e4e0e6e1dbc85492caaf310ff6611309 Author: Eric Dumazet Date: Sat Nov 20 07:31:54 2010 +0000 packet: use vzalloc() alloc_one_pg_vec_page() is supposed to return zeroed memory, so use vzalloc() instead of vmalloc() Signed-off-by: Eric Dumazet Cc: Neil Horman Acked-by: Neil Horman Signed-off-by: David S. Miller commit 9a2d09cf61c9d9f1b31998bec5363a583e4564a4 Author: Don Skidmore Date: Sun Nov 21 09:55:10 2010 -0800 ixgbe: update version number for ixgbe This will reflect addition of new X540 hardware Signed-off-by: Don Skidmore Signed-off-by: Jeff Kirsher Signed-off-by: David S. Miller commit f3c91c1deaf8493526d8216be94c33e963f00962 Author: Chris Wilson Date: Sun Nov 21 09:56:00 2010 +0000 drm/i915: Only save/restore cursor regs if !KMS Under KMS, restoring the cursor is handled upon modeswitch in order to avoid enabling an undefined set of registers. At the moment, the cursor is restored before the aperture and modes are fully setup causing some invalid access during resume, such as: PGTBL_ER: 0x00040000 Invalid GTT entry during Cursor Fetch Fix this by only performing cursor register save/restore under UMS where it is done in the correct sequence. Reported-by: Arkadiusz Miskiewicz Signed-off-by: Chris Wilson commit d1d788302e8c76e5138dfa61f4a5eee4f72a748f Author: Chris Wilson Date: Sun Nov 21 09:23:48 2010 +0000 drm/i915: Prevent integer overflow when validating the execbuffer Commit 2549d6c2 removed the vmalloc used for temporary storage of the relocation lists used during execbuffer. However, our use of vmalloc was being protected by an integer overflow check which we do want to preserve! Reported-by: Dan Carpenter Signed-off-by: Chris Wilson commit 39de52104dd92bc0548a20201350111dc9317df9 Author: Jesper Juhl Date: Sat Nov 20 13:36:49 2010 -0800 Input: serio HIL MLC - don't deref null, don't leak and return proper error While reviewing various users of kernel memory allocation functions I came across drivers/input/serio/hil_mlc.c::hil_mlc_register() and noticed that: - it calls kzalloc() but fails to check for a NULL return before use. - it makes several allocations and if one fails it doesn't free the previous ones. - It doesn't return -ENOMEM in the failed memory allocation case (it just crashes). This patch corrects all of the above and also reworks the only caller of this function that I could find (drivers/input/serio/hp_sdc_mlc.c::hp_sdc_mlc_out()) so that it now checks the return value of hil_mlc_register() and properly propagates it on failure and I also restructured the code to remove some labels and goto's to make it, IMHO nicer to read. Signed-off-by: Jesper Juhl Tested-by: Helge Deller Acked-by: Helge Deller Signed-off-by: Dmitry Torokhov commit d9cf837ef9629ab34167bd6fc0141383ddb8813a Author: Corey Ashford Date: Fri Nov 19 17:37:24 2010 -0800 perf stat: Change and clean up sys_perf_event_open error handling This patch makes several changes to "perf stat": - "perf stat" will no longer go ahead and run the application when one or more of the specified events could not be opened. - Use error() and die() instead of pr_err() so that the output is more consistent with "perf top" and "perf record". - Handle permission errors in a more robust way, and in a similar way to "perf record" and "perf top". In addition, the sys_perf_event_open() error handling of "perf top" and "perf record" is made more consistent and adds the following phrase when an event doesn't open (with something ther than an access or permission error): "/bin/dmesg may provide additional information." This is added because kernel code doesn't have a good way of expressing detailed errors to user space, so its only avenue is to use printk's. However, many users may not think of looking at dmesg to find out why an event is being rejected. Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Ian Munsie Cc: Michael Ellerman LKML-Reference: <1290217044-26293-1-git-send-email-cjashfor@linux.vnet.ibm.com> Signed-off-by: Corey Ashford Signed-off-by: Arnaldo Carvalho de Melo commit 9cdca869724e766eb48c061967cb777ddb436c76 Author: Thomas Gleixner Date: Sat Nov 20 10:37:05 2010 +0100 x86: platform: Move iris to x86/platform where it belongs Signed-off-by: Thomas Gleixner commit b21bded7c006a29ccda0b8515c4ae3b49e3b599b Author: Vinod Koul Date: Fri Nov 19 15:10:39 2010 +0000 sst: log error returned by scu ipc read/write scu ipc driver fails sometimes to read/write. This add logs with register addr and ret code when these errors occur. Signed-off-by: Vinod Koul Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 90abe60b32a4762fff9bef33295e08bc9bb355af Author: Vinod Koul Date: Fri Nov 19 15:09:50 2010 +0000 sst: Firmware error codes force number values To avoid mismatch in driver and firmware error codes assign specfic values to each enum. Signed-off-by: Vinod Koul Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 6f6ffec188b5416642b20ef14034d40cfeb3256e Author: Vinod Koul Date: Fri Nov 19 15:06:31 2010 +0000 sst: Change the SST driver PCM interface The PCM interface in SST driver is cmds only, this patch changes the interface to open, close and cmd interface. This allows SST driver to keep easy track of handles open Signed-off-by: Vinod Koul Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 4856ab33eb5c33bdf17a5a1bd8d720bffe5f6110 Author: Mark Allyn Date: Wed Nov 17 15:45:36 2010 -0800 Staging: sep: Introduce sep driver This driver is for the Security Processor, a dedicated encryption and decryption driver that is used on the Intel mobile platform. This has been checked with checkpatch and there are four warnings for lines over 80 charactors. There is one compile warning. This is for a function that is only used if the rar register driver is needed. There is an ifdef in a header file that stubs out the rar register driver if the rar register is not configured. This driver does add a configuration, which is CONFIG_DX_SEP. Signed-off-by: Mark Allyn Signed-off-by: Greg Kroah-Hartman commit d948d5f96a4b5923599a7a657dbbd8660b0f9fa5 Author: Randy Dunlap Date: Wed Nov 17 15:38:46 2010 -0800 staging: clearpad_tm1217 depends on INPUT clearpad_tm1217 driver uses many input_() interfaces, so it should depend on INPUT. clearpad_tm1217.c:(.text+0xf19ac): undefined reference to `input_unregister_device' clearpad_tm1217.c:(.text+0xf1b19): undefined reference to `input_event' clearpad_tm1217.c:(.text+0xf1b31): undefined reference to `input_event' clearpad_tm1217.c:(.text+0xf1bb4): undefined reference to `input_event' clearpad_tm1217.c:(.text+0xf1bf2): undefined reference to `input_event' drivers/built-in.o:clearpad_tm1217.c:(.text+0xf1c08): more undefined references to `input_event' follow clearpad_tm1217.c:(.text+0xf1df3): undefined reference to `input_allocate_device' clearpad_tm1217.c:(.text+0xf1eac): undefined reference to `input_set_abs_params' clearpad_tm1217.c:(.text+0xf1ed1): undefined reference to `input_set_abs_params' clearpad_tm1217.c:(.text+0xf1ed8): undefined reference to `input_register_device' clearpad_tm1217.c:(.text+0xf2040): undefined reference to `input_unregister_device' clearpad_tm1217.c:(.text+0xf204b): undefined reference to `input_free_device' Signed-off-by: Randy Dunlap Cc: Ramesh Agarwal Signed-off-by: Greg Kroah-Hartman commit 7716090be5603f1ad4df1379652b8d107c207f5c Author: Marek Belisko Date: Thu Nov 18 09:49:09 2010 +0100 staging: ft1000: Fix compilation warning. This patch fix following warning: drivers/staging/ft1000/ft1000-usb/ft1000_usb.c:67:22: warning: ‘pft1000info’ may be used uninitialized in this function Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 24d6050b352aa76364bd344c41b3e3e0f51466cc Author: Michael Hennerich Date: Fri Nov 19 15:16:46 2010 +0100 staging: iio: dac: Cleanup style - no functional changes Stick to the 80 character line limit at least for code Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit ece30c15921f94c1d58c494507f528c9482db409 Author: Michael Hennerich Date: Fri Nov 19 15:16:45 2010 +0100 staging: iio: dac: Use spi_device_id Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit df9cd1052079e5d0f88ed230276a17a49cc41045 Author: Michael Hennerich Date: Fri Nov 19 15:16:44 2010 +0100 staging: iio: dac: Use spi_write() and handle return value Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit 51f8ad36022e880019e79a9dea2351cc47c739d7 Author: Michael Hennerich Date: Fri Nov 19 15:16:43 2010 +0100 staging: iio: dac: Update drivers to use new attribute naming Remove depreciated macro from header Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit 5a7f4fddae8a50d076b5714f47936ea78e0c0858 Author: Michael Hennerich Date: Fri Nov 19 13:32:38 2010 +0100 staging: iio: dac: more consistent DAC sysfs attributes naming Align DAC sysfs attributes naming with the convention used by ADC Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman commit 861f67031899b8ab909d672eaea85070317855c9 Author: Brett Rudley Date: Fri Nov 19 14:30:58 2010 -0800 staging: brcm80211: stragglers not handled by unifdef Part of BMAC removal. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit f9ec972793fb61f6ec612ecee5b1cc6efeacfbd6 Author: Brett Rudley Date: Fri Nov 19 14:30:57 2010 -0800 staging: brcm80211: unifdef -UBCMSDIO Part of BMAC removal. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit c73b9d6759993f521e3b0cb24abf74c4527469e3 Author: Brett Rudley Date: Fri Nov 19 14:30:56 2010 -0800 staging: brcm80211: remove bmac-only header files Part of BMAC removal. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit f3ce1ef2f80627c2b6339bfc96ee5c1b189cac06 Author: Brett Rudley Date: Fri Nov 19 14:30:55 2010 -0800 staging: brcm80211: unifdef -UWLC_SPLIT Part of BMAC removal. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 501c09346ce74ec688113d5c6b8a321514935228 Author: Brett Rudley Date: Fri Nov 19 14:30:54 2010 -0800 staging: brcm80211: unifdef -DWLC_LOW Part of BMAC removal. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 02db6b4769e2465b872a6cd87465a3e20d4573ce Author: Brett Rudley Date: Fri Nov 19 14:30:53 2010 -0800 staging: brcm80211: unifdef -UWLC_LOW_ONLY Part of BMAC removal. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 29efb1a9f450450e764d9901b434557349c3af53 Author: Brett Rudley Date: Fri Nov 19 14:30:52 2010 -0800 staging: brcm80211: unifdef -UWLC_HIGH_ONLY Part of BMAC removal. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 2cb8ada64f209c5c033f1821bbbc0e8d388cbf7f Author: Arend van Spriel Date: Thu Nov 18 20:46:44 2010 +0100 staging: brcm80211: replaced PKTSETLEN macro by native __skb_trim call - removed PKTSETLEN macro and used __skb_trim call instead. - removed unused macros PKTSETPOOL and PKTPOOL Reviewed-by: Henry Ptasinski Reviewed-by: Brett Rudley Signed-off-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit c303ecbda8b7c86975c4ba23f56b8cbe297cd060 Author: Arend van Spriel Date: Thu Nov 18 20:46:43 2010 +0100 staging: brcm80211: replace PKTPUSH and PKTPULL macros with native skbuff calls Replacing PKTPUSH by skb_push() call and PKTPULL by skb_pull() call to make it obvious what the operation is doing with the packet. Reviewed-by: Henry Ptasinski Reviewed-by: Brett Rudley Signed-off-by: Arend van Spriel Signed-off-by: Greg Kroah-Hartman commit 26361116d7c94984a5fbdc1b6a11555a9dc33cf0 Author: Mike Rapoport Date: Wed Nov 17 10:00:00 2010 +0200 staging: brcm80211: brcmfmac: cleanup bcmsdh_(un)register Signed-off-by: Mike Rapoport Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 5dc177da85a813ff73c35f2d9edfb0bc2fe8271c Author: Mike Rapoport Date: Wed Nov 17 09:58:46 2010 +0200 staging: brcm80211: brcmfmac: remove PCI SDIO controller binding Signed-off-by: Mike Rapoport Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 6dd0a3a7e0793dbeae1b951f091025d8cf896cb4 Author: Sarah Sharp Date: Tue Nov 16 15:58:52 2010 -0800 xhci: Don't let the USB core disable SuperSpeed ports. Disabling SuperSpeed ports is a Very Bad Thing (TM). It disables SuperSpeed terminations, which means that devices will never connect at SuperSpeed on that port. For USB 2.0/1.1 ports, disabling the port meant that the USB core could always get a connect status change later. That's not true with USB 3.0 ports. Do not let the USB core disable SuperSpeed ports. We can't rely on the device speed in the port status registers, since that isn't valid until there's a USB device connected to the port. Instead, we use the port speed array that's created from the Extended Capabilities registers. Signed-off-by: Sarah Sharp Tested-by: Don Zickus Cc: stable@kernel.org commit da6699ce4a889c3795624ccdcfe7181cc89f18e8 Author: Sarah Sharp Date: Tue Oct 26 16:47:13 2010 -0700 xhci: Setup array of USB 2.0 and USB 3.0 ports. An xHCI host controller contains USB 2.0 and USB 3.0 ports, which can occur in any order in the PORTSC registers. We cannot read the port speed bits in the PORTSC registers at init time to determine the port speed, since those bits are only valid when a USB device is plugged into the port. Instead, we read the "Supported Protocol Capability" registers in the xHC Extended Capabilities space. Those describe the protocol, port offset in the PORTSC registers, and port count. We use those registers to create two arrays of pointers to the PORTSC registers, one for USB 3.0 ports, and another for USB 2.0 ports. A third array keeps track of the port protocol major revision, and is indexed with the internal xHCI port number. This commit is a bit big, but it should be queued for stable because the "Don't let the USB core disable SuperSpeed ports" patch depends on it. There is no other way to determine which ports are SuperSpeed ports without this patch. Signed-off-by: Sarah Sharp Tested-by: Don Zickus Cc: stable@kernel.org commit 7a3783efffc7bc2e702d774e47fad5b8e37e9ad1 Author: Paul Zimmerman Date: Wed Nov 17 16:26:50 2010 -0800 xhci: Fix reset-device and configure-endpoint commands We have been having problems with the USB-IF Gold Tree tests when plugging and unplugging devices from the tree. I have seen that the reset-device and configure-endpoint commands, which are invoked from xhci_discover_or_reset_device() and xhci_configure_endpoint(), will sometimes time out. After much debugging, I determined that the commands themselves do not actually time out, but rather their completion events do not get delivered to the right place. This happens when the command ring has just wrapped around, and it's enqueue pointer is left pointing to the link TRB. xhci_discover_or_reset_device() and xhci_configure_endpoint() use the enqueue pointer directly as their command TRB pointer, without checking whether it's pointing to the link TRB. When the completion event arrives, if the command TRB is pointing to the link TRB, the check against the command ring dequeue pointer in handle_cmd_in_cmd_wait_list() fails, so the completion inside the command does not get signaled. The patch below fixes the timeout problem for me. This should be queued for the 2.6.35 and 2.6.36 stable trees. Signed-off-by: Paul Zimmerman Signed-off-by: Sarah Sharp Cc: stable@kernel.org commit 09c5088e5c5993be217a2c85dca088147ffc9b72 Author: Shreyas Bhatewara Date: Fri Nov 19 10:55:24 2010 +0000 net-next: Add multiqueue support to vmxnet3 driver Add multiqueue support to vmxnet3 driver This change adds multiqueue and thus receive side scaling support to vmxnet3 device driver. Number of rx queues is limited to 1 in cases where MSI is not configured or one MSIx vector is not available per rx queue Signed-off-by: Shreyas Bhatewara Reviewed-by: Bhavesh Davda Signed-off-by: David S. Miller commit 24912420e923d56461b400d83f250a31bed8a964 Merge: 0670b8ae66daf1d326c7bd10e73daff5f18fcf92 0302b8622ce696af1cda22fcf207d3793350e896 Author: David S. Miller Date: Fri Nov 19 13:13:47 2010 -0800 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 Conflicts: drivers/net/bonding/bond_main.c net/core/net-sysfs.c net/ipv6/addrconf.c commit 124bf94a9f9b52341562628cd56b252e7d820ee8 Author: Uwe Kleine-König Date: Fri Nov 19 21:03:33 2010 +0100 ARM: imx: fix name for functions adding sdhci-esdhc-imx devices and restore alphabetic ordering. Signed-off-by: Uwe Kleine-König commit c496fa6bd5324ddce11e5e42670618ffb4d8f58d Author: Uwe Kleine-König Date: Tue Nov 16 23:24:21 2010 +0100 ARM: mx3/mx35_3ds: Add watchdog support This bases on a patch by Fabio Estevam who added the device before it was allocated dynamically. Cc: Fabio Estevam Signed-off-by: Uwe Kleine-König commit d690b4c4778096cde018709efd005dfef9714297 Author: Uwe Kleine-König Date: Tue Nov 16 21:27:33 2010 +0100 ARM: mx3: dynamically allocate imx-keypad devices Signed-off-by: Uwe Kleine-König commit 742269e2d971957c84f364c4e9f5c6439964ef01 Author: Uwe Kleine-König Date: Mon Nov 15 15:28:45 2010 +0100 ARM: mx3: dynamically allocate imx2-wdt devices Signed-off-by: Uwe Kleine-König commit 2d58de2805f93bdb8fa0608d98e1871bb28ec091 Author: Uwe Kleine-König Date: Mon Nov 15 11:57:49 2010 +0100 ARM: mx3: dynamically allocate mxc-ehci devices Signed-off-by: Uwe Kleine-König commit 9e1dde33876ba83ad586c336647fff133d0f5472 Author: Uwe Kleine-König Date: Fri Nov 12 16:40:06 2010 +0100 ARM: mx3: dynamically allocate fsl-usb2-udc devices While adapting the #defines for this I noticed that the offset used for USB HS on i.MX35 differs from the documented offset. I kept the working offset and commented that the documentation differs. Signed-off-by: Uwe Kleine-König commit fed3d35b06bf3f6a3383c2637d054823c563200b Author: Uwe Kleine-König Date: Fri Nov 12 11:49:34 2010 +0100 ARM: mx3: dynamically allocate mxc_rnga devices Signed-off-by: Uwe Kleine-König commit 6a697e3d310d79ea0e385975c57084ce22b04b36 Author: Uwe Kleine-König Date: Fri Nov 12 11:10:55 2010 +0100 ARM: mx3: dynamically register mxc-mmc devices Compared to the static devices the dynamic have a DMA resource. This should be save as it seems unused in the driver. Signed-off-by: Uwe Kleine-König commit a528bc87841d958bbd394abc9266aee9cdf45cb8 Author: Uwe Kleine-König Date: Fri Nov 12 10:11:42 2010 +0100 ARM: mx3: introduce SOC_IMX31 and SOC_IMX35 Additionally convert some known to be good usages to the new names. Signed-off-by: Uwe Kleine-König commit 86f8efdaab49f5710f0aa3a3c1d76edc1d3d0df9 Author: Uwe Kleine-König Date: Fri Nov 12 08:27:14 2010 +0100 ARM: mx3: use an MX35 constant in imx35 only code ... instead of MX3x Signed-off-by: Uwe Kleine-König commit d7e0951f929513ced7c57882d2f95d49a546e002 Author: Uwe Kleine-König Date: Thu Nov 11 18:50:50 2010 +0100 ARM: mx3: move registration of gpios to plat-mxc/gpio.c Signed-off-by: Uwe Kleine-König commit 972cc48207450ce6aeed416ac176fe4d0482a4a3 Author: Uwe Kleine-König Date: Thu Nov 11 18:35:01 2010 +0100 ARM: imx: use SOC_IMX25 instead of ARCH_MX25 for multi-SoC Some usages of ARCH_MX25 are assuming that if it is defined the other SoCs are undefined. Use SOC_IMX25 for the save places. Signed-off-by: Uwe Kleine-König commit 36a8cac9524bc67df2911cb3fbc349f87bcad37d Author: Uwe Kleine-König Date: Thu Nov 11 18:17:15 2010 +0100 ARM: imx: let the machines select SOC_IMX{21,27} This prepares multi-SoC kernel support. Signed-off-by: Uwe Kleine-König commit fd2fa2e3238197ef10101277dff67da10e68a61b Author: Uwe Kleine-König Date: Thu Nov 11 18:11:29 2010 +0100 ARM: imx: let IMX_HAVE_PLATFORM_IMX_FB select HAVE_FB_IMX This way FB_IMX can just depend on HAVE_FB_IMX and machines just need to select IMX_HAVE_PLATFORM_IMX_FB without bothering about HAVE_FB_IMX. Signed-off-by: Uwe Kleine-König commit e48ab1c16ff2af83e6a2a1228504710a5d339d08 Author: Uwe Kleine-König Date: Thu Nov 11 18:06:17 2010 +0100 ARM: imx: move mx25 support to mach-imx Signed-off-by: Uwe Kleine-König commit 2a8bd56a382ec0e24249b1adaca4f38bd529e825 Author: Uwe Kleine-König Date: Thu Nov 11 17:30:25 2010 +0100 ARM: mx25: remove now empty devices.h Signed-off-by: Uwe Kleine-König commit bb4c853ff18fe3b0e2aec45053c318479e0c55e3 Author: Uwe Kleine-König Date: Thu Nov 11 17:11:34 2010 +0100 ARM: mx25: dynamically allocate mx2-camera devices Signed-off-by: Uwe Kleine-König commit 00871505dcf15418aebc402db9f124dd2738fa2d Author: Uwe Kleine-König Date: Thu Nov 11 16:58:50 2010 +0100 ARM: mx25: dynamically allocate imx2-wdt devices Signed-off-by: Uwe Kleine-König commit bc95df78c4566327086d44f1bfab984a70dc4d6b Author: Rajeev Kumar Date: Fri Nov 19 12:41:19 2010 -0800 Input: add support for keyboards on ST SPEAr platform Signed-off-by: Rajeev Kumar Signed-off-by: Dmitry Torokhov commit 0670b8ae66daf1d326c7bd10e73daff5f18fcf92 Author: andrew hendry Date: Thu Nov 18 13:21:35 2010 +0000 X25: remove bkl in routing ioctls Routing doesn't use the socket data and is protected by x25_route_list_lock Signed-off-by: Andrew Hendry Signed-off-by: David S. Miller commit 54aafbd4989a684ca876e49bf3e6eb931654dc02 Author: andrew hendry Date: Thu Nov 18 13:21:28 2010 +0000 X25: remove bkl in inq and outq ioctls Signed-off-by: Andrew Hendry Signed-off-by: David S. Miller commit 1ecd66bf2ce5e0f2bc72ffdeed814bb0e55a60dc Author: andrew hendry Date: Thu Nov 18 13:21:20 2010 +0000 X25: remove bkl in timestamp ioctls Signed-off-by: Andrew Hendry Signed-off-by: David S. Miller commit 70be998c2b44f942f11383496622500136816acb Author: andrew hendry Date: Thu Nov 18 13:20:57 2010 +0000 X25: pushdown bkl in ioctls Push down the bkl in the ioctls so they can be removed one at a time. Signed-off-by: Andrew Hendry Signed-off-by: David S. Miller commit 4aafd3f71a257a3522932944b5204262dfdff147 Author: Arnaldo Carvalho de Melo Date: Fri Nov 19 16:46:26 2010 -0200 perf tools: Change my maintainer address Also remove old snail mail address from CREDITS, moved years ago. LKML-Reference: Signed-off-by: Arnaldo Carvalho de Melo commit a71123977eb3c72dd5a8bac723b13faf9cdd2828 Author: Robert Morell Date: Tue Nov 16 14:16:33 2010 -0800 perf tools: Remove hardcoded include paths for elfutils This change removes the use of hardcoded absolute "/usr/include/elfutils" paths from the perf build. The problem with hardcoded paths is that it prevents them from being overridden by $prefix or by -I in CFLAGS (e.g., for cross-compiling purposes). Instead, just include the "elfutils/" subdirectory as a relative path when files are needed from that directory. Tested by building perf: - Cross-compiled for ARM on x86_64 - Built natively on x86_64 - Built on x86_64 with /usr/include/elfutils moved to another location and manually included in CFLAGS Acked-by: Masami Hiramatsu Cc: Peter Zijlstra Cc: Paul Mackerras Cc: Ingo Molnar Cc: Masami Hiramatsu LKML-Reference: <1289945793-31441-1-git-send-email-rmorell@nvidia.com> Signed-off-by: Robert Morell Signed-off-by: Arnaldo Carvalho de Melo commit f5b4a9c3ab53d544a540a6f3a5d17184e374d91a Author: Stephane Eranian Date: Tue Nov 16 11:05:01 2010 +0200 perf stat: Add no-aggregation mode to -a This patch adds a new -A option to perf stat. If specified then perf stat does not aggregate counts across all monitored CPUs in system-wide mode, i.e., when using -a. This option is not supported in per-thread mode. Being able to get a per-cpu breakdown is useful to detect imbalances between CPUs when running a uniform workload than spans all monitored CPUs. The second version corrects the missing cpumap[] support, so that it works when the -C option is used. The third version fixes a missing cpumap[] in print_counter() and removes a stray patch in builtin-trace.c. Examples on a 4-way system: # perf stat -a -e cycles,instructions -- sleep 1 Performance counter stats for 'sleep 1': 9592808135 cycles 3490380006 instructions # 0.364 IPC 1.001584632 seconds time elapsed # perf stat -a -A -e cycles,instructions -- sleep 1 Performance counter stats for 'sleep 1': CPU0 2398163767 cycles CPU1 2398180817 cycles CPU2 2398217115 cycles CPU3 2398247483 cycles CPU0 872282046 instructions # 0.364 IPC CPU1 873481776 instructions # 0.364 IPC CPU2 872638127 instructions # 0.364 IPC CPU3 872437789 instructions # 0.364 IPC 1.001556052 seconds time elapsed Cc: David S. Miller Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Robert Richter LKML-Reference: <4ce257b5.1e07e30a.7b6b.3aa9@mx.google.com> Signed-off-by: Stephane Eranian Signed-off-by: Arnaldo Carvalho de Melo commit 412dc7f368bf10a8049a8a4c41abbfd0108742e7 Author: Randy Dunlap Date: Fri Nov 19 09:30:18 2010 -0800 staging: fix winbond build, needs delay.h winbond drivers use msleep() and delay(), so include linux/delay.h in a common header file to prevent build errors. drivers/staging/winbond/phy_calibration.c:987: error: implicit declaration of function 'msleep' drivers/staging/winbond/phy_calibration.c:1556: error: implicit declaration of function 'udelay' drivers/staging/winbond/reg.c:894: error: implicit declaration of function 'msleep' drivers/staging/winbond/reg.c:1178: error: implicit declaration of function 'udelay' Signed-off-by: Randy Dunlap Signed-off-by: Greg Kroah-Hartman commit c26aed40f4fd18f86bcc6aba557cab700b129b73 Author: Eric Dumazet Date: Thu Nov 18 22:04:46 2010 +0000 filter: use reciprocal divide At compile time, we can replace the DIV_K instruction (divide by a constant value) by a reciprocal divide. At exec time, the expensive divide is replaced by a multiply, a less expensive operation on most processors. Signed-off-by: Eric Dumazet Acked-by: Changli Gao Signed-off-by: David S. Miller commit 8c1592d68bc89248bfd0ee287648f41c1370d826 Author: Eric Dumazet Date: Thu Nov 18 21:56:38 2010 +0000 filter: cleanup codes[] init Starting the translated instruction to 1 instead of 0 allows us to remove one descrement at check time and makes codes[] array init cleaner. Signed-off-by: Eric Dumazet Acked-by: Changli Gao Signed-off-by: David S. Miller commit 4916a1083290edfb6cc53aa134f00597447de1ce Author: Pavankumar Kondeti Date: Tue Nov 9 15:41:29 2010 +0530 msm: io: Export __msm_ioremap This is required for modules to use ioremap() Signed-off-by: Pavankumar Kondeti Signed-off-by: Daniel Walker commit 93aaae2e01e57483256b7da05c9a7ebd65ad4686 Author: Eric Dumazet Date: Fri Nov 19 09:49:59 2010 -0800 filter: optimize sk_run_filter Remove pc variable to avoid arithmetic to compute fentry at each filter instruction. Jumps directly manipulate fentry pointer. As the last instruction of filter[] is guaranteed to be a RETURN, and all jumps are before the last instruction, we dont need to check filter bounds (number of instructions in filter array) at each iteration, so we remove it from sk_run_filter() params. On x86_32 remove f_k var introduced in commit 57fe93b374a6b871 (filter: make sure filters dont read uninitialized memory) Note : We could use a CONFIG_ARCH_HAS_{FEW|MANY}_REGISTERS in order to avoid too many ifdefs in this code. This helps compiler to use cpu registers to hold fentry and A accumulator. On x86_32, this saves 401 bytes, and more important, sk_run_filter() runs much faster because less register pressure (One less conditional branch per BPF instruction) # size net/core/filter.o net/core/filter_pre.o text data bss dec hex filename 2948 0 0 2948 b84 net/core/filter.o 3349 0 0 3349 d15 net/core/filter_pre.o on x86_64 : # size net/core/filter.o net/core/filter_pre.o text data bss dec hex filename 5173 0 0 5173 1435 net/core/filter.o 5224 0 0 5224 1468 net/core/filter_pre.o Signed-off-by: Eric Dumazet Acked-by: Changli Gao Signed-off-by: David S. Miller commit 0e341af835fdf553820a1fa98341b93ab32ce466 Author: Rabin Vincent Date: Sat Nov 6 23:03:53 2010 +0530 ARM: ftrace: enable function graph tracer Add the options to enable the function graph tracer on ARM. Function graph tracer support requires frame pointers, so exclude Thumb-2 and also make sure FRAME_POINTER gets enabled when FUNCTION_GRAPH_TRACER is used, since FUNCTION_TRACER doesn't "select FRAME_POINTER" when ARM_UNWIND is used. Therefore, with GCC 4.4.0+, you get plain function tracing without frame pointers, but you'll need them if you want function graph tracing. Acked-by: Catalin Marinas Signed-off-by: Rabin Vincent commit dd686eb13959e49a1112fd608c124ab711050582 Author: Rabin Vincent Date: Sat Nov 6 23:03:21 2010 +0530 ARM: ftrace: graph tracer + dynamic ftrace Support the graph tracer + dynamic ftrace combination on ARM. Signed-off-by: Rabin Vincent commit 376cfa8730c08c0394d0aa1d4a80fd8c9971f323 Author: Tim Bird Date: Sat Oct 9 22:24:38 2010 +0530 ARM: ftrace: function graph tracer support Cc: Tim Bird [rabin@rab.in: rebase on top of latest code, keep code in ftrace.c instead of separate file, check for ftrace_graph_entry also] Signed-off-by: Rabin Vincent commit d3b9dc9dd2b994f396741f7086ffe7a48bacb165 Author: Rabin Vincent Date: Thu Oct 7 17:39:47 2010 +0530 ARM: ftrace: use gas macros to avoid code duplication Use assembler macros to avoid copy/pasting code between the implementations of the two variants of the mcount call. Signed-off-by: Rabin Vincent commit 61b5cb1c3bff8875d2fd289c7b6ac344f95261fa Author: Rabin Vincent Date: Thu Oct 7 20:51:58 2010 +0530 ARM: place C irq handlers in IRQ_ENTRY for ftrace When FUNCTION_GRAPH_TRACER is enabled, place do_IRQ() and friends in the IRQ_ENTRY section so that the irq-related features of the function graph tracer work. Signed-off-by: Rabin Vincent commit ec763f0de879fa1a64b7641098271107f5e32c67 Author: Rabin Vincent Date: Fri Nov 19 21:11:02 2010 +0530 ARM: versatile: ensure sched_clock() is notrace Include sched.h to ensure sched_clock() has the notrace annotation. Signed-off-by: Rabin Vincent commit 042957801626465492b9428860de39a3cb2a8219 Author: Steven Rostedt Date: Fri Nov 12 22:32:11 2010 -0500 tracing/events: Show real number in array fields Currently we have in something like the sched_switch event: field:char prev_comm[TASK_COMM_LEN]; offset:12; size:16; signed:1; When a userspace tool such as perf tries to parse this, the TASK_COMM_LEN is meaningless. This is done because the TRACE_EVENT() macro simply uses a #len to show the string of the length. When the length is an enum, we get a string that means nothing for tools. By adding a static buffer and a mutex to protect it, we can store the string into that buffer with snprintf and show the actual number. Now we get: field:char prev_comm[16]; offset:12; size:16; signed:1; Something much more useful. Signed-off-by: Steven Rostedt commit fe040be2fdc49a4132c5f64359c629aeeb8e4947 Merge: 2006920a18cc9f499e5cccf9e6f1aa9f6120705e 6722a4016d7f5f107a82ad71a3ee1ccec105532f Author: Paul Mundt Date: Fri Nov 19 17:04:25 2010 +0900 Merge branch 'common/fbdev-mipi' of master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6 commit 6722a4016d7f5f107a82ad71a3ee1ccec105532f Author: Magnus Damm Date: Wed Nov 17 06:44:54 2010 +0000 fbdev: sh_mipi_dsi: Allow LCDC board callbacks Update the MIPI-DSI driver to make use of the LCD panel callbacks in the LCDC platform data. Without this patch MIPI panels cannot use board specific LCDC callbacks to control power and/or back light. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit deaba190188f1caa2317de4df6c9aaba501f9809 Author: Magnus Damm Date: Wed Nov 17 09:53:25 2010 +0000 fbdev: sh_mipi_dsi: Require two I/O resources V2 This is V2 of the MIPI-DSI two resources patch. The second I/O resource specifies the base address for the link hardware block. The base address for the link hardware block seems to vary with SoC type. Using two I/O resources to describe the MIPI-DSI hardware allows us to support both newer and older SoCs. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 5958d58a0e7699c791b9f4c99d76559a14770138 Author: Magnus Damm Date: Wed Nov 17 06:44:35 2010 +0000 ARM: mach-shmobile: Extend AP4EVB MIPI-DSI resources Update the AP4EVB board code to go from a single I/O resource to two I/O resources for the MIPI-DSI driver. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 71b146c815ed6034bc20a0ec265445bdf4bad78c Author: Magnus Damm Date: Wed Nov 17 06:44:25 2010 +0000 fbdev: sh_mipi_dsi: Make use of register names Keep MIPI-DSI registers in one place instead of using magic values together with comments. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit 2006920a18cc9f499e5cccf9e6f1aa9f6120705e Author: Arnd Hannemann Date: Thu Nov 18 09:45:42 2010 +0000 fbdev: modedb: fix CEA modes Some of the modes were missing the correct sync polarities. This was causing a corrupt or left shifted picture on my TV. Additionally format #35 had a wrong refresh rate and pixel clock. This patch fixes those issues. Signed-off-by: Arnd Hannemann Acked-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit 3256c789882281b2eac5978c7d38f6f0bbd16ed6 Author: Takashi YOSHII Date: Fri Nov 19 16:49:38 2010 +0900 ARM: mach-shmobile: ag5evm: use gpio. Ag5evm board now uses gpio api to initialize pins and peripherals. Signed-off-by: Takashi YOSHII Signed-off-by: Paul Mundt commit 1cdf370244d5f0a4cf5ed672967cc2e16235908d Author: Takashi YOSHII Date: Fri Nov 19 16:47:16 2010 +0900 ARM: mach-shmobile: Add sh73a0 pinmux support PFC definitions for sh73a0 to support GPIO and pinmux handling. Signed-off-by: Takashi YOSHII Signed-off-by: Paul Mundt commit 226291aa4641fa13cb5dec3bcb3379faa83009e2 Author: dann frazier Date: Thu Nov 18 15:03:09 2010 -0700 ocfs2_connection_find() returns pointer to bad structure If ocfs2_live_connection_list is empty, ocfs2_connection_find() will return a pointer to the LIST_HEAD, cast as a ocfs2_live_connection. This can cause an oops when ocfs2_control_send_down() dereferences c->oc_conn: Call Trace: [] ocfs2_control_message+0x28c/0x2b0 [ocfs2_stack_user] [] ocfs2_control_write+0x35/0xb0 [ocfs2_stack_user] [] vfs_write+0xb8/0x1a0 [] ? do_page_fault+0x153/0x3b0 [] sys_write+0x51/0x80 [] system_call_fastpath+0x16/0x1b Fix by explicitly returning NULL if no match is found. Signed-off-by: dann frazier Signed-off-by: Joel Becker commit 45677454dd6d128608117abe7dcd2bdfdd7cdf72 Author: Wu Zhangjin Date: Thu Oct 28 00:24:34 2010 +0800 ftrace: Speed up recordmcount cmd_record_mcount is used to locate the _mcount symbols in the object files, only the files compiled with -pg has the _mcount symbol, so, it is only needed for such files, but the current cmd_record_mcount is used for all of the object files, so, we need to fix it and speed it up. Since -pg may be removed by the method used in kernel/trace/Makefile: ORIG_CFLAGS := $(KBUILD_CFLAGS) KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS)) Or may be removed by the method used in arch/x86/kernel/Makefile: CFLAGS_REMOVE_file.o = -pg So, we must check the last variable stores the compiling flags, that is c_flags(Please refer to cmd_cc_o_c and rule_cc_o_c defined in scripts/Makefile.build) and since the CFLAGS_REMOVE_file.o is already filtered in _c_flags(Please refer to scripts/Makefile.lib) and _c_flags has less symbols, therefore, we only need to check _c_flags. --------------- Changes from v1: o Don't touch Makefile for CONFIG_FTRACE_MCOUNT_RECORD is enough o Use _c_flags intead of KBUILD_CFLAGS to cover CONFIG_REMOVE_file.o = -pg (feedback from Steven Rostedt ) Acked-by: Michal Marek Signed-off-by: Wu Zhangjin LKML-Reference: <3dc8cddf022eb7024f9f2cf857529a15bee8999a.1288196498.git.wuzhangjin@gmail.com> [ changed if [ .. == .. ] to if [ .. = .. ] to handle dash environments ] Signed-off-by: Steven Rostedt commit a2a2f55291918f6cf9287d7beaecc7bc007a9f1c Author: Milton Miller Date: Wed Nov 17 22:20:11 2010 -0600 ocfs2: char is not always signed Commit 1c66b360fe262 (Change some lock status member in ocfs2_lock_res to char.) states that these fields need to be signed due to comparision to -1, but only changed the type from unsigned char to char. However, it is a compiler option if char is a signed or unsigned type. Change these fields to signed char so the code will work with all compilers. Signed-off-by: Milton Miller Signed-off-by: Joel Becker commit 1989a80a60d2f620bad99196d6c1801c2afd7c71 Author: Tristan Ye Date: Mon Nov 15 21:39:09 2010 +0800 Ocfs2: Stop tracking a negative dentry after dentry_iput(). I suddenly hit the problem during 2.6.37-rc1 regression test, which was introduced by commit '5e98d492406818e6a94c0ba54c61f59d40cefa4a'(Track negative entries v3), following scenario reproduces the issue easily: Node A Node B ================ ============ $touch testfile $ls testfile $rm -rf testfile $touch testfile $ls testfile ls: cannot access testfile: No such file or directory This patch stops tracking the dentry which was negativated by a inode deletion, so as to force the revaliation in next lookup, in case we'll touch the inode again in the same node. It didn't hurt the performance of multiple lookup for none-existed files anyway, while regresses a bit in the first try after a file deletion. Signed-off-by: Tristan Ye Signed-off-by: Joel Becker commit 1cf257f511918ba5b2eabd64d9acd40f1d7866ef Author: Jiri Slaby Date: Sat Nov 6 10:06:52 2010 +0100 ocfs2: fix memory leak Stanse found that o2hb_heartbeat_group_make_item leaks some memory on fail paths. Fix the paths by adding a new label and jump there. Signed-off-by: Jiri Slaby Cc: Mark Fasheh Cc: Joel Becker Cc: ocfs2-devel@oss.oracle.com Cc: Alexander Viro Cc: linux-fsdevel@vger.kernel.org Signed-off-by: Joel Becker commit a48a982a6bd3896274dd643397c72da9258411e2 Author: David Sterba Date: Tue Nov 2 23:36:02 2010 +0100 fs/ocfs2/dlm: Use GFP_ATOMIC under spin_lock coccinelle check scripts/coccinelle/locks/call_kern.cocci found that in fs/ocfs2/dlm/dlmdomain.c an allocation with GFP_KERNEL is done with locks held: dlm_query_region_handler spin_lock(dlm_domain_lock) dlm_match_regions kmalloc(GFP_KERNEL) Change it to GFP_ATOMIC. Signed-off-by: David Sterba CC: Joel Becker CC: Mark Fasheh CC: ocfs2-devel@oss.oracle.com -- Exists in v2.6.37-rc1 and current linux-next. Signed-off-by: Joel Becker commit 5ca9afdb9f6a5267927b54de3f42c756e8af7fcd Author: Vasiliy Kulikov Date: Thu Nov 18 21:16:45 2010 +0300 x86, mrst: Check platform_device_register() return code platform_device_register() may fail, if so propagate the return code from mrst_device_create(). Signed-off-by: Vasiliy Kulikov LKML-Reference: <1290104207-31279-1-git-send-email-segoon@openwall.com> Acked-by: Alan Cox Signed-off-by: H. Peter Anvin commit 0a80410dc53cf68e56456bef1ca66949b87412f9 Author: Tomoya Date: Wed Nov 17 14:06:25 2010 +0000 can: EG20T PCH: use BIT(X) Replace bit assignment value to BIT(X). For easy to readable/identifiable, replace all bit assigned macros to BIT(X) Signed-off-by: Tomoya MORINAGA Acked-by: Marc Kleine-Budde Signed-off-by: David S. Miller commit 086b5650dcdaae7c4aa60a5d0724f775e733610e Author: Tomoya Date: Wed Nov 17 01:13:16 2010 +0000 can: EG20T PCH: add prefix to macro For easy to readable/identifiable, add prefix "PCH_" to all of #define macros. Signed-off-by: Tomoya MORINAGA Acked-by: Marc Kleine-Budde Signed-off-by: David S. Miller commit 30dfe2c05037fbc021121c037872c09956938c2f Author: David S. Miller Date: Thu Nov 18 11:49:25 2010 -0800 atm: fore200e: Fix build warning. GCC (rightfully) complains that: drivers/atm/fore200e.c:614:5: warning: operation on 'cmdq->head' may be undefined This is due to the FORE200E_NEXT_ENTRY macro, which essentially evaluates to: i = ++i % m Make it what's explicitly intended here which is: i = (i + 1) % m and the warning goes away. Signed-off-by: David S. Miller commit a3a972a053010bfd61c13cfa4ce688d4eebd9a19 Author: Greg Kroah-Hartman Date: Thu Nov 18 11:21:04 2010 -0800 Staging: line6: fix up my fixup for some sysfs attribute permissions They should be writable by root, not readable. Doh, stupid me with the wrong flags. Reported-by: Jonathan Cameron Cc: Markus Grabner Cc: Mariusz Kozlowski Cc: stable Signed-off-by: Greg Kroah-Hartman commit a3d13107012ea614184d3c58bb7b579905d5da11 Author: Greg Kroah-Hartman Date: Thu Nov 18 11:21:04 2010 -0800 Staging: zram: fix up my fixup for some sysfs attribute permissions They should be writable by root, not readable. Doh, stupid me with the wrong flags. Reported-by: Jonathan Cameron Cc: Nitin Gupta Cc: Pekka Enberg Cc: stable Signed-off-by: Greg Kroah-Hartman commit 926c11151e3b82e4facbf2bd2bea15f0ca0ac6f9 Author: Greg Kroah-Hartman Date: Thu Nov 18 11:21:04 2010 -0800 Staging: udlfb: fix up my fixup for some sysfs attribute permissions They should be writable by root, not readable. Doh, stupid me with the wrong flags. Reported-by: Jonathan Cameron Cc: Bernie Thompson Cc: stable Signed-off-by: Greg Kroah-Hartman commit 4d7bc388b44e42a1feafa35e50eef4f24d6ca59d Author: Greg Kroah-Hartman Date: Thu Nov 18 11:21:04 2010 -0800 Staging: samsung-laptop: fix up my fixup for some sysfs attribute permissions They should be writable by root, not readable. Doh, stupid me with the wrong flags. Reported-by: Jonathan Cameron Cc: stable Signed-off-by: Greg Kroah-Hartman commit c9e51d9e4bee3da47623622884f4828e079a0581 Author: Greg Kroah-Hartman Date: Thu Nov 18 11:21:04 2010 -0800 Staging: iio: adis16220: fix up my fixup for some sysfs attribute permissions They should be writable by root, not readable. Doh, stupid me with the wrong flags. Reported-by: Jonathan Cameron Acked-by: Jonathan Cameron Cc: Barry Song Cc: stable Signed-off-by: Greg Kroah-Hartman commit 2a767fda5d0d8dcff465724dfad6ee131489b3f2 Author: Greg Kroah-Hartman Date: Thu Nov 18 11:21:04 2010 -0800 Staging: frontier: fix up my fixup for some sysfs attribute permissions They should be writable by root, not readable. Doh, stupid me with the wrong flags. Reported-by: Jonathan Cameron Cc: David Taht Cc: stable Signed-off-by: Greg Kroah-Hartman commit 515b4987ccd097cdf5416530b05fdf9e01afe95a Author: Greg Kroah-Hartman Date: Thu Nov 18 11:21:04 2010 -0800 Staging: asus_oled: fix up my fixup for some sysfs attribute permissions They should be writable by root, not readable. Doh, stupid me with the wrong flags. Reported-by: Jonathan Cameron Cc: Jakub Schmidtke Cc: stable Signed-off-by: Greg Kroah-Hartman commit a76a574ca9ce7c05791cee42f000f2a42c687837 Author: RafaÅ‚ MiÅ‚ecki Date: Wed Nov 17 19:52:13 2010 +0100 ssb: drop BCM4328 hack for SPROM revision This hacks leads to incorrect SPROM parsing for me and reading for example MAC as: 00:00:00:54:00:00. Michael G. who introduced this confirmed it is not needed anymore. Signed-off-by: RafaÅ‚ MiÅ‚ecki Tested-by: Michael Gerdau Signed-off-by: John W. Linville commit aaa13ca2428789b3c8096b5edc175d4d78b5f504 Author: Felix Fietkau Date: Wed Nov 17 04:19:47 2010 +0100 ath9k_hw: support reading calibration data from flash on AR9003 Embedded boards do not have compressed EEPROM data, they use the struct ar9003_eeprom layout, with little endian fields, so copying the raw data to the eeprom buffer is enough. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit a05b5d45049d60a06a1b12976150572304a51928 Author: Felix Fietkau Date: Wed Nov 17 04:25:33 2010 +0100 ath9k: add support for reading eeprom from platform data on PCI devices Some embedded boards store platform data for connected PCIe AR92xx chips in the system flash instead of a separate EEPROM chip. Signed-off-by: Gabor Juhos Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 458fafdd579dcb58c8288c55c9cd92d6816ba094 Author: John W. Linville Date: Tue Nov 16 16:49:08 2010 -0500 rndis_wlan: avoid uninitialized var warning in rndis_wlan_craft_connected_bss CC [M] drivers/net/wireless/rndis_wlan.o drivers/net/wireless/rndis_wlan.c: In function ‘rndis_wlan_craft_connected_bss’: drivers/net/wireless/rndis_wlan.c:2542:2: warning: ‘ret’ may be used uninitialized in this function Signed-off-by: John W. Linville Acked-by: Jussi Kivilinna commit 8befba6f2262a6e31d6e3bcf7d07ff46da444ec0 Author: John W. Linville Date: Tue Nov 16 16:08:56 2010 -0500 iwmc3200wifi: clarify potentially undefined operation in iwm_scan_ssids CC [M] drivers/net/wireless/iwmc3200wifi/commands.o drivers/net/wireless/iwmc3200wifi/commands.c: In function ‘iwm_scan_ssids’: drivers/net/wireless/iwmc3200wifi/commands.c:911:15: warning: operation on ‘iwm->scan_id’ may be undefined Signed-off-by: John W. Linville commit 86107fd170bc379869250eb7e1bd393a3a70e8ae Author: Bruno Randolf Date: Tue Nov 16 10:58:48 2010 +0900 nl80211/mac80211: Report signal average Extend nl80211 to report an exponential weighted moving average (EWMA) of the signal value. Since the signal value usually fluctuates between different packets, an average can be more useful than the value of the last packet. This uses the recently added generic EWMA library function. Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit eef39befaae2a1559efe197d795c376a317af2af Author: Bruno Randolf Date: Tue Nov 16 10:58:43 2010 +0900 ath5k: Use generic EWMA library Remove ath5k's private moving average implementation in favour of the generic library version. Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit c5485a7e7569ab32eea240c850198519e2a765ef Author: Bruno Randolf Date: Tue Nov 16 10:58:37 2010 +0900 lib: Add generic exponentially weighted moving average (EWMA) function This adds generic functions for calculating Exponentially Weighted Moving Averages (EWMA). This implementation makes use of a structure which keeps the EWMA parameters and a scaled up internal representation to reduce rounding errors. The original idea for this implementation came from the rt2x00 driver (rt2x00link.c). I would like to use it in several places in the mac80211 and ath5k code and I hope it can be useful in many other places in the kernel code. Signed-off-by: Bruno Randolf Reviewed-by: KOSAKI Motohiro Signed-off-by: John W. Linville commit ae51ce9061b1ddc0fde363913c932bee5b9bc5fd Merge: 072b198a4ad48bd722ec6d203d65422a4698eae7 423478cde453eebdfcfebf4b8d378d8f5d49b853 Author: Ingo Molnar Date: Thu Nov 18 20:07:12 2010 +0100 Merge branch 'perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing into perf/core commit 57e1ab6eaddc9f2c358cd4afb497cda6e3c6821a Author: Eric Dumazet Date: Tue Nov 16 20:36:42 2010 +0000 igmp: refine skb allocations IGMP allocates MTU sized skbs. This may fail for large MTU (order-2 allocations), so add a fallback to try lower sizes. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 4c3710afbc333c33100739dec10662b4ee64e219 Author: Changli Gao Date: Tue Nov 16 20:28:24 2010 +0000 net: move definitions of BPF_S_* to net/core/filter.c BPF_S_* are used internally, should not be exposed to the others. Signed-off-by: Changli Gao Acked-by: Eric Dumazet Acked-by: Hagen Paul Pfeifer Signed-off-by: David S. Miller commit cba328fc5ede9091616e7296483840869b615a46 Author: Tetsuo Handa Date: Tue Nov 16 15:19:51 2010 +0000 filter: Optimize instruction revalidation code. Since repeating u16 value to u8 value conversion using switch() clause's case statement is wasteful, this patch introduces u16 to u8 mapping table and removes most of case statements. As a result, the size of net/core/filter.o is reduced by about 29% on x86. Signed-off-by: Tetsuo Handa Acked-by: Eric Dumazet Signed-off-by: David S. Miller commit 9e50e3ac5a5bbb1fd2949bdd57444ad1b93e5f41 Author: John Fastabend Date: Tue Nov 16 19:12:28 2010 +0000 net: add priority field to pktgen Add option to set skb priority to pktgen. Useful for testing QOS features. Also by running pktgen on the vlan device the qdisc on the real device can be tested. Signed-off-by: John Fastabend Acked-by: Eric Dumazet Signed-off-by: David S. Miller commit f72f2f4cdeb67bc262d80a6d474292f00182a4dc Author: Gerrit Renker Date: Thu Nov 18 09:37:07 2010 -0800 dccp ccid-2: whitespace fix-up This fixes whitespace noise introduced in commit "dccp ccid-2: Algorithm to update buffer state", 5753fdfe8bd8e9a2ff9e5af19b0ffc78bfcd502a, 14 Nov 2010. Signed-off-by: Gerrit Renker Signed-off-by: David S. Miller commit 866f3b25a2eb60d7529c227a0ecd80c3aba443fd Author: Eric Dumazet Date: Thu Nov 18 09:33:19 2010 -0800 bonding: IGMP handling cleanup Instead of iterating in_dev->mc_list from bonding driver, its better to call a helper function provided by igmp.c Details of implementation (locking) are private to igmp code. ip_mc_rejoin_group(struct ip_mc_list *im) becomes ip_mc_rejoin_groups(struct in_device *in_dev); Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit edd2126aa8aab8a87db7cc480d5047e9280d7acf Author: Jiri Kosina Date: Thu Nov 18 16:28:43 2010 +0100 HID: wacom: make sysfs permissions more strict It's not really dangerous in this driver, but it's against general practice and worth fixing. Wacom uses the attribute for changing the reporting speed of the tablet (and this actually requires poking the device in the background) (still I wouldn't consider it a security issue though). udev is a proper place to handle this. Reported-by: Linus Torvalds Signed-off-by: Jiri Kosina commit c311598b29f09c5092747a2603700f96a7daec2a Author: Jiri Kosina Date: Thu Nov 18 16:27:07 2010 +0100 HID: prodikeys: make sysfs permissions more strict It's not really dangerous in this driver, but it's against general practice and worth fixing. Proper place for handling this correctly is udev. Reported-by: Linus Torvalds Signed-off-by: Jiri Kosina commit f658bcfb2607bf0808966a69cf74135ce98e5c2d Author: Hans Rosenfeld Date: Fri Oct 29 17:14:32 2010 +0200 x86, cacheinfo: Cleanup L3 cache index disable support Adaptions to the changes of the AMD northbridge caching code: instead of a bool in each l3 struct, use a flag in amd_northbridges.flags to indicate L3 cache index disable support; use a pointer to the whole northbridge instead of the misc device in the l3 struct; simplify the initialisation; dynamically generate sysfs attribute array. Signed-off-by: Hans Rosenfeld Signed-off-by: Borislav Petkov commit 9653a5c76c8677b05b45b3b999d3b39988d2a064 Author: Hans Rosenfeld Date: Fri Oct 29 17:14:31 2010 +0200 x86, amd-nb: Cleanup AMD northbridge caching code Support more than just the "Misc Control" part of the northbridges. Support more flags by turning "gart_supported" into a single bit flag that is stored in a flags member. Clean up related code by using a set of functions (amd_nb_num(), amd_nb_has_feature() and node_to_amd_nb()) instead of accessing the NB data structures directly. Reorder the initialization code and put the GART flush words caching in a separate function. Signed-off-by: Hans Rosenfeld Signed-off-by: Borislav Petkov commit eec1d4fa00c6552ae2fdf71d59f1eded7c88dd89 Author: Hans Rosenfeld Date: Fri Oct 29 17:14:30 2010 +0200 x86, amd-nb: Complete the rename of AMD NB and related code Not only the naming of the files was confusing, it was even more so for the function and variable names. Renamed the K8 NB and NUMA stuff that is also used on other AMD platforms. This also renames the CONFIG_K8_NUMA option to CONFIG_AMD_NUMA and the related file k8topology_64.c to amdtopology_64.c. No functional changes intended. Signed-off-by: Hans Rosenfeld Signed-off-by: Borislav Petkov commit 423478cde453eebdfcfebf4b8d378d8f5d49b853 Author: Frederic Weisbecker Date: Thu Nov 18 02:21:26 2010 +0100 tracing: Remove useless syscall ftrace_event_call declaration It is defined right after, which makes the declaration completely useless. Signed-off-by: Frederic Weisbecker Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Arnaldo Carvalho de Melo Cc: Thomas Gleixner Cc: Steven Rostedt Cc: Li Zefan Cc: Jason Baron commit 53cf810b1934f08a68e131aeeb16267a778f43df Author: Frederic Weisbecker Date: Thu Nov 18 02:11:42 2010 +0100 tracing: Allow syscall trace events for non privileged users As for the raw syscalls events, individual syscall events won't leak system wide information on task bound tracing. Allow non privileged users to use them in such workflow. Signed-off-by: Frederic Weisbecker Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Arnaldo Carvalho de Melo Cc: Thomas Gleixner Cc: Steven Rostedt Cc: Li Zefan Cc: Jason Baron commit fe5542030dce3b951f9eaf3ecb9a7bc5fa7bfed1 Author: Frederic Weisbecker Date: Thu Nov 18 01:52:06 2010 +0100 tracing: Allow raw syscall trace events for non privileged users This allows non privileged users to use the raw syscall trace events for task bound tracing in perf. It is safe because raw syscall trace events don't leak system wide informations. Signed-off-by: Frederic Weisbecker Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Arnaldo Carvalho de Melo Cc: Thomas Gleixner Cc: Steven Rostedt Cc: Li Zefan Cc: Jason Baron commit 1ed0c5971159974185653170543a764cc061c857 Author: Frederic Weisbecker Date: Thu Nov 18 01:46:57 2010 +0100 tracing: New macro to set up initial event flags value This introduces the new TRACE_EVENT_FLAGS() macro in order to set up initial event flags value. This macro must simply follow the definition of a trace event and take the event name and the flag value as parameters: TRACE_EVENT(my_event, ..... .... ); TRACE_EVENT_FLAGS(my_event, 1) This will set up 1 as the initial my_event->flags value. Signed-off-by: Frederic Weisbecker Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Arnaldo Carvalho de Melo Cc: Thomas Gleixner Cc: Steven Rostedt Cc: Li Zefan Cc: Jason Baron commit 61c32659b12c44e62de32fbf99f7e4ca783dc38b Author: Frederic Weisbecker Date: Thu Nov 18 01:39:17 2010 +0100 tracing: New flag to allow non privileged users to use a trace event This adds a new trace event internal flag that allows them to be used in perf by non privileged users in case of task bound tracing. This is desired for syscalls tracepoint because they don't leak global system informations, like some other tracepoints. Signed-off-by: Frederic Weisbecker Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Arnaldo Carvalho de Melo Cc: Thomas Gleixner Cc: Steven Rostedt Cc: Li Zefan Cc: Jason Baron commit 9c0729dc8062bed96189bd14ac6d4920f3958743 Author: Soeren Sandmann Pedersen Date: Fri Nov 5 05:59:39 2010 -0400 x86: Eliminate bp argument from the stack tracing routines The various stack tracing routines take a 'bp' argument in which the caller is supposed to provide the base pointer to use, or 0 if doesn't have one. Since bp is garbage whenever CONFIG_FRAME_POINTER is not defined, this means all callers in principle should either always pass 0, or be conditional on CONFIG_FRAME_POINTER. However, there are only really three use cases for stack tracing: (a) Trace the current task, including IRQ stack if any (b) Trace the current task, but skip IRQ stack (c) Trace some other task In all cases, if CONFIG_FRAME_POINTER is not defined, bp should just be 0. If it _is_ defined, then - in case (a) bp should be gotten directly from the CPU's register, so the caller should pass NULL for regs, - in case (b) the caller should should pass the IRQ registers to dump_trace(), - in case (c) bp should be gotten from the top of the task's stack, so the caller should pass NULL for regs. Hence, the bp argument is not necessary because the combination of task and regs is sufficient to determine an appropriate value for bp. This patch introduces a new inline function stack_frame(task, regs) that computes the desired bp. This function is then called from the two versions of dump_stack(). Signed-off-by: Soren Sandmann Acked-by: Steven Rostedt Cc: Thomas Gleixner Cc: Ingo Molnar Cc: H. Peter Anvin Cc: Peter Zijlstra Cc: Arjan van de Ven , Cc: Frederic Weisbecker , Cc: Arnaldo Carvalho de Melo , LKML-Reference: > Signed-off-by: Frederic Weisbecker commit 23ce17adb7fc33a4353abe4b57a03f555cced57b Author: Sekhar Nori Date: Tue Oct 12 11:58:02 2010 +0530 spi: davinci: kconfig: add manufacturer name to prompt string Add manufacturer name to the Kconfig prompt string and move the controller name to the begining of the prompt. This helps locate the driver easily among the list of existing drivers. While at it, also add information about being able to build the driver as module. Tested-By: Brian Niebuhr Signed-off-by: Sekhar Nori commit 212d4b69652171d4474bc9dfc08e829737264632 Author: Sekhar Nori Date: Mon Oct 11 10:41:39 2010 +0530 spi: davinci: shorten variable names Shorten names of local variables and structure members where possible. Local variables: * 'davinci_spi' is being renamed 'dspi' * 'davinci_spi_dma' is being renamed 'dma' Structure members: * 'dma_{tx|rx}_channel' is being renamed '{tx|rx}_channel' since the structure containing them is already called 'davinci_spi_dma' * 'davinci_spi_dma' in 'davinci_spi' structure is being renamed 'dma' Tested-By: Brian Niebuhr Signed-off-by: Sekhar Nori commit 0e0eae4d1cdff5fa6608bcc6f6990774dec2527d Author: Sekhar Nori Date: Fri Oct 8 14:04:22 2010 +0530 spi: davinci: remove unnecessary private data member 'region_size' Remove unnecesary private data member 'region_size' being used to store the size of SPI memory region. Instead, get the memory resource size directly from the platform data. Tested-By: Brian Niebuhr Signed-off-by: Sekhar Nori commit 43abb11ba540e21346c6e7ab3211b48928501ea6 Author: Brian Niebuhr Date: Wed Oct 6 18:34:47 2010 +0530 spi: davinci: add EF Johnson Technologies copyright Add copyright for EF Johnson Technologies since the driver has been majorly overhauled by Brian. Signed-off-by: Brian Niebuhr Signed-off-by: Sekhar Nori commit 035540f6ea2394bdd9675552d31e1125cd0e402e Author: Brian Niebuhr Date: Wed Oct 6 18:32:40 2010 +0530 spi: davinci: add additional comments Add comments describing the platform data members and per-chip-select SPI configuration structure. Also, add some comments describing the what happens during the driver probe. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit d8c174cdeb6511aa307e6058468b68a9cc3990e4 Author: Brian Niebuhr Date: Wed Oct 6 18:47:16 2010 +0530 spi: davinci: setup the driver owner Setup the owner member of the platform driver to THIS_MODULE instead of leaving it NULL. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 3f27b57c1684efbe11fcc9449df898b1d0feb753 Author: Brian Niebuhr Date: Wed Oct 6 18:25:43 2010 +0530 spi: davinci: enable and power-up SPI only when required Enable SPI only when active transfers are in progress. Keep it in local low power when not in use. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 3409e408ab0d7171ae81d198110a1f293852959f Author: Brian Niebuhr Date: Wed Oct 6 18:13:31 2010 +0530 spi: davinci: remove non-useful "clk_internal" platform data The "clk_internal" platform data member which contols the CLKMOD bit in Global Control Register 1 is not useful since CLKMOD needs be set to 1 *always* to ensure master mode operation. Remove this platform data. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 87467bd9052725283b9a9f4b1b310fed8744fb1e Author: Brian Niebuhr Date: Wed Oct 6 17:03:10 2010 +0530 spi: davinci: let DMA operation be specified on per-device basis Let DMA operation be specified on a per-device basis instead of selecting it once during probe. A side effect of this is the need to combine the PIO and DMA buffer txrx_bufs routine. This is good since they anyway share some common functionality. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 6dbd29b27bd2627ba0025a6cff14381e69512cdf Author: Brian Niebuhr Date: Tue Oct 5 15:43:08 2010 +0530 spi: davinci: remove usage of additional completion variables for DMA The DMA code does not use the existing completion variable 'done' which is being used for interrupt mode transfers. Instead it uses two different completion variables specific to DMA mode transfers. Eliminate the usage of new completion variables for DMA mode and use the existing completion variable. [nsekhar@ti.com: To make this process easy, eliminate the two different DMA completion callback functions for tx and rx and use a single callback function instead] Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 9b189fd7584a1d8c68334dd1bc47b363877b314e Author: Brian Niebuhr Date: Tue Oct 5 11:38:41 2010 +0530 spi: davinci: handle DMA completion errors correctly Do not simply clean the DMA channel on a DMA completion error. Instead, use wcount and rcount members of davinci_spi to detecion non-completion of DMA and signal EIO to the application. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 523c37e7006522e778a1fd0aea2746ceb788572f Author: Brian Niebuhr Date: Mon Oct 4 17:35:34 2010 +0530 spi: davinci: fix EDMA CC errors at end of transfers Use a dummy param slot linked to itself to take care of the extra "sync event" that gets sent to EDMA controller after the last byte has been transferred. The dummy PaRAM slot that is linked to the actual DMA PaRAM slot "absorbs" this event and prevents a EDMA CC error to be asserted. Without this provision, the EDMA CC error would be asserted because the channel PaRAM would be empty after the transfer and EDMA would not know what to make out of the extra sync event. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 903ca25b219e28e3513ca4c2ff379fcdf19e057e Author: Sekhar Nori Date: Fri Oct 1 14:51:40 2010 +0530 spi: davinci: do not allocate DMA channels during SPI device setup Do not allocate (and de-allocate) SPI DMA channels during setup (and cleanup) for each SPI device. Instead, allocate the DMA channels once duing probe and use them for the life time of the driver. This makes sense since there are dedicated DMA channels meant for SPI use. This also helps remove the unnecessary DMA "sync_dev" variables being used to store DMA channel information. Also, the "use_dma" platform variable is now eliminated since it is possible to check if the platform supports DMA or not based upon whether DMA resources can be found or not. Tested-By: Michael Williamson Tested-By: Brian Niebuhr Signed-off-by: Sekhar Nori commit a4f4497b86a689aa8c827d4ebe0d00c4eba66f76 Author: Brian Niebuhr Date: Fri Oct 1 14:00:48 2010 +0530 spi: davinci: fix DMA event generation stoppage Do not stop SPI DMA event generation in either transmit or receive DMA event call back because the single setting affects both transmit and receive event generation. Depending on the order in which the callbacks happen, transmit or receive events can get unintentionally stalled. Instead, disable event generation once after both the transmit and receive DMA completes. While at it, remove the largely under-used function to set or clear DMA event generation. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 49fc3f497d7d409e9b0dc384fe7c173bccd3b1a1 Author: Brian Niebuhr Date: Fri Oct 1 11:22:23 2010 +0530 spi: davinci: use edma_write_slot() to setup EDMA PaRAM slot Currently a series of EDMA API calls are being made to setup various aspects of EDMA PaRAM slots for receive and transmit. Instead setup the PaRAM using a local structure and write once to the hardware using edma_write_slot() Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit e91c659bbcf2f47519260182a75f64ede34df3ca Author: Brian Niebuhr Date: Fri Oct 1 10:29:29 2010 +0530 spi: davinci: always start receive DMA In keeping with the full duplex nature of the SPI bus. Always start receive DMA along with transmit DMA. If there is no receive buffer provided with the transfer, use a temporary buffer to receive the data to be thrown away. [michael.williamson@criticallink.com: receive DMA size should be same as transfer length to avoid hang-up when transfer length is smaller than temporary rx buffer size (rx buffer not provided)] Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit d3f7141cbf4580b2f18f93940df29cf0c15e7ef5 Author: Brian Niebuhr Date: Wed Sep 29 12:31:54 2010 +0530 spi: davinci: do not use temporary buffer if no transmit data provided Remove usage of temporary buffer when no transmit data is provided. Instead, use the transmit register itself as the source of data. By choosing the transmit register itself as the source of data, this patch helps remove unnecessary accesses to memory when no real data is being transmitted. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit c29e3c60e75d1cc1262ac8af379738b6fd851f33 Author: Brian Niebuhr Date: Tue Sep 28 13:59:26 2010 +0530 spi: davinci: always start transmit DMA Due to the full duplex nature of the SPI bus, the SPI master on DaVinci needs transmit to be active even if the tranfer is only meant to collect receive data. The current code achieves this by using a temporary zeroed buffer to provide DMA data in case the transfer does not have a transmit buffer provided. However, the transmit DMA is started only if transmit buffer is provided rendering the temporary buffer unused. Instead the code relies on a write to SPIDAT1 register to trigger transmit operation. This however only sends two bytes of data. Fix this by starting transmit DMA always. This changes exposes a bug on DM355 where the CSHOLD bit in SPIDAT1 needs to be written to in between transfers. Handle that by introducing a "cshold_bug" platform data which is set to true for DM355. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 96fd881f22b44fc14772316a6b9231012393cda8 Author: Brian Niebuhr Date: Mon Sep 27 22:23:23 2010 +0530 spi: davinci: do not store DMA channel information per chip select Do not store DMA channel related information per chip-select since that information does not depend on the chip select. The same DMA channels can be used for transfers on all chip-selects since the transfer happens one-at-a-time. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit b23a5d4691043e97bbfde8c2fb5b8fecdc400308 Author: Brian Niebuhr Date: Fri Sep 24 18:53:32 2010 +0530 spi: davinci: remove unnecessary call to davinci_spi_setup_transfer() Remove unnecessary call to davinci_spi_setup_transfer() at the end of davinci_spi_setup(). davinci_spi_setup_transfer() is registered as the setup_transfer callback for the bitbang layer and is called independently by the bitbang layer to setup the transfer before it begins. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit be88471b96cf3a0d7aea72d5ca9c6a95fb54bade Author: Brian Niebuhr Date: Fri Sep 3 12:15:28 2010 +0530 spi: davinci: remove unnecessary function davinci_spi_bufs_prep() The function davinci_spi_bufs_prep() is doing stuff that davinci_spi_setup() is doing. Eliminate it and move the work to davinci_spi_setup() Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit f34bd4cc68fb4548536cac56798d3fad41806724 Author: Brian Niebuhr Date: Fri Sep 3 11:56:35 2010 +0530 spi: davinci: configure the invariable bits in spipc0 only once Configure the data-in, data-out and clock functionality pins in SPIPC0 register only once during probe. No need to set these bits for each transfer. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit e0d205e9914476e96596c5339fa440fb314ef03b Author: Brian Niebuhr Date: Thu Sep 2 16:52:06 2010 +0530 spi: davinci: add support for interrupt mode Add support for SPI interrupt mode operation. Define a per chip-select "io type" variable which specifies if the transfers on this chip-select should happen in interrupt mode or polled mode. Introduce a new function davinci_spi_process_events() to help consolidate the code between interrupt mode processing and polled mode processing. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 839c996ca8dd56f9ea80d7fc0c8b18b01394c82a Author: Brian Niebuhr Date: Mon Aug 23 16:39:19 2010 +0530 spi: davinci: simplify poll mode transfers Use the fact that the get_tx and get_rx can now cope with NULL buffer pointers to simplify the poll mode transfer code. While at it, check for SPI errors every transfer rather than at the end of the whole transfer. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit cf90fe73504764cbcc2552c7ea69b1866059db30 Author: Brian Niebuhr Date: Fri Aug 20 17:02:49 2010 +0530 spi: davinci: remove non-useful interrupt mode support The interrupt mode support as it stands is another version of poll mode. Even when interrupt mode is selected, the code tight loops on interrupt status register, rendering it totally useless. A completion variable is initialized, but never used. Remove this fake interrupt mode since users can anyway use poll mode with no functional difference. A usefully implemented interrupt mode support can be added later. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 47f44671c0dc92e2b77ff3dd843f742d12510477 Author: Brian Niebuhr Date: Mon Aug 23 16:34:13 2010 +0530 spi: davinci: remove unnecessary completion variable initialization The completion variable 'done' is unnecessarly initialized by the function davinci_spi_bufs_dma() where as it is not used for DMA transfers at all. Remove the unnecessary initialization. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 134e32b979f3f3987e84dcd5cc42040e21252e53 Author: Sekhar Nori Date: Fri Aug 20 16:27:08 2010 +0530 spi: davinci: do not treat Tx interrupt being set as error In davinci_spi_check_error(), Tx interrupt being set is treated as error. This function is only meant to flag bus error conditions and Tx interrupt being set at that point is not a bus error but rather a driver bug. Stop checking for Tx interrupt and flagging that as an IO error. Tested-By: Michael Williamson Tested-By: Brian Niebuhr Signed-off-by: Sekhar Nori commit f2bf4e849315c1573f996d082c53c6b686054da7 Author: Brian Niebuhr Date: Fri Aug 20 15:28:23 2010 +0530 spi: davinci: remove unnecessary 'count' variable in driver private data The variable count in DaVinci SPI driver's private data is largely unused and its minor use can easily be eliminated. Remove the variable. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit fab89ea330cabdaf29d82151de6d8f2369cc4da9 Author: Brian Niebuhr Date: Fri Aug 20 14:53:47 2010 +0530 spi: davinci: remove unnecessary disable of SPI In the davinci_spi_bufs_dma() function, SPI is briefly disabled before enabling it immediately back again. Remove this unnecessary disable. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 53d454a170e86594af1d27be820e678a582af751 Author: Brian Niebuhr Date: Thu Aug 19 17:04:25 2010 +0530 spi: davinci: check for NULL buffer pointer before using it In the davinci_spi_{tx|rx}_u{8|16}() functions, check for buffer pointer being valid before using it. While providing for better error checking, this change will help simplify code in the caller. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit b7ab24a0da96c8fc6d551ea87e82692299df6ac6 Author: Brian Niebuhr Date: Thu Aug 19 16:42:42 2010 +0530 spi: davinci: simplify calculation of edma acount value The EDMA acount (called data_type in davinci_spi_bufs_dma()) is simply the bytes_per_word obtained in the transfer setup function. The current code calculates the acount value from bytes_per_word in a convoluted manner. Simplify the code. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 6321be60edac6037ea76e9beef375c6ae2961765 Author: Brian Niebuhr Date: Thu Aug 19 16:38:20 2010 +0530 spi: davinci: eliminate unnecessary update of davinci_spi->count The count member of davinci_spi is internal to the driver and is not shared with framework. Eliminate its unnecessary update. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit cda987ebb86dfc757320bfa5c7b2afcd9d3ed30f Author: Brian Niebuhr Date: Thu Aug 19 16:16:28 2010 +0530 spi: davinci: eliminate the single member structure davinci_spi_slave The struct davinci_spi_slave has a single member. Eliminate it and store the per-chipselect data in struct davinci_spi directly. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit b6c4eeac5bc6a6bf769d7f170c507a1b78fd120a Author: Brian Niebuhr Date: Thu Aug 19 15:41:41 2010 +0530 spi: davinci: remove unused members of davinci_spi_slave Several members of struct davinci_spi_slave are unused in code. Remove such members. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 7abbf23c5903e14b0cff1cdeab906eab164be767 Author: Brian Niebuhr Date: Thu Aug 19 15:07:38 2010 +0530 spi: davinci: add support for wait enable timeouts Just enabling WAITENA in SPIFMTn register waits for the enable signal from the slave indefinitely. Allow support for finite waiting by adding support for c2e delay (maximum time for addressed slave to respond) and t2e delay (maximum time for slave to respond after transmit data finished). While at it, modify the T2C and C2T defines by prepending the register name as is the convention followed for other register field elsewhere in the driver. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit fd764463fe28ac53371565f851240e74775fb1aa Author: Brian Niebuhr Date: Thu Aug 19 12:44:31 2010 +0530 spi: davinci: setup chip-select timers values only if timer enabled Setup chip-select timers values only if timer is enabled (timer_disbled in spi configuration is false). As a nice side effect, this patch removes code duplicated in davinci_spi_bufs_pio() and davinci_spi_bufs_dma(). Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 25f33512f6ae7e37d7b3d353d57d4d6d066033ce Author: Brian Niebuhr Date: Thu Aug 19 12:15:22 2010 +0530 spi: davinci: consolidate setup of SPIFMTn in one function Consolidate the setup of SPIFMTn register under davinci_spi_setup_transfer() simplifying the code and avoiding unnecessary reads and writes to the register. The two inline functions {set|clear}_fmt_bits() can be eliminated because of this. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 53a31b07c5aea4001bbb36ddd5ef2addffc7ccbd Author: Brian Niebuhr Date: Mon Aug 16 15:05:51 2010 +0530 spi: davinci: make chip-slect specific parameters really chip-select specific Some chip-select specific paramterers like wdelay, parity, usage of chip-select timers (and the actual timer values) are included in platform data forcing the same behaviour across all chip-selects. Create a new davinci_spi_config data structure which can be passed along using controller_data member of spi_device data structure on a per-device basis. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 472880c73da124b6cb5cbc31a36754aa62935afe Author: Brian Niebuhr Date: Mon Aug 16 10:28:53 2010 +0530 spi: davinci: remove 'wait_enable' platform data member The SPI_READY bit of struct spi_device:mode serves the purpose of letting the SPI master know if the slave can signal if it is ready for transfer or not. The 'wait_enable' platform data was duplicating this functionality. Use the framework provided method of indicating this capability. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 7fe0092b1f55f58a749d68ace3a3597e8a2a9163 Author: Brian Niebuhr Date: Fri Aug 13 13:27:23 2010 +0530 spi: davinci: simplify prescalar calculation Simplify pre-scalar calculation and move it into a seprate function. Refuse to correct invalid pre-scalar values silently as this might lead to unexpected bugs and lower performance. Instead an error will force users to dig into the root-cause of the issue. While at it, remove some device specific checks on the maximum SPI frequency. As the driver supports the SPI interface implemented on various devices, it should only take care of core SPI limitations and leave the device specific handling to platform code. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 23853973d9b76eb8b3cf46157689bc6187e141d9 Author: Brian Niebuhr Date: Fri Aug 13 10:57:44 2010 +0530 spi: davinci: enable GPIO lines to be used as chip selects Sometimes, the chip selects provided by SPI module are muxed with other functionality and cannot be used in some designs. In such cases, it becomes convenient to use an available GPIO line as chip select. This patch enables the DaVinci SPI driver to treat specific GPIO lines as chip selects based on information provided in platform data. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit cfbc5d1d8fda9d337e912a03502cf77d29870a8e Author: Brian Niebuhr Date: Thu Aug 12 12:27:33 2010 +0530 spi: davinci: remove unnecessary data transmit on CS disable On TI DaVinci's SPI controller, the SPIDAT1 register which controls the chip slect status, also has data transmit register in the lower 16 bits. Writing to the whole 32-bits triggers an additional data transmit every time the chip select is disabled. While most SPI slaves cope-up with this, some cannot. This patch fixes this by doing a 16-bit write on the upper half of the SPIDAT1 register While at it, group the SPIGCR1 register related defines seperately from SPIDAT1 register defines. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 7978b8c385a86f0b5b9304e81a1dfb5dcaf21528 Author: Brian Niebuhr Date: Fri Aug 13 10:11:03 2010 +0530 spi: davinci: enable both activation and deactivation of chip-selects Let davinci_spi_chipselect() perform both activation and deactivation of chip selects. This lets spi_bitbang fully control chip select activation, as intended by the SPI API. With this change, the chip select activation code need not be duplicated in davinci_spi_bufs_{pio|dma}(). Also, keeping chip select active control is removed as a platform data and simply controlled using information from spi_bitbang on whether chip slect should be activated or de-activated. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 843a713bc53d04f8fac46ddd8693a2cc0422ca5e Author: Brian Niebuhr Date: Thu Aug 12 12:49:05 2010 +0530 spi: davinci: set chip-select mode in SPIDEF only once Quit writing the same constant value determining the chip-select mode when no transmissions are in progress in davinci_spi_chipelect(). Instead just setup the SPIDEF register once during probe. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 50356dd7c1f6338588af6a745649a718f16fe453 Author: Sekhar Nori Date: Fri Oct 8 15:27:26 2010 +0530 spi: davinci: remove unnecessary typecast The typecasting of SPI base address to davinci_spi_reg is unused. Remove it. Tested-By: Michael Williamson Tested-By: Brian Niebuhr Signed-off-by: Sekhar Nori commit 8e206f1cbd0d1387bf7d5e463ca880b43458e2ea Author: Sekhar Nori Date: Fri Aug 20 16:20:49 2010 +0530 spi: davinci: removed unused #defines Remove unused defines from code which should help in easy reading of code. Also, use the opportuinity to keep the SPIGCR1 register defines together. Tested-By: Michael Williamson Tested-By: Brian Niebuhr Signed-off-by: Sekhar Nori commit c3c475c2353f6d13a5c77c3b6203c0240339da7d Author: Brian Niebuhr Date: Fri Sep 3 16:19:09 2010 +0530 spi: davinci: remove unused variable 'pdata' The 'pdata' variable is unused in couple of routines. Remove such occurences. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 778e261ed678c3654386fc38bc6c50353ce04cc7 Author: Brian Niebuhr Date: Fri Sep 3 15:15:06 2010 +0530 spi: davinci: whitespace cleanup Cleanup unnecessary white space from various parts of the file. Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 3b740b10e9424f7ffb9baab1e6a3ff361cbf8ce3 Author: Brian Niebuhr Date: Fri Sep 3 14:50:07 2010 +0530 spi: davinci: fix checkpatch errors Fix the following checkpatch error: WARNING: unnecessary whitespace before a quoted newline + dev_info(&pdev->dev, "Controller at 0x%p \n", davinci_spi->base); Signed-off-by: Brian Niebuhr Tested-By: Michael Williamson Signed-off-by: Sekhar Nori commit 84e1c6bb38eb318e456558b610396d9f1afaabf0 Author: matthieu castet Date: Tue Nov 16 22:35:16 2010 +0100 x86: Add RO/NX protection for loadable kernel modules This patch is a logical extension of the protection provided by CONFIG_DEBUG_RODATA to LKMs. The protection is provided by splitting module_core and module_init into three logical parts each and setting appropriate page access permissions for each individual section: 1. Code: RO+X 2. RO data: RO+NX 3. RW data: RW+NX In order to achieve proper protection, layout_sections() have been modified to align each of the three parts mentioned above onto page boundary. Next, the corresponding page access permissions are set right before successful exit from load_module(). Further, free_module() and sys_init_module have been modified to set module_core and module_init as RW+NX right before calling module_free(). By default, the original section layout and access flags are preserved. When compiled with CONFIG_DEBUG_SET_MODULE_RONX=y, the patch will page-align each group of sections to ensure that each page contains only one type of content and will enforce RO/NX for each group of pages. -v1: Initial proof-of-concept patch. -v2: The patch have been re-written to reduce the number of #ifdefs and to make it architecture-agnostic. Code formatting has also been corrected. -v3: Opportunistic RO/NX protection is now unconditional. Section page-alignment is enabled when CONFIG_DEBUG_RODATA=y. -v4: Removed most macros and improved coding style. -v5: Changed page-alignment and RO/NX section size calculation -v6: Fixed comments. Restricted RO/NX enforcement to x86 only -v7: Introduced CONFIG_DEBUG_SET_MODULE_RONX, added calls to set_all_modules_text_rw() and set_all_modules_text_ro() in ftrace -v8: updated for compatibility with linux 2.6.33-rc5 -v9: coding style fixes -v10: more coding style fixes -v11: minor adjustments for -tip -v12: minor adjustments for v2.6.35-rc2-tip -v13: minor adjustments for v2.6.37-rc1-tip Signed-off-by: Siarhei Liakh Signed-off-by: Xuxian Jiang Acked-by: Arjan van de Ven Reviewed-by: James Morris Signed-off-by: H. Peter Anvin Cc: Andi Kleen Cc: Rusty Russell Cc: Stephen Rothwell Cc: Dave Jones Cc: Kees Cook Cc: Linus Torvalds LKML-Reference: <4CE2F914.9070106@free.fr> [ minor cleanliness edits, -v14: build failure fix ] Signed-off-by: Ingo Molnar commit 9437178f623a19af5951808d880a8599f66ac150 Author: Paul Turner Date: Mon Nov 15 15:47:10 2010 -0800 sched: Update tg->shares after cpu.shares write Formerly sched_group_set_shares would force a rebalance by overflowing domain share sums. Now that per-cpu averages are maintained we can set the true value by issuing an update_cfs_shares() following a tg->shares update. Also initialize tg se->load to 0 for consistency since we'll now set correct weights on enqueue. Signed-off-by: Paul Turner Signed-off-by: Peter Zijlstra LKML-Reference: <20101115234938.465521344@google.com> Signed-off-by: Ingo Molnar commit d6b5591829bd348a5fbe1c428d28dea00621cdba Author: Paul Turner Date: Mon Nov 15 15:47:09 2010 -0800 sched: Allow update_cfs_load() to update global load Refactor the global load updates from update_shares_cpu() so that update_cfs_load() can update global load when it is more than ~10% out of sync. The new global_load parameter allows us to force an update, regardless of the error factor so that we can synchronize w/ update_shares(). Signed-off-by: Paul Turner Signed-off-by: Peter Zijlstra LKML-Reference: <20101115234938.377473595@google.com> Signed-off-by: Ingo Molnar commit 3b3d190ec3683d568fd2ebaead5e1ec7f97b6e37 Author: Paul Turner Date: Mon Nov 15 15:47:08 2010 -0800 sched: Implement demand based update_cfs_load() When the system is busy, dilation of rq->next_balance makes lb->update_shares() insufficiently frequent for threads which don't sleep (no dequeue/enqueue updates). Adjust for this by making demand based updates based on the accumulation of execution time sufficient to wrap our averaging window. Signed-off-by: Paul Turner Signed-off-by: Peter Zijlstra LKML-Reference: <20101115234938.291159744@google.com> Signed-off-by: Ingo Molnar commit c66eaf619c0c7937e9ded160ae83b5a7a6b19b56 Author: Paul Turner Date: Mon Nov 15 15:47:07 2010 -0800 sched: Update shares on idle_balance Since shares updates are no longer expensive and effectively local, update them at idle_balance(). This allows us to more quickly redistribute shares to another cpu when our load becomes idle. Signed-off-by: Paul Turner Signed-off-by: Peter Zijlstra LKML-Reference: <20101115234938.204191702@google.com> Signed-off-by: Ingo Molnar commit a7a4f8a752ec734b2eab904fc863d5dc873de338 Author: Paul Turner Date: Mon Nov 15 15:47:06 2010 -0800 sched: Add sysctl_sched_shares_window Introduce a new sysctl for the shares window and disambiguate it from sched_time_avg. A 10ms window appears to be a good compromise between accuracy and performance. Signed-off-by: Paul Turner Signed-off-by: Peter Zijlstra LKML-Reference: <20101115234938.112173964@google.com> Signed-off-by: Ingo Molnar commit 67e86250f8ea7b8f7da53ac25ea73c6bd71f5cd9 Author: Paul Turner Date: Mon Nov 15 15:47:05 2010 -0800 sched: Introduce hierarchal order on shares update list Avoid duplicate shares update calls by ensuring children always appear before parents in rq->leaf_cfs_rq_list. This allows us to do a single in-order traversal for update_shares(). Since we always enqueue in bottom-up order this reduces to 2 cases: 1) Our parent is already in the list, e.g. root \ b /\ c d* (root->b->c already enqueued) Since d's parent is enqueued we push it to the head of the list, implicitly ahead of b. 2) Our parent does not appear in the list (or we have no parent) In this case we enqueue to the tail of the list, if our parent is subsequently enqueued (bottom-up) it will appear to our right by the same rule. Signed-off-by: Paul Turner Signed-off-by: Peter Zijlstra LKML-Reference: <20101115234938.022488865@google.com> Signed-off-by: Ingo Molnar commit e33078baa4d30ad1d0e46d1f62b9e5a63a3e6ee3 Author: Paul Turner Date: Mon Nov 15 15:47:04 2010 -0800 sched: Fix update_cfs_load() synchronization Using cfs_rq->nr_running is not sufficient to synchronize update_cfs_load with the put path since nr_running accounting occurs at deactivation. It's also not safe to make the removal decision based on load_avg as this fails with both high periods and low shares. Resolve this by clipping history after 4 periods without activity. Note: the above will always occur from update_shares() since in the last-task-sleep-case that task will still be cfs_rq->curr when update_cfs_load is called. Signed-off-by: Paul Turner Signed-off-by: Peter Zijlstra LKML-Reference: <20101115234937.933428187@google.com> Signed-off-by: Ingo Molnar commit f0d7442a5924a802b66eef79b3708f77297bfb35 Author: Paul Turner Date: Mon Nov 15 15:47:03 2010 -0800 sched: Fix load corruption from update_cfs_shares() As part of enqueue_entity both a new entity weight and its contribution to the queuing cfs_rq / rq are updated. Since update_cfs_shares will only update the queueing weights when the entity is on_rq (which in this case it is not yet), there's a dependency loop here: update_cfs_shares needs account_entity_enqueue to update cfs_rq->load.weight account_entity_enqueue needs the updated weight for the queuing cfs_rq load[*] Fix this and avoid spurious dequeue/enqueues by issuing update_cfs_shares as if we had accounted the enqueue already. This was also resulting in rq->load corruption previously. [*]: this dependency also exists when using the group cfs_rq w/ update_cfs_shares as the weight of the enqueued entity changes without the load being updated. Signed-off-by: Paul Turner Signed-off-by: Peter Zijlstra LKML-Reference: <20101115234937.844900206@google.com> Signed-off-by: Ingo Molnar commit 9e3081ca61147b29f52fddb4f7c6b6b82ea5eb7a Author: Peter Zijlstra Date: Mon Nov 15 15:47:02 2010 -0800 sched: Make tg_shares_up() walk on-demand Make tg_shares_up() use the active cgroup list, this means we cannot do a strict bottom-up walk of the hierarchy, but assuming its a very wide tree with a small number of active groups it should be a win. Signed-off-by: Paul Turner Signed-off-by: Peter Zijlstra LKML-Reference: <20101115234937.754159484@google.com> Signed-off-by: Ingo Molnar commit 3d4b47b4b040c9d77dd68104cfc1055d89a55afd Author: Peter Zijlstra Date: Mon Nov 15 15:47:01 2010 -0800 sched: Implement on-demand (active) cfs_rq list Make certain load-balance actions scale per number of active cgroups instead of the number of existing cgroups. This makes wakeup/sleep paths more expensive, but is a win for systems where the vast majority of existing cgroups are idle. Signed-off-by: Paul Turner Signed-off-by: Peter Zijlstra LKML-Reference: <20101115234937.666535048@google.com> Signed-off-by: Ingo Molnar commit 2069dd75c7d0f49355939e5586daf5a9ab216db7 Author: Peter Zijlstra Date: Mon Nov 15 15:47:00 2010 -0800 sched: Rewrite tg_shares_up) By tracking a per-cpu load-avg for each cfs_rq and folding it into a global task_group load on each tick we can rework tg_shares_up to be strictly per-cpu. This should improve cpu-cgroup performance for smp systems significantly. [ Paul: changed to use queueing cfs_rq + bug fixes ] Signed-off-by: Paul Turner Signed-off-by: Peter Zijlstra LKML-Reference: <20101115234937.580480400@google.com> Signed-off-by: Ingo Molnar commit 48c5ccae88dcd989d9de507e8510313c6cbd352b Author: Peter Zijlstra Date: Sat Nov 13 19:32:29 2010 +0100 sched: Simplify cpu-hot-unplug task migration While discussing the need for sched_idle_next(), Oleg remarked that since try_to_wake_up() ensures sleeping tasks will end up running on a sane cpu, we can do away with migrate_live_tasks(). If we then extend the existing hack of migrating current from CPU_DYING to migrating the full rq worth of tasks from CPU_DYING, the need for the sched_idle_next() abomination disappears as well, since idle will be the only possible thread left after the migration thread stops. This greatly simplifies the hot-unplug task migration path, as can be seen from the resulting code reduction (and about half the new lines are comments). Suggested-by: Oleg Nesterov Signed-off-by: Peter Zijlstra LKML-Reference: <1289851597.2109.547.camel@laptop> Signed-off-by: Ingo Molnar commit 92fd4d4d67b945c0766416284d4ab236b31542c4 Merge: fe7de49f9d4e53f24ec9ef762a503f70b562341c e53beacd23d9cb47590da6a7a7f6d417b941a994 Author: Ingo Molnar Date: Thu Nov 18 13:22:14 2010 +0100 Merge commit 'v2.6.37-rc2' into sched/core Merge reason: Move to a .37-rc base. Signed-off-by: Ingo Molnar commit 5bd5a452662bc37c54fb6828db1a3faf87e6511c Author: Matthieu Castet Date: Tue Nov 16 22:31:26 2010 +0100 x86: Add NX protection for kernel data This patch expands functionality of CONFIG_DEBUG_RODATA to set main (static) kernel data area as NX. The following steps are taken to achieve this: 1. Linker script is adjusted so .text always starts and ends on a page bound 2. Linker script is adjusted so .rodata always start and end on a page boundary 3. NX is set for all pages from _etext through _end in mark_rodata_ro. 4. free_init_pages() sets released memory NX in arch/x86/mm/init.c 5. bios rom is set to x when pcibios is used. The results of patch application may be observed in the diff of kernel page table dumps: pcibios: -- data_nx_pt_before.txt 2009-10-13 07:48:59.000000000 -0400 ++ data_nx_pt_after.txt 2009-10-13 07:26:46.000000000 -0400 0x00000000-0xc0000000 3G pmd ---[ Kernel Mapping ]--- -0xc0000000-0xc0100000 1M RW GLB x pte +0xc0000000-0xc00a0000 640K RW GLB NX pte +0xc00a0000-0xc0100000 384K RW GLB x pte -0xc0100000-0xc03d7000 2908K ro GLB x pte +0xc0100000-0xc0318000 2144K ro GLB x pte +0xc0318000-0xc03d7000 764K ro GLB NX pte -0xc03d7000-0xc0600000 2212K RW GLB x pte +0xc03d7000-0xc0600000 2212K RW GLB NX pte 0xc0600000-0xf7a00000 884M RW PSE GLB NX pmd 0xf7a00000-0xf7bfe000 2040K RW GLB NX pte 0xf7bfe000-0xf7c00000 8K pte No pcibios: -- data_nx_pt_before.txt 2009-10-13 07:48:59.000000000 -0400 ++ data_nx_pt_after.txt 2009-10-13 07:26:46.000000000 -0400 0x00000000-0xc0000000 3G pmd ---[ Kernel Mapping ]--- -0xc0000000-0xc0100000 1M RW GLB x pte +0xc0000000-0xc0100000 1M RW GLB NX pte -0xc0100000-0xc03d7000 2908K ro GLB x pte +0xc0100000-0xc0318000 2144K ro GLB x pte +0xc0318000-0xc03d7000 764K ro GLB NX pte -0xc03d7000-0xc0600000 2212K RW GLB x pte +0xc03d7000-0xc0600000 2212K RW GLB NX pte 0xc0600000-0xf7a00000 884M RW PSE GLB NX pmd 0xf7a00000-0xf7bfe000 2040K RW GLB NX pte 0xf7bfe000-0xf7c00000 8K pte The patch has been originally developed for Linux 2.6.34-rc2 x86 by Siarhei Liakh and Xuxian Jiang . -v1: initial patch for 2.6.30 -v2: patch for 2.6.31-rc7 -v3: moved all code into arch/x86, adjusted credits -v4: fixed ifdef, removed credits from CREDITS -v5: fixed an address calculation bug in mark_nxdata_nx() -v6: added acked-by and PT dump diff to commit log -v7: minor adjustments for -tip -v8: rework with the merge of "Set first MB as RW+NX" Signed-off-by: Siarhei Liakh Signed-off-by: Xuxian Jiang Signed-off-by: Matthieu CASTET Cc: Arjan van de Ven Cc: James Morris Cc: Andi Kleen Cc: Rusty Russell Cc: Stephen Rothwell Cc: Dave Jones Cc: Kees Cook Cc: Linus Torvalds LKML-Reference: <4CE2F82E.60601@free.fr> [ minor cleanliness edits ] Signed-off-by: Ingo Molnar commit 64edc8ed5ffae999d8d413ba006850e9e34166cb Author: matthieu castet Date: Tue Nov 16 22:30:27 2010 +0100 x86: Fix improper large page preservation This patch fixes a bug in try_preserve_large_page() which may result in improper large page preservation and improper application of page attributes to the memory area outside of the original change request. More specifically, the problem manifests itself when set_memory_*() is called for several pages at the beginning of the large page and try_preserve_large_page() erroneously concludes that the change can be applied to whole large page. The fix consists of 3 parts: 1. Addition of "required" protection attributes in static_protections(), so .data and .bss can be guaranteed to stay "RW" 2. static_protections() is now called for every small page within large page to determine compatibility of new protection attributes (instead of just small pages within the requested range). 3. Large page can be preserved only if attribute change is large-page-aligned and covers whole large page. -v1: Try_preserve_large_page() patch for Linux 2.6.34-rc2 -v2: Replaced pfn check with address check for kernel rw-data Signed-off-by: Siarhei Liakh Signed-off-by: Xuxian Jiang Reviewed-by: Suresh Siddha Cc: Arjan van de Ven Cc: James Morris Cc: Andi Kleen Cc: Rusty Russell Cc: Stephen Rothwell Cc: Dave Jones Cc: Kees Cook Cc: Linus Torvalds LKML-Reference: <4CE2F7F3.8030809@free.fr> Signed-off-by: Ingo Molnar commit e9229faf920aba47dd1ba6940b3ca138024543d3 Author: Tracey Dent Date: Sun Nov 7 09:46:28 2010 -0500 HID: usbhid: Clean up makefile (-y instead of -objs) Changed Makefile to use -y instead of -objs because -objs is deprecated and should now be switched. According to (documentation/kbuild/makefiles.txt). Signed-off-by: Tracey Dent Signed-off-by: Jiri Kosina commit d47d612459300510215fc54bf1283f81710745df Author: Tracey Dent Date: Thu Nov 18 10:42:30 2010 +0100 HID: Clean up makefile (-y instead of -objs) Changed Makefile to use -y instead of -objs because -objs is deprecated and should now be switched. According to (documentation/kbuild/makefiles.txt). Signed-off-by: Tracey Dent Signed-off-by: Jiri Kosina commit 82148d1d0b2f369851f2dff5088f7840f9f16abf Author: ShĂ©rab Date: Sat Sep 25 06:06:57 2010 +0200 x86/platform: Add Eurobraille/Iris power off support The Iris machines from Eurobraille do not have APM or ACPI support to shut themselves down properly. A special I/O sequence is needed to do so. This modle runs this I/O sequence at kernel shutdown when its force parameter is set to 1. Signed-off-by: ShĂ©rab Acked-by: "H. Peter Anvin" [ did minor coding style edits ] Signed-off-by: Ingo Molnar commit 79250af2d5953b69380a6319b493862bf4ece972 Author: Kees Cook Date: Tue Nov 16 10:10:04 2010 -0800 x86: Fix included-by file reference comments Adjust the paths for files that are including verify_cpu.S. Reported-by: Yinghai Lu Signed-off-by: Kees Cook Acked-by: Pekka Enberg Cc: Alan Cox LKML-Reference: <1289931004-16066-1-git-send-email-kees.cook@canonical.com> Signed-off-by: Ingo Molnar commit 0421860a5a75b59a76b7a864a172eb090e3d0785 Merge: cf655c36fad7b6488a56f18ab56f7d608ca6552b 89ba4d12fca24d373e1b10fce498d68157bafaf0 Author: Paul Mundt Date: Thu Nov 18 17:35:56 2010 +0900 Merge branch 'rmobile/ag5' into rmobile-latest commit c44f242064093e640a068741b05ee6acdd49bc22 Author: Dmitry Torokhov Date: Mon Nov 15 01:39:57 2010 -0800 Input: gameport - convert to use common workqueue instead of a thread Instead of creating an exclusive thread to handle gameport events (which happen rarely), let's switch to common workqueue. With the arrival of concurrency-managed workqueue infrastructure we are not concerned that our callers or callees also using workqueue (no deadlocks anymore) and it should reduce total number of threads in the system. Signed-off-by: Dmitry Torokhov commit 8ee294cd9def0004887da7f44b80563493b0a097 Author: Dmitry Torokhov Date: Mon Nov 15 01:39:57 2010 -0800 Input: serio - convert to common workqueue instead of a thread Instead of creating an exclusive thread to handle serio events (which happen rarely), let's switch to using common workqueue. With the arrival of concurrency-managed workqueue infrastructure we are not concerned that our callers or callees also using workqueue (no deadlocks anymore) and it should reduce total number of threads in the system. Signed-off-by: Dmitry Torokhov commit ce16a474f6305dd631c885ba970d5746e4d5c803 Author: Chris Leech Date: Wed Nov 17 23:59:54 2010 -0800 Input: qt602240_ts - fix wrong sizeof in object table allocation The kcalloc call for the object table is using sizeof(struct qt602240_data) when it should be using sizeof(struct qt6602240_object), resulting in a larger allocation than is required. Signed-off-by: Chris Leech Signed-off-by: Dmitry Torokhov commit 8b5fce06f8795d9a7f8d1f03f743fc8befa66b3b Author: Dmitry Torokhov Date: Thu Nov 18 00:14:03 2010 -0800 Input: qt602240_ts - convert to using dev_pm_ops Signed-off-by: Dmitry Torokhov commit e3f0f0a6c11b049f1be603dcfec82d2a8643f5fd Author: Axel Lin Date: Wed Nov 17 23:59:34 2010 -0800 Input: xpad - ensure xpad->bulk_out is initialized before submitting urb As pointed out by Oliver Neukum: xpad->irq_in is currently submitted before xpad->bulk_out is allocated. That however is a race, because the callback for irq_in can call xpad360w_process_packet(), which will in turn submit the bulk URB. This patch moves initialization for xpad->bulk_out earlier, so we can ensure xpad->bulk_out is initialized before submitting urb. Signed-off-by: Axel Lin Signed-off-by: Dmitry Torokhov commit 072b198a4ad48bd722ec6d203d65422a4698eae7 Author: Don Zickus Date: Fri Nov 12 11:22:24 2010 -0500 x86, nmi_watchdog: Remove all stub function calls from old nmi_watchdog Now that the bulk of the old nmi_watchdog is gone, remove all the stub variables and hooks associated with it. This touches lots of files mainly because of how the io_apic nmi_watchdog was implemented. Now that the io_apic nmi_watchdog is forever gone, remove all its fingers. Most of this code was not being exercised by virtue of nmi_watchdog != NMI_IO_APIC, so there shouldn't be anything to risky here. Signed-off-by: Don Zickus Cc: fweisbec@gmail.com Cc: gorcunov@openvz.org LKML-Reference: <1289578944-28564-3-git-send-email-dzickus@redhat.com> Signed-off-by: Ingo Molnar commit 5f2b0ba4d94b3ac23cbc4b7f675d98eb677a760a Author: Don Zickus Date: Fri Nov 12 11:22:23 2010 -0500 x86, nmi_watchdog: Remove the old nmi_watchdog Now that we have a new nmi_watchdog that is more generic and sits on top of the perf subsystem, we really do not need the old nmi_watchdog any more. In addition, the old nmi_watchdog doesn't really work if you are using the default clocksource, hpet. The old nmi_watchdog code relied on local apic interrupts to determine if the cpu is still alive. With hpet as the clocksource, these interrupts don't increment any more and the old nmi_watchdog triggers false postives. This piece removes the old nmi_watchdog code and stubs out any variables and functions calls. The stubs are the same ones used by the new nmi_watchdog code, so it should be well tested. Signed-off-by: Don Zickus Cc: fweisbec@gmail.com Cc: gorcunov@openvz.org LKML-Reference: <1289578944-28564-2-git-send-email-dzickus@redhat.com> Signed-off-by: Ingo Molnar commit 89ba4d12fca24d373e1b10fce498d68157bafaf0 Author: Paul Mundt Date: Thu Nov 18 16:47:02 2010 +0900 ARM: mach-shmobile: Add ag5evm defconfig. Signed-off-by: Paul Mundt commit 45bbaae0dcddc275594e23f108cb68869eae7433 Author: Paul Mundt Date: Thu Nov 18 16:07:27 2010 +0900 ARM: mach-shmobile: Split out entry-macros in to GIC and INTC variants. Presently the entry macros are all globbed together, this simply splits them out in to their insular variants. Future work such as the GIC generalization will replace some of these and tidy the abstraction up further. Signed-off-by: Paul Mundt commit 6d9598e24d50a8c72f48a3864327484a30aaee44 Author: Magnus Damm Date: Wed Nov 17 10:59:31 2010 +0000 ARM: mach-shmobile: Initial AG5 and AG5EVM support This patch adds initial support for Renesas SH-Mobile AG5. At this point the AG5 CPU support is limited to the ARM core, SCIF serial and a CMT timer together with L2 cache and the GIC. The AG5EVM board also supports Ethernet. Future patches will add support for GPIO, INTCS, CPGA and platform data / driver updates for devices such as IIC, LCDC, FSI, KEYSC, CEU and SDHI among others. The code in entry-macro.S will be cleaned up when the ARM IRQ demux code improvements have been merged. Depends on the AG5EVM mach-type recently registered but not yet present in arch/arm/tools/mach-types. As the AG5EVM board comes with 512MiB memory it is recommended to turn on HIGHMEM. Many thanks to Yoshii-san for initial bring up. Signed-off-by: Magnus Damm Signed-off-by: Paul Mundt commit b2c0710c464ede15e1fc52fb1e7ee9ba54cea186 Author: Paul E. McKenney Date: Thu Sep 9 13:40:39 2010 -0700 rcu: move TINY_RCU from softirq to kthread If RCU priority boosting is to be meaningful, callback invocation must be boosted in addition to preempted RCU readers. Otherwise, in presence of CPU real-time threads, the grace period ends, but the callbacks don't get invoked. If the callbacks don't get invoked, the associated memory doesn't get freed, so the system is still subject to OOM. But it is not reasonable to priority-boost RCU_SOFTIRQ, so this commit moves the callback invocations to a kthread, which can be boosted easily. Signed-off-by: Paul E. McKenney Signed-off-by: Paul E. McKenney commit 6b6e39a6a8da7234c538d14c43d3583da8875f9c Author: Kay Sievers Date: Mon Nov 15 23:13:18 2010 +0100 driver-core: merge private parts of class and bus As classes and busses are pretty much the same thing, and we want to merge them together into a 'subsystem' in the future, let us share the same private data parts to make that merge easier. Signed-off-by: Kay Sievers Signed-off-by: Greg Kroah-Hartman commit 14c05aa399e30f343f25158c9adfc44631378a96 Merge: 319684b1cd15f24120b9513b38a949539c0b7938 e53beacd23d9cb47590da6a7a7f6d417b941a994 Author: Greg Kroah-Hartman Date: Wed Nov 17 13:47:26 2010 -0800 Driver core: Merge 2.6.37-rc2 into driver-core-next This resolves some build issues that were present in the older -rc1 tree that kept bothering me. Signed-off-by: Greg Kroah-Hartman commit 4f6838436915fdc281173bfd5bef6d8ab5cb1a7f Author: Dirk Brandewie Date: Wed Nov 17 07:43:09 2010 -0800 USB: ce4100: Add support for CE4100 EHCI IP block to EHCI driver This patch adds support for the EHCI IP block present on the Intel CE4100. Signed-off-by: Dirk Brandewie CC: David Brownell Signed-off-by: Greg Kroah-Hartman commit 2f15744c1d90ee2e82f8ae5724b44b1cdf31715c Author: Alan Stern Date: Wed Nov 17 10:56:01 2010 -0500 USB: fix leftover references to udev->autosuspend_delay This patch (as1436) takes care of leftover references to udev->autosuspend_delay that didn't get removed during the earlier conversion to the runtime-PM autosuspend API. Signed-off-by: Alan Stern Signed-off-by: Greg Kroah-Hartman commit aa02f172ac85f144d0baa248e27e34e165963f94 Author: Michal Nazarewicz Date: Wed Nov 17 17:09:47 2010 +0100 usb: gadget: g_fs: Fix compilation warning This commit fixes warning in f_fs.c introduced by "usb: gadget: f_fs: remove custom printk() wrappers": In file included from drivers/usb/gadget/g_ffs.c:64: drivers/usb/gadget/f_fs.c:30:1: warning: "pr_fmt" redefined Signed-off-by: Michal Nazarewicz Signed-off-by: Greg Kroah-Hartman commit 50a9432daeece6fc1309bef1dc0a7b8fde8204cb Author: Johannes Berg Date: Tue Nov 16 11:50:28 2010 -0800 mac80211: fix powersaving clients races The code to handle powersaving stations has a race: when the powersave flag is lifted from a station, we could transmit a packet that is being processed for TX at the same time right away, even if there are other frames queued for it. This would cause frame reordering. To fix this, lift the flag only under the appropriate lock that blocks TX. Additionally, the code to allow drivers to block a station while frames for it are on the HW queue is never re-enabled the station, so traffic would get stuck indefinitely. Fix this by clearing the flag for this appropriately. Finally, as an optimisation, don't do anything if the driver unblocks an already unblocked station. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 4bce22b9b84032c77c7e038b07b24fcc706dfc10 Author: Johannes Berg Date: Tue Nov 16 11:49:58 2010 -0800 mac80211: defines for AC numbers In many places we've just hardcoded the AC numbers -- which is a relic from the original mac80211 (d80211). Add constants for them so we know what we're talking about. Signed-off-by: Johannes Berg Signed-off-by: John W. Linville commit 488f6ba75b5deaa7e89d6cdac07e0f2120899b6f Author: Felix Fietkau Date: Tue Nov 16 19:20:28 2010 +0100 ath9k_hw: add support for reading EEPROM data from the internal OTP ROM Some of the new AR9003 cards do not come with an external EEPROM chip anymore. Calibration data on these cards is stored in the OTP ROM on the chip. This patch adds support for reading this data, and also adds support for different EEPROM chip sizes (512 bytes instead of 1K). Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 2d42efc44e38d3a8b2bf30e34559036bb6541672 Author: Felix Fietkau Date: Sun Nov 14 15:20:13 2010 +0100 ath9k: store frame information used by aggregation inside the skb tx info Since the pointers after the rates in the tx info cannot be used anymore after frames have been queued, this area can be used to store information that was previously stored in the ath_buf. With these changes, we can delay the ath_buf assignment in the aggregation code until aggregates are formed. That will not only make it possible to simplify DMA descriptor setup to do less rewriting of uncached memory, but will also make it easier to move aggregation out of the core of the ath9k tx path. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 04caf863750bc7e042d1e8d57e5ce9d6326ab435 Author: Felix Fietkau Date: Sun Nov 14 15:20:12 2010 +0100 ath9k: more tx setup cleanups - remove the BUF_HT flag, and instead check for IEEE80211_TX_CTL_AMPDU before calling ath_tx_send_ampdu. - remove a few unused variables - calculate frame length before adding the frame padding - merge the misnamed ath_tx_start_dma function into ath_tx_start - remove an unused argument for assign_aggr_tid_seqno Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 71a3bf3e94b745467fc4c3451a294910f0369555 Author: Felix Fietkau Date: Sun Nov 14 15:20:11 2010 +0100 ath9k: block new AMPDU sessions if SC_OP_TXAGGR is not set This makes further tx path cleanups easier Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 28d167086227969fd6586953ee4ac682a3c394ff Author: Felix Fietkau Date: Sun Nov 14 15:20:10 2010 +0100 ath9k: clean up code duplication around ath_tx_start Merge initial processing for the CAB queue and regular tx. Also move ath_tx_cabq() to beacon.c and make it static. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit c5992618259598ade82c386aa1595bf105e92d1f Author: Felix Fietkau Date: Sun Nov 14 15:20:09 2010 +0100 ath9k: remove bf_tx_aborted from struct ath_buf Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 76e4522177de81ac89ade01a394aeb3704a66f1b Author: Felix Fietkau Date: Sun Nov 14 15:20:08 2010 +0100 ath9k: remove bfs_frmlen from struct ath_buf_state Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit b572d0335fcb26e526f6ae087a9a09371b22e739 Author: Felix Fietkau Date: Sun Nov 14 15:20:07 2010 +0100 ath9k: remove bfs_nframes from struct ath_buf_state Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 269c44bc8415ad78fb4dc3de25e6de3420332e9f Author: Felix Fietkau Date: Sun Nov 14 15:20:06 2010 +0100 ath9k: remove bfs_al from struct ath_buf_state Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 3017047f564d5101009c8318b94bdacd3ca3312e Author: Felix Fietkau Date: Sun Nov 14 15:20:05 2010 +0100 ath9k: remove bfs_keyix from struct ath_buf_state Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 82259b77f6e55c5b81f5f4a2852f6216c196ef30 Author: Felix Fietkau Date: Sun Nov 14 15:20:04 2010 +0100 ath9k: remove bfs_paprd_timestamp from struct ath_buf_state Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 952cd693718d8ac796d5323fe7876241cf15ecfa Author: Felix Fietkau Date: Sun Nov 14 15:20:03 2010 +0100 ath9k: remove bfs_keytype from struct ath_buf_state Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 5daefbd061d9509644058b6886abe2b6672ee386 Author: Felix Fietkau Date: Sun Nov 14 15:20:02 2010 +0100 ath9k: remove bfs_tidno from struct ath_buf_state Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 2d3bcba0827013dfc60f727e7370dea00bc0638a Author: Felix Fietkau Date: Sun Nov 14 15:20:01 2010 +0100 ath9k: remove bfs_seqno from struct ath_buf_state Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 9a6b82706317333a1fab5dcafa2c33b91253a7a2 Author: Felix Fietkau Date: Sun Nov 14 00:03:01 2010 +0100 ath9k: fix PA predistortion training frame setup Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit c5d0855acfa4d6801c4c45bc02ddddd959262050 Author: Felix Fietkau Date: Sat Nov 13 20:22:41 2010 +0100 ath9k_hw: set default values for radar pulse detection Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 387e68846413f3dcfc5a5afca9841430057e3340 Author: RA-Jay Hung Date: Sat Nov 13 19:13:53 2010 +0100 rt2x00: Modify rt2x00queue_remove_l2pad to make skb->data two-byte alignment When send out skb data to mac80211, orignal code will cause mac80211 unaligned access, so modify code to make mac80211 can natural access. Signed-off-by: RA-Jay Hung Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit f8eaec659f8a7a4e0086fca7c5d5c5e0fbc76d1a Author: RA-Jay Hung Date: Sat Nov 13 19:12:54 2010 +0100 rt2x00: Fix header_length in rt2x00lib_txdone Put the assignment of header_length after pull out extra tx headroom Signed-off-by: RA-Jay Hung Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit b43d63bd69ae5464a52bf1796e84097607917b2f Author: RA-Jay Hung Date: Sat Nov 13 19:11:46 2010 +0100 rt2x00: Fix rt2800 USB TX Path DMA issue rt2800usb chips need to add 1~3 bytes zero padding after each 802.11 header & payload, and at the end need to add 4 bytes zero padding whether doing TX bulk aggregation or not, TXINFO_W0_USB_DMA_TX_PKT_LEN in TXINFO must include 1-3 bytes padding after 802.11 header & payload but do not include 4 bytes end zero padding. In rt2800usb_get_tx_data_len do not consider multiple of the USB packet size case, sometimes this will cause USB DMA problem. Signed-off-by: RA-Jay Hung Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit ef8397cfb3a385bc57a32213d0e4a5b7903a9dc6 Author: Gertjan van Wingerde Date: Sat Nov 13 19:11:22 2010 +0100 rt2x00: Use ioremap for SoC devices instead of KSEG1ADDR. Make the code a bit more portable to architectures that do not support KSEG1ADDR. Signed-off-by: Gertjan van Wingerde Tested-by: Helmut Schaa Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 72c7296e03e381b49958809915105b18b09fa7a3 Author: Gertjan van Wingerde Date: Sat Nov 13 19:10:54 2010 +0100 rt2x00: Remove unneccessary internal Kconfig symbols. CONFIG_RT2800PCI_PCI and CONFIG_RT2800PCI_SOC are strictly not needed as we can check the dependent symbols directly in the rest of Kconfig and the code, so clean up the Kconfig namespace a bit. Signed-off-by: Gertjan van Wingerde Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit a6a8d66ebaea1e78d779af221bd6f01c5cbe71f5 Author: Gertjan van Wingerde Date: Sat Nov 13 19:10:31 2010 +0100 rt2x00: Remove RT30XX Kconfig variables. Enabling of RT30xx devices via Kconfig variables was introduced when these devices weren't properly supported yet. Now that that they are properly supported and functional, we can remove these Kconfig variables for RT30xx devices and simply enable them whenever rt2800pci and/or rt2800usb is enabled. Signed-off-by: Gertjan van Wingerde Acked-by: Helmut Schaa Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 46af584d2ea86518c4cdf521903cd93ba6de2ec0 Author: Gertjan van Wingerde Date: Sat Nov 13 19:10:10 2010 +0100 rt2x00: Clean up Kconfig for RT2800 devices. General clean up of the Kconfig part for RT28XX devices. Also remove the indications of non functional support for rt27xx/rt28xx/rt30xx devices, as this is no longer true. They just work fine. Finally, remove the experimental indications for rt27xx/rt28xx/rt30xx devices as that is no longer true. Keep the experimental indications for rt33xx/rt35xx devices, though. Signed-off-by: Gertjan van Wingerde Acked-by: Helmut Schaa Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit f93bc9b3ce379800b30b3c2f4fc945ae35a80039 Author: Gertjan van Wingerde Date: Sat Nov 13 19:09:50 2010 +0100 rt2x00: Add initial support for RT3370/RT3390 devices. Modified from Eddy's patch by adding the RT3370 USB support as well. Signed-off-by: Gertjan van Wingerde Cc: Eddy Tsai Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit ae4ecb9f8f01eb9deffb5bd837dc90f4e646cd2d Author: Ivo van Doorn Date: Sat Nov 13 19:08:14 2010 +0100 rt2x00: Increase REGISTER_BUSY_COUNT For some hardware the REGISTER_BUSY_COUNT isn't sufficient, increase the REGISTER_BUSY_COUNT to 100 to catch most devices which have more problems with accessing the registers. For normal operating devices nothing would change as they will exit the loop early anyway. Signed-off-by: Ivo van Doorn Acked-by: Helmut Schaa Signed-off-by: John W. Linville commit 24aee93c37fe7fa2aa2381d3017be478e9c55c47 Author: Vinod Koul Date: Wed Nov 17 15:57:57 2010 +0000 sst: remove rest of aava bits and aava related code This removes the remaining bit of aava dependent and related bits from driver Signed-off-by: Vinod Koul Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 63fcf10db218a89cbd1e34c47540c3e28706cff1 Author: Yong Wang Date: Wed Nov 17 22:09:54 2010 +0800 staging: spectra: asynchronous init The spectra nand driver takes quite some time to initialize because it needs to scan the whole nand disk to find the latest block table. This patch initializes the spectra nand driver asynchronously so that other things in the kernel can initialize in parallel to the scanning operation. Signed-off-by: Yong Wang Signed-off-by: Greg Kroah-Hartman commit 6f5a416216fe2c39171326897e074d417df1082b Author: Yong Wang Date: Wed Nov 17 22:08:28 2010 +0800 staging: spectra: move all init logic into nand_pci_probe Currently there are some driver initialization logic that is not part of nand_pci_probe function. This will result in that part of driver initialization code executing even on platforms without the corresponding hardware which is always dangerous. Signed-off-by: Chuanxiao Dong Signed-off-by: Yong Wang Signed-off-by: Greg Kroah-Hartman commit 237a1a1aef91ab654988cb459d783ac0ee09d2ea Author: Dan Carpenter Date: Wed Nov 17 11:54:35 2010 +0300 Staging: ft1000-usb: freeing uninitialized pointer GCC complains that if (info->CardReady) is false we kfree() an uninitialized pointer. Signed-off-by: Dan Carpenter Signed-off-by: Greg Kroah-Hartman commit 93760716840a3feada381786f2defbd47a8099de Author: Brett Rudley Date: Tue Nov 16 17:41:15 2010 -0800 staging: brcm80211: nicpci.c: replace osl based PCI calls with native linux pci calls Get rid of the private PCI access routines and replace with standard calls from linux/pci.h in nicpci.c (The private versions are still used in siutils.c... for now) Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit e69284f24320e2589dbd78bf531ffa18d097ae4c Author: Brett Rudley Date: Tue Nov 16 15:45:48 2010 -0800 staging: brcm80211: s/osl_t/struct osl_info/g Do the substitution (and then fix all the dang lines that were pushed past 80 columns.) Some of the touched lines triggered checkpatch warnings for completely unrelated reasons that were already there. Those will have to be addressed later. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit e6a12a07d0b06f8e614a212e26002e62071242e8 Author: Brett Rudley Date: Tue Nov 16 13:16:59 2010 -0800 staging: brcm80211: completely remove osl_pubinfo_t typedef Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 1070137de3e3b0f3fdfedc420a06a43d05a6e705 Author: Brett Rudley Date: Tue Nov 16 13:16:58 2010 -0800 staging: brcm80211: expose osl contents and start combining osl and pub_osl. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit dda0b38692a7298f433b92b1329867b1ecabb4bb Author: Vasiliy Kulikov Date: Sun Nov 14 07:06:08 2010 +0000 net: ipv4: tcp_probe: cleanup snprintf() use snprintf() returns number of bytes that were copied if there is no overflow. This code uses return value as number of copied bytes. Theoretically format string '%lu.%09lu %pI4:%u %pI4:%u %d %#x %#x %u %u %u %u\n' may be expanded up to 163 bytes. In reality tv.tv_sec is just few bytes instead of 20, 2 ports are just 5 bytes each instead of 10, length is 5 bytes instead of 10. The rest is an unstrusted input. Theoretically if tv_sec is big then copy_to_user() would overflow tbuf. tbuf was increased to fit in 163 bytes. snprintf() is used to follow return value semantic. Signed-off-by: Vasiliy Kulikov Signed-off-by: David S. Miller commit 9ea19481db31d614f729f346bdcf28e4e60ff14a Author: John Fastabend Date: Tue Nov 16 06:31:39 2010 +0000 net: zero kobject in rx_queue_release netif_set_real_num_rx_queues() can decrement and increment the number of rx queues. For example ixgbe does this as features and offloads are toggled. Presumably this could also happen across down/up on most devices if the available resources changed (cpu offlined). The kobject needs to be zero'd in this case so that the state is not preserved across kobject_put()/kobject_init_and_add(). This resolves the following error report. ixgbe 0000:03:00.0: eth2: NIC Link is Up 10 Gbps, Flow Control: RX/TX kobject (ffff880324b83210): tried to init an initialized object, something is seriously wrong. Pid: 1972, comm: lldpad Not tainted 2.6.37-rc18021qaz+ #169 Call Trace: [] kobject_init+0x3a/0x83 [] kobject_init_and_add+0x23/0x57 [] ? mark_lock+0x21/0x267 [] net_rx_queue_update_kobjects+0x63/0xc6 [] netif_set_real_num_rx_queues+0x5f/0x78 [] ixgbe_set_num_queues+0x1c6/0x1ca [ixgbe] [] ixgbe_init_interrupt_scheme+0x1e/0x79c [ixgbe] [] ixgbe_dcbnl_set_state+0x167/0x189 [ixgbe] Signed-off-by: John Fastabend Signed-off-by: David S. Miller commit 5811662b15db018c740c57d037523683fd3e6123 Author: Changli Gao Date: Fri Nov 12 18:43:55 2010 +0000 net: use the macros defined for the members of flowi Use the macros defined for the members of flowi to clean the code up. Signed-off-by: Changli Gao Signed-off-by: David S. Miller commit dd68ad2235b4625e0dc928b2b4c614d265f976d3 Author: Philippe De Muyter Date: Sat Nov 13 08:43:29 2010 +0000 net: more Kconfig whitespace cleanup indentation for TSI108_ETH entry was too big. Signed-off-by: Philippe De Muyter Signed-off-by: David S. Miller commit b1323c8fa153f63e20d5a7fc0be72073c3beb05b Author: Joe Perches Date: Fri Nov 12 11:37:59 2010 +0000 drivers/net/can/sja1000: Use printf extension %pR for struct resource Using %pR standardizes the struct resource output. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit d8ee707114bc3615fd7be90eb942eba2dbe668ed Author: Joe Perches Date: Mon Nov 15 10:13:58 2010 +0000 drivers/net/vxge/vxge-main.c: Remove unnecessary casts of pci_get_drvdata Signed-off-by: Joe Perches Acked-by: Jon Mason Signed-off-by: David S. Miller commit a31ff3880578c37fd5c71ee863c23897dacfa9f8 Author: Joe Perches Date: Mon Nov 15 10:13:57 2010 +0000 drivers/net/s2io.c: Remove unnecessary casts of pci_get_drvdata Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 73e1cc4a4a02cfd2d520355de56ce1dafa11dd59 Author: Yong Wang Date: Wed Nov 17 21:02:13 2010 +0800 staging: spectra: fix build error blk_queue_ordered() has been deprecated and replaced with blk_queue_flush() by Tejun. However, use of blk_queue_ordered() in spectra nand driver has not been converted yet and thus results in the following build error. drivers/staging/spectra/ffsport.c: In function SBD_setup_device: drivers/staging/spectra/ffsport.c:659: error: implicit declaration of function blk_queue_ordered drivers/staging/spectra/ffsport.c:659: error: QUEUE_ORDERED_DRAIN_FLUSH undeclared (first use in this function) drivers/staging/spectra/ffsport.c:659: error: (Each undeclared identifier is reported only once drivers/staging/spectra/ffsport.c:659: error: for each function it appears in.) Signed-off-by: Yong Wang Cc: Tejun Heo Signed-off-by: Greg Kroah-Hartman commit 802aa9c058f2046f0a5683f04d7755c362734010 Author: Anirban Chakraborty Date: Tue Nov 16 14:09:06 2010 +0000 qlcnic: Bumped up driver version to 5.0.12 Signed-off-by: Anirban Chakraborty Signed-off-by: David S. Miller commit 706f23ada68746ed475488e7d2e2ca392fc4f731 Author: Sony Chacko Date: Tue Nov 16 14:08:46 2010 +0000 qlcnic: lro off message log from set rx checsum Log LRO off message while disabling rx checksum only when LRO is already enabled. Signed-off-by: Sony Chacko Signed-off-by: Anirban Chakraborty Signed-off-by: David S. Miller commit 2679a135e6452359cd807754617db0d05ad404e5 Author: Sritej Velaga Date: Tue Nov 16 14:08:23 2010 +0000 qlcnic: Add description for CN1000Q adapter Add description for CN1000Q adapter Signed-off-by: Sritej Velaga Signed-off-by: Anirban Chakraborty Signed-off-by: David S. Miller commit c21fd48c22bd1a9c4a5286963086f246c782e47e Author: Rajesh Borundia Date: Tue Nov 16 14:08:06 2010 +0000 qlcnic: Fix for kdump In case of kdump environment the function may be in unknown state. Reset the function using PCI FLR before initializing it. Signed-off-by: Rajesh Borundia Signed-off-by: Anirban Chakraborty Signed-off-by: David S. Miller commit 2abea2f0a5ab161facd865356d2e59b23204414e Author: Sucheta Chakraborty Date: Tue Nov 16 14:07:53 2010 +0000 qlcnic: Allow minimum bandwidth of zero Allow minimum bandwidth to be set zero Signed-off-by: Sucheta Chakraborty Signed-off-by: Anirban Chakraborty Signed-off-by: David S. Miller commit b382b191ea9e9ccefc437433d23befe91f4a8925 Author: Thomas Graf Date: Tue Nov 16 04:33:57 2010 +0000 ipv6: AF_INET6 link address family IPv6 already exposes some address family data via netlink in the IFLA_PROTINFO attribute if RTM_GETLINK request is sent with the address family set to AF_INET6. We take over this format and reuse all the code. Signed-off-by: Thomas Graf Cc: YOSHIFUJI Hideaki Signed-off-by: David S. Miller commit 9f0f7272ac9506f4c8c05cc597b7e376b0b9f3e4 Author: Thomas Graf Date: Tue Nov 16 04:32:48 2010 +0000 ipv4: AF_INET link address family Implements the AF_INET link address family exposing the per device configuration settings via netlink using the attribute IFLA_INET_CONF. The format of IFLA_INET_CONF differs depending on the direction the attribute is sent. The attribute sent by the kernel consists of a u32 array, basically a 1:1 copy of in_device->cnf.data[]. The attribute expected by the kernel must consist of a sequence of nested u32 attributes, each representing a change request, e.g. [IFLA_INET_CONF] = { [IPV4_DEVCONF_FORWARDING] = 1, [IPV4_DEVCONF_NOXFRM] = 0, } libnl userspace API documentation and example available from: http://www.infradead.org/~tgr/libnl/doc-git/group__link__inet.html Signed-off-by: Thomas Graf Signed-off-by: David S. Miller commit ca7479ebbd9f7621646bf2792cb7143647f035bb Author: Thomas Graf Date: Tue Nov 16 04:31:20 2010 +0000 inet: Define IPV4_DEVCONF_MAX Define IPV4_DEVCONF_MAX to get rid of MAX - 1 notation. Signed-off-by: Thomas Graf Signed-off-by: David S. Miller commit f8ff182c716c6f11ca3061961f5722f26a14e101 Author: Thomas Graf Date: Tue Nov 16 04:30:14 2010 +0000 rtnetlink: Link address family API Each net_device contains address family specific data such as per device settings and statistics. We already expose this data via procfs/sysfs and partially netlink. The netlink method requires the requester to send one RTM_GETLINK request for each address family it wishes to receive data of and then merge this data itself. This patch implements a new API which combines all address family specific link data in a new netlink attribute IFLA_AF_SPEC. IFLA_AF_SPEC contains a sequence of nested attributes, one for each address family which in turn defines the structure of its own attribute. Example: [IFLA_AF_SPEC] = { [AF_INET] = { [IFLA_INET_CONF] = ..., }, [AF_INET6] = { [IFLA_INET6_FLAGS] = ..., [IFLA_INET6_CONF] = ..., } } The API also allows for address families to implement a function which parses the IFLA_AF_SPEC attribute sent by userspace to implement address family specific link options. Signed-off-by: Thomas Graf Signed-off-by: David S. Miller commit d67ef35fff67845c64d806c033cc7c569ccebfff Author: Jeremy Eder Date: Mon Nov 15 05:41:31 2010 +0000 clarify documentation for net.ipv4.igmp_max_memberships This patch helps clarify documentation for net.ipv4.igmp_max_memberships by providing a formula for calculating the maximum number of multicast groups that can be subscribed to, plus defining the theoretical limit. Signed-off-by: Jiri Pirko Signed-off-by: Jeremy Eder Signed-off-by: David S. Miller commit 9920239c90d5f6dadfb44325abf3568a5e3fd827 Author: Joe Perches Date: Wed Nov 10 18:54:58 2010 +0000 drivers/isdn/hisax: Add printf format/argument verification and fix fallout Add __attribute__((format... to several functins Make formats and arguments match. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 1f1aaf82825865a50cef0b4722607abb12aeee52 Author: Eric Paris Date: Tue Nov 16 11:52:57 2010 +0000 SELinux: return -ECONNREFUSED from ip_postroute to signal fatal error The SELinux netfilter hooks just return NF_DROP if they drop a packet. We want to signal that a drop in this hook is a permanant fatal error and is not transient. If we do this the error will be passed back up the stack in some places and applications will get a faster interaction that something went wrong. Signed-off-by: Eric Paris Signed-off-by: David S. Miller commit ee58681195bf243bafc44ca53f3c24429d096cce Author: Eric Paris Date: Tue Nov 16 11:52:49 2010 +0000 network: tcp_connect should return certain errors up the stack The current tcp_connect code completely ignores errors from sending an skb. This makes sense in many situations (like -ENOBUFFS) but I want to be able to immediately fail connections if they are denied by the SELinux netfilter hook. Netfilter does not normally return ECONNREFUSED when it drops a packet so we respect that error code as a final and fatal error that can not be recovered. Based-on-patch-by: Patrick McHardy Signed-off-by: Eric Paris Signed-off-by: David S. Miller commit da6836500414ae734cd9873c2d553db594f831e9 Author: Eric Paris Date: Tue Nov 16 11:52:38 2010 +0000 netfilter: allow hooks to pass error code back up the stack SELinux would like to pass certain fatal errors back up the stack. This patch implements the generic netfilter support for this functionality. Based-on-patch-by: Patrick McHardy Signed-off-by: Eric Paris Signed-off-by: David S. Miller commit 37d668004289d202f71dc5bfdadf6c18b34577a2 Author: Joe Perches Date: Mon Nov 15 11:12:33 2010 +0000 net/atm: Remove unnecessary casts of netdev_priv Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit ece49153b601d95bcebd45a6394e370972f0b0a0 Author: Joe Perches Date: Mon Nov 15 11:12:31 2010 +0000 drivers/net: Remove unnecessary casts of netdev_priv Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 5f54cebb13cdb8dcd85036f8bee29f14db18b6e1 Author: Joe Perches Date: Mon Nov 15 11:12:30 2010 +0000 drivers/net/vxge: Remove unnecessary casts of netdev_priv Signed-off-by: Joe Perches Acked-by: Jon Mason Signed-off-by: David S. Miller commit 8739cfef1ab8bc02e1bf38c02399afe62f3a7800 Author: Joe Perches Date: Mon Nov 15 11:12:29 2010 +0000 drivers/net/usb: Remove unnecessary casts of netdev_priv Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit b16fed0af8416ee0fe9af6c1977f7b05e7e7c9b2 Author: Joe Perches Date: Mon Nov 15 11:12:28 2010 +0000 drivers/net/qlge: Remove unnecessary casts of netdev_priv Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 4dd151876b6b81040121708ebc23c6cd1a3d5be8 Author: Joe Perches Date: Mon Nov 15 11:12:27 2010 +0000 drivers/net/qla3xxx.c: Remove unnecessary casts of netdev_priv Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit a887e220760c12e00b0591d67987e26f6e270d71 Author: Joe Perches Date: Mon Nov 15 11:12:26 2010 +0000 drivers/net/pcmcia: Remove unnecessary casts of netdev_priv Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit c04914af6861d62df303aeedbbe554972ce4e736 Author: Joe Perches Date: Mon Nov 15 11:12:25 2010 +0000 drivers/net/bonding: Remove unnecessary casts of netdev_priv Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit a17531fa4c951f32ca4f90b04ca42cfb11924098 Author: Joe Perches Date: Mon Nov 15 11:12:24 2010 +0000 drivers/isdn/i4l: Remove unnecessary casts of netdev_priv Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 91921fef7c658b12de53376b312d071d757f7770 Author: David S. Miller Date: Wed Nov 17 10:22:56 2010 -0800 sparc: Do not export prom_nb{get,put}char(). Never used outside of console_{32,64}.c Signed-off-by: David S. Miller commit a1082bfe7d2d88d9626f5542dda9c0781394e91f Merge: 9d1e5e40d6cac4bf7008e04c202d71918455ca11 147b2c8cb4f3e16aafc87096365a913d01ee3a21 Author: David S. Miller Date: Wed Nov 17 09:56:04 2010 -0800 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/jkirsher/net-next-2.6 commit d3e1884bc585a43674d2cb0d3f0aeeb0ae43bc04 Author: Feng Tang Date: Wed Nov 17 12:11:24 2010 +0000 x86, mrst: Add explanation for using 1960 as the year offset for vrtc Explain the reason for the apparently odd choice of year offset so we don't get more questions about it. Signed-off-by: Feng Tang Signed-off-by: Alan Cox LKML-Reference: <20101117121050.9998.89348.stgit@localhost.localdomain> Signed-off-by: Thomas Gleixner commit ad02519a0d27da4a0a50cbc696e810c94e27c28e Author: Randy Dunlap Date: Mon Nov 15 10:14:06 2010 -0800 x86, mrst: Fix dependencies of "select INTEL_SCU_IPC" commit b9fc71f47 (x86, mrst: The shutdown for MRST requires the SCU IPC mechanism) introduced the following warning: warning: (X86_MRST && PCI && PCI_GOANY && X86_32 && X86_EXTENDED_PLATFORM && X86_IO_APIC) selects INTEL_SCU_IPC which has unmet direct dependencies (X86 && X86_PLATFORM_DEVICES && X86_MRST) which is due to the hierarchical menu structure. Select X86_PLATFORM_DEVICES as well. Originally-from: Randy Dunlap Signed-off-by: Thomas Gleixner LKML-Reference: <20101115101406.77e072ef.randy.dunlap@oracle.com> Cc: Alan Cox commit b9fc71f47dc060c588e5099638242fad44eeecbc Author: Alan Cox Date: Mon Nov 15 17:31:19 2010 +0000 x86, mrst: The shutdown for MRST requires the SCU IPC mechanism Fix the build failure reported by Randy. Reported-by: Randy Dunlap Signed-off-by: Alan Cox LKML-Reference: <20101115173110.6877.83958.stgit@localhost.localdomain> Signed-off-by: Thomas Gleixner commit 032a6424aeea7333a8dafc8cc05dd10b09c62680 Author: Dan Murphy Date: Mon Nov 15 09:50:50 2010 -0600 OMAP: mux: Add __func__ macro to pr_xxx macros Removed mux: and added the __func__ macro to make debugging easier. Signed-off-by: Dan Murphy Signed-off-by: Benoit Cousson Cc: Tony Lindgren commit fc63de829bbfa3945ffd6327bd3dc88f4e643642 Author: sricharan Date: Mon Nov 8 19:26:11 2010 +0530 OMAP4: pandaboard: Select CBL & CBS package and initialize mux The mux framework allows the change of pad configuration by drivers when needed. Prior to this the mux framework has to be initialised with all the mux parameters specific to the board. The mux init is already present in the board file for SDP. Adding the mux init for panda boards. Signed-off-by: sricharan Acked-by: Anand Gadiyar Signed-off-by: Benoit Cousson Cc: Santosh Shilimkar commit 6fea7b0a7ad9b79aca09df4c42773927db6934ed Author: Benoit Cousson Date: Mon Sep 27 10:50:33 2010 +0200 OMAP4: sdp4430: Select CBS package for ES2 Select the CBS package if SDP4430 is enabled during config. Use the proper package (CBL or CBS) based on chip revision. Signed-off-by: Benoit Cousson Cc: Tony Lindgren Cc: Paul Walmsley Cc: Santosh Shilimkar Cc: Anand Gadiyar commit a7722d8796c3431163943c30af7a90d87c43180a Author: Benoit Cousson Date: Fri Sep 24 16:56:59 2010 +0200 OMAP4: mux: Add CBS package data for OMAP4430 ES2 Please note that the full muxmodes are re-defined for ES2 instead of using the subset. There are 81 differences among 204 pins. The subset fixup will have to iterate over the whole list for each subset entry, which can lead to an important number of iteration. On the other hand, it will take much more memory at boot time. Signed-off-by: Benoit Cousson Cc: Tony Lindgren Cc: Paul Walmsley Cc: Santosh Shilimkar Cc: Anand Gadiyar commit fb6bf6320e33af5bd6ac788f27245f9162bc5215 Author: Benoit Cousson Date: Tue Aug 10 17:43:15 2010 +0200 OMAP4: sdp4430: Select CBL package for ES1 and initialize mux Select the CBL package if SDP4430 is enabled during config. Initialize the mux framework during the board init. Signed-off-by: Benoit Cousson Cc: Tony Lindgren Cc: Paul Walmsley Cc: Kevin Hilman commit a041a52c4d2b82e25de2267bce5f4dc3d2179b2a Author: Benoit Cousson Date: Tue Aug 10 17:27:48 2010 +0200 OMAP4: mux: Add CBL package data for OMAP4430 ES1 Add data for OMAP4430 generated from HW pinout & register database. The data set is split in two partitions for both core and wkup. Signed-off-by: Benoit Cousson Cc: Tony Lindgren Cc: Paul Walmsley Cc: Kevin Hilman commit 112485e9c543b17fc08daea56c7a558b415d06af Author: Benoit Cousson Date: Mon Aug 16 10:55:35 2010 +0200 OMAP: mux: Add support for control module split in several partitions Starting on OMAP4, the pin mux configuration is located in two different partitions of the control module (CODE_PAD and WKUP_PAD). The first one is inside the core power domain whereas the second one is inside the wakeup. - Add the capability to add any number of partition during board init time depending of Soc partitioning. - Add some init flags as well in order to avoid explicit Soc version check inside the mux core code. - Add a comment with mux0 mode on top of omap_mux/board/ if the current mux mode is not the default one. Thanks to Tony Lindgren for the following improvements: - Add omap_mux_get for getting the partition data so platform level device code can use it. - Fix the rx51 board code to use the new API. - Do not store the partition for each mux entry. Look up the partition for debugfs instead. Thanks to Dan Murphy for testing on OMAP4 and reporting a couple of bugs. Thanks to Anand Gadiyar for testing on OMAP3 zoom and bug report. Signed-off-by: Benoit Cousson Signed-off-by: Tony Lindgren Tested-by: Murphy Dan Cc: Paul Walmsley Cc: Kevin Hilman Cc: Santosh Shilimkar Cc: Anand Gadiyar commit 1cbb3a9a132969ed1ffeaecff2f910619d4470ae Author: Benoit Cousson Date: Tue Aug 10 17:33:01 2010 +0200 OMAP: mux: Replace printk with pr_xxx macros Replace all the printk(KERN_XXX... with pr_xxx macros. Signed-off-by: Benoit Cousson Cc: Tony Lindgren Cc: Paul Walmsley Cc: Kevin Hilman commit 194ee8e89cc02d8bea8a0b837271f79ca0c72873 Author: Uwe Kleine-König Date: Thu Nov 11 15:32:21 2010 +0100 ARM: mx25: dynamically allocatate imx-fb devices Signed-off-by: Uwe Kleine-König commit e7c74b343091e0c6b7bb67c12f9f7fb345aa6a50 Author: Uwe Kleine-König Date: Thu Nov 11 11:57:21 2010 +0100 ARM: mx25: dynamically allocate imxdi_rtc devices Signed-off-by: Uwe Kleine-König commit ab9cee4b2167f8bf01d85b537df5b9cbe342c780 Author: Uwe Kleine-König Date: Thu Nov 11 11:35:33 2010 +0100 ARM: mx25: dynamically allocate imx-keypad devices The mxc-keypad device seems to be the result of an early and partial merge of the keypad driver. It's unused and there is no corresponding driver available, so just remove it. Cc: Alberto Panizzo Signed-off-by: Uwe Kleine-König commit d485c7e71675abdd6133128e596b41284c2ee7b5 Author: Uwe Kleine-König Date: Thu Nov 11 10:52:33 2010 +0100 ARM: mx25: move registration of gpios to plat-mxc/gpio.c To use common macros to define the gpio ports for imx{1,21,25,27} the existing ones had to made more general and a few more base address defines were necessary. Signed-off-by: Uwe Kleine-König commit 5f3d1092a949b33d01c95b7f5e5a83672629f131 Author: Uwe Kleine-König Date: Wed Nov 10 22:15:45 2010 +0100 ARM: mx25: dynamically allocate mxc_pwm devices Signed-off-by: Uwe Kleine-König commit 224b8c83641c2f31e3efc9bc5956636cc42cadf7 Author: Uwe Kleine-König Date: Wed Nov 10 21:50:07 2010 +0100 ARM: mx25: dynamically allocate fsl-usb2-udc devices Signed-off-by: Uwe Kleine-König commit 2c20b9f19add2248dc867f1f78dcef1eb0944543 Author: Uwe Kleine-König Date: Wed Nov 10 21:27:55 2010 +0100 ARM: mx25: dynamically allocate mxc-ehci devices According to the reference manual of the i.MX25 the host controller uses an offset of 0x200 not 0x400 as was specified in the resources for mxc_usbh2. Needs-Testing: yes Signed-off-by: Uwe Kleine-König commit e9f0bafb4f3d32d0bc0ea7e946d667a68bae59ce Author: Uwe Kleine-König Date: Wed Nov 10 10:51:38 2010 +0100 ARM: imx: move registration of gpios to plat-mxc/gpio.c This finally gets rid of mach-imx/devices.c. Signed-off-by: Uwe Kleine-König commit 3a6f52a79fc0ce1c8b950c628bcf101f8652e957 Author: Uwe Kleine-König Date: Wed Nov 10 10:22:02 2010 +0100 ARM: imx: remove now empty devices.h Signed-off-by: Uwe Kleine-König commit 9f871469893a6d87c6cddf412f82ebf588fd4eca Author: Uwe Kleine-König Date: Wed Nov 10 10:11:23 2010 +0100 ARM: imx: dynamically allocate imx21-hcd devices Signed-off-by: Uwe Kleine-König commit 3f880141b8d12cdbb5faf0b9941ee50ac515ea1e Author: Uwe Kleine-König Date: Wed Nov 10 09:58:56 2010 +0100 ARM: imx: dynamically allocate imx-keypad devices Signed-off-by: Uwe Kleine-König commit bd455ed36c487b949068182bfee478b785ee090b Author: Uwe Kleine-König Date: Tue Nov 9 17:52:14 2010 +0100 ARM: imx: dynamically allocate fsl-usb2-udc devices Signed-off-by: Uwe Kleine-König commit 2eb42d5c287f5e883a4b3ebe668ba880caa351e5 Author: Uwe Kleine-König Date: Fri Nov 5 18:52:09 2010 +0100 ARM: imx: dynamically allocate mxc-ehci devices Signed-off-by: Uwe Kleine-König commit 9d3d945a8d5be2c915f646e8dff8422486a77030 Author: Uwe Kleine-König Date: Fri Nov 5 17:26:09 2010 +0100 ARM: imx: dynamically register mxc-mmc devices ... plus a trivial simplification of mx21ads_sdhc_init() Signed-off-by: Uwe Kleine-König commit c194daad0e0de94ed5e03aa723eb56b4a3ae9738 Author: Alberto Panizzo Date: Mon Nov 1 18:00:03 2010 +0100 ARM: mx3/mach-pcm037_eet: Fix section mismatch for eet_init_devices() This function should be marked as __init because it is used only in the init phase. This fix the compiler warning: LD arch/arm/mach-mx3/built-in.o WARNING: arch/arm/mach-mx3/built-in.o(.text+0x1328): Section mismatch in reference from the function eet_init_devices() to the (unknown reference) .init.rodata:(unknown) The function eet_init_devices() references the (unknown reference) __initconst (unknown). This is often because eet_init_devices lacks a __initconst annotation or the annotation of (unknown) is wrong. Signed-off-by: Alberto Panizzo Signed-off-by: Uwe Kleine-König commit bf182bcc6e726cce2f02b699bd0fba787734554f Author: Uwe Kleine-König Date: Fri Nov 5 15:01:16 2010 +0100 ARM: imx: dynamically allocate mxc_pwm devices Signed-off-by: Uwe Kleine-König commit c06246576a6e71b72ecc6b4b39a5c8eaf45dc2ed Author: Uwe Kleine-König Date: Fri Nov 5 11:22:37 2010 +0100 ARM: mx3: enable SPI_IMX for better compile coverage SPI_IMX defaults to m for i.MX machines. So enabling SPI is enough. Signed-off-by: Uwe Kleine-König commit ad851bffba6afd6468f96a6180cc4a14e9ebee38 Author: Uwe Kleine-König Date: Thu Nov 4 17:07:48 2010 +0100 ARM: imx: dynamically register imx-fb devices Signed-off-by: Uwe Kleine-König commit fc40d0191943fa995f5359b5c23aa7c3dea69d7b Author: Uwe Kleine-König Date: Thu Nov 4 12:02:35 2010 +0100 ARM: imx: change the way flexcan devices are registered Group soc specific data in a global struct instead of repeating it for each call to imxXX_add_flexcanX. The structs holding the actual data are placed in .init.constdata and so don't do much harm. Compared to the previous approach this reduces code size to call imx_add_flexcan. Signed-off-by: Uwe Kleine-König commit e0a1961df8ad898b661cf0adcf3519254f135a44 Author: Uwe Kleine-König Date: Thu Nov 4 10:09:10 2010 +0100 ARM: imx: dynamically allocate imx2-wdt devices Currently there is no platform data used in the driver. In case this changes and for consistency NULL is passed unused to the soc specific functions. Signed-off-by: Uwe Kleine-König commit b2997cb12b302ee6d233808e32214d00afdcf128 Author: Uwe Kleine-König Date: Tue Nov 2 17:50:55 2010 +0100 ARM: imx: dynamically allocate mx2-camera device Signed-off-by: Uwe Kleine-König commit 3bde75b5370bd69fd7f07a8e254bef05b1b5b219 Author: Uwe Kleine-König Date: Tue Nov 2 16:42:27 2010 +0100 ARM: imx/gpio: remove some useless casts Signed-off-by: Uwe Kleine-König commit 9bb39b3f600101b09cbb35e0a0deb9d56c4fe67f Author: Uwe Kleine-König Date: Tue Nov 2 11:59:08 2010 +0100 ARM: imx: dynamically allocate mx1-camera device Signed-off-by: Uwe Kleine-König commit 6332c1071811a1d588cfc93330d87a57a7460a1b Author: Uwe Kleine-König Date: Tue Nov 2 11:56:54 2010 +0100 ARM: imx: allow specifying a dma mask when creating a platform device Signed-off-by: Uwe Kleine-König commit e08300043ee4e2df10be551b76e126d6c02f26cc Author: Uwe Kleine-König Date: Tue Nov 2 10:03:51 2010 +0100 ARM: imx: dynamically allocate imx_udc device This is only available for mx1 machines with no in-tree user. Signed-off-by: Uwe Kleine-König commit 300f86da1787c680598ea441aaa602a1664fba86 Author: Uwe Kleine-König Date: Fri Oct 29 11:50:36 2010 +0200 ARM: imx: remove unused devices all these don't have a driver and are not added in any machine file. Signed-off-by: Uwe Kleine-König commit ae71a5622253708aa08df231e6415fe7a1e96b10 Author: Uwe Kleine-König Date: Fri Oct 29 10:56:07 2010 +0200 ARM: imx: dynamically allocate mxc_w1 devices Currently there is no platform data used in the driver. In case this changes NULL is passed unused to the soc specific functions. Signed-off-by: Uwe Kleine-König commit d96801b2ca47cfeddadede7a1998e1fe0eab095c Author: Uwe Kleine-König Date: Fri Oct 22 09:20:52 2010 +0200 ARM: imx: remove deprecated symbols as all users are gone now Signed-off-by: Uwe Kleine-König commit ac401427c05a6a371950a1cdfaec75f72bffb9b5 Author: Uwe Kleine-König Date: Tue Oct 26 09:42:54 2010 +0200 ARM: imx/debug-macro: rework using the new io mapping macro This gets rid of the last user of IMX_NEEDS_DEPRECATED_SYMBOLS. Signed-off-by: Uwe Kleine-König commit a99631489bbd1b4647b82d0822b6a3942e2dd731 Author: Uwe Kleine-König Date: Mon Oct 25 15:44:25 2010 +0200 ARM: imx: change static io mapping to use a function Now only the virtual addresses [0xf4000000, 0xf5ffffff] are used for static per-SoC mappings. The few mappings of whole chip selects are moved accordingly. The now wrong defines for virtual base addresses are removed. Signed-off-by: Uwe Kleine-König commit cf3a6aba2f8402d4e45f7f263a0e69f779cd1bdc Author: Uwe Kleine-König Date: Mon Oct 25 15:54:58 2010 +0200 ARM: imx: remove last explicit users of virtual base address defines This allows changing the mapping without the need to adapt all users. While at it remove some unneeded casts to void __iomem *, this is already taken care for in the IO_ADDRESS macros Signed-off-by: Uwe Kleine-König commit 08ff97b5214143c3bd47add6ec49097cb848120a Author: Uwe Kleine-König Date: Mon Oct 25 15:38:09 2010 +0200 ARM: imx: use MXxy_IO_P2V macros to setup static mappings This makes less code rely on the virtual constants. To further simplify code and reduce the needed boilerplate when defining the static mappings a new helper macro is defined in mach/hardware.h. Signed-off-by: Uwe Kleine-König commit f5d7a13b18706c3328c6aac3bf782a13cabf255a Author: Uwe Kleine-König Date: Mon Oct 25 11:40:30 2010 +0200 ARM: imx: refactor the io mapping macro This makes it more assembler friendly and allows it to be used in situation that need an unsigned long and not a pointer. Also the naming is clearer. IOMEM is introduced without IMX_ prefix as it is used this way in more than one ARM subarch and it might become globally available soon. Signed-off-by: Uwe Kleine-König commit 9651b7db59893e796dfdd170485543b9863be9d8 Author: Uwe Kleine-König Date: Fri Oct 22 14:49:45 2010 +0200 ARM: mx3: fix the last users of IMX_NEEDS_DEPRECATED_SYMBOLS Signed-off-by: Uwe Kleine-König commit 147b2c8cb4f3e16aafc87096365a913d01ee3a21 Author: Dongdong Deng Date: Tue Nov 16 19:50:15 2010 -0800 e1000e: add netpoll support for MSI/MSI-X IRQ modes With enabling CONFIG_PCI_MSI, e1000e could work in MSI/MSI-X IRQ mode, and netpoll controller didn't deal with those IRQ modes on e1000e. This patch add the handling MSI/MSI-X IRQ modes to netpoll controller, so that netconsole could work with those IRQ modes. Signed-off-by: Dongdong Deng Signed-off-by: Jeff Kirsher commit 1b98c2bb63a4b415d8d894d001b6d0256409e0d9 Author: Bruce Allan Date: Tue Nov 16 19:50:14 2010 -0800 e1000e: 82574 intermittently fails to initialize with manageability f/w The driver can fail initializing the hardware when manageability firmware is performing concurrent MDIO operations because the hardware semaphore scheme to prevent concurrent operations between software and firmware is incorrect for 82574/82583. Instead of using the SWSM register, the driver should be using the EXTCNF_CTRL register. A software mutex is also added to prevent simultaneous software threads from performing similar concurrent accesses. Signed-off-by: Bruce Allan Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit d478eb44f7a6b53256ae399fa7e597525b4034ee Author: Bruce Allan Date: Tue Nov 16 19:50:13 2010 -0800 e1000e: 82571 SerDes link handle null code word from partner SerDes Link detection on certain 82571 mezzanine cards can fail when the link is forced, the link partner does not recognize forced link and the link partner sends null code words. Detect the null code words and return to auto-negotiation state which causes the link partner to begin responding with valid code words. Within a reasonable interval the link will finally settle as forced by both partners. Signed-off-by: Bruce Allan Signed-off-by: Jeff Kirsher commit b1d670f10e8078485884f0cf7e384d890909aeaa Author: Greg Rose Date: Tue Nov 16 19:41:36 2010 -0800 Remove extra struct page member from the buffer info structure declaration. Reported-by: Andi Kleen Signed-off-by: Greg Rose Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit eca2a33c985eb19dd0ca4b37d66c7fb5d8b76308 Author: Julian Stecklina Date: Tue Nov 16 19:41:36 2010 -0800 igbvf: Remove some dead code in igbvf Removed unused variable in igbvf. Signed-off-by: Julian Stecklina Acked-by: Greg Rose Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit 2c20ebbaed7f3f21506629ee931941a9bba199ab Author: Greg Rose Date: Tue Nov 16 19:41:35 2010 -0800 igbvf: Update version and Copyright Update version string and copyright notice Signed-off-by: Greg Rose Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit 5d426ad1af31ac27d7c2222f20eec9d0a8aeac42 Author: Greg Rose Date: Tue Nov 16 19:27:19 2010 -0800 ixgbevf: Fix Oops The driver is calling netif_carrier_off and netif_tx_stop_all_queues before the netdevice is registered which causes an Oops. Move call to netif_carrier_off after the netdevice is registered and remove call to netif_tx_stop_all_queues because there aren't any TX queues yet. Signed-off-by: Greg Rose Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit e2ddeba95c09d0d44719ff005e915dc06ff46571 Author: Eric Dumazet Date: Tue Nov 16 19:27:18 2010 -0800 ixgbe: refactor ixgbe_alloc_queues() I noticed ring variable was initialized before allocations, and that memory node management was a bit ugly. We also leak memory in case of ring allocations error. Signed-off-by: Eric Dumazet Signed-off-by: Jeff Kirsher commit b93a22260f6f4bcf6c92c54de8530a97d3e921f0 Author: Don Skidmore Date: Tue Nov 16 19:27:17 2010 -0800 ixgbe: add support for x540 MAC This patch adds support for the x540 MAC which is the next MAC in the 82598/82599 line. Signed-off-by: Don Skidmore Signed-off-by: Jeff Kirsher commit fe15e8e1c78521e0b4e375d6ed415b82265419c9 Author: Don Skidmore Date: Tue Nov 16 19:27:16 2010 -0800 ixgbe: add MAC and PHY support for x540 Adds the new x540.c file and Aquantia 1202 PHY for X540 support. Signed-off-by: Don Skidmore Tested-by: Stephen Ko Signed-off-by: Jeff Kirsher commit a391f1d51244b8274920a33c5d11aeebec3aa68f Author: Don Skidmore Date: Tue Nov 16 19:27:15 2010 -0800 ixgbe: make silicon specific functions generic The new MAC type X540 shares much of the same functionality of some silicon specific functions. To reduce duplicate code, made these functions generic. Signed-off-by: Don Skidmore Tested-by: Stephen Ko Signed-off-by: Jeff Kirsher commit 9b55bb038468a7b504ccdc1d956952598ae1b85b Author: Yi Zou Date: Tue Nov 16 19:27:14 2010 -0800 ixgbe: make sure FCoE DDP user buffers are really released by the HW When invalidating the DDP context is invalidated, the HW may not be done with the user buffer right away. In which case, we poll the FCBUFF register to check if the buffer valid bit is cleared or not, if not, we wait for max 100us that is guaranteed by the HW. Signed-off-by: Yi Zou Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 8ca371e484e2e5ceb9b90fdb83d8d251017d852b Author: Yi Zou Date: Tue Nov 16 19:27:13 2010 -0800 ixgbe: invalidate FCoE DDP context when no error status is available The hw automatically invalidates the context if DDP is successful or there is error detected. In case there is no error status available from the hw, initializing the per context error status to be 1 allows the DDP context to be still invalidated via the upper layer call to ddp_put(). Signed-off-by: Yi Zou Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit a41c059741570779c0254a3a1aa4da3baa463d7c Author: Yi Zou Date: Tue Nov 16 19:27:13 2010 -0800 ixgbe: avoid doing FCoE DDP when adapter is DOWN or RESETTING There is no point to allow incoming DDP requests from the upper layer stack if the adapter is going down or being reset. Signed-off-by: Yi Zou Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit c84d324c770dc81acebc1042163da33c8ded2364 Author: John Fastabend Date: Tue Nov 16 19:27:12 2010 -0800 ixgbe: rework Tx hang detection to fix reoccurring false Tx hangs The Tx hang logic has been known to detect false hangs when the device is receiving pause frames or has delayed processing for some other reason. This patch makes the logic more robust and resolves these known issues. The old logic checked to see if the device was paused by querying the HW then the hang logic was aborted if the device was currently paused. This check was racy because the device could have been in the pause state any time up to this check. The other operation of the hang logic is to verify the Tx ring is still advancing the old logic checked the EOP timestamp. This is not sufficient to determine the ring is not advancing but only infers that it may be moving slowly. Here we add logic to track the number of completed Tx descriptors and use the adapter stats to check if any pause frames have been received since the previous Tx hang check. This way we avoid racing with the HW register and do not detect false hangs if the ring is advancing slowly. This patch is primarily the work of Jesse Brandeburg. I clean it up some and fixed the PFC checking. Signed-off-by: John Fastabend Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit e3de4b7bdfd2c06884c95cfb4ad4d64be046595e Author: Alexander Duyck Date: Tue Nov 16 19:27:11 2010 -0800 ixgbe: Resolve null function pointer accesses on 82598 w/ multi-speed fiber This change resolves some null function pointer accesses on 82598 when a multi-speed fiber module is inserted into the adapter. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 2274543f15133165b855b9a4a1503b2c1268c6cf Author: Alexander Duyck Date: Tue Nov 16 19:27:10 2010 -0800 ixgbe: populate the ring->q_vector pointer during ring mapping The q_vector back pointer was not being set in the rings so it would not have been possible to determine the parent q_vector of the ring. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit d0759ebb051972f8557a19aa13cf02fc314856e9 Author: Alexander Duyck Date: Tue Nov 16 19:27:09 2010 -0800 ixgbe: cleanup ixgbe_map_rings_to_vectors This change cleans up some of the items in ixgbe_map_rings_to_vectors. Specifically it merges the two for loops and drops the unnecessary vectors parameter. It also moves the vector names into the q_vectors themselves. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 125601bf03a13e24d3785ccbc3a25ad401c92772 Author: Alexander Duyck Date: Tue Nov 16 19:27:08 2010 -0800 ixgbe: simplify math and improve stack use of ixgbe_set_itr functions This change is meant to improve the stack utilization and simplify the math used in ixgbe_set_itr_msix. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit bf29ee6c4819a86ba0209281550b230889b8ebe6 Author: Alexander Duyck Date: Tue Nov 16 19:27:07 2010 -0800 ixgbe: cleanup unclear references to reg_idx There are a number of places where we use the variable j to contain the register index of the ring. Instead of using such a non-descriptive variable name it is better that we name it reg_idx so that it is clear what the variable contains. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 9d6b758f428d2ad9ca4208d5c4d4cdbd4261b0d8 Author: Alexander Duyck Date: Tue Nov 16 19:27:06 2010 -0800 ixgbe: cleanup unnecessary return value in ixgbe_cache_ring_rss This change is just to cleanup some confusing logic in ixgbe_cache_ring_rss which can be simplified by adding a conditional with return to the start of the call. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 673ac60461082e07be58b23f237d651c2605ce60 Author: Alexander Duyck Date: Tue Nov 16 19:27:05 2010 -0800 ixgbe: Cleanup DCB logic, whitespace, and comments in ixgbe_ethtool.c This change address a few whitespace issues in DCB #ifdefs, adds a comment calling out the DCB specific registers, and nests an if statement inline with a number of if statements related to flow control. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 50d6c681d0c38208e494f0c6302ef13d21dababa Author: Alexander Duyck Date: Tue Nov 16 19:27:05 2010 -0800 ixgbe: add WOL support for backplane adapters This change adds support for certain 82599 based Mezzanine adapters. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit e2b4e216b7e9da09175c76887c754489681533b9 Author: Alexander Duyck Date: Tue Nov 16 19:27:04 2010 -0800 ixgbe: cleanup ixgbe_set_tx_csum ethtool flags configuration This change makes it so that we always disable SCTP regardless of mac type since we shouldn't need to check mac type before disabling a feature that isn't supported on a given piece of hardware. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit bd50817859e7e82ba6e4adc75ebd8ac19459d8a4 Author: Alexander Duyck Date: Tue Nov 16 19:27:03 2010 -0800 ixgbe: change mac_type if statements to switch statements This change replaces a number of if/elseif/else statements with switch statements to support the addition of future devices to the ixgbe driver. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit aa80175a539a47fd11e2fbf1696a29f7a2652930 Author: Alexander Duyck Date: Tue Nov 16 19:27:02 2010 -0800 ixgbe: cleanup use of ixgbe_rsc_count and RSC_CB This change cleans up the use of rsc_count and changes it to a boolean since the actual numerical value is used nowhere in the Rx cleanup path. I am also moving the skb count into the RSC_CB path since it is much easier to track it there than when it is passed as a parameter to various function calls. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit ee9e0f0b40c4fb4ad71d677c094d518db42f7076 Author: Alexander Duyck Date: Tue Nov 16 19:27:01 2010 -0800 ixgbe: cleanup ATR filter setup function This change cleans up the ixgbe_atr filter setup function so that it uses fewer items from the stack. Since the code is only applicable to IPv4 w/ TCP it makes sense to just use the pointers based on the headers themselves instead of copying them to temp variables and then writing those to the filters. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit c267fc166a3308c45c7f0ad2ddd6fc696caaeb80 Author: Alexander Duyck Date: Tue Nov 16 19:27:00 2010 -0800 ixgbe: cleanup ixgbe_clean_rx_irq The code for ixgbe_clean_rx_irq was much more tangled up than it needed to be in terms of logic statements and unused variables. This change untangles much of that and drops several unused variables such as cleaned which was being returned but never checked. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 32aa77a4fc06bd1116f83c25bf0389a3e9b80533 Author: Alexander Duyck Date: Tue Nov 16 19:26:59 2010 -0800 ixgbe: change vector numbering so that queues end up on correct CPUs This changes the numbering scheme slightly. Previously the ordering was coming out like this: Rx-2 Rx-1 Rx-0 TxRx-0 Which would drop two queues on CPU 0. This change makes it so that the ordering is like this: Rx-3 Rx-2 Rx-1 TxRx-0 This means that each CPU will have it's own Rx queue, and only CPU 0 will have the Tx queue. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit b953799ee29075afd30afe4c0fb65f278b088f69 Author: Alexander Duyck Date: Tue Nov 16 19:26:58 2010 -0800 ixgbe: reorder Tx cleanup so that if adapter will reset we don't rearm The code as it existed could re-arm the queues when it was requesting a HW reset due to a TX hang. Instead of doing that this change makes it so that we will just exit if the hardware is believed to be hung. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 80fba3f4341b1c98430bee620b507d3f5b7086cd Author: Alexander Duyck Date: Tue Nov 16 19:26:57 2010 -0800 ixgbe: Disable RSC when ITR setting is too high to allow RSC RSC will flush its descriptors every time the interrupt throttle timer expires. In addition there are known issues with RSC when the rx-usecs value is set too low. As such we are forced to clear the RSC_ENABLED bit and reset the adapter when the rx-usecs value is set too low. However we do not need to clear the NETIF_F_LRO flag because it is used to indicate that the user wants to leave the LRO feature enabled, and in fact with this change we will now re-enable RSC as soon as the rx-usecs value is increased and the flag is still set. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 73c4b7cdd25a8a769baf6dae5bc498400a9ddd93 Author: Alexander Duyck Date: Tue Nov 16 19:26:57 2010 -0800 ixgbe: cleanup race conditions in link setup This change makes it so that we perform link setup with interrupts disabled. If the SFP has not been detected previously we will schedule the SFP detection task to run in order to detect link. By doing this we avoid the possibility of interrupts firing in the middle of our link setup during ixgbe_up_complete. In addition this change makes it so that the multi-speed fiber setup and SFP setup are not mutually exclusive. The addresses issues seen in which a link would only come up at 1G on some multi-speed fiber modules. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 7d637bcc8f461f19e1d018078792ec0cd9b07b1d Author: Alexander Duyck Date: Tue Nov 16 19:26:56 2010 -0800 ixgbe: add a state flags to ring This change adds a set of state flags to the rings that allow them to independently function allowing for features like RSC, packet split, and TX hang detection to be done per ring instead of for the entire device. This is accomplished by re-purposing the flow director reinit_state member and making it a global state instead since a long for a single bit flag is a bit wasteful. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 33cf09c9586a0dce472ecd2aac13e8140c9ed1a1 Author: Alexander Duyck Date: Tue Nov 16 19:26:55 2010 -0800 ixgbe: move CPU variable from ring into q_vector, add ring->q_vector This is the start of work to sort out what belongs in the rings and what belongs in the q_vector. Items like the CPU variable for make much more sense in the q_vector since the CPU is a per-interrupt thing rather than a per ring thing. I also added a back-pointer from the ring to the q_vector. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit c60fbb00f0400792adf873dbacd431885653b77d Author: Alexander Duyck Date: Tue Nov 16 19:26:54 2010 -0800 ixgbe: move adapter into pci_dev driver data instead of netdev This change moves an adapter pointer into the private portion of the pci_dev instead of a pointer to the netdev. The reason for this change is because in most cases we just want the adapter anyway. In addition as we start moving toward multiple netdevs per port we may want to move the adapter pointer out of the netdevs entirely. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 01fa7d905fe9a5b045615fbde19e6c0f78063206 Author: Alexander Duyck Date: Tue Nov 16 19:26:53 2010 -0800 ixgbe: remove residual code left over from earlier combining of TXDCTL Missed some code that was left floating around in the DCB configuration for the TXDCTL register. As a result the register was being messed with in two different spots when we only needed to do the change once. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 5f5ae6fc86083526088e2c2ca4454e0f44f1e0cb Author: Alexander Duyck Date: Tue Nov 16 19:26:52 2010 -0800 ixgbe: move ixgbe_clear_interrupt_scheme to before pci_save_state The main reason for this change is to keep the suspend/resume logic matched up. The clear_interrupt_scheme function will disable MSI-X which will effect the PCIe configuration space. Therefore we will want to do it before we save state to avoid having the interrupt state restored by pci_restore_state, and then trying to re-enable MSI/MSI-X interrupts via ixgbe_setup_interrupt_scheme. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit fc77dc3cc15144bbaf18203e9ef7a3e1beedfc3f Author: Alexander Duyck Date: Tue Nov 16 19:26:51 2010 -0800 ixgbe: add a netdev pointer to the ring structure This change places a netdev pointer directly into the ring structure. This way we can avoid having to determine which netdev we are supposed to be using and can just access the one on the ring directly. As a result of this change further collapse of the code is possible by dropping the adapter from ixgbe_alloc_rx_buffers, and the netdev pointer from ixgbe_xmit_frame_ring_adv and ixgbe_maybe_stop_tx. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 5b7da51547cc3ab5461e45a8ee0ca73051416fda Author: Alexander Duyck Date: Tue Nov 16 19:26:50 2010 -0800 ixgbe: combine some stats into a union to allow for Tx/Rx stats overlap This change moved some of the RX and TX stats into separate structures and them placed those structures in a union in order to help reduce the size of the ring structure. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit b6ec895ecd32c0070c3b2b17918c030275cd834d Author: Alexander Duyck Date: Tue Nov 16 19:26:49 2010 -0800 ixgbe: move device pointer into the ring structure This change is meant to simplify DMA map/unmap by providing a device pointer. As a result the adapter pointer can be dropped from many of the calls. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 84ea2591e4a24775c2735511a1cc3cf88edd249d Author: Alexander Duyck Date: Tue Nov 16 19:26:49 2010 -0800 ixgbe: drop ring->head, make ring->tail a pointer instead of offset This change drops ring->head since it is not used in any hot-path and can easily be determined using IXGBE_[RT]DH(ring->reg_idx). It also changes ring->tail into a true pointer so we can avoid unnecessary pointer math to find the location of the tail. In addition I also dropped the setting of head and tail in ixgbe_clean_[rx|tx]_ring. The only location that should be setting the head and tail values is ixgbe_configure_[rx|tx]_ring and that is only while the queue is disabled. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit d5f398ed73522b9f76861af6553775c5851de0d0 Author: Alexander Duyck Date: Tue Nov 16 19:26:48 2010 -0800 ixgbe: cleanup ixgbe_alloc_rx_buffers This change re-orders alloc_rx_buffers to make better use of the packet split enabled flag. The new setup should require less branching in the code since now we are down to fewer if statements since we either are handling packet split or aren't. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 8ad494b0e59950e2b4e587c32cb67a2452795ea0 Author: Alexander Duyck Date: Tue Nov 16 19:26:47 2010 -0800 ixgbe: move GSO segments and byte count processing into ixgbe_tx_map This change simplifies the work being done by the TX interrupt handler and pushes it into the tx_map call. This allows for fewer cache misses since the TX cleanup now accesses almost none of the skb members. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 4c0ec6544a0cd5e3eed08df2c14cf98185098abe Author: Alexander Duyck Date: Tue Nov 16 19:26:46 2010 -0800 ixgbe: remove unnecessary re-init of adapter on Rx-csum change There is no need to reset the adapter when changing the Rx checksum settings. Since the only change is a software flag we can disable it without needing to reset the entire adapter. Signed-off-by: Alexander Duyck Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 80ab193dce048e7b7afa43c99e69f508167e29ab Author: John Fastabend Date: Tue Nov 16 19:26:45 2010 -0800 ixgbe: DCB: credit max only needs to be gt TSO size for 82598 The maximum credits per traffic class only needs to be greater then the TSO size for 82598 devices. The 82599 devices do not have this requirement so only do this test for 82598 devices. Signed-off-by: John Fastabend Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 16b61beb39f2446460f93c08d4d263dc24f22dd8 Author: John Fastabend Date: Tue Nov 16 19:26:44 2010 -0800 ixgbe: DCB set PFC high and low water marks per data sheet specs Currently the high and low water marks for PFC are being set conservatively for jumbo frames. This means the RX buffers are being underutilized in the default 1500 MTU. This patch fixes this so that the water marks are set as described in the data sheet considering the MTU size. The equation used is, RTT * 1.44 + MTU * 1.44 + MTU Where RTT is the round trip time and MTU is the max frame size in KB. To avoid floating point arithmetic FC_HIGH_WATER is defined ((((RTT + MTU) * 144) + 99) / 100) + MTU This changes how the hardware field fc.low_water and fc.high_water are used. With this change they are no longer storing the actual low water and high water markers but are storing the required head room in the buffer. This simplifies the logic and we do not need to account for the size of the buffer when setting the thresholds. Testing with iperf and 16 threads showed a slight uptick in throughput over a single traffic class .1-.2Gbps and a reduction in pause frames. Without the patch a 30 second run would show ~10-15 pause frames being transmitted with the patch ~2-5 are seen. Test were run back to back with 82599. Note RXPBSIZE is in KB and low and high water marks fields are also in KB. However the FCRT* registers are 32B granularity and right shifted 5 into the register, (((rx_pbsize - water_mark) * 1024) / 32) << 5 is the most explicit conversion here we simplify (rx_pbsize - water_mark) * 32 << 5 = (rx_pbsize - water_mark) << 10 This patch updates the PFC thresholds and legacy FC thresholds. Signed-off-by: John Fastabend Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit 66c87bd50ddae681ebedfda0d75e6e73ecd29ce7 Author: Greg Rose Date: Tue Nov 16 19:26:43 2010 -0800 ixgbevf: Update Version String and Copyright Notice Update version string and copyright notice. Signed-off-by: Greg Rose Tested-by: Emil Tantilov Signed-off-by: Jeff Kirsher commit 1a51502bddca7ac1e921d918b741ffd2bec149ed Author: Eric Dumazet Date: Tue Nov 16 19:26:42 2010 -0800 ixgbe: delay rx_ring freeing "cat /proc/net/dev" uses RCU protection only. Its quite possible we call a driver get_stats() method while device is dismantling and freeing its data structures. So get_stats() methods must be very careful not accessing driver private data without appropriate locking. In ixgbe case, we access rx_ring pointers. These pointers are freed in ixgbe_clear_interrupt_scheme() and set to NULL, this can trigger NULL dereference in ixgbe_get_stats64() A possible fix is to use RCU locking in ixgbe_get_stats64() and defer rx_ring freeing after a grace period in ixgbe_clear_interrupt_scheme() Signed-off-by: Eric Dumazet Reported-by: Tantilov, Emil S Tested-by: Ross Brattain Signed-off-by: Jeff Kirsher commit c08512c761e7b9eaaab0e9167a389393f268e93c Author: Alan Stern Date: Mon Nov 15 15:57:58 2010 -0500 USB: improve uses of usb_mark_last_busy This patch (as1434) cleans up the uses of usb_mark_last_busy() in usbcore. The function will be called when a device is resumed and whenever a usage count is decremented. A call that was missing from the hub driver is added: A hub is used whenever one of its ports gets suspended (this prevents hubs from suspending immediately after their last child). In addition, the call to disable autosuspend support for new devices by default is moved from usb_detect_quirks() (where it doesn't really belong) into usb_new_device() along with all the other runtime-PM initializations. Finally, an extra pm_runtime_get_noresume() is added to prevent new devices from autosuspending while they are being registered. Signed-off-by: Alan Stern Signed-off-by: Greg Kroah-Hartman commit fcc4a01eb8661226e80632327673f67bf6a5840b Author: Alan Stern Date: Mon Nov 15 15:57:51 2010 -0500 USB: use the runtime-PM autosuspend implementation This patch (as1428) converts USB over to the new runtime-PM core autosuspend framework. One slightly awkward aspect of the conversion is that USB devices will now have two suspend-delay attributes: the old power/autosuspend file and the new power/autosuspend_delay_ms file. One expresses the delay time in seconds and the other in milliseconds, but otherwise they do the same thing. The old attribute can be deprecated and then removed eventually. Signed-off-by: Alan Stern Signed-off-by: Greg Kroah-Hartman commit 6ddf27cdbc218a412d7e993fdc08e30eec2042ce Author: Ming Lei Date: Mon Nov 15 15:57:30 2010 -0500 USB: make usb_mark_last_busy use pm_runtime_mark_last_busy Since the runtime-PM core already defines a .last_busy field in device.power, this patch uses it to replace the .last_busy field defined in usb_device and uses pm_runtime_mark_last_busy to implement usb_mark_last_busy. Signed-off-by: Ming Lei Reviewed-by: Alan Stern Signed-off-by: Greg Kroah-Hartman commit 045cac6b3b067a9286dabfb789f67ae4f433f88b Author: Alan Stern Date: Mon Nov 15 15:57:07 2010 -0500 USB: use sysfs_merge_group for power attributes This patch (as1426) makes use of the new sysfs_merge_group() and sysfs_unmerge_group() routines to simplify the handling of power attributes for USB devices. Signed-off-by: Alan Stern Signed-off-by: Greg Kroah-Hartman commit 63defa73c8c1193c1273474440c30d34c2524597 Author: Ming Lei Date: Mon Nov 15 15:56:54 2010 -0500 USB: use the no_callbacks flag for interfaces Call pm_runtime_no_callbacks to set no_callbacks flag for USB interfaces. Since interfaces cannot be power-managed separately from their parent devices, there's no reason for the runtime-PM core to invoke any callbacks for them. Signed-off-by: Ming Lei Reviewed-by: Alan Stern Signed-off-by: Greg Kroah-Hartman commit f646cf94520e22cb11eb5d2e9a35b33bfe4bea1b Author: Toshiharu Okada Date: Thu Nov 11 18:27:57 2010 +0900 USB device driver of Topcliff PCH This patch adds the USB device driver of EG20T(Topcliff) PCH. EG20T PCH is the platform controller hub that is going to be used in Intel's upcoming general embedded platform. All IO peripherals in EG20T PCH are actually devices sitting on AMBA bus. EG20T PCH has USB device I/F. Using this I/F, it is able to access system devices connected to USB device. Signed-off-by: Toshiharu Okada Acked-by: MichaÅ‚ Nazarewicz Signed-off-by: Greg Kroah-Hartman commit d8df0b611c66db3b7afd0678213979209616681a Author: Michal Nazarewicz Date: Fri Nov 12 14:29:29 2010 +0100 usb: gadget: f_fs: remove custom printk() wrappers This commit removes custom printk() wrappers from the f_fs.c file. They served little purpose above what pr_*() family of macros provides. Only FVDBG() has been left but renamed to pr_vdebug() to match other uses. Signed-off-by: Michal Nazarewicz Signed-off-by: Greg Kroah-Hartman commit 5ab54cf7acf418573c9204371cf1ab3497c451ee Author: Michal Nazarewicz Date: Fri Nov 12 14:29:28 2010 +0100 usb: gadget: FunctionFS: fix typos and coding style This commit changes FunctionFS as to make it more compliant with coding style as well as fixes several typos. Signed-off-by: Michal Nazarewicz Signed-off-by: Greg Kroah-Hartman commit 7189ba939ea0e74f73d7b30573b849c732835fc5 Author: Joe Perches Date: Fri Nov 12 13:38:02 2010 -0800 drivers/uwb: Use printf extension %pR for struct resource Using %pR standardizes the struct resource output. Signed-off-by: Joe Perches Signed-off-by: Greg Kroah-Hartman commit cc7e6056f440796e028629d6d79a26fa20d457e8 Author: Joe Perches Date: Sun Nov 14 19:04:49 2010 -0800 drivers/usb/gadget: Remove unnecessary semicolons Signed-off-by: Joe Perches Signed-off-by: Greg Kroah-Hartman commit ce7eb32fc24a7380f55924360fa0c96297aa237e Author: Joe Perches Date: Mon Nov 15 12:14:01 2010 -0800 drivers/usb/host/uhci-hcd.c: Remove unnecessary casts of pci_get_drvdata Signed-off-by: Joe Perches Acked-by: Alan Stern Signed-off-by: Greg Kroah-Hartman commit c8c38de9d8002578599222296b90696745ac0fe3 Author: Deepak Sikri Date: Wed Nov 10 14:33:18 2010 +0530 USB host: Adding USB ehci & ohci support for spear platform This patch adds support for ehci and ohci controller in the SPEAr platform. Changes since V2: added clear_tt_buffer_complete in ehci_spear_hc_driver Signed-off-by: Deepak Sikri Signed-off-by: Viresh Kumar Signed-off-by: Greg Kroah-Hartman commit 28d9cc7f21da6a70fc8c1516fa0ee5588572eb92 Author: Mohammed Shafi Shajakhan Date: Sat Nov 13 20:58:27 2010 +0530 ath9k_htc: Use macro for caldata array size The calibration data variable size is based on the number of channels available in the ath9k driver. Signed-off-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit ef1b21f7eb074a8c8ddfea70ed70e988545c8d54 Author: Stanislaw Gruszka Date: Fri Nov 12 08:47:07 2010 +0100 iwlwifi: kill elapsed_jiffies Subtract of jiffies is fine even if one variable overwrap. Signed-off-by: Stanislaw Gruszka Acked-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 70f3876f09ccf1f2819aee6caee9266b2c4b1622 Author: Stanislaw Gruszka Date: Fri Nov 12 08:47:06 2010 +0100 iwlagn: simplify iwlagn_tx_skb We can simplify length calculation in iwlagn_tx_skb, that function is enough complex, without fuzz it more than necessary. Signed-off-by: Stanislaw Gruszka Acked-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 2cb7865648e44647a976875428c9dfd9d5553221 Author: Stanislaw Gruszka Date: Fri Nov 12 08:47:05 2010 +0100 iwl3945: remove unused len_org variable Signed-off-by: Stanislaw Gruszka Acked-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 8f0729b16ae354f9db89394fc1d2d65003455d56 Author: Felix Fietkau Date: Thu Nov 11 15:07:23 2010 +0100 mac80211: add support for setting the ad-hoc multicast rate Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 885a46d0f7942d76c2f3860acb45f75237d3bb42 Author: Felix Fietkau Date: Thu Nov 11 15:07:22 2010 +0100 cfg80211: add support for setting the ad-hoc multicast rate Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit a619a4c0e1fd4e8c360c63d0df3fa0a401107d69 Author: Juuso Oikarinen Date: Thu Nov 11 08:50:18 2010 +0200 mac80211: Add function to get probe request template for current AP Chipsets with hardware based connection monitoring need to autonomically send directed probe-request frames to the AP (in the event of beacon loss, for example.) For the hardware to be able to do this, it requires a template for the frame to transmit to the AP, filled in with the BSSID and SSID of the AP, but also the supported rate IE's. This patch adds a function to mac80211, which allows the hardware driver to fetch this template after association, so it can be configured to the hardware. Signed-off-by: Juuso Oikarinen Acked-by: Johannes Berg Signed-off-by: John W. Linville commit 4e8c14e9587c38f4cce8049c766935629fdb8d46 Author: Felix Fietkau Date: Thu Nov 11 03:18:38 2010 +0100 ath9k_hw: add a private op for configuring radar pulse detection Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 82b873afe83c81d9b1273a816bbdacb266f71a52 Author: Felix Fietkau Date: Thu Nov 11 03:18:37 2010 +0100 ath9k: clean up tx buffer setup Merge ath_tx_send_normal and ath_tx_send_ht_normal. Move the paprd state initialization and sequence number assignment to reduce the number of redundant checks. This not only simplifies buffer allocation error handling, but also removes a small inconsistency in the buffer HT flag. This flag should only be set if the frame is also a QoS data frame. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 61117f01e79f7c0da86c23535bed757370f5885f Author: Felix Fietkau Date: Thu Nov 11 03:18:36 2010 +0100 ath9k: remove the tx info padding byte abuse Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit f0c255a07fe8a4d450cce6355a22b73ee0e9e6e0 Author: Felix Fietkau Date: Thu Nov 11 03:18:35 2010 +0100 ath9k: handle tx underrun in the driver instead of rate control Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 1d666d8e05edf5891a7a4bd84a25f493f01dc71a Author: Felix Fietkau Date: Thu Nov 11 03:18:34 2010 +0100 ath9k: remove the unnecessary private xretry tx flag Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 7afbb2f07028183f50ae4f7ce4dab1f32b36cf48 Author: Ben Greear Date: Wed Nov 10 11:43:51 2010 -0800 ath5k: Cleanup opmode setting logic. An earlier review suggested moving the code in a small method that was only called once inline. This patch accomplishes that. Signed-off-by: Ben Greear Acked-by: Bruno Randolf Signed-off-by: John W. Linville commit 6ee63f55c7754462a45315ac93027a1df60667c9 Author: Senthil Balasubramanian Date: Wed Nov 10 05:03:16 2010 -0800 ath9k_hw: Fix low throughput issue with AR93xx TX underruns were noticed when RTS/CTS preceded aggregates. This issue was noticed in ar93xx family of chipsets only. The workaround involves padding the RTS or CTS length up to the min packet length of 256 bytes required by the hardware by adding delimiters to the fist descriptor of the aggregate. Signed-off-by: Senthil Balasubramanian Signed-off-by: John W. Linville commit 39ec2997c374b528cdbf65099b6d6b8593a67f7f Author: Vasanthakumar Thiagarajan Date: Wed Nov 10 05:03:15 2010 -0800 ath9k: Fix bug in delimiter padding computation There is a roundng error in delimiter padding computation which causes severe throughput drop with some of AR9003. signed-off-by: Felix Fietkau Signed-off-by: Vasanthakumar Thiagarajan Cc:stable@kernel.org Signed-off-by: John W. Linville commit bc2068020bfa976efd425f3be590f58a012fd747 Author: Vasanthakumar Thiagarajan Date: Wed Nov 10 05:03:14 2010 -0800 ath9k_hw: Add helper function for interpolation Also round off interpolated values this would improve power accuracy by 0.5dB in some cases. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 15cbbc44cc4abaaebc37caf0ec9410a3f83d1deb Author: Vasanthakumar Thiagarajan Date: Wed Nov 10 05:03:13 2010 -0800 ath9k_hw: Improve power control accuracy for AR9003 It is done for 5Ghz by adding three temperature slopes. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit f4475a6e52fce8d951a96c763f36b835bf89fdec Author: Vasanthakumar Thiagarajan Date: Wed Nov 10 05:03:12 2010 -0800 ath9k_hw: Enable strong signal detection for AR9003 Attenuation from eeprom is configured into attenuator control register. Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 52a0e2477dac2106bc1688cbe9615cdafc9deb7d Author: Vasanthakumar Thiagarajan Date: Wed Nov 10 05:03:11 2010 -0800 ath9k_hw: Fix XPABIAS level configuration for AR9003 Improper configuration of 0x16288 and 0x16290 would affect transmission. Cc:stable@kernel.org Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 3092354970381fb8b6439fb4def0c34632277ae9 Author: Senthil Balasubramanian Date: Wed Nov 10 05:03:10 2010 -0800 ath9k_hw: add eeprom templates for ar9003 family chipsets We are currently using the default eeprom default and it doesn't work properly for all ar9003 family chipsets. So add eeprom templates for different versisons and select the eeprom table based on the template version programmed in the eeprom. Signed-off-by: Senthil Balasubramanian Signed-off-by: John W. Linville commit 3ceb801bffb62bc486f9662cd4dbca2cbdc6f5c7 Author: Senthil Balasubramanian Date: Wed Nov 10 05:03:09 2010 -0800 ath9k_hw: Fix paprd training frame failure. paprd training frame fails in some rates. Fix the rate mask. Signed-off-by: Senthil Balasubramanian Signed-off-by: John W. Linville commit ef5a6a7573b7a12ced67dae155be8a909bc245d6 Author: Senthil Balasubramanian Date: Wed Nov 10 05:03:08 2010 -0800 ath9k_hw: Initialize 2GHz CTL properly. The last 2GHz CTL was not being initialized, so power was being set to 0 instead of 30dbm. Initialize to 30 like other CTLs. Signed-off-by: Senthil Balasubramanian Signed-off-by: John W. Linville commit b3dd6bc1f052ef3a754fa866743e4fda38522811 Author: Senthil Balasubramanian Date: Wed Nov 10 05:03:07 2010 -0800 ath9k_hw: Add new member into the eeprom structure. Add eeprom base extension structures which are needed for AR938x caliberation changes and gain calculation. Signed-off-by: Senthil Balasubramanian Signed-off-by: John W. Linville commit a9d85fbd3e5f7a0679e6276953cd23ac7bb72789 Author: Senthil Balasubramanian Date: Thu Nov 11 00:40:33 2010 -0800 ath9k_hw: Fix a reset failure on AR9382 (2x2). AR9382 needs to be configured for the correct chain mask before running AGC/TxIQ caliberation. Otherwise reset would fail. Signed-off-by: Senthil Balasubramanian Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: John W. Linville commit 72a801103f07182c0a4f3a761caa62b4ab8eb4e5 Author: Bruno Randolf Date: Wed Nov 10 12:51:01 2010 +0900 ath5k: Add support for antenna configuration Support setting the antenna configuration via cfg/mac80211. At the moment only allow the simple pre-defined configurations we already have (fixed antenna A/B or diversity), but more advanced settings are possible to implement. Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit 15d967532148a5fcda075282b82a271b6595a386 Author: Bruno Randolf Date: Wed Nov 10 12:50:56 2010 +0900 mac80211: Add antenna configuration Allow antenna configuration by calling driver's function for it. We disallow antenna configuration if the wiphy is already running, mainly to make life easier for 802.11n drivers which need to recalculate HT capabilites. Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit afe0cbf87500f0585d217deb8c6fd329793a7957 Author: Bruno Randolf Date: Wed Nov 10 12:50:50 2010 +0900 cfg80211: Add nl80211 antenna configuration Allow setting of TX and RX antennas configuration via nl80211. The antenna configuration is defined as a bitmap of allowed antennas to use. This API can be used to mask out antennas which are not attached or should not be used for other reasons like regulatory concerns or special setups. Separate bitmaps are used for RX and TX to allow configuring different antennas for receiving and transmitting. Each bitmap is 32 bit long, each bit representing one antenna, starting with antenna 1 at the first bit. If an antenna bit is set, this means the driver is allowed to use this antenna for RX or TX respectively; if the bit is not set the hardware is not allowed to use this antenna. Using bitmaps has the benefit of allowing for a flexible configuration interface which can support many different configurations and which can be used for 802.11n as well as non-802.11n devices. Instead of relying on some hardware specific assumptions, drivers can use this information to know which antennas are actually attached to the system and derive their capabilities based on that. 802.11n devices should enable or disable chains, based on which antennas are present (If all antennas belonging to a particular chain are disabled, the entire chain should be disabled). HT capabilities (like STBC, TX Beamforming, Antenna selection) should be calculated based on the available chains after applying the antenna masks. Should a 802.11n device have diversity antennas attached to one of their chains, diversity can be enabled or disabled based on the antenna information. Non-802.11n drivers can use the antenna masks to select RX and TX antennas and to enable or disable antenna diversity. While covering chainmasks for 802.11n and the standard "legacy" modes "fixed antenna 1", "fixed antenna 2" and "diversity" this API also allows more rare, but useful configurations as follows: 1) Send on antenna 1, receive on antenna 2 (or vice versa). This can be used to have a low gain antenna for TX in order to keep within the regulatory constraints and a high gain antenna for RX in order to receive weaker signals ("speak softly, but listen harder"). This can be useful for building long-shot outdoor links. Another usage of this setup is having a low-noise pre-amplifier on antenna 1 and a power amplifier on the other antenna. This way transmit noise is mostly kept out of the low noise receive channel. (This would be bitmaps: tx 1 rx 2). 2) Another similar setup is: Use RX diversity on both antennas, but always send on antenna 1. Again that would allow us to benefit from a higher gain RX antenna, while staying within the legal limits. (This would be: tx 0 rx 3). 3) And finally there can be special experimental setups in research and development even with pre 802.11n hardware where more than 2 antennas are available. It's good to keep the API simple, yet flexible. Signed-off-by: Bruno Randolf -- v7: Made bitmasks 32 bit wide and rebased to latest wireless-testing. Signed-off-by: John W. Linville commit 0e67d6cb753643fc076a90fa9309301b3fbfb8db Author: Joe Perches Date: Tue Nov 9 16:35:19 2010 -0800 drivers/net/wireless/b43legacy/main.c: Use printf extension %pV Using %pV reduces the number of printk calls and eliminates any possible message interleaving from other printk calls. Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit 5b736d42bc51fe893fd7d4ceac34c727d23135e1 Author: Joe Perches Date: Tue Nov 9 16:35:18 2010 -0800 drivers/net/wireless/b43/main.c: Use printf extension %pV Using %pV reduces the number of printk calls and eliminates any possible message interleaving from other printk calls. Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit 7e559ec31c5625cf85bcb1ae0eb9f8f2a8da4a29 Author: Joe Perches Date: Tue Nov 9 16:35:17 2010 -0800 drivers/net/wireless/ath/debug.c: Use printf extension %pV Using %pV reduces the number of printk calls and eliminates any possible message interleaving from other printk calls. Signed-off-by: Joe Perches Signed-off-by: John W. Linville commit 5cb56af29be8d12f74afcb2c1de91e51a577bd52 Author: Jussi Kivilinna Date: Tue Nov 9 19:25:56 2010 +0200 rndis_wlan: workaround poor scanning with BCM4320a BCM4320a devices seem to sometimes do scanning pretty poorly. This can be workaround by issuing new scan every second, while not yet connected. By this new scanning method device catches beacons much faster. Fixes bug #20822. Reported-by: LuĂ­s Picciochi Signed-off-by: Jussi Kivilinna Signed-off-by: John W. Linville commit b5257c952dda24df7078c74b7b811b44c6e49206 Author: Jussi Kivilinna Date: Tue Nov 9 19:25:47 2010 +0200 rndis_wlan: workaround device not returning bss for currently connected AP BCM4320a devices do not return bss for currently connected AP in bss-list, althought this is required by NDIS specs. Missing bss leads to warning at net/wireless/sme.c:__cfg80211_connect_result(), WARN_ON(!bss). Workaround this by crafting bss manually with information we can read from device. Workaround is only used when device bss-list does not return current bss, and so is only used with BCM4320a devices and not newer BCM4320b ones. Fixes bug #20152. Reported-by: LuĂ­s Picciochi Signed-off-by: Jussi Kivilinna Signed-off-by: John W. Linville commit f23a478075659db8a4fd62fa6e264a8bb052cc5b Author: Arik Nemtsov Date: Mon Nov 8 11:51:06 2010 +0200 mac80211: support hardware TX fragmentation offload The lower driver is notified when the fragmentation threshold changes and upon a reconfig of the interface. If the driver supports hardware TX fragmentation, don't fragment packets in the stack. Signed-off-by: Arik Nemtsov Signed-off-by: John W. Linville commit ca4a0831917d6541b45f03542257fcb20dc9cf4a Author: RafaÅ‚ MiÅ‚ecki Date: Wed Nov 3 23:28:45 2010 +0100 ssb: return -ENOMEM on alloc fail (instead of CRC check's result) Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 54435f9ec837cf0bb0ea02a2bb6362a6aaef5250 Author: RafaÅ‚ MiÅ‚ecki Date: Wed Nov 3 22:06:26 2010 +0100 ssb: workarounds: be verbose about hacking SPROM revision, don't duplicate code Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit d1f9e41d1d739cd4393840d35e7554f4a439a4f1 Author: Brian Cavagnolo Date: Fri Nov 12 17:23:53 2010 -0800 mwl8k: use const struct fw pointers throughout This eliminates compiler warnings by doing things how the firmware class expects. Signed-off-by: Brian Cavagnolo Signed-off-by: John W. Linville commit 99020471001dbbd6edf61f105368cb6667cc683d Author: Brian Cavagnolo Date: Fri Nov 12 17:23:52 2010 -0800 mwl8k: make initial firmware load asynchronous Introduce a firmware loading state machine to manage the process of loading firmware asynchronously and completing initialization upon success. The state machine attempts to load the preferred firmware image. If that fails, and if an alternative firmware image is available, it will attempt to load that one. Signed-off-by: Brian Cavagnolo Signed-off-by: John W. Linville commit 952a0e963fb02e50f4afbf502f7d468a8fe2b0fa Author: Brian Cavagnolo Date: Fri Nov 12 17:23:51 2010 -0800 mwl8k: add API version checking for AP firmware The AP firmware specifies an API version in the GET_HW_SPEC command response. Currently, the driver only supports AP firmware for the 8366, and only supports API v1. In the future, if higher API version firmwares emerge (possibly for different chips), different ops can be selected based on the reported API version. Signed-off-by: Brian Cavagnolo Signed-off-by: John W. Linville commit 0863ade8d6bde1d151f75720d999ff27f9fe3533 Author: Brian Cavagnolo Date: Fri Nov 12 17:23:50 2010 -0800 mwl8k: choose proper firmware image as directed by user The mwl8k can operate in AP or STA mode, depending on the firmware image that is loaded. By default, STA firmware is loaded. Allow the user to override this default mode at module load time. This saves an unnecessary firmware reload for users only interested in AP mode. Also, the firmware image can be swapped to meet the user's add_interface request. For example, suppose the STA firmware is loaded, no STA interface has been added, and the user adds an AP interface. In this case, the AP firmware will be loaded to meet the request. Based on contributions from Pradeep Nemavat , Yogesh Powar , and Lennert Buytenhek . Signed-off-by: Brian Cavagnolo Signed-off-by: John W. Linville commit 3cc7772c0a3cc193fa9873816168bd34d4f16837 Author: Brian Cavagnolo Date: Fri Nov 12 17:23:49 2010 -0800 mwl8k: factor out firmware loading and hw init code This is in preparation for supporting different fw images for different interface types, and for supporting asynchronous firmware loading. Based on a patch from Pradeep Nemavat and Yogesh Powar Signed-off-by: Brian Cavagnolo Signed-off-by: John W. Linville commit 41fdf0974d9eb81215cb578211a6d8f8a022a9eb Author: Nishant Sarmukadam Date: Fri Nov 12 17:23:48 2010 -0800 mwl8k: rf_tx_power cmd not supported by AP firmware APIv1 APIv1 AP firmware does not support the RF_TX_POWER command. It supports the similar TX_POWER command. Signed-off-by: Pradeep Nemavat Signed-off-by: Nishant Sarmukadam Signed-off-by: Brian Cavagnolo Signed-off-by: John W. Linville commit a1fe24b0fd8bf16b4e551ae3fb785bfc574b9ffb Author: Brian Cavagnolo Date: Fri Nov 12 17:23:47 2010 -0800 mwl8k: revert unnecessary modification of tx descriptor This reverts change 783391c443728febc669e40597193308460e7b4f. The stabilized AP v1 firmware uses the same tx descriptor as the STA firmware. Signed-off-by: Brian Cavagnolo Signed-off-by: John W. Linville commit ae63a33ec9b598b3454cf0d29077fa17b616c42a Author: Deepak Saxena Date: Sun Oct 31 13:40:33 2010 +0000 libertas: EHS_REMOVE_WAKEUP is not always supported Certain firmware versions, particularly the 8388 found on the XO-1, do not support the EHS_REMOVE_WAKEUP command that is used to disable WOL. Sending this command to the card will return a failure that would get propagated up the stack and cause suspend to fail. Instead, fall back to an all-zero wakeup mask. This fixes http://dev.laptop.org/ticket/9967 Signed-off-by: Deepak Saxena Signed-off-by: Daniel Drake [includes fixups by Paul Fox] Signed-off-by: John W. Linville commit cf43298864fdfd687202db8c736473522bfceb98 Author: Daniel Drake Date: Sun Oct 31 13:40:12 2010 +0000 libertas: don't block usb8388 suspend if no wakeup conditions are set This hunk added by commit 66fceb69b72f seems erroneous. We don't want to prevent suspend of the whole system if no wakeup params are set. In the case of the usb8388 we do want to keep the card powered up even if there are no wakeup params. This is because it will continue acting as a mesh node. If the mesh is disabled, it would indeed make more sense to power down the card during suspend, as the equivalent hunk does for the SD interface. But that's a separate task; for now just restore the previous behaviour. Signed-off-by: Daniel Drake Acked-by: Dan Williams Signed-off-by: John W. Linville commit a80c49dbb6cd389fd5b0d79f850b56322475d00b Author: Peter Zijlstra Date: Mon Nov 15 21:11:12 2010 +0100 serial8250: Mark console as CON_ANYTIME While trying to debug a cpu-hotplug issue I noticed printk() stopped working once the cpu got marked offline, since the 8250 serial console doesn't have any per-cpu resources the CON_ANYTIME bit is the safe and documented way to make it work again. Signed-off-by: Peter Zijlstra Signed-off-by: Greg Kroah-Hartman commit c540ee70e49b573535c7ddfd0e9a0fc9d549c8b7 Author: David S. Miller Date: Tue Nov 16 12:50:19 2010 -0800 sparc64: Delete prom_setcallback(). Unused. Signed-off-by: David S. Miller commit 83abd0d897ad3b7d064c8d8594ec5cc8520d6646 Author: Alan Cox Date: Fri Nov 12 10:46:23 2010 +0000 serial: ifx6x60: Fix missing include for msleep Noted by Stephen Rothwell Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 8ddbe5edfb33e2186a5c83925d657914f643e09a Author: Alan Cox Date: Thu Nov 11 22:28:58 2010 +0000 serial: ifx6x60: The IFX requires SPI Correct the KConfig as noted by Greg. Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit e44dcb6c377529805bbaae505d5b333daab69111 Author: Wolfram Sang Date: Fri Nov 12 19:47:47 2010 +0100 serial: mpc52xx: make printout for type more generic The printout for the type should be just "5xxx", so 512x users won't wonder why they have a mpc52xx-type UART. Signed-off-by: Wolfram Sang Cc: Grant Likely Cc: Greg Kroah-Hartman Signed-off-by: Greg Kroah-Hartman commit 597c606f560cf7ef6029152fa7574bddbfb0252f Author: Jiri Slaby Date: Thu Nov 4 16:20:21 2010 +0100 parisc: cleanup console handling * use newly added for_each_console for iterating consoles * add proper console locking * do not initialize tmp twice * no need to declare console_drivers, it's already done in console.h Signed-off-by: Jiri Slaby Acked-by: Kyle McMartin Cc: Helge Deller Cc: "James E.J. Bottomley" Cc: linux-parisc@vger.kernel.org Signed-off-by: Greg Kroah-Hartman commit 23308ba54dcdb54481163bfb07dd8aeca76a7a2e Author: Jiri Slaby Date: Thu Nov 4 16:20:24 2010 +0100 console: add /proc/consoles It allows users to see what consoles are currently known to the system and with what flags. It is based on Werner's patch, the part about traversing fds was removed, the code was moved to kernel/printk.c, where consoles are handled and it makes more sense to me. Signed-off-by: Jiri Slaby [cleanups] Signed-off-by: "Dr. Werner Fink" Cc: Al Viro Cc: Greg Kroah-Hartman Signed-off-by: Greg Kroah-Hartman commit 281e66057757ddf32ffe679a08f9634fa9f70a7a Author: Jiri Slaby Date: Thu Nov 4 16:20:22 2010 +0100 VIDEO: xen-fb, switch to for_each_console Use newly added for_each_console for iterating consoles. Signed-off-by: Jiri Slaby Cc: Jeremy Fitzhardinge Cc: Chris Wright Cc: virtualization@lists.osdl.org Cc: xen-devel@lists.xensource.com Cc: linux-fbdev@vger.kernel.org Signed-off-by: Greg Kroah-Hartman commit 3dfbd044d0d99cad2fe50e4f6c79845703fa0558 Author: Jiri Slaby Date: Thu Nov 4 16:20:23 2010 +0100 TTY: include termios.h in tty_driver.h We reference termios and termiox in tty_driver.h, but we do not include linux/termios.h where these are defined. Add the #include properly. Otherwise when we include tty_driver.h, we get compile errors. Signed-off-by: Jiri Slaby Cc: Alan Cox Cc: Greg KH Signed-off-by: Greg Kroah-Hartman commit a75d946f42ae1771424a9582129fc5182ff48a1b Author: Jiri Slaby Date: Thu Nov 4 16:20:20 2010 +0100 console: move for_each_console to linux/console.h Move it out of printk.c so that we can use it all over the code. There are some potential users which will be converted to that macro in next patches. Signed-off-by: Jiri Slaby Signed-off-by: Greg Kroah-Hartman commit 2e3161390130f50fdbb4b989c667f42e5008107f Author: Dan Carpenter Date: Sat Nov 13 11:24:22 2010 +0300 Staging: bcm: signedness bug in InitCardAndDownloadFirmware() status is used to store negative error codes throughout. The only place where this is a runtime bug is if create_worker_threads() fails. Signed-off-by: Dan Carpenter Signed-off-by: Greg Kroah-Hartman commit f05321cca53da7c7abad4bc726699e9f27bf4922 Author: Dan Carpenter Date: Sat Nov 13 07:37:49 2010 +0300 Staging: bcm: signedness bug in StoreSFParam() wrm() returns negative error codes so "ret" needs to be signed here. There was place where wrm() returned positive EACCES instead of negative -EACCES so I fixed that as well. Also a few checkpatch.pl issues. Signed-off-by: Dan Carpenter Signed-off-by: Greg Kroah-Hartman commit 0ebce2696305c3f49f54f3af25cb966ef1b24f71 Author: Randy Dunlap Date: Sat Nov 13 08:44:35 2010 -0800 staging: fix iio/gyro typos, build errors Typo causes build errors. Did anyone even build this driver? Signed-off-by: Randy Dunlap Signed-off-by: Greg Kroah-Hartman commit 59a126418b96e9f5337d431e6024a8d50bbd6e4e Author: Dan Carpenter Date: Sat Nov 13 12:05:32 2010 +0300 Staging: iio/dds: double locking bugs This is a static checker patch and I don't have this hardware. This code is unusual because while I've often seen a double lock, this is the first time I've seen code that takes a lock 11 times in a row. I feel like I must have missed something. But I've looked very carefully I don't see any way the original code is correct. Does spi_sync() somehow release the lock in a way that I can't see? Even if it does, the locking would still be wrong. Signed-off-by: Dan Carpenter Acked-by: Michael Hennerich Acked-by: Cliff Cai Signed-off-by: Greg Kroah-Hartman commit a1a26e492c4a90466cb3e064ccf69db4dd66d63a Author: Dan Carpenter Date: Sat Nov 13 11:34:16 2010 +0300 Staging: cptm1217: move free under dereference We dereference "ts" in the printk so move the kfree() down a line. Signed-off-by: Dan Carpenter Acked-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 62af33ec6e73d658720ea1190861c8c0609a94b3 Author: Randy Dunlap Date: Thu Nov 11 10:44:22 2010 -0800 staging/easycap: make module params private/static, fix build The easycap driver has module parameters (bars, gain, & debug) with global scope that intrude on the kernel namespace and cause build problems. Change the names of them to be driver-specific and make 2 of them static. drivers/built-in.o:(.bss+0x97c00): multiple definition of `debug' ld: Warning: size of symbol `debug' changed from 58 in arch/x86/built-in.o to 4 in drivers/built-in.o Signed-off-by: Randy Dunlap Cc: Mike Thomas Signed-off-by: Greg Kroah-Hartman commit a65e659d97bc652b2e14a63beaf9efbf5d4e18b2 Author: Randy Dunlap Date: Fri Nov 12 14:47:02 2010 -0800 staging: fix ste_rmi4 build, depends on INPUT The synaptics_i2c_rmi4 driver uses input_*() interfaces, so it should depend on INPUT to fix its build errors: ERROR: "input_event" [drivers/staging/ste_rmi4/synaptics_i2c_rmi4.ko] undefined! ERROR: "input_free_device" [drivers/staging/ste_rmi4/synaptics_i2c_rmi4.ko] undefined! ERROR: "input_register_device" [drivers/staging/ste_rmi4/synaptics_i2c_rmi4.ko] undefined! ERROR: "input_set_abs_params" [drivers/staging/ste_rmi4/synaptics_i2c_rmi4.ko] undefined! ERROR: "input_allocate_device" [drivers/staging/ste_rmi4/synaptics_i2c_rmi4.ko] undefined! ERROR: "input_unregister_device" [drivers/staging/ste_rmi4/synaptics_i2c_rmi4.ko] undefined! Signed-off-by: Randy Dunlap Cc: naveen.gaddipati@stericsson.com, js.ha@stericsson.com Signed-off-by: Greg Kroah-Hartman commit 44d4a4f784d0e1a50b3f1fc52bd6a661846abdc5 Author: David Brown Date: Fri Nov 12 13:49:53 2010 -0800 msm: make constant unsigned long to correct format warning Define VMALLOC_END as an unsigned long to match expected type. Eliminates a warning: arch/arm/mm/init.c: In function 'mem_init': arch/arm/mm/init.c:606: warning: format '%08lx' expects type 'long unsigned int', but argument 12 has type 'unsigned int' Signed-off-by: David Brown Signed-off-by: Daniel Walker commit 3251627c943f1cfc5bfad7c38d4e8d85cf44c6d8 Author: Dan Carpenter Date: Sat Nov 13 11:58:26 2010 +0300 Staging: intel_sst: fix memory leak The original code set "str_info->decode_ibuf" to NULL so the kfree() is no-op. Signed-off-by: Dan Carpenter Acked-by: Harsha Priya Acked-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 832855354b5863d141ecfc563e78063978c6f29f Author: Dan Carpenter Date: Fri Nov 12 08:11:13 2010 +0300 Staging: rtl8712: signedness bug in init PollingCnt is 20 and that means we loop 20 times and then run the timeout code. After the end of the loop PollingCnt should be -1 but because it's an unsigned char, it's actually 255 and the timeout code never runs. Signed-off-by: Dan Carpenter Acked-by: Larry Finger Signed-off-by: Greg Kroah-Hartman commit f36d83a8cb7224f45fdfa1129a616dff56479a09 Author: Larry Finger Date: Sat Nov 13 13:01:56 2010 -0600 staging: rtl8187se: Change panic to warn when RF switch turned off This driver issues a kernel panic over conditions that do not justify such drastic action. Change these to log entries with a stack dump. This patch fixes the system crash reported in https://bugs.launchpad.net/ubuntu/+source/linux/+bug/674285. Signed-off-by: Larry Finger Reported-and-Tested-by: Robie Basik Cc: Stable Signed-off-by: Greg Kroah-Hartman commit 61838261edaf621d1e8ee4ea9d7c052f7d783ca4 Author: Nicolas Kaiser Date: Sat Nov 13 19:46:50 2010 +0100 staging: comedi: fix memory leak Instead of freeing outBuffer, inBuffer gets freed twice. Signed-off-by: Nicolas Kaiser Signed-off-by: Greg Kroah-Hartman commit ebba26f4a8d0c137a2d365b6bded2a0d7fcd1d06 Author: Dan Carpenter Date: Fri Nov 12 08:04:43 2010 +0300 Staging: quickstart: free after input_unregister_device() input_unregister_device() releases "quickstart_input" so the input_free_device() is a double free. Also I noticed that there is a memory leak if the call to input_register_device() fails. Signed-off-by: Dan Carpenter Signed-off-by: Greg Kroah-Hartman commit 5fb5d38fc268b8285125b213b9b2ded9322a371c Author: Dan Carpenter Date: Fri Nov 12 08:08:35 2010 +0300 Staging: speakup: free after input_unregister_device() input_unregister_device() frees the device so the call to input_free_device() is a double free. Signed-off-by: Dan Carpenter Signed-off-by: Greg Kroah-Hartman commit d2c5d2145f127fffb7498bee943a480de66910ff Author: David Brown Date: Fri Nov 12 13:49:52 2010 -0800 msm: smd: ifdef adjustment to remove unused variables Put some variables inside of the same ifdef as the code that uses them. arch/arm/mach-msm/smd_debug.c: In function 'smsm_print_sleep_info': arch/arm/mach-msm/smd_debug.c:274: warning: unused variable 'int_info' arch/arm/mach-msm/smd_debug.c:273: warning: unused variable 'gpio' Signed-off-by: David Brown [dwalker@codeaurora.org: changed the commit text a little.] Signed-off-by: Daniel Walker commit f7b5f55ac1623dfde24ef5319ad77c1746645f3f Author: David S. Miller Date: Tue Nov 16 12:24:16 2010 -0800 sparc64: Unexport prom_service_exists(). Only used by functions in misc_64.c so make it private to that file. Signed-off-by: David S. Miller commit 5d1394bb6b781df8148565783b0671f9b11500b7 Author: David Brown Date: Fri Nov 12 13:49:51 2010 -0800 msm: sirc: remove some unused variables Eliminate some unreferenced variables. arch/arm/mach-msm/sirc.c:43: warning: 'save_type' defined but not used arch/arm/mach-msm/sirc.c:44: warning: 'save_polarity' defined but not used Signed-off-by: David Brown [dwalker@codeaurora.org: changed the commit text a little.] Signed-off-by: Daniel Walker commit 9be58f317d79278afc23186d861ada774cf386ea Author: David Brown Date: Fri Nov 12 13:49:27 2010 -0800 msm: smd: Reduce driver log chatter The MSM smd driver logs numerous messages during startup that are useful for debug purposes. Change some of these to pr_debug() to match their purpose, and remove others that aren't really useful. Cc: Brian Swetland Cc: Arve HjønnevĂ¥g Signed-off-by: David Brown Signed-off-by: Daniel Walker commit b148246912bea92bde2a0cba125ca94f1f776b12 Author: David S. Miller Date: Tue Nov 16 12:23:20 2010 -0800 sparc: Kill prom devops_{32,64}.c Completely unused. Signed-off-by: David S. Miller commit defc19cebc7f700cb05226f0c4496b9d50c84643 Author: Tushar Mehta Date: Tue Nov 16 12:13:50 2010 +0530 Staging: autofs: fix coding style issue in dirhash.c This is a patch to the dirhash.c file that fixes up a number of issues found by the checkpatch.pl tool Signed-off-by: Tushar Mehta Signed-off-by: Greg Kroah-Hartman commit 17d70d6df0c4ea7a203b444001572a91ad9c2bef Author: David S. Miller Date: Tue Nov 16 12:11:15 2010 -0800 sparc: Remove prom_pathtoinode() Unused. Signed-off-by: David S. Miller commit ce05a94efaf71d562eeefd30d6bbc2ab42b06bac Author: David S. Miller Date: Tue Nov 16 12:08:23 2010 -0800 sparc64: Delete prom_puts() unused. Signed-off-by: David S. Miller commit 0ff36f69bd3e7846557880fe934dd0cdeee6a29e Author: Brandon Philips Date: Mon Nov 15 11:55:33 2010 -0800 staging: hv: add explanation of no-op set_multicast_list I was going to remove netvsc_set_multicast_list() so I think it is worth adding a comment since it isn't immediately clear why you would want this. Signed-off-by: Brandon Philips Acked-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit e33196e108197e4a1f1a5331dc7740ad9263f4f5 Author: Joe Perches Date: Mon Nov 15 13:12:32 2010 -0800 drivers/staging: Remove unnecessary casts of netdev_priv Signed-off-by: Joe Perches Signed-off-by: Greg Kroah-Hartman commit 345594d6ef696b8ad4b96cffe462c6cde2f27292 Author: Joe Perches Date: Mon Nov 15 12:14:00 2010 -0800 drivers/staging: Remove unnecessary casts of pci_get_drvdata Signed-off-by: Joe Perches Signed-off-by: Greg Kroah-Hartman commit 859171ca92f2865453b4b2e17bf679c67044a833 Author: Joe Perches Date: Sun Nov 14 19:04:48 2010 -0800 drivers/staging: Remove unnecessary semicolons Signed-off-by: Joe Perches Signed-off-by: Greg Kroah-Hartman commit ae0d9ebaffe47ed553e715ab5243660c33b6338c Author: Mike Rapoport Date: Sun Nov 14 13:36:23 2010 +0200 staging: brcm80211: brcmfmac: remove PXA SDIO controller binding Signed-off-by: Mike Rapoport Signed-off-by: Greg Kroah-Hartman commit 5b93a8b8e0514ebacb49a50c67a8846139bcd1bd Author: Mike Rapoport Date: Sun Nov 14 13:36:21 2010 +0200 staging: brcm80211: remove unused osl_pkt{get,free}_static Signed-off-by: Mike Rapoport Signed-off-by: Greg Kroah-Hartman commit a1dc08b7d95817faea5e6a358e22c6185b84163a Author: Brett Rudley Date: Fri Nov 12 18:10:17 2010 -0800 staging: brcm80211: get rid of last bit of pci configspace workaround. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit baebc160c12ba88baf201d35ecc22f1e250aad3f Author: Brett Rudley Date: Fri Nov 12 15:28:30 2010 -0800 staging: brcm80211: simplify pci_config_read/write osl routines. Start simplifying osl with goal of purging it entirely. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit f96c377ead5ed308f0cf18b9156f86fdf207a288 Author: Nicolas Kaiser Date: Sat Nov 13 19:43:27 2010 +0100 staging: comedi: fix typo in error message Fix typo in error message of dux commands allocation. Signed-off-by: Nicolas Kaiser Signed-off-by: Greg Kroah-Hartman commit e08e02faff68d33c938fd0322c0f8318a25ddb39 Author: Emilio G. Cota Date: Fri Nov 12 11:15:54 2010 +0000 staging: vme: ca91cx42: mark the registers' base address pointer as __iomem Signed-off-by: Emilio G. Cota Acked-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit e20cbcf199e2c3e4a4822e890726c49b70a4d280 Author: Emilio G. Cota Date: Fri Nov 12 11:15:47 2010 +0000 staging: vme: tsi148: mark the registers' base address pointer as __iomem Signed-off-by: Emilio G. Cota Acked-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit 0599726793d6dca6bd171cd4e497f9aac21e8f0c Author: Emilio G. Cota Date: Fri Nov 12 11:15:40 2010 +0000 staging: vme: mark struct vme_master_resource's base address pointer as __iomem Signed-off-by: Emilio G. Cota Acked-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit 1a85f2073d99080ea70962f767edca479c768b6e Author: Emilio G. Cota Date: Fri Nov 12 11:15:34 2010 +0000 staging: vme_user: mark user-space buffers with __user Signed-off-by: Emilio G. Cota [martyn.welch@ge.com: modified to remove checkpatch warnings] Signed-off-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit 0a81a0f768e5bb0c32db6e44440c5b7c1b4658e7 Author: Emilio G. Cota Date: Fri Nov 12 11:15:27 2010 +0000 staging: vme_user: remove __iomem marking from kern_buf and derivates kern_buf is not iomem; it comes from kmalloc and is directly dereferenced. Signed-off-by: Emilio G. Cota Acked-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit c949231838006d7de4ad38be38d9e112826862da Author: Emilio G. Cota Date: Fri Nov 12 11:15:21 2010 +0000 staging: vme_user: use an unsigned int for counting the number of kparams unsigned int is what struct kparam_array internally uses. Signed-off-by: Emilio G. Cota Acked-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit b9cc293486e27f4d29a9813da6ebcb8574071dfa Author: Emilio G. Cota Date: Fri Nov 12 11:15:14 2010 +0000 staging: vme_user: declare private variables as static Signed-off-by: Emilio G. Cota [martyn.welch@ge.com: modified to remove checkpatch warnings] Signed-off-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit efbb979d1b31638a95d76b5acf65cf00a3213fe4 Author: Emilio G. Cota Date: Fri Nov 12 11:15:07 2010 +0000 staging: vme: ca91cx42: declare static functions as such Signed-off-by: Emilio G. Cota [martyn.welch@ge.com: modified to remove checkpatch warnings] Signed-off-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit 5ade6c4d79377efc371ac89db07e4f6594d1286a Author: Emilio G. Cota Date: Fri Nov 12 11:15:00 2010 +0000 staging: vme: tsi148: declare static functions as such Signed-off-by: Emilio G. Cota [martyn.welch@ge.com: modified to remove checkpatch warnings] Signed-off-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit 84295e0b243cba070fcfe8be825c39827ea022e6 Author: Emilio G. Cota Date: Fri Nov 12 11:14:54 2010 +0000 staging: vme: tsi148: remove unreachable line Signed-off-by: Emilio G. Cota Acked-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit a82ad05ecd9dbd909509a332d3aa5f4ac439a054 Author: Emilio G. Cota Date: Fri Nov 12 11:14:47 2010 +0000 staging: vme: tsi148: fix warning in free_irq The cookie passed to request_irq isn't the same as the one passed to free_irq, which results in the following warning: [ 63.243533] WARNING: at kernel/irq/manage.c:899 __free_irq+0x9b/0x17d() [ 63.243533] Hardware name: [ 63.243533] Trying to free already-free IRQ 17 [ 63.243533] Modules linked in: vme_tsi148(-) vme e1000e iTCO_wdt iTCO_vendor_support [last unloaded: scsi_wait_scan] [ 63.243533] Pid: 2013, comm: rmmod Not tainted 2.6.35 #2 [ 63.243533] Call Trace: [ 63.243533] [] warn_slowpath_common+0x80/0x98 [ 63.243533] [] warn_slowpath_fmt+0x41/0x43 [ 63.243533] [] __free_irq+0x9b/0x17d [ 63.243533] [] free_irq+0x33/0x4e [ 63.243533] [] tsi148_irq_exit+0x6b/0x70 [vme_tsi148] [...] [ 63.243533] ---[ end trace bbf92311d969efb4 ]--- Fix it by passing the same cookie to both functions. Signed-off-by: Emilio G. Cota [martyn.welch@ge.com: modified to remove checkpatch warnings] Signed-off-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit b12ef0b1f5d0358bc13cc716155d6e9b5584af48 Author: Emilio G. Cota Date: Fri Nov 12 11:14:40 2010 +0000 staging: vme: tsi148: remove double freeing of the IRQ in .remove tsi148_irq_exit is called twice in .remove, which causes an oops. Remove the second call, which apart from being redundant cannot possibly work; the CR/CSR space has been already unmapped. Signed-off-by: Emilio G. Cota Acked-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit b558ba2f356c28269de179c4f7f6f179a4fa6a1d Author: Emilio G. Cota Date: Fri Nov 12 11:14:34 2010 +0000 staging: vme: tsi148: use list_for_each_safe when deleting resources in .remove This fixes an oops when removing the module. Signed-off-by: Emilio G. Cota Acked-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit db6d8fc5596ef866e64e9a7eef96bacdc6e51e11 Author: Emilio G. Cota Date: Fri Nov 12 11:14:27 2010 +0000 staging: vme: fix bogus clearing of the bus number in vme_free_bus_num Signed-off-by: Emilio G. Cota Signed-off-by: Greg Kroah-Hartman commit c0779fd01df76b3097cc77e3a404e8bb067e5628 Author: Emilio G. Cota Date: Fri Nov 12 11:14:20 2010 +0000 staging: vme_user: remove unreachable line Signed-off-by: Emilio G. Cota Acked-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit 55db50205adaf14db1bda07d0931b647b794de2f Author: Emilio G. Cota Date: Fri Nov 12 11:14:14 2010 +0000 staging: vme_user: return the appropriate error code when module_init fails When init_module fails, 0 is returned anyway; the module is then installed and oopses when we try to remove it: [ 3236.368009] WARNING: at drivers/base/driver.c:262 driver_unregister+0x36/0x6f() [ 3236.368012] Hardware name: [ 3236.368014] Unexpected driver unregister! [ 3236.368016] Modules linked in: vme_user(-) vme_tsi148 vme e1000e iTCO_wdt iTCO_vendor_support [last unloaded: vme] [ 3236.368027] Pid: 16162, comm: rmmod Not tainted 2.6.35 #2 [ 3236.368029] Call Trace: [ 3236.368037] [] warn_slowpath_common+0x80/0x98 [ 3236.368044] [] ? __try_stop_module+0x0/0x58 [ 3236.368049] [] warn_slowpath_fmt+0x41/0x43 [ 3236.368054] [] ? __try_stop_module+0x0/0x58 [ 3236.368059] [] driver_unregister+0x36/0x6f [ 3236.368066] [] vme_unregister_driver+0xd/0xf [vme] [ 3236.368072] [] vme_user_exit+0x10/0x1e [vme_user] [ 3236.368076] [] sys_delete_module+0x1ba/0x226 [ 3236.368082] [] ? do_page_fault+0x25d/0x28a [ 3236.368088] [] system_call_fastpath+0x16/0x1b [ 3236.368092] ---[ end trace cab6d88ebc44c1de ]--- The appended fixes it by returning the appropriate error code in module_init whenever something goes wrong, thus cancelling the insertion of the module. Signed-off-by: Emilio G. Cota Acked-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit 886953e9b70bcb6913716b49bdf21b69450a7cd6 Author: Emilio G. Cota Date: Fri Nov 12 11:14:07 2010 +0000 staging: vme: style: convert '&(foo)' to '&foo' done with find . -name '*.c' | xargs perl -p -i -e 's/&\(([^()]+)\)/&$1/g' Signed-off-by: Emilio G. Cota Acked-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman commit 9d1e5e40d6cac4bf7008e04c202d71918455ca11 Author: Eric Dumazet Date: Wed Nov 3 05:56:38 2010 +0000 mpc52xx: cleanup locking commit 1e4e0767ecb1 (Fix locking on fec_mpc52xx driver) assumed IRQ are enabled when an IRQ handler is called. It is not the case anymore (IRQF_DISABLED is deprecated), so we can use regular spin_lock(), no need for spin_lock_irqsave(). Signed-off-by: Eric Dumazet Tested-by: Jean-Michel Hautbois Cc: Asier Llano Cc: Grant Likely Signed-off-by: David S. Miller commit 7f55f13c2ca82f6d998502df70f24deb550e5e0c Author: Steven Rostedt Date: Thu Nov 11 11:29:25 2010 -0500 staging: ft1000: Copy from user into correct data While doing a ktest.pl I used a MIN_CONFIG that had STAGING enabled, and a randconfig with CONFIG_DEBUG_STRICT_USER_COPY_CHECKS enabled caught the following bug: In file included from /home/rostedt/work/autotest/nobackup/linux-test.git/arch/x86/include/asm/uaccess.h:571:0, from /home/rostedt/work/autotest/nobackup/linux-test.git/include/linux/poll.h:14, from /home/rostedt/work/autotest/nobackup/linux-test.git/drivers/staging/ft1000/ft1000-usb/ft1000_chdev.c:32: In function 'copy_from_user', inlined from 'ft1000_ChIoctl' at /home/rostedt/work/autotest/nobackup/linux-test.git/drivers/staging/ft1000/ft1000-usb/ft1000_chdev.c:702:36: /home/rostedt/work/autotest/nobackup/linux-test.git/arch/x86/include/asm/uaccess_32.h:212:26: error: call to 'copy_from_user_overflow' declared with attribute error: copy_from_user() buffer size is not provably correct Looking at the code it was obvious what the problem was. The pointer dpram_data was being allocated but the address was being written to. Looking at the comment above the code shows that it use to write into an element of that pointer where the '&' is appropriate. But now that it writes to the pointer itself, we need to remove the '&' otherwise we write over the pointer and not into the data it points to. Signed-off-by: Steven Rostedt Cc: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit e72115bce326dc893bc1db96db72059a6a08148c Author: Marek Belisko Date: Fri Nov 12 10:27:44 2010 +0100 staging: ft1000: Fix error goto statements. With commit 2dab1ac81b4767095f96503a9ac093a68c6e9c95 there was intruduced error which lead to stopping uninitialized kthread which leads to kernel panics. This patch fix problems with common entry point in correct way. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 2018845b6a169f75341f8e68ad1089cb6697cf24 Author: Greg Kroah-Hartman Date: Tue Nov 16 11:23:33 2010 -0800 Staging: line6: fix up some sysfs attribute permissions They should not be writable by any user Reported-by: Linus Torvalds Cc: Markus Grabner Cc: Mariusz Kozlowski Cc: stable Signed-off-by: Greg Kroah-Hartman commit 0281b490dd7b96990724f4a15842c55657699aed Author: Greg Kroah-Hartman Date: Tue Nov 16 11:22:43 2010 -0800 Staging: zram: fix up some sysfs attribute permissions They should not be writable by any user Reported-by: Linus Torvalds Cc: Nitin Gupta Cc: Pekka Enberg Cc: stable Signed-off-by: Greg Kroah-Hartman commit cc9ca9dfddda46b1802d325891a69d7efdbe1f1e Author: Greg Kroah-Hartman Date: Tue Nov 16 11:21:36 2010 -0800 Staging: udlfb: fix up some sysfs attribute permissions They should not be writable by any user Reported-by: Linus Torvalds Cc: Bernie Thompson Cc: stable Signed-off-by: Greg Kroah-Hartman commit 90c05b97fdec8d2196e420d98f774bab731af7aa Author: Greg Kroah-Hartman Date: Tue Nov 16 11:21:03 2010 -0800 Staging: samsung-laptop: fix up some sysfs attribute permissions They should not be writable by any user Reported-by: Linus Torvalds Cc: stable Signed-off-by: Greg Kroah-Hartman commit 1d904e8950c86e670ace237eaea1d48cd81e94df Author: Greg Kroah-Hartman Date: Tue Nov 16 11:19:53 2010 -0800 Staging: iio: adis16220: fix up some sysfs attribute permissions They should not be writable by any user Reported-by: Linus Torvalds Cc: Jonathan Cameron Cc: Barry Song Cc: stable Signed-off-by: Greg Kroah-Hartman commit 3bad28ec006ad6ab2bca4e5103860b75391e3c9d Author: Greg Kroah-Hartman Date: Tue Nov 16 11:18:33 2010 -0800 Staging: frontier: fix up some sysfs attribute permissions They should not be writable by any user Reported-by: Linus Torvalds Cc: David Taht Cc: stable Signed-off-by: Greg Kroah-Hartman commit b178bb3dfc30d9555bdd2401e95af98e23e83e10 Author: Eric Dumazet Date: Tue Nov 16 05:56:04 2010 +0000 net: reorder struct sock fields Right now, fields in struct sock are not optimally ordered, because each path (RX softirq, TX completion, RX user, TX user) has to touch fields that are contained in many different cache lines. The really critical thing is to shrink number of cache lines that are used at RX softirq time : CPU handling softirqs for a device can receive many frames per second for many sockets. If load is too big, we can drop frames at NIC level. RPS or multiqueue cards can help, but better reduce latency if possible. This patch starts with UDP protocol, then additional patches will try to reduce latencies of other ones as well. At RX softirq time, fields of interest for UDP protocol are : (not counting ones in inet struct for the lookup) Read/Written: sk_refcnt (atomic increment/decrement) sk_rmem_alloc & sk_backlog.len (to check if there is room in queues) sk_receive_queue sk_backlog (if socket locked by user program) sk_rxhash sk_forward_alloc sk_drops Read only: sk_rcvbuf (sk_rcvqueues_full()) sk_filter sk_wq sk_policy[0] sk_flags Additional notes : - sk_backlog has one hole on 64bit arches. We can fill it to save 8 bytes. - sk_backlog is used only if RX sofirq handler finds the socket while locked by user. - sk_rxhash is written only once per flow. - sk_drops is written only if queues are full Final layout : [1] One section grouping all read/write fields, but placing rxhash and sk_backlog at the end of this section. [2] One section grouping all read fields in RX handler (sk_filter, sk_rcv_buf, sk_wq) [3] Section used by other paths I'll post a patch on its own to put sk_refcnt at the end of struct sock_common so that it shares same cache line than section [1] New offsets on 64bit arch : sizeof(struct sock)=0x268 offsetof(struct sock, sk_refcnt) =0x10 offsetof(struct sock, sk_lock) =0x48 offsetof(struct sock, sk_receive_queue)=0x68 offsetof(struct sock, sk_backlog)=0x80 offsetof(struct sock, sk_rmem_alloc)=0x80 offsetof(struct sock, sk_forward_alloc)=0x98 offsetof(struct sock, sk_rxhash)=0x9c offsetof(struct sock, sk_rcvbuf)=0xa4 offsetof(struct sock, sk_drops) =0xa0 offsetof(struct sock, sk_filter)=0xa8 offsetof(struct sock, sk_wq)=0xb0 offsetof(struct sock, sk_policy)=0xd0 offsetof(struct sock, sk_flags) =0xe0 Instead of : sizeof(struct sock)=0x270 offsetof(struct sock, sk_refcnt) =0x10 offsetof(struct sock, sk_lock) =0x50 offsetof(struct sock, sk_receive_queue)=0xc0 offsetof(struct sock, sk_backlog)=0x70 offsetof(struct sock, sk_rmem_alloc)=0xac offsetof(struct sock, sk_forward_alloc)=0x10c offsetof(struct sock, sk_rxhash)=0x128 offsetof(struct sock, sk_rcvbuf)=0x4c offsetof(struct sock, sk_drops) =0x16c offsetof(struct sock, sk_filter)=0x198 offsetof(struct sock, sk_wq)=0x88 offsetof(struct sock, sk_policy)=0x98 offsetof(struct sock, sk_flags) =0x130 Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit c31504dc0d1dc853dcee509d9999169a9097a717 Author: Eric Dumazet Date: Mon Nov 15 19:58:26 2010 +0000 udp: use atomic_inc_not_zero_hint UDP sockets refcount is usually 2, unless an incoming frame is going to be queued in receive or backlog queue. Using atomic_inc_not_zero_hint() permits to reduce latency, because processor issues less memory transactions. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 213b15ca818adf7766cd7162c2159a6ecdd3bab8 Author: Eric Dumazet Date: Thu Nov 11 09:42:45 2010 +0000 vlan: remove ndo_select_queue() logic Now vlan are lockless, we dont need special ndo_select_queue() logic. dev_pick_tx() will do the multiqueue stuff on the real device transmit. Suggested-by: Jesse Gross Signed-off-by: Eric Dumazet Acked-by: Patrick McHardy Signed-off-by: David S. Miller commit 590b0b9754bd8928926bae7194b6da7ead9bda3b Author: Greg Kroah-Hartman Date: Tue Nov 16 11:17:01 2010 -0800 Staging: asus_oled: fix up some sysfs attribute permissions They should not be writable by any user Reported-by: Linus Torvalds Cc: Jakub Schmidtke Cc: stable Signed-off-by: Greg Kroah-Hartman commit 4af429d29b341bb1735f04c2fb960178ed5d52e7 Author: Eric Dumazet Date: Wed Nov 10 23:42:00 2010 +0000 vlan: lockless transmit path vlan is a stacked device, like tunnels. We should use the lockless mechanism we are using in tunnels and loopback. This patch completely removes locking in TX path. tx stat counters are added into existing percpu stat structure, renamed from vlan_rx_stats to vlan_pcpu_stats. Note : this partially reverts commit 2e59af3dcbdf (vlan: multiqueue vlan device) Signed-off-by: Eric Dumazet Cc: Patrick McHardy Signed-off-by: David S. Miller commit 8ffab51b3dfc54876f145f15b351c41f3f703195 Author: Eric Dumazet Date: Wed Nov 10 21:14:04 2010 +0000 macvlan: lockless tx path macvlan is a stacked device, like tunnels. We should use the lockless mechanism we are using in tunnels and loopback. This patch completely removes locking in TX path. tx stat counters are added into existing percpu stat structure, renamed from rx_stats to pcpu_stats. Note : this reverts commit 2c11455321f37 (macvlan: add multiqueue capability) Note : rx_errors converted to a 32bit counter, like tx_dropped, since they dont need 64bit range. Signed-off-by: Eric Dumazet Cc: Patrick McHardy Cc: Ben Greear Cc: Ben Hutchings Acked-by: Patrick McHardy Signed-off-by: David S. Miller commit 491acf0032c08a74a4c88032ca1c03b498bfec37 Merge: 06fc8846a2c0ddcc51e6666a78fc29a8e749ca3b e53beacd23d9cb47590da6a7a7f6d417b941a994 Author: Greg Kroah-Hartman Date: Tue Nov 16 10:44:50 2010 -0800 Staging: Merge 2.6.37-rc2 into staging-next This was necessary in order to resolve some conflicts that happened between -rc1 and -rc2 with the following files: drivers/staging/bcm/Bcmchar.c drivers/staging/intel_sst/intel_sst_app_interface.c All should be resolved now. Signed-off-by: Greg Kroah-Hartman commit 133dc4c39c57eeef2577ca5b4ed24765b7a78ce2 Author: Ingo Molnar Date: Tue Nov 16 18:45:39 2010 +0100 perf: Rename 'perf trace' to 'perf script' Free the perf trace name space and rename the trace to 'script' which is a better match for the scripting engine. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner commit 0e3125c755445664f00ad036e4fc2cd32fd52877 Author: Neil Horman Date: Tue Nov 16 10:26:47 2010 -0800 packet: Enhance AF_PACKET implementation to not require high order contiguous memory allocation (v4) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Version 4 of this patch. Change notes: 1) Removed extra memset. Didn't think kcalloc added a GFP_ZERO the way kzalloc did :) Summary: It was shown to me recently that systems under high load were driven very deep into swap when tcpdump was run. The reason this happened was because the AF_PACKET protocol has a SET_RINGBUFFER socket option that allows the user space application to specify how many entries an AF_PACKET socket will have and how large each entry will be. It seems the default setting for tcpdump is to set the ring buffer to 32 entries of 64 Kb each, which implies 32 order 5 allocation. Thats difficult under good circumstances, and horrid under memory pressure. I thought it would be good to make that a bit more usable. I was going to do a simple conversion of the ring buffer from contigous pages to iovecs, but unfortunately, the metadata which AF_PACKET places in these buffers can easily span a page boundary, and given that these buffers get mapped into user space, and the data layout doesn't easily allow for a change to padding between frames to avoid that, a simple iovec change is just going to break user space ABI consistency. So I've done this, I've added a three tiered mechanism to the af_packet set_ring socket option. It attempts to allocate memory in the following order: 1) Using __get_free_pages with GFP_NORETRY set, so as to fail quickly without digging into swap 2) Using vmalloc 3) Using __get_free_pages with GFP_NORETRY clear, causing us to try as hard as needed to get the memory The effect is that we don't disturb the system as much when we're under load, while still being able to conduct tcpdumps effectively. Tested successfully by me. Signed-off-by: Neil Horman Acked-by: Eric Dumazet Acked-by: Maciej Å»enczykowski Reported-by: Maciej Å»enczykowski Signed-off-by: David S. Miller commit 020f01ebd04f3429c32586d90598c9f59e54ca7d Author: Joe Perches Date: Tue Nov 9 14:35:16 2010 +0000 drivers/isdn/mISDN: Use printf extension %pV Using %pV reduces the number of printk calls and eliminates any possible message interleaving from other printk calls. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 3654654f7aa79a37dde130afb7409c55b11807e7 Author: Jan Engelhardt Date: Tue Nov 16 09:52:32 2010 -0800 netlink: let nlmsg and nla functions take pointer-to-const args The changed functions do not modify the NL messages and/or attributes at all. They should use const (similar to strchr), so that callers which have a const nlmsg/nlattr around can make use of them without casting. While at it, constify a data array. Signed-off-by: Jan Engelhardt Signed-off-by: David S. Miller commit 9d82ca98f71fd686ef2f3017c5e3e6a4871b6e46 Author: John Fastabend Date: Mon Nov 15 20:29:21 2010 +0000 ipv6: fix missing in6_ifa_put in addrconf Fix ref count bug introduced by commit 2de795707294972f6c34bae9de713e502c431296 Author: Lorenzo Colitti Date: Wed Oct 27 18:16:49 2010 +0000 ipv6: addrconf: don't remove address state on ifdown if the address is being kept Fix logic so that addrconf_ifdown() decrements the inet6_ifaddr refcnt correctly with in6_ifa_put(). Reported-by: Stephen Hemminger Signed-off-by: John Fastabend Acked-by: Eric Dumazet Signed-off-by: David S. Miller commit b5e4156743c5d42b736936be7a9ee8d72e0e4ac9 Merge: 6b35308850e1679741e8b646cfb7bb3ab5369888 b1d771ee33c6e4006676002b9d74abf45b71d3d6 Author: David S. Miller Date: Tue Nov 16 09:17:12 2010 -0800 Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 commit 9e2e7422d059f9b98c3a0810df92a1ff660ade2f Author: Wey-Yi Guy Date: Fri Nov 12 13:52:37 2010 -0800 iwlwifi: set STATUS_READY before commit_rxon Have the STATUS_READY bit set before commit_rxon call to avoid fail to send tx power to uCode. Signed-off-by: Wey-Yi Guy commit 6163a3735aad19bdb8d02b3362d3a2d7d2eb78d5 Author: Shanyu Zhao Date: Fri Nov 12 13:48:13 2010 -0800 iwlagn: check change before commit RXON cmd When setting rxon chain and filter, no need to commit RXON when the chain flag is not changed. This reduces the number of RXON commands we send down to uCode. Signed-off-by: Shanyu Zhao Signed-off-by: Wey-Yi Guy commit 21a5b3c6b19a8b8972ccdd55389be28a8b7c9180 Author: Wey-Yi Guy Date: Wed Nov 10 13:32:59 2010 -0800 iwlagn: use SKU information in the EEPROM EEPROM contain the SKU information for the device, use it. Signed-off-by: Wey-Yi Guy commit f4115d46599464a49a3055d33d499d97ac81fccb Author: Shanyu Zhao Date: Wed Nov 10 18:25:58 2010 -0800 iwlagn: update QoS before commit associated RXON RXON command without association bit can clear the QoS info in the uCode. Therefore, before sending the associated RXON, we need to send the QoS command just in case. Signed-off-by: Shanyu Zhao Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit efe54db8233a4b41e68cbe67ca2e30c48532078a Author: Johannes Berg Date: Wed Nov 10 18:25:49 2010 -0800 iwlagn: fix PAN slot timing wrt. DTIM When the DTIM is not 1, then the slot timing is in some cases required to be calclulated based on the DTIM interval instead of the beacon interval, fix that. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit 2b5f7a679c2ae34407f6cc9387e77b563578bfdc Author: Johannes Berg Date: Wed Nov 10 18:25:48 2010 -0800 iwlagn: reprogram AP STA after assoc Instead of unconditionally sending unassoc RXON, before any assoc RXON, re-send only the AP STA entry which is required after the BSSID has been programmed into the device to set up internal filters in the microcode properly. This fixes some issues that we correlated with sending a lot of RXON commands to the device. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit 893654de3ff41a4f5037397d06a3f853bbbb3484 Author: Johannes Berg Date: Wed Nov 10 18:25:47 2010 -0800 iwlagn: avoid crash if vif is not assigned For reasons that aren't entirely clear to me, we sometimes get here during hardware reset without the interface being set. Don't crash, but keep a warning. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit cfa1da7e9133be9280990b2a64fa7696924c8d9a Author: Johannes Berg Date: Wed Nov 10 18:25:46 2010 -0800 iwlagn: fix PAN queues Currently, when a PAN queue needs to be stopped, we erroneously stop queue number 5 (for example) with mac80211 -- which doesn't even exist! To avoid that problem, recalculate the swq_id for all queues when setting up the queues, and don't use the default identity mapping that is acceptable for devices which don't support PAN. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit ea9b307f8e859186a6791e0d508c5993448ac900 Author: Johannes Berg Date: Wed Nov 10 18:25:45 2010 -0800 iwlwifi: always build swq_id as virtual queue ID Previously, we used the swq_id's mechanism to have AC and HW queue different only for aggregation queues. To be able to fix a bug with iPAN simply always build the swq_id as ac | (hwq << 2) and remove the flag bit. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit 549a04e092e5e043df82fd0541f3b67ab488359b Author: Johannes Berg Date: Wed Nov 10 18:25:44 2010 -0800 iwlwifi: pass txq to wake/stop queue Instead of passing the txq->swq_id, pass the txq struct directly to make sure that in the future nobody will pass an invalid number. Only three places actually change from using the txq_id or the skb's queue_mapping to now using txq->swq_id as well. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit 4bea9b990205e4a3d432d9d6c29687215618a306 Author: Johannes Berg Date: Wed Nov 10 18:25:43 2010 -0800 iwlagn: remove a bogus AGG_OFF check Even if this check were to happen, using the txq_id here (which is a HW queue) would lead to confusion in mac80211. Luckily, it doesn't seem like this can ever happen. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit 8d56396ac3926412dd97dcb9dd8d0cef556b908e Author: Johannes Berg Date: Wed Nov 10 18:25:42 2010 -0800 iwlagn: remove unused variable swq_id Simply remove the unused variable swq_id. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit 76f379cec6df6c9c5c9dbf7377d1bbbb0bf3fd5f Author: Johannes Berg Date: Wed Nov 10 18:25:41 2010 -0800 iwlagn: fix some naming regarding FIFOs Some variables are misnamed in the FIFO setup code, fix that. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy commit 564b344c10b694d433cef5b89f8ff8ac5e33898d Author: Wey-Yi Guy Date: Tue Nov 9 09:21:34 2010 -0800 iwlwifi: change default led mode for different devices Set the default led mode for different devices. For the newer devices such as 6000g2a, 6000g2b and newer, the default led mode is On/Off instead of blinking. The led_mode still can be control through module parameter 0: system default 1: On/Off 2: blinking Signed-off-by: Wey-Yi Guy commit 05433df23cf16a9ccbdd35964aba781cdf455034 Author: Wey-Yi Guy Date: Mon Nov 8 12:37:20 2010 -0800 iwlagn: change default ACK/CTS MASK setting for WiFi/BT coex Change the default BT_KILL_ACK_MASK and BT_KILL_CTS_MASK for BT coex Signed-off-by: Wey-Yi Guy commit 66e863a527f9ed3a871797862aaf0d62b0954813 Author: Wey-Yi Guy Date: Mon Nov 8 14:54:37 2010 -0800 iwlagn: support dynamic aggregation for BT coex Use dynamic aggregation threshold if bt traffic load is high to reduce the impact on aggregated frame. Signed-off-by: Wey-Yi Guy commit 95a5ede3ee9269e175bfe0e6f5a4a5fd2914ed6a Author: Wey-Yi Guy Date: Mon Nov 8 14:55:43 2010 -0800 iwlagn: set dynamic aggregation threshold for BT Setting the max/min/def value for BT dynamic aggregation threshold. Signed-off-by: Wey-Yi Guy commit 8829c9e2ec144baeb3cee599e1e653a396ad521b Author: Wey-Yi Guy Date: Wed Nov 10 11:05:38 2010 -0800 iwlagn: used frame count info in compressed ba packet For newer devices, uCode provide both "number of frames sent" and "number of frames acked" information inside the compressed_ba packet. So instead of figure the success/failure information through the bitmap, use those information which is much betrer approach. Signed-off-by: Wey-Yi Guy commit 27d29dc4be07aafae270992f8d6e400f8912a33d Merge: 936fc42831aa351974b707c00b9e67ac81cd530f 640dcfa0ff49ea1fcddad39e7c468683d9f00342 4232f60791d12a5156c3e1c9b04ae08b873a2920 Author: Paul Mundt Date: Tue Nov 16 16:25:35 2010 +0900 Merge branches 'rmobile/fbdev' and 'common/fbdev-edid' of master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6 commit 936fc42831aa351974b707c00b9e67ac81cd530f Merge: 12ddf37444eaaf67b147561141150e10a56d7742 0ad83f6882c41df1a7fa387086029e162038c1f2 Author: Paul Mundt Date: Tue Nov 16 16:25:03 2010 +0900 Merge branch 'fbdev/edid' commit 6d72ad35f1bfaf6e52ca7133cb51ce0e36f17528 Author: Paul Mundt Date: Tue Nov 16 16:10:20 2010 +0900 ARM: mach-shmobile: Tidy up the Kconfig bits. Presently each one of the CPUs manually selects the same feature set, and there's a reasonable expectation that none of these will change for future CPUs in the SH-Mobile / R-Mobile family, so we move those over to the top-level ARCH_SHMOBILE. While we're at it, all of the CPUs support optional GPIOs via the PFC, do not have I/O ports, and expect sparse IRQ, so we bring the configuration in line across the board. This more or less brings the ARM-based parts in sync with their SH counterparts. Signed-off-by: Paul Mundt commit 96f8d864afd646e4a52ea55462b7d83e3b94fd5c Author: Paul Mundt Date: Tue Nov 16 14:00:24 2010 +0900 fbdev: move udlfb out of staging. udlfb has undergone a fair bit of cleanup recently and is effectively at the point where it can be liberated from staging purgatory and promoted to a real driver. The outstanding cleanups are all minor, with some of them dependent on drivers/video headers, so these will be done incrementally from udlfb's new home. Requested-by: Bernie Thompson Signed-off-by: Paul Mundt commit 6b35308850e1679741e8b646cfb7bb3ab5369888 Author: David S. Miller Date: Mon Nov 15 20:15:03 2010 -0800 net: Export netif_get_vlan_features(). ERROR: "netif_get_vlan_features" [drivers/net/xen-netfront.ko] undefined! Reported-by: Stephen Rothwell Signed-off-by: David S. Miller commit 1f4f067f99cbb2af7af7a67bd025a9fb58b5156c Author: Vasanthy Kolluri Date: Mon Nov 15 08:09:55 2010 +0000 enic: Fix build warnings Fix data type of argument passed to pci_alloc_consistent and pci_free_consistent routines. Signed-off-by: Vasanthy Kolluri Signed-off-by: Roopa Prabhu Signed-off-by: David Wang Signed-off-by: David S. Miller commit ce5a121304af02d02489e86efb6ae26a67f95e52 Author: Alan Cox Date: Mon Nov 15 07:30:42 2010 +0000 hso: Fix unused variable warning Fallout from the TIOCGICOUNT work Signed-off-by: Alan Cox Signed-off-by: David S. Miller commit ec1e5610c00c7f5bc530d2aadd47faa473b90a30 Author: Eric Dumazet Date: Mon Nov 15 06:38:14 2010 +0000 bridge: add RCU annotations to bridge port lookup br_port_get() renamed to br_port_get_rtnl() to make clear RTNL is held. Signed-off-by: Eric Dumazet Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller commit b5ed54e94d324f17c97852296d61a143f01b227a Author: stephen hemminger Date: Mon Nov 15 06:38:13 2010 +0000 bridge: fix RCU races with bridge port The macro br_port_exists() is not enough protection when only RCU is being used. There is a tiny race where other CPU has cleared port handler hook, but is bridge port flag might still be set. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller commit 61391cde9eefac5cfcf6d214aa80c77e58b1626b Author: stephen hemminger Date: Mon Nov 15 06:38:12 2010 +0000 netdev: add rcu annotations to receive handler hook Suggested by Eric's bridge RCU changes. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller commit a386f99025f13b32502fe5dedf223c20d7283826 Author: Eric Dumazet Date: Mon Nov 15 06:38:11 2010 +0000 bridge: add proper RCU annotation to should_route_hook Add br_should_route_hook_t typedef, this is the only way we can get a clean RCU implementation for function pointer. Move route_hook to location where it is used. Signed-off-by: Eric Dumazet Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller commit e80516880019aa1f7c5c410276edfea9575ec89f Author: Eric Dumazet Date: Mon Nov 15 06:38:10 2010 +0000 bridge: add RCU annotation to bridge multicast table Add modern __rcu annotatations to bridge multicast table. Use newer hlist macros to avoid direct access to hlist internals. Signed-off-by: Eric Dumazet Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller commit 8a22c99a80b0926585cfcbcc423ee2c49c1fd820 Author: Joe Perches Date: Sun Nov 14 17:05:00 2010 +0000 net/ipv6/mcast.c: Remove unnecessary semicolons Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit d577f1ccdd8ae8bfbe6063eb2ba2a350259e9031 Author: Joe Perches Date: Sun Nov 14 17:04:58 2010 +0000 include/net/caif/cfctrl.h: Remove unnecessary semicolons Signed-off-by: Joe Perches Acked-by: Sjur Braendeland Signed-off-by: David S. Miller commit c59504ebc5baa628706d10c2d3c7e1f4bc3c2147 Author: Joe Perches Date: Sun Nov 14 17:04:57 2010 +0000 include/linux/if_macvlan.h: Remove unnecessary semicolons Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 779bb41d4bd111d5631d58d1bf2d00b5c4389c80 Author: Joe Perches Date: Sun Nov 14 17:04:37 2010 +0000 drivers/net/cnic.c: Remove unnecessary semicolons Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit e81a1ba815666ec02ef5bf0e17cf256c88d233b3 Author: Joe Perches Date: Sun Nov 14 17:04:33 2010 +0000 drivers/net/ixgbe: Remove unnecessary semicolons Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 1d51c4185bb369cb39ed8cc20b331508e47b35b2 Author: Joe Perches Date: Sun Nov 14 17:04:32 2010 +0000 drivers/net/e1000e: Remove unnecessary semicolons Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 6f38ad93e4882e84c1cc113736db7dc9252dcf11 Author: Joe Perches Date: Sun Nov 14 17:04:31 2010 +0000 drivers/net/bnx2x: Remove unnecessary semicolons Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit ad65ffd12dccf6d1031298eacc060327751084da Author: Joe Perches Date: Sun Nov 14 17:04:26 2010 +0000 drivers/isdn: Remove unnecessary semicolons Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 6c1b6c6b873d66d353ef47a054156dfde3f4c075 Merge: fe8222406c8277a21172479d3a8283d31c209028 7e87fe84303cc54ecf3c7b688cb08ca24322a41d Author: David S. Miller Date: Mon Nov 15 10:59:49 2010 -0800 Merge branch 'dccp' of git://eden-feed.erg.abdn.ac.uk/net-next-2.6 commit fe8222406c8277a21172479d3a8283d31c209028 Author: Tom Herbert Date: Tue Nov 9 10:47:38 2010 +0000 net: Simplify RX queue allocation This patch move RX queue allocation to alloc_netdev_mq and freeing of the queues to free_netdev (symmetric to TX queue allocation). Each kobject RX queue takes a reference to the queue's device so that the device can't be freed before all the kobjects have been released-- this obviates the need for reference counts specific to RX queues. Signed-off-by: Tom Herbert Signed-off-by: David S. Miller commit ed9af2e839c06c18f721da2c768fbb444c4a10e5 Author: Tom Herbert Date: Tue Nov 9 10:47:30 2010 +0000 net: Move TX queue allocation to alloc_netdev_mq TX queues are now allocated in alloc_netdev_mq and freed in free_netdev. Signed-off-by: Tom Herbert Signed-off-by: David S. Miller commit cc9ff19da9bf76a2f70bcb80225a1c587c162e52 Author: Timo Teräs Date: Wed Nov 3 04:41:38 2010 +0000 xfrm: use gre key as flow upper protocol info The GRE Key field is intended to be used for identifying an individual traffic flow within a tunnel. It is useful to be able to have XFRM policy selector matches to have different policies for different GRE tunnels. Signed-off-by: Timo Teräs Signed-off-by: David S. Miller commit e1f2d8c2cc61d2b9472efe44e8a2b098336914b4 Author: David S. Miller Date: Mon Nov 15 10:37:30 2010 -0800 vlan: Fix build warning in vlandev_seq_show() net/8021q/vlanproc.c: In function 'vlandev_seq_show': net/8021q/vlanproc.c:283:20: warning: unused variable 'fmt' Signed-off-by: David S. Miller commit b1d771ee33c6e4006676002b9d74abf45b71d3d6 Author: Christian Lamparter Date: Fri Oct 29 23:11:23 2010 +0200 carl9170: use generic sign_extend32 This patch replaces the handcrafted sign extension cruft with a generic bitop function. Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit 7919a57bc608140aa8614c19eac40c6916fb61d2 Author: Andreas Herrmann Date: Mon Aug 30 19:04:01 2010 +0000 bitops: Provide generic sign_extend32 function This patch moves code out from wireless drivers where two different functions are defined in three code locations for the same purpose and provides a common function to sign extend a 32-bit value. Signed-off-by: Andreas Herrmann Signed-off-by: John W. Linville commit e4b3fdb80021bc0a3239bfc2a873a6d7c6ac52a1 Author: Grazvydas Ignotas Date: Thu Nov 4 00:13:49 2010 +0200 wl1251: use wl12xx_platform_data to pass data Make use the newly added method to pass platform data for wl1251 too. This allows to eliminate some redundant code. Cc: Ohad Ben-Cohen Signed-off-by: Grazvydas Ignotas Acked-by: Kalle Valo Acked-by: Luciano Coelho Acked-by: Tony Lindgren Signed-off-by: John W. Linville commit 1d4b89f2970f9ea0902d0a3bc1090f3c770b5080 Author: Grazvydas Ignotas Date: Mon Nov 8 15:29:36 2010 +0200 wl1251: add runtime PM support for SDIO Add runtime PM support, similar to how it's done for wl1271. This allows to power down the card when the driver is loaded but network is not in use. Cc: Ohad Ben-Cohen Signed-off-by: Grazvydas Ignotas Acked-by: Kalle Valo Signed-off-by: John W. Linville commit cb7bbc7a5535ab2333915b83391e1d846a0914df Author: Grazvydas Ignotas Date: Thu Nov 4 00:13:47 2010 +0200 wl1251: add power callback to wl1251_if_operations Call interface specific power callback before calling board specific one. Also allow that callback to fail. This is how it's done for wl1271 and will be used for runtime_pm support. Signed-off-by: Grazvydas Ignotas Acked-by: Kalle Valo Signed-off-by: John W. Linville commit f81c1f48384d398dbe8f6c5b10377c7158086791 Author: Wey-Yi Guy Date: Wed Nov 10 09:56:50 2010 -0800 iwlagn: enable shadow register For 6000 series devices and up, enable automatic update MAC's register for better power usage in PSP mode Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 6fe8efb2211fe61caa7b0e1c36c521670b8a10a9 Author: Shanyu Zhao Date: Wed Nov 10 09:56:49 2010 -0800 iwlwifi: disable disconnected antenna for advanced bt coex Disconnected antenna algorithm is used to find out which antennas are disconnected. It should be disabled for devices that support advanced bluetooth coexist. Signed-off-by: Shanyu Zhao Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 3031242b31dcd76e1c6b1c1718cfee872f55d5af Author: Shanyu Zhao Date: Wed Nov 10 09:56:48 2010 -0800 iwlwifi: seperate disconnected antenna function Disconnected antenna algorithm is seperated into its own function from chain noise calibration routine for better code management. Signed-off-by: Shanyu Zhao Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit b2769b84d86a2d29fa131a763d2b23b112834420 Author: Johannes Berg Date: Wed Nov 10 09:56:47 2010 -0800 iwlagn: fix RXON HT When the HT information is changed due to BSS changes (like legacy stations joining) we need to recalculate HT RXON parameters. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 8da8e62851680772f0422d0f1c4b467190b268e5 Author: Johannes Berg Date: Wed Nov 10 09:56:46 2010 -0800 iwlagn: re-enable calibration During the RXON rewrite, this code got lost. When we've just associated, we need to enable all calibrations and see if some were already finished. Add back the missing code. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 52d980c01353202332ff4322f3f41db0c49816a5 Author: Johannes Berg Date: Wed Nov 10 09:56:45 2010 -0800 iwlagn: fix RXON issues The RXON rework resulted in a massive loss of throughput because we weren't programming the device completely correctly -- the BSSID has to be programmed into the device before the AP station is uploaded. To fix this, simply always send the unassoc RXON, i.e. even when it was already unassoc so that the BSSID and some other parameters are updated properly. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 2e1fea43aa170e18beb8378465e595e18cd08f6e Author: Johannes Berg Date: Wed Nov 10 09:56:44 2010 -0800 iwlagn: fix needed chains calculation Garen noticed that this was wrong. Fix the calibration -- default to multiple chains and fall back to single where possible. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 35a6eb36520b938742d8680fd8d821df20982ced Author: Wey-Yi Guy Date: Wed Nov 10 09:56:43 2010 -0800 iwlwifi: resending QoS command when HT changes "mac80211: Fix WMM driver queue configuration" inadvertedly broke iwlwifi, because now mac80211 configures the QoS settings before assoc, and therefore before HT. Thus, iwlwifi no longer told the device about the HT setting, which it needs to -- and thus throughput went down a lot. Fix this by resending the QoS command to the device not only when QoS/WMM settings change, but also when HT changes. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit fd11743dd25efe7157ff17b03dd2db0cbb6fed05 Author: Winkler, Tomas Date: Wed Nov 10 09:56:42 2010 -0800 iwlwlifi: update rx write pointer w/o request mac access in the CAM mode In iwl_rx_queue_update_write_ptr function replace iwl_write_direct32 with iwl_write32 when not in power save mode. We don't have to go through grab nic access as the NIC is already awake. Signed-off-by: Tomas Winkler Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 708068db4c09f93937a6a83ac8fff8516f482b0f Author: Wey-Yi Guy Date: Wed Nov 10 09:56:41 2010 -0800 iwlwifi: legacy tx_cmd_protection function Legacy (4965 and 3945) devices has different tx_cmd_protection routine. Move to iwl-legacy.c Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit e39fdee1d7856817619326fa114438c146d74510 Author: Wey-Yi Guy Date: Wed Nov 10 09:56:40 2010 -0800 iwlwifi: put all the isr related function under ops There were two type of isr supported by iwlwifi devices. legacy isr - only used by legacy devices (3945 & 4965) ict isr - used by all new generation of iwlwifi devices Move all the isr related functions into ops, the ict type of isr supports only needed for newer devices. Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 81baf6ec9c190ae128748cf2a026bff5cb811b70 Author: Wey-Yi Guy Date: Wed Nov 10 09:56:39 2010 -0800 iwlwifi: Legacy isr only used by legacy devices Move iwl_isr_legacy function to iwl_legacy.c since it only used by legacy devices. Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit ae79d23d0b2c16998e60f49a16dae53521c76a45 Author: Johannes Berg Date: Wed Nov 10 09:56:38 2010 -0800 iwlagn: fix non-5000+ build When building 4965 without 5000+ there were a lot of build errors due to functions being used that weren't even compiled in. To fix this move some code around and only compile the HCMD code for 5000+ series as it's not used for 4965. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 2a21ff446c07b95d08cbb830bd20112f3ee1d76e Author: Wey-Yi Guy Date: Wed Nov 10 09:56:37 2010 -0800 iwlagn: update PCI ID for 100 series devices Update the supported PCI ID list for 100 series devices Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit fb30eaf38703d7562606e49a5872745d66366a50 Author: Wey-Yi Guy Date: Wed Nov 10 09:56:36 2010 -0800 iwlagn: update PCI ID for 6000g2a series devices Update the supported PCI ID list for 6000g2a series devices Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 8b37d9f0a1e114a1c7f5082842fb310a81ea3732 Author: Wey-Yi Guy Date: Wed Nov 10 09:56:35 2010 -0800 iwlagn: update PCI ID for 6000g2b series devices Update the supported PCI ID list for 6000g2b series devices Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 5d882c97e2c958df9f8b78832fa1ecbecef6ea1d Author: Ben Greear Date: Mon Nov 8 10:50:03 2010 -0800 ath5k: Print stats as unsigned ints. The debugfs code for ath5k was printing some unsigned int stats with %d instead of %u. This meant that you could see negative numbers instead of a clean wrap. Signed-off-by: Ben Greear Signed-off-by: John W. Linville commit 8c5765fda4b382acce4ff386e18ec11790dff893 Author: Ivo van Doorn Date: Sat Nov 6 15:49:01 2010 +0100 rt2x00: Add watchdog functions for HW queue Add watchdog functions for managing the Queues inside the hardware. Normally the driver doesn't have much to do with these queues directly, but the Ralink drivers did implement watchdog functions for these. These watchdog functions are not triggered that often, compared to the other watchdog functions, but I have at least seen them trigger once or twice during a long stresstest run. v2: Add extra documentation for register fields Signed-off-by: Ivo van Doorn Acked-by: Gertjan van Wingerde Signed-off-by: John W. Linville commit ea175ee26268370ca07aff91cf6ba1e0f1a3bd36 Author: Ivo van Doorn Date: Sat Nov 6 15:48:43 2010 +0100 rt2x00: Remove rt2x00lib_toggle_rx As part of the queue refactoring, the rt2x00lib_toggle_rx can be removed and replaced with the call directly to the set_device_state callback function. We can remove the STATE_RADIO_RX_ON_LINK and STATE_RADIO_RX_OFF_LINK, as it was only used for special behavior inside rt2x00lib rather then the drivers. Signed-off-by: Ivo van Doorn Acked-by: Gertjan van Wingerde Signed-off-by: John W. Linville commit 8be4eed0ea7d8ef38692de878043a949e9db16e8 Author: Ivo van Doorn Date: Sat Nov 6 15:48:23 2010 +0100 rt2x00: Fix rt2x00queue_kick_tx_queue arguments The queue_entry argument to rt2x00queue_kick_tx_queue, doesn't make sense due to the function name (it is called kick QUEUE)... But neither do we need the queue_entry, since we need the data_queue. Signed-off-by: Ivo van Doorn Acked-by: Helmut Schaa Acked-by: Gertjan van Wingerde Signed-off-by: John W. Linville commit 813f0339dd739c48607f12dac79ec26c61874226 Author: Ivo van Doorn Date: Sat Nov 6 15:48:05 2010 +0100 rt2x00: Rename queue->lock to queue->index_lock The queue->lock is only used to protect the index numbers. Rename the lock accordingly. Signed-off-by: Ivo van Doorn Acked-by: Gertjan van Wingerde Signed-off-by: John W. Linville commit 821cde63b5bd04bc3ca0f95e2abf17b04e640488 Author: Mark Einon Date: Sat Nov 6 15:47:46 2010 +0100 rt2x00: checkpatch.pl error fixes for rt73usb.c rt73usb.c:43: ERROR: do not initialise statics to 0 or NULL Signed-off-by: Mark Einon Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit f8bfbc31794635f6d0b7fd30950d49cecf54e1ce Author: Mark Einon Date: Sat Nov 6 15:47:25 2010 +0100 rt2x00: checkpatch.pl error fixes for rt2x00queue.c rt2x00queue.c:804: ERROR: space prohibited after that open parenthesis '(' rt2x00queue.c:805: ERROR: space prohibited before that close parenthesis ')' Signed-off-by: Mark Einon Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 027e8fd105c82956de9dec232bad21b1628ee7c0 Author: Mark Einon Date: Sat Nov 6 15:47:09 2010 +0100 rt2x00: checkpatch.pl error fixes for rt2x00link.c rt2x00link.c:70: ERROR: space prohibited before that close parenthesis ')' Signed-off-by: Mark Einon Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 5f181dc16bbd13b68b54ed5c43c4d2c5ad00297b Author: Mark Einon Date: Sat Nov 6 15:46:53 2010 +0100 rt2x00: checkpatch.pl error fixes for rt2x00lib.h rt2x00lib.h:60: ERROR: space prohibited after that open parenthesis '(' rt2x00lib.h:60: ERROR: space prohibited before that close parenthesis ')' Signed-off-by: Mark Einon Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit c2361baec100c6f373107346e3fd98e9b267ac6c Author: Mark Einon Date: Sat Nov 6 15:46:36 2010 +0100 rt2x00: checkpatch.pl error fixes for rt2x00dev.c rt2x00dev.c:689: ERROR: spaces required around that '=' (ctx:WxV) Signed-off-by: Mark Einon Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 8a239033c355be998b8985f12f0cc3a9eaeb93e9 Author: Mark Einon Date: Sat Nov 6 15:46:17 2010 +0100 rt2x00: checkpatch.pl error fixes for rt2x00config.c rt2x00config.c:136: ERROR: space required before the open parenthesis '(' Signed-off-by: Mark Einon Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 87a46caf920515eb269df0109f0a61a958236568 Author: Mark Einon Date: Sat Nov 6 15:45:58 2010 +0100 rt2x00: checkpatch.pl error fixes for rt2800usb.h rt2800usb.h:43: ERROR: space prohibited after that open parenthesis '(' rt2800usb.h:43: ERROR: space prohibited before that close parenthesis ')' rt2800usb.h:44: ERROR: space prohibited after that open parenthesis '(' rt2800usb.h:44: ERROR: space prohibited before that close parenthesis ')' Signed-off-by: Mark Einon Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 144b80bc05e76df0acb8b5e86a6e6aaf0c53325e Author: Mark Einon Date: Sat Nov 6 15:45:41 2010 +0100 rt2x00: checkpatch.pl error fixes for rt2800usb.c rt2800usb.c:48: ERROR: do not initialise statics to 0 or NULL Signed-off-by: Mark Einon Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit c6cbadeb3afd9471e539791842877d085f367746 Author: Mark Einon Date: Sat Nov 6 15:45:22 2010 +0100 rt2x00: checkpatch.pl error fixes for rt2800pci.h rt2800pci.h:41: ERROR: Macros with complex values should be enclosed in parenthesis rt2800pci.h:42: ERROR: Macros with complex values should be enclosed in parenthesis rt2800pci.h:43: ERROR: Macros with complex values should be enclosed in parenthesis rt2800pci.h:44: ERROR: Macros with complex values should be enclosed in parenthesis rt2800pci.h:55: ERROR: space prohibited after that open parenthesis '(' rt2800pci.h:55: ERROR: space prohibited before that close parenthesis ')' rt2800pci.h:56: ERROR: space prohibited after that open parenthesis '(' rt2800pci.h:56: ERROR: space prohibited before that close parenthesis ')' Signed-off-by: Mark Einon Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit bf1b15125e2aa245ddd9348f80d041d4f1fd13a9 Author: Mark Einon Date: Sat Nov 6 15:45:06 2010 +0100 rt2x00: checkpatch.pl error fixes for rt2800lib.c rt2800lib.c:831: ERROR: inline keyword should sit between storage class and type Signed-off-by: Mark Einon Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit fd8dab9a67b22c35f38f0f5bfff4b3f6ed02e43a Author: Mark Einon Date: Sat Nov 6 15:44:52 2010 +0100 rt2x00: checkpatch.pl error fixes for rt2800.h rt2800.h:1511: ERROR: space prohibited after that open parenthesis '(' rt2800.h:1511: ERROR: space prohibited before that close parenthesis ')' rt2800.h:1513: ERROR: space prohibited after that open parenthesis '(' rt2800.h:1513: ERROR: space prohibited before that close parenthesis ')' rt2800.h:1515: ERROR: space prohibited after that open parenthesis '(' rt2800.h:1515: ERROR: space prohibited before that close parenthesis ')' rt2800.h:1517: ERROR: space prohibited after that open parenthesis '(' rt2800.h:1517: ERROR: space prohibited before that close parenthesis ')' rt2800.h:1519: ERROR: space prohibited after that open parenthesis '(' rt2800.h:1519: ERROR: space prohibited before that close parenthesis ')' rt2800.h:1521: ERROR: space prohibited after that open parenthesis '(' rt2800.h:1521: ERROR: space prohibited before that close parenthesis ')' rt2800.h:1661: ERROR: space prohibited after that open parenthesis '(' rt2800.h:1661: ERROR: space prohibited before that close parenthesis ')' rt2800.h:1662: ERROR: space prohibited after that open parenthesis '(' rt2800.h:1662: ERROR: space prohibited before that close parenthesis ')' rt2800.h:1663: ERROR: space prohibited before that close parenthesis ')' rt2800.h:2013: ERROR: space prohibited after that open parenthesis '(' rt2800.h:2013: ERROR: space prohibited before that close parenthesis ')' rt2800.h:2014: ERROR: space prohibited after that open parenthesis '(' rt2800.h:2014: ERROR: space prohibited before that close parenthesis ')' Signed-off-by: Mark Einon Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit cf553477a4dfb819c66ebfcad9f3b5cc3b93a9af Author: Mark Einon Date: Sat Nov 6 15:44:33 2010 +0100 rt2x00: checkpatch.pl error fixes for rt2500usb.c rt2500usb.c:42: ERROR: do not initialise statics to 0 or NULL Signed-off-by: Mark Einon Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit cb771b1a5de81e3ee59bd8b7ed17da6d09ffcf68 Author: Mark Einon Date: Sat Nov 6 15:44:15 2010 +0100 rt2x00: checkpatch.pl error fixes for rt2500pci.h rt2500pci.h:1091: ERROR: space prohibited after that open parenthesis '(' rt2500pci.h:1091: ERROR: space prohibited before that close parenthesis ')' rt2500pci.h:1092: ERROR: space prohibited after that open parenthesis '(' rt2500pci.h:1092: ERROR: space prohibited before that close parenthesis ')' Signed-off-by: Mark Einon Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 46b9786975a69a75f25b71796f7e36d203fbd4ee Author: Mark Einon Date: Sat Nov 6 15:44:00 2010 +0100 rt2x00: checkpatch.pl error fixes for rt2400pci.h rt2400pci.h:812: ERROR: space prohibited after that open parenthesis '(' rt2400pci.h:812: ERROR: space prohibited before that close parenthesis ')' rt2400pci.h:813: ERROR: space prohibited after that open parenthesis '(' rt2400pci.h:813: ERROR: space prohibited before that close parenthesis ')' rt2400pci.h:950: ERROR: Macros with complex values should be enclosed in parenthesis Signed-off-by: Mark Einon Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 041fb8f504fb0a6b61bc2131679da554b2fa8c9d Author: Christian Lamparter Date: Sat Nov 6 14:07:10 2010 +0100 carl9170: tx path review This patch fixes a few shortcomings in the tx path. * move temp. ampdu_[ack]_len out of txinfo->pad. * fix WARN_ON from tx.c:line 300 when tx_ampdu_queue fails to queue the frame. * In tx_prepare, we already have a local pointer to the station's ieee80211_sta struct. * remove a second !sta check, tx_prepare already takes care of that. Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit ffa56e540c3949c4560dcce45eca247819e183c1 Author: Jesper Juhl Date: Thu Nov 4 22:59:56 2010 +0100 mac80211: Remove redundant checks for NULL before calls to crypto_free_cipher() crypto_free_cipher() is a wrapper around crypto_free_tfm() which is a wrapper around crypto_destroy_tfm() and the latter can handle being passed a NULL pointer, so checking for NULL in the ieee80211_aes_key_free()/ieee80211_aes_cmac_key_free() wrappers around crypto_free_cipher() is pointless and just increase object code size needlesly and makes us execute extra test/branch instructions that we don't need. Btw; don't we have to many wrappers around wrappers ad nauseam here? Anyway, this patch removes the redundant conditionals. Signed-off-by: Jesper Juhl Signed-off-by: John W. Linville commit 723fc7af5300dba9eac40cb23dbefa67589e5181 Author: Lalith Suresh Date: Thu Nov 4 20:43:16 2010 +0100 rt2x00: Fix comments in rt73usb.h and rt61pci.h This patch fixes a few comments in rt73usb.h and rt61pci.h. Signed-off-by: Lalith Suresh Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit fa8b4b22d543b4052602b0c86065150613ed19e8 Author: Helmut Schaa Date: Thu Nov 4 20:42:36 2010 +0100 rt2x00: Fix hw crypto in AP mode for some devices The BSSID register shouldn't be set in AP mode on some older devices (like rt73usb) as it breaks hw crypto on these. However, rt2800 devices explicitly need the BSSID register set to the same value as our own MAC address (only in AP mode). Hence, don't set the BSSID from rt2x00lib but move it down into rt2800 to avoid problems on older devices. This fixes a regression (at least for rt73usb) and avoids a new regression for rt2800 devices in 2.6.36. Reported-by: Johannes Stezenbach Reported-by: Lee Signed-off-by: Helmut Schaa Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 070192dd2975c0e97bbdeac7623b755235c6db7d Author: Ivo van Doorn Date: Thu Nov 4 20:41:05 2010 +0100 rt2x00: Fix crash on USB unplug By not scheduling the TX/RX completion worker threads when Radio is disabled, or hardware has been unplugged, the queues cannot be completely cleaned. This causes crashes when the hardware has been unplugged while the radio is still enabled. Signed-off-by: Ivo van Doorn Acked-by: Gertjan van Wingerde Signed-off-by: John W. Linville commit 303c7d6abfd0430e39e84a43361492b4a8c890b6 Author: Ivo van Doorn Date: Thu Nov 4 20:40:46 2010 +0100 rt2x00: Fix MCU_SLEEP arguments Legacy driver uses 0xff as the second argument for the MCU_SLEEP command. It is still unknown what the values actually mean, but this will at least keep the command in-sync with the original driver. Signed-off-by: Ivo van Doorn Acked-by: Gertjan van Wingerde Signed-off-by: John W. Linville commit f44df18c58d4debe3ec0bb76a490aa2f3929fd8b Author: Ivo van Doorn Date: Thu Nov 4 20:40:11 2010 +0100 rt2x00: Implement flush callback Implement a basic flush callback function, which simply loops over all TX queues and waits until all frames have been transmitted and the status reports have been gathered. At this moment we don't support dropping any frames during the flush, but mac80211 will only send 'false' for this argument anyway, so this is not important at this time. Signed-off-by: Ivo van Doorn Acked-by: Helmut Schaa Acked-by: Gertjan van Wingerde Signed-off-by: John W. Linville commit aaf886bd215396f295bc0489e8ae09d1c03d9aa0 Author: Ivo van Doorn Date: Thu Nov 4 20:39:48 2010 +0100 rt2x00: Remove failsave from rt2x00usb_watchdog_tx_dma When the TX status handler failed to clear the queue in rt2x00usb_watchdog_tx_dma() we shouldn't use a failsave to use the rt2x00usb txdone handler. If a driver has overriden the txdone handler it must make sure the txdone handler is capable of cleaning up the queue itself. Signed-off-by: Ivo van Doorn Acked-by: Gertjan van Wingerde Signed-off-by: John W. Linville commit 7225ce1ea93d24c0914eea0410dcfc426281f996 Author: Ivo van Doorn Date: Thu Nov 4 20:39:23 2010 +0100 rt2x00: Rename rt2x00queue_timeout Rename rt2x00queue_timeout to rt2x00queue_status_timeout to better describe what is actually timing out (note that we already have a rt2x00queue_dma_timeout). Signed-off-by: Ivo van Doorn Acked-by: Helmut Schaa Acked-by: Gertjan van Wingerde Signed-off-by: John W. Linville commit e2f8c8752b994026fc0ddb4bb29ca229b3e0c104 Author: Helmut Schaa Date: Thu Nov 4 20:38:56 2010 +0100 rt2x00: Optimize rt2x00debug_dump_frame when frame dumping is not active When rt2x00 is compiled with debugging but frame dumping is currently not active we can avoid the call to do_gettimeofday. Furthermore, frame dumping is not the default case, mark it as unlikely. Signed-off-by: Helmut Schaa Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 2b23cdaa3b0e9567597563e5a7a5103ecda447f0 Author: Helmut Schaa Date: Thu Nov 4 20:38:15 2010 +0100 rt2x00: Reduce tx descriptor size The tx descriptor values qid, cw_min, cw_max and aifs are directly accessible through the tx entry struct. So there's no need to copy them into the tx descriptor and passing them to the indiviual drivers. Instead we can just get the correct value from the tx entry. Signed-off-by: Helmut Schaa Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 08e5310028359de2daaa39cd10e9ca493c51792b Author: Helmut Schaa Date: Thu Nov 4 20:37:47 2010 +0100 rt2x00: Wait up to one second on rt2800 for WPDMA to be ready At least some devices need such a long time to inititalize WPDMA. This only increases the maximum wait time and shouldn't affect devices that have been working before. Reported-by: Joshua Smith Signed-off-by: Helmut Schaa Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit efd2f271e44c7ea011cdb0363d38f40338ab80d2 Author: Helmut Schaa Date: Thu Nov 4 20:37:22 2010 +0100 rt2x00: Sync Tx and RX ring sizes with legacy drivers All rt2x00 devices used the same Tx and Rx ring size (24 entries) till now. Newer devices (like rt2800) can however make use of a larger TX and RX ring due to 11n capabilities (AMPDUs of size 64 for example). Hence, bring rt2x00 in sync with the legacy drivers and use the same TX and RX ring sizes. Also remove the global defines RX_ENTRIES, TX_ENTRIES, BEACON_ENTRIES and ATIM_ENTRIES and use per driver values. That is 24 entries for rt2400pci, 32 entries for rt2500pci, rt2500usb, rt61pci and rt73usb and 128 (RX) and 64 (TX) for rt2800pci and rt2800usb. Signed-off-by: Helmut Schaa Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 961621abee08fde2328daf6f8000e1059e5205e9 Author: Helmut Schaa Date: Thu Nov 4 20:36:59 2010 +0100 rt2x00: Add TXOP_CTRL_CFG register definition Remove the magic value initialisation of the TXOP_CTRL_CFG register by defining its fields and using them during intialisation. The field RESERVED_TRUN_EN is referred to as reserved, however it is set to 1 by the legacy drivers. Hence, do the same. Signed-off-by: Helmut Schaa Signed-off-by: Ivo van Doorn Signed-off-by: John W. Linville commit 066dae93bdfcc7af5e38a33617773fd5c6457607 Author: Felix Fietkau Date: Sun Nov 7 14:59:39 2010 +0100 ath9k: rework tx queue selection and fix queue stopping/waking The current ath9k tx queue handling code showed a few issues that could lead to locking issues, tx stalls due to stopped queues, and maybe even DMA issues. The main source of these issues is that in some places the queue is selected via skb queue mapping in places where this mapping may no longer be valid. One such place is when data frames are transmitted via the CAB queue (for powersave buffered frames). This is made even worse by a lookup WMM AC values from the assigned tx queue (which is undefined for the CAB queue). This messed up the pending frame counting, which in turn caused issues with queues getting stopped, but not woken again. To fix these issues, this patch removes an unnecessary abstraction separating a driver internal queue number from the skb queue number (not to be confused with the hardware queue number). It seems that this abstraction may have been necessary because of tx queue preinitialization from the initvals. This patch avoids breakage here by pushing the software <-> hardware queue mapping to the function that assigns the tx queues and redefining the WMM AC definitions to match the numbers used by mac80211 (also affects ath9k_htc). To ensure consistency wrt. pending frame count tracking, these counters are moved to the ath_txq struct, updated with the txq lock held, but only where the tx queue selected by the skb queue map actually matches the tx queue used by the driver for the frame. Signed-off-by: Felix Fietkau Reported-by: Björn Smedman Signed-off-by: John W. Linville commit 21e731a1b15bf03927e292af1b4a2c84fc8af817 Author: RafaÅ‚ MiÅ‚ecki Date: Wed Nov 3 21:36:12 2010 +0100 b43legacy: rfkill: use status register based on core revision (not PHY's) Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit d94519c1b0de827d5d142b9333b7f114c0b3a021 Author: maximilian attems Date: Tue Nov 2 23:39:12 2010 +0100 zd1201: Add missing id The Mandriva patch seems to stem from 2.6.14, so much for their upstreaming effort. Didn't find another Linux reference of it, just an omnious "USB\VID_1044&PID_8004" from GigabyteZD1201U.INF for Gigabyte GN-WLBZ101 802.11b USB Adapter, which matches the Mandriva patch comment. Aboves file also lists an "USB\VID_1044&PID_8006", which I have kept appart as this "Gigabyte GN-WBZB-M 802.11b USB Adapter" didn't show up in googling. Signed-off-by: maximilian attems Signed-off-by: John W. Linville commit 8cecc90e4a302ac214c48e362709ce906a96a295 Author: maximilian attems Date: Tue Nov 2 23:10:12 2010 +0100 zd1211rw: add 2 missing usb id's "These USB ID came from Palnex Worked fine." says Mandriva patch for their 2.6.32 and earlier. Web has evidence for both id's to work, so just add them upstream: http://www.mail-archive.com/zd1211-devs@lists.sourceforge.net/msg00507.html http://ubuntuforums.org/showthread.php?t=473046 Signed-off-by: Go Taniguchi Signed-off-by: maximilian attems Signed-off-by: John W. Linville commit daeeb074105a80a34f90a454c24efc14e9a8d3c3 Author: Herton Ronaldo Krzesinski Date: Mon Nov 1 22:59:39 2010 -0200 rtl8187: restore anaparam registers after reset with 8187B Current 8187B initialization misses anaparam registers restore after 8187 reset. This causes ANAPARAM register to stay zeroed out (ANAPARAM2 kept its value on my tests). To avoid this, call rtl8187_set_anaparam right after chip reset (to be on the safe side, as it makes sure we restore all ANAPARAM registers). Signed-off-by: Herton Ronaldo Krzesinski Acked-by: Larry Finger Cc: seno Signed-off-by: John W. Linville commit 998606cfd75e7a8169ed0d324061a8d6bc60716a Author: Herton Ronaldo Krzesinski Date: Mon Nov 1 22:59:38 2010 -0200 rtl8187: remove uneeded setting of anaparam write Usually you set RTL818X_CONFIG3_ANAPARAM_WRITE when you are going to change/write ANAPARAM registers. But in current initialization of RTL8187B there is a place where ANAPARAM_WRITE bit is set without any ANAPARAM register being written, without reason, so remove it. Signed-off-by: Herton Ronaldo Krzesinski Acked-by: Larry Finger Cc: seno Signed-off-by: John W. Linville commit 0bf198eb4d05a4662143e4a2e2a44fb592e2b177 Author: Herton Ronaldo Krzesinski Date: Mon Nov 1 22:59:37 2010 -0200 rtl8187: consolidate anaparam on/off write sequences There are repeated calls for anaparam on/off sequence in the code. Consolidate the common code in rtl8187_set_anaparam and use it where needed. Signed-off-by: Herton Ronaldo Krzesinski Acked-by: Larry Finger Signed-off-by: John W. Linville commit fe3326903d7aafd7b5602d8e178537c8b0465f6c Author: Herton Ronaldo Krzesinski Date: Mon Nov 1 22:59:36 2010 -0200 rtl8187: don't set RTL818X_CONFIG3_GNT_SELECT flag on 8187B The GNTSel bit should only concern pci devices by looking at RTL8180 spec, which is not the case of 8187B. Also testing shows that trying to set this bit fails, a subsequent read from the register after trying to set it shows that the bit isn't set, seems the hardware ignores it, which makes sense. This setting was a left over from Realtek sources. Signed-off-by: Herton Ronaldo Krzesinski Acked-by: Larry Finger Signed-off-by: John W. Linville commit 896cae65fc0489b8e42bb7790f64731d53a2cecf Author: Herton Ronaldo Krzesinski Date: Mon Nov 1 22:59:35 2010 -0200 rtl8187: move pll reset at start out of ANAPARAM write On 8187B start, comment about pll reset, and move it out of ANAPARAM write sequence, so that code is more readable. Signed-off-by: Herton Ronaldo Krzesinski Acked-by: Larry Finger Signed-off-by: John W. Linville commit a8ff34e37a186ebb7d2d90ee40ef88a3ef95ad47 Author: Herton Ronaldo Krzesinski Date: Mon Nov 1 22:59:34 2010 -0200 rtl8187: avoid redundant write to register FF72 (RFSW_CTRL) The table with misc register initialization was setting it, and later on we would set it again with a explicity call to rtl818x_iowrite16_idx. Remove duplicate initialization from the register table. Signed-off-by: Herton Ronaldo Krzesinski Acked-by: Larry Finger Signed-off-by: John W. Linville commit 60f589145d76cf834ec5e485c5412ec0994e52d1 Author: Herton Ronaldo Krzesinski Date: Mon Nov 1 22:59:33 2010 -0200 rtl8187: fix wrong register initialization in 8187B We were using wrong address for BRSR (Basic Rate Set Register) while initializing its value, comparing with Realtek sources, for 8187B case. Also, the same register is initialized in rtl8187b_reg_table, so remove the duplicate initialization from the table. Signed-off-by: Herton Ronaldo Krzesinski Acked-by: Larry Finger Signed-off-by: John W. Linville commit f002c25cc13e86762551c0eda29a40c60d6dbf1b Author: Herton Ronaldo Krzesinski Date: Mon Nov 1 22:59:32 2010 -0200 rtl8187: remove setting of beacon/atim registers from initialization On 8187B path, we set a initial value for beacon interval and atim window on initialization. But this isn't needed, since same setup is done on rtl8187_config. Signed-off-by: Herton Ronaldo Krzesinski Acked-by: Larry Finger Signed-off-by: John W. Linville commit 327571ea9927beec2ee2ed9a266c57c1515393b4 Author: Herton Ronaldo Krzesinski Date: Mon Nov 1 22:59:31 2010 -0200 rtl8187: remove redundant initialization of ARFR This removes redundant write to Auto Rate Fallback Register on RTL8187B. The same value was being written twice in the same function. Avoid this removing the duplicate initialization on rtl8187b_reg_table, and also add comment for this write (information from Realtek source). Signed-off-by: Herton Ronaldo Krzesinski Acked-by: Larry Finger Signed-off-by: John W. Linville commit c0bf9ca98e07ca72c444a6cfb272aafa9890b9b6 Author: Nishant Sarmukadam Date: Mon Nov 1 17:55:48 2010 -0700 mwl8k: force AP mode to use non-AMPDU frames AP firmware uses xmitcontrol to differentiate between AMPDU and non-AMPDU frames. As the support for AMPDU is not yet added, set xmitcontrol to non-AMPDU for all tx frames for AP firmware. This field will be set to indicate ampdu/non-ampdu frames when tx AMPDU support is added. Signed-off-by: Pradeep Nemavat Signed-off-by: Brian Cavagnolo Acked-by: Lennert Buytenhek Signed-off-by: John W. Linville commit 3eedb6f436858f3e864139dc184adc9a51440c92 Author: Christian Lamparter Date: Sat Oct 30 00:36:53 2010 +0200 carl9170: configurable beacon rates Previously, the beacon rate was fixed to either: * 1Mb/s [2.4GHz band] * 6Mb/s [5GHz band] This limitation has been addressed and now the beacon rate is selected by ieee80211_tx_info's rate control info, almost like any ordinary data frame. Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit 2a6cef513fab525399e484edc9bfb39b6d462f76 Author: Christian Lamparter Date: Fri Oct 29 23:41:16 2010 +0200 carl9170: stop stale uplink BA sessions This patch fixes a possible lengthy stall if the device is operating as an experimental 11n AP and an STA [during heavy txrx action] suddenly signalized to go off-channel (old NetworkManager), or (sleep - which is unlikely, because then it wouldn't be *active* at all!?). Because the driver has to manage the BA Window, the sudden PSM transition can leave active uplink BA sessions to the STA in a bad state and a proper cleanup is needed. Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit e4a668c59080f862af3ecc28b359533027cbe434 Author: Christian Lamparter Date: Fri Oct 29 23:26:13 2010 +0200 carl9170: fix spurious restart due to high latency RX Stress tests of unidirectional bulk traffic with bitrates of up to 220Mbit/s have revealed that the fatal-event recovery logic [which was solely triggered by an out-of-rx-buffer situation] is too aggressive. The new method now "pings" the device and then decides - based on the response - whenever a restart is needed or not. Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit e27769059ccb15273a7eb69ed31b8e08f9b0eda8 Author: Christian Lamparter Date: Fri Oct 29 23:17:38 2010 +0200 carl9170: initialize HW aMPDU parameters properly This patch changes the initial aMPDU density and factor settings to match those of Otus. Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit 3f1240e4f4b249f2388903864bdc766973f76687 Author: Christian Lamparter Date: Fri Oct 29 22:44:59 2010 +0200 carl9170: import hw/fw header updates This patch imports all shared header changes from carl9170fw.git. * add some strategic __aligned(4). This allows the compiler generate optimized code for architectures which can't access (unaligned/packed) data efficiently. ("ath9k_hw: optimize all descriptor access functions") * add a forgotten __CARL9170FW__ ifdef around a private firmware-internal struct. * GET_VAL macro helper Very useful for extracting data out of the bit-packed PHY registers. * cosmetic changes e.g.: _CCA_MINCCA_ to just _CCA_MIN_. * version bump 1.8.8.3 -> 1.9.0. Signed-off-by: Christian Lamparter Signed-off-by: John W. Linville commit bdd7bd16439975133d36bcd7c9c489302a114525 Author: Blaise Gassend Date: Thu Oct 28 02:01:24 2010 -0700 mac80211_hwsim: Incorporate txpower into rssi Up to now mac80211_hwsim has been reporting an rssi of -50. This patch improves the model slightly by returning txpower-50. This makes it easy to stimulate tests that need to see a varying rssi. Signed-off-by: Blaise Gassend Signed-off-by: John W. Linville commit 19999792d2889350611ba9e346d6a2924959dc2d Author: Thadeu Lima de Souza Cascardo Date: Thu Oct 28 20:01:00 2010 -0200 rtl8187b: do not do per packet TX AGC Clearing the per packet TX AGC for the RTL8187B device appears to increase its overall TX power. This allows the device to associate and a connection to be established using APs a little further away. This is in accordance to what is done for RTL8187L devices and also what Realtek drivers do. Tested-by: Thadeu Lima de Souza Cascardo Signed-off-by: Thadeu Lima de Souza Cascardo Cc: linux-wireless@vger.kernel.org Cc: Larry Finger Cc: Rogerio Luz Coelho Cc: Herton Ronaldo Krzesinski Cc: Hin-Tak Leung Cc: seno Tested-by: Herton Ronaldo Krzesinski Signed-off-by: John W. Linville commit e285a5250c0772c5596a9137041a96b2c1f744d6 Author: Eliad Peller Date: Wed Oct 27 14:09:58 2010 +0200 wl1271: add recover testmode command add RECOVER testmode command. this command triggers a recovery sequence (by enqueueing a recovery_work). Signed-off-by: Eliad Peller Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho commit ccc83b046c03378bbaf7cf095d8d7e9b9abb24c5 Author: Eliad Peller Date: Wed Oct 27 14:09:57 2010 +0200 wl1271: handle HW watchdog interrupt unmask the WL1271_ACX_INTR_WATCHDOG interrupt. when getting it - enqueue a recovery work and bail out. Signed-off-by: Eliad Peller Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho commit 03107a4b5923aa7767329e857caf227749087e47 Author: Eliad Peller Date: Wed Oct 27 14:58:30 2010 +0200 wl1271: refactor debugfs function generation code refactor wl1271_debugfs by using a format© function, instead of duplicating the code for each generated function. this change reduces about 3Kb from wl1271.ko Signed-off-by: Eliad Peller Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho commit 71125abdf0c297adc00dc5632f0318b2397286f5 Author: Eliad Peller Date: Thu Oct 28 21:46:43 2010 +0200 wl1271: set wl->vif only if add_interface succeeded. set wl->vif to the newly created interface only after the firmware booted successfully. on the way - make the function flow more clear. Signed-off-by: Eliad Peller Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho commit f8d9802f66eda9ff14f7667f99a46b31e9a9e273 Author: Juuso Oikarinen Date: Tue Oct 26 13:24:39 2010 +0200 wl1271: Check interface state in op_* functions Check the state of the interface on op_* function so we don't try to access the hardware in when its off. The mac80211 may call these in some corner cases related, for instance, to the hardware recovery procedure. These accesses cause a kernel crash on at least some SDIO devices, because the bus is not properly claimed in that scenario. Signed-off-by: Juuso Oikarinen Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho commit b739a42c921dcb0ae92cc14032b7f75dcba88e3b Author: Juuso Oikarinen Date: Tue Oct 26 13:24:38 2010 +0200 wl1271: Fix scan failure detection In scan_complete_work, because the mutex is released before accessing the scan->failed flag, it is possible for unfounded hardware recovery rounds to be executed. Fix this. Signed-off-by: Juuso Oikarinen Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho commit fb2382c75b1292aff0ebc8e209b0cb9ba70bb2cf Author: Juuso Oikarinen Date: Mon Oct 25 11:24:29 2010 +0200 wl1271: Fix RX path stall The wl1271_rx function loops through packets in an aggregated buffer. Each packet in the buffer is handled by a call to wl1271_rx_handle_data, which will fail if skb memory allocation fails or production mode is enabled. These failures currently prevent the rx counters to be incremented, thus causing the rx loop to run forever. Fix this by ignoring error codes reported wl1271_rx_handle_data function. This essentially means that frames will be dropped in production mode, which is the intetion, and frames will be dropped if memory allocation fails, which is a decent way to recover from that situation. Signed-off-by: Juuso Oikarinen Tested-by: Tuomas Katila Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho commit ff6d76fd3d45ed5494287e57d76073739721214b Author: Nicolas Kaiser Date: Mon Oct 25 15:30:03 2010 +0200 wireless/wl1271: remove redundant if-statement v2 wl1271_ps_elp_sleep() is void and cannot return a value. Signed-off-by: Nicolas Kaiser Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho commit 5404643139c16e56d31a6ebd09cfa6db1eb03a36 Author: Luciano Coelho Date: Wed Oct 20 15:15:52 2010 +0300 wl1271: exit ELP mode when setting enabled rates in tx This bug was being triggered by a call to acx_rate_policies in tx_work without calling ps_elp_wakeup first. If we have full PSM enabled, this happens rather often, immediately after association. Reported-by: Tuomas Katila Signed-off-by: Luciano Coelho Tested-by: Tuomas Katila commit 6a2de93b2553c2e9a72997370534993c85c1eee6 Author: Teemu Paasikivi Date: Thu Oct 14 11:00:04 2010 +0200 wl1271: Fix warning about unsupported RX rate While scanning, it is possible that beacon and probe response frames are received on other band than configured to the driver. In rx status handling this has caused "Unsupported RX rate from HW" warnings. This patch changes the wl1271_rate_to_index function to take the band of the received frame as a parameter instead of using value configuret to wl->band. Signed-off-by: Teemu Paasikivi Reviewed-by: Juuso Oikarinen Signed-off-by: Luciano Coelho commit 18357850b694ba3fa29363c7d86ccd8783f4a065 Author: Shahar Levi Date: Wed Oct 13 16:09:41 2010 +0200 wl1271: 11n Support, functionality and configuration ability Add 11n ability in scan, connection and using MCS rates. The configuration is temporary due to the code incomplete and still in testing process. That plans to be remove in the future. Signed-off-by: Shahar Levi Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho commit c4db1c879679e795689ef3c9dd7d3f6568ea14c5 Author: Shahar Levi Date: Wed Oct 13 16:09:40 2010 +0200 wl1271: 11n Support, ACX Commands Added ACX command to the FW for 11n support. Signed-off-by: Shahar Levi Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho commit e8b03a2b8debc6056f6f43d24f98f601097301a1 Author: Shahar Levi Date: Wed Oct 13 16:09:39 2010 +0200 wl1271: 11n Support, Add Definitions Two acx commands: ht_capabilities & ht_information, 11n sta capabilities macro. Signed-off-by: Shahar Levi Reviewed-by: Luciano Coelho Signed-off-by: Luciano Coelho commit 2fe33e8cff354a3f320549544bffebbbab680145 Author: Ido Yariv Date: Tue Oct 12 14:49:12 2010 +0200 wl1271: Fix TX queue low watermark handling The number of entries in the TX queue is compared to the low watermark value each time TX completion interrupts are handled. However, the fact that a TX completion arrived does not necessarily mean there are any less skbs in the TX queue. In addition, a TX completion interrupt does not necessarily mean that there are any new available TX blocks. Thus, queuing TX work when the low watermark is reached might not be needed. Fix this by moving the low watermark handling to the TX work function, and avoid queuing TX work in this case. Signed-off-by: Ido Yariv Reviewed-by: Juuso Oikarinen Signed-off-by: Luciano Coelho commit 25eeb9e3876a161e3afcc820c6cb72e13f9b7c7e Author: Ido Yariv Date: Tue Oct 12 16:20:06 2010 +0200 wl1271: Allocate TX descriptors more efficiently On each TX descriptor allocation, a free entry is found by traversing the TX descriptors array. Improve this by holding a bitmap of all TX descriptors, and using efficient bit operations to search for free entries. Signed-off-by: Ido Yariv Reviewed-by: Juuso Oikarinen Signed-off-by: Luciano Coelho commit a522550a283de31c7cfc30c7a129ce584e38c582 Author: Ido Yariv Date: Tue Oct 12 14:49:10 2010 +0200 wl1271: Fix TX starvation While wl1271_irq_work handles RX directly (by calling wl1271_rx), a different work is scheduled for transmitting packets. The IRQ work might handle more than one interrupt during a single call, including multiple TX completion interrupts. This might starve TX, since no packets are transmitted until all interrupts are handled. Fix this by calling the TX work function directly, instead of deferring it. Signed-off-by: Ido Yariv Reviewed-by: Juuso Oikarinen Signed-off-by: Luciano Coelho commit 6c6e669ed6282788d6045397ce0f201edc400d9d Author: Ido Yariv Date: Tue Oct 12 14:49:09 2010 +0200 wl1271: TX aggregation optimization In case the aggregation buffer is too small to hold all available packets, the buffer is transferred to the FW and no more packets are aggregated. Although there may be enough available TX blocks, no additional packets will be handled by the current TX work. Fix this by flushing the aggregation buffer when it's full, and continue transferring packets as long as there are enough available TX blocks. Signed-off-by: Ido Yariv Reviewed-by: Juuso Oikarinen Signed-off-by: Luciano Coelho commit c8aea565e8f715d9f10064b1cbfbc15bf75df501 Author: Gery Kahn Date: Tue Oct 5 16:09:05 2010 +0200 wl1271: ref_clock cosmetic changes Cosmetic cleanup for ref_clock code while configured by board. Signed-off-by: Gery Kahn Signed-off-by: Luciano Coelho commit 34d59c07e9ad7130813c28f8554ef1298af923b7 Author: Wey-Yi Guy Date: Sat Oct 23 09:15:46 2010 -0700 iwlagn: use 6000g2b uCode for 130 series devices For 130 series device, 6000g2b uCode will be used, no need to have additional defines for 130 devices, so remove those. Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 69d826b6c54de113f02a73990b6f6809289b48cc Author: Wey-Yi Guy Date: Sat Oct 23 09:15:45 2010 -0700 iwlwifi: add new devices to Kconfig Adding description to Kconfig to indicate more devices are being supported by iwlagn Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit f5682c01eb85fce13d064d232c947322bd7e2631 Author: Wey-Yi Guy Date: Sat Oct 23 09:15:44 2010 -0700 iwlagn: turn dynamic smps on while BT is on While BT is on and doing iscan and/or pscan, BT is in listen mode which will impact WiFi throughput, we need to enable dynamic smps in order to improve the rx throughput. Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit d4daaea656e0b5543c2e37c31934cea8f044b31e Author: Johannes Berg Date: Sat Oct 23 09:15:43 2010 -0700 iwlwifi: implement switching iftype while up Implement switching the interface while an interface is up in iwlwifi. Interfaces have to stay on the context they were created on. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit bd50a8ab9f48787109f6ff761c8f0e185e3d0690 Author: Johannes Berg Date: Sat Oct 23 09:15:42 2010 -0700 iwlwifi: fix IBSS beaconing My previous patch to clean up all RXON handling inadvertently broke IBSS because it failed to take into account that unlike in AP mode, IBSS requires beacons to be sent only after setting the RXON assoc. Fix this, clean up the code a bit, improve the error checking around this, and also react to beacon changes in IBSS mode from mac80211. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 2295c66b68ae160dde2e6e2dc4f3061105153bfc Author: Johannes Berg Date: Sat Oct 23 09:15:41 2010 -0700 iwlagn: new RXON processing for modern devices In order to simplify the flow, and make new enhancements easier, separate out the RXON processing for modern AGN (5000 and newer) from RXON processing for the older 3945 and 4965 devices. Avoid changing these old ones to avoid regressions and move their code to a new file (iwl-legacy.c). 4965 gets the commit_rxon that used to be common for all AGN devices, but with removed PAN support. The new RXON processing is more central and does more work in committing, so that it is easier to follow. To make it more evident what is split out for legacy, split the necessary operations for that into a new struct iwl_legacy_ops. Those parts that still exist in the new AGN code don't need to be parametrized. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 2d4e43c3c6783f956163c11568303b0390725e28 Author: Johannes Berg Date: Sat Oct 23 09:15:40 2010 -0700 iwlagn: don't resend RXON timing Resending RXON timing here caused issues with dual-mode under certain circumstances, so avoid doing it here right now. This effectively reverts b01efe434bd6ea807eb72b and partially 2491fa42d9bdf26075765. The next patch will make all this cleaner for just the devices that need it. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit dc21b5453249e7e9b8878fab356fd60b731cf04d Author: Johannes Berg Date: Sat Oct 23 09:15:39 2010 -0700 iwlwifi: make mac80211 ops a device config In the future, 4965 and modern AGN devices will need to have different mac80211 callbacks since they have different capabilities. Prepare for that by making the mac80211 operations a device config. Signed-off-by: Johannes Berg Signed-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 07caf9d6c9135ae25a760867f37aab90c1008380 Author: Eliad Peller Date: Wed Oct 27 14:58:29 2010 +0200 mac80211: refactor debugfs function generation code refactor mac80211 debugfs code by using a format© function, instead of duplicating the code for each generated function. this change reduces about 600B from mac80211.ko Signed-off-by: Eliad Peller Signed-off-by: John W. Linville commit 6a6733f256f18cbcf4875e13f59eedb593b755a8 Author: Luis R. Rodriguez Date: Tue Oct 26 15:27:25 2010 -0700 ath9k: content DMA start / stop through the PCU lock This helps align resets / RX enable & disable / TX stop / start. Locking around the PCU is important to ensure the hardware doesn't get stale data when working with DMA'able data. This is part of a series of patches which fix stopping TX DMA completley when requested on the driver. For more details about this issue refer to this thread: http://marc.info/?l=linux-wireless&m=128629803703756&w=2 Tested-by: Ben Greear Cc: Kyungwan Nam Cc: stable@kernel.org Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit 4bdd1e978ede034c1211957eb17eaf50de00d234 Author: Luis R. Rodriguez Date: Tue Oct 26 15:27:24 2010 -0700 ath9k: move the PCU lock to the sc structure The PCU lock should be used to contend TX DMA as well, this will be done next. This is part of a series of patches which fix stopping TX DMA completley when requested on the driver. For more details about this issue refer to this thread: http://marc.info/?l=linux-wireless&m=128629803703756&w=2 Tested-by: Ben Greear Cc: Kyungwan Nam Cc: stable@kernel.org Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit 9d94674ab754be0e275120a183670ead435f9c0d Author: Luis R. Rodriguez Date: Tue Oct 26 15:27:23 2010 -0700 ath9k: simplify hw reset locking The new PCU lock is better placed so we can just contend against that when trying to reset hardware. This is part of a series of patches which fix stopping TX DMA completley when requested on the driver. For more details about this issue refer to this thread: http://marc.info/?l=linux-wireless&m=128629803703756&w=2 Tested-by: Ben Greear Cc: Kyungwan Nam Cc: stable@kernel.org Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit 5d4c428254f73bae272be9d296724b1ee09d76ec Author: Mohammed Shafi Shajakhan Date: Tue Oct 26 21:28:57 2010 +0530 ath9k: Properly assign boolean types This takes care that boolean types are properly assigned Signed-off-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit 446fad5a5b6be765c8ec39bfdbbc6c7aa63fbcbb Author: Rajkumar Manoharan Date: Tue Oct 26 20:11:29 2010 +0530 ath9k_htc: Handle monitor mode properly for HTC devices No need to inform about monitor interface changes to firmware. Set the HW mode to monitor type based on mac80211 indication flag is sufficient. Signed-off-by: Rajkumar Manoharan Signed-off-by: John W. Linville commit f60dc0138aa19769bf8bab9f93b043235428b66f Author: John W. Linville Date: Mon Oct 25 16:12:37 2010 -0400 iwlwifi: Convert to new PCI PM framework Use the new PCI PM and let the PCI core code handle the PCI-specific details of power transitions. Based on similarly titled ath9k patch posted by Rafael J. Wysocki. Signed-off-by: John W. Linville Acked-by: Rafael J. Wysocki Acked-by: Wey-Yi Guy commit b9237578f8d685bb86901ba9ff0d379218e5a3c5 Author: John W. Linville Date: Mon Oct 25 10:33:07 2010 -0400 rt2x00pci: do not use GFP_DMA Signed-off-by: John W. Linville Acked-by: Ivo van Doorn commit 26f94dc264a7ebddcc08d3908e99880703d871e5 Author: John W. Linville Date: Mon Oct 25 10:24:09 2010 -0400 b43: remove extraneous code in free_ringmemory This code seems to have been cut-n-pasted from alloc_ringmemory? Anyway, it is useless. Signed-off-by: John W. Linville commit 8e7ce8930165c785ec1c754ef3e3092a3bdffe02 Author: Hauke Mehrtens Date: Sat Oct 23 19:51:32 2010 +0200 carl9170: fix typos Signed-off-by: Hauke Mehrtens Acked-by: Christian Lamparter Signed-off-by: John W. Linville commit a2d9bc6fdc0c8693b5641c69bce7eaf5b47f0593 Author: RafaÅ‚ MiÅ‚ecki Date: Fri Oct 22 17:43:49 2010 +0200 b43: N-PHY: improve 2055 radio initialization 1) Upload 5 GHz values when needed. 2) Do not upload all values on first init. Follow wl. Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 7a4db8f5c37d1acf1213b835b3cdd8f7c051eb9b Author: RafaÅ‚ MiÅ‚ecki Date: Fri Oct 22 17:43:48 2010 +0200 b43: N-PHY: determine usage of radio regulatory workaround correctly Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 7e6da2bfc05c2b96197c12484f3d071fe0c6d0fb Author: RafaÅ‚ MiÅ‚ecki Date: Fri Oct 22 17:43:47 2010 +0200 b43: define known SPROM boardflags2 bits Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit c0b102c20972cfa3e10a0cf4a2a563edb70961b1 Author: RafaÅ‚ MiÅ‚ecki Date: Fri Oct 22 17:43:46 2010 +0200 b43: N-PHY: fix 2055 radio init Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 3eb9616af24d6a1910ae6ae5c2d51719eba960cf Author: Stanislaw Gruszka Date: Fri Oct 22 17:04:30 2010 +0200 iwlwifi: avoid commit rxon during scan in iwl_set_no_assoc Currently we are canceling scan when changing BSSID. Behave the same when changing association and beacon enablement, to avoid committing rxon during scan in iwl_set_no_assoc(). Signed-off-by: Stanislaw Gruszka Acked-by: Wey-Yi Guy Signed-off-by: John W. Linville commit ac4f5457c7617999967e9740f8903b922714bab4 Author: Stanislaw Gruszka Date: Fri Oct 22 17:04:29 2010 +0200 iwlwifi: defer update power mode while scan Do not set power mode when scanning, and defer that when scan finish. We still set power mode in force case i.e. when device is overheated. Signed-off-by: Stanislaw Gruszka Acked-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 5eda74a40587139b1d66cd8197cac92ba36e79f4 Author: Stanislaw Gruszka Date: Fri Oct 22 17:04:28 2010 +0200 iwlwifi: avoid commit rxon during scan in iwlagn_bt_traffic_change_work Avoid sending commands to firmware (including commit_rxon) when scan is pending and we are calling iwlagn_bt_traffic_change_work simultaneously. Also comment some innocent race conditions. Signed-off-by: Stanislaw Gruszka Acked-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 749ff4efa14df904c22b28e2f7b10a02119a4d5e Author: Stanislaw Gruszka Date: Fri Oct 22 17:04:27 2010 +0200 iwlwifi: avoid commit rxon during scan in iwlagn_configure_filter Almost anywhere in the code we avoid committing rxon while performing scan, and make rxon commit when scan complete. However in some places in the code we do not follow that rule. This patch fix that problem in iwlagn_configure_filter(). Since we do not commit directly in iwl3945_configure_filter, we can also do the same for agn, so I just remove iwlcore_commit_rxon() function and add a comment. Also change comment for iwl3945. Signed-off-by: Stanislaw Gruszka Acked-by: Wey-Yi Guy Signed-off-by: John W. Linville commit a25a66ac94db88190653d5725c563e3f8faeee61 Author: Stanislaw Gruszka Date: Fri Oct 22 17:04:26 2010 +0200 iwlwifi: fix set_tx_power vs scan According to comment in iwl_bg_scan_completed, setting tx power should be deferred during pending scan, but we are not doing this. This patch change code to really defer setting tx power after scan complete. Additionally refactor iwl_set_tx_power code and call lib->send_tx_power() directly from iwlagn_commit_rxon. Signed-off-by: Stanislaw Gruszka Acked-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 4cbf1b12491cd43032846acc6c6924d9090fa19f Author: Stanislaw Gruszka Date: Fri Oct 22 17:04:25 2010 +0200 iwlwifi: send tx_power_cmd synchronously On 5xxx and 6xxx change to send tx_power_cmd command synchronously, to do not start other commands when setting tx power is pending. We currently do the same for 4956 and 3945. Signed-off-by: Stanislaw Gruszka Acked-by: Wey-Yi Guy Signed-off-by: John W. Linville commit 4beeba7dc59cc10d6a47346c857d1a64a9ec9642 Author: Stanislaw Gruszka Date: Mon Oct 25 10:34:50 2010 +0200 iwlwifi: warn when send tx power settings during scan Add WARN_ONCE when scanning is pending. Use STATUS_SCAN_HW bit since we can have scan canceled or completed but STATUS_SCANNING bit still set. v1 -> v2: replace EIO to EAGAIN Signed-off-by: Stanislaw Gruszka Acked-off-by: Wey-Yi Guy Signed-off-by: John W. Linville commit c7317e41df30c7e04dca46360e5ebb0cb36dda45 Author: Felix Fietkau Date: Thu Oct 21 02:47:25 2010 +0200 mac80211: minstrel_ht - reduce the overhead of rate sampling - reduce the number of retransmission attempts for sample rates - sample lower rates less often - do not use RTS/CTS for sampling frames - increase the time between sampling attempts Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit ff32d9cd2c4107224a28f39d3c72eec66d566e09 Author: Felix Fietkau Date: Thu Oct 21 02:47:23 2010 +0200 ath9k_hw: fix potential spurious tx error bit interpretation According to documentation, AR_ExcessiveRetries, AR_Filtered and AR_FIFOUnderrun are only valid if AR_FrmXmitOK is clear. Not checking this might result in suboptimal FIFO settings, unnecessary retransmissions, or other connectivity issues. Signed-off-by: Felix Fietkau Cc: stable@kernel.org Signed-off-by: John W. Linville commit 78a7685e1e44c6d4b6f79c73687b9322e40b040e Author: Luis R. Rodriguez Date: Wed Oct 20 16:07:08 2010 -0700 ath9k: add a debug warning when we cannot stop RX We have seen several DMA races when we race against stopping and starting the PCU. I suspect that when we cannot stop the PCU we may hit some of these same races so warn against them for now but only when debugging (CONFIG_ATH_DEBUG) is enabled. If you run into this warning and are a developer, please fix the cause of the warning. The potential here, although I cannot prove yet, is that the DMA engine can be confused and start writing to a buffer that was already DMA'd before and at least the kernel assumes is not being accessed by hardware anymore. Cc: Ben Greear Cc: Kyungwan Nam Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit b87b0128894efd3bbf7272a579f71b3a2bc500d1 Author: Luis R. Rodriguez Date: Thu Oct 21 12:10:11 2010 -0700 ath: add a ATH_DBG_WARN() To be used to throw out warnings only for developers. This can be used by some corner cases that developers already know can be hit but developers want to address so to avoid spewing out a warning this can only be enabled with CONFIG_ATH_DEBUG enabled. Cc: Ben Greear Cc: Kyungwan Nam Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit d91e41b690f795c04af4eb6fe28d2cafd3291051 Author: Luis R. Rodriguez Date: Wed Oct 20 10:18:59 2010 -0700 cfg80211: prefix REG_DBG_PRINT() with cfg80211 Everyone's doing it, its the cool thing. Cc: Easwar Krishnan Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit e702d3cf29143327679ce2e2a60775eaf829f377 Author: Luis R. Rodriguez Date: Thu Oct 21 19:17:04 2010 +0530 cfg80211: add debug print when processing a channel In the worst case you are seeing really odd things you want more information than what is provided right now, for those that insist and want debug info through CONFIG_CFG80211_REG_DEBUG provide a print of when we are processing a channel and with what regulatory rule. Cc: Easwar Krishnan Signed-off-by: Luis R. Rodriguez Signed-off-by: Senthil Balasubramanian Signed-off-by: John W. Linville commit a65185367f9f876448f0f12ac09a673d20371efc Author: Luis R. Rodriguez Date: Wed Oct 20 10:18:57 2010 -0700 cfg80211: add debug print when disabling a channel on a custom regd Cc: Easwar Krishnan Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit 926a0a094d2b9052db3f7f37438c3d305cea4be7 Author: Luis R. Rodriguez Date: Thu Oct 21 19:17:03 2010 +0530 cfg80211: add debug prints for when we ignore regulatory hints This can help with debugging issues. You will only see these with CONFIG_CFG80211_REG_DEBUG enabled. Cc: Easwar Krishnan Signed-off-by: Luis R. Rodriguez Signed-off-by: Senthil Balasubramanian Signed-off-by: John W. Linville commit ca4ffe8f2848169a8ded0ea8a60b2d81925564c9 Author: Luis R. Rodriguez Date: Wed Oct 20 10:18:55 2010 -0700 cfg80211: fix disabling channels based on hints After a module loads you will have loaded the world roaming regulatory domain or a custom regulatory domain. Further regulatory hints are welcomed and should be respected unless the regulatory hint is coming from a country IE as the IEEE spec allows for a country IE to be a subset of what is allowed by the local regulatory agencies. So disable all channels that do not fit a regulatory domain sent from a unless the hint is from a country IE and the country IE had no information about the band we are currently processing. This fixes a few regulatory issues, for example for drivers that depend on CRDA and had no 5 GHz freqencies allowed were not properly disabling 5 GHz at all, furthermore it also allows users to restrict devices further as was intended. If you recieve a country IE upon association we will also disable the channels that are not allowed if the country IE had at least one channel on the respective band we are procesing. This was the original intention behind this design but it was completely overlooked... Cc: David Quan Cc: Jouni Malinen cc: Easwar Krishnan Cc: stable@kernel.org Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit 749b527b21465fb079796c03ffb4302584dc31c1 Author: Luis R. Rodriguez Date: Wed Oct 20 10:18:54 2010 -0700 cfg80211: fix allowing country IEs for WIPHY_FLAG_STRICT_REGULATORY We should be enabling country IE hints for WIPHY_FLAG_STRICT_REGULATORY even if we haven't yet recieved regulatory domain hint for the driver if it needed one. Without this Country IEs are not passed on to drivers that have set WIPHY_FLAG_STRICT_REGULATORY, today this is just all Atheros chipset drivers: ath5k, ath9k, ar9170, carl9170. This was part of the original design, however it was completely overlooked... Cc: Easwar Krishnan Cc: stable@kernel.org Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit 7ca43d03b1291481bdf894bbaec5d580e7684e7d Author: Luis R. Rodriguez Date: Wed Oct 20 10:18:53 2010 -0700 cfg80211: pass the reg hint initiator to helpers This is required later. Cc: Easwar Krishnan Cc: stable@kernel.org signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit 2e48928d8a0f38c1b5c81eb3f1294de8a6382c68 Author: Stephen Hemminger Date: Wed Oct 20 10:16:58 2010 -0700 rfkill: remove dead code The following code is defined but never used. Signed-off-by: Stephen Hemminger Signed-off-by: John W. Linville commit e081685c1bbe8da37c7f61726fdb783ff277f14f Author: Larry Finger Date: Wed Oct 20 09:59:33 2010 -0500 ssb: Clear RETRY_TIMEOUT in PCI Configuration for normal devices MMIO log traces obtained using the Broadcom wl hybrid driver show that the RETRY_TIMEOUT register (0x41) in PCI configuration space is cleared if non-zero. Similar code found in other drivers such as ipw2100 show this operation is needed to keep PCI Tx retries from interfering with C3 CPU state. There are no known cases where omission of this code has caused a problem, but this patch is offered just in case such a situation occurs. Signed-off-by: Larry Finger Signed-off-by: John W. Linville commit 14fb7c17e97ea0fcc545393fb1f34e6541647b5b Author: Luis R. Rodriguez Date: Wed Oct 20 06:59:38 2010 -0700 ath5k: make ath5k_update_bssid_mask_and_opmode() static This fixes this sparse warning: CHECK drivers/net/wireless/ath/ath5k/base.c drivers/net/wireless/ath/ath5k/base.c:569:6: warning: symbol 'ath5k_update_bssid_mask_and_opmode' was not declared. Should it be static? Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit f8c2a0871b8462481a02445b38a7321ad63bfc88 Author: Luis R. Rodriguez Date: Wed Oct 20 06:59:37 2010 -0700 ath: make ath_hw_set_keycache_entry() static This fixes this sparse warning: CHECK drivers/net/wireless/ath/key.c drivers/net/wireless/ath/key.c:110:6: warning: symbol 'ath_hw_set_keycache_entry' was not declared. Should it be static? Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit a3685d119dacb07a7080169fea2847ef385b209f Author: Luis R. Rodriguez Date: Wed Oct 20 06:59:36 2010 -0700 ath: make ath_hw_keysetmac() static This fixes this sparse warning: CHECK drivers/net/wireless/ath/key.c drivers/net/wireless/ath/key.c:70:6: warning: symbol 'ath_hw_keysetmac' was not declared. Should it be static? Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit babcbc295fee766ca710235e431686fef744d9a6 Author: Felix Fietkau Date: Wed Oct 20 02:09:46 2010 +0200 ath9k: initialize per-channel tx power limits instead of hardcoding them Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit de40f316c01b1ba9535e6dc99f6a67e7655b07da Author: Felix Fietkau Date: Wed Oct 20 03:08:53 2010 +0200 ath9k_hw: extend ath9k_hw_set_txpowerlimit to test channel txpower ath9k_hw_set_txpowerlimit gets an extra boolean parameter that - if set - causes the rate txpower table and the regulatory limit to be calculated and stored, without changing hardware registers. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 6b7b6cf553f881d45bb37a73f5db956afb290a08 Author: Felix Fietkau Date: Wed Oct 20 02:09:44 2010 +0200 ath9k_hw: initialize regulatory->max_power_level in set_txpower for AR9003 The same is done for the older chip families as well. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 900fcf091e95fbcc773b72c770afcd2e8eda4da2 Author: Paul Mundt Date: Mon Nov 1 09:29:24 2010 +0000 net: sh_eth: Move off of deprecated I/O routines. sh_eth is the last in-tree user of the ctrl_xxx I/O routines. This simply converts them over to regular MMIO accesors. Signed-off-by: Paul Mundt Signed-off-by: David S. Miller commit 636e19a34275d7d6fda0fefa965b1e2a715e2b02 Author: John Fastabend Date: Sat Oct 30 14:22:42 2010 +0000 net: consolidate 8021q tagging Now that VLAN packets are tagged in dev_hard_start_xmit() at the bottom of the stack we no longer need to tag them in the 8021Q module (Except in the !VLAN_FLAG_REORDER_HDR case). This allows the accel path and non accel paths to be consolidated. Here the vlan_tci in the skb is always set and we allow the stack to add the actual tag in dev_hard_start_xmit(). Signed-off-by: John Fastabend Acked-by: Jesse Gross Signed-off-by: David S. Miller commit 8f5549f381ced6a255f2c7127b2b3b3b05fdfd6e Author: John Fastabend Date: Sat Oct 30 14:22:37 2010 +0000 net: remove check for headroom in vlan_dev_create It is possible for the headroom to be smaller then the hard_header_len for a short period of time after toggling the vlan offload setting. This is not a hard error and skb_cow_head is called in __vlan_put_tag() to resolve this. Signed-off-by: John Fastabend Acked-by: Jesse Gross Signed-off-by: David S. Miller commit 029f5fc31cdb35d6c8a7fe9a54bf21556e175988 Author: John Fastabend Date: Sat Oct 30 14:22:32 2010 +0000 8021q: set hard_header_len when VLAN offload features are toggled Toggling the vlan tx|rx hw offloads needs to set the hard_header_len as well otherwise we end up using LL_RESERVED_SPACE incorrectly. This results in pskb_expand_head() being used unnecessarily. Signed-off-by: John Fastabend Acked-by: Jesse Gross Signed-off-by: David S. Miller commit 58e998c6d23988490162cef0784b19ea274d90bb Author: Jesse Gross Date: Fri Oct 29 12:14:55 2010 +0000 offloading: Force software GSO for multiple vlan tags. We currently use vlan_features to check for TSO support if there is a vlan tag. However, it's quite likely that the NIC is not able to do TSO when there is an arbitrary number of tags. Therefore if there is more than one tag (in-band or out-of-band), fall back to software emulation. Signed-off-by: Jesse Gross CC: Ben Hutchings Signed-off-by: David S. Miller commit c8d5bcd1aff89199cde4bd82c5c40fb704c8bba4 Author: Jesse Gross Date: Fri Oct 29 12:14:54 2010 +0000 offloading: Support multiple vlan tags in GSO. We assume that hardware TSO can't support multiple levels of vlan tags but we allow it to be done. Therefore, enable GSO to parse these tags so we can fallback to software. Signed-off-by: Jesse Gross CC: Ben Hutchings Signed-off-by: David S. Miller commit e1e78db628b33c657944865e3bca01ee59cc5b80 Author: Jesse Gross Date: Fri Oct 29 12:14:53 2010 +0000 offloading: Make scatter/gather more tolerant of vlans. When checking if it is necessary to linearize a packet, we currently use vlan_features if the packet contains either an in-band or out- of-band vlan tag. However, in-band tags aren't special in any way for scatter/gather since they are part of the packet buffer and are simply more data to DMA. Therefore, only use vlan_features for out- of-band tags, which could potentially have some interaction with scatter/gather. Signed-off-by: Jesse Gross CC: Ben Hutchings Reviewed-by: Ben Hutchings Signed-off-by: David S. Miller commit 410989f65151557701ce86875b141e694281dd6c Author: Casey Leedom Date: Thu Nov 11 09:30:43 2010 +0000 cxgb4vf: Advertise NETIF_F_TSO_ECN. Advertise NETIF_F_TSO_ECN. Signed-off-by: Casey Leedom Signed-off-by: David S. Miller commit 4204875dd4b3c3e40e0294a8c2619fdf9e5907e1 Author: Casey Leedom Date: Thu Nov 11 09:30:42 2010 +0000 cxgb4vf: fix up "Section Mismatch" compiler warning. Fix up "Section Mismatch" compiler warning and mark another routine as __devinit. Signed-off-by: Casey Leedom Signed-off-by: David S. Miller commit f12fe3536bebcbd2ccfa80030ec7d9868c488d30 Author: Casey Leedom Date: Thu Nov 11 09:30:41 2010 +0000 cxgb4vf: add ethtool statistics for GRO. Add ethtool statistics for GRO. Signed-off-by: Casey Leedom Signed-off-by: David S. Miller commit caedda35c6dba5a283e5d87e77a8d19ee4be3183 Author: Casey Leedom Date: Thu Nov 11 09:30:40 2010 +0000 cxgb4vf: minor comment/symbolic name cleanup. Minor cleanup of comments and symbolic constant names for clarity. Signed-off-by: Casey Leedom Signed-off-by: David S. Miller commit d9aa93804e53f2153260568024b75ad3d81784f9 Author: David S. Miller Date: Mon Nov 15 08:52:02 2010 -0800 ipv4: Fix build with multicast disabled. net/ipv4/igmp.c: In function 'ip_mc_inc_group': net/ipv4/igmp.c:1228: error: implicit declaration of function 'for_each_pmc_rtnl' net/ipv4/igmp.c:1228: error: expected ';' before '{' token net/ipv4/igmp.c: In function 'ip_mc_unmap': net/ipv4/igmp.c:1333: error: expected ';' before 'igmp_group_dropped' ... Move for_each_pmc_rcu and for_each_pmc_rtnl macro definitions outside of multicast ifdef protection. Reported-by: Stephen Rothwell Signed-off-by: David S. Miller commit 6021afcf19d8c6f5db6d11cadcfb6a22d0c28a48 Author: Edgar (gimli) Hucek Date: Tue Nov 9 17:38:42 2010 +0100 input: bcm5974: Add support for MacBookAir3 This patch adds support for the MacBookAir3,1 and MacBookAir3,2 models. [rydberg@euromail.se: touchpad range calibration] Cc: stable@kernel.org Signed-off-by: Edgar (gimli) Hucek Signed-off-by: Henrik Rydberg Signed-off-by: Jiri Kosina commit 20a4c261ad9cec39942257b1f91765a4b238db05 Author: Paul Fox Date: Mon Nov 15 01:33:24 2010 -0800 Input: hgpk - fix powersave mode Recent testing of this codepath showed that it wasn't working, perhaps due to changes within the input layer. This fixes it. Signed-off-by: Daniel Drake Signed-off-by: Dmitry Torokhov commit 34caed2082105a6d9f5aaba1cf4e02760cbee14e Author: Daniel Drake Date: Mon Nov 15 01:33:22 2010 -0800 Input: hgpk - recalibration tweaks Disable the recalibration guard where new recalibrations are triggered if we detect a packet too soon after calibrating - we found that this results in erroneous recalibrations, and if the recalibration failed then the rest of our badness-detection code will request another. Add a module option disabling all of the recalibration code, in case an OLPC deployment thinks all of the workarounds we have are doing more damage than good and wants to experiment with them all disabled. Based on work by Paul Fox. Signed-off-by: Daniel Drake Signed-off-by: Dmitry Torokhov commit 67f56bb0f4997b55291c162077e02e4f29639fc2 Author: Daniel Drake Date: Mon Nov 15 01:28:54 2010 -0800 Input: hgpk - detect simple mode overflows Based on work by Paul Fox. Signed-off-by: Daniel Drake Signed-off-by: Dmitry Torokhov commit 7e87fe84303cc54ecf3c7b688cb08ca24322a41d Author: Gerrit Renker Date: Sun Nov 14 17:26:13 2010 +0100 dccp ccid-2: Separate option parsing from CCID processing This patch replaces an almost identical replication of code: large parts of dccp_parse_options() re-appeared as ccid2_ackvector() in ccid2.c. Apart from the duplication, this caused two more problems: 1. CCIDs should not need to be concerned with parsing header options; 2. one can not assume that Ack Vectors appear as a contiguous area within an skb, it is legal to insert other options and/or padding in between. The current code would throw an error and stop reading in such a case. Since Ack Vectors provide CCID-specific information, they are now processed by the CCID directly, separating this functionality from the main DCCP code. Signed-off-by: Gerrit Renker commit 52394eecec4e6fa677a61af26f0bd35de665344e Author: Gerrit Renker Date: Sun Nov 14 17:26:02 2010 +0100 dccp ccid-2: Remove old infrastructure This removes * functions for which updates have been provided in the preceding patches and * the @av_vec_len field - it is no longer necessary since the buffer length is now always computed dynamically. Signed-off-by: Gerrit Renker commit d83447f0944e73d690218d79c07762ffa4ceb9e4 Author: Gerrit Renker Date: Sun Nov 14 17:25:46 2010 +0100 dccp ccid-2: Schedule Sync as out-of-band mechanism The problem with Ack Vectors is that i) their length is variable and can in principle grow quite large, ii) it is hard to predict exactly how large they will be. Due to the second point it seems not a good idea to reduce the MPS; in particular when on average there is enough room for the Ack Vector and an increase in length is momentarily due to some burst loss, after which the Ack Vector returns to its normal/average length. The solution taken by this patch is to subtract a minimum-expected Ack Vector length from the MPS, and to defer any larger Ack Vectors onto a separate Sync - but only if indeed there is no space left on the skb. This patch provides the infrastructure to schedule Sync-packets for transporting (urgent) out-of-band data. Its signalling is quicker than scheduling an Ack, since it does not need to wait for new application data. Signed-off-by: Gerrit Renker commit 18219463c884bfdb7954d298b9edb5194b14d621 Author: Gerrit Renker Date: Sun Nov 14 17:25:36 2010 +0100 dccp ccid-2: Consolidate Ack-Vector processing within main DCCP module This aggregates Ack Vector processing (handling input and clearing old state) into one function, for the following reasons and benefits: * all Ack Vector-specific processing is now in one place; * duplicated code is removed; * ensuring sanity: from an Ack Vector point of view, it is better to clear the old state first before entering new state; * Ack Event handling happens mostly within the CCIDs, not the main DCCP module. Signed-off-by: Gerrit Renker commit 3802408644515e29fb723d51a5317301b212cf3a Author: Gerrit Renker Date: Sun Nov 14 17:25:23 2010 +0100 dccp ccid-2: Update code for the Ack Vector input/registration routine This patch updates the code which registers new packets as received, using the new circular buffer interface. It contributes a new algorithm which * supports both tail/head pointers and buffer wrap-around and * deals with overflow (head/tail move in lock-step). Signed-off-by: Gerrit Renker commit 5753fdfe8bd8e9a2ff9e5af19b0ffc78bfcd502a Author: Gerrit Renker Date: Sun Nov 14 17:25:11 2010 +0100 dccp ccid-2: Algorithm to update buffer state This provides a routine to consistently update the buffer state when the peer acknowledges receipt of Ack Vectors; updating state in the list of Ack Vectors as well as in the circular buffer. While based on RFC 4340, several additional (and necessary) precautions were added to protect the consistency of the buffer state. These additions are essential, since analysis and experience showed that the basic algorithm was insufficient for this task (which lead to problems that were hard to debug). The algorithm now * deals with HC-sender acknowledging to HC-receiver and vice versa, * keeps track of the last unacknowledged but received seqno in tail_ackno, * has special cases to reset the overflow condition when appropriate, * is protected against receiving older information (would mess up buffer state). Signed-off-by: Gerrit Renker commit 4232f60791d12a5156c3e1c9b04ae08b873a2920 Author: Guennadi Liakhovetski Date: Thu Nov 11 14:45:09 2010 +0000 fbdev: sh_mobile_hdmi: add support for E-EDID parsing Many HDMI clients implement enhanced EDID blocks, which often contain additional supported video modes. This patch implements parsing of such E-EDID blocks. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit d8d776f3fb1ff19c37d43b600fc8c128ff172deb Merge: c724d07a56e60e91b0aa75193f86fb000545ffe4 0ad83f6882c41df1a7fa387086029e162038c1f2 Author: Paul Mundt Date: Mon Nov 15 14:57:49 2010 +0900 Merge branch 'fbdev/edid' of master.kernel.org:/pub/scm/linux/kernel/git/lethal/fbdev-2.6 into common/fbdev-edid commit 0ad83f6882c41df1a7fa387086029e162038c1f2 Author: Guennadi Liakhovetski Date: Thu Nov 11 15:45:04 2010 +0100 fbdev: when parsing E-EDID blocks, also use SVD entries Add parsing of E-EDID SVD entries. In this first version only a few CEA/EIA-861E modes are implemented, more can be added as needed. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit e4105119aca9b86b163fa07428df1f615034a03d Author: Guennadi Liakhovetski Date: Thu Nov 11 15:44:52 2010 +0100 fbdev: export fb_edid_add_monspecs() for modules, improve algorithm fb_edid_add_monspecs() should also be exported for use in modules, and it requires a dummy version for the case, when CONFIG_FB_MODE_HELPERS is not selected. This patch also improves the algorithm by removing a redundant memory allocation, adds function documentation, adds data verification and replaces memmove() with memcpy(). Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit 9fbbdde93231ad7f35c217aa6bbbc7995133f483 Author: Erik Gilling Date: Thu Nov 11 15:44:43 2010 +0100 video: add fb_edid_add_monspecs for parsing extended edid information Modern monitors/tvs have more extended EDID information blocks which can contain extra detailed modes. This adds a fb_edid_add_monspecs function which drivers can use to parse those additions blocks. Signed-off-by: Erik Gilling Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit bc3f67a3e1b20756d4bfa5886a6b8fd0c068e6a4 Author: Joe Perches Date: Sun Nov 14 19:04:47 2010 -0800 drivers/spi: Remove unnecessary semicolons Signed-off-by: Joe Perches Signed-off-by: Grant Likely commit c25ecd0a21d5e08160cb5cc984f9e2b8ee347443 Merge: 190683a9d5457e6d962c232ffbecac3ab158dddd 9457b24a0955bbdd2e89220a75de69fe09501bba Author: David S. Miller Date: Sun Nov 14 11:57:05 2010 -0800 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 commit 362d31297fafb150676f4d564ecc7f7f3e3b7fd4 Author: Steve French Date: Sun Nov 14 03:34:30 2010 +0000 [CIFS] fs/cifs/Kconfig: CIFS depends on CRYPTO_HMAC linux-2.6.37-rc1: I compiled a kernel with CIFS which subsequently failed with an error indicating it couldn't initialize crypto module "hmacmd5". CONFIG_CRYPTO_HMAC=y fixed the problem. This patch makes CIFS depend on CRYPTO_HMAC in kconfig. Signed-off-by: Jody Bruchon CC: Shirish Pargaonkar Signed-off-by: Steve French commit 59c55ba1fba61ae13fbfff094a674e73407201f1 Author: Jeff Layton Date: Fri Nov 12 06:30:29 2010 -0500 cifs: don't take extra tlink reference in initiate_cifs_search It's possible for initiate_cifs_search to be called on a filp that already has private_data attached. If this happens, we'll end up calling cifs_sb_tlink, taking an extra reference to the tlink and attaching that to the cifsFileInfo. This leads to refcount leaks that manifest as a "stuck" cifsd at umount time. Fix this by only looking up the tlink for the cifsFile on the filp's first pass through this function. When called on a filp that already has cifsFileInfo associated with it, just use the tlink reference that it already owns. This patch fixes samba.org bug 7792: https://bugzilla.samba.org/show_bug.cgi?id=7792 Signed-off-by: Jeff Layton Reviewed-and-Tested-by: Suresh Jayaraman Signed-off-by: Steve French commit 190683a9d5457e6d962c232ffbecac3ab158dddd Author: Eric Dumazet Date: Wed Nov 10 10:50:44 2010 +0000 net: net_families __rcu annotations Use modern RCU API / annotations for net_families array. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit e85eb11782259dc39502807f3ec903a7b82b1bab Author: Philippe De Muyter Date: Thu Nov 11 12:31:21 2010 +0000 net: Kconfig whitespace cleanup Many lines in Kconfig start withe 8 spaces instead of a TAB, and even sometimes with 7 spaces. Replace 10 or 9 spaces, or TAB + 1 space, by TAB + 2 spaces, and 8 or 7 spaces by TAB. Signed-off-by: Philippe De Muyter Signed-off-by: David S. Miller commit 1d7138de878d1d4210727c1200193e69596f93b3 Author: Eric Dumazet Date: Fri Nov 12 05:46:50 2010 +0000 igmp: RCU conversion of in_dev->mc_list in_dev->mc_list is protected by one rwlock (in_dev->mc_list_lock). This can easily be converted to a RCU protection. Writers hold RTNL, so mc_list_lock is removed, not replaced by a spinlock. Signed-off-by: Eric Dumazet Cc: Cypher Wu Cc: AmĂ©rico Wang Signed-off-by: David S. Miller commit f5539b5bfa2e00f2a6fd35731db66142a2f327c0 Author: Giuseppe Cavallaro Date: Fri Nov 12 12:43:34 2010 -0800 stmmac: update the driver documentation Signed-off-by: Giuseppe Cavallaro Signed-off-by: David S. Miller commit f92c8dd7a0eb18124521e2b549f88422e17f707b Author: Bob Peterson Date: Fri Nov 12 11:15:20 2010 -0600 dlm: reduce cond_resched during send Calling cond_resched() after every send can unnecessarily degrade performance. Go back to an old method of scheduling after 25 messages. Signed-off-by: Bob Peterson Signed-off-by: David Teigland commit cb2d45da81c86d5191b19d0f67732a854bc0253c Author: David Teigland Date: Fri Nov 12 11:12:55 2010 -0600 dlm: use TCP_NODELAY Nagling doesn't help and can sometimes hurt dlm comms. Signed-off-by: David Teigland commit dcce240ead802d42b1e45ad2fcb2ed4a399cb255 Author: Steven Whitehouse Date: Fri Nov 12 12:12:29 2010 +0000 dlm: Use cmwq for send and receive workqueues So far as I can tell, there is no reason to use a single-threaded send workqueue for dlm, since it may need to send to several sockets concurrently. Both workqueues are set to WQ_MEM_RECLAIM to avoid any possible deadlocks, WQ_HIGHPRI since locking traffic is highly latency sensitive (and to avoid a priority inversion wrt GFS2's glock_workqueue) and WQ_FREEZABLE just in case someone needs to do that (even though with current cluster infrastructure, it doesn't make sense as the node will most likely land up ejected from the cluster) in the future. Signed-off-by: Steven Whitehouse Cc: Tejun Heo Signed-off-by: David Teigland commit 87abb6bbdbcfbced2ce0bcad68dd89ac3ff9464b Author: Dmitry Torokhov Date: Thu Nov 11 22:03:59 2010 -0800 Input: mac mouse emulation - add locking We need to add appropriate locking when toggling mac mouse emulation on and off to ensure that input device and handler are in consistent state. Signed-off-by: Dmitry Torokhov commit a309cdc778b9eece59b34e9e1c26e41476dbbcd6 Author: Daniel Drake Date: Thu Nov 11 22:20:03 2010 -0800 Input: hgpk - extend jumpiness detection In addition to forcing recalibrations upon detection of cursor jumps (and performing them quicker than before), detect and discard errant 'jump' packets caused by a firmware bug, which are then repeated with each one being approximately half the delta of the one previously (as if it is averaging out) Based on original work by Paul Fox. Signed-off-by: Daniel Drake Signed-off-by: Dmitry Torokhov commit c0dc8342656a1425c31dcc505072f2387f0f0c92 Author: Daniel Drake Date: Thu Nov 11 22:20:02 2010 -0800 Input: hgpk - rework spew detection The old implementation of spew detection simply tracked the overall position delta of the cursor over every 100 packets. We found that this causes occasional false positives in spew detection, and also that the conditions of the spewy packets are perhaps more fixed than we once thought. Rework the spew detection to look for packets of specific small delta, and only recalibrating if the overall movement delta stays within expected bounds. Also discard duplicate packets in the advanced mode, which appear to be very common. If we don't, the spew detection kicks in far too early. If we get a large spew of duplicates, request a recalibration straight up. Based on earlier work by Paul Fox. Signed-off-by: Daniel Drake Signed-off-by: Dmitry Torokhov commit ca94ec43540ce5d93fd30a3bf88321b6f11ed51a Author: Daniel Drake Date: Thu Nov 11 22:19:57 2010 -0800 Input: hgpk - support GlideSensor and PenTablet modes Add a "hgpk_mode" sysfs attribute that allows selection between 3 options: Mouse (the existing option), GlideSensor and PenTablet. GlideSensor is an enhanced protocol for the regular touchpad mode that additionally reports pressure and uses absolute coordinates. We suspect that it may be more reliable than mouse mode in some environments. PenTablet mode puts the touchpad into resistive mode, you must then use a stylus as an input. We suspect this is the most reliable way to drive the touchpad. The GlideSensor and PenTablet devices expose themselves with the intention of being combined with the synaptics X11 input driver. Based on earlier work by Paul Fox. Signed-off-by: Daniel Drake Signed-off-by: Dmitry Torokhov commit 10ee2ded629b1571cef1182728d6f65dbe4c7f79 Author: Dmitry Torokhov Date: Thu Nov 11 01:03:00 2010 -0800 Input: pcf_keypad - convert to dev_op_ops Signed-off-by: Dmitry Torokhov commit 2a0591596b302adc654a1caf6bd3d0063407ea4b Author: Dmitry Torokhov Date: Thu Nov 11 21:52:18 2010 -0800 Input: xpad - remove useless check in xpad_remove ixpad can never be NULL here; if it is NULL we would not have been bound to the interface and then why would we be called? Signed-off-by: Dmitry Torokhov commit 161feb2417dd0c4324c2e8da24aaebd30a436d45 Author: Axel Lin Date: Thu Nov 11 21:47:42 2010 -0800 Input: xpad - fix resource reclaim in xpad_probe error path Properly free the resources in error path by the reverse order of resource allocation. Signed-off-by: Axel Lin Signed-off-by: Dmitry Torokhov commit 6ff92a6db2083ecd1a8e2742d9397159fd880987 Author: Axel Lin Date: Thu Nov 11 21:43:17 2010 -0800 Input: xpad - fix a memory leak In xpad_led_disconnect(), what we really want is to kfree(xpad_led). In xpad_disconnect(), add a missing kfree(xpad->bdata) to fix the memory leak. Signed-off-by: Axel Lin Signed-off-by: Dmitry Torokhov commit 49cc69b6789b57d2d8ed78843c4219525b433b58 Author: Axel Lin Date: Thu Nov 11 21:39:11 2010 -0800 Input: xpad - return proper error in error path In current implementation, xpad_probe return 0 when usb_alloc_urb failed for xpad->bulk_out and kzalloc failed for xpad->bdata. This patch removes the initialization for error variable, assign the error code at the place the error happens instead. Signed-off-by: Axel Lin Signed-off-by: Dmitry Torokhov commit c753796769e4fb0cd813b6e5801b3c01f4681d4f Author: David S. Miller Date: Thu Nov 11 17:07:48 2010 -0800 ipv4: Make rt->fl.iif tests lest obscure. When we test rt->fl.iif against zero, we're seeing if it's an output or an input route. Make that explicit with some helper functions. Signed-off-by: David S. Miller commit 37bc9f5078c62bfa73edeb0053edceb3ed5e46a4 Author: Dirk Brandewie Date: Tue Nov 9 12:08:08 2010 -0800 x86: Ce4100: Add reboot_fixup() for CE4100 This patch adds the CE4100 reboot fixup to reboot_fixups_32.c [ tglx: Moved PCI id to reboot_fixups_32.c ] Signed-off-by: Dirk Brandewie LKML-Reference: <5bdcfb4f0206fa721570504e95659a03b815bc5e.1289331834.git.dirk.brandewie@gmail.com> Signed-off-by: Thomas Gleixner commit 91d8037f563e4a86ff8b02c994530989c7936427 Author: Dirk Brandewie Date: Tue Nov 9 12:08:05 2010 -0800 ce4100: Add PCI register emulation for CE4100 This patch provides access methods for PCI registers that mis-behave on the CE4100. Each register can be assigned a private init, read and write routine. The exception to this is the bridge device. The bridge device is the only device on bus zero (0) that requires any fixup so it is a special case. [ tglx: minor coding style cleanups, __init annotation and simplification of ce4100_conf_read/write ] Signed-off-by: Dirk Brandewie LKML-Reference: <40b6751381c2275dc359db5a17989cce22ad8db7.1289331834.git.dirk.brandewie@gmail.com> Signed-off-by: Thomas Gleixner commit c751e17b5371ad86cdde6cf5c0175e06f3ff0347 Author: Thomas Gleixner Date: Tue Nov 9 12:08:04 2010 -0800 x86: Add CE4100 platform support Add CE4100 platform support. CE4100 needs early setup like moorestown. Signed-off-by: Thomas Gleixner Signed-off-by: Dirk Brandewie LKML-Reference: <94720fd7f5564a12ebf202cf2c4f4c0d619aab35.1289331834.git.dirk.brandewie@gmail.com> Signed-off-by: Thomas Gleixner commit 2adc2917ce4bfb482a6e3c05ff543cef151c9830 Author: Baurzhan Ismagulov Date: Thu Nov 11 10:54:58 2010 +0100 serial: cpu_uart: Remove unused uart_cpm_port fields AFAICT, these fields are not used anywhere. Signed-off-by: Baurzhan Ismagulov Signed-off-by: Greg Kroah-Hartman commit 5b04ec4ad8e2ffdc9d1f27fd6eb5118e919bc87d Author: Baurzhan Ismagulov Date: Thu Nov 11 10:53:03 2010 +0100 serial: cpm_uat: reducing CPM serial latency Setting Rx FIFO size to 1 reduces reader process wakeup latency up to 20x for baud rates <= 9600. This patch sets the Rx FIFO size to 1 for baud rates <= 9600 or if low latency has been requested for the tty. Signed-off-by: Michael Trimarchi Signed-off-by: Bruno Morelli Signed-off-by: Baurzhan Ismagulov Signed-off-by: Greg Kroah-Hartman commit 63295cb2ff4329f563579f3d20c5855a96a866d5 Author: Claudio Scordino Date: Thu Nov 11 11:22:36 2010 +0100 serial: add Documentation about RS485 serial communications Documentation about RS485 serial communications Signed-off-by: Claudio Scordino Acked-by: Randy Dunlap Acked-by: Russell King Acked-by: Grant Edwards Signed-off-by: Greg Kroah-Hartman commit 5f9a31d63105c3e88bd6d026e7bc53f02a5ac042 Author: Alan Cox Date: Thu Nov 4 15:17:27 2010 +0000 n_gsm: clean up printks [Original From Ken Mills but I redid it using pr_ helpers instead] Also fix up coding style, there are two warnings left but that is where the CodingStyle tools blow up because they cannot handle if (blah) { foo } else switch (x) { case 1: } Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit c2f2f0000bb69f067fea12624272e6a58a811702 Author: Alan Cox Date: Thu Nov 4 15:17:03 2010 +0000 n_gsm: Fix support for legacy encoding The mux supports several encoding schemes. Encoding 0 is a "not recommended" mode still sometimes used. This has now been tested with hardware that supports this mode, and found wanting. Fix the FCS handling in this mode and correct the state machine. Signed-off-by: Ken Mills Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 304e12665a4a7b8b25dfe8c64fa4fd56a04a67ea Author: Alexey Charkov Date: Mon Nov 8 20:33:20 2010 +0300 serial: Add support for UART on VIA VT8500 and compatibles This adds a driver for the serial ports found in VIA and WonderMedia Systems-on-Chip. Interrupt-driven FIFO operation is implemented. The hardware also supports pure register-based operation (which is slower) and DMA-based FIFO operation. As the FIFOs are only 16 bytes long, DMA operation is probably not worth the hassle. Signed-off-by: Alexey Charkov Signed-off-by: Greg Kroah-Hartman commit af3b8881f4c9852eefe9c7f1a997b3ecf580561b Author: Russ Gorby Date: Tue Oct 26 14:13:52 2010 +0100 ifx6x60: SPI protocol driver for Infineon 6x60 modem Prototype driver for the IFX6x60 series of SPI attached modems by Jim Stanley and Russ Gorby Signed-off-by: Russ Gorby [Some reworking and a major cleanup] Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit b36930dd508e00f0c5083bcd57d25de6d0375c76 Author: David Miller Date: Wed Nov 10 21:56:39 2010 -0800 dlm: Handle application limited situations properly. In the normal regime where an application uses non-blocking I/O writes on a socket, they will handle -EAGAIN and use poll() to wait for send space. They don't actually sleep on the socket I/O write. But kernel level RPC layers that do socket I/O operations directly and key off of -EAGAIN on the write() to "try again later" don't use poll(), they instead have their own sleeping mechanism and rely upon ->sk_write_space() to trigger the wakeup. So they do effectively sleep on the write(), but this mechanism alone does not let the socket layers know what's going on. Therefore they must emulate what would have happened, otherwise TCP cannot possibly see that the connection is application window size limited. Handle this, therefore, like SUNRPC by setting SOCK_NOSPACE and bumping the ->sk_write_count as needed when we hit the send buffer limits. This should make TCP send buffer size auto-tuning and the ->sk_write_space() callback invocations actually happen. Signed-off-by: David S. Miller Signed-off-by: David Teigland commit ed1deb7021b4dfee1d544b91edff4ef92f5c3b54 Merge: 72cdd1d971c0deb1619c5c339270570c43647a78 b3d14bff12a38ad13a174eb0cc83d2ac7169eee4 Author: David S. Miller Date: Thu Nov 11 10:43:30 2010 -0800 Merge branch 'dccp' of git://eden-feed.erg.abdn.ac.uk/net-next-2.6 commit 72cdd1d971c0deb1619c5c339270570c43647a78 Author: Eric Dumazet Date: Thu Nov 11 07:14:07 2010 +0000 net: get rid of rtable->idev It seems idev field in struct rtable has no special purpose, but adding extra atomic ops. We hold refcounts on the device itself (using percpu data, so pretty cheap in current kernel). infiniband case is solved using dst.dev instead of idev->dev Removal of this field means routing without route cache is now using shared data, percpu data, and only potential contention is a pair of atomic ops on struct neighbour per forwarded packet. About 5% speedup on routing test. Signed-off-by: Eric Dumazet Cc: Herbert Xu Cc: Roland Dreier Cc: Sean Hefty Cc: Hal Rosenstock Signed-off-by: David S. Miller commit 46b13fc5c0f239f36e84665c73087d5fa86bfd86 Author: Eric Dumazet Date: Thu Nov 11 06:57:19 2010 +0000 neigh: reorder struct neighbour It is important to move nud_state outside of the often modified cache line (because of refcnt), to reduce false sharing in neigh_event_send() This is a followup of commit 0ed8ddf4045f (neigh: Protect neigh->ha[] with a seqlock) This gives a 7% speedup on routing test with IP route cache disabled. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit c0c04c2a89cf6363da2940da59afd2e30001b991 Author: Jon Mason Date: Thu Nov 11 04:26:04 2010 +0000 vxge: update driver version Update vxge driver version Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit 2c91308f449c6705b81bd3370a0ec647e370f35c Author: Jon Mason Date: Thu Nov 11 04:26:03 2010 +0000 vxge: sparse and other clean-ups Correct issues found by running sparse on the vxge driver, as well as other miscellaneous cleanups. Signed-off-by: Jon Mason Signed-off-by: David S. Miller commit 1901d042abf10d08a829961a63fd158f9844587e Author: Jon Mason Date: Thu Nov 11 04:26:02 2010 +0000 vxge: update Kconfig Update Kconfig to reflect Exar's purchase of Neterion (formerly S2IO). Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit ca3e3b8fae982400dacbbf19f3112cc84e51d46a Author: Jon Mason Date: Thu Nov 11 04:26:01 2010 +0000 vxge: correct multi-function detection The values used to determined if the adapter is running in single or multi-function mode were previously modified to the values necessary when making the VXGE_HW_FW_API_GET_FUNC_MODE firmware call. However, the firmware call was not modified. This had the driver printing out on probe that the adapter was in multi-function mode when in single function mode and vice versa. Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit e7935c9669c27c5d530bff634c0c15f7a602d697 Author: Jon Mason Date: Thu Nov 11 04:26:00 2010 +0000 vxge: Titan1A detection Detect if the adapter is Titan or Titan1A, and tune the driver for this hardware. Also, remove unnecessary function __vxge_hw_device_id_get. Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit c3150eac9f2e5f770b09d371f7716540219a46f6 Author: Jon Mason Date: Thu Nov 11 04:25:59 2010 +0000 vxge: Handle errors in vxge_hw_vpath_fw_api Propagate the return code of the call to vxge_hw_vpath_fw_api and __vxge_hw_vpath_pci_func_mode_get. This enables the proper handling of error conditions when querying the function mode of the device during probe. Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit b81b37338412e3215670641e5025c85146521dea Author: Jon Mason Date: Thu Nov 11 04:25:58 2010 +0000 vxge: add receive hardware timestamping Add support for enable/disabling hardware timestamping on receive packets via ioctl call. When enabled, the hardware timestamp replaces the FCS in the payload. Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit e8ac175615b9458a00193c55617b5b8865e67817 Author: Jon Mason Date: Thu Nov 11 04:25:57 2010 +0000 vxge: add support for ethtool firmware flashing Add the ability in the vxge driver to flash firmware via ethtool. Updated to include comments from Ben Hutchings. Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit 8424e00dfd5282026a93996a165fc4079d382169 Author: Jon Mason Date: Thu Nov 11 04:25:56 2010 +0000 vxge: serialize access to steering control register It is possible for multiple callers to access the firmware interface for the same vpath simultaneously, resulting in uncertain output. Add locks to serialize access. Also, make functions only accessed locally static, thus requiring some movement of code blocks. Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit ddd62726e0bc1ffe0ab791b647f4178161ab451b Author: Jon Mason Date: Thu Nov 11 04:25:55 2010 +0000 vxge: cleanup debug printing and asserts Remove all of the unnecessary debug printk indirection and temporary variables for vxge_debug_ll and vxge_assert. Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit 4d2a5b406c02b224bd3f50992c8b02450c65a730 Author: Jon Mason Date: Thu Nov 11 04:25:54 2010 +0000 vxge: Wait for Rx to become idle before reseting or closing Wait for the receive traffic to become idle before attempting to close or reset the adapter. To enable the processing of packets while Receive Idle, move the clearing of __VXGE_STATE_CARD_UP bit in vxge_close to after it. Also, modify the return value of the ISR when the adapter is down to IRQ_HANDLED. Otherwise there are unhandled interrupts for the device. Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit 47f01db44b2470d9517848f6b73c75883ef5fda0 Author: Jon Mason Date: Thu Nov 11 04:25:53 2010 +0000 vxge: enable rxhash Enable RSS hashing and add ability to pass up the adapter calculated rx hash up the network stack (if feature is available). Add the ability to enable/disable feature via ethtool, which requires that the adapter is not running at the time. Other miscellaneous cleanups and fixes required to get RSS working. Signed-off-by: Jon Mason Signed-off-by: Ram Vepa Signed-off-by: David S. Miller commit 6f207e9bb4219d261d9326597ca533f954f31755 Author: Feng Tang Date: Thu Nov 11 15:50:50 2010 +0000 x86: mrst: Set vRTC's IRQ to level trigger type When setting up the mpc_intsrc structure for vRTC's IRQ, we need to set its irqflag to level trigger, otherwise it will be taken as edge triggered and the vRTC IRQ will fire only once, as there is never a EOI issued from the IA core for it. The original code worked in previous kernel. This is because it was configured to level trigger type by luck. It fell into the default PCI trigger category which is level triggered. Signed-off-by: Feng Tang Signed-off-by: Alan Cox LKML-Reference: <20101111155019.12924.569.stgit@localhost.localdomain> Signed-off-by: Thomas Gleixner commit 8af27e1dc4e4dd7a7b04c2cd0fc3d419d91d45b0 Author: Eric Dumazet Date: Tue Nov 9 16:29:27 2010 +0100 fixdep: use hash table instead of a single array I noticed fixdep uses ~2% of cpu time in kernel build, in function use_config() fixdep spends a lot of cpu cycles in linear searches in its internal string array. With about 400 stored strings per dep file, this begins to be noticeable. Convert fixdep to use a hash table. kbuild results on my x86_64 allmodconfig Before patch : real 10m30.414s user 61m51.456s sys 8m28.200s real 10m12.334s user 61m50.236s sys 8m30.448s real 10m42.947s user 61m50.028s sys 8m32.380s After: real 10m8.180s user 61m22.506s sys 8m32.384s real 10m35.039s user 61m21.654s sys 8m32.212s real 10m14.487s user 61m23.498s sys 8m32.312s Signed-off-by: Eric Dumazet Signed-off-by: Michal Marek commit e86c2412c88fbe4676920c40348d3c547c9edb0d Author: maximilian attems Date: Fri Oct 29 15:55:50 2010 +0200 kbuild, deb-pkg: Fix build with paranoid umask umask 077 make deb-pkg dpkg-deb: building package `linux-image-2.6.36+' in `../linux-image-2.6.36+_2.6.36+-4_amd64.deb'. dpkg-deb: control directory has bad permissions 700 (must be >=0755 and <=0775) make[1]: *** [deb-pkg] Error 2 Reported-by: Bastian Blank Signed-off-by: maximilian attems Signed-off-by: Michal Marek commit ad78acafeed26f62c9e644f96eecb7c19bd78bb4 Author: Alexey Charkov Date: Sun Nov 7 19:28:55 2010 +0300 usb: Add support for VIA VT8500 and compatibles in EHCI HCD VIA and WonderMedia Systems-on-Chip feature a standard EHCI host controller. This adds necessary glue to use the standard driver with these systems. Signed-off-by: Alexey Charkov Signed-off-by: Greg Kroah-Hartman commit 8be8a9d3d16a25645b7869e4544a9d0ec386966a Author: Tatyana Brokhman Date: Mon Nov 1 17:38:05 2010 +0200 usb: dummy_hcd code simplification Take handling of the control requests out from dummy_timer to a different function. Signed-off-by: Tatyana Brokhman Signed-off-by: Greg Kroah-Hartman commit 0eadcc09203349b11ca477ec367079b23d32ab91 Author: Tatyana Brokhman Date: Mon Nov 1 18:18:24 2010 +0200 usb: USB3.0 ch11 definitions Adding hub SuperSpeed usb definitions as defined by ch10 of the USB3.0 spec. Signed-off-by: Tatyana Brokhman Signed-off-by: Greg Kroah-Hartman commit b73af61e3283068f680e58e091ceafcb88d74b22 Author: Michal Nazarewicz Date: Thu Oct 28 17:31:23 2010 +0200 USB: gadget: f_mass_storage: code style clean ups This commit is purely style clean ups. Signed-off-by: Michal Nazarewicz Signed-off-by: Greg Kroah-Hartman commit 00cb636ed87a65b512012ea4236348af19daef1e Author: Michal Nazarewicz Date: Thu Oct 28 17:31:22 2010 +0200 USB: gadget: f_mass_storage: remove needless complete() This commit removes call to the complete() function done in fsg_unbind() which was never needed there but was a leftover form file_storage.c. Signed-off-by: Michal Nazarewicz Signed-off-by: Greg Kroah-Hartman commit fe52f7922c446b2f604ef609153f1cef0ea17278 Author: Michal Nazarewicz Date: Thu Oct 28 17:31:21 2010 +0200 USB: gadget: f_mass_storage: drop START_TRANSFER() macro This commit drops START_TRANSFER_OR() and START_TRANSFER() macros with a pair of nice inline functions which are actually more readable and easier to use. Signed-off-by: Michal Nazarewicz Signed-off-by: Greg Kroah-Hartman commit 1ccd7923fe521273d63d936129754e71a33ebe51 Author: Michal Nazarewicz Date: Thu Oct 28 17:31:20 2010 +0200 USB: gadget: f_mass_storage: use ?: instead of a macro This commit removes an "OR" macro defined in Mass Storage Function in favour of a two argument version of "?:" operator (which is a GCC extension). Signed-off-by: Michal Nazarewicz Signed-off-by: Greg Kroah-Hartman commit 17a936117c587c23aafafdb9cd6d433a90daa83d Author: Rahul Ruikar Date: Thu Oct 28 17:31:19 2010 +0200 USB: gadget: f_mass_storage: put_device() in error recovery This commit fixes an issue with error recovery after device_register() fails in Mass Storage Function. The device needs to be put to avoid resource leakage. Signed-off-by: Rahul Ruikar [mina86@mina86.com: updated commit message] Signed-off-by: Michal Nazarewicz Signed-off-by: Greg Kroah-Hartman commit d9385b6352da7fed50981f375c2ccb60354039a6 Author: Michal Nazarewicz Date: Thu Oct 28 17:31:18 2010 +0200 USB: gadget: file_storage: put_device() in error recovery This commit fixes some issues with File-backed Storage Gadget error recovery when registering LUN's devices. First of all, when device_register() fails the device still needs to be put. However, because lun_release() decreases fsg->ref reference counter the counter must be incremented beforehand. Second of all, after any of the device_create_file()s fails, device_unregister() is called which in turn (indirectly) calls lun_release() which decrements fsg->ref. So, again, the reference counter must be incremented beforehand. Lastly, if the first or the second device_create_file() succeeds, the files are never removed. To fix it, device_remove_file() needs to be called. This is done by simply marking LUN as registered prior to creating files so that fsg_unbind() can handle removing files. Signed-off-by: Michal Nazarewicz Reported-by: Rahul Ruikar Acked-by: Alan Stern Signed-off-by: Greg Kroah-Hartman commit 78bff3c65df33da47e93736bd8847b694084e5a9 Author: Marek Belisko Date: Wed Oct 27 10:19:01 2010 +0200 USB: gadget: composite: Typo fix. Signed-off-by: Marek Belisko Acked-by: David Brownell Signed-off-by: Greg Kroah-Hartman commit 8b455561d28bcfac17d6910e64c616cf684da07f Author: Julia Lawall Date: Tue Oct 26 12:25:31 2010 +0200 USB: gadget: amd5536udc.c: delete double assignment Delete successive assignments to the same location. A simplified version of the semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // @@ expression i; @@ *i = ...; i = ...; // Signed-off-by: Julia Lawall Acked-by: Thomas Dahlmann Signed-off-by: Greg Kroah-Hartman commit 06c3859fc9bd62edb7211b241eadd0cdc8ecbecd Author: Uwe Kleine-König Date: Mon Oct 25 16:30:12 2010 +0200 usb: gadget/imx-udc: remove usage of deprecated symbol USBD_INT0 Since v2.6.34-rc2~66^2~5^2~47 USBD_INT0 is deprecated in favour of MX1_USBD_INT0. So use the new name. Signed-off-by: Uwe Kleine-König Signed-off-by: Greg Kroah-Hartman commit f7043ecbb3f7b8632a6d6470f8f95160ac868d0f Author: Bill Pemberton Date: Thu Oct 21 14:43:05 2010 -0400 USB: ssu100: remove max_packet_size calculation The max_packet_size logic is taken from ftdi_sio, but it's not needed for this device. This also makes proces_read_urb simpler. Signed-off-by: Bill Pemberton Signed-off-by: Greg Kroah-Hartman commit 06fc8846a2c0ddcc51e6666a78fc29a8e749ca3b Author: Brett Rudley Date: Wed Nov 10 17:19:41 2010 -0800 staging: brcm80211: Remove unused module parameters. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 86071535f845fd054753122e564cee9406c84e70 Author: Vinod Koul Date: Wed Nov 10 17:40:48 2010 +0000 x86: mrst: Add audio driver bindings This patch adds the sound card bindings for Moorestown (pmic_audio) and the Medfield platform (msic_audio) as IPC devices. This ensures they will be created at the right time. Signed-off-by: Vinod Koul Signed-off-by: Alan Cox LKML-Reference: <20101110174044.11340.78008.stgit@localhost.localdomain> Signed-off-by: Thomas Gleixner commit 0146f26145af75d53e12dbf23a36996aff373680 Author: Feng Tang Date: Wed Nov 10 17:29:17 2010 +0000 rtc: Add drivers/rtc/rtc-mrst.c Provide the standard kernel rtc driver interface on top of the vrtc layer added in the previous patch. Signed-off-by: Feng Tang LKML-Reference: <20101110172911.3311.20593.stgit@localhost.localdomain> [Fixed swapped arguments on IPC] Signed-off-by: Arjan van de Ven [Cleaned up and the device creation moved to arch/x86/platform] Signed-off-by: Alan Cox Signed-off-by: Thomas Gleixner commit 7309282c90d251cde77fe3b520a8276e25315c49 Author: Feng Tang Date: Wed Nov 10 17:29:00 2010 +0000 x86: mrst: Add vrtc driver which serves as a wall clock device Moorestown platform doesn't have a m146818 RTC device like traditional x86 PC, but a firmware emulated virtual RTC device(vrtc), which provides some basic RTC functions like get/set time. vrtc serves as the only wall clock device on Moorestown platform. [ tglx: Changed the exports to _GPL ] Signed-off-by: Feng Tang Signed-off-by: Jacob Pan Signed-off-by: Alan Cox LKML-Reference: <20101110172837.3311.40483.stgit@localhost.localdomain> Signed-off-by: Thomas Gleixner commit cfb505a7ebd4c84206b4cc7d9f966d864a2ac05a Author: Alek Du Date: Wed Nov 10 16:50:08 2010 +0000 x86: mrst: Add Moorestown specific reboot/shutdown support Moorestowns needs to use a special IPC command to reboot or shutdown the platform. Signed-off-by: Alek Du Signed-off-by: Alan Cox LKML-Reference: <20101110164928.6365.94243.stgit@localhost.localdomain> Signed-off-by: Thomas Gleixner commit 987b21d7d91d0335e164a41a312174851c58f333 Author: Shirish Pargaonkar Date: Wed Nov 10 07:50:35 2010 -0600 cifs: Percolate error up to the caller during get/set acls [try #4] Modify get/set_cifs_acl* calls to reutrn error code and percolate the error code up to the caller. Signed-off-by: Shirish Pargaonkar Reviewed-by: Jeff Layton Signed-off-by: Steve French commit a7851ce73b9fdef53f251420e6883cf4f3766534 Author: Oskar Schirmer Date: Wed Nov 10 21:06:13 2010 +0000 cifs: fix another memleak, in cifs_root_iget cifs_root_iget allocates full_path through cifs_build_path_to_root, but fails to kfree it upon cifs_get_inode_info* failure. Make all failure exit paths traverse clean up handling at the end of the function. Signed-off-by: Oskar Schirmer Reviewed-by: Jesper Juhl Cc: stable@kernel.org Signed-off-by: Steve French commit 6174c3496d43b78969d4a989e1aabfbc55acbf15 Author: Greg Kroah-Hartman Date: Wed Nov 10 17:08:26 2010 -0800 Revert "staging: batman-adv: Use linux/etherdevice.h address helper functions" This reverts commit 5712dc7fc812d1bdbc5e634d389bc759d4e7550c. Turns out the batman maintainers didn't like the implementation of it, and the original author was going to rework it to meet their approval, and I applied it without fully realizing all of this. My fault. Cc: Marek Lindner Cc: Simon Wunderlich Cc: Andrew Lunn Cc: Tobias Klauser Signed-off-by: Greg Kroah-Hartman commit 319684b1cd15f24120b9513b38a949539c0b7938 Author: Brandon Philips Date: Sat Nov 6 21:19:22 2010 -0400 driver core: fix whitespace in class_attr_string 869dfc875e3 addded a long line and indented with spaces. Fix. Signed-off-by: Brandon Philips Signed-off-by: Greg Kroah-Hartman commit 318af55ddd38bdaaa2b57f5c3bd394f3ce3a2610 Author: Hans J. Koch Date: Sat Oct 30 00:36:47 2010 +0200 uio: Change mail address of Hans J. Koch My old mail address doesn't exist anymore. This changes all occurrences to my new address. Signed-off-by: Hans J. Koch Signed-off-by: Greg Kroah-Hartman commit b17cd8d69a75f921d9d444cc3ac9b5b1d0b66ca0 Author: Brandon Philips Date: Sun Nov 7 01:28:24 2010 -0500 driver core: prune docs about device_interface drivers/base/intf.c was removed before the beginning of (git) time but its Documentation stuck around. Remove it. Signed-off-by: Brandon Philips Signed-off-by: Greg Kroah-Hartman commit 3701befc44eb9b0e5a0e0b7169448658919b9850 Author: Jesper Juhl Date: Wed Nov 10 21:31:38 2010 +0100 Staging, bcm: Remove unnecessary casts of void ptr returning alloc function return values Here's a patch against a copy of linux-next that I just cloned. Don't pointlessly cast pointers returned by allocation functions that return void pointers which are implicitly converted. For drivers/staging/bcm/ Signed-off-by: Jesper Juhl Signed-off-by: Greg Kroah-Hartman commit afabbe6db368fbed0569d31d402aceb631d9f854 Author: facugaich Date: Wed Nov 10 10:39:33 2010 -0300 Staging: solo6x10: Fix checkpatch errors and most warnings This patch fixes all errors and most warnings reported by checkpatch.pl for all the files in the driver. v2: Fix a typo and update the patch against the latest HEAD Signed-off-by: Facundo Gaich Signed-off-by: Greg Kroah-Hartman commit 16618c20e18d60b2c8908b7758228a62a450769a Author: Alejandro R. Sedeño Date: Wed Nov 10 01:42:02 2010 -0500 Staging: beceem: Move ZTE TU25's USB id to the beceem module Signed-off-by: Alejandro R. Sedeño Signed-off-by: Greg Kroah-Hartman commit b706113f1475ce983faabf12120ac4e90d512d02 Author: Alejandro R. Sedeño Date: Wed Nov 10 01:42:01 2010 -0500 Staging: beceem: Use 32-bit integers for hardware register values Switching to UINT because that's what the rest of this codebase uses. Signed-off-by: Alejandro R. Sedeño Signed-off-by: Greg Kroah-Hartman commit 2dab1ac81b4767095f96503a9ac093a68c6e9c95 Author: Marek Belisko Date: Wed Nov 10 10:04:30 2010 +0100 staging: ft1000: Create common return point. When reg_ft1000_netdev() fails created kthread isn't stopped. So add return point for stopping thread. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit c8b124e21dbb7f4941f292fea446ce63d92d80dd Author: Marek Belisko Date: Wed Nov 10 09:29:35 2010 +0100 staging: ft1000: Check return value of kthread_run. kthread_run could fail so we will check return value. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit a10bb4fb199bd7a1dc178a6228ad749f5070e0f9 Author: Larry Finger Date: Tue Nov 9 18:26:34 2010 -0600 staging: r8712u: Update TODO for sparse fixes Signed-off-by: Larry Finger Signed-off-by: Greg Kroah-Hartman commit 6036f373ea03687d355634fa70fb04baa95ab75e Author: Kees Cook Date: Wed Nov 10 10:35:54 2010 -0800 x86, cpu: Only CPU features determine NX capabilities Fix the NX feature boot warning when NX is missing to correctly reflect that BIOSes cannot disable NX now. Signed-off-by: Kees Cook LKML-Reference: <1289414154-7829-5-git-send-email-kees.cook@canonical.com> Acked-by: Pekka Enberg Acked-by: Alan Cox Signed-off-by: H. Peter Anvin commit ebba638ae723d8a8fc2f7abce5ec18b688b791d7 Author: Kees Cook Date: Wed Nov 10 10:35:53 2010 -0800 x86, cpu: Call verify_cpu during 32bit CPU startup The XD_DISABLE-clearing side-effect needs to happen for both 32bit and 64bit, but the 32bit init routines were not calling verify_cpu() yet. This adds that call to gain the side-effect. The longmode/SSE tests being performed in verify_cpu() need to happen very early for 64bit but not for 32bit. Instead of including it in two places for 32bit, we can just include it once in arch/x86/kernel/head_32.S. Signed-off-by: Kees Cook LKML-Reference: <1289414154-7829-4-git-send-email-kees.cook@canonical.com> Acked-by: Pekka Enberg Acked-by: Alan Cox Signed-off-by: H. Peter Anvin commit ae84739c27b6b3725993202fe02ff35ab86468e1 Author: Kees Cook Date: Wed Nov 10 10:35:52 2010 -0800 x86, cpu: Clear XD_DISABLED flag on Intel to regain NX Intel CPUs have an additional MSR bit to indicate if the BIOS was configured to disable the NX cpu feature. This bit was traditionally used for operating systems that did not understand how to handle the NX bit. Since Linux understands this, this BIOS flag should be ignored by default. In a review[1] of reported hardware being used by Ubuntu bug reporters, almost 10% of systems had an incorrectly configured BIOS, leaving their systems unable to use the NX features of their CPU. This change will clear the MSR_IA32_MISC_ENABLE_XD_DISABLE bit so that NX cannot be inappropriately controlled by the BIOS on Intel CPUs. If, under very strange hardware configurations, NX actually needs to be disabled, "noexec=off" can be used to restore the prior behavior. [1] http://www.outflux.net/blog/archives/2010/02/18/data-mining-for-nx-bit/ Signed-off-by: Kees Cook LKML-Reference: <1289414154-7829-3-git-send-email-kees.cook@canonical.com> Acked-by: Pekka Enberg Acked-by: Alan Cox Signed-off-by: H. Peter Anvin commit c5cbac69422a9bffe7c7fd9a115130e272b547f5 Author: Kees Cook Date: Wed Nov 10 10:35:51 2010 -0800 x86, cpu: Rename verify_cpu_64.S to verify_cpu.S The code is 32bit already, and can be used in 32bit routines. Signed-off-by: Kees Cook LKML-Reference: <1289414154-7829-2-git-send-email-kees.cook@canonical.com> Acked-by: Pekka Enberg Acked-by: Alan Cox Signed-off-by: H. Peter Anvin commit b3d14bff12a38ad13a174eb0cc83d2ac7169eee4 Author: Gerrit Renker Date: Wed Nov 10 21:21:35 2010 +0100 dccp ccid-2: Implementation of circular Ack Vector buffer with overflow handling This completes the implementation of a circular buffer for Ack Vectors, by extending the current (linear array-based) implementation. The changes are: (a) An `overflow' flag to deal with the case of overflow. As before, dynamic growth of the buffer will not be supported; but code will be added to deal robustly with overflowing Ack Vector buffers. (b) A `tail_seqno' field. When naively implementing the algorithm of Appendix A in RFC 4340, problems arise whenever subsequent Ack Vector records overlap, which can bring the entire run length calculation completely out of synch. (This is documented on http://www.erg.abdn.ac.uk/users/gerrit/dccp/notes/\ ack_vectors/tracking_tail_ackno/ .) (c) The buffer length is now computed dynamically (i.e. current fill level), as the span between head to tail. As a result, dccp_ackvec_pending() is now simpler - the #ifdef is no longer necessary since buf_empty is always true when IP_DCCP_ACKVEC is not configured. Signed-off-by: Gerrit Renker commit 7d870936602533836bba821bd5c679c62c52a95f Author: Gerrit Renker Date: Wed Nov 10 21:21:02 2010 +0100 dccp ccid-2: Separate internals of Ack Vectors from option-parsing code This patch * separates Ack Vector housekeeping code from option-insertion code; * shifts option-specific code from ackvec.c into options.c; * introduces a dedicated routine to take care of the Ack Vector records; * simplifies the dccp_ackvec_insert_avr() routine: the BUG_ON was redundant, since the list is automatically arranged in descending order of ack_seqno. Signed-off-by: Gerrit Renker commit f17a37c9b8c4b32c01e501a84fa6f30e344c6110 Author: Gerrit Renker Date: Wed Nov 10 21:20:07 2010 +0100 dccp ccid-2: Ack Vector interface clean-up This patch brings the Ack Vector interface up to date. Its main purpose is to lay the basis for the subsequent patches of this set, which will use the new data structure fields and routines. There are no real algorithmic changes, rather an adaptation: (1) Replaced the static Ack Vector size (2) with a #define so that it can be adapted (with low loss / Ack Ratio, a value of 1 works, so 2 seems to be sufficient for the moment) and added a solution so that computing the ECN nonce will continue to work - even with larger Ack Vectors. (2) Replaced the #defines for Ack Vector states with a complete enum. (3) Replaced #defines to compute Ack Vector length and state with general purpose routines (inlines), and updated code to use these. (4) Added a `tail' field (conversion to circular buffer in subsequent patch). (5) Updated the (outdated) documentation for Ack Vector struct. (6) All sequence number containers now trimmed to 48 bits. (7) Removal of unused bits: * removed dccpav_ack_nonce from struct dccp_ackvec, since this is already redundantly stored in the `dccpavr_ack_nonce' (of Ack Vector record); * removed Elapsed Time for Ack Vectors (it was nowhere used); * replaced semantics of dccpavr_sent_len with dccpavr_ack_runlen, since the code needs to be able to remember the old run length; * reduced the de-/allocation routines (redundant / duplicate tests). Signed-off-by: Gerrit Renker commit 0c6202b3278b417444a59cecc59e6e5af04db7fd Author: Ron Mercer Date: Wed Nov 10 09:29:46 2010 +0000 qlge: Version change to v1.00.00.27 Signed-off-by: Jitendra Kalsaria Signed-off-by: Ron Mercer Signed-off-by: David S. Miller commit 673483c7d3a25c43d1208bb07e3888bc5136e8cf Author: Ron Mercer Date: Wed Nov 10 09:29:45 2010 +0000 qlge: Add firmware info to ethtool get regs. By default we add firmware information to ethtool get regs. Optionally firmware info can instead be sent to log. Signed-off-by: Jitendra Kalsaria Signed-off-by: Ron Mercer Signed-off-by: David S. Miller commit ebe2e91e000c59aed0300d81815f451c85e0bda6 Author: Jeff Layton Date: Wed Nov 10 10:19:10 2010 -0500 cifs: fix potential use-after-free in cifs_oplock_break_put cfile may very well be freed after the cifsFileInfo_put. Make sure we have a valid pointer to the superblock for cifs_sb_deactive. Signed-off-by: Jeff Layton Signed-off-by: Steve French commit 5bdb05f91b27b9361c4f348a4e05999f597df72e Author: Darren Hart Date: Mon Nov 8 13:40:28 2010 -0800 futex: Add futex_q static initializer The futex_q struct has grown considerably over the last couple years. I believe it now merits a static initializer to avoid uninitialized data errors (having spent more time than I care to admit debugging an uninitialized q.bitset in an experimental new op code). With the key initializer built in, several of the FUTEX_KEY_INIT calls can be removed. V2: use a static variable instead of an init macro. use a C99 initializer and don't rely on variable ordering in the struct. V3: make futex_q_init const Signed-off-by: Darren Hart Cc: Peter Zijlstra Cc: Eric Dumazet Cc: John Kacur Cc: Ingo Molnar LKML-Reference: <1289252428-18383-1-git-send-email-dvhart@linux.intel.com> Signed-off-by: Thomas Gleixner commit b41277dc7a18ee332d9e8078e978bacdf6e76157 Author: Darren Hart Date: Mon Nov 8 13:10:09 2010 -0800 futex: Replace fshared and clockrt with combined flags In the early days we passed the mmap sem around. That became the "int fshared" with the fast gup improvements. Then we added "int clockrt" in places. This patch unifies these options as "flags". [ tglx: Split out the stale fshared cleanup ] Signed-off-by: Darren Hart Cc: Peter Zijlstra Cc: Eric Dumazet Cc: John Kacur Cc: Ingo Molnar LKML-Reference: <1289250609-16304-1-git-send-email-dvhart@linux.intel.com> Signed-off-by: Thomas Gleixner commit ae791a2d2e382adc69990a144a7f1a6c4bc24f1e Author: Thomas Gleixner Date: Wed Nov 10 13:30:36 2010 +0100 futex: Cleanup stale fshared flag interfaces The fast GUP changes stopped using the fshared flag in put_futex_keys(), but we kept the interface the same. Cleanup all stale users. This patch is split out from Darren Harts combo patch which also combines various flags. This way the changes are clearly separated. Signed-off-by: Thomas Gleixner Cc: Darren Hart LKML-Reference: <1289250609-16304-1-git-send-email-dvhart@linux.intel.com> commit c7657ac0c3e4d4ab569296911164b7a2b0ff871a Author: Borislav Petkov Date: Mon Nov 1 23:36:53 2010 +0100 x86, microcode, AMD: Cleanup code a bit get_ucode_data is a memcpy() wrapper which always returns 0. Move it into the header and make it an inline. Remove all code checking its return value and turn it into a void. There should be no functionality change resulting from this patch. Signed-off-by: Borislav Petkov commit 1ea6be212eea5ce1e8fabadacb0c639ad87b2f00 Author: Jesper Juhl Date: Mon Nov 1 22:44:34 2010 +0100 x86, microcode, AMD: Replace vmalloc+memset with vzalloc We don't have to do memset() ourselves after vmalloc() when we have vzalloc(), so change that in arch/x86/kernel/microcode_amd.c::get_next_ucode(). Signed-off-by: Jesper Juhl Signed-off-by: Borislav Petkov commit 7decaa557a20f48aabef35f817ec16ef563567b0 Author: Marcelo Roberto Jimenez Date: Mon Oct 18 22:35:54 2010 +0100 ARM: 6454/1: sa1100: Fix for a nasty initialization bug in the RTSR. This patch fixes a nasty initialization condition on the RTSR register. Sometimes, bit 1 will wake up set, sometimes not. This can be seen by checking the value of the RTSR by typing '$ cat /proc/driver/rtc', which has been provided by the previous patch. If this bit is set, the command '$ cat /dev/rtc0' will lock the system in an endless interrupt routine calling loop. This patch fixes the issue both at sa1100_rtc_probe(), where it avoids a spurious interrupt from happening, and at sa1100_rtc_interrupt(), which is the robust solution, though it does not avoid the first spurious interrupt. Signed-off-by: Marcelo Roberto Jimenez Signed-off-by: Russell King commit fd3ee6d3421bc05ce42ee7f48071aee72051af28 Author: Marcelo Roberto Jimenez Date: Mon Oct 18 22:34:47 2010 +0100 ARM: 6453/1: sa1100: Print the value of RTSR on /proc/drivers/rtc. This patch adds a line to the output of /proc/drivers/rtc to show the value of the RTSR register. It will be used to demonstrate a nasty initialization bug that will be fixed in the sequence. Signed-off-by: Marcelo Roberto Jimenez Signed-off-by: Russell King commit a404ad1ff593589bdd34c48ebecddada9edbfaf3 Author: Marcelo Roberto Jimenez Date: Mon Oct 18 22:33:53 2010 +0100 ARM: 6452/1: Fix checkpatch.pl issues in drivers/rtc/rtc-sa1100.c. This patch fixes checkpatch.pl issues in drivers/rtc/rtc-sa1100.c, which I will later modify. Signed-off-by: Marcelo Roberto Jimenez Signed-off-by: Russell King commit d03f322c41890a86bf64d00314f0ec72738a7f21 Author: Marcelo Roberto Jimenez Date: Mon Oct 18 22:31:26 2010 +0100 ARM: 6450/1: Fix checkpatch.pl issues in arch/arm/mach-sa1100/cpu-sa1100.c. This patch fixes checkpatch.pl issues in arch/arm/mach-sa1100/cpu-sa1100.c. Signed-off-by: Marcelo Roberto Jimenez Signed-off-by: Russell King commit 34177802001894e064c857cac2759f68119550cd Author: Linus Walleij Date: Tue Oct 19 12:43:58 2010 +0100 ARM: 6438/2: mmci: add SDIO support for ST Variants This adds some minor variant data and trickery to enable SDIO on the ST Micro variants of MMCI/PL180. Signed-off-by: Marcin Mielczarczyk Signed-off-by: Linus Walleij Signed-off-by: Russell King commit f20f8f21e0402c785c342547f7e49eafc42cfb52 Author: Linus Walleij Date: Tue Oct 19 13:41:24 2010 +0100 ARM: 6399/3: mmci: handle broken MCI_DATABLOCKEND hardware On the U300 the MCI_DATAEND and MCI_DATABLOCKEND IRQs can arrive out-of-order. Replace an ugly #ifdef hack with a proper runtime solution which models what is really happening. In the U300 DMA mode and on all Ux500 models, the MCI_DATABLOCKEND flag isn't properly cleared in hardware following and ACK leading to all kind of weird behaviour when the flag is still up in subsequent interrupts, so we add two flags indicating the error and handle this runtime. Cc: Rabin Vincent Signed-off-by: Linus Walleij Signed-off-by: Russell King commit 2686b4b408c25349aee7b35558722d5730d67224 Author: Linus Walleij Date: Tue Oct 19 12:39:48 2010 +0100 ARM: 6311/2: mmci: work with only one irq The DBx500 variants have only one IRQ line hooked up. Allow these (and any other implementations which choose to use only one irq) to work by directing the PIO interrupts also to the first IRQ line. Signed-off-by: Rabin Vincent Signed-off-by: Linus Walleij Signed-off-by: Russell King commit 5e4f083f78d03e9f8d2e327daccde16976f9bb00 Author: Yong Zhang Date: Sun Oct 24 11:50:53 2010 +0800 hrtimer: Remove stale comment on curr_timer curr_timer doesn't resident in struct hrtimer_cpu_base anymore. Signed-off-by: Yong Zhang LKML-Reference: <1287892253-2587-1-git-send-email-yong.zhang0@gmail.com> Signed-off-by: Thomas Gleixner commit 12ddf37444eaaf67b147561141150e10a56d7742 Merge: dc7c0b6a6d28b0de231728de963ed53a9cee85cf c724d07a56e60e91b0aa75193f86fb000545ffe4 Author: Paul Mundt Date: Wed Nov 10 18:34:49 2010 +0900 Merge branch 'common/fbdev' of master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6 commit da1d39e3903bc35be2b5e8d2116fdd5d337244d4 Author: Simon Horman Date: Tue Nov 9 17:47:02 2010 +0900 mmc, sh: Move constants to sh_mmcif.h This moves some constants from sh_mmcif.c to sh_mmcif.h so that they can be used in sh_mmcif_boot_init(). It also alters the definition of SOFT_RST_OFF from (0 << 31) to ~SOFT_RST_ON (= ~(1 << 31)). The former seems bogus. The latter is consistent with the code in sh_mmcif_boot_init(). Cc: Yusuke Goda Cc: Magnus Damm Signed-off-by: Simon Horman Signed-off-by: Paul Mundt commit 3cf9b85b474e656a0856b88290c7a289ac5ea247 Author: Joe Perches Date: Fri Nov 5 16:12:38 2010 -0700 locking, lockdep: Convert sprintf_symbol to %pS Signed-off-by: Joe Perches Cc: Peter Zijlstra Cc: Jiri Kosina LKML-Reference: <1288998760-11775-6-git-send-email-joe@perches.com> Signed-off-by: Ingo Molnar commit f6cd24777513fcc673d432cc29ef59881d3e4df1 Author: Eric Dumazet Date: Thu Nov 4 11:13:48 2010 +0100 irq: Better struct irqaction layout We currently use kmalloc-96 slab for struct irqaction allocations on 64bit arches. This is unfortunate because of possible false sharing and two cache lines accesses. Move 'name' and 'dir' fields at the end of the structure, and force a suitable alignement. Hot path fields now use one cache line on x86_64. Signed-off-by: Eric Dumazet Reviewed-by: Andi Kleen Cc: Peter Zijlstra LKML-Reference: <1288865628.2659.69.camel@edumazet-laptop> Signed-off-by: Thomas Gleixner commit 640dcfa0ff49ea1fcddad39e7c468683d9f00342 Author: Guennadi Liakhovetski Date: Tue Nov 2 11:27:34 2010 +0000 ARM: mach-shmobile: optimize PLLC2 frequency for HDMI On ap4evb PLLC2 is only used as a parent of the HDMI clock, therefore it can be reconfigured freely to improve HDMI clock precision. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit c724d07a56e60e91b0aa75193f86fb000545ffe4 Author: Paul Mundt Date: Wed Nov 10 17:54:20 2010 +0900 fbdev: sh_mobile_hdmi: fix up compiler warnings. CC drivers/video/sh_mobile_hdmi.o drivers/video/sh_mobile_hdmi.c: In function 'sh_hdmi_avi_infoframe_setup': drivers/video/sh_mobile_hdmi.c:539: warning: unused variable 'var' drivers/video/sh_mobile_hdmi.c: In function 'sh_hdmi_clk_configure': drivers/video/sh_mobile_hdmi.c:1021: warning: unused variable 'pdata' Signed-off-by: Paul Mundt commit 830539d14379d0f5cb07832a3e4466418011f843 Author: Paul Mundt Date: Wed Nov 10 17:51:44 2010 +0900 fbdev: sh_mobile_lcdcfb: fix up compiler warnings. CC drivers/video/sh_mobile_lcdcfb.o drivers/video/sh_mobile_lcdcfb.c: In function 'sh_mobile_check_var': drivers/video/sh_mobile_lcdcfb.c:922: warning: format '%u' expects type 'unsigned int', but argument 11 has type 'long unsigned int' Signed-off-by: Paul Mundt commit 0ea2af1c15b730dba9ce741420352d298bcd7862 Author: Guennadi Liakhovetski Date: Thu Nov 4 11:06:17 2010 +0000 fbdev: sh_mobile_hdmi: add support for 1080p modes Add support for 3 more preprogrammed video modes: 1080p at 24, 50, and 60Hz. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit d2ecbab5960d9814a269d36723647d6ef391ba8f Author: Guennadi Liakhovetski Date: Thu Nov 4 11:06:06 2010 +0000 fbdev: sh_mobile_lcdc: increase maximum framebuffer size to support 1080p LCDC hardware can support 1920x1080 formats, adjust the driver to cover them. Besides, instead of guessing some "reasonable" validity checks, only verify values in .fb_check_var(), that we are sure, we cannot support. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit 8c183ecee23991dd6c0476a537c6bae8afd2567e Author: Guennadi Liakhovetski Date: Tue Nov 2 11:27:20 2010 +0000 fbdev: sh_mobile_hdmi: improve support for more video modes Configure pre-programmed VIC modes for VGA (640x480@60) and 720x576@50 modes, change PHY mode selection to be based on pixel clock frequency. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit c36940e678fc30779c99246c034deca1fed61ae4 Author: Guennadi Liakhovetski Date: Tue Nov 2 11:27:16 2010 +0000 fbdev: sh_mobile_hdmi: add support for more precise HDMI clock configuration The HDMI clock has to be reconfigured for different video modes. However, the precision of the supplying SoC clock on SH-Mobile systems is often insufficient. This patch allows to additionally reconfigure the parent clock to achieve the optimal HDMI clock frequency, in case this is supported by the platform. Signed-off-by: Guennadi Liakhovetski Signed-off-by: Paul Mundt commit eae6cb31d890e2860f9ce1b8ba73c27b6005af68 Author: Grant Likely Date: Thu Oct 14 09:32:53 2010 -0600 spi/xilinx: merge OF support code into main driver Now that the of_platform_bus_type has been merged with the platform bus type, a single platform driver can handle both OF and non-OF use cases. This patch merges the OF support into the platform driver. Signed-off-by: Grant Likely Tested-by: Michal Simek commit 8fd8821b62397f8ddb7bfb23c3246a22770ab2ee Author: Grant Likely Date: Thu Oct 14 09:04:29 2010 -0600 spi/xilinx: fold platform_driver support into main body This patch merges the platform driver support into the main body of xilinx_spi.c in preparation for merging the OF and non-OF support code. Signed-off-by: Grant Likely Tested-by: Michal Simek commit 91565c4068042b3d8e37e64e393ca105476419bd Author: Grant Likely Date: Thu Oct 14 08:54:55 2010 -0600 spi/xilinx: Eliminate pdata references from common code. The current code has the OF binding modifying the platform_data pointer which it must not do, and the common code doesn't really need to use a pdata pointer. This patch eliminates the platform_data references from the common part of the driver in preparation for merging the OF and non-OF versions. Signed-off-by: Grant Likely Tested-by: Michal Simek commit dc7c0b6a6d28b0de231728de963ed53a9cee85cf Merge: d6ff7d0fe22cdf3ea41c48b50da9a9181500d1bf b884a94ed16d1a633e76f80fb1bd75d0e7373ce3 Author: Paul Mundt Date: Wed Nov 10 12:04:41 2010 +0900 Merge branch 'viafb-next' of git://github.com/schandinat/linux-2.6 commit 0a1c62dedc6e28a1117b00c4ccb4427bc91b9f29 Author: Jesper Juhl Date: Tue Nov 9 00:10:35 2010 +0100 staging, spectra: Remove unnecessary casts of void ptr returning alloc function return values Hi, The [vk][cmz]alloc(_node) family of functions return void pointers which it's completely unnecessary/pointless to cast to other pointer types since that happens implicitly. This patch removes such casts from drivers/staging/spectra/ Signed-off-by: Jesper Juhl Signed-off-by: Greg Kroah-Hartman commit 5ef3df5b9fed56e64e8544e36a175354d38d0206 Author: Jesper Juhl Date: Tue Nov 9 00:10:44 2010 +0100 staging, wlags49_h2: Remove unnecessary casts of void ptr returning alloc function return values Hi, The [vk][cmz]alloc(_node) family of functions return void pointers which it's completely unnecessary/pointless to cast to other pointer types since that happens implicitly. This patch removes such casts from drivers/staging/wlags49_h2/ Signed-off-by: Jesper Juhl Signed-off-by: Greg Kroah-Hartman commit 3c4e9c84970e555a80a4c92a5a3d3125c63f0e12 Author: Jesper Juhl Date: Tue Nov 9 00:09:38 2010 +0100 staging, ath6kl: Remove unnecessary casts of void ptr returning alloc function return values Hi, The [vk][cmz]alloc(_node) family of functions return void pointers which it's completely unnecessary/pointless to cast to other pointer types since that happens implicitly. This patch removes such casts from drivers/staging/ath6kl/ Signed-off-by: Jesper Juhl Signed-off-by: Greg Kroah-Hartman commit 131a14b3f0330a844f79c6b87c0fe57ec86faf62 Author: Jesper Juhl Date: Tue Nov 9 00:10:25 2010 +0100 staging, rt2860: Remove unnecessary casts of void ptr returning alloc function return values Hi, The [vk][cmz]alloc(_node) family of functions return void pointers which it's completely unnecessary/pointless to cast to other pointer types since that happens implicitly. This patch removes such casts from drivers/staging/rt2860/ Signed-off-by: Jesper Juhl Signed-off-by: Greg Kroah-Hartman commit 60a1d01bcd348ae1c791260d2df564d9ffc1ac97 Author: Jesper Juhl Date: Tue Nov 9 00:10:15 2010 +0100 staging, keucr: Remove unnecessary casts of void ptr returning alloc function return values Hi, The [vk][cmz]alloc(_node) family of functions return void pointers which it's completely unnecessary/pointless to cast to other pointer types since that happens implicitly. This patch removes such casts from drivers/staging/keucr/ Signed-off-by: Jesper Juhl Signed-off-by: Greg Kroah-Hartman commit 6ccb5d7c62845788be9aafef26132333a07708bb Author: Justin P. Mattock Date: Mon Nov 8 13:41:46 2010 -0800 staging: Fix typos in rt2860 Here is a patch that fixes some typos, and comments in drivers/staging/rt2860 Signed-off-by: Justin P. Mattock Signed-off-by: Greg Kroah-Hartman commit 1ac586445db8e46f0007855c5c7161ff55484836 Author: Haiyang Zhang Date: Mon Nov 8 14:04:47 2010 -0800 staging: hv: Convert camel cased functions in ring_buffer.c to lower cases staging: hv: Convert camel cased functions in ring_buffer.c to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit fc8c72ebfa7547c044bab48fb8bba6906123f8c7 Author: Haiyang Zhang Date: Mon Nov 8 14:04:46 2010 -0800 staging: hv: Convert camel cased local variables in ring_buffer.c to lower cases staging: hv: Convert camel cased local variables in ring_buffer.c to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 82f8bd40a017716bfadcf074b4c6110ebe4c7ba6 Author: Haiyang Zhang Date: Mon Nov 8 14:04:45 2010 -0800 staging: hv: Convert camel cased struct fields in ring_buffer.h to lower cases staging: hv: Convert camel cased struct fields in ring_buffer.h to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 203df82d81a331e16caee4c2346cd382fcd820d6 Author: Haiyang Zhang Date: Mon Nov 8 14:04:44 2010 -0800 staging: hv: Convert camel cased functions in osd.c to lower cases staging: hv: Convert camel cased functions in osd.c to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit d39f12866d90829e1ae0440c0203dd5a162c8cd8 Author: Haiyang Zhang Date: Mon Nov 8 14:04:43 2010 -0800 staging: hv: Convert camel cased local variables in osd.c to lower cases staging: hv: Convert camel cased local variables in osd.c to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit d44890c8d2a83116463c230b59b9b9d356aafe85 Author: Haiyang Zhang Date: Mon Nov 8 14:04:42 2010 -0800 staging: hv: Convert camel cased functions in hv.c to lower cases staging: hv: Convert camel cased functions in hv.c to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit b8dfb264f4f9e55f9cf8384cb782dfe5159c413c Author: Haiyang Zhang Date: Mon Nov 8 14:04:41 2010 -0800 staging: hv: Convert camel cased local variables in hv.c to lower cases staging: hv: Convert camel cased local variables in hv.c to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit 6a0aaa185057801343e000183ef0695c2a2b75a9 Author: Haiyang Zhang Date: Mon Nov 8 14:04:40 2010 -0800 staging: hv: Convert camel cased struct fields in hv.h to lower cases staging: hv: Convert camel cased struct fields in hv.h to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit f6feebe073db4c97dc10f6fab54f9d4b5816886b Author: Haiyang Zhang Date: Mon Nov 8 14:04:39 2010 -0800 staging: hv: Convert camel cased struct fields in hv_api.h to lower cases staging: hv: Convert camel cased struct fields in hv_api.h to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit c50f7fb28400bc4829c26bb4a2d6c06a45e90b1a Author: Haiyang Zhang Date: Mon Nov 8 14:04:38 2010 -0800 staging: hv: Convert camel cased struct fields in channel_mgmt.h to lower cases staging: hv: Convert camel cased struct fields in channel_mgmt.h to lower cases Signed-off-by: Haiyang Zhang Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman commit a32d4acab4a862c5cd297b73d625d813af8d4e0b Author: Tracey Dent Date: Sat Nov 6 14:48:48 2010 -0400 Staging: speakup: spk_types: trival coding style issue Checkpatch.pl gives WARNING: missing space after struct definition. This patch fixes that warning that was on line 55. Signed-off-by: Tracey Dent Signed-off-by: Greg Kroah-Hartman commit 3c9d46526db88218a311a72971efae1b4366d4c6 Author: Jesper Juhl Date: Sun Nov 7 07:37:03 2010 +0100 Staging: Cypress WestBridge OMAP3430 Kernel Hal: Remove unneeded local variables from alloc functions In drivers/staging/westbridge/astoria/arch/arm/mach-omap2/cyashalomap_kernel.c the local variables 'ret_p' are not needed and should just go away. I have no way to test this code, but I believe the change is obviously correct. Please consider it. Signed-off-by: Jesper Juhl Acked-by: David Cross Signed-off-by: Greg Kroah-Hartman commit 6f710907ff452ab67bd1161bc3f7a95f9a7e809d Author: Johan Meiring Date: Sat Nov 6 18:21:59 2010 +0200 Staging: wlan-ng: fixed coding style issues in p80211netdev.c This is a patch to the p80211netdev.c file that fixes warnings that were found by the checkpatch.pl tool Signed-off-by: Johan Meiring Signed-off-by: Greg Kroah-Hartman commit 869c4b4a715af94a14ec074c0a5528a562e3322b Author: Johan Meiring Date: Sat Nov 6 15:59:50 2010 +0200 Staging: wlan-ng: fixed coding style issues in p80211conv.h This is a patch to the p80211conv.h file that fixes two 80 character line limit styling issues Signed-off-by: Johan Meiring Signed-off-by: Greg Kroah-Hartman commit 9f027eb6871335f6e16633df796263f983f08844 Author: Johan Meiring Date: Sat Nov 6 18:24:46 2010 +0200 Staging: asus_oled: fix coding style issue in asus_oled.c This is a patch to the asus_oled.c file that fixes up brace and enum warning found by the checkpatch.pl tool Signed-off-by: Johan Meiring Signed-off-by: Greg Kroah-Hartman commit f83dfd065817ea3c7387b23afb2fd4d23fb470ff Author: Johan Meiring Date: Sat Nov 6 18:23:44 2010 +0200 Staging: wlan-ng: fix coding style issues in prism2mgmt.c This is a patch to prism2mgmt.c that fixes coding style issues found by checkpatch.pl. Three instances of the 80 char line limit being exceeded have been kept as is so that string literals are not split up. Signed-off-by: Johan Meiring Signed-off-by: Greg Kroah-Hartman commit c5de2157b801b9f38c7852b4d30fea8aff0c1bbd Author: Johan Meiring Date: Sat Nov 6 18:23:09 2010 +0200 Staging: wlan-ng: fix coding style issues in p80211types.h This is a patch that fixes various coding style issues in p80211types.h. The typedef declarations have been kept as they seem necessary. Signed-off-by: Johan Meiring Signed-off-by: Greg Kroah-Hartman commit 4314e5a68ab014092a55d5b2b26964952a97bc85 Author: Johan Meiring Date: Sat Nov 6 18:22:42 2010 +0200 Staging: wlan-ng: fixed coding style issues in p80211netdev.h This is a patch to the p80211netdev.h file that fixes up warnings found by the checkpatch.pl tool. The typedefs have been left in place as they seem necessary. Signed-off-by: Johan Meiring Signed-off-by: Greg Kroah-Hartman commit 5b84cc781058bb452f869d84bb24442ec51948c4 Author: Joe Perches Date: Thu Nov 4 20:07:59 2010 -0700 staging: Use vzalloc Signed-off-by: Joe Perches Signed-off-by: Greg Kroah-Hartman commit 4eb28f7197a2cbaf7a9be778d429a5fb9bb6172e Author: Johan Meiring Date: Sat Nov 6 15:46:54 2010 +0200 Staging: wlan-ng: fixed coding style issues in p80211conv.c This is a patch to the p80211conv.c file that fixes a couple of coding style issues found by the checkpatch.pl tool. Signed-off-by: Johan Meiring Signed-off-by: Greg Kroah-Hartman commit 4c510e95aef6138242ed4bc7fe29ee184bea413f Author: Larry Finger Date: Sun Nov 7 12:22:18 2010 -0600 staging: r8712u: Remove extraneous variables from osdep_service.h Jesper Juhl submitted a patch to remove one extraneous variable in this file; however, there are several others. Signed-off-by: Larry Finger Reviewed-by: Jesper Juhl Signed-off-by: Greg Kroah-Hartman commit a2ac9d69d69d8df88d4096903f5f76fe2de2345b Author: Jesper Juhl Date: Sun Nov 7 12:22:18 2010 -0600 staging: r8712u: Remove unneeded local variable in _malloc in osdep_service.h header The variable 'pbuf' is not needed. Signed-off-by: Jesper Juhl Signed-off-by: Larry Finger Signed-off-by: Greg Kroah-Hartman commit 268dfede46e24eef55a2ef7a10a462617936771e Author: Mike Thomas Date: Sun Nov 7 20:11:36 2010 +0000 staging/easycap: Improve interface to the videodev module The changes here represent an intermediate step towards bringing the driver within the V4L2 framework. Signed-off-by: Mike Thomas Signed-off-by: Greg Kroah-Hartman commit ae59dad4fef271222d65ac6afe2889eb12ea6ca9 Author: Mike Thomas Date: Sun Nov 7 20:09:19 2010 +0000 staging/easycap: Eliminate BKL No locking is required for normal operation of the driver, but locking is needed to prevent an Oops during some hot-unplugging scenarios. The BKL is replaced here by mutex locks together with traps to detect null pointers following asynchronous device disconnection. Signed-off-by: Mike Thomas Signed-off-by: Greg Kroah-Hartman commit 2a87a0b9220f8e0e6f204b0f61dc6e15ad64ccd4 Author: Mike Thomas Date: Sun Nov 7 20:07:12 2010 +0000 staging/easycap: Avoid compiler warning about frame size ... larger than ... Replacing some of the large automatic variables by dynamically allocated variables in the IOCTL routines gets rid of the compiler warning. Signed-off-by: Mike Thomas Signed-off-by: Greg Kroah-Hartman commit 94155cf4195bb3be0068481dc21e8688eda2e051 Author: Mike Thomas Date: Sun Nov 7 20:05:51 2010 +0000 staging/easycap: Add option to set the hardware audio gain A new module parameter adjusts the gain of the AC'97 audio chip, if one is present. Attenuation as well as amplification should be possible according to the datasheet, but attenuation seems not to work yet. Signed-off-by: Mike Thomas Signed-off-by: Greg Kroah-Hartman commit 849322a0f114e52d05e16fe8349843c980cff2c6 Author: Mike Thomas Date: Sun Nov 7 20:03:50 2010 +0000 staging/easycap: Add option to show conspicuous indication of signal loss A new module parameter turns on the option of displaying a testcard when the analogue input signal is lost (more precisely: when the hardware detects no field/frame synchronization). This feature has been requested in the context of security cameras used at night. Signed-off-by: Mike Thomas Signed-off-by: Greg Kroah-Hartman commit 40b8d50ac98f8c8779aea7459f805e5a69fdb726 Author: Mike Thomas Date: Sun Nov 7 20:02:15 2010 +0000 staging/easycap: Implement interlaced modes and reduced framerates Interlaced modes are requested by tvtime. Reduced framerates are preferred by some userspace programs, e.g. astronomy applications. Signed-off-by: Mike Thomas Signed-off-by: Greg Kroah-Hartman commit f36bc37a48148f31f936557b811431b98dbfe347 Author: Mike Thomas Date: Sun Nov 7 20:00:35 2010 +0000 staging/easycap: Improve hardware initialization Sometimes at startup the video urbs consistently and persistently deliver bad data, each video frame (not isoc frame) containing an excess of precisely two bytes. A brute-force cure implemented here is to repeatedly reinitialize the registers of the SAA7113H chip and the STK1160 USB bridge until good behaviour is obtained. Signed-off-by: Mike Thomas Signed-off-by: Greg Kroah-Hartman commit e68703cfe8dd2f5605c53b46fae6c9c027e7ef50 Author: Mike Thomas Date: Sun Nov 7 19:58:55 2010 +0000 staging/easycap: Make code re-entrant In order to allow multiple EasyCAP dongles to operate simultaneously without mutual interference all static variables have been eliminated except for a persistent inventory of plugged-in dongles at module level. Signed-off-by: Mike Thomas Signed-off-by: Greg Kroah-Hartman commit ce36cedab3f865969653bf4360f7e364ab0937e4 Author: Mike Thomas Date: Sun Nov 7 19:56:40 2010 +0000 staging/easycap: Remove obsolete routines The so-called bridger routine has proved unnecessary following general improvements elsewhere. The explain_() functions were a convenience during early development, but are unnecessary and inappropriate now. Signed-off-by: Mike Thomas Signed-off-by: Greg Kroah-Hartman commit 050afc92ee394ccdd953f91dcbbf9af863af8efc Merge: 391a169e99c789d59ef2a6b0cb80d1c6f63238dd 5bf68592e72eb0ded154efaaf43b39aab6964fc3 Author: Greg Kroah-Hartman Date: Tue Nov 9 16:12:37 2010 -0800 Staging: Merge Ben Collins solo6x10 tree with upstream There were some duplicate changes that needed to be hand-merged due to fixes needed to keep .37 building and working properly. Signed-off-by: Greg Kroah-Hartman commit 391a169e99c789d59ef2a6b0cb80d1c6f63238dd Author: Jesper Juhl Date: Thu Nov 4 22:27:42 2010 +0100 pohmelfs: remove unneeded conditionals before calls to crypto_destroy_tfm wrappers. Hi, crypto_free_hash() and crypto_free_ablkcipher() are just wrappers around crypto_free_tfm() which is itself just a wrapper around crypto_destroy_tfm(). Passing crypto_destroy_tfm() a NULL pointer is valid, so there's no reason to check for NULL first. Removing the unneeded conditionals (which is what the patch does) brings us the benefit of having to execute a few fewer test/branch instructions and also reduces object code size slightly: before: text data bss dec hex filename 8630 112 3312 12054 2f16 drivers/staging/pohmelfs/crypto.o 0000000000000cbe : cbe: 55 push %rbp cbf: 48 89 e5 mov %rsp,%rbp cc2: 53 push %rbx cc3: 48 83 ec 08 sub $0x8,%rsp cc7: e8 00 00 00 00 callq ccc ccc: 48 ff 05 00 00 00 00 incq 0x0(%rip) # cd3 cd3: 48 89 fb mov %rdi,%rbx cd6: 48 8b 7f 20 mov 0x20(%rdi),%rdi cda: 48 85 ff test %rdi,%rdi cdd: 74 0c je ceb cdf: 48 ff 05 00 00 00 00 incq 0x0(%rip) # ce6 ce6: e8 58 fa ff ff callq 743 ceb: 48 8b 7b 28 mov 0x28(%rbx),%rdi cef: 48 85 ff test %rdi,%rdi cf2: 75 09 jne cfd cf4: 48 ff 05 00 00 00 00 incq 0x0(%rip) # cfb cfb: eb 16 jmp d13 cfd: 48 89 fe mov %rdi,%rsi d00: 48 ff 05 00 00 00 00 incq 0x0(%rip) # d07 d07: e8 00 00 00 00 callq d0c d0c: 48 ff 05 00 00 00 00 incq 0x0(%rip) # d13 d13: 48 8b 7b 18 mov 0x18(%rbx),%rdi d17: e8 00 00 00 00 callq d1c d1c: 48 ff 05 00 00 00 00 incq 0x0(%rip) # d23 d23: 5e pop %rsi d24: 5b pop %rbx d25: c9 leaveq d26: c3 retq after: text data bss dec hex filename 8604 112 3296 12012 2eec drivers/staging/pohmelfs/crypto.o 0000000000000cbe : cbe: 55 push %rbp cbf: 48 89 e5 mov %rsp,%rbp cc2: 53 push %rbx cc3: 48 83 ec 08 sub $0x8,%rsp cc7: e8 00 00 00 00 callq ccc ccc: 48 ff 05 00 00 00 00 incq 0x0(%rip) # cd3 cd3: 48 89 fb mov %rdi,%rbx cd6: 48 8b 7f 20 mov 0x20(%rdi),%rdi cda: e8 64 fa ff ff callq 743 cdf: 48 8b 7b 28 mov 0x28(%rbx),%rdi ce3: 48 ff 05 00 00 00 00 incq 0x0(%rip) # cea cea: 48 89 fe mov %rdi,%rsi ced: e8 00 00 00 00 callq cf2 cf2: 48 8b 7b 18 mov 0x18(%rbx),%rdi cf6: 48 ff 05 00 00 00 00 incq 0x0(%rip) # cfd cfd: e8 00 00 00 00 callq d02 d02: 48 ff 05 00 00 00 00 incq 0x0(%rip) # d09 d09: 5e pop %rsi d0a: 5b pop %rbx d0b: c9 leaveq d0c: c3 retq Signed-off-by: Jesper Juhl Acked-by: Evgeniy Polyakov Signed-off-by: Greg Kroah-Hartman commit 5712dc7fc812d1bdbc5e634d389bc759d4e7550c Author: Tobias Klauser Date: Wed Nov 3 10:59:02 2010 +0100 staging: batman-adv: Use linux/etherdevice.h address helper functions Replace custom ethernet address check functions by calls to the helpers in linux/etherdevice.h In one case where the address was tested for broadcast and multicast address, the broadcast address check can be omitted as broadcast is also a multicast address. The patch is only compile-tested. Cc: Marek Lindner Cc: Simon Wunderlich Cc: Andrew Lunn Signed-off-by: Tobias Klauser Signed-off-by: Greg Kroah-Hartman commit e09f138e06d4f1ea63079e25bb55ee1dacff7933 Author: Marek Belisko Date: Wed Nov 3 11:19:55 2010 +0100 staging: ft1000: Get rid of UINT typedef usage. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit c613f6f50f9d98015b8640f9aeff3b0c8e07548e Author: Marek Belisko Date: Wed Nov 3 11:19:54 2010 +0100 staging: ft1000: Get rid of PCHAR typedef usage. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 81584137d8c97ab6bd87c2b4091f6105f600e66e Author: Marek Belisko Date: Thu Nov 4 07:37:13 2010 +0100 staging: ft1000: Get rid of BOOLEAN typedef usage. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 84b7801d135ca90903df3a9170b9db5978fe8fce Author: Marek Belisko Date: Wed Nov 3 11:19:52 2010 +0100 staging: ft1000: Get rid of ULONG typedef usage. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit d44d76f93dafdbaeac0f1d541f3867777de65c8a Author: Marek Belisko Date: Wed Nov 3 11:19:51 2010 +0100 staging: ft1000: Get rid of PULONG typedef usage. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit fc549a05e74edf9535862a4e517e63ade3908f75 Author: Marek Belisko Date: Wed Nov 3 11:19:50 2010 +0100 staging: ft1000: Get rid of USHORT typedef usage. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit d1674983e0fdf3a18dbc4ac7f1f0912f7b1c246e Author: Marek Belisko Date: Wed Nov 3 11:19:49 2010 +0100 staging: ft1000: GEt rid of PUSHORT typedef usage. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit c8f775c88b1b84909d5d73b171a48302bf46b2f8 Author: Marek Belisko Date: Wed Nov 3 11:19:48 2010 +0100 staging: ft1000: Get rid of UCHAR typedef. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit e2cb7da1671eb659c8edc81be9838afdd0b6b2cc Author: Marek Belisko Date: Wed Nov 3 11:19:47 2010 +0100 staging: ft1000: Get rid of PUCHAR typedef. PUCHAR typedef was replaces by u8 *. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 95112cb448b5962daeee68db8ee523b71266e28b Author: Marek Belisko Date: Tue Nov 2 14:51:47 2010 +0100 staging: ft1000: Check return value. Function ft1000_submit_rx_urb() could fail so add checking for return value. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit d7780865164f2efe3ea2fa6f1ebdf61ecc1f2a4d Author: Marek Belisko Date: Tue Nov 2 14:51:46 2010 +0100 staging: ft1000: Correct return error values. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 3b3291e868695194096591c4a5e3e302939e4c2b Author: Marek Belisko Date: Tue Nov 2 14:51:45 2010 +0100 staging: ft1000: Use common return point. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 35e9403b052ff6cad71bc5d9a075385e0c62ab96 Author: Marek Belisko Date: Tue Nov 2 14:51:44 2010 +0100 staging: ft1000: Use specific error codes instead self defined. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit d2b07455b85d20c72e4182fe7d53d8c70838f984 Author: Marek Belisko Date: Tue Nov 2 13:44:10 2010 +0100 staging: ft1000: Pseudo header handlig improved. Handling for pseudo header was done by directly copying data to tx buffer. This hide a functionality and make code unreadable. Use approach where fill pseudo_hdr structure first with data and then copy to beginning of buffer. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 019bd3f825a7fc438b1e9ce7d145b03f13102aee Author: Marek Belisko Date: Tue Nov 2 13:44:09 2010 +0100 staging: ft1000: Remove dead code. Remove functions which was used nowhere. Also remove dead variables used by this functions. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit eb21c1587ac3272d58592e775dc55af6266f7403 Author: Marek Belisko Date: Tue Nov 2 13:44:08 2010 +0100 staging: ft1000: Use memset instead looping with for. Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman commit 4d26d7e6ba3fffd224560acd586526bf2f2f4f73 Author: Pekka Enberg Date: Mon Nov 1 22:29:31 2010 +0200 Staging: w35und: Kill struct hwdata ->SurpriseRemoveCount This patch kills the ->SurpriseRemoveCount member of struct hwdata. It's not used at all so it's safe to remove it. Acked-by: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit 87cb9a6310bc5183de196b25ef6adfda3080a744 Author: Pekka Enberg Date: Mon Nov 1 22:29:30 2010 +0200 Staging: w35und: Kill struct hwdata ->HwStop This patch kills the ->HwStop member of struct hwdata. It's a read-only variable that's always zero so it's safe to remove it. Acked-by: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit 4d0d302257d3d0eccf371aab49c74b41797bebc3 Author: Pekka Enberg Date: Mon Nov 1 22:29:29 2010 +0200 Staging: w35und: Kill struct hwdata ->NullPacketCount This patch kills the NullPacketCount member of struct hwdata. It's not used for anything so it's safe to remove it. Acked-by: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit 6112063d804aa0afc8d4462b22e36fc259393b64 Author: Pekka Enberg Date: Mon Nov 1 22:29:28 2010 +0200 Staging: w35und: Kill empty Mds_Destroy function The Mds_Destroy() function doesn't do anything so kill it. Acked-by: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit 9dd5f271441bbe85578c2b7841820d8bca26096c Author: Mauro Schilman Date: Mon Nov 1 14:12:05 2010 -0300 Staging: frontier: fix space and * coding style issues in alphatrack.c This is a patch to the alphatrack.c file that fixes up a space warning and a space after '*' warning found by the checkpatch.pl tool Signed-off-by: Mauro Schilman Signed-off-by: Greg Kroah-Hartman commit b5ef076141acc223e55aa298abd2d2f5fb844874 Author: Pekka Enberg Date: Mon Nov 1 21:50:06 2010 +0200 Staging: w35und: Rename wbhal_s.h to wbhal.h This patch renames the wbhal_s.h header file to wbhal.h now that it contains both structure and function definitions. Acked-by: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit 72ca8819f7f4ac4ddf82ab72ee614075821a3d00 Author: Pekka Enberg Date: Mon Nov 1 21:50:05 2010 +0200 Staging: w35und: Merge wbhal_f.h to wbhal_s.h This patch merges HAL struct and function definitions into one header file. Acked-by: Pavel Machek Signed-off-by: Pekka Enberg Signed-off-by: Greg Kroah-Hartman commit ba5c2b3ddcb7a6a0e942c7c2434f048d152f08c5 Author: Felipe Andres Besoain Pino Date: Fri Oct 29 19:15:58 2010 -0300 staging: vt6656: resolved checkpatch finding removed spaces at the start of a lines. Signed-off-by: Felipe Andres Besoain Pino Signed-off-by: Greg Kroah-Hartman commit 99b7bbb9b57da48f602732aaa107d7add49c842d Author: Ariel Savini Date: Fri Oct 29 19:19:20 2010 -0300 staging: vt6656 resolved parenthesis not spaces removes before parenthesis Signed-off-by: Ariel Savini Signed-off-by: Greg Kroah-Hartman commit 4a499de2d13786de626c3f689022d7ec25230911 Author: Mariano Reingart Date: Fri Oct 29 19:15:26 2010 -0300 staging: vt6656: resolved checkpatch finding removed a C99 '//' comment and added a space around '=' Signed-off-by: Mariano Reingart Signed-off-by: Greg Kroah-Hartman commit fc4f55860254566b43e066bed0962c7cca72da84 Author: Matias De la Puente Date: Fri Oct 29 19:07:45 2010 -0300 staging: vt6656: resolved checkpatch finding removed parentesis and spaces at the start of a line of a return Signed-off-by: Matias De la Puente Signed-off-by: Greg Kroah-Hartman commit cc8b59d41fa597bb62bdca2c200e8509bc8bec2a Author: Joe Perches Date: Sat Oct 30 14:08:38 2010 -0700 Staging: solo6x10: Update WARN uses Add missing newlines. Signed-off-by: Joe Perches Signed-off-by: Greg Kroah-Hartman commit 8892384803af7082056fe29faef02fd0c762493e Author: Eric Dumazet Date: Fri Oct 29 15:19:27 2010 +0200 staging: get rid of dev_base_lock dev_base_lock was the legacy rwlock used to protect netdevice list, and is expected to vanish. We now use RTNL and RCU locking. Signed-off-by: Eric Dumazet Signed-off-by: Greg Kroah-Hartman commit e1ffd62b8fc87e842431cc693821d7f1ac70b9de Author: Barry Song Date: Wed Oct 27 21:44:22 2010 -0400 staging: iio: adis16209: tuning spi delay to make hardware more stable Looks like one spot was missed in the previous spi tune patch. Signed-off-by: Barry Song Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 817e5c65c511d4a83686333ae75507deb4b55d5e Author: Graf Yang Date: Wed Oct 27 21:44:21 2010 -0400 staging: iio: resolver: new driver for AD2S1210 devices Signed-off-by: Graf Yang Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit ffd7a62f0dffa92409dc769562a4997eb424a7d3 Author: Graf Yang Date: Wed Oct 27 21:44:20 2010 -0400 staging: iio: resolver: new driver for AD2S1200/1205 devices Signed-off-by: Graf Yang Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit f46d9f154ac3001b90e75ca646400a13b499a49e Author: Graf Yang Date: Wed Oct 27 21:44:19 2010 -0400 staging: iio: resolver: new driver for AD2S90 devices This also kicks off the new resolver subsection. Signed-off-by: Graf Yang Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 5b264a624ebc9a082873aa06ea641cbdc760e6e1 Author: Barry Song Date: Wed Oct 27 21:44:18 2010 -0400 staging: iio: meter: new driver for ADE7854/58/68/78 devices Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 2919fa54ef643364eab69bfff5a72e4aa50d3e39 Author: Barry Song Date: Wed Oct 27 21:44:17 2010 -0400 staging: iio: meter: new driver for ADE7759 devices Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 8210cfe9bd99fd63fae0b60c40fa793b8454e381 Author: Barry Song Date: Wed Oct 27 21:44:16 2010 -0400 staging: iio: meter: new driver for ADE7758 devices Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 8d97a5877b85ab0a2b346c2c111a8192d336495f Author: Barry Song Date: Wed Oct 27 21:44:15 2010 -0400 staging: iio: meter: new driver for ADE7754 devices Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 09434ef7c2eedca448d2701ffce229b5ccade64f Author: Barry Song Date: Wed Oct 27 21:44:14 2010 -0400 staging: iio: meter: new driver for ADE7753/6 devices This also kicks off the new meter subsection. Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 0152a0585281a03d734f38effcfe9515874b7d48 Author: Cliff Cai Date: Wed Oct 27 21:44:13 2010 -0400 staging: iio: dds: new driver for AD9951 devices Signed-off-by: Cliff Cai Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 2996a2dc38c58f96432a28fdd7f81ccfd692637d Author: Cliff Cai Date: Wed Oct 27 21:44:12 2010 -0400 staging: iio: dds: new driver for AD9910 devices Signed-off-by: Cliff Cai Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit a886689f6c36ccad01d9600a92029f80a2a6279f Author: Cliff Cai Date: Wed Oct 27 21:44:11 2010 -0400 staging: iio: dds: new driver for AD9852/4 devices Signed-off-by: Cliff Cai Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit a82ab27aa758e4b02f130d86be5c2fedf29c0c0a Author: Cliff Cai Date: Wed Oct 27 21:44:10 2010 -0400 staging: iio: dds: new driver for AD9850/1 devices Signed-off-by: Cliff Cai Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 4a8e6c33e88b09a3fdef022d1711dc13ce8cb7db Author: Cliff Cai Date: Wed Oct 27 21:44:09 2010 -0400 staging: iio: dds: new driver for AD9832/3/4/5 devices Signed-off-by: Cliff Cai Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit da6fcbdf764cbc8f539333a725411183a4253cfa Author: Cliff Cai Date: Wed Oct 27 21:44:08 2010 -0400 staging: iio: dds: new driver for AD5930/2 devices This is the initial driver in the new Direct Digital Synthesis section. Signed-off-by: Cliff Cai Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 6790e29fef61b20b213bd1cf5a025dc3412a4765 Author: Barry Song Date: Wed Oct 27 21:44:07 2010 -0400 staging: iio: dac: new driver for AD5624R devices This is used to convert digital streams into voltages. Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 7a83f60d7bdf619cb7a37b5e0f6c128a91c6ecd0 Author: Barry Song Date: Wed Oct 27 21:44:06 2010 -0400 staging: iio: gyro: new driver for ADIS16130 digital output gyros Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 1b2f99e1ae79b6039340571312ebbe0551d39c16 Author: Barry Song Date: Wed Oct 27 21:44:05 2010 -0400 staging: iio: gyro: new driver for ADIS16080 digital output gyros Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit e071f6b8e47834e9c91a299a5e773bebffe10e67 Author: Barry Song Date: Wed Oct 27 21:44:04 2010 -0400 staging: iio: gyro: new driver for ADIS16060 digital output gyros Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 4f0cd86d66a81fd77912504d0e0b5883c473512e Author: Barry Song Date: Wed Oct 27 21:44:03 2010 -0400 staging: iio: gyro: new driver for ADIS16251 devices Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 06b86a75b148e44d489a960c047a8fc6926c841d Author: Sonic Zhang Date: Wed Oct 27 21:44:02 2010 -0400 staging: iio: adc: new driver for ADT7410 temperature sensors Signed-off-by: Sonic Zhang Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit a5d8c6bc2f87c1c5cb69fb3a22d1ef0110a9eacc Author: Sonic Zhang Date: Wed Oct 27 21:44:01 2010 -0400 staging: iio: adc: new driver for ADT7310 temperature sensors Signed-off-by: Sonic Zhang Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit d7713b6c56472b41e04ebcbdfdf85df84c8e82d6 Author: Sonic Zhang Date: Wed Oct 27 21:44:00 2010 -0400 staging: iio: adc: new driver for ADT75 temperature sensors Signed-off-by: Sonic Zhang Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 7924425db04a6107e49312edf53c158590d52aae Author: Sonic Zhang Date: Wed Oct 27 21:43:59 2010 -0400 staging: iio: adc: new driver for AD7816 devices Signed-off-by: Sonic Zhang Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 671d85f2aa3dadc6e221b6f6f7e087bf487275e7 Author: Barry Song Date: Wed Oct 27 21:43:58 2010 -0400 staging: iio: adc: new driver for AD7745/6/7 devices Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit f84c26e61eedaa9eb21fe8a238d38fffb8d3c394 Author: Sonic Zhang Date: Wed Oct 27 21:43:57 2010 -0400 staging: iio: adc: new driver for AD7314 devices Signed-off-by: Sonic Zhang Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit e8ada962bc2e34e964d370f721994387df7b1363 Author: Sonic Zhang Date: Wed Oct 27 21:43:56 2010 -0400 staging: iio: adc: new driver for AD7298 devices Signed-off-by: Sonic Zhang Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit ddaecd5ba8cc3bc68b65b01cc8dbfedcac87254e Author: Sonic Zhang Date: Wed Oct 27 21:43:55 2010 -0400 staging: iio: adc: new driver for AD7291 devices Signed-off-by: Sonic Zhang Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit a20ebd930081edaf21f354db195e7bb9820b18d8 Author: Barry Song Date: Wed Oct 27 21:43:54 2010 -0400 staging: iio: adc: new driver for AD7152/3 devices Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 54c5be349bf66ed0c50c2e293803057d148a4c95 Author: Barry Song Date: Wed Oct 27 21:43:53 2010 -0400 staging: iio: adc: new driver for AD7150/1/6 devices Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 35f6b6b86ede34a9f8c029943842640b2ffbfa19 Author: Sonic Zhang Date: Wed Oct 27 21:43:52 2010 -0400 staging: iio: new ADT7316/7/8 and ADT7516/7/9 driver IIO driver for temperature sensor, ADC and DAC devices over SPI and I2C. Signed-off-by: Sonic Zhang Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit bb6f19eafe3a1a5dd937ce66668e70aeaa1b0bf4 Author: Barry Song Date: Wed Oct 27 21:43:51 2010 -0400 staging: iio: new adis16204 driver IIO driver for Programmable High-g Digital Impact Sensor and Recorder. Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit f11ba4f5774957415aa15eea7c8c8717126907ee Author: Barry Song Date: Wed Oct 27 21:43:50 2010 -0400 staging: iio: new adis16203 driver IIO driver for Programmable 360 Degrees Inclinometer adis16203 parts. Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit f7fe1d1dd5a512a44f0ada40ff7f120664e2e082 Author: Barry Song Date: Wed Oct 27 21:43:49 2010 -0400 staging: iio: new adis16201 driver IIO driver for dual Axis Accelerometer/inclinometer adis16201 parts. Signed-off-by: Barry Song Signed-off-by: Michael Hennerich Acked-by: Jonathan Cameron Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 6f125f17945a65e0bed37a4dfd7e5397a2c7a886 Author: Mike Frysinger Date: Wed Oct 27 21:43:48 2010 -0400 staging: iio: add ADI info to TODO Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit f733d02ab61787239d1ca05c30f6f393275a7899 Author: Michael Hennerich Date: Wed Oct 27 21:43:47 2010 -0400 staging: iio: gyro: make sure grep can find the ADIS16265 support Signed-off-by: Michael Hennerich Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 61a4295b492f96878b4b47d577a173568530ecff Author: Mike Frysinger Date: Wed Oct 27 21:43:46 2010 -0400 staging: iio: adis16350: add missing reference to temp offset We declare this attr but never link it in to the attr list. Signed-off-by: Mike Frysinger Signed-off-by: Greg Kroah-Hartman commit 3b785a8cfc6ac1bc837b0a1424056b6a4a1e544e Author: Jesper Juhl Date: Tue Nov 9 00:10:02 2010 +0100 Staging: brcm80211: Remove unnecessary casts of void ptr returning alloc function return values The [vk][cmz]alloc(_node) family of functions return void pointers which it's completely unnecessary/pointless to cast to other pointer types since that happens implicitly. This patch removes such casts from drivers/staging/brcm80211/ Signed-off-by: Jesper Juhl Cc: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit d4fcdc68564f49cbb4fdaf9b0ebfb5c3d02c81d3 Author: Ben Hutchings Date: Sun Nov 7 17:20:37 2010 +0000 Staging: brcmfmac: Fix MAC header lookup on 64-bit architectures Fix direct use of sk_buff::mac_header which is an offset rather than a pointer on 64-bit architectures. Signed-off-by: Ben Hutchings Cc: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 69ec303a99ff68cfb5dbc6cefb043e53b6ba8945 Author: Brett Rudley Date: Fri Nov 5 19:20:16 2010 -0700 staging: brcm80211: migrate #includes from headers into .c files. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 997dd24fe9aadf6e0b3652580e7c79372ccb600c Author: Brett Rudley Date: Wed Nov 3 19:53:59 2010 -0700 staging: brcm80211: Remove pkttag from osl Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit df0d8bb8daa1e8c3c2afcf93c46ef0294c78ac26 Author: Brett Rudley Date: Wed Nov 3 19:53:58 2010 -0700 staging: brcm80211: Remove 'failed' field from osh Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 2578f7edf895fd4aad278134452cde1dc1b2fef5 Author: Nicolas Kaiser Date: Sat Oct 30 00:10:29 2010 +0200 Staging: brcm80211: simplify expression Simplify: ((a && b) || !a) => (b || !a) Signed-off-by: Nicolas Kaiser Cc: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit a28792e78669dc1bb984dd7798f0bccda741acbb Author: Brett Rudley Date: Mon Nov 1 17:10:18 2010 -0700 staging: brcm80211: Remove cruft from wlioctl.h Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 9014378bf42912533299d37f14677f9dfa21268a Author: Brett Rudley Date: Mon Nov 1 17:10:17 2010 -0700 staging: brcm80211: Remove OSL_ERROR entry point Get rid of generic OSL_ERROR and error code translation to the only place that needs it: dhd. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 683ab518a19fe55de9b9f682c94f672951315fe2 Author: Brett Rudley Date: Mon Nov 1 17:10:16 2010 -0700 staging: brcm80211: Remove dead code from osl.h Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 8fb6b18884703d447af4c5ed1eeec02b489aa54b Author: Brett Rudley Date: Mon Nov 1 17:10:15 2010 -0700 staging: brcm80211: Remove abstraction layer for dma alignment Directly align buffers instead of abstracting it. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 4766ae6ce7c5098a26136241576cd8a287d20484 Author: Brett Rudley Date: Wed Oct 27 15:47:53 2010 -0700 staging: brcm80211: purge epivers.h Purge include/epivers.h moving individual lines to where they are needed and delete unused refs. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit eb8160364f007c668c423614e262b9b7fc7b2c74 Author: Brett Rudley Date: Tue Oct 26 18:37:24 2010 -0700 staging: brcm80211: Separate fullmac vs softmac defs in shared file wlioctl.h is shared by fullmac and softmac but mostly fullmac. Separate out fullmac to purge extranous code in softmac and possibly as a step towards it own file. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 7f7c3dbb3f6d8624109ee30ad5a8f6b23f0a72f4 Author: Brett Rudley Date: Tue Oct 26 15:23:09 2010 -0700 staging: brcm80211: Move #include from bcmutils.h out to .c files Part of effort to move #includes out of .h files and unwind the include mess. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit c6ac24e90a3f6a3cf25e3b1e4d8957032acf70a6 Author: Brett Rudley Date: Tue Oct 26 11:55:23 2010 -0700 staging: brcm80211: Purge linuxver.h and redistribute #includes as required Linuxver.h only included other .h files. Delete it and move #includes to .c's as needed. Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit a52ba66cf2e06dc7b9ad655b74324e81f756dbd3 Author: Brett Rudley Date: Tue Oct 26 09:17:06 2010 -0700 staging: brcm80211: Move #includes out of d11.h Move #includes out of d11.h and into .c files Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit ded6d25baa6bb0b3a41fa50a0427258c5d09ea7f Author: Brett Rudley Date: Tue Oct 26 09:17:05 2010 -0700 staging: brcm80211: Purge unused includes from d11.h Purge unused #includes from d11.h Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit 53b6b34dfaa0263128d1e03bed0ba6fb40df88f8 Author: Brett Rudley Date: Tue Oct 26 09:17:04 2010 -0700 staging: brcm80211: Purge unused lines from bcmdefs.h/wlc_pub.h Purge unused lines Signed-off-by: Brett Rudley Signed-off-by: Greg Kroah-Hartman commit e38b67c7cd3d2e377868e4c8ff4772f14ec7c45b Author: Sven Eckelmann Date: Mon Oct 25 23:43:14 2010 +0200 Staging: batman-adv: Remove useless braces 77099f0afe94928b5b0066a7efa5fa9f81696b54 added changes to vis.c which trigger a checkpatch.pl warning about braces which are not necessary anymore. WARNING: braces {} are not necessary for any arm of this statement + if (entry->primary) [...] + else { [...] Signed-off-by: Sven Eckelmann Cc: Andy Shevchenko Cc: Marek Lindner Cc: Simon Wunderlich Cc: Andrew Lunn Signed-off-by: Greg Kroah-Hartman commit eba499d3e376983f4d521bac05bf7e9a634ace2f Author: Naveen Kumar Gaddipati Date: Tue Nov 2 17:38:45 2010 +0530 Staging: add Synaptics RMI4 touchpad driver support Added the Synaptics RMI4 touchpad driver support. Acked-by: Linus Walleij Signed-off-by: Naveen Kumar Gaddipati Cc: Dmitry Torokhov Cc: Alan Cox Cc: Christopher Heiny Signed-off-by: Greg Kroah-Hartman commit 78fd115e21087133be74bc6dd7a9bc1969aea8f8 Author: Ramesh Agarwal Date: Fri Oct 22 14:00:20 2010 +0100 Staging: add Synaptics TM1217 Touchscreen Controller driver This is submitted as a staging driver because there is a more generic driver "on the way" for all these devices and has been for some time. The intent is that as soon as the general drivers are in the mainstream this one will get any leftovers integrated and then be dumped. Until this unspecified future data at least people can actually use their hardware. As its interface is simply input layer we can do that without pain. Some clean up by Alan Cox - Extract gpio support and IRQ support more sanely - Tidying Signed-off-by: Ramesh Agarwal [avoid deference NULL ts if kzalloc fails] [finger_touched may be used uninitialized] [fix missing sync which confused twm] Signed-off-by: Hong Liu Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman commit fc2347e2023221ef04c6d9ce84019aa8c7e0ad6d Author: Atul Sowani Date: Wed Nov 3 18:40:56 2010 +0530 Staging: xgifb: change obsolete pci_find_device() with pci_get_device() Replaced obsolete pci_find_device() calls with pci_get_device() calls. This is recommended in pci.txt filei in PCI Documentation. Signed-off-by: Atul Sowani Acked-by: Arnaud Patard Signed-off-by: Greg Kroah-Hartman commit af02b584bc0e1f46cf1477ad54ae18ec3842b6f4 Author: Uwe Kleine-König Date: Tue Oct 26 21:57:53 2010 +0200 Staging: trivial: fix typos concerning "controller" Signed-off-by: Uwe Kleine-König Signed-off-by: Greg Kroah-Hartman commit c4fb2bab7dea7780452e57166bd00cdfa9dba6ef Author: Uwe Kleine-König Date: Tue Oct 26 21:57:52 2010 +0200 Staging: trivial: fix typos concerning "configure" Signed-off-by: Uwe Kleine-König Signed-off-by: Greg Kroah-Hartman commit dec34f85c62845a4d190a45aa5b5e9dd96797880 Author: Tracey Dent Date: Fri Oct 22 17:30:28 2010 -0400 Staging: msm: Makefile: replace the use of -objs with -y Changed -objs to -y in Makefile. Signed-off-by: Tracey Dent Signed-off-by: Greg Kroah-Hartman commit d0f40c5041f9c48afbd8f7fbf8a5faa9e5dbd39a Author: Joe Perches Date: Wed Oct 20 18:51:06 2010 -0700 Staging: intel_sst: Use pr_fmt, fix misspellings Remove leading "sst: " from format strings. Add #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt Prefix is changed from "sst: " to "snd_intel_sst: " Add missing newlines Trim trailing spaces after newlines Fix several different misspellings Signed-off-by: Joe Perches Cc: Vinod Koul Cc: Alan Cox Signed-off-by: Greg Kroah-Hartman commit 074e61ec3751da9ab88ee66d3818574556c03489 Author: James Morris Date: Wed Nov 10 09:01:31 2010 +1100 kernel: add roundup() code comment from akpm Add roundup() code comment from akpm. Signed-off-by: Andrew Morton Signed-off-by: James Morris commit 2ff81110de696f37a32cca2de50bf0cfbaf56733 Merge: a7bcf21e60c73cb7f7c13fad928967d7e47c3cac e5837cef1d8356e8303585bd13611ecb3edb5747 Author: Greg Kroah-Hartman Date: Tue Nov 9 13:43:45 2010 -0800 Merge git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/beceem into work-next commit edb40a23c8dc5b5be219bf4561074b6233bba65f Author: Bruno Randolf Date: Tue Oct 19 16:56:54 2010 +0900 ath5k: Add channel time to survey data Include the channel utilization (busy, rx, tx) in the survey results. Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit 3dd0923de491d72a041f82a9d0aaccc473fd2c42 Author: Bruno Randolf Date: Tue Oct 19 16:56:48 2010 +0900 ath5k: Optimize descriptor alignment Similar to Felix Fietkau "ath9k_hw: optimize all descriptor access functions" (13db2a80244908833502189a24de82a856668b8a). Signed-off-by: Bruno Randolf Signed-off-by: John W. Linville commit 123f5b8e6f411d342f2fc8a15c4d9349ace5074a Author: Mohammed Shafi Shajakhan Date: Mon Oct 18 11:37:17 2010 +0530 ath9k: Remove the median function in rate control With the current rate control selection method the median function is nowhere used, so remove it. Signed-off-by: Mohammed Shafi Shajakhan Signed-off-by: John W. Linville commit ada9f1cacb66b74a68254521bb5e3ca4eb8fa871 Author: Felix Fietkau Date: Sat Oct 16 01:01:48 2010 +0200 ath9k_hw: optimize all descriptor access functions Because all of the descriptor data structures are marked as __packed, GCC assumes the worst case wrt. alignment and generates unaligned load/store instructions on MIPS for access to all fields. Since descriptors always have to be 4-byte-aligned, we can just mark the data structures with __aligned(4), which allows GCC to generate much more efficient code. Verified through disassembly and OProfile comparisons. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit f0e94b479c987abef17eb18e5c8e0ed178d00cd4 Author: Rafael J. Wysocki Date: Sat Oct 16 00:36:17 2010 +0200 ath9k: Convert to new PCI PM framework The ath9k driver uses the legacy PCI power management (suspend and resume) callbacks that apparently cause intermittent problems to happen (the adapter sometimes doesn't resume correctly on my Acer Ferrari One). Make it use the new PCI PM and let the PCI core code handle the PCI-specific details of power transitions. Signed-off-by: Rafael J. Wysocki Signed-off-by: John W. Linville commit 191d6a1186f65bc86c24b9d6d9d91acc155285ba Author: Luis R. Rodriguez Date: Fri Oct 15 13:27:49 2010 -0700 ath9k: fix sparse complaint on aphy for debugfs This fixes this sparse complaint: CHECK drivers/net/wireless/ath/ath9k/debug.c drivers/net/wireless/ath/ath9k/debug.c:548:34: warning: symbol 'aphy' shadows an earlier one drivers/net/wireless/ath/ath9k/debug.c:491:26: originally declared here Signed-off-by: Luis R. Rodriguez Signed-off-by: John W. Linville commit 744bcb42a1ff1b9200e82dd074468877e31ff161 Author: Felix Fietkau Date: Fri Oct 15 20:03:33 2010 +0200 ath9k_hw: make ath9k_hw_gettsf32 static It is now only used in hw.c Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 8eb1dabbd10e067cff671935d3e0c819f8e80d54 Author: Felix Fietkau Date: Fri Oct 15 20:03:32 2010 +0200 ath9k: remove a redundant call to ath9k_hw_gettsf32 When the timer_next argument to ath9k_gen_timer_start is behind the tsf value, tsf + timer_period is used, which is what ath_btcoex_period_timer was setting it to. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 9fa23e1741404207c414fad69212a8763c138bf0 Author: Felix Fietkau Date: Fri Oct 15 20:03:31 2010 +0200 ath9k: optimize/fix ANI RSSI processing ANI needs the RSSI average only in station mode, and only for tracking the signal strength of beacons of the AP that it is connected to. Adjust the code to track on the beacon RSSI, and store the average of that in the ath_wiphy struct. With these changes, we can get rid of this extra station lookup in the rx path, which saves precious CPU cycles. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit e0e9bc82fb0813fd353b0abbba0f1d6a680cc77c Author: Felix Fietkau Date: Fri Oct 15 20:03:30 2010 +0200 ath9k_hw: optimize tx status descriptor processing Disassembly shows, that at least on MIPS, the compiler generates a lot of memory accesses to the same location in the descriptor field parsing. Since it is operating on uncached memory, this can be quite expensive in this hot path. Change the code a bit to help the compiler optimize it properly, and get rid of some unused fields in the ath_tx_status struct. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 45684c75f9aa80eb477465bddcf79c9ad95206c7 Author: Felix Fietkau Date: Fri Oct 15 20:03:29 2010 +0200 ath9k_hw: small optimization in ar9002_hw_get_isr ah->config.rx_intr_mitigation does not need to be checked before checking the rx interrupt mask for AR_ISR_RXMINTR or AR_ISR_RXINTM, as those interrupts will be masked out if rx interrupt mitigation is disabled. Avoid reading AR_ISR_S5_S twice by reordering the code to be more concise. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 4df3071ebd92ef7115b409da64d0eb405d24a631 Author: Felix Fietkau Date: Mon Nov 8 20:54:47 2010 +0100 ath9k_hw: optimize interrupt mask changes OProfile showed that ath9k was spending way too much time in ath9k_hw_set_interrupts. Since most of the interrupt mask changes only need to globally enable/disable interrupts, it makes sense to split this part into separate functions, replacing all calls to ath9k_hw_set_interrupts(ah, 0) with ath9k_hw_disable_interrupts(ah). ath9k_hw_set_interrupts(ah, ah->imask) only gets changed to ath9k_hw_enable_interrupts(ah), whenever ah->imask was not changed since the point where interrupts were disabled. Signed-off-by: Felix Fietkau Signed-off-by: John W. Linville commit 790a11f268373b60069bc1371dc05143107c607c Author: RafaÅ‚ MiÅ‚ecki Date: Thu Oct 14 23:04:40 2010 +0200 b43: N-PHY: define registers names for 2056 radio Signed-off-by: RafaÅ‚ MiÅ‚ecki Cc: Henry Ptasinski Cc: Brett Rudley Cc: Nohee Ko Signed-off-by: John W. Linville commit 794830e691a6b61d2de3fa9daeb609fd4ef4a4e7 Author: RafaÅ‚ MiÅ‚ecki Date: Sun Oct 17 15:38:51 2010 +0200 b43: N-PHY: define registers names for 2056 radio Signed-off-by: RafaÅ‚ MiÅ‚ecki Cc: Henry Ptasinski Cc: Brett Rudley Cc: Nohee Ko Signed-off-by: John W. Linville commit 038aaa382eb0a8fd6a0bbae7abc1383b9b57c543 Author: RafaÅ‚ MiÅ‚ecki Date: Thu Oct 14 23:01:02 2010 +0200 b43: N-PHY: define channel table struct for rev3+ devices Signed-off-by: RafaÅ‚ MiÅ‚ecki Signed-off-by: John W. Linville commit 27b1fec2caa668c162cd1a862c69e087df277fae Author: Rajendra Nayak Date: Tue Sep 28 21:02:58 2010 +0530 OMAP: I2C: Convert i2c driver to use PM runtime api's This patch converts the i2c driver to use PM runtime apis Signed-off-by: Rajendra Nayak Cc: Paul Walmsley Cc: Jean Delvare Acked-by: Ben Dooks Signed-off-by: Kevin Hilman commit 4d17aeb1c5b2375769446d13012a98e6d265ec13 Author: Paul Walmsley Date: Tue Sep 21 19:37:15 2010 +0530 OMAP: I2C: split device registration and convert OMAP2+ to omap_device Split the OMAP1 and OMAP2+ platform_device build and register code. Convert the OMAP2+ variant to use omap_device. This patch was developed in collaboration with Rajendra Nayak . Signed-off-by: Paul Walmsley Signed-off-by: Rajendra Nayak Cc: Kevin Hilman Signed-off-by: Kevin Hilman commit f776471f620a07be234f40288a1fd9932d039e26 Author: Benoit Cousson Date: Tue Sep 21 19:37:14 2010 +0530 OMAP4: hwmod: add I2C hwmods for OMAP4430 Add hwmod structures for I2C controllers on OMAP4430. Signed-off-by: Benoit Cousson Signed-off-by: Rajendra Nayak Signed-off-by: Kevin Hilman commit 4fe20e97c8b1082d16b38e9f4c53feeed143ab98 Author: Rajendra Nayak Date: Tue Sep 21 19:37:13 2010 +0530 OMAP3: hwmod: add I2C hwmods for OMAP3430 Add hwmod structures for I2C controllers on OMAP3430. This patch was developed in collaboration with Paul Walmsley . OMAP3 fixes for correct IDLEST bit monitoring from G, Manjunath Kondaiah Signed-off-by: Rajendra Nayak Signed-off-by: Paul Walmsley Cc: G, Manjunath Kondaiah Signed-off-by: Kevin Hilman commit 2004290f55f03c52e22044a5843928cf0f6cc56a Author: Paul Walmsley Date: Thu Sep 30 02:40:12 2010 +0530 OMAP2xxx: hwmod: add I2C hwmods for OMAP2420, 2430 Add hwmod structures for I2C controllers on OMAP2420/2430. NOTE: I2C module on OMAP2420 has 16bit registers and causes imprecise aborts if 32bits are read/written to it. Use the HWMOD_16BIT_REG flag to notify the hmwod framework of this hard requirement so that __raw_writew/readw is used to read /write the mdoule registers. Signed-off-by: Paul Walmsley Signed-off-by: Rajendra Nayak Signed-off-by: Kevin Hilman commit 2af6fd8b18ceed416c9dfa675287c765aabf7d43 Author: Joe Perches Date: Sat Oct 30 11:08:53 2010 +0000 net/ipv4/tcp.c: Update WARN uses Coalesce long formats. Align arguments. Remove KERN_. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit b194a3674fba6d9f9e470084d192c7cb99194a62 Author: Joe Perches Date: Sat Oct 30 11:08:52 2010 +0000 net/core/dev.c: Update WARN uses Coalesce long formats. Add missing newlines. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit 9c413ed55d5b52159e85a3937cda7f210a318048 Author: Joe Perches Date: Sat Oct 30 11:08:34 2010 +0000 drivers/net/usb: Update WARN uses Add missing newlines. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit c389ff80d4b598f57d56aa807d396d4351cac8a4 Author: Joe Perches Date: Sat Oct 30 11:08:33 2010 +0000 drivers/net/can: Update WARN uses Add missing newlines. Signed-off-by: Joe Perches Signed-off-by: David S. Miller commit c63fdf46ad0a7f8fe3c0252a0e763515617e0ea7 Author: Eric Dumazet Date: Wed Nov 3 22:49:35 2010 +0000 drivers/net: normalize TX_TIMEOUT Some network drivers use old TX_TIMEOUT definitions, assuming HZ=100 of old kernels. Convert these definitions to include HZ, since HZ can be 1000 these days. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit e658e9fe65306346e827676a121eca3534ad75ff Author: Greg Kroah-Hartman Date: Tue Nov 9 09:12:42 2010 -0800 driver core: the development tree has switched to git So change the MAINTAINERS file to show where the tree now is at. Signed-off-by: Greg Kroah-Hartman commit b884a94ed16d1a633e76f80fb1bd75d0e7373ce3 Author: Daniel Drake Date: Tue Sep 21 16:37:26 2010 +0100 viafb: Add OLPC XO-1.5 port configs The OLPC XO-1.5 does not use the standard port wiring suggested in the viafb driver. This is required for the upcoming OLPC DCON and via-camera drivers, to be submitted soon. Signed-off-by: Daniel Drake [fts: removed useless ifdef's and corrected comment] Signed-off-by: Florian Tobias Schandinat commit 67eb6f9617a24dfb033b584d6b1b42b39cc9297a Author: Jonathan Corbet Date: Thu Oct 28 18:23:21 2010 +0100 viafb: suspend/resume for GPIOs Be sure to re-enable GPIO lines on resume. Users still have to be sure to set them properly. Signed-off-by: Jonathan Corbet Signed-off-by: Daniel Drake Signed-off-by: Florian Tobias Schandinat commit 751305d9b2fd3e03eaab7808e976241d85ca4353 Author: Daniel Drake Date: Thu Oct 28 18:23:01 2010 +0100 viafb: General power management infrastructure Multiple devices need S/R hooks (framebuffer, GPIO, camera). Add infrastructure and convert existing framebuffer code to the new model. This patch should create no functional change. Based on earlier work by Jonathan Corbet. Signed-off-by: Daniel Drake Acked-by: Jonathan Corbet Signed-off-by: Florian Tobias Schandinat commit 7f05dec3dd70f086870fdc1d40dbe30db1fe0994 Author: Jacob Pan Date: Tue Nov 9 11:28:43 2010 +0000 x86: mrst: Parse SFI timer table for all timer configs Penwell has APB timer based watchdog timers, it requires platform code to parse SFI MTMR tables in order to claim its timer. This patch will always parse SFI MTMR regardless of system timer configuration choices. Otherwise, SFI MTMR table may not get parsed if running on Medfield with always-on local APIC timers and constant TSC. Watchdog timer driver will then not get a timer to use. Signed-off-by: Jacob Pan Signed-off-by: Alan Cox LKML-Reference: <20101109112800.20591.10802.stgit@localhost.localdomain> Signed-off-by: Thomas Gleixner commit 1da4b1c6a4dfb5a13d7147a27c1ac53fed09befd Author: Feng Tang Date: Tue Nov 9 11:22:58 2010 +0000 x86/mrst: Add SFI platform device parsing code SFI provides a series of tables. These describe the platform devices present including SPI and I²C devices, as well as various sensors, keypads and other glue as well as interfaces provided via the SCU IPC mechanism (intel_scu_ipc.c) This patch is a merge of the core elements and relevant fixes from the Intel development code by Feng, Alek, myself into a single coherent patch for upstream submission. It provides the needed infrastructure to register I2C, SPI and platform devices described by the tables, as well as handlers for some of the hardware already supported in kernel. The 0.8 firmware also provides GPIO tables. Devices are created at boot time or if they are SCU dependant at the point an SCU is discovered. The existing Linux device mechanisms will then handle the device binding. At an abstract level this is an SFI to Linux device translator. Device/platform specific setup/glue is in this file. This is done so that the drivers for the generic I²C and SPI bus devices remain cross platform as they should. (Updated from RFC version to correct the emc1403 name used by the firmware and a wrongly used #define) Signed-off-by: Alek Du LKML-Reference: <20101109112158.20013.6158.stgit@localhost.localdomain> [Clean ups, removal of 0.7 support] Signed-off-by: Feng Tang [Clean ups] Signed-off-by: Alan Cox Signed-off-by: Thomas Gleixner commit d6ff7d0fe22cdf3ea41c48b50da9a9181500d1bf Author: Alexey Charkov Date: Tue Nov 9 02:42:39 2010 +0300 ARM: Add support for the display controllers in VT8500 and WM8505 This adds drivers for the LCD controller found in VIA VT8500 SoC, GOVR display controller found in WonderMedia WM8505 SoC and for the Graphics Engine present in both of them that provides hardware accelerated raster operations (used for copyarea and fillrect). Signed-off-by: Alexey Charkov Signed-off-by: Paul Mundt commit cf655c36fad7b6488a56f18ab56f7d608ca6552b Merge: a7bcf21e60c73cb7f7c13fad928967d7e47c3cac 2e351ec61c35fac01ed1fb1ce35c183bf85e780c Author: Paul Mundt Date: Tue Nov 9 16:53:33 2010 +0900 Merge branch 'rmobile/core' into rmobile-latest commit 5c4986b8a9ddd9cf649abe38a102866f7809b1d2 Merge: a9b27bcc6acf2491609f51aa592ec67311d4518d 37b7a97884ba64bf7d403351ac2a9476ab4f1bba 99870bd784ff9eb2405eab060125c0ded74968cd Author: Paul Mundt Date: Tue Nov 9 16:51:46 2010 +0900 Merge branches 'sh/core', 'sh/io-overhaul' and 'sh/urgent' into sh-latest commit a9b27bcc6acf2491609f51aa592ec67311d4518d Author: Paul Mundt Date: Mon Nov 1 12:44:25 2010 -0400 sh: Break out cpuinfo_op procfs bits. Presently this is all inlined in setup.c, which is not really the place for it. Follow the x86 example and split it out into its own file. Signed-off-by: Paul Mundt commit f020c92de48246510623162fb22d60d91810cc56 Author: Paul Mundt Date: Mon Nov 1 12:24:48 2010 -0400 sh: Enable optional gpiolib for all CPUs with pinmux tables. All of the CPUs with pinmux tables support gpiolib. At present the boards that depend on it for initialization manually select gpiolib as needed, but there is no reason why it can't be exposed generically to the user regardless. Signed-off-by: Paul Mundt commit 16b259203c513ed28bd31cc9a981e0d3ad517943 Author: Paul Mundt Date: Mon Nov 1 12:18:48 2010 -0400 sh: migrate SH_CLK_MD to mode pin API. This kills off the hardcoded SH_CLK_MD introduced by the SH-2 boards and converts over to the mode pin API. Signed-off-by: Paul Mundt commit 973a34aa8593dbfe84386343c694f5beecb51d8a Author: Eric Dumazet Date: Sun Oct 31 05:38:25 2010 +0000 af_unix: optimize unix_dgram_poll() unix_dgram_poll() is pretty expensive to check POLLOUT status, because it has to lock the socket to get its peer, take a reference on the peer to check its receive queue status, and queue another poll_wait on peer_wait. This all can be avoided if the process calling unix_dgram_poll() is not interested in POLLOUT status. It makes unix_dgram_recvmsg() faster by not queueing irrelevant pollers in peer_wait. On a test program provided by Alan Crequy : Before: real 0m0.211s user 0m0.000s sys 0m0.208s After: real 0m0.044s user 0m0.000s sys 0m0.040s Suggested-by: Davide Libenzi Reported-by: Alban Crequy Acked-by: Davide Libenzi Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 5456f09aaf88731e16dbcea7522cb330b6846415 Author: Eric Dumazet Date: Sun Oct 31 05:36:23 2010 +0000 af_unix: fix unix_dgram_poll() behavior for EPOLLOUT event Alban Crequy reported a problem with connected dgram af_unix sockets and provided a test program. epoll() would miss to send an EPOLLOUT event when a thread unqueues a packet from the other peer, making its receive queue not full. This is because unix_dgram_poll() fails to call sock_poll_wait(file, &unix_sk(other)->peer_wait, wait); if the socket is not writeable at the time epoll_ctl(ADD) is called. We must call sock_poll_wait(), regardless of 'writable' status, so that epoll can be notified later of states changes. Misc: avoids testing twice (sk->sk_shutdown & RCV_SHUTDOWN) Reported-by: Alban Crequy Cc: Davide Libenzi Signed-off-by: Eric Dumazet Acked-by: Davide Libenzi Signed-off-by: David S. Miller commit 67426b756c4d52c511c4b22b269accea171692a8 Author: Eric Dumazet Date: Fri Oct 29 20:44:44 2010 +0000 af_unix: use keyed wakeups Instead of wakeup all sleepers, use wake_up_interruptible_sync_poll() to wakeup only ones interested into writing the socket. This patch is a specialization of commit 37e5540b3c9d (epoll keyed wakeups: make sockets use keyed wakeups). On a test program provided by Alan Crequy : Before: real 0m3.101s user 0m0.000s sys 0m6.104s After: real 0m0.211s user 0m0.000s sys 0m0.208s Reported-by: Alban Crequy Signed-off-by: Eric Dumazet Cc: Davide Libenzi Signed-off-by: David S. Miller commit fc766e4c4965915ab52a1d1fa3c7a7b3e7bc07f0 Author: Eric Dumazet Date: Fri Oct 29 03:09:24 2010 +0000 decnet: RCU conversion and get rid of dev_base_lock While tracking dev_base_lock users, I found decnet used it in dnet_select_source(), but for a wrong purpose: Writers only hold RTNL, not dev_base_lock, so readers must use RCU if they cannot use RTNL. Adds an rcu_head in struct dn_ifaddr and handle proper RCU management. Adds __rcu annotation in dn_route as well. Signed-off-by: Eric Dumazet Acked-by: Steven Whitehouse Signed-off-by: David S. Miller commit e4a7b93bd5d84e1e79917d024d17d745d190fc9a Author: Eric Dumazet Date: Fri Oct 29 01:52:46 2010 +0000 bonding: remove dev_base_lock use bond_info_seq_start() uses a read_lock(&dev_base_lock) to make sure device doesn’t disappear. Same goal can be achieved using RCU. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller commit 840a185dddfd098b78b96a30da4cad722a7aef18 Author: Eric Dumazet Date: Fri Oct 29 01:15:29 2010 +0000 aoe: remove dev_base_lock use from aoecmd_cfg_pkts() dev_base_lock is the legacy way to lock the device list, and is planned to disappear. (writers hold RTNL, readers hold RCU lock) Convert aoecmd_cfg_pkts() to RCU locking. Signed-off-by: Eric Dumazet Cc: "Ed L. Cashin" Signed-off-by: David S. Miller commit 1d5439b9a29b1386d44a617cbaf2f7acde1d697c Author: Arce, Abraham Date: Thu Oct 28 18:57:20 2010 +0000 ks8851: suspend resume support Add suspend/resume support using default open/stop interface methods to do hardware dependant operations. On suspend, same low power state (soft power mode) will be kept, the following blocks will be disabled: - Internal PLL Clock - Tx/Rx PHY - MAC - SPI Interface Signed-off-by: Abraham Arce Signed-off-by: David S. Miller commit d0eaeec8e8dfdc31815941054802dcccd7c3fe1d Merge: a7bcf21e60c73cb7f7c13fad928967d7e47c3cac aa58163a76a3aef33c7220931543d45d0fe43753 Author: David S. Miller Date: Mon Nov 8 12:38:28 2010 -0800 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 commit 5bf68592e72eb0ded154efaaf43b39aab6964fc3 Author: Ben Collins Date: Mon Nov 8 10:07:42 2010 -0500 solo6x10: [P2M] Fix memory leak Signed-off-by: Ben Collins commit 6f80dfe55fcbde1e588bc2cfa1273403b710872d Author: Christoph Hellwig Date: Sun Nov 7 23:01:17 2010 +0100 hfsplus: fix option parsing during remount hfsplus only actually uses the force option during remount, but it uses the full option parser with a fake superblock to do so. This means remount will fail if any nls option is set (which happens frequently with older mount tools), even if it is the same. Fix this by adding a simpler version of the parser that only parses the force option for remount. Signed-off-by: Christoph Hellwig commit 98072e4d977aabe6a39abb95951cd8bf2c2202d5 Author: Pavel Emelyanov Date: Thu Oct 28 13:50:37 2010 +0400 slub: Fix slub_lock down/up imbalance There are two places, that do not release the slub_lock. Respective bugs were introduced by sysfs changes ab4d5ed5 (slub: Enable sysfs support for !CONFIG_SLUB_DEBUG) and 2bce6485 ( slub: Allow removal of slab caches during boot). Acked-by: Christoph Lameter Signed-off-by: Pavel Emelyanov Signed-off-by: Pekka Enberg commit 716ce5d4a6f81653507c21b152eb7629d150ce7a Author: Pekka Enberg Date: Wed Oct 27 18:17:38 2010 +0300 slub: Fix build breakage in Documentation/vm This patch fixes a build breakage introduced by commit f5ac4916e9840292edd33c7a52b10364526547f3 ("slub: move slabinfo.c to tools/slub/slabinfo.c") that was repoted by Stephen: After merging the slab tree, today's linux-next build (x86_64 allmodconfig) failed like this: gcc: /scratch/sfr/next/Documentation/vm/slabinfo.c: No such file or directory gcc: no input files Caused by commit f5ac4916e9840292edd33c7a52b10364526547f3 ("slub: move slabinfo.c to tools/slub/slabinfo.c"). Missing update to Documentation/vm/Makefile? Reported-by: Stephen Rothwell Signed-off-by: Pekka Enberg commit 4a92379bdfb48680a5e6775dd53a586df7b6b0b1 Author: Richard Kennedy Date: Thu Oct 21 10:29:19 2010 +0100 slub tracing: move trace calls out of always inlined functions to reduce kernel code size Having the trace calls defined in the always inlined kmalloc functions in include/linux/slub_def.h causes a lot of code duplication as the trace functions get instantiated for each kamalloc call site. This can simply be removed by pushing the trace calls down into the functions in slub.c. On my x86_64 built this patch shrinks the code size of the kernel by approx 36K and also shrinks the code size of many modules -- too many to list here ;) size vmlinux (2.6.36) reports text data bss dec hex filename 5410611 743172 828928 6982711 6a8c37 vmlinux 5373738 744244 828928 6946910 6a005e vmlinux + patch The resulting kernel has had some testing & kmalloc trace still seems to work. This patch - moves trace_kmalloc out of the inlined kmalloc() and pushes it down into kmem_cache_alloc_trace() so this it only get instantiated once. - rename kmem_cache_alloc_notrace() to kmem_cache_alloc_trace() to indicate that now is does have tracing. (maybe this would better being called something like kmalloc_kmem_cache ?) - adds a new function kmalloc_order() to handle allocation and tracing of large allocations of page order. - removes tracing from the inlined kmalloc_large() replacing them with a call to kmalloc_order(); - move tracing out of inlined kmalloc_node() and pushing it down into kmem_cache_alloc_node_trace - rename kmem_cache_alloc_node_notrace() to kmem_cache_alloc_node_trace() - removes the include of trace/events/kmem.h from slub_def.h. v2 - keep kmalloc_order_trace inline when !CONFIG_TRACE Signed-off-by: Richard Kennedy Signed-off-by: Pekka Enberg commit 0d24db337e6d81c0c620ab65cc6947bd6553f742 Author: Christoph Lameter Date: Thu Oct 21 13:01:56 2010 -0500 slub: move slabinfo.c to tools/slub/slabinfo.c We now have a tools directory for these things. Reviewed-by: KOSAKI Motohiro Acked-by: David Rientjes Signed-off-by: Christoph Lameter Signed-off-by: Pekka Enberg commit 62d69e6a57c5b5d52a607b1ce73ff6af65c992eb Author: Enric Balletbo i Serra Date: Sat Oct 23 16:48:58 2010 +0000 omap3: IGEP v2: Remove onenand_setup no-op function Set onenand_setup to NULL instead of adding a no-op function. Signed-off-by: Enric Balletbo i Serra Signed-off-by: Tony Lindgren commit 0e4de059d90c96930ab237e7d4fbb7e3814afcb6 Author: Ben Collins Date: Fri Nov 5 10:29:33 2010 -0400 solo6x10: Implement working P2M descriptor more DMA We have to insert 1 dead descriptor first (all zereos), and then the real data descriptors after that. Everything uses descriptor mode now (8800 interrupts per second for display v4l2 is now down to ~96). Signed-off-by: Ben Collins commit 319fb3bacc517829cbd4d758f3b8969fdbde5c92 Author: Ben Collins Date: Thu Nov 4 23:20:31 2010 -0400 solo6x10: Updates to videobuf-dma-sg functions for latest kernel Signed-off-by: Ben Collins commit f62de9be26ce2144ad0dcf292727e4f58577d401 Author: Ben Collins Date: Thu Nov 4 22:51:17 2010 -0400 solo6x10: Conversion to videobuf-dma-sg (from dma-cont) Full rewrite of the P2M DMA Engine to support scatter gather and take advantage of some of the features of the hardware. This includes using repeat DMA operations and line-mode transfers (for copying OSG and video display buffers). What isn't working: For some reason, descriptor mode is not working. I've implemented a psuedo version (still has one-interrupt per DMA operation), but we would get huge improvements if we could hand off a ring of descriptors to the P2M and get back one interrupt when it was done with all of them. Documentation is very vague on this, and even the ODM example code half attempts to get it right, but comments it out of the driver because it just doesn't work *sigh* Converts all v4l2 to dma-sg. So long slow dma-contiguous, but hello more interrupts :( Signed-off-by: Ben Collins commit 1194cf4308d786c69b808ec3aa8704d01d130e94 Author: Ben Collins Date: Thu Nov 4 22:42:25 2010 -0400 solo6x10: Update TODO Signed-off-by: Ben Collins commit 98e2d5a802518694465368406c5f1b020f4df998 Author: Ben Collins Date: Thu Nov 4 22:37:15 2010 -0400 solo6x10: Spaces to tabs Signed-off-by: Ben Collins commit 8a9618f5dfca35edb0d7ab6374ff586e2e9e989b Author: Rob Herring Date: Wed Oct 6 16:18:08 2010 +0100 ARM: 6432/1: move timer-sp.c from versatile to common From: Rob Herring The timer-sp h/w used on versatile platforms can also be used for other platforms, so move it to a common location. Signed-off-by: Rob Herring Signed-off-by: Russell King commit 64d2dc384e41e2b7acead6804593ddaaf8aad8e1 Author: Leif Lindholm Date: Thu Sep 16 18:00:47 2010 +0100 ARM: 6396/1: Add SWP/SWPB emulation for ARMv7 processors The SWP instruction was deprecated in the ARMv6 architecture, superseded by the LDREX/STREX family of instructions for load-linked/store-conditional operations. The ARMv7 multiprocessing extensions mandate that SWP/SWPB instructions are treated as undefined from reset, with the ability to enable them through the System Control Register SW bit. This patch adds the alternative solution to emulate the SWP and SWPB instructions using LDREX/STREX sequences, and log statistics to /proc/cpu/swp_emulation. To correctly deal with copy-on-write, it also modifies cpu_v7_set_pte_ext to change the mappings to priviliged RO when user RO. Signed-off-by: Leif Lindholm Acked-by: Catalin Marinas Acked-by: Kirill A. Shutemov Signed-off-by: Russell King commit 247055aa21ffef1c49dd64710d5e94c2aee19b58 Author: Catalin Marinas Date: Mon Sep 13 16:03:21 2010 +0100 ARM: 6384/1: Remove the domain switching on ARMv6k/v7 CPUs This patch removes the domain switching functionality via the set_fs and __switch_to functions on cores that have a TLS register. Currently, the ioremap and vmalloc areas share the same level 1 page tables and therefore have the same domain (DOMAIN_KERNEL). When the kernel domain is modified from Client to Manager (via the __set_fs or in the __switch_to function), the XN (eXecute Never) bit is overridden and newer CPUs can speculatively prefetch the ioremap'ed memory. Linux performs the kernel domain switching to allow user-specific functions (copy_to/from_user, get/put_user etc.) to access kernel memory. In order for these functions to work with the kernel domain set to Client, the patch modifies the LDRT/STRT and related instructions to the LDR/STR ones. The user pages access rights are also modified for kernel read-only access rather than read/write so that the copy-on-write mechanism still works. CPU_USE_DOMAINS gets disabled only if the hardware has a TLS register (CPU_32v6K is defined) since writing the TLS value to the high vectors page isn't possible. The user addresses passed to the kernel are checked by the access_ok() function so that they do not point to the kernel space. Tested-by: Anton Vorontsov Cc: Tony Lindgren Signed-off-by: Catalin Marinas Signed-off-by: Russell King commit 5a39ce5b491a10f4a15bd30b26e55d3533b5f587 Author: Henrik Rydberg Date: Wed Oct 13 15:58:17 2010 +0200 HID: egalax: Use kzalloc To avoid unnecessary explicit initialization, allocate zeroed memory. Signed-off-by: Henrik Rydberg Acked-by: Chase Douglas Signed-off-by: Jiri Kosina commit 8b7347aab6865ae8a2e5a8b0f1deea12da3d3aff Author: Michael S. Tsirkin Date: Sun Sep 19 15:56:30 2010 +0200 vhost: get/put_user -> __get/__put_user We do access_ok checks on all ring values on an ioctl, so we don't need to redo them on each access. Signed-off-by: Michael S. Tsirkin commit dfe5ac5b18be5b10d01a17e734a9905c0def6088 Author: Michael S. Tsirkin Date: Tue Sep 21 14:18:01 2010 +0200 vhost: copy_to_user -> __copy_to_user We do access_ok checks at setup time, so we don't need to redo them on each access. Signed-off-by: Michael S. Tsirkin commit 64e1c80748afca3b4818ebb232a9668bf529886d Author: Michael S. Tsirkin Date: Wed Oct 6 15:34:45 2010 +0200 vhost-net: batch use/unuse mm Move use/unuse mm to vhost.c which makes it possible to batch these operations. Signed-off-by: Michael S. Tsirkin commit 533a19b4b88fcf81da3106b94f0ac4ac8b33a248 Author: Michael S. Tsirkin Date: Wed Oct 6 15:34:38 2010 +0200 vhost: put mm after thread stop makes it possible to batch use/unuse mm Signed-off-by: Michael S. Tsirkin commit a4bc6926d05b60bf70aab2db2c6715e15118cbdc Author: Jiri Kosina Date: Wed Nov 3 10:42:02 2010 -0400 HID: make translation table selection more clear Reshuffle the code a little bit so that the translation table selection is more obvious and there is only one place performing the actual translation using the selected table. Signed-off-by: Jiri Kosina commit 99b9f758bbc904f22faffcf4d83205f4a5e7bc0c Author: Edgar (gimli) Hucek Date: Wed Nov 3 10:36:18 2010 -0400 HID: add MacBookAir 3,1 and 3,2 support This patch add support for the MacBookAir3,1 and MacBookAir3,2 to the hid driver. Signed-off-by: Edgar (gimli) Hucek Signed-off-by: Jiri Kosina commit 587d145200f26758940099fbbc301fdd43d3f391 Author: Joe Perches Date: Mon Oct 25 19:44:21 2010 -0700 HID: Remove KERN_DEBUG from dbg_hid use Signed-off-by: Joe Perches Signed-off-by: Jiri Kosina commit 8b32a92b600e2728c5c438a748a4dc3132c98ef3 Author: Paul Mundt Date: Mon Nov 1 17:05:30 2010 -0400 sh: Add EHCI support for SH7786. This adds in the platform device for SH7786 USB EHCI. Signed-off-by: Paul Mundt commit 63c845522263b2da08f70deba760ed0ab51e841d Author: Paul Mundt Date: Mon Nov 1 17:03:27 2010 -0400 usb: ehci-hcd: Add support for SuperH EHCI. This adds a trivial stub for supporting EHCI mode of the on-chip SH USB host controllers. Signed-off-by: Paul Mundt commit 9cc563968066b55b067bcff132e4d566b020687d Author: Paul Mundt Date: Mon Nov 1 17:01:27 2010 -0400 usb: ohci-sh: Set IRQ as shared. The SH USB interface has both OHCI and EHCI modes that share the same interrupt. Flag the OHCI IRQ as shared in preparation for EHCI support. Signed-off-by: Paul Mundt commit 04561c5aa243c98cae93cde27e05740df787e692 Author: Ignaz Forster Date: Mon Nov 1 15:13:37 2010 -0400 HID: Add Force Feedback support for EMS Trio Linker Plus II The device has connections for GameCube, PlayStation 2 and Dreamcast controllers, however Force Feedback is only supported for PS2 and GC controllers. When using a PS2 controller it may be necessary to press the "Analog" button to enable support for both motors (this behavior is identical to the Windows driver, I have found no way to avoid that). Signed-off-by: Ignaz Forster Signed-off-by: Jiri Kosina commit e5837cef1d8356e8303585bd13611ecb3edb5747 Merge: c8ddb2713c624f432fa5fe3c7ecffcdda46ea0d4 2932af344a86cb1bd84ca8cc217ee016e8fb5255 Author: Stephen Hemminger Date: Mon Nov 1 14:37:23 2010 -0400 Merge branch 'master' of ../mine commit 2932af344a86cb1bd84ca8cc217ee016e8fb5255 Author: Stephen Hemminger Date: Mon Nov 1 14:18:16 2010 -0400 beceem: update TODO list Signed-off-by: Stephen Hemminger commit 349fa79498df313c70e2a4b7c16688be0a91dd0b Author: Stephen Hemminger Date: Mon Nov 1 14:09:05 2010 -0400 beceem: dump control packet information Add control packet information is useful for debugging. Signed-off-by: Stephen Hemminger commit 4ea4f7a0d3d7a9961bf77f0860df8dd4a213b8a3 Author: Stephen Hemminger Date: Mon Nov 1 14:06:24 2010 -0400 beceem: change startup messages Change the regsister/unregister routines to generate better messages, and control arrival of new frames when USB device is unplugged. Signed-off-by: Stephen Hemminger commit 9c5d77009db6ff09d02a7b0a99a70c0dfd3af6c6 Author: Stephen Hemminger Date: Mon Nov 1 13:59:01 2010 -0400 beceem: don't overrun user buffer on read Serious bug in original code, if app reads 10 bytes but 20 byte msg received memory would get overwritten. Signed-off-by: Stephen Hemminger commit 5cf084f44ac24189ef3373010da49e26d651aa06 Author: Stephen Hemminger Date: Mon Nov 1 13:57:35 2010 -0400 beceem: eliminate unused bcm_jiffies Unused, unneeded, and bogus. Signed-off-by: Stephen Hemminger commit 78afa9990fdbbf01227104300a657be3f3caa167 Author: Stephen Hemminger Date: Mon Nov 1 13:54:21 2010 -0400 beceem: fix definition of VLAN header type Signed-off-by: Stephen Hemminger commit cacd92222dd4e04424fa532cf1a222e67c30709b Author: Stephen Hemminger Date: Mon Nov 1 13:34:35 2010 -0400 beceem: statistics and transmit queue changes Use standard network statistics variables and routines. Transmit counters are per queue, and skb mapping is already in skb and does not need to be recomputed. Move SearchVcId to only place it is used. Signed-off-by: Stephen Hemminger commit b5ebd85b2bcc0c0a2171e4cc74c61debdc903ddf Author: Stephen Hemminger Date: Mon Nov 1 12:28:39 2010 -0400 beceem: do classification even if device is offline Since classification and queue control are separate, allow classification even if device is down now; this avoids races on startup/shutdown. Signed-off-by: Stephen Hemminger commit 429a5908fe3bc4d9ca2512b94cd10b69d50bf91f Author: Stephen Hemminger Date: Mon Nov 1 12:27:20 2010 -0400 beceem: off by one on queue index The driver allocates 18 queues (0..16) are for traffic, and 17 is a bit bucket. Signed-off-by: Stephen Hemminger commit 9dd47ee7dd535649a2c32d509631c7a3d793f2e1 Author: Stephen Hemminger Date: Mon Nov 1 12:24:00 2010 -0400 beceem: make local functions static Use namespace tool from kernel scripts to identify dead code and functions that should be static. Signed-off-by: Stephen Hemminger commit 45400554923867c8479621e55a76e0612192dafb Author: Stephen Hemminger Date: Mon Nov 1 12:21:32 2010 -0400 beceem: remove unused code to dump header Signed-off-by: Stephen Hemminger commit ac1b1ae7f84dcde6d6fefc7f8ca27c4e5bd92c22 Author: Stephen Hemminger Date: Mon Nov 1 12:20:09 2010 -0400 beceem: transmit code cleanup Eliminate global variable in transmit path The Leader can be on the stack, and get rid of unnecessary timeval. Signed-off-by: Stephen Hemminger commit 1da9badcf02dd6532df9bde8fc05648e74982f2c Author: Stephen Hemminger Date: Mon Nov 1 11:58:01 2010 -0400 beceem: allow multicast/broadcast Even though wimax isn't really a broadcast medium, pretend it is. Signed-off-by: Stephen Hemminger commit 9ec4475bf10bb2c30cd5e927bc453aa307f58123 Author: Stephen Hemminger Date: Mon Nov 1 12:18:36 2010 -0400 beceem: debug message format changes Add more debug messages and make them similar to other drivers Signed-off-by: Stephen Hemminger commit e4d46254da76106e48b7cadc59fb410291e2da4b Author: Stephen Hemminger Date: Mon Nov 1 11:39:05 2010 -0400 beceem: use get_seconds for elapsed time get_seconds is lower overhead and fine if all driver wants to do is keep track of seconds. Signed-off-by: Stephen Hemminger commit 2d08748ae53bf07fe6fcaf4f3d40449b471ce351 Author: Stephen Hemminger Date: Mon Nov 1 12:14:01 2010 -0400 beceem: module initialization Get rid of boot messages and put in correct place. Signed-off-by: Stephen Hemminger commit 4fd64dd0c1b9317ffe6fdaf3de788e14df880d8d Author: Stephen Hemminger Date: Mon Nov 1 12:12:31 2010 -0400 beceem: add network device message level control Provide standard interface to control verbosity of debug messages Signed-off-by: Stephen Hemminger commit e39e3be66eed17f27a9de322e5220d33e70a90a6 Author: Stephen Hemminger Date: Mon Nov 1 11:14:29 2010 -0400 beceem: change format of debug message Statistic point is now u32 (like it has to be). Signed-off-by: Stephen Hemminger commit 3349d95b3f8c3becb9e6dbe0be978bf663174fef Author: Stephen Hemminger Date: Mon Nov 1 11:12:56 2010 -0400 beceem: clean up adapter structure Remove dead fields, change fields that only have true/false to boolean; and rearrange to save space. Signed-off-by: Stephen Hemminger commit 9e0a3169a34ba5fd04bde058a63fa0a36f2d7ed3 Author: Stephen Hemminger Date: Mon Nov 1 10:17:54 2010 -0400 beceem: create class on module installation First step to supporting multiple devices, create device class when module is initialized. Signed-off-by: Stephen Hemminger commit 46c3790eb523931a803bb3c28c5bf8bbfc8acf48 Author: Stephen Hemminger Date: Mon Nov 1 10:16:29 2010 -0400 beceem: convert to kernel coding style Change indentation etc, to conform to acceptable kernel style Signed-off-by: Stephen Hemminger commit 5afb5145a13ac26f3c7ab273140a83958bc038f0 Author: Stephen Hemminger Date: Mon Nov 1 10:07:20 2010 -0400 beceem: remove useless debug function entry messages Signed-off-by: Stephen Hemminger commit 957ea3b57056e79c945d8bc39fd6eeb3c2a7ed9e Author: Stephen Hemminger Date: Mon Nov 1 10:05:34 2010 -0400 beceem: remove problematic debug print messages Not worth bothering to change printf format of messages which are basically noise. Signed-off-by: Stephen Hemminger commit 032100f65295d594fc0481e840efe8b6c1e398af Author: Stephen Hemminger Date: Mon Nov 1 10:03:29 2010 -0400 beceem: remove unnecessary usb class Signed-off-by: Stephen Hemminger commit ada692b09f4707a8e06b087b1546d9f5b3f2d37d Author: Stephen Hemminger Date: Mon Nov 1 09:26:47 2010 -0400 beceem: fix character device ioctl Sparse caught several places where ioctl interface was incorrectly using user memory. Fix all the ioctl cases for casting and __user annotation. Signed-off-by: Stephen Hemminger commit c5ebe2278ba600ff48663ec84c6e7f34d291503f Author: Stephen Hemminger Date: Mon Nov 1 08:42:44 2010 -0400 beceem: fix printf format strings Signed-off-by: Stephen Hemminger commit 0980f2e8144ea0021a09be41176b736d76ca3db7 Author: Stephen Hemminger Date: Mon Nov 1 00:04:52 2010 -0400 beceem: reserve one queue for bit-bucket This preserves the semantics of the original driver (unclassified packets are dropped), but does it in a clean way; and fixes crash when packet is sent to offline device. Signed-off-by: Stephen Hemminger commit 3644c1a2f12b15e1c8bfb9ebfaacbd177011a72d Author: Stephen Hemminger Date: Mon Nov 1 00:03:03 2010 -0400 beceem: remove dead code Remove commented out with '#if 0' Signed-off-by: Stephen Hemminger commit 937110581650eaa517f045fb7b86b9828ba693ad Author: Stephen Hemminger Date: Sun Oct 31 23:55:21 2010 -0400 beceem: support multiple queues Current kernels have multi-queue support which can be used by this device. This has the advantage that a single type of traffic will not block other types. Signed-off-by: Stephen Hemminger commit 20f48653fcf51f6d1246b5f3f86b40ed779385b2 Author: Stephen Hemminger Date: Sun Oct 31 23:52:36 2010 -0400 beceem: get rid of unnecessary inline usage Many routines were tagged with inline_ but GCC does a better job of deciding this. Signed-off-by: Stephen Hemminger commit 26a0e39ac8ed1f38b31baeb901bc76501466d34e Author: Stephen Hemminger Date: Sun Oct 31 23:47:35 2010 -0400 beceem: fold unregister_netdevice into AdapterFree The function unregister_netdevice only called unregister_netdev. Signed-off-by: Stephen Hemminger commit 7441698fe9eb0eb473cf1699d9cd8dd06dfeaf77 Author: Stephen Hemminger Date: Mon Nov 1 09:53:58 2010 -0400 beceem: remove ARP spoofing Linux support NOARP flag, so the whole Arp spoofing routines are not needed. Signed-off-by: Stephen Hemminger commit 6ba8fe77ddd3a25daa8409333295b90c26a43bae Author: Stephen Hemminger Date: Sun Oct 31 23:43:55 2010 -0400 beceem: print better message on bad ioctl Signed-off-by: Stephen Hemminger commit e614e28eac1afcdc3d1275f3e1478aa3e5acc500 Author: Stephen Hemminger Date: Mon Nov 1 09:52:14 2010 -0400 beceem: remove indirection to Adapter structure Allocate Adapter structure as part of network device. Signed-off-by: Stephen Hemminber commit 2515ab628f227b0711393993fe3228e167cc988f Author: Stephen Hemminger Date: Fri Oct 29 21:39:54 2010 -0700 beceem: Add proper carrier and link management Start with carrier off. Don't track up/down status in driver private flag. Signed-off-by: Stephen Hemminger commit d7affd0f58c9f68441b4ce631d07fad2e6a448db Author: Stephen Hemminger Date: Fri Oct 29 17:15:06 2010 -0700 beceem: reduce transmit queue len Reduce transmit queue length to avoid excess buffering Signed-off-by: Stephen Hemminger commit 9c6e9aa830071a442fb72ab05c15e2b2609636e3 Author: Stephen Hemminger Date: Fri Oct 29 17:13:52 2010 -0700 beceem: remove dead code Signed-off-by: Stephen Hemminger commit d21d6dde0280f0897ce6de1948bfaa5633867b28 Author: Stephen Hemminger Date: Fri Oct 29 17:12:37 2010 -0700 beceem: add ethtool support This adds basic ethtool support to get driver info and settings Signed-off-by: Stephen Hemminger commit 71e253b1699fb777be68cb1028a90e21ea6ff8d8 Author: Stephen Hemminger Date: Mon Nov 1 09:49:30 2010 -0400 beceem: make transmit thread interruptible Kernel complains loudly if thread does long uninterruptible sleep. Also, dont wake up every 10ms even if no data present (wastes power). Signed-off-by: Stephen Hemminger commit 37b7a97884ba64bf7d403351ac2a9476ab4f1bba Author: Paul Mundt Date: Mon Nov 1 09:49:04 2010 -0400 sh: machvec IO death. This takes a bit of a sledgehammer to the machvec I/O routines. The iomem case requires no special casing and so can just be dropped outright. This only leaves the ioport casing for PCI and SuperIO mangling. With the SuperIO case going through the standard ioport mapping, it's possible to replace everything with generic routines. With this done the standard I/O routines are tidied up and NO_IOPORT now gets default-enabled for the vast majority of boards. Signed-off-by: Paul Mundt commit de85f9858969f50467bf39ee992ef871ae2492d3 Author: Stephen Hemminger Date: Fri Oct 29 17:02:39 2010 -0700 beceem: name threads with device name This is the convention used by Intel Wimax Signed-off-by: Stephen Hemminger commit 082e889b475c46e71be6e779f15ab095f888e03f Author: Stephen Hemminger Date: Mon Nov 1 09:35:21 2010 -0400 beceem: remove OS wrapper library Use native kernel functions for kmalloc/kfree directly Signed-off-by: Stephen Hemminger commit c5113e3c111b03c8eaf3fb0ef39e33dc25171adc Author: Stephen Hemminger Date: Fri Oct 29 21:26:06 2010 -0700 beceem: use kernel print_hex_dump function No longer need special hex dump routine Signed-off-by: Stephen Hemminger commit 4b6ba8aacbb3185703b797286547d0f8f3859b02 Author: David Daney Date: Tue Oct 26 15:07:13 2010 -0700 of/net: Move of_get_mac_address() to a common source file. There are two identical implementations of of_get_mac_address(), one each in arch/powerpc/kernel/prom_parse.c and arch/microblaze/kernel/prom_parse.c. Move this function to a new common file of_net.{c,h} and adjust all the callers to include the new header. Signed-off-by: David Daney [grant.likely@secretlab.ca: protect header with #ifdef] Signed-off-by: Grant Likely commit 0ad008fcbc39572ab7078975cdf7e902fbc39ce6 Author: Stephen Hemminger Date: Fri Oct 29 16:44:07 2010 -0700 beceem: cleanup network device setup Change how network device is setup: * set pointer to device object so sysfs has eth0/device symlink * set network device type * eliminate all the compatiablity with older kernels. Signed-off-by: Stephen Hemminger commit 92bc60580e55d18494a23ba8ae642a464ebfd7a6 Author: Stephen Hemminger Date: Fri Oct 29 08:22:10 2010 -0700 beceem: get rid of OS dependent data structure The only part of this structure still used was the network device stats, and in recent kernel these are available in network device itself. Signed-off-by: Stephen Hemminger commit 2b5e625882a7130c339e4ad2ac2b8f0422f11919 Author: Stephen Hemminger Date: Fri Oct 29 08:20:11 2010 -0700 beceem: eliminate dead code Get rid of empty header file and unused declarations Signed-off-by: Stephen Hemminger commit d52db0b4b34410019e1546e3ccbe761b9e4ddd76 Author: Stephen Hemminger Date: Fri Oct 29 08:18:27 2010 -0700 beceem: eliminate network registered state variable Just use presence of pointer Signed-off-by: Stephen Hemminger commit 3705a843bd98b3ccb7c4b6addfc182fe805a73ed Author: Stephen Hemminger Date: Fri Oct 29 08:14:16 2010 -0700 beceem: remove bogus network device notifier Network device should not be messing with refcounts directly. See Documentation/networking/netdevices.txt Signed-off-by: Stephen Hemminger commit 2564a148d5326f1d36202e497b3dd0a17422c636 Author: Stephen Hemminger Date: Fri Oct 29 08:11:12 2010 -0700 beceem: cleanup debug level infrastructure Add module parameter to control debug level and do code cleanup The whole debug stuff should eventually be removed. Signed-off-by: Stephen Hemminger commit 047a5f2b503d0ba17704c9714b296cbf06ec087e Author: Stephen Hemminger Date: Fri Oct 29 08:04:18 2010 -0700 beceem: eliminate unused USB stubs USB layer does not require these reset function stubs Signed-off-by: Stephen Hemminger commit 5abe61ade9a137b35aa29919334dde7f3a30b248 Author: Stephen Hemminger Date: Fri Oct 29 08:02:08 2010 -0700 beceem: remove version ifdef's Remove code to support older kernel API's Signed-off-by: Stephen Hemminger commit 91d29ee1a82fedcd7d1bbf24007b31a49c47e90a Author: Stephen Hemminger Date: Fri Oct 29 07:51:47 2010 -0700 beceem: remove ifdef's There were a lot of ifdef's for driver options which have no configuration options. Choose the current value and remove the ifdef. Signed-off-by: Stephen Hemminger commit 2e44f765dfd3a8592c2d6b6005be061eccdee137 Author: Stephen Hemminger Date: Fri Oct 29 07:44:45 2010 -0700 beceem: add module information Add description and version information to the driver. Make USB device table exported as alias so device will be autoloaded. Get rid of useless noise message on boot. Signed-off-by: Stephen Hemminger commit b690c425fe07c725e7f1f7d40303588416cba67f Author: Daniel Hellstrom Date: Fri Oct 29 13:25:24 2010 -0700 SPARC/LEON: removed constant timer initialization as if HZ=100, now it reflects the value of HZ Signed-off-by: Daniel Hellstrom Signed-off-by: David S. Miller commit 3fcedec752108de5d99b9f0373ff880756a1e87d Author: Julia Lawall Date: Tue Oct 26 12:25:32 2010 +0200 drivers/vhost/vhost.c: delete double assignment Delete successive assignments to the same location. A simplified version of the semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // @@ expression i; @@ *i = ...; i = ...; // Signed-off-by: Julia Lawall Signed-off-by: Michael S. Tsirkin commit eb48c9cb2053e7bb5f7f8f0371cb578a0d439450 Author: Robert Richter Date: Mon Oct 25 16:03:39 2010 +0200 apic, amd: Make firmware bug messages more meaningful This improves error messages in case the BIOS was setting up wrong LVT offsets. Signed-off-by: Robert Richter Acked-by: Borislav Petkov LKML-Reference: <1288015419-29543-6-git-send-email-robert.richter@amd.com> Signed-off-by: Ingo Molnar commit 0a17941e71f089b128514f7b5b486e20072ca7dc Author: Robert Richter Date: Mon Oct 25 16:03:38 2010 +0200 mce, amd: Remove goto in threshold_create_device() Removing the goto in threshold_create_device(). Signed-off-by: Robert Richter Acked-by: Borislav Petkov LKML-Reference: <1288015419-29543-5-git-send-email-robert.richter@amd.com> Signed-off-by: Ingo Molnar commit bbaff08dca3c34d0fb6b4c4051354184e33e3df8 Author: Robert Richter Date: Mon Oct 25 16:03:37 2010 +0200 mce, amd: Add helper functions to setup APIC This patch reworks and cleans up mce_amd_feature_init() by introducing helper functions to setup and check the LVT offset. It also fixes line endings in pr_err() calls. Signed-off-by: Robert Richter Acked-by: Borislav Petkov LKML-Reference: <1288015419-29543-4-git-send-email-robert.richter@amd.com> Signed-off-by: Ingo Molnar commit 7203a0494084541575bac6dfc4e153f9e28869b8 Author: Robert Richter Date: Mon Oct 25 16:03:36 2010 +0200 mce, amd: Shorten local variables mci_misc_{hi,lo} Shorten this variables to make later changes more readable. Signed-off-by: Robert Richter Acked-by: Borislav Petkov LKML-Reference: <1288015419-29543-3-git-send-email-robert.richter@amd.com> Signed-off-by: Ingo Molnar commit 9c37c9d89773ee9da9f6af28ee37d931bd045711 Author: Robert Richter Date: Mon Oct 25 16:03:35 2010 +0200 mce, amd: Implement mce_threshold_block_init() helper function This patch adds a helper function for the initial setup of an mce threshold block. The LVT offset is passed as argument. Also making variable threshold_defaults local as it is only used in function mce_amd_feature_init(). Function threshold_restart_bank() is extended to setup the LVT offset, the change is backward compatible. Thus, now there is only a single wrmsrl() to setup the block. Signed-off-by: Robert Richter Acked-by: Borislav Petkov LKML-Reference: <1288015419-29543-2-git-send-email-robert.richter@amd.com> Signed-off-by: Ingo Molnar commit 7fb2b870d6a3b92f6750ac2b72858fd098dc9e3f Author: Thomas Gleixner Date: Sun Oct 24 11:11:22 2010 +0200 x86: io_apic: Fix CONFIG_X86_IO_APIC=n breakage Stupid me forgot to change the function name for the CONFIG_X86_IO_APIC=n case in commit 23f9b2671 (x86: apic: Move probe_nr_irqs_gsi() into ioapic_init_mappings()) Signed-off-by: Thomas Gleixner commit fe7de49f9d4e53f24ec9ef762a503f70b562341c Author: KOSAKI Motohiro Date: Wed Oct 20 16:01:12 2010 -0700 sched: Make sched_param argument static in sched_setscheduler() callers Andrew Morton pointed out almost all sched_setscheduler() callers are using fixed parameters and can be converted to static. It reduces runtime memory use a little. Signed-off-by: KOSAKI Motohiro Reported-by: Andrew Morton Acked-by: James Morris Cc: Ingo Molnar Cc: Steven Rostedt Signed-off-by: Andrew Morton Signed-off-by: Thomas Gleixner Signed-off-by: Ingo Molnar commit 23f9b267159b4c7ff59d2e6c8ed31693eff841e3 Author: Thomas Gleixner Date: Fri Oct 15 15:38:50 2010 -0700 x86: apic: Move probe_nr_irqs_gsi() into ioapic_init_mappings() probe_br_irqs_gsi() is called right after ioapic_init_mappings() and there are no other users. Move it into ioapic_init_mappings() so the declaration can disappear and the function can become static. Rename ioapic_init_mappings() to ioapic_and_gsi_init() to reflect that change. Signed-off-by: Thomas Gleixner LKML-Reference: <1287510389-8388-2-git-send-email-dirk.brandewie@gmail.com> Signed-off-by: Dirk Brandewie commit 5a7ae78fd478624df3059cb6f55056b85d074acc Author: Thomas Gleixner Date: Tue Oct 19 10:46:28 2010 -0700 x86: Allow platforms to force enable apic Some embedded x86 platforms don't setup the APIC in the BIOS/bootloader and would be forced to add "lapic" on the kernel command line. That's a bit akward. Split out the force enable code from detect_init_APIC() and allow platform code to call it from the platform setup. That avoids the command line parameter and possible replication of the MSR dance in the force enable code. Signed-off-by: Thomas Gleixner LKML-Reference: <1287510389-8388-1-git-send-email-dirk.brandewie@gmail.com> Signed-off-by: Dirk Brandewie commit fd35fbcdd1b2579a6e00a1545f7124e4005d0474 Author: H. Peter Anvin Date: Fri Oct 22 15:33:38 2010 -0700 x86-64, asm: Use fxsaveq/fxrestorq in more places Checkin d7acb92fea932ad2e7846480aeacddc2c03c8485 made use of fxsaveq in fpu_fxsave() if the assembler supports it; this adds fxsaveq/fxrstorq to fxrstor_checking() and fxsave_user() as well. Reported-by: Linus Torvalds LKML-Reference: Signed-off-by: H. Peter Anvin commit 466bd3030973910118ca601da8072be97a1e2209 Author: Yong Zhang Date: Wed Oct 20 15:57:33 2010 -0700 timer: Warn when del_timer_sync() is called in hardirq context Add explict warning when del_timer_sync() is called in hardirq context. Signed-off-by: Yong Zhang Cc: Ingo Molnar Cc: Peter Zijlstra Acked-by: Oleg Nesterov Signed-off-by: Andrew Morton Signed-off-by: Thomas Gleixner commit 1118e2cd33d47254854e1ba3ba8e32802ff14fdf Author: Yong Zhang Date: Wed Oct 20 15:57:32 2010 -0700 timer: Del_timer_sync() can be used in softirq context Actually we have used del_timer_sync() in softirq context for a long time, e.g. in __dst_free()::cancel_delayed_work(). So change the comments of it to warn on hardirq context only, and make lockdep know about this change. Signed-off-by: Yong Zhang Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Oleg Nesterov Signed-off-by: Andrew Morton Signed-off-by: Thomas Gleixner commit 6f1bc451e6a79470b122a37ee1fc6bbca450f444 Author: Yong Zhang Date: Wed Oct 20 15:57:31 2010 -0700 timer: Make try_to_del_timer_sync() the same on SMP and UP On UP try_to_del_timer_sync() is mapped to del_timer() which does not take the running timer callback into account, so it has different semantics. Remove the SMP dependency of try_to_del_timer_sync() by using base->running_timer in the UP case as well. [ tglx: Removed set_running_timer() inline and tweaked the changelog ] Signed-off-by: Yong Zhang Cc: Ingo Molnar Cc: Peter Zijlstra Acked-by: Oleg Nesterov Signed-off-by: Andrew Morton Signed-off-by: Thomas Gleixner commit 20f33a03f0cf87e51165f7084f697acfb68e865b Author: Namhyung Kim Date: Wed Oct 20 15:57:34 2010 -0700 posix-timers: Annotate lock_timer() lock_timer() conditionally grabs it_lock in case of returning non-NULL but unlock_timer() releases it unconditionally. This leads sparse to complain about the lock context imbalance. Rename and wrap lock_timer using __cond_lock() macro to make sparse happy. Signed-off-by: Namhyung Kim Signed-off-by: Andrew Morton Signed-off-by: Thomas Gleixner commit dd6414b50fa2b1cd247a8aa8f8bd42414b7453e1 Author: Phil Carmody Date: Wed Oct 20 15:57:33 2010 -0700 timer: Permit statically-declared work with deferrable timers Currently, you have to just define a delayed_work uninitialised, and then initialise it before first use. That's a tad clumsy. At risk of playing mind-games with the compiler, fooling it into doing pointer arithmetic with compile-time-constants, this lets clients properly initialise delayed work with deferrable timers statically. This patch was inspired by the issues which lead Artem Bityutskiy to commit 8eab945c5616fc984 ("sunrpc: make the cache cleaner workqueue deferrable"). Signed-off-by: Phil Carmody Acked-by: Artem Bityutskiy Cc: Arjan van de Ven Signed-off-by: Andrew Morton Signed-off-by: Thomas Gleixner commit 2bf1c05e3c406925e498d06da66b4828f0209ea6 Author: Nikitas Angelinas Date: Wed Oct 20 15:57:31 2010 -0700 time: Use ARRAY_SIZE macro in timecompare.c Replace sizeof(buffer)/sizeof(buffer[0]) with ARRAY_SIZE(buffer) in kernel/time/timecompare.c Signed-off-by: Nikitas Angelinas Signed-off-by: Andrew Morton Signed-off-by: Thomas Gleixner commit aaabe31c25a439b92cc281b14ca18b85bae7e7a6 Author: Changli Gao Date: Wed Oct 20 15:57:30 2010 -0700 timer: Initialize the field slack of timer_list TIMER_INITIALIZER() should initialize the field slack of timer_list as __init_timer() does. Signed-off-by: Changli Gao Cc: Arjan van de Ven Signed-off-by: Andrew Morton Signed-off-by: Thomas Gleixner commit d0959024d8fb6555ba8bfdc6624cc7b7c2e675fd Author: Richard Kennedy Date: Wed Oct 20 15:57:30 2010 -0700 timer_list: Remove alignment padding on 64 bit when CONFIG_TIMER_STATS Reorder struct timer_list to remove 8 bytes of alignment padding on 64 bit builds when CONFIG_TIMER_STATS is selected. timer_list is widely used across the kernel so many structures will benefit and shrink in size. For example, with my config on x86_64 per_cpu_dm_data shrinks from 136 to 128 bytes and ahci_port_priv shrinks from 1032 to 968 bytes. Signed-off-by: Richard Kennedy Cc: Ingo Molnar Signed-off-by: Andrew Morton Signed-off-by: Thomas Gleixner commit a386b5af8edda1c742ce9f77891e112eefffc005 Author: Kasper Pedersen Date: Wed Oct 20 15:55:15 2010 -0700 time: Compensate for rounding on odd-frequency clocksources When the clocksource is not a multiple of HZ, the clock will be off. For acpi_pm, HZ=1000 the error is 127.111 ppm: The rounding of cycle_interval ends up generating a false error term in ntp_error accumulation since xtime_interval is not exactly 1/HZ. So, we subtract out the error caused by the rounding. This has been visible since 2.6.32-rc2 commit a092ff0f90cae22b2ac8028ecd2c6f6c1a9e4601 time: Implement logarithmic time accumulation That commit raised NTP_INTERVAL_FREQ and exposed the rounding error. testing tool: http://n1.taur.dk/permanent/testpmt.c Also tested with ntpd and a frequency counter. Signed-off-by: Kasper Pedersen Acked-by: john stultz Cc: John Kacur Cc: Clark Williams Cc: Martin Schwidefsky Signed-off-by: Andrew Morton Signed-off-by: Thomas Gleixner commit 8e8be45e8e55daa381028aec339829929ddb53a5 Author: Paul E. McKenney Date: Thu Sep 2 16:16:14 2010 -0700 rcu: add priority-inversion testing to rcutorture Add an optional test to force long-term preemption of RCU read-side critical sections, controlled by new test_boost, test_boost_interval, and test_boost_duration module parameters. This is to be used to test RCU priority boosting. Signed-off-by: Paul E. McKenney commit d3b8f889a220aed825accc28eb64ce283a0d51ac Author: john stultz Date: Mon Aug 17 16:40:47 2009 -0700 x86: Make tsc=reliable override boot time stability checks This patch makes the tsc=reliable option disable the boot time stability checks. Currently the option only disables the runtime watchdog checks. This change allows folks who want to override the boot time TSC stability checks and use the TSC when the system would otherwise disqualify it. There still are some situations that the TSC will be disqualified, such as cpufreq scaling. But these are situations where the box will hang if allowed. Patch also includes a fix for an issue found by Thomas Gleixner, where the TSC disqualification message wouldn't be printed after a call to unsynchronized_tsc(). Signed-off-by: John Stultz Cc: Andrew Morton Cc: akataria@vmware.com Cc: Stephen Hemminger LKML-Reference: <1250552447.7212.92.camel@localhost.localdomain> Signed-off-by: Thomas Gleixner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From aelder@sgi.com Tue Jan 11 11:06:45 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0BH6jKW101960 for ; Tue, 11 Jan 2011 11:06:45 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id 72CA2AC006; Tue, 11 Jan 2011 09:08:55 -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 p0BH8sIM010205; Tue, 11 Jan 2011 11:08:54 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.4/8.14.4/Submit) id p0BH8s0L010204; Tue, 11 Jan 2011 11:08:54 -0600 From: Alex Elder Message-Id: <201101111708.p0BH8s0L010204@stout.americas.sgi.com> Date: Tue, 11 Jan 2011 11:08:54 -0600 To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update for 2.6.38-rc1 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 XFS updates for 2.6.38. I have two branches for you to choose from this time: git://oss.sgi.com/xfs/xfs for-linus-merged (recommended) This version includes one additional commit, a manual merge I completed to fix a merge conflict due to Nick Piggin's scalability changes. git://oss.sgi.com/xfs/xfs for-linus This version contains the XFS changes only, in case you want to do the merge yourself. Thank you. -Alex The following changes since commit 5b2eef966cb2ae307aa4ef1767f7307774bc96ca: Merge branch 'drm-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 (2011-01-10 17:11:39 -0800) are available in the git repository at: git://oss.sgi.com/xfs/xfs for-linus-merged Alex Elder (1): Merge branch 'master' into for-linus-merged Christoph Hellwig (16): xfs: remove leftovers of old buffer log items in recovery code xfs: use struct list_head for the buf cancel table xfs: refactor xlog_recover_commit_trans xfs: untangle phase1 vs phase2 recovery helpers xfs: improve mapping type check in xfs_vm_writepage xfs: remove some dead bio handling code xfs: a few small tweaks for overwrites in xfs_vm_writepage xfs: cleanup the xfs_iomap_write_* helpers xfs: kill xfs_iomap xfs: simplify xfs_map_blocks xfs: remove xfs_probe_cluster xfs: remove the all_bh flag from xfs_convert_page xfs: refactor xfs_vm_writepage xfs: simplify xfs_map_at_offset xfs: clean up xfs_alloc_ag_vextent_exact xfs: factor duplicate code in xfs_alloc_ag_vextent_near into a helper Dave Chinner (30): xfs: provide a inode iolock lockdep class xfs: use KM_NOFS for allocations during attribute list operations 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 Samuel Kvasnica (1): xfs: fix exporting with left over 64-bit inodes fs/xfs/linux-2.6/sv.h | 59 ---- fs/xfs/linux-2.6/xfs_aops.c | 425 ++++++++++-------------- fs/xfs/linux-2.6/xfs_aops.h | 16 + fs/xfs/linux-2.6/xfs_buf.c | 235 +++++++++----- fs/xfs/linux-2.6/xfs_buf.h | 22 +- fs/xfs/linux-2.6/xfs_export.c | 12 +- fs/xfs/linux-2.6/xfs_linux.h | 1 - fs/xfs/linux-2.6/xfs_super.c | 22 +- fs/xfs/linux-2.6/xfs_sync.c | 92 ++++-- fs/xfs/linux-2.6/xfs_trace.h | 59 ++-- fs/xfs/quota/xfs_dquot.c | 1 - fs/xfs/xfs_ag.h | 2 +- fs/xfs/xfs_alloc.c | 351 ++++++++------------ fs/xfs/xfs_attr_leaf.c | 4 +- fs/xfs/xfs_btree.c | 9 +- fs/xfs/xfs_buf_item.c | 32 ++- fs/xfs/xfs_buf_item.h | 11 - fs/xfs/xfs_extfree_item.c | 97 +++--- fs/xfs/xfs_extfree_item.h | 11 +- fs/xfs/xfs_fsops.c | 1 + fs/xfs/xfs_iget.c | 79 ++++- fs/xfs/xfs_inode.c | 54 +++- fs/xfs/xfs_inode.h | 15 +- fs/xfs/xfs_inode_item.c | 92 +++++- fs/xfs/xfs_iomap.c | 233 +++++--------- fs/xfs/xfs_iomap.h | 27 +-- fs/xfs/xfs_log.c | 739 +++++++++++++++++++---------------------- fs/xfs/xfs_log_cil.c | 17 +- fs/xfs/xfs_log_priv.h | 127 ++++++-- fs/xfs/xfs_log_recover.c | 620 ++++++++++++++--------------------- fs/xfs/xfs_mount.c | 23 ++- fs/xfs/xfs_mount.h | 14 + fs/xfs/xfs_trans.c | 79 +++++- 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 +++-- 38 files changed, 1998 insertions(+), 1921 deletions(-) delete mode 100644 fs/xfs/linux-2.6/sv.h From xfs-bounces@oss.sgi.com Tue Jan 11 11:12:10 2011 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 p0BGlhtc101000 for ; Tue, 11 Jan 2011 10:47:43 -0600 MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Subject: Your message to xfs awaits moderator approval From: xfs-bounces@oss.sgi.com To: xfs@oss.sgi.com Message-ID: Date: Tue, 11 Jan 2011 10:47:42 -0600 Precedence: bulk X-BeenThere: xfs@oss.sgi.com X-Mailman-Version: 2.1.11 List-Id: XFS Filesystem from SGI X-List-Administrivia: yes Sender: xfs-bounces@oss.sgi.com Errors-To: xfs-bounces@oss.sgi.com Your mail to 'xfs' with the subject [XFS updates] XFS development tree branch, for-linus-merged, created. v2.6.37-rc4-5735-g92f1c00 Is being held until the list moderator can review it for approval. The reason it is being held: Message body is too big: 3524722 bytes with a limit of 500 KB Either the message will get posted to the list, or you will receive notification of the moderator's decision. If you would like to cancel this posting, please visit the following URL: http://oss.sgi.com/mailman/confirm/xfs/dcde27207d3612155e90c69ebb2ee3bb5615e8d9 From BATV+6fbb206284491f7e0145+2697+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 11 11:31:14 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0BHVD3r103225 for ; Tue, 11 Jan 2011 11:31:14 -0600 X-ASG-Debug-ID: 1294767205-1a3d00980000-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 6CA9AFDB83D for ; Tue, 11 Jan 2011 09:33:25 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id iM2WJY1joHBJbZ9s for ; Tue, 11 Jan 2011 09:33:25 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pci61-0006Gg-2w; Tue, 11 Jan 2011 17:33:25 +0000 Date: Tue, 11 Jan 2011 12:33:25 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss X-ASG-Orig-Subj: Re: [PATCH xfstests] 243: remove test files before starting Subject: Re: [PATCH xfstests] 243: remove test files before starting Message-ID: <20110111173325.GA24025@infradead.org> References: <4D2C7967.2090801@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D2C7967.2090801@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1294767206 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, Jan 11, 2011 at 09:38:15AM -0600, Eric Sandeen wrote: > I found that overwriting existing files hides a bug > in ext4 (since fixed). Removing the files before > the test reliably reproduces it. > > Signed-off-by: Eric Sandeen Looks good, Reviewed-by: Christoph Hellwig From BATV+6fbb206284491f7e0145+2697+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 11 11:34:16 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0BHYGMX103372 for ; Tue, 11 Jan 2011 11:34:16 -0600 X-ASG-Debug-ID: 1294767388-115601330000-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 54F5E153DE4E for ; Tue, 11 Jan 2011 09:36:29 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id GAIYxExqqoF6EeNR for ; Tue, 11 Jan 2011 09:36:29 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pci8x-00070R-3J; Tue, 11 Jan 2011 17:36:27 +0000 Date: Tue, 11 Jan 2011 12:36:27 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Subject: Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Message-ID: <20110111173627.GB24025@infradead.org> References: <1294702668-15216-1-git-send-email-david@fromorbit.com> <1294702668-15216-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294702668-15216-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: 1294767389 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, Jan 11, 2011 at 10:37:44AM +1100, Dave Chinner wrote: > From: Dave Chinner > > We need to obtain the i_mutex, i_iolock and i_ilock during the read > and write paths. Add a set of wrapper functions to neatly > encapsulate the lock ordering and shared/exclusive semantics to make > the locking easier to follow and get right. > > Note that this changes some of the exclusive locking serialisation in > that serialisation will occur against the i_mutex instead of the > XFS_IOLOCK_EXCL. This does not change any behaviour, and it is > arguably more efficient to use the mutex for such serialisation than > the rw_sem. > > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_file.c | 136 ++++++++++++++++++++++++++----------------- > 1 files changed, 82 insertions(+), 54 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c > index c47d7dc0..941d7c2 100644 > --- a/fs/xfs/linux-2.6/xfs_file.c > +++ b/fs/xfs/linux-2.6/xfs_file.c > @@ -41,6 +41,40 @@ > static const struct vm_operations_struct xfs_file_vm_ops; > > /* > + * Locking primitives for read and write IO paths to ensure we consistently use > + * and order the inode->i_mutex, ip->i_lock and ip->i_iolock. > + */ > +static inline void > +xfs_rw_ilock( > + struct xfs_inode *ip, > + int type) > +{ > + if (type & XFS_IOLOCK_EXCL) > + mutex_lock(&VFS_I(ip)->i_mutex); > + xfs_ilock(ip, type); > +} > + > +static inline void > +xfs_rw_iunlock( > + struct xfs_inode *ip, > + int type) > +{ > + xfs_iunlock(ip, type); > + if (type & XFS_IOLOCK_EXCL) > + mutex_unlock(&VFS_I(ip)->i_mutex); > +} > + > +static inline void > +xfs_rw_ilock_demote( > + struct xfs_inode *ip, > + int type) > +{ > + xfs_ilock_demote(ip, type); > + if (type & XFS_IOLOCK_EXCL) > + mutex_unlock(&VFS_I(ip)->i_mutex); > +} > + > +/* > * xfs_iozero > * > * xfs_iozero clears the specified range of buffer supplied, > @@ -262,22 +296,21 @@ xfs_file_aio_read( > if (XFS_FORCED_SHUTDOWN(mp)) > return -EIO; > > - if (unlikely(ioflags & IO_ISDIRECT)) > - mutex_lock(&inode->i_mutex); > - xfs_ilock(ip, XFS_IOLOCK_SHARED); > - > if (unlikely(ioflags & IO_ISDIRECT)) { > + xfs_rw_ilock(ip, XFS_IOLOCK_EXCL); > + > if (inode->i_mapping->nrpages) { > ret = -xfs_flushinval_pages(ip, > (iocb->ki_pos & PAGE_CACHE_MASK), > -1, FI_REMAPF_LOCKED); > + if (ret) { > + xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); > + return ret; > + } > } > - mutex_unlock(&inode->i_mutex); > - if (ret) { > - xfs_iunlock(ip, XFS_IOLOCK_SHARED); > - return ret; > - } > - } > + xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); > + } else > + xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); > > trace_xfs_file_read(ip, size, iocb->ki_pos, ioflags); > > @@ -285,7 +318,7 @@ xfs_file_aio_read( > if (ret > 0) > XFS_STATS_ADD(xs_read_bytes, ret); > > - xfs_iunlock(ip, XFS_IOLOCK_SHARED); > + xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); > return ret; > } > > @@ -309,7 +342,7 @@ xfs_file_splice_read( > if (XFS_FORCED_SHUTDOWN(ip->i_mount)) > return -EIO; > > - xfs_ilock(ip, XFS_IOLOCK_SHARED); > + xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); > > trace_xfs_file_splice_read(ip, count, *ppos, ioflags); > > @@ -317,7 +350,7 @@ xfs_file_splice_read( > if (ret > 0) > XFS_STATS_ADD(xs_read_bytes, ret); > > - xfs_iunlock(ip, XFS_IOLOCK_SHARED); > + xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); > return ret; > } > > @@ -338,10 +371,10 @@ xfs_aio_write_isize_update( > *ppos = isize; > > if (*ppos > ip->i_size) { > - xfs_ilock(ip, XFS_ILOCK_EXCL); > + xfs_rw_ilock(ip, XFS_ILOCK_EXCL); > if (*ppos > ip->i_size) > ip->i_size = *ppos; > - xfs_iunlock(ip, XFS_ILOCK_EXCL); > + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); > } > } > > @@ -356,14 +389,22 @@ xfs_aio_write_newsize_update( > struct xfs_inode *ip) > { > if (ip->i_new_size) { > - xfs_ilock(ip, XFS_ILOCK_EXCL); > + xfs_rw_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_rw_iunlock(ip, XFS_ILOCK_EXCL); > } > } > > +/* > + * xfs_file_splice_write() does not use xfs_rw_ilock() because > + * generic_file_splice_write() takes the i_mutex itself. This, in theory, > + * couuld cause lock inversions between the aio_write path and the splice path > + * if someone is doing concurrent splice(2) based writes and write(2) based > + * writes to the same inode. The only real way to fix this is to re-implement > + * the generic code here with correct locking orders. > + */ > STATIC ssize_t > xfs_file_splice_write( > struct pipe_inode_info *pipe, > @@ -386,14 +427,13 @@ xfs_file_splice_write( > if (XFS_FORCED_SHUTDOWN(ip->i_mount)) > return -EIO; > > - xfs_ilock(ip, XFS_IOLOCK_EXCL); > + xfs_ilock(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL); > > new_size = *ppos + count; > > - xfs_ilock(ip, XFS_ILOCK_EXCL); > if (new_size > ip->i_size) > ip->i_new_size = new_size; > - xfs_iunlock(ip, XFS_ILOCK_EXCL); > + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); While using the xfs_rw_iunlock here actually is correct I think it's highly confusing, given that we didn't use it to take the ilock. What about just leaving all the code in xfs_file_splice_write as-is and not touching it at all? From BATV+6fbb206284491f7e0145+2697+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 11 11:36:33 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0BHaWdg103483 for ; Tue, 11 Jan 2011 11:36:33 -0600 X-ASG-Debug-ID: 1294767525-676c00f50000-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 0A3941D24D98 for ; Tue, 11 Jan 2011 09:38:45 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id KZ2LLCnNPnC30A9Q for ; Tue, 11 Jan 2011 09:38:45 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PciBB-0007Cg-HB; Tue, 11 Jan 2011 17:38:45 +0000 Date: Tue, 11 Jan 2011 12:38:45 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfstests: add simple splice test Subject: Re: [PATCH] xfstests: add simple splice test Message-ID: <20110111173845.GC24025@infradead.org> References: <1294702344-15035-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294702344-15035-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: 1294767526 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 > +echo "Feel the serenity." > + > +SRC=$TEST_DIR/$seq.src > +DST=$TEST_DIR/$seq.dst > + > +$XFS_IO_PROG -f -c "pwrite -S 0xa5a55a5a 0 32768k" -c fsync $SRC > /dev/null 2>&1 > +$XFS_IO_PROG -f -c "sendfile -i $SRC 0 32768k" -c fsync $DST > /dev/null 2>&1 > + > +diff $SRC $DST I think this should removfe the two files to make sure the test is reproducible and doesn't overwrite an existing file during the second run. Also I'd recomment not to redirect the output to /dev/null but use our normal xfs_io filters and make the output part of the golden output. From SRS0+sAg2+45+fromorbit.com=david@internode.on.net Tue Jan 11 14:48:35 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0BKmZKA111870 for ; Tue, 11 Jan 2011 14:48:35 -0600 X-ASG-Debug-ID: 1294779045-1f8a01170000-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 B4A621D255E3 for ; Tue, 11 Jan 2011 12:50:46 -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 lqBSyMaEFoynOQke for ; Tue, 11 Jan 2011 12:50:46 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52386498-1927428 for multiple; Wed, 12 Jan 2011 07:20:44 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PclAw-00007e-SZ; Wed, 12 Jan 2011 07:50:42 +1100 Date: Wed, 12 Jan 2011 07:50:42 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfstests: add simple splice test Subject: Re: [PATCH] xfstests: add simple splice test Message-ID: <20110111205042.GK28803@dastard> References: <1294702344-15035-1-git-send-email-david@fromorbit.com> <20110111173845.GC24025@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110111173845.GC24025@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: 1294779047 X-Barracuda-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.52099 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, Jan 11, 2011 at 12:38:45PM -0500, Christoph Hellwig wrote: > > +echo "Feel the serenity." > > + > > +SRC=$TEST_DIR/$seq.src > > +DST=$TEST_DIR/$seq.dst > > + > > +$XFS_IO_PROG -f -c "pwrite -S 0xa5a55a5a 0 32768k" -c fsync $SRC > /dev/null 2>&1 > > +$XFS_IO_PROG -f -c "sendfile -i $SRC 0 32768k" -c fsync $DST > /dev/null 2>&1 > > + > > +diff $SRC $DST > > I think this should removfe the two files to make sure the test is > reproducible and doesn't overwrite an existing file during the second > run. It removes them in the cleanup function. > Also I'd recomment not to redirect the output to /dev/null but use > our normal xfs_io filters and make the output part of the golden output. Ok. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+sAg2+45+fromorbit.com=david@internode.on.net Tue Jan 11 15:00:42 2011 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 p0BL0gbm112476 for ; Tue, 11 Jan 2011 15:00:42 -0600 X-ASG-Debug-ID: 1294779773-2020011b0000-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 1CC14255523 for ; Tue, 11 Jan 2011 13:02:53 -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 cNo3ZXWsYFwff1Nk for ; Tue, 11 Jan 2011 13:02:53 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52917537-1927428 for multiple; Wed, 12 Jan 2011 07:32:52 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PclMg-00009O-Kx; Wed, 12 Jan 2011 08:02:50 +1100 Date: Wed, 12 Jan 2011 08:02:50 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Subject: Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Message-ID: <20110111210250.GL28803@dastard> References: <1294702668-15216-1-git-send-email-david@fromorbit.com> <1294702668-15216-5-git-send-email-david@fromorbit.com> <20110111173627.GB24025@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110111173627.GB24025@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: 1294779775 X-Barracuda-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.52099 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, Jan 11, 2011 at 12:36:27PM -0500, Christoph Hellwig wrote: > On Tue, Jan 11, 2011 at 10:37:44AM +1100, Dave Chinner wrote: > > +/* > > + * xfs_file_splice_write() does not use xfs_rw_ilock() because > > + * generic_file_splice_write() takes the i_mutex itself. This, in theory, > > + * couuld cause lock inversions between the aio_write path and the splice path > > + * if someone is doing concurrent splice(2) based writes and write(2) based > > + * writes to the same inode. The only real way to fix this is to re-implement > > + * the generic code here with correct locking orders. > > + */ > > STATIC ssize_t > > xfs_file_splice_write( > > struct pipe_inode_info *pipe, > > @@ -386,14 +427,13 @@ xfs_file_splice_write( > > if (XFS_FORCED_SHUTDOWN(ip->i_mount)) > > return -EIO; > > > > - xfs_ilock(ip, XFS_IOLOCK_EXCL); > > + xfs_ilock(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL); > > > > new_size = *ppos + count; > > > > - xfs_ilock(ip, XFS_ILOCK_EXCL); > > if (new_size > ip->i_size) > > ip->i_new_size = new_size; > > - xfs_iunlock(ip, XFS_ILOCK_EXCL); > > + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); > > While using the xfs_rw_iunlock here actually is correct I think it's Argh! I thought I reverted all the changes to xfs_file_splice_write(). > highly confusing, given that we didn't use it to take the ilock. It definitely held the ilock around that size update before this series. ;) > What > about just leaving all the code in xfs_file_splice_write as-is and not > touching it at all? Updated version below. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: introduce xfs_rw_lock() helpers for locking the inode From: Dave Chinner We need to obtain the i_mutex, i_iolock and i_ilock during the read and write paths. Add a set of wrapper functions to neatly encapsulate the lock ordering and shared/exclusive semantics to make the locking easier to follow and get right. Note that this changes some of the exclusive locking serialisation in that serialisation will occur against the i_mutex instead of the XFS_IOLOCK_EXCL. This does not change any behaviour, and it is arguably more efficient to use the mutex for such serialisation than the rw_sem. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_file.c | 131 ++++++++++++++++++++++++++----------------- 1 files changed, 80 insertions(+), 51 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index c47d7dc0..b5e13fb 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -41,6 +41,40 @@ static const struct vm_operations_struct xfs_file_vm_ops; /* + * Locking primitives for read and write IO paths to ensure we consistently use + * and order the inode->i_mutex, ip->i_lock and ip->i_iolock. + */ +static inline void +xfs_rw_ilock( + struct xfs_inode *ip, + int type) +{ + if (type & XFS_IOLOCK_EXCL) + mutex_lock(&VFS_I(ip)->i_mutex); + xfs_ilock(ip, type); +} + +static inline void +xfs_rw_iunlock( + struct xfs_inode *ip, + int type) +{ + xfs_iunlock(ip, type); + if (type & XFS_IOLOCK_EXCL) + mutex_unlock(&VFS_I(ip)->i_mutex); +} + +static inline void +xfs_rw_ilock_demote( + struct xfs_inode *ip, + int type) +{ + xfs_ilock_demote(ip, type); + if (type & XFS_IOLOCK_EXCL) + mutex_unlock(&VFS_I(ip)->i_mutex); +} + +/* * xfs_iozero * * xfs_iozero clears the specified range of buffer supplied, @@ -262,22 +296,21 @@ xfs_file_aio_read( if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; - if (unlikely(ioflags & IO_ISDIRECT)) - mutex_lock(&inode->i_mutex); - xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (unlikely(ioflags & IO_ISDIRECT)) { + xfs_rw_ilock(ip, XFS_IOLOCK_EXCL); + if (inode->i_mapping->nrpages) { ret = -xfs_flushinval_pages(ip, (iocb->ki_pos & PAGE_CACHE_MASK), -1, FI_REMAPF_LOCKED); + if (ret) { + xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); + return ret; + } } - mutex_unlock(&inode->i_mutex); - if (ret) { - xfs_iunlock(ip, XFS_IOLOCK_SHARED); - return ret; - } - } + xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); + } else + xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); trace_xfs_file_read(ip, size, iocb->ki_pos, ioflags); @@ -285,7 +318,7 @@ xfs_file_aio_read( if (ret > 0) XFS_STATS_ADD(xs_read_bytes, ret); - xfs_iunlock(ip, XFS_IOLOCK_SHARED); + xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); return ret; } @@ -309,7 +342,7 @@ xfs_file_splice_read( if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return -EIO; - xfs_ilock(ip, XFS_IOLOCK_SHARED); + xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); trace_xfs_file_splice_read(ip, count, *ppos, ioflags); @@ -317,7 +350,7 @@ xfs_file_splice_read( if (ret > 0) XFS_STATS_ADD(xs_read_bytes, ret); - xfs_iunlock(ip, XFS_IOLOCK_SHARED); + xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); return ret; } @@ -338,10 +371,10 @@ xfs_aio_write_isize_update( *ppos = isize; if (*ppos > ip->i_size) { - xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_rw_ilock(ip, XFS_ILOCK_EXCL); if (*ppos > ip->i_size) ip->i_size = *ppos; - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); } } @@ -356,14 +389,22 @@ xfs_aio_write_newsize_update( struct xfs_inode *ip) { if (ip->i_new_size) { - xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_rw_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_rw_iunlock(ip, XFS_ILOCK_EXCL); } } +/* + * xfs_file_splice_write() does not use xfs_rw_ilock() because + * generic_file_splice_write() takes the i_mutex itself. This, in theory, + * couuld cause lock inversions between the aio_write path and the splice path + * if someone is doing concurrent splice(2) based writes and write(2) based + * writes to the same inode. The only real way to fix this is to re-implement + * the generic code here with correct locking orders. + */ STATIC ssize_t xfs_file_splice_write( struct pipe_inode_info *pipe, @@ -604,7 +645,6 @@ xfs_file_aio_write( xfs_fsize_t new_size; int iolock; size_t ocount = 0, count; - int need_i_mutex; XFS_STATS_INC(xs_write_calls); @@ -631,21 +671,17 @@ xfs_file_aio_write( 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); } - xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); - start: + xfs_rw_ilock(ip, XFS_ILOCK_EXCL|iolock); ret = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); if (ret) { - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); - goto out_unlock_mutex; + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); + return ret; } if (ioflags & IO_ISDIRECT) { @@ -654,16 +690,20 @@ start: mp->m_rtdev_targp : mp->m_ddev_targp; if ((pos & target->bt_smask) || (count & target->bt_smask)) { - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); + xfs_rw_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); + /* + * For direct I/O, if there are cached pages or we're extending + * the file, we need IOLOCK_EXCL until we're sure the bytes at + * the new EOF have been zeroed and/or the cached pages are + * flushed out. Upgrade the I/O lock and start again. + */ + if (iolock != XFS_IOLOCK_EXCL && + (mapping->nrpages || pos > ip->i_size)) { + xfs_rw_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; } } @@ -687,11 +727,11 @@ start: if (pos > ip->i_size) { ret = -xfs_zero_eof(ip, pos, ip->i_size); if (ret) { - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); goto out_unlock_internal; } } - xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); /* * If we're writing the file then make sure to clear the @@ -708,7 +748,7 @@ start: if ((ioflags & IO_ISDIRECT)) { if (mapping->nrpages) { - WARN_ON(need_i_mutex == 0); + WARN_ON(iolock != XFS_IOLOCK_EXCL); ret = -xfs_flushinval_pages(ip, (pos & PAGE_CACHE_MASK), -1, FI_REMAPF_LOCKED); @@ -716,13 +756,10 @@ start: goto out_unlock_internal; } - if (need_i_mutex) { + if (iolock == XFS_IOLOCK_EXCL) { /* demote the lock now the cached pages are gone */ - xfs_ilock_demote(ip, XFS_IOLOCK_EXCL); - mutex_unlock(&inode->i_mutex); - + xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); iolock = XFS_IOLOCK_SHARED; - need_i_mutex = 0; } trace_xfs_file_direct_write(ip, count, iocb->ki_pos, ioflags); @@ -740,7 +777,7 @@ start: count -= ret; ioflags &= ~IO_ISDIRECT; - xfs_iunlock(ip, iolock); + xfs_rw_iunlock(ip, iolock); goto relock; } } else { @@ -775,14 +812,9 @@ write_retry: loff_t end = pos + ret - 1; int error, error2; - xfs_iunlock(ip, iolock); - if (need_i_mutex) - mutex_unlock(&inode->i_mutex); - + xfs_rw_iunlock(ip, iolock); error = filemap_write_and_wait_range(mapping, pos, end); - if (need_i_mutex) - mutex_lock(&inode->i_mutex); - xfs_ilock(ip, iolock); + xfs_rw_ilock(ip, iolock); error2 = -xfs_file_fsync(file, (file->f_flags & __O_SYNC) ? 0 : 1); @@ -794,10 +826,7 @@ write_retry: out_unlock_internal: xfs_aio_write_newsize_update(ip); - xfs_iunlock(ip, iolock); - out_unlock_mutex: - if (need_i_mutex) - mutex_unlock(&inode->i_mutex); + xfs_rw_iunlock(ip, iolock); return ret; } From BATV+6fbb206284491f7e0145+2697+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 11 15:01:53 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0BL1pg4112536 for ; Tue, 11 Jan 2011 15:01:53 -0600 X-ASG-Debug-ID: 1294779844-2b6b02c00000-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 D71C4153E0EE for ; Tue, 11 Jan 2011 13:04:04 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id JOtzYxnoyDxID75C for ; Tue, 11 Jan 2011 13:04:04 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PclNm-000127-Ta; Tue, 11 Jan 2011 21:03:58 +0000 Date: Tue, 11 Jan 2011 16:03:58 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Subject: Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode Message-ID: <20110111210358.GA3872@infradead.org> References: <1294702668-15216-1-git-send-email-david@fromorbit.com> <1294702668-15216-5-git-send-email-david@fromorbit.com> <20110111173627.GB24025@infradead.org> <20110111210250.GL28803@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110111210250.GL28803@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: 1294779844 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 leg@google.com Tue Jan 11 15:11:34 2011 X-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, 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 p0BLBXHI112985 for ; Tue, 11 Jan 2011 15:11:33 -0600 X-ASG-Debug-ID: 1294780425-2bdb02e00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp-out.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4DF89FDC6E3 for ; Tue, 11 Jan 2011 13:13:45 -0800 (PST) Received: from smtp-out.google.com (smtp-out.google.com [216.239.44.51]) by cuda.sgi.com with ESMTP id 08cS8NDnZYqTTqOf for ; Tue, 11 Jan 2011 13:13:45 -0800 (PST) Received: from wpaz24.hot.corp.google.com (wpaz24.hot.corp.google.com [172.24.198.88]) by smtp-out.google.com with ESMTP id p0BLDild018055 for ; Tue, 11 Jan 2011 13:13:44 -0800 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta; t=1294780424; bh=+PGLfYmGYm2n8Mu18mLMNGNxQs0=; h=MIME-Version:In-Reply-To:References:Date:Message-ID:Subject:From: To:Cc:Content-Type:Content-Transfer-Encoding; b=gFogpmcK1VzSqNoXPE8S3C4m1G6OjUngufBZtZcCGN9Gwv4ygAYaKsIZPDgEYHuNL 1iSoCH3TZggOuGsLQOB4A== Received: from qyk10 (qyk10.prod.google.com [10.241.83.138]) by wpaz24.hot.corp.google.com with ESMTP id p0BLBuPb022800 (version=TLSv1/SSLv3 cipher=RC4-MD5 bits=128 verify=NOT) for ; Tue, 11 Jan 2011 13:13:43 -0800 Received: by qyk10 with SMTP id 10so3044167qyk.1 for ; Tue, 11 Jan 2011 13:13:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=beta; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=ccjFxex9Uz0aOishYrYcXdZ7+geEtyiqm5Xs9UquBJE=; b=uvLufrAEd6WstG5c4sXcpEvNxoEAzqkSBuTxupXe/VNN6icZfW44vktvHUIebMtGw4 RPVlogLGftEa+KUjOWgQ== DomainKey-Signature: a=rsa-sha1; c=nofws; d=google.com; s=beta; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=Bs7+u7VQVJWuODo3TugeIYwbDoun5Eq3/ozikVmRb2C/th7CBHY5FoWevBmxpLBS7T 3tHEdtPwpqB/bWPqVpPg== MIME-Version: 1.0 Received: by 10.229.182.67 with SMTP id cb3mr108461qcb.48.1294780422814; Tue, 11 Jan 2011 13:13:42 -0800 (PST) Received: by 10.229.111.204 with HTTP; Tue, 11 Jan 2011 13:13:42 -0800 (PST) In-Reply-To: <20101109234049.GQ2715@dastard> References: <1289248327-16308-1-git-send-email-josef@redhat.com> <20101109011222.GD2715@dastard> <20101109033038.GF3099@thunk.org> <20101109044242.GH2715@dastard> <20101109214147.GK3099@thunk.org> <20101109234049.GQ2715@dastard> Date: Tue, 11 Jan 2011 16:13:42 -0500 Message-ID: X-ASG-Orig-Subj: Re: [PATCH 1/6] fs: add hole punching to fallocate Subject: Re: [PATCH 1/6] fs: add hole punching to fallocate From: Lawrence Greenfield To: Dave Chinner Cc: "Ted Ts'o" , Josef Bacik , linux-kernel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, joel.becker@oracle.com, cmm@us.ibm.com, cluster-devel@redhat.com Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-System-Of-Record: true X-Barracuda-Connect: smtp-out.google.com[216.239.44.51] X-Barracuda-Start-Time: 1294780426 X-Barracuda-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, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.52100 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 BSF_SC5_SA210e Custom Rule SA210e 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 9, 2010 at 6:40 PM, Dave Chinner wrote: > On Tue, Nov 09, 2010 at 04:41:47PM -0500, Ted Ts'o wrote: >> On Tue, Nov 09, 2010 at 03:42:42PM +1100, Dave Chinner wrote: >> > Implementation is up to the filesystem. However, XFS does (b) >> > because: >> > >> > =C2=A0 =C2=A0 1) it was extremely simple to implement (one of the >> > =C2=A0 =C2=A0 =C2=A0 =C2=A0advantages of having an exceedingly complex= allocation >> > =C2=A0 =C2=A0 =C2=A0 =C2=A0interface to begin with :P) >> > =C2=A0 =C2=A0 2) conversion is atomic, fast and reliable >> > =C2=A0 =C2=A0 3) it is independent of the underlying storage; and >> > =C2=A0 =C2=A0 4) reads of unwritten extents operate at memory speed, >> > =C2=A0 =C2=A0 =C2=A0 =C2=A0not disk speed. >> >> Yeah, I was thinking that using a device-style TRIM might be better >> since future attempts to write to it won't require a separate seek to >> modify the extent tree. =C2=A0But yeah, there are a bunch of advantages = of >> simply mutating the extent tree. >> >> While we're on the subject of changes to fallocate, what do people >> think of FALLOC_FL_EXPOSE_OLD_DATA, which requires either root >> privileges or (if capabilities are in use) CAP_DAC_OVERRIDE && >> CAP_MAC_OVERRIDE && CAP_SYS_ADMIN. =C2=A0This would allow a trusted proc= ess >> to fallocate blocks with the extent already marked initialized. =C2=A0I'= ve >> had two requests for such functionality for ext4 already. > > We removed that ability from XFS about three years ago because it's > a massive security hole. e.g. what happens if the file is world > readable, even though the process that called > FALLOC_FL_EXPOSE_OLD_DATA was privileged and was allowed to expose > such data? Or the file is chmod 777 after being exposed? > > The historical reason for such behaviour existing in XFS was that in > 1997 the CPU and IO latency cost of unwritten extent conversion was > significant, so users with real physical security (i.e. marines with > guns) were able to make use of fast preallocation with no conversion > overhead without caring about the security implications. These days, > the performance overhead of unwritten extent conversion is minimal - > I generally can't measure a difference in IO performance as a result > of it - so there is simply no good rea=D1=95on for leaving such a gaping > security hole in the system. > > If anyone wants to read the underlying data, then use fiemap to map > the physical blocks and read it directly from the block device. That > requires root privileges but does not open any new stale data > exposure problems.... > >> (Take for example a trusted cluster filesystem backend that checks the >> object checksum before returning any data to the user; and if the >> check fails the cluster file system will try to use some other replica >> stored on some other server.) > > IOWs, all they want to do is avoid the unwritten extent conversion > overhead. Time has shown that a bad security/performance tradeoff > decision was made 13 years ago in XFS, so I see little reason to > repeat it for ext4 today.... I'd make use of FALLOC_FL_EXPOSE_OLD_DATA. It's not the CPU overhead of extent conversion. It's that extent conversion causes more metadata operations than what you'd have otherwise, which means systems that want to use O_DIRECT and make sure the data doesn't go away either have to write O_DIRECT|O_DSYNC or need to call fdatasync(). cluster file system implementor, Larry > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at =C2=A0http://vger.kernel.org/majordomo-info.html > From tytso@thunk.org Tue Jan 11 15:28:07 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0BLS66L113890 for ; Tue, 11 Jan 2011 15:28:07 -0600 X-ASG-Debug-ID: 1294781419-3972027d0000-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 ABDA4FDCAB8 for ; Tue, 11 Jan 2011 13:30:19 -0800 (PST) Received: from thunker.thunk.org (THUNK.ORG [69.25.196.29]) by cuda.sgi.com with ESMTP id UPlB5xhSnn6Kfq7Y for ; Tue, 11 Jan 2011 13:30:19 -0800 (PST) Received: from root (helo=tytso-glaptop) by thunker.thunk.org with local-esmtp (Exim 4.50 #1 (Debian)) id 1Pcln8-0005el-3r; Tue, 11 Jan 2011 16:30:10 -0500 Received: from tytso by tytso-glaptop with local (Exim 4.71) (envelope-from ) id 1Pcln6-00030B-80; Tue, 11 Jan 2011 16:30:08 -0500 Date: Tue, 11 Jan 2011 16:30:07 -0500 From: "Ted Ts'o" To: Lawrence Greenfield Cc: Dave Chinner , Josef Bacik , linux-kernel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, joel.becker@oracle.com, cmm@us.ibm.com, cluster-devel@redhat.com X-ASG-Orig-Subj: Re: [PATCH 1/6] fs: add hole punching to fallocate Subject: Re: [PATCH 1/6] fs: add hole punching to fallocate Message-ID: <20110111213007.GF2917@thunk.org> Mail-Followup-To: Ted Ts'o , Lawrence Greenfield , Dave Chinner , Josef Bacik , linux-kernel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, joel.becker@oracle.com, cmm@us.ibm.com, cluster-devel@redhat.com References: <1289248327-16308-1-git-send-email-josef@redhat.com> <20101109011222.GD2715@dastard> <20101109033038.GF3099@thunk.org> <20101109044242.GH2715@dastard> <20101109214147.GK3099@thunk.org> <20101109234049.GQ2715@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-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: 1294781419 X-Barracuda-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.52100 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, Jan 11, 2011 at 04:13:42PM -0500, Lawrence Greenfield wrote: > > IOWs, all they want to do is avoid the unwritten extent conversion > > overhead. Time has shown that a bad security/performance tradeoff > > decision was made 13 years ago in XFS, so I see little reason to > > repeat it for ext4 today.... I suspect things may have changed somewhat; both in terms of requirements and nature of cluter file systems, and the performance of various storage systems (including PCIe-attached flash devices). > I'd make use of FALLOC_FL_EXPOSE_OLD_DATA. It's not the CPU overhead > of extent conversion. It's that extent conversion causes more metadata > operations than what you'd have otherwise, which means systems that > want to use O_DIRECT and make sure the data doesn't go away either > have to write O_DIRECT|O_DSYNC or need to call fdatasync(). > > cluster file system implementor, One possibility might be to make it an optional feature which is only enabled via a mount option. That way someone would have to explicit ask for this feature two ways (via a new flag to fallocate) and a mount option. It might not make sense for XFS, but for people who are using ext4 as the local storage file system back-end, and are doing all sorts of things to get the best performance, including disabling the journal, I suspect it really would make sense. So it could always be an optional-to-implement flag, that not all file systems should feel obliged to implement. - Ted From aelder@sgi.com Tue Jan 11 15:34:35 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0BLYZre114218 for ; Tue, 11 Jan 2011 15:34:35 -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 194C48F8071; Tue, 11 Jan 2011 13:36:45 -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); Tue, 11 Jan 2011 15:36:03 -0600 Subject: Re: [PATCH 4/8] xfs: introduce xfs_rw_lock() helpers for locking the inode From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com In-Reply-To: <20110111210250.GL28803@dastard> References: <1294702668-15216-1-git-send-email-david@fromorbit.com> <1294702668-15216-5-git-send-email-david@fromorbit.com> <20110111173627.GB24025@infradead.org> <20110111210250.GL28803@dastard> Content-Type: text/plain; charset="UTF-8" Date: Tue, 11 Jan 2011 15:36:03 -0600 Message-ID: <1294781763.3115.9.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 11 Jan 2011 21:36:03.0827 (UTC) FILETIME=[8C309430:01CBB1D7] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2011-01-12 at 08:02 +1100, Dave Chinner wrote: > On Tue, Jan 11, 2011 at 12:36:27PM -0500, Christoph Hellwig wrote: > > On Tue, Jan 11, 2011 at 10:37:44AM +1100, Dave Chinner wrote: > > > +/* > > > + * xfs_file_splice_write() does not use xfs_rw_ilock() because > > > + * generic_file_splice_write() takes the i_mutex itself. This, in theory, . . . > > > + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL); > > > > While using the xfs_rw_iunlock here actually is correct I think it's > > Argh! I thought I reverted all the changes to > xfs_file_splice_write(). > > > highly confusing, given that we didn't use it to take the ilock. > > It definitely held the ilock around that size update before this > series. ;) > > > What > > about just leaving all the code in xfs_file_splice_write as-is and not > > touching it at all? > > Updated version below. Your explanation before and this update addressed all my substantive issues. I have one other thing (which is essentially a style issue), which I'll still mention below, but I think your next patch may make it moot anyway... In any case: Reviewed-by: Alex Elder . . . > @@ -654,16 +690,20 @@ start: > mp->m_rtdev_targp : mp->m_ddev_targp; > > if ((pos & target->bt_smask) || (count & target->bt_smask)) { > - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); > + xfs_rw_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); > + /* > + * For direct I/O, if there are cached pages or we're extending > + * the file, we need IOLOCK_EXCL until we're sure the bytes at > + * the new EOF have been zeroed and/or the cached pages are > + * flushed out. Upgrade the I/O lock and start again. > + */ > + if (iolock != XFS_IOLOCK_EXCL && I would prefer: if (iolock == XFS_IOLOCK_SHARED) > + (mapping->nrpages || pos > ip->i_size)) { > + xfs_rw_iunlock(ip, XFS_ILOCK_EXCL|iolock); and (maybe) this could be XFS_ILOCK_EXCL|XFS_IOLOCK_SHARED); > iolock = XFS_IOLOCK_EXCL; > - need_i_mutex = 1; > - mutex_lock(&inode->i_mutex); > - xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); > goto start; > } > } . . . From aelder@sgi.com Tue Jan 11 15:42:35 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0BLgYMm114666 for ; Tue, 11 Jan 2011 15:42:34 -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 F0318AC001; Tue, 11 Jan 2011 13:44:44 -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); Tue, 11 Jan 2011 15:44:14 -0600 Subject: Re: [PATCH 5/8] xfs: split direct IO write path from xfs_file_aio_write From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294702668-15216-6-git-send-email-david@fromorbit.com> References: <1294702668-15216-1-git-send-email-david@fromorbit.com> <1294702668-15216-6-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 11 Jan 2011 15:44:14 -0600 Message-ID: <1294782254.3115.11.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 11 Jan 2011 21:44:14.0646 (UTC) FILETIME=[B0BD9D60:01CBB1D8] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-11 at 10:37 +1100, Dave Chinner wrote: > 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. > > This also removes the failed direct IO fallback path to buffered IO. > XFS handles all direct IO cases without needing to fall back to > buffered IO, so we can safely remove this unused path. This greatly > simplifies the logic and locking needed in the write path. I reviewed this before, and your statement here now explains the important change you made about the dead code for falling back to buffered I/O. So: Reviewed-by: Alex Elder I think Christoph and I have signed off on all eight of the patches in this series now. -Alex > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig > --- From SRS0+mr6w+46+fromorbit.com=dave@internode.on.net Tue Jan 11 18:34:09 2011 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_21, 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 p0C0Y8ea123998 for ; Tue, 11 Jan 2011 18:34:09 -0600 X-ASG-Debug-ID: 1294792577-457102250000-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 1987F1D2641A for ; Tue, 11 Jan 2011 16:36:18 -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 UMgQTqhUWuHB2IX5 for ; Tue, 11 Jan 2011 16:36:18 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52533577-1927428 for ; Wed, 12 Jan 2011 11:06:16 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcohC-0000UT-6A for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:36:14 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pcogu-0002G9-NR for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:35:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 04/12] xfs: Convert xlog_warn to new logging interface Subject: [PATCH 04/12] xfs: Convert xlog_warn to new logging interface Date: Wed, 12 Jan 2011 11:35:45 +1100 Message-Id: <1294792553-8378-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294792553-8378-1-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1294792580 X-Barracuda-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.52113 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 xfs log operations to use the new error logging interfaces. This removes the xlog_{warn,panic} wrappers and makes almost all errors emit the device they belong to instead of just refering to "XFS". Signed-off-by: Dave Chinner --- fs/xfs/quota/xfs_dquot.c | 10 ++- fs/xfs/quota/xfs_qm.c | 2 +- fs/xfs/xfs_log.c | 124 ++++++++++++------------- fs/xfs/xfs_log_priv.h | 4 - fs/xfs/xfs_log_recover.c | 223 ++++++++++++++++++++++----------------------- fs/xfs/xfs_quota.h | 3 +- 6 files changed, 177 insertions(+), 189 deletions(-) diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index d22aa31..773adc8 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c @@ -544,9 +544,10 @@ xfs_qm_dqtobp( /* * A simple sanity check in case we got a corrupted dquot... */ - if (xfs_qm_dqcheck(ddq, id, dqp->dq_flags & XFS_DQ_ALLTYPES, + error = xfs_qm_dqcheck(mp, ddq, id, dqp->dq_flags & XFS_DQ_ALLTYPES, flags & (XFS_QMOPT_DQREPAIR|XFS_QMOPT_DOWARN), - "dqtobp")) { + "dqtobp"); + if (error) { if (!(flags & XFS_QMOPT_DQREPAIR)) { xfs_trans_brelse(tp, bp); return XFS_ERROR(EIO); @@ -1207,8 +1208,9 @@ xfs_qm_dqflush( /* * A simple sanity check in case we got a corrupted dquot.. */ - if (xfs_qm_dqcheck(&dqp->q_core, be32_to_cpu(ddqp->d_id), 0, - XFS_QMOPT_DOWARN, "dqflush (incore copy)")) { + error = xfs_qm_dqcheck(mp, &dqp->q_core, be32_to_cpu(ddqp->d_id), 0, + XFS_QMOPT_DOWARN, "dqflush (incore copy)"); + if (error) { xfs_buf_relse(bp); xfs_dqfunlock(dqp); xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index f8e854b..d87c4a3 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -1299,7 +1299,7 @@ xfs_qm_reset_dqcounts( * output any warnings because it's perfectly possible to * find uninitialised dquot blks. See comment in xfs_qm_dqcheck. */ - (void) xfs_qm_dqcheck(ddq, id+j, type, XFS_QMOPT_DQREPAIR, + (void) xfs_qm_dqcheck(mp, ddq, id+j, type, XFS_QMOPT_DQREPAIR, "xfs_quotacheck"); ddq->d_bcount = 0; ddq->d_icount = 0; diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index ae6fef1..d645f09 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -374,11 +374,10 @@ xfs_log_mount( int error; if (!(mp->m_flags & XFS_MOUNT_NORECOVERY)) - cmn_err(CE_NOTE, "XFS mounting filesystem %s", mp->m_fsname); + xfs_notice(mp, "Mounting Filesystem"); else { - cmn_err(CE_NOTE, - "Mounting filesystem \"%s\" in no-recovery mode. Filesystem will be inconsistent.", - mp->m_fsname); + xfs_notice(mp, +"Mounting filesystem in no-recovery mode. Filesystem will be inconsistent."); ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); } @@ -393,7 +392,7 @@ xfs_log_mount( */ error = xfs_trans_ail_init(mp); if (error) { - cmn_err(CE_WARN, "XFS: AIL initialisation failed: error %d", error); + xfs_warn(mp, "AIL initialisation failed: error %d", error); goto out_free_log; } mp->m_log->l_ailp = mp->m_ail; @@ -413,7 +412,8 @@ xfs_log_mount( if (readonly) mp->m_flags |= XFS_MOUNT_RDONLY; if (error) { - cmn_err(CE_WARN, "XFS: log mount/recovery failed: error %d", error); + xfs_warn(mp, "log mount/recovery failed: error %d", + error); goto out_destroy_ail; } } @@ -542,10 +542,8 @@ xfs_log_unmount_write(xfs_mount_t *mp) */ } - if (error) { - xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_log_unmount: unmount record failed"); - } + if (error) + xfs_alert(mp, "%s: unmount record failed", __func__); spin_lock(&log->l_icloglock); @@ -852,7 +850,7 @@ xlog_space_left( * In this case we just want to return the size of the * log as the amount of space left. */ - xfs_fs_cmn_err(CE_ALERT, log->l_mp, + xfs_alert(log->l_mp, "xlog_space_left: head behind tail\n" " tail_cycle = %d, tail_bytes = %d\n" " GH cycle = %d, GH bytes = %d", @@ -1001,7 +999,7 @@ xlog_alloc_log(xfs_mount_t *mp, log = kmem_zalloc(sizeof(xlog_t), KM_MAYFAIL); if (!log) { - xlog_warn("XFS: Log allocation failed: No memory!"); + xfs_warn(mp, "Log allocation failed: No memory!"); goto out; } @@ -1029,24 +1027,24 @@ xlog_alloc_log(xfs_mount_t *mp, if (xfs_sb_version_hassector(&mp->m_sb)) { log2_size = mp->m_sb.sb_logsectlog; if (log2_size < BBSHIFT) { - xlog_warn("XFS: Log sector size too small " - "(0x%x < 0x%x)", log2_size, BBSHIFT); + xfs_warn(mp, "Log sector size too small (0x%x < 0x%x)", + log2_size, BBSHIFT); goto out_free_log; } log2_size -= BBSHIFT; if (log2_size > mp->m_sectbb_log) { - xlog_warn("XFS: Log sector size too large " - "(0x%x > 0x%x)", log2_size, mp->m_sectbb_log); + xfs_warn(mp, "Log sector size too large (0x%x > 0x%x)", + log2_size, mp->m_sectbb_log); goto out_free_log; } /* for larger sector sizes, must have v2 or external log */ if (log2_size && log->l_logBBstart > 0 && !xfs_sb_version_haslogv2(&mp->m_sb)) { - - xlog_warn("XFS: log sector size (0x%x) invalid " - "for configuration.", log2_size); + xfs_warn(mp, + "log sector size (0x%x) invalid for configuration.", + log2_size); goto out_free_log; } } @@ -1563,38 +1561,36 @@ xlog_print_tic_res( "SWAPEXT" }; - xfs_fs_cmn_err(CE_WARN, mp, - "xfs_log_write: reservation summary:\n" - " trans type = %s (%u)\n" - " unit res = %d bytes\n" - " current res = %d bytes\n" - " total reg = %u bytes (o/flow = %u bytes)\n" - " ophdrs = %u (ophdr space = %u bytes)\n" - " ophdr + reg = %u bytes\n" - " num regions = %u\n", - ((ticket->t_trans_type <= 0 || - ticket->t_trans_type > XFS_TRANS_TYPE_MAX) ? - "bad-trans-type" : trans_type_str[ticket->t_trans_type-1]), - ticket->t_trans_type, - ticket->t_unit_res, - ticket->t_curr_res, - ticket->t_res_arr_sum, ticket->t_res_o_flow, - ticket->t_res_num_ophdrs, ophdr_spc, - ticket->t_res_arr_sum + - ticket->t_res_o_flow + ophdr_spc, - ticket->t_res_num); + xfs_alert(mp, + "xfs_log_write: reservation summary:\n" + " trans type = %s (%u)\n" + " unit res = %d bytes\n" + " current res = %d bytes\n" + " total reg = %u bytes (o/flow = %u bytes)\n" + " ophdrs = %u (ophdr space = %u bytes)\n" + " ophdr + reg = %u bytes\n" + " num regions = %u\n", + ((ticket->t_trans_type <= 0 || + ticket->t_trans_type > XFS_TRANS_TYPE_MAX) ? + "bad-trans-type" : trans_type_str[ticket->t_trans_type-1]), + ticket->t_trans_type, + ticket->t_unit_res, + ticket->t_curr_res, + ticket->t_res_arr_sum, ticket->t_res_o_flow, + ticket->t_res_num_ophdrs, ophdr_spc, + ticket->t_res_arr_sum + + ticket->t_res_o_flow + ophdr_spc, + ticket->t_res_num); for (i = 0; i < ticket->t_res_num; i++) { - uint r_type = ticket->t_res_arr[i].r_type; - cmn_err(CE_WARN, - "region[%u]: %s - %u bytes\n", - i, + uint r_type = ticket->t_res_arr[i].r_type; + xfs_warn(mp, "region[%u]: %s - %u bytes\n", i, ((r_type <= 0 || r_type > XLOG_REG_TYPE_MAX) ? "bad-rtype" : res_type_str[r_type-1]), ticket->t_res_arr[i].r_len); } - xfs_cmn_err(XFS_PTAG_LOGRES, CE_ALERT, mp, + xfs_alert_tag(mp, XFS_PTAG_LOGRES, "xfs_log_write: reservation ran out. Need to up reservation"); xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); } @@ -1682,7 +1678,7 @@ xlog_write_setup_ophdr( case XFS_LOG: break; default: - xfs_fs_cmn_err(CE_WARN, log->l_mp, + xfs_warn(log->l_mp, "Bad XFS transaction clientid 0x%x in ticket 0x%p", ophdr->oh_clientid, ticket); return NULL; @@ -2264,7 +2260,7 @@ xlog_state_do_callback( if (repeats > 5000) { flushcnt += repeats; repeats = 0; - xfs_fs_cmn_err(CE_WARN, log->l_mp, + xfs_warn(log->l_mp, "%s: possible infinite loop (%d iterations)", __func__, flushcnt); } @@ -3052,10 +3048,8 @@ xfs_log_force( int error; error = _xfs_log_force(mp, flags, NULL); - if (error) { - xfs_fs_cmn_err(CE_WARN, mp, "xfs_log_force: " - "error %d returned.", error); - } + if (error) + xfs_warn(mp, "%s: error %d returned.", __func__, error); } /* @@ -3204,10 +3198,8 @@ xfs_log_force_lsn( int error; error = _xfs_log_force_lsn(mp, lsn, flags, NULL); - if (error) { - xfs_fs_cmn_err(CE_WARN, mp, "xfs_log_force: " - "error %d returned.", error); - } + if (error) + xfs_warn(mp, "%s: error %d returned.", __func__, error); } /* @@ -3412,7 +3404,7 @@ xlog_verify_dest_ptr( } if (!good_ptr) - xlog_panic("xlog_verify_dest_ptr: invalid ptr"); + xfs_emerg(log->l_mp, "%s: invalid ptr", __func__); } STATIC void @@ -3448,16 +3440,16 @@ xlog_verify_tail_lsn(xlog_t *log, blocks = log->l_logBBsize - (log->l_prev_block - BLOCK_LSN(tail_lsn)); if (blocks < BTOBB(iclog->ic_offset)+BTOBB(log->l_iclog_hsize)) - xlog_panic("xlog_verify_tail_lsn: ran out of log space"); + xfs_emerg(log->l_mp, "%s: ran out of log space", __func__); } else { ASSERT(CYCLE_LSN(tail_lsn)+1 == log->l_prev_cycle); if (BLOCK_LSN(tail_lsn) == log->l_prev_block) - xlog_panic("xlog_verify_tail_lsn: tail wrapped"); + xfs_emerg(log->l_mp, "%s: tail wrapped", __func__); blocks = BLOCK_LSN(tail_lsn) - log->l_prev_block; if (blocks < BTOBB(iclog->ic_offset) + 1) - xlog_panic("xlog_verify_tail_lsn: ran out of log space"); + xfs_emerg(log->l_mp, "%s: ran out of log space", __func__); } } /* xlog_verify_tail_lsn */ @@ -3497,22 +3489,23 @@ xlog_verify_iclog(xlog_t *log, icptr = log->l_iclog; for (i=0; i < log->l_iclog_bufs; i++) { if (icptr == NULL) - xlog_panic("xlog_verify_iclog: invalid ptr"); + xfs_emerg(log->l_mp, "%s: invalid ptr", __func__); icptr = icptr->ic_next; } if (icptr != log->l_iclog) - xlog_panic("xlog_verify_iclog: corrupt iclog ring"); + xfs_emerg(log->l_mp, "%s: corrupt iclog ring", __func__); spin_unlock(&log->l_icloglock); /* check log magic numbers */ if (be32_to_cpu(iclog->ic_header.h_magicno) != XLOG_HEADER_MAGIC_NUM) - xlog_panic("xlog_verify_iclog: invalid magic num"); + xfs_emerg(log->l_mp, "%s: invalid magic num", __func__); ptr = (xfs_caddr_t) &iclog->ic_header; for (ptr += BBSIZE; ptr < ((xfs_caddr_t)&iclog->ic_header) + count; ptr += BBSIZE) { if (be32_to_cpu(*(__be32 *)ptr) == XLOG_HEADER_MAGIC_NUM) - xlog_panic("xlog_verify_iclog: unexpected magic num"); + xfs_emerg(log->l_mp, "%s: unexpected magic num", + __func__); } /* check fields */ @@ -3542,9 +3535,10 @@ xlog_verify_iclog(xlog_t *log, } } if (clientid != XFS_TRANSACTION && clientid != XFS_LOG) - cmn_err(CE_WARN, "xlog_verify_iclog: " - "invalid clientid %d op 0x%p offset 0x%lx", - clientid, ophead, (unsigned long)field_offset); + xfs_warn(log->l_mp, + "%s: invalid clientid %d op 0x%p offset 0x%lx", + __func__, clientid, ophead, + (unsigned long)field_offset); /* check length */ field_offset = (__psint_t) diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index d5f8be8..15dbf1f 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -87,10 +87,6 @@ static inline uint xlog_get_client_id(__be32 i) return be32_to_cpu(i) >> 24; } -#define xlog_panic(args...) cmn_err(CE_PANIC, ## args) -#define xlog_exit(args...) cmn_err(CE_PANIC, ## args) -#define xlog_warn(args...) cmn_err(CE_WARN, ## args) - /* * In core log state */ diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index aa0ebb7..0c4a561 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -92,7 +92,7 @@ xlog_get_bp( int nbblks) { if (!xlog_buf_bbcount_valid(log, nbblks)) { - xlog_warn("XFS: Invalid block length (0x%x) given for buffer", + xfs_warn(log->l_mp, "Invalid block length (0x%x) for buffer", nbblks); XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_HIGH, log->l_mp); return NULL; @@ -160,7 +160,7 @@ xlog_bread_noalign( int error; if (!xlog_buf_bbcount_valid(log, nbblks)) { - xlog_warn("XFS: Invalid block length (0x%x) given for buffer", + xfs_warn(log->l_mp, "Invalid block length (0x%x) for buffer", nbblks); XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_HIGH, log->l_mp); return EFSCORRUPTED; @@ -219,7 +219,7 @@ xlog_bwrite( int error; if (!xlog_buf_bbcount_valid(log, nbblks)) { - xlog_warn("XFS: Invalid block length (0x%x) given for buffer", + xfs_warn(log->l_mp, "Invalid block length (0x%x) for buffer", nbblks); XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_HIGH, log->l_mp); return EFSCORRUPTED; @@ -254,9 +254,9 @@ xlog_header_check_dump( xfs_mount_t *mp, xlog_rec_header_t *head) { - cmn_err(CE_DEBUG, "%s: SB : uuid = %pU, fmt = %d\n", + xfs_debug(mp, "%s: SB : uuid = %pU, fmt = %d\n", __func__, &mp->m_sb.sb_uuid, XLOG_FMT); - cmn_err(CE_DEBUG, " log : uuid = %pU, fmt = %d\n", + xfs_debug(mp, " log : uuid = %pU, fmt = %d\n", &head->h_fs_uuid, be32_to_cpu(head->h_fmt)); } #else @@ -279,15 +279,15 @@ xlog_header_check_recover( * a dirty log created in IRIX. */ if (unlikely(be32_to_cpu(head->h_fmt) != XLOG_FMT)) { - xlog_warn( - "XFS: dirty log written in incompatible format - can't recover"); + xfs_warn(mp, + "dirty log written in incompatible format - can't recover"); xlog_header_check_dump(mp, head); XFS_ERROR_REPORT("xlog_header_check_recover(1)", XFS_ERRLEVEL_HIGH, mp); return XFS_ERROR(EFSCORRUPTED); } else if (unlikely(!uuid_equal(&mp->m_sb.sb_uuid, &head->h_fs_uuid))) { - xlog_warn( - "XFS: dirty log entry has mismatched uuid - can't recover"); + xfs_warn(mp, + "dirty log entry has mismatched uuid - can't recover"); xlog_header_check_dump(mp, head); XFS_ERROR_REPORT("xlog_header_check_recover(2)", XFS_ERRLEVEL_HIGH, mp); @@ -312,9 +312,9 @@ xlog_header_check_mount( * h_fs_uuid is nil, we assume this log was last mounted * by IRIX and continue. */ - xlog_warn("XFS: nil uuid in log - IRIX style log"); + xfs_warn(mp, "nil uuid in log - IRIX style log"); } else if (unlikely(!uuid_equal(&mp->m_sb.sb_uuid, &head->h_fs_uuid))) { - xlog_warn("XFS: log has mismatched uuid - can't recover"); + xfs_warn(mp, "log has mismatched uuid - can't recover"); xlog_header_check_dump(mp, head); XFS_ERROR_REPORT("xlog_header_check_mount", XFS_ERRLEVEL_HIGH, mp); @@ -490,8 +490,8 @@ xlog_find_verify_log_record( for (i = (*last_blk) - 1; i >= 0; i--) { if (i < start_blk) { /* valid log record not found */ - xlog_warn( - "XFS: Log inconsistent (didn't find previous header)"); + xfs_warn(log->l_mp, + "Log inconsistent (didn't find previous header)"); ASSERT(0); error = XFS_ERROR(EIO); goto out; @@ -591,12 +591,12 @@ xlog_find_head( * mkfs etc write a dummy unmount record to a fresh * log so we can store the uuid in there */ - xlog_warn("XFS: totally zeroed log"); + xfs_warn(log->l_mp, "totally zeroed log"); } return 0; } else if (error) { - xlog_warn("XFS: empty log check failed"); + xfs_warn(log->l_mp, "empty log check failed"); return error; } @@ -819,7 +819,7 @@ validate_head: xlog_put_bp(bp); if (error) - xlog_warn("XFS: failed to find log head"); + xfs_warn(log->l_mp, "failed to find log head"); return error; } @@ -912,7 +912,7 @@ xlog_find_tail( } } if (!found) { - xlog_warn("XFS: xlog_find_tail: couldn't find sync record"); + xfs_warn(log->l_mp, "%s: couldn't find sync record", __func__); ASSERT(0); return XFS_ERROR(EIO); } @@ -1028,7 +1028,7 @@ done: xlog_put_bp(bp); if (error) - xlog_warn("XFS: failed to locate log tail"); + xfs_warn(log->l_mp, "failed to locate log tail"); return error; } @@ -1092,7 +1092,8 @@ xlog_find_zeroed( * the first block must be 1. If it's not, maybe we're * not looking at a log... Bail out. */ - xlog_warn("XFS: Log inconsistent or not a log (last==0, first!=1)"); + xfs_warn(log->l_mp, + "Log inconsistent or not a log (last==0, first!=1)"); return XFS_ERROR(EINVAL); } @@ -1506,8 +1507,8 @@ xlog_recover_add_to_trans( if (list_empty(&trans->r_itemq)) { /* we need to catch log corruptions here */ if (*(uint *)dp != XFS_TRANS_HEADER_MAGIC) { - xlog_warn("XFS: xlog_recover_add_to_trans: " - "bad header magic number"); + xfs_warn(log->l_mp, "%s: bad header magic number", + __func__); ASSERT(0); return XFS_ERROR(EIO); } @@ -1534,8 +1535,8 @@ xlog_recover_add_to_trans( if (item->ri_total == 0) { /* first region to be added */ if (in_f->ilf_size == 0 || in_f->ilf_size > XLOG_MAX_REGIONS_IN_ITEM) { - xlog_warn( - "XFS: bad number of regions (%d) in inode log format", + xfs_warn(log->l_mp, + "bad number of regions (%d) in inode log format", in_f->ilf_size); ASSERT(0); return XFS_ERROR(EIO); @@ -1592,8 +1593,9 @@ xlog_recover_reorder_trans( list_move_tail(&item->ri_list, &trans->r_itemq); break; default: - xlog_warn( - "XFS: xlog_recover_reorder_trans: unrecognized type of log operation"); + xfs_warn(log->l_mp, + "%s: unrecognized type of log operation", + __func__); ASSERT(0); return XFS_ERROR(EIO); } @@ -1803,8 +1805,9 @@ xlog_recover_do_inode_buffer( logged_nextp = item->ri_buf[item_index].i_addr + next_unlinked_offset - reg_buf_offset; if (unlikely(*logged_nextp == 0)) { - xfs_fs_cmn_err(CE_ALERT, mp, - "bad inode buffer log record (ptr = 0x%p, bp = 0x%p). XFS trying to replay bad (0) inode di_next_unlinked field", + xfs_alert(mp, + "Bad inode buffer log record (ptr = 0x%p, bp = 0x%p). " + "Trying to replay bad (0) inode di_next_unlinked field.", item, bp); XFS_ERROR_REPORT("xlog_recover_do_inode_buf", XFS_ERRLEVEL_LOW, mp); @@ -1863,17 +1866,17 @@ xlog_recover_do_reg_buffer( if (buf_f->blf_flags & (XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) { if (item->ri_buf[i].i_addr == NULL) { - cmn_err(CE_ALERT, + xfs_alert(mp, "XFS: NULL dquot in %s.", __func__); goto next; } if (item->ri_buf[i].i_len < sizeof(xfs_disk_dquot_t)) { - cmn_err(CE_ALERT, + xfs_alert(mp, "XFS: dquot too small (%d) in %s.", item->ri_buf[i].i_len, __func__); goto next; } - error = xfs_qm_dqcheck(item->ri_buf[i].i_addr, + error = xfs_qm_dqcheck(mp, item->ri_buf[i].i_addr, -1, 0, XFS_QMOPT_DOWARN, "dquot_buf_recover"); if (error) @@ -1898,6 +1901,7 @@ xlog_recover_do_reg_buffer( */ int xfs_qm_dqcheck( + struct xfs_mount *mp, xfs_disk_dquot_t *ddq, xfs_dqid_t id, uint type, /* used only when IO_dorepair is true */ @@ -1924,14 +1928,14 @@ xfs_qm_dqcheck( */ if (be16_to_cpu(ddq->d_magic) != XFS_DQUOT_MAGIC) { if (flags & XFS_QMOPT_DOWARN) - cmn_err(CE_ALERT, + xfs_alert(mp, "%s : XFS dquot ID 0x%x, magic 0x%x != 0x%x", str, id, be16_to_cpu(ddq->d_magic), XFS_DQUOT_MAGIC); errs++; } if (ddq->d_version != XFS_DQUOT_VERSION) { if (flags & XFS_QMOPT_DOWARN) - cmn_err(CE_ALERT, + xfs_alert(mp, "%s : XFS dquot ID 0x%x, version 0x%x != 0x%x", str, id, ddq->d_version, XFS_DQUOT_VERSION); errs++; @@ -1941,7 +1945,7 @@ xfs_qm_dqcheck( ddq->d_flags != XFS_DQ_PROJ && ddq->d_flags != XFS_DQ_GROUP) { if (flags & XFS_QMOPT_DOWARN) - cmn_err(CE_ALERT, + xfs_alert(mp, "%s : XFS dquot ID 0x%x, unknown flags 0x%x", str, id, ddq->d_flags); errs++; @@ -1949,7 +1953,7 @@ xfs_qm_dqcheck( if (id != -1 && id != be32_to_cpu(ddq->d_id)) { if (flags & XFS_QMOPT_DOWARN) - cmn_err(CE_ALERT, + xfs_alert(mp, "%s : ondisk-dquot 0x%p, ID mismatch: " "0x%x expected, found id 0x%x", str, ddq, id, be32_to_cpu(ddq->d_id)); @@ -1962,9 +1966,8 @@ xfs_qm_dqcheck( be64_to_cpu(ddq->d_blk_softlimit)) { if (!ddq->d_btimer) { if (flags & XFS_QMOPT_DOWARN) - cmn_err(CE_ALERT, - "%s : Dquot ID 0x%x (0x%p) " - "BLK TIMER NOT STARTED", + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) BLK TIMER NOT STARTED", str, (int)be32_to_cpu(ddq->d_id), ddq); errs++; } @@ -1974,9 +1977,8 @@ xfs_qm_dqcheck( be64_to_cpu(ddq->d_ino_softlimit)) { if (!ddq->d_itimer) { if (flags & XFS_QMOPT_DOWARN) - cmn_err(CE_ALERT, - "%s : Dquot ID 0x%x (0x%p) " - "INODE TIMER NOT STARTED", + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) INODE TIMER NOT STARTED", str, (int)be32_to_cpu(ddq->d_id), ddq); errs++; } @@ -1986,9 +1988,8 @@ xfs_qm_dqcheck( be64_to_cpu(ddq->d_rtb_softlimit)) { if (!ddq->d_rtbtimer) { if (flags & XFS_QMOPT_DOWARN) - cmn_err(CE_ALERT, - "%s : Dquot ID 0x%x (0x%p) " - "RTBLK TIMER NOT STARTED", + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) RTBLK TIMER NOT STARTED", str, (int)be32_to_cpu(ddq->d_id), ddq); errs++; } @@ -1999,7 +2000,7 @@ xfs_qm_dqcheck( return errs; if (flags & XFS_QMOPT_DOWARN) - cmn_err(CE_NOTE, "Re-initializing dquot ID 0x%x", id); + xfs_notice(mp, "Re-initializing dquot ID 0x%x", id); /* * Typically, a repair is only requested by quotacheck. @@ -2218,9 +2219,9 @@ xlog_recover_inode_pass2( */ if (unlikely(be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC)) { 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, in_f->ilf_ino); + xfs_alert(mp, + "%s: Bad inode magic number, dip = 0x%p, dino bp = 0x%p, ino = %Ld", + __func__, dip, bp, in_f->ilf_ino); XFS_ERROR_REPORT("xlog_recover_inode_pass2(1)", XFS_ERRLEVEL_LOW, mp); error = EFSCORRUPTED; @@ -2229,9 +2230,9 @@ xlog_recover_inode_pass2( dicp = item->ri_buf[1].i_addr; if (unlikely(dicp->di_magic != XFS_DINODE_MAGIC)) { 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, in_f->ilf_ino); + xfs_alert(mp, + "%s: Bad inode log record, rec ptr 0x%p, ino %Ld", + __func__, item, in_f->ilf_ino); XFS_ERROR_REPORT("xlog_recover_inode_pass2(2)", XFS_ERRLEVEL_LOW, mp); error = EFSCORRUPTED; @@ -2263,9 +2264,10 @@ xlog_recover_inode_pass2( 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, in_f->ilf_ino); + xfs_alert(mp, + "%s: Bad regular inode log record, rec ptr 0x%p, " + "ino ptr = 0x%p, ino bp = 0x%p, ino %Ld", + __func__, item, dip, bp, in_f->ilf_ino); error = EFSCORRUPTED; goto error; } @@ -2276,9 +2278,10 @@ xlog_recover_inode_pass2( 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, in_f->ilf_ino); + xfs_alert(mp, + "%s: Bad dir inode log record, rec ptr 0x%p, " + "ino ptr = 0x%p, ino bp = 0x%p, ino %Ld", + __func__, item, dip, bp, in_f->ilf_ino); error = EFSCORRUPTED; goto error; } @@ -2287,9 +2290,10 @@ xlog_recover_inode_pass2( 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, in_f->ilf_ino, + xfs_alert(mp, + "%s: Bad inode log record, rec ptr 0x%p, dino ptr 0x%p, " + "dino bp 0x%p, ino %Ld, total extents = %d, nblocks = %Ld", + __func__, item, dip, bp, in_f->ilf_ino, dicp->di_nextents + dicp->di_anextents, dicp->di_nblocks); error = EFSCORRUPTED; @@ -2299,8 +2303,9 @@ xlog_recover_inode_pass2( 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", + xfs_alert(mp, + "%s: Bad inode log record, rec ptr 0x%p, dino ptr 0x%p, " + "dino bp 0x%p, ino %Ld, forkoff 0x%x", __func__, item, dip, bp, in_f->ilf_ino, dicp->di_forkoff); error = EFSCORRUPTED; goto error; @@ -2309,9 +2314,9 @@ xlog_recover_inode_pass2( XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(7)", XFS_ERRLEVEL_LOW, mp, dicp); xfs_buf_relse(bp); - xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_inode_recover: Bad inode log record length %d, rec ptr 0x%p", - item->ri_buf[1].i_len, item); + xfs_alert(mp, + "%s: Bad inode log record length %d, rec ptr 0x%p", + __func__, item->ri_buf[1].i_len, item); error = EFSCORRUPTED; goto error; } @@ -2398,7 +2403,7 @@ xlog_recover_inode_pass2( break; default: - xlog_warn("XFS: xlog_recover_inode_pass2: Invalid flag"); + xfs_warn(log->l_mp, "%s: Invalid flag", __func__); ASSERT(0); xfs_buf_relse(bp); error = EIO; @@ -2467,13 +2472,11 @@ xlog_recover_dquot_pass2( recddq = item->ri_buf[1].i_addr; if (recddq == NULL) { - cmn_err(CE_ALERT, - "XFS: NULL dquot in %s.", __func__); + xfs_alert(log->l_mp, "NULL dquot in %s.", __func__); return XFS_ERROR(EIO); } if (item->ri_buf[1].i_len < sizeof(xfs_disk_dquot_t)) { - cmn_err(CE_ALERT, - "XFS: dquot too small (%d) in %s.", + xfs_alert(log->l_mp, "dquot too small (%d) in %s.", item->ri_buf[1].i_len, __func__); return XFS_ERROR(EIO); } @@ -2498,12 +2501,10 @@ xlog_recover_dquot_pass2( */ dq_f = item->ri_buf[0].i_addr; ASSERT(dq_f); - if ((error = xfs_qm_dqcheck(recddq, - dq_f->qlf_id, - 0, XFS_QMOPT_DOWARN, - "xlog_recover_dquot_pass2 (log copy)"))) { + error = xfs_qm_dqcheck(mp, recddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN, + "xlog_recover_dquot_pass2 (log copy)"); + if (error) return XFS_ERROR(EIO); - } ASSERT(dq_f->qlf_len == 1); error = xfs_read_buf(mp, mp->m_ddev_targp, @@ -2523,8 +2524,9 @@ xlog_recover_dquot_pass2( * was among a chunk of dquots created earlier, and we did some * minimal initialization then. */ - if (xfs_qm_dqcheck(ddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN, - "xlog_recover_dquot_pass2")) { + error = xfs_qm_dqcheck(mp, ddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN, + "xlog_recover_dquot_pass2"); + if (error) { xfs_buf_relse(bp); return XFS_ERROR(EIO); } @@ -2676,9 +2678,8 @@ xlog_recover_commit_pass1( /* nothing to do in pass 1 */ return 0; default: - xlog_warn( - "XFS: invalid item type (%d) xlog_recover_commit_pass1", - ITEM_TYPE(item)); + xfs_warn(log->l_mp, "%s: invalid item type (%d)", + __func__, ITEM_TYPE(item)); ASSERT(0); return XFS_ERROR(EIO); } @@ -2707,9 +2708,8 @@ xlog_recover_commit_pass2( /* nothing to do in pass2 */ return 0; default: - xlog_warn( - "XFS: invalid item type (%d) xlog_recover_commit_pass2", - ITEM_TYPE(item)); + xfs_warn(log->l_mp, "%s: invalid item type (%d)", + __func__, ITEM_TYPE(item)); ASSERT(0); return XFS_ERROR(EIO); } @@ -2751,10 +2751,11 @@ xlog_recover_commit_trans( STATIC int xlog_recover_unmount_trans( + struct log *log, xlog_recover_t *trans) { /* Do nothing now */ - xlog_warn("XFS: xlog_recover_unmount_trans: Unmount LR"); + xfs_warn(log->l_mp, "%s: Unmount LR", __func__); return 0; } @@ -2797,8 +2798,8 @@ xlog_recover_process_data( dp += sizeof(xlog_op_header_t); if (ohead->oh_clientid != XFS_TRANSACTION && ohead->oh_clientid != XFS_LOG) { - xlog_warn( - "XFS: xlog_recover_process_data: bad clientid"); + xfs_warn(log->l_mp, "%s: bad clientid 0x%x", + __func__, ohead->oh_clientid); ASSERT(0); return (XFS_ERROR(EIO)); } @@ -2811,8 +2812,8 @@ xlog_recover_process_data( be64_to_cpu(rhead->h_lsn)); } else { if (dp + be32_to_cpu(ohead->oh_len) > lp) { - xlog_warn( - "XFS: xlog_recover_process_data: bad length"); + xfs_warn(log->l_mp, "%s: bad length 0x%x", + __func__, be32_to_cpu(ohead->oh_len)); WARN_ON(1); return (XFS_ERROR(EIO)); } @@ -2825,7 +2826,7 @@ xlog_recover_process_data( trans, pass); break; case XLOG_UNMOUNT_TRANS: - error = xlog_recover_unmount_trans(trans); + error = xlog_recover_unmount_trans(log, trans); break; case XLOG_WAS_CONT_TRANS: error = xlog_recover_add_to_cont_trans(log, @@ -2833,8 +2834,8 @@ xlog_recover_process_data( be32_to_cpu(ohead->oh_len)); break; case XLOG_START_TRANS: - xlog_warn( - "XFS: xlog_recover_process_data: bad transaction"); + xfs_warn(log->l_mp, "%s: bad transaction", + __func__); ASSERT(0); error = XFS_ERROR(EIO); break; @@ -2844,8 +2845,8 @@ xlog_recover_process_data( dp, be32_to_cpu(ohead->oh_len)); break; default: - xlog_warn( - "XFS: xlog_recover_process_data: bad flag"); + xfs_warn(log->l_mp, "%s: bad flag 0x%x", + __func__, flags); ASSERT(0); error = XFS_ERROR(EIO); break; @@ -3030,8 +3031,7 @@ xlog_recover_clear_agi_bucket( out_abort: xfs_trans_cancel(tp, XFS_TRANS_ABORT); out_error: - xfs_fs_cmn_err(CE_WARN, mp, "xlog_recover_clear_agi_bucket: " - "failed to clear agi %d. Continuing.", agno); + xfs_warn(mp, "%s: failed to clear agi %d. Continuing.", __func__, agno); return; } @@ -3282,7 +3282,7 @@ xlog_valid_rec_header( if (unlikely( (!rhead->h_version || (be32_to_cpu(rhead->h_version) & (~XLOG_VERSION_OKBITS))))) { - xlog_warn("XFS: %s: unrecognised log version (%d).", + xfs_warn(log->l_mp, "%s: unrecognised log version (%d).", __func__, be32_to_cpu(rhead->h_version)); return XFS_ERROR(EIO); } @@ -3740,10 +3740,9 @@ xlog_recover( return error; } - cmn_err(CE_NOTE, - "Starting XFS recovery on filesystem: %s (logdev: %s)", - log->l_mp->m_fsname, log->l_mp->m_logname ? - log->l_mp->m_logname : "internal"); + xfs_notice(log->l_mp, "Starting recovery (logdev: %s)", + log->l_mp->m_logname ? log->l_mp->m_logname + : "internal"); error = xlog_do_recover(log, head_blk, tail_blk); log->l_flags |= XLOG_RECOVERY_NEEDED; @@ -3776,9 +3775,7 @@ xlog_recover_finish( int error; error = xlog_recover_process_efis(log); if (error) { - cmn_err(CE_ALERT, - "Failed to recover EFIs on filesystem: %s", - log->l_mp->m_fsname); + xfs_alert(log->l_mp, "Failed to recover EFIs"); return error; } /* @@ -3793,15 +3790,12 @@ xlog_recover_finish( xlog_recover_check_summary(log); - cmn_err(CE_NOTE, - "Ending XFS recovery on filesystem: %s (logdev: %s)", - log->l_mp->m_fsname, log->l_mp->m_logname ? - log->l_mp->m_logname : "internal"); + xfs_notice(log->l_mp, "Ending recovery (logdev: %s)", + log->l_mp->m_logname ? log->l_mp->m_logname + : "internal"); log->l_flags &= ~XLOG_RECOVERY_NEEDED; } else { - cmn_err(CE_DEBUG, - "Ending clean XFS mount for filesystem: %s\n", - log->l_mp->m_fsname); + xfs_info(log->l_mp, "Ending clean mount"); } return 0; } @@ -3834,10 +3828,8 @@ xlog_recover_check_summary( for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) { error = xfs_read_agf(mp, NULL, agno, 0, &agfbp); if (error) { - xfs_fs_cmn_err(CE_ALERT, mp, - "xlog_recover_check_summary(agf)" - "agf read failed agno %d error %d", - agno, error); + xfs_alert(mp, "%s agf read failed agno %d error %d", + __func__, agno, error); } else { agfp = XFS_BUF_TO_AGF(agfbp); freeblks += be32_to_cpu(agfp->agf_freeblks) + @@ -3846,7 +3838,10 @@ xlog_recover_check_summary( } error = xfs_read_agi(mp, NULL, agno, &agibp); - if (!error) { + if (error) { + xfs_alert(mp, "%s agi read failed agno %d error %d", + __func__, agno, error); + } else { struct xfs_agi *agi = XFS_BUF_TO_AGI(agibp); itotal += be32_to_cpu(agi->agi_count); diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h index 9bb6eda..a595f29 100644 --- a/fs/xfs/xfs_quota.h +++ b/fs/xfs/xfs_quota.h @@ -382,7 +382,8 @@ static inline int xfs_qm_sync(struct xfs_mount *mp, int flags) xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, nb, ni, \ f | XFS_QMOPT_RES_REGBLKS) -extern int xfs_qm_dqcheck(xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *); +extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *, + xfs_dqid_t, uint, uint, char *); extern int xfs_mount_reset_sbqflags(struct xfs_mount *); #endif /* __KERNEL__ */ -- 1.7.2.3 From SRS0+ung/+46+fromorbit.com=dave@internode.on.net Tue Jan 11 18:34:15 2011 X-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_81 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 p0C0YFDc124016 for ; Tue, 11 Jan 2011 18:34:15 -0600 X-ASG-Debug-ID: 1294792587-584101af0000-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 BA10A1D2641A for ; Tue, 11 Jan 2011 16:36:27 -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 9ky3Vb59DAFEHN8m for ; Tue, 11 Jan 2011 16:36:27 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52939874-1927428 for ; Wed, 12 Jan 2011 11:06:26 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcohC-0000Uk-HK for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:36:14 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pcogv-0002GR-2E for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:35:57 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 10/12] xfs: convert the quota debug prints to new API Subject: [PATCH 10/12] xfs: convert the quota debug prints to new API Date: Wed, 12 Jan 2011 11:35:51 +1100 Message-Id: <1294792553-8378-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294792553-8378-1-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1294792588 X-Barracuda-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.52113 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 Signed-off-by: Dave Chinner --- fs/xfs/quota/xfs_qm_syscalls.c | 27 ++++++++++++--------------- 1 files changed, 12 insertions(+), 15 deletions(-) diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index bdebc18..603ab86 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -41,12 +41,6 @@ #include "xfs_qm.h" #include "xfs_trace.h" -#ifdef DEBUG -# define qdprintk(s, args...) cmn_err(CE_DEBUG, s, ## args) -#else -# define qdprintk(s, args...) do { } while (0) -#endif - STATIC int xfs_qm_log_quotaoff(xfs_mount_t *, xfs_qoff_logitem_t **, uint); STATIC int xfs_qm_log_quotaoff_end(xfs_mount_t *, xfs_qoff_logitem_t *, uint); @@ -294,7 +288,8 @@ xfs_qm_scall_trunc_qfiles( int error = 0, error2 = 0; if (!xfs_sb_version_hasquota(&mp->m_sb) || flags == 0) { - qdprintk("qtrunc flags=%x m_qflags=%x\n", flags, mp->m_qflags); + xfs_debug(mp, "%s: flags=%x m_qflags=%x\n", + __func__, flags, mp->m_qflags); return XFS_ERROR(EINVAL); } @@ -331,7 +326,8 @@ xfs_qm_scall_quotaon( sbflags = 0; if (flags == 0) { - qdprintk("quotaon: zero flags, m_qflags=%x\n", mp->m_qflags); + xfs_debug(mp, "%s: zero flags, m_qflags=%x\n", + __func__, mp->m_qflags); return XFS_ERROR(EINVAL); } @@ -352,8 +348,9 @@ xfs_qm_scall_quotaon( (flags & XFS_GQUOTA_ACCT) == 0 && (mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) == 0 && (flags & XFS_OQUOTA_ENFD))) { - qdprintk("Can't enforce without acct, flags=%x sbflags=%x\n", - flags, mp->m_sb.sb_qflags); + xfs_debug(mp, + "%s: Can't enforce without acct, flags=%x sbflags=%x\n", + __func__, flags, mp->m_sb.sb_qflags); return XFS_ERROR(EINVAL); } /* @@ -541,7 +538,7 @@ xfs_qm_scall_setqlim( q->qi_bsoftlimit = soft; } } else { - qdprintk("blkhard %Ld < blksoft %Ld\n", hard, soft); + xfs_debug(mp, "blkhard %Ld < blksoft %Ld\n", hard, soft); } hard = (newlim->d_fieldmask & FS_DQ_RTBHARD) ? (xfs_qcnt_t) XFS_BB_TO_FSB(mp, newlim->d_rtb_hardlimit) : @@ -557,7 +554,7 @@ xfs_qm_scall_setqlim( q->qi_rtbsoftlimit = soft; } } else { - qdprintk("rtbhard %Ld < rtbsoft %Ld\n", hard, soft); + xfs_debug(mp, "rtbhard %Ld < rtbsoft %Ld\n", hard, soft); } hard = (newlim->d_fieldmask & FS_DQ_IHARD) ? @@ -574,7 +571,7 @@ xfs_qm_scall_setqlim( q->qi_isoftlimit = soft; } } else { - qdprintk("ihard %Ld < isoft %Ld\n", hard, soft); + xfs_debug(mp, "ihard %Ld < isoft %Ld\n", hard, soft); } /* @@ -1137,8 +1134,8 @@ xfs_qm_internalqcheck_adjust( if (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino) { *res = BULKSTAT_RV_NOTHING; - qdprintk("internalqcheck: ino=%llu, uqino=%llu, gqino=%llu\n", - (unsigned long long) ino, + xfs_debug(mp, "%s: ino=%llu, uqino=%llu, gqino=%llu\n", + __func__, (unsigned long long) ino, (unsigned long long) mp->m_sb.sb_uquotino, (unsigned long long) mp->m_sb.sb_gquotino); return XFS_ERROR(EINVAL); -- 1.7.2.3 From SRS0+ung/+46+fromorbit.com=dave@internode.on.net Tue Jan 11 18:34:17 2011 X-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 (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p0C0YGYq124032 for ; Tue, 11 Jan 2011 18:34:16 -0600 X-ASG-Debug-ID: 1294792587-5952028a0000-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 5A72AFD432C for ; Tue, 11 Jan 2011 16:36:28 -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 oUWOyXFgsdvTCNwy for ; Tue, 11 Jan 2011 16:36:28 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 41062648-1927428 for ; Wed, 12 Jan 2011 11:06:27 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcohC-0000Uo-L1 for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:36:14 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pcogv-0002GW-5z for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:35:57 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 12/12] xfs: kill support/debug.[ch] Subject: [PATCH 12/12] xfs: kill support/debug.[ch] Date: Wed, 12 Jan 2011 11:35:53 +1100 Message-Id: <1294792553-8378-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294792553-8378-1-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1294792589 X-Barracuda-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.52114 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 remaining functionality in debug.[ch] is effectively just assert handling, conditional debug definitions and hex dumping. The hex dumping and assert function can be moved into the new printk module, while the rest can be moved into top-level header files. This allows fs/xfs/support/debug.[ch] to be completely removed from the codebase. Signed-off-by: Dave Chinner --- fs/xfs/Makefile | 1 - fs/xfs/linux-2.6/xfs_linux.h | 21 +++++++++++++++++++ fs/xfs/linux-2.6/xfs_printk.c | 14 ++++++++++++ fs/xfs/linux-2.6/xfs_printk.h | 4 +++ fs/xfs/support/debug.c | 32 ----------------------------- fs/xfs/support/debug.h | 45 ----------------------------------------- fs/xfs/xfs_error.h | 4 --- 7 files changed, 39 insertions(+), 82 deletions(-) delete mode 100644 fs/xfs/support/debug.c delete mode 100644 fs/xfs/support/debug.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 3060407..be12325 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -111,5 +111,4 @@ xfs-y += $(addprefix $(XFS_LINUX)/, \ # Objects in support/ xfs-y += $(addprefix support/, \ - debug.o \ uuid.o) diff --git a/fs/xfs/linux-2.6/xfs_linux.h b/fs/xfs/linux-2.6/xfs_linux.h index 9549023..26c0d29 100644 --- a/fs/xfs/linux-2.6/xfs_linux.h +++ b/fs/xfs/linux-2.6/xfs_linux.h @@ -281,4 +281,25 @@ static inline __uint64_t howmany_64(__uint64_t x, __uint32_t y) #define __arch_pack #endif +#define ASSERT_ALWAYS(expr) \ + (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) + +#ifndef DEBUG +#define ASSERT(expr) ((void)0) + +#ifndef STATIC +# define STATIC static noinline +#endif + +#else /* DEBUG */ + +#define ASSERT(expr) \ + (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) + +#ifndef STATIC +# define STATIC noinline +#endif + +#endif /* DEBUG */ + #endif /* __XFS_LINUX__ */ diff --git a/fs/xfs/linux-2.6/xfs_printk.c b/fs/xfs/linux-2.6/xfs_printk.c index 6f3368e..8fe8cf6 100644 --- a/fs/xfs/linux-2.6/xfs_printk.c +++ b/fs/xfs/linux-2.6/xfs_printk.c @@ -117,3 +117,17 @@ xfs_alert_tag( return r; } + +void +assfail(char *expr, char *file, int line) +{ + xfs_emerg(NULL, "Assertion failed: %s, file: %s, line: %d", + expr, file, line); + BUG(); +} + +void +xfs_hex_dump(void *p, int length) +{ + print_hex_dump(KERN_ALERT, "", DUMP_PREFIX_ADDRESS, 16, 1, p, length, 1); +} diff --git a/fs/xfs/linux-2.6/xfs_printk.h b/fs/xfs/linux-2.6/xfs_printk.h index 579367f..d39ad30 100644 --- a/fs/xfs/linux-2.6/xfs_printk.h +++ b/fs/xfs/linux-2.6/xfs_printk.h @@ -31,4 +31,8 @@ extern int xfs_debug(const struct xfs_mount *mp, const char *fmt, ...) #define xfs_debug(mp, fmt, ...) (0) #endif +extern void assfail(char *expr, char *f, int l); + +extern void xfs_hex_dump(void *p, int length); + #endif /* __XFS_PRINTK_H */ diff --git a/fs/xfs/support/debug.c b/fs/xfs/support/debug.c deleted file mode 100644 index c9020ae..0000000 --- a/fs/xfs/support/debug.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include -#include "debug.h" - -void -assfail(char *expr, char *file, int line) -{ - printk("Assertion failed: %s, file: %s, line: %d\n", expr, file, line); - BUG(); -} - -void -xfs_hex_dump(void *p, int length) -{ - print_hex_dump(KERN_ALERT, "", DUMP_PREFIX_ADDRESS, 16, 1, p, length, 1); -} diff --git a/fs/xfs/support/debug.h b/fs/xfs/support/debug.h deleted file mode 100644 index db36be4..0000000 --- a/fs/xfs/support/debug.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_SUPPORT_DEBUG_H__ -#define __XFS_SUPPORT_DEBUG_H__ - -#include - -extern void assfail(char *expr, char *f, int l); - -#define ASSERT_ALWAYS(expr) \ - (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) - -#ifndef DEBUG -#define ASSERT(expr) ((void)0) - -#ifndef STATIC -# define STATIC static noinline -#endif - -#else /* DEBUG */ - -#define ASSERT(expr) \ - (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) - -#ifndef STATIC -# define STATIC noinline -#endif - -#endif /* DEBUG */ -#endif /* __XFS_SUPPORT_DEBUG_H__ */ diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index e836051..079a367 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h @@ -158,8 +158,4 @@ extern int xfs_errortag_clearall(struct xfs_mount *mp, int loud); #define XFS_PTAG_SHUTDOWN_LOGERROR 0x00000040 #define XFS_PTAG_FSBLOCK_ZERO 0x00000080 -struct xfs_mount; - -extern void xfs_hex_dump(void *p, int length); - #endif /* __XFS_ERROR_H__ */ -- 1.7.2.3 From SRS0+ung/+46+fromorbit.com=dave@internode.on.net Tue Jan 11 18:34:16 2011 X-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_32, J_CHICKENPOX_33,J_CHICKENPOX_45 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 p0C0YFbx124021 for ; Tue, 11 Jan 2011 18:34:16 -0600 X-ASG-Debug-ID: 1294792586-598602620000-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 8A41EFD41CC for ; Tue, 11 Jan 2011 16:36: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 imQcysQP9DWjnrIO for ; Tue, 11 Jan 2011 16:36:26 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52231989-1927428 for ; Wed, 12 Jan 2011 11:06:25 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcohM-0000UR-1e for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:36:24 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pcogu-0002G3-Ju for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:35:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 02/12] xfs: introduce new logging API. Subject: [PATCH 02/12] xfs: introduce new logging API. Date: Wed, 12 Jan 2011 11:35:43 +1100 Message-Id: <1294792553-8378-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294792553-8378-1-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1294792588 X-Barracuda-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.52114 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 Most of the logging infrastructurein XFS is unneccessary and designed around the infrastructure supplied by Irix rather than Linux. To start rationalising all the logging interfaces, start by introducing simple printk wrappers similar to the dev_printk() infrastructure. later patches will convert code to use this new interface. Signed-off-by: Dave Chinner --- fs/xfs/Makefile | 1 + fs/xfs/linux-2.6/xfs_linux.h | 1 + fs/xfs/linux-2.6/xfs_printk.c | 119 +++++++++++++++++++++++++++++++++++++++++ fs/xfs/linux-2.6/xfs_printk.h | 34 ++++++++++++ 4 files changed, 155 insertions(+), 0 deletions(-) create mode 100644 fs/xfs/linux-2.6/xfs_printk.c create mode 100644 fs/xfs/linux-2.6/xfs_printk.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 0dce969..3060407 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -104,6 +104,7 @@ xfs-y += $(addprefix $(XFS_LINUX)/, \ xfs_globals.o \ xfs_ioctl.o \ xfs_iops.o \ + xfs_printk.o \ xfs_super.o \ xfs_sync.o \ xfs_xattr.o) diff --git a/fs/xfs/linux-2.6/xfs_linux.h b/fs/xfs/linux-2.6/xfs_linux.h index 0964949..9549023 100644 --- a/fs/xfs/linux-2.6/xfs_linux.h +++ b/fs/xfs/linux-2.6/xfs_linux.h @@ -86,6 +86,7 @@ #include #include #include +#include /* * Feature macros (disable/enable) diff --git a/fs/xfs/linux-2.6/xfs_printk.c b/fs/xfs/linux-2.6/xfs_printk.c new file mode 100644 index 0000000..6f3368e --- /dev/null +++ b/fs/xfs/linux-2.6/xfs_printk.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2011 Red Hat, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_types.h" +#include "xfs_log.h" +#include "xfs_inum.h" +#include "xfs_trans.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_mount.h" + +/* + * XFS logging functions + */ +static int +__xfs_printk( + const char *level, + const struct xfs_mount *mp, + struct va_format *vaf) +{ + if (mp && mp->m_fsname) + return printk("%sXFS (%s): %pV\n", level, mp->m_fsname, vaf); + return printk("%sXFS: %pV\n", level, vaf); +} + +int xfs_printk( + const char *level, + const struct xfs_mount *mp, + const char *fmt, ...) +{ + struct va_format vaf; + va_list args; + int r; + + va_start(args, fmt); + + vaf.fmt = fmt; + vaf.va = &args; + + r = __xfs_printk(level, mp, &vaf); + va_end(args); + + return r; +} + +#define define_xfs_printk_level(func, kern_level) \ +int func(const struct xfs_mount *mp, const char *fmt, ...) \ +{ \ + struct va_format vaf; \ + va_list args; \ + int r; \ + \ + va_start(args, fmt); \ + \ + vaf.fmt = fmt; \ + vaf.va = &args; \ + \ + r = __xfs_printk(kern_level, mp, &vaf); \ + va_end(args); \ + \ + return r; \ +} \ + +define_xfs_printk_level(xfs_emerg, KERN_EMERG); +define_xfs_printk_level(xfs_alert, KERN_ALERT); +define_xfs_printk_level(xfs_crit, KERN_CRIT); +define_xfs_printk_level(xfs_err, KERN_ERR); +define_xfs_printk_level(xfs_warn, KERN_WARNING); +define_xfs_printk_level(xfs_notice, KERN_NOTICE); +define_xfs_printk_level(xfs_info, KERN_INFO); +#ifdef DEBUG +define_xfs_printk_level(xfs_debug, KERN_DEBUG); +#endif + +int +xfs_alert_tag( + const struct xfs_mount *mp, + int panic_tag, + const char *fmt, ...) +{ + struct va_format vaf; + va_list args; + int panic = 0; + int r; + + if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) { + xfs_printk(KERN_ALERT, mp, + "XFS: Transforming an alert into a BUG."); + panic = 1; + } + + va_start(args, fmt); + + vaf.fmt = fmt; + vaf.va = &args; + + r = __xfs_printk(KERN_ALERT, mp, &vaf); + va_end(args); + + BUG_ON(panic); + + return r; +} diff --git a/fs/xfs/linux-2.6/xfs_printk.h b/fs/xfs/linux-2.6/xfs_printk.h new file mode 100644 index 0000000..579367f --- /dev/null +++ b/fs/xfs/linux-2.6/xfs_printk.h @@ -0,0 +1,34 @@ +#ifndef __XFS_PRINTK_H +#define __XFS_PRINTK_H 1 + +struct xfs_mount; + +extern int xfs_printk(const char *level, const struct xfs_mount *mp, + const char *fmt, ...) + __attribute__ ((format (printf, 3, 4))); +extern int xfs_emerg(const struct xfs_mount *mp, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); +extern int xfs_alert(const struct xfs_mount *mp, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); +extern int xfs_alert_tag(const struct xfs_mount *mp, int tag, + const char *fmt, ...) + __attribute__ ((format (printf, 3, 4))); +extern int xfs_crit(const struct xfs_mount *mp, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); +extern int xfs_err(const struct xfs_mount *mp, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); +extern int xfs_warn(const struct xfs_mount *mp, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); +extern int xfs_notice(const struct xfs_mount *mp, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); +extern int xfs_info(const struct xfs_mount *mp, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); + +#ifdef DEBUG +extern int xfs_debug(const struct xfs_mount *mp, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); +#else +#define xfs_debug(mp, fmt, ...) (0) +#endif + +#endif /* __XFS_PRINTK_H */ -- 1.7.2.3 From SRS0+mr6w+46+fromorbit.com=dave@internode.on.net Tue Jan 11 18:34:17 2011 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.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_32, J_CHICKENPOX_33,J_CHICKENPOX_45,J_CHICKENPOX_74,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 p0C0YG9U124028 for ; Tue, 11 Jan 2011 18:34:16 -0600 X-ASG-Debug-ID: 1294792587-590a02aa0000-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 EBA48FD432B for ; Tue, 11 Jan 2011 16:36:27 -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 AUeN8a0MFwZjGTXc for ; Tue, 11 Jan 2011 16:36:27 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52533598-1927428 for ; Wed, 12 Jan 2011 11:06:26 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcohM-0000V1-Dn for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:36:24 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pcogu-0002GL-Uh for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:35:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 08/12] xfs: convert xfs_fs_cmn_err to new error logging API Subject: [PATCH 08/12] xfs: convert xfs_fs_cmn_err to new error logging API Date: Wed, 12 Jan 2011 11:35:49 +1100 Message-Id: <1294792553-8378-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294792553-8378-1-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1294792588 X-Barracuda-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.52114 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 Continue to clean up the error logging code by converting all the callers of xfs_fs_cmn_err() to the new API. once done, remove the unused old API function. Signed-off-by: Dave Chinner --- fs/xfs/quota/xfs_dquot.c | 4 ++-- fs/xfs/quota/xfs_dquot_item.c | 5 ++--- fs/xfs/quota/xfs_qm.c | 13 ++++++------- fs/xfs/support/debug.c | 20 -------------------- fs/xfs/support/debug.h | 2 -- fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_dfrag.c | 4 ++-- fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_fsops.c | 6 +++--- fs/xfs/xfs_ialloc.c | 39 +++++++++++++++++---------------------- fs/xfs/xfs_inode.c | 17 +++++++---------- fs/xfs/xfs_mount.c | 16 ++++++++-------- fs/xfs/xfs_vnodeops.c | 8 ++++---- 13 files changed, 53 insertions(+), 85 deletions(-) diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index 773adc8..e1ff7e5 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c @@ -1393,8 +1393,8 @@ xfs_qm_dqpurge( */ error = xfs_qm_dqflush(dqp, SYNC_WAIT); if (error) - xfs_fs_cmn_err(CE_WARN, mp, - "xfs_qm_dqpurge: dquot %p flush failed", dqp); + xfs_warn(mp, "%s: dquot %p flush failed", + __func__, dqp); xfs_dqflock(dqp); } ASSERT(atomic_read(&dqp->q_pincount) == 0); diff --git a/fs/xfs/quota/xfs_dquot_item.c b/fs/xfs/quota/xfs_dquot_item.c index 2a1f3dc..9e0e2fa 100644 --- a/fs/xfs/quota/xfs_dquot_item.c +++ b/fs/xfs/quota/xfs_dquot_item.c @@ -136,9 +136,8 @@ xfs_qm_dquot_logitem_push( */ error = xfs_qm_dqflush(dqp, 0); if (error) - xfs_fs_cmn_err(CE_WARN, dqp->q_mount, - "xfs_qm_dquot_logitem_push: push error %d on dqp %p", - error, dqp); + xfs_warn(dqp->q_mount, "%s: push error %d on dqp %p", + __func__, error, dqp); xfs_dqunlock(dqp); } diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index d87c4a3..2488e2f 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -402,14 +402,13 @@ xfs_qm_mount_quotas( * off, but the on disk superblock doesn't know that ! */ ASSERT(!(XFS_IS_QUOTA_RUNNING(mp))); - xfs_fs_cmn_err(CE_ALERT, mp, - "XFS mount_quotas: Superblock update failed!"); + xfs_alert(mp, "%s: Superblock update failed!", + __func__); } } if (error) { - xfs_fs_cmn_err(CE_WARN, mp, - "Failed to initialize disk quotas."); + xfs_warn(mp, "Failed to initialize disk quotas."); return; } @@ -1264,7 +1263,7 @@ xfs_qm_qino_alloc( xfs_mod_sb(tp, sbfields); if ((error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES))) { - xfs_fs_cmn_err(CE_ALERT, mp, "XFS qino_alloc failed!"); + xfs_alert(mp, "%s failed (error %d)!", __func__, error); return error; } return 0; @@ -1941,8 +1940,8 @@ startagain: */ error = xfs_qm_dqflush(dqp, 0); if (error) { - xfs_fs_cmn_err(CE_WARN, mp, - "xfs_qm_dqreclaim: dquot %p flush failed", dqp); + xfs_warn(mp, "%s: dquot %p flush failed", + __func__, dqp); } xfs_dqunlock(dqp); /* dqflush unlocks dqflock */ continue; diff --git a/fs/xfs/support/debug.c b/fs/xfs/support/debug.c index b93b75d..98daab6 100644 --- a/fs/xfs/support/debug.c +++ b/fs/xfs/support/debug.c @@ -45,26 +45,6 @@ cmn_err( } 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); -} - -void assfail(char *expr, char *file, int line) { printk("Assertion failed: %s, file: %s, line: %d\n", expr, file, line); diff --git a/fs/xfs/support/debug.h b/fs/xfs/support/debug.h index eaeaa17..4a082b9 100644 --- a/fs/xfs/support/debug.h +++ b/fs/xfs/support/debug.h @@ -31,8 +31,6 @@ struct xfs_mount; void cmn_err(const char *lvl, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); -void xfs_fs_cmn_err( const char *lvl, struct xfs_mount *mp, - const char *fmt, ...) __attribute__ ((format (printf, 3, 4))); extern void assfail(char *expr, char *f, int l); diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 87919e1..922b793 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -6114,7 +6114,7 @@ xfs_bmap_punch_delalloc_range( if (error) { /* something screwed, just bail */ if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { - xfs_fs_cmn_err(CE_ALERT, ip->i_mount, + xfs_alert(ip->i_mount, "Failed delalloc mapping lookup ino %lld fsb %lld.", ip->i_ino, start_fsb); } diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c index e60490b..be62867 100644 --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c @@ -270,9 +270,9 @@ xfs_swap_extents( /* check inode formats now that data is flushed */ error = xfs_swap_extents_check_format(ip, tip); if (error) { - xfs_fs_cmn_err(CE_NOTE, mp, + xfs_notice(mp, "%s: inode 0x%llx format is incompatible for exchanging.", - __FILE__, ip->i_ino); + __func__, ip->i_ino); goto out_unlock; } diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index a1321bc..dba7a71 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -159,7 +159,7 @@ xfs_dir_ino_validate( XFS_AGINO_TO_INO(mp, agno, agino) == ino; if (unlikely(XFS_TEST_ERROR(!ino_ok, mp, XFS_ERRTAG_DIR_INO_VALIDATE, XFS_RANDOM_DIR_INO_VALIDATE))) { - xfs_fs_cmn_err(CE_WARN, mp, "Invalid inode number 0x%Lx", + xfs_warn(mp, "Invalid inode number 0x%Lx", (unsigned long long) ino); XFS_ERROR_REPORT("xfs_dir_ino_validate", XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index cec89dd..f12507d 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -382,8 +382,8 @@ xfs_growfs_data_private( XFS_AGB_TO_DADDR(mp, agno, XFS_SB_BLOCK(mp)), XFS_FSS_TO_BB(mp, 1), 0, &bp); if (error) { - xfs_fs_cmn_err(CE_WARN, mp, - "error %d reading secondary superblock for ag %d", + xfs_warn(mp, + "error %d reading secondary superblock for ag %d", error, agno); break; } @@ -396,7 +396,7 @@ xfs_growfs_data_private( if (!(error = xfs_bwrite(mp, bp))) { continue; } else { - xfs_fs_cmn_err(CE_WARN, mp, + xfs_warn(mp, "write error %d updating secondary superblock for ag %d", error, agno); break; /* no point in continuing */ diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 0626a32..fc3a2cb 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1218,10 +1218,9 @@ xfs_imap_lookup( error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); if (error) { - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "xfs_ialloc_read_agi() returned " - "error %d, agno %d", - error, agno); + xfs_alert(mp, + "%s: xfs_ialloc_read_agi() returned error %d, agno %d", + __func__, error, agno); return error; } @@ -1299,24 +1298,21 @@ xfs_imap( if (flags & XFS_IGET_UNTRUSTED) return XFS_ERROR(EINVAL); if (agno >= mp->m_sb.sb_agcount) { - xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_imap: agno (%d) >= " - "mp->m_sb.sb_agcount (%d)", - agno, mp->m_sb.sb_agcount); + xfs_alert(mp, + "%s: agno (%d) >= mp->m_sb.sb_agcount (%d)", + __func__, agno, mp->m_sb.sb_agcount); } if (agbno >= mp->m_sb.sb_agblocks) { - xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_imap: agbno (0x%llx) >= " - "mp->m_sb.sb_agblocks (0x%lx)", - (unsigned long long) agbno, - (unsigned long) mp->m_sb.sb_agblocks); + xfs_alert(mp, + "%s: agbno (0x%llx) >= mp->m_sb.sb_agblocks (0x%lx)", + __func__, (unsigned long long)agbno, + (unsigned long)mp->m_sb.sb_agblocks); } if (ino != XFS_AGINO_TO_INO(mp, agno, agino)) { - xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_imap: ino (0x%llx) != " - "XFS_AGINO_TO_INO(mp, agno, agino) " - "(0x%llx)", - ino, XFS_AGINO_TO_INO(mp, agno, agino)); + xfs_alert(mp, + "%s: ino (0x%llx) != XFS_AGINO_TO_INO() (0x%llx)", + __func__, ino, + XFS_AGINO_TO_INO(mp, agno, agino)); } xfs_stack_trace(); #endif /* DEBUG */ @@ -1388,10 +1384,9 @@ out_map: */ if ((imap->im_blkno + imap->im_len) > XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)) { - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "(imap->im_blkno (0x%llx) + imap->im_len (0x%llx)) > " - " XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks) (0x%llx)", - (unsigned long long) imap->im_blkno, + xfs_alert(mp, + "%s: (im_blkno (0x%llx) + im_len (0x%llx)) > sb_dblocks (0x%llx)", + __func__, (unsigned long long) imap->im_blkno, (unsigned long long) imap->im_len, XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)); return XFS_ERROR(EINVAL); diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 85c5410..60f2dd5 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -110,8 +110,8 @@ xfs_inobp_check( dip = (xfs_dinode_t *)xfs_buf_offset(bp, i * mp->m_sb.sb_inodesize); if (!dip->di_next_unlinked) { - xfs_fs_cmn_err(CE_ALERT, mp, - "Detected a bogus zero next_unlinked field in incore inode buffer 0x%p. About to pop an ASSERT.", + xfs_alert(mp, + "Detected bogus zero next_unlinked field in incore inode buffer 0x%p.", bp); ASSERT(dip->di_next_unlinked); } @@ -806,11 +806,9 @@ xfs_iread( */ if (be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC) { #ifdef DEBUG - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_iread: " - "dip->di_magic (0x%x) != " - "XFS_DINODE_MAGIC (0x%x)", - be16_to_cpu(dip->di_magic), - XFS_DINODE_MAGIC); + xfs_alert(mp, + "%s: dip->di_magic (0x%x) != XFS_DINODE_MAGIC (0x%x)", + __func__, be16_to_cpu(dip->di_magic), XFS_DINODE_MAGIC); #endif /* DEBUG */ error = XFS_ERROR(EINVAL); goto out_brelse; @@ -828,9 +826,8 @@ xfs_iread( error = xfs_iformat(ip, dip); if (error) { #ifdef DEBUG - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_iread: " - "xfs_iformat() returned error %d", - error); + xfs_alert(mp, "%s: xfs_iformat() returned error %d", + __func__, error); #endif /* DEBUG */ goto out_brelse; } diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 1b43ad3..e39b082 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -881,8 +881,9 @@ xfs_update_alignment(xfs_mount_t *mp) if (mp->m_flags & XFS_MOUNT_RETERR) { return XFS_ERROR(EINVAL); } - xfs_fs_cmn_err(CE_WARN, mp, -"stripe alignment turned off: sunit(%d)/swidth(%d) incompatible with agsize(%d)", + xfs_warn(mp, + "stripe alignment turned off: sunit(%d)/swidth(%d) " + "incompatible with agsize(%d)", mp->m_dalign, mp->m_swidth, sbp->sb_agblocks); @@ -892,9 +893,9 @@ xfs_update_alignment(xfs_mount_t *mp) mp->m_swidth = XFS_BB_TO_FSBT(mp, mp->m_swidth); } else { if (mp->m_flags & XFS_MOUNT_RETERR) { - xfs_fs_cmn_err(CE_WARN, mp, -"stripe alignment turned off: sunit(%d) less than bsize(%d)", - mp->m_dalign, + xfs_warn(mp, + "stripe alignment turned off: sunit(%d) less than bsize(%d)", + mp->m_dalign, mp->m_blockmask +1); return XFS_ERROR(EINVAL); } @@ -1100,7 +1101,7 @@ xfs_mount_reset_sbqflags( return 0; #ifdef QUOTADEBUG - xfs_fs_cmn_err(CE_NOTE, mp, "Writing superblock quota changes"); + xfs_notice(mp, "Writing superblock quota changes"); #endif tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE); @@ -1108,8 +1109,7 @@ xfs_mount_reset_sbqflags( XFS_DEFAULT_LOG_COUNT); if (error) { xfs_trans_cancel(tp, 0); - xfs_fs_cmn_err(CE_ALERT, mp, - "xfs_mount_reset_sbqflags: Superblock update failed!"); + xfs_alert(mp, "%s: Superblock update failed!", __func__); return error; } diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index d8e6f8c..d34533d 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -1208,12 +1208,12 @@ xfs_inactive( */ error = xfs_bmap_finish(&tp, &free_list, &committed); if (error) - xfs_fs_cmn_err(CE_NOTE, mp, "xfs_inactive: " - "xfs_bmap_finish() returned error %d", error); + xfs_notice(mp, "%s: xfs_bmap_finish returned error %d", + __func__, error); error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); if (error) - xfs_fs_cmn_err(CE_NOTE, mp, "xfs_inactive: " - "xfs_trans_commit() returned error %d", error); + xfs_notice(mp, "%s: xfs_trans_commit returned error %d", + __func__, error); } /* -- 1.7.2.3 From SRS0+FsNL+46+fromorbit.com=dave@internode.on.net Tue Jan 11 18:34:19 2011 X-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,J_CHICKENPOX_32, J_CHICKENPOX_33,J_CHICKENPOX_43,J_CHICKENPOX_44,J_CHICKENPOX_45, J_CHICKENPOX_56,J_CHICKENPOX_63,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 p0C0YIhi124058 for ; Tue, 11 Jan 2011 18:34:19 -0600 X-ASG-Debug-ID: 1294792588-457102260000-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 60BD01D2641E for ; Tue, 11 Jan 2011 16:36:28 -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 PuQcMrFtoHpqumnN for ; Tue, 11 Jan 2011 16:36:28 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52263213-1927428 for ; Wed, 12 Jan 2011 11:06:26 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcohM-0000V3-I5 for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:36:24 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pcogv-0002GT-49 for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:35:57 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 11/12] xfs: Convert remaining cmn_err() callers to new API Subject: [PATCH 11/12] xfs: Convert remaining cmn_err() callers to new API Date: Wed, 12 Jan 2011 11:35:52 +1100 Message-Id: <1294792553-8378-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294792553-8378-1-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1294792590 X-Barracuda-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.52113 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 Once converted, kill the remainder of the cmn_err() interface. Signed-off-by: Dave Chinner --- fs/xfs/quota/xfs_dquot.c | 34 ++++++++++++---------- fs/xfs/quota/xfs_qm.c | 27 ++++++++---------- fs/xfs/quota/xfs_qm_bhv.c | 3 +- fs/xfs/quota/xfs_qm_syscalls.c | 58 ++++++++++++++++++++------------------ fs/xfs/quota/xfs_trans_dquot.c | 5 ++- fs/xfs/support/debug.c | 26 ----------------- fs/xfs/support/debug.h | 12 -------- fs/xfs/xfs_bmap.c | 6 ++-- fs/xfs/xfs_buf_item.c | 15 +++++---- fs/xfs/xfs_da_btree.c | 9 ++--- fs/xfs/xfs_dir2_node.c | 25 ++++++---------- fs/xfs/xfs_error.c | 16 ++++------ fs/xfs/xfs_ialloc.c | 43 +++++++++++----------------- fs/xfs/xfs_inode.c | 30 ++++++++----------- fs/xfs/xfs_mount.c | 60 ++++++++++++++++------------------------ fs/xfs/xfs_rtalloc.c | 8 ++-- fs/xfs/xfs_rtalloc.h | 2 +- fs/xfs/xfs_rw.c | 17 +++++------ fs/xfs/xfs_trans_buf.c | 6 ++-- fs/xfs/xfs_vnodeops.c | 5 +-- 20 files changed, 169 insertions(+), 238 deletions(-) diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index e1ff7e5..7e24164 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c @@ -828,7 +828,7 @@ xfs_qm_dqget( if (xfs_do_dqerror) { if ((xfs_dqerror_target == mp->m_ddev_targp) && (xfs_dqreq_num++ % xfs_dqerror_mod) == 0) { - cmn_err(CE_DEBUG, "Returning error in dqget"); + xfs_debug(mp, "Returning error in dqget"); return (EIO); } } @@ -1427,36 +1427,38 @@ xfs_qm_dqpurge( void xfs_qm_dqprint(xfs_dquot_t *dqp) { - cmn_err(CE_DEBUG, "-----------KERNEL DQUOT----------------"); - cmn_err(CE_DEBUG, "---- dquotID = %d", + struct xfs_mount *mp = dqp->q_mount; + + xfs_debug(mp, "-----------KERNEL DQUOT----------------"); + xfs_debug(mp, "---- dquotID = %d", (int)be32_to_cpu(dqp->q_core.d_id)); - cmn_err(CE_DEBUG, "---- type = %s", DQFLAGTO_TYPESTR(dqp)); - cmn_err(CE_DEBUG, "---- fs = 0x%p", dqp->q_mount); - cmn_err(CE_DEBUG, "---- blkno = 0x%x", (int) dqp->q_blkno); - cmn_err(CE_DEBUG, "---- boffset = 0x%x", (int) dqp->q_bufoffset); - cmn_err(CE_DEBUG, "---- blkhlimit = %Lu (0x%x)", + xfs_debug(mp, "---- type = %s", DQFLAGTO_TYPESTR(dqp)); + xfs_debug(mp, "---- fs = 0x%p", dqp->q_mount); + xfs_debug(mp, "---- blkno = 0x%x", (int) dqp->q_blkno); + xfs_debug(mp, "---- boffset = 0x%x", (int) dqp->q_bufoffset); + xfs_debug(mp, "---- blkhlimit = %Lu (0x%x)", be64_to_cpu(dqp->q_core.d_blk_hardlimit), (int)be64_to_cpu(dqp->q_core.d_blk_hardlimit)); - cmn_err(CE_DEBUG, "---- blkslimit = %Lu (0x%x)", + xfs_debug(mp, "---- blkslimit = %Lu (0x%x)", be64_to_cpu(dqp->q_core.d_blk_softlimit), (int)be64_to_cpu(dqp->q_core.d_blk_softlimit)); - cmn_err(CE_DEBUG, "---- inohlimit = %Lu (0x%x)", + xfs_debug(mp, "---- inohlimit = %Lu (0x%x)", be64_to_cpu(dqp->q_core.d_ino_hardlimit), (int)be64_to_cpu(dqp->q_core.d_ino_hardlimit)); - cmn_err(CE_DEBUG, "---- inoslimit = %Lu (0x%x)", + xfs_debug(mp, "---- inoslimit = %Lu (0x%x)", be64_to_cpu(dqp->q_core.d_ino_softlimit), (int)be64_to_cpu(dqp->q_core.d_ino_softlimit)); - cmn_err(CE_DEBUG, "---- bcount = %Lu (0x%x)", + xfs_debug(mp, "---- bcount = %Lu (0x%x)", be64_to_cpu(dqp->q_core.d_bcount), (int)be64_to_cpu(dqp->q_core.d_bcount)); - cmn_err(CE_DEBUG, "---- icount = %Lu (0x%x)", + xfs_debug(mp, "---- icount = %Lu (0x%x)", be64_to_cpu(dqp->q_core.d_icount), (int)be64_to_cpu(dqp->q_core.d_icount)); - cmn_err(CE_DEBUG, "---- btimer = %d", + xfs_debug(mp, "---- btimer = %d", (int)be32_to_cpu(dqp->q_core.d_btimer)); - cmn_err(CE_DEBUG, "---- itimer = %d", + xfs_debug(mp, "---- itimer = %d", (int)be32_to_cpu(dqp->q_core.d_itimer)); - cmn_err(CE_DEBUG, "---------------------------"); + xfs_debug(mp, "---------------------------"); } #endif diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 2488e2f..3dede6a 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -80,7 +80,7 @@ xfs_qm_dquot_list_print( int i = 0; list_for_each_entry(dqp, &mp->m_quotainfo->qi_dqlist_lock, qi_mplist) { - cmn_err(CE_DEBUG, " %d. \"%d (%s)\" " + xfs_debug(mp, " %d. \"%d (%s)\" " "bcnt = %lld, icnt = %lld, refs = %d", i++, be32_to_cpu(dqp->q_core.d_id), DQFLAGTO_TYPESTR(dqp), @@ -205,7 +205,7 @@ xfs_qm_destroy( list_for_each_entry_safe(dqp, n, &xqm->qm_dqfrlist, q_freelist) { xfs_dqlock(dqp); #ifdef QUOTADEBUG - cmn_err(CE_DEBUG, "FREELIST destroy 0x%p", dqp); + xfs_debug(dqp->q_mount, "FREELIST destroy 0x%p", dqp); #endif list_del_init(&dqp->q_freelist); xfs_Gqm->qm_dqfrlist_cnt--; @@ -341,9 +341,7 @@ xfs_qm_mount_quotas( * quotas immediately. */ if (mp->m_sb.sb_rextents) { - cmn_err(CE_NOTE, - "Cannot turn on quotas for realtime filesystem %s", - mp->m_fsname); + xfs_notice(mp, "Cannot turn on quotas for realtime filesystem"); mp->m_qflags = 0; goto write_changes; } @@ -1675,7 +1673,7 @@ xfs_qm_quotacheck( */ ASSERT(list_empty(&mp->m_quotainfo->qi_dqlist)); - cmn_err(CE_NOTE, "XFS quotacheck %s: Please wait.", mp->m_fsname); + xfs_notice(mp, "Quotacheck needed: Please wait."); /* * First we go thru all the dquots on disk, USR and GRP/PRJ, and reset @@ -1753,9 +1751,9 @@ xfs_qm_quotacheck( error_return: if (error) { - cmn_err(CE_WARN, "XFS quotacheck %s: Unsuccessful (Error %d): " - "Disabling quotas.", - mp->m_fsname, error); + xfs_warn(mp, + "Quotacheck: Unsuccessful (Error %d): Disabling quotas.", + error); /* * We must turn off quotas. */ @@ -1763,12 +1761,11 @@ xfs_qm_quotacheck( ASSERT(xfs_Gqm != NULL); xfs_qm_destroy_quotainfo(mp); if (xfs_mount_reset_sbqflags(mp)) { - cmn_err(CE_WARN, "XFS quotacheck %s: " - "Failed to reset quota flags.", mp->m_fsname); + xfs_warn(mp, + "Quotacheck: Failed to reset quota flags."); } - } else { - cmn_err(CE_NOTE, "XFS quotacheck %s: Done.", mp->m_fsname); - } + } else + xfs_notice(mp, "Quotacheck: Done."); return (error); } @@ -2118,7 +2115,7 @@ xfs_qm_write_sb_changes( int error; #ifdef QUOTADEBUG - cmn_err(CE_NOTE, "Writing superblock quota changes :%s", mp->m_fsname); + xfs_notice(mp, "Writing superblock quota changes"); #endif tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE); if ((error = xfs_trans_reserve(tp, 0, diff --git a/fs/xfs/quota/xfs_qm_bhv.c b/fs/xfs/quota/xfs_qm_bhv.c index 45b5cb1..774d7ec 100644 --- a/fs/xfs/quota/xfs_qm_bhv.c +++ b/fs/xfs/quota/xfs_qm_bhv.c @@ -119,8 +119,7 @@ xfs_qm_newmount( (gquotaondisk && !XFS_IS_GQUOTA_ON(mp)) || (!gquotaondisk && XFS_IS_OQUOTA_ON(mp))) && xfs_dev_is_read_only(mp, "changing quota state")) { - cmn_err(CE_WARN, - "XFS: please mount with%s%s%s%s.", + xfs_warn(mp, "please mount with%s%s%s%s.", (!quotaondisk ? "out quota" : ""), (uquotaondisk ? " usrquota" : ""), (pquotaondisk ? " prjquota" : ""), diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 603ab86..c82f067 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -936,10 +936,11 @@ struct mutex qcheck_lock; #define DQTEST_LIST_PRINT(l, NXT, title) \ { \ xfs_dqtest_t *dqp; int i = 0;\ - cmn_err(CE_DEBUG, "%s (#%d)", title, (int) (l)->qh_nelems); \ + xfs_debug(NULL, "%s (#%d)", title, (int) (l)->qh_nelems); \ for (dqp = (xfs_dqtest_t *)(l)->qh_next; dqp != NULL; \ dqp = (xfs_dqtest_t *)dqp->NXT) { \ - cmn_err(CE_DEBUG, " %d. \"%d (%s)\" bcnt = %d, icnt = %d", \ + xfs_debug(dqp->q_mount, \ + " %d. \"%d (%s)\" bcnt = %d, icnt = %d", \ ++i, dqp->d_id, DQFLAGTO_TYPESTR(dqp), \ dqp->d_bcount, dqp->d_icount); } \ } @@ -963,16 +964,17 @@ xfs_qm_hashinsert(xfs_dqhash_t *h, xfs_dqtest_t *dqp) } STATIC void xfs_qm_dqtest_print( - xfs_dqtest_t *d) + struct xfs_mount *mp, + struct dqtest *d) { - cmn_err(CE_DEBUG, "-----------DQTEST DQUOT----------------"); - cmn_err(CE_DEBUG, "---- dquot ID = %d", d->d_id); - cmn_err(CE_DEBUG, "---- fs = 0x%p", d->q_mount); - cmn_err(CE_DEBUG, "---- bcount = %Lu (0x%x)", + xfs_debug(mp, "-----------DQTEST DQUOT----------------"); + xfs_debug(mp, "---- dquot ID = %d", d->d_id); + xfs_debug(mp, "---- fs = 0x%p", d->q_mount); + xfs_debug(mp, "---- bcount = %Lu (0x%x)", d->d_bcount, (int)d->d_bcount); - cmn_err(CE_DEBUG, "---- icount = %Lu (0x%x)", + xfs_debug(mp, "---- icount = %Lu (0x%x)", d->d_icount, (int)d->d_icount); - cmn_err(CE_DEBUG, "---------------------------"); + xfs_debug(mp, "---------------------------"); } STATIC void @@ -986,12 +988,14 @@ xfs_qm_dqtest_failed( { qmtest_nfails++; if (error) - cmn_err(CE_DEBUG, "quotacheck failed id=%d, err=%d\nreason: %s", - d->d_id, error, reason); + xfs_debug(dqp->q_mount, + "quotacheck failed id=%d, err=%d\nreason: %s", + d->d_id, error, reason); else - cmn_err(CE_DEBUG, "quotacheck failed id=%d (%s) [%d != %d]", - d->d_id, reason, (int)a, (int)b); - xfs_qm_dqtest_print(d); + xfs_debug(dqp->q_mount, + "quotacheck failed id=%d (%s) [%d != %d]", + d->d_id, reason, (int)a, (int)b); + xfs_qm_dqtest_print(dqp->q_mount, d); if (dqp) xfs_qm_dqprint(dqp); } @@ -1018,9 +1022,9 @@ xfs_dqtest_cmp2( be64_to_cpu(dqp->q_core.d_bcount) >= be64_to_cpu(dqp->q_core.d_blk_softlimit)) { if (!dqp->q_core.d_btimer && dqp->q_core.d_id) { - cmn_err(CE_DEBUG, - "%d [%s] [0x%p] BLK TIMER NOT STARTED", - d->d_id, DQFLAGTO_TYPESTR(d), d->q_mount); + xfs_debug(dqp->q_mount, + "%d [%s] BLK TIMER NOT STARTED", + d->d_id, DQFLAGTO_TYPESTR(d)); err++; } } @@ -1028,16 +1032,16 @@ xfs_dqtest_cmp2( be64_to_cpu(dqp->q_core.d_icount) >= be64_to_cpu(dqp->q_core.d_ino_softlimit)) { if (!dqp->q_core.d_itimer && dqp->q_core.d_id) { - cmn_err(CE_DEBUG, - "%d [%s] [0x%p] INO TIMER NOT STARTED", - d->d_id, DQFLAGTO_TYPESTR(d), d->q_mount); + xfs_debug(dqp->q_mount, + "%d [%s] INO TIMER NOT STARTED", + d->d_id, DQFLAGTO_TYPESTR(d)); err++; } } #ifdef QUOTADEBUG if (!err) { - cmn_err(CE_DEBUG, "%d [%s] [0x%p] qchecked", - d->d_id, DQFLAGTO_TYPESTR(d), d->q_mount); + xfs_debug(dqp->q_mount, "%d [%s] qchecked", + d->d_id, DQFLAGTO_TYPESTR(d)); } #endif return (err); @@ -1220,12 +1224,12 @@ xfs_qm_internalqcheck( xfs_qm_internalqcheck_adjust, 0, NULL, &done); if (error) { - cmn_err(CE_DEBUG, "Bulkstat returned error 0x%x", error); + xfs_debug(mp, "Bulkstat returned error 0x%x", error); break; } } while (!done); - cmn_err(CE_DEBUG, "Checking results against system dquots"); + xfs_debug(mp, "Checking results against system dquots"); for (i = 0; i < qmtest_hashmask; i++) { xfs_dqtest_t *d, *n; xfs_dqhash_t *h; @@ -1243,10 +1247,10 @@ xfs_qm_internalqcheck( } if (qmtest_nfails) { - cmn_err(CE_DEBUG, "******** quotacheck failed ********"); - cmn_err(CE_DEBUG, "failures = %d", qmtest_nfails); + xfs_debug(mp, "******** quotacheck failed ********"); + xfs_debug(mp, "failures = %d", qmtest_nfails); } else { - cmn_err(CE_DEBUG, "******** quotacheck successful! ********"); + xfs_debug(mp, "******** quotacheck successful! ********"); } kmem_free(qmtest_udqtab); kmem_free(qmtest_gdqtab); diff --git a/fs/xfs/quota/xfs_trans_dquot.c b/fs/xfs/quota/xfs_trans_dquot.c index 7de91d1..2a36487 100644 --- a/fs/xfs/quota/xfs_trans_dquot.c +++ b/fs/xfs/quota/xfs_trans_dquot.c @@ -643,8 +643,9 @@ xfs_trans_dqresv( (XFS_IS_OQUOTA_ENFORCED(dqp->q_mount) && (XFS_QM_ISPDQ(dqp) || XFS_QM_ISGDQ(dqp))))) { #ifdef QUOTADEBUG - cmn_err(CE_DEBUG, "BLK Res: nblks=%ld + resbcount=%Ld" - " > hardlimit=%Ld?", nblks, *resbcountp, hardlimit); + xfs_debug(mp, + "BLK Res: nblks=%ld + resbcount=%Ld > hardlimit=%Ld?", + nblks, *resbcountp, hardlimit); #endif if (nblks > 0) { /* diff --git a/fs/xfs/support/debug.c b/fs/xfs/support/debug.c index 98daab6..c9020ae 100644 --- a/fs/xfs/support/debug.c +++ b/fs/xfs/support/debug.c @@ -18,32 +18,6 @@ #include #include "debug.h" -/* xfs_mount.h drags a lot of crap in, sorry.. */ -#include "xfs_sb.h" -#include "xfs_inum.h" -#include "xfs_ag.h" -#include "xfs_mount.h" -#include "xfs_error.h" - -void -cmn_err( - const char *lvl, - const char *fmt, - ...) -{ - struct va_format vaf; - va_list args; - - va_start(args, fmt); - vaf.fmt = fmt; - vaf.va = &args; - - printk("%s%pV", lvl, &vaf); - va_end(args); - - BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); -} - void assfail(char *expr, char *file, int line) { diff --git a/fs/xfs/support/debug.h b/fs/xfs/support/debug.h index 4a082b9..db36be4 100644 --- a/fs/xfs/support/debug.h +++ b/fs/xfs/support/debug.h @@ -20,18 +20,6 @@ #include -struct xfs_mount; - -#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 - -void cmn_err(const char *lvl, const char *fmt, ...) - __attribute__ ((format (printf, 2, 3))); - extern void assfail(char *expr, char *f, int l); #define ASSERT_ALWAYS(expr) \ diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 922b793..e6d23a2 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -5742,7 +5742,7 @@ xfs_check_block( else thispa = XFS_BMBT_PTR_ADDR(mp, block, j, dmxr); if (*thispa == *pp) { - cmn_err(CE_WARN, "%s: thispa(%d) == pp(%d) %Ld", + xfs_warn(mp, "%s: thispa(%d) == pp(%d) %Ld", __func__, j, i, (unsigned long long)be64_to_cpu(*thispa)); panic("%s: ptrs are equal in node\n", @@ -5907,11 +5907,11 @@ xfs_bmap_check_leaf_extents( return; error0: - cmn_err(CE_WARN, "%s: at error0", __func__); + xfs_warn(mp, "%s: at error0", __func__); if (bp_release) xfs_trans_brelse(NULL, bp); error_norelse: - cmn_err(CE_WARN, "%s: BAD after btree leaves for %d extents", + xfs_warn(mp, "%s: BAD after btree leaves for %d extents", __func__, i); panic("%s: CORRUPTED BTREE OR SOMETHING", __func__); return; diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 98c6f73..169a380 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -130,10 +130,12 @@ xfs_buf_item_log_check( orig = bip->bli_orig; buffer = XFS_BUF_PTR(bp); for (x = 0; x < XFS_BUF_COUNT(bp); x++) { - if (orig[x] != buffer[x] && !btst(bip->bli_logged, x)) - cmn_err(CE_PANIC, - "xfs_buf_item_log_check bip %x buffer %x orig %x index %d", - bip, bp, orig, x); + if (orig[x] != buffer[x] && !btst(bip->bli_logged, x)) { + xfs_emerg(bp->b_mount, + "%s: bip %x buffer %x orig %x index %d", + __func__, bip, bp, orig, x); + ASSERT(0); + } } } #else @@ -981,10 +983,9 @@ xfs_buf_iodone_callbacks( if (XFS_BUF_TARGET(bp) != lasttarg || time_after(jiffies, (lasttime + 5*HZ))) { lasttime = jiffies; - cmn_err(CE_ALERT, "Device %s, XFS metadata write error" - " block 0x%llx in %s", + xfs_alert(mp, "Device %s: metadata write error block 0x%llx", XFS_BUFTARG_NAME(XFS_BUF_TARGET(bp)), - (__uint64_t)XFS_BUF_ADDR(bp), mp->m_fsname); + (__uint64_t)XFS_BUF_ADDR(bp)); } lasttarg = XFS_BUF_TARGET(bp); diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 1c00bed..6102ac6 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -1995,13 +1995,12 @@ xfs_da_do_buf( error = mappedbno == -2 ? 0 : XFS_ERROR(EFSCORRUPTED); if (unlikely(error == EFSCORRUPTED)) { if (xfs_error_level >= XFS_ERRLEVEL_LOW) { - cmn_err(CE_ALERT, "xfs_da_do_buf: bno %lld\n", - (long long)bno); - cmn_err(CE_ALERT, "dir: inode %lld\n", + xfs_alert(mp, "%s: bno %lld dir: inode %lld", + __func__, (long long)bno, (long long)dp->i_ino); for (i = 0; i < nmap; i++) { - cmn_err(CE_ALERT, - "[%02d] br_startoff %lld br_startblock %lld br_blockcount %lld br_state %d\n", + xfs_alert(mp, +"[%02d] br_startoff %lld br_startblock %lld br_blockcount %lld br_state %d", i, (long long)mapp[i].br_startoff, (long long)mapp[i].br_startblock, diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index f9a0864..a0aab7d 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -899,10 +899,9 @@ xfs_dir2_leafn_rebalance( if(blk2->index < 0) { state->inleaf = 1; blk2->index = 0; - cmn_err(CE_ALERT, - "xfs_dir2_leafn_rebalance: picked the wrong leaf? reverting original leaf: " - "blk1->index %d\n", - blk1->index); + xfs_alert(args->dp->i_mount, + "%s: picked the wrong leaf? reverting original leaf: blk1->index %d\n", + __func__, blk1->index); } } @@ -1641,26 +1640,22 @@ xfs_dir2_node_addname_int( } if (unlikely(xfs_dir2_db_to_fdb(mp, dbno) != fbno)) { - cmn_err(CE_ALERT, - "xfs_dir2_node_addname_int: dir ino " - "%llu needed freesp block %lld for\n" - " data block %lld, got %lld\n" - " ifbno %llu lastfbno %d\n", - (unsigned long long)dp->i_ino, + xfs_alert(mp, + "%s: dir ino " "%llu needed freesp block %lld for\n" + " data block %lld, got %lld ifbno %llu lastfbno %d", + __func__, (unsigned long long)dp->i_ino, (long long)xfs_dir2_db_to_fdb(mp, dbno), (long long)dbno, (long long)fbno, (unsigned long long)ifbno, lastfbno); if (fblk) { - cmn_err(CE_ALERT, - " fblk 0x%p blkno %llu " - "index %d magic 0x%x\n", + xfs_alert(mp, + " fblk 0x%p blkno %llu index %d magic 0x%x", fblk, (unsigned long long)fblk->blkno, fblk->index, fblk->magic); } else { - cmn_err(CE_ALERT, - " ... fblk is NULL\n"); + xfs_alert(mp, " ... fblk is NULL"); } XFS_ERROR_REPORT("xfs_dir2_node_addname_int", XFS_ERRLEVEL_LOW, mp); diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index 0302890..39f0633 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -48,7 +48,7 @@ xfs_error_trap(int e) break; if (e != xfs_etrap[i]) continue; - cmn_err(CE_NOTE, "xfs_error_trap: error %d", e); + xfs_notice(NULL, "%s: error %d", __func__, e); BUG(); break; } @@ -74,7 +74,7 @@ xfs_error_test(int error_tag, int *fsidp, char *expression, for (i = 0; i < XFS_NUM_INJECT_ERROR; i++) { if (xfs_etest[i] == error_tag && xfs_etest_fsid[i] == fsid) { - cmn_err(CE_WARN, + xfs_warn(NULL, "Injecting error (%s) at file %s, line %d, on filesystem \"%s\"", expression, file, line, xfs_etest_fsname[i]); return 1; @@ -95,14 +95,14 @@ xfs_errortag_add(int error_tag, xfs_mount_t *mp) for (i = 0; i < XFS_NUM_INJECT_ERROR; i++) { if (xfs_etest_fsid[i] == fsid && xfs_etest[i] == error_tag) { - cmn_err(CE_WARN, "XFS error tag #%d on", error_tag); + xfs_warn(mp, "error tag #%d on", error_tag); return 0; } } for (i = 0; i < XFS_NUM_INJECT_ERROR; i++) { if (xfs_etest[i] == 0) { - cmn_err(CE_WARN, "Turned on XFS error tag #%d", + xfs_warn(mp, "Turned on XFS error tag #%d", error_tag); xfs_etest[i] = error_tag; xfs_etest_fsid[i] = fsid; @@ -114,7 +114,7 @@ xfs_errortag_add(int error_tag, xfs_mount_t *mp) } } - cmn_err(CE_WARN, "error tag overflow, too many turned on"); + xfs_warn(mp, "error tag overflow, too many turned on"); return 1; } @@ -133,7 +133,7 @@ xfs_errortag_clearall(xfs_mount_t *mp, int loud) if ((fsid == 0LL || xfs_etest_fsid[i] == fsid) && xfs_etest[i] != 0) { cleared = 1; - cmn_err(CE_WARN, "Clearing XFS error tag #%d", + xfs_warn(mp, "Clearing XFS error tag #%d", xfs_etest[i]); xfs_etest[i] = 0; xfs_etest_fsid[i] = 0LL; @@ -144,9 +144,7 @@ xfs_errortag_clearall(xfs_mount_t *mp, int loud) } if (loud || cleared) - cmn_err(CE_WARN, - "Cleared all XFS error tags for filesystem \"%s\"", - mp->m_fsname); + xfs_warn(mp, "Cleared all XFS error tags for filesystem"); return 0; } diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index fc3a2cb..84ebeec 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1055,28 +1055,23 @@ xfs_difree( */ agno = XFS_INO_TO_AGNO(mp, inode); if (agno >= mp->m_sb.sb_agcount) { - cmn_err(CE_WARN, - "xfs_difree: agno >= mp->m_sb.sb_agcount (%d >= %d) on %s. Returning EINVAL.", - agno, mp->m_sb.sb_agcount, mp->m_fsname); + xfs_warn(mp, "%s: agno >= mp->m_sb.sb_agcount (%d >= %d).", + __func__, agno, mp->m_sb.sb_agcount); ASSERT(0); return XFS_ERROR(EINVAL); } agino = XFS_INO_TO_AGINO(mp, inode); if (inode != XFS_AGINO_TO_INO(mp, agno, agino)) { - cmn_err(CE_WARN, - "xfs_difree: inode != XFS_AGINO_TO_INO() " - "(%llu != %llu) on %s. Returning EINVAL.", - (unsigned long long)inode, - (unsigned long long)XFS_AGINO_TO_INO(mp, agno, agino), - mp->m_fsname); + xfs_warn(mp, "%s: inode != XFS_AGINO_TO_INO() (%llu != %llu).", + __func__, (unsigned long long)inode, + (unsigned long long)XFS_AGINO_TO_INO(mp, agno, agino)); ASSERT(0); return XFS_ERROR(EINVAL); } agbno = XFS_AGINO_TO_AGBNO(mp, agino); if (agbno >= mp->m_sb.sb_agblocks) { - cmn_err(CE_WARN, - "xfs_difree: agbno >= mp->m_sb.sb_agblocks (%d >= %d) on %s. Returning EINVAL.", - agbno, mp->m_sb.sb_agblocks, mp->m_fsname); + xfs_warn(mp, "%s: agbno >= mp->m_sb.sb_agblocks (%d >= %d).", + __func__, agbno, mp->m_sb.sb_agblocks); ASSERT(0); return XFS_ERROR(EINVAL); } @@ -1085,9 +1080,8 @@ xfs_difree( */ error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); if (error) { - cmn_err(CE_WARN, - "xfs_difree: xfs_ialloc_read_agi() returned an error %d on %s. Returning error.", - error, mp->m_fsname); + xfs_warn(mp, "%s: xfs_ialloc_read_agi() returned error %d.", + __func__, error); return error; } agi = XFS_BUF_TO_AGI(agbp); @@ -1106,17 +1100,15 @@ xfs_difree( * Look for the entry describing this inode. */ if ((error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i))) { - cmn_err(CE_WARN, - "xfs_difree: xfs_inobt_lookup returned() an error %d on %s. Returning error.", - error, mp->m_fsname); + xfs_warn(mp, "%s: xfs_inobt_lookup() returned error %d.", + __func__, error); goto error0; } XFS_WANT_CORRUPTED_GOTO(i == 1, error0); error = xfs_inobt_get_rec(cur, &rec, &i); if (error) { - cmn_err(CE_WARN, - "xfs_difree: xfs_inobt_get_rec() returned an error %d on %s. Returning error.", - error, mp->m_fsname); + xfs_warn(mp, "%s: xfs_inobt_get_rec() returned error %d.", + __func__, error); goto error0; } XFS_WANT_CORRUPTED_GOTO(i == 1, error0); @@ -1157,8 +1149,8 @@ xfs_difree( xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, -(ilen - 1)); if ((error = xfs_btree_delete(cur, &i))) { - cmn_err(CE_WARN, "xfs_difree: xfs_btree_delete returned an error %d on %s.\n", - error, mp->m_fsname); + xfs_warn(mp, "%s: xfs_btree_delete returned error %d.", + __func__, error); goto error0; } @@ -1170,9 +1162,8 @@ xfs_difree( error = xfs_inobt_update(cur, &rec); if (error) { - cmn_err(CE_WARN, - "xfs_difree: xfs_inobt_update returned an error %d on %s.", - error, mp->m_fsname); + xfs_warn(mp, "%s: xfs_inobt_update returned error %d.", + __func__, error); goto error0; } diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 60f2dd5..6b3424b 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -142,10 +142,9 @@ xfs_imap_to_bp( (int)imap->im_len, buf_flags, &bp); if (error) { if (error != EAGAIN) { - cmn_err(CE_WARN, - "xfs_imap_to_bp: xfs_trans_read_buf()returned " - "an error %d on %s. Returning error.", - error, mp->m_fsname); + xfs_warn(mp, + "%s: xfs_trans_read_buf() returned error %d.", + __func__, error); } else { ASSERT(buf_flags & XBF_TRYLOCK); } @@ -180,12 +179,11 @@ xfs_imap_to_bp( XFS_CORRUPTION_ERROR("xfs_imap_to_bp", XFS_ERRLEVEL_HIGH, mp, dip); #ifdef DEBUG - cmn_err(CE_PANIC, - "Device %s - bad inode magic/vsn " - "daddr %lld #%d (magic=%x)", - XFS_BUFTARG_NAME(mp->m_ddev_targp), + xfs_emerg(mp, + "bad inode magic/vsn daddr %lld #%d (magic=%x)", (unsigned long long)imap->im_blkno, i, be16_to_cpu(dip->di_magic)); + ASSERT(0); #endif xfs_trans_brelse(tp, bp); return XFS_ERROR(EFSCORRUPTED); @@ -1810,9 +1808,8 @@ xfs_iunlink_remove( */ error = xfs_itobp(mp, tp, ip, &dip, &ibp, XBF_LOCK); if (error) { - cmn_err(CE_WARN, - "xfs_iunlink_remove: xfs_itobp() returned an error %d on %s. Returning error.", - error, mp->m_fsname); + xfs_warn(mp, "%s: xfs_itobp() returned error %d.", + __func__, error); return error; } next_agino = be32_to_cpu(dip->di_next_unlinked); @@ -1857,9 +1854,9 @@ xfs_iunlink_remove( error = xfs_inotobp(mp, tp, next_ino, &last_dip, &last_ibp, &last_offset, 0); if (error) { - cmn_err(CE_WARN, - "xfs_iunlink_remove: xfs_inotobp() returned an error %d on %s. Returning error.", - error, mp->m_fsname); + xfs_warn(mp, + "%s: xfs_inotobp() returned error %d.", + __func__, error); return error; } next_agino = be32_to_cpu(last_dip->di_next_unlinked); @@ -1872,9 +1869,8 @@ xfs_iunlink_remove( */ error = xfs_itobp(mp, tp, ip, &dip, &ibp, XBF_LOCK); if (error) { - cmn_err(CE_WARN, - "xfs_iunlink_remove: xfs_itobp() returned an error %d on %s. Returning error.", - error, mp->m_fsname); + xfs_warn(mp, "%s: xfs_itobp(2) returned error %d.", + __func__, error); return error; } next_agino = be32_to_cpu(dip->di_next_unlinked); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index e39b082..bb3f9a7 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -133,9 +133,7 @@ xfs_uuid_mount( return 0; if (uuid_is_nil(uuid)) { - cmn_err(CE_WARN, - "XFS: Filesystem %s has nil UUID - can't mount", - mp->m_fsname); + xfs_warn(mp, "Filesystem has nil UUID - can't mount"); return XFS_ERROR(EINVAL); } @@ -163,8 +161,7 @@ xfs_uuid_mount( out_duplicate: mutex_unlock(&xfs_uuid_table_mutex); - cmn_err(CE_WARN, "XFS: Filesystem %s has duplicate UUID - can't mount", - mp->m_fsname); + xfs_warn(mp, "Filesystem has duplicate UUID - can't mount"); return XFS_ERROR(EINVAL); } @@ -867,8 +864,7 @@ xfs_update_alignment(xfs_mount_t *mp) if ((BBTOB(mp->m_dalign) & mp->m_blockmask) || (BBTOB(mp->m_swidth) & mp->m_blockmask)) { if (mp->m_flags & XFS_MOUNT_RETERR) { - cmn_err(CE_WARN, - "XFS: alignment check 1 failed"); + xfs_warn(mp, "alignment check 1 failed"); return XFS_ERROR(EINVAL); } mp->m_dalign = mp->m_swidth = 0; @@ -1041,14 +1037,14 @@ xfs_check_sizes(xfs_mount_t *mp) d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks); if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_dblocks) { - cmn_err(CE_WARN, "XFS: filesystem size mismatch detected"); + xfs_warn(mp, "filesystem size mismatch detected"); return XFS_ERROR(EFBIG); } bp = xfs_buf_read_uncached(mp, mp->m_ddev_targp, d - XFS_FSS_TO_BB(mp, 1), BBTOB(XFS_FSS_TO_BB(mp, 1)), 0); if (!bp) { - cmn_err(CE_WARN, "XFS: last sector read failed"); + xfs_warn(mp, "last sector read failed"); return EIO; } xfs_buf_relse(bp); @@ -1056,14 +1052,14 @@ xfs_check_sizes(xfs_mount_t *mp) if (mp->m_logdev_targp != mp->m_ddev_targp) { d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_logblocks) { - cmn_err(CE_WARN, "XFS: log size mismatch detected"); + xfs_warn(mp, "log size mismatch detected"); return XFS_ERROR(EFBIG); } bp = xfs_buf_read_uncached(mp, mp->m_logdev_targp, d - XFS_FSB_TO_BB(mp, 1), XFS_FSB_TO_B(mp, 1), 0); if (!bp) { - cmn_err(CE_WARN, "XFS: log device read failed"); + xfs_warn(mp, "log device read failed"); return EIO; } xfs_buf_relse(bp); @@ -1175,8 +1171,7 @@ xfs_mountfs( * transaction subsystem is online. */ if (xfs_sb_has_mismatched_features2(sbp)) { - cmn_err(CE_WARN, - "XFS: correcting sb_features alignment problem"); + xfs_warn(mp, "correcting sb_features alignment problem"); sbp->sb_features2 |= sbp->sb_bad_features2; sbp->sb_bad_features2 = sbp->sb_features2; mp->m_update_flags |= XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2; @@ -1255,7 +1250,7 @@ xfs_mountfs( */ error = xfs_rtmount_init(mp); if (error) { - cmn_err(CE_WARN, "XFS: RT mount failed"); + xfs_warn(mp, "RT mount failed"); goto out_remove_uuid; } @@ -1286,12 +1281,12 @@ xfs_mountfs( INIT_RADIX_TREE(&mp->m_perag_tree, GFP_ATOMIC); error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi); if (error) { - cmn_err(CE_WARN, "XFS: Failed per-ag init: %d", error); + xfs_warn(mp, "Failed per-ag init: %d", error); goto out_remove_uuid; } if (!sbp->sb_logblocks) { - cmn_err(CE_WARN, "XFS: no log defined"); + xfs_warn(mp, "no log defined"); XFS_ERROR_REPORT("xfs_mountfs", XFS_ERRLEVEL_LOW, mp); error = XFS_ERROR(EFSCORRUPTED); goto out_free_perag; @@ -1304,7 +1299,7 @@ xfs_mountfs( XFS_FSB_TO_DADDR(mp, sbp->sb_logstart), XFS_FSB_TO_BB(mp, sbp->sb_logblocks)); if (error) { - cmn_err(CE_WARN, "XFS: log mount failed"); + xfs_warn(mp, "log mount failed"); goto out_free_perag; } @@ -1341,16 +1336,14 @@ xfs_mountfs( */ error = xfs_iget(mp, NULL, sbp->sb_rootino, 0, XFS_ILOCK_EXCL, &rip); if (error) { - cmn_err(CE_WARN, "XFS: failed to read root inode"); + xfs_warn(mp, "failed to read root inode"); goto out_log_dealloc; } ASSERT(rip != NULL); if (unlikely((rip->i_d.di_mode & S_IFMT) != S_IFDIR)) { - cmn_err(CE_WARN, "XFS: corrupted root inode"); - cmn_err(CE_WARN, "Device %s - root %llu is not a directory", - XFS_BUFTARG_NAME(mp->m_ddev_targp), + xfs_warn(mp, "corrupted root inode %llu: not a directory", (unsigned long long)rip->i_ino); xfs_iunlock(rip, XFS_ILOCK_EXCL); XFS_ERROR_REPORT("xfs_mountfs_int(2)", XFS_ERRLEVEL_LOW, @@ -1370,7 +1363,7 @@ xfs_mountfs( /* * Free up the root inode. */ - cmn_err(CE_WARN, "XFS: failed to read RT inodes"); + xfs_warn(mp, "failed to read RT inodes"); goto out_rele_rip; } @@ -1382,7 +1375,7 @@ xfs_mountfs( if (mp->m_update_flags && !(mp->m_flags & XFS_MOUNT_RDONLY)) { error = xfs_mount_log_sb(mp, mp->m_update_flags); if (error) { - cmn_err(CE_WARN, "XFS: failed to write sb changes"); + xfs_warn(mp, "failed to write sb changes"); goto out_rtunmount; } } @@ -1403,10 +1396,7 @@ xfs_mountfs( * quotachecked license. */ if (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT) { - cmn_err(CE_NOTE, - "XFS: resetting qflags for filesystem %s", - mp->m_fsname); - + xfs_notice(mp, "resetting quota flags"); error = xfs_mount_reset_sbqflags(mp); if (error) return error; @@ -1420,7 +1410,7 @@ xfs_mountfs( */ error = xfs_log_mount_finish(mp); if (error) { - cmn_err(CE_WARN, "XFS: log mount finish failed"); + xfs_warn(mp, "log mount finish failed"); goto out_rtunmount; } @@ -1449,8 +1439,8 @@ xfs_mountfs( resblks = xfs_default_resblks(mp); error = xfs_reserve_blocks(mp, &resblks, NULL); if (error) - cmn_err(CE_WARN, "XFS: Unable to allocate reserve " - "blocks. Continuing without a reserve pool."); + xfs_warn(mp, + "Unable to allocate reserve blocks. Continuing without reserve pool."); } return 0; @@ -1539,12 +1529,12 @@ xfs_unmountfs( resblks = 0; error = xfs_reserve_blocks(mp, &resblks, NULL); if (error) - cmn_err(CE_WARN, "XFS: Unable to free reserved block pool. " + xfs_warn(mp, "Unable to free reserved block pool. " "Freespace may not be correct on next mount."); error = xfs_log_sbcount(mp, 1); if (error) - cmn_err(CE_WARN, "XFS: Unable to update superblock counters. " + xfs_warn(mp, "Unable to update superblock counters. " "Freespace may not be correct on next mount."); xfs_unmountfs_writesb(mp); xfs_unmountfs_wait(mp); /* wait for async bufs */ @@ -2027,10 +2017,8 @@ xfs_dev_is_read_only( if (xfs_readonly_buftarg(mp->m_ddev_targp) || xfs_readonly_buftarg(mp->m_logdev_targp) || (mp->m_rtdev_targp && xfs_readonly_buftarg(mp->m_rtdev_targp))) { - cmn_err(CE_NOTE, - "XFS: %s required on read-only device.", message); - cmn_err(CE_NOTE, - "XFS: write access unavailable, cannot proceed."); + xfs_notice(mp, "%s required on read-only device.", message); + xfs_notice(mp, "write access unavailable, cannot proceed."); return EROFS; } return 0; diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 12a1913..7cf9bbb 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -2222,8 +2222,8 @@ xfs_rtmount_init( if (sbp->sb_rblocks == 0) return 0; if (mp->m_rtdev_targp == NULL) { - cmn_err(CE_WARN, - "XFS: This filesystem has a realtime volume, use rtdev=device option"); + xfs_warn(mp, + "Filesystem has a realtime volume, use rtdev=device option"); return XFS_ERROR(ENODEV); } mp->m_rsumlevels = sbp->sb_rextslog + 1; @@ -2237,7 +2237,7 @@ xfs_rtmount_init( */ d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_rblocks); if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_rblocks) { - cmn_err(CE_WARN, "XFS: realtime mount -- %llu != %llu", + xfs_warn(mp, "realtime mount -- %llu != %llu", (unsigned long long) XFS_BB_TO_FSB(mp, d), (unsigned long long) mp->m_sb.sb_rblocks); return XFS_ERROR(EFBIG); @@ -2246,7 +2246,7 @@ xfs_rtmount_init( d - XFS_FSB_TO_BB(mp, 1), XFS_FSB_TO_B(mp, 1), 0); if (!bp) { - cmn_err(CE_WARN, "XFS: realtime device size check failed"); + xfs_warn(mp, "realtime device size check failed"); return EIO; } xfs_buf_relse(bp); diff --git a/fs/xfs/xfs_rtalloc.h b/fs/xfs/xfs_rtalloc.h index ff614c2..09e1f4f 100644 --- a/fs/xfs/xfs_rtalloc.h +++ b/fs/xfs/xfs_rtalloc.h @@ -154,7 +154,7 @@ xfs_rtmount_init( if (mp->m_sb.sb_rblocks == 0) return 0; - cmn_err(CE_WARN, "XFS: Not built with CONFIG_XFS_RT"); + xfs_warn(mp, "Not built with CONFIG_XFS_RT"); return ENOSYS; } # define xfs_rtmount_inodes(m) (((mp)->m_sb.sb_rblocks == 0)? 0 : (ENOSYS)) diff --git a/fs/xfs/xfs_rw.c b/fs/xfs/xfs_rw.c index c3ef00d..e587401 100644 --- a/fs/xfs/xfs_rw.c +++ b/fs/xfs/xfs_rw.c @@ -49,9 +49,9 @@ xfs_do_force_shutdown( logerror = flags & SHUTDOWN_LOG_IO_ERROR; if (!(flags & SHUTDOWN_FORCE_UMOUNT)) { - cmn_err(CE_NOTE, "xfs_force_shutdown(%s,0x%x) called from " - "line %d of file %s. Return address = 0x%p", - mp->m_fsname, flags, lnnum, fname, __return_address); + xfs_notice(mp, + "%s(0x%x) called from line %d of file %s. Return address = 0x%p", + __func__, flags, lnnum, fname, __return_address); } /* * No need to duplicate efforts. @@ -86,8 +86,8 @@ xfs_do_force_shutdown( } } if (!(flags & SHUTDOWN_FORCE_UMOUNT)) { - cmn_err(CE_ALERT, "Please umount the filesystem, " - "and rectify the problem(s)"); + xfs_alert(mp, + "Please umount the filesystem and rectify the problem(s)"); } } @@ -101,10 +101,9 @@ xfs_ioerror_alert( xfs_buf_t *bp, xfs_daddr_t blkno) { - cmn_err(CE_ALERT, - "I/O error in filesystem (\"%s\") meta-data dev %s block 0x%llx" - " (\"%s\") error %d buf count %zd", - (!mp || !mp->m_fsname) ? "(fs name not set)" : mp->m_fsname, + xfs_alert(mp, + "I/O error occurred: meta-data dev %s block 0x%llx" + " (\"%s\") error %d buf count %zd", XFS_BUFTARG_NAME(XFS_BUF_TARGET(bp)), (__uint64_t)blkno, func, XFS_BUF_GETERROR(bp), XFS_BUF_COUNT(bp)); diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index c47918c..3bea661 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -305,7 +305,7 @@ xfs_trans_read_buf( if (xfs_error_target == target) { if (((xfs_req_num++) % xfs_error_mod) == 0) { xfs_buf_relse(bp); - cmn_err(CE_DEBUG, "Returning error!\n"); + xfs_debug(mp, "Returning error!"); return XFS_ERROR(EIO); } } @@ -403,7 +403,7 @@ xfs_trans_read_buf( xfs_force_shutdown(tp->t_mountp, SHUTDOWN_META_IO_ERROR); xfs_buf_relse(bp); - cmn_err(CE_DEBUG, "Returning trans error!\n"); + xfs_debug(mp, "Returning trans error!"); return XFS_ERROR(EIO); } } @@ -427,7 +427,7 @@ shutdown_abort: */ #if defined(DEBUG) if (XFS_BUF_ISSTALE(bp) && XFS_BUF_ISDELAYWRITE(bp)) - cmn_err(CE_NOTE, "about to pop assert, bp == 0x%p", bp); + xfs_notice(mp, "about to pop assert, bp == 0x%p", bp); #endif ASSERT((XFS_BUF_BFLAGS(bp) & (XBF_STALE|XBF_DELWRI)) != (XBF_STALE|XBF_DELWRI)); diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index d34533d..6848b2f 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -1189,9 +1189,8 @@ xfs_inactive( * inode might be lost for a long time or forever. */ if (!XFS_FORCED_SHUTDOWN(mp)) { - cmn_err(CE_NOTE, - "xfs_inactive: xfs_ifree() returned an error = %d on %s", - error, mp->m_fsname); + xfs_notice(mp, "%s: xfs_ifree returned error %d", + __func__, error); xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); } xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); -- 1.7.2.3 From SRS0+ung/+46+fromorbit.com=dave@internode.on.net Tue Jan 11 18:34:26 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0C0YQIV124098 for ; Tue, 11 Jan 2011 18:34:26 -0600 X-ASG-Debug-ID: 1294792597-36f502f30000-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 C49E71D26420 for ; Tue, 11 Jan 2011 16:36: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 gn0luySehMtgHVjD for ; Tue, 11 Jan 2011 16:36:37 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52410144-1927428 for ; Wed, 12 Jan 2011 11:06:36 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcohM-0000Uc-Ab for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:36:24 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pcogu-0002GI-Sh for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:35:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 07/12] xfs: kill xfs_fs_mount_cmn_err() macro Subject: [PATCH 07/12] xfs: kill xfs_fs_mount_cmn_err() macro Date: Wed, 12 Jan 2011 11:35:48 +1100 Message-Id: <1294792553-8378-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294792553-8378-1-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1294792598 X-Barracuda-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.52113 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 xfs_fs_mount_cmn_err() hide a simple check as to whether the mount path should output an error or not. Remove the macro and open code the check. Signed-off-by: Dave Chinner --- fs/xfs/xfs_error.h | 6 ---- fs/xfs/xfs_mount.c | 72 +++++++++++++++++++++++++++++++--------------------- 2 files changed, 43 insertions(+), 35 deletions(-) diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index 4c8b500..e836051 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h @@ -162,10 +162,4 @@ struct xfs_mount; extern void xfs_hex_dump(void *p, int length); -#define xfs_fs_mount_cmn_err(f, 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_mount.c b/fs/xfs/xfs_mount.c index d447aef..1b43ad3 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -311,6 +311,8 @@ xfs_mount_validate_sb( xfs_sb_t *sbp, int flags) { + int loud = !(flags & XFS_MFSI_QUIET); + /* * If the log device and data device have the * same device number, the log is internal. @@ -319,28 +321,32 @@ xfs_mount_validate_sb( * a volume filesystem in a non-volume manner. */ if (sbp->sb_magicnum != XFS_SB_MAGIC) { - xfs_fs_mount_cmn_err(flags, "bad magic number"); + if (loud) + xfs_warn(mp, "bad magic number"); return XFS_ERROR(EWRONGFS); } if (!xfs_sb_good_version(sbp)) { - xfs_fs_mount_cmn_err(flags, "bad version"); + if (loud) + xfs_warn(mp, "bad version"); return XFS_ERROR(EWRONGFS); } if (unlikely( sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) { - xfs_fs_mount_cmn_err(flags, - "filesystem is marked as having an external log; " - "specify logdev on the\nmount command line."); + if (loud) + xfs_warn(mp, + "filesystem is marked as having an external log; " + "specify logdev on the mount command line."); return XFS_ERROR(EINVAL); } if (unlikely( sbp->sb_logstart != 0 && mp->m_logdev_targp != mp->m_ddev_targp)) { - xfs_fs_mount_cmn_err(flags, - "filesystem is marked as having an internal log; " - "do not specify logdev on\nthe mount command line."); + if (loud) + xfs_warn(mp, + "filesystem is marked as having an internal log; " + "do not specify logdev on the mount command line."); return XFS_ERROR(EINVAL); } @@ -369,7 +375,8 @@ xfs_mount_validate_sb( (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) || (sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) || (sbp->sb_imax_pct > 100 /* zero sb_imax_pct is valid */))) { - xfs_fs_mount_cmn_err(flags, "SB sanity check 1 failed"); + if (loud) + xfs_warn(mp, "SB sanity check 1 failed"); return XFS_ERROR(EFSCORRUPTED); } @@ -382,7 +389,8 @@ xfs_mount_validate_sb( (xfs_drfsbno_t)sbp->sb_agcount * sbp->sb_agblocks || sbp->sb_dblocks < (xfs_drfsbno_t)(sbp->sb_agcount - 1) * sbp->sb_agblocks + XFS_MIN_AG_BLOCKS)) { - xfs_fs_mount_cmn_err(flags, "SB sanity check 2 failed"); + if (loud) + xfs_warn(mp, "SB sanity check 2 failed"); return XFS_ERROR(EFSCORRUPTED); } @@ -390,12 +398,12 @@ xfs_mount_validate_sb( * Until this is fixed only page-sized or smaller data blocks work. */ if (unlikely(sbp->sb_blocksize > PAGE_SIZE)) { - xfs_fs_mount_cmn_err(flags, - "file system with blocksize %d bytes", - sbp->sb_blocksize); - xfs_fs_mount_cmn_err(flags, - "only pagesize (%ld) or less will currently work.", - PAGE_SIZE); + if (loud) { + xfs_warn(mp, + "File system with blocksize %d bytes. " + "Only pagesize (%ld) or less will currently work.", + sbp->sb_blocksize, PAGE_SIZE); + } return XFS_ERROR(ENOSYS); } @@ -409,21 +417,23 @@ xfs_mount_validate_sb( case 2048: break; default: - xfs_fs_mount_cmn_err(flags, - "inode size of %d bytes not supported", - sbp->sb_inodesize); + if (loud) + xfs_warn(mp, "inode size of %d bytes not supported", + sbp->sb_inodesize); return XFS_ERROR(ENOSYS); } if (xfs_sb_validate_fsb_count(sbp, sbp->sb_dblocks) || xfs_sb_validate_fsb_count(sbp, sbp->sb_rblocks)) { - xfs_fs_mount_cmn_err(flags, - "file system too large to be mounted on this system."); + if (loud) + xfs_warn(mp, + "file system too large to be mounted on this system."); return XFS_ERROR(EFBIG); } if (unlikely(sbp->sb_inprogress)) { - xfs_fs_mount_cmn_err(flags, "file system busy"); + if (loud) + xfs_warn(mp, "file system busy"); return XFS_ERROR(EFSCORRUPTED); } @@ -431,8 +441,9 @@ xfs_mount_validate_sb( * Version 1 directory format has never worked on Linux. */ if (unlikely(!xfs_sb_version_hasdirv2(sbp))) { - xfs_fs_mount_cmn_err(flags, - "file system using version 1 directory format"); + if (loud) + xfs_warn(mp, + "file system using version 1 directory format"); return XFS_ERROR(ENOSYS); } @@ -673,6 +684,7 @@ xfs_readsb(xfs_mount_t *mp, int flags) unsigned int sector_size; xfs_buf_t *bp; int error; + int loud = !(flags & XFS_MFSI_QUIET); ASSERT(mp->m_sb_bp == NULL); ASSERT(mp->m_ddev_targp != NULL); @@ -688,7 +700,8 @@ reread: bp = xfs_buf_read_uncached(mp, mp->m_ddev_targp, XFS_SB_DADDR, sector_size, 0); if (!bp) { - xfs_fs_mount_cmn_err(flags, "SB buffer read failed"); + if (loud) + xfs_warn(mp, "SB buffer read failed"); return EIO; } @@ -699,7 +712,8 @@ reread: xfs_sb_from_disk(&mp->m_sb, XFS_BUF_TO_SBP(bp)); error = xfs_mount_validate_sb(mp, &(mp->m_sb), flags); if (error) { - xfs_fs_mount_cmn_err(flags, "SB validate failed"); + if (loud) + xfs_warn(mp, "SB validate failed"); goto release_buf; } @@ -707,9 +721,9 @@ reread: * We must be able to do sector-sized and sector-aligned IO. */ if (sector_size > mp->m_sb.sb_sectsize) { - xfs_fs_mount_cmn_err(flags, - "device supports only %u byte sectors (not %u)", - sector_size, mp->m_sb.sb_sectsize); + if (loud) + xfs_warn(mp, "device supports %u byte sectors (not %u)", + sector_size, mp->m_sb.sb_sectsize); error = ENOSYS; goto release_buf; } -- 1.7.2.3 From SRS0+aTAL+46+fromorbit.com=dave@internode.on.net Tue Jan 11 18:34:25 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0C0YPd5124096 for ; Tue, 11 Jan 2011 18:34:25 -0600 X-ASG-Debug-ID: 1294792596-5e73025b0000-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 6C25DFD4384 for ; Tue, 11 Jan 2011 16:36:37 -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 sEfGJZjegqHpEgem for ; Tue, 11 Jan 2011 16:36:37 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 7203807-1927428 for ; Wed, 12 Jan 2011 11:06:35 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcohC-0000Uh-FI for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:36:14 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pcogv-0002GO-0N for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:35:57 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 09/12] xfs: rename xfs_cmn_err_fsblock_zero() Subject: [PATCH 09/12] xfs: rename xfs_cmn_err_fsblock_zero() Date: Wed, 12 Jan 2011 11:35:50 +1100 Message-Id: <1294792553-8378-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294792553-8378-1-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1294792598 X-Barracuda-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.52114 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 "cmn_err" part ofteh function name is no longer relevant. Rename the function to xfs_alert_fsblock_zero() to match the new logging API. Signed-off-by: Dave Chinner --- fs/xfs/xfs_iomap.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 4a19da0..9bfcd58 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -101,7 +101,7 @@ xfs_iomap_eof_align_last_fsb( } STATIC int -xfs_cmn_err_fsblock_zero( +xfs_alert_fsblock_zero( xfs_inode_t *ip, xfs_bmbt_irec_t *imap) { @@ -246,7 +246,7 @@ xfs_iomap_write_direct( } if (!(imap->br_startblock || XFS_IS_REALTIME_INODE(ip))) { - error = xfs_cmn_err_fsblock_zero(ip, imap); + error = xfs_alert_fsblock_zero(ip, imap); goto error_out; } @@ -459,7 +459,7 @@ retry: } if (!(imap[0].br_startblock || XFS_IS_REALTIME_INODE(ip))) - return xfs_cmn_err_fsblock_zero(ip, &imap[0]); + return xfs_alert_fsblock_zero(ip, &imap[0]); *ret_imap = imap[0]; return 0; @@ -609,7 +609,7 @@ xfs_iomap_write_allocate( * covers at least part of the callers request */ if (!(imap->br_startblock || XFS_IS_REALTIME_INODE(ip))) - return xfs_cmn_err_fsblock_zero(ip, imap); + return xfs_alert_fsblock_zero(ip, imap); if ((offset_fsb >= imap->br_startoff) && (offset_fsb < (imap->br_startoff + @@ -719,7 +719,7 @@ xfs_iomap_write_unwritten( return XFS_ERROR(error); if (!(imap.br_startblock || XFS_IS_REALTIME_INODE(ip))) - return xfs_cmn_err_fsblock_zero(ip, &imap); + return xfs_alert_fsblock_zero(ip, &imap); if ((numblks_fsb = imap.br_blockcount) == 0) { /* -- 1.7.2.3 From SRS0+ung/+46+fromorbit.com=dave@internode.on.net Tue Jan 11 18:43:57 2011 X-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_32, J_CHICKENPOX_33,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 p0C0hvXu124866 for ; Tue, 11 Jan 2011 18:43:57 -0600 X-ASG-Debug-ID: 1294792576-4370012c0000-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 8F300256222 for ; Tue, 11 Jan 2011 16:36:17 -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 FUxR8AKVTHIe5fJM for ; Tue, 11 Jan 2011 16:36:17 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52231955-1927428 for ; Wed, 12 Jan 2011 11:06:16 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcohC-0000UW-7x for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:36:14 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pcogu-0002GC-PE for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:35:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 05/12] xfs: convert xfs_cmn_err to xfs_alert_tag Subject: [PATCH 05/12] xfs: convert xfs_cmn_err to xfs_alert_tag Date: Wed, 12 Jan 2011 11:35:46 +1100 Message-Id: <1294792553-8378-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294792553-8378-1-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1294792578 X-Barracuda-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.52113 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 Continue the conversion of the old cmn_err interface be converting all the conditional panic tag errors to xfs_alert_tag() and then removing xfs_cmn_err(). Signed-off-by: Dave Chinner --- fs/xfs/support/debug.c | 28 ---------------------------- fs/xfs/support/debug.h | 2 -- fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_error.c | 5 ++--- fs/xfs/xfs_error.h | 6 ++---- fs/xfs/xfs_inode.c | 40 ++++++++++++++++++++-------------------- fs/xfs/xfs_iomap.c | 2 +- fs/xfs/xfs_rw.c | 23 +++++++++-------------- fs/xfs/xfs_trans_ail.c | 2 +- 9 files changed, 36 insertions(+), 74 deletions(-) diff --git a/fs/xfs/support/debug.c b/fs/xfs/support/debug.c index 262b099..b93b75d 100644 --- a/fs/xfs/support/debug.c +++ b/fs/xfs/support/debug.c @@ -64,34 +64,6 @@ xfs_fs_cmn_err( BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); } -/* All callers to xfs_cmn_err use CE_ALERT, so don't bother testing lvl */ -void -xfs_cmn_err( - int panic_tag, - const char *lvl, - struct xfs_mount *mp, - const char *fmt, - ...) -{ - struct va_format vaf; - va_list args; - int panic = 0; - - if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) { - printk(KERN_ALERT "XFS: Transforming an alert into a BUG."); - panic = 1; - } - - va_start(args, fmt); - vaf.fmt = fmt; - vaf.va = &args; - - printk(KERN_ALERT "Filesystem %s: %pV", mp->m_fsname, &vaf); - va_end(args); - - BUG_ON(panic); -} - void assfail(char *expr, char *file, int line) { diff --git a/fs/xfs/support/debug.h b/fs/xfs/support/debug.h index 05699f6..eaeaa17 100644 --- a/fs/xfs/support/debug.h +++ b/fs/xfs/support/debug.h @@ -33,8 +33,6 @@ void cmn_err(const char *lvl, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); void xfs_fs_cmn_err( const char *lvl, struct xfs_mount *mp, const char *fmt, ...) __attribute__ ((format (printf, 3, 4))); -void xfs_cmn_err( int panic_tag, const char *lvl, struct xfs_mount *mp, - const char *fmt, ...) __attribute__ ((format (printf, 4, 5))); extern void assfail(char *expr, char *f, int l); diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 4111cd3..500c5c7 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -3500,7 +3500,7 @@ xfs_bmap_search_extents( if (unlikely(!(gotp->br_startblock) && (*lastxp != NULLEXTNUM) && !(XFS_IS_REALTIME_INODE(ip) && fork == XFS_DATA_FORK))) { - xfs_cmn_err(XFS_PTAG_FSBLOCK_ZERO, CE_ALERT, ip->i_mount, + xfs_alert_tag(ip->i_mount, XFS_PTAG_FSBLOCK_ZERO, "Access to block zero in inode %llu " "start_block: %llx start_off: %llx " "blkcnt: %llx extent-state: %x lastx: %x\n", diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index 4c7db74..34f0e2d 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -162,9 +162,8 @@ xfs_error_report( inst_t *ra) { if (level <= xfs_error_level) { - xfs_cmn_err(XFS_PTAG_ERROR_REPORT, - CE_ALERT, mp, - "XFS internal error %s at line %d of file %s. Caller 0x%p\n", + xfs_alert_tag(mp, XFS_PTAG_ERROR_REPORT, + "Internal error %s at line %d of file %s. Caller 0x%p\n", tag, linenum, filename, ra); xfs_stack_trace(); diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index 10dce54..e1ba2d2 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h @@ -145,10 +145,8 @@ extern int xfs_errortag_clearall(struct xfs_mount *mp, int loud); #endif /* DEBUG */ /* - * XFS panic tags -- allow a call to xfs_cmn_err() be turned into - * a panic by setting xfs_panic_mask in a - * sysctl. update xfs_max[XFS_PARAM] if - * more are added. + * XFS panic tags -- allow a call to xfs_alert_tag() be turned into + * a panic by setting xfs_panic_mask in a sysctl. */ #define XFS_NO_PTAG 0 #define XFS_PTAG_IFLUSH 0x00000001 diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index be7cf62..a035fa8 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2939,16 +2939,16 @@ xfs_iflush_int( if (XFS_TEST_ERROR(be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC, mp, XFS_ERRTAG_IFLUSH_1, XFS_RANDOM_IFLUSH_1)) { - xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp, - "xfs_iflush: Bad inode %Lu magic number 0x%x, ptr 0x%p", - ip->i_ino, be16_to_cpu(dip->di_magic), dip); + xfs_alert_tag(mp, XFS_PTAG_IFLUSH, + "%s: Bad inode %Lu magic number 0x%x, ptr 0x%p", + __func__, ip->i_ino, be16_to_cpu(dip->di_magic), dip); goto corrupt_out; } if (XFS_TEST_ERROR(ip->i_d.di_magic != XFS_DINODE_MAGIC, mp, XFS_ERRTAG_IFLUSH_2, XFS_RANDOM_IFLUSH_2)) { - xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp, - "xfs_iflush: Bad inode %Lu, ptr 0x%p, magic number 0x%x", - ip->i_ino, ip, ip->i_d.di_magic); + xfs_alert_tag(mp, XFS_PTAG_IFLUSH, + "%s: Bad inode %Lu, ptr 0x%p, magic number 0x%x", + __func__, ip->i_ino, ip, ip->i_d.di_magic); goto corrupt_out; } if ((ip->i_d.di_mode & S_IFMT) == S_IFREG) { @@ -2956,9 +2956,9 @@ xfs_iflush_int( (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) && (ip->i_d.di_format != XFS_DINODE_FMT_BTREE), mp, XFS_ERRTAG_IFLUSH_3, XFS_RANDOM_IFLUSH_3)) { - xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp, - "xfs_iflush: Bad regular inode %Lu, ptr 0x%p", - ip->i_ino, ip); + xfs_alert_tag(mp, XFS_PTAG_IFLUSH, + "%s: Bad regular inode %Lu, ptr 0x%p", + __func__, ip->i_ino, ip); goto corrupt_out; } } else if ((ip->i_d.di_mode & S_IFMT) == S_IFDIR) { @@ -2967,28 +2967,28 @@ xfs_iflush_int( (ip->i_d.di_format != XFS_DINODE_FMT_BTREE) && (ip->i_d.di_format != XFS_DINODE_FMT_LOCAL), mp, XFS_ERRTAG_IFLUSH_4, XFS_RANDOM_IFLUSH_4)) { - xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp, - "xfs_iflush: Bad directory inode %Lu, ptr 0x%p", - ip->i_ino, ip); + xfs_alert_tag(mp, XFS_PTAG_IFLUSH, + "%s: Bad directory inode %Lu, ptr 0x%p", + __func__, ip->i_ino, ip); goto corrupt_out; } } if (XFS_TEST_ERROR(ip->i_d.di_nextents + ip->i_d.di_anextents > ip->i_d.di_nblocks, mp, XFS_ERRTAG_IFLUSH_5, XFS_RANDOM_IFLUSH_5)) { - xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp, - "xfs_iflush: detected corrupt incore inode %Lu, total extents = %d, nblocks = %Ld, ptr 0x%p", - ip->i_ino, + xfs_alert_tag(mp, XFS_PTAG_IFLUSH, + "%s: detected corrupt incore inode %Lu, " + "total extents = %d, nblocks = %Ld, ptr 0x%p", + __func__, ip->i_ino, ip->i_d.di_nextents + ip->i_d.di_anextents, - ip->i_d.di_nblocks, - ip); + ip->i_d.di_nblocks, ip); goto corrupt_out; } if (XFS_TEST_ERROR(ip->i_d.di_forkoff > mp->m_sb.sb_inodesize, mp, XFS_ERRTAG_IFLUSH_6, XFS_RANDOM_IFLUSH_6)) { - xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp, - "xfs_iflush: bad inode %Lu, forkoff 0x%x, ptr 0x%p", - ip->i_ino, ip->i_d.di_forkoff, ip); + xfs_alert_tag(mp, XFS_PTAG_IFLUSH, + "%s: bad inode %Lu, forkoff 0x%x, ptr 0x%p", + __func__, ip->i_ino, ip->i_d.di_forkoff, ip); goto corrupt_out; } /* diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 55582bd..4a19da0 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -105,7 +105,7 @@ xfs_cmn_err_fsblock_zero( xfs_inode_t *ip, xfs_bmbt_irec_t *imap) { - xfs_cmn_err(XFS_PTAG_FSBLOCK_ZERO, CE_ALERT, ip->i_mount, + xfs_alert_tag(ip->i_mount, XFS_PTAG_FSBLOCK_ZERO, "Access to block zero in inode %llu " "start_block: %llx start_off: %llx " "blkcnt: %llx extent-state: %x\n", diff --git a/fs/xfs/xfs_rw.c b/fs/xfs/xfs_rw.c index 56861d5..c3ef00d 100644 --- a/fs/xfs/xfs_rw.c +++ b/fs/xfs/xfs_rw.c @@ -69,25 +69,20 @@ xfs_do_force_shutdown( return; if (flags & SHUTDOWN_CORRUPT_INCORE) { - xfs_cmn_err(XFS_PTAG_SHUTDOWN_CORRUPT, CE_ALERT, mp, - "Corruption of in-memory data detected. Shutting down filesystem: %s", - mp->m_fsname); - if (XFS_ERRLEVEL_HIGH <= xfs_error_level) { + xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_CORRUPT, + "Corruption of in-memory data detected. Shutting down filesystem"); + if (XFS_ERRLEVEL_HIGH <= xfs_error_level) xfs_stack_trace(); - } } else if (!(flags & SHUTDOWN_FORCE_UMOUNT)) { if (logerror) { - xfs_cmn_err(XFS_PTAG_SHUTDOWN_LOGERROR, CE_ALERT, mp, - "Log I/O Error Detected. Shutting down filesystem: %s", - mp->m_fsname); + xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_LOGERROR, + "Log I/O Error Detected. Shutting down filesystem"); } else if (flags & SHUTDOWN_DEVICE_REQ) { - xfs_cmn_err(XFS_PTAG_SHUTDOWN_IOERROR, CE_ALERT, mp, - "All device paths lost. Shutting down filesystem: %s", - mp->m_fsname); + xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_IOERROR, + "All device paths lost. Shutting down filesystem"); } else if (!(flags & SHUTDOWN_REMOTE_REQ)) { - xfs_cmn_err(XFS_PTAG_SHUTDOWN_IOERROR, CE_ALERT, mp, - "I/O Error Detected. Shutting down filesystem: %s", - mp->m_fsname); + xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_IOERROR, + "I/O Error Detected. Shutting down filesystem"); } } if (!(flags & SHUTDOWN_FORCE_UMOUNT)) { diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index c5bbbc4..12aff95 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -563,7 +563,7 @@ xfs_trans_ail_delete_bulk( spin_unlock(&ailp->xa_lock); if (!XFS_FORCED_SHUTDOWN(mp)) { - xfs_cmn_err(XFS_PTAG_AILDELETE, CE_ALERT, mp, + xfs_alert_tag(mp, XFS_PTAG_AILDELETE, "%s: attempting to delete a log item that is not in the AIL", __func__); xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); -- 1.7.2.3 From SRS0+MW4R+46+fromorbit.com=dave@internode.on.net Tue Jan 11 18:44:07 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0C0i77o124890 for ; Tue, 11 Jan 2011 18:44:07 -0600 X-ASG-Debug-ID: 1294792585-32e401f50000-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 9E63D256223 for ; Tue, 11 Jan 2011 16:36:26 -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 wiDzD6mCjvhw6TBb for ; Tue, 11 Jan 2011 16:36:26 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52672234-1927428 for ; Wed, 12 Jan 2011 11:06:25 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcohC-0000UP-1H for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:36:14 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pcogu-0002Fz-Fi for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:35:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [RFC, PATCH 0/12] xfs: rework error logging infrastructure Subject: [RFC, PATCH 0/12] xfs: rework error logging infrastructure Date: Wed, 12 Jan 2011 11:35:41 +1100 Message-Id: <1294792553-8378-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: 1294792587 X-Barracuda-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.52113 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 completely reworks the cmn_err logging infrastructure by replacing it with a simple, consistent API that can be used everwhere. IOWs, this series replaces the various cmn_err APIs: cmn_err() xfs_cmn_err() xfs_fs_cmn_err() xfs_fs_mount_cmn_err() xfs_fs_repair_cmn_err() xlog_warn() xlog_panic() xlog_exit() With the following log level specific functions: xfs_emerg(mp, ....) xfs_alert(mp, ....) xfs_alert_tag(mp, int tag, ....) xfs_crit(mp, ....) xfs_err(mp, ....) xfs_warn(mp, ....) xfs_notice(mp, ....) xfs_info(mp, ....) xfs_debug(mp, ....) and a generic printk function that uses the kernel log level definitions(e.g. KERN_WARN): xfs_printk(level, mp, ....) This provides all the log messages with a common format. If mp && mp->m_fsname exist, then the format is: "XFS (device name): " otherwise it is: "XFS: " Hence we end up with log messages looking like this: Normal mount: XFS (vda): Mounting Filesystem XFS (vda): Ending clean mount Bad mount options: XFS (vdb): unknown mount option [foobar]. XFS (vdb): Filesystem has duplicate UUID - can't mount Quota check: XFS (vdb): Mounting Filesystem XFS (vdb): Ending clean mount XFS (vdb): Quotacheck needed: Please wait. XFS (vdb): Quotacheck: Done. Log recovery warnings: XFS (vdb): Mounting Filesystem XFS (vdb): Invalid block length (0x2000) for buffer XFS (vdb): Ending clean mount .... XFS (vdb): Mounting Filesystem XFS (vdb): recovery required on read-only device. XFS (vdb): write access unavailable, cannot proceed. XFS (vdb): log mount/recovery failed: error 30 XFS (vdb): log mount failed XFS (vdb): Disabling barriers, underlying device is readonly XFS (vdb): Mounting filesystem in no-recovery mode. Filesystem will be inconsistent. Forced shutdown: XFS (vdb): Mounting Filesystem XFS (vdb): Ending clean mount XFS (vdb): xfs_log_force: error 5 returned. XFS (vdb): xfs_log_force: error 5 returned. XFS (vdb): xfs_do_force_shutdown(0x1) called from line 1046 of file fs/xfs/linux-2.6/xfs_buf.c. Return address = 0xffffffff814acd93 XFS (vdb): xfs_log_force: error 5 returned. XFS (vdb): xfs_log_force: error 5 returned. And so on. The other main change that pervades this series is that as I've touched each log messsage that quotes the function name, I've converted them to "%s:....", __func__, ... format. This shortens the message format string and also makes it easier to grep the source code to find the function definition. Comments welcome. Diffstat: fs/xfs/Makefile | 2 +- fs/xfs/linux-2.6/kmem.c | 9 +- fs/xfs/linux-2.6/xfs_aops.c | 6 +- fs/xfs/linux-2.6/xfs_buf.c | 17 ++-- fs/xfs/linux-2.6/xfs_linux.h | 22 ++++ fs/xfs/linux-2.6/xfs_printk.c | 133 ++++++++++++++++++++++++ fs/xfs/linux-2.6/xfs_printk.h | 38 +++++++ fs/xfs/linux-2.6/xfs_super.c | 127 ++++++++++------------- fs/xfs/linux-2.6/xfs_sync.c | 5 +- fs/xfs/linux-2.6/xfs_sysctl.c | 25 ++++- fs/xfs/quota/xfs_dquot.c | 48 +++++---- fs/xfs/quota/xfs_dquot_item.c | 5 +- fs/xfs/quota/xfs_qm.c | 42 ++++---- fs/xfs/quota/xfs_qm_bhv.c | 3 +- fs/xfs/quota/xfs_qm_syscalls.c | 85 ++++++++-------- fs/xfs/quota/xfs_trans_dquot.c | 5 +- fs/xfs/support/debug.c | 115 --------------------- fs/xfs/support/debug.h | 54 ---------- fs/xfs/xfs_bmap.c | 17 ++-- fs/xfs/xfs_buf_item.c | 15 ++-- fs/xfs/xfs_da_btree.c | 9 +- fs/xfs/xfs_dfrag.c | 4 +- fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_dir2_node.c | 25 ++--- fs/xfs/xfs_error.c | 53 ++-------- fs/xfs/xfs_error.h | 29 +----- fs/xfs/xfs_fsops.c | 6 +- fs/xfs/xfs_ialloc.c | 82 ++++++--------- fs/xfs/xfs_inode.c | 124 ++++++++++------------ fs/xfs/xfs_iomap.c | 12 +- fs/xfs/xfs_log.c | 124 +++++++++++------------ fs/xfs/xfs_log_priv.h | 4 - fs/xfs/xfs_log_recover.c | 223 +++++++++++++++++++-------------------- fs/xfs/xfs_mount.c | 148 ++++++++++++++------------- fs/xfs/xfs_quota.h | 3 +- fs/xfs/xfs_rtalloc.c | 8 +- fs/xfs/xfs_rtalloc.h | 2 +- fs/xfs/xfs_rw.c | 40 +++---- fs/xfs/xfs_trans_ail.c | 2 +- fs/xfs/xfs_trans_buf.c | 6 +- fs/xfs/xfs_vnodeops.c | 13 +-- 41 files changed, 808 insertions(+), 884 deletions(-) From SRS0+ung/+46+fromorbit.com=dave@internode.on.net Tue Jan 11 18:44:09 2011 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_00,J_CHICKENPOX_61, 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 p0C0i9Sb124899 for ; Tue, 11 Jan 2011 18:44:09 -0600 X-ASG-Debug-ID: 1294792597-32e502130000-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 A4224256226 for ; Tue, 11 Jan 2011 16:36:37 -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 l1jjowIw1SjpIU3o for ; Tue, 11 Jan 2011 16:36:37 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52939888-1927428 for ; Wed, 12 Jan 2011 11:06:36 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcohC-0000UX-9e for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:36:14 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pcogu-0002GF-Qx for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:35:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 06/12] xfs: kill xfs_fs_repair_cmn_err() macro Subject: [PATCH 06/12] xfs: kill xfs_fs_repair_cmn_err() macro Date: Wed, 12 Jan 2011 11:35:47 +1100 Message-Id: <1294792553-8378-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294792553-8378-1-git-send-email-david@fromorbit.com> References: <1294792553-8378-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: 1294792598 X-Barracuda-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.52113 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 In certain cases of inode corruption, the xfs_fs_repair_cmn_err() macro is used to output an extra message in the corruption report. That extra message is "unmount and run xfs_repair", which really applies to any corruption report. Each case that this macro is called (except one) then calls xfs_corruption_error() to optionally dump more information about the error. Hence, move the output of "run xfs_repair" to xfs_corruption_error() so that it is output on all corruption reports as it is relevant to all corruption incidents. Also, convert the one caller of the fs_repair macro that doesn't call xfs_corruption_error() to call it, hence provide consiѕtent error reporting for all cases where xfs_fs_repair_cmn_err() used to be called. Signed-off-by: Dave Chinner --- fs/xfs/xfs_bmap.c | 7 +++---- fs/xfs/xfs_error.c | 1 + fs/xfs/xfs_error.h | 3 --- fs/xfs/xfs_inode.c | 37 +++++++++++++++---------------------- 4 files changed, 19 insertions(+), 29 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 500c5c7..87919e1 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -4174,12 +4174,11 @@ xfs_bmap_read_extents( num_recs = xfs_btree_get_numrecs(block); if (unlikely(i + num_recs > room)) { ASSERT(i + num_recs <= room); - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, + xfs_warn(ip->i_mount, "corrupt dinode %Lu, (btree extents).", (unsigned long long) ip->i_ino); - XFS_ERROR_REPORT("xfs_bmap_read_extents(1)", - XFS_ERRLEVEL_LOW, - ip->i_mount); + XFS_CORRUPTION_ERROR("xfs_bmap_read_extents(1)", + XFS_ERRLEVEL_LOW, ip->i_mount, block); goto error0; } XFS_WANT_CORRUPTED_GOTO( diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index 34f0e2d..0302890 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -183,4 +183,5 @@ xfs_corruption_error( if (level <= xfs_error_level) xfs_hex_dump(p, 16); xfs_error_report(tag, level, mp, filename, linenum, ra); + xfs_alert(mp, "Corruption detected. Unmount and run xfs_repair"); } diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index e1ba2d2..4c8b500 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h @@ -162,9 +162,6 @@ struct xfs_mount; 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...) \ do { \ if (!(f & XFS_MFSI_QUIET)) \ diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index a035fa8..85c5410 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -317,7 +317,7 @@ xfs_iformat( if (unlikely(be32_to_cpu(dip->di_nextents) + be16_to_cpu(dip->di_anextents) > be64_to_cpu(dip->di_nblocks))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, + xfs_warn(ip->i_mount, "corrupt dinode %Lu, extent total = %d, nblocks = %Lu.", (unsigned long long)ip->i_ino, (int)(be32_to_cpu(dip->di_nextents) + @@ -330,8 +330,7 @@ xfs_iformat( } if (unlikely(dip->di_forkoff > ip->i_mount->m_sb.sb_inodesize)) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt dinode %Lu, forkoff = 0x%x.", + xfs_warn(ip->i_mount, "corrupt dinode %Lu, forkoff = 0x%x.", (unsigned long long)ip->i_ino, dip->di_forkoff); XFS_CORRUPTION_ERROR("xfs_iformat(2)", XFS_ERRLEVEL_LOW, @@ -341,7 +340,7 @@ xfs_iformat( if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) && !ip->i_mount->m_rtdev_targp)) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, + xfs_warn(ip->i_mount, "corrupt dinode %Lu, has realtime flag set.", ip->i_ino); XFS_CORRUPTION_ERROR("xfs_iformat(realtime)", @@ -373,9 +372,8 @@ xfs_iformat( * no local regular files yet */ if (unlikely((be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFREG)) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu " - "(local format for regular file).", + xfs_warn(ip->i_mount, + "corrupt inode %Lu (local format for regular file).", (unsigned long long) ip->i_ino); XFS_CORRUPTION_ERROR("xfs_iformat(4)", XFS_ERRLEVEL_LOW, @@ -385,9 +383,8 @@ xfs_iformat( di_size = be64_to_cpu(dip->di_size); if (unlikely(di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu " - "(bad size %Ld for local inode).", + xfs_warn(ip->i_mount, + "corrupt inode %Lu (bad size %Ld for local inode).", (unsigned long long) ip->i_ino, (long long) di_size); XFS_CORRUPTION_ERROR("xfs_iformat(5)", @@ -431,9 +428,8 @@ xfs_iformat( size = be16_to_cpu(atp->hdr.totsize); if (unlikely(size < sizeof(struct xfs_attr_sf_hdr))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu " - "(bad attr fork size %Ld).", + xfs_warn(ip->i_mount, + "corrupt inode %Lu (bad attr fork size %Ld).", (unsigned long long) ip->i_ino, (long long) size); XFS_CORRUPTION_ERROR("xfs_iformat(8)", @@ -488,9 +484,8 @@ xfs_iformat_local( * kmem_alloc() or memcpy() below. */ if (unlikely(size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu " - "(bad size %d for local fork, size = %d).", + xfs_warn(ip->i_mount, + "corrupt inode %Lu (bad size %d for local fork, size = %d).", (unsigned long long) ip->i_ino, size, XFS_DFORK_SIZE(dip, ip->i_mount, whichfork)); XFS_CORRUPTION_ERROR("xfs_iformat_local", XFS_ERRLEVEL_LOW, @@ -547,8 +542,7 @@ xfs_iformat_extents( * kmem_alloc() or memcpy() below. */ if (unlikely(size < 0 || size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu ((a)extents = %d).", + xfs_warn(ip->i_mount, "corrupt inode %Lu ((a)extents = %d).", (unsigned long long) ip->i_ino, nex); XFS_CORRUPTION_ERROR("xfs_iformat_extents(1)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); @@ -623,11 +617,10 @@ xfs_iformat_btree( || XFS_BMDR_SPACE_CALC(nrecs) > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork) || XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) { - xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, - "corrupt inode %Lu (btree).", + xfs_warn(ip->i_mount, "corrupt inode %Lu (btree).", (unsigned long long) ip->i_ino); - XFS_ERROR_REPORT("xfs_iformat_btree", XFS_ERRLEVEL_LOW, - ip->i_mount); + XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW, + ip->i_mount, dip); return XFS_ERROR(EFSCORRUPTED); } -- 1.7.2.3 From SRS0+MW4R+46+fromorbit.com=dave@internode.on.net Tue Jan 11 18:44:09 2011 X-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_32, J_CHICKENPOX_33,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 p0C0i9HL124908 for ; Tue, 11 Jan 2011 18:44:09 -0600 X-ASG-Debug-ID: 1294792587-4370012e0000-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 533A1256224 for ; Tue, 11 Jan 2011 16:36:28 -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 dwSTtyoJDc631Cek for ; Tue, 11 Jan 2011 16:36:28 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52672235-1927428 for ; Wed, 12 Jan 2011 11:06:25 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcohC-0000UQ-1F for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:36:14 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pcogu-0002G1-Hf for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:35:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 01/12] xfs: prevent NMI timeouts in cmn_err Subject: [PATCH 01/12] xfs: prevent NMI timeouts in cmn_err Date: Wed, 12 Jan 2011 11:35:42 +1100 Message-Id: <1294792553-8378-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294792553-8378-1-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1294792589 X-Barracuda-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.52113 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 | 23 ++++++++- fs/xfs/support/debug.c | 109 +++++++++++++++++++---------------------- fs/xfs/support/debug.h | 25 ++++++--- fs/xfs/xfs_error.c | 31 ------------ fs/xfs/xfs_error.h | 18 ++----- fs/xfs/xfs_log.c | 2 +- fs/xfs/xfs_log_recover.c | 2 +- 7 files changed, 96 insertions(+), 114 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_sysctl.c b/fs/xfs/linux-2.6/xfs_sysctl.c index 7bb5092..ee3cee0 100644 --- a/fs/xfs/linux-2.6/xfs_sysctl.c +++ b/fs/xfs/linux-2.6/xfs_sysctl.c @@ -18,6 +18,7 @@ #include "xfs.h" #include #include +#include "xfs_error.h" static struct ctl_table_header *xfs_table_header; @@ -51,6 +52,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 +98,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..262b099 100644 --- a/fs/xfs/support/debug.c +++ b/fs/xfs/support/debug.c @@ -25,80 +25,71 @@ #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, ...) +cmn_err( + const char *lvl, + const 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); + struct va_format vaf; + va_list args; + + va_start(args, fmt); + vaf.fmt = fmt; + vaf.va = &args; + + printk("%s%pV", lvl, &vaf); + va_end(args); + + BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); } void -xfs_fs_vcmn_err( - int level, +xfs_fs_cmn_err( + const char *lvl, struct xfs_mount *mp, - char *fmt, - va_list ap) + const char *fmt, + ...) { - unsigned long flags; - int len = 0; + struct va_format vaf; + va_list args; - level &= XFS_ERR_MASK; - if (level > XFS_MAX_ERR_LEVEL) - level = XFS_MAX_ERR_LEVEL; + va_start(args, fmt); + vaf.fmt = fmt; + vaf.va = &args; - spin_lock_irqsave(&xfs_err_lock,flags); + printk("%sFilesystem %s: %pV", lvl, mp->m_fsname, &vaf); + va_end(args); - if (mp) { - len = sprintf(message, "Filesystem \"%s\": ", mp->m_fsname); + BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); +} + +/* All callers to xfs_cmn_err use CE_ALERT, so don't bother testing lvl */ +void +xfs_cmn_err( + int panic_tag, + const char *lvl, + struct xfs_mount *mp, + const char *fmt, + ...) +{ + struct va_format vaf; + va_list args; + int panic = 0; - /* - * Skip the printk if we can't print anything useful - * due to an over-long device name. - */ - if (len >= sizeof(message)) - goto out; + if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) { + printk(KERN_ALERT "XFS: Transforming an alert into a BUG."); + panic = 1; } - 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; + va_start(args, fmt); + vaf.fmt = fmt; + vaf.va = &args; - printk("%s%s\n", err_level[level], message); - out: - spin_unlock_irqrestore(&xfs_err_lock,flags); + printk(KERN_ALERT "Filesystem %s: %pV", mp->m_fsname, &vaf); + va_end(args); - BUG_ON(level == CE_PANIC); + BUG_ON(panic); } void diff --git a/fs/xfs/support/debug.h b/fs/xfs/support/debug.h index d2d2046..05699f6 100644 --- a/fs/xfs/support/debug.h +++ b/fs/xfs/support/debug.h @@ -20,15 +20,22 @@ #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))); +struct xfs_mount; + +#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 + +void cmn_err(const char *lvl, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); +void xfs_fs_cmn_err( const char *lvl, struct xfs_mount *mp, + const char *fmt, ...) __attribute__ ((format (printf, 3, 4))); +void xfs_cmn_err( int panic_tag, const char *lvl, struct xfs_mount *mp, + const char *fmt, ...) __attribute__ ((format (printf, 4, 5))); + 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..10dce54 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h @@ -136,8 +136,8 @@ extern int xfs_error_test(int, int *, char *, int, char *, unsigned long); xfs_error_test((tag), (mp)->m_fixedfsid, "expr", __LINE__, __FILE__, \ (rf)))) -extern int xfs_errortag_add(int error_tag, xfs_mount_t *mp); -extern int xfs_errortag_clearall(xfs_mount_t *mp, int loud); +extern int xfs_errortag_add(int error_tag, struct xfs_mount *mp); +extern int xfs_errortag_clearall(struct xfs_mount *mp, int loud); #else #define XFS_TEST_ERROR(expr, mp, tag, rf) (expr) #define xfs_errortag_add(tag, mp) (ENOSYS) @@ -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 0bf24b1..ae6fef1 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -377,7 +377,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 204d8e5..aa0ebb7 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3800,7 +3800,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 SRS0+kcZ2+46+fromorbit.com=david@internode.on.net Tue Jan 11 18:44:09 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0C0i9Fl124912 for ; Tue, 11 Jan 2011 18:44:09 -0600 X-ASG-Debug-ID: 1294793117-32e402570000-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 1D775256335 for ; Tue, 11 Jan 2011 16:45:17 -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 DOf0aurBmjvU1n4V for ; Tue, 11 Jan 2011 16:45:17 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52940840-1927428 for multiple; Wed, 12 Jan 2011 11:15:13 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pcopr-0000Wd-Dk; Wed, 12 Jan 2011 11:45:11 +1100 Date: Wed, 12 Jan 2011 11:45:11 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: aelder@sgi.com X-ASG-Orig-Subj: [GIT PULL] xfs: unaligned AIO DIO corruption fixes Subject: [GIT PULL] xfs: unaligned AIO DIO corruption fixes Message-ID: <20110112004511.GM28803@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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: 1294793119 X-Barracuda-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.52113 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 Alex, The reviewed series is ready to be pulled into the master XFS branch. Thanks. The following changes since commit d0eb2f38b250b7d6c993adf81b0e4ded0565497e: xfs: convert grant head manipulations to lockless algorithm (2010-12-21 12:29:14 +1100) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/xfsdev.git xfs-for-2.6.38 Dave Chinner (8): xfs: ensure sync write errors are returned xfs: factor common post-write isize handling code xfs: factor post-write newsize updates xfs: introduce xfs_rw_lock() helpers for locking the inode 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 | 535 +++++++++++++++++++++++++------------------ 1 files changed, 307 insertions(+), 228 deletions(-) -- Dave Chinner david@fromorbit.com From SRS0+U1xd+46+fromorbit.com=dave@internode.on.net Tue Jan 11 18:44:10 2011 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 p0C0iAqT124929 for ; Tue, 11 Jan 2011 18:44:10 -0600 X-ASG-Debug-ID: 1294792607-365d01f20000-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 4012D256228 for ; Tue, 11 Jan 2011 16:36:47 -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 IcVUQImqy9J3taY6 for ; Tue, 11 Jan 2011 16:36:47 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51913617-1927428 for ; Wed, 12 Jan 2011 11:06:46 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PcohM-0000US-3E for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:36:24 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pcogu-0002G6-Le for xfs@oss.sgi.com; Wed, 12 Jan 2011 11:35:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 03/12] xfs: Convert linux-2.6/ files to new logging interface Subject: [PATCH 03/12] xfs: Convert linux-2.6/ files to new logging interface Date: Wed, 12 Jan 2011 11:35:44 +1100 Message-Id: <1294792553-8378-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1294792553-8378-1-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1294792609 X-Barracuda-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.52113 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 files in fs/xfs/linux-2.6/ to use the new xfs_ logging format that replaces the old irix inherited cmn_err() interfaces. While there, also convert naked printk calls to use the relevant xfs logging function to standardise output format. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/kmem.c | 9 ++- fs/xfs/linux-2.6/xfs_aops.c | 6 +- fs/xfs/linux-2.6/xfs_buf.c | 17 +++--- fs/xfs/linux-2.6/xfs_super.c | 127 ++++++++++++++++++---------------------- fs/xfs/linux-2.6/xfs_sync.c | 5 +- fs/xfs/linux-2.6/xfs_sysctl.c | 2 +- 6 files changed, 76 insertions(+), 90 deletions(-) diff --git a/fs/xfs/linux-2.6/kmem.c b/fs/xfs/linux-2.6/kmem.c index 666c9db..f91ea9c 100644 --- a/fs/xfs/linux-2.6/kmem.c +++ b/fs/xfs/linux-2.6/kmem.c @@ -23,6 +23,7 @@ #include #include "time.h" #include "kmem.h" +#include "xfs_printk.h" /* * Greedy allocation. May fail and may return vmalloced memory. @@ -56,8 +57,8 @@ kmem_alloc(size_t size, unsigned int __nocast flags) if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) return ptr; if (!(++retries % 100)) - printk(KERN_ERR "XFS: possible memory allocation " - "deadlock in %s (mode:0x%x)\n", + xfs_err(NULL, + "possible memory allocation deadlock in %s (mode:0x%x)", __func__, lflags); congestion_wait(BLK_RW_ASYNC, HZ/50); } while (1); @@ -112,8 +113,8 @@ kmem_zone_alloc(kmem_zone_t *zone, unsigned int __nocast flags) if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) return ptr; if (!(++retries % 100)) - printk(KERN_ERR "XFS: possible memory allocation " - "deadlock in %s (mode:0x%x)\n", + xfs_err(NULL, + "possible memory allocation deadlock in %s (mode:0x%x)", __func__, lflags); congestion_wait(BLK_RW_ASYNC, HZ/50); } while (1); diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index ec7bbb5..8c5c872 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c @@ -854,7 +854,7 @@ xfs_aops_discard_page( if (XFS_FORCED_SHUTDOWN(ip->i_mount)) goto out_invalidate; - xfs_fs_cmn_err(CE_ALERT, ip->i_mount, + xfs_alert(ip->i_mount, "page discard on page %p, inode 0x%llx, offset %llu.", page, ip->i_ino, offset); @@ -872,7 +872,7 @@ xfs_aops_discard_page( if (error) { /* something screwed, just bail */ if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { - xfs_fs_cmn_err(CE_ALERT, ip->i_mount, + xfs_alert(ip->i_mount, "page discard unable to remove delalloc mapping."); } break; @@ -1411,7 +1411,7 @@ xfs_vm_write_failed( if (error) { /* something screwed, just bail */ if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { - xfs_fs_cmn_err(CE_ALERT, ip->i_mount, + xfs_alert(ip->i_mount, "xfs_vm_write_failed: unable to clean up ino %lld", ip->i_ino); } diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index ac1c7e8..3cc671c 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -401,9 +401,8 @@ _xfs_buf_lookup_pages( * handle buffer allocation failures we can't do much. */ if (!(++retries % 100)) - printk(KERN_ERR - "XFS: possible memory allocation " - "deadlock in %s (mode:0x%x)\n", + xfs_err(NULL, + "possible memory allocation deadlock in %s (mode:0x%x)", __func__, gfp_mask); XFS_STATS_INC(xb_page_retries); @@ -615,8 +614,8 @@ xfs_buf_get( if (!(bp->b_flags & XBF_MAPPED)) { error = _xfs_buf_map_pages(bp, flags); if (unlikely(error)) { - printk(KERN_WARNING "%s: failed to map pages\n", - __func__); + xfs_warn(target->bt_mount, + "%s: failed to map pages\n", __func__); goto no_buffer; } } @@ -850,8 +849,8 @@ xfs_buf_get_uncached( error = _xfs_buf_map_pages(bp, XBF_MAPPED); if (unlikely(error)) { - printk(KERN_WARNING "%s: failed to map pages\n", - __func__); + xfs_warn(target->bt_mount, + "%s: failed to map pages\n", __func__); goto fail_free_mem; } @@ -1617,8 +1616,8 @@ xfs_setsize_buftarg_flags( btp->bt_smask = sectorsize - 1; if (set_blocksize(btp->bt_bdev, sectorsize)) { - printk(KERN_WARNING - "XFS: Cannot set_blocksize to %u on device %s\n", + xfs_warn(btp->bt_mount, + "Cannot set_blocksize to %u on device %s\n", sectorsize, XFS_BUFTARG_NAME(btp)); return EINVAL; } diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index af32f37..78248b7 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -173,6 +173,15 @@ xfs_parseargs( __uint8_t iosizelog = 0; /* + * set up the mount name first so all the errors will refer to the + * correct device. + */ + mp->m_fsname = kstrndup(sb->s_id, MAXNAMELEN, GFP_KERNEL); + if (!mp->m_fsname) + return ENOMEM; + mp->m_fsname_len = strlen(mp->m_fsname) + 1; + + /* * Copy binary VFS mount flags we are interested in. */ if (sb->s_flags & MS_RDONLY) @@ -207,24 +216,21 @@ xfs_parseargs( if (!strcmp(this_char, MNTOPT_LOGBUFS)) { if (!value || !*value) { - cmn_err(CE_WARN, - "XFS: %s option requires an argument", + xfs_warn(mp, "%s option requires an argument", this_char); return EINVAL; } mp->m_logbufs = simple_strtoul(value, &eov, 10); } else if (!strcmp(this_char, MNTOPT_LOGBSIZE)) { if (!value || !*value) { - cmn_err(CE_WARN, - "XFS: %s option requires an argument", + xfs_warn(mp, "%s option requires an argument", this_char); return EINVAL; } mp->m_logbsize = suffix_strtoul(value, &eov, 10); } else if (!strcmp(this_char, MNTOPT_LOGDEV)) { if (!value || !*value) { - cmn_err(CE_WARN, - "XFS: %s option requires an argument", + xfs_warn(mp, "%s option requires an argument", this_char); return EINVAL; } @@ -232,14 +238,12 @@ xfs_parseargs( if (!mp->m_logname) return ENOMEM; } else if (!strcmp(this_char, MNTOPT_MTPT)) { - cmn_err(CE_WARN, - "XFS: %s option not allowed on this system", + xfs_warn(mp, "%s option not allowed on this system", this_char); return EINVAL; } else if (!strcmp(this_char, MNTOPT_RTDEV)) { if (!value || !*value) { - cmn_err(CE_WARN, - "XFS: %s option requires an argument", + xfs_warn(mp, "%s option requires an argument", this_char); return EINVAL; } @@ -248,8 +252,7 @@ xfs_parseargs( return ENOMEM; } else if (!strcmp(this_char, MNTOPT_BIOSIZE)) { if (!value || !*value) { - cmn_err(CE_WARN, - "XFS: %s option requires an argument", + xfs_warn(mp, "%s option requires an argument", this_char); return EINVAL; } @@ -257,8 +260,7 @@ xfs_parseargs( iosizelog = ffs(iosize) - 1; } else if (!strcmp(this_char, MNTOPT_ALLOCSIZE)) { if (!value || !*value) { - cmn_err(CE_WARN, - "XFS: %s option requires an argument", + xfs_warn(mp, "%s option requires an argument", this_char); return EINVAL; } @@ -280,16 +282,14 @@ xfs_parseargs( mp->m_flags |= XFS_MOUNT_SWALLOC; } else if (!strcmp(this_char, MNTOPT_SUNIT)) { if (!value || !*value) { - cmn_err(CE_WARN, - "XFS: %s option requires an argument", + xfs_warn(mp, "%s option requires an argument", this_char); return EINVAL; } dsunit = simple_strtoul(value, &eov, 10); } else if (!strcmp(this_char, MNTOPT_SWIDTH)) { if (!value || !*value) { - cmn_err(CE_WARN, - "XFS: %s option requires an argument", + xfs_warn(mp, "%s option requires an argument", this_char); return EINVAL; } @@ -297,8 +297,7 @@ xfs_parseargs( } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS; #if !XFS_BIG_INUMS - cmn_err(CE_WARN, - "XFS: %s option not allowed on this system", + xfs_warn(mp, "%s option not allowed on this system", this_char); return EINVAL; #endif @@ -356,20 +355,19 @@ xfs_parseargs( } else if (!strcmp(this_char, MNTOPT_NODELAYLOG)) { mp->m_flags &= ~XFS_MOUNT_DELAYLOG; } else if (!strcmp(this_char, "ihashsize")) { - cmn_err(CE_WARN, - "XFS: ihashsize no longer used, option is deprecated."); + xfs_warn(mp, + "ihashsize no longer used, option is deprecated."); } else if (!strcmp(this_char, "osyncisdsync")) { - cmn_err(CE_WARN, - "XFS: osyncisdsync has no effect, option is deprecated."); + xfs_warn(mp, + "osyncisdsync has no effect, option is deprecated."); } else if (!strcmp(this_char, "osyncisosync")) { - cmn_err(CE_WARN, - "XFS: osyncisosync has no effect, option is deprecated."); + xfs_warn(mp, + "osyncisosync has no effect, option is deprecated."); } else if (!strcmp(this_char, "irixsgid")) { - cmn_err(CE_WARN, - "XFS: irixsgid is now a sysctl(2) variable, option is deprecated."); + xfs_warn(mp, + "irixsgid is now a sysctl(2) variable, option is deprecated."); } else { - cmn_err(CE_WARN, - "XFS: unknown mount option [%s].", this_char); + xfs_warn(mp, "unknown mount option [%s].", this_char); return EINVAL; } } @@ -379,40 +377,37 @@ xfs_parseargs( */ if ((mp->m_flags & XFS_MOUNT_NORECOVERY) && !(mp->m_flags & XFS_MOUNT_RDONLY)) { - cmn_err(CE_WARN, "XFS: no-recovery mounts must be read-only."); + xfs_warn(mp, "no-recovery mounts must be read-only."); return EINVAL; } if ((mp->m_flags & XFS_MOUNT_NOALIGN) && (dsunit || dswidth)) { - cmn_err(CE_WARN, - "XFS: sunit and swidth options incompatible with the noalign option"); + xfs_warn(mp, + "sunit and swidth options incompatible with the noalign option"); return EINVAL; } #ifndef CONFIG_XFS_QUOTA if (XFS_IS_QUOTA_RUNNING(mp)) { - cmn_err(CE_WARN, - "XFS: quota support not available in this kernel."); + xfs_warn(mp, "quota support not available in this kernel."); return EINVAL; } #endif if ((mp->m_qflags & (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE)) && (mp->m_qflags & (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE))) { - cmn_err(CE_WARN, - "XFS: cannot mount with both project and group quota"); + xfs_warn(mp, "cannot mount with both project and group quota"); return EINVAL; } if ((dsunit && !dswidth) || (!dsunit && dswidth)) { - cmn_err(CE_WARN, - "XFS: sunit and swidth must be specified together"); + xfs_warn(mp, "sunit and swidth must be specified together"); return EINVAL; } if (dsunit && (dswidth % dsunit != 0)) { - cmn_err(CE_WARN, - "XFS: stripe width (%d) must be a multiple of the stripe unit (%d)", + xfs_warn(mp, + "stripe width (%d) must be a multiple of the stripe unit (%d)", dswidth, dsunit); return EINVAL; } @@ -438,8 +433,7 @@ done: mp->m_logbufs != 0 && (mp->m_logbufs < XLOG_MIN_ICLOGS || mp->m_logbufs > XLOG_MAX_ICLOGS)) { - cmn_err(CE_WARN, - "XFS: invalid logbufs value: %d [not %d-%d]", + xfs_warn(mp, "invalid logbufs value: %d [not %d-%d]", mp->m_logbufs, XLOG_MIN_ICLOGS, XLOG_MAX_ICLOGS); return XFS_ERROR(EINVAL); } @@ -448,22 +442,16 @@ done: (mp->m_logbsize < XLOG_MIN_RECORD_BSIZE || mp->m_logbsize > XLOG_MAX_RECORD_BSIZE || !is_power_of_2(mp->m_logbsize))) { - cmn_err(CE_WARN, - "XFS: invalid logbufsize: %d [not 16k,32k,64k,128k or 256k]", + xfs_warn(mp, + "invalid logbufsize: %d [not 16k,32k,64k,128k or 256k]", mp->m_logbsize); return XFS_ERROR(EINVAL); } - mp->m_fsname = kstrndup(sb->s_id, MAXNAMELEN, GFP_KERNEL); - if (!mp->m_fsname) - return ENOMEM; - mp->m_fsname_len = strlen(mp->m_fsname) + 1; - if (iosizelog) { if (iosizelog > XFS_MAX_IO_LOG || iosizelog < XFS_MIN_IO_LOG) { - cmn_err(CE_WARN, - "XFS: invalid log iosize: %d [not %d-%d]", + xfs_warn(mp, "invalid log iosize: %d [not %d-%d]", iosizelog, XFS_MIN_IO_LOG, XFS_MAX_IO_LOG); return XFS_ERROR(EINVAL); @@ -609,7 +597,7 @@ xfs_blkdev_get( *bdevp = open_bdev_exclusive(name, FMODE_READ|FMODE_WRITE, mp); if (IS_ERR(*bdevp)) { error = PTR_ERR(*bdevp); - printk("XFS: Invalid device [%s], error=%d\n", name, error); + xfs_warn(mp, "Invalid device [%s], error=%d\n", name, error); } return -error; @@ -663,23 +651,23 @@ xfs_mountfs_check_barriers(xfs_mount_t *mp) int error; if (mp->m_logdev_targp != mp->m_ddev_targp) { - xfs_fs_cmn_err(CE_NOTE, mp, + xfs_notice(mp, "Disabling barriers, not supported with external log device"); mp->m_flags &= ~XFS_MOUNT_BARRIER; return; } if (xfs_readonly_buftarg(mp->m_ddev_targp)) { - xfs_fs_cmn_err(CE_NOTE, mp, - "Disabling barriers, underlying device is readonly"); + xfs_notice(mp, + "Disabling barriers, underlying device is readonly"); mp->m_flags &= ~XFS_MOUNT_BARRIER; return; } error = xfs_barrier_test(mp); if (error) { - xfs_fs_cmn_err(CE_NOTE, mp, - "Disabling barriers, trial barrier write failed"); + xfs_notice(mp, + "Disabling barriers, trial barrier write failed"); mp->m_flags &= ~XFS_MOUNT_BARRIER; return; } @@ -742,8 +730,8 @@ xfs_open_devices( goto out_close_logdev; if (rtdev == ddev || rtdev == logdev) { - cmn_err(CE_WARN, - "XFS: Cannot mount filesystem with identical rtdev and ddev/logdev."); + xfs_warn(mp, + "Cannot mount filesystem with identical rtdev and ddev/logdev."); error = EINVAL; goto out_close_rtdev; } @@ -1344,8 +1332,8 @@ xfs_fs_remount( * options that we can't actually change. */ #if 0 - printk(KERN_INFO - "XFS: mount option \"%s\" not supported for remount\n", p); + xfs_info(mp, + "mount option \"%s\" not supported for remount\n", p); return -EINVAL; #else break; @@ -1366,8 +1354,7 @@ xfs_fs_remount( if (mp->m_update_flags) { error = xfs_mount_log_sb(mp, mp->m_update_flags); if (error) { - cmn_err(CE_WARN, - "XFS: failed to write sb changes"); + xfs_warn(mp, "failed to write sb changes"); return error; } mp->m_update_flags = 0; @@ -1451,15 +1438,15 @@ xfs_finish_flags( mp->m_logbsize = mp->m_sb.sb_logsunit; } else if (mp->m_logbsize > 0 && mp->m_logbsize < mp->m_sb.sb_logsunit) { - cmn_err(CE_WARN, - "XFS: logbuf size must be greater than or equal to log stripe size"); + xfs_warn(mp, + "logbuf size must be greater than or equal to log stripe size"); return XFS_ERROR(EINVAL); } } else { /* Fail a mount if the logbuf is larger than 32K */ if (mp->m_logbsize > XLOG_BIG_RECORD_BSIZE) { - cmn_err(CE_WARN, - "XFS: logbuf size for version 1 logs must be 16K or 32K"); + xfs_warn(mp, + "logbuf size for version 1 logs must be 16K or 32K"); return XFS_ERROR(EINVAL); } } @@ -1476,8 +1463,8 @@ xfs_finish_flags( * prohibit r/w mounts of read-only filesystems */ if ((mp->m_sb.sb_flags & XFS_SBF_READONLY) && !ronly) { - cmn_err(CE_WARN, - "XFS: cannot mount a read-only filesystem as read-write"); + xfs_warn(mp, + "cannot mount a read-only filesystem as read-write"); return XFS_ERROR(EROFS); } diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index e22f005..6c10f1d 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -425,8 +425,7 @@ xfs_quiesce_attr( /* Push the superblock and write an unmount record */ error = xfs_log_sbcount(mp, 1); if (error) - xfs_fs_cmn_err(CE_WARN, mp, - "xfs_attr_quiesce: failed to log sb changes. " + xfs_warn(mp, "xfs_attr_quiesce: failed to log sb changes. " "Frozen image may not be consistent."); xfs_log_unmount_write(mp); xfs_unmountfs_writesb(mp); @@ -806,7 +805,7 @@ xfs_reclaim_inode( * pass on the error. */ if (error && error != EAGAIN && !XFS_FORCED_SHUTDOWN(ip->i_mount)) { - xfs_fs_cmn_err(CE_WARN, ip->i_mount, + xfs_warn(ip->i_mount, "inode 0x%llx background reclaim flush failed with %d", (long long)ip->i_ino, error); } diff --git a/fs/xfs/linux-2.6/xfs_sysctl.c b/fs/xfs/linux-2.6/xfs_sysctl.c index ee3cee0..ee2d2ad 100644 --- a/fs/xfs/linux-2.6/xfs_sysctl.c +++ b/fs/xfs/linux-2.6/xfs_sysctl.c @@ -37,7 +37,7 @@ xfs_stats_clear_proc_handler( ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos); if (!ret && write && *valp) { - printk("XFS Clearing xfsstats\n"); + xfs_notice(NULL, "Clearing xfsstats"); for_each_possible_cpu(c) { preempt_disable(); /* save vn_active, it's a universal truth! */ -- 1.7.2.3 From moscow@inboxlist.ru Tue Jan 11 20:47:46 2011 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.4 required=5.0 tests=BAYES_50,DATE_IN_PAST_06_12, T_MIME_NO_TEXT,T_TVD_MIME_NO_HEADERS 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 p0C2lkM6131972 for ; Tue, 11 Jan 2011 20:47:46 -0600 X-ASG-Debug-ID: 1294800596-06ea03430000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.inboxlist.ru (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 0625123BDE8 for ; Tue, 11 Jan 2011 18:49:57 -0800 (PST) Received: from mail.inboxlist.ru ([211.194.204.71]) by cuda.sgi.com with SMTP id De0AZFIRN6GyCj4h for ; Tue, 11 Jan 2011 18:49:57 -0800 (PST) Message-ID: <4692508E061645289F4AA9E756F7ECB8@inbox.ru> From: "For Director" To: X-ASG-Orig-Subj: Management Seminar [#48] Subject: Management Seminar [#48] Date: Tue, 11 Jan 2011 19:20:44 +0300 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_001_0057_01CBB1AB.7FAE3B80"; boundary="----=_NextPart_000_0056_01CBB1AB.7FAE3B80" X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 14.0.8117.416 X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8117.416 X-Barracuda-Connect: UNKNOWN[211.194.204.71] X-Barracuda-Start-Time: 1294800599 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4531 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.91 X-Barracuda-Spam-Status: No, SCORE=1.91 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA590, BSF_SC5_MJ1963, DATE_IN_PAST_06_12, DATE_IN_PAST_06_12_2, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.52123 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_06_12 Date: is 6 to 12 hours before Received: date 0.20 BSF_SC0_SA590 Custom Rule SA590 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 1.10 DATE_IN_PAST_06_12_2 DATE_IN_PAST_06_12_2 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_0056_01CBB1AB.7FAE3B80 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

******************************************************************<= BR>* =20 17-18 =D1=8F=D0=BD=D0=B2=D0=B0=D1=80=D1=8F 2011=D0=B3.
*
*  = =D0=97=D0=90  =D0=A7=D0=A2=D0=9E =20 =D0=9F=D0=9B=D0=90=D0=A2=D0=98=D0=A2=D0=AC  = =D0=97=D0=90=D0=A0=D0=9F=D0=9B=D0=90=D0=A2=D0=A3  = =D0=A1=D0=9E=D0=A2=D0=A0=D0=A3=D0=94=D0=9D=D0=98=D0=9A=D0=90=D0=9C: = =D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA=D1=83=D0=BC = =D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=87=D0=B5=D1=81=D0=BA=D0= =B8=D1=85=20 =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B9.
*
**************= ****************************************************

=D0=9D=D0=90  = =D0=A1=D0=95=D0=9C=D0=98=D0=9D=D0=90=D0=A0  = =D0=9F=D0=A0=D0=98=D0=93=D0=9B=D0=90=D0=A8=D0=90=D0=AE=D0=A2=D0=A1=D0=AF:= =D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5 = =D0=B8 = =D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D1=80=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5 = =D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=B0,=20 =D1=80=D1=83=D0=BA=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D0=B8 = =D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D0=BE=D0=B2, =D0=B8 =D0=B2=D1=81=D0=B5, = =D0=BA=D1=82=D0=BE = =D0=BF=D1=80=D0=B8=D0=BD=D0=B8=D0=BC=D0=B0=D0=B5=D1=82 = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5 =D0=BE = =D0=BC=D0=BE=D1=82=D0=B8=D0=B2=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D1= =85 =D1=81=D1=85=D0=B5=D0=BC=D0=B0=D1=85 =D0=B2=20 =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8.

=D0=A1=D0=B5=D0=BC=D0=B8=D0=BD=D0=B0=D1=80 = =D0=BF=D1=80=D0=B5=D0=B4=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD = =D0=B4=D0=BB=D1=8F: = =D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85 = =D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2, = =D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D1=80=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85 = =D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2, = =D1=80=D1=83=D0=BA=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0= =B9 =D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D0=BE=D0=B2, =D0=B8 = =D0=B2=D1=81=D0=B5=D1=85, =D0=BA=D1=82=D0=BE = =D0=BF=D1=80=D0=B8=D0=BD=D0=B8=D0=BC=D0=B0=D0=B5=D1=82 = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5 =D0=BE = =D0=BC=D0=BE=D1=82=D0=B8=D0=B2=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D1= =85=20 =D1=81=D1=85=D0=B5=D0=BC=D0=B0=D1=85 =D0=B2 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8.

=D0=9A=D0=BB=D1=8E=D1=87=D0=B5=D0=B2=D1=8B=D0=B5 = =D0=B2=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D1=8B = =D1=81=D0=B5=D0=BC=D0=B8=D0=BD=D0=B0=D1=80=D0=B0:

  • =D0=9E=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D1=8B=D0=B5 = =D0=BF=D1=80=D0=B8=D0=BD=D1=86=D0=B8=D0=BF=D1=8B = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F = =C2=AB=D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D0=BE-=D0=BC= =D0=BE=D1=82=D0=B8=D0=B2=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D1=85 = =D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC=C2=BB.=20
  • =D0=9A=D0=BB=D1=8E=D1=87=D0=B5=D0=B2=D1=8B=D0=B5 = =D1=82=D1=80=D0=B5=D0=B1=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F =D0=BA = =D1=8D=D1=84=D1=84=D0=B5=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B9= =D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D0=BE=D0=B9 = =D1=81=D1=85=D0=B5=D0=BC=D0=B5.=20 =D0=9F=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D1=8B, = =D0=B1=D0=B5=D0=B7 =D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D1=85 = =D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D0=B0=D1=8F = =D0=BC=D0=BE=D1=82=D0=B8=D0=B2=D0=B0=D1=86=D0=B8=D1=8F = =D0=BD=D0=B5 =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82.=20
  • =D0=9A=D0=B0=D0=BA = =D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D0=B0=D1=8F = =D1=81=D1=85=D0=B5=D0=BC=D0=B0 = =D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D0=B0 = =D1=83=D0=B2=D1=8F=D0=B7=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=D1=81=D1=8F = =D1=81 = =D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=BD=D1=8B=D0=BC=D0=B8 = = =D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D1=8F=D0=BC=D0=B8 = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2. = =D0=91=D0=B5=D0=B7=D0=B1=D0=BE=D0=BB=D0=B5=D0=B7=D0=BD=D0=B5=D0=BD=D0=BD=D0= =BE=D0=B5 =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BD=D0=BE=D0=B2=D1=8B=D1=85 = =D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D1=8B=D1=85 = =D1=81=D1=85=D0=B5=D0=BC.=20
  • =D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8F = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2: = =D1=87=D1=82=D0=BE = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1= =82=D1=8C, =D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=20 = =D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1= =82=D1=8C, =D0=BC=D0=B5=D1=80=D1=8B = =D0=BF=D0=BE=D0=BE=D1=89=D1=80=D0=B5=D0=BD=D0=B8=D1=8F, = =D0=BD=D0=B0=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=B8=D1=8F, = =D0=BF=D1=80=D0=B5=D1=81=D0=B5=D1=87=D0=B5=D0=BD=D0=B8=D1=8F.=20
  • =D0=92=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82=D1=8B = =D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D1=8B=D1=85 = =D1=81=D1=85=D0=B5=D0=BC, = =D0=BF=D0=BE=D0=BE=D1=89=D1=80=D1=8F=D1=8E=D1=89=D0=B8=D0=B5 = =D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D1=85 = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2=20 =D0=B8 = =C2=AB=D0=B2=D1=8B=D0=BC=D1=8B=D0=B2=D0=B0=D1=8E=D1=89=D0=B8=D0=B5=C2=BB = =D0=BB=D0=B5=D0=BD=D1=82=D1=8F=D0=B5=D0=B2. =D0=97=D0=B0 = =D1=87=D1=82=D0=BE =D0=BC=D1=8B =D0=BF=D0=BB=D0=B0=D1=82=D0=B8=D0=BC = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=B0=D0=BC = =D0=BE=D0=BA=D0=BB=D0=B0=D0=B4: =D0=BD=D0=BE=D0=B2=D1=8B=D0=B5 = =D0=B2=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82=D1=8B=20 =D0=BF=D1=80=D0=B8=D0=B2=D1=8B=D1=87=D0=BD=D0=BE=D0=B9 = =D1=81=D1=85=D0=B5=D0=BC=D1=8B.

=D0=9E=D1=81=D0=BE=D0=B1=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D1=81=D0=B5=D0=BC=D0=B8=D0=BD=D0=B0=D1=80=D0=B0:

  • 30% - =D1=82=D0=B5=D0=BE=D1=80=D0=B8=D0=B8, 70% - = =D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA=D0=B8.=20
  • =D0=9E=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=BE=D0=B9 = =D0=B0=D0=BA=D1=86=D0=B5=D0=BD=D1=82 = =D0=B4=D0=B5=D0=BB=D0=B0=D0=B5=D1=82=D1=81=D1=8F =D0=BD=D0=B0 = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5 = =D1=80=D0=B5=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85 = =D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D1=8B=D1=85=20 =D0=B7=D0=B0=D0=B4=D0=B0=D1=87.=20
  • =D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B8 = =D0=B4=D0=B0=D1=8E=D1=82=D1=81=D1=8F =D0=B2 =D0=B2=D0=B8=D0=B4=D0=B5 = =D0=BA=D0=B5=D0=B9=D1=81=D0=BE=D0=B2 =D0=B8 = =D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA=D1=83=D0=BC=D0=BE=D0=B2, = =D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D1=8B=D1=85 =D0=BA = =D1=83=D0=BF=D0=BE=D1=82=D1=80=D0=B5=D0=B1=D0=BB=D0=B5=D0=BD=D0=B8=D1=8E = =D0=BD=D0=B0 =D0=92=D0=B0=D1=88=D0=B8=D1=85=20 =D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B8=D1=85 = =D0=BC=D0=B5=D1=81=D1=82=D0=B0=D1=85.=20
  • =D0=9A=D0=B0=D0=B6=D0=B4=D1=8B=D0=B9 = =D1=83=D1=87=D0=B0=D1=81=D1=82=D0=BD=D0=B8=D0=BA = =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B8=D1=82 CD =D1=81 = =D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=BC=D0= =B8 =D0=BD=D0=B0=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=D0=BC=D0=B8 = =D0=BF=D0=BE =D1=82=D0=B5=D0=BC=D0=B5 = =D1=81=D0=B5=D0=BC=D0=B8=D0=BD=D0=B0=D1=80=D0=B0 =D0=B8=20 =D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=B0=D0=BC=D0=B8 = =D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D1=8B=D1=85 = =D1=81=D1=85=D0=B5=D0=BC.=20
  • =D0=A1=D1=80=D0=B5=D0=B4=D0=B8 = =D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA=D1=83=D0=BC=D0=BE=D0=B2 = =E2=80=93 =D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D1=8B = =D1=80=D0=B0=D1=81=D1=87=D0=B5=D1=82=D0=BE=D0=B2 = =D1=8D=D1=84=D1=84=D0=B5=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D1=85 = =D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D1=8B=D1=85 = =D1=81=D1=85=D0=B5=D0=BC =D0=B4=D0=BB=D1=8F=20 =D0=BB=D0=B8=D0=BD=D0=B5=D0=B9=D0=BD=D0=BE=D0=B3=D0=BE = =D0=BF=D0=B5=D1=80=D1=81=D0=BE=D0=BD=D0=B0=D0=BB=D0=B0 = (=D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B2=D0=B5=D1=86, = =D1=82=D0=BE=D1=80=D0=B3=D0=BE=D0=B2=D1=8B=D0=B9 = =D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=B8=D1=82=D0=B5=D0=BB=D1= =8C...), = =D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=87=D0=B5=D1=81=D0=BA=D0= =BE=D0=B3=D0=BE=20 =D1=81=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=B0 = (=D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80 = =D0=BC=D0=B0=D0=B3=D0=B0=D0=B7=D0=B8=D0=BD=D0=B0, = =D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD=D0=B8=D0=BA = =D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D0=B0 = =D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B6...); = =D0=B2=D1=8B=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=B2=D1=8B=D1=85=20 =D0=BF=D1=80=D0=BE=D0=B4=D1=83=D0=BA=D1=82=D0=BE=D0=B2 = =D0=B4=D0=B5=D1=8F=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=B0, = =D0=BF=D1=80=D0=B8=D0=B2=D1=8F=D0=B7=D0=BA=D0=B0 =D0=BA = =D0=BD=D0=B8=D0=BC = =D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=BD=D1=8B=D1=85 = =D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D0=B9 =D0=B8=20 =D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D1=8B=D1=85 = =D1=81=D1=85=D0=B5=D0=BC.

******************************************************************
=D0=9F=D0=A0=D0=9E=D0=93=D0=A0=D0=90=D0=9C=D0=9C=D0=90&n= bsp; = =D0=9E=D0=91=D0=A3=D0=A7=D0=95=D0=9D=D0=98=D0=AF

=D0=9F=D0=BB=D1=8E=D1=81=D1=8B, = =D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B5 =D0=BC=D1=8B = =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B8=D0=BB=D0=B8 =D0=BE=D1=82 = =D0=BA=D1=80=D0=B8=D0=B7=D0=B8=D1=81=D0=B0.

  1. =D0=92=D1=8B=D1=80=D0=B0=D1=81=D1=82=D0=B0=D0=B5=D1=82 = =D0=B0=D0=B4=D0=B5=D0=BA=D0=B2=D0=B0=D1=82=D0=BD=D0=BE=D1=81=D1=82=D1=8C = =D0=BF=D0=B5=D1=80=D1=81=D0=BE=D0=BD=D0=B0=D0=BB=D0=B0.=20
  2. =D0=9F=D0=BE=D1=8F=D0=B2=D0=B8=D0=BB=D0=B0=D1=81=D1=8C = =D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D1=8C = =D0=BF=D0=BE=D0=B2=D1=8B=D1=81=D0=B8=D1=82=D1=8C = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1= =8C=D0=BD=D0=BE=D1=81=D1=82=D1=8C = =D1=82=D1=80=D1=83=D0=B4=D0=B0=20 = =D0=BE=D1=82=D0=BD=D0=BE=D1=81=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE = =D0=BE=D0=BF=D0=BB=D0=B0=D1=82=D1=8B =D1=82=D1=80=D1=83=D0=B4=D0=B0. =

=D0=9F=D0=BB=D0=B0=D0=BD=D1=8B = =D0=BF=D1=80=D0=BE=D1=82=D0=B8=D0=B2=D0=BE=D0=BF=D0=BE=D0=B6=D0=B0=D1=80=D0= =BD=D1=8B=D1=85 =D0=BC=D0=B5=D1=80. = =D0=9B=D0=BE=D0=B3=D0=B8=D0=BA=D0=B0, =D1=86=D0=B8=D1=84=D1=80=D1=8B, = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F, = =D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D0=BE=D1= =81=D1=82=D1=8C.

  1. =D0=A1=D0=BE=D0=BA=D1=80=D0=B0=D1=89=D0=B5=D0=BD=D0=B8=D0=B5 = =D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8, = =D1=81=D0=BE=D0=BA=D1=80=D0=B0=D1=89=D0=B5=D0=BD=D0=B8=D0=B5 = =D1=88=D1=82=D0=B0=D1=82=D0=B0.=20
  2. =D0=A1 =D1=87=D0=B5=D0=BC =D0=BC=D1=8B = =D0=B2=D1=8B=D0=B9=D0=B4=D0=B5=D0=BC =D1=87=D0=B5=D1=80=D0=B5=D0=B7 18 = =D0=BC=D0=B5=D1=81=D1=8F=D1=86=D0=B5=D0=B2?=20
  3. =D0=9A=D1=82=D0=BE =D1=82=D0=B0=D0=BA=D0=B8=D0=B5 = =C2=AB=D0=B7=D0=BE=D0=BB=D0=BE=D1=82=D1=8B=D0=B5 = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=B8=C2=BB=
=D0=A4=D0=BE=D1=80=D0=BC=D0=B0 = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F: = =D1=81=D0=B5=D0=BC=D0=B8=D0=BD=D0=B0=D1=80-=D0=BF=D1=80=D0=B0=D0=BA=D1=82= =D0=B8=D0=BA=D1=83=D0=BC =E2=80=93 = =D0=BC=D0=B8=D0=BD=D0=B8-=D0=BB=D0=B5=D0=BA=D1=86=D0=B8=D1=8F, = =D0=B4=D0=B8=D1=81=D0=BA=D1=83=D1=81=D1=81=D0=B8=D0=B8.

=D0=92 = =D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B5 =D1=83 = =D1=81=D0=BB=D1=83=D1=88=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9 = =D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D1=83=D0=B5=D1=82=D1=81=D1=8F = =D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0= =B5 =D0=BE =D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=BD=D1=8B=D1=85=20 =D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=B0=D1=85, = =D0=BF=D1=80=D0=BE=D0=B8=D1=81=D1=85=D0=BE=D0=B4=D1=8F=D1=89=D0=B8=D1=85 = =D0=BD=D0=B0 =D1=80=D1=8B=D0=BD=D0=BA=D0=B5 = =D1=82=D1=80=D1=83=D0=B4=D0=B0 =D0=B8 = =D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D1=8E=D1=89=D0=B8=D1=85 = =D0=B2=D0=BB=D0=B8=D1=8F=D0=BD=D0=B8=D0=B5 =D0=BD=D0=B0 = =D0=B1=D0=B8=D0=B7=D0=BD=D0=B5=D1=81 = =D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=20 =D0=B2=D0=B7=D1=8F=D1=82=D0=BE=D0=B9 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8.

=D0=A3=D1=80=D0=BE=D0=B2=D0=BD=D0=B8 = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D1=8B=D1=85 = =D0=B7=D0=B0=D0=B4=D0=B0=D1=87

    =
  1. =D0=A1=D1=82=D1=80=D0=B0=D1=82=D0=B5=D0=B3=D0=B8=D1=87=D0=B5=D1=81=D0= =BA=D0=B8=D0=B9 =E2=80=93 =D0=BA=D0=B0=D0=BA=D0=BE=D0=B2=D0=B0 = =D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D0=B0 =D0=B1=D1=8B=D1=82=D1=8C = =D0=BE=D0=B1=D1=89=D0=B0=D1=8F = =D0=B8=D0=B4=D0=B5=D0=BE=D0=BB=D0=BE=D0=B3=D0=B8=D1=8F, = =D0=B2=D1=8B=D1=81=D1=82=D1=80=D0=B0=D0=B8=D0=B2=D0=B0=D1=8E=D1=89=D0=B0=D1= =8F=20 = =D0=BC=D0=BE=D1=82=D0=B8=D0=B2=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD= =D1=8B=D0=B5 =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B4=D0=BB=D1=8F = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 =D1=80=D0=B0=D0=B7=D0=BD=D1=8B=D1=85 = =D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D0=B9.=20
    1. =D0=9A=D0=B0=D0=BA=D0=B8=D0=B5 = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D1=8B = =D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=D1= =81=D1=8F =D0=B2 =D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B5 = =D0=B2=D0=BE=D0=B7=D1=80=D0=B0=D1=81=D1=82=D0=B0 = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8 =D0=B8=20 =D1=82=D0=B5=D1=85=D0=BD=D0=BE=D0=BB=D0=BE=D0=B3=D0=B8=D0=B9 = =D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F.=20
    2. =D0=98=D0=B4=D0=B5=D0=BE=D0=BB=D0=BE=D0=B3=D0=B8=D1=8F = =C2=AB=D1=88=D0=B2=D0=B5=D0=B9=D1=86=D0=B0=D1=80=D1=81=D0=BA=D0=B8= =D1=85 =D1=87=D0=B0=D1=81=D0=BE=D0=B2=C2=BB: =D0=B7=D0=B0 = =D1=87=D1=82=D0=BE =D0=BF=D0=BB=D0=B0=D1=82=D0=B8=D1=82=D1=81=D1=8F=20 = =C2=AB=D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=B0=C2= =BB = =D0=BF=D0=BE=D0=B4=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1= =8F=D0=BC?=20
    3. =D0=9F=D0=BE=D0=BD=D0=B8=D0=BC=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=BE=D1=82=D0=BB=D0=B8=D1=87=D0=B8=D1=8F = =D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B9 =D0=B8 = =D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=BE=D0=B2 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B = =D0=BF=D0=BE=D0=B4=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1= =8F =D0=B8=20 =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=B0. =
  2. =D0=9A=D0=B0=D0=BA=D0=BE=D0=B9 = =D0=B8=D1=82=D0=BE=D0=B3=D0=BE=D0=B2=D1=8B=D0=B9 = =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82 = =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B0=D0=B5=D1=82 = =D0=BF=D0=BE=D0=B4=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8= =D0=B5. =D0=9A=D0=B0=D0=BA =D0=B5=D0=B3=D0=BE=20 =D0=B8=D0=B7=D0=BC=D0=B5=D1=80=D0=B8=D0=BC=D0=B0=D1=8F, = =D1=82=D1=80=D0=B5=D0=B1=D1=83=D0=B5=D0=BC=D0=BE=D0=B3=D0=BE = =D0=BA=D0=B0=D1=87=D0=B5=D1=81=D1=82=D0=B2=D0=B0, =D0=B2 = =D0=BD=D0=B5=D0=BE=D0=B1=D1=85=D0=BE=D0=B4=D0=B8=D0=BC=D1=8B=D0=B5 = =D1=81=D0=B5=D1=82=D0=B5=D0=B2=D1=8B=D0=B5 = =D1=81=D1=80=D0=BE=D0=BA=D0=B8 =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0 = =D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D1=81=D1=8F = =D0=B2 =D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=83 = =D0=BE=D0=BF=D0=BB=D0=B0=D1=82=D1=8B.=20
  3. =D0=9A=D0=B0=D0=BA =D0=BC=D0=BE=D0=B6=D0=BD=D0=BE = =D0=BD=D0=B0=D1=83=D1=87=D0=B8=D1=82=D1=8C = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 = =D0=BF=D0=BE=D0=BB=D0=BE=D0=B6=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE = =D0=B2=D0=BB=D0=B8=D1=8F=D1=82=D1=8C =D0=BD=D0=B0=20 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5= =D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D1=8C = =D1=82=D1=80=D1=83=D0=B4=D0=B0 =D0=B4=D1=80=D1=83=D0=B3 = =D0=B4=D1=80=D1=83=D0=B3=D0=B0.

=D0=A4=D0=BE=D1=80=D0=BC=D0=B0 = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F: = =D1=81=D0=B5=D0=BC=D0=B8=D0=BD=D0=B0=D1=80-=D0=BF=D1=80=D0=B0=D0=BA=D1=82= =D0=B8=D0=BA=D1=83=D0=BC =E2=80=93 = =D0=BC=D0=B8=D0=BD=D0=B8-=D0=BB=D0=B5=D0=BA=D1=86=D0=B8=D1=8F, = =D0=B4=D0=B8=D1=81=D0=BA=D1=83=D1=81=D1=81=D0=B8=D0=B8, = =D0=BC=D0=BE=D0=B7=D0=B3=D0=BE=D0=B2=D0=BE=D0=B9=20 =D1=88=D1=82=D1=83=D1=80=D0=BC.

=D0=A0=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82 = =E2=80=93 =D0=BF=D0=BE=D0=BD=D0=B8=D0=BC=D0=B0=D0=BD=D0=B8=D0=B5 =D1=83 = =D1=81=D0=BB=D1=83=D1=88=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9 = =D0=BD=D0=B5=D0=BE=D0=B1=D1=85=D0=BE=D0=B4=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0= =B8:
    =
  1. =D0=9F=D0=B5=D1=80=D0=B5=D0=BE=D1=80=D0=B8=D0=B5=D0=BD=D1=82=D0=B0=D1= =86=D0=B8=D0=B8 = =D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F =D1=81 = =D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=BE=D0=B2 =D0=BD=D0=B0 = =D1=81=D1=87=D0=B5=D1=82=D0=BD=D1=8B=D0=B5 =D0=B8 = =D0=B2=D0=BE=D1=81=D1=82=D1=80=D0=B5=D0=B1=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1= =8B=D0=B5=20 =D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D1=8B = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B.=20 =
  2. =D0=92=D1=8B=D1=81=D1=82=D1=80=D0=B0=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D1= =8F =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8 =D0=BD=D0=B0 = =C2=AB=D1=81=D0=B5=D1=82=D0=B5=D0=B2=D0=BE=D0=BC=C2=BB = =D0=BF=D1=80=D0=B8=D0=BD=D1=86=D0=B8=D0=BF=D0=B5.

=D0=94=D0=BE=D0=BB=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=BD=D0=B0=D1=8F = =D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D1=8F: = =D0=B4=D0=BB=D1=8F = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D1=8F=D1=8E=D1=89=D0=B8=D1=85 = =D0=B8=D0=BB=D0=B8 =D0=B4=D0=BB=D1=8F = =D0=BF=D0=BE=D0=B2=D1=8B=D1=88=D0=B5=D0=BD=D0=B8=D1=8F = =D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC=D0=BE=D1=81=D1=82=D0= =B8=20 =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=B0?

  1. =D0=9A=D0=B0=D0=BA =D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D1=82=D1=8C = =D0=94=D0=BE=D0=BB=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=BD=D1=83=D1=8E= =D0=98=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D1=8E = =D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=BC = =D0=B5=D0=B6=D0=B5=D0=B4=D0=BD=D0=B5=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE = =D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F?=20
  2. =D0=90=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC = =D0=BF=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BA=D0=B8 = =C2=AB=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=C2=BB = =D0=94=D0=BE=D0=BB=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=BD=D1=8B=D1=85= =D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D0=B9.=20
  3. =D0=9F=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA=D1=83=D0=BC = =D0=BD=D0=B0 = =D0=BF=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BA=D1=83 = =D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D1=8C=D0=BD=D1=8B=D1=85 = =D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=BD=D1=8B=D1=85 = =D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D0=B9.

=C2=AB=D0=A1=D0=B5=D1=82=D0=B5=D0=B2=D1=8B=D0=B5=C2=BB = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F, = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=89=D0=B8=D0=B5 = =D0=BD=D0=B0 =D1=81=D1=82=D1=8B=D0=BA=D0=B0=D1=85 = =D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D0=BE=D1= =81=D1=82=D0=B8. =D0=98=D0=B4=D0=B5=D1=8F, = =D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B0,=20 =D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D1=8B, = =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D1=8B

=D0=9C=D0=B0=D1=82=D1=80=D0=B8=D1=86=D0=B0 = =D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D0=BE=D1= =81=D1=82=D0=B8 =D0=92. = =D0=96=D0=B0=D0=BD=D0=B4=D0=B0=D1=80=D0=BE=D0=B2=D0=B0. = =D0=9E=D0=B1=D1=89=D0=B5=D0=B5 = =D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D0=BE = =D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B8=20 =D1=80=D0=B0=D1=81=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1= =8F = =D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D0=BE=D1= =81=D1=82=D0=B8

=D0=A4=D0=BE=D1=80=D0=BC=D0=B0 = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F: = =D1=81=D0=B5=D0=BC=D0=B8=D0=BD=D0=B0=D1=80-=D0=BF=D1=80=D0=B0=D0=BA=D1=82= =D0=B8=D0=BA=D1=83=D0=BC =E2=80=93 = =D0=BC=D0=B8=D0=BD=D0=B8-=D0=BB=D0=B5=D0=BA=D1=86=D0=B8=D1=8F, = =D0=B4=D0=B8=D1=81=D0=BA=D1=83=D1=81=D1=81=D0=B8=D0=B8, = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0 =D0=B2=20 =D0=BC=D0=B0=D0=BB=D1=8B=D1=85 = =D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B0=D1=85.

=D0=92 = =D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B5 = =D1=81=D0=BB=D1=83=D1=88=D0=B0=D1=82=D0=B5=D0=BB=D0=B8 = =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B0=D1=82 = =D0=BF=D0=BE=D1=88=D0=B0=D0=B3=D0=BE=D0=B2=D1=83=D1=8E = =D1=82=D0=B5=D1=85=D0=BD=D0=BE=D0=BB=D0=BE=D0=B3=D0=B8=D1=8E = =D0=BF=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BA=D0=B8 = =D0=B1=D0=B0=D0=B7=D0=BE=D0=B2=D1=8B=D1=85=20 =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2 = =D0=B4=D0=BB=D1=8F = =D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F = =D0=BF=D0=BE=D0=B4=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1= =8F=D0=BC=D0=B8, =D1=83=D0=B2=D0=B8=D0=B4=D1=8F=D1=82 = =D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC=D0=BD=D1=8B=D0=B5 = =D0=BC=D0=B5=D1=81=D1=82=D0=B0 =D0=B8 = =D1=82=D0=BE=D0=BD=D0=BA=D0=BE=D1=81=D1=82=D0=B8=20 =D0=BF=D1=80=D0=B8 =D0=B8=D1=85 = =D0=BF=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BA=D0=B5, = =D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA=D1=83=D1=8E=D1=82=D1= =81=D1=8F =D0=B2 =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B5 =D0=BD=D0=B0=D0=B4 = =D1=81=D0=B0=D0=BC=D1=8B=D0=BC =D0=B2=D0=B0=D0=B6=D0=BD=D1=8B=D0=BC = =E2=80=93 10-=D0=BC - =D0=BF=D1=83=D0=BD=D0=BA=D1=82=D0=BE=D0=BC=20 =D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=BD=D0=BE=D0=B9 = =D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D0=B8 =D0=B8 = =D0=BF=D1=80=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=82 = =D0=B2=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82=D1=8B = =C2=AB=D1=81=D0=B5=D1=82=D0=B5=D0=B2=D1=8B=D1=85=C2=BB = =D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=87=D0=B5=D1=81=D0=BA=D0= =B8=D1=85=20 =D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2.

=D0=9E=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D1=8B=D0=B5 = =D0=BF=D1=80=D0=B8=D0=BD=D1=86=D0=B8=D0=BF=D1=8B = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F = =D0=B7=D0=B0=D0=B4=D0=B0=D1=87 =D0=BF=D0=BE = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B5=D0=BD=D1=81=D0=B0=D1=86=D0=B8=D1=8F=D0=BC<= /H3>
  1. =D0=9D=D0=B0=D0=B8=D0=B1=D0=BE=D0=BB=D0=B5=D0=B5 = =D1=87=D0=B0=D1=81=D1=82=D1=8B=D0=B5 = =D0=BD=D0=B5=D0=B2=D0=B5=D1=80=D0=BD=D1=8B=D0=B5 = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F =D0=BF=D1=80=D0=B8 = =D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8= =D0=B8 =D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9 = =D1=87=D0=B0=D1=81=D1=82=D0=B8=20 =D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D1=8B:=20
    1. =D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA, = =D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B5 =D0=B1=D1=8B=D0=BB=D0=B8 = =D1=81=D0=BE=D0=B2=D0=B5=D1=80=D1=88=D0=B5=D0=BD=D1=8B = =D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B8=D0=BD=D1=81=D1=82=D0=B2=D0=BE=D0=BC = =D1=80=D0=BE=D1=81=D1=81=D0=B8=D0=B9=D1=81=D0=BA=D0=B8=D1=85=20 =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B9.=20
    2. =D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5 = =D1=81=D0=BB=D0=B5=D0=B4=D1=81=D1=82=D0=B2=D0=B8=D0=B9, =D0=BA = =D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=BC = =D0=B2=D0=B5=D0=B4=D1=83=D1=82 = =D0=B2=D1=8B=D1=88=D0=B5=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D0= =B5 =D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8.
  2. =D0=9C=D0=B8=D0=BD=D0=B8=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE = =D0=B4=D0=BE=D0=BF=D1=83=D1=81=D1=82=D0=B8=D0=BC=D1=8B=D0=B9 = =D1=83=D1=80=D0=BE=D0=B2=D0=B5=D0=BD=D1=8C = =D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B8=D0=B2=D0=BD=D0= =BE=D1=81=D1=82=D0=B8 =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B.=20
  3. =D0=9F=D1=80=D0=B8=D0=BD=D1=86=D0=B8=D0=BF=D1=8B = =C2=AB=D1=81=D0=B2=D1=8F=D0=B7=D1=8B=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=C2=BB = =D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=B2=D1=8B=D1=85 = =D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2 = =D0=BE=D1=86=D0=B5=D0=BD=D0=BA=D0=B8 = =D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B8=D0=B2=D0=BD=D0= =BE=D1=81=D1=82=D0=B8=20 =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=B0. =

=D0=A4=D0=BE=D1=80=D0=BC=D0=B0 = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F: = =D1=81=D0=B5=D0=BC=D0=B8=D0=BD=D0=B0=D1=80-=D0=BF=D1=80=D0=B0=D0=BA=D1=82= =D0=B8=D0=BA=D1=83=D0=BC =E2=80=93 = =D0=BC=D0=B8=D0=BD=D0=B8-=D0=BB=D0=B5=D0=BA=D1=86=D0=B8=D1=8F, = =D0=B4=D0=B8=D1=81=D0=BA=D1=83=D1=81=D1=81=D0=B8=D0=B8, = =D0=BC=D0=BE=D0=B7=D0=B3=D0=BE=D0=B2=D0=BE=D0=B9=20 =D1=88=D1=82=D1=83=D1=80=D0=BC.

=D0=92 = =D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B5 =D1=83 = =D1=81=D0=BB=D1=83=D1=88=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9 = =D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D1=83=D0=B5=D1=82=D1=81=D1=8F = =D0=B0=D0=B4=D0=B5=D0=BA=D0=B2=D0=B0=D1=82=D0=BD=D0=BE=D0=B5 = =D0=BF=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0= =B5 =D0=BE=20 =D0=BF=D1=80=D0=B8=D0=BD=D1=86=D0=B8=D0=BF=D0=B0=D1=85 = =D0=BF=D0=BE=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BD=D0=B8=D1=8F = =D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9 = =D1=87=D0=B0=D1=81=D1=82=D0=B8 =D0=BE=D0=BF=D0=BB=D0=B0=D1=82=D1=8B = =D1=82=D1=80=D1=83=D0=B4=D0=B0, =D0=BE = =D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D0=B0=D1=85=20 =C2=AB=D1=80=D0=B0=D1=81=D1=88=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=C2=BB = =D1=82=D0=B8=D0=BF=D0=B8=D1=87=D0=BD=D1=8B=D1=85 = =D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D1=8B=D1=85 = =D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA.

=D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D1=8B = =D1=80=D0=B0=D1=81=D1=87=D0=B5=D1=82=D0=BE=D0=B2 = =D0=B7=D0=B0=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BD=D0=BE=D0=B9 = =D0=BF=D0=BB=D0=B0=D1=82=D1=8B:

  1. =D0=97=D0=9F =D0=B4=D0=BB=D1=8F = =D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B2=D1=86=D0=BE=D0=B2:=20
    1. =D0=A0=D0=BE=D0=B7=D0=BD=D0=B8=D1=86=D1=8B,=20
    2. =D0=9E=D0=BF=D1=82=D0=BE=D0=B2=D1=8B=D1=85 = =D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B6,=20
    3. =D0=90=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D1=85 = =D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B6.
  2. =D0=97=D0=9F =D0=B4=D0=BB=D1=8F = =D0=B0=D0=B4=D0=BC=D0=B8=D0=BD=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=82=D0=B8=D0= =B2=D0=BD=D1=8B=D1=85 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2.=20
  3. =D0=97=D0=9F =D0=B4=D0=BB=D1=8F = =D1=80=D1=83=D0=BA=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0= =B9:=20
      =
    1. =D0=A0=D1=83=D0=BA=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D0= =B5=D0=B9 =D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D0=BE=D0=B2 = =D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B6, =D1=86=D0=B5=D1=85=D0=BE=D0=B2, = =D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D0=BE=D0=B2 = =D0=B7=D0=B0=D0=BA=D1=83=D0=BF=D0=BE=D0=BA,=20
    2. =D0=94=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2 = =D0=BC=D0=B0=D0=B3=D0=B0=D0=B7=D0=B8=D0=BD=D0=BE=D0=B2,=20 =
    3. =D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 = =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D1=81=D1=82=D0=B2, = =D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=BD=D1=8B=D1=85 = =D0=BF=D0=BE=D0=B4=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0= =B9,=20
    4. =D0=9F=D1=80=D0=BE=D1=87=D0=B8=D1=85.
  4. =D0=97=D0=9F =D0=B4=D0=BB=D1=8F = =D0=B1=D1=83=D1=85=D0=B3=D0=B0=D0=BB=D1=82=D0=B5=D1=80=D0=BE=D0=B2 =D0=B8 =D0=BF=D1=80=D0=BE=D1=87=D0=B8=D1=85 = =D0=B0=D0=B4=D0=BC=D0=B8=D0=BD=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=82=D0=B8=D0= =B2=D0=BD=D1=8B=D1=85 = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2.=20

=D0=A4=D0=BE=D1=80=D0=BC=D0=B0 = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F: = =D1=82=D1=80=D0=B5=D0=BD=D0=B8=D0=BD=D0=B3 =E2=80=93 = =D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0 =D0=B2 = =D0=BC=D0=B0=D0=BB=D1=8B=D1=85 = =D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B0=D1=85, = =D1=80=D0=B0=D0=B7=D0=B1=D0=BE=D1=80 = =D0=BA=D0=B5=D0=B9=D1=81=D0=BE=D0=B2,=20 =D0=B4=D0=B8=D1=81=D0=BA=D1=83=D1=81=D1=81=D0=B8=D0=B8, = =D0=B7=D0=B0=D1=89=D0=B8=D1=82=D0=B0 = =D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=87=D0=B5=D1=81=D0=BA=D0= =B8=D1=85 =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B9 =D0=BF=D0=BE = =D0=BF=D1=80=D0=B5=D0=B4=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D1=8B=D0=BC = =D0=BA=D0=B5=D0=B9=D1=81=D0=B0=D0=BC.

=D0=A1=D0=BB=D1=83=D1=88=D0=B0=D1=82=D0=B5=D0=BB=D0=B8 = =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B0=D1=82 = =D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D1=8C = =D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D1=8C = =D0=BD=D0=B0 = =D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85 = =D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=B0=D1=85=20 =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5 = =D0=B7=D0=BD=D0=B0=D0=BD=D0=B8=D1=8F =D0=B8 = =D0=BF=D1=80=D0=B8=D0=BD=D1=86=D0=B8=D0=BF=D1=8B = =D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D1=8B=D1=85 = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B9.

=D0=9A=D0=B0=D0=BA =D0=B2=D0=BD=D0=B5=D0=B4=D1=80=D0=B8=D1=82=D1=8C = =D1=80=D0=B0=D0=B7=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=BD=D0=BD=D1=83=D1= =8E =D0=97=D0=9F-=D1=81=D1=85=D0=B5=D0=BC=D1=83 =D0=B2 = =D0=B6=D0=B8=D0=B7=D0=BD=D1=8C

  1. =D0=93=D0=B4=D0=B5 = =D0=BD=D0=B0=D1=85=D0=BE=D0=B4=D1=8F=D1=82=D1=81=D1=8F = =D0=B7=D0=B0=D1=80=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D1=8B=D0=B5 = =D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F =D0=B2 = =D0=B0=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC=D0=B5 = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F=20 =D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B9.=20
  2. =D0=9A=D0=BB=D1=8E=D1=87=D0=B5=D0=B2=D0=BE=D0=B9 = =D0=BF=D1=80=D0=B8=D0=BD=D1=86=D0=B8=D0=BF = =D0=BF=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BA=D0=B8 = =D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=8B = =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0=B8 =D0=BA = =D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=D0=BC.=20
  3. =D0=9B=D0=B0=D1=82=D0=B5=D0=BD=D1=82=D0=BD=D1=8B=D0=B5 = =D0=BF=D0=B5=D1=80=D0=B8=D0=BE=D0=B4=D1=8B =D0=BF=D1=80=D0=B8 = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D0=B8 = =D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B9.=20
  4. =D0=9A=D0=B0=D0=BA = =D0=BC=D0=BE=D1=82=D0=B8=D0=B2=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C = =D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2 =D0=BD=D0=B0 =C2=AB=D1=81=D0=B2=D0=B5=D1=82=D0=BB=D0=BE=D0=B5 = =D0=B1=D1=83=D0=B4=D1=83=D1=89=D0=B5=D0=B5=C2=BB.=20
=D0=A4=D0=BE=D1=80=D0=BC=D0=B0 = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F: = =D1=81=D0=B5=D0=BC=D0=B8=D0=BD=D0=B0=D1=80-=D0=BF=D1=80=D0=B0=D0=BA=D1=82= =D0=B8=D0=BA=D1=83=D0=BC =E2=80=93 = =D0=BC=D0=B8=D0=BD=D0=B8-=D0=BB=D0=B5=D0=BA=D1=86=D0=B8=D1=8F, = =D0=B4=D0=B8=D1=81=D0=BA=D1=83=D1=81=D1=81=D0=B8=D0=B8.

=D0=A1=D0=BB=D1=83=D1=88=D0=B0=D1=82=D0=B5=D0=BB=D0=B8 = =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B0=D1=82 = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8E = =D0=BF=D0=BE =D1=82=D0=B5=D1=85=D0=BD=D0=B8=D0=BA=D0=B5 = =D0=B1=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8 = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F=20 =D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B9, = =D1=81=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D1=8B=D1=85 =D1=81 = =D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9 = =D0=BC=D0=BE=D1=82=D0=B8=D0=B2=D0=B0=D1=86=D0=B8=D0=B5=D0=B9, = =D1=81=D0=BC=D0=BE=D0=B3=D1=83=D1=82 = =D0=B8=D0=B7=D0=B1=D0=B5=D0=B6=D0=B0=D1=82=D1=8C = =D1=82=D0=B8=D0=BF=D0=BE=D0=B2=D1=8B=D1=85 = =D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA,=20 =D1=81=D0=BE=D0=B2=D0=B5=D1=80=D1=88=D0=B0=D0=B5=D0=BC=D1=8B=D1=85 = =D1=80=D0=B5=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=BE=D1=80=D0=B0=D0=BC=D0= =B8 =D0=B2 =D0=BF=D0=B5=D1=80=D0=B8=D0=BE=D0=B4 = =D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD.

17 - 18 =D1=8F=D0=BD=D0=B2=D0=B0=D1=80=D1=8F 2011=D0=B3.  (2 = =D0=B4=D0=BD=D1=8F =D1=81 10.00 =D0=B4=D0=BE 18.00) =
=D0=9C=D0=B5=D1=81=D1=82=D0=BE = =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F:=20 =D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0, =D0=BC. = =D0=91=D0=BE=D1=82=D0=B0=D0=BD=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9 = =D1=81=D0=B0=D0=B4, "=D0=A3=D1=87=D0=B5=D0=B1=D0=BD=D0=B0=D1=8F = =D0=B3=D0=BE=D1=81=D1=82=D0=B8=D0=BD=D0=B8=D1=86=D0=B0"
=D0=A1=D1=82=D0= =BE=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C = =D1=83=D1=87=D0=B0=D1=81=D1=82=D0=B8=D1=8F: 17 500=20 =D1=80=D1=83=D0=B1.
(=D0=92 = =D1=81=D1=82=D0=BE=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C = =D0=B2=D1=85=D0=BE=D0=B4=D0=B8=D1=82 = =D0=BE=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5, = =D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BD=D1=8B=D0=B5 = =D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0=D0=BB=D1=8B =D0=BF=D0=BE = =D1=82=D0=B5=D0=BC=D0=B5 = =D1=81=D0=B5=D0=BC=D0=B8=D0=BD=D0=B0=D1=80=D0=B0,=20 =D0=BE=D0=B1=D0=B5=D0=B4=D1=8B, = =D0=BA=D0=BE=D1=84=D0=B5-=D0=BF=D0=B0=D1=83=D0=B7=D1=8B). =D0=9F=D0=BE = =D0=BE=D0=BA=D0=BE=D0=BD=D1=87=D0=B0=D0=BD=D0=B8=D0=B8 = =D0=B2=D1=8B=D0=B4=D0=B0=D0=B5=D1=82=D1=81=D1=8F = =D1=81=D0=B5=D1=80=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82 =D0=BE = =D0=BF=D1=80=D0=BE=D1=85=D0=BE=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B8 = =D0=BE=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F =D0=BF=D0=BE=20 =D0=B4=D0=B0=D0=BD=D0=BD=D0=BE=D0=B9 =D1=82=D0=B5=D0=BC=D0=B5. =
=D0=98=D0=BD=D0=BE=D0=B3=D0=BE=D1=80=D0=BE=D0=B4=D0=BD=D0=B8=D0=BC = =D0=BF=D0=BE=D0=BC=D0=BE=D0=B6=D0=B5=D0=BC = =D0=B7=D0=B0=D0=B1=D1=80=D0=BE=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1= =8C =D0=BD=D0=BE=D0=BC=D0=B5=D1=80=D0=B0 =D0=B2 = =D0=B3=D0=BE=D1=81=D1=82=D0=B8=D0=BD=D0=B8=D1=86=D0=B5. = =D0=9E=D0=B1=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20 =D0=B8 =D0=BF=D1=80=D0=BE=D0=B6=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 = =D0=B2 =D0=BE=D0=B4=D0=BD=D0=BE=D0=BC = =D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8.


******************************************************************=

=D0=9F=D0=BE=D0=B4=D1=80=D0=BE=D0=B1=D0=BD=D0=B0=D1=8F = =D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8F =D0=B8 = =D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D1=8F = =D0=BF=D0=BE =D1=82=D0=B5=D0=BB=D0=B5=D1=84=D0=BE=D0=BD=D1=83: 8 [495] = 225 .. 22 .. 86


******************************************************************=
******************************************************************

 

 

zarplatay ------=_NextPart_000_0056_01CBB1AB.7FAE3B80-- ------=_NextPart_001_0057_01CBB1AB.7FAE3B80 zarplatay ------=_NextPart_001_0057_01CBB1AB.7FAE3B80-- From aelder@sgi.com Tue Jan 11 22:13:11 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0C4DBGn137255 for ; Tue, 11 Jan 2011 22:13:11 -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 6137B8F8054; Tue, 11 Jan 2011 20:15:22 -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); Tue, 11 Jan 2011 22:13:24 -0600 Subject: Re: [PATCH 01/12] xfs: prevent NMI timeouts in cmn_err From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294792553-8378-2-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> <1294792553-8378-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 11 Jan 2011 22:13:23 -0600 Message-ID: <1294805603.3115.127.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 12 Jan 2011 04:13:24.0804 (UTC) FILETIME=[0E84F840:01CBB20F] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2011-01-12 at 11:35 +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. I had two trivial remarks but, well, what you have is just fine... Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_sysctl.c | 23 ++++++++- > fs/xfs/support/debug.c | 109 +++++++++++++++++++---------------------- > fs/xfs/support/debug.h | 25 ++++++--- > From aelder@sgi.com Tue Jan 11 22:13:11 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0C4DBeg137256 for ; Tue, 11 Jan 2011 22:13:11 -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 7CB818F8071; Tue, 11 Jan 2011 20:15:25 -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); Tue, 11 Jan 2011 22:13:33 -0600 Subject: Re: [PATCH 04/12] xfs: Convert xlog_warn to new logging interface From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294792553-8378-5-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> <1294792553-8378-5-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 11 Jan 2011 22:13:32 -0600 Message-ID: <1294805612.3115.128.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 12 Jan 2011 04:13:33.0632 (UTC) FILETIME=[13C80400:01CBB20F] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2011-01-12 at 11:35 +1100, Dave Chinner wrote: > From: Dave Chinner > > Convert the xfs log operations to use the new error logging > interfaces. This removes the xlog_{warn,panic} wrappers and makes > almost all errors emit the device they belong to instead of just > refering to "XFS". > One mistake noted below, otherwise: Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > --- > fs/xfs/quota/xfs_dquot.c | 10 ++- > fs/xfs/quota/xfs_qm.c | 2 +- > fs/xfs/xfs_log.c | 124 ++++++++++++------------- > fs/xfs/xfs_log_priv.h | 4 - > fs/xfs/xfs_log_recover.c | 223 ++++++++++++++++++++++----------------------- . . . > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index ae6fef1..d645f09 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c . . . > @@ -1563,38 +1561,36 @@ xlog_print_tic_res( > "SWAPEXT" > }; > > - xfs_fs_cmn_err(CE_WARN, mp, > - "xfs_log_write: reservation summary:\n" > - " trans type = %s (%u)\n" > - " unit res = %d bytes\n" > - " current res = %d bytes\n" > - " total reg = %u bytes (o/flow = %u bytes)\n" > - " ophdrs = %u (ophdr space = %u bytes)\n" > - " ophdr + reg = %u bytes\n" > - " num regions = %u\n", > - ((ticket->t_trans_type <= 0 || > - ticket->t_trans_type > XFS_TRANS_TYPE_MAX) ? > - "bad-trans-type" : trans_type_str[ticket->t_trans_type-1]), > - ticket->t_trans_type, > - ticket->t_unit_res, > - ticket->t_curr_res, > - ticket->t_res_arr_sum, ticket->t_res_o_flow, > - ticket->t_res_num_ophdrs, ophdr_spc, > - ticket->t_res_arr_sum + > - ticket->t_res_o_flow + ophdr_spc, > - ticket->t_res_num); > + xfs_alert(mp, xfs_warn(mp, > + "xfs_log_write: reservation summary:\n" > + " trans type = %s (%u)\n" > + " unit res = %d bytes\n" > + " current res = %d bytes\n" > + " total reg = %u bytes (o/flow = %u bytes)\n" > + " ophdrs = %u (ophdr space = %u bytes)\n" > + " ophdr + reg = %u bytes\n" > + " num regions = %u\n", > + ((ticket->t_trans_type <= 0 || > + ticket->t_trans_type > XFS_TRANS_TYPE_MAX) ? > + "bad-trans-type" : trans_type_str[ticket->t_trans_type-1]), > + ticket->t_trans_type, > + ticket->t_unit_res, > + ticket->t_curr_res, > + ticket->t_res_arr_sum, ticket->t_res_o_flow, > + ticket->t_res_num_ophdrs, ophdr_spc, > + ticket->t_res_arr_sum + > + ticket->t_res_o_flow + ophdr_spc, > + ticket->t_res_num); > > for (i = 0; i < ticket->t_res_num; i++) { > - uint r_type = ticket->t_res_arr[i].r_type; > - cmn_err(CE_WARN, > - "region[%u]: %s - %u bytes\n", > - i, > + uint r_type = ticket->t_res_arr[i].r_type; > + xfs_warn(mp, "region[%u]: %s - %u bytes\n", i, > ((r_type <= 0 || r_type > XLOG_REG_TYPE_MAX) ? > "bad-rtype" : res_type_str[r_type-1]), > ticket->t_res_arr[i].r_len); > } > > - xfs_cmn_err(XFS_PTAG_LOGRES, CE_ALERT, mp, > + xfs_alert_tag(mp, XFS_PTAG_LOGRES, > "xfs_log_write: reservation ran out. Need to up reservation"); > xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); > } . . . From aelder@sgi.com Tue Jan 11 22:15:17 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0C4FH9H137393 for ; Tue, 11 Jan 2011 22:15:17 -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 94378AC003; Tue, 11 Jan 2011 20:17:27 -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); Tue, 11 Jan 2011 22:16:30 -0600 Subject: Re: [RFC, PATCH 0/12] xfs: rework error logging infrastructure From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294792553-8378-1-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 11 Jan 2011 22:16:29 -0600 Message-ID: <1294805789.3115.131.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 12 Jan 2011 04:16:30.0900 (UTC) FILETIME=[7D70F740:01CBB20F] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2011-01-12 at 11:35 +1100, Dave Chinner wrote: > This series completely reworks the cmn_err logging infrastructure > by replacing it with a simple, consistent API that can be used everwhere. > IOWs, this series replaces the various cmn_err APIs: . . . I reviewed the whole series, and offered a correction on just one thing. I might quibble with the indentation of some of the format strings here or there, but I didn't bother, there sometimes is no nice way to do those. I personally like the result a lot, it's a lot cleaner and easier on the eyes. In any case, you say it's an RFC but I'm OK with it. I'm just starting to test with it but you can consider the whole series reviewed by me. Reviewed-by: Alex Elder From aelder@sgi.com Tue Jan 11 22:46:44 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0C4kiYU140409 for ; Tue, 11 Jan 2011 22:46:44 -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 14E8B304067; Tue, 11 Jan 2011 20:48:55 -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); Tue, 11 Jan 2011 22:48:54 -0600 Subject: Re: [PATCH 12/12] xfs: kill support/debug.[ch] From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1294792553-8378-13-git-send-email-david@fromorbit.com> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> <1294792553-8378-13-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 11 Jan 2011 22:48:53 -0600 Message-ID: <1294807733.3115.137.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 12 Jan 2011 04:48:54.0237 (UTC) FILETIME=[03C2A8D0:01CBB214] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2011-01-12 at 11:35 +1100, Dave Chinner wrote: > From: Dave Chinner > > The remaining functionality in debug.[ch] is effectively just assert > handling, conditional debug definitions and hex dumping. The hex > dumping and assert function can be moved into the new printk module, > while the rest can be moved into top-level header files. This allows > fs/xfs/support/debug.[ch] to be completely removed from the > codebase. > > Signed-off-by: Dave Chinner > --- > fs/xfs/Makefile | 1 - > fs/xfs/linux-2.6/xfs_linux.h | 21 +++++++++++++++++++ You need to delete the #include that remains in linux-2.6/xfs_linux.h too. -Alex From SRS0+U1xd+46+fromorbit.com=dave@internode.on.net Wed Jan 12 01:24:55 2011 X-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_35, J_CHICKENPOX_43,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 p0C7OsBJ153807 for ; Wed, 12 Jan 2011 01:24:54 -0600 X-ASG-Debug-ID: 1294817224-034d02d40000-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 61C97FE053F for ; Tue, 11 Jan 2011 23:27:04 -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 xEEJX3TTlVMdg3KA for ; Tue, 11 Jan 2011 23:27:04 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51960598-1927428 for ; Wed, 12 Jan 2011 17:57:03 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1Pcv6j-00017Y-OG for xfs@oss.sgi.com; Wed, 12 Jan 2011 18:27:01 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pcv6P-0004rf-Hp for xfs@oss.sgi.com; Wed, 12 Jan 2011 18:26:41 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] [RFC] xfs: stop using the page cache to back the buffer cache Subject: [PATCH] [RFC] xfs: stop using the page cache to back the buffer cache Date: Wed, 12 Jan 2011 18:26:41 +1100 Message-Id: <1294817201-18670-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: 1294817226 X-Barracuda-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.52140 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 cache has it's own LRU, we do not need to use the page cache to provide persistent caching and reclaim infrastructure. Convert the buffer cache to use alloc_pages() instead of the page cache. This will remove all the overhead of page cache management from setup and teardown of the buffers, as well as needing to mark pages accessed as we find buffers in the buffer cache. By avoiding the page cache, we also remove the need to keep state in the page_private(page) field so that it persists across buffer free/buffer rebuild, and so all that code can be removed. This also fixes the long-standing problem of not having enough bits in the page_private field to track all the state needed for a 512 sector/64k page setup. It also removes the need for page locking during reads as the pages are unique to the buffer and nobody else will be attempting to access them. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_buf.c | 310 ++++++++++---------------------------------- fs/xfs/linux-2.6/xfs_buf.h | 4 +- 2 files changed, 73 insertions(+), 241 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 3cc671c..e74e5d2 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -94,75 +94,6 @@ xfs_buf_vmap_len( } /* - * Page Region interfaces. - * - * For pages in filesystems where the blocksize is smaller than the - * pagesize, we use the page->private field (long) to hold a bitmap - * of uptodate regions within the page. - * - * Each such region is "bytes per page / bits per long" bytes long. - * - * NBPPR == number-of-bytes-per-page-region - * BTOPR == bytes-to-page-region (rounded up) - * BTOPRT == bytes-to-page-region-truncated (rounded down) - */ -#if (BITS_PER_LONG == 32) -#define PRSHIFT (PAGE_CACHE_SHIFT - 5) /* (32 == 1<<5) */ -#elif (BITS_PER_LONG == 64) -#define PRSHIFT (PAGE_CACHE_SHIFT - 6) /* (64 == 1<<6) */ -#else -#error BITS_PER_LONG must be 32 or 64 -#endif -#define NBPPR (PAGE_CACHE_SIZE/BITS_PER_LONG) -#define BTOPR(b) (((unsigned int)(b) + (NBPPR - 1)) >> PRSHIFT) -#define BTOPRT(b) (((unsigned int)(b) >> PRSHIFT)) - -STATIC unsigned long -page_region_mask( - size_t offset, - size_t length) -{ - unsigned long mask; - int first, final; - - first = BTOPR(offset); - final = BTOPRT(offset + length - 1); - first = min(first, final); - - mask = ~0UL; - mask <<= BITS_PER_LONG - (final - first); - mask >>= BITS_PER_LONG - (final); - - ASSERT(offset + length <= PAGE_CACHE_SIZE); - ASSERT((final - first) < BITS_PER_LONG && (final - first) >= 0); - - return mask; -} - -STATIC void -set_page_region( - struct page *page, - size_t offset, - size_t length) -{ - set_page_private(page, - page_private(page) | page_region_mask(offset, length)); - if (page_private(page) == ~0UL) - SetPageUptodate(page); -} - -STATIC int -test_page_region( - struct page *page, - size_t offset, - size_t length) -{ - unsigned long mask = page_region_mask(offset, length); - - return (mask && (page_private(page) & mask) == mask); -} - -/* * 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 @@ -311,7 +242,7 @@ STATIC void _xfs_buf_free_pages( xfs_buf_t *bp) { - if (bp->b_pages != bp->b_page_array) { + if (bp->b_pages && bp->b_pages != bp->b_page_array) { kmem_free(bp->b_pages); bp->b_pages = NULL; } @@ -332,7 +263,7 @@ xfs_buf_free( ASSERT(list_empty(&bp->b_lru)); - if (bp->b_flags & (_XBF_PAGE_CACHE|_XBF_PAGES)) { + if (bp->b_flags & _XBF_PAGES) { uint i; if (xfs_buf_is_vmapped(bp)) @@ -342,25 +273,22 @@ xfs_buf_free( for (i = 0; i < bp->b_page_count; i++) { struct page *page = bp->b_pages[i]; - if (bp->b_flags & _XBF_PAGE_CACHE) - ASSERT(!PagePrivate(page)); - page_cache_release(page); + __free_page(page); } - } + } else if (bp->b_flags & _XBF_KMEM) + kmem_free(bp->b_addr); _xfs_buf_free_pages(bp); xfs_buf_deallocate(bp); } /* - * Finds all pages for buffer in question and builds it's page list. + * Allocates all the pages for buffer in question and builds it's page list. */ STATIC int -_xfs_buf_lookup_pages( +xfs_buf_allocate_buffer( xfs_buf_t *bp, uint flags) { - struct address_space *mapping = bp->b_target->bt_mapping; - size_t blocksize = bp->b_target->bt_bsize; size_t size = bp->b_count_desired; size_t nbytes, offset; gfp_t gfp_mask = xb_to_gfp(flags); @@ -369,29 +297,54 @@ _xfs_buf_lookup_pages( xfs_off_t end; int error; - end = bp->b_file_offset + bp->b_buffer_length; - page_count = xfs_buf_btoc(end) - xfs_buf_btoct(bp->b_file_offset); + /* + * for buffers that are contained within a single page, just allocate + * the memory from the heap - there's no need for the complexity of + * page arrays to keep allocation down to order 0. + */ + if (bp->b_buffer_length <= PAGE_SIZE) { + page_count = 1; + } else { + end = bp->b_file_offset + bp->b_buffer_length; + page_count = xfs_buf_btoc(end) - + xfs_buf_btoct(bp->b_file_offset); + } error = _xfs_buf_get_pages(bp, page_count, flags); if (unlikely(error)) return error; - bp->b_flags |= _XBF_PAGE_CACHE; + + if (bp->b_page_count == 1) { + unsigned long pageaddr; + + bp->b_addr = kmem_alloc(bp->b_buffer_length, xb_to_km(flags)); + if (!bp->b_addr) + return ENOMEM; + + pageaddr = (unsigned long)bp->b_addr & PAGE_MASK; + ASSERT(((unsigned long)(bp->b_addr + bp->b_buffer_length - 1) & PAGE_MASK) == pageaddr); + + bp->b_offset = (unsigned long)bp->b_addr - pageaddr; + bp->b_pages[0] = virt_to_page((void *)pageaddr); + + bp->b_flags |= XBF_MAPPED|_XBF_KMEM; + return 0; + } offset = bp->b_offset; - first = bp->b_file_offset >> PAGE_CACHE_SHIFT; + first = bp->b_file_offset >> PAGE_SHIFT; + bp->b_flags |= _XBF_PAGES; for (i = 0; i < bp->b_page_count; i++) { struct page *page; uint retries = 0; - - retry: - page = find_or_create_page(mapping, first + i, gfp_mask); +retry: + page = alloc_page(gfp_mask); if (unlikely(page == NULL)) { if (flags & XBF_READ_AHEAD) { bp->b_page_count = i; - for (i = 0; i < bp->b_page_count; i++) - unlock_page(bp->b_pages[i]); - return -ENOMEM; + error = ENOMEM; + goto out_free_pages; } /* @@ -412,33 +365,16 @@ _xfs_buf_lookup_pages( XFS_STATS_INC(xb_page_found); - nbytes = min_t(size_t, size, PAGE_CACHE_SIZE - offset); + nbytes = min_t(size_t, size, PAGE_SIZE - offset); size -= nbytes; - - ASSERT(!PagePrivate(page)); - if (!PageUptodate(page)) { - page_count--; - if (blocksize >= PAGE_CACHE_SIZE) { - if (flags & XBF_READ) - bp->b_flags |= _XBF_PAGE_LOCKED; - } else if (!PagePrivate(page)) { - if (test_page_region(page, offset, nbytes)) - page_count++; - } - } - bp->b_pages[i] = page; offset = 0; } + return 0; - if (!(bp->b_flags & _XBF_PAGE_LOCKED)) { - for (i = 0; i < bp->b_page_count; i++) - unlock_page(bp->b_pages[i]); - } - - if (page_count == bp->b_page_count) - bp->b_flags |= XBF_DONE; - +out_free_pages: + for (i = 0; i < bp->b_page_count; i++) + __free_page(bp->b_pages[i]); return error; } @@ -450,8 +386,9 @@ _xfs_buf_map_pages( xfs_buf_t *bp, uint flags) { - /* A single page buffer is always mappable */ + ASSERT(bp->b_flags & _XBF_PAGES); if (bp->b_page_count == 1) { + /* A single page buffer is always mappable */ bp->b_addr = page_address(bp->b_pages[0]) + bp->b_offset; bp->b_flags |= XBF_MAPPED; } else if (flags & XBF_MAPPED) { @@ -570,7 +507,7 @@ found: if (bp->b_flags & XBF_STALE) { ASSERT((bp->b_flags & _XBF_DELWRI_Q) == 0); - bp->b_flags &= XBF_MAPPED; + bp->b_flags &= XBF_MAPPED|_XBF_KMEM|_XBF_PAGES; } trace_xfs_buf_find(bp, flags, _RET_IP_); @@ -599,7 +536,7 @@ xfs_buf_get( bp = _xfs_buf_find(target, ioff, isize, flags, new_bp); if (bp == new_bp) { - error = _xfs_buf_lookup_pages(bp, flags); + error = xfs_buf_allocate_buffer(bp, flags); if (error) goto no_buffer; } else { @@ -711,7 +648,7 @@ xfs_buf_readahead( { struct backing_dev_info *bdi; - bdi = target->bt_mapping->backing_dev_info; + bdi = blk_get_backing_dev_info(target->bt_bdev); if (bdi_read_congested(bdi)) return; @@ -790,10 +727,10 @@ xfs_buf_associate_memory( size_t buflen; int page_count; - pageaddr = (unsigned long)mem & PAGE_CACHE_MASK; + pageaddr = (unsigned long)mem & PAGE_MASK; offset = (unsigned long)mem - pageaddr; - buflen = PAGE_CACHE_ALIGN(len + offset); - page_count = buflen >> PAGE_CACHE_SHIFT; + buflen = PAGE_ALIGN(len + offset); + page_count = buflen >> PAGE_SHIFT; /* Free any previous set of page pointers */ if (bp->b_pages) @@ -810,13 +747,12 @@ xfs_buf_associate_memory( for (i = 0; i < bp->b_page_count; i++) { bp->b_pages[i] = mem_to_page((void *)pageaddr); - pageaddr += PAGE_CACHE_SIZE; + pageaddr += PAGE_SIZE; } bp->b_count_desired = len; bp->b_buffer_length = buflen; bp->b_flags |= XBF_MAPPED; - bp->b_flags &= ~_XBF_PAGE_LOCKED; return 0; } @@ -990,7 +926,7 @@ xfs_buf_lock( if (atomic_read(&bp->b_pin_count) && (bp->b_flags & XBF_STALE)) xfs_log_force(bp->b_target->bt_mount, 0); if (atomic_read(&bp->b_io_remaining)) - blk_run_address_space(bp->b_target->bt_mapping); + blk_run_backing_dev(bp->b_target->bt_bdi, NULL); down(&bp->b_sema); XB_SET_OWNER(bp); @@ -1035,7 +971,7 @@ xfs_buf_wait_unpin( if (atomic_read(&bp->b_pin_count) == 0) break; if (atomic_read(&bp->b_io_remaining)) - blk_run_address_space(bp->b_target->bt_mapping); + blk_run_backing_dev(bp->b_target->bt_bdi, NULL); schedule(); } remove_wait_queue(&bp->b_waiters, &wait); @@ -1248,10 +1184,8 @@ _xfs_buf_ioend( xfs_buf_t *bp, int schedule) { - if (atomic_dec_and_test(&bp->b_io_remaining) == 1) { - bp->b_flags &= ~_XBF_PAGE_LOCKED; + if (atomic_dec_and_test(&bp->b_io_remaining) == 1) xfs_buf_ioend(bp, schedule); - } } STATIC void @@ -1260,35 +1194,12 @@ xfs_buf_bio_end_io( int error) { xfs_buf_t *bp = (xfs_buf_t *)bio->bi_private; - unsigned int blocksize = bp->b_target->bt_bsize; - struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; xfs_buf_ioerror(bp, -error); if (!error && xfs_buf_is_vmapped(bp) && (bp->b_flags & XBF_READ)) invalidate_kernel_vmap_range(bp->b_addr, xfs_buf_vmap_len(bp)); - do { - struct page *page = bvec->bv_page; - - ASSERT(!PagePrivate(page)); - if (unlikely(bp->b_error)) { - if (bp->b_flags & XBF_READ) - ClearPageUptodate(page); - } else if (blocksize >= PAGE_CACHE_SIZE) { - SetPageUptodate(page); - } else if (!PagePrivate(page) && - (bp->b_flags & _XBF_PAGE_CACHE)) { - set_page_region(page, bvec->bv_offset, bvec->bv_len); - } - - if (--bvec >= bio->bi_io_vec) - prefetchw(&bvec->bv_page->flags); - - if (bp->b_flags & _XBF_PAGE_LOCKED) - unlock_page(page); - } while (bvec >= bio->bi_io_vec); - _xfs_buf_ioend(bp, 1); bio_put(bio); } @@ -1302,7 +1213,6 @@ _xfs_buf_ioapply( int offset = bp->b_offset; int size = bp->b_count_desired; sector_t sector = bp->b_bn; - unsigned int blocksize = bp->b_target->bt_bsize; total_nr_pages = bp->b_page_count; map_i = 0; @@ -1323,29 +1233,6 @@ _xfs_buf_ioapply( (bp->b_flags & XBF_READ_AHEAD) ? READA : READ; } - /* Special code path for reading a sub page size buffer in -- - * we populate up the whole page, and hence the other metadata - * in the same page. This optimization is only valid when the - * filesystem block size is not smaller than the page size. - */ - if ((bp->b_buffer_length < PAGE_CACHE_SIZE) && - ((bp->b_flags & (XBF_READ|_XBF_PAGE_LOCKED)) == - (XBF_READ|_XBF_PAGE_LOCKED)) && - (blocksize >= PAGE_CACHE_SIZE)) { - bio = bio_alloc(GFP_NOIO, 1); - - bio->bi_bdev = bp->b_target->bt_bdev; - bio->bi_sector = sector - (offset >> BBSHIFT); - bio->bi_end_io = xfs_buf_bio_end_io; - bio->bi_private = bp; - - bio_add_page(bio, bp->b_pages[0], PAGE_CACHE_SIZE, 0); - size = 0; - - atomic_inc(&bp->b_io_remaining); - - goto submit_io; - } next_chunk: atomic_inc(&bp->b_io_remaining); @@ -1359,8 +1246,9 @@ next_chunk: bio->bi_end_io = xfs_buf_bio_end_io; bio->bi_private = bp; + for (; size && nr_pages; nr_pages--, map_i++) { - int rbytes, nbytes = PAGE_CACHE_SIZE - offset; + int rbytes, nbytes = PAGE_SIZE - offset; if (nbytes > size) nbytes = size; @@ -1375,7 +1263,6 @@ next_chunk: total_nr_pages--; } -submit_io: if (likely(bio->bi_size)) { if (xfs_buf_is_vmapped(bp)) { flush_kernel_vmap_range(bp->b_addr, @@ -1385,18 +1272,7 @@ submit_io: if (size) goto next_chunk; } else { - /* - * if we get here, no pages were added to the bio. However, - * we can't just error out here - if the pages are locked then - * we have to unlock them otherwise we can hang on a later - * access to the page. - */ xfs_buf_ioerror(bp, EIO); - if (bp->b_flags & _XBF_PAGE_LOCKED) { - int i; - for (i = 0; i < bp->b_page_count; i++) - unlock_page(bp->b_pages[i]); - } bio_put(bio); } } @@ -1442,7 +1318,7 @@ xfs_buf_iowait( trace_xfs_buf_iowait(bp, _RET_IP_); if (atomic_read(&bp->b_io_remaining)) - blk_run_address_space(bp->b_target->bt_mapping); + blk_run_backing_dev(bp->b_target->bt_bdi, NULL); wait_for_completion(&bp->b_iowait); trace_xfs_buf_iowait_done(bp, _RET_IP_); @@ -1460,8 +1336,8 @@ xfs_buf_offset( return XFS_BUF_PTR(bp) + offset; offset += bp->b_offset; - page = bp->b_pages[offset >> PAGE_CACHE_SHIFT]; - return (xfs_caddr_t)page_address(page) + (offset & (PAGE_CACHE_SIZE-1)); + page = bp->b_pages[offset >> PAGE_SHIFT]; + return (xfs_caddr_t)page_address(page) + (offset & (PAGE_SIZE-1)); } /* @@ -1483,9 +1359,9 @@ xfs_buf_iomove( page = bp->b_pages[xfs_buf_btoct(boff + bp->b_offset)]; cpoff = xfs_buf_poff(boff + bp->b_offset); csize = min_t(size_t, - PAGE_CACHE_SIZE-cpoff, bp->b_count_desired-boff); + PAGE_SIZE-cpoff, bp->b_count_desired-boff); - ASSERT(((csize + cpoff) <= PAGE_CACHE_SIZE)); + ASSERT(((csize + cpoff) <= PAGE_SIZE)); switch (mode) { case XBRW_ZERO: @@ -1598,7 +1474,6 @@ xfs_free_buftarg( xfs_flush_buftarg(btp, 1); if (mp->m_flags & XFS_MOUNT_BARRIER) xfs_blkdev_issue_flush(btp); - iput(btp->bt_mapping->host); kthread_stop(btp->bt_task); kmem_free(btp); @@ -1622,15 +1497,6 @@ xfs_setsize_buftarg_flags( return EINVAL; } - if (verbose && - (PAGE_CACHE_SIZE / BITS_PER_LONG) > sectorsize) { - printk(KERN_WARNING - "XFS: %u byte sectors in use on device %s. " - "This is suboptimal; %u or greater is ideal.\n", - sectorsize, XFS_BUFTARG_NAME(btp), - (unsigned int)PAGE_CACHE_SIZE / BITS_PER_LONG); - } - return 0; } @@ -1645,7 +1511,7 @@ xfs_setsize_buftarg_early( struct block_device *bdev) { return xfs_setsize_buftarg_flags(btp, - PAGE_CACHE_SIZE, bdev_logical_block_size(bdev), 0); + PAGE_SIZE, bdev_logical_block_size(bdev), 0); } int @@ -1658,41 +1524,6 @@ xfs_setsize_buftarg( } STATIC int -xfs_mapping_buftarg( - xfs_buftarg_t *btp, - struct block_device *bdev) -{ - struct backing_dev_info *bdi; - struct inode *inode; - struct address_space *mapping; - static const struct address_space_operations mapping_aops = { - .sync_page = block_sync_page, - .migratepage = fail_migrate_page, - }; - - inode = new_inode(bdev->bd_inode->i_sb); - if (!inode) { - printk(KERN_WARNING - "XFS: Cannot allocate mapping inode for device %s\n", - XFS_BUFTARG_NAME(btp)); - return ENOMEM; - } - inode->i_ino = get_next_ino(); - inode->i_mode = S_IFBLK; - inode->i_bdev = bdev; - inode->i_rdev = bdev->bd_dev; - bdi = blk_get_backing_dev_info(bdev); - if (!bdi) - bdi = &default_backing_dev_info; - mapping = &inode->i_data; - mapping->a_ops = &mapping_aops; - mapping->backing_dev_info = bdi; - mapping_set_gfp_mask(mapping, GFP_NOFS); - btp->bt_mapping = mapping; - return 0; -} - -STATIC int xfs_alloc_delwrite_queue( xfs_buftarg_t *btp, const char *fsname) @@ -1720,12 +1551,11 @@ xfs_alloc_buftarg( btp->bt_mount = mp; btp->bt_dev = bdev->bd_dev; btp->bt_bdev = bdev; + btp->bt_bdi = blk_get_backing_dev_info(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)) - goto error; if (xfs_alloc_delwrite_queue(btp, fsname)) goto error; btp->bt_shrinker.shrink = xfs_buftarg_shrink; @@ -1947,7 +1777,7 @@ xfsbufd( count++; } if (count) - blk_run_address_space(target->bt_mapping); + blk_run_backing_dev(target->bt_bdi, NULL); } while (!kthread_should_stop()); @@ -1995,7 +1825,7 @@ xfs_flush_buftarg( if (wait) { /* Expedite and wait for IO to complete. */ - blk_run_address_space(target->bt_mapping); + blk_run_backing_dev(target->bt_bdi, NULL); while (!list_empty(&wait_list)) { bp = list_first_entry(&wait_list, struct xfs_buf, b_list); diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index cbe6595..121f431 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h @@ -64,6 +64,7 @@ typedef enum { #define _XBF_PAGE_CACHE (1 << 17)/* backed by pagecache */ #define _XBF_PAGES (1 << 18)/* backed by refcounted pages */ #define _XBF_RUN_QUEUES (1 << 19)/* run block device task queue */ +#define _XBF_KMEM (1 << 20)/* backed by heap memory */ #define _XBF_DELWRI_Q (1 << 21)/* buffer on delwri queue */ /* @@ -103,6 +104,7 @@ typedef unsigned int xfs_buf_flags_t; { _XBF_PAGE_CACHE, "PAGE_CACHE" }, \ { _XBF_PAGES, "PAGES" }, \ { _XBF_RUN_QUEUES, "RUN_QUEUES" }, \ + { _XBF_KMEM, "KMEM" }, \ { _XBF_DELWRI_Q, "DELWRI_Q" }, \ { _XBF_PAGE_LOCKED, "PAGE_LOCKED" } @@ -120,7 +122,7 @@ typedef struct xfs_bufhash { typedef struct xfs_buftarg { dev_t bt_dev; struct block_device *bt_bdev; - struct address_space *bt_mapping; + struct backing_dev_info *bt_bdi; struct xfs_mount *bt_mount; unsigned int bt_bsize; unsigned int bt_sshift; -- 1.7.2.3 From SRS0+EUnz+46+fromorbit.com=david@internode.on.net Wed Jan 12 01:40:55 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0C7etEM154868 for ; Wed, 12 Jan 2011 01:40:55 -0600 X-ASG-Debug-ID: 1294818186-67c9027e0000-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 6F2F7257567 for ; Tue, 11 Jan 2011 23:43:07 -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 SWvA7hvCpeoEAVaO for ; Tue, 11 Jan 2011 23:43:07 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 7251567-1927428 for multiple; Wed, 12 Jan 2011 18:13:05 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PcvMG-00019Y-3q; Wed, 12 Jan 2011 18:43:04 +1100 Date: Wed, 12 Jan 2011 18:43:04 +1100 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [RFC, PATCH 0/12] xfs: rework error logging infrastructure Subject: Re: [RFC, PATCH 0/12] xfs: rework error logging infrastructure Message-ID: <20110112074304.GN28803@dastard> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> <1294805789.3115.131.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294805789.3115.131.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: 1294818188 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.52141 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Jan 11, 2011 at 10:16:29PM -0600, Alex Elder wrote: > On Wed, 2011-01-12 at 11:35 +1100, Dave Chinner wrote: > > This series completely reworks the cmn_err logging infrastructure > > by replacing it with a simple, consistent API that can be used everwhere. > > IOWs, this series replaces the various cmn_err APIs: > > . . . > > I reviewed the whole series, and offered a correction > on just one thing. I might quibble with the indentation > of some of the format strings here or there, but I > didn't bother, there sometimes is no nice way to > do those. Yeah, I tried to make them a bit more consistent - one line if possible, even if the indenting was not "pretty". In some places it made a major improvement, in other places I wasn't quite so happy with the result. > I personally like the result a lot, it's a lot cleaner > and easier on the eyes. > > In any case, you say it's an RFC but I'm OK with it. It was an RFC because I wasn't sure whether people would like the interface I proposed and converted to. I know I mentioned it previously, but no-one commented in reply with a yay or nay, so I just went an did it and this is the result. > I'm just starting to test with it but you can consider > the whole series reviewed by me. Great, thanks. I'll push it out into a topic branch tomorrow... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+EUnz+46+fromorbit.com=david@internode.on.net Wed Jan 12 05:46:38 2011 X-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 (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p0CBkbk7183835 for ; Wed, 12 Jan 2011 05:46:38 -0600 X-ASG-Debug-ID: 1294832929-1c19016b0000-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 89BCD1D27E43 for ; Wed, 12 Jan 2011 03:48:49 -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 3JcTFsD2H82gTd7k for ; Wed, 12 Jan 2011 03:48:49 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 7270858-1927428 for multiple; Wed, 12 Jan 2011 22:18:26 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PczBf-0001Uh-PK; Wed, 12 Jan 2011 22:48:23 +1100 Date: Wed, 12 Jan 2011 22:48:23 +1100 From: Dave Chinner To: "Ted Ts'o" , Lawrence Greenfield , Josef Bacik , linux-kernel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, joel.becker@oracle.com, cmm@us.ibm.com, cluster-devel@redhat.com X-ASG-Orig-Subj: Re: [PATCH 1/6] fs: add hole punching to fallocate Subject: Re: [PATCH 1/6] fs: add hole punching to fallocate Message-ID: <20110112114823.GO28803@dastard> References: <1289248327-16308-1-git-send-email-josef@redhat.com> <20101109011222.GD2715@dastard> <20101109033038.GF3099@thunk.org> <20101109044242.GH2715@dastard> <20101109214147.GK3099@thunk.org> <20101109234049.GQ2715@dastard> <20110111213007.GF2917@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110111213007.GF2917@thunk.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: 1294832930 X-Barracuda-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.52157 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, Jan 11, 2011 at 04:30:07PM -0500, Ted Ts'o wrote: > On Tue, Jan 11, 2011 at 04:13:42PM -0500, Lawrence Greenfield wrote: > > > IOWs, all they want to do is avoid the unwritten extent conversion > > > overhead. Time has shown that a bad security/performance tradeoff > > > decision was made 13 years ago in XFS, so I see little reason to > > > repeat it for ext4 today.... > > I suspect things may have changed somewhat; both in terms of > requirements and nature of cluter file systems, and the performance of > various storage systems (including PCIe-attached flash devices). We can throw 1000x more CPU power and memory at the problem than we could 13 years ago. IOW the system balance hasn't changed (even considering pci-e SSDs) compared to 13 years. Hence if it was a bad tradeoff 13 years ago, it's still a bad tradeoff today. > > I'd make use of FALLOC_FL_EXPOSE_OLD_DATA. It's not the CPU overhead > > of extent conversion. It's that extent conversion causes more metadata > > operations than what you'd have otherwise, which means systems that > > want to use O_DIRECT and make sure the data doesn't go away either > > have to write O_DIRECT|O_DSYNC or need to call fdatasync(). > > cluster file system implementor, > > One possibility might be to make it an optional feature which is only > enabled via a mount option. That way someone would have to explicit > ask for this feature two ways (via a new flag to fallocate) and a > mount option. Proliferation of mount options just to enable feature X of API Y for filesystem Z is not a good idea. Either you enable it via the fallocate API or you don't allow it at all. > It might not make sense for XFS, but for people who are using ext4 > as the local storage file system back-end, How does this differ from a local filesystem? Are you talking about storage nodes for clustered/cloudy storage? If so, I know of quite a few places that use XFS for this purpose and they all seem to measure storage in petabytes made up of small boxes containing anywhere between 30-100TB each. The only request for additional preallocation functionality I've got from people running such applications recently is for XFS_IOC_ZERO_RANGE. This is quite relevant, because that specifically converts allocated extents to unwritten extents. i.e. they like to be able to efficiently re-initialise allocated space to zeros rather than have it contain stale data. > and are doing all sorts of things to get the best performance, > including disabling the journal, I suspect it really would make > sense. That's not really a convincing argument for a new interface that needs to be maintained forever. > So it could always be an > optional-to-implement flag, that not all file systems should feel > obliged to implement. It could, but it still needs better justification. Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+8c1e557678f5428d62cb+2698+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 12 06:08:02 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0CC7xG4185946 for ; Wed, 12 Jan 2011 06:08:02 -0600 X-ASG-Debug-ID: 1294834212-036203530000-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 EFCB51D28072 for ; Wed, 12 Jan 2011 04:10:12 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id gpts4DUiynqvXaql for ; Wed, 12 Jan 2011 04:10:12 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PczWk-0000kq-Bc; Wed, 12 Jan 2011 12:10:10 +0000 Date: Wed, 12 Jan 2011 07:10:10 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 01/12] xfs: prevent NMI timeouts in cmn_err Subject: Re: [PATCH 01/12] xfs: prevent NMI timeouts in cmn_err Message-ID: <20110112121010.GA32321@infradead.org> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> <1294792553-8378-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294792553-8378-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: 1294834212 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. I think this patch also still is a candidate for 2.6.38, while the rest looks more like 2.6.39 material. Reviewed-by: Christoph Hellwig From SRS0+EUnz+46+fromorbit.com=david@internode.on.net Wed Jan 12 06:17:37 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0CCHbJM187879 for ; Wed, 12 Jan 2011 06:17:37 -0600 X-ASG-Debug-ID: 1294834788-7ff501730000-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 93C3E1256C14 for ; Wed, 12 Jan 2011 04:19: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 H5yyR5Qfz0kEMnRq for ; Wed, 12 Jan 2011 04:19:48 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 7273256-1927428 for multiple; Wed, 12 Jan 2011 22:49:47 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pczg2-0001Xf-8x; Wed, 12 Jan 2011 23:19:46 +1100 Date: Wed, 12 Jan 2011 23:19:46 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 01/12] xfs: prevent NMI timeouts in cmn_err Subject: Re: [PATCH 01/12] xfs: prevent NMI timeouts in cmn_err Message-ID: <20110112121946.GD16267@dastard> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> <1294792553-8378-2-git-send-email-david@fromorbit.com> <20110112121010.GA32321@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110112121010.GA32321@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: 1294834790 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.52160 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, Jan 12, 2011 at 07:10:10AM -0500, Christoph Hellwig wrote: > Looks good. I think this patch also still is a candidate for 2.6.38, > while the rest looks more like 2.6.39 material. Agreed. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+kcZ2+46+fromorbit.com=david@internode.on.net Wed Jan 12 06:44:01 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0CCi1jd190844 for ; Wed, 12 Jan 2011 06:44:01 -0600 X-ASG-Debug-ID: 1294836372-5f1000d10000-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 955B325DDBD for ; Wed, 12 Jan 2011 04:46:13 -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 qDyf0EuUBznz1u2i for ; Wed, 12 Jan 2011 04:46:13 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 53010481-1927428 for multiple; Wed, 12 Jan 2011 23:14:33 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pd03z-0001Zp-Cn; Wed, 12 Jan 2011 23:44:31 +1100 Date: Wed, 12 Jan 2011 23:44:31 +1100 From: Dave Chinner To: Lawrence Greenfield Cc: "Ted Ts'o" , Josef Bacik , linux-kernel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, joel.becker@oracle.com, cmm@us.ibm.com, cluster-devel@redhat.com X-ASG-Orig-Subj: Re: [PATCH 1/6] fs: add hole punching to fallocate Subject: Re: [PATCH 1/6] fs: add hole punching to fallocate Message-ID: <20110112124431.GP28803@dastard> References: <1289248327-16308-1-git-send-email-josef@redhat.com> <20101109011222.GD2715@dastard> <20101109033038.GF3099@thunk.org> <20101109044242.GH2715@dastard> <20101109214147.GK3099@thunk.org> <20101109234049.GQ2715@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-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1294836374 X-Barracuda-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.52160 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, Jan 11, 2011 at 04:13:42PM -0500, Lawrence Greenfield wrote: > On Tue, Nov 9, 2010 at 6:40 PM, Dave Chinner wrote: > > The historical reason for such behaviour existing in XFS was that in > > 1997 the CPU and IO latency cost of unwritten extent conversion was > > significant, ..... > >> (Take for example a trusted cluster filesystem backend that checks the > >> object checksum before returning any data to the user; and if the > >> check fails the cluster file system will try to use some other replica > >> stored on some other server.) > > > > IOWs, all they want to do is avoid the unwritten extent conversion > > overhead. Time has shown that a bad security/performance tradeoff > > decision was made 13 years ago in XFS, so I see little reason to > > repeat it for ext4 today.... > > I'd make use of FALLOC_FL_EXPOSE_OLD_DATA. It's not the CPU overhead > of extent conversion. It's that extent conversion causes more metadata > operations than what you'd have otherwise, Yes, that's the "IO latency" part of the cost I mentioned above. > which means systems that > want to use O_DIRECT and make sure the data doesn't go away either > have to write O_DIRECT|O_DSYNC or need to call fdatasync(). Seriously, we tell application writers _all the time_ that they *must* use fsync/fdatasync to guarantee their data is on stable storage and that they cannot rely on side-effects of filesystem or storage specific behaviours (like ext3 ordered mode) to do that job for them. You're suggesting that by introducing FALLOC_FL_EXPOSE_OLD_DATA, applications can rely on filesystem/storage specific behaviour to guarantee data is on stable storage without the use of fdatasync/fsync. Wht you describe is definitely storage specific, because volatile write caches still needs the fdatasync to issue a cache flush. Do you see the same conflict here that I do? > cluster file system implementor Which one? Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+8c1e557678f5428d62cb+2698+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 12 07:14:01 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0CDDwpK194444 for ; Wed, 12 Jan 2011 07:14:01 -0600 X-ASG-Debug-ID: 1294838171-494b00320000-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 50A62153ECA2 for ; Wed, 12 Jan 2011 05:16:12 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id BlL4jzbbMhei9C7V for ; Wed, 12 Jan 2011 05:16:12 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pd0YX-0001Jg-0l; Wed, 12 Jan 2011 13:16:05 +0000 Date: Wed, 12 Jan 2011 08:16:05 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: stop using the page cache to back the buffer cache Subject: Re: [PATCH] [RFC] xfs: stop using the page cache to back the buffer cache Message-ID: <20110112131604.GA28675@infradead.org> References: <1294817201-18670-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294817201-18670-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: 1294838172 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 > - if (bp->b_pages != bp->b_page_array) { > + if (bp->b_pages && bp->b_pages != bp->b_page_array) { If bp->p_ages is NULL it's per defintion different from b_page_array. > STATIC int > -_xfs_buf_lookup_pages( > +xfs_buf_allocate_buffer( This is a bit misnamed and rather confusing vs xfs_buf_allocate. Maybe call it xfs_buf_allocate_memory? > + /* > + * for buffers that are contained within a single page, just allocate > + * the memory from the heap - there's no need for the complexity of > + * page arrays to keep allocation down to order 0. > + */ > + if (bp->b_buffer_length <= PAGE_SIZE) { I think this should be a <, not <= - for page sized buffers avoiding the slab overhead should be much more efficient. > + page_count = 1; > + } else { > + end = bp->b_file_offset + bp->b_buffer_length; > + page_count = xfs_buf_btoc(end) - > + xfs_buf_btoct(bp->b_file_offset); > + } > > error = _xfs_buf_get_pages(bp, page_count, flags); > if (unlikely(error)) > return error; > + > + if (bp->b_page_count == 1) { I'd just duplicate the _xfs_buf_get_pages inside the branches to make this a lot cleaner. The page_count calculation in the else clause can never end up as 1 anyway. Maybe even make it two different functions and let the only caller decide which one to use. > + unsigned long pageaddr; > + > + bp->b_addr = kmem_alloc(bp->b_buffer_length, xb_to_km(flags)); > + if (!bp->b_addr) > + return ENOMEM; > + > + pageaddr = (unsigned long)bp->b_addr & PAGE_MASK; > + ASSERT(((unsigned long)(bp->b_addr + bp->b_buffer_length - 1) & PAGE_MASK) == pageaddr); > + > + bp->b_offset = (unsigned long)bp->b_addr - pageaddr; This can just be bp->b_offset = offset_in_page(bp->b_addr); > + bp->b_pages[0] = virt_to_page((void *)pageaddr); and this bp->b_pages[0] = virt_to_page(bp->b_addr); with that the above assert can be changed to not need a local variable and imho be slightly cleaner: ASSERT(((unsigned long)bp->b_addr + bp->b_buffer_length - 1) & PAGE_MASK) == (unsigned long)bp->b_addr & PAGE_MASK); although I'm not sure it's actually correct. slub is a pretty aggressive in using high order pages and might give us back memory that goes across multiple pages. Adding a loop here to assign multiple pages if needed seems safer. > + bp->b_flags |= XBF_MAPPED|_XBF_KMEM; Space around the | operator, please. > + bp->b_flags &= XBF_MAPPED|_XBF_KMEM|_XBF_PAGES; here, too. Additional comments: - the _XBF_PAGE_CACHE and _XBF_PAGE_LOCKED flags are now unused and can be removed. - the comment describing xfs_buf_t around line 141 in xfs_buf.h is now incorrect. It's not overly useful so I'd suggest removing it completely. - the comments above the buffer locking functions in xfs_buf.c (including the meta-comment) are now incorrect and should be fixed/removed. - the call to mark_page_accessed in xfs_buf_get is now superflous, as it only has a meaning for pagecache pages. From BATV+8c1e557678f5428d62cb+2698+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 12 07:19:52 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0CDJqmc195077 for ; Wed, 12 Jan 2011 07:19:52 -0600 X-ASG-Debug-ID: 1294838525-18b0006d0000-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 EFF6C1D28547 for ; Wed, 12 Jan 2011 05:22:05 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id JW2jTgg10K0jYl6b for ; Wed, 12 Jan 2011 05:22:05 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pd0eL-00020o-KJ; Wed, 12 Jan 2011 13:22:05 +0000 Date: Wed, 12 Jan 2011 08:22:05 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: stop using the page cache to back the buffer cache Subject: Re: [PATCH] [RFC] xfs: stop using the page cache to back the buffer cache Message-ID: <20110112132205.GA7648@infradead.org> References: <1294817201-18670-1-git-send-email-david@fromorbit.com> <20110112131604.GA28675@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110112131604.GA28675@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1294838525 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 > although I'm not sure it's actually correct. slub is a pretty > aggressive in using high order pages and might give us back memory that > goes across multiple pages. Adding a loop here to assign multiple pages > if needed seems safer. In fact I think I just tripped over it during an xfsqa run, with 4k page size and 4k blocksize, but just using plain CONFIG_SLAB: [ 1924.109656] Assertion failed: ((unsigned long)(bp->b_addr + bp->b_buffer_length - 1) & PAGE_MASK) == pageaddr, file: fs/xfs/linux-2.6/xfs_buf.c, line: 325 [ 1924.113437] ------------[ cut here ]------------ [ 1924.114798] kernel BUG at fs/xfs/support/debug.c:108! [ 1924.116222] invalid opcode: 0000 [#1] SMP [ 1924.117359] last sysfs file: /sys/devices/virtual/block/loop0/removable [ 1924.117359] Modules linked in: [ 1924.117359] [ 1924.117359] Pid: 716, comm: xfs_growfs Not tainted 2.6.37-rc4-xfs+ #81 /Bochs [ 1924.117359] EIP: 0060:[] EFLAGS: 00010282 CPU: 0 [ 1924.117359] EIP is at assfail+0x1e/0x30 [ 1924.117359] EAX: 000000a1 EBX: f57e9b10 ECX: ffffff5f EDX: 0000006e [ 1924.117359] ESI: f49ae000 EDI: f57e9b10 EBP: f42abd50 ESP: f42abd40 [ 1924.117359] DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 [ 1924.117359] Process xfs_growfs (pid: 716, ti=f42aa000 task=cb6770c0 task.ti=f42aa000) [ 1924.117359] Stack: [ 1924.117359] c0bc802c c0bc77c8 c0b8ccf0 00000145 f42abd88 c04e5636 e6a4582c f4a844a8 [ 1924.117359] e6a45804 00000000 e6a45708 00000000 00000000 000002d0 00004004 00267530 [ 1924.117359] 00000000 f57e9b10 f42abdb0 c04e6619 00000800 00004004 f57e9b10 f57e9b10 [ 1924.117359] Call Trace: [ 1924.117359] [] ? xfs_buf_allocate_buffer+0x176/0x250 [ 1924.117359] [] ? xfs_buf_get+0x69/0x190 [ 1924.117359] [] ? xfs_growfs_data+0x6ae/0xc60 [ 1924.117359] [] ? xfs_file_ioctl+0x283/0x8e0 [ 1924.117359] [] ? __do_fault+0xfc/0x420 [ 1924.117359] [] ? __do_fault+0x18c/0x420 [ 1924.117359] [] ? unlock_page+0x43/0x50 [ 1924.117359] [] ? __do_fault+0x328/0x420 [ 1924.117359] [] ? handle_mm_fault+0xeb/0x6a0 [ 1924.117359] [] ? xfs_file_ioctl+0x0/0x8e0 [ 1924.117359] [] ? do_vfs_ioctl+0x7d/0x5e0 [ 1924.117359] [] ? up_read+0x16/0x30 [ 1924.117359] [] ? do_page_fault+0x1ba/0x450 [ 1924.117359] [] ? sys_mmap_pgoff+0x71/0x1b0 [ 1924.117359] [] ? up_write+0x16/0x30 [ 1924.117359] [] ? sys_ioctl+0x39/0x60 [ 1924.117359] [] ? syscall_call+0x7/0xb From aelder@oss.sgi.com Wed Jan 12 09:37:26 2011 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.7 required=5.0 tests=ALL_TRUSTED,BAYES_00, J_CHICKENPOX_51,J_CHICKENPOX_65 autolearn=no 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 p0CFbQiM213320 for ; Wed, 12 Jan 2011 09:37:26 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id p0CFbP4V213227; Wed, 12 Jan 2011 09:37:25 -0600 Date: Wed, 12 Jan 2011 09:37:25 -0600 Message-Id: <201101121537.p0CFbP4V213227@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-67-g73efe4a X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: d0eb2f38b250b7d6c993adf81b0e4ded0565497e X-Git-Newrev: 73efe4a4ddf8eb2b1cc7039e8a66a23a424961af 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 73efe4a xfs: prevent NMI timeouts in cmn_err 65a84a0 xfs: Add log level to assertion printk 1884bd8 xfs: fix an assignment within an ASSERT() bfc6017 xfs: fix error handling for synchronous writes a46db60 xfs: add FITRIM support c58efdb xfs: ensure log covering transactions are synchronous eda7798 xfs: serialise unaligned direct IOs 4d8d158 xfs: factor common write setup code 637bbc7 xfs: split buffered IO write path from xfs_file_aio_write f0d26e8 xfs: split direct IO write path from xfs_file_aio_write 487f84f xfs: introduce xfs_rw_lock() helpers for locking the inode 4c5cfd1 xfs: factor post-write newsize updates edafb6d xfs: factor common post-write isize handling code a363f0c xfs: ensure sync write errors are returned from d0eb2f38b250b7d6c993adf81b0e4ded0565497e (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 73efe4a4ddf8eb2b1cc7039e8a66a23a424961af Author: Dave Chinner Date: Wed Jan 12 00:35:42 2011 +0000 xfs: prevent NMI timeouts in cmn_err 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 Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 65a84a0f7567ea244e5246e642920260cfc2744a Author: Anton Blanchard Date: Fri Jan 7 03:30:41 2011 +0000 xfs: Add log level to assertion printk I received a ppc64 bug report involving xfs but the assertion was filtered out by the console log level. Use KERN_CRIT to ensure it makes it out. Signed-off-by: Anton Blanchard Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 1884bd8354c9aec4ca501dc4773c13ad2a09af7b Author: Jesper Juhl Date: Sat Dec 25 20:14:53 2010 +0000 xfs: fix an assignment within an ASSERT() 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 Signed-off-by: Alex Elder commit bfc60177f8ab509bc225becbb58f7e53a0e33e81 Author: Christoph Hellwig Date: Fri Jan 7 13:02:23 2011 +0000 xfs: fix error handling for synchronous writes If we get an IO error on a synchronous superblock write, we attach an error release function to it so that when the last reference goes away the release function is called and the buffer is invalidated and unlocked. The buffer is left locked until the release function is called so that other concurrent users of the buffer will be locked out until the buffer error is fully processed. Unfortunately, for the superblock buffer the filesyetm itself holds a reference to the buffer which prevents the reference count from dropping to zero and the release function being called. As a result, once an IO error occurs on a sync write, the buffer will never be unlocked and all future attempts to lock the buffer will hang. To make matters worse, this problems is not unique to such buffers; if there is a concurrent _xfs_buf_find() running, the lookup will grab a reference to the buffer and then wait on the buffer lock, preventing the reference count from ever falling to zero and hence unlocking the buffer. As such, the whole b_relse function implementation is broken because it cannot rely on the buffer reference count falling to zero to unlock the errored buffer. The synchronous write error path is the only path that uses this callback - it is used to ensure that the synchronous waiter gets the buffer error before the error state is cleared from the buffer by the release function. Given that the only sychronous buffer writes now go through xfs_bwrite and the error path in question can only occur for a write of a dirty, logged buffer, we can move most of the b_relse processing to happen inline in xfs_buf_iodone_callbacks, just like a normal I/O completion. In addition to that we make sure the error is not cleared in xfs_buf_iodone_callbacks, so that xfs_bwrite can reliably check it. Given that xfs_bwrite keeps the buffer locked until it has waited for it and checked the error this allows to reliably propagate the error to the caller, and make sure that the buffer is reliably unlocked. Given that xfs_buf_iodone_callbacks was the only instance of the b_relse callback we can remove it entirely. Based on earlier patches by Dave Chinner and Ajeet Yadav. Signed-off-by: Christoph Hellwig Reported-by: Ajeet Yadav Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit a46db60834883c1c8c665d7fcc7b4ab66f5966fc Author: Christoph Hellwig Date: Fri Jan 7 13:02:04 2011 +0000 xfs: add FITRIM support 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 Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit c58efdb442bb49dea1d148f207560c41918c1bf4 Author: Dave Chinner Date: Tue Jan 4 04:49:29 2011 +0000 xfs: ensure log covering transactions are synchronous To ensure the log is covered and the filesystem idles correctly, we need to ensure that dummy transactions hit the disk and do not stay pinned in memory. If the superblock is pinned in memory, it can't be flushed so the log covering cannot make progress. The result is dependent on timing - more oftent han not we continue to issues a log covering transaction every 36s rather than idling after ~90s. Fix this by making the log covering transaction synchronous. To avoid additional log force from xfssyncd, make the log covering transaction take the place of the existing log force in the xfssyncd background sync process. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit eda77982729b7170bdc9e8855f0682edf322d277 Author: Dave Chinner Date: Tue Jan 11 10:22:40 2011 +1100 xfs: serialise unaligned direct IOs 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 Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig commit 4d8d15812fd9bc96d0da11467d23e0373feae933 Author: Dave Chinner Date: Tue Jan 11 10:23:42 2011 +1100 xfs: factor common write setup code 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 Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig commit 637bbc75d9fda57c7bc77ce5ee37e29a77a0520d Author: Dave Chinner Date: Tue Jan 11 10:17:30 2011 +1100 xfs: split buffered IO write path from xfs_file_aio_write 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 Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig commit f0d26e860b6c496464c5c8165d7df08dabde01fa Author: Dave Chinner Date: Tue Jan 11 10:15:36 2011 +1100 xfs: split direct IO write path from xfs_file_aio_write 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. This also removes the failed direct IO fallback path to buffered IO. XFS handles all direct IO cases without needing to fall back to buffered IO, so we can safely remove this unused path. This greatly simplifies the logic and locking needed in the write path. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 487f84f3f80bc6f00c59725e822653d3ec174b85 Author: Dave Chinner Date: Wed Jan 12 11:37:10 2011 +1100 xfs: introduce xfs_rw_lock() helpers for locking the inode We need to obtain the i_mutex, i_iolock and i_ilock during the read and write paths. Add a set of wrapper functions to neatly encapsulate the lock ordering and shared/exclusive semantics to make the locking easier to follow and get right. Note that this changes some of the exclusive locking serialisation in that serialisation will occur against the i_mutex instead of the XFS_IOLOCK_EXCL. This does not change any behaviour, and it is arguably more efficient to use the mutex for such serialisation than the rw_sem. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 4c5cfd1b4157fb75d43b44a147c2feba6422fc4f Author: Dave Chinner Date: Tue Jan 11 10:14:16 2011 +1100 xfs: factor post-write newsize updates Signed-off-by: Dave Chinner Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig commit edafb6da9aa725e4de5fe758fe81644b6167f9a2 Author: Dave Chinner Date: Tue Jan 11 10:14:06 2011 +1100 xfs: factor common post-write isize handling code Signed-off-by: Dave Chinner Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig commit a363f0c2030cb9781e7e458f4a9e354b6c43d7ce Author: Dave Chinner Date: Tue Jan 11 10:13:53 2011 +1100 xfs: ensure sync write errors are returned 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 Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig ----------------------------------------------------------------------- Summary of changes: fs/xfs/Makefile | 1 + fs/xfs/linux-2.6/xfs_buf.c | 7 +- fs/xfs/linux-2.6/xfs_buf.h | 7 +- fs/xfs/linux-2.6/xfs_discard.c | 191 ++++++++++++++ fs/xfs/linux-2.6/xfs_discard.h | 8 + fs/xfs/linux-2.6/xfs_file.c | 535 +++++++++++++++++++++++----------------- fs/xfs/linux-2.6/xfs_ioctl.c | 3 + fs/xfs/linux-2.6/xfs_super.c | 2 +- fs/xfs/linux-2.6/xfs_sync.c | 11 +- fs/xfs/linux-2.6/xfs_sysctl.c | 23 ++- fs/xfs/linux-2.6/xfs_trace.h | 33 +++ fs/xfs/support/debug.c | 112 ++++----- fs/xfs/support/debug.h | 25 ++- fs/xfs/xfs_alloc.c | 10 +- fs/xfs/xfs_alloc.h | 25 ++- fs/xfs/xfs_buf_item.c | 151 ++++-------- fs/xfs/xfs_error.c | 31 --- fs/xfs/xfs_error.h | 18 +- fs/xfs/xfs_fsops.c | 10 +- fs/xfs/xfs_fsops.h | 2 +- fs/xfs/xfs_log.c | 2 +- fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_trans.c | 2 +- 23 files changed, 729 insertions(+), 482 deletions(-) create mode 100644 fs/xfs/linux-2.6/xfs_discard.c create mode 100644 fs/xfs/linux-2.6/xfs_discard.h hooks/post-receive -- XFS development tree From aelder@sgi.com Wed Jan 12 09:54:43 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0CFsh1m215340 for ; Wed, 12 Jan 2011 09:54:43 -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 ACA568F80B9; Wed, 12 Jan 2011 07:56:54 -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, 12 Jan 2011 09:56:31 -0600 Subject: XFS master branch update From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Cc: david@fromorbit.com In-Reply-To: <20110112121946.GD16267@dastard> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> <1294792553-8378-2-git-send-email-david@fromorbit.com> <20110112121010.GA32321@infradead.org> <20110112121946.GD16267@dastard> Content-Type: text/plain; charset="UTF-8" Date: Wed, 12 Jan 2011 09:56:31 -0600 Message-ID: <1294847791.4269.31.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 12 Jan 2011 15:56:31.0559 (UTC) FILETIME=[47C8ED70:01CBB271] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I just pushed an update to the master branch on oss. It includes: - Dave's fixes to address corruption due to overlapping concurrent async direct I/O (and associated code cleanup). - Dave's patch to avoid repeated log covering transactions while idle. - Christoph's patch to add FITRIM support to XFS. - Christoph's change (with credit to others) to rework the buffer I/O completion code, fixing problems that occur should a sync I/O fail. - Three more, described below. I plan to send this stuff to Linus in another pull request for 2.6.38--probably next week sometime--after it's spent some time in the -next tree. Dave, you're going to want to pay particular note to the last three of these. They affect patch series you have but which have not been accepted yet: - xfs: prevent NMI timeouts in cmn_err This was the first in your recent log API series - xfs: Add log level to assertion printk This one gets eliminated by the log API series, but the last one in your series won't apply cleanly because one is in place. (Trivial fix.) - xfs: fix an assignment within an ASSERT() This one was proposed by Anton Blanchard but you said it had already been covered by a patch you had. But that patch was held back with the percpu counters stuff, and I wanted to include the fix now. Again, easy to fix but I just wanted to call your attention to it. -Alex From bpm@sgi.com Wed Jan 12 13:38:50 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0CJcoXu242625 for ; Wed, 12 Jan 2011 13:38:50 -0600 Received: from lady3jane.americas.sgi.com (lady3jane.americas.sgi.com [128.162.244.187]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6DC548F8040; Wed, 12 Jan 2011 11:41:01 -0800 (PST) Received: from lady3jane.americas.sgi.com (localhost [127.0.0.1]) by lady3jane.americas.sgi.com (Postfix) with ESMTP id 16CE52417769; Wed, 12 Jan 2011 13:42:28 -0600 (CST) Subject: [PATCH] xfs_bmap_add_extent_delay_real should set br_startoff To: aelder@sgi.com From: Ben Myers Cc: xfs@oss.sgi.com Date: Wed, 12 Jan 2011 13:42:28 -0600 Message-ID: <20110112194228.8449.41844.stgit@lady3jane.americas.sgi.com> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 When filling in the middle of a previous delayed allocation, set br_startoff of the new delay extent to the right to NULLSTARTBLOCK so that it is ignored by xfs_bmap_extent_to_btree. This prevents a forced shutdown when that in-core extent is converted from delay to real and is found to be already in the btree. The value is overwritten below. SGI-PV: 1013221 Signed-off-by: Ben Myers --- fs/xfs/xfs_bmap.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 4111cd3..cd75c77 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -1040,13 +1040,14 @@ xfs_bmap_add_extent_delay_real( * This case is avoided almost all the time. */ temp = new->br_startoff - PREV.br_startoff; + temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); r[0] = *new; r[1].br_state = PREV.br_state; - r[1].br_startblock = 0; + r[1].br_startblock = nullstartblock( + (int)xfs_bmap_worst_indlen(ip, temp2)); r[1].br_startoff = new_endoff; - temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; r[1].br_blockcount = temp2; xfs_iext_insert(ip, idx + 1, 2, &r[0], state); ip->i_df.if_lastex = idx + 1; From SRS0+EUnz+46+fromorbit.com=david@internode.on.net Wed Jan 12 15:13:01 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0CLD1s5255389 for ; Wed, 12 Jan 2011 15:13:01 -0600 X-ASG-Debug-ID: 1294866912-376c026d0000-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 C6E171D2AC1D for ; Wed, 12 Jan 2011 13:15: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 t0IB6L0ZBLM4eF2l for ; Wed, 12 Jan 2011 13:15:13 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 7303850-1927428 for multiple; Thu, 13 Jan 2011 07:45:12 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pd82A-0002RC-AG; Thu, 13 Jan 2011 08:15:10 +1100 Date: Thu, 13 Jan 2011 08:15:10 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: stop using the page cache to back the buffer cache Subject: Re: [PATCH] [RFC] xfs: stop using the page cache to back the buffer cache Message-ID: <20110112211510.GQ28803@dastard> References: <1294817201-18670-1-git-send-email-david@fromorbit.com> <20110112131604.GA28675@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110112131604.GA28675@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: 1294866914 X-Barracuda-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.52193 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, Jan 12, 2011 at 08:16:05AM -0500, Christoph Hellwig wrote: > > - if (bp->b_pages != bp->b_page_array) { > > + if (bp->b_pages && bp->b_pages != bp->b_page_array) { > > If bp->p_ages is NULL it's per defintion different from b_page_array. True. I'll drop that mod. > > > STATIC int > > -_xfs_buf_lookup_pages( > > +xfs_buf_allocate_buffer( > > This is a bit misnamed and rather confusing vs xfs_buf_allocate. > > Maybe call it xfs_buf_allocate_memory? Yes, seems lik a better name. > > > + /* > > + * for buffers that are contained within a single page, just allocate > > + * the memory from the heap - there's no need for the complexity of > > + * page arrays to keep allocation down to order 0. > > + */ > > + if (bp->b_buffer_length <= PAGE_SIZE) { > > I think this should be a <, not <= - for page sized buffers avoiding > the slab overhead should be much more efficient. *nod* The patch has been sitting around for a couple of weeks, and when I did a quick look at it before posting it I wondered if I should make that exact change before posting it. I decided not to because I didn't want to wait for retesting before posting... > > > + page_count = 1; > > + } else { > > + end = bp->b_file_offset + bp->b_buffer_length; > > + page_count = xfs_buf_btoc(end) - > > + xfs_buf_btoct(bp->b_file_offset); > > + } > > > > error = _xfs_buf_get_pages(bp, page_count, flags); > > if (unlikely(error)) > > return error; > > + > > + if (bp->b_page_count == 1) { > > I'd just duplicate the _xfs_buf_get_pages inside the branches to make > this a lot cleaner. The page_count calculation in the else clause can > never end up as 1 anyway. Maybe even make it two different functions > and let the only caller decide which one to use. OK, I'll rework the logic here to clean up the flow. > > + unsigned long pageaddr; > > + > > + bp->b_addr = kmem_alloc(bp->b_buffer_length, xb_to_km(flags)); > > + if (!bp->b_addr) > > + return ENOMEM; > > + > > + pageaddr = (unsigned long)bp->b_addr & PAGE_MASK; > > + ASSERT(((unsigned long)(bp->b_addr + bp->b_buffer_length - 1) & PAGE_MASK) == pageaddr); > > + > > + bp->b_offset = (unsigned long)bp->b_addr - pageaddr; > > This can just be > > bp->b_offset = offset_in_page(bp->b_addr); > > > + bp->b_pages[0] = virt_to_page((void *)pageaddr); > > and this > > bp->b_pages[0] = virt_to_page(bp->b_addr); > > with that the above assert can be changed to not need a local variable > and imho be slightly cleaner: > > ASSERT(((unsigned long)bp->b_addr + bp->b_buffer_length - 1) & > PAGE_MASK) == > (unsigned long)bp->b_addr & PAGE_MASK); Good idea, it can definitely be made cleaner. > although I'm not sure it's actually correct. slub is a pretty > aggressive in using high order pages and might give us back memory that > goes across multiple pages. Adding a loop here to assign multiple pages > if needed seems safer. Hmmm. I've been using SLUB and not seen any assert triggers. I put the assert there because I was concerned about whether this could occur, but the heap is backed by power-of-two sized slabs so I think that slub doesn't trigger it. I'll have a think about how to handle buffers that span multiple pages cleanly - like you said a loop is probably the easiest way to handle it. > > + bp->b_flags |= XBF_MAPPED|_XBF_KMEM; > > Space around the | operator, please. > > > + bp->b_flags &= XBF_MAPPED|_XBF_KMEM|_XBF_PAGES; > > here, too. Will do. As you've noticed, the code is pretty rough still. :/ > Additional comments: > > - the _XBF_PAGE_CACHE and _XBF_PAGE_LOCKED flags are now unused and can > be removed. > - the comment describing xfs_buf_t around line 141 in xfs_buf.h is now > incorrect. It's not overly useful so I'd suggest removing it > completely. > - the comments above the buffer locking functions in xfs_buf.c > (including the meta-comment) are now incorrect and should be > fixed/removed. > - the call to mark_page_accessed in xfs_buf_get is now superflous, > as it only has a meaning for pagecache pages. I'll clean them up for the next version. Thanks for the initial sanity check, Christoph. Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfs@pzystorm.de Wed Jan 12 17:35:21 2011 X-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,MISSING_HEADERS 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 p0CNZKdb014501 for ; Wed, 12 Jan 2011 17:35:21 -0600 X-ASG-Debug-ID: 1294875452-633400d80000-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 2F5CE1258982 for ; Wed, 12 Jan 2011 15:37:33 -0800 (PST) Received: from mail.pzystorm.de (mail.pzystorm.de [188.40.193.4]) by cuda.sgi.com with ESMTP id 4vuhGX6DmjFF3KkK for ; Wed, 12 Jan 2011 15:37:33 -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 1PdAFu-0005pI-Cn for xfs@oss.sgi.com; Thu, 13 Jan 2011 00:37:30 +0100 Message-ID: <4D2E3B38.6010506@pzystorm.de> Date: Thu, 13 Jan 2011 00:37:28 +0100 From: Kevin Richter Reply-To: xfs@pzystorm.de MIME-Version: 1.0 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 References: <4D0C9A4F.4040108@pzystorm.de> <20101220001024.GH5193@dastard> <4D0EC5C5.2070407@pzystorm.de> <20101220045126.GK5193@dastard> <20101220105547.4f9e7218@galadriel.home> In-Reply-To: <20101220105547.4f9e7218@galadriel.home> 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: 1294875454 X-Barracuda-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.44 X-Barracuda-Spam-Status: No, SCORE=-0.44 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_HEADERS X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.52206 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.58 MISSING_HEADERS Missing To: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > 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. I am wondering if there is a simple solution to backup/restore the inode table (the relation "inode <-> filename"). With "ls -aliR" I get a list which I am now saving every few days. The parameter "-i" displays the inode, that I can reconstruct the filename from the inode, if this garbling error occurs a second time. The reconstruction process probably would be a simple "grep | cut" thing. Is there perhaps a finished script doing exactly this? Or any other ideas? Bye, Kevin From SRS0+sVMC+47+fromorbit.com=david@internode.on.net Wed Jan 12 18:49:59 2011 X-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 p0D0nwlU024431 for ; Wed, 12 Jan 2011 18:49:59 -0600 X-ASG-Debug-ID: 1294879929-0dc301330000-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 B57FE1D2B2E2 for ; Wed, 12 Jan 2011 16:52:10 -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 cw6KLCz1EQ1YCXPm for ; Wed, 12 Jan 2011 16:52:10 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52659434-1927428 for multiple; Thu, 13 Jan 2011 11:22:09 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PdBQ7-0002k8-Dy; Thu, 13 Jan 2011 11:52:07 +1100 Date: Thu, 13 Jan 2011 11:52:07 +1100 From: Dave Chinner To: Ben Myers Cc: aelder@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_bmap_add_extent_delay_real should set br_startoff Subject: Re: [PATCH] xfs_bmap_add_extent_delay_real should set br_startoff Message-ID: <20110113005207.GR28803@dastard> References: <20110112194228.8449.41844.stgit@lady3jane.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110112194228.8449.41844.stgit@lady3jane.americas.sgi.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: 1294879931 X-Barracuda-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.52211 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, Jan 12, 2011 at 01:42:28PM -0600, Ben Myers wrote: > When filling in the middle of a previous delayed allocation, set > br_startoff of the new delay extent to the right to NULLSTARTBLOCK > so that it is ignored by xfs_bmap_extent_to_btree. This prevents > a forced shutdown when that in-core extent is converted from delay > to real and is found to be already in the btree. The value is > overwritten below. I'm not sure I understand what the problem is from your description. What actually goes wrong in xfs_bmap_extent_to_btree()? I'm assuming that it counts one too many real extents, and if so, shouldn't it fire this assert long before you get to a shutdown situation? ASSERT(cnt == XFS_IFORK_NEXTENTS(ip, whichfork)); Also, do you have a test case that triggers this? If so, can it be turned into a xfstests case? I like to have some idea of how the problem was encountered and verified, because this code is complex and easy to misunderstand... > SGI-PV: 1013221 The following is mostly the notes I wrote to understand what your patch does. I'm posting them so others don't need to go through the same analysis to understand the patch. While you might have the analysis in the above PV we can't see it at all, so it would be appreciated if you could put a summary of the bug analysis and test case in the commit message so we don't have to spend a couple of hours just to work out what the patch does... > > Signed-off-by: Ben Myers > --- > fs/xfs/xfs_bmap.c | 5 +++-- > 1 files changed, 3 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 4111cd3..cd75c77 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -1040,13 +1040,14 @@ xfs_bmap_add_extent_delay_real( > * This case is avoided almost all the time. > */ > temp = new->br_startoff - PREV.br_startoff; > + temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; > trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); > xfs_bmbt_set_blockcount(ep, temp); > r[0] = *new; > r[1].br_state = PREV.br_state; > - r[1].br_startblock = 0; > + r[1].br_startblock = nullstartblock( > + (int)xfs_bmap_worst_indlen(ip, temp2)); As a side note, this would be easier to understand if you converted all the r[x] notations to LEFT, RIGHT and PREV to match the rest of the code (i.e. LEFT == r[0], RIGHT = r[1] and PREV = r[2]). if you are touching this code, then this should probably be done now. The code starts with: +ddddddddddddddddddddddddddddddddddddddddddddddddd+ r[2] @ idx PREV @ idx and we are allocating: +rrrrrrrrrrrrrrr+ new and does: 1042 temp = new->br_startoff - PREV.br_startoff; 1043 trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); 1044 xfs_bmbt_set_blockcount(ep, temp); 1045 r[0] = *new; 1046 r[1].br_state = PREV.br_state; 1047 r[1].br_startblock = 0; 1048 r[1].br_startoff = new_endoff; 1049 temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; 1050 r[1].br_blockcount = temp2; 1051 xfs_iext_insert(ip, idx + 1, 2, &r[0], state); Which translates as: LEFT = *new; PREV.br_blockcount = LEFT.br_startoff = PREV.br_startoff RIGHT.br_state = PREV.br_state; RIGHT.br_startblock = 0; RIGHT.br_startoff = LEFT.br_startblock + LEFT.br_blockcount; RIGHT.br_blockcount = PREV.br_startoff + PREV.br_blockcount - RIGHT.br_startoff; Which means it has been set up as: +ddddddddddddddddddd+rrrrrrrrrrrrrrr+ddddddddddddd+ new r[2] @ idx r[0] r[1] PREV @ idx LEFT RIGHT inserted @ idx + 1 Ok, that all looks good so far except RIGHT is not yet set up as a delalloc extent. If the inode is in btree format (i.e. a cursor exists), it inserts the new extent into the btree, otherwise we trigger: 1068 if (ip->i_d.di_format == XFS_DINODE_FMT_EXTENTS && 1069 ip->i_d.di_nextents > ip->i_df.if_ext_max) { 1070 error = xfs_bmap_extents_to_btree(ip->i_transp, ip, 1071 first, flist, &cur, 1, &tmp_rval, 1072 XFS_DATA_FORK); 1073 rval |= tmp_rval; 1074 if (error) 1075 goto done; 1076 } OK, so this is done while the incore extent tree is in inconsistent state. Then we do some delalloc reservation futzing but does not modify the reservations in the extents based on the numbe of blocks allocated. Oh, if the extent->btree conversion allocates more blocks than the extent allocated reserrved, then it tries to do a new reservation for the difference (some comments in this code would be nice) and has some nasty failure code. But, that doesn't stop us from updating the delalloc block reservation counts in the extents before we convert the tree format so long ias we calculate diff (excluding allocated btree blocks) before we update PREV.br_startblock. So that means if we move this hunk and the diff calculation up above the extent->btree conversion check: 1109 ep = xfs_iext_get_ext(ifp, idx); 1110 xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); 1111 trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); 1112 trace_xfs_bmap_pre_update(ip, idx + 2, state, _THIS_IP_); 1113 xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx + 2), 1114 nullstartblock((int)temp2)); 1115 trace_xfs_bmap_post_update(ip, idx + 2, state, _THIS_IP_); And add: diff -= cur ? cur->bc_private.b.allocated : 0; after the conversion, everything should work just fine and the tracing will continue to give the same output. -- Ok, so the bug looks real, but I'm not sure that the fix really improves anything. The code needs to use LEFT, RIGHT and PREV, coul ddo with better variable names than temp and temp2, and probably should reorder the operations and the associated tracing as well as comment what the hell the code is actually doing. Typically with a fix like this I'll end up adding 5-10x as many lines in comments as code changes that fix the bug, just so I don't have to go through this process next time I have to look at this code.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From karn@ka9q.net Thu Jan 13 07:13:45 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0DDDjhr137008 for ; Thu, 13 Jan 2011 07:13:45 -0600 X-ASG-Debug-ID: 1294924558-25e302ce0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-px0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 56481260AB8 for ; Thu, 13 Jan 2011 05:15:58 -0800 (PST) Received: from mail-px0-f181.google.com (mail-px0-f181.google.com [209.85.212.181]) by cuda.sgi.com with ESMTP id Htt0QWllcMcDwqPo for ; Thu, 13 Jan 2011 05:15:58 -0800 (PST) Received: by pxi2 with SMTP id 2so375818pxi.26 for ; Thu, 13 Jan 2011 05:15:58 -0800 (PST) Received: by 10.142.212.20 with SMTP id k20mr835912wfg.30.1294924558060; Thu, 13 Jan 2011 05:15:58 -0800 (PST) Received: from maggie.ka9q.net (maggie.ka9q.net [75.60.237.92]) by mx.google.com with ESMTPS id v19sm80007wfh.12.2011.01.13.05.15.54 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 13 Jan 2011 05:15:55 -0800 (PST) Sender: Phil Karn Message-ID: <4D2EFB08.90502@philkarn.net> Date: Thu, 13 Jan 2011 05:15:52 -0800 From: Phil Karn Reply-To: karn@ka9q.net, karn@ka9q.net 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: xfs@oss.sgi.com X-ASG-Orig-Subj: Extreme fragmentation when backing up via NFS Subject: Extreme fragmentation when backing up via NFS References: <4D0C9A4F.4040108@pzystorm.de> <20101220001024.GH5193@dastard> <4D0EC5C5.2070407@pzystorm.de> <20101220045126.GK5193@dastard> <20101220105547.4f9e7218@galadriel.home> <4D2E3B38.6010506@pzystorm.de> In-Reply-To: <4D2E3B38.6010506@pzystorm.de> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-px0-f181.google.com[209.85.212.181] X-Barracuda-Start-Time: 1294924559 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0558 1.0000 -1.6634 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.66 X-Barracuda-Spam-Status: No, SCORE=-1.66 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.52259 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 I have been backing up my main Linux server onto a secondary machine via NFS. I use xfsdump like this: xfsdump -l 9 -f /machine/backups/fs.9.xfsdump / Over on the server machine, xfs_bmap shows an *extreme* amount of fragmentation in the backup file. 20,000+ extents are not uncommon, with many extents consisting of a single allocation block (8x 512B sectors or 4KB). I do notice while the backup file is being written that holes often appear in the extent map towards the end of the file. I theorize that somehow the individual writes are going to the file system out of order, and this causes both the temporary holes and the extreme fragmentation. I'm able to work around the fragmentation manually by looking at the estimate from xfsdump of the size of the backup and then using the fallocate command locally on the file server to allocate more than that amount of space to the backup file. When the backup is done, I look at xfsdump's report of the actual size of the backup file and use the truncate command locally on the server to trim off the excess. Is fragmentation on XFS via NFS a known problem? From Alan.Turner@Yateson.com Thu Jan 13 09:27:48 2011 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_50 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 p0DFRkNe158168 for ; Thu, 13 Jan 2011 09:27:48 -0600 X-ASG-Debug-ID: 1294932594-68d102330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from 50.87sq.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 489E61D2D693 for ; Thu, 13 Jan 2011 07:29:55 -0800 (PST) Received: from 50.87sq.com ([61.147.75.54]) by cuda.sgi.com with ESMTP id s8Edg4PCWI9XhUGk for ; Thu, 13 Jan 2011 07:29:55 -0800 (PST) Received: from yzdx-1fe5cf4296 ([61.147.75.54]) by 50.87sq.com with MailEnable ESMTP; Thu, 13 Jan 2011 07:29:49 -0800 Message-ID: <4154-220111413152949187@yzdx-1fe5cf4296> Organization: Yateson Technology From: "Alan Turner" To: xfs@oss.sgi.com X-ASG-Orig-Subj: CatalanVillas.co.uk Subject: CatalanVillas.co.uk Date: Thu, 13 Jan 2011 07:29:49 -0800 MIME-Version: 1.0 Content-type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: UNKNOWN[61.147.75.54] X-Barracuda-Start-Time: 1294932600 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1765 1.0000 -0.9538 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.35 X-Barracuda-Spam-Status: No, SCORE=-0.35 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.52268 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean A very good afternoon to you, I hope that you're well=2E Would you be interested in benefiting from the substantial extra business = that you'd gain by acquiring our domain name CatalanVillas=2Eco=2Euk=3F Best regards, Alan Turner Yateson Technology From bpm@sgi.com Thu Jan 13 13:38:00 2011 X-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 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 p0DJbxZP183288 for ; Thu, 13 Jan 2011 13:37:59 -0600 Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id A12628F80B5; Thu, 13 Jan 2011 11:40:11 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 47A5C431F74; Thu, 13 Jan 2011 13:39:28 -0600 (CST) Date: Thu, 13 Jan 2011 13:39:28 -0600 From: bpm@sgi.com To: Dave Chinner Cc: aelder@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH] xfs_bmap_add_extent_delay_real should set br_startoff Message-ID: <20110113193928.GC28274@sgi.com> References: <20110112194228.8449.41844.stgit@lady3jane.americas.sgi.com> <20110113005207.GR28803@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110113005207.GR28803@dastard> User-Agent: Mutt/1.5.18 (2008-05-17) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Dave, On Thu, Jan 13, 2011 at 11:52:07AM +1100, Dave Chinner wrote: > On Wed, Jan 12, 2011 at 01:42:28PM -0600, Ben Myers wrote: > > When filling in the middle of a previous delayed allocation, set > > br_startoff of the new delay extent to the right to NULLSTARTBLOCK > > so that it is ignored by xfs_bmap_extent_to_btree. This prevents > > a forced shutdown when that in-core extent is converted from delay > > to real and is found to be already in the btree. The value is > > overwritten below. You're right. That's not a very good description. I'll see about describing it here and then see about boiling it down for repost. > I'm not sure I understand what the problem is from your description. > What actually goes wrong in xfs_bmap_extent_to_btree()? While testing a related patch whose side effect is to exercise this code more often... I was hitting XFS_WANT_CORRUPTED_GOTOs in xfs_bmap_extent_delay_real in the LEFT_FILLING, RIGHT_FILLING cases where we are going to insert an extent into the btree and we look it up to make sure it isn't already there: >From xfs_bmap_extent_delay_real: 911 case BMAP_LEFT_FILLING: 912 /* 913 * Filling in the first part of a previous delayed allocation. 914 * The left neighbor is not contiguous. 915 */ 916 trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); 917 xfs_bmbt_set_startoff(ep, new_endoff); 918 temp = PREV.br_blockcount - new->br_blockcount; 919 xfs_bmbt_set_blockcount(ep, temp); 920 xfs_iext_insert(ip, idx, 1, new, state); 921 ip->i_df.if_lastex = idx; 922 ip->i_d.di_nextents++; 923 if (cur == NULL) 924 rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; 925 else { 926 rval = XFS_ILOG_CORE; 927 if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, 928 new->br_startblock, new->br_blockcount, 929 &i))) 930 goto done; 931 XFS_WANT_CORRUPTED_GOTO(i == 0, done); Forced shutdown at 931. Alex was kind enough to review the code with me and suggest that I print out the offending extent. I found that the extent in question was unusual... with a br_startblock == 0. I set about instrumenting xfs for assignments to br_startblock == 0 and mentioned this to Alex. He happened to remember this assignment at 1047 and his instincts turned out to be right. Assume ip->i_d.di_nextents == ip->i_df.if_ext_max, so you aren't btree format yet and don't have a cursor. 1036 case 0: 1037 /* 1038 * Filling in the middle part of a previous delayed allocation. 1039 * Contiguity is impossible here. 1040 * This case is avoided almost all the time. 1041 */ 1042 temp = new->br_startoff - PREV.br_startoff; ^ temp is the length of the extent to the left, which is delay 1043 trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); 1044 xfs_bmbt_set_blockcount(ep, temp); ^ truncate the PREV extent so that it becomes the extent to the left. We don't need to set br_state because it should have already been delay. 1045 r[0] = *new; ^ r[0] becomes the middle extent, a real allocation 1046 r[1].br_state = PREV.br_state; 1047 r[1].br_startblock = 0; 1048 r[1].br_startoff = new_endoff; 1049 temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; 1050 r[1].br_blockcount = temp2; ^ r[1] becomes the extent to the right, and is supposed to be delay, but we set his br_startblock to 0 instead. 1051 xfs_iext_insert(ip, idx + 1, 2, &r[0], state); ^ here we insert the middle r[0] and right r[1] extents into the ifork with r[1].br_startblock = 0 1052 ip->i_df.if_lastex = idx + 1; 1053 ip->i_d.di_nextents++; 1054 if (cur == NULL) 1055 rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; ^ took this branch 1056 else { 1057 rval = XFS_ILOG_CORE; 1058 if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, 1059 new->br_startblock, new->br_blockcount, 1060 &i))) 1061 goto done; 1062 XFS_WANT_CORRUPTED_GOTO(i == 0, done); 1063 cur->bc_rec.b.br_state = XFS_EXT_NORM; 1064 if ((error = xfs_btree_insert(cur, &i))) 1065 goto done; 1066 XFS_WANT_CORRUPTED_GOTO(i == 1, done); 1067 } ^ skipped this one 1068 if (ip->i_d.di_format == XFS_DINODE_FMT_EXTENTS && 1069 ip->i_d.di_nextents > ip->i_df.if_ext_max) { 1070 error = xfs_bmap_extents_to_btree(ip->i_transp, ip, 1071 first, flist, &cur, 1, &tmp_rval, 1072 XFS_DATA_FORK); ^ here we convert to btree format... This loop in xfs_bmap_extents_to_btree copies extents from the ifork into the btree: 3242 /* 3243 * Fill in the child block. 3244 */ 3245 ablock = XFS_BUF_TO_BLOCK(abp); 3246 ablock->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); 3247 ablock->bb_level = 0; 3248 ablock->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); 3249 ablock->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); 3250 arp = XFS_BMBT_REC_ADDR(mp, ablock, 1); 3251 nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); 3252 for (cnt = i = 0; i < nextents; i++) { 3253 ep = xfs_iext_get_ext(ifp, i); 3254 if (!isnullstartblock(xfs_bmbt_get_startblock(ep))) { ^ note that it explicitly ignores delay allocation extents by testing for STARTBLOCKMASK in br_startblock. 3255 arp->l0 = cpu_to_be64(ep->l0); 3256 arp->l1 = cpu_to_be64(ep->l1); 3257 arp++; cnt++; 3258 } 3259 } So... when we converted from extents format to btree format we copied extent to the right into the tree because right.br_startblock = 0 which is not a nullstartblock. The right extent was actually destined to become delalloc in the ifork but that assignment happens only after we've converted to btree format. The fix works because we set br_startblock to something that includes STARTBLOCKMASK before inserting it into the ifork. This way the test at 3254 will fail for that extent and it won't be inserted into the btree. > I'm assuming > that it counts one too many real extents, and if so, shouldn't it > fire this assert long before you get to a shutdown situation? > > ASSERT(cnt == XFS_IFORK_NEXTENTS(ip, whichfork)); It should. > Also, do you have a test case that triggers this? If so, can it be > turned into a xfstests case? I like to have some idea of how the > problem was encountered and verified, because this code is complex > and easy to misunderstand... I don't have a test case. Building one might be possible by using extsize to get large delalloc allocations and modifying xfs_iomap_write_allocate to only allocate for the passed in offset and count instead of from passed in iomap... > > SGI-PV: 1013221 > > The following is mostly the notes I wrote to understand what your > patch does. I'm posting them so others don't need to go through the > same analysis to understand the patch. While you might have the > analysis in the above PV we can't see it at all, so it would be > appreciated if you could put a summary of the bug analysis and > test case in the commit message so we don't have to spend a couple of > hours just to work out what the patch does... Here are some traces from the PV: Dec 21 13:08:22 gtomds1 kernel: [ 2008.237772] xfs_iext_insert (ffff88018de2c3c0) br_startoff 9240 br_startblock 304078611 br_blockcount 512 br_state 0 Dec 21 13:08:22 gtomds1 kernel: [ 2008.237775] xfs_bmbt_set_all set w/ startblock == 0. br_startoff 9752, br_startblock 0 br_blockcount 18408, br_state 0 .... Dec 21 13:08:22 gtomds1 kernel: [ 2008.238578] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 0: startoff 0 startblock NULLSTARTBLOCK(5) blockcount 5 flag 0 Dec 21 13:08:22 gtomds1 kernel: [ 2008.238583] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 1: startoff 5 startblock 304069376[4:21fbb00] blockcount 512 flag 0 Dec 21 13:08:22 gtomds1 kernel: [ 2008.238590] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 2: startoff 517 startblock NULLSTARTBLOCK(5) blockcount 2 flag 0 Dec 21 13:08:22 gtomds1 kernel: [ 2008.238594] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 3: startoff 519 startblock 304069890[4:21fbd02] blockcount 512 flag 0 Dec 21 13:08:22 gtomds1 kernel: [ 2008.238598] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 4: startoff 1031 startblock NULLSTARTBLOCK(5) blockcount 1 flag 0 Dec 21 13:08:22 gtomds1 kernel: [ 2008.238602] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 5: startoff 1032 startblock 304070403[4:21fbf03] blockcount 1024 flag 0 Dec 21 13:08:22 gtomds1 kernel: [ 2008.238606] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 6: startoff 2056 startblock NULLSTARTBLOCK(5) blockcount 3 flag 0 Dec 21 13:08:22 gtomds1 kernel: [ 2008.238610] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 7: startoff 2059 startblock 304071430[4:21fc306] blockcount 1024 flag 0 Dec 21 13:08:22 gtomds1 kernel: [ 2008.238614] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 8: startoff 3083 startblock NULLSTARTBLOCK(5) blockcount 3 flag 0 Dec 21 13:08:22 gtomds1 kernel: [ 2008.238618] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 9: startoff 3086 startblock 304072457[4:21fc709] blockcount 2560 flag 0 Dec 21 13:08:22 gtomds1 kernel: [ 2008.238623] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 10: startoff 5646 startblock NULLSTARTBLOCK(5) blockcount 1 flag 0 Dec 21 13:08:22 gtomds1 kernel: [ 2008.238627] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 11: startoff 5647 startblock 304075018[4:21fd10a] blockcount 512 flag 0 Dec 21 13:08:22 gtomds1 kernel: [ 2008.238631] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 12: startoff 6159 startblock NULLSTARTBLOCK(5) blockcount 4 flag 0 Dec 21 13:08:22 gtomds1 kernel: [ 2008.238635] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 13: startoff 6163 startblock 304075534[4:21fd30e] blockcount 1024 flag 0 Dec 21 13:08:23 gtomds1 kernel: [ 2008.238639] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 14: startoff 7187 startblock NULLSTARTBLOCK(5) blockcount 2 flag 0 Dec 21 13:08:23 gtomds1 kernel: [ 2008.238643] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 15: startoff 7189 startblock 304076560[4:21fd710] blockcount 1024 flag 0 Dec 21 13:08:23 gtomds1 kernel: [ 2008.238647] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 16: startoff 8213 startblock NULLSTARTBLOCK(5) blockcount 2 flag 0 Dec 21 13:08:23 gtomds1 kernel: [ 2008.238651] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 17: startoff 8215 startblock 304077586[4:21fdb12] blockcount 1024 flag 0 Dec 21 13:08:23 gtomds1 kernel: [ 2008.238655] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 18: startoff 9239 startblock NULLSTARTBLOCK(79) blockcount 1 flag 0 Dec 21 13:08:23 gtomds1 kernel: [ 2008.238659] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 19: startoff 9240 startblock 304078611[4:21fdf13] blockcount 512 flag 0 Dec 21 13:08:23 gtomds1 kernel: [ 2008.238663] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 20: startoff 9752 startblock 0[0:0] blockcount 18408 flag 0 <---- we added an extent to the btree with startblock=0 .... Dec 21 13:08:42 gtomds1 kernel: [ 2009.735411] xfs_bmap_add_extent_delay_real new br_startoff 9752 br_startblock 304079636 br_blockcount1 <---- and it turns out to be the same one we crash on later! Dec 21 13:08:42 gtomds1 kernel: [ 2009.735415] cur ffff8802bbf16a80, tp 0xffff88018ce68450 mp 0xffff8802c5542800 Dec 21 13:08:42 gtomds1 kernel: [ 2009.735417] rec.b startoff 9752 startblock 121fe314 blockcount 1 state 0 Dec 21 13:08:42 gtomds1 kernel: [ 2009.735420] bufs level 1 ((null)) 1, 0; Dec 21 13:08:42 gtomds1 kernel: [ 2009.735424] level 0 (ffff8802c78b3340) 1, 0; 2, 5; 3, 2417; 4, 2418; 5, 2618; 6, 2619; 7, 281c; 8, 2a22; 9, 2c24; 10, 3427; 11, 362f; 12, 3833; 1 3, 3c34; 14, 3e36; 15, 4037; 16, 4438; 17, 4639; 18, 4e3a; 19, 563b; 20, 5a3d; 21, 5c41; 22, 5e45; 23, 6048; 24, 624a; 25, 684b; 26, 6c4c; 27, 6e4d; 28, 7251; 29, 7452; 30, 7653; 31, 785 5; 32, 7a56; 33, 7c58; 34, 8059; 35, 825b; 36, 845c; 37, 8a5f; 38, 8c60; 39, 8e62; 40, 9065; 41, 9467; 42, 9c6e; 43, 9e6f; 44, a070; 45, a471; 46, a675; 47, a879; 48, aa7a; 49, ac7b; 50, b07c; 51, b27d; 52, ba7f; 53, bc81; 54, c284; 55, c688; 56, c88a; 57, ca8e; 58, ce8f; 59, d094; 60, d295; 61, d496; 62, d697; 63, da9a; 64, dc9c; 65, dea2; 66, e0a5; 67, e2a8; 68, eaa9; 69, ecaa; 70, eead; 71, f4b1; 72, f6b7; 73, f8b8; 74, fabd; 75, 100bf; 76, 102c7; 77, 104c8; 78, 106ca; 79, 108cd; 80, 10acf; 81, 10cd2; 82, 10ed8; 83, 114da; 84, 11adc; 85, 11ce4; 86, 11ee5; 87, 124e8; 88, 126e9; 89, 128ef; 90, 12af3; 91, 12cf4; 92, 130f5; 93, 134fb; 94, 13efd; 95, 148f <----------- we find that extent at key 5, startoff 0x2418 Dec 21 13:08:42 gtomds1 kernel: e; 96, 14b08; 97, 14d0b; 98, 14f11; 99, 15112; 100, 15519; 101, 1591c; 102, 15b1f; 103, 15d22; 104, 15f24; 105, 16126; 106, 16527; 107, 16728; 108, 16d31; 109, 16f32; 110, 17133; 111, 17335; 112, 17538; 113, 1773a; 114, 1793b; 115, 17b3c; 116, 17d3e; 117, 17f3f; 118, 18142; 119, 1854d; Dec 21 13:08:42 gtomds1 kernel: [ 2009.735492] ptrs level 1: 0x1 Dec 21 13:08:42 gtomds1 kernel: [ 2009.735494] Dec 21 13:08:42 gtomds1 kernel: [ 2009.735495] ra 3 0 Dec 21 13:08:42 gtomds1 kernel: [ 2009.735498] nlevels 2 btnum bmap blocklog 12 Dec 21 13:08:42 gtomds1 kernel: [ 2009.735500] private forksize 0x9c whichfork 0 ip 0xffff8800bf3c0900 flags 1 Dec 21 13:08:42 gtomds1 kernel: [ 2009.735504] private firstblock 304079636[4:21fe314] flist 0xffff88018ce85a10 allocated 0x0 .... Dec 21 13:13:34 gtomds1 kernel: [ 2273.368378] xfs_bmbt_lookup[exit@1180] ip 0xffff8800bf3c0900 df cur 0xffff8802bbf16a80 Let me know if you want more information. Thanks, Ben > > > > Signed-off-by: Ben Myers > > --- > > fs/xfs/xfs_bmap.c | 5 +++-- > > 1 files changed, 3 insertions(+), 2 deletions(-) > > > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > > index 4111cd3..cd75c77 100644 > > --- a/fs/xfs/xfs_bmap.c > > +++ b/fs/xfs/xfs_bmap.c > > @@ -1040,13 +1040,14 @@ xfs_bmap_add_extent_delay_real( > > * This case is avoided almost all the time. > > */ > > temp = new->br_startoff - PREV.br_startoff; > > + temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; > > trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); > > xfs_bmbt_set_blockcount(ep, temp); > > r[0] = *new; > > r[1].br_state = PREV.br_state; > > - r[1].br_startblock = 0; > > + r[1].br_startblock = nullstartblock( > > + (int)xfs_bmap_worst_indlen(ip, temp2)); > > As a side note, this would be easier to understand if you converted > all the r[x] notations to LEFT, RIGHT and PREV to match the rest of > the code (i.e. LEFT == r[0], RIGHT = r[1] and PREV = r[2]). if you > are touching this code, then this should probably be done now. > > The code starts with: > > +ddddddddddddddddddddddddddddddddddddddddddddddddd+ > r[2] @ idx > PREV @ idx > > and we are allocating: > +rrrrrrrrrrrrrrr+ > new > and does: > > 1042 temp = new->br_startoff - PREV.br_startoff; > 1043 trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); > 1044 xfs_bmbt_set_blockcount(ep, temp); > 1045 r[0] = *new; > 1046 r[1].br_state = PREV.br_state; > 1047 r[1].br_startblock = 0; > 1048 r[1].br_startoff = new_endoff; > 1049 temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; > 1050 r[1].br_blockcount = temp2; > 1051 xfs_iext_insert(ip, idx + 1, 2, &r[0], state); > > Which translates as: > > LEFT = *new; > PREV.br_blockcount = LEFT.br_startoff = PREV.br_startoff > RIGHT.br_state = PREV.br_state; > RIGHT.br_startblock = 0; > RIGHT.br_startoff = LEFT.br_startblock + LEFT.br_blockcount; > RIGHT.br_blockcount = PREV.br_startoff + PREV.br_blockcount > - RIGHT.br_startoff; > > Which means it has been set up as: > > +ddddddddddddddddddd+rrrrrrrrrrrrrrr+ddddddddddddd+ > new > r[2] @ idx r[0] r[1] > PREV @ idx LEFT RIGHT > inserted @ idx + 1 > > Ok, that all looks good so far except RIGHT is not yet set up as a > delalloc extent. If the inode is in btree format (i.e. a cursor > exists), it inserts the new extent into the btree, otherwise we > trigger: > > 1068 if (ip->i_d.di_format == XFS_DINODE_FMT_EXTENTS && > 1069 ip->i_d.di_nextents > ip->i_df.if_ext_max) { > 1070 error = xfs_bmap_extents_to_btree(ip->i_transp, ip, > 1071 first, flist, &cur, 1, &tmp_rval, > 1072 XFS_DATA_FORK); > 1073 rval |= tmp_rval; > 1074 if (error) > 1075 goto done; > 1076 } > > OK, so this is done while the incore extent tree is in inconsistent > state. Then we do some delalloc reservation futzing but does not > modify the reservations in the extents based on the numbe of blocks > allocated. > > Oh, if the extent->btree conversion allocates more blocks than the > extent allocated reserrved, then it tries to do a new reservation > for the difference (some comments in this code would be nice) and > has some nasty failure code. > > But, that doesn't stop us from updating the delalloc block > reservation counts in the extents before we convert the tree format > so long ias we calculate diff (excluding allocated btree blocks) before > we update PREV.br_startblock. > > So that means if we move this hunk and the diff calculation up above > the extent->btree conversion check: > > 1109 ep = xfs_iext_get_ext(ifp, idx); > 1110 xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); > 1111 trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); > 1112 trace_xfs_bmap_pre_update(ip, idx + 2, state, _THIS_IP_); > 1113 xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx + 2), > 1114 nullstartblock((int)temp2)); > 1115 trace_xfs_bmap_post_update(ip, idx + 2, state, _THIS_IP_); > > And add: > > diff -= cur ? cur->bc_private.b.allocated : 0; > > after the conversion, everything should work just fine and the > tracing will continue to give the same output. > > -- > > Ok, so the bug looks real, but I'm not sure that the fix really > improves anything. The code needs to use LEFT, RIGHT and PREV, coul > ddo with better variable names than temp and temp2, and probably > should reorder the operations and the associated tracing as well as > comment what the hell the code is actually doing. Typically with a > fix like this I'll end up adding 5-10x as many lines in comments as > code changes that fix the bug, just so I don't have to go through > this process next time I have to look at this code.... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From ccoager@davisvision.com Thu Jan 13 15:20:26 2011 X-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_24 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 p0DLKPG1187337 for ; Thu, 13 Jan 2011 15:20:26 -0600 X-ASG-Debug-ID: 1294953758-350800ee0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from zixvpm02.zixvpm.davisvision.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CC0A71D2F21E for ; Thu, 13 Jan 2011 13:22:38 -0800 (PST) Received: from zixvpm02.zixvpm.davisvision.com (zixvpm02.zixvpm.davisvision.com [65.213.99.45]) by cuda.sgi.com with ESMTP id JxLEtq4VqiQf7H72 for ; Thu, 13 Jan 2011 13:22:38 -0800 (PST) Received: from zixvpm02.zixvpm.davisvision.com (ZixVPM [127.0.0.1]) by Outbound.davisvision.com (Proprietary) with ESMTP id 6B7A05DC014 for ; Thu, 13 Jan 2011 16:22:37 -0500 (EST) Received: from riley.davisvision.com (unknown [10.51.11.112]) by zixvpm02.zixvpm.davisvision.com (Proprietary) with ESMTP id 0184B1F4020 for ; Thu, 13 Jan 2011 16:22:37 -0500 (EST) Received: from riley.davisvision.com (localhost [127.0.0.1]) by localhost (Postfix) with SMTP id E63D42463A for ; Thu, 13 Jan 2011 16:22:36 -0500 (EST) Received: from [192.168.148.68] (ccoager-linux.davisvision.com [192.168.148.68]) by riley.davisvision.com (Postfix) with ESMTP id C9E4D24637 for ; Thu, 13 Jan 2011 16:22:36 -0500 (EST) Message-ID: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> Date: Thu, 13 Jan 2011 16:22:36 -0500 From: Cory Coager Organization: Davis Vision User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101208 Lightning/1.0b2 Thunderbird/3.1.7 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: extremely slow write performance plaintext Subject: extremely slow write performance plaintext Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Banner: Set X-Barracuda-Connect: zixvpm02.zixvpm.davisvision.com[65.213.99.45] X-Barracuda-Start-Time: 1294953759 X-Barracuda-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.52291 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 Hardware is 2x 2.6ghz cpu, 6gb RAM, 2 SAS arrays consisting of 24 drives in hardware RAID 6, 5.87tb total. The two arrays were added to a volume group and multiple logical volumes were created. I am getting over 180MB/s read speeds and 40MB/s write speeds on all the LV's except one. One of the LV's is getting ~1MB/s write speeds, however read speeds are fine. There are NO snapshots. meta-data=/dev/mapper/vg0-shared isize=1024 agcount=32, agsize=17616096 blks = sectsz=512 attr=2 data = bsize=4096 blocks=563715072, imaxpct=25 = sunit=0 swidth=0 blks, unwritten=1 naming =version 2 bsize=4096 log =internal bsize=4096 blocks=32768, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # dd if=/dev/zero of=zero bs=1k count=1048576 1048576+0 records in 1048576+0 records out 1073741824 bytes (1.1 GB) copied, 2089.95 seconds, 514 kB/s # dd if=zero of=/dev/null bs=1k 1048576+0 records in 1048576+0 records out 1073741824 bytes (1.1 GB) copied, 4.70878 seconds, 228 MB/s Any idea what is wrong with this and how to fix it? ------------------------------------------------------------------------ The information contained in this communication is intended only for the use of the recipient(s) named above. It may contain information that is privileged or confidential, and may be protected by State and/or Federal Regulations. If the reader of this message is not the intended recipient, you are hereby notified that any dissemination, distribution, or copying of this communication, or any of its contents, is strictly prohibited. If you have received this communication in error, please return it to the sender immediately and delete the original message and any copy of it from your computer system. If you have any questions concerning this message, please contact the sender. ------------------------------------------------------------------------ From gwehrman@sgi.com Thu Jan 13 15:50:17 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0DLoHAu188728 for ; Thu, 13 Jan 2011 15:50:17 -0600 Received: from goalpost.americas.sgi.com (goalpost.americas.sgi.com [128.162.232.54]) by relay1.corp.sgi.com (Postfix) with ESMTP id BA1BB8F80C2; Thu, 13 Jan 2011 13:52:28 -0800 (PST) Received: by goalpost.americas.sgi.com (Postfix, from userid 14442) id 482FF26FD1; Thu, 13 Jan 2011 15:52:28 -0600 (CST) Date: Thu, 13 Jan 2011 15:52:28 -0600 From: Geoffrey Wehrman To: Kevin Richter Cc: xfs@oss.sgi.com Subject: Re: Problem with XFS on USB 2TB HD Message-ID: <20110113215228.GB15881@sgi.com> References: <4D0C9A4F.4040108@pzystorm.de> <20101220001024.GH5193@dastard> <4D0EC5C5.2070407@pzystorm.de> <20101220045126.GK5193@dastard> <20101220105547.4f9e7218@galadriel.home> <4D2E3B38.6010506@pzystorm.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D2E3B38.6010506@pzystorm.de> User-Agent: Mutt/1.5.14 (2007-02-12) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Jan 13, 2011 at 12:37:28AM +0100, Kevin Richter wrote: | > 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. | | I am wondering if there is a simple solution to backup/restore the inode | table (the relation "inode <-> filename"). | | With "ls -aliR" I get a list which I am now saving every few days. | The parameter "-i" displays the inode, that I can reconstruct the | filename from the inode, if this garbling error occurs a second time. | | The reconstruction process probably would be a simple "grep | cut" thing. | | Is there perhaps a finished script doing exactly this? Or any other ideas? xfs_ncheck(8) will generate the patname/inode mapping, but does not provide a restore service. -- Geoffrey Wehrman From eflorac@intellique.com Thu Jan 13 16:33:25 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0DMXP4K190634 for ; Thu, 13 Jan 2011 16:33:25 -0600 X-ASG-Debug-ID: 1294958133-6b6a02090000-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 D2F2626344E for ; Thu, 13 Jan 2011 14:35:37 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id BZDOeeLqXwt5Sdfr for ; Thu, 13 Jan 2011 14:35:37 -0800 (PST) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id E3604A6201; Thu, 13 Jan 2011 23:35:29 +0100 (CET) Date: Thu, 13 Jan 2011 23:35:27 +0100 From: Emmanuel Florac To: Cory Coager Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: extremely slow write performance plaintext Subject: Re: extremely slow write performance plaintext Message-ID: <20110113233527.6dca104d@galadriel.home> In-Reply-To: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> References: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.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: 1294958139 X-Barracuda-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.52295 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, 13 Jan 2011 16:22:36 -0500 vous =E9criviez: > I am getting over=20 > 180MB/s read speeds and 40MB/s write speeds on all the LV's except > one.=20 This is pretty bad. My last 14 SAS drives RAID-6 array achieved 500 MB/s write, 1GB/s read sustained. What is the SAS controller? the RAID controller? Please provide more details about the=20 enclosure/drives/cabling too. What is the kernel/distro? Did you striped your LVs across multiple physical volumes except the last one? What's the output for pvdisplay, vgdisplay, lvdisplay? --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From SRS0+555T+47+fromorbit.com=david@internode.on.net Thu Jan 13 17:13:36 2011 X-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 (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p0DNDZVa192342 for ; Thu, 13 Jan 2011 17:13:36 -0600 X-ASG-Debug-ID: 1294960547-6b7302ed0000-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 6059925FEB2 for ; Thu, 13 Jan 2011 15:15:48 -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 pCKBPyxW3Z1G16lO for ; Thu, 13 Jan 2011 15:15:48 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52471671-1927428 for multiple; Fri, 14 Jan 2011 09:45:46 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PdWOO-0004o2-Qa; Fri, 14 Jan 2011 10:15:44 +1100 Date: Fri, 14 Jan 2011 10:15:44 +1100 From: Dave Chinner To: bpm@sgi.com Cc: aelder@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_bmap_add_extent_delay_real should set br_startoff Subject: Re: [PATCH] xfs_bmap_add_extent_delay_real should set br_startoff Message-ID: <20110113231544.GE16267@dastard> References: <20110112194228.8449.41844.stgit@lady3jane.americas.sgi.com> <20110113005207.GR28803@dastard> <20110113193928.GC28274@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110113193928.GC28274@sgi.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: 1294960549 X-Barracuda-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.52297 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, Jan 13, 2011 at 01:39:28PM -0600, bpm@sgi.com wrote: > Hi Dave, > > On Thu, Jan 13, 2011 at 11:52:07AM +1100, Dave Chinner wrote: > > On Wed, Jan 12, 2011 at 01:42:28PM -0600, Ben Myers wrote: > > > When filling in the middle of a previous delayed allocation, set > > > br_startoff of the new delay extent to the right to NULLSTARTBLOCK > > > so that it is ignored by xfs_bmap_extent_to_btree. This prevents > > > a forced shutdown when that in-core extent is converted from delay > > > to real and is found to be already in the btree. The value is > > > overwritten below. > > You're right. That's not a very good description. I'll see about > describing it here and then see about boiling it down for repost. > > > I'm not sure I understand what the problem is from your description. > > What actually goes wrong in xfs_bmap_extent_to_btree()? > > While testing a related patch whose side effect is to exercise this code > more often... > > I was hitting XFS_WANT_CORRUPTED_GOTOs in xfs_bmap_extent_delay_real in the > LEFT_FILLING, RIGHT_FILLING cases where we are going to insert an extent > into the btree and we look it up to make sure it isn't already there: > > From xfs_bmap_extent_delay_real: > 911 case BMAP_LEFT_FILLING: > 912 /* > 913 * Filling in the first part of a previous delayed allocation. > 914 * The left neighbor is not contiguous. > 915 */ > 916 trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); > 917 xfs_bmbt_set_startoff(ep, new_endoff); > 918 temp = PREV.br_blockcount - new->br_blockcount; > 919 xfs_bmbt_set_blockcount(ep, temp); > 920 xfs_iext_insert(ip, idx, 1, new, state); > 921 ip->i_df.if_lastex = idx; > 922 ip->i_d.di_nextents++; > 923 if (cur == NULL) > 924 rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; > 925 else { > 926 rval = XFS_ILOG_CORE; > 927 if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, > 928 new->br_startblock, new->br_blockcount, > 929 &i))) > 930 goto done; > 931 XFS_WANT_CORRUPTED_GOTO(i == 0, done); > > Forced shutdown at 931. So it was allocating a different part of the delalloc extent that triggered it. OK. > This loop in xfs_bmap_extents_to_btree copies extents from the ifork into > the btree: > > 3242 /* > 3243 * Fill in the child block. > 3244 */ > 3245 ablock = XFS_BUF_TO_BLOCK(abp); > 3246 ablock->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); > 3247 ablock->bb_level = 0; > 3248 ablock->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); > 3249 ablock->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); > 3250 arp = XFS_BMBT_REC_ADDR(mp, ablock, 1); > 3251 nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); > 3252 for (cnt = i = 0; i < nextents; i++) { > 3253 ep = xfs_iext_get_ext(ifp, i); > 3254 if (!isnullstartblock(xfs_bmbt_get_startblock(ep))) { > > ^ note that it explicitly ignores delay allocation extents by testing for > STARTBLOCKMASK in br_startblock. > > 3255 arp->l0 = cpu_to_be64(ep->l0); > 3256 arp->l1 = cpu_to_be64(ep->l1); > 3257 arp++; cnt++; > 3258 } > 3259 } > > So... when we converted from extents format to btree format we copied > extent to the right into the tree because right.br_startblock = 0 > which is not a nullstartblock. The right extent was actually > destined to become delalloc in the ifork but that assignment > happens only after we've converted to btree format. > > The fix works because we set br_startblock to something that includes > STARTBLOCKMASK before inserting it into the ifork. This way the test at > 3254 will fail for that extent and it won't be inserted into the btree. > > > I'm assuming > > that it counts one too many real extents, and if so, shouldn't it > > fire this assert long before you get to a shutdown situation? > > > > ASSERT(cnt == XFS_IFORK_NEXTENTS(ip, whichfork)); > > It should. Thanks for confirming that. Might I suggest that running a debug XFS build is a good idea purely because it will catch problems like this when they happen, rather than when you trip over the result later on? > > Also, do you have a test case that triggers this? If so, can it be > > turned into a xfstests case? I like to have some idea of how the > > problem was encountered and verified, because this code is complex > > and easy to misunderstand... > > I don't have a test case. Building one might be possible by using extsize > to get large delalloc allocations and modifying xfs_iomap_write_allocate to > only allocate for the passed in offset and count instead of from passed in > iomap... Hmmm, not really a generic test case :/ I was thinking that we might be able to use sync_file_range() to write small ranges of pages inside a delalloc extent. However, it does not limit wbc->nr_to_write() so I suspect it will write entire delalloc extents at a time rather than small chunks. > > > SGI-PV: 1013221 > > > > The following is mostly the notes I wrote to understand what your > > patch does. I'm posting them so others don't need to go through the > > same analysis to understand the patch. While you might have the > > analysis in the above PV we can't see it at all, so it would be > > appreciated if you could put a summary of the bug analysis and > > test case in the commit message so we don't have to spend a couple of > > hours just to work out what the patch does... > > Here are some traces from the PV: > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.237772] xfs_iext_insert (ffff88018de2c3c0) br_startoff 9240 br_startblock 304078611 br_blockcount 512 br_state 0 > Dec 21 13:08:22 gtomds1 kernel: [ 2008.237775] xfs_bmbt_set_all set w/ startblock == 0. br_startoff 9752, br_startblock 0 br_blockcount 18408, br_state 0 > .... > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238578] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 0: startoff 0 startblock NULLSTARTBLOCK(5) blockcount 5 flag 0 > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238583] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 1: startoff 5 startblock 304069376[4:21fbb00] blockcount 512 flag 0 > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238590] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 2: startoff 517 startblock NULLSTARTBLOCK(5) blockcount 2 flag 0 > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238594] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 3: startoff 519 startblock 304069890[4:21fbd02] blockcount 512 flag 0 > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238598] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 4: startoff 1031 startblock NULLSTARTBLOCK(5) blockcount 1 flag 0 > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238602] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 5: startoff 1032 startblock 304070403[4:21fbf03] blockcount 1024 flag 0 > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238606] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 6: startoff 2056 startblock NULLSTARTBLOCK(5) blockcount 3 flag 0 > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238610] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 7: startoff 2059 startblock 304071430[4:21fc306] blockcount 1024 flag 0 > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238614] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 8: startoff 3083 startblock NULLSTARTBLOCK(5) blockcount 3 flag 0 > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238618] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 9: startoff 3086 startblock 304072457[4:21fc709] blockcount 2560 flag 0 > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238623] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 10: startoff 5646 startblock NULLSTARTBLOCK(5) blockcount 1 flag 0 > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238627] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 11: startoff 5647 startblock 304075018[4:21fd10a] blockcount 512 flag 0 > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238631] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 12: startoff 6159 startblock NULLSTARTBLOCK(5) blockcount 4 flag 0 > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238635] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 13: startoff 6163 startblock 304075534[4:21fd30e] blockcount 1024 flag 0 > Dec 21 13:08:23 gtomds1 kernel: [ 2008.238639] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 14: startoff 7187 startblock NULLSTARTBLOCK(5) blockcount 2 flag 0 > Dec 21 13:08:23 gtomds1 kernel: [ 2008.238643] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 15: startoff 7189 startblock 304076560[4:21fd710] blockcount 1024 flag 0 > Dec 21 13:08:23 gtomds1 kernel: [ 2008.238647] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 16: startoff 8213 startblock NULLSTARTBLOCK(5) blockcount 2 flag 0 > Dec 21 13:08:23 gtomds1 kernel: [ 2008.238651] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 17: startoff 8215 startblock 304077586[4:21fdb12] blockcount 1024 flag 0 > Dec 21 13:08:23 gtomds1 kernel: [ 2008.238655] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 18: startoff 9239 startblock NULLSTARTBLOCK(79) blockcount 1 flag 0 > Dec 21 13:08:23 gtomds1 kernel: [ 2008.238659] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 19: startoff 9240 startblock 304078611[4:21fdf13] blockcount 512 flag 0 > Dec 21 13:08:23 gtomds1 kernel: [ 2008.238663] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 20: startoff 9752 startblock 0[0:0] blockcount 18408 flag 0 <---- we added an extent to the btree with startblock=0 > .... > Dec 21 13:08:42 gtomds1 kernel: [ 2009.735411] xfs_bmap_add_extent_delay_real new br_startoff 9752 br_startblock 304079636 br_blockcount1 <---- and it turns out to be the same one we crash on later! It's this pattern of alloc/delalloc extents that I'm having trouble reproducing. The current TOT XFS code simply will not allocate the middle part of a delalloc extent like this. What exactly is your test doing to produce this sort of pattern? Also, delalloc behaviour has changed over different versions, so can you tell me what version of XFS you are running to cause this? Cheers, Dave. -- Dave Chinner david@fromorbit.com From ccoager@davisvision.com Thu Jan 13 18:15:42 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0E0Ffc9195026 for ; Thu, 13 Jan 2011 18:15:42 -0600 X-ASG-Debug-ID: 1294964275-04da00d90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from zixvpm01.zixvpm.davisvision.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F196F24CA1B for ; Thu, 13 Jan 2011 16:17:55 -0800 (PST) Received: from zixvpm01.zixvpm.davisvision.com (zixvpm01.zixvpm.davisvision.com [65.213.99.44]) by cuda.sgi.com with ESMTP id pve5dxWpkLtGLSXG for ; Thu, 13 Jan 2011 16:17:55 -0800 (PST) Received: from zixvpm01.zixvpm.davisvision.com (ZixVPM [127.0.0.1]) by Outbound.davisvision.com (Proprietary) with ESMTP id 24F6F8CC023 for ; Thu, 13 Jan 2011 19:17:55 -0500 (EST) Received: from hoiby.davisvision.com (unknown [10.51.11.114]) by zixvpm01.zixvpm.davisvision.com (Proprietary) with ESMTP id A8535358015; Thu, 13 Jan 2011 19:17:54 -0500 (EST) Received: from hoiby.davisvision.com (localhost [127.0.0.1]) by localhost (Postfix) with SMTP id 9923C28012; Thu, 13 Jan 2011 19:17:54 -0500 (EST) Received: from ny-exchange.hvhcvision.com (nyl-exch2.davisvision.com [10.58.2.163]) by hoiby.davisvision.com (Postfix) with ESMTP id 832AD2800E; Thu, 13 Jan 2011 19:17:54 -0500 (EST) Received: from NYL-EXCH1.HVHCVision.com ([fe80::b484:6800:1844:d76b]) by NYL-EXCH2.HVHCVision.com ([fe80::4126:acd0:fb48:3e22%18]) with mapi id 14.01.0255.000; Thu, 13 Jan 2011 19:17:54 -0500 From: Cory Coager To: Emmanuel Florac CC: "xfs@oss.sgi.com" X-ASG-Orig-Subj: RE: extremely slow write performance plaintext Subject: RE: extremely slow write performance plaintext Thread-Topic: extremely slow write performance plaintext Thread-Index: AQHLs3IsEOFR7rEIRO+fnt+mr0TVLZPPmFAw Date: Fri, 14 Jan 2011 00:17:52 +0000 Message-ID: <18993_1294964274_4D2F9632_18993_1387_1_F79CF9ADB27B2646B59221B7355263830CC143B1@NYL-EXCH1.HVHCVision.com> References: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> <20110113233527.6dca104d@galadriel.home> In-Reply-To: <20110113233527.6dca104d@galadriel.home> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [192.168.148.68] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Banner: Set X-Barracuda-Connect: zixvpm01.zixvpm.davisvision.com[65.213.99.44] X-Barracuda-Start-Time: 1294964275 X-Barracuda-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=BSF_RULE7568M, BSF_RULE_7582B X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.52301 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M 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 > What is the SAS controller? the RAID controller? HP Smart Array P600 > Please provide more details about the enclosure/drives/cabling too. Both enclosures are HP MSA70, 25 drives each, SAS 10k rpm drives, not sure = about the cabling (server is at another location) > What is the kernel/distro? SLES 10 SP2, 2.6.16.60-0.21-bigsmp, x86 > Did you striped your LVs across multiple physical volumes except the last= one? None of the LV's are stripped > What's the output for pvdisplay, vgdisplay, lvdisplay? # pvdisplay --- Physical volume --- PV Name /dev/cciss/c1d0p1 VG Name vg0 PV Size 2.94 TB / not usable 1.51 MB Allocatable yes PE Size (KByte) 4096 Total PE 769902 Free PE 150192 Allocated PE 619710 PV UUID k52E36-n3Xw-10rw-hSXo-3col-TEvC-75iHZ2 --- Physical volume --- PV Name /dev/cciss/c1d1p1 VG Name vg0 PV Size 2.94 TB / not usable 1.51 MB Allocatable yes PE Size (KByte) 4096 Total PE 769902 Free PE 562351 Allocated PE 207551 PV UUID IAZAbk-eMNZ-puMJ-DqW1-zsC7-C0ux-66vYTN # vgdisplay --- Volume group --- VG Name vg0 System ID Format lvm2 Metadata Areas 4 Metadata Sequence No 217 VG Access read/write VG Status resizable MAX LV 0 Cur LV 6 Open LV 6 Max PV 0 Cur PV 2 Act PV 2 VG Size 5.87 TB PE Size 4.00 MB Total PE 1539804 Alloc PE / Size 827261 / 3.16 TB Free PE / Size 712543 / 2.72 TB VG UUID p1SANa-30vR-BymQ-cOls-XeVU-92nj-YP4wSU # lvdisplay --- Logical volume --- LV Name /dev/vg0/apps VG Name vg0 LV UUID LLMOor-D0mP-k2kM-qvM3-Vjse-6fE0-7DdRjJ LV Write Access read/write LV Status available # open 2 LV Size 348.00 MB Current LE 87 Segments 2 Allocation inherit Read ahead sectors 0 Block device 253:0 --- Logical volume --- LV Name /dev/vg0/netlogon VG Name vg0 LV UUID FxR324-yAH9-F6y3-Dz30-stqY-bYwc-4t6AZ7 LV Write Access read/write LV Status available # open 2 LV Size 52.00 MB Current LE 13 Segments 1 Allocation inherit Read ahead sectors 0 Block device 253:1 --- Logical volume --- LV Name /dev/vg0/print VG Name vg0 LV UUID EAISuT-a8zd-dJQa-0c6t-Zkus-I3ws-0IU9q3 LV Write Access read/write LV Status available # open 2 LV Size 712.00 MB Current LE 178 Segments 2 Allocation inherit Read ahead sectors 0 Block device 253:2 --- Logical volume --- LV Name /dev/vg0/sqlbackup VG Name vg0 LV UUID 22NfsZ-iqdm-jWUz-9MOW-fAh1-qfB7-nWkSSG LV Write Access read/write LV Status available # open 1 LV Size 270.00 GB Current LE 69120 Segments 2 Allocation inherit Read ahead sectors 0 Block device 253:3 --- Logical volume --- LV Name /dev/vg0/homes VG Name vg0 LV UUID HMGhLH-0iA3-fp7n-A5Za-svJF-Tzxb-D291WR LV Write Access read/write LV Status available # open 2 LV Size 810.00 GB Current LE 207360 Segments 1 Allocation inherit Read ahead sectors 0 Block device 253:5 --- Logical volume --- LV Name /dev/vg0/shared VG Name vg0 LV UUID Czj3gb-Adl9-FqRW-wPqH-JnW2-rDGT-toR8zL LV Write Access read/write LV Status available # open 2 LV Size 2.10 TB Current LE 550503 Segments 1 Allocation inherit Read ahead sectors 0 Block device 253:8 Keep in mind that I only have poor write performance on /dev/vg0/shared, th= e others are fine. ------------------------------------------------------------------------ The information contained in this communication is intended only for the use of the recipient(s) named above. It may contain information that is privileged or confidential, and may be protected by State and/or Federal Regulations. If the reader of this message is not the intended recipient, you are hereby notified that any dissemination, distribution, or copying of this communication, or any of its contents, is strictly prohibited. If you have received this communication in error, please return it to the sender immediately and delete the original message and any copy of it from your computer system. If you have any questions concerning this message, please contact the sender. ------------------------------------------------------------------------ From SRS0+dm0r+48+fromorbit.com=david@internode.on.net Thu Jan 13 18:27:01 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0E0R05t195502 for ; Thu, 13 Jan 2011 18:27:01 -0600 X-ASG-Debug-ID: 1294964953-351503a30000-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 D034A1D3065E for ; Thu, 13 Jan 2011 16:29: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 Wg8UCIlTXmBfV8R5 for ; Thu, 13 Jan 2011 16:29:13 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 7452505-1927428 for ; Fri, 14 Jan 2011 10:59:12 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PdXXI-0004vC-K4 for xfs@oss.sgi.com; Fri, 14 Jan 2011 11:29:00 +1100 Date: Fri, 14 Jan 2011 11:29:00 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: Issues with delalloc->real extent allocation Subject: Issues with delalloc->real extent allocation Message-ID: <20110114002900.GF16267@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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: 1294964954 X-Barracuda-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.52303 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've noticed a few suspicious things trying to reproduce the allocate-in-the-middle-of-a-delalloc-extent, Firstly preallocation into delalloc ranges behaves in a unexpected and dangerous way. Preallocation uses unwritten extents to avoid stale data exposure, but when issued into a range that is covered by a delalloc extent, it does not use unwritten extents. The code that causes this is in xfs_bmapi(): /* * Determine state of extent, and the filesystem. * A wasdelay extent has been initialized, so * shouldn't be flagged as unwritten. */ if (wr && xfs_sb_version_hasextflgbit(&mp->m_sb)) { if (!wasdelay && (flags & XFS_BMAPI_PREALLOC)) got.br_state = XFS_EXT_UNWRITTEN; } This seems to be incorrect to me - a "wasdelay" extent has not yet been initialised - there's data in memory, but there is nothing on disk and we may not write it for some time. If we crash after this transaction is written but before any data is written, we expose stale data. Not only that, it allocates the _entire_ delalloc extent that spans the preallocation range, even when the preallocation range is only 1 block and the delalloc extent covers gigabytes. hence we actually expose a much greater range of the file to stale data exposure during a crash than just eh preallocated range. Not good. Secondly, I think we have the same expose-the-entire-delalloc-extent -to-stale-data-exposure problem in ->writepage. This onnne, however, is due to using BMAPI_ENTIRE to allocate the entire delalloc extent the first time any part of it is written to. Even if we are only writing a single page (i.e. wbc->nr_to_write = 1) and the delalloc extent covers gigabytes. So, same problem when we crash. Finally, I think the extsize based problem exposed by test 229 is a also a result of allocating space we have no pages covering in the page cache (triggered by BMAPI_ENTIRE allocation) so the allocated space is never zeroed and hence exposes stale data. A possible solution to all of these problems is to allocate delalloc space as unwritten extents. It's obvious to see how this solves the first two cases, but the last one is a bit less obvious. That one is solved by the fact that unwritten extent conversion does not get extent size aligned, so any block we don't write data for will remain in the unwritten state and therefore correctly return zeros for any read... The issues with this approach are really about the cost of unwritten extent conversion and the impact on low memory operation. The cost is mainly a CPU cost due to delayed logging, but that will be significant if we have to do an unwritten conversion on every IO completion. Batching is definitely possible and would mostly alleviate the overhead, but does add complexity and especially w.r.t. unwritten extent conversion sometimes requiring allocation to complete. The impact on low memory behaviour is less easy to define and handle. Extent conversion can block needing memory, so if we need to complete the extent conversion to free memory we deadlock. For delalloc writes, we can probably mark IO complete and pages clean before we do the conversion in a batched, async manner. That would leaves us with the same structure as we currently have, but adds more complexity because we now need to track extent ranges in "conversion pending" state for subsequent reads and sync operations. i.e. an extent in a pending state is treated like a real extent for the purposes of reading, but conversion needs to be completed during a sync operation. Another possibility for just the ->writepage problem is that we could make delalloc allocation in ->writepage more like and EFI/EFD type operation. That is, we allocate the space and log all the changes in an allocation intent transaction (basically the same as the current allocation transaction) and then add an allocation done transaction that is issued at IO completion that basically manipulation won't require IO to complete. Effectively this would be logging all the xfs_ioend structures. Then in log recovery we simply convert any range that does not have a done transaction to unwritten, thereby preventing stale data exposure. The down side to this approach is that it needs new transactions and log recovery code, so is not backwards compatible. I think is probably a simpler solution with lower overhead compared to allocating unwritten extents everywhere. It doesn't solve the extsize problem, but that probably should be handled up at the ->aio_write level, not at the ->write_page level. Similarly, the preallocation issue could easily be handled with small changes to xfs_bmapi().... I'm sure there are other ways to solve these problems, but these two are the ones that come to mind for me. I'm open to other solutions or ways to improve on these ones, especially if they are simpler. ;) Anyone got any ideas or improvements? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+3r1K+48+fromorbit.com=david@internode.on.net Thu Jan 13 22:49:18 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0E4nH3w225163 for ; Thu, 13 Jan 2011 22:49:18 -0600 X-ASG-Debug-ID: 1294980689-17b603b80000-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 6268B12FC066 for ; Thu, 13 Jan 2011 20:51:29 -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 8LczK6AfB4k8rWMg for ; Thu, 13 Jan 2011 20:51:29 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52688418-1927428 for multiple; Fri, 14 Jan 2011 15:21:28 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PdbdG-0005Kp-AH; Fri, 14 Jan 2011 15:51:26 +1100 Date: Fri, 14 Jan 2011 15:51:26 +1100 From: Dave Chinner To: karn@ka9q.net Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Extreme fragmentation when backing up via NFS Subject: Re: Extreme fragmentation when backing up via NFS Message-ID: <20110114045126.GG16267@dastard> References: <4D0C9A4F.4040108@pzystorm.de> <20101220001024.GH5193@dastard> <4D0EC5C5.2070407@pzystorm.de> <20101220045126.GK5193@dastard> <20101220105547.4f9e7218@galadriel.home> <4D2E3B38.6010506@pzystorm.de> <4D2EFB08.90502@philkarn.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <4D2EFB08.90502@philkarn.net> 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: 1294980691 X-Barracuda-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.52320 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, Jan 13, 2011 at 05:15:52AM -0800, Phil Karn wrote: > I have been backing up my main Linux server onto a secondary machine via > NFS. I use xfsdump like this: > > xfsdump -l 9 -f /machine/backups/fs.9.xfsdump / > > Over on the server machine, xfs_bmap shows an *extreme* amount of > fragmentation in the backup file. 20,000+ extents are not uncommon, with > many extents consisting of a single allocation block (8x 512B sectors or > 4KB). > > I do notice while the backup file is being written that holes often > appear in the extent map towards the end of the file. I theorize that > somehow the individual writes are going to the file system out of order, > and this causes both the temporary holes and the extreme fragmentation. > > I'm able to work around the fragmentation manually by looking at the > estimate from xfsdump of the size of the backup and then using the > fallocate command locally on the file server to allocate more than that > amount of space to the backup file. When the backup is done, I look at > xfsdump's report of the actual size of the backup file and use the > truncate command locally on the server to trim off the excess. > > Is fragmentation on XFS via NFS a known problem? Yes, and it's caused by the way the NFS server uses the VFS. These commits that have just hit mainline in the 2.6.38-rc1 merge window: 6e85756 xfs: don't truncate prealloc from frequently accessed inodes 055388a xfs: dynamic speculative EOF preallocation Should mostly fix the problem. It would be good to know if they really do fix your problem or not, because you are suffering from exactly the problem they are supposed to fix. I've copied the commit messages below so I don't have to spend time explaining the problem or the fix. :) Cheers, Dave. -- Dave Chinner david@fromorbit.com commit 6e857567dbbfe14dd6cc3f7414671b047b1ff5c7 Author: Dave Chinner Date: Thu Dec 23 12:02:31 2010 +1100 xfs: don't truncate prealloc from frequently accessed inodes 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 track of ->release calls made on a dirty 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 when the inode is dirty, there is a good chance that the inode is being accessed by the NFS server. Hence set a flag the first time ->release is called while there are delalloc blocks still outstanding on the inode. If this flag is set 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. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 055388a3188f56676c21e92962fc366ac8b5cb72 Author: Dave Chinner Date: Tue Jan 4 11:35:03 2011 +1100 xfs: dynamic speculative EOF preallocation 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 From josef@redhat.com Fri Jan 14 06:59:38 2011 X-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_63, J_CHICKENPOX_64,J_CHICKENPOX_66,J_CHICKENPOX_84 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 p0ECxbus022937 for ; Fri, 14 Jan 2011 06:59:37 -0600 X-ASG-Debug-ID: 1295010111-350d02160000-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 973FF12FD53C for ; Fri, 14 Jan 2011 05:01:51 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xRa7QPr91rBTUAwW for ; Fri, 14 Jan 2011 05:01:51 -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 p0ED1pwf006238 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Jan 2011 08:01:51 -0500 Received: from localhost.localdomain (test1244.test.redhat.com [10.10.10.244]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p0ED1ncD018601 for ; Fri, 14 Jan 2011 08:01:50 -0500 From: Josef Bacik To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] Xfsprogs: add fiemap command to xfs_io Subject: [PATCH] Xfsprogs: add fiemap command to xfs_io Date: Fri, 14 Jan 2011 07:51:41 -0500 Message-Id: <1295009501-17794-1-git-send-email-josef@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1295010112 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 When trying to add a test for hole punching I noticed that the "bmap" command only works on XFS, which makes testing hole punching on other fs's kind of difficult. To fix this I've added an fiemap command that works almost exactly like bmap. It is formatted similarly and takes similar flags, the only thing thats different is obviously it doesn't spit out AG info and it doesn't make finding prealloc space optional. This is my first foray into all of this stuff so a good hard look would be appreciated. I tested it with a few different files to make sure bmap and fiemap both looked the same. Thanks, Signed-off-by: Josef Bacik --- configure.in | 1 + include/builddefs.in | 1 + io/Makefile | 7 + io/fiemap.c | 347 +++++++++++++++++++++++++++++++++++++++++++++++++ io/init.c | 1 + io/io.h | 6 + m4/package_libcdev.m4 | 8 + 7 files changed, 371 insertions(+), 0 deletions(-) create mode 100644 io/fiemap.c diff --git a/configure.in b/configure.in index 30907de..16441ce 100644 --- a/configure.in +++ b/configure.in @@ -103,6 +103,7 @@ AC_HAVE_SENDFILE AC_HAVE_GETMNTENT AC_HAVE_GETMNTINFO AC_HAVE_FALLOCATE +AC_HAVE_FIEMAP AC_HAVE_BLKID_TOPO($enable_blkid) AC_TYPE_PSINT diff --git a/include/builddefs.in b/include/builddefs.in index 93d1e67..f895ed9 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -98,6 +98,7 @@ HAVE_SENDFILE = @have_sendfile@ HAVE_GETMNTENT = @have_getmntent@ HAVE_GETMNTINFO = @have_getmntinfo@ HAVE_FALLOCATE = @have_fallocate@ +HAVE_FIEMAP = @have_fiemap@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall # -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl diff --git a/io/Makefile b/io/Makefile index fc98166..9d79dca 100644 --- a/io/Makefile +++ b/io/Makefile @@ -44,6 +44,13 @@ else LSRCFILES += sendfile.c endif +ifeq ($(HAVE_FIEMAP),yes) +CFILES += fiemap.c +LCFLAGS += -DHAVE_FIEMAP +else +LSRCFILES += fiemap.c +endif + ifeq ($(PKG_PLATFORM),irix) LSRCFILES += inject.c resblks.c else diff --git a/io/fiemap.c b/io/fiemap.c new file mode 100644 index 0000000..fa990cc --- /dev/null +++ b/io/fiemap.c @@ -0,0 +1,347 @@ +/* + * Copyright (c) 2010 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include "init.h" +#include "io.h" + +static cmdinfo_t fiemap_cmd; + +static void +fiemap_help(void) +{ + printf(_( +"\n" +" prints the block mapping for a file's data or attribute forks" +"\n" +" Example:\n" +" 'fiemap -v' - tabular format verbose map\n" +"\n" +" fiemap prints the map of disk blocks used by the current file.\n" +" The map lists each extent used by the file, as well as regions in the\n" +" file that do not have any corresponding blocks (holes).\n" +" By default, each line of the listing takes the following form:\n" +" extent: [startoffset..endoffset]: startblock..endblock\n" +" Holes are marked by replacing the startblock..endblock with 'hole'.\n" +" All the file offsets and disk blocks are in units of 512-byte blocks.\n" +" -a -- prints the attribute fork map instead of the data fork.\n" +" -l -- also displays the length of each extent in 512-byte blocks.\n" +" -n -- query n extents.\n" +" -v -- Verbose information\n" +"\n")); +} + +static int +numlen( + __u64 val, + int base) +{ + __u64 tmp; + int len; + + for (len = 0, tmp = val; tmp > 0; tmp = tmp/base) + len++; + return (len == 0 ? 1 : len); +} + +static void +print_verbose( + struct fiemap_extent *extent, + int blocksize, + int foff_w, + int boff_w, + int tot_w, + int flg_w, + int max_extents, + int *cur_extent, + __u64 *last_logical) +{ + __u64 lstart; + __u64 len; + __u64 block; + char lbuf[48]; + char bbuf[48]; + char flgbuf[16]; + + lstart = extent->fe_logical / blocksize; + len = extent->fe_length / blocksize; + block = extent->fe_physical / blocksize; + + memset(lbuf, 0, sizeof(lbuf)); + memset(bbuf, 0, sizeof(bbuf)); + + if (lstart != *last_logical) { + snprintf(lbuf, sizeof(lbuf), "[%llu..%llu]:", *last_logical, + lstart - 1ULL); + printf("%4d: %-*s %-*s %*llu\n", *cur_extent, foff_w, lbuf, + boff_w, _("hole"), tot_w, lstart - *last_logical); + (*cur_extent)++; + memset(lbuf, 0, sizeof(lbuf)); + } + + if ((*cur_extent + 1) == max_extents) + return; + + snprintf(lbuf, sizeof(lbuf), "[%llu..%llu]:", lstart, + lstart + len - 1ULL); + snprintf(bbuf, sizeof(bbuf), "%llu..%llu", block, block + len - 1ULL); + snprintf(flgbuf, sizeof(flgbuf), "0x%x", extent->fe_flags); + printf("%4d: %-*s %-*s %*llu %*s\n", *cur_extent, foff_w, lbuf, + boff_w, bbuf, tot_w, len, flg_w, flgbuf); + + (*cur_extent)++; + *last_logical = lstart + len; +} + +static void +print_plain( + struct fiemap_extent *extent, + int lflag, + int blocksize, + int max_extents, + int *cur_extent, + __u64 *last_logical) +{ + __u64 lstart; + __u64 block; + __u64 len; + + lstart = extent->fe_logical / blocksize; + len = extent->fe_length / blocksize; + block = extent->fe_physical / blocksize; + + if (lstart != *last_logical) { + printf("\t%d: [%llu..%llu]: hole", *cur_extent, + *last_logical, lstart - 1ULL); + if (lflag) + printf(_(" %llu blocks\n"), + lstart - *last_logical); + else + printf("\n"); + (*cur_extent)++; + } + + if ((*cur_extent + 1) == max_extents) + return; + + printf("\t%d: [%llu..%llu]: %llu..%llu", *cur_extent, + lstart, lstart + len - 1ULL, block, + block + len - 1ULL); + + if (lflag) + printf(_(" %llu blocks\n"), len); + else + printf("\n"); + (*cur_extent)++; + *last_logical = lstart + len; +} + +int +fiemap_f( + int argc, + char **argv) +{ + struct fiemap *fiemap; + int max_extents = 0; + int num_extents = 32; + int last = 0; + int nflag = 0; + int lflag = 0; + int vflag = 0; + int fiemap_flags = FIEMAP_FLAG_SYNC; + int c; + int i; + int map_size; + int ret; + int cur_extent = 0; + int foff_w = 16; /* 16 just for a good minimum range */ + int boff_w = 16; + int tot_w = 5; /* 5 since its just one number */ + int flg_w = 5; + __u64 blocksize = 512; + __u64 last_logical = 0; + struct stat st; + + while ((c = getopt(argc, argv, "aln:v")) != EOF) { + switch (c) { + case 'a': + fiemap_flags |= FIEMAP_FLAG_XATTR; + break; + case 'l': + lflag = 1; + break; + case 'n': + max_extents = atoi(optarg); + nflag = 1; + break; + case 'v': + vflag++; + break; + default: + return command_usage(&fiemap_cmd); + } + } + + if (max_extents) + num_extents = min(num_extents, max_extents); + map_size = sizeof(struct fiemap) + + (num_extents * sizeof(struct fiemap_extent)); + fiemap = malloc(map_size); + if (!fiemap) { + fprintf(stderr, _("%s: malloc of %d bytes failed.\n"), + progname, map_size); + exitcode = 1; + return 0; + } + + printf("%s:\n", file->name); + + if (vflag) { + for (i = 0; i < fiemap->fm_mapped_extents; i++) { + char lbuf[32]; + char bbuf[32]; + __u64 logical; + __u64 block; + __u64 len; + struct fiemap_extent *extent; + + extent = &fiemap->fm_extents[i]; + logical = extent->fe_logical / blocksize; + len = extent->fe_length / blocksize; + block = extent->fe_physical / blocksize; + + snprintf(lbuf, sizeof(lbuf), "[%llu..%llu]", logical, + logical + len - 1); + snprintf(bbuf, sizeof(bbuf), "%llu..%llu", block, + block + len - 1); + foff_w = max(foff_w, strlen(lbuf)); + boff_w = max(boff_w, strlen(bbuf)); + tot_w = max(tot_w, numlen(len, 10)); + flg_w = max(flg_w, numlen(extent->fe_flags, 16)); + if (extent->fe_flags & FIEMAP_EXTENT_LAST) + break; + } + printf("%4s: %-*s %-*s %*s %*s\n", _("EXT"), + foff_w, _("FILE-OFFSET"), + boff_w, _("BLOCK-RANGE"), + tot_w, _("TOTAL"), + flg_w, _("FLAGS")); + } + + while (!last && ((cur_extent + 1) != max_extents)) { + if (max_extents) + num_extents = min(num_extents, + max_extents - (cur_extent + 1)); + + memset(fiemap, 0, map_size); + fiemap->fm_flags = fiemap_flags; + fiemap->fm_start = last_logical; + fiemap->fm_length = -1; + fiemap->fm_extent_count = num_extents; + + ret = ioctl(file->fd, FS_IOC_FIEMAP, (unsigned long)fiemap); + if (ret < 0) { + fprintf(stderr, "%s: ioctl(FS_IOC_FIEMAP) [\"%s\"]: " + "%s\n", progname, file->name, strerror(errno)); + free(fiemap); + exitcode = 1; + return 0; + } + + /* No more extents to map, exit */ + if (!fiemap->fm_mapped_extents) + break; + + for (i = 0; i < fiemap->fm_mapped_extents; i++) { + struct fiemap_extent *extent; + + extent = &fiemap->fm_extents[i]; + if (vflag) + print_verbose(extent, blocksize, foff_w, + boff_w, tot_w, flg_w, + max_extents, &cur_extent, + &last_logical); + else + print_plain(extent, lflag, blocksize, + max_extents, &cur_extent, + &last_logical); + if (extent->fe_flags & FIEMAP_EXTENT_LAST) { + last = 1; + break; + } + + if ((cur_extent + 1) == max_extents) + break; + } + } + + if ((cur_extent + 1) == max_extents) + goto out; + + memset(&st, 0, sizeof(st)); + if (fstat(file->fd, &st)) { + fprintf(stderr, "%s: fstat failed: %s\n", progname, + strerror(errno)); + free(fiemap); + exitcode = 1; + return 0; + } + + if (cur_extent && last_logical < (st.st_size / blocksize)) { + char lbuf[32]; + + snprintf(lbuf, sizeof(lbuf), "[%llu..%llu]:", + last_logical, (st.st_size / blocksize) - 1); + if (vflag) { + printf("%4d: %-*s %-*s %*llu\n", cur_extent, + foff_w, lbuf, boff_w, _("hole"), tot_w, + (st.st_size / blocksize) - last_logical); + } else { + printf("\t%d: %s %s", cur_extent, lbuf, + _("hole")); + if (lflag) + printf(_(" %llu blocks\n"), + (st.st_size / blocksize) - + last_logical); + else + printf("\n"); + } + } + +out: + free(fiemap); + return 0; +} + +void +fiemap_init(void) +{ + fiemap_cmd.name = "fiemap"; + fiemap_cmd.cfunc = fiemap_f; + fiemap_cmd.argmin = 0; + fiemap_cmd.argmax = -1; + fiemap_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; + fiemap_cmd.args = _("[-alv] [-n nx]"); + fiemap_cmd.oneline = _("print block mapping for a file"); + fiemap_cmd.help = fiemap_help; + + add_command(&fiemap_cmd); +} diff --git a/io/init.c b/io/init.c index f8fc25d..a166ad1 100644 --- a/io/init.c +++ b/io/init.c @@ -71,6 +71,7 @@ init_commands(void) parent_init(); pread_init(); prealloc_init(); + fiemap_init(); pwrite_init(); quit_init(); resblks_init(); diff --git a/io/io.h b/io/io.h index 630897d..2923362 100644 --- a/io/io.h +++ b/io/io.h @@ -135,3 +135,9 @@ extern void mincore_init(void); #else #define mincore_init() do { } while (0) #endif + +#ifdef HAVE_FIEMAP +extern void fiemap_init(void); +#else +#define fiemap_init() do { } while (0) +#endif diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 index 1c1859d..8192181 100644 --- a/m4/package_libcdev.m4 +++ b/m4/package_libcdev.m4 @@ -116,3 +116,11 @@ AC_DEFUN([AC_HAVE_FALLOCATE], AC_MSG_RESULT(no)) AC_SUBST(have_fallocate) ]) + +# +# Check if we have the fiemap ioctl (Linux) +# +AC_DEFUN([AC_HAVE_FIEMAP], + [ AC_CHECK_HEADERS([linux/fiemap.h], [ have_fiemap=yes ], [ have_fiemap=no ]) + AC_SUBST(have_fiemap) + ]) -- 1.6.6.1 From josef@redhat.com Fri Jan 14 07:00:21 2011 X-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 p0ED0L2W023099 for ; Fri, 14 Jan 2011 07:00:21 -0600 X-ASG-Debug-ID: 1295010155-2996003a0000-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 D22C11D322FA for ; Fri, 14 Jan 2011 05:02:36 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3IT3yaf0iRJ8egZw for ; Fri, 14 Jan 2011 05:02:36 -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 p0ED2Z5p015964 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Jan 2011 08:02:35 -0500 Received: from localhost.localdomain (test1244.test.redhat.com [10.10.10.244]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p0ED2XDw008629 for ; Fri, 14 Jan 2011 08:02:34 -0500 From: Josef Bacik To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfsprogs: add fpunch command for hole punching via fallocate Subject: [PATCH] xfsprogs: add fpunch command for hole punching via fallocate Date: Fri, 14 Jan 2011 07:52:25 -0500 Message-Id: <1295009545-17839-1-git-send-email-josef@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: 1295010156 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 adds a fpunch command that Dave Chinner recommended. It simply uses fallocate to punch a hole for the given offset and length. It is necessary to run the xfstest I have for hole punching. Thanks, Signed-off-by: Josef Bacik --- io/prealloc.c | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 41 insertions(+), 4 deletions(-) diff --git a/io/prealloc.c b/io/prealloc.c index c8b7df6..9dcfc1c 100644 --- a/io/prealloc.c +++ b/io/prealloc.c @@ -32,6 +32,9 @@ static cmdinfo_t unresvsp_cmd; static cmdinfo_t zero_cmd; #if defined(HAVE_FALLOCATE) static cmdinfo_t falloc_cmd; +#if defined (FALLOC_FL_PUNCH_HOLE) +static cmdinfo_t fpunch_cmd; +#endif #endif static int @@ -153,8 +156,10 @@ fallocate_f( xfs_flock64_t segment; int mode = 0; int c; + const char *opts; - while ((c = getopt(argc, argv, "k")) != EOF) { + opts = "k"; + while ((c = getopt(argc, argv, opts)) != EOF) { switch (c) { case 'k': mode = FALLOC_FL_KEEP_SIZE; @@ -176,7 +181,28 @@ fallocate_f( } return 0; } -#endif + +#if defined (FALLOC_FL_PUNCH_HOLE) +static int +fpunch_f( + int argc, + char **argv) +{ + xfs_flock64_t segment; + int mode = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE; + + if (!offset_length(argv[1], argv[2], &segment)) + return 0; + + if (fallocate(file->fd, mode, + segment.l_start, segment.l_len)) { + perror("fallocate"); + return 0; + } + return 0; +} +#endif /* FALLOC_FL_PUNCH_HOLE */ +#endif /* HAVE_FALLOCATE */ void prealloc_init(void) @@ -239,7 +265,18 @@ prealloc_init(void) falloc_cmd.args = _("[-k] off len"); falloc_cmd.oneline = _("allocates space associated with part of a file via fallocate"); - add_command(&falloc_cmd); -#endif + +#if defined (FALLOC_FL_PUNCH_HOLE) + fpunch_cmd.name = _("fpunch"); + fpunch_cmd.cfunc = fpunch_f; + fpunch_cmd.argmin = 2; + fpunch_cmd.argmax = -1; + fpunch_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; + fpunch_cmd.args = _("off len"); + fpunch_cmd.oneline = + _("de-allocates space assocated with part of a file via fallocate"); + add_command(&fpunch_cmd); +#endif /* FALLOC_FL_PUNCH_HOLE */ +#endif /* HAVE_FALLOCATE */ } -- 1.6.6.1 From josef@redhat.com Fri Jan 14 07:01:29 2011 X-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_62, 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 p0ED1Stw023301 for ; Fri, 14 Jan 2011 07:01:29 -0600 X-ASG-Debug-ID: 1295010223-1c5e01fa0000-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 3439E2655B8 for ; Fri, 14 Jan 2011 05:03:43 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BVqJ2TJctN7C8f9R for ; Fri, 14 Jan 2011 05:03:43 -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 p0ED3hfl010666 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Jan 2011 08:03:43 -0500 Received: from localhost.localdomain (test1244.test.redhat.com [10.10.10.244]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p0ED3g0j008865 for ; Fri, 14 Jan 2011 08:03:42 -0500 From: Josef Bacik To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfstests 249: add test for fallocate with hole punching Subject: [PATCH] xfstests 249: add test for fallocate with hole punching Date: Fri, 14 Jan 2011 07:53:34 -0500 Message-Id: <1295009614-17886-1-git-send-email-josef@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: 1295010224 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 As Dave Chinner requested I moved the major test meat of 242 into common.punch and made it take all the arguments for alloc/punch/zero/map and such. This way 242 and 249 can use the same base test and just pass in their specific commands they are testing. I ran both 242 and 249 on XFS and the both pass. Thanks, Signed-off-by: Josef Bacik --- 242 | 141 +--------------------------------------------------- 249 | 57 +++++++++++++++++++++ 249.out | 47 +++++++++++++++++ common.punch | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ common.rc | 27 ++++++++++ group | 1 + 6 files changed, 291 insertions(+), 139 deletions(-) create mode 100644 249 create mode 100644 249.out diff --git a/242 b/242 index 083aa31..9a0c89e 100755 --- a/242 +++ b/242 @@ -41,6 +41,7 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 # get standard environment, filters and checks . ./common.rc . ./common.filter +. ./common.punch # real QA test starts here _supported_fs xfs @@ -55,147 +56,9 @@ _test_io_zero() [ $(_test_io_zero) -eq 0 ] && _notrun "zero command not supported" -die_now() -{ - status=1 - exit -} - -_filter_bmap() -{ - awk '$3 ~ /hole/ { print $1, $2, $3; next } - $7 ~ /10000/ { print $1, $2, "unwritten"; next } - $7 ~ /00000/ {print $1, $2, "data" }' -} - -# test the different corner cases for zeroing a range: -# -# 1. into a hole -# 2. into allocated space -# 3. into unwritten space -# 4. hole -> data -# 5. hole -> unwritten -# 6. data -> hole -# 7. data -> unwritten -# 8. unwritten -> hole -# 9. unwritten -> data -# 10. hole -> data -> hole -# 11. data -> hole -> data -# 12. unwritten -> data -> unwritten -# 13. data -> unwritten -> data testfile=$TEST_DIR/242.$$ -echo " 1. into a hole" -rm -f $testfile -$XFS_IO_PROG -f -c "truncate 20k" \ - -c "zero 4k 8k" \ - -c "bmap -vp" $testfile | _filter_bmap -[ $? -ne 0 ] && die_now - -echo " 2. into allocated space" -rm -f $testfile -$XFS_IO_PROG -f -c "truncate 20k" \ - -c "pwrite 0 20k" -c "fsync" \ - -c "zero 4k 8k" \ - -c "bmap -vp" $testfile | _filter_bmap -[ $? -ne 0 ] && die_now - -echo " 3. into unwritten space" -rm -f $testfile -$XFS_IO_PROG -f -c "truncate 20k" \ - -c "resvsp 0 20k" \ - -c "zero 4k 8k" \ - -c "bmap -vp" $testfile | _filter_bmap -[ $? -ne 0 ] && die_now - -echo " 4. hole -> data" -rm -f $testfile -$XFS_IO_PROG -f -c "truncate 20k" \ - -c "pwrite 8k 8k" -c "fsync" \ - -c "zero 4k 8k" \ - -c "bmap -vp" $testfile | _filter_bmap -[ $? -ne 0 ] && die_now - -echo " 5. hole -> unwritten" -rm -f $testfile -$XFS_IO_PROG -f -c "truncate 20k" \ - -c "resvsp 8k 8k" \ - -c "zero 4k 8k" \ - -c "bmap -vp" $testfile | _filter_bmap -[ $? -ne 0 ] && die_now - -echo " 6. data -> hole" -rm -f $testfile -$XFS_IO_PROG -f -c "truncate 20k" \ - -c "pwrite 0 8k" -c "fsync" \ - -c "zero 4k 8k" \ - -c "bmap -vp" $testfile | _filter_bmap -[ $? -ne 0 ] && die_now - -echo " 7. data -> unwritten" -rm -f $testfile -$XFS_IO_PROG -f -c "truncate 20k" \ - -c "pwrite 0 8k" -c "fsync" \ - -c "resvsp 8k 8k" \ - -c "zero 4k 8k" \ - -c "bmap -vp" $testfile | _filter_bmap -[ $? -ne 0 ] && die_now - -echo " 8. unwritten -> hole" -rm -f $testfile -$XFS_IO_PROG -f -c "truncate 20k" \ - -c "resvsp 0 8k" \ - -c "zero 4k 8k" \ - -c "bmap -vp" $testfile | _filter_bmap -[ $? -ne 0 ] && die_now - -echo " 9. unwritten -> data" -rm -f $testfile -$XFS_IO_PROG -f -c "truncate 20k" \ - -c "resvsp 0 8k" \ - -c "pwrite 8k 8k" -c "fsync" \ - -c "zero 4k 8k" \ - -c "bmap -vp" $testfile | _filter_bmap -[ $? -ne 0 ] && die_now - -echo " 10. hole -> data -> hole" -rm -f $testfile -$XFS_IO_PROG -f -c "truncate 20k" \ - -c "pwrite 8k 4k" -c "fsync" \ - -c "zero 4k 12k" \ - -c "bmap -vp" $testfile | _filter_bmap -[ $? -ne 0 ] && die_now - -echo " 11. data -> hole -> data" -rm -f $testfile -$XFS_IO_PROG -f -c "truncate 20k" \ - -c "resvsp 0 20k" \ - -c "pwrite 0 8k" \ - -c "pwrite 12k 8k" -c "fsync" \ - -c "unresvsp 8k 4k" \ - -c "zero 4k 12k" \ - -c "bmap -vp" $testfile | _filter_bmap -[ $? -ne 0 ] && die_now - -echo " 12. unwritten -> data -> unwritten" -rm -f $testfile -$XFS_IO_PROG -f -c "truncate 20k" \ - -c "resvsp 0 20k" \ - -c "pwrite 8k 4k" -c "fsync" \ - -c "zero 4k 12k" \ - -c "bmap -vp" $testfile | _filter_bmap -[ $? -ne 0 ] && die_now - - -echo " 13. data -> unwritten -> data" -rm -f $testfile -$XFS_IO_PROG -f -c "truncate 20k" \ - -c "resvsp 0 20k" \ - -c "pwrite 0k 8k" -c "fsync" \ - -c "pwrite 12k 8k" -c "fsync" \ - -c "zero 4k 12k" \ - -c "bmap -vp" $testfile | _filter_bmap -[ $? -ne 0 ] && die_now +_test_generic_punch resvsp unresvsp zero 'bmap -p' _filter_bmap $testfile status=0 ; exit diff --git a/249 b/249 new file mode 100644 index 0000000..1548698 --- /dev/null +++ b/249 @@ -0,0 +1,57 @@ +#! /bin/bash +# FS QA Test No. 249 +# +# Test fallocate hole punching +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Red Hat. 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=josef@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_falloc_punch +_require_xfs_io_fiemap + +testfile=$TEST_DIR/249.$$ + +_test_generic_punch falloc fpunch fpunch fiemap _filter_fiemap $testfile -F + +status=0 ; exit diff --git a/249.out b/249.out new file mode 100644 index 0000000..264aff9 --- /dev/null +++ b/249.out @@ -0,0 +1,47 @@ +QA output created by 249 + 1. into a hole + 2. into allocated space +0: [0..7]: data +1: [8..23]: hole +2: [24..39]: data + 3. into unwritten space +0: [0..7]: unwritten +1: [8..23]: hole +2: [24..39]: unwritten + 4. hole -> data +0: [0..23]: hole +1: [24..31]: data +2: [32..39]: hole + 5. hole -> unwritten +0: [0..23]: hole +1: [24..31]: unwritten +2: [32..39]: hole + 6. data -> hole +0: [0..7]: data +1: [8..39]: hole + 7. data -> unwritten +0: [0..7]: data +1: [8..23]: hole +2: [24..31]: unwritten +3: [32..39]: hole + 8. unwritten -> hole +0: [0..7]: unwritten +1: [8..39]: hole + 9. unwritten -> data +0: [0..7]: unwritten +1: [8..23]: hole +2: [24..31]: data +3: [32..39]: hole + 10. hole -> data -> hole + 11. data -> hole -> data +0: [0..7]: data +1: [8..31]: hole +2: [32..39]: data + 12. unwritten -> data -> unwritten +0: [0..7]: unwritten +1: [8..31]: hole +2: [32..39]: unwritten + 13. data -> unwritten -> data +0: [0..7]: data +1: [8..31]: hole +2: [32..39]: data diff --git a/common.punch b/common.punch index b6576f6..fb20d58 100644 --- a/common.punch +++ b/common.punch @@ -176,3 +176,160 @@ _test_punch() { _do_bmap $filename # print out the state of the file done } + +_filter_fiemap() +{ + awk --posix '$3 ~ /hole/ { print $1, $2, $3; next } + $5 ~ /0x[[:digit:]]*8[[:digit:]]{2}/ { print $1, $2, "unwritten"; next } + $5 ~ /0x[[:digit:]]+/ {print $1, $2, "data" }' +} + +_filter_bmap() +{ + awk '$3 ~ /hole/ { print $1, $2, $3; next } + $7 ~ /10000/ { print $1, $2, "unwritten"; next } + $7 ~ /00000/ {print $1, $2, "data" }' +} + +die_now() +{ + status=1 + exit +} + +# test the different corner cases for zeroing a range: +# +# 1. into a hole +# 2. into allocated space +# 3. into unwritten space +# 4. hole -> data +# 5. hole -> unwritten +# 6. data -> hole +# 7. data -> unwritten +# 8. unwritten -> hole +# 9. unwritten -> data +# 10. hole -> data -> hole +# 11. data -> hole -> data +# 12. unwritten -> data -> unwritten +# 13. data -> unwritten -> data +_test_generic_punch() +{ + alloc_cmd=$1 + punch_cmd=$2 + zero_cmd=$3 #if not testing zero just set to punch + map_cmd=$4 + filter_cmd=$5 + testfile=$6 + xfs_io_opt=$7 #needs to be -F if not testing xfs + + echo " 1. into a hole" + rm -f $testfile + $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \ + -c "$zero_cmd 4k 8k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + + echo " 2. into allocated space" + rm -f $testfile + $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \ + -c "pwrite 0 20k" -c "fsync" \ + -c "$zero_cmd 4k 8k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + + echo " 3. into unwritten space" + rm -f $testfile + $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \ + -c "$alloc_cmd 0 20k" \ + -c "$zero_cmd 4k 8k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + + echo " 4. hole -> data" + rm -f $testfile + $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \ + -c "pwrite 8k 8k" -c "fsync" \ + -c "$zero_cmd 4k 8k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + + echo " 5. hole -> unwritten" + rm -f $testfile + $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \ + -c "$alloc_cmd 8k 8k" \ + -c "$zero_cmd 4k 8k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + + echo " 6. data -> hole" + rm -f $testfile + $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \ + -c "pwrite 0 8k" -c "fsync" \ + -c "$zero_cmd 4k 8k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + + echo " 7. data -> unwritten" + rm -f $testfile + $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \ + -c "pwrite 0 8k" -c "fsync" \ + -c "$alloc_cmd 8k 8k" \ + -c "$zero_cmd 4k 8k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + + echo " 8. unwritten -> hole" + rm -f $testfile + $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \ + -c "$alloc_cmd 0 8k" \ + -c "$zero_cmd 4k 8k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + + echo " 9. unwritten -> data" + rm -f $testfile + $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \ + -c "$alloc_cmd 0 8k" \ + -c "pwrite 8k 8k" -c "fsync" \ + -c "$zero_cmd 4k 8k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + + echo " 10. hole -> data -> hole" + rm -f $testfile + $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \ + -c "pwrite 8k 4k" -c "fsync" \ + -c "$zero_cmd 4k 12k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + + echo " 11. data -> hole -> data" + rm -f $testfile + $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \ + -c "$alloc_cmd 0 20k" \ + -c "pwrite 0 8k" \ + -c "pwrite 12k 8k" -c "fsync" \ + -c "$punch_cmd 8k 4k" \ + -c "$zero_cmd 4k 12k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + + echo " 12. unwritten -> data -> unwritten" + rm -f $testfile + $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \ + -c "$alloc_cmd 0 20k" \ + -c "pwrite 8k 4k" -c "fsync" \ + -c "$zero_cmd 4k 12k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + + echo " 13. data -> unwritten -> data" + rm -f $testfile + $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \ + -c "$alloc_cmd 0 20k" \ + -c "pwrite 0k 8k" -c "fsync" \ + -c "pwrite 12k 8k" -c "fsync" \ + -c "$zero_cmd 4k 12k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now +} diff --git a/common.rc b/common.rc index 49d59aa..58e7318 100644 --- a/common.rc +++ b/common.rc @@ -847,6 +847,33 @@ _require_xfs_io_falloc() _notrun "xfs_io fallocate command failed (old kernel/wrong fs?)" } +# check that xfs_io, kernel and filesystem all support fallocate with hole +# punching +_require_xfs_io_falloc_punch() +{ + testfile=$TEST_DIR/$$.falloc + testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ + -c "fpunch 4k 8k" $testfile 2>&1` + rm -f $testfile 2>&1 > /dev/null + echo $testio | grep -q "not found" && \ + _notrun "xfs_io fallocate punch support is missing" + echo $testio | grep -q "Operation not supported" && \ + _notrun "xfs_io fallocate punch command failed (no fs support?)" +} + +# check that xfs_io, kernel and filesystem support fiemap +_require_xfs_io_fiemap() +{ + testfile=$TEST_DIR/$$.fiemap + testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ + -c "fiemap -v" $testfile 2>&1` + rm -f $testfile 2>&1 > /dev/null + echo $testio | grep -q "not found" && \ + _notrun "xfs_io fiemap support is missing" + echo $testio | grep -q "Operation not supported" && \ + _notrun "xfs_io fiemap command failed (no fs support?)" +} + # Check that a fs has enough free space (in 1024b blocks) # _require_fs_space() diff --git a/group b/group index a40c98f..cb4a509 100644 --- a/group +++ b/group @@ -362,3 +362,4 @@ deprecated 246 auto quick rw 247 auto quick rw 248 auto quick rw +249 auto quick prealloc -- 1.6.6.1 From SRS0+1fh3+48+fromorbit.com=dave@internode.on.net Fri Jan 14 07:05:44 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ED5hus024083 for ; Fri, 14 Jan 2011 07:05:44 -0600 X-ASG-Debug-ID: 1295010476-2996009f0000-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 044431D32767 for ; Fri, 14 Jan 2011 05:07:56 -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 PSvQqmVawaE5xp9s for ; Fri, 14 Jan 2011 05:07:56 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 7527278-1927428 for ; Fri, 14 Jan 2011 23:37:55 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PdjNh-00065u-FM for xfs@oss.sgi.com; Sat, 15 Jan 2011 00:07:53 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PdjN3-0003GC-5C for xfs@oss.sgi.com; Sat, 15 Jan 2011 00:07:13 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/2] xfs: fix efi item leak on forced shutdown Subject: [PATCH 2/2] xfs: fix efi item leak on forced shutdown Date: Sat, 15 Jan 2011 00:07:10 +1100 Message-Id: <1295010430-12495-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295010430-12495-1-git-send-email-david@fromorbit.com> References: <1295010430-12495-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1295010478 X-Barracuda-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.52353 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 After test 139, kmemleak shows: unreferenced object 0xffff880078b405d8 (size 400): comm "xfs_io", pid 4904, jiffies 4294909383 (age 1186.728s) hex dump (first 32 bytes): 60 c1 17 79 00 88 ff ff 60 c1 17 79 00 88 ff ff `..y....`..y.... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ backtrace: [] kmemleak_alloc+0x2d/0x60 [] kmem_cache_alloc+0x13f/0x2b0 [] kmem_zone_alloc+0x77/0xf0 [] kmem_zone_zalloc+0x1e/0x50 [] xfs_efi_init+0x4b/0xb0 [] xfs_trans_get_efi+0x58/0x90 [] xfs_bmap_finish+0x8b/0x1d0 [] xfs_itruncate_finish+0x2c4/0x5d0 [] xfs_setattr+0x8df/0xa70 [] xfs_vn_setattr+0x1b/0x20 [] notify_change+0x170/0x2e0 [] do_truncate+0x66/0xa0 [] sys_ftruncate+0xdb/0xe0 [] system_call_fastpath+0x16/0x1b [] 0xffffffffffffffff The cause of the leak is that the "remove" parameter of IOP_UNPIN() is never set when a CIL push is aborted. This means that the EFI item is never freed if it was in the push being cancelled. The problem is specific to delayed logging. Signed-off-by: Dave Chinner --- fs/xfs/xfs_trans.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index f80a067..e66ce5e 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1472,6 +1472,16 @@ xfs_trans_committed_bulk( if (XFS_LSN_CMP(item_lsn, (xfs_lsn_t)-1) == 0) continue; + /* + * if we are aborting the operation, no point in inserting the + * object into the AIL as we areee in a shutdown situation. + */ + if (aborted) { + ASSERT(XFS_FORCED_SHUTDOWN(ailp->xa_mount)); + IOP_UNPIN(lip, aborted); + continue; + } + if (item_lsn != commit_lsn) { /* -- 1.7.2.3 From SRS0+8aWY+48+fromorbit.com=dave@internode.on.net Fri Jan 14 07:05:44 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ED5hMZ024086 for ; Fri, 14 Jan 2011 07:05:44 -0600 X-ASG-Debug-ID: 1295010476-531600940000-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 A9B1C12FD3E3 for ; Fri, 14 Jan 2011 05:07:57 -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 mcsc8ZH23yRRg3q9 for ; Fri, 14 Jan 2011 05:07:57 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52858334-1927428 for ; Fri, 14 Jan 2011 23:37:55 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PdjNh-00065s-Ay for xfs@oss.sgi.com; Sat, 15 Jan 2011 00:07:53 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PdjN2-0003G8-Qv for xfs@oss.sgi.com; Sat, 15 Jan 2011 00:07:12 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/2] xfs: fix memory leaks on shutdown w/ delayed logging. Subject: [PATCH 0/2] xfs: fix memory leaks on shutdown w/ delayed logging. Date: Sat, 15 Jan 2011 00:07:08 +1100 Message-Id: <1295010430-12495-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: 1295010478 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1351 1.0000 -1.1864 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= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.52354 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 These two patches fix memory leaks that can occur when a log write aborts during a CIL flush. xfstest 139 triggers these leaks reliably. From SRS0+M0si+48+fromorbit.com=dave@internode.on.net Fri Jan 14 07:05:52 2011 X-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 p0ED5qm2024135 for ; Fri, 14 Jan 2011 07:05:52 -0600 X-ASG-Debug-ID: 1295010485-77e302770000-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 A57C11D32770 for ; Fri, 14 Jan 2011 05:08:06 -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 NWedOtG6sGKHvM04 for ; Fri, 14 Jan 2011 05:08:06 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 53265601-1927428 for ; Fri, 14 Jan 2011 23:38:05 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PdjNh-00065t-Ay for xfs@oss.sgi.com; Sat, 15 Jan 2011 00:07:53 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PdjN2-0003GA-W2 for xfs@oss.sgi.com; Sat, 15 Jan 2011 00:07:12 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/2] xfs: fix log ticket leak on forced shutdown. Subject: [PATCH 1/2] xfs: fix log ticket leak on forced shutdown. Date: Sat, 15 Jan 2011 00:07:09 +1100 Message-Id: <1295010430-12495-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295010430-12495-1-git-send-email-david@fromorbit.com> References: <1295010430-12495-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1295010487 X-Barracuda-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.52353 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 kmemleak detector shows this after test 139: unreferenced object 0xffff880079b88bb0 (size 264): comm "xfs_io", pid 4904, jiffies 4294909382 (age 276.824s) hex dump (first 32 bytes): 00 00 00 00 ad 4e ad de ff ff ff ff 00 00 00 00 .....N.......... ff ff ff ff ff ff ff ff 48 7b c9 82 ff ff ff ff ........H{...... backtrace: [] kmemleak_alloc+0x2d/0x60 [] kmem_cache_alloc+0x13f/0x2b0 [] kmem_zone_alloc+0x77/0xf0 [] kmem_zone_zalloc+0x1e/0x50 [] xlog_ticket_alloc+0x34/0x170 [] xlog_cil_push+0xa4/0x3f0 [] xlog_cil_force_lsn+0x15a/0x160 [] _xfs_log_force_lsn+0x75/0x2d0 [] _xfs_trans_commit+0x2bd/0x2f0 [] xfs_iomap_write_allocate+0x1ad/0x350 [] xfs_map_blocks+0x21f/0x370 [] xfs_vm_writepage+0x1c7/0x550 [] __writepage+0x1a/0x50 [] write_cache_pages+0x1c2/0x4c0 [] generic_writepages+0x27/0x30 [] xfs_vm_writepages+0x5d/0x80 By inspection, the leak occurs when xlog_write() returns and error and we jump to the abort path without dropping the reference on the active ticket. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_cil.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 9dc8125..c7eac5a 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -543,7 +543,7 @@ xlog_cil_push( error = xlog_write(log, &lvhdr, tic, &ctx->start_lsn, NULL, 0); if (error) - goto out_abort; + goto out_abort_free_ticket; /* * now that we've written the checkpoint into the log, strictly @@ -569,8 +569,9 @@ restart: } spin_unlock(&cil->xc_cil_lock); + /* xfs_log_done always frees the ticket on error. */ commit_lsn = xfs_log_done(log->l_mp, tic, &commit_iclog, 0); - if (error || commit_lsn == -1) + if (commit_lsn == -1) goto out_abort; /* attach all the transactions w/ busy extents to iclog */ @@ -600,6 +601,8 @@ out_free_ticket: kmem_free(new_ctx); return 0; +out_abort_free_ticket: + xfs_log_ticket_put(tic); out_abort: xlog_cil_committed(ctx, XFS_LI_ABORTED); return XFS_ERROR(EIO); -- 1.7.2.3 From gwehrman@sgi.com Fri Jan 14 10:38:04 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0EGc49i052201 for ; Fri, 14 Jan 2011 10:38:04 -0600 Received: from goalpost.americas.sgi.com (goalpost.americas.sgi.com [128.162.232.54]) by relay2.corp.sgi.com (Postfix) with ESMTP id B5AB630404E; Fri, 14 Jan 2011 08:40:16 -0800 (PST) Received: by goalpost.americas.sgi.com (Postfix, from userid 14442) id 59D1227000; Fri, 14 Jan 2011 10:40:16 -0600 (CST) Date: Fri, 14 Jan 2011 10:40:16 -0600 From: Geoffrey Wehrman To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110114164016.GB30134@sgi.com> References: <20110114002900.GF16267@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110114002900.GF16267@dastard> User-Agent: Mutt/1.5.14 (2007-02-12) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Jan 14, 2011 at 11:29:00AM +1100, Dave Chinner wrote: | This seems to be incorrect to me - a "wasdelay" extent has not yet | been initialised - there's data in memory, but there is nothing on | disk and we may not write it for some time. If we crash after this | transaction is written but before any data is written, we expose | stale data. | | Not only that, it allocates the _entire_ delalloc extent that spans | the preallocation range, even when the preallocation range is only 1 | block and the delalloc extent covers gigabytes. hence we actually | expose a much greater range of the file to stale data exposure | during a crash than just eh preallocated range. Not good. | | Secondly, I think we have the same expose-the-entire-delalloc-extent | -to-stale-data-exposure problem in ->writepage. This onnne, however, | is due to using BMAPI_ENTIRE to allocate the entire delalloc extent | the first time any part of it is written to. Even if we are only | writing a single page (i.e. wbc->nr_to_write = 1) and the delalloc | extent covers gigabytes. So, same problem when we crash. | | Finally, I think the extsize based problem exposed by test 229 is a | also a result of allocating space we have no pages covering in the | page cache (triggered by BMAPI_ENTIRE allocation) so the allocated | space is never zeroed and hence exposes stale data. There used to be an XFS_BMAPI_EXACT flag that wasn't ever used. What would be the effects of re-creating this flag and using it in writepage to prevent the expose-the-entire-delalloc-extent-to-stale-data-exposure problem? This wouldn't solve the exposure of stale data for a crash that occurs after the extent conversion but before the data is written out. The quantity of data exposed is potentially much smaller however. Also, I'm not saying using XFS_BMAPI_EXACT is feasable. I have a very minimal understanding of the writepage code path. -- Geoffrey Wehrman 651-683-5496 gwehrman@sgi.com From karn@ka9q.net Fri Jan 14 12:16:48 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0EIGllr066121 for ; Fri, 14 Jan 2011 12:16:48 -0600 X-ASG-Debug-ID: 1295029141-17f1034f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-pz0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 87CA712FF1E8 for ; Fri, 14 Jan 2011 10:19:01 -0800 (PST) Received: from mail-pz0-f53.google.com (mail-pz0-f53.google.com [209.85.210.53]) by cuda.sgi.com with ESMTP id QGkwjwB0qVcMPa2d for ; Fri, 14 Jan 2011 10:19:01 -0800 (PST) Received: by pzk37 with SMTP id 37so625190pzk.26 for ; Fri, 14 Jan 2011 10:19:01 -0800 (PST) Received: by 10.142.143.19 with SMTP id q19mr1015978wfd.230.1295029141062; Fri, 14 Jan 2011 10:19:01 -0800 (PST) Received: from maggie.local (router.ka9q.net [75.60.237.91]) by mx.google.com with ESMTPS id o1sm2014213wfl.2.2011.01.14.10.18.58 (version=TLSv1/SSLv3 cipher=RC4-MD5); Fri, 14 Jan 2011 10:18:59 -0800 (PST) Sender: Phil Karn Message-ID: <4D309390.4060009@philkarn.net> Date: Fri, 14 Jan 2011 10:18:56 -0800 From: Phil Karn Reply-To: karn@ka9q.net 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: xfs@oss.sgi.com X-ASG-Orig-Subj: fallocate everywhere? Subject: fallocate everywhere? Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pz0-f53.google.com[209.85.210.53] X-Barracuda-Start-Time: 1295029142 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2064 1.0000 -0.7943 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.79 X-Barracuda-Spam-Status: No, SCORE=-0.79 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.52374 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 Can anyone think of a good reason *not* to sprinkle fallocate() calls through as many Linux utilities as possible? E.g., programs like rsync, tar, cpio, pax, ftp, mv, cp -- anything and everything that creates a file with a size known in advance. As far as I can tell, calling fallocate() when it's not supported quickly returns an error and does no harm. So I can't even think of a reason to only make it optional. If it's implemented as an off-by-default option, most people would probably not know about it so it would rarely get used. Those who do know about it would frequently forget to use it, and choosing and learning a separate option for every command would be painful. Besides xfs, ext4 supports fallocate so I expect that most Linux systems will be able to benefit from it fairly soon. From stan@hardwarefreak.com Fri Jan 14 13:49:20 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0EJnJpg078832 for ; Fri, 14 Jan 2011 13:49:20 -0600 X-ASG-Debug-ID: 1295034694-7590033d0000-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 DE05B15408D5 for ; Fri, 14 Jan 2011 11:51:34 -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 raCfIA5nCUy8uzta for ; Fri, 14 Jan 2011 11:51:34 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 749466C130 for ; Fri, 14 Jan 2011 13:51:33 -0600 (CST) Message-ID: <4D30A945.4060000@hardwarefreak.com> Date: Fri, 14 Jan 2011 13:51:33 -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: extremely slow write performance plaintext Subject: Re: extremely slow write performance plaintext References: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> <20110113233527.6dca104d@galadriel.home> <18993_1294964274_4D2F9632_18993_1387_1_F79CF9ADB27B2646B59221B7355263830CC143B1@NYL-EXCH1.HVHCVision.com> In-Reply-To: <18993_1294964274_4D2F9632_18993_1387_1_F79CF9ADB27B2646B59221B7355263830CC143B1@NYL-EXCH1.HVHCVision.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: 1295034694 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2167 1.0000 -0.7407 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.14 X-Barracuda-Spam-Status: No, SCORE=-0.14 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.52380 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 Cory Coager put forth on 1/13/2011 6:17 PM: > --- Physical volume --- > PV Name /dev/cciss/c1d1p1 > VG Name vg0 > PV Size 2.94 TB / not usable 1.51 MB > Allocatable yes > PE Size (KByte) 4096 > Total PE 769902 > Free PE 562351 > Allocated PE 207551 > PV UUID IAZAbk-eMNZ-puMJ-DqW1-zsC7-C0ux-66vYTN Make sure the write cache on the P600 (what size is it BTW?) is enabled and that the BBU is in working order. Also make sure the P600 is disabling the write caches on the drives themselves. Then... Mount with 'nobarrier' so XFS isn't interfering with the hardware cache performance of the P600. With barriers enabled (the default) XFS will periodically flush the cache on the RAID card causing write performance problems. -- Stan From bpm@sgi.com Fri Jan 14 13:53:37 2011 X-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 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 p0EJrajc079774 for ; Fri, 14 Jan 2011 13:53:37 -0600 Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3D966AC010; Fri, 14 Jan 2011 11:55:49 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 9852C431F74; Fri, 14 Jan 2011 13:55:05 -0600 (CST) Date: Fri, 14 Jan 2011 13:55:05 -0600 From: bpm@sgi.com To: Dave Chinner Cc: aelder@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH] xfs_bmap_add_extent_delay_real should set br_startoff Message-ID: <20110114195505.GK28274@sgi.com> References: <20110112194228.8449.41844.stgit@lady3jane.americas.sgi.com> <20110113005207.GR28803@dastard> <20110113193928.GC28274@sgi.com> <20110113231544.GE16267@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110113231544.GE16267@dastard> User-Agent: Mutt/1.5.18 (2008-05-17) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Dave, On Fri, Jan 14, 2011 at 10:15:44AM +1100, Dave Chinner wrote: > On Thu, Jan 13, 2011 at 01:39:28PM -0600, bpm@sgi.com wrote: > > Hi Dave, > > > > On Thu, Jan 13, 2011 at 11:52:07AM +1100, Dave Chinner wrote: > > > On Wed, Jan 12, 2011 at 01:42:28PM -0600, Ben Myers wrote: > > > > When filling in the middle of a previous delayed allocation, set > > > > br_startoff of the new delay extent to the right to NULLSTARTBLOCK > > > > so that it is ignored by xfs_bmap_extent_to_btree. This prevents > > > > a forced shutdown when that in-core extent is converted from delay > > > > to real and is found to be already in the btree. The value is > > > > overwritten below. > > > > You're right. That's not a very good description. I'll see about > > describing it here and then see about boiling it down for repost. > > > > > I'm not sure I understand what the problem is from your description. > > > What actually goes wrong in xfs_bmap_extent_to_btree()? > > > > While testing a related patch whose side effect is to exercise this code > > more often... > > > > I was hitting XFS_WANT_CORRUPTED_GOTOs in xfs_bmap_extent_delay_real in the > > LEFT_FILLING, RIGHT_FILLING cases where we are going to insert an extent > > into the btree and we look it up to make sure it isn't already there: > > > > From xfs_bmap_extent_delay_real: > > 911 case BMAP_LEFT_FILLING: > > 912 /* > > 913 * Filling in the first part of a previous delayed allocation. > > 914 * The left neighbor is not contiguous. > > 915 */ > > 916 trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); > > 917 xfs_bmbt_set_startoff(ep, new_endoff); > > 918 temp = PREV.br_blockcount - new->br_blockcount; > > 919 xfs_bmbt_set_blockcount(ep, temp); > > 920 xfs_iext_insert(ip, idx, 1, new, state); > > 921 ip->i_df.if_lastex = idx; > > 922 ip->i_d.di_nextents++; > > 923 if (cur == NULL) > > 924 rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; > > 925 else { > > 926 rval = XFS_ILOG_CORE; > > 927 if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, > > 928 new->br_startblock, new->br_blockcount, > > 929 &i))) > > 930 goto done; > > 931 XFS_WANT_CORRUPTED_GOTO(i == 0, done); > > > > Forced shutdown at 931. > > So it was allocating a different part of the delalloc extent > that triggered it. OK. > > > > > This loop in xfs_bmap_extents_to_btree copies extents from the ifork into > > the btree: > > > > 3242 /* > > 3243 * Fill in the child block. > > 3244 */ > > 3245 ablock = XFS_BUF_TO_BLOCK(abp); > > 3246 ablock->bb_magic = cpu_to_be32(XFS_BMAP_MAGIC); > > 3247 ablock->bb_level = 0; > > 3248 ablock->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO); > > 3249 ablock->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO); > > 3250 arp = XFS_BMBT_REC_ADDR(mp, ablock, 1); > > 3251 nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); > > 3252 for (cnt = i = 0; i < nextents; i++) { > > 3253 ep = xfs_iext_get_ext(ifp, i); > > 3254 if (!isnullstartblock(xfs_bmbt_get_startblock(ep))) { > > > > ^ note that it explicitly ignores delay allocation extents by testing for > > STARTBLOCKMASK in br_startblock. > > > > 3255 arp->l0 = cpu_to_be64(ep->l0); > > 3256 arp->l1 = cpu_to_be64(ep->l1); > > 3257 arp++; cnt++; > > 3258 } > > 3259 } > > > > So... when we converted from extents format to btree format we copied > > extent to the right into the tree because right.br_startblock = 0 > > which is not a nullstartblock. The right extent was actually > > destined to become delalloc in the ifork but that assignment > > happens only after we've converted to btree format. > > > > The fix works because we set br_startblock to something that includes > > STARTBLOCKMASK before inserting it into the ifork. This way the test at > > 3254 will fail for that extent and it won't be inserted into the btree. > > > > > I'm assuming > > > that it counts one too many real extents, and if so, shouldn't it > > > fire this assert long before you get to a shutdown situation? > > > > > > ASSERT(cnt == XFS_IFORK_NEXTENTS(ip, whichfork)); > > > > It should. > > Thanks for confirming that. Might I suggest that running a debug XFS > build is a good idea purely because it will catch problems like this > when they happen, rather than when you trip over the result later > on? Agreed. I'd prefer to be running debug xfs builds. > > > Also, do you have a test case that triggers this? If so, can it be > > > turned into a xfstests case? I like to have some idea of how the > > > problem was encountered and verified, because this code is complex > > > and easy to misunderstand... > > > > I don't have a test case. Building one might be possible by using extsize > > to get large delalloc allocations and modifying xfs_iomap_write_allocate to > > only allocate for the passed in offset and count instead of from passed in > > iomap... > > Hmmm, not really a generic test case :/ > > I was thinking that we might be able to use sync_file_range() to > write small ranges of pages inside a delalloc extent. However, it > does not limit wbc->nr_to_write() so I suspect it will write entire > delalloc extents at a time rather than small chunks. If I'm understanding xfs_iomap_write_allocate correctly, it seems that the code for writing into the middle of a delalloc extent isn't exercised very often. > > > > SGI-PV: 1013221 > > > > > > The following is mostly the notes I wrote to understand what your > > > patch does. I'm posting them so others don't need to go through the > > > same analysis to understand the patch. While you might have the > > > analysis in the above PV we can't see it at all, so it would be > > > appreciated if you could put a summary of the bug analysis and > > > test case in the commit message so we don't have to spend a couple of > > > hours just to work out what the patch does... > > > > Here are some traces from the PV: > > > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.237772] xfs_iext_insert (ffff88018de2c3c0) br_startoff 9240 br_startblock 304078611 br_blockcount 512 br_state 0 > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.237775] xfs_bmbt_set_all set w/ startblock == 0. br_startoff 9752, br_startblock 0 br_blockcount 18408, br_state 0 > > .... > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238578] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 0: startoff 0 startblock NULLSTARTBLOCK(5) blockcount 5 flag 0 > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238583] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 1: startoff 5 startblock 304069376[4:21fbb00] blockcount 512 flag 0 > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238590] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 2: startoff 517 startblock NULLSTARTBLOCK(5) blockcount 2 flag 0 > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238594] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 3: startoff 519 startblock 304069890[4:21fbd02] blockcount 512 flag 0 > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238598] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 4: startoff 1031 startblock NULLSTARTBLOCK(5) blockcount 1 flag 0 > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238602] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 5: startoff 1032 startblock 304070403[4:21fbf03] blockcount 1024 flag 0 > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238606] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 6: startoff 2056 startblock NULLSTARTBLOCK(5) blockcount 3 flag 0 > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238610] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 7: startoff 2059 startblock 304071430[4:21fc306] blockcount 1024 flag 0 > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238614] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 8: startoff 3083 startblock NULLSTARTBLOCK(5) blockcount 3 flag 0 > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238618] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 9: startoff 3086 startblock 304072457[4:21fc709] blockcount 2560 flag 0 > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238623] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 10: startoff 5646 startblock NULLSTARTBLOCK(5) blockcount 1 flag 0 > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238627] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 11: startoff 5647 startblock 304075018[4:21fd10a] blockcount 512 flag 0 > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238631] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 12: startoff 6159 startblock NULLSTARTBLOCK(5) blockcount 4 flag 0 > > Dec 21 13:08:22 gtomds1 kernel: [ 2008.238635] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 13: startoff 6163 startblock 304075534[4:21fd30e] blockcount 1024 flag 0 > > Dec 21 13:08:23 gtomds1 kernel: [ 2008.238639] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 14: startoff 7187 startblock NULLSTARTBLOCK(5) blockcount 2 flag 0 > > Dec 21 13:08:23 gtomds1 kernel: [ 2008.238643] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 15: startoff 7189 startblock 304076560[4:21fd710] blockcount 1024 flag 0 > > Dec 21 13:08:23 gtomds1 kernel: [ 2008.238647] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 16: startoff 8213 startblock NULLSTARTBLOCK(5) blockcount 2 flag 0 > > Dec 21 13:08:23 gtomds1 kernel: [ 2008.238651] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 17: startoff 8215 startblock 304077586[4:21fdb12] blockcount 1024 flag 0 > > Dec 21 13:08:23 gtomds1 kernel: [ 2008.238655] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 18: startoff 9239 startblock NULLSTARTBLOCK(79) blockcount 1 flag 0 > > Dec 21 13:08:23 gtomds1 kernel: [ 2008.238659] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 19: startoff 9240 startblock 304078611[4:21fdf13] blockcount 512 flag 0 > > Dec 21 13:08:23 gtomds1 kernel: [ 2008.238663] xfs_bmap_extents_to_btree (0xffff88018de2c3c0) 20: startoff 9752 startblock 0[0:0] blockcount 18408 flag 0 <---- we added an extent to the btree with startblock=0 > > .... > > Dec 21 13:08:42 gtomds1 kernel: [ 2009.735411] xfs_bmap_add_extent_delay_real new br_startoff 9752 br_startblock 304079636 br_blockcount1 <---- and it turns out to be the same one we crash on later! > > It's this pattern of alloc/delalloc extents that I'm having trouble > reproducing. The current TOT XFS code simply will not allocate the > middle part of a delalloc extent like this. What exactly is your test > doing to produce this sort of pattern? Also, delalloc behaviour has > changed over different versions, so can you tell me what version of > XFS you are running to cause this? IIRC my test case was dd... I think a bug(s) in the patch I was testing caused the strange allocation patterns. I'll get the test case for that bug posted shortly. Thanks, Ben From ccoager@davisvision.com Fri Jan 14 14:46:18 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0EKkIvn085886 for ; Fri, 14 Jan 2011 14:46:18 -0600 X-ASG-Debug-ID: 1295038112-39cb01ef0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from zixvpm02.zixvpm.davisvision.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5476410006F8 for ; Fri, 14 Jan 2011 12:48:32 -0800 (PST) Received: from zixvpm02.zixvpm.davisvision.com (zixvpm02.zixvpm.davisvision.com [65.213.99.45]) by cuda.sgi.com with ESMTP id y4iQHfXtInvETaMw for ; Fri, 14 Jan 2011 12:48:32 -0800 (PST) Received: from zixvpm02.zixvpm.davisvision.com (ZixVPM [127.0.0.1]) by Outbound.davisvision.com (Proprietary) with ESMTP id 700255DC022 for ; Fri, 14 Jan 2011 15:48:31 -0500 (EST) Received: from riley.davisvision.com (unknown [10.51.11.112]) by zixvpm02.zixvpm.davisvision.com (Proprietary) with ESMTP id 0364E1F4020; Fri, 14 Jan 2011 15:48:31 -0500 (EST) Received: from riley.davisvision.com (localhost [127.0.0.1]) by localhost (Postfix) with SMTP id E981C2463A; Fri, 14 Jan 2011 15:48:30 -0500 (EST) Received: from [192.168.148.68] (ccoager-linux.davisvision.com [192.168.148.68]) by riley.davisvision.com (Postfix) with ESMTP id D72F324637; Fri, 14 Jan 2011 15:48:30 -0500 (EST) Message-ID: <27616_1295038110_4D30B69E_27616_233_1_4D30B69E.4020506@davisvision.com> Date: Fri, 14 Jan 2011 15:48:30 -0500 From: Cory Coager Organization: Davis Vision User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101208 Lightning/1.0b2 Thunderbird/3.1.7 MIME-Version: 1.0 To: xfs@oss.sgi.com CC: Stan Hoeppner X-ASG-Orig-Subj: Re: extremely slow write performance plaintext Subject: Re: extremely slow write performance plaintext References: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> <20110113233527.6dca104d@galadriel.home> <18993_1294964274_4D2F9632_18993_1387_1_F79CF9ADB27B2646B59221B7355263830CC143B1@NYL-EXCH1.HVHCVision.com> <4D30A945.4060000@hardwarefreak.com> In-Reply-To: <4D30A945.4060000@hardwarefreak.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Banner: Set X-Barracuda-Connect: zixvpm02.zixvpm.davisvision.com[65.213.99.45] X-Barracuda-Start-Time: 1295038113 X-Barracuda-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.52384 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 01/14/2011 02:51 PM, Stan Hoeppner wrote: > Make sure the write cache on the P600 (what size is it BTW?) is enabled and that > the BBU is in working order. Also make sure the P600 is disabling the write > caches on the drives themselves. Then... > Write cache is enabled on the controller, the size is 512MB, BBU is in good conditioned (checked with the HP utility). How do I check the write cache on the drives? > Mount with 'nobarrier' so XFS isn't interfering with the hardware cache > performance of the P600. With barriers enabled (the default) XFS will > periodically flush the cache on the RAID card causing write performance problems. > Already using nobarrier. ------------------------------------------------------------------------ The information contained in this communication is intended only for the use of the recipient(s) named above. It may contain information that is privileged or confidential, and may be protected by State and/or Federal Regulations. If the reader of this message is not the intended recipient, you are hereby notified that any dissemination, distribution, or copying of this communication, or any of its contents, is strictly prohibited. If you have received this communication in error, please return it to the sender immediately and delete the original message and any copy of it from your computer system. If you have any questions concerning this message, please contact the sender. ------------------------------------------------------------------------ From bpm@sgi.com Fri Jan 14 15:42:05 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0ELg515093544 for ; Fri, 14 Jan 2011 15:42:05 -0600 Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0B0938F8087; Fri, 14 Jan 2011 13:44:17 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 81678431F74; Fri, 14 Jan 2011 15:43:34 -0600 (CST) Date: Fri, 14 Jan 2011 15:43:34 -0600 From: bpm@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110114214334.GN28274@sgi.com> References: <20110114002900.GF16267@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110114002900.GF16267@dastard> User-Agent: Mutt/1.5.18 (2008-05-17) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Dave, On Fri, Jan 14, 2011 at 11:29:00AM +1100, Dave Chinner wrote: > I've noticed a few suspicious things trying to reproduce the > allocate-in-the-middle-of-a-delalloc-extent, ... > Secondly, I think we have the same expose-the-entire-delalloc-extent > -to-stale-data-exposure problem in ->writepage. This onnne, however, > is due to using BMAPI_ENTIRE to allocate the entire delalloc extent > the first time any part of it is written to. Even if we are only > writing a single page (i.e. wbc->nr_to_write = 1) and the delalloc > extent covers gigabytes. So, same problem when we crash. > > Finally, I think the extsize based problem exposed by test 229 is a > also a result of allocating space we have no pages covering in the > page cache (triggered by BMAPI_ENTIRE allocation) so the allocated > space is never zeroed and hence exposes stale data. This is precisely the bug I was going after when I hit the allocate-in-the-middle-of-a-delalloc-extent bug. This is a race between block_prepare_write/__xfs_get_blocks and writepage/xfs_page_state convert. When xfs_page_state_convert allocates a real extent for a page toward the beginning of a delalloc extent, XFS_BMAPI converts the entire delalloc extent. Any subsequent writes into the page cache toward the end of this freshly allocated extent will see a written extent instead of delalloc and read the block from disk into the page before writing over it. If the write does not cover the entire page garbage from disk will be exposed into the page cache. > I'm sure there are other ways to solve these problems, but these two > are the ones that come to mind for me. I'm open to other solutions > or ways to improve on these ones, especially if they are simpler. ;) > Anyone got any ideas or improvements? The direction I've been taking is to use XFS_BMAPI_EXACT in *xfs_iomap_write_allocate to ensure that an extent covering exactly the pages we're prepared to write out immediately is allocated and the rest of the delalloc extent is left as is. This exercises some of the btree code more heavily and led to the discovery of the allocate-in-the-middle-of-a-delalloc-extent bug. It also presents a performance issue which I've tried to resolve by extending xfs_probe_cluster to probe delalloc extents-- lock up all of the pages to be converted before performing the allocation and hold those locks until they are submitted for writeback. It's not very pretty but it resolves the corruption. There is still the issue of crashes... This could be solved by converting from delalloc to unwritten in xfs_page_state_convert in this very exact way and then to written in the io completion handler. Never go delalloc->written directly. I have not had luck reproducing this on TOT xfs and have come to realize that this is because it doesn't do speculative preallocation of larger delalloc extents unless you are using extsize... which I haven't tried. Regards, Ben From aelder@oss.sgi.com Fri Jan 14 15:53:27 2011 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.7 required=5.0 tests=ALL_TRUSTED,BAYES_00, J_CHICKENPOX_51,J_CHICKENPOX_65 autolearn=no 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 p0ELrRc4095535 for ; Fri, 14 Jan 2011 15:53:27 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id p0ELrQNT095440; Fri, 14 Jan 2011 15:53:26 -0600 Date: Fri, 14 Jan 2011 15:53:26 -0600 Message-Id: <201101142153.p0ELrQNT095440@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-67-g73efe4a X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: d0eb2f38b250b7d6c993adf81b0e4ded0565497e X-Git-Newrev: 73efe4a4ddf8eb2b1cc7039e8a66a23a424961af 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 73efe4a xfs: prevent NMI timeouts in cmn_err 65a84a0 xfs: Add log level to assertion printk 1884bd8 xfs: fix an assignment within an ASSERT() bfc6017 xfs: fix error handling for synchronous writes a46db60 xfs: add FITRIM support c58efdb xfs: ensure log covering transactions are synchronous eda7798 xfs: serialise unaligned direct IOs 4d8d158 xfs: factor common write setup code 637bbc7 xfs: split buffered IO write path from xfs_file_aio_write f0d26e8 xfs: split direct IO write path from xfs_file_aio_write 487f84f xfs: introduce xfs_rw_lock() helpers for locking the inode 4c5cfd1 xfs: factor post-write newsize updates edafb6d xfs: factor common post-write isize handling code a363f0c xfs: ensure sync write errors are returned from d0eb2f38b250b7d6c993adf81b0e4ded0565497e (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 73efe4a4ddf8eb2b1cc7039e8a66a23a424961af Author: Dave Chinner Date: Wed Jan 12 00:35:42 2011 +0000 xfs: prevent NMI timeouts in cmn_err 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 Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 65a84a0f7567ea244e5246e642920260cfc2744a Author: Anton Blanchard Date: Fri Jan 7 03:30:41 2011 +0000 xfs: Add log level to assertion printk I received a ppc64 bug report involving xfs but the assertion was filtered out by the console log level. Use KERN_CRIT to ensure it makes it out. Signed-off-by: Anton Blanchard Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit 1884bd8354c9aec4ca501dc4773c13ad2a09af7b Author: Jesper Juhl Date: Sat Dec 25 20:14:53 2010 +0000 xfs: fix an assignment within an ASSERT() 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 Signed-off-by: Alex Elder commit bfc60177f8ab509bc225becbb58f7e53a0e33e81 Author: Christoph Hellwig Date: Fri Jan 7 13:02:23 2011 +0000 xfs: fix error handling for synchronous writes If we get an IO error on a synchronous superblock write, we attach an error release function to it so that when the last reference goes away the release function is called and the buffer is invalidated and unlocked. The buffer is left locked until the release function is called so that other concurrent users of the buffer will be locked out until the buffer error is fully processed. Unfortunately, for the superblock buffer the filesyetm itself holds a reference to the buffer which prevents the reference count from dropping to zero and the release function being called. As a result, once an IO error occurs on a sync write, the buffer will never be unlocked and all future attempts to lock the buffer will hang. To make matters worse, this problems is not unique to such buffers; if there is a concurrent _xfs_buf_find() running, the lookup will grab a reference to the buffer and then wait on the buffer lock, preventing the reference count from ever falling to zero and hence unlocking the buffer. As such, the whole b_relse function implementation is broken because it cannot rely on the buffer reference count falling to zero to unlock the errored buffer. The synchronous write error path is the only path that uses this callback - it is used to ensure that the synchronous waiter gets the buffer error before the error state is cleared from the buffer by the release function. Given that the only sychronous buffer writes now go through xfs_bwrite and the error path in question can only occur for a write of a dirty, logged buffer, we can move most of the b_relse processing to happen inline in xfs_buf_iodone_callbacks, just like a normal I/O completion. In addition to that we make sure the error is not cleared in xfs_buf_iodone_callbacks, so that xfs_bwrite can reliably check it. Given that xfs_bwrite keeps the buffer locked until it has waited for it and checked the error this allows to reliably propagate the error to the caller, and make sure that the buffer is reliably unlocked. Given that xfs_buf_iodone_callbacks was the only instance of the b_relse callback we can remove it entirely. Based on earlier patches by Dave Chinner and Ajeet Yadav. Signed-off-by: Christoph Hellwig Reported-by: Ajeet Yadav Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit a46db60834883c1c8c665d7fcc7b4ab66f5966fc Author: Christoph Hellwig Date: Fri Jan 7 13:02:04 2011 +0000 xfs: add FITRIM support 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 Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit c58efdb442bb49dea1d148f207560c41918c1bf4 Author: Dave Chinner Date: Tue Jan 4 04:49:29 2011 +0000 xfs: ensure log covering transactions are synchronous To ensure the log is covered and the filesystem idles correctly, we need to ensure that dummy transactions hit the disk and do not stay pinned in memory. If the superblock is pinned in memory, it can't be flushed so the log covering cannot make progress. The result is dependent on timing - more oftent han not we continue to issues a log covering transaction every 36s rather than idling after ~90s. Fix this by making the log covering transaction synchronous. To avoid additional log force from xfssyncd, make the log covering transaction take the place of the existing log force in the xfssyncd background sync process. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Alex Elder commit eda77982729b7170bdc9e8855f0682edf322d277 Author: Dave Chinner Date: Tue Jan 11 10:22:40 2011 +1100 xfs: serialise unaligned direct IOs 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 Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig commit 4d8d15812fd9bc96d0da11467d23e0373feae933 Author: Dave Chinner Date: Tue Jan 11 10:23:42 2011 +1100 xfs: factor common write setup code 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 Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig commit 637bbc75d9fda57c7bc77ce5ee37e29a77a0520d Author: Dave Chinner Date: Tue Jan 11 10:17:30 2011 +1100 xfs: split buffered IO write path from xfs_file_aio_write 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 Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig commit f0d26e860b6c496464c5c8165d7df08dabde01fa Author: Dave Chinner Date: Tue Jan 11 10:15:36 2011 +1100 xfs: split direct IO write path from xfs_file_aio_write 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. This also removes the failed direct IO fallback path to buffered IO. XFS handles all direct IO cases without needing to fall back to buffered IO, so we can safely remove this unused path. This greatly simplifies the logic and locking needed in the write path. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 487f84f3f80bc6f00c59725e822653d3ec174b85 Author: Dave Chinner Date: Wed Jan 12 11:37:10 2011 +1100 xfs: introduce xfs_rw_lock() helpers for locking the inode We need to obtain the i_mutex, i_iolock and i_ilock during the read and write paths. Add a set of wrapper functions to neatly encapsulate the lock ordering and shared/exclusive semantics to make the locking easier to follow and get right. Note that this changes some of the exclusive locking serialisation in that serialisation will occur against the i_mutex instead of the XFS_IOLOCK_EXCL. This does not change any behaviour, and it is arguably more efficient to use the mutex for such serialisation than the rw_sem. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 4c5cfd1b4157fb75d43b44a147c2feba6422fc4f Author: Dave Chinner Date: Tue Jan 11 10:14:16 2011 +1100 xfs: factor post-write newsize updates Signed-off-by: Dave Chinner Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig commit edafb6da9aa725e4de5fe758fe81644b6167f9a2 Author: Dave Chinner Date: Tue Jan 11 10:14:06 2011 +1100 xfs: factor common post-write isize handling code Signed-off-by: Dave Chinner Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig commit a363f0c2030cb9781e7e458f4a9e354b6c43d7ce Author: Dave Chinner Date: Tue Jan 11 10:13:53 2011 +1100 xfs: ensure sync write errors are returned 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 Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig ----------------------------------------------------------------------- Summary of changes: fs/xfs/Makefile | 1 + fs/xfs/linux-2.6/xfs_buf.c | 7 +- fs/xfs/linux-2.6/xfs_buf.h | 7 +- fs/xfs/linux-2.6/xfs_discard.c | 191 ++++++++++++++ fs/xfs/linux-2.6/xfs_discard.h | 8 + fs/xfs/linux-2.6/xfs_file.c | 535 +++++++++++++++++++++++----------------- fs/xfs/linux-2.6/xfs_ioctl.c | 3 + fs/xfs/linux-2.6/xfs_super.c | 2 +- fs/xfs/linux-2.6/xfs_sync.c | 11 +- fs/xfs/linux-2.6/xfs_sysctl.c | 23 ++- fs/xfs/linux-2.6/xfs_trace.h | 33 +++ fs/xfs/support/debug.c | 112 ++++----- fs/xfs/support/debug.h | 25 ++- fs/xfs/xfs_alloc.c | 10 +- fs/xfs/xfs_alloc.h | 25 ++- fs/xfs/xfs_buf_item.c | 151 ++++-------- fs/xfs/xfs_error.c | 31 --- fs/xfs/xfs_error.h | 18 +- fs/xfs/xfs_fsops.c | 10 +- fs/xfs/xfs_fsops.h | 2 +- fs/xfs/xfs_log.c | 2 +- fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_trans.c | 2 +- 23 files changed, 729 insertions(+), 482 deletions(-) create mode 100644 fs/xfs/linux-2.6/xfs_discard.c create mode 100644 fs/xfs/linux-2.6/xfs_discard.h hooks/post-receive -- XFS development tree From aelder@americas.sgi.com Fri Jan 14 15:56:21 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0ELuLiu096059 for ; Fri, 14 Jan 2011 15:56:21 -0600 Received: from alcatraz.americas.sgi.com (alcatraz.americas.sgi.com [128.162.236.70]) by relay3.corp.sgi.com (Postfix) with ESMTP id 084D4AC010; Fri, 14 Jan 2011 13:58:29 -0800 (PST) Received: from alcatraz.americas.sgi.com (localhost.localdomain [127.0.0.1]) by alcatraz.americas.sgi.com (8.13.8/8.12.10/erikj-RedHat-7.2-Eagan) with ESMTP id p0ELwTbY010871; Fri, 14 Jan 2011 15:58:29 -0600 Received: (from aelder@localhost) by alcatraz.americas.sgi.com (8.13.8/8.13.8/Submit) id p0ELwQG3010869; Fri, 14 Jan 2011 15:58:26 -0600 Date: Fri, 14 Jan 2011 15:58:26 -0600 From: Alex Elder Message-Id: <201101142158.p0ELwQG3010869@alcatraz.americas.sgi.com> To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update 2 for 2.6.38-rc1 Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com 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 additional changes to XFS for 2.6.38-rc1. Thanks. -Alex The following changes since commit 52cfd503ad7176d23a5dd7af3981744feb60622f: Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 (2011-01-13 20:15:35 -0800) are available in the git repository at: git://oss.sgi.com/xfs/xfs for-linus Anton Blanchard (1): xfs: Add log level to assertion printk Christoph Hellwig (2): xfs: add FITRIM support xfs: fix error handling for synchronous writes Dave Chinner (10): xfs: ensure sync write errors are returned xfs: factor common post-write isize handling code xfs: factor post-write newsize updates xfs: introduce xfs_rw_lock() helpers for locking the inode 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 xfs: ensure log covering transactions are synchronous xfs: prevent NMI timeouts in cmn_err Jesper Juhl (1): xfs: fix an assignment within an ASSERT() fs/xfs/Makefile | 1 + fs/xfs/linux-2.6/xfs_buf.c | 7 +- fs/xfs/linux-2.6/xfs_buf.h | 7 +- fs/xfs/linux-2.6/xfs_discard.c | 191 ++++++++++++++ fs/xfs/linux-2.6/xfs_discard.h | 8 + fs/xfs/linux-2.6/xfs_file.c | 535 +++++++++++++++++++++++----------------- fs/xfs/linux-2.6/xfs_ioctl.c | 3 + fs/xfs/linux-2.6/xfs_super.c | 2 +- fs/xfs/linux-2.6/xfs_sync.c | 11 +- fs/xfs/linux-2.6/xfs_sysctl.c | 23 ++- fs/xfs/linux-2.6/xfs_trace.h | 33 +++ fs/xfs/support/debug.c | 112 ++++----- fs/xfs/support/debug.h | 25 ++- fs/xfs/xfs_alloc.c | 10 +- fs/xfs/xfs_alloc.h | 25 ++- fs/xfs/xfs_buf_item.c | 151 ++++-------- fs/xfs/xfs_error.c | 31 --- fs/xfs/xfs_error.h | 18 +- fs/xfs/xfs_fsops.c | 10 +- fs/xfs/xfs_fsops.h | 2 +- fs/xfs/xfs_log.c | 2 +- fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_trans.c | 2 +- 23 files changed, 729 insertions(+), 482 deletions(-) create mode 100644 fs/xfs/linux-2.6/xfs_discard.c create mode 100644 fs/xfs/linux-2.6/xfs_discard.h From stan@hardwarefreak.com Fri Jan 14 16:00:14 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0EM0DjD096383 for ; Fri, 14 Jan 2011 16:00:14 -0600 X-ASG-Debug-ID: 1295042547-7f7803700000-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 E33301E9EE70 for ; Fri, 14 Jan 2011 14:02:28 -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 M6IDx8cTpE0hvVp2 for ; Fri, 14 Jan 2011 14:02:28 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 6D6A36C116 for ; Fri, 14 Jan 2011 16:02:27 -0600 (CST) Message-ID: <4D30C7F3.3040105@hardwarefreak.com> Date: Fri, 14 Jan 2011 16:02:27 -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: extremely slow write performance plaintext Subject: Re: extremely slow write performance plaintext References: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> <20110113233527.6dca104d@galadriel.home> <18993_1294964274_4D2F9632_18993_1387_1_F79CF9ADB27B2646B59221B7355263830CC143B1@NYL-EXCH1.HVHCVision.com> <4D30A945.4060000@hardwarefreak.com> <27616_1295038110_4D30B69E_27616_233_1_4D30B69E.4020506@davisvision.com> In-Reply-To: <27616_1295038110_4D30B69E_27616_233_1_4D30B69E.4020506@davisvision.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: 1295042548 X-Barracuda-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.52389 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 Cory Coager put forth on 1/14/2011 2:48 PM: > On 01/14/2011 02:51 PM, Stan Hoeppner wrote: >> Make sure the write cache on the P600 (what size is it BTW?) is enabled and that >> the BBU is in working order. Also make sure the P600 is disabling the write >> caches on the drives themselves. Then... >> > Write cache is enabled on the controller, the size is 512MB, BBU is in good > conditioned (checked with the HP utility). How do I check the write cache on > the drives? The controller should do this automatically. You'll have to check the docs to verify. This is to safeguard data. The BBWC protects unwritten data in the controller cache only, not the drives' caches. It won't negatively affect performance if the drives' caches are enabled. On the contrary, it would probably increase performance a bit. It's simply less safe having them enabled in the event of a crash. After rereading your original post I don't think there's any issue here anyway. You stated you have 24 drives in 2 arrays (although you didn't state if all the disks are on one P600 or two). >> Mount with 'nobarrier' so XFS isn't interfering with the hardware cache >> performance of the P600. With barriers enabled (the default) XFS will >> periodically flush the cache on the RAID card causing write performance problems. >> > Already using nobarrier. This was the important part I was looking for. It's apparently not a cache issue then, unless the utility is lying or querying the wrong controller or something. Nothing relevant in dmesg or any other logs? No errors of any kind? Does iostat reveal anything even slightly odd? I also just noticed you're testing writes with a 1k block size. That seems awefully small. Does the write throughput increase any when you test with a 4k/8k/16k block size? BTW, this is an old machine. PCI-X is dead. Did this slow write trouble just start recently? What has changed since it previously worked fine? You're making it very difficult to assist you by not providing basic troubleshooting information. I.e. What has changed since the system functioned properly? When did it change? Did it ever work properly? Etc. God I hate pulling teeth... :) -- Stan From SRS0+3r1K+48+fromorbit.com=david@internode.on.net Fri Jan 14 16:56:58 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0EMuvAD105401 for ; Fri, 14 Jan 2011 16:56:58 -0600 X-ASG-Debug-ID: 1295045950-221b01310000-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 ABAB2267ED7 for ; Fri, 14 Jan 2011 14:59: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 skzvp1tEa8d1dOwS for ; Fri, 14 Jan 2011 14:59:11 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 53297219-1927428 for multiple; Sat, 15 Jan 2011 09:29:09 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pdsbr-00078h-Vk; Sat, 15 Jan 2011 09:59:08 +1100 Date: Sat, 15 Jan 2011 09:59:07 +1100 From: Dave Chinner To: Geoffrey Wehrman Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110114225907.GH16267@dastard> References: <20110114002900.GF16267@dastard> <20110114164016.GB30134@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110114164016.GB30134@sgi.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: 1295045952 X-Barracuda-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.52393 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, Jan 14, 2011 at 10:40:16AM -0600, Geoffrey Wehrman wrote: > On Fri, Jan 14, 2011 at 11:29:00AM +1100, Dave Chinner wrote: > | This seems to be incorrect to me - a "wasdelay" extent has not yet > | been initialised - there's data in memory, but there is nothing on > | disk and we may not write it for some time. If we crash after this > | transaction is written but before any data is written, we expose > | stale data. > | > | Not only that, it allocates the _entire_ delalloc extent that spans > | the preallocation range, even when the preallocation range is only 1 > | block and the delalloc extent covers gigabytes. hence we actually > | expose a much greater range of the file to stale data exposure > | during a crash than just eh preallocated range. Not good. > | > | Secondly, I think we have the same expose-the-entire-delalloc-extent > | -to-stale-data-exposure problem in ->writepage. This onnne, however, > | is due to using BMAPI_ENTIRE to allocate the entire delalloc extent > | the first time any part of it is written to. Even if we are only > | writing a single page (i.e. wbc->nr_to_write = 1) and the delalloc > | extent covers gigabytes. So, same problem when we crash. > | > | Finally, I think the extsize based problem exposed by test 229 is a > | also a result of allocating space we have no pages covering in the > | page cache (triggered by BMAPI_ENTIRE allocation) so the allocated > | space is never zeroed and hence exposes stale data. > > There used to be an XFS_BMAPI_EXACT flag that wasn't ever used. What > would be the effects of re-creating this flag and using it in writepage > to prevent the expose-the-entire-delalloc-extent-to-stale-data-exposure > problem? This wouldn't solve the exposure of stale data for a crash > that occurs after the extent conversion but before the data is written > out. The quantity of data exposed is potentially much smaller however. Definitely a possibility, Geoffrey, and not one that I thought of. I agree that it would significantly minimise the amount of stale data exposed on a crash, but there does seem to be some down sides. Ben has already pointed out the increased cost of allocations, and I can also think of a couple of others: - I'm not sure it's the right solution to the extsize issue because it will prevent extent size and aligned allocations from ocurring, which is exactly what extsize is supposed to provide. I'm also not sure it would work with the realtime device as all allocation has to be at least rtextent_size sized and aligned rather than page boundary. I need to check how the rt allocation code handles sub-rtextent size writes - that may point to the solution for the general case here. - I think that using XFS_BMAPI_EXACT semantic will possibly make the speculative EOF preallocation worthless. Delayed allocation conversion will never convert the speculative delalloc preallocation into real extents (beyond EOF) and we'll see increased fragementation in many common workloads due to that.... > Also, I'm not saying using XFS_BMAPI_EXACT is feasable. I have a very > minimal understanding of the writepage code path. I think there are situations where this does make sense, but given the potential issues I'm not sure it is a solution that can be extended to the general case. A good discussion point on a different angle, though. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Fri Jan 14 17:30:57 2011 X-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_35, 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 p0ENUvf3110831 for ; Fri, 14 Jan 2011 17:30:57 -0600 Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 01A5B30404E; Fri, 14 Jan 2011 15:33:09 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 93B11431F74; Fri, 14 Jan 2011 17:32:26 -0600 (CST) Date: Fri, 14 Jan 2011 17:32:26 -0600 From: bpm@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110114233226.GO28274@sgi.com> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110114214334.GN28274@sgi.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Dave, On Fri, Jan 14, 2011 at 03:43:34PM -0600, bpm@sgi.com wrote: > On Fri, Jan 14, 2011 at 11:29:00AM +1100, Dave Chinner wrote: > > I'm sure there are other ways to solve these problems, but these two > > are the ones that come to mind for me. I'm open to other solutions > > or ways to improve on these ones, especially if they are simpler. ;) > > Anyone got any ideas or improvements? > > The direction I've been taking is to use XFS_BMAPI_EXACT in > *xfs_iomap_write_allocate to ensure that an extent covering exactly the > pages we're prepared to write out immediately is allocated and the rest > of the delalloc extent is left as is. This exercises some of the btree > code more heavily and led to the discovery of the > allocate-in-the-middle-of-a-delalloc-extent bug. It also presents a > performance issue which I've tried to resolve by extending > xfs_probe_cluster to probe delalloc extents-- lock up all of the pages > to be converted before performing the allocation and hold those locks > until they are submitted for writeback. It's not very pretty but it > resolves the corruption. Here's the xfs_page_state_convert side of the patch so you can get an idea what am trying for, and how ugly it is. ;^) I have not ported the xfs_iomap_write_allocate bits yet. It is against an older version of xfs... but you get the idea. -Ben Index: sles11-src/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- sles11-src.orig/fs/xfs/linux-2.6/xfs_aops.c +++ sles11-src/fs/xfs/linux-2.6/xfs_aops.c @@ -585,41 +585,61 @@ STATIC unsigned int xfs_probe_page( struct page *page, unsigned int pg_offset, - int mapped) + int mapped, + unsigned int type, + int *entire) { + struct buffer_head *bh, *head; int ret = 0; if (PageWriteback(page)) return 0; + if (!page->mapping) + return 0; + if (!PageDirty(page)) + return 0; + if (!page_has_buffers(page)) + return 0; - if (page->mapping && PageDirty(page)) { - if (page_has_buffers(page)) { - struct buffer_head *bh, *head; - - bh = head = page_buffers(page); - do { - if (!buffer_uptodate(bh)) - break; - if (mapped != buffer_mapped(bh)) - break; - ret += bh->b_size; - if (ret >= pg_offset) - break; - } while ((bh = bh->b_this_page) != head); - } else - ret = mapped ? 0 : PAGE_CACHE_SIZE; - } + *entire = 0; + bh = head = page_buffers(page); + do { + if (!buffer_uptodate(bh)) + break; + if (buffer_mapped(bh) != mapped) + break; + if (type == IOMAP_UNWRITTEN && !buffer_unwritten(bh)) + break; + if (type == IOMAP_DELAY && !buffer_delay(bh)) + break; + if (type == IOMAP_NEW && !buffer_dirty(bh)) + break; + + ret += bh->b_size; + + if (ret >= pg_offset) + break; + } while ((bh = bh->b_this_page) != head); + + if (bh == head) + *entire = 1; return ret; } +#define MAX_WRITEBACK_PAGES 1024 + STATIC size_t xfs_probe_cluster( struct inode *inode, struct page *startpage, struct buffer_head *bh, struct buffer_head *head, - int mapped) + int mapped, + unsigned int type, + struct page **pages, + int *pagecount, + struct writeback_control *wbc) { struct pagevec pvec; pgoff_t tindex, tlast, tloff; @@ -628,8 +648,15 @@ xfs_probe_cluster( /* First sum forwards in this page */ do { - if (!buffer_uptodate(bh) || (mapped != buffer_mapped(bh))) + if (!buffer_uptodate(bh) || (mapped != buffer_mapped(bh))) { + return total; + } else if (type == IOMAP_UNWRITTEN && !buffer_unwritten(bh)) { return total; + } else if (type == IOMAP_DELAY && !buffer_delay(bh)) { + return total; + } else if (type == IOMAP_NEW && !buffer_dirty(bh)) { + return total; + } total += bh->b_size; } while ((bh = bh->b_this_page) != head); @@ -637,8 +664,9 @@ xfs_probe_cluster( 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); + /* Prune this back to avoid pathological behavior, subtract 1 for the + * first page. */ + tloff = min(tlast, startpage->index + (pgoff_t)MAX_WRITEBACK_PAGES); pagevec_init(&pvec, 0); while (!done && tindex <= tloff) { @@ -647,10 +675,10 @@ xfs_probe_cluster( if (!pagevec_lookup(&pvec, inode->i_mapping, tindex, len)) break; - for (i = 0; i < pagevec_count(&pvec); i++) { + for (i = 0; i < pagevec_count(&pvec) && !done; i++) { struct page *page = pvec.pages[i]; size_t pg_offset, pg_len = 0; - + int entire = 0; if (tindex == tlast) { pg_offset = i_size_read(inode) & (PAGE_CACHE_SIZE - 1); @@ -658,20 +686,39 @@ xfs_probe_cluster( done = 1; break; } - } else + } else { pg_offset = PAGE_CACHE_SIZE; - - if (page->index == tindex && trylock_page(page)) { - pg_len = xfs_probe_page(page, pg_offset, mapped); - unlock_page(page); } + if (page->index == tindex && + *pagecount < MAX_WRITEBACK_PAGES - 1 && + trylock_page(page)) { + pg_len = xfs_probe_page(page, pg_offset, + mapped, type, &entire); + if (pg_len) { + pages[(*pagecount)++] = page; + + } else { + unlock_page(page); + } + } if (!pg_len) { done = 1; break; } total += pg_len; + + /* + * if probe did not succeed on all buffers in the page + * we don't want to probe subsequent pages. This + * ensures that we don't have a mix of buffer types in + * the iomap. + */ + if (!entire) { + done = 1; + break; + } tindex++; } @@ -683,56 +730,19 @@ xfs_probe_cluster( } /* - * Test if a given page is suitable for writing as part of an unwritten - * or delayed allocate extent. - */ -STATIC int -xfs_is_delayed_page( - struct page *page, - unsigned int type) -{ - if (PageWriteback(page)) - return 0; - - if (page->mapping && page_has_buffers(page)) { - struct buffer_head *bh, *head; - int acceptable = 0; - - bh = head = page_buffers(page); - do { - if (buffer_unwritten(bh)) - acceptable = (type == IOMAP_UNWRITTEN); - else if (buffer_delay(bh)) - acceptable = (type == IOMAP_DELAY); - else if (buffer_dirty(bh) && buffer_mapped(bh)) - acceptable = (type == IOMAP_NEW); - else - break; - } while ((bh = bh->b_this_page) != head); - - if (acceptable) - return 1; - } - - return 0; -} - -/* * Allocate & map buffers for page given the extent map. Write it out. * except for the original page of a writepage, this is called on * delalloc/unwritten pages only, for the original page it is possible * that the page has no mapping at all. */ -STATIC int +STATIC void xfs_convert_page( struct inode *inode, struct page *page, - loff_t tindex, xfs_iomap_t *mp, xfs_ioend_t **ioendp, struct writeback_control *wbc, - int startio, - int all_bh) + int startio) { struct buffer_head *bh, *head; xfs_off_t end_offset; @@ -740,20 +750,9 @@ xfs_convert_page( unsigned int type; int bbits = inode->i_blkbits; int len, page_dirty; - int count = 0, done = 0, uptodate = 1; + int count = 0, uptodate = 1; xfs_off_t offset = page_offset(page); - if (page->index != tindex) - goto fail; - if (! trylock_page(page)) - goto fail; - if (PageWriteback(page)) - goto fail_unlock_page; - if (page->mapping != inode->i_mapping) - goto fail_unlock_page; - if (!xfs_is_delayed_page(page, (*ioendp)->io_type)) - goto fail_unlock_page; - /* * page_dirty is initially a count of buffers on the page before * EOF and is decremented as we move each into a cleanable state. @@ -770,6 +769,8 @@ xfs_convert_page( end_offset = min_t(unsigned long long, (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT, i_size_read(inode)); + end_offset = min_t(unsigned long long, end_offset, + (mp->iomap_offset + mp->iomap_bsize)); len = 1 << inode->i_blkbits; p_offset = min_t(unsigned long, end_offset & (PAGE_CACHE_SIZE - 1), @@ -779,12 +780,12 @@ xfs_convert_page( bh = head = page_buffers(page); do { - if (offset >= end_offset) + if (offset >= end_offset) { break; + } if (!buffer_uptodate(bh)) uptodate = 0; if (!(PageUptodate(page) || buffer_uptodate(bh))) { - done = 1; continue; } @@ -794,10 +795,7 @@ xfs_convert_page( else type = IOMAP_DELAY; - if (!xfs_iomap_valid(mp, offset)) { - done = 1; - continue; - } + BUG_ON(!xfs_iomap_valid(mp, offset)); ASSERT(!(mp->iomap_flags & IOMAP_HOLE)); ASSERT(!(mp->iomap_flags & IOMAP_DELAY)); @@ -805,7 +803,7 @@ xfs_convert_page( xfs_map_at_offset(bh, offset, bbits, mp); if (startio) { xfs_add_to_ioend(inode, bh, offset, - type, ioendp, done); + type, ioendp, 0 /* !done */); } else { set_buffer_dirty(bh); unlock_buffer(bh); @@ -814,15 +812,14 @@ xfs_convert_page( page_dirty--; count++; } else { + WARN_ON(!xfs_iomap_valid(mp, offset)); type = IOMAP_NEW; - if (buffer_mapped(bh) && all_bh && startio) { + if (buffer_mapped(bh) && buffer_dirty(bh) && startio) { lock_buffer(bh); xfs_add_to_ioend(inode, bh, offset, - type, ioendp, done); + type, ioendp, 0 /* !done */); count++; page_dirty--; - } else { - done = 1; } } } while (offset += len, (bh = bh->b_this_page) != head); @@ -838,19 +835,16 @@ xfs_convert_page( wbc->nr_to_write--; if (bdi_write_congested(bdi)) { wbc->encountered_congestion = 1; - done = 1; } else if (wbc->nr_to_write <= 0) { - done = 1; + /* XXX ignore nr_to_write + done = 1; */ } } + /* unlocks page */ xfs_start_page_writeback(page, wbc, !page_dirty, count); + } else { + unlock_page(page); } - - return done; - fail_unlock_page: - unlock_page(page); - fail: - return 1; } /* @@ -860,33 +854,17 @@ xfs_convert_page( STATIC void xfs_cluster_write( struct inode *inode, - pgoff_t tindex, + struct page **pages, + int pagecount, xfs_iomap_t *iomapp, xfs_ioend_t **ioendp, struct writeback_control *wbc, - int startio, - int all_bh, - pgoff_t tlast) + int startio) { - struct pagevec pvec; - int done = 0, i; - - pagevec_init(&pvec, 0); - while (!done && tindex <= tlast) { - 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++) { - done = xfs_convert_page(inode, pvec.pages[i], tindex++, - iomapp, ioendp, wbc, startio, all_bh); - if (done) - break; - } + int i; - pagevec_release(&pvec); - cond_resched(); + for (i = 0; i < pagecount; i++) { + xfs_convert_page(inode, pages[i], iomapp, ioendp, wbc, startio); } } @@ -908,7 +886,6 @@ xfs_cluster_write( * bh->b_states's will not agree and only ones setup by BPW/BCW will have * valid state, thus the whole page must be written out thing. */ - STATIC int xfs_page_state_convert( struct inode *inode, @@ -924,12 +901,13 @@ xfs_page_state_convert( unsigned long p_offset = 0; unsigned int type; __uint64_t end_offset; - pgoff_t end_index, last_index, tlast; + pgoff_t end_index, last_index; ssize_t size, len; int flags, err, iomap_valid = 0, uptodate = 1; int page_dirty, count = 0; int trylock = 0; - int all_bh = unmapped; + struct page **pages; + int pagecount = 0, i; if (startio) { if (wbc->sync_mode == WB_SYNC_NONE && wbc->nonblocking) @@ -949,6 +927,9 @@ xfs_page_state_convert( } } + pages = kmem_zalloc(sizeof(struct page*) * MAX_WRITEBACK_PAGES, KM_NOFS); + + /* * page_dirty is initially a count of buffers on the page before * EOF and is decremented as we move each into a cleanable state. @@ -1036,14 +1017,23 @@ xfs_page_state_convert( * for unwritten extent conversion. */ new_ioend = 1; - if (type == IOMAP_NEW) { - size = xfs_probe_cluster(inode, - page, bh, head, 0); - } else { - size = len; + size = 0; + if (type == IOMAP_NEW && !pagecount) { + size = xfs_probe_cluster(inode, page, + bh, head, + 0 /* !mapped */, type, + pages, &pagecount, wbc); + } else if ((type == IOMAP_DELAY || + type == IOMAP_UNWRITTEN) && + !pagecount) { + size = xfs_probe_cluster(inode, page, + bh, head, + 1 /* mapped */, type, + pages, &pagecount, wbc); } - err = xfs_map_blocks(inode, offset, size, + err = xfs_map_blocks(inode, offset, + size ? size : len, &iomap, flags); if (err) goto error; @@ -1072,9 +1062,16 @@ xfs_page_state_convert( */ if (!iomap_valid || flags != BMAPI_READ) { flags = BMAPI_READ; - size = xfs_probe_cluster(inode, page, bh, - head, 1); - err = xfs_map_blocks(inode, offset, size, + size = 0; + if (!pagecount) { + size = xfs_probe_cluster(inode, page, + bh, head, + 1 /* mapped */, + IOMAP_NEW, + pages, &pagecount, wbc); + } + err = xfs_map_blocks(inode, offset, + size ? size : len, &iomap, flags); if (err) goto error; @@ -1092,8 +1089,6 @@ xfs_page_state_convert( type = IOMAP_NEW; if (!test_and_set_bit(BH_Lock, &bh->b_state)) { ASSERT(buffer_mapped(bh)); - if (iomap_valid) - all_bh = 1; xfs_add_to_ioend(inode, bh, offset, type, &ioend, !iomap_valid); page_dirty--; @@ -1104,6 +1099,8 @@ xfs_page_state_convert( } else if ((buffer_uptodate(bh) || PageUptodate(page)) && (unmapped || startio)) { iomap_valid = 0; + } else { + WARN_ON(1); } if (!iohead) @@ -1117,13 +1114,11 @@ xfs_page_state_convert( if (startio) xfs_start_page_writeback(page, wbc, 1, count); - if (ioend && iomap_valid) { - offset = (iomap.iomap_offset + iomap.iomap_bsize - 1) >> - PAGE_CACHE_SHIFT; - tlast = min_t(pgoff_t, offset, last_index); - xfs_cluster_write(inode, page->index + 1, &iomap, &ioend, - wbc, startio, all_bh, tlast); + if (ioend && iomap_valid && pagecount) { + xfs_cluster_write(inode, pages, pagecount, &iomap, &ioend, + wbc, startio); } + kmem_free(pages, sizeof(struct page *) * MAX_WRITEBACK_PAGES); if (iohead) xfs_submit_ioend(iohead); @@ -1133,7 +1128,12 @@ xfs_page_state_convert( error: if (iohead) xfs_cancel_ioend(iohead); - + if (pages) { + for (i = 0; i < pagecount; i++) { + unlock_page(pages[i]); + } + kmem_free(pages, sizeof(struct page *) * MAX_WRITEBACK_PAGES); + } return err; } From bpm@sgi.com Fri Jan 14 17:49:30 2011 X-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_42, J_CHICKENPOX_43,J_CHICKENPOX_48,J_CHICKENPOX_52 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 p0ENnUVO114021 for ; Fri, 14 Jan 2011 17:49:30 -0600 Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 299148F809B; Fri, 14 Jan 2011 15:51:40 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id CDC7C431F74; Fri, 14 Jan 2011 17:50:56 -0600 (CST) Date: Fri, 14 Jan 2011 17:50:56 -0600 From: bpm@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110114235056.GP28274@sgi.com> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110114214334.GN28274@sgi.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Jan 14, 2011 at 03:43:34PM -0600, bpm@sgi.com wrote: > On Fri, Jan 14, 2011 at 11:29:00AM +1100, Dave Chinner wrote: > > I've noticed a few suspicious things trying to reproduce the > > allocate-in-the-middle-of-a-delalloc-extent, > ... > > Secondly, I think we have the same expose-the-entire-delalloc-extent > > -to-stale-data-exposure problem in ->writepage. This onnne, however, > > is due to using BMAPI_ENTIRE to allocate the entire delalloc extent > > the first time any part of it is written to. Even if we are only > > writing a single page (i.e. wbc->nr_to_write = 1) and the delalloc > > extent covers gigabytes. So, same problem when we crash. > > > > Finally, I think the extsize based problem exposed by test 229 is a > > also a result of allocating space we have no pages covering in the > > page cache (triggered by BMAPI_ENTIRE allocation) so the allocated > > space is never zeroed and hence exposes stale data. > > This is precisely the bug I was going after when I hit the > allocate-in-the-middle-of-a-delalloc-extent bug. This is a race between > block_prepare_write/__xfs_get_blocks and writepage/xfs_page_state > convert. When xfs_page_state_convert allocates a real extent for a page > toward the beginning of a delalloc extent, XFS_BMAPI converts the entire > delalloc extent. Any subsequent writes into the page cache toward the > end of this freshly allocated extent will see a written extent instead > of delalloc and read the block from disk into the page before writing > over it. If the write does not cover the entire page garbage from disk > will be exposed into the page cache. Here is a test case to reproduce the corruption. I have only been able to reproduce it by writing the file on an nfs client served from xfs that is allocating large delalloc extents. -Ben *** the writer #include #include #include #include int main(int argc, char *argv[]) { char *filename = argv[1]; off_t seekdist = 3071; /* less than a page, nice and odd */ off_t max_offset = 1024 * 1024 * 1024; /* 1 gig */ off_t current_offset = 0; char buf[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"; int fd; printf("writing to %s\n", filename); printf("strlen is %d\n", strlen(buf)); fd = open(filename, O_RDWR|O_CREAT, 0644); if (fd == -1) { perror(filename); return -1; } while ((current_offset = lseek(fd, seekdist, SEEK_END)) > 0 && current_offset < max_offset) { if (write(fd, &buf, strlen(buf)) < strlen(buf)) { perror("write 'a'"); return -1; } } close(fd); } *** the reader #include #include #include #include int main(int argc, char *argv[]) { char *filename = argv[1]; off_t seekdist = 3071; /* less than a page, nice and odd */ off_t max_offset = 1024 * 1024 * 1024; /* 1 gig */ off_t current_offset = 0; char buf[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"; char readbuf[4096]; int fd, i; printf("reading from %s\n", filename); fd = open(filename, O_RDONLY, 0644); if (fd == -1) { perror(filename); return -1; } while (current_offset < max_offset) { ssize_t nread = read(fd, &readbuf, seekdist); if (nread != seekdist) { perror("read nulls"); return -1; } for (i=0; i < seekdist; i++) { if (readbuf[i] != '\0') { printf("foudn non-null at %d\n%s\n", current_offset + i, &readbuf[i]); break; // return -1; } } current_offset += nread; nread = read(fd, &readbuf, strlen(buf)); if (nread != strlen(buf)) { perror("read a"); return -1; } if (strncmp(readbuf, buf, strlen(buf))) { printf("didn't match at %d\n%s\n", current_offset + nread, readbuf); // return -1; } current_offset += nread; } close(fd); } From SRS0+hMks+48+fromorbit.com=david@internode.on.net Fri Jan 14 17:53:39 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ENrdQI114875 for ; Fri, 14 Jan 2011 17:53:39 -0600 X-ASG-Debug-ID: 1295049352-4f1d01190000-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 411E4154159D for ; Fri, 14 Jan 2011 15:55:53 -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 DMMcYUMEnopHlezJ for ; Fri, 14 Jan 2011 15:55:53 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52256827-1927428 for multiple; Sat, 15 Jan 2011 10:25:51 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PdtUj-0007Es-Vi; Sat, 15 Jan 2011 10:55:50 +1100 Date: Sat, 15 Jan 2011 10:55:49 +1100 From: Dave Chinner To: bpm@sgi.com Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110114235549.GI16267@dastard> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110114214334.GN28274@sgi.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: 1295049354 X-Barracuda-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.52395 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, Jan 14, 2011 at 03:43:34PM -0600, bpm@sgi.com wrote: > Hi Dave, > > On Fri, Jan 14, 2011 at 11:29:00AM +1100, Dave Chinner wrote: > > I've noticed a few suspicious things trying to reproduce the > > allocate-in-the-middle-of-a-delalloc-extent, > ... > > Secondly, I think we have the same expose-the-entire-delalloc-extent > > -to-stale-data-exposure problem in ->writepage. This onnne, however, > > is due to using BMAPI_ENTIRE to allocate the entire delalloc extent > > the first time any part of it is written to. Even if we are only > > writing a single page (i.e. wbc->nr_to_write = 1) and the delalloc > > extent covers gigabytes. So, same problem when we crash. > > > > Finally, I think the extsize based problem exposed by test 229 is a > > also a result of allocating space we have no pages covering in the > > page cache (triggered by BMAPI_ENTIRE allocation) so the allocated > > space is never zeroed and hence exposes stale data. > > This is precisely the bug I was going after when I hit the > allocate-in-the-middle-of-a-delalloc-extent bug. This is a race between > block_prepare_write/__xfs_get_blocks and writepage/xfs_page_state > convert. When xfs_page_state_convert allocates a real extent for a page > toward the beginning of a delalloc extent, XFS_BMAPI converts the entire > delalloc extent. Any subsequent writes into the page cache toward the > end of this freshly allocated extent will see a written extent instead > of delalloc and read the block from disk into the page before writing > over it. If the write does not cover the entire page garbage from disk > will be exposed into the page cache. I see from later on you are getting this state fom using a large extsize. Perhaps this comes back to my comment about extsize alignment might be better handled at the .aio_write level rather than hiding inside the get_block() callback and attempting to handle the mismatch at the .writepage level. Worth noting, though, is that DIO handles extsize unaligned writes by allocating unwritten extsize sized/aligned extents an then doing conversion at IO completion time. So perhaps we should be following this example for delalloc conversion.... I think, however, if we use delalloc->unwritten allocation, we will need to stop trusting the state of buffer heads in .writepage. That is because we'd then have blocks marked as buffer_delay() that really cover unwritten extents and would need remapping. We're already moving in the direction of not using the state in buffer heads in ->writepage, so perhaps we need to speed up that conversion as the first. Christoph, what are you plans here? > > > > I'm sure there are other ways to solve these problems, but these two > > are the ones that come to mind for me. I'm open to other solutions > > or ways to improve on these ones, especially if they are simpler. ;) > > Anyone got any ideas or improvements? > > The direction I've been taking is to use XFS_BMAPI_EXACT in > *xfs_iomap_write_allocate to ensure that an extent covering exactly the > pages we're prepared to write out immediately is allocated and the rest > of the delalloc extent is left as is. This exercises some of the btree > code more heavily and led to the discovery of the > allocate-in-the-middle-of-a-delalloc-extent bug. Yup, that explains it ;) > It also presents a > performance issue which I've tried to resolve by extending > xfs_probe_cluster to probe delalloc extents-- lock up all of the pages > to be converted before performing the allocation and hold those locks > until they are submitted for writeback. It's not very pretty but it > resolves the corruption. If we zero the relevant range in the page cache at .aio_write level like we do with xfs_zero_eof or allocate unwritten extents instead, then I don't think that you need to make changes like this. > There is still the issue of crashes... This could be solved by > converting from delalloc to unwritten in xfs_page_state_convert in this > very exact way and then to written in the io completion handler. Never > go delalloc->written directly. > > I have not had luck reproducing this on TOT xfs and have come to realize > that this is because it doesn't do speculative preallocation of larger > delalloc extents unless you are using extsize... which I haven't tried. Have a look at the dynamic speculative allocation patches that just went into 2.6.38 - I'm very interested to know whether your tests expose stale data now that it can do up to an entire extent (8GB on 4k block size) of speculative delalloc for writes that are extending the file. Cheers, Dave. -- Dave Chinner david@fromorbit.com From gwehrman@sgi.com Fri Jan 14 22:14:17 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0F4EHBI155098 for ; Fri, 14 Jan 2011 22:14:17 -0600 Received: from goalpost.americas.sgi.com (goalpost.americas.sgi.com [128.162.232.54]) by relay1.corp.sgi.com (Postfix) with ESMTP id 543598F807A; Fri, 14 Jan 2011 20:16:29 -0800 (PST) Received: by goalpost.americas.sgi.com (Postfix, from userid 14442) id C14022701B; Fri, 14 Jan 2011 22:16:29 -0600 (CST) Date: Fri, 14 Jan 2011 22:16:29 -0600 From: Geoffrey Wehrman To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110115041629.GC11968@sgi.com> References: <20110114002900.GF16267@dastard> <20110114164016.GB30134@sgi.com> <20110114225907.GH16267@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110114225907.GH16267@dastard> User-Agent: Mutt/1.5.14 (2007-02-12) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Jan 15, 2011 at 09:59:07AM +1100, Dave Chinner wrote: | On Fri, Jan 14, 2011 at 10:40:16AM -0600, Geoffrey Wehrman wrote: | > Also, I'm not saying using XFS_BMAPI_EXACT is feasible. I have a very | > minimal understanding of the writepage code path. | | I think there are situations where this does make sense, but given | the potential issues I'm not sure it is a solution that can be | extended to the general case. A good discussion point on a different | angle, though. ;) You've convinced me that XFS_BMAPI_EXACT is not the optimal solution. Upon further consideration, I do like your proposal to make delalloc allocation more like an intent/done type operation. The compatibility issues aren't all that bad. As long as the filesystem is unmounted clean, there is no need for the next mount do log recovery and therefore no need to have any knowledge of the new transactions. -- Geoffrey Wehrman 651-683-5496 gwehrman@sgi.com From SRS0+K6gO+49+fromorbit.com=david@internode.on.net Fri Jan 14 22:36:47 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0F4akXA159735 for ; Fri, 14 Jan 2011 22:36:46 -0600 X-ASG-Debug-ID: 1295066338-4f6a03dc0000-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 8B2C910007D5 for ; Fri, 14 Jan 2011 20:38:59 -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 p3F4Hh3niBaPSfRP for ; Fri, 14 Jan 2011 20:38:59 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52781286-1927428 for multiple; Sat, 15 Jan 2011 15:08:58 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pdxui-0007bF-N4; Sat, 15 Jan 2011 15:38:56 +1100 Date: Sat, 15 Jan 2011 15:38:56 +1100 From: Dave Chinner To: karn@ka9q.net Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: fallocate everywhere? Subject: Re: fallocate everywhere? Message-ID: <20110115043856.GJ16267@dastard> References: <4D309390.4060009@philkarn.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D309390.4060009@philkarn.net> 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: 1295066341 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0202 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.52411 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, Jan 14, 2011 at 10:18:56AM -0800, Phil Karn wrote: > Can anyone think of a good reason *not* to sprinkle fallocate() calls > through as many Linux utilities as possible? E.g., programs like rsync, > tar, cpio, pax, ftp, mv, cp -- anything and everything that creates a > file with a size known in advance. Yes. It defeats one of the principle optimisations delayed allocation provides: allocation of contiguous ranges of disk across multiple files at writeout time. If you fallocate, you might allocate like this: +----------+---------+---------+----------+----------+ file A file B file C file D file E But if writeback order is different and the block device queues are congested, you might end up with IO patterns like: Time | +----------+ | +---------+ | +----------+ | +---------+ V +----------+ file A file B file C file D file E That is, there's the potential for 5 separate IOs to write back the data because they may not have an adjacent IO to merge with. If the queue is congested, this this will simply make things worse. If the same situation occurs with delayed allocation, you end up with: +----------+---------+---------+----------+----------+ file A file C file E file B file D as the allocation pattern, and the block layer would merge the IOs into one large IO.... > As far as I can tell, calling fallocate() when it's not supported > quickly returns an error and does no harm. So I can't even think of a > reason to only make it optional. I can. It fails the "optimise allocation for optimal writeback patterns" test. In most cases preallocation is not necessary because filesystems do a good job of this. The filesystems that don't do a good job of this don't implement fallocate() anyway, so adding fallocate to the userspace tools doesn't really help the filesystems that need help to begin with... > If it's implemented as an > off-by-default option, most people would probably not know about it so > it would rarely get used. Those who do know about it would frequently > forget to use it, and choosing and learning a separate option for every > command would be painful. > > Besides xfs, ext4 supports fallocate so I expect that most Linux systems > will be able to benefit from it fairly soon. Proper fallocate support requires a method for recording on disk whether the block/extent is initialised or not. Most filesystems don't have this, nor will they implement it, so they won't grow fallocate support. And like I said, filesytems like ext4, xfs and btrfs don't need fallocate help for stuff like tar/rsync etc. If you really want to make stuff like cp/tar/ftp/find better, maybe addressing the bigger problems that limit their throughput - they are single threaded and aren't very smart. Updating them to be multithreaded, use async IO, large buffers, use sparse file/hole detection by default, use sendfile/splice tricks for zero-copy IO, etc would be, IMO, more useful for the long term..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From geert@linux-m68k.org Sun Jan 16 07:12:13 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0GDCDcE129778 for ; Sun, 16 Jan 2011 07:12:13 -0600 X-ASG-Debug-ID: 1295183667-63c602e90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from gerard.telenet-ops.be (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 174FA26B5BC for ; Sun, 16 Jan 2011 05:14:28 -0800 (PST) Received: from gerard.telenet-ops.be (gerard.telenet-ops.be [195.130.132.48]) by cuda.sgi.com with ESMTP id XU1dODrH8YuToCB1 for ; Sun, 16 Jan 2011 05:14:28 -0800 (PST) Received: from ayla.of.borg ([84.193.80.148]) by gerard.telenet-ops.be with bizsmtp id wDES1f00W3C005g0HDES6b; Sun, 16 Jan 2011 14:14:27 +0100 Received: from geert (helo=localhost) by ayla.of.borg with local-esmtp (Exim 4.71) (envelope-from ) id 1PeSR7-0006Ol-QK; Sun, 16 Jan 2011 14:14:25 +0100 Date: Sun, 16 Jan 2011 14:14:25 +0100 (CET) From: Geert Uytterhoeven Sender: geert@linux-m68k.org To: Dave Chinner , Alex Elder , Christoph Hellwig cc: xfs@oss.sgi.com, Linux Kernel Development , linux-arch@vger.kernel.org X-ASG-Orig-Subj: [PATCH] xfs: Do not name variables "panic" Subject: [PATCH] xfs: Do not name variables "panic" Message-ID: User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=ISO-8859-7 Content-Transfer-Encoding: QUOTED-PRINTABLE X-Barracuda-Connect: gerard.telenet-ops.be[195.130.132.48] X-Barracuda-Start-Time: 1295183669 X-Barracuda-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.52540 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 platforms that call panic() inside their BUG() macro (m68k/sun3, and all platforms that don't set HAVE_ARCH_BUG), compilation fails with: | fs/xfs/support/debug.c: In function =A1xfs_cmn_err=A2: | fs/xfs/support/debug.c:92: error: called object =A1panic=A2 is not a func= tion as the local variable "panic" conflicts with the "panic()" function. Rename the local variable to resolve this. Signed-off-by: Geert Uytterhoeven --- m68k/sun3: http://kisskb.ellerman.id.au/kisskb/buildresult/3779006/ None of the !HAVE_ARCH_BUG archs (h8300, m32r, m68knommu, microblaze, score= , tile, xtensa) seems to be covered by linux-next fs/xfs/support/debug.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/xfs/support/debug.c b/fs/xfs/support/debug.c index e6cf955..0df8889 100644 --- a/fs/xfs/support/debug.c +++ b/fs/xfs/support/debug.c @@ -75,11 +75,11 @@ xfs_cmn_err( { =09struct va_format=09vaf; =09va_list=09=09=09args; -=09int=09=09=09panic =3D 0; +=09int=09=09=09do_panic =3D 0; =20 =09if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) { =09=09printk(KERN_ALERT "XFS: Transforming an alert into a BUG."); -=09=09panic =3D 1; +=09=09do_panic =3D 1; =09} =20 =09va_start(args, fmt); @@ -89,7 +89,7 @@ xfs_cmn_err( =09printk(KERN_ALERT "Filesystem %s: %pV", mp->m_fsname, &vaf); =09va_end(args); =20 -=09BUG_ON(panic); +=09BUG_ON(do_panic); } =20 void --=20 1.7.0.4 Gr{oetje,eeting}s, =09=09=09=09=09=09Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k= =2Eorg In personal conversations with technical people, I call myself a hacker. Bu= t when I'm talking to journalists I just say "programmer" or something like t= hat. =09=09=09=09=09=09=09 -- Linus Torvalds From lmcilroy@redhat.com Sun Jan 16 18:26:18 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0H0QIZt205336 for ; Sun, 16 Jan 2011 18:26:18 -0600 X-ASG-Debug-ID: 1295224114-2e51032e0000-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 8819219D2710; Sun, 16 Jan 2011 16:28:34 -0800 (PST) Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by cuda.sgi.com with ESMTP id GaAhwPB2c4LiBE7u; Sun, 16 Jan 2011 16:28:34 -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 p0H0SRFg030554; Sun, 16 Jan 2011 19:28:27 -0500 Date: Sun, 16 Jan 2011 19:28:27 -0500 (EST) From: Lachlan McIlroy Reply-To: Lachlan McIlroy To: bpm@sgi.com Cc: xfs@oss.sgi.com, Dave Chinner Message-ID: <1414867864.5452.1295224107104.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com> In-Reply-To: <20110114214334.GN28274@sgi.com> X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation 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 6.0.9_GA_2686 (ZimbraWebClient - FF3.0 (Linux)/6.0.9_GA_2686) X-Barracuda-Connect: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Start-Time: 1295224115 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 ----- Original Message ----- > Hi Dave, > > On Fri, Jan 14, 2011 at 11:29:00AM +1100, Dave Chinner wrote: > > I've noticed a few suspicious things trying to reproduce the > > allocate-in-the-middle-of-a-delalloc-extent, > ... > > Secondly, I think we have the same expose-the-entire-delalloc-extent > > -to-stale-data-exposure problem in ->writepage. This onnne, however, > > is due to using BMAPI_ENTIRE to allocate the entire delalloc extent > > the first time any part of it is written to. Even if we are only > > writing a single page (i.e. wbc->nr_to_write = 1) and the delalloc > > extent covers gigabytes. So, same problem when we crash. > > > > Finally, I think the extsize based problem exposed by test 229 is a > > also a result of allocating space we have no pages covering in the > > page cache (triggered by BMAPI_ENTIRE allocation) so the allocated > > space is never zeroed and hence exposes stale data. > > This is precisely the bug I was going after when I hit the > allocate-in-the-middle-of-a-delalloc-extent bug. This is a race > between > block_prepare_write/__xfs_get_blocks and writepage/xfs_page_state > convert. When xfs_page_state_convert allocates a real extent for a > page > toward the beginning of a delalloc extent, XFS_BMAPI converts the > entire > delalloc extent. Any subsequent writes into the page cache toward the > end of this freshly allocated extent will see a written extent instead > of delalloc and read the block from disk into the page before writing > over it. If the write does not cover the entire page garbage from disk > will be exposed into the page cache. Ben, take a look at the XFS gap list code in IRIX - this code was designed specifically to handle this problem. It's also implemented in several of the cxfs clients too. On entry to a write() it will create a list of all the holes that exist in the write range before any delayed allocations are created. The first call to xfs_bmapi() sets up the delayed allocation for the entire write (even if the bmaps returned don't cover the full write range). If the write results in a fault from disk then it checks the gap list to see if any sections of the buffer used to cover a hole and if so it ignores the state of the extent and zeroes those region(s) in the buffer that match the pre-existing holes. If the buffer has multiple non-hole sections that need to be read from disk the whole buffer will be read from disk and the zeroing of the holes is done post I/O - this reduces the number of I/Os to be done. The whole delayed allocation can be safely converted at any time without risk of reading exposed data (assuming no crash that is). As the write progresses through the range it removes sections from the front of the gap list so by the time the write is complete the gap list is empty. The gap list does not have a dedicated lock to protect it but instead relies on the iolock to ensure that only one write operation occurs at once (so it's not appropriate for direct I/O). > > > > > I'm sure there are other ways to solve these problems, but these two > > are the ones that come to mind for me. I'm open to other solutions > > or ways to improve on these ones, especially if they are simpler. ;) > > Anyone got any ideas or improvements? > > The direction I've been taking is to use XFS_BMAPI_EXACT in > *xfs_iomap_write_allocate to ensure that an extent covering exactly > the > pages we're prepared to write out immediately is allocated and the > rest > of the delalloc extent is left as is. This exercises some of the btree > code more heavily and led to the discovery of the > allocate-in-the-middle-of-a-delalloc-extent bug. It also presents a > performance issue which I've tried to resolve by extending > xfs_probe_cluster to probe delalloc extents-- lock up all of the pages > to be converted before performing the allocation and hold those locks > until they are submitted for writeback. It's not very pretty but it > resolves the corruption. > > There is still the issue of crashes... This could be solved by > converting from delalloc to unwritten in xfs_page_state_convert in > this > very exact way and then to written in the io completion handler. Never > go delalloc->written directly. That solution would probably make the gap list redundant too. > > I have not had luck reproducing this on TOT xfs and have come to > realize > that this is because it doesn't do speculative preallocation of larger > delalloc extents unless you are using extsize... which I haven't > tried. > > Regards, > Ben > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From SRS0+CB4K+51+fromorbit.com=david@internode.on.net Sun Jan 16 22:35:34 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0H4ZY5c231609 for ; Sun, 16 Jan 2011 22:35:34 -0600 X-ASG-Debug-ID: 1295239068-3e5e017b0000-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 C24F71005D65 for ; Sun, 16 Jan 2011 20:37:49 -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 WmqkfJyqyMmktYWO for ; Sun, 16 Jan 2011 20:37:49 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 53199269-1927428 for multiple; Mon, 17 Jan 2011 15:07:47 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pegqa-0002x4-DT; Mon, 17 Jan 2011 15:37:40 +1100 Date: Mon, 17 Jan 2011 15:37:40 +1100 From: Dave Chinner To: Lachlan McIlroy Cc: bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110117043740.GK16267@dastard> References: <20110114214334.GN28274@sgi.com> <1414867864.5452.1295224107104.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: <1414867864.5452.1295224107104.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.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: 1295239070 X-Barracuda-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.52603 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, Jan 16, 2011 at 07:28:27PM -0500, Lachlan McIlroy wrote: > ----- Original Message ----- > > Hi Dave, > > > > On Fri, Jan 14, 2011 at 11:29:00AM +1100, Dave Chinner wrote: > > > I've noticed a few suspicious things trying to reproduce the > > > allocate-in-the-middle-of-a-delalloc-extent, > > ... > > > Secondly, I think we have the same expose-the-entire-delalloc-extent > > > -to-stale-data-exposure problem in ->writepage. This onnne, however, > > > is due to using BMAPI_ENTIRE to allocate the entire delalloc extent > > > the first time any part of it is written to. Even if we are only > > > writing a single page (i.e. wbc->nr_to_write = 1) and the delalloc > > > extent covers gigabytes. So, same problem when we crash. > > > > > > Finally, I think the extsize based problem exposed by test 229 is a > > > also a result of allocating space we have no pages covering in the > > > page cache (triggered by BMAPI_ENTIRE allocation) so the allocated > > > space is never zeroed and hence exposes stale data. > > > > This is precisely the bug I was going after when I hit the > > allocate-in-the-middle-of-a-delalloc-extent bug. This is a race > > between > > block_prepare_write/__xfs_get_blocks and writepage/xfs_page_state > > convert. When xfs_page_state_convert allocates a real extent for a > > page > > toward the beginning of a delalloc extent, XFS_BMAPI converts the > > entire > > delalloc extent. Any subsequent writes into the page cache toward the > > end of this freshly allocated extent will see a written extent instead > > of delalloc and read the block from disk into the page before writing > > over it. If the write does not cover the entire page garbage from disk > > will be exposed into the page cache. > > Ben, take a look at the XFS gap list code in IRIX - this code was > designed specifically to handle this problem. It's also implemented in > several of the cxfs clients too. On entry to a write() it will create a > list of all the holes that exist in the write range before any delayed > allocations are created. The first call to xfs_bmapi() sets up the delayed > allocation for the entire write (even if the bmaps returned don't cover the > full write range). If the write results in a fault from disk then it checks > the gap list to see if any sections of the buffer used to cover a hole and > if so it ignores the state of the extent and zeroes those region(s) in the > buffer that match the pre-existing holes. If the buffer has multiple > non-hole sections that need to be read from disk the whole buffer will be > read from disk and the zeroing of the holes is done post I/O - this reduces > the number of I/Os to be done. The whole delayed allocation can be safely > converted at any time without risk of reading exposed data (assuming no > crash that is). IMO, that caveat exposes the problem with this approach - it is not persistent. It adds a lot of complexity but doesn't solve the underlying problem: that we are exposing real extents via allocation without having written any data to them. > As the write progresses through the range it removes > sections from the front of the gap list so by the time the write is complete > the gap list is empty. The gap list does not have a dedicated lock to > protect it but instead relies on the iolock to ensure that only one write > operation occurs at once (so it's not appropriate for direct I/O). > > > > > > > > > > I'm sure there are other ways to solve these problems, but these two > > > are the ones that come to mind for me. I'm open to other solutions > > > or ways to improve on these ones, especially if they are simpler. ;) > > > Anyone got any ideas or improvements? > > > > The direction I've been taking is to use XFS_BMAPI_EXACT in > > *xfs_iomap_write_allocate to ensure that an extent covering exactly > > the > > pages we're prepared to write out immediately is allocated and the > > rest > > of the delalloc extent is left as is. This exercises some of the btree > > code more heavily and led to the discovery of the > > allocate-in-the-middle-of-a-delalloc-extent bug. It also presents a > > performance issue which I've tried to resolve by extending > > xfs_probe_cluster to probe delalloc extents-- lock up all of the pages > > to be converted before performing the allocation and hold those locks > > until they are submitted for writeback. It's not very pretty but it > > resolves the corruption. > > > > There is still the issue of crashes... This could be solved by > > converting from delalloc to unwritten in xfs_page_state_convert in > > this > > very exact way and then to written in the io completion handler. Never > > go delalloc->written directly. > > That solution would probably make the gap list redundant too. Yes, I think you are right. The "gaps" would get mapped as unwritten rather than as normal extents and hence get zereod appropriately. It would also preventing exposure after a crash due to being persistent. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+d8jC+51+fromorbit.com=david@internode.on.net Sun Jan 16 23:16:16 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0H5GFZL235733 for ; Sun, 16 Jan 2011 23:16:16 -0600 X-ASG-Debug-ID: 1295241510-571100080000-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 C9F234D4024 for ; Sun, 16 Jan 2011 21:18: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 usfGqDRzKXpntPbE for ; Sun, 16 Jan 2011 21:18:31 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52758589-1927428 for multiple; Mon, 17 Jan 2011 15:48:29 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PehU4-00030H-2M; Mon, 17 Jan 2011 16:18:28 +1100 Date: Mon, 17 Jan 2011 16:18:28 +1100 From: Dave Chinner To: Geoffrey Wehrman Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110117051827.GL16267@dastard> References: <20110114002900.GF16267@dastard> <20110114164016.GB30134@sgi.com> <20110114225907.GH16267@dastard> <20110115041629.GC11968@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110115041629.GC11968@sgi.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: 1295241512 X-Barracuda-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.52604 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, Jan 14, 2011 at 10:16:29PM -0600, Geoffrey Wehrman wrote: > On Sat, Jan 15, 2011 at 09:59:07AM +1100, Dave Chinner wrote: > | On Fri, Jan 14, 2011 at 10:40:16AM -0600, Geoffrey Wehrman wrote: > | > Also, I'm not saying using XFS_BMAPI_EXACT is feasible. I have a very > | > minimal understanding of the writepage code path. > | > | I think there are situations where this does make sense, but given > | the potential issues I'm not sure it is a solution that can be > | extended to the general case. A good discussion point on a different > | angle, though. ;) > > You've convinced me that XFS_BMAPI_EXACT is not the optimal solution. > > Upon further consideration, I do like your proposal to make delalloc > allocation more like an intent/done type operation. The compatibility > issues aren't all that bad. As long as the filesystem is unmounted > clean, there is no need for the next mount do log recovery and therefore > no need to have any knowledge of the new transactions. That is a good observation. If there is agreement that this a strong enough backwards compatibility guarantee (it's good enough for me), then I think that I will start to prototype this approach. However, this does not solve the extsize allocation issues where we don't have dirty pages in the page cache covering parts of the delayed allocation extent so we still need a solution for that. I'm tending towards zeroing in .aio_write as the simplest solution because it doesn't cause buffer head/extent tree mapping mismatches, and it would use the above intent/done operations for crash resilience so there's no additional, rarely used code path to test through .writepage. Does that sound reasonable? Cheers, Dave. -- Dave Chinner david@fromorbit.com From ajeet.yadav.77@gmail.com Mon Jan 17 06:10:41 2011 X-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,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 p0HCAe9p015779 for ; Mon, 17 Jan 2011 06:10:41 -0600 X-ASG-Debug-ID: 1295266376-67de00290000-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 8AA731D32A38 for ; Mon, 17 Jan 2011 04:12:57 -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 nnQpp3tpo8lSVTIG for ; Mon, 17 Jan 2011 04:12:57 -0800 (PST) Received: by qwe5 with SMTP id 5so5013508qwe.26 for ; Mon, 17 Jan 2011 04:12:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:date:message-id:subject:from:to :content-type; bh=e3oCse5YAYaXfSixcKYbQFBMLhyJT7j9zoRHEf56RR4=; b=tsyNG1fp3RwluPRk0euPC+YuYVGTmfWFDZCfBdVca1EhNwbrSh1xzbuh0o9OCSzVNm WY88ZKAQTwMvWW/YnstEeNAywOYRw2G/6e47uhYhppFvMJ0mSuuhl6rN4uNBfY81d9Wq dgEnsGLMZY/2bHhEsIpqtr96FJzazv2Gbbuxg= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=xIs1v/X1Ly4TVyNywEjLz0n5NfIlsTBbKe7EYdx/MkRsi5kGbEhEMgXDV6IVc910mK mJxNkZk/9V/5pvNf9I6HxIfnPet+tTO1GgjWJBoha1fpZIimoeX54JZDn+r1g3CTQfXB 3ycabroXBwtTlxRIH+Mm/bhiC5/swRXluHlT8= MIME-Version: 1.0 Received: by 10.224.54.10 with SMTP id o10mr3867689qag.104.1295266374763; Mon, 17 Jan 2011 04:12:54 -0800 (PST) Received: by 10.220.165.198 with HTTP; Mon, 17 Jan 2011 04:12:54 -0800 (PST) Date: Mon, 17 Jan 2011 21:12:54 +0900 Message-ID: X-ASG-Orig-Subj: XFS internal error xfs_iformat(realtime) even after xfs_repair. Subject: XFS internal error xfs_iformat(realtime) even after xfs_repair. From: Ajeet Yadav To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0015175ca85a284322049a09b436 X-Barracuda-Connect: mail-qw0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1295266377 X-Barracuda-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.52631 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 --0015175ca85a284322049a09b436 Content-Type: text/plain; charset=ISO-8859-1 Kernel: 2.6.30.9, XFS backported from 2.6.34, xfsprogs-3.0.5 I used a script 1. create some file, directories, symlinks 2. unmount the file system 3. run xfs_bd with blocktrash 4. xfs_xfsrepair -L 5. list "ls -lR" 6. remove all file and directory "rm -rf * Often during testing I get the below backtrace from kernel during ls, rm even though I already run xfs_repair on it. Is it related to xfsrepair or xfs ?. I think xfs_repair must have detected this problem and corrected it. There is similar problem already reported by http://oss.sgi.com/archives/xfs/2010-06/msg00349.html xfs_repair log ------------------- xfs_repair -L /dev/sda1 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 Phase 5 - rebuild AG headers and trees... - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... done xfs log duing ls operation ------------------------------------ drwxr-xr-x 2 root 0 6 Jan 1 00:00 9.dir1 drwxr-xr-xFilesystem "sda1": corrupt dinode 8053, has realtime flag set. Unmount and run xfs_repair. c803e500: 49 4e a1 ff 02 01 00 00 00 00 00 00 00 00 00 00 IN.............. Filesystem "sda1": XFS internal error xfs_iformat(realtime) at line 356 of file fs/xfs/xfs_inode.c. Caller 0xc019b328 Backtrace: [] (dump_backtrace+0x0/0x110) from [] (dump_stack+0x18/0x1c) r6:c8962400 r5:c039db13 r4:00000001 r3:c89d1be8 [] (dump_stack+0x0/0x1c) from [] (xfs_error_report+0x4c/0x5c) [] (xfs_error_report+0x0/0x5c) from [] (xfs_corruption_error+0x5c/0x68) [] (xfs_corruption_error+0x0/0x68) from [] (xfs_iformat+0x1b4/0x5dc) r6:c019b328 r5:c8cf0be0 r4:c803e500 [] (xfs_iformat+0x0/0x5dc) from [] (xfs_iread+0xc8/0x198) r9:00001f75 r8:c8962400 r7:00000000 r6:00000000 r5:c803e500 r4:c8cf0be0 [] (xfs_iread+0x0/0x198) from [] (xfs_iget+0x558/0x8c4) [] (xfs_iget+0x0/0x8c4) from [] (xfs_lookup+0x128/0x15c) [] (xfs_lookup+0x0/0x15c) from [] (xfs_vn_lookup+0x48/0x90) [] (xfs_vn_lookup+0x0/0x90) from [] (do_lookup+0xcc/0x194) r6:c8c66d6c r5:c89d1e08 r4:c89d1e90 [] (do_lookup+0x0/0x194) from [] (__link_path_walk+0x9b8/0xe68) [] (__link_path_walk+0x0/0xe68) from [] (path_walk+0x50/0x9c) [] (path_walk+0x0/0x9c) from [] (do_path_lookup+0x138/0x160) r7:00000001 r6:c89d1e90 r5:c89d0000 r4:c89f2000 [] (do_path_lookup+0x0/0x160) from [] (user_path_at+0x60/0x94) r7:c89d1f08 r6:ffffff9c r5:c89d1e90 r4:c89f2000 [] (user_path_at+0x0/0x94) from [] (vfs_fstatat+0x34/0x64) r8:c0023528 r7:000000c4 r6:00182320 r5:c89d1f40 r4:c89d1f08 [] (vfs_fstatat+0x0/0x64) from [] (vfs_lstat+0x24/0x28) r6:00182320 r5:beb476b8 r4:c89d1f40 [] (vfs_lstat+0x0/0x28) from [] (sys_lstat64+0x20/0x3c) [] (sys_lstat64+0x0/0x3c) from [] (ret_fast_syscall+0x0/0x2c) r5:001895a0 r4:00000000 2 root 0 6 Jan 1 00:00 9.dir2 drwxr-xr-x 2 root 0 6 Jan 1 00:00 9.dir3 --0015175ca85a284322049a09b436 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Kernel: 2.6.30.9, XFS backported from 2.6.34, xfsprogs-3.0.5
=A0
I used a script
1. create some file, directories, symlinks
2. unmount the file system
3. run xfs_bd with blocktrash
4. xfs_xfsrepair -L
5. list "ls -lR"
6. remove all file and directory "rm -rf *
=A0
Often during testing I get the below backtrace from kernel during ls, = rm even though I already run xfs_repair on it.
Is it related to xfsrepair or xfs ?. I think xfs_repair must have dete= cted this problem and corrected it.
=A0
There is similar problem already reported by
=A0
xfs_repair log
-------------------
xfs_repair -L /dev/sda1
Phase 1 - find and verify superblock...
= Phase 2 - using internal log
=A0=A0=A0=A0=A0=A0=A0 - zero log...
=A0= =A0=A0=A0=A0=A0=A0 - scan filesystem freespace and inode maps...
=A0=A0= =A0=A0=A0=A0=A0 - found root inode chunk
Phase 3 - for each AG...
=A0=A0=A0=A0=A0=A0=A0 - scan and clear agi unli= nked lists...
=A0=A0=A0=A0=A0=A0=A0 - process known inodes and perform i= node discovery...
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 0
=A0=A0=A0=A0=A0= =A0=A0 - agno =3D 1
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 2
=A0=A0=A0=A0= =A0=A0=A0 - agno =3D 3
=A0=A0=A0=A0=A0=A0=A0 - process newly discovered inodes...
Phase 4 - che= ck for duplicate blocks...
=A0=A0=A0=A0=A0=A0=A0 - setting up duplicate = extent list...
=A0=A0=A0=A0=A0=A0=A0 - check for inodes claiming duplica= te blocks...
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 0
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 1
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 2=A0=A0=A0=A0=A0=A0=A0 - agno =3D 3
Phase 5 - rebuild AG headers and tre= es...
=A0=A0=A0=A0=A0=A0=A0 - reset superblock...
Phase 6 - check ino= de connectivity...
=A0=A0=A0=A0=A0=A0=A0 - resetting contents of realtim= e bitmap and summary inodes
=A0=A0=A0=A0=A0=A0=A0 - traversing filesystem ...
=A0=A0=A0=A0=A0=A0=A0 = - traversal finished ...
=A0=A0=A0=A0=A0=A0=A0 - moving disconnected ino= des to lost+found ...
Phase 7 - verify and correct link counts...
don= e
=A0
=A0
xfs log duing ls operation
------------------------------------
=A0
drwxr-xr-x 2 root 0 6 Jan 1 00:00 9.dir1

drwxr-xr-xFilesystem "sda1": corrupt dinode 8053, has realtime= flag set. Unmount and run xfs_repair.

c803e500: 49 4e a1 ff 02 01 00 00 00 00 00 00 00 00 00 00 IN............= ..

Filesystem "sda1": XFS internal error xfs_iformat(realtime) at= line 356 of file fs/xfs/xfs_inode.c. Caller 0xc019b328

Backtrace:

[<c00279b0>] (dump_backtrace+0x0/0x110) from [<c02f2bd0>] (d= ump_stack+0x18/0x1c)

r6:c8962400 r5:c039db13 r4:00000001 r3:c89d1be8

[<c02f2bb8>] (dump_stack+0x0/0x1c) from [<c018fa54>] (xfs_er= ror_report+0x4c/0x5c)

[<c018fa08>] (xfs_error_report+0x0/0x5c) from [<c018fac0>] (= xfs_corruption_error+0x5c/0x68)

[<c018fa64>] (xfs_corruption_error+0x0/0x68) from [<c019ae38>= ;] (xfs_iformat+0x1b4/0x5dc)

r6:c019b328 r5:c8cf0be0 r4:c803e500

[<c019ac84>] (xfs_iformat+0x0/0x5dc) from [<c019b328>] (xfs_= iread+0xc8/0x198)

r9:00001f75 r8:c8962400 r7:00000000 r6:00000000 r5:c803e500

r4:c8cf0be0

[<c019b260>] (xfs_iread+0x0/0x198) from [<c0195294>] (xfs_ig= et+0x558/0x8c4)

[<c0194d3c>] (xfs_iget+0x0/0x8c4) from [<c01b4b28>] (xfs_loo= kup+0x128/0x15c)

[<c01b4a00>] (xfs_lookup+0x0/0x15c) from [<c01c1ab4>] (xfs_v= n_lookup+0x48/0x90)

[<c01c1a6c>] (xfs_vn_lookup+0x0/0x90) from [<c00c7da8>] (do_= lookup+0xcc/0x194)

r6:c8c66d6c r5:c89d1e08 r4:c89d1e90

[<c00c7cdc>] (do_lookup+0x0/0x194) from [<c00c9a30>] (__link= _path_walk+0x9b8/0xe68)

[<c00c9078>] (__link_path_walk+0x0/0xe68) from [<c00ca08c>] = (path_walk+0x50/0x9c)

[<c00ca03c>] (path_walk+0x0/0x9c) from [<c00ca258>] (do_path= _lookup+0x138/0x160)

r7:00000001 r6:c89d1e90 r5:c89d0000 r4:c89f2000

[<c00ca120>] (do_path_lookup+0x0/0x160) from [<c00cac64>] (u= ser_path_at+0x60/0x94)

r7:c89d1f08 r6:ffffff9c r5:c89d1e90 r4:c89f2000

[<c00cac04>] (user_path_at+0x0/0x94) from [<c00c2bb8>] (vfs_= fstatat+0x34/0x64)

r8:c0023528 r7:000000c4 r6:00182320 r5:c89d1f40 r4:c89d1f08

[<c00c2b84>] (vfs_fstatat+0x0/0x64) from [<c00c2c48>] (vfs_l= stat+0x24/0x28)

r6:00182320 r5:beb476b8 r4:c89d1f40

[<c00c2c24>] (vfs_lstat+0x0/0x28) from [<c00c2c6c>] (sys_lst= at64+0x20/0x3c)

[<c00c2c4c>] (sys_lstat64+0x0/0x3c) from [<c0023380>] (ret_f= ast_syscall+0x0/0x2c)

r5:001895a0 r4:00000000

2 root 0 6 Jan 1 00:00 9.dir2

drwxr-xr-x 2 root 0 6 Jan 1 00:00 9.dir3

--0015175ca85a284322049a09b436-- From window-20111@hotmail.com Mon Jan 17 07:03:22 2011 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 p0HD3IK8020933 for ; Mon, 17 Jan 2011 07:03:18 -0600 X-ASG-Debug-ID: 1295269528-4afa01740000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from omp1025.mail.sp2.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 49AC71541D1D for ; Mon, 17 Jan 2011 05:05:28 -0800 (PST) Received: from omp1025.mail.sp2.yahoo.com (omp1025.mail.sp2.yahoo.com [98.139.91.25]) by cuda.sgi.com with SMTP id hLxIcTU3hUboPv7y for ; Mon, 17 Jan 2011 05:05:28 -0800 (PST) Received: (qmail 2998 invoked by uid 1000); 17 Jan 2011 13:05:28 -0000 Received: (qmail 99483 invoked by uid 60001); 17 Jan 2011 13:05:27 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1295269526; bh=cz2EM5XNDZiS8wDybKDdpKR1kWfjTywcNpil3nWlIGM=; h=Message-ID:X-YMail-OSG:Received:X-RocketYMMF:X-Mailer:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type; b=4FnmUDIXF5dgTsJzTgYDkY0ELsU5+jceI2SIVaGJoM43MU9lKP23JxGK/N0Las6eJm/y8EKYhy4kkmIsneUkXvHAdR1KR3KHIRBA1Qs8hbd6dkTjKeb2G67EXFhxD0VM6aGXUKRBbueqKHY1Fb5VRDNEZE6o0230tQKNoEGxArI= Message-ID: <791129.99452.qm@web80008.mail.sp1.yahoo.com> X-YMail-OSG: PoUU2n0VM1mq_CQ6CAJ0CWUiowOeeHvnX7.nk7gWqLkdAaW rW8X87IU5kfCC0p__2MsbNWYTybwMaXkhnC3WWqQz4XZxkJTtkK7gAT6LEkL e6NziJj3xciDNhptW8JiiDfc36f1pNFeQ9gk3URVLof9iVJuvhhAySLRChWv AGz.NA38K5kxiT3EVs0JZShLh3lcxyhwM_igOd21QXHzewfqIfZPJqdzk_Fc zLTU9d087RG8VydWoN.fuqD9jilVyLVv2ZWMiLj1Oll.YbSlAggbuOBVZ6wQ 4xByw0sd0hmC5BwZw1L2GXw66K3z7UsEfi2_lw8O.AmCiN_bADizzt2orQNc hGVPJEnNlUgmzRJGugxsIVVA0tnbkExyvKGfDPZ2GXVZBy5jddvp7GIRjYHC Q_hwBbPMA8D8h5.5SX_sT1y5PV1j.Mkk1TFs1pwKYWPmHXbD9MVvAk3n0yHf dBCvXpAFM7GseRkg.KG3d.cPojFnEaMaN3HpkBwo5Xr.htrgYSQU628WWolB 0XbHhuCOARsH6BePSFa3XvnLzHEx6N_Wzn4advLhqSpUsN7tFoZpQ.Wmy07Z GA7OBqAWvT27Ld.txxV63yAYVVRYNcjlQCIGZ4uF1wy5LVVhmyHBv2ttDjG5 94HhzW9YQcOz2bO5lY.TfCc6nPvxtSWslvzNRRO9wWu4lFxv7DKC5P_KPyPl lkZDxa6U6kHpnst6t_y9En6SJLjZ5ikrPRzyZDSeBbkGiAlf4jZDJicrMD7v 0hAxq56dqs.291VT6DCspCZDSCykYQNOF1tl3o0HiCGOohQ-- Received: from [41.241.178.25] by web80008.mail.sp1.yahoo.com via HTTP; Mon, 17 Jan 2011 05:05:26 PST X-RocketYMMF: aznzbzxbnxbx@att.net X-Mailer: YahooMailClassic/11.4.20 YahooMailWebService/0.8.107.285259 Date: Mon, 17 Jan 2011 05:05:25 -0800 (PST) From: YAHOO AWARD PROMOTION Reply-To: paulwinters89@hotmail.com X-ASG-Orig-Subj: YAHOO AWARD PROMOTION:Attention Dear winner, Subject: YAHOO AWARD PROMOTION:Attention Dear winner, To: undisclosed recipients: ; MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="0-741621457-1295269526=:99452" X-Barracuda-Connect: omp1025.mail.sp2.yahoo.com[98.139.91.25] X-Barracuda-Start-Time: 1295269529 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 --0-741621457-1295269526=:99452 Content-Type: text/plain; charset=us-ascii Attention: winner kindly open the attachment and contact your claim agent for your fund claim --0-741621457-1295269526=:99452 Content-Type: application/msword; name=YAHOO Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="YAHOO ANNUAL AWARD PROMOTION.doc" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAAQ AAAA2gcAAAAAAAAAEAAA3AcAAAEAAAD+////AAAAAMoHAADLBwAAzAcAAM0H AADOBwAAzwcAANAHAADRBwAA0gcAANMHAADUBwAA1QcAANYHAADXBwAA2AcA ANkHAAD///////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ///////////////////////spcEAcWAJBAAA+BK/AAAAAAAAEAAAAAAABgAA fhcAAA4AYmpianFQcVAAAAAAAAAAAAAAAAAAAAAAAAAJBBYAEsAAABM6AQAT OgEAew8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAD//w8AAAAAAAAA AAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAAKQAAAAAAOQHAAAA AAAA5AcAAOQHAAAAAAAA5AcAAAAAAAA0CAAAAAAAADQIAAAAAAAANAgAABQA AAAAAAAAAAAAAGoIAADUAgAAZhQAAAAAAABmFAAAAAAAAGYUAAAAAAAAZhQA AGwAAADSFAAAHAAAAD4LAAAAAAAAbigAAI4CAAD6FAAAggAAAHwVAAAAAAAA fBUAAAAAAAB8FQAAAAAAAHwVAAAAAAAAix8AAAAAAACLHwAAAAAAAIsfAAAA AAAA7ScAAAIAAADvJwAAAAAAAO8nAAAAAAAA7ycAAAAAAADvJwAAAAAAAO8n AAAAAAAA7ycAACQAAAD8KgAAaAIAAGQtAAA6AAAAEygAABUAAAAAAAAAAAAA AAAAAAAAAAAANAgAAAAAAABFJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1HgAA 1gAAAIsfAAAAAAAARSYAAAAAAABFJgAAAAAAABMoAAAAAAAAAAAAAAAAAADk BwAAAAAAAOQHAAAAAAAAfBUAAAAAAAAAAAAAAAAAAHwVAAA5CQAAKCgAABYA AAAtJwAAAAAAAC0nAAAAAAAALScAAAAAAABFJgAAKAAAAOQHAAA4AAAAfBUA AAAAAAA0CAAAAAAAAHwVAAAAAAAA7ScAAAAAAAAAAAAAAAAAAC0nAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAARSYAAAAAAADtJwAAAAAAAAAAAAAAAAAALScAAAAAAAAAAAAAAAAAAC0n AAAAAAAAHAgAABgAAAA0CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALScAAAAAAAB8FQAA AAAAAO4UAAAMAAAAAOu4Ex6yywEAAAAAAAAAAGYUAAAAAAAAbSYAABwAAAAt JwAAAAAAAAAAAAAAAAAA7ScAAAAAAAA+KAAAMAAAAG4oAAAAAAAALScAAAAA AACeLQAAAAAAAIkmAACUAAAAni0AAAAAAAAtJwAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAJ4tAAAAAAAAAAAAAAAAAAA0CAAAAAAAAC0nAADA AAAAix8AAKoBAAA1IQAAMAEAAC0nAAAAAAAAZSIAAPQAAABZIwAA7AIAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAix8AAAAAAACLHwAAAAAA AIsfAAAAAAAAEygAAAAAAAATKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAHScAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAIsfAAAAAAAAix8AAAAAAACLHwAAAAAAAG4oAAAAAAAARSYAAAAA AABFJgAAAAAAAEUmAAAAAAAARSYAAAAAAAAAAAAAAAAAAD4LAAAAAAAAPgsA AAAAAAA+CwAAxAcAAAITAABkAQAAPgsAAAAAAAA+CwAAAAAAAD4LAAAAAAAA AhMAAAAAAABICAAAFAAAAFwIAAAOAAAAaggAAAAAAADkBwAAAAAAAOQHAAAA AAAA5AcAAAAAAADkBwAAAAAAAOQHAAAAAAAA5AcAAAAAAAD/////AAAAAAIA DAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICCAL oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgIKALoKCgoA0NoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoCAgIFlBSE9PIEFXQVJEUyBDRU5URVIu DaANQlJJVElTSCBNSUNST1NPRlQgRS1NQUlMIFNFTEVDVEVEIEFXQVJEIEZS T00gSEVBRCBPRkZJQ0VTIChVSykgTE9ORE9OIE9OIFRIRSBNT05USCBPRiBK QU5VQVJZLCAyMDExDUJyaXRpc2ggTWljcm9zb2Z0IEF3YXJkC0hlYWRxdWFy dGVyczogQ3VzdG9tZXIgc2VydmljZSANNjggTmV3bWFuIFN0cmVldC4gQ2l0 eSwNTG9uZG9uLiBDb3VudHJ5LCAJDVVuaXRlZCBLaW5nZG9tLiBQb3N0YWwv WmlwIENvZGUsIA1XMVQgM0VGoA0NQVRUTjogREVBUiBXSU5ORVIsDQ1ZT1VS IEVNQUlMIEFERFJFU1NFUyBIQVZFIEpVU1SgV09OIEEgWUFIT08gJiBXSU5E T1dTIExJVkUgUFJJWkUgTU9ORVkgT0agKE9ORSBNSUxMSU9OIFRXTyBIVU5E UkVEICYgRklGVFkgVEhPVVNBTkQgQlJJVElTSCBQT1VORFMgU1RFUkxJTkcp IChHQlCjMSwyNTAsMDAwLjAwKSBJTiBUSEUgQkVHSU5OSU5HIE9GIFlFQVIg MjAxMSBBV0FSRCBQUk9NT1RJT04uIFdJTk5FUlMgRU1FUkdFIFRIUk9VR0gg UkFORE9NIFNFTEVDVElPTiBPRiBBTEwgQUNUSVZFIEVNQUlMIFNVQlNDUklC RVJTIE9OTElORS6gU0lYIEFSRSBTRUxFQ1RFRCBZRUFSTFmgVE8gQkVORUZJ VCBGUk9NIFRISVMgUFJPTU9USU9OLgugDVBheW1lbnQgb2YgUHJpemUgYW5k IENsYWltDVdJTk5FUlMgQVJFIFRPIEJFIFBBSUQgSU4gQUNDT1JEQU5DRSBX SVRIIEhJUy9IRVIgU0VUVExFTUVOVCBDRU5URVIuoFRISVMgUFJJWkUgQVdB UkQgTVVTVCBCRSBDTEFJTUVEIElOIE5PVCBMQVRFUiBUSEFOIDMwIERBWVMg RlJPTSBEQVRFIE9GIERSQVcgTk9USUZJQ0FUSU9OIEFGVEVSIFdISUNIIFVO Q0xBSU1FRCBQUklaRVMgQVJFIENBTkNFTExFRC4NCKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKAgICCgoKCgoKATIElOQ0xVREVQSUNUVVJFICJo dHRwOi8vZ2Z4MS5ob3RtYWlsLmNvbS9sZ29fbXNuXzExM3g0OS5naWYiIFwq IE1FUkdFRk9STUFUSU5FVCAUARWgoA1XSU5ORVIgTk86IDQgC3RoZXNloGFy ZSB5b3VyIGlkZW50aWZpY2F0aW9uIG51bWJlcnMLQmF0Y2ggTnVtYmVyOiBZ UEIvMDgvQVBBLTQzNjU4C1JlZmVyZW5jZSBOdW1iZXI6oKBZUE41NjA5OTIw MDgLQXdhcmQgRmlsZSBTZWN1cml0eSBjb2RlOiAgVUsvKyBRVTM0MDA1DVRo ZXNlIG51bWJlcnMgZmFsbCB3aXRoaW4gdGhloFVuaXRlZCBLaW5nZG9toGZp bGUuIFRodXMsIHlvdSBhcmUgcmVxdWVzdGVkIHRvIGNvbnRhY3Sgb3VyIGZp ZHVjaWFyeSBhZ2VudKBpbqBVbml0ZWQgS2luZ2RvbSBhbmQgc2VuZCB5b3Vy IHdpbm5pbmcgaWRlbnRpZmljYXRpb24gbnVtYmVycyB0byBoaW0NCA1DT05U QUNUIElORk9STUFUSU9OIE9GIE9VUiBBR0VOVCBJTiBVTklURUQgS0lOR0RP TQ0NTkFNRSBEUi4gIFBBVUwgV0lOVEVSUw1Nb2JpbGUgUGhvbmU6ICs0NCA3 MDMxNzQ1NTM2DUZheCBudW1iZXI6ICs0NDggNDQ3NzQ3OTEyDUUtbWFpbDog ICAgICAgICAgcGF1bHdpbnRlcnM4OUBob3RtYWlsLmNvbQ1Mb3R0ZXJ5IFdl YnNpdGU6IBMgSFlQRVJMSU5LICJodHRwOi8vd3d3LndvcmxkY2FzaW5vZGly ZWN0b3J5LmNvbS9tdWx0aXN0YXRlbG90dG8uaHRtIiAUaHR0cDovL3d3dy53 b3JsZGNhc2lub2RpcmVjdG9yeS5jb20vbXVsdGlzdGF0ZWxvdHRvLmh0bRUN DUtpbmRseSBzZW5kIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gdG8geW91 ciBjbGFpbSBhZ2VudCB0byBmYWNpbGl0YXRlIHRoZSByZWxlYXNlIG9mIHlv dXIgZnVuZCBpbW1lZGlhdGVseS4NMS4gRnVsbCBuYW1lLqCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoCANMi4gQ291bnRyeSAgDTMuIFRlbGVwaG9uZSBOdW1i ZXIgDTQuoEZheCBOdW1iZXIgIA01LqBTZXggICAgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKAgDTYuoERhdGUgb2YgYmlydGggIA03LiBNYXJp dGFsIFN0YXR1cyAgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCANOC4gRS1NYWls IEFkZHJlc3M6ICANOS4gT2NjdXBhdGlvbiANMTAuIENvbnRhY3QgQWRkcmVz cyAgDTExLiBBbW91bnQgV29uICANMTIuIENvcHkgb2YgeW91ciBJbnRlcm5h dGlvbmFsIHBhc3Nwb3J0IG9yIERyaXZlcnMgbGljZW5zZQ1PbmNlIHlvdXIg YWdlbnQgYWNrbm93bGVkZ2VzIHJlY2VpcHSgb2YgdGhpcyByZXF1aXJlZCBk ZXRhaWwsIHRyYW5zZmVyIHdvdWxkIGNvbW1lbmNlLg0gICAgICAgICAgICAg EyBJTkNMVURFUElDVFVSRSAiaHR0cDovL2dmeDEuaG90bWFpbC5jb20vbGdv X21zbl8xMTN4NDkuZ2lmIiBcKiBNRVJHRUZPUk1BVElORVQgFAEVDSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgQ09OR1JBVFVMQVRJT05TISEgT05DRSBBR0FJTi4LICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBZT1VSUyBJTiBTRVJWSUNFLA2gASAgICAg ICAgICAgICAgIAEgICAgICAgICAgICAgIAEgICAgICAgICAgICAgAQsgRHIu IFBhdWwgV2ludGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXdh cmQgV2lubmluZyBGdW5kICAgICAgICAgICAgICAgICAgICAgICAgTXMgQm95 bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVu Zy4gSm9obiBGbGV0Y2hlcg1Ccml0aXNoIE1pY3Jvc29mdCBBd2FyZCBGaWR1 Y2lhcnkgQWdlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgQnJpdGlzaCBNaWNyb3NvZnQgQXdhcmQgTWFuYWdl ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIA1OT1RFC1lPVSBBUkUgSEVSRUJZIEFEVklTRUQgTk9U IFRPIERJU0NMT1NFIFRIRSBDT05URU5UIE9GIFRISVMgUFJJWkUgQVdBUkQg VU5USUwgWU9VUiBNT05FWSBIQVZFIEJFRU4gUkVNSVRURUQgVE8gWU9VIFRP IEFWT0lEIERJU1FVQUxJRklDQVRJT04gVEhBVCBXSUxMIEFSSVNFIEZST00g RFVBTCBDTEFJTS4NCKANoA0NICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQ0NU2lnbmVkIEJ5OiBEci6g QS4gVy4gR2VvcmdlC0xvdHRlcnkgQm9hcmQgRGlyZWN0b3IgDUhlYWQgT2Zm aWNlIFUuSwsTIElOQ0xVREVQSUNUVVJFICJodHRwOi8vaW1hZ2VzLmZyZWVs b3R0by5jb20vd3d3LmZyZWVsb3R0by5jb20vZHluYW1pYy9ha2FtYWl6ZXIv MjAwNTAzX2dsZXR0ZXIvdHJhbnNwYXJlbnQuZ2lmIiBcKiBNRVJHRUZPUk1B VElORVQgFAEVDUJFTE9XIElTIE9VUiBSRUNFTlQgU0VMRUNURUQgQVdBUkQg V0lOTkVSIE9GIE1JQ1JPLVNPRlQgRU1BSUwgV0hPIEhBUyBBTEwgQ0xBSU1F RCBUSEVJUiBXSU5OSU5HIFBSSUNFIEZST00gT1VSIEhFQUQgT0ZGSUNFIElO IFRIRSBVTklURUQgS0lOR0RPTS4NICAgEyBJTkNMVURFUElDVFVSRSAiaHR0 cDovL2ltYWdlcy5nb29nbGUuY29tL2ltYWdlcz9xPXRibjpNbndHQzVjRnJq d0o6d3d3LnRyaWJ1bmVpbmRpYS5jb20vMjAwMi8yMDAyMTIyOC9iaXouanBn IiBcKiBNRVJHRUZPUk1BVElORVQgFAEVEyBJTkNMVURFUElDVFVSRSAiaHR0 cDovL2ltYWdlcy5nb29nbGUuY29tL2ltYWdlcz9xPXRibjpxT1NkeUNTalBW TUo6d3d3Lm1pY2hpZ2FuLmdvdi9pbWFnZXMvMjAwMjExQW5nZWxhUm9sbGlu c182MTI2N183LmpwZyIgXCogTUVSR0VGT1JNQVRJTkVUIBQBFRMgSU5DTFVE RVBJQ1RVUkUgImh0dHA6Ly9pbWFnZXMuZ29vZ2xlLmNvbS9pbWFnZXM/cT10 Ym46eTFiN190aVVCbEFKOnd3dy5pZmlwLm9yLmF0L21pbnV0ZXMvYzIwMDMv c3BfaW1wOC5qcGciIFwqIE1FUkdFRk9STUFUSU5FVCAUARUBIAENCA0NDQ0N DQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAA AQgAAAIIAAADCAAABAgAADgIAAA+CAAAeAgAAH4IAACECAAAhQgAAIwIAACN CAAAjwgAAMEIAADUCAAA8NrKwLayq5V/lWmVXko5AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAgFmjtR40ANQiBPioBQioNQ0oUAFwIgWFK FABwaJkzAAAAJhVoFXiNABZoFXiNADUIgT4qAUIqDUNKFABcCIFhShQAcGiZ MwAAABQWaCt5kQA1CIFDShAAXAiBYUoQAAArFWhyWZwAFmgreZEAPioBQioP Q0ocAE9KBABRSgQAXAiBYUocAHBoMzOZACsVaHJZnAAWaCt5kQA+KgFCKgdD ShwAT0oEAFFKBABcCIFhShwAcGj/mQAAKxVoclmcABZoK3mRAD4qAUIqDkNK HABPSgQAUUoEAFwIgWFKHABwaICAAAAMFmgreZEANQiBXAiBAAYWaCt5kQAA EhZoK3mRAE9KAwBRSgMAXkoCAAASFmgVeI0AT0oDAFFKAwBeSgIAAB4DagAA AAAWaCt5kQBDShQAVQgBbUgABG5IAAR1CAEAKgNqAAAAABZoK3mRAENKFABP SgMAUUoDAFUIAV5KAgBtSAAEbkgABHUIAQAeA2oAAAAAFmiJWIMAQ0oUAFUI AW1IAARuSAAEdQgBDwAGAAA9CAAAPggAAI0IAACPCAAA8wgAACsJAABDCQAA VgkAAHgJAACBCQAAggkAAJUJAACWCQAA7goAAAkLAADUCwAAVAwAAO8MAACf DQAAoQ0AANQNAADVDQAA7A0AAAkOAAAkDgAATw4AAPoAAAAAAAAAAAAAAAD6 AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAD4AAAAAAAA AAAAAAAA+AAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAADyAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAA8AAAAAAA AAAAAAAAAPgAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAA7gAAAAAAAAAAAAAA AOwAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAOwAAAAA AAAAAAAAAAD4AAAAAAAAAAAAAAAA7gAAAAAAAAAAAAAAAOcAAAAAAAAAAAAA AADiAAAAAAAAAAAAAAAA4gAAAAAAAAAAAAAAAOIAAAAAAAAAAAAAAADiAAAA AAAAAAAAAAAAAAAAAAAAAAQAAGdkCEdEAAAEAABnZDpWIgAAARUAAAECAAAB AwAABQAADcYFAAGOFwEAAQAAAAQAABJkIAEAAAAaAAYAAHsXAAB9FwAA/f0A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAB AQLUCAAA7AgAAO0IAADyCAAA8wgAABkJAAAqCQAAKwkAAH8JAACACQAAgQkA AIIJAACICQAAjQkAAJUJAACWCQAA797vyrikuIyke2dURFQ3AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAABgWaCt5kQA1CIFDShAAT0oDAFFKAwBc CIEAHhZo9hFLADUIgUIqD09KBABRSgQAXkoAAHBoMzOZAAAkFWhyWZwAFmgr eZEANQiBQioPT0oEAFFKBABeSgAAcGgzM5kAACYVaBV4jQAWaBYglAA1CIFD ShYAT0oFAFFKBQBcCIFeSgIAYUoWAAAgFmgreZEANQiBQ0oWAE9KBQBRSgUA XAiBXkoCAGFKFgAALxVoFXiNABZoK3mRADUIgUIqAUNKFgBPSgUAUUoFAFwI gV5KAgBhShYAcGgAAAAAJhVoFXiNABZoK3mRADUIgUNKFgBPSgUAUUoFAFwI gV5KAgBhShYAACIVaBV4jQAWaCt5kQA1CIFDShYAT0oFAFFKBQBcCIFhShYA ACYVaBV4jQAWaBV4jQA1CIE+KgFCKg1DShQAXAiBYUoUAHBomTMAAAAgFmjt R40ANQiBPioBQioNQ0oUAFwIgWFKFABwaJkzAAAAIBZoFiCUADUIgT4qAUIq DUNKFABcCIFhShQAcGiZMwAAD5YJAAC7CQAAwAkAAMMJAADPCQAA3wkAAOwJ AAAJCgAAIQoAADMKAAA1CgAAUgoAAFMKAABYCgAAYwoAAKwKAADLCgAA6woA AOwKAADuCgAACQsAAOzX7Nfsw7LDsp6NfOxr7GvsWkk9AAAAAAAAAAAAAAAA AAAAAAAAFxVoclmcABZoK3mRAENKGABcCIFeSgAAIBZoK3mRADUIgUNKEABP SgMAUUoDAFwIgV5KAgBhShAAACAWaCt5kQA1CIFDShQAT0oDAFFKAwBcCIFe SgIAYUoUAAAgFmhfK/IANQiBQ0oQAE9KAwBRSgMAXAiBXkoCAGFKEAAAIBZo bCONADUIgUNKEABPSgMAUUoDAFwIgV5KAgBhShAAACAWaBYglAA1CIFDShAA T0oDAFFKAwBcCIFeSgIAYUoQAAAmFWhsI40AFmhfK/IANQiBQ0oQAE9KAwBR SgMAXAiBXkoCAGFKEAAAIBZoZwtRADUIgUNKEABPSgMAUUoDAFwIgV5KAgBh ShAAACYVaIlYgwAWaCt5kQA1CIFDShAAT0oDAFFKAwBcCIFeSgIAYUoQAAAp FWhsI40AFmgreZEANQiBPioBQ0oQAE9KAwBRSgMAXAiBXkoCAGFKEAAmFWhs I40AFmgreZEANQiBQ0oQAE9KAwBRSgMAXAiBXkoCAGFKEAAUCQsAAGMLAACD CwAA1AsAANULAAD9CwAA/gsAAE4MAABPDAAAUAwAAFEMAABUDAAAYAwAAGEM AABiDAAAaQwAAIcMAACWDAAA8ufy0MOypbKRssN7aMNUQFQAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmFWhyWZwAFmiJWIMANQiB Q0oUAE9KAwBRSgMAXAiBXkoCAGFKFAAAJhVoclmcABZoK3mRADUIgUNKFABP SgMAUUoDAFwIgV5KAgBhShQAACUWaCt5kQA1CIFCKgpDSiwAT0oDAFFKAwBc CIFhSiwAcGgAQH8AKxVowkvPABZoK3mRADUIgUIqCkNKHABPSgQAUUoEAFwI gWFKHABwaABAfwAnA2oAAAAAFWiJWIMAFmiJWIMANQiBT0oDAFFKAwBVCAFc CIFeSgYAGBZoK3mRADUIgU9KAwBRSgMAXAiBXkoGAAAhA2oAAAAAFmgreZEA NQiBT0oDAFFKAwBVCAFcCIFeSgYAGBZoK3mRADUIgU9KAwBRSgMAXAiBXkoC AAAtA2oAAAAAFmiJWIMAQ0ocAE9KBABRSgQAVQgBXAiBYUocAG1IAARuSAAE dQgBFBZoXyvyADUIgUNKEABcCIFhShAAABoVaGwjjQAWaCt5kQA1CIFDShAA XAiBYUoQABGWDAAApgwAALoMAADGDAAA5QwAAOYMAADnDAAA7gwAAO8MAACf DQAAoA0AAKENAADFDQAA0w0AANQNAADVDQAA6NTo1MKp6NSbg3ZjUEA5AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMFWg6ViIAFmg6ViIA AB4WaCt5kQAwSg8ANQiBQioNQ0oWAGFKFgBwaJkzAAAAJBVoFXiNABZoK3mR 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAUpPAAAAgAAA3GBQABPB4AZ2Th PlQAAAEZAAABFQAAARYAAAEAAAAEAABnZAhHRAAAGk8PAABcDwAAdQ8AAHYP AACADwAAgQ8AAIMPAACWDwAAlw8AAJgPAAClDwAApg8AAKgPAACuDwAAsg8A AOQPAADmDwAA+A8AAPoPAAAlEAAAJhAAACcQAAA0EAAANRAAADYQAABJEAAA TBAAAFoQAABcEAAAXRAAAF8QAACAEAAAlxAAAO8QAAD8EAAA8N7MvrO+3vDe vrO+3vDe8N7w3qTel42X3qR7pGp73nveYAAAAAAAAAAAAAAAAAAAAAAAABIW aCt5kQBPSgMAUUoDAF5KBgAAIBZoa0ZEADUIgUNKEABPSgMAUUoDAFwIgV5K AgBhShAAACMVaBV4jQAWaGwjjQA1CIFDShIAT0oDAFFKAwBeSgYAYUoSABIW aGtGRABDShIAXkoGAGFKEgAAGBVoFXiNABZoK3mRAENKEgBeSgYAYUoSAAAd FmhrRkQANQiBQ0oSAE9KAwBRSgMAXkoGAGFKEgAVFmiOKs0ANQiBQ0oSAF5K BgBhShIAGxVoFXiNABZoK3mRADUIgUNKEgBeSgYAYUoSACMVaBV4jQAWaCt5 kQA1CIFDShIAT0oDAFFKAwBeSgIAYUoSACMVaBV4jQAWaCt5kQA1CIFDShIA T0oDAFFKAwBeSgYAYUoSAB0WaI4qzQA1CIFDShIAT0oDAFFKAwBeSgYAYUoS AAAi/BAAAP0QAABNEQAAThEAAE8RAABQEQAAUREAAIkRAACmEQAApxEAAO0R AADuEQAA8BEAAPERAAACEgAAAxIAAAQSAADx5/HZ8efHr5iDcV+DSzosAAAA ABoWaCt5kQBDShQAT0oCAFFKAgBeSgIAYUoUAAAgFWhyWZwAFmgreZEAQ0oU AE9KAgBRSgIAXkoCAGFKFAAAJhVoclmcABZoK3mRADUIgUNKFABPSgIAUUoC AFwIgV5KAgBhShQAACMWaPRaiwBCKgpDShQAT0oCAFFKAgBeSgIAYUoUAHBo AGC/ACMWaBV4jQBCKgpDShQAT0oCAFFKAgBeSgIAYUoUAHBoAGC/ACkVaHJZ nAAWaCt5kQBCKgpDShQAT0oCAFFKAgBeSgIAYUoUAHBoAGC/ACwVaHJZnAAW aCt5kQA+KgFCKgpDShQAT0oCAFFKAgBeSgIAYUoUAHBoAGC/AAAvFWhyWZwA FmgreZEAPioBQioKQ0oUAE9KBABRSgQAXAiBXkoCAGFKFABwaABgvwAjFmgr eZEAQioKQ0oUAE9KAgBRSgIAXkoCAGFKFABwaABgvwAbA2p3BwAAFmgreZEA T0oDAFFKAwBVCAFeSgYAEhZoK3mRAE9KAwBRSgMAXkoGAAAbA2oAAAAAFmgr eZEAT0oDAFFKAwBVCAFeSgYAABAEEgAABRIAABISAAAUEgAAFRIAACESAAAj EgAAJBIAAC4SAAAxEgAAMhIAADMSAAA0EgAANhIAADgSAABEEgAAWBIAAGES AABzEgAA6ubi2ubixeLBrJ6PgG9jVEg8AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAXFWgVeI0AFmhyWZwANQiBQ0oUAGFKFAAWFmhyWZwAQ0oUAE9KBwBR SgcAYUoUAAAcFWhsI40AFmhsI40AQ0oUAE9KBwBRSgcAYUoUAAAWFmgLFz8A Q0oUAE9KBwBRSgcAYUoUAAAgFWhsI40AFmgreZEAMEoPAENKFABPSgcAUUoH AGFKFAAAHRZoaVVDADBKDwA1CIFDShQAT0oHAFFKBwBhShQAHBVobCONABZo K3mRAENKFABPSgcAUUoHAGFKFAAAGhZoK3mRAENKFABPSgIAUUoCAF5KAgBh ShQAACkDarEfAgAVaP5QogAWaOE+VABDShQAT0oCAFFKAgBVCAFeSgIAYUoU AAYWaOE+VAAAKQNqmGcBABVo/lCiABZo4T5UAENKFABPSgIAUUoCAFUIAV5K AgBhShQADwNqPCUBABZoclmcAFUIAQYWaCt5kQAABhZoclmcAAApA2ruDgAA FWj+UKIAFmjhPlQAQ0oUAE9KAgBRSgIAVQgBXkoCAGFKFAAAEnMSAACGEgAA ixIAAJMSAAC8EgAAzhIAAM8SAADQEgAA9hIAAAwTAAAnEwAAQxMAAEYTAABH EwAAbhMAAHMTAAB4EwAAfxMAAIATAACEEwAAhRMAADEUAAAyFAAAMxQAADcU AAD06Nno2ejZzejNvrK+pvTo9L6Oe2V7TT8AABoWaCt5kQBDShAAT0oCAFFK AgBeSgIAYUoQAAAuA2oAAAAAFmgreZEAQ0oUAE9KAgBRSgIAVQgBXkoCAGFK FABtSAAEbkgABHUIAQArFWhsI40AFmgreZEANQiBQioPQ0oSAE9KCABRSggA XAiBYUoSAHBoMzOZACUVaGwjjQAWaCt5kQBCKg9DShIAT0oCAFFKAgBhShIA cGgzM5kALxVobCONABZoK3mRADUIgUIqD0NKEgBPSgAAUUoAAFwIgV5KAABh ShIAcGgzM5kAFhZobCONAENKFABPSgcAUUoHAGFKFAAAFhZoclmcAENKFABP SgcAUUoHAGFKFAAAHBVobCONABZoK3mRAENKFABPSgcAUUoHAGFKFAAAFhZo FiCUAENKFABPSgcAUUoHAGFKFAAAHBVoMg6lABZoMg6lAENKFABPSgcAUUoH AGFKFAAAFhZoMg6lAENKFABPSgcAUUoHAGFKFAAAFhZomnmxAENKFABPSgcA UUoHAGFKFAAYNxQAADgUAABuFAAAcBQAAHEUAACFFAAAhhQAAIwUAACNFAAA pBQAAKUUAAC0FAAAtRQAALYUAAA6FQAAOxUAADwVAAA9FQAAPhUAANAVAADR FQAA0xUAAPLk8tbEtcSltaW1l4XyhXeF8mFXRQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAIxZoK3mRADUIgTYIgUIqC0NKEABcCIFdCIFhShAAcGgA MwAAEhZoK3mRAE9KAgBRSgIAXkoCAAArFWhsI40AFmgreZEANQiBQioPQ0oS AE9KCABRSggAXAiBYUoSAHBoMzOZABsDaoCJAwAWaCt5kQBPSgIAUUoCAFUI AV5KAgAjA2oAAAAAFmgreZEAQ0oUAE9KAgBRSgIAVQgBXkoCAGFKFAAaFmgr eZEAQ0oWAE9KAgBRSgIAXkoCAGFKFgAAHxVoMg6lABZoclmcAENKEgBPSgcA UUoHAFwIgWFKEgAcFWgyDqUAFmhyWZwAQ0oSAE9KBwBRSgcAYUoSAAAjFWgy DqUAFmhyWZwAMEoPADUIgUNKEgBPSgcAUUoHAGFKEgAaFmgyDqUAQ0oUAE9K AgBRSgIAXkoCAGFKFAAAGhZoclmcAENKFABPSgIAUUoCAF5KAgBhShQAABoW aCt5kQBDShQAT0oCAFFKAgBeSgIAYUoUABVwFAAAcRQAAKUUAAA+FQAA0BUA AHcXAAB5FwAAehcAAHsXAAB8FwAAfRcAAH4XAAD6AAAAAAAAAAAAAAAA+gAA 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 D9/OdejeO5N+rU/472MHVW3ayRcbK7e6OCTVPLmKqL4+foo78sN4bmX2ag/G 76Wyt777I7W5uUtI5ZHo1Kioiqq6/DU18uHeZw2V1r3rXWl3NbOeyV0L3MWS J3NjlaumrXfVBnKs7k2ODHX0WkXH2FHe7voLjqOyk6+5cx80SMc50aqrf9xi PTRXI1fh3onHncrXPh27NdGhsWsGOvoUMcUMcUMfYUdvsejvOumjhumo18kT JmIio77JE5NXxsTOVa5cdz1H9M9vWR9gssKskldCkCPRZkVqa8lZ9G7ju6w7 eldShsWsmOvoUEtxVdhnVXD7KW9aiY8MjIpHaprylRzm+P0jUncs2Us+quLt 0rYURVhiknfqun2RN5O/uQbyhmV18ctRywWEkr2ta1XOeqNYxqaucq+ERET6 k3kuY2+3c1VYreKtXRWr4VFT2Kus0FX6CoqW+wqtLCjE8pq7/L+8Udy26C9u rm0hR8SOvWOkhXmio1rOWqORvJWr9i/KE3mucd2Oglu5fpqWo7d9013YNt3X bFY26ibPbuTyjo3pqioqeP1JnKrvGOL+nzrYuvmMTHZK2BXKvnm5quTx+jVL esJ0rquhc75UtZZxxUWgKiUBVdmbp5oevtr5ytWK6dKyNqa8kWHjy5eNP5/B O7rF3j0rrLblqNOsZmxMldG5sUiuSN6ovFyt05Ii/XTVNSdxCSxliVqSxuYr 2o9vJFTVrk1Rya/RfY7ljGPsWouPsKNJb6J8eVFVMfYVFxxVVINiUXHFCgvo UTH2FExy0THFRFt9hQW3FEoCiLbigtuvotExyUZx19FqGOKGPsKpj7Chj7Ch j7ChQ2FQSAUMfYlVcdfRaGOvoUSgKLQFQx19Chjr6FUoL6FQx19Chjr6FDH2 FUoKKj16GxyrRj7Cjye1mbHdww6/Cc3J+q+P+B+n8Hj03Xi+Zux97+IdlC2N qKqeUOXyfHr0/E8mR6Vn0be2nvu2guHWVxXWO0ki8IrWN0dyamnJHeD5f5/y +PHnvDlmbxz+t+2/iP1vD8fv492dNdXsum757VbPdQq36yNaiOX9nHQ+c+V+ x+Hw9c8m79On93p4/rvJz6XHylz1zLaZ0TXrIqeXuX/Mp9X+q5cd8Gcs49vd 1nr+H5nyfBni57wzbP7voWQO7H8GSFqcp+ou04N+Vo3fjRP/AJUPfZy/LPrw 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 Vl1+Uf1d7XJClwyVrPHJIo3Jxbprprxb7GekN5XlXO7uLRZfyB3CTTtlVbfw njWap9/nx49aj6Nd+fy+7qWt7BF+P3vXOa+vczRSMciJxRI9ddV11+vovuzm /wAdx6HYXv472c6dneNuGdgrWZNrGjaUr2IjdUeq6sRyJ58Ey50a5cuPLrvq 5bn8ktJfyK9vVge/rewhbb3MC6MfwSNrVVuiuRFa5uqeSTou+TO7d9tdeO66 Lq4bl3VuuLi8uYnQMkna2NsTJPDl0aruTtPHovXfVLx4+nqz1fdxWfQXdg9j 3XTlfhSJpxYkzUjm1XXVPtTxp9RudTjznHcJO8hd+Ls6tGPzdUikmXTitux7 pWtRdddebvQnWpvP+M93N0nYdL1CNvIZrp9ysSsnsVaxIZHuarV5O1/g1XX+ HUm3V4cs49er5uhsbrjH0vZXX4t2b4J7l97HNHBFC5sccSt/228dUVX6mMuO 3LePL1roXl7Zv6GHrIGyaw3UszXvRqaxvREbroq/d48lz1rO7nbPu7V930Nx +PxWTY3pfuZFBeTrpxfDbq5YkTzrr9ya/oMzq1y53jPdmC86i96q1sO0WeCW x5pb3MDWvR0b15cHtVW/C/CjreiZubk32eT2ENgtxpY1VgaiIjp9Obl+q6N8 J+hc1jlmezmt5GJ09zY8XVZp4ZWu0+1GxtkRdV1+f9xBeq5vSN9VLDZPuFej lq280LVbov3SMVqfKp41G6vHo52v669tLaC+kkt5rRqxxzsYkrXRK5XI1zeT FRWq5dF9Eq3Nzq0t9bwz9cy0a99p10qTIr9GvkkV7XPcqJqjdUYiImqg7syT 2aWXrbWbsHRSySsvbd7G8o0Y5r3yNfppyd4RG/Iq3Mv3dJl3E3p7my4OqTTw ytXROPGNsiO1XX/Whfdnu6Ry9f2cVqnWOdGr3WVzJPI3wiK16R6cV9pTUmnH lJ9nNby9JYrdviluLyW7t5oWvfG2PgsrVTV33uVy6/K/8Rd1c3jlZtuztYrj qZHNfpYQSRTaInlz3yuTj5+NJEBnL0+zxcc1XJ3e1miu5Ld0bXIkNtDA7lon 3RMRq6aKvjVCZrXLa7t13OT0kVrIxUv4p435KfzsiY5rOX+pvLTX0T3a3neM 90u29BfXEl/NNPBNM6pPasia9Fkd5fwkV7dGqvny3xuM3cN7d6sdJ2UPXtvG vjc5JWo+10XVWXEetJ6/w/w81G9ThylSLso2fj8nX8HZTnq1kvjRIHq172a/ P8caL/aPc7v4xydNN1nXSRXyXM9eP/u2SRojJP8AQsnP+B311aN2nCZ1Yt+2 S2g6ykxVmsZppZGuREY5svD7UXVV8o1UUqZzk+zjntPx1GySwz3Llci0rVY2 orXL8I6XmqKibN87Du03OIr7KfpYbWV74rizfK+JGsR7ZK3Dwq8m8dOHpRep 03jHbXsrRk/X9hGr3XNtFHbzWjmaMdGyNY3KkiO1+9v+ki92dNdSey6FrHPg uLiV7kWlbuiazi5fjnJzdqibN87F7tTePFnsJop7Tr4I0dytIFikVdNFcsz5 PHn09BmnLemOhQLWIUBSLQFWLQ2FIJAopCgKQxxSGNsKRFham4pGVhVRUFg8 CkSiWkKIpCiKJRFIUdhSFEUKKiiUdhQo7CkKKikKGwpFoL6FIUNhQoCkKC+h UhQX0KQoL6FWFDYUKIolDYUKK+hSFFfQpFoL6FEoL6FI9Wgc60UBQoChQUUV IntT7VVP0PH8j4Pg83Xnwzf7/wBXo8XyvL4/9PLcRYVX51UeD4Hg8XXhw44v l+X5fJ05ct1VhVfK+dPCfoeyvMlBRQoKKFAUKHkUMcVVoCoUBQoCi0FFEoCh Q2FChsKFAUKAoUBQxxRttmumrvCevqSrGlg8aImiehVRbdE+fApEpJ9E1FEV miafX0nwKONYFX5LUKAqJQFFobCiUBQoChQFCgKFAUKAoUBQoChQFDH2FCgK FAUbS34pqvyoqpQXUVChsKFDYUWgKpQ2FFxxRrG8ar4QlIysbU/hTXdS0rKx OX5FRmhsKFAUKAoY+woUNhRKAolDYtChsKFDYUKGwoUNhQobChQ2FChsKFDY UKGwoUEFCggotDYUKGxKJQQtCggoUEFCggoUEFChsKFDYUj1sZTlWomMKQxh SGMKQxhSLjKKRMYUhjCkMYUhjL6FIuMopDHLVMYlSGPsKRcYUhjKKQxthSGM voUhjKKQxthSGMWq02ye74T9V+gpHKlm2NNfr/mX/BCVYysSfRNV9iowsL12 /QCYy/K+EFIysK6aNTRPYqM4oqRcZdfgVYmKvoVIYopDFX0KQxRSGKKQxRSG KopDFUUhir6FIYq+hSGKvoUhir6FIYqikMUUjbbXT7lT9C1RbdV8qSiY2wpF xlFIYq+i1VS0cv0FIuM1Pn+xBSMrEv8AKmm/1CMLbOX5JUhiqKQxRSGKopDF FIYqikMZRSGMpaRMZfQpExlFIYyikMZRSGMvoUhiqKQxl9CkMZRSGMopDGXT 4FWGMopDHUUhjCpFxl9CkMZRVhjKKQxlFIYy+hSGMopDFX0KRW2j1XRqaikb /p7/AGn9op2vVxjFahi7Ahi7CkMXYEMUEMXYUhighjCkMYUhjCkMYUhighig highighighjCkMZQQxlBFxlFImMopG+EmmmuibIgVnHUVDGUUMZRSItsq/Io YuwpDF2FIYoIYuwpDF2FIYuwpDF2FIYuwpDF2FIYuwpDF2FIYuwpDF2FIYuw pDF2FIYuwpDF2BDGUUMYUhjCkMZRSLjqKQWBy+PoKrOKnoJDFT0CGLsCGLsC GLsCLi7CkMXYUhiJ6BDF2FImInoUhiJ6FIYiehSGG30KQxE9CkMRPQpDDb6F IYiehSGInoUhiJ6FIYiehSGInoUhiJ6FIYiehSGInoUhiJ6FIYiehSGKgpDF T0KsMTXwiefQqRyJYNb5kXj/AKU8r/6CtdqrGiJoxuibg1mk/wB/3IEenjka hjghjghjghjghjghjghjghjghjghjghjghjghjghjghjghjghjghjghjghjg hjghjghjghjghjghjghjghjghjghjghjghjghjghjghjghjghjghjghjghjg hjghjghjghjghjghjghjghjghjghjghjghjAhjghjghjghjghjghjghjghjg hjghjghjghjghjghjghjghjghjghjghjghjghjghjghjghjgipAqfHgETH2K QxtiEMbYpHp0DLpExwQoghQ2BCiCFAEKIIUQQoghjghjghRBCiCFEEMcEMcE KIIUQQoghjghjghRBCiCFEEMcEMcEKIIUQQoghjghjghRBCiCFEEMcEMcEKI IUQQoghjghjghRBCiCFEEMcEMcEKIIUQQoghjghQCQoAhRCwoghRBCiCGOCG OCFEEKIIUQQxwQxwQoghRBCiCGOCGOCFEEKIIUQQxwQxwQoghjghRBFoAiUA QoAhQRPkpClsQjvUg3CkCFIEKYIUgQpAhSBCkCFIEKQIUgQpAhSBCkCFIEKQ IUgQpAhSBCkCFIEKQIUgQpAhSBCkCFIEKQIUgQpAhSBCkCFIEKQIUgQpAhSB CkCFIEKQIUgQpAhSBCkCFIEKQIUgQpAhSBEplItIhCkCFIEKQIUgQpAiUykW kQhSBCkCFIESmUi0iEKQIUgQpAiUykWkQhSBCkCFIESmUi0iEKQIlMpFpEIl MpFpEIU/QIlIEKWwI7XArcOAIcAQ4AhwBDgCHAEOAIcAQ4AhwBDgCHAEOAIc AQ4AhwBDgCHAEOAIcAQ4AhwBDgCHAEOAIcAQ4AhwBDgCHAEOAIcAQ4AhwBDg CHAEOAIcAQ4AhwBDgCHAEOAIcAQ4AhwBDgCHAEOAIcAQ4AhwBDgCHAEOAIcA Q4AhwBDgCHAEOAIcAQ4AhwBDgCHAEOAIcAQ4AhwBDgCHAEOAIcAQ4AhwBDgC FMEKYIUwR//ZoEYd8CQMAAC4P9sjM4r9HROXcavSU+Zh///Y/+AAEEpGSUYA AQIAAGQAZAAA/+wAEUR1Y2t5AAEABAAAADIAAP/uAA5BZG9iZQBkwAAAAAH/ 2wCEAAgGBgYGBggGBggMCAcIDA4KCAgKDhANDQ4NDRARDA4NDQ4MEQ8SExQT Eg8YGBoaGBgjIiIiIycnJycnJycnJycBCQgICQoJCwkJCw4LDQsOEQ4ODg4R Ew0NDg0NExgRDw8PDxEYFhcUFBQXFhoaGBgaGiEhICEhJycnJycnJycnJ//A ABEIADIB6QMBIgACEQEDEQH/xACTAAEBAQEBAQADAAAAAAAAAAADAAIGBAUB BwgBAQEBAQEBAQAAAAAAAAAAAAIBAAYDBAUQAAICAQMCBAQFAwMFAAAAAAEC AAMEERIFIQYxIhMHUWFxFEGBkTIjoVIVsWIzQoKTJBYRAAICAQIGAAMIAwAA AAAAAAABAgMREgQhMUFRcRNhgTKRobEiQmJyBYKSFP/aAAwDAQACEQMRAD8A 5mUpumm7IsWnHra21+i11qWY/j0C9Z3XLizjTEp7LuJ5XHra7IwciqpOrWWV Oqj8OpZdIeNx+fmhmw8W7ICaBzVWzgE+Gu0GHXHGdSx3zwLplnGl57YPPKe3 /D8sLRScDJ9UqXFfovuKggFtu3XQEiea/HyMWw05VT02jQmuxSjAHw6NoZVK L4Jp+GZxkuLTXlBylKUJSlKYxSlKYxSlKYxSmkR7HFdal3Y6KqjUk/ICaux7 8dguRU9TEagWKVJHx802VnGeJcPGQ5SlMQ0JoTImhIymxNCZE0IWJGxEEMRB CxI2IghibELEhBEWGIggYkIsRYaxFgY0KsRYaxFgYkKsRYaxFgY0KsRYaxFg Y0KsVYSxVgY0KsVYSxFnmxoVYqwlirAxoVYqwlirAxIRYqwlirPNjQixVhLF WBjQixBDWIsDGhBEEMRBAxIQTYmBNiFiQgmxMCbEDGjYmxMCbELKjQmxMCbE LEalKUhT+Wp2/tXg/ddz/ckeXCost1/3PpSB+jmcRP257QYOzA5HkWH/ADWp QhPwqXedP/JOt/srPXs7X1ktK/y4P7jmP6+vXuq10i9X+vE6jvlPU7T5Rev/ ABAjT4q6sP8ASXZXA/8Az/AY+LYumVd/Pl/EWOB5f+xQFno4nJq5qjPa0Cyh c22pVP7SMdlQfkSmsThuQ/yl3IZVZ1xqsg4mOR4MKAN9n52Mw+gE5xysjRPb 8lGeuflpJR/E/eUYSujfzcoaY+E22/wPj5OPzXI9z52RxGZVhjAopw2NtPrB ms1yX2+ZdOjJrOFXs/n+8uaz+QycitMdbmobPZCq2+h/DrRUD1Hk+Onz1n7B 4jMXF7f5PuB/25FuZyA1/FELJV+tdSzyd2tk4PYrVcSrHdVTUXqBLCp9u9vL /cOhPzn10X212eutRjJuNKm4r8uPreevE+a6muyHsscpRSlc4KT/ADZ+jh04 HG8h7VZdOC+ZxPI18iUBb0hX6ZYL4itlssBb5dJ5uK9s8/luEo5anMRLclC9 eMyHw3FV1s3eBHXwj8XxPuHw3C/cYN4wcEg5Bpc1hxuA8VdSwZtB0nZd5crf 2n2nj4+DZsymFWFTaB1UKnnsHz0T+s+ue63cZQprvrtlOzEZJLKivqU0lhdO R80NvtnGVtlNlUYV5cW3zfJwec/acgvtLybZq4/3tYxxWr3ZRQ6ByT/HWm7V 9ANdTtHWJle1XqYtt3CctXnX06q1JVVBYeKb0dwrfIj9J2PP5GZjdgPdx72X ZDYlA9YEvYVt2LZYW6sSVYnX858T26w+R4LgcvkrsG237xw9VIaqoiupT/I5 yLKgFO4/kNZ5Lebt0yv98U4WKuMHGK1vrnPIb2m1VsafTJqcHNzzJ6F0xjmc n217e53O4z8hmZC8dhVs6l7F3OTWdH8pKBQpBBJM+o/thRm4D5vb/M18gU3A KEGxmUa7BYjto31E6HF53nu2cTMt7k4R6+Ksybrq7KLaLWrGVa1vpOgfzDc5 83SenN4Ht3l+27uY4dH4wPTZlU20FscAqpP8lSkJp5evTw8DFZvdyrNTs01y mowcFC2vxJ88/MkNpt3XpUNU1BympuVdnmK5Y+R+ve1+wOT7kq+9awYWBqQt 9ilmcjx9NNV1A+Oon1s/2ub7GzN4Lk6+SNWutIUDcV6lUdHcbvkZ2Xexu47s l8fh1b09lOOpqH7aDopI0/AqNPznn9usG3gO178zlf8A1kusfLIs8uylUUBm B8NdpP0klv8Acyrluo2KK9miFOlPUvi+Zo7KhWLbyg5P16525a0+FyN9hdnV 9v12Z91yZOVlV1hSq6eiNNz166nqSRr9J9XE4FMnk83leYtx+T9ULTiIaVK0 VIzvs8xfU/ydTPl8VavDe39/JKvpPdTkZqDw82QWan+jIJ5u3arOG9tbcmpD 9zdj35ChRqd9m5az0/27Z8lvtnK612ZlK2NKeEs+H+lLC5H1V+qEaq1XhRrd zWW8ee+cs4Hu7gqMLnc5Uy6mVx90qVIERBa77aQFJHlAHWcrPyQVJVgQwOhB 6EET8TpaoShCMZT14SWcY5HP2SjKblGOnLbxnPM0JoTImhGwGxNCZE0IWJGx EEMRBCxI2IghibELEhFiCGIiwMSEWIsNYiwMaFWIsNYiwMSFWIsJYqwMaFWI sNYiwMaFWKsJYqwMaFWKsJYizzY0KsVYSxVgY0KsVYSxVgYkIsVYSxVnmxoR YqwlirAxoRYiw1iLAxoRYghrEEDEhBNiYE2IWJCCbEwJsQMaNibEwJsQsqNC bEwJsQsRqUhKQp/LU6vgvcHmO3+NTjMHHxWpQs2+1LC5LncSStqj5eE5SU7a 2mu2Om2Kks5w+5yFds65aq5OLxjK7HUcV37zfD8VZxOGtGy02Mch1c3BrfFl YOF1HiPLE4r3C5rh+JTh8OjFFFauq2slht1sZnLFhaBrq3TpOTlBLabeWrVX F6pan8ZLr941ur44xZJaY6V8I9jqb+/uYv4Edu+hjV4YpTG31pYLNiADxNhX VtvXyz18F7l83w2FXx71VZlFICUm3cHVR4JuU9QPw1E4uUj2e2lFwdUWnLU/ 5dyrd7hSU1ZJNLSv49jq+V9wee5fIx7L/STHxrUvXDRWFTvWwdfV825hqPDd PJ3L3hyndK4ychXTUuMXKLjq6gl9upbe7+G3pOflFDa0QcHCuMXDOnC5Z5hl ubpKSlZJqeNWeuOR2Hb/ALi83wOImBsrzMWvpUt24Og/tV1P7fqDB7g7/wCd 7gpbEsZMTEb99OOCN4+FjsST9OgnKyhWz2ys9vqjrznOOvfHcv8A1X+v1eyW nGMZ6dju+O91OdxMZcbMoozgq7RZYGVyPDzlTo36Txc/7ic3zuI+Btrw8SwA WV0g7nH9rOxPT6ATkZSR2O1jP2KqKknn5+ORXvNy4aHbJxax8vPM7Tg/cvnO Gw68CyurNopUJSbdwdVHQLuU9QPw1E8PcXfXN9x1/a3suNhagnGoBAbTqPUZ iS2nw8PlOZlKtntlZ7VVFTznOOvfBHur3X6nZJxxjHw7HUcl35zHJ8J/gLaM arD2V160pYH20lSo1axh/wBI/CejiPcnuDh8Cnjqa8a+mhdlTXo5YKPBda7E 8PpOPlM9nt3DQ6ouOrVj93cy3V6lrVktWNOf29jVjva7WWHc7kszHxJJ1JmZ Sn0HiaE0JkTQkZjYmhMiaELEjYiCGIghYkbEQQxEELEjYiCGIggYkIsRYaxF gY0KsRYaxFgYkKsRYaxFgY0KsRYaxFgY0KsVYSxVgY0KsVYSxVnmxoRYqwli rAxoVYqwlirPNiQixVhLFWBjQixVhLFWBjQixBDWIsDGhBEEMRBAxIQTYmBE ELEjYmxMCbEDGjYmxMCbELKjQmxMCbELEalISkKfy1KUp3RxhSlKYxSlKYxS lKYxSlKYxSlKYxSlKYxSlKYxSlKYxoTQlKRlNiaEpQsSNiIJShYkbERZShYk bERZSgYkIsRZSgY0KsRZSgYkIsVZSgY0KsRZSgY0KsVZSgY0KsVZSnmxoRYq ylAxoVYqylAxIRYqylPNjQixVlKBjQixBKUDGhFiLKUDEhBNiUoWJCCbEpQM SNibEpQsSNCbEpQiRoSlKQp//9kAbh7wKAwAAK27m/f9oxMNXvQ88WtLRpD/ iVBORw0KGgoAAAANSUhEUgAAANsAAAAfCAMAAABZJEjQAAADAFBMVEW5wrDh aSXliXGGpMH52FUpV5p5qkGWvFNGiLbJOCb33ndWiTv0mSHjeybsuKf1oyBC djfx8fHZr6P30nvTzszi4+FmmD40datsnsTS09P70yY0aDLTolPa1Mj71Tb1 5djVrGvlj1UsZaHqsiKZw9n75aUzbKa70nX2tB7255ZXeUpuhWrTQybW2+T0 yFjoqJP88/L422LaTCa0zm98q8v6yhr9/f3ImmbG3unyjSGCskSvr6/C1nuu vKbYiybWYkrtxx3244ne7/W4xtjeVCbf39/5+fnkkiWsvI3p6enOwKx6l076 1kC1u86Mtku72uc9g7Ojx9qItNC8NSXmnCT2rB9dlb5rlEdjiEOOpXzch2Wo s8fJ3IL24H35xRz6yDqXsmr33W1beanprCKIpVWTrVjo495ihazOWkTr8/fk iiVlmcBRjbn21Mr4vxygwltLdaZ0o8fkgiX52Evs7OzuoyL32ZmSvNWXq4n7 0R3Z2dnnoiPNSDT+68zWTCnsrCrd3d2syWacv1dqirKt0eHMjDS11eTujyJu oD93p8n//fm3vbWlxGDu0RtOfzk4fK/BLyX2xbwfZp6oxmGOuEzNPifv7++f n58RERHPz89hYWEhISGPj49xcXExMTFRUVGvy2nMzMyrz+BekTz3zWHrnIik rsLcuI5CbqXs7efcXDPszH+fs4TwxXLimywncKfklTHlZzLQ1d19lm54lK+d p7n34KyDr87r7vObrcmPttCdqpaBoUjY0dDlhTHsvR9+mVKFnMTQRyjH0a/s sTibs3p7jq5/jbSCgoJrjlYpap+uxI7MysWPsVDn5ubfm3rk0KPBybz76OTW yL7tczGivtPJ0cbiXiaHtEfnqyOTuk99nsLaljD3uR3alybsrzevw2/LsoXH sJfU4b7XqJfQu5ONocDgjSq6zHjv0Yzzzon32YRGYp//8NTld0D39/f529f8 +PHmmCXH5O3V5/D610frzsbvgyPHx8rGyMZIfrKAgIBBQUG/v78BAQH///+e +wgXAAABAHRSTlP///////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////8AU/cH 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 Ds+VTdNa3U8Yj/1F+2i/tt6AX3L1PUOrljBlam+3toV012/R/UfjRXqoPkZR /sUH6bph3rzp0b9TVz8BxZ/1EQ3H6hzq51N2sLMbjvqktzlRD+0Kt9VPDkaj bcokSLLM+AJJZHkcgks7FmPvNCJpH2HxH40UGmAvZtoTNqvtNBasLWhPjM2x QCb+2ibvIVGp+NDMYHaKIvfaOelPyItgbjM/ntqf5nbRaZms+p+k86EYdzKb ji9Fsn+XKba7TVLbL2F4YJ6cz2U7jz51PkOxGjH41B0/6ENuVSz8NKa2/sgI qRM+4+I/GiO5xjJYn40NiB3HSiJFoYxbjQex3J55uHf8KUt3fKkDa8DSk9xr 0DPA4Nc8PdamSMd1ODa8DSSG5GhpVuFobc99S9PP/wCljaW/MX7aiB050/Ec DPx2PASJ9tNxb/iwRqvU9X6sP8PkdpjoF0w2xLVoeorfHmPbHcfCgPTATiG3 +2teb/Fryf8Aqav6DohuyotPvVZ6oNeNRYwJy4we2puqcR7ajfTUqhXB/QqP 7NB5R4R7aNTf5RQB92g0oN1vQo52OZahU2FqvyXCC4PCqcA1Aq9N9N+wfsqu 7EgF4QvIP4zRTK/kTG2oQ0OwAS6Nb7xonmf5Sc8LIao3x5C8MEYAPlLpyp8+ grsFW8oMB92nZF7H2Ubbr0BBUhGptRFh+XEKHwjtom6+CKg9jkebEnkDS3bs Ndc1xLW4VukzihiDwprsTyNKCx4CkO7S4Otcgibz2GnQXOZBf8a/bTfF2U7H /wA5j3/Gv203D9GDlep7DmL/AIZh/wC2P/LWd6WLYhHKtLlfyH/+L9lZrpZ/ wZ7iftrzXore5qX7FjEF8yMd9U/UfVoMJvJQiSe9wg4D21MsrRSeYltwBteh 0XprI6izSsVMjkksxvoaWv40+rI9FwUVL20ogLkeour5S7PN8pBoFQAfOqw6 t1PGYF5PMXjtcA3FGupei+q9Pi/UgB4+1eFAp8PLZATExtodK2474ba1dYI5 MOWq1T9jU9G6vj9RtEv5eQNTEdeH4TWgmBCn2H7K8th8/EmSZCVkQhhyOlem Y+WM3BTLUAb0O4djAa1LNjrV9VdnuDHZxFlqir08XaM95q/nD/A5HcCKpdMN 3jHbe1XupH/8+f2UnK9BuAbhD8pRr9IpMjS/GpMIHYBfQKKTIFc9/QBTiGmv bRRuMQHG1D4lPA8yKJNcMi9grrfsFHmPirju7qQG4vr8K64/2FboM0iqWpWv tAtw76aNvb8qcQSLLr7q7RB4GeKnxG2TCex1199WYsRNgZgSx1twpHx1jeJl BHiF7+2h111XkHoej8z1qZg0B14xA/Ksx0s/4aUf2z9tH3bdjrbnEv2Vnenf 5eXuc2+NeY7aX8pNaUR7CZUgWM9p8IHfRroSzxoquLk8uz41ThiLxoZPFA7/ AEEA2I5in9S6Vmbt0IXbILrI24WP92pN1yf9b08zbjo8detLqng1rs/k2Zbx 2sf+FUZ8PGWBiIVHMC1B+gydbGUMKWVpY7amQXX3Nxqv1z1H1GKWTExlW6Ha ybSdB301O3ailLzqF5kl13o0BfUONjN40UBlGm2r/p54h0dlmVlKklSOFudB psqfMQmUKbCxABVh7qM4ciL0sLGCtkIO7je1apvSiVoZiyxe7tRQvMKYGPi/ kSY8m8NxF6d1g7enzW4Xt86D9HciWM9gq/1eS/TXN+J1+IoWvMaRoT6WQ4Zs luwCunJN/wB9R4reH2iule4ahOoIGwkki/M0Ucfmr7KFY1rr7aKtrL7BXN/o ctzyXc3bSgsedM140tzXpwYpJNxFiGv3VYTIKgAjw87EVTuaXWg6ph6mi+uW RazFuVqeZPOMepvuFh76HBmFTQOfOjH9ofbU3jSTa8ClbttLzPWrWx4wTr5S /ZQHBXbDL3OTWhYfkRkfgX7KF9NwczIV1jgYAyNqwtxPfXkJN9aXibtI+BJh TRtFHBY+Ysm4n7pBrbYyRfpB5o3KdVFZeTokvT0Ehu7/APMI5X5UQgnnOMrw L5zKP5Zbbp3GnWFpt2UODVizzVJcF+FgMj8pBdTbapG4acxQDAxkysvKDqA2 8m542JqTLy0yVM7Ys2Nkpp5y+Lh91ipvQ7peYsc8rRys8mpcMD8NapTBCd04 13ThjZMvFq6FXrvT8LEd3g3eaSA1zxNROPLxWUC1oybe0U/qvUMaTNSSY/ln W1r1HLPFPBkPEbhUIItYi/CjeltJ1Rktejbgr9JY70/hNqt9Xc/6d7WAt76q 9JHi4fcqfrGmAn8Y+2pz9aFX2six5LILUkkh2tpUcTeDSopHO1r0zeonBcw3 uyA8zRa95WtyFA8FvGl6MI3jkPKmkBR/7K6IeErjv3A0w+iuj8ppfcRW2XoP RCoIxQB/E376UdC6IRpii3buYftrM+6y/wDtb4FVjx/2mIHofpZvaab5V3/Y vSz/ANRKPcK3S+n+ikWGPYdzt++l/wC3ej2FoG/+x/30v+Xm4y2fsd+PF/b8 jBH0L04f9VKOzQVYxv6eQTENDPLYG92W1bzH9M9OMqOsLKqm92kYg+4mtDDi RCy2sq8hwrdgp3ORdVrtp7SoJXeKv211AnTukvjOrum4RgBWbsAtRnyfzozt 0f2cavqihtjJoRwNNES+dEgNwLsL8u6vSxdrWiSiZcv1M9skv2Ak2J5om3C6 ljoPhWWUHpOacPJN4Hu8Ep08PYfZXocEKl5kI53t3Gsx6tw8DH6dNk9Qm/TR R/mQzgXZZOQA5g1bL2lclHCiy1OxZ3jsnOgPyMXEmXzYJ9snMX0Nu0Vnpiiy mCI/mEEt7KCS+psVLJe9xcyRBvgUaxU0U6NMJ8LImfFkSVheLIk++h5beVQw dm7W6Xolq/Yrm7xdMJzJAcKJoJncb3uDGeztqXonQ1zRNkTF1hPgUKbBj2NV wY18W6C24cu3urR9Mx0j6fBCmoKljbtrZn7en40koSWxix3bu3PIBk6DHjXm xb7SNpTkO8UI65A6Y8cZUpdxa/Ot/jRl8dNygWO321B1HAiaJllQSRcVvx7w a8nN2ir9ddDbTLwzzuOCTZ7SagljkAItqeVHsvpzYpYxG8N7XPK/ChcqPuA4 msL6q21UF4TWg3EhdWRmolGdZL8OVV0R1C35VKrAKx53odWoOk2sPUMWVdzB yNRoo4g27akiz8STxHda+3Rf99CsXSIg/dkcfOnYwOx+6Rq89tFoSC8ebhux uzbQSNFt+2pop8efd5TbtvhA2ka99A8ZdJ+ZEh9uoBrQYuEsUAeM+OU72Pfa tHaYPy5I4rqxMrVUEIiCkdgLAHX9tXY1Hl6akEX99DVd1iR7W2tskHYDwNTR 5sQjnic7JYRcC/1C+hFfV4cSaThLQ869nJfmfaoP3zoKXHtvZ2NgBtBqpCzS SgnURi9u81YidTLs4pGPEe81qWObJJbakuqFI2SRsefftLGxso+97KDdUxX6 rjTplxLJA6EGBiCR/d7aPNKrMtxcDgTQrr+YMPpuTLEih1Q2bhYnnenfXWXW I8xZrbRyeI9O6FHmeoP9LLmOON3IJ+oqvBa9BOLHEpjTVUFieRsLV5+M2TE6 7j9SVzLF54WeY/SS/hZfZXr/APpSLKq33hgH2rqLHWk7ZpUso+pW1fEPYS6l praAb0vp6xOZNvgVSy34XIq/BDtihfhbj7CavPCViksLLGpUH21E6eVggk67 Rt+N667Tb8ilVC0FKIpRFsBuLfCq0skck3lDVSpvVXK6gElQEhRtdlJ56cKj w5BJD+o43AUfvqF8aamB1aCq2J5sGWlrkEgewcKyOdjvjOrkflSjwPyv+E99 bnFsZspfuki/fpQvqGGjxyQuLoDcV5Pc4E9VxJqxZHOpmibIO6o3cKjWq1Ni OinaQ2z6l51QZxa5F1uPD215rTT14NEytDZ4w/nL2Sn5gGnQCxyF7JAfiBTY haXIA7VPxFPjt52SO9G+VYWtNCw/CXfPkJz3hviK1GKN0YQG+0cKB4kUaSPM Pqktf3dlHMXwpuAr2f8A5+BrXm5kz2lk7BIkd2H5ZU7xQDN8yXJxTEpPjCtJ yKN+LvBozlszYsi87aGgmLK5yFS91F93YbV9FipGOJ+Rgtb6jRzSDDhZ+Ekh sg7eQqxhY3lwjzNXfxN7TQmEnKzLuSyQcL9tHFk587VdOOfQWJ1HNtUbVFZH +ojHF9K5bBtrzukd/wCIjStYoNrsawP9Tc1ZcbE6cWCpI5kkJ4WQVPLazxuq ev76BhLXwPMn2ydOaFvBGmp7mHKvaPRuS+Z0HCzZTulaIJuPGyaCvDmbzh5V 7wRHj+Mfi9or2P0FKW9M4zX+86i3dUqN9b4+mPgLX9TRT6wyi3EXPvobnkKm LCfvkC3sF6vThPLYl3uw7azuZOZcqMuxKwqdmtjcimstkkPPsBOvJLLjyIpC yY0m5GH4Od/dVvpk2OY0hilDbQGK3+dUJJ1/PM5tGQQxPMHjWT9OTZOQs7wS qxw5DdSbMY76MvbapXvqk+f0ClqenwbIt8hIvIb1UymDrI/LlQ3/AF/o5TzJ JGaRQAY7aH2WqGbqrzwb8eHYsvhi3fbWTKvRryK0Y1VVsnywN9wLjs7aA9Yx z07JaM6xPrG9tO8GtPirHiQb1ZHkbxOxIuT2ChPXBkZEDvFdmGvlELY/GsGW itpGu+hppeHPAfW4nl14qpPuuKfCAcuVTpuRL304XqNf81tvq8dh7jRFOkY8 ksc0779gttU2HG+teVgxWvfTaS17wnPgT4qKgtIdBqD2ir/6obfKh27+Qa4v THgMsaiCZoSvAAAr71NCp5urYkpV4YM1V1vH4HHeVvX0nbY+hVa38lJhyWmS /l9QkjhaGSE7nG0SKbi9ZT07mSfr8xJ2JIfy1Q8Bt7BTM/1jnYkrpNFHC1rB GUi3eL8azeBnSRFpxKTK8hlD89TW93aS9zPpO8nruIvlR3bR2O40SinQgG/i 7K8yi9WZpAE0gYjS4Fqu4/qTLmcJACXOlv20ZW8hnwR6JNOsUbSOQFUEmvF/ XOfL1PqsMZOyCNCxPYCdGrdZOVnZMOPgSuDJkNdiBayjiKw3rfHQdVK45A/T QruvoD3GjdrojzXuJaQFIsUsOhWNYNVbhx/fXpn9OZw/ptTa2yWRSvYa8lhf 9Q67ztgTRV7TzVq9T9B5CjokjJZR5zWA7hbWkVpsm4ro1qxca31k0ubkgIF4 btPdWYzcyOOR5mNlQWHtFXepZmm9mHi4Vh+uZ5Zlxom8T8e7WutkUaOfTVlP j8CHMzycLLkLXLXIrJ9FnmjyD5DmJ33AsOdx9J7qKdWmWOJsZW+lNSe2gvTG 2Tox4EmsOe0KU9a+JXHM+vkaHDjVgWnE00qmzY6DwdxuK1PS4EMCT5RkJsVT FB8KjurLxyShGWN2jMh2lgSNK3vSsVMfHiGVMjsqi2w6H23rLXuOusQpXnoV 6Ol+KFjkRVC+UEC6LcA/bVWWSGRish2tfRhwv2VeSbFkj8Tx3BN9xAOhoR1T J6fjQyTmRQVGgQg61B9UxKKL0DIxZnnx5h4US+4tYC3HnRRMmAv5ZmQMeG03 +dSKEZQNl7dutc6SKAY40KW8SgC4odripWEk5nkGS7e5FmdUbEOkLNGoBaUW NqzXW+qJ+oTO6dIfGo80dpHZRvKnfyXg8lL2tuUnTuIrEvI0WfH+mJJEv0bd wBXxX2tXr1apVtJW05fTBltq48y7kdVn6jiCMYxyy2mzyjLqOw2NR4/o31l1 QDJg6POsbAKhMbKLDu2k1ayP6ueslLY+NkRYkaHbaCCNL203Gw40Hyf6ies8 u/ndZydvYrlB/wCG1Yb91lbmqj2WvzZZYIWrXxk1nTv6V+q5PHl4jRqDoqlb 27/MKVpMb0RnYCWWPHxiOLz5ESt8mavGp/UnXZyTN1LJe/HdK5/bVB8zJkN3 mdjx1Ymg+47h7Wa+D/QdYaLlfD+p7oekQQZYycrrXTYgi7VRskNbt+lazXWf Tno7qOTJldR9WQqz2vHjpI66fbXlLSMb3Yn30hPOleTPZJWyv5h/HT+2fdI9 Bbof9NomLSeosmQmwIhxgBcc/GaLReofQWDEIYMjMlVeO2NIwT2naa8mua7d SXra/wB92/dhqq12rHwPT8r1f6KmjaI4uZIG4fmBTp7qDyeovRYfzE6LLI40 DyTm/wArVh7kmkoLHCjqZza8EbWT1Z6d12dCQ35vKx/bVdvV/SVP5XQ8dfjW RvTP+FN+KvLbB1eCRqpPWMf/AC+l4yj+CoH9Z5R0TGgTssnCs0T200kW0o/g x+EnO7/2Dz+q85tdkQv2IKodR63kZ0AilVBY6Mq2PyocdKsYcImcswuq0348 dPqjYCdrvpnc98jNgALsP21HlZE0LoAAEt4iDrflUyKygEggCgXWMkLIxZiE IAspru2q99mLexS6z1HJgyUzI0Coy7ZUvo1udDYplmkk60ccxM+5Fj5W8s+K 3fVFOpf6zkjFkdf0KSjc5IVrr2d1H5JIfyUWRNiybAoIsAQRSd93CSpixptt y3HI/b4m/rZ5zIbyyNwJYn41EamygBlTqOCuw+dQ2vegoheg3L9RCaaSbUp7 qaD20yCjiaSuN6Siczr11dXVwh1IeNqWkIrkATWmk9vCncqaTpRQGRns7KaT Tjwphqq2FEvrRzokLzY8qqulx4/2UC53NEMHOmxYiqcG41POrWxtV3KYXX8i b4N9DndRhJmiynNjYgsWB9xqj1fryT4eVIx2ZcYAeMcPF9LL3GhfSZMjMKL5 t/NO6w42HGl9UYkMXkSA7Q/hkA4kDhes3b2eLK6Nt+TNOfGr0V6JIDYqrHGC Vu/E6czrVtZVax2nTjbTWh4cH6GNqersNQaresuWNRpJV4RPKB5jEaA2OtRE 2qR23EMOYFRnTWlMr3fqM50nHXnSta9Jypzk0IdLGkOlOt2a02zdmtFAbGnW lAPHl20x2WMeI69lSYytKwVztVuFqMaSJ1awJx4UnDQ8alzYP07NtJ3L901U EwPHjXVTalHSTXtUbd9J5imo2fsF6ZVA7HE1GTSMzfhplzVOkR2H3pyTEDaa ivXLYEE8L62o9Mo5Waco3HpTCmxsaTMyAUVtId2h28yPbQb1FmyZub5UYYxx 9xtXV1YqdP8AlX6vv+RvydX+Lj6NvmDQkv3VJ77Gnqj/AHlb3Curq0MlWYLq IxRGCtwtwpHjlGoW/tFdXVH+QrGA5PDYo/u0tsgjVfgtq6up2IMMMzcdw9gq I4kjkKd5LEADvPCurqNZ4OcE3WPT3U+h58vTep4742bDtMkDlWKh1Dr4kLLq pHOqqGRQAVZCNLAEj411dVLba7Ev5LxOfzZAQQzX4kg0zYQPoPwrq6urHGwW IQ/JT8KYVk/Cfga6uptAEZWT8J+FNKSfhPwrq6mEE2SfhPwpNkn4T8K6uoo4 /9kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AHcHAABEAGQAAAAAAAAACAAAAAAAAAAAAAAAAADgEOAQegKCAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAE8HQAAACyBArwCAAAAAEEAAAA CgAAYwAL8EIAAAAEQQEAAAAFwR4AAAAGAQIAAAA/AQAABgC/AQwAHwD/AQAA CABsAGcAbwBfAG0AcwBuAF8AMQAxADMAeAA0ADkAAAATACLxBgAAAL8DAACA AQAAEPAEAAAAAAAAgGIAB/CvBgAABgaqPJLDDjZfqcPUY0FUUNAz/wCLBgAA AgAAAEQAAAAAAIwGAG4e8IMGAACqPJLDDjZfqcPUY0FUUNAz/4lQTkcNChoK AAAADUlIRFIAAABxAAAAMQgDAAAA2vi2jgAAAMBQTFRFr8bYKHKskLXR5mAx DKVWTIa2HGmoEpWIGJHO6a8v8JFMAVql6ufkYZC0kaq92tXSPH2vq7vG9tnG dKjP1dzg6rWMR5fCnMmlT7Vk+Mch8aRJ7qlyorO/AFWj2ePp6ng/8vPzzdTY 2LNI6ePc8cmqwsfHzoVlVaHSlLZvapm+9fHt7aBj8u3oAEucvtDd6Ovs7vDw vKuV8+32XW27Z7iEDWGmgXygbb1rgqC2yaRee6PCAFCg39/e2pZYAF2mAAAA ezhbEQAAAEB0Uk5T//////////////////////////////////////////// ////////////////////////////////////////AMJ7sUQAAAABYktHRD8+ YzB1AAAADGNtUFBKQ21wMDcxMgAAAANIAHO8AAAE/ElEQVRYR+2WfVPqOhCH k0IjEFpaQUVtVMTKLcjb4QRLy22//7c6u5sWKpfx6Bk5M3fG/YdMs+yT376k ZfnfNva3gfk38RQp/87q/zKrT7eti3b15Ceu49Pt/X2tNplXkCclnj+1gAcW nohYVYKI89sW8Wq158rWF2pkVteaVcQA0CgE4t3++RcSR5eNxqhrlbHPL3bA 2nPnNMQGWcm8mFSIg5MQB6CRzNpCfJiKsoqQ1dMQc6sgNkaz+TlK3CGfeyfR mPewkmQja3nRQis750Qac2s0GhmkvdrcTG4AiRdArbY8kcackMg8a6zWk5vJ BGUicomVLewLpwMi9rqEPDs7W62eC5EAvH/vznkAW8B/76xoVIwzi0bB7ows 4tzh9m7Ud/4simAUWReYAKzz1foWs0oan98hRp4NxnqJzYXgEaC7HFe2GWzH 40JLpTX3XHpwie6e37ZgQ3CePCCyUa/XQeS/N2UhN5UyHn5ZiWk6naaxk6Wp UqmMeq5QsFJTAch5pGWqZCalVKl2kKinYKkTafJPhb9g3UsAIhF6x7RO87Fy 5RwStcyyTHOp4CfLlHCEWWUp7y26EnDIQyelAMloufNHrzkjYt1brUliq9a6 fodomfgmJi1UsZSaMU27gnsCHkqlkrFldotDwDF0MP5xRcT6av3YvAFrXjc3 lXE80NhNDUiTVrMyS6ndCIFSJGHo20plWkTbpCBqqK5Bx+N8+xOBfXv9eG2s WR3HA6JtNHquy00EEQVQPCJGNv0KFw58F9mxG8wGxl/y2E+Ml4zhCyN87ff7 rz/Xm4L46FdeVgdEz8gIhuOEVtIOxwNeaCMiZNUbWbO7zvZlnOdmS8ed8cD8 VSNxePUK1u8XGpubEOft+A1AyhCTdylAFm1zVhADpyyy1sIOsOFn1FeK+4Ap 4AEGD5FXr//TJJEbv/IFAN1WoefM1M6GvFF4qYOXMhYP3bKfqFO8LlxqlErl gb9pKyl8UJ7nV5DWej3oXDSbzc1yW5X4lmhaVYKw3CSJYwBTIW8wj3A4SlPC zV3cktKBcTNw6RW3C/ZrP/wxf1oug+owwmneaCyExUA0+fXCh5yOITNnkM8T Mx8mEyAtQtVSRpBU6lqpEE4GSPgH9NgWn7DK988bYtGNmEpzZMovTgxUFP65 gFtV6xKpXeOvY/B3CvjuAu75YflhnFiX3p7zhmiEcX+RW2Y49vnVLt2NvSGD K5egMC/kr0QAG5yI1KqFveyqN7NiG2IW9oZYNALUglo1y+JhmV8RuI7l8GTx 0G6HNIYSrkAicqwddS1cEyD3P7YYbrf7F2SVyCB5EAFrUeYXjkxhped6cJUq GUFF7ky9uSFCT0Ghyjk5RoQjPOyPUSV2TSodbBxaYX6ZeWj7HtVTerbj4cmg c5yi2OBvUU+pslWPCN09qhIvKbZw98J2+ZV2x8iA9xS+sOBXFI2TOdiqpiDO lkXJe7iD6RCQNpWKoA3CaImtauPrUalomFsiLYcDtkUcelN0otpxcgKixStt eZRd1YjvcSE8H8pCK3g55PnILFE4szXK05BbYbudnk078AUAF0bh9cIcp/qJ cYRZJVrMRwNMb4aLIIRWpZXvU5itZdNHB7dd3BoYfxobs5zN89ms8t12TOQn v+V6LIgTNwh/E/WjnfObkpvt9rw9fwGBf2yf1PjHnOPz+AXhPhDiW+MHkvRp l18VSWz3JIEZxgAAAABJRU5ErkJggncHAABEAGQAAAAAAAAACAAAAAAAAAAA AAAAAADgEOAQ/AeCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA DwAE8HQAAACyBArwCAAAAAIEAAAACgAAYwAL8EIAAAAEQQEAAAAFwR4AAAAG AQIAAAA/AQAABgC/AQwAHwD/AQAACABsAGcAbwBfAG0AcwBuAF8AMQAxADMA eAA0ADkAAAATACLxBgAAAL8DAACAAQAAEPAEAAAAAQAAgGIAB/CvBgAABgaq PJLDDjZfqcPUY0FUUNAz/wCLBgAAAgAAALsHAAAAAIwGAG4e8IMGAACqPJLD DjZfqcPUY0FUUNAz/4lQTkcNChoKAAAADUlIRFIAAABxAAAAMQgDAAAA2vi2 jgAAAMBQTFRFr8bYKHKskLXR5mAxDKVWTIa2HGmoEpWIGJHO6a8v8JFMAVql 6ufkYZC0kaq92tXSPH2vq7vG9tnGdKjP1dzg6rWMR5fCnMmlT7Vk+Mch8aRJ 7qlyorO/AFWj2ePp6ng/8vPzzdTY2LNI6ePc8cmqwsfHzoVlVaHSlLZvapm+ 9fHt7aBj8u3oAEucvtDd6Ovs7vDwvKuV8+32XW27Z7iEDWGmgXygbb1rgqC2 yaRee6PCAFCg39/e2pZYAF2mAAAAezhbEQAAAEB0Uk5T//////////////// //////////////////////////////////////////////////////////// ////////AMJ7sUQAAAABYktHRD8+YzB1AAAADGNtUFBKQ21wMDcxMgAAAANI AHO8AAAE/ElEQVRYR+2WfVPqOhCHk0IjEFpaQUVtVMTKLcjb4QRLy22//7c6 u5sWKpfx6Bk5M3fG/YdMs+yT376kZfnfNva3gfk38RQp/87q/zKrT7eti3b1 5Ceu49Pt/X2tNplXkCclnj+1gAcWnohYVYKI89sW8Wq158rWF2pkVteaVcQA 0CgE4t3++RcSR5eNxqhrlbHPL3bA2nPnNMQGWcm8mFSIg5MQB6CRzNpCfJiK soqQ1dMQc6sgNkaz+TlK3CGfeyfRmPewkmQja3nRQis750Qac2s0Ghmkvdrc TG4AiRdArbY8kcackMg8a6zWk5vJBGUicomVLewLpwMi9rqEPDs7W62eC5EA vH/vznkAW8B/76xoVIwzi0bB7ows4tzh9m7Ud/4simAUWReYAKzz1foWs0oa n98hRp4NxnqJzYXgEaC7HFe2GWzH40JLpTX3XHpwie6e37ZgQ3CePCCyUa/X QeS/N2UhN5UyHn5ZiWk6naaxk6WpUqmMeq5QsFJTAch5pGWqZCalVKl2kKin YKkTafJPhb9g3UsAIhF6x7RO87Fy5RwStcyyTHOp4CfLlHCEWWUp7y26EnDI QyelAMloufNHrzkjYt1brUliq9a6fodomfgmJi1UsZSaMU27gnsCHkqlkrFl dotDwDF0MP5xRcT6av3YvAFrXjc3lXE80NhNDUiTVrMyS6ndCIFSJGHo20pl WkTbpCBqqK5Bx+N8+xOBfXv9eG2sWR3HA6JtNHquy00EEQVQPCJGNv0KFw58 F9mxG8wGxl/y2E+Ml4zhCyN87ff7rz/Xm4L46FdeVgdEz8gIhuOEVtIOxwNe aCMiZNUbWbO7zvZlnOdmS8ed8cD8VSNxePUK1u8XGpubEOft+A1AyhCTdylA Fm1zVhADpyyy1sIOsOFn1FeK+4Ap4AEGD5FXr//TJJEbv/IFAN1WoefM1M6G vFF4qYOXMhYP3bKfqFO8LlxqlErlgb9pKyl8UJ7nV5DWej3oXDSbzc1yW5X4 lmhaVYKw3CSJYwBTIW8wj3A4SlPCzV3cktKBcTNw6RW3C/ZrP/wxf1oug+ow wmneaCyExUA0+fXCh5yOITNnkM8TMx8mEyAtQtVSRpBU6lqpEE4GSPgH9NgW n7DK988bYtGNmEpzZMovTgxUFP65gFtV6xKpXeOvY/B3CvjuAu75YflhnFiX 3p7zhmiEcX+RW2Y49vnVLt2NvSGDK5egMC/kr0QAG5yI1KqFveyqN7NiG2IW 9oZYNALUglo1y+JhmV8RuI7l8GTx0G6HNIYSrkAicqwddS1cEyD3P7YYbrf7 F2SVyCB5EAFrUeYXjkxhped6cJUqGUFF7ky9uSFCT0Ghyjk5RoQjPOyPUSV2 TSodbBxaYX6ZeWj7HtVTerbj4cmgc5yi2OBvUU+pslWPCN09qhIvKbZw98J2 +ZV2x8iA9xS+sOBXFI2TOdiqpiDOlkXJe7iD6RCQNpWKoA3CaImtauPrUalo mFsiLYcDtkUcelN0otpxcgKixStteZRd1YjvcSE8H8pCK3g55PnILFE4szXK 05BbYbudnk078AUAF0bh9cIcp/qJcYRZJVrMRwNMb4aLIIRWpZXvU5itZdNH B7dd3BoYfxobs5zN89ms8t12TOQnv+V6LIgTNwh/E/WjnfObkpvt9rw9fwGB f2yf1PjHnOPz+AXhPhDiW+MHkvRpl18VSWz3JIEZxgAAAABJRU5ErkJggk4W AQBEAGQAAAAAAAAACgAAAAAAAAAAAAAAAADlC5cOsgISAgAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAADwAE8DAAAACyBArwCAAAAAMEAAAACgAA IwAL8AwAAAAEQQIAAAD/AQAACAAAABDwBAAAAAIAAIBiAAfwyhUBAAYGGEjs WJfl6AEZCUKldTXFk/8AphUBAAEAAAAyDwAAAADJBABuHvCeFQEAGEjsWJfl 6AEZCUKldTXFk/+JUE5HDQoaCgAAAA1JSERSAAAAywAAAPkIAgAAAAYrVsIA AAABc1JHQgCuzhzpAAD/yklEQVR4Xrz9B2Bcd3bfj2IwvQOD3gGCBNhJiaIo iupdu9L25m2213bcEzvJc5J/ykv+/zS/vCTPyXNix47t7Dq2d73aplXvokiJ FHtvANH79N7f5/x+MxeDAUjtJn+/EQQO7ty5c+f+zj3le875HtNnvvH7pnWP hoaGxsZGvVk/qf5ZNpn5s8zrxpt4zv4m9VuemEyVLSZTydRQLhfLbFj3KBaL xrZymQPKgyd8kLFdHco45gYHkfMsW1f34QPlLSU5lKmsn8vvRvXcVGooNxbz PDObTPxUH2X5RDPfQL61OZ1OuxxOq9VaKjWks0mHx1ZqKMRiMbfbzUucodls TiQSnKdFPQqFQj6f7+vrC4fDmUzWbLHZ7c5cLsd2h8PG18znMna7vZDLqW8i 59ZYlt885Po0ylVqrFwAdSXV+TTqy8NrxpVRXyzfWGRfTkMuWrlc4izVn8V8 QT/Rv+VKyuvlovpetVf49peUc1u/M2+pXa/alTBX165ueYy1W13O2j2Ml9ev 6oYvrd94myMY33C9ANW+Sz/XUrCxcMmVqxV0LdyyOvrWUG8XSareAyJYNqvD ZnOw5Pphqz64rD6fDzHiIQIhj1yguRkJKeTyLc2BXCbb2d6RSYn8DQ0Melxu q9nS19Pb1dHZ39sXDoby2ZzD4WjkM8slfpsR6bL6qfkiSrh5aBE3fowt+gmn vir/t3mmr49xler2vNX2j7ik1WtuHK12vX6i06rb6bO/8F/0WRpKa/2fvKRf 5S5qtJiVYqjoAL2KxldFdRhbtADcSocZN59xj9bdW3Xyt7GcofIazI3lxlJF e4mS0OdZEUp11nqLFjWPs6lYLCM+3JRIFRutjWa+Hf/zFrbLV1V3P3/mS4hN sre/d2VlhT9TqVRPT8/U1BQazuPxaEWltZrX681kMqLe4kmkuFDg+xXQcPJP QZ7U6ICKvqp8cSRRzlZrL3Xx1OsmUSUV7V9Wmow9OONiI1pLK6k1j8rx1bvk ymslJ09YglUTYVztW923Wr+uf4ter/WPj9Rhps/94n81hN0QMi1whtjVCF/Z kLCaW0QkrCIfFVupxVEeRS7LRjrIuBC3l7A6Oav7hhgUM/YNg1A1M5X9DYGT 74DVwQ7JysnNULawfBZTo8nSiGzJw8Lt0sgKITENxRIbsHo2u8Vpc80vzTU3 +6KxsLnRypo77K5SuZBJ53hLqdjg9bmtFns6kywWMC2FfK7Ie4vcZHyUXmBu sFIDa8MF5HfV4q3ajbI6T0Pi9HWq/F1UK6qFg6+H1dNWsqHA9byNhBniZUjY hhKzobioq7UqYYacsf1WEiZ2fs0tU39g0+f+1h/UyIr4W/rP2ie1EsZF1Drs J5ewDb/MhjeWPqbxu/ZJrX9Wc8CKhNW/Ubk7+lBcAHwsVld5Wo25rGgUrKPF auVvTGEulynm83a7FePocjpQVGgjVE9PV+/cwiymM5NJeTy+fD67sLDk93v9 /uZkMh6PJ3kvLlc8Ht28eWRlZYnniKahPPj0Iqsl0m8qlZQ6aUDXyglVbiol ULUat/ZOLBfEETM11HtFBSVd69UYErBOe8mHcidUPm6dJttwXfjEDSWyVtqM NyJbHylhFXmqNbqGnV6/sXb5b/PqbZyDn8qQ1xru27zRMOKr0QkKCj2FAcX8 8bsBpWMxy09jc5PH7bKZTcVCNplNR4v5lMVcdDpMiXhosL8jn0tMTV7btXOL y96wsjzZ09mcjAZdNks6Ht4+stnvtvd1dVgaCqVcprXJs2fHNlMxa2tsGL92 qcnjyqVimUTEbi6bywVbY9nOB5fLKDu7mXNoQGvy6fxWD0vdjzo3OWf5UQ/u 5PVPeDf3id6+/rH+Lbc6zq2OULddK5r/tcfqen3+l//wp/LDuBT1fhjaQT3U cdb4YcperMaMtTfN/106DNExtELli9REBny+XCb8qka0roSTNrsJ511HXlab 2el0uFwOh90ai0Uunj87MNDPGuJU3Rwbv+++e0+dOnPp/CX0FRri0KFDLpfr 8OHD2l5w2IceeigSibS2ts7MzBBLosB6e/qmJ2dwz8xWkZV0Li/SZLWls3li DG74koS1jfzWF0wUmvZGtKFRqlc7kXhvNTqs6lqhYYpcUKWclNIyVKboy6r7 xQuGHjIuf90F31An6U/8yXWe1mEb6kLj+OYddz17e72yVpHoQE1f4crDeF4V M0POtNbf+AxqNaUhoLdRpbfQZ6wPK2SciXqmFkkwCXmh1Cg+GCGc0ueNpUR8 uVRMNTbiM5UaiplUIhwKzS8uTF08d9LjsS8vTF+6ePqufTvfeee1mekbXR0t weDCFz736VQymoiHL144U8inZ2duXrl8/rOfefb0qWNTk2PBlfkd20fefOPl ZCKczSY9DolD0UhmSwNAhRnVJG6+BBD4fgr4kfPhCf/Kb/nBs+I1uRn0LaHu TJ5owIVvUQ2TecbdsmFsXd2nIquGs1E53uqaVXXBreLV1fj9I22Rvtzqk+sf hoiYdx74lHa79PfQP6sxjf5ycnXUDnJVWFHOuta8rj6vyoFoVv2Z+Ki8c/2P +N0SH6mXKhdanmBK9J88wU5YMBcYF35jIJShWfsjUsTp8HEsCetaKhWVRi1a LSa/14N3hZvldbtA8dALTmej32fdvn1TLhcfHu5rb/NHoosnTx7dvn14fOxy Q0P20KG74vGVyanrV6+ejyeCmzb1JWORy5fPI1UfvP9uc7Onr7fD47ZtHd00 OzuRTkW//DOfe+/wmzPT46lkxGIpX792qauj68jhd2emJ9A227ZvXVpa8Lgc iXi0UCr4m3xcKYvZnEwkuC44tPIFzSarxQykVizkeEmJVgkUpaFcEuRRO8Sc vF4FvaHmcvFcgzPKeKze+OhstV5KqtXycTXVha78Nlsw3vKjX1p9lffJeyur oj5XftQO9T/q77Xrt3pylZ3NO/Z/wjix9U9qJVO+auWuWithOtKu8dC1/OnH qoZZK+Vr1GDNS3X6zDjyrXSYumbismBi1MUrg17IPVIupJOx+bnZhmKuye/J ZhKiV0zZ1jbXm68/P3bj8ofHjoBevffuGz1d7StLcy6n9bFHH3zj9ZdPHD9y 9117/V7XJz/x9OF3375w/mx7e7PNZvb5HF6v69q1Cx4PHn2yo6MVKcxkksvL sw6HtbnZPTs7lcumW5sDMzOTyNO7776dTMQDgaaLF88PDvZbrI3pFMFBNhRe Gdo06PU4CSCQKiINp8PmdNjRqPlMOpvLKvMn4afx3bnhVy+vAtgq1kFbQ/Uq 7xHNpxGiGiUn4ll1G+p0knGp11xzZXP0gtQ+2fD6ixDXgu/rNBkbRMLqjqX/ rPgHNW6eun8kIhNzU9XwoodE5pVTLV9RgU5y02lDIDtrq1n/s9HZ6G36SJWb YW1qof5NAsJz58tqiBvfUJTfiFpjGYlxuqx+r9MmmH9haupGuZxPJYPvvvvy xMSVtrbmwcHud955A9l6/PGHv/f9bz/1xCPvv/8OC3/3XXfcuHHtypXz/f29 KJKh/r59d+59/+h7H//YE+HQyp7dO2amJ9tam2dnpu7Yu+tb3/yzr3z5C3zH I++9097WsrKyGIlEe3p7SsVCU4Aw1MXSJxPRSDSE8N178EBLwL992+j87AzS 394ayOXSLrcTjQvUQfRqNTcK6Oty8bncIspWKBGqXewqhFsBMmQnEQgxnpW9 1Z+Vyy0aRoyS/FkxTRVLpQVRmyzjiV4mLZHG7+pFr7Vy+rkWw1XUe0MJ23n3 JzdUG+t3Vp6EPoM1CmhDP6zmvqmcya0las0rFfGqCpYhcLd4e4OCtABxirjt 6jdmBjeojEc/O33TbjXPzt10ORrj8VA8Fnrv8OulhmRfb3siEb18+UIsHGLV E4lwT2dnKhk7euTIL3zj53/4/ee6Ojs+/7nPvf7Kq1mizViURbz7wF1H3z/i 9bpJEY2MbG5ta7ly5VKpXNy5a3swtDIxOe50OdweJ3gHSEckGllYnHn0kYfy xeypUx9u3rJ502B/oKXpO3/1F0Br58+ezudTqUTMbjNFwqGW1kCBuKOQLxVB d9N5wgT+z2dtVrMSHbnU+goqgyBRi7pvqxJQI2EVmajRYeptaxzn2pXb2GQp SdUfV/tkQx2mD/0RErbjwCdrjK46asUMa4NdccIqNlilabQfVnMSNT5ZJZas sZIb+oG3FTdDyLQC1UJ2CyvJeYg3USzlbYKkp61Wc6kEtl5MJ6P9vV1333PH 2TPH/X5HNhtPp2OAEbHoitflvDk+ns2mHnrwoddeewUfKBVP+Dy+raNbT544 ue/OOy1my9TkVGgldODAPYNDQzfQadeuhUKh6elp0LILFy5cvHhx165dZ86c GRoaImW5devW7z333Kbh4ZXlYDqX6e3rue+Be985/PaHJ4719HankvGxsWvT UxM7d24LrSyFg0vXrlzg3LYM9y+vLJLKjMYiWE9McFtri9vrli8slkJuZ6XE lJcsukxdtaoOq6ouWWGl6LT5rGovnVET8awIgGFza6/9eiHTLt8G22vueeMI hhCsV2/GFvOOuz9Ze0Tj+aqrXjWUWrKVX7V6J6hnFfRf6UIt/qt76DP+yR8b itdt3k6QDtiVy2Vx6rOZpMNuKeSQsHIsvPKnf/ZHE+NXLdZSe3vg9Jnj8Vh4 8+b+ifHrLa3Np0+d/oVvfOO1117n5L0uT3t7x/HjH/6zf/LPXnzhRYcDw+Wx 21BIzvePfoDj/c477+7csevTn/rM7Mzc8tJKb2/f7Ozc2bPn9uzem83mfvj9 Hz7wwINer39yYmrbtm137b/zg2NHk8kEfuHw5uEbY9cWF+f/8T/5P/C6Zmcn Nw0NhELLn3r2Y26XfWbqJhjHxNR0oCXQ2t4CFMKVi8eiyVSCZKm+lOJjKY/D uLZsEkOiPHtt3apPlBAqaTO8folR10pY3VobfxorWus31wollmLDVbiVn23s rGLJGkdSv7D6eXV+mJyxfKPVoEXfZKvvWr0WVeOr/61/3EpobqWubqXDAAL4 8tlslnqITDppt1tyuSRK7ezpE7/yq99oNBUvXz7b1dEajS6PX7/S090Zi0ZX llfuumPf9avXto5s3b/vruDySl9v31377v5//dt/t+/Ou86cPmsuW65cuuqw ufoHBm/enPj0Zz7b1zfw2mtvDA9v3rRpM3DYvn37N2/eEo3GbDb7puHNR468 39QUSKXSkjIv5gc3DbjdlFdkuru6KK9o9vsnbo4tzM9mM2mkPLiyjB3v7urE M7s5OZFIp5dDKx+8f/TShfOB1sDQ4CBpLDRlo9kqgbh2X1UGRSVWlQ7T8qUl TD14IhiYel1LGMkDvY51EmasbN1CG9uRI+N57ZNbSRhOye3VBxImfth6NXar 2A3NLaq76ieqKoCaWLJy+2gXlf91vnmDx62tnuQNqyaich2MS6cOZFxXMSMk scGAc9mU02HNpuJOpzmfTeLDzM/evHb1fCIaxrN+5aXnieP27N753nuHOzu7 AoHAwvwCIVswGMICtra0vPnmm+l0pqu7y+f1ApwWiqVYIm61265fv7Zr9573 Dh/eOjqazWTcLvdA/8D42PjZc+eam5v5CmBdBw8epKRCp73JQG0aHjp37sz0 xGST349HNXFzAgAlFou6nS4C2yefeHJxYR73bs+eXcAZL774QmtH5649O2zW xrNnT+GiEZDaLI0joyPY1gqyLWl4iZe0+GjREohGME3Ja5NBYjmMWFK9jGCZ sZca59BXv3aJb/VnVSJ1Fld+G2/TlQH6WMZvfT4fIWG77/1sFRSpBUgULKV/ dESoDqUCHI1kKRgEcEq/Wv2Rfw3QBHeixgnUrlQ1FyLwlVZ8FbCmmiMxNdol ucJbq3U36k4ugReQS2QJ+UQ8Yb+vmfoFgO1yCVSziHbw+5zWxsLEzSvh4PzM 1A1CyM988tnf/8+/R8g2PLCJ+iZ7oy0UDLe0BAgJqfTavn3rpk3D4XDI6/P+ 8q/88o2x69t3bLt06cKnPv3JmxNjB+7Zn8tnmpr96MVHH3nk9ddfs1ot7Hz5 0qV77z2IjllZXvb7fMtLS0gel2VqavJv/+3fHBu7/s5bb3/205/p7xvIZnLY XLfL+8D9DwaaW5YXl/7B7/yDY8c+6Onp3rVr55H3jvD7kUcezOfTb7312sef fszptJDCAvVAWs6fP93T1bFpaBAVODM1g7g47U5CZLvFhrESe9Uo8byIl86t V/QWCSvlOTcI1mbht4nEldyuSguseVIb4itMWvYBl65ZeHm7dnMFi1QmWeEG AtAJQqTBMHmLGOe6H8JhBSOUzbsPfsaQ8TrNuV42leNYlVt1fCXjFb0qd0Ct ha3RXoYmq1Np6z9RagG1Myd1B1rrS96J2gcpUDGVPW4PbopctAZTJp1oDXjS ifDWrZtmp8eb/W6zKW9qyJ458+GTjz20uDh3c+zas898PJVIfOevvj04ONjR 3k5AgJohOzQ6Ovrcc99ta2vdvXsXC+/zeScnJ37lV3/5P/3n37v7wP4XXvzx x5/5+PT0JObsxeeff+D+++LR6F133pkv5GdnZwDWOM6evbsRyncPv4vwPfvs MydPnrh58+bBe+6hMuiF51+45+C9e3fvlStUbrg5MdHb0/vaG6+7nK6unu5v /9W3H3rkoXfefjuCj0+uqbdrcnK8XMwRE/u87mtXrwRXlrxUB2WyVoulq7M7 l8lRalQqlgBmlDyJRIGfAWnoDBKfwTXSml+AJha9pHx8CQfWgh1VlWNYwNpV 1kKzYWxoqD39anWfil++XlRWs0a7lIStt8oG4lf3Zi1UFcVlGDF9jxgKU/kK 66WqVrzWfLGaOEUujJw+4lVVcmBtJrB46roKuXQmn8sSzmcz3O6+UjGzvDgx vKmXlM75cx+ev3Byy5ahXC5x330H3njtFZQQGFUwuPLcc3/9zLMfxyba7LYL ly7u33/3+fMXTp06ff/9DxDKgWCxBU//3nsP4Vo1NTUfPvzeY489jl9FOMkW u8M5MTU1PjGB9WRVW9vak4nUtq3bJyanzpw912i1ZvN57CW/H3/s8feOHGV7 T3ev7FwoZXMgE+mnPvYxrHAwHN62bXsoEhka2nT0/Q8G+gdff+PNRqtldnaW Wg+n04nBHRu/SYSx9469P3r+haeeemp6dm5qetbr9bU0N8cTcZBYHVYp06iK NSr2RC6YAr4Uxq4iAxQSf2iXeRVW0DilWokKVGBAjxXR2djqyadugE0qiVYW bd1P5fjmWgnTElD3W86vemh5VUUrRoAoL1V0zuobtYDXmn/jsIY01/lh1RBS C6+Il3xm1eRyNBQDMCQJFnQ35rJQzLqddvKJ/d2BRGzl23/5raYmj7mxiB+/ Y8fo5YvnQN6/972/3rfvDtLaN8ZugGANDvQ5nM6ZmVnwBRQYv/GfFhcX+/v7 9+/fT10h53AJM3kB1N5D8vv5558f3bp1cnLy7rvvPnHiBMXR7BONRnkVDz0W j+3au4dLg3cPeMHR8Mneeudt3rltdCuifOrUqc6uLuQG925hYYEtfItsLkf8 2N7RwecODg0++OCD1NtyzKeffvrVV19Np9JXrlzp6+/HiPf19d64Mf7Yo4+C knR1dk1M3hR41uNGjSNVGo1FlSkAXqRKex0a/VaGTIec8lARpZIj7nyNaVa3 6O3Gb5QeFnG9QjK21AkZ5kZjCxIfqKpU4zcnpJ+b8cPWK7DbfIaWfS3RhiYz 7GPFZat5/63kbD3Wpc4eP0JnfOV6CT5vogqHOgXJ3FHSZbdZ8O3tDlRGg9Nh jkWXZqeuZVORxYXpSHiJLFCg2fv8j36wtDhPuubylYuPP/n4SmjFYrX4m/zn z5/r6OqaX1hqbm5h7d87csRssdxx574LFy/F4vGR0dE33nzzoYcfPvzee1RD eLw+q80Wj8W/8Pkv/MEf/CGuKl9kZGRk247t165fv3Tlyj0HD+IEXr50+cWX XkIRAoZRcEYYeO3qtZnZ2fmFxXAk2t3Tgw6bX1igoHbb9u2nTp/5h//o//in /+yfvf/BB3cfOHDq9OliqXT18uWxGze6OjsRTafTlc6kXG43lyIWiydTqfeP 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 DB//8P3evq4H77/n5ImjxVxysL+LizB58zoqGIPOh665yMonEuuh05Q/8UPU 3Uc9ai3P7YVHv1rRYbXnp1XUqmtfa8sqVV9VKKXqjYlJq1araiWn/T6t7iq/ a0MEvb26xVBjROJutwOPy2lzAgrbaP9x2KTnspSjAPDY++9euXzO4WgIh5eL hdShe++5duliKpEmmTM3t4AZInv47b/6Dt2ze3bvCQVDOOlUXPEpFONTHuH3 +06fON7b3fngA/cdPXoEZePxuP0+7/79d5HJ6e/rvXrl8sc/9vR7h9/lJRy7 m+NjLoft3oMHX3v9tUceevjY8fd3bN9x9dplbtn9d9154dz5cqmAtqPk5vyZ szt2bjt37lxnZ/vVS5c72lvnZmY7Otq2jow+993vfPHzXwQDwdkiNfnpT36q oVx864036VMilUgZYzaVANx74IH7wWLyufxrr79+5759Tqfn0KH7Xnn1NRQe RhPN8sRTj7/88ku/8et/+73DH0xNTA0PD4HAdnZ0oupaW1rHxsedDqdcdeWE 6Vox7U6hWaS5SZnM2p9bVe0pK7RRLLkWtVfN6sobqyk7q8SuuhBSrS4/5j1V K1mnafSqGxsrz42T1FJYESQVAVTlSAuo3r9WztZ49MZO1ScVgcarbzRTLBVo aiasoxyPpIjdYqLkJpOKnj93qqendWigJ5tNpBLR4eHBb/2Pb37uM58fGx+L x2KUPFy9eu2Tn/wEJoN4DT/G63KxwMHlxfsP3dMl671lz57t3//rb2Nw992x 58K5M5RtjV2/5kCQrZYPjr7X39szNzN1/6GDhKUP3Hdo/7473jv8HutNhc/e PXs2bRpYWVpeWl4knz03O41Ao8H6envJHKAa5+dnKfW+OX7j4YceGh+/gQXc uXP7xfMX7r//0MzUNMq4VCxu2TL84o9fGN5MiesQyAZW+Mb1a8lYdH5+rqen 91vf/B9UAW0d3TY9Pbe8vEx90b479xHGUvUqaU2X0+fxXr9xfd/euxcWF0e3 DFNTluSRoOfAEqAlPS+ovoSNOhsp4qVcFL0GP/EDt23DfWslQZbegEi1RpFC I+32KZCk+lucwr33fX69AuMtqi+yEgCu+ciKGls980rkWLOTDi70J0ptU40Y feQ3DYeDVgvKx5pKJWkKstka0VjAXaOjg4lkKJejBubm/NxMoMmHkvs//8W/ WFpe/vZ3vo2hXA4u7bljz/UbN+bn5p7/8Q/BJPp6On/hGz+LFpsYv7a0OENZ fTS8snPr6IP33//C88/v37dvZoo0s4WmbCp1fu7rX3/rjTe8bncuk/n0Jz/5 ox/8gJ7Ijs72xYXF3/7t33rr9TfMlkbg0IMH72btt45uIQyEboCcHboKySNu wT3v7+1GAROpbBoYtNmtJ44d7+3r5lPuu//Q3MyMy+3o6+6JxaPFXL5/oA9t hz7buWNnX08Xsvj5L3wRoPfK1Wtz8+jjIdIMk1OTXK4PT35IKpNAmgDi4IF7 33jzjS9+/nN/9Id/+MQTT0Si0UQiCe6azuRA43RBn/bFdJ2xXHwNif5kP0og V/3s2sXSwrChmtAiyWkYvyu1uWq7+Y77Pq/1Td3a11rJ1R20WqqGJJWPrH62 obQMZ1+flIqAK49V2V/3iWoP0fDEZdg4kr4UTXR0Bs6fPTk5cfXD40d379pa LmYvX7pA6QQFCyeOn3jppRejsVBbW8tffeevHE47zv7jjz968MABjM4Cecrx G3/6J3+8746d0zM3o6FlOoKcduvYjWudHRRRB5KpGDHknr27Cpns2Pi1c6dO P/Log8GlZYCR+ZnZhx95IJNIvv32W1ar7foN6nxGz58/s5c6i6OHk/HEjh1b z58773E7E/F4c6DJbrHmKSEkjWCzor2efuoJ/DaKI8S2Hnv/vnsPnTl9Ep4L BPyhBx5kO1oNCxsJhSny6WhtnZ+fd9idsWjM4XShBHbv2jM7N6fucFMmm+vt 7sG1BvslNObqxSNRNF9Tc/OPfvQjFF6gtc3p9JK1BIMWC6kgBOXtq7Id1FjV kqxf3w3udo1HbKQGaiWkVs4qhTZabylNplWpNBsoJ9B8x/1f0AfcUGPVWUmN f1TAFSNLpaPI2sxSVVy1hNWecr3ZVR9dI3YmnCpYITKpFO0VrS1NqVTs2AeH Z2cmRkc3UQV/9Og7Q4N9TofjyqVLB+6+m+8yPnHD7XHQ1XPwnrv7+/q//Z2/ mpqcVFYply+knnrqsddff/mpJx4+eM/+t956ZWl+DheNlly+Qj6fQVbwnPCZ KGoe7B/A0uE197Kk3d2ga6BlTYGmZDL1hS9+IbSyQiUPX7G3F4XSjUJamJ+j UhGjzEbONp1Ogs6TU8eLJ7o8c+rUlpEtqMPOrs6VxcVLly8RmS8szne2tyMB doulpbVlYXb2a1/9ytGjRx99+JHjJ45v2TwaicVoH790+VomkydJ+uMXXty1 e/fx48fJLG3ZsgWljk+WTadcdiq2PZQVjY/d7B8YWlhcdrq9wpSgwH0F9Fex igpE8ZPqMK0+xJtb9w7dNKB/jOdS36H66XmfLn7UVDWaP0E/Fx1WGxFoURNt VK0HWhXoKlJcJ+Mqn1/dX++tbyP1nxCXSFaWvYTFSKWDtHcoZ6WfG785DlWj ePatbc20KLY2e46+9+bli0APcUxlT2cbXRI7tm19++23Nw1RejNMLtnj907O TCdTSVWhZXrm6ac8HttALz60/9zJ90259Ka+jpWZqXImvmfrlp72ljzkOVbr 1Di9kG0Oq/Xm2A18/1KeWLVpoK+HnHpbS/OVyxe3bR2NRcOSBrKYenu66ebo 6+4K+L2LC3Nuhy0SCbW1to5u3nzt8mVlZ/OzU1PdHe1NXi8t4N//7l/v2rHt 1IfHm/3eQjq1fXSL1+lYWZzftW3kyDtvgfqfPPb+w/cdeuTB+/7yf/zp7tEt r7304z07t0FoQJUYpbArweX9+/e9+dabTz39NOnIlpZmLfHUlnmdLto729vb Tp46hVpdXMI+B8FvSajz9VWeCEBR+gcp7Fl1cTY2FxuqMO25bWAo6xRQ5U/D nqkuTtZYJUyVudR9UICZ2kpWBKMKZVRkqArXavxDqoRw3FStUC3EIvpY14lp wVI+ZsURo4oEeVFBsFbbknZUiVrVf4eUy2+Fq2kIuMHtdNtt1nBo0W4tHX7r VZul5LKhOAsP3X8/LTqFbOHsuQsD/UPRZGJoeNOHp044gcabWxwuByHhqZPH Z6bGRjb1RZdnzYVUp88x0tvW4XG0WE3dLkfA2tjX3JwMBXeNbm5r9s2MX982 unmwtxshO3D3vvaWQCwSJNwb6O/ZObqZ8GJ4sIf2pLv27rl49vTmgb5zp0+U 0XupRFdba2OxsGVo8MzJD3s7O8q5bEM+19Lke/TBB9x2a2RlsZBJHLhjTzYR a21yN7ns8ZWlYiY52NGWS0S3Dw8988Sje0a2ZKPhb//Zn3RDuzI30dviPbR/ 78ljR8Ag7r3vQDoTP3PhVCqbKpSzV6+SCO8F4xge3DQ5Ng6igXfItQSC6SWF 3tv33HPPHdh/VzQSATbTC8G9TOwNVsxND5ZRLlYJWbTmqD42rFlVacdbumIG 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 8VQknoxioeOIQm4lGEbdMIuUhYTBBlSDEkNacpEpnQPQfj/qRHnZ4mypIn6J DKQUIi+DhhwuCC8A8yl3KGFtacpYDoaQ4Jn5pUQqA6/JpWs3bk5MXbxy1R9o ZUvRZEYhU+KGBaQEqcRXs0lqfHFxgaMxv4LiRwwzn4njxenRtRaj47LRCqdj MJFaCsWo5MfQw61/5vyFQKDN6w+ANKdx1hqt/f0DUl1Xg1etl4a1akyjnLeE T42lN95VF0tqB7T2mOKH1Qqm8ZpRBGZYQ52AUYTYWuQF9Kqxlatb9HZVqCI2 C0RMRfNUAKiN3ONiUKSaj2lQgFaJWHho08APf/Bca1tTjPkwK0vM0yOxSPpo fm5628jI7NTkpoE+UxH2NhcSBn6BxRT3P52BHxFbAImTgKJ2UukB1a1ja2nt XAnFr4xNLC6H8anDcXRT3tvUSmXVcjCmOHVty8EgdRRYMaRBJZ7M84uLvEBB A3XJkXhCalkTEUY0cP6EtJwzGUZQVpUhkPQ2cSpfEqJErhtxCcdgADR3jiRq xMVuPPbhCbQT6uTSlWtAcFTJ4cpDawi8ywnPzE5DTEDwYi5mt48M0663edMA aC4XiNoyKOyWFpf6BofobYslMzaXX3D+Qp4YGdPvbWlbWIkGE2mnr8nl8fEz NLw5HIr6m9r23X3o4KH7vYLQ5lS5VGVVa1VDZTWVSqg1atUq5nohq7Oqhoqq g0KMoxn7V/yw9Z7gug/WHykYbJ2qrBPQms+Wo5KXVPxVVWdf2jUlIyB92HAO ej1Mz2tp9i8szSxSlrNCtXu0t68HfkPG8b3w4x9/7rOfPnvqFMFjXmibMvhh +PuMU8D/RYdxTtmCsDWJyAvOCt0rE2VgEXCOj02KlsJO0drPO4TiVAoeaNUX K2M209KIcZUMqdm8EgyKEhJYQ7wravnx5YTxxmJORZZRn1LiTF1hNgvcT4us al8TmF76yJmkmpGKe6RN9ByBqZhOCSzJQCPW3FjQAnDPcQJIMmWG1GaQksfH gqGzxe/c3Ne5Zaivv7u9oZxHgMpF0k0yIETUIxWITmhcmwhNAPj5CNx+LGbB ZEkXGzKlxpVY0h9o4/aBFwW6Cmw9dbLdvYMdHb1wC1CwqHIqEvDewuuq2yyB WN2m279XH1ich7UfsSphjzwtVrLWumnZMhz2WgHXMGud8NVqzlrx0s9BK6qx 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 Y6oznopuKI9tQtoD4mVzh1LFRMnx4YWJf/gvfvfqxDzjsnC2qkmh9WK2Zmmr 3sgqllmrM+rW2vhTK6s1hlWVrat4TsURlQ+pgBpSxLlOsmslbE2ZV13dxEb6 TDJFtUfUXv+Gn1G5ACqwqZjXasip7hUqFbLYItBJGKBJUUCMcued23/3d//D d7/7XRrwL1y4wPlgX7jcp06dUnOr5FvNzs4++uyzkP5id+nVAZ0i8QfIRK2Y 1ErTOCRkFlKwALAJTiHjAF3ih1HFilcMiQ3rjVAysRvLSwYI9YbNILhDOcAi 19LsxyOauDk+Oz3lsJmvXTi/MDVeSMbIDqUjQYbcNDnt2zYPJUMrmNf+jpbh vu6920ZGhvqGezvb/d75mYlkLEwuh6502rkpaHU5LAgf9FLMy0G8II0SKn/m LJeKuG6oVPRcjLR6Pk3+iYZyvmYSD9Psmg2mAr2j7x6/+LVf/A2Gbbnt7ppq hJ9IvFYzeLcySNXtdXrE0EN12qdOP9WehCEDdWdm/sTnf7WKSyg/q4JRGGhW 5YkiDTCqqY3PrVRVrOaLlNGu3j28qokpJEgQi16DfuDoJhJxmgSh/4ClDVHb unXwt//u7/zVX/w54oXnRJFnawvTD/LRcBjn7Jd+6RuJWIJlgq8pvLR8x57d 3/n2t1taWyhyoU4PaQJBUPBig7BXUG4vnLq4zCkSnUiRbqGAaETqZqCRLjdA iI9nRokEjT1gUXBLy2/BsfyAIAIbACLgPafjDsI8IbwwQ0XHrFB6L3u6Oh1W Cw5gazMDlPJ93R3wHBAVTk5NtLVTfqho8bxQZZvhpcJc47bTuoZ4QX5BwBgO 0moUxPDgOEJtBXqcTsftnDW0o/heVnsUvp9GT7rBdXEy2LFp15d+7leu3JiF PzaRoAPPrpRS/QJVdY9oGnUn6if6UQtPVt6od1u/3FUtVaOx9NF0IqoSt61+ ijaKdSqmVtrqS1X1GdVBCVWJqbsRKsqsNl9Uq/Zq74OKEq5GwspRxINpls7n eITkWm9v58c//uwP/vJb5PKw5ViWzZs38xuPp6Ozk0mAU1NzpFOk4cQi7G27 7rn3gYcfIRikpNVsc9LATy4ZJxVBI6wjawQXEq39/JBm5gfYU8rwJYtkQiny uVwrEt5YfLAoePYxcDCoLC/OR4MrwBvdnW3mhuLlS+dJo5MygqWC3dweJ+oH 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 qB7KJ5MfcQWU9JLjiUUjZ06f6+sfeODBB6/fGOvq7NYhlXYc9MwRQbHVesBO +PWf/TrwxIcnP/QQzzaUZ+ZmW9oCNDGGwjBNiK4l2811hzaH2WzwKFEKzWaR oXwRRlnmY4lpAMqEx4d4BRJh1AAUc0L3y+hCJK1MEVgWyjG6zhmohg6heNYC +YWXIBG8yR9oXVwO/sqv/SZLNz0339Le+eKLL05MTcGKiHuhrruEo6ptS/tH FS9J3SN6ArAeGFXtzEbdgvapvntiHrQtZkN68BsbJ8ZpeLj23nvvvv76q8eP H2OKr9/r6+3pkrHoCrnkWynHDsRaIAAOoS81QgY/I7Efyo/oCt+6Kl5yFoZa +WgJa+sd/dM/+5PXXnuFi75p0wDZFUBL5IyUiPqg9RjdGgVWWXf58NrtxnOV BKo+tPbSUqUdCK2rtQ7jiSp+Um6+NrkVHVZ5brialXtXxwNMv8D/M5vfeOON L3/py1wkcApUEddZrrBWmuKbqr5NKbSg8Ct56L77du7a+errr87Oz+3au2vs 5k2EuqW1TcoprFYoxAAaGMwGVw/FEYiTlDgDC0KHzm2OEVFz79FnnAJDGyKM nyTQgMOk0cywZ9BF1AMKgItJboACJu4cwAt8WC5HT//gpatj9z/66IH7H4RF Y2Jyum9w6OWXX7505SrzA0kMCEOVlMeys76n5MzVs9Ubraq9Vq8zN5W4GWrK ub6wmAj0KL+gikcCqSGam529fPnisWMfvPHmG0TGwFP0p7S1t3MnkykVFJAq PeW08EniT6vWB2wlfgIazvh4o3pHHJma+3/1BNXa6eU2T85HCFWIhLkPifAB LsAdeK6m+a0aNcO6VRa/9mBGzCcb6zSZGn+rvKCKEqoKGVsMhaz1jUSjxGha d6pApvKmmu+g9ZDiwxVZVYERCQMbTY7z0zOQzn3ta1+jEVxa/vOMUlOKrlLK JhqPM22BeDydvnrj+vad25959pnpuZkPT56k7xKekpVgkHpAGH6J/rp6enb8 /6p7D/i47uvOF5hBm8EAgwFmBr0SBKtEsYuSqBLJsizbsoq7Y+ezLy+bfX6b fHY3cRy/91JeNpt93s3mE8eys3EidzuSbMeS1SmRogopir0BJIheCIDoZYDB DNr7nv//zsXFNBRBivd6DF3O3PIv53/O+Z/yO9tvBvIEoUO9GQQi0g2Fm0AJ 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 yc5jBysiO8JjopjQSuZ7hdfEsqVE86sCA4wj7jWLpctNBmZKTH1DLGNbYSvX dpmph5k8DA1Gy03TWWGea2EqtegFkADHUaYOlY7EIFi511pUMe38RDDyGvFS CYVpArfVVdWODo5icPAWlzX29XaMjeVWlLWPDF2or6fY28joaFFpyfDY6GtH Dv/vX/nK+cuX0B+3bN0q1tWJcYb0s5/97JUrV9DJiOvv6ujYfPP2Sy1XcEg9 /MlPdLa2zAUm9m7bOjM+iq0vNRRG6mOUocgDaZvWUY1a/Gsb8PfpLpNsRA/T ZGTlqPqfJiEvOV8lD0uEdp6IgUeCKdREGnqevD+yl7G2U3jYwlwINUv83FnO Am9haDoMA8NywZbA4HgGaa2Jh0l0q3jWlMlkfoYYZwWpQqhFaGSKQjJD4yPt XR1OZyblYlwptsKc3OyU2fDE+ODI8I2B/g0ba8Nzs1cvXgDupbKq6tz581Rm ADbxlh07gEBnK/CbX/jCyXdP7tq790LLlfHpyary8ht9N0DBgKLHFmY6CXzN yZkUKA9iD6lYaM+iaonaTTMgcbWoWFm5NgJ67zzMbJ7d4Sm2artmg0yLnJW8 pG8Ra8V7lJJJVISoYVJ200UKswyZxOTNUsNWVTXzen3s74JT0xRDwF5mxz6p 0CdUCMYapaTgkogexiZOdpSzbFrF+W6zz9uzUzJR821Z6b5Cb5Yrc6j3ujcz 69H7P1TscASGB3/jsUfH+vsvNdSDIHz7HXdg/eq70efz+xqvXbvn7ruvXW28 cP78Zz796eeee87tcgNK4Kkozi/yd7S2sRn25eRNBKdK6jZeaG4anQ2j4wen Z4fHxudJdSJJZFbQ9qyCKZYa1kZVUdxR03FyCcivSaSknkcorChuE3UUh/mO RTp7nyksQl7W7qntoNGYRWEudMNKngcKijSw+eLiUqAOUciyHDna3Kp42Hui MFik8kUKjUJhYUVh+MLhJ+kzKcRGz9rmwwshyn5QTY0ib6Uul2dhbqirq72x cXxi4uBdd7oUnB07l9179xw/dqymuubCufOu7OxKzK1dXVKsnhzc1IVgZsrL R9/93GceBmRlamjUX1Jic7v6JwNt/YM53sLp4Nx1YFeycyhLSWBT3CCxJCt2 DQT33nnYIqvSItLUt8x/xjZrfbcYibodG1WiaSpC4tpaobeWGqYwAwki28dM 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 XSOZ5qQ81+L8JjwvO0HKZbLqwFkpFMnNoP6d3d0sp9m/b//u3XsgHiRKxJ9k FRCZ8zwJJxe2k0DUwUN3ECxlauPmQNARB2W+/EmQCoWVB3lkxT0YzRo1k2mV xdlwRzxDSe+urnFycmoS+U6MjzNm0UiUNhLsMutO5FDUUnVRUK5Xav0TQb8F Rr9Zl3Whyw28rjeJDUOHClo2KqV91TAgDkz17py3ihY1mSwrEPjQlOqLsZM9 WuRAB5VZ422TAsfd6CLniFkrl2KLS9evTfT3UTfTjuBmpqfQOeTF6ivkxWCY HGAxHkuEguHYUmxuYY6dG6BnVHOJqXTLKn4gir2UUW14OvjOKu1tQyPE8diS SJZYyIST8C+6bKYdMU8pVLR6ZC1xQ9SW8lrQ8Sb5ikAESI0ub1qtVhM2RY5v X26wmaxo7fRNzzN/+WexHH286QKcTHYL4w3/cJ6NZskKesV0DGBvD1utHdy7 az+BPYgsS3TJ9ZGOuXLlMrUCsuzKYe+Iti/NL6zEEhS3MyHYCIm4EkUyBEkp hG6OtPgDfqaOrCiWOnInrDEYDhLIJo7PnmCsi54Yv64uK1ZUNp4m2yxMVKrQ ser8M263LtSR/cdUUVX0xgJWA821onL5sOaqyCU3je83Fr27KUN8m5MbMgpb XE2nzCf23Bo7jnYODoywP1QsRh2wg5wvFUsANzUWE9euzs1MUWwWDUcg3ldH r5hV4EWzrznBLNmqE2Wn4lbK/Z1S36QlwvD3axPXF2KLESmIwKjOYVNM4aSu 35e9kKz6WGmMrA+6FeFIArfWpxtu4U1U8HZk905/pyZluS8qTKlsW1cn+zHh T5P9AnkJP2lhOXq6spwgX4XTKFVeHtkDGPyJRtnKQnaX1nIO7qPUDR4ClRbn G4eIfT1SKarPcdBRPKlUolbShAP5E3EbSKtubapdrGrwJmpxGwK4lUG7jds2 8BVLyordwKh+WTeQwNFA3RA01c348RQ/EnWDbOzes1PFajbkkd17lFyL/TBl wYiYVxih2j0YCJ9SSJZKr+H+sBekpBClJjgDOFP1ISvD5V914ZOi8AbqVn+y gR6aS28To2/9MfXUZ/O36qVsKZFsqc3SSxbsr7H5WJ51ryFfyB/0sS8vzt+u nbsZA4kFxpOk+yAkoDCVCKAES8gRLnELSWhVZCU+tTXIlzdIn5w94q4UK1By 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 e2+V6fJOpDJ5hZ4xtjgtmnhj/ZFLTVsVp1LTnWy5dn3yaVO5Tj89pHv1chCt vt1Lco2vd/XByf3J9vL+nUhXf2RZ+B7+c3yFELC3LyoyGKZHo06jfnx0MOj3 52dnF+bnm816p9kqFAoLCwvFYj6bzqDGg1633WpUK+WZWm1hfm5hYR6BsGc2 N9bv3Lm9sryUz+X4a61WRbTLy8t/61vfun/v/urScrlSLhTYRTn+x+/VlRUU fX5uvlIpZzNp7YDhYDwaZviHxIkU4w7XmBun07lMngelZf4WIf9kC7POL0Sc SPTzpIudiEXWTuI7W8aYAy+nRZ/omt9U8rQC+47XTf9Mp0bsSH4nbxUKyp/m V3/V8pZVtM3w7xe3qXGOi+cJ8cyXLfPnSDc1tInA6iS6Gx9mQ/3ZLcKnVyoz Yxa2P6iWizO18ng4KBeLa2srIx4cyrgtLq8sLi9jovcO9pFBuZTDkdy7d39m pobCoZAHB4eNRn1z89rGxnofLW81l5aW5+fncrk8kvvae+8dHBw8ffp0b3// 4uKi0WieXpw36q3v/fX3h8PxYCRPYdMXm2/c7XcwWHwunx7SRQJ8bjFXtK22 WP1k7rMd0rmsbZRl49urLPP0r3yWvZJuIRvWilfqs/weIY7pff1JH+VHps5R nzLxjMjH4pewke43rsgsvG9IN36HdH0n9C+dfcnjXhXSZ+8Pka8Memy95MZd FkvWLZOSfQt7pJVKL8wtVIolZIl9Xl6Yr5SLrE4ul11cXKxUsLLo38rC0lK/ P8Q4o8eN+nm9frG4uMzlIfJ+v8tvvmmn06tWcb2dQiH39tvvrKwsnZycnZ+f ygpjh0cj3gqX3B+Nj7gdHj98/Ojs7OLw+Bj7L4eaL3JJPewGMUcWf5Tmgnmc T0SC+GyLmQUJK614hSfg1yXaK980sbdaVW3NWMmr2hNKqls4wXDSL26hcvEc K1UKTzG0trxaulwA+yN+yzLL5tiNJtbRuykMkQ0Df437WCf0hOtJ7PDn6euV i8PO+spfMtvsqyExC+8oz5X1CknYPG84npuZrVUrhWymWMiVCrlCLlcu5pcW F7iP1GWfW230BHN968aNzfXVs5Ojw/2DvZ3nzXp9plpeX129f/f2zevXF+dn 8buFXKZUKBJIpUYK67afPCNAy6QypVKhXK7g3nmcTfaFt7+wMDerCGk4yGUy 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 FgvYI+JVBNDutrF4HRBiO9qlpUV85/r6GnIK/BVUUhrW6/Im+EgkCrLBP8mY l5eXbt++RZZcr1/u7O7s7e/ImxLKEZdn0sNeHwuBro2GfcLjYiFP2Ly+vtnu 9EnaJISR8CCiBIzt8tJi/eKS95xhR5SKRFY8BbBsdnZma+san0uIwObDbvDC o+OTZrOZyxe8stPgxpFmmjRaYRlvICOHgPGvaaBQ9h8GRhKVXEdlVBYZp/07 gqzROCdAWfac/xq+4G0iZpbg5Hyz5fLbEafpifq4CLCxQkni5QfjZ7LjXmWC Xy3zVG48lHTZ+plIXMtCEUrlSqfTWlqYu33j2vLCLCEENnlhbmZlSRAxyFQ2 m84Xc2cnxzvEwyxgqXB4uI8kyBbQY3xap9POAjFWqyguL0IF0VT8H/4Yx4kA lpaWHjx4cP/+fe7jROOvoBOXl3Wwqu3tp+fn5xjU2TniId4kQ0LFJV2cn/cH XT6IyIgICZwL14nwwcvYZCpf6F6epVxeXkRN8QsCR9pNrhAsc35+fmV5pUQe XalgaHZ2d/msRr1BXIYQrbsv1jD0mIzZhlppzzhNEI5q5ocjsBSZ5dG4nB5X 0WN+YwVHSJcHUXEWNin2IEmEZRgE6UpwioiRN//FzryTZMARfElxA58K0/1S dB+G+he/gT+gcxRySkjXFo4fQq1xtVoi1QGH6nVaxdx4plwkziJPJdng+vb3 9oAKWF8sKjpEHolnRcnY51i/QlE2mUVEqFjvPo+UCt1+t9VuUTcAQF7bWNu6 vrWxucE3f7r99PnO88v6ZavTaraaeMF6q0HsTUS2ur6yuLCIpkq5XRMwxqc6 TYuwqNkcjnESI9At9hCbBqsiOBp/kc2ura9KNQViDNm3G+s8sFYuFw+Pjh49 1P+2t7dBy/Eg8rwDqkyJ0QxTPP1FxUSlpmwEyaivrN14LPXFAuNoM3K6FQSM XDO44QzawtNs0iMBy0i645TiLGXORiIDYcwWi786xpO7RicL4WdMpBueNyQc eVWI1oof9xx9OxrEczjnkQtxvC7HUOr3KulcLZevZrKK5pXyDwegQF/94ltr S7Pl/Hi+Vnxw98ba8tyQMKbTZCkuzk8ffvQRHg5Dh77PK+w839jcJKclFWm0 2uQhK+tr4JK4T+zf5fklGlMslTrtTrfTJRTGyc0vLLJrWevt5zvs46XFJZ7P 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 wCe4SQqgxIq1W7+cZfbAcvRAMZRXzalGn3IalgpAlaPJr29tbW5u3rp58/UH 97qty+2nDz/56MOLs2OSn/rlKSehIHVU+b/4P/4f/sEf/uHMwtzg5AhrwJR6 tHmxlu+3LjFT+7vbl+fnHN7GEYF8ECe/Ta2FkLkgPoCdi3GS3AJRcfZ/tZnt U5Vgja/XzMrEf4f6Xk2NwsKHeSdA1k71Idcmeih+lHH3gZqOwvqzs1XP/x3S hMw8+/nlhaXlVdzFyenF/MIyx45w2Ct8AQ4RgI4PV5AWCR5n3j62j1aJg719 Jv1w/CEQ8/HBzuUpS9Hd2lxrXHB01+7DTz78/vf/kv5mzp6iQYODxOl/pT+j 3+GUmtNW/azbqSNdEcVMaxEL1PwgGzgO8q3dfKV0r+ISV58Ab1TjH8VB1GRN nsbhPpg7kG+CFAwWT0bPTo91lG3j8vxkf7fT5tDNFi1+HCflXCh9/+7t//L/ /H/6tV//FQ76Tqm984iDo4poBycp4m+aHCA13H3+/OLsdGVpkVMM2JIe1k6J Jg7EANVz0QIX5Gl9VwUc9yPbCe2cKigCQphh2MMOTzGseJOQolqv44aTdgwh QhZHX6mVH01WxwOxlWpMjO2Zowyg8VtYpovLizffeYeOtVKp2oAEO2RYwJhj Io/PT5nevHXj+vHp+d7BwdLKOmeg/NWPv9drk76Od7ef0ciKdWOsOyuAWDk4 BUHOowO3bt66fevOnVsMWWS2IStJq6LmUBc5OgIRghbojAp2u5maqpYZvHR3 IBDap6U7aemICRc2bUYOpjdN41XPM6x7Zi+nxnzY9etb9+7cfu+rX3nj9dfu 3Ly5tbGxtrw8WysvzM7RM7K6UHv3nbc31ldJx2mVxFL+xq/9yv/1v/y/3L1/ Gzymuf2Mk5OozvTrFxBYWucn+TTeuj9Xq9I0dn52vMQ8G51BUqJPUNGxTjFS LmpYgzRfA12TooKdZVILchYrvznhOBrJEDhFRsP2DnBDkvYcRzSSJ/udk74H j/XWmRlWYgago7J6iL4jh2yaFeiBzwPGIYl0l0odHx0zYOfOg9fx9ciVriiu F7SZqyB9Ik5GK3DYgFOPnzzFnWyuXXvrzTfY8c3LMwLP48O9dv2SmU46uCNf hM2v+JRohs3EhIZO6/TshO9D1FItZW/c2Lh39yYiZyq8j7DWeTzINvrHJWAn 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 u7kfhvxhI79FP5hhA1AfxciDhBz5wkXyRLlOzsY/DSBMFogUp5COPJsyytkJ C5VogEUUAbEx1hh3ZrpvYPBAe0dXATxYxTMwNNjS2gpx8yhFcz4CL0gDCDyC RODUqN7sDhqV6DDuZhAhNb+4EG1qTLWkiQulW1sI4LW0tfKSGUmAhDBINvfa xdc+/xefw+jP7eQ21jZWl9fmZubGxiY21nGpdxeWltfWN2cXF1c3M+PgnOfm FtfXRqemV7cyk7NzcDz55k28iJ1CNl+UtxgIkWbazuVijU3KCgm/oLKW9Y1N P3ZxqOaZcGvLK2vbO7lAEIsZxzAaIMwUBBCNCV9NJFOCZRbL0XAMD2hzPUME pTXdhlAHnElMkk9yTvypKRZXmNEXVEIxGFpeXoEN9FZyRea+Ip4GkbVoj31+ r3gRlk4MIctK8s8JGMSSoLEIfhJtaJjam3/7ZB2pnkCUvQuz8cA4SyKV5BIg CDwzkFolcHw7m9mdLZ2UhLw8IHkz/LcC7q1SJE66tbqWiISrpeKFs2eAbIC+ lsPnl+iG5izYYmKDLRa/x/Qi4gchQltsQS2g0+UFgnfdA0Ggys1OqAvdmkQB Tig/VQraLAeI28nOGkDFJHpd0Jqsra9VXTns3/Km1dTx3mqjzmvqaP9f3yzs 9x+8br+Zz2AikG8St86js6u1O8VlMusRXjWQmSlVzHes/FdeexVUIoxqFRpI gY6ODjiBdcbKHR+fW9/QFTbLuWhikVzEGZGsOKGDKlSXVpdQ6WOTY+DwQOuM T08FosGVjXULW4P74/JiccG/iaYINUblCUsNrVS9fBJcROzyrqsvux0zlpyA N1SnstJ2X/BwXb2z3bwvnpqpMnvc5giZxralcI8ec33Pltr/5S0fTH0jcU97 YSVhUjs7lkvR24U/4I3aP50GF8aam0S4k51RUVp1l5ulsIy4qc8lNQn1kIIF cbm1lcHzKcMCKAJy0A4EVr8fh/mrIPXPnDqB06C0dEBeBBsNOWfmstknZr5b fMYcI6dDHVTQwYHcYxNmEyHHn9hyFx2b5WPLx54c2TwwXmYImbEkceAW1B5P nf6MDcyoeMu1tT2/34tf2a3VD37X5d31Q7sesxzsqozclQF0UXRZn7tlgnWI OKLfyBDe3LfiRYj07a2qg10R6FxZW79y7fbffOGLn/mLz/H+6te+/oUvfflT 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 /N6Xv/j1p5547i//4m+e/M6zVy7d5Mt3n3z+hede+c63nt5cz05NzhnosK64 zF43pV1fRmkNR/T2pb7dCMCku1sNCQ53a8KDGHqFT/sVGt7qTIyQeJn+4dT2 WN121WbpEWOzKI3g6ip5OfwJj1+QdnsERg1ssVYJ5BJwKexv5goj7ZU/VnBG l4e9w1KTJlc8tJD3Kp6jYlBEP5vKSHQA5RReUQ8akW5aXVlFW9BcJYJlUijG CfrizNEDgwga8EABkRQaU2hUUEM/BhWX5hZDf676QrMO3MIL+3JwcBBIC2Ta 0dFpYX6IKR5XjplVoH4ApxyUE6Rv3WxILXPR1lmE73BFPYzAPhg/y8tLONn8 1fUUKqBS+RWBDn7OypB1MjCZSTjy5fychWY7K87LnHKW4uLFizgq/PX69evs DKAAlcIB0dL8kx+ixLlUvCN+zg/rDozpH2Npbnp1bdV2YMvU1BQxAK7fXExT XByTA1o8oBlbvFBknXjo+Fnzi4uoDGDsIFYI2me2tnv7+tHdPLKnvvv8+np2 en6HCP/U9PzkxMwaJwpFlhaXebgLC8sz07MLWPrzCxPjk2AmxscmJiemJifQ r7Mz0zRBmV9cWl1cXJudX5lfXF1d25qbX5mcmudzbnZ+anpuYnpxdHyaK6H2 i0tjHXp6esiP1lOHPGL5lMqZyPplNegps7291dfbI/iBR66tQ/Jt4Jm44pAa Qo4wIwZHR2dbKkl9fZUiLxYslyMc7HJf5ADKu9nsTnNzPJPZhCyhXvZ3+kep /dGxUeml75V//31V4GTJW+xmwtS5BwolGTejHrDwMe53soVQpJHcD1qYIjd6 rSBjlEOQWQWydceS6uJdsByAqPa4E25UQyMnMGoWHrkfSI3KTIIDcJ5Dwhmv WrRHwsHVDVtXEjZCWyYPsL3q1rwJReNnM/PsT7bdPuuRexNIvMxn3ROobyiB utg2xWUXzHe7NjOr6ueqn+IHKIr6Ndh565daP9FdW4x77UQulakkt92a8qFg e5rkLxJBc2uOtdSwtZ27+MrrV6+NbGULPX0Dw0cODx3oDKjflCpsTQG6eB32 Qy0CTkoGVU3hCn2YMhm6zmQpRSYVyRvzGDOFF8lKUvs6tbs9bafJjnstzK8Q v0GscGTAQmhjeNXiDeRSLbfIRZoUQDbxJ3MsbcX26d6yc38BrhYoLcJdRMxh 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 gjeZmC8PDkj09PiukxSxyxrJG5ZGAKsNwQeRrgyTAxySZKukZlU88tsAPzrs +meDTrVGxlYUBz/pFI8abGWSSOa9s7VrDUL61MveGJU8YGOgP8aCWZlcRTSz vIApIQ9DnH861X+JiBe0N4VGO9t0c+/Dj/1FZHTWPcn0NViqRGTbdlxmmlPC FVR5ipY2ETBF38zUDynh2pYjzPWnFLmQ24I96QtjOedQhiDtSuSRRsAkr+Fv ajPZfiEMrHHCSAvxvQGbYY86PaUTb2USp+8MnNFegYcWTIYGnpIrYAYE+WaG KWeUqzEjNXoVwMjHxRBROxAG9U5/+7qOVWSMjeq8/wBOKDGQF1BeKF0PMqfm srcMQjHPMYxWtvfqNZG/XBkGdg2B81NFJeD7aNpjFAuOKSRIsDrxEfyrtIbA AU4A5AVyPslCs/aW0V/pRmkx5lQSPzArqqthR7UkjRP/2RciAQBEAGQAAAAA AAAACgAAAAAAAAAAAAAAAAAOEMgKKQKiAgAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAADwAE8DAAAACyBArwCAAAAAsEAAAACgAAIwAL8AwAAAAE QQoAAAD/AQAACAAAABDwBAAAAAoAAIBiAAfwkyEBAAYG9tITyisANvpq7/Qi HdPOvP8AbyEBAAEAAAA9uwMAAADJBABuHvBnIQEA9tITyisANvpq7/QiHdPO vP+JUE5HDQoaCgAAAA1JSERSAAABEgAAALgIAgAAAKCl9EgAAAABc1JHQgCu zhzpAAD/yklEQVR4XsT9B5jl6VneCZ+cc1WdytU5TU+SNCMJ5YgQSEIgEAIb A0bGrFnw2t5r12t7zfLZxvZ++1222QuvbIRNMEICoZw1mpynp9N07urKuU7O +ezvft+q0zXdPaMR4Os7NKUzp06d8/+/7/uk+7mf53FeePzPvF5vKBTy+/3d fq/T6ThcTo/H0+52G41Gs91Kp9ONdqvf73e73URyqNxs9p1ul8vjdDpdfUdP jz7/7/f6+KtWqxMIBCqVGp9ZrVbdDqe3y6+8/Mrlcvk8fofDUS2XCoVCMhrb 2FhLp4by2WylVLjvnnuvX7188Mjh5fU1vsjrcnsczn7X4XI4fS53p9uduuvu GxfOB6LRaruZTA+PzEwtrywnRka83nCl3iiXy+FwOBKJNJtNboSffCM/2+02 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 jiqQkkE+5eUupMulXRMZmcaEugpMsVh8+ctfjeUymdXVhm94UKtgnLebpWG7 mAoOlrLZjz66n1x5ZhBbGkZy2/sH7epOcf9xsdItD7Kx7IVYMr9QyK1fWMpm IslcIpxK0Fgwvb6ZXbucXb109frzlzeuk52fToSTicjG5tWl1cv3Pn70/ru3 yWRLJeOf3vmYMoEL127s1rr/x5/95e5OLxnMdgR2Dpdpn67IYDDwauPtlwbS vjp9uiW7SRpOoRtyAl8JeWiBNLNrVCQ5v9rFt9np7uztP93ebbZoRMWmihA8 g5akZTk5qyPPtQhYlJwhrhrpiAClgfLNCUw3KBEdNfa8qq9XwZuuH4y057GF sC1nCos5J0wSjtxOjg93VC7kqEum20sKlCQPSvxQO0Qg84eVUoXGidRvsFWg FtIF2JJ4d+hIBwNP0lItHMPlA753q36stBkN1EjC6kCdDiSuBB97M/bkUhAn r5BaNQ5DGhNX7ucW7/f36n5ctN0mmE/UPdA+DUbAS3Pa3GG42SK+JPF2jZEo crJ0MBdR4xwicKTd+RGo6LMkRkxdUVPPhFmMPGkUJ3cHPfx+pJlJ00cpJ0JN piILTNJutd5+8813couXQtFMrVrPpsK10t5eqYoIyi+vx5Jp2EiY9oK5fBLX weLSyqUrK5tXI5kFwH4G0nuOG8Y2NzcXFgv1dvfu/a0n2yVfiDKqJJu+VKul CoXdSvVf/81bn9x9gugFn7Anjmon1jlmvBnxixasFMJQzcVs8RkeynI3OcG+ 5Y30TQkGoB8aumucPAo52U0Oc5YO25rLruY/01Mk9ZHA67FxwvMRNZbWKz98 uNCTklY+saGSjK82mihHeoUw5KGgb5ooNsK2B4GcTOWW2ODUl/VHmfzKHcHk mzM89sRNsIrpqFVvt+vkBcO4pBW24j+6Q9chKQGra4wVlYeR9ZNolDyqNPA4 z9znWc8llfejnWdW8pWrl4hmAnQGSC+kQ8ILiiM7t03mc7uJjf7P//v/aXVt s1xqZDI56kDvfnqLAmlEEls2W1hOL65FskuJwtri5tXc8vrKhQ1aFeHeoTdw mF2dXkgVlrdLtVK9VW1RLh5IFpbya+sgEX304IG0Aw9G727tvP3+rVITtMko FdEARWurJWUfysDgL7xQBXm578nFYMS8XLJxNU+XqHhAC1UZdjjLYY9MQjov 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 F07TZ0ic7XaBT2MW1cbDoYjjmyEUZTQhaAu+ansJ0au5CIf1oDB7Ru7zw7n3 d/d5YLaPUa1xJltjzZezzIyCual0er4XlYfh70hESDYcS6MPvPH+5S9/63tf f+29q3eKu1UfoiSM9M1nk9gcqbjPD78cHjV869uVy1duH5b3s/mpldU1NB+G i3rA7MHW2STIQRT3OHKsK70LYcI/TT1DFjuuqflnUnlMqCQCfYTZnCFT2bV+ boE0twgg5nesIRjR62h17ly9XT4qIvxRIcIRWcQYeb1AN5aI1TEwwgEUz4E/ HIwn4qlcMBzvDoONNivoSyTTKLiFwjSaGpRXLVc6vQ5bBS6J9dkfttkTwVis 2UNdgBSxULTBsMnR7lqNhjSaIYTETTEk/GwA1A5Z1QHprCgeIifEBNIfk21M xwhpBs/+FNcbyrLE9u0j4pyxhA8Awueywb/6p5+HFvkVPJUFY9UxDaVBjq0x pA9zIo4N4+n3mCNICPqAthDxcjtkMpzjhifVSgvuZtORAqzE2TBiF5BiG4OM gYUwQcRGeu1uGyWVleCp+H2z1cyms9B/C6uFOUN2OQ7KXaBUcT6+8wXgqLBB 02sZdr1a5RFljYXhWVFmQorKwM+DDHpDzAL/0J/N5vZ39yBVWIgjT5NdOtB5 Rkqkhqs/yqAR1UJbWDrxVm/gD8bC8dROqfr11978vS9/641LxWoLzc7PYg/C sVp7UG90q7VupY1rpIM8TOWSvkC/2hpu7FZv3rpy+dr1WDyBoQoX4dpofWxf 8XJYbzjERETQazEhUHV8w0g4zN3dZLrh6Z0NpDlkPY+KJVaO7zy91ollpFSI OWYpRT2OoKWGQkj1Fkp0rVZptqoooz1GHQ1Nz89WZRf3YqlcKjvV90cHQ3Z7 uARlDgINeCOuhFC0VK4hBaEfBPnu7i4cmAUS2TB5EvtBlhmtqduXAS31swfN dvAhtOtNbo0xg/8gArv3BdA92Ab5qQKWN6uDfJA1jrrTaNQqsJ0Ke5RHTqcS 7E9sv4ODA56CpeemiKRASAwmL6plLP3gX/upF53WKG7s8VpmQTaIBIq8B2LA gwEXddreiNfyJeqIUS3nsOFlyYrctVPuUa0zzSTctBsxj9poLewcCYvBALnA zyFH6J4hIom4PmtWKZWcBHDs0udDFZkuTLPbYL4sCLy5Pxg6f0MfpQCzCybE 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 LmgBTAeSl7EcIQzrgICQwlOOQENMVQ+35hfnBURLxHgnmZ8Zxw6VayIcBCoF QI3oIjuZd8xWxAHq+H5xHxkxM7eIuqniZLEI1Sdur9+4eaeMA+TVT5+nSg+m lTqHuNL01mrDsttcRxB0JvU0daAetb9S7yTqfzE1vd7u7hZ1MpUUg2PV/Uo+ Bj02KnIeH08ZR1eDQQYpmhRJZvyx9LXNg89/6au/+vk/2qkOTp9/5tSTz0Gb 03PLGOO0RXNd4uW60i6mElkig2es7YtU0GxCUUh26eTZYDx9UKqgAqI73rh1 61d+7dfw5qtRc6dDHZDDYp0qeN/93lvoIZQfh5yIwVaqgjtZLBcDBYsQHYCm EpAd4TZT2BC7aJ48l+qa4UuRVoBVDVpGcV+1EHfIDAamOpOYjGAUh/5MbiaW nqJdXpW+1b7Ij/3JPw18Fs6dIRSpYFiaXj1zlLGaXyQhFRuc4PvJp86feOZp itvgJEKDxLGgsvbtdn5m6vd+57cuffAeTm2nRypjD5pSv+IqUZgNwLQ4ZBWs pVphILJ3VCblUC45ZZanEBw4biW2/WC+cBBhJePrJPQ3yvXiD7Ahoub4glzQ UiomgRZs0OB//Jd+RHPh6FJ6njvsn+YVMs+X0bSoVjUMBTTJZOhsCB4Zqs04 57zKGKpwZ6eH7M5k6WtHjg1NPVlfzbFK78n3SHxV7aHR1KArHKh3bt9GCd7e 2jqkHE+5DJSezH/KKfC4SqMKBYulo5u3r7Iup88mn3zyNL4PFzECBKIEQJpj GUpYHivrPhmQqxL8mbqpqJimOiPjJ6I2NH4pTFq8Sa7StXrduErV9GgIR1Np SuJicxAADcUz9Cm/cvP2d9+5+Ltf+dbXvvMBSVjEgRq94PTiyczUPKGGDN6B +QXUE2YAhRidhYdsoO5F0i14dToHvc6twJijqLXkLu4Vj9iH3/nu9775ra+D OCWmhn5GTbF0bhamQ+nGazfuvHfhw7ubdAePL7pKklAlPg5xMld6BvJSQ5om +AH5qlwBWqrOYEq2y7S/ZFXV7lb9tYVVdQEXFbkUE3ZrqibMsVRuJhBLV5qD vUp7v9J85TM/dOrsEztAZNRVvJun4iIVsZMZ+hIQnsovLr3wqU/PnDrDlkMx I2dT3VPhhcMBcRzUlJ/9b/8RLU/p2IRAVVTPJQ1hCqn+LkZPdwDi9KhIyaEa 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 1Dc28/BCacbOwgjjze5EK0g8Z7rERoO+/wWtCXC/IQOp0AAAAABJRU5ErkJg ggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIYC GgASAAEAnAAPAAQAAAAAAAAAAAAEAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA AA4AAAAOAAAADgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAEAAAEDx/wIAQAAMEAAAAAAAAAAABgBOAG8AcgBt AGEAbAAAAAIAAAAYAENKGABfSAEEYUoYAG1ICQRzSAkEdEgJBEQAAUABAAIA RAAMEAAAAAAAAAAACQBIAGUAYQBkAGkAbgBnACAAMQAAAAgAAQAGJAFAJgAQ AD4qAUIqCkNKJABwaABgvwBQAAJAAQACAFAADBAAAAAAAAAAAAkASABlAGEA ZABpAG4AZwAgADIAAAAIAAIABiQBQCYBHAA+KgFCKgpDShwAT0oEAFFKBABe SgIAcGgAYL8ARgADQAEAAgBGAAwQAAAAAAAAAAAJAEgAZQBhAGQAaQBuAGcA IAAzAAAACAADAAYkAUAmAhIANQiBT0oCAFFKAgBcCIFeSgIAVAAEQAEAAgBU AAwQAAAAAAAAAAAJAEgAZQBhAGQAaQBuAGcAIAA0AAAACAAEAAYkAUAmAx8A NQiBQioBQ0ocAE9KAwBRSgMAXAiBYUoUAHBoAAAAAABOAAVAAQACAE4ADBAA AAAAAAAAAAkASABlAGEAZABpAG4AZwAgADUAAAAIAAUABiQBQCYEGQA1CIE2 CIFCKgNDShwAXAiBXQiBcGgAzP8AAAAAAAAAAAAARABBQPL/oQBEAAwBAAAA AAAAAAAWAEQAZQBmAGEAdQBsAHQAIABQAGEAcgBhAGcAcgBhAHAAaAAgAEYA bwBuAHQAAAAAAFYAaUDz/7MAVgAMBQAAAAAAAAAADABUAGEAYgBsAGUAIABO AG8AcgBtAGEAbAAAACAAOlYLABf2AwAANNYGAAEFAwAANNYGAAEKA2wAYfYD AAACAAsAAAAoAGtA9P/BACgAAAUAAAAAAAAAAAcATgBvACAATABpAHMAdAAA AAIADAAAAAAAKgBXQKIA8QAqAAwQAAAAAAAAAAAGAFMAdAByAG8AbgBnAAAA BgA1CIFcCIEuAFhAogABAS4ADBAAAAAAAAAAAAgARQBtAHAAaABhAHMAaQBz AAAABgA2CIFdCIEyAP5PogARATIADAAAAAAAAAAAAA0AZQBjAF8AYwBvAHIA cgBlAGMAdABpAG8AbgAAAAAAIgD+T6IAIQEiAAwAAAAAAAAAAAAFAGUAcgBy AG8AcgAAAAAANgBVQKIAMQE2AAwAAAAAAAAAAAAJAEgAeQBwAGUAcgBsAGkA bgBrAAAADAA+KgFCKgJwaAAA/wBGAFZAogBBAUYADAAAAAAAAAAAABEARgBv AGwAbABvAHcAZQBkAEgAeQBwAGUAcgBsAGkAbgBrAAAADAA+KgFCKgxwaIAA gAA+AEJAAQBSAT4ADAAAAAAAAAAAAAkAQgBvAGQAeQAgAFQAZQB4AHQAAAAC ABUAEABDShYAT0oDAFFKAwBeSgIAQgBQQAEAYgFCAAwAAAAAAAAAAAALAEIA bwBkAHkAIABUAGUAeAB0ACAAMgAAAAIAFgAQAENKFABPSgMAUUoDAF5KAgCI AGVAAQByAYgADAAAAAAAAAAAABEASABUAE0ATAAgAFAAcgBlAGYAbwByAG0A YQB0AHQAZQBkAAAANwAXAA3GMgAQlAMoB7wKUA7kEXgVDBmgHDQgyCNcJ/Aq hC4YMqw1QDkAAAAAAAAAAAAAAAAAAAAAABQAQ0oUAE9KCQBRSgkAXkoJAGFK FAAwAP5PogCBATAADAAAAAAAAAAAAAwAZQBjAGMAbwByAHIAZQBjAHQAaQBv AG4AAAAAAEoAUUABAJIBSgAMAAAAAAAAAAAACwBCAG8AZAB5ACAAVABlAHgA dAAgADMAAAACABkAFwA1CIFDShYAT0oDAFFKAwBeSgIAYUoUAAAAAAAAAQAA AH4PAAD/////AAAAAAEA/////wAAAAAAAAAAAAAAAAEAAAAAAP////8AAAAA AAAAAAAAAAABAAAABAAAAAAAAAAACP//AAAAAAAAAAB+DwAABgAAOgAAAAD/ ////AQAAAAIIAAAAAAAAAAAAAAAAAAAAAAAAfg8AAAAAAAAAAAAAAAA9AAAA PgAAAI0AAACPAAAA8wAAACsBAABDAQAAVgEAAHgBAACBAQAAggEAAJUBAACW AQAA7gIAAAkDAADUAwAAVAQAAO8EAACfBQAAoQUAANQFAADVBQAA7AUAAAkG AAAkBgAATwYAAOAGAADhBgAATwcAAHYHAACDBwAAmAcAAKgHAADUBwAA5wcA ABIIAAAnCAAANggAAEwIAABdCAAAmAgAAO8IAABRCQAAAwoAAH8PAAAE/wAA 0C8AAGBxCAAAAQAA0C8AAF/KAgAAAQAA0C8AAKVFAwAAAQAA0C8AAF7IAQAA AQAA0C8AAHY6AgAAAgAA0C8AAHFuAgAAAQAA0C8AAHFuAgAAAQAA0C8AAHFu AgAAAQAA0C8AAHFuAgAAAQAA0C8AAHFuAgAAAQAA0C8AAHFuAgAAAQAA0C8A APvNAgAAAQAA0C8AAFbiAQAABQAA0C8AAFbiAQAAAQAA0C8AAPvNAgAAAgAA 0C8AAFbiAQAAAQAA0C8AAAfuBQAE/wAA0C8AAFGxDAAAAgAA0C8AAOtaAgAA AQAA0C8AAIHTAgAAAQAA0C8AACaSAgAAAQAA0C8AAI2sAgAAAQAA0C8AAGoB AgAAAQAA0C8AAGoBAgAAAQAA0C8AAGoBAgAAAQAA0C8AAGoBAgAAAQAA0C8A AGoBAgAAAQAA0C8AAGoBAgAAAQAA0C8AAI2sAgAAAQAA0C8AAKAeAgAAAQAA 0C8AAKAeAgAAAQAA0C8AAKAeAgAAAQAA0C8AAKAeAgAAAQAA0C8AAKAeAgAA AQAA0C8AAKAeAgAAAQAA0C8AAKAeAgAAAQAA0C8AAKAeAgAAAQAA0C8AAKAe AgAAAQAA0C8AAKAeAgAAAQAA0C8AAKAeAgAAAQAA0C8AAKAeAgAAAQAA0C8A AKAeAgAAAQAA0C8AAAlxBQAE/wAA0C8AAMeQBAAE/wAA0C8AAMbZFQAAAAAA PQAAAD4AAACNAAAAjwAAAPMAAAArAQAAQwEAAFYBAAB4AQAAgQEAAIIBAACV AQAAlgEAAO4CAAAJAwAA1AMAAFQEAADvBAAAnwUAAKEFAADUBQAA1QUAAOwF AAAJBgAAJAYAAE8GAADgBgAA4QYAAE8HAAB2BwAAgwcAAJgHAACoBwAA1AcA AOcHAAASCAAAJwgAADYIAABMCAAAXQgAAJgIAADvCAAAUQkAAAMKAADPCgAA gAsAADIMAAA1DAAANwwAADgMAABvDAAAcAwAAHEMAAClDAAAPg0AANANAAB3 DwAAeQ8AAHoPAAB7DwAAfA8AAH8PAACYAAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAACgAAAADMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY AAAAADAAAAAAAAAAgIIBAAAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAABgAAAACMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAFTAA AAAAAAAAgNECAAAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIDRAgAAAAAAAAAA AAAAAJgAAAAAMAAAAAAAAACA0QIAAAAAAAAAAAAAAACYAAAAFTAAAAAAAAAA gNECAAAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIDRAgAAAAAAAAAAAAAAABgA AAACMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgIQFAAAA AAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAA AAAAAACAhAUAAAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgIQFAAAAAAAAAAAA AAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACA hAUAAAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgIQFAAAAAAAAAAAAAAAAmAAA AAAwAAAAAAAAAICEBQAAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAhAUAAAAA AAAAAAAAAACYAAAAFjAAAAAAAAAAgIQFAAAAAAAAAAAAAAAAmAAAAAAwAAAA AAAAAICEBQAAAAAAAAAAAAAAAJgAAAAVMAAAAAAAAACAhAUAAAAAAAAAAAAA AACYAAAAADAAAAAAAAAAgIQFAAAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAICE BQAAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAhAUAAAAAAAAAAAAAAACYAAAA ADAAAAAAAAAAgIQFAAAAAAAAAAAAAAAAmAAAABkwAAAAAAAAAICEBQAAAAAA AAAAAAAAAJgAAAAAMAAAAAAAAACAhAUAAAAAAAAAAAAAAACYAAAAADAAAAAA AAAAgIQFAAAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAICEBQAAAAAAAAAAAAAA AJgAAAAAMAAAAAAAAACAhAUAAAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgIQF AAAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAICEBQAAAAAAAAAAAAAAAJgAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgIQFAAAAAAAA AAAAAAAAmAAAABYwAAAAAAAAAICEBQAAAAAAAAAAAAAAAJgAAAAAMAAAAAAA AACAhAUAAAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgIQFAAAAAAAAAAAAAAAA mAAAAAAwAAAAAAAAAICEBQAAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAhAUA AAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgIQFAAAAAAAAAAAAAAAAmAAAAAAw AAAAAAAAAICEBQAAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAhAUAAAAAAAAA AAAAAACYAAAAADAAAAAAAAAAgIQFAAAAAAAAAAAAAAAAmAAAABYwAAAAAAAA AICEBQAAAAAAAAAAAAAAAJgAAAAXMAAAAAAAAACAhAUAAAAAAAAAAAAAAACY AAAAADAAAAAAAAAAgIQFAAAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAICEBQAA AAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAIAAmAAAAAAQAAAAAAAAAIAAAACAAAAAAAAA AAAUAwAAAADVBQAA7AUAAAkGAAAkBgAATwYAAJgIAADvCAAAUQkAAAMKAACA CwAAfw8AAEuIADAAEAAAAAAAAAEAAAAKAAAAAQAAAMR8IgdJiAAwABAAAAAA AAABAAAACQAAAAAAAAAAAAABSYgAMAAQAAAAAAAAAgAAAAcAAAAAAAAAAAAA AUmIADAAMAAAAAAAAAEAAAADAAAAAAAAAAAAAAFJiAAwADAAAAAAAAABAAAA BAAAAAAAAAAAAAABSYgAMAAwAAAAAAAAAQAAAAQAAAABAAAAzHNtB0mIADAA MAAAAAAAAAEAAAADAAAAAAAAAAAAAAFJiAAwADAAAAAAAAACAAAAAQAAAAAA AAAAAAAB/Q8AAP8/AAD/DwAA/w8AAP8PAAAAAAAAAAAAAUvIADAAMAAAAAAA AAEAAAAAAAAAAAAAAAAAgAdLiAAwADAAAAAAAAABAAAAAAAAAAAAAABcCKAH AAYAANQIAACWCQAACQsAAJYMAADVDQAAKw4AAE8PAAD8EAAABBIAAHMSAAA3 FAAA0xUAAH4XAAAMAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFgAAABcA AAAYAAAAGQAAABoAAAAcAAAAAAYAAE8OAABwFAAAfhcAAA0AAAAVAAAAGwAA AAAGAAB9FwAADgAAAP0DAABOBAAAUAQAAGAGAACmBgAA3gYAAPwIAABNCQAA TwkAALUMAAA6DQAAPA0AANMNAABXDgAAWQ4AAFoOAADrDgAA7Q4AAO4OAABw DwAAcg8AAH4PAAATQ1T/FawTWBT/FYATQ1T/FawTQxT/FawTQxT/FawTQxT/ FawTQxT/FawPAADwSAEAAAAABvAYAAAAAggAAAIAAAAMAAAAAQAAAAEAAAAN AAAAbwAB8AgBAABSAAfwJAAAAAUFQlL7v+FqHZB2TjIggIEYMP8ASyAAAAIA AAA0OgAAAAAAAFIAB/AkAAAABQW4P9sjM4r9HROXcavSU+Zh/wAsDAAAAQAA AH9aAAAAAAAAYgAH8CQAAAAGBq27m/f9oxMNXvQ88WtLRpD/ADAMAAABAAAA q2YAAAAAAABiAAfwJAAAAAYG1jR5K3iBuqaM/qW3jP9Nj/8AOgkAAAEAAADb cgAAAAAAAGIAB/AkAAAABgafVNlOnv4Lk/GO2i1KhvwI/wBJLAAAAQAAABV8 AAAAAAAAUgAH8CQAAAAFBSjxXacUq+1G4kzHte+Z4gT/ALQXAAABAAAAXqgA AAAAAABAAB7xEAAAAAAAAAAAAP8AgICAAPcAABAADwAC8OAHAAAQAAjwCAAA AAgAAAAMBAAADwAD8H4HAAAPAATwKAAAAAEACfAQAAAAAAAAAAAAAAAAAAAA AAAAAAIACvAIAAAAAAQAAAUAAAAPAATwLAEAALIECvAIAAAABAQAAAAKAACD AAvw7gAAAARBAQAAAAXBjgAAAAYBCgAAAAkBuB4AAP8BAAAIAIHDAgAAAIPD LgAAAL8DIABgAGgAdAB0AHAAOgAvAC8AYQBkAHMAMQAuAG0AcwBuAC4AYwBv AG0ALwBhAGQAcwAvAHAAcgBvAG4AdwBzAC8AQwBJAFEALwBIAE0ATQBMAC8A ZQBuAC8AVwBMAE0AZQBtAGIAZQByAEwAZQB0AHQAZQByAEIAYQBuAG4AZQBy AF8AZQBuAC4AagBwAGcAAAAAAAUACAAIAN7///8AAAAA3v///0tUAABgVAAA S1QAAGBUAAAAAAAA3v///wAAAAATACLxBgAAAD8FAAABAAAAEPAEAAAAAQAA AAAAEfAEAAAAAQAAAA8ABPDoAAAAsgQK8AgAAAAGBAAAAAoAAGMAC/CqAAAA BEECAAAABcFyAAAABgEKAAAACQFmJgAA/wEAAAgAgcMUAAAAaAB0AHQAcAA6 AC8ALwBpADIALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8AaAAvAGEA bABsAC8AaQAvAG0AcwBfAG0AYQBzAHQAaABlAGEAZABfADgAeAA2AGEAXwBs AHQAcgAuAGoAcABnAAAATQBpAGMAcgBvAHMAbwBmAHQAAAATACLxBgAAAD8F AAABAAAAEPAEAAAABgAAAAAAEfAEAAAAAQAAAA8ABPDMAAAAsgQK8AgAAAAH BAAAAAoAAHMAC/CIAAAABEEDAAAABcFcAAAABgEKAAAAPwEAAAYAvwEMAB8A /wEAAAgAgcMCAAAAaAB0AHQAcAA6AC8ALwBoAHAALgBtAHMAbgAuAGMAbwBt AC8AYwAvAGgAbwB0AG0AYQBpAGwALwBXAEwASABMAG8AZwBvADIAMQA5AHgA MwAxAC4AZwBpAGYAAAAAACMAIvEMAAAAvwMAAIABPwUAAAEAAAAQ8AQAAAAA AAAAAAAR8AQAAAABAAAADwAE8AgBAACyBArwCAAAAAgEAAAACgAAcwAL8MQA AAAEQQQAAAAFwWoAAAAGAQoAAAA/AQAABgC/AQwAHwD/AQAACACBwzAAAABo AHQAdABwADoALwAvAGUAdQByAC4AaQAxAC4AeQBpAG0AZwAuAGMAbwBtAC8A ZQB1AHIALgB5AGkAbQBnAC4AYwBvAG0ALwBpAC8AZQB1AC8AaABwAC8AeQB1 AGsAMQAuAGcAaQBmAAAAWQBhAGgAbwBvACEAIABVAEsAIAAgAA0ACgAgACYA IABJAHIAZQBsAGEAbgBkAAAAIwAi8QwAAAC/AwAAgAE/BQAAAQAAABDwBAAA AAIAAAAAABHwBAAAAAEAAAAPAATwLAEAALIECvAIAAAACQQAAAAKAACDAAvw 7gAAAARBAQAAAAXBjgAAAAYBCgAAAAkBwjUAAP8BAAAIAIHDAgAAAIPDLgAA AL8DIABgAGgAdAB0AHAAOgAvAC8AYQBkAHMAMQAuAG0AcwBuAC4AYwBvAG0A LwBhAGQAcwAvAHAAcgBvAG4AdwBzAC8AQwBJAFEALwBIAE0ATQBMAC8AZQBu AC8AVwBMAE0AZQBtAGIAZQByAEwAZQB0AHQAZQByAEIAYQBuAG4AZQByAF8A ZQBuAC4AagBwAGcAAAAAAAUACAAIAN7///8AAAAA3v///0tUAABgVAAAS1QA AGBUAAAAAAAA3v///wAAAAATACLxBgAAAD8FAAABAAAAEPAEAAAABAAAAAAA EfAEAAAAAQAAAA8ABPAQAQAAsgQK8AgAAAAKBAAAAAoAAHMAC/DMAAAABEEF AAAABcFgAAAABgEKAAAAPwEAAAYAvwEMAB8A/wEAAAgAgcNCAAAAaAB0AHQA cAA6AC8ALwB3AHcAdwAuAGUAbQBhAGkAbAAyAHMAdQBjAGMAZQBzAHMALgBj AG8AbQAvAGkAbQBhAGcAZQBzAC8AYwBvAHUAbgB0AGUAcgAuAGcAaQBmAAAA RwBlAHQAIABlAGQAIAB0AHIAYQBmAGYAaQBjACAAdABvACAAeQBvAHUAcgAg AHcAZQBiACAAcwBpAHQAZQAhAAAAIwAi8QwAAAC/AwAAgAE/BQAAAQAAABDw BAAAAAMAAAAAABHwBAAAAAEAAAAPAATw8gAAALIECvAIAAAACwQAAAAKAACT AAvwqAAAAARBBgAAAAXBEgAAAAYBAgAAAP8BAAAIAIHDMgAAAIPDLgAAAIQD CboAAIYDCboAAL8DIABgAG0AdQBiAGEAaQBkAGkAbgAAAFAAcgBvAGYAZQBz AHMAbwByACAAQQBtAG0AYQByACAATQB1AGIAYQBpAGQAaQBuAAAABQAIAAgA ef///wAAAAB5////9FMAAGBUAAD0UwAAYFQAAAAAAAB5////AAAAADMAIvES AAAAkgMDAAAAvwMAAAACPwUAAAEAAAAQ8AQAAAAFAAAAAAAR8AQAAAABAAAA DwAE8EIAAAASAArwCAAAAAEEAAAADgAAUwAL8B4AAAC/AQAAEADLAQAAAAD/ AQAACAAEAwkAAAA/AwEAAQAAABHwBAAAAAEAAAAAAAAAAQAAAAIAAADUAwAA nwUAADIMAAB3DwAAfg8AAAcEAAAAAAAAtAAAABgVAABYBQAAdAAAAAAABAQA AGD6//841///hDAAAJBRAAB0QAAAAAAIBAAAyBQAACABAACULAAAwQQAAHQA AAAAAAoEAAB4DwAADwIAAGwbAADvAwAAdAAAAAAACQQAAEz///9AAAAAODEA AJ12AAB0QAAAAAALBAAAAAAAACcAAAAkCQAAcwcAAHRAAAAAAAYEAADg/v// RAAAABgwAAD0HAAAdAAAAAAA//8eAAAABgDMaEIAEQABALQpGAAGAM1oQgAI AAEAnCtCAwYAzmhCABEAAQB8ajsDBgDPaEIAEQABAJRuhwYGANBoQgAJAAEA vFU8AwYA0WhCAAgAAQAUXz0DBgDSaEIACQABALyligYGANNoQgAIAAEAdFQ8 AwYA1GhCABEAAQC0VDwDBgDVaEIACQABACQVOgMGANZoQgAIAAEAZBU6AwYA 12hCAAkAAQCkFToDBgDYaEIACAABAKQPOgMGANloQgAIAAEA5A86AwYA2mhC AAkAAQAkEDoDBgDbaEIAEQABAEw5OAMGANxoQgAIAAEAjDk4AwYA3WhCABEA AQDMOTgDBgDeaEIACQABALT7HQAGAN9oQgAIAAEA9PsdAAYA4GhCAAkAAQA0 /B0ABgDhaEIACAABAHT8HQAGAOJoQgAJAAEAdPkdAAYA42hCAAgAAQC0+R0A BgDkaEIACAABAPT5HQAGAOVoQgAJAAEANPodAAYA5mhCAAkAAQAUUDwDBgDn aEIACAABAFRQPAMGAOhoQgAJAAEAlFA8AwYA6WhCAAgAAQDUUDwDeAAAAHgA AAB+AAAAhQAAAMoAAADOAAAAzgAAACsBAAArAQAAQwEAAEMBAABWAQAAVgEA ABgCAAAYAgAAOwMAADsDAABGAwAA4gQAAOIEAAANBQAADQUAAFwFAABcBQAA xQUAAMUFAAC8CgAAvAoAAMANAADADQAAfw8AAAAAAAACAAIAAAACAAEAAAAC AAMAAAACAAQAAAABAAUAAAACAAYAAAACAAcAAAACAAgAAAACAAkAAAACAAoA AAACAAsAAAACAAwAAAACAA0AAAACAA4AAAACAA8AAAACABAAAAACABEAAAAC ABIAAAACABMAAAACABQAAAACABUAAAACABYAAAACABcAAAACABgAAAACABkA AAACABoAAAACABsAAAACABwAAAACAB0AAAACAH0AAACEAAAAiwAAAIsAAADM AAAA1AAAANQAAAA7AQAAOwEAAEkBAABJAQAAZAEAAGQBAAAgAgAAIAIAAEUD AABMAwAATAMAAOQEAADkBAAAGwUAABsFAABqBQAAagUAANMFAADTBQAAwAoA AMAKAADODQAAzg0AAH8PAAAAAAEAAgABAAEAAAADAAAABAAAAAUAAAAGAAAA BwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAEAEAAAABEAAAAS AAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0A AAAHAAAAPQAAAB4AAAAqgHVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2Zm aWNlOnNtYXJ0dGFncwmAUGxhY2VOYW1lAIA9AAAAGwAAACqAdXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6c21hcnR0YWdzCYBQbGFjZVR5cGUA gF8AAAAaAAAAKoB1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpz bWFydHRhZ3MOgGNvdW50cnktcmVnaW9uHYBodHRwOi8vd3d3LjVpYW50bGF2 YWxhbXAuY29tL2gAAAAYAAAAKoB1cm46c2NoZW1hcy1taWNyb3NvZnQtY29t Om9mZmljZTpzbWFydHRhZ3MEgENpdHkwgGh0dHA6Ly93d3cuNWlhbWFzLW1p Y3Jvc29mdC1jb206b2ZmaWNlOnNtYXJ0dGFnc1YAAAAdAAAAKoB1cm46c2No ZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpzbWFydHRhZ3MFgHBsYWNlHYBo dHRwOi8vd3d3LjVpYW50bGF2YWxhbXAuY29tLzsAAAAXAAAAKoB1cm46c2No ZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpzbWFydHRhZ3MHgGFkZHJlc3MA gDoAAAAWAAAAKoB1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpz bWFydHRhZ3MGgFN0cmVldACADAAAAfCz7QIAAAAAHgAAAAAAHQAAAAAAHgAA AAAAGwAAAAAAGgAAAAAAHQAAAAAAGAAAAAAAFwAAAAAAFgAAAAAAGAAAAAAA HQAAAAAAGgAAAAAAHQAAAAAAHQAAAAAAGAAAAAAAHgAAAAAAHQAAAAAAGwAA AAAAGgAAAAAAHQAAAAAAGgAAAAAAHQAAAAAAGgAAAAAAHQAAAAAAHQAAAAAA GgAAAAAAGgAAAAAAHQAAAAAAGgAAAAAAHQAAAAAAAAAAACQGAAAqBgAANQYA AE4GAAB7DwAAfw8AAAcABQAHAAUABwAHAAAAAAAkBgAATgYAAHsPAAB/DwAA BwAFAAcABwAAAAAA7AEAAAkCAAApAgAAMwIAALQCAADuAgAA1QUAAOwFAAAJ BgAANQYAAE4GAABPBgAAYAYAAN8GAADUBwAAEggAACcIAABcCAAAMwoAADcK AADTDQAAeg8AAHsPAAB/DwAABwAEAAcABAAHAAUABwAFAAcABQAEAAUABwAE AAcABQAHAAUABwAEAAcABQAHAAcAAAAAAHsPAAB/DwAABwAHACoAAAAEAAAA CAAAAOUAAAAAAAAAKQAAABwdCQDiQgkANCcKADBUCwB5axkAOlYiAJdMJwAL Fz8ACThAAGlVQwDrQUQAa0ZEAAhHRAD2EUsAZwtRAOE+VAAmOVUAWHB0AFcT eACJWIMA9FqLAGwjjQDtR40AFXiNAOxakAAreZEAFiCUAHJZnAAbKZ4AMg6l ALM0rACaebEAOgS8AGxTvQA1Xb0ALAzIAI4qzQBPe80AwkvPAKg93ABjYuEA XyvyAP9AAQEBAJ8FAACgBQAAZCdPAQEAAQCfBQAAAgAAADUGAAAAAAAAAhAA AAAAAAAAfg8AAGAAABAAQAAA//8BAAAABwBVAG4AawBuAG8AdwBuAP//AQAI AAAAAAAAAAAAAAD//wEAAAAAAP//AAACAP//AAAAAP//AAACAP//AAAAAAoA AABHFpABAAACAgYDBQQFAgMEh3oAIAAAAIAIAAAAAAAAAP8BAAAAAAAAVABp AG0AZQBzACAATgBlAHcAIABSAG8AbQBhAG4AAAA1FpABAgAFBQECAQcGAgUH AAAAAAAAABAAAAAAAAAAAAAAAIAAAAAAUwB5AG0AYgBvAGwAAAAzJpABAAAC CwYEAgICAgIEh3oAIAAAAIAIAAAAAAAAAP8BAAAAAAAAQQByAGkAYQBsAAAA NyaQAQAAAgsGBAMFBAQCBIcCACAAAAAAAAAAAAAAAACfAQAAAAAAAFYAZQBy AGQAYQBuAGEAAAA7FpABAAACCgQCBgQGAQMBAwAAAAAAAAAAAAAAAAAAAAEA AAAAAAAAQwBhAHMAdABlAGwAbABhAHIAAABRFpABAAACAgYCCAUFAgMDAwAA AAAAAAAAAAAAAAAAAAEAAAAAAAAAQgBhAHMAawBlAHIAdgBpAGwAbABlACAA TwBsAGQAIABGAGEAYwBlAAAANSaQAQAAAgsGBAMFBAQCBId6AGEAAACACAAA AAAAAAD/AQEAAAAAAFQAYQBoAG8AbQBhAAAAUyaQAQAAAg8HBAMFBAMCBAMA AAAAAAAAAAAAAAAAAAABAAAAAAAAAEEAcgBpAGEAbAAgAFIAbwB1AG4AZABl AGQAIABNAFQAIABCAG8AbABkAAAARxaEAwAAAgcKAwgGBgICAwMAAAAAAAAA AAAAAAAAAAABAAAAAAAAAEIAbwBkAG8AbgBpACAATQBUACAAQgBsAGEAYwBr AAAAPzWQAQAAAgcDCQICBQIEBId6ACAAAACACAAAAAAAAAD/AQAAAAAAAEMA bwB1AHIAaQBlAHIAIABOAGUAdwAAACIABADxCIgIAPDQAuQEaAEAAAAAAGLx ZgBi8Wa1EeSmAgABAAAATwIAACwNAAABAAcAAAAEAAMQHAAAAE8CAAAsDQAA AQAHAAAAHAAAAAAAAAAhAwDwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAtAC0AIGBcjQAABAAGQBkAAAAGQAAAHQP AAB0DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAgyg1EA8BAACNz//QEA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASFAAAAAAKPD/DwEAAT8AAOQEAAD/ //9/////f////3////9/////f////3////9/bCONAAAEAAAyAAAAAAAAAAAA AAAAAAAAAAD//xIAAAAAAAAAAQAgAAAAAAAAAAQAdQBzAGUAcgADAHAAYwAx AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAABQECAAAAAAAAAAAA AAAAAAAAAAABAAAA4IWf8vlPaBCrkQgAKyez2TAAAAAUyAgAEgAAAAEAAACY AAAAAgAAAKAAAAADAAAArAAAAAQAAAC4AAAABQAAAMgAAAAHAAAA1AAAAAgA AADkAAAACQAAAPAAAAASAAAA/AAAAAoAAAAcAQAACwAAACgBAAAMAAAANAEA AA0AAABAAQAADgAAAEwBAAAPAAAAVAEAABAAAABcAQAAEwAAAGQBAAARAAAA bAEAAAIAAADkBAAAHgAAAAQAAAAgAAAAHgAAAAQAAAAAAAAAHgAAAAgAAAB1 c2VyAAAAAB4AAAAEAAAAAAAAAB4AAAAIAAAATm9ybWFsAAAeAAAABAAAAHBj MQAeAAAABAAAADIAAAAeAAAAGAAAAE1pY3Jvc29mdCBPZmZpY2UgV29yZAAA AEAAAAAARsMjAAAAAEAAAAAAXoReINLKAUAAAAAAcFryHbLLAUAAAAAAcFry HbLLAQMAAAABAAAAAwAAAE8CAAADAAAALA0AAAMAAAAAAAAARwAAAKDGCAD/ ////AwAAAAgAVlQkbVQQAQAJAAADQGMEABsAMf8BAAAABAAAAAMBCAAFAAAA CwIAAAAABQAAAAwCxRnyEwQAAAAuARgAHAAAAPsCEAAHAAAAAAC8AgAAAAAB AgIiU3lzdGVtABnyEwAAAuUAAJDzFwsE7oM5CNA5AwwCAAAEAAAALQEAAAMA AAAeAAQAAAAHAQQAMf8BAEELIADMAIgAgQIAAAAA+jKPFgLvqP0oAAAAgQIA AIgAAAABABgAAAAAACD+AwAAAAAAAAAAAAAAAAAAAAAA//////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////AP////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////wD///////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////8A //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////////////////////AP////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////wD///////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////8A//////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// AP////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////////////wD///////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////8A//////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////AP////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /wD///////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////8A//////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////////AP////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////wD///////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //8A//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////////////////////////AP////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////wD///////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////8A//////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////AP////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////////////////wD///////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////8A//////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////AP////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////wD///////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////8A//////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////////////AP////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////wD///////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////8A//////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////////////////////////////AP////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////wD///////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////8A//////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////AP////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////////////////////wD///// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////f///////////////f/ //////////////////////////////////////////////////////////// //////////////////////////////////f///////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////f///// //////////f///////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////f///////////////////////////////////////// //////////////////////////////////////8A//////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////AP//9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// 9///9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////9///////9///////9///////9///////9///////9///////9/////// 9///////9///////9///////9///////9///////9///////9///////9/// ////////////////////////////////////////////9///////9/////// 9///////9wD///////f///////f///////f///////f///////f///f///f/ //////f///f///f///////f///f///f///////f///f///f///////f///f/ //f///////f///f///f///////f///////f///////f///////f///////f/ //f///f///////f///f///f///////f///////f///////f///////f///// //f///////f///////f///////f///////f///////f///////f///////f/ //////f///////f///////f///////f///////f///////f///////f///// //f///////f///////f///////f///////f///////f///////f///////f/ //////f///////f///////f///////f///////f///////f///////f///// //f///////f///////f///////f///////f///////f///////f///////f/ //////f///////f///////f///f///f///////f///f///f///////f///f/ //f///////f///f///f///////f///////f///////f///////f///////f/ //f///f///////f///f///f///////f///////f///////////////////// //f///f///f///////f///f///f///////f///////f///////f///////f/ //////f///////f///////f///////f///f///f///f///f///////f///f/ //f///////f///f///f///////f///f///f///////f///f///f///////f/ //f///f///////f///////f///////f///////f///////f///f///f///// //f///f///f///////f///f///f///////f///f///f///////f///f///f/ //////f///f///f///////f///f///f///////f///f///f///////f///f/ //f///////f///f///f///////f///f///f///////f///f///f///////f/ //f///f///////f///f///f///////f///f///f///////f///f///f///// //f///f///f///////f///f///f///////f///f///f///////f///f///f/ //////f///f///f///////f///f///f///////f///f///f///////f///f/ //f///////f///f///f///////f///f///f///////f///f///f///////f/ //f///f///////f///f///f///////f///f///f///////f///////f///// //f///////f///////f///////f///////f///////f///////f///f///f/ //////f///f///f///////f///f///f///////f///f///f///////f///// //f///////f///////f///////f///f///f///////f///f///f///////f/ //f///f///////f///f///f///f///f///f///f///f///f///f///f///f/ //f///f///f///f///f///f///f///f///f///f///f///f///f///f///f/ //////f///f///f///////f///f///f///////f///f///f///////f///f/ //f///////f///////f///////f///////f///////f///f///f///////f/ //f///f///////f///f///f///////f///f///f///////f///f///f///// //f///f///f///////f///f///f///////f///f///f///////f///////f/ //////f///////f///////f///f///f///////f///f///f///////f///f/ //f///////f///f///f///////f///////f///////f///////f///////f/ //f///f///////f///f///f///////f///f///f///////f///f///f///// //f///f///f///////f///f///f///////f///f///f///////f///f///f/ //////f///f///f///////f///f///f///////f///f///f///////f///f/ //f///////f///f///f///////f///f///f///////f///f///f///////f/ //f///f///////f///f///f///////f///f///f///////f///f///f///// //f///f///f///////f///////f///////f///////f///////f///////f/ //////f///////f///f///f///////f///////f///f///f///////f///f/ //////////////////////////////////////////f///f///f///8A///v ///3///3///3///v///3///3///3///v///3///3///3///v///3///3///3 ///v///3///3///3///v///3///3///3///v///3///3///3///v///3///3 ///3///v///3///3///3///v///3///3///3///v///3///3///3///v///3 ///3///3///v///3///3///3///v///3///3///3///v///3///3///3///v ///3///3///3///v///3///3///3///v///3///3///3///v///3///3///3 ///v///3///3///3///v///3///3///3///v///3///3///3///v///3///3 ///3///v///3///3///3///v///3///3///3///v///3///3///3///v///3 ///3///3///v///3///3///3///v///3///3///3///v///3///3///3///v ///3///3///3///v///3///3///3///v///3///3///3///v///3///3///3 ///v///3///v///3///v///3///v///3///v///3///v///3///v///3///v ///3///v///3///3///3///v///3///3///3///v///3///v///3///v///3 ///v///3///3///3///3///3///3///3///3///3///v///3///3///3///v ///3///3///3///v///3///3///3///v///3///3///3///v///3///3///3 ///v///3///3///3///v///3///v///3///v///3///3///3///v///3///3 ///3///v///3///3///3///v///3///3///3///v///3///3///3///v///3 ///3///3///v///3///3///3///v///3///3///3///v///3///3///3///v ///3///3///3///v///3///3///3///v///3///3///3///v///3///3///3 ///v///3///3///3///v///3///3///3///v///3///3///3///v///3///3 ///3///v///3///3///3///v///3///3///3///v///3///3///3///v///3 ///3///3///v///3///3///3///v///3///3///3///v///3///3///3///v ///3///3///3///v///3///3///3///v///3///3///3///v///3///3///3 ///v///3///3///3///v///3///3///3///v///3///3///3///v///3///3 ///3///v///3///3///3///v///3///3///3///v///3///3///3///v///3 ///v///3///v///3///v///3///v///3///3///3///v///3///3///3///v ///3///3///3///v///3///3///3///v///3///v///3///v///3///v///3 ///v///3///3///3///v///3///3///3///3///3///3///3///3///3///3 ///3///v///3///3///3///v///3///3///3///v///3///3///3///v///3 ///3///3///v///3///3///3///v///3///3///3///v///3///3///3///v ///3///3///3///v///3///3///3///v///3///3///3///v///3///3///3 ///v///3///3///3///v///3///3///3///v///3///3///3///3///3///3 ///3///3///3///3///3///v///3///3///3///v///3///3///3///v///3 ///3///3///v///3///3///3///v///3///3///3///v///3///3///3///v ///3///3///3///v///3///3///3///3///3///3///3///3///3///3///3 ///v///3///3///3///v///3///3///3///v///3///3///3///v///3///3 ///3///3///3///3///3///3///3///3///3///v///3///3///3///v///3 ///3///3///v///3///3///3///v///3///3///3///v///3///3///3///v ///3///3///3///v///3///3///3///v///3///3///3///v///3///3///3 ///v///3///3///3///v///3///3///3///v///3///3///3///v///3///3 ///3///v///3///3///3///v///3///3///3///v///3///3///3///v///3 ///3///3///v///3///3///3///v///3///3///3///v///3///3///3///v ///3///3///3///v///3///3///3///3///3///3///3///3///3///3///3 ///v///3///3///3///v///3///v///3///3///3///3///3///v///3//// ///////////////////////3///3///3///3///3AP//9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 9///////9///9///9///9///7///9///9///9///9///9///9///9///9/// 9///7///9///9///9///7///9///9///9///7///9///7///9///7///9/// 7///9///7///9///9///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 9///9///7///9///9///9///9///////9///9///9///9///9///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///9///9///7///9///9///9///7///9/// 7///9///7///9///7///9///9///9///7///9///7///9///9/////////// ////////////////////9///9wD//+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+////f//+///+///+////f/ /+///+///+///+///+///+///+///+///+///+////////////////////// //////f//////+////f//+////f//+////f//+////f//+////f//+////f/ /+////f//+////f//+////f//+///+///+////f//+///+///+////f//+// //f//+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+////f//+///+///+////f//+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+////f//+////f//+////f//+// //f///f///f///f///f///f///f//+////f//+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+f//+///+///+///+f//+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+f//+///+///+// /+f//+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+f//+///+////f//+///+////f///////f///////////// //f///////cA///3///v///v///v///3///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///3 ///v///v///v///3///v///v///v///3///v///v///v///3///v///v///v ///3///v///v///v///3///v///v///v///3///v///v///v///3///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///3///v///v///v ///3///v///v///v///3///v///3///v///3///v///3///v///3///v///3 ///v///3///v///3///v///3///v///3///v///3///v///3///v///3///v ///3///v///3///v///3///v///3///3///////////////////////3///3 ///v///3///v///3///v///3///v///3///v///3///v///3///v///3///v ///3///v///3///v///3///v///3///v///3///3///3///v///3///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///3///v///3///v///3///v///3///v///3///v///v///v///3 ///v///v///v///3///v///v///v///3///v///v///v///3///v///3///v ///3///v///3///v///3///v///3///v///3///v///3///v///3///3///3 ///3///////3///3///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///n///v///v///v///n///v///v///v///n///v ///v///v///n///v///v///v///n///v///v///v///n///v///n///v///n ///v///n///v///n///v///v///v///n///v///v///v///n///v///v///v ///n///v///v///v///n///v///n///v///n///v///n///v///n///v///v ///v///n///v///v///v///n///v///v///v///n///v///v///v///n///v ///v///v///n///v///v///v///n///v///v///v///n///v///v///v///n ///v///v///v///n///v///v///v///n///v///v///v///n///v///v///v ///n///v///v///v///n///v///v///v///n///v///v///v///n///v///v ///v///n///v///v///v///n///v///v///v///n///v///v///v///n///v ///v///v///n///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///n///v///v///v ///v///v///v///v///v///3///3///3///3///////3///////3///3AP// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///7///7///5///7///7/// 7///5///7///7///7///5///7///7///7///5///7///5///7///5///7/// 5///7///5///7///7///7///5///7///7///7///5///7///5///7///5/// 7///5///7///5///7///7///9///9///9///9///9///9///9///9/////// 7///7///7///7///5///7///5///7///5///7///7///7///5///7///7/// 7///5///7///7///7///7///7///7///9///7///7///5///7///5///5/// 5///7///5///7///5///5///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///7///7///7///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///7///7///7///7///7///7///7///7///7///7///7///9///7///9/// 7///9///7///7///7///7///5///7///7///7///5///5///5///7///5/// 5///5///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///5///5///7///5///5///5///7///5///5///5///7///5///5///5/// 7///5///5///5///7///5///5///5///7///5///7///5///7///5///7/// 5///7///5///5///5///7///5///5///5///7///5///7///5///7///5/// 7///5///7///5///5///5///7///5///5///5///7///5///5///5///7/// 5///5///5///7///5///5///5///7///5///7///5///7///5///5///5/// 7///5///5///5///7///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///7///5///7///5///7///5///7///5/// 5///5///7///5///5///5///7///5///5///5///7///5///5///5///7/// 5///5///5///7///5///5///5///7///5///7///5///7///5///7///5/// 7///5///5///5///7///5///5///5///7///5///7///5///7///5///7/// 5///7///5///5///5///7///5///7///7///9///7wD//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+f//+///+///+///+f//+///+///+///+f//+///+// /+///+f//+///+///+///+f//+///+///+///+f//+///+///+///+f//+// /+///+///+f//+///+///+///+f//+///+///+///+f//+///+///+///+f/ /+///+///+///+f//+///+///+///+f//+///+///+///+f//+///+///+// /+///+///+///+///+////f///f///f///f///f///f///////f///f//+// /+///+///+///+///+///+f//+///+///+///+///+///+///+///+f//+// /+///+///+///+///+///+///+///+///+///+f//+f//+///+f//+f//+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+///+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+///+///+f//+///+///+///+f//+// /+///+///+f//+///+///+///+///+///+///+///+////f//+///+///+// /+///+///+///+f//+///+f//+f//+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+f//+f//+///+f//+f//+f//+///+f//+f//+f//+f//+f/ /+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/ /+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/ /+///+f//+f//+f//+///+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/ /+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/ /+f//+f//+///+f//+///+f//+///+f//+f//+f//+///+f//+f//+f//+// /+f//+f//+f//+///+f//+f//+f//+///+f//+f//+f//+f//+f//+f//+f/ /+f//+f//+f//+f//+///+f//+f//+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+////cA///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n9//n///n///n///n9//n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///v///n///n///n///v///n///n///n///v///n///n///n///v///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///v///n///n///n///v///n///n///n///n///n///n///n///n ///n///n///n///v///n///n///n///v///n///n///n///v///n///n///n ///v///v///v///3///3///v///v///v///3///v///3///v///v///n///v ///n///v///n///n///n///n///n///n///n///v///n///n///n///v///n ///v///n///v///n///v///n///n9//e///n9//e///n9//e///n///n///n ///n///n///n///n///n///n///n///n9//n///n///n///n9//n///n///n ///n9//e///n///n///n9//e///n///n///n///n///n///n///n///n///n ///n///n9//e///n///n///n9//e///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n9//e///n///n///n9//e///n///n///n9//e///n ///n///n9//e///n///n///n9//e///n///n///n9//e///n///n///n9//e ///n///n///n9//e///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///v///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///v///n///n///n///v///n///n///n///n///n///n///n///n///n ///n///n///v///n///v///n///v///n///v///n///v///v///v///v///v ///n///n///n///n///e///n///n///n///e///n///n///n9//e///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///e ///n///e///n///e///n///e///n///e///n///e///n///e///n///e///n ///e///n///e///n///e///n///e///n///e///n///e///n///e///n///e ///n///e///n9//e///n///e///n9//e///n///e///n///e///n///e///n ///e///n///e///n9//e///n///e///n9//e///n///e///n///e///n///e ///n///e///n///e///n///e///n///e///n///e///n9//e///n9//e///n ///n///n9//e///n///n///n///e///n///n///n///e///n///n///n///e ///n///n///n///e///n///e///n///e///n///e///n///e///n///e///n ///e///n///e///n///e///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///e///n///n///n///e///n///n///n///n///n///n///n///n ///n///n///n///e///n///n///n///e///n///n///n///e///n///e///n ///n///n///vAP//5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///7///5///5///5/// 7///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///7/// 5///5///5///7///5///5///5///5///5///7///5///5///5///5///5/// 9///7///9///7///7///7///7///7///7///7///7///5///7///5///7/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 7///5///7///5///5///3v//5///3v//5///3v//5///5///5///5///5/// 5///5///5///5///5///5///3v//5///5///5///5///5///3v//5///3v// 5///3v//5///3v//5///5///5///5///5///5///5///5///5///3v//5/// 3v//5///3v//5///3v//5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///3v//5///5///5///3v//5///5///5///3v//5///5///5///3v// 5///3v//5///3v//5///3v//5///3v//5///3v//5///3v//5///3v//5/// 3v//5///3v//5///3v//5///3v//5///3v//5///3v//5///3v//5///3v// 5///3v//5///5///5///3v//5///5///5///3v//5///5///5///5///5/// 5///5///5///5///5///5///5///7///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///7///5///7///7///7///5///7/// 5///5///3v//5///3v//5///5///5///3v//5///3v//5///5///5///3v// 5///5///5///3v//5///5///5///3v//5///5///5///5///5///5///5/// 5///5///5///5///3v//5///5///5///3v//5///5///5///5///5///5/// 5///5///5///5///5///3v//5///5///5///3v//5///5///5///3v//5/// 5///5///3v//5///5///5///3v//5///5///5///3v//5///3v//5///3v// 5///3v//5///3v//5///3v//5/f/3v//5///3v//5/f/3v//5///3v//5/f/ 3v//5///3v//5/f/3v//5///3v//5/f/3v//5///3v//5/f/3v//5///3v// 5/f/3v//5///3v//5/f/3v//5///3v//5/f/3v//5///3v//5/f/3v//5/// 3v//5/f/3v//5///3v//5/f/3v//5///3v//5/f/3v//5///3v//5/f/3v// 5///3v//5/f/3v//5///3v//5/f/3v//5/f/3v//5/f/3v//5///3v//5/f/ 3v//5///3v//5/f/3v//5///3v//5/f/3v//5///3v//5/f/3v//5///3v// 5/f/3v//5///3v//5///3v//5///3v//5///3v//5///3v//5///3v//5/// 3v//5///3v//5///5///5///3v//5///5///5///3v//5///5///5///3v// 5///5///5///3v//5///5///5///3v//5///5///5///3v//5///5///5/// 3v//5///5///5///3v//5///5///5///3v//5///5///5///3v//5///5/// 5///3v//5///5///5///3v//5///5///5/f/3v//5/f/3v//5/f/3v//5wD3 /97//+f3/97//+f3/97//+f3/97//+f3/97//+f3/97//+f3/97//+f3/97/ /+f3/97//+f3/97//+f3/97//+f3/97//+f3/97//+f3/97//+f3/97//+f3 /97//+f3/97//+f3/97//+f3/97//+f3/97//+f3/97//+f3/97//+f3/97/ /+f3/97//+f3/97//+f3/97//+f3/97//+f3/97//+f3/97//+f3/97//+f3 /97//+f3/97//+f3/97//+f3/97//+f3/97//+f3/97//+f3/97//+f3/97/ /+f3/97//+f3/97//+f3/97//+f3/97//+f3/97//+f3/97//+f//97//+f/ /97//+f//97//+f//97//+f3/97//+f//97//+f3/97//+f//97//+f3/97/ /+f//97//+f3/97//+f//97//+f3/97//+f//97//+f3/97//+f//97//+f3 /97//+f//97//+f3/97//+f//97//+f//97//+f//97//+f//97//+f//97/ /+f3/97//+f//97//+f3/97//+f//97//+f3/97//+f//97//+f3/97//+f/ /97//+f//97//+f//97//+f//97//+f//97//+f//97//+f//97//+f//97/ /+f//97//+f3/97//+f//+f//+f//97//+f3/97//+f3/97//+f//+////f/ /+///+///+f//+f//+f//+///+f//+///+f//+///+f//+f//97//+f//97/ /+f3/97//+f//97//+f//97//+f//97//+f3/97//+f//+f//+f//+f//+f/ /+f//+f3/97//973/97//973/97//973/97//973/97//973/97//973/97/ /+f3/97//+f3/97//973/97//+f3/97//973/97//973/97//973/97//973 /97//973/97//973/97//973/97//973/97//973/97//973/97//973/97/ /973/97//973/97//973/97//973/97//973/97//973/97//973/97//973 /97//973/97//973/97//973/97//973/97//973/97//973/97//973/97/ /973/97//973/97//973/97//973/97//973/97//973/97//973/97//973 /97//973/97//973/97//973/97//973/97//973/97//973/97//973/97/ /973/97//973/97//973/97//973/97//973/97//973/97//973/97//973 /97//973/97//973/97//973/97//973/97//973/97//973/97//97//97/ /973/97//+f//97//+f//+f//+f3/97//+f//97//+f3/97//+f//97//+f3 /97//+f//97//+f3/97//+f//97//+f3/97//+f//97//+f3/97//+f//97/ /+f//97//+f//97//+f//97//+f//97//+f//97//+f//97//+f//97//+f/ /97//+f//97//+f//+f//+f//+f//+f//+f//+///+f//+f//+f//+f3/97/ /973/97//+f3/9b//973/97//973/97//973/97//973/97//973/97//973 /97//973/97//973/97//973/97//973/97//973/97//973/97//973/97/ /973/97//973/97//973/97//973/97//973/97//973/97//973/97//973 /97//973/97//973/97//973/97//973/97//973/97//973/97//973/97/ /973/97//973/97//973/97//973/97//973/97//973/97//973/97//973 /9b//973/97//973/9b//973/97//973/9b//973/97//973/9b//973/97/ /973/9b//973/97//973/9b//973/97//973/9b//973/97//973/9b//973 /97//973/9b//973/97//973/9b//973/97//973/9b//973/97//973/9b/ /973/97//973/9b//973/97//973/9b//973/97//973/9b//973/97//973 /9b//973/97//973/97//973/97//973/97//973/97//973/97//973/97/ /973/97//973/97//973/97//973/97//973/97//973/97//973/97//973 /97//973/97//973/97//973/97//973/97//973/97//973/97//973/97/ /973/97//973/97//973/97//973/97//973/97//973/97//973/97//973 /97//973/97//973/97//973/97//973/97//973/97//973/97//973/97/ /973/97//973/97//973/97//973/97//973/97//973/97//973/97//973 /97//973/97//973/97//973/97//973/97//973/94A///n9//e///n9//e ///n9//e///n9//e///e9//e///n9//e///e9//e///n9//e///e9//e///n 9//e///e9//e///n9//e///e9//e///n9//e///e9//e///n9//e///e9//e ///n9//e///e9//e///n9//e///n9//e///n9//e///n9//e///n9//e///e 9//e///n9//e///e9//e///n9//e///e9//e///n9//e///e9//e///n9//e ///e9//e///n9//e///e9//e///n9//e///n9//e///n9//e///n9//e///n 9//e///n9//e///n9//e///n9//e///n9//e///n///e///n///e///n///e ///n///e///n9//e///n9//e///n9//e///n9//e///n///e///n///e///n ///e///n///e///n9//e///n///e///n9//e///n///e///n9//e///n///e ///n9//e///n///e///n///e///n///e///n///e///n///e///n///e///n ///e///n///e///n///e///n9//e///n///e///n9//e///n///e///n///e ///n///e///n///e///n///e///n///e///n///e///n///e///n///e///n ///e///n///e///n9//e///n///e///n9//e///n///n///v///v///v///n ///n///n///v///n///v///n///v///n///v///n///n///n///n9//e///n 9//e///n///e///n///e///n9//e///n///e///n///n///n///n///n9//e ///n9//e///e9//e///e9//e///e9//e///e9//e///n9//e///n9//e///n 9//e///n///e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e ///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e 9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e ///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e 9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e ///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e 9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e ///e9//e///e9//e///e9//e///e9//e///e9//e///n9//e///n///e///n ///e///n///n///n///e///n///e///n9//e///n///e///n9//e///n///e ///n9//e///n///e///n9//e///n///e///n9//e///n///e///n///e///n ///e///n///e///n///e///n///e///n///e///n///e///n///e///n///n ///n///e///n///e///n///n///n///n///n///n///n///e///n9//e///e 9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e ///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e 9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e ///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e 9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//W///e9//e ///e9//W///e9//e///e9//W///e9//e///e9//W///e9//e///e9//W///e 9//e///e9//W///e9//e///e9//e///e9//e///e9//e///e9//e///e9//W ///e9//e///e9//W///e9//e///e9//e///e9//e///e9//e///e9//e///e 9//W///e9//e///e9//W///e9//e///e9//W///e9//e///e9//W///e9//e ///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e 9//e///e9//e///e9//e///e9//e///e9//e///e9//W///e9//e///e9//W ///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e 9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e ///e9//e///e9//e///e9//e///n9//e///e9//e///n9//e///e9//e///e 9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e///e9//e ///e9//e///e9//e///n9//e///eAPf/3v//3vf/1v//3vf/3v//3vf/1v// 3vf/1v//3vf/1vf/3vf/1v//3vf/1vf/3vf/1v//3vf/1vf/3vf/1v//3vf/ 1vf/3vf/1v//3vf/1vf/3vf/1v//3vf/1vf/3vf/1v//3vf/1vf/3vf/1v// 3vf/1vf/3vf/3v//3vf/1v//3vf/3v//3vf/1v//3vf/1v//3vf/1vf/3vf/ 1v//3vf/1vf/3vf/1v//3vf/1vf/3vf/1v//3vf/1vf/3vf/1v//3vf/1vf/ 3vf/1v//3vf/1vf/3vf/1v//3vf/1vf/3vf/1v//3vf/1vf/3vf/3v//3vf/ 1v//3vf/3v//3vf/1v//3vf/3v//3vf/3v//3vf/3v//3vf/3v//3vf/1v// 3vf/1vf/3vf/1v//3vf/1vf/3vf/3v//3vf/1v//3vf/3v//3vf/1v//3vf/ 3v//3vf/1v//3vf/3v//3vf/1v//3vf/3v//3vf/1v//3vf/3v//3vf/1v// 3vf/3v//3vf/1v//3vf/3v//3vf/1v//3vf/3v//3vf/3v//3vf/3v//3vf/ 3v//3vf/3v//3vf/1v//3vf/3v//3vf/1v//3vf/3v//3vf/1v//3vf/3v// 3vf/1v//3vf/3v//3vf/3v//3vf/3v//3vf/3v//3v//3v//3vf/3v//3vf/ 3v//3vf/3v//3vf/3v//3vf31vf/3v//3v//5///5///7///5///5///5/// 5///5///5///5///5///5///5///5///5///3v//5/f/3v//3vf/3v//5/f/ 3v//3vf/3v//3vf/3v//3vf/3v//3vf/3v//5///3v//5/f/3vf/3vf/1vf/ 3vf/1vf/1vf/1vf/3vf/1vf/1vf/3v//3vf/1vf/3vf/1v//3vf/1v//3vf/ 1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/1vf/1vf/3vf/1vf/ 1vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/1vf/1vf/3vf/ 1vf/1vf/1vf/3vf/1vf/1vf/1vf/3vf/1vf/1vf/1vf/3vf/1vf/1vf/1vf/ 3vf/1vf/1vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/ 1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/ 3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/ 1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/ 3vf/1vf/1vf/1vf/3vf/1vf/1vf/3v//3vf31v//3vf/3v//3v//3v//5/// 3v//5/f/3v//3vf/3v//3vf/3v//3vf/3v//3vf/1v//3vf/3v//3vf/1v// 3vf/3v//3vf/1v//3vf/3v//3vf/1v//3vf/3v//3vf/3v//3vf/3v//3vf/ 3v//3v//3v//3vf/3v//3vf/3v//3vf/3v//3v//3v//5///3v//3v//3v// 3vf/3v//3vf/3v//5///3v//5///3v//5/f/3v//3vf/3v//3vf/1vf/3vf/ 1vf/3vf/1vf/1vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/ 1vf/1vf/3vf/1vf/1vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/ 1vf/1vf/1vf/3vf/1vf/1vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/3vf/1vf/ 3vf/1vf/3vf/1vf/3vf/1vf/3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/ 1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf31vf/1vf/1v//3vf31vf/ 1vf/1v//3vf31vf/1vf/1v//3vf31vf/1vf/1v//3vf31vf/1vf/1v//3vf3 1vf/1vf/1v//3vf31vf/1vf/1v//3vf31vf/1vf31vf/1vf31vf/1vf31vf/ 1vf31vf/1vf/1v//3vf31vf/1vf/1v//3vf31vf/1vf/1v//3vf31vf/1vf/ 1v//3vf31vf/1vf/1v//3vf31vf/1vf/1v//3vf31vf/1vf31v//3vf31v// 3vf/1v//3vf31vf/1vf/1v//3vf31vf/3vf/1v//3vf31vf/3vf/1v//3vf3 1vf/3vf/1v//3vf31vf/3vf31vf/1vf31vf/1vf31vf/1vf31vf/1vf/1v// 3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf31vf/3vf/1v//3vf31vf/3vf/ 1v//3vf31vf/3vf/1v//3vf31vf/3vf/1v//3vf31vf/3vf/1v//3vf31vf/ 3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf31vf/3vf/1v//3vf3 1vf/3vf/1v//3vf31vf/3vf/1v//3vf31vf/3vf31vf/3vf31v//3vf/1v// 3vf/1v//3vf31gD//973/97//973/97//973/97//973/97//973/97//973 /9b//973/97//973/9b//973/97//973/9b//973/97//973/9b//973/97/ /973/9b//973/97//973/9b//973/97//973/9b//973/97//973/9b//973 /97//973/97//973/97//973/97//973/97//973/9b//973/97//973/9b/ /973/97//973/9b//973/97//973/9b//973/97//973/9b//973/97//973 /9b//973/97//973/9b//973/97//973/9b//973/97//973/97//973/97/ /973/97//+f//97//973/97//+f//97//973/97//973/97//973/97//973 /97//973/97//973/97//973/9b//973/97//973/9b//973/97//973/97/ /973/97//973/97//973/97//973/97//973/97//973/97//973/97//973 /9b//973/97//973/9b//973/97//973/97//973/97//973/97//973/97/ /973/97//973/97//973/97//973/97//973/9b//973/97//973/9b//+f/ /97//973/97//+f//97//973/97//+f3/97//973/97//+f//97//973/97/ /973/97//+f3/97//973/97//+f//+f//+///+f//+f//97//+f//+f//+f/ /+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//97//+f3/97//+f//97/ /+f3/973/973/97//97//97//+f//97//+f3/973/973/9b3/973/9b3/973 /9b3/973/9b//973/973/973/9b//973/9b//973/9b3/973/9b3/973/9b3 /973/9b3/973/9b3/973/9b3/973/9b3/973/9b3/973/9b3/973/9b3/973 /9b3/973/9b3/973/9b3/973/9b3/973/9b3/973/9b3/973/9b3/973/9b3 /973/9b3/973/9b3/973/9b3/973/9b3/973/9b3/973/9b3/973/9b//973 /9b3/973/9b//973/9b3/973/9b//973/9b3/973/9b//973/9b3/973/9b3 /973/9b3/973/9b3/973/9b3/973/9b3/973/9b3/973/9b3/973/9b3/973 /9b3/973/9b3/973/9b3/973/9b3/973/9b3/973/9b3/973/9b3/973/9b3 /973/9b//973/9b3/973/9b//973/9b3/973/9b3/973/9b3/973/9b3/973 /9b3/973/9b//973/97//97399b//973/97//97//97//+f//+f//+f3/97/ /973/97//973/97//973/97//973/9b//973/97//973/9b//973/97//973 /97//973/97//973/97//973/97//973/97//973/97//973/97//+f//97/ /973/97//97//97//973/97//973/97//97//97//+f//97//97//97//+f/ /97//973/97//+f//97//+f//+f//97//97//973/9b//973/9b3/973/9b/ /973/9b3/973/9b//973/9b3/973/9b3/973/9b3/973/9b3/973/9b3/973 /9b//973/9b3/973/9b//973/9b3/973/9b3/973/9b3/973/9b3/973/9b3 /973/9b//973/9b3/973/9b//973/9b3/973/9b//973/9b//973/9b//973 /9b//973/9b//973/9b//973/9b//973/9b//973/9b//973/9b//973/9b/ /973/9b//973/9b//973/9b//973/9b//973/9b//973/9b//973/9b//973 /9b//973/9b//973/9b//973/9b//973/9b//973/9b//973/9b//973/9b3 /9b399b//973/9b3/9b399b//973/9b3/9b399b//973/9b3/9b399b//973 /9b3/9b399b//973/9b3/9b399b//973/9b//973/9b//973/9b//973/9b/ /973/9b//973/9b//973/9b//973/9b//973/9b//973/9b//973/9b3/973 99b//973/9b//973/9b//973/9b//973/9b//973/9b//973/9b//973/9b/ /973/9b//973/9b//973/9b//973/9b//973/9b//973/9b//973/9b//973 /9b//973/9b//973/9b//973/9b//973/9b//973/9b//973/9b//973/9b/ /973/9b//973/9b//973/9b//973/9b//973/9b//973/9b//973/9b//973 /9b//973/9b//973/9b//973/9b//973/9b//973/9b//973/9b//973/9b3 /97399b//973/9b3/97399b//973/9b//973/9b//973/97//973/9b//94A 9/fW9//W9/fW9//e9/fW9//W9/fW9//e9/fW9//W9/fW9//e9/fW9//W9/fW 9//e9/fW9//W9/fW9//e9/fW9//W9/fW9//e9/fW9//e9//W///e9/fW9//e 9//W///e7/fe9//e9/fe///e//fW///e9//W9//e7/fW9//e9//W///W9//W ///e9/fe9//n9/fW9//W9//W///e9//W///e9//W9//e9/fW9//e9//W///e 9/fW9//e9//W///e9/fW9//e9//W///e9/fW9//e9//W///e9/fW9//W9/fW 9//e9/fW9//W9/fW9//e9/fW9//W9/fW9//W9/fW9//W9/fW///e9/fW9//e 9//W///e9/fW9//e9//W///e9/fW9//e9//W///e9/fW9//e9//W///e9/fW 9//e9//W///e9/fW9//e9//W///e9/fW9//e9//W///e9/fW9//e9//W///e 9//W///e9//W///e9//W///e9//W///e9/fW9//e9//W///e9/fW9//e9//W ///e9//W///e9//W///e9//W///e9//W///e9//W///e9//W///e9//W///e 9//W///e9/fW9//e9//W///e9/fW9//e9//W///e9/fW9//e9//W///e9/fW 9//e9//W///e9/fW9//e9//W///e9/fW9//e9//W///e9//W///e9//W///e 9//W///e9//W///e///e///n///e///n9//e///n9//e///n9//e///e9//e ///e9//e///e9//e///e///e///n9//e///n9//e9//e9/fW9//e9/fW9//e 9/fW9//e9/fW9//e9//e///e9/fW9//e9/fW9//e7/fW9//e9/fW9//e9/fW 9//e9/fW9//e9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W 9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//e9/fW9//W9/fW 9//e9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W 9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW 9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W 9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW 9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W 9/fW9//e9/fW9//W9/fW9//e9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW 9//W9/fW9//W9/fW9//W9/fW9//W9//W///e///e///e9/fW9//W9/fW9//W 9/fW9//e9/fW9//e9/fW9//W9//W///e9/fW9//e9//W///e9/fW9//e9//W ///e9/fW9//e9//W///e9/fW9//e9//W///e9/fW9//e9//W///e9/fW9//e 9//W///e9//W///e9//W///e9//W///e9//W///e9//W///e9//W///e9//W ///e9//W///e9//e///e///e///n9//e///e9/fe9//e9/fW9//W9/fW9//W 9/fW9//W9/fW9//W9/fW9//e9/fW9//e9/fW9//W9/fW9//W9/fW9//W9/fW 9//e9/fW9//W9/fW9//e9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//W 9/fW9//W9/fW9//W9/fW9//W9/fW9//W9/fW9//e9/fW9//W9/fW9//e9/fW 9//W9/fW9//e9/fW9//W9/fW9//e9/fW9//W9/fW9//W9/fW9//W9/fW9//W 9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW 9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW 9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW 9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W 9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW 9//W9/fW9/fW9/fW9//W9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fO9/fW 9/fW9/fW9/fO9/fW9/fW9/fW9/fW9//W9/fW///W9/fW9//W9/fW///W9/fW 9//W9/fW9//W9/fW9//W9/fW9//W9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW 9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fW 9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fO9/fW 9/fW9/fW9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fWAPf/3vf31v//3vf/ 1vf/3vf31v//3vf/1vf/3vf31v//3vf/1vf/3vf31v//3vf/1vf/3vf31v// 3vf/1vf/3vf31v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1vf/3vf/ 1v//3vf/1v//1vf31vf/1u/31vf/3vf31v//1v/3zv//1v/3zv//3v/31v// 3vf31v//3vf/1v//3vf/1v//3vf31v//3vf/1v//3vf/1v//3vf/1v//3vf/ 1v//3vf/1v//3vf/1v//3vf/1v//3vf/1vf/3vf31v//3vf/1vf/3vf31v// 3vf/1v//3vf/1v//3vf/1vf/3vf31v//3vf/1v//3vf/1v//3vf/1v//3vf/ 1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v// 3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/ 1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v// 3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/ 1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v// 3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/ 1vf/3vf/3v//5///5///5///3v//5/f/3v//3vf/3v//5/f/3v//3vf/3v// 5/f/3v//5/f/3v//5/f/3v//3vf/3v//3vf/3vf/3vf/3v//3vf/3vf/3vf/ 3v//3vf/3v//3vf/3vf/3vf31vf/3u/31vf/3vf31vf/3vf31v//3vf/1vf/ 3vf31v//3vf/1vf/3vf31v//3vf/1vf/3vf31v//3vf/1vf/1vf31vf/3vf3 1vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/ 3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf3 1vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/ 1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf3 1vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/ 3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf3 1vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/ 1vf31vf/3vf31v//3vf/1v//3v//3v//3vf31vf/3vf/1v//3vf/1v//3vf/ 1vf/3vf31v//3vf/1vf/3vf31v//3vf/1vf/3vf31v//3vf/1vf/3vf31v// 3vf/1vf/3vf31v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/ 1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v//3vf/1v// 3vf/3v//5///3v//5/f/3v//3vf/3vf/1vf31vf/1vf31vf/1vf31v//3vf/ 1vf/3vf31v//3vf/1vf/3vf31v//3vf/1vf/1vf31vf/3vf31vf/1vf31vf/ 3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf3 1vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/1vf31vf/3vf31vf/ 1vf31vf/3vf31vf/1vf31vf/1vf31vf/1vf31vf/1vf31vf31vf31vf/1vf3 1vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf31vf/ 1vf31vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf3 1vf/1vf31vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf31vf/1vf31vf3 1vf31vf/1vf31vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf31vf/1vf3 1vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf31vf/ 1vf31vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf3 1vf/1vf31vf/1vf31v//1vf31vf/1vf31v//1vf31vf/1vf31vf/1vf31vf/ 1vf31vf/1vf31vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf31vf/1vf3 1vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf31vf/ 1vf31vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf31vf/1vf31vf31vf3 1vf/1vf31vf31vf31vf/1vf31vf/3gD399b3/9b399b399b399b3/9b399b3 99b399b3/9b399b399b399b3/9b399b399b399b3/9b399b399b399b3/9b3 99b399b399b3/9b399b399b399b3/9b399b399be/9bv/9b399b/99b/99b3 99bn99be99bv99b3997399b399b3987/99bv987399b399b399b3987//9b3 99b3/9b3987399b399b3/9b399b399b399b3/9b399b399b399b3/9b399b3 99b399b3/9b399b399b399b3/9b399b399b399b3/9b399b399b399b3/9b3 99b399b399b3/9b399b3/9b399b3/9b399b399b399b3/9b399b399b399b/ /9b399b3/9b399b//9b399b3/9b399b//9b399b3/9b399b//9b399b3/9b3 99b//9b399b3/9b399b//9b399b3/9b399b//9b399b3/9b399b//9b399b3 /9b399b//9b399b3/9b399b//9b399b3/9b399b3/9b399b399b399b3/9b3 99b399b399b3/9b399b399b399b3/9b399b399b399b//9b399b3/9b399b/ /9b399b3/9b399b//9b399b3/9b399b//9b399b3/9b399b//9b399b3/9b3 99b//9b399b3/9b399b//9b399b3/9b399b//9b399b3/9bv99b3/97399b/ /97//97//+f3/97//97399b//97399b//973/97//97399b3/973997//973 997//973/97//973997//97399b//97399b3/97399b3/97399b399b399b/ /97399b3/97399b399bv99b399b399b399b399b399b399b399b399b399b3 99b399b399b399b399b399b399b399b399b399b399b399b399b399b399b3 99b399b399b3987399b399b399b3987399b399b399b399b399b399b399b3 99b399b399b399b399b399b399b399b399b399b399b399b399b399b399b3 99b399b399b399b399b399b399b399b399b399b399b399b399b399b399b3 99b399b399b399b399b399b399b399b399b399b399b399b399b399b399b3 99b399b399b399b399b399b399b399b399b399b399b399b399b399b399b3 99b399b399b399b399b399b399b399b3987399b399b399b3987399b399b3 99b399b399b399b399b399b399b399b399b399b399b399b399b399b399b3 99b//9b399b//97399b//9b399b399b399b3/9b399b399b399b399b399b3 99b399b399b399b399b399b399b399b399b399b399b399b399b399b399b3 99b399b399b//9b399b3/9b399b//9b399b3/9b399b3/9b399b399b399b3 /9b399b399b399b//97399b//9b399b//97399b//9b399b3/97399b//973 /97//973/97//973/9b//97399b399b399b399b3987399b399b399b39873 99b399b399b399b399b3987399bv987399b3987399bv987399b399b399b3 99b399b399b399b399b399b399b399b399b399b399b399b399b399b399b3 99b3987399b399b399b3987399b3987399bv987399b3987399bv987399b3 99b399b3987399b399b399b3987399bv987399bv787399bv987399bv7873 99bv987399bv787399bv987399bv787399bv987399bv787399bv987399bv 787399bv987399bv787399bv987399bv787399bv987399bv787399bv9873 99bv787399bv987399bv787399bv987399bv787399bv987399bv787399bv 987399bv787399bv987399bv787399bv987399bv787399bv987399bv7873 99bv987399bv787399bv987399bv787399bv987399bv787399b3987399bv 987399b3987399bv987399b3987399bv987399b3987399bv987399b39873 99bv987399b3987399bv987399b3987399bv987399b3987399bv987399b3 987399bv987399b3987399bv987399b3987399bv987399b3987399bv9873 99b3987399bv987399b3987399bv987399b3987399bv987399b3987399bv 987399b3987399bv987399b3987399bv987399bv987399bv787399bv9873 99bv787399bv784A9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW 9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW 9/fW9/fW9//W9/fW9/fW9/fW7//e7/fW9//e9/fW///e9/fW9/fW7/fW9//e 7/fW9//e7/fW7//e7/fW7//e5/fW///e9/fW9/fW9/fW///e9/fW9/fW9/fW 9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW 9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW///W9/fW9/fW9/fW9//W9/fW 9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW///W9/fW9//W9/fW///W 9/fW9//W9/fW///W9/fW9//W9/fW///W9/fW9//W9/fW///W9/fW9//W9/fW ///W9/fW9//W9/fW///W9/fW9//W9/fW///W9/fW9//W9/fW///W9/fW9//W 9/fW///W9/fW9//W9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW 9/fW9/fW9//W9/fW9/fW9/fW///W9/fW9//W9/fW///W9/fW9//W9/fW///W 9/fW9//W9/fW///W9/fW9//W9/fW///W9/fW9//W9/fW///W9/fW9//W9/fW ///W9/fW9//W9/fW///W9/fW9//W9/fW9//e9/fW9/fW9/fW///e9//e///e ///e///e9//e///e9/fW///e9//e9//e9/fW///e9/fe///e9/fe///e9//e ///e9//e///e9//e///e9/fW///e9/fW9//e9/fW9/fW9/fW9//e9//e///e 9//e9//e7/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW 9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW 9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW 9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW 9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW 9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW 9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW 9/fW9/fW9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fW9/fW 9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9//W9/fW ///e9/fW9//W9/fW9//W9/fW9/fW9/fW9/fW9/fW9/fW9/fW9//W9/fW9/fW 9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW///W9/fW 9//W9/fW///W9/fW9//W9/fW9//W9/fW9/fW9/fW9//W9/fW9/fW9/fW///e 9/fW///W9/fW///e9/fW///W9/fW9//e9/fW9//e9/fW///e9//e///e9//e ///e///e///e9/fW9//W9/fW9/fW7/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW 9/fW9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fW9/fW9/fW 9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fW9/fO9/fW 9/fW9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fO 9/fW9/fW9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW 9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO 9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW 9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO 9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW 9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fW 9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fO9/fW9/fO9/fW 9/fO9/fW9/fO9/fW9/fO9/fW7/fO9/fW9/fO9/fW7/fO9/fW9/fW9/fW9/fO 9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW 9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fW 9/fW9/fO9/fW9/fW9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW9/fO9/fW APfvzvf31vf3zvf31vfvzvf31vf3zvf31vfvzvf31vf3zvf31vfvzvf31vf3 zvf31vfvzvf31vf3zvf31vfvzvf31vf3zvf31vfvzvf31vf3zvf31vfvzvf3 1vf3zvf31v/vzv/3zu/3zuf/zuf3zvf3zv/3xv/3zvf3xv/3zvf3zvf31u/3 zvf31vf3zvf31vf3zvf3zu/vzvf31vf3zvf31vf3zvf31vfvzvf31vf3zvf3 1vfvzvf31vf3zvf31vfvzvf31vf3zvf31vfvzvf31vf3zvf31vfvzvf31vf3 zvf31vfvzvf31vf3zvf31vf3zvf31vf3zvf31vfvzvf31vf3zvf31vfvzvf3 1vf3zvf31vfvzvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3 zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf3 1vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3 zvf31vf3zvf31vf31vf31vf3zvf31vf31vf31vf3zvf31vf31vf31vf3zvf3 1vf31vf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3 zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf3 1vf3zvf31vf3zvf31vf3zvf31u/vzvf31u/vzvf31vf31v//3vf/3v//3vf3 1v//3vf31vf31vf31vf/3vf31vf/3vf31v//3vf31vf31vf31vf/3vf31vf/ 3vf31v//3vf31vf/3vf31v//3u/vzvf31vf31v//3vf31vf/3vf31vf31u/v zvf31vfvzvf31u/vzvf31vfvzvf31vfvzvf31vf3zvf31vfvzvf31vf3zvf3 1u/vzvf31vfvzvf31u/vzvf31vfvzvf31vfvzvf31vf3zvf31vfvzvf31vf3 zvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf3 1vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/v zvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf3 1u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfv zvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf3 1vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/v zvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf3zvf3zvf31vf31vf31vf31vf3 1vfvzvf31vfvzvf31u/vzvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3 zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf3 1vf3zvf31vf3zvf31vf31vf31vf3zvf31vf31vf31vf3zvf31vf31vf31vf3 zvf31vf31vf31vf31vf31vf31vf31vf3zvf31vf31vf/1vf31v//3vf31v// 3vf31vf31vf31vf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfv zvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf3 1vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/v zvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf3 1u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/v zvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3 zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/v zvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf3 1u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/v zvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3 zu/vzvf31u/vzvf3zu/vzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/v zvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf3 1u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/v zvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3 zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzgD399b3987399b3 987399b3987399b3987399b3987399b3987399b3987399b3987399b39873 99b3987399b3987399b3987399b3787399b3987399b3787399b3987/98b/ 98b/987/9873987n787n99be787v99bv787399b379b/99b/787/987/98b3 99b3987399b3987399b3987399b399b399b3787399b3987399b3787399b3 987399b3787399b3987399b3787399b3987399b3987399b3987399b39873 99b3987399b3987399b3987399b3787399b3987399b3787399b3987399b3 787399b3987399b3987399b3987399b3987399b3987399b3987399b39873 99b3987399b3987399b3987399b3987399b3987399b3987399b3987399b3 99b399b3987399b399b399b3987399b3987399b3987399b3987399b39873 99b399b399b3987399b399b399b3987399b399b399b3987399b399b399b3 987399b3987399b3987399b3987399b3987399b3987399b3987399b39873 99b3987399b3987399b3987399b3987399b3987399b3987399b3987399b3 987399bv987399b3987399b3987399b399b//97399b//97399b3/97399b3 /97399b3/97399b//97399b399b399b399b399b3/97399b//97399b//973 99b//97399b//97399b//97399b399b399b3/97399b399b3787399b39873 99bv787399b3787399b3787399b3987399b3787399b3987399bv787399b3 787399bv787399b3787399b3987399b3987399b3987399b3987399bv7873 99b3787399bv787399b3787399bv787399b3787399bv787399b3787399bv 787399b3787399bv787399b3787399bv787399b3787399bv787399b37873 99bv787399b3787399bv787399b3787399bv787399b3787399bv787399b3 787399bv787399b3787399bv787399b3787399bv787399b3787399bv7873 99b3787399bv787399b3787399bv787399b3787399b3787399b3987399b3 787399b3987399bv787399b3787399bv787399b3787399bv787399b37873 99bv787399b3787399bv787399b3987399b399b/99b399b399b3787399b3 987399b3787399b3987399b3987399b399b399b3987399b399b399b39873 99b399b399b3987399b399b399b3987399b3987399b3987399b3987399b3 987399b399b399b3987399b399b399b3987399b399b399b3987399b399b3 99b399b399b399b399b3987399b399b399b399b/997399b//97399b//973 99b399b3987399b3987399b3787399b3987399b3787399b3987399b37873 99b3987399bv787399b3787399bv787399b3787399bv787399b3787399bv 787399b3787399b3787399b3987399b3787399b3987399b3787399b39873 99b3787399b39873987v787399bv7873987v787399bv787399b3787399b3 787399b3787399b3787399b3787399b3787399b3787399b3787399b37873 99b3787399b3787399b3787399b3787399b3787399b3787399b3787399b3 787399b3787399b3787399b3787399b3787399b3787399b3787399b37873 99b3787399b3787399b3787399b3787399b3787399b3787399b3787399b3 787399b3787399b3787399b3787399b3787399b3787399b3787399b37873 99b37873987v787399b37873987v787399b37873987v787399b37873987v 787399b3787399b3787399b3787399b3787399b3787399bv787399b37873 99bv787399b37873987v787399b37873987v787399b37873987v787399b3 7873987v787399b37873987v787399b37873987v787399b37873987v7873 99b37873987v787399b37873987v787399b37873987v787399b3787399b3 787399b3787399b3787399b3787399YA7+/O9/fO7+/O9/fO7+/O9/fO7+/O 9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO 7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO5/fG5/fW5+/W3u/nzu/v te/3lO//hPf/pef/pe//ref3ve/3xufn3u/e5+/O9+/O7+/O//fW9/fW9/fO 7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O 9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO 7+/O9+/O7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O 9/fW7+/O9/fO7+/O9/fW7+/O9/fO7+/O9/fW7+/O9/fO7+/O9/fW7+/O9/fO 7+/O9/fW7+/O9/fO7+/O9/fW7+/O9/fO9+/O9/fW7+/O9/fW9+/O9/fW7+/O 9/fW7+/O9/fW7+/O9/fO7+/O9/fW7+/O9/fO7+/O9/fW7+/O9/fO7+/O9/fW 7+/O9/fO7+/O9/fW7+/O9/fO7+/O9/fW7+/O9/fO7+/O9/fW7+/O9/fO7+/O 9/fW7+/O9/fO7+/O9/fW7+/O9/fO7+/O9/fW7+/O9/fO7+/O9/fW7+/O9/fO 7+/O9/fW7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O 9/fO7/fO9/fO7+/O7/fO9/fW9/fW9/fW9/fW9/fW9/fW7/fW9/fW7/fO9/fW 7+/O9/fW7/fO9/fW7+/O9/fW9/fW9/fW7/fW9/fW9/fW9/fW9/fW9/fW9/fW 9/fW9/fW9/fW9/fW9/fW7/fW9/fW9+/O9/fW7+/O9/fO7+/O9+/O7+/O7+/O 7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O 9+/O7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9+/O7+/O9/fO 7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O 9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O 7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O 9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO 7+/O9+/O7+/O9/fO7+/O9+/O7+/O9+/O7+/O7+/O7+/O9+/O7+/O7+/O7+/O 9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O 7+/O9+/O7+/G7+/O7+/O9/fW9+/O9/fW7+/O9/fW7+/O9/fO7+/O9/fO7+/O 9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO 7+/O9/fO7+/O9/fW7+/O9/fO7+/O9/fW7+/O9/fO7+/O9/fW7+/O9/fO7+/O 9/fW7+/O9/fO7+/O9/fW7+/O9/fO7+/O9/fW7+/O9/fO7/fO9/fW7+/O9/fO 7/fO9/fW7+/O9/fO7+/O9/fW7+/O9/fW9/fW9/fW9/fW9/fW9/fO9/fW9+/O 9/fW7+/O9/fW7+/O9/fO7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO 7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O 9+/O7+/O7+/O7+/O9+/O7+/O7+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O 7+/O9+/O7+/O7+/O7+/O9+/O7+/O7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G 7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O 7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O 9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O 7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G 7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O 7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O 9+/O7+/O9+/O7+/O9+/O7+/O9+/O7+/O9+/O7+/O7+/O7+/O9+/O7+/O7+/O 7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G 7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O 7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O9+/O7+/G7+/O7+/O 9+/O7+/G7+/O7+/GAPf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3 zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31vfv zvf31u/vzvf31vfvzvf31u/vzu/v3tbv57X394z3/3P3/2Pv/2Pv/2Pn/1Lv /1Ln/2Pv/3Pn/5Tv/6Xv973v587v1vf31v//1v//3u/vzu/vzu/vzvf31u/v zvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf3 1u/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31vfvzvf3zu/vzvf31u/v zvf31u/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31vfvzvf31u/vzvf3 1vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/v zvf31vfvzvf31u/vzvf31vf3zvf31vf3zvf31vf3zvf31vf3zvf31vfvzvf3 1u/vzvf31vfvzvf31u/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/v zvf3zu/vzvf31u/vzvf3zu/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf3 1vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/vzvf31vfvzvf31u/v zvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf3zu/vzvf3zu/vzvf31vf3zvf3 zu/vzvfv1vfvzvf31vf31v//3vf31vf31vfvzvf31vf3zvf31vf3zvf31vf3 zvf31vf3zvf31vf31vf31vfv1vf31vf31vf31vfv1vf31vfv1v/31vf31v// 3vf31v/31vf31vf31vf3zvf31u/vzvf31u/vzvfvzu/vzvf31u/vzvf3zu/v zvf31u/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3 zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/v zvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3 zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/v zvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3 zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/v zvf3zu/vzvfvzu/vzu/vzu/vzvfvzu/vzu/vzu/vzvf3zu/vzvf3zu/vzvf3 zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf31u/vzu/vzu/v zvf31vf3zvf31vf3zvf31vfvzvf31u/vzvf31vfvzvf31vfvzvf31u/vzvf3 zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf31vfv zvf31u/vzvf31vfvzvf31u/vzvf31u/vzvf3zu/vzvf31u/vzvf3zu/vzvf3 1vfvzvf31u/vzvf31vfvzvf31u/vzvf31vf3zvf31vf3zvf31vf3zvf31vf3 zvf31vfv1vf31u/vzvf31vfv1vf31vfv1v//1vf31vf31vf3zvf31vfvzvf3 1u/vzvf3zu/vzvfvzu/vzvf3zu/vzvfvzu/vzvf3zu/vzvf3zu/vzvf3zu/v zvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvf3zu/vzvfvzu/vzu/vzu/vzvfv zu/vzu/vzu/vzvf3zu/vzvfvzu/vzvf3zu/vzvfvzu/vzvf3zu/vzvfvzu/v zvf3zu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfv zu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/v zvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfv zu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/v zvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfv zu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/v zvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfv zu/vzvfvzu/vzvfvzu/vzu/vzu/vzvfvzu/vzu/vzu/vzvfvzu/vzvfvzu/v zvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfv zu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/v zvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfvzu/vzvfv zgDv78bv787v78b3787v78bv787v78b3787v78b3787v78b3987v78b3787v 78b3987n78b378737873787n58bv787v787/987/7733787n787n79bv7873 987v78bn786c7+9r9/9C9/9j//9r9/9r//9j9/9z//977/9r7/9j7/975/9z 3v9j5/+M7//W9//3587////////W1r3n58bn787v7873787v787v7873987v 98bv98bv98bv98bv78bn7873787v787v78bv78b3987n773v98bv78b3987v 78bn78bv787v78bv787v587n78b3987378b398bn78bn787v78b398b37873 78bv78bv987n587v79b3787378b/78b/787v78bv78bn78b3987v78b378bv 98bv78bv787/99bv78b3987398bn973378737873987398bv773398bv78b3 9873787v58b3987v987n58b399bv78b398bv587v787378b398bv773v78bv 58b3987v787v787v587v59bv5873787v78b378bv78b3787v7873787v78b3 787v7873787v58b378737873787v58b379bv787v787n787v98bv78b379bv 587v98bv773v787v5873787v78bv98bv78bv78b3787379bv5873987v973v 98bv787379b3787/78bv98bv78bv78b3987v78bv78bv787399bv78b3987n 78b3/9bv787//97399b/99bv787v787399bv787v787v787v787399bv78b3 987v78bv787v787v9873987v78bv78bv987v78b39873987399bv78b//9b3 99b//97v79bv99bn58bv78bv987v78bv58b3787v78b3987n77339873787v 58bn58bv78b3787v78bv787n58bv787n78bn787n78bv98bv78bv78b37873 78b3973n58b3987n573v787v78bv787v58bv787v78bv78bv78bv787v78bv 78bv78bv787v78bn58bv78b3987n78bv787v78bv787v78bv78bv78bv987n 773v78bv7873787v773398bv58b3787v58bv78b3987n773v787v78bn773v 98bn58bv787v58b3987v78bv58bv987n78bv787n58b3987v78bn773v987n 78bn587v587v787n58bv78bv78bv78bv78bv78bv78bv78bv773v773v58bv 78bn58bv78bv78bv78bn5733987v773v78bn78bv78bv787v787v78b379bn 77X//9bv787v587v78bv773v98bv987v7873987v78bv78bv78bv787v78b3 987v78bv99bn3s73997v78bv98bv7733987v78bv787v78bv787v78bv787v 78bv787v78bv787v78bv787v78bv787v78bv787v78bv787v7873787v78bv 787v7873787v7873787v7873987v7873787v7873987v7873787v7873787v 7873787v7873987v7873787v7873787v7873787v7873787v7873787v7873 987v7873787v7873987v7873987v7873987v7873987v7873987v78bv787v 78bv787v58bv787v78bv787v78bv78bv78bv78bv78bv78bv78bv787v78bv 787v78bv787v78bv787v78bv787v58bv78bv58bv787v58bv78bv58bv787v 58bv78bv58bv787v58bv78bv58bv787v58bv78bv78bv78bv58bv78bv78bv 78bv58bv78bv58bv78bv58bv78bv58bv78bv58bv78bv58bv787v58bv78bv 58bv787v58bv78bv58bv78bv58bv78bv58bv78bv58bv78bv78bv78bv58bv 78bv78bv78bv58bv78bv78bv78bv58bv78bv78bv78bv58bv78bv58bv787v 58bv78bv58bv787v58bv78bv58bv78bv58bv78bv58bv78bv58bv78bv58bv 787v58bv78bv58bv787v78b3787v78b3787v78b3787v78b3787v78bv78bv 78b378bv78bv78bv78b378bv58bv78bv58bv787v58bv78bv58bv787v78b3 78bv78b3787v78b378bv78b3787v78b378bv78b3787v78b378bv78b3787v 78b3787v78b3787v78b3787v78b3787v78bv78bv78b378bv78bv78bv78b3 78bv58bv78bv58bv78bv58bv78bv58bv78bv58bv78bv78bv78bv58bv78bv 78bv78bv58bv78bv58bv787v58bv78bv58bv787v58bv78bv58bv787v58bv 78bv58bv787v78b378bv78b3787v78b378bv78b3787v78YA9+/O7+/G9/fO 7+/G9+/O7+/G9/fO7+/G9+/O7+/G9/fO7+/G9+/O7+/G9/fO7+/G7/fO7+/G //fO9+/O7+/O5+/G7+/O7+/G7+/G5+/O7/fW7+/O9+/G9++99+/O7+/Wrf// c///Uv//Wv//a///Y///Y///Y///e/f/Wvf/Y/f/e+f/c+f/Y+f/jO//zvf/ 9+/W///n///v3t697+/O5+/G9/fO9+/O7+/O7+/G9/fO7+/G9/fO5+/G7+/O 5+fG7+/O7+/O9/fO9+/G//fO7+/G7/fO7+/O7+/O7+/O9//W5+/G7+/O7+/O 9/fW7+/O7+/O7+/G9/fG7+/G5+/O5+/O7+/O9+/G9+/O7+/G9/fO7+/O7+/W 5+fO7+/O9+/G9+/O7+/G9/fO7+/O7+/O5+fG7+/G//fW7+/O7+/O9/fO9+/O 7+/O7+/G9/fO7+/G9+/W7+fO7+/O7+/G9/fO7+/G9+/G9+/O//fW9+/O9/fO 7/fO7+fO5+fO9/fW9+/G9+/O7+/O9+/O7+/G9+/O7+/G//fW7+/G7/fG5+/G 9/fO7+/O9/fO7+/G7+/G9/fG9+/O7+/G9+/O7+/O9+/O7+/G9+/O7+/O9/fO 7+/G9/fO7+/G7/fO7+/G7+/G7+/G5+/O7/fO9/fO7+fO7+/W7/fG9/fG7+/O 9+/O9+/O7+/O5+/G7+/O9/fO9+/O9+/O9+/W7+/G7/fG7/fG7+/O597O9+/W 9+/O5+fG7+/O7/fO7+fG7+/O7+/O9+/O7+fG9+/O9+/O7+/G5+e95+/G7+/G //fW//fW///e7+/O9/fW9+/O9/fW7+/O9/fW7+/O7/fO7+/G///e9/fW7+/O 7+/O7+/O9/fO9/fO7+/O9/fW9/fO7+/O7+/O///W7/fO7+/W7+/W9/fW9/fe 9/fW7+/O7+/G7+/G9+/O9+/O7+/O5+e97+/G5+e99+/O9+/O9+/O7+/O7+/G 5+fG7+/O7+/O9/fW7+/G5+/O5+fG9/fO7+/G9+/W5+fG9/fO7++99/fW5+fG 7+/O5+fG9/fO7+fG7+/O7+fG7+/O7+/G9+/O7+/G7+/O7+/G9+/O7+/G9/fO 7+/G7+/G7+/G9/fO7+/G9+/O7+/G9/fO7+/G7/fO5+/G7+/O5+fG7+fG9+/O 7/fG7+/G7+/O7+/O9/fW5+fG5+/G7/fO5+fO7+/G7/fG9/fO7+/O7+fO7+fO 7+/G7+/G7+/O7+/O5+/O5+/G7+/G7+/O9+/G7/fG5+e95+/O7+/O9/fW5+fG 7+fG9/fO7+/O7+/G7+fG5+e97+/G7+/G9/fO7+/G9/fW7+fG7+/O7+/G7+/O 5+fG7+/O7+/G9+/G9/fO7+/O5+/G7/fW7+/O7+/O7+/O7/fG5+e97+/W7+/O 9/fO5+e99/fO5+fG7+/O5+fG7+/O7+/O7+/O5+fG7+/O9/fO9//O7+/O9+/e 7+fO7+/O9/fG9/fO9+/O9+/O7+/G9+/O7+/O9+/O7+/G9+/O7+/O9+/O7+/G 9+/O7+/O9+/O7+/G9+/O7+/O9+/O7+/O9+/O7+/O9+/O7+/O9+/O7+/O9+/O 7+/O9/fO7+/O9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9/fO7+/O9/fO7+/O 9+/O7+/O9/fO7+/O9+/O7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO 7+/O9/fO7+/O9/fO7+/O9/fO7+/O9/fO7+/O9+/O7+/O9+/O7+/O7+/O7+/G 7+/O7+/G7+/G7+/G7+/O7+/G7+/O7+/G9+/O7+/G7+/O7+/G9+/O7+/O7+/O 7+/G7+/O7+/G9+/O7+/G9+/O7+/G9+/O7+/G9+/O7+/G9+/O7+/G9+/O7+/G 9+/O7+/G9+/O7+/G9+/G7+/G9+/O7+/G9+/G7+/G9+/O7+/G7+/O7+fG9+/O 7+/G7+/O7+fG9+/O7+/G7+/O7+fG9+/O7+/G7+/O7+fG9+/O7+/G7+/G7+/G 9+/G7+/G7+/G7+/G9+/G7+/G7+/G7+/G9+/G7+/G7+/G7+/G9+/G7+/G7+/G 7+fG7+/G7+/G7+/G7+fG7+/G7+/G7+/G7+fG7+/O7+fG7+/G7+fG7+/O7+fG 7+/G7+fG7+/O7+fG7+/G7+fG7+/O7+fG7+/G7+fG7+/O7+fG7+/G7+fG7+/O 7+fG7+/O7+fG9+/O7+/G7+/O7+fG9+/O7+/G7+/G7+/G9+/G7+/G7+/G7+/G 9+/G7+/G7+/O7+fG9+/O7+/G7+/O7+fG9+/O7+/G7+/G7+/G9+/G7+/G7+/G 7+/G9+/G7+/G7+/G7+/G9+/G7+/G7+/G7+/G9+/G7+/G7+/O7+fG9+/O7+/G 7+/O7+fG9+/O7+/G7+/G7+/G9+/G7+/G7+/G7+/G9+/G7+/G7+/G7+/G9+/G 7+/G7+/G7+/G9+/G7+/G7+/G7+fG7+/G7+/G7+/G7+fG7+/G7+/G7+/G7+fG 7+/O7+fG7+/G7+fG7+/O7+fG7+/G7+fG7+/O7+fG7+/G7+fG7+/O7+fG7+/G 7+/G9+/G7+/G7+/G7+/G9+/G7+/G9+/OAO/vxu/vxu/vxu/vxu/vxu/vxu/v xu/vxu/vxu/vxu/nxu/vxu/vxu/vxu/nxu/vxufvxu/nve/etffvxu/vxufv xu/vvff3xufvzuf3zu/vxv/vvf/epffepe/Wte/nzqX/94T//1L//1r//2v/ /2P//1L//1r//2P//1L//1r//3P3/2vn/2Pv/3vn/7Xv/+/nzvf3zv/31ufn ve/vxufvxufnxu/vzu/nxu/vxu/vxufvxt7eve/nzu/v1u/v3ufnve/vxufn ve/vve/nxufevefnzvf33u/vzt7eve/vxu/vxufnve/vzufexvfv1u/v3u/n xvfvxu/vxufnzu/33ufnxv/3zu/nxu/vxt7etefnxvf33u/v1ufexvf3zu/v xu/vxu/v1v//5///7///9/fv1ufexufnzvf33ufeve/vxvfvzu/vzufnxvf3 1u/v3v//////9//35+/v1u/vzu/vxvf3zu/nxvfvzufnve/vzvf33vfv3ufe xvfvxu/vxu/nxufexvf33vfv1ufeve/vxu/vve/3xu/3zvf/3v//7///7/// 1ufnve/vxu/vxu/vxu/nxu/vxu/vxu/vxu/nxu/vxufnvff31u/vzu/3zu/3 1u/31u/vzvf31u/v1ufnvefnxv/35+/n1u/vxufnve/vzu/vxu/vxu/nzvf3 3ufnzu/nzu/nvffvxu/vxu/vzt7nvd7nxufv1v//7///9///7//33vf31ufe xufnxvfvzvf3zufnxu/vxufnve/vxufnxufnxv//3ufvxu/nxvf31vf31vfv zu/nxu/vzufnxu/vzv//3t7exu/3zu/vzufnxufnxu/nzv//9///7///9//3 3vf33u/v1vf31vf3zu/vzu/vxu/vzv//5///9///7/fv1u/vzv//7/f31u/v zu/nxu/nxufevefnvf//3ufnvefeve/nxufnve/vxufnxv//3ufnxufvxt7e ve/vzu/v3v//9///5+/vzufnzufezu/nzu/vzu/vxufnxv//3ufnxufnxufn xvf31vf31u/vxu/vxu/nxu/vxu/vxu/vxu/nxu/vxt7evff/1ufnvefnvefn ve/vxufnxu/vxu/nve/vxufnxu/v1v//3u/vzufnve/vxufnxvf31u/v1v/3 3v//9///9+fvzu/vzufnxu/3zufvve/vxufnxv/33u/vzufnvefnve/vzt7e ve/vzu/31u/vzt7eve/vxufvxufvxu/v1v//7///7///7/f31ufexufeve/v xufevf/31t7ete/vxufnxufnxt7exvf33v//7///9//33vf31ufnzt7evefn ve/vzt7evff31v//5///7/fvzu/nxu/vxufnxv/35///7///3u/vxu/vxu/v zu/nzv//5///9///9/f31u/vzufnzu/vzufvxu/vzv//5+fexufnve/vxufn vefnxu/vxu/vxu/nxu/vxu/vxu/vxu/nxu/vxu/vxu/vxu/nxu/vxu/vxu/v xu/nxu/vxu/vxu/vzu/nxu/vzu/vxu/vzu/nxu/vzu/vxu/vzu/nxu/vzu/v xu/vzu/nxu/vzu/vxu/vzu/nxu/vzu/vxu/vzu/vxu/vzu/vxu/vzu/vxu/v zu/vxu/vzu/vxu/vzu/vxu/vzu/vxu/vzu/vxu/vzu/vxu/vzu/vxu/vzu/v xu/vzu/vxu/vzu/vxu/vzu/vzvfvzu/vxu/vzu/vxu/vzufnxu/vxu/nxu/v xufnxu/vxu/nxu/vxufnxu/vxu/vxu/vxu/nxu/vxu/vxu/vxufnxu/vxu/n xu/vxu/nve/vxu/nxu/vxu/nve/vxu/nxu/vxu/nve/vxu/nxu/vxu/nve/v xu/nxu/vxu/nve/vxu/nxu/vxu/nve/vxu/nxu/vxu/nve/vxu/nxu/vxu/n ve/vxu/nve/vxufnve/vxu/nve/vxufnve/vxu/nxu/vxu/nve/vxu/nxu/v xu/nve/vxu/nve/vxufnve/vxu/nve/vxufnve/vxufnve/vxufnve/nxufn ve/vxufnve/nxufnve/vxufnve/nxufnve/vxufnve/nxu/nve/vxufnve/v xu/nve/vxufnve/vxufnve/vxufnve/nxufnve/vxufnve/nxu/nve/vxufn ve/vxu/nve/vxufnve/vxu/nve/vxufnve/vxu/nve/vxufnve/vxu/nxu/v xu/nve/vxu/nxu/vxu/nve/vxu/nve/vxufnve/vxu/nve/vxufnve/vxu/n ve/vxufnve/vxu/nve/vxufnve/vxu/nve/vxufnve/vxu/nve/vxufnve/v xu/nve/vxufnve/vxu/nve/vxufnve/vxu/nxu/vxu/nve/vxu/nxu/vxu/n ve/vxufnve/vxufnve/nxufnve/vxufnve/nxufnve/vxufnve/nxufnve/v xufnve/nxufnve/vxufnve/nxufnve/vxufnve/nxu/nve/vxufnve/vxu/n ve/vxufnve/vxufnvQD378bv78bv78bv78b378bv78bv78bv78b378bv78bv 78bv78b378bv78bv78bv78b378bnzq3nvZzvzqX33rXv3q3357X357Xv78bn 57X356X/3oz/1oT3zoT31qXv3sa19+eU//9r//9r//97//9j//9j//9j//9a //9S//9a//9j//9r9/9a7/9z7/+U7//n99bv58b/98bv5733987v58bv787n 58bv78bn573v787v78b399b////////////v987v78bv773v78b/987379b/ ///////////399bv78bn573v573v78b399b////////399bv573n58b///// //////fv573v58bv78b3987///f////////3787v773n58b//+////////// /////////////+f/////////99bv573v787n3sb//+////////////////// /////////+fn58bv58b/787v78bv787//+f////////v787v78bv78bv58b/ ///////////379bv78bv773n587////////////////////////n59b378bv 78bv78bv78b378bv78bv78bv78b///////////////////////////////// ///399b//+/////////v787378bv5873987v787////////////v58739873 773378bv58bv787///f//////////////////////////+/v5873787v58bv 573v78b3987v58b3987//97/////99737873787378737873987v787/997/ //f////399bv78bv787v787///f//////////////////////////+/e1r33 99b3987n58b//+f//////////////97/9+f////////399b/99b3787399b3 997//////97v787v78bn773v58b/997////3987e573v787///////////// ///////////////////n587v78b/99b////3997v787v787////////v78bv 78bv78bv58bv78bv78bv78bv58b399b///////fv787v78bv58b378bn573v 78bv58bn587////////v5873987n57Xn587///f///////////////////// ///v787n573n57Xn573379b////////v787v78bv58bv79b///f////399bv 78bn573v78b//+f/////////////////////9+f398b3787///f////3987v 78bv58bv587///////////////////////////fv79b378bn58b379b///// ///////////3787v78b//+///////////////97v587379b///////////// /////////////+fe3sb3987//97/////997399b398b378bv78bv78bv78bv 78bv58bv78bv78bv78bv58bv78bv78bv78bv58bv78bv78bv78bv58b3787v 78bv787v58b3787v78bv787v58b3787v78bv787v58b3787v78bv787v58b3 787v78bv787v58b3787v78b3787v78b3787v78b3787v78b3787v78b3787v 78b3787v78b3787v78b3787v78b3787v78b3787v78b3787v78b3787v78b3 787v78b3787v7873787v78b3787v78bv787v58bv78bv58bv78bv58bv78bv 58bv78bv58bv78bv78bv78bv78bv78bv78bv78bv573378bv58bv78bv58b3 78bv58bv78bv58b378bv58bv78bv58b378bv58bv78bv58b378bv58bv78bv 58b378bv58bv78bv58bv78bv58bv78bv573v78bv58bv78bv573v78bv58bv 78bv573v78bv58bv78bv573v78bv58bv78bv573v78bv58bv78bv573v78bv 573v58bv573v78bv573v58bv573v78bv573v58bv573v78bv573v58bv573v 78bv573v58bv573v78bv573v58bv573v78bv573v58bv573v78bv573v58bv 573v78bv573v58bv573v78bv573v58bv573v78bv573v58bv573v78bv573v 58bv573v78bv58bv78bv573v78bv58bv78bv573v78bv58bv78bv573v78bv 58bv78bv573v78bv573v78bv573v78bv573v78bv573v78bv573v78bv573v 78bv573v78bv573v78bv573v58bv573v78bv573v58bv573v78bv58bv78bv 573v78bv58bv78bv573v78bv58bv78bv573v78bv58bv78bv573v78bv573v 58bv573v78bv573v58bv573v58bv573v58bv573v58bv573v58bv573v58bv 573v58bv573v58bv573v58bv573v78bv573v58bv573v78bv573v58bv573v 58YA5+e97+/G7+e97+/G5+e97+/G7+e97+/G7+e97+/G7+fG7+/G7+e97+/G 7+fG7+/G9+e978al1qWE562E57WM572M58aM786U786M78aE98Z7/85z/85r /9Z7/96c/+/GvefGrf//hP//jP//lP//e///c///e///Wv//Wv//Wv//Y/// Wv//Wvf/a+//e+//zu/e5+fG9+e97++95+e99+fO7+fG5+/G7+/G7+e97+fG 5+fG597G///////////////e7+/G5+e17+/G5+e97+/O////////////9/fe 3t699/fO7+/G7+fG5+fG////////9+/W7+fG7+fO///////////v9+/O7+fG 7+fG5+e9///v////////7+fG7++97/fe///////////////3//////////// ////////7+/G7+/G5+fG//fn///////////////v///3///////////////v 5+fG5+e97+e95+fG///////////////n7+/G7++97+fG////////////9/fe 5+e99/fG5+fO///////////v///v////////////7+e97+/G7+fG7+/G7+e9 7+/G7+fG7+/G///3///////////////////////////////35+fG///n//// ////7+fO7+e99+fO3t699/fW////////////7+fW5+e97++99+/G5+fG///v ///////////////3///3////////////9+/W3t697+fG5+e97++97+fG5969 597G9/fe////9/fW59697+fG5+e99+/O7+/O9+/O7+/O///3////7+fO7+/G 7+/O///v////////7+/W597O7+fO9+/W///////////n59697/fO5+fG//// ////9+/W9+/O5+fG597O////////9/fW9+/G7+/O7+fO9/fe//////fe597G 7+/G5+e15+fG//fe////5+fG5+e9///e//////fn7+/W3ufG9/fe//////// ////5+fO3t619/fW////9/fe3t695+e9////////5+e97+fG5+e97+/G5+e9 7+fG5+e97+/G597G///////v7+/G59697+/G7+/G7+/G5+e95+fG///v//// ////5+fO5+e97++9///v///////33t7G5+fO5+fO9+/W///////e9/fO7++9 5+fG//fe////////5+fG7+/G5+fG5+fO///////////n5+fG7+/G5+fG//fW //fW7+/O3t697+/W////////3ue13t69///3////5+e95+e95+fG//////// ///n5+fO5+fO1ta9///v////9/fW59697+/O///v////7+fW5+fO59697+e9 7+fG////////7+/W7+fO1ta17+/O////////7+/W5+fO5+fO3t69///3//// 7+/O5+e9//fe//////fn7+fG7+/G5+e97+fG5+e97+/G7+e97+/G5+e97+/G 7+e97+/G5+e97+/G7+e97+/G5+e97+/G7+e97+/G5+e97+/G7+e97+/G5+e9 7+/G7+e97+/G7+fG7+/G7+fG7+/G7+fG7+/G7+fG7+/G5+e97+/G7+e97+/G 7+e97+/G7+fG7+/G7+e97+/G7+fG7+/G7+e97+/G7+fG7+/G7+e97+/G7+fG 7+/G7+e97+/G7+fG7+/G7+e97+/G7+fG7+/G7+e97+/G7+fG7+/G7+e97+/G 7+fG7+/G7+fG7+/G7+fG7+/G5+e97+fG5+e97+fG5+e97+fG5+e97+fG5+e9 7+fG5+e97+/G5+e97+fG5+e97+fG5+e97+fG7+e97+fG5+e97+fG7+e97+fG 5+e97+fG7+e97+fG5+e97+fG7+e97+fG5+e97+fG7+e97+fG5+e97+fG7+e9 7+fG5+e97+e95+e97+fG5+e97+e95+e97+fG5+e97+fG7+e97+fG5+e97+fG 7+e97+fG5+e97+e95+e97+fG5+e97+e95+e97+fG5+e97+e95+e97+fG5+e9 7+e95+e97+fG5+e97+e95+e97+fG5+e97+e95+e97+fG5+e97+e95+e97+fG 5+e97+e95+e97+fG59697+e95+e97+e959697+e95+e97+e95+e97+e95+e9 7+fG5+e97+e95+e97+fG5+e97+e95+e97+fG5+e97+e95+e97+fG5+e97+fG 7+e97+fG5+e97+fG7+e97+fG5+e97+e95+e97+fG5+e97+e95+e97+fG5+e9 7+e95+e97+e95+e97+e95+e97+e95+e97+e95+e97+e95+e97+e95+e97+e9 5+e97+e95+e97+fG5+e97+e95+e97+fG5+e97+fG7+e97+fG5+e97+fG7+e9 7+fG5+e97+e95+e97+fG5+e97+e95+e97+fG5+e97+e95+e97+fG5+e97+e9 5+e97+fG5+e97+e95+e97+fG5+e97+e95+e97+fG5+e97+e95+e97+fG5+e9 7+e95+e97+fG5+e97+e95+e97+fG5+e97+e95+e97+fG5+e9AO/vxu/nve/v xu/nxu/vxu/nve/vxu/nxu/vxu/nxvfvxu/nxu/vxu/nxvfvxu/nxv/vzv/W teethN6cc++te+etc/e9e/e9e//Gc//Gc//Oe//Oc//ee//ehP/vpf/vvefn xrX//63//63//7X//5z//5T//5T//3v//3P//2v//1r//1r//1r//2v3/2vv /8b/997n1v/vvefvtefvvffnzvfnxufnve/vxufete/nxufexvf33v////// /////////+fnxu/vxu/vxufnvff33v///////////////+/nxu/nvffvxu/n vefnzv///////+/nzvfvxufnxv//////////7+/vxu/vxufnve/nxv//7/// /////+/nxu/ntf///////////+/nzufezufexu/vzv///////////+/vzu/v ve/vzv///////////+fnxt7exu/v1t7ezv//9////////97exu/nxufnve/v zv///////////////+/vxu/nve/nzv///////////////+/vxu/nvefnve/v xu/vxufvxufnxt7exv///////+/vxu/nvffvxu/nxu/vxu/nvffvxu/nxv// 9////////+fnxufnxufnxu/vzufnxvfvzufnvf//9////////+fnxu/nve/n vefnxv//////////////////7+/vxu/vve/nvefexv//////////997exufn xufnxt7exvfv1v//3u/nxu/nxu/vxu/vxu/nvffvxu/nve/vzvfv1v/////3 3vfvzu/nve/vxu/nve/vxvfvzvfv1v//9////+/nzu/vzufnxv////////fv 3ufexu/vzu/vzufnvf/33v///////+fnxvf3zu/nzv///////+feve/vxu/v xvfn3v///////+fnxvf3zu/vzvfv1vf33v////f31u/nzvfvxu/vvefnxv/3 3v///+fnvefvxv//9////+/nzt7Wvefnvefnxvfv3v///////97exu/vxu/v 1v////fv3ufnxt7nvf///////+/nxu/nve/nxu/nve/nxu/nve/nxu/nve/n zv//////7+fnxu/vxu/nve/vxu/nvefnvf/33v///////////+/nzufnve/v vf//////9+fnzufnxu/vxt7eve/vzu/nzvfvzufete/vvefnvf////////// //f/3u/vxufnvefnzv///////////+/nxufnvffvxu/nxufnvefnve/vztbW vf//5/////f/zu/nxv//9////+fnxufnvf/33v//////5+/nzu/nxu/nxu/n xu/nxvfvzu/nxu/nvefevf//9////+/n1ufexu/nxu/ntefnxv///////97W ve/vzufnvf////////fv1u/nxu/nzufnxufnxu/nxvfvzu/nxufnvffv1v// //fv3u/nxu/vve/nxu/nxu/vxu/nve/vxu/nve/vxu/nve/vxu/nve/vxu/n ve/vxu/nve/vxu/nve/vxu/nve/vxu/nve/vxu/nxu/vxu/nve/vxu/nxu/v xu/nxvfvxu/nxu/vxu/nxvfvxu/nxu/nxu/nve/vxu/nxu/vxu/nvffvxu/n xu/vxu/nve/vxu/nxu/vxu/nve/vxu/nxu/vxu/nve/vxu/nxu/vxu/nve/v xu/nxu/vxu/nxvfvxu/nxu/vxu/nxvfvxu/nxu/nxu/nve/vxu/nxu/vxu/n xvfvxu/nxu/vxu/nve/vxu/nve/nxufnve/nxu/nve/nxu/nve/vxu/nve/v xu/nve/nxu/nve/nxu/nve/vxu/nve/nxu/nve/vxu/nve/nxu/nve/vxu/n ve/nxu/nve/vxu/nve/nxu/nve/nxu/nve/nxu/nve/nxu/nve/nvefnve/n xu/nve/nvefnve/nxu/nve/nxu/nve/vxu/nve/nxu/nve/vxu/nve/nxufn ve/nxu/nve/nxufnve/nxu/nve/nxufnve/nxu/nve/nxufnve/nxu/nve/n xufnve/nxu/nve/nxufnve/nxu/nve/nvefnve/nxu/nve/nvefnve/nxu/n ve/nvefnve/nvefnve/nvefnve/nvefnve/nvefnve/nxu/nve/nvefnve/n xu/nve/nvefnve/nxu/nve/nvefnve/nxu/nve/nxu/nve/nxu/nve/nxu/n ve/nxu/nve/nvefnve/nxu/nve/nvefnve/nxu/nve/nvefnve/vve/nve/n vefnve/vve/nve/nvefnve/vve/nve/nvefnve/vve/nve/nvefnve/nxu/n ve/nvefnve/nxu/nve/nxu/nve/nxu/nve/nxu/nve/nxu/nve/nxufnve/n xu/nve/nxufnve/nxu/nve/nxufnve/nxu/nve/nxufnve/nxu/nve/nvefn ve/nxu/nve/nvefnve/nxu/nve/nvefnve/nxu/nve/nvefnve/nxu/nve/n xufnve/nxu/nve/nxufnve/nxu/nve/nxgDn573v58bn573v573n573v58bn 573v573n573v58bn573v573n573v58bn573v573v58b/58bntYznpXPvrXvv tXv3tXP/xnv/zmv/1nv/1oT/3pT/3pT/56X/563/773358a99++1///G///G //+1//+l//+t//+U//+U//9z//9j//9S//9j//9j//9j9/+t9//e7+fv3r3n 773e573/587v3r3n77Xv573v573n3r3n58b//+/////////////////n587n 3r3n573n573///f////////////////v587n3r3v3rXv58bn3sb////////v 587v57Xn573//////////+fv573n573v573n58b///f////////n3r3v773/ ///////n3s7e1rX378b378bn3rX3987////////n773n573/997////////e 3sbv573v573v573n573n58b//////////+/n573n573n58b///////////// ///e3r3n3r3/997////////////////v58bv573v773378bn57Xe57Xn58b/ /+/////////n573v573n573v573n573v573n573v573//+/////////n58bv 78bv773n57Xn563n3r3v78b//+/////////v787n57X3573n3sb////////v 7+f////////n58bn57Xn573//+f////////e3sbn3r3v573358bn58bn58bn 3r3n573n573n573n3rXv58bn3rXv573n58b379b////3997n3r3v573n573n 573n3rXv78bv58b///f////v59bn587//+f/////997e1r3v787v78bn773n 77Xn58b////////v78bn573e3sb///////fv58bn57Xv78bn3s7///////fv 58bv58bv787v587/9+f/////997n58bv78bv773v7873797////n573v787/ /+f////n1r3378b378bn3rXn3sb////////n58bv78bv79b////3797n58bn 573////////n3r3v573n3r3v573n3r3v573n3r3v573n3sb//////+fn58bn 3r3v573e3rXn573v787////////////////v79be3r3//87////v79bW1rXv 78bv573v573n3rXv58bn3r3n573n57Xn58b///////////f////e3rXn58b/ /+f//////+/////v78bn3rXn3rXv573n3rXn573n58bn587//+/////n773n 58b///f////v78bv78b//+/////v3r3n3r3n3rXv573v573v573n3rXv573v 573v58b//+/////e1r3n3r3n57Xv77Xn3sb//////+/n58bn573n573///// ///n3r3n3r3v573378bv573n573n3rXv773n3r3379b////3797n3sb378bn 3r3v58bn573v573n573v573n573v573n573v573n573v573n573v573n573v 573n573v573n573v58bn573v573n573v58bn573v573v573v58bn573v58bv 573v58bn573v58bn573v58bn573v58bv573v58bv573v58bv573v58bn573v 58bv573v58bn573v58bn573v58bn573v573n573v58bn573v573n573v58bn 573v573n573v58bn573v573n573v58bn573v573n573v58bn573v58bv573v 58bn573v573n573v573n3r3v573n573v573n573v573n573v573n3r3n573n 573v573n3r3v573n573v573n3r3v573n573v573n3r3v573n573v573n3r3v 573n3r3v573n3r3v573n3r3v573n3r3v573n573v573n3r3v573n573v573n 3r3v573n573v573n3r3v573n573v573n3r3v573n3r3v573n3r3v573n3r3v 573n3r3v573n3r3v573n3r3v573n3r3v573n3r3v573n3r3v573n3r3v573n 3r3v573n3r3v573n3r3v573n3rXv573n3r3v573n3rXv573n3r3v573n3rXv 573n3r3v573n3rXv573n3r3v573n3rXv573n3r3v573n3rXv573n573v573n 3r3v573n573v573n3r3v573n3r3v573n3r3v573n3r3v573n3r3v573n3r3v 573n3rXv573n3r3v573n3rXv573n573v573n57Xv573n573v573n57Xv573n 573v573n57Xv573n573v573n57Xv573n573v573n3r3v573n573v573n3r3v 573n3r3v573n3r3v573n3r3v573n3r3v573n3r3v573n3r3v573n3r3v573n 3r3v573n3r3v573n3r3v573n3r3v573n3r3v573n3r3v573n3rXv573n3r3v 573n3rXv573n3r3v573n3rXv573n3r3v573n3rXv573n3r3v573n3r3v573n 3r3v573n3r3v573n3rUA7+fG7+e97+fG5+e97+fG7+e97+fG5+e97+fG7+e9 7+fG5+e97+fG7+e97+fG5+e91ue99+/G78ac5617972E77Vz9717/8Z7/9Zr /9Z7/96U/96l/+et/++1//fO//fW//fGrefWvf//zv//zv//vf//tf//tf// rf//pf//jP//Y///Wv//Y///a///Wvf/pf//1ufn9+fG5++93u/G9+fG9969 5++17+fG7+e95+e95+fG//////////fv////////7+fW7+fG5+e17+/G//// ////9+/v//////////fe79699++97+e95+fO////////7+fG7++15+e9//// ///////v7+e17+/G5+e95+fG///v////////7+fG7++9////////5+fO7+e9 9++97+e19+/G5+e9////////9/fO3ue9///3////////3ufG9+e99+e97+e9 7++95+fG///////////37+e97+fG///v///////////////////e9+/O///v ////5+/e////////9+/W7+fG9+fO59a19+fG9+/O////////////////7+fG 7+e97+e95+e97+fG7+e97+e95+e9////////////597G7+fG59617++97++1 9+/G3t61///n////////5+fG7++97+e9//fn////////1tbO////////9+/O 5+e95+e9///v////////7+/O9/fO9++99+e97+/G7+/G9/fG7+e95+e95+e9 7+e95+e97++95+e95+fG9+/e////9+/W7+fG7+e97+e97+e97+/G5+fG7+fO ///3////7+fW7+fO////////7+fO9+/O5+e97++95++17/e15+e9///v//// 9/fW5+e97+fW///////35+fG7++95++97+fW///////37+/G9+/G7+fG7+fO 9/fn//////fe7+/O59695++15+fG/+/n////7+/G3ue19/fe///////35961 7+e17+e9597G///3////59695+e99+/W////7+fe5+fG3ue1////////7+e9 5+e97+e959697+e95+e97+e95969597G///////3597G59697+fG5+e95+e9 ///3//////fn//fv////3t695+fG///n////5+fG5+e97+e9596t7+e97+e1 79697+fG7+e95+e95+fG////9/fv7+/e////7++95+e9////////3t7W//// ///e5+e97+e95+e19++95+e19/fO////////////7++9597G////////5+e9 5+e9////////9+e97+e99+e97+e17+e97+e99++97+e17+e15+e9///v//// 597G5+fG7+e15+et7+fO///////37+/G5+e95++9///////39++97+e97+e9 7+e19++97+e17+e97+e15+fG9+/W//////fe7+fO7+/G5+e97+fG7+fG7+e9 7+e95+e97+fG7+e97+e95+e97+fG7+e97+e95+e97+fG7+e97+e95+e97+fG 7+e97+e95+e97+fG7+e97+e95+e97+fG7+e97+e95+e97+fG7+e97+e95+e9 7+/G7+e97+fG7+e97+/G7+e97+/G7+e97+/G7+e97+fG7+e97+/G7+e97+fG 7+e97+fG7+e97+e95+e97+fG7+e97+e95+e97+e95+e97+e95+e97+e95+e9 7+e95+e97+fG7+e97+e95+e97+fG5+e97+e95+e97+/G7+e97+fG7+e97+fG 5+e97+e959697+e95+e97+e95+e97+e95+e97+e95+e97+e97+e97+e97+e9 7+e97+e97+e97+e97+e97+e97+e97+e97+e97+e97+e97+e97+fG7+e97+e9 7+e97+fG7+e97+e97+e97+e97+e97+e95+e97+e97+e97+e95+e97+e95+e9 7+e959697+e95+e97+e959697+e97+e97+e959697+e97+e97+e959697+fG 7+e97+e97+e97+fG7+e97+e97+e97+e959697+e959697+e959697+e95969 7+e959697+e959617+e959697+e959617+e97+e97+e95+e97+e97+e97+e9 5+e97+e959697+e959617+e959697+e959617+e95+e97+e959697+e95+e9 7+e959697+e959697+e959697+e959697+e959697+e95+e97+e959697+e9 5+e97+e959697+e95+e97+e95+e17+e95+e97+e95+e17+e95+e97+e95+e1 7+e95+e97+e95+e17+e95+e97+e959697+e95+e97+e959697+e959697+e9 59697+e959697+e959697+e97+e97+e959697+e97+e97+e959697+e95969 7+e959697+e959697+e959697+e95+e97+e959697+e95+e97+e959697+e9 5+e97+e959697+e95+e97+e959697+e959697+e959697+e959697+e95969 7+e9AOfnte/nvefnve/nvefnte/nvefnve/nvefnve/nve/nve/nvefnve/n ve/nve/nvefetffnve/Wrd6thO+tc/+9c/+9a//Oc//Oc//ejP/enP/nrf/n tf/3zv//1v//5//vxufnzq3/9////87//8b//8b//9b//8b//73//6X//4z/ /3P//2v//2P//2P//3v3/87v997ntd7nte/nve/nvefetf/exufeve/nte/n vefezv///////+fnvf//7////////+fnrffvvdbWvf///////+fevf//9/// /////97ete/nve/ntefntf///////+/nxvfvtefntf/////////35+/nvffe ve/evefexv//9////////+fevf/vvf///////97eve/nve/nte/nvefeve/n zv////////fvxu/nvf//7////////+fvve/exu/nve/ete/ntefntf////// /////+/vrd7Wvf////////fvzu/ntf///////+fntf///////+fnvf//1v// /////+fntdbntd7nxv//////////////////7+/nzufnte/nvefnve/nvefn te/nvefnve/nvf//5////////+fnve/nte/ntefeve/nvffeve/nxv//7/// //////fvve/nte/nvf/////////31u/nxv/35///////997nte/nvf//5/// ////////////////////////////////////797eve/nvffvxu/nvefetefn vefntff/1v///+/v1ufntefnxufeve/vvefevd7etefntf//9////+/3ve/v zv//9////+/nzu/nvefnre/vte/vvffevffnzufe1v/////33u/exu/ezv// ////9+/nxvfevf/nxufexv//////9+/nzu/etffnxu/vzu/v3v////fv3vfn 1vfnxt7npffvxvfv1v///+feve/nxvfvxv//1v////////////////////// /////97nvefetffvzv////f31ufWte/evf///////+fete/nvefete/nvefe te/nvefnte/nvd7nvf//////9+/vvefetefnvd7etff33v//////597evf// 9////+fevefetf//9///////////////////////////////////997nrd7n tf///////+fnvefntf/////33u/nzv//////3t7evf//////9+fexufnvd7e vd7exv////////////f31ufnve/Wte/nvf//9////9berefnvf////////// /////////////////////////////97erd7nvf//7////97evefnvefnvd7n vd7Wvf//////7+/nxu/ete/evf////////////////////////////////// //f35+fevffn1v////fn1u/nve/vte/evffezufete/nvefeve/nvefete/n vefnve/nvefnte/nvefnve/nvefnte/nvefnve/nvefeve/nvefnve/nvefe ve/nvefnve/nvefeve/nvefnve/nvefeve/nvefnve/nvefnve/nve/nve/n vefnve/nve/nve/nvefnve/nve/nve/nvefnve/nve/nve/nvefnve/nve/n ve/nvefnve/nve/nve/nvefnve/nvefnve/nvefeve/nvefeve/nvefnve/n ve/nve/nvefnve/nve/nve/nvefnve/nve/nve/nvefnve/nve/nve/nvefe te/nvefeve/nvefete/nvefete/nvefete/evefete/nvefete/evefete/n vefete/evefete/nvefete/evefete/nvefete/evefete/nvefete/nvefe te/nvefete/nvefete/nvefete/evefete/nvefetefevefete/evefetefe vefete/evefete/evefete/nvefete/evefete/nvefete/evefete/nvefe te/evefete/nvefetefevefete/evefetefevefete/evefetefevefete/e vefetefevefete/evefetefevefete/evefetefevefete/evefetefevefe te/evefetefevefete/evefetefevefetefnvefetefnvefete/nvefetefe tefete/nvefete/nvefete/nvefete/nvefete/nvefete/nvefete/nvefe te/nvefete/nvefete/nvefete/nvefetefevefete/evefetefevefete/e vefetefevefete/evefetefevefete/evefetefevefete/evefetefevefe te/evefetefevefete/evefetefevefete/evefetefevefete/evefetefe vefete/evefetefevefete/evefetefevefete/evefetefevefete/evefe tefevefete/evefetefevefete/evefetefevefete/evefetQDv573n57Xv 573n573v573n57Xv573n573v573n573v573v573v573n573v573v573v573v 57333rXntYT3tXv/vXP/znP/znP/1oT/3oz/763/77X/987//9b//+f//+// /97e3r2t/+fv///3///n///n///O///G//+1//+c//+E//9z//9j//9j//9S //979/+97//n59bn3rXn573e573e573W573v58bv57X35733797////////n 573/987////////n57Xn57339+f////////n3r3//97////////e3rX3573v 3q3n573////////v58bv57Xn57X///////////fn3r3v3rXv57Xn78b//+// ///////v5873773////////n3sbn573v773v57Xn57Xn573////////378bv 573//+f////////e3r3378bn3q33773v773n573/////////9/fn563n587/ ///////n573n3rX////////v787////////e3rXv78b////////e573n57X/ /+////////////fn573v573v3rXv573n57Xv573n573v573n57Xv573n573/ /+/////////n3r3v773n57Xv573n5733573v58b//+/////////n3r3n57Xn 58b////////v78be3rX359b////////n573n3r3//+////////////////// ///////////////////3997n58bn3rXv5733573v573n573n57Xv787////v 797v773e1r3n3sbn3r3n3sbn3r3v78b///f////n573e3r3///f////n3s7n 3r3v773398bv5733573n3r3//+f////v58bv58bv787//////+/v3r3/78bv 3rXv58b//////+/n3sb/773n3rXv58b3997////39973787358bv773n3r3/ 9+f////v587v573v573v573v587/997///f////////////////e3r3v573v 787////v787v58bv3r3////////v573n3rXv573n57Xv573n57Xv573n573n 773///////fn57Xn3r3n3r33987///////fv58bn3r3///f////n3r3v573/ /+////////////f//+f//+///+///+/////////n773e57X////////e57Xn 57X////////3797////v787n58b//+/////n587n3rXv58b/////////997e 3r3v573n3q33573n3rX///f////n573n573//////////////+f///f///f/ /+///+f////////377Xn3r3///f////n3r3v57X3773e3rXn58b//////+/n 3r3v57Xv573///////////f//97//+////f//+///+f//////+/n573v787/ ////997n57Xv77X3773v3sbv573n3r3v573n3r3v573n3rXv573v573v573n 57Xv573n573v573n57Xv573n573v573n573v573v573v573n573v573v573v 573n573v573v573v573n573v573v573v573v573v573v573v573v573v573v 573v573v573v573v573v573v573v573v573v573v573v573v573v573v573v 573v573v573v573v573v573v573n573v573n573v573n573v573v573v573n 573v573v573v573n3r3v573n573v573n3r3v573n573v573n3r3v573n573v 573n3r3v573n3rXv573n3rXv573n3rXv573n3rXv573n3rXv573n3rXv573n 3rXv573n3rXv573n3rXv3r3n3rXv573n3rXv573n3rXv573n3rXv573n3rXv 573n3rXv573n3rXv573n3rXv3r3n3rXv573n3rXv3r3n3rXv573n3rXv3r3n 3rXv573n3rXv3r3n3rXv573n3rXv3r3n3rXv573n3rXv3r3n3rXv573n3rXv 3r3n3rXv573n3rXv3r3n3rXv573n3rXn3r3n3rXv3r3n3rXn3r3n3rXv3r3n 3rXn3r3n3rXv3r3n3rXn3r3n3rXv3r3n3rXn3r3n3rXv3r3n3rXn3r3n3rXv 3r3n3rXn3r3n3rXn573n3rXn3r3n3rXv573n3rXn3rXn3rXv573n3rXv573n 3rXv573n3rXv573n3rXv573n3rXv573n3rXv573n3rXv573n3rXv573n3rXv 573n3rXv573n3rXv3r3n3rXv573n3rXv3r3n3rXv573n3rXn3r3n3rXv3r3n 3rXn3r3n3rXv3r3n3rXv3r3n3rXv573n3rXv3r3n3rXv573n3rXv3r3n3rXv 573n3rXv3r3n3rXv573n3rXv3r3n3rXv573n3rXv3r3n3rXv573n3rXv3r3n 3rXv573n3rXv3r3n3rXv573n3rXv3r3n3rXv573n3rXv3r3n3rXv573n3rXv 3r3n3rXv573n3rXv3r3n3rXv573n3rXv570A59617+e95961596159617+e9 5961596159617+e95961596159617+e95961596159617+e9796t78aM97V7 /8Z7/8Zz/9Zz/9aM/+ec/++t//fG//fW///n///v///3///n3ue9xufW3v// ////////9///1v//tf//vf//tf//tf//nP//jP//Y///Uv//Wvf/nP//1ufn 79695961797G59693ue159a17+e13ta1////////////3t617969//////// 5+e93t61///////////v5+e93t69////////5+fG59617+e15+e9//////// 7+fO596t5+e9////////////3ta17+e15+e11t6t///v////////3t695+e1 ////////9/fe7+/G3t6t5+et3t6t5++9////////7+e97+e19+/O//////// 597O3t6t596t7+e93t613t69////////9/fn5+e1//fn////////3t615+e1 ///n///////////////35+e13t6t////////3ufW5969///////////v597G 5+e1596t796t59617+e95961596159617+e959615961///n////////5969 7+e17+e159615+e959at5+e99//n////////59695969///3////////3t61 3t61597G////////9/fe59699+/W////////5+fO596999699961zs7G//// ////7+fO59697+e959617+e959615+e91t6l7+/O//////////////////// ////////////////////////5+e93t619/fW///////v7+fG7+fG3t617+fG 5+e15+fG///v////7+/G7+fG1ta1///////35961596t9+e97+fG///////3 7+/G7+e17+e9zs6t9/fW///////33ta19+/G7+/G597G///3////59695961 59617+e959617+e17++97+fG797G////////796959699+/W////7+/O5969 59a1////////596159615961596159617+e9596159611t6t///////v5961 5969597G////////597G59613t61///3////5+e93ta1/+/W////9+/W59a1 7+e9596159617+fG///3////3t613t61//////fn5+e13t6t//fe//////// ////3ta13t617+fG////7/fn9969//fe////9+fO59a99+/G596l9+et7961 5961///v////3ue15961///3////596t5+e1596159617+fG797G//////// 7+et5961///n////59a17961796t596t3t61///////v596979617+e1///3 ////596t7+e159617+e93ta19+fO///////n5+e19+/O///////v3t617/e9 7+e17+e95961796959615961596159695961596959617+e9596159615961 7+e95961596159617+e959617+e959617+e959617+e959617+e959617+e9 59617+e959617+e959617+e959617+e959617+e959617+e959697+e95961 7+e959697+e959617+e959617+e959617+e959617+e959617+e959617+e9 59617+e959617+e95961796959617+e95961596159617+e9596159615961 596959615961596159695961596159617+e9596179695961796959615961 596179695961796159617969596179615961796959617961596179695961 796159615961596159615961796159a15961596179615961596159615961 59a15961596179615961596159617961596159615961596159a159615961 596159a159615961596159a159615961596159a159615961596159a15961 5961596159a1596159a1596159a1596159a1596159a1596159a1596159a1 596159a1596159a1596159a1596159a1596159a1596159a159613ta15961 3tat596159a159613ta159615961596159at596159615961596159615961 596159615961596159615961596159615961596159615961596159615961 5961596159a159615961596159a1596159a1596159a1596159a1596159a1 59615961596159a159615961596159a159615961596159a1596159615961 59a159615961596159a159615961596159a159615961596159a159615961 596159a159615961596159a159615961596159a159615961596159a15961 5961596159a1596159atAO/nvefete/nvefete/nvefete/nvefete/nvefe te/nvefete/nvefete/nvefete/ntefetffnte/OlPe9hP+9c//Oe//Wc//e lP/npf/vvf/3zv//3v//7////////////97vzufe1rX///f///f//////+f/ /+//7+fv5+/n3ufW1ufe1s7n3r3v763374T3/5z3/97v7/fevefnte/Wxv/e xt7npefete/ntefevf///////+/v1ufnve/etf////////f33tbWvf////// //fv1ufetd7Wtf////////f33ufete/etd7etf///////+/nzufetd7evf// //////////fv1t7evdbWtefnxv//////////5+fetefntf///////////97e vefnvd7evefnvf//7/////////fnxuferefevf///////////+/vxufevd7W vdbOvf//9////////97evefevf/////////35+/nvefntefnxv////////// /+/n1ufnteferf///////+/v7+fnvf////////fv3ufext7ete/nvefete/n vefetefetefete/nvefetefetefetf//7////////+fete/ntefete/nvefe tffnvd7etff/5////////97Wtefnxv////////f33ufntd7etefevffv3v// /////+/nxt7Wtf//////////997Wve/eve/evf/37////////97eve/nve/n ve/nvefete/nvefnvefnrefnxv//////////7///9///9///5///9///9/// 7////////9bWtd7erefevf////////fvzufeve/nzufezu/nvd7exv////// 9+/nxt7Wte/v1v//////7+/vxvfvxufWtd7evf///////97Wvefnve/nxufn xv//9////////+fnxufexu/nzufezv///////+/vzufnvefnve/vxu/nxufe te/nvd7Wte/ezv///////+/nxu/nxu/v1v///+fnxu/exufWvf///////+fe tefetefetefete/nvefetefetefetd7erf//////9+fevefWvf//9////+/n 1u/evefetefevf//7////+fevefetefevf////////fnztbOrffvxt7Wtefe xv///////97Wtf//1v///+/nzu/ntefnrefetf//////////9+fetffnvd7W tf///////+/evf//9////97WvefexufWtefetefere/etefetf///////+fn td7Wrf/v3v//////5+fevefetd7Wtefetf/v1v/////33u/etefevf//7/// /+/nxu/etefetefevd7evf//////997Wvffnvd7Wrf//3v/////3ztbOre/e vefevefevf//9/////fnzt7erffvzv///////+fnxtbWre/nve/nve/nvefe tefetefete/nvefetefetefete/nvefete/nvefete/nvefete/nvefete/n vefete/nvefete/nvefete/nvefete/nvefete/nvefete/nvefete/nvefe te/nvefete/nvefete/nvefete/nvefete/nvefeve/nvefete/nvefeve/n vefete/nvefete/nvefete/nvefete/nvefete/nvefeve/nvefete/nvefe te/evefete/nvefete/nvefete/nvefete/nvefetefetefetefetefetefe tefetefetefete/nvefete/nvefete/nvefetefetefete/etefete/etefe te/etefete/etefete/etefete/etefete/etefete/etefetefetefetefe tefete/etefetefetefete/etefetefetefete/etefetefetefete/etefe tefetefete/etefetefetefetefetefetefetefetefetefetefetefetefe tefetefetefetefetefetefetefete/etefetefetefete/etefetefetefe tefetefetefetefWrefetefetefetefWrefetefetefetefWrefetefetefe tefWrefetefetefetefWrefetefetefetefWrefetefetefetefWrefetefe tefetefetefetefetefetefetefetefetefetefetefeteferefeteferefe teferefeteferefeteferefeteferefeteferefetefere/etefetefetefe te/etefetefetefetefetefetefetefetefetefetefetefete/etefetefe tefete/etefetefetefete/etefetefetefete/etefetefetefete/etefe tefetefete/etefetefetefete/etefetefetefete/etefetefetefete/e tefetefetefete/etefetefetefete/etefetefetefete/etefetefetefe tefetQDn3rXn3rXn3rXv3rXn3rXn3rXn3rXv3rXn3rXn3rXn3rXv3rXn3rXn 3rXn3rXv3rXn3q3n3q3v3q331pzvvXv/xnP/znP/3nv/3pT/56X/773//9b/ /+f///f//////////////+/ezsal/+/v///3///n79be3r3v1rXv3r3e3r3W 58bO3r3W3r3e3r3n58a91s7G597n3s7/57Xe3qXn3r3v1r3W563v3rXn573v 587////////e3rXn3q3v3rX359b////////n59b////////n3r3n3rXn3rX/ //f////////e1q3v3rXn3r3////////n3sbn3rXn3r3///////////////// //f////////////////v58be1q3v57Xe1sb//////////////+////f///// ///////////n3rXv3rXe1q3379b///////////////////////////////// 99be3rXe1rX////////e1sbWzqXn3q3e1q3////////////e1r3v57Xn3q3/ 79b////////e3rX//+f///////////f//+/////////n3rXn3rXn3rXn3rXn 3rXn3rXn3rXn3rX//+f////////n3r3n3q3n3rXn3rXn3rXn3q3e3q3//+f/ ///////e1rX399b////////e1r3e3q3n3q3e1rXn3sb////////v573Wzq3v 787//////////////+////f//////////97e1rXn3rXn3rXn1q3v3r3e1q3n 3rXe3q3v787////3597n3rXn1sbe3rXe3q3e1q3e1rXe3rX///f////e57Xn 563WzqX/79b////////379bn1sbn3s7/997////////n3s7n1r3v3sbv597/ //////fv79b3787n3r3e3sb////////////n3sbe1r33797///////////// //fv587W1r3/9+f////////e1rXW1qXv573/////////997W1rXe3sb//+// /////+/e3rXv3r3399b////379bv3r3v3r3////////n3rXn3rXn3rXn3rXn 1q3n3rXn3rXn3rXe3q3/////9+/n3r3v587//////+fezr3n3rXn3rXe1rX/ //f////n573e1q3v3r3v587////////e3sbWzrXn3sb///f////n3sbe1rX/ ///////ezrXn3rXe1qXv57X////////v58bv3rXn1q3e1rX///f////e1rX3 787///////fWzr3e1r3n3sb////n1q3e3rX///f////n3rXn3q3ezr3//97/ //////fWzr3e3sbv79b////////e3r3e1rXv59b////////n3s73587n3sbe 3sbv59b////////v3tb3587v1r3n3sb/////////9+fe3sbW1r3//97///// //fW1rXn3rXv58b//////////+/n3sbn58bn3r3n3rXv3rXn3rXv3rXn3rXn 3rXn3rXv3rXn3rXn3rXn3rXv3rXn3rXn3rXn3rXv3rXn3rXn3rXn3rXv3rXn 3rXn3rXn3rXv3rXn3rXn3rXn3rXv3rXn3rXn3rXn3rXv3rXn3rXn3rXn3rXv 3rXn3rXn3rXn3rXv3rXn3rXv3rXn3rXv3r3n3rXv3rXn3rXv3r3n3rXn3rXn 3rXv3rXn3rXn3rXn3rXv3rXn3rXv3rXn3rXv3rXn3rXn3rXn3rXn3rXn3rXn 3rXn3rXv3rXn3rXn3rXn3rXv3rXn1q3n3rXn3rXn3rXn1q3n3rXn3rXn3rXn 3rXn3rXn3rXn3rXn3rXn3rXn3rXn3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n 3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn 1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n 3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn 1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n 3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn 1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n 3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3q3n1q3n3rXn1q3n3q3n1q3n3rXn 1q3n3q3n1q3n3rXn1q3n3q3n1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n 3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn 1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n 3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn 1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q0A79615961 796159617961596179615961596159617961596159615961796159617961 3tat796179al98aM/8Z7/857/957/+el/+et//fG///W///v//////////// ////////797O1ufO///v597G1ta1xue9re/Gpe/Orf/epf/enP/WlO+9lOe1 jNalxtaltdalzt6t596t796t59a17969596t79613tat///v////////3ta1 7+e159a1597G////////////////////596959617+e99+/O////////5961 596t797G////////596979613tat///////////3///v//////////////// ///n3tat79613tat59a13ta9////////////////////9+fe////////7+fG 796159611tat9+/W//////////////////////////fW3ta15961//fW//// ////3ta95961796t7+e9///v////////5969596t79615961////////3t6t 1ta1////////////////////////59615961596159615961596159615961 ///n////////3ta1596t596t79693tat7+e13t6t///n///////37969///n ////////3ta15+e13tat796159a9///////////v7+e93tat5+fG//////// ///////////////n59693tat7+e13tat796179617+e959617+e17+/O//// 797O596159a95+e1596l7+e13t6t5+e1///v////3t6t596l596159a9/+/W ////////////////////////9+/e3s619+fG//////////////////////// /+/O7+fO///////////3////////////////3tbG/+/e//////////////// ////7+fO7+fG7+e159619+fG////////////////////////3ufG3ue15961 9+/O////9+/W7+e97969////////79615961796159615961596159615961 5961///////35+e9////////3tat797G59613t6t5961///3////3t61596t 79613ta99+/W////////////////////797O3ta17+fG///////v59695961 596t7961///v////59617961796t5961//fW////59693ta1//fW//////// ////////////796t3t6t///3////5+e1796t58615961//fv//////////// ////////3ue93t61///e//////////////////////////////////////// /////////+/O1sat597G///////////////////////v3ue91ta15969/+/W //////fn////////////9+/W7+e159617+e159615961596t796159617961 596179615961796159617961596159615961796159615961596179615961 596159617961596159615961796159617961596179695961796159617969 596179615961796959617961596179695961796159617969596179615961 796959617961596179695961596159617961596159615961796159615961 5961796159615961596t5961596t5961596t5961596t5961596t59615961 5961596t5961596t596159at596159at596159at596159at596159at5961 59at596159at596159at596159at5961596t596159at596159at596159at 796159at596159at596159at596t59at596t59at596t59at596t59at596t 59at596159at596t59at596159at596t59at596159at596t59at596159at 596159at596159at596159at596159at596t59at596159at596t59at5961 59at596t59at596159at596t59at596159at596t59at596159at596t59at 596159at596t59at596t59at596t59at796159at596159at596159at5961 59at596159at596t59at596t59at596t59at596t59at596t59at596t59at 596t59at596t59at596159at596159at596159at596159at596159at5961 59at596159at596159at596159at596159at596159at596159at596159at 596159at596159at596159at596159at596159at596159at596159at5961 59at596159at596159at596159at596159at596159at596159at596159at 596159at596159at596159at596159at5961AOfWrefetd7WrefetefWrefe td7WrefetefWrefetd7WrefetefWrefetd7WrefetefWtd7Wtd7Wre/erffG jP/OhP/Gc//ehP/enP/vrf/3vf//1v//7////////////////////+/nzv/W vefGrcbOrb3nxr3/78b//87//8b//8b//7X/76X/54z/1oT/zoznnITelIze nM7ete/Ote/WrefWrffWtefWrd7Wrf/////////35+/eteferefWtefWtf// ///////////////31t7Wrefetd7Wpd7etf///////+/vxt7WpdbGre/nvefe xt7Wre/erd7Opd7eve/vztbOrefWrdbWte/nzu/ezufWvd7Ore/ete/etefW tefWrefetd7Ord7Wtffvzvfvzt7Wte/Wvf///////+/exufWreferd7erdbW pefWtd7Wte/nxvfvzu/nxt7Wtd7Wrd7WrefetefWpffvxt7Wvd7Wte/ete/e refWrefevefevefWrd7Wpe/evd7Wrd7Wpefete/evefWpefWtd7OtdbWtefn xvfvzt7Wvd7Ovd7Wrefetd7Wrefetd7Wrefetd7Wrefetf//5////////97W tefWpefetefWtd7Wre/erd7WrdbOrffv1u/evefWpd7Wrefnzufetd7WrefW re/ete/etefWrd7Wte/nxufWtefWreferd7Wrd7Otefexvfv1u/vxufWtefe td7WreferefWrefetefWrefWrefWtefWtd7ere/vxv///+/nzt7epefetefW refepefWrd7Wrd7Wrf//7////+fetd7epe/etdbOrd7Otefnvefnvff31v// 5+/nxu/nztbOte/eve/Wrf/vxufezv//////9/fnzv/3zu/WtdbOre/nztbG rffnve/exv/33vfvzvfnxt7Otefevefeve/nzv//1v/vzufWvdbOre/etffv vefete/evefWve/nxu/nxvfv1vfnzufWvc7OpefetefWrd7evffv1t7Wtefe te/etf///////+fete/etefete/etefetefetd7WrefWrd7Wrf////////// 7////+fevdbWnO/etefWreferd7Wrf//9////+fetd7Wpeferefetd7Wrd7W te/vzvf31u/nzt7OtefOteferd7Wre/nvefWtd7Ore/evefWrefWpd7Otf/v zt7OpeferefWreferd7Opf/31ufWtefWrd7etefevffvzv//3u/exufWvefe pd7erf//7////97Wre/erefWtefetdbOrefeve/nzv/33u/nxufevdbWrd7e rd7Wre/nzv//9////+fexvfvzufevd7Wve/ezv//////9+fnzu/eve/etefW rd7Wrd7Ote/exu/nxv/31ufevd7WrdbWrd7Wre/WtefWrffvxt7Wrefnve/n xu/nxt7WteferefeteferefetefWrefetd7WreferefWrefetd7WrefetefW refetd7WrefetefWtefetefWrefetefWtefetefWrefetefWtefetefWrefe tefWtefetefWrefetefWtefetefWtefetefWtefetefWtefetefWtefetefW tefetefWtefetefWtefetefWtefetefWtefetefWtefetefWtefetefWtefe tefWrefetefWtefetd7WrefetefWrefetd7WrefetefWrefetd7Wrefetd7W referd7Wreferd7Wreferd7Wreferd7Wrefetd7WreferefWreferd7Wrefe refWreferd7WrefWrefWreferd7WrefWrefWreferd7WrefWrefWreferd7W refWrd7WrefWrd7WrefWrd7WrefWrd7WpefWrd7WrefWrd7WrefWrd7WrefW rd7WpefWrd7WrefWrd7WpefWrd7WrefWrd7WpefWrd7WrefWrd7WpefWrd7W refWrd7WpefWrd7WrefWrd7WpefWrd7WrefWrd7WpefWrd7WrefWrd7WpefW rd7WrefWrd7WpefWrd7WpefWrd7WpefWrd7WpefWrd7WpefWrd7WpefWrd7W pefWrd7WpefWrd7WpefWrd7WpefWrd7WpefWrd7WpefWrd7WpefWrd7WpefW rd7WpefWrd7WpefWrd7WpefWrd7WrefWrd7WrefWrd7WrefWrd7WrefWrd7W pefWrd7WpefWrd7WpefWrd7WpefWrd7WpefWrd7WpefWrd7WpefWrd7WpefW rd7WrefWrd7WpefWrd7WrefWrd7WpefWrd7WrefWrd7WrefWrd7WrefWrd7W refWrd7WrefWrd7WpefWrd7WrefWrd7WpefWrd7WrefWrd7WpefWrd7WrefW rd7WpefWrd7WrefWrd7WpefWrd7WrefWrd7WpefWrd7WrefWrd7WpefWrd7W refWrd7WpefWrd7WrefWrd7WpefWrd7WrefWrd7WpefWrd7WrefWrd7WpefW rd7WrefWrd7WpefWrd7WrQDn3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn 1q3n3rXn1q3n3rXn1q3n3rXn1q3v1r3e1rXn3rXv3q3/zpz/zoz/xnv/1oT/ 56X/763/98b//9b//+///////////////////97G3q3v1q2157W1/97n///n ///n///W///G//+1//et/++c/96U/9aE/717/7Vz75yE56W93r331sbe1q3G 563e1rXv1rXe3rX////////v3s7v3q3v3q3n1rXv1rX//+/////////////n 3r3e1q3e3q3v3q3e1q3//////////97n3rXn3r3W1qXe1rXn1q3v3q3n1qXn 3rXW1q3n3rXv1rXe56Xe3q3n1rXn1q3v3rXv3q3n1q3v1r333q3n1qXn3q3e 1qXe3q3e1qXn3q3n1qX////////v3s7ezq3e1q3e3qXn3qXn1qXe3qXn563n 3q3e1qXn3q3n3rXv3rXn1q333q3n1q3e1q3n3rXv3q3n1qX357XWzq3v3q3n 3qXn3q3n3rXe1q3v57Xn1qXn1q333q3vzq3v1rXn1q3n3q3n3qXn1qXv3rXn 3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3//+f////////e1rXn3q3n1q3n3rXe 1q3v1q3v57Xn3rXezrXv1q3v3q3n3q3W1rXe1q3v3rXv1rXn1q3n1q3v3rXv 3rXezq3e1rXn1q3v563n1qXv3q3nzq3v3q3n1pzn1rXn1q3n3q3e1qXn3q3n 3q3n1q3n1q3v3r3n1rXn3q3n573////v58bn56Xe1qXv1rXn1qXv3rXn1q3v 3rX//+/////n3rXv563e1qXv3r3e1rXn3rXWzqXe3rXWzrXv573n3rXv573v 3q3/563n1qXn3r3///////fn3rXv3q3357Xn3rXe1rXv573v3q3n3r3v3r3n 1rXn1q33573n3rXn3rXe1q3n3rXn1rXv3r3v3r3v573n3q33573v1sbv3q3v 3q3v3q3n1q3n1rXnzrX358bn3q3v3rXe3rXe3r3e1rX3573e1q3////////v 3rXv3rXv573v3rXv573n3rXn3rXe1q3v3rX////////////v787WzqXn563e 1qXn3q3n3q3e1rX//+/////n3rXn3q3n3q3v1qXv1q3v3rXWzqXn3rXv3rXn zq333rXn563e1q3n1rXn3q3n3rXezq3n1rXn3q333r3ezqXv573e1qXv3rXn 1q3n1q3n1qXv1rXn1q3v3q3Wzpzv3q3n1qXv3rXv1q3v3q3W1qX///f////n 1q3n1qXv1rXezqXv3q3e1qXn1rXezq3v3r3ezqXv3rXe1qXv3q3e1q3//+f/ ///v3r3ezqXn1q3n3rXn3rX///////fOzrXn3q3n3qXn3qXe3qXn3q3n3q3v 3rXn1q3n1q3v3rXn1q3n1q3v3q3n1q3357XW1pze3q3e3q3n3rXe1q3v3rXn 3q3n3rXn1q3n3rXn1q3n3q3n1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3v 3rXn1rXn3rXn1rXv3rXn1rXn3rXn1rXv3rXn1rXn3rXn1rXv3rXn1rXn3rXn 1rXv3rXn3rXv3rXn3rXv3rXn3rXv3rXn3rXv3rXn3rXv3rXn1rXv3rXn3rXv 3rXn1rXv3rXn3rXv3rXn3rXv3rXn3rXv3rXn3rXv3rXn3rXv3rXn1rXv3rXn 1rXn3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3rXn1q3n3q3n1q3n 3rXn1q3n3q3n1q3n3rXn1q3n3rXn1q3n3rXn1q3n3q3n1q3n3q3n1q3n3q3n 1q3n3q3n1q3n3q3n1q3n3q3n1q3n3q3n1q3n3q3n1q3n3q3n1q3n1q3e1q3n 1q3e1q3n1q3e1q3n1q3e1qXn3q3e1q3n1q3e1q3n1q3e1q3n1q3e1qXn1q3e 1q3n1q3e1q3n1q3e1q3n1q3e1q3n1q3e1q3n1q3e1qXn1q3e1q3n1q3e1qXn 1q3e1q3n1q3e1qXn1q3e1q3n1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e 1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn 1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3n1qXn1q3n1qXn1q3n 1q3n1q3n1qXn1q3e1q3n1q3e1q3n1q3e1q3n1q3e1q3n1q3e1qXn1q3e1qXn 1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e 1qXn1q3e1qXn1q3e1qXn1q3e1q3n1q3e1q3n1q3e1q3n1q3e1q3n1q3e1qXn 1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e 1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn 1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e1qXn1q3e 1qXn1q0A3tat59at59at59at3tat59at59at59at3tat59at59at59at3tat 59at59at59at3ta13tat3tal3t6t3s6159a179al996l99al/+e1/++9///O ///W///n///n///n1tat98bG787n1t6txu+97///9///vf//zv//zv//vf// vf/3pf/nlP/ehP/Oe//Gc++tc+elc9aMreetztat59a1586t596tztal//fe ////////59a1596t3s6l59a159at5969////////////1s611tal596l1s6l 3ta1///n////////3ta91sat9+/O9+/e1s6t3tat5+et1tac59al59at79a1 3tat59at59at59at3tat59at59at59at3tal59at59at59at3tal59at59at 59at////////3ta9586t59al59al3tal3t6t3tal59at59al59at3tal59at 59al59at59al59at59at596t59al59at59at596t3tal59at59al59at3tal 59at59al59at3tal59at59al59at3tal59at59al59at3tal59at59al59at 3tal59at59al59at9+/e////////3s613s6t59at796t796t59al3s6l3ta9 //fe597G1s6t596159al3tal59at59al59at3tal59at59al59at59al59at 59at596t59al59at59at596t3tal59at3tal59at3tal59at59at59at3s6l 59at1s6t797O////7+fG3tat3tat59al59at3tal59611s6l///n////1s61 3tal59at59at59at3tal59at59at59at3tat59at59a1796159613tat7+e9 ///////W7+e93s6t59a159at596159at596159at596159at596159at5961 5961796159at596159a1796159a1596159a179617969796959at59a13tat 59a159at59613tat3ta1///359a91s613ta1////////59at596159at7961 59a1796159617969zs61///////////n3ta13tat59a159at79al59at3s61 ///v////3ta1586t796t3tat59at59at59at3tat59at59at59at3tal59at 59at59at3tal59at59at59at3tal59at59al59at3tal59at59al59at3tal 59at3tal59at3tal59at3tal59at79at3s6t///e////1ta93ta159at59al 3tal59at59at59at3tal59at3tal59at3tat3tat///W////3tat3tat59at 59at59at///////e59at1s6l59a159at3tat3tal59at59at59at3tal59at 59at59at3tal59at59at59at3tal59at59at59at59at59a159at59a159at 59at59at596159at59at59at59at59at59at59at59at59at59at59at59at 59at59at59at59at3tat59at59at59613tat59at59at596159at596159at 596159at596159at596159at596159at596159at596159at596159at5961 59at596159at596159at596159at59at59at59at59at59at59at59at3tal 59at59at59at3tal59at59at59at59at59at59at59at3tal59at59at59at 3tal59at59at59at3tal59at3tal59at3s6l59at3tal59at3s6l59at3tal 59at3tal59at3tal59at3s6l59at3s6l59at59al59at59at59at59al59at 59al59at3s6l59at3s6l59at3s6l59at3s6l59at3s6l59al3s6l59at3s6l 59al3s6l59at3s6l59al3s6l59al3s6l59al3s6l59al3s6l59at3s6l59at 3s6l59at3s6l59at3s6l59at3s6l59at3s6l59at3s6l59at3s6l59at3s6l 59at3s6l59at3s6l59at3s6l59at3s6l59at3s6l59at3s6l59at3s6l59al 3s6l59al3s6l59al3s6l59al3s6l59al3s6l59al3s6l59al3s6l59al3s6l 59at3s6l59at3s6l59at3s6l59at3s6l59at59al59at3s6l59at59al59at 3s6l59at59al59at3s6l59at59al59at3s6l59al3s6l59al3s6l59al3s6l 59al3s6l59al3s6l59al3s6l59al3s6l59al3s6l59at59al59at3s6l59at 59al59at3s6l59at59al59at3s6l59at59al59at3s6l59al3s6l59at3s6l 59al3s6l59at3s6l59at59al59at3s6l59at59al59at3s6l59at59al59at 3s6l59at59al59at3s6l59at3s6l59at3s6l59at3s6l59at3s6lAOfWrefW refWrefWrefWrefWrefWrefWrefWrefWrefWrefWrefWrefWrefWrefWrefW td7Ord7Wrd7WrdbWvcbGxsbG1sbOxufepe/erf/nvf/evf/eve/etd7etcbO pcbW1oTn54z3/87ext7etdb//+f//8b//9b//8b//8b//7X/76X/55T/1oz/ znv3xnvvtXPnnHvWjKXenM7erd7Ore/WtefWrd7erf//9///////997OpefW peferefOrefWrd7Wtf///////////97WtefWrefWpeferdbOpffnzv////// /97Ovefevf/////////31t7erd7WpefepefWpefWrefOrefWrd7WrefWrefW refWrd7WrefWrefWrefWrefWrefWrefWrefWrefWrefWrefWrf///////+fe xt7Ore/erefWpeferd7WrefWrd7WpefWrefWpefWrd7WpefWrefWpefWrefW peferefWrefWrefWpeferefWrefWrefWpeferefWrefWrefWpeferefWrefW refWpeferefWrefWrefWpeferefWrefWrefWpeferefWrefWrefWpeferefW rf//5///////9+fWtefetd7WpefWrefWpe/erd7Wrf//5////////97Wtd7W re/erefWrd7WpefWrefWpefWrd7WpefWrefWpefWrefWpeferefWrefWrefW peferefWrefWrd7WpefWrefWrefWrefWrefWrefWreferefWrefevffnzv// //fnxufetd7WpefWrefWpefWrefWrd7Wtf//3v///97WtefWrefWrefWrefW refWrefWrefWrefWrd7WrefWre/nvefete/evd7Wtd7Wre/nve/nvd7WrefW tefete/etefWre/etefetefetefWrefetefWrefetefWre/etefetefetefW refetefWtefetefWte/etefWte/etefete/nvefetefetd7WrefWtefWrefe rf//3v//////5+fevdbOrf///////+fetefWrefetefWtefetefWte/etefe te/nzv///////+fevd7Wtd7OpefWrefWre/WrefOrefWvf//5////+fWvefW te/WrefWrefWrefWtefWrefWrefWrefWtefWrefWrefWrefWrefWrefWrefW refWrefWrefWrefWpeferefWrefWrefWpeferefWrefWrd7WpefWrefWrefW rd7WpefWrefWrefWrd7Opf//7////9bOtdbGpeferefOnOfWrefWrefWrefW refWrd7WpefWrefWrefWrd7Opd7WrffnvdbOpd7Wrd7Wrd7Wrd7Ore/evefW rd7OpefWtdbOpd7WrefWtefWrd7WpefWrefWrefWrd7WpefWrefWrefWrefW refWrefWrefWrefWrefWrefWrefWrefWrefetefWrefWrefWrefWrefWrefW refWrefWrefWrefWrefWrefWrefWrefWrefWrefWtefWrefWrefWrefWtefW refWrd7WrefetefWrefWrefWrefetefWrefetefWrefetefWrefetefWrefe tefWrefetefWrefetefWrefetefWrefetefWrefetefWrefetefWrefetefW refetefWrefWrefWrefWtefWrefWrefWrefWtefWrefWrefWrefWrefWrefW refWrefWrefWrefWrefWrefWrefWrefWrd7WpefWrefWrefWrefWrefWrefW refWrd7WpefWrefWrefWrd7WpefWrd7WpefWrd7WpefWrd7WpefWrd7WpefW rd7WpefWrd7WpefWrd7WpefWrefWpefWrefWpefWrefWpefWrefWpefWrd7O pefWrd7WpefWrd7OpefWrd7WpefWpd7OpefWrd7OpefWpd7OpefWrd7OpefW pd7OpefWrd7OpefWpd7OpefWrd7OpefWrd7OpefWrd7OpefWrd7OpefWrd7O pefWrd7OpefWrd7OpefWrd7OpefWrd7OpefWrd7OpefWrd7OpefWrd7OpefW rd7OpefWrd7OpefWrd7OpefWrd7OpefWrd7OpefWpd7OpefWpd7OpefWpd7O pefWpd7OpefWpd7OpefWpd7OpefWpd7OpefWrd7OpefWrd7OpefWrd7OpefW rd7OpefWrd7OpefWrd7OpefWrefWpefWrd7OpefWrefWpefWrd7OpefWrefW pefWrd7OpefWrefWpefWpd7OpefWrd7OpefWpd7OpefWrd7OpefWpd7OpefW rd7OpefWpd7OpefWrd7OpefWrd7OpefWrefWpefWrd7OpefWrefWpefWrd7O pefWrefWpefWrd7OpefWrefWpefWpd7OpefWrd7OpefWpd7OpefWrd7OpefW rd7OpefWrefWpefWrd7OpefWrefWpefWrd7OpefWrefWpefWrd7OpefWrefW pefWrd7OpefWrefWpefWrd7OpefWrefWpefWrQDezq3n1q3ezqXn1q3ezq3n 1q3ezqXn1q3ezq3n1q3ezqXn1q3ezq3n1q3ezqXn1q3e1qXezrXezq3e1q3G xrWtteeMrfeEtf+9te/OxufWzsbW1q3O1qW91r2lxtacxu+E7/9C//9C//+9 5+fWxqXG/+fO///O///G///G//+1//et/++c/96U/9aE98Z7971z56Vz55xz 1oSU1ozG3qXe1q3ezqXn1q3Wzpz3787/9+fn3sbWxpzn1qXezqXn1q3nzq3e zqX3787/99bn3r3WzqXezqXv1q3WzqXn1q3WzqX//+f//97ezq3WzqX//+// ///3787WzqXe1qXe1qXn1qXezqXezq3ezqXe1q3ezqXezq3ezqXe1q3ezqXe zq3ezqXn1q3ezqXe1qXezqXn1q3ezqXe1qX////////v3r3n1q3ezpzezqXe zqXe1q3ezqXn1qXezqXe1qXezqXn1qXezqXe1qXezqXn1qXezqXe1qXezqXn 1qXezqXe1qXe1qXn1q3ezqXn1qXe1qXn1q3ezqXn1qXe1qXn1q3ezqXn1qXe 1qXn1q3ezqXn1qXezqXn1qXezqXe1qXezqXn1qXezqXe1qXn3rX//97v573e zq3e1q3e1qXezqXn1q3nzqXezqX/787///////fe1rXWxpzn1qXezqXn1qXe zqXe1qXezqXn1qXezqXe1qXezqXn1qXezqXe1qXezqXn1qXezqXe1qXezqXn 1q3ezqXn1q3ezqXn1q3ezqXn1q3e1qXe1qXezqXn1rX//97n1rXezqXe1qXn 1qXn1qXezqXe1q3WzqX378b//97Wzq3ezqXn1q3ezqXn1q3ezqXn1q3ezqXn 1q3ezqXn1q3ezqXe1q3n3rXv573e1q3e1q3ezq3e1q3n1q3n3rXn1q3n1q3e 1q3n1q3e1q3n1q3e1q3n1q3e1q3n1q3e1q3n1q3e1q3n1rXe1q3n1q3e1q3n 1rXe1q3n1rXe1q3n3rXn3rXv3rXn1rXn1q3ezqXe1q3e1qXv573/997e1rXW zqXn3rX///f////e1q3n1q3e1q3n1q3e1q3n1q3e1q3n1q3WzrX//97v58be 1rXn3r3n3rXezq3n1q3n1qXn1q3Wzq3v587/997e1rXezqXn1q3ezq3n1q3e zqXn1q3ezq3n1q3ezq3n1q3ezqXn1q3ezqXn1q3ezqXn1q3ezqXn1q3e1qXn 1q3e1qXn1q3e1qXn1q3e1qXn1q3ezqXn1q3ezqXn1q3ezqXn1q3ezqXn1q3e zqXn1rX//97////e1rXe1rXn1q3n1qXe1qXn1q3ezqXn1q3ezqXn1q3ezqXe 1qXezqXn1q3WxpzWzqXezqXn3rXezqXn1q3ezq3e1q3Wxpze1q3e1q3ezqXe zq3e1q3ezqXe1qXezqXe1qXezqXe1qXezqXe1qXezqXn1q3ezqXe1qXezqXn 1q3ezqXe1qXezqXn1q3ezq3n1q3ezq3n1q3ezqXn1q3ezqXn1q3ezqXn1q3e zqXn1q3ezqXn1q3e1q3n1q3ezq3n1q3e1q3n1q3ezq3n1q3ezqXe1q3ezqXe 1q3e1q3n1q3e1q3n1q3e1q3n1q3e1q3n1q3e1q3n1q3e1q3n1q3e1q3n1q3e zqXe1q3e1q3n1q3ezqXe1q3e1q3n1q3ezqXe1q3e1q3n1q3ezqXe1q3e1q3n 1q3ezq3n1q3e1q3n1q3ezq3n1q3e1qXn1q3ezqXn1q3e1qXn1q3ezqXn1q3e zqXn1q3ezqXe1qXezqXn1q3ezqXe1qXe1qXn1q3ezqXn1q3ezqXn1q3ezqXe 1qXezqXn1q3ezqXe1qXezqXn1q3ezqXe1qXezqXn1q3ezqXe1qXezqXe1qXe zqXe1qXezqXn1qXezqXezqXezqXn1qXezqXezqXezqXe1qXezqXe1qXezqXe 1qXezqXe1qXezpzezqXezpzezqXezpzezqXezpzezqXezqXezqXezpzezqXe zqXezqXezpzezqXezqXezqXezpzezqXezqXezqXezpzezqXezqXezqXezpze zqXezqXezqXezpzezqXezqXezqXezpzezqXezqXezqXezpzezqXezqXezqXe zpzezqXezqXezqXezpzezqXezpzezqXezpzezqXezpzezqXezpzezqXezpze zqXezpzezqXezqXezqXezqXezqXezqXezqXWzpzezqXezqXezqXWzpzezqXe zqXezqXezqXezqXezqXezqXezqXezqXezqXezqXezqXezqXezqXezqXezqXe zqXezqXezqXezqXezqXezqXezqXezqXezqXezqXn1qXezqXezqXezqXn1qXe zqXezqXezqXezqXezpzezqXezqXezqXezpzezqXezqXezqXezqXezqXezqXe zqXezqXezqXezpzezqXezpzezqXezpzezqXezpzezqXezqXezqXezpzezqXe zqXezqXezpzezqXezqXezqXezpzezqXezqXezqXezpzezqXezqXezqXezqXe zqXezqXezqXezqXezqXezpwA59at3s6l59at3s6l59at3s6l59at3s6l59at 3s6l59at3s6l59at3s6l59at3s6l3tal3s6158613taczs61pa3ne6X/WqX/ Wsb/Y8b/a87/Y8b/Y87/Wt7/Wv//Uv//Sv//Qv//Qv//nPf/1s6txu/Ozv// zv//xv//vf//tf/3pf/nnP/ejP/OhP/Ge/e1e+elc96Ue96EhMZ7vd6lztat 3tat586l3tal3s6t3s6t3s6t596t3tac3tal3s6l79at3sal59at3tal3s6l 3s6l586l586l3s6c596t3s6l1s6l3s6t3s6t3tal3tal59691sal3tal3tal 3tal59al59at3s6l59al3s6l59al3s6l59al3s6l59al3s6l59at3s6l59at 3s6l59at3s6l59at3s6lzs6t59693s6l586l79at59at586t3s6t59al3s6l 59al3s6l59al3s6l59al3s6l59al3s6l59al3s6l59al3s6l59al3s6l59at 3s6l59al3s6l59at3s6l59al3s6l59at3s6l59al3s6l59at3s6l59al3s6l 59at3s6l59al3s6l59at3s6l59al3s6l3tal3tal3tat1s6c59al59al59at 59at59at3s6l3s6t3ta13ta11s6l796t3s6l59al3s6l59al3s6l59al3s6l 59al3s6l59al3s6l59al3s6l59al3s6l59al3s6l59at3s6l59at3s6l59at 3s6l59at3s6l596t3s6l3s6l1sal79613s6l3tal59al59at3s6l59al3s6l 3s6l3s6t5961zsac59at3s6l59at3s6l59at3s6l59at3s6l59at3s6l3s6l 3s6l59at59at79615961796159at59a159at59at59at59at3s6l59at59at 59at3tat59at59at59at3tat59a159at59at59at59a159at59a159at59a1 59at59a159a1796959a159at3s6l596l3s6l59a13s6t3tat3tal59613ta1 59at59at59at3s6t59at59at59at3s6t3ta13ta13ta159a1796159a17969 59at796159at3s6t3s6t3ta11s6l3s6l586l59at3s6l59at3s6l59at586t 59at3s6l59at3s6l59at3s6l59at3s6l59at3s6l59at59al59at3s6l59at 59al59at3s6l59at3s6l59at3s6l59at3s6l59at3s6l586l3s6l3tat7969 1s6t3s6t3s6c3s6c59at59al59at3s6l59at3s6l59at3s6l3s6l3s6l59at 3s6l59at3s6l59at3s6l3s6l59at59at3s6l3s6t3s6l59613s6l59at3s6l 59al3s6l59at3s6l59al3s6l59at3s6l59at3s6l59at3s6l59at3s6l59at 3s6l59at59at59at59at59at3s6l59at3s6l59at3s6l59at3s6l59at3s6l 59at59at59at586t59at59at59at586t59at3s6t59at3s6l59at3tat59at 3s6t59at59at59at3tat59at59at59at3tat59at3tat59at3s6t59at3tat 59at3s6t59at3tat59at3s6t59at3tat59at3s6t59at59at59at586t59at 59at59at586t59at59al59at3s6l59at59al59at3s6l59at3s6l59at3s6l 59at3s6l59al3s6l59at59al59at3s6l59at3s6l59at3s6l59at3s6l59al 3s6l59at3s6l59al3s6l59at3s6l59al3s6l59al3s6l59al3s6l59al3s6l 586l3s6l586l3s6l586l3s6l59al3s6l59al3s6l59al3s6l59al3s6l3s6l 3s6c3s6l3s6c3s6l3s6c3s6l3s6c586l3s6l3s6l3s6c586l3s6l3s6l3s6c 586l3s6l3s6l3s6l586l3s6l3s6l3s6l586l3s6l3s6l3s6l586l3s6l3s6l 3s6l586l3s6l3s6l3s6l586l3s6l3s6l3s6l586l3s6l3s6l3s6l586l3s6l 3s6l3s6l586l3s6l3s6l3s6c586l3s6l3s6l3s6c586l3s6l3s6l3s6c586l 3s6l586l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l586l3s6l3s6l3s6l 586l3s6l3s6l3s6l586l3s6l3s6l3s6l586l3s6l3s6l3s6l586l3s6l3s6l 3s6l586l3s6l3s6l3s6l59al3s6l586l3s6l59al3s6l586l3s6l586l3s6l 3s6l3s6c586l3s6l3s6l3s6c586l3s6l3s6l3s6l586l3s6l3s6l3s6l586l 3s6l3s6l3s6c586l3s6l3s6l3s6c586l3s6l3s6l3s6c586l3s6l3s6l3s6c 586l3s6l3s6l3s6c586l3s6l3s6l3s6c586l3s6l586l3s6l586l3s6l586l 3s6l3s6lAN7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7O pd7Opd7Opd7OpdbOnN7OrefOpe/WnN7GpbW11nuc/1qc/1q1/2vO/2Pe/2Pv /1Lv/1r//1r//2P//zn//1L//0L//3v//9bOtd7etbX//87//73/97X/96X/ 55z/54z/1oz/zoT3vXv3tXvenHvejHvWe3vGa6XWlM7erdbOpefOpdbGnN7O rd7Opd7Opd7OnN7WnOfWpd7Gpd7GpefOpd7OnOfWpd7OnOfWrd7OnOfOpd7O nN7Wpd7OnOfWrd7Gpd7Opd7OpefWpdbGpd7Opd7Wpd7WpdbGlOfWpd7Opd7O pd7OnN7Opd7Opd7Opd7OnN7Opd7Opd7Opd7Opd7Opd7OpefWpd7Opd7Opd7O pefWpdbOpefWrd7OpefOpd7GnN7Opd7OpefWrd7Opd7Opd7OpefWpd7Opd7O pd7OpefWpd7OnN7Opd7Opd7Opd7OnN7Opd7Opd7Opd7OnN7Opd7Opd7Opd7O nN7Opd7Opd7Opd7OnN7Opd7Opd7Opd7OnN7Opd7Opd7Opd7Opd7Opd7OpefW pd7Opd7Opd7OpefWpd7Wpd7OnN7Wpd7Wpd7OnOfWpd7OnN7Opd7Opd7Opd7O pd7OrdbGnN7OpefWpefOpd7Opd7Opd7OpefWpd7Opd7Opd7OpefWpd7OnN7O pd7Opd7Opd7OnN7Opd7Opd7Opd7OnN7Opd7Opd7Opd7Opd7Opd7OpefWpd7O nN7Opd7WpefWrdbGnN7Wpd7OnN7Wpd7Opd7Opd7OpefWrd7Opd7OpdbOpd7W rd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7OnOfWrdbOpd7Opd7O pefWtefWrefWtd7Ord7Ord7OrefWrd7WrefWrd7OpefWrd7OrefWrd7OpefW rd7OpefWrd7OrefWrd7OrefWrd7OrefWrd7OrefWrd7OrefWrd7OrefWtefW re/etefWrefWrd7OnN7OpdbGpefWrd7Wpd7WnN7OpefWtd7Opd7Ord7OpefW rd7OpefWrd7OrefWrd7Wrd7Ord7OpefWtd7Opd7OrefWtefWtefWre/etefW refWtdbGpefWrd7OpefOpd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7O pd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7OpefWpd7Opd7Opd7OpefWpd7O pd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7OpefWrc69nNbOpdbGnOfWrd7OpefW pd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7OpdbOnN7Opd7OpdbOnN7Opd7O pdbOnNbGnN7Opd7Opd7Wrd7Opd7Opd7OpefWrd7Opd7Opd7Opd7Opd7Opd7O pd7Opd7Opd7Opd7Opd7OpefWpd7Opd7Opd7OpefWpd7Opd7Opd7OpefWrd7O pefWrd7OpefOrd7Opd7Opd7OpefWpd7Opd7Opd7OpefWpd7Opd7Opd7OpefO rd7Opd7Opd7OpefOrd7Opd7Ord7OpefWrd7Opd7Wrd7OpefWrd7Opd7Wrd7O pefWrd7Opd7Wrd7OpefWrd7Opd7Wrd7OpefWrd7Opd7Wrd7OpefWrd7Opd7W rd7OpefWrd7Opd7Wrd7OpefWrd7Opd7Opd7OpefOrd7Opd7Opd7OpefOrd7O pd7Opd7OpefWpd7Opd7Opd7OpefWpd7Opd7Opd7OpefWpd7Opd7Opd7Opd7O pd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7OnN7Opd7Opd7Opd7OnN7Opd7O pd7Opd7OnN7Opd7Opd7Opd7OnN7Opd7OnN7Opd7OnN7Opd7Opd7Opd7GnN7O pd7OnN7Opd7OnN7Opd7OnN7Opd7OnN7Opd7OnN7OpdbGnN7OnN7GnN7OpdbG nN7OnN7GnN7OpdbGnN7OnN7GnN7OpdbGnN7OnN7GnN7Opd7GnN7Opd7GnN7O pd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7G nN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7O pd7OnN7Opd7GnN7Opd7OnN7OpdbGnN7OnN7GnN7OpdbGnN7Opd7OnN7OpdbG nN7Opd7OnN7OpdbGnN7Opd7OnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7O pd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7OpdbGnN7Opd7GnN7OpdbGnN7Opd7G nN7Opd7GnN7Opd7OnN7Opd7GnN7Opd7OnN7Opd7GnN7Opd7OnN7Opd7GnN7O pd7OnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7OnN7Opd7G nN7Opd7OnN7Opd7GnN7Opd7OnN7Opd7GnN7Opd7OnN7Opd7GnN7Opd7OnN7O pd7GnN7Opd7OnN7Opd7GnN7Opd7OnN7Opd7GnN7Opd7OnN7Opd7GnADezqXe zpzezqXezpzezqXezpzezqXezpzezqXezpzezqXezpzezqXezpzezqXezpze zqXezqXn1qXvzpznzqXGvb2UrfdrlP9rrf9rvf9r3v9a5/9S9/9S9/9j//9a //9a//9j//9K//9j///n1tbvzqWt/+e9//+1//et/++l/+eU/9aM/86E972E 97V776173pxz1oR71ntrvWOU1oS93qXW1q3nzqXezpzezqXezqXezpzezpze zpzn1q3WxpznzqXnzqXnzqXexpTezpzezpznzqXezqXezqXezpzezpzezqXn zqXWxpzezpzezqXn1q3ezqXn1qXezqXezqXezqXezqXezqXezqXezpznzqXe zqXezqXezpznzqXezqXnzqXezqXnzqXezqXnzqXezqXnzqXezqXn1qXezpzn zqXezqXnzqXezqXnzqXexqXnzqXezqXn1qXezqXnzqXezqXn1qXezqXnzqXe zqXn1qXezqXnzqXezqXn1qXezqXezqXezpznzqXezqXezqXezpznzqXezqXe zqXezpznzqXezqXezqXezpznzqXezqXnzqXezqXn1qXezqXnzqXezqXn1qXe zqXezqXWxpTn1qXezpzezpzezqXn1qXezpzezqXezpzn1qXn1qXn1q3ezqXe zqXezpznzqXezqXn1qXezqXnzqXezqXn1qXezqXnzqXezqXn1qXezqXnzqXe zqXn1qXezqXezqXezpzezqXezqXezqXezqXnzqXezqXezqXWxpzn1q3n1qXW xpzezqXezqXezpzezqXezqXezqXezqXn1qXezqXezqXn1qXezqXezqXnzqXe zqXezqXezqXnzqXezqXezpzezpzezqXezqXezqXezqXn1q3ezqXn1q3n1q3v 1rXn1q3n1q3n1q3n1q3n1q3n1q3nzq3n1q3n1q3n1q3ezqXn1q3nzq3n1q3n zq3n1q3nzq3n1q3nzq3n1q3n1q3n1q3nzq3n1rXn1q3n1q3n1q3v3rXv3rXv 3q3nzq3ezq3ezqXn3q3n1qXe1qXexqXnzq3ezqXn1q3nzq3n1q3nzq3n1q3n zq3ezqXezqXn1q3nzq3n3rXn1q3n1q3ezq3n1q3n1q3v3rXn1q3n1q3n1q3n 1q3nzq3nzq3ezqXnzq3ezqXezqXexqXezqXexqXezqXezqXnzqXezqXezqXe zqXnzqXezqXnzqXezqXn1qXezqXnzqXezqXn1qXezqXezqXezqXnzqXezqXe zqXezqXnzqXezqXezqXWxpzn1qXezqXezqXezqXn1qXWzpznzqXezqXnzqXe zqXezqXezpzezqXezqXn1q3ezqXezqXezpzn1qXezpzezqXezqXezqXezqXe zqXezqXn1q3ezqXezqXezqXezqXezqXnzqXezqXezqXezqXnzqXezqXnzqXe zqXnzqXezqXnzqXezqXnzqXezqXnzqXezqXnzq3ezqXn1q3ezqXn1q3ezqXn zqXezqXn1qXezqXnzqXezqXn1qXezqXnzqXezqXnzq3ezqXnzqXezqXnzq3e zqXn1q3ezqXn1q3ezqXn1q3ezqXn1q3ezqXn1q3ezqXn1q3ezqXn1q3ezqXn 1q3ezqXn1q3ezqXn1q3ezqXn1q3ezqXn1q3ezqXn1q3ezqXn1q3ezqXn1q3e zqXn1q3ezqXnzqXezqXnzq3ezqXnzqXezqXnzq3ezqXnzqXezqXnzqXezqXn zqXezqXnzqXezqXnzqXezqXnzqXezqXnzqXezqXnzqXezqXnzqXezqXnzqXe zqXezqXezpzezqXezqXezqXezqXnzqXezqXezqXezqXnzqXezqXezqXezpze zqXezpzezqXexpzezqXezpzezqXezqXnzqXezqXezqXezpzezqXezpzezqXe xpzezqXezpzezqXexpzezqXezpzezqXexpzezqXezpzezqXexpzezqXezpze zpzWxpzezqXexpzezpzWxpzezqXexpzezqXexpzezqXexpzezqXexpzezqXe xpzezqXexpzezqXexpzezqXexpzezqXexpzezqXexpzezqXexpzezqXexpze zqXexpzezqXexpzezqXexpzezqXexpzezqXexpzezqXezpzezqXezpzezqXe zpzezqXezpzezpzWxpzezqXexpzezqXexpzezqXezpzezqXexpzezqXexpze zqXexpzezqXexpzezqXexpzezqXezpzezqXexpzezqXezpzezqXexpzezqXe zpzezqXexpzezqXezpzezqXexpzezqXexpzezqXexpzezqXexpzezqXexpze zqXezpzezqXexpzezqXezpzezqXezpzezqXezpzezqXezpzezqXezpzezqXe xpzezqXezpzezqXexpzezqXezpzezqXezpzezqXezpzezqXezpzezqXezpze zqXezpzezqXezpzezqXezpzezqXezpzezqXezpzezqXezpzezqXezpzezqXe zpzezqXexpzezqXezpzezqXexpzezqXezpzezqUA3sac3s6l1sac3s6c3sac 3s6l1sac3s6c3sac3s6l1sac3s6c3sac3s6l1sac3s6c3sac3s6c1s6U586l 3saczs6tnK3Wc5T/WqX/Y73/Wsb/Wt7/Uuf/Wvf/Wvf/Wv//Y///a///Uv// Wv//td7v586lte/Gtf/3pf/npf/njP/WjP/Oe//Ge/e9c+ele+ele9aMe9Z7 c85ra71ae71rvd6lzsac58al586t586l3sac586l3s6c3sac1sal3sal1sac 3s6c3s6c3sac3s6l3sal1sac3s6l1saU3s6l1sac1saU1sac59al3sal3sal 1saU3sac1saU3s6l3s6l3s6c1sac3s6l3sac3s6l1sac3s6c3sac3s6l1sac 3s6c3sac3s6l3sac3s6l3sac3s6l3sac3s6l3s6c3sac3sac3s6l3s6l3s6c 3s6c3s6c3s6c3s6l3sac3s6l3s6c3s6l3sac3s6l3s6c3s6l3sac3s6l3s6c 3s6l3sac3s6l3sac3s6l1sac3s6c3sac3s6l1sac3s6c3sac3s6l1sac3s6c 3sac3s6l1sac3s6c3s6c3s6l3sac3s6l3s6c3s6l3sac3s6l3sac3s6l3s6l 3s6l3sac3s6l3s6c3s6l3s6l3s6l1sac3sac3sac59al3s6c3s6l3s6c3s6l 3sac3s6l3s6c3s6l3sac3s6l3s6c3s6l3sac3s6l3s6c3s6l3sac3s6l3sac 3s6l1sac3s6l3sac3s6l3sac3s6l3s6l3s6l3sac586l1sac586l3sal3s6l 1sac3s6l1sac3s6l1sac3s6l1sac3s6l3sac3s6l1sac3s6l3sac3s6l1sac 3s6l3s6c59at3sac3s6c3sac3s6l3s6l3sal3s6l59at586t59at59at586t 1sac586t3s6l59at3s6l586t3s6l586t3s6l3s6l3s6l586t3s6l586t3s6l 586t3s6l586t3s6l59at3s6t59at3s6l59at586t59a179at79a1586t3sal 3s6c59al3s6l586t3s6l586t3s6l586t3s6l586t3s6l3s6t3s6l59at3s6l 3s6l3s6l3tat1sal3s6t3s6l59at3s6l586l3s6l59at3s6l59at3s6l59at 3s6l3s6l3s6l3s6l1sac3sal3sac3s6l1sac3s6l3sac3s6l1sac3s6l3s6c 3s6l3s6c3s6l3s6c3s6l3s6c3s6l3sac3s6l3sac3s6l3sac3s6l3sac3s6l 3sal3s6l3s6l3s6c1saU3s6c3s6c3s6l3sac3s6l3sac3s6l3sac3s6l1sac 3s6l1saU3s6c1sac3s6l1sac3s6c1saU3s6l1sac3s6c1sac1sac1sac586l 3s6c1sac3sac3s6l1sac3s6l3sac3s6l1sac3s6l3sac3s6l3sac3s6l3sac 3s6l3sac3s6l3sal3s6l1sac3s6l3s6l586l3s6l3s6l3sac3s6l3sac3s6l 3sac3s6l3sac3s6l3sal3s6l3sal3s6l3sal3s6l3sal3s6l3s6l3s6l3s6l 3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l 3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3sal 3s6l3sal3s6l3sal3s6l3sal3s6l3sac3s6l3sac3s6l3sac3s6l3sac3s6l 3sac3s6l3sac3s6l3sac3s6l1sac3s6l3sac3s6l3sac3s6l3sac3s6l1sac 3s6l3sac3s6l1sac3s6l3sac3s6l1sac3s6l1sac3s6l1sac3s6c1sac3s6c 1sac3sac3sac3s6l3sac3s6c3sac3s6l3sac3s6c1sac3s6c1sac3sac1sac 3s6c1sac3sac1sac3s6c1sac3sac1sac3s6c1sac3sac1sac3s6c1sac3sac 1sac3s6c1sac3sac1sac3sac1sac3sac1sac3sac1sac3sac1sac3sac1sac 3sac1sac3sac1sac3sac1sac3sac1sac3sac1sac3sac1sac3sac1sac3sac 1sac3sac1sac3sac1sac3sac1sac3s6c1sac3sac1sac3s6c1sac3sac1sac 3s6c1sac3sac1sac3s6c1sac3s6c1sac3sac1sac3sac1sac3sac1sac3sac 3sac3s6c1sac3sac3sac3s6c1sac3sac3sac3s6c1sac3sac3sac3s6c1sac 3sac1sac3sac1sac3sac1sac3sac1sac3sac3sac3s6c1sac3s6c3sac3s6c 1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3sac3sac 3s6c1sac3sac3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c 3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac 3sac3sac3s6c1sac3sac1sacAN7Opd7OnN7Opd7GnN7Opd7OnN7Opd7GnN7O pd7OnN7Opd7GnN7Opd7OnN7Opd7GnO/Gpd7OjNbWnNbGrd7Orc7OnJy9znOU /2Ol/2ut/3O9/3PG/3PW/2ve/2Pv/1rn/0r3/1rn/2v3/0r//3vv/9bOpc7n ta3/763/55z/3oz/1oT/znv/xnvvtXvnpXPenHvelHPOe3vOa2O9UnO9a7Xe pc7OpefGnOfGpd7GnOfOnN7OnOfOpd7Gpd7Grd7Grd7OnNbGlN7Opda9nOfO rdbGnN7OpdbOnOfWrdbGnOfOpefOpefOpd7GnOfOpd7GpefWpefOnN7OnN7G nN7OpdbGnN7Opd7OnN7Opd7GnN7OnNbGnN7Opd7GnN7OnNbGnN7Opd7GnN7O pd7GnN7Opd7GnN7Opd7GnOfOpd7GnOfOpd7GnN7Opda9lOfOnN7OlN7Opd7O nN7Opd7GnN7Opd7OnN7Opd7GnN7Opd7OnN7Opd7GnN7Opd7OnN7Opd7GnN7O pd7OnN7Opd7GnN7Opd7OnN7Opd7GnN7Opd7OnN7Opd7GnN7Opd7OnN7Opd7G nN7Opd7OnN7Opd7GnN7Opd7OnN7Opd7GnN7Gpd7GpefOrd7GnN7OpdbGnN7O nN7OnN7Opd7OnOfOpd7OnOfOnN7GnNbGnNbGnN7Opd7OnN7Opd7GnN7Opd7O nN7Opd7GnN7Opd7OnN7Opd7GnN7Opd7OnN7Opd7GnN7Opd7GnN7Opd7GnN7O pd7OnN7Opd7GnOfOrd7Gpd7Gpd7Opd7Opd7Opd7Opd7Gpd7Opd7Opd7Opd7O pd7OnN7OpefOpd7OnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7OnN7Opd7G nN7GnOfOpd7GnN7Opd7Gpd7Ord7OpefOrd7Ore/Wtd7Opd7OpefOrefWrd7O pefWrd7OpefWrd7Opd7Opd7OpefOrd7Opd7Ord7OpefOrd7OpefOrd7OpefW rd7OpefOrd7OpefWrefWrefWrd7Ope/Wre/Wte/WvefOrefWrd7OnOfOpd7O refWrd7OrefOrd7OpefOrd7Opd7Ord7OpefWpd7Ope/WrefWrd7Opd7OpefW rd7Opd7Ord7OrefOpd7Ope/Wrd7OpefOrd7OrefWrefWrefWrd7OpefOrd7O pd7Opd7Gpd7Opd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7OnN7Opd7OnN7O pd7OnN7Opd7OnN7Opd7OnN7Opd7GnN7Opd7OnN7Opd7GnN7Opd7GnN7OnNbG lOfWpd7OnN7OnNbGnN7Opd7OnN7Opd7GnN7Opd7GnN7Opd7GnN7OpdbGnN7O nOfOpdbGnN7Opd7OpdbGlOfWpdbGnN7Opd7Opd7OpdbGnN7Opd7GnN7Opd7G nN7OpdbGnN7Opd7GnN7OpdbGnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7O pd7GnN7GpdbGnN7Opd7Opd7Opd7Gpd7Opd7GnN7Opd7GnN7Opd7GnN7Opd7G nN7Opd7Opd7Opd7Gpd7Opd7Opd7Opd7Gpd7Opd7Opd7Opd7Opd7Opd7Opd7O pd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7OpefOrd7Opd7Opd7OpefOrd7O pd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Opd7Gpd7O pd7Opd7Opd7Gpd7Opd7OnN7Opd7GnN7Opd7OnN7Opd7GnN7Opd7GnN7Opd7G nN7Opd7GnN7OpdbGnN7Opd7OnN7Opd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7O pd7GnN7Opd7GnN7Opd7GnN7Opd7GnN7OpdbGnN7Opd7GnN7OnNbGnN7Opd7G nN7Opd7GnN7Opd7GnN7OnN7GnN7OpdbGnN7OnNbGnN7OpdbGnN7OnNbGnN7O nNbGnN7GnNbGnN7OnNbGnN7GnNbGnN7OnN7GnN7OnNbGnN7OnN7GnN7OnNbG nN7GnNbGnN7GnNbGnN7GnNbGnN7GnNbGnN7GnNbGnN7GnNbGnN7GnNbGnN7G nNbGnN7GnNbGnN7GnNbGnN7GnNbGnN7GnNbGnN7GnNbGnN7GnNbGnN7GnNbG nN7GnNbGnN7OnN7GnN7OnNbGnN7OnN7GnN7OnNbGnN7OnN7GnN7OnNbGnN7O nN7GnN7OnN7GnN7GnNbGnN7GnNbGnN7GnNbGnN7GnNbGnN7OnN7GnN7GnNbG nN7OnN7GnN7GnNbGnN7OnN7GnN7GnNbGnN7OnN7GnN7GnNbGnN7OnN7GnN7G nNbGnN7OnN7GnN7GnNbGnN7OnN7GnN7OnN7GnN7OnN7GnN7OnN7GnN7OnN7G nN7OnNbGnN7OnN7GnN7OnNbGnN7OnN7GnN7GnNbGnN7OnN7GnN7GnNbGnN7O nN7GnN7OnN7GnN7OnN7GnN7OnN7GnN7OnN7GnN7OnNbGnN7OnN7GnN7OnNbG nN7OnN7GnN7OnNbGnN7OnN7GnN7OnNbGnN7OnN7GnN7GnNbGnN7OnN7GnN7G nNbGnN7OnADWxpTexpzWxpzexpzWxpTexpzWxpzexpzWxpTexpzWxpzexpzW xpTexpzWxpzexpzexqXezpTWxpTnxq3nvaXexqW1tb2MpfdrjP9zpf9rrf9r vf9jzv9j3v9j3v9j3v9j3v9j5/9j5/9S7/9j3v/O1sbexqWt/+eM/86M/857 971z971r761z76Vr3pRz1pRrxnt7xmt7xlJzvUprvUKc1nvO3q3exq3WxpTe xpzWxpzexpzWxpTexpzWxpzexpzWxpzezpzexpzezpzWxpzezpzexpzezpzW xpzezpzexpzezpzWxpzezpzexpzezpzWxpzezpzexpzezpzWxpzezpzexpze zpzWxpTexpzWxpzexpzWxpTexpzWxpzexpzWxpTexpzWxpzexpzWxpTexpzW xpzexpzWxpzexpzexpzezqXexpzezpzexpzezqXWxpzezpzexpzezpzWxpze zpzexpzezpzWxpzexpzWxpzezpzWxpzexpzWxpzezpzWxpzexpzexpzezpzW xpzexpzexpzezpzWxpzezpzexpzezpzWxpzezpzexpzezpzWxpzexpzWxpze zpzWxpzexpzWxpzezpzWxpzezpzexpzezpzWxpzezpzexpzezpzWxpzexpze xpzezpzWxpzexpzexpzezpzWxpzezpzexpzezpzWxpzezpzexpzezpzWxpze xpzWxpzezpzWxpzexpzWxpzezpzexpzezpzexpzezpzexpzezpzexpzezpzW xpzexpzexpzezpzWxpzexpzexpzezpzWxpzezpzexpzezpzWxpzezpzexpze zpzWxpzexpzWxpzezpzWxpzexpzWxpzezpzWxpzexpzexpzezpzWxpzexpze xpzezpzWxpzexqXWxpzezqXezqXnzq3ezqXezqXexqXezqXexqXezqXWxpze zqXezqXnzq3exqXezqXezqXezqXexqXezqXezqXezq3WxqXezqXexqXezqXe zqXezqXezqXnzq3ezqXn1q3n1q3v1rXn1q3n1q3exqXexqXezqXnzqXezqXn zqXexqXezqXexqXezqXezqXezqXezqXezqXezqXezqXezqXezqXexqXezqXe xqXezqXexqXezqXexqXezqXezqXezqXezqXnzq3ezqXnzq3ezqXn1q3Wxpze zqXWxpzWxpzWxpzexqXWxpzezqXWxpzexpzexpzezpzexpzezpzexpzezpzW xpzexpzWxpzexpzWxpzexpzexpzezpzWxpzexpzWxpzezpzWxpzexpzWxpze zpzWxpzexpzWxpzezpzWxpzexpzWxpzezpzWxpTexpzWxpzexpzWxpTexpzW xpzexpzWxpTexpzWxpzexpzWxpTexpzWxpzexpzWxpTexpzWxpzexpzWxpTe xpzWxpzexpzWxpzezpzexpzezpzWxpzezpzexpzezpzWxpzezpzWxpzexpzW xpzezpzezpznzqXWxpzexqXWxpzezqXWxpzezpzWxpzezpzWxpzexqXWxpze zqXWxpzezqXWxpzezqXWxpzezqXWxpzezqXWxpzezqXexqXezqXWxqXezqXe xqXezqXWxqXezqXexqXezqXWxqXezqXexqXezqXWxqXezqXexqXezqXexqXe zqXexqXezqXWxpzezqXWxpzezqXWxpzezqXWxpzezqXWxpzexqXWxpzezqXW xpzezpzexpzezpzWxpzezpzexpzezpzexpzezpzexpzezpzWxpzezpzWxpze zpzWxpzexpzWxpzezpzWxpzexpzWxpzezpzWxpzezpzexpzezpzWxpzezpze xpzezpzWxpzexpzWxpzezpzWxpTexpzWxpzexpzWxpzexpzWxpzexpzWxpze xpzWxpzexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTWxpzWxpTWxpzW vZTWxpzWxpTWxpzWvZTexpzWvZTexpzWvZTexpzWvZTexpzWvZTexpzWvZTe xpzWvZTexpzWvZTexpzWvZTexpzWxpTexpzWvZTexpzWxpTexpzWvZTexpzW xpTexpzWvZTexpzWxpTexpzWvZTexpzWxpTexpzWvZTexpzWxpTexpzWvZTe xpzWvZTexpzWvZTexpzWvZTexpzWvZTexpzWvZTexpzWvZTexpzWvZTexpzW xpTWxpzWxpTexpzWxpTWxpzWxpTexpzWvZTexpzWxpTexpzWvZTexpzWxpTe xpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzW xpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTe xpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWvZTexpzWvZTexpzW vZTexpzWvZTexpzWvZTexpzWvZTexpzWvZTexpzWvZTexpzWxpTexpzWxpTe xpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpQA3s6c 1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac 58al1s6M1s6U3r2l78al3sacvb29lKXnc4z/a5T/c6X/a63/Y73/Y8b/a87/ Y87/a97/Wt7/a+f/Ut7/Y97/vc7W586ltfe9e//Oe//GhPe9jOetlOetpd6c tdactc6UnM6UnMZ7nMZrhLVSc7VKjMZzxt6lzsal3s6c1sac3s6c3sac3s6c 1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac 3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c 3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3sac1sac 3s6c3sac3s6c3sac3s6l3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c 1sac3s6c3sac3s6c1sac3s6c3sac3sac1sac3s6c3sac3sac1sac3s6c3sac 3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c 3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c3sac3s6l3sac3s6c3sac 3s6l3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c 1sac3s6c3sac3s6c3sac3s6c3sac3s6c3sac3s6c3sac3s6c3sac3s6l3sac 3s6c3sac3s6l3sac3s6c3sac3s6c3sac3s6c3sac3s6c3sac3s6c1sac3s6c 3sac3s6c1sac3s6c3sac3s6c3sac3s6l3sac3s6c3sac3s6l3sac3s6l1sac 3sal3sac3s6l3s6l59at3s6l3s6l3sal3s6l3s6l3s6l3s6l586t3s6l3s6l 3sal3s6l3s6l3s6l3sal3s6l3s6l3s6l3s6l586t3s6l586t3s6l586t3s6l 586t586t59a159at79a1586t586t3s6l3s6l3sal586t3s6l586l3sal586l 3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3s6l3sal3s6l3sal3s6l3sal 3s6l3sal3s6l3s6l3s6l3s6l3s6l3s6l59at3s6l3s6l3s6l3s6l3sal3s6l 1sac3sal1sac3s6c1sac3s6c3sac3s6c3sac3s6c3sac3s6c3sac3s6c3sac 3sac1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c 3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac 3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c 1sac3s6c3sac3s6c1sac3s6c3sac3s6c3sac3s6c3sac3s6c3sac586l3s6c 3s6l1sac3s6l1sac3s6c1sac3s6c1sac3s6l1sac3s6l1sac3s6l1sac3s6l 3sal3s6l1sac3s6l1sac3s6l1sac3s6l3sal3s6l1sal3s6l3sal3s6l1sal 3s6l3sal3s6l1sal3s6l3sal3s6l1sal3s6l3sal3s6l3sal3s6l3sal3s6l 1sac3s6l1sac3s6l1sac3s6l1sac3s6l1sac3s6l1sac3s6c3sac3s6c3sac 3s6c3sac3s6c3sac3s6c3sac3s6c3sac3s6c1sac3s6c1sac3sac1sac3s6c 1sac3sac1sac3s6c1sac3s6c1sac3s6c3sac3s6c1sac3s6c3sac3s6c3sac 3s6c3sac3s6c1sac3s6c1sac3sac1sac3sac1sac3sac1sac3sac1sac3sac 1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU1sac1saU3sac1saU 3sac1r2U3sac1saU3sac1r2U3sac1saU3sac1saU3sac1saU3sac1saU3sac 1saU3sac1r2U3sac1saU3sac1r2U3sac1saU3sac1r2U3sac1saU3sac1r2U 3sac1saU3sac1r2U3sac1saU3sac1r2U3sac1saU3sac1saU3sac1saU3sac 1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU 3sac1saU3sac1saU3sac1saU3sac1sac3sac1saU3sac1sac3sac1saU3sac 1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU 3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac 1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU 3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac1saU3sac 1saU3sac1saU3sac1saU3sac1saU3sac1saU3sacANbGlN7GnNa9lN7GnNbG lN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnNa9nNbOlM7GlN69 pee9nN7GlL29paWtzmt7/2uM/2uU/3Ol/2ut/2O1/2O1/2u9/2vO/2PO/2vW /2PO/2PO/63O99bGpcbnrYT3xoz3vZTera3Wpb3OnNbOnNbGlN7GlMbGlMbG lMbGhK3Gc4y1a5zGhLXOlMbGnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbG lN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7G nNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9 lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbGlN7G nNbGlN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNbGlN7GnNbG lN7GnNbGlN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7G nNbGlN7GnNa9lN7GnNbGlN7GnNbGlN7GnNbGlN7GnNbGlN7GnNbGlN7GnNa9 lN7GnNbGlN7GnNa9lN7GnNbGnN7GnNbGlN7GnNbGnN7GnNbGlN7GnNbGlN7G nNa9lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNbGlN7GnNbGlN7GnNbGlN7GnNbG lN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbGnN7GnNbGlN7GnNbGnN7GnNbGlN7G nN7GnN7GnNbGlN7GnN7GnN7GnNbGlN7GnNbGlN7GnNbGlN7GnNbGlN7GnNbG lN7GnNbGnN7GnNbGlN7GnNbGnN7GnNbGlN7GnNbGnN7GnNa9nN7GnNbGnN7O pd7GpefOpd7Opd7OpdbGnN7Gpd7Gpd7OpdbGnN7Gpd7Gpd7OpdbGnN7GpdbG nN7OpdbGnN7Gpd7Gpd7Opd7Gpd7Opd7Opd7Opd7Opd7Opd7OpefOrd7OpefO rd7OpefOrd7OrefWrd7GnN7OpdbGnN7Gpd7GnN7Opd7GnN7OpdbGnN7OpdbG nN7GpdbGnN7OpdbGnN7Gpd7GnN7GpdbGnN7Gpd7GnN7GpdbGnN7GpdbGnN7G pdbGnN7Gpd7GnN7Opd7GnN7Opd7Gpd7Opd7Gpd7Opd7GnN7Gpda9nNbGnN7G nN7GnNbGlN7GnNbGlN7GnNbGlN7GnN7GnN7GnNbGlN7GnNbGlN7GnNa9lN7G nNbGlN7GnNbGlN7GnNbGlN7GnNbGlN7GnNbGlN7GnNbGlN7GnNbGlN7GnNbG lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbGlN7G nNa9lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnNbG lN7GnNa9lN7GnN7GnN7GnNbGlN7GnNbGlN7GnN7GnN7OnN7GnN7GpdbGnN7G nNbGlN7GnNbGlN7GnNbGnN7GnNbGnNbGnNbGnN7GpdbGnN7GnNbGnN7GnNbG nNbGnNbGnN7GpdbGnN7GnNbGnN7GpdbGnN7GpdbGnN7GpdbGnN7GpdbGnN7G pdbGnN7GpdbGnN7GpdbGnN7GpdbGnN7GpdbGnN7GnNbGnN7GpdbGnNbGnNbG nN7GpdbGnN7GnNbGnN7GnNbGnNbGnN7GnN7GnNbGlN7GnN7GnN7GnNbGlN7G nNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9 lN7GnNbGlN7GnNa9lN7GnNbGlN7GnNa9lN7GnN7GnN7GnNbGlN7GnNbGlN7G nNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9lNbGlNa9lNbGlNa9 lNbGlNa9lNbGlNa9lN7GnNa9lNbGlNa9lNbGlNa9lNbGlNa9lN7GlNa9lN7G lNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9 lNa9lNa9lN7GlNa9lNa9lNa9lN7GlNa9lNa9lNa9lN7GlNa9lNa9lNa9lN7G lNa9lNa9lNa9lN7GlNa9lNa9lNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9 lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GnNa9lNbGlNa9lN7GnNa9lNbG lNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GlNa9lN7GlNa9lN7GlNa9 lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7G lNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9 lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7G lNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9 lN7GlNa9lN7GlNa9lN7GlNa9lADexpzWxpTexpzWvZTexpzWxpTexpzWvZTe xpzWxpTexpzWvZTexpzWxpTexpzWvZTexqXOxpTWxpTWvZznxpzexozOxqW1 tbV7hP9rhPdrlPdrnP9rnP9jnP9rtf9rvf9ztf9arf9zxv9jtf9jvf+Uvf/O zr3WxqW157W13q3G1qXWxpzexpzevZTexpTOvZTexpzevZznzpzWxpS9xpS1 xpTGzpzOxpTexpzWxpTexpzWvZTexpzWxpTexpzWvZTexpzWxpTexpzWvZTe xpzWxpTexpzWvZTexpzWxpTexpzWvZTexpzWxpTexpzWvZTexpzWxpTexpzW vZTexpzWxpTexpzWvZTexpzWxpTexpzWvZTexpzWxpTexpzWvZTexpzWxpTe xpzWvZTexpzWxpTexpzWvZTexpzWxpTexpzWxpTexpzWxpzexpzWxpTexpzW xpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTe xpzWxpzexpzWxpTexpzWxpzexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzW xpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTe xpzWxpTexpzWxpzexpzWxpTexpzWxpzexpzWxpTexpzWxpTexpzWxpTexpzW xpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTe xpzWxpTexpzWxpTexpzWxpzexpzWxpTexpzWxpzexpzWxpTexpzexpzexpzW xpTexpzexpzexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpze xpzWxpTexpzWxpzexpzWxpTexpzWxpzexpzWxpTexpzWxpzezqXezqXnzq3e zqXezqXWxpzezqXWxpzezqXexqXezqXWxpzezqXWxpzezqXexqXezqXexqXe zqXexqXezqXexqXezqXezqXezqXezqXnzq3ezqXezqXexqXnzq3ezq3n1q3n zq3n1q3exqXexqXWxpzezqXexqXezqXWxpzezqXexpzexqXexpzezqXexpze xqXexpzezqXexpzexqXexpzezqXexpzexqXexpzexqXexpzexqXexpzezqXe xpzezqXexpzezqXexpzezqXexqXezqXexqXezqXWxpznzqXexpzexpzWxpze xpzWxpzexpzWxpTexpzexpzexpzWxpTexpzWxpzexpzWxpzexpzWxpTexpzW xpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTexpzWxpTe xpzWvZTexpzWxpTexpzWvZTexpzWxpTexpzWvZTexpzWxpTexpzWvZTexpzW xpTexpzWvZTexpzWxpTexpzWvZTexpzWxpTexpzWxpTexpzWxpTexpzWxpTe xpzexpzexpzWxpTexpzexpzexpzexpzezqXexpzexpzWxpTexpzWxpzexpzW xpzexpzWxpzexpzWxpzexpzWxpzexpzWxpzexpzWxpzexpzWxpzexpzWxpze xpzWxpzexqXexpzexqXWxpzexqXexpzexqXWxpzexqXexpzexqXWxpzexqXe xpzexqXWxpzexqXexpzexqXWxpzexqXWxpzexpzWxpzexpzWxpzexpzWxpze xpzWxpzexpzWxpzexpzexpzexpzWxpTexpzexpzexpzWxpTexpzWxpTexpzW xpTexpzWxpTexpzWvZTexpzWxpTexpzWvZTexpzWxpTexpzWvZTexpzWxpTe xpzWvZTexpzWxpTexpzWvZTexpzexpzexpzWxpTexpzWxpTexpzWxpTexpzW vZTexpzWvZTexpzWvZTexpzWvZTexpzWvZTWxpTWvZTexpzWvZTWxpTWvZTe xpzWvZTWxpTWvZTWxpTWvZTWxpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTW vZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTe xpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTW vZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTe xpTWvZTexpTWvZTexpzWvZTWxpTWvZTexpzWvZTWxpTWvZTexpzWvZTexpzW vZTexpzWvZTexpzWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTe xpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTW vZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTe xpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTW vZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTexpTWvZTe xpTWvZTexpQA1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU 1r2U3saU1r2U3saU1r2c1saczr2U3sac3r2U3saUzr2Uzr2le3v/a3P3Y3P/ a4z/Y4z/a5T/a5z/a6X/Wpz/Y5z/a6X/a5z/Upz/hKX/vb291r2lxsaczsac 1r2U572U3r2U3saUzsaUxsaU1r2U3r2c3r2U3r2czr2UzsaUzsaU3saU1r2U 3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU 1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U 3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU 1r2U3saU1r2U3r2U1r2U3sac1r2U3sac1r2U3sac1r2U3saU1r2U3sac1r2U 3saU1r2U3sac1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3sac1r2U3sac 1r2U3sac1r2U3sac1r2U3saU1r2U3sac1r2U3saU1r2U3sac1r2U3saU1r2U 3saU1r2U3saU1r2U3saU1r2U3saU1r2U3sac1r2U3saU1r2U3sac1r2U3r2U 1r2U3sac1r2U3r2U1r2U3sac1r2U3saU1r2U3sac1r2U3saU1r2U3sac1r2U 3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3sac1r2U3saU1r2U3sac 1r2U3r2U1r2U3sac1r2U3r2U1r2U3sac1r2U3saU1r2U3sac1r2U3saU1r2U 3sac1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3r2U1r2U3sac1r2U3r2U 1r2U3sac1r2U3sac1r2U3sac1r2U1saU1r2U3sac3sac3s6l3sal3s6l1sac 1sac1r2c3sal1r2c3sac1sac3sal3sac3sal3sal3s6l3sac3sal3sac3sal 3sac3sal3sal3s6l3sal3sal3sal3s6l3sal3s6l3s6l586t586t586t3sal 3sal1r2c3sac1sac3sal1sac3sac3sac3sac1sac3sac3sac3sac1sac3sac 3sac3sac1sac3sac3sac3sac1r2c3sac1sac3sac1r2c3sac3sac3sac1r2c 3sac1sac3sal1sac3sal3sac3s6l3sac3sac3sac3sac1r2U3sac1r2U3sac 1r2U3r2U1r2U3r2U1r2U3sac1r2U3sac1r2U3saU1r2U3saU1r2U3saU1r2U 3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU 1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U 3saU1r2U3saU1r2U3saU1r2U3sac1r2U3saU1r2U3sac1r2U3saU1r2U3saU 1r2U3saU1r2U3sac1sac3sac1r2c3sac1r2U3sac1saU3sac1r2U1sac1r2U 3sac1r2U3sac1r2U3sac1r2U3sac1saU3sac1r2U3sac1sac3sac1r2c3sac 1sac3sac1r2c3sac1sac3sac1r2c3sac1sac3sac1r2c3sac1sac3sac1sac 3sac1sac3sac1r2c3sac1r2c3sac1r2U3sac1r2U3sac1r2U1sac1r2U3sac 1r2U3saU1r2U3sac1r2U3saU1r2U3sac1r2U3saU1r2U3sac1r2U3saU1r2U 3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU 1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U1r2U1r2U1r2U1r2U 1r2U1r2U1r2U1r2U1r2U1r2U1r2U1r2U1r2U1r2U1r2U1r2M1r2U1r2U1r2U 1r2M1r2U1r2M1r2U1r2M1r2U1r2M1r2U1r2M1r2U1r2M1r2U1r2M1r2U1r2U 1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U 1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M 1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U 1r2M1r2U1r2M1r2U1r2M1r2U1r2M1r2U1rWM1r2U1r2U1r2U1rWM1r2U1r2U 1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U 1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M 1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U 1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U 1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2UAN7G lNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9 lN69nNa9lNbGnNa9lN7GlNa9jN7GnNa9nJSU3ntz53Nr/3Nz/3OE/2uM/3OU /2uM/2Ol/3OU/4yc/3uU/3uU/5Sc98a9tda9jM7GlM69lN69lN69lOe9lNa9 lNbGlM69lNbGnNa9lN69nNa1lN69nNa9lN69lN69jN7GlNa9lN7GlNa9lN7G lNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9 lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7G lNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN69lNa9 lN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7G lNa9lN7GnNa9lN7GlNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9 lN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GlNa9lN7GnNa9lN7GlNa9lN7G nNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9lN69lNa9lN7GnNa9lN69lNa9 lN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GlNa9lN7GnNa9lN7G lNa9lN7GnNa9lN7GlNa9lN7GnNa9lN7GlNa9lN7GnNa9lN69lNa9lN7GnNa9 lN69lNa9lN7GnNa9lN7GlNa9lN7GnNa9lN7GlNa9lN7GnNa9lN7GlNa9lN7G nNa9lN7GlNa9lN7GnNa9lN69lNa9lN7GnNa9lN69lNa9lN7GnNa9lNbGlNa9 lN7GnNa9lNbGlNa9lNbGlNa9lNa9nNbGnOfOrefOpd7OpdbGnN7GpdbGnN7G pdbGnN7Gpd7Gpd7Opd7GpefOpd7Gpd7Gpd7GnN7Opd7Gpd7Gpd7GnN7Opd7G pd7Gpd7Gpd7Opd7Gpd7Gpd7Gpd7Opd7GpefOrefOre/Wrd7Opd7Gpda9nN7G pd7Gpd7GnN7GnN7Gpd7GnN7GnN7GnN7Gpd7GnN7GnNbGnN7GnN7GnN7GnNbG nN7GnN7GnN7GnN69nN7GnN7GnN7GnN69nN7GnN7GnN7GnNbGnN7GnNbGnN7G nNbGnN7GpdbGnOfGpd7GnOfGpd7GnN7GnNa9nN7GnNa9nN7GnNa9lN7GnNa9 lN69lNa9lN7GnNa9lN7GlNa9lN7GnNa9lN7GlNa9lN7GnNa9lN7GlNa9lN7G nNa9lN7GlNa9lN7GnNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9 lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7G nNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GlNa9lN7GnNa9lN7GlNa9lN7GnNa9 lN7GnNa9nN7GnNa9lN7GnNa9lN7GnNbGlN7GlNa9lN7GnNa9lN7GnNa9lN7G nN7GlN7GnNa9lN7GnN7GlN7GnN7GlN7GnN7GlN7GnN7GnN7GnN7GnN7GnN7G nN7GnN7GnN7GnN7GnN7GnN7GnN7GnN7GnN7GnN7GnN7GnN69nN7GnN7GnN7G nN69nN7GnN69nN7GnNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GlNa9lN7GnNa9 lN7GlNa9lN7GnNa9lN7GnNa9lN7GnNa9lN7GlNa9lN7GnNa9lN7GlNa9lN7G nNa9lN7GlNa9lN7GnNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9lN7GlNa9 lN7GlNa9lNa9lNa9lN7GlNa9lNa9lNa9lNa9lNa9lNa9lNa9lNa9lNa9lNa9 lNa9lN7GlNa9lNa9lNa9lN7GlNa9lNa9lNa9jNa9lNa9lNa9lNa9jNa9lNa9 jNa9lNa9jNa9lNa9jNa9lNa9jNa9lNa9jNa9lNa9jNa9lNa9lNa9lNa9jNa9 lNa9lNa9lNa9lN69lNa9lNa9lNa9lN69lNa9lNa9lNa9lN69lNa9lNa9lNa9 lN69lNa9lNa9lNa9lN69lNa9lNa9lNa9lN69lNa9lNa9lNa9jNa9lNa9lNa9 lNa9jNa9lNa9lNa9lNa9jNa9lNa9lNa9lNa9jNa9lNa9lNa9lNa9jNa9lNa9 jNa9lNa9jNa9lNa9jNa9lNa1jNa9lNa9lNa9lNa1jNa9lNa9lNa9lNa9jNa9 lNa9lNa9lNa9jNa9lNa9lNa9lNa9jNa9lNa9lNa9lNa9jNa9lNa9lNa9lNa9 jNa9lNa9lNa9lNa9jNa9lNa9lNa9lNa9jNa9lNa9lNa9lNa9jNa9lNa9lNa9 lNa9jNa9lNa9lNa9lNa9jNa9lNa9lNa9lNa9jNa9lNa9lNa9lNa9jNa9lNa9 lNa9lNa9jNa9lNa9lNa9lNa9jNa9lNa9lNa9lNa9jNa9lNa9lNa9lNa9jNa9 lNa9lNa9lNa9jNa9lNa9lNa9lNa9jNa9lNa9lN69lADWvYzWvZTWvYzWvZTW vYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTevYzevZTWtZTW vZTOvYzWvZTWvZTWvZS9rbWtlMaUe9aMe+97c+d7hPeElP+MnP97pfecnP+l lP+crdacpda9tcbOtZzWxozOvYzWvZTOvYzWvZTWvYzWvZTWtYzetYzOvYzW xpTOvYzWvZTevZTevZTWtYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTW vYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzW vZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTW vYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvZTWvZTWtYzWvZTWvZTW vZTWvZTWvZTWvZTWvZTWvYzWvZTWvZTWvZTWvYzWvZTWvZTWvZTWvYzWvZTW vZTWvZTWvYzWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvYzW vZTWvZTWvZTWvYzWvZTWvZTWvZTWvYzWvZTWvZTWvZTWvYzWvZTWvZTWvZTW vYzWvZTWvZTWvZTWvYzWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTW vZTWvYzWvZTWvZTWvZTWvYzWvZTWvZTWvZTWvYzWvZTWvZTWvZTWvYzWvZTW vZTWvZTWvYzWvZTWvZTWvZTWvYzWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTW vZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvYzWvZTWvZTWvZTW vYzWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTW vZTWvZTWvZTOtZTWvZzWvZzexqXexqXexqXWvZzexpzexpzexqXexpzexqXe xpzexqXexpzexqXexpzexqXWvZzexpzexpzexqXWvZzexpzWvZzexqXWvZze xqXevZzexqXWvZzexqXexpznzqXezqXnzq3exqXexqXWvZzWxpzWvZTexpzW vZTevZzWvZTexpzWvZTevZzWvZTexpzWvZTevZTWvZTexpzWvZTevZTWvZTe xpzWvZTevZzWvZTevZzWvZTevZzWvZzexpzWvZTWvZzWvZTWxpzWvZTWxpzW vZTexpzWvZTexpzWvZzexpzWvZTevZzWvZTevZTWvZTWvZTWvZTWvZTWtYzW vZTWvZTWvZTWvYzWvZTWvZTWvZTWvYzWvZTWvZTWvZTWvYzWvZTWvZTWvZTW vYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzW vZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvZTWvZTWvYzWvZTW vZTWvZTWvYzWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvYzWvZTWvZTevZzWvZTW vZTWvZTWvZTWvZTWvZTWvZTevZTWvZTWvZTWvZTexpTWvZTevZTWvZTexpTW vZTevZTWvZTexpTWvZTexpTWvZTexpzWvZTevZTWvZTexpzWvZTevZTWvZTe xpzWvZTevZTWvZTexpzWvZTevZTWvZTexpzWvZTevZzWvZTevZzWvZTevZzW vZTexpTWvZTevZTWvZTevZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTWvZTW vZTWvZTWvZTWvZTWvZTWvZTWvZTWvYzWvZTWvZTWvZTWvYzWvZTWvZTWvZTW vYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzW vZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTO tYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvYzOtYzWvYzOtYzW vYzOtYzWvYzOtYzWvYzOtYzWvZTOtYzWvYzOtYzWvZTOtYzWvYzWtYzWvZTO tYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzW vZTOtYzWvZTWtYzWvZTOtYzWvZTOtYzWvZTOtYzWvYzOtYzWvZTOtYzWvYzO tYzWvZTOtYzWvYzOtYzWvZTOtYzWvYzOtYzWvZTOtYzWvYzOtYzWvZTOtYzW vYzOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvYzOtYzWvZTO tYzWvYzOtYzWvZTOtYzWvYzOtYzWvZTOtYzWvYzOtYzWvZTOtYzWvYzOtYzW vZTOtYzWvYzOtYzWvZTOtYzWvYzOtYzWvZTOtYzWvYzOtYzWvZTOtYzWvYzO tYzWvZTOtYzWvYzOtYzWvZTOtYzWvYzOtYzWvZTOtYzWvYzOtYzWvZTOtYzW vYzOtYzWvZTOtYzWvYzOtYzWvZTOtYzWvYzOtYzWvZTOtYzWvYzOtYzWvZTO tYzWvYzOtYzWvZTOtYzWvYzOtYwA3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U 3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U572U3rWU3r2U1r2M1r2UzrWU1r2U 1r2M1r2UxrWMxr2lta3OpZTvlIT/nJz/lKXvjK3/tZz/vaXetcaUxsac1r2M 3rWUzrWM572U3r2U1r2Uzr2M1r2U1r2U3r2U3r2Uzr2MzsaM1saMzrWM3saU 1r2M1r2Uzr2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U1r2U1r2M1r2U1r2M 1r2U1r2M1r2U1r2M1r2U1r2M1r2U1r2M1r2U1r2M1r2U1r2M1r2U1r2M1r2U 1r2M1r2U1r2M1r2U1r2M3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U 1r2U1r2U3r2U1r2U1r2U1r2U1r2U1r2U1r2U1r2U1r2U1r2U1r2U1r2U3r2U 1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U 3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U 1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U 1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U 1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U1r2U1r2U1r2U1r2M 1r2U1r2U1r2U1r2M3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3saU1r2U3r2U 1r2U3saU1r2U3r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U 1r2U1r2U3r2U1r2U1r2U1r2U3saU1r2U1r2U1r2U3saU1r2U3saU1r2U1r2c zrWU1r2U1r2U3sal3sal586l3sac586l3sac3sal3sac3sal3sac3sal1r2c 3sal3sac3sal3sac3sal3sac3sac1r2c3sal3r2c3sal1r2c3sal3sac3sal 3sac3sal3sac3sal3s6l79at586t3salzrWU3sac1r2U3r2c1r2U3sac1r2U 3r2c1r2U3sac1r2U3r2U1r2U3sac1r2U3r2U1r2U3sac1r2U3r2c1r2U3r2c 1r2U3r2c1r2U1sac1r2U1sac1r2U3sac1r2U1sac1r2U3r2c1r2U3r2c1r2U 3sac3r2c3sac3r2c3sac3r2U3sac1r2U1r2U1r2U1r2U1rWM3r2U1r2U1r2U 1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U 1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U 1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U3r2U1r2U1r2U1r2U 3r2U1r2U3r2U1r2U3saU1r2U1r2U1r2M3r2c1r2U1r2c1r2U3r2U1r2U1r2U 1r2M3saU1r2U3saU1r2U3saU1r2U3saU1r2U3saU1r2U3r2U1r2U3saU1r2U 3saU1r2U3sac1r2U3sac1r2U3sac1r2U3sac1r2U3sac1r2U3sac1r2U3sac 1r2U3sac1r2U3sac1r2U3r2c1r2U3r2c1r2U3r2c1r2U3sac1r2U3saU1r2U 3saU1r2U3r2U1r2U3saU1r2U3r2U1r2U3saU1r2U3r2U1r2U3r2U1r2U1r2U 1r2U1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2M 1r2U1r2M1r2U1r2M1r2U1r2M1r2U1r2U1r2U1r2M1r2U1r2M1r2U1r2M1r2U 1rWM1r2U1rWM1r2U1rWM1r2U1rWM1r2U1r2M1r2U1rWM1r2U1r2M1r2U1rWM 1r2U1r2M1r2U1rWM1r2U1rWM1r2UzrWM1r2UzrWM1r2MzrWM1r2UzrWM1r2M zrWM1r2U1r2M1r2U1rWM1r2U1r2M1r2U1rWM1r2U1rWM1r2UzrWM1r2U1rWM 1r2UzrWM1r2U1rWM1r2UzrWM1r2U1rWM1r2UzrWM1r2U1rWM1r2UzrWM1r2U 1rWM1r2UzrWM1r2U1r2M1r2U1rWM1r2U1r2M1r2U1rWM1r2U1r2M1r2U1rWM 1r2U1r2M1r2U1rWM1r2U1rWM1r2UzrWM1r2U1rWM1r2UzrWM1r2U1rWM1r2U zrWM1r2U1rWM1r2UzrWM1r2UzrWM1r2MzrWM1r2UzrWM1r2MzrWM1r2UzrWM 1r2MzrWM1r2UzrWM1r2MzrWM1r2UzrWM1r2MzrWM1r2UzrWM1r2MzrWM1r2U zrWM1r2MzrWM1r2UzrWM1r2MzrWM1r2UzrWM1r2MzrWM1r2UzrWM1r2MzrWM 1r2U1r2M1r2U1rWM1r2U1r2M1r2U1rWM1r2U1r2M1r2U1rWM1r2U1r2M1r2U 1rWM1r2UzrWM1r2MzrWM1r2UzrWM1r2MzrWM1r2UzrWM1r2MzrWM1r2UzrWM 1r2MzrWM1r2MAM61jNa9lM61jNa9lM61jNa9lM61jNa9lM61jNa9lNa1jNa9 lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1 jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9 lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9jM61jNa9jM61jNa9jM61jNa9jM61 jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9jM61jNa9lM61jNa9jM61jNa9 lM61jNa9lM61jNa9lM61jNa9lM61jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1 jNa9lM61jNa9jM61jNa9jM61jNa9jM61jNa9jM61jNa9lM61jNa9lM61jNa9 lM61jNa9lNa1jNa9lNa9jNa9lNa1jNa9lNa9jNa9lM61jNa9lNa1jNa9lM61 jNa9lNa1jNa9lM61jNa9jM61jNa9jM61jNa9jM61jNa9jM61jNa9lNa1jNa9 lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1 jNa9lM61jNa9lNa1jNa9lM61jNa9jM61jNa9lM61jNa9jM61jNa9lM61jNa9 lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61 jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9 lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lNa1jNa9lNa9jNa9lNa1jNa9lNa9 jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lNa9jNa9lNa1jNa9jM61jNa9 lNa9jN69lM61jNa9jM61jNa9lM61jNa9lNa1jNa9lNa1lNa9lNa9lN69nNa9 lN7GnN7GnOfOpda9nN69pd69nN7GnNa9lN69lNa9lN7GnNa9nN7GnN69nN7G nNa9lN69nNa9lN69nNa9nN7GnNa9nN7GnNa9nN7GnNa9nN7GnNa9nN7GnN7G nN7Gpd7GnN7Gpd7GpefOpc61jNa9lNa9lN69nNa9lNa9lNa9lN69nNa9lNa9 lNa9lNa9lNa9lNa9lNa9lNa9lNa9jNa9lNa9jNa9lNa1jNa9lNa9jNa9lNa9 jNa9lNa9lNa9lNa9jNa9lNa9lNa9lNa9lNa9lNa9lN69lNa9lNa9lNa9lN69 lNa9lN69lNa9lN69lNa9lNa9lNa9lNa9lM61jNa1jM61jNa9lM61jNa9lM61 jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9 lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9lM61jNa9lM61 jNa9lM61jNa9lM61jNa9lM61jNa9lM61jNa9lM61jNa9lM61jNa9lM61jNa9 lM61jNa9lM61jNa9lM61jNa9lNa9lN69lNa9jNa9lNa1jNa9lNa1jNa9lNa9 jNa9lNa1jNa9lNa9jNa9lNa9jNa9lNa9jNa9lNa9jNa9lNa9lNa9lNa9lNa9 lNa9lNa9lNa9lNa9lNa9lNa9lNa9lNa9lNa9lN69lNa9lNa9lNa9lN69lNa1 jNa9lNa9lNa9lNa1jNa9lNa9lNa9lNa9jNa9lNa9jNa9lNa9jNa9lNa9jNa9 lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9jM61 jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9 lNa1jNa9lM61jNa9lNa1jNa9lM61jNa9jM61jNa9lNa1jNa1lNa1jNa1lM61 jNa1jM61jNa1jM61jNa1jNa1jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1 jM61hNa1jM61jNa1jM61hM61jM61hNa1jM61hM61jM61hNa1jM61hNa1jM61 hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1 jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61 hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1 jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61jNa1jM61jNa1jM61jNa1jM61 jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1 jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61 jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61hNa1jM61hNa1 jM61hNa1jM61hNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61hNa1jM61 hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hADW vZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTW tYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzW vZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTO tYzWvZTWtYzWvYzOtYzWvZTOtYzWvYzOtYzWvZTOtYzWvZTOtYzWvZTWtYzW vZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTO tYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvYzOtYzW vZTOtYzWvYzOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTW tYzWvZTWvYzWvZTWtYzWvZTWvYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzW vYzOtYzWvYzOtYzWvYzOtYzWvYzOtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTW tYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzW vZTWtYzWvZTWtYzWvZTWvYzWvZTWtYzWvZTWvYzWvZTOtYzWvZTWtYzWvZTO tYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzW vZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTW tYzWvZTOtYzWvZTWtYzWvZTWtYzWvZTWvYzWvZTWtYzWvZTWvYzWvZTOtYzW vZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTWvYzWvZTWvZTWvZTO tYzWvZTWvYzWvZTWvYzWvZTWvZTevZzWvZTevZzWvZTevZzevZzexpzexpzn xqXevZzexpzWvZzexpzevZTexpzexpTexpzWvZzexpzevZzexpzWvZzexpzW vZzexpzWvZzexpzevZzexpzWvZzexpzevZzexpzWvZzexqXexpzexqXexpzn zqXexqXexpzWvZTWvZTWtZTWvZTWvZTevZzWvZTevZTWvZTevZTWvZTWvZTW vZTWvZTWvZTWvZTWvYzWvZTWvZTWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvZTW vZTWvYzWvZTWvZTWvZTWvZTevZTWvZTWvZTWvZTevZTWvZTWvZTWvZTevZTW vZTWvZTWvZTevZTWvZTWvZTWtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzW vZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTO tYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzW vZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTOtYzWvZTO tYzWvZTWvYzevZTWvZTWvZTWtYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzW vZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvZTWvZTWvZTWvZTWvZTWvZTW vZTWvZTWvZTWvZTWvZTevZTWvZTWvZTWvZTevZTWvZTWvZTWtYzWvZTWvZTW vZTWtYzWvZTWvZTWvZTWvYzWvZTWvYzWvZTWvYzWvZTWvYzWvZTOtYzWvZTW tYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTOtYzWvZTOtYzW vZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTOtYzWvZTWtYzWvZTO tYzWvZTWtYzWvZTOtYzWvZTOtYzWvYzWtYzWvZTWtYzWtYzOtYzWvYzOtYzW tYzOtYzWvYzWtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzO tYzWtYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTW tYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzO tYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTW tYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzOtYTWtYzO tYTWtYzOtYTWtYzOtYTWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzW tYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzO tYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzW tYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYTWvYzOtYzWtYzOtYTWvYzO tYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYTWvYzOtYzWtYzOtYTW vYzOtYzWtYzOtYTWvYzOtYzWtYzOtYTWvYzOtYzWtYwAzrWMzrWMzrWEzrWM zrWMzrWMzrWEzrWMzrWMzrWMzrWEzrWMzrWMzrWMzrWEzrWMzrWMzrWMzrWE zrWMzrWMzrWMzrWEzrWMzrWMzrWMzrWEzrWMzrWMzrWMzrWEzrWMzrWMzrWM zrWEzrWMzrWMzrWMzrWEzrWMzrWMzrWMzrWEzrWMzrWMzrWMzrWEzrWMzrWM 1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWMzrWMzrWEzrWMzrWMzrWMzrWEzrWM zrWM1r2MzrWM1rWMzrWM1r2MzrWM1rWMzrWMzrWMzrWEzrWMzrWMzrWMzrWE zrWMzrWMzrWMzrWEzrWMzrWMzrWMzrWEzrWMzrWM1rWMzrWMzrWMzrWM1rWM zrWMzrWMzrWMzrWMzrWEzrWMzrWMzrWMzrWEzrWMzrWM1rWMzrWMzrWMzrWM 1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWE1rWMzrWEzrWM zrWE1rWMzrWEzrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWM zrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM1r2M zrWM1rWMzrWM1r2MzrWM1rWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM 1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWM zrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWM zrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM1rWM zrWMzrWMzrWM1r2MzrWM1r2MzrWM1r2MzrWM1rWMzrWM1r2MzrWM1r2M1rWM 1r2U1r2M1r2U1rWU1r2UzrWM1r2U1rWU1r2U1rWU1r2U3sal3sal1r2c3r2c 1r2U3r2c1r2U1r2U1r2U3r2c1r2U1r2c1r2U1r2c1r2U1r2c1r2U1r2c1r2U 1r2c1r2U1r2c1r2U1r2c1r2U3r2c1r2U3r2c1r2c3sac1r2c3sac3sac3sac 1r2U1r2U1rWU1r2UzrWM1rWU1rWM1r2UzrWM1r2U1rWM1r2UzrWM1r2U1rWM 1r2UzrWM1r2UzrWM1r2UzrWM1r2MzrWM1r2MzrWM1r2MzrWM1r2MzrWM1r2M zrWM1r2UzrWM1r2MzrWM1r2UzrWM1r2MzrWM1r2UzrWM1r2U1rWM1r2U1rWM 1r2U1rWM1r2UzrWM1rWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM1rWM zrWMzrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWMzrWMzrWEzrWMzrWM zrWMzrWEzrWMzrWMzrWMzrWEzrWMzrWMzrWMzrWEzrWMzrWM1rWMzrWMzrWM zrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM1r2MzrWM 1r2MzrWM1r2MzrWM1rWMzrWM1r2MzrWM1r2MzrWM1r2MzrWM1r2MzrWM1r2M zrWM1rWMzrWM1r2MzrWM1r2MzrWM1r2UzrWM1r2UzrWM1r2UzrWM1r2UzrWM 1r2UzrWM1r2UzrWM1r2UzrWM1r2UzrWM1r2UzrWM1rWMzrWM1r2UzrWM1rWM zrWM1r2MzrWM1rWMzrWM1r2MzrWM1rWMzrWM1rWMzrWMzrWMzrWM1rWMzrWM zrWMzrWM1rWMzrWMzrWMzrWMzrWMzrWEzrWMzrWMzrWMzrWEzrWMzrWMzrWM zrWEzrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM1rWMzrWMzrWMzrWM zrWMzrWEzrWMzrWM1rWMzq2EzrWMzrWE1rWMzq2EzrWMzrWE1rWMzq2EzrWM zq2EzrWMzq2EzrWMzrWE1rWMzq2EzrWMzq2EzrWMzq2EzrWMzrWEzrWMzq2E zrWEzrWEzrWMzq2EzrWEzq2EzrWEzq2EzrWEzq2EzrWEzq2EzrWEzrWEzrWM zq2EzrWEzrWEzrWMzq2EzrWEzq2EzrWEzq2EzrWEzq2EzrWEzq2EzrWEzrWE zrWMzq2EzrWEzrWEzrWMzq2EzrWEzrWEzrWMzq2EzrWEzrWEzrWMzq2EzrWE zrWEzrWMzq2EzrWEzrWEzrWMzq2EzrWEzrWEzrWMzq2EzrWEzrWEzrWMzq2E zrWEzq2EzrWMzq2EzrWMzq2EzrWMzq2EzrWMzq2EzrWMzq2EzrWMzq2EzrWM zq2EzrWMzq2EzrWMzq2EzrWMzq2EzrWMzq2EzrWMzrWE1rWMzq2EzrWMzrWE 1rWMzq2EzrWMzrWE1rWMzq2EzrWMzrWE1rWMzq2EzrWMzq2EzrWMzq2EzrWM zq2EzrWMzq2EzrWMzrWE1rWMzrWEzrWMzrWE1rWMzrWEzrWMzq2EzrWMzq2E zrWMzq2EzrWMzq2EzrWMzrWE1rWMzrWEzrWMzrWE1rWMzrWEzrWMzrWE1rWM zrWEzrWMzrWE1rWMzrWEzrWMzq2EANa1jM61jNa1jM61jNa1jM61jNa1jM61 jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1 jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61 jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1 jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61 jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1 jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61 jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1 jM61jNa1jM61jNa1jM61jNa1jM61jNa9jM61jNa1jM61hNa9jM61jNa1jM61 hNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1 jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61 jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1 jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61 jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1 jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa9jNa1 jNa1jM61jNa9jM61jNa1jM61hNa9lNa1jNa9lNa1jNa9lNa9jNa9lNa9jN69 lNa1jNa9lNa1jNa9lNa1jNa1lNa1jN69nN69nOfGpd69nN69nNa1lN69nNa9 lN69nNa9lNa9nNa1lN69nNa9lN69nNa9lN69nNa9lN69nNa9lN69nNa9lN69 nNa9lN69nNa9lNa9nNa9lN69nNa9nN7GnNa9nN7Gpd7GnOfGpd69nNa9nM61 lNa1lNa1lNa9lNa1jNa9lNa1jNa9lNa1jNa1lNa1jNa9lNa1jNa9lNa1jNa9 lNa1jNa9jNa1jNa9lNa1jNa9jNa1jNa9lNa1jNa9jNa1jNa9lNa1jNa9jNa1 jNa9lNa1jNa9jNa1jNa9lNa1jNa1lNa1jNa9lNa1jNa9lNa1jNa9lNa1jNa9 lNa1jNa1lNa1jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61 jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1 jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61 jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jNa1jNa9lNa1jNa1 jM61jNa9jNa1jNa1jM61jNa9jNa1jNa1jM61jNa1jM61jNa1jM61jNa9jNa1 jNa1jM61jNa9lNa1jNa1lNa1jNa9lNa1jNa1lNa1jNa9lNa1jNa1lNa1jNa9 lNa1jNa1lNa1jNa1lNa1jNa1jM61jNa1lNa1jNa1jM61jNa9jNa1jNa1jM61 jNa9jNa1jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1 jM61jNa1jM61jNa1jM61hNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61 jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61jNa1jM61hNa1 jM61jNa1jM61hNa1jM61hNa1jM6thNa1jM61hNa1jM6thNa1jM6thNa1jM6t hNa1jM61hNa1jM6thNa1jM6thNa1jM6thNa1jM61hNa1jM61hNa1jM61hNa1 jM61hNa1jM61hNa1hM6thNa1jM61hNa1hM6thNa1jM61hNa1hM6thNa1jM61 hNa1hM6thNa1jM61hNa1hM6thNa1jM61hNa1hM6thNa1jM61hNa1hM6thNa1 jM61hNa1hM6thNa1jM61hNa1hM6thNa1jM61hNa1hM6thNa1jM61hNa1hM6t hNa1jM61hNa1hM6thNa1jM61hNa1hM6thNa1jM61hNa1hM6thNa1jM6thNa1 jM6thNa1jM6thNa1jM6thNa1jM6thNa1jM6thNa1jM6thNa1jM6thNa1jM6t hNa1jM6thNa1jM6thNa1jM6thNa1jM61hNa1jM6thNa1jM61hNa1jM6thNa1 jM61hNa1jM6thNa1jM61hNa1jM6thNa1jM6thNa1jM6thNa1jM6thNa1jM6t hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM6thNa1jM61hNa1 jM6thNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61hNa1jM61 hNa1jM61hNa1jADOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYTOtYTO tYzOrYTOtYTOtYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzO rYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTO tYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzO rYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTO tYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzO rYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYTOtYTOtYzOrYTO tYTOtYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOtYTWtYzO rYTOtYzOtYTWtYzOrYTOtYTOtYTOtYzOrYTOtYTOtYTOtYzOrYTOtYzOtYTW tYzOrYTOtYzOtYTWtYzOrYTOtYzOtYTWtYzOrYTOtYzOtYTWtYzOrYTOtYzO tYTWtYzOrYTOtYzOtYTWtYzOrYTOtYzOtYTWtYzOrYTOtYzOtYTWtYzOtYTO tYzOtYTWtYzOtYTOtYzOtYTWtYzOrYTOtYzOtYTWtYzOrYTOtYzOtYTWtYzO rYTOtYzOtYTWtYzOrYTOtYzOtYTWtYzOrYTOtYzOtYTWtYzOrYTOtYzOtYTW tYzOrYTOtYzOtYTWtYzOrYTOtYzOtYTWtYzOrYTOtYzOrYTOtYzOrYTOtYzO rYTOtYzOtYTOtYzOtYTWtYzOtYTOtYzOtYTWtYzOrYTOtYzOtYTOtYzOrYTO tYzOtYTWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzO rYzWtYzOtYzWtYzOrYzWvZTevZzexpzWvZTWvZTWtZTWvZzOtZTWtZTWtZTW vZTOtZTWvZTWtZTWvZTWtZTWvZTWtZTWvZTWtZTWvZTWtZTWvZTWtZTWvZTW tZTWvZTWtZTWvZTWvZTevZzWtZTevZzexpznxqXWvZTWtZTOtYzWtZTOtYzW tYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzO tYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzW tYzOtYzWtYzOtYzWtYzOrYzOtYzOrYzWtYzOrYzWtYzOtYzWtYzOrYzWtYzO tYzWtYzOrYTOtYzOtYTWtYzOrYTOtYzOtYTWtYzOrYTOtYzOrYTOtYzOrYTO tYzOrYTOtYzOrYTOtYTOtYTOtYzOrYTOtYTOtYTOtYzOrYTOtYTOtYTOtYzO rYTOtYTOtYTOtYzOrYTOtYTOtYTOtYzOrYTOtYTOtYTOtYzOrYTOtYTOtYTO tYzOrYTOtYTOtYTOtYzOrYTOtYzOtYTWtYzOtYzWtYzOtYzWtYzOrYTOtYzO tYTWtYzOrYTOtYzOtYTWtYzOrYTOtYzOtYzWtYzOtYTWtYzOtYzWtYzOtYzW tYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzO tYzWtYzOtYzWtYzOtYzWtYzOtYzWtYzOtYTWtYzOtYzWtYzOtYTWtYzOtYzW tYzOrYTOtYzOtYTWtYzOrYTOtYzOtYTWtYzOrYTOtYzOtYTWtYzOrYTOtYzO rYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYzOrYTOtYTOtYTOtYzOrYTO tYTOtYTOtYzOrYTOtYzOtYTWtYzOrYTOtYzOrYTOtYzOrYTOtYTOrYTWtYTO rYTOtYTOrYTOtYTOrYTOtYzOrYTOtYzOrYTOtYTOrYTOtYTOrYTOrYTOrYTO tYTOrYTOrYTOrYTOrYTOrYTOtYTOrYTOtYTOrYTOtYTOrYTOtYTOrYTOtYTO rYTOtYTOrYTOtYTOrYTOtYTOrXvOrYTOrYTOtYTOrXvOrYTOrYTOtYTOrYTO tYTOrYTOtYTOrYTOtYTOrYTOtYTOrXvOrYTOrYTOtYTOrXvOrYTOrYTOtYTO rXvOrYTOrYTOtYTOrXvOrYTOrYTOtYTOrXvOrYTOrYTOtYTOrXvOrYTOrYTO tYTOrXvOrYTOrYTOtYTOrXvOrYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTO rYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTO rYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTOtYTO rYTOrYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOtYTOrYTO tYTOrYTOtYTOrYTOtYTOrYTOtYTOrYTOtYzOrYTOtYTOrYTOtYzOrYTOtYTO rYTOtYTOrYTOtYTOrYTOtYTOrYTOtYTOrYTOtYTOrYTOtYTOrYTOtYTOrYQA 1rWMzq2E1rWMzrWE1rWMzq2E1rWMzrWE1rWMzrWE1rWMzrWE1rWMzrWE1rWM zrWE1rWMzq2E1rWMzrWE1rWMzq2E1rWMzrWE1rWMzq2E1rWMzrWE1rWMzq2E 1rWMzrWE1rWMzq2E1rWMzrWE1rWMzq2E1rWMzrWE1rWMzq2E1rWMzrWE1rWM zq2E1rWMzrWEzrWMzq2E1rWMzq2EzrWMzq2E1rWMzq2E1rWMzq2E1rWMzrWE 1rWMzq2E1rWMzrWE1rWMzq2E1rWMzq2E1rWMzq2E1rWMzq2E1rWMzq2E1rWM zrWE1rWMzq2E1rWMzrWE1rWMzq2E1rWMzrWE1rWMzq2E1rWMzrWEzrWMzq2E 1rWMzq2EzrWMzq2E1rWMzq2E1rWMzrWE1rWMzrWE1rWMzrWE1rWMzrWE1rWM zrWE1rWMzrWM1rWMzrWE1rWMzrWM1rWMzrWE1rWMzrWM1rWMzrWE1rWMzrWM 1rWEzq2E1rWMzrWE1rWEzq2E1rWMzrWE1rWMzrWE1rWMzrWM1rWMzrWE1rWM zrWM1rWMzrWE1rWMzrWM1rWMzrWE1rWMzrWM1rWMzrWE1rWMzrWM1rWMzrWE 1rWMzrWM1rWMzq2E1rWMzrWE1rWMzq2E1rWMzrWE1rWMzrWE1rWMzrWE1rWM zrWE1rWMzrWE1rWMzrWE1rWMzrWM1rWMzrWE1rWMzrWM1rWMzrWE1rWMzrWM 1rWMzrWE1rWMzrWM1rWMzrWE1rWMzrWM1rWMzrWE1rWMzrWM1rWMzrWE1rWM zrWM1rWMzrWE1rWMzrWM1rWMzrWE1rWMzrWM1rWMzrWE1rWMzrWM1rWMzrWE 1rWMzrWE1rWMzrWE1rWMzrWE1rWMzq2E1rWMzrWE1rWM1rWM1r2U1rWM1rWM 1rWM1r2M1rWM1rWMzrWM1rWM1rWM1rWMzrWM1rWM1rWM1rWM1rWM1rWM1rWM 1rWMzrWM1r2U1r2U3sac3r2c3r2c1rWU1r2U1rWU1r2U1rWU1r2U1rWU1r2U 1rWU1r2U1rWU3r2U1rWU1r2U1rWU3r2U1rWU1r2U1rWU1r2U1rWU1r2U1rWU 3r2c1r2U1r2U1rWU3r2c3r2c3sal1r2c1r2UzrWM1rWM1rWM1rWM1rWM1rWM zrWM1rWM1rWM1rWM1rWM1rWM1rWM1rWMzrWM1rWMzrWM1rWM1rWM1rWM1rWM 1rWM1rWM1rWM1rWM1rWMzrWM1rWM1rWM1rWMzrWM1rWM1rWM1rWMzrWM1rWM zrWM1rWMzq2E1rWMzq2M1rWMzq2M1rWMzrWM1rWMzrWM1rWM1rWM1rWMzrWE 1rWMzrWM1rWMzrWE1rWMzrWM1rWMzq2E1rWMzrWE1rWMzq2E1rWMzrWE1rWM zrWE1rWMzrWE1rWMzrWE1rWMzrWE1rWMzrWE1rWMzrWE1rWMzrWE1rWMzrWE 1rWMzrWE1rWMzrWE1rWMzrWE1rWMzrWE1rWMzrWE1rWMzrWE1rWMzrWE1rWM zrWE1rWMzq2E1rWM1rWM1rWM1rWM1rWMzrWM1rWMzq2E1rWMzrWE1rWMzq2E 1rWMzrWE1rWMzrWE1rWM1rWM1rWMzrWM1rWM1rWM1rWM1rWM1rWM1rWM1rWM 1rWM1rWM1rWM1rWMzrWM1rWM1rWM1rWMzrWM1rWM1rWM1rWMzrWM1rWM1rWM 1rWMzrWM1rWM1rWM1rWMzrWE1rWMzrWM1rWMzrWE1rWMzrWM1rWMzrWE1rWM zrWM1rWMzrWE1rWMzrWM1rWMzrWE1rWMzrWE1rWMzq2E1rWMzq2E1rWMzq2E 1rWMzrWE1rWMzq2E1rWMzrWE1rWMzrWE1rWMzrWE1rWMzrWE1rWMzrWE1rWM zrWE1rWMzrWE1rWMzq2E1rWMzq2E1rWEzq2E1rWMzq2E1rWEzq2E1rWEzq2E 1rWMzq2E1rWMzq2E1rWMzq2E1rWMzq2E1rWEzq2E1rWEzq2Ezq2Ezq2Ezq2E zq2Ezq2Ezq2E1rWEzq2Ezq2Ezq2E1rWEzq2E1rWEzq2E1rWEzq2E1rWEzq2E 1rWEzq2Ezq2Ezq17zq2Ezq2Ezq2Ezq17zq2Ezq2E1rWEzq2E1rWEzq2E1rWE zq2E1rWEzq2Ezq2Ezq17zq2Ezq2Ezq2Ezq17zq2Ezq2Ezq2Ezq17zq2Ezq2E zq2Ezq17zq2Ezq2Ezq2Ezq17zq2Ezq2Ezq2Ezq17zq2Ezq2Ezq2Ezq17zq2E zq2Ezq2Ezq17zq2Ezq2E1rWEzq2E1rWMzq2E1rWEzq2E1rWMzq2E1rWEzq2E 1rWMzq2E1rWEzq2E1rWMzq2E1rWEzq2E1rWMzq2E1rWEzq2E1rWMzq2Ezq2E zq2E1rWEzq2Ezq2Ezq2E1rWEzq2Ezq2Ezq2E1rWEzq2Ezq2Ezq2E1rWEzq2E 1rWEzq2E1rWMzq2E1rWEzq2E1rWMzq2Ezq2Ezq2E1rWEzq2Ezq2Ezq2E1rWE zq2E1rWMzq2E1rWMzq2E1rWMzq2E1rWMzq2Ezq2Ezq2E1rWEzq2Ezq2Ezq2E 1rWEzq2Ezq2Ezq2E1rWEzq2Ezq2Ezq2E1rWEzq2E1rWEAM6thNa1hM6thM6t hM6thNa1hM6thM6thM6thM61hM6te861hM6thM61hM6te861hM6thM61hM6t hM6thM6thM61hM6thM6thM6thM61hM6thM6thM6thM61hM6thM6thM6thM61 hM6thM6thM6thM61hM6thM6thM6thM61hM6thM6thM6thM61hM6thM6thM6t hM6thM6thM6thM6thM6thM6thM6thM6thM61hM6thM6thM6thM61hM6thM6t hM6thM61hM6thM6thM6thM61hM6thM6thM6thNa1hM6thM6thM6thNa1hM6t hM6thM6thM61hM6thM6thM6thM61hM6thM6thM6thM6thM6thM6thM6thM6t hM6thM6thM6thNa1hM6te861hM6thNa1hM6te861hM6thM61jM6thM61hM6t hM61jM6thM61hM6thM61jM6thM61hM6thM61jM6thM61hM6thM61hM6thM61 hM6thM61hM6thM61hM6thM61jM6thM61hM6thM61jM6thM61hM6thM61jM6t hM61hM6thM61jM6thM61hM6thM61jM6thM61hM6thM61jM6thM61hM6thM61 hM6thM6thM6thM61hM6thM6thM6thM61hM6thM61hM6thM61hM6thM61hM6t hM61jM6thM61hM6thM61jM6thM61hM6thM61jM6thM61hM6thM61jM6thM61 hM6thM61jM6thM61hM6thM61jM6thM61hM6thM61jM6thM61hM6thM61jM6t hM61hM6thM61jM6thM61hM6thM61jM6thM61hM6thM61hM6thM61hM6thM61 hM6thM61hM6thM61jM6thNa1jM61jNa1jM61hNa1jM6thNa1jM6thNa1jM6t hNa1jM6thM61jM6thNa1jM6thNa1jM6thNa1jM6thNa1jM6thM61jM6thNa1 jNa1lN69nNa1lNa1lNa1lNa1lNa1jNa1lNa1jNa1lM61jNa1lNa1jNa1lM61 jNa1lNa1jNa1lM61jNa1lM61lNa1lM61jNa1lM61jNa1lM61jNa1lNa1lNa1 lM61jNa9lNa9lN69nNa1lNa1lM6tjNa1jM6thNa1jM6tjNa1jM6thNa1jM6t hNa1jM6thNa1jM6thNa1jM6thM61jM6thNa1jM6thNa1jM6thNa1jM6thNa1 jM6thNa1jM6thNa1jM6thNa1jM6thNa1jM6thNa1jM6thM61jM6thNa1jM6t hM6tjM6thNa1jM6thM61jM6thM61jM6thM6tjM6thM61jM6thM61hM6thM61 jM6thM61hM6thM6thM6thM6thM6thM6thM6thM6thM6thM61hM6te861hM6t hM61hM6te861hM6thNa1hM6te861hM6thNa1hM6te861hM6te861hM6te86t hM6te861hM6te86thM6te861hM6te86thM6te861hM6te86thM6thM6thM6t hM61hM6thNa1jM6thM6thM6thM61jM6thM61hM6thM61jM6thM61hM6thNa1 jM6thM61jM6thNa1jM6thNa1jM6thNa1jM6thM61jM6thNa1jM6thM61jM6t hNa1jM6thNa1jM6thNa1jM6thNa1jM6thNa1jM6thM61jM6thNa1jM6thM61 jM6thM61jM6thM61hM6thM61jM6thM61hM6thM61jM6thM61hM6thM61jM6t hM61hM6thM61hM6thM6thM6thM6thM6thM6thM6thM61hM6thM6thM6thM61 hM6thM6thM6te861hM6te86thM6te861hM6te86thM6thM61hM6thM6thM6t hM6thM6thM6thM6te861hM6te86thM6te86thM6te86thM6thM6thM6thM6t hM6thM6thM6te86thM6thM6thM6te86thM6te86thMale86thM6te86thMal e86thM6te86thMale86thM6te86thMale86thM6te86thMale86thM6te86t hMale86thM6te86thMale86thM6te86thMale86thM6te86thMale86thM6t e86thMale86thM6te86thMale86thM6te86thMale86thM6te86thMale86t hM6te86thMale86thM6te86thMale86thM6te86thMale86thM6te86thMal e86thM6thM6thM6te86thM6thM6thM6te86thM6thM6thM6te86thM6thM6t hM6te86thM6te86thMale86thM6te86thMale86thM6thM6thM6te86thM6t hM6thM6te86thM6thM6thM6te86thM6thM6thM6te86thM6thM6thM6te86t hM6thM6thM6te86thM6te86thMale86thM6te86thMale86thM6thM6thM6t hM6thM6thM6thM6thM6thM6te86thM6te86thM6te86thM6te86thM6te86t hM6te86thM6te86thM6te86thM6tewDWtYTOrYTOrYTOrYTWtYTOrYTOrYTO rYTOtYTOrYTOtYTOrXvOtYTOrYTOtYTOrXvOtYTOrYTOrYTOrYTOtYTOrYTO rYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTOtYTO rYTOrYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTO tYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTOtYzOrYTOtYTO rYTOtYzOrYTOtYTOrYTWtYTOrYTOrYTOrYTWtYTOrYTOrYTOrYTOtYTOrYTO rYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTWtYTO rYTOtYTOrXvWtYTOrYTOtYTOrXvOtYzOrYTOtYTOrYTOtYzOrYTOtYTOrYTO tYzOrYTOtYTOrYTOtYzOrYTOtYTOrYTWtYTOrYTOtYTOrYTWtYTOrYTOtYTO rYTOtYzOrYTOtYTOrYTOtYzOrYTOtYTOrYTOtYzOrYTOtYTOrYTOtYzOrYTO tYTOrYTOtYzOrYTOtYTOrYTOtYzOrYTOtYTOrYTWtYzOrYTOtYzOrYTWtYzO rYTOtYzOrYTOtYTOrYTOtYTOrYTOtYTOrYTOtYTOrYTOtYzOrYTOtYTOrYTO tYzOrYTOtYTOrYTOtYzOrYTOtYTOrYTOtYzOrYTOtYTOrYTOtYzOrYTOtYTO rYTOtYzOrYTOtYTOrYTOtYzOrYTOtYTOrYTOtYzOrYTOtYTOrYTOtYzOrYTO tYTOrYTOtYzOrYTOtYTOrYTOtYTOrYTOtYTOrYTOtYTOrYTOtYTOrYTWtYzW tYzWtYzWtYzWvYzWtYzWtYzOrYTWtYzOrYTWtYzOrYTWtYzOtYTWtYzOrYTW tYzOrYTWtYzOrYTWtYzOrYTWtYzOrYTWtYzOrYTOtYzOrYzWtZTWtZTevZze vZzevZTWtZTWvZTWtZTWtZTWtZTWtZTOtYzWtZTWtYzWtZTOtYzWtZTWtYzW tZTOtYzWvZTOtZTWtZTOtYzWtZTOtZTWtZTOtZTWvZzWtZTWtZTOtYzWtZTW tZTevZzevZzWtYzWtYzWtYzOrYzWtYzOtYzWtYzOrYzWtYzOtYTWtYzOrYTW tYzOtYTWtYzOrYTWtYzOrYTWtYzOrYTWtYzOrYTWtYzOrYTWtYzOrYTWtYzO rYTWtYzOrYTWtYzOrYTWtYzOrYTOtYzOrYTWtYzOrYzWtYzOrYTWtYzOrYzW tYzOrYTWtYzOrYTOrYzOrYTWtYzOrYTOtYzOrYTWtYzOrYTOtYzOrYTOrYTO rYTOrYTOrYTOrYTOrYTOrYTOrYTOtYTOrYTOtYTOrXvOtYTOrYTOtYTOrXvW tYTOrYTOtYTOrXvWtYTOrYTOtYTOrXvOtYTOrXvOrYTOrXvOtYTOrXvOrYTO rXvOtYTOrXvOrYTOrXvOtYTOrXvOrYTOrXvOrYTOrYTOrYTOrYTWtYzOtYTO tYzOrYTWtYzOrYTOtYzOrYTWtYzOrYTOtYzOrYTWtYzOrYTWtYzOrYTWtYzO rYTWtYzOrYTWtYzOrYTOtYzOrYTWtYzOrYTOtYzOrYTWtYzOrYTWtYzOrYTW tYzOrYTWtYzOrYTWtYzOrYTOtYzOrYTWtYzOrYTOtYzOrYTOtYzOrYTOtYTO rYTOtYzOrYTOtYTOrYTOtYzOrYTOtYTOrYTOtYzOrYTOtYTOrYTOtYzOrYTO rYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTOtYTOrYTOrYTOrYTOtYTO rXvOrYTOrXvOtYTOrXvOrYTOrXvOtYzOrYTOrYTOrYTOtYTOrYTOrYTOrYTO tYTOrXvOrYTOrXvOrYTOrXvOrYTOrXvOrYTOrYTOrYTOrYTOrYTOrYTOrYTO rXvOrYTOrYTOrYTOrYTOrYTOrYTOrYTOrXvOrYTOrXvOrYTOrXvOrYTOrXvO rYTOrXvOrYTOrXvOrYTGpXvOrYTOrXvOrYTGpXvOrYTOrXvOrYTOrXvOrYTO rXvOrYTOrXvOrYTOrXvOrYTGpXvOrYTOrXvOrYTGpXvOrYTOrXvOrYTOrXvO rYTOrXvOrYTOrXvOrYTOrXvOrYTOrXvOrYTOrXvOrYTOrXvOrYTOrXvOrYTO rXvOrYTOrXvOrYTOrXvOrYTOrXvOrYTOrXvOrYTOrXvOrYTOrXvOrYTOrYTO rYTOrXvOrYTOrYTOrYTOrXvOrYTOrYTOrYTOrXvOrYTOrYTOrYTOrXvOrYTO rXvOrYTGpXvOrYTOrXvOrYTGpXvOrYTOrYTOrYTOrYTOrYTOrYTOrYTOrYTO rYTOrYTOrYTOrYTOrYTOrYTOrYTOrYTOrYTOrYTOrYTOrXvOrYTOrYTOrYTO rXvOrYTOrXvOrYTOrXvOrYTOrXvOrYTOrXvOrYTOrYTOrYTOrYTOrYTOrYTO rYTOrYTOrYTOrXvOrYTOrXvOrYTOrXvOrYTOrXvOrYTOrXvOrYTOrXvOrYTO rXvOrYTOrXvOrYQAxq17zq17zq17zq2Exq17zq17zq17zq2Exq17zq17zq17 zq2Exq17zq17zq17zq2Exq17zq17zq17zq2Exq17zq17zq17zq2Exq17zq17 zq17zq17xqV7zq17zq17zq2ExqV7zq17xq17zq17xqV7zq17xq17zq17xqV7 zq17xq17zq17xqV7zq17xq17zq17xq17zq17zq17zq2Exq17zq17zq17zq2E zqV7zq17zq17zq2EzqV7zq17zq17zq2ExqV7zq17xq17zq17xqV7zq17xq17 zq17zq17zq2Ezq17zq2Ezq17zq2Ezq17zq2ExqV7zq17xq17zq17xqV7zq17 xq17zq17xq17zq17zq17zq2Exq17zq17zq17zq2Exq17zq17zq17zq2Exq17 zq17zq17zq2Exq17zq2Exq2Ezq2Exq17zq2Exq2Ezq2Exq17zq2Exq2Ezq2E xq17zq2Exq2Ezq2Exq17zq2Exq2Ezq2Exq17zq2Exq2Ezq2ExqV7zq2Exq17 zq2ExqV7zq2Exq17zq2ExqV7zq2Exq17zq2ExqV7zq2Exq17zq2ExqV7zq2E xq17zq2ExqV7zq2Exq17zq2ExqV7zq2Exq17zq2ExqV7zq2Exq17zq2Ezq17 zq2Ezq2Ezq2Ezq17zq2Ezq2Ezq2Ezq17zq2Ezq2Ezq2Ezq17zq2Ezq2Ezq2E xqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2Ezq17zq2Ezq17zq2Ezq17zq2Ezq17 zq2Ezq17zq2Ezq171q2Ezq171q2Ezq2E1q2EzqV7zq2Ezq2E1q2Ezq2E1q2E zq2E1q2ExqWEzq2Ezq2Ezq2Mzq2EzrWMzq2E1rWMzq2E1q2Mzq2E1q2Mzq2E zq2Ezq2E1q2Mzq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2M zq2Ezq2Ezq2Ezq2Mzq2EzrWMzq2EzrWMxq2Ezq2E1rWM3r2U1rWU1rWU1rWU 1rWU1rWM1rWMzrWM1rWMzq2M1rWMzq2M1rWMzq2M1rWMzq2M1rWMzq2M1rWM zq2M1rWUzq2M1rWMzq2M1rWUzq2M1rWMzq2M1rWU1rWM1rWU1rWM1rWU3r2c 3rWc1q2Uzq2Mzq2Ezq2Ezq2EzrWMzq2E1rWMzrWE1rWMzq2Ezq2Ezq2EzrWE zq2Ezq2Ezq2Ezq2Mzq2Ezq2Ezq2Ezq2Mzq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2E zq2Exq17zq2Ezq17zq2Exq17zq2Ezq17zq2Exq2Ezq2Ezq2Ezq2Exq2Ezq2E zq2Ezq2Ezq17zq2Ezq2EzrWEzq17zq2Ezq2EzrWExq17zq2Ezq17zq2Exq17 zq2Exq17zq2ExqV7zq17xq17zq17xqV7zq17xq17zq17xq17zq17zq17zq2E xq17zq17zq17zq2Exq17zq17zq17zq2Exq17zq17zq17zq2Exq17zq17zq17 zq2Exq17zq17zq17zq2ExqV7zq2Exq17zq2Exq2Ezq2Ezq2EzrWMxq17zq2E zq17zq2Exq17zq2Ezq17zq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2E zq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2E zq17zq2Ezq2EzrWEzq17zq2Ezq2EzrWExq17zq2Exq17zq2Exq17zq2Exq17 zq2Exq17zq2Exq2Ezq2Exq17zq2Exq2Ezq2Exq17zq17zq17zq2Exq17zq17 zq17zq2Exq17zq17zq17zq2Exq17zq17zq17zq2Exq17zq17zq17zq2Exq17 zq17zq17zq2ExqV7zq2Ezq17zq2ExqV7zq2Ezq17zq2ExqV7zq2ExqV7zq2E xqV7zq2ExqV7zq2EzqV7zq2EzqV7zq2EzqV7zq2EzqV7zq2ExqV7zq2ExqV7 zq2ExqV7zq17xqV7zq17xqV7zq17xqV7zq2ExqV7zq17xqV7zq2ExqV7zqV7 xqV7zqV7xqV7zqV7xqV7zqV7xqV7zq17xqV7zq2ExqV7zq17xqV7zq2ExqV7 zq17xqV7zq2ExqV7zq17xqV7zq2ExqV7xqV7xqV7zq17xqV7xqV7xqV7zq17 xqV7zq17xqV7zq2ExqV7zq17xqV7zq2ExqV7zq17xqV7zq2ExqV7zq17xqV7 zq2ExqV7zq17xqV7zq2ExqV7zq17xqV7zq2ExqV7zq17xqV7zq2ExqV7zq17 xqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7 zq2ExqV7zq2EzqV7zq2EzqV7zq2EzqV7zq2EzqV7zq2EzqV7zq2EzqV7zq2E zqV7zq2EzqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2EzqV7zq2EzqV7 zq2EzqV7zq2EzqV7zq2EzqV7zq2EzqV7zq2EzqV7zq2EzqV7zq2EzqV7zq2E zqV7zq2EzqV7zq2EzqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2EzqV7 AM6thM6te86thM6te86thM6te86thM6te86thM6te86thM6te86thM6te86t hM6te86thM6te86thM6te86thM6te86thM6te86thM6te86thM6te86te86t e86thM6te86te8ate86thM6te86te8ate86thM6te86te8ate86thM6te86t e8ate86thM6te86thM6te86thM6te86thM6te86thM6te86thM6te9athM6t e86thM6te9athM6te86te8ate86thM6te86te8ate86thM6te86thM6te86t hM6te86thM6te86thM6te86te8ate86thM6te86te8ate86thM6te86thM6t e86thM6te86thM6te86thM6te86thM6te86thM6te86thM6te86thM6te86t hM6te86thM6thM6thM6te86thM6thM6thM6thM6thM6thM6thM6thM6thM6t hM6thM6thM6thM6thM6thM6thM6thM6thM6thM6te86thM6thM6thM6te86t hM6thM6thM6te86thM6thM6thM6te86thM6thM6thM6te86thM6thM6thM6t e86thM6thM6thM6te86thM6thM6thM6te86thM6thM6thM6thM6thM6thM6t hM6thM6thM6thM6thM6thM6thM6thM6thM6thM6thM6thM6thM6te86thM6t hM6thM6te86thM6thM6thM6te86thM6te86thM6te86thM6te9athM6te9at hM6te9athM6thNathM6thNathM6thNathM6thM6thM6le9athM6thM6thM6t hNa1jM6thNa1jM6thNa1jM6thNatjM6thNatjM6thM6thM6thM6thM6thM6t hM6thNatjM6thM6thM6thNatjM6thM6thM6thNatjM6thM6thM6thNatjM6t hM6thM6thNa1jM6thM6thM6thNa1jNa1jN69nNa1lNa1lNa1jNa1lNa1jNa1 jNa1jNa1jM6tjNa1lNa1jNa1jM6tjNa1lNa1jNa1jM6tjNa1lM6tjNa1jM6t jNa1lM6tjNa1jM6tjNa1lNa1jNa1lNa1jNa1lNa1jNa1lNa1lN69nNa1jM6t jM6thM6thM6thNa1hM6thNa1jM6thNa1hM6thNa1hM6thM6thM6thNatjM6t hM6thM6thNatjM6thM6thM6thNatjM6thM6thM6thNatjM6thM6thM6te86t hM6thM6thM6te86thM6thM6thM6thM6thM6thM6thM6thM6thM6thM6thM6t e86thM6thM6thM6te86thM6thM6thM6te86thM6te86thM6te86thM6te86t hM6te86thM6te86thM6te86thM6te86thM6te86thM6te86thM6te86thM6t e86thM6te86thM6te86thM6te86thM6te86thM6te86thM6te86thM6te86t hM6te86thM6te86thM6thM6thM6thNa1jM6thM6thM6te86thM6thM6thM6t e86thM6thM6thM6thM6thM6thM6thM6thM6thM6thM6thM6thNatjM6thM6t hM6thNatjM6thM6thM6thNatjM6thM6thM6thNatjM6thM6thM6te86thM6t hM6thM6te86thM6thM6thM6te86thM6te86thM6te86thM6te86thM6thM6t hM6thM6thM6thM6thM6thM6thM6te86thM6te86thM6te86thM6te86thM6t e86thM6te86thM6te86thM6te86thM6te86thM6te86thM6te86thM6te86t hM6te86thM6thM6thM6te86thM6thM6thMale86thM6te86thMale86thM6t e86thM6le86thM6le86thM6le86thM6le86thMale86thMale86te8ale86t hMale86te8ale86thMale86te8ale86thMale86le8ale86thM6le86le8al e86thM6le86te8ale86thMale86te8ale86thMale86te8ale86thMale86t e8ale86thMale86te8ale86thMale86te8ale86thMale86te8ale86thMal e86te8ale86thMale86te8ale86thMale86te8ale86thMale86te8ale86t hMale86te8ale86thMale86te8ale86thMale86te8ale86thMale86thMal e86thMale86thMale86thMale86thMale86thMale86thMale86thMale86t hM6le86thM6le86thM6le86thM6le86thM6le86thM6le86thM6le86thM6l e86thMale86thMale86thMale86thMale86thM6le86thM6le86thM6le86t hM6le86thM6le86thM6le86thM6le86thM6le86thM6le86thM6le86thM6l e86thM6le86thMale86thMale86thMale86thMale86thADOpXvOrXvGpXvO rXvOpXvOrXvGpXvOrXvOpXvOrXvGpXvOrXvOpXvOrXvGpXvOrXvOpXvOrXvG pXvOrXvOpXvOrXvGpXvOrXvOpXvOrXvGpXvOpXvGpXvOrXvGpXvOrXvGpXvO rXvGpXvOpXvGpXvOrXvGpXvOpXvGpXvOrXvGpXvOpXvGpXvOrXvGpXvOpXvO pXvOrXvGpXvOrXvOpXvOrXvGpXvOrXvOpXvOrXvGpXvOrXvOpXvOrXvGpXvO rXvGpXvOrXvGpXvOpXvGpXvOrXvGpXvOpXvGpXvOrXvGpXvOrXvGpXvOrXvG pXvOrXvGpXvOrXvGpXvOpXvGpXvOrXvGpXvOpXvOpXvOrXvGpXvOrXvOpXvO rXvGpXvOrXvOpXvOrXvGpXvOrXvOpXvOrXvGpXvOrXvGpXvOrYTGpXvOrXvG pXvOrYTGpXvOrXvGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvO rYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTG pXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvO rYTGpXvOrYTGpXvOrYTGpXvOrYTOpXvOrYTGpXvOrYTOpXvOrYTGpXvOrYTO pXvOrYTGpXvOrYTOpXvOrYTGpXvOrYTGpXvOrYTGpXvOpXvGpXvOrYTGpXvO pXvOpXvOrXvGpXvOrXvOpXvOrXvGpXvOrXvOpXvOrXvOpXvOrXvOpXvOrYTO pXvOpYTOpXvOpXvGpXvOpXvGpXvOrYTOpXvOrYTOrYTOrYTOrYTOrYTOrYTO rYTOpYTOrYTOpYTOrYTOpXvOrYTOpXvOrYTOpXvOpYTOpYTOrYTGpXvOrYTO pYTOrYTGpXvOrYTOpYTOrYTGpXvOrYTOpYTOrYTGpXvOrYTOpYTOrYTOrYTO rYTOpYTOrYTGpXvOrYTWrZTWtZTWrYzWtZTOrYzWtYzOrYTWtYzOrYzWtYzO rYTOrYzOrYzWtYzOrYTOrYzOrYzOrYzOrYTOrYzOrYzOrYzOrYTOrYzOrYTO rYzOrYTOrYzOrYzWtYzOrYzOrYzOrYzWtZTWtYzWtZTOrYzOrYzGpYTOrYTO rYTOrYTGpXvOrYTOrYTOrYTOrXvOrYTOpYTOrYTGpXvOrYTOpYTOrYTGpXvO rYTOpYTOrYTGpXvOrYTOpYTOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTG pXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvO rYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrXvGpXvOrXvG pXvOrXvGpXvOrXvGpXvOrXvGpXvOrXvGpXvOrXvGpXvOrXvOpXvOrXvGpXvO rXvOpXvOrXvGpXvOrXvOpXvOrXvGpXvOrXvOpXvOrXvGpXvOrXvGpXvOrYTG pXvOrYTGpXvOrYTOrXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTOpXvO rYTOpXvOrYTOpXvOrYTOpXvOrYTOpYTOrYTOpXvOrYTOpYTOrYTOpXvOrYTO pYTOrYTOpXvOrYTOpYTOrYTOpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvO rYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTGpXvOrYTG pXvOrYTOpXvOrXvGpXvOrXvOpXvOrXvGpXvOrXvOpXvOrXvGpXvOrXvOpXvO rXvGpXvOrXvOpXvOrXvGpXvOrXvOpXvOrXvGpXvOrXvOpXvOrYTGpXvOrYTO pXvOrYTGpXvOrYTGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvO pXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvGpXvGpXvGpXvGnHPGpXvGpXvGpXvG nHPGpXvGpXvGpXvGnHPGpXvGpXvOpXvGnHPGpXvGpXvOpXvGnHPGpXvGpXvG pXvGnHPGpXvGpXvGpXvGnHPGpXvGpXvGpXvGnHPGpXvGpXvGpXvGnHPGpXvG pXvGpXvGnHPGpXvGpXvGpXvGnHPGpXvGpXvGpXvGnHPGpXvGpXvGpXvGnHPG pXvGpXvGpXvGnHPGpXvGpXvGpXvGnHPGpXvGpXvGpXvGnHPGpXvGpXvGpXvG nHPGpXvGpXvGpXvGnHPGpXvGpXvGpXvGnHPGpXvGpXvOpXvGpXvGpXvGpXvO pXvGpXvGpXvGpXvOpXvGpXvGpXvGpXvOpXvGpXvGpXvGpXvOpXvGpXvOpXvG pXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvG pXvGpXvOpXvGpXvGpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvG pXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvO pXvGpXvGpXvGpXvOpXvGpXvGpXvGpXsAzq17zqV7zq17xqV7zq17zqV7zq17 xqV7zq17zqV7zq17xqV7zq17zqV7zq17xqV7zq17zqV7zq17xqV7zq17zqV7 zq17xqV7zq17xqV7zq17xqV7zq17xqV7zq17xqV7zq17xqV7zqV7xqV7zq17 xqV7zqV7xqV7zq17xqV7zqV7xqV7zq17xqV7zqV7xqV7zq17zqV7zq17xqV7 zq17zqV7zq17xqV7zq17zqV7zq17xqV7zq17zqV7zq17xqV7zq17xqV7zqV7 xqV7zq17xqV7zqV7xqV7zq17xqV7zq17xqV7zq17xqV7zq17xqV7zq17xqV7 zqV7xqV7zq17xqV7zqV7xqV7zq17zqV7zq17xqV7zq17zqV7zq17xqV7zq17 zqV7zq17xqV7zq17zqV7zq17xqV7zq2ExqV7zq17xqV7zq2ExqV7zq17xqV7 zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2E xqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7 zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2E xqV7zq2ExqV7zq2EzqV7zq2ExqV7zq2EzqV7zq2ExqV7zq2EzqV7zq2ExqV7 zq2EzqV7zq2ExqV7zq2EzqV7zq2ExqV7zq2EzqV7zq2ExqV7zq17zqV7zq17 xqV7zq17zqV7zq17xqV7zq2EzqV7zq17zqV7zq2EzqV7zqWExqV7zqWExqV7 zqWEzqV7zq2Ezq2E1q2Ezq2Ezq2Ezq2Ezq2Ezq2Ezq2EzqWEzq2ExqV7zq2E zqWEzq2EzqV7zq2EzqV7zq2ExqV7zq2EzqWEzq2ExqV7zq2EzqWEzq2ExqV7 zq2EzqWEzq2ExqV7zq2EzqWEzq2ExqV7zq2Ezq2Ezq2EzqWEzq2EzqWEzq2E xqV7zq2Ezq2M3rWU3rWU3rWU1q2M1q2Mzq2M1rWMzq2M1q2Mzq2M1q2Mzq2M 1q2Mzq2M1q2Mzq2M1q2Mzq2M1q2Mzq2M1q2Mzq2M1q2Mzq2E1q2Mzq2E1q2M zq2M1q2Mzq2M1rWMzq2M1q2M1q2M3rWU1rWU1rWMzqWEzq2EzqWEzq2ExqV7 zq2Ezq2Ezq2ExqV7zq2EzqWEzq2ExqV7zq2EzqWEzq2ExqV7zq2EzqWEzq2E xqV7zq2EzqWEzq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7 zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2E xqV7zq2ExqV7zq2ExqV7zq17xqV7zq17zqV7zq17xqV7zq17zqV7zq17xqV7 zq17xqV7zq17xqV7zq17xqV7zq17xqV7zq17zqV7zq17xqV7zq17zqV7zq17 xqV7zq17zqV7zq17xqV7zq17zqV7zq17xqV7zq2ExqV7zq17xqV7zq2ExqV7 zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2EzqV7zq2EzqV7zq2E zqV7zq2EzqV7zq2EzqWEzq2EzqV7zq2EzqWEzq2EzqV7zq2EzqWEzq2EzqV7 zq2EzqWEzq2EzqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2E xqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq2ExqV7zq17zqV7 zq17xqV7zq17zqV7zq17xqV7zq17zqV7zq17xqV7zq17zqV7zq17xqV7zq17 zqV7zq17xqV7zq17zqV7zq17xqV7zq2EzqV7zq2ExqV7zq2EzqV7zq2ExqV7 zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7 xqV7zqV7xqV7zqV7xqV7zqV7xqV7xqV7xqV7zqV7xqV7xqV7xqV7zqV7xqV7 xqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7xqV7xqV7zqV7 xqV7xqV7xqV7zqV7xqV7xqV7xqV7zqV7xqV7xqV7xqV7zqV7xqV7xqV7xqV7 zqV7xqV7xqV7xqV7zqV7xqV7xqV7xqV7zqV7xqV7xqV7xqV7zqV7xqV7xqV7 xqV7zqV7xqV7xqV7xqV7zqV7xqV7xqV7xqV7zqV7xqV7xqV7xqV7zqV7xqV7 xqV7xqV7zqV7xqV7xqV7xqV7zqV7xqV7xqV7xqV7zqV7xqV7xqV7xqV7zqV7 xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7 zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7 xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7 zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7xqV7zqV7 xqV7zqV7xqV7zqV7AMale86le8ale86le8ale86le8ale86le8ale86le8al e86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86l e8ale86le8acc8ale8ale86le8acc8ale8ale86le8acc8ale8ale86le8ac c8ale8ale86le8acc8ale8ale86le8ale86le8ale86le8ale86le8ale86l e8acc8ale8ale86le8acc8ale8ale86le8acc8ale8ale86le8acc8ale8al e86le8acc8ale8ale86le8acc8ale8ale86le8acc8ale8ale86le8acc8al e8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8al e86le8ale86le8acc8ale8ale8ale8acc8ale8ale8ale8ale8ale8ale86l e8ale8ale8ale86le8ale8ale8ale86le8ale8ale8ale86le8ale86le8al e86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86l e8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8al e86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86l e8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8al e86le8alc86le8ale86le8ace86le8ace86lhMale86le86le86thM6le86t hM6lhM6thMale86lhMale86lhMale86le8ale86lhMale86lhMale86lhMal e86le8ale86le8ale86le8ale86lhMale86le8ale86lhMale86le8ale86l hMale86le8ale86lhMale86lhMale86lhMale86lhMale86lhL2ce86lhM6t jNa1lNa1jNa1jM6tjM6tjM6lhM6tjM6thM6tjM6lhM6tjM6lhM6tjM6lhM6t jM6thM6tjM6lhM6tjM6thM6tjM6lhM6tjM6lhM6tjM6lhM6tjM6lhM6tjM6t hM6tjM6lhNatjNatjNa1lNatjNatjM6le86lhMale86le8ale86lhMale86l hMale86le8ale86lhMale86le8ale86lhMale86le8ale86lhMale86le8al e86lhMale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86l e8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ac e8ale8ale8ale8ale86le8ale86le8ale86le8ale86le8ale86le8ale86l e8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8al e86le8ale86le8ale86le8ale8ale8ale8ale8ale8ale8ale86le8ale86l e8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8al e86le8ale86lhMale86le8ale86lhMale86le8ale86lhMale86le8ale86l hMale86le8ale86le8ale86le8ale86le8ace8ale8ale86le8ace8ale8al e86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86l e8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8al e86le8ale86le8ale86le8ale86le8ale86le8ale86le8acc8ale8ale86l e8acc8ale8ale86le8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8ac c8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8al e8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8ac c8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8al e8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8ac c8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8al e8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8ale86le8ac c8ale8ale86le8acc8ale8ale86le8acc8ale8ale86le8acc8ale8ale86l e8acc8ale8ale86le8acc8ale8ale86le8acc8ale8ale86le8acc8ale8al e86le8acc8ale8ale86le8acc8ale8ale86le8acc8ale8ale86le8acc8al e8ale86le8acc8ale8ale86le8acc8ale8ale86le8acc8ale8ale86le8al ewDOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvO pXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvG pXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvO pXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvGpXvGnHPOpXvG pXvGpXvGnHPOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvO pXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvG pXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvG pXvGpXvOpXvGpXvGpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvG pXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvO pXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvG pXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvO pXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvG pXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvO pXvGpXvOpXvGpXvOpYTOpXvOrYTOpYTWrYzOpYTOrYTOpYTOpYTGpXvOpXvG pXvOpYTGpXvOpYTGpXvOpYTGpXvOpYTGpXvOpYTOpXvOpYTGpXvOpYTGpXvO pXvGpXvOpYTGpXvOpXvGpXvOpYTGpXvOpYTGpXvOpYTGpXvOpYTGpXvOpYTG pXvOpYTGpXvOpYTGpXvOpYTGpXvOrYTOpXvOrYTGpXvGpYTOpYTWtYzWtZTW tZTOrYzWrYzOrYzWrYzOrYzOrYzOpYTOrYzOpYTOrYzOrYTWrYzOrYTOrYzO rYTWrYzOrYTOrYzOpYTOrYzOrYTOrYzOpYTOrYzOrYTOrYTOrYTWrYzOrYTO rYzOrYzWtZTWtZTWrYzOpYTOrYTOpYTOpYTGpXvOpYTGpXvOpYTGpXvOpYTG pXvOpYTGpXvOpYTGpXvOpXvGpXvOpYTGpXvOpXvGpXvOpYTGpXvOpXvGpXvO pXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpYTG pXvOpYTGpXvOpYTGpXvOpYTGpXvOpXvGpXvOpXvGpXvOpXvGnHvOpXvGpXvO pXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvG pXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvO pXvGpXvGpXvGpXvOpXvGpXvGpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvG pXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpYTGpXvO pXvGpXvOpYTGpXvOpXvGpXvOpYTGpXvOpXvGpXvOpYTGpXvOpXvGpXvOpXvG pXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvO pXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvG pXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvO pXvGpXvOpXvGpXvOpXvGpXvOpXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvG pXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPG pXvGnHPGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPGpXvGnHPGpXvG nHPGpXvGnHPGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvG pXvGnHPOpXvGpXvGpXvGnHPGpXvGnHPGpXvGnHPGpXvGnHPGpXvGnHPOpXvG pXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPO pXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvG nHPGpXvGnHPGpXvGnHPGpXvGnHPGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvG pXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvG pXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPO pXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvG nHPOpXvGpXvGpXvGnHPOpXvGpXvGpXvGnHPOpXvGpXvOpXsAxpxzzqV7xpxz xqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7 xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzzqV7xpxz zqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7 xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxz xqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7 xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxz zqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzxqV7xpxzxqV7 xpxzxqV7xpxzxqV7xqV7zqV7xpxzxqV7xqV7zqV7xpxzxqV7xqV7zqV7xpxz xqV7xqV7zqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxzxqV7 xpxzxqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxz xqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxzzqV7xpxzzqV7xpxzzqV7xpxzzqV7 xpxzxqV7xpxzxpx7xpxzxqV7xpxzxpx7xpxzzqV7xpxzxqV7xpxzzqV7xpxz xqV7xpxzzqV7xpxzzqV7xpxzzqV7xpxzzqV7xpxzxqV7xpx7zqV7xqV7zqWE xqV7zqWEzqV7zqWExqV7zqWExpx7zqV7xpx7xqV7xpx7zqV7xpx7xqV7xpx7 zqV7xpxzxqV7xqV7zqV7xpx7zqV7xpx7zqV7xpxzzqV7xpx7zqV7xpx7xqV7 xpx7zqV7xpx7xqV7xqV7zqV7xpx7zqV7xqV7zqV7xpx7zqV7xqV7zqV7xpx7 zqV7xqV7zqV7xqV7zqV7xqV7xqV7vZxzxqV7zqWE1q2M1q2M1q2UzqWE1q2M zqWEzq2MzqWEzq2MzqWEzqWEzqWEzq2EzqWEzqWEzqWEzq2EzqWEzqWEzqWE zq2EzqWEzqWEzqWEzq2EzqWEzqWEzqV7zq2EzqWEzq2EzqWEzqWEzqWM1q2U zq2E1q2MzqWEzqWExpx7zqV7xpx7zqV7xqV7zqV7xpx7zqV7xqV7zqV7xpx7 zqV7xpx7zqV7xpx7xqV7xpx7zqV7xpx7xqV7xpx7zqV7xpx7xqV7xpx7zqV7 xpx7xqV7xqV7zqV7xpxzxqV7xqV7zqV7xpxzxqV7xpx7zqV7xpx7xqV7xpx7 zqV7xpx7xqV7xpx7xqV7xpxzxqV7xpx7xqV7xpxzxqV7xpxzzqV7xpxzxqV7 xpxzzqV7xpxzxqV7xpxzzqV7xpxzzqV7xpxzzqV7xpxzzqV7xpxzzqV7xpxz xqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzxqV7 xpxzxqV7xpxzxqV7xpxzxqV7xpx7zqV7xpx7xqV7xpx7zqV7xpx7xqV7xpx7 zqV7xpxzzqV7xpx7zqV7xpxzzqV7xpx7zqV7xpx7zqV7xpx7zqV7xpx7zqV7 xpx7zqV7xpx7zqV7xpx7zqV7xpx7zqV7xpx7xqV7xpxzxqV7xpx7xqV7xpxz xqV7xpx7xqV7xpxzxqV7xpx7xqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxzxqV7 xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxz zqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7xpxzzqV7xpxzxqV7 xpxzzqV7xpxzxqV7xpxzxpx7xpxzxpxzxpxzxpx7xpxzxpxzxpxzxqV7vZxz xpxzxpxzxqV7vZxzxpxzxpxzxpx7xpxzxpxzxpxzxpxzxpxzxpxzxpxzxpx7 xpxzxpxzxpxzxpx7xpxzxpxzvZxzxpxzvZxzxpxzvZxzxpxzvZxzxpxzxpxz xpx7xpxzxpxzxpxzxpx7xpxzxpxzxpxzxpx7xpxzxpxzxpxzxpx7xpxzxpxz xpxzxpxzxpxzxpxzxpxzxpxzxpxzxpxzxpxzxpx7xpxzxpxzxpxzxpx7xpxz xpxzxpxzxpx7xpxzxpxzxpxzxpx7xpxzxpxzxpxzxpx7xpxzxpxzxpxzxpx7 xpxzxpxzxpxzxpx7xpxzxpxzxpxzxpx7xpxzxpxzxpxzxpxzxpxzxpxzxpxz xpxzxpxzxpxzxpxzxpx7xpxzxpxzxpxzxpx7xpxzxpxzxpxzxqV7vZxzxpxz xpxzxqV7vZxzxpxzxpxzxqV7vZxzxpxzxpxzxqV7vZxzxpxzxpxzxpx7xpxz xpxzxpxzxpx7xpxzxpxzxpxzxqV7vZxzxpxzxpxzxqV7vZxzxpxzxpxzxqV7 vZxzxpxzxpxzxqV7vZxzxpxzxpxzxqV7vZxzxpxzxpxzxqV7vZxzxpxzxpxz xpx7xpxzxpxzxpxzxpx7xpxzxpxzvZxzAM6le8ace86le8acc86le8ace86l e8acc86le8ace86le8acc86le8ace86le8acc86le8ace86le8acc86le8ac e86le8acc86le8ale86le8ace86le8ace86le8ace86le8ace86le8ace86l e8ace86le8ace86le8ace86le8ace86le8ace86le8ace86le8ace86le8ac c86le8ace86le8acc8ale8ace8ale8acc8ale8ace8ale8acc86le8ace86l e8ace86le8ace86le8ace86le8ace86le8ace86le8ace86le8ace86le8ac e86le8ace86le8ace86le8ace86le8ace86le8acc86le8ace86le8acc86l e8ace86le8acc86le8ace86le8acc86le8ale8ale8acc86le8ale8ale8ac c86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86l e8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8al e86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86le8ale86l e8ale86le8ale86le8ale86le8ace86le8ale86le8ace86le8acc8ale8ac c86le8acc8ale8acc86le8ace86le8acc86le8ace86le8acc86le8ale86l e8ace86le8ale86le8ace86le8ale86le8ale86lhM6lhM6lhM6lhM6lhMac e8ale8ace8ale8ace86lhMace86le8ale86le8ace86le8ace8ale8acc86l e8ale86le8ace86le8ace86le8ace86le8ale86le8ace86le8ale86le8ac e86lhMale86le8ale86lhMale86le8ale86le8ale86le8ale86le8ale86l e8ale8ale8ale86lhMale86lhMalhNatjN61lNatjM6tjNatjM6lhNatjM6l hM6tjM6lhM6thM6lhM6thM6lhM6thM6lhM6thM6lhM6thM6lhM6thM6lhM6t hM6lhM6lhM6lhM6thM6le86thM6lhM6tjM6lhM6ljM6lhNa1jNatjNatjM6l hM6lhMace86lhMale86lhMale86le8ale86lhMale86le8ale86le8ale86l e8ale86le8ale86le8ale86le8ale86le8ace86le8ale86le8ace86le8al e86le8ale86le8ale86le8ale86le8ace8ale8ace86le8ace8ale8ace86l e8ale86le8ace86le8ace8ale8ace86le8ace86le8ace86le8ace86le8ac e86le8ale86le8ace86le8ale86le8ace86le8ace86le8acc86le8ace86l e8acc86le8ace86le8acc86le8ace86le8acc86le8ale8ale8acc8ale8al e8ale8ale86le8ale86le8ace86le8ale86le8ace86le8ale86le8ace86l e8ale86le8ace86le86le86le8ale86le86le86le8ale86le86le86le8al e86le86le86le8ale86le8ale86le8ace86le8ale86le8ace86le8ale86l e8ace86le8ale86le8ace86le8ale8ale8acc86le8ale8ale8acc86le8ac e86le8acc86le8ace86le8acc86le8ace86le8acc86le8ace86le8acc86l e8ace86le8acc86le8ace86le8acc86le8acc86le8acc86le8acc86le8ac c86le8acc8ale8acc86le8acc8ale8acc8ale8acc8acc72cc8ale8acc8ac c72cc8ale8acc8acc8acc8ace8acc8acc8acc8ace8acc8acc8acc8ace8ac c8acc8acc8acc72cc8acc72cc8acc72cc8acc72cc8ace8acc8acc8acc8ac e8acc8acc8acc8ace8acc8acc8acc8ace8acc8acc8acc8acc8acc8acc8ac c8acc8acc8acc8acc8ace8acc8acc8acc8ace8acc8acc8acc8ace8acc8ac c8acc8ace8acc8acc8acc8ace8acc8acc8acc8ace8acc8acc8acc8ace8ac c8acc8acc8ace8acc8acc8acc8acc8acc8acc8acc8acc8acc8acc8acc8al e8acc8ace8acc8ale8acc8ace8acc8ale8acc8ale8acc8ale8acc8ale8ac c8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ace8acc8ale8acc8ac e8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8ac c8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ale8acc8ace8acc8al e8acc8ace8acc8alewDGnHPGnHvGnHPGpXvGnHPGnHvGnHPGpXvGnHPGnHvG nHPGpXvGnHPGnHvGnHPGpXvGnHPGnHvGnHPGpXvGnHPGnHvGnHPGpXu9nHPG nHvGnHPGnHu9nHPGnHvGnHPGnHvGnHPGnHvGnHPGpXvGnHPGnHvGnHPGpXu9 nHPGnHvGnHPGnHu9nHPGnHvGnHPGnHvGnHPGnHvGnHPGpXvGnHPGnHvGnHPG pXvGnHPGnHvGnHPGpXvGnHPGnHvGnHPGpXvGnHPGnHvGnHPGnHvGnHPGnHvG nHPGnHvGnHPGnHvGnHPGpXvGnHPGnHvGnHPGpXvGnHPGnHvGnHPGpXvGnHPG nHvGnHPGpXvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGpXvG nHPGnHvGnHPGpXvGnHPGnHPGnHPGnHvGnHPGnHPGnHPGnHu9nHPGnHvGnHPG nHu9nHPGnHvGnHPGnHu9nHPGnHvGnHPGnHu9nHPGnHvGnHPGnHu9nHPGnHvG nHPGnHu9nHPGnHvGnHPGnHu9nHPGnHvGnHPGnHu9nHPGnHvGnHPGnHu9nHPG nHvGnHPGnHu9nHPGnHvGnHPGnHu9nHPGnHvGnHPGnHu9nHPGnHvGnHPGnHvG nHPGnHvGnHPGpXvGnHPGnHvGnHPGpXvGnHPGnHvGnHvGnHvGnHPGnHvGnHvG nHu9nHPGnHu9nHPGnHu9nHPGnHvGnHvGnHu9nHPGnHvGnHPGnHvGnHPGnHvG nHvGpXvGnHvGpXvGnHvGpXvGnHvGnHvGnHvGnHvGnHPGnHvGnHPGpXvGnHPG nHvGnHPGpXvGnHvGnHvGnHvGnHvGnHvGnHvGnHvGnHu9nHPGnHvGnHvGnHu9 nHPGnHvGnHvGnHvGnHvGpXvGnHvGpXvGnHvGpXvGnHvGpXvGnHvGnHvGnHvG nHvGnHvGnHvGnHvGnHvGnHvGpXvGnHvOpYTGnHvGpXvGnHvOpYTGnHvGpXvG nHvGpYTGnHvGpYTGnHvOpYTWtZTWrYzGpYTOpYzGpYTOpYTGpYTOrYzGnHvO pYTOpYTOpYTGpXvOpYTGpXvOpYTGpXvOpYTGpXvOpYTGpXvOpYTGpXvOpYTG pYTOpYTOpYTOpYTGpYTOpYTOpYTOpYTGpXvOpYTOpYTWrYzOpYTOpYTGnHvG nHvGnHvGnHvGnHvGpXvGnHvGpXvGnHvGnHvGnHvGnHvGnHvGnHvGnHvGnHvG nHvGnHvGnHPGpXvGnHPGpXvGnHPGnHvGnHPGpXu9nHPGnHvGnHPGnHu9nHPG nHvGnHPGnHvGnHPGnHvGnHvGnHvGnHPGnHvGnHvGnHu9nHPGnHvGnHPGnHu9 nHPGnHvGnHPGnHvGnHPGnHvGnHvGnHu9nHPGnHvGnHPGnHu9nHPGnHO9nHPG nHO9nHPGnHO9nHPGnHPGnHPGnHvGnHPGpXvGnHPGnHvGnHPGpXvGnHPGnHvG nHPGpXvGnHPGnHvGnHPGpXu9nHPGnHvGnHPGnHu9nHPGnHvGnHPGnHvGnHPG nHvGnHvGpXvGnHvGnHvGnHvGnHvGnHPGnHvGnHvGnHvGnHPGnHvGnHvGnHvG nHPGnHvGnHvGnHvGnHPGnHvGnHvGnHvGnHvGnHvGnHvGnHvGnHvGnHvGnHvG nHvGnHPGnHvGnHvGnHvGnHPGnHvGnHvGnHvGnHPGnHvGnHvGnHvGnHPGnHvG nHvGnHvGnHPGnHvGnHPGnHu9nHPGnHO9nHPGnHu9nHPGnHvGnHPGnHu9nHPG nHvGnHPGnHvGnHPGnHvGnHPGpXvGnHPGnHvGnHPGpXvGnHPGnHvGnHPGpXvG nHPGnHvGnHPGpXvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPG nHu9lHPGnHvGnHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPGnHvG nHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPG nHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9 lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPG nHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9 lHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPG nHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9 lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHu9lHPGnHvGnHPG nHu9lHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHu9lHPGnHO9 lHPGnHu9lHPGnHO9lHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHu9lHPG nHvGnHPGnHu9lHPGnHvGnHPGnHu9lHPGnHO9lHPGnHu9lHPGnHO9lHPGnHvG nHMAxpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxzxpx7xpxz xqV7xpxzxpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxzxpx7vZxzxpx7xpxzxpx7 vZxzxpx7xpxzxpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxzxpx7vZxzxpx7xpxz xpx7vZxzxpx7xpxzxpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxzxpx7xpxzxqV7 xpxzxpx7xpxzxqV7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxz xqV7xpxzxpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxzxpx7 xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxz xpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7vZxzxpx7xpxzxpx7vZxzxpx7 xpxzxqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxzxpx7xpxzxpx7xpx7xpx7xpxz xpx7xpx7xpx7xpxzxpx7xpx7xpx7xpxzxpx7xpx7xpx7xpxzxpx7xpx7xpx7 xpxzxpx7xpx7xpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxz xpx7xpxzxqV7xpxzxpx7xpxzxpx7xpx7xpx7xpxzxpx7xpx7xpx7vZxzxpx7 xpxzxpx7xpxzxqV7xpx7xpx7xpx7xqV7xpx7xpx7xpx7xqV7xpx7xqV7xpx7 xqV7xpx7xpx7xpx7xqV7xpx7xqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxzxpx7 xpx7xqV7xpx7xpx7xpx7xqV7xpx7xpx7xpx7xqV7xpx7xpx7xpx7xqV7xpx7 xqV7xpx7xqV7xpx7xqV7xpx7xqV7xpx7xqV7xpx7xqV7xpx7xqV7xpx7xqV7 xpx7xqV7xpx7zqWExpx7xqV7xpx7zqWExpx7xqV7xpx7xqWExpx7xqV7xpx7 zqWExpx7zqWMzq2M1rWUzqWMzqWExqWEzq2MxqWEzqWExqWEzqWEzqWEzqWE zqWEzqWExqWEzqWExqV7zqWEzqWEzqWExqV7zqWEzqWEzqWExqWEzqWEzqWE zqWExqWEzqWEzqWEzqWExqWEzq2MzqWEzq2MzqWEzqWExpx7xpx7xpx7zqWE xpx7xpx7xpxzxqV7xpx7xqV7xpx7xqV7xpx7xqV7xpx7xqV7xpx7xqV7xpx7 xqV7xpx7xqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxzxqV7xpxzxpx7 xpx7xqV7xpx7xpx7xpx7xqV7xpx7xpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxz xpx7xpx7xpx7xpx7xpx7xpxzxpx7xpxzxpx7vZxzxpx7xpxzxpx7vZxzxpx7 xpxzxpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxzxpx7xpxz xqV7xpxzxpx7vZxzxpx7xpxzxpx7vZxzxpx7xpxzxpx7xpxzxqV7xpx7xpx7 xpx7xpx7xpx7xpx7xpxzxpx7xpx7xpx7xpxzxpx7xpx7xpx7xpx7xqV7xpx7 xpx7xpx7xqV7xpx7xpx7xpx7xqV7xpx7xpx7xpx7xqV7xpx7xpx7xpx7xqV7 xpx7xpx7xpx7xqV7xpx7xpx7xpxzxpx7xpx7xpx7xpxzxpx7xpx7xpx7xpxz xqV7xpxzxpx7vZxzxpx7xpxzxpx7vZxzxpx7xpxzxpx7vZxzxpx7xpxzxpx7 xpxzxqV7xpxzxpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxz xpx7xpxzxqV7xpxzxpx7xpxzxqV7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7 xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7vZRz xpx7xpxzxpx7vZRzxpx7xpxzxpx7vZRzxpx7xpxzxpx7vZRzxpx7xpxzxpx7 vZRzxpx7xpxzxpx7vZRzxpx7xpxzxpx7vZRzxpx7xpxzxpx7vZRzxpx7xpxz xpx7vZRzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7vZRzxpx7 xpxzxpx7vZRzxpx7xpxzxpx7vZRzxpx7xpxzxpx7vZRzxpx7xpxzxpx7vZRz xpx7xpxzxpx7vZRzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7 vZRzxpx7xpxzxpx7vZRzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxz xpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7 xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxz xpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7 xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7xpxzxpx7AL2cc8acc72U c8acc72cc8acc72Uc8acc72cc8acc72Uc8acc72cc8acc72Uc8acc72cc8ac c72Uc8acc72cc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72c c8acc72Uc8acc72cc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8ac c72cc8acc72Uc8acc72cc8acc72Uc8acc72cc8acc72Uc8acc72cc8acc72U c8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72cc8acc72Uc8acc72cc8ac c72Uc8acc72cc8acc72Uc8acc72cc8acc72Uc8acc72Uc8acc72Uc8acc72U c8acc72Uc8acc72cc8acc72Uc8acc72cc8acc72Uc8acc72cc8acc72Uc8ac c72cc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc8acc8ace8ac c8acc8acc8ace8acc8acc8acc8ace72Uc8ace8acc8ace72Uc8ace8acc8ac e72Uc8ace8acc8ace72Uc8ace8acc8ace72Uc8ace8acc8ace72Uc8ace8ac c8acc72cc8acc8acc8acc72cc8acc72cc8acc72Uc8acc72cc8acc72Uc8ac c72Uc8ace72Uc8acc72Uc8ace72Uc8acc72Uc8ace72Uc8acc72Uc8ace72U c8ace8acc8ace8acc8ace8acc8ace8acc8ace8acc8ace72Uc8ace8aUc8ac e72Uc8ace8acc8acc72cc8acc8acc8acc72cc8acc8aUc8ace72Uc8ace8aU c8ace72Uc8ace8acc8ace8aUc8ace8acc8ace8aUc8ace8aUc8ace72Uc8ac e8aUc8ace72Uc8ace8ace8ace8acc8ace8ace8ace8acc8ace8ace8ace8ac c8ace8ace8ace8acc8ace72cc8ace72cc8ace8ace8ace72cc8ace72Ue86l jM6tjNatjM6lhM6lhMachMachMace86lhMace86lhMace86lhMace8alhMac e86lhMace86lhMace86lhMace86lhMace8alhMace8ace8ace8alhMace8ac e8ace86lhMace86lhM6lhM6lhMalhM6lhL2Uc8ace8ace8ace72cc8ace72U c8ace8ace8ace8acc8ace8ace8ace8acc8ace8acc8ace8acc8ace8acc8ac e8acc8acc8acc8ace8acc8acc8acc8ace8acc8acc8acc8ace72Uc8ace8ac c8ace72Uc8ace8acc8acc72cc8acc8acc8acc72cc8acc8acc8ace72Uc8ac c72Uc8ace72Uc8acc72cc8acc72Uc8acc72cc8acc72Uc8acc72cc8acc72U c8acc72cc8acc72Uc8acc72cc8acc72Uc8acc72cc8acc72Uc8acc72Uc8ac c72Uc8acc72Uc8acc72Uc8acc72Uc8ace72Uc8ace8acc8ace72Uc8acc72U c8ace72Uc8acc72Uc8ace72Uc8acc8acc8ace72Uc8ace8acc8ace72Uc8ac e8aUc8ace72Uc8ace8aUc8ace72Uc8ace8acc8ace72Uc8ace8acc8ace72U c8ace72Uc8ace72Uc8acc72Uc8ace72Uc8acc72cc8acc72Uc8acc72Uc8ac c72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72cc8acc72Uc8acc72c c8acc72Uc8acc72cc8acc72Uc8acc72cc8acc72Uc8acc8acc8acc72cc8ac c8acc8acc72cc8acc72Uc8ace72Uc8acc72Uc8acc72Uc8acc72Uc8acc72U c8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8ac c72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72U c8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8ac c72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72U c8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8ac c72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72U c8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8ac c72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72U c8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8acc72Uc8ac c72Uc8acc72Uc8acc72Uc8acc72Uc8ace72Uc8acc72Uc8ace72Uc8acc72U c8acc72Uc8acc72Uc8acc72Uc8acc72UcwDGnHvGnHPGnHvGlHPGnHvGnHPG nHvGlHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPGnHvG nHPGnHvGlHPGnHvGnHPGnHu9lHPGnHvGnHPGnHu9lHPGnHvGnHPGnHvGlHPG nHvGnHPGnHvGlHPGnHvGnHPGnHu9lHPGnHvGnHPGnHu9lHPGnHvGnHPGnHvG lHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPGnHvGnHPG nHvGlHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPGnHvG nHPGnHvGlHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPG nHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvG lHPGnHvGnHPGnHu9lHPGnHvGnHPGnHu9lHPGnHvGnHPGnHvGnHPGnHvGnHPG nHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvG nHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPG nHvGnHPGnHvGnHPGnHvGnHPGnHu9lHPGnHvGnHPGnHu9lHPGnHvGnHPGnHu9 lHPGnHvGnHPGnHu9lHPGnHvGnHPGnHu9lHPGnHvGnHPGnHvGnHPOpXvGnHvG nHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGlHPGnHvGlHPGnHu9lHPGnHvG nHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPG nHvGnHvGnHvGnHPGnHvGnHvGnHvGnHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvG lHPGnHvGnHvGnHvGnHPGnHvGnHvGnHvGnHPGnHvGnHvGnHvGnHvGnHvGnHvG nHvGnHvGnHvGnHvGnHu9nHPGnHvGnHvGnHvGnHvGnIS9nHvGpYTOpYzWrZTO pYzOpYTGnITOpYTGpYTOpYTGnHvOpYTGnHvOpYTGnHvOpYTGnHvOpYTGnHvO pYTGnHvOpYTGnHvOpYTGnHvGpYTGnHvOpYTGnHvGpYTGnHvOpYTGnHvGpYTG nHvOpYTOpYTOpYTOpYTOpYTGnHvGnHu9nHPGnHvGnHvGnHu9lHPGnHvGnHvG nHvGnHPGnHvGnHvGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvG nHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPG nHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHu9lHPGnHvGnHPGnHu9 lHPGnHvGnHPGnHu9lHPGnHvGnHPGnHu9lHPGnHvGnHPGnHvGlHPGnHvGnHPG nHvGlHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPGnHvGnHPGnHu9lHPGnHvG nHPGnHu9lHPGnHvGnHPGnHvGnHPGnHvGnHPGnHu9lHPGnHvGnHPGnHu9lHPG nHvGnHPGnHu9lHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvG lHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPGnHvGnHPG nHu9lHPGnHvGnHPGnHu9lHPGnHvGnHPGnHu9lHPGnHu9lHPGnHO9lHPGnHvG nHPGnHu9lHPGnHvGnHPGnHu9lHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPG nHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvGlHPGnHvGnHPGnHvG lHPGnHvGnHPGnHvGlHPGnHvGlHPGnHPGlHPGnHvGlHPGnHPGlHPGnHvGlHPG nHPGlHPGnHvGlHPGnHO9lHPGnHPGlHPGnHO9lHPGnHPGlHPGnHO9lHPGnHPG lHPGnHO9lHPGnHPGlHPGnHO9lHPGnHPGlHPGnHO9lHPGnHPGlHPGnHO9lHPG nHPGlHPGnHO9lHPGnHPGlHPGnHO9lHPGnHPGlHPGnHO9lHPGnHvGlHPGnHPG lHPGnHvGlHPGnHPGlHPGnHPGlHPGnHO9lHPGnHPGlHPGnHO9lHPGnHPGlHPG nHO9lHPGnHPGlHPGnHO9lHPGnHPGlHPGnHO9lHPGnHPGlHPGnHO9lHPGnHvG lHPGnHPGlHPGnHvGlHPGnHPGlHPGnHPGlHPGnHO9lHPGnHPGlHPGnHO9lHPG nHPGlHPGnHO9lHPGnHPGlHPGnHO9lHPGnHvGlHPGnHPGlHPGnHvGlHPGnHPG lHPGnHvGlHPGnHPGlHPGnHvGlHPGnHPGlHPGnHPGlHPGnHO9lHPGnHPGlHPG nHO9lHPGnHvGlHPGnHPGlHPGnHvGlHPGnHPGlHPGnHPGlHPGnHO9lHPGnHPG lHPGnHO9lHPGnHvGlHPGnHPGlHPGnHvGlHPGnHPGlHPGnHvGlHPGnHPGlHPG nHvGlHPGnHPGlHPGnHMAvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxz vZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRz xpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxz vZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRz xpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxz vZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRz xpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxz vZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRz xpxzvZRzxpxzvZRzxpxzvZRzxpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxz xpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRz xpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxzxpRzxpxz vZRzxpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxzxpRz xpxzxpRzxpxzxpRzxpxzvZRzxpxzxpxzxpx7xpRzxpx7xpRzxpx7xpRzxpxz xpRzxpxzvZRzxpxzxpRzxpx7vZRzxpxzxpRzxpx7xpRzxpxzxpRzxpx7xpRz xpxzxpRzxpx7xpRzxpx7xpRzxpx7xpRzxpx7xpRzxpx7vZRzxpxzxpRzxpx7 vZRzxpxzxpRzxpx7xpRzxpx7xpRzxpx7xpRzxpx7xpRzxpx7xpRzxpx7xpRz xpx7xpRzxpx7xpRzxpx7xpRzxpx7xpRzxpx7xpRzxpx7xpRzxpx7vZRzxpx7 vZRzxpx7vZRzxpx7xpRzxpx7xpx7vZR7vZRzzqWEzqWEzqWMzqWEzqWExpx7 xpyExpx7xpyExpx7xpx7xpx7xpyExpx7xpx7xpx7xpx7xpx7xpx7xpx7xpx7 xpx7xpx7xpx7xpx7xpx7xpx7xpx7xpx7xpx7xpyExpx7xpx7xpx7zpyEzpyE zqWEzqWEzqWExpx7xpx7vZRzxpx7vZRzvZxzxpRzxpx7xpRzxpx7xpRzxpx7 xpRzxpx7xpRzxpxzxpRzxpx7vZRzxpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRz xpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxzxpRzxpxz vZRzxpxzxpRzxpxzxpRzxpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxzvZRz xpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxz vZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRz xpxzxpRzxpx7xpRzxpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxzxpRzxpxz vZRzxpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxzxpRzxpx7vZRzxpxzxpRz xpx7vZRzxpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxz xpRzxpxzvZRzxpxzxpRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRz xpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxz vZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRz xpxzvZRzxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRz vZRzxpRzvZRrvZRzvZRrxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRr xpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRz vZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRz xpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRz vZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRr xpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrvZRzvZRrxpRz vZRrvZRzvZRrxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRz xpRzvZRrxpRzvZRzxpRzvZRzxpRzvZRzxpxzvZRzxpRzvZRzxpxzvZRrxpRz vZRzxpRzvZRrxpRzvZRzxpRzvZRzxpRzvZRzxpxzvZRzxpRzvZRzxpxzvZRz xpRzvZRzxpxzvZRzxpRzvZRzxpxzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRz vZRzAMacc8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aU c8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aUc8ace8aUc8ace8aUc8ac e8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aUc8ace8aUc8ace8aU c8ace8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ac e8aUc8acc8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8acc8aU c8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aUc8ac e8aUc8ace8aUc8ace8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aU c8acc8aUc8ace8aUc8acc8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ac e8aUc8acc72Uc8ace8aUc8acc72Uc8ace8aUc8acc72Uc8acc8aUc8acc72U c8acc8aUc8acc72Uc8acc8aUc8acc72Uc8acc8aUc8acc72Uc8acc8aUc8ac c72Uc8acc8aUc8acc72Uc8ace8aUc8acc72Uc8ace8aUc8ace8aUc8ace8aU c8ace8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aUc8ace8aUc8ac e8aUc8acc8aUc8ace8acc8acc8aUc8ace8aUc8acc8aUc8ace8aUc8ace8aU c8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ac e8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aU c8ace8aUc8ace8acc8ace8aUc8ace8acc8ace8aUc8ace8aUc8ace8aUc8ac e8aUc8ace8aUc8ace8acc8ace8aUc8ace8acc8ace72Uc8ace8acc8ace8aU c8ace8ace8ace8ace8ace72Ue8achM6lhNatjM6lhM6lhMachM6lhMace8ac hMace8achMace8ace8ace8alhMace8ace8ace8alhMace8ace8ace8alhMac e8ace8ace8alhMace86chMace86chMace8achMace86lhMachM6lhMalhM6l hMace8ace72Uc8ace72ce8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aU c8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ac c8aUc8ace8aUc8acc8aUc8ace8aUc8acc72Uc8ace8aUc8acc72Uc8ace8aU c8ace8aUc8ace8aUc8acc8aUc8ace8aUc8acc72Uc8ace8aUc8acc72Uc8ac e8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aU c8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8acc8aUc8ace8acc8ac e8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aU c8acc8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8acc8aUc8ac e8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aUc8ace8aU c8ace8aUc8acc72Uc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ace8aUc8ac c8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aUc8acc8aUc8ace8aU c8aUc8aUc8acc8aUc8aUc8aUc8acc8aUc8aUc8aUc8acc8aUc8aUc72Uc8aU c8aUc8aUc72Uc8aUc8aUc8aUc72Uc8aUc8aUc8aUc72Ua8aUc72Uc8aUc72U a8aUc72Ua8aUc72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aU c72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aUc72Ua8aUc72U c8aUc72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aUc72Ua8aU c72Uc8aUc72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aUc72U a8aUc72Uc8aUc72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aU c72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aUc72Ua8aUc72U c8aUc72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aUc72Uc8aUc8aUc8aUc72Uc8aU c8aUc8aUc8aUc8acc8aUc8aUc8aUc8acc8aUc8aUc72Uc8aUc8aUc8aUc72U c8aUc8aUc8aUc8aUc8acc8aUc8aUc8aUc8acc8aUc8aUc72Uc8aUc8aUc8aU c72Uc8aUc8aUc8aUc72Uc8aUc8aUc8aUc72Uc8aUc8aUc8aUcwC9lHPGlHO9 lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPG lHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9 lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPG lHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9 lGvGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lGvGlHO9lHPG lHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lHPGlHO9 lHPGlHO9lHPGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lHPG lHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9 lGu9lHO9lHPGlHO9lGu9lHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPG lHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9 lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPG lHO9lHPGnHO9lHPGlHO9lHPGnHO9lHPGlHO9lHPGlHO9lGu9lHO9lHPGlHO9 lHPGnHO9lHPGlHO9lGvGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPG nHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9 lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGnHO9lHPG lHO9lHPGnHO9lHPGlHO9lHPGnHO9lHPGlHO9lHPGnHO9lHPGlHO9lHPGnHO9 lHPGlHO9lHPGnHO9lHPGlHO9lHPGnHO9lHPGlHO9lHPGnHu9lHPGnHO9lHPG nHvGlHu9lHu9lHPGnITOnITOpYTGnITOpYTGnHvGnITGnHvGnIS9lHvGnHvG nHvGnHu9lHvGnHvGnHvGnHu9lHvGnHu9nHvGnHu9lHPGnHu9nHvGnHu9lHPG nHvGlHvGnHvGlHvGnHvGlHvGnITGlHvGnHvGnHvGpYTGnHvGpYTGnHvGnHu9 lHO9lHO9lHPGnHO9lHPGlHO9lHPGnHO9lHPGlHPGlHPGnHu9lHPGlHO9lHPG nHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lGvGlHO9 lHPGlHO9lGvGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGnHO9lHPG lHO9lHPGlHO9lGvGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9 lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPG lHO9lHPGlHO9lHPGlHO9lHPGlHO9lGvGlHO9lGvGlHO9lHPGlHO9lGu9lHO9 lHPGnHO9lHPGlHO9lHPGnHO9lHPGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvG lHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lGvGlHO9lHPGlHO9 lGvGlHO9lHPGnHO9lHPGlHO9lHPGnHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPG lHO9lGu9lHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lGvGlHO9 lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvG lHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9 jGvGlHO9lGvGlHO9jGvGlHO9jGvGlHO9jGu9lHO9jGu9lHO9jGu9lGu9jGvG lHO9jGu9lHO9jGvGlHO9jGu9lHO9jGvGlHO9jGu9lHO9jGvGlHO9jGu9lHO9 jGvGlHO9jGu9lHO9jGvGlHO9jGu9lHO9jGvGlHO9jGu9lHO9jGvGlHO9jGu9 lHO9jGu9lHO9jGu9lGu9jGu9lHO9jGu9lGu9jGvGlHO9jGu9lHO9jGvGlHO9 jGu9lHO9jGvGlHO9jGu9lHO9jGvGlHO9jGu9lHO9jGvGlHO9jGu9lHO9jGvG lHO9jGu9lHO9jGu9lHO9jGu9lGu9jGu9lHO9jGu9lGu9jGvGlHO9jGu9lHO9 jGvGlHO9jGu9lHO9jGvGlHO9jGu9lHO9jGvGlHO9jGu9lHO9jGu9lHO9jGu9 lGu9jGu9lHO9jGu9lGu9jGvGlHO9jGu9lHO9jGvGlHO9jGu9lHO9lGvGlHO9 jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvG lHO9jGvGlHO9lGvGlHO9jGvGlHO9jGvGlHO9jGu9lHO9jGvGlHO9jGu9lHO9 lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9jGsAxpRzvZRzxpRzvZRrxpRzvZRz xpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRz vZRzxpRzvZRrxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRr xpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRz vZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRz xpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRz vZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRz xpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzxpRzxpRzvZRzxpRzxpRzxpRz vZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRz xpRzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxz vZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpxzvZRzxpRzvZRz xpxzvZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRzxpxzvZRzxpRz vZRzxpxzvZRzxpRzvZRzxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRzxpRzvZRz xpRzvZRzxpxzvZRzxpxzvZRzxpRzvZRzxpRzvZRzxpxzvZRzxpxzvZRzxpxz vZRzxpRzvZRzxpxzvZRzxpRzvZRzxpxzvZRzxpRzvZRzxpxzvZRzxpRzvZRz xpx7xpRzxpxzvZRzxpx7xpRzxpxzvZRzxpx7xpRzxpxzvZRzxpx7xpRzxpxz vZRzxpx7xpRzxpxzvZRzxpx7xpRzxpxzvZRzxpxzvZRzxpRzvZRzxpxzvZRz xpRzvZRzxpxzxpRzxpxzvZRzxpx7xpRzxpx7xpRzzpyExpR7xpR7vZR7xpx7 vZRzxpx7zqWEzqWExpyEzqWExpx7xpyExpx7xpyExpx7xpyExpx7xpyExpx7 xpyExpx7xpyExpx7xpx7xpx7xpx7vZx7xpx7xpx7xpx7vZx7zpyExpR7zpyE xpR7zpyExpx7zpyExpR7xpx7xpx7xpx7xpx7zqWExpx7xpx7tYxrxpx7xpRz xpxzvZRzxpx7xpRzxpxzvZRzxpx7xpRzxpx7xpRzxpx7xpRzxpxzvZRzxpx7 xpRzxpxzvZRzxpx7xpRzxpxzvZRzxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRr xpxzvZRzxpRzvZRzxpxzvZRzxpRzvZRzxpxzvZRzxpRzvZRzxpxzvZRzxpRz vZRrxpxzvZRzxpRzvZRzxpxzvZRzxpRzvZRzxpRzvZRzxpRzvZRrxpRzvZRz xpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRzxpRz vZRzxpRzvZRzxpRzvZRzxpRzvZRzxpxzvZRzxpRzvZRrxpxzvZRzxpRzvZRz xpxzvZRzxpRzvZRzxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRz vZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpxzvZRz xpRzvZRzxpxzvZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRrxpRz vZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRr xpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRzxpRzvZRzxpRz vZRzxpRzxpRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRz xpRzvZRrxpRzvZRrxpRzvYxrxpRzvZRrxpRzvYxrxpRzvZRrxpRzvZRrxpRz vZRrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRr xpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvYxrvZRz vYxrxpRzvYxrvZRzvYxrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRr xpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRrxpRz vYxrvZRzvYxrxpRzvYxrvZRzvYxrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRr xpRzvZRrxpRzvYxrxpRzvZRrxpRzvYxrxpRzvYxrvZRzvYxrxpRzvYxrvZRz vYxrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvZRrxpRzvYxrxpRzvZRr xpRzvYxrxpRzvZRzxpRzvZRrxpRzvZRzxpRzvZRrxpRzvZRrxpRzvYxrxpRz vZRrxpRzvYxrxpRzvZRrxpRzvYxrxpRzvZRrxpRzvYxrxpRzvZRzxpRzvZRr xpRzvZRzxpRzvZRrxpRzAL2Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72U c72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72M a8aUc72Ma8aUc72Ma8aUc72Ma8aUc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72U c72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma8aUc72Ma72Uc72M a8aUc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72U c72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72M a72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma8aUc72Ma8aU c72Ma8aUc72Ma8aUc72Ma8aUc72Ma8aUc72Ma8aUc72Ma8aUc72Ma72Uc72M a72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma8aUc72Ma72Uc72Ma8aUc72Ma72U c72Ma72Uc72Ma72Uc72Ma72Uc72Ma8aUc72Ua8aUc72Ma8aUc72Ua8aUc72M a8aUc72Ua8aUc72Ua8aUc72Uc8aUc72Ma8aUc72Ua8aUc72Ma8aUc72Ua8aU c72Ma8aUc72Ua8aUc72Ma8aUc72Ua8aUc72Ma8aUc72Ua8aUc72Ma8aUc72U a8aUc72Ua8aUc72Ua8aUc72Ma8aUc72Uc8aUc72Ma8aUc72Ua8aUc72Ma8aU c72Ua8aUc72Ma8aUc72Ua8aUc72Ma8aUc72Ua8aUc72Ma8aUc72Mc8aUc72M a8aUc72Mc8aUc72Ma8aUc72Mc8aUc72Ma8aUc72Mc8aUc72Mc8aUc72Uc8aU c72Mc8aUc72Uc8aUc72Ma72Uc72Ua72Uc72Ma72Uc72Ua72Uc72Uc8aUc8aU c8aUc72Uc8aUc8aUc8aUc72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aUc72Ua8aU c72Uc8aUc72Ua8aUc72Uc8aUc72Uc8aUc72Uc8aUc72Uc8aUc72Uc8aUc8ac hM6ljMachMachL2Ue8achMaUhMachMaUe8ace8aUe8ace8aUe8ace8aUc8ac e72Uc8aUe8aUe8aUe72Uc8aUe8aUe8aUe72Ue8aUe72Ue8ace72Ue8aUe72U e8aUe72Uc8ace72Ue8ace72Ue8achMaUe8achLWMa72Uc72Uc8aUc72Ma72U c72Uc8aUc72Uc8aUc72Uc8aUc72Uc8aUc72Uc8aUc72Ma8aUc72Mc8aUc72M a8aUc72Mc8aUc72Ma8aUc72Mc8aUc72Ma8aUc72Mc8aUc72Ma8aUc72Ua8aU c72Ma8aUc72Ua8aUc72Ma8aUc72Ua8aUc72Ma8aUc72Ua8aUc72Ma72Uc72M a8aUc72Ma72Uc72Ma8aUc72Ma8aUc72Ma8aUc72Ma8aUc72Ma8aUc72Ma72U c72Ma72Uc72Ma72Uc72Ma72Uc72Ma8aUc72Ma8aUc72Ma8aUc72Ma8aUc72M a72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma8aUc72Ua8aUc72Ma8aUc72Ua8aU c72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aUc72Ua8aUc72Uc8aUc72Ua8aUc72U c8aUc72Ma8aUc72Ua8aUc72Ma8aUc72Ua8aUc72Ma72Uc72Ma72Uc72Ma72U c72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72M a72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma8aU c72Ma72Uc72Ma8aUc72Ma72Uc72Ma8aUc72Ma72Uc72Ma8aUc72Ma72Uc72M a8aUc72Ma72Uc72Ma8aUc72Ma72Uc72Ma8aUc72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Uc72Ma72Ma72Ma72Uc72Ma72M a72Ma72Uc72Ma72Ma72Ma72Uc72Ma72Ma72Ma72Uc72Ma72Ma72Ma72Uc72M a72Ma72Ma72Uc72Ma72Ma72Ma72Uc72Ma72Ma72Ma72Uc72Ma72Ma72Ma72U c72MawDGlHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9 jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9jGvG lHO9jGvGlHO9jGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9 lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvG lHO9lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9 jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvG lHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9 jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9lGvGlHO9jGvG lHO9lGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9lGvGlHO9 jGvGlHO9lGvGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9jGvGlHO9lHPG lHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9 lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lHPG lHO9lGvGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9 lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9jHPGlHO9lHPGlHO9jHPGlHO9lHPG lHO9lHPGlHPGlHPGlHO9lHPGlHPGlHPGlHPGlHPGlHPGlHPGlHPGlHPGlHPG lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHO9lHPGlHPGlHPGlHO9lHPG lHPGlHPGlHO9lHPGlHPGlHPGlHO9lHPGlHPGlHPGlHO9lHPGlHPGlHPGlHO9 lHPGlHPGlHPGlHO9lHPGlHPGlHPGlHO9lHPGlHPGlHPGnHvGnHvOpYzGnITG nIS9lHvGnITGlITGnITGlHvOnITGlHvGnHvGlHvGnHvGlHPGlHvGlHvGnHvG lHvGlHvGlHvGnHvGlHvGnHvGlHvGnHvGlHvGnHu9lHvGnHu9lHvGnHu9lHPG nHu9lHvGlHvGlHvGnITGlITGnHu9lHO9lHO9jHPGlHO9lHPGlHO9lHPGlHO9 lHPGlHPGlHPGlHO9lHPGlHPGlHPGlHO9jHPGlHO9lHPGlHO9jHPGlHO9lHPG lHO9jHPGlHO9lHPGlHO9jHPGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9 lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9jGvGlHO9lGvGlHO9jGvG lHO9lGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9lGvGlHO9 jGvGlHO9lGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9lGvG lHO9jGvGlHO9lGvGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9 lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvGlHO9lHPGlHO9lGvG lHO9lHPGlHO9lGvGlHO9lHPGlHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9 jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvG lHO9jGvGlHO9lGvGlHO9jGvGlHO9lGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9 jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvG lHO9jGvGlHO9jGvGlHO9jGvGlHO9jGvGlHO9jGu9jGu9jGu9lHO9jGu9jGu9 jGu9lHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9 jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9 jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9 lHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9jGu9 jGu9lHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9 jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9 jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9 lHO9jGu9lHO9jGvGlHO9jGu9lHO9jGvGlHO9jGu9lHO9jGvGlHO9jGu9lHO9 jGvGlHO9jGu9jGu9jGu9lHO9jGu9jGu9jGu9lHO9jGu9lHO9jGvGlHO9jGu9 lHO9jGvGlHO9jGu9lHO9jGvGlHO9jGu9lHO9jGvGlHO9jGvGlHMAvYxrvZRz vYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxr vZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxr vYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxr vZRrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvZRzvYxrvZRrvYxrvZRz vYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxr vZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRr vYxrvZRzvYxrvZRrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxr vYxrvYxrvYxrvYxrvYxrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvYxr vYxrvYxrvYxrvYxrvYxrvYxrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxr vZRzvYxrvZRzvYxrvZRzvYxrvZRzvYxrvZRrvYxrvZRrvYxrvZRzvYxrvZRz vYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRzvYxrvZRzvYxr vZRzvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRz vYxrvZRzvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRzvYxr vZRzvYxrvZRzvYxrvZRzvYxrvYxzvYxrvZRzvYxrvYxzvYxrxpRzvYxrxpRz vYxrxpRzvYxrxpRzvYxrxpRzvYxrxpRzvYxrxpRzvYxrxpRzvYxrvZRzvYxr vZRzvYxrvZRzvYxrvZRzvYxrxpRzvYxrvZRzvYxrxpRzvYxrvZRzvYxzxpRz vYxrxpRzvYxzxpRzvYxrxpRzvYxzxpRzvYxrxpRzvYxzxpRzvYxrxpRzvYxz xpRzvYxrxpRzvYxzxpRzvYxrxpRzvYxzvZR7vZR7zpyExpyExpyEvZR7xpSE xpR7xpR7vZRzxpR7xpRzxpx7vZRzxpR7vZRzxpR7vZRzxpR7vZRzxpR7vZRz xpR7vZR7xpR7vZRzxpR7vZRzxpR7vZRzvZR7vZRzvZR7vYxzvZR7vZR7xpR7 vZR7xpR7xpx7xpx7vYxzvZRzvYxzxpRzvYxzvYxzvYxrxpRzvYxrvZRzvYxr xpRzvYxrvZRzvYxrxpRzvYxrvZRzvYxrxpRzvYxrvZRzvYxrvZRzvYxrvYxz vYxrvZRzvYxrvYxzvYxrvZRzvYxrvZRzvYxrvZRzvYxrvZRzvYxrvZRzvYxr vZRzvYxrvZRzvYxrvZRzvYxrvZRrvYxrvYxrvYxrvZRrvYxrvYxrvYxrvYxr vYxrvYxrvYxrvYxrvYxrvYxrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxr vYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRr vYxrvZRzvYxrvZRzvYxrvZRzvYxrvZRzvYxrvZRzvYxrvZRrvYxrvZRzvYxr vZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRzvYxrvZRz vYxrvZRzvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxr vZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRrvYxrvZRzvYxrvZRr vYxrvZRzvYxrvZRrvYxrvZRzvYxrvYxrvYxrvZRzvYxrvYxrvYxrvZRzvYxr vYxrvYxrvZRzvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxr vYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxr vYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxr vYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxr vYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxr tYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxr vYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxr vYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxr vYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxr tYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxr vYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxr vYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrtYxrAL2Uc72Ma72Mc72Ma72Uc72M a72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72U c72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72M a72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72M c72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72M a72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72U c72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72M a72Mc72Ma72Ma72Ma72Mc72Ma72Ma72Ma72Mc72Ma72Ma72Ma72Mc72Ma72M a72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72M a72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Uc72Ma72U c72Ma72Uc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72M a72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72U c72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72M a72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma8aU c72Ma72Uc72Ma8aUc72Ma72Uc72Ma8aUc72Ma8aUc72Ma8aUc72Ma8aUc72M a8aUc72Mc8aUc72Ma8aUc72Mc8aUc72Ma8aUc72Mc8aUc72Ma8aUc72Mc8aU c72Ma8aUc72Mc8aUc72Ma8aUc72Mc8aUc72Ma8aUc72Mc8aUc72Ma8aUc72M c8aUc72Ma8aUc72Mc8aUc72Ma8aUc72Mc8aUc72Ma8aUc72Uc8aUc72Mc8aU c72Uc8aUc72Mc8aUe72Mc72Uc8aUe86ljM6chMachL2Ue8aUe8aUe8aUe72U c8aUe8aUc8ace8aUc8aUe72Uc8aUe72Uc8aUe72Uc8aUe72Uc8aUe8aUe8aU e72Uc8aUe72Uc8aUe72Uc8aUe72Uc8aUe72Uc8aUe72Ue8aUe72Ue8ace8aU e8ace72Uc72Uc72Mc72Uc72Mc8aUc72Ma72Uc72Ma8aUc72Ma72Uc72Ma8aU c72Ma8aUc72Ma8aUc72Ma8aUc72Ma8aUc72Ma72Uc72Ma8aUc72Ma72Uc72M a8aUc72Ma72Uc72Ma8aUc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72U c72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Mc72Ma72Ma72Ma72Mc72M a72Ma72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Mc72Ma72Ma72Ma72M c72Ma72Ma72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Uc72M a72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72U c72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72Ma72Uc72M a72Ua72Ma72Uc72Ma72Ua72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72U c72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72M a72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72Mc72Ma72Uc72Ma72M c72Ma72Mc72Ma72Ma72Ma72Mc72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Mc72M a72Ma7WMa72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Mc72Ma72Ma72Ma72Mc72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72Ma72M a72Ma72Ma72Ma72Ma72MawC1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9 jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu9 jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9 jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu9jGu9jGu1jGu9jGu9 jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9 jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1 jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu9jGu9 jGu1jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1jGu9jGu1 jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1jGu9 jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1 jGu9jGu9jGu9jGu1jGu9jGu9jGu9jHO1jGu9jGu1jGu9jGu1jGu9jGu1jGu9 jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1 jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9 jGu1jGu9jGu1jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1 jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9 jHO9jGu9jGu9jGu9jHO9jGu9jHO9jGu9jHO9jGu9jHO9jGu9jHO9jGu9jHO9 jHO9lHO9jGu9jHO9jHO9lHO9jGu9jHO9jGu9jHO9jGu9jHO9jGu9jHO9jGu9 jHO9jGu9jHO9jGu9jHO9jGu9jHO9jGu9jHO9jHO9lHO9jGu9jHO9jHO9lHO9 jHO9lHO1jGu9lHPGlHvOnITGnITGlHu9jHvGlHu9jHPGlHu9jHPGlHu9lHPG lHu9jHO9lHO9jHPGlHu9jHO9lHO9jHPGlHu9jHO9lHO9jHPGlHu9jHO9lHO9 jHO9lHO9jHO9lHO9jHO9lHO9jHO9lHu9jHPGlHu1jHO9lHu9lHvGlHu9jHO9 jHO9jHO9jHO9jGu9jGu9jGu9jHO9jGu9jGu9jGu9jHO9jGu9jGu9jGu9jHO9 jGu9jGu9jGu9jHO1jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu9jGu9jGu9jGu9 lGu9jGu9jGu9jGu9lGu1jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1hGu9jGu1 jGu9jGu1hGu9jGu1jGu9jGu1jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1jGu9 jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1 jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu9jGu9jGu1jGu9jGu9jGu9 jGu1jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1jGu9jGu9 jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9 jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1 jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu9jGu9 jGu1jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1hGu9jGu1 jGu9jGu1hGu9jGu1jGu9jGu1hGO9jGu1jGu9jGu1hGO9jGu1hGO9jGu1hGO9 jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1 hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9 jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1 hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9 jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1 hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9 jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1 hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGO9jGu1hGO9jGu1hGO9jGu1hGu9 jGu1jGu9jGu1hGu9jGu1jGu9jGu1hGu9jGu1jGu9jGu1hGu9jGu1jGu9jGu1 hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9jGu1hGO9jGu1hGu9 jGu1jGsAvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxr tYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrvYxrvYxzvYxr vYxrvYxrvYxzvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxr vYxrvYxrtYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrtYxr vYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxr tYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxr vYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrvYxrvYxzvYxrvYxrvYxrvYxz vYxrvYxrvYxrvYxzvYxrvYxrvYxrvYxzvYxrvYxrtYxrvYxrvYxrvYxrtYxr vYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxr tYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrvYxrvYxzvYxr vYxrvYxrvZRzvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxr vYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxr vYxrvYxrvYxrtYxrvYxrtYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxr tYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxr vYxrvYxrvYxzvYxrvYxrvYxrvYxzvYxrvYxzvYxrvZRzvYxrvYxzvYxrvZRz vYxrvYxzvYxrvYxzvYxrvYxzvYxrvYxzvYxrvYxzvYxrvZRzvYxzvYxzvYxr vZRzvYxzvYxzvYxrvZRzvYxzvYxzvYxrvZRzvYxzvYxzvYxrvZRzvYxzvYxz vYxrvZRzvYxzvZRzvYxzxpRzvYxzvZRzvYxzxpRzvYxzvYxzvYxzxpRzvYxr vZRzxpR7zpyExpyExpSExpR7xpR7vZR7xpR7vYxzxpR7vZRzxpR7vYxzxpR7 vZRzxpR7vYxzxpR7vZRzxpR7vYxzxpR7vYxzxpRzvYxzxpR7vYxzxpRzvYxz xpR7vYxzxpR7vYxzxpR7vYx7vZRzvYxzvZR7vZRzxpR7xpRzxpRzvYxrvYxr vYxrvYxzvYxrvYxrvYxrvYxzvYxrvYxrvYxrvYxzvYxrvYxrvYxrvYxzvYxr vYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvZRrvYxrvYxrvYxrvZRr vYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxr vYxrvYxrvYxrvYxrvYxzvYxrvYxrvYxrvYxzvYxrvYxrtYxrvYxrvYxrvYxr tYxrvYxrvYxrvYxrvYxrvYxzvYxrvYxrvYxrvYxzvYxrvYxrtYxrvYxrvYxr vYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrvYxrvZRr vYxrvYxrvYxrvZRrvYxrvYxrvYxrvZRrvYxrvYxrvYxrvZRrvYxrvYxrtYxr vYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxr tYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxr vYxrtYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxr vYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrtYxrvYxrvYxrvYxrtYxr vYxrvYxrvYxrtYRrvYxrvYxrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYxrvYxr tYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxr vYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxr tYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRr vYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxr tYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxr vYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxr tYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRr vYxrtYxrvYxrtYRjvYxrtYRrvYxrtYRjvYxrtYRrvYxrtYRrvYxrtYxrvYxr tYRrvYxrtYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrvYxrtYRrvYxrtYxr vYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrtYRrvYxrtYxrvYxrALWEa72M a7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WE a72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72M a7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WE a72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72M a7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WE a72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72M a7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WE a72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72M a7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WM Y72Ma7WEY72Ma7WMY72Ma7WEY72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72M a7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WE a72Ma7WMa72Ma7WMY72Ma7WMa72Ma7WMY72Ma7WEY72Ma7WMY72Ma7WMa72M a7WEY7WMa7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WMY72Ma7WEY72Ma7WM Y72Ma7WEY72Ma7WMa72Ma7WEa72Ma7WMa72Ma7WEa72Ma7WMa72Ma7WEa72M a7WMa72Ma7WEa72Ma7WMa72Ma7WEa72Ma7WMa72Ma7WEa72Ma72Ea72Mc7WE a72Mc72Ea72Mc7WEa72Mc7WMa72Mc7WEa72Mc7WMa72Mc7WEa72Mc72Ma72M c7WMa72Mc72Ma72Mc7WMa72Mc72Ma72Mc7WMa72Mc72Ma72Mc7WMa72Mc72M a72Mc72Ma72Mc72Ma72Mc72Ma72Mc7WMa72Mc72Ma72Mc7WEa72Mc72Uc8ac hMaUe8aUe72Me72Ue72Mc72Ue72Mc72Uc72Mc72Uc72Mc72Uc72Mc72Uc72M c72Uc72Mc8aUc72Mc72Mc72Mc72Uc72Ma72Mc72Mc72Uc72Mc72Mc72Mc72M c72Mc72Mc7WMc72Mc7WMc72Mc72Mc8aUe72Mc72Mc7WMa72Ma7WMa72Ma7WM a72Ma7WMa72Ma7WMa72Ma7WEa72Ma7WMa72Ma7WEa72Ma7WMa72Ma7WEa72M a7WMa72Ma7WEa72Ma7WMa72Ma7WMY72Ma7WMa72Ma7WMY72Ma7WEa72Ma7WE a72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72M a7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WE a72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72M a7WMY72Ma7WEY72Ma7WMY72Ma7WEY72Ma7WMY72Ma7WEY72Ma7WMY72Ma7WE Y72Ma7WMY72Ma7WEY72Ma7WMY72Ma7WEY72Ma7WEa72Ma7WEa72Ma7WEa72M a7WEa72Ma7WMY72Ma7WEY72Ma7WMY72Ma7WEY72Ma7WEa72Ma7WEa72Ma7WE a72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72M a7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WE a72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72M a7WEa72Ma7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WE a72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WE a7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WE Y7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72M a7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WE a72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WE a7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WE Y7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72M a7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WEa72Ma7WEY7WEa7WE a72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72M a7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEawC9jGu1hGu9jGu1hGu9jGu1 hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9 jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1 hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jHO9jGu9 jGu1hGu9jHO9jGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1 hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9 jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1 hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9 jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jHO9jGu9jGu1hGu9jHO9 jGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1jGu9jGu1jGO9 jGu1jGu9jGu1jGO9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jHO9jGu9jHO1 jGu9jHO9jGu9jHO1jGu9jHO1jGu9jGu1hGu9jHO1jGu9jGu1hGu9jGu9jGu9 jGu1jGu9jGu9jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGu9jGu1jGO9jHO9 jGu9jHO1jGu9jHO9jGu9jHO1jGu9jGu1jGu9jGu1jGO9jGu1jGu9jGu1jGO9 jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1 jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jHO9jGu9jHO9jGu9jHO9jGu9 jHO9jGu9jHO9jGu9jHO1jGu9jHO9jGu9jHO1jGu9jHO9jGu9jHO9jGu9jHO9 jGu9jHO9jGu9jHO9jGu9jHO9jGu9jHO9jGu9jHO9jGu9jHO9jHO9jHO9jGu9 jHO9jHO9jHO9jGu9lHO1jGu9jGu1jGu9lHO1jGu9lHO9lHPOnITGlHvGlHu9 jHvGlHu9jHO9lHu9jHO9lHO9jHO9lHO9jHO9lHO9jHO9lHO9jHPGlHO9jHPG lHO9jHPGlHO9jHO9lHO9jHPGlHO9jHO9jHO9jGu9jHO9jHO9jHO9jHO9lHu9 jHO9lHu9jHO9jHO9jHPGlHvGlHu9jHO9jGu9jGu9jGu9jHO9jGu9jGu9jGu9 jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9jGu9 jGu9jGu9jGu9jGu1jGu9jGu9jGu9jGu1jGu9jGu1hGu9jGu1hGu9jGu1hGu9 jGu1hGu9jHO1jGu9jGu1hGu9jHO1jGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1 hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9 jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1jGu9jGu1 jGO9jGu1jGu9jGu1jGO9jGu1jGO9jGu1hGO9jGu1jGO9jGu1hGO9jGu1jGO9 jGu1hGO9jGu1jGO9jGu1hGO9jHO1jGu9jGu1hGu9jHO1jGu9jGu1hGu9jGu1 jGu9jGu1jGO9jGu1jGu9jGu1jGO9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9 jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1 hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9 jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1 hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9 jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1 hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9 jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1 hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9 jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1 hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9 jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1 hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9 jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1hGu9jGu1 hGu9jGu1hGu9jGu1hGu9jGsAtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRj vYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxr tYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRr vYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRr tYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRj vYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxr tYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRr vYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRr tYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRj vYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxr tYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRr vYxrtYRjvYRrtYRrvYxrtYRrvYxrvYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxr tYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRrvYxrtYRrvYxrtYRr vYxrtYRrvYxrtYRjtYRrtYRrvYxrtYRjtYRrtYRrvYxrtYRrvYxrtYRrvYxr tYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrvYRrvYxrtYRrvYxrtYRr vYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxr tYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRr vYxrvYRrvYxrtYRrvYxrvYRrvYxrtYRrvYxrvYRrvYxrtYRrvYxrvYRrvYxr tYRrvYxrvYRrvYxrtYRrvYxrvYRrvYxrvYxzxpR7xpR7xpR7vYxzxox7vYxz vYx7vYxzvYxzvYxzvYxzvYRzvYxzvYxzvYxzvYxzvYxzvYxzvYxzvYRzvYxz vYRzvYxzvYRrvYxzvYRzvYxztYRrvYxzvYRrvYxzvYRrvYxzvYRzvYxzvYRr vYxzvYRzvYxzvYxzxpRzvYxrvYxztYRrvYRrtYRrvYxrtYRrvYxrvYRrvYxr tYRrvYxrvYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRr vYxrtYRrvYxrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRr tYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRj vYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxr tYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRr vYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRr tYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRrvYxrtYRjvYRrtYRrvYxrtYRj vYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxr tYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRjvYRrtYRrvYxrtYRrvYRrtYRr vYRrtYRjvYRrtYRrvYRrtYRrvYRrtYRrvYxrtYRrvYRrtYRrvYxrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRj vYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRr tYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRr vYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRr tYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRj vYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRr tYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRr vYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRr tYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRj vYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRr tYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRrvYRrtYRjvYRrtYRr vYRrtYRrAL2Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72M a7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72E a72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72M a72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WE a72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72M a7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72E a72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72M a72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WE a72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72M a7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72E a72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72M a72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WE a72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72M a7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WE a72Ma7WEa72Ma72Ea72Ma72Ea72Ma72Ea72Ma72Ea72Ma72Ea72Ma72Ea72M a72Ea72Ma7WEa72Mc72Ma72Ma7WEa72Mc72Ma72Ma7WEa72Ma7WEa72Ma7WE a72Mc72Ma72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma72Ea72Mc72Ma72M a72Ea72Mc72Ma72Ma72Ea72Mc72Ma72Ma72Ea72Mc72Ma72Ma72Ea72Mc72M a72Ma72Ea72Mc72Ma72Mc72Mc8aUe8aUe8aUe72Mc72Me72Me8aMc72Mc8aM c72Mc72Mc72Mc8aMc72Mc72Mc72Mc8aMc72Mc72Mc72Mc72Mc72Mc72Mc72M c72Mc72Mc72Mc72Ec72Mc72Ec72Mc72Ec72Mc72Mc72Mc72Ec72Mc72Mc8aU c72Mc8aMc72Mc72Mc7WEa72Mc7WEa72Ma72Ea72Ma72Ea72Ma72Ea72Mc72M a72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72Ma7WEa72M a7WEa72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WE a72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72M a7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72E a72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72M a72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WE a72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72M a7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma7WEa72Ma72E a72Ma7WEa72Ma72Ea72Ma7WEa72Ma72Ea72Ma72Ea72Ma7WEa72Ea7WEa72E a7WEa72Ea7WEa72Ma7WEa72Ea7WEa72Ma7WEa72Ea7WEa72Ea7WEa72Ea7WE a72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72E a7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ma7WE a72Ea7WEa72Ma7WEa72Ea7WEa72Ma7WEa72Ea7WEa72Ma7WEa72Ea7WEa72M a7WEa72Ea7WEa72Ma7WEa72Ea7WEa72Ma7WEa72Ea7WEa72Ma7WEa72Ea7WE a72Ma7WEa72Ea7WEa72Ma7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72E a7WEa72Ma7WEa72Ea7WEa72Ma7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WE a72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72E a7WEa72Ea7WEa72Ma7WEa72Ea7WEa72Ma7WEa72Ea7WEa72Ea7WEa72Ea7WE a72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ma7WEa72E a7WEa72Ma7WEa72Ea7WEa72Ma7WEa72Ea7WEa72Ma7WEa72Ea7WEa72Ea7WE a72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72EawC1hGu9 hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1 hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9 hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1 hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9 hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1 hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9 hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1 hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9 hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1 hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9 hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1 hGO1hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9 hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu1hGu1hGO1hGu1 hGu1hGu1hGO1hGu1hGu1hGu1hGO1hGu1hGu1hGu1hGO1hGu1hGu9hGu1hGO9 hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9jGu1 hGu9hGu1hGu9jGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9jGu1hGu9hGu1hGu9 jGu1hGu9hGu1hGu9jGu1hGu9hGu1hGu9jGu1hGu9hGu1hGu9jGu1hGu9hGu1 hGu9jGu1hGu9hGu1hGu9jGu1hGu9hGu1hGu9jGu1hGu9hGu1hGu9jGu1hGu9 hGu1hGu9jHO9jHPGlHvGjHu9jHu1hHO9jHu9jHO9jHO9hGu9jHO9hGu9jHO9 hGu9jHO9hHO9jHO1hGu9jHO9hGu9jHO1hGu9jHO9hGu9jHO1hGu9jHO1hGu9 jHO1hGu9jHO1hGu9jHO1hGu9jHO1hGu9jHO1hGu9jHO9hGu9jHO9hGu9jHO9 hHO9jHO1hGu1hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu1 hGu1hGu9hGu1hGu1hGu1hGu1hGu1hGO1hGu1hGu1hGu1hGO1hGu1hGu9hGu1 hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9 hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1 hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9 hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1 hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGu9hGu1hGu9 hGu1hGu9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1 hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGO9 hGu1hGu9hGu1hGO9hGu1hGu9hGu1hGu1hGu1e2u1hGu1e2O1hGu1e2u1hGu1 e2O1hGu1e2u1hGu1e2O1hGu1e2O1hGu1e2O1hGu1e2O1hGu1e2O1hGu1hGu9 hGu1e2u1hGu1hGu9hGu1e2u1hGu1hGu9hGu1e2u1hGu1hGu9hGu1e2u1hGu1 hGu9hGu1e2u1hGu1hGu9hGu1e2u1hGu1e2u1hGu1e2O1hGu1e2u1hGu1e2O1 hGu1e2u1hGu1e2O1hGu1e2u1hGu1e2O1hGu1e2u1hGu1e2O1hGu1e2u1hGu1 e2O1hGu1e2u1hGu1e2O1hGu1e2u1hGu1e2O1hGu1e2u1hGu1e2O1hGu1e2u1 hGu1e2O1hGu1e2u1hGu1e2O1hGu1e2u1hGu1e2O1hGu1e2u1hGu1e2O1hGu1 e2u1hGu1e2O1hGu1hGu9hGu1e2u1hGu1hGu9hGu1e2u1hGu1hGu9hGu1e2u1 hGu1hGu9hGu1e2u1hGu1hGu9hGu1e2u1hGu1hGu9hGu1e2u1hGu1e2u1hGu1 e2O1hGu1e2u1hGu1e2O1hGu1hGu9hGu1e2u1hGu1hGu9hGu1e2u1hGu1hGu9 hGu1e2u1hGu1hGu9hGu1e2u1hGu1e2u1hGu1e2O1hGu1e2u1hGu1e2O1hGu1 e2u1hGu1e2O1hGu1e2u1hGu1e2O1hGu1hGu9hGu1e2u1hGu1hGu9hGu1e2u1 hGu1hGu9hGu1e2u1hGu1hGu9hGu1e2u1hGu1e2sAvYRrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYxrtYRrvYRrtYRr vYxrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRr vYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRr vYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRr vYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRr vYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYxrtYRrvYRrtYRrvYRrtYRrvYRrtYRjvYRrtYRr vYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRr vYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYxrtYRrvYRr tYRrvYxrtYRrvYRrtYRrvYxrtYRrvYRrtYRrvYxrvYRrvYxrtYRrvYxrvYRr vYxrtYRrvYxrtYRrvYxrtYRrvYxrvYRrvYxrvYRrvYxrvYRrvYxrtYRrvYxr vYRrvYxrtYRrvYxzvYRrvYxrvYRrvYxzvYRrvYxrvYRrvYxzvYRrvYxrvYRr vYxzvYRrvYxrvYRrvYxzvYRrvYxrvYRrvYxzvYRrvYxrvYRrvYxztYRrvYRr vYxzxpR7xox7xox7vYxzxox7vYxzvYxzvYRzvYxzvYRzvYxzvYRzvYxzvYRz vYxzvYRrvYxzvYRrvYxztYRrvYxzvYRzvYxztYRrvYxzvYRrvYxztYRrvYxz vYRrvYxztYRrvYxzvYRrvYxztYRrvYxzvYRrvYxzvYRzvYxzvYRzvYxztYRr vYxrvYRrvYRrtYRrvYxrtYRrvYRrtYRrvYxrtYRrvYRrtYRrvYxrtYRrvYRr tYRrvYxrtYRrvYRrtYRrvYxrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRr vYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRr vYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRr vYRrtYRrvYRrtYRrvYRrtYRrvYxrtYRrvYRrtYRrvYxrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRr vYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRr tYRrvYRztYRrvYRrtYRrvYRrtYRrtYRrtXtrvYRrtYRrtYRrtXtrvYRrtYRr tYRrtXtrvYRrtYRrtYRrtXtrvYRrtYRrtYRrtXtrvYRrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRr vYRrtYRrvYRrtYRrvYRrtYRrtYRrtXtrvYRrtYRrtYRrtXtrvYRrtYRrtYRr tXtrvYRrtYRrtYRrtXtrvYRrtYRrtYRrtXtrvYRrtYRrtYRrtXtrvYRrtYRr tYRrtXtrvYRrtYRrtYRrtXtrvYRrtYRrtYRrtXtrvYRrtYRrtYRrtXtrvYRr tYRrtYRrtXtrvYRrtYRrtYRrtXtrvYRrtYRrtYRrtXtrvYRrtYRrtYRrtXtr vYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrtYRrtXtrvYRrtYRr tYRrtXtrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrtYRrtXtrvYRrtYRrtYRrtXtrvYRrtYRrtYRrtXtr vYRrtYRrtYRrtXtrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYRrALV7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7 a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WE a7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WE a72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WE a7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7 a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72E a7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WE a72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WE a7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7 a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72E a7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7Y7WEa7V7a7WEa7V7Y7WEa7V7 a7WEa7V7a7WEa7WEa7WEa7V7Y7WEa7V7Y7WEa7V7Y7WEa7V7a7WEa7V7Y7WE a7V7a7WEa7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7Y7WEa7V7a7WEa7V7 Y7WEa7V7a7WEa7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7Y7WEa7V7a7WE a7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WE a72Ea7V7a7WEa7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7V7a72E a7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WE a72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72E a7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ea7WEa7WEa72Ec8aUe8aM e8aMe72Ec72Mc72Ec72Mc7WEa72Mc7WEa72Mc7WEa72Ec7WEa72Ec7WEa72E a7WEa72Ec7WEa72Ec7WEa72Ec7WEa72Ea7WEa72Ea7WEa72Ea7WEa72Ec7WE a72Ea7WEa72Ec7WEa72Ec7WEa72Ec7WEa72Ec7WEa72Ec7WEa72Ea7WEa72E a7V7a7WEa7WEa7WEa7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7WEa72Ea7WE a72Ea7WEa72Ea7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WE a7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7 a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72E a7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WE a72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WE a7WEa72Ea7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7a7WEa7WEa72Ea7V7 a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72E a7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7WEa72Ea7V7a7WEa7V7 a7WEa7V7Y7V7a7V7Y7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WE a7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7 Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WE a7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7 Y7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7 a7V7Y7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7Y7WEa7V7a7WEa7V7a7WEa7V7 a7WEa7V7a7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7Y7WEa7V7Y7WEa7V7a7WE a7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7 a7WEa7V7Y7WEa7V7a7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7Y7WEa7V7Y7WE a7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7 Y7V7a7V7Y7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7Y7WE a7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7 a7WEa7V7awC9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9 hGu1hGu9hGu1hGu1hGu1e2u9hGu1hGu1hGu1e2u9hGu1hGu9hGu1hGu9hGu1 hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9 hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1 hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9 hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1 hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9 hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1 hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9 hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1 hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9 hGu1hGu1hGu1e2u9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1 hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9 hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1 hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9 hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1 hGu9hHO1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hHO1hGu9 hGu1hGu9hHO1hGu9hGu1hGu9hHO1hGu9hGu1hGu9hHO1hGu9hGu1hGu9hHO1 hGu9hGu1hGu9hHO1hGu9hHO9hHO9jHO1e2u1hGu9hHPGlHvGjHu9jHu9jHO9 jHu9hHO9jHO1hHO9jHO9hHO9jHO1hGu9jHO1hGu9jHO1hGu9jHO1hGu9jHO1 hGu9jHO1hGu9hHO1hGu9jHO1hGu9hHO1hGu9jHO1hGu9hHO1hGu9jHO1hGu9 jHO1hGu9jHO1hGu9hHO1hGu9jHO9hHO9hGu1hGu9hHO1hGu9hGu1hGu9hGu1 hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hHO1hGu9hGu1hGu9 hHO1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1 hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9 hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1 hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9 hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu1hGu1 e2u9hGu1hGu1hGu1e2u9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9 hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1 hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1hGu9hGu1e2u9hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2u9hGu1e2u1hGu1e2u9hGu1e2u1hGu1e2u9hGu1e2u1hGu1 e2u9hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1 e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1 e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u9hGu1e2u1hGu1e2u9hGu1e2u1 hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1 e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1 e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1 e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGsAtXtr tYRrtXtjtYRrtXtrtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRr tXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtj tYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRr tXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtj tYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRr tXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtj tYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRr tXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtj tYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRr tXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtj tYRrtXtrtYRrtXtjtYRrtXtrtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtrtYRr tXtjtYRrtXtrtYRrtXtjtYRrtXtrtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtj tYRrtXtjtYRrtXtrtYRrtXtjtYRrtXtrtYRrtXtjtYRrtXtjvYRrtXtjtYRr tXtjvYRrtXtjtYRrtXtrvYRrtXtjvYRrtXtrvYRrtXtjvYRrtXtrtYRrtXtj tYRrtXtrvYRrtXtrtYRrtXtrtYRrtXtjtYRrtXtrtYRrtXtjtYRrtXtrvYRr tXtjvYRrtXtrvYRrtXtjvYRrtXtrvYRrtXtjvYRrtYRrvYRrtXtrvYRrtYRr vYRrtXtrvYRrtYRrvYRrtXtrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRr tYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRrvYRrtYRr vYRrtYRrvYRztYRrtYRrtXtjtYRrtYRrxox7vYxzvYxzvYRzvYxztYRzvYRz tYRrvYRztYRrvYRztYRrvYRrtYRrvYRrtYRrtYRrtYRrvYRrtYRrtYRrtYRr tYRrtYRrtYRrtYRrvYRrtYRrtYRrtYRrvYRrtYRrtYRrtYRrvYRztYRrtYRr tYRrtYRrtYRrtYRrtYRrvYRrtYRrtYRrtYRrtYRrtXtjtYRrtXtrvYRrtXtj vYRrtXtrvYRrtXtjvYRrtXtrvYRrtXtjvYRrtXtrvYRrtXtjvYRrtXtjtYRr tXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtj tYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRr tXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtj tYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRr tXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtj tYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRr tXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtjtYRrtXtj tYRrtXtjtYRrtXtjtYRrtXtrtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRr tXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtj tYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtr tXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtj tXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRr tXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtj tYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtr tXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtj tXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRr tXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtj tYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtr tXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtj tXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjAL2Ea7WEa72Ea7V7a72E a7WEa72Ea7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a7WEa7V7a7WEa7V7 a7WEa7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WE a7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7 a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72E a7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7 a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WE a7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7 a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72E a7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7 a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7WEa72E a7V7a72Ea7WEa72Ea7V7a7WEa7V7a7WEa7V7a72Ea7WEa72Ea7WEa72Ea7WE a72Ea7V7a72Ea7WEa72Ea7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72E a7WEa72Ea7V7a72Ea7WEa72Ea7V7a72Ea7V7a72Ea7V7a72Ea7V7a72Ea7V7 a72Ea7WEa72Ea7V7a72Ea7WEa72Ea7V7a72Ea7WEa72Ea7V7a72Ea7WEa72E a7WEa72Ea7WEa72Ea7V7a72Ea7WEa72Ea7V7a72Ea7WEa72Ea7V7a72Ea7WE a72Ea7V7a72Ea7WEa72Ea7V7a72Ec72Ea72Ea7WEa72Ea7WEa72Ea7V7a72E a7WEa72Ea7V7a72Ec7WEa72Ea7WEa72Ec7WEa72Ea7WEa72Ec7WEa72Ea7WE a72Ec7WEa72Ea7WEa72Ec7WEa72Ea7WEa72Ec7WEa72Ea7WEa72Ec7WEa72E a7WEa72Ea7V7a7WEa72Ec8aMe72Mc72Mc72Ec72Mc72Ec72Mc7WEc72Mc7WE a72Mc7WEa72Mc7WEa72Ec7WEa72Mc7WEa72Ea7WEa72Ec7WEa7WEa7WEa72M c7WEa72Ec7WEa72Mc7WEa72Ec7WEa72Ec7WEa72Ec7WEa72Ec7WEa72Ec7WE a72Ec72Ea72Ec7WEa72Ec7WEa7WEa7V7a72Ea7WEa72Ea7V7a72Ea7WEa72E a7V7a72Ea7V7a72Ea7V7a72Ea7V7a72Ea7V7a72Ea7V7a7WEa7V7a72Ea7V7 a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72E a7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7 a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WE a7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7 a7WEa7V7a72Ea7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a72E a7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7 a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WEa7V7a72Ea7V7a7WE a7V7a72Ec7WEa7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7Y7WEa7V7 a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WE a7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7 Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WE a7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7 a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WE a7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7 a7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WE a7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7a7WEa7V7 a7WEa7V7a7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WE a7V7a7WEa7V7Y7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7 a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7a7WE a7V7Y7WEa7V7a7WEa7V7Y7WEawCte2O1e2u1e2O1e2ute2O1e2u1e2O1e2ut e2O1e2u1e2O1e2ute2O1e2u1e2O1e2ute2O1e2u1e2O1e2ute2O1e2u1e2O1 e2u1e2O1e2u1e2u1hGu1e2O1e2u1e2u1hGu1e2O1e2u1e2u1hGu1e2O1e2u1 e2u1hGu1e2O1e2u1e2u1hGu1e2O1e2u1e2u1hGu1e2u1hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2O1e2u1e2u1hGu1 e2O1e2u1e2u1hGu1e2O1e2u1e2u1hGu1e2O1e2u1e2u1hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2u1hGu1e2O1e2u1e2u1hGu1e2O1e2u1e2u1hGu1e2O1e2u1 e2u1hGu1e2O1e2u1e2u1hGute2O1e2u1e2O1e2ute2O1e2u1e2O1e2u1e2u1 hGu1e2u1hGu1e2u1hGu1e2u1hGute2O1e2u1e2O1e2ute2O1e2u1e2O1e2u1 e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2O1e2u1e2u1hGu1e2O1e2u1e2u1 hGu1e2O1e2u1e2u1hGu1e2O1e2u1e2u1hGu1e2O1e2u1e2u1hGu1e2O1e2u1 e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1 e2u1hGu1e2u1hGu1e2O1hGu1e2u1hGu1e2O1hGu1e2u1hGu1e2O1hGu1e2u1 hGu1e2O1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2O1hGu1 e2u1hGu1e2O1hGu1e2u1hGu1e2O1hGu1e2u1hGu1e2O1hGu1e2u1hGu1e2O1 hGu1e2u1hGu1e2O1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1 e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1 e2u1hGu1hGu9hHO9hHO9jHu1hGu1hHO1hGu9hHO1hGu9hHO1hGu9hGu1e2u1 hGu1hGu9hGu1e2u9hGu1hGu9hGu1e2u1hGu1e2u9hGu1e2u1hGu1e2u9hGu1 e2u1hGu1e2u9hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2O1hGu1e2u9 hGu1e2u1hGu1e2u1hGu1e2O1hGu1e2u1hGu1e2O1e2u1e2O1hGu1e2O1hGu1 e2u1hGu1e2O1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1 e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1 e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2O1e2u1e2u1hGu1e2O1e2u1e2u1hGu1e2u1hGu1e2u1hGu1 e2u1hGu1e2u1hGute2O1e2u1e2O1e2ute2O1e2u1e2O1e2u1e2O1e2u1e2u1 hGu1e2O1e2u1e2u1hGu1e2O1e2u1e2u1hGu1e2O1e2u1e2u1hGu1e2O9hGu1 e2O1e2O1e2O1hGute2O1hGute2O1e2Ote2O1e2ute2O1e2Ote2O1e2u1e2O1 hGu1e2O1hGu1e2O1hGu1e2O1hGute2O1e2Ote2O1e2ute2O1e2Ote2O1e2u1 e2O1hGu1e2O1hGu1e2O1hGu1e2O1hGute2O1e2u1e2O1e2ute2O1e2u1e2O1 e2u1e2O1hGu1e2O1hGu1e2O1hGu1e2O1hGu1e2O1hGu1e2O1hGu1e2O1hGu1 e2O1hGute2O1e2u1e2O1e2ute2O1e2u1e2O1e2u1e2O1hGu1e2O1hGu1e2O1 hGu1e2O1hGute2O1e2u1e2O1hGute2O1e2u1e2O1hGu1e2O1hGu1e2O1hGu1 e2O1hGu1e2O1hGute2O1e2u1e2O1hGute2O1e2u1e2O1hGute2O1e2u1e2O1 hGute2O1e2u1e2O1hGute2O1e2Ote2O1e2ute2O1e2Ote2O1e2ute2O1e2Ot e2O1e2ute2O1e2Ote2O1e2u1e2O1hGu1e2O1hGu1e2O1hGu1e2O1hGu1e2O1 e2u1e2u1hGu1e2O1e2u1e2u1hGute2O1e2u1e2O1hGute2O1e2u1e2O1hGut e2O1e2u1e2O1e2ute2O1e2u1e2O1e2ute2O1e2Ote2O1e2ute2O1e2Ote2O1 e2u1e2O1hGu1e2O1hGu1e2O1hGu1e2O1hGute2O1e2Ote2O1e2ute2O1e2Ot e2O1e2ute2MAtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtr tYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRr tXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtr tYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRr tXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtr tYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRr tXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtr tYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRr tXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtr tYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRr tXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtr tYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRr tXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtr tYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRr tXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrvYRrtXtrtYRrtXtr vYRrtXtrtYRrtXtrvYRrtXtrtYRrtXtrvYRrtXtrtYRrtXtrvYRrtXtrtYRr tXtrvYRrtXtrvYRrtXtrvYRrtYRrvYRrtXtrvYRrtYRrvYRrtXtrvYRrtYRr vYRrtXtrvYRrtYRrvYRrtXtrvYRrtYRrvYRrtXtrvYRrtYRrvYRrtXtrvYRr tYRrvYRrtXtrvYRrtYRrvYRrtXtrvYRrtYRrvYRrtXtrvYRrtYRrtYRztYRz vYx7vYRzvYx7tYRzvYRztYRzvYRztYRrvYRztYRrvYRztYRrvYRztYRrvYRz tYRrvYRztYRrvYRrtYRrvYRztYRrvYRrtYRrvYRztYRrvYRrtYRrvYRztYRr vYRrtYRrvYRrtYRrvYRrtXtrvYRrtXtrtYRrtXtrvYRrtYRrvYRrtXtrvYRr tXtrtYRrtXtrvYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtr tYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRr tXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtr tYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRr tXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtr tYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRr tXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtr tYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRr tXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtYRrvYRrtXtjtYRrtXtr tYRrtXtrtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtYRrtXtjtYRrtXtrtYRr tXtjtYRrtXtrtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtYRrtXtjtYRrtXtr tYRrtXtjtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRr tXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtr tYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtjtYRrtXtrtYRrtXtjtYRrtXtrtYRr tXtjtYRrtXtrtYRrtXtjtYRrtXtrtYRrtXtjtYRrtXtrtYRrtXtjtYRrtXtr tYRrtXtjtYRrtXtrtYRrtXtjtYRrtXtrtYRrtXtjtYRrtXtrtYRrtXtjtYRr tXtrtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtXtrtXtj tYRrtXtjtYRrtXtjtYRrtXtrtYRrtXtjtYRrtXtrtYRrtXtrtYRrtXtrtYRr tXtrtYRrtXtrtYRrtXtjtYRrtXtrtYRrtXtjtYRrtXtrtYRrtXtrtYRrtXtr tYRrtXtrtYRrtXtrtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtYRrtXtjtYRr tXtrtYRrtXtjtYRrtXtrtXtrtXtjtYRrtXtjtXtrtXtjtYRrtXtjtYRrALV7 Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7 a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617 Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7 a617Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7 a7WEa7V7Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7 a7V7Y7V7a617Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7Y7V7a617 Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7 a617Y7V7a7V7Y7V7a617Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7 Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7 a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617 Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7a7WEa7V7Y7V7a7V7a7WE a7V7Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7 a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7 a7V7Y7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7a7WEa7V7 Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7Y7WE a7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7a7WEa7V7Y7WEa7V7a7WEa7V7Y7WEa7V7 a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WE a7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7 a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa617a7WEc7V7a72Ec72Ec72M e7WEa7WEa7WEa72Ec7V7a72Ea7V7a72Ea7V7a72Ea7WEa72Ea7V7a7WEa7V7 a72Ea7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7a7WE a7V7a7WEa7V7Y7WEa7V7a7WEa7V7a7WEa7V7a7WEa7V7Y7WEa7V7a7WEa7V7 Y7WEa7V7Y7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7Y7WEa7V7Y7V7a7V7a7WE a7V7Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7 a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7 a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7 Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7a7WE a7V7Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7Y7V7a617Y7V7a7V7 Y7V7a617Y7V7a7V7a7WEa7V7Y7V7a7V7a7WEa7V7Y7V7a7V7Y7V7a617Y7V7 a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617 Y7V7a7V7Y7V7a617Y7V7a7V7Y72Ec7V7a7V7a7V7Y7WEa617Y7V7a617Y7V7 a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617 Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7 a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617 Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7 a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7 Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a7V7Y7V7a617Y7V7 a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a617Y7V7a617 Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a7V7Y7V7 a617Y7V7a7V7Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a7V7 Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7a7V7Y7V7a617Y7V7 a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617 Y7V7a617Y7V7a617Y7V7a617Y7V7a617Y7V7a617YwC1hGu1e2u1e2u1e2u1 hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1 e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1hGu1e2u1 e2u1e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1hHO1 e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1 hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1 e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hGu1e2u1e2u1e2u1hGu1e2u1 e2u1e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1hGu1 e2u1e2u1e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hGu1e2u1e2u1e2u1 hGu1e2u1e2u1e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hGu1e2u1e2u1 e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1hGu1e2u1 e2u1e2u1hGu1e2u1e2u1e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1 e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1 hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1 e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1e2u1 hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1 e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u9hGu1e2u1hGu1e2u9 hGu1e2u1hGu1e2u9hGu1e2u1hGu1e2u9hGu1e2u1hGu1e2u9hGu1e2u1hGu1 e2u9hGu1e2u1hGu1e2u9hGu1e2u1hGu1e2u9hGu1e2u1hGu1e2u9hGu1e2u1 hGu1e2u9hGu1e2u1hGu1e2u1hHO1e2u1hGu1hHO9jHu9jHO9hHO1hGu9hHO1 hGu9hHO1hGu9hHO1hGu9hHO1hGu9hHO1hGu9hHO1hGu9hHO1hGu9hGu1e2u9 hHO1hGu9hGu1e2u9hHO1hGu9hGu1e2u9hHO1hGu1hGu1e2u9hGu1e2u1hGu1 e2u1hGu1e2u1hGu1e2u9hHO1e2u1hGu1e2u9hGu1e2u1hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1 e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1 hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1 e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1e2u1 hGu1e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hHO1 e2u1hGu1e2u1hHO1e2u1hGu1e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1 hHO1e2u1hGu1e2u1hHO1e2u1hGu1e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1 e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2u1hGu1e2u1 e2u1e2u1hGu1hGu1hGute2O1hGu1e2u1e2u1e2u1hGu1e2u1e2u1e2O1hGu1 e2u1e2u1e2O1e2u1e2O1e2ute2O1e2u1e2O1e2ute2O1hGu1e2u1e2u1e2O1 hGu1e2u1e2u1e2O1e2u1e2O1e2ute2O1e2u1e2O1e2ute2O1e2u1e2u1e2u1 e2u1e2u1e2u1e2u1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2u1hGu1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1 e2O1e2ute2O1e2u1e2O1e2ute2O1hGu1e2u1e2u1e2O1hGu1e2u1e2u1e2O1 e2u1e2O1e2ute2O1e2u1e2O1e2ute2O1hGu1e2u1hGu1e2u1hGu1e2u1hGu1 e2u1hGu1e2u1e2u1e2O1hGu1e2u1e2u1e2O1hGu1e2u1e2u1e2O1hGu1e2u1 e2u1e2O1hGu1e2u1e2u1e2O1hGu1e2u1e2u1e2O1hGu1e2u1e2u1e2O1hGu1 e2u1e2u1e2O1e2u1e2u1e2ute2u1e2u1e2u1e2ute2u1hGu1e2u1hGu1e2u1 hGu1e2u1hGu1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1hGu1e2u1e2u1 e2O1hGu1e2u1e2u1e2O1e2u1e2O1e2ute2O1e2u1e2O1e2ute2O1hGu1e2u1 e2u1e2O1hGu1e2u1e2u1e2O1e2sArXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtr rXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtr tXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtr rXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtrtXtrtXtrtXtrrXtr tXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtjtXtrrXtrtXtr rXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtrtXtrtXtr tXtrrXtrtXtrtXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtr rXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtr tXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtr rXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtr tXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtr rXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtr tXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtr rXtrtXtrtXtrtXtrrXtjtXtrtXtjtXtrrXtjtXtrtXtjtXtrrXtjtXtrtXtj tXtrrXtjtXtrtXtjtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrtXtjtXtr tXtrtYRrtXtjtXtrtXtrtYRrtXtjtXtrtXtrtYRrtXtjtXtrtXtrtYRrtXtj tXtrtXtrtYRrtXtjtXtrtXtrtYRrtXtjtXtrtXtrtYRrtXtjtXtrtXtrtYRr tXtjtXtrtXtrtYRrtXtjtXtrtXtrtYRrtXtjtXtrtXtrtYRrtXtjtXtrtXtr tYRrtXtjtXtrtXtrtYRrtXtjtXtrtXtrtYRrtXtjtXtrtXtrtYRrtXtjtXtr tXtrtYRrtXtrtXtrrXtjtXtrtXtrvYRztYRzvYRztYRrvYRrtYRrvYRrtXtr tYRrtXtrvYRztXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRr tXtrtYRrtXtrtYRrtXtrtYRrtXtrtYRrtXtjtXtrtXtrtYRrtXtjtXtrtXtr tYRrtXtrtYRrtXtrtYRrtXtrtXtrtXtrtYRrtXtjtXtrtXtjtXtrrXtjtXtr tXtjtXtrrXtjtXtrtXtjtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtr tXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtr rXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtr tXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtr tXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtr tXtrtXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtrtXtrtXtrtXtr rXtrtXtrtXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtr tXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtrvYRz tXtrtXtrrXtrtXtrrXtjtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtj tXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtr rXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXNjtXtrrXtjtXtrrXNjtXtrrXtj tXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtr rXtrtXtrrXNjtXtrrXtjtXtrrXNjtXtrrXtjtXtrrXtjtXtrrXtrtXtrrXtj tXtrrXtrtXtrrXNjtXtrrXtjtXtrrXNjtXtrrXtjtXtrrXtjtXtrrXtrtXtr rXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXNjtXtrrXtj tXtrrXNjtXtrrXtjtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtr rXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtj tXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtr rXNjtXtrrXtjtXtrrXNjtXtrrXtjtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtr tXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtrrXtrtXtrrXtjtXtr rXtrtXtrrXtrALV7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7WEa7V7a7V7a7V7 a7WEa7V7a7WEa7V7a7WEc7V7a7WEa7V7a7WEc7V7a7V7a7V7a7WEa7V7a7V7 a7V7a7WEa7V7a7WEa7V7a7WEc7V7a7WEa7V7a7WEc7V7a7WEa7V7a7WEc7V7 a7WEa7V7a7WEc7V7a7WEa7V7a7WEc7V7a7WEa7V7a7WEc7V7a7WEa7V7a7WE c7V7a7WEa7V7a7WEc7V7a7WEa7V7a7WEc7V7a7WEa7V7a7WEc7V7a7WEc7V7 a7V7a617a7WEa7WEa72Mc72Ec72Ec7WEc72Ec7WEa72Ec7V7a72Ec7V7a72E c7V7a72Ec7V7a7WEc7V7a72Ec7V7a7WEc7V7a72Ec7V7a7WEc7V7a72Ec7V7 a7WEc7V7a7WEc7V7a7WEa7V7a7WEa7V7a7V7a7V7a7WEc7V7a7WEc7V7a7WE c7V7a7WEa7V7a7WEc7V7a7V7a7V7a7WEa7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7WEc617a7V7a7V7 a7V7a7V7a7V7a617a7V7a7V7a7V7a617a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a617a7V7a7V7a7V7a617a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a617a7V7a7V7a7V7a617a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a617 a7V7a7V7a7V7a617a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a617a7V7a7V7a7V7a617a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a617a7V7a7V7a7V7a617a7V7 a7V7a7V7a617a7V7a7V7a7V7a617a7V7a7V7a7V7a617a7V7a7V7a7V7a617 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a7V7a617a7V7a7V7 a7V7a617a7V7a7V7a7V7a617a7V7a7V7a7V7a617a7V7a7V7a7V7a7V7a7V7 a7V7a7V7a7V7a7V7a7V7a7V7a617a7V7a7V7a7V7a617a7V7a7V7a7V7awCt e2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1 e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2utc2u1e2utc2O1e2utc2u1e2ut c2O1e2utc2u1e2utc2O1e2utc2u1e2utc2O1e2utc2u1e2utc2O1e2utc2u1 e2utc2O1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ut e2u1e2utc2u1e2utc2u1e2utc2O1e2utc2u1e2utc2O1e2utc2u1e2utc2O1 e2utc2u1e2utc2O1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2utc2u1e2ut c2O1e2utc2u1e2utc2O1e2utc2u1e2utc2O1e2utc2u1e2utc2O1e2ute2u1 e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ut e2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1 e2utc2u1e2utc2O1e2utc2u1e2utc2O1e2utc2u1e2utc2O1e2utc2u1e2ut c2O1e2utc2u1e2utc2O1e2utc2u1e2utc2O1e2ute2u1e2utc2u1e2ute2u1 e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ut e2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2ute2O1 e2ute2u1e2ute2O1e2ute2u1e2ute2O1e2ute2u1e2ute2O1e2ute2u1e2ut c2u1e2ute2u1e2utc2u1e2u1e2u1e2ute2u1e2u1e2u1e2ute2u1e2u1e2u1 e2ute2u1e2u1e2u1e2ute2u1e2u1e2u1e2ute2u1e2u1e2u1e2ute2u1e2u1 e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1 e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1 e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2ute2u1e2ute2u1e2ute2u1 e2u1e2u9hHO9hHO9hHO1e2u1hHO1e2u1hGu1e2u1e2u1e2u1hHO1e2u1e2u1 e2u1hGu1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1e2u1 e2u1e2u1e2ute2u1e2u1e2u1e2u1e2u1e2u1e2u1e2ute2u1e2u1e2u1e2u1 e2u1e2u1e2u1e2ute2u1e2ute2u1e2ute2O1e2ute2u1e2ute2O1e2ute2u1 e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ut e2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1 e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2ut c2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1 e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2utc2u1e2utc2O1e2ut c2u1e2utc2O1e2ute2u1e2utc2u1e2ute2u1e2utc2u1e2ute2u1e2utc2u1 e2ute2u1e2utc2u1e2utc2u1e2utc2O1e2utc2u1e2utc2O1e2utc2u1e2ut c2O1e2utc2u1e2utc2O1e2ute2u9hHO1e2u1e2ute2u1e3Otc2u1e2utc2u1 e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2ut c2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1 e2utc2u1e2utc2O1e2utc2u1e2utc2O1e2utc2u1e2utc2u1e2utc2u1e2ut c2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2O1e2utc2u1 e2utc2O1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2ut c2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2ute2u1e2utc2u1 e2ute2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2ut c2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2ute2u1 e2utc2u1e2ute2u1e2utc2u1e2utc2u1e2utc2O1e2utc2u1e2utc2O1e2ut e2u1e2utc2u1e2ute2u1e2utc2u1e2utc2u1e2utc2O1e2utc2u1e2utc2O1 e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2ut c2u1e2utc2u1e2utc2u1e2utc2u1e2utc2u1e2utc2sAtXtrtXtrtXtrtXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtr tXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtr tXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtr rXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrrXtrtXtrtXtr tXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrtXtrtXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtr rXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtr tXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtr tXtrtXtrtYRrtXtrtXtrtXtrtYRrtXtrtXtrtXtrtYRrtXtrtXtrtXtrtYRr tXtrtXtrtXtrtYRrtXtrtXtrtXtrtYRrtXtrtXtrtXtrtYRrtXtrtXtrtXtr tYRrtXtrtXtrtXtrtYRrtXtrtXtrtXtrtYRrtXtrtXtrtXtrtYRrtXtrtXtr tXtrtYRrtXtrtXtrtXtrtYRrtXtrtXtrtXtrtYRrtXtrtXtrtXtrtYRrtXtr tXtrtXtrtYRrtXtrtXtrtXtrtXtrtXtrtYRztXtrtYRzrXtrtYRrtXtrvYxz vYRzvYRztXtrvYRztXtrtYRrtXtrvYRztXtrtYRztXtrvYRztXtrtYRrtXtr tYRztXtrtYRrtXtrtYRztXtrtYRrtXtrtYRztXtrtYRrtXtrtYRrtXtrtXtr tXtrtYRrtXtrtYRrtXtrtYRztXtrtXtrtXtrtYRztXtrtYRrtXtrtYRrtXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtr tXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtrtXtr tXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtrtXtrrXtrtXtrtXtr tXtrrXtrtXtztXtztXtzrXNrtXtztXtrtXtrtXtrtXtztXtrtXtrrXtrtXtz tXtrtXtrrXtrtXtrrXNrtXtrrXNrtXtrrXNrtXtrrXNrtXtztXtrtXtrrXtr tXtztXtrtXtrrXtrtXtrrXNrtXtrrXNrtXtrrXNrtXtrrXNrtXtrrXtrtXtr rXNrtXtrrXtrtXtrrXNrtXtztXtrtXtrrXtrtXtztXtrtXtrrXtrtXtztXtr tXtrrXtrtXtztXtrtXtrrXtrtXtrrXtrtXtrrXNrtXtrrXtrtXtrrXNrtXtr rXNrtXtrrXNrtXtrrXNrtXtrrXNrtXtrrXtrtXtrrXNrtXtrrXtrtXtrrXNr tXtrrXNrtXtrrXNrtXtrrXNrtXtrrXNrtXtztXtrtXtztXtrtXtztXtrtXtz tXtrtXtrrXtrtXtrrXNrtXtrrXtrtXtrrXNrtXtztXtrtXtrrXtrtXtztXtr tXtrrXtrtXtztXtrtXtrrXtrtXtztXtrtXtrrXtrtXtztXtrtXtztXtrtXtz tXtrtXtztXtrtXtrrXNrtXtrrXNjtXtrrXNrtXtrrXNjtXtztXtrtXtztXtr tXtztXtrtXtztXtrtXtrrXtrtXtrrXNrtXtrrXtrtXtrrXNrtXtztXtrtXtr rXtrtXtztXtrtXtrrXtrtXtrrXNrtXtrrXNrtXtrrXNrtXtrrXNrtXtztXtr tXtrrXtrtXtztXtrtXtrrXtrtXtrAAQAAAAnAf//AwAAAB4ABAAAAAcBBAAx /wEAQQsgAMwAiACBAgAAAABSMc0Udw21/ygAAACBAgAAiAAAAAEAGAAAAAAA IP4DAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////8A//////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////AP// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////////wD///////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////8A//////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////AP////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////wD/ //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////8A//////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////AP////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////wD///////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////8A //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////////////////////AP////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////wD///////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////8A//////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// AP////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////////////wD///////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////8A//////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////AP////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /wD///////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////8A//////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////////AP////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////wD///////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //8A//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////////////////////////AP////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////wD///////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////8A//////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////AP////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////////////////wD///////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////8A//////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////AP////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////wD///////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////8A//////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////////////AP////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////wD///////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////8A//////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////////////////////////////AP////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////wD///////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////8A//////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////AP////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////////////////////wD///// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////8A//////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////AP////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////wD///////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////8A//// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////////////////AP////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////wD///////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////8A//////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////AP// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////////wD///////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////8A//////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////AP////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////wD/ //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////8A//////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ///////////3///////3///////3//////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////AP////////////////////////////// //////////////////////////////////////////////////////////// ////////////////////////////////////////9///9/////////////// ////////////////////////////////9///////9/////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////wD///////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////f////////////3///e///G//+1///O///W ///W///n///3//////////////f///////////////////f///////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////f///////////////////////f/ //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////f///////////////f///// //////////f///////////////f///////////////f///////////////// //////////////////////////////f///////////////f///////////// //f///////////////f///////////////f///////////////f///////// //////f///////////////f///////////////f///////////////f///// //////////f///////////////f///////////////f///////////////f/ //////////////f///////////////f///////////////f///////////// //f///////f///////f///////f///////f///////////////f///////// //////f///////////////f///////////////f///////////////f///// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////f///////////////f///////////////f///////////// //f///////////////f///////////////f///////f///////f///////f/ //////f///////////////f///////////////f///////f///////f///// //f///////f///////f///////f///////f///////f///////f///////f/ //////f///////f///////f///////f///////f///////f///////f///// //f///////f///////f///////f///////f///////f///////f///////f/ //////f///////f///////f///////f///////f///////f///////f///// //f///////f///////f///////f///////f///////f///////f///////f/ //////f///////f///////f///////f///////f///////f///////f///// //f///////f///////f///////f///////f///////f///////f///////f/ //////f///////f///////f///////f///////f///////f///////f///// //f///////f///////f///////f///////f///////f///////f///////f/ //////f///////f///////f///////f///////f///////f///////f///// //f///////f///////f///////f///////f///////f///////f///////cA //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ////////////////3v//tf//nP//jP//lP//lP//e///hP//lP//nP//vf// 1v//7///9/////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ///////////////////////////3//////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////3 ///////3///////3///////3//////////////////////////////////// ///////////////////////////////////////////3//////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ///3///////////////3//////////////////////////////////////// ///////////////////////////////3///////3///////3///////3//// ///////////3///////////////3///////////////3///////////////3 ///////3///////3///////3///////3///////3///////3///////3//// ///3///////3///////3///////3///////3///////3///////3///////3 ///////3///////3///////3///////3///////3///////3///////3//// ///3///////3///////3///////3///////3///////3///////3///////3 ///////3///////3///////3///////3///////3///////3///////3//// ///3///////3///////3///////3///////3///////3///////3///////3 ///////3///////3///////3///////3///////3///////3///////3//// ///3///////3///////3///////3///////3///////3///////3///////3 ///////3///////3///////3///////3///////3///////3///////3//// ///3///////3///////3///////3///////3///////3///////3///////3 ///////3///////3///////3///////3///////3///3AP//9///9///9/// 9///9///9///9///9///9///9///9///////9///9///9///////9/////// 9///////9///////////////7///9///////////9///9///9////87//5z/ /3P//5T//5T//5z//5T//6X//63//5T//5T//63//5z//5T//73///////// ////////////5///7///9///////////////////9///9///9///9///9/// 9///9///////9///9///9///9///7///9///9///////9///9///////9/// 9///9///9///////7///9///9///////9///9///////9///9///////9/// ////////9///9///9///9///9///9///9///9///9///9///9/////////// 9///9///9///7///////////9///9///7///9///7///////////7/////// ////9///////9///9///////////9///9///7///9///9///////9/////// ////////////////9///9///9///////9///////9///////9///////9/// ////////////9///////////////////9///9///////////9///7/////// ////////9///9///9///9///////////////////7///9///9/////////// 9///9///9///9///////9///9///9///////9///////9///////9/////// ////////////////////////////////9///////9///////9/////////// ////////9///9///9///9///////////////9/////////////////////// 9///9///////9///9///////9///////7///////////9///9///9///9/// 9///9///7///9///9///////9///9///7///9///////9///7///9/////// 7///////9///////9///////9///9///9///9///9///9///9///9///9/// 7///9///////7///////9///9///9///9///7///9///7///9///9/////// 7///9///7///////9///9///9///7///////9///7///9///9///////9/// 9///9///9///////9///9///7///////9///7///9///9/////////////// 7///7///9///9///9///9///9///9///7///7///9///9///7///9///9/// 9///7///////7///9///7///9///9///////9///////5///////////9/// 9///7///9///9///9///////9///9///9///9///9///////9///////9/// ////9///9///7///////9///9///9///////9///9///9///////9///9/// 9///////9///9///9///////9///////9///////9///////9///////9/// ////////////9///////////////9///////9///////9/////////////// 9///////9///////9///////9///////9///////////////9/////////// ////////////////////////////////////9///////9///////9///9/// 9///9///9///9///9///9///9///9///9///9///9///9///9///////9/// 9///9///9///9///9///9///9///9///9///9///9///9///9///9///9/// 9///9///9///9///7///9///9///9///7///9///9///9///9///9///9/// 9///9///9///9///9///9///9///9///9///9///9///9///9///7///9/// 7///9///7///9///7///9///7///9///9///9///7///9///9///9///7/// 9///9///9///7///9///9///9///9///9///9///9///9///9///9///9/// 9///9///9///9///9///9///9///9///9///9///9///9///9///9///9/// 9///9///9///9///////9///9///9///////9///9///9///9///9///9/// 9///9///9///9///9///9///9///9///9///9///9///9///9///9///9/// 9///9///9///9///9///9///9///9///9///9///9///9///9///9/////// 9///9///9///////9///9///9///9///9///9///9///9///7///9///7/// 9///7///9///7///9///7///9///9///9///7///9///9///9///9///9/// 9///9///9///9///9///9///9///9///9///9///9///9///9///9///9/// 9///9///9///9///9///9///9///9wD///f///f///////f///f///f///// //f///f///f///////f///f///f///////f///////f///////////////f/ //////f///f///f///////////f//+/////////W//+l//97//+M//+c//+U //+M//+U//+l//+M//+U//+l//+l//+M//+9///3/////////////////+f/ //////f///////////f///f///////f///f//+////////f///f///////// //f///////f///f///////////f///////f///f///////////////////f/ //f///f///////////////f///////f///f///f///////////////f///f/ //f///////////////f///f///////////f///////////f///f///////f/ //////////////f///////f///f///f///////f///f///////////////// //f///////f///////f///f///f///////f///f//+////////////////f/ /+////f///////f///////f///////f///////f///f///f///f///f///f/ //f///f///f///////f///////////////f///f///////////////f///f/ //////////////f///////f///f///f///////f///////////f///f///// //f///f///f///////f///f///////f//+////f///f///////////////// //////////////////////////f///f///////////////////////////// //f///////////////////////f///////////////////////f///f///f/ //////////f//+////f//+////////////////f///f//+////////f///// //f///////f///////f///////f//////+////////f///f///f///////f/ //////f///f///f///f///f///f///f///f///f///////f///f///f///// //f///f///f///f//+////f///f///f///f///f///////f//+////f///// //////f///f///f///f///f///f///f///////////f///f///f///f///f/ //f///f///f///f///f///f//+////f///////////f///f///////f///f/ /+///+////f///f///////f///////f///f///f///f///f///f///f///f/ //f///f///f///////////////f//+///+///////////////+////f//+// //////f///////////////f///////////////////////////////f///// //f///////f///////f///////f///////f///////f///////f///////f/ //////f///////f///////f///////f///////f///////f///////////// //f///////////////f///////////////////////////////f///////// //////f///////////////////////////////////////////////////// //////////////////////////f///////f///////f///////f///f///f/ //f///f///f///f///f///f///////f///////f///////f///////f///f/ //f///////f///f///f///////f///f///f///////f///f///f///////f/ //f///f///f///f///f///f///f///f///f///f///f///f///f///f///f/ //f///f///f///f///f///f///f///f///f///f///f///f///f///f///f/ //f///f///f///f///f///f///f///f///f///f///f//+////f///f///f/ /+////f///f///f///f///f///f///f///f///f///f///f///f///f///f/ //f///f///f///f///f///f///f///f///f///f///f///f///f///f///f/ //f///f///f///f///f///f///f///f///f///f///f///f///f///f///f/ //f///f///f///f///f///f///f///f///f///f///f///f///f///f///f/ //f///f///f///f///f///f///f///f///f///f///f///f///f///f///f/ //f///f///f///f///f///f///f///f///f///f///f///f///f///f///f/ //f///f//+////f///f///f//+////f///f///f///f///f///f///f///f/ //f///f///f///f///f///f///f///f///f///f///f///f///f///f///f/ //f///f///f///cA///3///3///3///3///3///3///3///3///3///3///v ///3///3///3///v///3///3///v///n///3///v///3///v///3//////// ///3///v///W///W///n////1v//tf//e///jP//lP//lP//hP//jP//jP// hP//hP//nP//lP//lP//rf//5//////////////////v///3///3///3//// ///3///3///3///v///v///3///////////v///3///v///v///v///v//// ///////////v///3///3///v///////v///////////3///3///3//////// ///3///////3///3///n///3///////////v///3///3///3//////////// ///////////3///////////v///3///////////3//////////////////// ///////////3///////3///3///v///////////////v///3///3///3///3 ///////////v///3///v///3///////////////////////v///3///3///3 ///v///3///3///3///v///3///v//////////////////////////////// ///v///v///////////3///v///3///3///3///////////3///3///v///v ///3///3///n///3///////////////////////////v///3///////////v ///3///v///3///v///3///////3///3///////////////3///3///3//// ///////v///3///////3///3//////////////////////////////////// ///3///3///////////////////////////////////3///v///3///v///v ///////v///v///3///v///3///v///////3///3///v//////////////// ///////////3///////3///3///v///////3///v///3///////////3///3 ///v///3///3///3///v///3///n///////v///v///v///3///v///3///v ///3///v///////////////v///3///3//////////////////////////// ///3///3///v///3///3///////////v///v///////v///////////////v ///3///3///3///////////////////////v///n///3///v///////n///3 ///v///3///3///////////////////////3///v///v///3///v//////// ///////////3///3///3///////////////3///3//////////////////// ///////////3///////v///////////3///v///v///v///v///3///3///v ///3///3///3///v///3///3///3///v///3///3///3///v///3///3///3 ///3///3///3///3///3///3///3///3///3///3///3///3///3///3///3 ///3///3///3///3///////3///3///3///////3///3///3///////3///3 ///3///////3///3///3///////3///3///3///////3///3///3///////3 ///3///3///////3///3///3///3///3///3///v///3///v///3///v///3 ///v///3///3///3///v///3///3///3///v///3///v///3///v///3///v ///3///v///3///v///3///v///3///v///3///v///3///v///3///v///3 ///v///3///v///3///v///3///v///3///v///3///v///3///v///3///v ///3///v///3///v///3///v///3///v///3///v///3///v///3///v///3 ///v///3///v///3///v///3///v///3///v///v///v///3///v///v///v ///3///v///v///v///3///v///v///v///3///v///3///v///3///v///3 ///v///3///v///v///v///3///v///v///v///3///v///3///v///3///v ///3///v///3///v///3///v///3///v///3///v///3///v///3///v///3 ///v///3///v///3///v///3///v///3///v///3///v///3///v///3///v ///3///v///3///v///3///v///3///v///3///v///3///v///3///v///3 ///v///3///v///3///v///3///v///3///v///3///v///3///v///3///v ///v///v///3///v///v///v///3///v///v///v///3///v///v///v///3 ///v///v///v///3///v///v///v///3///v///3///v///3///v///3///v AP//9///9///9///9///9///9///9///9///9///9///9///9///9///9/// 9///9///9///1v/vzv//1v//5///3v//5///5///7///5///1v//vf//tf/3 rf//1v//997//8b//5z//5T//63//5T//4z//5T//4z//4T//4z//5T//5T/ /4z//6X//8b/////////9///9///5///////9///////9///7///7///9/// 9///////////////////////9///7///9/////////////////////////// 9///7///7///9///////////////////7///7///////////////7///9/// 9///////////////////////7///9/////////////////////////////// ////////////7///9///9///////////////////////////////////9/// 9///////9///9///////////////////7///9///9/////////////////// 9///5///////////////////////////////////9///9///9///9///9/// 9///9///9/////////////////////////////////////////////////// ////9///9///9///////////////////////////////7///9///9/////// ////////////////////////////////9///////7///7///9///////9/// ////////////////////////9///////////////////////////////9/// ////////////////////////////////////////7///////////9/////// ////////////////////////////////////////////////////////9/// 9///7///9///////////////7/////////////////////////////////// ////////9///////////////////////////////9///9///9///7///9/// 9///9///7///////////////////9///7///9///7///7///7/////////// ////////////5///////////////////////////////////////7///5/// 7///////////////////7///9///////////////////9///7///9/////// ////////////////////////9///////////////////9///9/////////// ////////////////////////////9///7/////////////////////////// 9///////////////////////9/////////////////////////////////// 9///////////////////////9///9///9///9///9///9///7///9///9/// 9///7///9///9///9///7///9///9///9///7///9///9///9///9///9/// 9///9///9///9///9///9///9///9///9///9///9///9///9///9///9/// 9///9///9///9///////9///9///9///////9///9///9///////9///9/// 9///////9///9///9///////9///9///9///////9///9///9///////9/// ////9///////9///9///9///9///7///9///7///9///7///9///7///9/// 9///9///9///9///9///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///7///7///9///7///7///7///9///7///7///7///9///7///7///7/// 9///7///9///7///9///7///9///7///9///7///9///7///9///7///9/// 7///9///7///9///7///9///7///9///7///9///7///9///7///9///7/// 9///7///9///7///7///7///9///7///7///7///9///7///7///7///9/// 7///7///7///9///7///9///7///9///7///9///7///7wD//+////f//+// //f//+////f//+////f//+////f//+////f//+////f//+////f//+//99b/ zq3/3rX/57X/773/973/973/973/97X/963//6X//5z//63//87///fv//fe //+1//+9//+9//+t//+l//+t//+M//+M//+M//+U//+M//+M//+c//+t//// //////f//+///+f//+////f///f///f//+///+///+////f///f///////// //////////f//+f//+///+///////////////////////+////f//+////f/ //f//////////////+////f///////////////f///f//+///+////////// //////f//+////////////////////////////////////////////f///f/ //f///////////////////////////////////////////f//+///+///+// //////////////////f//+////f//////////////////+////f///////// /////////////////////////+////f//+////f//+////f//+////f///// /////////////////////////////////+////////////////f//+////f/ /+f//////////////////////+///+f///f//+////////////////////// /////////////////////+///+///+///+///+///+f//+////////////// /+///+///+////////f///////////////////////f///////////////// /////////////////////////////+////f///f///////////////////f/ //////////////////f//////////////////////+////f//+f///f///// /////+///+///////////////////+///////////////////////+f///// /////////+///+///////////+///+///+////f//+///+///+////f///f/ //////////f//+////f///f//+///+///+///////////////////+///+// //////////////f///////f//////////////////+////f///////////// //f//+////f///////////////////f//+///+///////////////+////// /////////+f//+///////////+///+////f//////////////////////+// /////////////+f//////////////////////+///+////f///////////// //f//97///////////////////f//////+///////////////+f///////// //////f//+///+////f//+////f//+////f//+////f//+////f//+////f/ /+////f//+////f//+////f//+////f//+////f//+////f//+////f//+// //f//+////f//+////f//+////f//+////f//+////f//+////f//+////f/ /+////f//+////f//+////f//+////f//+////f//+////f//+////f//+// //f//+////f//+////f//+////f//+////f//+////f//+////f//+////f/ /+////f//+///+///+///+///+///+///+///+///+///+///+////f//+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+8A///3///v///3///v///3///v///3 ///v///3///v///3///v///3///v///3///v///////e/9a1/86l/96t/96l /++t/+et//el/++c//el//+l//+t//+1///W///v///35///3v//3v//5/// xv//xv//xv//rf//nP//nP//jP//jP//jP//nP//nP//9//////////v///n ///v///3///3///v///v///n///v///v///////////////////////3///v ///v///v///////////////////////3///v///v///v///3//////////// ///v///v///////////////v///3///v///3///////////////3///n//// ///////////////3///v///////////////////3///v//////////////// ///3///3///////3///////////////3///3///v///3//////////////// ///3///v///////////////////////3///v///n///3///3///3///3///3 ///////////3///v///3///v///3///v///3///v///////////////3///3 ///v///3///v///////v///////////////3///v///v///3//////////// ///////////3///v///v///3///////////////v///3///3///v//////// ///3///3///v///3///v///3///v///////////////////3///v///3///v ///3///////////////////////////3///////////////3///////////v ///////////////3///3///////////////v///v///3///////////////v ///////////////////////////3///3///v///v///////////v///3//// ///////////n///v///3///////////////3///3///////////////3///n ///////////v///v///3///v///v///v///3///v///////////////3///3 ///v///3///v///v///////////////////////v///v///////////////3 ///3///v///3///3///////n///v///v///////////////////v///v//// ///////////////3///v///3///3///v///v///////v///////////////3 ///////////3///n///////////////3///3///3///3///3///////3///v ///v///////////////3///v///n///3///////////v///////v//////// ///////3///3///3///3///3///////3///v///////////////3///v///v ///3///v///v///3///v///v///v///3///v///v///v///3///v///v///v ///3///v///3///v///3///v///3///v///3///v///3///v///3///v///3 ///v///3///v///3///v///3///v///3///v///3///v///3///v///3///v ///3///v///3///v///3///v///3///v///3///v///3///v///3///v///3 ///v///3///v///3///v///3///v///3///v///3///v///3///3///3///v ///3///v///v///v///v///v///v///v///3///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///3///v///v///v///3///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///3///v///v///v///3///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///3///v///v///v///3///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///v///v///v///v///v///v///v///v///v///v///v///v ///v///v///v///vAP//7///7///7///7///7///7///7///7///7///7/// 7///7///7///7///7///7///7///7//evf/Wpf/erf/npf/npf/vrf//nP// rf//tf//vf//xv//zv//3v//7///9+///+f///f///f//+f//9b//97//8b/ /73//6X//5T//4T//5T//4z//5T//97/////////7///5///7///////5/// 5///7///7///5///9///////////////////////9///7///7///7/////// ////////////////9///5///5///7///9///////////////5///7/////// ////////7///7///7///7///////////////7///5///////////9///5/// 9///7///5///////////////7///7///////////////9///7///7///7/// 7///9///////////////7///7///9///////////////////7///7/////// ////////////////9///7///7///9///5///5///9///////////////7/// 7///7///7///7///7///7///7///////////////9///7///7///5///3v// 5///9///////////////9///5///7///9///////////////////////7/// 5///7///////////////9///7///7///9///7///7///5///7///7///7/// 5///7///5///7///9///////////////7///7///5///5///5///9///9/// ////////////9///////////////7///////9///7///5///9/////////// 9///7///9///////////9///5///9///////////////7///9/////////// ////////////9///9///5///////////////7///9///////////5///9/// 7///5///9///////////9///7///////////////7///7///////////7/// 7///5///7///7///7///5///7///9///////////9///7///7///3v//7/// ////////////////////////5///////////////3v//9///7///7///5/// 7///7///7///5///7///////////////////5///7/////////////////// 9///5///5///7///5///7///7///9///////////5///9///////////9/// 9///////////7///5///5///7///7///7///5///5///7///9/////////// 7///7///5///5///7///////////9///7///7///////////5///7///7/// 9///7///5///5///7///5///////////////7///9///5///9///7///7/// 5///7///7///7///5///7///7///7///5///7///7///7///5///7///7/// 7///7///7///7///7///7///7///7///7///7///7///7///7///7///7/// 7///7///7///7///7///9///7///7///7///7///7///7///7///7///7/// 7///7///7///7///7///7///7///7///7///7///7///7///7///7///7/// 7///7///7///7///7///7///7///7///7///7///7///7///7///7///7/// 7///5///7///7///7///5///7///7///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///7///7///5/// 7///7///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///7///7///5///7///7///7///5///7///7/// 7///5///7///7///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///7///7///5///7///7///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///5///7///7///7///5///7///7///7///5///7/// 5wD//+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+f///f/98b/1qX/563/56X/763/963//5z//63//8b//9b//97/ /+f///f///////fe///n///3///////v///n///n///e///W//+1//+U//+M //+U//+U//+M///W//////////f//+////f///f//+///+f//+///+///+// /+////////////////////////////f//+f///f///////////////////// /////+f//+///+////////////////f//+f//+///////////////+f///f/ /+////f///////////////f//+f//////////////+///+f//+f//+///+// /////////////+f///////////////f//+///+f//+f//+///+////////// /////+///+////////////////////////////////////////////////// //////f///f//+f///f//////////////////////+///+///+///+///+// /+///+///+////////////////f///f//+f//+f//+f///f//97///////// //////f//+f//+f///////////////f//////////////+///+////////// //////////f//+///+////f//+////f//+///+///+///+///+f//+///+// //f///////////////f//+///+///+////f//+////f///////////////// /////////////////+///+///+f//+f//+///////////////+////////// /////+///+f//+////////////////f///f///f///////////////////f/ /+f//+f///f///////////f//+f//////////////97//+f//+///+////// /////+///+///////////////+///+f//////////+///+///+///+///+// /+///+///+////f//////////+///+///+///+///+f///////////////// /////+////f///////////f//+///+f//97//+f//+f//+f///f//+///+// /+///////////////////+///+///////////////////////+///+///+f/ /+///+f//////////////////+///+///////////+///+///////////+// /+///+///+f//+///+f//+///+f//+f//+////////////f//+///+f//97/ //f///////////f//+f//+///////////+///+f//+///+f//+f//+f//+f/ /+f//+////////////////f///f//+////f//+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// //f//+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+///+////f//+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+f//+///+///+///+///+///+///+///+// /+///+///+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+f//+///+///+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+///+///+///+///+///+///+///+///+///+///+///+// /+///+///+///+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+///+///+f//+///+///+///+f//+///+f//+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+// /+///+f//+///+///+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+f//+///+///+///+f//+///+///+// /+f//+///+///+///+///+///+///+///+///+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+///+///+f//+///+///+///+f//+8A///n///v///n ///v///n///v///n///v///n///v///n///v///n///v///n///v///n///v ///W/96t/96l/++l/++c//+l//el//+1///O///e///n///////////////3 ////3v//////////7///9///////7///5///zv//vf//pf//nP//jP//lP// rf//9//////n///e///n///n///n///3///v///e///v///3///////////v ///////////////e///v///v///////////n///////////////n///v///n ///n///////////v///n///e///////////////n///v///v///v//////// ///////v///v///////////v///v///n///v///v///3///////////3///v ///////////////v///v///v///n///n///n///////////////e///n//// ///////3///n///////////e///////////v///////////////n///e///3 ///////////////////////////n///v///n///v///n///v///n///v//// ///////////v///n///n///n///v///n///v///////////////v///e///n ///////////////3///////////////n///v//////////////////////// ///////////////////////v///v///v///n///n///v///e//////////// ///n///v///v///v///v///n///e///////////n///////////////////v ///e///n///n///v///////////////////3///////////////3///n///3 ///3///////////////n///v///////////////////////3///W///3//// ///////v///v///v///////////////////////////////////v///n//// ///////////e///v///////////n///n///n///v///n///n///n///v///n ///////////n///n///v///n///////////////n///////////v///n//// ///////////////////////////////////////e///n///////////v///n ///////////3///////////v///////////3///v///v///3//////////// ///////v///e///v///////////e///v//////////////////////////// ///////////////e///v///////////v///n///n///v///v///////////3 ///n///v///////////////////////////////////////////v//////// ///////n///n///v///////n///v///n///v///n///v///n///v///n///v ///n///v///n///v///n///v///n///v///n///v///n///v///n///v///n ///v///n///v///n///v///n///v///n///v///v///v///n///v///v///v ///n///v///v///v///n///v///v///v///n///v///v///v///n///v///v ///v///n///v///n///v///n///v///n///v///n///v///n///v///n///v ///n///v///n///v///v///v///n///v///v///v///n///v///n///v///n ///v///n///v///n///n///n///v///n///n///n///v///n///n///n///v ///n///n///n///v///n///n///n///v///n///v///n///v///n///v///n ///v///n///n///n///v///n///n///n///n///n///n///n///n///n///n ///n///v///n///n///n///v///n///n///n///v///n///n///n///v///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///v///n///n///n///n///n///n ///n///v///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///nAP//7///5///7///5///7///5/// 7///5///7///5///7///5///7///5///7///5///7///5///5//ntf/nrf/v pf/3pf//pf//tf//vf//3v//5///9///////////////////797///////// //////////f///f//+f//87//7X//6X//5T//4z//4T//63//+////////// 5///7///5///7///7///7///5///7///////////////7/////////////// 5///7///////////////5///////////////5///7///3v//7/////////// 9///3v//5///////////////5///3v//5///7///////////////9///7/// ////////7///5///7///5///5///7///////////9///7/////////////// 7///7///3v//7///7///7///////////////3v//////////////7///3v// ////////9///////////5///9///////////7///5/////////////////// 7///7///5///7///5///7///5///7///5///7///5///////////////7/// 5///5///7///5///7///7///////////////5///3v//7///////////9/// 5///////////////7///5/////////////////////////////////////// ////////7///5///7///7///5///5///5///9///////////7///7///9/// 5///9///7///9///////////5///7///////////9///7///7///9///7/// 7///7///////////9///9///////////////5///7///5///9/////////// 7///7///5///9///////////////////7///7///7///////////9///7/// 7///7///////////////////////////////7///7///////////////7/// 7///////////5///5///7///5///7///5///7///5///7///////////3v// 5///7///////////////9///7///////////7///7/////////////////// ////////////////////////7///5///////////5///5/////////////// ////9///7///////////////5///9///////////////5///7///3v//7/// 5///////////5///7/////////////////////////////////////////// 5///5///////////7///5///7///5///9///////////7///5///7/////// ////////////////////////////////////5///////////////5///5/// 7///7///7///5///7///5///7///5///7///7///7///5///7///5///7/// 5///7///5///7///5///7///7///7///5///7///7///7///5///7///7/// 7///5///7///7///7///7///7///7///7///7///7///7///7///7///7/// 7///7///7///7///7///7///7///7///7///7///7///7///7///7///7/// 7///7///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///7///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///7///5///7///5///7///5///7///5///7///5///7///5///7/// 5///5///5///7///5///7///5///7///5///7///5///7///5///7///5/// 7///5///5///5///7///5///5///5///7///5///5///5///7///5///5/// 5///7///5///5///5///7///5///5///5///7///5///5///5///7///5/// 5///5///7///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///7///5///5///5///5///5///5///5///7///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///7///5///5///5///7///5///5///5///5///5///5///5///5/// 5///5///5///7///5///5///5///7///5///5///5///7///5///5///5/// 7///5///5///5///7///5///5///5///7///5///5///5///7///5///5/// 5///7///5///5///5///7///5///5///5///7///5///5///5///7///5/// 5///5///7///5///5wD//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/ /+f//+f//+f//+f//+f//+f//+f//+f//97/973/563/76X/95z//6X//7X/ /87//97///f//////////////////////+/3///////////////////////n ///v///n///n///O//+1//+U//+E//+M///G/////////+///+f//+///+f/ /97//+f//+f//97//////////////+f//+f//////////+f//+f///////// /////+f//+////////////f//+f//+f//+f//////////////97//+////// /////////+f//97//+f//97//////////////+f//+f///////////////f/ /97//97//97//+f//////////+///+f//////////////////9b//97//+// /+f//+///////////////+f//////////////+f//+f///////////////// /////+f//97//////////////+f///////////////f//+f//97//97//+f/ /+f//+f//+f//+f//+f//+f//+f//////////////+///+f//+f//+f//+f/ /97//+///////////////+///+f//////////////97//+f///f///////// /////+f///////////////f//+f//+///+f///f//////////////+f//+// /+f//+f//+f//+f//9b///////////////////////////////////////// /////////+///+f///////////////f//+///+f///f//+f///f///////// //f//+///+f//////////+f//97//+////f///////////f//+f//+///97/ /////////////+f///f///f///f//////////+///+f//+f//+///+f//+f/ /+////f///f//////////+///+f//////////////+///+f//////////97/ /+f//+f//+f//+f//+f//+f//+f//97//////////97//+////f///////// /+///+f//+f//////////+///+f//////////////+f//+///97//+f///f/ /////////+f//+f//////////+f//97//////////////////97//+f///f/ /////////+///////////////+f///f//9b//97//+f//+f//////////+f/ /+f//////////97//+f//+f//+f///f//+///////////97//+f///////// /+f//97//97//97//+f//////////+f//97//+f//////////97//+f//97/ /+///+f//////////////+f//////////////+f//+///+f//+///+f//+f/ /+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f/ /+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+///+f//+// /+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/ /+f//+f//+f//+f//+///+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/ /+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/ /+f//+f//+f//97//+f//+f//+f//+f//+f//+f//+f//97//+f//+f//+f/ /+f//+f//+f//+f//+f//+f//+f//+f//97//+f//+f//+f//97//+f//+f/ /+f//97//+f//+f//+f//97//+f//+f//+f//97//+f//+f//+f//97//+f/ /97//+f//97//+f//97//+f//97//+f//97//+f//97//+f//97//+f//97/ /+f//97//+f//97//+f//97//+f//97//+f//97//+f//97//+f//97//+f/ /97//+f//97//+f//97//+f//97//+f//97//+f//97//+f//97//+f//97/ /+f//97//+f//97//+f//97//+f//97//+f//97//+f//+f//+f//97//+f/ /+f//+f//97//+f//97//+f//97//+f//97//+f//97//+f//+f//+f//97/ /+f//+f//+f//97//+f//+f//+f//97//+f//+f//+f//97//+f//+f//+f/ /97//+f//+f//+f//97//+f//+f//+f//97//+f//+f//+f//97//+f//+f/ /+f//97//+f//+f//+f//97//+f//+f//+f//97//+f//+f//+f//97//+f/ /94A///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///e///n///G/++t/++l//+l//+l///G///W///v///3//// ////////////////////////5/////////////////////////////////// ////////7///1v//rf//zv/////////n///n///v///v///W///n///n///v ///////////////n///n///////////////n///////////////n///n//// ///////////n///e///n///////////////n///n///////////////////n ///e///3///////////////n///n///////////////v///v///n///v//// ///////////v///e///v///////////////3///v///v///v//////////// ///v///v///////////////v///e///v///////////////////e///e//// ///////////n///////////////3///n///v///n///n///n///n///n///n ///n///n///n///////////////n///n///n///v///n///v///n//////// ///////n///3///////////////n///e///v///////////////v///n//// ///////////v///v///n///////////////v///v///n///n///n///n///n ///e///3///////////////////////////////////////////////n///e ///v///////////////v///3///////v///v///////////3///e//////// ///////3///v///e///v///////////n///v///3///3///////////////3 ///v///3///////////////////n///n///3///3///n///n///n///3//// ///////3///3///////////3///v///n///////////n///n///n///n///n ///n///n///n///e///////////n///v///////////////v///e///v//// ///////v///n///v///////////3///e///3///n///v///////////e//// ///////////n///e///n///////////////e///v///n///////////v//// ///////v///v///n///n///e///n///n///////////n///e//////////// ///v///n///n///n///////////////e///v///////////3///n///n///v ///v///////////n///v///e///////////////e///v///n///v//////// ///////W///////////////3///e///n///v///v///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///v///n///v///n///v ///n///v///n///v///n///v///n///v///n///v///n///v///n///v///n ///v///n///v///n///v///n///v///n///v///n///v///n///v///n///v ///n///v///n///v///n///v///n///v///n///v///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///n///n///n///n///n///n ///n///n///n///n///n///n///n///n///n///e///n///e///n///n///n ///e///n///n///n///e///n///e///n///e///n///n///n///e///n///n ///n///e///n///e///n///e///n///e///n///e///n///e///n///e///n ///e///n///e///n///n///n///e///n///n///n///e///n///e///n///e ///n///e///n///e///n///e///n///e///n///e///n///e///n///e///n ///e///n///e///n///e///n///e///n///e///n///e///n///e///n///e ///n///e///n///e///n///e///n///e///n///e///n///e///n///e///n ///e///n///e///n///e///n///e///n///n///n///e///n///n///n///e ///n///e///n///e///n///e///n///e///n///n///n///e///n///n///n ///e///n///n///n///e///n///n///n///e///n///n///n///e///n///n ///n///e///n///n///n///e///n///n///n///e///n///n///n///e///n ///n///n///e///n///n///n///e///n///n///n///e///nAP//3v//5/// 5///5///3v//5///5///5///3v//5///5///5///3v//5///5///5///3v// 3v//3v//zv/nrf/3pf//pf//rf//xv//1v//7/////////////////////// ////////99b/////////////////7///5///7///7///9///7///7///7/// 7+//9/f/////////5///1v//7///7///1v//5///5///9///////////5/// 3v//5///////////////////////////7///5///5///////////////3v// 3v//5///////////7///5///7/////////////////////////////////// ////9///3v//5///7///////////////////////////////////////5/// 5///3v//////////////////////////////////////////5///3v////// ////9///1v//3v//3v//////////////5///3v//3v//////////////5/// ////////////////////////////3v//5///3v//5///3v//5///3v//5/// ////////////5///3v//5///5///5///3v//3v//////////////5/////// ////////5///3v//3v//3v//9///////////7///3v////////////////// ////////////////////3v//5///3v//3v//5///1v//3v//3v////////// ////5///9///5///3v//3v//5///5///////////5///3v//1v////////// ////////9///////////////////////7///9/////////////////////// 7///9///////////////9///7///////////////////////////5/////// ////////5///1v//7///////////////5///9///////////////5///7/// ////////////7///7///////////3v//5///3v//5///3v//5///3v//5/// 3v//////////7///9///////////7///5///3v//5///////////7///3v// 5///////////////7///3v//9///////////7///5///////////3v//3v// 1v//5///////////9///5///3v//3v//////////5///////////////5/// 7///9///////1v//3v//////////3v//3v//5///////////////5///7/// ////////////5///5///////////////////////7///9/////////////// ////////7///7///////////////9///7///////////////3v//5///9/// ////////////7///9///7///5///5///5///5///3v//5///3v//5///3v// 5///5///5///3v//5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///5///5///5///5///5/// 5///5///5///5///5///5///5///5///5///5///3v//5///5///5///3v// 5///5///5///3v//5///3v//5///3v//5///3v//5///3v//5///3v//5/// 3v//5///3v//5///3v//5///3v//5///3v//5///3v//5///3v//5///3v// 5///3v//5///3v//5///3v//3v//3v//5///3v//5///3v//5///3v//5/// 3v//5///3v//3v//3v//5///3v//3v//3v//3v//3v//3v//3v//3v//3v// 3v//3v//5///3v//3v//3v//5///3v//3v//3v//5///3v//3v//3v//5/// 3v//5///3v//5///3v//5///3v//5///3v//3v//3v//3v//3v//3v//3v// 3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v// 3v//3v//3v//3v//3v//3v//3v//3v//3v//5///3v//3v//3v//5///3v// 3v//3v//5///3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v// 3v//3v//3v//3v//3v//5///3v//5///3v//5///3v//5///3v//3v//3v// 5///3v//3v//3v//5///3v//5///3v//5///3v//5///3v//5///3v//5/// 3v//5///3v//5///3v//5///3v//5///3v//5///3v//5///3v//5///3v// 5///3v//5///3v//5///3v//5///3v//5///3v//5///3v//5///3v//5/// 3v//5///3v//5///3v//5///3v//5///3gD//+f//+f//+f//+f//+f//+f/ /+f//+f//+f//97//+f//+f//+f//97//+f//+f//+f//97//+f//9b/97X/ 763//63//63//87//97///f///////////////////////////////////// //////f//+f3/+/W//fW///e///W///O//+9/+/G/+e9/9b3/9be/9b//97/ /9b//97//+f//+f//97//+f//97//////////////97//+f//+f//+////// /////////////////+f//97//+f//////////////+f//9b//+////////// /+///+f//97//////////////////////////////////////97//+f//97/ /+f//+f///////////////////////////////////f//+f//+f//97///// /////////////////////////////97//97//////////////+f//+f//97/ /+f//////////////+///97//+f//+f//////////97//+f///////////// /////////////+f//97//+f//97//+f//97//+f//97//////////////+f/ /97//97//+f//97//+f//97//////////////+f//////////////+f//+f/ /9b//+f//+///////////////+///97///f///////////////////////// /+f//97//+f//9b//+f//+f//+///+f//+f///f//////////97//+///+f/ /9b//+f//97//97//////////97//9b//+f//+f///////////////////// /////////////+f///f///////////////////////////////////////// /////////////////////+////////////////////////////////f//+f/ /+f///f//////////////////////////+///+f//+f//////////////+// /+f//////////+f//+f//+f//+f//+f//97//+f//97//+f//////////+// /////////97//+///+f//97//+f//////////+f//97//+f//+////////// /////////////////////+f//+///////////+f//+f//97//97///////// /+f//+f//97//+f//////////+///+f//////////////////////////97/ /97//////////+f//97//+f//+f//////////////////////////+///+f/ //////////////////////////////////////////////////////f/99b/ //f//////////////////////////+///97//+f///////////////////// /////////+f//97//+f//97//+f//97//+f//97//+f//+f//+f//+f//+f/ /+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/ /+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/ /+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f//+f/ /+f//+f//+f//+f//+f//+f//+f//97//+f//+f//+f//97//+f//+f//+f/ /97//+f//97//+f//97//+f//97//+f//97//+f//97//+f//97//+f//97/ /97//97//97//97//97//97//97//97//97//97//97//97//97//97//97/ /97//97//97//97//97//97//97//97//97//97//97//+f//97//97//97/ /97//97//97//97//97//97//97//97//97//97//97//97//97//97//97/ /97//97//97//97//97//97//97//97//97//97//97//97//97//97//97/ /97//97//97//97//97//97//97//97//97//97//97//97//97//97//97/ /97//97//97//97//97//97//97//97//97//97//97//97//97//97//97/ /97//97//97//97//97//97//97//97//+f//97//+f//97//+f//97//97/ /97//97//97//97//97//97//97//97//97//97//97//97//97//97//97/ /97//97//97//97//97//97//97//97//97//97//97//97//97//97//97/ /97//97//97//97//97//97//97//97//97//97//97//97//97//97//97/ /97//97//97//97//97//97//97//97//97//97//97//97//97//97//97/ /97//97//97//97//97//97//97//97//97//97//97//97//97//97//97/ /97//97//97//97//+cA///e///n///e///e///e///n///e///e///e///n ///e///e///e///n///e///e///n///e///e///e//e9//e1//el//+1///O ///e///v///////////////////////////////3///v//fe9/fe5//37/// 9///////9///7///5///1v//vf//tf/3vf/Otf/Gvf/G9//e///n///e///e ///e///e///e///////////////n///e///n///e//////////////////// ///e///e///W///n///////////3///W//fW///v///3///e///e///W///n //////fe///e///e///////////v///e///e///n///n///W///e///e///n ///////////n///v///////////3///e///e///e///W///e///n///3//// ///3///n///e///W///n///W///3///n///e///e///W///W///v///v///e ///W///n///e///W///n///v///W///e///n///n///3///3///n///n///e ///e///e///e///e///e///e///e///////////////n///W///e///e///e ///e///W///e///////v///W///W///////n///e///e///n///n///e///e ///3///n///e///e///e///e///3///////3///n///n///e///e///e///e ///e///e///n///n///W///3///////3///W///n///e///W///e///e///W ///////////e///O///n//fe///n///v///v///////////3///3///n///n ///e///3///3///////////////////n///e//////fe///v///3//////// ///3///n///v///v///3///////////v///e///n///v///n///v///v///3 ///v///////////v//fW///e///e///n///////n///e///n///////////n ///n///n///n///n///n///e///e///W///////////////////v///O///n ///W///e///e///////////n///W///e///n///e///e///////////////n ///n///W///e///v///e///W///v///e///W///e///////W///e///e///e ///W///////e///e///e///n///3///////3///v///W///e///////////W ///e///n///n///e///v///3///////3///n///W///e///e//////////// ///3///////v///n///3///////////////v///e///e///e///n///3///3 ///////v///e///e///e///n///e///3///e///v///3///3///e///e///n ///e///e///e///e///e///e///e///n///e///e///e///n///e///e///e ///n///e///n///e///n///e///n///e///n///e///n///e///n///e///n ///e///n///e///n///e///n///e///n///e///n///e///n///e///n///e ///n///e///n///e///n///e///n///e///n///e///n///e///n///e///n ///e///n///e///n///e///e///e///n///e///e///e///e///e///e///e ///e///e///e///e///e///e///e///e///e///e///e///e///e///W///e ///e///e///W///e///e///e///W///e///e///e///W///e///W///e///W ///e///W///e///W///e///W///e///W///e///W///e///W///e///W///e ///W///e///W///e///W///e///W///e///W///e///W///e///W///e///W ///e///W///e///W///e///W///e///W///e///W///e///W///e///W///e ///W///e///W///e///W///e///W///e///W///e///W///e///W///e///W ///e///W///e///W///e///W///e///W///e///W///e///W///e///W///e ///W///e///W///e///W///e///e///e///e///e///W///e///W///e///W ///e///W///e///W///e///W///e///W///e///W///e///W///e///W///e ///W///e///W///e///W///e///W///e///W///e///W///e///W///e///W ///e///W///e///W///e///W///e///W///e///W///e///W///e///W///e ///W///e///W///e///W///e///W///e///W///e///W///e///W///e///W ///e///W///e///W///e///W///e///W///e///W///e///W///e///W///e ///eAP//5///3v//5///3v//5///3v//5///3v//5///3v//3v//3v//5/// 3v//3v//3v//5///3v//5///3v//zv/3vf/3rf//tf//zv//3v//9/////// /////////////////////+//3v//3uf/5+f///////////////////f//97/ /97//87//8b//7X/763/56X/xq3/zu//7///9///1vf/1v//5///3v//5/// ////////////3v//3v//3v//5///////////////////5///1v//3v//3v// 1v//////////////5///7///1v//5///3v//1v//1v//5///3v//5///3v// 1v//3v//5///3v//3v//3v//3v//7///3v//1v//3v//1v//3v//1v//1v// zv//////////9///1v//1v//1v//1v//1v//zv//3v//3v//zv//3v//3v// 3v//3v//3v//1v//3v//5///3v//zv//5///1v//3v//1v//3v//5///3v// 5///1v//1v//3v//3v//5///3v//3v//1v//1v//5///3v//3v//3v//3v// 3v//3v//3v//3v//////////////3v//3v//3v//5///3v//3v//5///5/// 5///3v//1v//3v//5///1v//5///3v//3v//1v//3v//5///1v//5///3v// 3v//zv//3v//3v//3v//zv//3v//3v//3v//1v//3v//3v//3v//3v//5/// 3v//3v//7///////7///zv//1v//5///1v//5///3v//5///////////5/// 1v//1v//7///5///5///1v//5///3v//5///5///7///3v//3v//1v//5/// ////////5///3v//3v//5///5///7///3v//5///7///3v//3v//5///3v// 5///3v//5///5///7///7///5///3v//7///9///3v//1v//3v//3v//5/// 5///7///3v//5///5///7///5///7///1v//////////5///5///7///5/// 7///5///3v//3v//5///////////////9///1v//1v//zv//3v//1v//3v// ////////5///3v//1v//1v//1v//5///1v//5///5///1v//5///1v//1v// 3v//3v//3v//3v//5///3v//5//31v//5///1v//5///3v//3v//1v//3v// 3v//3v//zv//3v//1v//3v//1v//3v//1v//////////3v//1v//5///1v// 3v//1v//3v//1v//5///1v//5///1v//3v//3v//////////7///1v//3v// 3v//5///////////3v//3v//zv//1v//1v//3v//3v//3v//3v//3v//5/// 3v//3v//3v//1v//5///zv//1v//3v//3v//3v//5///3v//3v//3v//3v// 3v//3v//3v//5///3v//5///3v//5///3v//5///3v//5///3v//5///3v// 5///3v//5///3v//5///3v//5///3v//5///3v//5///3v//5///5///5/// 5///5///5///5///5///5///5///5///3v//5///5///5///3v//5///5/// 5///5///5///5///5///5///5///5///5///3v//5///3v//5///3v//5/// 3v//3v//3v//5///3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v// 3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v// 3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//1v//3v//1v//3v//1v// 3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v// 1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v// 3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v// 1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v// 3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v// 1v//3v//1v//3v//3v//3v//3v//3v//1v//3v//1v//3v//1v//3v//1v// 3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v// 1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v// 3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v// 1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v// 3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3gD//9b//97/ /97//97//9b//97//97//97//9b//97//97//97//9b//97//97//97//97/ /97//9b//97//97//+f//9b//87//9b//+f//+////////////////////// /97/7/f//////973/+/////////v///////////v///n///W///G//+1//et //el/96l/9al/73e/9b//9b//97//97//97//9b//////////////+f//9b/ /9b//+f//97//+///////////////+f//9b//9b//9b//+f///////////// /+//99b///f//////97//97//97//87//9b//9b//97//9b//97//97//97/ /9b//97//97//97//9b//97//9b//97//9b//97//9b//97//////////+// /9b//9b//87//9b//9b//9b//97//9b//97//9b//97//9b//97//9b//97/ /9b//97//9b//97//9b//97//9b//97//9b//97//9b//97//9b//97//9b/ /97//9b//97//9b//97//9b//97//9b//97//9b//97//9b//97//9b//97/ /////////////97//97//97//97//9b//9b//9b//+f///////f//97//97/ /9b//9b//97//9b//97//9b//97//9b//97//9b//97//9b//97//9b//97/ /9b//97//9b//97//9b//97//9b//97//9b//97//9b//97/997///f///// //f//97//9b//9b//97//9b//97//9b//////////97//9b//97//9b//97/ /9b//97//9b//97//97//97//97//+f//+f//97//+///////////+///97/ /97//97//97//97//97//97//97//97//+f//97//+f//97//+f//97//+f/ /97//+f//97//+f//97//+f//+f//+f//97//97//97//97//97//+f//97/ /+f//////+///97//+f//////////97//+f//97//+f//97//+f//+f//+f/ /97//////////////97//97//97//97//9b//97//97//////////+f//9b/ /97//9b//97//97//97//9b//97//97//97//9b//97//9b//97//9b//97/ /9b//97//9b//97//9b//97//9b//97//9b//97//9b//97//9b//97//9b/ /97//9b//97//97//97//////////+f//+f//97//9b//9b//97//9b//97/ /9b//97//9b//97//9b//97//////////97//9b//97//97//97///////// /97//9b//97//97//97//9b//97//9b//97//9b//97//9b//97//9b//97/ /9b//97//9b//97//9b//97//97//97//97//97//97//97//97//97//9b/ /97//9b//97//9b//97//9b//97//97//97//97//97//97//97//97//97/ /97//97//97//97//97//97//97//97//97//97//97//97//97//97//97/ /97//97//97//97//97//97//97//97//97//97//97//97//97//97//97/ /97//97//97//97//97//97//97//97//97//97//9b//97//9b//97//9b/ /97//9b//97//9b//97//9b//97//9b//97//9b//97//9b//97//9b//97/ /9b//97//9b//97//9b//9b//9b//97//9b//9b//9b//97//9b//97//9b/ /97//9b//9b//9b//9b//9b//97//9b//97//9b//97//9b//97//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//87//9b//9b//9b//87//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//97//9b//9b//9b//97//9b//9b//9b//97/ /9b//9b//9b//97//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//97//9b//9b//9b//97//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9YA///e///e///e///e///e///e ///e///e///e///e///e///e///e///e///e///e///e///e///e///e///v 9+/39/f/7//3///W///e///n///n///v///n///e9//W7///tf//vf/////v ///n////////9///////9///7///5///1v//xv//tf//rf/vrf/epf/Orf+9 1v/O///e///e///e///W///e///////////////W///W///e///e///e///n ///////////////n///e///W///e///W///3///////////n///n//////// ///////e///W///W///W///e///e///e///W///e///e///e///W///e///e ///e///W///e///W///e///W///e///W///////////3///W///e///W///e ///e///e///W///e///W///e///W///e///W///e///W///e///W///e///W ///e///W///e///W///e///W///e///W///e///W///e///W///e///W///e ///W///e///W///e///W///e///W///e///W///e///W///////////////n ///n///W///e///W///e///W///////////////n///W///e///e///W///e ///W///e///W///e///W///e///W///e///W///e///W///e///W///e///W ///e///W///e///W///e///W///W///e///n///3///////3///n///W///W ///W///e///e///e///////////n///e///W///e///W///e///W///e///W ///e///e///n///n///n///e///e///v///v///e///n///n///n///e///n ///n///e///e///n///e///n///e///n///e///n///e///n///e///n///e ///n///e///n///n///v///n///n///e///e///e///e///////////////v ///e///////////n///e///n///e///n///e///n///n///////////////v ///e///W///e///e///W///W///n///////////n///e///W///e///e///e ///e///e///e///e///e///e///W///e///W///e///W///e///W///e///W ///e///W///e///W///e///W///e///W///e///W///e///W///e///W///W ///W///////////n//fW///e///O///e///W///e///W///e///W///e///W ///e///W///e///v///W///W///e///W///W///n///e///W///e//fW///e ///e///e///W///e///W///e///W///e///W///e///W///e///W///e///W ///e///W///e///e///e///e///e///e///e///e///e///W///e///W///e ///W///e///W///e///e///e///e///e///e///e///e///e///e///e///e ///e///e///e///e///e///e///n///e///e///e///n///e///e///e///e ///e///e///e///e///e///e///e///e///e///e///e///e///e///e///e ///e///e///e///e///e///e///e///W///e///W///e///W///e///W///e ///W///e///W///e///W///e///W///e///W///e///W///e///W///e///W ///e///W///e///W///e///W///e///W///e///W///e///W///e///W///e ///W///e///W///e///W///e///W///e///W///W///W///e///W///W///W ///e///W///W///W///W///W///W///W///W///W///W///W///W///W///W ///W///W///W///W///W///W///W///W///W///W///W///W///W///W///W ///W///W///W///W///W///W///W///W///W///W///W///W///W///W///W ///W///W///W///W///W///W///W///W///W///W///W///W///W///W///W ///W///W///W///W///W///W///W///W///W///W///W///W///W///W///W ///W///e///W///W///W///e///W///W///W///e///W///W///W///e///W ///W///W///W///W///W///W///W///W///W///W///W///W///W///W///W ///W///W///W///W///W///W///W///W///W///W///W///e///W///W///W ///e///W///W///W///W///W///W///W///W///W///W///W///W///W///W ///W///W///W///W///W///W///W///W///W///W///W///W///W///e///W ///W///W///e///W///WAP//1v//3v//1v//3v//1v//3v//1v//3v//1v// 3v//1v//3v//1v//3v//1v//3v//1v//3v//3v//1vf3597n/73e/63n/+/n ///3////9///3vf/1u//79b3/873/7X//3P//3P//+/////31vf///////// //f///f//+f//97//87//8b//63/963/76X/1qX/zqX/tcb/vff/1v//3v// 1v//1v//zv//////////9//3zv//1v//zv//3v//3v/31v//////////5/// 1v//zv//1v//zv//3v/31v//////////3v/31v//////////9///1v//1v// zv//1v//zv//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v// 1v//1v//1v//1v//1v//////////7///1v/3zv//1v//1v//3v//1v//1v// 1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v// 1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v// 1v//1v//1v//1v//1v//1v//1v//1v//5///////7///1v//1v//1v//1v// 3v//1v//1v//////////////5//3zv//1v//1v//1v//1v//1v//1v//1v// 1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v// 3v//1v//1v//zv//1v//1v//5///////3v//1v//1v//1v//1v//1v//3v// 1v//9///////3v//1v//1v//1v//1v//1v//1v//1v//1v//zv//3v//1v// 1v//5///7///3v//3v//1v//3v//3v//5///3v//3v//1v//3v//1v//3v// 1v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v//3v// 5///5///5///3v//3v//1v//3v//zv//7///////5//3zv//5/////////// 3v//3v//3v//3v//3v//3v//3v//3v//5///////9///5///5///5///3v// 3v//1v//3v/31v//9///////3v//1v//1v//1v//3v//1v//3v//1v//3v// 1v//3v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v// 1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//zv//3v////////// 5///3v//1v//zv//1v//3v//1v//1v//1v//1v//1v//1v//1v//3v/3zv// 1v//1v//3v//1v//3v//1v//3v/3zv//3v//3v//1v//1v//3v//1v//1v// 1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v// 3v//1v//3v//1v//3v//1v//3v//1v//1v//1v//1v//1v//1v//1v//1v// 1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v// 3v//3v//3v//1v//3v//3v//3v//1v//3v//1v//3v//1v//3v//1v//3v// 1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v// 3v//1v//3v//1v//3v//1v//1v//1v//3v//1v//1v//1v//1v//1v//1v// 1v//1v//1v//1v//1v//3v//1v//1v//1v//1v//1v//1v//1v//1v//1v// 1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v//1v// 1v//1v//1v//1v//zv//1v//1v//1v//1v//1v//1v//1v//1v//1v//zv// 1v/3zv//1v//zv//1v/3zv//1v//zv//1v//zv//1v//zv//1v//zv//1v// zv//1v/3zv//1v//zv//1v/3zv//1v//zv//1v/3zv//1v//zv//1v/3zv// 1v//zv//1v/3zv//1v//zv//1v/3zv//1v//zv//1v/3zv//1v//zv//1v/3 zv//1v//zv//1v/3zv//1v//zv//1v/3zv//1v//zv//1v//zv//1v//zv// 1v//zv//1v//zv//1v/3zv//1v//zv//1v/3zv//1v//zv//1v//zv//1v// zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv// 1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v// zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv// 1v/3zv//1v//zv//1v/3zv//1v//zv//1v//zv//1v//zv//1v//zv//1v// zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv// 1v//zgD//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//97//+f//87//+fW3v+t1v+Mzv+M9/+U9/+c9/+U9/+U //+M//+E//+E//97//9r//9z///G/////973//f3///////3///v///n///W ///O//+9//+1//et/+et/9al/72t/7W196Xv/9b//9b//97//9b//9b//9b/ /97/99b//97//87//87//9b//97/987//97//9b//9b//9b//9b//9b//87/ /97//9b/99b//97//9b//9b//9b//+f/987//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//97//+///9b//9b//97//97//97//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//87//9b//9b//9b//9b//9b//87//97/ /+f//97//9b//97//87//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /87//9b/987//+f//87//9b//9b//97//9b//9b//9b//9b//9b//+f/987/ /9b//9b//9b//9b//9b//9b//9b//9b//97//9b//9b//9b//97//97//+f/ /+f//+f//97//97//97//97//97//97//9b//97//97//97//9b//97//97/ /97//9b//97//97//97//97//97//97//97//97//97//97//+f//97//+f/ /+f//97//9b//9b//9b//+f//9b//97//87//+f//+f//97//97//97//97/ /97//97//97//97//+f//97//97//+f//+f//97//+f//97//+f//97//97/ /97//+f/99b//9b//9b//97//9b//97//9b//97//9b//97//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9b//97//+///9b//9b//87//87/ /97//9b//9b//9b//9b//9b//9b//9b//9b//9b//97//9b//9b//9b//9b/ /87//9b//97//97//9b//9b//9b//97/99b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//97//9b//97//9b//97/ /9b//97//9b//9b//9b//9b//9b//9b//9b//9b//9b//97//9b//97//9b/ /97//9b//97//9b//97//9b//97//9b//97//9b//97//9b//97//97//97/ /9b//97//97//97//9b//97//9b//97//9b//97//9b//97//9b//97//9b/ /97//9b//97//9b//97//9b//97//9b//97//9b//97//9b//97//9b//97/ /9b//9b//9b//97//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /97//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b//9b/ /9b//87//9b//9b//9b//9b//9b//9b//9b//9b//9b//87//9b/987//9b/ /87//9b/987//9b//87//9b//87//9b//87//9b//87//9b//87//9b/987/ /9b//87//9b/987//9b//87//9b/987//9b//87//9b/987//9b//87//9b/ 987//9b//87//9b/987//9b//87//9b/987//9b//87//9b/987//9b//87/ /9b//87//9b//87//9b//87//9b//87//9b//87//9b//87//9b//87//9b/ /87//9b//87//9b//87//9b//87//9b//87//9b/987//9b//87//9b/987/ /9b//87//9b/987//9b//87//9b/987//9b//87//9b/987//9b//87//9b/ 987//9b//87//9b//87//9b//87//9b//87//9b//87//9b//87//9b//87/ /9b//87//9b//87//9b/987//9b//87//9b/987//9b//87//9b//87//9b/ /87//9b//87//9b//87//9b//87//9b//87//9b//87//9b//87//9b//87/ /9b//87//9b//87//9b//9b//9b//87//9b//9b//9b//87//9YA///O///W ///O///W///O///W///O///W///O///W///O///W///O///W///O///W//fO ///e//fW///O//fW5+f/rc7/jM7/jOf/lPf/lP//lP//hP//hP//jP//jP// a///e///c///rf////fe///n5///////5///5///1v//zv//vf//vf/3rf/n rf/npf/Opf+9pf+trfec1v+99//W///W///W//fG///W//fW///W///O///O ///W//fW//fW///W///O///W///O///W//fO///W///O///O//fO///e//fO ///W///O///W//fO///W///W///W//fG///W///W///W//fO///W///O///W //fO///W///O///W///O///W///W///W///O///W///W///W///W///e///O ///W//fO///W//fW///e///O///W///O///W///O///W///O///W///O///W ///O///W///O///W///O///W///O///W///O///W///O///W///O///W///O ///W///O///W///O///W///O///W///O///W///O///W///O///W///O///W ///O///O///O///W//fO///W//fO///W///O///W///W///W//fO///W///W ///W///O///W///O///W///O///W///O///W///O///W///O///W///O///W ///O///W//fO///W///O///W///O///W///O///W///O///O///W///W//fO ///W///O///W///O///W///O///W///W///W//fO///W///O///W///O///W ///O///W///O///W///W///O//fO///W//fO//fW///W///e///e///e///W ///W///W///e///W///e///W///e///W///e///W///e///W///e///W///e ///W///e///W///e///e///e///e///e///W///e///e///n///e///e///O ///O//fW///e///W///O///W///n///W///e///W///e///W///e///W///e ///e///W///W///e///W///e///e///e///e///n///e///n//fW///e///W ///W///W///W///W///W//fW///W//fW///W///O///W///O///W///O///W ///O///W///O///W///O///W///O///W///O///W///O///W///O///W///O ///W///O///W///W///e/+/G//fW//fO///e///O///W///O///W///O///W ///O///W///O///W///W//fO///O///W//fO///O///W//fO//fO///W//fW ///W///W///W///W///e///O///W///O///W///O///W///O///W///O///W ///W///W///O///W///W///W//fW///W///W///e///W///e///W///W///O ///W///W///W///O///W///W///W///W///W///W///W///W///W///W///W ///W///W///W///e///W///W///W///e///W///W///W///e///W///W///W ///e///W///W///W///e///W///W///W///e///W///W///W///e///W///W ///W///e///W///W///W///W///W///W///W///W///O///W///W///W///O ///W///W///W///O///W///W///W///O///W///O///W///O///W///O///W ///O///W///O///W//fO///W///O///W//fO///W///O///W//fO///W///O ///W//fO///W//fO///W//fO///W//fO///W//fO///W//fO///W//fO///W //fO///W//fO///W//fO///W//fO///O//fO///O//fO///O//fO///O//fO ///O//fO///O//fO///O//fO///O//fO///O//fO///W//fO///O//fO///W //fO///O//fO///W//fO///O//fO///W//fO///O//fO///W//fO///O//fO ///W//fO///O//fO///W//fO///O//fO///W//fO///O//fO///O//fO///O //fO///O//fO///O//fO///O//fO///O//fO///O//fO///O//fO///W//fO ///O//fO///W//fO///O//fO///W//fO///O//fO///W//fO///O//fO///W //fO///O//fO///W//fO//fO//fO///O//fO//fO//fO///O//fO///O//fO ///O//fO///O//fO///O//fO///O//fO///O//fO///O//fO///O//fO///O //fO///W//fO///O//fO///W//fO///O//fO///O//fO///O//fO///O//fO ///O//fO///O//fO///O//fO///O//fO///O//fO///O//fO///O//fO///O //fO///W//fO///W//fO///W//fO///W//fOAP//1v/3zv//1v//zv//1v/3 zv//1v//zv//1v/3zv//1v//zv//1v/3zv//1v//zv//1v//1v//1v//zv// zvfv58be/5TG/5ze/5zv/5T//4z//4T//4T//4z//4z//4z//5T//3P//5T/ ////////1t7//+///+f//9b//87//73//73//7X/77X/563/3q3/xqX/ra3/ pZzvjMb/te//1v//1v/31v/3zv/3zv//1v//zv/3xv/3zv//3v/3zv//1v// 1v//zv/3xv/3zv//zv//1v/31v//zv//zv//zv//1v//1v/3zv/3zv//1v// 1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v// zv//1v//zv//1v//1v//1v//zv//1v//1v//1v/3zv//1v//1v//1v/3zv// 1v/3zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v// zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv// 1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//zv/3xv//1v/3 zv//zv//1v//1v//zv//1v/3zv//1v//1v//1v//zv//1v/3zv//1v//zv// 1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v//zv//1v/3 zv//1v//zv//1v/3zv//1v//1v//zv/3zv//1v//1v/3zv//zv//1v/3zv// 1v/31v//1v//1v//1v//zv//1v//1v//1v/3zv//1v//zv//1v/3zv//1v// zv/3zv//zv//1v//zv//1v/31v//3v//1v//3v//3v//5///3v//3v//1v// 3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//1v//3v//3v//3v// 3v//3v//3v//3v//3v//3v//3v//3v//3v//5///5///3v//1v/31v//1v// 3v//1v//1v/31v//3v//1v//3v//1v//3v//1v//3v//3v//1v//1v//1v// 1v//3v//3v//3v//1v//3v//3v//5///3v//3v//3v//3v//3v//1v//1v// 1v//1v//1v/3zv//1v/3zv//1v/3zv//1v//zv//1v/3zv//1v//zv//1v// zv//1v//zv//1v//zv//1v//zv//1v/3zv//1v//zv//1v/3zv//1v//zv/3 1v/3zv//1v//1v//1v//zv//1v/3zv//1v/3zv//1v//zv//1v/3zv//1v/3 zv//1v//zv//1v//zv//1v/3zv//1v//1v//1v//1v//1v//zv//1v//1v// 1v//zv//1v/3zv//1v//zv//1v/3zv//1v//zv//1v//zv//1v//1v//1v// zv//1v//1v//1v/31v//1v//1v//3v//1v//3v//1v//1v//1v//1v//1v// 1v//1v//1v//1v//1v/31v//1v//1v//1v/31v//1v//1v//1v//1v//3v// 1v//3v//1v//3v//1v//1v//1v//3v//1v//1v//1v//3v//1v//3v//1v// 3v//1v//3v//1v//3v//1v//1v//1v//3v//1v//1v//1v//3v//1v//1v/3 1v//1v//1v//1v/31v//1v//1v//1v//zv//1v//1v//1v//zv//1v//1v// 1v//zv//1v//1v//1v//zv//1v//zv//1v/3zv//1v//zv//1v/3zv//1v/3 zv//1v/3zv//1v//zv//1v/3zv//1v//zv//1v/3zv//1v/3zv//1v/3zv// 1v/3zv//1v/3zv//1v/3zv//1v/3zv//1v/3zv//1v/3zv//1v/3zv//1v/3 zv//1v/3zv//zv/3zv//zv/3zv//zv/3zv//zv/3zv//zv/3zv//zv/3zv// zv/3zv//zv/3zv//zv/3zv//1v/3zv//zv/3zv//1v/3zv//zv/3zv//1v/3 zv//zv/3zv//1v/3zv//zv/3zv//1v/3zv//zv/3zv//1v/3zv//zv/3zv// 1v/3zv//zv/3zv//1v/3zv//zv/3zv//1v/3zv//zv/3zv//1v/3zv//zv/3 zv//zv/3zv//zv/3zv//zv/3zv//zv/3zv//1v/3zv//zv/3zv//1v/3zv// 1v/3zv//1v/3zv//1v/3zv//1v/3zv//1v/3zv//1v/3zv//1v/3zv//1v/3 zv//zv/3zv//1v/3zv//zv/3zv//1v/3zv//zv/3zv//zv/3zv//zv/3zv// zv/3zv//zv/3zv//1v/3zv//zv/3zv//1v/3zv//1v/3zv//1v/3zv//1v/3 zv//1v/3zv//zv/3zv//1v/3zv//zv/3zv//1v/3zv//zv/3zv//1v/3zv// zv/3zv//1v/3zv//zv/3zv//1v/3zv//zv/3zv//1v/3zv//1v/3zv//1v/3 zv//1v/3zv//1v/3zv//zgD/987//87/987//87/987//87/987//87/987/ /87/987//87/987//87/987//87/987//87//8b/99b/987//9bG3v+lxv+M 1v+U5/+M9/+M//+E//+M//+E//+M//+U//+U//+E//+M///n////99be//fn ///W///O//+9//+1//+t/++t/+el/9at/86l/72t/62l/5Sc74yt75zv/9b/ 987/99b//97//9b/98b//87/987/987/987/99b/98b//87/987/987//87/ 987/987//87/98b//87/98b/98b/98b//9b/987/987/98b/98b/98b//9b/ 987/987/987//87/987//87/987//87/987//87/987//87/987//9b/987/ /87/987//9b/987//87/987/987/987//87//9b//87/987/987/987//87/ 987//87/987//87/987//87/987//87/987//87/987//87/987//87/987/ /87/987//87/987//87/987//87/987//87/987//87/987//87/987//87/ 987//87/987//87/987//87/987//87/987/99b/99b//87/987//9b/987/ /87//87//9b/987/987/987//9b//87//87/987//87/987//87/987//87/ 987//87/987//87/987//87/987//87/987//87/987//87/987/987/987/ /9b/987//87//9b/99b/987//9b/98b//9b/987//9b/987//9b/987//9b/ 987//87/98b//87/987//87/987/987/987//87/987/987/987//9b/987/ 987/987//9b//9b/987/99b//97//97//97//97//9b/987//9b//9b//97/ /9b//9b//9b//9b//9b//9b//9b//9b/99b//9b//9b//97//9b//9b//9b/ /97//9b//97//9b//97//9b//97//97//+f/997/99b/987//9b//9b//97/ /9b//97//9b//9b//9b//97/99b//9b//9b//97//9b//9b//9b//9b/987/ /9b/99b//97//9b//9b//9b//9b//9b//97//9b//97//9b//9b/99b//9b/ 987/987/987//87/987/987/987//87/987/987/987//9b/987//87/987/ /9b/987//87/987//9b/987//87/987//9b/987//87/987/987//87//87/ 98b/987//87//87/987//9b/987/987/987//87/987/987/98b//87/987/ /9b/98b/987/78b//87/98b/987/987/987/987//9b/987/987/987//87/ 987/987/987//87/987/987/987//9b/987//87/987//9b/987//87/987/ 99b/987/99b/99b//9b/99b//9b/987//9b/987//87/987//9b/987//87/ 987//9b/987//9b/987//9b/987//9b/99b//9b/987//9b/99b//9b/99b/ /9b/99b//9b/987//9b/99b//9b/987//9b//9b//9b/99b//9b//9b//9b/ 99b//9b/99b//9b/987//9b/99b//9b/987//9b/987//9b/987//9b/987/ /9b/987//9b/987//9b/987//87/987//9b/987//87/987//9b/987//87/ 987//87/987/987/987//9b/987/987/987//87/987/987/987//87/987/ 987/987//87/987/987/987/987/987/987/987/987/987/987/987//87/ 987/987/987/987/987/987/987/987/987/987/987/987/987/987/98b/ 987/98b/987/98b/987/98b/987/98b/987/98b/987/98b/987/98b/987/ 987/987/98b/987/987/987/98b/987/987/987/98b/987/987/987/98b/ 987/987/987/98b/987/987/987/98b/987/987/987/98b/987/987/987/ 98b/987/98b/987/98b/987/98b/987/98b/987/98b/987/98b/987/98b/ 987/98b/987/987/987/98b/987/987/987/98b/987/987/987/987/987/ 987/987/987/987/987/987/987/987/987/987/987/987/987/987/98b/ 987/987/987/98b/987/987/987/98b/987/987/987/98b/987/987/987/ 98b/987/987/987/98b/987/987/987/987/987/987/987/987/987/987/ 987/98b/987/987/987/98b/987/987/987/98b/987/987/987/98b/987/ 987/987/98b/987/987/987/98b/987/987/987/987/987/987/987/987/ 987/98YA///O//fO///O//fO///O//fO///O//fO///O//fO///O//fO///O //fO///O//fO//fW//+9///G/+/W///e///Ozu//nL3/lNb/lN7/pe//pff/ pf//nP//lP//hP//e///jP//nP//e///rf/////W///n3v//1v//zv//vf// rf/3rf/3pf/npf/Wpf/Orf/Gpf+lpf+UlO+Epe+U5//O///W/+/O//fW//fO //fO//fG///W//fO//fW//fW///O//fG///O/+/O///e/+/O///W//fO///e /+/G///O///W///O//fO//fW//fW///W///O//fO//fO///W//fO///O//fO ///O//fO///O//fO///O//fO///O//fO///W//fO///O//fO///W//fO///O //fO///W//fO///W//fO///W/+/G///O///G///O//fO///O//fO///O//fO ///O//fO///O//fO///O//fO///O//fO///O//fO///O//fO///O//fO///O //fO///O//fO///O//fO///O//fO///O//fO///O//fO///O//fO///O//fO ///O//fO///O//fO//fW//fW///W//fO///W//fO//fO///O///O//fO///O //fG///O//fG//fO//fO///O//fO///O//fO///O//fO///O//fO///O//fO ///O//fO///O//fO///O//fO///W//fO///O//fO///W//fO///W//fO///W //fO//fO//fO///W///W//fW//fW///W///W//fO///W///O///O///W//fO ///W//fO///O//fO///W//fO///O//fO//fO///O//fO//fO///W//fO///W //fO///W///W///e///W///e///W///W///W///e///W///W///W///W///W ///W///W///W///W///W///W///e///W///W///W///e///W///W///W///e ///e///e///W///e///n///v///e///W///O///W//fW///e///W///e///W ///e///W///W//fW///W///O///e///W///W///W///e///W///e///W///W ///O///e//fW///e///e///e///e///e///W///W//fW///W//fO///W//fO ///O//fO///W//fO///O//fO///W///O///W//fO///W///O///W//fO///W //fO///W//fO///W//fO///W//fO//fW//fO///O/++9///W//fG///O//fO ///W//fO///W//fO///W//fO///O//fO///W//fO//fO///W//fO///W///W //fG///W//fG///O///O//fO//fO//fO//fO///O//fO//fO//fO///O//fO //fO//fO///W//fO///O//fO///W//fO///O//fO///W//fO//fO//fO///W //fW///W//fO///W//fO///O//fO///W//fO///O//fO///W//fW///W//fO ///W//fW///W//fO///W//fW///W//fO///W///W///W//fW///W///W///W //fW///W///W///W//fW///W///W///W///W///W///W///W///W///W//fW ///W//fO///W//fW///W//fO///W//fW///W//fO///W//fW///W//fO///W //fO///W//fO///W//fO///W//fO///W//fO///O//fO///O//fO//fO//fO ///W//fO///W//fO///W//fO///O//fO///W//fO///O//fO///W//fO///O //fO///W//fO//fO//fO///O//fO//fO//fO///O//fO//fO//fO///O//fO //fO//fO//fO//fO//fO//fO//fO//fO//fO//fO//fO//fG//fO//fG//fO //fG//fO//fG//fO//fO//fO//fG//fO//fO//fO//fG//fO//fO//fO//fG //fO//fO//fO//fG//fO//fO//fO//fG//fO//fO//fO//fG//fO//fO//fO //fG//fO//fO//fO//fG//fO//fO//fO//fG//fO//fO//fO//fG//fO//fO //fO//fG//fO//fO//fO//fG//fO//fO//fO//fG///O//fO//fO//fO//fO //fO//fO//fG//fO//fO//fO//fG//fO//fO//fO//fO//fO//fO//fO//fO //fO//fO//fO//fO//fO//fO//fO//fO//fO//fO//fO//fO//fO//fO//fO //fO///O//fO//fO//fO///O//fO//fO//fO//fO//fO//fO//fG//fO//fO //fO//fG//fO//fO//fO//fO//fO//fO//fO//fO///O//fO//fO//fO///O //fO//fO//fO//fO//fO//fO//fG//fO//fO//fO//fG//fO//fO//fO//fG //fO//fO//fO//fG//fO//fO//fO//fO//fO//fO//fO//fO///OAP/3xv/3 zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/v zv//xv/3vf/v1v/v1v/3zt7n773O/5S9/6XO/5ze/5zv/5T3/5T//4z//4z/ /5T//4z//5T//4T//5T///f/9//v1tb//73//7X//6X/76X/75z/3pz/1pz/ xpz/vZz3raX3nK3vhKXvc5Tnc8b/rf//1v/33v/3xv/3zv/3xv/3zv/3xv/3 zv/3xv/3zv/3xv/3zv/3zv/3zv/3xv/3zv/3zv/3zv/3xv/3zv/3zv/3zv/3 xv/3zv/3zv/3zv/3xv/3zv/3zv/3zv/3xv/3zv/3zv/3zv/3xv/3zv/3xv/3 zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3zv/3zv/3 zv/3zv/3zv/3zv/3zv/3zv/3xv/3zv/3zv/3zv/3xv/3zv/3zv/3zv/3xv/3 zv/3xv/3zv/3xv/3zv/3xv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3 xv/3zv/3zv/3zv/3xv/3zv/3zv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3 zv/3xv/3zv/3zv/3zv/3xv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3 zv/3zv/3xv/3zv/3zv/3zv/3xv/3zv/3zv/3zv/3xv/3zv/3xv/3zv/3xv/3 zv/3xv/3zv/3zv/3zv/3zv//zv/3zv/3zv/3zv//zv/3zv/3zv/3zv/3zv/3 zv/3zv/3zv/3zv/3xv/3zv/3zv/3zv/3xv/3zv/3zv/3zv/3xv/3zv/3xv/3 zv/3xv/3zv/3xv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3 zv//1v//1v//1v//1v//1v/31v//1v/31v//1v/3zv/31v/31v//3v/31v// 1v/31v//1v/31v//1v/31v//1v/3zv//1v/31v//1v/31v//1v//1v//1v/3 1v//3v//3v//5///3v//3v/31v/31v/31v//1v/31v//1v/3zv//1v/3zv// 1v/3zv//1v/31v//1v/3zv//1v/31v//1v/3zv//1v/31v//1v/3zv//1v/3 1v//1v/3zv//1v//1v//1v//1v//1v//1v//3v/3zv/3zv/3zv/3zv/vzv/3 zv/3zv//1v/3xv/3zv/3zv//zv/3zv/3zv/3zv/3zv/3xv/3zv/3xv/3zv/3 xv/3zv/3zv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3 zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3 xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3 zv/3zv/3zv/3xv/3zv/3zv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3zv//1v/3 zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3 1v/3zv/31v/3zv//1v/3zv//1v/3zv//1v/3zv/31v/3zv//1v/3zv/31v/3 zv//1v/3zv/31v/3zv//1v/3zv/31v/3zv//1v/3zv//1v/3zv//1v/3zv// 1v/3zv//1v/3zv/3zv/3zv/31v/3zv/3zv/3zv/3zv/3xv/3zv/3zv/3zv/3 xv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3xv/3 zv/3xv/3zv/3xv/3zv/3xv/3zv/3zv/3zv/3xv/3zv/3zv/3zv/3xv/3zv/3 xv/3zv/3xv/3zv/3xv/3zv/vxv/3zv/3xv/3zv/vxv/3zv/3xv/3zv/vxv/3 zv/3xv/3zv/vxv/3zv/3xv/3zv/vxv/3xv/vxv/3xv/vxv/3xv/vxv/3xv/v xv/3xv/vxv/3xv/vxv/3xv/vxv/3xv/vxv/3xv/vxv/3xv/vxv/3xv/vxv/3 xv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/v xv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3xv/vxv/3 xv/vxv/3xv/vxv/3xv/vxv/3xv/vxv/3xv/vxv/3xv/vxv/3xv/vxv/3zv/v xv/3xv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3 zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/v xv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3 zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3xv/vxv/3xv/vxv/3xv/vxv/3xv/v xv/3xv/vxv/3xv/vxv/3xv/vxv/3xv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3 zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxgD/987/98b/987/987/987/ 98b/987/987/987/98b/987/987/987/98b/987/987/99b/973//8b/79b/ 99b/987n7+/G1v+cvf+cxv+l1v+U3v+U7/+M9/+U//+U//+c//+M//+c//+E //+U///v/////87e/++t//+l/++1/++1/97G/97W/87e/87e/8bG/73G76XO 95yt53uc53u996X3/9b/99b/987/98b/987/987/987/98b/987/987/987/ 98b/987/987/987/98b/987/987/987/98b/987/987/987/98b/987/987/ 987/98b/987/987/987/98b/987/987/987/98b/987/987/987/98b/987/ 987/987/98b/987/987/987/98b/987/987/987/987/987/987/987/987/ 987/987/987/98b/987/987/987/98b/987/987/987/98b/987/987/987/ 98b/987/987/987/987/987/987/987/987/987/987/987/98b/987/987/ 987/98b/987/987/987/98b/987/987/987/98b/987/987/987/98b/987/ 987/987/98b/987/987/987/987/987/987/987/987/987/987/987/98b/ 987/987/987/98b/987/987/987/98b/987/987/987/98b/987/987/987/ 987//87/987/987/987//87/987/987/987/987/987/987/987/987/987/ 987/987//87/987/987/987//87/987/987/98b/987/987/987/98b/987/ 987/987/987/987/987/987/987/987/987/99b/987/987/987//9b//9b/ /97//9b//9b/99b//9b/99b//9b/99b//9b/99b//9b/99b//9b/99b//9b/ 99b//9b/99b//9b/99b//9b//9b//9b//9b//97//9b//97//9b//97//97/ /97//97//97/99b/99b/987//9b/99b//9b/987//9b/99b//9b/987//9b/ 99b//9b/987//9b/99b//9b/987//9b/99b//9b/987//9b/99b//9b/987/ /9b//9b//9b//9b//9b//9b//9b/99b//9b/987/99b/987/987/987/987/ 98b//87/987/987/987//87/987/987/987/987/987/987/987/987/987/ 987/98b/987/987/987/98b/987/987/987/98b/987/987/987/98b/987/ 987/987/98b/987/987/987/98b/987/987/987/98b/987/987/987/98b/ 987/987/987/98b/987/987/987/98b/987/987/987/98b/987/987/987/ 98b/987/987//87/987/987/987/987/987//9b//87/99b/987/99b/987/ 987/987//87/987/987/987/99b/987/99b/987//9b/987/99b/987//9b/ 987//9b/987//9b/987/99b/987//9b/987/99b/987//9b/987/99b/987/ /9b/987/99b/987//9b/987//9b/987//9b/987//9b/987//9b/987//9b/ 987//9b/987/99b/987/99b/987/987/987//87/987/987/987//87/987/ 987/987//87/987/987/98b/987/98b/987/98b/987/98b/987/98b/987/ 98b/987/98b/987/987/987/98b/987/987/987/987/987/987/987/98b/ 987/98b/987/98b/987/987/987/98b/987/987/987/78b/987/98b/987/ 78b/987/98b/987/78b/987/98b/98b/78b/987/78b/98b/78b/987/78b/ 98b/78b/987/78b/987/78b/987/78b/987/78b/987/78b/98b/78b/987/ 78b/98b/78b/987/78b/98b/78b/987/78b/98b/78b/987/78b/98b/78b/ 987/78b/98b/78b/987/78b/987/78b/987/78b/987/78b/987/78b/987/ 78b/987/78b/987/78b/987/78b/987/78b/987/98b/987/78b/987/98b/ 987/78b/987/78b/987/78b/987/78b/987/78b/987/78b/987/78b/987/ 78b/987/78b/987/78b/987/78b/987/78b/987/78b/987/78b/987/78b/ 987/78b/987/78b/987/78b/987/78b/987/78b/987/78b/987/78b/987/ 78b/987/78b/987/78b/987/78b/987/78b/987/78b/987/78b/987/78b/ 987/78b/987/78b/987/78b/987/78b/987/78b/987/78b/987/78b/987/ 78b/987/78b/987/78b/984A/+/G//fO/+/G//fG/+/G//fO/+/G//fG/+/G //fO/+/G//fG/+/G//fO/+/G//fG/+/O//fG//e9/+/O/+/G//fG7+fW1tb/ nK3/nL3/nMb/nNb/lN7/lOf/lOf/nO//nPf/lP//nP//jP//jP//3vf///fW 9//Wtf/vvf/vxv/e3v/W7/fO//fO/+/G//fG7/fG9/e99/e13u+lveeUzve1 5//G9/fO/+/G//fO/+/G//fG/+/G//fO/+/G//fG/+/G//fO/+/G//fG/+/G //fO/+/G//fG/+/G//fO/+/G//fG/+/G//fO/+/G//fG/+/G//fO/+/G//fG /+/G//fO/+/G//fG/+/G//fO/+/G//fG/+/G//fO/+/G//fG/+/G//fO/+/G //fG/+/G//fO/+/G//fG/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO /+/G//fG/+/G//fO/+/G//fG/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G //fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fG/+/G//fO/+/G//fG /+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fG/+/G//fO/+/G //fG/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fG/+/G//fO /+/G//fG/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fG/+/G //fO/+/G//fG/+/G//fO/+/G//fO/+/G//fO/+/G//fO//fG//fO/+/G//fO //fG//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G //fO/+/G//fO/+/G//fO/+/O//fO/+/G//fO//fO//fW//fO///W//fW//fW //fO//fO//fO///W//fO//fO//fO//fW//fO//fW//fO//fW//fO//fW//fO ///W//fO///W//fW///W//fW///W//fW///W//fW///W///W///e///W///e //fO//fW//fO//fO//fO//fW//fO//fW//fO//fW//fO//fO//fO//fW//fO //fO//fO//fW/+/O//fO//fO//fW/+/O//fO//fO//fO//fO//fO//fO//fW //fO//fW//fO///W//fO///W//fO//fO/+/G/+/O//fG//fO/+/G//fO/+/G //fO/+/G//fO//fO//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO /+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G //fG/+/G//fO/+/G//fG/+/G//fO/+/G//fG/+/G//fO/+/G//fG/+/G//fO /+/G//fG/+/G//fO/+/G//fG/+/G//fO/+/G//fG/+/G//fO/+/G//fG//fG //fO/+/G//fO/+/G//fO//fG//fO//fO//fO/+/O//fO/+/G//fO//fG//fO /+/O//fO/+/O//fO//fO//fO/+/O//fO/+/O//fO/+/O//fO/+/O//fO/+/O //fO//fO//fO/+/O//fO//fO//fO/+/O//fO//fO//fO/+/O//fO//fO//fO /+/O//fO//fO//fO/+/O//fO//fO//fO/+/O//fO//fO//fO/+/O//fO/+/O //fO/+/O//fO//fG//fO/+/G//fO//fG//fO/+/G//fO/+/G//fO/+/G//fG /+/G//fO/+/G//fG/+/G//fG/+/G//fG/+/G//fG/+/G//fG/+/G//fO/+/G //fG/+/G//fO/+/G//fG//fG//fO/+/G//fO/+/G//fO/+/G//fG/+/G//fO /+/G//fG/+/G//fO/+/G//fG/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G //fG/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G /+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/++9/+/G/+/G/+/G/++9 /+/G/+/G/+/G/++9/+/G/+/G/+/G/++9/+/G/+/G/+/G/++9/+/G/+/G/+/G /++9/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G /+/G/+/G/+/G/+/G//fG/+/G/+/G/+/G//fG/+/G/+/G/+/G/+/G/+/G/+/G /+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G /+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G /+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G /+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G /+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G /+/G/+/GAP/3zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3 zv/vxv/3xv/vxv/31v/3xv/3xv/vxv/3xv/3vf/v1ufe5621/5y1/5y9/5TG /5zO/5TO/5ze/5zv/5zn/4ze/5z3/5Tn/4zv/8bv///37//31t7/5+f/3vf/ 1v/vzv/vzv/vxv/3xv/vvf/vzv/vxv/3zv/3xu/3xuf3xvf/zvf3xv/3zv/v xv/3xv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3 zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/v xv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3 xv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/v xv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3 zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/v xv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3 zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/v xv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3 zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/3xv/3zv/vxv/3zv/3xv/3zv/v xv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3 zv/vxv/3zv/3xv/3zv/vxv/3zv/3zv//zv/3zv//3v/31v/31v/3zv/31v/3 zv/31v/3zv/31v/3zv/31v/3zv//1v/3zv/31v/3zv//1v/31v//1v/31v// 1v/31v//1v/31v//1v/31v//1v/31v//3v//1v//3v//3v//3v/31v/3zv/v zv/31v/31v/31v/vzv/31v/3zv/3zv/3zv/31v/3zv/3zv/3zv/31v/3zv/3 zv/3zv/31v/3zv/3zv/3zv/3zv/3zv/3zv/3zv/31v/3zv/31v/3zv/31v/3 zv//1v/3zv//1v/3zv/31v/3zv//zv/3zv/3zv/vxv/3zv/vxv/3zv/vxv/3 zv/3xv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/v xv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3 xv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3zv/v xv/3xv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/3xv/3zv/vxv/3 zv/3xv/3zv/3xv/31v/3zv/3zv/vxv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3 xv/3zv/3zv/3zv/3xv/3zv/3xv/3zv/3xv/3zv/3zv/3zv/3zv/3zv/3zv/3 zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3zv/3 zv/3zv/3zv/3zv/3zv/3zv/vzv/3zv/3zv/3zv/3xv/3zv/3xv/3zv/vxv/3 zv/3xv/3zv/vxv/3zv/3xv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3xv/v xv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3xv/vxv/3zv/vxv/3 xv/vxv/3zv/3xv/3zv/vxv/3zv/vxv/3zv/vxv/3zv/vxv/3xv/vxv/3zv/v xv/3xv/vxv/3xv/vxv/vxv/vxv/3xv/vxv/vxv/vxv/3xv/vxv/vxv/vxv/v xv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/v xv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/v xv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/v xv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/3 xv/vxv/vxv/vxv/3xv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/v xv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/v xv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/v xv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/v xv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/v xv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxgD/78b/ 78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/ 78b/98b/773/98b/773/973/78b379atrf+cpf+Upf+ctf+Uvf+cxv+Uzv+c 1v+Mxv+Mxv+c1v+czv+Ezv+11v/v7+//787v987/987/78b/78b/58b/78b/ 773398b/58b/78b/58b/787/78b/98b/78b/98b/78b/78b/78b/78b/78b/ 78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/ 78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/ 78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/ 78b/78b/78b/78b/78b/78b/78b/78b/78b/98b/78b/78b/78b/98b/78b/ 78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/ 78b/78b/78b/98b/78b/78b/78b/98b/78b/78b/78b/78b/78b/78b/78b/ 78b/78b/78b/78b/98b/78b/78b/78b/98b/78b/78b/78b/78b/78b/78b/ 78b/78b/78b/78b/78b/98b/78b/78b/78b/98b/78b/78b/78b/78b/78b/ 78b/78b/78b/78b/78b/78b/98b/78b/78b/78b/98b/78b/78b/78b/78b/ 78b/78b/78b/78b/78b/78b/78b/98b/78b/78b/78b/98b/78b/78b/78b/ 78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/98b/ 78b/98b/78b/78b/78b/987/987/99b/99b/99b/787/787/787/99b/787/ 987/787/99b/987/99b/987/99b/987/99b/987/99b/987/99b/987/99b/ 987/99b/987/99b/987/99b/99b//97//9b//9b/987/987/787/987/787/ 987/787/987/787/987/787/987/787/987/787/987/787/987/787/987/ 787/987/78b/987/787/987/78b/987/787/987/78b/987/787/987/987/ 987/987/99b/987/987/78b/987/78b/78b/78b/78b/78b/78b/78b/78b/ 78b/78b/78b/987/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/ 78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/ 78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/ 78b/78b/98b/78b/78b/78b/98b/78b/78b/78b/78b/78b/78b/78b/98b/ 787/987/78b/98b/78b/98b/78b/987/78b/78b/78b/987/78b/98b/78b/ 987/78b/987/78b/987/78b/987/78b/987/78b/987/787/987/78b/987/ 787/987/78b/987/787/987/78b/987/787/987/787/987/787/987/78b/ 987/78b/987/78b/98b/78b/987/78b/78b/78b/98b/78b/78b/78b/98b/ 78b/78b/78b/98b/78b/78b/78b/98b/78b/78b/78b/78b/78b/78b/78b/ 78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/ 78b/78b/78b/78b/78b/78b/573/78b/78b/78b/573/78b/78b/78b/773/ 78b/773/78b/773/78b/773/78b/573/78b/773/78b/573/78b/573/78b/ 573/78b/573/78b/573/78b/573/78b/573/78b/773/78b/573/78b/773/ 78b/573/78b/773/78b/573/78b/773/78b/573/78b/773/78b/573/78b/ 773/78b/573/78b/773/78b/573/78b/773/78b/573/78b/773/78b/573/ 78b/773/78b/573/78b/773/78b/573/78b/773/78b/573/78b/573/78b/ 573/78b/573/78b/573/78b/573/78b/573/78b/573/78b/573/78b/773/ 78b/573/78b/773/78b/573/78b/773/78b/573/78b/773/78b/573/78b/ 773/78b/573/78b/773/78b/573/78b/773/78b/573/78b/773/78b/573/ 78b/773/78b/573/78b/773/78b/573/78b/773/78b/573/78b/773/78b/ 573/78b/773/78b/573/78b/773/78b/573/78b/773/78b/573/78b/773/ 78b/573/78b/773/78b/573/78b/773/78b/770A/+/G/+/G/+/G/+/G/+/G /+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/O/+/G//fG/+/G //fG/++9//fG/+/Gxsb/raX/pZz/paX/nLX/nL3/pcb/nLX/lNb/pcb/vc7/ rcb/pcb/xs7/9+/n/++99+/G/++9/+/G/+/G/+/G/+/G/+/G/+/G/+/O/+fG /+fG/+fG/+/O/+/G/+/G/+e9/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G /+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G /+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G /+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G //fO/+/G//fG/+/G//fG/+/G//fG/+/G//fG/+/G/+/G/+/G//fG/+/G/+/G /+/G//fG/+/G/+/G/+/G//fO/+/G/+/G/+/G//fO/+/G//fG/+/G//fG/+/G //fG/+/G//fG/+/G/+/G/+/G//fG/+/G/+/G/+/G//fG/+/G//fG/+/G//fG /+/G//fG/+/G//fG/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G//fG/+/G //fG/+/G//fG/+/G//fG/+/G/+/G/+/G//fG/+/G/+/G/+/G//fG/+/G/+/G /+/G//fG/+/G/+/G/+/G//fG/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G /+/G/+/G//fG/+/G/+/G/+/G//fG/+/G/+/G/+/G//fG/+/G/+/G/+/G//fG /+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G//fO/+/G/+/G/+/G /+/G/+/G/+/O/+/O///W///W//fW/+/O//fO/+/O//fO/+/O//fW//fO//fW //fO///W//fW//fW//fO//fW//fO//fW//fO//fW//fO//fW//fO//fW//fO //fW//fO//fW//fW///e///W///e//fW//fO/+/G//fO//fO//fO/+/O//fO /+/O//fO/+/O//fO/+/O//fO/+/G//fO//fG//fO/+/G//fO//fG//fO/+/O //fO/+/O//fO/+/O//fO/+/O//fO/+/O//fO/+/O//fO/+/O//fO//fO//fO //fO//fO/+/O//fO/+/G//fO/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G /+/G/+/G//fG/+/G/+/G/+/G//fG/+/G/+/G/+/G//fG/+/G/+/G/+/G//fG /+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G /+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G//fG/+/G//fG/+/G//fG /+/G//fG/+/G/+/G/+/G//fG/+/G/+/G/+/G//fG/+/G//fO/+/G//fO/+/G //fG/+/G//fO/+/G/+/G/+/G//fG/+/G//fG/+/G//fO/+/G//fG/+/G//fO /+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G//fO/+/G //fO/+/G//fO/+/G//fO/+/G//fO/+/O//fO/+/O//fO/+/G//fO/+/O//fG /+/G//fG/+/G//fG/+/G//fG/+/G/+/G/+/G//fG/+/G/+/G/+/G//fG/+/G //fG/+/G//fG/+/G/+/G/+/G//fG/+/G/+/G/+/G//fG/+/G/+/G/+/G//fG /+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/+/G/++9 /+/G/+/G/+/G/+e9/+/G/+/G/+/G/+e9/+/G/+/G/+/G/++9/+/G/+/G/+/G /++9/+/G/+/G/+/G/+e9/+/G/++9/+/G/+e9/+/G/+e9/+/G/+e9/+/G/+e9 /+/G/+e9/+/G/+e9/+/G/+e9/+/G/++9/+/G/+e9/+/G/++9/+/G/++9/+/G /++9/+/G/++9/+/G/++9/+/G/++9/+/G/++9/+/G/++9/+/G/++9/+/G/++9 /+/G/++9/+/G/++9/+/G/++9/+/G/+e9/+/G/++9/+/G/+e9/+/G/++9/+/G /+e9/+/G/++9/+/G/+e9/+/G/++9/+/G/+e9/+/G/+e9/+/G/+e9/+/G/+e9 /+/G/+e9/+/G/+e9/+/G/+e9/+/G/+e9/+/G/+e9/+/G/++9/+/G/+e9/+/G /++9/+/G/+e9/+/G/++9/+/G/+e9/+/G/++9/+/G/+e9/+/G/++9/+/G/+e9 /+/G/++9/+/G/+e9/+/G/++9/+/G/+e9/+/G/++9/+/G/+e9/+/G/++9/+/G /+e9/+/G/++9/+/G/+e9/+/G/++9/+/G/+e9/+/G/++9/+/G/+e9/+/G/++9 /+/G/+e9/+/G/++9/+/G/+e9/+/G/++9/+/G/+e9/+/G/++9/+/G/+e9/+/G /++9/+/G/+e9/+/G/++9/+/GAP/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/n vf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vvf/vvf/vxv/nvf/v ve/e59bG78at/72t/6Wl/621/7W9/73G/6XW/87O/9bG/87e/87W/+/e7//n zv/vvf/nvf/vxv/nvf/vxv/nvf/vxv/nvf/nvffnvf/vxv/nvf/vxv/vxv/v xv/nvf/nvf/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/n vf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/v xv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/n vf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/vvf/v xv/nvf/vxv/vvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/n vf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/vvf/vxv/nvf/v xv/vvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/vvf/vxv/n vf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/vvf/v xv/nvf/vxv/vvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/v vf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/vvf/vxv/vvf/v xv/vvf/vxv/vvf/vxv/vvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/nvf/vxv/n vf/vxv/nvf/vxv/nvf/vxv/vvf/vxv/vvf/vxv/vvf/vxv/vvf/vxv/nxv/v zv/vxv/3zv/3zv/31v/vzv/vzv/vzv/3zv/vzv/3zv/vzv/3zv/vzv/3zv/v zv/3zv/vzv/3zv/vzv/3zv/vzv/3zv/vzv/3zv/vzv/3zv/vzv/3zv/vzv/3 zv/3zv//1v/31v//1v/3zv/3zv/vxv/vzv/vxv/vzv/vxv/vzv/vxv/vzv/v xv/vzv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vzv/vxv/vxv/vxv/v zv/vxv/vxv/vxv/3zv/vxv/vxv/vxv/vzv/vxv/vzv/vxv/vzv/vxv/vzv/v xv/vzv/vxv/vzv/vxv/vxv/nvf/vxv/nvf/vxv/nvf/vxv/vvf/vxv/nvf/v xv/vvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/nvf/vxv/n vf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/v xv/nvf/vxv/nvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/v vf/vxv/vvf/vxv/vvf/vxv/nvf/vxv/vxv/vxv/nxv/vxv/vxv/vxv/vvf/v xv/vvf/vxv/vvf/vxv/vxv/vxv/vvf/vxv/vxv/vxv/vvf/vxv/vxv/vxv/v xv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/vxv/v xv/vxv/vxv/vxv/vzv/vxv/vxv/vxv/vzv/vxv/vxv/vxv/vxv/vvf/vxv/v vf/vxv/vvf/vxv/vvf/vxv/vvf/vxv/vvf/vxv/vvf/vxv/vvf/vxv/vvf/v xv/vvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/nvf/vxv/n vf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vvf/nvf/v xv/nvf/nvf/nvf/vxv/nvf/nvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/n vf/vvf/nvf/vvf/nvf/vvf/nvf/nvf/nvf/nvf/nvf/nvf/nvf/nvf/nvf/n vf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/vvf/nvf/vvf/n vf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/v vf/nvf/vvf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/n vf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/nvf/nvf/n vf/nvf/nvf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/vvf/n vf/nvf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/v vf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/n vf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/n vf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/vvf/n vf/nvf/nvQD/78b/773/78b/773/78b/773/78b/773/78b/773/78b/773/ 78b/773/78b/773/773/58b/58b/573/78b/58b/78b/77X/78b3573v79bn 1v/Oxv/Gtf/Ozv/Gzv+91v/exv/vzv/e98b3787/77X/58b/573/773/573/ 78b/773/78b/773/78b/573/773/773/773/57X/78b/773/773/773/78b/ 773/78b/773/78b/773/78b/773/78b/573/78b/573/78b/573/78b/573/ 78b/573/78b/573/78b/573/78b/573/78b/573/78b/573/78b/573/78b/ 573/78b/773/78b/773/78b/773/78b/773/78b/773/78b/773/78b/773/ 78b/773/78b/573/78b/573/78b/573/78b/573/78b/773/78b/773/78b/ 773/78b/773/78b/773/78b/773/78b/773/78b/773/78b/78b/78b/573/ 78b/78b/78b/573/78b/773/78b/773/78b/773/78b/773/78b/773/78b/ 773/78b/773/78b/773/78b/773/78b/773/78b/773/78b/773/78b/78b/ 78b/573/78b/78b/78b/573/78b/773/78b/773/78b/773/78b/773/78b/ 773/78b/773/78b/773/78b/773/78b/773/78b/573/78b/773/78b/573/ 78b/78b/78b/573/78b/78b/78b/573/78b/78b/78b/773/78b/78b/78b/ 773/78b/773/78b/773/78b/773/78b/773/78b/78b/78b/573/78b/78b/ 78b/573/78b/78b/78b/773/78b/78b/78b/78b/787/58b/78b/78b/99b/ 99b/99b/987/99b/987/99b/787/99b/787/987/787/987/787/987/787/ 987/787/987/787/987/787/987/787/987/787/987/787/99b/987/99b/ 99b//97//9b/987/58b/787/78b/787/78b/787/78b/787/78b/78b/78b/ 78b/78b/78b/78b/78b/78b/787/78b/787/78b/787/78b/78b/78b/787/ 78b/787/78b/787/78b/787/78b/78b/78b/787/78b/987/787/987/78b/ 987/78b/78b/78b/78b/573/78b/573/78b/773/78b/773/78b/773/78b/ 773/78b/773/78b/773/78b/773/78b/773/78b/773/78b/773/78b/773/ 78b/773/78b/773/78b/773/78b/773/78b/773/78b/773/78b/773/78b/ 773/78b/773/78b/773/78b/773/78b/773/78b/773/78b/78b/78b/773/ 78b/773/78b/573/78b/78b/78b/78b/78b/773/78b/573/78b/78b/78b/ 78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/ 78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/78b/787/ 78b/787/78b/787/78b/78b/78b/98b/78b/78b/78b/78b/78b/78b/773/ 78b/78b/78b/773/78b/78b/78b/773/78b/773/78b/773/78b/773/78b/ 573/78b/773/78b/573/78b/773/78b/573/78b/573/78b/573/78b/573/ 78b/573/78b/773/78b/573/78b/573/78b/573/78b/573/78b/573/78b/ 573/78b/573/78b/573/773/573/78b/573/773/573/78b/573/773/573/ 78b/573/773/573/773/573/573/573/773/573/573/573/78b/573/773/ 573/78b/573/773/573/773/573/773/573/773/573/773/573/773/573/ 773/573/773/573/773/573/773/573/773/573/773/573/773/573/78b/ 573/773/573/78b/573/773/573/78b/573/773/573/78b/573/773/573/ 773/573/773/573/773/573/773/573/78b/573/573/573/78b/573/573/ 573/773/573/573/573/773/573/573/573/773/573/573/573/773/573/ 573/573/773/573/573/573/773/573/573/573/773/573/573/573/773/ 573/573/573/773/573/573/573/773/573/573/573/78b/573/773/573/ 78b/573/773/573/78b/573/773/573/78b/573/773/573/773/573/573/ 573/773/573/573/573/773/573/573/573/773/573/573/573/570A/+e9 /++9/+e9/++9/+e9/++9/+e9/++9/+e9/+e9/+e9/+/G/+e9/+e9/+e9/+/G /+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9 /++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9 /+e9/++9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/++9/+e9/++9/+e9 /++9/+e9/++9/+e9/+e9/+e9/++9/+e9/+e9/+e9/++9/+e9/++9/+e9/++9 /+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/+e9/+e9 /+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+/G/+e9/+e9/+e9/+/G/+e9/++9 /+e9/+/G/+e9/++9/+e9/+/G/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e1 /+e9/+e1/+e9/+e1/+e9/+e1/+e9/+e9/++9/+e9/++9/+e9/++9/+e9/++9 /+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9 /++9/+e9/+e9/+e9/++9/+e9/+e9/+e9/++9/+e9/+e9/+e9/+/G/+e9/+e9 /+e9/+/G/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9 /++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9 /+e9/++9/+e9/++9/+e9/++9/+e9/+/G/+e9/++9/+e9/+/G/+e9/+e9/+e9 /+/G/+e9/+e9/+e9/+/G/+e9/++9/+e9/+e9/+e9/++9/+e9/+/G/+e9/+e9 /+e9/++9/+e9/++9/+e9/++9/+fG/+/G/+fG/+/G/+/G//fO//fO///W/+fO /+/O/+/O//fO/+/G/+/G/+/G//fO/+/G/+/O/+/O/+/O/+/G/+/O/+/G/+/O /+/G/+/O/+/G/+/O/+/G/+/O/+/G/+/O/+/O//fO/+/O//fO/+/O//fW//fO //fW/+e9/+/G/+fG/+/G/+fG/+/G/+fG/+/G/+e9/+/G/+e9/+/G/+e9/+/G /+e9/+/G/+e9/+/G/+e9/+/G/+e9/++9/+e9/+/G/+e9/+/G/++9/+/G/+e9 /+/G/++9/+/G/++9/+/G/++9/+/G/++9/+/G/++9/+/G/+/G/+/G/+/G/+/G /+e9/+/G/+e9/+/G/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/++9/+e9 /++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/+e9 /+e9/+/G/+e9/+e9/+e9/+/G/+e9/+e9/+e9/+/G/+e9/+e9/+e9/+/G/+e9 /+e9/+e9/+/G/+e9/+e9/+e9/+/G/+e9/+e9/+e9/+/G/+e9/+e9/+e9/+/G /+e9/+/G/++9/+/G/+e9/++9/+e9/+/G/+e9/++9/+e9/+/G/+e9/++9/+e9 /+/G/+e9/+/G/+e9/+/G/+e9/+/G/++9/+/G/+e9/+/G/+e9/+/G/+e9/+/G /+e9/+/G/+e9/+/G/+/G/+/G/+e9/+/G/+/G/+/G/+e9/+/G/+e9/+/G/+e9 /+/G/+e9/+/G/+e9/+/G/+e9/+/G/+e9/+/G/+e9/+/G/+e9/++9/+e9/++9 /+e9/++9/+e9/++9/+e9/++9/+e9/++9/+e9/+e9/+e9/++9/+e9/++9/+e9 /++9/+e9/++9/+e9/++9/+e9/+e9/+e9/+/G/+e9/+e9/+e9/+/G/+e9/++9 /+e9/++9/+e9/+e9/+e9/++9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9 /+e9/+e9/+e9/+e1/+e9/+e9/+e9/961/+e9/+e1/+e9/961/+e9/961/+e9 /961/+e1/961/+e1/961/+e1/961/+e1/961/+e1/+e1/+e9/961/+e1/+e1 /+e9/961/+e1/+e1/+e9/961/+e1/+e1/+e9/961/+e1/+e1/+e9/961/+e1 /+e1/+e9/961/+e1/+e1/+e9/961/+e1/+e1/+e9/961/+e1/+e1/+e9/961 /+e1/+e1/+e9/961/+e1/+e1/+e9/961/+e1/+e1/+e9/961/+e1/+e1/+e9 /961/+e1/+e1/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e9 /+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e9/+e9/961/+e9 /+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/+e1 /+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e1/+e9/+e1/+e9/+e1/+e9 /+e1/+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e1/+e9/+e1/+e9/+e1 /+e9/+e1/+e9/+e1/+e9/+e1/+e9/+e1/+e9/+e1AP/vvf/nvf/vvf/nvf/v vf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/n vf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/v vf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/nvf/n vf/vvf/nvf/nvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/v vf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/n vf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/nvf/nvf/vvf/nvf/nvf/nvf/v vf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vxv/nvf/vvf/n vf/vxv/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/nvf/ntf/vvf/nvf/n vf/ntf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/n vf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/v xv/nvf/vvf/nvf/vxv/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/n vf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/v vf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/n vf/vvf/nvf/vxv/nvf/vvf/nvf/vxv/nvf/vvf/nvf/vvf/nvf/vvf/nvf/v vf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vxv/vvf/vvf/nvf/vxv/nvf/vxv/n vf/vxv/vvf/vxv/nxv/vxv/vxv/vxv/vxv/3zv/3zv/31v/vzv/vzv/vxv/v zv/vxv/3zv/vxv/3zv/vxv/3zv/vzv/vzv/vxv/vzv/vxv/vzv/vxv/3zv/v zv/vzv/vxv/3zv/vzv/3zv/vzv/3zv/vzv/3zv/vzv/31v/3zv/3zv/vxv/v xv/nxv/vxv/vxv/vxv/nxv/vxv/nvf/vxv/vxv/vxv/nvf/vxv/nvf/vxv/n vf/vxv/vvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/vvf/v xv/vvf/vxv/vvf/vxv/vvf/vxv/vvf/vxv/nvf/vxv/vxv/vxv/nvf/vxv/v xv/vxv/nvf/vxv/nvf/nvf/nvf/vxv/nvf/vvf/nvf/vvf/nvf/vvf/nvf/v vf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/n vf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/v vf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vxv/v vf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vvf/nvf/v xv/nvf/vxv/nvf/vxv/vvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vxv/n vf/vxv/vxv/vxv/nvf/vxv/vxv/vxv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/v xv/nvf/vxv/nvf/vxv/nvf/vxv/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/n vf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/v vf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/nvf/vvf/n vf/vvf/nvf/nvf/nvf/nvf/nvf/nvf/nvf/nvf/nvf/nvf/nvf/nvf/nvf/n vf/ntf/nvf/nvf/nvf/ntf/nvf/nvf/nvf/etf/nvf/ntf/nvf/ntf/nvf/n tf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/n vf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/n tf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/n vf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/n tf/nvf/ntf/nvf/nvf/nvf/ntf/nvf/nvf/nvf/ntf/nvf/nvf/nvf/ntf/n vf/nvf/nvf/ntf/nvf/nvf/nvf/ntf/nvf/nvf/nvf/ntf/nvf/nvf/nvf/n tf/nvf/nvf/nvf/ntf/nvf/nvf/nvf/ntf/nvf/nvf/nvf/ntf/nvf/nvf/n vf/ntf/nvf/nvf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/n vf/nvf/ntf/nvf/nvf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/nvf/ntf/n vf/ntf/nvf/ntf/nvf/ntf/nvQD/57X/573/3rX/573/57X/573/3rX/573/ 57X/573/3rX/573/57X/573/3rX/573/57X/573/3rX/573/57X/573/3rX/ 573/57X/573/3rX/573/57X/573/3rX/573/57X/573/3rX/573/57X/573/ 3rX/573/57X/573/3rX/573/57X/573/3rX/573/57X/573/57X/573/57X/ 573/57X/573/57X/573/3rX/573/57X/573/3rX/573/573/573/57X/573/ 573/573/57X/573/57X/573/3rX/573/57X/573/3rX/573/57X/573/3rX/ 573/57X/573/3rX/573/57X/573/57X/573/57X/573/57X/573/57X/573/ 3rX/573/57X/573/3rX/573/57X/573/57X/573/57X/573/57X/573/57X/ 573/57X/573/57X/573/57X/573/57X/573/57X/573/57X/573/57X/573/ 57X/573/57X/573/57X/573/57X/573/57X/573/57X/573/57X/573/57X/ 573/57X/573/57X/573/57X/573/57X/573/573/573/57X/573/573/573/ 57X/573/57X/573/57X/573/57X/573/57X/573/57X/573/57X/573/57X/ 573/57X/573/57X/573/57X/573/57X/573/57X/573/57X/573/57X/573/ 57X/573/57X/573/57X/573/57X/573/57X/573/57X/573/57X/573/57X/ 573/57X/573/57X/573/57X/573/57X/573/57X/573/57X/573/57X/573/ 57X/573/573/573/573/573/573/573/573/573/573/78b/573/78b/58b/ 78b/573/58b/573/78b/573/78b/79b/987/78b/787/78b/78b/78b/78b/ 78b/787/58b/78b/58b/78b/58b/78b/58b/78b/58b/78b/58b/78b/58b/ 78b/78b/787/58b/787/78b/787/78b/987/987/987/58b/58b/573/58b/ 573/58b/573/78b/573/573/573/78b/573/573/573/773/573/773/573/ 773/573/573/573/573/573/573/573/573/573/573/573/773/573/573/ 573/773/573/573/573/573/573/573/573/78b/573/78b/573/78b/573/ 573/573/573/3rX/573/57X/573/57X/573/57X/573/57X/573/57X/573/ 57X/573/57X/573/57X/573/57X/573/3rX/573/57X/573/3rX/573/57X/ 573/3rX/573/57X/573/3rX/573/57X/573/57X/573/57X/573/57X/573/ 57X/573/57X/573/57X/573/57X/573/57X/573/573/573/573/573/57X/ 573/573/573/573/573/573/573/573/573/573/573/57X/573/573/573/ 573/573/573/573/573/573/573/573/573/573/573/573/573/573/573/ 573/573/573/573/573/573/573/573/573/573/573/573/573/57X/573/ 573/573/57X/573/57X/573/57X/573/57X/573/57X/573/57X/573/57X/ 573/57X/573/3rX/573/57X/573/3rX/573/57X/573/3rX/573/57X/573/ 57X/573/57X/573/57X/573/57X/573/57X/573/57X/573/3rX/573/3rX/ 573/3rX/573/3rX/573/3rX/57X/3rX/573/3rX/57X/3rX/573/3rX/57X/ 3rX/573/3rX/573/3rX/573/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/ 57X/3rX/57X33rX/57X/3rX/57X33rX/57X/3rX/57X/3rX/57X/3rX/57X/ 3rX/57X/3rX/57X33rX/57X/3rX/57X33rX/57X/3rX/57X/3rX/57X/3rX/ 57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/ 3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X33rX/ 3rX/3rX/57X33rX/3rX/3rX/57X33rX/3rX/3rX/57X33rX/3rX/3rX/573/ 3rX/57X/3rX/573/3rX/57X/3rX/573/3rX/573/3rX/573/3rX/573/3rX/ 573/3rX/573/3rX/573/3rX/573/3rX/57X33rX/3rX/3rX/57X33rX/3rX/ 3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/573/3rX/57X/3rX/573/3rX/ 57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/ 3rX/57X/3rUA/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961 /+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9 /961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1 /+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9 /+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1 /+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9 /961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1 /+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e9/+e9/+e1/+e9 /+e9/+e9/+e1/+e9/+e1/+e9/+e1/+e9/+e1/+e9/+e1/+e9/+e9/+e9/+e1 /+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e9/+e9 /+e1/+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e9 /+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9 /+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1 /+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e1/+e9/961/+e9/+e1/+e9 /961/+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e9/+e9/+e9 /+e9/961/+e9/+e9/+e9/+e9/+/G/+e9/+/G/+e9/+/G/+e9/+e9/+e9/+e9 /+e9/+e9/+e9/+/O/+/O//fW/+/O/+/O/+fG/+/G/+/G/+/G/+fG/+/G/+fG /+/G/+fG/+/G/+fG/+/O/+fG/+/G/+fG/+/O/+fG/+/G/+fG/+/O/+/G/+/G /+fG/+/O/+/G/+/O/+/G//fO//fO//fW/+/O/+/G/+e9/+fG/+e9/+/G/+e9 /+e9/+e9/+fG/+e9/+e9/+e9/++9/+e9/+e9/+e9/++9/+e9/+e9/+e9/+e9 /+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9 /+e9/+e9/+e9/+e9/+fG/+e9/+e9/+e9/+fG/+e9/+e9/+e9/+e9/+e9/+e9 /969/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1 /+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9 /+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961 /+e9/+e1/+e9/961/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e1/+e9/+e9/+e9 /+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9 /+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9 /+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9/+e9 /+e9/+e9/+e9/+e1/+e9/+e9/+e9/+e1/+e9/+e9/+e9/961/+e9/+e1/+e9 /961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1/+e9/961/+e9/+e1 /+e9/961/+e9/+e9/+e9/961/+e9/+e1/+e9/961/+e9/961/+e9/961/+e9 /961/+e9/961/+e9/961/+e9/961/+e9/961/+e1/961/+e9/961/+e9/961 /+e9/961/+e1/961/+e1/961/+e1/961/+e1/961/+e1/961/+e1/961/+e1 /961/+e1/961/+e1/961/+e1/961/+e1/961/+e1/961/+e1/961/+e1/961 /+e1/961/+e1/961/+e1/961/+e1/961/+e1/961/+e1/961/+e1/961/+e1 /961/+e1/961/+e1/961/+e1/961/+e1/961/+e1/961/+e1/961/+e1/961 /+e1/961/+e1/961/+e1/961/+e1/961/+e9/961/+e1/961/+e9/961/+e1 /961/+e9/961/+e1/961/+e9/961/+e1/961/+e9/961/+e1/961/+e9/961 /+e1/961/+e9/961/+e9/961/+e9/961/+e9/961/+e9/961/+e9/961/+e9 /961/+e9/961/+e9/961/+e1/961/+e9/961/+e1/961/+e9/+e1/+e1/961 /+e9/+e1/+e1/961/+e9/961/+e9/961/+e9/961/+e9/961/+e1/961/+e1 /961/+e1/961/+e1/961/+e1/961/+e1/961/+e1/961/+e1/961/+e1AP/e tf/ntf/etf/nvf/etf/ntf/etf/nvf/etf/ntf/etf/ntf/etf/ntf/etf/n tf/etf/ntf/etf/nvf/etf/ntf/etf/nvf/etf/ntf/etf/nvf/etf/ntf/e tf/nvf/etf/ntf/etf/nvf/etf/ntf/etf/nvf/etf/ntf/etf/nvf/etf/n tf/etf/nvffetf/etf/etf/ntffetf/etf/etf/ntf/etf/ntf/etf/nvf/e tf/ntf/etf/nvf/etf/ntf/etf/nvf/etf/ntf/etf/nvf/etf/ntf/etf/n vf/etf/ntf/etf/nvf/etf/ntf/etf/nvf/etf/ntf/etf/nvffetf/etf/e tf/ntffetf/etf/etf/ntf/etf/ntf/etf/ntf/etf/ntf/etf/ntf/etf/n tf/etf/nvf/etf/ntf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/e tf/ntf/etf/ntf/etf/ntf/etf/ntf/etf/nvf/etf/nvf/etf/nvf/etf/n vf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/e tf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/ntf/etf/ntf/etf/n tf/etf/ntf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/e tf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/n vf/etf/nvf/etf/nvf/etf/ntf/etf/nvf/etf/ntf/etf/nvf/etf/ntf/e tf/ntf/etf/ntf/etf/ntf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/nvf/n vf/nvf/nvf/ntf/nvf/nvf/nvf/evf/nvf/evf/nvf/etf/nvf/evf/nvf/e vf/vxv/vxv/3zv/nxv/vxv/nxv/vxv/nvf/nxv/nvf/nxv/nvf/nxv/nxv/n xv/nxv/nxv/nxv/vxv/nxv/nxv/nxv/vxv/nxv/nxv/nxv/vxv/nxv/vxv/n xv/vzv/nvf/vzv/vzv/3zv/nxv/nxv/evf/nvf/evf/nvf/evf/nvf/etf/n vf/etf/nvf/etf/nvf/ntf/nvf/etf/nvf/etf/nvf/etf/nvf/ntf/nvf/e tf/nvf/ntf/nvf/etf/nvf/ntf/nvf/etf/nvf/ntf/nvf/etf/nvf/etf/n vf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/e tf/nvf/etf/nvf/etf/nvf/etf/ntf/etf/nvf/etf/ntf/etf/nvf/etf/n tf/etf/ntf/etf/ntf/etf/ntf/etf/ntf/etf/ntf/etf/ntf/etf/ntf/e tf/ntf/etf/ntf/etf/ntf/etf/ntf/etf/ntf/etf/ntf/etf/ntf/etf/n tf/etf/ntf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/e tf/nvf/etf/nvf/etf/nvf/etf/nvf/ntf/nvf/etf/nvf/evf/nvf/etf/n vf/evf/nvf/etf/nvf/evf/nvf/etf/nvf/evf/nvf/etf/nvf/evf/nvf/e tf/nvf/evf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/n vf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/ntf/etf/nvf/etf/ntf/e tf/nvf/etf/ntf/etf/nvf/etf/ntf/etf/ntf/etf/ntf/etf/ntf/etf/n vf/etf/nvf/etf/ntf/etf/nvf/etf/ntf/etf/ntf/etf/etf/etf/ntf/e tf/etf/etf/etf/etf/etf/etf/etffetf/etf/etf/etffetf/etffetf/e tfferf/etf/erf/etfferf/etf/erf/etfferf/etf/erf/etfferf/etf/e rf/etfferf/etfferf/etfferf/etfferf/etfferf/etf/erf/etfferf/e tf/erf/etfferf/etfferf/etfferf/etfferf/etfferf/etfferf/etffe rf/etfferf/etfferf/etfferf/etfferf/etfferf/etfferf/etfferf/e tfferf/etfferf/etffetf/etf/etf/etffetf/etf/etf/etffetf/etf/e tf/etffetf/etf/etf/etffetf/etf/etf/etffetf/etf/etf/etffetf/e tf/etf/etffetf/etf/etf/etffetf/etf/etf/etffetf/etf/etf/etffe tf/etf/etf/etffetf/etf/etf/etfferf/etf/erf/etfferf/etf/erf/e tf/etf/etf/etf/etf/etf/etf/etf/etfferf/etf/erf/etfferf/etf/e rf/etfferf/etf/erf/etfferf/etf/erf/etf/etQD/573/3rX/573/3rX/ 573/3rX/573/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/573/3rX/573/ 3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/ 573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/3rX/ 3rX/57X/3rX/3rX/3rX/57X/3rX/573/3rX/573/3rX/573/3rX/573/3rX/ 57X/3rX/573/3rX/57X/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/ 3rX/573/3rX/573/3rX/573/3rX/573/3rX/3rX/3rX/57X/3rX/3rX/3rX/ 57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/573/3rX/573/3rX/573/ 3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/57X/3rX/57X/3rX/ 57X/3rX/57X/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/ 3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/ 573/3rX/573/3rX/573/3rX/57X/3rX/573/57X/57X/3rX/573/57X/573/ 3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/ 573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/ 3rX/573/3rX/573/3rX/573/3rX/573/3rX/57X/3rX/573/57X/57X/3rX/ 573/57X/57X/3rX/573/3rX/573/57X/573/573/573/573/573/573/573/ 3rX/573/57X/573/3rX/573/57X/573/57X/573/573/573/3rX/58b/58b/ 787/787/787/58b/58b/573/58b/58b/58b/573/58b/58b/58b/58b/78b/ 58b/58b/58b/78b/58b/78b/58b/78b/58b/78b/58b/78b/58b/58b/58b/ 787/787/987/78b/58b/3r3/573/3r3/573/573/573/3rX/573/3r3/573/ 57X/573/57X/573/3rX/573/3rX/573/57X/573/573/573/57X/573/573/ 573/3rX/573/57X/573/3rX/573/57X/573/3rX/573/3rX/573/3rX/573/ 3rX/573/3rX/573/3rX/573/3rX/573/3r3/573/3rX/573/3rX/573/3rX/ 573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/57X/3rX/57X/3rX/57X/ 3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/ 57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/573/ 57X/573/57X/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/ 573/57X/573/3rX/573/573/573/3r3/573/573/573/3r3/573/573/573/ 3rX/573/3r3/573/3rX/573/3r3/573/3rX/573/3r3/573/3rX/573/3r3/ 573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/ 3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/573/3rX/ 573/3rX/57X/3rX/57X/3rX/57X/3rX/57X/3rX/573/3rX/573/3rX/573/ 3rX/573/3rX/57X/3rX/57X/3rX/3rX/3rX/57X/3rX/3rX/3rX/57X/3rX/ 3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3q3/3rX/ 3q3/3rX/3q3/3rX/3q3/3rX/3q3/3rX/3rX/3rX/3q3/3rX/3rX/3rX/3q3/ 3rX/3q3/3rX/3q3/3rX/3q3/3rX/3q3/3rX/3rX/3rX/3q3/3rX/3rX/3rX/ 3q3/3rX/3q3/3rX/3q3/3rX/3q3/3rX/3q3/3rX/3q3/3rX/3q3/3rX/3q3/ 3rX/3q3/3rX/3q3/3rX/3q3/3rX/3q3/3rX/3q3/3rX/3q3/3rX/3q3/3rX/ 3q3/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/ 3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/ 3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX/ 3rX/3rX/3rX/3rX/3rX/3q3/3rX/3q3/3rX/3q3/3rX/3q3/3rX/3rX/57X/ 3rX/3rX/3rX/57X/3rX/3rX/3q3/3rX/3q3/3rX/3q3/3rX/3q3/3rX/3q3/ 3rX/3q3/3rX/3q3/3rX/3q3/3rUA/961/961/961/961/961/961/961/961 /96t/961996t/961/96t/961996t/961/961/9619961/961/961/9619961 /961/961/9619961/961/961/9619961/961/961/9619961/961/961/961 9961/961/961/9619961/961/961/9619961/9619961/961996t/9619961 /961996t/961/961/9619961/961/961/9619961/961/961/9619961/961 /961/9619961/961/961/961/961/961/961/961/961/961/961/9619961 /961/961/9619961/9619961/961996t/9619961/961996t/961/96t/961 /96t/961/96t/961/96t/961/961/961/961/961/961/961/961/961/961 /961/961/961/961/961/961/961/96t/961996t/961/96t/961996t/961 /961/961/961/961/961/961/961/961/961/961/961/961/961/961/961 /961/961/961/961/961/961/961/961/961/961/9619961/961/961/961 9961/961/96t/+e1/96t/961/96t/+e1/96t/961/961/961/961/961/961 /961/961/961/961/961/961/961/961/961/961/961/961/961/961/961 /961/961/961/961/961/961/961/961/961/961/961/961/961/961/961 /961/961/961/961/961/96t/+e1/96t/961/96t/+e1/96t/961/961/961 /961/+e9/961/+e9/961/+e9/961/+e9/961/+e1/961/+e1/961/961/961 /+e1/961/+e1/961/+e9/961/+e1/961/9619961/+e9/+fG/+/O/+fG/+fG /+e9/+fG/+e9/+fG/+e9/+fG/969/+e9/+e9/+fG/969/+fG/+e9/+fG/969 /+fG/+e9/+fG/969/+fG/+e9/+fG/+e9/+fG/+fG/+fG/969/+fG/+fG/+/O /+fG/+fG/961/+e9/961/+e9/961/+e9/961/969/961/+e9/961/+e1/961 /+e1/961/961/961/+e9/961/+e1/961/+e9/961/+e1/961/+e9/961/+e1 /961/+e9/961/+e1/961/969/961/961/961/969/961/961/961/969/961 /961/961/961/961/961/961/961/961/961/961/961/961/9619961/961 996t/9619961/961996t/961/96t/961996t/961/96t/961996t/961/96t /961/96t/961/96t/961/96t/961/96t/961/96t/961/96t/961/96t/961 /96t/961/96t/961/96t/961/96t/9619961/961996t/961/961/+e9/961 /961/961/961/961/961/961/961/961/961/961/+e1/961/961/961/+e9 /961/+e1/961/969/961/961/961/969/961/961/961/+e9/961/969/961 /+e9/961/969/961/969/961/961/961/969/961/961/961/961/961/961 /961/961/961/961/961/961/961/961/961/961/961/961/961/9619961 /961/961/961996t/961/961/9619961/961/961/9619961/961996t/961 996t/961996t/961996t/961/961/9619961/961/961/961996t/961/96t /961/96t/96t/96t/961996t/96t/96t/96199at/96199at/96199at/961 99at/96199at/96199at/96199at/96199at/96t99at/96t99at/96t99at /96t99at/96t99at/96t99at/96t99at/96t99at/96t99at/96t99at/96t 99at/96t99at/96t99at/96t99at/96t99at/96t99at/96t99at/96t99at /96t99at/96t99at/96t99at/96t99at/96t99at/96t99at/96t99at/96t 99at/96t99at/96t99at/96t99at/96t99at/96t99at/96t99at/96199at /96199at/96199at/96199at/96199at/96199at/96199at/96199at/961 99at/96199at/96199at/96199at/96199at/96199at/96199at/96199at /96199at/96199at/96199at/96199at/96199at/96199at/96199at/961 99at/96t99at/96t99at/96t99at/96t/96t/96199at/961/96t/96199at /96199at/96199at/96t99at/96199at/96t99at/96199at/96t99at/961 99at/96t99atAP/etf/etf/etf/etf/etf/etf/etf/etf/etf/erf/etffe rf/etf/erf/etfferf/etf/etf/etffetf/etf/etf/etffetf/etf/etf/e tffetf/etf/etf/etffetf/etf/etf/etffetf/etf/etf/etffetf/etf/e tf/etffetf/etf/etf/etffetf/etf/etf/etffetf/etf/etf/etffetf/e tf/etf/etffetf/etf/etf/etffetf/etf/etf/etf/etf/etf/etf/etf/e tf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etffetf/etf/etf/e tffetf/etf/etf/etffetf/etf/etf/etffetf/etf/erf/etf/erf/etf/e rf/etf/erf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/e tf/etf/etf/etf/ntf/etf/ntf/etf/ntf/etf/ntf/etf/etf/etf/etf/e tf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/e tf/etf/etf/etf/etf/etf/ntf/etf/etf/etf/ntf/etf/etf/etf/ntf/e rf/etf/erf/ntf/erf/etf/erf/etf/etf/etf/etf/etf/etf/etf/etf/e tf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/e tf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/e tf/etf/ntf/erf/etf/erf/ntf/erf/etf/erf/nvf/nvf/nvf/nvf/nvf/n tf/ntf/etf/nvf/etf/ntf/etf/nvf/etf/nvf/etf/ntf/etf/ntf/etf/n vf/etf/ntf/etf/nvf/etf/etf/etf/nxv/nxv/vzv/nzv/vxv/nxv/nxv/n vf/nxv/nvf/nxv/evf/nxv/nvf/nxv/evf/nxv/nvf/nxv/evf/nxv/nvf/n xv/evf/nxv/nvf/nxv/nvf/vxv/nxv/nxv/evf/nxv/nxv/vzv/vzv/nvf/e vf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/ntf/etf/n vf/etf/ntf/etf/nvf/etf/ntf/etf/nvf/etf/ntf/etf/nvf/etf/ntf/e tf/evf/etf/etf/etf/nvf/etf/nvf/etf/nvf/etf/nvf/etf/evf/etf/e tf/etf/ntf/etf/etf/etf/ntf/etf/etf/etf/etffetf/etfferf/etffe tf/etfferf/etf/erf/etfferf/etf/erf/etfferf/etf/erf/etf/erf/e tf/erf/etf/erf/etf/erf/etf/erf/etf/erf/etf/erf/etf/erf/etf/e rf/etf/erf/etf/erf/etfferf/etf/etf/nvf/etf/etffetf/ntf/etf/e tf/etf/ntf/etf/etf/etf/ntf/etf/ntf/etf/nvf/etf/ntf/etf/evf/e tf/etf/etf/evf/etf/etf/etf/nvf/etf/evf/etf/nvf/etf/evf/etf/e vf/etf/etf/etf/evf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/e tf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etf/etffetf/etf/etf/e tfferf/etf/etf/etffetf/etf/etf/etffetf/etfferf/etfferf/etffe rf/etfferf/etf/etf/etffetf/etf/etf/etfferf/etf/erf/etf/erf/e tf/erf/erfferf/etf/erf/etffWrf/etffWrf/etffWrf/etf/erf/etffW rf/etf/erf/etffWrf/etffWrf/erffWrf/etffWrf/erffWrf/erffWrf/e rffWrf/erffWrf/erffWrf/etffWrf/erffWrf/etffWrf/erffWrf/erffW rf/erffWrf/erffWrf/erffWrf/etffWrf/erffWrf/etffWrf/erffWrf/e tffWrf/erffWrf/etffWrf/erffWrf/etffWrf/erffWrf/etffWrf/erffW rf/etffWrf/erffWrf/etffWrf/erffWrf/etffWrf/etffWrf/etffWrf/e tffWrf/etffWrf/etffWrf/etffWrf/etffWrf/etffWrf/etffWrf/etffW rf/etffWrf/etf/erf/etffWrf/etf/erf/etffWrf/etf/erf/etffWrf/e tf/erf/etffWrf/etffWrf/etffWrf/etffWrf/etffWrf/etffWrf/erffW rf/etffWrf/erffWrf/etf/erf/etffWrf/etf/erf/etffWrf/etf/erf/e tffWrf/etf/erf/etffWrf/etf/erf/etffWrf/etf/erf/etffWrf/erQD3 1q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/ 3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q33 1q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/ 3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q3/1q3/3q3/1q3/3q3/ 1q3/3q3/1q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q333q3/ 3q331q3/3q333q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q33 1q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/ 3rX31q3/3rX31q3/3rX31q3/3rX31q3/3rX31q3/3rX31q3/3rX31q3/3rX3 1q3/3rX31q3/3rX31q3/3rX31q3/3rX31q333rX31q3/3rX31q333rX31q3/ 3rX31q333rX31q3/3rX31q333rX31q3/3rX31q333rX31q3/3rX31q333rX3 1q3/3rX31q333rX31q3/3rX31q333rX31q3/3rX31q3/3rX31q3/3rX31q3/ 3rX31q3/3rX31q3/3rX31q3/3rX31q3/3rX31q3/3rX31q3/3q331q3/3rX3 1q3/3q331q3/3rX31q3/3q333q3/3q331q3/3q333q3/3q3/1q3/3q3/1q3/ 3rX/1q3/3rX/1q3/3rX/1q3/3rX/1q3/3rX/1q3/3rX/1q3/3rX31q3/3rX3 1rX/3rX/3rX/3rX/3rX/573/3rX/3rX/3rX/3rX/3rX/3rX/3rX/3rX31rX/ 3rX33rX/3rX31rX/3rX33rX/3rX33rX/3rX/3rX/3rX33rX/3rX/3rX/3rX3 3rX/3rX/3rX/3rX31q3/3rX/573/78b/3sb/58b/3sb/58b/3r3/573/3rX/ 573/3rX/3r3/3r3/573/3r3/573/3r3/573/3r3/573/3r3/573/3r3/573/ 3r3/573/3r3/573/3r3/573/3r3/573/573/58b/587/58b/3r3/3r331rX/ 3rX/3rX/3rX/3rX/57X/3rX/57333rX/3rX33rX/3rX33rX/3rX/3rX/3rX3 3rX/3rX/3rX/3rX31rX/3rX33rX/3rX31rX/3rX33rX/3rX33q3/3rX33q3/ 3rX33q3/3rX33q3/3rX31q3/3rX33q3/3rX31q3/3rX33q3/3rX33q3/3rX3 3q3/3rX33q3/3rX33q3/3rX33q3/3rX33q3/3rX31q3/3q333q3/3rX31q3/ 3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q33 1q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/ 3q331q333rX31q3/3rX31q3/3rX/3rX/3rX33q3/3rX33q3/3rX33q3/3rX3 3q3/3rX/1rX/3rX/3rX/3rX/1rX/3rX/3rX/3rX/1rX/3rX/3rX/3rX/1rX/ 3rX/3rX/3rX/1rX/3rX/3rX/3rX/1rX/3rX/3rX/3rX33q3/3rX33q3/3rX3 3q3/3rX33q3/3rX31q3/3q333q3/3rX31q3/3q333q3/3rX31q3/3rX31q3/ 3rX31q3/3rX31q3/3rX31q3/3q331q3/3q331q3/3q331q3/3q331q3/3q33 1q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/3q331q3/ 3rX31q3/3rX31q3/3rX31q3/3rX31q331q331q3/3q331q331q331q3/3q33 1q3/1q3/1q3/3rX31q3/1q3/1q3/3rX31q331q331q331q331q331q331q33 1q331q331q331q331q331q331q331q331q331q3/1q331q3/1q331q3/1q33 1q3/1q331q331q331q331q331q331q331q331q331q331q331q331q331q33 1q331q331q331q331q331q331q331q331q331q331q331q331q331q331q33 1q331q331q331q331q331q331q331q331q331q331q331q331q331q331q33 1q331q331q331q331q331q331q331q331q331q331q331q331q331q331q33 1q3/3q331q331q331q3/3q331q331q331q3/3q331q331q331q3/3q331q3/ 1q331q3/1q331q3/1q331q3/1q331q3/1q331q3/1q331q3/1q331q3/1q33 1q331q331q3/3q331q331q331q3/3q331q3/1q331q3/1q331q3/1q331q3/ 1q331q3/1q331q3/1q331q3/1q331q3/1q331q3/1q331q3/1q331q3/1q33 1q3/1q331q331q331q3/3q331q331q331q3/3q331q0A/96t99at/96t996t /96t99at/96t996t/96t99at/96t996t/96t99at/96t996t/96t99at/96t 996t/96t99at/96t996t/96t99at/96t99at/96t99at/96t996t/96t99at /96t99at/96t99at/96t99at/96t99at/96t99at/96t99at/96t99at/96t 99at/96t996t/96t99at/96t996t/96t/9at/96t/9at/96t/9at/96t/9at /96t99at/96t99at/96t99at/96t99at/96t99at/96t996t/96t99at/96t 996t/96t99at/96t99at/96t99at/96t99at/96t99at/96t996t/96t99at /96t996t/96t99at/96t996t/96t99at/96t996t/96199at/96199at/961 99at/96199at/96199at/961/96t/96199at/961/96t/96199at/961/96t /96199at/961/96t/96199at/96199at/96199at/96199at/96199at/961 99at/96199at/96199at/96199at/96199at/96199at/96199at/96199at /96199at/96199at/96199at/96199at/961/96t/96199at/961/96t/961 99at/961/96t/96199at/961/96t/96199at/96199at/96199at/96199at /96t996t/961/96t/96t996t/961/96t/96t/9at/961/96t/961/9at/961 /9at/961/9at/961/9at/961/9at/961/9at/961/961/961/961/961/961 /969/961/961/961/961/961/961/961/961/961/961/961/961/961/961 /961/961/961/961/961/961/961/961/961/961/961/961/961/+e9/961 /961/961/+e9/+e9/+fO/+fG/+fG/969/+e9/+e9/+e9/+e1/+e9/969/+e9 /969/+e9/969/+e9/969/+e9/969/+e9/969/+e9/969/+e9/969/969/969 /+e9/969/+e9/969/+fG/+e9/+fG/+fG/+fG/+e9/96999a1/961/961/961 /961/+e9/961/961/961/961/961/961/961/961/961/961/961/961/961 /961/961/961/961/961/961/961/961/961/96t/961/96t/961/96t/961 /96t/961/96t/961/961/961/96t/961/961/961/96t/961/96t/961/96t /961/96t/961/96t/961/96t/96199at/96199at/96t99at/96t996t/96t 99at/96t996t/96t99at/96t996t/96t99at/96t996t/96t99at/96t996t /96t99at/96t996t/96t99at/96t996t/96t99at/96t996t/96199at/961 /96t/961/961/961/961/961/96t/961/96t/961/96t/961/96t/961/9a1 /961/961/961/9a1/961/961/961/961/961/961/961/961/961/961/961 /961/961/961/961/961/961/961/961/96t/961/96t/961/96t/961/96t /96199at/961/96t/96199at/961/96t/96199at/961/96t/96199at/961 /96t/96t99at/96t996t/96t99at/96t996t/96t99at/96t996t/96t99at /96t996t/96t99at/96t996t/96t99at/96t996t/96199at/96199at/961 99at/96199at/96199at/96199at/96199at/96199at/9at99at/961/9at /9at99at/961/9at99at99at/96t99at99at99at99at99at99at99at99at 99at99at99at99at99at/9at99at/9at99at/9at99at/9at99at99at99at 99at99at99at99at99at99at99at99at99at99at99at99at99at99at99at 99at99at99at99at99at99at99at99at99at99at99at99at99at99at99at 99at99at99at99at99at99at99at99at99at99at99at99at99at99at99at 99at99at99at99at99at99at99at99at99at99at99at/96t99at99at99at /96t99at99at99at/96t99at99at99at/96t99at/9at99at/9at99at/9at 99at/9at99at/9at99at/9at99at/9at99at/9at99at99at99at/96t99at 99at99at/96t99at/9at99at/9at99at/9at99at/9at99at/9at99at/9at 99at/9at99at/9at99at/9at99at/9at99at/9at99at/9at99at99at99at /96t99at99at99at/96t99at/9atAPfWrf/erffWrf/WrffWrf/erffWrf/W rffWrf/erffWrf/WrffWrf/erffWrf/WrffWrf/erffWrf/WrffWrf/erffW rf/WrffWrf/WrffWpffWrffWpf/WrffWpf/WrffWpf/WrffWpffWrffWpf/W rffWpffWrffWpf/WrffWpffWrffWpf/WrffWpffWrffWrf/erffWrf/WrffW rf/erffWrf/WrffWrf/WrffWpf/WrffWrf/WrffWpf/WrffWpf/WrffWpffW rffWpf/WrffWpffWrffWrf/WrffWpf/WrffWrf/WrffWpf/WrffWpf/WrffW pffWrffWpf/WrffWpffWrffWrf/erffWrf/WrffWrf/erffWrf/WrffWrf/e rffWrf/WrffWrf/erffWrf/WrffWrffWrffWrffWrffWrffWrffWrffWrffW rf/erffWrffWrffWrf/erffWrffWrffWrf/erffWrffWrffWrf/erffWrffW rffWrf/erffWrffWrffWrf/erffWrffWrffWrf/erffWrffWrffWrf/erffW rffWrffWrf/erffWrffWrffWrf/erffWrffWrffWrf/erffWrffWrffWrf/e rffWrffWrffWrf/WrffWrf/WrffWrf/WrffWrf/WrffWrf/WrffWrf/WrffW rf/WrffWrf/WrffWrf/WrffWrf/WrffWrf/WrffWrf/WrffWrf/erffWrf/W rffWrf/erffWrf/WrffWrf/erffWrf/WrffWrf/WrffWrf/WrffWrf/WrffW rf/WrffWrf/Wrf/Wrf/etf/etf/etffWrf/etffWrf/etffWrf/etf/Wrf/e tffWrf/WtffWrf/WtffWrf/WrffWrf/etffWrf/etffWrf/etffWrf/etffW rf/etffWrf/etffWrf/etffWrf/etffWrf/etf/Wtf/etffWrf/etffWrf/e tf/evf/nxv/evf/nvf/evf/evf/etf/evf/etf/evf/etf/evf/etf/evf/e tf/evf/etf/evf/etf/evf/etf/evf/etf/evf/etf/evffWtf/evf/etf/e vf/etf/evf/evf/nvf/evf/nxv/evf/evffWrffetffWrf/etffWrf/etffW rf/etffWrf/etffWrf/etffWrf/etffWrf/etffWrf/etffWrf/etffWrf/e tffWrf/etffWrf/etffWrf/etffWrf/erffWrf/etffWrf/erffWrf/etffW rf/erffWrf/etffWrf/erffWrf/erffWrffWrffWrf/erffWrffWrffWrf/e tffWrffWrffWrf/erffWrffWrffWrf/WrffWpf/WrffWrf/WrffWpf/WrffW rf/WrffWpf/WrffWrf/WrffWpf/WrffWrf/erffWrf/WrffWrf/erffWrf/W rffWrf/erffWrf/WrffWrf/erffWrf/WrffWrffWrffWrffWrffWrf/etffW rf/etffWrf/etffWrf/erffWrf/etffWrf/erffWrf/WtffWrf/WtffWrf/W tffWrf/Wtf/Wrf/etffWrf/Wtf/Wrf/etffWrf/Wtf/Wrf/etffWrf/Wtf/W rf/etffWrf/WtffWrf/etffWrf/erffWrf/etffWrf/erffWrf/erffWrffW rffWrf/erffWrffWrffWrf/etffWrf/erffWrf/etffWrf/erffWrf/erffW rf/WrffWrf/erffWrf/WrffWrf/erffWrf/WrffWrf/erffWrf/WrffWrf/e rffWrf/WrffWrf/erffWrf/WrffWrf/WrffWrf/WrffWrf/WrffWrf/WrffW rf/WrffWrffWrffWrf/WrffWrffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpQD/3q331q3/1q331q3/3q331q3/1q331q3/3q331q3/1q33 1q3/3q331q3/1q331q3/3q331q3/1q331q3/3q331q3/1q331q3/3q331q3/ 1q331qX/1q331q3/1q331q3/1q331qX31q331qX/1q331qX31q331qX/1q33 1qX31q331qX/1q331qX31q331qX/3q331q3/1q331q3/3q331q3/1q331q3/ 1q331q3/1q331qX/1q331q3/1q331qX/1q331qX31q331qX/1q331qX31q33 1qX/1q331q3/1q331qX/1q331q3/1q331qX/1q331qX31q331qX/1q331qX3 1q331qX/3q331q3/1q331q3/3q331q3/1q331q3/3q331q3/1q331q3/3q33 1q3/1q331q331q331q331q331q331q331q331q331q3/3q331q331q331q3/ 3q331q331q331q3/3q331q331q331q3/3q331q331q331q3/3rX31q3/3q33 1q3/3rX31q3/3q331q3/3rX31q3/3q331q3/3rX31q3/3q331q3/3rX31q3/ 3q331q3/3rX31q3/3q331q3/3rX31q3/3q331q3/3rX31q3/3q331q3/1q33 1q3/1q331q3/1q331q3/1q331q3/1q331q3/1q331q3/1q331q3/1q331q3/ 1q331q3/1q331q3/1q331q3/1q331q3/3q331q3/1q331q3/3q331q3/1q33 1q3/3q331q3/1q331q3/1q331q3/1q331q3/1q331q3/1q331q3/1rX/1rX/ 3rX/1rX/3rX/3rX/3rX31q3/3rX31q3/3rX31q3/3rX/1q3/1rX31q3/1rX3 1q3/1rX31q3/3rX31q3/3rX31q3/3rX31q3/3rX31q3/3rX31q3/3rX31q3/ 3rX31q3/3rX31q3/3rX31q3/3rX31q3/3rX31q3/1rX31q3/1rX/3rX/58b/ 58b/58b/3r3/3r3/3rX/3r3/3r3/3r3/3rX/3r3/3rX/3r3/3rX/3r3/3rX/ 3r3/3rX/3r3/3rX/3r3/3rX/3r3/1rX/3r3/1rX/3r3/3rX/3r3/3rX/3r3/ 3r3/3r3/3r3/58b/573/3r331rX/3rX31q331q331q3/3rX/1rX/3rX31q3/ 3rX31q3/3rX31q3/3rX31q3/3rX31q3/3rX31q3/3rX31q3/3rX31q3/3rX3 1q3/3rX31q3/3q331q3/3rX31q3/3q331q3/3rX31q3/3q331q3/3rX31q3/ 3q331q3/3q331q331q331q3/3q331q331q331q3/3rX31q331q331q3/3q33 1q331q331q3/3q331q3/1q331q3/3q331q3/1q331q3/1q331q3/1q331qX/ 1q331q3/1q331qX/3q331q3/1q331q3/3q331q3/1q331q3/3q331q3/1q33 1q3/3q331q3/1q331q331q331q331q331q3/3q331q3/3rX31q3/3rX31q3/ 3q331q3/3rX31q3/3q331q3/1rX31q3/1rX31q3/1rX31q3/1rX31q3/3rX/ 1q3/1rX31q3/3rX/1q3/1rX31q3/3rX/1q3/1rX31q3/3rX/1q3/1rX31q3/ 3rX31q3/3q331q3/3rX31q3/3q331q3/3q331q331q331q3/3q331q331q33 1q3/3rX31q3/3q331q3/3rX31q3/3q331q3/3q331q3/1q331q3/3q331q3/ 1q331q3/3q331q3/1q331q3/3q331q3/1q331q3/3q331q3/1q331q3/3q33 1q3/1q331q3/1q331q3/1q331q3/1q331q3/1q331q3/1q331q331q331q3/ 1q331q331q331q3/1q331q331q33zqX/1q331q331q33zqX31q331q331q33 zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX3 1q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33 zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX3 1q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33 zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX3 1q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q331q331q33zqX31q33 1q331q33zqX/1q331q331q33zqX/1q331q331q33zqX/1q331q331q33zqX/ 1q331q331q33zqX31q331q331q33zqX31q331q331q33zqX/1q331q331q33 zqX/1q331q331q33zqX/1q331q331q33zqX/1q331q331q33zqX/1q331q33 1q33zqX/1q331q331q33zqX31q331q331q33zqX31q331q331q33zqX31q0A 986l99at986l99at986l99at986l99at986l99at986l99at986l99at986l 99at986l99at986l99at986l99at986l99at986l99at986l99at986l99at 986l99at986l99at986l99at986l99at986l99at986l99at986l99at986l 99at986l99at986l99at986l99at986l99at986l99at986l99at986l99at 986l99at986l99at986l99at986l99at986l99at986l99at986l99at986l 99at986l99at986l99at986l99at986l99at986l99at986l99at986l99at 986l99at986l99at986l99at986l99at986l99at986l99at986l99at986l 99at986l99at986l99at986l99at986l99at986l99at986l99at986l99at 986l99at986l99at986l99at986l99at986l99at99at99at986l99at99at 99at986l99at99at99at986l99at99at99at986l99at99at99at986l99at 99at99at986l99at99at99at986l99at99at99at986l99at986l99at986l 99at986l99at986l99at986l99at986l99at986l99at986l99at986l99at 986l99at986l99at986l99at986l99at986l99at986l99at99al99at99at /9at986l99at986t99at986t/9at99at/9a1/9at/9a1/9at/96199at/9at 99at/9at99at99at99at/9at99at/9at99at/9at986t/9at99at/9at986t 99at99at/9at986t99at99at/9at986t99at99at/9at986t99at99at/9at 99at/9at99at/9at99at/9at99at/9at786l99a1/961/+fG/969/969/961 /961/9a1/961/9a1/96999a1/961/9a1/961/9a1/961/9a1/969/9a1/961 /9a1/96999a1/961/9a1/96199a1/961/9a1/969/961/96199a1/969/969 /+e9/969/96999at/9at986t99at99at/9at99at/9at986t99at99at/9at 986t99at99at/9at986t99at99at/9at986t99at99at/9at986t99at986t 99at986t99at986t99at986l99at99at99at986l99at99at99at986t99at 986t99at986t99at986t99at986t99at986t99at986l99at986t99at986l 99at986l99at986l99at986l99at986l99at986l99at986l99at986l99at 986l99at986l99at986l99at986l99at986l99at986l99at986l99at986l 99at986l99at986l99at986l99at99at/9at986t99at986t99at986t99at 986t99at986t99at986t/9at986t99at986t/9at986t/9at99at/9at986t /9at99at/9at986t/9at99at/9at986t/9at99at/9at986t99at986t99at 986t99at986t99at986l99at986t99at986l99at986t99at986l99at99at 99at986l99at99at99at986l99at986l99at986l99at986l99at986l99at 986l99at986l99at986l99at986l99at986l99at986l99at986l99at986l 99at986l99at986l99at986l99at986l99at986l99at986l99at986l99at 986l99at986l99at986l99at986l99at986l99at986l99at986l986l986l 99at986l99at986l99at986l99at986l99at786l986l986l99at786l986l 986l99at986l99at986l99at986l99at986l99at986l99at986l99at986l 99at986l99at786l986l986l99at786l986l986l99at986l99at986l99at 986l99at986l99at986l99at986l99at986l99at986l99at986l99at986l 99at986l99at986l99at986l99at986l99at986l99at986l99at986l99at 986l99at986l99at986l99at986l99at986l99at986l99at986l99at986l 99at986l99at986l99at986l99at986l99at986l99at986l99at986l99at 986l99at986l99at986l99at986l99at986l99at986l99at986l99at986l 99at986l99at986l99at986l99at986l99at986l99at986l99at986l99at 986l99at986l99at986l99at986l99at986l99at986lAPfWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpf/WrffWrffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffWrffWrffOpffWrffWrffWrffOpffWrffW rffWrffOpffWrffWrffWrffOpffWrffWrffWrffOpffWrffWrffWrffOpffW rffWrffWrffOpffWrffWrffWrffOpffWrffWrffWrffOpffWrffWrffWrffO pffWrffWrffWrffOpffWrffWrffWrffOpf/WrffWrffWrffOpf/WrffWrffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpf/WrffWrffWrffOpf/WrffW rffWrffOpf/WrffWrffWrffOpf/WrffWrffWrffOpf/WrffWrf/WrffOrf/W tffWrf/Wtf/Wtf/etf/Wtf/WtffWrf/WtffOrffWrffOrf/WrffWrf/WrffW rf/WrffWrf/WrffWrf/WrffWrf/WrffOrf/WrffWrffWrffOrf/WrffWrffW rffOrf/WrffWrf/WrffWrf/WrffWrf/WrffWrf/WrffWrf/WrffWrf/WrffW rf/WrffWrf/WtffWrffWrffOrffWrffWtf/evf/evf/nxv/Wvf/evf/Wtf/e vf/Wtf/evf/Wtf/evf/Wtf/evf/Wtf/evf/Wtf/evf/Wtf/evf/Wtf/etf/W tf/evf/Wtf/etf/Wtf/evf/Wtf/etf/etf/evf/Wtf/evf/etf/nxv/exv/e tf/Wtf/WtffWrf/WtffWrf/WtffWrf/WrffWrf/WrffWrf/WrffWrf/WrffW rffWrffOrf/WrffWrffWrffOrf/WrffWrffWrffOrffWrffOrffWrffOrffW rffOrffWrffOpffWrffWrffWrffOpffWrffWrf/WrffWrf/WrffWrf/WrffW rf/WrffWrffWrffOrffWrffOrffWrffOpffWrffOrffWrffOpf/WrffWrffW rffOpf/WrffWrffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffWrffWrffOrffWrffOrffWrffOrffWrffOrffWrffO rf/WrffOrffWrffOrf/WrffOrf/WrffOrf/WrffWrf/WrffOrf/WrffWrf/W rffOrf/WrffWrf/WrffOrf/WrffWrffWrffOrffWrffOrffWrffOrffWrffO rffWrffOrffWrffOrffWrffOrffWrffOrffWrffOpffWrffWrffWrffOpffW rffWrffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffW rffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffOpffWrffO pffWrffOpffWrffOpffWrffOpffWrQD3zqX3zq33zqX3zqX3zqX3zq33zqX3 zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33 zqX3zqX3zqX31q33zqX3zqX3zqX3zq33zqX3zq33zqX3zq33zqX3zqX3zqX3 zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3 zqX3zq33zqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqX3zqX3zq33zqX3 zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33 zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3 zq33zqX3zqX3zqX3zq33zqX3zqX3zqX31q3vzqX3zqX3zqX31q3vzqX3zqX3 zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX3 1q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33 zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX3 1q33zqX31q33zqX31q33zqX3zq33zqX31q33zqX3zq33zqX3zqX3zqX3zqX3 zqX3zqX3zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX31q33zqX3 zq33zqX31q33zqX3zq33zqX31q33zqX31q33zq3/1q33zq3/1q331q3/1rX3 zq331q33zq331q33zqX3zq33zqX31q33zqX31q33zqX31q33zqX3zq33zq3/ 1q33zqX31q33zqX/1q33zqX3zq33zqX31q33zqX31q33zqX31q33zqX31q33 zq331q33zqX31q33zq331q33zqX31q33zq331q33zqX31q33zq331q33zq33 1q331q331q3vzqX3zq331q3/3r3/3r3/3r3/1rX/3r3/1rX/1rX/1rX/1rX3 1rX/1rX31rX/1rX31q3/1rX31rX/1rX31q3/1rX31rX/1rX31q3/1rX31rX/ 1rX31q3/1rX31q3/3rX/1q3/3rX31q3/1rX/1rX/3r3/1rX/3rX/1q3/1rX3 zq331q33zq331q33zq331q33zqX31q33zq331q33zqX31q33zqX31q33zqX3 1q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33 zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX3 1q33zqX3zq33zqX31q3vzqX3zq33zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3 zqX31q33zqX3zq33zqX31q33zqX3zq33zqX3zq33zqX3zqX3zqX3zq33zqX3 zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX31q3vzqX3zqX3zqX31q33 zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX31q33zqX3zq33zqX3 1q33zqX3zq33zqX/1q33zqX31q33zqX/1q33zqX31q33zqX/1q33zqX31q33 zqX/1q33zqX31q33zqX31q33zqX3zq33zqX31q33zqX3zq33zqX31q33zqX3 zq33zqX31q33zqX3zq33zqX31q33zqX31q33zqX31q33zqX31q33zqX3zq33 zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3 zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3 zqX3zqXvzqX3zqX3zqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3 zqX3zqX3zqXvzqX3zqX3zqX3zqXvxqX3zqX3zqX3zqXvzqX3zqX3zqX3zqXv zqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqX3zqX3zqXvzqX3zqX3zqX3 zqXvzqX3zqX3zqX3zqXvzqX3zqX3zqX3zqXvzqX3zqXvzqX3zqXvxqX3zqXv zqX3zqXvxqX3zqX3zqX3zqXvzqX3zqX3zqX3zqXvzqX3zqX3zqX3zqXvzqX3 zqX3zqX3zqXvzqX3zqX3zqX3zqXvzqX3zqX3zqX3zqXvzqX3zqX3zqX3zqXv zqX3zqX3zqX3zqXvzqX3zqXvzqX3zqXvxqX3zqXvzqX3zqXvxqX3zqX3zqX3 zqXvzqX3zqX3zqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXv zqX3zqXvzqX3zqXvzqX3zqXvzqX3zqX3zqX3zqXvzqX3zqX3zqX3zqXvzqX3 zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXv zqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqX3zqX3zqXvzqX3zqX3zqX3 zqXvzqX3zqXvzqUA99at986l986t986l99at986l986t986l99at986l986t 986l99at986l986t986l99at986l986t986l99at986l986t986l/9at986t 99at986l/9at986l/9at986l/9at986l99at986l/9at986l99at986l/9at 986l99at986l/9at986l99at986l99at986l986t986l99at986l986t986l 99at986l986t986l99at986l986t986l/9at986l99at986l/9at986l99at 986l/9at986l99at986l/9at986l99at986l/9at986l99at986l/9at986l 99at986l99at986l986t986l99at986l986t986l99at986l986t986l99at 986l986t986l99at986l99at986l99at986l99at986l99at986l99at986l 99at986l99at986l99at986l99at986l99at986l99at986l99at986l99at 986l99at986l99at986l99at986l99at986l99at986l99at986l99at986l 99at986l99at986l99at986l99at986l99at986l99at986l99at986l/9at 986l/9at986l/9at986l/9at986l986t986l986l986l986t986l986l986l /9at986l99at986l/9at986l99at986l/9at986t/9at986l/9at986t/9at 986l99at986l99at986t/9a199at/9a199at99at986t986t986l986t986t 99at986t/9at986t99at986l99at986l99at986l/9at986t/9at986l/9at 986l99at986l99at986t99at986l99at986t99at986l/9at99at/9at986t /9at99at/9at986t99at986t/9at986t/9at986t99at986t99at99at/9at 986t99at9861/969/97G/969/9a1/969/9a1/969/9a1/9a1/9a1/9a1/9a1 /9a199a1/9a1/9a1/9a199a1/9a1/9a1/9a199a1/9a199a1/9a199at/961 /9at/9a199at/961/9a1/9a199a1/969/961/961/9at/9a1986t99at986t /9at99at/9at986t/9at99at/9at986t/9at986t99at986t/9at986t99at 986t99at986t99at986l99at986t99at986l99at986l99at986l99at986l 99at986l99at986l99at986l99at986l99at986l99at986t99at986l99at 986l99at986l/9at986l99at986l/9at986l99at986l/9at986t/9at986l /9at986t/9at986l99at986l986t986l99at986l986t986l99at986l986t 986l99at986l986t986l99at986l99at986l99at986l99at986l99at986t 99at986l99at986t99at986l/9at986t/9at986l/9at986t/9at986l/9at 986t/9at986t/9at986t/9at986t/9at986t/9at986t/9at986t/9at986t 99at986t99at986l99at986t99at986l99at986t99at986l99at986t99at 986l99at986l99at986l99at986l99at986l99at986l986t986l99at986l 986t986l99at986l986t986l99at986l986t986l99at986l986t986l99at 986l986t986l99at986l986t986l99at986l986t986l986t986l986l986l 986t986l986l986l986l786l986l786l986l786l986l786l986l986l986l 786l986l986l986l78al986l986l986l786l986l986l986l786l986l786l 986l786l986l786l986l786l986l986l986l786l986l986l986l786l986l 986l986l786l986l986l986l786l986l786l986l78al986l786l986l78al 986l986l986l786l986l986l986l786l986l986l986l786l986l986l986l 786l986l986l986l786l986l986l986l786l986l986l986l786l986l986l 986l786l986l786l986l78al986l786l986l78al986l986l986l986l986l 986l986l986l986l786l986l786l986l786l986l786l986l786l986l786l 986l786l986l786l986l986l986l986l986l986l986l986l986l786l986l 786l986l786l986l786l986l786l986l786l986l786l986l786l986l786l 986l786l986l786l986l786l986l986l986l986l986l986l986l986l986l APfOpffOpffOpffOrffOpffOpffOpffOrffOpffOpffOpffOrffOpffOpffO pffOrffOpffOpffOpffOrffOpffOpffOpffOre/OpffOpe/OpffOpe/OpffO pe/OpffOpffOpffOpffOpffOrffOpffOpffOpffOre/OpffOpe/OpffOpe/O pffOpe/OpffOpffOpffOpffOpffOrffOpffOpffOpffOrffOpffOpffOpffO rffOpffOpffOpffOre/OpffOpffOpffOpe/OpffOpffOpffOpffOpffOpffO pffOrffOpffOpffOpffOrffOpffOpffOpffOrffOpffOpffOpffOre/OpffO pffOpffOpe/OpffOpffOpffOpffOpffOpffOpffOrffOpffOpffOpffOre/G pffOpe/OpffOpe/GpffOpe/OpffOpe/OpffOpe/OpffOpe/OpffOpe/OpffO pe/OpffOpe/OpffOpe/OpffOpe/OpffOpe/GpffOre/OpffOre/GpffOre/O pffOre/GpffOre/OpffOre/GpffOre/OpffOre/GpffOre/OpffOre/GpffO re/OpffOre/OpffOpe/OpffOpe/OpffOpe/OpffOpe/OpffOpe/OpffOre/O pffOpe/OpffOre/OpffOre/OpffOre/OpffOre/OpffOre/GpffOre/GpffO re/GpffOre/OpffOre/GpffOre/OpffOre/OpffOre/OpffOrffOrffOrffO rffOre/OpffOrffOrffOre/OpffOpe/OpffOre/OpffOpe/OpffOre/OpffO re/OpffOre/OpffOre/OpffOre/GpffOre/OpffOre/GpffOre/OpffOrffO rffOrffOrffOrffOrffOrffOrffOre/OpffOre/OpffOre/OpffOre/OpffO rffOrffOrffOrffWrffOrffOrffOrffWre/OrffOrffOrffWrffOrffWrffO rffWrf/nxv/evffWtf/WtffWtffWtffWtf/WvffOrf/WtffWrf/WtffOrf/W tffOrf/WtffOrf/WtffOrf/WtffOrf/WtffOrf/WtffOrf/WtffOrf/WtffO rf/WtffOrf/WtffOrf/Wtf/Wtf/evf/Wtf/WtffOrffOrffOrffOre/OpffO rffOrffOrffOpffOre/OpffOre/OpffOre/OpffOre/OpffOrffOpffOrffO pffOre/OpffOpe/OpffOre/OpffOpe/OpffOpe/OpffOpe/OpffOpe/OpffO re/OpffOre/OpffOre/OpffOre/OpffOpe/OpffOpe/OpffOpe/OpffOpe/O pffOre/OpffOre/GpffOre/OpffOre/Gpe/Ope/GpffOpe/Gpe/Ope/GpffO pffOpffOpffOpffOrffOpffOpffOpffOrffOpffOpffOpffOrffOpffOpffO pffOre/OpffOpe/OpffOpe/OpffOpe/OpffOpe/OpffOrffOpffOre/OpffO re/OpffOre/OpffOre/OpffOre/OpffOre/OpffOre/OpffOre/OpffOre/O pffOre/OpffOre/OpffOre/OpffOre/OpffOre/OpffOre/OpffOre/OpffO re/OpffOre/OpffOre/OpffOre/OpffOre/OpffOre/OpffOre/OpffOpe/O pffOpe/OpffOpe/OpffOpe/OpffOpe/OpffOpe/OpffOpe/OpffOpffOpffO pffOpffOrffOpffOpffOpffOrffOpffOpffOpffOrffOpffOpffOpffOre/O pffOpffOpffOpe/OpffOpffOpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffO pe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/G pffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffO pe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/G pffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffO pe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/G pffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffO pe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/G pffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffO pe/GpffOpe/GpffOre/GpffOpe/GpffOre/GpffOpe/GpffOpe/GpffOpe/G pffOpe/GpffOpe/GpffOre/GpffOpe/GpffOre/GpffOpe/GpffOpe/GpffO pe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpQD3zqX3zqX3zq33 zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3 zq33zqX3zqX3zqX3zq33zqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqX3 zqX3zq33zqX3zqX3zqX3zq33zqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3 zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33 zqX3zqXvzqX3zqX3zqX3zqXvzqX3zqX3zqX3zqX3zqX3zq33zqX3zqX3zqX3 zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqXvzqX3zqX3zqX3zqXv zqX3zqX3zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqXvzqX3zqX3zqX3 zqXvzqX3zqX3zqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zq3vzqX3zq33 zqX3zq3vzqX3zq33zqX3zq3vzqX3zq3vzqX3zq3vzqX3zq3vzqX3zq3vzqX3 zq3vzqX3zq3vzqX3zq3vzqX3zq3vzqX3zq3vzqX3zq3vzqX3zq3vzqX3zqXv zqX3zq3vzqX3zqXvzqX3zq3vzqX3zqXvzqX3zq3vzqX3zqXvzqX3zq3vzqX3 zq3vzqX3zq3vzqX3zq3vzqX3zq3vzqX3zq3vxqX3zq3vzqX3zq3vzqX3zq33 zqX3zq3vzqX3zq33zqX3zq33zqX3zq33zq33zq33zq33zq33zq33zq3vzqX3 zq33zq33zq3vzqX3zq33zqX3zq3vzqX3zq33zqX3zq3vzqX3zq33zq33zq3v zqX3zq33zq33zq3vzqX3zq33zq33zq3vzqX3zq33zq33zq33zq33zq33zq33 zq33zq33zq33zq33zq33zq33zq33zq33zq33zq33zq33zq33zq33zq331q33 zq33zq33zq331q33zq33zq33zq331q33zq33zq33zq331q33zq3/1rX/3r3/ 3sb/1rX31rX31rX/1r331rX/1rX3zq3/1rX31rX/1rX3zq3/1rX3zq3/1rX3 zq3/1rX31q3/1rX3zq3/1rX31q3/1rX3zq3/1rX3zq3/1rX3zq3/1rX3zq33 1rX3zq3/1rX/1rX/1rX31rX/1rX3zq33zq33zqX31q33zq33zq3vzqX3zq33 zq33zq33zq33zq33zq33zq33zq33zq33zq331q33zqX31q33zqX3zq33zqX3 zq33zqX3zq3vzqX3zq33zqX3zq3vzqX3zq33zqX3zq3vzqX3zq33zqX3zq3v zqX3zq33zqX3zqXvzqX3zq3vzqX3zqXvzqX3zq3vzqX3zq3vzqX3zq3vzqX3 zq3vzqX3zq3vzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqX3zqX3zq33 zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqXvzqX3 zqXvzqX3zqXvzqX3zqXvzqX3zq3vzqX3zq33zqX3zq3vzqX3zq3vzqX3zq3v zqX3zq3vzqX3zq3vzqX3zq3vzqX3zq3vzqX3zq33zqX3zq3vzqX3zq33zqX3 zq3vzqX3zq33zq33zq3vzqX3zq33zq33zq3vzqX3zq33zqX3zq3vzqX3zq33 zqX3zq3vzqX3zq3vzqX3zq3vzqX3zq3vzqX3zqXvzqX3zq3vzqX3zqXvzqX3 zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqXvzqX3zqX3zqX3zq33zqX3zqX3 zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3zqX3zqX3zq33zqX3 zqX3zqX3zq33zqX3zq3vxqX3zq33zqX3zq3vxqX3zq3vxqX3zqXvxqX3zq3v xqX3zqXvxqX3zq3vxqX3zqXvxqX3zq3vxqX3zqXvxqX3zqXvxqX3zqXvxqX3 zqXvxqX3zqXvxqX3zqXvxqX3zqXvxqX3zqXvxqX3zqXvxqX3zqXvxqX3zqXv xqX3zqXvxqX3zqXvxqX3zqXvxqX3zqXvxqX3zqXvxqX3zqXvxqX3zqXvxqX3 zqXvxqX3zq3vxqX3zqXvxqX3zq3vxqX3zqXvxqX3zqXvxqX3zqXvxqX3zqXv xqX3zqXvxqX3zqXvxqX3zqXvxqX3zqXvxqX3zqXvxqX3zqXvxqX3zqXvxqX3 zqXvxqX3zqXvxqX3zq3vxqX3zqXvxqX3zq3vxqX3zqXvxqX3zqXvxqX3zqXv xqX3zqXvxqX3zqXvxqX3zq3vxqX3zqXvxqX3zq3vxqX3zqXvxqX3zq3vxqX3 zqXvxqX3zq3vxqX3zq3vxqX3zq33zqX3zq3vxqX3zq33zqX3zqXvxqX3zq3v xqX3zqXvxqX3zq3vxqX3zqXvxqX3zq3vxqX3zqXvxqX3zq3vxqX3zqXvxqX3 zq3vxqX3zqXvxqX3zq3vxqX3zqXvxqX3zq3vxqX3zqXvxqX3zq3vxqX3zqXv xqX3zq3vxqX3zqXvxqX3zq3vxqX3zq0A78al986l78ac986l78al986l78ac 986l78al986l78ac986l78al986l78ac986l78al986l78ac986l78al986l 78ac986l78ac986l78ac786l78ac986l78ac786l78al986l78ac986l78al 986l78ac986l78ac986l78ac786l78ac986l78ac786l78al986l78ac986l 78al986l78ac986l78al986l78ac986l78al986l78ac986l78ac986l78ac 786l78ac986l78ac786l78al986l78ac986l78al986l78ac986l78al986l 78ac986l78al986l78ac986l78ac986l78ac786l78ac986l78ac786l78al 986l78ac986l78al986l78ac986l78al986l78ac986l78al986l78ac986l 78ac986l78ac786l78ac986l78ac786l786l986l78al986l786l986l78al 986l78al986l78al986l78al986l78al986l78al986l78al986l78al986l 78al986l78al986l78al986l78al986l78al986l78al986l78al986l78al 986l78al986l78al986l78ac986l78al986l78ac986l78al986l78al986l 78al986l78al986l78al986l78al986l78al986l78al986l986l986t78al 986t986l986t78al986l78al986t78al986l78al986t78al98al78al986l 78al986l78al986l78al986l78al986t78al986l78al986t78al986l78al 986t78al986t78al986t78al986t78al986t78al986l78al986t78al986l 98al986t78al986t98al986t78al986t98al986t78al986t98al986t78al 986t78al986t78al986t786l986t78al986t78al/9a1/9a9/96999a1/9a1 986t986t986t99a1986t99a1986t99a1986t986t986t99at986t99at986t 99at986t99at986t986t986t986t986t986t986t986t986t986t986t/9a1 986t/9a1986t/9a178al986t786l986t78al786l78al986t98al986t78al 986t98al986t78al986t986l986l786l986l786l986l78al986l786l986l 78al986l786l986l78al986l78al986l78al986l78al986l78al986l78al 986l78al986l78al986l78al986l78al986l78al986l78al986l78al78al 78al986l78ac986l78al986l78ac986l78al986l78ac986l78al986l78ac 986l78al986l78ac986l78al986l78ac986l78ac986l78ac786l78ac986l 78ac786l78al986l78al986l78al986l78al986l78al986l78al986l78al 986l78al986l78al986l78al986l78al986l78al986l78al986t78al986l 78al986t78al986l78al986l78al986l78al986l78al986l78al986l78al 986l78al986l78al986l78al986l78ac986l78ac986l78ac786l78ac986l 78ac786l78ac986l78ac786l78al986l78ac986l78al986l78ac986l78al 986l78ac986l78al986l78ac986l78al986l78al986l78al986l78al986l 78al986l78al986l78al986l78al78al78al986l78al78al78al986l78al 78al78al986l78al78al78al78al78ac78al78al78al78ac78al78al78al 78ac78al78al78al78ac78al78al78al78ac78al78al78al78ac78al78al 78al78ac78al78al78al78ac78al78al78al78ac78al78al986l78al78al 78al986l78al78al78al78al78ac78al78al78al78ac78al78al78al78ac 78al78al78al78ac78al78al78al78ac78al78al78al78ac78al78al986l 78al78al78al986l78al78al78al78al78ac78al78al78al78ac78al78al 986l78al78al78al986l78al78al78al986l78al78al78al986l78al78al 78al986l78al78al78al986l78al78al78al78al78ac78al78al78al78ac 78al78al986l78al78al78al986l78al78al78al78al78ac78al78al78al 78ac78al78al986l78al986l78al986l78al986l78al986l78al78al78al 986l78al78al78alAPfOpffGpffOpe/GpffOpffGpffOpe/GpffOpffGpffO pe/GpffOpffGpffOpe/GpffOpffGpffOpe/GpffOpffGpffOpe/GpffOpe/G pffOpe/GpffOpe/GpffOpe/GpffOpffGpffOpe/GpffOpffGpffOpe/GpffO pe/GpffOpe/GpffOpe/GpffOpe/GpffOpffGpffOpe/GpffOpffGpffOpe/G pffOpffGpffOpe/GpffOpffGpffOpe/GpffOpffGpffOpe/GpffOpffGpffO pe/GpffOpffGpffOpe/GpffOpffGpffOpe/GpffOpffGpffOpe/GpffOpffG pffOpe/GpffOpffGpffOpe/GpffOpffGpffOpe/GpffOpffGpffOpe/GpffO pffGpffOpe/GpffOpffGpffOpe/GpffOpffGpffOpe/GpffOpe/GpffOpe/G pffOpe/GpffOpe/GpffOrffOpffOre/GpffOrffOpffOre/GpffOre/GpffO pe/GpffOre/GpffOpe/GpffOre/GpffOpe/GpffOre/GpffOpe/GpffOre/G pffOpe/GpffOre/GpffOpe/GpffOre/GpffOpe/GpffOre/GpffOpe/GpffO pe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/G pffOre/GpffOpe/GpffOpe/GpffOre/GpffOrffOpffOrffOpffOrffOpffO re/GpffOre/GpffOre/GpffOre/GpffOpe/GpffOre/GpffOpe/GpffOre/G pffOpe/GpffOre/GpffOre/GpffOre/GpffOre/GpffOrffGpffOre/GpffO rffGpffOre/GpffOre/GpffOre/GpffOre/GpffOre/GpffOrffGpffOre/G pffOrffGpffOre/GpffOrffOpffOrffGpffOrffOpffOrffGpffOre/OpffO re/GpffOre/OpffOre/OpffOre/GrffOtf/Wtf/evf/WtffWtffOrf/WtffO rffWtffOrf/WtffOrffOrffOrffWtffOrffOrffOrffWtffOrffOrffOrffO rffOrffOrffOrffOrffOrffOrffOrffOrffOrffOrffOrf/WtffOrf/Wtf/W tf/WtffOrffOre/GpffOre/OpffOre/GpffOrffGpffOre/GpffOrffGpffO re/GpffOrffOpffOre/GpffOre/GpffOpe/GpffOrffOpffOre/GpffOrffO pffOre/GpffOre/GpffOpe/GpffOre/GpffOpe/GpffOre/GpffOpe/GpffO re/GpffOpe/GpffOre/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/G pffOpe/GpffOpe/GpffOpffGpffOpe/GpffOpffGpffOpe/GpffOpffGpffO pe/GpffOpffGpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/G pffOpe/GpffOre/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffO re/GpffOpe/GpffOre/GpffOpe/GpffOre/GpffOre/GpffOre/GpffOre/G pffOre/GpffOpe/GpffOre/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffO pe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/G pffOpe/GpffOpffGpffOpe/GpffOpffGpffOpe/GpffOpffGpffOpe/GpffO pffGpffOpe/GpffOpffGpffOpe/GpffOpffGpffOpe/GpffOpffGpffOpe/G pffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffG pe/GpffOpe/GpffGpe/GnPfOpe/GpffGpe/GpffOpe/GpffGpe/GpffOpe/G pffGpe/GpffOpe/GpffGpe/GpffOpe/GpffGpe/GpffOpe/GpffGpe/GpffO pe/GpffGpe/GpffOpe/GpffGpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/G pffOpe/GpffGpe/GpffOpe/GpffGpe/GpffOpe/GpffGpe/GpffOpe/GpffG pe/GpffOpe/GpffGpe/GpffOpe/GpffGpe/GpffOpe/GpffOpe/GpffOpe/G pffOpe/GpffOpe/GpffGpe/GpffOpe/GpffGpe/GpffOpe/GpffGpe/GpffO pe/GpffGpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/G pffOpe/GpffOpe/GpffOpe/GpffGpe/GpffOpe/GpffGpe/GpffOpe/GpffO pe/GpffOpe/GpffOpe/GpffOpe/GpffGpe/GpffOpe/GpffGpe/GpffOpe/G pffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffOpe/GpffO pQDvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXv xqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3 xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXv xpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3 xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXv xqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3 xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXv xpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3 xqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXv xqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3 xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXv xqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3 zqXvxqX3zqX3xqX3zqXvxqX3zqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXv xqX3xqXvxqX3xqXvxqX3xqXvxqX3zqXvxqX3zqXvxqX3zqXvxqX3zqXvxqX3 xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXv xqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3 zqXvxqX3zqX3xqX3zq3vxqX3zqX3xqX3zq3vxqX3xqXvxqX3zqXvxqX3zqXv xqX3zq3vxq3vxqXvxqX3zrX/1rX/1r33zrX/1rX3zq33zrX3zq33zrXvxq33 zq3vxq33zq3vzq33zq33zq33zq3vzq33zq33zq33zq3vxqX3zq3vzq33zq3v xqX3zq3vzq33zq33xq33zq33xq33zq33xq33zq33zq3/1rX31q331q3vzqX3 zq3vxqXvzqXvxqXvxqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3zqXv xqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3 xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXv xqX3zqXvxqX3zqXvxqX3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3 xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXv xqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3zqXvxqX3 xqXvxqX3xqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXv xqX3xqXvxqX3zqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3 zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXvxqX3zqXvxqX3xqXv xqX3zqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3 xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXv xpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxpz3xqXvxpzvxqXvxpzv xqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvvZzvxqXv xpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzv xqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXv xpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzv xqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXv xpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzv xqXvxpzvxqXvxpzvxqXvxpzvxqXvvZzvxqXvxpzvxqXvvZzvxqXvxpzvxqXv xpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzv xqXvxpzvxqXvxpz3xqXvxpzvxqXvxpz3xqXvxpzvxqXvxpzvxqXvxpzvxqXv xpzvxqXvxpzvxqXvxpz3xqXvxpzvxqXvxpz3xqXvxpzvxqXvxpz3xqXvxpzv xqXvxpz3xqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpwA98al78al98al 98al98al78al98al98al98al78al98al98al98al78al98al98al98al78al 98al98al98al78al98al98al98al78al986l78al98al78al986l78al98al 78al98al98al98al78al98al98al98al78al986l78al98al78al986l78al 98al78al98al98al98al78al98al98al98al78al98al98al98al78al98al 98al98al98al986l98al98al98al986l98al98al78al98al98al98al78al 98al98al98al78al98al98al98al78al98al98al98al98al986l98al98al 98al986l98al98al78al98al98al98al78al98al98al98al78al98al98al 98al78al98al98al98al78al986l78al98al78al986l78al98al78al98al 78al98al78al98al78al98al78al986l78al98al78al986l78al98al78al 986l78al98al78al986l78al98al78al986l78al98al78al986l78al98al 78al98al78al98al78al98al78al98al78al986l78al98al78al986l78al 986l78al986l78al986l78al986l78al986l78al986l78al986l78al986l 98al986l78al986l78al986l78al986l78al98al78al986l78al986l78al 986t98al986l78al986t98al986l78al986t98al986l78al986t98al986l 78al986t98al98al78al986l78al98al78al986l78al986t98al986t98al 986t98al986t98al986l78al986t98al986l78al986t98al986t98al986t 98al986t98al986t98al986l78al986t78al986t78al986t98al78at78at 986t78al986t/9a1/969/9a1/9a1986t9861986t986t78at986t986t986t 986t986t986t986t986t986t986t986t986t986t986t986t986t986t986t 9861986t986t98at986t986t/861986t/9a1986t/9a1986t986t78al786t 78al986l78al986t98al986l78al986t98al986l78al986t98al98al78al 986l78al98al78al986l78al98al78al986l78al986l78al986l78al986l 78al986l78al98al78al98al78al98al78al98al78al986l78al986l78al 986l78al986l78al98al78al98al78al98al78al98al78al98al78al98al 98al98al78al98al98al98al78al98al98al98al78al98al98al98al78al 986l78al98al78al986l78al98al78al986l98al986l78al986l78al986l 78al986l78al986l78al986l78al986l78al986l78al986l78al986l78al 98al78al986l78al98al78al986l78al986l78al986l78al986l78al986l 78al986l78al986l78al986l78al986l78al98al78al986l78al98al78al 98al78al98al78al986l78al98al78al986l78al98al78al98al98al98al 78al98al98al98al78al98al98al98al78al98al98al98al78al98al78al 98al78al98al78al98al78ac98al78al98al78ac98al78ac98al78ac98al 78ac98al78ac98al78ac98al772c98al78ac98al772c98al772c98al772c 98al78ac98al772c98al78ac98al772c98al78ac98al772c98al78ac98al 772c98al78ac98al772c98al78ac98al772c98al78ac98al772c98al78ac 98al772c98al78ac98al772c98al78ac98al772c98al78ac98al772c98al 78ac98al772c98al78ac98al772c98al78ac98al772c98al78ac98al772c 98al78ac98al772c98al78ac98al772c98al78ac98al772c98al78ac98al 772c98al78ac98al772c98al78ac98al772c98al78ac98al772c98al78ac 98al772c98al78ac98al78ac98al78ac98al78ac98al78ac98al78ac98al 78al98al78ac98al78al98al78ac98al78ac98al78ac98al78ac98al78ac 98al78al98al78ac98al78al98al78ac98al78ac98al78ac98al78ac98al 78ac98al78ac98al78ac98al78ac98alAO+9nPfGpe+9nO/Gpe+9nPfGpe+9 nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfG pe+9nO/Gpe/GnO/Gpe+9nO/Gpe/GnO/Gpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9 nPfGpe+9nO/Gpe/GnO/Gpe+9nO/Gpe/GnO/Gpe+9nO/Gpe+9nPfGpe+9nO/G pe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe/GnPfGpe+9 nPfGpe/GnPfGpe+9nPfGpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfG pe+9nO/Gpe+9nPfGpe+9nO/Gpe/GnPfGpe+9nPfGpe/GnPfGpe+9nPfGpe+9 nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe/GnPfGpe+9nPfGpe/GnPfGpe+9nPfG pe/GnO/Gpe+9nO/Gpe/GnO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9 nO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/G pe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe+9nO/Gpe/G nO/Gpe+9nO/Gpe/GpffGpe/GnO/Gpe/GpffGpe/GnO/Gpe/GnPfGpe/GnO/G pe/GnPfGpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnPfGpe/GnO/Gpe/G nO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe+9nO/Gpe/GpffGpe/GpffGpe/GpffG pe/GnO/Gpe/GpffGpe/GnO/Gpe/GpffGpe/GnO/Gpe/GpffGpe/GnO/Gpe/G pffGpe/GnO/Gpe/GpffGpe/GnO/Gpe/GpffGpe/GpffGpe/GpffGpe/GpffG pe/GpffGpe/GpffGpe/GpffGpe/GpffGpe/GpffGpe/GpffGpe/GpffGpe/G pffGpe/Gpe/Gpe/Gpe/Gpe/GpffGpe/Gpe/Gpe/GpffOre/Gpe/Gpe+9pffO rffOrf/WtffOrffOtffOrffOre/GrffOre/GrffOre/GrffOre/GrffOre/G rffOre/GrffOre/GpffOre/GpffOre/GpffOre/GpffOrffGrffOre/GrffG re/GrffOre/GrffOre/OrffOrffOrffOre/Gpe/Gpe/Gpe/Gpe/GpffGpe/G pffGpe/GpffGpe/GpffGpe/GpffGpe/GpffGpe/GpffGpe/Gpe/Gpe/GpffG pe/GnO/Gpe/GpffGpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/G nO/Gpe+9nO/Gpe/GnO/Gpe+9nO/Gpe/GnPfGpe/GnO/Gpe/GnO/Gpe/GnO/G pe/GnO/Gpe+9nO/Gpe/GnO/Gpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9 nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe/GnO/Gpe+9nO/Gpe/GnO/G pe+9nO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnPfGpe/GnO/Gpe/G nPfGpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe+9nO/G pe/GnO/Gpe+9nO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnO/Gpe/GnPfGpe/G nO/Gpe/GnPfGpe/GnO/Gpe/GnO/Gpe+9nO/Gpe/GnO/Gpe+9nO/Gpe/GnO/G pe+9nO/Gpe/GnO/Gpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9 nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/G pe/GnPfGpe+9nO/Gpe+9nO/Gpe+9nO/GnO+9nO/Gpe+9nO/GnO+9nO/Gpe+9 nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO+9nO+9nO/GnO+9nO/GnO+9nO/G nO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9 nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO+9 nO+9nO/GnO+9nO+9nO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9 nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/G nO+9nO+9nO+9nO/GnO+9nO+9nO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9 nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO+9nO+9nO/GnO+9nO+9 nO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/Gpe+9nO/GnO+9nO/Gpe+9 nO/GnO+9nO/Gpe+9nO/GnO+9nO/Gpe+9nO/GnO+9nO/Gpe+9nO/GnO+9nO/G pe+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/GnO+9nO/Gpe+9nO/GnO+9 nO/Gpe+9nO/GnO+9nAD3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzv xqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZzvxqXv xpzvxqXvvZzvxqXvxpzvxqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZzv xqXvxpzvxqXvvZzvxqXvxpzvxqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXv vZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZz3xqXvxpz3xqXvvZz3xqXvxpz3 xqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZz3xqXv vZzvxqXvvZz3xqXvxpz3xqXvvZz3xqXvxpz3xqXvvZz3xqXvvZzvxqXvvZz3 xqXvvZzvxqXvvZz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpzvxqXvxpzvxqXv vZzvxqXvxpzvxqXvvZzvxqXvxpzvxqXvvZzvxqXvxpzvxqXvvZz3xqXvxqX3 xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXv xqX3xqXvxpz3xqXvxqX3xqXvxpz3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3 xqXvxqXvxqXvxpz3xqXvxqXvxqXvxpz3xqXvxpzvxqXvxpz3xqXvxpzvxqXv xpzvxqXvxpzvxqXvvZzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpz3xqXvxqX3 xqXvxpzvxqXvxqXvxqXvxpz3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXv xqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3 xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXv xqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3 xqXvxqX3xqXvxqX3xqXvxqX3zq3vxqXvxq3vxqX3xq3vxqX3zq3/zrX/1rX3 zrX3zrX3zq33zrX3zq33zq3vxq33zq33zq33zq3vxq33zq33zq33zq3vxq33 zq3vxqX3zq3vxqX3zq3vxqX3zq3vxqX3zq33xq33zq33xq3/zrX3xq33zq33 xq33zq3vzq33zq33zq3/1rX3zq3vxqXnvZz3xqXvxqX3xqXvxqX3xqXvxqX3 xqXvxqX3zq33xqX3xqXvxqX3zqXvxqX3xqXvxqX3xqXvxqX3xqXvxqX3xqXv xqX3xqXvxqXvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpz3xqXvxqX3xqXvxqX3 xqXvxqX3xqXvxqX3xqXvxpzvxqXvxpz3xqXvxpzvxqXvxpz3xqXvxqX3xqXv xqX3xqXvxqX3xqXvxqX3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzv xqXvvZz3xqXvvZzvxqXvvZzvxqXvxpzvxqXvvZzvxqXvxpzvxqXvvZzvxqXv xpzvxqXvxpz3xqXvxpzvxqXvxpz3xqXvxpzvxqXvxpz3xqXvxpzvxqXvxpzv xqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvvZzvxqXvxpzvxqXv vZzvxqXvxpzvxqXvxpzvxqXvxpzvxqXvxpz3xqXvxpzvxqXvxpz3xqXvxpzv xqXvxpz3xqXvxqXvxqXvvZzvxqXvxpzvxqXvvZzvxqXvxpzvxqXvvZzvxqXv xpzvxqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZz3 xqXvvZzvxqXvvZz3xqXvxpz3xqXvvZz3xqXvxpz3xqXvvZz3xqXvxpz3xqXv vZz3xqXvxpz3xqXvvZz3xqXvxpz3xqXvvZz3xqXvxpz3xqXvvZz3xqXvvZzv xpzvvZzvxqXvvZzvxpzvvZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZz3xqXv vZzvxqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZz3 xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZzvxpzvvZzvxpzvvZzvxpzvvZzvxpzv vZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzv xqXvvZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZzvxpzvvZzvxpzvvZzvxpzv vZzvxpzvvZz3xqXvvZzvxqXvvZz3xqXvvZzvxqXvvZzvxqXvvZzvxpzvvZzv xqXvvZzvxpzvvZzvxpzvvZzvxpzvvZzvxpzvvZzvxpzvvZz3xqXvvZzvxqXv vZz3xqXvvZzvxqXvvZzvxqXvvZzvxpzvvZzvxqXvvZzvxpzvvZz3xqXvxpz3 xqXvvZz3xqXvxpz3xqXvvZzvxqXvvZzvxpzvvZzvxqXvvZzvxpzvvZzvxqXv vZzvxpzvvZzvxqXvvZzvxpzvvZz3xqXvxpz3xqXvvZz3xqXvxpz3xqXvvZzv xqUA772c772c772c78ac772c772c772c78ac772c772c772c78ac772c772c 772c78ac772c772c772c78ac772c772c772c78ac772c772c772c78al772c 772c772c78al772c772c772c78ac772c772c772c78ac772c772c772c78ac 772c772c772c78ac772c772c772c772c772c772c772c772c772c772c772c 78ac772c772c772c78ac772c772c772c78ac772c772c772c78ac772c772c 772c78ac772c772c772c78ac772c772c772c78ac772c772c772c78ac772c 772c772c78ac772c772c772c78ac772c78al772c98al772c78al772c98al 772c78al772c98al772c78al772c98al772c772c772c78ac772c772c772c 78ac772c772c772c772c772c772c772c772c772c772c772c78ac772c772c 772c78ac772c78al772c78al772c78al772c78al772c78al772c78al772c 78al772c98al772c78al772c78al772c78al772c78al772c78al772c78al 772c78al772c78al772c78al772c78al772c78al772c78al772c78al772c 78al772c78al772c98al772c78al772c78al772c78al772c78al772c78al 772c78al772c78al772c78al772c78al772c98al772c78al772c98al772c 78al772c98al772c78al772c98al772c98al772c98al772c98al772c98al 772c78al772c78al772c78al772c78al78ac98al78al98al78ac98al78al 98al772c78al772c98al772c78al772c98al772c78al772c98al772c78al 772c98al772c98al78ac98al772c98al78ac98al986t/9a19861986t78at 98a178at98a198at98at98at986t78al98at78al98al78al98at78al98at 78al98at78al98at78al98at78al98at78al78at78al98at78al98at78al 98at78at98at98at9861572c78al78al78al772c772l772c98al772c98al 772l98al772c98al772l98al772c78al772c98al772c78al772c98al772c 78al772c98al772c78al772c98al772c78al772c78al772c78al772c78al 772c78al772c78al772c78al772c78al772c78ac772c78al772c78ac772c 78al772c78al772c98al772c78al772c98al772c772c772c78ac772c772c 772c78ac772c78al772c98al772c78al772c98al772c772c772c78ac772c 772c772c78ac772c78al772c78al772c78al772c78al772c78al772c98al 772c78al772c98al772c78al772c98al772c78al772c98al772c78al772c 78al772c78al772c78al772c772c772c78ac772c772c772c78ac772c772c 772c78ac772c772c772c78ac772c772c772c78ac772c772c772c78ac772c 772c772c78ac772c772c772c78ac772c772c772c772c772c772c772c772c 772c772c772c772c772c772c772c772c772c772c772c772c772c772c772c 772c772c772c772c772c772c772c772c772c572c772c772c772c572c772c 772c772c57WU772c572c772c57WU772c572c772c57WU772c572c772c57WU 772c572c772c57WU772c572c772c57WU772c572c772c57WU772c572c772c 57WU772c572c772c57WU772c572c772c57WU772c572c772c57WU772c572c 772c57WU772c572c772c57WU772c572c772c57WU772c572c772c57WU772c 572c772c57WU772c572c772c57WU772c572c772c57WU772c572c772c57WU 772c572c772c57WU772c572c772c57WU772c572c772c57WU772c572c772c 57WU772c572c772c57WU772c572c772c57WU772c572c772c57WU772c572c 772c772c772c772c772c772c772c772c772c772c772c772c772c772c772c 772c772c772c772c772c772c772c772c772c772c772c772c772c772c772c 772c772c772c772c772c772c772c772c772c772c772c772cAO/Gpe+9nO/G pe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9 nO/Gpe+9nO/Gpe+9nO/Gpe+9nO+9nO+9nO/Gpe+9nO+9nO+9nO/Gpe+9nO/G pe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9 nO+9nO+9nO/Gpe+9nO+9nO+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/G pe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9 nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/G pe+9nO/Gpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9 nO/Gpe+9nPfGpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO+9nO+9nO/G pe+9nO+9nO+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9 nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nPfGpe/GnO/G pe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9 nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nPfGpe+9nPfGpe+9nO/Gpe+9nPfG pe/GnO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9 nPfGpe+9nPfGpe+9nPfGpe+9nPfGpe+9nPfGpe+9nPfGpe+9nPfGpe+9pffG pe+9nPfGpe+9pffGpe+9pffGpe/GpffGpe+9pffGpe/Gpe/Gpe+9nO/Gpe+9 pe/Gpe+9nO/Gpe+9pffGpe+9pffGpe/GpffGpe+9pffGpe/GpffGpe+9pffG pe/GpffGpe+9pffGpe/GpffGpe+9pffGpe/GpffGpe+9pffGpe/GpffGpe+9 pffGpe/GpffGpe+9pffGpe/GpffOrffOrf/WtffOtffOte/GrffGtffGtffG rffGrffOrffGrffOrffGpffOrffGpffGre/GpffGre/GpffGre/GpffGre/G pffGre/GrffGre/GrffGre/GpffGre/GpffGre/GpffGre/GpffGre/GrffO tffGrffOre/Gpe/Gpe+9nO/Gpe+9pffGpe+9nPfGpe+9pffGpe/GpffGpe+9 pffGpe/GpffGpe+9nPfGpe+9nPfGpe+9nPfGpe+9nPfGpe+9nPfGpe+9nPfG pe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9 nO/Gpe+9nPfGpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nPfG pe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9 nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/G pe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9 nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfG pe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9 nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/Gpe+9nO/G pe+9nO/Gpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9nO/Gpe+9nPfGpe+9 nO/Gpe+9nPfGpe+9nO+9nO+9nO/Gpe+9nO+9nO+9nO/Gpe+9nO+9nO+9nO/G pe+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9 nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9 nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9 nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9 nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9 nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9 nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9 nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9 nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9 nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9 nO+9nO+9nO+9nO+9nO+9nO+9nO+9nO+9nADvvZzvvZznvZzvvZzvvZzvvZzn vZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzv vZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzv vZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzv vZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZzn vZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzv vZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzn vZzvvZzntZTvvZznvZzvvZzntZTvvZznvZzvvZzntZTvvZznvZzvvZzntZTv vZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZzn vZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvxpzvvZzvvZzvvZzv xpzvvZzvvZznvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzv vZzvvZznvZzvvZzvvZzvxpzvvZzvvZzvvZzvxpzvvZzvvZzvvZzvvZznvZzv vZzvvZzvvZznvZzvvZzvvZzvxpznvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzn vZzvvZzvvZzvvZznvZzvvZzvvZzvxpzvvZzvvZzvvZzvxpzvvZzvvZzvvZzv vZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzvxqXvvZzvvaXvvZzvxqXvvZzvvaXv vZzvxqXvvZzvvaXvvZzvxqXvvZzvvaXvvZzvxqXnvZzvvaXvvZzvxqXnvZzv vaXvvZzvxqXvvZzvvaXvvZzvxqXvvZzvvaXvvZzvxqXvvZzvxqXvvZzvxqXv vZzvxqXvvZzvxqXvvZzvxqXvvZzvxqXvvZzvxqXvvZzvxqXvvZzvxqXvvZzv xqXvvZzvxqXvvaXvxqXvxqX/zrX3zrX3xq3vvaX3xq3vxq33xq3vxqX3xq3v xqX3xq3vxqX3xqXvvaX3xq3vvaXvxqXvvaX3xq3vvaXvxqXvxqXvxq3vvaXv xq3vxqXvxq3vvaXvxqXvvaXvxqXvvaXvxqXvvaXvxq3vvaXvxq33xq33xq3n vZzvvaXnvZzvvaXvvZzvvaXvvZzvxqXvvZzvvaXvvZzvxqXvvZzvvaXvvZzv vaXvvZzvvZzvvZzvvaXvvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzv vZzvxpzvvZzvvZzvvZzvxpzvvZzvvZzvvZzvxpzvvZzvvZzvvZzvxpzvvZzv vZznvZzvvZznvZzvvZznvZzvvZznvZzvvZznvZzvvZzntZTvvZznvZzvvZzn tZTvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZznvZzvvZzntZTvvZznvZzv vZzntZTvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvxpzvvZzvvZzv vZzvxpzvvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzv vZzvvZzvvZznvZzvvZzvvZzvxpzvvZzvvZzvvZzvxpzvvZzvvZzvvZzvvZzn vZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzv vZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzv vZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzv vZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZznvZzvvZznvZzvvZznvZzvvZzn tZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTv vZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzn tZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTv vZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzn tZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTv vZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzn tZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTv vZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzn tZTvvZznvZzvvZzntZTvvZznvZzvvZzntZTvvZzntZTvvZzntZTvvZzntZTv vZzntZTvvZznvZzvvZzntZTvvZznvZzvvZzntZTvvZznvZzvvZzntZTvvZzn vZzvvZzntZTvvZzntZQA772c772c772c572c772c772c772c572c772c772c 772c572c772c772c772c572c772c772c772c572c772c772c772c572c772c 772c772c772c772c772c772c772c772c772c772c572c772c772c772c572c 772c772c772c572c772c772c772c572c772c772c772c772c772c772c772c 772c772c772c772c572c772c772c772c572c772c772c772c572c772c772c 772c572c772c772c772c572c772c772c772c572c772c772c772c572c772c 772c772c572c772c772c772c572c772c772c772c572c772c772c772c572c 772c772c772c572c772c772c772c572c772c772c772c572c772c772c772c 572c772c772c772c572c772c772c772c772c772c772c772c772c772c772c 772c572c772c772c772c572c78ac772c772c772c78ac772c772c772c772c 772c772c772c772l772c772c772c772l772c772c772c772l772c772c772c 772l772c772c772c772l772c772c772c78ac772c772c772c78ac772c772c 772c78ac772c772c572c772c772c772c772c772l772c772c772c772l772c 772c772c78ac772c772c772c78ac772c772c772c772l772c772c772c772l 772c772c772c78al772c772l772c78al772c772l772c98al772c78al772c 98al772c78al772c78al772c78al772c78al772c78al772c78al772c78al 772c78al772c78al772c78al772c78al772c78al772c78al772c78al772c 78al772c78al772c78al772c98al772c78al772c98al772c78al772c78al 572l772l78at/8619861986178at98at78at98at78al98at78al98at78al 98at78al98at772l98at78al98at772l98at78al98at772l98at78al98at 772l98at78al78al772l98at772l98at772t986t78at98at78al78al772c 772l772l78al772c772l772c78al772c772l772c78al772c772l772c78al 772c772l772c772l772c772c772c772l772c772c772c78al772c78ac772c 78al772c78ac772c772l772c772c772c772l772c772c772c772c772c772c 572c772c772c772c572c772c772c772c572c772c772c772c572c772c772c 772c572c772c772c772c572c772c772c772c572c772c772c772c572c772c 772c772c572c772c772c772c572c78ac772c772c772c78ac772c772c772c 78ac772c772c772c78ac772c772c772c78ac772c772c772c78ac772c772c 772c772l772c772c772c772l772c772c772c772c772c772c572c772c772c 772c572c772c772c772c572c772c772c772c572c772c772c772c572c772c 772c772c572c772c772c772c572c772c772c772c572c772c772c772c772c 772c772c772c772c772c772c772c772c772c772c772c772c772c772c772c 572c772c772c772c572c772c772c772c572c772c572c772c57WU772c572c 772c57Wc772c572c772c57Wc772c572c772c57Wc772c572c772c57Wc772c 572c772c57Wc772c572c772c57Wc772c572c772c57Wc772c572c772c57Wc 772c572c772c57Wc772c572c772c57Wc772c572c772c57Wc772c572c772c 57Wc772c572c772c57Wc772c572c772c57Wc772c572c772c57Wc772c572c 772c57Wc772c572c772c57Wc772c572c772c57Wc772c572c772c57Wc772c 572c772c57Wc772c572c772c57Wc772c572c772c57Wc772c572c772c57Wc 772c572c772c57Wc772c572c772c57Wc772c572c772c57Wc772c572c772c 57Wc772c572c772c57Wc772c572c772c57Wc772c572c772c57Wc772c772c 772c572c772c772c772c572c772c572c772c57Wc772c572c772c57Wc772c 572c772c57Wc772c572c772c57Wc772c572c772c57Wc772c572c772c57Wc 772cAOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9 nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1nO+9nOe9nO+9nOe1 nO+9nOe9nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9 nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1 nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9 nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1 lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9 nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1 nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9 nOe1nO+9nOe9lO+9nOe9nO+9nOe9lO+9nOe9nO+9nOe1nO+9nOe9nO+9nOe1 nO+9nOe9nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9 nOe1lO+9nOe1nO+9nOe1lO+9nOe9lO+9nOe1lO+9nOe9lO+9nOe1lO+9nOe9 lO+9nOe1lO+9nOe9lO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe9lO+9 nOe9nO+9nOe9lO+9nOe9nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1 nO+9nOe9nO+9nOe1nO+9nOe9nO+9nOe9nO+9nO+9nO+9nOe9nO+9nO+9nO+9 nOe1nO+9nOe9nO+9pee1nO+9nOe9nO+9pe+9nO+9pe+9nO+9pe+9nO+9pe+9 nO+9pee9nO+9pe+9nO+9pee9nO+9pe+9nO+9pee9nO+9pe+9nO+9pee9nO+9 pe+9nO+9pe+9nO+9pe+9nO+9pe+9nO+9pe+9nO+9pee9nO+9pee9nO+9pe/G pf/OtffGrffGre+9pe/Gre+9pe/Gre+9pe/Gpe+9pffGpe+9pe/Gpe+9pe/G pe+9pe/Gpe+9pe/Gpe+9pe/Gpe+9pe/Gpe+9pe+9pe+9pe/Gpe+9pe/Gpe+9 pe/Gpe+9pe+9pe+9pe/Gree9nO/Gpe/GpffGre+9pe+9pe+9nO+9pee9nO+9 nOe9nO+9nOe9nO+9nOe9nO+9nOe9nO+9nO+9nO+9nOe9nO+9nO+9nO+9nOe1 lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe9nO+9nOe9nO+9nOe9nO+9nOe9nO+9 nOe1nO+9nOe9nO+9nOe1nO+9nOe9nO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1 lO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9 nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1 lO+9nOe1nO+9nOe9lO+9nOe9nO+9nOe9lO+9nOe9nO+9nOe9lO+9nOe9nO+9 nOe9lO+9nOe9nO+9nOe9lO+9nOe9nO+9nOe9lO+9nOe9nO+9nOe1lO+9nOe1 nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe9lO+9nOe1lO+9nOe9lO+9nOe1lO+9 nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1 lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9 nOe1lO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe1lO+9nOe1lO+9nOe1 lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lOe9nOe1lOe9nOe1lO+9nOe1lOe9 nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1 lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9 nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1 lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9 nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1 lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9 nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1 lO+9nOe1lOe1nOe1lOe9nOe1lOe1nOe1lOe9nOe1lO+9nOe1lO+9nOe1lO+9 nOe1lO+9nOe1lO+9nOe1lO+9nOe1lO+9nOe1lO+9nOe1lOe9nOe1lO+9nOe1 lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe1lADvvZzntZzv vZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzn tZzvvZznvZzvvZzntZzvvZznvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzv vZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZzn vZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzv vZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzn tZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzv vZzntZzvvZznvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZznvZzvvZzv vZzvvZznvZzvvZzvvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzv vZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzn vZTvvZznvZzvvZznvZTvvZznvZzvvZznvZzvvZznvZzvvZznvZzvvZzvvZzv vZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZzn vZzvvZznvZTvvZznvZzvvZznvZTvvZznvZzvvZznvZTvvZznvZzvvZznvZTv vZznvZTvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZznvZTvvZznvZzvvZzn vZTvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZznvZzvvZzvvZzv vZznvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzvvZzvvaXvvZzvvaXv vZzvvaXvvZzvvaXvvZzvvaXvvZzvvaXvvZzvvaXvvZzvvaXvvZzvvaXvvZzv vaXvvZzvvaXvvZzvvaXvvZzvvaXvvZzvvaXvvZzvvaXvvZzvvaXvvZzvvaXv vZzvvaXvvZzvvaXvvZzvvaXvvZzvvZzvvaXvxqXnvZzvvaXvxqX/zrX3xq33 xq3vva33xq3vvaXvxq3vvaX3xq3vxqXvxqXvvaXvxqXvvaXvxqXvvaXvxqXv vaX3xqXvvaX3xqXvvaXvxqXvvaX3xqXvvaX3xqXvvaX3xqXvvaXvvaXvvaX3 xq3vvaXvvaXnvaXvxqXvxqX3xq3vxqXvxqXnvZzvvZznvZzvvZznvZzvvZzn vZzvvZznvZzvvZznvZzvvZzvvZzvvZznvZzvvZzvvZzvvZzntZzvvZznvZzv vZzntZzvvZznvZzvvZznvZzvvZznvZzvvZznvZzvvZznvZzvvZzntZzvvZzn vZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZznvZzv vZzvvZzvvZznvZzvvZzvvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzn vZzvvZzvvZzvvZznvZzvvZzvvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzv vZznvZTvvZznvZzvvZznvZTvvZznvZzvvZznvZzvvZznvZzvvZznvZzvvZzn vZzvvZznvZzvvZznvZzvvZznvZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzv vZznvZzvvZznvZTvvZznvZzvvZznvZTvvZznvZzvvZzntZzvvZznvZzvvZzn tZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzv vZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZznvZzvvZzntZzvvZzn vZzvvZzntZzvvZznvZzvvZzntZTvvZzntZzvvZzntZTvvZzntZzvvZzntZTv vZzntZzvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzn tZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTv vZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzn tZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTv vZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzn tZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTv vZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzn tZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTnvZzntZTv vZzntZTnvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzntZTvvZzn tZzvvZznvZzvvZzntZzvvZznvZzvvZzntZTvvZzntZTvvZzntZTvvZzntZTv vZzntZTvvZzntZTvvZzntZTvvZzntZTvvZwA57Wc572c57WU57Wc57Wc572c 57WU57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc57Wc 572c57WU57Wc57Wc772c57WU57Wc57Wc772c57WU57Wc57Wc572c57WU57Wc 57Wc572c57WU57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc57Wc772c57WU 57Wc57Wc772c57WU57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc57Wc572c 57WU57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc57Wc 572c57WU57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc 57Wc772c57WU57Wc57Wc772c57WU57Wc57Wc772c57WU57Wc57Wc772c57WU 57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc57Wc772c57WU57Wc57Wc772c 57WU57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc57WU572c57WU572c57WU 572c57WU572c57WU572c57WU57Wc57Wc772c57Wc572c57Wc772c57Wc572c 57Wc772c57Wc572c57Wc572c57WU57Wc57Wc572c57WU57Wc57WU772c57WU 572c57WU772c57WU572c57WU572c57WU572c57WU772c57WU572U57Wc772c 57Wc572c57Wc772c57Wc572c57WU572c57WU572c57WU572c57WU572c57WU 772c57WU772c57WU772c57WU772c57WU772c57WU772c57WU772c57WU772c 57WU772c57WU772c57WU772c57WU772c57Wc772c57Wc772c57Wc772c57Wc 772c57Wc772c57Wc772c57Wc772c57Wc772c57Wc772l57Wc772c57Wc772l 57Wc772c57Wc772l57Wc772c57Wc772l57Wc772c572c772l57Wc772l572c 772l57Wc772l57Wc772c572c572c57Wc772l772l98at78at98at772l772t 772l772l772l772l772l772l572c772l772l772l572c772l772l772l772c 772l772c772l572c772l772c772l772c772l772l772l772l772l572l772l 57Wc772l772l98at772l772l57Wc772c57WU772c57Wc772c57WU772c57WU 772c57WU772c57WU772c57WU772c57WU772c57WU772c57WU772c57WU772c 57WU772c57WU572c57WU772c57WU572c57Wc572c57WU57Wc57Wc572c57WU 57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc57Wc772c57WU57Wc57Wc772c 57WU57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc57Wc772c57WU57Wc57Wc 772c57WU57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc57WU572c57WU572c 57WU572c57WU572c57WU572c57WU572c57WU572c57WU572c57WU572c57WU 572c57WU572c57WU572c57Wc572c57WU57Wc57Wc572c57WU57Wc57WU572c 57WU572c57WU572c57WU572c57Wc572c57WU57Wc57Wc572c57WU57Wc57Wc 572c57WU57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc57Wc572c57WU57Wc 57Wc772c57WU57Wc57Wc772c57WU57Wc57Wc772c57WU57Wc57Wc772c57WU 57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc 57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU 57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc 57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU 57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc 57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU 57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc 57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU 57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc 57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU 57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc57WU57Wc 57WU57Wc57WU57Wc57WUAO+9nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1 nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9 nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe9nOe1nO+9nOe1nOe9nOe1 nO+9nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9 nOe1nO+9nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1 nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9 nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1nO+9nOe1 nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nOe9 nOe1nO+9nOe1nOe9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1 nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lOe9 nOe1nOe1nOe1lO+9nOe1nOe9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1 nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe9nO+9nOe9lO+9nOe9nO+9 nOe9lO+9nOe9lO+9nOe9lO+9nOe9lO+9nOe1lO+9nOe1nO+9nOe1nO+9nOe1 nO+9nOe1nO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1lO+9nOe9nO+9nOe1nO+9 nOe9nO+9nOe1nO+9nOe1nO+9nOe1lO+9nOe1nO+9nOe1lO+9nOe9nO+9nOe1 nO+9nOe9nO+9nOe1nO+9pe+1nO+9pee1nO+9pe+1nO+9pee1nO+9pee1nO+9 nOe1nO+9pee1nO+9nOe1nO+9pee9nO+9pee1nO+9pee9nO+9pee1nO+9pee9 nO+9pee1nO+9pee9nO+9pee1nO+9pe+9nO+9pee9nO+9pe+9nO+9pee9nO+9 pee1nOe9nOe9nO+9pee9nO+9pe/GpffGtffGrffGre+9pe/Gre+9pe+9pe+9 pe/Gpe+9pe+9pe+9pe/Gpe+9pe+9pe+9pe/Gpe+9pe+9pe+9nO+9pe+9pe+9 pe+9nO+9pe+9nO+9pee9nO+9pe+9pe+9pe+1pe+9pe+9pe+9pee9pe+9pe+9 pe+9pe+9pe+9nOe9nO+9nOe9nO+9nOe9nO+9nOe9nO+9nOe9nO+9nOe1nO+9 nOe9nO+9nOe1nO+9nOe9nO+9nOe1nO+9nOe9nO+9nOe1nO+9nOe9nO+9nOe9 lO+9nOe9nO+9nOe9lO+9nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1nO+9 nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1 nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9 nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1lOe9nOe1lO+9nOe1lOe9nOe1 lOe9nOe1lOe9nOe1lOe9nOe1lOe9nOe1lOe9nOe1lOe9nOe1lOe9nOe1lOe9 nOe1lO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1lOe9nOe1lO+9nOe1 lOe9nOe1lO+9nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9 nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1nOe9nOe1nO+9nOe1nO+9nOe1 nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9 nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nO+9nOe1nOe1nOe1lOe1nOe1 lOe1nOe1lOe1nOe1lOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9 nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1 lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1 nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1 nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9 nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1 lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1 nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1 nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9 nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1lO+9nOe1nOe1nOe1 lOe1nADntZTvtZzntZTvtZzntZTvtZzntZTvtZzntZTntZzntZTvtZzntZTn tZzntZTvtZzntZTvtZzntZTvtZzntZTvtZzntZTvtZzntZTntZzntZTvtZzn tZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTv tZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzn tZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTn tZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzn tZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTv tZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzn tZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTn tZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzn tZTntZzntZTvtZzntZTvtZzntZTvtZzntZTvtZzntZTvtZzntZTntZzntZTv tZzntZTvtZzntZzvvZzntZTvtZzntZTvtZzntZTvtZzntZTvtZzntZTntZzn tZTvtZzntZTntZzntZTvtZzntZTvtZzntZTvtZzntZTvtZzntZTvtZzntZTn tZzntZTntZzntZTntZzntZTntZzntZTntZzntZTntZzntZTntZzntZTntZzn tZTvtZzntZTvtZzntZTvtZzntZzvvZzntZTvtZzntZTvtZzntZTvtZzntZTv tZzntZTntZzntZzvvZzntZTntZzntZzvvZzntZTntZzntZTntZzntZTntZzn tZzvvZzntZTntZzntZzvvZzntZTntZzntZzvvZzntZTvtZzntZzvvZzntZTv tZzntZzvvZzntZTvtZzntZzvvZzntZTvtZzntZzvvZzntZTvtZzntZzvvZzn tZTvtZzntZzvvZzvvaX3xq33xq33va3vtaXvva3vvaXvvaXvtaXvvaXvtaXv vaXntZzvvaXvtaXvvaXvtZzvvaXvtZzvvaXntZzvvaXntZzvvaXntZzvvaXn tZzvvaXntZzvtaXntZzvvaXntZzvvaXntZzvvaXntZzvvaXntZzvvaXvvaXv vaXvtZzvvZzntZTntZzntZzvtZzntZTvtZzntZzvvZzntZTvvZzntZzvvZzn tZTntZzntZTntZzntZTntZzntZTntZzntZTntZzntZzvvZzntZTntZzntZzv vZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzn tZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTn tZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzn tZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTv tZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTvtZzn tZTvtZzntZTvtZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTn tZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzn tZTntZzntZTvtZzntZTntZzntZTvtZzntZzvtZzntZTvtZznrZTntZzntZTn tZzntZTvtZzntZzvtZzntZTvtZzntZzvtZzntZTntZzntZTvtZzntZTntZzn tZTvtZznrZTntZzntZTntZznrZTntZzntZTntZznrZTntZzntZTntZznrZTn tZzntZTntZznrZTntZzntZTntZznrZTntZzntZTntZznrZTntZzntZTntZzn rZTntZzntZTntZznrZTntZzntZTntZznrZTntZzntZTntZznrZTntZzntZTn tZznrZTntZzntZTntZznrZTntZzntZTntZznrZTntZzntZTntZznrZTntZzn tZTntZznrZTntZzntZTntZznrZTntZzntZTntZznrZTntZzntZTntZznrZTn tZzntZTntZznrZTntZzntZTntZznrZTntZzntZTntZznrZTntZzntZTntZzn rZTntZzntZTntZznrZTntZzntZTntZznrZTntZzntZTntZznrZTntZzntZTn tZznrZTntZzntZTntZznrZTntZzntZTntZznrZTntZzntZTntZznrZTntZzn tZTntZznrZTntZzntZTntZznrZTntZzntZTntZznrZTntZzntZTntZznrZTn tZzntZTntZznrZTntZzntZTntZznrZTntZzntZTntZznrZTntZzntZTntZzn rZTntZzntZTntZznrZTntZzntZTntZznrZTntZzntZTntZzntZQA77Wc57WU 772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc 57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc 77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c 57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU 772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc 57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc 77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c 57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU 772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc 57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc 77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c 57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU 772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc57Wc57WU772c57Wc57Wc 57WU772c57Wc57Wc57WU772c57Wc57Wc57WU772c57Wc77Wc57WU772c57Wc 772c57Wc772c57Wc772c57Wc772c57Wc772c57Wc772c57Wc772c57Wc772c 57Wc772c57Wc772c57Wc772c57Wc772c57Wc772c57Wc772c57Wc772c57Wc 772c57Wc772c57Wc772c57Wc772c57Wc772c77Wc772c57Wc772c77Wc772c 57Wc772c77Wc772c57Wc772c77Wc772c57Wc772c77Wc772c57Wc772c77Wc 772l772l98at98at972t77Wl772l772l772l772l772l772l772l77Wl772l 772l772l77Wl772l77Wl772l77Wc772l77Wc772l77Wc772l77Wc772l57Wc 772l57Wc772l57Wc772l77Wc772l57Wc772l77Wc772l772c772l772c772c 57Wc772c57Wc772c57Wc772c57Wc772c57Wc772c77Wc772c57Wc772c57Wc 772c57Wc772c57Wc57Wc57WU772c57Wc57Wc57WU772c57Wc77Wc57WU772c 57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU 772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc 57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc 77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c 57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU 772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc 57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc77Wc57WU772c57Wc 77Wc57WU772c57Wc77Wc57Wc77Wc57Wc57Wc57WU77Wc57Wc77Wc57WU77Wc 57Wc77Wc57WU77Wc57Wc57Wc57WU77Wc57WU57Wc57WU77Wc57WU57Wc57WU 77Wc57WU57Wc57WU77Wc57WU57Wc57WU77Wc57WU57Wc57WU77Wc57WU57Wc 57WU77Wc57WU57Wc57WU77Wc57WU77Wc57WU77Wc57Wc77Wc57WU77Wc57Wc 77Wc57WU77Wc57Wc77Wc57WU77Wc57Wc77Wc57WU77Wc57Wc77Wc57WU77Wc 57Wc77Wc57WU77Wc57Wc77Wc57WU77Wc57Wc77Wc57WU77Wc57Wc77Wc57WU 77Wc57Wc57Wc57WU77Wc57WU57Wc57WU77Wc57WU77Wc57WU77Wc57Wc77Wc 57WU77Wc57Wc57Wc57WU77Wc57WU57Wc57WU77Wc57WU57Wc57WU77Wc57WU 57Wc57WU77Wc57WU57Wc57WU77Wc57WU57Wc57WU77Wc57WU77Wc57WU77Wc 57Wc77Wc57WU77Wc57Wc57Wc57WU77Wc57WU57Wc57WU77Wc57WU57Wc57WU 77Wc57WU57Wc57WU77Wc57WU77Wc57WU77Wc57Wc77Wc57WU77Wc57Wc77Wc 57WU77Wc57Wc77Wc57WU77Wc57Wc57Wc57WU77Wc57WU57Wc57WU77Wc57WU 57Wc57WU77Wc57WU57Wc57WU77Wc57WU77WcAOe1lOe1nOetlOe1nOe1lOe1 nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lO+1nOe1lOe1nOe1 lO+1nOe1lOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1 nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOet lOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1 nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1 lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1 nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOet lOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1 nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1 lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1 nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOet lOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1 nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1 lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lO+1nOe1lOe1 nOe1lO+1nOe1lOe1nOe1lO+1nOe1lOe1nOe1nOe1nOe1lOe1nOe1nOe1nOe1 lOe1nOe1lOe1nOe1lOe1nOe1nOe1nOe1lOe1nOe1nOe1nOe1lOe1nOe1nOe1 nOe1lOe1nOe1nO+1nOe1lO+1nOe1nO+1nOe1lO+1nOe1nO+1nOe1lO+1nOe1 nO+1nOe1lO+1nOe1nO+1nOe1lO+1nOe1nO+1nOe1lO+1nOe1nOe1nOe1nPfG re+9pe+9pee1nO+9pe+1pe+9pee1nO+9pee1nO+9pee1nO+9pee1nO+9pee1 nO+1pee1nO+1pee1nO+1nOe1nO+9pee1nO+1nOe1nO+1pee1nO+1nOe1nO+1 pee1nO+1nOe1nO+1pee1nO+1nOe1nO+9pee1nO+9pee1nO+1pee1nOe1nOe1 lO+1nOe1lOe1nOe1lO+1nOe1lOe1nOe1lOe1nOe1lOe1nOe1lOe1nOe1lOe1 nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOet lOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1 nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1 lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1 nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOet lOe1nOe1lOe1nOetlOe1nOe1lO+1nOe1lOe1nOe1lO+1nOe1lOe1nOe1lOe1 nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1 lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1nOe1lOe1nOetlOe1 nOe1nO+1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOet lOe1nOetlOe1nN6tlOetnOetlOe1nN6tlOetnOetlOe1nOetlOe1nOetlOe1 nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOet lOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1 nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOet lOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1 nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOet lOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1 nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOet lOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1 nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOet lOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1 nOetlOe1nOetlOe1nOetlADvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzn tZTntZzntZTvtZzntZTntZzntZTvtZzntZzvtZzntZTvtZzntZzvtZzntZTv tZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzn tZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTn tZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzn tZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTv tZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzn tZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTn tZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzn tZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTv tZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzn tZTvtZzntZzntZzntZTvtZzntZTntZznrZTvtZzntZTntZzntZTvtZzntZTn tZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzn tZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTv tZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZzvtZzntZTvtZzntZzvtZzn tZTvtZzntZzvtZzntZTvtZzntZzvtZzntZzvtZzntZzvtZzntZzvtZzntZzv tZzntZzvtZzntZzvtZzntZzvtZzntZzvtZzntZzvtZzntZzvtZzntZzvvZzn tZzvtZzntZzvvZzntZzvtZzntZzvvZzntZzvtZzntZzvvZzntZzvtZzntZzv vZzntZzvtZzntZzvvZzntZzvtZzntZzvvaXntZzntZzvtaX3xq33va33va3v taXvvaXvvaXvvaXntZzvvaXntZzvvaXntZzvvaXntZzvvaXntZzvvaXntZzv taXntZzvvaXntZzvvaXntZzvvaXntZzvtaXntZzvvaXntZzvtaXntZzvvaXn tZzvtaXntZzvtaXntZzvvaXntZzvvaXntZzvtZzntZzvtZzntZzvtZzntZTv tZzntZzvtZzntZTvtZzntZzvtZzntZTvtZzntZzvtZzntZTvtZzntZzvtZzn tZTvtZzntZzvtZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTn tZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzn tZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTv tZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzn tZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTn tZzntZTvtZzntZzvtZzntZTvtZzntZzvtZzntZTvtZzntZTntZzntZTvtZzn tZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTv tZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZTntZzntZTvtZzntZzntZzn rZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTn tZznrZTntZznrZTntZznrZTntZznrZzntZznrZTntZznrZzntZznrZTntZzn rZzntZznrZTntZznrZzntZznrZTntZznrZzntZznrZTntZznrZzntZznrZTn tZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZzn rZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTn tZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZzn rZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZzntZznrZTn tZznrZzntZznrZTntZznrZzntZznrZTntZznrZzntZznrZTntZznrZzntZzn rZTntZznrZzntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZzn tZznrZTntZznrZzntZznrZTntZznrZzntZznrZTntZznrZzntZznrZTntZzn rZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTn tZznrZzntZznrZTntZznrZzntZznrZTntZznrZzntZznrZTntZznrZzntZzn rZTntZwA562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U 57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc 562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U 57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc 562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U 57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc 562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U 57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc 562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U 57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc 562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U 57Wc562U562c562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc 562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U 57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc 562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U 57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc 57Wc77Wc562U57Wc562c57Wc562U57Wc562c57Wc562c57Wc57Wc77Wc562c 57Wc57Wc77Wc562c57Wc57Wc77Wc562c57Wc57Wc77Wc562c57Wc57Wc77Wc 562c57Wc57Wc77Wc57Wc57Wc562U57Wc57Wc972t772t772l57Wc772l57Wc 77Wl57Wc77Wl57Wc77Wl57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc 57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc 57Wc57Wc57Wc57Wc57Wc57Wc57Wc562U57Wc562c57Wc562U57Wc562U57Wc 562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562c57Wc562U57Wc562c 57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc 562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U 57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc 562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U 57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc 562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U 57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc 562U57Wc562U57Wc562U57Wc562U57Wc562U57Wc562U562c3q2U562c3q2U 562c3q2U562c562U562c3q2U562c562U562c3q2U562c562U562c3q2U562c 562U562c3q2U562c562U562c3q2U562c562U562c3q2U562c562U562c3q2U 562c562U562c3q2U562c562U562c3q2U562c562U562c3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c562U562c562U57Wc562U562c562U57Wc3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c562U562c3q2U562c562U562c 3q2U562c562U562c3q2U562c562U562c3q2U562c562U562c3q2U562c562U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c562U562c3q2U562c 562U562c3q2U562c562U562c3q2U562c562U562c3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c562U562c 3q2U562c562U562c3q2U562c562U562c3q2U562c562U562c562UAOe1nOet lOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1 nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetlOe1nOetnOe1nOetlOe1nOet nOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1 nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOet lOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1 nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOet nOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1 nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOet lOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1 nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOet nOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1 nOetlOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOet lOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1 nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOet nOe1nOetnO+1nOe1nOe1nOetnO+1nOe1nOe1nOetnO+1nOe1nOe1nOetnO+1 nOe1nOe1nOetnO+1nOe1nOe1nOetnO+1nOe1nOe1nOe1nO+1nOe1nOe1nOet nO+1nOe1nOe1nOetnO+1nOe1nO+1nOe1nO+1nOe1nO+1nOe1nO+1nOe1nO+1 nOe1nO+1nOe1nO+1nOe1nO+1nOe1nO+1nOe1nO+1nOe1nO+1nOe1nO+1nOe1 nO+1nO+1nO+9peetnOe1nO+1nPe9rfe9re+9pe+1pe+9pee1pe+1pee1nO+1 pee1nO+1nOe1nO+1pee1nO+1nOe1nO+1nOe1nO+1nOe1nO+1pee1nOe1nOe1 nO+1nOe1nOe1nOe1nO+1nOe1nOe1nOe1nO+1nOe1nO+1pee1nO+1pee1nOe1 nOe1nO+1pee1nO+1nOe1nO+1nOe1nOe1nOetlOe1nOetnOe1nOetnO+1nOe1 nOe1nOetnO+1nOe1nO+1nOe1nO+1nOe1nO+1nOe1nO+1nOe1nOe1nOetlOe1 nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOet lOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1 nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOet nOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1 nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetlOe1nOet lOe1nOetlOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1 nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOet nOe1nOetlOe1nOetnOe1nOetnOe1nOetlOetnOetlOe1nOetlOe1nOetlOe1 nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOetnOet lOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOet nOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOet lOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1 nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOet lOe1nOetlOe1nOetlOe1nOetnOe1nOetlOe1nOetnOetnOetlOe1nOetlOet nOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOet lOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1 nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOet lOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOet nOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOet lOetnOetlOe1nOetlOetnOetlOe1nOetlOe1nADnrZTntZznrZTntZznrZTn tZznrZTntZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZzn rZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTn rZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZze rZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTn tZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZzn rZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTn rZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZze rZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTn tZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZzn rZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZznrZTn tZznrZTntZznrZTntZznrZTntZzerZTnrZznrZTntZznrZTntZznrZTntZzn rZTntZznrZTntZznrZTntZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTn tZznrZTntZznrZTntZznrZTntZznrZTntZznrZTnrZznrZTntZznrZTnrZzn rZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTn tZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZzn rZTntZznrZTntZznrZTntZznrZTvtZznrZTntZznrZTvtZznrZTntZznrZTv tZznrZTntZznrZzntZznrZTntZznrZzntZznrZTntZznrZzntZznrZTntZzn rZzntZznrZTntZznrZzntZznrZTntZznrZzntZznrZTntZznrZTvtZzntZzn tZzerZTnrZzntZzvvaXvtaXvvaXntZzvtaXntZzvtaXntZzntaXntZzntZzn tZzntZzntZzntZznrZzntZzntZzntZznrZzntZznrZzntZznrZTntZzntZzn tZznrZzntZzntZzntZznrZzntZzntZzntZznrZzntZznrZzntZznrZzntZzn tZzntZznrZTntZznrZTntZznrZTnrZznrZTntZznrZTntZznrZTntZznrZTn tZznrZTntZznrZTntZznrZTntZznrZTntZznrZTntZzerZTnrZznrZTntZze rZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTn tZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZzn rZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTn rZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZze rZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTn tZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZzn rZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTnrZznrZTntZzerZTn rZznrZzntZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZze rZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTn rZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZze rZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTn rZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZze rZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTn rZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZze rZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTn rZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZze rZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTn rZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZze rZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTn rZzerZTnrZzerZTnrZzerZQA57Wc562c57Wc562c57Wc562c57Wc562c57Wc 562c57Wc562U57Wc562c57Wc562U57Wc562U562c562U57Wc562U562c562U 57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc 562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c 57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc 562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U 57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc 562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c 57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc 562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U 57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562c57Wc562c57Wc 562c57Wc562c57Wc562U57Wc562c57Wc562c57Wc562c57Wc562c57Wc562c 57Wc562c57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562c57Wc 562c57Wc562c77Wc562c57Wc562U77Wc562c57Wc562U77Wc562c77Wc562c 77Wc562c77Wc562c57Wc562c57Wc562c57Wc562c57Wc562c57Wc562c57Wc 562c57Wc562c57Wc562c77Wc562c77Wc562c77Wc562c77Wc562c77Wc562c 77Wc562c77Wc562c77Wc562c77Wc562c77Wc562c77Wc562c77Wc562c77Wc 562c57Wc562c77Wc562c57Wc562c77Wc562c57Wc562c77Wc562c57Wc562c 77Wc562c57Wc562c77Wc562c57Wc562c77Wc562c57Wc562c57Wc562U57Wc 57Wc772t772l772l57Wl772l57Wc77Wl57Wc77Wl57Wc77Wc57Wc77Wc57Wc 57Wc57Wc77Wc57Wc57Wc57Wc57Wc57Wc57Wc562c77Wc57Wc57Wc57Wc77Wc 57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc57Wc77Wl57Wc77Wc562c 77Wc562c57Wc562U77Wc562c77Wc562c77Wc562c77Wc562c77Wc562c57Wc 562U77Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c 57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc 562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U 57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc 562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c 57Wc562U57Wc562U562c562U57Wc562U562c562U57Wc562c57Wc562U57Wc 562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U 57Wc562c57Wc562U57Wc562c57Wc562U57Wc562c57Wc562U77Wc562c57Wc 562U57Wc562U562c562U562c562U562c3q2U562c562U562c3q2U562c562U 562c3q2U562c562U562c3q2U562c562U562c3q2U562c562U562c3q2U562c 562U562c3q2U562c562U562c3q2U562c562U562c3q2U562c562U562c3q2U 57Wc562U562c562U57Wc562U562c562U57Wc562U562c562U57Wc562U562c 562U57Wc562U562c562U57Wc562U562c562U57Wc562U562c562U57Wc562U 562c562U57Wc562U562c562U57Wc562U562c562U562c562U562c3q2U562c 562U562c3q2U57Wc562U562c562U57Wc562U562c562U562c562U562c3q2U 562c562U562c3q2U562c562U562c3q2U562c562U562c3q2U562c562U562c 3q2U562c562U562c3q2U57Wc562U562c562U57Wc562U562c562U562c562U 562c3q2U562c562U562c3q2U562c562U562c3q2U562c562U562c3q2U57Wc 562U562c562U57Wc562U562c562U57Wc562U562c562U57Wc562U562c562U 562c562U562c3q2U562c562U562c3q2U562c562U562c3q2U562c562U562c 3q2U562cAN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6t lOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOet nN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6t lOetnN6tlOetnN6tlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOet nOetlOetnN6tlOetnOetlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6t lOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnOetlOetnN6tlOetnOetlOet nN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6t lOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnOetlOetnN6tlOet nOetlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnOetlOetnN6t lOetnOetlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOet nN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnOet lOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOet nOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6t lOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOet nN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOet lOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOet nOetlOetnOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOet lOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1 nOetlOetnOetlOe1nOetlOetnOetlOe1nOetlOetnOetlOe1nOetnO+1pe+1 pe+1peetnOe1nOetnO+1peetnO+1nOetnOe1nOetnOe1nOetnOe1nOetnOe1 nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOe1nOet lOe1nOetnOe1nOetlOetnOetlOetnN6tlOetnOetlOe1nOetlOetnOetlOet nN6tlOetnOetlOetnN6tlOetnN6tlOetnN6tlOetnOetlOetnN6tlOetnOet lOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOet nOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6t lOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOet nN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOet lOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOet nN6tlOetnN6tlOetnN6tlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6t lOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOet nN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOe1nOetlOetlN6tlOetlN6t lOetlN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlOetnN6tlOet lN6tlOetnN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlOetnN6t lOetlN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetlN6tlOet nN6tlOetlN6tlOetnN6tlOetlN6tlOetnN6tlOetlN6tlOetnN6tlOetnN6t lOetnN6tlOetnN6tlOetnN6tlOetlN6tlOetnN6tlOetlN6tlOetnN6tlOet lN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlOetnN6tlOetlN6tlOetnN6t lOetlN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlOet lN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6t lOetlN6tlOetlN6tlOetnN6tlOetlN6tlOetnN6tlOetnN6tlOetnN6tlOet nN6tlOetnN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlOetnN6tlOetnN6t lOetnN6tlOetnN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlOet nN6tlOetlN6tlOetnN6tlOetlN6tlOetlN6tlOetlN6tlOetlN6tlADnrZze rZTnrZznrZTnrZzerZTnrZznrZTnrZzerZTnrZznrZTnrZzerZTnrZznrZTn rZzerZTnrZznrZTnrZzerZTnrZznrZTnrZznrZTntZznrZznrZznrZTntZzn rZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTn tZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZzn rZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZzn rZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZzn rZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZzerZTn rZznrZTnrZzerZTnrZznrZTnrZznrZTntZznrZznrZznrZTntZznrZznrZze rZTnrZznrZTnrZzerZTnrZznrZTnrZznrZTntZznrZznrZznrZTntZznrZzn rZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZzn rZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTn tZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZzn rZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZTn rZznrZTntZznrZTnrZznrZTntZznrZTnrZznrZTntZznrZTnrZznrZTntZzn rZznrZznrZTntZznrZzntZznrZTntZznrZzntZznrZTntZznrZzntZznrZTn tZznrZzntZznrZTntZznrZzntZznrZTntZznrZzntZznrZTntZznrZzntZzn rZzntZznrZzntZznrZzntZznrZzntZznrZzntZznrZzntZznrZzntZznrZzn tZznrZzntZznrZzntZznrZzntZznrZzntZznrZzntZznrZzntZznrZzntZzn rZzntZznrZzntZznrZzntZznrZzntZznrZzntZzntZzvvaXvtaXvtaXntaXv taXntZzvtaXntZzvtaXntZzvtZznrZzvtZzntZzvtZznrZzvtZzntZzntZzn rZzvtZznrZzntZznrZzvtZznrZzntZznrZzvtZznrZzntZznrZzntZznrZzn tZznrZzntZznrZzntZznrZzntZznrZzntZznrZzntZznrZzntZznrZTntZzn rZznrZznrZTntZznrZTnrZznrZTntZznrZTnrZznrZTntZznrZTnrZznrZTn tZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZzn rZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZzn rZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZzn rZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTn tZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZzn rZTntZznrZznrZznrZTntZznrZznrZznrZTntZznrZznrZzerZTnrZznrZTn rZzerZTnrZznrZTnrZznrZTntZznrZznrZznrZTntZznrZznrZznrZTntZzn rZznrZznrZTntZznrZznrZznrZzntZzerZTnrZznrZTnrZznrZTnrZzerZTn rZzerZTnrZzerZTnrZzerZTnrZzerZTnrZznrZTnrZzerZTnrZznrZTnrZze rZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZznrZTnrZzerZTnrZznrZTn rZzerZTnrZznrZTnrZzerZTnrZznrZTnrZznrZTntZznrZTnrZznrZTntZzn rZTnrZznrZTntZznrZTnrZznrZTntZznrZTnrZzerZTnrZznrZTnrZzerZTn rZznrZTnrZzerZTnrZznrZTnrZzerZTnrZznrZTnrZzerZTnrZznrZTnrZze rZTnrZznrZTnrZzerZTnrZznrZTnrZzerZTnrZznrZTnrZzerZTnrZznrZTn rZzerZTnrZznrZTnrZzerZTnrZznrZTnrZzerZTnrZznrZTnrZzerZTnrZze rZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTn rZznrZTnrZzerZTnrZznrZTnrZzerZTnrZznrZTnrZzerZTnrZznrZTnrZze rZTnrZznrZTnrZzerZTnrZznrZTnrZzerZTnrZznrZTnrZzerZTnrZznrZTn rZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZznrZTnrZzerZTnrZzn rZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZwA3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U 562c562U562c3q2U562c562U562c3q2U562c3q2U562c3q2U562c3q2U562c 3q2U562c562U562c3q2U562c562U562c3q2U562c562U57Wc562U562c562U 57Wc562U562c562U57Wc562U562c562U57Wc562U562c562U57Wc562U562c 562U57Wc562U562c562U57Wc562U562c562U57Wc562U562c562U57Wc562U 562c562U57Wc562U562c3q2c562c562c77Wl77Wl77Wl562c562c562c77Wc 562c57Wc562c57Wc562c57Wc562c57Wc562U57Wc562c57Wc562U562c562U 57Wc562U562c562U57Wc562U562c562U57Wc562U562c562U562c3q2U562c 562U562c562U562c562U57Wc3q2U562c562U562c3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U 562c3q2U57Wc3q2U3q2U3q2U562c3qWU562c3q2U562c3qWU562U3q2U562c 3qWU562U3q2U562c3qWU562U3q2U562c3qWU562U3q2U562c3qWU562U3q2U 562c3qWU562U3q2U562c3qWU562U3q2U562c3qWU562U3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c 3qWU562U3q2U562c3qWU562U3q2U562c3q2U562c3q2U562c3q2U562c3q2U 562c3qWU562U3q2U562c3qWU562U3q2U562c3q2U562c3q2U562c3q2U562c 3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3qWU562U3q2U562c3qWU 562U3q2U562c3qWU562U3q2U562c3qWU562U3q2U562c3q2U562c3q2U562c 3q2U562c3q2U562c3qWU562U3q2U562c3qWU562U3q2U562c3q2U562c3q2U 562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3q2U562c3qWU562U 3q2U562c3qWU562U3q2U562c3qWU562U3q2U562c3qWU562U3q2U562c3qWU 562U3q2U562c3qWU562U3qWUAOetnOetnOetnN6tnOetnOetnOetnN6tnOet nOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOetnN6t nOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOet nN6tnOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOetnOetnOetnOet nOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnN6tnOet nOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOetnOet nOetnOetnOetnOetnOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOet nN6tnOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOet nOetnOetnOetnOetnOetnOetnOetnOetnOetnN6tnOetnOetnOetnN6tnOet nOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnN6tnOetnOetnOetnN6t nOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOet nN6tnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOet nOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOet nOetnOetnOetnOe1nOetnOetnOetlOe1nOetnOetnOetlOe1nOetnOetnOet lOe1nOetnOetnOetlOetnOetnOetnOetnOetnOetnOetnOetnOe1nOetnOet nOetlOe1nOetnOetnOetlOe1nOetnOetnOetlOe1nOetnOetnOetlOe1nOet nOetnOetlOe1nOetnOetnOetlOe1nOetnOe1nOetnOe1nOetnOe1nOetnOe1 nOetnOe1nOetnOe1nOetnOe1nOetnOe1nOetnOe1nOetnOe1nOetnOe1nOet nOe1nOetnOe1nOetnOe1nOetnOe1nOetnOe1nOetnOe1nOetnOe1nOetnOe1 nOetnOetnN6tnOetnOetnO+9pe+1pe+1peetnO+1pee1nO+1nOetnO+1nOe1 nO+1nOe1nO+1nOetnOe1nOetnOe1nOetnOe1nOetnOe1nOetnOe1nOetnOe1 nOetnOe1nOetnOe1nOetnOe1nOetnOe1nOetnOetnOetlOe1nOetnOe1nOet nOe1nOetnOe1nOetlOe1nOetnOe1nOetlOe1nOetnOetnN6tlOe1nOetnOet nOetlOe1nOetnOetnOetlOetnOetnOetnOetnOetnOetnOetnOetnOetnOet nOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOet nOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOet nOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOet nOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOetnOet nOetnOetnOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOetnOetnOet nOetnOetnOetnOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOetnN6t nOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOe1nOe1 nN6llOetnOetnOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6t lOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOet nN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tnOetnN6tlOetnN6tnOetnN6t lOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOetnOetlOet nN6tlOetnN6tnOetnN6tlOetnN6tnOetnN6tlOetnN6tlOetnN6tlOetnN6t lOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOet nN6tlOetnN6tlOetnOetlOetnN6tlOetnOetlOetnN6tlOetnN6tlOetnN6t lOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOet nN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6t lOetnN6llOetnN6tlOetnN6llOetnOetlOetnN6tlOetnOetlOetnN6tlOet nN6tnOetnN6tlOetnN6tnOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6t lOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOetnN6tlOet nN6tlOetnADepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZze pZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTn rZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZze pZTnrZzepZTnrZzepZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTnrZzepZTn rZzerZTnrZzepZTnrZzerZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZze pZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTn rZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZze pZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzerZTnrZzepZTn rZzerZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzerZTnrZze pZTnrZzerZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTn rZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZze rZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTnrZzepZTn rZzerZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTnrZze rZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTn rZzepZTnrZzerZTnrZzepZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZze rZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTn rZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZze rZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTn rZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZzerZze pZTnrZznrZzvtaXntaXvtaXnrZzntZznrZzntZznrZzntZznrZzntZznrZzn tZznrZzntZznrZTnrZznrZTnrZzerZTnrZznrZTnrZzerZTnrZznrZTnrZze rZTnrZznrZTnrZzerZTnrZzerZTnrZzerZTnrZznrZTnrZzerZTnrZzerZTn rZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZzerZTnrZze rZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTnrZzepZTn rZzerZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTnrZze pZTnrZzerZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTn rZzepZTnrZzerZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTnrZzepZTnrZze rZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTnrZzepZTn rZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzerZTnrZzepZTnrZzerZTnrZze pZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTn rZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTntZzerZzerZzepZTnrZze pZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTn rZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZze pZTnrZzepZTnrZzepZTerZzepZTnrZzepZTerZzepZTnrZzepZTnrZzepZTn rZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTerZze pZTnrZzepZTerZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTe rZzepZTnrZzepZTerZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZze pZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTerZzepZTnrZzepZTerZzepZTn rZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZze pZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTn rZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTerZzepZTnrZze pZTerZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTn rZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZQA562c 3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c 562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c 3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc 562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c 3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c 562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c 3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc 562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c 3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c 562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c 3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc 562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c 3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3q2U562c3q2c 562c3q2U562c3q2c562c3q2U562c3q2c562c3q2U562c3q2c562c3qWc562c 3q2c562c3qWc562c3q2c562c3q2c562c562c562c3q2c562c562c562c562c 562c562c562c562c562c562c562c3q2c562c562c562c3q2c562c562c562c 562c562c562c562c562c562c562c562c562c562c562c562c562c562c562c 562c562c562c562c562c562c562c562c562c562c562c562c562c562c562c 562c562c562c562c562c562c562c562c562c57Wc3q2c562c3q2U562c562c 77Wl57Wl77Wl562c77Wl562c57Wc562c57Wl562c57Wc562c57Wl562c562c 562c57Wc562c562c562c57Wc562c562c562c57Wc562c562c562c562c562c 562c562c562c562c562c562c562c562c562c562c562c562c562c562c562c 562c562c3q2c562c562c562c3q2U562c3q2c562c3q2U562c3q2c562c3qWc 562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c 3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c 562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c 3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc 562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c 3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c 562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c 3q2c562c3qWc562c3q2c562c562c562c3qWU562c3q2c562c3q2c562c3qWU 562c3qWc562c3qWU562c3qWc562c3qWc562c3q2c562c3qWc562c3q2c562c 3qWU562c3qWc562c3qWU562c3qWc562c3qWc562c3q2c562c3qWc562c3q2c 562c3qWU562c3qWc562c3qWU562c3qWc562c3qWc562c3q2c562c3qWc562c 3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWU562c3qWc562c3qWU 562c3qWc562c3qWc562c3q2c562c3qWc562c3q2c562c3qWU562c3qWc562c 3qWU562c3qWc562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c 562c3qWc562c3q2c562c3qWU562c3qWc562c3qWU562c3qWc562c3qWU562c 3qWc562c3qWU562c3qWc562c3qWU562c3qWc562c3qWU562c3qWc562c3qWc 562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c3qWc562c3q2c562c 3qWc562c3q2c562c3qWc562c3q2c562c3qWU562c3qWc562c3qWU562c3qWc 562c3qWU562c3qWc562c3qWU562c3qWc562c3qWc562c3q2c562c3qWc562c 3q2c562c3qWU562c3qWc562c3qWU562c3qWc562cAN6llOetnN6llOetnN6l lOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOet nN6llOetnN6llOetnN6llOetnN6llN6tnN6llOetnN6llN6tnN6llOetnN6l lN6tnN6llOetnN6llN6tnN6llOetnN6llN6tnN6llOetnN6llN6tnN6llOet nN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6l lOetnN6llN6tnN6llOetnN6llN6tnN6llOetnN6llN6tnN6llOetnN6llN6t nN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llN6tnN6llOetnN6l lN6tnN6llOetnN6llN6tnN6llOetnN6llN6tnN6llOetnN6llOetnN6llOet nN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6l lOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llN6t nN6llOetnN6llN6tnN6llOetnN6llN6tnN6llOetnN6llN6tnN6llOetnN6l lN6tnN6llOetnN6llN6tnN6llOetnN6llOetnN6llOetnN6llOetnN6llOet nN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6l lOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOet nN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6l lOetnN6tlOetnN6llOetnN6tlOetnN6llOetnN6tlOetnN6llOetnN6tlOet nN6llOetnN6tlOetnN6llOetnN6tlOetnN6llOetnN6tnOetnN6tlOetnN6t nOetnN6tlOetnN6tnOetnN6tlOetnN6tnOetnN6tlOetnN6tnOetnN6tlOet nN6tnOetnN6tlOetnN6tnOetnN6tlOetnN6tnOetnN6tlOetnN6tnOetnN6t lOetnN6tnOetnN6tlOetnN6tlOetnN6tlN6tnN6tlOetnN6tnOe1pee1nO+1 peetnOetnOetnOetnN6tnOetnOetnOetnN6tnOetnOetnOetnN6tlOetnN6t nOetnN6tlOetnN6tnOetnN6tlOetnN6tnOetnN6tlOetnN6tlOetnN6llOet nN6tlOetnN6tlOetnN6tnOetnN6llOetnN6tnOetnN6tlOetnN6tlOetnN6l lOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOet nN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6l lOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOet nN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6l lOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOet nN6llOetnN6llOetnN6llOetnN6llOetnN6llN6tnN6llOetnN6llN6tnN6l lOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOetnN6llOet nN6llOetnN6llN6tnN6llOetnN6llN6tnN6llOetnN6llN6tnN6llOetnN6l lN6tnN6lnOetpd6lnN6lnN6lnOetnN6llOetnN6lnOetnN6llN6tnN6lnOet nN6llN6tnN6lnOetnN6llN6tnN6lnOetnN6llN6tnN6lnOetnN6llN6tnN6l nOetnN6llN6tnN6lnOetnN6llN6tnN6lnOetnN6llN6tnN6llOetnN6llN6t nN6llOetnN6llN6tnN6lnOetnN6llN6tnN6lnOetnN6llN6tnN6lnOetnN6l lN6tnN6lnOetnN6llN6tnN6llOetnN6llN6tnN6llOetnN6llN6tnN6lnOet nN6llN6tnN6lnOetnN6llN6tnN6lnOetnN6llN6tnN6lnOetnN6llN6tnN6l nOetnN6llN6tnN6lnOetnN6llN6tnN6lnOetnN6lnOetnN6lnOetnN6lnOet nN6lnOetnN6llN6tnN6lnOetnN6llN6tnN6lnOetnN6llN6tnN6lnOetnN6l lN6tnN6lnOetnN6llN6tnN6lnOetnN6llN6tnN6lnOetnN6lnOetnN6lnOet nN6lnOetnN6llOetnN6llN6tnN6llOetnN6llN6tnN6lnOetnN6lnOetnN6l nOetnN6lnOetnN6llOetnN6llN6tnN6llOetnN6llN6tnN6lnOetnN6llN6t nN6lnOetnN6llN6tnN6lnOetnN6llN6tnN6lnOetnN6llN6tnN6lnOetnN6l lN6tnN6lnOetnN6llN6tnN6llADnrZzerZznrZzepZznrZzerZznrZzepZzn rZzerZznrZzepZznrZzerZznrZzepZznrZzerZznrZzepZznrZzerZznrZze pZznrZzepZznrZzepZTnrZzepZznrZzepZTnrZzepZznrZzepZTnrZzepZzn rZzepZTnrZzepZznrZzepZTnrZzepZznrZzepZTnrZzerZznrZzepZznrZze rZznrZzepZznrZzerZznrZzepZznrZzerZznrZzepZznrZzepZznrZzepZTn rZzepZznrZzepZTnrZzepZznrZzepZTnrZzepZznrZzepZTnrZzerZznrZze pZznrZzerZznrZzepZznrZzepZznrZzepZTnrZzepZznrZzepZTnrZzepZzn rZzepZTnrZzepZznrZzepZTnrZzerZznrZzepZznrZzerZznrZzepZznrZze rZznrZzepZznrZzerZznrZzepZznrZzerZznrZzepZznrZzerZznrZzepZzn rZzerZznrZzepZznrZzerZznrZzepZznrZzepZznrZzepZTnrZzepZznrZze pZTnrZzepZznrZzepZTnrZzepZznrZzepZTnrZzepZznrZzepZTnrZzepZzn rZzepZTnrZzerZznrZzepZznrZzerZznrZzepZznrZzerZznrZzepZznrZze rZznrZzepZznrZzerZznrZzepZznrZzerZznrZzepZznrZzerZznrZzepZzn rZzerZznrZzepZznrZzerZznrZzerZTnrZzerZznrZzerZTnrZzerZznrZze rZTnrZzerZznrZzerZTnrZzerZznrZzepZznrZzerZznrZzepZznrZznrZzn rZzerZznrZznrZznrZzerZznrZznrZznrZzerZznrZznrZznrZzerZznrZzn rZznrZzerZznrZznrZznrZzerZznrZznrZznrZzerZznrZznrZznrZzerZzn rZznrZznrZzerZznrZznrZznrZzerZznrZznrZznrZzerZznrZznrZznrZze rZznrZznrZznrZzerZznrZznrZznrZzerZznrZznrZznrZzerZznrZznrZzn rZzerZzerZzerZzntaXnrZznrZzerZznrZznrZzvtaXntaXvtaXnrZzntaXn rZznrZznrZzntaXnrZznrZznrZzntZznrZznrZznrZznrZznrZznrZznrZzn rZznrZznrZznrZznrZznrZznrZznrZznrZznrZznrZzerZznrZznrZznrZzn rZznrZznrZznrZzerZznrZznrZznrZzerZznrZznrZznrZzerZznrZzerZzn rZzerZTnrZzerZznrZzerZTnrZzerZznrZzepZznrZzerZznrZzepZznrZze rZznrZzepZznrZzerZznrZzepZznrZzerZznrZzepZznrZzerZznrZzepZzn rZzerZznrZzepZznrZzerZznrZzepZznrZzerZznrZzepZznrZzerZznrZze pZznrZzerZznrZzepZznrZzerZznrZzepZznrZzerZznrZzepZznrZzerZzn rZzepZznrZzerZznrZzepZznrZzerZznrZzepZznrZzerZznrZzepZznrZze rZznrZzepZznrZzepZznrZzepZTnrZzepZznrZzepZTnrZzerZznrZzepZzn rZzerZznrZzepZznrZzerZznrZzepZznrZzerZznrZzepZznrZzepZznrZze pZTnrZzepZznrZzepZTnrZzepZznrZzepZTnrZzepZznrZzepZTnrZznraXn raXepZTnrZznrZznrZzepZznrZzepZznrZzepZznrZzepZznrZzepZznrZze pZzerZzepZTnrZzepZzerZzepZTnrZzepZznrZzepZznrZzepZznrZzepZzn rZzepZzerZzepZTnrZzepZzerZzepZTnrZzepZTnrZzepZTnrZzepZTnrZze pZTnrZzepZznrZzepZznrZzepZznrZzepZznrZzepZznrZzepZznrZzepZzn rZzepZznrZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZzerZzepZTnrZze pZzerZzepZTnrZzepZznrZzepZznrZzepZznrZzepZznrZzepZzerZzepZTn rZzepZzerZzepZTnrZzerZznrZzepZznrZzerZznrZzepZznrZzepZznrZze pZznrZzepZznrZzepZznrZzepZznrZzepZznrZzepZznrZzepZznrZzepZzn rZzepZznrZzepZznrZzepZznrZzerZznrZzepZznrZzerZznrZzepZznrZze pZTerZzepZTnrZzepZTerZzepZTnrZzerZznrZzepZznrZzerZznrZzepZzn rZzepZTnrZzepZTnrZzepZTnrZzepZTnrZzepZznrZzepZznrZzepZznrZze pZznrZzepZzerZzepZTnrZzepZzerZzepZTnrZzepZznrZzepZznrZzepZzn rZzepZznrZwABAAAACcB//8cAAAA+wKc/wAAAAAAAJABAAAAAARAACJWZXJk YW5hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAtAQEABAAAAAIBAQAF AAAACQIAAAACDQAAADIKZAAAAAEABAAAAAAA7BPIGSCtIwANAAAAMgpkACMA AQAEAAAAAADsE8gZIK1LAAQAAAACAQEAUwAAADIK3gAAADAABAAAAAAA7BPI GSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICMAIwAjACMAIwAjACMAIwAkACMAIwAjACMAIwAkACMAIwAjACMAIwAj ACQAIwAjACMAIwAjACQAJAAjACMAIwAjACMAIwAjACMAJAAjACMAIwAjACMA JAAjACMAIwAjAA0AAAAyCt4AlwYBAAQAAAAAAOwTyBkgrSMADQAAADIK3gC6 BgEABAAAAAAA7BPIGSCtIwANAAAAMgreAN0GAQAEAAAAAADsE8gZIK1MAAQA AAACAQEAHAAAAPsCnP8AAAAAAACQAQAAAAAEQAASVGltZXMgTmV3IFJvbWFu AAAAAAAAAAAAAAAAAAAAAAAEAAAALQECABEAAAAyClIBAAAEAAQAAAAAAOwT yBkgICAgGQAZABkAGQANAAAAMgpSAWQAAQAEAAAAAADsE8gZIK0tAAQAAAAC AQEADQAAADIKygEAAAEABAAAAAAA7BPIGSCtLQAcAAAA+wKc/wAAAAAAALwC AAAAAARAABJUaW1lcyBOZXcgUm9tYW4AAAAAAAAAAAAAAAAAAAAAAAQAAAAt AQMABAAAAC0BAwAEAAAALQEDABwAAAD7Aov/AAAAAAAAkAEAAAAABEAAEkNh c3RlbGxhcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAC0BBAAEAAAAAgEB AAQAAAAtAQMAXgAAADIKTgIAADcABAAAAAAA7BPIGSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGQAZ ABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkA GQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAGQAZ ABkAGQAZABkAGQAZABkAGQAQAAAAMgpOAl8FAwAEAAAAAADsE8gZICAgBhkA GQAZABwAAAD7Aov/AAAAAAAAkAEAAAAABEAAEENhc3RlbGxhcgAAAAAAAAAA AAAAAAAAAAAAAAAAAAAABAAAAC0BBQAEAAAALQEEAAUAAAAJAoCAAAIUAAAA MgpOAqoFBgAEAAAAAADsE8gZWUFIT08gXwBfAGoAZQBlACkABQAAAAkC/5kA AhQAAAAyCk4CxQcGAAQAAAAAAOwTyBlBV0FSRFNfAIEAXwBaAGUAOAAFAAAA CQKAgAACDQAAADIKTgL7CQEABAAAAAAA7BPIGSCtKgAFAAAACQIzM5kCFgAA ADIKTgIlCgcABAAAAAAA7BPIGUNFTlRFUi4gWgBDAGoAVABCAFoAHAAHAAAA /AIAAICAAAIAAAQAAAAtAQYADAAAAEAJIQDwAAAAAAAAAAYAGwJaAqoFBwAA APwCAAD///8AAAAEAAAALQEHAAQAAADwAQYABwAAAPwCAAD/mQACAAAEAAAA LQEGAAwAAABACSEA8AAAAAAAAAAGADYCWgLFBwQAAAAtAQcABAAAAPABBgAH AAAA/AIAAICAAAIAAAQAAAAtAQYADAAAAEAJIQDwAAAAAAAAAAYAKgBaAvsJ BAAAAC0BBwAEAAAA8AEGAAcAAAD8AgAAMzOZAgAABAAAAC0BBgAMAAAAQAkh APAAAAAAAAAABgATAloCJQoEAAAALQEHAAQAAADwAQYABQAAAAkCgIAAAg0A AAAyCk4COAwBAAQAAAAAAOwTyBkgrTUABQAAAAkCAAAAAhwAAAD7Ar3/AAAA AAAAvAIAAAAABEAAElRpbWVzIE5ldyBSb21hbgAAAAAAAAAAAAAAAAAAAAAA BAAAAC0BBgAEAAAALQEGAAQAAAACAQEADQAAADIKrQIAAAEABAAAAAAA7BPI GSCtEQANAAAAMgqtAhEAAQAEAAAAAADsE8gZIK0kABwAAAD7Aq3/AAAAAAAA vAIAAAAABEAAElRpbWVzIE5ldyBSb21hbgAAAAAAAAAAAAAAAAAAAAAABAAA AC0BCAAEAAAAAgEBABwAAAD7Aq3/AAAAAAAAvAIAAAAABEAAEFRpbWVzIE5l dyBSb21hbgAAAAAAAAAAAAAAAAAAAAAABAAAAC0BCQAEAAAALQEIAAUAAAAJ ApkzAAIoAAAAMgoJAwAAEwAEAAAAAADsE8gZQlJJVElTSCBNSUNST1NPRlQg RQA4ADwAIAA3ACEALgBBABUAUAAgADwAPABBAC4AQQAzADcAFQA3AA0AAAAy CgkDvgMBAAQAAAAAAOwTyBktrRwAOAAAADIKCQPaAx4ABAAAAAAA7BPIGU1B SUwgU0VMRUNURUQgQVdBUkQgRlJPTSBIRUFEIFAAPAAgADcAFQAuADcAOAA3 AD0ANwA3ADwAFQA9AFMAPAA9ADwAFQAzADwAQQBPABUAQQA3ADwAPAAVACgA AAAyCgkDFQoTAAQAAAAAAOwTyBlPRkZJQ0VTIChVSykgTE9ORE9OAEEAMwAz ACAAPAA3AC4AFgAcADwAQQAcABUANwBBADwAPABBADwALwAAADIKCQPKDRgA BAAAAAAA7BPIGSBPTiBUSEUgTU9OVEggT0YgSkFOVUFSWRUAQQA8ABUANwBB ADcAFQBPAEEAPAA3AEEAFQBBADMAFQAqADwAPAA8ADwAPAA8AA0AAAAyCgkD qRIBAAQAAAAAAOwTyBksrRUAEwAAADIKCQO+EgUABAAAAAAA7BPIGSAyMDEx UhUAKgAqACoAKQAHAAAA/AIAAJkzAAIAAAQAAAAtAQoADAAAAEAJIQDwAAAA AAAAAAgAehMSAwAABAAAAC0BBwAEAAAA8AEKAA0AAAAyCgkDehMBAAQAAAAA AOwTyBkgrS0ABQAAAAkCAAAAAhwAAAD7AqT/AAAAAAAAvAIAAAAABEAAEkJh c2tlcnZpbGxlIE9sZCBGYWNlAAAAAAAAAAAAAAAABAAAAC0BCgAEAAAAAgEB AB8AAAAyCmwDAAANAAQAAAAAAOwTyBlCcml0aXNoIE1pY3JvAz4AIAAWABgA FgAhADAAFwBSABYAJgAgADAAGgAAADIKbAPoAQoABAAAAAAA7BPIGXNvZnQg QXdhcmQgADAAGgAXABcAQAA4ACcAIAAxAA0AAAAyCmwDcAMBAAQAAAAAAOwT yBkgrUoABAAAAAIBAQAgAAAAMgrVAwAADgAEAAAAAADsE8gZSGVhZHF1YXJ0 ZXJzOiBLACkAJwAwAC8ALwAnACAAGAApACAAIQAWABcAJQAAADIK1QMfAhEA BAAAAAAA7BPIGUN1c3RvbWVyIHNlcnZpY2UgSj4ALgAhABgALwBKACkAIAAX ACEAKAAgACYAFgAnACkAGAANAAAAMgrVA6oEAQAEAAAAAADsE8gZIK0tAAQA AAACAQEALgAAADIKPQQAABcABAAAAAAA7BPIGTY4IE5ld21hbiBTdHJlZXQu IENpdHksWS0ALQAXAEYAKQA4AEoAJwAwABcAMAAYACAAKQApABgAFgAXAD4A FgAYACYAFgANAAAAMgo9BHcDAQAEAAAAAADsE8gZIK0tAAQAAAACAQEAJQAA ADIKpgQAABEABAAAAAAA7BPIGUxvbmRvbi4gQ291bnRyeSwgIDgAMAAwADAA MAAwABYAFgA+ADAALwAvABgAIAAmABYAFgANAAAAMgqmBKoCAQAEAAAAAADs E8gZIK0nBw0AAAAyCqYE0QkBAAQAAAAAAOwTyBkgrS4AAwAAAB4ABwAAABYE yBnsEwAAAAAEAAAAJwH//wQAAAACAQEAPQAAADIKDgUAACEABAAAAAAA7BPI GVVuaXRlZCBLaW5nZG9tLiBQb3N0YWwvWmlwIENvZGUsIABFADAAFgAYACkA MAAXAEEAFgAwACYAMAAwAEoAFgAXADUALwAhABgAJwAWABsAOAAWADAAFwA+ ADAAMAApABYAFwANAAAAMgoOBRUFAQAEAAAAAADsE8gZIK0tAAQAAAACAQEA FgAAADIKdwUAAAcABAAAAAAA7BPIGVcxVCAzRUYgYQAtAD8AFwAtADkAMgAN AAAAMgp3BXwBAQAEAAAAAADsE8gZIK0YAA0AAAAyCncFlAEBAAQAAAAAAOwT yBkgrS0ABAAAAAIBAQANAAAAMgrgBQAAAQAEAAAAAADsE8gZIK0uAAQAAAAC AQEAHAAAAPsCnP8AAAAAAACQAQAAAAAEQAASQ2FzdGVsbGFyAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAEAAAALQELAAUAAAAJAjMzmQIUAAAAMgpUBgAABgAE AAAAAADsE8gZQVRUTjogUQBIAEgAWwAYACQAEwAAADIKVAZ4AQUABAAAAAAA 7BPIGURFQVIgIFcAOQBRAE0AJAAWAAAAMgpUBsoCBwAEAAAAAADsE8gZV0lO TkVSLCBuACYAWwBbADkATQAYAA0AAAAyClQGsgQBAAQAAAAAAOwTyBkgrS0A BQAAAAkCAAAAAgQAAAACAQEAHAAAAPsCvf8AAAAAAAC8AgAAAAAEQAAiVmVy ZGFuYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAALQEMAA0AAAAyCrUG AAABAAQAAAAAAOwTyBkgrTAABAAAAAIBAQA4AAAAMgoGBwAAHgAEAAAAAADs E8gZWU9VUiBFTUFJTCBBRERSRVNTRVMgSEFWRSBKVVNUMQA5ADYANAAXAC4A PwA0ACQAKwAXADMANwA4ADQALgAvAC8ALgAwABYANwA0ADMALgAXACUANgAv AC4ADQAAADIKBgdjBQEABAAAAAAA7BPIGSCtFgAUAAAAMgoGB3kFBgAEAAAA AADsE8gZV09OIEEgTAA4ADkAFwAzABcAHAAAAPsCvf8AAAAAAAC8AgAAAAAE QAAgVmVyZGFuYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAALQENAAQA AAAtAQwAEwAAADIKBgeXBgUABAAAAAAA7BPIGVlBSE9PIDEANAA4ADkAOAAH AAAA/AIAAAAAAAIAAAQAAAAtAQ4ADAAAAEAJIQDwAAAAAAAAAAcADgELB5cG BAAAAC0BBwAEAAAA8AEOABAAAAAyCgYHpQcDAAQAAAAAAOwTyBkgJiAGFwA5 ABcABAAAAC0BDAAdAAAAMgoGBwwIDAAEAAAAAADsE8gZV0lORE9XUyBMSVZF SwAlADgAOAA4AEsAMAAXACoAJQAzAC0ABwAAAPwCAAAAAAACAAAEAAAALQEO AAwAAABACSEA8AAAAAAAAAAHAFkCCwcMCAQAAAAtAQcABAAAAPABDgAiAAAA MgoGB2UKDwAEAAAAAADsE8gZIFBSSVpFIE1PTkVZIE9GABcAMQA0ACUALQAu ABcAPwA4ADkALgAxABcAOAAsAA0AAAAyCgYHAg0BAAQAAAAAAOwTyBkgrRcA HwAAADIKBgcZDQ0ABAAAAAAA7BPIGShPTkUgTUlMTElPTiAHJAA4ADkALQAX AD8AJAArACoAJQA5ADgAFwApAAAAMgoGB1cPFAAEAAAAAADsE8gZVFdPIEhV TkRSRUQgJiBGSUZUWSAtAEsAOQAXADgANgA4ADgANAAtADgAFwA5ABcAKwAk ACwALgAxABYABAAAAAIBAQAZAAAAMgpXBwAACQAEAAAAAADsE8gZVEhPVVNB TkQgSS4AOAA5ADUAMAA0ADgAOAAXAC8AAAAyClcHvwEYAAQAAAAAAOwTyBlC UklUSVNIIFBPVU5EUyBTVEVSTElORykzADMAJQAtACQAMAA4ABcAMQA5ADUA OAA4AC8AFwAvAC4ALgAzACsAJAA5ADYAJAAmAAAAMgpXBw8GEgAEAAAAAADs E8gZIChHQlCjMSwyNTAsMDAwLjAwFwAkADYAMwAxAC8AMAAYAC8ALwAvABgA MAAvADAAGAAvADAADgAAADIKVwcGCQIABAAAAAAA7BPIGSkgJAAXADcAAAAy ClcHQQkdAAQAAAAAAOwTyBlJTiBUSEUgQkVHSU5OSU5HIE9GIFlFQVIgMjAx MQckADkAFgAuADgALQAXADMALgA1ACUAOAA5ACQAOAA2ABcAOQAsABcAMAAu ADQANAAWADAALwAwAC8ADQAAADIKVwdJDgEABAAAAAAA7BPIGSCtFwATAAAA MgpXB2AOBQAEAAAAAADsE8gZQVdBUkQgMwBMADQANAA3ABwAAAAyClcHfg8L AAQAAAAAAOwTyBkgUFJPTU9USU9OLgAXADAANAA5AD8AOQAuACQAOQA5ABgA GQAAADIKVweGEQkABAAAAAAA7BPIGSBXSU5ORVJTIE4WAEsAJQA4ADkALgAz ADAAFgAEAAAAAgEBAGsAAAAyCqgHAABAAAQAAAAAAOwTyBlFTUVSR0UgVEhS T1VHSCBSQU5ET00gU0VMRUNUSU9OIE9GIEFMTCBBQ1RJVkUgRU1BSUwgU1VC U0NSSUJFUlMgLgA/AC4ANAA2AC4AFgAuADgANAA5ADYANgA4ABcANAAzADgA OAA4AD8AFwAwAC0AKwAuADAALQAlADgAOQAXADgALAAXADMAKgArABcANAAw AC0AJAAzAC4AFwAuAD8AMwAlACoAFwAwADYAMgAwADAANAAlADIALgA0AC8A FwAWAAAAMgqoB3QLBwAEAAAAAADsE8gZT05MSU5FLiA4ADkAKgAlADgALgAY AA0AAAAyCqgHsgwBAAQAAAAAAOwTyBkgrRcALgAAADIKqAfJDBcABAAAAAAA 7BPIGVNJWCBBUkUgU0VMRUNURUQgWUVBUkxZAC8AJQAzABYANAA0AC4AFgAw AC0AKwAuADAALQAtADgAFgAxAC4ANAA0ACsAMQANAAAAMgqoB8MQAQAEAAAA AADsE8gZIK0WACMAAAAyCqgH2RAQAAQAAAAAAOwTyBlUTyBCRU5FRklUIEZS T00gLgA5ABcAMgAuADgALgArACQALgAXACwAMwA5AD8AFgAEAAAAAgEBAAQA AAAtAQwAIgAAADIK+QcAAA8ABAAAAAAA7BPIGVRISVMgUFJPTU9USU9OLiAu ADgAJAAwABcAMQA0ADkAPgA5AC0AJQA4ADkAGAAcAAAA+wKt/wAAAAAAALwC AAAAAARAACJWZXJkYW5hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAt AQ4ADQAAADIK+QfBAgEABAAAAAAA7BPIGSCtSgAEAAAAAgEBAAQAAAAtAQwA DQAAADIKSggAAAEABAAAAAAA7BPIGSCtFwANAAAAMgpKCBcAAQAEAAAAAADs E8gZIK0wAAQAAAACAQEABAAAAC0BCwAFAAAACQIAYL8CJgAAADIKswgAABIA BAAAAAAA7BPIGVBheW1lbnQgb2YgUHJpemUgYT8AUQBRAGkAOQBbAEgAJABX ADkAJAA/AE0AJgBDADkAJABRABcAAAAyCrMIoQQIAAQAAAAAAOwTyBluZCBD bGFpbVsAVwAkAE0APwBRACYAaQAHAAAA/AIAAABgvwIAAAQAAAAtAQ8ADAAA AEAJIQDwAAAAAAAAAAUA4wa9CAAABAAAAC0BBwAEAAAA8AEPAA0AAAAyCrMI 4wYBAAQAAAAAAOwTyBkgrS0ABQAAAAkCAAAAAgQAAAACAQEABAAAAC0BDABx AAAAMgoUCQAARAAEAAAAAADsE8gZV0lOTkVSUyBBUkUgVE8gQkUgUEFJRCBJ TiBBQ0NPUkRBTkNFIFdJVEggSElTL0hFUiBTRVRUTEVNRU5UIENFTlRFUi5M ACQAOQA4AC4ANAAvABcANAA0AC4AFgAuADkAFgAzAC4AFwAwADQAJAA3ABcA JQA4ABcANAAwADAAOQA0ADgAMwA5ADAALgAWAEsAJQAuADcAFwA4ACQAMAAu ADgALgA0ABYAMAAtAC0ALgAqAC4APwAuADgALgAXADAALQA5AC0ALQA0ABgA DQAAADIKFAkZDAEABAAAAAAA7BPIGSCtFwArAAAAMgoUCTAMFQAEAAAAAADs E8gZVEhJUyBQUklaRSBBV0FSRCBNVVNUTC4AOAAkADAAFwAxADMAJQAuAC4A FgA0AEsANAA0ADgAFwA/ADUAMAAuACgAAAAyChQJBBATAAQAAAAAAOwTyBkg QkUgQ0xBSU1FRCBJTiBOT1QgUxYAMwAuABcALwArADQAJQA+AC4ANwAXACQA OQAXADgAOQAtABYABAAAAAIBAQAfAAAAMgplCQAADQAEAAAAAADsE8gZTEFU RVIgVEhBTiAzMAkrADQALQAuADQAFwAtADgANAA4ABcALwAwAIMAAAAyCmUJ TAJQAAQAAAAAAOwTyBkgREFZUyBGUk9NIERBVEUgT0YgRFJBVyBOT1RJRklD QVRJT04gQUZURVIgV0hJQ0ggVU5DTEFJTUVEIFBSSVpFUyBBUkUgQ0FOQ0VM TEVELhYAOAA0ADEALwAXACwANAA4AD8AFwA4ADQALQAuABcAOAAsABYAOAA0 ADMATAAWADkAOQAtACQALAAlAC8ANAAuACQAOQA5ABYANAArAC4ALgA0ABYA TAA3ACUAMAA4ABcANQA5ADAAKwA0ACUAPgAuADgAFgAxADQAJQAuAC0AMAAX ADQAMwAuABcAMAAzADkAMAAuACsAKgAtADgAGAANAAAAMgplCYkQAQAEAAAA AADsE8gZIK0vABwAAAD7Apz/AAAAAAAAvAIAAAAABEAAIlZlcmRhbmEAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAC0BDwAEAAAALQEPAAQAAAAtAQ8A BAAAAC0BDwAEAAAAAgEBADoAAAAyClsKAAAfAAQAAAAAAOwTyBkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgACIAIgAiACIAIgAiACIAIwAiACIA IgAiACMAIgAiACIAIgAiACMAIgAiACIAIgAjACIAIgAiACIAIwAiACIAEAAA ADIKWwojBAMABAAAAAAA7BPIGSAgIAYiACIAIgAUAAAAMgpbCokEBgAEAAAA AADsE8gZICAgICAgIgAiACMAIgAiACMAAwAAAB4ABwAAABYEyBnsEwAAAAAD AAAAHgAEAAAALAEAAAQAAAAHAQQACAAAACYGDwAGAFROUFAGAa0BAABBC4YA 7gAxAHEAAAAAAOoAdQRxCVcFKAAAAHEAAAAxAAAAAQABAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAf 5/z/D/+f4f7gAAAAAAAAH+f8/5////P/4AAAAAAAAB/3/P+////z/+AAAAAA AAAf8/z/////8//AAAAAAAAAH/P+//////P+AAAAAAAAAB/z/n//n//z/wAA AgAAAAAP8/5/////8f8AAB8AAAAAD/v+f8P///H/AGAfgAAAAA/5/n/P///5 /wDwHwAAAAAP+f9/3///+f8B8cYAAAAAD/n/P///7/n/A//gAAAAAA/5/z// /8/5/4f/+AAAAAAH/f9///+P/P+P//gAAAAAB///////5///n//8AAAAAAf/ ////5////5///AAAAAAH//////////+///wAAAAAB//////////////8AAAA AAP//////+f//////AAAAAAD////n//D//////wAAAAAA//4/wf/g//////8 AAAAAAHx8D4B/wHx8////AAAAAAAAAAAAAAAAAf///wAAAAAAAAAAAAAAAAH ///+AAAAAAAAAAAAAAAAD////gAAAAAAAAAAAAAAAB////4AAAAAAAAAAAAA AAAf///+AAAAAAAAAAAAAAAAP/j//gAAAAAAAAAAAAAAAD/gf/4AAAAAAAAA AAAAAAA/gH/+AAAAAAAAAAAAAAAAPgA//gAAAAAAAAAAAAAAABAAH/4AAAAA AAAAAAAAAAAAAA/8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAPgA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsNAABB C8YAiAAxAHEAAAAAAOoAdQRxCVcFKAAAAHEAAAAxAAAAAQAIAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAD///8AqsnxAHKp7gBMkfAAjLXqAOTn6gA/ eOoAMWDmAGOg7QDs6+gAxtn2AMfHwgBlhc4A2MavANG1kADPqHQA3dC+AOnj 2QDSoVUAwpdHAM6RGADS1doA2NTNAN7f3wDg3NUAlau8ALaGTAC7bV0AXqTJ AEmk8QCIlRIAoHyBAPPz8gDw8O4AvplqAL+zogCscigAtJBhAFalDACvfTwA wqN7AKhpHACmYQ0ApVoBAKNVAAC9qpEAxrurAFiW2gCcSwAAoFAAALagggCm XQAAL6/pAEiz2AAhx/gA7fH1APbt8wClyZwAhLhnAGS1TwBrvW0A3OPpAOjt 8gBvtpQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXx8fAEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBfHx8AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQF8fHwBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAXx8fAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBfHx8 AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBBgoGCj8+AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQF8fHwBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBGQ4kMykuJAwYAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAXx8fAEBAQEBAQEBAQEBDw4vLy8vLxgBARkRLy8vLyQMPgEBES8vLy8v LwwBAQEBGA8bKissLSslGy4MPgEBFw4vLy8vLxkBAQEBDi8vLy8vEQoBEREY AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBfHx8AQEBAQEBAQEBAQEo JSoqKiooLwEBDiUqKioqKiMYAQETJSoqKioqLgYBAQ4bKy0sNDQrNCwsKhsu FhkbKioqKiooLwYBASglKioqKiouPw4mJgwBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQF8fHwBAQEBAQEBAQEBASotLS0tMiokBgEOLC0tLS0yGxcB ARsyLS0tLS0jPgEPKjItNDQ0NDQ0NCwtLSozDCgxLS0tMisuPwEBJS0tLS0t LSYYDyUoDgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXx8fAEBAQEB AQEBAQEBFDQ0NDQsKi4GAQEqLDQ0NCwoDAEBEC00NDQ0LBsWDiotNDQ0LC0y Mi0sNDQsLSouGyw0NDQsNCYGAQEpKyw0NDQtJhgOIykBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBfHx8AQEBAQEBAQEBAQEQLDQ0NDQsJhgBASU0 NDQ0LCUvIgEOLDQ0NDQsGy8oMjQ0NCwsKBsmKDQsNDQsLSgmKyw0NDQsGxgB AQ8rLTQ0NC0oDAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQF9 fX0BAQEBAQEBAQEBAQ40LDQ0NC0mFgEBGyw0NDQsKiQGAQEqLDQ0NCwoLig0 LS0tLCMRAQESJi00NDQsJSYqLDQ0NCwoFwEBDiotNDQ0LSUvPwEBAQEBAQEB AQEBAQEBAQEBAQEBAQEhAQEBAQEBAQEBAX19fQEBAQEBAQEBAQEBASssNDQ0 LSgMAQEQLTQ0NDQ0Mz4BASUsNDQ0LCokLiYPJiUpIiEGBgwbLTQ0NCwqJios NDQ0LSUMAQEBKi00NDQsKy4/AQEBAQEBAQEBAQEBAQEBAQEBASI+GBgYAQEB AQEBAQEBfX19AQEBAQEBAQEBAQEBJSw0NDQsJS8iAQ8sNDQ0NCwjGAEBKC00 NDQsKy4ZAQEBARk+DikbJSs0NDQ0LCsjJSw0NDQtKiQBAQElLCw0NCwrMwYB AQEBAQEBAQE/IgEBAQEBAQEBEQ8zGy8iAQEBAQEBAQF9fX0BAQEBAQEBAQEB AQEbLDQ0NCwqJD8BASssNDQ0LBsXAQEmMjQ0NCw0IxYBASIOIyUrKzQ0NDQ0 NDQsKy4bLDQ0NCwrMz8BASYsLDQ0LCwjGAEBAQEBAQEBGS8MBgEBAQEBAQEp DxQoDgEBAQEBAQEBAX19fQEBAQEBAQEBAQEBASYtNDQ0LCszGAEBJSw0NDQs KAwhAQ8tNDQ0LDQmFwEKKSstNDQ0NDQ0NDQ0LC0oFyMsLDQ0LCwjBgEBKSws NDQsLSYWAQEBAQEBATonJyYXAQEBEhgWAQEBDhEBAQEBAQEBAQEBfX19AQEB AQEBAQEBAQEBDy00NDQ0LCMYAQEoLTQ0NCwlLzgBASssNDQ0LCgXCiMtLDQ0 NDQ0NDQ0NDQtKi4BLissNDQsLCYWAQEPKyw0NDQsKAwBAQEBAQE6JycnPAw5 CgIaGiQWAQEBAQEBAQEBAQEBAQF9fX0BAQEBAQEBAQEBAQEONDQ0NDQsGxcB ASYtNDQ0LCskPwEBJS00NDQsJQwuLCw0NDQ0NDQ0LCwsLCgQAQEPKyw0NDQt KBcBAQ4rLTQ0NCwqLzgBAQEBOjw8PCcnJBYFNTU1HRoYIgEBAQEBAQEBAQEB AX19fQEBAQEBAQEBAQEBAQElLDQ0NCwbDDgBEC00NDQsNCMYAQ4lLTQ0NCwq JCYtNDQ0NDQsLCsrKhskGQEBAREqLTQ0NC0lLwYBASUtNDQ0LCskIgEBAQw9 PTw8JydANTc3Nzc3HS8KAQEBAQEBAQEBAQEBfX19AQEBAQEBAQEBAQEBASgt NDQ0LCokPjgpLTQ0NCwsGww4FyUtNDQ0LCopGyw0NDQ0NCooEw8REhYYPzgB ASUtNDQ0LCszFjgXKC00NDQsKzMGAQE+Oj09PT08PDY3Nzc3Nzc1HQwiAQEB AQEBAQEBAQF9fX0BAQEBAQEBAQEBAQEBGy00NDQ0NCguLiUsNDQ0NCwqIyQj Kyw0NDQsKyMbLDQ0NCwqLhcBARIjGzMuJBEXGy00NDQ0LCUzLykrLDQ0NCws MwYBAQw9PDw8PTsgHTc3Nzc3Nzc2LxIBAQEBAQEBAQEBAX19fQEBAQEBAQEB AQEBAQEQMjQ0NDQ0LCsrLDQ0NDQ0NCwrKyssNDQ0NCwrLiMtNDQ0LCopDAwv Gy0tNCsqIxgpLCw0NDQ0LCsqKyw0NDQ0LCwzOAEYOycnJyc8GyA2Nzc3Nzc3 NzUaGQEBAQEBAQEBAQEBfn5+AQEBAQEBAQEBAQEBAQ8tNDQ0NDQsLCw0NDQ0 NDQsLC0sLDQ0NDQ0LCsODistNDQ0NColKCosLDQsLS0pOA8sLDQ0NDQsLCws NDQ0NDQtKyQ4OTonJycnJyccIDY1Hh4eHjU3NR0XAQEBAQEBAQEBAQF+fn4B AQEBAQEBAQEBAQEBASssNDQ0KyUsLTQ0NDQ0LSomKi00NDQ0NDQyJRkiECwt LDQ0LCwsLDQ0NC0tJgEBDiwsNDQ0KyUsLTQ0NDQ0NDIlGQoOFCcnJycnKBwg HgQEBAcECAQ3NhYBAQEBAQEBAQEBAX5+fgEBAQEBAQEBAQEBAQEBKjEyMTEy MyY0MjItLTIsIxkuKi0yLS0tMSoPAQEKIyssMi0sNCwsLC0yKyYBAQEBKzEx MTEyJiMrMjItLTIyKi8iDhAUJycnJx8cHB0eCQQEBAcHCDU2FgEBAQEBAQEB AQEBfn5+AQEBAQEBAQEBAQEBAQEjKBsbGxsOGSkbJSoqJSMBAQEQJSUqKiUb DwEBAQEBJiglKissLSsrJSguAQEBAQEUGxsbGygvBg8oJSoqJSUpIQ4QEBMV JycnHxwcMB4eBAQEBwcICB0ZAQEBAQEBAQEBAQF+fn4BAQEBAQEBAQEBAQEB AQEhISEhIgEBARIPIxMRAQEBAQEBDiMTJBgBAQEBAQEBAQ4jJSUmJRsPEQEB AQEBAQEhISEhIgEBARIOIyMPAQEOEBATEx8fHyclHCADHgQEBAQEBwgIDQwB AQEBAQEBAQEBAX5+fgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB GRATExMTFR8fHxwcDR4JHgQEBAcICAgHDAEBAQEBAQEBAQEBfn5+AQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEPExMTExUVFR8VHCAJHgkJBAQE BAcICAgaGAEBAQEBAQEBAQF+fn4BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBDxMTExUVFRUVFRscHR4JHgQEBAcHCAgICBoZAQEBAQEBAQEBAX5+ fgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARkTFBUVFRUVFRUTDxoF BAQEBAQICAgICAgIDRcBAQEBAQEBAQEBfn5+AQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBDxUVFRUVFRUVExEKCwUJBAcECAgICAgICAgNGQEBAQEB AQEBAQF+fn4BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARcUFRUVFRUV FQ8YAQEBAgMEBAgICAgICAgICA0XAQEBAQEBAQEBAX5+fgEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBExUVFRUVFRAPAQEBAQEBBQkEBwgICAgICAgI DRcBAQEBAQEBAQEBfn5+AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQET FBUVExAPAQEBAQEBAQELBQQHCAgICAgICAgNFgEBAQEBAQEBAQF+fn4BAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ4PEA8RAQEBAQEBAQEBAQELAwQH CAgICAgICA0SAQEBAQEBAQEBAX5+fgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQoBAQEBAQEBAQEBAQEBAQELAwQICAgICAgIDQoBAQEBAQEBAQEB fn5+AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQELAgQHCAgICAgMAQEBAQEBAQEBAQF+fn4BAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgMHBwgICQoBAQEB AQEBAQEBAX9/fwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQIDBAUGAQEBAQEBAQEBAQEBf39/AQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQF/f38BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAX9/fwEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBf39/AQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQED3wEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQAAAAgAAAAmBg8ABgBUTlBQBwEEAAAAJwH//wQA AAAnAf//BAAAAC0BDwAOAAAAMgpbCswJAgAEAAAAAADsE8gZICAiACIADQAA ADIKWwoQCgEABAAAAAAA7BPIGSCtRwAcAAAA+wJJ/wAAAAAAALwCAAAAAARA ACJWZXJkYW5hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAtARAABAAA AC0BDwAEAAAAAgEBABwAAAD7Aov/AAAAAAAAvAIAAAAABEAAEkNhc3RlbGxh cgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAC0BEQAFAAAACQIAQH8CHQAA ADIK3AoAAAwABAAAAAAA7BPIGVdJTk5FUiBOTzogNIEALQBqAGoAQwBaACoA agBlABwAKgBDAAQAAAAtARAADQAAADIK3AqhAwEABAAAAAAA7BPIGSCtPgAE AAAALQEPAAUAAAAJAgAAAAINAAAAMgrcCt8DAQAEAAAAAADsE8gZIK1LAAQA AAACAQEABAAAAC0BDgATAAAAMgpRCwAABQAEAAAAAADsE8gZdGhlc2UgJgA7 ADcAMQA4AA0AAAAyClELAQEBAAQAAAAAAOwTyBkgrR0ADQAAADIKUQseAQEA BAAAAAAA7BPIGWGtNwA4AAAAMgpRC1UBHgAEAAAAAADsE8gZcmUgeW91ciBp ZGVudGlmaWNhdGlvbiBudW1iZXJzKQA4ABwANgA6ADsAKgAcABwAOwA3ADsA JwAcACQAHAAxADcAJwAcADkAPAAcADsAPABYADoAOAApADEADQAAADIKUQvm BgEABAAAAAAA7BPIGSCtTAAEAAAAAgEBACAAAAAyCrcLAAAOAAQAAAAAAOwT yBlCYXRjaCBOdW1iZXI6ID8ANwAmADIAOwAdAEYAOwBYADsANwAqACEAHQAa AAAAMgq3C9kCCgAEAAAAAADsE8gZWVBCLzA4L0FQQT0APQBAADoAOwA7ADoA QAA9AEAADQAAADIKtws6BQEABAAAAAAA7BPIGS2tKQATAAAAMgq3C2MFBQAE AAAAAADsE8gZNDM2NTggOwA7ADsAPAA7AA0AAAAyCrcLiwYBAAQAAAAAAOwT yBkgrUwABAAAAAIBAQAlAAAAMgocDAAAEQAEAAAAAADsE8gZUmVmZXJlbmNl IE51bWJlcjoKQQA3ACMAOAApADcAOwAyADcAHQBGADsAWAA7ADcAKgAhAA4A AAAyChwMigMCAAQAAAAAAOwTyBkgIB0AHQAdAAAAMgocDMQDDAAEAAAAAADs E8gZWVBONTYwOTkyMDA4PQA9AEYAPAA7ADsAOwA8ADsAOwA7ADsADQAAADIK HAyZBgEABAAAAAAA7BPIGSCtTAAcAAAA+wKt/wAAAAAAAJABAQAAAARAACJW ZXJkYW5hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAtARIABAAAAAIB AQAEAAAALQEOADgAAAAyCoEMAAAeAAQAAAAAAOwTyBlBd2FyZCBGaWxlIFNl Y3VyaXR5IGNvZGU6ICBVSy9AAFIANwAqADoAHAA3ABwAHQA3ABwAPAA3ADEA PAApABwAJgA3ABwAMgA5ADoANwAiABwAHQBDAEEAOQAcAAAA+wKt/wAAAAAA AJABAAAAAARAACJWZXJkYW5hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQA AAAtARMADQAAADIKgQyeBQEABAAAAAAA7BPIGSutRAAEAAAALQESAA0AAAAy CoEM4gUBAAQAAAAAAOwTyBkgrR0ABAAAAC0BDgAWAAAAMgqBDP8FBwAEAAAA AADsE8gZUVUzNDAwNW1IAEMAOwA7ADwAOwA8AA0AAAAyCoEMswcBAAQAAAAA AOwTyBkgrTsABAAAAAIBAQAlAAAAMgrmDAAAEQAEAAAAAADsE8gZVGhlc2Ug bnVtYmVycyBmYWwDOQA7ADcAMQA4ABwAPAA7AFgAOgA4ACkAMgAcACQANwAd AB0AAAAyCuYMYAMMAAQAAAAAAOwTyBlsIHdpdGhpbiB0aGUcAB0AUgAcACYA OwAdADsAHAAnADsANwANAAAAMgrmDHUFAQAEAAAAAADsE8gZIK0dACAAAAAy CuYMkgUOAAQAAAAAAOwTyBlVbml0ZWQgS2luZ2RvbUMAPAAcACYANwA7ABwA QQAcADsAOwA6ADkAWAANAAAAMgrmDH8IAQAEAAAAAADsE8gZIK0cAEcAAAAy CuYMmwgoAAQAAAAAAOwTyBlmaWxlLiBUaHVzLCB5b3UgYXJlIHJlcXVlc3Rl ZCB0byBjb250YWN0JAAcAB0ANwAeABwAOQA8ADsAMQAfABwANgA6ADsAHQA3 ACoANwAcACoANwA6ADwANwAxACYAOAA6ABwAJgA6ABwAMQA5ADsAJwA3ADIA JgANAAAAMgrmDMsPAQAEAAAAAADsE8gZIK0cACAAAAAyCuYM5w8OAAQAAAAA AOwTyBlvdXIgZmlkdWNpYXJ5IDkAOwAqABwAJAAcADoAOwAyABwAOAApADcA HQAEAAAAAgEBABMAAAAyCkwNAAAFAAQAAAAAAOwTyBlhZ2VudDA3ADoAOAA7 ACYADQAAADIKTA0KAQEABAAAAAAA7BPIGSCtHQAOAAAAMgpMDScBAgAEAAAA AADsE8gZaW4cADsADQAAADIKTA1+AQEABAAAAAAA7BPIGSCtHQBuAAAAMgpM DZsBQgAEAAAAAADsE8gZVW5pdGVkIEtpbmdkb20gYW5kIHNlbmQgeW91ciB3 aW5uaW5nIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgdG8gaGltQwA8ABwAJgA4 ADoAHABBABwAOwA7ADsAOQBYAB0ANwA7ADsAHAAxADgAOwA7ABwANgA5ADwA KQAdAFEAHQA7ADsAHQA7ADoAHQAcADoAOAA7ACYAHAAkABwAMgA3ACYAHAA6 ADsAHQA8ADsAWAA6ADgAKQAyABwAJgA5AB0AOwAcAFgADQAAADIKTA1ZDgEA BAAAAAAA7BPIGSCtPAAEAAAAAgEBAAQAAAAtAQ8ADQAAADIKwQ0AAAEABAAA AAAA7BPIGSCtRwAEAAAAAgEBABwAAAD7AqT/AAAAAAAAkAEAAAAABEAAEkNh c3RlbGxhcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAC0BFAAFAAAACQKZ MwACQQAAADIKKg4AACQABAAAAAAA7BPIGUNPTlRBQ1QgSU5GT1JNQVRJT04g T0YgT1VSIEFHRU5UIElOIEcAUABTAEEASwBHAEIAIQAjAFMANABQAEYAYABL AEIAIwBQAFMAIABQADUAIABQAE8ARwAhAEoASwA0AFMAQgAhACMAUwAhACAA AAAyCioO9QgOAAQAAAAAAOwTyBlVTklURUQgS0lOR0RPTVAAUwAjAEIANQBQ ACAASwAjAFMASwBPAFAAYQAHAAAA/AIAAJkzAAIAAAQAAAAtARUADAAAAEAJ IQDwAAAAAAAAAAUArgwzDgAABAAAAC0BBwAEAAAA8AEVAA0AAAAyCioOrgwB AAQAAAAAAOwTyBkgrSkABQAAAAkCAAAAAgQAAAACAQEABAAAAC0BAgANAAAA MgqfDgAAAQAEAAAAAADsE8gZIK0tAAQAAAACAQEAHAAAAPsCtf8AAAAAAAC8 AgAAAAAEQAAiQXJpYWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA LQEVAAUAAAAJAjZfkQITAAAAMgr8DgAABQAEAAAAAADsE8gZTkFNRSAwNgA1 AD8AMgAVAAUAAAAJAgAgYAIOAAAAMgr8DvEAAgAEAAAAAADsE8gZRFI2ADYA EAAAADIK/A5dAQMABAAAAAAA7BPIGS4gIAYVABUAFQAdAAAAMgr8DpwBDAAE AAAAAADsE8gZUEFVTCBXSU5URVJTMwA1ADYALgAVAEcAFQA2AC4AMgA2ADIA BQAAAAkCNl+RAg0AAAAyCvwO1wMBAAQAAAAAAOwTyBkgrSoABQAAAAkCAAAA AgQAAAACAQEABQAAAAkCNl+RAiAAAAAyClIPAAAOAAQAAAAAAOwTyBlNb2Jp bGUgUGhvbmU6ID8ALgAuABUAFQApABUAMgAuAC4ALgAqABgAFQAFAAAACQIA IGACDQAAADIKUg8WAgEABAAAAAAA7BPIGSutLAAQAAAAMgpSD0ICAwAEAAAA AADsE8gZNDQgBioAKQAVAA4AAAAyClIPqgICAAQAAAAAAOwTyBk3MCoAKgAX AAAAMgpSD/4CCAAEAAAAAADsE8gZMzE3NDU1MzYpACoAKgApACoAKQAqACoA BQAAAAkCNl+RAg0AAAAyClIPSwQBAAQAAAAAAOwTyBkgrSkABQAAAAkCAAAA AgQAAAACAQEABQAAAAkCNl+RAh0AAAAyCqgPAAAMAAQAAAAAAOwTyBlGYXgg bnVtYmVyOiAuACoAKgAVAC4ALQBDAC4AKgAdABgAFQAFAAAACQIAIGACDQAA ADIKqA/XAQEABAAAAAAA7BPIGSutLAARAAAAMgqoDwMCBAAEAAAAAADsE8gZ NDQ4ICoAKgAqABQAGQAAADIKqA+VAgkABAAAAAAA7BPIGTQ0Nzc0NzkxMgIq ACoAKgApACoAKgApACkAKgAFAAAACQI2X5ECDQAAADIKqA8MBAEABAAAAAAA 7BPIGSCtKgAFAAAACQIAAAACBAAAAAIBAQAEAAAALQEVAAUAAAAJAjZfkQIN AAAAMgr/DwAAAQAEAAAAAADsE8gZRa0yAA0AAAAyCv8PMgABAAQAAAAAAOwT yBktrRkAEwAAADIK/w9LAAUABAAAAAAA7BPIGW1haWw6NUMAKgAVABUAGAAa AAAAMgr/D/oACgAEAAAAAADsE8gZICAgICAgICAgIBUAFQAVABUAFQAVABUA FQAUABUAHAAAAPsCtf8AAAAAAAC8AgEAAAAEQAAiQXJpYWwAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAEAAAALQEWAAUAAAAJAjMzMwIxAAAAMgr/D8sB GQAEAAAAAADsE8gZcGF1bHdpbnRlcnM4OUBob3RtYWlsLmNvbQIuACoALgAV ADoAFQAuABgAKgAdACoAKgApAEoALgAuABgAQwAqABUAFQAUACoALgBDAAcA AAD8AgAAMzMzAgAABAAAAC0BFwAMAAAAQAkhAPAAAAAAAAAACAD4AwcQywEE AAAALQEHAAQAAADwARcABAAAAC0BFQAFAAAACQI2X5ECDQAAADIK/w/DBQEA BAAAAAAA7BPIGSCtKQAFAAAACQIAAAACBAAAAAIBAQAFAAAACQI2X5ECFwAA ADIKVRAAAAgABAAAAAAA7BPIGUxvdHRlcnkgLgAuABkAGQAqAB4AJwAVABkA AAAyClUQEgEJAAQAAAAAAOwTyBlXZWJzaXRlOiAFRwAqAC4AKgAVABkAKgAY ABUABAAAAC0BFQAFAAAACQIAAP8CXgAAADIKVRBgAjcABAAAAAAA7BPIGWh0 dHA6Ly93d3cud29ybGRjYXNpbm9kaXJlY3RvcnkuY29tL211bHRpc3RhdGVs b3R0by5odG0ALgAZABkALgAYABUAFQA7ADsAOwAUADsALgAdABUALgApACoA KgAVAC4ALQAuABUAHQAqACoAGQAuAB4AJgAVACoALgBDABUAQwAuABUAGQAV ACoAGQAqABkAKQAVAC4AGQAZAC4AFQAuABgAQwAHAAAA/AIAAAAA/wIAAAQA AAAtARcADAAAAEAJIQDwAAAAAAAAAAgA8wddEGACBAAAAC0BBwAEAAAA8AEX AAUAAAAJAjZfkQINAAAAMgpVEFMKAQAEAAAAAADsE8gZIK0pAAUAAAAJAgAA AAIEAAAAAgEBAAUAAAAJAjZfkQINAAAAMgqrEAAAAQAEAAAAAADsE8gZIK0q AAUAAAAJAgAAAAIEAAAAAgEBAAQAAAAtAQIABQAAAAkCM2b/AjgAAAAyChcR AAAeAAQAAAAAAOwTyBlLaW5kbHkgc2VuZCB0aGUgZm9sbG93aW5nIGluZm9I ABwAMgAyAB0AMAAZACcALAAyADIAGQAcADIALAAaACEAMgAcABwAMgBIABwA MgAxABkAHAAyACEAMgCCAAAAMgoXEdAETwAEAAAAAADsE8gZcm1hdGlvbiB0 byB5b3VyIGNsYWltIGFnZW50IHRvIGZhY2lsaXRhdGUgdGhlIHJlbGVhc2Ug b2YgeW91ciBmdW5kIGltbWVkaWF0ZWx5LgAhAE8ALAAcABwAMgAyABkAHAAy ABoAMAAyADIAIQAaACwAHAAtABwATgAZACwAMQAsADIAHAAZABwAMgAZACIA LAAsABwAHAAcABwALAAcACwAGQAcADIALAAaACEALAAcACwALAAoACwAGQAy ACEAGwAwADIAMgAhABkAIQAzADIAMgAZABwATgBOACwAMgAcACwAHAAsAB4A MAAZAAcAAAD8AgAAM2b/AgAABAAAAC0BFwAMAAAAQAkhAPAAAAAAAAAABQD6 ECIRAAAEAAAALQEHAAQAAADwARcADQAAADIKFxH6EAEABAAAAAAA7BPIGSCt LgAFAAAACQIAAAACBAAAAAIBAQAcAAAA+wK1/wAAAAAAALwCAAAAAARAACJW ZXJkYW5hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAtARcAHwAAADIK fBEAAA0ABAAAAAAA7BPIGTEuIEZ1bGwgbmFtZS4RNQAbABoAMQA1ABoAGgAa ADUAMgBPADIAGwAvAAAAMgp8ESECGAAEAAAAAADsE8gZICAgICAgICAgICAg ICAgICAgICAgICAgGgAaABoAGQAaABkAGgAaABkAGgAaABkAGgAaABkAGgAZ ABkAGgAaABoAGQAaABkADQAAADIKfBGIBAEABAAAAAAA7BPIGSCtGgANAAAA Mgp8EaIEAQAEAAAAAADsE8gZIK00AAQAAAACAQEAGgAAADIK2BEAAAoABAAA AAAA7BPIGTIuIENvdW50cnk1ABsAGgA2ADMANgA1ACIAJQAxAA0AAAAyCtgR tgEBAAQAAAAAAOwTyBkgrRoADQAAADIK2BHQAQEABAAAAAAA7BPIGSCtGgAN AAAAMgrYEeoBAQAEAAAAAADsE8gZIK01AAQAAAACAQEAKAAAADIKMxIAABMA BAAAAAAA7BPIGTMuIFRlbGVwaG9uZSBOdW1iZXIgNQAbABoAMwAyABoAMgA0 ADUAMwA1ADIAGgBAADUATwA0ADMAJQANAAAAMgozEogDAQAEAAAAAADsE8gZ IK0aAA0AAAAyCjMSogMBAAQAAAAAAOwTyBkgrTUABAAAAAIBAQAOAAAAMgqO EgAAAgAEAAAAAADsE8gZNC41ABsADQAAADIKjhJQAAEABAAAAAAA7BPIGSCt GgAaAAAAMgqOEmoACgAEAAAAAADsE8gZRmF4IE51bWJlcjEAMgAyABoAQAA1 AE8ANAAyACUADQAAADIKjhJoAgEABAAAAAAA7BPIGSCtGgANAAAAMgqOEoIC AQAEAAAAAADsE8gZIK0aAA0AAAAyCo4SnAIBAAQAAAAAAOwTyBkgrTUABAAA AAIBAQAOAAAAMgrpEgAAAgAEAAAAAADsE8gZNS41ABsADQAAADIK6RJQAAEA BAAAAAAA7BPIGSCtGgAQAAAAMgrpEmoAAwAEAAAAAADsE8gZU2V4BjUAMgAy ABEAAAAyCukSAwEEAAQAAAAAAOwTyBkgICAgGgAaABoAGgA7AAAAMgrpEmsB IAAEAAAAAADsE8gZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAZ ABoAGQAaABoAGQAaABoAGQAaABoAGQAaABkAGgAaABkAGgAaABkAGgAaABkA GgAZABoAGgAaABkAGgAZABoADQAAADIK6RKfBAEABAAAAAAA7BPIGSCtGgAN AAAAMgrpErkEAQAEAAAAAADsE8gZIK00AAQAAAACAQEADgAAADIKRBMAAAIA BAAAAAAA7BPIGTYuNQAbAA0AAAAyCkQTUAABAAQAAAAAAOwTyBkgrRoAHwAA ADIKRBNqAA0ABAAAAAAA7BPIGURhdGUgb2YgYmlydGgTPgAyACIAMgAaADMA IAAaADQAGgAlACIANQAOAAAAMgpEE38CAgAEAAAAAADsE8gZICAaABoADQAA ADIKRBOzAgEABAAAAAAA7BPIGSCtNQAEAAAAAgEBACUAAAAyCp8TAAARAAQA AAAAAOwTyBk3LiBNYXJpdGFsIFN0YXR1cwI1ABsAGgBHADIAJQAaACIAMgAa ABoANQAiADIAIgA1ACwADgAAADIKnxO2AgIABAAAAAAA7BPIGSAgGgAaABMA AAAyCp8T6gIFAAQAAAAAAOwTyBkgICAgIHIaABoAGgAaABkAJQAAADIKnxNr AxEABAAAAAAA7BPIGSAgICAgICAgICAgICAgICAgAhoAGgAZABoAGQAaABoA GgAZABoAGQAaABoAGQAaABoAGQANAAAAMgqfEx8FAQAEAAAAAADsE8gZIK0a AA0AAAAyCp8TOQUBAAQAAAAAAOwTyBkgrTQABAAAAAIBAQARAAAAMgr6EwAA BAAEAAAAAADsE8gZOC4gRTUAGwAaADMADQAAADIK+hOdAAEABAAAAAAA7BPI GS2tJAAgAAAAMgr6E8EADgAEAAAAAADsE8gZTWFpbCBBZGRyZXNzOiBHADIA GgAaABoAOgA0ADQAJQAyAC0ALAAeABoADQAAADIK+hMSAwEABAAAAAAA7BPI GSCtGgANAAAAMgr6EywDAQAEAAAAAADsE8gZIK01AAQAAAACAQEAHwAAADIK VhQAAA0ABAAAAAAA7BPIGTkuIE9jY3VwYXRpb24TNQAbABoAQAAsACwANQA0 ADIAIgAaADQANQANAAAAMgpWFEICAQAEAAAAAADsE8gZIK0aAA0AAAAyClYU XAIBAAQAAAAAAOwTyBkgrTUABAAAAAIBAQAoAAAAMgqxFAAAEwAEAAAAAADs E8gZMTAuIENvbnRhY3QgQWRkcmVzcwA1ADUAGwAaADYANAA1ACIAMgAsACIA GgA6ADUANAAlADMALAAsAA4AAAAyCrEUTQMCAAQAAAAAAOwTyBkgIBoAGgAN AAAAMgqxFIEDAQAEAAAAAADsE8gZIK01AAQAAAACAQEABAAAAC0BFwAgAAAA MgoMFQAADgAEAAAAAADsE8gZMTEuIEFtb3VudCBXb241ADUAGwAaADoATwA0 ADUANgAiABoAVQAzADUADgAAADIKDBXAAgIABAAAAAAA7BPIGSAgGgAaAAQA AAAtAQwADQAAADIKDBX0AgEABAAAAAAA7BPIGSCtMAAEAAAAAgEBAAQAAAAt ARcADgAAADIKZxUAAAIABAAAAAAA7BPIGTEyNQA1AD0AAAAyCmcVagAhAAQA AAAAAOwTyBkuIENvcHkgb2YgeW91ciBJbnRlcm5hdGlvbmFsIHBhc3MAGwAa ADYANAA0ADEAGgAzACAAGgAxADMANQAlABoAKQA1ACIAMgAmADYAMgAiABoA MwA1ADIAGgAaADQAMgAtACwALgAAADIKZxXWBRcABAAAAAAA7BPIGXBvcnQg b3IgRHJpdmVycyBsaWNlbnNlADUAMwAlACIAGgA0ACUAGgA+ACUAGgAxADIA JQAsABoAGgAaACwAMgA1ACwAMgANAAAAMgpnFYIJAQAEAAAAAADsE8gZIK01 AAQAAAACAQEAQQAAADIKwhUAACQABAAAAAAA7BPIGU9uY2UgeW91ciBhZ2Vu dCBhY2tub3dsZWRnZXMgcmVjZWlwdEAANQAsADIAGgAxADMANQAlABoAMgA0 ADIANQAiABoAMgAtADIANgA0AEkAGgAyADQANAAyACwAGgAlADIALAAyABoA NAAiAA0AAAAyCsIVYwYBAAQAAAAAAOwTyBkgrRoAVQAAADIKwhV9BjEABAAA AAAA7BPIGW9mIHRoaXMgcmVxdWlyZWQgZGV0YWlsLCB0cmFuc2ZlciB3b3Vs ZCBjb21tZW5jZS50MwAgABoAIgA1ABoALAAaACYAMgA0ADUAGgAlADIANAAa ADQAMgAiADIAGgAaABsAGgAiACUAMgA2ACwAIAAyACUAGgBJADMANQAaADQA GgAtADMATwBPADMANQAsADIAGwANAAAAMgrCFagOAQAEAAAAAADsE8gZIK02 AAQAAAAtAQEABAAAAAIBAQAfAAAAMgq7FgAADQAEAAAAAADsE8gZICAgICAg ICAgICAgIBUjACMAIwAjACMAIwAjACMAJAAjACMAIwAkAAMAAAAeAAcAAAAW BMgZ7BMAAAAAAwAAAB4ABAAAACwBAAAEAAAABwEEAAgAAAAmBg8ABgBUTlBQ BgGtAQAAQQuGAO4AMQBxAAAAAADqAF8O0RXJASgAAABxAAAAMQAAAAEAAQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAA/4A AAAAAAAAAAAAH+f8/w//n+H+4AAAAAAAAB/n/P+f///z/+AAAAAAAAAf9/z/ v///8//gAAAAAAAAH/P8//////P/wAAAAAAAAB/z/v/////z/gAAAAAAAAAf 8/5//5//8/8AAAIAAAAAD/P+f/////H/AAAfAAAAAA/7/n/D///x/wBgH4AA AAAP+f5/z///+f8A8B8AAAAAD/n/f9////n/AfHGAAAAAA/5/z///+/5/wP/ 4AAAAAAP+f8////P+f+H//gAAAAAB/3/f///j/z/j//4AAAAAAf//////+f/ /5///AAAAAAH/////+f///+f//wAAAAAB///////////v//8AAAAAAf///// /////////AAAAAAD///////n//////wAAAAAA////5//w//////8AAAAAAP/ +P8H/4P//////AAAAAAB8fA+Af8B8fP///wAAAAAAAAAAAAAAAAH///8AAAA AAAAAAAAAAAAB////gAAAAAAAAAAAAAAAA////4AAAAAAAAAAAAAAAAf///+ AAAAAAAAAAAAAAAAH////gAAAAAAAAAAAAAAAD/4//4AAAAAAAAAAAAAAAA/ 4H/+AAAAAAAAAAAAAAAAP4B//gAAAAAAAAAAAAAAAD4AP/4AAAAAAAAAAAAA AAAQAB/+AAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAA AAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAA7DQAAQQvGAIgAMQBxAAAAAADqAF8O0RXJASgAAABxAAAAMQAAAAEA CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AKrJ8QByqe4ATJHw AIy16gDk5+oAP3jqADFg5gBjoO0A7OvoAMbZ9gDHx8IAZYXOANjGrwDRtZAA z6h0AN3QvgDp49kA0qFVAMKXRwDOkRgA0tXaANjUzQDe398A4NzVAJWrvAC2 hkwAu21dAF6kyQBJpPEAiJUSAKB8gQDz8/IA8PDuAL6ZagC/s6IArHIoALSQ YQBWpQwAr308AMKjewCoaRwApmENAKVaAQCjVQAAvaqRAMa7qwBYltoAnEsA AKBQAAC2oIIApl0AAC+v6QBIs9gAIcf4AO3x9QD27fMApcmcAIS4ZwBktU8A a71tANzj6QDo7fIAb7aUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQF8fHwBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAXx8fAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB fHx8AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQF8fHwBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAXx8fAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQYKBgo/PgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBfHx8AQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARkOJDMpLiQM GAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQF8fHwBAQEBAQEBAQEBAQ8OLy8vLy8YAQEZES8vLy8k DD4BAREvLy8vLy8MAQEBARgPGyorLC0rJRsuDD4BARcOLy8vLy8ZAQEBAQ4v Ly8vLxEKARERGAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXx8fAEB AQEBAQEBAQEBKCUqKioqKC8BAQ4lKioqKiojGAEBEyUqKioqKi4GAQEOGyst LDQ0KzQsLCobLhYZGyoqKioqKC8GAQEoJSoqKioqLj8OJiYMAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBfHx8AQEBAQEBAQEBAQEqLS0tLTIqJAYB DiwtLS0tMhsXAQEbMi0tLS0tIz4BDyoyLTQ0NDQ0NDQsLS0qMwwoMS0tLTIr Lj8BASUtLS0tLS0mGA8lKA4BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQF8fHwBAQEBAQEBAQEBARQ0NDQ0LCouBgEBKiw0NDQsKAwBARAtNDQ0NCwb Fg4qLTQ0NCwtMjItLDQ0LC0qLhssNDQ0LDQmBgEBKSssNDQ0LSYYDiMpAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXx8fAEBAQEBAQEBAQEBECw0 NDQ0LCYYAQElNDQ0NCwlLyIBDiw0NDQ0LBsvKDI0NDQsLCgbJig0LDQ0LC0o JissNDQ0LBsYAQEPKy00NDQtKAwBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBfX19AQEBAQEBAQEBAQEONCw0NDQtJhYBARssNDQ0LCokBgEB Kiw0NDQsKC4oNC0tLSwjEQEBEiYtNDQ0LCUmKiw0NDQsKBcBAQ4qLTQ0NC0l Lz8BAQEBAQEBAQEBAQEBAQEBAQEBAQEBIQEBAQEBAQEBAQF9fX0BAQEBAQEB AQEBAQErLDQ0NC0oDAEBEC00NDQ0NDM+AQElLDQ0NCwqJC4mDyYlKSIhBgYM Gy00NDQsKiYqLDQ0NC0lDAEBASotNDQ0LCsuPwEBAQEBAQEBAQEBAQEBAQEB AQEiPhgYGAEBAQEBAQEBAX19fQEBAQEBAQEBAQEBASUsNDQ0LCUvIgEPLDQ0 NDQsIxgBASgtNDQ0LCsuGQEBAQEZPg4pGyUrNDQ0NCwrIyUsNDQ0LSokAQEB JSwsNDQsKzMGAQEBAQEBAQEBPyIBAQEBAQEBAREPMxsvIgEBAQEBAQEBfX19 AQEBAQEBAQEBAQEBGyw0NDQsKiQ/AQErLDQ0NCwbFwEBJjI0NDQsNCMWAQEi DiMlKys0NDQ0NDQ0LCsuGyw0NDQsKzM/AQEmLCw0NCwsIxgBAQEBAQEBARkv DAYBAQEBAQEBKQ8UKA4BAQEBAQEBAQF9fX0BAQEBAQEBAQEBAQEmLTQ0NCwr MxgBASUsNDQ0LCgMIQEPLTQ0NCw0JhcBCikrLTQ0NDQ0NDQ0NCwtKBcjLCw0 NCwsIwYBASksLDQ0LC0mFgEBAQEBAQE6JycmFwEBARIYFgEBAQ4RAQEBAQEB AQEBAX19fQEBAQEBAQEBAQEBAQ8tNDQ0NCwjGAEBKC00NDQsJS84AQErLDQ0 NCwoFwojLSw0NDQ0NDQ0NDQ0LSouAS4rLDQ0LCwmFgEBDyssNDQ0LCgMAQEB AQEBOicnJzwMOQoCGhokFgEBAQEBAQEBAQEBAQEBfX19AQEBAQEBAQEBAQEB DjQ0NDQ0LBsXAQEmLTQ0NCwrJD8BASUtNDQ0LCUMLiwsNDQ0NDQ0NCwsLCwo EAEBDyssNDQ0LSgXAQEOKy00NDQsKi84AQEBATo8PDwnJyQWBTU1NR0aGCIB AQEBAQEBAQEBAQF9fX0BAQEBAQEBAQEBAQEBJSw0NDQsGww4ARAtNDQ0LDQj GAEOJS00NDQsKiQmLTQ0NDQ0LCwrKyobJBkBAQERKi00NDQtJS8GAQElLTQ0 NCwrJCIBAQEMPT08PCcnQDU3Nzc3Nx0vCgEBAQEBAQEBAQEBAX19fQEBAQEB AQEBAQEBAQEoLTQ0NCwqJD44KS00NDQsLBsMOBclLTQ0NCwqKRssNDQ0NDQq KBMPERIWGD84AQElLTQ0NCwrMxY4FygtNDQ0LCszBgEBPjo9PT09PDw2Nzc3 Nzc3NR0MIgEBAQEBAQEBAQEBfX19AQEBAQEBAQEBAQEBARstNDQ0NDQoLi4l LDQ0NDQsKiMkIyssNDQ0LCsjGyw0NDQsKi4XAQESIxszLiQRFxstNDQ0NCwl My8pKyw0NDQsLDMGAQEMPTw8PD07IB03Nzc3Nzc3Ni8SAQEBAQEBAQEBAQF9 fX0BAQEBAQEBAQEBAQEBEDI0NDQ0NCwrKyw0NDQ0NDQsKysrLDQ0NDQsKy4j LTQ0NCwqKQwMLxstLTQrKiMYKSwsNDQ0NCwrKissNDQ0NCwsMzgBGDsnJycn PBsgNjc3Nzc3Nzc1GhkBAQEBAQEBAQEBAX5+fgEBAQEBAQEBAQEBAQEPLTQ0 NDQ0LCwsNDQ0NDQ0LCwtLCw0NDQ0NCwrDg4rLTQ0NDQqJSgqLCw0LC0tKTgP LCw0NDQ0LCwsLDQ0NDQ0LSskODk6JycnJycnHCA2NR4eHh41NzUdFwEBAQEB AQEBAQEBfn5+AQEBAQEBAQEBAQEBAQErLDQ0NCslLC00NDQ0NC0qJiotNDQ0 NDQ0MiUZIhAsLSw0NCwsLCw0NDQtLSYBAQ4sLDQ0NCslLC00NDQ0NDQyJRkK DhQnJycnJygcIB4EBAQHBAgENzYWAQEBAQEBAQEBAQF+fn4BAQEBAQEBAQEB AQEBASoxMjExMjMmNDIyLS0yLCMZLiotMi0tLTEqDwEBCiMrLDItLDQsLCwt MismAQEBASsxMTExMiYjKzIyLS0yMiovIg4QFCcnJycfHBwdHgkEBAQHBwg1 NhYBAQEBAQEBAQEBAX5+fgEBAQEBAQEBAQEBAQEBIygbGxsbDhkpGyUqKiUj AQEBECUlKiolGw8BAQEBASYoJSorLC0rKyUoLgEBAQEBFBsbGxsoLwYPKCUq KiUlKSEOEBATFScnJx8cHDAeHgQEBAcHCAgdGQEBAQEBAQEBAQEBfn5+AQEB AQEBAQEBAQEBAQEBISEhISIBAQESDyMTEQEBAQEBAQ4jEyQYAQEBAQEBAQEO IyUlJiUbDxEBAQEBAQEBISEhISIBAQESDiMjDwEBDhAQExMfHx8nJRwgAx4E BAQEBAcICA0MAQEBAQEBAQEBAQF+fn4BAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBARkQExMTExUfHx8cHA0eCR4EBAQHCAgIBwwBAQEBAQEBAQEB AX5+fgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBDxMTExMVFRUf FRwgCR4JCQQEBAQHCAgIGhgBAQEBAQEBAQEBfn5+AQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQ8TExMVFRUVFRUbHB0eCR4EBAQHBwgICAgaGQEB AQEBAQEBAQF+fn4BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEZExQV FRUVFRUVEw8aBQQEBAQECAgICAgICA0XAQEBAQEBAQEBAX5+fgEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ8VFRUVFRUVFRMRCgsFCQQHBAgICAgI CAgIDRkBAQEBAQEBAQEBfn5+AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEXFBUVFRUVFRUPGAEBAQIDBAQICAgICAgICAgNFwEBAQEBAQEBAQF+fn4B AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARMVFRUVFRUQDwEBAQEBAQUJ BAcICAgICAgICA0XAQEBAQEBAQEBAX5+fgEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBExQVFRMQDwEBAQEBAQEBCwUEBwgICAgICAgIDRYBAQEBAQEB AQEBfn5+AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEODxAPEQEBAQEB AQEBAQEBCwMEBwgICAgICAgNEgEBAQEBAQEBAQF+fn4BAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEKAQEBAQEBAQEBAQEBAQEBCwMECAgICAgICA0K AQEBAQEBAQEBAX5+fgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBCwIEBwgICAgIDAEBAQEBAQEBAQEBfn5+AQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQID BwcICAkKAQEBAQEBAQEBAQF/f38BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAwQFBgEBAQEBAQEBAQEBAX9/ fwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBf39/AQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQF/f38BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAX9/fwEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBA98BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAIAAAAJgYPAAYAVE5QUAcB BAAAACcB//8EAAAAJwH//wQAAAAtAQEADQAAADIKuxYoEAEABAAAAAAA7BPI GSCtQAAcAAAA+wKt/wAAAAAAAJABAAAAAARAACJBcmlhbAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAQAAAAtARgABAAAAC0BGAAEAAAAAgEBAAUAAAAJ AgBgvwJfAAAAMgoIFwAAOAAEAAAAAADsE8gZICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAXABcAFwAX ABcAFwAXABcAGAAXABcAFwAXABcAFwAYABcAFwAXABcAFwAYABcAFwAXABcA FwAXABgAFwAXABcAFwAXABgAFwAXABcAFwAXABcAGAAXABgAFwAXABcAFwAX ABcAFwAXABgAFwAXABcAHAAAAPsCrf8AAAAAAACQAQAAAAAEQAASQ2FzdGVs bGFyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAALQEZADcAAAAyCggXEAUd AAQAAAAAAOwTyBlDT05HUkFUVUxBVElPTlMhISBPTkNFIEFHQUlOLiBAAEkA SwBEAEAAQwA9AEgANABDAD0AIABIAEsAKAAUABQAHgBIAEsAQAAwAB8ARABD AEQAIABLABQABwAAAPwCAAAAYL8CAAAEAAAALQEaAAwAAABACSEA8AAAAAAA AAAEAGEGEBcQBQQAAAAtAQcABAAAAPABGgAEAAAALQEYAA0AAAAyCggXcQsB AAQAAAAAAOwTyBkgrUwABQAAAAkCAAAAAgQAAAAtARgABAAAAC0BGAAEAAAA LQEYAAQAAAAtARgABAAAAAIBAQAEAAAALQEYAAUAAAAJAgBgvwJ0AAAAMgps FwAARgAEAAAAAADsE8gZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBcAFwAX ABcAFwAXABcAFwAYABcAFwAXABcAFwAXABgAFwAXABcAFwAXABgAFwAXABcA FwAXABcAGAAXABcAFwAXABcAGAAXABcAFwAXABcAFwAYABcAGAAXABcAFwAX ABcAFwAXABcAGAAXABcAFwAXABcAFwAYABcAFwAXABcAFwAYABcAFwAXABcA DQAAADIKbBdUBgEABAAAAAAA7BPIGSCtFwAOAAAAMgpsF2sGAgAEAAAAAADs E8gZICAXABgADQAAADIKbBeaBgEABAAAAAAA7BPIGSCtFwAcAAAA+wKt/wAA AAAAALwCAAAAAARAACJBcmlhbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAQAAAAtARoABQAAAAkCAAAAAiAAAAAyCmwXsQYOAAQAAAAAAOwTyBlZT1VS UyBJTiBTRVJWSTgAQQA8ADwANwAYABcAPAAXADgANwA8ADgAFwAQAAAAMgps F1UJAwAEAAAAAADsE8gZQ0UsBjwAOAAXAAQAAAAtARgADQAAADIKbBfgCQEA BAAAAAAA7BPIGSCtLgADAAAAHgAEAAAABwEEAAgAAAAmBg8ABgBUTlBQBgHX AQAAQQuGAO4AHwDbAAAAAADvAcoISwAAACgAAADbAAAAHwAAAAEAAQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA/+AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//gAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAf//4AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAD4f//+AOBw7hx7j4HHHwH+w4HwDAYfB+DDHtng////+ADwcO4d/5/h xx+B/sOD/AwGP4fgw3/Z4P////wA8PDuHf+/88efwf7Dx/wMBnHOYMNz2eD/ ///8APD47h/HuHPPkcGAx8cMDAZg7GDDYdmA/////AH4+O4fg/Bz74PBgMfu AAwG4Gxgw2HZgH////4B+fjuH4PwN+/PwYDO7/wMBsBsYMN42YB////+Afnc 7h+D8Ddt34GAzu/8DAbAbGDDP9mAf////gO53O4fg/A3fd4BgM5//A/+wGxg wwfZgH////4DndzuH8e4fnzYAYDcdxwP/uDscMMA2YA////+A5+c77nvvP48 /YGA3He/jAZwzHHjMdmAP////wOfju/5/5/uOP+BgNw7+4wGf////z+ZgD// f/8HD47v8H+PzjjvgYD4OfeMBh+//z4fGYAf////Bw8OAAADgAAAAAGAAAAA DAYADAAAAAGAH////4cPDkAAA4AAAAABgIAAAAwGAAwAAAAZgB////+PDwfg AAOAAAAAAYHgAAAMBgAMAAAAGYAf////jgcH4AADgAAAAAGB4AAADAYAAAAA ABmAD////8AAAMAAA4AAAAAAAMAAAAAAAAAAAAABgA/////AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAP////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/// /+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf////gAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAH////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///A8AAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzDwAA QQvGAIgAHwDbAAAAAADvAcoISwAAACgAAADbAAAAHwAAAAEACAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAA////ALzF9gBxieUARFrOACU1vACTqOgA 8vP8AMrU9gA0SM0AJS/BACY4yQAnPs0AJkPTAClM1gAmTNoAJlTeADNc3ADM ztMAjsSuAL7h1ADX2/kAJl7iACVp4QBlh9wAxcrMAEihgQBBqnkAarKXAOHj 4gCmvK4ASnlXAHqzmwCnuOwAJnvjACWC5ACXqNcAULGPAESyggA/oG4AR5Rr AHyljgCEs58AiauXAG6WfQAyaDQAOX9OAOzs7AAliuQAJZLkADGF5QC+yNYA V7+cAEu2jABHtIcAPphmADuJVgA3dkIAtb23ACSc5gAjoucAVY/lAN/f3wBY rZMAU7yWAEy4jgA8kV4AzMzMAP39/QAoR9AAJZjmACOr5wAisuoAepvfAMjU 2gBgxKUAW8KgANnZ2QCInOsAIqzpAB+97AAqrOwAjbysAG/OtABpy68AYcao AJaqnQBKYtYAHcftABvR7gAxleQA5ubnAHXSuwBPupMAxsjGAPn5+QDv7+8A v7+/AJ+fnwCAgIAAz8/PAOTo+wBAd+UAMXPtACOD7wAio+4A5+3sAHvWwgBm yawAVo5rANPT0gBBQUEAcXFxAFFRUQABAQEAj4+PAK+vrwAyZ+UAo6/ZANDR 2ADd3d0A6enpAMbO6wCv0ccAb8OvACEhIQAREREAx7OoAMChjQDCnn0Ax6N0 AM6vgwDZw5kA59q7APXv3gDY5fUAgtzJADExMQDEnIUApnVLALJ+SAC5jVEA wJllAMmndwDQtIgA4dGtAO3kxwD38+sATpd6AHjMugBhYWEA5NvWAKVuQgCr dTQAs4M9AOnexgDw59UAxtHJAFKZfgDJrZsApmwzAODPqwDk1bUAzOv+APn9 /wBDiGMAVaWIAGqFbgDx8fEAsopqAK98OAC+lV0A1bySANrHowBhzfcApeX7 ANTw/wC8ycEAsMK5AI643ABrrNUA8+7rAKFlLAC2iEYAxJ5sAMurfADQto8A 076iAPH4/ACW5/YAieP2AITZ9wCZ2fcArOD3AInO8wByxfAAN6/sACCj9QDY xrgAn2JGAHfe9wB94PYAYtv4AEvY+QA21fsAJtP7ABrK+gAetPYAk7vQAJpX KQB70vcAVdj5AEfX+gAd0fsAHL/4AB+s9gAsm+IAqXlbAMGkhgD39/cAWMj0 AG3d9wBTotMAzru1AIzR7wBA1voArMDOALSNfwCfaikAnmYfAKdwJwAhmfQA MJbaAKyFYgCujnsAuaedAMrHxwDCrqQAOsj6ABzF+QAdufcAIo/uAN3V0ACj 0OQAIY3yAIWyywB/zOwAOLHsACqN4ACCgoIAZprIACaL2AA0jMwAJpfaAJew xwAAAAAAAQEBAQEBAQEBAQEBAQEBAV95d+Li4hlueC9fAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB fwEBAQEBAQEBAQEBAQEBREr6/P0xRvv7/Pr+GT4BAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAX8BAQEB AQEBAQEBAQEBvPr7acXF5+fn9Gjx+95kdG+WAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQF/AUQBAQEBAQEB AQFEW/b3z/DPz9fXxefn9Gj44vmJlgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBf/JDeC9fAQEBAduX2X/z 7u/Ozu/W8M/Xxef08fUdYWABAQEBAQEBAQFgYWEBAQEBAQFkYT4BAQEBPmFg AT5hPgEBAQFkYWABAQFhY3NkAWRhYAEBAWB0Y2NhAQEBAQEBZGFgAQEBYGFk AQEBPmJjYj4BAQEBAQEBZGFhYWFhYWQBYWQBAQEBYGE+AQEBAQEBPmJjc2EB AQEBAQEBAWQ+AQEBAQEBAT5kAQEBAT5iY3M+AQEBAQFgYmJgYGEBAQEBAWRg AQEBAT5kAQEBdGNiYAFhYAE+ZAEBYWBkPn/pi+rr7G54bu2p5arqHe7Nzc3N 1c7v8NfF5/HeTQEBAQEBAQEBAQEBYnJyZAEBAQEBfnKWAQEBAWNyYQFjcmMB AQEBb3JhAWCJcnJycpZvcmEBAWJ+cnJycn1kAQEBAX5yYgEBAWNyfQEBAXJy cnJyYwEBAQEBAW9ycnJycnJvAXJvAQEBAXByfQEBAQEBY3JycnJyfT4BAQEB AQFvYwEBAQEBAQFjbwEBAWNyiW9vcpYBAQEBiX1vY2FyAQEBAQFvYQEBAQFj bwFgiX5viX5icmEBY28BAXJiiYl/49HR5OXl5eXmmZq3qT7c4eHh4czN1c7W z8Xn6BLbAQEBAQEBAQEBAXFycmMBAQEBYXJyfgEBAQFjcmEBY3JjAQEBAW9y YQFvcn5iYWNycnJhAWFycpZhYZZyfj4BAXRycpYBAQGJcnI+AQF9c2FifnJk AQEBAQFvcmNjY2NjYgFybwEBAQF+cnJkAQEBdHJycGFhcH5hAQEBAQEBb2MB AQEBAQEBY28BAXNydAEBAWR+cAEBYXJgAQFhcgEBAQEBb2EBAQEBY28Bc35g AQFhfXJhAWNvAQFyYol9f9/R0dHRtqCZqreNq47f4NPT09PU4czNztbPxUbi LwEBAQEBAQEBAQF+cnKJAQEBAWNyfnJkAQEBY3JhAWNyYwEBAQFvcmE+cnJk AQEBdHJyYQGJcnMBAQEBY3KWAQFwcn1+AQFgcn5ycwEBYAEBAWNyYwEBAQEB b3IBAQEBAQEBcm8BAQF0colylgEBAX1ycwEBAQFgYAEBAQEBAW9jAQEBAQEB AWNvAQF+cwEBAQEBYXI+AWFvAQEBYXIBAQEBAW9hAQEBAWNvAXCWAQEBAWJy YQFjbwEBcmEBAX+Xx9HRtqCZqreNq7iCf4fT3d3KytPLzM3O1tfFtD4BAQEB AQEBAQFhcm99cmABAQGJcpZyYwEBAWNyYQFjcmMBAQEBb3Jhc3KWAQEBAQF9 cmFgcn4BAQEBAWByfgEBfXJicnQBYnJicm8BAQEBAWR9cmIBAQEBAW9yAQEB AQEBAXJvAQEBcXJ0fX5gAT5yfQEBAQEBAQEBAQEBAQFvYwEBAQEBAQFjbwFh cmABAQEBAQF9cwFhbwEBAWFyAQEBAQFvYQEBAQFjbwFjiQEBAQFgcmEBY28B AXJhAQF/AdnRtragqpqNq7iPg9rb3MnJyN3K08vMzc7P195NRAEBAQEBAQEB cHJjcHJ0AQFgcn1kcm8BAQFjcmEBY3JjAQEBAW9yYWNyYwEBAQEBb3JhYXJv AQEBAQEBiXIBPnJxYHJwAZZyPm9yYAEBPpZycolgAQEBAQFvcgEBAQEBAQFy bwEBYHJ+AXNyYgFhcn1jY2NjY2NjAQEBAQEBb2MBAQEBAQEBY28Bc4kBAQEB AQEBb2MBYW8BAQFhcgEBAQEBb2EBAQEBY28BPn5xZAEBAXJhAWNvAQFyYQEB fwGA0bagmZq3q7iPg6y6l9K+vr7JyMrT1MzV1tfYM6gBAQEBAQEBAYlyZHRy lgEBdHKWAX5yYAEBY3JhAWNyYwEBAQFvcmFjcmMBAQEBAW9yYWFybwEBAQEB AW9yAXNycwFvfQF+fQFzcnQBYnJyfnBgAQEBAQEBb3IBAQEBAQEBcm8BAXNy lgE+cokBYXJycnJycnJycgEBAQEBAW9jAQEBAQEBAWNvAXNvAQEBAQEBAW9j AWFvAQEBYXIBAQEBAW9hAQEBAWNvAQE+ln5yfW9yYQFjbwEBcmEBAX8Bxse2 oKqajY6Cg6ytocbByL29vsnIysvMzc7PadBbAQEBAQEBAT5yfgFgcn0BAZZy YgFxcnQBAWNyYQFjcmMBAQEBb3JhYnKWAQEBAQFvcmE+cn0BAQEBAQFycgFv cmQBc3JicnABZHKWAX5ylmABAQEBAQEBAW9yAQEBAQEBAXJvAQGJcmQBAW9y ZD5yfWFhYWFhcnIBAQEBAQFvlmFhYWFhYWGWbwFhcgEBAQEBAQFvYwFhbwEB AWFyAQEBAQGJdAEBAQFjbwEBAQEBPmFzcmEBY28BAXJhAQF/AbWYtpmqt6u4 ubqEoaK7vK69vb6/wMDBwsPEUcW0qAEBAQEBAQFicnEBAW9yZAF9cj4Bc3KW AQFjcmEBY3JvAQEBAX1yZD5yfmABAQFgfnJhAX1yYQEBAQFicolgcn4BAT5y fnJ0AQF+fgFyfQEBAQEBAQEBAQFvcgEBAQEBAQFybwFkcn0BAQFicpYBfXJh AQEBYXJvAQEBAQEBb3JycnJycnJycm8BYHJiAQEBAQE+cmQBYW8BAQFhcj4B AQEBcpYBAQEBY28BAQEBAQEBAXJhAWNvAQFyYQEBfwEBqaCZqo2rgoOsraKF raiur6+wpESxsbKyW0qztKQBAQEBAQEBcXJiAQFzcnNkcokBAWRyfQEBY3Jh AWNycpZgAWNyfgEBlnKJPgE+iXJyYQFicn5iAQFifnJiYnKWAQEBfXJyYAEB cXJkfnJhAT5wAQEBAQEBb3IBAQEBAQEBcm8BcHJwAQEBYHJ+AWJyfmEBPoly YmQ+PgEBAW9jAQEBAQEBAWNvAQFwfmQBAQEBcYkBAWFvAQEBYXJxAQEBYn5y ZAEBAX1zAQFjPgEBAWJyYAFjbwEBcmEBAX8BAZ+gmZqNjoKQhKGim4Wbo6Ok HiylnqampS4fp3RNqAEBAQEBAX5yPgEBZHJxc3JwAQEBfXI+AWNyYQFjcoly cnJycmIBAWCJcnJycnJ9cmEBAXBycnJycnKWAZZyYgEBAXBybwEBAWJyY2Jy cnJycgEBAQEBAW9yAQEBAQEBAXJvAX1yZAEBAQFxcmIBlnJycnJycQFvfmMB AQFvYwEBAQEBAQFjbwEBYG9+cGNjfX5kZG+Jfm9vYmFyiW9jcH5jYn5wY29+ YAEBln6WY3B+cAEBY28BAXJhAQF/AQGXmJmajY6PkISRhZucnAGdH55rXFNs TEA2GzcuKT4BAQEBAWFyfQEBAQF9cnFydAEBAZZycwFhYz4BYWNhZJZvcXQB AQEBAXNxb5Zkb3JhAQEBZHBvb5ZhAQFiYz4BAQE+Y2EBAQE+Y2IBYZZvcXMB AQEBAQFvcgEBAQEBAQFjYj5jYwEBAQEBZGN0AQFhlm9xYgE+Y2RhAQEBb2MB AQEBAQEBY28BAQEBYpZvb3NgAT5jln1jY2E+Y2Bzb3FiAQFhcW9wPgEBAQFh cG9xYgEBAWFiAQFyYQEBfwEBAYqLjI2Oj5CEkYWSk0RElJWIa1xTbExANhs3 QihuAQEBAQFwcnABAQEBlnJycgEBAQFicnEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAW9yYQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB b3IBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAW9jAQEBAQEB AWNvAQEBAQEBAQEBAQEBAWFvAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBcmEBAX8BAQEHEn+AgYKDhIWGX4cDh1KIiGtcU2xMXTYbNzhCOmAB AQEBiXJ0AQEBAXRycm8BAQEBPnJyAQFgAQEBAQEBAQEBAQEBAQEBAQEBAQFv cmEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAW9yAQEB AQEBAWABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFvYwEBAQEBAQFjbwEB AQEBAQEBAQEBAQFhbwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBYGAB AXJhAQF/AQEBIXUYdnd4eXkvegMXSAZ7fGtrXFRVNF0mGzc4OCkdAQEBPnJy YAEBAQFgcnJjAQEBAQF9cmFxcnMBAQEBAQEBAQEBAQEBAQEBAQEBb3JhAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFvcgEBAQEBAT5+ fmABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBb2MBAQEBAQEBY28BAQEBAQEB AQEBAQEBYHQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAW99AQFyYQEB fwEBAWUPDxYXZj09Z2hpWVk9aj9rXFNsTDQ1JidCOC5tbgEBAWRvcAEBAQEB AXBvZAEBAQEBY29icXJzAQEBAQEBAQEBAQEBAQEBAQEBAW9yYQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBcG8BAQEBAQFkcnI+AQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAXBiAQEBAQEBAWJwAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQF0cwEBcmEBAX8BAQEB Vw0PFyIxPE9QWFhZWlscXFNUVTRdNhsnQi45OF5fAQEBAQEBAQEBAQEBAQEB AQEBAQEBAWBhAQEBAQEBAQEBAQEBAQEBAQEBAQFiYz4BAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWRkAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWM+AQF/AQEBAU4NDxYX MEY8T1BQUFEhUlNUVUxANSYbNzguOS5WLwEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBfwEBAQECRQ0PFyIwRjxH SEhISUo/S0xAQTYbN0I4OTk5LE0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAX8BAQEBAQ4MDxAXIjAxOzw8PD0+ PzRAQTYbJ0I4LjktLThDRAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQH/AQEBAQEDCw0PFhciMDAxMTEyMyo0NTYb Jzc4LjktLS04Oi8BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEB/wEBAQEBIQsMDQ8QFhciIiMiIiQeJSYbJygpKiss Hy0tLisvAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAf8BAQEBARUMCwsNDw8QFhcXFxcYGRobHBQBAQEBAQEdHh8g AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQH/AQEBAQEBBAoLCwwNDw8PEA8PERITFAEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB /wEBAQEBAQMKCgoLCwwNDQ0NDQ4IAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf8BAQEB AQEICQoKCgoLCwsLCwkGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/AQEBAQEBAQEC AwQFBQUFBAYHAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB/wgAAAAmBg8ABgBUTlBQ BwEEAAAAJwH//wMAAAAeAAQAAAAHAQQACAAAACYGDwAGAFROUFAGAeUDAABB C4YA7gA8AOgAAAAAAIMB6gl4AKkIKAAAAOgAAAA8AAAAAQABAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAADBhTkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG+WOQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA14U5AAAAAAAAAAAAAAAAAAAA AAAAf/Af4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAD////gAAAAAAAA AAAAAAAAAAAAAAAAAAAAAH/B//+AAP//////8D/ABj/AAAAAAAAAAAAAAAAA AAAA/+P//4f/v9////////+Of/AAAAAAAAAAAAAAAAAAAAH/8/88D/8Pg7z/ ////v55//AAGAAAAAAAAAAAAAAAAA/fwfngf/g+D+D/vf54/Pj/8AAsAAAAA AAAAAAAAAAADwfB/8D/+D4P+P+9n/hx+PD4ADwAAAAAAAAAAAAAAAAfA8D/w P/4Ph/4/Bwf8Hv48HgAcAAAAAAAAAAAAAAAAB8DwP+Af/g+Hvj8HA/wf7jwe AB8AAAAAAAAAAAAAAAAHwPA/8B/gD4eeP+cB+B/OPB4AHwAAAAAAAAAAAAAA AAfA8D/4H+APh74/5wH4H5+//gAfAAAAAAAAAAAAAAAAB8DwffwPwA+P/n// 4fw/v7/8AB8AAAAAAAAAAAAAAAAHwPD//4eAP//4///h/H8///gDAQEAAAP/ ///gAAAAAB/7/f9/wAB//+D//8H8fgB/4Dgp+QAAB////+AAAP//P////3/A AH/wAAHAAAAAAAAAAAAAAAAP////4AAA//8/9///f4AAf+AAAAAAAAAAAACR DpEAAA/////AAAP//gAH+AAAAAAAAAAAAAAAAAAAAKA/AAAAD////8f/5//+ AAAAAAAAAAAAAAAAAAAAAAAAbQWRAAAP////j//n//4AAAAAAAAAAAAAAAAA AAA+AAAAAAAAAAAP/8Af/8f//AAAAAAAAAAAAAAAAAAAAD4AAAjE+wAAAAf/ wB//wH/gAAAAAAAAP/+AAAAAAAAA/w4ACMT7AAAAB//AH//AP4f//4H//gH/ //AAAAf8AAD/EQAAAAAAAAAH/8Af/4B/n///g//+B////AAAf//gAP8qgNhf 3wAAAAf/wAP/gH8///+H//wf///+AAH///gA/iyA4F/fAAAAB//AAP/Afz// /w///D////8AB////gD+KoBtBZEAAAAH/8AAf//+P///D//8f////4Af//// gP4sgAAA3wAAAAf/wAB///4///4P//j/////wD/////A/BEAGO6QAAAAB//A AD///AD/wAA/4f/AA//gf////+ACDgA1tIYAAAAH/8AAH//8AH/AAD/j/wAA /+D/////8B8AADkPAAAAAAf/4AAf//wAf8AAP+P+AAB/4f/AAf/4PwAACMT7 AAAAD//wAA//+AB/wAA/5/wAAD/z/wAAf/x/AAATBBQAAAAP//gAD/P4AH// /z/n/AAAP/P+AAAf/H+AAIMkZAAAAB///AAH//AAf////+f8AAAf9/wAAA/8 f4AA9AcAAAAAP//+AAf/8AB/////5/wAAB///AAAB/5/gAC4TN8AAAA///+A A//wAH/////n/gAAH//4AAAH/n+AAKA/AAAAAH///8AD/+AAf////+f+AAAf //gAAAP+f8AA////AAAA//P/4AH/4AB/////5/8AAB//+AAAA/5/wAAD0IYA AAH/4P/wAf/8AH/////n/4AAH//8AAAD/n/AAJDXhQAAA//Af/wB//wAf8AA f+P/wAAf3/wAAAP8f8AAAAAAAAAD/4A//gP/+AB/wAA/4//wAH/f/gAAA/x/ wABxBSIAAAf/gB//h//8AH/AAD/h//8D/5/+AAAD/H/gAGjJFwAAD/8AD//H //wAf8AAP+D/////D/8AAAP8f+AAPMoXAAAf/gAD////+Af//4A/4H////4P /8AAB/h/4AAAAAAAAD/8AB///8AAB///gD/gP////Af/4AAf+H/gAAAA3wAA f/wAP///4AAf//+AP+Af///4B//8AH/wf/AAj1eHAAB/+AB////gAD///wD/ +Af//+AD/////+B/8ACQPwAAAP/wAP///8AAP///A//+AP//gAH/////4H/w AAEAAAAD/+AA////4AA///4H//4AD/gAAP/////Af/gAACAAAf///AD////g AAAAAA///AAAAAAAf////wB/+AASACAD////4P///8AAAAAAD//+AAAAAAAf ///+AH/4AAIAWQf////gAAAAAAAAAAAP//wAAAAAAAf///gAf/gAACAAD/// /+AAAAAAAAAAAAAAAAAAAAAAAP//4AB//ABAACAP////4AAAAAAAAAAAAAAA AAAAAAAAB/4AAH/8AAIAZQ/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/gA AAAAD////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAB/+AAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAf8AAACAA2Q0AAEELxgCIADwA6AAAAAAAgwHqCXgAqQgoAAAA6AAAADwA AAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAzAP8AZ1D6 AJJ5+QDLwv4A3t3hAFAm9gAqA8cAEg4mAGZmZgCspe0AHgSFAMzMzACZmZkA 8/PzABERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERER9mZmZmZhERER9mZmZhERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERFmZmZmERERERERER /szMzMzO9mZmbszMzPERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER EREe6qqq5hERFmZmZma4zMzMwRERERERERHyIiIiInvMzMyiIiIkZmZm7vZm Zm7vERER9mZmZhERERERFvERZmZmbxERERERERERERERERERERERERERERER EREREREREREREREREREREREREREREREREREREaiCIojKYRFozMzMzLIiIiJh ER/29mZmZvFVcixVFTciI22ChVzMzMwsuMzMws1mZm88zMzGZmZm8RG80RXM zMzK5hERERERERERERERERERERERERERERERERERERERERERERERERERERER EREREREREREXIiIiIizvEfdyIiJ0EUIoERER6srojMiGERFCLPERESLBuCMR 0iIiIixbMiIizczMz7QihFHMzMzxG4jRFSIiIijK3xERERERERERERERERER EREREREREREREREREREREREREREREREREREREREREREREUIovx+yIqYRERUi xvEbIoERERQoRDgidVEREUIs8RERIsoisRERQstULNFSLBeNMiixFSLhETIn dRGyKOERUstVtyjNERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERIi0RER0ixhERHyKM31IoERER8o72wizW8RERQizx EREiwirt8RFCy8Zz8VIsH1EULNbzKPERFywRGyIo4RFSxhERsophERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERER8izxER ESLGERERIiLKgo8RERHyLKIjgsrRERFCLPERFSIiIsphEULIzREREiwRER9y zMIuEREXLPE4KHjhEVLGEREULNERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERFSLPERERIsYREREiIigo0RERER9CIqd3 c2EREUIs8REVIsFSLNERQiKOERESLBEREbInIo8RERcs8yJxeOERUsYRERUs 4RERERERERERERERERERERERERERERERERERERERERERERERERERERERERER EREVIs8REREixhERESLEIizmERERH4IzjNERERERQizxERUiwRso4RFCw479 8RIsERERF4rS4RERFywyKBF44RFSxhERGyjRERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERUizxERESLGERERIsZXIs7R EREVLO8o0RERERFCLPERFSLB9CjREULNtcrxEiwREREVLCjREREXLCKBHXiu YVLG///oLPERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERFSLPERERIsYRER8ixh8yLOYRERE3yCQREREREUIsYRGqIszC LPEWQs3eLP9iLGbxERZyLO0REfciKPFMIoyh4ozMzIKPERERERERERERERER EREREREREREREREREREREREREREREREREREREREREREREREVIs8REREixhER 9SLG//sizm/xER9V8RERERFmMizWYyIiIiIxEUyCjIgsvMIszPERF4IozhEV yCKNEUd3d2siIiIiJ2ERERERERERERERERFt3d3d3d3d3d3d3d3d3WERERER ERERERERERERERERERERHqoizM7x/yLN/x7MIozKHcIozK8RERERERERFMyC KMzOVVVVURERd3d3Iiy3REQ7ERETd3d2ERt3clERERERH1VVVVXxERERERER ERERERERHu7u7u7u7u7u7u7u7u7u0RERERERERERERFtbW1tbW1mZhFCIiIi LP+sIozO8iIiIioXIiIirxERERERERESIiIiIi4REREREREREREfRRERERER ERERERERERERERERERERERERERERERERERERERERERFMmZmZmZmZmZmZmZmZ mZphEREREREREREREd3d3d3d3d3WEbMzMzM7FSIiIi71VVVVXxVVVVXxERER ERERERVVVVVVURERERERERERERERERERERERERERERERERERERERERERERER EREREREREREREREREXIiIiIiIiIiIiIiIiIiiRERERERERERERHpmZmZmZmZ maEREREREREfVVVVURERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERMiIiIiIi IiIiIiIiIiKKER3d3d3d3d1hGyIiIiIiIiIskRERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERFUREMyIiIiIiIiIiIiIkER7u7u7u7u7WEV IiIiIiIiIijhERERERERERERERERERERERERERERERERERERERERERERERER EREREREREREREREREREREREREREREREREW3d0RERERERERERERERERERERER ERERERGyIiIiIizWERERERTJmZmZmZmaERYyIiIiIiInOxERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERER3d7RERERERERERERERERERERERERERERERMiIiIiKdYRERERFyIi IiIiIskREREVMiIihGERERERERERERERERERERERERERERERERERERFm3d3d 3d3WYREREREREREREREREREREREREREREREREREREdmZmeYRETQxERERERER EREREREREREREREREyIiIiIp1hEREREUIiIiIiIijhEREREyIiKhER3d3d3d 3d3d3d1hEREd3d3d3d3d3WEREREW3d7u7u7u7t3d1hERERERERERERERERZm ZmZmERERERERERERciIp5hETERMRERERERERERERERERERERERETIiIiIinW ERERERZHIiIiInOxERERFiIiLNEWqqqqqqqqqqqqqmEREW7u7u7u7u7uYRER Hd3qmZmZmZmZmu3d1hERERERERERERbd3d3d3dbd1mEREREREREiIimmETEx MTERERERERERERERERERERERERMiIiIiKdYRERERERFrciIprWERERETIiIq EWTMzMzMzMzMzMyaYREdmZmZmZmZmZkRER3emcgiIiIiIijJma5t0RERERER EREW3d6qmZmaqu1t3dERERERESIiLKERMTMRQRERERERERERERERERERERER EyIiIiIp1hERERERERFSIiye1hERERIiIs0RUiIiIiIiIiIiIokREVIiIiIi IiIiihER3sgiIiIiIiIiIiIsmZ7dERERERERFt6pnMgiIijMmZrmbdERERER IiIskRFBQTExERERERERERERERERERERERETIiIiIinWERERERERERQiKJrd 3dbWQiIioRFSIiIiIiIiIiIijhERsiIiIiIiIiIuER7IIiIiIiIiIiIiIiIo me3RERERERZunIIiIiIiIiIoyZmt3WEREREiIifRETEzETERERERERERERER ERERERERERMiIiIiKdYRERERERERFiIiya3d3d0iIijhEWMyIiIiIiIiIjNB ERGzMiIiIiInNFERqCIiIiIkRVVVtDIiIiIpmm0RERERbsgiIiIiIiIiIiIi iZnt3RERETNERhERExETEREREREREREREREREREREREREyIiIiIp1hERERER ERERQiIsmZmZnCIiLBERERERVyIiIsYREREREREREUIiIs5hERQiIiIidRER EREREbciIiKZrWERERaoIiIiIiIiIiIiIiIiiZnd0RERERERYRERQzERERER ERERERERERERERERERETIiIiIintERERERERERESIiIiIiIiIiIqEREREREU IiIinRERERERERERQiIinmERYiIiIiQREREREREREUIiIime0RER3CIiIiIj RVVVVUMiIiIiiZ7dERERHd3WERERERERERERERERERERERERERERERMiIiIi Ka3RERERERERERQiIiIiIiIiIs0RERERERQiIiKWERERERERERFCIiKeYRFy IiIioRERERERERERGyIiIprRER6CIiIiKxERERERERZCIiIime1hERHe6u0R ERERERERERERERERERERERERERERYiIiIiIsnt0RERERERERESIijEREMiIi oRERERERFCIiIp0REREREREREUIiIp5hFiIiIiwRERERERERERERMiIiydYR 2CIiIiQRERERERERERYyIiIpntYRG5nJnRERERERERERERERERERERERERER EREyIiIiIiKZ7dERERERERERsiKJ7RFyIizhEREREREUIiIind3dZmZmZmYR QiIinmEbIiIiihERERERERERERFiIiIp5hEiIiIisRERERERERERERQiIiKZ 3RESIiidYRERERERERERERERERERERERERERFCIiIiIiIime3REREREREREX IimtZiIiKhERERERERQiIiKd3d3d3d3d3d2yIiKeYRQiIiLOERERERERERER ERciIimmEyIiIioRERERERERERERETIiIomtERIiIp5hERERERERERERERER ERERERERERFiIiIiIiIiIpnt0RERERERERsiLJ7UIiKOERERERERFCIiIsmZ mZmZqqqu7kIiIp5hFCIiIp0RERERERERERERFCIiLKZSIiIixhERERERERER EREREiIiLJ1hEiIimtEREREREREREREREREREREREREREYIiIiIigiIiKZ7d YREREREREXIimtciIsYREREREREUIiIiIiKIiIzMzJmZwiIinmETIiIinWER EREREREREREUIiIspkIiIiKhEREREREREREREREbIiIintESIiLJ0RERERER ERERERERERERERERERETIiIiIihlIiIima3WERERERERsiLJQiIioRERERER ERQiIiIiIiIiIiIiIiIiIiKeYRQiIiKe0RERERERERERERQiIiymIiIiLKER EREREREREREREREiIiKaYRIiIonWEREREREREREREREREREREREREUIiIiIi KxFnIiIpmt1hEREREREXIilyIizhERERERERFCIiIiIiIiIiIiIiIiIiIp5h GyIiIprdERERERERERERFCIiLOYiIiIs4REREREREREREREREXIiIslhEiIi KeYREREREREREREREREREREREREbIiIiIiKBEREyIiLJnd0RERERERsiLCIi Kt3WEREREREUIiIiIiIiIiIiIiIiIiIinmEWIiIiyd1hERERERERERETIiIp ZSIiIinmERERERERERERERERMiIiimESIiIprRERERERERERERERERERERER EWIiIiIiKBERERQiIiiZ7dYRERERHSIiIiKJ7d0RERERERQiIiKdERERERER ERVCIiKeYRFyIiKJrdYRERERERERERIiIikVIiIiKa0RERERERERERERERFC IiKJERIiIiydERERERERERERERERERERERERgiIiIiKBEREREbIiIome3dER ERGpgiIiIomZkRERERERFCIiIp0REREREREREUIiIp5hEVIiIiyabdYRERER EREWQiIijhUiIiIprWERERERERERERERETIiIooREiIiKJ0RERERERERERER ERERERERERciIiIiItERERERFiIiIpmtbWERFCIiIiIiIiidEREREREUIiIi nRERERERERERQiIinmERFCIiIsmebd1mERERZt0iIiLBFiIiIiyd0RERERER ERERERERMiIizhESIiIinmERERERERERERERERERERERQiIiIiIjERERERER ZyIiLJnt1hETIiIiIiIiIrYRERERERQiIiKdERERERERERFCIiKeYRERciIi KJme1t3d3dbdqCIiKBERIiIiIprdEREREREREREREREiIiKWERIiIiKa0RER ERERERERERERERERERsiIiIiIoERERERERERciIiiZrd3WVVVVVVVVVVYRER ERZmZCIiIp3d1mZhEREREUIiIp5hERETIiIiKJmZru7u6pwiIiKBERFCIiIi ye3WERERERERERERFCIiIqEREiIiIprRERERERERERERERERERER0iIiIiIo ERERERERFt1XIiIiyZ7W3d3WERERERERERERHd3XIiIint3d3dERERERQiIi nmERERFCIiIiIoyZmZnIIiIiIxERERIiIiIpnt3RERERERERERbSIiIo0RES IiIiydERERERERERERERERERER0iIiIiIoURERERERFt3uoiIiIomZmu3d1h ERERERERERapmZgiIiLJmZma0RERERFCIiKeYRERERYyIiIiIiIiIiIiIiKx ERERGyIiIiKZrd3WEREREREW3oIiIioRERIiIiKJ5hERERERERERERERERER EiIiIiIiMRERERERHpmZyCIiIiIijJmZrdERERERERERY4iCIiIiIiIoiMkR ERERZrIiIp7WYRERERVCIiIiIiIiIiIiQRERERERQiIiIiyZrd3d3WZt3d2o IiIigREREiIiIimtERERERERERERERERERGCIiIiIigRERERERG4IiIiIiIi IiIiIoyaERERERERERFSIiIiIiIiIiIiKREREW3dsiIint3d0RERERFUMiIi IiIidFEREREREREUIiIiIomZrt3d3d3urCIiIihhERESIiIiKa0RERERERER ERERERERaCIiIiIigRERERERETIiIiIiIiIiIiIiIslhEREREREREbMzMzMi IiIiIzIhEREd6qmSIiLJmu3RERERERERZVVVVWERERERERERERGyIiIiIiyZ mZmZmZwiIiIihhERERIiIiIsnWERERERERERERZm3d2CIiIiIijmZhERERER ciIiIiIiIiIiIiIiK2EREREREREREREREREREREREREREWzMiCIiIijJmRER ERERERERERERERERERERERERERYyIiIiIiIoiIgiIiIiIiMREREREiIiIiie YRERERERERER3d3d7CIiIiIiKt3d3d3RERFVVVVVVVVVVVVVVVVWERERERER ERERERERERERERERERERMiIiIiIiIiIp0RERERERERERERERERERERERERER ERUyIiIiIiIiIiIiIiInsRERERESIiIiIprRERERERERER6pmZnCIiIiIiLJ qu7u7dERERERERERERERERERERERERERERERERERERERERERERERERFCIiIi IiIiIisRERERERERERERERERERERERERERERERZHIiIiIiIiIiIiJ7ERERER ERIiIiIiydERERERERERvIgiIiIiIiIiIozMmZmZYRERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERFrQyIiIiIiJzthEREREREREiIiIiKJ1hEREREREREiIiIi IiIiIiIiIiIiIilhERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERFlVVVVZR ERERERERERESIiIiIimmERERERERESIiIiIiIiIiIiIiIiIiKmERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERIiIiIiKaERERER ERERRERERERERERERERERERGERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER EREREREREREREREREREREiIiIiIokRERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERESIiIi IicRERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERIzNEVWEREREREREQgAAAAmBg8ABgBU TlBQBwEEAAAAJwH//wMAAAAeAAQAAAAHAQQAIQIAAEELIADMABQAWgAAAAAA yAD7BE0KcgYoAAAAWgAAABQAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAP///wCFhYUAn5+fANTU1ABUVFQANjY2AEVFRQC1tbUAbGxsAO7u 7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAA AANFZmIwAAAAZgAAYAAAAAdgAHYAAAAAAAAAAAAAAAAgAAAAAAAAAgAAAABm AAAgAANJVlIgACAAd2BmdgACAGV2ZncAAAAAAAAAAAAAAAAgAAAAAAAAAgAA AAZlYAAgAAOCl1KQACAAlXdnlwACAHl2Z1cAAAMECQAAAAIAAAAgAAAAAAAA AgAAAGZVYAAgAAIzmZlQACAAmVdZJwACAHJXd5UAAAAAAAAAAREaAAAgBmZm ZmAAAgAABmVZUAAgAAkpmZUAACAAIpmZOQACAFKXd5kAAAcFAgAAEYJBQAAg BlVXd3YAAgAAZnmSkAAgAAYlV2ZgACAAiJmSggACAJKVdSkAAAAAAAACFAAB EAAgBlmVVVYAAgAAZVI4IAAgAABZVmZgACAGQ5dSQgACAJOVVSkAAAAAAAAI EwAEEgAgBZIpmZcAAgAGVZOKNgAgAABlVXdQACAGQ3Z5QwACAJOXdykAAAAC AAAKEgAIGAAgCSgyIiUAAgAGmZKKIAAgAAAAAAAAACAGQnd5QgACAJOXd5kA AAAAAAABEgAIGAAgBpIpmZYAAgAHIimKkAAgAAAAAAAAACAGg5Z5ggACAJKX d5UAAAYFBQABEgAIGAAgAFkpVVAAAgAGIyk6kAAgAAAAAAAAACAAiJWSiQAC AJKXd5cAAAgJCQAKEgAIGAAgAAWZmVYAAgAAmVckcAAgAAYAAGAAACAAM5mS iQACAFJVd1cAAAUFBQAEEwAEEgAgAGBlIiYAAgAAYpYkYAAgAAZgBmYAACAA M5mSiQACAFmXd1cAAAIEAgADFAABEAAgAGYGkjcAAgAABSUkYAAgAAdmZnYA ACAAMld5OQACAHlVd3YAAAcAAAAAEUJBQAAgAFYAaYUAAgAAAJkoYAAgAGV2 ZlcAACAAKXZnKQACAGVXd3YAAAAAAgAAIREaAAAgAJdgZTUAAgAAAHIiYAAg AGlVVZUAACAGKQAGKQACAGV3dmAAAAIAAAAAACIAAAAgACVmZScAAgAAAAmS AAAgAFKZWSkAACAAmWBmmQACAAd3dmAAAAAJAwAAAAAAAAAgAFlWdVAAAgAA AAZVAAAgAJgpkoIAACAAlWZnlwACAAZmZmAAAAcCAgAAAAAAAAAgAAVVVWAA AgAAAAAAAAAgACQlZYgAACAAeXZ3kAACAAZmYAAAAAcHBwAAAAAAAAAgAAAA AAAAAgAAAAAAAAAgADRWZiMAACAAB1dXYAACAABmYAAAAAkDCgQAAAAnAf// BAAAAC0BAAAFAAAAFAIAAAAABQAAABMCyBkAAAUAAAATAsgZ7BMFAAAAEwIA AOwTBQAAABMCAAAAAAUAAAAUAgEAAQAFAAAAEwLHGQEABQAAABMCxxnrEwUA AAATAgEA6xMFAAAAEwIBAAEABQAAABQCAgACAAUAAAATAsYZAgAFAAAAEwLG GeoTBQAAABMCAgDqEwUAAAATAgIAAgAFAAAAFAIDAAMABQAAABMCxRkDAAUA AAATAsUZ6RMFAAAAEwIDAOkTBQAAABMCAwADAAUAAAAUAgQABAAFAAAAEwLE GQQABQAAABMCxBnoEwUAAAATAgQA6BMFAAAAEwIEAAQABQAAABQCBQAFAAUA AAATAsMZBQAFAAAAEwLDGecTBQAAABMCBQDnEwUAAAATAgUABQAFAAAAFAIG AAYABQAAABMCwhkGAAUAAAATAsIZ5hMFAAAAEwIGAOYTBQAAABMCBgAGAAUA AAAUAgcABwAFAAAAEwLBGQcABQAAABMCwRnlEwUAAAATAgcA5RMFAAAAEwIH AAcABQAAABQCCAAIAAUAAAATAsAZCAAFAAAAEwLAGeQTBQAAABMCCADkEwUA AAATAggACAAFAAAAFAIJAAkABQAAABMCvxkJAAUAAAATAr8Z4xMFAAAAEwIJ AOMTBQAAABMCCQAJAAUAAAAUAgoACgAFAAAAEwK+GQoABQAAABMCvhniEwUA AAATAgoA4hMFAAAAEwIKAAoABQAAABQCCwALAAUAAAATAr0ZCwAFAAAAEwK9 GeETBQAAABMCCwDhEwUAAAATAgsACwAFAAAAFAIMAAwABQAAABMCvBkMAAUA AAATArwZ4BMFAAAAEwIMAOATBQAAABMCDAAMAAUAAAAUAg0ADQAFAAAAEwK7 GQ0ABQAAABMCuxnfEwUAAAATAg0A3xMFAAAAEwINAA0ABQAAABQCDgAOAAUA AAATAroZDgAFAAAAEwK6Gd4TBQAAABMCDgDeEwUAAAATAg4ADgAFAAAAFAIP AA8ABQAAABMCuRkPAAUAAAATArkZ3RMFAAAAEwIPAN0TBQAAABMCDwAPAAUA AAAUAhAAEAAFAAAAEwK4GRAABQAAABMCuBncEwUAAAATAhAA3BMFAAAAEwIQ ABAABQAAABQCEQARAAUAAAATArcZEQAFAAAAEwK3GdsTBQAAABMCEQDbEwUA AAATAhEAEQAFAAAAFAISABIABQAAABMCthkSAAUAAAATArYZ2hMFAAAAEwIS ANoTBQAAABMCEgASAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAABQECAAAAAAAAAAAA AAAAAAAAAAACAAAAAtXN1ZwuGxCTlwgAKyz5rkQAAAAF1c3VnC4bEJOXCAAr LPmuxAEAAIABAAAMAAAAAQAAAGgAAAAPAAAAcAAAAAUAAAB8AAAABgAAAIQA AAARAAAAjAAAABcAAACUAAAACwAAAJwAAAAQAAAApAAAABMAAACsAAAAFgAA ALQAAAANAAAAvAAAAAwAAABHAQAAAgAAAOQEAAAeAAAABAAAAAAAAAADAAAA HAAAAAMAAAAHAAAAAwAAAHQPAAADAAAA5hULAAsAAAAAAAAACwAAAAAAAAAL AAAAAAAAAAsAAAAAAAAAHhAAAAQAAAACAAAAIAAbAAAAICAgICAgICBBVFRO OiBERUFSIFdJTk5FUiwAHwAAACAgICBQYXltZW50IG9mIFByaXplIGFuZCBD bGFpbQA3AAAAICAgIENPTlRBQ1QgSU5GT1JNQVRJT04gT0YgT1VSIEFHRU5U IElOIFVOSVRFRCBLSU5HRE9NAAwQAAAEAAAAHgAAAAYAAABUaXRsZQADAAAA AQAAAB4AAAAJAAAASGVhZGluZ3MAAwAAAAMAAAAAAOQEAAADAAAAAAAAACAA AAABAAAAOAAAAAIAAABAAAAAAQAAAAIAAAAMAAAAX1BJRF9ITElOS1MAAgAA AOQEAABBAAAAnAQAACoAAAADAAAANwB+AAMAAAADAAAAAwAAAAAAAAADAAAA BQAAAB8AAAA4AAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHcAbwByAGwAZABj AGEAcwBpAG4AbwBkAGkAcgBlAGMAdABvAHIAeQAuAGMAbwBtAC8AbQB1AGwA dABpAHMAdABhAHQAZQBsAG8AdAB0AG8ALgBoAHQAbQAAAB8AAAABAAAAAAAX CwMAAAA1AEIAAwAAAP////8DAAAABAQAAAMAAAABAAAAHwAAAEcAAABoAHQA dABwADoALwAvAGEAZABzADEALgBtAHMAbgAuAGMAbwBtAC8AYQBkAHMALwBw AHIAbwBuAHcAcwAvAEMASQBRAC8ASABNAE0ATAAvAGUAbgAvAFcATABNAGUA bQBiAGUAcgBMAGUAdAB0AGUAcgBCAGEAbgBuAGUAcgBfAGUAbgAuAGoAcABn AAAAAAAfAAAAAQAAAAAAFwsDAAAAHgB+AAMAAAD/////AwAAAAYEAAADAAAA AQAAAB8AAAA5AAAAaAB0AHQAcAA6AC8ALwBpADIALgBtAGkAYwByAG8AcwBv AGYAdAAuAGMAbwBtAC8AaAAvAGEAbABsAC8AaQAvAG0AcwBfAG0AYQBzAHQA aABlAGEAZABfADgAeAA2AGEAXwBsAHQAcgAuAGoAcABnAAAAAAAfAAAAAQAA AAAAFwsDAAAABgADAAMAAAD/////AwAAAAcEAAADAAAAAQAAAB8AAAAuAAAA aAB0AHQAcAA6AC8ALwBoAHAALgBtAHMAbgAuAGMAbwBtAC8AYwAvAGgAbwB0 AG0AYQBpAGwALwBXAEwASABMAG8AZwBvADIAMQA5AHgAMwAxAC4AZwBpAGYA AAAfAAAAAQAAAAAAFwsDAAAARABOAAMAAAD/////AwAAAAgEAAADAAAAAQAA AB8AAAA1AAAAaAB0AHQAcAA6AC8ALwBlAHUAcgAuAGkAMQAuAHkAaQBtAGcA LgBjAG8AbQAvAGUAdQByAC4AeQBpAG0AZwAuAGMAbwBtAC8AaQAvAGUAdQAv AGgAcAAvAHkAdQBrADEALgBnAGkAZgAAAAAAHwAAAAEAAAAAABcLAwAAADUA QgADAAAA/////wMAAAAJBAAAAwAAAAEAAAAfAAAARwAAAGgAdAB0AHAAOgAv AC8AYQBkAHMAMQAuAG0AcwBuAC4AYwBvAG0ALwBhAGQAcwAvAHAAcgBvAG4A dwBzAC8AQwBJAFEALwBIAE0ATQBMAC8AZQBuAC8AVwBMAE0AZQBtAGIAZQBy AEwAZQB0AHQAZQByAEIAYQBuAG4AZQByAF8AZQBuAC4AagBwAGcAAAAAAB8A AAABAAAAAAAXCwMAAABjACoAAwAAAP////8DAAAACgQAAAMAAAABAAAAHwAA ADAAAABoAHQAdABwADoALwAvAHcAdwB3AC4AZQBtAGEAaQBsADIAcwB1AGMA YwBlAHMAcwAuAGMAbwBtAC8AaQBtAGEAZwBlAHMALwBjAG8AdQBuAHQAZQBy AC4AZwBpAGYAAAAfAAAAAQAAAAAAFwsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAADAAAABAAA AAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAA EAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAb AAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYA AAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAA ADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAA PQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABI AAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMA AABUAAAAVQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAA AF8AAABgAAAA/v///2IAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAA agAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1 AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAB7AAAAfAAAAH0AAAB+AAAAfwAAAIAA AACBAAAAggAAAIMAAACEAAAAhQAAAIYAAACHAAAAiAAAAIkAAACKAAAAiwAA AIwAAACNAAAAjgAAAI8AAACQAAAAkQAAAJIAAACTAAAAlAAAAJUAAACWAAAA lwAAAJgAAACZAAAAmgAAAJsAAACcAAAAnQAAAJ4AAACfAAAAoAAAAKEAAACi AAAAowAAAKQAAAClAAAApgAAAKcAAACoAAAAqQAAAKoAAACrAAAArAAAAK0A AACuAAAArwAAALAAAACxAAAAsgAAALMAAAC0AAAAtQAAALYAAAC3AAAAuAAA ALkAAAC6AAAAuwAAALwAAAC9AAAAvgAAAL8AAADAAAAAwQAAAMIAAADDAAAA xAAAAMUAAADGAAAAxwAAAMgAAADJAAAAygAAAMsAAADMAAAAzQAAAM4AAADP AAAA0AAAANEAAADSAAAA0wAAANQAAADVAAAA1gAAANcAAADYAAAA2QAAANoA AADbAAAA3AAAAN0AAADeAAAA3wAAAOAAAADhAAAA4gAAAOMAAADkAAAA5QAA AOYAAADnAAAA6AAAAOkAAADqAAAA6wAAAOwAAADtAAAA7gAAAO8AAADwAAAA 8QAAAPIAAADzAAAA9AAAAPUAAAD2AAAA9wAAAPgAAAD5AAAA+gAAAPsAAAD8 AAAA/QAAAP4AAAD/AAAAAAEAAAEBAAACAQAAAwEAAAQBAAAFAQAABgEAAAcB AAAIAQAACQEAAAoBAAALAQAADAEAAA0BAAAOAQAADwEAABABAAARAQAAEgEA ABMBAAAUAQAAFQEAABYBAAAXAQAAGAEAABkBAAAaAQAAGwEAABwBAAAdAQAA HgEAAB8BAAAgAQAAIQEAACIBAAAjAQAAJAEAACUBAAAmAQAAJwEAACgBAAAp AQAAKgEAACsBAAAsAQAALQEAAC4BAAAvAQAAMAEAADEBAAAyAQAAMwEAADQB AAA1AQAANgEAADcBAAA4AQAAOQEAADoBAAA7AQAAPAEAAD0BAAA+AQAAPwEA AEABAABBAQAAQgEAAEMBAABEAQAARQEAAEYBAABHAQAASAEAAEkBAABKAQAA SwEAAEwBAABNAQAATgEAAE8BAABQAQAAUQEAAFIBAABTAQAAVAEAAFUBAABW AQAAVwEAAFgBAABZAQAAWgEAAFsBAABcAQAAXQEAAF4BAABfAQAAYAEAAGEB AABiAQAAYwEAAGQBAABlAQAAZgEAAGcBAABoAQAAaQEAAGoBAABrAQAAbAEA AG0BAABuAQAAbwEAAHABAABxAQAAcgEAAHMBAAB0AQAAdQEAAHYBAAB3AQAA eAEAAHkBAAB6AQAAewEAAHwBAAB9AQAAfgEAAH8BAACAAQAAgQEAAIIBAACD AQAAhAEAAIUBAACGAQAAhwEAAIgBAACJAQAAigEAAIsBAACMAQAAjQEAAI4B AACPAQAAkAEAAJEBAACSAQAAkwEAAJQBAACVAQAAlgEAAJcBAACYAQAAmQEA AJoBAACbAQAAnAEAAJ0BAACeAQAAnwEAAKABAAChAQAAogEAAKMBAACkAQAA pQEAAKYBAACnAQAAqAEAAKkBAACqAQAAqwEAAKwBAACtAQAArgEAAK8BAACw AQAAsQEAALIBAACzAQAAtAEAALUBAAC2AQAAtwEAALgBAAC5AQAAugEAALsB AAC8AQAAvQEAAL4BAAC/AQAAwAEAAMEBAADCAQAAwwEAAMQBAADFAQAAxgEA AMcBAADIAQAAyQEAAMoBAADLAQAAzAEAAM0BAADOAQAAzwEAANABAADRAQAA 0gEAANMBAADUAQAA1QEAANYBAADXAQAA2AEAANkBAADaAQAA2wEAANwBAADd AQAA3gEAAN8BAADgAQAA4QEAAOIBAADjAQAA5AEAAOUBAADmAQAA5wEAAOgB AADpAQAA6gEAAOsBAADsAQAA7QEAAO4BAADvAQAA8AEAAPEBAADyAQAA8wEA APQBAAD1AQAA9gEAAPcBAAD4AQAA+QEAAPoBAAD7AQAA/AEAAP0BAAD+AQAA /wEAAAACAAABAgAAAgIAAAMCAAAEAgAABQIAAAYCAAAHAgAACAIAAAkCAAAK AgAACwIAAAwCAAANAgAADgIAAA8CAAAQAgAAEQIAABICAAATAgAAFAIAABUC AAAWAgAAFwIAABgCAAAZAgAAGgIAABsCAAAcAgAAHQIAAB4CAAAfAgAAIAIA ACECAAAiAgAAIwIAACQCAAAlAgAAJgIAACcCAAAoAgAAKQIAACoCAAArAgAA LAIAAC0CAAAuAgAALwIAADACAAAxAgAAMgIAADMCAAA0AgAANQIAADYCAAA3 AgAAOAIAADkCAAA6AgAAOwIAADwCAAA9AgAAPgIAAD8CAABAAgAAQQIAAEIC AABDAgAARAIAAEUCAABGAgAARwIAAEgCAABJAgAASgIAAEsCAABMAgAATQIA AE4CAABPAgAAUAIAAFECAABSAgAAUwIAAFQCAABVAgAAVgIAAFcCAABYAgAA WQIAAFoCAABbAgAAXAIAAF0CAABeAgAAXwIAAGACAABhAgAAYgIAAGMCAABk AgAAZQIAAGYCAABnAgAAaAIAAGkCAABqAgAAawIAAGwCAABtAgAAbgIAAG8C AABwAgAAcQIAAHICAABzAgAAdAIAAHUCAAB2AgAAdwIAAHgCAAB5AgAAegIA AHsCAAB8AgAAfQIAAH4CAAB/AgAAgAIAAIECAACCAgAAgwIAAIQCAACFAgAA hgIAAIcCAACIAgAAiQIAAIoCAACLAgAAjAIAAI0CAACOAgAAjwIAAJACAACR AgAAkgIAAJMCAACUAgAAlQIAAJYCAACXAgAAmAIAAJkCAACaAgAAmwIAAJwC AACdAgAAngIAAJ8CAACgAgAAoQIAAKICAACjAgAApAIAAKUCAACmAgAApwIA AKgCAACpAgAAqgIAAKsCAACsAgAArQIAAK4CAACvAgAAsAIAALECAACyAgAA swIAALQCAAC1AgAAtgIAALcCAAC4AgAAuQIAALoCAAC7AgAAvAIAAL0CAAC+ AgAAvwIAAMACAADBAgAAwgIAAMMCAADEAgAAxQIAAMYCAADHAgAAyAIAAMkC AADKAgAAywIAAMwCAADNAgAAzgIAAM8CAADQAgAA0QIAANICAADTAgAA1AIA ANUCAADWAgAA1wIAANgCAADZAgAA2gIAANsCAADcAgAA3QIAAN4CAADfAgAA 4AIAAOECAADiAgAA4wIAAOQCAADlAgAA5gIAAOcCAADoAgAA6QIAAOoCAADr AgAA7AIAAO0CAADuAgAA7wIAAPACAADxAgAA8gIAAPMCAAD0AgAA9QIAAPYC AAD3AgAA+AIAAPkCAAD6AgAA+wIAAPwCAAD9AgAA/gIAAP8CAAAAAwAAAQMA AAIDAAADAwAABAMAAAUDAAAGAwAABwMAAAgDAAAJAwAACgMAAAsDAAAMAwAA DQMAAA4DAAAPAwAAEAMAABEDAAASAwAAEwMAABQDAAAVAwAAFgMAABcDAAAY AwAAGQMAABoDAAAbAwAAHAMAAB0DAAAeAwAAHwMAACADAAAhAwAAIgMAACMD AAAkAwAAJQMAACYDAAAnAwAAKAMAACkDAAAqAwAAKwMAACwDAAAtAwAALgMA AC8DAAAwAwAAMQMAADIDAAAzAwAANAMAADUDAAA2AwAANwMAADgDAAA5AwAA OgMAADsDAAA8AwAAPQMAAD4DAAA/AwAAQAMAAEEDAABCAwAAQwMAAEQDAABF AwAA/v///0cDAABIAwAASQMAAEoDAABLAwAATAMAAE0DAABOAwAATwMAAFAD AABRAwAAUgMAAFMDAABUAwAAVQMAAFYDAABXAwAAWAMAAFkDAABaAwAAWwMA AFwDAAD+////XgMAAF8DAABgAwAAYQMAAGIDAABjAwAAZAMAAGUDAABmAwAA ZwMAAGgDAABpAwAAagMAAGsDAABsAwAAbQMAAG4DAABvAwAAcAMAAHEDAABy AwAAcwMAAHQDAAB1AwAAdgMAAHcDAAB4AwAAeQMAAHoDAAB7AwAAfAMAAH0D AAB+AwAAfwMAAIADAACBAwAAggMAAIMDAACEAwAAhQMAAIYDAACHAwAAiAMA AIkDAACKAwAAiwMAAIwDAACNAwAAjgMAAI8DAACQAwAAkQMAAJIDAACTAwAA lAMAAJUDAACWAwAAlwMAAJgDAACZAwAAmgMAAJsDAACcAwAAnQMAAJ4DAACf AwAAoAMAAKEDAACiAwAAowMAAKQDAAClAwAApgMAAKcDAACoAwAAqQMAAKoD AACrAwAArAMAAK0DAACuAwAArwMAALADAACxAwAAsgMAALMDAAC0AwAAtQMA ALYDAAC3AwAAuAMAALkDAAC6AwAAuwMAALwDAAC9AwAAvgMAAL8DAADAAwAA wQMAAMIDAADDAwAAxAMAAMUDAADGAwAAxwMAAMgDAADJAwAAygMAAMsDAADM AwAAzQMAAM4DAADPAwAA0AMAANEDAADSAwAA0wMAANQDAADVAwAA1gMAANcD AADYAwAA2QMAANoDAADbAwAA3AMAAN0DAADeAwAA3wMAAOADAADhAwAA4gMA AOMDAADkAwAA5QMAAOYDAADnAwAA6AMAAOkDAADqAwAA6wMAAOwDAADtAwAA 7gMAAO8DAADwAwAA8QMAAPIDAADzAwAA9AMAAPUDAAD2AwAA9wMAAPgDAAD5 AwAA+gMAAPsDAAD8AwAA/QMAAP4DAAD/AwAAAAQAAAEEAAACBAAAAwQAAAQE AAAFBAAABgQAAAcEAAAIBAAACQQAAAoEAAALBAAADAQAAA0EAAAOBAAADwQA ABAEAAARBAAAEgQAABMEAAAUBAAAFQQAABYEAAAXBAAAGAQAABkEAAAaBAAA GwQAABwEAAAdBAAAHgQAAB8EAAAgBAAAIQQAACIEAAAjBAAAJAQAACUEAAAm BAAAJwQAACgEAAApBAAAKgQAACsEAAAsBAAALQQAAC4EAAAvBAAAMAQAADEE AAAyBAAAMwQAADQEAAA1BAAANgQAADcEAAA4BAAAOQQAADoEAAA7BAAAPAQA AD0EAAA+BAAAPwQAAEAEAABBBAAAQgQAAEMEAABEBAAARQQAAEYEAABHBAAA SAQAAEkEAABKBAAASwQAAEwEAABNBAAATgQAAE8EAABQBAAAUQQAAFIEAABT BAAAVAQAAFUEAABWBAAAVwQAAFgEAABZBAAAWgQAAFsEAABcBAAAXQQAAF4E AABfBAAAYAQAAGEEAABiBAAAYwQAAGQEAABlBAAAZgQAAGcEAABoBAAAaQQA AGoEAABrBAAAbAQAAG0EAABuBAAAbwQAAHAEAABxBAAAcgQAAHMEAAB0BAAA dQQAAHYEAAB3BAAAeAQAAHkEAAB6BAAAewQAAHwEAAB9BAAAfgQAAH8EAACA BAAAgQQAAIIEAACDBAAAhAQAAIUEAACGBAAAhwQAAIgEAACJBAAAigQAAIsE AACMBAAAjQQAAI4EAACPBAAAkAQAAJEEAACSBAAAkwQAAJQEAACVBAAAlgQA AJcEAACYBAAAmQQAAJoEAACbBAAAnAQAAJ0EAACeBAAAnwQAAKAEAAChBAAA ogQAAKMEAACkBAAApQQAAKYEAACnBAAAqAQAAKkEAACqBAAAqwQAAKwEAACt BAAArgQAAK8EAACwBAAAsQQAALIEAACzBAAAtAQAALUEAAC2BAAAtwQAALgE AAC5BAAAugQAALsEAAC8BAAAvQQAAL4EAAC/BAAAwAQAAMEEAADCBAAAwwQA AMQEAADFBAAAxgQAAMcEAADIBAAAyQQAAMoEAADLBAAAzAQAAM0EAADOBAAA zwQAANAEAADRBAAA0gQAANMEAADUBAAA1QQAANYEAADXBAAA2AQAANkEAADa BAAA2wQAANwEAADdBAAA3gQAAN8EAADgBAAA4QQAAOIEAADjBAAA5AQAAOUE AADmBAAA5wQAAOgEAADpBAAA6gQAAOsEAADsBAAA7QQAAO4EAADvBAAA8AQA APEEAADyBAAA8wQAAPQEAAD1BAAA9gQAAPcEAAD4BAAA+QQAAPoEAAD7BAAA /AQAAP0EAAD+BAAA/wQAAAAFAAABBQAAAgUAAAMFAAAEBQAABQUAAAYFAAAH BQAACAUAAAkFAAAKBQAACwUAAAwFAAANBQAADgUAAA8FAAAQBQAAEQUAABIF AAATBQAAFAUAABUFAAAWBQAAFwUAABgFAAAZBQAAGgUAABsFAAAcBQAAHQUA AB4FAAAfBQAAIAUAACEFAAAiBQAAIwUAACQFAAAlBQAAJgUAACcFAAAoBQAA KQUAACoFAAArBQAALAUAAC0FAAAuBQAALwUAADAFAAAxBQAAMgUAADMFAAA0 BQAANQUAADYFAAA3BQAAOAUAADkFAAA6BQAAOwUAADwFAAA9BQAAPgUAAD8F AABABQAAQQUAAEIFAABDBQAARAUAAEUFAABGBQAARwUAAEgFAABJBQAASgUA AEsFAABMBQAATQUAAE4FAABPBQAAUAUAAFEFAABSBQAAUwUAAFQFAABVBQAA VgUAAFcFAABYBQAAWQUAAFoFAABbBQAAXAUAAF0FAABeBQAAXwUAAGAFAABh BQAAYgUAAGMFAABkBQAAZQUAAGYFAABnBQAAaAUAAGkFAABqBQAAawUAAGwF AABtBQAAbgUAAG8FAABwBQAAcQUAAHIFAABzBQAAdAUAAHUFAAB2BQAAdwUA AHgFAAB5BQAAegUAAHsFAAB8BQAAfQUAAH4FAAB/BQAAgAUAAIEFAACCBQAA gwUAAIQFAACFBQAAhgUAAIcFAACIBQAAiQUAAIoFAACLBQAAjAUAAI0FAACO BQAAjwUAAJAFAACRBQAAkgUAAJMFAACUBQAAlQUAAJYFAACXBQAAmAUAAJkF AACaBQAAmwUAAJwFAACdBQAAngUAAJ8FAACgBQAAoQUAAKIFAACjBQAApAUA AKUFAACmBQAApwUAAKgFAACpBQAAqgUAAKsFAACsBQAArQUAAK4FAACvBQAA sAUAALEFAACyBQAAswUAALQFAAC1BQAAtgUAALcFAAC4BQAAuQUAALoFAAC7 BQAAvAUAAL0FAAC+BQAAvwUAAMAFAADBBQAAwgUAAMMFAADEBQAAxQUAAMYF AADHBQAAyAUAAMkFAADKBQAAywUAAMwFAADNBQAAzgUAAM8FAADQBQAA0QUA ANIFAADTBQAA1AUAANUFAADWBQAA1wUAANgFAADZBQAA2gUAANsFAADcBQAA 3QUAAN4FAADfBQAA4AUAAOEFAADiBQAA4wUAAOQFAADlBQAA5gUAAOcFAADo BQAA6QUAAOoFAADrBQAA7AUAAO0FAADuBQAA7wUAAPAFAADxBQAA8gUAAPMF AAD0BQAA9QUAAPYFAAD3BQAA+AUAAPkFAAD6BQAA+wUAAPwFAAD9BQAA/gUA AP8FAAAABgAAAQYAAAIGAAADBgAABAYAAAUGAAAGBgAABwYAAAgGAAAJBgAA CgYAAAsGAAAMBgAADQYAAA4GAAAPBgAAEAYAABEGAAASBgAAEwYAABQGAAAV BgAAFgYAABcGAAAYBgAAGQYAABoGAAAbBgAAHAYAAB0GAAAeBgAAHwYAACAG AAAhBgAAIgYAACMGAAAkBgAAJQYAACYGAAAnBgAAKAYAACkGAAAqBgAAKwYA ACwGAAAtBgAALgYAAC8GAAAwBgAAMQYAADIGAAAzBgAANAYAADUGAAA2BgAA NwYAADgGAAA5BgAAOgYAADsGAAA8BgAAPQYAAD4GAAA/BgAAQAYAAEEGAABC BgAAQwYAAEQGAABFBgAARgYAAEcGAABIBgAASQYAAEoGAABLBgAATAYAAE0G AABOBgAATwYAAFAGAABRBgAAUgYAAFMGAABUBgAAVQYAAFYGAABXBgAAWAYA AFkGAABaBgAAWwYAAFwGAABdBgAAXgYAAF8GAABgBgAAYQYAAGIGAABjBgAA ZAYAAGUGAABmBgAAZwYAAGgGAABpBgAAagYAAGsGAABsBgAAbQYAAG4GAABv BgAAcAYAAHEGAAByBgAAcwYAAHQGAAB1BgAAdgYAAHcGAAB4BgAAeQYAAHoG AAB7BgAAfAYAAH0GAAB+BgAAfwYAAIAGAACBBgAAggYAAIMGAACEBgAAhQYA AIYGAACHBgAAiAYAAIkGAACKBgAAiwYAAIwGAACNBgAAjgYAAI8GAACQBgAA kQYAAJIGAACTBgAAlAYAAJUGAACWBgAAlwYAAJgGAACZBgAAmgYAAJsGAACc BgAAnQYAAJ4GAACfBgAAoAYAAKEGAACiBgAAowYAAKQGAAClBgAApgYAAKcG AACoBgAAqQYAAKoGAACrBgAArAYAAK0GAACuBgAArwYAALAGAACxBgAAsgYA ALMGAAC0BgAAtQYAALYGAAC3BgAAuAYAALkGAAC6BgAAuwYAALwGAAC9BgAA vgYAAL8GAADABgAAwQYAAMIGAADDBgAAxAYAAMUGAADGBgAAxwYAAMgGAADJ BgAAygYAAMsGAADMBgAAzQYAAM4GAADPBgAA0AYAANEGAADSBgAA0wYAANQG AADVBgAA1gYAANcGAADYBgAA2QYAANoGAADbBgAA3AYAAN0GAADeBgAA3wYA AOAGAADhBgAA4gYAAOMGAADkBgAA5QYAAOYGAADnBgAA6AYAAOkGAADqBgAA 6wYAAOwGAADtBgAA7gYAAO8GAADwBgAA8QYAAPIGAADzBgAA9AYAAPUGAAD2 BgAA9wYAAPgGAAD5BgAA+gYAAPsGAAD8BgAA/QYAAP4GAAD/BgAAAAcAAAEH AAACBwAAAwcAAAQHAAAFBwAABgcAAAcHAAAIBwAACQcAAAoHAAALBwAADAcA AA0HAAAOBwAADwcAABAHAAARBwAAEgcAABMHAAAUBwAAFQcAABYHAAAXBwAA GAcAABkHAAAaBwAAGwcAABwHAAAdBwAAHgcAAB8HAAAgBwAAIQcAACIHAAAj BwAAJAcAACUHAAAmBwAAJwcAACgHAAApBwAAKgcAACsHAAAsBwAALQcAAC4H AAAvBwAAMAcAADEHAAAyBwAAMwcAADQHAAA1BwAANgcAADcHAAA4BwAAOQcA ADoHAAA7BwAAPAcAAD0HAAA+BwAAPwcAAEAHAABBBwAAQgcAAEMHAABEBwAA RQcAAEYHAABHBwAASAcAAEkHAABKBwAASwcAAEwHAABNBwAATgcAAE8HAABQ BwAAUQcAAFIHAABTBwAAVAcAAFUHAABWBwAAVwcAAFgHAABZBwAAWgcAAFsH AABcBwAAXQcAAF4HAABfBwAAYAcAAGEHAABiBwAAYwcAAGQHAABlBwAAZgcA AGcHAABoBwAAaQcAAGoHAABrBwAAbAcAAG0HAABuBwAAbwcAAHAHAABxBwAA cgcAAHMHAAB0BwAAdQcAAHYHAAB3BwAAeAcAAHkHAAB6BwAAewcAAHwHAAB9 BwAAfgcAAH8HAACABwAAgQcAAIIHAACDBwAAhAcAAIUHAACGBwAAhwcAAIgH AACJBwAAigcAAIsHAACMBwAAjQcAAI4HAACPBwAAkAcAAJEHAACSBwAAkwcA AJQHAACVBwAAlgcAAJcHAACYBwAAmQcAAJoHAACbBwAAnAcAAJ0HAACeBwAA nwcAAKAHAAChBwAAogcAAKMHAACkBwAApQcAAKYHAACnBwAAqAcAAKkHAACq BwAAqwcAAKwHAACtBwAArgcAAK8HAACwBwAAsQcAALIHAACzBwAAtAcAALUH AAC2BwAAtwcAALgHAAC5BwAAugcAALsHAAC8BwAAvQcAAL4HAAC/BwAAwAcA AMEHAAD+////wwcAAMQHAADFBwAAxgcAAMcHAADIBwAAyQcAAP7////9//// /f////3////9/////f////3////9/////f////3////9/////f////3////9 /////f////3////9////2wcAAP7////+/////v////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////9SAG8AbwB0ACAARQBu AHQAcgB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAFgAFAf//////////AwAAAAYJAgAAAAAAwAAAAAAAAEYAAAAAAAAA AAAAAACwVdoTHrLLAd0HAACAAAAAAAAAAEQAYQB0AGEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK AAIB////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAYQAAACLJBQAAAAAAMQBUAGEAYgBsAGUAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAgEBAAAA BgAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG AwAAni0AAAAAAABXAG8AcgBkAEQAbwBjAHUAbQBlAG4AdAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgACAQIAAAAFAAAA//// /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASwAAA AAAAAAUAUwB1AG0AbQBhAHIAeQBJAG4AZgBvAHIAbQBhAHQAaQBvAG4AAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAIB////////////////AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQMAAETICAAAAAAABQBE AG8AYwB1AG0AZQBuAHQAUwB1AG0AbQBhAHIAeQBJAG4AZgBvAHIAbQBhAHQA aQBvAG4AAAAAAAAAAAAAADgAAgEEAAAA//////////8AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCBwAAABAAAAAAAAABAEMAbwBtAHAA TwBiAGoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAEgACAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP7///////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////8BAP7/AwoA AP////8GCQIAAAAAAMAAAAAAAABGHwAAAE1pY3Jvc29mdCBPZmZpY2UgV29y ZCBEb2N1bWVudAAKAAAATVNXb3JkRG9jABAAAABXb3JkLkRvY3VtZW50LjgA 9DmycQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAA== --0-741621457-1295269526=:99452-- From gwehrman@sgi.com Mon Jan 17 08:34:54 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0HEYsf0028442 for ; Mon, 17 Jan 2011 08:34:54 -0600 Received: from goalpost.americas.sgi.com (goalpost.americas.sgi.com [128.162.232.54]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1AAF9AC008; Mon, 17 Jan 2011 06:37:08 -0800 (PST) Received: by goalpost.americas.sgi.com (Postfix, from userid 14442) id 7531927023; Mon, 17 Jan 2011 08:37:08 -0600 (CST) Date: Mon, 17 Jan 2011 08:37:08 -0600 From: Geoffrey Wehrman To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110117143708.GE11968@sgi.com> References: <20110114002900.GF16267@dastard> <20110114164016.GB30134@sgi.com> <20110114225907.GH16267@dastard> <20110115041629.GC11968@sgi.com> <20110117051827.GL16267@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110117051827.GL16267@dastard> User-Agent: Mutt/1.5.14 (2007-02-12) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Jan 17, 2011 at 04:18:28PM +1100, Dave Chinner wrote: | On Fri, Jan 14, 2011 at 10:16:29PM -0600, Geoffrey Wehrman wrote: | > On Sat, Jan 15, 2011 at 09:59:07AM +1100, Dave Chinner wrote: | > | On Fri, Jan 14, 2011 at 10:40:16AM -0600, Geoffrey Wehrman wrote: | > | > Also, I'm not saying using XFS_BMAPI_EXACT is feasible. I have a very | > | > minimal understanding of the writepage code path. | > | | > | I think there are situations where this does make sense, but given | > | the potential issues I'm not sure it is a solution that can be | > | extended to the general case. A good discussion point on a different | > | angle, though. ;) | > | > You've convinced me that XFS_BMAPI_EXACT is not the optimal solution. | > | > Upon further consideration, I do like your proposal to make delalloc | > allocation more like an intent/done type operation. The compatibility | > issues aren't all that bad. As long as the filesystem is unmounted | > clean, there is no need for the next mount do log recovery and therefore | > no need to have any knowledge of the new transactions. | | That is a good observation. If there is agreement that this a strong | enough backwards compatibility guarantee (it's good enough for me), | then I think that I will start to prototype this approach. I'm not sure how a version of XFS without the new log recovery code will behave if it encounters a log with the new transactions. I assume it will gracefully abort log recovery and fail the mount with the report of a corrupt log. I have no objection with this compatibility guarantee. | However, this does not solve the extsize allocation issues where we | don't have dirty pages in the page cache covering parts of the | delayed allocation extent so we still need a solution for that. I'm | tending towards zeroing in .aio_write as the simplest solution | because it doesn't cause buffer head/extent tree mapping mismatches, | and it would use the above intent/done operations for crash | resilience so there's no additional, rarely used code path to test | through .writepage. Does that sound reasonable? Zeroing in .aio_write will create zeroed pages covering the entire allocation, correct? This seems like a reasonable and straightforward approach. I wish I had thought of it myself! -- Geoffrey Wehrman 651-683-5496 gwehrman@sgi.com From bpm@sgi.com Mon Jan 17 14:11:10 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0HKBApa056236 for ; Mon, 17 Jan 2011 14:11:10 -0600 Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id C723EAC00C; Mon, 17 Jan 2011 12:13:24 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 20159431F74; Mon, 17 Jan 2011 14:12:40 -0600 (CST) Date: Mon, 17 Jan 2011 14:12:40 -0600 From: bpm@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110117201240.GW28274@sgi.com> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> <20110114235549.GI16267@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110114235549.GI16267@dastard> User-Agent: Mutt/1.5.18 (2008-05-17) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hey Dave, On Sat, Jan 15, 2011 at 10:55:49AM +1100, Dave Chinner wrote: > On Fri, Jan 14, 2011 at 03:43:34PM -0600, bpm@sgi.com wrote: > > It also presents a > > performance issue which I've tried to resolve by extending > > xfs_probe_cluster to probe delalloc extents-- lock up all of the pages > > to be converted before performing the allocation and hold those locks > > until they are submitted for writeback. It's not very pretty but it > > resolves the corruption. > > If we zero the relevant range in the page cache at .aio_write level > like we do with xfs_zero_eof or allocate unwritten extents instead, > then I don't think that you need to make changes like this. Ganging up pages under lock in xfs_page_state_convert (along with exactness in xfs_iomap_write_allocate) was needed to provide exclusion with block_prepare_write because zeroing isn't done in the case of written extents. Converting from delalloc->unwritten has the advantage of __xfs_get_blocks setting each buffer 'new' when you write into the page, so the zeroing is done properly even if you convert the entire extent to unwritten in xfs_vm_writepage instead of just the part you're going to write out. However, when converting from unwritten->written in the completion handler you still need to convert only the part of the extent that was actually written. That might be a lot of transactions in xfs_end_io. > > There is still the issue of crashes... This could be solved by > > converting from delalloc to unwritten in xfs_page_state_convert in this > > very exact way and then to written in the io completion handler. Never > > go delalloc->written directly. > > > > I have not had luck reproducing this on TOT xfs and have come to realize > > that this is because it doesn't do speculative preallocation of larger > > delalloc extents unless you are using extsize... which I haven't tried. > > Have a look at the dynamic speculative allocation patches that just > went into 2.6.38 - I'm very interested to know whether your tests > expose stale data now that it can do up to an entire extent (8GB on > 4k block size) of speculative delalloc for writes that are extending > the file. 8GB, Eek! -Ben From SRS0+ARMe+52+fromorbit.com=david@internode.on.net Mon Jan 17 18:22:27 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0I0MRsn083033 for ; Mon, 17 Jan 2011 18:22:27 -0600 X-ASG-Debug-ID: 1295310280-0e9401b10000-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 A5D06101A0B2 for ; Mon, 17 Jan 2011 16:24:41 -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 9MGZRqInXxkTLL4k for ; Mon, 17 Jan 2011 16:24:41 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 53149357-1927428 for multiple; Tue, 18 Jan 2011 10:54:39 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PezNF-0004f3-SY; Tue, 18 Jan 2011 11:24:37 +1100 Date: Tue, 18 Jan 2011 11:24:37 +1100 From: Dave Chinner To: Geoffrey Wehrman Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110118002437.GS28803@dastard> References: <20110114002900.GF16267@dastard> <20110114164016.GB30134@sgi.com> <20110114225907.GH16267@dastard> <20110115041629.GC11968@sgi.com> <20110117051827.GL16267@dastard> <20110117143708.GE11968@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110117143708.GE11968@sgi.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: 1295310283 X-Barracuda-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.52677 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, Jan 17, 2011 at 08:37:08AM -0600, Geoffrey Wehrman wrote: > On Mon, Jan 17, 2011 at 04:18:28PM +1100, Dave Chinner wrote: > | On Fri, Jan 14, 2011 at 10:16:29PM -0600, Geoffrey Wehrman wrote: > | > On Sat, Jan 15, 2011 at 09:59:07AM +1100, Dave Chinner wrote: > | > | On Fri, Jan 14, 2011 at 10:40:16AM -0600, Geoffrey Wehrman wrote: > | > | > Also, I'm not saying using XFS_BMAPI_EXACT is feasible. I have a very > | > | > minimal understanding of the writepage code path. > | > | > | > | I think there are situations where this does make sense, but given > | > | the potential issues I'm not sure it is a solution that can be > | > | extended to the general case. A good discussion point on a different > | > | angle, though. ;) > | > > | > You've convinced me that XFS_BMAPI_EXACT is not the optimal solution. > | > > | > Upon further consideration, I do like your proposal to make delalloc > | > allocation more like an intent/done type operation. The compatibility > | > issues aren't all that bad. As long as the filesystem is unmounted > | > clean, there is no need for the next mount do log recovery and therefore > | > no need to have any knowledge of the new transactions. > | > | That is a good observation. If there is agreement that this a strong > | enough backwards compatibility guarantee (it's good enough for me), > | then I think that I will start to prototype this approach. > > I'm not sure how a version of XFS without the new log recovery code will > behave if it encounters a log with the new transactions. I assume it > will gracefully abort log recovery and fail the mount with the report of > a corrupt log. I have no objection with this compatibility guarantee. It will do the same as you describe for the old log recovery code, so there should be no new problems there. > | However, this does not solve the extsize allocation issues where we > | don't have dirty pages in the page cache covering parts of the > | delayed allocation extent so we still need a solution for that. I'm > | tending towards zeroing in .aio_write as the simplest solution > | because it doesn't cause buffer head/extent tree mapping mismatches, > | and it would use the above intent/done operations for crash > | resilience so there's no additional, rarely used code path to test > | through .writepage. Does that sound reasonable? > > Zeroing in .aio_write will create zeroed pages covering the entire > allocation, correct? Yes, though it only needs to zero the regions that the write does not cover itself - no need to zero what we're about to put data into. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+ulek+52+fromorbit.com=david@internode.on.net Mon Jan 17 19:42:40 2011 X-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_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 p0I1gdag089152 for ; Mon, 17 Jan 2011 19:42:39 -0600 X-ASG-Debug-ID: 1295315094-40bb01140000-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 DE728101A4B5 for ; Mon, 17 Jan 2011 17:44:54 -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 8OMHXKMPNi3FPYXM for ; Mon, 17 Jan 2011 17:44:54 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 7830448-1927428 for multiple; Tue, 18 Jan 2011 12:14:53 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pf0ct-0004mR-PL; Tue, 18 Jan 2011 12:44:51 +1100 Date: Tue, 18 Jan 2011 12:44:51 +1100 From: Dave Chinner To: bpm@sgi.com Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110118014451.GT28803@dastard> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> <20110114235549.GI16267@dastard> <20110117201240.GW28274@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110117201240.GW28274@sgi.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: 1295315095 X-Barracuda-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.52683 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, Jan 17, 2011 at 02:12:40PM -0600, bpm@sgi.com wrote: > Hey Dave, > > On Sat, Jan 15, 2011 at 10:55:49AM +1100, Dave Chinner wrote: > > On Fri, Jan 14, 2011 at 03:43:34PM -0600, bpm@sgi.com wrote: > > > It also presents a > > > performance issue which I've tried to resolve by extending > > > xfs_probe_cluster to probe delalloc extents-- lock up all of the pages > > > to be converted before performing the allocation and hold those locks > > > until they are submitted for writeback. It's not very pretty but it > > > resolves the corruption. > > > > If we zero the relevant range in the page cache at .aio_write level > > like we do with xfs_zero_eof or allocate unwritten extents instead, > > then I don't think that you need to make changes like this. > > Ganging up pages under lock in xfs_page_state_convert (along with > exactness in xfs_iomap_write_allocate) was needed to provide exclusion > with block_prepare_write because zeroing isn't done in the case of > written extents. > > Converting from delalloc->unwritten has the advantage of > __xfs_get_blocks setting each buffer 'new' when you write into the page, > so the zeroing is done properly even if you convert the entire extent to > unwritten in xfs_vm_writepage instead of just the part you're going to > write out. That's definitely the advantage to using unwritten extents in this case. However, it also means that all the buffers that were already set up at the time of delalloc->unwritten as buffer_delay() are now incorrect - the underlying extent is now unwritten, no delayed allocation. Hence when it comes to writing buffer_delay() buffers, we would also have to handle the case that they are really buffer_unwritten(). That could be very nasty.... > However, when converting from unwritten->written in the > completion handler you still need to convert only the part of the extent > that was actually written. That might be a lot of transactions in > xfs_end_io. Yes, that was my original concern fo the general case and why I was looking at an intent/done transaction arrangement rather than unwritten/conversion arrangement. The "done" part of the transaction is much less overhead, and we can safely do the transaction reservation (i.e. the blocking bits) before the IO is issued so that we keep the loverhead on the completion side down to an absolute minimum.... However, when tracking down an assert failure reported by Christoph with the new speculative delalloc code this morning, I've realised that extent alignment for delayed allocation in xfs_bmapi() is badly broken. It can result in attempting to set up a delalloc extent larger than the maximum extent size because it aligns extents by extending them. Hence if the extent being allocated is MAXEXTLEN in length, the extent size alignment will extend it and we'll do nasty stuff to the extent record we insert into the incore extent tree. To make matters worse, extent size is not limited to the maximum supported extent size in the filesystem. The extent size can be set to (2^32 bytes - 1 fsblock), but for 512 byte block size filesystems the maximum extent size is 2^21 * 2^9 = 2^30. You can't align extents to a size larger than that maximum extent size, and if you try: # sudo mkfs.xfs -b size=512 -f /dev/vda ... # xfs_io -f -c "extsize 2g" \ > -c "ftruncate 4g" \ > -c "pwrite 64k 512" \ > -c "bmap -vp" /mnt/test/foo XFS: Assertion failed: k < (1 << STARTBLOCKVALBITS), file: fs/xfs/xfs_bmap_btree.h, line: 83 .... Call Trace: [] xfs_bmapi+0x167c/0x1a20 [] xfs_iomap_write_delay+0x1c2/0x340 [] __xfs_get_blocks+0x402/0x4d0 [] xfs_get_blocks+0x11/0x20 [] __block_write_begin+0x20b/0x5a0 [] block_write_begin+0x56/0x90 [] xfs_vm_write_begin+0x41/0x70 [] generic_file_buffered_write+0x106/0x270 [] xfs_file_buffered_aio_write+0xd2/0x190 [] xfs_file_aio_write+0x1c2/0x310 [] do_sync_write+0xda/0x120 [] vfs_write+0xd0/0x190 [] sys_pwrite64+0x82/0xa0 [] system_call_fastpath+0x16/0x1b Which failed this check: 81 static inline xfs_fsblock_t nullstartblock(int k) 82 { 83 >>>>>> ASSERT(k < (1 << STARTBLOCKVALBITS)); 84 return STARTBLOCKMASK | (k); 85 } You end up with a corrupt extent record in the inncore extent list. Along the same lines, extsize > ag size for non-rt inode is also invalid. It won't be handled correctly by the delalloc->unwritten method because delalloc conversion is currently limited to a single allocation per .writepage call to avoid races with truncate. Hence when extsize is larger than an AG, we'll only allocate the part within an a single AG and hence leave part of the delalloc range in the delalloc state. With no pages covering this range, it'll never get written or allocated. Not to mention that it'll trip assert failures in xfs_getbmap: # sudo mkfs.xfs -b size=4k -f-dagsize=1g /dev/vda ... # xfs_io -f -c "extsize 2g" \ > -c "ftruncate 4g" \ > -c "pwrite 64k 512" \ > -c "bmap -vp" /mnt/test/foo XFS: Assertion failed: ((iflags & BMV_IF_DELALLOC) != 0) || (map[i].br_startblock != DELAYSTARTBLOCK) file: fs/xfs/xfs_bmap.c, line: 5558 ..... These problems indicate to me that doing extent size alignment for delayed allocation inside xfs_bmapi() is wrong on many levels. Moving the "alignment" to zeroing at the .aio_write level solves these issues except for one detail - ensuring that speculative delalloc beyond EOF is correctly aligned - this can be handled easily by the prealloc code. Hence I'm thinking that the solution we should be implementing is: 1. Limit extsize values to sane alignment boundaries. 2. Do extsize alignment for delalloc by zeroing the page cache at the .aio_write level for regions not covered by the write. 3. Ensure that speculative delalloc is extsize aligned 4. Rip the delalloc extent alignment code from xfs_bmapi() 5. Implement alloc intent/done transactions to protect against stale data exposure caused by crashing between allocation and data write completion (*). I think that covers all the issues we've discussed - have I missed anything? Cheers, Dave. (*) FWIW, since I proposed the intent/done method, I've realised it also solves the main difficulty in implementing data-in-inode safely: how to sycnhronise the unlogged data write when we move the data out of the inode with the allocation transaction so we know when we can allow the tail of the log to move past the allocation transaction or whether we can replay the format change transaction in log recovery..... -- Dave Chinner david@fromorbit.com From SRS0+IQ7O+52+fromorbit.com=david@internode.on.net Mon Jan 17 22:55:19 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0I4tItP106534 for ; Mon, 17 Jan 2011 22:55:18 -0600 X-ASG-Debug-ID: 1295326652-44d601ec0000-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 59E5F101A551 for ; Mon, 17 Jan 2011 20:57: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 MJGn7tUqFeG364fw for ; Mon, 17 Jan 2011 20:57:33 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 53318908-1927428 for multiple; Tue, 18 Jan 2011 15:27:32 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pf3dK-00053Y-LH; Tue, 18 Jan 2011 15:57:30 +1100 Date: Tue, 18 Jan 2011 15:57:30 +1100 From: Dave Chinner To: Ajeet Yadav Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS internal error xfs_iformat(realtime) even after xfs_repair. Subject: Re: XFS internal error xfs_iformat(realtime) even after xfs_repair. Message-ID: <20110118045730.GU28803@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-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1295326655 X-Barracuda-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.52695 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, Jan 17, 2011 at 09:12:54PM +0900, Ajeet Yadav wrote: > Kernel: 2.6.30.9, XFS backported from 2.6.34, xfsprogs-3.0.5 > > I used a script > 1. create some file, directories, symlinks > 2. unmount the file system > 3. run xfs_bd with blocktrash > 4. xfs_xfsrepair -L > 5. list "ls -lR" > 6. remove all file and directory "rm -rf * OK, so you are effectively corrupting random blocks by introducing random bit errors in the blocks. No surprise that some errors are not being detected - what is the blocktrash command that you are using? > Often during testing I get the below backtrace from kernel during ls, rm > even though I already run xfs_repair on it. > Is it related to xfsrepair or xfs ?. I think xfs_repair must have detected > this problem and corrected it. xfs_repair is not checking the di_flags field in the inode for sanity, hence having a wrong flag set is going unnoticed. > There is similar problem already reported by > http://oss.sgi.com/archives/xfs/2010-06/msg00349.html Similar error message (xfs_iformt found an inode corruption), but that one is a completely different problem. Does the patch below (compile tested only) detect the bad inode? Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs_repair: validate inode di_flags field xfs_repair is not validating the di_flags field in the inode for sanity. Block fuzzing indicates that we are not picking situations like the RT bit being set on filesystems without realtime devices. Signed-off-by: Dave Chinner --- repair/dinode.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 62 insertions(+), 0 deletions(-) diff --git a/repair/dinode.c b/repair/dinode.c index 2fa850d..e05d4e0 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -2519,6 +2519,68 @@ process_dinode_int(xfs_mount_t *mp, goto clear_bad_out; } + /* + * check that we only have valid flags set, and those that are set make + * sense. + */ + if (dino->di_flags) { + uint16_t flags = be16_to_cpu(dino->di_flags); + + if (flags & ~XFS_DIFLAG_ANY) { + do_warn(_("Bad flags set in inode %llu"), lino); + flags &= ~XFS_DIFLAG_ANY; + } + + if (flags & (XFS_DIFLAG_REALTIME | XFS_DIFLAG_RTINHERIT)) { + /* need an rt-dev! */ + if (!rt_name) { + do_warn(_( + "inode %llu has RT flag set but there is no RT device"), lino); + flags &= ~(XFS_DIFLAG_REALTIME | + XFS_DIFLAG_RTINHERIT); + } + } + if (flags & XFS_DIFLAG_NEWRTBM_BIT) { + /* must be a rt bitmap inode */ + if (lino != mp->m_sb.sb_rbmino) { + do_warn(_("inode %llu not rt bitmap"), lino); + flags &= ~XFS_DIFLAG_NEWRTBM_BIT; + } + } + if (flags & (XFS_DIFLAG_RTINHERIT | + XFS_DIFLAG_EXTSZINHERIT | + XFS_DIFLAG_PROJINHERIT | + XFS_DIFLAG_NOSYMLINKS)) { + /* must be a directory */ + if (di_mode && !S_ISDIR(di_mode)) { + do_warn(_( + "directory flags set on non-directory inode %llu"), + lino); + flags &= ~(XFS_DIFLAG_RTINHERIT | + XFS_DIFLAG_EXTSZINHERIT | + XFS_DIFLAG_PROJINHERIT | + XFS_DIFLAG_NOSYMLINKS); + } + } + if (flags & (XFS_DIFLAG_REALTIME | XFS_XFLAG_EXTSIZE)) { + /* must be a file */ + if (di_mode && !S_ISREG(di_mode)) { + do_warn(_( + "file flags set on non-file inode %llu"), lino); + flags &= ~(XFS_DIFLAG_REALTIME | + XFS_XFLAG_EXTSIZE); + } + } + if (!verify_mode && flags != be16_to_cpu(dino->di_flags)) { + if (!no_modify) { + do_warn(_(", fixing bad flags.\n")); + dino->di_flags = cpu_to_be16(flags); + *dirty = 1; + } else + do_warn(_(", would fix bad flags.\n")); + } + } + if (verify_mode) return retval; From BATV+373926bbfd3724b3a3b5+2704+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 18 06:33:03 2011 X-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 p0ICX26F127877 for ; Tue, 18 Jan 2011 06:33:03 -0600 X-ASG-Debug-ID: 1295354119-68d400630000-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 512D5271203 for ; Tue, 18 Jan 2011 04:35:19 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 3EsF0jBmTNE1XdRF for ; Tue, 18 Jan 2011 04:35:19 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfAmK-0003yZ-Bq; Tue, 18 Jan 2011 12:35:16 +0000 Date: Tue, 18 Jan 2011 07:35:16 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: fix log ticket leak on forced shutdown. Subject: Re: [PATCH 1/2] xfs: fix log ticket leak on forced shutdown. Message-ID: <20110118123516.GA12516@infradead.org> References: <1295010430-12495-1-git-send-email-david@fromorbit.com> <1295010430-12495-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295010430-12495-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: 1295354120 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 > By inspection, the leak occurs when xlog_write() returns and error > and we jump to the abort path without dropping the reference on the > active ticket. Indeed, Reviewed-by: Christoph Hellwig From BATV+373926bbfd3724b3a3b5+2704+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 18 06:44:25 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ICiOwE128577 for ; Tue, 18 Jan 2011 06:44:24 -0600 X-ASG-Debug-ID: 1295354785-4f1b01fc0000-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 1827127185C for ; Tue, 18 Jan 2011 04:46:25 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id MSL6nQ3Asa0KnANi for ; Tue, 18 Jan 2011 04:46:25 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfAx7-0005Ys-KR; Tue, 18 Jan 2011 12:46:25 +0000 Date: Tue, 18 Jan 2011 07:46:25 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: fix efi item leak on forced shutdown Subject: Re: [PATCH 2/2] xfs: fix efi item leak on forced shutdown Message-ID: <20110118124625.GB12516@infradead.org> References: <1295010430-12495-1-git-send-email-david@fromorbit.com> <1295010430-12495-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295010430-12495-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: 1295354786 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, Jan 15, 2011 at 12:07:10AM +1100, Dave Chinner wrote: > The cause of the leak is that the "remove" parameter of IOP_UNPIN() > is never set when a CIL push is aborted. This means that the EFI > item is never freed if it was in the push being cancelled. The > problem is specific to delayed logging. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_trans.c | 10 ++++++++++ > 1 files changed, 10 insertions(+), 0 deletions(-) > > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > index f80a067..e66ce5e 100644 > --- a/fs/xfs/xfs_trans.c > +++ b/fs/xfs/xfs_trans.c > @@ -1472,6 +1472,16 @@ xfs_trans_committed_bulk( > if (XFS_LSN_CMP(item_lsn, (xfs_lsn_t)-1) == 0) > continue; > > + /* > + * if we are aborting the operation, no point in inserting the > + * object into the AIL as we areee in a shutdown situation. that's a few 'e' too much. > + */ > + if (aborted) { > + ASSERT(XFS_FORCED_SHUTDOWN(ailp->xa_mount)); > + IOP_UNPIN(lip, aborted); > + continue; > + } Hmm, this is not symmetric with the non-delaylog path. xfs_trans_item_committed never sets the remove flag to IOP_UNPIN, even if the transaction commit was aborted. It seems like the CIL code is missing an equivalent to xfs_trans_uncommit for the case that xfs_log_write or xfs_log_done fail. From BATV+373926bbfd3724b3a3b5+2704+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 18 06:46:46 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ICkkI0128752 for ; Tue, 18 Jan 2011 06:46:46 -0600 X-ASG-Debug-ID: 1295354944-35c303960000-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 D7821271880 for ; Tue, 18 Jan 2011 04:49:04 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id xjJguCPlbB6pkqjU for ; Tue, 18 Jan 2011 04:49:04 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfAzg-0005aF-8q; Tue, 18 Jan 2011 12:49:04 +0000 Date: Tue, 18 Jan 2011 07:49:04 -0500 From: Christoph Hellwig To: Josef Bacik Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Xfsprogs: add fiemap command to xfs_io Subject: Re: [PATCH] Xfsprogs: add fiemap command to xfs_io Message-ID: <20110118124904.GA21440@infradead.org> References: <1295009501-17794-1-git-send-email-josef@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295009501-17794-1-git-send-email-josef@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: 1295354944 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, Jan 14, 2011 at 07:51:41AM -0500, Josef Bacik wrote: > When trying to add a test for hole punching I noticed that the "bmap" command > only works on XFS, which makes testing hole punching on other fs's kind of > difficult. To fix this I've added an fiemap command that works almost exactly > like bmap. It is formatted similarly and takes similar flags, the only thing > thats different is obviously it doesn't spit out AG info and it doesn't make > finding prealloc space optional. This is my first foray into all of this stuff > so a good hard look would be appreciated. I tested it with a few different > files to make sure bmap and fiemap both looked the same. Thanks, Looks good to me. From BATV+373926bbfd3724b3a3b5+2704+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 18 06:48:56 2011 X-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 p0ICmuM8128817 for ; Tue, 18 Jan 2011 06:48:56 -0600 X-ASG-Debug-ID: 1295355074-5ebf03310000-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 02EC419E1EC2 for ; Tue, 18 Jan 2011 04:51:14 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Xkbcgu60vp75FdE7 for ; Tue, 18 Jan 2011 04:51:14 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfB1k-0006Dk-Gn; Tue, 18 Jan 2011 12:51:12 +0000 Date: Tue, 18 Jan 2011 07:51:12 -0500 From: Christoph Hellwig To: Josef Bacik Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: add fpunch command for hole punching via fallocate Subject: Re: [PATCH] xfsprogs: add fpunch command for hole punching via fallocate Message-ID: <20110118125112.GB21440@infradead.org> References: <1295009545-17839-1-git-send-email-josef@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295009545-17839-1-git-send-email-josef@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: 1295355075 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 mostly good, but I wonder what the point of a new command for this is. It's just one new flag to fallocate, so I'd also implement it as a flag to the fallocate command. > @@ -153,8 +156,10 @@ fallocate_f( > xfs_flock64_t segment; > int mode = 0; > int c; > + const char *opts; > > - while ((c = getopt(argc, argv, "k")) != EOF) { > + opts = "k"; > + while ((c = getopt(argc, argv, opts)) != EOF) { > switch (c) { > case 'k': > mode = FALLOC_FL_KEEP_SIZE; Why do you change unrelated code? > +#if defined (FALLOC_FL_PUNCH_HOLE) I'd rather have a #ifndef FALLOC_FL_PUNCH_HOLE #define FALLOC_FL_PUNCH_HOLE 0x02 #endif to avoid requiring newest kernel headers. From BATV+373926bbfd3724b3a3b5+2704+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 18 06:58:05 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ICw52k129162 for ; Tue, 18 Jan 2011 06:58:05 -0600 X-ASG-Debug-ID: 1295355623-697a010f0000-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 9A084271394 for ; Tue, 18 Jan 2011 05:00:23 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id oBHWfiXzue0GFN1J for ; Tue, 18 Jan 2011 05:00:23 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfBAd-0007qv-82; Tue, 18 Jan 2011 13:00:23 +0000 Date: Tue, 18 Jan 2011 08:00:23 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 07/12] xfs: kill xfs_fs_mount_cmn_err() macro Subject: Re: [PATCH 07/12] xfs: kill xfs_fs_mount_cmn_err() macro Message-ID: <20110118130023.GA23988@infradead.org> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> <1294792553-8378-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294792553-8378-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: 1295355623 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, Jan 12, 2011 at 11:35:48AM +1100, Dave Chinner wrote: > From: Dave Chinner > > The xfs_fs_mount_cmn_err() hide a simple check as to whether the > mount path should output an error or not. Remove the macro and open > code the check. I would be nice to just move the quite flag into the normal mount flags and have a xfs_mount_warn that checks it based off the mp. From BATV+373926bbfd3724b3a3b5+2704+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 18 06:59:48 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ICxlmS129235 for ; Tue, 18 Jan 2011 06:59:48 -0600 X-ASG-Debug-ID: 1295355725-1f9c039f0000-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 26918161FB17 for ; Tue, 18 Jan 2011 05:02:05 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id jhEO1ZSJdi4HIDae for ; Tue, 18 Jan 2011 05:02:05 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfBCH-0007sh-CV; Tue, 18 Jan 2011 13:02:05 +0000 Date: Tue, 18 Jan 2011 08:02:05 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 12/12] xfs: kill support/debug.[ch] Subject: Re: [PATCH 12/12] xfs: kill support/debug.[ch] Message-ID: <20110118130205.GB23988@infradead.org> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> <1294792553-8378-13-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294792553-8378-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: 1295355726 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 > # Objects in support/ > xfs-y += $(addprefix support/, \ > - debug.o \ > uuid.o) This can become just: xfs-y += support/uuid.o unless, of course we managed to kill off uuid.c as well. From BATV+373926bbfd3724b3a3b5+2704+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 18 07:00:56 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ID0u3I129297 for ; Tue, 18 Jan 2011 07:00:56 -0600 X-ASG-Debug-ID: 1295355794-65d203120000-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 8A9D31EA063B for ; Tue, 18 Jan 2011 05:03:14 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id wKrPQhx67VAG4hTU for ; Tue, 18 Jan 2011 05:03:14 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfBDO-0007u3-5s; Tue, 18 Jan 2011 13:03:14 +0000 Date: Tue, 18 Jan 2011 08:03:14 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [RFC, PATCH 0/12] xfs: rework error logging infrastructure Subject: Re: [RFC, PATCH 0/12] xfs: rework error logging infrastructure Message-ID: <20110118130314.GC23988@infradead.org> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294792553-8378-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: 1295355794 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 series looks good to me. One thing that feels a bit odd is the xfs_printk.[ch] name - the functions exported to the rest of the code don't contain prink anyway. Maybe xfs_msg.[ch] or xfs_message.[ch]? Otherwise looks good, Reviewed-by: Christoph Hellwig for the whole series. From josef@redhat.com Tue Jan 18 07:07:33 2011 X-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 p0ID7WMh129544 for ; Tue, 18 Jan 2011 07:07:33 -0600 X-ASG-Debug-ID: 1295356190-61f703b80000-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 D93511EA07D6 for ; Tue, 18 Jan 2011 05:09:50 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xHir3vzfuBcbhHoB for ; Tue, 18 Jan 2011 05:09:50 -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 p0ID9c1c007753 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 18 Jan 2011 08:09:42 -0500 Received: from dhcp231-156.rdu.redhat.com (dhcp231-156.rdu.redhat.com [10.11.231.156]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p0ID9dab010063; Tue, 18 Jan 2011 08:09:39 -0500 Date: Tue, 18 Jan 2011 08:06:03 -0500 From: Josef Bacik To: Christoph Hellwig Cc: Josef Bacik , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: add fpunch command for hole punching via fallocate Subject: Re: [PATCH] xfsprogs: add fpunch command for hole punching via fallocate Message-ID: <20110118130603.GA23491@dhcp231-156.rdu.redhat.com> References: <1295009545-17839-1-git-send-email-josef@redhat.com> <20110118125112.GB21440@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118125112.GB21440@infradead.org> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1295356190 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, Jan 18, 2011 at 07:51:12AM -0500, Christoph Hellwig wrote: > Looks mostly good, but I wonder what the point of a new command for this > is. It's just one new flag to fallocate, so I'd also implement it as > a flag to the fallocate command. > :( thats what I did to begin with, and Dave said he'd rather have a seperate command. > > @@ -153,8 +156,10 @@ fallocate_f( > > xfs_flock64_t segment; > > int mode = 0; > > int c; > > + const char *opts; > > > > - while ((c = getopt(argc, argv, "k")) != EOF) { > > + opts = "k"; > > + while ((c = getopt(argc, argv, opts)) != EOF) { > > switch (c) { > > case 'k': > > mode = FALLOC_FL_KEEP_SIZE; > > Why do you change unrelated code? > Crap sorry this is left over from my original patch. > > +#if defined (FALLOC_FL_PUNCH_HOLE) > > I'd rather have a > > #ifndef FALLOC_FL_PUNCH_HOLE > #define FALLOC_FL_PUNCH_HOLE 0x02 > #endif > > to avoid requiring newest kernel headers. > Sounds good. So which do we want, a new command or a new flag? Thanks, Josef From BATV+373926bbfd3724b3a3b5+2704+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 18 07:09:45 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ID9jdT129653 for ; Tue, 18 Jan 2011 07:09:45 -0600 X-ASG-Debug-ID: 1295356323-61de03bc0000-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 C4BAB1EA07FB for ; Tue, 18 Jan 2011 05:12:03 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id QuIq5LASNaFwmDgn for ; Tue, 18 Jan 2011 05:12:03 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfBLv-00019G-96; Tue, 18 Jan 2011 13:12:03 +0000 Date: Tue, 18 Jan 2011 08:12:03 -0500 From: Christoph Hellwig To: Josef Bacik Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: add fpunch command for hole punching via fallocate Subject: Re: [PATCH] xfsprogs: add fpunch command for hole punching via fallocate Message-ID: <20110118131203.GA4349@infradead.org> References: <1295009545-17839-1-git-send-email-josef@redhat.com> <20110118125112.GB21440@infradead.org> <20110118130603.GA23491@dhcp231-156.rdu.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118130603.GA23491@dhcp231-156.rdu.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: 1295356323 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, Jan 18, 2011 at 08:06:03AM -0500, Josef Bacik wrote: > Sounds good. So which do we want, a new command or a new flag? Thanks, I'll wait for dave to chime in. I think we should absolutely expose it as a fallocate flag, but if there's a good reason we can also expose it as a separate command. From ccoager@davisvision.com Tue Jan 18 08:14:31 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0IEEVJI135063 for ; Tue, 18 Jan 2011 08:14:31 -0600 X-ASG-Debug-ID: 1295360208-505302330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from zixvpm01.zixvpm.davisvision.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6636819E2002 for ; Tue, 18 Jan 2011 06:16:48 -0800 (PST) Received: from zixvpm01.zixvpm.davisvision.com (zixvpm01.zixvpm.davisvision.com [65.213.99.44]) by cuda.sgi.com with ESMTP id KULi2X7ChyxbTCMQ for ; Tue, 18 Jan 2011 06:16:48 -0800 (PST) Received: from zixvpm01.zixvpm.davisvision.com (ZixVPM [127.0.0.1]) by Outbound.davisvision.com (Proprietary) with ESMTP id 28E508CC032 for ; Tue, 18 Jan 2011 09:16:48 -0500 (EST) Received: from riley.davisvision.com (unknown [10.51.11.112]) by zixvpm01.zixvpm.davisvision.com (Proprietary) with ESMTP id A7E09358015; Tue, 18 Jan 2011 09:16:47 -0500 (EST) Received: from riley.davisvision.com (localhost [127.0.0.1]) by localhost (Postfix) with SMTP id 98C302463A; Tue, 18 Jan 2011 09:16:47 -0500 (EST) Received: from [192.168.148.68] (ccoager-linux.davisvision.com [192.168.148.68]) by riley.davisvision.com (Postfix) with ESMTP id 8171524637; Tue, 18 Jan 2011 09:16:47 -0500 (EST) Message-ID: <1779_1295360207_4D35A0CF_1779_747_1_4D35A0CF.9050503@davisvision.com> Date: Tue, 18 Jan 2011 09:16:47 -0500 From: Cory Coager Organization: Davis Vision User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101208 Lightning/1.0b2 Thunderbird/3.1.7 MIME-Version: 1.0 To: xfs@oss.sgi.com CC: Stan Hoeppner X-ASG-Orig-Subj: Re: extremely slow write performance plaintext Subject: Re: extremely slow write performance plaintext References: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> <20110113233527.6dca104d@galadriel.home> <18993_1294964274_4D2F9632_18993_1387_1_F79CF9ADB27B2646B59221B7355263830CC143B1@NYL-EXCH1.HVHCVision.com> <4D30A945.4060000@hardwarefreak.com> <27616_1295038110_4D30B69E_27616_233_1_4D30B69E.4020506@davisvision.com> <4D30C7F3.3040105@hardwarefreak.com> In-Reply-To: <4D30C7F3.3040105@hardwarefreak.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Banner: Set X-Barracuda-Connect: zixvpm01.zixvpm.davisvision.com[65.213.99.44] X-Barracuda-Start-Time: 1295360209 X-Barracuda-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.52732 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 01/14/2011 05:02 PM, Stan Hoeppner wrote: > The controller should do this automatically. You'll have to check the docs to > verify. This is to safeguard data. The BBWC protects unwritten data in the > controller cache only, not the drives' caches. It won't negatively affect > performance if the drives' caches are enabled. On the contrary, it would > probably increase performance a bit. It's simply less safe having them enabled > in the event of a crash. > > After rereading your original post I don't think there's any issue here anyway. > You stated you have 24 drives in 2 arrays (although you didn't state if all the > disks are on one P600 or two). > Just one P600. > This was the important part I was looking for. It's apparently not a cache > issue then, unless the utility is lying or querying the wrong controller or > something. > > Nothing relevant in dmesg or any other logs? No errors of any kind? Does > iostat reveal anything even slightly odd? Nothing interesting in dmesg. iostat looks pretty dead on average. During the dd write its doing about ~7tps according to iostat. > I also just noticed you're testing writes with a 1k block size. That seems > awefully small. Does the write throughput increase any when you test with a > 4k/8k/16k block size? Yes, it the throughput does increase with larger block sizes. I was able to get ~13MB/s with 16k block size, still terrible however. > BTW, this is an old machine. PCI-X is dead. Did this slow write trouble just > start recently? What has changed since it previously worked fine? The array is new and newly implemented. > You're making it very difficult to assist you by not providing basic > troubleshooting information. I.e. > > What has changed since the system functioned properly? > When did it change? > Did it ever work properly? > Etc. > > God I hate pulling teeth... :) No, it has never worked properly. Also, I want to stress that I am only having performance issues with one logical volume, the others seem fine. ------------------------------------------------------------------------ The information contained in this communication is intended only for the use of the recipient(s) named above. It may contain information that is privileged or confidential, and may be protected by State and/or Federal Regulations. If the reader of this message is not the intended recipient, you are hereby notified that any dissemination, distribution, or copying of this communication, or any of its contents, is strictly prohibited. If you have received this communication in error, please return it to the sender immediately and delete the original message and any copy of it from your computer system. If you have any questions concerning this message, please contact the sender. ------------------------------------------------------------------------ From gwehrman@sgi.com Tue Jan 18 08:27:45 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0IERj1p135600 for ; Tue, 18 Jan 2011 08:27:45 -0600 Received: from goalpost.americas.sgi.com (goalpost.americas.sgi.com [128.162.232.54]) by relay2.corp.sgi.com (Postfix) with ESMTP id DA555304066; Tue, 18 Jan 2011 06:30:00 -0800 (PST) Received: by goalpost.americas.sgi.com (Postfix, from userid 14442) id 7856927084; Tue, 18 Jan 2011 08:30:00 -0600 (CST) Date: Tue, 18 Jan 2011 08:30:00 -0600 From: Geoffrey Wehrman To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110118143000.GB8803@sgi.com> References: <20110114002900.GF16267@dastard> <20110114164016.GB30134@sgi.com> <20110114225907.GH16267@dastard> <20110115041629.GC11968@sgi.com> <20110117051827.GL16267@dastard> <20110117143708.GE11968@sgi.com> <20110118002437.GS28803@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118002437.GS28803@dastard> User-Agent: Mutt/1.5.14 (2007-02-12) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Jan 18, 2011 at 11:24:37AM +1100, Dave Chinner wrote: | On Mon, Jan 17, 2011 at 08:37:08AM -0600, Geoffrey Wehrman wrote: | > On Mon, Jan 17, 2011 at 04:18:28PM +1100, Dave Chinner wrote: | > | However, this does not solve the extsize allocation issues where we | > | don't have dirty pages in the page cache covering parts of the | > | delayed allocation extent so we still need a solution for that. I'm | > | tending towards zeroing in .aio_write as the simplest solution | > | because it doesn't cause buffer head/extent tree mapping mismatches, | > | and it would use the above intent/done operations for crash | > | resilience so there's no additional, rarely used code path to test | > | through .writepage. Does that sound reasonable? | > | > Zeroing in .aio_write will create zeroed pages covering the entire | > allocation, correct? | | Yes, though it only needs to zero the regions that the write does | not cover itself - no need to zero what we're about to put data | into. ;) Glad you were able to understand what I meant. Something I didn't think of earlier though: What happens when I try to use an 8 GB on a system with only 4 GB of memory? I'm not really worried about this pathological case, but I do wonder what the effects will be of allocating what could be significant quantities of memory in .aio_write. -- Geoffrey Wehrman 651-683-5496 gwehrman@sgi.com From bpm@sgi.com Tue Jan 18 14:28:16 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0IKSFR6156302 for ; Tue, 18 Jan 2011 14:28:16 -0600 Received: from lady3jane.americas.sgi.com (lady3jane.americas.sgi.com [128.162.244.187]) by relay1.corp.sgi.com (Postfix) with ESMTP id 602DB8F8094; Tue, 18 Jan 2011 12:30:30 -0800 (PST) Received: from lady3jane.americas.sgi.com (localhost [127.0.0.1]) by lady3jane.americas.sgi.com (Postfix) with ESMTP id 11A932417769; Tue, 18 Jan 2011 14:31:33 -0600 (CST) Subject: [PATCH] Series short description To: aelder@sgi.com From: Ben Myers Cc: david@fromorbit.com, xfs@oss.sgi.com Date: Tue, 18 Jan 2011 14:31:33 -0600 Message-ID: <20110118203126.5082.51275.stgit@lady3jane.americas.sgi.com> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 The following series implements... --- Ben Myers (1): xfs_bmap_add_extent_delay_real should set br_startblock to nullstartblock fs/xfs/xfs_bmap.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) -- Signature From bpm@sgi.com Tue Jan 18 14:33:08 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0IKX886156526 for ; Tue, 18 Jan 2011 14:33:08 -0600 Received: from lady3jane.americas.sgi.com (lady3jane.americas.sgi.com [128.162.244.187]) by relay1.corp.sgi.com (Postfix) with ESMTP id 558DF8F808E; Tue, 18 Jan 2011 12:35:27 -0800 (PST) Received: from lady3jane.americas.sgi.com (localhost [127.0.0.1]) by lady3jane.americas.sgi.com (Postfix) with ESMTP id 36CB52417769; Tue, 18 Jan 2011 14:36:29 -0600 (CST) Subject: [PATCH] xfs_bmap_add_extent_delay_real should set br_startblock to nullstartblock To: aelder@sgi.com From: Ben Myers Cc: david@fromorbit.com, xfs@oss.sgi.com Date: Tue, 18 Jan 2011 14:36:29 -0600 Message-ID: <20110118203629.5531.1390.stgit@lady3jane.americas.sgi.com> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 When filling in the middle of a previous delayed allocation in xfs_bmap_add_extent_delay_real, set br_startblock of the new delay extent to the right to nullstartblock instead of 0 before inserting the extent into the ifork (xfs_iext_insert), rather than setting br_startblock afterward. Adding the extent into the ifork with br_startblock=0 can lead to the extent being copied into the btree by xfs_bmap_extent_to_btree if we happen to convert from extents format to btree format before updating br_startblock with the correct value. The unexpected addition of this delay extent to the btree can cause subsequent XFS_WANT_CORRUPTED_GOTO filesystem shutdown in several xfs_bmap_add_extent_delay_real cases where we are converting a delay extent to real and unexpectedly find an extent already inserted. For example: 911 case BMAP_LEFT_FILLING: 912 /* 913 * Filling in the first part of a previous delayed allocation. 914 * The left neighbor is not contiguous. 915 */ 916 trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); 917 xfs_bmbt_set_startoff(ep, new_endoff); 918 temp = PREV.br_blockcount - new->br_blockcount; 919 xfs_bmbt_set_blockcount(ep, temp); 920 xfs_iext_insert(ip, idx, 1, new, state); 921 ip->i_df.if_lastex = idx; 922 ip->i_d.di_nextents++; 923 if (cur == NULL) 924 rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; 925 else { 926 rval = XFS_ILOG_CORE; 927 if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, 928 new->br_startblock, new->br_blockcount, 929 &i))) 930 goto done; 931 XFS_WANT_CORRUPTED_GOTO(i == 0, done); With the bogus extent in the btree we shutdown the filesystem at 931. The conversion from extents to btree format happens when the number of extents in the inode increases above ip->i_df.if_ext_max. xfs_bmap_extent_to_btree copies extents from the ifork into the btree, ignoring all delalloc extents which are denoted by br_startblock having some value of nullstartblock. SGI-PV: 1013221 Signed-off-by: Ben Myers --- fs/xfs/xfs_bmap.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 4111cd3..754259f 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -1040,13 +1040,14 @@ xfs_bmap_add_extent_delay_real( * This case is avoided almost all the time. */ temp = new->br_startoff - PREV.br_startoff; + temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); - xfs_bmbt_set_blockcount(ep, temp); - r[0] = *new; - r[1].br_state = PREV.br_state; - r[1].br_startblock = 0; + xfs_bmbt_set_blockcount(ep, temp); /* PREV becomes LEFT */ + r[0] = *new; /* r[0] becomes MIDDLE */ + r[1].br_state = PREV.br_state; /* r[1] is RIGHT */ + r[1].br_startblock = nullstartblock( + (int)xfs_bmap_worst_indlen(ip, temp2)); r[1].br_startoff = new_endoff; - temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; r[1].br_blockcount = temp2; xfs_iext_insert(ip, idx + 1, 2, &r[0], state); ip->i_df.if_lastex = idx + 1; From BATV+373926bbfd3724b3a3b5+2704+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 18 14:37:56 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0IKbrje156670 for ; Tue, 18 Jan 2011 14:37:56 -0600 X-ASG-Debug-ID: 1295383211-1def00d10000-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 563F4148834B; Tue, 18 Jan 2011 12:40:11 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id LVzaFk1JPoCZAYbx; Tue, 18 Jan 2011 12:40:11 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfILZ-0000Xr-0k; Tue, 18 Jan 2011 20:40:09 +0000 Date: Tue, 18 Jan 2011 15:40:09 -0500 From: Christoph Hellwig To: Geoffrey Wehrman Cc: Dave Chinner , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110118204008.GA28791@infradead.org> References: <20110114002900.GF16267@dastard> <20110114164016.GB30134@sgi.com> <20110114225907.GH16267@dastard> <20110115041629.GC11968@sgi.com> <20110117051827.GL16267@dastard> <20110117143708.GE11968@sgi.com> <20110118002437.GS28803@dastard> <20110118143000.GB8803@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118143000.GB8803@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1295383212 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, Jan 18, 2011 at 08:30:00AM -0600, Geoffrey Wehrman wrote: > Glad you were able to understand what I meant. Something I didn't think > of earlier though: What happens when I try to use an 8 GB on a system > with only 4 GB of memory? I'm not really worried about this pathological > case, but I do wonder what the effects will be of allocating what could > be significant quantities of memory in .aio_write. I think for large regions we'd be much better off to only zero the blocks on disk, not in-memory - for example like the code in xfs_zero_remaining_bytes does. From BATV+373926bbfd3724b3a3b5+2704+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 18 14:45:34 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0IKjYG1157043 for ; Tue, 18 Jan 2011 14:45:34 -0600 X-ASG-Debug-ID: 1295383672-4cc5039c0000-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 E3C08273B6B; Tue, 18 Jan 2011 12:47:52 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id YBkSMV3uieZK1A2E; Tue, 18 Jan 2011 12:47:52 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfIT2-0001TX-9j; Tue, 18 Jan 2011 20:47:52 +0000 Date: Tue, 18 Jan 2011 15:47:52 -0500 From: Christoph Hellwig To: Dave Chinner Cc: bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110118204752.GB28791@infradead.org> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> <20110114235549.GI16267@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110114235549.GI16267@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: 1295383672 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, Jan 15, 2011 at 10:55:49AM +1100, Dave Chinner wrote: > I see from later on you are getting this state fom using a large > extsize. Perhaps this comes back to my comment about extsize > alignment might be better handled at the .aio_write level rather > than hiding inside the get_block() callback and attempting to handle > the mismatch at the .writepage level. > > Worth noting, though, is that DIO handles extsize unaligned writes > by allocating unwritten extsize sized/aligned extents an then doing > conversion at IO completion time. So perhaps we should be following > this example for delalloc conversion.... That's the other option for zeroing. In many ways this makes a lot more sense, also for the thin provisioned virtualization image file use case I'm looking into right now. > > I think, however, if we use delalloc->unwritten allocation, we will > need to stop trusting the state of buffer heads in .writepage. That > is because we'd then have blocks marked as buffer_delay() that > really cover unwritten extents and would need remapping. We're > already moving in the direction of not using the state in buffer > heads in ->writepage, so perhaps we need to speed up that > conversion as the first. Christoph, what are you plans here? We really don't do much with the flags anymore. We already treat overwritten (just buffer_uptodate) and delayed buffers are already exactly the same. Unwritten buffers are still slightly different, in that we add XFS_BMAPI_IGSTATE to the bmapi flags. This is just a leftover from the old code, and finding out why exactly we add it is still on my todo list. The page clustering code checks if the buffer still matches the type in xfs_convert_page, though. And I'm not quite sure yet how we can remove that - the easiest option would be to keep holding the ilock until the whole clustered writeout is done, but we'd need to investigate what effect that has on performance. From SRS0+SjsT+52+fromorbit.com=david@internode.on.net Tue Jan 18 15:20:50 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ILKnEF159300 for ; Tue, 18 Jan 2011 15:20:49 -0600 X-ASG-Debug-ID: 1295385785-2f20010d0000-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 A069327392F for ; Tue, 18 Jan 2011 13:23:06 -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 vizUaQ7E7iFTEXbr for ; Tue, 18 Jan 2011 13:23:06 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52621615-1927428 for multiple; Wed, 19 Jan 2011 07:53:04 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PfJ15-0006Yl-AF; Wed, 19 Jan 2011 08:23:03 +1100 Date: Wed, 19 Jan 2011 08:23:03 +1100 From: Dave Chinner To: Christoph Hellwig Cc: Josef Bacik , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: add fpunch command for hole punching via fallocate Subject: Re: [PATCH] xfsprogs: add fpunch command for hole punching via fallocate Message-ID: <20110118212303.GV28803@dastard> References: <1295009545-17839-1-git-send-email-josef@redhat.com> <20110118125112.GB21440@infradead.org> <20110118130603.GA23491@dhcp231-156.rdu.redhat.com> <20110118131203.GA4349@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118131203.GA4349@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: 1295385787 X-Barracuda-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.52762 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, Jan 18, 2011 at 08:12:03AM -0500, Christoph Hellwig wrote: > On Tue, Jan 18, 2011 at 08:06:03AM -0500, Josef Bacik wrote: > > Sounds good. So which do we want, a new command or a new flag? Thanks, > > I'll wait for dave to chime in. I think we should absolutely expose > it as a fallocate flag, but if there's a good reason we can also expose > it as a separate command. My reasoning was that: a) it is consistent with other xfs_io allocation manipulation command structures such as resvsp/unresvsp b) "punch" is less to type than "fallocate -p" c) self documenting in scripts e.g. -c "punch 4k 4k" is much more obvious than -c "fallocate -p 4k 4k" and saves a man page lookup when reading the script. d) punch as a top level command will show up in the "xfs_io -c help", not require you to know it is a suboption of the "falloc" command to find out how to use it. e) the xfs_io command does not have to have the same name and structure as the underlying API that implements the functionality the commands execute. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+iZDP+52+fromorbit.com=david@internode.on.net Tue Jan 18 15:43:57 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ILhuHD160970 for ; Tue, 18 Jan 2011 15:43:57 -0600 X-ASG-Debug-ID: 1295387172-191103820000-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 9B8CD101E34C for ; Tue, 18 Jan 2011 13:46:13 -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 5jfGxZ9K6nBBE0sr for ; Tue, 18 Jan 2011 13:46:13 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 41756052-1927428 for multiple; Wed, 19 Jan 2011 08:16:12 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PfJNS-0006bc-Gn; Wed, 19 Jan 2011 08:46:10 +1100 Date: Wed, 19 Jan 2011 08:46:10 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 07/12] xfs: kill xfs_fs_mount_cmn_err() macro Subject: Re: [PATCH 07/12] xfs: kill xfs_fs_mount_cmn_err() macro Message-ID: <20110118214610.GW28803@dastard> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> <1294792553-8378-8-git-send-email-david@fromorbit.com> <20110118130023.GA23988@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118130023.GA23988@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: 1295387174 X-Barracuda-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.52763 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, Jan 18, 2011 at 08:00:23AM -0500, Christoph Hellwig wrote: > On Wed, Jan 12, 2011 at 11:35:48AM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > The xfs_fs_mount_cmn_err() hide a simple check as to whether the > > mount path should output an error or not. Remove the macro and open > > code the check. > > I would be nice to just move the quite flag into the normal mount flags > and have a xfs_mount_warn that checks it based off the mp. Given it is a flag that is only relevant for the mount context, is there really any need to use a flag that persists for the entire life of the filesystem for it? I don't think the code is that hard to follow right now. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+iZDP+52+fromorbit.com=david@internode.on.net Tue Jan 18 15:46:37 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ILkam3161088 for ; Tue, 18 Jan 2011 15:46:36 -0600 X-ASG-Debug-ID: 1295387333-2f1e01750000-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 B57AB273F76 for ; Tue, 18 Jan 2011 13:48:53 -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 l00w4IXpBjC90VcT for ; Tue, 18 Jan 2011 13:48:53 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52948782-1927428 for multiple; Wed, 19 Jan 2011 08:18:52 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PfJQ2-0006bm-DU; Wed, 19 Jan 2011 08:48:50 +1100 Date: Wed, 19 Jan 2011 08:48:50 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [RFC, PATCH 0/12] xfs: rework error logging infrastructure Subject: Re: [RFC, PATCH 0/12] xfs: rework error logging infrastructure Message-ID: <20110118214850.GX28803@dastard> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> <20110118130314.GC23988@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118130314.GC23988@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: 1295387334 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.52762 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Jan 18, 2011 at 08:03:14AM -0500, Christoph Hellwig wrote: > The series looks good to me. One thing that feels a bit odd is > the xfs_printk.[ch] name - the functions exported to the rest of the > code don't contain prink anyway. Maybe xfs_msg.[ch] or > xfs_message.[ch]? I was struggling for something relevant to call the file - xfs_message.[ch] definitely seems more appropriate. I'll change the name.. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+iZDP+52+fromorbit.com=david@internode.on.net Tue Jan 18 16:01:22 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0IM1LAT161585 for ; Tue, 18 Jan 2011 16:01:22 -0600 X-ASG-Debug-ID: 1295388218-499001190000-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 0954614883B7 for ; Tue, 18 Jan 2011 14:03:38 -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 3CndWdwlLLYM9fdk for ; Tue, 18 Jan 2011 14:03:38 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52950129-1927428 for multiple; Wed, 19 Jan 2011 08:33:37 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PfJeJ-0006dm-Td; Wed, 19 Jan 2011 09:03:35 +1100 Date: Wed, 19 Jan 2011 09:03:35 +1100 From: Dave Chinner To: Christoph Hellwig Cc: Geoffrey Wehrman , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110118220335.GY28803@dastard> References: <20110114002900.GF16267@dastard> <20110114164016.GB30134@sgi.com> <20110114225907.GH16267@dastard> <20110115041629.GC11968@sgi.com> <20110117051827.GL16267@dastard> <20110117143708.GE11968@sgi.com> <20110118002437.GS28803@dastard> <20110118143000.GB8803@sgi.com> <20110118204008.GA28791@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118204008.GA28791@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: 1295388220 X-Barracuda-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.52763 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, Jan 18, 2011 at 03:40:09PM -0500, Christoph Hellwig wrote: > On Tue, Jan 18, 2011 at 08:30:00AM -0600, Geoffrey Wehrman wrote: > > Glad you were able to understand what I meant. Something I didn't think > > of earlier though: What happens when I try to use an 8 GB on a system > > with only 4 GB of memory? I'm not really worried about this pathological > > case, but I do wonder what the effects will be of allocating what could > > be significant quantities of memory in .aio_write. > > I think for large regions we'd be much better off to only zero the > blocks on disk, not in-memory - for example like the code in > xfs_zero_remaining_bytes does. That doesn't help us, because the .writepage allocation code will still allocate extsize aligned extents and expose the problem that we have blocks on disk with no data in the page cache covering them. The point of zeroing at .aio_write is that it avoids the problem of .writepage allocating blocks we don't have dirty pages for. My preferred optimisation for this problem is that once we get above a certain extsize threshold we simply preallocate extsized and aligned chunks that cover the entire range for the write instead of writing zeros. That preserves the extsize allocation alignment, and unaligned writes and future IO see the space as unwritten and hence get zeroed correctly... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+I2Ds+52+fromorbit.com=david@internode.on.net Tue Jan 18 17:16:19 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0INGITR164643 for ; Tue, 18 Jan 2011 17:16:19 -0600 X-ASG-Debug-ID: 1295392714-0c1302880000-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 7B57CE61C09 for ; Tue, 18 Jan 2011 15:18:35 -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 VQ3wTD4hJAbx3AfO for ; Tue, 18 Jan 2011 15:18:35 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 52994659-1927428 for multiple; Wed, 19 Jan 2011 09:48:33 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PfKoq-0006ll-2E; Wed, 19 Jan 2011 10:18:32 +1100 Date: Wed, 19 Jan 2011 10:18:32 +1100 From: Dave Chinner To: Christoph Hellwig Cc: bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110118231831.GZ28803@dastard> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> <20110114235549.GI16267@dastard> <20110118204752.GB28791@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118204752.GB28791@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: 1295392716 X-Barracuda-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.52769 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, Jan 18, 2011 at 03:47:52PM -0500, Christoph Hellwig wrote: > On Sat, Jan 15, 2011 at 10:55:49AM +1100, Dave Chinner wrote: > > I see from later on you are getting this state fom using a large > > extsize. Perhaps this comes back to my comment about extsize > > alignment might be better handled at the .aio_write level rather > > than hiding inside the get_block() callback and attempting to handle > > the mismatch at the .writepage level. > > > > Worth noting, though, is that DIO handles extsize unaligned writes > > by allocating unwritten extsize sized/aligned extents an then doing > > conversion at IO completion time. So perhaps we should be following > > this example for delalloc conversion.... > > That's the other option for zeroing. In many ways this makes a lot > more sense, also for the thin provisioned virtualization image file > use case I'm looking into right now. > > > > > I think, however, if we use delalloc->unwritten allocation, we will > > need to stop trusting the state of buffer heads in .writepage. That > > is because we'd then have blocks marked as buffer_delay() that > > really cover unwritten extents and would need remapping. We're > > already moving in the direction of not using the state in buffer > > heads in ->writepage, so perhaps we need to speed up that > > conversion as the first. Christoph, what are you plans here? > > We really don't do much with the flags anymore. We already treat > overwritten (just buffer_uptodate) and delayed buffers are already > exactly the same. Except for the fact we use the delalloc state from the buffer to trigger allocation after mapping. We could probably just use isnullstartblock() for this - only a mapping from a buffer over a delalloc range should return a null startblock. > Unwritten buffers are still slightly different, > in that we add XFS_BMAPI_IGSTATE to the bmapi flags. This is just > a leftover from the old code, and finding out why exactly we add > it is still on my todo list. XFS_BMAPI_IGSTATE does a couple of things. Firstly, It prevents xfs_bmapi() from allocating new extents (turns off write mode). This isn't an issue where it is used because neither of the call sites set XFS_BMAPI_WRITE. Secondly, it allows xfs_bmapi() to consider adjacent written and unwritten extents as contiguous but has no effect on delalloc extents. That is, if we have: A B C +---------------+-----------------+ unwritten written And we ask to map the range A-C with a single map, we'll get back A-B. If we add XFS_BMAPI_IGSTATE, we'll get back A-C instead. This means that when we map the range A-C for IO, we'll do it as a single IO. The unwritten extent conversion code handles ranges like this correctly - it will only convert the unwritten part of the range to written. It is arguable that this is unnecessary because the elevator will merge the two adjacent IOs anyway, but it does reduce the number of mapping calls and IOs issued... Hence it is effectively mechanism for optimising IO mappings where we have contiguous extents with mixed written/unwritten state. In fact, we probably should be setting this for normal written extents as well, so that the case: A B C +---------------+-----------------+ written unwritten is also handled with the same optimisation. That makes handling unwritten and overwrites identical, with only delalloc being different. If we assume delalloc when we get a null startblock, then we don't need to look at the buffer state at all for the initial mapping. > The page clustering code checks if > the buffer still matches the type in xfs_convert_page, though. > And I'm not quite sure yet how we can remove that - the easiest > option would be to keep holding the ilock until the whole clustered > writeout is done, but we'd need to investigate what effect that > has on performance. Holding the ilock doesn't protect against page cache truncation, but we can still check for that via page->mapping. Otherwise this seems like it would work to me - I trust the extent list to reflect the correct state a lot more than I do the buffer heads. It seems to me that with such modifications, the only thing that we are using the bufferhead for is the buffer_uptodate() flag to determine if we should write the block or not. If we can find some other way of holding this state then we don't need bufferheads in the write path at all, right? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+iZDP+52+fromorbit.com=david@internode.on.net Tue Jan 18 17:31:32 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0INVWhF165169 for ; Tue, 18 Jan 2011 17:31:32 -0600 X-ASG-Debug-ID: 1295393628-447d03d80000-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 98F412700F2 for ; Tue, 18 Jan 2011 15:33: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 lQPtHBLexDDKYy9S for ; Tue, 18 Jan 2011 15:33:49 -0800 (PST) Received: from dastard (unverified [121.44.222.102]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 53681836-1927428 for multiple; Wed, 19 Jan 2011 10:03:47 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PfL3a-0006my-Ay; Wed, 19 Jan 2011 10:33:46 +1100 Date: Wed, 19 Jan 2011 10:33:46 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: fix efi item leak on forced shutdown Subject: Re: [PATCH 2/2] xfs: fix efi item leak on forced shutdown Message-ID: <20110118233346.GA28803@dastard> References: <1295010430-12495-1-git-send-email-david@fromorbit.com> <1295010430-12495-3-git-send-email-david@fromorbit.com> <20110118124625.GB12516@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118124625.GB12516@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: 1295393630 X-Barracuda-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.52770 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, Jan 18, 2011 at 07:46:25AM -0500, Christoph Hellwig wrote: > On Sat, Jan 15, 2011 at 12:07:10AM +1100, Dave Chinner wrote: > > The cause of the leak is that the "remove" parameter of IOP_UNPIN() > > is never set when a CIL push is aborted. This means that the EFI > > item is never freed if it was in the push being cancelled. The > > problem is specific to delayed logging. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_trans.c | 10 ++++++++++ > > 1 files changed, 10 insertions(+), 0 deletions(-) > > > > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > > index f80a067..e66ce5e 100644 > > --- a/fs/xfs/xfs_trans.c > > +++ b/fs/xfs/xfs_trans.c > > @@ -1472,6 +1472,16 @@ xfs_trans_committed_bulk( > > if (XFS_LSN_CMP(item_lsn, (xfs_lsn_t)-1) == 0) > > continue; > > > > + /* > > + * if we are aborting the operation, no point in inserting the > > + * object into the AIL as we areee in a shutdown situation. > > that's a few 'e' too much. > > > + */ > > + if (aborted) { > > + ASSERT(XFS_FORCED_SHUTDOWN(ailp->xa_mount)); > > + IOP_UNPIN(lip, aborted); > > + continue; > > + } > > Hmm, this is not symmetric with the non-delaylog path. > xfs_trans_item_committed never sets the remove flag to IOP_UNPIN, > even if the transaction commit was aborted. Right, because the delaylog and non-delaylog paths are not symmetric w.r.t. log write failures. > It seems like the CIL code is missing an equivalent to > xfs_trans_uncommit for the case that xfs_log_write or xfs_log_done > fail. There isn't an equivalent. In the delaylog case, we don't have a transaction to "uncommit" when a log write failure occurs - we are aborting the checkpoint of the CIL, not a transaction. As the items have already gone through IOP_COMMITTING and IOP_UNLOCK, we have to treat the failures like they came from the log IO completion handler. In the case of non-delaylog, neither IOP_COMMITTING or IOP_UNLOCK has been called on the items when the xfs_log_write() fails. They are still linked into the xfs_trans structure, so they can be handled by xfs_trans_uncommit() which simply needs to walk the items in the transaction and IOP_UNPIN(lip, abort), IOP_UNLOCK and free the items. Cheers, Dave. -- Dave Chinner david@fromorbit.com From ajeet.yadav.77@gmail.com Tue Jan 18 19:04:11 2011 X-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 p0J14BQm169100 for ; Tue, 18 Jan 2011 19:04:11 -0600 X-ASG-Debug-ID: 1295399187-0ae800690000-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 C89D3126213A for ; Tue, 18 Jan 2011 17:06:27 -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 RCD0cFeKGvsrj8GF for ; Tue, 18 Jan 2011 17:06:27 -0800 (PST) Received: by qwe5 with SMTP id 5so275250qwe.26 for ; Tue, 18 Jan 2011 17:06:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=9kAyL77BRse4ZV5HLINPnxWQNRhIQLf2zO/eIfynTA0=; b=I48YCvtsurB8kvtcfpKm/pnEw1hmE+yhiv5ahtdvzWvHQuZ2G4i+9NNB3YXLrXjKZN MUpnQWjQ0yoscK2ORiQE6d+Km78hKjL8n9XIyuspLAIkl6O5cckcDOsEFR8pb+ut/ptJ +xXm1Li5+7yN4VZi5pjtmB4KOURMfRczvm51I= 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=NvjWNAkoSOvjIdB3XL5+IPs1LbOppxbuWwFiE/6zTpZW1N88vYyfyIDXtW7aKp0dEm Tf6KuxPP1NnfljhmKlMmaVWAzI8FVxTf/boq1jhCoGG24w+Dpgs4UTGh1+ZNqFs+2SW3 waBtyTopFrXP9ejFf8t1U5a2t9eWx9sehcFxE= MIME-Version: 1.0 Received: by 10.224.2.71 with SMTP id 7mr74432qai.4.1295399186919; Tue, 18 Jan 2011 17:06:26 -0800 (PST) Received: by 10.220.165.198 with HTTP; Tue, 18 Jan 2011 17:06:26 -0800 (PST) In-Reply-To: <20110118045730.GU28803@dastard> References: <20110118045730.GU28803@dastard> Date: Wed, 19 Jan 2011 10:06:26 +0900 Message-ID: X-ASG-Orig-Subj: Re: XFS internal error xfs_iformat(realtime) even after xfs_repair. Subject: Re: XFS internal error xfs_iformat(realtime) even after xfs_repair. From: Ajeet Yadav To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0015175cb81860f0eb049a28a0fa X-Barracuda-Connect: mail-qw0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1295399188 X-Barracuda-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.52777 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 --0015175cb81860f0eb049a28a0fa Content-Type: text/plain; charset=ISO-8859-1 Please find my response below On Tue, Jan 18, 2011 at 1:57 PM, Dave Chinner wrote: > On Mon, Jan 17, 2011 at 09:12:54PM +0900, Ajeet Yadav wrote: > > Kernel: 2.6.30.9, XFS backported from 2.6.34, xfsprogs-3.0.5 > > > > I used a script > > 1. create some file, directories, symlinks > > 2. unmount the file system > > 3. run xfs_bd with blocktrash > > 4. xfs_xfsrepair -L > > 5. list "ls -lR" > > 6. remove all file and directory "rm -rf * > > OK, so you are effectively corrupting random blocks by introducing > random bit errors in the blocks. No surprise that some errors are > not being detected - what is the blocktrash command that you are > using? > xfs_db -x -c blockget -c "blocktrash -s 12345 -n 256 -x 1 -y 1024 -3" /dev/sda1 > > > Often during testing I get the below backtrace from kernel during ls, rm > > even though I already run xfs_repair on it. > > Is it related to xfsrepair or xfs ?. I think xfs_repair must have > detected > > this problem and corrected it. > > xfs_repair is not checking the di_flags field in the inode for > sanity, hence having a wrong flag set is going unnoticed. > ok > > > There is similar problem already reported by > > http://oss.sgi.com/archives/xfs/2010-06/msg00349.html > > Similar error message (xfs_iformt found an inode corruption), but > that one is a completely different problem. > > Does the patch below (compile tested only) detect the bad inode? > Yes I have tested it, It seems to work fine, I did not find this patch in mainline xfsprogs git, also I need to modify the patch somewhat. dino->di_flags ===================> dinoc->di_flags because dino is not having any member named di_flags in xfsprogs-3.0.5, so I used dinoc instead. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > xfs_repair: validate inode di_flags field > > xfs_repair is not validating the di_flags field in the inode for > sanity. Block fuzzing indicates that we are not picking situations > like the RT bit being set on filesystems without realtime devices. > > Signed-off-by: Dave Chinner > --- > repair/dinode.c | 62 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 62 insertions(+), 0 deletions(-) > > diff --git a/repair/dinode.c b/repair/dinode.c > index 2fa850d..e05d4e0 100644 > --- a/repair/dinode.c > +++ b/repair/dinode.c > @@ -2519,6 +2519,68 @@ process_dinode_int(xfs_mount_t *mp, > goto clear_bad_out; > } > > + /* > + * check that we only have valid flags set, and those that are set > make > + * sense. > + */ > + if (dino->di_flags) { > + uint16_t flags = be16_to_cpu(dino->di_flags); > + > + if (flags & ~XFS_DIFLAG_ANY) { > + do_warn(_("Bad flags set in inode %llu"), lino); > + flags &= ~XFS_DIFLAG_ANY; > + } > + > + if (flags & (XFS_DIFLAG_REALTIME | XFS_DIFLAG_RTINHERIT)) { > + /* need an rt-dev! */ > + if (!rt_name) { > + do_warn(_( > + "inode %llu has RT flag set but there is no RT device"), lino); > + flags &= ~(XFS_DIFLAG_REALTIME | > + XFS_DIFLAG_RTINHERIT); > + } > + } > + if (flags & XFS_DIFLAG_NEWRTBM_BIT) { > + /* must be a rt bitmap inode */ > + if (lino != mp->m_sb.sb_rbmino) { > + do_warn(_("inode %llu not rt bitmap"), > lino); > + flags &= ~XFS_DIFLAG_NEWRTBM_BIT; > + } > + } > + if (flags & (XFS_DIFLAG_RTINHERIT | > + XFS_DIFLAG_EXTSZINHERIT | > + XFS_DIFLAG_PROJINHERIT | > + XFS_DIFLAG_NOSYMLINKS)) { > + /* must be a directory */ > + if (di_mode && !S_ISDIR(di_mode)) { > + do_warn(_( > + "directory flags set on non-directory inode %llu"), > + lino); > + flags &= ~(XFS_DIFLAG_RTINHERIT | > + XFS_DIFLAG_EXTSZINHERIT | > + XFS_DIFLAG_PROJINHERIT | > + XFS_DIFLAG_NOSYMLINKS); > + } > + } > + if (flags & (XFS_DIFLAG_REALTIME | XFS_XFLAG_EXTSIZE)) { > + /* must be a file */ > + if (di_mode && !S_ISREG(di_mode)) { > + do_warn(_( > + "file flags set on non-file inode %llu"), lino); > + flags &= ~(XFS_DIFLAG_REALTIME | > + XFS_XFLAG_EXTSIZE); > + } > + } > + if (!verify_mode && flags != be16_to_cpu(dino->di_flags)) { > + if (!no_modify) { > + do_warn(_(", fixing bad flags.\n")); > + dino->di_flags = cpu_to_be16(flags); > + *dirty = 1; > + } else > + do_warn(_(", would fix bad flags.\n")); > + } > + } > + > if (verify_mode) > return retval; > > --0015175cb81860f0eb049a28a0fa Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Please find my response below
=A0
On Tue, Jan 18, 2011 at 1:57 PM, Dave Chinner <david@fromorbit.= com> wrote:
On Mon, Jan 17, 2011 at 09:12:54PM +0900, Ajeet Yadav wro= te:
> Kernel: 2.6.30.9, XFS backported from 2.6.34, xfsprogs-3.0.5>
> I used a script
> 1. create some file, directories, sym= links
> 2. unmount the file system
> 3. run xfs_bd with blocktrash
&g= t; 4. xfs_xfsrepair -L
> 5. list "ls -lR"
> 6. remove= all file and directory "rm -rf *

OK, so you are effectiv= ely corrupting random blocks by introducing
random bit errors in the blocks. No surprise that some errors are
not be= ing detected - what is the blocktrash command that you are
using?
=A0
xfs_db -x -c blockget -c "blocktrash -s 12345 -= n 256 -x 1 -y 1024 -3" /dev/sda1
=A0

> Often during testing I get the below backtrace f= rom kernel during ls, rm
> even though I already run xfs_repair on it= .
> Is it related to xfsrepair or xfs ?. I think xfs_repair must have= detected
> this problem and corrected it.

xfs_repair is not checking= the di_flags field in the inode for
sanity, hence having a wrong flag s= et is going unnoticed.
=A0
ok
=A0

> There is similar problem already reported by
= > http://oss.sgi.com/archives/xfs/2010-06/msg00349.html
=
Similar error message (xfs_iformt found an inode corruption), but
= that one is a completely different problem.

Does the patch below (co= mpile tested only) detect the bad inode?
=A0
Yes I have tested it, It seems to work fine,
I did not find this patch in mainline xfsprogs git, also I need to mod= ify the patch somewhat.
dino->di_flags=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D> dinoc->di_flags
because dino is not having any member named di_flags in xfsprogs-3.0.5= , so I used dinoc instead.
=A0

Cheers,

Dave.
--Dave Chinner
david@fromorbit.co= m

xfs_repair: validate inode di_flags field

xfs_repair is not vali= dating the di_flags field in the inode for
sanity. Block fuzzing indicat= es that we are not picking situations
like the RT bit being set on files= ystems without realtime devices.

Signed-off-by: Dave Chinner <= dchinner@redhat.com>
---
=A0repair/dinode.c | =A0 62 +++++++++= ++++++++++++++++++++++++++++++++++++++++++++++
=A01 files changed, 62 in= sertions(+), 0 deletions(-)

diff --git a/repair/dinode.c b/repair/dinode.c
index 2fa850d..e05d4e= 0 100644
--- a/repair/dinode.c
+++ b/repair/dinode.c
@@ -2519,6 +2= 519,68 @@ process_dinode_int(xfs_mount_t *mp,
=A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0goto clear_bad_out;
=A0 =A0 =A0 =A0}

+ =A0 =A0 =A0 /*
+ =A0 =A0 =A0 =A0* check that w= e only have valid flags set, and those that are set make
+ =A0 =A0 =A0 = =A0* sense.
+ =A0 =A0 =A0 =A0*/
+ =A0 =A0 =A0 if (dino->di_flags) = {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 uint16_t flags =3D be16_to_cpu(dino->= di_flags);
+
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (flags & ~XFS_DIFLAG_ANY) {
+ = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 do_warn(_("Bad flags set i= n inode %llu"), lino);
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 flags &=3D ~XFS_DIFLAG_ANY;
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
+
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (flags & (XFS_DIFLAG_REALTIME | X= FS_DIFLAG_RTINHERIT)) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /*= need an rt-dev! */
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!r= t_name) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = do_warn(_(
+ =A0 =A0 =A0 "inode %llu has RT flag set but there is no RT device&qu= ot;), lino);
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 flags &=3D ~(XFS_DIFLAG_REALTIME |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 XFS_DIFLAG= _RTINHERIT);
+ =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 if (flags & XFS_DIFLAG_NEWRT= BM_BIT) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* must be a rt = bitmap inode */
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (lino != =3D mp->m_sb.sb_rbmino) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 do_warn(_(&qu= ot;inode %llu not rt bitmap"), lino);
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 flags &=3D ~XFS_DIFLAG_NEWRTBM_BIT;+ =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 if (flags & (XFS_DIFLAG_RTIN= HERIT |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0XFS_DIFLAG_EXTSZIN= HERIT |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0XFS_DIF= LAG_PROJINHERIT |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0XFS_DIFLAG_NOSYMLINKS)) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 /* must be a directory */
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (di_mode && !S_ISD= IR(di_mode)) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 do_warn(_(
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "dire= ctory flags set on non-directory inode %llu"),
+ =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 lino);
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 flags &= =3D ~(XFS_DIFLAG_RTINHERIT |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 XFS_DIFLAG_EXTSZINHERIT= |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 XFS_DIFLAG_PROJINHERIT |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 XFS_DIFLAG_NOSYMLINKS);
+ =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 if (flags & (XFS_DIFLAG_REALTIME | XFS_XFLAG_EXTSIZE)) = {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* must be a file */
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (di_mode && !S_ISR= EG(di_mode)) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 do_warn(_(
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "file= flags set on non-file inode %llu"), lino);
+ =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 flags &=3D ~(XFS_DIFLAG_REALTIM= E |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 XFS_XFLAG_EXTSIZE);
+ =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 if (!verify_mode && flags !=3D be16_to_cpu(dino->di_= flags)) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!no_modify) = {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 do_warn(_(&qu= ot;, fixing bad flags.\n"));
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 dino->di_flags =3D cpu_to_be16(flags);
+ =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 *dirty =3D 1;
+ = =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 do_warn(_(&qu= ot;, would fix bad flags.\n"));
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
= + =A0 =A0 =A0 }
+
=A0 =A0 =A0 =A0if (verify_mode)
=A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0return retval;


--0015175cb81860f0eb049a28a0fa-- From dave@fromorbit.com Tue Jan 18 22:29:11 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0J4TAYZ179232 for ; Tue, 18 Jan 2011 22:29:11 -0600 X-ASG-Debug-ID: 1295411486-221500b60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail05.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 278E91621761 for ; Tue, 18 Jan 2011 20:31:27 -0800 (PST) Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id DiDnjInqGwHjISZ6 for ; Tue, 18 Jan 2011 20:31:27 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsgFAB/3NU15LN5m/2dsb2JhbACWKI4ZdMFvhVAE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail05.adl6.internode.on.net with ESMTP; 19 Jan 2011 15:01:25 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PfPhc-0007Em-Ce for xfs@oss.sgi.com; Wed, 19 Jan 2011 15:31:24 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PfPgJ-00044t-2X for xfs@oss.sgi.com; Wed, 19 Jan 2011 15:30:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/5] xfs: various 2.6.38 candidate bug fixes Subject: [PATCH 0/5] xfs: various 2.6.38 candidate bug fixes Date: Wed, 19 Jan 2011 15:29:55 +1100 Message-Id: <1295411400-15614-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1295411489 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0010 1.0000 -2.0146 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.52789 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 There's the fix for the specualtive allocation regression that arekm and hch reported different symptoms of. Some extsize tweaks to prevent assert failures and btree corruptions. An allocation size fix to prevent wildly inefficient handling of nullfb allocation group scanning (demonstrated by low space scanning or single large preallocation that spans hundreds/thousands of AGs). Finally, another a fix for another delayed logging commit path error handling problem that I noticed by inspection. From dave@fromorbit.com Tue Jan 18 22:29:12 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0J4TC4x179241 for ; Tue, 18 Jan 2011 22:29:12 -0600 X-ASG-Debug-ID: 1295411486-221500b60001-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail05.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 737121621761 for ; Tue, 18 Jan 2011 20:31:29 -0800 (PST) Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 5Wujxv2t1CDTX5oZ for ; Tue, 18 Jan 2011 20:31:29 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsgFAB/3NU15LN5m/2dsb2JhbACWKI4ZdMFvhVAE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail05.adl6.internode.on.net with ESMTP; 19 Jan 2011 15:01:25 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PfPhc-0007Ep-HM for xfs@oss.sgi.com; Wed, 19 Jan 2011 15:31:24 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PfPgJ-000450-91 for xfs@oss.sgi.com; Wed, 19 Jan 2011 15:30:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/5] xfs: prevent extsize alignment from exceeding maximum extent size Subject: [PATCH 3/5] xfs: prevent extsize alignment from exceeding maximum extent size Date: Wed, 19 Jan 2011 15:29:58 +1100 Message-Id: <1295411400-15614-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295411400-15614-1-git-send-email-david@fromorbit.com> References: <1295411400-15614-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1295411490 X-Barracuda-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.52789 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 doing delayed allocation, if the allocation size is for a maximally sized extent, extent size alignment can push it over this limit. This results in an assert failure in xfs_bmbt_set_allf() as the extent length is too large to find in the extent record. Fix this by ensuring that we allow for space that extent size alignment requires (up to 2 * (extsize -1) blocks as we have to handle both head and tail alignment) when limiting the maximum size of the extent. Signed-off-by: Dave Chinner --- fs/xfs/xfs_bmap.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 2ad1daf..4901355 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -4492,6 +4492,17 @@ xfs_bmapi( /* Figure out the extent size, adjust alen */ extsz = xfs_get_extsz_hint(ip); if (extsz) { + /* + * make sure we don't exceed a single + * extent length when we align the + * extent by reducing length we are + * going to allocate by the maximum + * amount extent size aligment may + * require. + alen = (xfs_extlen_t)XFS_FILBLKS_MIN( + len, + MAXEXTLEN - (2 * extsz - 1)); + */ error = xfs_bmap_extsize_align(mp, &got, &prev, extsz, rt, eof, -- 1.7.2.3 From dave@fromorbit.com Tue Jan 18 22:29:18 2011 X-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_46 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 p0J4TIfC179266 for ; Tue, 18 Jan 2011 22:29:18 -0600 X-ASG-Debug-ID: 1295411486-221500b60002-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail05.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 652481621768 for ; Tue, 18 Jan 2011 20:31:35 -0800 (PST) Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id TtLK4PDqQ9xWX5Ra for ; Tue, 18 Jan 2011 20:31:35 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsgFAB/3NU15LN5m/2dsb2JhbACWKI4ZdMFvhVAE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail05.adl6.internode.on.net with ESMTP; 19 Jan 2011 15:01:35 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PfPhm-0007Eo-Ef for xfs@oss.sgi.com; Wed, 19 Jan 2011 15:31:34 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PfPgJ-00044x-76 for xfs@oss.sgi.com; Wed, 19 Jan 2011 15:30:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/5] xfs: limit extent length for allocation to AG size Subject: [PATCH 2/5] xfs: limit extent length for allocation to AG size Date: Wed, 19 Jan 2011 15:29:57 +1100 Message-Id: <1295411400-15614-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295411400-15614-1-git-send-email-david@fromorbit.com> References: <1295411400-15614-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1295411496 X-Barracuda-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.52789 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 Delayed allocation extents can be larger than AGs, so when trying to convert a large range we may scan every AG inside xfs_bmap_alloc_nullfb() trying to find an AG with a size larger than an AG. We should stop when we find the first AG with a maximum possible allocation size. This causes excessive CPU usage when there are lots of AGs. The same problem occurs when doing preallocation of a range larger than an AG. Fix the problem by limiting real allocation lengths to the maximum that an AG can support. This means if we have empty AGs, we'll stop the search at the first of them. If there are no empty AGs, we'll still scan them all, but that is a different problem.... Signed-off-by: Dave Chinner --- fs/xfs/xfs_bmap.c | 21 ++++++++++++++------- 1 files changed, 14 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 4111cd3..2ad1daf 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -2430,7 +2430,7 @@ xfs_bmap_btalloc_nullfb( startag = ag = 0; pag = xfs_perag_get(mp, ag); - while (*blen < ap->alen) { + while (*blen < args->maxlen) { if (!pag->pagf_init) { error = xfs_alloc_pagf_init(mp, args->tp, ag, XFS_ALLOC_FLAG_TRYLOCK); @@ -2452,7 +2452,7 @@ xfs_bmap_btalloc_nullfb( notinit = 1; if (xfs_inode_is_filestream(ap->ip)) { - if (*blen >= ap->alen) + if (*blen >= args->maxlen) break; if (ap->userdata) { @@ -2498,14 +2498,14 @@ xfs_bmap_btalloc_nullfb( * If the best seen length is less than the request * length, use the best as the minimum. */ - else if (*blen < ap->alen) + else if (*blen < args->maxlen) args->minlen = *blen; /* * Otherwise we've seen an extent as big as alen, * use that as the minimum. */ else - args->minlen = ap->alen; + args->minlen = args->maxlen; /* * set the failure fallback case to look in the selected @@ -2573,7 +2573,14 @@ xfs_bmap_btalloc( args.tp = ap->tp; args.mp = mp; args.fsbno = ap->rval; - args.maxlen = MIN(ap->alen, mp->m_sb.sb_agblocks); + + /* + * The requested extent can be larger than an AG, so trim the block + * count back to the maximum sized extent in an AG. A typical empty AG + * consumes 1 block for headers, 1 block for each btree root (3) and 4 + * blocks for the free list. + */ + args.maxlen = MIN(ap->alen, mp->m_sb.sb_agblocks - 8); args.firstblock = ap->firstblock; blen = 0; if (nullfb) { @@ -2621,7 +2628,7 @@ xfs_bmap_btalloc( /* * Adjust for alignment */ - if (blen > args.alignment && blen <= ap->alen) + if (blen > args.alignment && blen <= args.maxlen) args.minlen = blen - args.alignment; args.minalignslop = 0; } else { @@ -2640,7 +2647,7 @@ xfs_bmap_btalloc( * of minlen+alignment+slop doesn't go up * between the calls. */ - if (blen > mp->m_dalign && blen <= ap->alen) + if (blen > mp->m_dalign && blen <= args.maxlen) nextminlen = blen - mp->m_dalign; else nextminlen = args.minlen; -- 1.7.2.3 From dave@fromorbit.com Tue Jan 18 22:29:19 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0J4TJjZ179277 for ; Tue, 18 Jan 2011 22:29:19 -0600 X-ASG-Debug-ID: 1295411496-58b002be0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail05.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A8D8519E531D for ; Tue, 18 Jan 2011 20:31:36 -0800 (PST) Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id dW6HQpCAY1gTxLWI for ; Tue, 18 Jan 2011 20:31:36 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AskFAB/3NU15LN5m/2dsb2JhbACEDJIcjhl0sgqPZYEkgzh0BA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail05.adl6.internode.on.net with ESMTP; 19 Jan 2011 15:01:35 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PfPhm-0007Es-I7 for xfs@oss.sgi.com; Wed, 19 Jan 2011 15:31:34 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PfPgJ-000453-Ah for xfs@oss.sgi.com; Wed, 19 Jan 2011 15:30:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/5] xfs: limit extsize to size of AGs and/or MAXEXTLEN Subject: [PATCH 4/5] xfs: limit extsize to size of AGs and/or MAXEXTLEN Date: Wed, 19 Jan 2011 15:29:59 +1100 Message-Id: <1295411400-15614-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295411400-15614-1-git-send-email-david@fromorbit.com> References: <1295411400-15614-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: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1295411497 X-Barracuda-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.52790 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 extent size hint can be set to larger than an AG. This means that the alignment process can push the range to be allocated outside the bounds of the AG, resulting in assert failures or corrupted bmbt records. Similarly, if the extsize is larger than the maximum extent size supported, the alignment process will produce extents that are too large to fit into the bmbt records, resulting in a different type of assert/corruption failure. Fix this by limiting extsize at the time Ñ–t is set firstly to be less than MAXEXTLEN, then to be a maximum of half the size of the AGs in the filesystem for non-realtime inodes. Realtime inodes do not allocate out of AGs, so don't have to be restricted by the size of AGs. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_ioctl.c | 20 ++++++++++++++++++-- 1 files changed, 18 insertions(+), 2 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index b06ede1..f5e2a19 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -985,10 +985,22 @@ xfs_ioctl_setattr( /* * Extent size must be a multiple of the appropriate block - * size, if set at all. + * size, if set at all. It must also be smaller than the + * maximum extent size supported by the filesystem. + * + * Also, for non-realtime files, limit the extent size hint to + * half the size of the AGs in the filesystem so alignment + * doesn't result in extents larger than an AG. */ if (fa->fsx_extsize != 0) { - xfs_extlen_t size; + xfs_extlen_t size; + xfs_fsblock_t extsize_fsb; + + extsize_fsb = XFS_B_TO_FSB(mp, fa->fsx_extsize); + if (extsize_fsb > MAXEXTLEN) { + code = XFS_ERROR(EINVAL); + goto error_return; + } if (XFS_IS_REALTIME_INODE(ip) || ((mask & FSX_XFLAGS) && @@ -997,6 +1009,10 @@ xfs_ioctl_setattr( mp->m_sb.sb_blocklog; } else { size = mp->m_sb.sb_blocksize; + if (extsize_fsb > mp->m_sb.sb_agblocks / 2) { + code = XFS_ERROR(EINVAL); + goto error_return; + } } if (fa->fsx_extsize % size) { -- 1.7.2.3 From dave@fromorbit.com Tue Jan 18 22:29:19 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0J4TJcM179275 for ; Tue, 18 Jan 2011 22:29:19 -0600 X-ASG-Debug-ID: 1295411486-221500b60003-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail05.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 87D2C1621768 for ; Tue, 18 Jan 2011 20:31:36 -0800 (PST) Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id UHAarZUiiOjnuGIJ for ; Tue, 18 Jan 2011 20:31:36 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsgFAB/3NU15LN5m/2dsb2JhbACWKI4ZdLUJjGaFUAQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail05.adl6.internode.on.net with ESMTP; 19 Jan 2011 15:01:35 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PfPhc-0007Et-Kp for xfs@oss.sgi.com; Wed, 19 Jan 2011 15:31:24 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PfPgJ-000456-CS for xfs@oss.sgi.com; Wed, 19 Jan 2011 15:30:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 5/5] xfs: handle CIl transaction commit failures correctly Subject: [PATCH 5/5] xfs: handle CIl transaction commit failures correctly Date: Wed, 19 Jan 2011 15:30:00 +1100 Message-Id: <1295411400-15614-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295411400-15614-1-git-send-email-david@fromorbit.com> References: <1295411400-15614-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1295411497 X-Barracuda-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.52789 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 Failure to commit a transaction into the CIL is not handled correctly. This currently can only happen when racing with a shutdown, so it rare. Handle the error similar to a log vector memory allocation failure, and for both failures clear the PF_TRANS flag from the task correctly. Signed-off-by: Dave Chinner --- fs/xfs/xfs_trans.c | 17 ++++++++++++++--- 1 files changed, 14 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 50753d3..504a804 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1754,15 +1754,26 @@ xfs_trans_commit_cil( */ log_vector = xfs_trans_alloc_log_vecs(tp); if (!log_vector) - return ENOMEM; + goto out_enomem; error = xfs_log_commit_cil(mp, tp, log_vector, commit_lsn, flags); - if (error) - return error; + if (error) { + /* + * We will only get an error if no modifications have been + * made to the items in the transaction. Hence treat it + the same as a memory allocation failure. + */ + goto out_enomem; + } current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); xfs_trans_free(tp); return 0; + +out_enomem: + /* caller cleans up transaction */ + current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); + return ENOMEM; } /* -- 1.7.2.3 From dave@fromorbit.com Tue Jan 18 22:29:29 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0J4TTiV179319 for ; Tue, 18 Jan 2011 22:29:29 -0600 X-ASG-Debug-ID: 1295411505-78d5016c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail05.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C3903274D13 for ; Tue, 18 Jan 2011 20:31:46 -0800 (PST) Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id FRFcgKhmDLqHTqJV for ; Tue, 18 Jan 2011 20:31:46 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsgFAB/3NU15LN5m/2dsb2JhbACWKI4ZdMFvhVAEkE8 Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail05.adl6.internode.on.net with ESMTP; 19 Jan 2011 15:01:44 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PfPhc-0007En-Dm for xfs@oss.sgi.com; Wed, 19 Jan 2011 15:31:24 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PfPgJ-00044v-4T for xfs@oss.sgi.com; Wed, 19 Jan 2011 15:30:03 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/5] xfs: speculative delayed allocation uses rounddown_power_of_2 badly Subject: [PATCH 1/5] xfs: speculative delayed allocation uses rounddown_power_of_2 badly Date: Wed, 19 Jan 2011 15:29:56 +1100 Message-Id: <1295411400-15614-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295411400-15614-1-git-send-email-david@fromorbit.com> References: <1295411400-15614-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1295411507 X-Barracuda-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.52790 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 rounddown_power_of_2() returns an undefined result when passed a value of zero. The specualtive delayed allocation code is doing this when the inode is zero length. Hence occasionally the preallocation is much, mcuh large than is necessary (e.g. 8GB for a 270 _byte_ file). Ensure we don't even pass a zero value to this function so the result of preallocation is always the desired size. Signed-off-by: Dave Chinner --- fs/xfs/xfs_iomap.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 55582bd..8a0f044 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -337,7 +337,12 @@ xfs_iomap_prealloc_size( int shift = 0; int64_t freesp; - alloc_blocks = XFS_B_TO_FSB(mp, ip->i_size); + /* + * rounddown_pow_of_two() returns an undefined result + * if we pass in alloc_blocks = 0. Hence the "+ 1" to + * ensure we always pass in a non-zero value. + */ + alloc_blocks = XFS_B_TO_FSB(mp, ip->i_size) + 1; alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, rounddown_pow_of_two(alloc_blocks)); -- 1.7.2.3 From david@fromorbit.com Tue Jan 18 22:40:04 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0J4e3sM180619 for ; Tue, 18 Jan 2011 22:40:03 -0600 X-ASG-Debug-ID: 1295412140-21f901460000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail05.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C5A791621634 for ; Tue, 18 Jan 2011 20:42:20 -0800 (PST) Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id IROxgYaGHLn77IrH for ; Tue, 18 Jan 2011 20:42:20 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEAKT6NU15LN5m/2dsb2JhbACkQXTBeA2FQwSQTw Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail05.adl6.internode.on.net with ESMTP; 19 Jan 2011 15:12:19 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PfPsA-0007GI-6n; Wed, 19 Jan 2011 15:42:18 +1100 Date: Wed, 19 Jan 2011 15:42:18 +1100 From: Dave Chinner To: Ben Myers Cc: aelder@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_bmap_add_extent_delay_real should set br_startblock to nullstartblock Subject: Re: [PATCH] xfs_bmap_add_extent_delay_real should set br_startblock to nullstartblock Message-ID: <20110119044218.GM16267@dastard> References: <20110118203629.5531.1390.stgit@lady3jane.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118203629.5531.1390.stgit@lady3jane.americas.sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1295412141 X-Barracuda-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.52791 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, Jan 18, 2011 at 02:36:29PM -0600, Ben Myers wrote: > When filling in the middle of a previous delayed allocation in > xfs_bmap_add_extent_delay_real, set br_startblock of the new delay extent to > the right to nullstartblock instead of 0 before inserting the extent into the > ifork (xfs_iext_insert), rather than setting br_startblock afterward. > > Adding the extent into the ifork with br_startblock=0 can lead to the extent > being copied into the btree by xfs_bmap_extent_to_btree if we happen to convert > from extents format to btree format before updating br_startblock with the > correct value. The unexpected addition of this delay extent to the btree can > cause subsequent XFS_WANT_CORRUPTED_GOTO filesystem shutdown in several > xfs_bmap_add_extent_delay_real cases where we are converting a delay extent to > real and unexpectedly find an extent already inserted. For example: > > 911 case BMAP_LEFT_FILLING: > 912 /* > 913 * Filling in the first part of a previous delayed allocation. > 914 * The left neighbor is not contiguous. > 915 */ > 916 trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); > 917 xfs_bmbt_set_startoff(ep, new_endoff); > 918 temp = PREV.br_blockcount - new->br_blockcount; > 919 xfs_bmbt_set_blockcount(ep, temp); > 920 xfs_iext_insert(ip, idx, 1, new, state); > 921 ip->i_df.if_lastex = idx; > 922 ip->i_d.di_nextents++; > 923 if (cur == NULL) > 924 rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; > 925 else { > 926 rval = XFS_ILOG_CORE; > 927 if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, > 928 new->br_startblock, new->br_blockcount, > 929 &i))) > 930 goto done; > 931 XFS_WANT_CORRUPTED_GOTO(i == 0, done); > > With the bogus extent in the btree we shutdown the filesystem at 931. The > conversion from extents to btree format happens when the number of extents in > the inode increases above ip->i_df.if_ext_max. xfs_bmap_extent_to_btree copies > extents from the ifork into the btree, ignoring all delalloc extents which are > denoted by br_startblock having some value of nullstartblock. > > SGI-PV: 1013221 > > Signed-off-by: Ben Myers > --- > fs/xfs/xfs_bmap.c | 11 ++++++----- > 1 files changed, 6 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 4111cd3..754259f 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -1040,13 +1040,14 @@ xfs_bmap_add_extent_delay_real( > * This case is avoided almost all the time. > */ > temp = new->br_startoff - PREV.br_startoff; > + temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; > trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); > - xfs_bmbt_set_blockcount(ep, temp); > - r[0] = *new; > - r[1].br_state = PREV.br_state; > - r[1].br_startblock = 0; > + xfs_bmbt_set_blockcount(ep, temp); /* PREV becomes LEFT */ > + r[0] = *new; /* r[0] becomes MIDDLE */ > + r[1].br_state = PREV.br_state; /* r[1] is RIGHT */ > + r[1].br_startblock = nullstartblock( > + (int)xfs_bmap_worst_indlen(ip, temp2)); > r[1].br_startoff = new_endoff; > - temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; > r[1].br_blockcount = temp2; > xfs_iext_insert(ip, idx + 1, 2, &r[0], state); > ip->i_df.if_lastex = idx + 1; I'd still prefer that you replace r[?] with PREV/LEFT/RIGHT rather than the array notation to be consistent with the rest of the code, and add a comment something like this: /* * We start with: * * +ddddddddddddddddddddddddddddddddddddddddddddddddd+ * PREV @ idx * * and we are allocating: * +rrrrrrrrrrrrrrr+ * new * * and we set it up for insertion as: * * +ddddddddddddddddddd+rrrrrrrrrrrrrrr+ddddddddddddd+ * new * PREV @ idx LEFT RIGHT * inserted @ idx + 1 */ So that there is no ambiguity about the case being handled and how it is executed.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Wed Jan 19 03:56:50 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0J9uoNp198879 for ; Wed, 19 Jan 2011 03:56:50 -0600 X-ASG-Debug-ID: 1295431147-7e3201a20000-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 A84B71621E2C for ; Wed, 19 Jan 2011 01:59: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 nEn1XbIOtHHLAl9A for ; Wed, 19 Jan 2011 01:59:07 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 08A286C106 for ; Wed, 19 Jan 2011 03:59:07 -0600 (CST) Message-ID: <4D36B5EA.6040603@hardwarefreak.com> Date: Wed, 19 Jan 2011 03:59: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: extremely slow write performance plaintext Subject: Re: extremely slow write performance plaintext References: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> <20110113233527.6dca104d@galadriel.home> <18993_1294964274_4D2F9632_18993_1387_1_F79CF9ADB27B2646B59221B7355263830CC143B1@NYL-EXCH1.HVHCVision.com> <4D30A945.4060000@hardwarefreak.com> <27616_1295038110_4D30B69E_27616_233_1_4D30B69E.4020506@davisvision.com> <4D30C7F3.3040105@hardwarefreak.com> <1779_1295360207_4D35A0CF_1779_747_1_4D35A0CF.9050503@davisvision.com> In-Reply-To: <1779_1295360207_4D35A0CF_1779_747_1_4D35A0CF.9050503@davisvision.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: 1295431148 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1603 1.0000 -1.0433 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.44 X-Barracuda-Spam-Status: No, SCORE=-0.44 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.52811 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 Cory Coager put forth on 1/18/2011 8:16 AM: > No, it has never worked properly. Also, I want to stress that I am only having > performance issues with one logical volume, the others seem fine. Then, logically, there is something different about this logical volume than the others. All of them reside atop the same volume group, atop the same two physical RAID6 arrays, correct? Since I'm not quite tired of playing dentist (yet): 1. Were all of the LVs created with the same parameters? If so, can you demonstrate verification of this to us? 2. Are all of them formatted with XFS? Were all formatted with the same XFS parameters? If so, can you demonstrate verification of this to us? 3. Are you encrypting, at some level, the one LV that is showing low performance? Cory: "The two arrays were added to a volume group and multiple logical volumes were created." 4. Was this volume group preexisting? Are there other storage devices in this volume group, or _only_ the RAID6 arrays? 5. Have you attempted deleting and recreating the LV with the performance issue? 6. How many total logical volumes are in this volume group? 7. What Linux distribution are you using? What kernel version? We are not magicians here Cory. We need as much data from you as possible or we can't help you. I thought I made this clear earlier. You need to gather as much relevant data from that box as you can and present it here if you're serious about solving this issue. I get the feeling you just don't really care. In which case, why did you even ask for help in the first place? Troubleshooting this issue requires your _full_ participation and effort. In these situations, it is most often the OP who solves his/her own issue, after providing enough information here that we can point the OP in the right direction. The key here is "providing enough information". -- Stan From BATV+2c7c1349c4ca3c0cc1fa+2705+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 19 05:36:18 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0JBaHkm208637 for ; Wed, 19 Jan 2011 05:36:17 -0600 X-ASG-Debug-ID: 1295437114-63e500450000-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 A6FCE16224A0 for ; Wed, 19 Jan 2011 03:38:34 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id ak6qqbftHQzufWA2 for ; Wed, 19 Jan 2011 03:38:34 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfWMo-0003RI-RO; Wed, 19 Jan 2011 11:38:22 +0000 Date: Wed, 19 Jan 2011 06:38:22 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , Josef Bacik , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: add fpunch command for hole punching via fallocate Subject: Re: [PATCH] xfsprogs: add fpunch command for hole punching via fallocate Message-ID: <20110119113822.GA12941@infradead.org> References: <1295009545-17839-1-git-send-email-josef@redhat.com> <20110118125112.GB21440@infradead.org> <20110118130603.GA23491@dhcp231-156.rdu.redhat.com> <20110118131203.GA4349@infradead.org> <20110118212303.GV28803@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118212303.GV28803@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: 1295437114 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, Jan 19, 2011 at 08:23:03AM +1100, Dave Chinner wrote: > a) it is consistent with other xfs_io allocation manipulation > command structures such as resvsp/unresvsp These are all different ioctls. > b) "punch" is less to type than "fallocate -p" > c) self documenting in scripts e.g. -c "punch 4k 4k" is much > more obvious than -c "fallocate -p 4k 4k" and saves a man > page lookup when reading the script. > d) punch as a top level command will show up in the "xfs_io > -c help", not require you to know it is a suboption of the > "falloc" command to find out how to use it. > e) the xfs_io command does not have to have the same name > and structure as the underlying API that implements the > functionality the commands execute. I still don't like this as a reason to duplicate the code, and not having the different arguments for fallocate exposed similar to the syscall level. What do you think about introducing a concept of aliases in xfs_io so that we can have a toplevel punch command that just gets aliased to fallocate -p without having to reimplement it? I'd take Josef's older falocate -p implementation and will add the alias support myself. From BATV+2c7c1349c4ca3c0cc1fa+2705+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 19 05:36:42 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0JBag5n208749 for ; Wed, 19 Jan 2011 05:36:42 -0600 X-ASG-Debug-ID: 1295437141-62fb03900000-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 90B5B19E8545 for ; Wed, 19 Jan 2011 03:39:01 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Dk5wRyOiiELMlnxb for ; Wed, 19 Jan 2011 03:39:01 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfWNR-0003Sg-0g; Wed, 19 Jan 2011 11:39:01 +0000 Date: Wed, 19 Jan 2011 06:39:01 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 07/12] xfs: kill xfs_fs_mount_cmn_err() macro Subject: Re: [PATCH 07/12] xfs: kill xfs_fs_mount_cmn_err() macro Message-ID: <20110119113900.GB12941@infradead.org> References: <1294792553-8378-1-git-send-email-david@fromorbit.com> <1294792553-8378-8-git-send-email-david@fromorbit.com> <20110118130023.GA23988@infradead.org> <20110118214610.GW28803@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118214610.GW28803@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: 1295437141 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, Jan 19, 2011 at 08:46:10AM +1100, Dave Chinner wrote: > > I would be nice to just move the quite flag into the normal mount flags > > and have a xfs_mount_warn that checks it based off the mp. > > Given it is a flag that is only relevant for the mount context, is > there really any need to use a flag that persists for the entire > life of the filesystem for it? I don't think the code is that hard > to follow right now. ;) We can clear the flag after the mount. But in the end it's probably not worth bothering, so feel free to leave it as-is. From BATV+2c7c1349c4ca3c0cc1fa+2705+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 19 06:01:03 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0JC13qt210866 for ; Wed, 19 Jan 2011 06:01:03 -0600 X-ASG-Debug-ID: 1295438602-64bf006b0000-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 BC033269EDC; Wed, 19 Jan 2011 04:03:22 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 0Te0BTDpZ4THoGCC; Wed, 19 Jan 2011 04:03:22 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfWkz-0007yx-Mc; Wed, 19 Jan 2011 12:03:21 +0000 Date: Wed, 19 Jan 2011 07:03:21 -0500 From: Christoph Hellwig To: Dave Chinner Cc: bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110119120321.GC12941@infradead.org> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> <20110114235549.GI16267@dastard> <20110118204752.GB28791@infradead.org> <20110118231831.GZ28803@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118231831.GZ28803@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: 1295438602 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, Jan 19, 2011 at 10:18:32AM +1100, Dave Chinner wrote: > Except for the fact we use the delalloc state from the buffer to > trigger allocation after mapping. We could probably just use > isnullstartblock() for this - only a mapping from a buffer over a > delalloc range should return a null startblock. isnullstartblock returns true for both DELAYSTARTBLOCK and HOLESTARTBLOCK, so we want to be explicit we can check for br_startblock == DELAYSTARTBLOCK. Note that we also need to explicitly check for br_state == XFS_EXT_UNWRITTEN to set the correct type for the ioend structure. > XFS_BMAPI_IGSTATE does a couple of things. Firstly, It prevents > xfs_bmapi() from allocating new extents (turns off write mode). > This isn't an issue where it is used because neither of the call > sites set XFS_BMAPI_WRITE. I've been down enough to understand what it does. But yes, the single large I/O mapping might explain why we want it. The next version of xfs_map_blocks will get a comment for it.. > In fact, we probably should be setting this for normal written > extents as well, so that the case: > > A B C > +---------------+-----------------+ > written unwritten > > is also handled with the same optimisation. That makes handling > unwritten and overwrites identical, with only delalloc being > different. If we assume delalloc when we get a null startblock, > then we don't need to look at the buffer state at all for the > initial mapping. With the current xfs_bmapi code that won't work. When merging a second extent into the first we only add up the br_blockcount. So for the case above we'd get an extent returned that's not marked as unwrittent and we wouldn't mark the ioend as unwrittent and thus perform not extent conversion after I/O completion. Just adding XFS_BMAPI_IGSTATE blindly for the delalloc case on the other hand is fine, as the merging of delayed extents is handled in a different if clause that totally ignores XFS_BMAPI_IGSTATE. The potention fix for this is to always set br_state if one of the merged extents is an unwrittent extent. The only other caller is xfs_getbmap which does report the unwrittent state to userspace, but already is sloppy for merging the other way if BMV_IF_PREALLOC is not set, so I can't see how beening sloppy this way to makes any difference. > It seems to me that with such modifications, the only thing that we > are using the bufferhead for is the buffer_uptodate() flag to > determine if we should write the block or not. If we can find some > other way of holding this state then we don't need bufferheads in > the write path at all, right? There's really two steps. First we can stop needing buffers headers for the space allocation / mapping. This is doable with the slight tweak of XFS_BMAPI_IGSTATE semantics. We still do need to set BH_Delay or BH_Unwrittent for use in __block_write_begin and block_truncate_page, but they become completely interchangeable at that point. If we want to completely get rid of buffers heads things are a bit more complicated. It's doable as shown by the _nobh aops, but we'll use quite a bit of per-block state that needs to be replaced by per-page state, and we'll lose the way to cache the block number in the buffer head. While we don't make use of that in writepage we do so in the write path, although I'm not sure how important it is. If we get your multi-page write work in it probably won't matter any more. From david@fromorbit.com Wed Jan 19 07:29:34 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0JDTYGl221493 for ; Wed, 19 Jan 2011 07:29:34 -0600 X-ASG-Debug-ID: 1295443910-113f02100000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 09CE51488857 for ; Wed, 19 Jan 2011 05:31:51 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Cock4FVVlre33lrl for ; Wed, 19 Jan 2011 05:31:51 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEAAp0Nk15LN5m/2dsb2JhbACkQ3TARw2FQwQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Jan 2011 00:01:49 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PfY8Z-00082f-Kb; Thu, 20 Jan 2011 00:31:47 +1100 Date: Thu, 20 Jan 2011 00:31:47 +1100 From: Dave Chinner To: Christoph Hellwig Cc: bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110119133147.GN16267@dastard> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> <20110114235549.GI16267@dastard> <20110118204752.GB28791@infradead.org> <20110118231831.GZ28803@dastard> <20110119120321.GC12941@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110119120321.GC12941@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295443913 X-Barracuda-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.52825 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, Jan 19, 2011 at 07:03:21AM -0500, Christoph Hellwig wrote: > On Wed, Jan 19, 2011 at 10:18:32AM +1100, Dave Chinner wrote: > > Except for the fact we use the delalloc state from the buffer to > > trigger allocation after mapping. We could probably just use > > isnullstartblock() for this - only a mapping from a buffer over a > > delalloc range should return a null startblock. > > isnullstartblock returns true for both DELAYSTARTBLOCK and > HOLESTARTBLOCK, so we want to be explicit we can check for > br_startblock == DELAYSTARTBLOCK. True. > > Note that we also need to explicitly check for br_state == > XFS_EXT_UNWRITTEN to set the correct type for the ioend structure. Yes. As i mentioned on IRC I hacked a quick prototype together to test this out and did exactly this. ;) > > > XFS_BMAPI_IGSTATE does a couple of things. Firstly, It prevents > > xfs_bmapi() from allocating new extents (turns off write mode). > > This isn't an issue where it is used because neither of the call > > sites set XFS_BMAPI_WRITE. > > I've been down enough to understand what it does. But yes, the > single large I/O mapping might explain why we want it. The next > version of xfs_map_blocks will get a comment for it.. > > > In fact, we probably should be setting this for normal written > > extents as well, so that the case: > > > > A B C > > +---------------+-----------------+ > > written unwritten > > > > is also handled with the same optimisation. That makes handling > > unwritten and overwrites identical, with only delalloc being > > different. If we assume delalloc when we get a null startblock, > > then we don't need to look at the buffer state at all for the > > initial mapping. > > With the current xfs_bmapi code that won't work. When merging a second > extent into the first we only add up the br_blockcount. So for the > case above we'd get an extent returned that's not marked as unwrittent > and we wouldn't mark the ioend as unwrittent and thus perform not > extent conversion after I/O completion. Just adding XFS_BMAPI_IGSTATE > blindly for the delalloc case on the other hand is fine, as the > merging of delayed extents is handled in a different if clause that > totally ignores XFS_BMAPI_IGSTATE. > > The potention fix for this is to always set br_state if one of the > merged extents is an unwrittent extent. The only other caller is > xfs_getbmap which does report the unwrittent state to userspace, > but already is sloppy for merging the other way if BMV_IF_PREALLOC > is not set, so I can't see how beening sloppy this way to makes any > difference. Yup: @@ -4827,6 +4827,18 @@ xfs_bmapi( ASSERT(mval->br_startoff == mval[-1].br_startoff + mval[-1].br_blockcount); mval[-1].br_blockcount += mval->br_blockcount; + /* + * if one of the extent types is unwritten, make sure + * the extent is reported as unwritten so the caller + * always takes the correct action for unwritten + * extents. This means we always return consistent + * state regardless of whether we find a written or + * unwritten extent first. + */ + if (mval[-1].br_state != XFS_EXT_UNWRITTEN && + mval->br_state == XFS_EXT_UNWRITTEN) { + mval[-1].br_state = XFS_EXT_UNWRITTEN; + } } else if (n > 0 && mval->br_startblock == DELAYSTARTBLOCK && mval[-1].br_startblock == DELAYSTARTBLOCK && > > It seems to me that with such modifications, the only thing that we > > are using the bufferhead for is the buffer_uptodate() flag to > > determine if we should write the block or not. If we can find some > > other way of holding this state then we don't need bufferheads in > > the write path at all, right? > > There's really two steps. First we can stop needing buffers headers > for the space allocation / mapping. This is doable with the slight > tweak of XFS_BMAPI_IGSTATE semantics. > > We still do need to set BH_Delay or BH_Unwrittent for use in > __block_write_begin and block_truncate_page, but they become completely > interchangeable at that point. > > If we want to completely get rid of buffers heads things are a bit > more complicated. It's doable as shown by the _nobh aops, but we'll > use quite a bit of per-block state that needs to be replaced by per-page > state, Sure, or use a similar method to btrfs which stores dirty state bits in a separate extent tree. Worst case memory usage is still much less than a bufferhead per block... > and we'll lose the way to cache the block number in the buffer > head. While we don't make use of that in writepage we do so in > the write path, although I'm not sure how important it is. If we > get your multi-page write work in it probably won't matter any more. The only place we use bh->b_blocknr is for ioend manipulation. Am I missing something else? Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+2c7c1349c4ca3c0cc1fa+2705+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 19 07:53:33 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0JDrWtb222671 for ; Wed, 19 Jan 2011 07:53:33 -0600 X-ASG-Debug-ID: 1295445351-155302200000-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 E21E91300319; Wed, 19 Jan 2011 05:55:51 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id FLRRMcz8XBTus2ls; Wed, 19 Jan 2011 05:55:51 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfYVo-0004ev-RS; Wed, 19 Jan 2011 13:55:48 +0000 Date: Wed, 19 Jan 2011 08:55:48 -0500 From: Christoph Hellwig To: Dave Chinner Cc: bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110119135548.GA11502@infradead.org> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> <20110114235549.GI16267@dastard> <20110118204752.GB28791@infradead.org> <20110118231831.GZ28803@dastard> <20110119120321.GC12941@infradead.org> <20110119133147.GN16267@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110119133147.GN16267@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: 1295445351 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, Jan 20, 2011 at 12:31:47AM +1100, Dave Chinner wrote: > > If we want to completely get rid of buffers heads things are a bit > > more complicated. It's doable as shown by the _nobh aops, but we'll > > use quite a bit of per-block state that needs to be replaced by per-page > > state, > > Sure, or use a similar method to btrfs which stores dirty state bits > in a separate extent tree. Worst case memory usage is still much > less than a bufferhead per block... I'm not sure need to track sub-page dirty state. It only matters if we: a) have a file fragmented enough that it has multiple extents allocated inside a single page b) have enough small writes that just dirty parts of a page with a good enough persistant preallocation a) should happen almost never, while b) might be an issue, specially with setups of 64k page size and 4k blocks (e.g. ppc64 enterprise distro configs) > > and we'll lose the way to cache the block number in the buffer > > head. While we don't make use of that in writepage we do so in > > the write path, although I'm not sure how important it is. If we > > get your multi-page write work in it probably won't matter any more. > > The only place we use bh->b_blocknr is for ioend manipulation. Am I > missing something else? You're right. I thought we use it in the write path, but we only care about the buffer_mapped flag, but never actually look at the block number. From bpm@sgi.com Wed Jan 19 11:38:44 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0JHci9V242901 for ; Wed, 19 Jan 2011 11:38:44 -0600 Received: from lady3jane.americas.sgi.com (lady3jane.americas.sgi.com [128.162.244.187]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4582D30407A; Wed, 19 Jan 2011 09:41:00 -0800 (PST) Received: from lady3jane.americas.sgi.com (localhost [127.0.0.1]) by lady3jane.americas.sgi.com (Postfix) with ESMTP id A2E842417769; Wed, 19 Jan 2011 11:41:58 -0600 (CST) Subject: [PATCH] xfs_bmap_add_extent_delay_real should set br_startblock to nullstartblock To: aelder@sgi.com From: Ben Myers Cc: david@fromorbit.com, xfs@oss.sgi.com Date: Wed, 19 Jan 2011 11:41:58 -0600 Message-ID: <20110119174158.28574.63968.stgit@lady3jane.americas.sgi.com> User-Agent: StGit/0.15 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 When filling in the middle of a previous delayed allocation in xfs_bmap_add_extent_delay_real, set br_startblock of the new delay extent to the right to nullstartblock instead of 0 before inserting the extent into the ifork (xfs_iext_insert), rather than setting br_startblock afterward. Adding the extent into the ifork with br_startblock=0 can lead to the extent being copied into the btree by xfs_bmap_extent_to_btree if we happen to convert from extents format to btree format before updating br_startblock with the correct value. The unexpected addition of this delay extent to the btree can cause subsequent XFS_WANT_CORRUPTED_GOTO filesystem shutdown in several xfs_bmap_add_extent_delay_real cases where we are converting a delay extent to real and unexpectedly find an extent already inserted. For example: 911 case BMAP_LEFT_FILLING: 912 /* 913 * Filling in the first part of a previous delayed allocation. 914 * The left neighbor is not contiguous. 915 */ 916 trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); 917 xfs_bmbt_set_startoff(ep, new_endoff); 918 temp = PREV.br_blockcount - new->br_blockcount; 919 xfs_bmbt_set_blockcount(ep, temp); 920 xfs_iext_insert(ip, idx, 1, new, state); 921 ip->i_df.if_lastex = idx; 922 ip->i_d.di_nextents++; 923 if (cur == NULL) 924 rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; 925 else { 926 rval = XFS_ILOG_CORE; 927 if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, 928 new->br_startblock, new->br_blockcount, 929 &i))) 930 goto done; 931 XFS_WANT_CORRUPTED_GOTO(i == 0, done); With the bogus extent in the btree we shutdown the filesystem at 931. The conversion from extents to btree format happens when the number of extents in the inode increases above ip->i_df.if_ext_max. xfs_bmap_extent_to_btree copies extents from the ifork into the btree, ignoring all delalloc extents which are denoted by br_startblock having some value of nullstartblock. SGI-PV: 1013221 Signed-off-by: Ben Myers --- fs/xfs/xfs_bmap.c | 33 +++++++++++++++++++++++++-------- 1 files changed, 25 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 4111cd3..c1db779 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -1038,17 +1038,34 @@ xfs_bmap_add_extent_delay_real( * Filling in the middle part of a previous delayed allocation. * Contiguity is impossible here. * This case is avoided almost all the time. + * + * We start with a delayed allocation: + * + * +ddddddddddddddddddddddddddddddddddddddddddddddddddddddd+ + * PREV @ idx + * + * and we are allocating: + * +rrrrrrrrrrrrrrrrr+ + * new + * + * and we set it up for insertion as: + * +ddddddddddddddddddd+rrrrrrrrrrrrrrrrr+ddddddddddddddddd+ + * new + * PREV @ idx LEFT RIGHT + * inserted at idx + 1 */ temp = new->br_startoff - PREV.br_startoff; - trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); - xfs_bmbt_set_blockcount(ep, temp); - r[0] = *new; - r[1].br_state = PREV.br_state; - r[1].br_startblock = 0; - r[1].br_startoff = new_endoff; temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; - r[1].br_blockcount = temp2; - xfs_iext_insert(ip, idx + 1, 2, &r[0], state); + trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, temp); /* truncate PREV */ + LEFT = *new; + RIGHT.br_state = PREV.br_state; + RIGHT.br_startblock = nullstartblock( + (int)xfs_bmap_worst_indlen(ip, temp2)); + RIGHT.br_startoff = new_endoff; + RIGHT.br_blockcount = temp2; + /* insert LEFT (r[0]) and RIGHT (r[1]) at the same time */ + xfs_iext_insert(ip, idx + 1, 2, &LEFT, state); ip->i_df.if_lastex = idx + 1; ip->i_d.di_nextents++; if (cur == NULL) From aelder@oss.sgi.com Wed Jan 19 14:49:47 2011 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 p0JKnlpC257085 for ; Wed, 19 Jan 2011 14:49:47 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id p0JKniwH256962; Wed, 19 Jan 2011 14:49:44 -0600 Date: Wed, 19 Jan 2011 14:49:44 -0600 Message-Id: <201101192049.p0JKniwH256962@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-9169-gc56eb8f X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 73efe4a4ddf8eb2b1cc7039e8a66a23a424961af X-Git-Newrev: c56eb8fb6dccb83d9fe62fd4dc00c834de9bc470 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 cf78859 xfs: Do not name variables "panic" 2fe17c1 fallocate should be a file operation 64c23e8 make the feature checks in ->fallocate future proof 7cb3920 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs 275220f Merge branch 'for-2.6.38/core' of git://git.kernel.dk/linux-2.6-block b2034d4 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 008d23e Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial c25d246 XFS: handle hole punching via fallocate properly 92f1c00 Merge branch 'master' into for-linus-merged 23d69b0 Merge branch 'for-2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq 880566e xfs: provide simple rcu-walk ACL implementation b74c79e fs: provide rcu-walk aware permission i_ops fa0d7e3 fs: icache RCU free inodes 4b7bd36 Merge branch 'master' into for-next afe2c51 workqueue: convert cancel_rearming_delayed_work[queue]() users to cancel_delayed_work_sync() f30195c Merge branch 'cleanup-bd_claim' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc into for-2.6.38/core d4d7762 block: clean up blkdev_get() wrappers and their users e525fd8 block: make blkdev_get/put() handle exclusive access b595076 tree-wide: fix comment/printk typos from 73efe4a4ddf8eb2b1cc7039e8a66a23a424961af (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 cf78859f520f8275318f47d7864f4459d940cb6b Author: Geert Uytterhoeven Date: Mon Jan 17 21:21:14 2011 +0100 xfs: Do not name variables "panic" On platforms that call panic() inside their BUG() macro (m68k/sun3, and all platforms that don't set HAVE_ARCH_BUG), compilation fails with: | fs/xfs/support/debug.c: In function ‘xfs_cmn_err’: | fs/xfs/support/debug.c:92: error: called object ‘panic’ is not a function as the local variable "panic" conflicts with the "panic()" function. Rename the local variable to resolve this. Signed-off-by: Geert Uytterhoeven Reviewed-by: Christoph Hellwig Signed-off-by: Linus Torvalds commit 2fe17c1075836b66678ed2a305fd09b6773883aa Author: Christoph Hellwig Date: Fri Jan 14 13:07:43 2011 +0100 fallocate should be a file operation Currently all filesystems except XFS implement fallocate asynchronously, while XFS forced a commit. Both of these are suboptimal - in case of O_SYNC I/O we really want our allocation on disk, especially for the !KEEP_SIZE case where we actually grow the file with user-visible zeroes. On the other hand always commiting the transaction is a bad idea for fast-path uses of fallocate like for example in recent Samba versions. Given that block allocation is a data plane operation anyway change it from an inode operation to a file operation so that we have the file structure available that lets us check for O_SYNC. This also includes moving the code around for a few of the filesystems, and remove the already unnedded S_ISDIR checks given that we only wire up fallocate for regular files. Signed-off-by: Christoph Hellwig Signed-off-by: Al Viro commit 64c23e86873ee410554d6d1c76b60da47025e96f Author: Christoph Hellwig Date: Fri Jan 14 13:07:30 2011 +0100 make the feature checks in ->fallocate future proof Instead of various home grown checks that might need updates for new flags just check for any bit outside the mask of the features supported by the filesystem. This makes the check future proof for any newly added flag. Signed-off-by: Christoph Hellwig Signed-off-by: Al Viro commit 7cb3920a6529df7f54487abe973b903b8239e901 Merge: ad56cbf0fa6c09350c738ec59a3361f2e4ab4bc7 73efe4a4ddf8eb2b1cc7039e8a66a23a424961af Author: Linus Torvalds Date: Fri Jan 14 15:24:17 2011 -0800 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs * 'for-linus' of git://oss.sgi.com/xfs/xfs: xfs: prevent NMI timeouts in cmn_err xfs: Add log level to assertion printk xfs: fix an assignment within an ASSERT() xfs: fix error handling for synchronous writes xfs: add FITRIM support xfs: ensure log covering transactions are synchronous xfs: serialise unaligned direct IOs xfs: factor common write setup code xfs: split buffered IO write path from xfs_file_aio_write xfs: split direct IO write path from xfs_file_aio_write xfs: introduce xfs_rw_lock() helpers for locking the inode xfs: factor post-write newsize updates xfs: factor common post-write isize handling code xfs: ensure sync write errors are returned commit 275220f0fcff1adf28a717076e00f575edf05fda Merge: fe3c560b8a22cb28e54fe8950abef38e88d75831 81c5e2ae33c4b19e53966b427e33646bf6811830 Author: Linus Torvalds Date: Thu Jan 13 10:45:01 2011 -0800 Merge branch 'for-2.6.38/core' of git://git.kernel.dk/linux-2.6-block * 'for-2.6.38/core' of git://git.kernel.dk/linux-2.6-block: (43 commits) block: ensure that completion error gets properly traced blktrace: add missing probe argument to block_bio_complete block cfq: don't use atomic_t for cfq_group block cfq: don't use atomic_t for cfq_queue block: trace event block fix unassigned field block: add internal hd part table references block: fix accounting bug on cross partition merges kref: add kref_test_and_get bio-integrity: mark kintegrityd_wq highpri and CPU intensive block: make kblockd_workqueue smarter Revert "sd: implement sd_check_events()" block: Clean up exit_io_context() source code. Fix compile warnings due to missing removal of a 'ret' variable fs/block: type signature of major_to_index(int) to major_to_index(unsigned) block: convert !IS_ERR(p) && p to !IS_ERR_NOR_NULL(p) cfq-iosched: don't check cfqg in choose_service_tree() fs/splice: Pull buf->ops->confirm() from splice_from_pipe actors cdrom: export cdrom_check_events() sd: implement sd_check_events() sr: implement sr_check_events() ... commit b2034d474b7e1e8578bd5c2977024b51693269d9 Merge: 27d189c02ba25851973c8582e419c0bded9f7e5b 924241575a85249b9d410e38f5b2fcad9035e45c Author: Linus Torvalds Date: Thu Jan 13 10:27:28 2011 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (41 commits) fs: add documentation on fallocate hole punching Gfs2: fail if we try to use hole punch Btrfs: fail if we try to use hole punch Ext4: fail if we try to use hole punch Ocfs2: handle hole punching via fallocate properly XFS: handle hole punching via fallocate properly fs: add hole punching to fallocate vfs: pass struct file to do_truncate on O_TRUNC opens (try #2) fix signedness mess in rw_verify_area() on 64bit architectures fs: fix kernel-doc for dcache::prepend_path fs: fix kernel-doc for dcache::d_validate sanitize ecryptfs ->mount() switch afs move internal-only parts of ncpfs headers to fs/ncpfs switch ncpfs switch 9p pass default dentry_operations to mount_pseudo() switch hostfs switch affs switch configfs ... commit 008d23e4852d78bb2618f2035f8b2110b6a6b968 Merge: 8f685fbda43deccd130d192c9fcef1444649eaca bfc672dcf323877228682aff79dff8ecd9f30ff8 Author: Linus Torvalds Date: Thu Jan 13 10:05:56 2011 -0800 Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial: (43 commits) Documentation/trace/events.txt: Remove obsolete sched_signal_send. writeback: fix global_dirty_limits comment runtime -> real-time ppc: fix comment typo singal -> signal drivers: fix comment typo diable -> disable. m68k: fix comment typo diable -> disable. wireless: comment typo fix diable -> disable. media: comment typo fix diable -> disable. remove doc for obsolete dynamic-printk kernel-parameter remove extraneous 'is' from Documentation/iostats.txt Fix spelling milisec -> ms in snd_ps3 module parameter description Fix spelling mistakes in comments Revert conflicting V4L changes i7core_edac: fix typos in comments mm/rmap.c: fix comment sound, ca0106: Fix assignment to 'channel'. hrtimer: fix a typo in comment init/Kconfig: fix typo anon_inodes: fix wrong function name in comment fix comment typos concerning "consistent" poll: fix a typo in comment ... Fix up trivial conflicts in: - drivers/net/wireless/iwlwifi/iwl-core.c (moved to iwl-legacy.c) - fs/ext4/ext4.h Also fix missed 'diabled' typo in drivers/net/bnx2x/bnx2x.h while at it. commit c25d246715b87ad37e69e7abd1a0fed781423fa2 Author: Josef Bacik Date: Wed Nov 17 20:46:16 2010 -0500 XFS: handle hole punching via fallocate properly This patch simply allows XFS to handle the hole punching flag in fallocate properly. I've tested this with a little program that does a bunch of random hole punching with FL_KEEP_SIZE and without it to make sure it does the right thing. Thanks, Signed-off-by: Josef Bacik Signed-off-by: Al Viro commit 4b7bd364700d9ac8372eff48832062b936d0793b Merge: c0d8768af260e2cbb4bf659ae6094a262c86b085 90a8a73c06cc32b609a880d48449d7083327e11a Author: Jiri Kosina Date: Wed Dec 22 18:57:02 2010 +0100 Merge branch 'master' into for-next Conflicts: MAINTAINERS arch/arm/mach-omap2/pm24xx.c drivers/scsi/bfa/bfa_fcpim.c Needed to update to apply fixes for which the old branch was too outdated. commit f30195c50245d8ace628e1978b1daa8df86e7224 Merge: d07335e51df0c6dec202d315fc4f1f7e100eec4e d4d77629953eabd3c14f6fa5746f6b28babfc55f Author: Jens Axboe Date: Sat Nov 27 19:49:18 2010 +0100 Merge branch 'cleanup-bd_claim' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc into for-2.6.38/core commit d4d77629953eabd3c14f6fa5746f6b28babfc55f Author: Tejun Heo Date: Sat Nov 13 11:55:18 2010 +0100 block: clean up blkdev_get() wrappers and their users After recent blkdev_get() modifications, open_by_devnum() and open_bdev_exclusive() are simple wrappers around blkdev_get(). Replace them with blkdev_get_by_dev() and blkdev_get_by_path(). blkdev_get_by_dev() is identical to open_by_devnum(). blkdev_get_by_path() is slightly different in that it doesn't automatically add %FMODE_EXCL to @mode. All users are converted. Most conversions are mechanical and don't introduce any behavior difference. There are several exceptions. * btrfs now sets FMODE_EXCL in btrfs_device->mode, so there's no reason to OR it explicitly on blkdev_put(). * gfs2, nilfs2 and the generic mount_bdev() now set FMODE_EXCL in sb->s_mode. * With the above changes, sb->s_mode now always should contain FMODE_EXCL. WARN_ON_ONCE() added to kill_block_super() to detect errors. The new blkdev_get_*() functions are with proper docbook comments. While at it, add function description to blkdev_get() too. Signed-off-by: Tejun Heo Cc: Philipp Reisner Cc: Neil Brown Cc: Mike Snitzer Cc: Joern Engel Cc: Chris Mason Cc: Jan Kara Cc: "Theodore Ts'o" Cc: KONISHI Ryusuke Cc: reiserfs-devel@vger.kernel.org Cc: xfs-masters@oss.sgi.com Cc: Alexander Viro commit e525fd89d380c4a94c0d63913a1dd1a593ed25e7 Author: Tejun Heo Date: Sat Nov 13 11:55:17 2010 +0100 block: make blkdev_get/put() handle exclusive access Over time, block layer has accumulated a set of APIs dealing with bdev open, close, claim and release. * blkdev_get/put() are the primary open and close functions. * bd_claim/release() deal with exclusive open. * open/close_bdev_exclusive() are combination of open and claim and the other way around, respectively. * bd_link/unlink_disk_holder() to create and remove holder/slave symlinks. * open_by_devnum() wraps bdget() + blkdev_get(). The interface is a bit confusing and the decoupling of open and claim makes it impossible to properly guarantee exclusive access as in-kernel open + claim sequence can disturb the existing exclusive open even before the block layer knows the current open if for another exclusive access. Reorganize the interface such that, * blkdev_get() is extended to include exclusive access management. @holder argument is added and, if is @FMODE_EXCL specified, it will gain exclusive access atomically w.r.t. other exclusive accesses. * blkdev_put() is similarly extended. It now takes @mode argument and if @FMODE_EXCL is set, it releases an exclusive access. Also, when the last exclusive claim is released, the holder/slave symlinks are removed automatically. * bd_claim/release() and close_bdev_exclusive() are no longer necessary and either made static or removed. * bd_link_disk_holder() remains the same but bd_unlink_disk_holder() is no longer necessary and removed. * open_bdev_exclusive() becomes a simple wrapper around lookup_bdev() and blkdev_get(). It also has an unexpected extra bdev_read_only() test which probably should be moved into blkdev_get(). * open_by_devnum() is modified to take @holder argument and pass it to blkdev_get(). Most of bdev open/close operations are unified into blkdev_get/put() and most exclusive accesses are tested atomically at the open time (as it should). This cleans up code and removes some, both valid and invalid, but unnecessary all the same, corner cases. open_bdev_exclusive() and open_by_devnum() can use further cleanup - rename to blkdev_get_by_path() and blkdev_get_by_devt() and drop special features. Well, let's leave them for another day. Most conversions are straight-forward. drbd conversion is a bit more involved as there was some reordering, but the logic should stay the same. Signed-off-by: Tejun Heo Acked-by: Neil Brown Acked-by: Ryusuke Konishi Acked-by: Mike Snitzer Acked-by: Philipp Reisner Cc: Peter Osterlund Cc: Martin Schwidefsky Cc: Heiko Carstens Cc: Jan Kara Cc: Andrew Morton Cc: Andreas Dilger Cc: "Theodore Ts'o" Cc: Mark Fasheh Cc: Joel Becker Cc: Alex Elder Cc: Christoph Hellwig Cc: dm-devel@redhat.com Cc: drbd-dev@lists.linbit.com Cc: Leo Chen Cc: Scott Branden Cc: Chris Mason Cc: Steven Whitehouse Cc: Dave Kleikamp Cc: Joern Engel Cc: reiserfs-devel@vger.kernel.org Cc: Alexander Viro commit b595076a180a56d1bb170e6eceda6eb9d76f4cd3 Author: Uwe Kleine-König Date: Mon Nov 1 15:38:34 2010 -0400 tree-wide: fix comment/printk typos "gadget", "through", "command", "maintain", "maintain", "controller", "address", "between", "initiali[zs]e", "instead", "function", "select", "already", "equal", "access", "management", "hierarchy", "registration", "interest", "relative", "memory", "offset", "already", Signed-off-by: Uwe Kleine-König Signed-off-by: Jiri Kosina ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_acl.c | 11 ++++++- fs/xfs/linux-2.6/xfs_file.c | 56 ++++++++++++++++++++++++++++++++++++++++++ fs/xfs/linux-2.6/xfs_iops.c | 54 ---------------------------------------- fs/xfs/linux-2.6/xfs_super.c | 7 +++-- fs/xfs/support/debug.c | 6 ++-- fs/xfs/xfs_acl.h | 2 +- fs/xfs/xfs_iget.c | 10 +++--- fs/xfs/xfs_mru_cache.c | 2 +- 8 files changed, 79 insertions(+), 69 deletions(-) hooks/post-receive -- XFS development tree From vmail@opencube.bzctoons.net Wed Jan 19 15:12:40 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0JLCd3v257876 for ; Wed, 19 Jan 2011 15:12:40 -0600 X-ASG-Debug-ID: 1295471695-69fc00ff0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from opencube.bzctoons.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BF6A816233AD for ; Wed, 19 Jan 2011 13:14:55 -0800 (PST) Received: from opencube.bzctoons.net (opencube-2.bzctoons.net [88.191.104.187]) by cuda.sgi.com with ESMTP id tMtqPOzLYPry3ap5 for ; Wed, 19 Jan 2011 13:14:55 -0800 (PST) Received: from localhost (opencube.bzctoons.net.local [127.0.0.1]) by opencube.bzctoons.net (Postfix) with ESMTP id E217090778 for ; Wed, 19 Jan 2011 22:14:54 +0100 (CET) Received: from opencube.bzctoons.net ([127.0.0.1]) by localhost (opencube.bzctoons.net [127.0.0.1]) (amavisd-maia, port 10024) with ESMTP id 14898-05 for ; Wed, 19 Jan 2011 22:14:54 +0100 (CET) Received: by opencube.bzctoons.net (Postfix, from userid 1001) id 0B21B90B5C; Wed, 19 Jan 2011 22:14:54 +0100 (CET) Content-Type: multipart/mixed; charset=utf-8; boundary="----------=_1295471693-16910-0" Content-Transfer-Encoding: binary MIME-Version: 1.0 From: mathieu.avila@opencubetech.com To: xfs@oss.sgi.com X-ASG-Orig-Subj: [Autoreply] [XFS updates] XFS development tree branch, master, updated. v2.6.37-rc4-9169-gc56eb8f Subject: [Autoreply] [XFS updates] XFS development tree branch, master, updated. v2.6.37-rc4-9169-gc56eb8f X-Autoresponse-From: mathieu.avila@opencubetech.com X-Mailer: ispCP 1.0.2 OMEGA Autoreply Manager Message-Id: <20110119211454.0B21B90B5C@opencube.bzctoons.net> Date: Wed, 19 Jan 2011 22:14:54 +0100 (CET) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: Maia Mailguard 1.0.2 X-Barracuda-Connect: opencube-2.bzctoons.net[88.191.104.187] X-Barracuda-Start-Time: 1295471696 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3391 1.0000 -0.1921 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.81 X-Barracuda-Spam-Status: No, SCORE=0.81 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, BSF_RULE_7582B, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.52857 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.50 BSF_RULE7568M Custom Rule 7568M 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Status: Clean This is a multi-part message in MIME format... ------------=_1295471693-16910-0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 7bit Content-Description: Mail User Autoreply Message Hello, Thanks for your e-mail. I am out of the office with limited access to my e-mails. I'll be back on Thursday January 20th. Best regards, Mathieu Avila ------------=_1295471693-16910-0 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: binary Content-Description: Original Message X-Original-To: mathieu.avila@opencubetech.com Received: from localhost (opencube.bzctoons.net.local [127.0.0.1]) by opencube.bzctoons.net (Postfix) with ESMTP id 9512390AD2 for ; Wed, 19 Jan 2011 22:14:53 +0100 (CET) Received: from opencube.bzctoons.net ([127.0.0.1]) by localhost (opencube.bzctoons.net [127.0.0.1]) (amavisd-maia, port 10024) with ESMTP id 14436-06 for ; Wed, 19 Jan 2011 22:14:53 +0100 (CET) Received: from oss.sgi.com (oss.sgi.com [192.48.182.195]) by opencube.bzctoons.net (Postfix) with ESMTP id B61D690778 for ; Wed, 19 Jan 2011 22:14:52 +0100 (CET) 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 p0JKnr7j257132; Wed, 19 Jan 2011 14:49:54 -0600 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 p0JKnlpC257085 for ; Wed, 19 Jan 2011 14:49:47 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id p0JKniwH256962; Wed, 19 Jan 2011 14:49:44 -0600 Date: Wed, 19 Jan 2011 14:49:44 -0600 Message-Id: <201101192049.p0JKniwH256962@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-9169-gc56eb8f X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 73efe4a4ddf8eb2b1cc7039e8a66a23a424961af X-Git-Newrev: c56eb8fb6dccb83d9fe62fd4dc00c834de9bc470 X-BeenThere: xfs@oss.sgi.com X-Mailman-Version: 2.1.11 Precedence: list List-Id: XFS Filesystem from SGI List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============6375367200930197906==" Sender: xfs-bounces@oss.sgi.com Errors-To: xfs-bounces@oss.sgi.com X-Virus-Scanned: Maia Mailguard 1.0.2 --===============6375367200930197906== Content-Type: text/plain 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 cf78859 xfs: Do not name variables "panic" 2fe17c1 fallocate should be a file operation 64c23e8 make the feature checks in ->fallocate future proof 7cb3920 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs 275220f Merge branch 'for-2.6.38/core' of git://git.kernel.dk/linux-2.6-block b2034d4 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 008d23e Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial c25d246 XFS: handle hole punching via fallocate properly 92f1c00 Merge branch 'master' into for-linus-merged 23d69b0 Merge branch 'for-2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq 880566e xfs: provide simple rcu-walk ACL implementation b74c79e fs: provide rcu-walk aware permission i_ops fa0d7e3 fs: icache RCU free inodes 4b7bd36 Merge branch 'master' into for-next afe2c51 workqueue: convert cancel_rearming_delayed_work[queue]() users to cancel_delayed_work_sync() f30195c Merge branch 'cleanup-bd_claim' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc into for-2.6.38/core d4d7762 block: clean up blkdev_get() wrappers and their users e525fd8 block: make blkdev_get/put() handle exclusive access b595076 tree-wide: fix comment/printk typos from 73efe4a4ddf8eb2b1cc7039e8a66a23a424961af (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 cf78859f520f8275318f47d7864f4459d940cb6b Author: Geert Uytterhoeven Date: Mon Jan 17 21:21:14 2011 +0100 xfs: Do not name variables "panic" On platforms that call panic() inside their BUG() macro (m68k/sun3, and all platforms that don't set HAVE_ARCH_BUG), compilation fails with: | fs/xfs/support/debug.c: In function ‘xfs_cmn_err’: | fs/xfs/support/debug.c:92: error: called object ‘panic’ is not a function as the local variable "panic" conflicts with the "panic()" function. Rename the local variable to resolve this. Signed-off-by: Geert Uytterhoeven Reviewed-by: Christoph Hellwig Signed-off-by: Linus Torvalds commit 2fe17c1075836b66678ed2a305fd09b6773883aa Author: Christoph Hellwig Date: Fri Jan 14 13:07:43 2011 +0100 fallocate should be a file operation Currently all filesystems except XFS implement fallocate asynchronously, while XFS forced a commit. Both of these are suboptimal - in case of O_SYNC I/O we really want our allocation on disk, especially for the !KEEP_SIZE case where we actually grow the file with user-visible zeroes. On the other hand always commiting the transaction is a bad idea for fast-path uses of fallocate like for example in recent Samba versions. Given that block allocation is a data plane operation anyway change it from an inode operation to a file operation so that we have the file structure available that lets us check for O_SYNC. This also includes moving the code around for a few of the filesystems, and remove the already unnedded S_ISDIR checks given that we only wire up fallocate for regular files. Signed-off-by: Christoph Hellwig Signed-off-by: Al Viro commit 64c23e86873ee410554d6d1c76b60da47025e96f Author: Christoph Hellwig Date: Fri Jan 14 13:07:30 2011 +0100 make the feature checks in ->fallocate future proof Instead of various home grown checks that might need updates for new flags just check for any bit outside the mask of the features supported by the filesystem. This makes the check future proof for any newly added flag. Signed-off-by: Christoph Hellwig Signed-off-by: Al Viro commit 7cb3920a6529df7f54487abe973b903b8239e901 Merge: ad56cbf0fa6c09350c738ec59a3361f2e4ab4bc7 73efe4a4ddf8eb2b1cc7039e8a66a23a424961af Author: Linus Torvalds Date: Fri Jan 14 15:24:17 2011 -0800 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs * 'for-linus' of git://oss.sgi.com/xfs/xfs: xfs: prevent NMI timeouts in cmn_err xfs: Add log level to assertion printk xfs: fix an assignment within an ASSERT() xfs: fix error handling for synchronous writes xfs: add FITRIM support xfs: ensure log covering transactions are synchronous xfs: serialise unaligned direct IOs xfs: factor common write setup code xfs: split buffered IO write path from xfs_file_aio_write xfs: split direct IO write path from xfs_file_aio_write xfs: introduce xfs_rw_lock() helpers for locking the inode xfs: factor post-write newsize updates xfs: factor common post-write isize handling code xfs: ensure sync write errors are returned commit 275220f0fcff1adf28a717076e00f575edf05fda Merge: fe3c560b8a22cb28e54fe8950abef38e88d75831 81c5e2ae33c4b19e53966b427e33646bf6811830 Author: Linus Torvalds Date: Thu Jan 13 10:45:01 2011 -0800 Merge branch 'for-2.6.38/core' of git://git.kernel.dk/linux-2.6-block * 'for-2.6.38/core' of git://git.kernel.dk/linux-2.6-block: (43 commits) block: ensure that completion error gets properly traced blktrace: add missing probe argument to block_bio_complete block cfq: don't use atomic_t for cfq_group block cfq: don't use atomic_t for cfq_queue block: trace event block fix unassigned field block: add internal hd part table references block: fix accounting bug on cross partition merges kref: add kref_test_and_get bio-integrity: mark kintegrityd_wq highpri and CPU intensive block: make kblockd_workqueue smarter Revert "sd: implement sd_check_events()" block: Clean up exit_io_context() source code. Fix compile warnings due to missing removal of a 'ret' variable fs/block: type signature of major_to_index(int) to major_to_index(unsigned) block: convert !IS_ERR(p) && p to !IS_ERR_NOR_NULL(p) cfq-iosched: don't check cfqg in choose_service_tree() fs/splice: Pull buf->ops->confirm() from splice_from_pipe actors cdrom: export cdrom_check_events() sd: implement sd_check_events() sr: implement sr_check_events() ... commit b2034d474b7e1e8578bd5c2977024b51693269d9 Merge: 27d189c02ba25851973c8582e419c0bded9f7e5b 924241575a85249b9d410e38f5b2fcad9035e45c Author: Linus Torvalds Date: Thu Jan 13 10:27:28 2011 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (41 commits) fs: add documentation on fallocate hole punching Gfs2: fail if we try to use hole punch Btrfs: fail if we try to use hole punch Ext4: fail if we try to use hole punch Ocfs2: handle hole punching via fallocate properly XFS: handle hole punching via fallocate properly fs: add hole punching to fallocate vfs: pass struct file to do_truncate on O_TRUNC opens (try #2) fix signedness mess in rw_verify_area() on 64bit architectures fs: fix kernel-doc for dcache::prepend_path fs: fix kernel-doc for dcache::d_validate sanitize ecryptfs ->mount() switch afs move internal-only parts of ncpfs headers to fs/ncpfs switch ncpfs switch 9p pass default dentry_operations to mount_pseudo() switch hostfs switch affs switch configfs ... commit 008d23e4852d78bb2618f2035f8b2110b6a6b968 Merge: 8f685fbda43deccd130d192c9fcef1444649eaca bfc672dcf323877228682aff79dff8ecd9f30ff8 Author: Linus Torvalds Date: Thu Jan 13 10:05:56 2011 -0800 Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial: (43 commits) Documentation/trace/events.txt: Remove obsolete sched_signal_send. writeback: fix global_dirty_limits comment runtime -> real-time ppc: fix comment typo singal -> signal drivers: fix comment typo diable -> disable. m68k: fix comment typo diable -> disable. wireless: comment typo fix diable -> disable. media: comment typo fix diable -> disable. remove doc for obsolete dynamic-printk kernel-parameter remove extraneous 'is' from Documentation/iostats.txt Fix spelling milisec -> ms in snd_ps3 module parameter description Fix spelling mistakes in comments Revert conflicting V4L changes i7core_edac: fix typos in comments mm/rmap.c: fix comment sound, ca0106: Fix assignment to 'channel'. hrtimer: fix a typo in comment init/Kconfig: fix typo anon_inodes: fix wrong function name in comment fix comment typos concerning "consistent" poll: fix a typo in comment ... Fix up trivial conflicts in: - drivers/net/wireless/iwlwifi/iwl-core.c (moved to iwl-legacy.c) - fs/ext4/ext4.h Also fix missed 'diabled' typo in drivers/net/bnx2x/bnx2x.h while at it. commit c25d246715b87ad37e69e7abd1a0fed781423fa2 Author: Josef Bacik Date: Wed Nov 17 20:46:16 2010 -0500 XFS: handle hole punching via fallocate properly This patch simply allows XFS to handle the hole punching flag in fallocate properly. I've tested this with a little program that does a bunch of random hole punching with FL_KEEP_SIZE and without it to make sure it does the right thing. Thanks, Signed-off-by: Josef Bacik Signed-off-by: Al Viro commit 4b7bd364700d9ac8372eff48832062b936d0793b Merge: c0d8768af260e2cbb4bf659ae6094a262c86b085 90a8a73c06cc32b609a880d48449d7083327e11a Author: Jiri Kosina Date: Wed Dec 22 18:57:02 2010 +0100 Merge branch 'master' into for-next Conflicts: MAINTAINERS arch/arm/mach-omap2/pm24xx.c drivers/scsi/bfa/bfa_fcpim.c Needed to update to apply fixes for which the old branch was too outdated. commit f30195c50245d8ace628e1978b1daa8df86e7224 Merge: d07335e51df0c6dec202d315fc4f1f7e100eec4e d4d77629953eabd3c14f6fa5746f6b28babfc55f Author: Jens Axboe Date: Sat Nov 27 19:49:18 2010 +0100 Merge branch 'cleanup-bd_claim' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc into for-2.6.38/core commit d4d77629953eabd3c14f6fa5746f6b28babfc55f Author: Tejun Heo Date: Sat Nov 13 11:55:18 2010 +0100 block: clean up blkdev_get() wrappers and their users After recent blkdev_get() modifications, open_by_devnum() and open_bdev_exclusive() are simple wrappers around blkdev_get(). Replace them with blkdev_get_by_dev() and blkdev_get_by_path(). blkdev_get_by_dev() is identical to open_by_devnum(). blkdev_get_by_path() is slightly different in that it doesn't automatically add %FMODE_EXCL to @mode. All users are converted. Most conversions are mechanical and don't introduce any behavior difference. There are several exceptions. * btrfs now sets FMODE_EXCL in btrfs_device->mode, so there's no reason to OR it explicitly on blkdev_put(). * gfs2, nilfs2 and the generic mount_bdev() now set FMODE_EXCL in sb->s_mode. * With the above changes, sb->s_mode now always should contain FMODE_EXCL. WARN_ON_ONCE() added to kill_block_super() to detect errors. The new blkdev_get_*() functions are with proper docbook comments. While at it, add function description to blkdev_get() too. Signed-off-by: Tejun Heo Cc: Philipp Reisner Cc: Neil Brown Cc: Mike Snitzer Cc: Joern Engel Cc: Chris Mason Cc: Jan Kara Cc: "Theodore Ts'o" Cc: KONISHI Ryusuke Cc: reiserfs-devel@vger.kernel.org Cc: xfs-masters@oss.sgi.com Cc: Alexander Viro commit e525fd89d380c4a94c0d63913a1dd1a593ed25e7 Author: Tejun Heo Date: Sat Nov 13 11:55:17 2010 +0100 block: make blkdev_get/put() handle exclusive access Over time, block layer has accumulated a set of APIs dealing with bdev open, close, claim and release. * blkdev_get/put() are the primary open and close functions. * bd_claim/release() deal with exclusive open. * open/close_bdev_exclusive() are combination of open and claim and the other way around, respectively. * bd_link/unlink_disk_holder() to create and remove holder/slave symlinks. * open_by_devnum() wraps bdget() + blkdev_get(). The interface is a bit confusing and the decoupling of open and claim makes it impossible to properly guarantee exclusive access as in-kernel open + claim sequence can disturb the existing exclusive open even before the block layer knows the current open if for another exclusive access. Reorganize the interface such that, * blkdev_get() is extended to include exclusive access management. @holder argument is added and, if is @FMODE_EXCL specified, it will gain exclusive access atomically w.r.t. other exclusive accesses. * blkdev_put() is similarly extended. It now takes @mode argument and if @FMODE_EXCL is set, it releases an exclusive access. Also, when the last exclusive claim is released, the holder/slave symlinks are removed automatically. * bd_claim/release() and close_bdev_exclusive() are no longer necessary and either made static or removed. * bd_link_disk_holder() remains the same but bd_unlink_disk_holder() is no longer necessary and removed. * open_bdev_exclusive() becomes a simple wrapper around lookup_bdev() and blkdev_get(). It also has an unexpected extra bdev_read_only() test which probably should be moved into blkdev_get(). * open_by_devnum() is modified to take @holder argument and pass it to blkdev_get(). Most of bdev open/close operations are unified into blkdev_get/put() and most exclusive accesses are tested atomically at the open time (as it should). This cleans up code and removes some, both valid and invalid, but unnecessary all the same, corner cases. open_bdev_exclusive() and open_by_devnum() can use further cleanup - rename to blkdev_get_by_path() and blkdev_get_by_devt() and drop special features. Well, let's leave them for another day. Most conversions are straight-forward. drbd conversion is a bit more involved as there was some reordering, but the logic should stay the same. Signed-off-by: Tejun Heo Acked-by: Neil Brown Acked-by: Ryusuke Konishi Acked-by: Mike Snitzer Acked-by: Philipp Reisner Cc: Peter Osterlund Cc: Martin Schwidefsky Cc: Heiko Carstens Cc: Jan Kara Cc: Andrew Morton Cc: Andreas Dilger Cc: "Theodore Ts'o" Cc: Mark Fasheh Cc: Joel Becker Cc: Alex Elder Cc: Christoph Hellwig Cc: dm-devel@redhat.com Cc: drbd-dev@lists.linbit.com Cc: Leo Chen Cc: Scott Branden Cc: Chris Mason Cc: Steven Whitehouse Cc: Dave Kleikamp Cc: Joern Engel Cc: reiserfs-devel@vger.kernel.org Cc: Alexander Viro commit b595076a180a56d1bb170e6eceda6eb9d76f4cd3 Author: Uwe Kleine-König Date: Mon Nov 1 15:38:34 2010 -0400 tree-wide: fix comment/printk typos "gadget", "through", "command", "maintain", "maintain", "controller", "address", "between", "initiali[zs]e", "instead", "function", "select", "already", "equal", "access", "management", "hierarchy", "registration", "interest", "relative", "memory", "offset", "already", Signed-off-by: Uwe Kleine-König Signed-off-by: Jiri Kosina ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_acl.c | 11 ++++++- fs/xfs/linux-2.6/xfs_file.c | 56 ++++++++++++++++++++++++++++++++++++++++++ fs/xfs/linux-2.6/xfs_iops.c | 54 ---------------------------------------- fs/xfs/linux-2.6/xfs_super.c | 7 +++-- fs/xfs/support/debug.c | 6 ++-- fs/xfs/xfs_acl.h | 2 +- fs/xfs/xfs_iget.c | 10 +++--- fs/xfs/xfs_mru_cache.c | 2 +- 8 files changed, 79 insertions(+), 69 deletions(-) hooks/post-receive -- XFS development tree --===============6375367200930197906== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs --===============6375367200930197906==-- ------------=_1295471693-16910-0-- From david@fromorbit.com Wed Jan 19 19:31:35 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0K1VYg9008856 for ; Wed, 19 Jan 2011 19:31:35 -0600 X-ASG-Debug-ID: 1295487230-555b039e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 27B201623F9D for ; Wed, 19 Jan 2011 17:33:51 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Z6DACADHxC5gmOo1 for ; Wed, 19 Jan 2011 17:33:51 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEAMocN015LN5m/2dsb2JhbACkSHS9Ng2FQwQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Jan 2011 12:03:48 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PfjPG-0000tx-6S; Thu, 20 Jan 2011 12:33:46 +1100 Date: Thu, 20 Jan 2011 12:33:46 +1100 From: Dave Chinner To: Christoph Hellwig Cc: bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110120013346.GO16267@dastard> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> <20110114235549.GI16267@dastard> <20110118204752.GB28791@infradead.org> <20110118231831.GZ28803@dastard> <20110119120321.GC12941@infradead.org> <20110119133147.GN16267@dastard> <20110119135548.GA11502@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110119135548.GA11502@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295487233 X-Barracuda-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.52873 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, Jan 19, 2011 at 08:55:48AM -0500, Christoph Hellwig wrote: > On Thu, Jan 20, 2011 at 12:31:47AM +1100, Dave Chinner wrote: > > > If we want to completely get rid of buffers heads things are a bit > > > more complicated. It's doable as shown by the _nobh aops, but we'll > > > use quite a bit of per-block state that needs to be replaced by per-page > > > state, > > > > Sure, or use a similar method to btrfs which stores dirty state bits > > in a separate extent tree. Worst case memory usage is still much > > less than a bufferhead per block... > > I'm not sure need to track sub-page dirty state. It only matters if we: > > a) have a file fragmented enough that it has multiple extents allocated > inside a single page > b) have enough small writes that just dirty parts of a page > > with a good enough persistant preallocation a) should happen almost > never, while b) might be an issue, specially with setups of 64k > page size and 4k blocks (e.g. ppc64 enterprise distro configs) Right - case a) could probably be handled by making the page size an implicit extsize hint so we always try to minimise sub-page fragmentation during allocation. It's case b) that I'm mainly worried about, esp. w.r.t the 64k page size on ia64/ppc. If we only track a single dirty bit in the page, then every sub-page, non-appending write to an uncached region of a file becomes a RMW cycle to initialise the areas around the write correctly. The question is whether we care about this enough given that we return at least PAGE_SIZE in stat() to tell applications the optimal IO size to avoid RMW cycles. Given that XFS is aimed towards optimising for the large file/large IO/high throughput type of application, I'm comfortable with saying that avoiding sub-page writes for optimal throughput IO is an application problem and going from there. Especially considering that stuff like rsync and untarring kernel tarballs are all appending writes so won't take any performance hit at all... And if we only do IO on whole pages (i.e regardless of block size) .writepage suddenly becomes a lot simpler, as well as being trivial to implement our own .readpage/.readpages.... What do people think about this? Cheers, Dave. -- Dave Chinner david@fromorbit.com From amit.sahrawat83@gmail.com Wed Jan 19 23:02:14 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_43,J_CHICKENPOX_45,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 p0K52D5P027136 for ; Wed, 19 Jan 2011 23:02:14 -0600 X-ASG-Debug-ID: 1295499870-2871029e0000-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 1F1C5102F358 for ; Wed, 19 Jan 2011 21:04:30 -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 teJlJ0E0JreCsEQL for ; Wed, 19 Jan 2011 21:04:30 -0800 (PST) Received: by qyj19 with SMTP id 19so1548592qyj.5 for ; Wed, 19 Jan 2011 21:04:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:date:message-id:subject:from:to :content-type; bh=psvMA1zt3HOnPOWNBLhoqbNlEOcM9p4zkA1T4HtCnlo=; b=i6e1yHbW+2mkEmkB+GCwzyOoglNEcYT8L88856AgBdgsSkSOFcdrKDM76scbcDg6v/ N1CF3betIz1fSHTljK/ofRas2lGuWnP7xV+2/yY4C8lT9+7mMzIjfns3SmQdw6LrkGCR A8bfHOIzRXRJQt02gJxmpeQMue1q99VnlI+vs= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=WKS3QYsATuy9O3Tg5eQmXumdUaNjv7jTIMol3UKADIHjGNKp9ifXTUu70WPIe4g7+3 ssM6lH0E7uXzOcbvdzsYrWl70cPToQWMjDF0yE3/aYf//AhDBZPVHUvmNI9wJ9LaBreK j75jsThdvwq5Ol0Iu7vTFS3wUg/WuVXM2B23Q= MIME-Version: 1.0 Received: by 10.229.233.19 with SMTP id jw19mr1383048qcb.24.1295499870199; Wed, 19 Jan 2011 21:04:30 -0800 (PST) Received: by 10.220.96.65 with HTTP; Wed, 19 Jan 2011 21:04:30 -0800 (PST) Date: Thu, 20 Jan 2011 10:34:30 +0530 Message-ID: X-ASG-Orig-Subj: XFS - issues with writes using sync Subject: XFS - issues with writes using sync From: Amit Sahrawat To: Dave Chinner , xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0016363b8b7091e003049a401190 X-Barracuda-Connect: mail-qy0-f174.google.com[209.85.216.174] X-Barracuda-Start-Time: 1295499872 X-Barracuda-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.52887 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 --0016363b8b7091e003049a401190 Content-Type: text/plain; charset=ISO-8859-1 Hi, I am facing issues in XFS for a simple test case. *Target:* ARM *Kernel version:* 2.6.35.9 *Test case:* mkfs.xfs -f /dev/sda2 mount -t xfs /dev/sda2 /mnt/usb/sda2 (Run script - trying to fragment the XFS formatted partition) #!/bin/sh index=0 while [ "$?" == 0 ] do index=$((index+1)) sync cp /mnt/usb/sda1/setupfile /mnt/usb/sda2/setupfile.$index done Partition Size on which files are being created - 1GB(I need to fragment this first to run other cases) Size of *'setupfile'* - 16K There used be no such issues till *2.6.34*(last XFS version where we tried to create setup). There is no reset involved this time, just simple running the script caused this issue. *Back Trace:* #> ./createsetup.sh kernel BUG at fs/buffer.c:396! Unable to handle kernel NULL pointer dereference at virtual address 00000000 pgd = c0004000 [00000000] *pgd=00000000 Internal error: Oops: 817 [#1] PREEMPT last sysfs file: /sys/devices/platform/ehci-sdp.1/usb2/2-1/2-1.3/2-1.3:1.0/host0/target0:0:0/0:0:0:0/model Modules linked in: CPU: 0 Not tainted (2.6.35.9 #4) PC is at __bug+0x24/0x30 LR is at walk_stackframe+0x24/0x40 pc : [] lr : [] psr: 60000013 sp : c35cfee0 ip : c35cfdd0 fp : c35cfeec r10: c05c7b64 r9 : c35896a8 r8 : c35c07f0 r7 : c7856688 r6 : c78585e0 r5 : c402a960 r4 : c78566c8 r3 : 00000000 r2 : c35cfe30 r1 : c35cfe00 r0 : 00000025 Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel Control: 10c53c7d Table: 83c28059 DAC: 00000017 Process xfsdatad/0 (pid: 340, stack limit = 0xc35ce2e8) Stack: (0xc35cfee0 to 0xc35d0000) fee0: c35cff2c c35cfef0 c05126e4 c04483d0 00000004 c78584c0 c78585e0 c05c78b4 ff00: c35cff2c c35cff10 c05a51cc c05c0220 c78584c0 c35c07c8 c78584c0 c78585e0 ff20: c35cff4c c35cff30 c05c7a50 c05125fc c35c07c8 c35c07f0 c35c07f4 c3d264a0 ff40: c35cff74 c35cff50 c05c7c4c c05c7a28 c35cff74 c35cff60 c35ce000 c35896a0 ff60: c35c07f4 c3d264a0 c35cffc4 c35cff78 c0482874 c05c7b70 c35cff9c c35cff88 ff80: c06f7158 00000000 c3d264a0 c0486820 c35cff90 c35cff90 c06f2bb4 c3c1fec0 ffa0: c35cffcc c048268c c35896a0 00000000 00000000 00000000 c35cfff4 c35cffc8 ffc0: c0486380 c0482698 00000000 00000000 c35cffd0 c35cffd0 c3c1fec0 c04862fc ffe0: c046eeb8 00000013 00000000 c35cfff8 c046eeb8 c0486308 00000000 00000000 Backtrace: [] (__bug+0x0/0x30) from [] (end_buffer_async_write+0xf4/0x1c8) [] (end_buffer_async_write+0x0/0x1c8) from [] (xfs_destroy_ioend+0x34/0x84) r6:c78585e0 r5:c78584c0 r4:c35c07c8 [] (xfs_destroy_ioend+0x0/0x84) from [] (xfs_end_io+0xe8/0xf0) r7:c3d264a0 r6:c35c07f4 r5:c35c07f0 r4:c35c07c8 [] (xfs_end_io+0x0/0xf0) from [] (worker_thread+0x1e8/0x294) r7:c3d264a0 r6:c35c07f4 r5:c35896a0 r4:c35ce000 [] (worker_thread+0x0/0x294) from [] (kthread+0x84/0x8c) [] (kthread+0x0/0x8c) from [] (do_exit+0x0/0x6cc) r7:00000013 r6:c046eeb8 r5:c04862fc r4:c3c1fec0 Code: e59f0010 e1a01003 eb0aa878 e3a03000 (e5833000) ---[ end trace 016e72fe751b35ae ]--- ^C^Z[1] + Stopped ./createsetup.sh After this I tried to unmount the XFS partition, #umount /mnt/usb/sda2 (This command hangs and never returns) Then, I did a reset of the target to check the state of XFS partition on next mount. *Back trace:* #> mount /dev/sda2 /mnt/ XFS mounting filesystem sda2 Starting XFS recovery on filesystem: sda2 (logdev: internal) Filesystem "sda2": XFS internal error xlog_valid_rec_header(1) at line 3431 of file fs/xfs/xfs_log_recover.c. Caller 0xc05b95d8 Backtrace: [] (dump_backtrace+0x0/0x110) from [] (dump_stack+0x18/0x1c) r6:c324e000 r5:00000000 r4:000012bb r3:c3629be0 [] (dump_stack+0x0/0x1c) from [] (xfs_error_report+0x4c/0x5c) [] (xfs_error_report+0x0/0x5c) from [] (xlog_valid_rec_header+0xe4/0x10c) [] (xlog_valid_rec_header+0x0/0x10c) from [] (xlog_do_recovery_pass+0x80/0x650) r7:00000000 r6:c324e000 r5:c36d2440 r4:c3044220 [] (xlog_do_recovery_pass+0x0/0x650) from [] (xlog_do_log_recovery+0x4c/0x90) [] (xlog_do_log_recovery+0x0/0x90) from [] (xlog_do_recover+0x20/0x120) r9:00000000 r8:0001e91e r7:00000000 r6:000012bb r5:00000000 r4:c3044220 [] (xlog_do_recover+0x0/0x120) from [] (xlog_recover+0x88/0xa8) r9:00000000 r8:0001e91e r7:00000000 r6:000012bb r5:00000000 r4:c3044220 [] (xlog_recover+0x0/0xa8) from [] (xfs_log_mount+0xec/0x17c) r7:00000000 r6:00000000 r4:c300fc00 [] (xfs_log_mount+0x0/0x17c) from [] (xfs_mountfs+0x310/0x674) r9:00000000 r8:0001e91e r7:000004b0 r6:00002580 r5:c05d4f84 r4:c300fc00 [] (xfs_mountfs+0x0/0x674) from [] (xfs_fs_fill_super+0x1f8/0x36c) r9:00000040 r8:00000400 r7:c05d4d8c r6:00000000 r5:c36fd600 r4:c300fc00 [] (xfs_fs_fill_super+0x0/0x36c) from [] (get_sb_bdev+0x114/0x170) [] (get_sb_bdev+0x0/0x170) from [] (xfs_fs_get_sb+0x24/0x30) [] (xfs_fs_get_sb+0x0/0x30) from [] (vfs_kern_mount+0x64/0x114) [] (vfs_kern_mount+0x0/0x114) from [] (do_kern_mount+0x3c/0xe0) r8:00008000 r7:c31db500 r6:c32eb000 r5:c365bf20 r4:c07f6a6c [] (do_kern_mount+0x0/0xe0) from [] (do_mount+0x700/0x77c) r8:00008000 r7:00000000 r6:00000000 r5:c31db500 r4:00000020 r3:c32eb000 [] (do_mount+0x0/0x77c) from [] (sys_mount+0x8c/0xcc) [] (sys_mount+0x0/0xcc) from [] (ret_fast_syscall+0x0/0x30) r7:00000015 r6:001854e0 r5:bee32780 r4:00186028 XFS: log mount/recovery failed: error 117 XFS: log mount failed mount: mounting /dev/sda2 on /mnt/ failed: Structure needs cleaning Tried to us xfs_repair on the device #> xfs_repair /dev/sda2 Phase 1 - find and verify superblock... 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. #> xfs_repair -L /dev/sda2 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... ALERT: The filesystem has valuable metadata changes in a log which is being destroyed because the -L option was used. - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 bad hash ordering in block 8388617 of directory inode 128 imap claims a free inode 200248 is in use, correcting imap and clearing inode cleared inode 200248 - agno = 1 - agno = 2 - agno = 3 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 entry "setupfile.3126" at block 22 offset 2576 in directory inode 128 references free inode 200248 clearing inode number in entry at offset 2576... - agno = 1 - agno = 2 - agno = 3 Phase 5 - rebuild AG headers and trees... - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... rebuilding directory inode 128 - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... done Please let me know if there is anything i have missed. Also, if it is good enough to 2.6.35.9 for product? Thanks & Regards, Amit Sahrawat --0016363b8b7091e003049a401190 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Hi,
=A0
I am facing issues in XFS for a simple test case.
Target: ARM
Kernel version: 2.6.35.9
=A0
Test case:
mkfs.xfs -f /dev/sda2
mount -t xfs /dev/sda2 /mnt/usb/sda2
(Run script - trying to fragment the XFS formatted partition)
#!/bin/sh=A0
index=3D0
while [ "$?" =3D=3D 0 ]
doindex=3D$((index+1))
sync
cp /mnt/usb/sda1/setupfile /mnt/usb/sda2/= setupfile.$index
done
=A0
Partition Size on which files are being created - 1GB(I need to fragme= nt this first to run other cases)
Size of 'setupfile'=A0 - 16K
=A0
There used be no such issues till 2.6.34(last XFS ver= sion where we tried to create setup). There is no reset involved this time,= just simple running the script caused this issue.
=A0
Back Trace:
#> ./createsetup.sh
kernel BUG at fs/buffer.c:396!
Unable to= handle kernel NULL pointer dereference at virtual address 00000000
pgd = =3D c0004000
[00000000] *pgd=3D00000000
Internal error: Oops: 817 [#1= ] PREEMPT
last sysfs file: /sys/devices/platform/ehci-sdp.1/usb2/2-1/2-1.3/2-1.3:1.0/= host0/target0:0:0/0:0:0:0/model
Modules linked in:
CPU: 0=A0=A0=A0 No= t tainted=A0 (2.6.35.9 #4)
PC is at __bug+0x24/0x30
LR is at walk_sta= ckframe+0x24/0x40
pc : [<c04483e8>]=A0=A0=A0 lr : [<c04481b8>]=A0=A0=A0 psr: 6000= 0013
sp : c35cfee0=A0 ip : c35cfdd0=A0 fp : c35cfeec
r10: c05c7b64=A0= r9 : c35896a8=A0 r8 : c35c07f0
r7 : c7856688=A0 r6 : c78585e0=A0 r5 : c= 402a960=A0 r4 : c78566c8
r3 : 00000000=A0 r2 : c35cfe30=A0 r1 : c35cfe00=A0 r0 : 00000025
Flags: = nZCv=A0 IRQs on=A0 FIQs on=A0 Mode SVC_32=A0 ISA ARM=A0 Segment kernel
C= ontrol: 10c53c7d=A0 Table: 83c28059=A0 DAC: 00000017
Process xfsdatad/0 = (pid: 340, stack limit =3D 0xc35ce2e8)
Stack: (0xc35cfee0 to 0xc35d0000)
fee0: c35cff2c c35cfef0 c05126e4 c0448= 3d0 00000004 c78584c0 c78585e0 c05c78b4
ff00: c35cff2c c35cff10 c05a51cc= c05c0220 c78584c0 c35c07c8 c78584c0 c78585e0
ff20: c35cff4c c35cff30 c0= 5c7a50 c05125fc c35c07c8 c35c07f0 c35c07f4 c3d264a0
ff40: c35cff74 c35cff50 c05c7c4c c05c7a28 c35cff74 c35cff60 c35ce000 c35896= a0
ff60: c35c07f4 c3d264a0 c35cffc4 c35cff78 c0482874 c05c7b70 c35cff9c = c35cff88
ff80: c06f7158 00000000 c3d264a0 c0486820 c35cff90 c35cff90 c06= f2bb4 c3c1fec0
ffa0: c35cffcc c048268c c35896a0 00000000 00000000 00000000 c35cfff4 c35cff= c8
ffc0: c0486380 c0482698 00000000 00000000 c35cffd0 c35cffd0 c3c1fec0 = c04862fc
ffe0: c046eeb8 00000013 00000000 c35cfff8 c046eeb8 c0486308 000= 00000 00000000
Backtrace:
[<c04483c4>] (__bug+0x0/0x30) from [<c05126e4>] = (end_buffer_async_write+0xf4/0x1c8)
[<c05125f0>] (end_buffer_async= _write+0x0/0x1c8) from [<c05c7a50>] (xfs_destroy_ioend+0x34/0x84)
=A0r6:c78585e0 r5:c78584c0 r4:c35c07c8
[<c05c7a1c>] (xfs_destroy_i= oend+0x0/0x84) from [<c05c7c4c>] (xfs_end_io+0xe8/0xf0)
=A0r7:c3d2= 64a0 r6:c35c07f4 r5:c35c07f0 r4:c35c07c8
[<c05c7b64>] (xfs_end_io+= 0x0/0xf0) from [<c0482874>] (worker_thread+0x1e8/0x294)
=A0r7:c3d264a0 r6:c35c07f4 r5:c35896a0 r4:c35ce000
[<c048268c>] (w= orker_thread+0x0/0x294) from [<c0486380>] (kthread+0x84/0x8c)
[<= ;c04862fc>] (kthread+0x0/0x8c) from [<c046eeb8>] (do_exit+0x0/0x6c= c)
=A0r7:00000013 r6:c046eeb8 r5:c04862fc r4:c3c1fec0
Code: e59f0010 e1a010= 03 eb0aa878 e3a03000 (e5833000)
---[ end trace 016e72fe751b35ae ]---
^C^Z[1] + Stopped=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0 ./createsetup.sh
=A0
After this I tried to unmount the XFS partition,
=A0
#umount /mnt/usb/sda2 (This command hangs and never returns)
=A0
Then, I did a reset of the target to check the state of XFS partition = on next mount.
=A0
Back trace:
#> mount /dev/sda2 /mnt/
XFS mounting filesystem sda2
Startin= g XFS recovery on filesystem: sda2 (logdev: internal)
Filesystem "s= da2": XFS internal error xlog_valid_rec_header(1) at line 3431 of file= fs/xfs/xfs_log_recover.c.=A0 Caller 0xc05b95d8
=A0
Backtrace:
[<c04486ac>] (dump_backtrace+0x0/0x110) from [&= lt;c06f24e0>] (dump_stack+0x18/0x1c)
=A0r6:c324e000 r5:00000000 r4:00= 0012bb r3:c3629be0
[<c06f24c8>] (dump_stack+0x0/0x1c) from [<c0= 5a07e8>] (xfs_error_report+0x4c/0x5c)
[<c05a079c>] (xfs_error_report+0x0/0x5c) from [<c05b5870>] (xlo= g_valid_rec_header+0xe4/0x10c)
[<c05b578c>] (xlog_valid_rec_header= +0x0/0x10c) from [<c05b95d8>] (xlog_do_recovery_pass+0x80/0x650)
=A0r7:00000000 r6:c324e000 r5:c36d2440 r4:c3044220
[<c05b9558>] (x= log_do_recovery_pass+0x0/0x650) from [<c05b9bf4>] (xlog_do_log_recove= ry+0x4c/0x90)
[<c05b9ba8>] (xlog_do_log_recovery+0x0/0x90) from [&= lt;c05b9c58>] (xlog_do_recover+0x20/0x120)
=A0r9:00000000 r8:0001e91e r7:00000000 r6:000012bb r5:00000000
r4:c30442= 20
[<c05b9c38>] (xlog_do_recover+0x0/0x120) from [<c05b9de0>= ] (xlog_recover+0x88/0xa8)
=A0r9:00000000 r8:0001e91e r7:00000000 r6:000= 012bb r5:00000000
r4:c3044220
[<c05b9d58>] (xlog_recover+0x0/0xa8) from [<c05b288= 8>] (xfs_log_mount+0xec/0x17c)
=A0r7:00000000 r6:00000000 r4:c300fc00=
[<c05b279c>] (xfs_log_mount+0x0/0x17c) from [<c05bc6a4>] (x= fs_mountfs+0x310/0x674)
=A0r9:00000000 r8:0001e91e r7:000004b0 r6:00002580 r5:c05d4f84
r4:c300fc= 00
[<c05bc394>] (xfs_mountfs+0x0/0x674) from [<c05d4f84>] (x= fs_fs_fill_super+0x1f8/0x36c)
=A0r9:00000040 r8:00000400 r7:c05d4d8c r6:= 00000000 r5:c36fd600
r4:c300fc00
[<c05d4d8c>] (xfs_fs_fill_super+0x0/0x36c) from [<c= 04ee600>] (get_sb_bdev+0x114/0x170)
[<c04ee4ec>] (get_sb_bdev+0= x0/0x170) from [<c05d2f44>] (xfs_fs_get_sb+0x24/0x30)
[<c05d2f2= 0>] (xfs_fs_get_sb+0x0/0x30) from [<c04ed138>] (vfs_kern_mount+0x6= 4/0x114)
[<c04ed0d4>] (vfs_kern_mount+0x0/0x114) from [<c04ed244>] (do_k= ern_mount+0x3c/0xe0)
=A0r8:00008000 r7:c31db500 r6:c32eb000 r5:c365bf20 = r4:c07f6a6c
[<c04ed208>] (do_kern_mount+0x0/0xe0) from [<c05065= 94>] (do_mount+0x700/0x77c)
=A0r8:00008000 r7:00000000 r6:00000000 r5:c31db500 r4:00000020
r3:c32eb0= 00
[<c0505e94>] (do_mount+0x0/0x77c) from [<c050669c>] (sys_= mount+0x8c/0xcc)
[<c0506610>] (sys_mount+0x0/0xcc) from [<c0444= 9a0>] (ret_fast_syscall+0x0/0x30)
=A0r7:00000015 r6:001854e0 r5:bee32780 r4:00186028
XFS: log mount/recove= ry failed: error 117
XFS: log mount failed
mount: mounting /dev/sda2 = on /mnt/ failed: Structure needs cleaning
=A0
=A0
Tried to us xfs_repair on the device
#> xfs_repair /dev/sda2
Phase 1 - find and verify superblock...<= br>Phase 2 - using internal log
=A0=A0=A0=A0=A0=A0=A0 - zero log...
E= RROR: The filesystem has valuable metadata changes in a log which needs to<= br>be replayed.=A0 Mount the filesystem to replay the log, and unmount it b= efore
re-running xfs_repair.=A0 If you are unable to mount the filesystem, then u= se
the -L option to destroy the log and attempt a repair.
Note that d= estroying the log may cause corruption -- please attempt a mount
of the = filesystem before doing this.
=A0
#> xfs_repair -L /dev/sda2
Phase 1 - find and verify superblock.= ..
Phase 2 - using internal log
=A0=A0=A0=A0=A0=A0=A0 - zero log...ALERT: The filesystem has valuable metadata changes in a log which is bei= ng
destroyed because the -L option was used.
=A0=A0=A0=A0=A0=A0=A0 - scan filesystem freespace and inode maps...
=A0= =A0=A0=A0=A0=A0=A0 - found root inode chunk
Phase 3 - for each AG...
= =A0=A0=A0=A0=A0=A0=A0 - scan and clear agi unlinked lists...
=A0=A0=A0= =A0=A0=A0=A0 - process known inodes and perform inode discovery...
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 0
bad hash ordering in block 8388617 of= directory inode 128
imap claims a free inode 200248 is in use, correcti= ng imap and clearing inode
cleared inode 200248
=A0=A0=A0=A0=A0=A0=A0= - agno =3D 1
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 2
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 3
=A0=A0=A0=A0=A0=A0=A0 - process newly= discovered inodes...
Phase 4 - check for duplicate blocks...
=A0=A0= =A0=A0=A0=A0=A0 - setting up duplicate extent list...
=A0=A0=A0=A0=A0=A0= =A0 - check for inodes claiming duplicate blocks...
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 0
entry "setupfile.3126" at b= lock 22 offset 2576 in directory inode 128 references free inode 200248
= =A0=A0=A0=A0=A0=A0=A0 clearing inode number in entry at offset 2576...
= =A0=A0=A0=A0=A0=A0=A0 - agno =3D 1
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 2 =A0=A0=A0=A0=A0=A0=A0 - agno =3D 3
Phase 5 - rebuild AG headers and tree= s...
=A0=A0=A0=A0=A0=A0=A0 - reset superblock...
Phase 6 - check inod= e connectivity...
=A0=A0=A0=A0=A0=A0=A0 - resetting contents of realtime= bitmap and summary inodes
=A0=A0=A0=A0=A0=A0=A0 - traversing filesystem= ...
rebuilding directory inode 128
=A0=A0=A0=A0=A0=A0=A0 - traversal finishe= d ...
=A0=A0=A0=A0=A0=A0=A0 - moving disconnected inodes to lost+found .= ..
Phase 7 - verify and correct link counts...
done
=A0
Please let me know if there is anything i have missed. Also, if it is = good enough to 2.6.35.9 for product?
=A0
Thanks & Regards,
Amit Sahrawat
=A0
=A0
--0016363b8b7091e003049a401190-- From david@fromorbit.com Wed Jan 19 23:15:07 2011 X-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 p0K5F71W028331 for ; Wed, 19 Jan 2011 23:15:07 -0600 X-ASG-Debug-ID: 1295500644-13f300b10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0173019F191A for ; Wed, 19 Jan 2011 21:17:24 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ztyCDbZp63nyNiP1 for ; Wed, 19 Jan 2011 21:17:24 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEAIdRN015LN5m/2dsb2JhbACkS3S9OQ2FQwQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Jan 2011 15:47:22 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pfmtc-0001F6-RA; Thu, 20 Jan 2011 16:17:20 +1100 Date: Thu, 20 Jan 2011 16:17:20 +1100 From: Dave Chinner To: Amit Sahrawat Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS - issues with writes using sync Subject: Re: XFS - issues with writes using sync Message-ID: <20110120051720.GR16267@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: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295500646 X-Barracuda-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.52888 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, Jan 20, 2011 at 10:34:30AM +0530, Amit Sahrawat wrote: > Hi, > > I am facing issues in XFS for a simple test case. > *Target:* ARM > *Kernel version:* 2.6.35.9 > > *Test case:* > mkfs.xfs -f /dev/sda2 > mount -t xfs /dev/sda2 /mnt/usb/sda2 > (Run script - trying to fragment the XFS formatted partition) > #!/bin/sh > index=0 > while [ "$?" == 0 ] > do > index=$((index+1)) > sync > cp /mnt/usb/sda1/setupfile /mnt/usb/sda2/setupfile.$index > done > > Partition Size on which files are being created - 1GB(I need to fragment > this first to run other cases) > Size of *'setupfile'* - 16K > > There used be no such issues till *2.6.34*(last XFS version where we tried > to create setup). There is no reset involved this time, just simple running > the script caused this issue. You have a known good version, a known bad version and a reproducable test case. i.e. everything you need to run a git bisect and find the commit introduced the regression. Can you do this and tell us what that commit is? Cheers, Dave. -- Dave Chinner david@fromorbit.com From amit.sahrawat83@gmail.com Thu Jan 20 00:05:26 2011 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.6 required=5.0 tests=BAYES_05,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_43,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 p0K65Qeo034944 for ; Thu, 20 Jan 2011 00:05:26 -0600 X-ASG-Debug-ID: 1295503664-1bd002410000-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 36F751EA38CE for ; Wed, 19 Jan 2011 22:07:44 -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 hEwWAUlEcWWYqlMC for ; Wed, 19 Jan 2011 22:07:44 -0800 (PST) Received: by qyk12 with SMTP id 12so243275qyk.5 for ; Wed, 19 Jan 2011 22:07:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=pIYWnhyrnFsa4odN4aeMhyzi1adIVa4TWhQUyXDItp8=; b=a14jcGOIdsrHGctXJqS/u/CUZ4VmmYc+ERxOu/cWlZq6d8dKUgEXpRtC/aNiL6syFF bz1kk9ixJyl/hFqyjUR6oDQb+R7O4sdIrKfY+1WZpHMNnEL4SsgaF070GWSxyssGeS9k kYvLGMHv9bVRy96pqHRMwNWOQFSimvacEPqv4= 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=r6+k3HnZlLLNdLZVlzL48KnsHOmxrCfeMHJV4KyJrECsAoZ+tBsxQFIJ6WngQYKDDo FsiTATKteSgnNyptdcOzQvE05FiXXPhCf42VNK7lYZNvlHqcy5zCrUOKIdyl1E4GzFUm /NIFWojilYA78WST/A/lnXWl24E3N8+Za1sos= MIME-Version: 1.0 Received: by 10.224.67.65 with SMTP id q1mr1571184qai.40.1295503664540; Wed, 19 Jan 2011 22:07:44 -0800 (PST) Received: by 10.220.96.65 with HTTP; Wed, 19 Jan 2011 22:07:44 -0800 (PST) In-Reply-To: <20110120051720.GR16267@dastard> References: <20110120051720.GR16267@dastard> Date: Thu, 20 Jan 2011 11:37:44 +0530 Message-ID: X-ASG-Orig-Subj: Re: XFS - issues with writes using sync Subject: Re: XFS - issues with writes using sync From: Amit Sahrawat To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0015175cf83cbaee37049a40f381 X-Barracuda-Connect: mail-qy0-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1295503665 X-Barracuda-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.52892 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 --0015175cf83cbaee37049a40f381 Content-Type: text/plain; charset=ISO-8859-1 Hi, I will try to find out the cause for this. Meanwhile, just a small request/suggestion - in the past this type of testcases have helped us in finding many problems in XFS. Can something like this be added to xfstests? This might help. Thanks, Amit Sahrawat On Thu, Jan 20, 2011 at 10:47 AM, Dave Chinner wrote: > On Thu, Jan 20, 2011 at 10:34:30AM +0530, Amit Sahrawat wrote: > > Hi, > > > > I am facing issues in XFS for a simple test case. > > *Target:* ARM > > *Kernel version:* 2.6.35.9 > > > > *Test case:* > > mkfs.xfs -f /dev/sda2 > > mount -t xfs /dev/sda2 /mnt/usb/sda2 > > (Run script - trying to fragment the XFS formatted partition) > > #!/bin/sh > > index=0 > > while [ "$?" == 0 ] > > do > > index=$((index+1)) > > sync > > cp /mnt/usb/sda1/setupfile /mnt/usb/sda2/setupfile.$index > > done > > > > Partition Size on which files are being created - 1GB(I need to fragment > > this first to run other cases) > > Size of *'setupfile'* - 16K > > > > There used be no such issues till *2.6.34*(last XFS version where we > tried > > to create setup). There is no reset involved this time, just simple > running > > the script caused this issue. > > You have a known good version, a known bad version and a > reproducable test case. i.e. everything you need to run a git bisect > and find the commit introduced the regression. Can you do this and > tell us what that commit is? > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --0015175cf83cbaee37049a40f381 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Hi,
=A0
I will try to find out the cause for this.
Meanwhile, just a small request/suggestion - in the past this=A0type o= f testcases have helped us in finding many problems in XFS.
Can something like this be added to xfstests? This might help.

Thanks,
Amit Sahrawat
On Thu, Jan 20, 2011 at 10:47 AM, Dave Chinner <= span dir=3D"ltr"><david@fromorbit= .com> wrote:
On Thu, Jan 20, 2011 at 10:34:30AM +0530, Amit Sahrawat w= rote:
> Hi,
>
> I am facing issues in XFS for a simple te= st case.
> *Target:* ARM
> *Kernel version:* 2.6.35.9
> > *Test case:*
> mkfs.xfs -f /dev/sda2
> mount -t xfs /dev/s= da2 /mnt/usb/sda2
> (Run script - trying to fragment the XFS formatte= d partition)
> #!/bin/sh
> index=3D0
> while [ "$?&q= uot; =3D=3D 0 ]
> do
> index=3D$((index+1))
> sync
> cp /mnt/usb/sda1/= setupfile /mnt/usb/sda2/setupfile.$index
> done
>
> Parti= tion Size on which files are being created - 1GB(I need to fragment
>= this first to run other cases)
> Size of *'setupfile'* =A0- 16K
>
> There used be n= o such issues till *2.6.34*(last XFS version where we tried
> to crea= te setup). There is no reset involved this time, just simple running
>= ; the script caused this issue.

You have a known good version, a known bad version and a
repro= ducable test case. i.e. everything you need to run a git bisect
and find= the commit introduced the regression. Can you do this and
tell us what = that commit is?

Cheers,

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

--0015175cf83cbaee37049a40f381-- From amit.sahrawat83@gmail.com Thu Jan 20 00:36:04 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_43,J_CHICKENPOX_66,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 p0K6a4k0038379 for ; Thu, 20 Jan 2011 00:36:04 -0600 X-ASG-Debug-ID: 1295505502-591c009a0000-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 1294419F30EA for ; Wed, 19 Jan 2011 22:38:22 -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 0FPiDq1TkKNLnWkp for ; Wed, 19 Jan 2011 22:38:22 -0800 (PST) Received: by qwe5 with SMTP id 5so256153qwe.26 for ; Wed, 19 Jan 2011 22:38:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=7PMujMiV0+SBPHXQLpjq0+v6xnutV1vfR9Lh/htiG1Y=; b=JCHQKVgp86yzltZ8oVf4IsyFz2uyA6NIbBAP3asanUi90MACT5vzhaFwj/wEn7nOG6 UKsScbOXcF7pzfGCOy5ZDF2oWHW4Q5uiPGeb6rNzM8xFHIemqZYY26f1Z/m34q351dsg YsZc6g/xjD/ZN/2rZvMTzdRFVasAmXVebzcjc= 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=kLxAEmXDzNnEL0Byeo6n+qGIZYHvn+4yFc03hd5+Td91cV8kxJTyYtYAbJm4/Exrtk E7KzscUxKzkINN3N68kF8ZlSnyTudtKpQkytJWTbXv/vZGsq9PahL+Jq357chKtZKdyG Fx4Hcmwxa41lhVma9QoeGu28W/PATHwJB2FnI= MIME-Version: 1.0 Received: by 10.229.89.84 with SMTP id d20mr1451540qcm.100.1295505501942; Wed, 19 Jan 2011 22:38:21 -0800 (PST) Received: by 10.220.96.65 with HTTP; Wed, 19 Jan 2011 22:38:21 -0800 (PST) In-Reply-To: References: <20110120051720.GR16267@dastard> Date: Thu, 20 Jan 2011 12:08:21 +0530 Message-ID: X-ASG-Orig-Subj: Re: XFS - issues with writes using sync Subject: Re: XFS - issues with writes using sync From: Amit Sahrawat To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0016364ede483f7377049a41617d X-Barracuda-Connect: mail-qw0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1295505503 X-Barracuda-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.52894 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 --0016364ede483f7377049a41617d Content-Type: text/plain; charset=ISO-8859-1 Hi, I tried with the same test case - just removed 'sync' command from the script(please check script below) to check the behaviour. Please find the logs: #> ./createsetup.sh ------------[ cut here ]------------ WARNING: at lib/list_debug.c:30 __list_add+0x6c/0x90() list_add corruption. prev->next should be next (c78699c0), but was c78299c0. (prev=c78699c0). Modules linked in: Backtrace: [] (dump_backtrace+0x0/0x110) from [] (dump_stack+0x18/0x1c) r6:c07bc5e1 r5:0000001e r4:c7c01d38 r3:00000000 [] (dump_stack+0x0/0x1c) from [] (warn_slowpath_common+0x54/0x6c) [] (warn_slowpath_common+0x0/0x6c) from [] (warn_slowpath_fmt+0x38/0x40) r8:00000000 r7:c05cabd8 r6:c7c01d80 r5:c78699c0 r4:c78699c0 r3:00000009 [] (warn_slowpath_fmt+0x0/0x40) from [] (__list_add+0x6c/0x90) r3:c78699c0 r2:c07bc6b3 [] (__list_add+0x0/0x90) from [] (__down_write_nested+0xbc/0x10c) r6:c78699bc r5:60000013 r4:c302d820 [] (__down_write_nested+0x0/0x10c) from [] (__down_write+0x14/0x18) r6:c31324a0 r5:00000005 r4:c78699bc [] (__down_write+0x0/0x18) from [] (down_write+0x28/0x30) [] (down_write+0x0/0x30) from [] (xfs_ilock+0x28/0xe8) r4:c7869940 r3:00000000 [] (xfs_ilock+0x0/0xe8) from [] (xfs_file_aio_write+0x1d4/0x8cc) r7:00000001 r6:c31324a0 r5:00000001 r4:c7869940 [] (xfs_file_aio_write+0x0/0x8cc) from [] (do_sync_write+0xa0/0xe0) [] (do_sync_write+0x0/0xe0) from [] (vfs_write+0xbc/0x178) r6:bee925a0 r5:c31324a0 r4:00000f38 [] (vfs_write+0x0/0x178) from [] (sys_write+0x44/0x70) r7:00000004 r6:00000f38 r5:bee925a0 r4:c31324a0 [] (sys_write+0x0/0x70) from [] (ret_fast_syscall+0x0/0x30) r9:c7c00000 r8:c0444b48 r6:bee925a0 r5:00000f38 r4:001854e0 ---[ end trace 8124d49a241e0763 ]--- INFO: task cp:5445 blocked for more than 120 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. cp D c06ee75c 0 5445 2173 0x00000000 Backtrace: [] (schedule+0x0/0x454) from [] (__down_write_nested+0xf4/0x10c) r9:c7869a60 r8:00000000 r7:c05cabd8 r6:c78699bc r5:60000013 r4:c302d820 [] (__down_write_nested+0x0/0x10c) from [] (__down_write+0x14/0x18) r6:c31324a0 r5:00000005 r4:c78699bc [] (__down_write+0x0/0x18) from [] (down_write+0x28/0x30) [] (down_write+0x0/0x30) from [] (xfs_ilock+0x28/0xe8) r4:c7869940 r3:00000000 [] (xfs_ilock+0x0/0xe8) from [] (xfs_file_aio_write+0x1d4/0x8cc) r7:00000001 r6:c31324a0 r5:00000001 r4:c7869940 [] (xfs_file_aio_write+0x0/0x8cc) from [] (do_sync_write+0xa0/0xe0) [] (do_sync_write+0x0/0xe0) from [] (vfs_write+0xbc/0x178) r6:bee925a0 r5:c31324a0 r4:00000f38 [] (vfs_write+0x0/0x178) from [] (sys_write+0x44/0x70) r7:00000004 r6:00000f38 r5:bee925a0 r4:c31324a0 [] (sys_write+0x0/0x70) from [] (ret_fast_syscall+0x0/0x30) r9:c7c00000 r8:c0444b48 r6:bee925a0 r5:00000f38 r4:001854e0 ^C^Z[1] + Stopped ./createsetup.sh I really doubt about the stability of 2.6.35.9, it is not passing our basic tests. Checking few more things, before deciding about the patches which got introduced between 2.6.34 ~ 2.6.35.9(around 102). Thanks, Amit Sahrawat On Thu, Jan 20, 2011 at 11:37 AM, Amit Sahrawat wrote: > Hi, > > I will try to find out the cause for this. > Meanwhile, just a small request/suggestion - in the past this type of > testcases have helped us in finding many problems in XFS. > Can something like this be added to xfstests? This might help. > > Thanks, > Amit Sahrawat > On Thu, Jan 20, 2011 at 10:47 AM, Dave Chinner wrote: > >> On Thu, Jan 20, 2011 at 10:34:30AM +0530, Amit Sahrawat wrote: >> > Hi, >> > >> > I am facing issues in XFS for a simple test case. >> > *Target:* ARM >> > *Kernel version:* 2.6.35.9 >> > >> > *Test case:* >> > mkfs.xfs -f /dev/sda2 >> > mount -t xfs /dev/sda2 /mnt/usb/sda2 >> > (Run script - trying to fragment the XFS formatted partition) >> > #!/bin/sh >> > index=0 >> > while [ "$?" == 0 ] >> > do >> > index=$((index+1)) >> > sync >> > cp /mnt/usb/sda1/setupfile /mnt/usb/sda2/setupfile.$index >> > done >> > >> > Partition Size on which files are being created - 1GB(I need to fragment >> > this first to run other cases) >> > Size of *'setupfile'* - 16K >> > >> > There used be no such issues till *2.6.34*(last XFS version where we >> tried >> > to create setup). There is no reset involved this time, just simple >> running >> > the script caused this issue. >> >> You have a known good version, a known bad version and a >> reproducable test case. i.e. everything you need to run a git bisect >> and find the commit introduced the regression. Can you do this and >> tell us what that commit is? >> >> Cheers, >> >> Dave. >> -- >> Dave Chinner >> david@fromorbit.com >> > > --0016364ede483f7377049a41617d Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Hi,
I tried with the same test case - just removed 'sync' command = from the script(please check script=A0below)=A0to check the behaviour.
=A0
Please find the logs:
#> ./createsetup.sh
------------[ cut here ]------------
WAR= NING: at lib/list_debug.c:30 __list_add+0x6c/0x90()
list_add corruption.= prev->next should be next (c78699c0), but was c78299c0. (prev=3Dc78699c= 0).
Modules linked in:
Backtrace:
[<c04486ac>] (dump_backtrace+0x0= /0x110) from [<c06ee0e0>] (dump_stack+0x18/0x1c)
=A0r6:c07bc5e1 r5= :0000001e r4:c7c01d38 r3:00000000
[<c06ee0c8>] (dump_stack+0x0/0x1= c) from [<c046b5fc>] (warn_slowpath_common+0x54/0x6c)
[<c046b5a8>] (warn_slowpath_common+0x0/0x6c) from [<c046b6b8>] = (warn_slowpath_fmt+0x38/0x40)
=A0r8:00000000 r7:c05cabd8 r6:c7c01d80 r5:= c78699c0 r4:c78699c0
r3:00000009
[<c046b680>] (warn_slowpath_fm= t+0x0/0x40) from [<c060b89c>] (__list_add+0x6c/0x90)
=A0r3:c78699c0 r2:c07bc6b3
[<c060b830>] (__list_add+0x0/0x90) from= [<c06f0710>] (__down_write_nested+0xbc/0x10c)
=A0r6:c78699bc r5:6= 0000013 r4:c302d820
[<c06f0654>] (__down_write_nested+0x0/0x10c) f= rom [<c06f0774>] (__down_write+0x14/0x18)
=A0r6:c31324a0 r5:00000005 r4:c78699bc
[<c06f0760>] (__down_write+= 0x0/0x18) from [<c06efd50>] (down_write+0x28/0x30)
[<c06efd28&g= t;] (down_write+0x0/0x30) from [<c05a21ac>] (xfs_ilock+0x28/0xe8)
=A0r4:c7869940 r3:00000000
[<c05a2184>] (xfs_ilock+0x0/0xe8) from = [<c05cabd8>] (xfs_file_aio_write+0x1d4/0x8cc)
=A0r7:00000001 r6:c3= 1324a0 r5:00000001 r4:c7869940
[<c05caa04>] (xfs_file_aio_write+0x= 0/0x8cc) from [<c04eb404>] (do_sync_write+0xa0/0xe0)
[<c04eb364>] (do_sync_write+0x0/0xe0) from [<c04ec028>] (vfs_wr= ite+0xbc/0x178)
=A0r6:bee925a0 r5:c31324a0 r4:00000f38
[<c04ebf6c&= gt;] (vfs_write+0x0/0x178) from [<c04ec1ac>] (sys_write+0x44/0x70) =A0r7:00000004 r6:00000f38 r5:bee925a0 r4:c31324a0
[<c04ec168>] (s= ys_write+0x0/0x70) from [<c04449a0>] (ret_fast_syscall+0x0/0x30)
= =A0r9:c7c00000 r8:c0444b48 r6:bee925a0 r5:00000f38 r4:001854e0
---[ end = trace 8124d49a241e0763 ]---
INFO: task cp:5445 blocked for more than 120 seconds.
"echo 0 > = /proc/sys/kernel/hung_task_timeout_secs" disables this message.
cp= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 D c06ee75c=A0=A0=A0=A0 0=A0 5445=A0=A0 21= 73 0x00000000
Backtrace:
[<c06ee398>] (schedule+0x0/0x454) fro= m [<c06f0748>] (__down_write_nested+0xf4/0x10c)
=A0r9:c7869a60 r8:00000000 r7:c05cabd8 r6:c78699bc r5:60000013
r4:c302d8= 20
[<c06f0654>] (__down_write_nested+0x0/0x10c) from [<c06f0774= >] (__down_write+0x14/0x18)
=A0r6:c31324a0 r5:00000005 r4:c78699bc [<c06f0760>] (__down_write+0x0/0x18) from [<c06efd50>] (down_wr= ite+0x28/0x30)
[<c06efd28>] (down_write+0x0/0x30) from [<c05a21= ac>] (xfs_ilock+0x28/0xe8)
=A0r4:c7869940 r3:00000000
[<c05a218= 4>] (xfs_ilock+0x0/0xe8) from [<c05cabd8>] (xfs_file_aio_write+0x1= d4/0x8cc)
=A0r7:00000001 r6:c31324a0 r5:00000001 r4:c7869940
[<c05caa04>] (x= fs_file_aio_write+0x0/0x8cc) from [<c04eb404>] (do_sync_write+0xa0/0x= e0)
[<c04eb364>] (do_sync_write+0x0/0xe0) from [<c04ec028>] = (vfs_write+0xbc/0x178)
=A0r6:bee925a0 r5:c31324a0 r4:00000f38
[<c04ebf6c>] (vfs_write+0x0= /0x178) from [<c04ec1ac>] (sys_write+0x44/0x70)
=A0r7:00000004 r6:= 00000f38 r5:bee925a0 r4:c31324a0
[<c04ec168>] (sys_write+0x0/0x70)= from [<c04449a0>] (ret_fast_syscall+0x0/0x30)
=A0r9:c7c00000 r8:c0444b48 r6:bee925a0 r5:00000f38 r4:001854e0=A0
^C^Z[1= ] + Stopped=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ./crea= tesetup.sh
I really doubt about the stability of 2.6.35.9, it is not passing our = basic tests. Checking few more things, before deciding about the patches wh= ich got introduced between 2.6.34 ~ 2.6.35.9(around 102).
=A0
Thanks,
Amit Sahrawat
On Thu, Jan 20, 2011 at 11:37 AM, Amit Sahrawat = <amit.sah= rawat83@gmail.com> wrote:
Hi,
=A0
I will try to find out the cause for this.
Meanwhile, just a small request/suggestion - in the past this=A0type o= f testcases have helped us in finding many problems in XFS.
Can something like this be added to xfstests? This might help.

Thanks,
Amit Sahrawat
On Thu, Jan 20, 2011 at 10:47 AM, Dave Chinner <= span dir=3D"ltr"><david@fromorbit.com> wrote:
On Thu, Jan 20, 2011 at 10:34:30AM +0530, Amit Sahrawat wrote:
>= Hi,
>
> I am facing issues in XFS for a simple test case.
&= gt; *Target:* ARM
> *Kernel version:* 2.6.35.9
>
> *Test = case:*
> mkfs.xfs -f /dev/sda2
> mount -t xfs /dev/sda2 /mnt/usb/sda2
= > (Run script - trying to fragment the XFS formatted partition)
> = #!/bin/sh
> index=3D0
> while [ "$?" =3D=3D 0 ]
&g= t; do
> index=3D$((index+1))
> sync
> cp /mnt/usb/sda1/setupfile /= mnt/usb/sda2/setupfile.$index
> done
>
> Partition Size o= n which files are being created - 1GB(I need to fragment
> this first= to run other cases)
> Size of *'setupfile'* =A0- 16K
>
> There used be n= o such issues till *2.6.34*(last XFS version where we tried
> to crea= te setup). There is no reset involved this time, just simple running
>= ; the script caused this issue.

You have a known good version, a known bad version and a
repro= ducable test case. i.e. everything you need to run a git bisect
and find= the commit introduced the regression. Can you do this and
tell us what = that commit is?

Cheers,

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


--0016364ede483f7377049a41617d-- From david@fromorbit.com Thu Jan 20 00:39:25 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0K6dPOq038679 for ; Thu, 20 Jan 2011 00:39:25 -0600 X-ASG-Debug-ID: 1295505703-52b2022f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CABE22793C9 for ; Wed, 19 Jan 2011 22:41:43 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Ppw6Mz2b4k24Fdmc for ; Wed, 19 Jan 2011 22:41:43 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEAJ5mN015LN5m/2dsb2JhbACkTnS9Aw2FQwQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Jan 2011 17:11:41 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PfoDC-0001NN-5N; Thu, 20 Jan 2011 17:41:38 +1100 Date: Thu, 20 Jan 2011 17:41:37 +1100 From: Dave Chinner To: Amit Sahrawat Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS - issues with writes using sync Subject: Re: XFS - issues with writes using sync Message-ID: <20110120064137.GS16267@dastard> References: <20110120051720.GR16267@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: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295505704 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0657 1.0000 -1.6019 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.60 X-Barracuda-Spam-Status: No, SCORE=-1.60 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.52894 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, Jan 20, 2011 at 11:37:44AM +0530, Amit Sahrawat wrote: > Hi, > > I will try to find out the cause for this. > Meanwhile, just a small request/suggestion - in the past this type of > testcases have helped us in finding many problems in XFS. > Can something like this be added to xfstests? This might help. Definitely. We're always looking for more people to add tests that expose problems to xfstests. :) We try to keep individual test runtime to as little as possible - under 5 minutes for the auto group, under 15s for the quick group, but by the looks of it the test you are running doesn't take that long to run. FWIW, there are already tests that cause worst case filesystem fragmentation as part of their test setup (e.g. test 042) but the coverage of such issues could definitely be improved. Also, the way we generate fragmented filesystems - by writing files and then removing a subset - could be greatly sped up by preallocation and hole punching. There's no need to write data when we could just use unwritten extents to do the same thing... Cheers, Dave. -- Dave Chinner david@fromorbit.com From amit.sahrawat83@gmail.com Thu Jan 20 01:07:09 2011 X-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 p0K778To041889 for ; Thu, 20 Jan 2011 01:07:09 -0600 X-ASG-Debug-ID: 1295507366-2c4c03950000-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 02A121BC3E8E for ; Wed, 19 Jan 2011 23:09:27 -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 ors5fVOXuGh6PLQ3 for ; Wed, 19 Jan 2011 23:09:27 -0800 (PST) Received: by qwe5 with SMTP id 5so280143qwe.26 for ; Wed, 19 Jan 2011 23:09:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=mxKE3k8NAA9ohNDPs+nY40a+HIINFt3ct2JaJFQUHQU=; b=nOYm4mBmJ721lSixichDZ05o/2xxqemA9UtDb6X5IMW7NGzNKD9ybZOEsExAz6t9/O QfeMfV8zkxG41Jj0mnmscQO8uqvaNWE1LUd5CbLH9ahufObJfCUITyqsdSDoaPGuA7hP AamSCgl4XGK62K6kjIsxgkvvnZEIPv0ns36Eo= 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=FocKMmsFJ8IKwQLGKo2roCQvRUfPcbZMjEidmtD/+/95jIvBz8mkm+dmOQpXbu3V3d g4FUyEZpo3CrEt+z8uBe/RzPM+c0Ng/jp63bMKFqOtYW2Og3vOd9JKO2rHzmM37TKQgZ eNQlVfHJo7V41d32sU2/OM0rNNRR6/TIg7elI= MIME-Version: 1.0 Received: by 10.224.67.65 with SMTP id q1mr1626638qai.40.1295507366630; Wed, 19 Jan 2011 23:09:26 -0800 (PST) Received: by 10.220.96.65 with HTTP; Wed, 19 Jan 2011 23:09:26 -0800 (PST) In-Reply-To: <20110120064137.GS16267@dastard> References: <20110120051720.GR16267@dastard> <20110120064137.GS16267@dastard> Date: Thu, 20 Jan 2011 12:39:26 +0530 Message-ID: X-ASG-Orig-Subj: Re: XFS - issues with writes using sync Subject: Re: XFS - issues with writes using sync From: Amit Sahrawat To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0015175cf83c645603049a41d0ac X-Barracuda-Connect: mail-qw0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1295507368 X-Barracuda-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.52896 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 --0015175cf83c645603049a41d0ac Content-Type: text/plain; charset=ISO-8859-1 On Thu, Jan 20, 2011 at 12:11 PM, Dave Chinner wrote: > On Thu, Jan 20, 2011 at 11:37:44AM +0530, Amit Sahrawat wrote: > > Hi, > > > > I will try to find out the cause for this. > > Meanwhile, just a small request/suggestion - in the past this type of > > testcases have helped us in finding many problems in XFS. > > Can something like this be added to xfstests? This might help. > > Definitely. We're always looking for more people to add tests that > expose problems to xfstests. :) We try to keep individual test > runtime to as little as possible - under 5 minutes for the auto > group, under 15s for the quick group, but by the looks of it the > test you are running doesn't take that long to run. > > >> Yes, the test case we are using is not taking much time this time to > cause issue - around 3-4 minutes. > > FWIW, there are already tests that cause worst case filesystem > fragmentation as part of their test setup (e.g. test 042) but the > coverage of such issues could definitely be improved. Also, the way > we generate fragmented filesystems - by writing files and then > removing a subset - could be greatly sped up by preallocation and > hole punching. There's no need to write data when we could just use > unwritten extents to do the same thing... > > > >> We basically fragment by doing following steps: > Full the disk with same size files (in this case it is 16k) Then, randomly remove files from the disk. Doing so, allows us to create files as per our requirement - complete control when we need - single extent, multiple extent files, Btree format file, single leaf file, multiple leaf file - It allows us ease to use XFS. I hope you are getting what I am trying to say. But, in this case - it starts causing issue at the very first stage - just copying 16k file to make disk full. Thanks, Amit Sahrawat --0015175cf83c645603049a41d0ac Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

On Thu, Jan 20, 2011 at 12:11 PM, Dave Chinner <= span dir=3D"ltr"><david@fromorbit= .com> wrote:
On Thu, Jan 20, 2011 at 11:37:44AM +0530, Amit Sahrawat w= rote:
> Hi,
>
> I will try to find out the cause for this.
> M= eanwhile, just a small request/suggestion - in the past this type of
>= ; testcases have helped us in finding many problems in XFS.
> Can som= ething like this be added to xfstests? This might help.

Definitely. =A0We're always looking for more people to add te= sts that
expose problems to xfstests. :) We try to keep individual test<= br>runtime to as little as possible - under 5 minutes for the auto
group= , under 15s for the quick group, but by the looks of it the
test you are running doesn't take that long to run.
=A0
>> Yes, the test case we a= re using is not taking much time this time to cause issue - around 3-4 minu= tes.
=A0
FWIW, there are already tests th= at cause worst case filesystem
fragmentation as part of their test setup= (e.g. test 042) but the
coverage of such issues could definitely be improved. Also, the way
we g= enerate fragmented filesystems - by writing files and then
removing a su= bset - could be greatly sped up by preallocation and
hole punching. Ther= e's no need to write data when we could just use
unwritten extents to do the same thing...
=A0
=A0
>> We basically fragment by doing following steps:<= /div>
=A0Full the disk with same size files (in this case it is 16k)
Then, randomly remove files from the disk.
Doing so,=A0allows us to create files as per our requirement - complet= e control when we need - single extent, multiple extent files, Btree format= file, single leaf file, multiple leaf file - It allows us ease to use XFS.=
I hope you are getting what I am trying to say.
=A0
But, in this case - it starts causing issue at the very first stage - = just copying 16k file to make disk full.
=A0
Thanks,
Amit Sahrawat
=A0
--0015175cf83c645603049a41d0ac-- From petre.rodan@simplex.ro Thu Jan 20 04:01:34 2011 X-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 (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p0KA1X0g064135 for ; Thu, 20 Jan 2011 04:01:34 -0600 X-ASG-Debug-ID: 1295517830-75f802750000-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 D3089279C07 for ; Thu, 20 Jan 2011 02:03:50 -0800 (PST) Received: from passage.avira.com (passage.avira.com [89.238.222.20]) by cuda.sgi.com with ESMTP id ornNNwNxjbzSOjDx for ; Thu, 20 Jan 2011 02:03:50 -0800 (PST) Received: by passage.avira.com (Postfix/AVIRA, from userid 26) id 3B31A12493A; Thu, 20 Jan 2011 12:03:49 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by passage.avira.com (Postfix/AVIRA) with ESMTP id B1835124939 for ; Thu, 20 Jan 2011 12:03:43 +0200 (EET) Received: from passage.avira.com (localhost [127.0.0.1]) by localhost (AvMailGate-2.1.3-2) id 16941-y5elQz; Thu, 20 Jan 2011 12:03:43 +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 76BB2124939 for ; Thu, 20 Jan 2011 12:03:43 +0200 (EET) Received: (qmail 5423 invoked from network); 20 Jan 2011 10:03:42 -0000 Received: from unknown (HELO peter.simplex.ro) (prodan@10.7.0.16) by naliboat.bu.avira.com with ESMTPA; 20 Jan 2011 10:03:42 -0000 Date: Thu, 20 Jan 2011 12:01:43 +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: <20110120100143.GA2007@peter.simplex.ro> References: <20101223165532.GA23813@peter.simplex.ro> <20101227021904.GA24828@dastard> <20101227061629.GA2275@pandora.simplex.ro> <20101227140750.GB24828@dastard> <20101227171939.GA7759@pandora.simplex.ro> <20101231001323.GD15179@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="WhfpMioaduB5tiZL" Content-Disposition: inline In-Reply-To: <20101231001323.GD15179@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.148; VDF: 7.11.1.183; host: passage.avira.com) X-Barracuda-Connect: passage.avira.com[89.238.222.20] X-Barracuda-Start-Time: 1295517831 X-Barracuda-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.52908 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 --WhfpMioaduB5tiZL Content-Type: multipart/mixed; boundary="gBBFr7Ir9EOA20Yy" Content-Disposition: inline --gBBFr7Ir9EOA20Yy Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable hello Dave, On Fri, Dec 31, 2010 at 11:13:23AM +1100, Dave Chinner wrote: > On Mon, Dec 27, 2010 at 07:19:39PM +0200, Petre Rodan wrote: > >=20 > > Hello Dave, > >=20 > > 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. > >=20 > > attached. > >=20 > > you can disregard all the lvm partitions ('dev 254:.*') since they are = on a different drive, probably only 8:17 is of interest. >=20 > Ok, I can see the problem. The original patch I tested: >=20 > http://oss.sgi.com/archives/xfs/2010-08/msg00026.html >=20 > 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. >=20 > 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: >=20 > http://oss.sgi.com/archives/xfs/2010-08/msg00197.html >=20 > 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. >=20 > I'll cook up a patch to make the log covering behave like the > original patch I sent... I presume that the new fix should be provided by "xfs: ensure log covering = transactions are synchronous", so I tested 2.6.37 patched with it and then = 2.6.38_rc1 that has it included. instead of having xfssyncd write to the drive every 36s, we now have this: 8,32 0 162 828.393976164 1413 A WS 977599761 + 2 <- (8,33) 97= 7597713 8,32 0 163 828.393977820 1413 Q WS 977599761 + 2 [xfssyncd/sd= c1] 8,32 0 167 846.401286530 1407 A W 2048 + 1 <- (8,33) 0 8,32 0 168 846.401288007 1407 Q W 2048 + 1 [xfsbufd/sdc1] 8,32 0 174 864.412155132 1413 A WS 977599763 + 2 <- (8,33) 97= 7597715 8,32 0 175 864.412156637 1413 Q WS 977599763 + 2 [xfssyncd/sd= c1] 8,32 1 240 882.467053566 1407 A W 2048 + 1 <- (8,33) 0 8,32 1 241 882.467055152 1407 Q W 2048 + 1 [xfsbufd/sdc1] 8,32 0 179 900.426084634 1413 A WS 977599765 + 2 <- (8,33) 97= 7597717 8,32 0 180 900.426086076 1413 Q WS 977599765 + 2 [xfssyncd/sd= c1] 8,32 0 185 918.457066312 1407 A W 2048 + 1 <- (8,33) 0 8,32 0 186 918.457068003 1407 Q W 2048 + 1 [xfsbufd/sdc1] 8,32 1 252 936.448120095 1413 A WS 977599767 + 2 <- (8,33) 97= 7597719 8,32 1 253 936.448121740 1413 Q WS 977599767 + 2 [xfssyncd/sd= c1] 8,32 0 192 954.447207652 1407 A W 2048 + 1 <- (8,33) 0 8,32 0 193 954.447209114 1407 Q W 2048 + 1 [xfsbufd/sdc1] 8,32 0 199 972.458423873 1413 A WS 977599769 + 2 <- (8,33) 97= 7597721 8,32 0 200 972.458425189 1413 Q WS 977599769 + 2 [xfssyncd/sd= c1] 8,32 1 266 990.457562449 1407 A W 2048 + 1 <- (8,33) 0 8,32 1 267 990.457563909 1407 Q W 2048 + 1 [xfsbufd/sdc1] 8,32 0 204 1008.476781955 1413 A WS 977599771 + 2 <- (8,33) 97= 7597723 8,32 0 205 1008.476783410 1413 Q WS 977599771 + 2 [xfssyncd/sd= c1] 8,32 1 278 1026.531988963 1407 A W 2048 + 1 <- (8,33) 0 8,32 1 279 1026.531990718 1407 Q W 2048 + 1 [xfsbufd/sdc1] 8,32 0 209 1044.491342417 1413 A WS 977599773 + 2 <- (8,33) 97= 7597725 8,32 0 210 1044.491344042 1413 Q WS 977599773 + 2 [xfssyncd/sd= c1] 8,32 0 214 1062.502603664 1407 A W 2048 + 1 <- (8,33) 0 8,32 0 215 1062.502605117 1407 Q W 2048 + 1 [xfsbufd/sdc1] 8,32 0 216 1062.502611005 1407 G W 2048 + 1 [xfsbufd/sdc1] in other words xfsyncd and xfsbufd now alternate at 18s intervals keeping t= he drive busy with nothing constructive hours after the last write to the d= rive. to add to the misfortune, 'mount -o remount ' is no longer able to bring th= e drive to a quiet state since 2.6.37, so now the only way to achieve an id= le drive is to fully umount and then remount the partition. just for the record, this is a different drive then at the beginning of the= thread, and it has these parameters: meta-data=3D/dev/sdc1 isize=3D256 agcount=3D4, agsize=3D610= 47552 blks =3D sectsz=3D512 attr=3D2 data =3D bsize=3D4096 blocks=3D244190208, imaxp= ct=3D25 =3D sunit=3D0 swidth=3D0 blks naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 log =3Dinternal bsize=3D4096 blocks=3D119233, version= =3D2 =3D sectsz=3D512 sunit=3D0 blks, lazy-coun= t=3D0 realtime =3Dnone extsz=3D4096 blocks=3D0, rtextents=3D0 attached you'll find the trace (with accesses to other drives filtered out). cheers, peter >=20 > Cheers, >=20 > Dave. > --=20 > Dave Chinner > david@fromorbit.com --=20 petre rodan Technical Manager Simplex SRL, Bucharest --gBBFr7Ir9EOA20Yy Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=trace Content-Transfer-Encoding: quoted-printable # tracer: nop # # TASK-PID CPU# TIMESTAMP FUNCTION # | | | | | xfsbufd/sdc1-1407 [000] 3328.516937: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3328.516942: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3329.715360: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3329.715364: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3330.913851: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3330.913856: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3332.112309: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3332.112314: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3333.310767: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3333.310771: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3334.509225: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3334.509229: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3335.707682: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3335.707686: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3336.906140: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3336.906145: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3338.104598: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3338.104602: xfs_buf_delwri_split: dev 8:33 b= no 0x0 len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAG= ES caller xfsbufd xfsbufd/sdc1-1407 [000] 3338.104605: xfs_buf_iorequest: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES = caller xfs_bdstrat_cb xfsbufd/sdc1-1407 [000] 3338.104606: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES calle= r xfs_buf_iorequest xfsbufd/sdc1-1407 [000] 3338.104628: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 4 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES calle= r xfs_buf_iorequest -0 [001] 3338.105096: xfs_buf_ioerror: dev 8:33 bno 0x= 0 len 0x200 hold 3 pincount 0 lock 0 error 0 flags WRITE|MAPPED|ASYNC|DONE|= PAGES caller xfs_buf_bio_end_io -0 [001] 3338.105100: xfs_buf_iodone: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES cal= ler _xfs_buf_ioend kworker/1:0-2942 [001] 3338.105137: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_iodone kworker/1:0-2942 [001] 3338.105139: xfs_buf_iodone: dev 8:33 bno 0x0= len 0x200 hold 2 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xf= s_buf_iodone_callbacks kworker/1:0-2942 [001] 3338.105141: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 2 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xf= s_buf_iodone_work kworker/1:0-2942 [001] 3338.105141: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 2 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_iodone_work xfssyncd/sdc1-1413 [000] 3356.093456: xfs_log_reserve: dev 8:33 type D= UMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC_INI= TED reserveq empty writeq empty grant_reserve_cycle 2 grant_reserve_bytes 4= 28523008 grant_write_cycle 2 grant_write_bytes 428523008 curr_cycle 2 curr_= block 836959 tail_cycle 2 tail_block 810683 xfssyncd/sdc1-1413 [000] 3356.093462: xfs_log_grant_enter: dev 8:33 ty= pe DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC= _INITED reserveq empty writeq empty grant_reserve_cycle 2 grant_reserve_byt= es 428523008 grant_write_cycle 2 grant_write_bytes 428523008 curr_cycle 2 c= urr_block 836959 tail_cycle 2 tail_block 810683 xfssyncd/sdc1-1413 [000] 3356.093463: xfs_log_grant_exit: dev 8:33 typ= e DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC_= INITED reserveq empty writeq empty grant_reserve_cycle 2 grant_reserve_byte= s 428525748 grant_write_cycle 2 grant_write_bytes 428525748 curr_cycle 2 cu= rr_block 836959 tail_cycle 2 tail_block 810683 xfssyncd/sdc1-1413 [000] 3356.093465: xfs_buf_lock: dev 8:33 bno 0x0 l= en 0x200 hold 1 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= getsb xfssyncd/sdc1-1413 [000] 3356.093467: xfs_buf_lock_done: dev 8:33 bno = 0x0 len 0x200 hold 1 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller= xfs_getsb xfssyncd/sdc1-1413 [000] 3356.093468: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 1 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= getsb xfssyncd/sdc1-1413 [000] 3356.093470: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 2 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_item_init xfssyncd/sdc1-1413 [000] 3356.093472: xfs_trans_getsb: dev 8:33 bno 0x= 0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|PAGES recur 0= refcount 1 bliflags lidesc 0xffff8800dd23f8f0 liflags=20 xfssyncd/sdc1-1413 [000] 3356.093474: xfs_trans_log_buf: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGE= S recur 0 refcount 1 bliflags lidesc 0xffff8800dd23f8f0 liflags=20 xfssyncd/sdc1-1413 [000] 3356.093477: xfs_buf_item_size: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGE= S recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff8800dd23f8f0 lifla= gs=20 xfssyncd/sdc1-1413 [000] 3356.093479: xfs_buf_item_format: dev 8:33 bn= o 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PA= GES recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff8800dd23f8f0 lif= lags=20 xfssyncd/sdc1-1413 [000] 3356.093480: xfs_buf_item_pin: dev 8:33 bno 0= x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGES= recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff8800dd23f8f0 liflag= s=20 xfssyncd/sdc1-1413 [000] 3356.093487: xfs_log_done_nonperm: dev 8:33 t= ype DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2000 t_unit_res 2740 t_flags reserv= eq empty writeq empty grant_reserve_cycle 2 grant_reserve_bytes 428525748 g= rant_write_cycle 2 grant_write_bytes 428525748 curr_cycle 2 curr_block 8369= 59 tail_cycle 2 tail_block 810683 xfssyncd/sdc1-1413 [000] 3356.093488: xfs_log_ungrant_enter: dev 8:33 = type DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reser= veq empty writeq empty grant_reserve_cycle 2 grant_reserve_bytes 428525748 = grant_write_cycle 2 grant_write_bytes 428525748 curr_cycle 2 curr_block 836= 959 tail_cycle 2 tail_block 810683 xfssyncd/sdc1-1413 [000] 3356.093489: xfs_log_ungrant_sub: dev 8:33 ty= pe DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reserve= q empty writeq empty grant_reserve_cycle 2 grant_reserve_bytes 428525748 gr= ant_write_cycle 2 grant_write_bytes 428525748 curr_cycle 2 curr_block 83695= 9 tail_cycle 2 tail_block 810683 xfssyncd/sdc1-1413 [000] 3356.093489: xfs_log_ungrant_exit: dev 8:33 t= ype DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reserv= eq empty writeq empty grant_reserve_cycle 2 grant_reserve_bytes 428523748 g= rant_write_cycle 2 grant_write_bytes 428523748 curr_cycle 2 curr_block 8369= 59 tail_cycle 2 tail_block 810683 xfssyncd/sdc1-1413 [000] 3356.093492: xfs_trans_commit_lsn: dev 8:33 t= rans 0xffff8800dd2b7ea0 commit_lsn 0x2000cc55f xfssyncd/sdc1-1413 [000] 3356.093495: xfs_buf_item_unlock: dev 8:33 bn= o 0x0 len 0x200 hold 3 pincount 1 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PA= GES recur 0 refcount 2 bliflags |DIRTY lidesc 0x (null) liflags=20 xfssyncd/sdc1-1413 [000] 3356.093496: xfs_buf_delwri_queue: dev 8:33 b= no 0x0 len 0x200 hold 4 pincount 1 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PA= GES caller xfs_buf_unlock xfssyncd/sdc1-1413 [000] 3356.093501: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 4 pincount 1 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_item_unlock xfssyncd/sdc1-1413 [000] 3356.093502: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 4 pincount 1 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DELW= RI_Q caller xfs_buf_item_unlock xfssyncd/sdc1-1413 [000] 3356.093506: xfs_buf_iorequest: dev 8:33 bno = 0x3a44f57f len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DON= E|ORDERED|PAGES|RUN_QUEUES|0x2000 caller xlog_bdstrat xfssyncd/sdc1-1413 [000] 3356.093507: xfs_buf_hold: dev 8:33 bno 0x3a4= 4f57f len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|ORD= ERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_iorequest xfssyncd/sdc1-1413 [000] 3356.093541: xfs_buf_rele: dev 8:33 bno 0x3a4= 4f57f len 0x8000 hold 2 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|ORD= ERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_iorequest -0 [001] 3356.113311: xfs_buf_ioerror: dev 8:33 bno 0x= 3a44f57f len 0x8000 hold 1 pincount 0 lock 0 error 0 flags WRITE|MAPPED|ASY= NC|DONE|ORDERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_bio_end_io -0 [001] 3356.113316: xfs_buf_iodone: dev 8:33 bno 0x3= a44f57f len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|O= RDERED|PAGES|RUN_QUEUES|0x2000 caller _xfs_buf_ioend kworker/1:0-2942 [001] 3356.113359: xfs_buf_item_committed: dev 8:33= bno 0x0 len 0x200 hold 3 pincount 1 lock 1 flags |MAPPED|ASYNC|DONE|DELWRI= |PAGES|DELWRI_Q recur 0 refcount 1 bliflags |DIRTY lidesc 0x (null= ) liflags=20 kworker/1:0-2942 [001] 3356.113362: xfs_buf_item_unpin: dev 8:33 bno= 0x0 len 0x200 hold 3 pincount 1 lock 1 flags |MAPPED|ASYNC|DONE|DELWRI|PAG= ES|DELWRI_Q recur 0 refcount 1 bliflags |DIRTY lidesc 0x (null) li= flags IN_AIL xfsbufd/sdc1-1407 [001] 3357.291895: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3357.291899: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3358.490410: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3358.490415: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3359.688802: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3359.688806: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3360.887269: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3360.887273: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3362.085688: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3362.085692: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3363.284175: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3363.284180: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3364.482639: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3364.482644: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3365.681096: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3365.681100: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3366.879566: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3366.879571: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3368.078025: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3368.078030: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3369.276482: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3369.276486: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3370.474939: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3370.474944: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3371.673391: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3371.673395: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3372.871848: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3372.871853: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3374.070306: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3374.070310: xfs_buf_delwri_split: dev 8:33 b= no 0x0 len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAG= ES caller xfsbufd xfsbufd/sdc1-1407 [000] 3374.070312: xfs_buf_iorequest: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES = caller xfs_bdstrat_cb xfsbufd/sdc1-1407 [000] 3374.070314: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES calle= r xfs_buf_iorequest xfsbufd/sdc1-1407 [000] 3374.070331: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 4 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES calle= r xfs_buf_iorequest -0 [001] 3374.070797: xfs_buf_ioerror: dev 8:33 bno 0x= 0 len 0x200 hold 3 pincount 0 lock 0 error 0 flags WRITE|MAPPED|ASYNC|DONE|= PAGES caller xfs_buf_bio_end_io -0 [001] 3374.070801: xfs_buf_iodone: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES cal= ler _xfs_buf_ioend kworker/1:0-2942 [001] 3374.070839: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_iodone kworker/1:0-2942 [001] 3374.070841: xfs_buf_iodone: dev 8:33 bno 0x0= len 0x200 hold 2 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xf= s_buf_iodone_callbacks kworker/1:0-2942 [001] 3374.070843: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 2 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xf= s_buf_iodone_work kworker/1:0-2942 [001] 3374.070843: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 2 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_iodone_work xfssyncd/sdc1-1413 [000] 3392.067122: xfs_log_reserve: dev 8:33 type D= UMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC_INI= TED reserveq empty writeq empty grant_reserve_cycle 2 grant_reserve_bytes 4= 28524032 grant_write_cycle 2 grant_write_bytes 428524032 curr_cycle 2 curr_= block 836961 tail_cycle 2 tail_block 810683 xfssyncd/sdc1-1413 [000] 3392.067127: xfs_log_grant_enter: dev 8:33 ty= pe DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC= _INITED reserveq empty writeq empty grant_reserve_cycle 2 grant_reserve_byt= es 428524032 grant_write_cycle 2 grant_write_bytes 428524032 curr_cycle 2 c= urr_block 836961 tail_cycle 2 tail_block 810683 xfssyncd/sdc1-1413 [000] 3392.067129: xfs_log_grant_exit: dev 8:33 typ= e DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC_= INITED reserveq empty writeq empty grant_reserve_cycle 2 grant_reserve_byte= s 428526772 grant_write_cycle 2 grant_write_bytes 428526772 curr_cycle 2 cu= rr_block 836961 tail_cycle 2 tail_block 810683 xfssyncd/sdc1-1413 [000] 3392.067131: xfs_buf_lock: dev 8:33 bno 0x0 l= en 0x200 hold 1 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= getsb xfssyncd/sdc1-1413 [000] 3392.067133: xfs_buf_lock_done: dev 8:33 bno = 0x0 len 0x200 hold 1 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller= xfs_getsb xfssyncd/sdc1-1413 [000] 3392.067134: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 1 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= getsb xfssyncd/sdc1-1413 [000] 3392.067138: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 2 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_item_init xfssyncd/sdc1-1413 [000] 3392.067140: xfs_trans_getsb: dev 8:33 bno 0x= 0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|PAGES recur 0= refcount 1 bliflags lidesc 0xffff8800dca401f0 liflags=20 xfssyncd/sdc1-1413 [000] 3392.067142: xfs_trans_log_buf: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGE= S recur 0 refcount 1 bliflags lidesc 0xffff8800dca401f0 liflags=20 xfssyncd/sdc1-1413 [000] 3392.067145: xfs_buf_item_size: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGE= S recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff8800dca401f0 lifla= gs=20 xfssyncd/sdc1-1413 [000] 3392.067147: xfs_buf_item_format: dev 8:33 bn= o 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PA= GES recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff8800dca401f0 lif= lags=20 xfssyncd/sdc1-1413 [000] 3392.067148: xfs_buf_item_pin: dev 8:33 bno 0= x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGES= recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff8800dca401f0 liflag= s=20 xfssyncd/sdc1-1413 [000] 3392.067154: xfs_log_done_nonperm: dev 8:33 t= ype DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2000 t_unit_res 2740 t_flags reserv= eq empty writeq empty grant_reserve_cycle 2 grant_reserve_bytes 428526772 g= rant_write_cycle 2 grant_write_bytes 428526772 curr_cycle 2 curr_block 8369= 61 tail_cycle 2 tail_block 810683 xfssyncd/sdc1-1413 [000] 3392.067155: xfs_log_ungrant_enter: dev 8:33 = type DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reser= veq empty writeq empty grant_reserve_cycle 2 grant_reserve_bytes 428526772 = grant_write_cycle 2 grant_write_bytes 428526772 curr_cycle 2 curr_block 836= 961 tail_cycle 2 tail_block 810683 xfssyncd/sdc1-1413 [000] 3392.067156: xfs_log_ungrant_sub: dev 8:33 ty= pe DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reserve= q empty writeq empty grant_reserve_cycle 2 grant_reserve_bytes 428526772 gr= ant_write_cycle 2 grant_write_bytes 428526772 curr_cycle 2 curr_block 83696= 1 tail_cycle 2 tail_block 810683 xfssyncd/sdc1-1413 [000] 3392.067156: xfs_log_ungrant_exit: dev 8:33 t= ype DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reserv= eq empty writeq empty grant_reserve_cycle 2 grant_reserve_bytes 428524772 g= rant_write_cycle 2 grant_write_bytes 428524772 curr_cycle 2 curr_block 8369= 61 tail_cycle 2 tail_block 810683 xfssyncd/sdc1-1413 [000] 3392.067159: xfs_trans_commit_lsn: dev 8:33 t= rans 0xffff8800dca3a4c8 commit_lsn 0x2000cc561 xfssyncd/sdc1-1413 [000] 3392.067161: xfs_buf_item_unlock: dev 8:33 bn= o 0x0 len 0x200 hold 3 pincount 1 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PA= GES recur 0 refcount 2 bliflags |DIRTY lidesc 0x (null) liflags=20 xfssyncd/sdc1-1413 [000] 3392.067163: xfs_buf_delwri_queue: dev 8:33 b= no 0x0 len 0x200 hold 4 pincount 1 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PA= GES caller xfs_buf_unlock xfssyncd/sdc1-1413 [000] 3392.067168: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 4 pincount 1 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_item_unlock xfssyncd/sdc1-1413 [000] 3392.067169: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 4 pincount 1 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DELW= RI_Q caller xfs_buf_item_unlock xfssyncd/sdc1-1413 [000] 3392.067173: xfs_buf_iorequest: dev 8:33 bno = 0x3a44f581 len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DON= E|ORDERED|PAGES|RUN_QUEUES|0x2000 caller xlog_bdstrat xfssyncd/sdc1-1413 [000] 3392.067174: xfs_buf_hold: dev 8:33 bno 0x3a4= 4f581 len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|ORD= ERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_iorequest xfssyncd/sdc1-1413 [000] 3392.067211: xfs_buf_rele: dev 8:33 bno 0x3a4= 4f581 len 0x8000 hold 2 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|ORD= ERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_iorequest -0 [001] 3392.084946: xfs_buf_ioerror: dev 8:33 bno 0x= 3a44f581 len 0x8000 hold 1 pincount 0 lock 0 error 0 flags WRITE|MAPPED|ASY= NC|DONE|ORDERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_bio_end_io -0 [001] 3392.084951: xfs_buf_iodone: dev 8:33 bno 0x3= a44f581 len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|O= RDERED|PAGES|RUN_QUEUES|0x2000 caller _xfs_buf_ioend kworker/1:0-2942 [001] 3392.084986: xfs_buf_item_committed: dev 8:33= bno 0x0 len 0x200 hold 3 pincount 1 lock 1 flags |MAPPED|ASYNC|DONE|DELWRI= |PAGES|DELWRI_Q recur 0 refcount 1 bliflags |DIRTY lidesc 0x (null= ) liflags=20 kworker/1:0-2942 [001] 3392.084989: xfs_buf_item_unpin: dev 8:33 bno= 0x0 len 0x200 hold 3 pincount 1 lock 1 flags |MAPPED|ASYNC|DONE|DELWRI|PAG= ES|DELWRI_Q recur 0 refcount 1 bliflags |DIRTY lidesc 0x (null) li= flags IN_AIL xfsbufd/sdc1-1407 [001] 3393.269554: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3393.269558: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3394.472001: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3394.472006: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3395.674456: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3395.674460: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3396.872917: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 3396.872921: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3398.071397: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3398.071401: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3399.269841: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3399.269845: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3400.468299: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3400.468304: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3401.666718: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3401.666722: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3402.865235: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3402.865239: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3404.063706: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3404.063710: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3405.262163: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3405.262167: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3406.460622: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3406.460626: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3407.659078: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3407.659083: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3408.857536: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3408.857540: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3410.055988: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 3410.055992: xfs_buf_delwri_split: dev 8:33 b= no 0x0 len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAG= ES caller xfsbufd xfsbufd/sdc1-1407 [000] 3410.055995: xfs_buf_iorequest: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES = caller xfs_bdstrat_cb xfsbufd/sdc1-1407 [000] 3410.055996: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES calle= r xfs_buf_iorequest xfsbufd/sdc1-1407 [000] 3410.056014: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 4 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES calle= r xfs_buf_iorequest -0 [001] 3410.056482: xfs_buf_ioerror: dev 8:33 bno 0x= 0 len 0x200 hold 3 pincount 0 lock 0 error 0 flags WRITE|MAPPED|ASYNC|DONE|= PAGES caller xfs_buf_bio_end_io -0 [001] 3410.056486: xfs_buf_iodone: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES cal= ler _xfs_buf_ioend kworker/1:0-2942 [001] 3410.056524: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_iodone kworker/1:0-2942 [001] 3410.056526: xfs_buf_iodone: dev 8:33 bno 0x0= len 0x200 hold 2 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xf= s_buf_iodone_callbacks kworker/1:0-2942 [001] 3410.056527: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 2 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xf= s_buf_iodone_work kworker/1:0-2942 [001] 3410.056528: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 2 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_iodone_work --gBBFr7Ir9EOA20Yy-- --WhfpMioaduB5tiZL Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.16 (GNU/Linux) iEYEABECAAYFAk04CAYACgkQixMPpwVd7zFwSQCcDRp4TfrpMFdolXRT5luOc28J kZEAnjagr8yaRMG1cH7qEPQWrdf+6Qpq =7DpV -----END PGP SIGNATURE----- --WhfpMioaduB5tiZL-- From david@fromorbit.com Thu Jan 20 04:47:44 2011 X-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 p0KAliDG070096 for ; Thu, 20 Jan 2011 04:47:44 -0600 X-ASG-Debug-ID: 1295520602-0a4102410000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 85C6719F3826 for ; Thu, 20 Jan 2011 02:50:02 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ZIHzHbt0Rl7Tfcpv for ; Thu, 20 Jan 2011 02:50:02 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEACaiN015LN5m/2dsb2JhbACkUHS+Bw2FQwQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Jan 2011 21:20:00 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pfs5W-0001k5-TO; Thu, 20 Jan 2011 21:49:58 +1100 Date: Thu, 20 Jan 2011 21:49:58 +1100 From: Dave Chinner To: Amit Sahrawat Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS - issues with writes using sync Subject: Re: XFS - issues with writes using sync Message-ID: <20110120104958.GT16267@dastard> References: <20110120051720.GR16267@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: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295520603 X-Barracuda-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.52912 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, Jan 20, 2011 at 12:08:21PM +0530, Amit Sahrawat wrote: > Hi, > I tried with the same test case - just removed 'sync' command from the > script(please check script below) to check the behaviour. .... > I really doubt about the stability of 2.6.35.9, it is not passing our basic > tests. Checking few more things, before deciding about the patches which got > introduced between 2.6.34 ~ 2.6.35.9(around 102). 2.6.35 is perfectly fine on x86, so I suspect that it is something ARM specific. Most likely it is related to the VIVT platform support changes, but you really need to bisect so we know exactly waht change has broken such basic functionality on your platform. Note that the bug may not even be in XFS, so you really need to do a full bisect, not just of the changes in xfs in that time... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 20 05:03:50 2011 X-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 p0KB3o3F072723 for ; Thu, 20 Jan 2011 05:03:50 -0600 X-ASG-Debug-ID: 1295521568-109e02200000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5AE091EA3B89 for ; Thu, 20 Jan 2011 03:06:08 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 7o0JwwJcBJ0OBZ0f for ; Thu, 20 Jan 2011 03:06:08 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEAOalN015LN5m/2dsb2JhbACkUHS+BA2FQwQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Jan 2011 21:36:06 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PfsL7-0001lw-F8; Thu, 20 Jan 2011 22:06:05 +1100 Date: Thu, 20 Jan 2011 22:06:05 +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: <20110120110605.GU16267@dastard> References: <20101223165532.GA23813@peter.simplex.ro> <20101227021904.GA24828@dastard> <20101227061629.GA2275@pandora.simplex.ro> <20101227140750.GB24828@dastard> <20101227171939.GA7759@pandora.simplex.ro> <20101231001323.GD15179@dastard> <20110120100143.GA2007@peter.simplex.ro> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110120100143.GA2007@peter.simplex.ro> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295521569 X-Barracuda-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.52912 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, Jan 20, 2011 at 12:01:43PM +0200, Petre Rodan wrote: > On Fri, Dec 31, 2010 at 11:13:23AM +1100, Dave Chinner wrote: > > 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... > > I presume that the new fix should be provided by "xfs: ensure log > covering transactions are synchronous", so I tested 2.6.37 patched > with it and then 2.6.38_rc1 that has it included.. > > instead of having xfssyncd write to the drive every 36s, we now have this: .... > in other words xfsyncd and xfsbufd now alternate at 18s intervals > keeping the drive busy with nothing constructive hours after the > last write to the drive. > > to add to the misfortune, 'mount -o remount ' is no longer able to > bring the drive to a quiet state since 2.6.37, so now the only way > to achieve an idle drive is to fully umount and then remount the > partition. > > just for the record, this is a different drive then at the > beginning of the thread, and it has these parameters: > > meta-data=/dev/sdc1 isize=256 agcount=4, agsize=61047552 blks > = sectsz=512 attr=2 > data = bsize=4096 blocks=244190208, imaxpct=25 > = sunit=0 swidth=0 blks > naming =version 2 bsize=4096 ascii-ci=0 > log =internal bsize=4096 blocks=119233, version=2 > = sectsz=512 sunit=0 blks, lazy-count=0 ^^^^^^^^^^^^ > realtime =none extsz=4096 blocks=0, rtextents=0 > > attached you'll find the trace (with accesses to other drives filtered out). It's something to do with lazy-count=0. I'm look into it when I get the chance - I almost never test w/ lazy-count=0 because =1 is the default value. I'd recommend that you convert the fs to lazy-count=1 when you get a chance, anyway, because of the fact it reduces the latency of transactions significantly... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+eee7c84253493d5f2690+2706+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 20 05:13:56 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0KBDtCR073090 for ; Thu, 20 Jan 2011 05:13:55 -0600 X-ASG-Debug-ID: 1295522175-0630029d0000-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 51ACA27A29C; Thu, 20 Jan 2011 03:16:15 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 2c1IRYgDIBAsTEXy; Thu, 20 Jan 2011 03: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 1PfsUu-0005Lt-G1; Thu, 20 Jan 2011 11:16:12 +0000 Date: Thu, 20 Jan 2011 06:16:12 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110120111612.GA14571@infradead.org> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> <20110114235549.GI16267@dastard> <20110118204752.GB28791@infradead.org> <20110118231831.GZ28803@dastard> <20110119120321.GC12941@infradead.org> <20110119133147.GN16267@dastard> <20110119135548.GA11502@infradead.org> <20110120013346.GO16267@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110120013346.GO16267@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: 1295522175 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, Jan 20, 2011 at 12:33:46PM +1100, Dave Chinner wrote: > It's case b) that I'm mainly worried about, esp. w.r.t the 64k page > size on ia64/ppc. If we only track a single dirty bit in the page, > then every sub-page, non-appending write to an uncached region of a > file becomes a RMW cycle to initialise the areas around the write > correctly. The question is whether we care about this enough given > that we return at least PAGE_SIZE in stat() to tell applications the > optimal IO size to avoid RMW cycles. Note that this generally is only true for the first write into the region - after that we'll have the rest read into the cache. But we also have the same issue for appending writes if they aren't page aligned. > And if we only do IO on whole pages (i.e regardless of block size) > .writepage suddenly becomes a lot simpler, as well as being trivial > to implement our own .readpage/.readpages.... I don't think it simplifies writepage a lot. All the buffer head handling goes away, but we'll still need to do xfs_bmapi calls at block size granularity. Why would you want to replaced the readpage/readpages code? The generic mpage helpers for it do just fine. From amit.sahrawat83@gmail.com Thu Jan 20 05:31:54 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_47,J_CHICKENPOX_66,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 p0KBVsPH075118 for ; Thu, 20 Jan 2011 05:31:54 -0600 X-ASG-Debug-ID: 1295523252-0a4503080000-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 7010E1EA3D8C for ; Thu, 20 Jan 2011 03:34:13 -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 viSR54mf6O69U3vR for ; Thu, 20 Jan 2011 03:34:13 -0800 (PST) Received: by qyj19 with SMTP id 19so1873807qyj.5 for ; Thu, 20 Jan 2011 03:34:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=XJIPGSDDdUavdE/ZlsD3OSd7aoGLT6ch28peiLC1/rM=; b=V11UlyzrDiQzb7DLOHpz1UAY+WN9HZ/s4pcm4AgbiXLzUPMLefQ2zgviEzN1X8DEPv ROz0Rssa3vDOPwWZAOvWJNf+tco/rUcZdREPePeolz6WGfZqJ08zTNSosiSW8Q3BOFD8 HOM6yEJVFk47OnrjOqxp/qsi1TbFGrbBc2hZ0= 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=drcY00DEiQOz+B78QbfHh86+bIf3AZkCgUavWlv7v4Soj3O7E1+slyPY1VOmRjjNYC pAlxI4JpLYH2AwGE3J9msvZ0ytKcXLLdQySlaMQ0QClSctetSijLZbVkH7pS0UZmE0+s PQDsKWiW7Ujsb0dNwFA1LNlAkKjl1L5AlYPH8= MIME-Version: 1.0 Received: by 10.224.67.65 with SMTP id q1mr1866129qai.40.1295523252708; Thu, 20 Jan 2011 03:34:12 -0800 (PST) Received: by 10.220.96.65 with HTTP; Thu, 20 Jan 2011 03:34:12 -0800 (PST) In-Reply-To: <20110120104958.GT16267@dastard> References: <20110120051720.GR16267@dastard> <20110120104958.GT16267@dastard> Date: Thu, 20 Jan 2011 17:04:12 +0530 Message-ID: X-ASG-Orig-Subj: Re: XFS - issues with writes using sync Subject: Re: XFS - issues with writes using sync From: Amit Sahrawat To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0015175cf83c46a7ae049a4583c3 X-Barracuda-Connect: mail-qy0-f174.google.com[209.85.216.174] X-Barracuda-Start-Time: 1295523253 X-Barracuda-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.52914 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 --0015175cf83c46a7ae049a4583c3 Content-Type: text/plain; charset=ISO-8859-1 On Thu, Jan 20, 2011 at 4:19 PM, Dave Chinner wrote: > On Thu, Jan 20, 2011 at 12:08:21PM +0530, Amit Sahrawat wrote: > > Hi, > > I tried with the same test case - just removed 'sync' command from the > > script(please check script below) to check the behaviour. > .... > > I really doubt about the stability of 2.6.35.9, it is not passing our > basic > > tests. Checking few more things, before deciding about the patches which > got > > introduced between 2.6.34 ~ 2.6.35.9(around 102). > > 2.6.35 is perfectly fine on x86, so I suspect that it is something > ARM specific. Most likely it is related to the VIVT platform support > changes, but you really need to bisect so we know exactly waht > change has broken such basic functionality on your platform. > > >> yes, this is quite possible - last time, we found an issue like this on MIPS(related with flushing). > Note that the bug may not even be in XFS, so you really need to do a > full bisect, not just of the changes in xfs in that time... > >> if other activities are not assigned in the mean time :), I will verify the exact reason for this issue. I do have working and issue causing setups - so will check with both and update. Thanks, Amit Sahrawat --0015175cf83c46a7ae049a4583c3 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

On Thu, Jan 20, 2011 at 4:19 PM, Dave Chinner <david@fromorbit.= com> wrote:
On Thu, Jan 20, 2011 at 12:08:21PM +0530, Amit Sahrawat w= rote:
> Hi,
> I tried with the same test case - just removed '= sync' command from the
> script(please check script below) to che= ck the behaviour.
....
> I really doubt about the stability of 2.6.35.9, it i= s not passing our basic
> tests. Checking few more things, before dec= iding about the patches which got
> introduced between 2.6.34 ~ 2.6.3= 5.9(around 102).

2.6.35 is perfectly fine on x86, so I suspect that it is somethin= g
ARM specific. Most likely it is related to the VIVT platform supportchanges, but you really need to bisect so we know exactly waht
change = has broken such basic functionality on your platform.

>> yes, this is quite possible - last time, we found an issue li= ke this on MIPS(related with flushing).
=A0
Note that the bug may not even b= e in XFS, so you really need to do a
full bisect, not just of the change= s in xfs in that time...
>> if other activities are not assigned in the mean time :), I w= ill verify the exact reason for this issue. I do have working and issue cau= sing setups - so will check with both and update.
=A0
Thanks,
Amit Sahrawat
--0015175cf83c46a7ae049a4583c3-- From petre.rodan@simplex.ro Thu Jan 20 06:06:49 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0KC6nR4079389 for ; Thu, 20 Jan 2011 06:06:49 -0600 X-ASG-Debug-ID: 1295525345-6c2100ea0000-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 2449E27A0CC for ; Thu, 20 Jan 2011 04:09:05 -0800 (PST) Received: from passage.avira.com (passage.avira.com [89.238.222.20]) by cuda.sgi.com with ESMTP id GnEWAxI4zVc05LkJ for ; Thu, 20 Jan 2011 04:09:05 -0800 (PST) Received: by passage.avira.com (Postfix/AVIRA, from userid 26) id A82A7124938; Thu, 20 Jan 2011 14:09:04 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by passage.avira.com (Postfix/AVIRA) with ESMTP id 3EF41124939 for ; Thu, 20 Jan 2011 14:09:01 +0200 (EET) Received: from passage.avira.com (localhost [127.0.0.1]) by localhost (AvMailGate-2.1.3-2) id 24987-K2eipo; Thu, 20 Jan 2011 14:09:01 +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 185E2124939 for ; Thu, 20 Jan 2011 14:09:01 +0200 (EET) Received: (qmail 15198 invoked from network); 20 Jan 2011 12:09:00 -0000 Received: from unknown (HELO peter.simplex.ro) (prodan@10.7.0.16) by naliboat.bu.avira.com with ESMTPA; 20 Jan 2011 12:09:00 -0000 Date: Thu, 20 Jan 2011 14:07:00 +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: <20110120120700.GA5449@peter.simplex.ro> References: <20101223165532.GA23813@peter.simplex.ro> <20101227021904.GA24828@dastard> <20101227061629.GA2275@pandora.simplex.ro> <20101227140750.GB24828@dastard> <20101227171939.GA7759@pandora.simplex.ro> <20101231001323.GD15179@dastard> <20110120100143.GA2007@peter.simplex.ro> <20110120110605.GU16267@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="H+4ONPRPur6+Ovig" Content-Disposition: inline In-Reply-To: <20110120110605.GU16267@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.148; VDF: 7.11.1.185; host: passage.avira.com) X-Barracuda-Connect: passage.avira.com[89.238.222.20] X-Barracuda-Start-Time: 1295525347 X-Barracuda-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.52916 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 --H+4ONPRPur6+Ovig Content-Type: multipart/mixed; boundary="ReaqsoxgOBHFXBhH" Content-Disposition: inline --ReaqsoxgOBHFXBhH Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hello Dave, On Thu, Jan 20, 2011 at 10:06:05PM +1100, Dave Chinner wrote: > .... > > in other words xfsyncd and xfsbufd now alternate at 18s intervals > > keeping the drive busy with nothing constructive hours after the > > last write to the drive. [..] > > meta-data=3D/dev/sdc1 isize=3D256 agcount=3D4, agsize= =3D61047552 blks > > =3D sectsz=3D512 attr=3D2 > > data =3D bsize=3D4096 blocks=3D244190208, i= maxpct=3D25 > > =3D sunit=3D0 swidth=3D0 blks > > naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 > > log =3Dinternal bsize=3D4096 blocks=3D119233, vers= ion=3D2 > > =3D sectsz=3D512 sunit=3D0 blks, lazy-= count=3D0 > ^^^^^^^^^^^^ > > realtime =3Dnone extsz=3D4096 blocks=3D0, rtextents= =3D0 >=20 > It's something to do with lazy-count=3D0. I'm look into it when I get > the chance - I almost never test w/ lazy-count=3D0 because =3D1 is > the default value. thanks for the tip. looks like I'm using xfsprogs 3.0.3 (latest version in = the gentoo stable tree) to mkfs these filesystems. can the antique version = be somehow the root of the problem? anyhow, changed it to: meta-data=3D/dev/sdc1 isize=3D256 agcount=3D4, agsize=3D610= 47552 blks =3D sectsz=3D512 attr=3D2 data =3D bsize=3D4096 blocks=3D244190208, imaxp= ct=3D25 =3D sunit=3D0 swidth=3D0 blks naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 log =3Dinternal bsize=3D4096 blocks=3D119233, version= =3D2 =3D sectsz=3D512 sunit=3D0 blks, lazy-coun= t=3D1 realtime =3Dnone extsz=3D4096 blocks=3D0, rtextents=3D0 used: xfsprogs-3.0.3 Linux starshine 2.6.38-rc1-s001 #1 SMP Thu Jan 20 10:49:20 EET 2011 x86_64 = AMD Athlon(tm) II Neo N36L Dual-Core Processor AuthenticAMD GNU/Linux Seagate Barracuda ES.2 ST31000340NS Hitachi HUA722020ALA330 default (for 3.0.3 xfsprogs) mkfs options, 'noatime,nodev,nosuid,noexec' as= mount options. and the behaviour did not change at all, trace attached. it's very easy to reproduce this. all it took was reboot cp -a /usr/src/linux* /mnt/foo sleep 1800 grab trace cheers, peter >=20 > I'd recommend that you convert the fs to lazy-count=3D1 when you get a > chance, anyway, because of the fact it reduces the latency of > transactions significantly... >=20 > Cheers, >=20 > Dave. > --=20 > Dave Chinner > david@fromorbit.com --=20 petre rodan Technical Manager Simplex SRL, Bucharest --ReaqsoxgOBHFXBhH Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=trace Content-Transfer-Encoding: quoted-printable # tracer: nop # # TASK-PID CPU# TIMESTAMP FUNCTION # | | | | | xfssyncd/sdc1-1409 [000] 2198.419444: xfs_log_reserve: dev 8:33 type D= UMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC_INI= TED reserveq empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 4= 5622272 grant_write_cycle 1 grant_write_bytes 45622272 curr_cycle 1 curr_bl= ock 89106 tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [000] 2198.419449: xfs_log_grant_enter: dev 8:33 ty= pe DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC= _INITED reserveq empty writeq empty grant_reserve_cycle 1 grant_reserve_byt= es 45622272 grant_write_cycle 1 grant_write_bytes 45622272 curr_cycle 1 cur= r_block 89106 tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [000] 2198.419451: xfs_log_grant_exit: dev 8:33 typ= e DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC_= INITED reserveq empty writeq empty grant_reserve_cycle 1 grant_reserve_byte= s 45625012 grant_write_cycle 1 grant_write_bytes 45625012 curr_cycle 1 curr= _block 89106 tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [000] 2198.419453: xfs_buf_lock: dev 8:33 bno 0x0 l= en 0x200 hold 1 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= getsb xfssyncd/sdc1-1409 [000] 2198.419455: xfs_buf_lock_done: dev 8:33 bno = 0x0 len 0x200 hold 1 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller= xfs_getsb xfssyncd/sdc1-1409 [000] 2198.419456: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 1 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= getsb xfssyncd/sdc1-1409 [000] 2198.419458: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 2 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_item_init xfssyncd/sdc1-1409 [000] 2198.419460: xfs_trans_getsb: dev 8:33 bno 0x= 0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|PAGES recur 0= refcount 1 bliflags lidesc 0xffff880106b4b570 liflags=20 xfssyncd/sdc1-1409 [000] 2198.419462: xfs_trans_log_buf: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGE= S recur 0 refcount 1 bliflags lidesc 0xffff880106b4b570 liflags=20 xfssyncd/sdc1-1409 [000] 2198.419465: xfs_buf_item_size: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGE= S recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff880106b4b570 lifla= gs=20 xfssyncd/sdc1-1409 [000] 2198.419467: xfs_buf_item_format: dev 8:33 bn= o 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PA= GES recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff880106b4b570 lif= lags=20 xfssyncd/sdc1-1409 [000] 2198.419468: xfs_buf_item_pin: dev 8:33 bno 0= x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGES= recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff880106b4b570 liflag= s=20 xfssyncd/sdc1-1409 [000] 2198.419474: xfs_log_done_nonperm: dev 8:33 t= ype DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2000 t_unit_res 2740 t_flags reserv= eq empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 45625012 gr= ant_write_cycle 1 grant_write_bytes 45625012 curr_cycle 1 curr_block 89106 = tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [000] 2198.419475: xfs_log_ungrant_enter: dev 8:33 = type DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reser= veq empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 45625012 g= rant_write_cycle 1 grant_write_bytes 45625012 curr_cycle 1 curr_block 89106= tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [000] 2198.419476: xfs_log_ungrant_sub: dev 8:33 ty= pe DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reserve= q empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 45625012 gra= nt_write_cycle 1 grant_write_bytes 45625012 curr_cycle 1 curr_block 89106 t= ail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [000] 2198.419476: xfs_log_ungrant_exit: dev 8:33 t= ype DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reserv= eq empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 45623012 gr= ant_write_cycle 1 grant_write_bytes 45623012 curr_cycle 1 curr_block 89106 = tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [000] 2198.419479: xfs_trans_commit_lsn: dev 8:33 t= rans 0xffff880101c58b58 commit_lsn 0x100015c12 xfssyncd/sdc1-1409 [000] 2198.419482: xfs_buf_item_unlock: dev 8:33 bn= o 0x0 len 0x200 hold 3 pincount 1 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PA= GES recur 0 refcount 2 bliflags |DIRTY lidesc 0x (null) liflags=20 xfssyncd/sdc1-1409 [000] 2198.419483: xfs_buf_delwri_queue: dev 8:33 b= no 0x0 len 0x200 hold 4 pincount 1 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PA= GES caller xfs_buf_unlock xfssyncd/sdc1-1409 [000] 2198.419488: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 4 pincount 1 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_item_unlock xfssyncd/sdc1-1409 [000] 2198.419489: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 4 pincount 1 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DELW= RI_Q caller xfs_buf_item_unlock xfssyncd/sdc1-1409 [000] 2198.419493: xfs_buf_iorequest: dev 8:33 bno = 0x3a398c32 len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DON= E|ORDERED|PAGES|RUN_QUEUES|0x2000 caller xlog_bdstrat xfssyncd/sdc1-1409 [000] 2198.419494: xfs_buf_hold: dev 8:33 bno 0x3a3= 98c32 len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|ORD= ERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_iorequest xfssyncd/sdc1-1409 [000] 2198.419530: xfs_buf_rele: dev 8:33 bno 0x3a3= 98c32 len 0x8000 hold 2 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|ORD= ERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_iorequest -0 [000] 2198.439397: xfs_buf_ioerror: dev 8:33 bno 0x= 3a398c32 len 0x8000 hold 1 pincount 0 lock 0 error 0 flags WRITE|MAPPED|ASY= NC|DONE|ORDERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_bio_end_io -0 [000] 2198.439402: xfs_buf_iodone: dev 8:33 bno 0x3= a398c32 len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|O= RDERED|PAGES|RUN_QUEUES|0x2000 caller _xfs_buf_ioend kworker/0:1-10 [000] 2198.439444: xfs_buf_item_committed: dev 8:33= bno 0x0 len 0x200 hold 3 pincount 1 lock 1 flags |MAPPED|ASYNC|DONE|DELWRI= |PAGES|DELWRI_Q recur 0 refcount 1 bliflags |DIRTY lidesc 0x (null= ) liflags=20 kworker/0:1-10 [000] 2198.439447: xfs_buf_item_unpin: dev 8:33 bno= 0x0 len 0x200 hold 3 pincount 1 lock 1 flags |MAPPED|ASYNC|DONE|DELWRI|PAG= ES|DELWRI_Q recur 0 refcount 1 bliflags |DIRTY lidesc 0x (null) li= flags IN_AIL xfsbufd/sdc1-1407 [001] 2199.621878: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2199.621882: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2200.824324: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2200.824329: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2202.026783: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2202.026787: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2203.229229: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2203.229233: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2204.431687: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2204.431692: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2205.634134: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2205.634139: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2206.836595: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2206.836600: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2208.039039: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2208.039044: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2209.241491: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2209.241495: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2210.443954: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2210.443959: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2211.646365: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2211.646370: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2212.844825: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2212.844830: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2214.043282: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2214.043287: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2215.241740: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2215.241745: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2216.440198: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [001] 2216.440201: xfs_buf_delwri_split: dev 8:33 b= no 0x0 len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAG= ES caller xfsbufd xfsbufd/sdc1-1407 [001] 2216.440204: xfs_buf_iorequest: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES = caller xfs_bdstrat_cb xfsbufd/sdc1-1407 [001] 2216.440205: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES calle= r xfs_buf_iorequest xfsbufd/sdc1-1407 [001] 2216.440224: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 4 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES calle= r xfs_buf_iorequest -0 [001] 2216.440695: xfs_buf_ioerror: dev 8:33 bno 0x= 0 len 0x200 hold 3 pincount 0 lock 0 error 0 flags WRITE|MAPPED|ASYNC|DONE|= PAGES caller xfs_buf_bio_end_io -0 [001] 2216.440700: xfs_buf_iodone: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES cal= ler _xfs_buf_ioend kworker/1:2-1448 [001] 2216.440737: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_iodone kworker/1:2-1448 [001] 2216.440739: xfs_buf_iodone: dev 8:33 bno 0x0= len 0x200 hold 2 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xf= s_buf_iodone_callbacks kworker/1:2-1448 [001] 2216.440740: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 2 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xf= s_buf_iodone_work kworker/1:2-1448 [001] 2216.440741: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 2 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_iodone_work xfssyncd/sdc1-1409 [001] 2234.393111: xfs_log_reserve: dev 8:33 type D= UMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC_INI= TED reserveq empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 4= 5623296 grant_write_cycle 1 grant_write_bytes 45623296 curr_cycle 1 curr_bl= ock 89108 tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [001] 2234.393113: xfs_log_grant_enter: dev 8:33 ty= pe DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC= _INITED reserveq empty writeq empty grant_reserve_cycle 1 grant_reserve_byt= es 45623296 grant_write_cycle 1 grant_write_bytes 45623296 curr_cycle 1 cur= r_block 89108 tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [001] 2234.393115: xfs_log_grant_exit: dev 8:33 typ= e DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC_= INITED reserveq empty writeq empty grant_reserve_cycle 1 grant_reserve_byte= s 45626036 grant_write_cycle 1 grant_write_bytes 45626036 curr_cycle 1 curr= _block 89108 tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [001] 2234.393117: xfs_buf_lock: dev 8:33 bno 0x0 l= en 0x200 hold 1 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= getsb xfssyncd/sdc1-1409 [001] 2234.393118: xfs_buf_lock_done: dev 8:33 bno = 0x0 len 0x200 hold 1 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller= xfs_getsb xfssyncd/sdc1-1409 [001] 2234.393119: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 1 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= getsb xfssyncd/sdc1-1409 [001] 2234.393122: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 2 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_item_init xfssyncd/sdc1-1409 [001] 2234.393123: xfs_trans_getsb: dev 8:33 bno 0x= 0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|PAGES recur 0= refcount 1 bliflags lidesc 0xffff880101f1f370 liflags=20 xfssyncd/sdc1-1409 [001] 2234.393125: xfs_trans_log_buf: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGE= S recur 0 refcount 1 bliflags lidesc 0xffff880101f1f370 liflags=20 xfssyncd/sdc1-1409 [001] 2234.393128: xfs_buf_item_size: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGE= S recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff880101f1f370 lifla= gs=20 xfssyncd/sdc1-1409 [001] 2234.393130: xfs_buf_item_format: dev 8:33 bn= o 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PA= GES recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff880101f1f370 lif= lags=20 xfssyncd/sdc1-1409 [001] 2234.393131: xfs_buf_item_pin: dev 8:33 bno 0= x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGES= recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff880101f1f370 liflag= s=20 xfssyncd/sdc1-1409 [001] 2234.393137: xfs_log_done_nonperm: dev 8:33 t= ype DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2000 t_unit_res 2740 t_flags reserv= eq empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 45626036 gr= ant_write_cycle 1 grant_write_bytes 45626036 curr_cycle 1 curr_block 89108 = tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [001] 2234.393138: xfs_log_ungrant_enter: dev 8:33 = type DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reser= veq empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 45626036 g= rant_write_cycle 1 grant_write_bytes 45626036 curr_cycle 1 curr_block 89108= tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [001] 2234.393140: xfs_log_ungrant_sub: dev 8:33 ty= pe DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reserve= q empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 45626036 gra= nt_write_cycle 1 grant_write_bytes 45626036 curr_cycle 1 curr_block 89108 t= ail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [001] 2234.393141: xfs_log_ungrant_exit: dev 8:33 t= ype DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reserv= eq empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 45624036 gr= ant_write_cycle 1 grant_write_bytes 45624036 curr_cycle 1 curr_block 89108 = tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [001] 2234.393143: xfs_trans_commit_lsn: dev 8:33 t= rans 0xffff88011da67b58 commit_lsn 0x100015c14 xfssyncd/sdc1-1409 [001] 2234.393146: xfs_buf_item_unlock: dev 8:33 bn= o 0x0 len 0x200 hold 3 pincount 1 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PA= GES recur 0 refcount 2 bliflags |DIRTY lidesc 0x (null) liflags=20 xfssyncd/sdc1-1409 [001] 2234.393147: xfs_buf_delwri_queue: dev 8:33 b= no 0x0 len 0x200 hold 4 pincount 1 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PA= GES caller xfs_buf_unlock xfssyncd/sdc1-1409 [001] 2234.393152: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 4 pincount 1 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_item_unlock xfssyncd/sdc1-1409 [001] 2234.393153: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 4 pincount 1 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DELW= RI_Q caller xfs_buf_item_unlock xfssyncd/sdc1-1409 [001] 2234.393157: xfs_buf_iorequest: dev 8:33 bno = 0x3a398c34 len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DON= E|ORDERED|PAGES|RUN_QUEUES|0x2000 caller xlog_bdstrat xfssyncd/sdc1-1409 [001] 2234.393158: xfs_buf_hold: dev 8:33 bno 0x3a3= 98c34 len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|ORD= ERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_iorequest xfssyncd/sdc1-1409 [001] 2234.393194: xfs_buf_rele: dev 8:33 bno 0x3a3= 98c34 len 0x8000 hold 2 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|ORD= ERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_iorequest -0 [001] 2234.411005: xfs_buf_ioerror: dev 8:33 bno 0x= 3a398c34 len 0x8000 hold 1 pincount 0 lock 0 error 0 flags WRITE|MAPPED|ASY= NC|DONE|ORDERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_bio_end_io -0 [001] 2234.411009: xfs_buf_iodone: dev 8:33 bno 0x3= a398c34 len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|O= RDERED|PAGES|RUN_QUEUES|0x2000 caller _xfs_buf_ioend kworker/1:2-1448 [001] 2234.411044: xfs_buf_item_committed: dev 8:33= bno 0x0 len 0x200 hold 3 pincount 1 lock 1 flags |MAPPED|ASYNC|DONE|DELWRI= |PAGES|DELWRI_Q recur 0 refcount 1 bliflags |DIRTY lidesc 0x (null= ) liflags=20 kworker/1:2-1448 [001] 2234.411047: xfs_buf_item_unpin: dev 8:33 bno= 0x0 len 0x200 hold 3 pincount 1 lock 1 flags |MAPPED|ASYNC|DONE|DELWRI|PAG= ES|DELWRI_Q recur 0 refcount 1 bliflags |DIRTY lidesc 0x (null) li= flags IN_AIL xfsbufd/sdc1-1407 [000] 2235.591555: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2235.591560: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2236.790013: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2236.790018: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2237.988479: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2237.988484: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2239.186952: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2239.186956: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2240.385424: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2240.385428: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2241.583884: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2241.583888: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2242.782341: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2242.782345: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2243.980799: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2243.980804: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2245.179256: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2245.179260: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2246.377715: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2246.377719: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2247.576172: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2247.576177: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2248.774630: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2248.774635: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2249.973087: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2249.973092: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2251.171547: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2251.171552: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2252.370002: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2252.370006: xfs_buf_delwri_split: dev 8:33 b= no 0x0 len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAG= ES caller xfsbufd xfsbufd/sdc1-1407 [000] 2252.370008: xfs_buf_iorequest: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES = caller xfs_bdstrat_cb xfsbufd/sdc1-1407 [000] 2252.370009: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES calle= r xfs_buf_iorequest xfsbufd/sdc1-1407 [000] 2252.370029: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 4 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES calle= r xfs_buf_iorequest -0 [001] 2252.370505: xfs_buf_ioerror: dev 8:33 bno 0x= 0 len 0x200 hold 3 pincount 0 lock 0 error 0 flags WRITE|MAPPED|ASYNC|DONE|= PAGES caller xfs_buf_bio_end_io -0 [001] 2252.370510: xfs_buf_iodone: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|PAGES cal= ler _xfs_buf_ioend kworker/1:2-1448 [001] 2252.370547: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_iodone kworker/1:2-1448 [001] 2252.370549: xfs_buf_iodone: dev 8:33 bno 0x0= len 0x200 hold 2 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xf= s_buf_iodone_callbacks kworker/1:2-1448 [001] 2252.370551: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 2 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xf= s_buf_iodone_work kworker/1:2-1448 [001] 2252.370551: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 2 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_iodone_work xfssyncd/sdc1-1409 [000] 2270.362854: xfs_log_reserve: dev 8:33 type D= UMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC_INI= TED reserveq empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 4= 5624320 grant_write_cycle 1 grant_write_bytes 45624320 curr_cycle 1 curr_bl= ock 89110 tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [000] 2270.362858: xfs_log_grant_enter: dev 8:33 ty= pe DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC= _INITED reserveq empty writeq empty grant_reserve_cycle 1 grant_reserve_byt= es 45624320 grant_write_cycle 1 grant_write_bytes 45624320 curr_cycle 1 cur= r_block 89110 tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [000] 2270.362860: xfs_log_grant_exit: dev 8:33 typ= e DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC_= INITED reserveq empty writeq empty grant_reserve_cycle 1 grant_reserve_byte= s 45627060 grant_write_cycle 1 grant_write_bytes 45627060 curr_cycle 1 curr= _block 89110 tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [000] 2270.362862: xfs_buf_lock: dev 8:33 bno 0x0 l= en 0x200 hold 1 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= getsb xfssyncd/sdc1-1409 [000] 2270.362863: xfs_buf_lock_done: dev 8:33 bno = 0x0 len 0x200 hold 1 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller= xfs_getsb xfssyncd/sdc1-1409 [000] 2270.362864: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 1 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= getsb xfssyncd/sdc1-1409 [000] 2270.362866: xfs_buf_hold: dev 8:33 bno 0x0 l= en 0x200 hold 2 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|PAGES caller xfs_= buf_item_init xfssyncd/sdc1-1409 [000] 2270.362868: xfs_trans_getsb: dev 8:33 bno 0x= 0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|PAGES recur 0= refcount 1 bliflags lidesc 0xffff880106aa3350 liflags=20 xfssyncd/sdc1-1409 [000] 2270.362870: xfs_trans_log_buf: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGE= S recur 0 refcount 1 bliflags lidesc 0xffff880106aa3350 liflags=20 xfssyncd/sdc1-1409 [000] 2270.362873: xfs_buf_item_size: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGE= S recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff880106aa3350 lifla= gs=20 xfssyncd/sdc1-1409 [000] 2270.362875: xfs_buf_item_format: dev 8:33 bn= o 0x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PA= GES recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff880106aa3350 lif= lags=20 xfssyncd/sdc1-1409 [000] 2270.362876: xfs_buf_item_pin: dev 8:33 bno 0= x0 len 0x200 hold 3 pincount 0 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PAGES= recur 0 refcount 1 bliflags |DIRTY|LOGGED lidesc 0xffff880106aa3350 liflag= s=20 xfssyncd/sdc1-1409 [000] 2270.362882: xfs_log_done_nonperm: dev 8:33 t= ype DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2000 t_unit_res 2740 t_flags reserv= eq empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 45627060 gr= ant_write_cycle 1 grant_write_bytes 45627060 curr_cycle 1 curr_block 89110 = tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [000] 2270.362883: xfs_log_ungrant_enter: dev 8:33 = type DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reser= veq empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 45627060 g= rant_write_cycle 1 grant_write_bytes 45627060 curr_cycle 1 curr_block 89110= tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [000] 2270.362883: xfs_log_ungrant_sub: dev 8:33 ty= pe DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reserve= q empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 45627060 gra= nt_write_cycle 1 grant_write_bytes 45627060 curr_cycle 1 curr_block 89110 t= ail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [000] 2270.362884: xfs_log_ungrant_exit: dev 8:33 t= ype DUMMY1 t_ocnt 1 t_cnt 0 t_curr_res 2000 t_unit_res 2740 t_flags reserv= eq empty writeq empty grant_reserve_cycle 1 grant_reserve_bytes 45625060 gr= ant_write_cycle 1 grant_write_bytes 45625060 curr_cycle 1 curr_block 89110 = tail_cycle 1 tail_block 35956 xfssyncd/sdc1-1409 [000] 2270.362886: xfs_trans_commit_lsn: dev 8:33 t= rans 0xffff880101c46a40 commit_lsn 0x100015c16 xfssyncd/sdc1-1409 [000] 2270.362889: xfs_buf_item_unlock: dev 8:33 bn= o 0x0 len 0x200 hold 3 pincount 1 lock 0 flags |MAPPED|ASYNC|DONE|DELWRI|PA= GES recur 0 refcount 2 bliflags |DIRTY lidesc 0x (null) liflags=20 xfssyncd/sdc1-1409 [000] 2270.362890: xfs_buf_delwri_queue: dev 8:33 b= no 0x0 len 0x200 hold 4 pincount 1 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PA= GES caller xfs_buf_unlock xfssyncd/sdc1-1409 [000] 2270.362897: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 4 pincount 1 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_item_unlock xfssyncd/sdc1-1409 [000] 2270.362898: xfs_buf_rele: dev 8:33 bno 0x0 l= en 0x200 hold 4 pincount 1 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DELW= RI_Q caller xfs_buf_item_unlock xfssyncd/sdc1-1409 [000] 2270.362902: xfs_buf_iorequest: dev 8:33 bno = 0x3a398c36 len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DON= E|ORDERED|PAGES|RUN_QUEUES|0x2000 caller xlog_bdstrat xfssyncd/sdc1-1409 [000] 2270.362903: xfs_buf_hold: dev 8:33 bno 0x3a3= 98c36 len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|ORD= ERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_iorequest xfssyncd/sdc1-1409 [000] 2270.362939: xfs_buf_rele: dev 8:33 bno 0x3a3= 98c36 len 0x8000 hold 2 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|ORD= ERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_iorequest -0 [001] 2270.382694: xfs_buf_ioerror: dev 8:33 bno 0x= 3a398c36 len 0x8000 hold 1 pincount 0 lock 0 error 0 flags WRITE|MAPPED|ASY= NC|DONE|ORDERED|PAGES|RUN_QUEUES|0x2000 caller xfs_buf_bio_end_io -0 [001] 2270.382699: xfs_buf_iodone: dev 8:33 bno 0x3= a398c36 len 0x8000 hold 1 pincount 0 lock 0 flags WRITE|MAPPED|ASYNC|DONE|O= RDERED|PAGES|RUN_QUEUES|0x2000 caller _xfs_buf_ioend kworker/1:2-1448 [001] 2270.382741: xfs_buf_item_committed: dev 8:33= bno 0x0 len 0x200 hold 3 pincount 1 lock 1 flags |MAPPED|ASYNC|DONE|DELWRI= |PAGES|DELWRI_Q recur 0 refcount 1 bliflags |DIRTY lidesc 0x (null= ) liflags=20 kworker/1:2-1448 [001] 2270.382745: xfs_buf_item_unpin: dev 8:33 bno= 0x0 len 0x200 hold 3 pincount 1 lock 1 flags |MAPPED|ASYNC|DONE|DELWRI|PAG= ES|DELWRI_Q recur 0 refcount 1 bliflags |DIRTY lidesc 0x (null) li= flags IN_AIL xfsbufd/sdc1-1407 [000] 2271.565309: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2271.565314: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2272.763759: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2272.763763: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2273.962216: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2273.962220: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2275.160678: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2275.160683: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2276.359131: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2276.359135: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2277.557589: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2277.557594: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2278.756046: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2278.756051: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2279.954503: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2279.954508: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2281.152961: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2281.152965: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2282.351419: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2282.351423: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2283.549876: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2283.549880: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2284.748334: xfs_buf_cond_lock: dev 8:33 bno = 0x0 len 0x200 hold 3 pincount 0 lock 0 flags MAPPED|ASYNC|DONE|DELWRI|PAGES= |DELWRI_Q caller xfs_buf_delwri_split xfsbufd/sdc1-1407 [000] 2284.748338: xfs_buf_unlock: dev 8:33 bno 0x0= len 0x200 hold 3 pincount 0 lock 1 flags MAPPED|ASYNC|DONE|DELWRI|PAGES|DE= LWRI_Q caller xfs_buf_delwri_split --ReaqsoxgOBHFXBhH-- --H+4ONPRPur6+Ovig Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.16 (GNU/Linux) iEYEABECAAYFAk04JWQACgkQixMPpwVd7zErxwCg3XQgjlV4YZ6t9yyqX6Su8XD2 de0AmgP9lb//O56e1Zyf3ydlsadfu9FA =BURc -----END PGP SIGNATURE----- --H+4ONPRPur6+Ovig-- From BATV+eee7c84253493d5f2690+2706+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 20 07:22:16 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0KDMF2U088613 for ; Thu, 20 Jan 2011 07:22:16 -0600 X-ASG-Debug-ID: 1295529875-131402210000-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 A00921624674 for ; Thu, 20 Jan 2011 05:24:35 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Z9Xp8BOCUkStEulB for ; Thu, 20 Jan 2011 05:24:35 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfuV5-0000GY-Ni; Thu, 20 Jan 2011 13:24:31 +0000 Date: Thu, 20 Jan 2011 08:24:31 -0500 From: Christoph Hellwig To: Petre Rodan Cc: Dave Chinner , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down Message-ID: <20110120132431.GA306@infradead.org> References: <20101223165532.GA23813@peter.simplex.ro> <20101227021904.GA24828@dastard> <20101227061629.GA2275@pandora.simplex.ro> <20101227140750.GB24828@dastard> <20101227171939.GA7759@pandora.simplex.ro> <20101231001323.GD15179@dastard> <20110120100143.GA2007@peter.simplex.ro> <20110120110605.GU16267@dastard> <20110120120700.GA5449@peter.simplex.ro> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110120120700.GA5449@peter.simplex.ro> 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: 1295529875 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, Jan 20, 2011 at 02:07:00PM +0200, Petre Rodan wrote: > thanks for the tip. looks like I'm using xfsprogs 3.0.3 (latest version in the gentoo stable tree) to mkfs these filesystems. can the antique version be somehow the root of the problem? Yes, lazy-count has been the default since xfsprogs 3.1.0. From BATV+eee7c84253493d5f2690+2706+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 20 07:25:19 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0KDPIVo089064 for ; Thu, 20 Jan 2011 07:25:19 -0600 X-ASG-Debug-ID: 1295530058-6c1d02f90000-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 A354127A725 for ; Thu, 20 Jan 2011 05:27:38 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id TgQQlYNOBghLuS5K for ; Thu, 20 Jan 2011 05:27:38 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PfuY6-00014l-6L; Thu, 20 Jan 2011 13:27:38 +0000 Date: Thu, 20 Jan 2011 08:27:38 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: fix efi item leak on forced shutdown Subject: Re: [PATCH 2/2] xfs: fix efi item leak on forced shutdown Message-ID: <20110120132738.GA1061@infradead.org> References: <1295010430-12495-1-git-send-email-david@fromorbit.com> <1295010430-12495-3-git-send-email-david@fromorbit.com> <20110118124625.GB12516@infradead.org> <20110118233346.GA28803@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110118233346.GA28803@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: 1295530058 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, Jan 19, 2011 at 10:33:46AM +1100, Dave Chinner wrote: > > Hmm, this is not symmetric with the non-delaylog path. > > xfs_trans_item_committed never sets the remove flag to IOP_UNPIN, > > even if the transaction commit was aborted. > > Right, because the delaylog and non-delaylog paths are not symmetric > w.r.t. log write failures. > > > It seems like the CIL code is missing an equivalent to > > xfs_trans_uncommit for the case that xfs_log_write or xfs_log_done > > fail. > > There isn't an equivalent. In the delaylog case, we don't have a > transaction to "uncommit" when a log write failure occurs - we are > aborting the checkpoint of the CIL, not a transaction. As the items > have already gone through IOP_COMMITTING and IOP_UNLOCK, we have to > treat the failures like they came from the log IO completion > handler. True. > In the case of non-delaylog, neither IOP_COMMITTING or IOP_UNLOCK > has been called on the items when the xfs_log_write() fails. They > are still linked into the xfs_trans structure, so they can be > handled by xfs_trans_uncommit() which simply needs to walk the items > in the transaction and IOP_UNPIN(lip, abort), IOP_UNLOCK and free > the items. You're right. Care to extend the comment to explain this a bit better in the code? From gwehrman@sgi.com Thu Jan 20 08:42:47 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0KEglKB099004 for ; Thu, 20 Jan 2011 08:42:47 -0600 Received: from goalpost.americas.sgi.com (goalpost.americas.sgi.com [128.162.232.54]) by relay3.corp.sgi.com (Postfix) with ESMTP id E5CDCAC002; Thu, 20 Jan 2011 06:45:03 -0800 (PST) Received: by goalpost.americas.sgi.com (Postfix, from userid 14442) id 3E9BD26ECA; Thu, 20 Jan 2011 08:45:03 -0600 (CST) Date: Thu, 20 Jan 2011 08:45:03 -0600 From: Geoffrey Wehrman To: Dave Chinner Cc: Christoph Hellwig , bpm@sgi.com, xfs@oss.sgi.com Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110120144503.GA7225@sgi.com> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> <20110114235549.GI16267@dastard> <20110118204752.GB28791@infradead.org> <20110118231831.GZ28803@dastard> <20110119120321.GC12941@infradead.org> <20110119133147.GN16267@dastard> <20110119135548.GA11502@infradead.org> <20110120013346.GO16267@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110120013346.GO16267@dastard> User-Agent: Mutt/1.5.14 (2007-02-12) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Jan 20, 2011 at 12:33:46PM +1100, Dave Chinner wrote: | Given that XFS is aimed towards optimising for the large file/large | IO/high throughput type of application, I'm comfortable with saying | that avoiding sub-page writes for optimal throughput IO is an | application problem and going from there. Especially considering | that stuff like rsync and untarring kernel tarballs are all | appending writes so won't take any performance hit at all... I agree. I do not expect systems with 64K pages to be used for single bit manipulations. However, I do see a couple of potential problems. The one place where page size I/O may not work though is for an DMAPI/HSM (DMF) managed filesystem where some blocks are managed on near-line media. The DMAPI needs to be able to remove and restore extents on a filesystem block boundary, not a page boundary. The other downside is that for sparse files, we could end up allocating space for zero filled blocks. There may be some workloads where significant quantities of space are wasted. -- Geoffrey Wehrman From pv@fb.com Thu Jan 20 14:39:01 2011 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.5 required=5.0 tests=BAYES_05 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 p0KKd1eV143643 for ; Thu, 20 Jan 2011 14:39:01 -0600 X-ASG-Debug-ID: 1295556080-63b600fb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx-out.facebook.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 25995148A6BD for ; Thu, 20 Jan 2011 12:41:20 -0800 (PST) Received: from mx-out.facebook.com (outmail008.snc4.facebook.com [66.220.144.140]) by cuda.sgi.com with ESMTP id 0QKH64kr3YyFwmyT for ; Thu, 20 Jan 2011 12:41:20 -0800 (PST) Received: from [192.168.18.198] ([192.168.18.198:59279] helo=mail.thefacebook.com) by mta029.snc4.facebook.com (envelope-from ) (ecelerity 2.2.2.45 r(34222M)) with ESMTP id 08/34-22976-0FD983D4; Thu, 20 Jan 2011 12:41:20 -0800 Received: from SC-MBX02-2.TheFacebook.com ([fe80::f8e1:3c09:1d21:8dc1]) by sc-hub03.TheFacebook.com ([192.168.18.198]) with mapi id 14.01.0218.012; Thu, 20 Jan 2011 12:41:19 -0800 From: Peter Vajgel To: "xfs@oss.sgi.com" X-ASG-Orig-Subj: allocsize mount option Subject: allocsize mount option Thread-Topic: allocsize mount option Thread-Index: Acu44SnRhSXb3vU+Ra2sCPFBekjffg== Date: Thu, 20 Jan 2011 20:41:19 +0000 Message-ID: <3F5ACD12257C714E9C0535D0A83917180288FB@SC-MBX02-2.TheFacebook.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [192.168.18.252] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: outmail008.snc4.facebook.com[66.220.144.140] X-Barracuda-Start-Time: 1295556081 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0530 1.0000 -1.6809 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.68 X-Barracuda-Spam-Status: No, SCORE=-1.68 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.52951 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 We write about 100 100GB files into a single 10TB volume with xfs. We are u= sing allocsize=3D1g to limit the fragmentation with a great success. We als= o need to reserve some space (~200GB) on each filesystem for processing the= files and writing new versions of the files. Once we have only 200GB avail= able we stop writing to the files. However with allocsize it's not that eas= y - we see +/- 100GB added or taken depending if there are still writes goi= ng and if the file was reopened ... Is there a way to programmatically disa= ble allocsize speculative preallocation once we exceed certain threshold an= d also return the current speculative preallocation back to the free space = (without closing the file)? Thx Peter Vajgel From romosan@sycorax.lbl.gov Thu Jan 20 15:59:29 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0KLxSIS155522 for ; Thu, 20 Jan 2011 15:59:29 -0600 X-ASG-Debug-ID: 1295560906-5fb203d20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from sycorax.lbl.gov (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C3DBF19F9ABC for ; Thu, 20 Jan 2011 14:01:46 -0800 (PST) Received: from sycorax.lbl.gov (sycorax.lbl.gov [128.3.11.121]) by cuda.sgi.com with ESMTP id jwsjGcwoyEYv25vH for ; Thu, 20 Jan 2011 14:01:46 -0800 (PST) Received: from sycorax.lbl.gov (romosan@localhost [127.0.0.1]) by sycorax.lbl.gov (8.14.4/8.14.4/Debian-2) with ESMTP id p0KM1jtl007213; Thu, 20 Jan 2011 14:01:45 -0800 Received: (from romosan@localhost) by sycorax.lbl.gov (8.14.4/8.14.4/Submit) id p0KM1j9I007210; Thu, 20 Jan 2011 14:01:45 -0800 From: Alex Romosan To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: xfs used disk space bug in 2.6.38-rc1 (commit 6e857567dbbfe14dd6cc3f7414671b047b1ff5c7) Subject: xfs used disk space bug in 2.6.38-rc1 (commit 6e857567dbbfe14dd6cc3f7414671b047b1ff5c7) Date: Thu, 20 Jan 2011 14:01:45 -0800 Message-ID: <87zkqvtet2.fsf@sycorax.lbl.gov> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: sycorax.lbl.gov[128.3.11.121] X-Barracuda-Start-Time: 1295560907 X-Barracuda-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=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.52956 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 my home directory is using xfs and i noticed that when i try to compile a program or do any kind of disk access (like git pull, etc) the amount of space used jumps by tens of gigabytes causing the disk to seemingly become full (eventually). on reboot the used disk space goes back to the correct value. i did a 'git bisect start -- fs/xfs' and i tracked it down to commit 6e857567dbbfe14dd6cc3f7414671b047b1ff5c7. if i revert this patch then disk usage doesn't increase unexpectedly (i have 270GB free and the disk became full by simply trying to compile wine). i can try patches if somebody comes up with one. --alex-- -- | I believe the moment is at hand when, by a paranoiac and active | | advance of the mind, it will be possible (simultaneously with | | automatism and other passive states) to systematize confusion | | and thus to help to discredit completely the world of reality. | From david@fromorbit.com Thu Jan 20 17:41:00 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0KNf07e169966 for ; Thu, 20 Jan 2011 17:41:00 -0600 X-ASG-Debug-ID: 1295566997-302601c70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7579627BAA9 for ; Thu, 20 Jan 2011 15:43:18 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id cNayKVPgxyeTDpOs for ; Thu, 20 Jan 2011 15:43:18 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEANlXOE15LN5m/2dsb2JhbACkXnS/fA2FQwQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 21 Jan 2011 10:13:11 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pg49m-00033W-4H; Fri, 21 Jan 2011 10:43:10 +1100 Date: Fri, 21 Jan 2011 10:43:10 +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: <20110120234310.GV16267@dastard> References: <20101223165532.GA23813@peter.simplex.ro> <20101227021904.GA24828@dastard> <20101227061629.GA2275@pandora.simplex.ro> <20101227140750.GB24828@dastard> <20101227171939.GA7759@pandora.simplex.ro> <20101231001323.GD15179@dastard> <20110120100143.GA2007@peter.simplex.ro> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110120100143.GA2007@peter.simplex.ro> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1295566999 X-Barracuda-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.52962 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, Jan 20, 2011 at 12:01:43PM +0200, Petre Rodan wrote: > On Fri, Dec 31, 2010 at 11:13:23AM +1100, Dave Chinner wrote: > > 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... > > I presume that the new fix should be provided by "xfs: ensure log > covering transactions are synchronous", so I tested 2.6.37 patched > with it and then 2.6.38_rc1 that has it included.. ..... > in other words xfsyncd and xfsbufd now alternate at 18s intervals > keeping the drive busy with nothing constructive hours after the > last write to the drive. This is a different problem, and not one I've seen before. Looking at the traces, it appears that we have not empties the AIL. At least, that's what I'm assuming at this point because log IO completion is not updating log tail. When we start a log IO, we set the log header lsn to the current head: > xfssyncd/sdc1-1413 [000] 3356.093456: xfs_log_reserve: dev 8:33 type DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC_INITED reserveq empty writeq empty grant_reserve_cycle 2 grant_reserve_bytes 428523008 grant_write_cycle 2 grant_write_bytes 428523008 curr_cycle 2 curr_block 836959 tail_cycle 2 tail_block 810683 Which in this case is: curr_cycle 2 curr_block 836959 When the log IO completes, that value gets written to the l_last_sync_lsn. When the AIL tail is removed, the tail lsn is updated to the new tail item. If the AIL is empty, then the l_last_sync_lsn is used. That means then next dummy transaction made to cover the log should have the cycle/block of the above current cycle. Instead, what I see is that the next dummmy transaction shows: > xfssyncd/sdc1-1413 [000] 3392.067122: xfs_log_reserve: dev 8:33 type DUMMY1 t_ocnt 1 t_cnt 1 t_curr_res 2740 t_unit_res 2740 t_flags XLOG_TIC_INITED reserveq empty writeq empty grant_reserve_cycle 2 grant_reserve_bytes 428524032 grant_write_cycle 2 grant_write_bytes 428524032 curr_cycle 2 curr_block 836961 tail_cycle 2 tail_block 810683 The current head has moved: curr_cycle 2 curr_block 836961 But the tail hasn't: tail_cycle 2 tail_block 810683 So effectively we've got some item on the AIL that we haven't flushed and isn't being flushed by xfssyncd. That's the problem I need to get to the bottom of and it also explains why it's an intermitten problem... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 20 18:46:02 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0L0k19x178394 for ; Thu, 20 Jan 2011 18:46:02 -0600 X-ASG-Debug-ID: 1295570899-33af01280000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 444771036FCF for ; Thu, 20 Jan 2011 16:48:19 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id w88lc86WbFPDkl85 for ; Thu, 20 Jan 2011 16:48:19 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av0EANplOE15LN5m/2dsb2JhbACEE6BNdK8bkDkNgReDOHQE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 21 Jan 2011 11:18:18 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pg5Am-0003AA-SI; Fri, 21 Jan 2011 11:48:16 +1100 Date: Fri, 21 Jan 2011 11:48:16 +1100 From: Dave Chinner To: Peter Vajgel Cc: "xfs@oss.sgi.com" X-ASG-Orig-Subj: Re: allocsize mount option Subject: Re: allocsize mount option Message-ID: <20110121004816.GW16267@dastard> References: <3F5ACD12257C714E9C0535D0A83917180288FB@SC-MBX02-2.TheFacebook.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <3F5ACD12257C714E9C0535D0A83917180288FB@SC-MBX02-2.TheFacebook.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1295570901 X-Barracuda-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.52967 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, Jan 20, 2011 at 08:41:19PM +0000, Peter Vajgel wrote: > We write about 100 100GB files into a single 10TB volume with xfs. > We are using allocsize=1g to limit the fragmentation with a great > success. We also need to reserve some space (~200GB) on each > filesystem for processing the files and writing new versions of > the files. Once we have only 200GB available we stop writing to > the files. However with allocsize it's not that easy - we see +/- > 100GB added or taken depending if there are still writes going and > if the file was reopened ... Is there a way to programmatically > disable allocsize speculative preallocation once we exceed certain > threshold and also return the current speculative preallocation > back to the free space (without closing the file)? No and no. However, if you take a look at the new dynamic specualtive allocation code in 2.6.38-rc1, it scales back the preallocation as ENOSPC is approached but doesn't do any reclaiming of existing preallocation. It will also preallocates much larger extents so it may not be ideal for you, either. I've appended the commit message below. Cheers, Dave. -- Dave Chinner david@fromorbit.com commit 055388a3188f56676c21e92962fc366ac8b5cb72 Author: Dave Chinner Date: Tue Jan 4 11:35:03 2011 +1100 xfs: dynamic speculative EOF preallocation 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 T 0: [0..1048575]: 1048672..2097247 0 (1048672..2097247) 10 1: [1048576..2097151]: 5242976..6291551 0 (5242976..6291551) 10 2: [2097152..4194303]: 12583008..14680159 0 (12583008..14680159) 20 3: [4194304..8388607]: 25165920..29360223 0 (25165920..29360223) 41 4: [8388608..16777215]: 58720352..67108959 0 (58720352..67108959) 83 5: [16777216..33554423]: 117440584..134217791 0 (117440584..134217791) 167 6: [33554424..50331511]: 184549056..201326143 0 (184549056..201326143) 167 7: [50331512..67108599]: 251657408..268434495 0 (251657408..268434495) 167 and for 16 concurrent 16GB file writes: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET 0: [0..262143]: 2490472..2752615 0 (2490472..2752615) 2 1: [262144..524287]: 6291560..6553703 0 (6291560..6553703) 2 2: [524288..1048575]: 13631592..14155879 0 (13631592..14155879) 5 3: [1048576..2097151]: 30408808..31457383 0 (30408808..31457383) 10 4: [2097152..4194303]: 52428904..54526055 0 (52428904..54526055) 20 5: [4194304..8388607]: 104857704..109052007 0 (104857704..109052007) 41 6: [8388608..16777215]: 209715304..218103911 0 (209715304..218103911) 83 7: [16777216..33554423]: 452984848..469762055 0 (452984848..469762055) 167 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 From david@fromorbit.com Thu Jan 20 19:57:34 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0L1vYc1188746 for ; Thu, 20 Jan 2011 19:57:34 -0600 X-ASG-Debug-ID: 1295575192-2ebe014c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A101727534F for ; Thu, 20 Jan 2011 17:59:53 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id q7G9CJinnGqhcZ6U for ; Thu, 20 Jan 2011 17:59:53 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEADJ3OE15LN5m/2dsb2JhbACkYHS/KQ2FQwQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 21 Jan 2011 12:29:52 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pg6Hs-0003Gz-7M; Fri, 21 Jan 2011 12:59:40 +1100 Date: Fri, 21 Jan 2011 12:59:40 +1100 From: Dave Chinner To: Christoph Hellwig Cc: bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110121015940.GX16267@dastard> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> <20110114235549.GI16267@dastard> <20110118204752.GB28791@infradead.org> <20110118231831.GZ28803@dastard> <20110119120321.GC12941@infradead.org> <20110119133147.GN16267@dastard> <20110119135548.GA11502@infradead.org> <20110120013346.GO16267@dastard> <20110120111612.GA14571@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110120111612.GA14571@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1295575194 X-Barracuda-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.52971 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, Jan 20, 2011 at 06:16:12AM -0500, Christoph Hellwig wrote: > On Thu, Jan 20, 2011 at 12:33:46PM +1100, Dave Chinner wrote: > > It's case b) that I'm mainly worried about, esp. w.r.t the 64k page > > size on ia64/ppc. If we only track a single dirty bit in the page, > > then every sub-page, non-appending write to an uncached region of a > > file becomes a RMW cycle to initialise the areas around the write > > correctly. The question is whether we care about this enough given > > that we return at least PAGE_SIZE in stat() to tell applications the > > optimal IO size to avoid RMW cycles. > > Note that this generally is only true for the first write into the > region - after that we'll have the rest read into the cache. But > we also have the same issue for appending writes if they aren't > page aligned. True - I kind of implied that by saying RMW cycles are limited to "uncached regions", but you've stated in a much clearer and easier to understand way. ;) > > And if we only do IO on whole pages (i.e regardless of block size) > > .writepage suddenly becomes a lot simpler, as well as being trivial > > to implement our own .readpage/.readpages.... > > I don't think it simplifies writepage a lot. All the buffer head > handling goes away, but we'll still need to do xfs_bmapi calls at > block size granularity. Why would you want to replaced the > readpage/readpages code? The generic mpage helpers for it do just fine. When I went through the mpage code I found there were cases that it would attached bufferheads to pages or assume PagePrivate() contains a bufferhead list. e.g. If there are multiple holes in the page, it will fall through to block_read_full_page() which makes this assumption. If we want/need to keep any of our own state on PagePrivate(), we cannot use any function that assumes PagePrivate() is used to hold bufferheads for the page. Quite frankly, a simple extent mapping loop like we do for .writepage is far simpler than what mpage_readpages does. This is what btrfs does (extent_readpages/__extent_read_full_page), and that is far easier to follow and understand than mpage_do_readpage().... Cheers, Dave. -- Dave Chinner david@fromorbit.com From romosan@sycorax.lbl.gov Thu Jan 20 20:22:48 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0L2Ml3K192558 for ; Thu, 20 Jan 2011 20:22:48 -0600 X-ASG-Debug-ID: 1295576706-3c3e015f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from sycorax.lbl.gov (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C910427C0ED for ; Thu, 20 Jan 2011 18:25:06 -0800 (PST) Received: from sycorax.lbl.gov (sycorax.lbl.gov [128.3.11.121]) by cuda.sgi.com with ESMTP id FOkE9HZgyyDgm4FZ for ; Thu, 20 Jan 2011 18:25:06 -0800 (PST) Received: from sycorax.lbl.gov (romosan@localhost [127.0.0.1]) by sycorax.lbl.gov (8.14.4/8.14.4/Debian-2) with ESMTP id p0L2P5fJ008357; Thu, 20 Jan 2011 18:25:05 -0800 Received: (from romosan@localhost) by sycorax.lbl.gov (8.14.4/8.14.4/Submit) id p0L2P5dG008354; Thu, 20 Jan 2011 18:25:05 -0800 From: Alex Romosan To: linux-kernel@vger.kernel.org Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs used disk space bug in 2.6.38-rc1 (commit 6e857567dbbfe14dd6cc3f7414671b047b1ff5c7) Subject: Re: xfs used disk space bug in 2.6.38-rc1 (commit 6e857567dbbfe14dd6cc3f7414671b047b1ff5c7) References: <87zkqvtet2.fsf@sycorax.lbl.gov> Date: Thu, 20 Jan 2011 18:25:05 -0800 In-Reply-To: <87zkqvtet2.fsf@sycorax.lbl.gov> (message from Alex Romosan on Thu, 20 Jan 2011 14:01:45 -0800) Message-ID: <8739onro1q.fsf@sycorax.lbl.gov> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: sycorax.lbl.gov[128.3.11.121] X-Barracuda-Start-Time: 1295576706 X-Barracuda-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=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.52973 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 Alex Romosan writes: > my home directory is using xfs and i noticed that when i try to compile > a program or do any kind of disk access (like git pull, etc) the amount > of space used jumps by tens of gigabytes causing the disk to seemingly > become full (eventually). on reboot the used disk space goes back to the > correct value. i did a 'git bisect start -- fs/xfs' and i tracked it > down to commit 6e857567dbbfe14dd6cc3f7414671b047b1ff5c7. if i revert > this patch then disk usage doesn't increase unexpectedly (i have 270GB > free and the disk became full by simply trying to compile wine). i can > try patches if somebody comes up with one. actually, even with that patch reverted the disk usage still creeps up eventually so something else is not quite right. --alex-- -- | I believe the moment is at hand when, by a paranoiac and active | | advance of the mind, it will be possible (simultaneously with | | automatism and other passive states) to systematize confusion | | and thus to help to discredit completely the world of reality. | From david@fromorbit.com Thu Jan 20 20:49:24 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0L2nOZn196658 for ; Thu, 20 Jan 2011 20:49:24 -0600 X-ASG-Debug-ID: 1295578302-1202020f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1D37719FAFAD for ; Thu, 20 Jan 2011 18:51:43 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id MJd6Xy2luF8hlaPv for ; Thu, 20 Jan 2011 18:51:43 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av0EAPuBOE15LN5m/2dsb2JhbACEE6BNdK5XkDwNgReDOHQE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 21 Jan 2011 13:21:42 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pg76C-0003Lp-QI; Fri, 21 Jan 2011 13:51:40 +1100 Date: Fri, 21 Jan 2011 13:51:40 +1100 From: Dave Chinner To: Geoffrey Wehrman Cc: Christoph Hellwig , bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110121025140.GY16267@dastard> References: <20110114002900.GF16267@dastard> <20110114214334.GN28274@sgi.com> <20110114235549.GI16267@dastard> <20110118204752.GB28791@infradead.org> <20110118231831.GZ28803@dastard> <20110119120321.GC12941@infradead.org> <20110119133147.GN16267@dastard> <20110119135548.GA11502@infradead.org> <20110120013346.GO16267@dastard> <20110120144503.GA7225@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20110120144503.GA7225@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1295578304 X-Barracuda-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.52975 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, Jan 20, 2011 at 08:45:03AM -0600, Geoffrey Wehrman wrote: > On Thu, Jan 20, 2011 at 12:33:46PM +1100, Dave Chinner wrote: > | Given that XFS is aimed towards optimising for the large file/large > | IO/high throughput type of application, I'm comfortable with saying > | that avoiding sub-page writes for optimal throughput IO is an > | application problem and going from there. Especially considering > | that stuff like rsync and untarring kernel tarballs are all > | appending writes so won't take any performance hit at all... > > I agree. I do not expect systems with 64K pages to be used for single > bit manipulations. However, I do see a couple of potential problems. > > The one place where page size I/O may not work though is for an DMAPI/HSM > (DMF) managed filesystem where some blocks are managed on near-line media. > The DMAPI needs to be able to remove and restore extents on a filesystem > block boundary, not a page boundary. DMAPI is still free to remove extents at whatever boundary it wants. The only difference is that it would be asked to restore extents to the page boundary the write covers rather than a block boundary. The allocation and direct IO boundaries do not change, so the only thing that needs to change is the range that DMAPI is told that the read/write is going to cover.... > The other downside is that for sparse files, we could end up allocating > space for zero filled blocks. There may be some workloads where > significant quantities of space are wasted. Yes, that is possible, though on the other hand is will reduce worst case fragmentation of pathological sparse file filling applications. e.g. out-of-core solvers that do strided writes across the file to write the first column in the result matrix as it is calculated, then the second column, then the third ... until all columns are written. ---- Realistically, for every disadvantage or advantage we can enumerate for specific workloads, I think one of us will be able to come up with a counter example that shows the opposite of the original point. I don't think this sort of argument is particularly productive. :/ Instead, I look at it from the point of view that a 64k IO is little slower than a 4k IO so such a change would not make much difference to performance. And given that terabytes of storage capacity is _cheap_ these days (and getting cheaper all the time), the extra space of using 64k instead of 4k for sparse blocks isn't a big deal. When I combine that with my experience from SGI where we always recommended using filesystems block size == page size for best IO performance on HPC setups, there's a fair argument that using page size extents for small sparse writes isn't a problem we really need to care about. І'd prefer to design for where we expect storage to be in the next few years e.g. 10TB spindles. Minimising space usage is not a big priority when we consider that in 2-3 years 100TB of storage will cost less than $5000 (it's about $15-20k right now). Even on desktops we're going to have more capacity that we know what to do with, so trading off storage space for lower memory overhead, lower metadata IO overhead and lower potential fragmentation seems like the right way to move forward to me. Does that seem like a reasonable position to take, or are there other factors that you think I should be considering? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 20 21:39:52 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0L3dqNu204585 for ; Thu, 20 Jan 2011 21:39:52 -0600 X-ASG-Debug-ID: 1295581330-05f100390000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DB94027B601 for ; Thu, 20 Jan 2011 19:42:11 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id gLuAwjcNLdmM8ThF for ; Thu, 20 Jan 2011 19:42:11 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEAIaMOE15LN5m/2dsb2JhbACkYHS/HQ2FQwQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 21 Jan 2011 14:12:10 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pg7t2-0003QS-PL; Fri, 21 Jan 2011 14:42:08 +1100 Date: Fri, 21 Jan 2011 14:42:08 +1100 From: Dave Chinner To: Alex Romosan Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs used disk space bug in 2.6.38-rc1 (commit 6e857567dbbfe14dd6cc3f7414671b047b1ff5c7) Subject: Re: xfs used disk space bug in 2.6.38-rc1 (commit 6e857567dbbfe14dd6cc3f7414671b047b1ff5c7) Message-ID: <20110121034208.GZ16267@dastard> References: <87zkqvtet2.fsf@sycorax.lbl.gov> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87zkqvtet2.fsf@sycorax.lbl.gov> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1295581331 X-Barracuda-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=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.52977 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 On Thu, Jan 20, 2011 at 02:01:45PM -0800, Alex Romosan wrote: > my home directory is using xfs and i noticed that when i try to compile > a program or do any kind of disk access (like git pull, etc) the amount > of space used jumps by tens of gigabytes causing the disk to seemingly > become full (eventually). on reboot the used disk space goes back to the > correct value. i did a 'git bisect start -- fs/xfs' and i tracked it > down to commit 6e857567dbbfe14dd6cc3f7414671b047b1ff5c7. if i revert When you quote a commit, can you please include the name of the commit. e.g: 6e85756 ("xfs: don't truncate prealloc from frequently accessed inodes") > this patch then disk usage doesn't increase unexpectedly (i have 270GB > free and the disk became full by simply trying to compile wine). i can > try patches if somebody comes up with one. I don't think you tracked the problem down to the correct commit. The previous commit: 055388a xfs: dynamic speculative EOF preallocation Is the one with the known bug that causes excessive preallocation when files are zero sized. The candidate fix is here: http://oss.sgi.com/archives/xfs/2011-01/msg00281.html Can you see if that solves your problem? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 20 23:25:55 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0L5Ps5e221614 for ; Thu, 20 Jan 2011 23:25:55 -0600 X-ASG-Debug-ID: 1295587692-79b500aa0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2734B148BB33 for ; Thu, 20 Jan 2011 21:28:13 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id AAG8DmchX09D8Cum for ; Thu, 20 Jan 2011 21:28:13 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmUEALGoOE15LN5mgWdsb2JhbACkYhYBARYiJL4wDYJvglQE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 21 Jan 2011 15:58:04 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pg9XW-0003Z6-VM; Fri, 21 Jan 2011 16:28:03 +1100 Date: Fri, 21 Jan 2011 16:28:02 +1100 From: Dave Chinner To: Malcolm Scott Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] Re: XFS deadlock in 2.6.37 Subject: [PATCH] Re: XFS deadlock in 2.6.37 Message-ID: <20110121052802.GA16267@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: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1295587694 X-Barracuda-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.52984 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 [cc xfs@os.sgi.com] On Thu, Jan 20, 2011 at 05:08:45PM +0000, Malcolm Scott wrote: > Hi all, > > I've had the following deadlock happen twice on a 2.6.37 system with > several XFS filesystems (including root) and no swap (may be > relevant, considering that kswapd is one task involved here). Some > minor filesystem corruption resulted (but maybe only because the > root fs couldn't be synced/umounted). > > If you need any more info, please let me know. > > --- first crash --- > > [504603.250208] INFO: task kswapd0:37 blocked for more than 120 seconds. > [504603.261107] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > [504603.273465] kswapd0 D 0000000000000003 0 37 2 0x00000000 > [504603.273473] ffff88034428bc10 0000000000000046 ffff88034428bfd8 ffff88034428a000 > [504603.273479] 0000000000013a80 ffff8803442903a0 ffff88034428bfd8 0000000000013a80 > [504603.273483] ffff88034572ad80 ffff880344290000 ffffffffffffff10 ffff880343a51e28 > [504603.273488] Call Trace: > [504603.273500] [] __mutex_lock_slowpath+0xf7/0x180 > [504603.273504] [] mutex_lock+0x23/0x50 > [504603.273541] [] xfs_qm_dqreclaim_one+0x29/0x350 [xfs] > [504603.273554] [] xfs_qm_shake_freelist+0x1d/0x40 [xfs] > [504603.273567] [] xfs_qm_shake+0x59/0x70 [xfs] > [504603.273573] [] shrink_slab+0x89/0x180 > [504603.273577] [] balance_pgdat+0x2b0/0x530 > [504603.273580] [] kswapd+0x13f/0x2b0 > [504603.273585] [] ? autoremove_wake_function+0x0/0x40 > [504603.273588] [] ? kswapd+0x0/0x2b0 > [504603.273591] [] kthread+0x96/0xa0 > [504603.273596] [] kernel_thread_helper+0x4/0x10 > [504603.273599] [] ? kthread+0x0/0xa0 > [504603.273603] [] ? kernel_thread_helper+0x0/0x10 [snip] Looks like everything is hung up on the freelist lock. Can you test the patch below? Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: fix dquot shaker deadlock From: Dave Chinner Commit 368e136 ("xfs: remove duplicate code from dquot reclaim") fails to unlock the dquot freelist when the number of loop restarts is exceeded in xfs_qm_dqreclaim_one(). This causes hangs in memory reclaim. Remove the bogus loop exit check that causes the problem. Reported-by: Malcolm Scott Signed-off-by: Dave Chinner --- fs/xfs/quota/xfs_qm.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index f8e854b..9431c56 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -1992,8 +1992,6 @@ dqfunlock: xfs_dqunlock(dqp); if (dqpout) break; - if (restarts >= XFS_QM_RECLAIM_MAX_RESTARTS) - return NULL; } mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); return dqpout; From BATV+6d14dc3b11b97b80ed4a+2707+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 21 03:23:33 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0L9NWwe260890 for ; Fri, 21 Jan 2011 03:23:32 -0600 X-ASG-Debug-ID: 1295601952-689f010d0000-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 824CE27C9E7 for ; Fri, 21 Jan 2011 01:25:52 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id qwCFmZkzdM9740Ne for ; Fri, 21 Jan 2011 01:25:52 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PgDFe-0002CP-HB for xfs@oss.sgi.com; Fri, 21 Jan 2011 09:25:50 +0000 Message-Id: <20110121092550.457037752@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 21 Jan 2011 04:22:28 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/6] xfs: clean up the xfs_alloc_compute_aligned calling convention Subject: [PATCH 1/6] xfs: clean up the xfs_alloc_compute_aligned calling convention References: <20110121092227.115815324@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-cleanup-xfs_alloc_compute_aligned 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: 1295601952 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 Pass a xfs_alloc_arg structure to xfs_alloc_compute_aligned and derive the alignment and minlen paramters from it. This cleans up the existing callers, and we'll need even more information from the xfs_alloc_arg in subsequent patches. Based on a patch from Dave Chinner. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2011-01-03 13:06:52.386254734 +0100 +++ xfs/fs/xfs/xfs_alloc.c 2011-01-03 13:07:19.545002883 +0100 @@ -147,10 +147,9 @@ xfs_alloc_get_rec( */ STATIC void xfs_alloc_compute_aligned( + xfs_alloc_arg_t *args, /* allocation argument structure */ xfs_agblock_t foundbno, /* starting block in found extent */ xfs_extlen_t foundlen, /* length in found extent */ - xfs_extlen_t alignment, /* alignment for allocation */ - xfs_extlen_t minlen, /* minimum length for allocation */ xfs_agblock_t *resbno, /* result block number */ xfs_extlen_t *reslen) /* result length */ { @@ -158,8 +157,8 @@ xfs_alloc_compute_aligned( xfs_extlen_t diff; xfs_extlen_t len; - if (alignment > 1 && foundlen >= minlen) { - bno = roundup(foundbno, alignment); + if (args->alignment > 1 && foundlen >= args->minlen) { + bno = roundup(foundbno, args->alignment); diff = bno - foundbno; len = diff >= foundlen ? 0 : foundlen - diff; } else { @@ -693,8 +692,7 @@ xfs_alloc_find_best_extent( if (error) goto error0; XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - xfs_alloc_compute_aligned(*sbno, *slen, args->alignment, - args->minlen, &bno, slena); + xfs_alloc_compute_aligned(args, *sbno, *slen, &bno, slena); /* * The good extent is closer than this one. @@ -866,8 +864,8 @@ xfs_alloc_ag_vextent_near( if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) goto error0; XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - xfs_alloc_compute_aligned(ltbno, ltlen, args->alignment, - args->minlen, <bnoa, <lena); + xfs_alloc_compute_aligned(args, ltbno, ltlen, + <bnoa, <lena); if (ltlena < args->minlen) continue; args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); @@ -987,8 +985,8 @@ xfs_alloc_ag_vextent_near( 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); + xfs_alloc_compute_aligned(args, ltbno, ltlen, + <bnoa, <lena); if (ltlena >= args->minlen) break; if ((error = xfs_btree_decrement(bno_cur_lt, 0, &i))) @@ -1003,8 +1001,8 @@ xfs_alloc_ag_vextent_near( 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); + xfs_alloc_compute_aligned(args, gtbno, gtlen, + >bnoa, >lena); if (gtlena >= args->minlen) break; if ((error = xfs_btree_increment(bno_cur_gt, 0, &i))) @@ -1183,8 +1181,7 @@ xfs_alloc_ag_vextent_size( * once aligned; if not, we search left for something better. * This can't happen in the second case above. */ - xfs_alloc_compute_aligned(fbno, flen, args->alignment, args->minlen, - &rbno, &rlen); + xfs_alloc_compute_aligned(args, fbno, flen, &rbno, &rlen); rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); XFS_WANT_CORRUPTED_GOTO(rlen == 0 || (rlen <= flen && rbno + rlen <= fbno + flen), error0); @@ -1209,8 +1206,8 @@ xfs_alloc_ag_vextent_size( XFS_WANT_CORRUPTED_GOTO(i == 1, error0); if (flen < bestrlen) break; - xfs_alloc_compute_aligned(fbno, flen, args->alignment, - args->minlen, &rbno, &rlen); + xfs_alloc_compute_aligned(args, fbno, flen, + &rbno, &rlen); rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); XFS_WANT_CORRUPTED_GOTO(rlen == 0 || (rlen <= flen && rbno + rlen <= fbno + flen), From BATV+6d14dc3b11b97b80ed4a+2707+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 21 03:23:32 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0L9NVJf260882 for ; Fri, 21 Jan 2011 03:23:32 -0600 X-ASG-Debug-ID: 1295601951-6275018c0000-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 D1B4A27C9E7 for ; Fri, 21 Jan 2011 01:25:51 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id z64L8pm8hf1kChZ9 for ; Fri, 21 Jan 2011 01:25:51 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PgDFf-0002Dw-7w for xfs@oss.sgi.com; Fri, 21 Jan 2011 09:25:51 +0000 Message-Id: <20110121092551.185804716@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 21 Jan 2011 04:22:31 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/6] xfs: optimize xfs_alloc_fix_freelist Subject: [PATCH 4/6] xfs: optimize xfs_alloc_fix_freelist References: <20110121092227.115815324@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-avoid-sync-transaction-for-freelist-refill 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: 1295601951 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 If we shorten the freelist in xfs_alloc_fix_freelist there is no need to wait for busy blocks as they will be marked busy again when we call xfs_free_ag_extent. Avoid this by not marking blocks coming from the freelist as busy in xfs_free_ag_extent, and not marking transactions with busy extents as synchronous in xfs_alloc_get_freelist. Unlike xfs_free_ag_extent which already has the isfl argument, xfs_alloc_get_freelist needs to be told about the usage of the blocks it returns. For this we extend the btreeblk flag to a type argument which specifies in detail what the block is going to be used for. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2011-01-17 22:18:20.421254585 +0100 +++ xfs/fs/xfs/xfs_alloc.c 2011-01-17 22:30:54.006256540 +0100 @@ -1395,7 +1395,8 @@ xfs_alloc_ag_vextent_small( else if (args->minlen == 1 && args->alignment == 1 && !args->isfl && (be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_flcount) > args->minleft)) { - error = xfs_alloc_get_freelist(args->tp, args->agbp, &fbno, 0); + error = xfs_alloc_get_freelist(args->tp, args->agbp, &fbno, + XFS_FREELIST_ALLOC); if (error) goto error0; if (fbno != NULLAGBLOCK) { @@ -1683,25 +1684,20 @@ xfs_free_ag_extent( if (error) goto error0; - if (!isfl) + if (!isfl) { xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len); + + /* + * Mark the extent busy unless it comes from the freelist, + * in which case it has already been marked busy. + */ + xfs_alloc_busy_insert(tp, agno, bno, len); + } + XFS_STATS_INC(xs_freex); XFS_STATS_ADD(xs_freeb, len); trace_xfs_free_extent(mp, agno, bno, len, isfl, haveleft, haveright); - - /* - * Since blocks move to the free list without the coordination - * used in xfs_bmap_finish, we can't allow block to be available - * for reallocation and non-transaction writing (user data) - * until we know that the transaction that moved it to the free - * list is permanently on disk. We track the blocks by declaring - * these blocks as "busy"; the busy list is maintained on a per-ag - * basis and each transaction records which entries should be removed - * when the iclog commits to disk. If a busy block is allocated, - * the iclog is pushed up to the LSN that freed the block. - */ - xfs_alloc_busy_insert(tp, agno, bno, len); return 0; error0: @@ -1873,11 +1869,14 @@ xfs_alloc_fix_freelist( while (be32_to_cpu(agf->agf_flcount) > need) { xfs_buf_t *bp; - error = xfs_alloc_get_freelist(tp, agbp, &bno, 0); + error = xfs_alloc_get_freelist(tp, agbp, &bno, + XFS_FREELIST_BALANCE); if (error) return error; - if ((error = xfs_free_ag_extent(tp, agbp, args->agno, bno, 1, 1))) + error = xfs_free_ag_extent(tp, agbp, args->agno, bno, 1, 1); + if (error) return error; + bp = xfs_btree_get_bufs(mp, tp, args->agno, bno, 0); xfs_trans_binval(tp, bp); } @@ -1944,18 +1943,18 @@ xfs_alloc_get_freelist( xfs_trans_t *tp, /* transaction pointer */ xfs_buf_t *agbp, /* buffer containing the agf structure */ xfs_agblock_t *bnop, /* block address retrieved from freelist */ - int btreeblk) /* destination is a AGF btree */ + int type) /* where does the allocation go to? */ { - xfs_agf_t *agf; /* a.g. freespace structure */ + xfs_mount_t *mp = tp->t_mountp; + xfs_agf_t *agf = XFS_BUF_TO_AGF(agbp); + xfs_agnumber_t agno = be32_to_cpu(agf->agf_seqno); xfs_agfl_t *agfl; /* a.g. freelist structure */ xfs_buf_t *agflbp;/* buffer for a.g. freelist structure */ xfs_agblock_t bno; /* block number returned */ int error; int logflags; - xfs_mount_t *mp; /* mount structure */ xfs_perag_t *pag; /* per allocation group data */ - agf = XFS_BUF_TO_AGF(agbp); /* * Freelist is empty, give up. */ @@ -1963,14 +1962,15 @@ xfs_alloc_get_freelist( *bnop = NULLAGBLOCK; return 0; } + /* * Read the array of free blocks. */ - mp = tp->t_mountp; - if ((error = xfs_alloc_read_agfl(mp, tp, - be32_to_cpu(agf->agf_seqno), &agflbp))) + error = xfs_alloc_read_agfl(mp, tp, agno, &agflbp); + if (error) return error; agfl = XFS_BUF_TO_AGFL(agflbp); + /* * Get the block number and update the data structures. */ @@ -1980,14 +1980,14 @@ xfs_alloc_get_freelist( if (be32_to_cpu(agf->agf_flfirst) == XFS_AGFL_SIZE(mp)) agf->agf_flfirst = 0; - pag = xfs_perag_get(mp, be32_to_cpu(agf->agf_seqno)); + pag = xfs_perag_get(mp, agno); be32_add_cpu(&agf->agf_flcount, -1); xfs_trans_agflist_delta(tp, -1); pag->pagf_flcount--; xfs_perag_put(pag); logflags = XFS_AGF_FLFIRST | XFS_AGF_FLCOUNT; - if (btreeblk) { + if (type == XFS_FREELIST_BTREE) { be32_add_cpu(&agf->agf_btreeblks, 1); pag->pagf_btreeblks++; logflags |= XFS_AGF_BTREEBLKS; @@ -2009,8 +2009,11 @@ xfs_alloc_get_freelist( * that we don't sit and wait with the AGF locked in the transaction * during the log force. */ - if (xfs_alloc_busy_search(mp, be32_to_cpu(agf->agf_seqno), bno, 1)) - xfs_trans_set_sync(tp); + if (type != XFS_FREELIST_BALANCE) { + if (xfs_alloc_busy_search(mp, agno, bno, 1)) + xfs_trans_set_sync(tp); + } + return 0; } Index: xfs/fs/xfs/xfs_alloc.h =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.h 2011-01-17 22:23:05.168004061 +0100 +++ xfs/fs/xfs/xfs_alloc.h 2011-01-17 22:30:06.456005528 +0100 @@ -140,6 +140,13 @@ xfs_alloc_compute_maxlevels( struct xfs_mount *mp); /* file system mount structure */ /* + * Destination of blocks allocated by xfs_alloc_get_freelist. + */ +#define XFS_FREELIST_ALLOC 0 +#define XFS_FREELIST_BTREE 1 +#define XFS_FREELIST_BALANCE 2 + +/* * Get a block from the freelist. * Returns with the buffer for the block gotten. */ Index: xfs/fs/xfs/xfs_alloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc_btree.c 2011-01-17 22:23:05.155004271 +0100 +++ xfs/fs/xfs/xfs_alloc_btree.c 2011-01-17 22:24:35.867255145 +0100 @@ -83,7 +83,7 @@ xfs_allocbt_alloc_block( /* Allocate the new block from the freelist. If we can't, give up. */ error = xfs_alloc_get_freelist(cur->bc_tp, cur->bc_private.a.agbp, - &bno, 1); + &bno, XFS_FREELIST_BTREE); if (error) { XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); return error; From BATV+6d14dc3b11b97b80ed4a+2707+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 21 03:23:34 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0L9NX9X260911 for ; Fri, 21 Jan 2011 03:23:34 -0600 X-ASG-Debug-ID: 1295601951-082201960000-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 67C6319FBC00 for ; Fri, 21 Jan 2011 01:25:51 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id rsUyrIq4gcen5dDf for ; Fri, 21 Jan 2011 01:25:51 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PgDFe-0002Bn-9h for xfs@oss.sgi.com; Fri, 21 Jan 2011 09:25:50 +0000 Message-Id: <20110121092227.115815324@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 21 Jan 2011 04:22:27 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/6] do not reuse busy extents Subject: [PATCH 0/6] do not reuse busy extents 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: 1295601953 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 series makes sure we never reallocated a busy extent. This is absolutely needed for a working online discard implementation, and should also speed up large concurrent workloads that would trip over a busy extents a lot. The two most significant patches are from a series Dave posted mored than two years ago, although the main patch to avoid busy ranges in the normal allocator need a lot of bug fixes to survived QA. In addition to that we now also completely avoid resues for AGFL based allocations. While this might not be important from a performance perspectice it is critical for the discard implementation I'm currently working on. From BATV+6d14dc3b11b97b80ed4a+2707+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 21 03:23:38 2011 X-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 (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p0L9NZhI260935 for ; Fri, 21 Jan 2011 03:23:37 -0600 X-ASG-Debug-ID: 1295601952-141802180000-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 E4B7E148BB81 for ; Fri, 21 Jan 2011 01:25:52 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id KpMGC7jD1DfCCjBO for ; Fri, 21 Jan 2011 01:25:52 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PgDFf-0002Ex-La for xfs@oss.sgi.com; Fri, 21 Jan 2011 09:25:51 +0000 Message-Id: <20110121092551.629220945@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 21 Jan 2011 04:22:33 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 6/6] xfs: remove handling of duplicates the busy extent tree Subject: [PATCH 6/6] xfs: remove handling of duplicates the busy extent tree References: <20110121092227.115815324@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-remove-duplicate-extent-handling 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: 1295601954 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 the recent changes we never re-used busy extents. Remove all handling of them and replace them with asserts. This also effectively reverts commit 955833cf2ad0aa39b336e853cad212d867199984 "xfs: make the log ticket ID available outside the log infrastructure" Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_ag.h =================================================================== --- xfs.orig/fs/xfs/xfs_ag.h 2011-01-18 13:06:47.588254235 +0100 +++ xfs/fs/xfs/xfs_ag.h 2011-01-18 13:07:05.608012022 +0100 @@ -187,7 +187,6 @@ struct xfs_busy_extent { xfs_agnumber_t agno; xfs_agblock_t bno; xfs_extlen_t length; - xlog_tid_t tid; /* transaction that created this */ int flags; }; Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2011-01-18 13:06:47.595254654 +0100 +++ xfs/fs/xfs/xfs_alloc.c 2011-01-18 13:08:34.000000000 +0100 @@ -2518,83 +2518,7 @@ error0: /* * Insert a new extent into the busy tree. * - * The busy extent tree is indexed by the start block of the busy extent. - * there can be multiple overlapping ranges in the busy extent tree but only - * ever one entry at a given start block. The reason for this is that - * multi-block extents can be freed, then smaller chunks of that extent - * allocated and freed again before the first transaction commit is on disk. - * If the exact same start block is freed a second time, we have to wait for - * that busy extent to pass out of the tree before the new extent is inserted. - * There are two main cases we have to handle here. - * - * The first case is a transaction that triggers a "free - allocate - free" - * cycle. This can occur during btree manipulations as a btree block is freed - * to the freelist, then allocated from the free list, then freed again. In - * this case, the second extxpnet free is what triggers the duplicate and as - * such the transaction IDs should match. Because the extent was allocated in - * this transaction, the transaction must be marked as synchronous. This is - * true for all cases where the free/alloc/free occurs in the one transaction, - * hence the addition of the ASSERT(tp->t_flags & XFS_TRANS_SYNC) to this case. - * This serves to catch violations of the second case quite effectively. - * - * The second case is where the free/alloc/free occur in different - * transactions. In this case, the thread freeing the extent the second time - * can't mark the extent busy immediately because it is already tracked in a - * transaction that may be committing. When the log commit for the existing - * busy extent completes, the busy extent will be removed from the tree. If we - * allow the second busy insert to continue using that busy extent structure, - * it can be freed before this transaction is safely in the log. Hence our - * only option in this case is to force the log to remove the existing busy - * extent from the list before we insert the new one with the current - * transaction ID. - * - * The problem we are trying to avoid in the free-alloc-free in separate - * transactions is most easily described with a timeline: - * - * Thread 1 Thread 2 Thread 3 xfslogd - * xact alloc - * free X - * mark busy - * commit xact - * free xact - * xact alloc - * alloc X - * busy search - * mark xact sync - * commit xact - * free xact - * force log - * checkpoint starts - * .... - * xact alloc - * free X - * mark busy - * finds match - * *** KABOOM! *** - * .... - * log IO completes - * unbusy X - * checkpoint completes - * - * By issuing a log force in thread 3 @ "KABOOM", the thread will block until - * the checkpoint completes, and the busy extent it matched will have been - * removed from the tree when it is woken. Hence it can then continue safely. - * - * However, to ensure this matching process is robust, we need to use the - * transaction ID for identifying transaction, as delayed logging results in - * the busy extent and transaction lifecycles being different. i.e. the busy - * extent is active for a lot longer than the transaction. Hence the - * transaction structure can be freed and reallocated, then mark the same - * extent busy again in the new transaction. In this case the new transaction - * will have a different tid but can have the same address, and hence we need - * to check against the tid. - * - * Future: for delayed logging, we could avoid the log force if the extent was - * first freed in the current checkpoint sequence. This, however, requires the - * ability to pin the current checkpoint in memory until this transaction - * commits to ensure that both the original free and the current one combine - * logically into the one checkpoint. If the checkpoint sequences are - * different, however, we still need to wait on a log force. + * The busy extent tree is indexed by the start block of the busy extent */ STATIC void xfs_alloc_busy_insert( @@ -2609,8 +2533,6 @@ xfs_alloc_busy_insert( struct xfs_perag *pag; struct rb_node **rbp; struct rb_node *parent; - int match; - new = kmem_zalloc(sizeof(struct xfs_busy_extent), KM_MAYFAIL); if (!new) { @@ -2628,74 +2550,35 @@ xfs_alloc_busy_insert( new->bno = bno; new->length = len; new->flags = flags; - new->tid = xfs_log_get_trans_ident(tp); - INIT_LIST_HEAD(&new->list); /* trace before insert to be able to see failed inserts */ trace_xfs_alloc_busy(tp, agno, bno, len, 0); pag = xfs_perag_get(tp->t_mountp, new->agno); -restart: spin_lock(&pag->pagb_lock); rbp = &pag->pagb_tree.rb_node; parent = NULL; - busyp = NULL; - match = 0; - while (*rbp && match >= 0) { + while (*rbp) { parent = *rbp; busyp = rb_entry(parent, struct xfs_busy_extent, rb_node); if (new->bno < busyp->bno) { - /* may overlap, but exact start block is lower */ + ASSERT(new->bno + new->length <= busyp->bno); rbp = &(*rbp)->rb_left; - if (new->bno + new->length > busyp->bno) - match = busyp->tid == new->tid ? 1 : -1; - } else if (new->bno > busyp->bno) { - /* may overlap, but exact start block is higher */ - rbp = &(*rbp)->rb_right; - if (bno < busyp->bno + busyp->length) - match = busyp->tid == new->tid ? 1 : -1; } else { - match = busyp->tid == new->tid ? 1 : -1; - break; + ASSERT(new->bno > busyp->bno); + ASSERT(bno >= busyp->bno + busyp->length); + rbp = &(*rbp)->rb_right; } } - if (match < 0) { - /* overlap marked busy in different transaction */ - spin_unlock(&pag->pagb_lock); - xfs_log_force(tp->t_mountp, XFS_LOG_SYNC); - goto restart; - } - if (match > 0) { - /* - * overlap marked busy in same transaction. Update if exact - * start block match, otherwise combine the busy extents into - * a single range. - */ - if (busyp->bno == new->bno) { - busyp->length = max(busyp->length, new->length); - spin_unlock(&pag->pagb_lock); - ASSERT(tp->t_flags & XFS_TRANS_SYNC); - xfs_perag_put(pag); - kmem_free(new); - return; - } - rb_erase(&busyp->rb_node, &pag->pagb_tree); - new->length = max(busyp->bno + busyp->length, - new->bno + new->length) - - min(busyp->bno, new->bno); - new->bno = min(busyp->bno, new->bno); - } else - busyp = NULL; rb_link_node(&new->rb_node, parent, rbp); rb_insert_color(&new->rb_node, &pag->pagb_tree); - list_add(&new->list, &tp->t_busy); + spin_unlock(&pag->pagb_lock); xfs_perag_put(pag); - kmem_free(busyp); } /* Index: xfs/fs/xfs/xfs_log.c =================================================================== --- xfs.orig/fs/xfs/xfs_log.c 2011-01-18 13:06:47.612254724 +0100 +++ xfs/fs/xfs/xfs_log.c 2011-01-18 13:07:05.929013420 +0100 @@ -3256,13 +3256,6 @@ xfs_log_ticket_get( return ticket; } -xlog_tid_t -xfs_log_get_trans_ident( - struct xfs_trans *tp) -{ - return tp->t_ticket->t_tid; -} - /* * Allocate and initialise a new log ticket. */ Index: xfs/fs/xfs/xfs_log.h =================================================================== --- xfs.orig/fs/xfs/xfs_log.h 2011-01-18 13:06:47.618254514 +0100 +++ xfs/fs/xfs/xfs_log.h 2011-01-18 13:07:05.936017889 +0100 @@ -189,8 +189,6 @@ void xlog_iodone(struct xfs_buf *); struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket); void xfs_log_ticket_put(struct xlog_ticket *ticket); -xlog_tid_t xfs_log_get_trans_ident(struct xfs_trans *tp); - int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, struct xfs_log_vec *log_vector, xfs_lsn_t *commit_lsn, int flags); Index: xfs/fs/xfs/xfs_log_priv.h =================================================================== --- xfs.orig/fs/xfs/xfs_log_priv.h 2011-01-18 13:06:47.625253956 +0100 +++ xfs/fs/xfs/xfs_log_priv.h 2011-01-18 13:07:05.951006924 +0100 @@ -148,6 +148,8 @@ static inline uint xlog_get_client_id(__ #define XLOG_RECOVERY_NEEDED 0x4 /* log was recovered */ #define XLOG_IO_ERROR 0x8 /* log hit an I/O error, and being shutdown */ +typedef __uint32_t xlog_tid_t; + #ifdef __KERNEL__ /* Index: xfs/fs/xfs/xfs_types.h =================================================================== --- xfs.orig/fs/xfs/xfs_types.h 2011-01-18 13:06:47.645254026 +0100 +++ xfs/fs/xfs/xfs_types.h 2011-01-18 13:07:05.958005458 +0100 @@ -73,8 +73,6 @@ typedef __int32_t xfs_tid_t; /* transact typedef __uint32_t xfs_dablk_t; /* dir/attr block number (in file) */ typedef __uint32_t xfs_dahash_t; /* dir/attr hash value */ -typedef __uint32_t xlog_tid_t; /* transaction ID type */ - /* * These types are 64 bits on disk but are either 32 or 64 bits in memory. * Disk based types: From BATV+6d14dc3b11b97b80ed4a+2707+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 21 03:23:34 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0L9NXdg260913 for ; Fri, 21 Jan 2011 03:23:34 -0600 X-ASG-Debug-ID: 1295601952-038c01fb0000-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 781B819FBC01 for ; Fri, 21 Jan 2011 01:25:52 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id YGxC0xmL2Nq399xl for ; Fri, 21 Jan 2011 01:25:52 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PgDFf-0002ES-Et; Fri, 21 Jan 2011 09:25:51 +0000 Message-Id: <20110121092551.402449845@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 21 Jan 2011 04:22:32 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: Dave Chinner X-ASG-Orig-Subj: [PATCH 5/6] xfs: do not classify freed allocation btree blocks as busy Subject: [PATCH 5/6] xfs: do not classify freed allocation btree blocks as busy References: <20110121092227.115815324@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-optimize-busy-btree-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: 1295601953 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 During an allocation or freeing of an extent, we occasionally have an interesting situation happen during a btree update. We may merge a block as part of a record delete, then allocate it again immediately afterwards when inserting a modified extent. xfs_alloc_fixup_trees() does this sort of manipulation to the btrees, and so can merge then immediately split the tree resulting the in the same busy block being used from the freelist. Previously, this would trigger a synchronous log force of the entire log (as the current transaction had a lsn of 0 until committed), but continue to allow the extent to be used because if it is not on disk now then it must have been freed and marked busy in this transaction. In the case of allocbt blocks, we log the fact that they get moved to the freelist and we also log them when the move off the free list back into the free space trees. When we move the blocks off the freelist back to the trees, we mark the extent busy at that point so that it doesn't get reused until the transaction is committed. This means that as long as the block is on the AGFL and is only used for allocbt blocks, we don't have to force the log to ensure prior manipulating transactions are on disk as the process of log recovery will replay the transactions in the correct order. However, we still need to protect against the fact that as we approach ENOSPC in an AG we can allocate data and metadata blocks direct from the AGFL. In this case, we need to treat btree blocks just like any other busy extent. Hence we still need to track btree blocks in the busy extent tree, but we need to distinguish them from normal extents so we can apply the necessary exceptions for btree block allocation. Signed-off-by: Dave Chinner Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_ag.h =================================================================== --- xfs.orig/fs/xfs/xfs_ag.h 2011-01-17 22:03:15.000000000 +0100 +++ xfs/fs/xfs/xfs_ag.h 2011-01-17 22:32:06.541004201 +0100 @@ -188,6 +188,11 @@ struct xfs_busy_extent { xfs_agblock_t bno; xfs_extlen_t length; xlog_tid_t tid; /* transaction that created this */ + int flags; +}; + +enum { + XFS_BUSY_FREELIST = 0x0001, /* busy extent on freelist from abt */ }; /* Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2011-01-17 22:30:54.000000000 +0100 +++ xfs/fs/xfs/xfs_alloc.c 2011-01-17 22:39:29.021005529 +0100 @@ -46,8 +46,12 @@ STATIC int xfs_alloc_ag_vextent_near(xfs STATIC int xfs_alloc_ag_vextent_size(xfs_alloc_arg_t *); STATIC int xfs_alloc_ag_vextent_small(xfs_alloc_arg_t *, xfs_btree_cur_t *, xfs_agblock_t *, xfs_extlen_t *, int *); +STATIC void xfs_alloc_busy_insert(struct xfs_trans *, xfs_agnumber_t, + xfs_agblock_t, xfs_extlen_t, int); STATIC int xfs_alloc_busy_search(struct xfs_mount *, xfs_agnumber_t, xfs_agblock_t, xfs_extlen_t); +STATIC void xfs_alloc_busy_force(struct xfs_mount *, xfs_agnumber_t, + xfs_agblock_t, xfs_extlen_t, int); /* * Internal functions. @@ -1691,7 +1695,7 @@ xfs_free_ag_extent( * Mark the extent busy unless it comes from the freelist, * in which case it has already been marked busy. */ - xfs_alloc_busy_insert(tp, agno, bno, len); + xfs_alloc_busy_insert(tp, agno, bno, len, 0); } XFS_STATS_INC(xs_freex); @@ -1996,22 +2000,23 @@ xfs_alloc_get_freelist( xfs_alloc_log_agf(tp, agbp, logflags); *bnop = bno; - /* - * As blocks are freed, they are added to the per-ag busy list and - * remain there until the freeing transaction is committed to disk. - * Now that we have allocated blocks, this list must be searched to see - * if a block is being reused. If one is, then the freeing transaction - * must be pushed to disk before this transaction. - * - * We do this by setting the current transaction to a sync transaction - * which guarantees that the freeing transaction is on disk before this - * transaction. This is done instead of a synchronous log force here so - * that we don't sit and wait with the AGF locked in the transaction - * during the log force. - */ if (type != XFS_FREELIST_BALANCE) { - if (xfs_alloc_busy_search(mp, agno, bno, 1)) - xfs_trans_set_sync(tp); + /* + * If this block is marked busy we may have to force out the + * log to prevent reuse until the freeing transaction has been + * commited. + * + * If we're just allocating the block to rebalance the the + * freelist size we can skip this exercise as the block + * just keeps its busy marking while migrating to the + * allocation btree. + * + * If the block was freed from a btree and gets reallocated + * to it we may skip the log force, but details are handled + * by xfs_alloc_busy_force. + */ + xfs_alloc_busy_force(mp, agno, bno, 1, + type == XFS_FREELIST_BTREE); } return 0; @@ -2081,26 +2086,27 @@ xfs_alloc_put_freelist( xfs_agblock_t bno, /* block being freed */ int btreeblk) /* block came from a AGF btree */ { - xfs_agf_t *agf; /* a.g. freespace structure */ + xfs_mount_t *mp = tp->t_mountp; + xfs_agf_t *agf = XFS_BUF_TO_AGF(agbp); + xfs_agnumber_t agno = be32_to_cpu(agf->agf_seqno); xfs_agfl_t *agfl; /* a.g. free block array */ __be32 *blockp;/* pointer to array entry */ int error; int logflags; - xfs_mount_t *mp; /* mount structure */ xfs_perag_t *pag; /* per allocation group data */ - agf = XFS_BUF_TO_AGF(agbp); - mp = tp->t_mountp; + if (!agflbp) { + error = xfs_alloc_read_agfl(mp, tp, agno, &agflbp); + if (error) + return error; + } - if (!agflbp && (error = xfs_alloc_read_agfl(mp, tp, - be32_to_cpu(agf->agf_seqno), &agflbp))) - return error; agfl = XFS_BUF_TO_AGFL(agflbp); be32_add_cpu(&agf->agf_fllast, 1); if (be32_to_cpu(agf->agf_fllast) == XFS_AGFL_SIZE(mp)) agf->agf_fllast = 0; - pag = xfs_perag_get(mp, be32_to_cpu(agf->agf_seqno)); + pag = xfs_perag_get(mp, agno); be32_add_cpu(&agf->agf_flcount, 1); xfs_trans_agflist_delta(tp, 1); pag->pagf_flcount++; @@ -2123,6 +2129,14 @@ xfs_alloc_put_freelist( (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl), (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl + sizeof(xfs_agblock_t) - 1)); + + /* + * If it's a btree block, mark it busy as it has just been freed. + * Otherwise we are just replenishing the free list with extents + * that are already free so we don't need to track them. + */ + if (btreeblk) + xfs_alloc_busy_insert(tp, agno, bno, 1, XFS_BUSY_FREELIST); return 0; } @@ -2582,12 +2596,13 @@ error0: * logically into the one checkpoint. If the checkpoint sequences are * different, however, we still need to wait on a log force. */ -void +STATIC void xfs_alloc_busy_insert( struct xfs_trans *tp, xfs_agnumber_t agno, xfs_agblock_t bno, - xfs_extlen_t len) + xfs_extlen_t len, + int flags) { struct xfs_busy_extent *new; struct xfs_busy_extent *busyp; @@ -2612,6 +2627,7 @@ xfs_alloc_busy_insert( new->agno = agno; new->bno = bno; new->length = len; + new->flags = flags; new->tid = xfs_log_get_trans_ident(tp); INIT_LIST_HEAD(&new->list); @@ -2733,6 +2749,62 @@ xfs_alloc_busy_search( return match; } +STATIC void +xfs_alloc_busy_force( + struct xfs_mount *mp, + xfs_agnumber_t agno, + xfs_agblock_t bno, + xfs_extlen_t len, + int btreeblk) +{ + struct xfs_perag *pag; + struct rb_node *rbp; + struct xfs_busy_extent *busyp; + int match = 0; + + pag = xfs_perag_get(mp, agno); + spin_lock(&pag->pagb_lock); + + rbp = pag->pagb_tree.rb_node; + + /* find closest start bno overlap */ + while (rbp) { + busyp = rb_entry(rbp, struct xfs_busy_extent, rb_node); + if (bno < busyp->bno) { + /* may overlap, but exact start block is lower */ + if (bno + len > busyp->bno) { + match = 1; + break; + } + rbp = rbp->rb_left; + } else if (bno > busyp->bno) { + /* may overlap, but exact start block is higher */ + if (bno < busyp->bno + busyp->length) { + match = 1; + break; + } + rbp = rbp->rb_right; + } else { + /* bno matches busyp, length determines exact match */ + match = 1; + break; + } + } + + if (match && btreeblk && (busyp->flags & XFS_BUSY_FREELIST)) { + list_del_init(&busyp->list); + rb_erase(&busyp->rb_node, &pag->pagb_tree); + kmem_free(busyp); + match = 0; + } + spin_unlock(&pag->pagb_lock); + trace_xfs_alloc_busysearch(mp, agno, bno, len, !!match); + xfs_perag_put(pag); + + if (match) + xfs_log_force(mp, XFS_LOG_SYNC); +} + /* * For a given extent [fbno, flen], search the busy extent list * to find a subset of the extent that is not busy. Index: xfs/fs/xfs/xfs_alloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc_btree.c 2011-01-17 22:24:35.000000000 +0100 +++ xfs/fs/xfs/xfs_alloc_btree.c 2011-01-17 22:32:06.550048202 +0100 @@ -109,7 +109,6 @@ xfs_allocbt_free_block( struct xfs_buf *bp) { struct xfs_buf *agbp = cur->bc_private.a.agbp; - struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); xfs_agblock_t bno; int error; @@ -118,18 +117,6 @@ xfs_allocbt_free_block( if (error) return error; - /* - * Since blocks move to the free list without the coordination used in - * xfs_bmap_finish, we can't allow block to be available for - * reallocation and non-transaction writing (user data) until we know - * that the transaction that moved it to the free list is permanently - * on disk. We track the blocks by declaring these blocks as "busy"; - * the busy list is maintained on a per-ag basis and each transaction - * records which entries should be removed when the iclog commits to - * disk. If a busy block is allocated, the iclog is pushed up to the - * LSN that freed the block. - */ - xfs_alloc_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1); xfs_trans_agbtree_delta(cur->bc_tp, -1); return 0; } Index: xfs/fs/xfs/xfs_alloc.h =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.h 2011-01-17 22:30:06.456005528 +0100 +++ xfs/fs/xfs/xfs_alloc.h 2011-01-17 22:40:14.542034513 +0100 @@ -120,10 +120,6 @@ xfs_alloc_longest_free_extent(struct xfs #ifdef __KERNEL__ void -xfs_alloc_busy_insert(struct xfs_trans *tp, xfs_agnumber_t agno, - xfs_agblock_t bno, xfs_extlen_t len); - -void xfs_alloc_busy_clear(struct xfs_mount *mp, struct xfs_busy_extent *busyp); void @@ -140,7 +136,8 @@ xfs_alloc_compute_maxlevels( struct xfs_mount *mp); /* file system mount structure */ /* - * Destination of blocks allocated by xfs_alloc_get_freelist. + * Destination of blocks allocated by xfs_alloc_get_freelist / + * source of blocks freed by xfs_alloc_put_freelist. */ #define XFS_FREELIST_ALLOC 0 #define XFS_FREELIST_BTREE 1 From BATV+6d14dc3b11b97b80ed4a+2707+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 21 03:23:38 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0L9NZrj260934 for ; Fri, 21 Jan 2011 03:23:37 -0600 X-ASG-Debug-ID: 1295601952-144301f70000-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 3E956148BD24 for ; Fri, 21 Jan 2011 01:25:52 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id PQwER3nw3GEnV2jQ for ; Fri, 21 Jan 2011 01:25:52 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PgDFe-0002Cv-OH for xfs@oss.sgi.com; Fri, 21 Jan 2011 09:25:50 +0000 Message-Id: <20110121092550.694829728@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 21 Jan 2011 04:22:29 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/6] xfs: factor agf counter updates into a helper Subject: [PATCH 2/6] xfs: factor agf counter updates into a helper References: <20110121092227.115815324@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-alloc-factor-counter-updates 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: 1295601955 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 Updating the AGF/trans counters is duplicated between allocating and freeing extents. Factor the code into a common helper. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2011-01-03 13:11:28.893004699 +0100 +++ xfs/fs/xfs/xfs_alloc.c 2011-01-03 13:16:06.213254734 +0100 @@ -463,6 +463,27 @@ xfs_alloc_read_agfl( return 0; } +STATIC int +xfs_alloc_update_counters( + struct xfs_trans *tp, + struct xfs_perag *pag, + struct xfs_buf *agbp, + long len) +{ + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); + + pag->pagf_freeblks += len; + be32_add_cpu(&agf->agf_freeblks, len); + + xfs_trans_agblocks_delta(tp, len); + if (unlikely(be32_to_cpu(agf->agf_freeblks) > + be32_to_cpu(agf->agf_length))) + return EFSCORRUPTED; + + xfs_alloc_log_agf(tp, agbp, XFS_AGF_FREEBLKS); + return 0; +} + /* * Allocation group level functions. */ @@ -504,48 +525,40 @@ xfs_alloc_ag_vextent( ASSERT(0); /* NOTREACHED */ } - if (error) + + if (error || args->agbno == NULLAGBLOCK) return error; - /* - * If the allocation worked, need to change the agf structure - * (and log it), and the superblock. - */ - if (args->agbno != NULLAGBLOCK) { - xfs_agf_t *agf; /* allocation group freelist header */ - long slen = (long)args->len; - - ASSERT(args->len >= args->minlen && args->len <= args->maxlen); - ASSERT(!(args->wasfromfl) || !args->isfl); - ASSERT(args->agbno % args->alignment == 0); - if (!(args->wasfromfl)) { - - agf = XFS_BUF_TO_AGF(args->agbp); - be32_add_cpu(&agf->agf_freeblks, -(args->len)); - xfs_trans_agblocks_delta(args->tp, - -((long)(args->len))); - args->pag->pagf_freeblks -= args->len; - ASSERT(be32_to_cpu(agf->agf_freeblks) <= - be32_to_cpu(agf->agf_length)); - xfs_alloc_log_agf(args->tp, args->agbp, - XFS_AGF_FREEBLKS); - /* - * Search the busylist for these blocks and mark the - * transaction as synchronous if blocks are found. This - * avoids the need to block due to a synchronous log - * force to ensure correct ordering as the synchronous - * transaction will guarantee that for us. - */ - if (xfs_alloc_busy_search(args->mp, args->agno, - args->agbno, args->len)) - xfs_trans_set_sync(args->tp); - } - if (!args->isfl) - xfs_trans_mod_sb(args->tp, - args->wasdel ? XFS_TRANS_SB_RES_FDBLOCKS : - XFS_TRANS_SB_FDBLOCKS, -slen); - XFS_STATS_INC(xs_allocx); - XFS_STATS_ADD(xs_allocb, args->len); + + ASSERT(args->len >= args->minlen); + ASSERT(args->len <= args->maxlen); + ASSERT(!args->wasfromfl || !args->isfl); + ASSERT(args->agbno % args->alignment == 0); + + if (!args->wasfromfl) { + xfs_alloc_update_counters(args->tp, args->pag, args->agbp, + -((long)(args->len))); + + /* + * Search the busylist for these blocks and mark the + * transaction as synchronous if blocks are found. This + * avoids the need to block due to a synchronous log + * force to ensure correct ordering as the synchronous + * transaction will guarantee that for us. + */ + if (xfs_alloc_busy_search(args->mp, args->agno, + args->agbno, args->len)) + xfs_trans_set_sync(args->tp); + } + + if (!args->isfl) { + xfs_trans_mod_sb(args->tp, args->wasdel ? + XFS_TRANS_SB_RES_FDBLOCKS : + XFS_TRANS_SB_FDBLOCKS, + -((long)(args->len))); } + + XFS_STATS_INC(xs_allocx); + XFS_STATS_ADD(xs_allocb, args->len); return 0; } @@ -1385,6 +1398,7 @@ xfs_free_ag_extent( xfs_mount_t *mp; /* mount point struct for filesystem */ xfs_agblock_t nbno; /* new starting block of freespace */ xfs_extlen_t nlen; /* new length of freespace */ + xfs_perag_t *pag; /* per allocation group data */ mp = tp->t_mountp; /* @@ -1583,30 +1597,20 @@ xfs_free_ag_extent( XFS_WANT_CORRUPTED_GOTO(i == 1, error0); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); cnt_cur = NULL; + /* * Update the freespace totals in the ag and superblock. */ - { - xfs_agf_t *agf; - xfs_perag_t *pag; /* per allocation group data */ - - pag = xfs_perag_get(mp, agno); - pag->pagf_freeblks += len; - xfs_perag_put(pag); - - agf = XFS_BUF_TO_AGF(agbp); - be32_add_cpu(&agf->agf_freeblks, len); - xfs_trans_agblocks_delta(tp, len); - XFS_WANT_CORRUPTED_GOTO( - be32_to_cpu(agf->agf_freeblks) <= - be32_to_cpu(agf->agf_length), - error0); - xfs_alloc_log_agf(tp, agbp, XFS_AGF_FREEBLKS); - if (!isfl) - xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len); - XFS_STATS_INC(xs_freex); - XFS_STATS_ADD(xs_freeb, len); - } + pag = xfs_perag_get(mp, agno); + error = xfs_alloc_update_counters(tp, pag, agbp, len); + xfs_perag_put(pag); + if (error) + goto error0; + + if (!isfl) + xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len); + XFS_STATS_INC(xs_freex); + XFS_STATS_ADD(xs_freeb, len); trace_xfs_free_extent(mp, agno, bno, len, isfl, haveleft, haveright); From BATV+6d14dc3b11b97b80ed4a+2707+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 21 03:23:34 2011 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_61, J_CHICKENPOX_64,J_CHICKENPOX_65,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 p0L9NXv5260912 for ; Fri, 21 Jan 2011 03:23:34 -0600 X-ASG-Debug-ID: 1295601952-045601d30000-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 9BD3019FBC03 for ; Fri, 21 Jan 2011 01:25:52 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id QdpctY9i5JDm3ITC for ; Fri, 21 Jan 2011 01:25:52 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PgDFe-0002DR-Vu; Fri, 21 Jan 2011 09:25:51 +0000 Message-Id: <20110121092550.933551564@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 21 Jan 2011 04:22:30 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: Dave Chinner X-ASG-Orig-Subj: [PATCH 3/6] xfs: do not immediately reuse busy extent ranges Subject: [PATCH 3/6] xfs: do not immediately reuse busy extent ranges References: <20110121092227.115815324@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-skip-busy-extents 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: 1295601953 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 Every time we reallocate a busy extent, we cause a synchronous log force to occur to ensure the freeing transaction is on disk before we continue and use the newly allocated extent. This is extremely sub-optimal as we have to mark every transaction with blocks that get reused as synchronous. Instead of searching the busy extent list after deciding on the extent to allocate, check each candidate extent during the allocation decisions as to whether they are in the busy list. If they are in the busy list, we trim the busy range out of the extent we have found and determine if that trimmed range is still OK for allocation. In many cases, this check can be incorporated into the allocation extent alignment code which already does trimming of the found extent before determining if it is a valid candidate for allocation. [hch: merged two earlier patches from Dave and fixed various bugs] Signed-off-by: Dave Chinner Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2011-01-17 22:05:27.146004341 +0100 +++ xfs/fs/xfs/xfs_alloc.c 2011-01-18 13:04:30.239023407 +0100 @@ -41,15 +41,13 @@ #define XFSA_FIXUP_BNO_OK 1 #define XFSA_FIXUP_CNT_OK 2 -/* - * Prototypes for per-ag allocation routines - */ - STATIC int xfs_alloc_ag_vextent_exact(xfs_alloc_arg_t *); STATIC int xfs_alloc_ag_vextent_near(xfs_alloc_arg_t *); STATIC int xfs_alloc_ag_vextent_size(xfs_alloc_arg_t *); STATIC int xfs_alloc_ag_vextent_small(xfs_alloc_arg_t *, - xfs_btree_cur_t *, xfs_agblock_t *, xfs_extlen_t *, int *); + xfs_btree_cur_t *, xfs_agblock_t *, xfs_extlen_t *, int *); +STATIC int xfs_alloc_busy_search(struct xfs_mount *, xfs_agnumber_t, + xfs_agblock_t, xfs_extlen_t); /* * Internal functions. @@ -154,19 +152,23 @@ xfs_alloc_compute_aligned( xfs_extlen_t *reslen) /* result length */ { xfs_agblock_t bno; - xfs_extlen_t diff; xfs_extlen_t len; - if (args->alignment > 1 && foundlen >= args->minlen) { - bno = roundup(foundbno, args->alignment); - diff = bno - foundbno; - len = diff >= foundlen ? 0 : foundlen - diff; + /* Trim busy sections out of found extent */ + xfs_alloc_busy_search_trim(args->mp, args->pag, foundbno, foundlen, + &bno, &len); + + if (args->alignment > 1 && len >= args->minlen) { + xfs_agblock_t aligned_bno = roundup(bno, args->alignment); + xfs_extlen_t diff = aligned_bno - bno; + + *resbno = aligned_bno; + *reslen = diff >= len ? 0 : len - diff; + } else { - bno = foundbno; - len = foundlen; + *resbno = bno; + *reslen = len; } - *resbno = bno; - *reslen = len; } /* @@ -535,19 +537,12 @@ xfs_alloc_ag_vextent( ASSERT(args->agbno % args->alignment == 0); if (!args->wasfromfl) { - xfs_alloc_update_counters(args->tp, args->pag, args->agbp, - -((long)(args->len))); + error = xfs_alloc_update_counters(args->tp, args->pag, + args->agbp, + -((long)(args->len))); - /* - * Search the busylist for these blocks and mark the - * transaction as synchronous if blocks are found. This - * avoids the need to block due to a synchronous log - * force to ensure correct ordering as the synchronous - * transaction will guarantee that for us. - */ - if (xfs_alloc_busy_search(args->mp, args->agno, - args->agbno, args->len)) - xfs_trans_set_sync(args->tp); + ASSERT(!xfs_alloc_busy_search(args->mp, args->agno, + args->agbno, args->len)); } if (!args->isfl) { @@ -559,7 +554,7 @@ xfs_alloc_ag_vextent( XFS_STATS_INC(xs_allocx); XFS_STATS_ADD(xs_allocb, args->len); - return 0; + return error; } /* @@ -574,14 +569,14 @@ xfs_alloc_ag_vextent_exact( { xfs_btree_cur_t *bno_cur;/* by block-number btree cursor */ xfs_btree_cur_t *cnt_cur;/* by count btree cursor */ - xfs_agblock_t end; /* end of allocated extent */ int error; xfs_agblock_t fbno; /* start block of found extent */ - xfs_agblock_t fend; /* end block of found extent */ xfs_extlen_t flen; /* length of found extent */ + xfs_agblock_t tbno; /* start block of trimmed extent */ + xfs_extlen_t tlen; /* length of trimmed extent */ + xfs_agblock_t tend; /* end block of trimmed extent */ + xfs_agblock_t end; /* end of allocated extent */ int i; /* success/failure of operation */ - xfs_agblock_t maxend; /* end of maximal extent */ - xfs_agblock_t minend; /* end of minimal extent */ xfs_extlen_t rlen; /* length of returned extent */ ASSERT(args->alignment == 1); @@ -611,14 +606,21 @@ xfs_alloc_ag_vextent_exact( 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. + * Check for overlapping busy extents. + */ + xfs_alloc_busy_search_trim(args->mp, args->pag, fbno, flen, + &tbno, &tlen); + + /* + * Give up if the start of the extent is busy, or the freespace isn't + * long enough for the minimum request. */ - if (fend < minend) + if (tbno > args->agbno) + goto not_found; + tend = tbno + tlen; + if (tend < args->agbno + args->minlen) goto not_found; /* @@ -627,14 +629,14 @@ xfs_alloc_ag_vextent_exact( * * Fix the length according to mod and prod if given. */ - end = XFS_AGBLOCK_MIN(fend, maxend); + end = XFS_AGBLOCK_MIN(tend, args->agbno + args->maxlen); args->len = end - args->agbno; xfs_alloc_fix_len(args); if (!xfs_alloc_fix_minleft(args)) goto not_found; rlen = args->len; - ASSERT(args->agbno + rlen <= fend); + ASSERT(args->agbno + rlen <= tend); end = args->agbno + rlen; /* @@ -683,11 +685,11 @@ xfs_alloc_find_best_extent( 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 */ + xfs_extlen_t *slen, /* extent length */ + xfs_agblock_t *sbnoa, /* aligned extent found by search */ + xfs_extlen_t *slena, /* aligned extent length */ int dir) /* 0 = search right, 1 = search left */ { - xfs_agblock_t bno; xfs_agblock_t new; xfs_agblock_t sdiff; int error; @@ -705,16 +707,16 @@ xfs_alloc_find_best_extent( if (error) goto error0; XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - xfs_alloc_compute_aligned(args, *sbno, *slen, &bno, slena); + xfs_alloc_compute_aligned(args, *sbno, *slen, sbnoa, slena); /* * The good extent is closer than this one. */ if (!dir) { - if (bno >= args->agbno + gdiff) + if (*sbnoa >= args->agbno + gdiff) goto out_use_good; } else { - if (bno <= args->agbno - gdiff) + if (*sbnoa <= args->agbno - gdiff) goto out_use_good; } @@ -726,8 +728,8 @@ xfs_alloc_find_best_extent( xfs_alloc_fix_len(args); sdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, *sbno, - *slen, &new); + args->alignment, *sbnoa, + *slena, &new); /* * Choose closer size and invalidate other cursor. @@ -777,7 +779,7 @@ xfs_alloc_ag_vextent_near( xfs_agblock_t gtbnoa; /* aligned ... */ xfs_extlen_t gtdiff; /* difference to right side entry */ xfs_extlen_t gtlen; /* length of right side entry */ - xfs_extlen_t gtlena = 0; /* aligned ... */ + xfs_extlen_t gtlena; /* aligned ... */ xfs_agblock_t gtnew; /* useful start bno of right side */ int error; /* error code */ int i; /* result code, temporary */ @@ -786,9 +788,10 @@ xfs_alloc_ag_vextent_near( xfs_agblock_t ltbnoa; /* aligned ... */ xfs_extlen_t ltdiff; /* difference to left side entry */ xfs_extlen_t ltlen; /* length of left side entry */ - xfs_extlen_t ltlena = 0; /* aligned ... */ + xfs_extlen_t ltlena; /* aligned ... */ xfs_agblock_t ltnew; /* useful start bno of left side */ xfs_extlen_t rlen; /* length of returned extent */ + int forced = 0; #if defined(DEBUG) && defined(__KERNEL__) /* * Randomly don't execute the first algorithm. @@ -797,13 +800,20 @@ xfs_alloc_ag_vextent_near( dofirst = random32() & 1; #endif + +restart: + bno_cur_lt = NULL; + bno_cur_gt = NULL; + ltlen = 0; + gtlena = 0; + ltlena = 0; + /* * Get a cursor for the by-size btree. */ cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp, args->agno, XFS_BTNUM_CNT); - ltlen = 0; - bno_cur_lt = bno_cur_gt = NULL; + /* * See if there are any free extents as big as maxlen. */ @@ -819,11 +829,13 @@ xfs_alloc_ag_vextent_near( goto error0; if (i == 0 || ltlen == 0) { xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); + trace_xfs_alloc_near_noentry(args); return 0; } ASSERT(i == 1); } args->wasfromfl = 0; + /* * First algorithm. * If the requested extent is large wrt the freespaces available @@ -887,7 +899,7 @@ xfs_alloc_ag_vextent_near( if (args->len < blen) continue; ltdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, ltbno, ltlen, <new); + args->alignment, ltbnoa, ltlena, <new); if (ltnew != NULLAGBLOCK && (args->len > blen || ltdiff < bdiff)) { bdiff = ltdiff; @@ -1039,11 +1051,12 @@ xfs_alloc_ag_vextent_near( args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); xfs_alloc_fix_len(args); ltdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, ltbno, ltlen, <new); + args->alignment, ltbnoa, ltlena, <new); error = xfs_alloc_find_best_extent(args, &bno_cur_lt, &bno_cur_gt, - ltdiff, >bno, >len, >lena, + ltdiff, >bno, >len, + >bnoa, >lena, 0 /* search right */); } else { ASSERT(gtlena >= args->minlen); @@ -1054,11 +1067,12 @@ xfs_alloc_ag_vextent_near( args->len = XFS_EXTLEN_MIN(gtlena, args->maxlen); xfs_alloc_fix_len(args); gtdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, gtbno, gtlen, >new); + args->alignment, gtbnoa, gtlena, >new); error = xfs_alloc_find_best_extent(args, &bno_cur_gt, &bno_cur_lt, - gtdiff, <bno, <len, <lena, + gtdiff, <bno, <len, + <bnoa, <lena, 1 /* search left */); } @@ -1070,6 +1084,12 @@ xfs_alloc_ag_vextent_near( * If we couldn't get anything, give up. */ if (bno_cur_lt == NULL && bno_cur_gt == NULL) { + if (!forced++) { + trace_xfs_alloc_near_busy(args); + xfs_log_force(args->mp, XFS_LOG_SYNC); + goto restart; + } + trace_xfs_alloc_size_neither(args); args->agbno = NULLAGBLOCK; return 0; @@ -1104,12 +1124,13 @@ xfs_alloc_ag_vextent_near( return 0; } rlen = args->len; - (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment, ltbno, - ltlen, <new); + (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment, + ltbnoa, ltlena, <new); ASSERT(ltnew >= ltbno); - ASSERT(ltnew + rlen <= ltbno + ltlen); + ASSERT(ltnew + rlen <= ltbnoa + ltlena); ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); args->agbno = ltnew; + if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno, ltlen, ltnew, rlen, XFSA_FIXUP_BNO_OK))) goto error0; @@ -1152,26 +1173,35 @@ xfs_alloc_ag_vextent_size( int i; /* temp status variable */ xfs_agblock_t rbno; /* returned block number */ xfs_extlen_t rlen; /* length of returned extent */ + int forced = 0; +restart: /* * Allocate and initialize a cursor for the by-size btree. */ cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp, args->agno, XFS_BTNUM_CNT); bno_cur = NULL; + /* * Look for an entry >= maxlen+alignment-1 blocks. */ if ((error = xfs_alloc_lookup_ge(cnt_cur, 0, args->maxlen + args->alignment - 1, &i))) goto error0; + /* - * If none, then pick up the last entry in the tree unless the - * tree is empty. - */ - if (!i) { - if ((error = xfs_alloc_ag_vextent_small(args, cnt_cur, &fbno, - &flen, &i))) + * If none or we have busy extents that we cannot allocate from, then + * we have to settle for a smaller extent. In the case that there are + * no large extents, this will return the last entry in the tree unless + * the tree is empty. In the case that there are only busy large + * extents, this will return the largest small extent unless there + * are no smaller extents available. + */ + if (!i || forced > 1) { + error = xfs_alloc_ag_vextent_small(args, cnt_cur, + &fbno, &flen, &i); + if (error) goto error0; if (i == 0 || flen == 0) { xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); @@ -1179,22 +1209,56 @@ xfs_alloc_ag_vextent_size( return 0; } ASSERT(i == 1); - } - /* - * There's a freespace as big as maxlen+alignment-1, get it. - */ - else { - if ((error = xfs_alloc_get_rec(cnt_cur, &fbno, &flen, &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - } + xfs_alloc_compute_aligned(args, fbno, flen, &rbno, &rlen); + } else { + /* + * Search for a non-busy extent that is large enough. + * If we are at low space, don't check, or if we fall of + * the end of the btree, turn off the busy check and + * restart. + */ + for (;;) { + error = xfs_alloc_get_rec(cnt_cur, &fbno, &flen, &i); + if (error) + goto error0; + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + + xfs_alloc_compute_aligned(args, fbno, flen, + &rbno, &rlen); + + if (rlen >= args->maxlen) + break; + + error = xfs_btree_increment(cnt_cur, 0, &i); + if (error) + goto error0; + if (i == 0) { + /* + * Our only valid extents must have been busy. + * Make it unbusy by forcing the log out and + * retrying. If we've been here before, forcing + * the log isn't making the extents available, + * which means they have probably been freed in + * this transaction. In that case, we have to + * give up on them and we'll attempt a minlen + * allocation the next time around. + */ + xfs_btree_del_cursor(cnt_cur, + XFS_BTREE_NOERROR); + trace_xfs_alloc_size_busy(args); + if (!forced++) + xfs_log_force(args->mp, XFS_LOG_SYNC); + goto restart; + } + } + } + /* * In the first case above, we got the last entry in the * by-size btree. Now we check to see if the space hits maxlen * once aligned; if not, we search left for something better. * This can't happen in the second case above. */ - xfs_alloc_compute_aligned(args, fbno, flen, &rbno, &rlen); rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); XFS_WANT_CORRUPTED_GOTO(rlen == 0 || (rlen <= flen && rbno + rlen <= fbno + flen), error0); @@ -1248,13 +1312,19 @@ xfs_alloc_ag_vextent_size( * Fix up the length. */ args->len = rlen; - xfs_alloc_fix_len(args); - if (rlen < args->minlen || !xfs_alloc_fix_minleft(args)) { - xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); - trace_xfs_alloc_size_nominleft(args); - args->agbno = NULLAGBLOCK; - return 0; + if (rlen < args->minlen) { + if (!forced++) { + xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); + trace_xfs_alloc_size_busy(args); + xfs_log_force(args->mp, XFS_LOG_SYNC); + goto restart; + } + goto out_nominleft; } + xfs_alloc_fix_len(args); + + if (!xfs_alloc_fix_minleft(args)) + goto out_nominleft; rlen = args->len; XFS_WANT_CORRUPTED_GOTO(rlen <= flen, error0); /* @@ -1284,6 +1354,12 @@ error0: if (bno_cur) xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR); return error; + +out_nominleft: + xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); + trace_xfs_alloc_size_nominleft(args); + args->agbno = NULLAGBLOCK; + return 0; } /* @@ -2612,7 +2688,7 @@ restart: * will require a synchronous transaction, but it can still be * used to distinguish between a partial or exact match. */ -int +STATIC int xfs_alloc_busy_search( struct xfs_mount *mp, xfs_agnumber_t agno, @@ -2654,6 +2730,71 @@ xfs_alloc_busy_search( return match; } +/* + * For a given extent [fbno, flen], search the busy extent list + * to find a subset of the extent that is not busy. + */ +void +xfs_alloc_busy_search_trim( + struct xfs_mount *mp, + struct xfs_perag *pag, + xfs_agblock_t fbno, + xfs_extlen_t flen, + xfs_agblock_t *rbno, + xfs_extlen_t *rlen) +{ + struct rb_node *rbp; + xfs_agblock_t bno = fbno; + xfs_extlen_t len = flen; + + spin_lock(&pag->pagb_lock); + rbp = pag->pagb_tree.rb_node; + while (rbp) { + struct xfs_busy_extent *busyp = + rb_entry(rbp, struct xfs_busy_extent, rb_node); + xfs_agblock_t end = bno + len; + xfs_agblock_t bend = busyp->bno + busyp->length; + + if (bno + len <= busyp->bno) { + rbp = rbp->rb_left; + continue; + } else if (bno >= busyp->bno + busyp->length) { + rbp = rbp->rb_right; + continue; + } + + if (busyp->bno < bno) { + /* start overlap */ + ASSERT(bend >= bno); + ASSERT(bend <= end); + len -= bno - bend; + bno = bend; + } else if (bend > end) { + /* end overlap */ + ASSERT(busyp->bno >= bno); + ASSERT(busyp->bno < end); + len -= bend - end; + } else { + /* middle overlap - return larger segment */ + ASSERT(busyp->bno >= bno); + ASSERT(bend <= end); + len = busyp->bno - bno; + if (len >= end - bend) { + /* use first segment */ + len = len; + } else { + /* use last segment */ + bno = bend; + len = end - bend; + } + } + } + spin_unlock(&pag->pagb_lock); + + *rbno = bno; + *rlen = len; +} + void xfs_alloc_busy_clear( struct xfs_mount *mp, Index: xfs/fs/xfs/linux-2.6/xfs_trace.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.h 2011-01-17 22:05:13.686003991 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_trace.h 2011-01-18 12:52:32.773004341 +0100 @@ -1433,11 +1433,14 @@ DEFINE_ALLOC_EVENT(xfs_alloc_near_first) DEFINE_ALLOC_EVENT(xfs_alloc_near_greater); DEFINE_ALLOC_EVENT(xfs_alloc_near_lesser); DEFINE_ALLOC_EVENT(xfs_alloc_near_error); +DEFINE_ALLOC_EVENT(xfs_alloc_near_noentry); +DEFINE_ALLOC_EVENT(xfs_alloc_near_busy); DEFINE_ALLOC_EVENT(xfs_alloc_size_neither); DEFINE_ALLOC_EVENT(xfs_alloc_size_noentry); DEFINE_ALLOC_EVENT(xfs_alloc_size_nominleft); DEFINE_ALLOC_EVENT(xfs_alloc_size_done); DEFINE_ALLOC_EVENT(xfs_alloc_size_error); +DEFINE_ALLOC_EVENT(xfs_alloc_size_busy); DEFINE_ALLOC_EVENT(xfs_alloc_small_freelist); DEFINE_ALLOC_EVENT(xfs_alloc_small_notenough); DEFINE_ALLOC_EVENT(xfs_alloc_small_done); @@ -1790,7 +1793,6 @@ DEFINE_EVENT(xfs_discard_class, name, \ DEFINE_DISCARD_EVENT(xfs_discard_extent); DEFINE_DISCARD_EVENT(xfs_discard_toosmall); DEFINE_DISCARD_EVENT(xfs_discard_exclude); -DEFINE_DISCARD_EVENT(xfs_discard_busy); #endif /* _TRACE_XFS_H */ Index: xfs/fs/xfs/linux-2.6/xfs_discard.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_discard.c 2011-01-17 22:06:13.004005040 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_discard.c 2011-01-17 22:14:09.133005668 +0100 @@ -77,8 +77,8 @@ xfs_trim_extents( * enough to be worth discarding. */ while (i) { - xfs_agblock_t fbno; - xfs_extlen_t flen; + xfs_agblock_t fbno, tbno; + xfs_extlen_t flen, tlen; error = xfs_alloc_get_rec(cur, &fbno, &flen, &i); if (error) @@ -90,7 +90,7 @@ xfs_trim_extents( * Too small? Give up. */ if (flen < minlen) { - trace_xfs_discard_toosmall(mp, agno, fbno, flen); + trace_xfs_discard_toosmall(mp, agno, tbno, flen); goto out_del_cursor; } @@ -109,19 +109,16 @@ xfs_trim_extents( * 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; - } + xfs_alloc_busy_search_trim(mp, pag, fbno, flen, &tbno, &tlen); - trace_xfs_discard_extent(mp, agno, fbno, flen); + trace_xfs_discard_extent(mp, agno, tbno, tlen); error = -blkdev_issue_discard(bdev, - XFS_AGB_TO_DADDR(mp, agno, fbno), - XFS_FSB_TO_BB(mp, flen), + XFS_AGB_TO_DADDR(mp, agno, tbno), + XFS_FSB_TO_BB(mp, tlen), GFP_NOFS, 0); if (error) goto out_del_cursor; - *blocks_trimmed += flen; + *blocks_trimmed += tlen; next_extent: error = xfs_btree_decrement(cur, 0, &i); Index: xfs/fs/xfs/xfs_alloc.h =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.h 2011-01-17 22:06:12.985003713 +0100 +++ xfs/fs/xfs/xfs_alloc.h 2011-01-18 13:03:59.474004132 +0100 @@ -126,9 +126,10 @@ xfs_alloc_busy_insert(struct xfs_trans * void xfs_alloc_busy_clear(struct xfs_mount *mp, struct xfs_busy_extent *busyp); -int -xfs_alloc_busy_search(struct xfs_mount *mp, xfs_agnumber_t agno, - xfs_agblock_t bno, xfs_extlen_t len); +void +xfs_alloc_busy_search_trim(struct xfs_mount *mp, struct xfs_perag *pag, + xfs_agblock_t bno, xfs_extlen_t len, + xfs_agblock_t *tbno, xfs_extlen_t *tlen); #endif /* __KERNEL__ */ /* From gwehrman@sgi.com Fri Jan 21 08:39:35 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0LEdZ7o049328 for ; Fri, 21 Jan 2011 08:39:35 -0600 Received: from goalpost.americas.sgi.com (goalpost.americas.sgi.com [128.162.232.54]) by relay2.corp.sgi.com (Postfix) with ESMTP id C4F89304064; Fri, 21 Jan 2011 06:41:52 -0800 (PST) Received: by goalpost.americas.sgi.com (Postfix, from userid 14442) id 47EF926F59; Fri, 21 Jan 2011 08:41:52 -0600 (CST) Date: Fri, 21 Jan 2011 08:41:52 -0600 From: Geoffrey Wehrman To: Dave Chinner Cc: Christoph Hellwig , bpm@sgi.com, xfs@oss.sgi.com Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110121144152.GD10729@sgi.com> References: <20110114214334.GN28274@sgi.com> <20110114235549.GI16267@dastard> <20110118204752.GB28791@infradead.org> <20110118231831.GZ28803@dastard> <20110119120321.GC12941@infradead.org> <20110119133147.GN16267@dastard> <20110119135548.GA11502@infradead.org> <20110120013346.GO16267@dastard> <20110120144503.GA7225@sgi.com> <20110121025140.GY16267@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20110121025140.GY16267@dastard> User-Agent: Mutt/1.5.14 (2007-02-12) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Jan 21, 2011 at 01:51:40PM +1100, Dave Chinner wrote: | Realistically, for every disadvantage or advantage we can enumerate | for specific workloads, I think one of us will be able to come up | with a counter example that shows the opposite of the original | point. I don't think this sort of argument is particularly | productive. :/ Sorry, I wasn't trying to be argumentative. Rather I was just documenting what I saw as potential issues. I'm not arguing against your proposed change. If you don't find my sharing of observations productive, I'm happy to keep my thoughts to my self in the future. | Instead, I look at it from the point of view that a 64k IO is little | slower than a 4k IO so such a change would not make much difference | to performance. And given that terabytes of storage capacity is | _cheap_ these days (and getting cheaper all the time), the extra | space of using 64k instead of 4k for sparse blocks isn't a big deal. | | When I combine that with my experience from SGI where we always | recommended using filesystems block size == page size for best IO | performance on HPC setups, there's a fair argument that using page | size extents for small sparse writes isn't a problem we really need | to care about. | | І'd prefer to design for where we expect storage to be in the next | few years e.g. 10TB spindles. Minimising space usage is not a big | priority when we consider that in 2-3 years 100TB of storage will | cost less than $5000 (it's about $15-20k right now). Even on | desktops we're going to have more capacity that we know what to do | with, so trading off storage space for lower memory overhead, lower | metadata IO overhead and lower potential fragmentation seems like | the right way to move forward to me. | | Does that seem like a reasonable position to take, or are there | other factors that you think I should be considering? Keep in mind that storage of the future may not be on spindles, and fragmentation may not be an issue. Even so, with SSD 64K I/O is very reasonable as most flash memory implements at a minimum 64K page. I'm fully in favor your proposal to require page sized I/O. -- Geoffrey Wehrman From romosan@sycorax.lbl.gov Fri Jan 21 10:03:12 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0LG3Bhn063103 for ; Fri, 21 Jan 2011 10:03:11 -0600 X-ASG-Debug-ID: 1295625924-553703440000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from sycorax.lbl.gov (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3E3F9148D05A for ; Fri, 21 Jan 2011 08:05:24 -0800 (PST) Received: from sycorax.lbl.gov (sycorax.lbl.gov [128.3.11.121]) by cuda.sgi.com with ESMTP id D9kPMigTp6CHTtG7 for ; Fri, 21 Jan 2011 08:05:24 -0800 (PST) Received: from sycorax.lbl.gov (romosan@localhost [127.0.0.1]) by sycorax.lbl.gov (8.14.4/8.14.4/Debian-2) with ESMTP id p0LG5GOb010865; Fri, 21 Jan 2011 08:05:16 -0800 Received: (from romosan@localhost) by sycorax.lbl.gov (8.14.4/8.14.4/Submit) id p0LG5GmT010862; Fri, 21 Jan 2011 08:05:16 -0800 From: Alex Romosan To: Dave Chinner Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs used disk space bug in 2.6.38-rc1 (commit 6e857567dbbfe14dd6cc3f7414671b047b1ff5c7) Subject: Re: xfs used disk space bug in 2.6.38-rc1 (commit 6e857567dbbfe14dd6cc3f7414671b047b1ff5c7) References: <87zkqvtet2.fsf@sycorax.lbl.gov> <20110121034208.GZ16267@dastard> Date: Fri, 21 Jan 2011 08:05:16 -0800 In-Reply-To: <20110121034208.GZ16267@dastard> (message from Dave Chinner on Fri, 21 Jan 2011 14:42:08 +1100) Message-ID: <87bp3a8coz.fsf@sycorax.lbl.gov> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: sycorax.lbl.gov[128.3.11.121] X-Barracuda-Start-Time: 1295625925 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0094 1.0000 -1.9595 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.76 X-Barracuda-Spam-Status: No, SCORE=-1.76 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.53028 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 Dave Chinner writes: > When you quote a commit, can you please include the name of the > commit. e.g: > > 6e85756 ("xfs: don't truncate prealloc from frequently accessed inodes") > sorry. > Is the one with the known bug that causes excessive preallocation > when files are zero sized. The candidate fix is here: > > http://oss.sgi.com/archives/xfs/2011-01/msg00281.html > > Can you see if that solves your problem? i've tried it and disk usage is back to normal. thanks. --alex-- -- | I believe the moment is at hand when, by a paranoiac and active | | advance of the mind, it will be possible (simultaneously with | | automatism and other passive states) to systematize confusion | | and thus to help to discredit completely the world of reality. | From manlovexhot@yahoo.se Fri Jan 21 17:37:32 2011 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 (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p0LNbWTl115589 for ; Fri, 21 Jan 2011 17:37:32 -0600 X-ASG-Debug-ID: 1295653191-7246027c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from nm8.bullet.mail.ac4.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 2CD1F27C586 for ; Fri, 21 Jan 2011 15:39:51 -0800 (PST) Received: from nm8.bullet.mail.ac4.yahoo.com (nm8.bullet.mail.ac4.yahoo.com [98.139.52.205]) by cuda.sgi.com with SMTP id KCVRneoq4DCXHhZL for ; Fri, 21 Jan 2011 15:39:51 -0800 (PST) Received: from [98.139.52.197] by nm8.bullet.mail.ac4.yahoo.com with NNFMP; 21 Jan 2011 23:39:51 -0000 Received: from [74.6.228.36] by tm10.bullet.mail.ac4.yahoo.com with NNFMP; 21 Jan 2011 23:39:51 -0000 Received: from [127.0.0.1] by smtp105.mail.ac4.yahoo.com with NNFMP; 21 Jan 2011 23:39:51 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.se; s=s1024; t=1295653191; bh=fSf3Tz/xW/oWRncdzHciFvuVvD4dWxuXPkICbGO5P1s=; h=X-Yahoo-Newman-Id: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=kYploVmfGCHJDG2ikxG13bycJLo45iiNjh965q9k1mmAnYOOhy6CFCa6my5ZMGpD5p2JdpbVGlmQIcOKS4kuMB3iT3pf3mnWs1iQ0XMYiPbUQb8YPqx86kCX9gik7xYxWIX7X9tJbBdcubnpFU/LJ/qFPk7z+CnIPIrbu9cG42A= X-Yahoo-Newman-Id: 211215.248.bm@smtp105.mail.ac4.yahoo.com Received: from wfpyluc (manlovexhot@27.38.134.144 with login) by smtp105.mail.ac4.yahoo.com with SMTP; 21 Jan 2011 15:39:49 -0800 PST X-Yahoo-SMTP: pHx8LUKswBArWIVudKlCovDrA1H3peIt X-YMail-OSG: OXXj.poVM1md7FPV6McxtJLvtuvQmdo0LOauSYGcR.h9iXr GhU4ezrgVfvc8.vUBhhhoYzLHGFPWwkGjwR7Y4IfqdFXyqDqw7wkrVtx5iGw w9WxXgF4HjOLnXr6qWHDrdvi4Tbwafh0E1LJNfuWrXy5OyMU13KtQ2XTrfmz dt4NQqueUwAXpTj969TmnKNZdZNtVjnVic3PTrOreTh584X2lX_Y.xTdvMMy jF7RBsPJshEmp_RC.1iABvPQr1GYDPGYkqdkV86Y4HLCu28QyhAJRgvtDbc2 G3g-- X-Yahoo-Newman-Property: ymail-3 Date: Sat, 22 Jan 2011 07:39:47 +0800 From: "manlovexhot@yahoo.se" To: "xfrxfsfhzv" X-ASG-Orig-Subj: =?GB2312?B?x+uy6crV0ru34tPKvP4hbWFubG92ZXhob3RAeWFob28uc2VBezUtMjB9WXs1?= =?GB2312?B?LTIwfQ==?= Subject: =?GB2312?B?x+uy6crV0ru34tPKvP4hbWFubG92ZXhob3RAeWFob28uc2VBezUtMjB9WXs1?= =?GB2312?B?LTIwfQ==?= Message-ID: <201101220739472187037@yahoo.se> 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: nm8.bullet.mail.ac4.yahoo.com[98.139.52.205] X-Barracuda-Start-Time: 1295653192 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4908 1.0000 0.0000 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, MIME_BASE64_TEXT, PR0N_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.53057 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 UaO6MTM5NTk2MjQ4OCAgINXFyfoxMzY5MjIyNzc2MiANCg0KILG+yczQ0M/j0cy2vMrHvqu3ws+1 wdAusPzXsLrN1ebGt7Hwzt7BvdH5o6jT0LfAzrHC66OpIL/auNC0v9X9Ljk1Jba8ysfV5tHMy78u DQoNCiDV/bnms6e80rzTuaTWxtf3LqG+vqu3wqG/ILOntcTSqsfzutzRz7jxLtHM0rbIq7K/zNjK 4rzTuaTT69bG1/fV5tX9tO+1vcHLuN+x6te8tcTSqsfzIaOoxfrBv7zbuPHB7dLpo6m9u9LXweO1 o7fnz9WjoQ0KDQogysfX1LPpLNXQtP0sy83A8SzF+reiLMHjytssuavLviy+xrXqLCDT6cDWs6HL +bXIytfRoSwgDQoNCiC827jxuPy6z8DtLL/azra4/LS/1f0hILz7u/W4tr/uLMfrt8XQxLm6wvIh ILO5tdfIw8T6zt6687nL1q7TxyENCg0KINLUobCzz9DFLs7xyrUuuN/Qpy65stOuobHOqtfa1rzT 68T6s6TG2rrP1/csILTyyMXH68TjwcK94g0KDQogICAgICAgIHlhaG9vLnNlKDMtOSl5YWhvby5z ZSgzLTkp From david@fromorbit.com Sun Jan 23 17:24:21 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0NNOK7K040356 for ; Sun, 23 Jan 2011 17:24:21 -0600 X-ASG-Debug-ID: 1295825200-050f017f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1324A1A0C7B9 for ; Sun, 23 Jan 2011 15:26:41 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id bqdakEIHnQfQOrvK for ; Sun, 23 Jan 2011 15:26:41 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApQEAOpGPE15LN5mgWdsb2JhbACEEqBVFgEBFiIkqxSPSw2BF4M4dAQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Jan 2011 09:56:39 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Ph9KP-0000jl-Ti; Mon, 24 Jan 2011 10:26:37 +1100 Date: Mon, 24 Jan 2011 10:26:37 +1100 From: Dave Chinner To: Geoffrey Wehrman Cc: Christoph Hellwig , bpm@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issues with delalloc->real extent allocation Subject: Re: Issues with delalloc->real extent allocation Message-ID: <20110123232637.GB16267@dastard> References: <20110114235549.GI16267@dastard> <20110118204752.GB28791@infradead.org> <20110118231831.GZ28803@dastard> <20110119120321.GC12941@infradead.org> <20110119133147.GN16267@dastard> <20110119135548.GA11502@infradead.org> <20110120013346.GO16267@dastard> <20110120144503.GA7225@sgi.com> <20110121025140.GY16267@dastard> <20110121144152.GD10729@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20110121144152.GD10729@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295825202 X-Barracuda-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.53248 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, Jan 21, 2011 at 08:41:52AM -0600, Geoffrey Wehrman wrote: > On Fri, Jan 21, 2011 at 01:51:40PM +1100, Dave Chinner wrote: > | Realistically, for every disadvantage or advantage we can enumerate > | for specific workloads, I think one of us will be able to come up > | with a counter example that shows the opposite of the original > | point. I don't think this sort of argument is particularly > | productive. :/ > > Sorry, I wasn't trying to be argumentative. Rather I was just documenting > what I saw as potential issues. I'm not arguing against your proposed > change. If you don't find my sharing of observations productive, I'm > happy to keep my thoughts to my self in the future. Ah, that's not what I meant, Geoffrey. Reading it back, I probably should have said "direction of discussion" rather than "sort of argument" to make it more obvious I trying not to get stuck with us goign round and round trying to demonstrate the pros and cons of different approaches on a workload-by-workload basis. Basically all I was trying to do is move the discusion past a potential sticking point - I definitely value the input and insight you provide, and I'll try to write more clearly to hopefully avoid such misunderstandings in future discussions. > | Instead, I look at it from the point of view that a 64k IO is little > | slower than a 4k IO so such a change would not make much difference > | to performance. And given that terabytes of storage capacity is > | _cheap_ these days (and getting cheaper all the time), the extra > | space of using 64k instead of 4k for sparse blocks isn't a big deal. > | > | When I combine that with my experience from SGI where we always > | recommended using filesystems block size == page size for best IO > | performance on HPC setups, there's a fair argument that using page > | size extents for small sparse writes isn't a problem we really need > | to care about. > | > | І'd prefer to design for where we expect storage to be in the next > | few years e.g. 10TB spindles. Minimising space usage is not a big > | priority when we consider that in 2-3 years 100TB of storage will > | cost less than $5000 (it's about $15-20k right now). Even on > | desktops we're going to have more capacity that we know what to do > | with, so trading off storage space for lower memory overhead, lower > | metadata IO overhead and lower potential fragmentation seems like > | the right way to move forward to me. > | > | Does that seem like a reasonable position to take, or are there > | other factors that you think I should be considering? > > Keep in mind that storage of the future may not be on spindles, and > fragmentation may not be an issue. Even so, with SSD 64K I/O is very > reasonable as most flash memory implements at a minimum 64K page. I'm > fully in favor your proposal to require page sized I/O. With flash memory there is the potential that we don't even need to care. The trend is towards on-device compression (e.g. Sandforce controllers already do this) to reduce write amplification to values lower than one. Hence a 4k write surrounded by 60k of zeros is unlikely to be a major issue as it will compress really well.... :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From vscan@oss.sgi.com Sun Jan 23 19:52:33 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=1.0 required=5.0 tests=ALL_TRUSTED,BAYES_40 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 p0O1qXiT047443; Sun, 23 Jan 2011 19:52:33 -0600 Received: (from vscan@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id p0O1qXGi047442; Sun, 23 Jan 2011 19:52:33 -0600 Date: Sun, 23 Jan 2011 19:52:33 -0600 Message-Id: <201101240152.p0O1qXGi047442@oss.sgi.com> From: MAILER-DAEMON@oss.sgi.com To: postmaster@oss.sgi.com Cc: xfs@oss.sgi.com Auto-Submitted: auto-submitted (antivirus notify) X-Infected-Received-From: cuda2.sgi.com [192.48.176.25] Subject: Virus intercepted A message sent from Mail Delivery System to xfs contained Worm.Mydoom.M and has not been accepted for delivery. The infected machine is likely to be here: from mxbackup-fb-1.gradwell.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6F72E289B7A for ; Sun, 23 Jan 2011 17:54:52 -0800 (PST) From BATV+55d6722456e14948ee35+2710+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 24 02:45:15 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0O8jCBY071522 for ; Mon, 24 Jan 2011 02:45:15 -0600 X-ASG-Debug-ID: 1295858854-7850013e0000-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 80C6915467E6 for ; Mon, 24 Jan 2011 00:47:34 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id JIspyX1RyGWPgatt for ; Mon, 24 Jan 2011 00:47:34 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PhI5E-000191-E4; Mon, 24 Jan 2011 08:47:32 +0000 Date: Mon, 24 Jan 2011 03:47:32 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/3] libxlog: sync up with 2.6.38 kernel code Subject: Re: [PATCH 2/3] libxlog: sync up with 2.6.38 kernel code Message-ID: <20110124084732.GA4378@infradead.org> References: <1294649091-27174-1-git-send-email-david@fromorbit.com> <1294649091-27174-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294649091-27174-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: 1295858855 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 > +typedef int32_t atomic_t; > +typedef int64_t atomic64_t; > + > +#define atomic_inc_return(x) (++(*(x))) > +#define atomic_dec_return(x) (--(*(x))) > + > +#define atomic64_read(x) *(x) > +#define atomic64_set(x, v) (*(x) = v) These defintions are pretty dangerous if we ever happens to use them in multi-threaded code like repair. Currently we're not, but they should grow a larger warning comment. > --- /dev/null > +++ b/include/hlist.h Why not add the hlist helpers to list.h, like in the kernel tree? Otherwise looks good, Reviewed-by: Christoph Hellwig From BATV+55d6722456e14948ee35+2710+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 24 02:55:30 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0O8tTBu072085 for ; Mon, 24 Jan 2011 02:55:29 -0600 X-ASG-Debug-ID: 1295859471-489e03180000-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 41AF91546907 for ; Mon, 24 Jan 2011 00:57:52 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id ha64vf4aYZsLiBXA for ; Mon, 24 Jan 2011 00:57:52 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PhIFD-0006wL-Ez; Mon, 24 Jan 2011 08:57:51 +0000 Date: Mon, 24 Jan 2011 03:57:51 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/3] libxfs: sync files with 2.6.38 kernel code Subject: Re: [PATCH 3/3] libxfs: sync files with 2.6.38 kernel code Message-ID: <20110124085751.GB4378@infradead.org> References: <1294649091-27174-1-git-send-email-david@fromorbit.com> <1294649091-27174-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294649091-27174-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: 1295859472 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 > +/* XXX: fix this up! */ > #define OFF(f) bitize(offsetof(xfs_dinode_t, di_ ## f)) > const field_t inode_flds[] = { > - { "core", FLDT_DINODE_CORE, OI(OFF(core)), C1, 0, TYP_NONE }, > - { "next_unlinked", FLDT_AGINO, OI(OFF(next_unlinked)), C1, 0, > - TYP_INODE }, > - { "u", FLDT_DINODE_U, OI(OFF(u)), C1, 0, TYP_NONE }, > + { "core", FLDT_DINODE_CORE, OI(OFF(magic)), C1, 0, TYP_NONE }, > + { "u", FLDT_DINODE_U, inode_u_offset, C1, FLD_OFFSET, TYP_NONE }, I think the right way to fix this is to copy over all fields from the dinode core, and keep a "virtual" core field and the inode_core table for backwards compatiblity. > + { "next_unlinked", FLDT_AGINO, OI(OFF(next_unlinked)), C1, 0, > + TYP_INODE }, I think this one should only be added to the real dinode, not the core. > #define XFS_BUF_LOCK 0 > #define XFS_BUF_TRYLOCK 0 > +#define XBF_LOCK XFS_BUF_LOCK > +#define XBF_TRYLOCK XFS_BUF_TRYLOCK > +#define XBF_DONT_BLOCK 0 Please kill off the XFS_BUF_* flags, just like in kernelspace. Looks good, Reviewed-by: Christoph Hellwig From BATV+55d6722456e14948ee35+2710+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 24 02:56:23 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0O8uNIf072132 for ; Mon, 24 Jan 2011 02:56:23 -0600 X-ASG-Debug-ID: 1295859526-170c01c40000-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 57B4A28A642 for ; Mon, 24 Jan 2011 00:58:46 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id ShboWafvWyutuZdq for ; Mon, 24 Jan 2011 00:58:46 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PhIG5-0007GG-T8; Mon, 24 Jan 2011 08:58:45 +0000 Date: Mon, 24 Jan 2011 03:58:45 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/3] libxfs: reintroduce old xfs_repair radix-tree code Subject: Re: [PATCH 1/3] libxfs: reintroduce old xfs_repair radix-tree code Message-ID: <20110124085845.GA26744@infradead.org> References: <1294649091-27174-1-git-send-email-david@fromorbit.com> <1294649091-27174-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1294649091-27174-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: 1295859526 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, Jan 10, 2011 at 07:44:49PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The current kernel code uses radix trees more widely than the > previous code, so for the next sync we need radix tree support in > libxfs. Pull the old radix tree code out the xfs_repair git history > and move it into libxfs to simplify the kernel code sync. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+55d6722456e14948ee35+2710+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 24 02:57:27 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0O8vRqQ072243 for ; Mon, 24 Jan 2011 02:57:27 -0600 X-ASG-Debug-ID: 1295859589-489503300000-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 C05CE154690E for ; Mon, 24 Jan 2011 00:59:49 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id zGkbEXO1luVfPUxh for ; Mon, 24 Jan 2011 00:59:49 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PhIH7-0007Kg-3v; Mon, 24 Jan 2011 08:59:49 +0000 Date: Mon, 24 Jan 2011 03:59:49 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: speculative delayed allocation uses rounddown_power_of_2 badly Subject: Re: [PATCH 1/5] xfs: speculative delayed allocation uses rounddown_power_of_2 badly Message-ID: <20110124085949.GB26744@infradead.org> References: <1295411400-15614-1-git-send-email-david@fromorbit.com> <1295411400-15614-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295411400-15614-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: 1295859589 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, Jan 19, 2011 at 03:29:56PM +1100, Dave Chinner wrote: > From: Dave Chinner > > rounddown_power_of_2() returns an undefined result when passed a > value of zero. The specualtive delayed allocation code is doing this > when the inode is zero length. Hence occasionally the preallocation > is much, mcuh large than is necessary (e.g. 8GB for a 270 _byte_ ^^^^^^^^^ typo Otherwise looks good, Reviewed-by: Christoph Hellwig From BATV+55d6722456e14948ee35+2710+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 24 03:00:30 2011 X-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_46 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 p0O90Use073627 for ; Mon, 24 Jan 2011 03:00:30 -0600 X-ASG-Debug-ID: 1295859772-4b3d010c0000-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 5CCFB1A13523 for ; Mon, 24 Jan 2011 01:02:53 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id IdFyN9HupOqtifbZ for ; Mon, 24 Jan 2011 01:02:53 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PhIK4-00081E-PB; Mon, 24 Jan 2011 09:02:52 +0000 Date: Mon, 24 Jan 2011 04:02:52 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/5] xfs: limit extent length for allocation to AG size Subject: Re: [PATCH 2/5] xfs: limit extent length for allocation to AG size Message-ID: <20110124090252.GC26744@infradead.org> References: <1295411400-15614-1-git-send-email-david@fromorbit.com> <1295411400-15614-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295411400-15614-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: 1295859773 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 requested extent can be larger than an AG, so trim the block > + * count back to the maximum sized extent in an AG. A typical empty AG > + * consumes 1 block for headers, 1 block for each btree root (3) and 4 > + * blocks for the free list. > + */ > + args.maxlen = MIN(ap->alen, mp->m_sb.sb_agblocks - 8); Maybe add a define for the over head blocks to document it more clearly? Otherwise looks good, Reviewed-by: Christoph Hellwig From BATV+55d6722456e14948ee35+2710+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 24 03:02:37 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0O92b4D073682 for ; Mon, 24 Jan 2011 03:02:37 -0600 X-ASG-Debug-ID: 1295859899-489603260000-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 B12A51546A89 for ; Mon, 24 Jan 2011 01:04:59 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id QsbJZI42xZU8E0nF for ; Mon, 24 Jan 2011 01:04:59 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PhIM7-00084V-26; Mon, 24 Jan 2011 09:04:59 +0000 Date: Mon, 24 Jan 2011 04:04:59 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5] xfs: prevent extsize alignment from exceeding maximum extent size Subject: Re: [PATCH 3/5] xfs: prevent extsize alignment from exceeding maximum extent size Message-ID: <20110124090458.GD26744@infradead.org> References: <1295411400-15614-1-git-send-email-david@fromorbit.com> <1295411400-15614-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295411400-15614-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: 1295859899 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 > + /* > + * make sure we don't exceed a single > + * extent length when we align the > + * extent by reducing length we are > + * going to allocate by the maximum > + * amount extent size aligment may > + * require. > + alen = (xfs_extlen_t)XFS_FILBLKS_MIN( > + len, > + MAXEXTLEN - (2 * extsz - 1)); > + */ This essentially just adds a comment, given that the new code is inside the bracing. Also the xfs_extlen_t cast seems pointless. The C type promotion rules do just fine for going down from a 64bit type to a 32bit one, as long as the results fit into the latter - which they always do here. From BATV+55d6722456e14948ee35+2710+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 24 03:04:34 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0O94YN5073824 for ; Mon, 24 Jan 2011 03:04:34 -0600 X-ASG-Debug-ID: 1295860016-158001fe0000-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 0A20728A933 for ; Mon, 24 Jan 2011 01:06:56 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id bBjk9XWNnZiaMegB for ; Mon, 24 Jan 2011 01:06:56 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PhIO0-0000iT-IU; Mon, 24 Jan 2011 09:06:56 +0000 Date: Mon, 24 Jan 2011 04:06:56 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: limit extsize to size of AGs and/or MAXEXTLEN Subject: Re: [PATCH 4/5] xfs: limit extsize to size of AGs and/or MAXEXTLEN Message-ID: <20110124090656.GE26744@infradead.org> References: <1295411400-15614-1-git-send-email-david@fromorbit.com> <1295411400-15614-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295411400-15614-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: 1295860017 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, Jan 19, 2011 at 03:29:59PM +1100, Dave Chinner wrote: > + * Also, for non-realtime files, limit the extent size hint to > + * half the size of the AGs in the filesystem so alignment > + * doesn't result in extents larger than an AG. What do we do about the last AG, which potentionally is smaller than the others? Otherwise looks good, Reviewed-by: Christoph Hellwig From BATV+55d6722456e14948ee35+2710+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 24 03:10:27 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0O9ARid074197 for ; Mon, 24 Jan 2011 03:10:27 -0600 X-ASG-Debug-ID: 1295860370-170e02230000-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 367C428A985 for ; Mon, 24 Jan 2011 01:12:50 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id c0NB8WMgq0F4kky4 for ; Mon, 24 Jan 2011 01:12:50 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PhITh-0002AZ-Q6; Mon, 24 Jan 2011 09:12:49 +0000 Date: Mon, 24 Jan 2011 04:12:49 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/5] xfs: handle CIl transaction commit failures correctly Subject: Re: [PATCH 5/5] xfs: handle CIl transaction commit failures correctly Message-ID: <20110124091249.GF26744@infradead.org> References: <1295411400-15614-1-git-send-email-david@fromorbit.com> <1295411400-15614-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295411400-15614-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: 1295860370 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 > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > index 50753d3..504a804 100644 > --- a/fs/xfs/xfs_trans.c > +++ b/fs/xfs/xfs_trans.c > @@ -1754,15 +1754,26 @@ xfs_trans_commit_cil( > */ > log_vector = xfs_trans_alloc_log_vecs(tp); > if (!log_vector) > - return ENOMEM; > + goto out_enomem; > > error = xfs_log_commit_cil(mp, tp, log_vector, commit_lsn, flags); > - if (error) > - return error; > + if (error) { > + /* > + * We will only get an error if no modifications have been > + * made to the items in the transaction. Hence treat it > + the same as a memory allocation failure. > + */ > + goto out_enomem; > + } > > current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); > xfs_trans_free(tp); > return 0; > + > +out_enomem: > + /* caller cleans up transaction */ > + current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); > + return ENOMEM; _xfs_trans_commit already restores the process flags for an ENOMEM return, so the failure from xfs_trans_alloc_log_vecs is already handled correctly. If we want to handle the EIO return from xfs_log_commit_cil the same way it just needs to be turned into an ENOMEM. The big questions is if there's any point in having the shutdown check in xfs_trans_commit_cil - we already do one just before applying the trans deltas in _xfs_trans_commit, which is handled correctly and should be sufficient. From jpiszcz@lucidpixels.com Mon Jan 24 09:22:43 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0OFMh5s092750 for ; Mon, 24 Jan 2011 09:22:43 -0600 X-ASG-Debug-ID: 1295882703-6df703810000-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 4D3521A1807F for ; Mon, 24 Jan 2011 07:25:03 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id rLLrRaiTOb2ERqKx for ; Mon, 24 Jan 2011 07:25:03 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 0181412061A; Mon, 24 Jan 2011 10:25:03 -0500 (EST) Date: Mon, 24 Jan 2011 10:25:02 -0500 (EST) From: Justin Piszcz To: CoolCold cc: Wolfgang Denk , stefan.huebner@stud.tu-ilmenau.de, linux-raid@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Optimize RAID0 for max IOPS? Subject: Re: Optimize RAID0 for max IOPS? In-Reply-To: Message-ID: References: <20110118210112.D13A236C@gemini.denx.de> <4D361F26.3060507@stud.tu-ilmenau.de> <20110119192104.1FA92D30267@gemini.denx.de> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="655872-1146966783-1295882702=:14640" X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1295882704 X-Barracuda-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.53312 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-1146966783-1295882702=:14640 Content-Type: TEXT/PLAIN; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: QUOTED-PRINTABLE On Mon, 24 Jan 2011, CoolCold wrote: >> So can anybody help answering these questions: >> >> - are there any special options when creating the RAID0 to make it >> =A0perform faster for such a use case? >> - are there other tunables, any special MD / LVM / file system / >> =A0read ahead / buffer cache / ... parameters to look for? > XFS is known for it's slow speed on metadata operations like updating > file attributes/removing files..but things gonna change after 2.6.35 > where delaylog is used. Citating Dave Chinner : > < dchinner> Indeed, the biggest concurrency limitation has > traditionally been the transaction commit/journalling code, but that's > a lot more scalable now with delayed logging.... > > So, you may need to benchmark fs part. Some info on XFS benchmark with delaylog here: http://comments.gmane.org/gmane.comp.file-systems.xfs.general/34379 Justin. --655872-1146966783-1295882702=:14640-- From wd@denx.de Mon Jan 24 14:46:09 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0OKk8ur114961 for ; Mon, 24 Jan 2011 14:46:09 -0600 X-ASG-Debug-ID: 1295902109-7beb01070000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-out.m-online.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A18DD88CDD6 for ; Mon, 24 Jan 2011 12:48:29 -0800 (PST) Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.10]) by cuda.sgi.com with ESMTP id kYdlATRwdCUqihrN for ; Mon, 24 Jan 2011 12:48:29 -0800 (PST) Received: from frontend1.mail.m-online.net (frontend1.mail.intern.m-online.net [192.168.8.180]) by mail-out.m-online.net (Postfix) with ESMTP id 1817B188A184; Mon, 24 Jan 2011 21:48:27 +0100 (CET) X-Auth-Info: RUegNJRqO4hCke0YLejgGJD6Oj4HQMLWUVi5KjMcCP0= Received: from diddl.denx.de (host-80-81-18-216.customer.m-online.net [80.81.18.216]) by smtp-auth.mnet-online.de (Postfix) with ESMTPA id EECAA1C00094; Mon, 24 Jan 2011 21:48:27 +0100 (CET) Received: from gemini.denx.de (unknown [10.0.0.2]) by diddl.denx.de (Postfix) with ESMTP id CFDBD325E5B5; Mon, 24 Jan 2011 21:48:27 +0100 (CET) Received: from gemini.denx.de (localhost.localdomain [127.0.0.1]) by gemini.denx.de (Postfix) with ESMTP id B707FB187; Mon, 24 Jan 2011 21:48:27 +0100 (CET) To: Justin Piszcz cc: linux-raid@vger.kernel.org, xfs@oss.sgi.com From: Wolfgang Denk X-ASG-Orig-Subj: Re: Optimize RAID0 for max IOPS? Subject: Re: Optimize RAID0 for max IOPS? MIME-Version: 1.0 Content-type: text/plain; charset=ISO-8859-1 Content-transfer-encoding: 8bit In-reply-to: References: <20110118210112.D13A236C@gemini.denx.de> <4D361F26.3060507@stud.tu-ilmenau.de> <20110119192104.1FA92D30267@gemini.denx.de> Comments: In-reply-to Justin Piszcz message dated "Mon, 24 Jan 2011 10:25:02 -0500." Date: Mon, 24 Jan 2011 21:48:27 +0100 Message-Id: <20110124204827.B707FB187@gemini.denx.de> X-Barracuda-Connect: mail-out.m-online.net[212.18.0.10] X-Barracuda-Start-Time: 1295902110 X-Barracuda-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.53333 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dear Justin Piszcz, In message you wrote: > > > So, you may need to benchmark fs part. > > Some info on XFS benchmark with delaylog here: > http://comments.gmane.org/gmane.comp.file-systems.xfs.general/34379 Thanks a lot for the pointer. I will try this out. Best regards, Wolfgang Denk -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de Madness takes its toll. Please have exact change. From wd@denx.de Mon Jan 24 15:54:56 2011 X-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 p0OLstKt121655 for ; Mon, 24 Jan 2011 15:54:56 -0600 X-ASG-Debug-ID: 1295906236-03d302640000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-out.m-online.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 762F528CE07 for ; Mon, 24 Jan 2011 13:57:16 -0800 (PST) Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.9]) by cuda.sgi.com with ESMTP id FL2zDxFDlZFUKwlD for ; Mon, 24 Jan 2011 13:57:16 -0800 (PST) Received: from frontend1.mail.m-online.net (unknown [192.168.8.180]) by mail-out.m-online.net (Postfix) with ESMTP id 149DF1C0F590; Mon, 24 Jan 2011 22:57:14 +0100 (CET) X-Auth-Info: mgEm595e+cJv4LKl7DpTKAc0P0CtRO7BG83cfrZoWXY= Received: from diddl.denx.de (host-80-81-18-216.customer.m-online.net [80.81.18.216]) by smtp-auth.mnet-online.de (Postfix) with ESMTPA id 9AE3E1C000A6; Mon, 24 Jan 2011 22:57:14 +0100 (CET) Received: from gemini.denx.de (gemini.denx.de [10.0.0.2]) by diddl.denx.de (Postfix) with ESMTP id AF027325E5B5; Mon, 24 Jan 2011 22:57:13 +0100 (CET) Received: from gemini.denx.de (localhost.localdomain [127.0.0.1]) by gemini.denx.de (Postfix) with ESMTP id 82D75B187; Mon, 24 Jan 2011 22:57:13 +0100 (CET) To: Justin Piszcz cc: linux-raid@vger.kernel.org, xfs@oss.sgi.com From: Wolfgang Denk X-ASG-Orig-Subj: Re: Optimize RAID0 for max IOPS? Subject: Re: Optimize RAID0 for max IOPS? MIME-Version: 1.0 Content-type: text/plain; charset=ISO-8859-1 Content-transfer-encoding: 8bit In-reply-to: References: <20110118210112.D13A236C@gemini.denx.de> <4D361F26.3060507@stud.tu-ilmenau.de> <20110119192104.1FA92D30267@gemini.denx.de> Comments: In-reply-to Justin Piszcz message dated "Mon, 24 Jan 2011 10:25:02 -0500." Date: Mon, 24 Jan 2011 22:57:13 +0100 Message-Id: <20110124215713.82D75B187@gemini.denx.de> X-Barracuda-Connect: mail-out.m-online.net[212.18.0.9] X-Barracuda-Start-Time: 1295906237 X-Barracuda-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.53338 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dear Justin, In message you wrote: > > Some info on XFS benchmark with delaylog here: > http://comments.gmane.org/gmane.comp.file-systems.xfs.general/34379 For the record: I tested both the "delaylog" and "logbsize=262144" on two systems running Fedora 14 x86_64 (kernel version 2.6.35.10-74.fc14.x86_64). Test No. Mount options 1 rw,noatime 2 rw,noatime,delaylog 3 rw,noatime,delaylog,logbsize=262144 System A: Gigabyte EP35C-DS3R Mainbord, Core 2 Quad CPU Q9550 @ 2.83GHz, 4 GB RAM --------- software RAID 5 using 4 x old Maxtor 7Y250M0 S-ATA I disks (chunk size 16 kB, using S-ATA ports on main board), XFS Test 1: Version 1.96 ------Sequential Output------ --Sequential Input- --Random- Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP A1 8G 844 96 153107 19 56427 11 2006 98 127174 15 369.4 6 Latency 13686us 1480ms 1128ms 14986us 136ms 74911us Version 1.96 ------Sequential Create------ --------Random Create-------- A1 -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 16 104 0 +++++ +++ 115 0 89 0 +++++ +++ 111 0 Latency 326ms 171us 277ms 343ms 9us 360ms 1.96,1.96,A1,1,1295714835,8G,,844,96,153107,19,56427,11,2006,98,127174,15,369.4,6,16,,,,,104,0,+++++,+++,115,0,89,0,+++++,+++,111,0,13686us,1480ms,1128ms,14986us,136ms,74911us,326ms,171us,277ms,343ms,9us,360ms Test 2: Version 1.96 ------Sequential Output------ --Sequential Input- --Random- Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP A2 8G 417 46 67526 8 28251 5 1338 63 53780 5 236.0 4 Latency 38626us 1859ms 508ms 26689us 258ms 188ms Version 1.96 ------Sequential Create------ --------Random Create-------- A2 -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 16 51 0 +++++ +++ 128 0 102 0 +++++ +++ 125 0 Latency 1526ms 169us 277ms 363ms 8us 324ms 1.96,1.96,A2,1,1295901138,8G,,417,46,67526,8,28251,5,1338,63,53780,5,236.0,4,16,,,,,51,0,+++++,+++,128,0,102,0,+++++,+++,125,0,38626us,1859ms,508ms,26689us,258ms,188ms,1526ms,169us,277ms,363ms,8us,324ms Test 3: Version 1.96 ------Sequential Output------ --Sequential Input- --Random- Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP A3 8G 417 46 67526 8 28251 5 1338 63 53780 5 236.0 4 Latency 38626us 1859ms 508ms 26689us 258ms 188ms Version 1.96 ------Sequential Create------ --------Random Create-------- A3 -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 16 51 0 +++++ +++ 128 0 102 0 +++++ +++ 125 0 Latency 1526ms 169us 277ms 363ms 8us 324ms 1.96,1.96,A3,1,1295901138,8G,,417,46,67526,8,28251,5,1338,63,53780,5,236.0,4,16,,,,,51,0,+++++,+++,128,0,102,0,+++++,+++,125,0,38626us,1859ms,508ms,26689us,258ms,188ms,1526ms,169us,277ms,363ms,8us,324ms System B: Supermicro H8DM8-2 Mainbord, Dual-Core AMD Opteron 2216 @ 2.4 GHz, 8 GB RAM software RAID 6 using 6 x Seagate ST31000524NS S-ATA II disks (chunk size 16 kB, using a Marvell MV88SX6081 8-port SATA II PCI-X Controller) XFS Test 1: Version 1.96 ------Sequential Output------ --Sequential Input- --Random- Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP B1 16G 403 98 198720 66 53287 49 1013 99 228076 91 545.0 31 Latency 43022us 127ms 126ms 29328us 105ms 66395us Version 1.96 ------Sequential Create------ --------Random Create-------- B1 -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 16 97 1 +++++ +++ 96 1 96 1 +++++ +++ 95 1 Latency 326ms 349us 351ms 355ms 49us 363ms 1.96,1.96,B1,1,1295784794,16G,,403,98,198720,66,53287,49,1013,99,228076,91,545.0,31,16,,,,,97,1,+++++,+++,96,1,96,1,+++++,+++,95,1,43022us,127ms,126ms,29328us,105ms,66395us,326ms,349us,351ms,355ms,49us,363ms Test 2: Version 1.96 ------Sequential Output------ --Sequential Input- --Random- Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP B2 16G 380 98 197319 68 54835 48 983 99 216812 89 527.8 31 Latency 47456us 227ms 280ms 24696us 38233us 80147us Version 1.96 ------Sequential Create------ --------Random Create-------- B2 -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 16 91 1 +++++ +++ 115 1 73 1 +++++ +++ 96 1 Latency 355ms 2274us 833ms 750ms 1079us 400ms 1.96,1.96,B2,1,1295884032,16G,,380,98,197319,68,54835,48,983,99,216812,89,527.8,31,16,,,,,91,1,+++++,+++,115,1,73,1,+++++,+++,96,1,47456us,227ms,280ms,24696us,38233us,80147us,355ms,2274us,833ms,750ms,1079us,400ms Test 3: Version 1.96 ------Sequential Output------ --Sequential Input- --Random- Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP B3 16G 402 99 175802 64 55639 48 1006 99 232748 87 543.7 32 Latency 43160us 426ms 164ms 13306us 40857us 65114us Version 1.96 ------Sequential Create------ --------Random Create-------- B3 -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 16 93 1 +++++ +++ 101 1 95 1 +++++ +++ 95 1 Latency 479ms 2281us 383ms 366ms 22us 402ms 1.96,1.96,B3,1,1295880202,16G,,402,99,175802,64,55639,48,1006,99,232748,87,543.7,32,16,,,,,93,1,+++++,+++,101,1,95,1,+++++,+++,95,1,43160us,426ms,164ms,13306us,40857us,65114us,479ms,2281us,383ms,366ms,22us,402ms I do not see any significant improvement in any of the parameters - especially when compared to the serious performance degradation (down to 44% for block write, 42% for block read) on system A. Best regards, Wolfgang Denk -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de A supercomputer is a machine that runs an endless loop in 2 seconds. From david@fromorbit.com Mon Jan 24 16:02:26 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0OM2PJf122626 for ; Mon, 24 Jan 2011 16:02:26 -0600 X-ASG-Debug-ID: 1295906687-0ae2028a0000-NocioJ 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 3512B1052DB4 for ; Mon, 24 Jan 2011 14:04:47 -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 VXO50Mv7Zzth25Zv for ; Mon, 24 Jan 2011 14:04:47 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuIEAB+GPU15LN5mgWdsb2JhbACkaxYBARYiJLs7DYVDBJBS Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Jan 2011 08:34:46 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PhUWi-0002rZ-Ka; Tue, 25 Jan 2011 09:04:44 +1100 Date: Tue, 25 Jan 2011 09:04:44 +1100 From: Dave Chinner To: Ben Myers Cc: aelder@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_bmap_add_extent_delay_real should set br_startblock to nullstartblock Subject: Re: [PATCH] xfs_bmap_add_extent_delay_real should set br_startblock to nullstartblock Message-ID: <20110124220444.GE16267@dastard> References: <20110119174158.28574.63968.stgit@lady3jane.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110119174158.28574.63968.stgit@lady3jane.americas.sgi.com> 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: 1295906688 X-Barracuda-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.53337 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, Jan 19, 2011 at 11:41:58AM -0600, Ben Myers wrote: > When filling in the middle of a previous delayed allocation in > xfs_bmap_add_extent_delay_real, set br_startblock of the new delay extent to > the right to nullstartblock instead of 0 before inserting the extent into the > ifork (xfs_iext_insert), rather than setting br_startblock afterward. > > Adding the extent into the ifork with br_startblock=0 can lead to the extent > being copied into the btree by xfs_bmap_extent_to_btree if we happen to convert > from extents format to btree format before updating br_startblock with the > correct value. The unexpected addition of this delay extent to the btree can > cause subsequent XFS_WANT_CORRUPTED_GOTO filesystem shutdown in several > xfs_bmap_add_extent_delay_real cases where we are converting a delay extent to > real and unexpectedly find an extent already inserted. For example: > > 911 case BMAP_LEFT_FILLING: > 912 /* > 913 * Filling in the first part of a previous delayed allocation. > 914 * The left neighbor is not contiguous. > 915 */ > 916 trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); > 917 xfs_bmbt_set_startoff(ep, new_endoff); > 918 temp = PREV.br_blockcount - new->br_blockcount; > 919 xfs_bmbt_set_blockcount(ep, temp); > 920 xfs_iext_insert(ip, idx, 1, new, state); > 921 ip->i_df.if_lastex = idx; > 922 ip->i_d.di_nextents++; > 923 if (cur == NULL) > 924 rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; > 925 else { > 926 rval = XFS_ILOG_CORE; > 927 if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, > 928 new->br_startblock, new->br_blockcount, > 929 &i))) > 930 goto done; > 931 XFS_WANT_CORRUPTED_GOTO(i == 0, done); > > With the bogus extent in the btree we shutdown the filesystem at 931. The > conversion from extents to btree format happens when the number of extents in > the inode increases above ip->i_df.if_ext_max. xfs_bmap_extent_to_btree copies > extents from the ifork into the btree, ignoring all delalloc extents which are > denoted by br_startblock having some value of nullstartblock. > > SGI-PV: 1013221 > > Signed-off-by: Ben Myers > --- > fs/xfs/xfs_bmap.c | 33 +++++++++++++++++++++++++-------- > 1 files changed, 25 insertions(+), 8 deletions(-) > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 4111cd3..c1db779 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -1038,17 +1038,34 @@ xfs_bmap_add_extent_delay_real( > * Filling in the middle part of a previous delayed allocation. > * Contiguity is impossible here. > * This case is avoided almost all the time. > + * > + * We start with a delayed allocation: > + * > + * +ddddddddddddddddddddddddddddddddddddddddddddddddddddddd+ > + * PREV @ idx > + * > + * and we are allocating: > + * +rrrrrrrrrrrrrrrrr+ > + * new > + * > + * and we set it up for insertion as: > + * +ddddddddddddddddddd+rrrrrrrrrrrrrrrrr+ddddddddddddddddd+ > + * new > + * PREV @ idx LEFT RIGHT > + * inserted at idx + 1 > */ > temp = new->br_startoff - PREV.br_startoff; > - trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); > - xfs_bmbt_set_blockcount(ep, temp); > - r[0] = *new; > - r[1].br_state = PREV.br_state; > - r[1].br_startblock = 0; > - r[1].br_startoff = new_endoff; > temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; > - r[1].br_blockcount = temp2; > - xfs_iext_insert(ip, idx + 1, 2, &r[0], state); > + trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); > + xfs_bmbt_set_blockcount(ep, temp); /* truncate PREV */ > + LEFT = *new; > + RIGHT.br_state = PREV.br_state; > + RIGHT.br_startblock = nullstartblock( > + (int)xfs_bmap_worst_indlen(ip, temp2)); > + RIGHT.br_startoff = new_endoff; > + RIGHT.br_blockcount = temp2; > + /* insert LEFT (r[0]) and RIGHT (r[1]) at the same time */ > + xfs_iext_insert(ip, idx + 1, 2, &LEFT, state); > ip->i_df.if_lastex = idx + 1; > ip->i_d.di_nextents++; > if (cur == NULL) Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Jan 24 17:01:06 2011 X-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 (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p0ON15Zx131408 for ; Mon, 24 Jan 2011 17:01:06 -0600 X-ASG-Debug-ID: 1295910206-608401b00000-NocioJ 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 428D51054265 for ; Mon, 24 Jan 2011 15:03:26 -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 XDLqIAybp6MVCOB8 for ; Mon, 24 Jan 2011 15:03:26 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuIEAC+UPU15LN5mgWdsb2JhbACkaxYBARYiJLtTDYVDBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Jan 2011 09:33:26 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PhVRK-0002y2-S6; Tue, 25 Jan 2011 10:03:14 +1100 Date: Tue, 25 Jan 2011 10:03:14 +1100 From: Dave Chinner To: Wolfgang Denk Cc: Justin Piszcz , linux-raid@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Optimize RAID0 for max IOPS? Subject: Re: Optimize RAID0 for max IOPS? Message-ID: <20110124230314.GA11040@dastard> References: <20110118210112.D13A236C@gemini.denx.de> <4D361F26.3060507@stud.tu-ilmenau.de> <20110119192104.1FA92D30267@gemini.denx.de> <20110124215713.82D75B187@gemini.denx.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110124215713.82D75B187@gemini.denx.de> 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: 1295910208 X-Barracuda-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.53341 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, Jan 24, 2011 at 10:57:13PM +0100, Wolfgang Denk wrote: > Dear Justin, > > In message you wrote: > > > > Some info on XFS benchmark with delaylog here: > > http://comments.gmane.org/gmane.comp.file-systems.xfs.general/34379 > > For the record: I tested both the "delaylog" and "logbsize=262144" on > two systems running Fedora 14 x86_64 (kernel version > 2.6.35.10-74.fc14.x86_64). > > > Test No. Mount options > 1 rw,noatime > 2 rw,noatime,delaylog > 3 rw,noatime,delaylog,logbsize=262144 > > > System A: Gigabyte EP35C-DS3R Mainbord, Core 2 Quad CPU Q9550 @ 2.83GHz, 4 GB RAM > --------- software RAID 5 using 4 x old Maxtor 7Y250M0 S-ATA I disks > (chunk size 16 kB, using S-ATA ports on main board), XFS > > Test 1: > > Version 1.96 ------Sequential Output------ --Sequential Input- --Random- > Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- > Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP > A1 8G 844 96 153107 19 56427 11 2006 98 127174 15 369.4 6 > Latency 13686us 1480ms 1128ms 14986us 136ms 74911us > Version 1.96 ------Sequential Create------ --------Random Create-------- > A1 -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- > files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP > 16 104 0 +++++ +++ 115 0 89 0 +++++ +++ 111 0 Only 16 files? You need to test something that takes more than 5 milliseconds to run. Given that XFS can run at >20,000 creates/s for a single threaded sequential create like this, perhaps you should start at 100,000 files (maybe a million) so you get an idea of sustained performance. ..... > I do not see any significant improvement in any of the parameters - > especially when compared to the serious performance degradation (down > to 44% for block write, 42% for block read) on system A. delaylog does not affect the block IO path in any way, so something else is going on there. You need to sort that out before drawing any conclusions. Similarly, you need to test something relevant to your workload, not use a canned benchmarks in the expectation the results are in any way meaningful to your real workload. Also, if you do use a stupid canned benchmark, make sure you configure it to test something relevant to what you are trying to compare... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Jan 24 17:28:44 2011 X-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_46 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 p0ONSh3g135769 for ; Mon, 24 Jan 2011 17:28:44 -0600 X-ASG-Debug-ID: 1295911864-6eb402dd0000-NocioJ 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 617771A1CB46 for ; Mon, 24 Jan 2011 15:31:05 -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 WiaXnysKmDHo40d4 for ; Mon, 24 Jan 2011 15:31:05 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuIEALKXPU15LN5mgWdsb2JhbACkaxYBARYiJLtYDYVDBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Jan 2011 10:01:04 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PhVsE-000318-Vk; Tue, 25 Jan 2011 10:31:03 +1100 Date: Tue, 25 Jan 2011 10:31:02 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/5] xfs: limit extent length for allocation to AG size Subject: Re: [PATCH 2/5] xfs: limit extent length for allocation to AG size Message-ID: <20110124233102.GB11040@dastard> References: <1295411400-15614-1-git-send-email-david@fromorbit.com> <1295411400-15614-3-git-send-email-david@fromorbit.com> <20110124090252.GC26744@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110124090252.GC26744@infradead.org> 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: 1295911866 X-Barracuda-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.53344 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, Jan 24, 2011 at 04:02:52AM -0500, Christoph Hellwig wrote: > > + /* > > + * The requested extent can be larger than an AG, so trim the block > > + * count back to the maximum sized extent in an AG. A typical empty AG > > + * consumes 1 block for headers, 1 block for each btree root (3) and 4 > > + * blocks for the free list. > > + */ > > + args.maxlen = MIN(ap->alen, mp->m_sb.sb_agblocks - 8); > > Maybe add a define for the over head blocks to document it more clearly? > Will do. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Jan 24 17:30:10 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ONUASR136068 for ; Mon, 24 Jan 2011 17:30:10 -0600 X-ASG-Debug-ID: 1295911951-604f02bb0000-NocioJ 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 8BCD91546F46 for ; Mon, 24 Jan 2011 15:32:31 -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 3wQNCQmPb0vDitDJ for ; Mon, 24 Jan 2011 15:32:31 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuIEADabPU15LN5mgWdsb2JhbACkaxYBARYiJLtfDYVDBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Jan 2011 10:02:19 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PhVtS-00031H-Oh; Tue, 25 Jan 2011 10:32:18 +1100 Date: Tue, 25 Jan 2011 10:32:18 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/5] xfs: prevent extsize alignment from exceeding maximum extent size Subject: Re: [PATCH 3/5] xfs: prevent extsize alignment from exceeding maximum extent size Message-ID: <20110124233218.GC11040@dastard> References: <1295411400-15614-1-git-send-email-david@fromorbit.com> <1295411400-15614-4-git-send-email-david@fromorbit.com> <20110124090458.GD26744@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110124090458.GD26744@infradead.org> 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: 1295911952 X-Barracuda-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.53343 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, Jan 24, 2011 at 04:04:59AM -0500, Christoph Hellwig wrote: > > + /* > > + * make sure we don't exceed a single > > + * extent length when we align the > > + * extent by reducing length we are > > + * going to allocate by the maximum > > + * amount extent size aligment may > > + * require. > > + alen = (xfs_extlen_t)XFS_FILBLKS_MIN( > > + len, > > + MAXEXTLEN - (2 * extsz - 1)); > > + */ > > This essentially just adds a comment, given that the new code is inside > the bracing. Also the xfs_extlen_t cast seems pointless. The C type > promotion rules do just fine for going down from a 64bit type to a 32bit > one, as long as the results fit into the latter - which they always do > here. Argh, forgot to refresh the patch after doing some bug hunting. I'll fix it and retest before I repost it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Jan 24 17:35:15 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ONZEn5136993 for ; Mon, 24 Jan 2011 17:35:14 -0600 X-ASG-Debug-ID: 1295912256-63db02950000-NocioJ 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 7DADA1053904 for ; Mon, 24 Jan 2011 15:37:36 -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 ysYPwBEMJcwj4pzD for ; Mon, 24 Jan 2011 15:37:36 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuIEADabPU15LN5mgWdsb2JhbACkaxYBARYiJLtfDYVDBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Jan 2011 10:07:35 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PhVyZ-00032J-2z; Tue, 25 Jan 2011 10:37:35 +1100 Date: Tue, 25 Jan 2011 10:37:35 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: limit extsize to size of AGs and/or MAXEXTLEN Subject: Re: [PATCH 4/5] xfs: limit extsize to size of AGs and/or MAXEXTLEN Message-ID: <20110124233735.GD11040@dastard> References: <1295411400-15614-1-git-send-email-david@fromorbit.com> <1295411400-15614-5-git-send-email-david@fromorbit.com> <20110124090656.GE26744@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110124090656.GE26744@infradead.org> 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: 1295912257 X-Barracuda-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.53345 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, Jan 24, 2011 at 04:06:56AM -0500, Christoph Hellwig wrote: > On Wed, Jan 19, 2011 at 03:29:59PM +1100, Dave Chinner wrote: > > + * Also, for non-realtime files, limit the extent size hint to > > + * half the size of the AGs in the filesystem so alignment > > + * doesn't result in extents larger than an AG. > > What do we do about the last AG, which potentionally is smaller than the > others? Not sure - I didn't actually consider that case because I forgot about it. At first glance it doesn't matter because it won't get selected because the length of the AG is less than the requested size unless it is the best match. If it is the best match, we can't do extsize alignment anyway, so it's the same case as any other allocation without a freespace extent large enough for alignment. I'll do a bit more analysis, but I think we're OK here. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Jan 24 17:40:32 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ONeW68137577 for ; Mon, 24 Jan 2011 17:40:32 -0600 X-ASG-Debug-ID: 1295912573-0bee02920000-NocioJ 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 533251DC1531 for ; Mon, 24 Jan 2011 15:42:54 -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 sTeivIVFpPO01TE9 for ; Mon, 24 Jan 2011 15:42:54 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuIEADabPU15LN5mgWdsb2JhbACkaxYBARYiJLtfDYVDBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Jan 2011 10:12:53 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PhW3A-00033O-Ap; Tue, 25 Jan 2011 10:42:20 +1100 Date: Tue, 25 Jan 2011 10:42:20 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/5] xfs: handle CIl transaction commit failures correctly Subject: Re: [PATCH 5/5] xfs: handle CIl transaction commit failures correctly Message-ID: <20110124234220.GE11040@dastard> References: <1295411400-15614-1-git-send-email-david@fromorbit.com> <1295411400-15614-6-git-send-email-david@fromorbit.com> <20110124091249.GF26744@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110124091249.GF26744@infradead.org> 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: 1295912575 X-Barracuda-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.53344 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, Jan 24, 2011 at 04:12:49AM -0500, Christoph Hellwig wrote: > > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > > index 50753d3..504a804 100644 > > --- a/fs/xfs/xfs_trans.c > > +++ b/fs/xfs/xfs_trans.c > > @@ -1754,15 +1754,26 @@ xfs_trans_commit_cil( > > */ > > log_vector = xfs_trans_alloc_log_vecs(tp); > > if (!log_vector) > > - return ENOMEM; > > + goto out_enomem; > > > > error = xfs_log_commit_cil(mp, tp, log_vector, commit_lsn, flags); > > - if (error) > > - return error; > > + if (error) { > > + /* > > + * We will only get an error if no modifications have been > > + * made to the items in the transaction. Hence treat it > > + the same as a memory allocation failure. > > + */ > > + goto out_enomem; > > + } > > > > current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); > > xfs_trans_free(tp); > > return 0; > > + > > +out_enomem: > > + /* caller cleans up transaction */ > > + current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); > > + return ENOMEM; > > _xfs_trans_commit already restores the process flags for an ENOMEM > return, so the failure from xfs_trans_alloc_log_vecs is already > handled correctly. If we want to handle the EIO return from > xfs_log_commit_cil the same way it just needs to be turned into an > ENOMEM. The big questions is if there's any point in having the > shutdown check in xfs_trans_commit_cil - we already do one just before > applying the trans deltas in _xfs_trans_commit, which is handled > correctly and should be sufficient. True. Removing the shutdown check makes xfs_log_commit_cil() a function that can have a void return. That's probably a better solution, so I'll modify it that way. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Jan 24 17:45:38 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ONjbr4138666 for ; Mon, 24 Jan 2011 17:45:38 -0600 X-ASG-Debug-ID: 1295912878-749802340000-NocioJ 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 B0B5E28D1B5 for ; Mon, 24 Jan 2011 15:47:59 -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 GPtqYLzYgq2eaCwA for ; Mon, 24 Jan 2011 15:47:59 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuIEALuePU15LN5mgWdsb2JhbACkaxYBARYiJLtpDYVDBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Jan 2011 10:17:42 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PhW8L-00034i-9s; Tue, 25 Jan 2011 10:47:41 +1100 Date: Tue, 25 Jan 2011 10:47:41 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/3] libxlog: sync up with 2.6.38 kernel code Subject: Re: [PATCH 2/3] libxlog: sync up with 2.6.38 kernel code Message-ID: <20110124234741.GF11040@dastard> References: <1294649091-27174-1-git-send-email-david@fromorbit.com> <1294649091-27174-3-git-send-email-david@fromorbit.com> <20110124084732.GA4378@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110124084732.GA4378@infradead.org> 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: 1295912880 X-Barracuda-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.53344 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, Jan 24, 2011 at 03:47:32AM -0500, Christoph Hellwig wrote: > > +typedef int32_t atomic_t; > > +typedef int64_t atomic64_t; > > + > > +#define atomic_inc_return(x) (++(*(x))) > > +#define atomic_dec_return(x) (--(*(x))) > > + > > +#define atomic64_read(x) *(x) > > +#define atomic64_set(x, v) (*(x) = v) > > These defintions are pretty dangerous if we ever happens to use > them in multi-threaded code like repair. Currently we're not, > but they should grow a larger warning comment. Ok, I'll add a warning to that effect. > > --- /dev/null > > +++ b/include/hlist.h > > Why not add the hlist helpers to list.h, like in the kernel tree? It was just a side effect of the process I followed to add the bits of missing functionality that were needed. I can add it to list.h if you want, but I don't think it really matters either way... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Jan 24 17:53:13 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0ONrCPt139608 for ; Mon, 24 Jan 2011 17:53:13 -0600 X-ASG-Debug-ID: 1295913333-7138025e0000-NocioJ 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 456B61056542 for ; Mon, 24 Jan 2011 15:55:34 -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 dZBzBtySor6FspXP for ; Mon, 24 Jan 2011 15:55:34 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuIEALuePU15LN5mgWdsb2JhbACkaxYBARYiJLtpDYVDBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Jan 2011 10:25:33 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PhWFw-00035W-MU; Tue, 25 Jan 2011 10:55:32 +1100 Date: Tue, 25 Jan 2011 10:55:32 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/3] libxfs: sync files with 2.6.38 kernel code Subject: Re: [PATCH 3/3] libxfs: sync files with 2.6.38 kernel code Message-ID: <20110124235532.GG11040@dastard> References: <1294649091-27174-1-git-send-email-david@fromorbit.com> <1294649091-27174-4-git-send-email-david@fromorbit.com> <20110124085751.GB4378@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110124085751.GB4378@infradead.org> 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: 1295913335 X-Barracuda-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.53345 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, Jan 24, 2011 at 03:57:51AM -0500, Christoph Hellwig wrote: > > +/* XXX: fix this up! */ > > #define OFF(f) bitize(offsetof(xfs_dinode_t, di_ ## f)) > > const field_t inode_flds[] = { > > - { "core", FLDT_DINODE_CORE, OI(OFF(core)), C1, 0, TYP_NONE }, > > - { "next_unlinked", FLDT_AGINO, OI(OFF(next_unlinked)), C1, 0, > > - TYP_INODE }, > > - { "u", FLDT_DINODE_U, OI(OFF(u)), C1, 0, TYP_NONE }, > > + { "core", FLDT_DINODE_CORE, OI(OFF(magic)), C1, 0, TYP_NONE }, > > + { "u", FLDT_DINODE_U, inode_u_offset, C1, FLD_OFFSET, TYP_NONE }, > > I think the right way to fix this is to copy over all fields from > the dinode core, and keep a "virtual" core field and the inode_core > table for backwards compatiblity. OK. By "virtual" core field, do you mean something like what I have about, or something different? > > + { "next_unlinked", FLDT_AGINO, OI(OFF(next_unlinked)), C1, 0, > > + TYP_INODE }, > > I think this one should only be added to the real dinode, not the core. Good catch. I mixed up what was in xfs_icdinode and xfs_dinode there. > > > #define XFS_BUF_LOCK 0 > > #define XFS_BUF_TRYLOCK 0 > > +#define XBF_LOCK XFS_BUF_LOCK > > +#define XBF_TRYLOCK XFS_BUF_TRYLOCK > > +#define XBF_DONT_BLOCK 0 > > Please kill off the XFS_BUF_* flags, just like in kernelspace. Will do. Thanks for spending the time to look over these huge patches, Christoph. Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Mon Jan 24 21:58:58 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P3ww1r176084 for ; Mon, 24 Jan 2011 21:58:58 -0600 X-ASG-Debug-ID: 1295928078-4ab0015c0001-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DBA4C8A549F for ; Mon, 24 Jan 2011 20:01:20 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id TA5Ao9UAYzNMBOFu for ; Mon, 24 Jan 2011 20:01:20 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnwEAK/XPU15LN5mgWdsb2JhbACkaxYBARYiJLtahVAE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 14:31:16 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1Pha5j-0003Tu-BQ for xfs@oss.sgi.com; Tue, 25 Jan 2011 15:01:15 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pha3Y-0005Nk-Ty for xfs@oss.sgi.com; Tue, 25 Jan 2011 14:59:00 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/4] xfstests: Speed up test 042 Subject: [PATCH 4/4] xfstests: Speed up test 042 Date: Tue, 25 Jan 2011 14:58:57 +1100 Message-Id: <1295927937-20634-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295927937-20634-1-git-send-email-david@fromorbit.com> References: <1295927937-20634-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295928080 X-Barracuda-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.53361 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 test 042 generates a worst-case fragmented filesystem and uses it to test xfs_fsr. It uses small 4k files to generate the hole-space-hole pattern that fragments free space badly. It is much faster to generate the same pattern by creating a single large file and punching holes in it. Also, instead of writing large files to create unfragmented space, just use preallocation so we don't have to write the data to disk. These changes reduce the runtime of the test on a single SATA drive from 106s to 27s. Signed-off-by: Dave Chinner --- 042 | 38 ++++++++++++++++++++++++++++++-------- 042.out | 6 +++--- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/042 b/042 index 7ac5492..c583746 100755 --- a/042 +++ b/042 @@ -100,16 +100,19 @@ echo "done" echo -n "Reserve 16 1Mb unfragmented regions... " for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 do - _do "dd if=/dev/zero of=$SCRATCH_MNT/hole$i bs=4096 count=256" - _do "dd if=/dev/zero of=$SCRATCH_MNT/space$i bs=4096 count=1" - _do "xfs_bmap -v $SCRATCH_MNT/hole$i" + _do "$XFS_IO_PROG -f -c \"resvsp 0 1m\" $SCRATCH_MNT/hole$i" + _do "$XFS_IO_PROG -f -c \"resvsp 0 4k\" $SCRATCH_MNT/space$i" + _do "$XFS_IO_PROG -f -c \"resvsp 0 1m\" $SCRATCH_MNT/hole$i" + _do "xfs_bmap -vp $SCRATCH_MNT/hole$i" done echo "done" # set up filesystem -echo -n "Fill filesystem with 4k files, generate manifest... " -fill_options="--verbose --seed=0 --filesize=4096 --stddev=0 --sync=1000000" -_do "src/fill2fs $fill_options --dir=$SCRATCH_MNT/fill --list=- > $tmp.manifest" +echo -n "Fill filesystem with fill file... " +for i in `seq 0 1 31`; do + _do "$XFS_IO_PROG -fs -c \"pwrite -S$i ${i}m 1m\" $SCRATCH_MNT/fill" +done +_do "xfs_bmap -vp $SCRATCH_MNT/fill" echo "done" # flush the filesystem - make sure there is no space "lost" to pre-allocation _do "umount $SCRATCH_MNT" @@ -119,7 +122,18 @@ _do "dd if=/dev/zero of=$SCRATCH_MNT/pad bs=4096" echo "done" # create fragmented file -_do "Delete every second file" "_cull_files" +#_do "Delete every second file" "_cull_files" +echo -n "Punch every second 4k block... " +for i in `seq 0 8 32768`; do + # This generates excessive output that significantly slows down the + # test. It's not necessary for debug, so just bin it. + $XFS_IO_PROG -f -c "unresvsp ${i}k 4k" $SCRATCH_MNT/fill \ + > /dev/null 2>&1 +done +_do "xfs_bmap -vp $SCRATCH_MNT/fill" +_do "sum $SCRATCH_MNT/fill >$tmp.fillsum1" +echo "done" + echo -n "Create one very large file... " _do "src/fill2 -d nbytes=16000000,file=$SCRATCH_MNT/fragmented" echo "done" @@ -130,7 +144,15 @@ _do "Remove other files" "rm -rf $SCRATCH_MNT/{pad,hole*}" # defragment _do "Run xfs_fsr on filesystem" "$XFS_FSR_PROG -v $SCRATCH_MNT/fragmented" _do "xfs_bmap -v $SCRATCH_MNT/fragmented" -_do "Check 4k files" "src/fill2fs_check $tmp.manifest" + +echo -n "Check fill file... " +_do "sum $SCRATCH_MNT/fill >$tmp.fillsum2" +if ! _do "diff $tmp.fillsum1 $tmp.fillsum2"; then + echo "fail" + echo "Fill file is corrupt/missing after fsr. Test failed see $seq.full" + status=1; exit +fi +echo "done" # check echo -n "Check large file... " diff --git a/042.out b/042.out index 7f2e837..f5b37b3 100644 --- a/042.out +++ b/042.out @@ -1,13 +1,13 @@ QA output created by 042 Make a 48 megabyte filesystem on SCRATCH_DEV and mount... done Reserve 16 1Mb unfragmented regions... done -Fill filesystem with 4k files, generate manifest... done +Fill filesystem with fill file... done Use up any further available space using dd... done -Delete every second file... done +Punch every second 4k block... done Create one very large file... done Remove other files... done Run xfs_fsr on filesystem... done -Check 4k files... done +Check fill file... done Check large file... done Checking filesystem... done xfs_fsr tests passed. -- 1.7.2.3 From dave@fromorbit.com Mon Jan 24 21:58:59 2011 X-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 p0P3ww7C176100 for ; Mon, 24 Jan 2011 21:58:59 -0600 X-ASG-Debug-ID: 1295928080-6cfb02a60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A62FA28D519 for ; Mon, 24 Jan 2011 20:01:20 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id siP592DjpzcsHJFO for ; Mon, 24 Jan 2011 20:01:20 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnwEAK/XPU15LN5mgWdsb2JhbACkaxYBARYiJLtahVAE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 14:31:16 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1Pha5j-0003Tq-7t for xfs@oss.sgi.com; Tue, 25 Jan 2011 15:01:15 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pha3Y-0005Ne-Qa for xfs@oss.sgi.com; Tue, 25 Jan 2011 14:59:00 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/4] xfstests: add test to reproduce bmap btree corruption. Subject: [PATCH 2/4] xfstests: add test to reproduce bmap btree corruption. Date: Tue, 25 Jan 2011 14:58:55 +1100 Message-Id: <1295927937-20634-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295927937-20634-1-git-send-email-david@fromorbit.com> References: <1295927937-20634-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295928081 X-Barracuda-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.53362 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 problem was reprted here: https://bugzilla.redhat.com/show_bug.cgi?id=626244 With the simple test case: # mkfs.xfs -f -d agsize=16m,size=50g # mount /mnt # xfs_io -f -c 'resvsp 0 40G' /mnt/foo Triggering the problem. Turn this into a new xfsqa test so that we exercise the problem code and prevent future regressions. Signed-off-by: Dave Chinner --- 250 | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ group | 1 + 2 files changed, 98 insertions(+), 0 deletions(-) create mode 100644 250 diff --git a/250 b/250 new file mode 100644 index 0000000..cb0fa9c --- /dev/null +++ b/250 @@ -0,0 +1,97 @@ +#! /bin/bash +# FS QA Test No. 250 +# +# Bmap btree corruption regression test +# +#----------------------------------------------------------------------- +# Copyright (c) 2011 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=dchinner@redhat.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 / + umount $LOOP_MNT 2>/dev/null + rm -f $LOOP_DEV + rmdir $LOOP_MNT + _cleanup_testdir +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs xfs +_supported_os Linux +_require_loop + +LOOP_DEV=$TEST_DIR/$seq.fs +LOOP_MNT=$TEST_DIR/$seq.mnt + +_filter_io() +{ + sed -e '/.* ops; /d' +} + +# real QA test starts here + +echo "*** create loop mount point" +rmdir $LOOP_MNT 2>/dev/null +mkdir -p $LOOP_MNT || _fail "cannot create loopback mount point" + +_test_loop() +{ + size=$1 + agsize=$2 + fsize=$3 + + dparam="file,name=$LOOP_DEV,size=$size" + if [ -n "$agsize" ]; then + dparam="$dparam,agsize=$agsize" + fi + + echo "*** mkfs loop file (size=$size)" + $MKFS_XFS_PROG -d $dparam \ + | _filter_mkfs # 2>/dev/null + + echo "*** mount loop filesystem" + mount -t xfs -o loop $LOOP_DEV $LOOP_MNT + + echo "*** preallocate large file" + xfs_io -f -c "resvsp 0 $fsize" $LOOP_MNT/foo | _filter_io + + echo "*** unmount loop filesystem" + umount $LOOP_MNT + + echo "*** check loop filesystem" + _check_xfs_filesystem $LOOP_DEV none none +} + +_test_loop 50g 16m 40G +echo "*** done" +status=0 +exit diff --git a/group b/group index b94f543..b18f2e6 100644 --- a/group +++ b/group @@ -363,3 +363,4 @@ deprecated 247 auto quick rw 248 auto quick rw 249 auto quick rw +250 auto quick rw prealloc metadata -- 1.7.2.3 From dave@fromorbit.com Mon Jan 24 21:58:58 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P3wvdO176082 for ; Mon, 24 Jan 2011 21:58:58 -0600 X-ASG-Debug-ID: 1295928078-4ab0015c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CFCE98A549E for ; Mon, 24 Jan 2011 20:01:18 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 4BHTgXyqm086ZYZQ for ; Mon, 24 Jan 2011 20:01:18 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqoFAK/XPU15LN5mgWdsb2JhbACWTo4dFgEBFiIku1qFUAQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 14:31:16 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1Pha5j-0003To-5I for xfs@oss.sgi.com; Tue, 25 Jan 2011 15:01:15 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pha3Y-0005Na-MS for xfs@oss.sgi.com; Tue, 25 Jan 2011 14:59:00 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/4] xfstests: new tests and fixes Subject: [PATCH 0/4] xfstests: new tests and fixes Date: Tue, 25 Jan 2011 14:58:53 +1100 Message-Id: <1295927937-20634-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295928079 X-Barracuda-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.53361 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 Pushing out my current stack: - Fix test 016 to work with delaylog. - Speed up 042 by using preallocation instead of writing data and files. - Add test to exercise bmap btree corruption caused by multilevel split. - Add simple test to exercise splice writes to catch locking issues. From dave@fromorbit.com Mon Jan 24 21:59:05 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P3x5NL176143 for ; Mon, 24 Jan 2011 21:59:05 -0600 X-ASG-Debug-ID: 1295928086-60c803760000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D588128D51D for ; Mon, 24 Jan 2011 20:01:27 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id t1UgAF4EEYfXKLe3 for ; Mon, 24 Jan 2011 20:01:27 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqoFAK/XPU15LN5mgWdsb2JhbACWTo4dFgEBFiIku1qFUAQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 14:31:26 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1Pha5j-0003Tp-65 for xfs@oss.sgi.com; Tue, 25 Jan 2011 15:01:15 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pha3Y-0005Nc-OK for xfs@oss.sgi.com; Tue, 25 Jan 2011 14:59:00 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/4] xfstests: add simple splice test Subject: [PATCH 1/4] xfstests: add simple splice test Date: Tue, 25 Jan 2011 14:58:54 +1100 Message-Id: <1295927937-20634-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295927937-20634-1-git-send-email-david@fromorbit.com> References: <1295927937-20634-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295928087 X-Barracuda-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.53362 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 don't have any coverage of the splice functionality provided by the kernel in xfstests. Add a simple test that uses the sendfile operation built into xfs_io to copy a file ensure we at least execute the code path in xfstests. Signed-off-by: Dave Chinner --- 249 | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 249.out | 2 ++ group | 1 + 3 files changed, 65 insertions(+), 0 deletions(-) create mode 100644 249 create mode 100644 249.out diff --git a/249 b/249 new file mode 100644 index 0000000..6fc972e --- /dev/null +++ b/249 @@ -0,0 +1,62 @@ +#! /bin/bash +# FS QA Test No. 249 +# +# simple splice(2) test. +# +#----------------------------------------------------------------------- +# Copyright (c) 2011 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=dchinner@redhat.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.* + rm -f $SRC $DST + _cleanup_testdir +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_setup_testdir + +echo "Feel the serenity." + +SRC=$TEST_DIR/$seq.src +DST=$TEST_DIR/$seq.dst + +$XFS_IO_PROG -f -c "pwrite -S 0xa5a55a5a 0 32768k" -c fsync $SRC > /dev/null 2>&1 +$XFS_IO_PROG -f -c "sendfile -i $SRC 0 32768k" -c fsync $DST > /dev/null 2>&1 + +diff $SRC $DST + +status=$? +exit diff --git a/249.out b/249.out new file mode 100644 index 0000000..592696f --- /dev/null +++ b/249.out @@ -0,0 +1,2 @@ +QA output created by 249 +Feel the serenity. diff --git a/group b/group index a40c98f..b94f543 100644 --- a/group +++ b/group @@ -362,3 +362,4 @@ deprecated 246 auto quick rw 247 auto quick rw 248 auto quick rw +249 auto quick rw -- 1.7.2.3 From dave@fromorbit.com Mon Jan 24 21:59:06 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P3x6Kn176154 for ; Mon, 24 Jan 2011 21:59:06 -0600 X-ASG-Debug-ID: 1295928086-60c803760001-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 10B1228D51F for ; Mon, 24 Jan 2011 20:01:28 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id VzbwwbTL0l9HkeU7 for ; Mon, 24 Jan 2011 20:01:28 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqoFAK/XPU15LN5mgWdsb2JhbACWTo4dFgEBFiIku1qFUAQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 14:31:26 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1Pha5j-0003Tr-9l for xfs@oss.sgi.com; Tue, 25 Jan 2011 15:01:15 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Pha3Y-0005Nh-SM for xfs@oss.sgi.com; Tue, 25 Jan 2011 14:59:00 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/4] xfstests: make 016 work with delaylog Subject: [PATCH 3/4] xfstests: make 016 work with delaylog Date: Tue, 25 Jan 2011 14:58:56 +1100 Message-Id: <1295927937-20634-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295927937-20634-1-git-send-email-david@fromorbit.com> References: <1295927937-20634-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295928089 X-Barracuda-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.53362 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 Test 016 fails with delaylog because it measures log traffic to disk and delaylog writes almost nothing to the log for the given test. TO make it work, add sync calls to the work loop to cause the log to be flushed reliably for both delaylog and nodelaylog and hence contain the same nuumber of log records. As a result, the log space consumed by the test is not changed by the delaylog option and the test passes. The test is not significantly slowed down by the addition of the sync calls (takes 15s to run on a single SATA drive). Signed-off-by: Dave Chinner --- 016 | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/016 b/016 index 980eb0b..32d8b19 100755 --- a/016 +++ b/016 @@ -101,7 +101,9 @@ _log_traffic() while [ $count -ge 0 ] do touch $out + sync rm $out + sync let "count = count - 1" done -- 1.7.2.3 From david@fromorbit.com Mon Jan 24 22:21:05 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P4L5rX179571 for ; Mon, 24 Jan 2011 22:21:05 -0600 X-ASG-Debug-ID: 1295929407-6d0203460000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CCDFA28D6C3 for ; Mon, 24 Jan 2011 20:23:27 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id tB7PX2v5FwDSS0Yr for ; Mon, 24 Jan 2011 20:23:27 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnwEAMPePU15LN5mgWdsb2JhbACkaxYBARYiJLtcDYVDBJIL Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 14:53:26 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PhaRB-0003Vv-Oj; Tue, 25 Jan 2011 15:23:25 +1100 Date: Tue, 25 Jan 2011 15:23:25 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: clean up the xfs_alloc_compute_aligned calling convention Subject: Re: [PATCH 1/6] xfs: clean up the xfs_alloc_compute_aligned calling convention Message-ID: <20110125042325.GI11040@dastard> References: <20110121092227.115815324@bombadil.infradead.org> <20110121092550.457037752@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110121092550.457037752@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295929408 X-Barracuda-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.53364 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, Jan 21, 2011 at 04:22:28AM -0500, Christoph Hellwig wrote: > Pass a xfs_alloc_arg structure to xfs_alloc_compute_aligned and derive > the alignment and minlen paramters from it. This cleans up the existing > callers, and we'll need even more information from the xfs_alloc_arg > in subsequent patches. Based on a patch from Dave Chinner. > > Signed-off-by: Christoph Hellwig Good cleanup. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Jan 24 22:27:43 2011 X-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 p0P4RheB180683 for ; Mon, 24 Jan 2011 22:27:43 -0600 X-ASG-Debug-ID: 1295929804-2b64006c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 835201A1D4EB for ; Mon, 24 Jan 2011 20:30:05 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ufHEEvvkbGGGjfiQ for ; Mon, 24 Jan 2011 20:30:05 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnwEAMPePU15LN5mgWdsb2JhbACkaxYBARYiJLtcDYVDBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 15:00:03 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PhaXb-0003Wi-4J; Tue, 25 Jan 2011 15:30:03 +1100 Date: Tue, 25 Jan 2011 15:30:03 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: factor agf counter updates into a helper Subject: Re: [PATCH 2/6] xfs: factor agf counter updates into a helper Message-ID: <20110125043003.GJ11040@dastard> References: <20110121092227.115815324@bombadil.infradead.org> <20110121092550.694829728@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110121092550.694829728@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295929806 X-Barracuda-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.53364 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, Jan 21, 2011 at 04:22:29AM -0500, Christoph Hellwig wrote: > Updating the AGF/trans counters is duplicated between allocating and > freeing extents. Factor the code into a common helper. > > Signed-off-by: Christoph Hellwig Looks good, but one minor thing: > ASSERT(0); > /* NOTREACHED */ > } > - if (error) > + > + if (error || args->agbno == NULLAGBLOCK) > return error; > - /* > - * If the allocation worked, need to change the agf structure > - * (and log it), and the superblock. > - */ > - if (args->agbno != NULLAGBLOCK) { > - xfs_agf_t *agf; /* allocation group freelist header */ > - long slen = (long)args->len; > - > - ASSERT(args->len >= args->minlen && args->len <= args->maxlen); > - ASSERT(!(args->wasfromfl) || !args->isfl); > - ASSERT(args->agbno % args->alignment == 0); > - if (!(args->wasfromfl)) { > - > - agf = XFS_BUF_TO_AGF(args->agbp); > - be32_add_cpu(&agf->agf_freeblks, -(args->len)); > - xfs_trans_agblocks_delta(args->tp, > - -((long)(args->len))); > - args->pag->pagf_freeblks -= args->len; > - ASSERT(be32_to_cpu(agf->agf_freeblks) <= > - be32_to_cpu(agf->agf_length)); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The assert is lost in this path. > - xfs_alloc_log_agf(args->tp, args->agbp, > - XFS_AGF_FREEBLKS); > - /* > - * Search the busylist for these blocks and mark the > - * transaction as synchronous if blocks are found. This > - * avoids the need to block due to a synchronous log > - * force to ensure correct ordering as the synchronous > - * transaction will guarantee that for us. > - */ > - if (xfs_alloc_busy_search(args->mp, args->agno, > - args->agbno, args->len)) > - xfs_trans_set_sync(args->tp); > - } > - if (!args->isfl) > - xfs_trans_mod_sb(args->tp, > - args->wasdel ? XFS_TRANS_SB_RES_FDBLOCKS : > - XFS_TRANS_SB_FDBLOCKS, -slen); > - XFS_STATS_INC(xs_allocx); > - XFS_STATS_ADD(xs_allocb, args->len); > + > + ASSERT(args->len >= args->minlen); > + ASSERT(args->len <= args->maxlen); > + ASSERT(!args->wasfromfl || !args->isfl); > + ASSERT(args->agbno % args->alignment == 0); > + > + if (!args->wasfromfl) { > + xfs_alloc_update_counters(args->tp, args->pag, args->agbp, > + -((long)(args->len))); Perhaps catching the error here and adding an ASSERT(error == 0) would be a good idea. Otherwise, Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From aurora12@magellan.lunarpages.com Mon Jan 24 23:07:44 2011 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,TVD_SPACE_RATIO 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 p0P57ihN188283 for ; Mon, 24 Jan 2011 23:07:44 -0600 X-ASG-Debug-ID: 1295932206-6935015a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from magellan.lunarpages.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1B65428DA2B for ; Mon, 24 Jan 2011 21:10:06 -0800 (PST) Received: from magellan.lunarpages.com (magellan.lunarpages.com [216.97.235.50]) by cuda.sgi.com with ESMTP id 2jNh3q2FP3XHYfiP for ; Mon, 24 Jan 2011 21:10:06 -0800 (PST) Received: from aurora12 by magellan.lunarpages.com with local (Exim 4.69) (envelope-from ) id 1PhbAJ-0007vz-67 for xfs@oss.sgi.com; Mon, 24 Jan 2011 21:10:03 -0800 To: xfs@oss.sgi.com X-ASG-Orig-Subj: oakvillegolfcourse.ca/gt/gera Subject: oakvillegolfcourse.ca/gt/gera From: unblessed@puttering3enumerates.com Content-type: text/plain; charset=windows-1251 Message-Id: Date: Mon, 24 Jan 2011 21:10:03 -0800 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - magellan.lunarpages.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [32199 32200] / [47 12] X-AntiAbuse: Sender Address Domain - magellan.lunarpages.com X-Barracuda-Connect: magellan.lunarpages.com[216.97.235.50] X-Barracuda-Start-Time: 1295932207 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.53366 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 From michael.monnerie@is.it-management.at Tue Jan 25 00:18:58 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P6Iwk9201315 for ; Tue, 25 Jan 2011 00:18:58 -0600 X-ASG-Debug-ID: 1295936477-33d3011e0000-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 7B4698AA2F5 for ; Mon, 24 Jan 2011 22:21:18 -0800 (PST) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id 31RFdW9nQDNOGvBv for ; Mon, 24 Jan 2011 22:21:18 -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 626C3601; Tue, 25 Jan 2011 07:21:16 +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 26DE1401C3D; Tue, 25 Jan 2011 07:21:15 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: extremely slow write performance plaintext Subject: Re: extremely slow write performance plaintext Date: Tue, 25 Jan 2011 07:21:09 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.37-zmi; KDE/4.4.4; x86_64; ; ) Cc: Cory Coager , Stan Hoeppner References: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> <4D30C7F3.3040105@hardwarefreak.com> <1779_1295360207_4D35A0CF_1779_747_1_4D35A0CF.9050503@davisvision.com> In-Reply-To: <1779_1295360207_4D35A0CF_1779_747_1_4D35A0CF.9050503@davisvision.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart2800498.z8KdFmrLEf"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201101250721.14716@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1295936479 X-Barracuda-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.53371 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 --nextPart2800498.z8KdFmrLEf Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Dienstag, 18. Januar 2011 Cory Coager wrote: > Also, I want to stress that I am only having performance issues with > one logical volume, the others seem fine. You're getting 40MB/s write speed and says that's fine? I get more=20 performance from a single SATA desktop drive. Your setup seems to suck=20 extremely somewhere. It already starts with your dd speed. I started it on a virtualized VM=20 on an old, overloaded server and get: # dd if=3D/dev/zero of=3Dtest.dd bs=3D1k count=3D1M 1048576+0 Datens=E4tze ein 1048576+0 Datens=E4tze aus 1073741824 Bytes (1,1 GB) kopiert, 10,9992 s, 97,6 MB/s This is a hardware RAID 6 with just 8x 10krpm WD SATA drives. Try to=20 look into general I/O problems. Maybe you can try to boot from an actual=20 linux CD with kernel >2.6.30 to see if that helps performance. Maybe one or more disks in your array are dead and the controller is=20 crying for replacement? =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/ --nextPart2800498.z8KdFmrLEf 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) iEYEABECAAYFAk0+a9oACgkQzhSR9xwSCbSMLwCgq2/V3O81NfYnOnUhlmdd9E/P a4AAoKp/QzcB/KbtDN1VgHx0QPAffdX2 =aX+8 -----END PGP SIGNATURE----- --nextPart2800498.z8KdFmrLEf-- From eflorac@intellique.com Tue Jan 25 01:37:15 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P7bFIs213199 for ; Tue, 25 Jan 2011 01:37:15 -0600 X-ASG-Debug-ID: 1295941172-16be02730000-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 4D57E1A1DA09 for ; Mon, 24 Jan 2011 23:39:36 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id gKtN8Lvm2mAWF4bm for ; Mon, 24 Jan 2011 23:39:36 -0800 (PST) Received: from galadriel2.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id A82AFA6233; Tue, 25 Jan 2011 08:39:27 +0100 (CET) Date: Tue, 25 Jan 2011 08:39:00 +0100 From: Emmanuel Florac To: Dave Chinner Cc: Wolfgang Denk , linux-raid@vger.kernel.org, Justin Piszcz , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Optimize RAID0 for max IOPS? Subject: Re: Optimize RAID0 for max IOPS? Message-ID: <20110125083900.4dd65bf2@galadriel2.home> In-Reply-To: <20110124230314.GA11040@dastard> References: <20110118210112.D13A236C@gemini.denx.de> <4D361F26.3060507@stud.tu-ilmenau.de> <20110119192104.1FA92D30267@gemini.denx.de> <20110124215713.82D75B187@gemini.denx.de> <20110124230314.GA11040@dastard> Organization: Intellique X-Mailer: Claws Mail 3.7.8 (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: 1295941178 X-Barracuda-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.53376 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, 25 Jan 2011 10:03:14 +1100 vous =C3=A9criviez: > Only 16 files? IIRC this is 16 thousands of files. Though this is not enough, I generally use 80 to 160 for tests. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From david@fromorbit.com Tue Jan 25 02:34:25 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P8YOSr221541 for ; Tue, 25 Jan 2011 02:34:25 -0600 X-ASG-Debug-ID: 1295944605-021d01f20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7F5188AA020 for ; Tue, 25 Jan 2011 00:36:46 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 9QHD63HP1CiejvB1 for ; Tue, 25 Jan 2011 00:36:46 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEAHsaPk15LN5mgWdsb2JhbACkchcBFiIkvFwNhUIE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 19:06:44 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PheOJ-0003vR-5E; Tue, 25 Jan 2011 19:36:43 +1100 Date: Tue, 25 Jan 2011 19:36:43 +1100 From: Dave Chinner To: Emmanuel Florac Cc: Wolfgang Denk , linux-raid@vger.kernel.org, Justin Piszcz , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Optimize RAID0 for max IOPS? Subject: Re: Optimize RAID0 for max IOPS? Message-ID: <20110125083643.GE28803@dastard> References: <20110118210112.D13A236C@gemini.denx.de> <4D361F26.3060507@stud.tu-ilmenau.de> <20110119192104.1FA92D30267@gemini.denx.de> <20110124215713.82D75B187@gemini.denx.de> <20110124230314.GA11040@dastard> <20110125083900.4dd65bf2@galadriel2.home> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20110125083900.4dd65bf2@galadriel2.home> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295944607 X-Barracuda-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.53381 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 [ As a small note - if you are going to comment on the results table from a previous message, please don't cut it from your response. Context is important. I pasted the relevant part back in so i can refer back to it in my response. ] On Tue, Jan 25, 2011 at 08:39:00AM +0100, Emmanuel Florac wrote: > Le Tue, 25 Jan 2011 10:03:14 +1100 vous écriviez: > > > Version 1.96 ------Sequential Create------ --------Random Create-------- > > > A1 -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- > > > files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP > > > 16 104 0 +++++ +++ 115 0 89 0 +++++ +++ 111 0 > > > > Only 16 files? > > IIRC this is 16 thousands of files. Though this is not enough, I > generally use 80 to 160 for tests. Yes, you're right, the bonnie++ man page states that it is in units of 1024 files. Be nice if there was a "k" to signify that so people who aren't intimately familiar with it's output format can see exactly what was tested.... As it is, a create rate of 104 files/s (note the consistency of units between 2 adjacent numbers!) indicates something else is screwed, because my local test VM on RAID0 gets numbers like this: Version 1.96 ------Sequential Create------ --------Random Create-------- test-4 -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 16 25507 90 +++++ +++ 30472 97 25281 93 +++++ +++ 29077 97 Latency 23864us 204us 21092us 18855us 82us 121us IOWs, create rates of 25k/s and unlink of 30k/s and it is clearly CPU bound. Therein lies the difference: the original numbers have 0% CPU usage, which indicates that the test is blocking. Something is causing the reported test system to be blocked almost all the time. /me looks closer. Oh, despite $subject being "RAID0" the filesystems being tested are on RAID5 and RAID6 with very small chunk sizes on slow SATA drives. This is smelling like a case of barrier IOs on software raid on cheap storage.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Tue Jan 25 02:50:45 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P8ojXE224416 for ; Tue, 25 Jan 2011 02:50:45 -0600 X-ASG-Debug-ID: 1295945586-72ab02b80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4534D28DDA6 for ; Tue, 25 Jan 2011 00:53:07 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id A7n64nVUjRBSOam6 for ; Tue, 25 Jan 2011 00:53:07 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhkFAP4dPk15LN5mgWdsb2JhbACWVY4dFwEWIiS8Z4J7glQE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 19:23:06 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1Phee9-0003xW-4N for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:53:05 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Phebw-0007gb-Ss for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:50:48 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 8/8] xfs: fix dquot shaker deadlock Subject: [PATCH 8/8] xfs: fix dquot shaker deadlock Date: Tue, 25 Jan 2011 19:50:44 +1100 Message-Id: <1295945444-29488-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295945444-29488-1-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295945588 X-Barracuda-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.53382 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 Commit 368e136 ("xfs: remove duplicate code from dquot reclaim") fails to unlock the dquot freelist when the number of loop restarts is exceeded in xfs_qm_dqreclaim_one(). This causes hangs in memory reclaim. Remove the bogus loop exit check that causes the problem. Reported-by: Malcolm Scott Signed-off-by: Dave Chinner --- fs/xfs/quota/xfs_qm.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index f8e854b..9431c56 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -1992,8 +1992,6 @@ dqfunlock: xfs_dqunlock(dqp); if (dqpout) break; - if (restarts >= XFS_QM_RECLAIM_MAX_RESTARTS) - return NULL; } mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); return dqpout; -- 1.7.2.3 From dave@fromorbit.com Tue Jan 25 02:50:55 2011 X-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 p0P8osJl224455 for ; Tue, 25 Jan 2011 02:50:55 -0600 X-ASG-Debug-ID: 1295945596-50b9020f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A750F1DC15C0 for ; Tue, 25 Jan 2011 00:53:16 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id YfQzB466hetJ5irj for ; Tue, 25 Jan 2011 00:53:16 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhkFAP4dPk15LN5mgWdsb2JhbACWVY4dFwEWIiS8Z4VPBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 19:23:15 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PheeI-0003xc-Oe for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:53:14 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Phebw-0007gI-GE for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:50:48 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/8] xfs: fix log ticket leak on forced shutdown. Subject: [PATCH 1/8] xfs: fix log ticket leak on forced shutdown. Date: Tue, 25 Jan 2011 19:50:37 +1100 Message-Id: <1295945444-29488-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295945444-29488-1-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295945597 X-Barracuda-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.53382 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 kmemleak detector shows this after test 139: unreferenced object 0xffff880079b88bb0 (size 264): comm "xfs_io", pid 4904, jiffies 4294909382 (age 276.824s) hex dump (first 32 bytes): 00 00 00 00 ad 4e ad de ff ff ff ff 00 00 00 00 .....N.......... ff ff ff ff ff ff ff ff 48 7b c9 82 ff ff ff ff ........H{...... backtrace: [] kmemleak_alloc+0x2d/0x60 [] kmem_cache_alloc+0x13f/0x2b0 [] kmem_zone_alloc+0x77/0xf0 [] kmem_zone_zalloc+0x1e/0x50 [] xlog_ticket_alloc+0x34/0x170 [] xlog_cil_push+0xa4/0x3f0 [] xlog_cil_force_lsn+0x15a/0x160 [] _xfs_log_force_lsn+0x75/0x2d0 [] _xfs_trans_commit+0x2bd/0x2f0 [] xfs_iomap_write_allocate+0x1ad/0x350 [] xfs_map_blocks+0x21f/0x370 [] xfs_vm_writepage+0x1c7/0x550 [] __writepage+0x1a/0x50 [] write_cache_pages+0x1c2/0x4c0 [] generic_writepages+0x27/0x30 [] xfs_vm_writepages+0x5d/0x80 By inspection, the leak occurs when xlog_write() returns and error and we jump to the abort path without dropping the reference on the active ticket. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log_cil.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 9dc8125..c7eac5a 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -543,7 +543,7 @@ xlog_cil_push( error = xlog_write(log, &lvhdr, tic, &ctx->start_lsn, NULL, 0); if (error) - goto out_abort; + goto out_abort_free_ticket; /* * now that we've written the checkpoint into the log, strictly @@ -569,8 +569,9 @@ restart: } spin_unlock(&cil->xc_cil_lock); + /* xfs_log_done always frees the ticket on error. */ commit_lsn = xfs_log_done(log->l_mp, tic, &commit_iclog, 0); - if (error || commit_lsn == -1) + if (commit_lsn == -1) goto out_abort; /* attach all the transactions w/ busy extents to iclog */ @@ -600,6 +601,8 @@ out_free_ticket: kmem_free(new_ctx); return 0; +out_abort_free_ticket: + xfs_log_ticket_put(tic); out_abort: xlog_cil_committed(ctx, XFS_LI_ABORTED); return XFS_ERROR(EIO); -- 1.7.2.3 From dave@fromorbit.com Tue Jan 25 02:50:56 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P8otDp224468 for ; Tue, 25 Jan 2011 02:50:56 -0600 X-ASG-Debug-ID: 1295945596-50b9020f0001-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BC5C41DC15C2 for ; Tue, 25 Jan 2011 00:53:17 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id YDnORpJ5CjFJAfHi for ; Tue, 25 Jan 2011 00:53:17 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhoFAP4dPk15LN5mgWdsb2JhbACEE5JCjh0XARYiJKwGkGGBI4M4dAQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 19:23:16 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1Phee9-0003xU-18 for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:53:05 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Phebw-0007gW-PW for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:50:48 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 6/8] xfs: limit extsize to size of AGs and/or MAXEXTLEN Subject: [PATCH 6/8] xfs: limit extsize to size of AGs and/or MAXEXTLEN Date: Tue, 25 Jan 2011 19:50:42 +1100 Message-Id: <1295945444-29488-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295945444-29488-1-git-send-email-david@fromorbit.com> References: <1295945444-29488-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: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295945598 X-Barracuda-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.53382 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 extent size hint can be set to larger than an AG. This means that the alignment process can push the range to be allocated outside the bounds of the AG, resulting in assert failures or corrupted bmbt records. Similarly, if the extsize is larger than the maximum extent size supported, the alignment process will produce extents that are too large to fit into the bmbt records, resulting in a different type of assert/corruption failure. Fix this by limiting extsize at the time Ñ–t is set firstly to be less than MAXEXTLEN, then to be a maximum of half the size of the AGs in the filesystem for non-realtime inodes. Realtime inodes do not allocate out of AGs, so don't have to be restricted by the size of AGs. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_ioctl.c | 20 ++++++++++++++++++-- 1 files changed, 18 insertions(+), 2 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index b06ede1..f5e2a19 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -985,10 +985,22 @@ xfs_ioctl_setattr( /* * Extent size must be a multiple of the appropriate block - * size, if set at all. + * size, if set at all. It must also be smaller than the + * maximum extent size supported by the filesystem. + * + * Also, for non-realtime files, limit the extent size hint to + * half the size of the AGs in the filesystem so alignment + * doesn't result in extents larger than an AG. */ if (fa->fsx_extsize != 0) { - xfs_extlen_t size; + xfs_extlen_t size; + xfs_fsblock_t extsize_fsb; + + extsize_fsb = XFS_B_TO_FSB(mp, fa->fsx_extsize); + if (extsize_fsb > MAXEXTLEN) { + code = XFS_ERROR(EINVAL); + goto error_return; + } if (XFS_IS_REALTIME_INODE(ip) || ((mask & FSX_XFLAGS) && @@ -997,6 +1009,10 @@ xfs_ioctl_setattr( mp->m_sb.sb_blocklog; } else { size = mp->m_sb.sb_blocksize; + if (extsize_fsb > mp->m_sb.sb_agblocks / 2) { + code = XFS_ERROR(EINVAL); + goto error_return; + } } if (fa->fsx_extsize % size) { -- 1.7.2.3 From dave@fromorbit.com Tue Jan 25 02:50:57 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P8ouwo224481 for ; Tue, 25 Jan 2011 02:50:56 -0600 X-ASG-Debug-ID: 1295945598-019302f00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 470211056557 for ; Tue, 25 Jan 2011 00:53:18 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id FN6Et64gaA6NvISn for ; Tue, 25 Jan 2011 00:53:18 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhkFAP4dPk15LN5mgWdsb2JhbACWVY4dFwEWIiSvBI1jhU8E Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 19:23:16 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PheeJ-0003xl-1v for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:53:15 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Phebw-0007gZ-RC for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:50:48 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 7/8] xfs: handle CIl transaction commit failures correctly Subject: [PATCH 7/8] xfs: handle CIl transaction commit failures correctly Date: Tue, 25 Jan 2011 19:50:43 +1100 Message-Id: <1295945444-29488-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295945444-29488-1-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295945599 X-Barracuda-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.53381 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 Failure to commit a transaction into the CIL is not handled correctly. This currently can only happen when racing with a shutdown and requires an explicit shutdown check, so it rare and can be avoided. Remove the shutdown check and make the CIL commit a void function to indicate it will always succeed, thereby removing the incorrectly handled failure case. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.h | 2 +- fs/xfs/xfs_log_cil.c | 7 +------ fs/xfs/xfs_trans.c | 4 +--- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 916eb7d..3bd3291 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -191,7 +191,7 @@ void xfs_log_ticket_put(struct xlog_ticket *ticket); xlog_tid_t xfs_log_get_trans_ident(struct xfs_trans *tp); -int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, +void xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, struct xfs_log_vec *log_vector, xfs_lsn_t *commit_lsn, int flags); bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip); diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index c7eac5a..4f9ba86 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -625,7 +625,7 @@ out_abort: * background commit, returns without it held once background commits are * allowed again. */ -int +void xfs_log_commit_cil( struct xfs_mount *mp, struct xfs_trans *tp, @@ -640,11 +640,6 @@ xfs_log_commit_cil( if (flags & XFS_TRANS_RELEASE_LOG_RES) log_flags = XFS_LOG_REL_PERM_RESERV; - if (XLOG_FORCED_SHUTDOWN(log)) { - xlog_cil_free_logvec(log_vector); - return XFS_ERROR(EIO); - } - /* * do all the hard work of formatting items (including memory * allocation) outside the CIL context lock. This prevents stalling CIL diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 27ecb74..f1ce10f 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1769,9 +1769,7 @@ xfs_trans_commit_cil( if (!log_vector) return ENOMEM; - error = xfs_log_commit_cil(mp, tp, log_vector, commit_lsn, flags); - if (error) - return error; + xfs_log_commit_cil(mp, tp, log_vector, commit_lsn, flags); current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); xfs_trans_free(tp); -- 1.7.2.3 From dave@fromorbit.com Tue Jan 25 02:50:57 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P8ovDL224491 for ; Tue, 25 Jan 2011 02:50:57 -0600 X-ASG-Debug-ID: 1295945596-50b9020f0002-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CFC321DC15C4 for ; Tue, 25 Jan 2011 00:53:19 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id CYbvv6lE5km5lPrG for ; Tue, 25 Jan 2011 00:53:19 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEAP4dPk15LN5mgWdsb2JhbACkchcBFiIkvGeFTwQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 19:23:16 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PheeI-0003xd-Q4 for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:53:14 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Phebw-0007gK-IY for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:50:48 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/8] xfs: fix efi item leak on forced shutdown Subject: [PATCH 2/8] xfs: fix efi item leak on forced shutdown Date: Tue, 25 Jan 2011 19:50:38 +1100 Message-Id: <1295945444-29488-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295945444-29488-1-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295945599 X-Barracuda-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.53382 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 After test 139, kmemleak shows: unreferenced object 0xffff880078b405d8 (size 400): comm "xfs_io", pid 4904, jiffies 4294909383 (age 1186.728s) hex dump (first 32 bytes): 60 c1 17 79 00 88 ff ff 60 c1 17 79 00 88 ff ff `..y....`..y.... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ backtrace: [] kmemleak_alloc+0x2d/0x60 [] kmem_cache_alloc+0x13f/0x2b0 [] kmem_zone_alloc+0x77/0xf0 [] kmem_zone_zalloc+0x1e/0x50 [] xfs_efi_init+0x4b/0xb0 [] xfs_trans_get_efi+0x58/0x90 [] xfs_bmap_finish+0x8b/0x1d0 [] xfs_itruncate_finish+0x2c4/0x5d0 [] xfs_setattr+0x8df/0xa70 [] xfs_vn_setattr+0x1b/0x20 [] notify_change+0x170/0x2e0 [] do_truncate+0x66/0xa0 [] sys_ftruncate+0xdb/0xe0 [] system_call_fastpath+0x16/0x1b [] 0xffffffffffffffff The cause of the leak is that the "remove" parameter of IOP_UNPIN() is never set when a CIL push is aborted. This means that the EFI item is never freed if it was in the push being cancelled. The problem is specific to delayed logging. Signed-off-by: Dave Chinner --- fs/xfs/xfs_extfree_item.c | 1 - fs/xfs/xfs_trans.c | 35 ++++++++++++++++++++++++++++++----- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index 75f2ef6..effbb41 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -138,7 +138,6 @@ xfs_efi_item_unpin( if (remove) { ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); - xfs_trans_del_item(lip); xfs_efi_item_free(efip); return; } diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 33dbc4e..27ecb74 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1446,6 +1446,14 @@ xfs_log_item_batch_insert( * 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. + * + * If we are called with the aborted flag set, it is because a log write during + * a CIL checkpoint commit has failed. In this case, all the items in the + * checkpoint have already gone through IOP_COMMITED and IOP_UNLOCK, which + * means that checkpoint commit abort handling is treated exactly the same + * as an iclog write error even though we haven't started any IO yet. Hence in + * this case all we need to do is IOP_COMMITTED processing, followed by an + * IOP_UNPIN(aborted) call. */ void xfs_trans_committed_bulk( @@ -1472,6 +1480,16 @@ xfs_trans_committed_bulk( if (XFS_LSN_CMP(item_lsn, (xfs_lsn_t)-1) == 0) continue; + /* + * if we are aborting the operation, no point in inserting the + * object into the AIL as we are in a shutdown situation. + */ + if (aborted) { + ASSERT(XFS_FORCED_SHUTDOWN(ailp->xa_mount)); + IOP_UNPIN(lip, aborted); + continue; + } + if (item_lsn != commit_lsn) { /* @@ -1503,22 +1521,29 @@ xfs_trans_committed_bulk( } /* - * Called from the trans_commit code when we notice that - * the filesystem is in the middle of a forced shutdown. + * Called from the trans_commit code when we notice that the filesystem is in + * the middle of a forced shutdown. + * + * When we are called here, we have already pinned all the items in the + * transaction. However, neither IOP_COMMITTING or IOP_UNLOCK has been called + * so we can simply walk the items in the transaction, unlink them from the + * transaction, unpin them with an abort flag and then free the items. */ STATIC void xfs_trans_uncommit( struct xfs_trans *tp, uint flags) { - struct xfs_log_item_desc *lidp; + struct xfs_log_item_desc *lidp, *n; - list_for_each_entry(lidp, &tp->t_items, lid_trans) { + list_for_each_entry_safe(lidp, n, &tp->t_items, lid_trans) { /* * Unpin all but those that aren't dirty. */ - if (lidp->lid_flags & XFS_LID_DIRTY) + if (lidp->lid_flags & XFS_LID_DIRTY) { + xfs_trans_del_item(lidp->lid_item); IOP_UNPIN(lidp->lid_item, 1); + } } xfs_trans_unreserve_and_mod_sb(tp); -- 1.7.2.3 From dave@fromorbit.com Tue Jan 25 02:51:05 2011 X-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_46 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 p0P8p5JT224567 for ; Tue, 25 Jan 2011 02:51:05 -0600 X-ASG-Debug-ID: 1295945606-4aa202b10001-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8C5771DC15C8 for ; Tue, 25 Jan 2011 00:53:27 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id DHpcILpViGr2eLeO for ; Tue, 25 Jan 2011 00:53:27 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEAP4dPk15LN5mgWdsb2JhbACkchcBFiIkvGeFTwSPbg Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 19:23:25 +1030 Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PheeI-0003xT-Rt for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:53:14 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Phebw-0007gQ-M9 for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:50:48 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/8] xfs: limit extent length for allocation to AG size Subject: [PATCH 4/8] xfs: limit extent length for allocation to AG size Date: Tue, 25 Jan 2011 19:50:40 +1100 Message-Id: <1295945444-29488-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295945444-29488-1-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295945608 X-Barracuda-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.53382 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 Delayed allocation extents can be larger than AGs, so when trying to convert a large range we may scan every AG inside xfs_bmap_alloc_nullfb() trying to find an AG with a size larger than an AG. We should stop when we find the first AG with a maximum possible allocation size. This causes excessive CPU usage when there are lots of AGs. The same problem occurs when doing preallocation of a range larger than an AG. Fix the problem by limiting real allocation lengths to the maximum that an AG can support. This means if we have empty AGs, we'll stop the search at the first of them. If there are no empty AGs, we'll still scan them all, but that is a different problem.... Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_alloc.h | 16 ++++++++++++++++ fs/xfs/xfs_bmap.c | 16 +++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_alloc.h b/fs/xfs/xfs_alloc.h index 0ab56b3..6ad45b9 100644 --- a/fs/xfs/xfs_alloc.h +++ b/fs/xfs/xfs_alloc.h @@ -75,6 +75,22 @@ typedef unsigned int xfs_alloctype_t; #define XFS_ALLOC_SET_ASIDE(mp) (4 + ((mp)->m_sb.sb_agcount * 4)) /* + * When deciding how much space to allocate out of an AG, we limit the + * allocation maximum size to the size the AG. However, we cannot use all the + * blocks in the AG - some are permanently used by metadata. These + * blocks are generally: + * - the AG superblock, AGF, AGI and AGFL + * - the AGF (bno and cnt) and AGI btree root blocks + * - 4 blocks on the AGFL according to XFS_ALLOC_SET_ASIDE() limits + * + * The AG headers are sector sized, so the amount of space they take up is + * dependent on filesystem geometry. The others are all single blocks. + */ +#define XFS_ALLOC_AG_MAX_USABLE(mp) \ + ((mp)->m_sb.sb_agblocks - XFS_BB_TO_FSB(mp, XFS_FSS_TO_BB(mp, 4)) + 7) + + +/* * Argument structure for xfs_alloc routines. * This is turned into a structure to avoid having 20 arguments passed * down several levels of the stack. diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 4111cd3..74861c6 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -2430,7 +2430,7 @@ xfs_bmap_btalloc_nullfb( startag = ag = 0; pag = xfs_perag_get(mp, ag); - while (*blen < ap->alen) { + while (*blen < args->maxlen) { if (!pag->pagf_init) { error = xfs_alloc_pagf_init(mp, args->tp, ag, XFS_ALLOC_FLAG_TRYLOCK); @@ -2452,7 +2452,7 @@ xfs_bmap_btalloc_nullfb( notinit = 1; if (xfs_inode_is_filestream(ap->ip)) { - if (*blen >= ap->alen) + if (*blen >= args->maxlen) break; if (ap->userdata) { @@ -2498,14 +2498,14 @@ xfs_bmap_btalloc_nullfb( * If the best seen length is less than the request * length, use the best as the minimum. */ - else if (*blen < ap->alen) + else if (*blen < args->maxlen) args->minlen = *blen; /* * Otherwise we've seen an extent as big as alen, * use that as the minimum. */ else - args->minlen = ap->alen; + args->minlen = args->maxlen; /* * set the failure fallback case to look in the selected @@ -2573,7 +2573,9 @@ xfs_bmap_btalloc( args.tp = ap->tp; args.mp = mp; args.fsbno = ap->rval; - args.maxlen = MIN(ap->alen, mp->m_sb.sb_agblocks); + + /* Trim the allocation back to the maximum an AG can fit. */ + args.maxlen = MIN(ap->alen, XFS_ALLOC_AG_MAX_USABLE(mp)); args.firstblock = ap->firstblock; blen = 0; if (nullfb) { @@ -2621,7 +2623,7 @@ xfs_bmap_btalloc( /* * Adjust for alignment */ - if (blen > args.alignment && blen <= ap->alen) + if (blen > args.alignment && blen <= args.maxlen) args.minlen = blen - args.alignment; args.minalignslop = 0; } else { @@ -2640,7 +2642,7 @@ xfs_bmap_btalloc( * of minlen+alignment+slop doesn't go up * between the calls. */ - if (blen > mp->m_dalign && blen <= ap->alen) + if (blen > mp->m_dalign && blen <= args.maxlen) nextminlen = blen - mp->m_dalign; else nextminlen = args.minlen; -- 1.7.2.3 From dave@fromorbit.com Tue Jan 25 02:51:04 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P8p4mY224552 for ; Tue, 25 Jan 2011 02:51:04 -0600 X-ASG-Debug-ID: 1295945606-4aa202b10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 76BE41DC15C6 for ; Tue, 25 Jan 2011 00:53:26 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 5HF2kwOXfEyaOlIY for ; Tue, 25 Jan 2011 00:53:26 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhkFAP4dPk15LN5mgWdsb2JhbACWVY4dFwEWIiS8Z4VPBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 19:23:25 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1Phee8-0003xR-Tb for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:53:04 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Phebw-0007gG-EJ for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:50:48 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/8] xfs: 2.6.38-rc candidate fixes V2 Subject: [PATCH 0/8] xfs: 2.6.38-rc candidate fixes V2 Date: Tue, 25 Jan 2011 19:50:36 +1100 Message-Id: <1295945444-29488-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295945607 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0206 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.53382 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 These are all the pending 2.6.38-rc candidate fixes I have in my queue. From dave@fromorbit.com Tue Jan 25 02:51:07 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P8p6I2224579 for ; Tue, 25 Jan 2011 02:51:06 -0600 X-ASG-Debug-ID: 1295945606-4aa202b10002-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9D0351DC15CC for ; Tue, 25 Jan 2011 00:53:28 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Jao6MOchK9ae1bfi for ; Tue, 25 Jan 2011 00:53:28 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhkFAP4dPk15LN5mgWdsb2JhbACWVY4dFwEWIiS8Z4VPBJIL Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 19:23:26 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PheeI-0003xS-RN for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:53:14 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Phebw-0007gO-KE for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:50:48 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/8] xfs: speculative delayed allocation uses rounddown_power_of_2 badly Subject: [PATCH 3/8] xfs: speculative delayed allocation uses rounddown_power_of_2 badly Date: Tue, 25 Jan 2011 19:50:39 +1100 Message-Id: <1295945444-29488-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295945444-29488-1-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295945609 X-Barracuda-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.53382 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 rounddown_power_of_2() returns an undefined result when passed a value of zero. The specualtive delayed allocation code is doing this when the inode is zero length. Hence occasionally the preallocation is much, much larger than is necessary (e.g. 8GB for a 270 _byte_ file). Ensure we don't even pass a zero value to this function so the result of preallocation is always the desired size. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_iomap.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 55582bd..8a0f044 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -337,7 +337,12 @@ xfs_iomap_prealloc_size( int shift = 0; int64_t freesp; - alloc_blocks = XFS_B_TO_FSB(mp, ip->i_size); + /* + * rounddown_pow_of_two() returns an undefined result + * if we pass in alloc_blocks = 0. Hence the "+ 1" to + * ensure we always pass in a non-zero value. + */ + alloc_blocks = XFS_B_TO_FSB(mp, ip->i_size) + 1; alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, rounddown_pow_of_two(alloc_blocks)); -- 1.7.2.3 From dave@fromorbit.com Tue Jan 25 02:51:06 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P8p62q224577 for ; Tue, 25 Jan 2011 02:51:06 -0600 X-ASG-Debug-ID: 1295945608-4be102480000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 590EE1DC15C8 for ; Tue, 25 Jan 2011 00:53:28 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id jlgjMB7Lr3Pp07FS for ; Tue, 25 Jan 2011 00:53:28 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhkFAP4dPk15LN5mgWdsb2JhbACWVY4dFwEWIiS8Z4VPBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Jan 2011 19:23:26 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PheeI-0003xf-Uw for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:53:14 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1Phebw-0007gS-No for xfs@oss.sgi.com; Tue, 25 Jan 2011 19:50:48 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 5/8] xfs: prevent extsize alignment from exceeding maximum extent size Subject: [PATCH 5/8] xfs: prevent extsize alignment from exceeding maximum extent size Date: Tue, 25 Jan 2011 19:50:41 +1100 Message-Id: <1295945444-29488-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295945444-29488-1-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1295945609 X-Barracuda-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.53382 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 doing delayed allocation, if the allocation size is for a maximally sized extent, extent size alignment can push it over this limit. This results in an assert failure in xfs_bmbt_set_allf() as the extent length is too large to find in the extent record. Fix this by ensuring that we allow for space that extent size alignment requires (up to 2 * (extsize -1) blocks as we have to handle both head and tail alignment) when limiting the maximum size of the extent. Signed-off-by: Dave Chinner --- fs/xfs/xfs_bmap.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 74861c6..3e5a91a 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -4487,6 +4487,16 @@ xfs_bmapi( /* Figure out the extent size, adjust alen */ extsz = xfs_get_extsz_hint(ip); if (extsz) { + /* + * make sure we don't exceed a single + * extent length when we align the + * extent by reducing length we are + * going to allocate by the maximum + * amount extent size aligment may + * require. + */ + alen = XFS_FILBLKS_MIN( len, + MAXEXTLEN - (2 * extsz - 1)); error = xfs_bmap_extsize_align(mp, &got, &prev, extsz, rt, eof, -- 1.7.2.3 From BATV+f33d1ee6a04bb260fa6f+2711+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 25 03:04:53 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P94qVW226559 for ; Tue, 25 Jan 2011 03:04:53 -0600 X-ASG-Debug-ID: 1295946435-71a703d60000-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 26DD4105609F for ; Tue, 25 Jan 2011 01:07:15 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id STlICs4YB8rDQCGc for ; Tue, 25 Jan 2011 01:07:15 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pherp-00069n-Q8 for xfs@oss.sgi.com; Tue, 25 Jan 2011 09:07:13 +0000 Message-Id: <20110125090618.432370964@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Tue, 25 Jan 2011 04:06:18 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/3] resurrect realtime subvolume support Subject: [PATCH 0/3] resurrect realtime subvolume support 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: 1295946436 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 Fix two regressions that broke using the realtime subvolume, and add lockdep annotations for the ilocks of the two rt metadata inodes. From BATV+f33d1ee6a04bb260fa6f+2711+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 25 03:04:53 2011 X-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_62, 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 p0P94qVN226558 for ; Tue, 25 Jan 2011 03:04:53 -0600 X-ASG-Debug-ID: 1295946435-019503330000-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 09640105607B for ; Tue, 25 Jan 2011 01:07:15 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 1qAhHCrleSwoSsLb for ; Tue, 25 Jan 2011 01:07:15 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pherp-0006AM-Vo for xfs@oss.sgi.com; Tue, 25 Jan 2011 09:07:14 +0000 Message-Id: <20110125090713.945708741@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Tue, 25 Jan 2011 04:06:19 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/3] xfs: only lock the rt bitmap inode once per allocation Subject: [PATCH 1/3] xfs: only lock the rt bitmap inode once per allocation References: <20110125090618.432370964@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-fix-rt-inode-locking 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: 1295946436 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 both xfs_rtpick_extent and xfs_rtallocate_extent call xfs_trans_iget to grab and lock the rt bitmap inode, which results in a deadlock since the removal of the lock recursion counters in commit "xfs: simplify inode to transaction joining" Fix this by acquiring and locking the inode in xfs_bmap_rtalloc before calling into xfs_rtpick_extent and xfs_rtallocate_extent. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2011-01-24 11:36:00.541016631 +0100 +++ xfs/fs/xfs/xfs_bmap.c 2011-01-24 16:02:40.581003990 +0100 @@ -2316,6 +2316,7 @@ xfs_bmap_rtalloc( xfs_extlen_t prod = 0; /* product factor for allocators */ xfs_extlen_t ralen = 0; /* realtime allocation length */ xfs_extlen_t align; /* minimum allocation alignment */ + xfs_inode_t *ip; /* bitmap incore inode */ xfs_rtblock_t rtb; mp = ap->ip->i_mount; @@ -2348,6 +2349,16 @@ xfs_bmap_rtalloc( */ if (ralen * mp->m_sb.sb_rextsize >= MAXEXTLEN) ralen = MAXEXTLEN / mp->m_sb.sb_rextsize; + + /* + * Lock out other modifications to the RT bitmap inode. + */ + error = xfs_trans_iget(mp, ap->tp, mp->m_sb.sb_rbmino, 0, + XFS_ILOCK_EXCL, &ip); + if (error) + return error; + ASSERT(ip == mp->m_rbmip); + /* * If it's an allocation to an empty file at offset 0, * pick an extent that will space things out in the rt area. Index: xfs/fs/xfs/xfs_rtalloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_rtalloc.c 2011-01-24 11:36:00.519026479 +0100 +++ xfs/fs/xfs/xfs_rtalloc.c 2011-01-24 16:02:30.086004688 +0100 @@ -2075,15 +2075,15 @@ xfs_rtallocate_extent( xfs_extlen_t prod, /* extent product factor */ xfs_rtblock_t *rtblock) /* out: start block allocated */ { + xfs_mount_t *mp = tp->t_mountp; int error; /* error value */ - xfs_inode_t *ip; /* inode for bitmap file */ - xfs_mount_t *mp; /* file system mount structure */ xfs_rtblock_t r; /* result allocated block */ xfs_fsblock_t sb; /* summary file block number */ xfs_buf_t *sumbp; /* summary file block buffer */ + ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); ASSERT(minlen > 0 && minlen <= maxlen); - mp = tp->t_mountp; + /* * If prod is set then figure out what to do to minlen and maxlen. */ @@ -2099,12 +2099,7 @@ xfs_rtallocate_extent( return 0; } } - /* - * Lock out other callers by grabbing the bitmap inode lock. - */ - if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, - XFS_ILOCK_EXCL, &ip))) - return error; + sumbp = NULL; /* * Allocate by size, or near another block, or exactly at some block. @@ -2123,11 +2118,12 @@ xfs_rtallocate_extent( len, &sumbp, &sb, prod, &r); break; default: + error = EIO; ASSERT(0); } - if (error) { + if (error) return error; - } + /* * If it worked, update the superblock. */ @@ -2306,20 +2302,16 @@ xfs_rtpick_extent( xfs_rtblock_t *pick) /* result rt extent */ { xfs_rtblock_t b; /* result block */ - int error; /* error return value */ - xfs_inode_t *ip; /* bitmap incore inode */ int log2; /* log of sequence number */ __uint64_t resid; /* residual after log removed */ __uint64_t seq; /* sequence number of file creation */ __uint64_t *seqp; /* pointer to seqno in inode */ - if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, - XFS_ILOCK_EXCL, &ip))) - return error; - ASSERT(ip == mp->m_rbmip); - seqp = (__uint64_t *)&ip->i_d.di_atime; - if (!(ip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) { - ip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; + ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); + + seqp = (__uint64_t *)&mp->m_rbmip->i_d.di_atime; + if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) { + mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; *seqp = 0; } seq = *seqp; @@ -2335,7 +2327,7 @@ xfs_rtpick_extent( b = mp->m_sb.sb_rextents - len; } *seqp = seq + 1; - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); *pick = b; return 0; } From BATV+f33d1ee6a04bb260fa6f+2711+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 25 03:04:53 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P94pH1226549 for ; Tue, 25 Jan 2011 03:04:53 -0600 X-ASG-Debug-ID: 1295946434-5a1d01c60000-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 CC74B1DC1648 for ; Tue, 25 Jan 2011 01:07:14 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 57qW9866RZnwwD0a for ; Tue, 25 Jan 2011 01:07:14 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pherq-0006Av-6N for xfs@oss.sgi.com; Tue, 25 Jan 2011 09:07:14 +0000 Message-Id: <20110125090714.153042343@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Tue, 25 Jan 2011 04:06:20 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/3] xfs: fix xfs_get_extsz_hint for a zero extent size hint Subject: [PATCH 2/3] xfs: fix xfs_get_extsz_hint for a zero extent size hint References: <20110125090618.432370964@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-fix-zero-extent-size-hint 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: 1295946434 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 can easily set the extsize flag without setting an extent size hint, or one that evaluates to zero. Historically the di_extsize field was only used when it was non-zero, but the commit "Cleanup inode extent size hint extraction" broke this. Restore the old behaviour, thus fixing xfsqa 090 with a debug kernel. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_rw.c =================================================================== --- xfs.orig/fs/xfs/xfs_rw.c 2011-01-24 14:42:50.432004339 +0100 +++ xfs/fs/xfs/xfs_rw.c 2011-01-24 15:03:17.211016282 +0100 @@ -173,17 +173,9 @@ xfs_extlen_t xfs_get_extsz_hint( struct xfs_inode *ip) { - xfs_extlen_t extsz; - - if (unlikely(XFS_IS_REALTIME_INODE(ip))) { - extsz = (ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE) - ? ip->i_d.di_extsize - : ip->i_mount->m_sb.sb_rextsize; - ASSERT(extsz); - } else { - extsz = (ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE) - ? ip->i_d.di_extsize : 0; - } - - return extsz; + if ((ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE) && ip->i_d.di_extsize) + return ip->i_d.di_extsize; + if (XFS_IS_REALTIME_INODE(ip)) + return ip->i_mount->m_sb.sb_rextsize; + return 0; } From BATV+f33d1ee6a04bb260fa6f+2711+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 25 03:04:53 2011 X-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 (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p0P94pGd226550 for ; Tue, 25 Jan 2011 03:04:53 -0600 X-ASG-Debug-ID: 1295946434-019e03470000-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 1DA27105607B for ; Tue, 25 Jan 2011 01:07:14 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id qB6JhcmxdazEhV0S for ; Tue, 25 Jan 2011 01:07:14 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pherq-0006BR-Cl for xfs@oss.sgi.com; Tue, 25 Jan 2011 09:07:14 +0000 Message-Id: <20110125090714.355476519@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Tue, 25 Jan 2011 04:06:21 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/3] xfs: add lockdep annotations for the rt inodes Subject: [PATCH 3/3] xfs: add lockdep annotations for the rt inodes References: <20110125090618.432370964@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-fix-rtinode-lockdep 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: 1295946435 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 rt bitmap and summary inodes do not participate in the normal inode locking protocol. Instead the rt bitmap inode can be locked in any transaction involving rt allocations, and the both of the rt inodes can be locked at the same time. Add specific lockdep subclasses for the rt inodes to prevent lockdep from blowing up. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c 2011-01-24 16:02:40.000000000 +0100 +++ xfs/fs/xfs/xfs_bmap.c 2011-01-24 16:03:03.416004409 +0100 @@ -2354,7 +2354,7 @@ xfs_bmap_rtalloc( * Lock out other modifications to the RT bitmap inode. */ error = xfs_trans_iget(mp, ap->tp, mp->m_sb.sb_rbmino, 0, - XFS_ILOCK_EXCL, &ip); + XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP, &ip); if (error) return error; ASSERT(ip == mp->m_rbmip); Index: xfs/fs/xfs/xfs_inode.h =================================================================== --- xfs.orig/fs/xfs/xfs_inode.h 2011-01-24 16:02:30.000000000 +0100 +++ xfs/fs/xfs/xfs_inode.h 2011-01-24 16:02:46.885004130 +0100 @@ -409,28 +409,35 @@ static inline void xfs_ifunlock(xfs_inod /* * Flags for lockdep annotations. * - * XFS_I[O]LOCK_PARENT - for operations that require locking two inodes - * (ie directory operations that require locking a directory inode and - * an entry inode). The first inode gets locked with this flag so it - * gets a lockdep subclass of 1 and the second lock will have a lockdep - * subclass of 0. + * XFS_LOCK_PARENT - for directory operations that require locking a + * parent directory inode and a child entry inode. The parent gets locked + * with this flag so it gets a lockdep subclass of 1 and the child entry + * lock will have a lockdep subclass of 0. + * + * XFS_LOCK_RTBITMAP/XFS_LOCK_RTSUM - the realtime device bitmap and summary + * inodes do not participate in the normal lock order, and thus have their + * own subclasses. * * XFS_LOCK_INUMORDER - for locking several inodes at the some time * with xfs_lock_inodes(). This flag is used as the starting subclass * and each subsequent lock acquired will increment the subclass by one. - * So the first lock acquired will have a lockdep subclass of 2, the - * second lock will have a lockdep subclass of 3, and so on. It is + * So the first lock acquired will have a lockdep subclass of 4, the + * second lock will have a lockdep subclass of 5, and so on. It is * the responsibility of the class builder to shift this to the correct * portion of the lock_mode lockdep mask. */ #define XFS_LOCK_PARENT 1 -#define XFS_LOCK_INUMORDER 2 +#define XFS_LOCK_RTBITMAP 2 +#define XFS_LOCK_RTSUM 3 +#define XFS_LOCK_INUMORDER 4 #define XFS_IOLOCK_SHIFT 16 #define XFS_IOLOCK_PARENT (XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT) #define XFS_ILOCK_SHIFT 24 #define XFS_ILOCK_PARENT (XFS_LOCK_PARENT << XFS_ILOCK_SHIFT) +#define XFS_ILOCK_RTBITMAP (XFS_LOCK_RTBITMAP << XFS_ILOCK_SHIFT) +#define XFS_ILOCK_RTSUM (XFS_LOCK_RTSUM << XFS_ILOCK_SHIFT) #define XFS_IOLOCK_DEP_MASK 0x00ff0000 #define XFS_ILOCK_DEP_MASK 0xff000000 Index: xfs/fs/xfs/xfs_rtalloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_rtalloc.c 2011-01-24 16:02:30.000000000 +0100 +++ xfs/fs/xfs/xfs_rtalloc.c 2011-01-24 16:02:46.889004409 +0100 @@ -1972,8 +1972,10 @@ xfs_growfs_rt( /* * Lock out other callers by grabbing the bitmap inode lock. */ - if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, - XFS_ILOCK_EXCL, &ip))) + error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, + XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP, + &ip); + if (error) goto error_cancel; ASSERT(ip == mp->m_rbmip); /* @@ -1986,8 +1988,9 @@ xfs_growfs_rt( /* * Get the summary inode into the transaction. */ - if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rsumino, 0, - XFS_ILOCK_EXCL, &ip))) + error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rsumino, 0, + XFS_ILOCK_EXCL | XFS_ILOCK_RTSUM, &ip); + if (error) goto error_cancel; ASSERT(ip == mp->m_rsumip); /* @@ -2160,8 +2163,9 @@ xfs_rtfree_extent( /* * Synchronize by locking the bitmap inode. */ - if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, - XFS_ILOCK_EXCL, &ip))) + error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, + XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP, &ip); + if (error) return error; #if defined(__KERNEL__) && defined(DEBUG) /* From BATV+f33d1ee6a04bb260fa6f+2711+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 25 03:17:47 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P9Hk0m229924 for ; Tue, 25 Jan 2011 03:17:46 -0600 X-ASG-Debug-ID: 1295947209-2b7100600000-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 033EC28DC85 for ; Tue, 25 Jan 2011 01:20:09 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id V1t4lWRUMw77WUPt for ; Tue, 25 Jan 2011 01:20:09 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Phf4K-0000bw-64; Tue, 25 Jan 2011 09:20:08 +0000 Date: Tue, 25 Jan 2011 04:20:08 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/8] xfs: 2.6.38-rc candidate fixes V2 Subject: Re: [PATCH 0/8] xfs: 2.6.38-rc candidate fixes V2 Message-ID: <20110125092008.GA31405@infradead.org> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295945444-29488-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: 1295947210 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, Jan 25, 2011 at 07:50:36PM +1100, Dave Chinner wrote: > These are all the pending 2.6.38-rc candidate fixes I have in my queue. I'd limit the .38 series to actual regression fixes, which means skipping patches 1, 2 and 7. OTOH we really need to get the roundown fix into Linus' tree ASAP as quite a few people hit it. From mathieu.avila@opencubetech.com Tue Jan 25 03:46:20 2011 X-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 p0P9kJ31235027 for ; Tue, 25 Jan 2011 03:46:20 -0600 X-ASG-Debug-ID: 1295948921-5cba00ab0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from opencube.bzctoons.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6AC9F8AD544 for ; Tue, 25 Jan 2011 01:48:41 -0800 (PST) Received: from opencube.bzctoons.net (opencube-2.bzctoons.net [88.191.104.187]) by cuda.sgi.com with ESMTP id R3A2GZabBvcQvO9h for ; Tue, 25 Jan 2011 01:48:41 -0800 (PST) Received: from localhost (opencube.bzctoons.net.local [127.0.0.1]) by opencube.bzctoons.net (Postfix) with ESMTP id AE83490AD3 for ; Tue, 25 Jan 2011 10:48:40 +0100 (CET) Received: from opencube.bzctoons.net ([127.0.0.1]) by localhost (opencube.bzctoons.net [127.0.0.1]) (amavisd-maia, port 10024) with ESMTP id 08476-08 for ; Tue, 25 Jan 2011 10:48:39 +0100 (CET) Received: from [192.168.16.148] (opencube03.pck.nerim.net [62.212.120.41]) (Authenticated sender: mathieu.avila@opencubetech.com) by opencube.bzctoons.net (Postfix) with ESMTPA id E10B390AC5 for ; Tue, 25 Jan 2011 10:48:37 +0100 (CET) Message-ID: <4D3E9C73.6090508@opencubetech.com> Date: Tue, 25 Jan 2011 10:48:35 +0100 From: Mathieu AVILA User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.2.13) Gecko/20101207 Lightning/1.0b2 Thunderbird/3.1.7 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: extremely slow write performance plaintext Subject: Re: extremely slow write performance plaintext References: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> <4D30C7F3.3040105@hardwarefreak.com> <1779_1295360207_4D35A0CF_1779_747_1_4D35A0CF.9050503@davisvision.com> <201101250721.14716@zmi.at> In-Reply-To: <201101250721.14716@zmi.at> Content-Type: multipart/alternative; boundary="------------040809080702070805000202" X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: Maia Mailguard 1.0.2 X-Barracuda-Connect: opencube-2.bzctoons.net[88.191.104.187] X-Barracuda-Start-Time: 1295948922 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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.53385 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Status: Clean This is a multi-part message in MIME format. --------------040809080702070805000202 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Le 25/01/2011 07:21, Michael Monnerie a écrit : > On Dienstag, 18. Januar 2011 Cory Coager wrote: >> Also, I want to stress that I am only having performance issues with >> one logical volume, the others seem fine. > You're getting 40MB/s write speed and says that's fine? I get more > performance from a single SATA desktop drive. Your setup seems to suck > extremely somewhere. > > It already starts with your dd speed. I started it on a virtualized VM > on an old, overloaded server and get: > > # dd if=/dev/zero of=test.dd bs=1k count=1M > 1048576+0 Datensätze ein > 1048576+0 Datensätze aus > 1073741824 Bytes (1,1 GB) kopiert, 10,9992 s, 97,6 MB/s > I would say this is melted with cache hit, isn't it ? (although I agree it depends on the server's memory dedicated to FS cache) A real cache hit on a real server would give me at least 500 MB/s (actually I get something around 1 GB/s) When it starts to be disk-constrained, on a standard SATA disk, I get from 75 MB/s to 140 MB/s depending on the position of the AG I hit. -- *Mathieu Avila* IT & Integration Engineer mathieu.avila@opencubetech.com OpenCube Technologies http://www.opencubetech.com Parc Technologique du Canal, 9 avenue de l'Europe 31520 Ramonville St Agne - FRANCE Tel. : +33 (0) 561 285 606 - Fax : +33 (0) 561 285 635 --------------040809080702070805000202 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Le 25/01/2011 07:21, Michael Monnerie a écrit :
On Dienstag, 18. Januar 2011 Cory Coager wrote:
Also, I want to stress that I am only having performance issues with
one logical volume, the others seem fine.
You're getting 40MB/s write speed and says that's fine? I get more 
performance from a single SATA desktop drive. Your setup seems to suck 
extremely somewhere.

It already starts with your dd speed. I started it on a virtualized VM 
on an old, overloaded server and get:

# dd if=/dev/zero of=test.dd bs=1k count=1M
1048576+0 Datensätze ein
1048576+0 Datensätze aus
1073741824 Bytes (1,1 GB) kopiert, 10,9992 s, 97,6 MB/s


I would say this is melted with cache hit, isn't it ? (although I agree it depends on the server's memory dedicated to FS cache)

A real cache hit on a real server would give me at least 500 MB/s (actually I get something around 1 GB/s)
When it starts to be disk-constrained, on a standard SATA disk, I get from 75 MB/s to 140 MB/s depending on the position of the AG I hit.


--
Mathieu Avila
IT & Integration Engineer
mathieu.avila@opencubetech.com

OpenCube Technologies http://www.opencubetech.com
Parc Technologique du Canal, 9 avenue de l'Europe
31520 Ramonville St Agne - FRANCE
Tel. : +33 (0) 561 285 606 - Fax : +33 (0) 561 285 635
--------------040809080702070805000202-- From BATV+f33d1ee6a04bb260fa6f+2711+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 25 03:47:31 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P9lU5s235264 for ; Tue, 25 Jan 2011 03:47:31 -0600 X-ASG-Debug-ID: 1295948993-56ac02890000-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 2819F1A1E94D for ; Tue, 25 Jan 2011 01:49:53 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id g3HaZX5rNlSA7jqx for ; Tue, 25 Jan 2011 01:49:53 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PhfX7-0007CB-CZ; Tue, 25 Jan 2011 09:49:53 +0000 Date: Tue, 25 Jan 2011 04:49:53 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/8] xfs: prevent extsize alignment from exceeding maximum extent size Subject: Re: [PATCH 5/8] xfs: prevent extsize alignment from exceeding maximum extent size Message-ID: <20110125094953.GA23990@infradead.org> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295945444-29488-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: 1295948994 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 > + alen = XFS_FILBLKS_MIN( len, just a little whitespace damage here. From BATV+f33d1ee6a04bb260fa6f+2711+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 25 03:50:20 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P9oKX4235817 for ; Tue, 25 Jan 2011 03:50:20 -0600 X-ASG-Debug-ID: 1295949163-0eb200f40000-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 5B8B01A1EA04 for ; Tue, 25 Jan 2011 01:52:43 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 4cFAATTPsIFkI6nZ for ; Tue, 25 Jan 2011 01:52:43 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PhfZq-0007x3-U0; Tue, 25 Jan 2011 09:52:42 +0000 Date: Tue, 25 Jan 2011 04:52:42 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 8/8] xfs: fix dquot shaker deadlock Subject: Re: [PATCH 8/8] xfs: fix dquot shaker deadlock Message-ID: <20110125095242.GB23990@infradead.org> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295945444-29488-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: 1295949163 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, Jan 25, 2011 at 07:50:44PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Commit 368e136 ("xfs: remove duplicate code from dquot reclaim") fails > to unlock the dquot freelist when the number of loop restarts is > exceeded in xfs_qm_dqreclaim_one(). This causes hangs in memory > reclaim. Remove the bogus loop exit check that causes the problem. The fix looks correct, but it's a bit inconsequential about when to adhere the retry limit and when not. Shouldn't we just turn the exit condition into: if (dqout || restarts >= XFS_QM_RECLAIM_MAX_RESTARTS) break; also the failure to acquite qi_dqlist_lock increments the restart count twice, which was also added in the same commit. From BATV+f33d1ee6a04bb260fa6f+2711+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 25 03:50:58 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0P9owX0235919 for ; Tue, 25 Jan 2011 03:50:58 -0600 X-ASG-Debug-ID: 1295949201-4aa003d50000-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 245231A1EA06 for ; Tue, 25 Jan 2011 01:53:22 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 0s1W19AHaKKYzH3e for ; Tue, 25 Jan 2011 01:53:22 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PhfaT-0007yl-LR; Tue, 25 Jan 2011 09:53:21 +0000 Date: Tue, 25 Jan 2011 04:53:21 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 7/8] xfs: handle CIl transaction commit failures correctly Subject: Re: [PATCH 7/8] xfs: handle CIl transaction commit failures correctly Message-ID: <20110125095321.GC23990@infradead.org> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295945444-29488-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: 1295949202 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, Jan 25, 2011 at 07:50:43PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Failure to commit a transaction into the CIL is not handled > correctly. This currently can only happen when racing with a > shutdown and requires an explicit shutdown check, so it rare and can > be avoided. Remove the shutdown check and make the CIL commit a void > function to indicate it will always succeed, thereby removing the > incorrectly handled failure case. Looks good, Reviewed-by: Christoph Hellwig From wd@denx.de Tue Jan 25 06:42:59 2011 X-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_35 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 p0PCgwUR005829 for ; Tue, 25 Jan 2011 06:42:58 -0600 X-ASG-Debug-ID: 1295959513-21e3034c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-out.m-online.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D906428AD70 for ; Tue, 25 Jan 2011 04:45:13 -0800 (PST) Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.9]) by cuda.sgi.com with ESMTP id OLTq3sVx38HSBDnE for ; Tue, 25 Jan 2011 04:45:13 -0800 (PST) Received: from frontend1.mail.m-online.net (unknown [192.168.8.180]) by mail-out.m-online.net (Postfix) with ESMTP id C21431C01D9B; Tue, 25 Jan 2011 13:45:10 +0100 (CET) X-Auth-Info: /ubZLL4qptVPZj5J7PPuUhjAF6YQjFBApKY3VEltezQ= Received: from diddl.denx.de (host-80-81-18-216.customer.m-online.net [80.81.18.216]) by smtp-auth.mnet-online.de (Postfix) with ESMTPA id 2F7EB1C000A9; Tue, 25 Jan 2011 13:45:10 +0100 (CET) Received: from gemini.denx.de (unknown [10.0.0.2]) by diddl.denx.de (Postfix) with ESMTP id 0D5853220181; Tue, 25 Jan 2011 13:45:10 +0100 (CET) Received: from gemini.denx.de (localhost.localdomain [127.0.0.1]) by gemini.denx.de (Postfix) with ESMTP id D76D6BB0B9; Tue, 25 Jan 2011 13:45:09 +0100 (CET) To: Dave Chinner cc: Emmanuel Florac , linux-raid@vger.kernel.org, Justin Piszcz , xfs@oss.sgi.com From: Wolfgang Denk X-ASG-Orig-Subj: Re: Optimize RAID0 for max IOPS? Subject: Re: Optimize RAID0 for max IOPS? MIME-Version: 1.0 Content-type: text/plain; charset=ISO-8859-1 Content-transfer-encoding: 8bit In-reply-to: <20110125083643.GE28803@dastard> References: <20110118210112.D13A236C@gemini.denx.de> <4D361F26.3060507@stud.tu-ilmenau.de> <20110119192104.1FA92D30267@gemini.denx.de> <20110124215713.82D75B187@gemini.denx.de> <20110124230314.GA11040@dastard> <20110125083900.4dd65bf2@galadriel2.home> <20110125083643.GE28803@dastard> Comments: In-reply-to Dave Chinner message dated "Tue, 25 Jan 2011 19:36:43 +1100." Date: Tue, 25 Jan 2011 13:45:09 +0100 Message-Id: <20110125124509.D76D6BB0B9@gemini.denx.de> X-Barracuda-Connect: mail-out.m-online.net[212.18.0.9] X-Barracuda-Start-Time: 1295959514 X-Barracuda-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.53395 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dear Dave Chinner, In message <20110125083643.GE28803@dastard> you wrote: > > Oh, despite $subject being "RAID0" the filesystems being tested are > on RAID5 and RAID6 with very small chunk sizes on slow SATA drives. > This is smelling like a case of barrier IOs on software raid on > cheap storage.... Right. [Any way to avoid these, btw?] I got side-tracked by the comments about the new (to me) delaylog mount option to xfs; as the results were not exactly as exp[ected I though it might be interesting to report these. But as the subject says, my current topic is tuning RAID0 to avoid exactly this type of bottleneck; or rather looking for tunable options on RAID0 Best regards, Wolfgang Denk -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de PLEASE NOTE: Some Quantum Physics Theories Suggest That When the Con- sumer Is Not Directly Observing This Product, It May Cease to Exist or Will Exist Only in a Vague and Undetermined State. From eflorac@intellique.com Tue Jan 25 06:49:07 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0PCn6nR006971 for ; Tue, 25 Jan 2011 06:49:07 -0600 X-ASG-Debug-ID: 1295959884-569f00c50000-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 90D521A1CFCF for ; Tue, 25 Jan 2011 04:51:27 -0800 (PST) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id 3LRn4qh9KIx93EEC for ; Tue, 25 Jan 2011 04:51:27 -0800 (PST) Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 143344C8059; Tue, 25 Jan 2011 13:51:18 +0100 (CET) Date: Tue, 25 Jan 2011 13:51:23 +0100 From: Emmanuel Florac To: Wolfgang Denk Cc: Dave Chinner , linux-raid@vger.kernel.org, Justin Piszcz , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Optimize RAID0 for max IOPS? Subject: Re: Optimize RAID0 for max IOPS? Message-ID: <20110125135123.0342f116@harpe.intellique.com> In-Reply-To: <20110125124509.D76D6BB0B9@gemini.denx.de> References: <20110118210112.D13A236C@gemini.denx.de> <4D361F26.3060507@stud.tu-ilmenau.de> <20110119192104.1FA92D30267@gemini.denx.de> <20110124215713.82D75B187@gemini.denx.de> <20110124230314.GA11040@dastard> <20110125083900.4dd65bf2@galadriel2.home> <20110125083643.GE28803@dastard> <20110125124509.D76D6BB0B9@gemini.denx.de> 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: 1295959889 X-Barracuda-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.53398 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, 25 Jan 2011 13:45:09 +0100 Wolfgang Denk =E9crivait: > > This is smelling like a case of barrier IOs on software raid on > > cheap storage.... =20 >=20 > Right. [Any way to avoid these, btw?]=20 Easy enough, use the "nobarrier" mount option.=20 --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From jpiszcz@lucidpixels.com Tue Jan 25 07:12:54 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0PDCrkg011390 for ; Tue, 25 Jan 2011 07:12:54 -0600 X-ASG-Debug-ID: 1295961315-6bb402750000-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 7FD7C1057F9E for ; Tue, 25 Jan 2011 05:15:15 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id 0KGX1EtI9qnHIpQz for ; Tue, 25 Jan 2011 05:15:15 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 7D68C120C27; Tue, 25 Jan 2011 08:15:15 -0500 (EST) Date: Tue, 25 Jan 2011 08:15:15 -0500 (EST) From: Justin Piszcz To: xfs@oss.sgi.com cc: linux-kernel@vger.kernel.org X-ASG-Orig-Subj: 2.6.37: XFS / BUG: soft lockup - CPU#0 stuck for 61s! [kworker/0:0:4783] Subject: 2.6.37: XFS / BUG: soft lockup - CPU#0 stuck for 61s! [kworker/0:0:4783] 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: 1295961316 X-Barracuda-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.53399 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 was rm -rf'ing some directories with many files and I tried to mkdir a directory elsewhere on the filesystem and this happened: # ps auxww | grep ' D ' root 560 0.0 0.0 0 0 ? D Jan20 0:00 [fsnotify_mark] root 1327 0.0 0.0 0 0 ? D Jan20 0:07 [xfssyncd/sda1] root 19006 5.8 0.0 4472 768 pts/40 D 08:07 0:10 rm -rf dir1 dir2 dir3 dir4 dir5 dir6 The filesystem in question: /dev/sda1 on /r1 type xfs (rw,noatime,nobarrier,logbufs=8,logbsize=262144,delaylog,inode64) The lockup: [392833.039090] BUG: soft lockup - CPU#0 stuck for 61s! [kworker/0:0:4783] [392833.039094] Modules linked in: [392833.039095] CPU 0 [392833.039096] Modules linked in: [392833.039097] [392833.039099] Pid: 4783, comm: kworker/0:0 Not tainted 2.6.37 #2 DP55KG/ [392833.039101] RIP: 0010:[] [] xfs_ail_insert+0x12/0x80 [392833.039105] RSP: 0018:ffff8800c24edd08 EFLAGS: 00000202 [392833.039107] RAX: ffff8802c2c11078 RBX: ffff88017426da98 RCX: 0000007a0012eb01 [392833.039108] RDX: ffff8802c1d19660 RSI: ffff88017426da98 RDI: 0000007a0012eb02 [392833.039109] RBP: ffffffff8149cbce R08: 000000000000007a R09: 000000000000007a [392833.039111] R10: ffff88041a436c48 R11: ffff8802d4e93058 R12: 000000000000001b [392833.039112] R13: ffff88041e85db00 R14: dead000000100100 R15: ffffffff810a0f07 [392833.039113] FS: 0000000000000000(0000) GS:ffff8800df000000(0000) knlGS:0000000000000000 [392833.039115] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b [392833.039116] CR2: 00000000025cc098 CR3: 000000028bcec000 CR4: 00000000000006f0 [392833.039118] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [392833.039119] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 [392833.039120] Process kworker/0:0 (pid: 4783, threadinfo ffff8800c24ec000, task ffff880057a56750) [392833.039122] Stack: [392833.039123] ffffffff8122876c ffff88017426da98 ffff88041a436c40 000000000000007a [392833.039126] ffff88041e59a9c0 ffff88041e59aa48 ffffffff81227236 ffff880356dfccc0 [392833.039128] 0000007a0012eb01 ffff88023de8a340 ffff88006f6dba40 0000000000000000 [392833.039130] Call Trace: [392833.039133] [] ? xfs_trans_ail_update+0x4c/0xd0 [392833.039136] [] ? xfs_trans_item_committed+0xb6/0xe0 [392833.039139] [] ? xlog_cil_committed+0x30/0xe0 [392833.039141] [] ? xlog_state_do_callback+0x15c/0x2c0 [392833.039144] [] ? xfs_buf_iodone_work+0x0/0x60 [392833.039147] [] ? process_one_work+0xfb/0x3b0 [392833.039149] [] ? worker_thread+0x14e/0x400 [392833.039151] [] ? worker_thread+0x0/0x400 [392833.039152] [] ? worker_thread+0x0/0x400 [392833.039155] [] ? kthread+0x96/0xa0 [392833.039158] [] ? kernel_thread_helper+0x4/0x10 [392833.039160] [] ? kthread+0x0/0xa0 [392833.039162] [] ? kernel_thread_helper+0x0/0x10 [392833.039163] Code: 48 8b 6c 24 10 4c 8b 64 24 18 4c 8b 6c 24 20 48 83 c4 28 e9 11 0b ff ff 90 4c 8d 57 08 4c 3b 57 08 74 58 48 8b 47 10 48 8b 50 08 <49> 39 c2 0f 18 0a 74 20 48 8b 4e 10 48 8b 78 10 49 89 c8 49 89 [392833.039179] Call Trace: [392833.039180] [] ? xfs_trans_ail_update+0x4c/0xd0 [392833.039182] [] ? xfs_trans_item_committed+0xb6/0xe0 [392833.039184] [] ? xlog_cil_committed+0x30/0xe0 [392833.039186] [] ? xlog_state_do_callback+0x15c/0x2c0 [392833.039188] [] ? xfs_buf_iodone_work+0x0/0x60 [392833.039190] [] ? process_one_work+0xfb/0x3b0 [392833.039192] [] ? worker_thread+0x14e/0x400 [392833.039194] [] ? worker_thread+0x0/0x400 [392833.039196] [] ? worker_thread+0x0/0x400 [392833.039198] [] ? kthread+0x96/0xa0 [392833.039200] [] ? kernel_thread_helper+0x4/0x10 [392833.039202] [] ? kthread+0x0/0xa0 [392833.039204] [] ? kernel_thread_helper+0x0/0x10 Is this normal? Is it because I am using delaylog? I notice when I use delaylog, there is an EXTREME amount of lag/hanging of the system sometimes when deleting thousands/millions of files until its done. Justin. From ccoager@davisvision.com Tue Jan 25 08:19:47 2011 X-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 p0PEJk3t023785 for ; Tue, 25 Jan 2011 08:19:47 -0600 X-ASG-Debug-ID: 1295965328-77a503c70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from zixvpm01.zixvpm.davisvision.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A04381057764 for ; Tue, 25 Jan 2011 06:22:09 -0800 (PST) Received: from zixvpm01.zixvpm.davisvision.com (zixvpm01.zixvpm.davisvision.com [65.213.99.44]) by cuda.sgi.com with ESMTP id ZSKYa0lq3BVIHQns for ; Tue, 25 Jan 2011 06:22:09 -0800 (PST) Received: from zixvpm01.zixvpm.davisvision.com (ZixVPM [127.0.0.1]) by Outbound.davisvision.com (Proprietary) with ESMTP id 41A828CC032 for ; Tue, 25 Jan 2011 09:22:08 -0500 (EST) Received: from hoiby.davisvision.com (unknown [10.51.11.114]) by zixvpm01.zixvpm.davisvision.com (Proprietary) with ESMTP id B1B0835801C; Tue, 25 Jan 2011 09:22:07 -0500 (EST) Received: from hoiby.davisvision.com (localhost [127.0.0.1]) by localhost (Postfix) with SMTP id A440228AAF; Tue, 25 Jan 2011 09:22:07 -0500 (EST) Received: from [192.168.148.68] (ccoager-linux.davisvision.com [192.168.148.68]) by hoiby.davisvision.com (Postfix) with ESMTP id 8583A28AA8; Tue, 25 Jan 2011 09:22:07 -0500 (EST) Message-ID: <12688_1295965327_4D3EDC8F_12688_221_1_4D3EDC8F.5070403@davisvision.com> Date: Tue, 25 Jan 2011 09:22:07 -0500 From: Cory Coager Organization: Davis Vision User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101208 Lightning/1.0b2 Thunderbird/3.1.7 MIME-Version: 1.0 To: Stan Hoeppner CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: extremely slow write performance plaintext Subject: Re: extremely slow write performance plaintext References: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> <20110113233527.6dca104d@galadriel.home> <18993_1294964274_4D2F9632_18993_1387_1_F79CF9ADB27B2646B59221B7355263830CC143B1@NYL-EXCH1.HVHCVision.com> <4D30A945.4060000@hardwarefreak.com> <27616_1295038110_4D30B69E_27616_233_1_4D30B69E.4020506@davisvision.com> <4D30C7F3.3040105@hardwarefreak.com> <1779_1295360207_4D35A0CF_1779_747_1_4D35A0CF.9050503@davisvision.com> <4D36B5EA.6040603@hardwarefreak.com> In-Reply-To: <4D36B5EA.6040603@hardwarefreak.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Banner: Set X-Barracuda-Connect: zixvpm01.zixvpm.davisvision.com[65.213.99.44] X-Barracuda-Start-Time: 1295965329 X-Barracuda-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.53403 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 01/19/2011 04:59 AM, Stan Hoeppner wrote: > Then, logically, there is something different about this logical volume than the > others. All of them reside atop the same volume group, atop the same two > physical RAID6 arrays, correct? Since I'm not quite tired of playing dentist (yet): > > 1. Were all of the LVs created with the same parameters? If so, can you > demonstrate verification of this to us? Yes... pvcreate --metadatacopies 2 /dev/cciss/c1d0p1 pvcreate --metadatacopies 2 /dev/cciss/c1d1p1 vgcreate vg0 /dev/cciss/c1d0p1 /dev/cciss/c1d1p1 lvcreate -n shared -L 2.1T /dev/vg0 lvcreate -n homes -L 810G /dev/vg0 > 2. Are all of them formatted with XFS? Were all formatted with the same XFS > parameters? If so, can you demonstrate verification of this to us? mkfs.xfs -L homes -i attr=2,size=1024 -l version=2,size=128m,lazy-count=1 /dev/vg0/homes mkfs.xfs -L shared -i attr=2,size=1024 -l version=2,size=128m,lazy-count=1 /dev/vg0/shared > 3. Are you encrypting, at some level, the one LV that is showing low performance? > > Cory: "The two arrays were added to a volume group and multiple logical volumes > were created." No encryption > 4. Was this volume group preexisting? Are there other storage devices in this > volume group, or _only_ the RAID6 arrays? Everything is new, hardware, LV's, file systems... > 5. Have you attempted deleting and recreating the LV with the performance issue? No and I don't have the room to recreate this LV > 6. How many total logical volumes are in this volume group? 6 > 7. What Linux distribution are you using? What kernel version? SLES 10 SP2, 2.6.16.60-0.21-bigsmp i686 > > We are not magicians here Cory. We need as much data from you as possible or we > can't help you. I thought I made this clear earlier. You need to gather as > much relevant data from that box as you can and present it here if you're > serious about solving this issue. > > I get the feeling you just don't really care. In which case, why did you even > ask for help in the first place? Troubleshooting this issue requires your > _full_ participation and effort. > > In these situations, it is most often the OP who solves his/her own issue, after > providing enough information here that we can point the OP in the right > direction. The key here is "providing enough information". Sorry I'm not trying to withhold information. Whatever you need to know just ask and I'll be happy to provide it. ------------------------------------------------------------------------ The information contained in this communication is intended only for the use of the recipient(s) named above. It may contain information that is privileged or confidential, and may be protected by State and/or Federal Regulations. If the reader of this message is not the intended recipient, you are hereby notified that any dissemination, distribution, or copying of this communication, or any of its contents, is strictly prohibited. If you have received this communication in error, please return it to the sender immediately and delete the original message and any copy of it from your computer system. If you have any questions concerning this message, please contact the sender. ------------------------------------------------------------------------ From ccoager@davisvision.com Tue Jan 25 08:22:50 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0PEMoLf024388 for ; Tue, 25 Jan 2011 08:22:50 -0600 X-ASG-Debug-ID: 1295965512-788903470000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from zixvpm02.zixvpm.davisvision.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4DD1F28F0C8 for ; Tue, 25 Jan 2011 06:25:13 -0800 (PST) Received: from zixvpm02.zixvpm.davisvision.com (zixvpm02.zixvpm.davisvision.com [65.213.99.45]) by cuda.sgi.com with ESMTP id 4eNTuWeQmvVshGjp for ; Tue, 25 Jan 2011 06:25:13 -0800 (PST) Received: from zixvpm02.zixvpm.davisvision.com (ZixVPM [127.0.0.1]) by Outbound.davisvision.com (Proprietary) with ESMTP id BAD065DC021 for ; Tue, 25 Jan 2011 09:25:12 -0500 (EST) Received: from riley.davisvision.com (unknown [10.51.11.112]) by zixvpm02.zixvpm.davisvision.com (Proprietary) with ESMTP id 1E8271F4025; Tue, 25 Jan 2011 09:25:12 -0500 (EST) Received: from riley.davisvision.com (localhost [127.0.0.1]) by localhost (Postfix) with SMTP id 0F5F92463A; Tue, 25 Jan 2011 09:25:12 -0500 (EST) Received: from [192.168.148.68] (ccoager-linux.davisvision.com [192.168.148.68]) by riley.davisvision.com (Postfix) with ESMTP id 88FDE24637; Tue, 25 Jan 2011 09:25:11 -0500 (EST) Message-ID: <20047_1295965512_4D3EDD47_20047_8804_1_4D3EDD47.304@davisvision.com> Date: Tue, 25 Jan 2011 09:25:11 -0500 From: Cory Coager Organization: Davis Vision User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101208 Lightning/1.0b2 Thunderbird/3.1.7 MIME-Version: 1.0 To: Mathieu AVILA CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: extremely slow write performance plaintext Subject: Re: extremely slow write performance plaintext References: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> <4D30C7F3.3040105@hardwarefreak.com> <1779_1295360207_4D35A0CF_1779_747_1_4D35A0CF.9050503@davisvision.com> <201101250721.14716@zmi.at> <4D3E9C73.6090508@opencubetech.com> In-Reply-To: <4D3E9C73.6090508@opencubetech.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Banner: Set X-Barracuda-Connect: zixvpm02.zixvpm.davisvision.com[65.213.99.45] X-Barracuda-Start-Time: 1295965513 X-Barracuda-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.53404 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 01/25/2011 04:48 AM, Mathieu AVILA wrote >> You're getting 40MB/s write speed and says that's fine? I get more >> performance from a single SATA desktop drive. Your setup seems to suck >> extremely somewhere. >> >> It already starts with your dd speed. I started it on a virtualized VM >> on an old, overloaded server and get: >> >> # dd if=/dev/zero of=test.dd bs=1k count=1M >> 1048576+0 Datensätze ein >> 1048576+0 Datensätze aus >> 1073741824 Bytes (1,1 GB) kopiert, 10,9992 s, 97,6 MB/s >> > > I would say this is melted with cache hit, isn't it ? (although I > agree it depends on the server's memory dedicated to FS cache) > > A real cache hit on a real server would give me at least 500 MB/s > (actually I get something around 1 GB/s) > When it starts to be disk-constrained, on a standard SATA disk, I get > from 75 MB/s to 140 MB/s depending on the position of the AG I hit. I agree, it should be a lot faster even on the LV's that are functioning fine. The disk arrays and disks are new but the rest of the hardware is pretty old, that might be part of the problem. It is a ProLiant DL385 G1. ------------------------------------------------------------------------ The information contained in this communication is intended only for the use of the recipient(s) named above. It may contain information that is privileged or confidential, and may be protected by State and/or Federal Regulations. If the reader of this message is not the intended recipient, you are hereby notified that any dissemination, distribution, or copying of this communication, or any of its contents, is strictly prohibited. If you have received this communication in error, please return it to the sender immediately and delete the original message and any copy of it from your computer system. If you have any questions concerning this message, please contact the sender. ------------------------------------------------------------------------ From ccoager@davisvision.com Tue Jan 25 08:25:03 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0PEP2bG024792 for ; Tue, 25 Jan 2011 08:25:03 -0600 X-ASG-Debug-ID: 1295965644-54da00330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from zixvpm01.zixvpm.davisvision.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3C1D51057812 for ; Tue, 25 Jan 2011 06:27:24 -0800 (PST) Received: from zixvpm01.zixvpm.davisvision.com (zixvpm01.zixvpm.davisvision.com [65.213.99.44]) by cuda.sgi.com with ESMTP id u2GRPiNh0A0TQrEV for ; Tue, 25 Jan 2011 06:27:24 -0800 (PST) Received: from zixvpm01.zixvpm.davisvision.com (ZixVPM [127.0.0.1]) by Outbound.davisvision.com (Proprietary) with ESMTP id B262D8CC032 for ; Tue, 25 Jan 2011 09:27:23 -0500 (EST) Received: from hoiby.davisvision.com (unknown [10.51.11.114]) by zixvpm01.zixvpm.davisvision.com (Proprietary) with ESMTP id 49B6335801C; Tue, 25 Jan 2011 09:27:23 -0500 (EST) Received: from hoiby.davisvision.com (localhost [127.0.0.1]) by localhost (Postfix) with SMTP id 3B57A28AA6; Tue, 25 Jan 2011 09:27:23 -0500 (EST) Received: from [192.168.148.68] (ccoager-linux.davisvision.com [192.168.148.68]) by hoiby.davisvision.com (Postfix) with ESMTP id 13A7B28AA5; Tue, 25 Jan 2011 09:27:23 -0500 (EST) Message-ID: <12688_1295965643_4D3EDDCB_12688_316_1_4D3EDDCB.7000405@davisvision.com> Date: Tue, 25 Jan 2011 09:27:23 -0500 From: Cory Coager Organization: Davis Vision User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101208 Lightning/1.0b2 Thunderbird/3.1.7 MIME-Version: 1.0 To: Michael Monnerie CC: xfs@oss.sgi.com, Stan Hoeppner X-ASG-Orig-Subj: Re: extremely slow write performance plaintext Subject: Re: extremely slow write performance plaintext References: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> <4D30C7F3.3040105@hardwarefreak.com> <1779_1295360207_4D35A0CF_1779_747_1_4D35A0CF.9050503@davisvision.com> <201101250721.14716@zmi.at> In-Reply-To: <201101250721.14716@zmi.at> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Banner: Set X-Barracuda-Connect: zixvpm01.zixvpm.davisvision.com[65.213.99.44] X-Barracuda-Start-Time: 1295965645 X-Barracuda-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.53403 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 01/25/2011 01:21 AM, Michael Monnerie wrote: > You're getting 40MB/s write speed and says that's fine? I get more > performance from a single SATA desktop drive. Your setup seems to suck > extremely somewhere. > > It already starts with your dd speed. I started it on a virtualized VM > on an old, overloaded server and get: > > # dd if=/dev/zero of=test.dd bs=1k count=1M > 1048576+0 Datensätze ein > 1048576+0 Datensätze aus > 1073741824 Bytes (1,1 GB) kopiert, 10,9992 s, 97,6 MB/s > > This is a hardware RAID 6 with just 8x 10krpm WD SATA drives. Try to > look into general I/O problems. Maybe you can try to boot from an actual > linux CD with kernel>2.6.30 to see if that helps performance. > > Maybe one or more disks in your array are dead and the controller is > crying for replacement? I just checked the array configuration utility, no drives are dead. Unfortunately this server is in production and I am not physical next to the machine so I won't be able to test with a LiveCD. ------------------------------------------------------------------------ The information contained in this communication is intended only for the use of the recipient(s) named above. It may contain information that is privileged or confidential, and may be protected by State and/or Federal Regulations. If the reader of this message is not the intended recipient, you are hereby notified that any dissemination, distribution, or copying of this communication, or any of its contents, is strictly prohibited. If you have received this communication in error, please return it to the sender immediately and delete the original message and any copy of it from your computer system. If you have any questions concerning this message, please contact the sender. ------------------------------------------------------------------------ From lkml@malc.org.uk Tue Jan 25 11:11:07 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0PHB7OM053942 for ; Tue, 25 Jan 2011 11:11:07 -0600 X-ASG-Debug-ID: 1295975607-36e700c20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from saturn.retrosnub.co.uk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4381528FC9D for ; Tue, 25 Jan 2011 09:13:27 -0800 (PST) Received: from saturn.retrosnub.co.uk (saturn.retrosnub.co.uk [178.18.118.26]) by cuda.sgi.com with ESMTP id IfLaM4calL1Y0AO3 for ; Tue, 25 Jan 2011 09:13:27 -0800 (PST) Received: from callisto.malc.org.uk (callisto.malc.org.uk [IPv6:2001:470:94c7::2]) by saturn.retrosnub.co.uk (Postfix; Retrosnub mail submission) with ESMTPSA id A1C5C4028E; Tue, 25 Jan 2011 17:13:25 +0000 (GMT) Date: Tue, 25 Jan 2011 17:13:25 +0000 (GMT) From: Malcolm Scott X-X-Sender: mas90@callisto.malc.org.uk To: Dave Chinner cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Re: XFS deadlock in 2.6.37 Subject: Re: [PATCH] Re: XFS deadlock in 2.6.37 In-Reply-To: <20110121052802.GA16267@dastard> Message-ID: References: <20110121052802.GA16267@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: saturn.retrosnub.co.uk[178.18.118.26] X-Barracuda-Start-Time: 1295975608 X-Barracuda-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.53414 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 21 Jan 2011, Dave Chinner wrote: > Looks like everything is hung up on the freelist lock. Can you > test the patch below? So far I haven't seen that crash after applying your patch; thanks. (It previously took several days to occur on a busy box, though, so not 100% sure it's gone.) However, there's now a new crash -- not sure how related this is but at some of the stack traces involve XFS. Any ideas? Unlike the last one, I could apparently recover the kernel with sysrq-i. INFO: task nfsd:3923 blocked for more than 120 seconds. [221162.675428] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [221162.691015] ffff88030a5d79f0 0000000000000046 ffff88030a5d7980 ffff880002b97ff8 [221162.706250] 0000000000013a00 ffff880339cfad80 ffff880339cfb118 ffff88030a5d7fd8 [221162.721488] ffff880339cfb120 0000000000013a00 ffff88030a5d6010 0000000000013a00 [221162.736739] Call Trace: [221162.746904] [] __mutex_lock_slowpath+0xf7/0x180 [221162.760862] [] ? exportfs_get_name+0x13e/0x160 [exportfs] [221162.775580] [] mutex_lock+0x23/0x50 [221162.788271] [] reconnect_path+0x1f2/0x300 [exportfs] [221162.802483] [] exportfs_decode_fh+0xea/0x940 [exportfs] [221162.816907] [] ? nfsd_acceptable+0x0/0x120 [nfsd] [221162.830732] [] ? cache_check+0x6f/0x210 [sunrpc] [221162.844380] [] ? exp_find_key+0x62/0xb0 [nfsd] [221162.857770] [] ? kmem_cache_alloc_notrace+0x9c/0xb0 [221162.871504] [] ? aa_dup_task_context+0x3d/0x70 [221162.871509] [] ? apparmor_cred_prepare+0x40/0x60 [221162.871519] [] nfsd_set_fh_dentry+0x214/0x3d0 [nfsd] [221162.871523] [] ? __alloc_pages_slowpath+0x1c5/0x5c0 [221162.871530] [] fh_verify+0x1c5/0x280 [nfsd] [221162.871537] [] nfsd_access+0x38/0x160 [nfsd] [221162.871546] [] nfsd3_proc_access+0x77/0xd0 [nfsd] [221162.871556] [] nfsd_dispatch+0xfe/0x250 [nfsd] [221162.871571] [] svc_process_common+0x344/0x630 [sunrpc] [221162.871576] [] ? default_wake_function+0x0/0x20 [221162.871582] [] ? nfsd+0x0/0x170 [nfsd] [221162.871593] [] svc_process+0x110/0x150 [sunrpc] [221162.871600] [] nfsd+0xc5/0x170 [nfsd] [221162.871604] [] kthread+0x96/0xa0 [221162.871608] [] kernel_thread_helper+0x4/0x10 [221162.871611] [] ? kthread+0x0/0xa0 [221162.871614] [] ? kernel_thread_helper+0x0/0x10 [221162.871672] INFO: task php5-cgi:32524 blocked for more than 120 seconds. [221162.871674] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [221162.871680] ffff880057f4fc88 0000000000000086 ffff880057f4fbe8 ffffffff815c9160 [221162.871684] 0000000000013a00 ffff88002bc22d80 ffff88002bc23118 ffff880057f4ffd8 [221162.871687] ffff88002bc23120 0000000000013a00 ffff880057f4e010 0000000000013a00 [221162.871691] Call Trace: [221162.871695] [] ? io_schedule+0x90/0xc0 [221162.871700] [] ? wait_on_page_bit+0x73/0x80 [221162.871703] [] __mutex_lock_slowpath+0xf7/0x180 [221162.871707] [] ? in_group_p+0x31/0x40 [221162.871710] [] mutex_lock+0x23/0x50 [221162.871713] [] do_lookup+0x102/0x180 [221162.871716] [] do_last+0x29d/0x420 [221162.871719] [] do_filp_open+0x203/0x5f0 [221162.871723] [] ? handle_mm_fault+0x1b9/0x420 [221162.871728] [] ? alloc_fd+0x10a/0x150 [221162.871732] [] do_sys_open+0x69/0x150 [221162.871735] [] sys_open+0x20/0x30 [221162.871739] [] system_call_fastpath+0x16/0x1b [221162.871743] INFO: task sshd:32537 blocked for more than 120 seconds. [221162.871745] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [221162.871750] ffff88007c09bc88 0000000000000082 ffff88007c09bbe8 ffffffff815c9160 [221162.871754] 0000000000013a00 ffff88027d098000 ffff88027d098398 ffff88007c09bfd8 [221162.871757] ffff88027d0983a0 0000000000013a00 ffff88007c09a010 0000000000013a00 [221162.871761] Call Trace: [221162.871763] [] ? io_schedule+0x90/0xc0 [221162.871767] [] ? wait_on_page_bit+0x73/0x80 [221162.871770] [] __mutex_lock_slowpath+0xf7/0x180 [221162.871773] [] mutex_lock+0x23/0x50 [221162.871775] [] do_lookup+0x102/0x180 [221162.871778] [] do_last+0x29d/0x420 [221162.871781] [] do_filp_open+0x203/0x5f0 [221162.871784] [] ? handle_mm_fault+0x1b9/0x420 [221162.871787] [] ? alloc_fd+0x10a/0x150 [221162.871790] [] do_sys_open+0x69/0x150 [221162.871793] [] sys_open+0x20/0x30 [221162.871796] [] system_call_fastpath+0x16/0x1b [221162.871799] INFO: task sshd:32541 blocked for more than 120 seconds. [221162.871801] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [221162.871806] ffff880056c7fc88 0000000000000082 ffff880056c7fbe8 ffffffff00000000 [221162.871809] 0000000000013a00 ffff88027d09ad80 ffff88027d09b118 ffff880056c7ffd8 [221162.871813] ffff88027d09b120 0000000000013a00 ffff880056c7e010 0000000000013a00 [221162.871816] Call Trace: [221162.871819] [] __mutex_lock_slowpath+0xf7/0x180 [221162.871822] [] mutex_lock+0x23/0x50 [221162.871825] [] do_lookup+0x102/0x180 [221162.871828] [] do_last+0x29d/0x420 [221162.871830] [] do_filp_open+0x203/0x5f0 [221162.871833] [] ? handle_mm_fault+0x1b9/0x420 [221162.871836] [] ? alloc_fd+0x10a/0x150 [221162.871839] [] do_sys_open+0x69/0x150 [221162.871842] [] sys_open+0x20/0x30 [221162.871845] [] system_call_fastpath+0x16/0x1b [221162.871849] INFO: task sshd:32547 blocked for more than 120 seconds. [221162.871850] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [221162.871855] ffff88009935bc88 0000000000000086 ffff88009935bbe8 ffffffff00000000 [221162.871859] 0000000000013a00 ffff8802279596c0 ffff880227959a58 ffff88009935bfd8 [221162.871862] ffff880227959a60 0000000000013a00 ffff88009935a010 0000000000013a00 [221162.871865] Call Trace: [221162.871868] [] __mutex_lock_slowpath+0xf7/0x180 [221162.871871] [] mutex_lock+0x23/0x50 [221162.871874] [] do_lookup+0x102/0x180 [221162.871876] [] do_last+0x29d/0x420 [221162.871879] [] do_filp_open+0x203/0x5f0 [221162.871882] [] ? handle_mm_fault+0x1b9/0x420 [221162.871885] [] ? alloc_fd+0x10a/0x150 [221162.871888] [] do_sys_open+0x69/0x150 [221162.871891] [] sys_open+0x20/0x30 [221162.871894] [] system_call_fastpath+0x16/0x1b [221162.871896] INFO: task sshd:32548 blocked for more than 120 seconds. [221162.871898] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [221162.871903] ffff88006cabda98 0000000000000082 ffff88006cabda38 ffffffff811787d6 [221162.871906] 0000000000013a00 ffff880066494440 ffff8800664947d8 ffff88006cabdfd8 [221162.871910] ffff8800664947e0 0000000000013a00 ffff88006cabc010 0000000000013a00 [221162.871913] Call Trace: [221162.871916] [] ? __d_lookup+0x136/0x150 [221162.871919] [] __mutex_lock_slowpath+0xf7/0x180 [221162.871922] [] mutex_lock+0x23/0x50 [221162.871925] [] do_lookup+0x102/0x180 [221162.871927] [] do_last+0x29d/0x420 [221162.871930] [] do_filp_open+0x203/0x5f0 [221162.871933] [] ? do_sync_read+0xda/0x120 [221162.871936] [] ? lru_cache_add_lru+0x2d/0x50 [221162.871941] [] open_exec+0x3d/0x110 [221162.871945] [] load_elf_binary+0xdcd/0xeb0 [221162.871948] [] ? get_user_pages+0x49/0x50 [221162.871951] [] ? get_arg_page+0x5c/0x100 [221162.871954] [] search_binary_handler+0xe2/0x300 [221162.871957] [] do_execve+0x237/0x340 [221162.871961] [] sys_execve+0x4a/0x80 [221162.871964] [] stub_execve+0x6c/0xc0 [221282.870468] INFO: task nfsd:3923 blocked for more than 120 seconds. [221282.882094] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [221282.895378] ffff88030a5d79f0 0000000000000046 ffff88030a5d7980 ffff880002b97ff8 [221282.908408] 0000000000013a00 ffff880339cfad80 ffff880339cfb118 ffff88030a5d7fd8 [221282.921529] ffff880339cfb120 0000000000013a00 ffff88030a5d6010 0000000000013a00 [221282.921533] Call Trace: [221282.921544] [] __mutex_lock_slowpath+0xf7/0x180 [221282.921558] [] ? exportfs_get_name+0x13e/0x160 [exportfs] [221282.921561] [] mutex_lock+0x23/0x50 [221282.921565] [] reconnect_path+0x1f2/0x300 [exportfs] [221282.921569] [] exportfs_decode_fh+0xea/0x940 [exportfs] [221282.921580] [] ? nfsd_acceptable+0x0/0x120 [nfsd] [221282.921600] [] ? cache_check+0x6f/0x210 [sunrpc] [221282.921608] [] ? exp_find_key+0x62/0xb0 [nfsd] [221282.921613] [] ? kmem_cache_alloc_notrace+0x9c/0xb0 [221282.921618] [] ? aa_dup_task_context+0x3d/0x70 [221282.921622] [] ? apparmor_cred_prepare+0x40/0x60 [221282.921629] [] nfsd_set_fh_dentry+0x214/0x3d0 [nfsd] [221282.921633] [] ? __alloc_pages_slowpath+0x1c5/0x5c0 [221282.921640] [] fh_verify+0x1c5/0x280 [nfsd] [221282.921647] [] nfsd_access+0x38/0x160 [nfsd] [221282.921655] [] nfsd3_proc_access+0x77/0xd0 [nfsd] [221282.921662] [] nfsd_dispatch+0xfe/0x250 [nfsd] [221282.921674] [] svc_process_common+0x344/0x630 [sunrpc] [221282.921679] [] ? default_wake_function+0x0/0x20 [221282.921685] [] ? nfsd+0x0/0x170 [nfsd] [221282.921696] [] svc_process+0x110/0x150 [sunrpc] [221282.921702] [] nfsd+0xc5/0x170 [nfsd] [221282.921707] [] kthread+0x96/0xa0 [221282.921711] [] kernel_thread_helper+0x4/0x10 [221282.921714] [] ? kthread+0x0/0xa0 [221282.921717] [] ? kernel_thread_helper+0x0/0x10 [221282.921755] INFO: task kworker/0:2:21740 blocked for more than 120 seconds. [221282.921756] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [221282.921762] ffff880345031ac0 0000000000000046 ffff880345031a10 ffffffff812db486 [221282.921765] 0000000000013a00 ffff88004c5bc440 ffff88004c5bc7d8 ffff880345031fd8 [221282.921768] ffff88004c5bc7e0 0000000000013a00 ffff880345030010 0000000000013a00 [221282.921772] Call Trace: [221282.921776] [] ? rb_erase+0xd6/0x160 [221282.921782] [] __mutex_lock_slowpath+0xf7/0x180 [221282.921787] [] ? enqueue_entity+0x132/0x1b0 [221282.921789] [] mutex_lock+0x23/0x50 [221282.921825] [] xfs_file_aio_write+0x4fa/0xac0 [xfs] [221282.921829] [] ? tg_nop+0x0/0x10 [221282.921832] [] ? enqueue_sleeper+0x158/0x230 [221282.921836] [] do_sync_write+0xda/0x120 [221282.921839] [] ? try_to_wake_up+0xc3/0x410 [221282.921844] [] ? ktime_get_ts+0xa9/0xe0 [221282.921848] [] do_acct_process+0x3fb/0x500 [221282.921851] [] acct_process+0x7e/0xb0 [221282.921854] [] do_exit+0x2a5/0x400 [221282.921857] [] ? worker_thread+0x0/0x410 [221282.921860] [] kthread+0x8e/0xa0 [221282.921863] [] kernel_thread_helper+0x4/0x10 [221282.921866] [] ? kthread+0x0/0xa0 [221282.921868] [] ? kernel_thread_helper+0x0/0x10 [221282.921872] INFO: task kworker/3:0:16949 blocked for more than 120 seconds. [221282.921873] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [221282.921879] ffff88021acd9ac0 0000000000000046 0000000000000001 ffff88009e0d3a00 [221282.921882] 0000000000013a00 ffff8800020696c0 ffff880002069a58 ffff88021acd9fd8 [221282.921885] ffff880002069a60 0000000000013a00 ffff88021acd8010 0000000000013a00 [221282.921889] Call Trace: [221282.921892] [] __mutex_lock_slowpath+0xf7/0x180 [221282.921895] [] mutex_lock+0x23/0x50 [221282.921915] [] xfs_file_aio_write+0x4fa/0xac0 [xfs] [221282.921919] [] ? default_spin_lock_flags+0x9/0x10 [221282.921923] [] ? sched_clock+0x9/0x10 [221282.921926] [] ? rb_insert_color+0x9d/0x160 [221282.921929] [] do_sync_write+0xda/0x120 [221282.921932] [] ? try_to_wake_up+0xc3/0x410 [221282.921935] [] ? ktime_get_ts+0xa9/0xe0 [221282.921938] [] do_acct_process+0x3fb/0x500 [221282.921941] [] acct_process+0x7e/0xb0 [221282.921944] [] do_exit+0x2a5/0x400 [221282.921947] [] ? worker_thread+0x0/0x410 [221282.921950] [] kthread+0x8e/0xa0 [221282.921952] [] kernel_thread_helper+0x4/0x10 [221282.921955] [] ? kthread+0x0/0xa0 [221282.921958] [] ? kernel_thread_helper+0x0/0x10 [221282.921961] INFO: task kworker/1:2:29640 blocked for more than 120 seconds. [221282.921962] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [221282.921968] ffff880144665ac0 0000000000000046 ffff880144665a10 ffffffff812db486 [221282.921971] 0000000000013a00 ffff8800025b96c0 ffff8800025b9a58 ffff880144665fd8 [221282.921974] ffff8800025b9a60 0000000000013a00 ffff880144664010 0000000000013a00 [221282.921978] Call Trace: [221282.921980] [] ? rb_erase+0xd6/0x160 [221282.921984] [] __mutex_lock_slowpath+0xf7/0x180 [221282.921987] [] mutex_lock+0x23/0x50 [221282.922007] [] xfs_file_aio_write+0x4fa/0xac0 [xfs] [221282.922010] [] ? put_dec+0x59/0x60 [221282.922030] [] ? xfs_icsb_count+0x8b/0xc0 [xfs] [221282.922034] [] ? default_spin_lock_flags+0x9/0x10 [221282.922037] [] ? _raw_spin_lock_irqsave+0x2f/0x40 [221282.922040] [] do_sync_write+0xda/0x120 [221282.922044] [] ? ktime_get_ts+0xa9/0xe0 [221282.922047] [] do_acct_process+0x3fb/0x500 [221282.922050] [] acct_process+0x7e/0xb0 [221282.922053] [] do_exit+0x2a5/0x400 [221282.922056] [] ? worker_thread+0x0/0x410 [221282.922059] [] kthread+0x8e/0xa0 [221282.922062] [] kernel_thread_helper+0x4/0x10 [221282.922065] [] ? kthread+0x0/0xa0 [221282.922067] [] ? kernel_thread_helper+0x0/0x10 -- Malcolm Scott From stan@hardwarefreak.com Tue Jan 25 17:30:29 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0PNUT9o102731 for ; Tue, 25 Jan 2011 17:30:29 -0600 X-ASG-Debug-ID: 1295998373-503e024e0000-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 50BD7291AA6 for ; Tue, 25 Jan 2011 15:32:53 -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 zob5aGBIQ3l8N664 for ; Tue, 25 Jan 2011 15:32:53 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 948D06C0A8 for ; Tue, 25 Jan 2011 17:32:52 -0600 (CST) Message-ID: <4D3F5DA4.3070809@hardwarefreak.com> Date: Tue, 25 Jan 2011 17:32:52 -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: version dependency question Subject: version dependency question 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: 1295998373 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4768 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.53440 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 Is the delaylog fstab mount option dependent on anything external to the kernel, such as the mount command, or xfsprogs? Do these need to be updated to take advantage of '-o delaylog'? I'm currently running vanilla 2.6.34.1 underneath Debian Lenny, whose mount and xfsprogs (and everything for that matter) are quite old. -- Stan From BATV+f33d1ee6a04bb260fa6f+2711+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 25 17:51:34 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0PNpWPi103395 for ; Tue, 25 Jan 2011 17:51:34 -0600 X-ASG-Debug-ID: 1295999635-092f02d20000-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 1F2C81A29F58 for ; Tue, 25 Jan 2011 15:53:56 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id LeRVn4E9Spa97F71 for ; Tue, 25 Jan 2011 15:53:56 -0800 (PST) X-ASG-Whitelist: Client X-ASG-Whitelist: Barracuda Reputation Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Phshu-0004fa-EW; Tue, 25 Jan 2011 23:53:54 +0000 Date: Tue, 25 Jan 2011 18:53:54 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/8] xfs: fix efi item leak on forced shutdown Subject: Re: [PATCH 2/8] xfs: fix efi item leak on forced shutdown Message-ID: <20110125235354.GA3832@infradead.org> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295945444-29488-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: 1295999636 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, Jan 25, 2011 at 07:50:38PM +1100, Dave Chinner wrote: > diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c > index 75f2ef6..effbb41 100644 > --- a/fs/xfs/xfs_extfree_item.c > +++ b/fs/xfs/xfs_extfree_item.c > @@ -138,7 +138,6 @@ xfs_efi_item_unpin( > > if (remove) { > ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); > - xfs_trans_del_item(lip); > xfs_efi_item_free(efip); > return; > } > STATIC void > xfs_trans_uncommit( > struct xfs_trans *tp, > uint flags) > { > - struct xfs_log_item_desc *lidp; > + struct xfs_log_item_desc *lidp, *n; > > - list_for_each_entry(lidp, &tp->t_items, lid_trans) { > + list_for_each_entry_safe(lidp, n, &tp->t_items, lid_trans) { > /* > * Unpin all but those that aren't dirty. > */ > - if (lidp->lid_flags & XFS_LID_DIRTY) > + if (lidp->lid_flags & XFS_LID_DIRTY) { > + xfs_trans_del_item(lidp->lid_item); > IOP_UNPIN(lidp->lid_item, 1); > + } This part of the patch isn't explained in the changelog, and I suspect it should be a separate patch from the addition of the IOP_UNPIN with remove call to the CIL error path. Moving the xfs_trans_del_item from the IOP_UNPIN implementation into the caller seems sane to me, but: - why is the call to xfs_trans_del_item left in xfs_buf_item_unpin - why did xfs_buf_item_unpin get away only calling it for the stale case, and the other log item implementations completely without it I suspect the answer lies in xfs_trans_free_items opencoding the call to xfs_trans_del_item, thus avoiding any leak of log item descriptors or log items on the transaction list. By adding the call of xfs_trans_del_item to xfs_trans_uncommit we thus skip the calls to IOP_UNLOCK for dirty log items, which is a large change in behaviour for the existing log items that didn't have the xfs_trans_del_item calls, and at least for the dquot and inode items seems incorrect. From david@fromorbit.com Tue Jan 25 22:34:21 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0Q4YK4O114092 for ; Tue, 25 Jan 2011 22:34:21 -0600 X-ASG-Debug-ID: 1296016602-513101140000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 21E891A2B3DE for ; Tue, 25 Jan 2011 20:36:43 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id RaEIQbfjWUDhaJaE for ; Tue, 25 Jan 2011 20:36:43 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: At8EALszP015LN5mgWdsb2JhbACkchYBARYiJLo7DYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail04.adl6.internode.on.net with ESMTP; 26 Jan 2011 15:06:41 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Phx7Y-0005xG-9O; Wed, 26 Jan 2011 15:36:40 +1100 Date: Wed, 26 Jan 2011 15:36:40 +1100 From: Dave Chinner To: Stan Hoeppner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: version dependency question Subject: Re: version dependency question Message-ID: <20110126043640.GA21311@dastard> References: <4D3F5DA4.3070809@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D3F5DA4.3070809@hardwarefreak.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1296016604 X-Barracuda-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.53459 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, Jan 25, 2011 at 05:32:52PM -0600, Stan Hoeppner wrote: > Is the delaylog fstab mount option dependent on anything external to the kernel, > such as the mount command, or xfsprogs? Do these need to be updated to take > advantage of '-o delaylog'? No, it's purely a kernel thing... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bklsmail@yahoo.com.au Wed Jan 26 05:41:44 2011 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_50,FREEMAIL_FROM, T_DKIM_INVALID,T_FILL_THIS_FORM_SHORT,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 p0QBfiFa138332 for ; Wed, 26 Jan 2011 05:41:44 -0600 X-ASG-Debug-ID: 1296042246-45df00790000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from web62006.mail.re1.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 652E71A2F9EA for ; Wed, 26 Jan 2011 03:44:06 -0800 (PST) Received: from web62006.mail.re1.yahoo.com (web62006.mail.re1.yahoo.com [69.147.74.229]) by cuda.sgi.com with SMTP id srTaVEoORdAn1BfU for ; Wed, 26 Jan 2011 03:44:06 -0800 (PST) Received: (qmail 88859 invoked by uid 60001); 26 Jan 2011 11:44:06 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com.au; s=s1024; t=1296042246; bh=w0JPd3Q2VqKSFMt0SLe/Bw2V7I8HuwNvODEnY4iGycQ=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type:Content-Transfer-Encoding; b=E39+dCGdsntpeuWoszWjgwXYA7T9D7FiXC4LRjTAV4fRXz0CwF7ThxqdAqXQ2Mk8TNMDowWsj/dFeP6N6g1X1lSwWS5QO2dVp9gm66z2GXFYgpceN5D1RzTO+VJXqcxjMKhRJ4TXVB7RRouW+1q1il3f4yky3lIYIWp0nqkzA30= DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com.au; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type:Content-Transfer-Encoding; b=p9lg5jpKOIikACU3vViWIEs65Uj90Hh4+ysMDJdou5maoqGK0zYN923C/OcQ4S9db1VVrgudqKUV48cr5I8W7tx+me6yvzZQqC1YSr820djpuD4eh6t1P6uNzeql3QzjVbElyuJ6kOdK6hBflfT7x3GE9HtCW/vTOXMqr/JMp/k=; Message-ID: <500733.87672.qm@web62006.mail.re1.yahoo.com> X-YMail-OSG: tRgX0U8VM1lcwNMDfxXL8UXtXcVZXHZSIn3_Rd.lAGucE4P QpU7eWTPDUiIKpmO0H4SjnzfMx6S_L9ZrXpAmphgvUsoAH.11WmSFIbGtQoo ixrATLkzdTHufQVZZ1tPxkidwRtLzOkNcm3zhoawi_p_HECw6hX5BS3gczDg 3MR6e1.Ad3x2bvgpbcvnmUrYvEdkDFP9aMICD2NjEofKq0kdoqafeFCQsv_s tDCx4F596boqs2k6GzEv11xCV74I0k1NZn59oJB7T5tZSfRUhZef8zLibG5Q oXczJaOXH1m7wnkHO8odK4cVDJGf.GgUABCQi6YSzZcBlKD_i6exGgCfUbT9 nmNrHNUmE4qe7T4_QioX0xeNHHMOh1aE- Received: from [68.111.76.144] by web62006.mail.re1.yahoo.com via HTTP; Wed, 26 Jan 2011 03:44:06 PST X-Mailer: YahooMailRC/157.18 YahooMailWebService/0.8.107.285259 Date: Wed, 26 Jan 2011 03:44:06 -0800 (PST) From: Candace Ayers Reply-To: usopening@abctransportsa.net X-ASG-Orig-Subj: News from ABC: We're growing up! You're invited! Subject: News from ABC: We're growing up! You're invited! To: brenda@brendaobrien.com MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: web62006.mail.re1.yahoo.com[69.147.74.229] X-Barracuda-Start-Time: 1296042247 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2410 1.0000 -0.6192 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.62 X-Barracuda-Spam-Status: No, SCORE=-0.62 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.53487 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 Title: Management Jobs - Transportation Manager Research=0A=0ACompany: ABC = Transports SA ABCTSA=0AJob Code: TM04=0ALocations: Any US or Canada City= =0A=0AIndustries:=0AConsulting=0AWholesale=0A=0AFunctions:=0AConsulting =E2= =80=93 Management=0AWholesale: Internet=0AWholesale: Retail=0A=0ATransporta= tion Manager Research-0028173=0A =0ADescription=0AJob Summary:=0ATo help ou= r clients with their orders, to check the merchandise if needed, and to dis= patch to our clients.=0A=0AYou will possess:=0AFluent English, both spoken = and written=0AKnowledge of PC: MS Office, typing, instant messengers=0AComm= unication skills, ability to communicate freely via phone and e-mail=0A=0AP= referred Qualifications:=0AIn addition to meeting the above qualifications,= the following is preferred:=0AAge 21+=0AProactive approach to work=0Aethic= al and honest=0ADiligence=0ACustomer service oriented with exceptional inte= rpersonal skills=0A=0ACompetencies:=0AThe ABC's Competency Framework is the= foundation of our Talent Strategy and is what drives ABC performance. ABC = accordingly selects and develops talent based on each of the following comp= etencies:=0Aanalyze issues and make effective decisions, advance the busine= ss,=0AWell developed verbal communications skills=0Aengage, coach, and buil= d a diverse workforce, build partnerships,=0Aimprove service quality and pr= ocesses, execute effectively,=0Ademonstrate personal leadership, and demons= trate functional and technical agility.=0A =0AEnvironmental Conditions:=0AW= ork inside a soho - small office/home office environment.=0A=0ASafety Commi= tment:=0ASafety is a way of life at ABC, encompassing every aspect of compa= ny operations. Guided by a policy of ensuring the safety of our employees, = our customers, and the communities we serve, ABC works relentlessly to prev= ent accidents and injuries. Not only is it the right thing to do, but when= a company puts safety first, everyone benefits: the employees and their fa= milies, the customers, and the communities.=0A =0AAbout us:=0AABC Transport= s SA, an Esquire 500 company headquartered in Geneve, CH, is a multi-modal = freight transportation company serving customers across Europe. ABC also in= cludes an integrated intermodal company which serves customers with its own= truck and terminal operations as well as a dedicated international contain= er fleet. Other ABC subsidiaries provide technology and real estate support= to the company. These subsidiaries combine to allow ABC to deliver effici= ent freight alternatives to customers in a variety of industries, including= coal, chemicals, automobiles, metals, agricultural and forest products, fo= od and consumer goods. ABC Transports SA ABCTSA is the largest company in t= he ABC family employing 34,000 management and union employees. ABCTSA's pr= imary focus is the operation, maintenance, and management of the largest tr= ansportation system in the Europe.=0A =0AClosing Statement:=0AAt ABC two of= the company's core values are People Make The Difference and Safety Is A W= ay of Life. We are committed to offering our team members the most competi= tive compensation and benefits package available, unlimited opportunities f= or development and growth throughout an exciting and rewarding career, and = the safest work environment possible.=0A=0APrimary Location: New York, NY= =0ASchedule: Full-time, Part-time=0ARelocation Available: 10% -=0ATax Statu= s: Transportation Retirement=0AOvertime Status: Exempt=0AClosing Date: Feb = 20, 2011=0ANumber of Openings: 28=0A=0A_____________________________=0ACand= ace Ayers =0A=0A=0A From josef@redhat.com Wed Jan 26 08:13:33 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0QEDXK6145209 for ; Wed, 26 Jan 2011 08:13:33 -0600 X-ASG-Debug-ID: 1296051357-5ec701200000-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 ACAF48C485E for ; Wed, 26 Jan 2011 06:15:57 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sufmeDO8D7Hyr9Bo for ; Wed, 26 Jan 2011 06:15:57 -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 p0QEFuue010380 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 26 Jan 2011 09:15:56 -0500 Received: from localhost.localdomain (test1244.test.redhat.com [10.10.10.244]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p0QEFupv004930 for ; Wed, 26 Jan 2011 09:15:56 -0500 From: Josef Bacik To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] Xfstests: make 014 only run on xfs Subject: [PATCH] Xfstests: make 014 only run on xfs Date: Wed, 26 Jan 2011 09:05:29 -0500 Message-Id: <1296050729-17316-1-git-send-email-josef@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: 1296051357 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 test relies on mounting with -o allocsize, which is an xfs specific mount option, so make the test only work on xfs. Thanks, Signed-off-by: Josef Bacik --- 014 | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/014 b/014 index e6e0a6f..c6be9bd 100755 --- a/014 +++ b/014 @@ -44,7 +44,7 @@ _cleanup() . ./common.rc . ./common.filter -_supported_fs generic +_supported_fs xfs _supported_os IRIX Linux _require_sparse_files -- 1.6.6.1 From BATV+5fa688ed9254066be41a+2712+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 26 10:54:31 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0QGsVaR153019 for ; Wed, 26 Jan 2011 10:54:31 -0600 X-ASG-Debug-ID: 1296061015-203b013c0000-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 AB3D4294920 for ; Wed, 26 Jan 2011 08:56:55 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id APU41NXFDNhpcxbX for ; Wed, 26 Jan 2011 08:56:55 -0800 (PST) X-ASG-Whitelist: Client X-ASG-Whitelist: Barracuda Reputation Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Pi8fu-0007rJ-RO; Wed, 26 Jan 2011 16:56:54 +0000 Date: Wed, 26 Jan 2011 11:56:54 -0500 From: Christoph Hellwig To: Josef Bacik Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Xfstests: make 014 only run on xfs Subject: Re: [PATCH] Xfstests: make 014 only run on xfs Message-ID: <20110126165654.GB27259@infradead.org> References: <1296050729-17316-1-git-send-email-josef@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1296050729-17316-1-git-send-email-josef@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: 1296061015 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, Jan 26, 2011 at 09:05:29AM -0500, Josef Bacik wrote: > This test relies on mounting with -o allocsize, which is an xfs specific mount > option, so make the test only work on xfs. Thanks, Except for the recently added option it's fine for other filesystems. Just conditionalize setting the option. From BATV+5fa688ed9254066be41a+2712+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 26 14:31:04 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0QKV1wQ162909 for ; Wed, 26 Jan 2011 14:31:04 -0600 X-ASG-Debug-ID: 1296074005-1c0402790000-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 524141A32FD1 for ; Wed, 26 Jan 2011 12:33:26 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 9xDeVFpYl0Yys1gC for ; Wed, 26 Jan 2011 12:33:26 -0800 (PST) X-ASG-Whitelist: Client X-ASG-Whitelist: Barracuda Reputation Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PiC3Q-00051l-EL; Wed, 26 Jan 2011 20:33:24 +0000 Date: Wed, 26 Jan 2011 15:33:24 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/4] xfstests: add simple splice test Subject: Re: [PATCH 1/4] xfstests: add simple splice test Message-ID: <20110126203324.GA19159@infradead.org> References: <1295927937-20634-1-git-send-email-david@fromorbit.com> <1295927937-20634-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295927937-20634-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: 1296074006 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, Jan 25, 2011 at 02:58:54PM +1100, Dave Chinner wrote: > From: Dave Chinner > > We don't have any coverage of the splice functionality provided by > the kernel in xfstests. Add a simple test that uses the sendfile > operation built into xfs_io to copy a file ensure we at least > execute the code path in xfstests. I'm pretty sure I reviewed this one before, but in case it's needed here it is again: Reviewed-by: Christoph Hellwig From BATV+5fa688ed9254066be41a+2712+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 26 14:31:37 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0QKVbte162944 for ; Wed, 26 Jan 2011 14:31:37 -0600 X-ASG-Debug-ID: 1296074041-380a03950000-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 9ECC74D5515 for ; Wed, 26 Jan 2011 12:34:01 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id NI8zLo2x2Rn91P9r for ; Wed, 26 Jan 2011 12:34:01 -0800 (PST) X-ASG-Whitelist: Client X-ASG-Whitelist: Barracuda Reputation Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PiC3z-00052f-04; Wed, 26 Jan 2011 20:33:59 +0000 Date: Wed, 26 Jan 2011 15:33:58 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/4] xfstests: add test to reproduce bmap btree corruption. Subject: Re: [PATCH 2/4] xfstests: add test to reproduce bmap btree corruption. Message-ID: <20110126203358.GB19159@infradead.org> References: <1295927937-20634-1-git-send-email-david@fromorbit.com> <1295927937-20634-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295927937-20634-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: 1296074041 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+5fa688ed9254066be41a+2712+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 26 14:32:10 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0QKWA0H162975 for ; Wed, 26 Jan 2011 14:32:10 -0600 X-ASG-Debug-ID: 1296074074-507f02830000-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 E3C02154A059 for ; Wed, 26 Jan 2011 12:34:34 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id iVuBnkJzZydPuQPw for ; Wed, 26 Jan 2011 12:34:34 -0800 (PST) X-ASG-Whitelist: Client X-ASG-Whitelist: Barracuda Reputation Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PiC4X-00053H-LO; Wed, 26 Jan 2011 20:34:33 +0000 Date: Wed, 26 Jan 2011 15:34:33 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/4] xfstests: make 016 work with delaylog Subject: Re: [PATCH 3/4] xfstests: make 016 work with delaylog Message-ID: <20110126203433.GC19159@infradead.org> References: <1295927937-20634-1-git-send-email-david@fromorbit.com> <1295927937-20634-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295927937-20634-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: 1296074074 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 > @@ -101,7 +101,9 @@ _log_traffic() > while [ $count -ge 0 ] > do > touch $out > + sync > rm $out > + sync > let "count = count - 1" > done Looks good, although it might be good to make the indentation fit the surrounding code. Reviewed-by: Christoph Hellwig From BATV+5fa688ed9254066be41a+2712+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 26 14:33:24 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0QKXNX9163025 for ; Wed, 26 Jan 2011 14:33:24 -0600 X-ASG-Debug-ID: 1296074147-510702670000-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 24B9F154A2B7 for ; Wed, 26 Jan 2011 12:35:47 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 7wC7KVISnDxYPbmI for ; Wed, 26 Jan 2011 12:35:47 -0800 (PST) X-ASG-Whitelist: Client X-ASG-Whitelist: Barracuda Reputation Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PiC5j-0005nS-G7; Wed, 26 Jan 2011 20:35:47 +0000 Date: Wed, 26 Jan 2011 15:35:47 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/4] xfstests: Speed up test 042 Subject: Re: [PATCH 4/4] xfstests: Speed up test 042 Message-ID: <20110126203547.GD19159@infradead.org> References: <1295927937-20634-1-git-send-email-david@fromorbit.com> <1295927937-20634-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1295927937-20634-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: 1296074148 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, Jan 25, 2011 at 02:58:57PM +1100, Dave Chinner wrote: > From: Dave Chinner > > test 042 generates a worst-case fragmented filesystem and uses it to > test xfs_fsr. It uses small 4k files to generate the hole-space-hole > pattern that fragments free space badly. It is much faster to > generate the same pattern by creating a single large file and > punching holes in it. Also, instead of writing large files to > create unfragmented space, just use preallocation so we don't have > to write the data to disk. > > These changes reduce the runtime of the test on a single SATA drive > from 106s to 27s. Looks good, Reviewed-by: Christoph Hellwig From aelder@sgi.com Wed Jan 26 15:20:02 2011 X-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 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 p0QLK2A8165769 for ; Wed, 26 Jan 2011 15:20:02 -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 B688A30409A; Wed, 26 Jan 2011 13:22: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); Wed, 26 Jan 2011 15:22:23 -0600 Subject: Re: [PATCH 1/8] xfs: fix log ticket leak on forced shutdown. From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1295945444-29488-2-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 26 Jan 2011 15:22:22 -0600 Message-ID: <1296076942.1980.930.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 26 Jan 2011 21:22:23.0549 (UTC) FILETIME=[1F7656D0:01CBBD9F] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-25 at 19:50 +1100, Dave Chinner wrote: > From: Dave Chinner > > The kmemleak detector shows this after test 139: > > unreferenced object 0xffff880079b88bb0 (size 264): . . . > [] generic_writepages+0x27/0x30 > [] xfs_vm_writepages+0x5d/0x80 > > By inspection, the leak occurs when xlog_write() returns and error > and we jump to the abort path without dropping the reference on the > active ticket. > > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder From aelder@sgi.com Wed Jan 26 15:20:10 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0QLKAPV165787 for ; Wed, 26 Jan 2011 15:20:10 -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 1F2AA3040A4; Wed, 26 Jan 2011 13:22:35 -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, 26 Jan 2011 15:22:35 -0600 Subject: Re: [PATCH 2/8] xfs: fix efi item leak on forced shutdown From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1295945444-29488-3-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-3-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 26 Jan 2011 15:22:34 -0600 Message-ID: <1296076954.1980.939.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 26 Jan 2011 21:22:35.0190 (UTC) FILETIME=[26669D60:01CBBD9F] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-25 at 19:50 +1100, Dave Chinner wrote: > From: Dave Chinner > > After test 139, kmemleak shows: > > unreferenced object 0xffff880078b405d8 (size 400): > comm "xfs_io", pid 4904, jiffies 4294909383 (age 1186.728s) > hex dump (first 32 bytes): . . . > > The cause of the leak is that the "remove" parameter of IOP_UNPIN() > is never set when a CIL push is aborted. This means that the EFI > item is never freed if it was in the push being cancelled. The > problem is specific to delayed logging. > > Signed-off-by: Dave Chinner Like Christoph, I was a bit confused about xfs_buf_item_unpin() retaining the call to xfs_trans_del_item(). They all ought to be done consistently. Hopefully you can straighten that out. Two other minor comments: I'd prefer that an explicit "1" be passed to IOP_UNPIN() rather than the variable "aborted" (which is known to have non-zero value) in xfs_trans_committed_bulk(). And there are some long-lined comments right near what you're changing that you could touch up while you're at it. > --- > fs/xfs/xfs_extfree_item.c | 1 - > fs/xfs/xfs_trans.c | 35 ++++++++++++++++++++++++++++++----- > 2 files changed, 30 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c . . . > @@ -1472,6 +1480,16 @@ xfs_trans_committed_bulk( > if (XFS_LSN_CMP(item_lsn, (xfs_lsn_t)-1) == 0) > continue; > > + /* > + * if we are aborting the operation, no point in inserting the > + * object into the AIL as we are in a shutdown situation. > + */ > + if (aborted) { > + ASSERT(XFS_FORCED_SHUTDOWN(ailp->xa_mount)); > + IOP_UNPIN(lip, aborted); Here ^^^ > + continue; > + } > + > if (item_lsn != commit_lsn) { > > /* From aelder@sgi.com Wed Jan 26 15:20:20 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0QLKKT9165808 for ; Wed, 26 Jan 2011 15:20: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 E683FAC003; Wed, 26 Jan 2011 13:22:41 -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, 26 Jan 2011 15:22:41 -0600 Subject: Re: [PATCH 3/8] xfs: speculative delayed allocation uses rounddown_power_of_2 badly From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1295945444-29488-4-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-4-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 26 Jan 2011 15:22:41 -0600 Message-ID: <1296076961.1980.940.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 26 Jan 2011 21:22:41.0690 (UTC) FILETIME=[2A466FA0:01CBBD9F] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-25 at 19:50 +1100, Dave Chinner wrote: > From: Dave Chinner > > rounddown_power_of_2() returns an undefined result when passed a > value of zero. The specualtive delayed allocation code is doing this > when the inode is zero length. Hence occasionally the preallocation > is much, much larger than is necessary (e.g. 8GB for a 270 _byte_ > file). Ensure we don't even pass a zero value to this function so > the result of preallocation is always the desired size. > > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig Looks good. Reviewed-by: Alex Elder From aelder@sgi.com Wed Jan 26 15:20:26 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0QLKQgk165826 for ; Wed, 26 Jan 2011 15:20:26 -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 9E73BAC00C; Wed, 26 Jan 2011 13:22: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); Wed, 26 Jan 2011 15:22:48 -0600 Subject: Re: [PATCH 4/8] xfs: limit extent length for allocation to AG size From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1295945444-29488-5-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-5-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 26 Jan 2011 15:22:48 -0600 Message-ID: <1296076968.1980.941.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 26 Jan 2011 21:22:48.0659 (UTC) FILETIME=[2E6DD230:01CBBD9F] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-25 at 19:50 +1100, Dave Chinner wrote: > From: Dave Chinner > > Delayed allocation extents can be larger than AGs, so when trying to > convert a large range we may scan every AG inside > xfs_bmap_alloc_nullfb() trying to find an AG with a size larger than > an AG. We should stop when we find the first AG with a maximum > possible allocation size. This causes excessive CPU usage when there > are lots of AGs. > > The same problem occurs when doing preallocation of a range larger > than an AG. > > Fix the problem by limiting real allocation lengths to the maximum > that an AG can support. This means if we have empty AGs, we'll stop > the search at the first of them. If there are no empty AGs, we'll > still scan them all, but that is a different problem.... Maybe I'm wrong but I think you need to change a "+" to a "-" (shown below). And I have a few really minor suggestions: - You should update a comment (which I point out below) to match your change. - Maybe make use of a local variable, at least in xfs_bmap_btalloc_nullfb(), such as: xfs_extlen_t requested = args->maxlen; Otherwise it looks good to me. Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig > --- > fs/xfs/xfs_alloc.h | 16 ++++++++++++++++ > fs/xfs/xfs_bmap.c | 16 +++++++++------- > 2 files changed, 25 insertions(+), 7 deletions(-) > > diff --git a/fs/xfs/xfs_alloc.h b/fs/xfs/xfs_alloc.h > index 0ab56b3..6ad45b9 100644 > --- a/fs/xfs/xfs_alloc.h > +++ b/fs/xfs/xfs_alloc.h > @@ -75,6 +75,22 @@ typedef unsigned int xfs_alloctype_t; > #define XFS_ALLOC_SET_ASIDE(mp) (4 + ((mp)->m_sb.sb_agcount * 4)) > > /* > + * When deciding how much space to allocate out of an AG, we limit the > + * allocation maximum size to the size the AG. However, we cannot use all the > + * blocks in the AG - some are permanently used by metadata. These > + * blocks are generally: > + * - the AG superblock, AGF, AGI and AGFL > + * - the AGF (bno and cnt) and AGI btree root blocks > + * - 4 blocks on the AGFL according to XFS_ALLOC_SET_ASIDE() limits > + * > + * The AG headers are sector sized, so the amount of space they take up is > + * dependent on filesystem geometry. The others are all single blocks. > + */ > +#define XFS_ALLOC_AG_MAX_USABLE(mp) \ > + ((mp)->m_sb.sb_agblocks - XFS_BB_TO_FSB(mp, XFS_FSS_TO_BB(mp, 4)) + 7) Is this right? Shouldn't the 7 be subtracted (or combined using parentheses with the 4 FS sectors)? > + > + > +/* > * Argument structure for xfs_alloc routines. > * This is turned into a structure to avoid having 20 arguments passed > * down several levels of the stack. > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 4111cd3..74861c6 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c . . . > @@ -2498,14 +2498,14 @@ xfs_bmap_btalloc_nullfb( > * If the best seen length is less than the request > * length, use the best as the minimum. > */ > - else if (*blen < ap->alen) > + else if (*blen < args->maxlen) > args->minlen = *blen; > /* > * Otherwise we've seen an extent as big as alen, Ought to adjust this comment to better reflect your updated code ("alen" doesn't really fit any more). > * use that as the minimum. > */ > else > - args->minlen = ap->alen; > + args->minlen = args->maxlen; > > /* > * set the failure fallback case to look in the selected From aelder@sgi.com Wed Jan 26 15:20:34 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0QLKYR5165849 for ; Wed, 26 Jan 2011 15:20:34 -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 DA4558F8092; Wed, 26 Jan 2011 13:22:55 -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, 26 Jan 2011 15:22:55 -0600 Subject: Re: [PATCH 5/8] xfs: prevent extsize alignment from exceeding maximum extent size From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1295945444-29488-6-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-6-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 26 Jan 2011 15:22:55 -0600 Message-ID: <1296076975.1980.942.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 26 Jan 2011 21:22:55.0909 (UTC) FILETIME=[32C01550:01CBBD9F] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-25 at 19:50 +1100, Dave Chinner wrote: > From: Dave Chinner > > When doing delayed allocation, if the allocation size is for a > maximally sized extent, extent size alignment can push it over this > limit. This results in an assert failure in xfs_bmbt_set_allf() as > the extent length is too large to find in the extent record. > > Fix this by ensuring that we allow for space that extent size > alignment requires (up to 2 * (extsize -1) blocks as we have to > handle both head and tail alignment) when limiting the maximum size > of the extent. I think this is OK, however... It seems to me that the XFS_FILBLKS_MIN() call you're making is sort of magical because it pre-supposes exactly what the following xfs_bmap_extsize_align() actually does. And because of that, I would rather see that logic built into xfs_bmap_extsize_align() itself. I haven't looked at it closely, but I presume the other two spots that call xfs_bmap_extsize_align() would be subject to the same MAXEXTLEN limit. OK with me if you disagree though. Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_bmap.c | 10 ++++++++++ > 1 files changed, 10 insertions(+), 0 deletions(-) From aelder@sgi.com Wed Jan 26 15:20:38 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0QLKcP4165864 for ; Wed, 26 Jan 2011 15:20:38 -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 22FF48F808E; Wed, 26 Jan 2011 13:23: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, 26 Jan 2011 15:23:03 -0600 Subject: Re: [PATCH 6/8] xfs: limit extsize to size of AGs and/or MAXEXTLEN From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1295945444-29488-7-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-7-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 26 Jan 2011 15:23:02 -0600 Message-ID: <1296076982.1980.943.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: quoted-printable X-OriginalArrivalTime: 26 Jan 2011 21:23:03.0159 (UTC) FILETIME=[37125870:01CBBD9F] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-25 at 19:50 +1100, Dave Chinner wrote: > From: Dave Chinner >=20 > The extent size hint can be set to larger than an AG. This means > that the alignment process can push the range to be allocated > outside the bounds of the AG, resulting in assert failures or > corrupted bmbt records. Similarly, if the extsize is larger than the > maximum extent size supported, the alignment process will produce > extents that are too large to fit into the bmbt records, resulting > in a different type of assert/corruption failure. >=20 > Fix this by limiting extsize at the time =D1=96t is set firstly to be > less than MAXEXTLEN, then to be a maximum of half the size of the > AGs in the filesystem for non-realtime inodes. Realtime inodes do > not allocate out of AGs, so don't have to be restricted by the size > of AGs. Looks good. Reviewed-by: Alex Elder > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig From aelder@sgi.com Wed Jan 26 15:20:45 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0QLKj0e165884 for ; Wed, 26 Jan 2011 15:20:45 -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 9B7368F8084; Wed, 26 Jan 2011 13:23:09 -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, 26 Jan 2011 15:23:09 -0600 Subject: Re: [PATCH 7/8] xfs: handle CIl transaction commit failures correctly From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1295945444-29488-8-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-8-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 26 Jan 2011 15:23:09 -0600 Message-ID: <1296076989.1980.944.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 26 Jan 2011 21:23:09.0706 (UTC) FILETIME=[3AF956A0:01CBBD9F] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-25 at 19:50 +1100, Dave Chinner wrote: > From: Dave Chinner > > Failure to commit a transaction into the CIL is not handled > correctly. This currently can only happen when racing with a > shutdown and requires an explicit shutdown check, so it rare and can > be avoided. Remove the shutdown check and make the CIL commit a void > function to indicate it will always succeed, thereby removing the > incorrectly handled failure case. > > Signed-off-by: Dave Chinner Looks good. Reviewed-by: Alex Elder From aelder@sgi.com Wed Jan 26 15:20:53 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0QLKr9g165903 for ; Wed, 26 Jan 2011 15:20:53 -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 D0EC930409A; Wed, 26 Jan 2011 13:23:17 -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, 26 Jan 2011 15:23:17 -0600 Subject: Re: [PATCH 8/8] xfs: fix dquot shaker deadlock From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1295945444-29488-9-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-9-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 26 Jan 2011 15:23:17 -0600 Message-ID: <1296076997.1980.945.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 26 Jan 2011 21:23:17.0925 (UTC) FILETIME=[3FDF7550:01CBBD9F] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-25 at 19:50 +1100, Dave Chinner wrote: > From: Dave Chinner > > Commit 368e136 ("xfs: remove duplicate code from dquot reclaim") fails > to unlock the dquot freelist when the number of loop restarts is > exceeded in xfs_qm_dqreclaim_one(). This causes hangs in memory > reclaim. Remove the bogus loop exit check that causes the problem. > > Reported-by: Malcolm Scott > Signed-off-by: Dave Chinner > --- > fs/xfs/quota/xfs_qm.c | 2 -- > 1 files changed, 0 insertions(+), 2 deletions(-) I see what Christoph means about the double-increment of restart in the case where qi_dqlist_lock is not acquired. That ought to be fixed. I also agree with his suggested loop termination condition change. Also, restarts is pre-incremented in the XFS_DQ_WANT case at the top, but post-incremented elsewhere for some reason. I think they all ought to be the same. -Alex From aelder@sgi.com Wed Jan 26 15:21:04 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0QLL48q165925 for ; Wed, 26 Jan 2011 15:21:04 -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 EB77D30409A; Wed, 26 Jan 2011 13:23: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, 26 Jan 2011 15:23:28 -0600 Subject: Re: [PATCH 0/8] xfs: 2.6.38-rc candidate fixes V2 From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1295945444-29488-1-git-send-email-david@fromorbit.com> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 26 Jan 2011 15:23:28 -0600 Message-ID: <1296077008.1980.947.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 26 Jan 2011 21:23:29.0019 (UTC) FILETIME=[467C44B0:01CBBD9F] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2011-01-25 at 19:50 +1100, Dave Chinner wrote: > These are all the pending 2.6.38-rc candidate fixes I have in my queue. After looking this latest series over I think these are ready to go: [1/8] xfs: fix log ticket leak on forced shutdown [3/8] xfs: speculative delayed allocation uses rounddown_power_of_2 badly [6/8] xfs: limit extsize to size of AGs and/or MAXEXTLEN [7/8] xfs: handle CIl transaction commit failures correctly The next two are marked reviewed by Christoph, but I have made a few minor suggestions for you to consider. One is ready to go, the other may be but you need to verify it. Changes--if any--would be minor, to make them ready: [4/8] xfs: limit extent length for allocation to AG size [5/8] xfs: prevent extsize alignment from exceeding maximum extent size These last two appear to need a small bit of work. [2/8] xfs: fix efi item leak on forced shutdown [8/8] xfs: fix dquot shaker deadlock I don't expect it will take much time to fix these, but if you want I could take the ones that are ready right away, without waiting for the rest to get completed. Let me know how you want me to handle it. Unless I hear otherwise I'm awaiting pull requests from you on reviewed patches. -Alex From david@fromorbit.com Wed Jan 26 18:33:05 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R0X4MB174589 for ; Wed, 26 Jan 2011 18:33:05 -0600 X-ASG-Debug-ID: 1296088526-0b2b02a90000-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 A3F444D5F70 for ; Wed, 26 Jan 2011 16:35:26 -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 qaAfr6ggREEYec8g for ; Wed, 26 Jan 2011 16:35:26 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArkEAKJKQE15LN5mgWdsb2JhbACkehYBARYiJLxNDYJtglUE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 11:05:25 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PiFpb-0007wA-Q4; Thu, 27 Jan 2011 11:35:23 +1100 Date: Thu, 27 Jan 2011 11:35:23 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/8] xfs: fix efi item leak on forced shutdown Subject: Re: [PATCH 2/8] xfs: fix efi item leak on forced shutdown Message-ID: <20110127003523.GB21311@dastard> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-3-git-send-email-david@fromorbit.com> <20110125235354.GA3832@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110125235354.GA3832@infradead.org> 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: 1296088528 X-Barracuda-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.53539 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, Jan 25, 2011 at 06:53:54PM -0500, Christoph Hellwig wrote: > On Tue, Jan 25, 2011 at 07:50:38PM +1100, Dave Chinner wrote: > > diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c > > index 75f2ef6..effbb41 100644 > > --- a/fs/xfs/xfs_extfree_item.c > > +++ b/fs/xfs/xfs_extfree_item.c > > @@ -138,7 +138,6 @@ xfs_efi_item_unpin( > > > > if (remove) { > > ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); > > - xfs_trans_del_item(lip); > > xfs_efi_item_free(efip); > > return; > > } > > > STATIC void > > xfs_trans_uncommit( > > struct xfs_trans *tp, > > uint flags) > > { > > - struct xfs_log_item_desc *lidp; > > + struct xfs_log_item_desc *lidp, *n; > > > > - list_for_each_entry(lidp, &tp->t_items, lid_trans) { > > + list_for_each_entry_safe(lidp, n, &tp->t_items, lid_trans) { > > /* > > * Unpin all but those that aren't dirty. > > */ > > - if (lidp->lid_flags & XFS_LID_DIRTY) > > + if (lidp->lid_flags & XFS_LID_DIRTY) { > > + xfs_trans_del_item(lidp->lid_item); > > IOP_UNPIN(lidp->lid_item, 1); > > + } > > This part of the patch isn't explained in the changelog, and I suspect > it should be a separate patch from the addition of the IOP_UNPIN with > remove call to the CIL error path. Doing xfs_trans_del_item() inside IOP_UNPIN() during CIl commit faliure processing causes a panic - there is not descriptior or trransaction attached to the item at that point. Hence it is simply not safe to call IOP_UNPIN(aborted) from outside a transaction context if we allow xfs_trans_del_item() to be run inside the IOP_UNPIN() call. Further, if we do xfs_trans_del_item() inside the IOP_UNPIN(aborted) path, we corrupt the list walk in xfs_trans_uncommit() case. Hence it needs to be an list_for_each_entry_safe() walk, and must do explicit removal of the item from the transaction because the item can be freed in IOP_UNPIN(aborted). > Moving the xfs_trans_del_item from the IOP_UNPIN implementation into > the caller seems sane to me, but: > > - why is the call to xfs_trans_del_item left in xfs_buf_item_unpin Because I didn't notice it. It never triggers in the xfs_trans_uncommit() case as there are two references on the buf item - one for the pin, and one for the lock. We call IOP_UNPIN() first, so it never goes down the (freed && stale) path in this case. As to why it hasn't triggered from a iclog write completion or CIL checkpoint failure after the IOP_UNLOCK() has been run and dropped that reference - just luck I guess.... > - why did xfs_buf_item_unpin get away only calling it for the stale > case, and the other log item implementations completely without > it The stale buffer case is special - it has a different lifecycle to all other buffer items (and all other log item types, for that matter). Basically a stale buffer never enters the AIL on transaction commit, so on the last reference going away it needs to be freed rather than continuing to live while being tracked in the AIL. > I suspect the answer lies in xfs_trans_free_items opencoding the > call to xfs_trans_del_item, thus avoiding any leak of log item > descriptors or log items on the transaction list. Actually, I don't think it does handle this case - we've already removed all the dirty items from the transaction, so it appears to me like they just get leaked. > By adding the > call of xfs_trans_del_item to xfs_trans_uncommit we thus skip > the calls to IOP_UNLOCK for dirty log items, which is a large > change in behaviour for the existing log items that didn't have > the xfs_trans_del_item calls, and at least for the dquot and > inode items seems incorrect. You are right, it does break xfs_trans_free_items() and the way it calls IOP_UNLOCK(). I'm surprised that it didn't cause any noticable leaks of locked buffers.... ---- Effectively, we've got a situation where we need to allow xfs_trans_del_item() to be called in IOP_UNPIN(aborted) iff there is a log item descriptor attached to the log item. That requires xfs_trans_uncommit() to do a safe list traversal and both the efi and buf items to check for a valid lidp before calling xfs_trans_del_item(). I'll change the fix and commment it better in the code and changelog. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Jan 26 18:36:31 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R0aU20174705 for ; Wed, 26 Jan 2011 18:36:31 -0600 X-ASG-Debug-ID: 1296088733-342a02770000-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 0477C1A354C6 for ; Wed, 26 Jan 2011 16:38:54 -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 bdIgaYwPlM3MERtz for ; Wed, 26 Jan 2011 16:38:54 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArkEAKJKQE15LN5mgWdsb2JhbACkehYBARYiJLxNDYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 11:08:53 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PiFsy-0007wa-24; Thu, 27 Jan 2011 11:38:52 +1100 Date: Thu, 27 Jan 2011 11:38:52 +1100 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/8] xfs: limit extent length for allocation to AG size Subject: Re: [PATCH 4/8] xfs: limit extent length for allocation to AG size Message-ID: <20110127003851.GC21311@dastard> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-5-git-send-email-david@fromorbit.com> <1296076968.1980.941.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1296076968.1980.941.camel@doink> 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: 1296088735 X-Barracuda-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.53539 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, Jan 26, 2011 at 03:22:48PM -0600, Alex Elder wrote: > On Tue, 2011-01-25 at 19:50 +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > Delayed allocation extents can be larger than AGs, so when trying to > > convert a large range we may scan every AG inside > > xfs_bmap_alloc_nullfb() trying to find an AG with a size larger than > > an AG. We should stop when we find the first AG with a maximum > > possible allocation size. This causes excessive CPU usage when there > > are lots of AGs. > > > > The same problem occurs when doing preallocation of a range larger > > than an AG. > > > > Fix the problem by limiting real allocation lengths to the maximum > > that an AG can support. This means if we have empty AGs, we'll stop > > the search at the first of them. If there are no empty AGs, we'll > > still scan them all, but that is a different problem.... > > Maybe I'm wrong but I think you need to change a "+" > to a "-" (shown below). Good catch. That's what I get for cleaning up code ;) > > And I have a few really minor suggestions: > - You should update a comment (which I point > out below) to match your change. Will fix. > - Maybe make use of a local variable, at least > in xfs_bmap_btalloc_nullfb(), such as: > xfs_extlen_t requested = args->maxlen; All the allocation code is coded that way to avoid putting local variables on the stack. The allocation-in-writeback path is the critical stack usage path in XFS, so I'd prefer to keep using args->maxlen here.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Jan 26 18:48:24 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R0mObA175205 for ; Wed, 26 Jan 2011 18:48:24 -0600 X-ASG-Debug-ID: 1296089446-6fb301a70000-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 BE2D08CA5AC for ; Wed, 26 Jan 2011 16:50:47 -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 AM2LCAv5FFxqaKtP for ; Wed, 26 Jan 2011 16:50:47 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArkEADVOQE15LN5mgWdsb2JhbACkehYBARYiJLxHDYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 11:20:46 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PiG4T-0007xt-BY; Thu, 27 Jan 2011 11:50:45 +1100 Date: Thu, 27 Jan 2011 11:50:45 +1100 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/8] xfs: prevent extsize alignment from exceeding maximum extent size Subject: Re: [PATCH 5/8] xfs: prevent extsize alignment from exceeding maximum extent size Message-ID: <20110127005045.GD21311@dastard> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-6-git-send-email-david@fromorbit.com> <1296076975.1980.942.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1296076975.1980.942.camel@doink> 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: 1296089448 X-Barracuda-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.53540 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, Jan 26, 2011 at 03:22:55PM -0600, Alex Elder wrote: > On Tue, 2011-01-25 at 19:50 +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > When doing delayed allocation, if the allocation size is for a > > maximally sized extent, extent size alignment can push it over this > > limit. This results in an assert failure in xfs_bmbt_set_allf() as > > the extent length is too large to find in the extent record. > > > > Fix this by ensuring that we allow for space that extent size > > alignment requires (up to 2 * (extsize -1) blocks as we have to > > handle both head and tail alignment) when limiting the maximum size > > of the extent. > > I think this is OK, however... > > It seems to me that the XFS_FILBLKS_MIN() call you're making is > sort of magical because it pre-supposes exactly what the following > xfs_bmap_extsize_align() actually does. Sure, but that is not a big deal because we know exactly what xfs_bmap_extsize_align() does and we control it directly. I plan to completely remove the extsize alignment from the delalloc path anyway, so this is really just a fix for the given bug, not a long term solution. > And because of that, I > would rather see that logic built into xfs_bmap_extsize_align() > itself. Possibly.... > I haven't looked at it closely, but I presume the other > two spots that call xfs_bmap_extsize_align() would be subject to > the same MAXEXTLEN limit. .... but it doesn't matter for those callers as they already limit the length of the allocation after alignment to something valid. The problem is that the delayed allocation path has none of the same limits on the extent length that other callers have, so the fix is only needed for the delayed allocation path. > OK with me if you disagree though. Yes, I disagree, but it's still a very good question. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Jan 26 18:57:26 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R0vPii175499 for ; Wed, 26 Jan 2011 18:57:25 -0600 X-ASG-Debug-ID: 1296089987-7c0701620000-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 E82688CAF5B for ; Wed, 26 Jan 2011 16:59:47 -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 idHDrPZXIOGg09qv for ; Wed, 26 Jan 2011 16:59:47 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArkEALBRQE15LN5mgWdsb2JhbACkehYBARYiJLxFDYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 11:29:46 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PiGDB-0007yw-Mt; Thu, 27 Jan 2011 11:59:45 +1100 Date: Thu, 27 Jan 2011 11:59:45 +1100 From: Dave Chinner To: Josef Bacik Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Xfstests: make 014 only run on xfs Subject: Re: [PATCH] Xfstests: make 014 only run on xfs Message-ID: <20110127005945.GE21311@dastard> References: <1296050729-17316-1-git-send-email-josef@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1296050729-17316-1-git-send-email-josef@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: 1296089989 X-Barracuda-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.53540 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, Jan 26, 2011 at 09:05:29AM -0500, Josef Bacik wrote: > This test relies on mounting with -o allocsize, which is an xfs specific mount > option, so make the test only work on xfs. Thanks, Oh, sorry, my fault. Perhaps something like this instead? Cheers, Dave. -- Dave Chinner david@fromorbit.com xfstests: conditionalise allocsize option in 014 allocsize is an XFS specific mount option, and hence causes the test to fail on other filesystems. Only set the mount option on xfs filesystems. Signed-off-by: Dave Chinner --- 014 | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/014 b/014 index e6e0a6f..057e4d9 100755 --- a/014 +++ b/014 @@ -53,8 +53,10 @@ _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 +if [ "$FSTYP" == "xfs" ]; then + umount $TEST_DIR + _test_mount -o allocsize=64k +fi echo "brevity is wit..." From david@fromorbit.com Wed Jan 26 19:52:00 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R1q0Q9178538 for ; Wed, 26 Jan 2011 19:52:00 -0600 X-ASG-Debug-ID: 1296093262-1bdf014e0000-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 C6A3F1A358B6 for ; Wed, 26 Jan 2011 17:54:22 -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 JEDj6fjVUZxEaEn0 for ; Wed, 26 Jan 2011 17:54:22 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArkEADZcQE15LN5mgWdsb2JhbACkexYBARYiJK5hjWsNhUIE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 12:24:21 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PiH40-00084a-Ho; Thu, 27 Jan 2011 12:54:20 +1100 Date: Thu, 27 Jan 2011 12:54:20 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 8/8] xfs: fix dquot shaker deadlock Subject: Re: [PATCH 8/8] xfs: fix dquot shaker deadlock Message-ID: <20110127015420.GF21311@dastard> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-9-git-send-email-david@fromorbit.com> <20110125095242.GB23990@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110125095242.GB23990@infradead.org> 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: 1296093263 X-Barracuda-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.53545 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, Jan 25, 2011 at 04:52:42AM -0500, Christoph Hellwig wrote: > On Tue, Jan 25, 2011 at 07:50:44PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > Commit 368e136 ("xfs: remove duplicate code from dquot reclaim") fails > > to unlock the dquot freelist when the number of loop restarts is > > exceeded in xfs_qm_dqreclaim_one(). This causes hangs in memory > > reclaim. Remove the bogus loop exit check that causes the problem. > > The fix looks correct, but it's a bit inconsequential about when > to adhere the retry limit and when not. Shouldn't we just turn the > exit condition into: > > if (dqout || restarts >= XFS_QM_RECLAIM_MAX_RESTARTS) > break; I'm guessing that you are suggesting changing the code increments and checks restarts to: restarts++; goto startagain; otherwise this doesn't make sense as restarts will never go above XFS_QM_RECLAIM_MAX_RESTARTS at this point in the loop. Even so, I don't think this is a good idea, because it means we have to get to the end of the loop before we check restarts for loop termination. Given that the restarts is counting the number of times we fail to get locks, encounter dquots that are being recycled, etc, this would render then restart counter ineffective as a method of determining whether we are making progress or not. Hence I think that simply removing the check that I did is the correct fix. > also the failure to acquite qi_dqlist_lock increments the restart > count twice, which was also added in the same commit. I'll fix that, though. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Jan 26 20:21:43 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R2LhSb179980 for ; Wed, 26 Jan 2011 20:21:43 -0600 X-ASG-Debug-ID: 1296095046-1c2302790000-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 BBA201A386E3 for ; Wed, 26 Jan 2011 18:24:06 -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 molWRzVFCx191dA8 for ; Wed, 26 Jan 2011 18:24:06 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArkEAD9jQE15LN5mgWdsb2JhbACkfRYBARYiJLw8DYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 12:54:05 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PiHWm-00087S-Lx; Thu, 27 Jan 2011 13:24:04 +1100 Date: Thu, 27 Jan 2011 13:24:04 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 8/8] xfs: fix dquot shaker deadlock Subject: Re: [PATCH 8/8] xfs: fix dquot shaker deadlock Message-ID: <20110127022404.GG21311@dastard> References: <1295945444-29488-1-git-send-email-david@fromorbit.com> <1295945444-29488-9-git-send-email-david@fromorbit.com> <20110125095242.GB23990@infradead.org> <20110127015420.GF21311@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110127015420.GF21311@dastard> 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: 1296095047 X-Barracuda-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.53547 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, Jan 27, 2011 at 12:54:20PM +1100, Dave Chinner wrote: > On Tue, Jan 25, 2011 at 04:52:42AM -0500, Christoph Hellwig wrote: > > On Tue, Jan 25, 2011 at 07:50:44PM +1100, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > Commit 368e136 ("xfs: remove duplicate code from dquot reclaim") fails > > > to unlock the dquot freelist when the number of loop restarts is > > > exceeded in xfs_qm_dqreclaim_one(). This causes hangs in memory > > > reclaim. Remove the bogus loop exit check that causes the problem. > > > > The fix looks correct, but it's a bit inconsequential about when > > to adhere the retry limit and when not. Shouldn't we just turn the > > exit condition into: > > > > if (dqout || restarts >= XFS_QM_RECLAIM_MAX_RESTARTS) > > break; > > I'm guessing that you are suggesting changing the code increments > and checks restarts to: > > restarts++; > goto startagain; > > otherwise this doesn't make sense as restarts will never go above > XFS_QM_RECLAIM_MAX_RESTARTS at this point in the loop. Argh, there's one loop case where it does increment restarts without jumping to startagain. I'm going to change this loop to stack the loop exit cases rather than do them all individually and making it difficult to work out what is going on. So each case will increment restarts itself as necessary, set a "startagain" flag if a loop restart is required, and set dqpout if a successful reclaim occurred. That way each case can then jump to the correctly stacked unlock point and all the loop exit logic is in one place. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Jan 26 21:27:53 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R3RqcW183358 for ; Wed, 26 Jan 2011 21:27:53 -0600 X-ASG-Debug-ID: 1296099014-56da02910000-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 E1058148F393 for ; Wed, 26 Jan 2011 19:30:14 -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 6N625qkLrTfpkOe2 for ; Wed, 26 Jan 2011 19:30:14 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArkEANx0QE15LN5mgWdsb2JhbACkfBYBARYiJLwIDYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 14:00:13 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PiIYl-0008Cy-NQ; Thu, 27 Jan 2011 14:30:11 +1100 Date: Thu, 27 Jan 2011 14:30:11 +1100 From: Dave Chinner To: Mark Lord Cc: Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount Message-ID: <20110127033011.GH21311@dastard> References: <4D40C8D1.8090202@teksavvy.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D40C8D1.8090202@teksavvy.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: 1296099015 X-Barracuda-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.53550 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 [Please cc xfs@oss.sgi.com on XFS bug reports. Added.] On Wed, Jan 26, 2011 at 08:22:25PM -0500, Mark Lord wrote: > Alex / Christoph, > > My mythtv box here uses XFS on a 2TB drive for storing recordings and videos. > It is behaving rather strangely though, and has gotten worse recently. > Here is what I see happening: > > The drive mounts fine at boot, but the very first attempt to write a new file > to the filesystem suffers from a very very long pause, 30-60 seconds, during which > time the disk activity light is fully "on". Please post the output of xfs_info so we can see what you filesystem configuration is. > This happens only on the first new file write after mounting. > From then on, the filesystem is fast and responsive as expected. > If I umount the filesystem, and then mount it again, > the exact same behaviour can be observed. I can't say I've seen this. Can you capture a blktrace of the IO so we can see what IO is actually being done, and perhaps also record an XFS event trace as well (i.e. of all the events in /sys/kernel/debug/tracing/events/xfs). > This of course screws up mythtv, as it causes me to lose the first 30-60 > seconds of the first recording it attempts after booting. So as a workaround > I now have a startup script to create, sync, and delete a 64MB file before > starting mythtv. This still takes 30-60 seconds, but it all happens and > finishes before mythtv has a real-time need to write to the filesystem. > > The 2TB drive is fine -- zero errors, no events in the SMART logs, > and I've disabled the silly WD head-unload logic on it. > > What's happening here? Why the big long burst of activity? > I've only just noticed this behaviour in the past few weeks, > running 2.6.35 and more recently 2.6.37. Can you be a bit more precise? what were you running before 2.6.35 when you didn't notice this? > * * * > > The other issue is something I notice at umount time. > I have a second big drive used as a backup device for the drive discussed above. > I use "mirrordir" (similar to rsync) to clone directories/files from the main > drive to the backup drive. After mirrordir finishes, I then "umount /backup". > The umount promptly hangs, disk light on solid, for 30-60 seconds, then finishes. Same again - blktrace and event traces for the different cases. Also, how many files are you syncing? how much data, number of inodes, etc... > If I type "sync" just before doing the umount, sync takes about 1 second, > and the umount finishes instantly. > > Huh? What's happening there? Sounds like something is broken w.r.t. writeback during unmount. Perhaps also adding the writeback events to the trace would help understand what is happening here.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Jan 26 21:40:56 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R3eum9183780 for ; Wed, 26 Jan 2011 21:40:56 -0600 X-ASG-Debug-ID: 1296099799-6c3b01b40000-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 8E4401A35D74 for ; Wed, 26 Jan 2011 19:43:19 -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 Ue5zuSecgkWpfbI6 for ; Wed, 26 Jan 2011 19:43:19 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0EAFd4QE15LN5mgWdsb2JhbACkexYBARYiJLt/DYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 14:13:17 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PiIlP-0008EF-3C; Thu, 27 Jan 2011 14:43:15 +1100 Date: Thu, 27 Jan 2011 14:43:14 +1100 From: Dave Chinner To: Mark Lord Cc: Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount Message-ID: <20110127034314.GI21311@dastard> References: <4D40C8D1.8090202@teksavvy.com> <4D40CDCF.4010301@teksavvy.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D40CDCF.4010301@teksavvy.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: 1296099800 X-Barracuda-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.53551 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, Jan 26, 2011 at 08:43:43PM -0500, Mark Lord wrote: > On 11-01-26 08:22 PM, Mark Lord wrote: > > Alex / Christoph, > > > > My mythtv box here uses XFS on a 2TB drive for storing recordings and videos. > > It is behaving rather strangely though, and has gotten worse recently. > > Here is what I see happening: > > > > The drive mounts fine at boot, but the very first attempt to write a new file > > to the filesystem suffers from a very very long pause, 30-60 seconds, during which > > time the disk activity light is fully "on". > > > > This happens only on the first new file write after mounting. > >>From then on, the filesystem is fast and responsive as expected. > > If I umount the filesystem, and then mount it again, > > the exact same behaviour can be observed. > > > > This of course screws up mythtv, as it causes me to lose the first 30-60 > > seconds of the first recording it attempts after booting. So as a workaround > > I now have a startup script to create, sync, and delete a 64MB file before > > starting mythtv. This still takes 30-60 seconds, but it all happens and > > finishes before mythtv has a real-time need to write to the filesystem. > > > > The 2TB drive is fine -- zero errors, no events in the SMART logs, > > and I've disabled the silly WD head-unload logic on it. > > > > What's happening here? Why the big long burst of activity? > > I've only just noticed this behaviour in the past few weeks, > > running 2.6.35 and more recently 2.6.37. > > > > * * * > > > > The other issue is something I notice at umount time. > > I have a second big drive used as a backup device for the drive discussed above. > > I use "mirrordir" (similar to rsync) to clone directories/files from the main > > drive to the backup drive. After mirrordir finishes, I then "umount /backup". > > The umount promptly hangs, disk light on solid, for 30-60 seconds, then finishes. > > > > If I type "sync" just before doing the umount, sync takes about 1 second, > > and the umount finishes instantly. > > > > Huh? What's happening there? > > > > System is running 2.6.37 from kernel.org, but similar behaviour > > has been there under 2.6.35 and 2.6.34. Dunno about earlier. > > > > I can query any info you need from the filesystem. > > > Thinking about it some more: the first problem very much appears as if > it is due to a filesystem check happening on the already-mounted filesystem, > if that makes any kind of sense (?). Not to me. You can check this simply by looking at the output of top while the problem is occurring... > Because.. running xfs_check on the umounted drive takes about the same 30-60 > seconds, > with the disk activity light fully "on". Well, yeah - XFS check reads all the metadata in the filesystem, so of course it's going to thrash your disk when it is run. The fact it takes the same length of time as whatever problem you are having is likely to be coincidental. > The other thought that came to mind: this behaviour has only been > noticed recently, probably because I have recently added about > 1000 new files (hundreds of MB each) to the videos/ directory on > that filesystem. Whereas before, it had fewer than 500 (multi-GB) > files in total. > > So if it really is doing some kind of internal filesystem check, > then the time required has only recently become 3X larger than > before.. so the behaviour may not be new/recent, but now is very > noticeable. Where does that 3x figure come from? Have you measured it? If so, what are the numbers? Cheers, Dave. -- Dave Chinner david@fromorbit.com From kernel@teksavvy.com Wed Jan 26 21:46:41 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R3kfdG184031 for ; Wed, 26 Jan 2011 21:46:41 -0600 X-ASG-Debug-ID: 1296100144-7eea01d00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ironport2-out.pppoe.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5B1BE105D30D for ; Wed, 26 Jan 2011 19:49:04 -0800 (PST) Received: from ironport2-out.pppoe.ca (ironport2-out.teksavvy.com [206.248.154.181]) by cuda.sgi.com with ESMTP id 9EoXuXJaHE93GvzL for ; Wed, 26 Jan 2011 19:49:04 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApIBAL55QE1Ld/sX/2dsb2JhbAAMhAjMcpBogSODOHQEhRg X-IronPort-AV: E=Sophos;i="4.60,384,1291611600"; d="scan'208";a="89378351" Received: from rtr.ca (HELO [10.0.0.6]) ([75.119.251.23]) by ironport2-out.pppoe.ca with ESMTP/TLS/DHE-RSA-CAMELLIA256-SHA; 26 Jan 2011 22:49:03 -0500 Message-ID: <4D40EB2F.2050809@teksavvy.com> Date: Wed, 26 Jan 2011 22:49:03 -0500 From: Mark Lord User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Dave Chinner CC: Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> In-Reply-To: <20110127033011.GH21311@dastard> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ironport2-out.teksavvy.com[206.248.154.181] X-Barracuda-Start-Time: 1296100145 X-Barracuda-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.53552 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 11-01-26 10:30 PM, Dave Chinner wrote: > [Please cc xfs@oss.sgi.com on XFS bug reports. Added.] > > On Wed, Jan 26, 2011 at 08:22:25PM -0500, Mark Lord wrote: >> Alex / Christoph, >> >> My mythtv box here uses XFS on a 2TB drive for storing recordings and videos. >> It is behaving rather strangely though, and has gotten worse recently. >> Here is what I see happening: >> >> The drive mounts fine at boot, but the very first attempt to write a new file >> to the filesystem suffers from a very very long pause, 30-60 seconds, during which >> time the disk activity light is fully "on". > > Please post the output of xfs_info so we can see what you > filesystem configuration is. /dev/sdb1 on /var/lib/mythtv type xfs (rw,noatime,allocsize=64M,logbufs=8,largeio) [~] xfs_info /var/lib/mythtv meta-data=/dev/sdb1 isize=256 agcount=7453, agsize=65536 blks = sectsz=512 attr=2 data = bsize=4096 blocks=488378638, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=32768, version=2 = sectsz=512 sunit=0 blks, lazy-count=0 realtime =none extsz=4096 blocks=0, rtextents=0 >> This happens only on the first new file write after mounting. >> From then on, the filesystem is fast and responsive as expected. >> If I umount the filesystem, and then mount it again, >> the exact same behaviour can be observed. > > I can't say I've seen this. Can you capture a blktrace of the IO so > we can see what IO is actually being done, and perhaps also record > an XFS event trace as well (i.e. of all the events in > /sys/kernel/debug/tracing/events/xfs). I'll have to reconfig/rebuild the kernel to include support for blktrace first. Can you specify the exact commands/args you'd like for running blktrace etc? >> This of course screws up mythtv, as it causes me to lose the first 30-60 >> seconds of the first recording it attempts after booting. So as a workaround >> I now have a startup script to create, sync, and delete a 64MB file before >> starting mythtv. This still takes 30-60 seconds, but it all happens and >> finishes before mythtv has a real-time need to write to the filesystem. >> >> The 2TB drive is fine -- zero errors, no events in the SMART logs, >> and I've disabled the silly WD head-unload logic on it. >> >> What's happening here? Why the big long burst of activity? >> I've only just noticed this behaviour in the past few weeks, >> running 2.6.35 and more recently 2.6.37. > > Can you be a bit more precise? what were you running before 2.6.35 > when you didn't notice this? Those details are in my earlier follow-up posting. >> The other issue is something I notice at umount time. I'm going to let that issue rest for now, until we figure out the first issue. Heck, they might even be the exact same thing.. :) Thanks! From kernel@teksavvy.com Wed Jan 26 21:50:54 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R3orgM184346 for ; Wed, 26 Jan 2011 21:50:54 -0600 X-ASG-Debug-ID: 1296100398-0c7a00770000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ironport2-out.pppoe.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4B44C1A2AB4F for ; Wed, 26 Jan 2011 19:53:18 -0800 (PST) Received: from ironport2-out.pppoe.ca (ironport2-out.teksavvy.com [206.248.154.181]) by cuda.sgi.com with ESMTP id jrbanKVwZ3ydWzFx for ; Wed, 26 Jan 2011 19:53:18 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApIBAOp6QE1Ld/sX/2dsb2JhbAAMhAjMc5BogSODOHQEhRg X-IronPort-AV: E=Sophos;i="4.60,384,1291611600"; d="scan'208";a="89378518" Received: from rtr.ca (HELO [10.0.0.6]) ([75.119.251.23]) by ironport2-out.pppoe.ca with ESMTP/TLS/DHE-RSA-CAMELLIA256-SHA; 26 Jan 2011 22:53:17 -0500 Message-ID: <4D40EC2D.5020507@teksavvy.com> Date: Wed, 26 Jan 2011 22:53:17 -0500 From: Mark Lord User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Dave Chinner CC: Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount References: <4D40C8D1.8090202@teksavvy.com> <4D40CDCF.4010301@teksavvy.com> <20110127034314.GI21311@dastard> In-Reply-To: <20110127034314.GI21311@dastard> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ironport2-out.teksavvy.com[206.248.154.181] X-Barracuda-Start-Time: 1296100398 X-Barracuda-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.53553 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 11-01-26 10:43 PM, Dave Chinner wrote: > On Wed, Jan 26, 2011 at 08:43:43PM -0500, Mark Lord wrote: >> On 11-01-26 08:22 PM, Mark Lord wrote: .. >> Thinking about it some more: the first problem very much appears as if >> it is due to a filesystem check happening on the already-mounted filesystem, >> if that makes any kind of sense (?). > > Not to me. You can check this simply by looking at the output of > top while the problem is occurring... Top doesn't show anything interesting, since disk I/O uses practically zero CPU. >> running xfs_check on the umounted drive takes about the same 30-60 seconds, >> with the disk activity light fully "on". > > Well, yeah - XFS check reads all the metadata in the filesystem, so > of course it's going to thrash your disk when it is run. The fact it > takes the same length of time as whatever problem you are having is > likely to be coincidental. I find it interesting that the mount takes zero-time, as if it never actually reads much from the filesystem. Something has to eventually read the metadata etc. >> The other thought that came to mind: this behaviour has only been >> noticed recently, probably because I have recently added about >> 1000 new files (hundreds of MB each) to the videos/ directory on >> that filesystem. Whereas before, it had fewer than 500 (multi-GB) >> files in total. >> >> So if it really is doing some kind of internal filesystem check, >> then the time required has only recently become 3X larger than >> before.. so the behaviour may not be new/recent, but now is very >> noticeable. > > Where does that 3x figure come from? Well, it used to have about 500 files/subdirs on it, and now it has somewhat over 1500 files/subdirs. That's a ballpark estimate of 3X the amount of meta data. All of these files are at least large (hundreds of MB), and a lot are huge (many GB) in size. Cheers From dave@fromorbit.com Wed Jan 26 21:53:37 2011 X-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 p0R3rbI6184529 for ; Wed, 26 Jan 2011 21:53:37 -0600 X-ASG-Debug-ID: 1296100559-0dda00fa0000-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 454E1105D4B7 for ; Wed, 26 Jan 2011 19:56:00 -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 GhP1Z6K1uTdktI4S for ; Wed, 26 Jan 2011 19:56:00 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvYEANt7QE15LN5mgWdsb2JhbACWYI4bFgEBFiIku3+FTwQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 14:25:59 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PiIxh-0008FC-Kf for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:55:57 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PiIvE-0004T1-Pd for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:53:24 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/8] xfs: fix log ticket leak on forced shutdown. Subject: [PATCH 1/8] xfs: fix log ticket leak on forced shutdown. Date: Thu, 27 Jan 2011 14:53:14 +1100 Message-Id: <1296100401-17135-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1296100401-17135-1-git-send-email-david@fromorbit.com> References: <1296100401-17135-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1296100561 X-Barracuda-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.53552 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 kmemleak detector shows this after test 139: unreferenced object 0xffff880079b88bb0 (size 264): comm "xfs_io", pid 4904, jiffies 4294909382 (age 276.824s) hex dump (first 32 bytes): 00 00 00 00 ad 4e ad de ff ff ff ff 00 00 00 00 .....N.......... ff ff ff ff ff ff ff ff 48 7b c9 82 ff ff ff ff ........H{...... backtrace: [] kmemleak_alloc+0x2d/0x60 [] kmem_cache_alloc+0x13f/0x2b0 [] kmem_zone_alloc+0x77/0xf0 [] kmem_zone_zalloc+0x1e/0x50 [] xlog_ticket_alloc+0x34/0x170 [] xlog_cil_push+0xa4/0x3f0 [] xlog_cil_force_lsn+0x15a/0x160 [] _xfs_log_force_lsn+0x75/0x2d0 [] _xfs_trans_commit+0x2bd/0x2f0 [] xfs_iomap_write_allocate+0x1ad/0x350 [] xfs_map_blocks+0x21f/0x370 [] xfs_vm_writepage+0x1c7/0x550 [] __writepage+0x1a/0x50 [] write_cache_pages+0x1c2/0x4c0 [] generic_writepages+0x27/0x30 [] xfs_vm_writepages+0x5d/0x80 By inspection, the leak occurs when xlog_write() returns and error and we jump to the abort path without dropping the reference on the active ticket. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder --- fs/xfs/xfs_log_cil.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 9dc8125..c7eac5a 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -543,7 +543,7 @@ xlog_cil_push( error = xlog_write(log, &lvhdr, tic, &ctx->start_lsn, NULL, 0); if (error) - goto out_abort; + goto out_abort_free_ticket; /* * now that we've written the checkpoint into the log, strictly @@ -569,8 +569,9 @@ restart: } spin_unlock(&cil->xc_cil_lock); + /* xfs_log_done always frees the ticket on error. */ commit_lsn = xfs_log_done(log->l_mp, tic, &commit_iclog, 0); - if (error || commit_lsn == -1) + if (commit_lsn == -1) goto out_abort; /* attach all the transactions w/ busy extents to iclog */ @@ -600,6 +601,8 @@ out_free_ticket: kmem_free(new_ctx); return 0; +out_abort_free_ticket: + xfs_log_ticket_put(tic); out_abort: xlog_cil_committed(ctx, XFS_LI_ABORTED); return XFS_ERROR(EIO); -- 1.7.2.3 From dave@fromorbit.com Wed Jan 26 21:53:39 2011 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 p0R3rcUC184541 for ; Wed, 26 Jan 2011 21:53:38 -0600 X-ASG-Debug-ID: 1296100559-0dda00fa0001-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 90BD3105D4B7 for ; Wed, 26 Jan 2011 19:56:01 -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 0DuTra4uhVnkIkJm for ; Wed, 26 Jan 2011 19:56:01 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0EANt7QE15LN5mgWdsb2JhbACkexYBARYiJLt/gnuCVAQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 14:26:00 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PiIxi-0008FW-Ai for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:55:58 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PiIvF-0004TL-SR for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:53:25 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 8/8] xfs: fix dquot shaker deadlock Subject: [PATCH 8/8] xfs: fix dquot shaker deadlock Date: Thu, 27 Jan 2011 14:53:21 +1100 Message-Id: <1296100401-17135-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1296100401-17135-1-git-send-email-david@fromorbit.com> References: <1296100401-17135-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1296100562 X-Barracuda-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.53552 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 Commit 368e136 ("xfs: remove duplicate code from dquot reclaim") fails to unlock the dquot freelist when the number of loop restarts is exceeded in xfs_qm_dqreclaim_one(). This causes hangs in memory reclaim. Remove the bogus loop exit check that causes the problem. Reported-by: Malcolm Scott Signed-off-by: Dave Chinner --- fs/xfs/quota/xfs_qm.c | 46 +++++++++++++++++++++------------------------- 1 files changed, 21 insertions(+), 25 deletions(-) diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index f8e854b..206a281 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -1863,12 +1863,14 @@ xfs_qm_dqreclaim_one(void) xfs_dquot_t *dqpout; xfs_dquot_t *dqp; int restarts; + int startagain; restarts = 0; dqpout = NULL; /* lockorder: hashchainlock, freelistlock, mplistlock, dqlock, dqflock */ -startagain: +again: + startagain = 0; mutex_lock(&xfs_Gqm->qm_dqfrlist_lock); list_for_each_entry(dqp, &xfs_Gqm->qm_dqfrlist, q_freelist) { @@ -1885,13 +1887,10 @@ startagain: ASSERT(! (dqp->dq_flags & XFS_DQ_INACTIVE)); trace_xfs_dqreclaim_want(dqp); - - xfs_dqunlock(dqp); - mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); - if (++restarts >= XFS_QM_RECLAIM_MAX_RESTARTS) - return NULL; XQM_STATS_INC(xqmstats.xs_qm_dqwants); - goto startagain; + restarts++; + startagain = 1; + goto dqunlock; } /* @@ -1906,23 +1905,20 @@ startagain: ASSERT(list_empty(&dqp->q_mplist)); list_del_init(&dqp->q_freelist); xfs_Gqm->qm_dqfrlist_cnt--; - xfs_dqunlock(dqp); dqpout = dqp; XQM_STATS_INC(xqmstats.xs_qm_dqinact_reclaims); - break; + goto dqunlock; } ASSERT(dqp->q_hash); ASSERT(!list_empty(&dqp->q_mplist)); /* - * Try to grab the flush lock. If this dquot is in the process of - * getting flushed to disk, we don't want to reclaim it. + * Try to grab the flush lock. If this dquot is in the process + * of getting flushed to disk, we don't want to reclaim it. */ - if (!xfs_dqflock_nowait(dqp)) { - xfs_dqunlock(dqp); - continue; - } + if (!xfs_dqflock_nowait(dqp)) + goto dqunlock; /* * We have the flush lock so we know that this is not in the @@ -1944,8 +1940,7 @@ startagain: xfs_fs_cmn_err(CE_WARN, mp, "xfs_qm_dqreclaim: dquot %p flush failed", dqp); } - xfs_dqunlock(dqp); /* dqflush unlocks dqflock */ - continue; + goto dqunlock; } /* @@ -1967,13 +1962,8 @@ startagain: */ if (!mutex_trylock(&mp->m_quotainfo->qi_dqlist_lock)) { restarts++; - mutex_unlock(&dqp->q_hash->qh_lock); - xfs_dqfunlock(dqp); - xfs_dqunlock(dqp); - mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); - if (restarts++ >= XFS_QM_RECLAIM_MAX_RESTARTS) - return NULL; - goto startagain; + startagain = 1; + goto qhunlock; } ASSERT(dqp->q_nrefs == 0); @@ -1986,14 +1976,20 @@ startagain: xfs_Gqm->qm_dqfrlist_cnt--; dqpout = dqp; mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock); +qhunlock: mutex_unlock(&dqp->q_hash->qh_lock); dqfunlock: xfs_dqfunlock(dqp); +dqunlock: xfs_dqunlock(dqp); if (dqpout) break; if (restarts >= XFS_QM_RECLAIM_MAX_RESTARTS) - return NULL; + break; + if (startagain) { + mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); + goto again; + } } mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); return dqpout; -- 1.7.2.3 From dave@fromorbit.com Wed Jan 26 21:53:39 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R3rdrl184554 for ; Wed, 26 Jan 2011 21:53:39 -0600 X-ASG-Debug-ID: 1296100561-379f02810000-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 7BE1E2922CC for ; Wed, 26 Jan 2011 19:56:01 -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 RE1WEUUI3Ikf2aRI for ; Wed, 26 Jan 2011 19:56:01 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0EANt7QE15LN5mgWdsb2JhbACkexYBARYiJLt/hU8E Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 14:25:59 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PiIxh-0008FD-P3 for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:55:57 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PiIvE-0004T3-WE for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:53:24 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/8] xfs: fix efi item leak on forced shutdown Subject: [PATCH 2/8] xfs: fix efi item leak on forced shutdown Date: Thu, 27 Jan 2011 14:53:15 +1100 Message-Id: <1296100401-17135-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1296100401-17135-1-git-send-email-david@fromorbit.com> References: <1296100401-17135-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1296100563 X-Barracuda-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.53553 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 After test 139, kmemleak shows: unreferenced object 0xffff880078b405d8 (size 400): comm "xfs_io", pid 4904, jiffies 4294909383 (age 1186.728s) hex dump (first 32 bytes): 60 c1 17 79 00 88 ff ff 60 c1 17 79 00 88 ff ff `..y....`..y.... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ backtrace: [] kmemleak_alloc+0x2d/0x60 [] kmem_cache_alloc+0x13f/0x2b0 [] kmem_zone_alloc+0x77/0xf0 [] kmem_zone_zalloc+0x1e/0x50 [] xfs_efi_init+0x4b/0xb0 [] xfs_trans_get_efi+0x58/0x90 [] xfs_bmap_finish+0x8b/0x1d0 [] xfs_itruncate_finish+0x2c4/0x5d0 [] xfs_setattr+0x8df/0xa70 [] xfs_vn_setattr+0x1b/0x20 [] notify_change+0x170/0x2e0 [] do_truncate+0x66/0xa0 [] sys_ftruncate+0xdb/0xe0 [] system_call_fastpath+0x16/0x1b [] 0xffffffffffffffff The cause of the leak is that the "remove" parameter of IOP_UNPIN() is never set when a CIL push is aborted. This means that the EFI item is never freed if it was in the push being cancelled. The problem is specific to delayed logging, but has uncovered a couple of problems with the handling of IOP_UNPIN(remove). Firstly, we cannot safely call xfs_trans_del_item() from IOP_UNPIN() in the CIL commit failure path or the iclog write failure path because for delayed loging we have no transaction context. Hence we must only call xfs_trans_del_item() if the log item being unpinned has an active log item descriptor. Secondly, xfs_trans_uncommit() does not handle log item descriptor freeing during the traversal of log items on a transaction. It can reference a freed log item descriptor when unpinning an EFI item. Hence it needs to use a safe list traversal method to allow items to be removed from the transaction during IOP_UNPIN(). Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf_item.c | 12 +++++++----- fs/xfs/xfs_extfree_item.c | 3 ++- fs/xfs/xfs_trans.c | 36 +++++++++++++++++++++++++++++------- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 98c6f73..6f8c21c 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -427,13 +427,15 @@ xfs_buf_item_unpin( if (remove) { /* - * We have to remove the log item from the transaction - * as we are about to release our reference to the - * buffer. If we don't, the unlock that occurs later - * in xfs_trans_uncommit() will ry to reference the + * If we are in a transaction context, we have to + * remove the log item from the transaction as we are + * about to release our reference to the buffer. If we + * don't, the unlock that occurs later in + * xfs_trans_uncommit() will try to reference the * buffer which we no longer have a hold on. */ - xfs_trans_del_item(lip); + if (lip->li_desc) + xfs_trans_del_item(lip); /* * Since the transaction no longer refers to the buffer, diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index 75f2ef6..d22e626 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -138,7 +138,8 @@ xfs_efi_item_unpin( if (remove) { ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); - xfs_trans_del_item(lip); + if (lip->li_desc) + xfs_trans_del_item(lip); xfs_efi_item_free(efip); return; } diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 33dbc4e..29f5e54 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1446,6 +1446,14 @@ xfs_log_item_batch_insert( * 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. + * + * If we are called with the aborted flag set, it is because a log write during + * a CIL checkpoint commit has failed. In this case, all the items in the + * checkpoint have already gone through IOP_COMMITED and IOP_UNLOCK, which + * means that checkpoint commit abort handling is treated exactly the same + * as an iclog write error even though we haven't started any IO yet. Hence in + * this case all we need to do is IOP_COMMITTED processing, followed by an + * IOP_UNPIN(aborted) call. */ void xfs_trans_committed_bulk( @@ -1472,6 +1480,16 @@ xfs_trans_committed_bulk( if (XFS_LSN_CMP(item_lsn, (xfs_lsn_t)-1) == 0) continue; + /* + * if we are aborting the operation, no point in inserting the + * object into the AIL as we are in a shutdown situation. + */ + if (aborted) { + ASSERT(XFS_FORCED_SHUTDOWN(ailp->xa_mount)); + IOP_UNPIN(lip, 1); + continue; + } + if (item_lsn != commit_lsn) { /* @@ -1503,20 +1521,24 @@ xfs_trans_committed_bulk( } /* - * Called from the trans_commit code when we notice that - * the filesystem is in the middle of a forced shutdown. + * Called from the trans_commit code when we notice that the filesystem is in + * the middle of a forced shutdown. + * + * When we are called here, we have already pinned all the items in the + * transaction. However, neither IOP_COMMITTING or IOP_UNLOCK has been called + * so we can simply walk the items in the transaction, unpin them with an abort + * flag and then free the items. Note that unpinning the items can result in + * them being freed immediately, so we need to use a safe list traversal method + * here. */ STATIC void xfs_trans_uncommit( struct xfs_trans *tp, uint flags) { - struct xfs_log_item_desc *lidp; + struct xfs_log_item_desc *lidp, *n; - list_for_each_entry(lidp, &tp->t_items, lid_trans) { - /* - * Unpin all but those that aren't dirty. - */ + list_for_each_entry_safe(lidp, n, &tp->t_items, lid_trans) { if (lidp->lid_flags & XFS_LID_DIRTY) IOP_UNPIN(lidp->lid_item, 1); } -- 1.7.2.3 From dave@fromorbit.com Wed Jan 26 21:53:47 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R3rlGc184581 for ; Wed, 26 Jan 2011 21:53:47 -0600 X-ASG-Debug-ID: 1296100569-4e9e03ae0000-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 868D91A2AB3C for ; Wed, 26 Jan 2011 19:56:10 -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 VU6aJaTXhVgc7Cmu for ; Wed, 26 Jan 2011 19:56:10 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvYEANt7QE15LN5mgWdsb2JhbACWYI4bFgEBFiIku3+FTwSSEQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 14:26:09 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PiIxh-0008FF-Sv for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:55:57 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PiIvF-0004T6-6D for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:53:25 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/8] xfs: speculative delayed allocation uses rounddown_power_of_2 badly Subject: [PATCH 3/8] xfs: speculative delayed allocation uses rounddown_power_of_2 badly Date: Thu, 27 Jan 2011 14:53:16 +1100 Message-Id: <1296100401-17135-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1296100401-17135-1-git-send-email-david@fromorbit.com> References: <1296100401-17135-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1296100571 X-Barracuda-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.53553 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 rounddown_power_of_2() returns an undefined result when passed a value of zero. The specualtive delayed allocation code is doing this when the inode is zero length. Hence occasionally the preallocation is much, much larger than is necessary (e.g. 8GB for a 270 _byte_ file). Ensure we don't even pass a zero value to this function so the result of preallocation is always the desired size. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder --- fs/xfs/xfs_iomap.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 55582bd..8a0f044 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -337,7 +337,12 @@ xfs_iomap_prealloc_size( int shift = 0; int64_t freesp; - alloc_blocks = XFS_B_TO_FSB(mp, ip->i_size); + /* + * rounddown_pow_of_two() returns an undefined result + * if we pass in alloc_blocks = 0. Hence the "+ 1" to + * ensure we always pass in a non-zero value. + */ + alloc_blocks = XFS_B_TO_FSB(mp, ip->i_size) + 1; alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, rounddown_pow_of_two(alloc_blocks)); -- 1.7.2.3 From dave@fromorbit.com Wed Jan 26 21:53:48 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R3rmBE184589 for ; Wed, 26 Jan 2011 21:53:48 -0600 X-ASG-Debug-ID: 1296100569-4e9e03ae0001-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 9F83B1A2ABA7 for ; Wed, 26 Jan 2011 19:56:11 -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 lHDueKlsdvlGCwEs for ; Wed, 26 Jan 2011 19:56:11 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvYEANt7QE15LN5mgWdsb2JhbACWYI4bFgEBFiIku3+FTwQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 14:26:09 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PiIxh-0008FB-GV for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:55:57 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PiIvE-0004Sz-Jj for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:53:24 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/8] xfs: candidate 2.6.38-rc fixes V3 Subject: [PATCH 0/8] xfs: candidate 2.6.38-rc fixes V3 Date: Thu, 27 Jan 2011 14:53:13 +1100 Message-Id: <1296100401-17135-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1296100572 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3040 1.0000 -0.3311 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.33 X-Barracuda-Spam-Status: No, SCORE=-0.33 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.53553 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 Fixed the various issues found during review and added all the reviewed-by tags to the fully reviewed commits. From dave@fromorbit.com Wed Jan 26 21:53:49 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R3rnH3184597 for ; Wed, 26 Jan 2011 21:53:49 -0600 X-ASG-Debug-ID: 1296100572-452401830000-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 8393C2922D0 for ; Wed, 26 Jan 2011 19:56:12 -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 WasPg5ZzaSDeUfFE for ; Wed, 26 Jan 2011 19:56:12 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvgEANt7QE15LN5mgWdsb2JhbACEFJJMjhsWAQEWIiSrF5BogSODOHQE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 14:26:10 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PiIxs-0008Fa-2L for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:56:08 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PiIvF-0004TF-LJ for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:53:25 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 6/8] xfs: limit extsize to size of AGs and/or MAXEXTLEN Subject: [PATCH 6/8] xfs: limit extsize to size of AGs and/or MAXEXTLEN Date: Thu, 27 Jan 2011 14:53:19 +1100 Message-Id: <1296100401-17135-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1296100401-17135-1-git-send-email-david@fromorbit.com> References: <1296100401-17135-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: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1296100573 X-Barracuda-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.53553 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 extent size hint can be set to larger than an AG. This means that the alignment process can push the range to be allocated outside the bounds of the AG, resulting in assert failures or corrupted bmbt records. Similarly, if the extsize is larger than the maximum extent size supported, the alignment process will produce extents that are too large to fit into the bmbt records, resulting in a different type of assert/corruption failure. Fix this by limiting extsize at the time Ñ–t is set firstly to be less than MAXEXTLEN, then to be a maximum of half the size of the AGs in the filesystem for non-realtime inodes. Realtime inodes do not allocate out of AGs, so don't have to be restricted by the size of AGs. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder --- fs/xfs/linux-2.6/xfs_ioctl.c | 20 ++++++++++++++++++-- 1 files changed, 18 insertions(+), 2 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index b06ede1..f5e2a19 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -985,10 +985,22 @@ xfs_ioctl_setattr( /* * Extent size must be a multiple of the appropriate block - * size, if set at all. + * size, if set at all. It must also be smaller than the + * maximum extent size supported by the filesystem. + * + * Also, for non-realtime files, limit the extent size hint to + * half the size of the AGs in the filesystem so alignment + * doesn't result in extents larger than an AG. */ if (fa->fsx_extsize != 0) { - xfs_extlen_t size; + xfs_extlen_t size; + xfs_fsblock_t extsize_fsb; + + extsize_fsb = XFS_B_TO_FSB(mp, fa->fsx_extsize); + if (extsize_fsb > MAXEXTLEN) { + code = XFS_ERROR(EINVAL); + goto error_return; + } if (XFS_IS_REALTIME_INODE(ip) || ((mask & FSX_XFLAGS) && @@ -997,6 +1009,10 @@ xfs_ioctl_setattr( mp->m_sb.sb_blocklog; } else { size = mp->m_sb.sb_blocksize; + if (extsize_fsb > mp->m_sb.sb_agblocks / 2) { + code = XFS_ERROR(EINVAL); + goto error_return; + } } if (fa->fsx_extsize % size) { -- 1.7.2.3 From dave@fromorbit.com Wed Jan 26 21:53:49 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R3rnCQ184606 for ; Wed, 26 Jan 2011 21:53:49 -0600 X-ASG-Debug-ID: 1296100569-4e9e03ae0002-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 BF0C91A2DFE3 for ; Wed, 26 Jan 2011 19:56:12 -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 bszN7QRlyzho4GJv for ; Wed, 26 Jan 2011 19:56:12 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvYEANt7QE15LN5mgWdsb2JhbACWYI4bFgEBFiIkrhWNaoVPBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 14:26:10 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PiIxs-0008FS-6E for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:56:08 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PiIvF-0004TI-PE for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:53:25 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 7/8] xfs: handle CIl transaction commit failures correctly Subject: [PATCH 7/8] xfs: handle CIl transaction commit failures correctly Date: Thu, 27 Jan 2011 14:53:20 +1100 Message-Id: <1296100401-17135-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1296100401-17135-1-git-send-email-david@fromorbit.com> References: <1296100401-17135-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1296100573 X-Barracuda-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.53553 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 Failure to commit a transaction into the CIL is not handled correctly. This currently can only happen when racing with a shutdown and requires an explicit shutdown check, so it rare and can be avoided. Remove the shutdown check and make the CIL commit a void function to indicate it will always succeed, thereby removing the incorrectly handled failure case. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder --- fs/xfs/xfs_log.h | 2 +- fs/xfs/xfs_log_cil.c | 8 +------- fs/xfs/xfs_trans.c | 5 +---- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 916eb7d..3bd3291 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -191,7 +191,7 @@ void xfs_log_ticket_put(struct xlog_ticket *ticket); xlog_tid_t xfs_log_get_trans_ident(struct xfs_trans *tp); -int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, +void xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, struct xfs_log_vec *log_vector, xfs_lsn_t *commit_lsn, int flags); bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip); diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index c7eac5a..9ca59be 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -625,7 +625,7 @@ out_abort: * background commit, returns without it held once background commits are * allowed again. */ -int +void xfs_log_commit_cil( struct xfs_mount *mp, struct xfs_trans *tp, @@ -640,11 +640,6 @@ xfs_log_commit_cil( if (flags & XFS_TRANS_RELEASE_LOG_RES) log_flags = XFS_LOG_REL_PERM_RESERV; - if (XLOG_FORCED_SHUTDOWN(log)) { - xlog_cil_free_logvec(log_vector); - return XFS_ERROR(EIO); - } - /* * do all the hard work of formatting items (including memory * allocation) outside the CIL context lock. This prevents stalling CIL @@ -704,7 +699,6 @@ xfs_log_commit_cil( */ if (push) xlog_cil_push(log, 0); - return 0; } /* diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 29f5e54..7692279 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1755,7 +1755,6 @@ xfs_trans_commit_cil( int flags) { struct xfs_log_vec *log_vector; - int error; /* * Get each log item to allocate a vector structure for @@ -1766,9 +1765,7 @@ xfs_trans_commit_cil( if (!log_vector) return ENOMEM; - error = xfs_log_commit_cil(mp, tp, log_vector, commit_lsn, flags); - if (error) - return error; + xfs_log_commit_cil(mp, tp, log_vector, commit_lsn, flags); current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); xfs_trans_free(tp); -- 1.7.2.3 From dave@fromorbit.com Wed Jan 26 21:53:50 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R3roLM184616 for ; Wed, 26 Jan 2011 21:53:50 -0600 X-ASG-Debug-ID: 1296100573-424e02030000-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 832482922D3 for ; Wed, 26 Jan 2011 19:56:13 -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 F5GHQo0UyDTnvknW for ; Wed, 26 Jan 2011 19:56:13 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvYEANt7QE15LN5mgWdsb2JhbACWYI4bFgEBFiIku3+FTwQ Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 14:26:10 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PiIxi-0008FL-37 for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:55:58 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PiIvF-0004TC-Gk for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:53:25 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 5/8] xfs: prevent extsize alignment from exceeding maximum extent size Subject: [PATCH 5/8] xfs: prevent extsize alignment from exceeding maximum extent size Date: Thu, 27 Jan 2011 14:53:18 +1100 Message-Id: <1296100401-17135-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1296100401-17135-1-git-send-email-david@fromorbit.com> References: <1296100401-17135-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1296100574 X-Barracuda-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.53553 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 doing delayed allocation, if the allocation size is for a maximally sized extent, extent size alignment can push it over this limit. This results in an assert failure in xfs_bmbt_set_allf() as the extent length is too large to find in the extent record. Fix this by ensuring that we allow for space that extent size alignment requires (up to 2 * (extsize -1) blocks as we have to handle both head and tail alignment) when limiting the maximum size of the extent. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder --- fs/xfs/xfs_bmap.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index f3a3768..3e9c278 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -4487,6 +4487,16 @@ xfs_bmapi( /* Figure out the extent size, adjust alen */ extsz = xfs_get_extsz_hint(ip); if (extsz) { + /* + * make sure we don't exceed a single + * extent length when we align the + * extent by reducing length we are + * going to allocate by the maximum + * amount extent size aligment may + * require. + */ + alen = XFS_FILBLKS_MIN(len, + MAXEXTLEN - (2 * extsz - 1)); error = xfs_bmap_extsize_align(mp, &got, &prev, extsz, rt, eof, -- 1.7.2.3 From dave@fromorbit.com Wed Jan 26 21:53:53 2011 X-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_46 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 p0R3rqZN184635 for ; Wed, 26 Jan 2011 21:53:52 -0600 X-ASG-Debug-ID: 1296100573-424e02030001-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 6FEE02922D5 for ; Wed, 26 Jan 2011 19:56:15 -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 2ABq0MVi2YB3iXSo for ; Wed, 26 Jan 2011 19:56:15 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0EANt7QE15LN5mgWdsb2JhbACkexYBARYiJLt/hU8E Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Jan 2011 14:26:15 +1030 Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PiIxi-0008FH-0D for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:55:58 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PiIvF-0004T9-Bi for xfs@oss.sgi.com; Thu, 27 Jan 2011 14:53:25 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/8] xfs: limit extent length for allocation to AG size Subject: [PATCH 4/8] xfs: limit extent length for allocation to AG size Date: Thu, 27 Jan 2011 14:53:17 +1100 Message-Id: <1296100401-17135-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1296100401-17135-1-git-send-email-david@fromorbit.com> References: <1296100401-17135-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1296100576 X-Barracuda-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.53553 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 Delayed allocation extents can be larger than AGs, so when trying to convert a large range we may scan every AG inside xfs_bmap_alloc_nullfb() trying to find an AG with a size larger than an AG. We should stop when we find the first AG with a maximum possible allocation size. This causes excessive CPU usage when there are lots of AGs. The same problem occurs when doing preallocation of a range larger than an AG. Fix the problem by limiting real allocation lengths to the maximum that an AG can support. This means if we have empty AGs, we'll stop the search at the first of them. If there are no empty AGs, we'll still scan them all, but that is a different problem.... Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder --- fs/xfs/xfs_alloc.h | 16 ++++++++++++++++ fs/xfs/xfs_bmap.c | 18 ++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_alloc.h b/fs/xfs/xfs_alloc.h index 0ab56b3..d0b3bc7 100644 --- a/fs/xfs/xfs_alloc.h +++ b/fs/xfs/xfs_alloc.h @@ -75,6 +75,22 @@ typedef unsigned int xfs_alloctype_t; #define XFS_ALLOC_SET_ASIDE(mp) (4 + ((mp)->m_sb.sb_agcount * 4)) /* + * When deciding how much space to allocate out of an AG, we limit the + * allocation maximum size to the size the AG. However, we cannot use all the + * blocks in the AG - some are permanently used by metadata. These + * blocks are generally: + * - the AG superblock, AGF, AGI and AGFL + * - the AGF (bno and cnt) and AGI btree root blocks + * - 4 blocks on the AGFL according to XFS_ALLOC_SET_ASIDE() limits + * + * The AG headers are sector sized, so the amount of space they take up is + * dependent on filesystem geometry. The others are all single blocks. + */ +#define XFS_ALLOC_AG_MAX_USABLE(mp) \ + ((mp)->m_sb.sb_agblocks - XFS_BB_TO_FSB(mp, XFS_FSS_TO_BB(mp, 4)) - 7) + + +/* * Argument structure for xfs_alloc routines. * This is turned into a structure to avoid having 20 arguments passed * down several levels of the stack. diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 4111cd3..f3a3768 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -2430,7 +2430,7 @@ xfs_bmap_btalloc_nullfb( startag = ag = 0; pag = xfs_perag_get(mp, ag); - while (*blen < ap->alen) { + while (*blen < args->maxlen) { if (!pag->pagf_init) { error = xfs_alloc_pagf_init(mp, args->tp, ag, XFS_ALLOC_FLAG_TRYLOCK); @@ -2452,7 +2452,7 @@ xfs_bmap_btalloc_nullfb( notinit = 1; if (xfs_inode_is_filestream(ap->ip)) { - if (*blen >= ap->alen) + if (*blen >= args->maxlen) break; if (ap->userdata) { @@ -2498,14 +2498,14 @@ xfs_bmap_btalloc_nullfb( * If the best seen length is less than the request * length, use the best as the minimum. */ - else if (*blen < ap->alen) + else if (*blen < args->maxlen) args->minlen = *blen; /* - * Otherwise we've seen an extent as big as alen, + * Otherwise we've seen an extent as big as maxlen, * use that as the minimum. */ else - args->minlen = ap->alen; + args->minlen = args->maxlen; /* * set the failure fallback case to look in the selected @@ -2573,7 +2573,9 @@ xfs_bmap_btalloc( args.tp = ap->tp; args.mp = mp; args.fsbno = ap->rval; - args.maxlen = MIN(ap->alen, mp->m_sb.sb_agblocks); + + /* Trim the allocation back to the maximum an AG can fit. */ + args.maxlen = MIN(ap->alen, XFS_ALLOC_AG_MAX_USABLE(mp)); args.firstblock = ap->firstblock; blen = 0; if (nullfb) { @@ -2621,7 +2623,7 @@ xfs_bmap_btalloc( /* * Adjust for alignment */ - if (blen > args.alignment && blen <= ap->alen) + if (blen > args.alignment && blen <= args.maxlen) args.minlen = blen - args.alignment; args.minalignslop = 0; } else { @@ -2640,7 +2642,7 @@ xfs_bmap_btalloc( * of minlen+alignment+slop doesn't go up * between the calls. */ - if (blen > mp->m_dalign && blen <= ap->alen) + if (blen > mp->m_dalign && blen <= args.maxlen) nextminlen = blen - mp->m_dalign; else nextminlen = args.minlen; -- 1.7.2.3 From kernel@teksavvy.com Wed Jan 26 22:51:41 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R4pfim189556 for ; Wed, 26 Jan 2011 22:51:41 -0600 X-ASG-Debug-ID: 1296104045-653303cf0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ironport2-out.pppoe.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B355D1A3610D for ; Wed, 26 Jan 2011 20:54:05 -0800 (PST) Received: from ironport2-out.pppoe.ca (ironport2-out.teksavvy.com [206.248.154.183]) by cuda.sgi.com with ESMTP id uEwJaOuEOcOr5VCA for ; Wed, 26 Jan 2011 20:54:05 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApIBAPuIQE1Ld/sX/2dsb2JhbAAMhAjMXZBggSODOHQEhRg X-IronPort-AV: E=Sophos;i="4.60,384,1291611600"; d="scan'208";a="89380849" Received: from rtr.ca (HELO [10.0.0.6]) ([75.119.251.23]) by ironport2-out.pppoe.ca with ESMTP/TLS/DHE-RSA-CAMELLIA256-SHA; 26 Jan 2011 23:54:04 -0500 Message-ID: <4D40FA69.2040608@teksavvy.com> Date: Wed, 26 Jan 2011 23:54:01 -0500 From: Mark Lord User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Dave Chinner CC: Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount References: <4D40C8D1.8090202@teksavvy.com> <4D40CDCF.4010301@teksavvy.com> <20110127034314.GI21311@dastard> <4D40EC2D.5020507@teksavvy.com> In-Reply-To: <4D40EC2D.5020507@teksavvy.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ironport2-out.teksavvy.com[206.248.154.183] X-Barracuda-Start-Time: 1296104045 X-Barracuda-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.53557 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 11-01-26 10:53 PM, Mark Lord wrote: > On 11-01-26 10:43 PM, Dave Chinner wrote: >> On Wed, Jan 26, 2011 at 08:43:43PM -0500, Mark Lord wrote: >>> On 11-01-26 08:22 PM, Mark Lord wrote: > .. >>> Thinking about it some more: the first problem very much appears as if >>> it is due to a filesystem check happening on the already-mounted filesystem, >>> if that makes any kind of sense (?). >> >> Not to me. You can check this simply by looking at the output of >> top while the problem is occurring... > > Top doesn't show anything interesting, since disk I/O uses practically zero CPU. > >>> running xfs_check on the umounted drive takes about the same 30-60 seconds, >>> with the disk activity light fully "on". >> >> Well, yeah - XFS check reads all the metadata in the filesystem, so >> of course it's going to thrash your disk when it is run. The fact it >> takes the same length of time as whatever problem you are having is >> likely to be coincidental. > > I find it interesting that the mount takes zero-time, > as if it never actually reads much from the filesystem. > Something has to eventually read the metadata etc. > >>> The other thought that came to mind: this behaviour has only been >>> noticed recently, probably because I have recently added about >>> 1000 new files (hundreds of MB each) to the videos/ directory on >>> that filesystem. Whereas before, it had fewer than 500 (multi-GB) >>> files in total. >>> >>> So if it really is doing some kind of internal filesystem check, >>> then the time required has only recently become 3X larger than >>> before.. so the behaviour may not be new/recent, but now is very >>> noticeable. >> >> Where does that 3x figure come from? > > Well, it used to have about 500 files/subdirs on it, > and now it has somewhat over 1500 files/subdirs. > That's a ballpark estimate of 3X the amount of meta data. > > All of these files are at least large (hundreds of MB), > and a lot are huge (many GB) in size. I've rebuilt the kernel with the various config options to enable blktrace and XFS_DEBUG, but in the meanwhile we have also watched and deleted a few GB of recordings. The result is that the mysterious first-write delay has vanished, for now, so there's nothing to trace. I think I'll pick up an extra 2TB drive, so that next time it surfaces I can simply bit-clone the filesystem or something, to preserve the buggered state for further examination. The second issue is probably still there, and I'll blktrace that instead. But it will have to wait a spell -- I've run out of time here right now. Cheers From stan@hardwarefreak.com Wed Jan 26 23:14:50 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0R5EoBN190411 for ; Wed, 26 Jan 2011 23:14:50 -0600 X-ASG-Debug-ID: 1296105434-488903250000-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 A0BDD27FDB2 for ; Wed, 26 Jan 2011 21:17: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 JKQdx4ODpLEXABTE for ; Wed, 26 Jan 2011 21:17:14 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id CDC636C0CE for ; Wed, 26 Jan 2011 23:17:13 -0600 (CST) Message-ID: <4D40FFD9.80707@hardwarefreak.com> Date: Wed, 26 Jan 2011 23:17:13 -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: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> In-Reply-To: <4D40EB2F.2050809@teksavvy.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: 1296105434 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3955 1.0000 -0.0116 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.59 X-Barracuda-Spam-Status: No, SCORE=0.59 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.53557 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 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 Mark Lord put forth on 1/26/2011 9:49 PM: > agcount=7453 That's probably a bit high Mark, and very possibly the cause of your problems. :) Unless the disk array backing this filesystem has something like 400-800 striped disk drives. You said it's a single 2TB drive right? The default agcount for a single drive filesystem is 4 allocation groups. For mdraid (of any number of disks/configuration) it's 16 allocation groups. Why/how did you end up with 7452 allocation groups? That can definitely cause some performance issues due to massively excessive head seeking, and possibly all manner of weirdness. -- Stan From kernel@teksavvy.com Thu Jan 27 09:10:00 2011 X-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_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 p0RFA0Wd234327 for ; Thu, 27 Jan 2011 09:10:00 -0600 X-ASG-Debug-ID: 1296141144-7abe034a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ironport2-out.pppoe.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1EF001DC3AC7 for ; Thu, 27 Jan 2011 07:12:24 -0800 (PST) Received: from ironport2-out.pppoe.ca (ironport2-out.teksavvy.com [206.248.154.181]) by cuda.sgi.com with ESMTP id T7iQusgxPid355ZQ for ; Thu, 27 Jan 2011 07:12:24 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApIBAA4aQU1Ld/sX/2dsb2JhbAAMhAjMZZBfgSODOHQEhRc X-IronPort-AV: E=Sophos;i="4.60,386,1291611600"; d="scan'208";a="89417796" Received: from rtr.ca (HELO [10.0.0.6]) ([75.119.251.23]) by ironport2-out.pppoe.ca with ESMTP/TLS/DHE-RSA-CAMELLIA256-SHA; 27 Jan 2011 10:12:23 -0500 Message-ID: <4D418B57.1000501@teksavvy.com> Date: Thu, 27 Jan 2011 10:12:23 -0500 From: Mark Lord User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Stan Hoeppner CC: Dave Chinner , Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> In-Reply-To: <4D40EB2F.2050809@teksavvy.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ironport2-out.teksavvy.com[206.248.154.181] X-Barracuda-Start-Time: 1296141145 X-Barracuda-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.53597 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 11-01-27 12:30 AM, Stan Hoeppner wrote: > Mark Lord put forth on 1/26/2011 9:49 PM: > >> agcount=7453 > > That's probably a bit high Mark, and very possibly the cause of your problems. > :) Unless the disk array backing this filesystem has something like 400-800 > striped disk drives. You said it's a single 2TB drive right? > > The default agcount for a single drive filesystem is 4 allocation groups. For > mdraid (of any number of disks/configuration) it's 16 allocation groups. > > Why/how did you end up with 7452 allocation groups? That can definitely cause > some performance issues due to massively excessive head seeking, and possibly > all manner of weirdness. This is great info, exactly the kind of feedback I was hoping for! The filesystem is about a year old now, and I probably used agsize=nnnnn when creating it or something. So if this resulted in what you consider to be many MANY too MANY ags, then I can imagine the first new file write wanting to go out and read in all of the ag data to determine the "best fit" or something. Which might explain some of the delay. Once I get the new 2TB drive, I'll re-run mkfs.xfs and then copy everything over onto a fresh xfs filesystem. Can you recommend a good set of mkfs.xfs parameters to suit the characteristics of this system? Eg. Only a few thousand active inodes, and nearly all files are in the 600MB -> 20GB size range. The usage pattern it must handle is up to six concurrent streaming writes at the same time as up to three streaming reads, with no significant delays permitted on the reads. That's the kind of workload that I find XFS handles nicely, and EXT4 has given me trouble with in the past. Thanks -ml From aelder@sgi.com Thu Jan 27 09:26:40 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0RFQeJf236954 for ; Thu, 27 Jan 2011 09:26:40 -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 61D94AC00C; Thu, 27 Jan 2011 07:29: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); Thu, 27 Jan 2011 09:29:01 -0600 Subject: Re: [PATCH 8/8] xfs: fix dquot shaker deadlock From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1296100401-17135-9-git-send-email-david@fromorbit.com> References: <1296100401-17135-1-git-send-email-david@fromorbit.com> <1296100401-17135-9-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Thu, 27 Jan 2011 09:29:01 -0600 Message-ID: <1296142141.1973.62.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 27 Jan 2011 15:29:01.0922 (UTC) FILETIME=[ECB88C20:01CBBE36] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2011-01-27 at 14:53 +1100, Dave Chinner wrote: > From: Dave Chinner > > Commit 368e136 ("xfs: remove duplicate code from dquot reclaim") fails > to unlock the dquot freelist when the number of loop restarts is > exceeded in xfs_qm_dqreclaim_one(). This causes hangs in memory > reclaim. Remove the bogus loop exit check that causes the problem. > > Reported-by: Malcolm Scott > Signed-off-by: Dave Chinner Still not a pretty loop (and I have no suggestions to improve it). But it looks correct. Please add a mention in the description that the double-increment issue in the qi_dqlist_lock case has been fixed. Reviewed-by: Alex Elder From aelder@sgi.com Thu Jan 27 09:28:43 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0RFShbM237331 for ; Thu, 27 Jan 2011 09:28: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 034C03040AA; Thu, 27 Jan 2011 07:31: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, 27 Jan 2011 09:31:06 -0600 Subject: Re: [PATCH 0/8] xfs: candidate 2.6.38-rc fixes V3 From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1296100401-17135-1-git-send-email-david@fromorbit.com> References: <1296100401-17135-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Thu, 27 Jan 2011 09:31:05 -0600 Message-ID: <1296142265.1973.67.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 27 Jan 2011 15:31:06.0079 (UTC) FILETIME=[36B966F0:01CBBE37] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2011-01-27 at 14:53 +1100, Dave Chinner wrote: > Fixed the various issues found during review and added all the > reviewed-by tags to the fully reviewed commits. I'll be testing with this today. Barring any unforseen problems I'm just waiting for a pull request from you (or the go-ahead to just use the patches as posted). I plan to push the result to oss.sgi.com tonight so it can be used in -next before sending it to Linus. -Alex From jpiszcz@lucidpixels.com Thu Jan 27 09:38:10 2011 X-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_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 p0RFc9Z2238765 for ; Thu, 27 Jan 2011 09:38:09 -0600 X-ASG-Debug-ID: 1296142831-27a7012f0000-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 9C7F2154AE63 for ; Thu, 27 Jan 2011 07:40:31 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id Ah3dfQtYJPokwsLh for ; Thu, 27 Jan 2011 07:40:31 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 021C91202F8; Thu, 27 Jan 2011 10:40:31 -0500 (EST) Date: Thu, 27 Jan 2011 10:40:31 -0500 (EST) From: Justin Piszcz To: Mark Lord cc: Stan Hoeppner , Christoph Hellwig , xfs@oss.sgi.com, Linux Kernel , Alex Elder X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount In-Reply-To: <4D418B57.1000501@teksavvy.com> Message-ID: References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> 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: 1296142832 X-Barracuda-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.53600 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 Thu, 27 Jan 2011, Mark Lord wrote: > On 11-01-27 12:30 AM, Stan Hoeppner wrote: >> Mark Lord put forth on 1/26/2011 9:49 PM: >> >>> agcount=7453 >> >> That's probably a bit high Mark, and very possibly the cause of your problems. >> :) Unless the disk array backing this filesystem has something like 400-800 >> striped disk drives. You said it's a single 2TB drive right? >> >> The default agcount for a single drive filesystem is 4 allocation groups. For >> mdraid (of any number of disks/configuration) it's 16 allocation groups. >> >> Why/how did you end up with 7452 allocation groups? That can definitely cause >> some performance issues due to massively excessive head seeking, and possibly >> all manner of weirdness. > > This is great info, exactly the kind of feedback I was hoping for! > > The filesystem is about a year old now, and I probably used agsize=nnnnn > when creating it or something. > > So if this resulted in what you consider to be many MANY too MANY ags, > then I can imagine the first new file write wanting to go out and read > in all of the ag data to determine the "best fit" or something. > Which might explain some of the delay. > > Once I get the new 2TB drive, I'll re-run mkfs.xfs and then copy everything > over onto a fresh xfs filesystem. > > Can you recommend a good set of mkfs.xfs parameters to suit the characteristics > of this system? Eg. Only a few thousand active inodes, and nearly all files are > in the 600MB -> 20GB size range. The usage pattern it must handle is up to > six concurrent streaming writes at the same time as up to three streaming reads, > with no significant delays permitted on the reads. > > That's the kind of workload that I find XFS handles nicely, > and EXT4 has given me trouble with in the past. > > Thanks Hi Mark, I did a load of benchmarks a long time ago testing every mkfs.xfs option there was, and I found that most of the time (if not all), the defaults were the best. Justin. From kernel@teksavvy.com Thu Jan 27 10:01:27 2011 X-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 p0RG1Rei242695 for ; Thu, 27 Jan 2011 10:01:27 -0600 X-ASG-Debug-ID: 1296144231-5a2801570000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ironport2-out.pppoe.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E5E59295FA7 for ; Thu, 27 Jan 2011 08:03:51 -0800 (PST) Received: from ironport2-out.pppoe.ca (ironport2-out.teksavvy.com [206.248.154.183]) by cuda.sgi.com with ESMTP id mfkGiD1rN8zdzBxU for ; Thu, 27 Jan 2011 08:03:51 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApIBAAQmQU1Ld/sX/2dsb2JhbAAMhAjMcJBfgSODOHQEhRc X-IronPort-AV: E=Sophos;i="4.60,386,1291611600"; d="scan'208";a="89426373" Received: from rtr.ca (HELO [10.0.0.6]) ([75.119.251.23]) by ironport2-out.pppoe.ca with ESMTP/TLS/DHE-RSA-CAMELLIA256-SHA; 27 Jan 2011 11:03:50 -0500 Message-ID: <4D419765.4070805@teksavvy.com> Date: Thu, 27 Jan 2011 11:03:49 -0500 From: Mark Lord User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Justin Piszcz CC: Stan Hoeppner , Christoph Hellwig , xfs@oss.sgi.com, Linux Kernel , Alex Elder X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ironport2-out.teksavvy.com[206.248.154.183] X-Barracuda-Start-Time: 1296144231 X-Barracuda-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.53601 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 11-01-27 10:40 AM, Justin Piszcz wrote: > > > On Thu, 27 Jan 2011, Mark Lord wrote: .. >> Can you recommend a good set of mkfs.xfs parameters to suit the characteristics >> of this system? Eg. Only a few thousand active inodes, and nearly all files are >> in the 600MB -> 20GB size range. The usage pattern it must handle is up to >> six concurrent streaming writes at the same time as up to three streaming reads, >> with no significant delays permitted on the reads. >> >> That's the kind of workload that I find XFS handles nicely, >> and EXT4 has given me trouble with in the past. .. > I did a load of benchmarks a long time ago testing every mkfs.xfs option there > was, and I found that most of the time (if not all), the defaults were the best. .. I am concerned with fragmentation on the very special workload in this case. I'd really like the 20GB files, written over a 1-2 hour period, to consist of a very few very large extents, as much as possible. Rather than hundreds or thousands of "tiny" MB sized extents. I wonder what the best mkfs.xfs parameters might be to encourage that? Cheers From moh39dyaseen@yahoo.com Thu Jan 27 12:03:05 2011 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_50,FREEMAIL_FROM, T_DKIM_INVALID,T_FILL_THIS_FORM_SHORT,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 p0RI35Lj260665 for ; Thu, 27 Jan 2011 12:03:05 -0600 X-ASG-Debug-ID: 1296151529-1bf903a80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from nm7-vm0.bullet.mail.sp2.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 0AB92296BBA for ; Thu, 27 Jan 2011 10:05:29 -0800 (PST) Received: from nm7-vm0.bullet.mail.sp2.yahoo.com (nm7-vm0.bullet.mail.sp2.yahoo.com [98.139.91.192]) by cuda.sgi.com with SMTP id OIuplAcM3jzjIuC0 for ; Thu, 27 Jan 2011 10:05:29 -0800 (PST) Received: from [98.139.91.70] by nm7.bullet.mail.sp2.yahoo.com with NNFMP; 27 Jan 2011 18:05:28 -0000 Received: from [98.139.91.12] by tm10.bullet.mail.sp2.yahoo.com with NNFMP; 27 Jan 2011 18:05:28 -0000 Received: from [127.0.0.1] by omp1012.mail.sp2.yahoo.com with NNFMP; 27 Jan 2011 18:05:28 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 900895.92624.bm@omp1012.mail.sp2.yahoo.com Received: (qmail 39575 invoked by uid 60001); 27 Jan 2011 18:05:28 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1296151528; bh=10D/EKXkKN7186or8ix3a0f0xa8Y6LP/QoJDS2jVwMs=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type:Content-Transfer-Encoding; b=bLN4vjn1MTAJknnpwnXAgTrkv9G/Wve7UmvMeU+34/cfD7iR7p2wbf7HxhejGfGTMA89g473xJMRr1QB9WQinePfPgF7PpUyhCABeZojTuJ6gPLobH2KmQyabjGkZhD1D665YQuOzupD3xQBgm8SNQ30F4rbfIL8xSoyXEdUsG4= DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type:Content-Transfer-Encoding; b=vvzz9WbTRhV61n/GK3DiU82SGLCgelr12EKFjHuslWCKc7D9zIktIE2423/yH7h+vkYwNyLHpMDmjkRnIiOXK8vIqqbuWerwyBNXB8ilYmJBdKcSKQWkaN5zWLYP4t8GDp2dWvXTDtObhJk+mTHVMZvomPtpkXcTufD+T1q9r0I=; Message-ID: <351050.32658.qm@web113110.mail.gq1.yahoo.com> X-YMail-OSG: etHMTUwVM1mKE3Es8QrQmRbo1onTNgX64W8_EzFn3c2JfxQ YNZSJTQ8ENKgKIJl6FYmn7Gzq0zh2i2zfqrvI8jz4cO6j0pXcQuEhs0RXq3y 6jZoU5F_JwY65miCUizUTXCQDPnIfbOfAGciHG1t6dbfjDMPUDE2JfeGncT8 Ls8cNRa_oFX3Q4scLnbT2kYqAgiD9IuQWx74TZsBYUBp5cLJGm7yIlntQm1K aalL0aSVQDcxfvok71ty_DLSJ8DzMcVV6H0cf9upHmeR5qAzXcUgs9ul4LpG 16YZU1YNCumvHEOu8qcEiPzJkU0TNGeycbnxxM2QX6zmZrv4ShswC Received: from [173.51.54.62] by web113110.mail.gq1.yahoo.com via HTTP; Thu, 27 Jan 2011 10:05:27 PST X-Mailer: YahooMailRC/157.18 YahooMailWebService/0.8.107.285259 Date: Thu, 27 Jan 2011 10:05:27 -0800 (PST) From: Naomi Haynes Reply-To: job@abctransportsa.net X-ASG-Orig-Subj: Welcome to ABC. Your dreams will come true. Offer will expire on Feb 20, 2011 Subject: Welcome to ABC. Your dreams will come true. Offer will expire on Feb 20, 2011 To: patastro@msn.com MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: nm7-vm0.bullet.mail.sp2.yahoo.com[98.139.91.192] X-Barracuda-Start-Time: 1296151530 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3859 1.0000 -0.0378 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.04 X-Barracuda-Spam-Status: No, SCORE=-0.04 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.53609 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 Title: Management Jobs - Transportation Manager Research=0A=0ACompany: ABC = Transports SA ABCTSA=0AJob Code: TM04=0ALocations: Any US or Canada City= =0A=0AIndustries:=0AConsulting=0AWholesale=0A=0AFunctions:=0AConsulting =E2= =80=93 Management=0AWholesale: Internet=0AWholesale: Retail=0A=0ATransporta= tion Manager Research-0028173=0A =0ADescription=0AJob Summary:=0ATo help ou= r clients with their orders, to check the merchandise if needed, and to dis= patch to our clients.=0A=0ATo be considered, you should have following:=0AF= luent English, both spoken and written=0AKnowledge of PC: MS Office, typing= , instant messengers=0ACommunication skills, ability to communicate freely = via phone and e-mail=0A=0APreferred Qualifications:=0AIn addition to meetin= g the above qualifications, the following is preferred:=0AAge 21+=0AProacti= ve approach to work=0Aknowledge of sales=0ADiligence=0ACustomer service ori= ented with exceptional interpersonal skills=0A=0ACompetencies:=0AThe ABC's = Competency Framework is the foundation of our Talent Strategy and is what d= rives ABC performance. ABC accordingly selects and develops talent based on= each of the following competencies:=0Aanalyze issues and make effective de= cisions, advance the business,=0AExperience working in a highly promotional= driven industry=0Aengage, coach, and build a diverse workforce, build part= nerships,=0Aimprove service quality and processes, execute effectively,=0Ad= emonstrate personal leadership, and demonstrate functional and technical ag= ility.=0A =0AEnvironmental Conditions:=0AWork inside a soho - small office/= home office environment.=0A=0ASafety Commitment:=0ASafety is a way of life = at ABC, encompassing every aspect of company operations. Guided by a policy= of ensuring the safety of our employees, our customers, and the communitie= s we serve, ABC works relentlessly to prevent accidents and injuries. Not = only is it the right thing to do, but when a company puts safety first, eve= ryone benefits: the employees and their families, the customers, and the co= mmunities.=0A =0AWho we are:=0AABC Transports SA, an Esquire 500 company he= adquartered in Geneve, CH, is a multi-modal freight transportation company = serving customers across Europe. ABC also includes an integrated intermodal= company which serves customers with its own truck and terminal operations = as well as a dedicated international container fleet. Other ABC subsidiarie= s provide technology and real estate support to the company. These subsidi= aries combine to allow ABC to deliver efficient freight alternatives to cus= tomers in a variety of industries, including coal, chemicals, automobiles, = metals, agricultural and forest products, food and consumer goods. ABC Tran= sports SA ABCTSA is the largest company in the ABC family employing 34,000 = management and union employees. ABCTSA's primary focus is the operation, m= aintenance, and management of the largest transportation system in the Euro= pe.=0A =0AClosing Statement:=0AAt ABC two of the company's core values are = People Make The Difference and Safety Is A Way of Life. We are committed t= o offering our team members the most competitive compensation and benefits = package available, unlimited opportunities for development and growth throu= ghout an exciting and rewarding career, and the safest work environment pos= sible.=0A=0APrimary Location: New York, NY=0ASchedule: Full-time, Part-time= =0ARelocation Available: 10% -=0ATax Status: Transportation Retirement=0AOv= ertime Status: Exempt=0AClosing Date: Feb 20, 2011=0ANumber of Openings: 28= =0A=0A_____________________________=0ANaomi Haynes =0A=0A=0A From gongfan193@gmail.com Thu Jan 27 12:14:45 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-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 p0RIEi8H262115 for ; Thu, 27 Jan 2011 12:14:44 -0600 X-ASG-Debug-ID: 1296152227-523903800000-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 6F8951A3D99C for ; Thu, 27 Jan 2011 10:17:07 -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 Bj0vwOGX1MOpg1U6 for ; Thu, 27 Jan 2011 10:17:07 -0800 (PST) Received: by iyj18 with SMTP id 18so1978562iyj.26 for ; Thu, 27 Jan 2011 10:17:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:from:date:message-id:subject:to:cc :content-type; bh=F9lQ0Bd8eLDTECNudNLbgbzJLPe2r5Chs8wfnnDDzO0=; b=Ri/E6Ra+MI6Usj1qNe/1NsXU+6VKREee0TE0y6/uwcNz2X70TfNEdhxZCGiHMFfr5G Io5wMePOLzTLCt/YZDNp626mCZTeUvu8Yt2gqzvRiwnWIkqZm7Q4BuqLkwHmA2Gat5rc +A6rEITk12RFw8bUWWkcwQXCVDIn9pcGJO1xA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:from:date:message-id:subject:to:cc:content-type; b=bSsGAPR2l4zD0GUofC7Ha0ZHGfQjbS1TF8xTY0NU2s0MfK5bAliLGpi5dQv5jf/HZT aBKuhARR9nHOw9MVo0ehBP8LczGAJS6B239VrHEwz35KLjt6gXnr7MVPemHRYa+GiAuu x25lPJO2cdn4CFmRO325kT1sMAXZUKqUH4h2o= Received: by 10.42.228.198 with SMTP id jf6mr2593701icb.162.1296152227265; Thu, 27 Jan 2011 10:17:07 -0800 (PST) MIME-Version: 1.0 Received: by 10.42.240.195 with HTTP; Thu, 27 Jan 2011 10:16:46 -0800 (PST) From: Drunkard Zhang Date: Fri, 28 Jan 2011 02:16:46 +0800 Message-ID: X-ASG-Orig-Subj: 2.6.37: Failed to umount xfs on usb disk Subject: 2.6.37: Failed to umount xfs on usb disk To: Greg Kroah-Hartman , aelder@sgi.com Cc: linux-kernel , usb-storage@lists.one-eyed-alien.net, xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=20cf304346ba14be23049ad7f56c X-Barracuda-Connect: mail-iy0-f181.google.com[209.85.210.181] X-Barracuda-Start-Time: 1296152228 X-Barracuda-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.53609 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 --20cf304346ba14be23049ad7f56c Content-Type: text/plain; charset=UTF-8 I can't umount xfs on a 2TB usb disk, when this happened, I can't use usb disk anymore, exec of command "sync" and "lsusb" hangs. Any idea? It's an Acer 4520G laptop. The dmesg show something like this: [21000.265078] INFO: task khubd:409 blocked for more than 120 seconds. [21000.265089] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [21000.265097] khubd D ffff88012c195fe0 0 409 2 0x00000000 [21000.265112] ffff88012c30f8d8 0000000000000046 ffffffff8111112b ffff88012c2cc530 [21000.265125] ffff88012acd4530 ffff88012c30ffd8 ffff88012c195c40 ffff88012c195fe8 [21000.265137] ffff88012c195fe0 ffff88012c30e000 0000000000012040 ffff88012c30ffd8 [21000.265149] Call Trace: [21000.265169] [] ? pollwake+0x52/0x54 [21000.265185] [] ? sub_preempt_count+0x3a/0x4e [21000.265199] [] rwsem_down_failed_common+0xdb/0x10d [21000.265211] [] ? wait_on_inode+0x1a/0x1c [21000.265223] [] rwsem_down_read_failed+0x12/0x14 [21000.265237] [] call_rwsem_down_read_failed+0x14/0x30 [21000.265251] [] ? bdev_set+0x0/0x15 [21000.265261] [] ? get_super+0x64/0xbc [21000.265271] [] ? down_read+0x17/0x19 [21000.265280] [] get_super+0x6c/0xbc [21000.265290] [] fsync_bdev+0x18/0x49 [21000.265304] [] invalidate_partition+0x25/0x42 [21000.265317] [] del_gendisk+0x3b/0xf6 [21000.265330] [] ? device_del+0x199/0x1a1 [21000.265341] [] sd_remove+0x66/0xa2 [21000.265352] [] __device_release_driver+0x7b/0xd1 [21000.265361] [] device_release_driver+0x23/0x30 [21000.265373] [] bus_remove_device+0xad/0xc2 [21000.265383] [] device_del+0x135/0x1a1 [21000.265396] [] __scsi_remove_device+0x52/0x9d [21000.265407] [] scsi_forget_host+0x46/0x68 [21000.265417] [] scsi_remove_host+0x84/0xfe [21000.265431] [] quiesce_and_remove_host+0x5f/0x98 [21000.265442] [] usb_stor_disconnect+0x22/0x2e [21000.265452] [] usb_unbind_interface+0x59/0x108 [21000.265462] [] __device_release_driver+0x7b/0xd1 [21000.265472] [] device_release_driver+0x23/0x30 [21000.265483] [] bus_remove_device+0xad/0xc2 [21000.265493] [] device_del+0x135/0x1a1 [21000.265506] [] usb_disable_device+0x50/0xf7 [21000.265517] [] usb_disconnect+0x93/0x123 [21000.265528] [] hub_thread+0x41b/0xdc2 [21000.265538] [] ? dequeue_entity+0x4a/0x184 [21000.265548] [] ? dequeue_task_fair+0x73/0x7c [21000.265562] [] ? autoremove_wake_function+0x0/0x39 [21000.265573] [] ? hub_thread+0x0/0xdc2 [21000.265582] [] kthread+0x82/0x8a [21000.265594] [] kernel_thread_helper+0x4/0x10 [21000.265603] [] ? finish_task_switch+0x4b/0xc2 [21000.265613] [] ? restore_args+0x0/0x30 [21000.265622] [] ? kthread+0x0/0x8a [21000.265631] [] ? kernel_thread_helper+0x0/0x10 [21000.265712] INFO: task umount:6045 blocked for more than 120 seconds. [21000.265718] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [21000.265725] umount D ffff88012c15c8d0 0 6045 4589 0x00000000 [21000.265737] ffff88007cff7c58 0000000000000086 ffff88007cff7bd8 ffffffff81a0b020 [21000.265749] ffff880000000000 ffff88007cff7fd8 ffff88012c15c530 ffff88012c15c8d8 [21000.265761] ffff88012c15c8d0 ffff88007cff6000 0000000000012040 ffff88007cff7fd8 [21000.265773] Call Trace: [21000.265786] [] schedule_timeout+0x27/0xc0 [21000.265800] [] ? get_parent_ip+0x11/0x41 [21000.265812] [] ? xfs_buf_cmp+0x0/0x22 [21000.265822] [] ? sub_preempt_count+0x3a/0x4e [21000.265833] [] __down_common+0xa0/0xf3 [21000.265846] [] ? xfs_getsb+0x32/0x42 [21000.265856] [] __down+0x1d/0x1f [21000.265868] [] down+0x2d/0x3f [21000.265878] [] xfs_buf_lock+0x9b/0xeb [21000.265888] [] xfs_getsb+0x32/0x42 [21000.265898] [] xfs_unmountfs_writesb+0x2c/0x8e [21000.265910] [] xfs_unmountfs+0xf9/0x128 [21000.265921] [] xfs_fs_put_super+0x46/0x73 [21000.265932] [] generic_shutdown_super+0x6b/0xed [21000.265942] [] kill_block_super+0x27/0x3f [21000.265951] [] deactivate_locked_super+0x26/0x46 [21000.265961] [] deactivate_super+0x45/0x4a [21000.265972] [] mntput_no_expire+0xe2/0x110 [21000.265982] [] sys_umount+0x2d7/0x302 [21000.265993] [] ? trace_hardirqs_off_thunk+0x3a/0x6c [21000.266031] [] system_call_fastpath+0x16/0x1b [21183.240082] INFO: task khubd:409 blocked for more than 5 seconds. [21183.240093] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [21183.240101] khubd D ffff88012c195fe0 0 409 2 0x00000000 [21183.240117] ffff88012c30f8d8 0000000000000046 ffffffff8111112b ffff88012c2cc530 [21183.240132] ffff88012acd4530 ffff88012c30ffd8 ffff88012c195c40 ffff88012c195fe8 [21183.240145] ffff88012c195fe0 ffff88012c30e000 0000000000012040 ffff88012c30ffd8 [21183.240159] Call Trace: [21183.240180] [] ? pollwake+0x52/0x54 [21183.240197] [] ? sub_preempt_count+0x3a/0x4e [21183.240213] [] rwsem_down_failed_common+0xdb/0x10d [21183.240226] [] ? wait_on_inode+0x1a/0x1c [21183.240240] [] rwsem_down_read_failed+0x12/0x14 [21183.240254] [] call_rwsem_down_read_failed+0x14/0x30 [21183.240269] [] ? bdev_set+0x0/0x15 [21183.240281] [] ? get_super+0x64/0xbc [21183.240291] [] ? down_read+0x17/0x19 [21183.240301] [] get_super+0x6c/0xbc [21183.240312] [] fsync_bdev+0x18/0x49 [21183.240327] [] invalidate_partition+0x25/0x42 [21183.240341] [] del_gendisk+0x3b/0xf6 [21183.240356] [] ? device_del+0x199/0x1a1 [21183.240368] [] sd_remove+0x66/0xa2 [21183.240379] [] __device_release_driver+0x7b/0xd1 [21183.240388] [] device_release_driver+0x23/0x30 [21183.240401] [] bus_remove_device+0xad/0xc2 [21183.240412] [] device_del+0x135/0x1a1 [21183.240426] [] __scsi_remove_device+0x52/0x9d [21183.240438] [] scsi_forget_host+0x46/0x68 [21183.240450] [] scsi_remove_host+0x84/0xfe [21183.240465] [] quiesce_and_remove_host+0x5f/0x98 [21183.240476] [] usb_stor_disconnect+0x22/0x2e [21183.240488] [] usb_unbind_interface+0x59/0x108 [21183.240498] [] __device_release_driver+0x7b/0xd1 [21183.240508] [] device_release_driver+0x23/0x30 [21183.240520] [] bus_remove_device+0xad/0xc2 [21183.240531] [] device_del+0x135/0x1a1 [21183.240545] [] usb_disable_device+0x50/0xf7 [21183.240558] [] usb_disconnect+0x93/0x123 [21183.240569] [] hub_thread+0x41b/0xdc2 [21183.240581] [] ? dequeue_entity+0x4a/0x184 [21183.240591] [] ? dequeue_task_fair+0x73/0x7c [21183.240607] [] ? autoremove_wake_function+0x0/0x39 [21183.240619] [] ? hub_thread+0x0/0xdc2 [21183.240629] [] kthread+0x82/0x8a [21183.240641] [] kernel_thread_helper+0x4/0x10 [21183.240651] [] ? finish_task_switch+0x4b/0xc2 [21183.240661] [] ? restore_args+0x0/0x30 [21183.240671] [] ? kthread+0x0/0x8a [21183.240680] [] ? kernel_thread_helper+0x0/0x10 [21183.240752] INFO: task umount:6045 blocked for more than 5 seconds. [21183.240758] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [21183.240765] umount D ffff88012c15c8d0 0 6045 4589 0x00000000 [21183.240778] ffff88007cff7c58 0000000000000086 ffff88007cff7bd8 ffffffff81a0b020 [21183.240792] ffff880000000000 ffff88007cff7fd8 ffff88012c15c530 ffff88012c15c8d8 [21183.240806] ffff88012c15c8d0 ffff88007cff6000 0000000000012040 ffff88007cff7fd8 [21183.240819] Call Trace: [21183.240834] [] schedule_timeout+0x27/0xc0 [21183.240849] [] ? get_parent_ip+0x11/0x41 [21183.240862] [] ? xfs_buf_cmp+0x0/0x22 [21183.240872] [] ? sub_preempt_count+0x3a/0x4e [21183.240884] [] __down_common+0xa0/0xf3 [21183.240898] [] ? xfs_getsb+0x32/0x42 [21183.240909] [] __down+0x1d/0x1f [21183.240922] [] down+0x2d/0x3f [21183.240935] [] xfs_buf_lock+0x9b/0xeb [21183.240946] [] xfs_getsb+0x32/0x42 [21183.240956] [] xfs_unmountfs_writesb+0x2c/0x8e [21183.240970] [] xfs_unmountfs+0xf9/0x128 [21183.240983] [] xfs_fs_put_super+0x46/0x73 [21183.240996] [] generic_shutdown_super+0x6b/0xed [21183.241030] [] kill_block_super+0x27/0x3f [21183.241045] [] deactivate_locked_super+0x26/0x46 [21183.241061] [] deactivate_super+0x45/0x4a [21183.241077] [] mntput_no_expire+0xe2/0x110 [21183.241093] [] sys_umount+0x2d7/0x302 [21183.241109] [] ? trace_hardirqs_off_thunk+0x3a/0x6c [21183.241129] [] system_call_fastpath+0x16/0x1b [21188.241078] INFO: task khubd:409 blocked for more than 5 seconds. [21188.241089] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [21188.241097] khubd D ffff88012c195fe0 0 409 2 0x00000000 [21188.241113] ffff88012c30f8d8 0000000000000046 ffffffff8111112b ffff88012c2cc530 [21188.241129] ffff88012acd4530 ffff88012c30ffd8 ffff88012c195c40 ffff88012c195fe8 [21188.241144] ffff88012c195fe0 ffff88012c30e000 0000000000012040 ffff88012c30ffd8 [21188.241159] Call Trace: [21188.241180] [] ? pollwake+0x52/0x54 [21188.241198] [] ? sub_preempt_count+0x3a/0x4e [21188.241214] [] rwsem_down_failed_common+0xdb/0x10d [21188.241227] [] ? wait_on_inode+0x1a/0x1c [21188.241241] [] rwsem_down_read_failed+0x12/0x14 [21188.241255] [] call_rwsem_down_read_failed+0x14/0x30 [21188.241269] [] ? bdev_set+0x0/0x15 [21188.241281] [] ? get_super+0x64/0xbc [21188.241292] [] ? down_read+0x17/0x19 [21188.241302] [] get_super+0x6c/0xbc [21188.241313] [] fsync_bdev+0x18/0x49 [21188.241328] [] invalidate_partition+0x25/0x42 [21188.241342] [] del_gendisk+0x3b/0xf6 [21188.241356] [] ? device_del+0x199/0x1a1 [21188.241368] [] sd_remove+0x66/0xa2 [21188.241380] [] __device_release_driver+0x7b/0xd1 [21188.241390] [] device_release_driver+0x23/0x30 [21188.241403] [] bus_remove_device+0xad/0xc2 [21188.241415] [] device_del+0x135/0x1a1 [21188.241429] [] __scsi_remove_device+0x52/0x9d [21188.241441] [] scsi_forget_host+0x46/0x68 [21188.241452] [] scsi_remove_host+0x84/0xfe [21188.241467] [] quiesce_and_remove_host+0x5f/0x98 [21188.241479] [] usb_stor_disconnect+0x22/0x2e [21188.241491] [] usb_unbind_interface+0x59/0x108 [21188.241503] [] __device_release_driver+0x7b/0xd1 [21188.241513] [] device_release_driver+0x23/0x30 [21188.241525] [] bus_remove_device+0xad/0xc2 [21188.241537] [] device_del+0x135/0x1a1 [21188.241552] [] usb_disable_device+0x50/0xf7 [21188.241564] [] usb_disconnect+0x93/0x123 [21188.241576] [] hub_thread+0x41b/0xdc2 [21188.241588] [] ? dequeue_entity+0x4a/0x184 [21188.241599] [] ? dequeue_task_fair+0x73/0x7c [21188.241616] [] ? autoremove_wake_function+0x0/0x39 [21188.241628] [] ? hub_thread+0x0/0xdc2 [21188.241638] [] kthread+0x82/0x8a [21188.241651] [] kernel_thread_helper+0x4/0x10 [21188.241662] [] ? finish_task_switch+0x4b/0xc2 [21188.241672] [] ? restore_args+0x0/0x30 [21188.241683] [] ? kthread+0x0/0x8a [21188.241693] [] ? kernel_thread_helper+0x0/0x10 [21188.241766] INFO: task umount:6045 blocked for more than 5 seconds. [21188.241773] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [21188.241780] umount D ffff88012c15c8d0 0 6045 4589 0x00000000 [21188.241794] ffff88007cff7c58 0000000000000086 ffff88007cff7bd8 ffffffff81a0b020 [21188.241809] ffff880000000000 ffff88007cff7fd8 ffff88012c15c530 ffff88012c15c8d8 [21188.241824] ffff88012c15c8d0 ffff88007cff6000 0000000000012040 ffff88007cff7fd8 [21188.241838] Call Trace: [21188.241854] [] schedule_timeout+0x27/0xc0 [21188.241869] [] ? get_parent_ip+0x11/0x41 [21188.241881] [] ? xfs_buf_cmp+0x0/0x22 [21188.241892] [] ? sub_preempt_count+0x3a/0x4e [21188.241905] [] __down_common+0xa0/0xf3 [21188.241919] [] ? xfs_getsb+0x32/0x42 [21188.241931] [] __down+0x1d/0x1f [21188.241943] [] down+0x2d/0x3f [21188.241955] [] xfs_buf_lock+0x9b/0xeb [21188.241966] [] xfs_getsb+0x32/0x42 [21188.241979] [] xfs_unmountfs_writesb+0x2c/0x8e [21188.241993] [] xfs_unmountfs+0xf9/0x128 [21188.242031] [] xfs_fs_put_super+0x46/0x73 [21188.242046] [] generic_shutdown_super+0x6b/0xed [21188.242062] [] kill_block_super+0x27/0x3f [21188.242078] [] deactivate_locked_super+0x26/0x46 [21188.242094] [] deactivate_super+0x45/0x4a [21188.242111] [] mntput_no_expire+0xe2/0x110 [21188.242127] [] sys_umount+0x2d7/0x302 [21188.242144] [] ? trace_hardirqs_off_thunk+0x3a/0x6c [21188.242166] [] system_call_fastpath+0x16/0x1b [21188.242184] INFO: task sync:6206 blocked for more than 5 seconds. [21188.242194] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [21188.242206] sync D ffff880110b65fe0 0 6206 6070 0x00000000 [21188.242228] ffff88009c443e40 0000000000000082 ffff88009c443e78 ffffffff81a0b020 [21188.242252] ffffffff00000000 ffff88009c443fd8 ffff880110b65c40 ffff880110b65fe8 [21188.242277] ffff880110b65fe0 ffff88009c442000 0000000000012040 ffff88009c443fd8 [21188.242301] Call Trace: [21188.242319] [] ? sync_one_sb+0x0/0x22 [21188.242336] [] rwsem_down_failed_common+0xdb/0x10d [21188.242355] [] ? __filemap_fdatawrite_range+0x50/0x52 [21188.242373] [] rwsem_down_read_failed+0x12/0x14 [21188.242390] [] call_rwsem_down_read_failed+0x14/0x30 [21188.242406] [] ? iterate_supers+0x5a/0xcd [21188.242422] [] ? down_read+0x17/0x19 [21188.242437] [] iterate_supers+0x62/0xcd [21188.242452] [] sys_sync+0x2f/0x5c [21188.242469] [] system_call_fastpath+0x16/0x1b [21193.242150] INFO: task khubd:409 blocked for more than 5 seconds. [21193.242160] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [21193.242168] khubd D ffff88012c195fe0 0 409 2 0x00000000 [21193.242182] ffff88012c30f8d8 0000000000000046 ffffffff8111112b ffff88012c2cc530 [21193.242196] ffff88012acd4530 ffff88012c30ffd8 ffff88012c195c40 ffff88012c195fe8 [21193.242208] ffff88012c195fe0 ffff88012c30e000 0000000000012040 ffff88012c30ffd8 [21193.242220] Call Trace: [21193.242242] [] ? pollwake+0x52/0x54 [21193.242257] [] ? sub_preempt_count+0x3a/0x4e [21193.242272] [] rwsem_down_failed_common+0xdb/0x10d [21193.242284] [] ? wait_on_inode+0x1a/0x1c [21193.242296] [] rwsem_down_read_failed+0x12/0x14 [21193.242310] [] call_rwsem_down_read_failed+0x14/0x30 [21193.242323] [] ? bdev_set+0x0/0x15 [21193.242333] [] ? get_super+0x64/0xbc [21193.242343] [] ? down_read+0x17/0x19 [21193.242352] [] get_super+0x6c/0xbc [21193.242363] [] fsync_bdev+0x18/0x49 [21193.242376] [] invalidate_partition+0x25/0x42 [21193.242390] [] del_gendisk+0x3b/0xf6 [21193.242403] [] ? device_del+0x199/0x1a1 [21193.242414] [] sd_remove+0x66/0xa2 [21193.242425] [] __device_release_driver+0x7b/0xd1 [21193.242434] [] device_release_driver+0x23/0x30 [21193.242446] [] bus_remove_device+0xad/0xc2 [21193.242456] [] device_del+0x135/0x1a1 [21193.242469] [] __scsi_remove_device+0x52/0x9d [21193.242480] [] scsi_forget_host+0x46/0x68 [21193.242490] [] scsi_remove_host+0x84/0xfe [21193.242504] [] quiesce_and_remove_host+0x5f/0x98 [21193.242515] [] usb_stor_disconnect+0x22/0x2e [21193.242525] [] usb_unbind_interface+0x59/0x108 [21193.242535] [] __device_release_driver+0x7b/0xd1 [21193.242545] [] device_release_driver+0x23/0x30 [21193.242556] [] bus_remove_device+0xad/0xc2 [21193.242567] [] device_del+0x135/0x1a1 [21193.242580] [] usb_disable_device+0x50/0xf7 [21193.242590] [] usb_disconnect+0x93/0x123 [21193.242601] [] hub_thread+0x41b/0xdc2 [21193.242612] [] ? dequeue_entity+0x4a/0x184 [21193.242622] [] ? dequeue_task_fair+0x73/0x7c [21193.242636] [] ? autoremove_wake_function+0x0/0x39 [21193.242647] [] ? hub_thread+0x0/0xdc2 [21193.242656] [] kthread+0x82/0x8a [21193.242667] [] kernel_thread_helper+0x4/0x10 [21193.242677] [] ? finish_task_switch+0x4b/0xc2 [21193.242686] [] ? restore_args+0x0/0x30 [21193.242695] [] ? kthread+0x0/0x8a [21193.242704] [] ? kernel_thread_helper+0x0/0x10 --20cf304346ba14be23049ad7f56c Content-Type: application/octet-stream; name="config-2.6.37" Content-Disposition: attachment; filename="config-2.6.37" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gjfzcqyn0 IwojIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CiMgTGlu dXgveDg2XzY0IDIuNi4zNyBLZXJuZWwgQ29uZmlndXJhdGlvbgojIFdlZCBKYW4gMTkgMTA6MTM6 NDkgMjAxMQojCkNPTkZJR182NEJJVD15CiMgQ09ORklHX1g4Nl8zMiBpcyBub3Qgc2V0CkNPTkZJ R19YODZfNjQ9eQpDT05GSUdfWDg2PXkKQ09ORklHX0lOU1RSVUNUSU9OX0RFQ09ERVI9eQpDT05G SUdfT1VUUFVUX0ZPUk1BVD0iZWxmNjQteDg2LTY0IgpDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFy Y2gveDg2L2NvbmZpZ3MveDg2XzY0X2RlZmNvbmZpZyIKQ09ORklHX0dFTkVSSUNfQ01PU19VUERB VEU9eQpDT05GSUdfQ0xPQ0tTT1VSQ0VfV0FUQ0hET0c9eQpDT05GSUdfR0VORVJJQ19DTE9DS0VW RU5UUz15CkNPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVD15CkNPTkZJR19MT0NL REVQX1NVUFBPUlQ9eQpDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKQ09ORklHX0hBVkVfTEFU RU5DWVRPUF9TVVBQT1JUPXkKQ09ORklHX01NVT15CkNPTkZJR19aT05FX0RNQT15CkNPTkZJR19O RUVEX0RNQV9NQVBfU1RBVEU9eQpDT05GSUdfTkVFRF9TR19ETUFfTEVOR1RIPXkKQ09ORklHX0dF TkVSSUNfSVNBX0RNQT15CkNPTkZJR19HRU5FUklDX0lPTUFQPXkKQ09ORklHX0dFTkVSSUNfQlVH PXkKQ09ORklHX0dFTkVSSUNfQlVHX1JFTEFUSVZFX1BPSU5URVJTPXkKQ09ORklHX0dFTkVSSUNf SFdFSUdIVD15CkNPTkZJR19BUkNIX01BWV9IQVZFX1BDX0ZEQz15CiMgQ09ORklHX1JXU0VNX0dF TkVSSUNfU1BJTkxPQ0sgaXMgbm90IHNldApDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09 eQpDT05GSUdfQVJDSF9IQVNfQ1BVX0lETEVfV0FJVD15CkNPTkZJR19HRU5FUklDX0NBTElCUkFU RV9ERUxBWT15CkNPTkZJR19HRU5FUklDX1RJTUVfVlNZU0NBTEw9eQpDT05GSUdfQVJDSF9IQVNf Q1BVX1JFTEFYPXkKQ09ORklHX0FSQ0hfSEFTX0RFRkFVTFRfSURMRT15CkNPTkZJR19BUkNIX0hB U19DQUNIRV9MSU5FX1NJWkU9eQpDT05GSUdfSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUE9eQpDT05G SUdfTkVFRF9QRVJfQ1BVX0VNQkVEX0ZJUlNUX0NIVU5LPXkKQ09ORklHX05FRURfUEVSX0NQVV9Q QUdFX0ZJUlNUX0NIVU5LPXkKQ09ORklHX0hBVkVfQ1BVTUFTS19PRl9DUFVfTUFQPXkKQ09ORklH X0FSQ0hfSElCRVJOQVRJT05fUE9TU0lCTEU9eQpDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxF PXkKQ09ORklHX1pPTkVfRE1BMzI9eQpDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQpD T05GSUdfQVVESVRfQVJDSD15CkNPTkZJR19BUkNIX1NVUFBPUlRTX09QVElNSVpFRF9JTkxJTklO Rz15CkNPTkZJR19BUkNIX1NVUFBPUlRTX0RFQlVHX1BBR0VBTExPQz15CkNPTkZJR19IQVZFX0lO VEVMX1RYVD15CkNPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUz15CkNPTkZJR19YODZfNjRf U01QPXkKQ09ORklHX1g4Nl9IVD15CkNPTkZJR19YODZfVFJBTVBPTElORT15CkNPTkZJR19BUkNI X0hXRUlHSFRfQ0ZMQUdTPSItZmNhbGwtc2F2ZWQtcmRpIC1mY2FsbC1zYXZlZC1yc2kgLWZjYWxs LXNhdmVkLXJkeCAtZmNhbGwtc2F2ZWQtcmN4IC1mY2FsbC1zYXZlZC1yOCAtZmNhbGwtc2F2ZWQt cjkgLWZjYWxsLXNhdmVkLXIxMCAtZmNhbGwtc2F2ZWQtcjExIgojIENPTkZJR19LVElNRV9TQ0FM QVIgaXMgbm90IHNldApDT05GSUdfQVJDSF9DUFVfUFJPQkVfUkVMRUFTRT15CkNPTkZJR19ERUZD T05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCkNPTkZJR19D T05TVFJVQ1RPUlM9eQpDT05GSUdfSEFWRV9JUlFfV09SSz15CkNPTkZJR19JUlFfV09SSz15Cgoj CiMgR2VuZXJhbCBzZXR1cAojCkNPTkZJR19FWFBFUklNRU5UQUw9eQpDT05GSUdfTE9DS19LRVJO RUw9eQpDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCkNPTkZJR19DUk9TU19DT01QSUxFPSIi CkNPTkZJR19MT0NBTFZFUlNJT049IiIKIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90 IHNldApDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CkNPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15 CkNPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKQ09ORklHX0hBVkVfS0VSTkVMX0xaTz15CkNPTkZJ R19LRVJORUxfR1pJUD15CiMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CiMgQ09ORklH X0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIyBDT05GSUdfS0VSTkVMX0xaTyBpcyBub3Qgc2V0CkNP TkZJR19TV0FQPXkKQ09ORklHX1NZU1ZJUEM9eQpDT05GSUdfU1lTVklQQ19TWVNDVEw9eQpDT05G SUdfUE9TSVhfTVFVRVVFPXkKQ09ORklHX1BPU0lYX01RVUVVRV9TWVNDVEw9eQpDT05GSUdfQlNE X1BST0NFU1NfQUNDVD15CkNPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzPXkKQ09ORklHX1RBU0tT VEFUUz15CkNPTkZJR19UQVNLX0RFTEFZX0FDQ1Q9eQpDT05GSUdfVEFTS19YQUNDVD15CkNPTkZJ R19UQVNLX0lPX0FDQ09VTlRJTkc9eQpDT05GSUdfQVVESVQ9eQpDT05GSUdfQVVESVRTWVNDQUxM PXkKQ09ORklHX0FVRElUX1dBVENIPXkKQ09ORklHX0FVRElUX1RSRUU9eQpDT05GSUdfSEFWRV9H RU5FUklDX0hBUkRJUlFTPXkKCiMKIyBJUlEgc3Vic3lzdGVtCiMKQ09ORklHX0dFTkVSSUNfSEFS RElSUVM9eQpDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIyBDT05GSUdfR0VO RVJJQ19IQVJESVJRU19OT19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKQ09ORklHX0hBVkVfU1BBUlNF X0lSUT15CkNPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CkNPTkZJR19HRU5FUklDX1BFTkRJTkdf SVJRPXkKIyBDT05GSUdfQVVUT19JUlFfQUZGSU5JVFkgaXMgbm90IHNldAojIENPTkZJR19JUlFf UEVSX0NQVSBpcyBub3Qgc2V0CiMgQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORCBpcyBub3Qgc2V0 CkNPTkZJR19TUEFSU0VfSVJRPXkKCiMKIyBSQ1UgU3Vic3lzdGVtCiMKQ09ORklHX1RSRUVfUFJF RU1QVF9SQ1U9eQpDT05GSUdfUFJFRU1QVF9SQ1U9eQojIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90 IHNldApDT05GSUdfUkNVX0ZBTk9VVD02NAojIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5v dCBzZXQKIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAojIENPTkZJR19JS0NPTkZJ RyBpcyBub3Qgc2V0CkNPTkZJR19MT0dfQlVGX1NISUZUPTE3CkNPTkZJR19IQVZFX1VOU1RBQkxF X1NDSEVEX0NMT0NLPXkKQ09ORklHX0NHUk9VUFM9eQojIENPTkZJR19DR1JPVVBfREVCVUcgaXMg bm90IHNldApDT05GSUdfQ0dST1VQX05TPXkKQ09ORklHX0NHUk9VUF9GUkVFWkVSPXkKQ09ORklH X0NHUk9VUF9ERVZJQ0U9eQpDT05GSUdfQ1BVU0VUUz15CkNPTkZJR19QUk9DX1BJRF9DUFVTRVQ9 eQpDT05GSUdfQ0dST1VQX0NQVUFDQ1Q9eQpDT05GSUdfUkVTT1VSQ0VfQ09VTlRFUlM9eQpDT05G SUdfQ0dST1VQX01FTV9SRVNfQ1RMUj15CkNPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX1NXQVA9 eQpDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQX0VOQUJMRUQ9eQpDT05GSUdfQ0dST1VQ X1NDSEVEPXkKQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQpDT05GSUdfUlRfR1JPVVBfU0NIRUQ9 eQpDT05GSUdfQkxLX0NHUk9VUD15CiMgQ09ORklHX0RFQlVHX0JMS19DR1JPVVAgaXMgbm90IHNl dApDT05GSUdfTkFNRVNQQUNFUz15CkNPTkZJR19VVFNfTlM9eQpDT05GSUdfSVBDX05TPXkKQ09O RklHX1VTRVJfTlM9eQpDT05GSUdfUElEX05TPXkKQ09ORklHX05FVF9OUz15CkNPTkZJR19NTV9P V05FUj15CiMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldApDT05GSUdfUkVMQVk9 eQojIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CkNPTkZJR19DQ19PUFRJTUlaRV9G T1JfU0laRT15CkNPTkZJR19TWVNDVEw9eQpDT05GSUdfQU5PTl9JTk9ERVM9eQojIENPTkZJR19F TUJFRERFRCBpcyBub3Qgc2V0CkNPTkZJR19VSUQxNj15CkNPTkZJR19TWVNDVExfU1lTQ0FMTD15 CkNPTkZJR19LQUxMU1lNUz15CkNPTkZJR19LQUxMU1lNU19BTEw9eQpDT05GSUdfS0FMTFNZTVNf RVhUUkFfUEFTUz15CkNPTkZJR19IT1RQTFVHPXkKQ09ORklHX1BSSU5USz15CkNPTkZJR19CVUc9 eQpDT05GSUdfRUxGX0NPUkU9eQpDT05GSUdfUENTUEtSX1BMQVRGT1JNPXkKQ09ORklHX0JBU0Vf RlVMTD15CkNPTkZJR19GVVRFWD15CkNPTkZJR19FUE9MTD15CkNPTkZJR19TSUdOQUxGRD15CkNP TkZJR19USU1FUkZEPXkKQ09ORklHX0VWRU5URkQ9eQpDT05GSUdfU0hNRU09eQpDT05GSUdfQUlP PXkKQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQoKIwojIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVu dHMgQW5kIENvdW50ZXJzCiMKQ09ORklHX1BFUkZfRVZFTlRTPXkKIyBDT05GSUdfUEVSRl9DT1VO VEVSUyBpcyBub3Qgc2V0CiMgQ09ORklHX0RFQlVHX1BFUkZfVVNFX1ZNQUxMT0MgaXMgbm90IHNl dApDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQpDT05GSUdfUENJX1FVSVJLUz15CkNPTkZJR19T TFVCX0RFQlVHPXkKIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiMgQ09ORklHX1NMQUIg aXMgbm90IHNldApDT05GSUdfU0xVQj15CkNPTkZJR19QUk9GSUxJTkc9eQpDT05GSUdfVFJBQ0VQ T0lOVFM9eQpDT05GSUdfT1BST0ZJTEU9bQpDT05GSUdfT1BST0ZJTEVfRVZFTlRfTVVMVElQTEVY PXkKQ09ORklHX0hBVkVfT1BST0ZJTEU9eQpDT05GSUdfS1BST0JFUz15CiMgQ09ORklHX0pVTVBf TEFCRUwgaXMgbm90IHNldApDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUz15 CkNPTkZJR19LUkVUUFJPQkVTPXkKQ09ORklHX1VTRVJfUkVUVVJOX05PVElGSUVSPXkKQ09ORklH X0hBVkVfSU9SRU1BUF9QUk9UPXkKQ09ORklHX0hBVkVfS1BST0JFUz15CkNPTkZJR19IQVZFX0tS RVRQUk9CRVM9eQpDT05GSUdfSEFWRV9PUFRQUk9CRVM9eQpDT05GSUdfSEFWRV9BUkNIX1RSQUNF SE9PSz15CkNPTkZJR19IQVZFX0RNQV9BVFRSUz15CkNPTkZJR19IQVZFX1JFR1NfQU5EX1NUQUNL X0FDQ0VTU19BUEk9eQpDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKQ09ORklHX0hBVkVfSFdf QlJFQUtQT0lOVD15CkNPTkZJR19IQVZFX01JWEVEX0JSRUFLUE9JTlRTX1JFR1M9eQpDT05GSUdf SEFWRV9VU0VSX1JFVFVSTl9OT1RJRklFUj15CkNPTkZJR19IQVZFX1BFUkZfRVZFTlRTX05NST15 CkNPTkZJR19IQVZFX0FSQ0hfSlVNUF9MQUJFTD15CgojCiMgR0NPVi1iYXNlZCBrZXJuZWwgcHJv ZmlsaW5nCiMKIyBDT05GSUdfR0NPVl9LRVJORUwgaXMgbm90IHNldAojIENPTkZJR19IQVZFX0dF TkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKQ09ORklHX1NMQUJJTkZPPXkKQ09ORklHX1JU X01VVEVYRVM9eQpDT05GSUdfQkFTRV9TTUFMTD0wCkNPTkZJR19NT0RVTEVTPXkKIyBDT05GSUdf TU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldApDT05GSUdfTU9EVUxFX1VOTE9BRD15CkNPTkZJ R19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldApD T05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMPXkKQ09ORklHX1NUT1BfTUFDSElORT15CkNPTkZJ R19CTE9DSz15CkNPTkZJR19CTEtfREVWX0JTRz15CiMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZ IGlzIG5vdCBzZXQKIyBDT05GSUdfQkxLX0RFVl9USFJPVFRMSU5HIGlzIG5vdCBzZXQKQ09ORklH X0JMT0NLX0NPTVBBVD15CgojCiMgSU8gU2NoZWR1bGVycwojCkNPTkZJR19JT1NDSEVEX05PT1A9 eQpDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CkNPTkZJR19JT1NDSEVEX0NGUT15CiMgQ09ORklH X0NGUV9HUk9VUF9JT1NDSEVEIGlzIG5vdCBzZXQKQ09ORklHX0RFRkFVTFRfREVBRExJTkU9eQoj IENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CiMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBu b3Qgc2V0CkNPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImRlYWRsaW5lIgpDT05GSUdfUFJFRU1QVF9O T1RJRklFUlM9eQojIENPTkZJR19JTkxJTkVfU1BJTl9UUllMT0NLIGlzIG5vdCBzZXQKIyBDT05G SUdfSU5MSU5FX1NQSU5fVFJZTE9DS19CSCBpcyBub3Qgc2V0CiMgQ09ORklHX0lOTElORV9TUElO X0xPQ0sgaXMgbm90IHNldAojIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLX0JIIGlzIG5vdCBzZXQK IyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19JUlEgaXMgbm90IHNldAojIENPTkZJR19JTkxJTkVf U1BJTl9MT0NLX0lSUVNBVkUgaXMgbm90IHNldAojIENPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0sg aXMgbm90IHNldAojIENPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfQkggaXMgbm90IHNldAojIENP TkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfSVJRIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5MSU5FX1NQ SU5fVU5MT0NLX0lSUVJFU1RPUkUgaXMgbm90IHNldAojIENPTkZJR19JTkxJTkVfUkVBRF9UUllM T0NLIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DSyBpcyBub3Qgc2V0CiMgQ09O RklHX0lOTElORV9SRUFEX0xPQ0tfQkggaXMgbm90IHNldAojIENPTkZJR19JTkxJTkVfUkVBRF9M T0NLX0lSUSBpcyBub3Qgc2V0CiMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfSVJRU0FWRSBpcyBu b3Qgc2V0CiMgQ09ORklHX0lOTElORV9SRUFEX1VOTE9DSyBpcyBub3Qgc2V0CiMgQ09ORklHX0lO TElORV9SRUFEX1VOTE9DS19CSCBpcyBub3Qgc2V0CiMgQ09ORklHX0lOTElORV9SRUFEX1VOTE9D S19JUlEgaXMgbm90IHNldAojIENPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSBp cyBub3Qgc2V0CiMgQ09ORklHX0lOTElORV9XUklURV9UUllMT0NLIGlzIG5vdCBzZXQKIyBDT05G SUdfSU5MSU5FX1dSSVRFX0xPQ0sgaXMgbm90IHNldAojIENPTkZJR19JTkxJTkVfV1JJVEVfTE9D S19CSCBpcyBub3Qgc2V0CiMgQ09ORklHX0lOTElORV9XUklURV9MT0NLX0lSUSBpcyBub3Qgc2V0 CiMgQ09ORklHX0lOTElORV9XUklURV9MT0NLX0lSUVNBVkUgaXMgbm90IHNldAojIENPTkZJR19J TkxJTkVfV1JJVEVfVU5MT0NLIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9D S19CSCBpcyBub3Qgc2V0CiMgQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfSVJRIGlzIG5vdCBz ZXQKIyBDT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9DS19JUlFSRVNUT1JFIGlzIG5vdCBzZXQKQ09O RklHX01VVEVYX1NQSU5fT05fT1dORVI9eQpDT05GSUdfRlJFRVpFUj15CgojCiMgUHJvY2Vzc29y IHR5cGUgYW5kIGZlYXR1cmVzCiMKQ09ORklHX1RJQ0tfT05FU0hPVD15CkNPTkZJR19OT19IWj15 CkNPTkZJR19ISUdIX1JFU19USU1FUlM9eQpDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlM RD15CkNPTkZJR19TTVA9eQojIENPTkZJR19YODZfWDJBUElDIGlzIG5vdCBzZXQKIyBDT05GSUdf WDg2X01QUEFSU0UgaXMgbm90IHNldApDT05GSUdfWDg2X0VYVEVOREVEX1BMQVRGT1JNPXkKIyBD T05GSUdfWDg2X1ZTTVAgaXMgbm90IHNldApDT05GSUdfWDg2X1NVUFBPUlRTX01FTU9SWV9GQUlM VVJFPXkKQ09ORklHX1NDSEVEX09NSVRfRlJBTUVfUE9JTlRFUj15CiMgQ09ORklHX1BBUkFWSVJU X0dVRVNUIGlzIG5vdCBzZXQKQ09ORklHX05PX0JPT1RNRU09eQpDT05GSUdfTUVNVEVTVD15CkNP TkZJR19NSzg9eQojIENPTkZJR19NUFNDIGlzIG5vdCBzZXQKIyBDT05GSUdfTUNPUkUyIGlzIG5v dCBzZXQKIyBDT05GSUdfTUFUT00gaXMgbm90IHNldAojIENPTkZJR19HRU5FUklDX0NQVSBpcyBu b3Qgc2V0CkNPTkZJR19YODZfQ1BVPXkKQ09ORklHX1g4Nl9JTlRFUk5PREVfQ0FDSEVfU0hJRlQ9 NwpDT05GSUdfWDg2X0NNUFhDSEc9eQpDT05GSUdfWDg2X0wxX0NBQ0hFX1NISUZUPTYKQ09ORklH X1g4Nl9YQUREPXkKQ09ORklHX1g4Nl9XUF9XT1JLU19PSz15CkNPTkZJR19YODZfSU5URUxfVVNF UkNPUFk9eQpDT05GSUdfWDg2X1VTRV9QUFJPX0NIRUNLU1VNPXkKQ09ORklHX1g4Nl9UU0M9eQpD T05GSUdfWDg2X0NNUFhDSEc2ND15CkNPTkZJR19YODZfQ01PVj15CkNPTkZJR19YODZfTUlOSU1V TV9DUFVfRkFNSUxZPTY0CkNPTkZJR19YODZfREVCVUdDVExNU1I9eQpDT05GSUdfQ1BVX1NVUF9J TlRFTD15CkNPTkZJR19DUFVfU1VQX0FNRD15CkNPTkZJR19DUFVfU1VQX0NFTlRBVVI9eQpDT05G SUdfSFBFVF9USU1FUj15CkNPTkZJR19IUEVUX0VNVUxBVEVfUlRDPXkKQ09ORklHX0RNST15CkNP TkZJR19HQVJUX0lPTU1VPXkKIyBDT05GSUdfQ0FMR0FSWV9JT01NVSBpcyBub3Qgc2V0CkNPTkZJ R19BTURfSU9NTVU9eQojIENPTkZJR19BTURfSU9NTVVfU1RBVFMgaXMgbm90IHNldApDT05GSUdf U1dJT1RMQj15CkNPTkZJR19JT01NVV9IRUxQRVI9eQpDT05GSUdfSU9NTVVfQVBJPXkKIyBDT05G SUdfTUFYU01QIGlzIG5vdCBzZXQKQ09ORklHX05SX0NQVVM9MgojIENPTkZJR19TQ0hFRF9TTVQg aXMgbm90IHNldApDT05GSUdfU0NIRURfTUM9eQojIENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5H IGlzIG5vdCBzZXQKIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKIyBDT05GSUdfUFJF RU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldApDT05GSUdfUFJFRU1QVD15CkNPTkZJR19YODZfTE9D QUxfQVBJQz15CkNPTkZJR19YODZfSU9fQVBJQz15CkNPTkZJR19YODZfUkVST1VURV9GT1JfQlJP S0VOX0JPT1RfSVJRUz15CkNPTkZJR19YODZfTUNFPXkKIyBDT05GSUdfWDg2X01DRV9JTlRFTCBp cyBub3Qgc2V0CkNPTkZJR19YODZfTUNFX0FNRD15CkNPTkZJR19YODZfTUNFX1RIUkVTSE9MRD15 CiMgQ09ORklHX1g4Nl9NQ0VfSU5KRUNUIGlzIG5vdCBzZXQKIyBDT05GSUdfSThLIGlzIG5vdCBz ZXQKIyBDT05GSUdfTUlDUk9DT0RFIGlzIG5vdCBzZXQKQ09ORklHX1g4Nl9NU1I9eQpDT05GSUdf WDg2X0NQVUlEPXkKQ09ORklHX0FSQ0hfUEhZU19BRERSX1RfNjRCSVQ9eQpDT05GSUdfQVJDSF9E TUFfQUREUl9UXzY0QklUPXkKQ09ORklHX0RJUkVDVF9HQlBBR0VTPXkKQ09ORklHX05VTUE9eQpD T05GSUdfSzhfTlVNQT15CkNPTkZJR19YODZfNjRfQUNQSV9OVU1BPXkKQ09ORklHX05PREVTX1NQ QU5fT1RIRVJfTk9ERVM9eQojIENPTkZJR19OVU1BX0VNVSBpcyBub3Qgc2V0CkNPTkZJR19OT0RF U19TSElGVD02CkNPTkZJR19BUkNIX1BST0NfS0NPUkVfVEVYVD15CkNPTkZJR19BUkNIX1NQQVJT RU1FTV9ERUZBVUxUPXkKQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CkNPTkZJR19BUkNI X1NFTEVDVF9NRU1PUllfTU9ERUw9eQpDT05GSUdfQVJDSF9NRU1PUllfUFJPQkU9eQpDT05GSUdf SUxMRUdBTF9QT0lOVEVSX1ZBTFVFPTB4ZGVhZDAwMDAwMDAwMDAwMApDT05GSUdfU0VMRUNUX01F TU9SWV9NT0RFTD15CkNPTkZJR19TUEFSU0VNRU1fTUFOVUFMPXkKQ09ORklHX1NQQVJTRU1FTT15 CkNPTkZJR19ORUVEX01VTFRJUExFX05PREVTPXkKQ09ORklHX0hBVkVfTUVNT1JZX1BSRVNFTlQ9 eQpDT05GSUdfU1BBUlNFTUVNX0VYVFJFTUU9eQpDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5B QkxFPXkKQ09ORklHX1NQQVJTRU1FTV9BTExPQ19NRU1fTUFQX1RPR0VUSEVSPXkKQ09ORklHX1NQ QVJTRU1FTV9WTUVNTUFQPXkKQ09ORklHX0hBVkVfTUVNQkxPQ0s9eQpDT05GSUdfTUVNT1JZX0hP VFBMVUc9eQpDT05GSUdfTUVNT1JZX0hPVFBMVUdfU1BBUlNFPXkKQ09ORklHX01FTU9SWV9IT1RS RU1PVkU9eQpDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKQ09ORklHX1NQTElUX1BUTE9DS19D UFVTPTQKQ09ORklHX0NPTVBBQ1RJT049eQpDT05GSUdfTUlHUkFUSU9OPXkKQ09ORklHX1BIWVNf QUREUl9UXzY0QklUPXkKQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQpDT05GSUdfQk9VTkNFPXkKQ09O RklHX1ZJUlRfVE9fQlVTPXkKQ09ORklHX01NVV9OT1RJRklFUj15CkNPTkZJR19LU009eQpDT05G SUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTY1NTM2CkNPTkZJR19BUkNIX1NVUFBPUlRTX01FTU9S WV9GQUlMVVJFPXkKQ09ORklHX01FTU9SWV9GQUlMVVJFPXkKIyBDT05GSUdfSFdQT0lTT05fSU5K RUNUIGlzIG5vdCBzZXQKIyBDT05GSUdfWDg2X0NIRUNLX0JJT1NfQ09SUlVQVElPTiBpcyBub3Qg c2V0CkNPTkZJR19YODZfUkVTRVJWRV9MT1c9NjQKQ09ORklHX01UUlI9eQpDT05GSUdfTVRSUl9T QU5JVElaRVI9eQpDT05GSUdfTVRSUl9TQU5JVElaRVJfRU5BQkxFX0RFRkFVTFQ9MApDT05GSUdf TVRSUl9TQU5JVElaRVJfU1BBUkVfUkVHX05SX0RFRkFVTFQ9MQpDT05GSUdfWDg2X1BBVD15CkNP TkZJR19BUkNIX1VTRVNfUEdfVU5DQUNIRUQ9eQojIENPTkZJR19FRkkgaXMgbm90IHNldApDT05G SUdfU0VDQ09NUD15CiMgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SIGlzIG5vdCBzZXQKIyBDT05G SUdfSFpfMTAwIGlzIG5vdCBzZXQKIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKIyBDT05GSUdf SFpfMzAwIGlzIG5vdCBzZXQKQ09ORklHX0haXzEwMDA9eQpDT05GSUdfSFo9MTAwMApDT05GSUdf U0NIRURfSFJUSUNLPXkKQ09ORklHX0tFWEVDPXkKIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qg c2V0CkNPTkZJR19QSFlTSUNBTF9TVEFSVD0weDEwMDAwMDAKQ09ORklHX1JFTE9DQVRBQkxFPXkK Q09ORklHX1BIWVNJQ0FMX0FMSUdOPTB4MTAwMDAwMApDT05GSUdfSE9UUExVR19DUFU9eQojIENP TkZJR19DT01QQVRfVkRTTyBpcyBub3Qgc2V0CiMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qg c2V0CkNPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CkNPTkZJR19BUkNIX0VOQUJM RV9NRU1PUllfSE9UUkVNT1ZFPXkKQ09ORklHX0hBVkVfQVJDSF9FQVJMWV9QRk5fVE9fTklEPXkK Q09ORklHX1VTRV9QRVJDUFVfTlVNQV9OT0RFX0lEPXkKCiMKIyBQb3dlciBtYW5hZ2VtZW50IGFu ZCBBQ1BJIG9wdGlvbnMKIwpDT05GSUdfUE09eQojIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0 CkNPTkZJR19QTV9TTEVFUF9TTVA9eQpDT05GSUdfUE1fU0xFRVA9eQpDT05GSUdfU1VTUEVORF9O VlM9eQpDT05GSUdfU1VTUEVORD15CkNPTkZJR19TVVNQRU5EX0ZSRUVaRVI9eQojIENPTkZJR19I SUJFUk5BVElPTiBpcyBub3Qgc2V0CkNPTkZJR19QTV9SVU5USU1FPXkKQ09ORklHX1BNX09QUz15 CkNPTkZJR19BQ1BJPXkKQ09ORklHX0FDUElfU0xFRVA9eQojIENPTkZJR19BQ1BJX1BST0NGUyBp cyBub3Qgc2V0CiMgQ09ORklHX0FDUElfUFJPQ0ZTX1BPV0VSIGlzIG5vdCBzZXQKIyBDT05GSUdf QUNQSV9QT1dFUl9NRVRFUiBpcyBub3Qgc2V0CiMgQ09ORklHX0FDUElfRUNfREVCVUdGUyBpcyBu b3Qgc2V0CiMgQ09ORklHX0FDUElfUFJPQ19FVkVOVCBpcyBub3Qgc2V0CkNPTkZJR19BQ1BJX0FD PXkKQ09ORklHX0FDUElfQkFUVEVSWT15CkNPTkZJR19BQ1BJX0JVVFRPTj15CkNPTkZJR19BQ1BJ X1ZJREVPPXkKQ09ORklHX0FDUElfRkFOPXkKQ09ORklHX0FDUElfRE9DSz15CkNPTkZJR19BQ1BJ X1BST0NFU1NPUj15CkNPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVPXkKIyBDT05GSUdfQUNQSV9QUk9D RVNTT1JfQUdHUkVHQVRPUiBpcyBub3Qgc2V0CkNPTkZJR19BQ1BJX1RIRVJNQUw9eQpDT05GSUdf QUNQSV9OVU1BPXkKIyBDT05GSUdfQUNQSV9DVVNUT01fRFNEVCBpcyBub3Qgc2V0CkNPTkZJR19B Q1BJX0JMQUNLTElTVF9ZRUFSPTAKIyBDT05GSUdfQUNQSV9ERUJVRyBpcyBub3Qgc2V0CkNPTkZJ R19BQ1BJX1BDSV9TTE9UPXkKQ09ORklHX1g4Nl9QTV9USU1FUj15CkNPTkZJR19BQ1BJX0NPTlRB SU5FUj15CiMgQ09ORklHX0FDUElfSE9UUExVR19NRU1PUlkgaXMgbm90IHNldAojIENPTkZJR19B Q1BJX1NCUyBpcyBub3Qgc2V0CiMgQ09ORklHX0FDUElfSEVEIGlzIG5vdCBzZXQKIyBDT05GSUdf QUNQSV9BUEVJIGlzIG5vdCBzZXQKIyBDT05GSUdfU0ZJIGlzIG5vdCBzZXQKCiMKIyBDUFUgRnJl cXVlbmN5IHNjYWxpbmcKIwpDT05GSUdfQ1BVX0ZSRVE9eQpDT05GSUdfQ1BVX0ZSRVFfVEFCTEU9 eQojIENPTkZJR19DUFVfRlJFUV9ERUJVRyBpcyBub3Qgc2V0CkNPTkZJR19DUFVfRlJFUV9TVEFU PXkKQ09ORklHX0NQVV9GUkVRX1NUQVRfREVUQUlMUz15CiMgQ09ORklHX0NQVV9GUkVRX0RFRkFV TFRfR09WX1BFUkZPUk1BTkNFIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9H T1ZfVVNFUlNQQUNFIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfT05E RU1BTkQgaXMgbm90IHNldApDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfQ09OU0VSVkFUSVZF PXkKQ09ORklHX0NQVV9GUkVRX0dPVl9QRVJGT1JNQU5DRT15CkNPTkZJR19DUFVfRlJFUV9HT1Zf UE9XRVJTQVZFPXkKQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0U9eQpDT05GSUdfQ1BVX0ZS RVFfR09WX09OREVNQU5EPXkKQ09ORklHX0NQVV9GUkVRX0dPVl9DT05TRVJWQVRJVkU9eQoKIwoj IENQVUZyZXEgcHJvY2Vzc29yIGRyaXZlcnMKIwojIENPTkZJR19YODZfUENDX0NQVUZSRVEgaXMg bm90IHNldAojIENPTkZJR19YODZfQUNQSV9DUFVGUkVRIGlzIG5vdCBzZXQKQ09ORklHX1g4Nl9Q T1dFUk5PV19LOD15CiMgQ09ORklHX1g4Nl9TUEVFRFNURVBfQ0VOVFJJTk8gaXMgbm90IHNldAoj IENPTkZJR19YODZfUDRfQ0xPQ0tNT0QgaXMgbm90IHNldAoKIwojIHNoYXJlZCBvcHRpb25zCiMK IyBDT05GSUdfWDg2X1NQRUVEU1RFUF9MSUIgaXMgbm90IHNldApDT05GSUdfQ1BVX0lETEU9eQpD T05GSUdfQ1BVX0lETEVfR09WX0xBRERFUj15CkNPTkZJR19DUFVfSURMRV9HT1ZfTUVOVT15CiMg Q09ORklHX0lOVEVMX0lETEUgaXMgbm90IHNldAoKIwojIE1lbW9yeSBwb3dlciBzYXZpbmdzCiMK IyBDT05GSUdfSTczMDBfSURMRSBpcyBub3Qgc2V0CgojCiMgQnVzIG9wdGlvbnMgKFBDSSBldGMu KQojCkNPTkZJR19QQ0k9eQpDT05GSUdfUENJX0RJUkVDVD15CkNPTkZJR19QQ0lfTU1DT05GSUc9 eQpDT05GSUdfUENJX0RPTUFJTlM9eQojIENPTkZJR19QQ0lfQ05CMjBMRV9RVUlSSyBpcyBub3Qg c2V0CkNPTkZJR19ETUFSPXkKQ09ORklHX0RNQVJfREVGQVVMVF9PTj15CkNPTkZJR19ETUFSX0ZM T1BQWV9XQT15CkNPTkZJR19JTlRSX1JFTUFQPXkKQ09ORklHX1BDSUVQT1JUQlVTPXkKIyBDT05G SUdfSE9UUExVR19QQ0lfUENJRSBpcyBub3Qgc2V0CkNPTkZJR19QQ0lFQUVSPXkKQ09ORklHX1BD SUVfRUNSQz15CkNPTkZJR19QQ0lFQUVSX0lOSkVDVD15CkNPTkZJR19QQ0lFQVNQTT15CiMgQ09O RklHX1BDSUVBU1BNX0RFQlVHIGlzIG5vdCBzZXQKQ09ORklHX1BDSUVfUE1FPXkKQ09ORklHX0FS Q0hfU1VQUE9SVFNfTVNJPXkKQ09ORklHX1BDSV9NU0k9eQojIENPTkZJR19QQ0lfREVCVUcgaXMg bm90IHNldAojIENPTkZJR19QQ0lfU1RVQiBpcyBub3Qgc2V0CkNPTkZJR19IVF9JUlE9eQojIENP TkZJR19QQ0lfSU9WIGlzIG5vdCBzZXQKQ09ORklHX1BDSV9JT0FQSUM9eQpDT05GSUdfSVNBX0RN QV9BUEk9eQpDT05GSUdfQU1EX05CPXkKQ09ORklHX1BDQ0FSRD15CkNPTkZJR19QQ01DSUE9eQpD T05GSUdfUENNQ0lBX0xPQURfQ0lTPXkKQ09ORklHX0NBUkRCVVM9eQoKIwojIFBDLWNhcmQgYnJp ZGdlcwojCiMgQ09ORklHX1lFTlRBIGlzIG5vdCBzZXQKIyBDT05GSUdfUEQ2NzI5IGlzIG5vdCBz ZXQKIyBDT05GSUdfSTgyMDkyIGlzIG5vdCBzZXQKQ09ORklHX0hPVFBMVUdfUENJPXkKIyBDT05G SUdfSE9UUExVR19QQ0lfRkFLRSBpcyBub3Qgc2V0CiMgQ09ORklHX0hPVFBMVUdfUENJX0FDUEkg aXMgbm90IHNldAojIENPTkZJR19IT1RQTFVHX1BDSV9DUENJIGlzIG5vdCBzZXQKIyBDT05GSUdf SE9UUExVR19QQ0lfU0hQQyBpcyBub3Qgc2V0CgojCiMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMg LyBFbXVsYXRpb25zCiMKQ09ORklHX0JJTkZNVF9FTEY9eQpDT05GSUdfQ09NUEFUX0JJTkZNVF9F TEY9eQojIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CiMg Q09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CkNPTkZJR19CSU5GTVRfTUlTQz15CkNPTkZJR19J QTMyX0VNVUxBVElPTj15CiMgQ09ORklHX0lBMzJfQU9VVCBpcyBub3Qgc2V0CkNPTkZJR19DT01Q QVQ9eQpDT05GSUdfQ09NUEFUX0ZPUl9VNjRfQUxJR05NRU5UPXkKQ09ORklHX1NZU1ZJUENfQ09N UEFUPXkKQ09ORklHX0hBVkVfVEVYVF9QT0tFX1NNUD15CkNPTkZJR19ORVQ9eQpDT05GSUdfQ09N UEFUX05FVExJTktfTUVTU0FHRVM9eQoKIwojIE5ldHdvcmtpbmcgb3B0aW9ucwojCkNPTkZJR19Q QUNLRVQ9eQpDT05GSUdfVU5JWD15CkNPTkZJR19YRlJNPXkKQ09ORklHX1hGUk1fVVNFUj15CiMg Q09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CkNPTkZJR19YRlJNX01JR1JBVEU9eQoj IENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldApDT05GSUdfWEZSTV9JUENPTVA9eQpD T05GSUdfTkVUX0tFWT1tCkNPTkZJR19ORVRfS0VZX01JR1JBVEU9eQpDT05GSUdfSU5FVD15CkNP TkZJR19JUF9NVUxUSUNBU1Q9eQpDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKQ09ORklHX0FT S19JUF9GSUJfSEFTSD15CiMgQ09ORklHX0lQX0ZJQl9UUklFIGlzIG5vdCBzZXQKQ09ORklHX0lQ X0ZJQl9IQVNIPXkKQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUz15CkNPTkZJR19JUF9ST1VURV9N VUxUSVBBVEg9eQpDT05GSUdfSVBfUk9VVEVfVkVSQk9TRT15CkNPTkZJR19JUF9QTlA9eQpDT05G SUdfSVBfUE5QX0RIQ1A9eQojIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldApDT05GSUdf SVBfUE5QX1JBUlA9eQpDT05GSUdfTkVUX0lQSVA9bQojIENPTkZJR19ORVRfSVBHUkVfREVNVVgg aXMgbm90IHNldApDT05GSUdfSVBfTVJPVVRFPXkKQ09ORklHX0lQX01ST1VURV9NVUxUSVBMRV9U QUJMRVM9eQpDT05GSUdfSVBfUElNU01fVjE9eQpDT05GSUdfSVBfUElNU01fVjI9eQojIENPTkZJ R19BUlBEIGlzIG5vdCBzZXQKQ09ORklHX1NZTl9DT09LSUVTPXkKQ09ORklHX0lORVRfQUg9eQpD T05GSUdfSU5FVF9FU1A9eQpDT05GSUdfSU5FVF9JUENPTVA9eQpDT05GSUdfSU5FVF9YRlJNX1RV Tk5FTD15CkNPTkZJR19JTkVUX1RVTk5FTD15CkNPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BP UlQ9eQpDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKQ09ORklHX0lORVRfWEZSTV9NT0RF X0JFRVQ9eQpDT05GSUdfSU5FVF9MUk89eQpDT05GSUdfSU5FVF9ESUFHPXkKQ09ORklHX0lORVRf VENQX0RJQUc9eQpDT05GSUdfVENQX0NPTkdfQURWQU5DRUQ9eQojIENPTkZJR19UQ1BfQ09OR19C SUMgaXMgbm90IHNldApDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQojIENPTkZJR19UQ1BfQ09OR19X RVNUV09PRCBpcyBub3Qgc2V0CkNPTkZJR19UQ1BfQ09OR19IVENQPXkKQ09ORklHX1RDUF9DT05H X0hTVENQPXkKIyBDT05GSUdfVENQX0NPTkdfSFlCTEEgaXMgbm90IHNldAojIENPTkZJR19UQ1Bf Q09OR19WRUdBUyBpcyBub3Qgc2V0CiMgQ09ORklHX1RDUF9DT05HX1NDQUxBQkxFIGlzIG5vdCBz ZXQKIyBDT05GSUdfVENQX0NPTkdfTFAgaXMgbm90IHNldAojIENPTkZJR19UQ1BfQ09OR19WRU5P IGlzIG5vdCBzZXQKIyBDT05GSUdfVENQX0NPTkdfWUVBSCBpcyBub3Qgc2V0CiMgQ09ORklHX1RD UF9DT05HX0lMTElOT0lTIGlzIG5vdCBzZXQKIyBDT05GSUdfREVGQVVMVF9DVUJJQyBpcyBub3Qg c2V0CkNPTkZJR19ERUZBVUxUX0hUQ1A9eQojIENPTkZJR19ERUZBVUxUX1JFTk8gaXMgbm90IHNl dApDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iaHRjcCIKIyBDT05GSUdfVENQX01ENVNJRyBpcyBu b3Qgc2V0CkNPTkZJR19JUFY2PXkKQ09ORklHX0lQVjZfUFJJVkFDWT15CkNPTkZJR19JUFY2X1JP VVRFUl9QUkVGPXkKQ09ORklHX0lQVjZfUk9VVEVfSU5GTz15CkNPTkZJR19JUFY2X09QVElNSVNU SUNfREFEPXkKQ09ORklHX0lORVQ2X0FIPXkKQ09ORklHX0lORVQ2X0VTUD15CkNPTkZJR19JTkVU Nl9JUENPTVA9bQpDT05GSUdfSVBWNl9NSVA2PXkKQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMPW0K Q09ORklHX0lORVQ2X1RVTk5FTD1tCkNPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUPXkK Q09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9eQpDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JF RVQ9eQpDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OPW0KQ09ORklHX0lQ VjZfU0lUPXkKIyBDT05GSUdfSVBWNl9TSVRfNlJEIGlzIG5vdCBzZXQKQ09ORklHX0lQVjZfTkRJ U0NfTk9ERVRZUEU9eQpDT05GSUdfSVBWNl9UVU5ORUw9bQpDT05GSUdfSVBWNl9NVUxUSVBMRV9U QUJMRVM9eQpDT05GSUdfSVBWNl9TVUJUUkVFUz15CkNPTkZJR19JUFY2X01ST1VURT15CiMgQ09O RklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CkNPTkZJR19JUFY2X1BJ TVNNX1YyPXkKIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldApDT05GSUdfTkVUV09SS19TRUNN QVJLPXkKIyBDT05GSUdfTkVUV09SS19QSFlfVElNRVNUQU1QSU5HIGlzIG5vdCBzZXQKQ09ORklH X05FVEZJTFRFUj15CiMgQ09ORklHX05FVEZJTFRFUl9ERUJVRyBpcyBub3Qgc2V0CkNPTkZJR19O RVRGSUxURVJfQURWQU5DRUQ9eQpDT05GSUdfQlJJREdFX05FVEZJTFRFUj15CgojCiMgQ29yZSBO ZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgojCkNPTkZJR19ORVRGSUxURVJfTkVUTElOSz15CkNPTkZJ R19ORVRGSUxURVJfTkVUTElOS19RVUVVRT1tCkNPTkZJR19ORVRGSUxURVJfTkVUTElOS19MT0c9 bQpDT05GSUdfTkZfQ09OTlRSQUNLPXkKQ09ORklHX05GX0NPTk5UUkFDS19NQVJLPXkKQ09ORklH X05GX0NPTk5UUkFDS19TRUNNQVJLPXkKQ09ORklHX05GX0NPTk5UUkFDS19aT05FUz15CkNPTkZJ R19ORl9DT05OVFJBQ0tfRVZFTlRTPXkKQ09ORklHX05GX0NUX1BST1RPX0RDQ1A9bQpDT05GSUdf TkZfQ1RfUFJPVE9fR1JFPW0KQ09ORklHX05GX0NUX1BST1RPX1NDVFA9bQpDT05GSUdfTkZfQ1Rf UFJPVE9fVURQTElURT1tCkNPTkZJR19ORl9DT05OVFJBQ0tfQU1BTkRBPW0KQ09ORklHX05GX0NP Tk5UUkFDS19GVFA9bQpDT05GSUdfTkZfQ09OTlRSQUNLX0gzMjM9bQpDT05GSUdfTkZfQ09OTlRS QUNLX0lSQz1tCkNPTkZJR19ORl9DT05OVFJBQ0tfTkVUQklPU19OUz1tCkNPTkZJR19ORl9DT05O VFJBQ0tfUFBUUD1tCkNPTkZJR19ORl9DT05OVFJBQ0tfU0FORT1tCkNPTkZJR19ORl9DT05OVFJB Q0tfU0lQPW0KQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KQ09ORklHX05GX0NUX05FVExJTks9 eQpDT05GSUdfTkVURklMVEVSX1RQUk9YWT1tCkNPTkZJR19ORVRGSUxURVJfWFRBQkxFUz15Cgoj CiMgWHRhYmxlcyBjb21iaW5lZCBtb2R1bGVzCiMKQ09ORklHX05FVEZJTFRFUl9YVF9NQVJLPXkK Q09ORklHX05FVEZJTFRFUl9YVF9DT05OTUFSSz15CgojCiMgWHRhYmxlcyB0YXJnZXRzCiMKQ09O RklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0hFQ0tTVU09bQpDT05GSUdfTkVURklMVEVSX1hUX1RB UkdFVF9DTEFTU0lGWT1tCkNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLPXkKQ09O RklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTlNFQ01BUks9bQpDT05GSUdfTkVURklMVEVSX1hU X1RBUkdFVF9DVD1tCkNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0RTQ1A9eQpDT05GSUdfTkVU RklMVEVSX1hUX1RBUkdFVF9ITD1tCkNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0lETEVUSU1F Uj1tCkNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0xFRD1tCkNPTkZJR19ORVRGSUxURVJfWFRf VEFSR0VUX01BUks9eQpDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRz1tCkNPTkZJR19O RVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUU9eQpDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9O T1RSQUNLPW0KQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfUkFURUVTVD1tCkNPTkZJR19ORVRG SUxURVJfWFRfVEFSR0VUX1RFRT1tCkNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RQUk9YWT1t CkNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RSQUNFPW0KQ09ORklHX05FVEZJTFRFUl9YVF9U QVJHRVRfU0VDTUFSSz1tCkNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUz1tCkNPTkZJ R19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE9QVFNUUklQPW0KCiMKIyBYdGFibGVzIG1hdGNoZXMK IwpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NMVVNURVI9bQpDT05GSUdfTkVURklMVEVSX1hU X01BVENIX0NPTU1FTlQ9eQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5CWVRFUz1tCkNP TkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkxJTUlUPXkKQ09ORklHX05FVEZJTFRFUl9YVF9N QVRDSF9DT05OTUFSSz15CkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLPXkKQ09O RklHX05FVEZJTFRFUl9YVF9NQVRDSF9DUFU9bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RD Q1A9bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RTQ1A9eQpDT05GSUdfTkVURklMVEVSX1hU X01BVENIX0VTUD1tCkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPXkKQ09ORklH X05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hM PW0KQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFPXkKQ09ORklHX05FVEZJTFRFUl9Y VF9NQVRDSF9MRU5HVEg9bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPXkKQ09ORklH X05FVEZJTFRFUl9YVF9NQVRDSF9NQUM9eQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUks9 eQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD15CkNPTkZJR19ORVRGSUxURVJf WFRfTUFUQ0hfT1NGPW0KQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9PV05FUj15CkNPTkZJR19O RVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZPW0KQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QSFlT REVWPW0KQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFPW0KQ09ORklHX05FVEZJTFRF Ul9YVF9NQVRDSF9RVU9UQT1tCkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkFURUVTVD1tCkNP TkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVBTE09bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENI X1JFQ0VOVD1tCkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU0NUUD1tCkNPTkZJR19ORVRGSUxU RVJfWFRfTUFUQ0hfU09DS0VUPW0KQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFURT15CkNP TkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDPXkKQ09ORklHX05FVEZJTFRFUl9YVF9N QVRDSF9TVFJJTkc9eQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RDUE1TUz1tCkNPTkZJR19O RVRGSUxURVJfWFRfTUFUQ0hfVElNRT1tCkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVTMyPW0K IyBDT05GSUdfSVBfVlMgaXMgbm90IHNldAoKIwojIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlv bgojCkNPTkZJR19ORl9ERUZSQUdfSVBWND15CkNPTkZJR19ORl9DT05OVFJBQ0tfSVBWND15CkNP TkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQ9eQpDT05GSUdfSVBfTkZfUVVFVUU9bQpDT05G SUdfSVBfTkZfSVBUQUJMRVM9eQpDT05GSUdfSVBfTkZfTUFUQ0hfQUREUlRZUEU9eQpDT05GSUdf SVBfTkZfTUFUQ0hfQUg9bQpDT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KQ09ORklHX0lQX05GX01B VENIX1RUTD1tCkNPTkZJR19JUF9ORl9GSUxURVI9eQpDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVD VD15CkNPTkZJR19JUF9ORl9UQVJHRVRfTE9HPXkKQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HPW0K Q09ORklHX05GX05BVD15CkNPTkZJR19ORl9OQVRfTkVFREVEPXkKQ09ORklHX0lQX05GX1RBUkdF VF9NQVNRVUVSQURFPW0KQ09ORklHX0lQX05GX1RBUkdFVF9ORVRNQVA9bQpDT05GSUdfSVBfTkZf VEFSR0VUX1JFRElSRUNUPW0KQ09ORklHX05GX05BVF9TTk1QX0JBU0lDPW0KQ09ORklHX05GX05B VF9QUk9UT19EQ0NQPW0KQ09ORklHX05GX05BVF9QUk9UT19HUkU9bQpDT05GSUdfTkZfTkFUX1BS T1RPX1VEUExJVEU9bQpDT05GSUdfTkZfTkFUX1BST1RPX1NDVFA9bQpDT05GSUdfTkZfTkFUX0ZU UD1tCkNPTkZJR19ORl9OQVRfSVJDPW0KQ09ORklHX05GX05BVF9URlRQPW0KQ09ORklHX05GX05B VF9BTUFOREE9bQpDT05GSUdfTkZfTkFUX1BQVFA9bQpDT05GSUdfTkZfTkFUX0gzMjM9bQpDT05G SUdfTkZfTkFUX1NJUD1tCkNPTkZJR19JUF9ORl9NQU5HTEU9eQpDT05GSUdfSVBfTkZfVEFSR0VU X0NMVVNURVJJUD1tCkNPTkZJR19JUF9ORl9UQVJHRVRfRUNOPW0KQ09ORklHX0lQX05GX1RBUkdF VF9UVEw9bQpDT05GSUdfSVBfTkZfUkFXPW0KQ09ORklHX0lQX05GX1NFQ1VSSVRZPW0KQ09ORklH X0lQX05GX0FSUFRBQkxFUz1tCkNPTkZJR19JUF9ORl9BUlBGSUxURVI9bQpDT05GSUdfSVBfTkZf QVJQX01BTkdMRT1tCgojCiMgSVB2NjogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KIwpDT05GSUdf TkZfREVGUkFHX0lQVjY9eQpDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9eQpDT05GSUdfSVA2X05G X1FVRVVFPW0KQ09ORklHX0lQNl9ORl9JUFRBQkxFUz15CkNPTkZJR19JUDZfTkZfTUFUQ0hfQUg9 bQpDT05GSUdfSVA2X05GX01BVENIX0VVSTY0PW0KQ09ORklHX0lQNl9ORl9NQVRDSF9GUkFHPW0K Q09ORklHX0lQNl9ORl9NQVRDSF9PUFRTPW0KQ09ORklHX0lQNl9ORl9NQVRDSF9ITD1tCkNPTkZJ R19JUDZfTkZfTUFUQ0hfSVBWNkhFQURFUj1tCkNPTkZJR19JUDZfTkZfTUFUQ0hfTUg9bQpDT05G SUdfSVA2X05GX01BVENIX1JUPW0KQ09ORklHX0lQNl9ORl9UQVJHRVRfSEw9bQpDT05GSUdfSVA2 X05GX1RBUkdFVF9MT0c9bQpDT05GSUdfSVA2X05GX0ZJTFRFUj15CkNPTkZJR19JUDZfTkZfVEFS R0VUX1JFSkVDVD15CkNPTkZJR19JUDZfTkZfTUFOR0xFPW0KQ09ORklHX0lQNl9ORl9SQVc9bQpD T05GSUdfSVA2X05GX1NFQ1VSSVRZPW0KQ09ORklHX0JSSURHRV9ORl9FQlRBQkxFUz1tCkNPTkZJ R19CUklER0VfRUJUX0JST1VURT1tCkNPTkZJR19CUklER0VfRUJUX1RfRklMVEVSPW0KQ09ORklH X0JSSURHRV9FQlRfVF9OQVQ9bQpDT05GSUdfQlJJREdFX0VCVF84MDJfMz1tCkNPTkZJR19CUklE R0VfRUJUX0FNT05HPW0KQ09ORklHX0JSSURHRV9FQlRfQVJQPW0KQ09ORklHX0JSSURHRV9FQlRf SVA9bQpDT05GSUdfQlJJREdFX0VCVF9JUDY9bQpDT05GSUdfQlJJREdFX0VCVF9MSU1JVD1tCkNP TkZJR19CUklER0VfRUJUX01BUks9bQpDT05GSUdfQlJJREdFX0VCVF9QS1RUWVBFPW0KQ09ORklH X0JSSURHRV9FQlRfU1RQPW0KQ09ORklHX0JSSURHRV9FQlRfVkxBTj1tCkNPTkZJR19CUklER0Vf RUJUX0FSUFJFUExZPW0KQ09ORklHX0JSSURHRV9FQlRfRE5BVD1tCkNPTkZJR19CUklER0VfRUJU X01BUktfVD1tCkNPTkZJR19CUklER0VfRUJUX1JFRElSRUNUPW0KQ09ORklHX0JSSURHRV9FQlRf U05BVD1tCkNPTkZJR19CUklER0VfRUJUX0xPRz1tCkNPTkZJR19CUklER0VfRUJUX1VMT0c9bQpD T05GSUdfQlJJREdFX0VCVF9ORkxPRz1tCiMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAojIENP TkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKIyBDT05GSUdf VElQQyBpcyBub3Qgc2V0CiMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiMgQ09ORklHX0wyVFAgaXMg bm90IHNldApDT05GSUdfU1RQPW0KQ09ORklHX0dBUlA9bQpDT05GSUdfQlJJREdFPW0KQ09ORklH X0JSSURHRV9JR01QX1NOT09QSU5HPXkKIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CkNPTkZJ R19WTEFOXzgwMjFRPW0KQ09ORklHX1ZMQU5fODAyMVFfR1ZSUD15CiMgQ09ORklHX0RFQ05FVCBp cyBub3Qgc2V0CkNPTkZJR19MTEM9bQojIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKIyBDT05GSUdf SVBYIGlzIG5vdCBzZXQKIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAojIENPTkZJR19YMjUgaXMg bm90IHNldAojIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBz ZXQKIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CiMgQ09ORklHX1BIT05FVCBpcyBub3Qg c2V0CiMgQ09ORklHX0lFRUU4MDIxNTQgaXMgbm90IHNldApDT05GSUdfTkVUX1NDSEVEPXkKCiMK IyBRdWV1ZWluZy9TY2hlZHVsaW5nCiMKQ09ORklHX05FVF9TQ0hfQ0JRPW0KQ09ORklHX05FVF9T Q0hfSFRCPW0KQ09ORklHX05FVF9TQ0hfSEZTQz1tCkNPTkZJR19ORVRfU0NIX1BSSU89bQpDT05G SUdfTkVUX1NDSF9NVUxUSVE9bQpDT05GSUdfTkVUX1NDSF9SRUQ9bQpDT05GSUdfTkVUX1NDSF9T RlE9bQpDT05GSUdfTkVUX1NDSF9URVFMPW0KQ09ORklHX05FVF9TQ0hfVEJGPW0KQ09ORklHX05F VF9TQ0hfR1JFRD1tCkNPTkZJR19ORVRfU0NIX0RTTUFSSz1tCkNPTkZJR19ORVRfU0NIX05FVEVN PW0KQ09ORklHX05FVF9TQ0hfRFJSPW0KQ09ORklHX05FVF9TQ0hfSU5HUkVTUz1tCgojCiMgQ2xh c3NpZmljYXRpb24KIwpDT05GSUdfTkVUX0NMUz15CkNPTkZJR19ORVRfQ0xTX0JBU0lDPW0KQ09O RklHX05FVF9DTFNfVENJTkRFWD1tCkNPTkZJR19ORVRfQ0xTX1JPVVRFND1tCkNPTkZJR19ORVRf Q0xTX1JPVVRFPXkKQ09ORklHX05FVF9DTFNfRlc9bQpDT05GSUdfTkVUX0NMU19VMzI9bQpDT05G SUdfQ0xTX1UzMl9QRVJGPXkKQ09ORklHX0NMU19VMzJfTUFSSz15CkNPTkZJR19ORVRfQ0xTX1JT VlA9bQpDT05GSUdfTkVUX0NMU19SU1ZQNj1tCkNPTkZJR19ORVRfQ0xTX0ZMT1c9bQpDT05GSUdf TkVUX0NMU19DR1JPVVA9bQpDT05GSUdfTkVUX0VNQVRDSD15CkNPTkZJR19ORVRfRU1BVENIX1NU QUNLPTMyCkNPTkZJR19ORVRfRU1BVENIX0NNUD1tCkNPTkZJR19ORVRfRU1BVENIX05CWVRFPW0K Q09ORklHX05FVF9FTUFUQ0hfVTMyPW0KQ09ORklHX05FVF9FTUFUQ0hfTUVUQT1tCkNPTkZJR19O RVRfRU1BVENIX1RFWFQ9bQpDT05GSUdfTkVUX0NMU19BQ1Q9eQpDT05GSUdfTkVUX0FDVF9QT0xJ Q0U9bQpDT05GSUdfTkVUX0FDVF9HQUNUPW0KQ09ORklHX0dBQ1RfUFJPQj15CkNPTkZJR19ORVRf QUNUX01JUlJFRD1tCkNPTkZJR19ORVRfQUNUX0lQVD1tCkNPTkZJR19ORVRfQUNUX05BVD1tCkNP TkZJR19ORVRfQUNUX1BFRElUPW0KQ09ORklHX05FVF9BQ1RfU0lNUD1tCkNPTkZJR19ORVRfQUNU X1NLQkVESVQ9bQojIENPTkZJR19ORVRfQUNUX0NTVU0gaXMgbm90IHNldApDT05GSUdfTkVUX0NM U19JTkQ9eQpDT05GSUdfTkVUX1NDSF9GSUZPPXkKIyBDT05GSUdfRENCIGlzIG5vdCBzZXQKIyBD T05GSUdfRE5TX1JFU09MVkVSIGlzIG5vdCBzZXQKQ09ORklHX1JQUz15CgojCiMgTmV0d29yayB0 ZXN0aW5nCiMKQ09ORklHX05FVF9QS1RHRU49bQpDT05GSUdfTkVUX1RDUFBST0JFPW0KQ09ORklH X05FVF9EUk9QX01PTklUT1I9eQojIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiMgQ09ORklH X0NBTiBpcyBub3Qgc2V0CiMgQ09ORklHX0lSREEgaXMgbm90IHNldApDT05GSUdfQlQ9eQpDT05G SUdfQlRfTDJDQVA9bQpDT05GSUdfQlRfU0NPPW0KQ09ORklHX0JUX1JGQ09NTT1tCkNPTkZJR19C VF9SRkNPTU1fVFRZPXkKQ09ORklHX0JUX0JORVA9bQpDT05GSUdfQlRfQk5FUF9NQ19GSUxURVI9 eQpDT05GSUdfQlRfQk5FUF9QUk9UT19GSUxURVI9eQpDT05GSUdfQlRfSElEUD1tCgojCiMgQmx1 ZXRvb3RoIGRldmljZSBkcml2ZXJzCiMKQ09ORklHX0JUX0hDSUJUVVNCPW0KQ09ORklHX0JUX0hD SUJUU0RJTz1tCkNPTkZJR19CVF9IQ0lVQVJUPW0KQ09ORklHX0JUX0hDSVVBUlRfSDQ9eQpDT05G SUdfQlRfSENJVUFSVF9CQ1NQPXkKIyBDT05GSUdfQlRfSENJVUFSVF9BVEgzSyBpcyBub3Qgc2V0 CkNPTkZJR19CVF9IQ0lVQVJUX0xMPXkKQ09ORklHX0JUX0hDSUJDTTIwM1g9bQpDT05GSUdfQlRf SENJQlBBMTBYPW0KQ09ORklHX0JUX0hDSUJGVVNCPW0KQ09ORklHX0JUX0hDSURUTDE9bQpDT05G SUdfQlRfSENJQlQzQz1tCkNPTkZJR19CVF9IQ0lCTFVFQ0FSRD1tCkNPTkZJR19CVF9IQ0lCVFVB UlQ9bQpDT05GSUdfQlRfSENJVkhDST1tCkNPTkZJR19CVF9NUlZMPW0KQ09ORklHX0JUX01SVkxf U0RJTz1tCkNPTkZJR19CVF9BVEgzSz1tCiMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKQ09O RklHX0ZJQl9SVUxFUz15CkNPTkZJR19XSVJFTEVTUz15CkNPTkZJR19XRVhUX0NPUkU9eQpDT05G SUdfV0VYVF9QUk9DPXkKQ09ORklHX0NGRzgwMjExPXkKIyBDT05GSUdfTkw4MDIxMV9URVNUTU9E RSBpcyBub3Qgc2V0CiMgQ09ORklHX0NGRzgwMjExX0RFVkVMT1BFUl9XQVJOSU5HUyBpcyBub3Qg c2V0CiMgQ09ORklHX0NGRzgwMjExX1JFR19ERUJVRyBpcyBub3Qgc2V0CkNPTkZJR19DRkc4MDIx MV9ERUZBVUxUX1BTPXkKIyBDT05GSUdfQ0ZHODAyMTFfREVCVUdGUyBpcyBub3Qgc2V0CiMgQ09O RklHX0NGRzgwMjExX0lOVEVSTkFMX1JFR0RCIGlzIG5vdCBzZXQKQ09ORklHX0NGRzgwMjExX1dF WFQ9eQpDT05GSUdfV0lSRUxFU1NfRVhUX1NZU0ZTPXkKQ09ORklHX0xJQjgwMjExPXkKIyBDT05G SUdfTElCODAyMTFfREVCVUcgaXMgbm90IHNldApDT05GSUdfTUFDODAyMTE9eQpDT05GSUdfTUFD ODAyMTFfSEFTX1JDPXkKQ09ORklHX01BQzgwMjExX1JDX01JTlNUUkVMPXkKQ09ORklHX01BQzgw MjExX1JDX01JTlNUUkVMX0hUPXkKQ09ORklHX01BQzgwMjExX1JDX0RFRkFVTFRfTUlOU1RSRUw9 eQpDT05GSUdfTUFDODAyMTFfUkNfREVGQVVMVD0ibWluc3RyZWxfaHQiCiMgQ09ORklHX01BQzgw MjExX01FU0ggaXMgbm90IHNldApDT05GSUdfTUFDODAyMTFfTEVEUz15CiMgQ09ORklHX01BQzgw MjExX0RFQlVHRlMgaXMgbm90IHNldAojIENPTkZJR19NQUM4MDIxMV9ERUJVR19NRU5VIGlzIG5v dCBzZXQKIyBDT05GSUdfV0lNQVggaXMgbm90IHNldApDT05GSUdfUkZLSUxMPXkKQ09ORklHX1JG S0lMTF9MRURTPXkKQ09ORklHX1JGS0lMTF9JTlBVVD15CiMgQ09ORklHX05FVF85UCBpcyBub3Qg c2V0CiMgQ09ORklHX0NBSUYgaXMgbm90IHNldAojIENPTkZJR19DRVBIX0xJQiBpcyBub3Qgc2V0 CgojCiMgRGV2aWNlIERyaXZlcnMKIwoKIwojIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKIwpDT05G SUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgojIENPTkZJR19ERVZUTVBGUyBp cyBub3Qgc2V0CkNPTkZJR19TVEFOREFMT05FPXkKIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9C VUlMRCBpcyBub3Qgc2V0CkNPTkZJR19GV19MT0FERVI9eQojIENPTkZJR19GSVJNV0FSRV9JTl9L RVJORUwgaXMgbm90IHNldApDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKIyBDT05GSUdfREVCVUdf RFJJVkVSIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKIyBDT05G SUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldApDT05GSUdfQ09OTkVDVE9SPXkKQ09ORklHX1BS T0NfRVZFTlRTPXkKIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFSUE9SVCBpcyBu b3Qgc2V0CkNPTkZJR19QTlA9eQojIENPTkZJR19QTlBfREVCVUdfTUVTU0FHRVMgaXMgbm90IHNl dAoKIwojIFByb3RvY29scwojCkNPTkZJR19QTlBBQ1BJPXkKQ09ORklHX0JMS19ERVY9eQojIENP TkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0 CiMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CiMgQ09ORklHX0JMS19ERVZfREFD OTYwIGlzIG5vdCBzZXQKIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKIyBDT05GSUdf QkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKQ09ORklHX0JMS19ERVZfTE9PUD15CkNPTkZJ R19CTEtfREVWX0NSWVBUT0xPT1A9eQojIENPTkZJR19CTEtfREVWX0RSQkQgaXMgbm90IHNldAoj IENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CiMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5v dCBzZXQKIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CkNPTkZJR19CTEtfREVWX1JBTT15 CkNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0yCkNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTUyNDI4 OAojIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CkNPTkZJR19DRFJPTV9QS1RDRFZEPXkK Q09ORklHX0NEUk9NX1BLVENEVkRfQlVGRkVSUz0xNgojIENPTkZJR19DRFJPTV9QS1RDRFZEX1dD QUNIRSBpcyBub3Qgc2V0CiMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CkNPTkZJR19W SVJUSU9fQkxLPW0KIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiMgQ09ORklHX0JMS19E RVZfUkJEIGlzIG5vdCBzZXQKIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKQ09ORklH X0hBVkVfSURFPXkKIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKCiMKIyBTQ1NJIGRldmljZSBzdXBw b3J0CiMKQ09ORklHX1NDU0lfTU9EPXkKIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CkNP TkZJR19TQ1NJPXkKQ09ORklHX1NDU0lfRE1BPXkKIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNl dAojIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX1BST0NfRlMg aXMgbm90IHNldAoKIwojIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCiMK Q09ORklHX0JMS19ERVZfU0Q9eQojIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKIyBDT05G SUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKQ09ORklHX0JMS19ERVZfU1I9eQpDT05GSUdfQkxL X0RFVl9TUl9WRU5ET1I9eQpDT05GSUdfQ0hSX0RFVl9TRz15CiMgQ09ORklHX0NIUl9ERVZfU0NI IGlzIG5vdCBzZXQKQ09ORklHX1NDU0lfTVVMVElfTFVOPXkKQ09ORklHX1NDU0lfQ09OU1RBTlRT PXkKIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKQ09ORklHX1NDU0lfU0NBTl9BU1lO Qz15CkNPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCgojCiMgU0NTSSBUcmFuc3BvcnRzCiMKIyBDT05G SUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5v dCBzZXQKIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0CiMgQ09ORklHX1NDU0lf U0FTX0FUVFJTIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQK IyBDT05GSUdfU0NTSV9TUlBfQVRUUlMgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0xPV0xFVkVM IGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9MT1dMRVZFTF9QQ01DSUEgaXMgbm90IHNldAojIENP TkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5v dCBzZXQKQ09ORklHX0FUQT15CiMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CkNP TkZJR19BVEFfVkVSQk9TRV9FUlJPUj15CkNPTkZJR19BVEFfQUNQST15CiMgQ09ORklHX1NBVEFf UE1QIGlzIG5vdCBzZXQKCiMKIyBDb250cm9sbGVycyB3aXRoIG5vbi1TRkYgbmF0aXZlIGludGVy ZmFjZQojCkNPTkZJR19TQVRBX0FIQ0k9eQojIENPTkZJR19TQVRBX0FIQ0lfUExBVEZPUk0gaXMg bm90IHNldAojIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKIyBDT05GSUdfU0FUQV9T SUwyNCBpcyBub3Qgc2V0CkNPTkZJR19BVEFfU0ZGPXkKCiMKIyBTRkYgY29udHJvbGxlcnMgd2l0 aCBjdXN0b20gRE1BIGludGVyZmFjZQojCiMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKIyBD T05GSUdfU0FUQV9RU1RPUiBpcyBub3Qgc2V0CiMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQK Q09ORklHX0FUQV9CTURNQT15CgojCiMgU0FUQSBTRkYgY29udHJvbGxlcnMgd2l0aCBCTURNQQoj CiMgQ09ORklHX0FUQV9QSUlYIGlzIG5vdCBzZXQKIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0 CkNPTkZJR19TQVRBX05WPXkKIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKIyBDT05G SUdfU0FUQV9TSUwgaXMgbm90IHNldAojIENPTkZJR19TQVRBX1NJUyBpcyBub3Qgc2V0CiMgQ09O RklHX1NBVEFfU1ZXIGlzIG5vdCBzZXQKIyBDT05GSUdfU0FUQV9VTEkgaXMgbm90IHNldAojIENP TkZJR19TQVRBX1ZJQSBpcyBub3Qgc2V0CiMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0 CgojCiMgUEFUQSBTRkYgY29udHJvbGxlcnMgd2l0aCBCTURNQQojCiMgQ09ORklHX1BBVEFfQUxJ IGlzIG5vdCBzZXQKQ09ORklHX1BBVEFfQU1EPXkKIyBDT05GSUdfUEFUQV9BUlRPUCBpcyBub3Qg c2V0CiMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9BVFA4NjdY IGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldAojIENPTkZJR19QQVRB X0NTNTUyMCBpcyBub3Qgc2V0CiMgQ09ORklHX1BBVEFfQ1M1NTMwIGlzIG5vdCBzZXQKIyBDT05G SUdfUEFUQV9DUzU1MzYgaXMgbm90IHNldAojIENPTkZJR19QQVRBX0NZUFJFU1MgaXMgbm90IHNl dAojIENPTkZJR19QQVRBX0VGQVIgaXMgbm90IHNldAojIENPTkZJR19QQVRBX0hQVDM2NiBpcyBu b3Qgc2V0CiMgQ09ORklHX1BBVEFfSFBUMzdYIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9IUFQz WDJOIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9IUFQzWDMgaXMgbm90IHNldAojIENPTkZJR19Q QVRBX0lUODIxMyBpcyBub3Qgc2V0CiMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKIyBD T05GSUdfUEFUQV9KTUlDUk9OIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9NQVJWRUxMIGlzIG5v dCBzZXQKIyBDT05GSUdfUEFUQV9ORVRDRUxMIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9OSU5K QTMyIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9OUzg3NDE1IGlzIG5vdCBzZXQKIyBDT05GSUdf UEFUQV9PTERQSUlYIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9PUFRJRE1BIGlzIG5vdCBzZXQK IyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0CiMgQ09ORklHX1BBVEFfUERDX09MRCBp cyBub3Qgc2V0CiMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CiMgQ09ORklHX1BBVEFf UkRDIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9TQzEyMDAgaXMgbm90IHNldAojIENPTkZJR19Q QVRBX1NDSCBpcyBub3Qgc2V0CiMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAoj IENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0CiMgQ09ORklHX1BBVEFfU0lTIGlzIG5vdCBz ZXQKIyBDT05GSUdfUEFUQV9UT1NISUJBIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9UUklGTEVY IGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9WSUEgaXMgbm90IHNldAojIENPTkZJR19QQVRBX1dJ TkJPTkQgaXMgbm90IHNldAoKIwojIFBJTy1vbmx5IFNGRiBjb250cm9sbGVycwojCiMgQ09ORklH X1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0CiMgQ09ORklHX1BBVEFfTVBJSVggaXMgbm90IHNl dAojIENPTkZJR19QQVRBX05TODc0MTAgaXMgbm90IHNldAojIENPTkZJR19QQVRBX09QVEkgaXMg bm90IHNldAojIENPTkZJR19QQVRBX1BDTUNJQSBpcyBub3Qgc2V0CiMgQ09ORklHX1BBVEFfUlox MDAwIGlzIG5vdCBzZXQKCiMKIyBHZW5lcmljIGZhbGxiYWNrIC8gbGVnYWN5IGRyaXZlcnMKIwpD T05GSUdfUEFUQV9BQ1BJPXkKQ09ORklHX0FUQV9HRU5FUklDPXkKIyBDT05GSUdfUEFUQV9MRUdB Q1kgaXMgbm90IHNldApDT05GSUdfTUQ9eQojIENPTkZJR19CTEtfREVWX01EIGlzIG5vdCBzZXQK Q09ORklHX0JMS19ERVZfRE09eQojIENPTkZJR19ETV9ERUJVRyBpcyBub3Qgc2V0CkNPTkZJR19E TV9DUllQVD15CiMgQ09ORklHX0RNX1NOQVBTSE9UIGlzIG5vdCBzZXQKIyBDT05GSUdfRE1fTUlS Uk9SIGlzIG5vdCBzZXQKIyBDT05GSUdfRE1fWkVSTyBpcyBub3Qgc2V0CiMgQ09ORklHX0RNX01V TFRJUEFUSCBpcyBub3Qgc2V0CiMgQ09ORklHX0RNX0RFTEFZIGlzIG5vdCBzZXQKQ09ORklHX0RN X1VFVkVOVD15CiMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CgojCiMgSUVFRSAxMzk0IChGaXJl V2lyZSkgc3VwcG9ydAojCiMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKIyBDT05GSUdfRklS RVdJUkVfTk9TWSBpcyBub3Qgc2V0CiMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CkNPTkZJR19NQUNJ TlRPU0hfRFJJVkVSUz15CkNPTkZJR19NQUNfRU1VTU9VU0VCVE49eQpDT05GSUdfTkVUREVWSUNF Uz15CiMgQ09ORklHX0lGQiBpcyBub3Qgc2V0CkNPTkZJR19EVU1NWT1tCkNPTkZJR19CT05ESU5H PW0KQ09ORklHX01BQ1ZMQU49bQpDT05GSUdfTUFDVlRBUD1tCiMgQ09ORklHX0VRVUFMSVpFUiBp cyBub3Qgc2V0CkNPTkZJR19UVU49eQpDT05GSUdfVkVUSD1tCiMgQ09ORklHX05FVF9TQjEwMDAg aXMgbm90IHNldAojIENPTkZJR19BUkNORVQgaXMgbm90IHNldApDT05GSUdfTUlJPXkKIyBDT05G SUdfUEhZTElCIGlzIG5vdCBzZXQKQ09ORklHX05FVF9FVEhFUk5FVD15CiMgQ09ORklHX0hBUFBZ TUVBTCBpcyBub3Qgc2V0CiMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CiMgQ09ORklHX0NBU1NJ TkkgaXMgbm90IHNldAojIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAojIENPTkZJ R19FVEhPQyBpcyBub3Qgc2V0CiMgQ09ORklHX0RORVQgaXMgbm90IHNldAojIENPTkZJR19ORVRf VFVMSVAgaXMgbm90IHNldAojIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CiMgQ09ORklHX0lCTV9O RVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5v dCBzZXQKIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CiMgQ09ORklHX0lCTV9O RVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CiMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NU UkwgaXMgbm90IHNldAojIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMg bm90IHNldAojIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldApD T05GSUdfTkVUX1BDST15CiMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAojIENPTkZJR19BTUQ4 MTExX0VUSCBpcyBub3Qgc2V0CiMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAoj IENPTkZJR19LU1o4ODRYX1BDSSBpcyBub3Qgc2V0CiMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CkNP TkZJR19GT1JDRURFVEg9eQojIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKIyBDT05GSUdfRkVBTE5Y IGlzIG5vdCBzZXQKIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CiMgQ09ORklHX05FMktfUENJ IGlzIG5vdCBzZXQKIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKIyBDT05GSUdfODEzOVRPTyBp cyBub3Qgc2V0CiMgQ09ORklHX1I2MDQwIGlzIG5vdCBzZXQKIyBDT05GSUdfU0lTOTAwIGlzIG5v dCBzZXQKIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CiMgQ09ORklHX1NNU0M5NDIwIGlzIG5v dCBzZXQKIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAojIENPTkZJR19UTEFOIGlzIG5vdCBz ZXQKIyBDT05GSUdfS1M4ODUxX01MTCBpcyBub3Qgc2V0CiMgQ09ORklHX1ZJQV9SSElORSBpcyBu b3Qgc2V0CiMgQ09ORklHX1NDOTIwMzEgaXMgbm90IHNldAojIENPTkZJR19BVEwyIGlzIG5vdCBz ZXQKQ09ORklHX05FVERFVl8xMDAwPXkKIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKIyBDT05G SUdfREwySyBpcyBub3Qgc2V0CiMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKIyBDT05GSUdfRTEw MDBFIGlzIG5vdCBzZXQKIyBDT05GSUdfSVAxMDAwIGlzIG5vdCBzZXQKIyBDT05GSUdfSUdCIGlz IG5vdCBzZXQKIyBDT05GSUdfSUdCVkYgaXMgbm90IHNldAojIENPTkZJR19OUzgzODIwIGlzIG5v dCBzZXQKIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiMgQ09ORklHX1lFTExPV0ZJTiBpcyBu b3Qgc2V0CiMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBz ZXQKIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CiMgQ09ORklHX1NLWTIgaXMgbm90IHNldAojIENP TkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAojIENPTkZJR19USUdPTjMgaXMgbm90IHNldAoj IENPTkZJR19CTlgyIGlzIG5vdCBzZXQKIyBDT05GSUdfQ05JQyBpcyBub3Qgc2V0CiMgQ09ORklH X1FMQTNYWFggaXMgbm90IHNldAojIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKIyBDT05GSUdfQVRM MUUgaXMgbm90IHNldAojIENPTkZJR19BVEwxQyBpcyBub3Qgc2V0CiMgQ09ORklHX0pNRSBpcyBu b3Qgc2V0CiMgQ09ORklHX1NUTU1BQ19FVEggaXMgbm90IHNldAojIENPTkZJR19QQ0hfR0JFIGlz IG5vdCBzZXQKIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKIyBDT05GSUdfVFIgaXMg bm90IHNldApDT05GSUdfV0xBTj15CiMgQ09ORklHX1BDTUNJQV9SQVlDUyBpcyBub3Qgc2V0CiMg Q09ORklHX0xJQkVSVEFTX1RISU5GSVJNIGlzIG5vdCBzZXQKIyBDT05GSUdfQUlSTyBpcyBub3Qg c2V0CiMgQ09ORklHX0FUTUVMIGlzIG5vdCBzZXQKIyBDT05GSUdfQVQ3NkM1MFhfVVNCIGlzIG5v dCBzZXQKIyBDT05GSUdfQUlST19DUyBpcyBub3Qgc2V0CiMgQ09ORklHX1BDTUNJQV9XTDM1MDEg aXMgbm90IHNldAojIENPTkZJR19QUklTTTU0IGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1pEMTIw MSBpcyBub3Qgc2V0CkNPTkZJR19VU0JfTkVUX1JORElTX1dMQU49bQojIENPTkZJR19SVEw4MTgw IGlzIG5vdCBzZXQKIyBDT05GSUdfUlRMODE4NyBpcyBub3Qgc2V0CiMgQ09ORklHX0FETTgyMTEg aXMgbm90IHNldAojIENPTkZJR19NQUM4MDIxMV9IV1NJTSBpcyBub3Qgc2V0CiMgQ09ORklHX01X TDhLIGlzIG5vdCBzZXQKQ09ORklHX0FUSF9DT01NT049eQojIENPTkZJR19BVEhfREVCVUcgaXMg bm90IHNldApDT05GSUdfQVRINUs9eQojIENPTkZJR19BVEg1S19ERUJVRyBpcyBub3Qgc2V0CiMg Q09ORklHX0FUSDlLIGlzIG5vdCBzZXQKIyBDT05GSUdfQVRIOUtfSFRDIGlzIG5vdCBzZXQKIyBD T05GSUdfQVI5MTcwX1VTQiBpcyBub3Qgc2V0CiMgQ09ORklHX0NBUkw5MTcwIGlzIG5vdCBzZXQK IyBDT05GSUdfQjQzIGlzIG5vdCBzZXQKIyBDT05GSUdfQjQzTEVHQUNZIGlzIG5vdCBzZXQKIyBD T05GSUdfSE9TVEFQIGlzIG5vdCBzZXQKIyBDT05GSUdfSVBXMjEwMCBpcyBub3Qgc2V0CiMgQ09O RklHX0lQVzIyMDAgaXMgbm90IHNldAojIENPTkZJR19JV0xXSUZJIGlzIG5vdCBzZXQKIyBDT05G SUdfSVdNIGlzIG5vdCBzZXQKIyBDT05GSUdfTElCRVJUQVMgaXMgbm90IHNldAojIENPTkZJR19I RVJNRVMgaXMgbm90IHNldAojIENPTkZJR19QNTRfQ09NTU9OIGlzIG5vdCBzZXQKIyBDT05GSUdf UlQyWDAwIGlzIG5vdCBzZXQKIyBDT05GSUdfV0wxMjUxIGlzIG5vdCBzZXQKIyBDT05GSUdfV0wx MlhYIGlzIG5vdCBzZXQKIyBDT05GSUdfWkQxMjExUlcgaXMgbm90IHNldAoKIwojIEVuYWJsZSBX aU1BWCAoTmV0d29ya2luZyBvcHRpb25zKSB0byBzZWUgdGhlIFdpTUFYIGRyaXZlcnMKIwoKIwoj IFVTQiBOZXR3b3JrIEFkYXB0ZXJzCiMKIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAojIENP TkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNl dAojIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CkNPTkZJR19VU0JfVVNCTkVUPXkKIyBD T05GSUdfVVNCX05FVF9BWDg4MTdYIGlzIG5vdCBzZXQKQ09ORklHX1VTQl9ORVRfQ0RDRVRIRVI9 bQpDT05GSUdfVVNCX05FVF9DRENfRUVNPW0KIyBDT05GSUdfVVNCX05FVF9ETTk2MDEgaXMgbm90 IHNldAojIENPTkZJR19VU0JfTkVUX1NNU0M3NVhYIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX05F VF9TTVNDOTVYWCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9ORVRfR0w2MjBBIGlzIG5vdCBzZXQK IyBDT05GSUdfVVNCX05FVF9ORVQxMDgwIGlzIG5vdCBzZXQKQ09ORklHX1VTQl9ORVRfUExVU0I9 bQojIENPTkZJR19VU0JfTkVUX01DUzc4MzAgaXMgbm90IHNldApDT05GSUdfVVNCX05FVF9STkRJ U19IT1NUPW0KQ09ORklHX1VTQl9ORVRfQ0RDX1NVQlNFVD1tCiMgQ09ORklHX1VTQl9BTElfTTU2 MzIgaXMgbm90IHNldAojIENPTkZJR19VU0JfQU4yNzIwIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNC X0JFTEtJTiBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9BUk1MSU5VWCBpcyBub3Qgc2V0CiMgQ09O RklHX1VTQl9FUFNPTjI4ODggaXMgbm90IHNldAojIENPTkZJR19VU0JfS0MyMTkwIGlzIG5vdCBz ZXQKIyBDT05GSUdfVVNCX05FVF9aQVVSVVMgaXMgbm90IHNldAojIENPTkZJR19VU0JfTkVUX0NY ODIzMTBfRVRIIGlzIG5vdCBzZXQKQ09ORklHX1VTQl9IU089bQojIENPTkZJR19VU0JfTkVUX0lO VDUxWDEgaXMgbm90IHNldAojIENPTkZJR19VU0JfSVBIRVRIIGlzIG5vdCBzZXQKIyBDT05GSUdf VVNCX1NJRVJSQV9ORVQgaXMgbm90IHNldAojIENPTkZJR19ORVRfUENNQ0lBIGlzIG5vdCBzZXQK IyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKCiMKIyBDQUlGIHRyYW5zcG9ydCBkcml2ZXJzCiMKIyBD T05GSUdfRkRESSBpcyBub3Qgc2V0CiMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKQ09ORklHX1BQ UD15CkNPTkZJR19QUFBfTVVMVElMSU5LPXkKQ09ORklHX1BQUF9GSUxURVI9eQpDT05GSUdfUFBQ X0FTWU5DPXkKQ09ORklHX1BQUF9TWU5DX1RUWT15CkNPTkZJR19QUFBfREVGTEFURT15CkNPTkZJ R19QUFBfQlNEQ09NUD15CkNPTkZJR19QUFBfTVBQRT1tCkNPTkZJR19QUFBPRT15CiMgQ09ORklH X1NMSVAgaXMgbm90IHNldApDT05GSUdfU0xIQz15CiMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0 CiMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAojIENPTkZJR19ORVRQT0xMIGlzIG5vdCBz ZXQKIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CkNPTkZJR19WSVJUSU9f TkVUPW0KIyBDT05GSUdfVk1YTkVUMyBpcyBub3Qgc2V0CiMgQ09ORklHX0lTRE4gaXMgbm90IHNl dAojIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CgojCiMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKIwpD T05GSUdfSU5QVVQ9eQpDT05GSUdfSU5QVVRfRkZfTUVNTEVTUz15CkNPTkZJR19JTlBVVF9QT0xM REVWPXkKQ09ORklHX0lOUFVUX1NQQVJTRUtNQVA9eQoKIwojIFVzZXJsYW5kIGludGVyZmFjZXMK IwpDT05GSUdfSU5QVVRfTU9VU0VERVY9eQpDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQpD T05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNApDT05GSUdfSU5QVVRfTU9VU0VERVZf U0NSRUVOX1k9NzY4CiMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CkNPTkZJR19JTlBV VF9FVkRFVj15CiMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKCiMKIyBJbnB1dCBEZXZp Y2UgRHJpdmVycwojCkNPTkZJR19JTlBVVF9LRVlCT0FSRD15CiMgQ09ORklHX0tFWUJPQVJEX0FE UDU1ODggaXMgbm90IHNldApDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQojIENPTkZJR19LRVlCT0FS RF9RVDIxNjAgaXMgbm90IHNldAojIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CiMg Q09ORklHX0tFWUJPQVJEX1RDQTY0MTYgaXMgbm90IHNldAojIENPTkZJR19LRVlCT0FSRF9MTTgz MjMgaXMgbm90IHNldAojIENPTkZJR19LRVlCT0FSRF9NQVg3MzU5IGlzIG5vdCBzZXQKIyBDT05G SUdfS0VZQk9BUkRfTUNTIGlzIG5vdCBzZXQKIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5v dCBzZXQKIyBDT05GSUdfS0VZQk9BUkRfT1BFTkNPUkVTIGlzIG5vdCBzZXQKIyBDT05GSUdfS0VZ Qk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAojIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90 IHNldAojIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CkNPTkZJR19JTlBVVF9NT1VT RT15CkNPTkZJR19NT1VTRV9QUzI9eQpDT05GSUdfTU9VU0VfUFMyX0FMUFM9eQpDT05GSUdfTU9V U0VfUFMyX0xPR0lQUzJQUD15CkNPTkZJR19NT1VTRV9QUzJfU1lOQVBUSUNTPXkKQ09ORklHX01P VVNFX1BTMl9MSUZFQk9PSz15CkNPTkZJR19NT1VTRV9QUzJfVFJBQ0tQT0lOVD15CiMgQ09ORklH X01PVVNFX1BTMl9FTEFOVEVDSCBpcyBub3Qgc2V0CiMgQ09ORklHX01PVVNFX1BTMl9TRU5URUxJ QyBpcyBub3Qgc2V0CiMgQ09ORklHX01PVVNFX1BTMl9UT1VDSEtJVCBpcyBub3Qgc2V0CiMgQ09O RklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CiMgQ09ORklHX01PVVNFX0FQUExFVE9VQ0ggaXMg bm90IHNldAojIENPTkZJR19NT1VTRV9CQ001OTc0IGlzIG5vdCBzZXQKIyBDT05GSUdfTU9VU0Vf VlNYWFhBQSBpcyBub3Qgc2V0CiMgQ09ORklHX01PVVNFX1NZTkFQVElDU19JMkMgaXMgbm90IHNl dAojIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CiMgQ09ORklHX0lOUFVUX1RBQkxF VCBpcyBub3Qgc2V0CiMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKQ09ORklH X0lOUFVUX01JU0M9eQojIENPTkZJR19JTlBVVF9BRDcxNFggaXMgbm90IHNldAojIENPTkZJR19J TlBVVF9QQ1NQS1IgaXMgbm90IHNldAojIENPTkZJR19JTlBVVF9BUEFORUwgaXMgbm90IHNldAoj IENPTkZJR19JTlBVVF9BVExBU19CVE5TIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5QVVRfQVRJX1JF TU9URSBpcyBub3Qgc2V0CiMgQ09ORklHX0lOUFVUX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKIyBD T05GSUdfSU5QVVRfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAojIENPTkZJR19JTlBVVF9QT1dF Uk1BVEUgaXMgbm90IHNldAojIENPTkZJR19JTlBVVF9ZRUFMSU5LIGlzIG5vdCBzZXQKIyBDT05G SUdfSU5QVVRfQ00xMDkgaXMgbm90IHNldApDT05GSUdfSU5QVVRfVUlOUFVUPW0KIyBDT05GSUdf SU5QVVRfV0lOQk9ORF9DSVIgaXMgbm90IHNldAojIENPTkZJR19JTlBVVF9QQ0Y4NTc0IGlzIG5v dCBzZXQKIyBDT05GSUdfSU5QVVRfQURYTDM0WCBpcyBub3Qgc2V0CgojCiMgSGFyZHdhcmUgSS9P IHBvcnRzCiMKQ09ORklHX1NFUklPPXkKQ09ORklHX1NFUklPX0k4MDQyPXkKIyBDT05GSUdfU0VS SU9fU0VSUE9SVCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFUklPX0NUODJDNzEwIGlzIG5vdCBzZXQK IyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKQ09ORklHX1NFUklPX0xJQlBTMj15CkNP TkZJR19TRVJJT19SQVc9eQojIENPTkZJR19TRVJJT19BTFRFUkFfUFMyIGlzIG5vdCBzZXQKIyBD T05GSUdfU0VSSU9fUFMyTVVMVCBpcyBub3Qgc2V0CiMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBz ZXQKCiMKIyBDaGFyYWN0ZXIgZGV2aWNlcwojCkNPTkZJR19WVD15CkNPTkZJR19DT05TT0xFX1RS QU5TTEFUSU9OUz15CkNPTkZJR19WVF9DT05TT0xFPXkKQ09ORklHX0hXX0NPTlNPTEU9eQpDT05G SUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKQ09ORklHX0RFVktNRU09eQpDT05GSUdfU0VSSUFM X05PTlNUQU5EQVJEPXkKIyBDT05GSUdfQ09NUFVUT05FIGlzIG5vdCBzZXQKIyBDT05GSUdfUk9D S0VUUE9SVCBpcyBub3Qgc2V0CiMgQ09ORklHX0NZQ0xBREVTIGlzIG5vdCBzZXQKIyBDT05GSUdf RElHSUVQQ0EgaXMgbm90IHNldAojIENPTkZJR19NT1hBX0lOVEVMTElPIGlzIG5vdCBzZXQKIyBD T05GSUdfTU9YQV9TTUFSVElPIGlzIG5vdCBzZXQKIyBDT05GSUdfSVNJIGlzIG5vdCBzZXQKIyBD T05GSUdfU1lOQ0xJTksgaXMgbm90IHNldAojIENPTkZJR19TWU5DTElOS01QIGlzIG5vdCBzZXQK IyBDT05GSUdfU1lOQ0xJTktfR1QgaXMgbm90IHNldAojIENPTkZJR19OX0hETEMgaXMgbm90IHNl dApDT05GSUdfTl9HU009bQojIENPTkZJR19SSVNDT004IGlzIG5vdCBzZXQKIyBDT05GSUdfU1BF Q0lBTElYIGlzIG5vdCBzZXQKIyBDT05GSUdfU1RBTERSViBpcyBub3Qgc2V0CkNPTkZJR19OT1pP TUk9bQoKIwojIFNlcmlhbCBkcml2ZXJzCiMKIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNl dApDT05GSUdfRklYX0VBUkxZQ09OX01FTT15CgojCiMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3Vw cG9ydAojCiMgQ09ORklHX1NFUklBTF9NRkRfSFNVIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VSSUFM X0pTTSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFUklBTF9USU1CRVJEQUxFIGlzIG5vdCBzZXQKIyBD T05GSUdfU0VSSUFMX0FMVEVSQV9KVEFHVUFSVCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFUklBTF9B TFRFUkFfVUFSVCBpcyBub3Qgc2V0CkNPTkZJR19VTklYOThfUFRZUz15CkNPTkZJR19ERVZQVFNf TVVMVElQTEVfSU5TVEFOQ0VTPXkKIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAojIENP TkZJR19WSVJUSU9fQ09OU09MRSBpcyBub3Qgc2V0CiMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBu b3Qgc2V0CkNPTkZJR19IV19SQU5ET009eQojIENPTkZJR19IV19SQU5ET01fVElNRVJJT01FTSBp cyBub3Qgc2V0CiMgQ09ORklHX0hXX1JBTkRPTV9JTlRFTCBpcyBub3Qgc2V0CkNPTkZJR19IV19S QU5ET01fQU1EPXkKIyBDT05GSUdfSFdfUkFORE9NX1ZJQSBpcyBub3Qgc2V0CiMgQ09ORklHX0hX X1JBTkRPTV9WSVJUSU8gaXMgbm90IHNldApDT05GSUdfTlZSQU09eQojIENPTkZJR19SMzk2NCBp cyBub3Qgc2V0CiMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKCiMKIyBQQ01DSUEgY2hhcmFj dGVyIGRldmljZXMKIwojIENPTkZJR19TWU5DTElOS19DUyBpcyBub3Qgc2V0CiMgQ09ORklHX0NB UkRNQU5fNDAwMCBpcyBub3Qgc2V0CiMgQ09ORklHX0NBUkRNQU5fNDA0MCBpcyBub3Qgc2V0CiMg Q09ORklHX0lQV0lSRUxFU1MgaXMgbm90IHNldAojIENPTkZJR19NV0FWRSBpcyBub3Qgc2V0CkNP TkZJR19SQVdfRFJJVkVSPW0KQ09ORklHX01BWF9SQVdfREVWUz0yNTYKQ09ORklHX0hQRVQ9eQpD T05GSUdfSFBFVF9NTUFQPXkKIyBDT05GSUdfSEFOR0NIRUNLX1RJTUVSIGlzIG5vdCBzZXQKIyBD T05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKQ09O RklHX0RFVlBPUlQ9eQojIENPTkZJR19SQU1PT1BTIGlzIG5vdCBzZXQKQ09ORklHX0kyQz15CkNP TkZJR19JMkNfQk9BUkRJTkZPPXkKQ09ORklHX0kyQ19DT01QQVQ9eQpDT05GSUdfSTJDX0NIQVJE RVY9eQojIENPTkZJR19JMkNfTVVYIGlzIG5vdCBzZXQKQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15 CgojCiMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CiMKCiMKIyBQQyBTTUJ1cyBob3N0IGNvbnRy b2xsZXIgZHJpdmVycwojCiMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKIyBDT05GSUdf STJDX0FMSTE1NjMgaXMgbm90IHNldAojIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CiMg Q09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAojIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qg c2V0CiMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKIyBDT05GSUdfSTJDX0lTQ0ggaXMgbm90 IHNldAojIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldApDT05GSUdfSTJDX05GT1JDRTI9eQoj IENPTkZJR19JMkNfTkZPUkNFMl9TNDk4NSBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19TSVM1NTk1 IGlzIG5vdCBzZXQKIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19T SVM5NlggaXMgbm90IHNldAojIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKIyBDT05GSUdfSTJD X1ZJQVBSTyBpcyBub3Qgc2V0CgojCiMgQUNQSSBkcml2ZXJzCiMKIyBDT05GSUdfSTJDX1NDTUkg aXMgbm90IHNldAoKIwojIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAv IHN5c3RlbS1vbi1jaGlwKQojCiMgQ09ORklHX0kyQ19JTlRFTF9NSUQgaXMgbm90IHNldAojIENP TkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBu b3Qgc2V0CiMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAojIENPTkZJR19JMkNfWElMSU5Y IGlzIG5vdCBzZXQKCiMKIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCiMKIyBD T05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAojIENPTkZJR19JMkNfVEFPU19FVk0g aXMgbm90IHNldAojIENPTkZJR19JMkNfVElOWV9VU0IgaXMgbm90IHNldAoKIwojIE90aGVyIEky Qy9TTUJ1cyBidXMgZHJpdmVycwojCiMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKIyBDT05G SUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAojIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBu b3Qgc2V0CiMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAojIENPTkZJR19TUEkgaXMg bm90IHNldAoKIwojIFBQUyBzdXBwb3J0CiMKIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKQ09ORklH X0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0 CiMgQ09ORklHX1cxIGlzIG5vdCBzZXQKQ09ORklHX1BPV0VSX1NVUFBMWT15CiMgQ09ORklHX1BP V0VSX1NVUFBMWV9ERUJVRyBpcyBub3Qgc2V0CiMgQ09ORklHX1BEQV9QT1dFUiBpcyBub3Qgc2V0 CiMgQ09ORklHX1RFU1RfUE9XRVIgaXMgbm90IHNldAojIENPTkZJR19CQVRURVJZX0RTMjc4MiBp cyBub3Qgc2V0CiMgQ09ORklHX0JBVFRFUllfQlEyMFo3NSBpcyBub3Qgc2V0CiMgQ09ORklHX0JB VFRFUllfQlEyN3gwMCBpcyBub3Qgc2V0CiMgQ09ORklHX0JBVFRFUllfTUFYMTcwNDAgaXMgbm90 IHNldApDT05GSUdfSFdNT049eQojIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAojIENPTkZJ R19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKCiMKIyBOYXRpdmUgZHJpdmVycwojCiMgQ09O RklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19BQklUVUdV UlUzIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAojIENPTkZJ R19TRU5TT1JTX0FENzQxOCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBu b3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNP UlNfQURNMTAyNiBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURNMTAyOSBpcyBub3Qgc2V0 CiMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURN OTI0MCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURUNzQxMSBpcyBub3Qgc2V0CiMgQ09O RklHX1NFTlNPUlNfQURUNzQ2MiBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MCBp cyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURUNzQ3NSBpcyBub3Qgc2V0CiMgQ09ORklHX1NF TlNPUlNfQVNDNzYyMSBpcyBub3Qgc2V0CkNPTkZJR19TRU5TT1JTX0s4VEVNUD15CiMgQ09ORklH X1NFTlNPUlNfSzEwVEVNUCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5v dCBzZXQKIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNf RFMxNjIxIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19JNUtfQU1CIGlzIG5vdCBzZXQKIyBD T05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19GNzE4ODJG RyBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfRjc1Mzc1UyBpcyBub3Qgc2V0CiMgQ09ORklH X1NFTlNPUlNfRlNDSE1EIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19HNzYwQSBpcyBub3Qg c2V0CiMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNf R0w1MjBTTSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQ09SRVRFTVAgaXMgbm90IHNldAoj IENPTkZJR19TRU5TT1JTX1BLR1RFTVAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0lUODcg aXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0pDNDIgaXMgbm90IHNldAojIENPTkZJR19TRU5T T1JTX0xNNjMgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0xNNzMgaXMgbm90IHNldAojIENP TkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90 IHNldAojIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0xN ODAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAojIENPTkZJR19T RU5TT1JTX0xNODUgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAoj IENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0xNOTIgaXMg bm90IHNldAojIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JT X0xUQzQyMTUgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0xUQzQyNDUgaXMgbm90IHNldAoj IENPTkZJR19TRU5TT1JTX0xUQzQyNjEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0xNOTUy NDEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAojIENPTkZJ R19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMg bm90IHNldAojIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAojIENPTkZJR19TRU5T T1JTX1BDRjg1OTEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNl dAojIENPTkZJR19TRU5TT1JTX1NNTTY2NSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfRE1F MTczNyBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfRU1DMTQwMyBpcyBub3Qgc2V0CiMgQ09O RklHX1NFTlNPUlNfRU1DMjEwMyBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEg aXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAojIENPTkZJ R19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FEUzc4Mjgg aXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FNQzY4MjEgaXMgbm90IHNldAojIENPTkZJR19T RU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfVE1QMTAyIGlzIG5vdCBz ZXQKIyBDT05GSUdfU0VOU09SU19UTVA0MDEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1RN UDQyMSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfVklBX0NQVVRFTVAgaXMgbm90IHNldAoj IENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1ZUMTIx MSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfVlQ4MjMxIGlzIG5vdCBzZXQKIyBDT05GSUdf U0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5v dCBzZXQKIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09S U19XODM3OTMgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1c4Mzc5NSBpcyBub3Qgc2V0CiMg Q09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19XODNM Nzg2TkcgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKIyBD T05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0xJUzNf STJDIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19BUFBMRVNNQyBpcyBub3Qgc2V0CgojCiMg QUNQSSBkcml2ZXJzCiMKIyBDT05GSUdfU0VOU09SU19BVEswMTEwIGlzIG5vdCBzZXQKIyBDT05G SUdfU0VOU09SU19MSVMzTFYwMkQgaXMgbm90IHNldApDT05GSUdfVEhFUk1BTD15CkNPTkZJR19U SEVSTUFMX0hXTU9OPXkKIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldApDT05GSUdfU1NCX1BP U1NJQkxFPXkKCiMKIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKIwojIENPTkZJR19TU0IgaXMg bm90IHNldApDT05GSUdfTUZEX1NVUFBPUlQ9eQojIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0 CiMgQ09ORklHX01GRF84OFBNODYwWCBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9TTTUwMSBpcyBu b3Qgc2V0CiMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAojIENPTkZJR19UUFM2NTA3WCBp cyBub3Qgc2V0CiMgQ09ORklHX1RXTDQwMzBfQ09SRSBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9T VE1QRSBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9UQzM1ODkyIGlzIG5vdCBzZXQKIyBDT05GSUdf TUZEX1RNSU8gaXMgbm90IHNldAojIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CiMgQ09O RklHX1BNSUNfQURQNTUyMCBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9NQVg4OTI1IGlzIG5vdCBz ZXQKIyBDT05GSUdfTUZEX01BWDg5OTggaXMgbm90IHNldAojIENPTkZJR19NRkRfV004NDAwIGlz IG5vdCBzZXQKIyBDT05GSUdfTUZEX1dNODMxWF9JMkMgaXMgbm90IHNldAojIENPTkZJR19NRkRf V004MzUwX0kyQyBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9XTTg5OTQgaXMgbm90IHNldAojIENP TkZJR19NRkRfUENGNTA2MzMgaXMgbm90IHNldAojIENPTkZJR19BQlg1MDBfQ09SRSBpcyBub3Qg c2V0CiMgQ09ORklHX0xQQ19TQ0ggaXMgbm90IHNldAojIENPTkZJR19NRkRfUkRDMzIxWCBpcyBu b3Qgc2V0CiMgQ09ORklHX01GRF9KQU5aX0NNT0RJTyBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9W WDg1NSBpcyBub3Qgc2V0CiMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CiMgQ09ORklHX01F RElBX1NVUFBPUlQgaXMgbm90IHNldAoKIwojIEdyYXBoaWNzIHN1cHBvcnQKIwpDT05GSUdfQUdQ PXkKQ09ORklHX0FHUF9BTUQ2ND15CiMgQ09ORklHX0FHUF9JTlRFTCBpcyBub3Qgc2V0CiMgQ09O RklHX0FHUF9TSVMgaXMgbm90IHNldAojIENPTkZJR19BR1BfVklBIGlzIG5vdCBzZXQKQ09ORklH X1ZHQV9BUkI9eQpDT05GSUdfVkdBX0FSQl9NQVhfR1BVUz0xNgojIENPTkZJR19WR0FfU1dJVENI RVJPTyBpcyBub3Qgc2V0CiMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CiMgQ09ORklHX1NUVUJfUE9V TFNCTyBpcyBub3Qgc2V0CiMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKQ09ORklHX1ZJREVP X09VVFBVVF9DT05UUk9MPXkKQ09ORklHX0ZCPXkKIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBu b3Qgc2V0CiMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CkNPTkZJR19GQl9CT09UX1ZFU0FfU1VQ UE9SVD15CkNPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQpDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkK Q09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQojIENPTkZJR19GQl9DRkJfUkVWX1BJWEVMU19JTl9C WVRFIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKIyBDT05G SUdfRkJfU1lTX0NPUFlBUkVBIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfU1lTX0lNQUdFQkxJVCBp cyBub3Qgc2V0CiMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKIyBDT05GSUdf RkJfU1lTX0ZPUFMgaXMgbm90IHNldAojIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKIyBD T05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAojIENPTkZJR19GQl9CQUNLTElHSFQgaXMgbm90 IHNldAojIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldApDT05GSUdfRkJfVElMRUJM SVRUSU5HPXkKCiMKIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycwojCiMgQ09ORklHX0ZC X0NJUlJVUyBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX1BNMiBpcyBub3Qgc2V0CiMgQ09ORklHX0ZC X0NZQkVSMjAwMCBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX0FSQyBpcyBub3Qgc2V0CiMgQ09ORklH X0ZCX0FTSUxJQU5UIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfSU1TVFQgaXMgbm90IHNldAojIENP TkZJR19GQl9WR0ExNiBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX1VWRVNBIGlzIG5vdCBzZXQKQ09O RklHX0ZCX1ZFU0E9eQojIENPTkZJR19GQl9ONDExIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfSEdB IGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAojIENPTkZJR19GQl9O VklESUEgaXMgbm90IHNldAojIENPTkZJR19GQl9SSVZBIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJf TEU4MDU3OCBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX01BVFJPWCBpcyBub3Qgc2V0CiMgQ09ORklH X0ZCX1JBREVPTiBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX0FUWTEyOCBpcyBub3Qgc2V0CiMgQ09O RklHX0ZCX0FUWSBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX1MzIGlzIG5vdCBzZXQKIyBDT05GSUdf RkJfU0FWQUdFIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfU0lTIGlzIG5vdCBzZXQKIyBDT05GSUdf RkJfVklBIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAojIENPTkZJ R19GQl9LWVJPIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfM0RGWCBpcyBub3Qgc2V0CiMgQ09ORklH X0ZCX1ZPT0RPTzEgaXMgbm90IHNldAojIENPTkZJR19GQl9WVDg2MjMgaXMgbm90IHNldAojIENP TkZJR19GQl9UUklERU5UIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfQVJLIGlzIG5vdCBzZXQKIyBD T05GSUdfRkJfUE0zIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfQ0FSTUlORSBpcyBub3Qgc2V0CiMg Q09ORklHX0ZCX0dFT0RFIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0 CiMgQ09ORklHX0ZCX01FVFJPTk9NRSBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX01CODYyWFggaXMg bm90IHNldAojIENPTkZJR19GQl9CUk9BRFNIRUVUIGlzIG5vdCBzZXQKQ09ORklHX0JBQ0tMSUdI VF9MQ0RfU1VQUE9SVD15CiMgQ09ORklHX0xDRF9DTEFTU19ERVZJQ0UgaXMgbm90IHNldApDT05G SUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT15CiMgQ09ORklHX0JBQ0tMSUdIVF9HRU5FUklDIGlz IG5vdCBzZXQKIyBDT05GSUdfQkFDS0xJR0hUX1BST0dFQVIgaXMgbm90IHNldAojIENPTkZJR19C QUNLTElHSFRfTUJQX05WSURJQSBpcyBub3Qgc2V0CiMgQ09ORklHX0JBQ0tMSUdIVF9TQUhBUkEg aXMgbm90IHNldAojIENPTkZJR19CQUNLTElHSFRfQURQODg2MCBpcyBub3Qgc2V0CgojCiMgRGlz cGxheSBkZXZpY2Ugc3VwcG9ydAojCiMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0 CgojCiMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CiMKQ09ORklHX1ZHQV9DT05TT0xF PXkKQ09ORklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0s9eQpDT05GSUdfVkdBQ09OX1NPRlRfU0NS T0xMQkFDS19TSVpFPTUxMgpDT05GSUdfRFVNTVlfQ09OU09MRT15CkNPTkZJR19GUkFNRUJVRkZF Ul9DT05TT0xFPXkKQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfREVURUNUX1BSSU1BUlk9eQpD T05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ST1RBVElPTj15CiMgQ09ORklHX0ZPTlRTIGlzIG5v dCBzZXQKQ09ORklHX0ZPTlRfOHg4PXkKQ09ORklHX0ZPTlRfOHgxNj15CkNPTkZJR19MT0dPPXkK IyBDT05GSUdfTE9HT19MSU5VWF9NT05PIGlzIG5vdCBzZXQKIyBDT05GSUdfTE9HT19MSU5VWF9W R0ExNiBpcyBub3Qgc2V0CkNPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQpDT05GSUdfU09VTkQ9 eQpDT05GSUdfU09VTkRfT1NTX0NPUkU9eQpDT05GSUdfU09VTkRfT1NTX0NPUkVfUFJFQ0xBSU09 eQpDT05GSUdfU05EPXkKQ09ORklHX1NORF9USU1FUj15CkNPTkZJR19TTkRfUENNPXkKQ09ORklH X1NORF9IV0RFUD15CkNPTkZJR19TTkRfSkFDSz15CkNPTkZJR19TTkRfU0VRVUVOQ0VSPXkKQ09O RklHX1NORF9TRVFfRFVNTVk9eQpDT05GSUdfU05EX09TU0VNVUw9eQpDT05GSUdfU05EX01JWEVS X09TUz15CkNPTkZJR19TTkRfUENNX09TUz15CkNPTkZJR19TTkRfUENNX09TU19QTFVHSU5TPXkK Q09ORklHX1NORF9TRVFVRU5DRVJfT1NTPXkKQ09ORklHX1NORF9IUlRJTUVSPXkKQ09ORklHX1NO RF9TRVFfSFJUSU1FUl9ERUZBVUxUPXkKQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUz15CiMgQ09O RklHX1NORF9TVVBQT1JUX09MRF9BUEkgaXMgbm90IHNldApDT05GSUdfU05EX1ZFUkJPU0VfUFJP Q0ZTPXkKQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USz15CiMgQ09ORklHX1NORF9ERUJVRyBpcyBu b3Qgc2V0CkNPTkZJR19TTkRfVk1BU1RFUj15CkNPTkZJR19TTkRfRE1BX1NHQlVGPXkKIyBDT05G SUdfU05EX1JBV01JRElfU0VRIGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX09QTDNfTElCX1NFUSBp cyBub3Qgc2V0CiMgQ09ORklHX1NORF9PUEw0X0xJQl9TRVEgaXMgbm90IHNldAojIENPTkZJR19T TkRfU0JBV0VfU0VRIGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX0VNVTEwSzFfU0VRIGlzIG5vdCBz ZXQKQ09ORklHX1NORF9EUklWRVJTPXkKIyBDT05GSUdfU05EX1BDU1AgaXMgbm90IHNldAojIENP TkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAojIENPTkZJR19TTkRfQUxPT1AgaXMgbm90IHNldAoj IENPTkZJR19TTkRfVklSTUlESSBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qg c2V0CiMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX01Q VTQwMSBpcyBub3Qgc2V0CkNPTkZJR19TTkRfUENJPXkKIyBDT05GSUdfU05EX0FEMTg4OSBpcyBu b3Qgc2V0CiMgQ09ORklHX1NORF9BTFMzMDAgaXMgbm90IHNldAojIENPTkZJR19TTkRfQUxTNDAw MCBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9BTEk1NDUxIGlzIG5vdCBzZXQKIyBDT05GSUdfU05E X0FTSUhQSSBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9BVElJWFAgaXMgbm90IHNldAojIENPTkZJ R19TTkRfQVRJSVhQX01PREVNIGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX0FVODgxMCBpcyBub3Qg c2V0CiMgQ09ORklHX1NORF9BVTg4MjAgaXMgbm90IHNldAojIENPTkZJR19TTkRfQVU4ODMwIGlz IG5vdCBzZXQKIyBDT05GSUdfU05EX0FXMiBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9BWlQzMzI4 IGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX0JUODdYIGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX0NB MDEwNiBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9DTUlQQ0kgaXMgbm90IHNldAojIENPTkZJR19T TkRfT1hZR0VOIGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX0NTNDI4MSBpcyBub3Qgc2V0CiMgQ09O RklHX1NORF9DUzQ2WFggaXMgbm90IHNldAojIENPTkZJR19TTkRfQ1M1NTMwIGlzIG5vdCBzZXQK IyBDT05GSUdfU05EX0NTNTUzNUFVRElPIGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX0NUWEZJIGlz IG5vdCBzZXQKIyBDT05GSUdfU05EX0RBUkxBMjAgaXMgbm90IHNldAojIENPTkZJR19TTkRfR0lO QTIwIGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX0xBWUxBMjAgaXMgbm90IHNldAojIENPTkZJR19T TkRfREFSTEEyNCBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9HSU5BMjQgaXMgbm90IHNldAojIENP TkZJR19TTkRfTEFZTEEyNCBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9NT05BIGlzIG5vdCBzZXQK IyBDT05GSUdfU05EX01JQSBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9FQ0hPM0cgaXMgbm90IHNl dAojIENPTkZJR19TTkRfSU5ESUdPIGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX0lORElHT0lPIGlz IG5vdCBzZXQKIyBDT05GSUdfU05EX0lORElHT0RKIGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX0lO RElHT0lPWCBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9JTkRJR09ESlggaXMgbm90IHNldAojIENP TkZJR19TTkRfRU1VMTBLMSBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9FTVUxMEsxWCBpcyBub3Qg c2V0CiMgQ09ORklHX1NORF9FTlMxMzcwIGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX0VOUzEzNzEg aXMgbm90IHNldAojIENPTkZJR19TTkRfRVMxOTM4IGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX0VT MTk2OCBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9GTTgwMSBpcyBub3Qgc2V0CkNPTkZJR19TTkRf SERBX0lOVEVMPXkKQ09ORklHX1NORF9IREFfSFdERVA9eQpDT05GSUdfU05EX0hEQV9SRUNPTkZJ Rz15CiMgQ09ORklHX1NORF9IREFfSU5QVVRfQkVFUCBpcyBub3Qgc2V0CkNPTkZJR19TTkRfSERB X0lOUFVUX0pBQ0s9eQojIENPTkZJR19TTkRfSERBX1BBVENIX0xPQURFUiBpcyBub3Qgc2V0CkNP TkZJR19TTkRfSERBX0NPREVDX1JFQUxURUs9eQojIENPTkZJR19TTkRfSERBX0NPREVDX0FOQUxP RyBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9IREFfQ09ERUNfU0lHTUFURUwgaXMgbm90IHNldAoj IENPTkZJR19TTkRfSERBX0NPREVDX1ZJQSBpcyBub3Qgc2V0CkNPTkZJR19TTkRfSERBX0NPREVD X0hETUk9eQojIENPTkZJR19TTkRfSERBX0NPREVDX0NJUlJVUyBpcyBub3Qgc2V0CiMgQ09ORklH X1NORF9IREFfQ09ERUNfQ09ORVhBTlQgaXMgbm90IHNldAojIENPTkZJR19TTkRfSERBX0NPREVD X0NBMDExMCBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9IREFfQ09ERUNfQ01FRElBIGlzIG5vdCBz ZXQKIyBDT05GSUdfU05EX0hEQV9DT0RFQ19TSTMwNTQgaXMgbm90IHNldAojIENPTkZJR19TTkRf SERBX0dFTkVSSUMgaXMgbm90IHNldApDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFPXkKQ09ORklH X1NORF9IREFfUE9XRVJfU0FWRV9ERUZBVUxUPTE4MAojIENPTkZJR19TTkRfSERTUCBpcyBub3Qg c2V0CiMgQ09ORklHX1NORF9IRFNQTSBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9ISUZJRVIgaXMg bm90IHNldAojIENPTkZJR19TTkRfSUNFMTcxMiBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9JQ0Ux NzI0IGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX0lOVEVMOFgwIGlzIG5vdCBzZXQKIyBDT05GSUdf U05EX0lOVEVMOFgwTSBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9LT1JHMTIxMiBpcyBub3Qgc2V0 CiMgQ09ORklHX1NORF9MWDY0NjRFUyBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9NQUVTVFJPMyBp cyBub3Qgc2V0CiMgQ09ORklHX1NORF9NSVhBUlQgaXMgbm90IHNldAojIENPTkZJR19TTkRfTk0y NTYgaXMgbm90IHNldAojIENPTkZJR19TTkRfUENYSFIgaXMgbm90IHNldAojIENPTkZJR19TTkRf UklQVElERSBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9STUUzMiBpcyBub3Qgc2V0CiMgQ09ORklH X1NORF9STUU5NiBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9STUU5NjUyIGlzIG5vdCBzZXQKIyBD T05GSUdfU05EX1NPTklDVklCRVMgaXMgbm90IHNldAojIENPTkZJR19TTkRfVFJJREVOVCBpcyBu b3Qgc2V0CiMgQ09ORklHX1NORF9WSUE4MlhYIGlzIG5vdCBzZXQKIyBDT05GSUdfU05EX1ZJQTgy WFhfTU9ERU0gaXMgbm90IHNldAojIENPTkZJR19TTkRfVklSVFVPU08gaXMgbm90IHNldAojIENP TkZJR19TTkRfVlgyMjIgaXMgbm90IHNldAojIENPTkZJR19TTkRfWU1GUENJIGlzIG5vdCBzZXQK IyBDT05GSUdfU05EX1VTQiBpcyBub3Qgc2V0CiMgQ09ORklHX1NORF9QQ01DSUEgaXMgbm90IHNl dAojIENPTkZJR19TTkRfU09DIGlzIG5vdCBzZXQKIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90 IHNldApDT05GSUdfSElEX1NVUFBPUlQ9eQpDT05GSUdfSElEPXkKQ09ORklHX0hJRFJBVz15Cgoj CiMgVVNCIElucHV0IERldmljZXMKIwpDT05GSUdfVVNCX0hJRD15CiMgQ09ORklHX0hJRF9QSUQg aXMgbm90IHNldApDT05GSUdfVVNCX0hJRERFVj15CgojCiMgU3BlY2lhbCBISUQgZHJpdmVycwoj CiMgQ09ORklHX0hJRF8zTV9QQ1QgaXMgbm90IHNldApDT05GSUdfSElEX0E0VEVDSD15CiMgQ09O RklHX0hJRF9BQ1JVWF9GRiBpcyBub3Qgc2V0CkNPTkZJR19ISURfQVBQTEU9eQpDT05GSUdfSElE X0JFTEtJTj15CiMgQ09ORklHX0hJRF9DQU5ETyBpcyBub3Qgc2V0CkNPTkZJR19ISURfQ0hFUlJZ PXkKQ09ORklHX0hJRF9DSElDT05ZPXkKIyBDT05GSUdfSElEX1BST0RJS0VZUyBpcyBub3Qgc2V0 CkNPTkZJR19ISURfQ1lQUkVTUz15CiMgQ09ORklHX0hJRF9EUkFHT05SSVNFIGlzIG5vdCBzZXQK IyBDT05GSUdfSElEX0VHQUxBWCBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9FTEVDT00gaXMgbm90 IHNldApDT05GSUdfSElEX0VaS0VZPXkKQ09ORklHX0hJRF9LWUU9eQojIENPTkZJR19ISURfVUNM T0dJQyBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9XQUxUT1AgaXMgbm90IHNldAojIENPTkZJR19I SURfR1lSQVRJT04gaXMgbm90IHNldAojIENPTkZJR19ISURfVFdJTkhBTiBpcyBub3Qgc2V0CkNP TkZJR19ISURfS0VOU0lOR1RPTj15CkNPTkZJR19ISURfTE9HSVRFQ0g9eQpDT05GSUdfTE9HSVRF Q0hfRkY9eQojIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRiBpcyBub3Qgc2V0CiMgQ09ORklHX0xP R0lHOTQwX0ZGIGlzIG5vdCBzZXQKIyBDT05GSUdfTE9HSVdJSV9GRiBpcyBub3Qgc2V0CiMgQ09O RklHX0hJRF9NQUdJQ01PVVNFIGlzIG5vdCBzZXQKQ09ORklHX0hJRF9NSUNST1NPRlQ9eQojIENP TkZJR19ISURfTU9TQVJUIGlzIG5vdCBzZXQKQ09ORklHX0hJRF9NT05URVJFWT15CiMgQ09ORklH X0hJRF9OVFJJRyBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9PUlRFSyBpcyBub3Qgc2V0CiMgQ09O RklHX0hJRF9QQU5USEVSTE9SRCBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9QRVRBTFlOWCBpcyBu b3Qgc2V0CiMgQ09ORklHX0hJRF9QSUNPTENEIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1FVQU5U QSBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9ST0NDQVQgaXMgbm90IHNldAojIENPTkZJR19ISURf Uk9DQ0FUX0tPTkUgaXMgbm90IHNldAojIENPTkZJR19ISURfUk9DQ0FUX1BZUkEgaXMgbm90IHNl dAojIENPTkZJR19ISURfU0FNU1VORyBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9TT05ZIGlzIG5v dCBzZXQKIyBDT05GSUdfSElEX1NUQU5UVU0gaXMgbm90IHNldAojIENPTkZJR19ISURfU1VOUExV UyBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9HUkVFTkFTSUEgaXMgbm90IHNldAojIENPTkZJR19I SURfU01BUlRKT1lQTFVTIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1RPUFNFRUQgaXMgbm90IHNl dAojIENPTkZJR19ISURfVEhSVVNUTUFTVEVSIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1dBQ09N IGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1pFUk9QTFVTIGlzIG5vdCBzZXQKIyBDT05GSUdfSElE X1pZREFDUk9OIGlzIG5vdCBzZXQKQ09ORklHX1VTQl9TVVBQT1JUPXkKQ09ORklHX1VTQl9BUkNI X0hBU19IQ0Q9eQpDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQpDT05GSUdfVVNCX0FSQ0hfSEFT X0VIQ0k9eQpDT05GSUdfVVNCPXkKIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKQ09ORklH X1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUz15CgojCiMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9u cwojCiMgQ09ORklHX1VTQl9ERVZJQ0VGUyBpcyBub3Qgc2V0CkNPTkZJR19VU0JfREVWSUNFX0NM QVNTPXkKIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNC X1NVU1BFTkQgaXMgbm90IHNldApDT05GSUdfVVNCX01PTj15CiMgQ09ORklHX1VTQl9XVVNCIGlz IG5vdCBzZXQKIyBDT05GSUdfVVNCX1dVU0JfQ0JBRiBpcyBub3Qgc2V0CgojCiMgVVNCIEhvc3Qg Q29udHJvbGxlciBEcml2ZXJzCiMKIyBDT05GSUdfVVNCX0M2N1gwMF9IQ0QgaXMgbm90IHNldAoj IENPTkZJR19VU0JfWEhDSV9IQ0QgaXMgbm90IHNldApDT05GSUdfVVNCX0VIQ0lfSENEPXkKQ09O RklHX1VTQl9FSENJX1JPT1RfSFVCX1RUPXkKQ09ORklHX1VTQl9FSENJX1RUX05FV1NDSEVEPXkK IyBDT05GSUdfVVNCX09YVTIxMEhQX0hDRCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9JU1AxMTZY X0hDRCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CiMgQ09O RklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CkNPTkZJR19VU0JfT0hDSV9IQ0Q9eQojIENP TkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX0RFU0MgaXMgbm90IHNldAojIENPTkZJR19VU0JfT0hD SV9CSUdfRU5ESUFOX01NSU8gaXMgbm90IHNldApDT05GSUdfVVNCX09IQ0lfTElUVExFX0VORElB Tj15CkNPTkZJR19VU0JfVUhDSV9IQ0Q9eQojIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBz ZXQKIyBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9XSENJ X0hDRCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9IV0FfSENEIGlzIG5vdCBzZXQKCiMKIyBVU0Ig RGV2aWNlIENsYXNzIGRyaXZlcnMKIwpDT05GSUdfVVNCX0FDTT1tCkNPTkZJR19VU0JfUFJJTlRF Uj1tCiMgQ09ORklHX1VTQl9XRE0gaXMgbm90IHNldAojIENPTkZJR19VU0JfVE1DIGlzIG5vdCBz ZXQKCiMKIyBOT1RFOiBVU0JfU1RPUkFHRSBkZXBlbmRzIG9uIFNDU0kgYnV0IEJMS19ERVZfU0Qg bWF5CiMKCiMKIyBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUg aW5mbwojCkNPTkZJR19VU0JfU1RPUkFHRT15CiMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlz IG5vdCBzZXQKIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CiMgQ09ORklH X1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAojIENPTkZJR19VU0JfU1RPUkFHRV9JU0Qy MDAgaXMgbm90IHNldAojIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CiMgQ09O RklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TVE9SQUdFX1NE RFI1NSBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQK IyBDT05GSUdfVVNCX1NUT1JBR0VfQUxBVURBIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NUT1JB R0VfT05FVE9VQ0ggaXMgbm90IHNldAojIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qg c2V0CiMgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IgaXMgbm90IHNldAojIENPTkZJ R19VU0JfVUFTIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKCiMK IyBVU0IgSW1hZ2luZyBkZXZpY2VzCiMKIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CiMg Q09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0CgojCiMgVVNCIHBvcnQgZHJpdmVycwojCkNP TkZJR19VU0JfU0VSSUFMPW0KQ09ORklHX1VTQl9FWlVTQj15CkNPTkZJR19VU0JfU0VSSUFMX0dF TkVSSUM9eQojIENPTkZJR19VU0JfU0VSSUFMX0FJUkNBQkxFIGlzIG5vdCBzZXQKIyBDT05GSUdf VVNCX1NFUklBTF9BUkszMTE2IGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9CRUxLSU4g aXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX0NIMzQxIGlzIG5vdCBzZXQKIyBDT05GSUdf VVNCX1NFUklBTF9XSElURUhFQVQgaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX0RJR0lf QUNDRUxFUE9SVCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfQ1AyMTBYIGlzIG5vdCBz ZXQKIyBDT05GSUdfVVNCX1NFUklBTF9DWVBSRVNTX004IGlzIG5vdCBzZXQKIyBDT05GSUdfVVNC X1NFUklBTF9FTVBFRyBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfRlRESV9TSU8gaXMg bm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX0ZVTlNPRlQgaXMgbm90IHNldAojIENPTkZJR19V U0JfU0VSSUFMX1ZJU09SIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9JUEFRIGlzIG5v dCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9JUiBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJ QUxfRURHRVBPUlQgaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUX1RJIGlz IG5vdCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9HQVJNSU4gaXMgbm90IHNldApDT05GSUdfVVNC X1NFUklBTF9JUFc9bQojIENPTkZJR19VU0JfU0VSSUFMX0lVVSBpcyBub3Qgc2V0CiMgQ09ORklH X1VTQl9TRVJJQUxfS0VZU1BBTl9QREEgaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX0tF WVNQQU4gaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX0tMU0kgaXMgbm90IHNldAojIENP TkZJR19VU0JfU0VSSUFMX0tPQklMX1NDVCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxf TUNUX1UyMzIgaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX01PUzc3MjAgaXMgbm90IHNl dAojIENPTkZJR19VU0JfU0VSSUFMX01PUzc4NDAgaXMgbm90IHNldApDT05GSUdfVVNCX1NFUklB TF9NT1RPUk9MQT1tCiMgQ09ORklHX1VTQl9TRVJJQUxfTkFWTUFOIGlzIG5vdCBzZXQKQ09ORklH X1VTQl9TRVJJQUxfUEwyMzAzPW0KIyBDT05GSUdfVVNCX1NFUklBTF9PVEk2ODU4IGlzIG5vdCBz ZXQKIyBDT05GSUdfVVNCX1NFUklBTF9RQ0FVWCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJ QUxfUVVBTENPTU0gaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX1NQQ1A4WDUgaXMgbm90 IHNldAojIENPTkZJR19VU0JfU0VSSUFMX0hQNFggaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VS SUFMX1NBRkUgaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX1NBTUJBIGlzIG5vdCBzZXQK IyBDT05GSUdfVVNCX1NFUklBTF9TSUVNRU5TX01QSSBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9T RVJJQUxfU0lFUlJBV0lSRUxFU1MgaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX1NZTUJP TCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfVEkgaXMgbm90IHNldAojIENPTkZJR19V U0JfU0VSSUFMX0NZQkVSSkFDSyBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfWElSQ09N IGlzIG5vdCBzZXQKQ09ORklHX1VTQl9TRVJJQUxfV1dBTj1tCkNPTkZJR19VU0JfU0VSSUFMX09Q VElPTj1tCiMgQ09ORklHX1VTQl9TRVJJQUxfT01OSU5FVCBpcyBub3Qgc2V0CiMgQ09ORklHX1VT Ql9TRVJJQUxfT1BUSUNPTiBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfVklWT1BBWV9T RVJJQUwgaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX1pJTyBpcyBub3Qgc2V0CiMgQ09O RklHX1VTQl9TRVJJQUxfU1NVMTAwIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9ERUJV RyBpcyBub3Qgc2V0CgojCiMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycwojCiMgQ09ORklHX1VT Ql9FTUk2MiBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CiMgQ09ORklH X1VTQl9BRFVUVVggaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VWU0VHIGlzIG5vdCBzZXQKIyBD T05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90 IHNldAojIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qg c2V0CiMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9D WVRIRVJNIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAojIENPTkZJ R19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBu b3Qgc2V0CiMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAojIENPTkZJR19VU0JfTEQg aXMgbm90IHNldAojIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAojIENPTkZJ R19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAoj IENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAojIENPTkZJR19VU0JfWVVSRVggaXMgbm90 IHNldApDT05GSUdfVVNCX0dBREdFVD1tCiMgQ09ORklHX1VTQl9HQURHRVRfREVCVUcgaXMgbm90 IHNldAojIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTIGlzIG5vdCBzZXQKIyBDT05GSUdf VVNCX0dBREdFVF9ERUJVR19GUyBpcyBub3Qgc2V0CkNPTkZJR19VU0JfR0FER0VUX1ZCVVNfRFJB Vz0yCkNPTkZJR19VU0JfR0FER0VUX1NFTEVDVEVEPXkKIyBDT05GSUdfVVNCX0dBREdFVF9SOEE2 NjU5NyBpcyBub3Qgc2V0CkNPTkZJR19VU0JfR0FER0VUX002NjU5Mj15CkNPTkZJR19VU0JfTTY2 NTkyPW0KIyBDT05GSUdfVVNCX0dBREdFVF9BTUQ1NTM2VURDIGlzIG5vdCBzZXQKIyBDT05GSUdf VVNCX0dBREdFVF9DSTEzWFhYIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0dBREdFVF9ORVQyMjgw IGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0dBREdFVF9HT0tVIGlzIG5vdCBzZXQKIyBDT05GSUdf VVNCX0dBREdFVF9MQU5HV0VMTCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9HQURHRVRfRFVNTVlf SENEIGlzIG5vdCBzZXQKQ09ORklHX1VTQl9HQURHRVRfRFVBTFNQRUVEPXkKQ09ORklHX1VTQl9a RVJPPW0KIyBDT05GSUdfVVNCX0FVRElPIGlzIG5vdCBzZXQKQ09ORklHX1VTQl9FVEg9bQpDT05G SUdfVVNCX0VUSF9STkRJUz15CkNPTkZJR19VU0JfRVRIX0VFTT15CkNPTkZJR19VU0JfR0FER0VU RlM9bQpDT05GSUdfVVNCX0ZVTkNUSU9ORlM9bQpDT05GSUdfVVNCX0ZVTkNUSU9ORlNfRVRIPXkK Q09ORklHX1VTQl9GVU5DVElPTkZTX1JORElTPXkKQ09ORklHX1VTQl9GVU5DVElPTkZTX0dFTkVS SUM9eQojIENPTkZJR19VU0JfRklMRV9TVE9SQUdFIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX01B U1NfU1RPUkFHRSBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9HX1NFUklBTCBpcyBub3Qgc2V0CiMg Q09ORklHX1VTQl9NSURJX0dBREdFVCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9HX1BSSU5URVIg aXMgbm90IHNldAojIENPTkZJR19VU0JfQ0RDX0NPTVBPU0lURSBpcyBub3Qgc2V0CiMgQ09ORklH X1VTQl9HX01VTFRJIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0dfSElEIGlzIG5vdCBzZXQKIyBD T05GSUdfVVNCX0dfREJHUCBpcyBub3Qgc2V0CgojCiMgT1RHIGFuZCByZWxhdGVkIGluZnJhc3Ry dWN0dXJlCiMKIyBDT05GSUdfTk9QX1VTQl9YQ0VJViBpcyBub3Qgc2V0CiMgQ09ORklHX1VXQiBp cyBub3Qgc2V0CkNPTkZJR19NTUM9eQojIENPTkZJR19NTUNfREVCVUcgaXMgbm90IHNldAojIENP TkZJR19NTUNfVU5TQUZFX1JFU1VNRSBpcyBub3Qgc2V0CgojCiMgTU1DL1NEL1NESU8gQ2FyZCBE cml2ZXJzCiMKQ09ORklHX01NQ19CTE9DSz15CkNPTkZJR19NTUNfQkxPQ0tfTUlOT1JTPTgKQ09O RklHX01NQ19CTE9DS19CT1VOQ0U9eQojIENPTkZJR19TRElPX1VBUlQgaXMgbm90IHNldAojIENP TkZJR19NTUNfVEVTVCBpcyBub3Qgc2V0CgojCiMgTU1DL1NEL1NESU8gSG9zdCBDb250cm9sbGVy IERyaXZlcnMKIwpDT05GSUdfTU1DX1NESENJPXkKQ09ORklHX01NQ19TREhDSV9QQ0k9eQpDT05G SUdfTU1DX1JJQ09IX01NQz15CiMgQ09ORklHX01NQ19TREhDSV9QTFRGTSBpcyBub3Qgc2V0CiMg Q09ORklHX01NQ19XQlNEIGlzIG5vdCBzZXQKIyBDT05GSUdfTU1DX1RJRk1fU0QgaXMgbm90IHNl dAojIENPTkZJR19NTUNfU0RSSUNPSF9DUyBpcyBub3Qgc2V0CiMgQ09ORklHX01NQ19DQjcxMCBp cyBub3Qgc2V0CiMgQ09ORklHX01NQ19WSUFfU0RNTUMgaXMgbm90IHNldAojIENPTkZJR19NTUNf VVNIQyBpcyBub3Qgc2V0CiMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKQ09ORklHX05FV19M RURTPXkKQ09ORklHX0xFRFNfQ0xBU1M9eQoKIwojIExFRCBkcml2ZXJzCiMKIyBDT05GSUdfTEVE U19BTElYMiBpcyBub3Qgc2V0CiMgQ09ORklHX0xFRFNfUENBOTUzMiBpcyBub3Qgc2V0CiMgQ09O RklHX0xFRFNfTFAzOTQ0IGlzIG5vdCBzZXQKIyBDT05GSUdfTEVEU19MUDU1MjEgaXMgbm90IHNl dAojIENPTkZJR19MRURTX0xQNTUyMyBpcyBub3Qgc2V0CiMgQ09ORklHX0xFRFNfQ0xFVk9fTUFJ TCBpcyBub3Qgc2V0CiMgQ09ORklHX0xFRFNfUENBOTU1WCBpcyBub3Qgc2V0CiMgQ09ORklHX0xF RFNfQkQyODAyIGlzIG5vdCBzZXQKIyBDT05GSUdfTEVEU19JTlRFTF9TUzQyMDAgaXMgbm90IHNl dAojIENPTkZJR19MRURTX0RFTExfTkVUQk9PS1MgaXMgbm90IHNldApDT05GSUdfTEVEU19UUklH R0VSUz15CgojCiMgTEVEIFRyaWdnZXJzCiMKIyBDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSIGlz IG5vdCBzZXQKIyBDT05GSUdfTEVEU19UUklHR0VSX0hFQVJUQkVBVCBpcyBub3Qgc2V0CiMgQ09O RklHX0xFRFNfVFJJR0dFUl9CQUNLTElHSFQgaXMgbm90IHNldApDT05GSUdfTEVEU19UUklHR0VS X0RFRkFVTFRfT049eQoKIwojIGlwdGFibGVzIHRyaWdnZXIgaXMgdW5kZXIgTmV0ZmlsdGVyIGNv bmZpZyAoTEVEIHRhcmdldCkKIwojIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKIyBD T05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CkNPTkZJR19FREFDPXkKCiMKIyBSZXBvcnRpbmcg c3Vic3lzdGVtcwojCiMgQ09ORklHX0VEQUNfREVCVUcgaXMgbm90IHNldApDT05GSUdfRURBQ19E RUNPREVfTUNFPXkKIyBDT05GSUdfRURBQ19NQ0VfSU5KIGlzIG5vdCBzZXQKQ09ORklHX0VEQUNf TU1fRURBQz15CkNPTkZJR19FREFDX0FNRDY0PXkKIyBDT05GSUdfRURBQ19BTUQ2NF9FUlJPUl9J TkpFQ1RJT04gaXMgbm90IHNldAojIENPTkZJR19FREFDX0U3NTJYIGlzIG5vdCBzZXQKIyBDT05G SUdfRURBQ19JODI5NzVYIGlzIG5vdCBzZXQKIyBDT05GSUdfRURBQ19JMzAwMCBpcyBub3Qgc2V0 CiMgQ09ORklHX0VEQUNfSTMyMDAgaXMgbm90IHNldAojIENPTkZJR19FREFDX1gzOCBpcyBub3Qg c2V0CiMgQ09ORklHX0VEQUNfSTU0MDAgaXMgbm90IHNldAojIENPTkZJR19FREFDX0k3Q09SRSBp cyBub3Qgc2V0CiMgQ09ORklHX0VEQUNfSTUwMDAgaXMgbm90IHNldAojIENPTkZJR19FREFDX0k1 MTAwIGlzIG5vdCBzZXQKIyBDT05GSUdfRURBQ19JNzMwMCBpcyBub3Qgc2V0CkNPTkZJR19SVENf TElCPXkKQ09ORklHX1JUQ19DTEFTUz15CkNPTkZJR19SVENfSENUT1NZUz15CkNPTkZJR19SVENf SENUT1NZU19ERVZJQ0U9InJ0YzAiCiMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CgojCiMg UlRDIGludGVyZmFjZXMKIwpDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQpDT05GSUdfUlRDX0lOVEZf UFJPQz15CkNPTkZJR19SVENfSU5URl9ERVY9eQojIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VN VUwgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAoKIwojIEkyQyBS VEMgZHJpdmVycwojCiMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKIyBDT05GSUdf UlRDX0RSVl9EUzEzNzQgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qg c2V0CiMgQ09ORklHX1JUQ19EUlZfRFMzMjMyIGlzIG5vdCBzZXQKIyBDT05GSUdfUlRDX0RSVl9N QVg2OTAwIGlzIG5vdCBzZXQKIyBDT05GSUdfUlRDX0RSVl9SUzVDMzcyIGlzIG5vdCBzZXQKIyBD T05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKIyBDT05GSUdfUlRDX0RSVl9JU0wxMjAy MiBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAojIENPTkZJR19S VENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90 IHNldAojIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZf QlEzMksgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAojIENP TkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlz IG5vdCBzZXQKIyBDT05GSUdfUlRDX0RSVl9SWDgwMjUgaXMgbm90IHNldAoKIwojIFNQSSBSVEMg ZHJpdmVycwojCgojCiMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKIwpDT05GSUdfUlRDX0RSVl9DTU9T PXkKIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX0RT MTUxMSBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKIyBDT05G SUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlz IG5vdCBzZXQKIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAojIENPTkZJR19SVENf RFJWX000OFQzNSBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQK IyBDT05GSUdfUlRDX0RSVl9NU002MjQyIGlzIG5vdCBzZXQKIyBDT05GSUdfUlRDX0RSVl9CUTQ4 MDIgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX1JQNUMwMSBpcyBub3Qgc2V0CiMgQ09ORklH X1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAoKIwojIG9uLUNQVSBSVEMgZHJpdmVycwojCkNPTkZJ R19ETUFERVZJQ0VTPXkKIyBDT05GSUdfRE1BREVWSUNFU19ERUJVRyBpcyBub3Qgc2V0CgojCiMg RE1BIERldmljZXMKIwojIENPTkZJR19JTlRFTF9NSURfRE1BQyBpcyBub3Qgc2V0CiMgQ09ORklH X0lOVEVMX0lPQVRETUEgaXMgbm90IHNldAojIENPTkZJR19USU1CX0RNQSBpcyBub3Qgc2V0CiMg Q09ORklHX1BDSF9ETUEgaXMgbm90IHNldAojIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQK IyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKQ09ORklHX1NUQUdJTkc9eQojIENPTkZJR19TVEFHSU5H X0VYQ0xVREVfQlVJTEQgaXMgbm90IHNldAojIENPTkZJR19FVDEzMVggaXMgbm90IHNldAojIENP TkZJR19TTElDT1NTIGlzIG5vdCBzZXQKQ09ORklHX1VTQl9JUF9DT01NT049bQpDT05GSUdfVVNC X0lQX1ZIQ0lfSENEPW0KQ09ORklHX1VTQl9JUF9IT1NUPW0KQ09ORklHX1VTQl9JUF9ERUJVR19F TkFCTEU9eQojIENPTkZJR19XMzVVTkQgaXMgbm90IHNldAojIENPTkZJR19QUklTTTJfVVNCIGlz IG5vdCBzZXQKIyBDT05GSUdfRUNITyBpcyBub3Qgc2V0CiMgQ09ORklHX0JSQ004MDIxMSBpcyBu b3Qgc2V0CiMgQ09ORklHX1JUMjg2MCBpcyBub3Qgc2V0CiMgQ09ORklHX1JUMjg3MCBpcyBub3Qg c2V0CiMgQ09ORklHX0NPTUVESSBpcyBub3Qgc2V0CiMgQ09ORklHX0FTVVNfT0xFRCBpcyBub3Qg c2V0CiMgQ09ORklHX1I4MTg3U0UgaXMgbm90IHNldAojIENPTkZJR19SVEw4MTkyVSBpcyBub3Qg c2V0CiMgQ09ORklHX1JUTDgxOTJFIGlzIG5vdCBzZXQKIyBDT05GSUdfUjg3MTJVIGlzIG5vdCBz ZXQKIyBDT05GSUdfVFJBTlpQT1JUIGlzIG5vdCBzZXQKIyBDT05GSUdfUE9ITUVMRlMgaXMgbm90 IHNldAojIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAojIENPTkZJR19JREVfUEhJU09OIGlz IG5vdCBzZXQKIyBDT05GSUdfTElORTZfVVNCIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NFUklB TF9RVUFURUNIMiBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfUVVBVEVDSF9VU0IyIGlz IG5vdCBzZXQKIyBDT05GSUdfVlQ2NjU1IGlzIG5vdCBzZXQKIyBDT05GSUdfVlQ2NjU2IGlzIG5v dCBzZXQKIyBDT05GSUdfRkJfVURMIGlzIG5vdCBzZXQKIyBDT05GSUdfSFlQRVJWIGlzIG5vdCBz ZXQKIyBDT05GSUdfVk1FX0JVUyBpcyBub3Qgc2V0CiMgQ09ORklHX0lJTyBpcyBub3Qgc2V0CiMg Q09ORklHX1pSQU0gaXMgbm90IHNldAojIENPTkZJR19XTEFHUzQ5X0gyIGlzIG5vdCBzZXQKIyBD T05GSUdfV0xBR1M0OV9IMjUgaXMgbm90IHNldAojIENPTkZJR19CQVRNQU5fQURWIGlzIG5vdCBz ZXQKIyBDT05GSUdfU0FNU1VOR19MQVBUT1AgaXMgbm90IHNldAojIENPTkZJR19GQl9TTTdYWCBp cyBub3Qgc2V0CiMgQ09ORklHX0NSWVNUQUxIRCBpcyBub3Qgc2V0CgojCiMgVGV4YXMgSW5zdHJ1 bWVudHMgc2hhcmVkIHRyYW5zcG9ydCBsaW5lIGRpc2NpcGxpbmUKIwojIENPTkZJR19TVF9CVCBp cyBub3Qgc2V0CiMgQ09ORklHX0ZCX1hHSSBpcyBub3Qgc2V0CiMgQ09ORklHX1NNQl9GUyBpcyBu b3Qgc2V0CiMgQ09ORklHX0FDUElfUVVJQ0tTVEFSVCBpcyBub3Qgc2V0CkNPTkZJR19NQUNIX05P X1dFU1RCUklER0U9eQojIENPTkZJR19BVEg2S19MRUdBQ1kgaXMgbm90IHNldAojIENPTkZJR19V U0JfRU5FU1RPUkFHRSBpcyBub3Qgc2V0CiMgQ09ORklHX0JDTV9XSU1BWCBpcyBub3Qgc2V0CiMg Q09ORklHX0ZUMTAwMCBpcyBub3Qgc2V0CgojCiMgU3BlYWt1cCBjb25zb2xlIHNwZWVjaAojCiMg Q09ORklHX1NQRUFLVVAgaXMgbm90IHNldApDT05GSUdfWDg2X1BMQVRGT1JNX0RFVklDRVM9eQpD T05GSUdfQUNFUl9XTUk9eQpDT05GSUdfQUNFUkhERj1tCiMgQ09ORklHX0FTVVNfTEFQVE9QIGlz IG5vdCBzZXQKIyBDT05GSUdfREVMTF9XTUkgaXMgbm90IHNldAojIENPTkZJR19GVUpJVFNVX0xB UFRPUCBpcyBub3Qgc2V0CiMgQ09ORklHX0hQX1dNSSBpcyBub3Qgc2V0CiMgQ09ORklHX01TSV9M QVBUT1AgaXMgbm90IHNldAojIENPTkZJR19QQU5BU09OSUNfTEFQVE9QIGlzIG5vdCBzZXQKIyBD T05GSUdfQ09NUEFMX0xBUFRPUCBpcyBub3Qgc2V0CiMgQ09ORklHX1NPTllfTEFQVE9QIGlzIG5v dCBzZXQKIyBDT05GSUdfSURFQVBBRF9MQVBUT1AgaXMgbm90IHNldAojIENPTkZJR19USElOS1BB RF9BQ1BJIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19IREFQUyBpcyBub3Qgc2V0CiMgQ09O RklHX0lOVEVMX01FTkxPVyBpcyBub3Qgc2V0CiMgQ09ORklHX0VFRVBDX0xBUFRPUCBpcyBub3Qg c2V0CiMgQ09ORklHX0VFRVBDX1dNSSBpcyBub3Qgc2V0CkNPTkZJR19BQ1BJX1dNST15CiMgQ09O RklHX01TSV9XTUkgaXMgbm90IHNldAojIENPTkZJR19BQ1BJX0FTVVMgaXMgbm90IHNldAojIENP TkZJR19UT1BTVEFSX0xBUFRPUCBpcyBub3Qgc2V0CiMgQ09ORklHX0FDUElfVE9TSElCQSBpcyBu b3Qgc2V0CiMgQ09ORklHX1RPU0hJQkFfQlRfUkZLSUxMIGlzIG5vdCBzZXQKIyBDT05GSUdfQUNQ SV9DTVBDIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5URUxfSVBTIGlzIG5vdCBzZXQKIyBDT05GSUdf SUJNX1JUTCBpcyBub3Qgc2V0CgojCiMgRmlybXdhcmUgRHJpdmVycwojCiMgQ09ORklHX0VERCBp cyBub3Qgc2V0CkNPTkZJR19GSVJNV0FSRV9NRU1NQVA9eQojIENPTkZJR19ERUxMX1JCVSBpcyBu b3Qgc2V0CiMgQ09ORklHX0RDREJBUyBpcyBub3Qgc2V0CkNPTkZJR19ETUlJRD15CiMgQ09ORklH X0lTQ1NJX0lCRlRfRklORCBpcyBub3Qgc2V0CgojCiMgRmlsZSBzeXN0ZW1zCiMKIyBDT05GSUdf RVhUMl9GUyBpcyBub3Qgc2V0CkNPTkZJR19FWFQzX0ZTPXkKIyBDT05GSUdfRVhUM19ERUZBVUxU U19UT19PUkRFUkVEIGlzIG5vdCBzZXQKQ09ORklHX0VYVDNfRlNfWEFUVFI9eQojIENPTkZJR19F WFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMg bm90IHNldApDT05GSUdfRVhUNF9GUz15CkNPTkZJR19FWFQ0X1VTRV9GT1JfRVhUMjM9eQpDT05G SUdfRVhUNF9GU19YQVRUUj15CiMgQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQK IyBDT05GSUdfRVhUNF9GU19TRUNVUklUWSBpcyBub3Qgc2V0CiMgQ09ORklHX0VYVDRfREVCVUcg aXMgbm90IHNldApDT05GSUdfSkJEPXkKIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKQ09O RklHX0pCRDI9eQojIENPTkZJR19KQkQyX0RFQlVHIGlzIG5vdCBzZXQKQ09ORklHX0ZTX01CQ0FD SEU9eQojIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX0pGU19GUyBpcyBu b3Qgc2V0CkNPTkZJR19GU19QT1NJWF9BQ0w9eQpDT05GSUdfWEZTX0ZTPXkKIyBDT05GSUdfWEZT X1FVT1RBIGlzIG5vdCBzZXQKIyBDT05GSUdfWEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiMgQ09O RklHX1hGU19SVCBpcyBub3Qgc2V0CiMgQ09ORklHX1hGU19ERUJVRyBpcyBub3Qgc2V0CiMgQ09O RklHX0dGUzJfRlMgaXMgbm90IHNldAojIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiMgQ09O RklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKQ09O RklHX0VYUE9SVEZTPXkKQ09ORklHX0ZJTEVfTE9DS0lORz15CkNPTkZJR19GU05PVElGWT15CiMg Q09ORklHX0ROT1RJRlkgaXMgbm90IHNldApDT05GSUdfSU5PVElGWV9VU0VSPXkKIyBDT05GSUdf RkFOT1RJRlkgaXMgbm90IHNldApDT05GSUdfUVVPVEE9eQojIENPTkZJR19RVU9UQV9ORVRMSU5L X0lOVEVSRkFDRSBpcyBub3Qgc2V0CkNPTkZJR19QUklOVF9RVU9UQV9XQVJOSU5HPXkKIyBDT05G SUdfUVVPVEFfREVCVUcgaXMgbm90IHNldAojIENPTkZJR19RRk1UX1YxIGlzIG5vdCBzZXQKIyBD T05GSUdfUUZNVF9WMiBpcyBub3Qgc2V0CkNPTkZJR19RVU9UQUNUTD15CkNPTkZJR19RVU9UQUNU TF9DT01QQVQ9eQpDT05GSUdfQVVUT0ZTNF9GUz15CkNPTkZJR19GVVNFX0ZTPXkKIyBDT05GSUdf Q1VTRSBpcyBub3Qgc2V0CkNPTkZJR19HRU5FUklDX0FDTD15CgojCiMgQ2FjaGVzCiMKQ09ORklH X0ZTQ0FDSEU9eQojIENPTkZJR19GU0NBQ0hFX1NUQVRTIGlzIG5vdCBzZXQKIyBDT05GSUdfRlND QUNIRV9ISVNUT0dSQU0gaXMgbm90IHNldAojIENPTkZJR19GU0NBQ0hFX0RFQlVHIGlzIG5vdCBz ZXQKIyBDT05GSUdfRlNDQUNIRV9PQkpFQ1RfTElTVCBpcyBub3Qgc2V0CkNPTkZJR19DQUNIRUZJ TEVTPXkKIyBDT05GSUdfQ0FDSEVGSUxFU19ERUJVRyBpcyBub3Qgc2V0CiMgQ09ORklHX0NBQ0hF RklMRVNfSElTVE9HUkFNIGlzIG5vdCBzZXQKCiMKIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiMK Q09ORklHX0lTTzk2NjBfRlM9eQpDT05GSUdfSk9MSUVUPXkKQ09ORklHX1pJU09GUz15CkNPTkZJ R19VREZfRlM9eQpDT05GSUdfVURGX05MUz15CgojCiMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwoj CkNPTkZJR19GQVRfRlM9eQpDT05GSUdfTVNET1NfRlM9bQpDT05GSUdfVkZBVF9GUz15CkNPTkZJ R19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0i dXRmOCIKQ09ORklHX05URlNfRlM9eQojIENPTkZJR19OVEZTX0RFQlVHIGlzIG5vdCBzZXQKQ09O RklHX05URlNfUlc9eQoKIwojIFBzZXVkbyBmaWxlc3lzdGVtcwojCkNPTkZJR19QUk9DX0ZTPXkK Q09ORklHX1BST0NfS0NPUkU9eQpDT05GSUdfUFJPQ19TWVNDVEw9eQpDT05GSUdfUFJPQ19QQUdF X01PTklUT1I9eQpDT05GSUdfU1lTRlM9eQpDT05GSUdfVE1QRlM9eQpDT05GSUdfVE1QRlNfUE9T SVhfQUNMPXkKQ09ORklHX0hVR0VUTEJGUz15CkNPTkZJR19IVUdFVExCX1BBR0U9eQpDT05GSUdf Q09ORklHRlNfRlM9eQpDT05GSUdfTUlTQ19GSUxFU1lTVEVNUz15CiMgQ09ORklHX0FERlNfRlMg aXMgbm90IHNldAojIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfRUNSWVBUX0ZT IGlzIG5vdCBzZXQKIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfSEZTUExVU19G UyBpcyBub3Qgc2V0CiMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAojIENPTkZJR19CRlNfRlMg aXMgbm90IHNldAojIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAojIENPTkZJR19MT0dGUyBpcyBu b3Qgc2V0CkNPTkZJR19DUkFNRlM9eQpDT05GSUdfU1FVQVNIRlM9bQpDT05GSUdfU1FVQVNIRlNf WEFUVFI9eQpDT05GSUdfU1FVQVNIRlNfTFpPPXkKQ09ORklHX1NRVUFTSEZTX0VNQkVEREVEPXkK Q09ORklHX1NRVUFTSEZTX0ZSQUdNRU5UX0NBQ0hFX1NJWkU9MwojIENPTkZJR19WWEZTX0ZTIGlz IG5vdCBzZXQKIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAojIENPTkZJR19PTUZTX0ZTIGlz IG5vdCBzZXQKIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX1FOWDRGU19GUyBp cyBub3Qgc2V0CkNPTkZJR19ST01GU19GUz15CkNPTkZJR19ST01GU19CQUNLRURfQllfQkxPQ0s9 eQpDT05GSUdfUk9NRlNfT05fQkxPQ0s9eQojIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKIyBD T05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUyBpcyBu b3Qgc2V0CgojCiMgUGFydGl0aW9uIFR5cGVzCiMKQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15 CiMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CkNPTkZJR19PU0ZfUEFSVElUSU9O PXkKQ09ORklHX0FNSUdBX1BBUlRJVElPTj15CkNPTkZJR19BVEFSSV9QQVJUSVRJT049eQpDT05G SUdfTUFDX1BBUlRJVElPTj15CkNPTkZJR19NU0RPU19QQVJUSVRJT049eQpDT05GSUdfQlNEX0RJ U0tMQUJFTD15CkNPTkZJR19NSU5JWF9TVUJQQVJUSVRJT049eQpDT05GSUdfU09MQVJJU19YODZf UEFSVElUSU9OPXkKQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTD15CkNPTkZJR19MRE1fUEFSVElU SU9OPXkKQ09ORklHX0xETV9ERUJVRz15CkNPTkZJR19TR0lfUEFSVElUSU9OPXkKQ09ORklHX1VM VFJJWF9QQVJUSVRJT049eQpDT05GSUdfU1VOX1BBUlRJVElPTj15CkNPTkZJR19LQVJNQV9QQVJU SVRJT049eQpDT05GSUdfRUZJX1BBUlRJVElPTj15CkNPTkZJR19TWVNWNjhfUEFSVElUSU9OPXkK Q09ORklHX05MUz15CkNPTkZJR19OTFNfREVGQVVMVD0idXRmOCIKQ09ORklHX05MU19DT0RFUEFH RV80Mzc9eQpDT05GSUdfTkxTX0NPREVQQUdFXzczNz15CkNPTkZJR19OTFNfQ09ERVBBR0VfNzc1 PXkKQ09ORklHX05MU19DT0RFUEFHRV84NTA9eQpDT05GSUdfTkxTX0NPREVQQUdFXzg1Mj15CkNP TkZJR19OTFNfQ09ERVBBR0VfODU1PXkKQ09ORklHX05MU19DT0RFUEFHRV84NTc9eQpDT05GSUdf TkxTX0NPREVQQUdFXzg2MD15CkNPTkZJR19OTFNfQ09ERVBBR0VfODYxPXkKQ09ORklHX05MU19D T0RFUEFHRV84NjI9eQpDT05GSUdfTkxTX0NPREVQQUdFXzg2Mz15CkNPTkZJR19OTFNfQ09ERVBB R0VfODY0PXkKQ09ORklHX05MU19DT0RFUEFHRV84NjU9eQpDT05GSUdfTkxTX0NPREVQQUdFXzg2 Nj15CkNPTkZJR19OTFNfQ09ERVBBR0VfODY5PXkKQ09ORklHX05MU19DT0RFUEFHRV85MzY9eQpD T05GSUdfTkxTX0NPREVQQUdFXzk1MD15CkNPTkZJR19OTFNfQ09ERVBBR0VfOTMyPXkKQ09ORklH X05MU19DT0RFUEFHRV85NDk9eQpDT05GSUdfTkxTX0NPREVQQUdFXzg3ND15CkNPTkZJR19OTFNf SVNPODg1OV84PXkKQ09ORklHX05MU19DT0RFUEFHRV8xMjUwPXkKQ09ORklHX05MU19DT0RFUEFH RV8xMjUxPXkKQ09ORklHX05MU19BU0NJST15CkNPTkZJR19OTFNfSVNPODg1OV8xPXkKQ09ORklH X05MU19JU084ODU5XzI9eQpDT05GSUdfTkxTX0lTTzg4NTlfMz15CkNPTkZJR19OTFNfSVNPODg1 OV80PXkKQ09ORklHX05MU19JU084ODU5XzU9eQpDT05GSUdfTkxTX0lTTzg4NTlfNj15CkNPTkZJ R19OTFNfSVNPODg1OV83PXkKQ09ORklHX05MU19JU084ODU5Xzk9eQpDT05GSUdfTkxTX0lTTzg4 NTlfMTM9eQpDT05GSUdfTkxTX0lTTzg4NTlfMTQ9eQpDT05GSUdfTkxTX0lTTzg4NTlfMTU9eQpD T05GSUdfTkxTX0tPSThfUj15CkNPTkZJR19OTFNfS09JOF9VPXkKQ09ORklHX05MU19VVEY4PXkK IyBDT05GSUdfRExNIGlzIG5vdCBzZXQKCiMKIyBLZXJuZWwgaGFja2luZwojCkNPTkZJR19UUkFD RV9JUlFGTEFHU19TVVBQT1JUPXkKQ09ORklHX1BSSU5US19USU1FPXkKIyBDT05GSUdfRU5BQkxF X1dBUk5fREVQUkVDQVRFRCBpcyBub3Qgc2V0CkNPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CkNP TkZJR19GUkFNRV9XQVJOPTIwNDgKQ09ORklHX01BR0lDX1NZU1JRPXkKQ09ORklHX1NUUklQX0FT TV9TWU1TPXkKIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldApDT05GSUdfREVCVUdf RlM9eQojIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQ09ORklHX0RFQlVHX0tFUk5F TD15CiMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKIyBDT05GSUdfTE9DS1VQX0RFVEVD VE9SIGlzIG5vdCBzZXQKIyBDT05GSUdfSEFSRExPQ0tVUF9ERVRFQ1RPUiBpcyBub3Qgc2V0CkNP TkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKIyBDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5J QyBpcyBub3Qgc2V0CkNPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDX1ZBTFVFPTAKQ09O RklHX1NDSEVEX0RFQlVHPXkKQ09ORklHX1NDSEVEU1RBVFM9eQojIENPTkZJR19USU1FUl9TVEFU UyBpcyBub3Qgc2V0CiMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAojIENPTkZJR19T TFVCX0RFQlVHX09OIGlzIG5vdCBzZXQKQ09ORklHX1NMVUJfU1RBVFM9eQojIENPTkZJR19ERUJV R19QUkVFTVBUIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0 CiMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CiMgQ09ORklHX0RFQlVHX1NQSU5M T0NLIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CkNPTkZJR19C S0w9eQojIENPTkZJR19ERUJVR19MT0NLX0FMTE9DIGlzIG5vdCBzZXQKIyBDT05GSUdfUFJPVkVf TE9DS0lORyBpcyBub3Qgc2V0CiMgQ09ORklHX1NQQVJTRV9SQ1VfUE9JTlRFUiBpcyBub3Qgc2V0 CiMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CkNPTkZJR19UUkFDRV9JUlFGTEFHUz15CiMg Q09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfTE9D S0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKQ09ORklHX1NUQUNLVFJBQ0U9eQojIENPTkZJ R19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQojIENP TkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAoj IENPTkZJR19ERUJVR19WSVJUVUFMIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfV1JJVEVDT1VO VCBpcyBub3Qgc2V0CkNPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CiMgQ09ORklHX0RFQlVHX0xJ U1QgaXMgbm90IHNldAojIENPTkZJR19URVNUX0xJU1RfU09SVCBpcyBub3Qgc2V0CiMgQ09ORklH X0RFQlVHX1NHIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQK IyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldApDT05GSUdfQVJDSF9XQU5UX0ZS QU1FX1BPSU5URVJTPXkKQ09ORklHX0ZSQU1FX1BPSU5URVI9eQojIENPTkZJR19CT09UX1BSSU5U S19ERUxBWSBpcyBub3Qgc2V0CiMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAoj IENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKIyBDT05GSUdfS1BST0JF U19TQU5JVFlfVEVTVCBpcyBub3Qgc2V0CiMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMg bm90IHNldAojIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CiMgQ09ORklH X0RFQlVHX0ZPUkNFX1dFQUtfUEVSX0NQVSBpcyBub3Qgc2V0CiMgQ09ORklHX0xLRFRNIGlzIG5v dCBzZXQKIyBDT05GSUdfQ1BVX05PVElGSUVSX0VSUk9SX0lOSkVDVCBpcyBub3Qgc2V0CiMgQ09O RklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CkNPTkZJR19MQVRFTkNZVE9QPXkKQ09ORklH X1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBz ZXQKQ09ORklHX1VTRVJfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKQ09ORklHX05PUF9UUkFDRVI9eQpD T05GSUdfSEFWRV9GVFJBQ0VfTk1JX0VOVEVSPXkKQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VS PXkKQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSPXkKQ09ORklHX0hBVkVfRlVOQ1RJ T05fR1JBUEhfRlBfVEVTVD15CkNPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNU PXkKQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQpDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5U X1JFQ09SRD15CkNPTkZJR19IQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFM9eQpDT05GSUdfSEFWRV9D X1JFQ09SRE1DT1VOVD15CkNPTkZJR19UUkFDRVJfTUFYX1RSQUNFPXkKQ09ORklHX1JJTkdfQlVG RkVSPXkKQ09ORklHX0ZUUkFDRV9OTUlfRU5URVI9eQpDT05GSUdfRVZFTlRfVFJBQ0lORz15CkNP TkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVI9eQpDT05GSUdfUklOR19CVUZGRVJfQUxMT1dfU1dB UD15CkNPTkZJR19UUkFDSU5HPXkKQ09ORklHX0dFTkVSSUNfVFJBQ0VSPXkKQ09ORklHX1RSQUNJ TkdfU1VQUE9SVD15CkNPTkZJR19GVFJBQ0U9eQpDT05GSUdfRlVOQ1RJT05fVFJBQ0VSPXkKQ09O RklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CkNPTkZJR19JUlFTT0ZGX1RSQUNFUj15CkNPTkZJ R19QUkVFTVBUX1RSQUNFUj15CkNPTkZJR19TQ0hFRF9UUkFDRVI9eQpDT05GSUdfRlRSQUNFX1NZ U0NBTExTPXkKQ09ORklHX0JSQU5DSF9QUk9GSUxFX05PTkU9eQojIENPTkZJR19QUk9GSUxFX0FO Tk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CiMgQ09ORklHX1BST0ZJTEVfQUxMX0JSQU5DSEVT IGlzIG5vdCBzZXQKIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKQ09ORklHX0JMS19E RVZfSU9fVFJBQ0U9eQpDT05GSUdfS1BST0JFX0VWRU5UPXkKQ09ORklHX0RZTkFNSUNfRlRSQUNF PXkKQ09ORklHX0ZVTkNUSU9OX1BST0ZJTEVSPXkKQ09ORklHX0ZUUkFDRV9NQ09VTlRfUkVDT1JE PXkKIyBDT05GSUdfRlRSQUNFX1NUQVJUVVBfVEVTVCBpcyBub3Qgc2V0CiMgQ09ORklHX01NSU9U UkFDRSBpcyBub3Qgc2V0CkNPTkZJR19SSU5HX0JVRkZFUl9CRU5DSE1BUks9bQojIENPTkZJR19Q Uk9WSURFX09IQ0kxMzk0X0RNQV9JTklUIGlzIG5vdCBzZXQKIyBDT05GSUdfRFlOQU1JQ19ERUJV RyBpcyBub3Qgc2V0CiMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAojIENPTkZJR19B VE9NSUM2NF9TRUxGVEVTVCBpcyBub3Qgc2V0CiMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldApD T05GSUdfSEFWRV9BUkNIX0tHREI9eQojIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKQ09ORklHX0hB VkVfQVJDSF9LTUVNQ0hFQ0s9eQojIENPTkZJR19TVFJJQ1RfREVWTUVNIGlzIG5vdCBzZXQKIyBD T05GSUdfWDg2X1ZFUkJPU0VfQk9PVFVQIGlzIG5vdCBzZXQKQ09ORklHX0VBUkxZX1BSSU5USz15 CiMgQ09ORklHX0VBUkxZX1BSSU5US19EQkdQIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfU1RB Q0tPVkVSRkxPVyBpcyBub3Qgc2V0CiMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBz ZXQKIyBDT05GSUdfREVCVUdfUEVSX0NQVV9NQVBTIGlzIG5vdCBzZXQKIyBDT05GSUdfWDg2X1BU RFVNUCBpcyBub3Qgc2V0CkNPTkZJR19ERUJVR19ST0RBVEE9eQpDT05GSUdfREVCVUdfUk9EQVRB X1RFU1Q9eQojIENPTkZJR19ERUJVR19OWF9URVNUIGlzIG5vdCBzZXQKIyBDT05GSUdfSU9NTVVf REVCVUcgaXMgbm90IHNldAojIENPTkZJR19JT01NVV9TVFJFU1MgaXMgbm90IHNldApDT05GSUdf SEFWRV9NTUlPVFJBQ0VfU1VQUE9SVD15CiMgQ09ORklHX1g4Nl9ERUNPREVSX1NFTEZURVNUIGlz IG5vdCBzZXQKQ09ORklHX0lPX0RFTEFZX1RZUEVfMFg4MD0wCkNPTkZJR19JT19ERUxBWV9UWVBF XzBYRUQ9MQpDT05GSUdfSU9fREVMQVlfVFlQRV9VREVMQVk9MgpDT05GSUdfSU9fREVMQVlfVFlQ RV9OT05FPTMKQ09ORklHX0lPX0RFTEFZXzBYODA9eQojIENPTkZJR19JT19ERUxBWV8wWEVEIGlz IG5vdCBzZXQKIyBDT05GSUdfSU9fREVMQVlfVURFTEFZIGlzIG5vdCBzZXQKIyBDT05GSUdfSU9f REVMQVlfTk9ORSBpcyBub3Qgc2V0CkNPTkZJR19ERUZBVUxUX0lPX0RFTEFZX1RZUEU9MAojIENP TkZJR19ERUJVR19CT09UX1BBUkFNUyBpcyBub3Qgc2V0CiMgQ09ORklHX0NQQV9ERUJVRyBpcyBu b3Qgc2V0CkNPTkZJR19PUFRJTUlaRV9JTkxJTklORz15CiMgQ09ORklHX0RFQlVHX1NUUklDVF9V U0VSX0NPUFlfQ0hFQ0tTIGlzIG5vdCBzZXQKCiMKIyBTZWN1cml0eSBvcHRpb25zCiMKQ09ORklH X0tFWVM9eQpDT05GSUdfS0VZU19ERUJVR19QUk9DX0tFWVM9eQojIENPTkZJR19TRUNVUklUWV9E TUVTR19SRVNUUklDVCBpcyBub3Qgc2V0CkNPTkZJR19TRUNVUklUWT15CiMgQ09ORklHX1NFQ1VS SVRZRlMgaXMgbm90IHNldApDT05GSUdfU0VDVVJJVFlfTkVUV09SSz15CkNPTkZJR19TRUNVUklU WV9ORVRXT1JLX1hGUk09eQojIENPTkZJR19TRUNVUklUWV9QQVRIIGlzIG5vdCBzZXQKIyBDT05G SUdfSU5URUxfVFhUIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VDVVJJVFlfU0VMSU5VWCBpcyBub3Qg c2V0CiMgQ09ORklHX1NFQ1VSSVRZX1RPTU9ZTyBpcyBub3Qgc2V0CiMgQ09ORklHX1NFQ1VSSVRZ X0FQUEFSTU9SIGlzIG5vdCBzZXQKIyBDT05GSUdfSU1BIGlzIG5vdCBzZXQKQ09ORklHX0RFRkFV TFRfU0VDVVJJVFlfREFDPXkKQ09ORklHX0RFRkFVTFRfU0VDVVJJVFk9IiIKQ09ORklHX0NSWVBU Tz15CgojCiMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiMKQ09ORklHX0NSWVBUT19BTEdBUEk9eQpD T05GSUdfQ1JZUFRPX0FMR0FQSTI9eQpDT05GSUdfQ1JZUFRPX0FFQUQ9eQpDT05GSUdfQ1JZUFRP X0FFQUQyPXkKQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQpDT05GSUdfQ1JZUFRPX0JMS0NJUEhF UjI9eQpDT05GSUdfQ1JZUFRPX0hBU0g9eQpDT05GSUdfQ1JZUFRPX0hBU0gyPXkKQ09ORklHX0NS WVBUT19STkcyPXkKQ09ORklHX0NSWVBUT19QQ09NUD15CkNPTkZJR19DUllQVE9fUENPTVAyPXkK Q09ORklHX0NSWVBUT19NQU5BR0VSPXkKQ09ORklHX0NSWVBUT19NQU5BR0VSMj15CkNPTkZJR19D UllQVE9fTUFOQUdFUl9ESVNBQkxFX1RFU1RTPXkKIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlz IG5vdCBzZXQKQ09ORklHX0NSWVBUT19OVUxMPXkKIyBDT05GSUdfQ1JZUFRPX1BDUllQVCBpcyBu b3Qgc2V0CkNPTkZJR19DUllQVE9fV09SS1FVRVVFPXkKQ09ORklHX0NSWVBUT19DUllQVEQ9eQpD T05GSUdfQ1JZUFRPX0FVVEhFTkM9eQojIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0Cgoj CiMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCiMKIyBDT05G SUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAoj IENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAoKIwojIEJsb2NrIG1vZGVzCiMKQ09ORklH X0NSWVBUT19DQkM9eQojIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZ UFRPX0NUUyBpcyBub3Qgc2V0CkNPTkZJR19DUllQVE9fRUNCPXkKIyBDT05GSUdfQ1JZUFRPX0xS VyBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZ UFRPX1hUUyBpcyBub3Qgc2V0CgojCiMgSGFzaCBtb2RlcwojCkNPTkZJR19DUllQVE9fSE1BQz15 CkNPTkZJR19DUllQVE9fWENCQz15CiMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKCiMK IyBEaWdlc3QKIwpDT05GSUdfQ1JZUFRPX0NSQzMyQz15CiMgQ09ORklHX0NSWVBUT19DUkMzMkNf SU5URUwgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldApDT05GSUdf Q1JZUFRPX01END15CkNPTkZJR19DUllQVE9fTUQ1PXkKIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxf TUlDIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CiMgQ09ORklH X0NSWVBUT19STUQxNjAgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBz ZXQKIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CkNPTkZJR19DUllQVE9fU0hBMT15 CkNPTkZJR19DUllQVE9fU0hBMjU2PXkKQ09ORklHX0NSWVBUT19TSEE1MTI9eQojIENPTkZJR19D UllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQK IyBDT05GSUdfQ1JZUFRPX0dIQVNIX0NMTVVMX05JX0lOVEVMIGlzIG5vdCBzZXQKCiMKIyBDaXBo ZXJzCiMKQ09ORklHX0NSWVBUT19BRVM9eQpDT05GSUdfQ1JZUFRPX0FFU19YODZfNjQ9eQojIENP TkZJR19DUllQVE9fQUVTX05JX0lOVEVMIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0FOVUJJ UyBpcyBub3Qgc2V0CkNPTkZJR19DUllQVE9fQVJDND15CiMgQ09ORklHX0NSWVBUT19CTE9XRklT SCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CiMgQ09ORklH X0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0 CkNPTkZJR19DUllQVE9fREVTPXkKIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CiMg Q09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fU0FMU0EyMCBp cyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19TQUxTQTIwX1g4Nl82NCBpcyBub3Qgc2V0CiMgQ09O RklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90 IHNldAojIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1RXT0ZJ U0ggaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fVFdPRklTSF9YODZfNjQgaXMgbm90IHNldAoK IwojIENvbXByZXNzaW9uCiMKQ09ORklHX0NSWVBUT19ERUZMQVRFPXkKQ09ORklHX0NSWVBUT19a TElCPXkKQ09ORklHX0NSWVBUT19MWk89eQoKIwojIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgoj CiMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0hX IGlzIG5vdCBzZXQKQ09ORklHX0hBVkVfS1ZNPXkKQ09ORklHX0hBVkVfS1ZNX0lSUUNISVA9eQpD T05GSUdfSEFWRV9LVk1fRVZFTlRGRD15CkNPTkZJR19LVk1fQVBJQ19BUkNISVRFQ1RVUkU9eQpD T05GSUdfS1ZNX01NSU89eQpDT05GSUdfVklSVFVBTElaQVRJT049eQpDT05GSUdfS1ZNPW0KIyBD T05GSUdfS1ZNX0lOVEVMIGlzIG5vdCBzZXQKQ09ORklHX0tWTV9BTUQ9bQojIENPTkZJR19LVk1f TU1VX0FVRElUIGlzIG5vdCBzZXQKQ09ORklHX1ZIT1NUX05FVD1tCkNPTkZJR19WSVJUSU89bQpD T05GSUdfVklSVElPX1JJTkc9bQpDT05GSUdfVklSVElPX1BDST1tCkNPTkZJR19WSVJUSU9fQkFM TE9PTj1tCkNPTkZJR19CSU5BUllfUFJJTlRGPXkKCiMKIyBMaWJyYXJ5IHJvdXRpbmVzCiMKQ09O RklHX0JJVFJFVkVSU0U9eQpDT05GSUdfR0VORVJJQ19GSU5EX0ZJUlNUX0JJVD15CkNPTkZJR19H RU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQpDT05GSUdfR0VORVJJQ19GSU5EX0xBU1RfQklUPXkKQ09O RklHX0NSQ19DQ0lUVD15CkNPTkZJR19DUkMxNj15CkNPTkZJR19DUkNfVDEwRElGPXkKQ09ORklH X0NSQ19JVFVfVD15CkNPTkZJR19DUkMzMj15CiMgQ09ORklHX0NSQzcgaXMgbm90IHNldApDT05G SUdfTElCQ1JDMzJDPXkKQ09ORklHX1pMSUJfSU5GTEFURT15CkNPTkZJR19aTElCX0RFRkxBVEU9 eQpDT05GSUdfTFpPX0NPTVBSRVNTPXkKQ09ORklHX0xaT19ERUNPTVBSRVNTPXkKQ09ORklHX1RF WFRTRUFSQ0g9eQpDT05GSUdfVEVYVFNFQVJDSF9LTVA9eQpDT05GSUdfVEVYVFNFQVJDSF9CTT15 CkNPTkZJR19URVhUU0VBUkNIX0ZTTT15CkNPTkZJR19IQVNfSU9NRU09eQpDT05GSUdfSEFTX0lP UE9SVD15CkNPTkZJR19IQVNfRE1BPXkKQ09ORklHX05MQVRUUj15Cg== --20cf304346ba14be23049ad7f56c-- From aelder@sgi.com Thu Jan 27 12:50:01 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0RIo0bK005274 for ; Thu, 27 Jan 2011 12:50: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 D2B52AC010; Thu, 27 Jan 2011 10:52:22 -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, 27 Jan 2011 12:52:22 -0600 Subject: Re: [PATCH] xfs_bmap_add_extent_delay_real should set br_startblock to nullstartblock From: Alex Elder Reply-To: aelder@sgi.com To: Ben Myers Cc: david@fromorbit.com, xfs@oss.sgi.com In-Reply-To: <20110119174158.28574.63968.stgit@lady3jane.americas.sgi.com> References: <20110119174158.28574.63968.stgit@lady3jane.americas.sgi.com> Content-Type: text/plain; charset="UTF-8" Date: Thu, 27 Jan 2011 12:52:21 -0600 Message-ID: <1296154341.1973.138.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 27 Jan 2011 18:52:22.0421 (UTC) FILETIME=[54C8F450:01CBBE53] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2011-01-19 at 11:41 -0600, Ben Myers wrote: > When filling in the middle of a previous delayed allocation in > xfs_bmap_add_extent_delay_real, set br_startblock of the new delay extent to > the right to nullstartblock instead of 0 before inserting the extent into the > ifork (xfs_iext_insert), rather than setting br_startblock afterward. > > Adding the extent into the ifork with br_startblock=0 can lead to the extent > being copied into the btree by xfs_bmap_extent_to_btree if we happen to convert > from extents format to btree format before updating br_startblock with the > correct value. The unexpected addition of this delay extent to the btree can > cause subsequent XFS_WANT_CORRUPTED_GOTO filesystem shutdown in several > xfs_bmap_add_extent_delay_real cases where we are converting a delay extent to > real and unexpectedly find an extent already inserted. For example: . . . > SGI-PV: 1013221 > > Signed-off-by: Ben Myers > --- > fs/xfs/xfs_bmap.c | 33 +++++++++++++++++++++++++-------- > 1 files changed, 25 insertions(+), 8 deletions(-) This looks OK, but I want to point something out. I'm not sure whether it's a significant problem or not, but I think it could screw up some reservation counts. First though, it may be that the LEFT, RIGHT, etc. were not used here because the xfs_bmbt_irec_t array was not being used in the same way as it was being used elsewhere in this function. Instead, they are being overwritten with new extent data. Same thing happens in xfs_bmap_add_extent_unwritten_real(). Nevertheless, I find that the symbolic names make the result more readable, so I like the change. Here's the thing I wanted to point out. This change fixes it so the delalloc space after the new extent has the correct NULL start block address (encoding the worst case indirect block count in it). Meanwhile, it does not update the NULL start block address of PREV (and of course, this is how the existing code works too). That means that the indirect block count encoded therein may be wrong as a result of the update. I.e., in addition to: xfs_bmbt_set_blockcount(ep, temp); I think we ought to do: int indlen; indlen = (int) xfs_bmap_worst_indlen(ip, temp); PREV.br_startblock = nullstartblock(indlen); and then somehow update the in-core extent map with the new information. (I don't know if there's an interface to do that right now.) Maybe the in-core map doesn't have to accurately reflect the encoded indirect block reservation, I don't know. If it does though, the code here (and likely elsewhere) should probably be rearranged a bit so we can update all three extents (PREV, LEFT (new), and RIGHT) with one call to xfs_iext_update(). Note (again) that this doesn't say anything wrong with this change, just that in looking at it I noticed something else that might need to be fixed. -Alex > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 4111cd3..c1db779 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -1038,17 +1038,34 @@ xfs_bmap_add_extent_delay_real( > * Filling in the middle part of a previous delayed allocation. > * Contiguity is impossible here. > * This case is avoided almost all the time. > + * > + * We start with a delayed allocation: > + * > + * +ddddddddddddddddddddddddddddddddddddddddddddddddddddddd+ > + * PREV @ idx > + * > + * and we are allocating: > + * +rrrrrrrrrrrrrrrrr+ > + * new > + * > + * and we set it up for insertion as: > + * +ddddddddddddddddddd+rrrrrrrrrrrrrrrrr+ddddddddddddddddd+ > + * new > + * PREV @ idx LEFT RIGHT > + * inserted at idx + 1 > */ > temp = new->br_startoff - PREV.br_startoff; > - trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); > - xfs_bmbt_set_blockcount(ep, temp); > - r[0] = *new; > - r[1].br_state = PREV.br_state; > - r[1].br_startblock = 0; > - r[1].br_startoff = new_endoff; > temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; > - r[1].br_blockcount = temp2; > - xfs_iext_insert(ip, idx + 1, 2, &r[0], state); Somehow I think this call, which inserts *two* extents, is the reason this problem was a bit difficult to spot. Almost all the other calls to this function insert just one. > + trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); > + xfs_bmbt_set_blockcount(ep, temp); /* truncate PREV */ > + LEFT = *new; > + RIGHT.br_state = PREV.br_state; > + RIGHT.br_startblock = nullstartblock( > + (int)xfs_bmap_worst_indlen(ip, temp2)); > + RIGHT.br_startoff = new_endoff; > + RIGHT.br_blockcount = temp2; > + /* insert LEFT (r[0]) and RIGHT (r[1]) at the same time */ > + xfs_iext_insert(ip, idx + 1, 2, &LEFT, state); > ip->i_df.if_lastex = idx + 1; > ip->i_d.di_nextents++; > if (cur == NULL) > From stan@hardwarefreak.com Thu Jan 27 13:37:44 2011 X-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 p0RJbhg4012263 for ; Thu, 27 Jan 2011 13:37:43 -0600 X-ASG-Debug-ID: 1296157207-0dbd01c70000-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 09E3829701F for ; Thu, 27 Jan 2011 11:40: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 392FbHnkI3mSWBBD for ; Thu, 27 Jan 2011 11:40:07 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id CFC196C0C3; Thu, 27 Jan 2011 13:40:06 -0600 (CST) Message-ID: <4D41CA16.8070001@hardwarefreak.com> Date: Thu, 27 Jan 2011 13:40: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: Mark Lord CC: Justin Piszcz , Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> In-Reply-To: <4D419765.4070805@teksavvy.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: 1296157208 X-Barracuda-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.53615 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 Mark Lord put forth on 1/27/2011 10:03 AM: > On 11-01-27 10:40 AM, Justin Piszcz wrote: >> >> >> On Thu, 27 Jan 2011, Mark Lord wrote: > .. >>> Can you recommend a good set of mkfs.xfs parameters to suit the characteristics >>> of this system? Eg. Only a few thousand active inodes, and nearly all files are >>> in the 600MB -> 20GB size range. The usage pattern it must handle is up to >>> six concurrent streaming writes at the same time as up to three streaming reads, >>> with no significant delays permitted on the reads. >>> >>> That's the kind of workload that I find XFS handles nicely, >>> and EXT4 has given me trouble with in the past. > .. >> I did a load of benchmarks a long time ago testing every mkfs.xfs option there >> was, and I found that most of the time (if not all), the defaults were the best. > .. > > I am concerned with fragmentation on the very special workload in this case. > I'd really like the 20GB files, written over a 1-2 hour period, to consist > of a very few very large extents, as much as possible. For XFS that's actually not a special case workload but an average one. XFS was conceived at SGI for use on large supercomputers where typical single file datasets are extremely large, i.e. hundreds of GB. Also note that the real time sub volume feature was created for almost exactly your purpose: streaming record/playback of raw A/V data for broadcast (i.e. television). In your case it's compressed, not raw A/V data. I'm not recommending you use the real time feature however, as it's overkill for MythTV and not necessary. > Rather than hundreds or thousands of "tiny" MB sized extents. > I wonder what the best mkfs.xfs parameters might be to encourage that? You need to use the mkfs.xfs defaults for any single drive filesystem, and trust the allocator to do the right thing. XFS uses variable size extents and the size is chosen dynamically--you don't have direct or indirect control of the extent size chosen for a given file or set of files AFAIK. As Dave Chinner is fond of pointing out, it's those who don't know enough about XFS and choose custom settings that most often get themselves into trouble (as you've already done once). :) The defaults exist for a reason, and they weren't chosen willy nilly. The vast bulk of XFS' configurability exists for tuning maximum performance on large to very large RAID arrays. There isn't much, if any, additional performance to be gained with parameter tweaks on a single drive XFS filesystem. A brief explanation of agcount: the filesystem is divided into agcount regions called allocation groups, or AGs. The allocator writes to all AGs in parallel to increase performance. With extremely fast storage (SSD, large high RPM RAID) this increases throughput as the storage can often sink writes faster than a serial writer can push data. In your case, you have a single slow spindle with over 7,000 AGs. Thus, the allocator is writing to over 7,000 locations on that single disk simultaneously, or, at least, it's trying to. Thus, the poor head on that drive is being whipped all over the place without actually getting much writing done. To add insults to injury, this is one of these low RPM low head performance "green" drives correct? Trust the defaults. If they give you problems (unlikely) then we can't talk. ;) -- Stan From david@lang.hm Thu Jan 27 14:10:15 2011 X-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 p0RKAE7i017562 for ; Thu, 27 Jan 2011 14:10:15 -0600 X-ASG-Debug-ID: 1296159158-0dbd028b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bifrost.lang.hm (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 58C08296C9E; Thu, 27 Jan 2011 12:12:38 -0800 (PST) Received: from bifrost.lang.hm (mail.lang.hm [64.81.33.126]) by cuda.sgi.com with ESMTP id GH4RzdohcvOJNpC0; Thu, 27 Jan 2011 12:12:38 -0800 (PST) Received: from asgard.lang.hm (asgard.lang.hm [10.0.0.100]) by bifrost.lang.hm (8.13.4/8.13.4/Debian-3) with ESMTP id p0RKBsr1028656; Thu, 27 Jan 2011 12:11:54 -0800 Date: Thu, 27 Jan 2011 12:11:54 -0800 (PST) From: david@lang.hm X-X-Sender: dlang@asgard.lang.hm To: Stan Hoeppner cc: Mark Lord , Justin Piszcz , Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount In-Reply-To: <4D41CA16.8070001@hardwarefreak.com> Message-ID: References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> 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: mail.lang.hm[64.81.33.126] X-Barracuda-Start-Time: 1296159159 X-Barracuda-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.53617 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 On Thu, 27 Jan 2011, Stan Hoeppner wrote: >> Rather than hundreds or thousands of "tiny" MB sized extents. >> I wonder what the best mkfs.xfs parameters might be to encourage that? > > You need to use the mkfs.xfs defaults for any single drive filesystem, and trust > the allocator to do the right thing. XFS uses variable size extents and the > size is chosen dynamically--you don't have direct or indirect control of the > extent size chosen for a given file or set of files AFAIK. > > As Dave Chinner is fond of pointing out, it's those who don't know enough about > XFS and choose custom settings that most often get themselves into trouble (as > you've already done once). :) > > The defaults exist for a reason, and they weren't chosen willy nilly. The vast > bulk of XFS' configurability exists for tuning maximum performance on large to > very large RAID arrays. There isn't much, if any, additional performance to be > gained with parameter tweaks on a single drive XFS filesystem. how do I understand how to setup things on multi-disk systems? the documentation I've found online is not that helpful, and in some ways contradictory. If there really are good rules for how to do this, it would be very helpful if you could just give mkfs.xfs the information about your system (this partition is on a 16 drive raid6 array) and have it do the right thing. David Lang > A brief explanation of agcount: the filesystem is divided into agcount regions > called allocation groups, or AGs. The allocator writes to all AGs in parallel > to increase performance. With extremely fast storage (SSD, large high RPM RAID) > this increases throughput as the storage can often sink writes faster than a > serial writer can push data. In your case, you have a single slow spindle with > over 7,000 AGs. Thus, the allocator is writing to over 7,000 locations on that > single disk simultaneously, or, at least, it's trying to. Thus, the poor head > on that drive is being whipped all over the place without actually getting much > writing done. To add insults to injury, this is one of these low RPM low head > performance "green" drives correct? > > Trust the defaults. If they give you problems (unlikely) then we can't talk. ;) > > From john@stoffel.org Thu Jan 27 14:21:42 2011 X-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 p0RKLgbp019564 for ; Thu, 27 Jan 2011 14:21:42 -0600 X-ASG-Debug-ID: 1296159845-7e0f02960000-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 016768D4B37; Thu, 27 Jan 2011 12:24:05 -0800 (PST) Received: from mycroft.westnet.com ([216.187.52.7]) by cuda.sgi.com with ESMTP id xljDYH5bHpiyEjHa; Thu, 27 Jan 2011 12:24:05 -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 p0RKNBgd015949 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 27 Jan 2011 15:23:12 -0500 (EST) Received: by jfsnew.stoffel.org (Postfix, from userid 1000) id C81EBA0F1B; Thu, 27 Jan 2011 15:24:25 -0500 (EST) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <19777.54393.645313.900155@quad.stoffel.home> Date: Thu, 27 Jan 2011 15:24:25 -0500 From: "John Stoffel" To: Mark Lord Cc: Justin Piszcz , Stan Hoeppner , Christoph Hellwig , xfs@oss.sgi.com, Linux Kernel , Alex Elder X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount In-Reply-To: <4D419765.4070805@teksavvy.com> References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.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: UNKNOWN[216.187.52.7] X-Barracuda-Start-Time: 1296159847 X-Barracuda-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_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.53618 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS >>>>> "Mark" == Mark Lord writes: Mark> On 11-01-27 10:40 AM, Justin Piszcz wrote: >> >> >> On Thu, 27 Jan 2011, Mark Lord wrote: Mark> .. >>> Can you recommend a good set of mkfs.xfs parameters to suit the characteristics >>> of this system? Eg. Only a few thousand active inodes, and nearly all files are >>> in the 600MB -> 20GB size range. The usage pattern it must handle is up to >>> six concurrent streaming writes at the same time as up to three streaming reads, >>> with no significant delays permitted on the reads. >>> >>> That's the kind of workload that I find XFS handles nicely, >>> and EXT4 has given me trouble with in the past. Mark> .. >> I did a load of benchmarks a long time ago testing every mkfs.xfs option there >> was, and I found that most of the time (if not all), the defaults were the best. Mark> .. Mark> I am concerned with fragmentation on the very special workload Mark> in this case. I'd really like the 20GB files, written over a Mark> 1-2 hour period, to consist of a very few very large extents, as Mark> much as possible. Mark> Rather than hundreds or thousands of "tiny" MB sized extents. I Mark> wonder what the best mkfs.xfs parameters might be to encourage Mark> that? Hmmm, should the application be pre-allocating the disk space then, so that the writes get into nice large extents automatically? Isn't this what the fallocate() system call is for? Doesn't MythTV use this? I don't use XFS, or MythTV, but I like keeping track of this stuff. John From kernel@teksavvy.com Thu Jan 27 15:53:59 2011 X-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 p0RLrxfi033571 for ; Thu, 27 Jan 2011 15:53:59 -0600 X-ASG-Debug-ID: 1296165382-4eba02b80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ironport2-out.pppoe.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D444F1A38A38 for ; Thu, 27 Jan 2011 13:56:23 -0800 (PST) Received: from ironport2-out.pppoe.ca (ironport2-out.teksavvy.com [206.248.154.183]) by cuda.sgi.com with ESMTP id t6C63vj03oIFpNgG for ; Thu, 27 Jan 2011 13:56:23 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApIBADd5QU1Ld/sX/2dsb2JhbAAMhAjNC5BigSODOHQEhRc X-IronPort-AV: E=Sophos;i="4.60,387,1291611600"; d="scan'208";a="89473119" Received: from rtr.ca (HELO [10.0.0.6]) ([75.119.251.23]) by ironport2-out.pppoe.ca with ESMTP/TLS/DHE-RSA-CAMELLIA256-SHA; 27 Jan 2011 16:56:21 -0500 Message-ID: <4D41EA04.7010506@teksavvy.com> Date: Thu, 27 Jan 2011 16:56:20 -0500 From: Mark Lord User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Stan Hoeppner CC: Justin Piszcz , Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> In-Reply-To: <4D41CA16.8070001@hardwarefreak.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ironport2-out.teksavvy.com[206.248.154.183] X-Barracuda-Start-Time: 1296165383 X-Barracuda-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.53625 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 11-01-27 02:40 PM, Stan Hoeppner wrote: .. > You need to use the mkfs.xfs defaults for any single drive filesystem, and trust > the allocator to do the right thing. But it did not do the right thing when I used the defaults. Big files ended up with tons of (exactly) 64MB extents, ISTR. With the increased number of ags, I saw much less fragmentation, and the drive was still very light on I/O despite multiple simultaneous recordings, commflaggers, and playback at once. The only, ONLY, glitch, was this recent "first write takes 45 seconds" glitch. After that initial write after boot, throughput was normal (great). Thus the attempts to tweak. > Trust the defaults. I imagine the defaults are designed to handle a typical Linux install, with 100,000 to 1,000,000 files varying from a few bytes to a few megabytes. That's not what this filesystem will have. It will have only a few thousand (max) inodes at any given time, but each file will be HUGE. XFS is fantastic at adapting to the workload, but I'd like to try and have it tuned more closely for the known workload this system is throwing at it. I'm now trying again, but with 8 ags instead of 8000+. Thanks! From aelder@sgi.com Thu Jan 27 17:17:45 2011 X-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 (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 p0RNHjhF047580 for ; Thu, 27 Jan 2011 17:17:45 -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 5BDC18F8096; Thu, 27 Jan 2011 15:20:07 -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, 27 Jan 2011 17:20:07 -0600 Subject: Re: [PATCH 3/6] xfs: do not immediately reuse busy extent ranges From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20110121092550.933551564@bombadil.infradead.org> References: <20110121092227.115815324@bombadil.infradead.org> <20110121092550.933551564@bombadil.infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Thu, 27 Jan 2011 17:20:06 -0600 Message-ID: <1296170406.7651.523.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 27 Jan 2011 23:20:07.0382 (UTC) FILETIME=[BC3F7760:01CBBE78] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 2011-01-21 at 04:22 -0500, Christoph Hellwig wrote: > Every time we reallocate a busy extent, we cause a synchronous log force > to occur to ensure the freeing transaction is on disk before we continue > and use the newly allocated extent. This is extremely sub-optimal as we > have to mark every transaction with blocks that get reused as synchronous. > > Instead of searching the busy extent list after deciding on the extent to > allocate, check each candidate extent during the allocation decisions as > to whether they are in the busy list. If they are in the busy list, we > trim the busy range out of the extent we have found and determine if that > trimmed range is still OK for allocation. In many cases, this check can > be incorporated into the allocation extent alignment code which already > does trimming of the found extent before determining if it is a valid > candidate for allocation. > > [hch: merged two earlier patches from Dave and fixed various bugs] > > Signed-off-by: Dave Chinner > Signed-off-by: Christoph Hellwig You know, I must really not be looking at this right, because the way I am interpreting your xfs_alloc_busy_search_trim(), it's just plain wrong. Perhaps it arrives at an OK result anyway, but please take a look to see if I'm just confused. I have a few other comments, not as important. Generally the rest of it looks good. I'll pick up with the rest of the series tomorrow. -Alex > Index: xfs/fs/xfs/xfs_alloc.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_alloc.c 2011-01-17 22:05:27.146004341 +0100 > +++ xfs/fs/xfs/xfs_alloc.c 2011-01-18 13:04:30.239023407 +0100 . . . > @@ -2654,6 +2730,71 @@ xfs_alloc_busy_search( > return match; > } > > +/* > + * For a given extent [fbno, flen], search the busy extent list > + * to find a subset of the extent that is not busy. > + */ > +void > +xfs_alloc_busy_search_trim( > + struct xfs_mount *mp, > + struct xfs_perag *pag, > + xfs_agblock_t fbno, > + xfs_extlen_t flen, > + xfs_agblock_t *rbno, > + xfs_extlen_t *rlen) > +{ > + struct rb_node *rbp; > + xfs_agblock_t bno = fbno; > + xfs_extlen_t len = flen; > + I don't know if it's important, but you could ASSERT(flen > 0) here. > + spin_lock(&pag->pagb_lock); > + rbp = pag->pagb_tree.rb_node; > + while (rbp) { while (rbp && len) { > + struct xfs_busy_extent *busyp = > + rb_entry(rbp, struct xfs_busy_extent, rb_node); > + xfs_agblock_t end = bno + len; > + xfs_agblock_t bend = busyp->bno + busyp->length; > + > + if (bno + len <= busyp->bno) { > + rbp = rbp->rb_left; > + continue; > + } else if (bno >= busyp->bno + busyp->length) { > + rbp = rbp->rb_right; > + continue; > + } > + > + if (busyp->bno < bno) { > + /* start overlap */ > + ASSERT(bend >= bno); ASSERT(bend > bno); > + ASSERT(bend <= end); > + len -= bno - bend; NO: len -= bend - bno; > + bno = bend; > + } else if (bend > end) { > + /* end overlap */ > + ASSERT(busyp->bno >= bno); > + ASSERT(busyp->bno < end); > + len -= bend - end; NO: len -= end - busyp->bn; > + } else { > + /* middle overlap - return larger segment */ > + ASSERT(busyp->bno >= bno); > + ASSERT(bend <= end); > + len = busyp->bno - bno; > + if (len >= end - bend) { > + /* use first segment */ > + len = len; > + } else { > + /* use last segment */ > + bno = bend; > + len = end - bend; > + } /* Use the first segment... */ len = busp->bno - bno; if (len < end - bend) { /* unless the second is larger */ bno = bend; len = end - bend; } > + } > + } > + spin_unlock(&pag->pagb_lock); > + > + *rbno = bno; > + *rlen = len; > +} > + > void > xfs_alloc_busy_clear( > struct xfs_mount *mp, . . . > Index: xfs/fs/xfs/linux-2.6/xfs_discard.c > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_discard.c 2011-01-17 22:06:13.004005040 +0100 > +++ xfs/fs/xfs/linux-2.6/xfs_discard.c 2011-01-17 22:14:09.133005668 +0100 > @@ -77,8 +77,8 @@ xfs_trim_extents( > * enough to be worth discarding. > */ > while (i) { > - xfs_agblock_t fbno; > - xfs_extlen_t flen; > + xfs_agblock_t fbno, tbno; > + xfs_extlen_t flen, tlen; Does "f" represent "found" and "t" represent "trimmed" here? (Just curious--it's fine.) > > error = xfs_alloc_get_rec(cur, &fbno, &flen, &i); > if (error) > @@ -90,7 +90,7 @@ xfs_trim_extents( > * Too small? Give up. > */ > if (flen < minlen) { > - trace_xfs_discard_toosmall(mp, agno, fbno, flen); > + trace_xfs_discard_toosmall(mp, agno, tbno, flen); "tbno" appears to be possibly used before set here. At this point don't you actually want the found block number anyway? > goto out_del_cursor; > } > . . . From aelder@sgi.com Thu Jan 27 17:19:21 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0RNJLFc047851 for ; Thu, 27 Jan 2011 17:19:21 -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 8565CAC00C; Thu, 27 Jan 2011 15:21:43 -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, 27 Jan 2011 17:21:43 -0600 Subject: Re: [PATCH 1/6] xfs: clean up the xfs_alloc_compute_aligned calling convention From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20110121092550.457037752@bombadil.infradead.org> References: <20110121092227.115815324@bombadil.infradead.org> <20110121092550.457037752@bombadil.infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Thu, 27 Jan 2011 17:21:42 -0600 Message-ID: <1296170502.7651.528.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 27 Jan 2011 23:21:43.0320 (UTC) FILETIME=[F56E7180:01CBBE78] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 2011-01-21 at 04:22 -0500, Christoph Hellwig wrote: > plain text document attachment (xfs-cleanup-xfs_alloc_compute_aligned) > Pass a xfs_alloc_arg structure to xfs_alloc_compute_aligned and derive > the alignment and minlen paramters from it. This cleans up the existing > callers, and we'll need even more information from the xfs_alloc_arg > in subsequent patches. Based on a patch from Dave Chinner. > > Signed-off-by: Christoph Hellwig Looks good. Reviewed-by: Alex Elder From aelder@sgi.com Thu Jan 27 17:19:22 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0RNJLeG047853 for ; Thu, 27 Jan 2011 17:19:22 -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 EF65BAC00D; Thu, 27 Jan 2011 15:21:46 -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, 27 Jan 2011 17:21:44 -0600 Subject: Re: [PATCH 2/6] xfs: factor agf counter updates into a helper From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20110121092550.694829728@bombadil.infradead.org> References: <20110121092227.115815324@bombadil.infradead.org> <20110121092550.694829728@bombadil.infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Thu, 27 Jan 2011 17:21:43 -0600 Message-ID: <1296170503.7651.529.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 27 Jan 2011 23:21:44.0555 (UTC) FILETIME=[F62AE3B0:01CBBE78] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 2011-01-21 at 04:22 -0500, Christoph Hellwig wrote: > Updating the AGF/trans counters is duplicated between allocating and > freeing extents. Factor the code into a common helper. > > Signed-off-by: Christoph Hellwig Two comments below. First one takes a little thought, the second is nothing. I'm OK with the change as-is. Reviewed-by: Alex Elder > Index: xfs/fs/xfs/xfs_alloc.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_alloc.c 2011-01-03 13:11:28.893004699 +0100 . . . > + > + ASSERT(args->len >= args->minlen); > + ASSERT(args->len <= args->maxlen); > + ASSERT(!args->wasfromfl || !args->isfl); > + ASSERT(args->agbno % args->alignment == 0); > + > + if (!args->wasfromfl) { > + xfs_alloc_update_counters(args->tp, args->pag, args->agbp, > + -((long)(args->len))); > + You might as well make use of the return value here. It looks like the callers of xfs_alloc_ag_vextent() are prepared to handle EFSCORRUPTED already. I realize that changes the behavior of the code and doesn't just refactor it, and I haven't really followed up exhaustively on the implications. > + /* > + * Search the busylist for these blocks and mark the > + * transaction as synchronous if blocks are found. This > + * avoids the need to block due to a synchronous log > + * force to ensure correct ordering as the synchronous > + * transaction will guarantee that for us. > + */ > + if (xfs_alloc_busy_search(args->mp, args->agno, > + args->agbno, args->len)) > + xfs_trans_set_sync(args->tp); > + } > + > + if (!args->isfl) { > + xfs_trans_mod_sb(args->tp, args->wasdel ? > + XFS_TRANS_SB_RES_FDBLOCKS : > + XFS_TRANS_SB_FDBLOCKS, > + -((long)(args->len))); How about: -(long) args->len > } > + > + XFS_STATS_INC(xs_allocx); > + XFS_STATS_ADD(xs_allocb, args->len); > return 0; . . . From david@fromorbit.com Thu Jan 27 17:31:50 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0RNVnGg049937 for ; Thu, 27 Jan 2011 17:31:50 -0600 X-ASG-Debug-ID: 1296171252-4b4c01f10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 86AF9297A93 for ; Thu, 27 Jan 2011 15:34:13 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id QeLYVxTcsKeE4u3E for ; Thu, 27 Jan 2011 15:34:13 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtAEAAOPQU15LN5mgWdsb2JhbACkfBYBARYiJLxmDYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 28 Jan 2011 10:04:11 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PibLt-0001dZ-Vy; Fri, 28 Jan 2011 10:34:10 +1100 Date: Fri, 28 Jan 2011 10:34:09 +1100 From: Dave Chinner To: Mark Lord Cc: Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount Message-ID: <20110127233409.GL21311@dastard> References: <4D40C8D1.8090202@teksavvy.com> <4D40CDCF.4010301@teksavvy.com> <20110127034314.GI21311@dastard> <4D40EC2D.5020507@teksavvy.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D40EC2D.5020507@teksavvy.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296171254 X-Barracuda-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.53631 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, Jan 26, 2011 at 10:53:17PM -0500, Mark Lord wrote: > On 11-01-26 10:43 PM, Dave Chinner wrote: > > On Wed, Jan 26, 2011 at 08:43:43PM -0500, Mark Lord wrote: > >> On 11-01-26 08:22 PM, Mark Lord wrote: > .. > >> Thinking about it some more: the first problem very much appears as if > >> it is due to a filesystem check happening on the already-mounted filesystem, > >> if that makes any kind of sense (?). > > > > Not to me. You can check this simply by looking at the output of > > top while the problem is occurring... > > Top doesn't show anything interesting, since disk I/O uses practically zero CPU. My point is that xfs_check doesn't use zero cpu or memory - it uses quite a lot of both, so if it is not present in top output while the disk is being thrashed, it ain't running... > > >> running xfs_check on the umounted drive takes about the same 30-60 seconds, > >> with the disk activity light fully "on". > > > > Well, yeah - XFS check reads all the metadata in the filesystem, so > > of course it's going to thrash your disk when it is run. The fact it > > takes the same length of time as whatever problem you are having is > > likely to be coincidental. > > I find it interesting that the mount takes zero-time, > as if it never actually reads much from the filesystem. > Something has to eventually read the metadata etc. Sure, for a clean log it has basically nothing to do - a few disk reads to read the superblock, find the head/tail of the log, and little else needs doing. Only when log recovery needs to be done does mount do any significant IO. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 27 17:37:40 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0RNbe9X050868 for ; Thu, 27 Jan 2011 17:37:40 -0600 X-ASG-Debug-ID: 1296171602-567c00c20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0344C154A682 for ; Thu, 27 Jan 2011 15:40:03 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id ORyGn3beXBIb3onE for ; Thu, 27 Jan 2011 15:40:03 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtAEAAOPQU15LN5mgWdsb2JhbACkfBYBARYiJLxmDYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 28 Jan 2011 10:10:00 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PibR3-0001eG-GX; Fri, 28 Jan 2011 10:39:29 +1100 Date: Fri, 28 Jan 2011 10:39:29 +1100 From: Dave Chinner To: Mark Lord Cc: Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount Message-ID: <20110127233929.GM21311@dastard> References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D40EB2F.2050809@teksavvy.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296171605 X-Barracuda-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.53632 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, Jan 26, 2011 at 10:49:03PM -0500, Mark Lord wrote: > On 11-01-26 10:30 PM, Dave Chinner wrote: > > [Please cc xfs@oss.sgi.com on XFS bug reports. Added.] > > > > On Wed, Jan 26, 2011 at 08:22:25PM -0500, Mark Lord wrote: > >> Alex / Christoph, > >> > >> My mythtv box here uses XFS on a 2TB drive for storing recordings and videos. > >> It is behaving rather strangely though, and has gotten worse recently. > >> Here is what I see happening: > >> > >> The drive mounts fine at boot, but the very first attempt to write a new file > >> to the filesystem suffers from a very very long pause, 30-60 seconds, during which > >> time the disk activity light is fully "on". > > > > Please post the output of xfs_info so we can see what you > > filesystem configuration is. > > /dev/sdb1 on /var/lib/mythtv type xfs > (rw,noatime,allocsize=64M,logbufs=8,largeio) > > [~] xfs_info /var/lib/mythtv > meta-data=/dev/sdb1 isize=256 agcount=7453, agsize=65536 blks > = sectsz=512 attr=2 > data = bsize=4096 blocks=488378638, imaxpct=5 > = sunit=0 swidth=0 blks > naming =version 2 bsize=4096 ascii-ci=0 > log =internal bsize=4096 blocks=32768, version=2 > = sectsz=512 sunit=0 blks, lazy-count=0 > realtime =none extsz=4096 blocks=0, rtextents=0 7453 AGs means that the first write coud cause up to ~7500 disk reads to occur as the AGF headers are read in to find where the best free space extent for allocation lies. That'll be your problem. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 27 17:39:31 2011 X-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_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 p0RNdUXL051152 for ; Thu, 27 Jan 2011 17:39:31 -0600 X-ASG-Debug-ID: 1296171713-668800ee0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 10DB0297ED5 for ; Thu, 27 Jan 2011 15:41:54 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id NqSX9fdwJ9QsnGMX for ; Thu, 27 Jan 2011 15:41:54 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtAEAAOPQU15LN5mgWdsb2JhbACkfBYBARYiJIgrtDsNhUIE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 28 Jan 2011 10:11:53 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PibTM-0001ek-6E; Fri, 28 Jan 2011 10:41:52 +1100 Date: Fri, 28 Jan 2011 10:41:52 +1100 From: Dave Chinner To: Mark Lord Cc: Stan Hoeppner , Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount Message-ID: <20110127234152.GN21311@dastard> References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D418B57.1000501@teksavvy.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296171715 X-Barracuda-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, BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.53631 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 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 Thu, Jan 27, 2011 at 10:12:23AM -0500, Mark Lord wrote: > On 11-01-27 12:30 AM, Stan Hoeppner wrote: > > Mark Lord put forth on 1/26/2011 9:49 PM: > > > >> agcount=7453 > > > > That's probably a bit high Mark, and very possibly the cause of your problems. > > :) Unless the disk array backing this filesystem has something like 400-800 > > striped disk drives. You said it's a single 2TB drive right? > > > > The default agcount for a single drive filesystem is 4 allocation groups. For > > mdraid (of any number of disks/configuration) it's 16 allocation groups. > > > > Why/how did you end up with 7452 allocation groups? That can definitely cause > > some performance issues due to massively excessive head seeking, and possibly > > all manner of weirdness. > > This is great info, exactly the kind of feedback I was hoping for! > > The filesystem is about a year old now, and I probably used agsize=nnnnn > when creating it or something. > > So if this resulted in what you consider to be many MANY too MANY ags, > then I can imagine the first new file write wanting to go out and read > in all of the ag data to determine the "best fit" or something. > Which might explain some of the delay. > > Once I get the new 2TB drive, I'll re-run mkfs.xfs and then copy everything > over onto a fresh xfs filesystem. > > Can you recommend a good set of mkfs.xfs parameters to suit the characteristics > of this system? http://xfs.org/index.php/XFS_FAQ#Q:_I_want_to_tune_my_XFS_filesystems_for_.3Csomething.3E And perhaps you want to consider the allocsize mount option, though that shouldn't be necessary for 2.6.38+... Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Thu Jan 27 17:50:55 2011 X-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 p0RNot6K053197 for ; Thu, 27 Jan 2011 17:50:55 -0600 X-ASG-Debug-ID: 1296172398-68be004a0000-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 526F7126ABE2 for ; Thu, 27 Jan 2011 15:53: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 yHBBrIV2GHzWEm9X for ; Thu, 27 Jan 2011 15:53:18 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 558986C0C3; Thu, 27 Jan 2011 17:53:18 -0600 (CST) Message-ID: <4D42056E.2050505@hardwarefreak.com> Date: Thu, 27 Jan 2011 17:53: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: david@lang.hm CC: Linux Kernel , xfs@oss.sgi.com, Christoph Hellwig , Justin Piszcz , Alex Elder , Mark Lord X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@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: 1296172399 X-Barracuda-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.53632 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 david@lang.hm put forth on 1/27/2011 2:11 PM: > how do I understand how to setup things on multi-disk systems? the documentation > I've found online is not that helpful, and in some ways contradictory. Visit http://xfs.org There you will find: Users guide: http://xfs.org/docs/xfsdocs-xml-dev/XFS_User_Guide//tmp/en-US/html/index.html File system structure: http://xfs.org/docs/xfsdocs-xml-dev/XFS_Filesystem_Structure//tmp/en-US/html/index.html Training labs: http://xfs.org/docs/xfsdocs-xml-dev/XFS_Labs/tmp/en-US/html/index.html > If there really are good rules for how to do this, it would be very helpful if > you could just give mkfs.xfs the information about your system (this partition > is on a 16 drive raid6 array) and have it do the right thing. If your disk array is built upon Linux mdraid, recent versions of mkfs.xfs will read the parameters and automatically make the filesystem accordingly, properly. mxfs.fxs will not do this for PCIe/x hardware RAID arrays or external FC/iSCSI based SAN arrays as there is no standard place to acquire the RAID configuration information for such systems. For these you will need to configure mkfs.xfs manually. At minimum you will want to specify stripe width (sw) which needs to match the hardware stripe width. For RAID0 sw=[#of_disks]. For RAID 10, sw=[#disks/2]. For RAID5 sw=[#disks-1]. For RAID6 sw=[#disks-2]. You'll want at minimum agcount=16 for striped hardware arrays. Depending on the number and spindle speed of the disks, the total size of the array, the characteristics of the RAID controller (big or small cache), you may want to increase agcount. Experimentation may be required to find the optimum parameters for a given hardware RAID array. Typically all other parameters may be left at defaults. Picking the perfect mkfs.xfs parameters for a hardware RAID array can be somewhat of a black art, mainly because no two vendor arrays act or perform identically. Systems of a caliber requiring XFS should be thoroughly tested before going into production. Testing _with your workload_ of multiple parameters should be performed to identify those yielding best performance. -- Stan From david@fromorbit.com Thu Jan 27 18:15:15 2011 X-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 p0S0FFux057298 for ; Thu, 27 Jan 2011 18:15:15 -0600 X-ASG-Debug-ID: 1296173858-638402340000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6574A29586B for ; Thu, 27 Jan 2011 16:17:39 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 5gAIwIKAIHFRlHwb for ; Thu, 27 Jan 2011 16:17:39 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtAEAI6ZQU15LN5mgWdsb2JhbACkfBYBARYiJLxXDYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 28 Jan 2011 10:47:37 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pic1v-0001iW-SM; Fri, 28 Jan 2011 11:17:35 +1100 Date: Fri, 28 Jan 2011 11:17:35 +1100 From: Dave Chinner To: Mark Lord Cc: Stan Hoeppner , Justin Piszcz , Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount Message-ID: <20110128001735.GO21311@dastard> References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D41EA04.7010506@teksavvy.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D41EA04.7010506@teksavvy.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296173860 X-Barracuda-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.53633 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, Jan 27, 2011 at 04:56:20PM -0500, Mark Lord wrote: > On 11-01-27 02:40 PM, Stan Hoeppner wrote: > .. > > You need to use the mkfs.xfs defaults for any single drive filesystem, and trust > > the allocator to do the right thing. > > But it did not do the right thing when I used the defaults. > Big files ended up with tons of (exactly) 64MB extents, ISTR. Because your AG size is 64MB. An extent can't be larger than an AG. Hence you are fragmenting your large files unnecessarily, as extents can be up to 8GB in size on a 4k block size filesystem. > With the increased number of ags, I saw much less fragmentation, > and the drive was still very light on I/O despite multiple simultaneous > recordings, commflaggers, and playback at once. The allocsize mount option is the prefered method of keeping fragemntation down for dvr style workloads. > > Trust the defaults. > > I imagine the defaults are designed to handle a typical Linux install, > with 100,000 to 1,000,000 files varying from a few bytes to a few megabytes. Why would we optimise a filesystem designed for use on high end storage and large amounts of IO concurrency for what a typical Linux desktop needs? For such storage (i.e. single spindle) mkfs optimises the layout for minimal seeks and relatively low amounts of concurrency. This gives _adequate_ performance on desktop machines without compromising scalbility on high end storage. In my experience with XFS, most people who tweak mkfs parameters end up with some kind of problem they can't explain and don't know how to solve. And they are typically problems that would not have occurred had they simply used the defaults in the first place. What you've done is a perfect example of this. Yes, I know we are taking the fun out of tweaking knobs so you can say it's 1% faster than the default, but that's our job: to determine the right default settings so the filesystem works as well as possible out of the box with no tweaking for most workloads on a wide range of storage.... > That's not what this filesystem will have. It will have only a few thousand > (max) inodes at any given time, but each file will be HUGE. Which is exactly the use case XFS was designed for, and.... > XFS is fantastic at adapting to the workload, but I'd like to try and have > it tuned more closely for the known workload this system is throwing at it. .... as such the mkfs defaults are already tuned as well as they can be for such usage. > I'm now trying again, but with 8 ags instead of 8000+. Why 8 AGs and not the default? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 27 18:40:15 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0S0eEW3061479 for ; Thu, 27 Jan 2011 18:40:15 -0600 X-ASG-Debug-ID: 1296175357-5d8e03530000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2F2B2126A922 for ; Thu, 27 Jan 2011 16:42:38 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 9XNOaX3fAwJj2zIg for ; Thu, 27 Jan 2011 16:42:38 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtAEABOdQU15LN5mgWdsb2JhbACkfBYBARYiJLxJDYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 28 Jan 2011 11:12:37 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PicQ8-0001lb-9C; Fri, 28 Jan 2011 11:42:36 +1100 Date: Fri, 28 Jan 2011 11:42:36 +1100 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/8] xfs: candidate 2.6.38-rc fixes V3 Subject: Re: [PATCH 0/8] xfs: candidate 2.6.38-rc fixes V3 Message-ID: <20110128004236.GP21311@dastard> References: <1296100401-17135-1-git-send-email-david@fromorbit.com> <1296142265.1973.67.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1296142265.1973.67.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296175359 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1530 1.0000 -1.0844 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.08 X-Barracuda-Spam-Status: No, SCORE=-1.08 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.53636 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, Jan 27, 2011 at 09:31:05AM -0600, Alex Elder wrote: > On Thu, 2011-01-27 at 14:53 +1100, Dave Chinner wrote: > > Fixed the various issues found during review and added all the > > reviewed-by tags to the fully reviewed commits. > > I'll be testing with this today. Barring any unforseen > problems I'm just waiting for a pull request from you > (or the go-ahead to just use the patches as posted). Ok, still need a review on patch 2/8 (efi item leak) before I'll send a pull request... Cheers, Dave. -- Dave Chinner david@fromorbit.com From kernel@teksavvy.com Thu Jan 27 18:57:31 2011 X-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 p0S0vVux064348 for ; Thu, 27 Jan 2011 18:57:31 -0600 X-ASG-Debug-ID: 1296176394-20c3017c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ironport2-out.pppoe.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8613F1DC4277 for ; Thu, 27 Jan 2011 16:59:54 -0800 (PST) Received: from ironport2-out.pppoe.ca (ironport2-out.teksavvy.com [206.248.154.181]) by cuda.sgi.com with ESMTP id MfDWfUDdiND28cfi for ; Thu, 27 Jan 2011 16:59:54 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApIBAGajQU1Ld/sX/2dsb2JhbAAMhAiqB6M1kF6BI4M4dASFFw X-IronPort-AV: E=Sophos;i="4.60,388,1291611600"; d="scan'208";a="89492284" Received: from rtr.ca (HELO [10.0.0.6]) ([75.119.251.23]) by ironport2-out.pppoe.ca with ESMTP/TLS/DHE-RSA-CAMELLIA256-SHA; 27 Jan 2011 19:59:54 -0500 Message-ID: <4D421507.1030006@teksavvy.com> Date: Thu, 27 Jan 2011 19:59:51 -0500 From: Mark Lord User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Dave Chinner CC: Stan Hoeppner , Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <20110127234152.GN21311@dastard> In-Reply-To: <20110127234152.GN21311@dastard> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ironport2-out.teksavvy.com[206.248.154.181] X-Barracuda-Start-Time: 1296176395 X-Barracuda-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.53637 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 11-01-27 06:41 PM, Dave Chinner wrote: > On Thu, Jan 27, 2011 at 10:12:23AM -0500, Mark Lord wrote: .. >> Can you recommend a good set of mkfs.xfs parameters to suit the characteristics >> of this system? > > http://xfs.org/index.php/XFS_FAQ#Q:_I_want_to_tune_my_XFS_filesystems_for_.3Csomething.3E That entry says little beyond "blindly trust the defaults". But thanks anyway (really). > And perhaps you want to consider the allocsize mount option, though > that shouldn't be necessary for 2.6.38+... That's a good tip, thanks. >From my earlier posting: > /dev/sdb1 on /var/lib/mythtv type xfs > (rw,noatime,allocsize=64M,logbufs=8,largeio) Maybe that allocsize value could be increased though. Perhaps something on the order of 256MB might do it. Thanks again! From kernel@teksavvy.com Thu Jan 27 19:20:27 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0S1KQCS068136 for ; Thu, 27 Jan 2011 19:20:27 -0600 X-ASG-Debug-ID: 1296177769-240d00dd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ironport2-out.pppoe.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 70FF889D437 for ; Thu, 27 Jan 2011 17:22:50 -0800 (PST) Received: from ironport2-out.pppoe.ca (ironport2-out.teksavvy.com [206.248.154.183]) by cuda.sgi.com with ESMTP id KBB9HGqFdt7SaBWy for ; Thu, 27 Jan 2011 17:22:50 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApIBAEapQU1Ld/sX/2dsb2JhbAAMhAjNLZBdgSODOHQEhRc X-IronPort-AV: E=Sophos;i="4.60,388,1291611600"; d="scan'208";a="89494157" Received: from rtr.ca (HELO [10.0.0.6]) ([75.119.251.23]) by ironport2-out.pppoe.ca with ESMTP/TLS/DHE-RSA-CAMELLIA256-SHA; 27 Jan 2011 20:22:49 -0500 Message-ID: <4D421A68.9000607@teksavvy.com> Date: Thu, 27 Jan 2011 20:22:48 -0500 From: Mark Lord User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Dave Chinner CC: Stan Hoeppner , Justin Piszcz , Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D41EA04.7010506@teksavvy.com> <20110128001735.GO21311@dastard> In-Reply-To: <20110128001735.GO21311@dastard> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ironport2-out.teksavvy.com[206.248.154.183] X-Barracuda-Start-Time: 1296177771 X-Barracuda-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.53638 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 11-01-27 07:17 PM, Dave Chinner wrote: > > In my experience with XFS, most people who tweak mkfs parameters end > up with some kind of problem they can't explain and don't know how > to solve. And they are typically problems that would not have > occurred had they simply used the defaults in the first place. What > you've done is a perfect example of this. Maybe. But what I read from the paragraph above, is that the documentation could perhaps explain things better, and then people other than the coders might understand how best to tweak it. > Why 8 AGs and not the default? How AGs are used is not really explained anywhere I've looked, so I am guessing at what they do and how the system might respond to different values there (that documentation thing again). Lacking documentation, my earlier experiences suggest that more AGs gives me less fragmentation when multiple simultaneous recording streams are active. I got higher fragmentation with the defaults than with the tweaked value. Now, that might be due to differences in kernel versions too, as things in XFS are continuously getting even better (thanks!), and the original "defaults" assessment was with the kernel-of-the-day back in early 2010 (2.6.34?), and now the system is using 2.6.37. But I just don't know. My working theory, likely entirely wrong, is that if I have N streams active, odds are that each of those streams might get assigned to different AGs, given sufficient AGs >= N. Since the box often has 3-7 recording streams active, I'm trying it out with 8 AGs now. Cheers From kernel@teksavvy.com Thu Jan 27 19:34:03 2011 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.1 required=5.0 tests=BAYES_00,HEADER_ESQ 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 p0S1Y3Ix070510 for ; Thu, 27 Jan 2011 19:34:03 -0600 X-ASG-Debug-ID: 1296178587-2338024f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ironport2-out.pppoe.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 53542297CB6 for ; Thu, 27 Jan 2011 17:36:27 -0800 (PST) Received: from ironport2-out.pppoe.ca (ironport2-out.teksavvy.com [206.248.154.183]) by cuda.sgi.com with ESMTP id 4sjProDprcrHE9V7 for ; Thu, 27 Jan 2011 17:36:27 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApIBAMesQU1Ld/sX/2dsb2JhbAAMhAjNIJBcgSODOHQEhRc X-IronPort-AV: E=Sophos;i="4.60,388,1291611600"; d="scan'208";a="89495020" Received: from rtr.ca (HELO [10.0.0.6]) ([75.119.251.23]) by ironport2-out.pppoe.ca with ESMTP/TLS/DHE-RSA-CAMELLIA256-SHA; 27 Jan 2011 20:36:26 -0500 Message-ID: <4D421D9A.50007@teksavvy.com> Date: Thu, 27 Jan 2011 20:36:26 -0500 From: Mark Lord User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Dave Chinner CC: Stan Hoeppner , Justin Piszcz , Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D41EA04.7010506@teksavvy.com> <20110128001735.GO21311@dastard> <4D421A68.9000607@teksavvy.com> In-Reply-To: <4D421A68.9000607@teksavvy.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ironport2-out.teksavvy.com[206.248.154.183] X-Barracuda-Start-Time: 1296178588 X-Barracuda-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.53639 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 11-01-27 08:22 PM, Mark Lord wrote: > On 11-01-27 07:17 PM, Dave Chinner wrote: >> >> In my experience with XFS, most people who tweak mkfs parameters end >> up with some kind of problem they can't explain and don't know how >> to solve. And they are typically problems that would not have >> occurred had they simply used the defaults in the first place. What >> you've done is a perfect example of this. > > Maybe. But what I read from the paragraph above, > is that the documentation could perhaps explain things better, > and then people other than the coders might understand how > best to tweak it. By the way, the documentation is excellent, for a developer who wants to work on the codebase. It describes the data structures and layouts etc.. better than perhaps any other Linux filesystem. But it doesn't seem to describe the algorithms, such as how it decides where to store a recording stream. I'm not complaining, far from it. XFS is simply wonderful, and my DVR literally couldn't work without it. But I am as technical as you are, and I like to experiment and understand the technology I use. That's partly why we both work on the Linux kernel. Cheers From david@fromorbit.com Thu Jan 27 19:56:30 2011 X-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 p0S1uU9J074439 for ; Thu, 27 Jan 2011 19:56:30 -0600 X-ASG-Debug-ID: 1296179932-20c702510000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4714B1A460E6 for ; Thu, 27 Jan 2011 17:58:52 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id GTTARBmGGWLiMgAP for ; Thu, 27 Jan 2011 17:58:52 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtAEACuyQU15LN5mgWdsb2JhbACkexYBARYiJLwuDYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 28 Jan 2011 12:28:37 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pidbf-0001s1-Ug; Fri, 28 Jan 2011 12:58:35 +1100 Date: Fri, 28 Jan 2011 12:58:35 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/6] xfs: do not immediately reuse busy extent ranges Subject: Re: [PATCH 3/6] xfs: do not immediately reuse busy extent ranges Message-ID: <20110128015835.GQ21311@dastard> References: <20110121092227.115815324@bombadil.infradead.org> <20110121092550.933551564@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110121092550.933551564@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296179934 X-Barracuda-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.53641 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, Jan 21, 2011 at 04:22:30AM -0500, Christoph Hellwig wrote: > Every time we reallocate a busy extent, we cause a synchronous log force > to occur to ensure the freeing transaction is on disk before we continue > and use the newly allocated extent. This is extremely sub-optimal as we > have to mark every transaction with blocks that get reused as synchronous. > > Instead of searching the busy extent list after deciding on the extent to > allocate, check each candidate extent during the allocation decisions as > to whether they are in the busy list. If they are in the busy list, we > trim the busy range out of the extent we have found and determine if that > trimmed range is still OK for allocation. In many cases, this check can > be incorporated into the allocation extent alignment code which already > does trimming of the found extent before determining if it is a valid > candidate for allocation. > > [hch: merged two earlier patches from Dave and fixed various bugs] > > Signed-off-by: Dave Chinner > Signed-off-by: Christoph Hellwig .... > ASSERT(args->agbno % args->alignment == 0); > > if (!args->wasfromfl) { > - xfs_alloc_update_counters(args->tp, args->pag, args->agbp, > - -((long)(args->len))); > + error = xfs_alloc_update_counters(args->tp, args->pag, > + args->agbp, > + -((long)(args->len))); > > - /* > - * Search the busylist for these blocks and mark the > - * transaction as synchronous if blocks are found. This > - * avoids the need to block due to a synchronous log > - * force to ensure correct ordering as the synchronous > - * transaction will guarantee that for us. > - */ > - if (xfs_alloc_busy_search(args->mp, args->agno, > - args->agbno, args->len)) > - xfs_trans_set_sync(args->tp); > + ASSERT(!xfs_alloc_busy_search(args->mp, args->agno, > + args->agbno, args->len)); > } > > if (!args->isfl) { > @@ -559,7 +554,7 @@ xfs_alloc_ag_vextent( > > XFS_STATS_INC(xs_allocx); > XFS_STATS_ADD(xs_allocb, args->len); > - return 0; > + return error; > } These error handling changes could go in the previous patch. > @@ -2612,7 +2688,7 @@ restart: > * will require a synchronous transaction, but it can still be > * used to distinguish between a partial or exact match. > */ > -int > +STATIC int > xfs_alloc_busy_search( > struct xfs_mount *mp, > xfs_agnumber_t agno, > @@ -2654,6 +2730,71 @@ xfs_alloc_busy_search( > return match; > } > > +/* > + * For a given extent [fbno, flen], search the busy extent list > + * to find a subset of the extent that is not busy. > + */ How does this function return an indication that the extent selected is entirrely unsuitable? e.g. the extent lies wholly within the busy range and gets trimmed to zero length? perhaps it woul dbe good to return an error in this case? > +void > +xfs_alloc_busy_search_trim( > + struct xfs_mount *mp, > + struct xfs_perag *pag, > + xfs_agblock_t fbno, > + xfs_extlen_t flen, > + xfs_agblock_t *rbno, > + xfs_extlen_t *rlen) > +{ > + struct rb_node *rbp; > + xfs_agblock_t bno = fbno; > + xfs_extlen_t len = flen; > + > + spin_lock(&pag->pagb_lock); > + rbp = pag->pagb_tree.rb_node; > + while (rbp) { > + struct xfs_busy_extent *busyp = > + rb_entry(rbp, struct xfs_busy_extent, rb_node); > + xfs_agblock_t end = bno + len; > + xfs_agblock_t bend = busyp->bno + busyp->length; > + > + if (bno + len <= busyp->bno) { > + rbp = rbp->rb_left; > + continue; > + } else if (bno >= busyp->bno + busyp->length) { > + rbp = rbp->rb_right; > + continue; > + } if (end <= bbno) left; else if (bno > bend) right; /* overlap */ > + > + if (busyp->bno < bno) { > + /* start overlap */ > + ASSERT(bend >= bno); > + ASSERT(bend <= end); > + len -= bno - bend; > + bno = bend; if (bbno < bno) { bbno bend +-----------------+ Case 1: +---------+ bno end No unbusy region in extent, return failure Case 2: +------------------------+ bno end Needs to be trimmed to: +-------+ bno end bno = bend; len = end - bno; > + } else if (bend > end) { > + /* end overlap */ > + ASSERT(busyp->bno >= bno); > + ASSERT(busyp->bno < end); > + len -= bend - end; } else if (bend > end) { bno must be <= bbno in this case, so: bbno bend +-----------------+ Case 3: bno == bbno: +-------------+ bno end No unbusy region in extent, return failure. Case 4: +------------------+ bno end Needs to be trimmed to: +-------+ bno end end = bbno; len = end - bno; > + } else { > + /* middle overlap - return larger segment */ > + ASSERT(busyp->bno >= bno); > + ASSERT(bend <= end); > + len = busyp->bno - bno; > + if (len >= end - bend) { > + /* use first segment */ > + len = len; > + } else { > + /* use last segment */ > + bno = bend; > + len = end - bend; > + } (bno <= bbno && bend <= end) in this case, so: bbno bend +-----------------+ Case 5: Exact match: (bno == bbno && bend == end) +-----------------+ bno end No unbusy region in extent, return failure. Case 6: (bno == bbno && bend < end) +-------------------------+ bno end Needs to be trimmed to: +-------+ bno end Same as Case 2. - case 2 can be extend to bbno <= bno. Case 7: (bno < bbno && bend == end) +-------------------------+ bno end Needs to be trimmed to: +-------+ bno end Same as case 4. - Case 4 can be extented to bend >= end Case 8: (bno < bbno && bend < end) +---------------------------------+ bno end can be trimmed to: +-------+ OR +-------+ bno end bno end - Should always want to choose the lower bno extent: - next allocation in file will use "end" as the target for first block - if busy segment has cleared, will get contiguous allocation - if busy segment has not cleared, get allocation at bend, which is forwards allocation. - if we choose segment at bend, and this remains the best extent for the next allocation (e.g. NEAR_BNO allocation) we'll next allocate at bno, which will give us backwards allocation. - always chose the option that produces forwards allocation patterns so that sequential reads and writes only ever seek in one direction. - we already know that backwards allocation direction (due to NEAR_BNO second algorithm) causes significant fragmentation of directories and degradataion of directory performance, so I think we should avoid introducing a new allocation algorithm that can lead to backwards allocation around frequently reused extents. - only choose right hand edge if the remainin unused extent length is much larger than the current allocation request. - otherwise return failure if we can't use lower bno due to minlen restrictions so a new extent is chosen by the higher level algorithm. So, it looks to me like the "overlap found" algorithm shoul dbe something like: if (bbno <= bno) { if (end <= bend) { /* case 1, 3, 5 */ return failure; } /* case 2, 6 */ bno = bend; len = end - bno; } else if (bend >= end) { ASSERT(bbno > bno); /* case 4, 7 */ end = bbno; len = end - bno; } else { ASSERT(bbno > bno); ASSERT(bend < end); /* case 8 */ if (bbno - bno >= args->minlen) { /* left candidate OK */ left = 1; } if (end - bend >= args->maxlen * 4) { /* right candidate OK */ right = 1; } if (left && right) { /* take right if left is not a * maximal allocation */ if (bbno - bno < args->maxlen) left = 0; } if (left) { end = bbno; len = end - bno; } else if (right) { bno = bend; len = end - bno; } else { return failure; } } > @@ -109,19 +109,16 @@ xfs_trim_extents( > * 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; > - } > + xfs_alloc_busy_search_trim(mp, pag, fbno, flen, &tbno, &tlen); > > - trace_xfs_discard_extent(mp, agno, fbno, flen); > + trace_xfs_discard_extent(mp, agno, tbno, tlen); > error = -blkdev_issue_discard(bdev, > - XFS_AGB_TO_DADDR(mp, agno, fbno), > - XFS_FSB_TO_BB(mp, flen), > + XFS_AGB_TO_DADDR(mp, agno, tbno), > + XFS_FSB_TO_BB(mp, tlen), > GFP_NOFS, 0); > if (error) > goto out_del_cursor; > - *blocks_trimmed += flen; > + *blocks_trimmed += tlen; Hmmm - that means if we get a case 8 overlap, we'll only trim one side of the extent. That's probably not a big deal. However, perhaps this should check the size of the trimmed extent before issuing the discard against it in case we've reduced it to something smaller thanthe minimum requested trim size.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From jef.fox@kinetx.com Thu Jan 27 20:03:10 2011 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 p0S239g0075603 for ; Thu, 27 Jan 2011 20:03:10 -0600 X-ASG-Debug-ID: 1296180333-1f49034f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail1.ad.kinetx.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6C662297489 for ; Thu, 27 Jan 2011 18:05:34 -0800 (PST) Received: from mail1.ad.kinetx.com (mail1.ad.kinetx.com [74.202.133.147]) by cuda.sgi.com with ESMTP id 2bsCLg4n3MsphmEL for ; Thu, 27 Jan 2011 18:05:34 -0800 (PST) X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----_=_NextPart_001_01CBBE8F.D89A50EA" X-ASG-Orig-Subj: XFS Preallocation Subject: XFS Preallocation Date: Thu, 27 Jan 2011 19:05:33 -0700 Message-ID: <155CAEA5D902E7429569DD197567724A01534D42@mail1.ad.kinetx.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: XFS Preallocation Thread-Index: Acu+j9h4MT8bBaoITbmmG6aQZJGIGg== From: "Jef Fox" To: X-Barracuda-Connect: mail1.ad.kinetx.com[74.202.133.147] X-Barracuda-Start-Time: 1296180334 X-Barracuda-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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.53641 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 This is a multi-part message in MIME format. ------_=_NextPart_001_01CBBE8F.D89A50EA Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: quoted-printable We are having some problems with preallocation of large files. We have found that we can preallocate about 500 1GB files on a volume using the resvsp and truncate commands, but the extents are still showing up as preallocated. Is this a problem? The OS appears to think the files are allocated and correctly sized.=20 =20 For reference, we are trying to create files for an external piece of equipment to write to a SSD with. The SSD would then be mounted in RHEL and the data pulled off in the 1G chunks. Because of the nature of the data, we need to constantly erase and recreate the files and preallocation seems to be the fastest option. We don't really care if the data gets 0'ed out. Is there another method - allocsp takes too long for this application? Or, does it matter if XFS thinks the extents are preallocated but unwritten if no other files are written to the disk? =20 Thanks Jef =20 =20 ------_=_NextPart_001_01CBBE8F.D89A50EA Content-Type: text/html; charset="US-ASCII" Content-Transfer-Encoding: quoted-printable

We are = having some problems with preallocation of large files.  We have = found that we can preallocate about 500 1GB files on a volume using the = resvsp and truncate commands, but the extents are still showing up as = preallocated.  Is this a problem?  The OS appears to think the = files are allocated and correctly sized.

 

For = reference, we are trying to create files for an external piece of = equipment to write to a SSD with.  The SSD would then be mounted in = RHEL and the data pulled off in the 1G chunks.  Because of the = nature of the data, we need to constantly erase and recreate the files = and preallocation seems to be the fastest option.  We don’t = really care if the data gets 0’ed out.  Is there another = method – allocsp takes too long for this application?  Or, = does it matter if XFS thinks the extents are preallocated but unwritten = if no other files are written to the disk?

 

Thanks

Jef

 

 

------_=_NextPart_001_01CBBE8F.D89A50EA-- From david@lang.hm Thu Jan 27 20:08:08 2011 X-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 p0S2883r076429 for ; Thu, 27 Jan 2011 20:08:08 -0600 X-ASG-Debug-ID: 1296180631-265302a10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bifrost.lang.hm (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 75BB0274A07; Thu, 27 Jan 2011 18:10:31 -0800 (PST) Received: from bifrost.lang.hm (mail.lang.hm [64.81.33.126]) by cuda.sgi.com with ESMTP id djeCTSjXktVcEmOc; Thu, 27 Jan 2011 18:10:31 -0800 (PST) Received: from asgard.lang.hm (asgard.lang.hm [10.0.0.100]) by bifrost.lang.hm (8.13.4/8.13.4/Debian-3) with ESMTP id p0S29wta032752; Thu, 27 Jan 2011 18:09:58 -0800 Date: Thu, 27 Jan 2011 18:09:58 -0800 (PST) From: david@lang.hm X-X-Sender: dlang@asgard.lang.hm To: Stan Hoeppner cc: Linux Kernel , xfs@oss.sgi.com, Christoph Hellwig , Justin Piszcz , Alex Elder , Mark Lord X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount In-Reply-To: <4D42056E.2050505@hardwarefreak.com> Message-ID: References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D42056E.2050505@hardwarefreak.com> 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: mail.lang.hm[64.81.33.126] X-Barracuda-Start-Time: 1296180632 X-Barracuda-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.53641 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 On Thu, 27 Jan 2011, Stan Hoeppner wrote: > david@lang.hm put forth on 1/27/2011 2:11 PM: > >> how do I understand how to setup things on multi-disk systems? the documentation >> I've found online is not that helpful, and in some ways contradictory. > > Visit http://xfs.org There you will find: > > Users guide: > http://xfs.org/docs/xfsdocs-xml-dev/XFS_User_Guide//tmp/en-US/html/index.html > > File system structure: > http://xfs.org/docs/xfsdocs-xml-dev/XFS_Filesystem_Structure//tmp/en-US/html/index.html > > Training labs: > http://xfs.org/docs/xfsdocs-xml-dev/XFS_Labs/tmp/en-US/html/index.html thanks for the pointers. >> If there really are good rules for how to do this, it would be very helpful if >> you could just give mkfs.xfs the information about your system (this partition >> is on a 16 drive raid6 array) and have it do the right thing. > > If your disk array is built upon Linux mdraid, recent versions of mkfs.xfs will > read the parameters and automatically make the filesystem accordingly, properly. > > mxfs.fxs will not do this for PCIe/x hardware RAID arrays or external FC/iSCSI > based SAN arrays as there is no standard place to acquire the RAID configuration > information for such systems. For these you will need to configure mkfs.xfs > manually. > > At minimum you will want to specify stripe width (sw) which needs to match the > hardware stripe width. For RAID0 sw=[#of_disks]. For RAID 10, sw=[#disks/2]. > For RAID5 sw=[#disks-1]. For RAID6 sw=[#disks-2]. > > You'll want at minimum agcount=16 for striped hardware arrays. Depending on the > number and spindle speed of the disks, the total size of the array, the > characteristics of the RAID controller (big or small cache), you may want to > increase agcount. Experimentation may be required to find the optimum > parameters for a given hardware RAID array. Typically all other parameters may > be left at defaults. does this value change depending on the number of disks in the array? > Picking the perfect mkfs.xfs parameters for a hardware RAID array can be > somewhat of a black art, mainly because no two vendor arrays act or perform > identically. if mkfs.xfs can figure out how to do the 'right thing' for md raid arrays, can there be a mode where it asks the users for the same information that it gets from the kernel? > Systems of a caliber requiring XFS should be thoroughly tested before going into > production. Testing _with your workload_ of multiple parameters should be > performed to identify those yielding best performance. the problem with this is that for large arrays, formatting the array and loading it with data can take a day or more, even before you start running the test. This is made even worse if you are scaling up an existing system a couple orders of magnatude, because you may not have the full workload available to you. Saying that you should test out every option before going into production is a cop-out. The better you can test it, the better off you are, but without knowing what the knobs do, just doing a test and twiddling the knobs to do another test isn't very useful. If there is a way to set the knobs in the general ballpark, then you can test and see if the performance seems adaquate, if not you can try teaking one of the knobs a little bit and see if it helps or hurts. but if the knobs aren't even in the ballpark when you start, this doesn't help much. David Lang From drees76@gmail.com Thu Jan 27 22:12:46 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-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 (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p0S4Ck6b096828 for ; Thu, 27 Jan 2011 22:12:46 -0600 X-ASG-Debug-ID: 1296188110-04e902c10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-vx0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 64901298238 for ; Thu, 27 Jan 2011 20:15:10 -0800 (PST) Received: from mail-vx0-f181.google.com (mail-vx0-f181.google.com [209.85.220.181]) by cuda.sgi.com with ESMTP id oV3QJTNZaetx3xdf for ; Thu, 27 Jan 2011 20:15:10 -0800 (PST) Received: by vxc38 with SMTP id 38so163439vxc.26 for ; Thu, 27 Jan 2011 20:15:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type:content-transfer-encoding; bh=wta27aUpl7oCsQAnUEKYO9oB2XeGsLjqMVCz7WNLflo=; b=tWck0BcGfhkWjzHhDmtGwr4qQqPxXptSHgnAfipaztHlSoHhZaEnkcCitH6fHd30oa Ov4OwO8y+COwH0KBO66iSyZDslmhyGJYcMFLLCrTRXDY4UaRD+3y8mNjo4BCWDdpabn3 FFJhUdPGF/z53v6B/E6U89E//76G9p3Lf4ZL8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type:content-transfer-encoding; b=g7lwR7UJeRSj2LiLDJK30UZY4nG4GVSAB14d2EOrfUxkCEypv7x9MLlIhOqA+IqQUP +qIG8juurdAaH0t6SuZRGw9wypKTD8H/8s8+k00v7w25q30PWsdbSYuBmW8yWnj8QiU7 Yc5OY2sl2SGHIk6IloMM1UgNq52YMn6XIINcs= Received: by 10.220.201.131 with SMTP id fa3mr504581vcb.83.1296188110341; Thu, 27 Jan 2011 20:15:10 -0800 (PST) MIME-Version: 1.0 Received: by 10.220.117.77 with HTTP; Thu, 27 Jan 2011 20:14:50 -0800 (PST) In-Reply-To: <4D421A68.9000607@teksavvy.com> References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D41EA04.7010506@teksavvy.com> <20110128001735.GO21311@dastard> <4D421A68.9000607@teksavvy.com> From: David Rees Date: Thu, 27 Jan 2011 20:14:50 -0800 Message-ID: X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount To: Mark Lord Cc: Dave Chinner , Stan Hoeppner , Justin Piszcz , Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-vx0-f181.google.com[209.85.220.181] X-Barracuda-Start-Time: 1296188111 X-Barracuda-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.53649 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 Thu, Jan 27, 2011 at 5:22 PM, Mark Lord wrote: > But I just don't know. =A0My working theory, likely entirely wrong, > is that if I have N streams active, odds are that each of those > streams might get assigned to different AGs, given sufficient AGs >=3D N. > > Since the box often has 3-7 recording streams active, > I'm trying it out with 8 AGs now. As suggested before - why are you messing with AGs instead of allocsize? I suspect that with the default configuration, XFS was trying to maximize throughput by reducing seeks with multiple processes writing streams. But now, you're telling XFS that it's OK to write in up to 8 different locations on the disk without worrying about seek performance. I think this is likely to result in overall worse performance at the worst time - under write load. If you are trying to optimize single thread read performance by minimizing file fragments, why don't you simply figure out at what point increasing allocsize stops increasing read performance? I suspect that the the defaults do good job because even if your file are fragmented in 64MB chunks because you have multiple streams writing, those chunks are very likely to be very close together so there isn't much of a seek penalty. -Dave From david@fromorbit.com Thu Jan 27 22:49:46 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0S4nikx103884 for ; Thu, 27 Jan 2011 22:49:45 -0600 X-ASG-Debug-ID: 1296190327-312a019c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4FE698D8096 for ; Thu, 27 Jan 2011 20:52:08 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 6lHfw5tgpDqNAFbP for ; Thu, 27 Jan 2011 20:52:08 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AggEANbYQU15LN5mgWdsb2JhbACkfhYBARYiJLwXDYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 28 Jan 2011 15:22:07 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PigJZ-00027u-J5; Fri, 28 Jan 2011 15:52:05 +1100 Date: Fri, 28 Jan 2011 15:52:05 +1100 From: Dave Chinner To: Jef Fox Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS Preallocation Subject: Re: XFS Preallocation Message-ID: <20110128045205.GR21311@dastard> References: <155CAEA5D902E7429569DD197567724A01534D42@mail1.ad.kinetx.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <155CAEA5D902E7429569DD197567724A01534D42@mail1.ad.kinetx.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296190329 X-Barracuda-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.53652 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, Jan 27, 2011 at 07:05:33PM -0700, Jef Fox wrote: > We are having some problems with preallocation of large files. We have > found that we can preallocate about 500 1GB files on a volume using the > resvsp and truncate commands, but the extents are still showing up as > preallocated. Is this a problem? The OS appears to think the files are > allocated and correctly sized. That's the way it's supposed to work. Preallocated space stays preallocated (i.e reads as zeros) until it is written to, regardless of whether you change the file size via truncate commands. > For reference, we are trying to create files for an external piece of > equipment to write to a SSD with. The SSD would then be mounted in RHEL > and the data pulled off in the 1G chunks. Because of the nature of the > data, we need to constantly erase and recreate the files and > preallocation seems to be the fastest option. What do you mean by "erase and recreate"? Do you mean you rm the files, then preallocate them again? If you were running 2.6.37+ and a TOT xfsprogs, there's also the "zero" command that converts allocated space back to the preallocated (zeroed) state without doing any IO. It's the equivalent unresvsp + resvsp in a single operation. > We don't really care if > the data gets 0'ed out. Is there another method - allocsp takes too > long for this application? allocsp is historical interface, pretty much useless and should probably be removed. I can't think of any situation where allocsp would be better than resvsp or zero.... > Or, does it matter if XFS thinks the extents > are preallocated but unwritten if no other files are written to the > disk? I'm not sure what you are asking there... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 27 23:34:33 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0S5YWLU111642 for ; Thu, 27 Jan 2011 23:34:33 -0600 X-ASG-Debug-ID: 1296193015-7a3501e10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 687001A46532 for ; Thu, 27 Jan 2011 21:36:55 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id Zh9tWO4q9lRvfCk2 for ; Thu, 27 Jan 2011 21:36:55 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AggEAG3jQU15LN5mgWdsb2JhbACkfhYBARYiJLtyDYVCBJII Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 28 Jan 2011 16:06:54 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pih0v-0002Bf-Jc; Fri, 28 Jan 2011 16:36:53 +1100 Date: Fri, 28 Jan 2011 16:36:53 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: optimize xfs_alloc_fix_freelist Subject: Re: [PATCH 4/6] xfs: optimize xfs_alloc_fix_freelist Message-ID: <20110128053653.GS21311@dastard> References: <20110121092227.115815324@bombadil.infradead.org> <20110121092551.185804716@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110121092551.185804716@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296193017 X-Barracuda-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.53655 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, Jan 21, 2011 at 04:22:31AM -0500, Christoph Hellwig wrote: > If we shorten the freelist in xfs_alloc_fix_freelist there is no need > to wait for busy blocks as they will be marked busy again when we call > xfs_free_ag_extent. Avoid this by not marking blocks coming from the > freelist as busy in xfs_free_ag_extent, and not marking transactions > with busy extents as synchronous in xfs_alloc_get_freelist. Unlike > xfs_free_ag_extent which already has the isfl argument, > xfs_alloc_get_freelist needs to be told about the usage of the blocks > it returns. For this we extend the btreeblk flag to a type argument > which specifies in detail what the block is going to be used for. > > Signed-off-by: Christoph Hellwig (This is mostly notes I wrote as I analysed the change) Ok, so prior to this change we added extents to the busy list: - unconditionally in xfs_free_ag_extent(). i.e. freeing an extent back into the freespace btree - unconditionally in xfs_allocbt_free_block() when freeing a btree block back to the freelist And we search for busy extents in: - unconditionally in xfs_alloc_get_freelist() - unconditionally in xfs_alloc_ag_vextent() - unconditionally in xfs_trim_extents() So, for blocks on the freelist, they may or may not be in the busy list depending on whether they were placed there via xfs_alloc_fix_freelist() or xfs_allocbt_free_block(). In the case they were put there via xfs_alloc_fix_freelist(), the extent will not be in the busy list so this change should be a no-op. In the case they were put there via xfs_allocbt_free_block(), they will already be in the busy list when we call xfs_alloc_get_freelist() and hence the transaction will always be marked synchronous. The change here is to avoid marking transactions which "allocate" blocks via xfs_alloc_get_freelist() synchronous if possible. So, if we get a block via xfs_alloc_ag_vextent_small(), it is tagged XFS_FREELIST_ALLOC. If we get a block via xfs_alloc_fix_freelist, it is tagged XFS_FREELIST_BALANCE, and if we are allocating a block for the alloc btree, it is tagged XFS_FREELIST_BTREE. If the tag is XFS_FREELIST_BALANCE, we do not do a busy list search as we are not actually allocating the block for use, otherwise we do the search. Then, in xfs_free_ag_extent() itself, when the block is coming from the freelist, we do not add it to the busy extent list as it is already in the busy list if it is necessary for it to be there. i.e. if a block goes freespace -> freelist -> freespace, then there is no need for it to be marked busy. ---- Ok, I've convinced myself that the changes are sane, though I think it could do with a bit more explaination in the changelog and a description of what the XFS_FREELIST_* tags do where they are declared. Thinking through this a bit more - we don't need to do a busy search for metadata allocations - it's only necessary for metadata -> data extent transistions. Metadata modifications are all logged, so there is no need to force out the busy extent transaction if the next allocation is for metadata. If the new transaction hits the disk, then it will only be replayed if the previous transaction to free the extent is on the disk and has already been replayed. Hence I think we only need to do a busy search in these cases for XFS_FREELIST_ALLOC when args->userdata == 0. The XFS_FREELIST_BTREE case is definitely a metadata allocation, so it seems to me that there is further scope for optimisation here. i.e. that allocbt -> freelist -> allocbt doesn't require a sync transaction to be issued. The code as it stands looks good; the question is should we take this next step as well? Have I missed anything that makes this a bad thing to do, Christoph? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Jan 27 23:49:31 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0S5nVgi114124 for ; Thu, 27 Jan 2011 23:49:31 -0600 X-ASG-Debug-ID: 1296193914-34c003180000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 70D8F8D8356 for ; Thu, 27 Jan 2011 21:51:55 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id vPB9r6MsBBzHHnYA for ; Thu, 27 Jan 2011 21:51:55 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AggEAPHmQU15LN5mgWdsb2JhbACkfxYBARYiJLtnDYVCBJII Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 28 Jan 2011 16:21:54 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PihFR-0002DF-8w; Fri, 28 Jan 2011 16:51:53 +1100 Date: Fri, 28 Jan 2011 16:51:53 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: optimize xfs_alloc_fix_freelist Subject: Re: [PATCH 4/6] xfs: optimize xfs_alloc_fix_freelist Message-ID: <20110128055153.GT21311@dastard> References: <20110121092227.115815324@bombadil.infradead.org> <20110121092551.185804716@bombadil.infradead.org> <20110128053653.GS21311@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110128053653.GS21311@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296193916 X-Barracuda-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.53656 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, Jan 28, 2011 at 04:36:53PM +1100, Dave Chinner wrote: > Thinking through this a bit more - we don't need to do a busy search > for metadata allocations - it's only necessary for metadata -> data > extent transistions. Metadata modifications are all logged, so there > is no need to force out the busy extent transaction if the next > allocation is for metadata. If the new transaction hits the disk, > then it will only be replayed if the previous transaction to free > the extent is on the disk and has already been replayed. > > Hence I think we only need to do a busy search in these cases for > XFS_FREELIST_ALLOC when args->userdata == 0. The XFS_FREELIST_BTREE > case is definitely a metadata allocation, so it seems to me that > there is further scope for optimisation here. i.e. that allocbt -> > freelist -> allocbt doesn't require a sync transaction to be issued. > > The code as it stands looks good; the question is should we take > this next step as well? Have I missed anything that makes this a bad > thing to do, Christoph? Oh, I see the next patch tries to address this. That'll learn me to read the entire patch series through before commenting on any of it. I'll take this discussion to that patch.... ;) Cheers,, Dave. -- Dave Chinner david@fromorbit.com From michael.monnerie@is.it-management.at Fri Jan 28 00:20:08 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0S6K84h121640 for ; Fri, 28 Jan 2011 00:20:08 -0600 X-ASG-Debug-ID: 1296195751-33e603c70000-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 1AD9F1548AA6 for ; Thu, 27 Jan 2011 22:22:31 -0800 (PST) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id ODkfZiy0cwSOHEeN for ; Thu, 27 Jan 2011 22:22:31 -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 EF68260C; Fri, 28 Jan 2011 07:22:29 +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 CEE2D401C3D; Fri, 28 Jan 2011 07:22:28 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: extremely slow write performance plaintext Subject: Re: extremely slow write performance plaintext Date: Fri, 28 Jan 2011 07:22:20 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.37-zmi; KDE/4.4.4; x86_64; ; ) Cc: Cory Coager References: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> <4D3E9C73.6090508@opencubetech.com> <20047_1295965512_4D3EDD47_20047_8804_1_4D3EDD47.304@davisvision.com> In-Reply-To: <20047_1295965512_4D3EDD47_20047_8804_1_4D3EDD47.304@davisvision.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1566001.9hRy6ottlK"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201101280722.28648@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1296195752 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0009 1.0000 -2.0154 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.53658 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 --nextPart1566001.9hRy6ottlK Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Dienstag, 25. Januar 2011 Cory Coager wrote: > It is a ProLiant DL385 G1. OK, so the speed you get could be just normal. You got a box that still=20 says "Compaq" on it, right? Just after Christmas I virtualized a=20 DL380 G1 to a DL 385 G6, and it's much faster now, even when=20 virtualized. It's not really needed to talk about performance when you use such old=20 hardware. Be happy when it works without problems ;-) =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/ --nextPart1566001.9hRy6ottlK 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) iEYEABECAAYFAk1CYKQACgkQzhSR9xwSCbS0wQCg3pSKU6ovQ95Zgw2QFQPVz103 u5UAmwYhI0yBdbfFurxLzfzxpxU0nfa+ =Qe+g -----END PGP SIGNATURE----- --nextPart1566001.9hRy6ottlK-- From david@fromorbit.com Fri Jan 28 00:31:01 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0S6V0Wt123419 for ; Fri, 28 Jan 2011 00:31:01 -0600 X-ASG-Debug-ID: 1296196402-34b903e60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 64548154A148 for ; Thu, 27 Jan 2011 22:33:23 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id qx5ErwGSHfqzekFt for ; Thu, 27 Jan 2011 22:33:23 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AggEAHLxQU15LN5mgWdsb2JhbACkfxYBARYiJLtHDYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 28 Jan 2011 17:03:22 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PihtY-0002Gl-JR; Fri, 28 Jan 2011 17:33:20 +1100 Date: Fri, 28 Jan 2011 17:33:20 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/6] xfs: do not classify freed allocation btree blocks as busy Subject: Re: [PATCH 5/6] xfs: do not classify freed allocation btree blocks as busy Message-ID: <20110128063320.GU21311@dastard> References: <20110121092227.115815324@bombadil.infradead.org> <20110121092551.402449845@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110121092551.402449845@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296196405 X-Barracuda-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.53658 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, Jan 21, 2011 at 04:22:32AM -0500, Christoph Hellwig wrote: > During an allocation or freeing of an extent, we occasionally have an > interesting situation happen during a btree update. We may merge a block > as part of a record delete, then allocate it again immediately afterwards > when inserting a modified extent. xfs_alloc_fixup_trees() does this sort > of manipulation to the btrees, and so can merge then immediately split > the tree resulting the in the same busy block being used from the > freelist. > > Previously, this would trigger a synchronous log force of the entire log > (as the current transaction had a lsn of 0 until committed), but continue > to allow the extent to be used because if it is not on disk now then it > must have been freed and marked busy in this transaction. > > In the case of allocbt blocks, we log the fact that they get moved to the > freelist and we also log them when the move off the free list back into > the free space trees. When we move the blocks off the freelist back to > the trees, we mark the extent busy at that point so that it doesn't get > reused until the transaction is committed. I'm not sure this is correct - it's when they are put on the freelist that they are marked busy (xfs_allocbt_free_block), and with the previous patch they now don't get marked busy when freed back to the trees. > This means that as long as the block is on the AGFL and is only used > for allocbt blocks, we don't have to force the log to ensure prior > manipulating transactions are on disk as the process of log recovery > will replay the transactions in the correct order. I think that as long as the busy extent is reallocated as metadata of any kind, it does not require us to force the log/mark the transaction synchronous. That is, the metadata modifications will not be written to the extent until the allocation transaction has hit the disk regardless of whether we force the log here or not. Hence log recovery will always do the right thing here. It's the metadata -> data extent re-allocation that we need the protecion for, as we cannot serialise data extent writes against log recovery requirements. That is, we have no idea if the data extent contents have been written or not when we run log recovery, so we cannot allow data to be written until we are certain that that the data extent allocation overrides all the recorded metadata changes in the log. For data -> metadata reallocation, this is not a problem as we know the metadata writes will not be done (and therefore overwrite the data on disk) until the transactions are on disk and the metadata buffers unpinned. The same goes for metadata->metadata reallocation. Hence I don't think we specifically need to track allocbt blocks in the busy list - we track all freed blocks like we currently do, but we only need to search the busy block list and mark transactions synchronous for data extent allocations. This removes the complexity of removing busy allocbt blocks from the busy tree when they get reused - if they remain allocated they will be removed from the tree as transactions/checkpoints are committed to disk just like they currently are. That also avoids the problem of a transaction commit trying to remove a busy extent from the tree that isn't in there anymore or potential races based around transactions adding and removing busy blocks that log IO completion will be trying to remove. Does this make sense? I understand this code a lot better than I did when I originally wrote these patches, and to tell the truth I can't remember exactly why I took this approach. Looking over the patches makes me think that I was trying to do the minimum possible semantic change to solve the specific problem I was seeing, rather than understanding the entire workings of the busy extent list and how to optimise from there... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Jan 28 01:29:08 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0S7T8vl133309 for ; Fri, 28 Jan 2011 01:29:08 -0600 X-ASG-Debug-ID: 1296199891-233701ca0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E6E4C1490AC4 for ; Thu, 27 Jan 2011 23:31:31 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id iYGYpFEISnhqMMCL for ; Thu, 27 Jan 2011 23:31:31 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AggEAIP/QU15LN5mgWdsb2JhbACkfxYBARYiJLsyDYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 28 Jan 2011 18:01:30 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Piinf-0002LO-4y; Fri, 28 Jan 2011 18:31:19 +1100 Date: Fri, 28 Jan 2011 18:31:19 +1100 From: Dave Chinner To: Mark Lord Cc: Stan Hoeppner , Justin Piszcz , Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount Message-ID: <20110128073119.GV21311@dastard> References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D41EA04.7010506@teksavvy.com> <20110128001735.GO21311@dastard> <4D421A68.9000607@teksavvy.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D421A68.9000607@teksavvy.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296199892 X-Barracuda-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.53662 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, Jan 27, 2011 at 08:22:48PM -0500, Mark Lord wrote: > On 11-01-27 07:17 PM, Dave Chinner wrote: > > > > In my experience with XFS, most people who tweak mkfs parameters end > > up with some kind of problem they can't explain and don't know how > > to solve. And they are typically problems that would not have > > occurred had they simply used the defaults in the first place. What > > you've done is a perfect example of this. > > Maybe. But what I read from the paragraph above, > is that the documentation could perhaps explain things better, > and then people other than the coders might understand how > best to tweak it. A simple google search turns up discussions like this: http://oss.sgi.com/archives/xfs/2009-01/msg01161.html Where someone reads the docco and asks questions to fill in gaps in their knowledge that the docco didn't explain fully before they try to twiddle knobs. Configuring XFS filesystems for optimal performance has always been a black art because it requires you to understand your storage, your application workload(s) and XFS from the ground up. Most people can't even tick one of those boxes, let alone all three.... > > Why 8 AGs and not the default? > > How AGs are used is not really explained anywhere I've looked, > so I am guessing at what they do and how the system might respond > to different values there (that documentation thing again). Section 5.1 of this 1996 whitepaper tells you what allocation groups are and the general allocation strategy around them: http://oss.sgi.com/projects/xfs/papers/xfs_usenix/index.html > Lacking documentation, my earlier experiences suggest that more AGs > gives me less fragmentation when multiple simultaneous recording streams > are active. I got higher fragmentation with the defaults than with > the tweaked value. Fragmentation is not a big problem if you've got extents larger than a typical IO. Once extents get to a few megabytes in size, it just doesn't matter if they are any bigger for small DVR workloads because the seek cost between streams is sufficiently amortised with a few MB of sequential access per stream.... > Now, that might be due to differences in kernel versions too, > as things in XFS are continuously getting even better (thanks!), > and the original "defaults" assessment was with the kernel-of-the-day > back in early 2010 (2.6.34?), and now the system is using 2.6.37. > > But I just don't know. My working theory, likely entirely wrong, > is that if I have N streams active, odds are that each of those > streams might get assigned to different AGs, given sufficient AGs >= N. Streaming into different AGs is not necessarily the right solution; it causes seeks between every streami, and the stream in AG0 will be able to read/write faster than the stream in AG 7 because of their locations on disk. IOWs, interleaving streams within an AG might give better IO patterns, lower latency and better throughput. Of course, it depends on the storage subsystem, the application, etc. And yes, you can change this sort of allocation behaviour by fiddling with XFS knobs in the right way - start to see what I mean about tuning XFS really being a "black art"? > Since the box often has 3-7 recording streams active, > I'm trying it out with 8 AGs now. Seems like a reasonable decsion. Good luck. > > Cheers > > -- Dave Chinner david@fromorbit.com From ajeet.yadav.77@gmail.com Fri Jan 28 05:10:40 2011 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_63,T_DKIM_INVALID,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 p0SBAe0O154881 for ; Fri, 28 Jan 2011 05:10:40 -0600 X-ASG-Debug-ID: 1296213185-2483017c0000-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 7AAD61DC49A6 for ; Fri, 28 Jan 2011 03:13:05 -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 IiCI7BMcxMVDyoDn for ; Fri, 28 Jan 2011 03:13:05 -0800 (PST) Received: by qyk12 with SMTP id 12so3489257qyk.5 for ; Fri, 28 Jan 2011 03:13:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:date:message-id:subject:from:to :content-type; bh=lH976KZ0LkNH6F/ln0+ktDBX+T6J1sYu5goTexf33Fk=; b=Lrvgga+xiurJbzOw88SEMrjhkRvXOrKzpfkp9hC4QhFLSnXskBgWm0Fi/jqPkLxTpe nZIjnXo++hhW0Pqq7IdBZyl1xQFcFt2XUwpgJu2T2k2Ox2lbr1Qdx2Y52KUxHDFpxioq ys8S3kaGKpM177DoPYz3+TIferTyVytrpjf6M= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=IH8PNYCWow7roMra2k6gTCTO+ogMhzBuUpYRClzDSFfJXAixsyGd1v/XaSKtr2X36M 7Mm1hGKybo+kNONZRZwBzS0434JRuiQsCJMb8DV81hKA2oEPipsi8p+2eN6+9pHQXtm2 mvkIuQOic7UmazOZ8BHdfTggFSRl/Yb/Sltmg= MIME-Version: 1.0 Received: by 10.229.224.212 with SMTP id ip20mr2586269qcb.237.1296213184714; Fri, 28 Jan 2011 03:13:04 -0800 (PST) Received: by 10.220.165.198 with HTTP; Fri, 28 Jan 2011 03:13:04 -0800 (PST) Date: Fri, 28 Jan 2011 20:13:04 +0900 Message-ID: X-ASG-Orig-Subj: [patch] xfsprogs: repair pagefault due to missed out sanity NULL check Subject: [patch] xfsprogs: repair pagefault due to missed out sanity NULL check From: Ajeet Yadav To: xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=0016363b86f06d9a5d049ae626f5 X-Barracuda-Connect: mail-qy0-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1296213185 X-Barracuda-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.53677 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 --0016363b86f06d9a5d049ae626f5 Content-Type: multipart/alternative; boundary=0016363b86f06d9a4c049ae626f3 --0016363b86f06d9a4c049ae626f3 Content-Type: text/plain; charset=ISO-8859-1 libxfs_putbuf() is called with bp = NULL, resulting in pagefault in libpthread. Function da_read_buf() allocate array of xfs_buf_t * * xfs_buf_t **bplist;* * bplist = calloc(nex, sizeof(*bplist));* Read and fill it using *for (i = 0; i < nex; i++) { bplist[i] = libxfs_readbuf()* * if (!bplist[i]){ goto failed; } * *}* *failed: for (i = 0; i < nex; i++) libxfs_putbuf(bplist[i]);* Now assume nex = 10, 1. Will create bplist for 10 array elements. 3. Reading from disk 0,1, 2, 3 4. When reading from disk 4, USB is removed 5. libxfs_readbuf() will at fail, pblist[4] = NULL, goto failed. 6. Since only 4 buffers were read successfully, so only 4 are in lock state. 7. Error handling will unlock buffer from 1-10 8. Buffer 0-3 were read successfully, hence will have valid pdlist[i] 9. Access pblist[4] == NULL, therefore unlocking will set bp == NULL in libxfs_putbuf(bp); 10. Page fault in libpthread Solution patch attached with mail --0016363b86f06d9a4c049ae626f3 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
libxfs_putbuf() is called with=A0bp =3D NULL, resulting in pa= gefault in libpthread.
=A0
Function da_read_buf() allocate array of=A0xfs_buf_t *=

=A0=A0=A0=A0xfs_buf_t=A0=A0=A0=A0=A0=A0 **bplist;

=A0=A0=A0=A0bplist =3D calloc(nex, sizeof(*bplist));

Read and fill it using =A0

for (i =3D 0; i < nex; i++) {
=A0=A0=A0=A0bplist[= i] =3D libxfs_readbuf()

=A0=A0=A0=A0if (!bplist[i]){
=A0=A0=A0=A0=A0=A0=A0= =A0goto failed;
=A0=A0=A0=A0}=A0=A0

}

failed:
=A0=A0=A0=A0=A0=A0=A0 for (i =3D 0; i < n= ex; i++)
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 libxfs_putbuf(bpl= ist[i]);

Now assume nex =3D 10,

1. Will create bplist for 10 array elements.

3. Reading from disk 0,1, 2, 3

4. When reading from disk 4, USB is removed

5. libxfs_readbuf() will at fail,=A0pblist[4] =3D NULL, goto fa= iled.

6. Since only 4 buffers were read successfully, so only 4 are i= n lock state.

7. =A0Error handling=A0will unlock buffer from 1-10

8. Buffer 0-3 were read successfully, hence will have valid pdl= ist[i]

9. Access=A0pblist[4] =3D=3D NULL, therefore unlocking will set= bp =3D=3D NULL in libxfs_putbuf(bp);

10. Page fault in libpthread
=A0
=A0
Solution patch attached with mail
=A0
=A0
--0016363b86f06d9a4c049ae626f3-- --0016363b86f06d9a5d049ae626f5 Content-Type: application/octet-stream; name="xfs_repair_da_read_buf_failed_unlock_fix.patch" Content-Disposition: attachment; filename="xfs_repair_da_read_buf_failed_unlock_fix.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gjgzulym0 ZGlmZiAtTnVycCB4ZnNwcm9ncy0zLjAuNS9yZXBhaXIvZGlyMi5jIHhmc3Byb2dzLTMuMC41LWRp cnR5L3JlcGFpci9kaXIyLmMKLS0tIHhmc3Byb2dzLTMuMC41L3JlcGFpci9kaXIyLmMJMjAxMC0w Ny0xNiAxMzowNzowOS4wMDAwMDAwMDAgKzA5MDAKKysrIHhmc3Byb2dzLTMuMC41LWRpcnR5L3Jl cGFpci9kaXIyLmMJMjAxMS0wMS0yOCAxODo0OToyMS4wMDAwMDAwMDAgKzA5MDAKQEAgLTExMCw5 ICsxMTAsMTAgQEAgZGFfcmVhZF9idWYoCiAJCWJwbGlzdFtpXSA9IGxpYnhmc19yZWFkYnVmKG1w LT5tX2RldiwKIAkJCQlYRlNfRlNCX1RPX0RBRERSKG1wLCBibXBbaV0uc3RhcnRibG9jayksCiAJ CQkJWEZTX0ZTQl9UT19CQihtcCwgYm1wW2ldLmJsb2NrY291bnQpLCAwKTsKLQkJaWYgKCFicGxp c3RbaV0pCisJCWlmICghYnBsaXN0W2ldKXsKKwkJCW5leCA9IGk7CiAJCQlnb3RvIGZhaWxlZDsK LQorCQl9CiAJCXBmdHJhY2UoInJlYWRidWYgJXAgKCVsbHUsICVkKSIsIGJwbGlzdFtpXSwKIAkJ CShsb25nIGxvbmcpWEZTX0JVRl9BRERSKGJwbGlzdFtpXSksCiAJCQlYRlNfQlVGX0NPVU5UKGJw bGlzdFtpXSkpOwo= --0016363b86f06d9a5d049ae626f5-- From ajeet.yadav.77@gmail.com Fri Jan 28 05:28:39 2011 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,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 p0SBSdAP155459 for ; Fri, 28 Jan 2011 05:28:39 -0600 X-ASG-Debug-ID: 1296214263-4cf901c00000-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 3B1E88DEFE8 for ; Fri, 28 Jan 2011 03:31:03 -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 7TxIyzJcZpDuIbua for ; Fri, 28 Jan 2011 03:31:03 -0800 (PST) Received: by qyk12 with SMTP id 12so3506355qyk.5 for ; Fri, 28 Jan 2011 03:31:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:date:message-id:subject:from:to :content-type; bh=r4T26/AVDB5QHGoV5IF0ibBxLTgXFb+9UfY1W2jdOUs=; b=DgWqnCQBKMdYoz54o3xjfFw4b/z+mdDRyi6sOI2KOaLmHc2bHG4lb7X+4M5S6prUt/ CxSgGwjo4ZFcgUNCsPfOiQb3SN6pJShpeNpCpgpwnfn/C4OGlL/+OVL8vtAWgsQNIyss 7qusGsbVCdXOGEKTOCtugd7z9Yc0b5pdZGGYc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=hk4mtGtL0gOEX/lHEmWSAGmQdKhpSX3Ar7sbwVhqaz9hpat3e3dBp40VraXh3W2Qef pBWodob2TIPG5909nu/dzbBIRO9q/ENz8dFwOXrGTzjfmgE5AWLQTytZvMmTEgJN+vzM zIuWbmZQco271aLBhVCw/TBF5U8beVYLqaGUY= MIME-Version: 1.0 Received: by 10.224.11.145 with SMTP id t17mr2939973qat.54.1296214263031; Fri, 28 Jan 2011 03:31:03 -0800 (PST) Received: by 10.220.165.198 with HTTP; Fri, 28 Jan 2011 03:31:02 -0800 (PST) Date: Fri, 28 Jan 2011 20:31:02 +0900 Message-ID: X-ASG-Orig-Subj: [patch] xfsprogs: repair never return if device removed Subject: [patch] xfsprogs: repair never return if device removed From: Ajeet Yadav To: xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=0015175cd0fcb36742049ae66661 X-Barracuda-Connect: mail-qy0-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1296214264 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=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.53678 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 --0015175cd0fcb36742049ae66661 Content-Type: multipart/alternative; boundary=0015175cd0fcb3672c049ae6665f --0015175cd0fcb3672c049ae6665f Content-Type: text/plain; charset=ISO-8859-1 xfsprogs all version, delete primary superblock of xfs partition dd if=/dev/zero of=/dev/sda1 bs=512 count=1 sync Run xfs_repair in partition, while its searching for secondary superblock, remove the disk (USB) xfs_repair will never exit and will loop in never ending ............ Please find patch attached with mail --0015175cd0fcb3672c049ae6665f Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
xfsprogs all version, delete primary superblock of xfs partition
=A0
dd if=3D/dev/zero of=3D/dev/sda1 bs=3D512 count=3D1
sync
=A0
Run xfs_repair in partition, while its searching for secondary superbl= ock, remove the disk (USB) xfs_repair will never exit and will loop in neve= r ending ............
=A0
Please find patch attached with mail
--0015175cd0fcb3672c049ae6665f-- --0015175cd0fcb36742049ae66661 Content-Type: application/octet-stream; name="xfs_repair_hang_on_device_removal.patch" Content-Disposition: attachment; filename="xfs_repair_hang_on_device_removal.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gjh0hcy90 ZGlmZiAtTnVycCB4ZnNwcm9ncy0zLjAuNS9yZXBhaXIvc2IuYyB4ZnNwcm9ncy0zLjAuNS1kaXJ0 eS9yZXBhaXIvc2IuYwotLS0geGZzcHJvZ3MtMy4wLjUvcmVwYWlyL3NiLmMJMjAxMS0wMS0yOCAy MDoyMzowMi4wMDAwMDAwMDAgKzA5MDAKKysrIHhmc3Byb2dzLTMuMC41LWRpcnR5L3JlcGFpci9z Yi5jCTIwMTEtMDEtMjggMjA6MjE6MDYuMDAwMDAwMDAwICswOTAwCkBAIC0xMjIsOCArMTIyLDkg QEAgZmluZF9zZWNvbmRhcnlfc2IoeGZzX3NiX3QgKnJzYikKIAkJCWRvbmUgPSAxOwogCQl9CiAK LQkJaWYgKCFkb25lICYmIChic2l6ZSA9IHJlYWQoeC5kZmQsIHNiLCBCU0laRSkpID09IDApICB7 CisJCWlmICghZG9uZSAmJiAoYnNpemUgPSByZWFkKHguZGZkLCBzYiwgQlNJWkUpKSA8PSAwKSAg ewogCQkJZG9uZSA9IDE7CisJCQlkb193YXJuKF8oIkNvdWxkbid0IGZpbmQgY2FuZGlkYXRlIHNl Y29uZGFyeSBzdXBlcmJsb2NrLCBleGl0aW5nLi4uXG4iKSk7CiAJCX0KIAogCQlkb193YXJuKCIu Iik7Cg== --0015175cd0fcb36742049ae66661-- From ccoager@davisvision.com Fri Jan 28 07:05:49 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0SD5mai158096 for ; Fri, 28 Jan 2011 07:05:49 -0600 X-ASG-Debug-ID: 1296220093-4002010a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from zixvpm02.zixvpm.davisvision.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0D4ED8E4A9A for ; Fri, 28 Jan 2011 05:08:13 -0800 (PST) Received: from zixvpm02.zixvpm.davisvision.com (zixvpm02.zixvpm.davisvision.com [65.213.99.45]) by cuda.sgi.com with ESMTP id VpK2T4NBBbiAMY9x for ; Fri, 28 Jan 2011 05:08:13 -0800 (PST) Received: from zixvpm02.zixvpm.davisvision.com (ZixVPM [127.0.0.1]) by Outbound.davisvision.com (Proprietary) with ESMTP id B56225DC024 for ; Fri, 28 Jan 2011 08:08:12 -0500 (EST) Received: from riley.davisvision.com (unknown [10.51.11.112]) by zixvpm02.zixvpm.davisvision.com (Proprietary) with ESMTP id 4E0581F4014; Fri, 28 Jan 2011 08:08:12 -0500 (EST) Received: from riley.davisvision.com (localhost [127.0.0.1]) by localhost (Postfix) with SMTP id 38CE424640; Fri, 28 Jan 2011 08:08:12 -0500 (EST) Received: from [192.168.148.68] (ccoager-linux.davisvision.com [192.168.148.68]) by riley.davisvision.com (Postfix) with ESMTP id 27CB72463D; Fri, 28 Jan 2011 08:08:12 -0500 (EST) Message-ID: <1821_1296220092_4D42BFBC_1821_629_1_4D42BFBC.1080001@davisvision.com> Date: Fri, 28 Jan 2011 08:08:12 -0500 From: Cory Coager Organization: Davis Vision User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101208 Lightning/1.0b2 Thunderbird/3.1.7 MIME-Version: 1.0 To: Michael Monnerie CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: extremely slow write performance plaintext Subject: Re: extremely slow write performance plaintext References: <3205_1294953756_4D2F6D1C_3205_1943_1_4D2F6D1C.2060409@davisvision.com> <4D3E9C73.6090508@opencubetech.com> <20047_1295965512_4D3EDD47_20047_8804_1_4D3EDD47.304@davisvision.com> <201101280722.28648@zmi.at> In-Reply-To: <201101280722.28648@zmi.at> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Banner: Set X-Barracuda-Connect: zixvpm02.zixvpm.davisvision.com[65.213.99.45] X-Barracuda-Start-Time: 1296220094 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0005 1.0000 -2.0181 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.53686 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 01/28/2011 01:22 AM, Michael Monnerie wrote: > OK, so the speed you get could be just normal. You got a box that still > says "Compaq" on it, right? Just after Christmas I virtualized a > DL380 G1 to a DL 385 G6, and it's much faster now, even when > virtualized. > > It's not really needed to talk about performance when you use such old > hardware. Be happy when it works without problems ;-) Yeah, we should be getting new hardware soon. Hopefully this issue will go away then. ------------------------------------------------------------------------ The information contained in this communication is intended only for the use of the recipient(s) named above. It may contain information that is privileged or confidential, and may be protected by State and/or Federal Regulations. If the reader of this message is not the intended recipient, you are hereby notified that any dissemination, distribution, or copying of this communication, or any of its contents, is strictly prohibited. If you have received this communication in error, please return it to the sender immediately and delete the original message and any copy of it from your computer system. If you have any questions concerning this message, please contact the sender. ------------------------------------------------------------------------ From david@fromorbit.com Fri Jan 28 07:54:35 2011 X-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, T_FRT_PROFILE2 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 p0SDsYCf159524 for ; Fri, 28 Jan 2011 07:54:35 -0600 X-ASG-Debug-ID: 1296223017-09eb03270000-NocioJ 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 B32D31A4005C for ; Fri, 28 Jan 2011 05:56:58 -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 WlCD8Umajh6aiiHI for ; Fri, 28 Jan 2011 05:56:58 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqgEAFdYQk15LN5mgWdsb2JhbACkfxYBARYiJLwzDYJqglgE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail07.adl2.internode.on.net with ESMTP; 29 Jan 2011 00:26:50 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PiooP-0002rr-8k; Sat, 29 Jan 2011 00:56:29 +1100 Date: Sat, 29 Jan 2011 00:56:29 +1100 From: Dave Chinner To: david@lang.hm Cc: Stan Hoeppner , Linux Kernel , xfs@oss.sgi.com, Christoph Hellwig , Justin Piszcz , Alex Elder , Mark Lord X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount Message-ID: <20110128135629.GX21311@dastard> References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D42056E.2050505@hardwarefreak.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: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1296223019 X-Barracuda-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.53689 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, Jan 27, 2011 at 06:09:58PM -0800, david@lang.hm wrote: > On Thu, 27 Jan 2011, Stan Hoeppner wrote: > >david@lang.hm put forth on 1/27/2011 2:11 PM: > > > >>how do I understand how to setup things on multi-disk systems? the documentation > >>I've found online is not that helpful, and in some ways contradictory. > > > >Visit http://xfs.org There you will find: > > > >Users guide: > >http://xfs.org/docs/xfsdocs-xml-dev/XFS_User_Guide//tmp/en-US/html/index.html > > > >File system structure: > >http://xfs.org/docs/xfsdocs-xml-dev/XFS_Filesystem_Structure//tmp/en-US/html/index.html > > > >Training labs: > >http://xfs.org/docs/xfsdocs-xml-dev/XFS_Labs/tmp/en-US/html/index.html > > thanks for the pointers. > > >>If there really are good rules for how to do this, it would be very helpful if > >>you could just give mkfs.xfs the information about your system (this partition > >>is on a 16 drive raid6 array) and have it do the right thing. > > > >If your disk array is built upon Linux mdraid, recent versions of mkfs.xfs will > >read the parameters and automatically make the filesystem accordingly, properly. > > > >mxfs.fxs will not do this for PCIe/x hardware RAID arrays or external FC/iSCSI > >based SAN arrays as there is no standard place to acquire the RAID configuration > >information for such systems. For these you will need to configure mkfs.xfs > >manually. > > > >At minimum you will want to specify stripe width (sw) which needs to match the > >hardware stripe width. For RAID0 sw=[#of_disks]. For RAID 10, sw=[#disks/2]. > >For RAID5 sw=[#disks-1]. For RAID6 sw=[#disks-2]. > > > >You'll want at minimum agcount=16 for striped hardware arrays. Depending on the > >number and spindle speed of the disks, the total size of the array, the > >characteristics of the RAID controller (big or small cache), you may want to > >increase agcount. Experimentation may be required to find the optimum > >parameters for a given hardware RAID array. Typically all other parameters may > >be left at defaults. > > does this value change depending on the number of disks in the array? Only depending on block device capacity. Once at the maximum AG size (1TB), mkfs has to add more AGs. So once above 4TB for hardware RAID LUNs and 16TB for md/dm devices, you will get an AG per TB of storage by default. As it is, the optimal number and size of AGs will depend on many geometry factors as workload factors, such as the size of the luns, the way they are striped, whether you are using linear concatenation of luns or striping them or a combination of both, the amount of allocation concurrency you require, etc. In these sorts of situations, mkfs can only make a best guess - to do better you really need someone proficient in the dark arts to configure the storage and filesystem optimally. > >Picking the perfect mkfs.xfs parameters for a hardware RAID array can be > >somewhat of a black art, mainly because no two vendor arrays act or perform > >identically. > > if mkfs.xfs can figure out how to do the 'right thing' for md raid > arrays, can there be a mode where it asks the users for the same > information that it gets from the kernel? mkfs.xfs can get the information it needs directly from dm and md devices. However, when hardware RAID luns present themselves to the OS in an identical manner to single drives, how does mkfs tell the difference between a 2TB hardware RAID lun made up of 30x73GB drives and a single 2TB SATA drive? The person running mkfs should already know this little detail.... > >Systems of a caliber requiring XFS should be thoroughly tested before going into > >production. Testing _with your workload_ of multiple parameters should be > >performed to identify those yielding best performance. > > > the problem with this is that for large arrays, formatting the array > and loading it with data can take a day or more, even before you > start running the test. This is made even worse if you are scaling > up an existing system a couple orders of magnatude, because you may > not have the full workload available to you. If your hardware procurement-to-production process doesn't include testing performance of potential equipment on a representative workload, then I'd say you have a process problem that we can't help you solve.... > Saying that you should > test out every option before going into production is a cop-out. I never test every option. I know what the options do, so to decide what to tweak (if anything) what I first need to know is how a workload performs on a given storage layout with default options. I need to have: a) some idea of the expected performance of the workload b) a baseline performance characterisation of the underlying block devices c) a set of baseline performance metrics from a representative workload on a default filesystem d) spent some time analysing the baseline metrics for evidence of sub-optimal performance characteristics. Once I have that information, I can suggest meaningful ways (if any) to change the storage and filesystem configuration that may improve the performance of the workload. BTW, if you ask me how to optimise an ext4 filesystem for the same workload, I'll tell you straight up that I have no idea and that you should ask an ext4 expert.... > The better you can test it, the better off you are, but without > knowing what the knobs do, just doing a test and twiddling the > knobs to do another test isn't very useful. Well, yes, that is precisely the reason you should use the defaults. It's also the reason we have experts - they know what knob to twiddle to fix specific problems. If you prefer to twiddle knobs like Blind Freddy, then you should expect things to go wrong.... > If there is a way to > set the knobs in the general ballpark, Have you ever considered that this is exactly what mkfs does when you use the defaults? And that this is the fundamental reason we keep saying "use the defaults"? > then you can test and see > if the performance seems adaquate, if not you can try teaking one > of the knobs a little bit and see if it helps or hurts. but if the > knobs aren't even in the ballpark when you start, this doesn't > help much. The thread has now come full circle - you're ranting about not knowing what knobs do or how to set reasonable values so you want to twiddle random knobs them to see if they do anything as the basis of your optimisation process. This is the exact process that lead to the bug report that started this thread - a tweak-without- understanding configuration leading to undesirable behavioural characteristics from the filesystem..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From kernel@teksavvy.com Fri Jan 28 08:19:57 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0SEJuDU160317 for ; Fri, 28 Jan 2011 08:19:57 -0600 X-ASG-Debug-ID: 1296224540-400103b60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ironport2-out.pppoe.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 255F28E3B25 for ; Fri, 28 Jan 2011 06:22:21 -0800 (PST) Received: from ironport2-out.pppoe.ca (ironport2-out.teksavvy.com [206.248.154.183]) by cuda.sgi.com with ESMTP id WOnDQYSZDceQ6Diq for ; Fri, 28 Jan 2011 06:22:21 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApIBABNgQk1Ld/sX/2dsb2JhbAAMhAjNB5B0gSODOHQEhRg X-IronPort-AV: E=Sophos;i="4.60,392,1291611600"; d="scan'208";a="89555764" Received: from rtr.ca (HELO [10.0.0.6]) ([75.119.251.23]) by ironport2-out.pppoe.ca with ESMTP/TLS/DHE-RSA-CAMELLIA256-SHA; 28 Jan 2011 09:22:19 -0500 Message-ID: <4D42D11A.5040201@teksavvy.com> Date: Fri, 28 Jan 2011 09:22:18 -0500 From: Mark Lord User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: David Rees CC: Dave Chinner , Stan Hoeppner , Justin Piszcz , Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D41EA04.7010506@teksavvy.com> <20110128001735.GO21311@dastard> <4D421A68.9000607@teksavvy.com> In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ironport2-out.teksavvy.com[206.248.154.183] X-Barracuda-Start-Time: 1296224542 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.53690 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 11-01-27 11:14 PM, David Rees wrote: > > As suggested before - why are you messing with AGs instead of allocsize? Who said "instead of"? I'm using both. Cheers From kernel@teksavvy.com Fri Jan 28 08:30:39 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0SEUdTv160595 for ; Fri, 28 Jan 2011 08:30:39 -0600 X-ASG-Debug-ID: 1296225183-192c00100000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ironport2-out.pppoe.ca (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 73F808E4A19 for ; Fri, 28 Jan 2011 06:33:04 -0800 (PST) Received: from ironport2-out.pppoe.ca (ironport2-out.teksavvy.com [206.248.154.183]) by cuda.sgi.com with ESMTP id DZHDgqHckmR3vXFl for ; Fri, 28 Jan 2011 06:33:04 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApIBAGxiQk1Ld/sX/2dsb2JhbAAMhAjNAZB1gSODOHQEhRg X-IronPort-AV: E=Sophos;i="4.60,392,1291611600"; d="scan'208";a="89557769" Received: from rtr.ca (HELO [10.0.0.6]) ([75.119.251.23]) by ironport2-out.pppoe.ca with ESMTP/TLS/DHE-RSA-CAMELLIA256-SHA; 28 Jan 2011 09:33:03 -0500 Message-ID: <4D42D39E.4080304@teksavvy.com> Date: Fri, 28 Jan 2011 09:33:02 -0500 From: Mark Lord User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Dave Chinner CC: Stan Hoeppner , Justin Piszcz , Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D41EA04.7010506@teksavvy.com> <20110128001735.GO21311@dastard> <4D421A68.9000607@teksavvy.com> <20110128073119.GV21311@dastard> In-Reply-To: <20110128073119.GV21311@dastard> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ironport2-out.teksavvy.com[206.248.154.183] X-Barracuda-Start-Time: 1296225184 X-Barracuda-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.53690 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 11-01-28 02:31 AM, Dave Chinner wrote: > > A simple google search turns up discussions like this: > > http://oss.sgi.com/archives/xfs/2009-01/msg01161.html "in the long term we still expect fragmentation to degrade the performance of XFS file systems" Other than that, no hints there about how changing agcount affects things. > Configuring XFS filesystems for optimal performance has always been > a black art because it requires you to understand your storage, your > application workload(s) and XFS from the ground up. Most people > can't even tick one of those boxes, let alone all three.... Well, I've got 2/3 of those down just fine, thanks. But it's the "XFS" part that is still the "black art" part, because so little is written about *how* it works (as opposed to how it is laid out on disk). Again, that's only a minor complaint -- XFS is way better documented than the alternatives, and also works way better than the others I've tried here on this workload. >>> Why 8 AGs and not the default? >> >> How AGs are used is not really explained anywhere I've looked, >> so I am guessing at what they do and how the system might respond >> to different values there (that documentation thing again). > > Section 5.1 of this 1996 whitepaper tells you what allocation groups > are and the general allocation strategy around them: > > http://oss.sgi.com/projects/xfs/papers/xfs_usenix/index.html Looks a bit dated: "Allocation groups are typically 0.5 to 4 gigabytes in size." But it does suggest that "processes running concurrently can allocate space in the file system concurrently without interfering with each other". Dunno if that's still true today, but it sounds pretty close to what I was theorizing about how it might work. > start to see what I mean about tuning XFS really being a "black art"? No, I've seen that "black" (aka. undefined, undocumented) part from the start. :) Thanks for chipping in here, though -- it's been really useful. Cheers! From aelder@sgi.com Fri Jan 28 08:51:47 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0SEplWo161321 for ; Fri, 28 Jan 2011 08:51:47 -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 84D1A304048; Fri, 28 Jan 2011 06:54: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); Fri, 28 Jan 2011 08:54:10 -0600 Subject: Re: [PATCH 2/8] xfs: fix efi item leak on forced shutdown From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1296100401-17135-3-git-send-email-david@fromorbit.com> References: <1296100401-17135-1-git-send-email-david@fromorbit.com> <1296100401-17135-3-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Fri, 28 Jan 2011 08:54:10 -0600 Message-ID: <1296226450.2342.5.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 28 Jan 2011 14:54:10.0465 (UTC) FILETIME=[38874910:01CBBEFB] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2011-01-27 at 14:53 +1100, Dave Chinner wrote: > From: Dave Chinner > > After test 139, kmemleak shows: > > unreferenced object 0xffff880078b405d8 (size 400): > comm "xfs_io", pid 4904, jiffies 4294909383 (age 1186.728s) > hex dump (first 32 bytes): > 60 c1 17 79 00 88 ff ff 60 c1 17 79 00 88 ff ff `..y....`..y.... > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ > backtrace: > [] kmemleak_alloc+0x2d/0x60 > [] kmem_cache_alloc+0x13f/0x2b0 > [] kmem_zone_alloc+0x77/0xf0 > [] kmem_zone_zalloc+0x1e/0x50 > [] xfs_efi_init+0x4b/0xb0 > [] xfs_trans_get_efi+0x58/0x90 > [] xfs_bmap_finish+0x8b/0x1d0 > [] xfs_itruncate_finish+0x2c4/0x5d0 > [] xfs_setattr+0x8df/0xa70 > [] xfs_vn_setattr+0x1b/0x20 > [] notify_change+0x170/0x2e0 > [] do_truncate+0x66/0xa0 > [] sys_ftruncate+0xdb/0xe0 > [] system_call_fastpath+0x16/0x1b > [] 0xffffffffffffffff > > The cause of the leak is that the "remove" parameter of IOP_UNPIN() > is never set when a CIL push is aborted. This means that the EFI > item is never freed if it was in the push being cancelled. The > problem is specific to delayed logging, but has uncovered a couple > of problems with the handling of IOP_UNPIN(remove). > > Firstly, we cannot safely call xfs_trans_del_item() from IOP_UNPIN() > in the CIL commit failure path or the iclog write failure path > because for delayed loging we have no transaction context. Hence we > must only call xfs_trans_del_item() if the log item being unpinned > has an active log item descriptor. > > Secondly, xfs_trans_uncommit() does not handle log item descriptor > freeing during the traversal of log items on a transaction. It can > reference a freed log item descriptor when unpinning an EFI item. > Hence it needs to use a safe list traversal method to allow items to > be removed from the transaction during IOP_UNPIN(). > > Signed-off-by: Dave Chinner OK, this looks good. Reviewed-by: Alex Elder From jef.fox@kinetx.com Fri Jan 28 09:13:34 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0SFDYW1162072 for ; Fri, 28 Jan 2011 09:13:34 -0600 X-ASG-Debug-ID: 1296227758-140f01240000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail1.ad.kinetx.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 59701299200 for ; Fri, 28 Jan 2011 07:15:58 -0800 (PST) Received: from mail1.ad.kinetx.com (mail1.ad.kinetx.com [74.202.133.147]) by cuda.sgi.com with ESMTP id GR9XsmfElzmeHi0H for ; Fri, 28 Jan 2011 07:15:58 -0800 (PST) X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: quoted-printable X-ASG-Orig-Subj: RE: XFS Preallocation Subject: RE: XFS Preallocation Date: Fri, 28 Jan 2011 08:15:56 -0700 Message-ID: <155CAEA5D902E7429569DD197567724A01534D44@mail1.ad.kinetx.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: XFS Preallocation Thread-Index: Acu+pysludNFV+ZTSrKZi8mbuuVqeAAVe3vQ References: <155CAEA5D902E7429569DD197567724A01534D42@mail1.ad.kinetx.com> <20110128045205.GR21311@dastard> From: "Jef Fox" To: "Dave Chinner" Cc: X-Barracuda-Connect: mail1.ad.kinetx.com[74.202.133.147] X-Barracuda-Start-Time: 1296227759 X-Barracuda-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.53692 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 =20 > On Thu, Jan 27, 2011 at 07:05:33PM -0700, Jef Fox wrote: > > We are having some problems with preallocation of large files. We have > > found that we can preallocate about 500 1GB files on a volume using the > > resvsp and truncate commands, but the extents are still showing up as > > preallocated. Is this a problem? The OS appears to think the files are > > allocated and correctly sized. >=20 > That's the way it's supposed to work. Preallocated space stays > preallocated (i.e reads as zeros) until it is written to, regardless > of whether you change the file size via truncate commands. I guess my main question is whether we (or the OS) care if the space still shows "preallocated". If we write to the files/drive/data blocks outside of RHEL (and the filesystem), does XFS care that the extents still show preallocated if we never write to them again - but only read from them? =20 =20 > > For reference, we are trying to create files for an external piece of > > equipment to write to a SSD with. The SSD would then be mounted in RHEL > > and the data pulled off in the 1G chunks. Because of the nature of the > > data, we need to constantly erase and recreate the files and > > preallocation seems to be the fastest option. >=20 > What do you mean by "erase and recreate"? Do you mean you rm the > files, then preallocate them again? We were planning to TRIM/RESET out the SSD (partial or whole) and lay down the filesystem again. > If you were running 2.6.37+ and a TOT xfsprogs, there's also the > "zero" command that converts allocated space back to the > preallocated (zeroed) state without doing any IO. It's the > equivalent unresvsp + resvsp in a single operation. >=20 > > We don't really care if > > the data gets 0'ed out. Is there another method - allocsp takes too > > long for this application? >=20 > allocsp is historical interface, pretty much useless and should > probably be removed. I can't think of any situation where allocsp > would be better than resvsp or zero.... >=20 > > Or, does it matter if XFS thinks the extents > > are preallocated but unwritten if no other files are written to the > > disk? So, we setup the SSDs using preallocation for speed and truncate the files so that the OS thinks the files are of a set size. We pull the drives from the system, and put them in an external device that writes to our given block offsets (staying within the files and blocks we have preallocated and defined). We then put the device back into our system to read the data back off via NFS/FTP/etc. Will it matter that XFS will still show unwritten but preallocated extents when the files actually have data? XFS/RHEL/etc will not know that the files were ever written to, but using truncate appears to give us the necessary "trick" (for lack of a better term) to get RH to think that the files are a certain size and can be read from. If we aren't adding files or reallocating data on those drives, will it matter that everything shows preallocated and not written? =20 > I'm not sure what you are asking there... >=20 > Cheers, >=20 > Dave. > -- > Dave Chinner > david@fromorbit.com From aelder@sgi.com Fri Jan 28 10:17:29 2011 X-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 p0SGHTuY164064 for ; Fri, 28 Jan 2011 10:17:29 -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 9E50A304087; Fri, 28 Jan 2011 08:19:52 -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); Fri, 28 Jan 2011 10:19:52 -0600 Subject: Re: [PATCH 3/6] xfs: do not immediately reuse busy extent ranges From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com In-Reply-To: <20110128015835.GQ21311@dastard> References: <20110121092227.115815324@bombadil.infradead.org> <20110121092550.933551564@bombadil.infradead.org> <20110128015835.GQ21311@dastard> Content-Type: text/plain; charset="UTF-8" Date: Fri, 28 Jan 2011 10:19:51 -0600 Message-ID: <1296231591.2342.47.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 28 Jan 2011 16:19:52.0359 (UTC) FILETIME=[31560B70:01CBBF07] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 2011-01-28 at 12:58 +1100, Dave Chinner wrote: > On Fri, Jan 21, 2011 at 04:22:30AM -0500, Christoph Hellwig wrote: > > Every time we reallocate a busy extent, we cause a synchronous log force > > to occur to ensure the freeing transaction is on disk before we continue . . . > > + > > + spin_lock(&pag->pagb_lock); > > + rbp = pag->pagb_tree.rb_node; > > + while (rbp) { I will amend the loop termination condition I suggested before to be this: while (rbp && len >= args->minlen) { > > + struct xfs_busy_extent *busyp = > > + rb_entry(rbp, struct xfs_busy_extent, rb_node); > > + xfs_agblock_t end = bno + len; > > + xfs_agblock_t bend = busyp->bno + busyp->length; > > + > > + if (bno + len <= busyp->bno) { > > + rbp = rbp->rb_left; > > + continue; > > + } else if (bno >= busyp->bno + busyp->length) { > > + rbp = rbp->rb_right; > > + continue; > > + } > > if (end <= bbno) > left; > else if (bno > bend) > right; I think the original code is right in this case. The value of "bend" is the offset *following* the end of the range. So if "bno" equals that, we want to move Right. (Same reason <= is correct for the first condition here.) > /* overlap */ > > > + > > + if (busyp->bno < bno) { > > + /* start overlap */ > > + ASSERT(bend >= bno); > > + ASSERT(bend <= end); > > + len -= bno - bend; > > + bno = bend; > > if (bbno < bno) { > > bbno bend > +-----------------+ > Case 1: > +---------+ > bno end > > No unbusy region in extent, return failure Yes, that's right, I missed that. My suggestion goes negative in this case. > Case 2: > +------------------------+ > bno end > > Needs to be trimmed to: > +-------+ > bno end > bno = bend; > len = end - bno; I like defining len in terms of the updated bno as you have suggested here. > > + } else if (bend > end) { > > + /* end overlap */ > > + ASSERT(busyp->bno >= bno); > > + ASSERT(busyp->bno < end); > > + len -= bend - end; > . . . > So, it looks to me like the "overlap found" algorithm shoul dbe > something like: For this algorithm, updating the value of len can be done once, at the bottom (or top) of the loop, based simply on the (updated) value of end and bno: len = end - bno; You could rearrange things a bit so this gets done at the top--instead of computing the value of end based on bno and len. > if (bbno <= bno) { > if (end <= bend) { > /* case 1, 3, 5 */ > return failure; > } > /* case 2, 6 */ > bno = bend; > len = end - bno; > } else if (bend >= end) { > ASSERT(bbno > bno); > /* case 4, 7 */ > end = bbno; > len = end - bno; > } else { > ASSERT(bbno > bno); > ASSERT(bend < end); > /* case 8 */ > if (bbno - bno >= args->minlen) { > /* left candidate OK */ > left = 1; > } > if (end - bend >= args->maxlen * 4) { The "4" here I understand, but it's arbitrary (based on an educated guess) so it needs to at least be explained here with a comment. Making it symbolic might make it something one could search for at some future date. > /* right candidate OK */ > right = 1; > } > if (left && right) { > /* take right if left is not a > * maximal allocation */ > if (bbno - bno < args->maxlen) > left = 0; > } > if (left) { > end = bbno; > len = end - bno; > } else if (right) { > bno = bend; > len = end - bno; > } else { > return failure; > } > } > > > @@ -109,19 +109,16 @@ xfs_trim_extents( > > * 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; > > - } > > + xfs_alloc_busy_search_trim(mp, pag, fbno, flen, &tbno, &tlen); > > > > - trace_xfs_discard_extent(mp, agno, fbno, flen); > > + trace_xfs_discard_extent(mp, agno, tbno, tlen); > > error = -blkdev_issue_discard(bdev, > > - XFS_AGB_TO_DADDR(mp, agno, fbno), > > - XFS_FSB_TO_BB(mp, flen), > > + XFS_AGB_TO_DADDR(mp, agno, tbno), > > + XFS_FSB_TO_BB(mp, tlen), > > GFP_NOFS, 0); > > if (error) > > goto out_del_cursor; > > - *blocks_trimmed += flen; > > + *blocks_trimmed += tlen; > > Hmmm - that means if we get a case 8 overlap, we'll only trim one > side of the extent. That's probably not a big deal. However, perhaps > this should check the size of the trimmed extent before issuing the > discard against it in case we've reduced it to something smaller > thanthe minimum requested trim size.... I think all of the places that (ultimately) call this function need to be looked at to make sure they handle the "error" case properly--either checking for a returned error or verifying the returned length is at least the minimum. -Alex From jakub@bogusz.priv.pl Fri Jan 28 10:38:57 2011 X-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_22 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 p0SGcu93164779 for ; Fri, 28 Jan 2011 10:38:57 -0600 X-ASG-Debug-ID: 1296232871-16ee038e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.qboosh.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 203512985DD for ; Fri, 28 Jan 2011 08:41:14 -0800 (PST) Received: from mail.qboosh.pl (mail.qboosh.pl [217.73.31.61]) by cuda.sgi.com with ESMTP id mrlcCsLkow93nrmM for ; Fri, 28 Jan 2011 08:41:14 -0800 (PST) Received: from stranger.qboosh.pl (87-205-242-198.adsl.inetia.pl [87.205.242.198]) by mail.qboosh.pl (Postfix) with ESMTPSA id 534BFCF9E3 for ; Fri, 28 Jan 2011 17:41:21 +0100 (CET) Received: from stranger.qboosh.pl (localhost [127.0.0.1]) by stranger.qboosh.pl (8.14.3/8.14.3) with ESMTP id p0SGekfp031977 for ; Fri, 28 Jan 2011 17:40:46 +0100 Received: (from qboosh@localhost) by stranger.qboosh.pl (8.14.3/8.14.3/Submit) id p0SGejC6031974 for xfs@oss.sgi.com; Fri, 28 Jan 2011 17:40:45 +0100 Date: Fri, 28 Jan 2011 17:40:45 +0100 From: Jakub Bogusz To: xfs@oss.sgi.com X-ASG-Orig-Subj: xfsprogs: Polish translation update Subject: xfsprogs: Polish translation update Message-ID: <20110128164045.GC10335@stranger.qboosh.pl> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) X-Barracuda-Connect: mail.qboosh.pl[217.73.31.61] X-Barracuda-Start-Time: 1296232875 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1313 1.0000 -1.2080 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.21 X-Barracuda-Spam-Status: No, SCORE=-1.21 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.53698 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, I've just updated pl.po file for xfsprogs 3.1.4. It's available at http://qboosh.pl/pl.po/xfsprogs-3.1.4.pl.po Alternatively, patch against 3.1.4 sources is available at http://cvs.pld-linux.org/cgi-bin/cvsweb/packages/xfsprogs/xfsprogs-pl.po-update.patch?rev=1.12 Please apply. -- Jakub Bogusz http://qboosh.pl/ From jef.fox@kinetx.com Fri Jan 28 11:30:41 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0SHUeoE166580 for ; Fri, 28 Jan 2011 11:30:40 -0600 X-ASG-Debug-ID: 1296235984-2790027e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail1.ad.kinetx.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 677E9154D427 for ; Fri, 28 Jan 2011 09:33:04 -0800 (PST) Received: from mail1.ad.kinetx.com (mail1.ad.kinetx.com [74.202.133.147]) by cuda.sgi.com with ESMTP id wqc3WTwUWcNZAK2o for ; Fri, 28 Jan 2011 09:33:04 -0800 (PST) X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: quoted-printable X-ASG-Orig-Subj: RE: XFS Preallocation Subject: RE: XFS Preallocation Date: Fri, 28 Jan 2011 10:33:03 -0700 Message-ID: <155CAEA5D902E7429569DD197567724A01534D60@mail1.ad.kinetx.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: XFS Preallocation Thread-Index: Acu+pysludNFV+ZTSrKZi8mbuuVqeAAadf3Q References: <155CAEA5D902E7429569DD197567724A01534D42@mail1.ad.kinetx.com> <20110128045205.GR21311@dastard> From: "Jef Fox" To: "Dave Chinner" Cc: X-Barracuda-Connect: mail1.ad.kinetx.com[74.202.133.147] X-Barracuda-Start-Time: 1296235985 X-Barracuda-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.53701 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 I guess, disregard my previous message. After some further testing of examining the hard disk blocks, we see what you are saying - the file is presented at 0s to the user even if the blocks are changed on the hard disk. So, we will always see 0s until we write to the extent. So, I think our only question now is if there is a way to force the extents to be marked as allocated without writing all of the data? That is, is there a fast way to lay down a file(s) of 1G size without actually writing 1G of info. > -----Original Message----- > From: Dave Chinner [mailto:david@fromorbit.com] > Sent: Thursday, January 27, 2011 9:52 PM > To: Jef Fox > Cc: xfs@oss.sgi.com > Subject: Re: XFS Preallocation >=20 > On Thu, Jan 27, 2011 at 07:05:33PM -0700, Jef Fox wrote: > > We are having some problems with preallocation of large files. We have > > found that we can preallocate about 500 1GB files on a volume using the > > resvsp and truncate commands, but the extents are still showing up as > > preallocated. Is this a problem? The OS appears to think the files are > > allocated and correctly sized. >=20 > That's the way it's supposed to work. Preallocated space stays > preallocated (i.e reads as zeros) until it is written to, regardless > of whether you change the file size via truncate commands. >=20 > > For reference, we are trying to create files for an external piece of > > equipment to write to a SSD with. The SSD would then be mounted in RHEL > > and the data pulled off in the 1G chunks. Because of the nature of the > > data, we need to constantly erase and recreate the files and > > preallocation seems to be the fastest option. >=20 > What do you mean by "erase and recreate"? Do you mean you rm the > files, then preallocate them again? >=20 > If you were running 2.6.37+ and a TOT xfsprogs, there's also the > "zero" command that converts allocated space back to the > preallocated (zeroed) state without doing any IO. It's the > equivalent unresvsp + resvsp in a single operation. >=20 > > We don't really care if > > the data gets 0'ed out. Is there another method - allocsp takes too > > long for this application? >=20 > allocsp is historical interface, pretty much useless and should > probably be removed. I can't think of any situation where allocsp > would be better than resvsp or zero.... >=20 > > Or, does it matter if XFS thinks the extents > > are preallocated but unwritten if no other files are written to the > > disk? >=20 > I'm not sure what you are asking there... >=20 > Cheers, >=20 > Dave. > -- > Dave Chinner > david@fromorbit.com From rwheeler@redhat.com Fri Jan 28 12:11:14 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0SIBEHi167834 for ; Fri, 28 Jan 2011 12:11:14 -0600 X-ASG-Debug-ID: 1296238419-053d02b20000-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 6906F4D85B7 for ; Fri, 28 Jan 2011 10:13:39 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Tpn0xV4AOwqIhXXa for ; Fri, 28 Jan 2011 10:13:39 -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 p0SIDNOj010695 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 28 Jan 2011 13:13:23 -0500 Received: from ricdesktop.usersys.redhat.com (dhcp-100-19-94.bos.redhat.com [10.16.19.94]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p0SIDG7P004904; Fri, 28 Jan 2011 13:13:16 -0500 Message-ID: <4D43073C.1040100@redhat.com> Date: Fri, 28 Jan 2011 13:13:16 -0500 From: Ric Wheeler User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101209 Fedora/3.1.7-0.35.b3pre.fc13 Thunderbird/3.1.7 MIME-Version: 1.0 To: Dave Chinner CC: Lawrence Greenfield , "Ted Ts'o" , Josef Bacik , linux-kernel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, joel.becker@oracle.com, cmm@us.ibm.com, cluster-devel@redhat.com X-ASG-Orig-Subj: Re: [PATCH 1/6] fs: add hole punching to fallocate Subject: Re: [PATCH 1/6] fs: add hole punching to fallocate References: <1289248327-16308-1-git-send-email-josef@redhat.com> <20101109011222.GD2715@dastard> <20101109033038.GF3099@thunk.org> <20101109044242.GH2715@dastard> <20101109214147.GK3099@thunk.org> <20101109234049.GQ2715@dastard> <20110112124431.GP28803@dastard> In-Reply-To: <20110112124431.GP28803@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed 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: 1296238420 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 01/12/2011 07:44 AM, Dave Chinner wrote: > On Tue, Jan 11, 2011 at 04:13:42PM -0500, Lawrence Greenfield wrote: >> On Tue, Nov 9, 2010 at 6:40 PM, Dave Chinner wrote: >>> The historical reason for such behaviour existing in XFS was that in >>> 1997 the CPU and IO latency cost of unwritten extent conversion was >>> significant, > ..... > >>>> (Take for example a trusted cluster filesystem backend that checks the >>>> object checksum before returning any data to the user; and if the >>>> check fails the cluster file system will try to use some other replica >>>> stored on some other server.) >>> IOWs, all they want to do is avoid the unwritten extent conversion >>> overhead. Time has shown that a bad security/performance tradeoff >>> decision was made 13 years ago in XFS, so I see little reason to >>> repeat it for ext4 today.... >> I'd make use of FALLOC_FL_EXPOSE_OLD_DATA. It's not the CPU overhead >> of extent conversion. It's that extent conversion causes more metadata >> operations than what you'd have otherwise, > Yes, that's the "IO latency" part of the cost I mentioned above. > >> which means systems that >> want to use O_DIRECT and make sure the data doesn't go away either >> have to write O_DIRECT|O_DSYNC or need to call fdatasync(). > Seriously, we tell application writers _all the time_ that they > *must* use fsync/fdatasync to guarantee their data is on stable > storage and that they cannot rely on side-effects of filesystem or > storage specific behaviours (like ext3 ordered mode) to do that job > for them. > > You're suggesting that by introducing FALLOC_FL_EXPOSE_OLD_DATA, > applications can rely on filesystem/storage specific behaviour to > guarantee data is on stable storage without the use of > fdatasync/fsync. Wht you describe is definitely storage specific, > because volatile write caches still needs the fdatasync to issue a > cache flush. > > Do you see the same conflict here that I do? > The very concept seems quite "non-enterprise". I also agree that the cost of maintaining extra mount options (and code) for something that no sane end user would ever do seems to be a loss. Why wouldn't you want to convert the punched hole to an unwritten extent? Thanks! Ric From Martin@lichtvoll.de Fri Jan 28 13:16:04 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0SJG3sX169737 for ; Fri, 28 Jan 2011 13:16:04 -0600 X-ASG-Debug-ID: 1296242307-46df024b0000-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 C81894D8ADA for ; Fri, 28 Jan 2011 11:18:27 -0800 (PST) Received: from mail.lichtvoll.de (mondschein.lichtvoll.de [194.150.191.11]) by cuda.sgi.com with ESMTP id 91Z1WOyDLpWcHCcA for ; Fri, 28 Jan 2011 11:18:27 -0800 (PST) Received: from shambhala.localnet (ppp-88-217-121-143.dynamic.mnet-online.de [88.217.121.143]) by mail.lichtvoll.de (Postfix) with ESMTPSA id 934D2101; Fri, 28 Jan 2011 20:18:26 +0100 (CET) From: Martin Steigerwald To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount Date: Fri, 28 Jan 2011 20:18:11 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.37-tp42-rtime-00004-g9eb63ce; KDE/4.5.3; i686; ; ) Cc: Stan Hoeppner , Mark Lord , Christoph Hellwig , Linux Kernel , Justin Piszcz , Alex Elder References: <4D40C8D1.8090202@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> (sfid-20110127_220503_352851_8BD9DFC6) In-Reply-To: <4D41CA16.8070001@hardwarefreak.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart3926807.QEyy5ibxh2"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201101282018.12247.Martin@lichtvoll.de> X-Barracuda-Connect: mondschein.lichtvoll.de[194.150.191.11] X-Barracuda-Start-Time: 1296242308 X-Barracuda-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.53708 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 --nextPart3926807.QEyy5ibxh2 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Am Thursday 27 January 2011 schrieb Stan Hoeppner: > Trust the defaults. If they give you problems (unlikely) then we can't > talk. ;) With one addition: Use a recent xfsprogs! ;) Earlier ones created more AGs, didn't activate lazy super block counter=20 (likely no issue here) and whatnot... =2D-=20 Martin 'Helios' Steigerwald - http://www.Lichtvoll.de GPG: 03B0 0D6C 0040 0710 4AFA B82F 991B EAAC A599 84C7 --nextPart3926807.QEyy5ibxh2 Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iEYEABECAAYFAk1DFnQACgkQmRvqrKWZhMc2qwCgrnlXK8kUFcYrtLFEyX6XzsW3 tU0AoKhzXci4d/RObXp7lZnjWofQXv7y =FYnv -----END PGP SIGNATURE----- --nextPart3926807.QEyy5ibxh2-- From david@lang.hm Fri Jan 28 13:24:49 2011 X-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 p0SJOnJp170046 for ; Fri, 28 Jan 2011 13:24:49 -0600 X-ASG-Debug-ID: 1296242833-06c301690000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bifrost.lang.hm (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1B9FD1A46C96; Fri, 28 Jan 2011 11:27:13 -0800 (PST) Received: from bifrost.lang.hm (mail.lang.hm [64.81.33.126]) by cuda.sgi.com with ESMTP id wwmYS3Qf8F1xn8CM; Fri, 28 Jan 2011 11:27:13 -0800 (PST) Received: from asgard.lang.hm (asgard.lang.hm [10.0.0.100]) by bifrost.lang.hm (8.13.4/8.13.4/Debian-3) with ESMTP id p0SJQ0da008261; Fri, 28 Jan 2011 11:26:02 -0800 Date: Fri, 28 Jan 2011 11:26:00 -0800 (PST) From: david@lang.hm X-X-Sender: dlang@asgard.lang.hm To: Dave Chinner cc: Stan Hoeppner , Linux Kernel , xfs@oss.sgi.com, Christoph Hellwig , Justin Piszcz , Alex Elder , Mark Lord X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount In-Reply-To: <20110128135629.GX21311@dastard> Message-ID: References: <4D40C8D1.8090202@teksavvy.com> <20110127033011.GH21311@dastard> <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D42056E.2050505@hardwarefreak.com> <20110128135629.GX21311@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: mail.lang.hm[64.81.33.126] X-Barracuda-Start-Time: 1296242834 X-Barracuda-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.53710 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 On Sat, 29 Jan 2011, Dave Chinner wrote: > On Thu, Jan 27, 2011 at 06:09:58PM -0800, david@lang.hm wrote: >> On Thu, 27 Jan 2011, Stan Hoeppner wrote: >>> david@lang.hm put forth on 1/27/2011 2:11 PM: >>> >>> Picking the perfect mkfs.xfs parameters for a hardware RAID array can be >>> somewhat of a black art, mainly because no two vendor arrays act or perform >>> identically. >> >> if mkfs.xfs can figure out how to do the 'right thing' for md raid >> arrays, can there be a mode where it asks the users for the same >> information that it gets from the kernel? > > mkfs.xfs can get the information it needs directly from dm and md > devices. However, when hardware RAID luns present themselves to the > OS in an identical manner to single drives, how does mkfs tell the > difference between a 2TB hardware RAID lun made up of 30x73GB drives > and a single 2TB SATA drive? The person running mkfs should already > know this little detail.... that's my point, the person running mkfs knows this information, and can easily answer questions that mkfs asks (or provide this information on the command line). but mkfs doesn't ask for this infomation, instead it asks the user to define a whole bunch of parameters that are not well understood. An XFS guru can tell you how to configure these parameters based on different hardware layouts, but as long as it remains a 'back art' getting new people up to speed is really hard. If this can be reduced down to is this a hardware raid device if yes how many drives are there what raid type is used (linear, raid 0, 1, 5, 6, 10) and whatever questions are needed, it would _greatly_ improve the quality of the settings that non-guru people end up using. David Lang From aelder@oss.sgi.com Fri Jan 28 16:09:11 2011 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 p0SM9Aux175638 for ; Fri, 28 Jan 2011 16:09:10 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id p0SM92iM175570; Fri, 28 Jan 2011 16:09:02 -0600 Date: Fri, 28 Jan 2011 16:09:02 -0600 Message-Id: <201101282209.p0SM92iM175570@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-9178-g24446fc X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: c56eb8fb6dccb83d9fe62fd4dc00c834de9bc470 X-Git-Newrev: 24446fc66fdebbdd8baca0f44fd2a47ad77ba580 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 24446fc xfs: xfs_bmap_add_extent_delay_real should init br_startblock 0fbca4d xfs: fix dquot shaker deadlock c6f990d xfs: handle CIl transaction commit failures correctly 5315837 xfs: limit extsize to size of AGs and/or MAXEXTLEN 4ce1598 xfs: prevent extsize alignment from exceeding maximum extent size 14b064c xfs: limit extent length for allocation to AG size b8fc826 xfs: speculative delayed allocation uses rounddown_power_of_2 badly e34a314 xfs: fix efi item leak on forced shutdown 7db37c5 xfs: fix log ticket leak on forced shutdown. from c56eb8fb6dccb83d9fe62fd4dc00c834de9bc470 (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 24446fc66fdebbdd8baca0f44fd2a47ad77ba580 Author: bpm@sgi.com Date: Wed Jan 19 17:41:58 2011 +0000 xfs: xfs_bmap_add_extent_delay_real should init br_startblock When filling in the middle of a previous delayed allocation in xfs_bmap_add_extent_delay_real, set br_startblock of the new delay extent to the right to nullstartblock instead of 0 before inserting the extent into the ifork (xfs_iext_insert), rather than setting br_startblock afterward. Adding the extent into the ifork with br_startblock=0 can lead to the extent being copied into the btree by xfs_bmap_extent_to_btree if we happen to convert from extents format to btree format before updating br_startblock with the correct value. The unexpected addition of this delay extent to the btree can cause subsequent XFS_WANT_CORRUPTED_GOTO filesystem shutdown in several xfs_bmap_add_extent_delay_real cases where we are converting a delay extent to real and unexpectedly find an extent already inserted. For example: 911 case BMAP_LEFT_FILLING: 912 /* 913 * Filling in the first part of a previous delayed allocation. 914 * The left neighbor is not contiguous. 915 */ 916 trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); 917 xfs_bmbt_set_startoff(ep, new_endoff); 918 temp = PREV.br_blockcount - new->br_blockcount; 919 xfs_bmbt_set_blockcount(ep, temp); 920 xfs_iext_insert(ip, idx, 1, new, state); 921 ip->i_df.if_lastex = idx; 922 ip->i_d.di_nextents++; 923 if (cur == NULL) 924 rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; 925 else { 926 rval = XFS_ILOG_CORE; 927 if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, 928 new->br_startblock, new->br_blockcount, 929 &i))) 930 goto done; 931 XFS_WANT_CORRUPTED_GOTO(i == 0, done); With the bogus extent in the btree we shutdown the filesystem at 931. The conversion from extents to btree format happens when the number of extents in the inode increases above ip->i_df.if_ext_max. xfs_bmap_extent_to_btree copies extents from the ifork into the btree, ignoring all delalloc extents which are denoted by br_startblock having some value of nullstartblock. SGI-PV: 1013221 Signed-off-by: Ben Myers Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit 0fbca4d1c3932c27c4794bf5c2b5fc961cf5a54f Author: Dave Chinner Date: Fri Jan 28 11:20:46 2011 +1100 xfs: fix dquot shaker deadlock Commit 368e136 ("xfs: remove duplicate code from dquot reclaim") fails to unlock the dquot freelist when the number of loop restarts is exceeded in xfs_qm_dqreclaim_one(). This causes hangs in memory reclaim. Rework the loop control logic into an unwind stack that all the different cases jump into. This means there is only one set of code that processes the loop exit criteria, and simplifies the unlocking of all the items from different points in the loop. It also fixes a double increment of the restart counter from the qi_dqlist_lock case. Reported-by: Malcolm Scott Signed-off-by: Dave Chinner Reviewed-by: Alex Elder commit c6f990d1ff8e4e53b12f4175eb7d7ea710c3ca73 Author: Dave Chinner Date: Thu Jan 27 13:23:28 2011 +1100 xfs: handle CIl transaction commit failures correctly Failure to commit a transaction into the CIL is not handled correctly. This currently can only happen when racing with a shutdown and requires an explicit shutdown check, so it rare and can be avoided. Remove the shutdown check and make the CIL commit a void function to indicate it will always succeed, thereby removing the incorrectly handled failure case. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder commit 5315837daee7ed76c31ef643915f7d76ef8c1aa3 Author: Dave Chinner Date: Thu Jan 27 12:18:18 2011 +1100 xfs: limit extsize to size of AGs and/or MAXEXTLEN The extent size hint can be set to larger than an AG. This means that the alignment process can push the range to be allocated outside the bounds of the AG, resulting in assert failures or corrupted bmbt records. Similarly, if the extsize is larger than the maximum extent size supported, the alignment process will produce extents that are too large to fit into the bmbt records, resulting in a different type of assert/corruption failure. Fix this by limiting extsize at the time Ñ–t is set firstly to be less than MAXEXTLEN, then to be a maximum of half the size of the AGs in the filesystem for non-realtime inodes. Realtime inodes do not allocate out of AGs, so don't have to be restricted by the size of AGs. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder commit 4ce159890c00e2cc705e955a939bf1dca7b07ab8 Author: Dave Chinner Date: Thu Jan 27 12:17:58 2011 +1100 xfs: prevent extsize alignment from exceeding maximum extent size When doing delayed allocation, if the allocation size is for a maximally sized extent, extent size alignment can push it over this limit. This results in an assert failure in xfs_bmbt_set_allf() as the extent length is too large to find in the extent record. Fix this by ensuring that we allow for space that extent size alignment requires (up to 2 * (extsize -1) blocks as we have to handle both head and tail alignment) when limiting the maximum size of the extent. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder commit 14b064ceaa6f51a7426cc45b4b43685b94380658 Author: Dave Chinner Date: Thu Jan 27 12:16:28 2011 +1100 xfs: limit extent length for allocation to AG size Delayed allocation extents can be larger than AGs, so when trying to convert a large range we may scan every AG inside xfs_bmap_alloc_nullfb() trying to find an AG with a size larger than an AG. We should stop when we find the first AG with a maximum possible allocation size. This causes excessive CPU usage when there are lots of AGs. The same problem occurs when doing preallocation of a range larger than an AG. Fix the problem by limiting real allocation lengths to the maximum that an AG can support. This means if we have empty AGs, we'll stop the search at the first of them. If there are no empty AGs, we'll still scan them all, but that is a different problem.... Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder commit b8fc82630ae289bb4e661567808afc59e3298dce Author: Dave Chinner Date: Thu Jan 27 12:14:12 2011 +1100 xfs: speculative delayed allocation uses rounddown_power_of_2 badly rounddown_power_of_2() returns an undefined result when passed a value of zero. The specualtive delayed allocation code is doing this when the inode is zero length. Hence occasionally the preallocation is much, much larger than is necessary (e.g. 8GB for a 270 _byte_ file). Ensure we don't even pass a zero value to this function so the result of preallocation is always the desired size. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder commit e34a314c5e49fe6b763568f6576b19f1299c33c2 Author: Dave Chinner Date: Thu Jan 27 12:13:35 2011 +1100 xfs: fix efi item leak on forced shutdown After test 139, kmemleak shows: unreferenced object 0xffff880078b405d8 (size 400): comm "xfs_io", pid 4904, jiffies 4294909383 (age 1186.728s) hex dump (first 32 bytes): 60 c1 17 79 00 88 ff ff 60 c1 17 79 00 88 ff ff `..y....`..y.... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ backtrace: [] kmemleak_alloc+0x2d/0x60 [] kmem_cache_alloc+0x13f/0x2b0 [] kmem_zone_alloc+0x77/0xf0 [] kmem_zone_zalloc+0x1e/0x50 [] xfs_efi_init+0x4b/0xb0 [] xfs_trans_get_efi+0x58/0x90 [] xfs_bmap_finish+0x8b/0x1d0 [] xfs_itruncate_finish+0x2c4/0x5d0 [] xfs_setattr+0x8df/0xa70 [] xfs_vn_setattr+0x1b/0x20 [] notify_change+0x170/0x2e0 [] do_truncate+0x66/0xa0 [] sys_ftruncate+0xdb/0xe0 [] system_call_fastpath+0x16/0x1b [] 0xffffffffffffffff The cause of the leak is that the "remove" parameter of IOP_UNPIN() is never set when a CIL push is aborted. This means that the EFI item is never freed if it was in the push being cancelled. The problem is specific to delayed logging, but has uncovered a couple of problems with the handling of IOP_UNPIN(remove). Firstly, we cannot safely call xfs_trans_del_item() from IOP_UNPIN() in the CIL commit failure path or the iclog write failure path because for delayed loging we have no transaction context. Hence we must only call xfs_trans_del_item() if the log item being unpinned has an active log item descriptor. Secondly, xfs_trans_uncommit() does not handle log item descriptor freeing during the traversal of log items on a transaction. It can reference a freed log item descriptor when unpinning an EFI item. Hence it needs to use a safe list traversal method to allow items to be removed from the transaction during IOP_UNPIN(). Signed-off-by: Dave Chinner Reviewed-by: Alex Elder commit 7db37c5e6575b229a5051be1d3ef15257ae0ba5d Author: Dave Chinner Date: Thu Jan 27 12:02:00 2011 +1100 xfs: fix log ticket leak on forced shutdown. The kmemleak detector shows this after test 139: unreferenced object 0xffff880079b88bb0 (size 264): comm "xfs_io", pid 4904, jiffies 4294909382 (age 276.824s) hex dump (first 32 bytes): 00 00 00 00 ad 4e ad de ff ff ff ff 00 00 00 00 .....N.......... ff ff ff ff ff ff ff ff 48 7b c9 82 ff ff ff ff ........H{...... backtrace: [] kmemleak_alloc+0x2d/0x60 [] kmem_cache_alloc+0x13f/0x2b0 [] kmem_zone_alloc+0x77/0xf0 [] kmem_zone_zalloc+0x1e/0x50 [] xlog_ticket_alloc+0x34/0x170 [] xlog_cil_push+0xa4/0x3f0 [] xlog_cil_force_lsn+0x15a/0x160 [] _xfs_log_force_lsn+0x75/0x2d0 [] _xfs_trans_commit+0x2bd/0x2f0 [] xfs_iomap_write_allocate+0x1ad/0x350 [] xfs_map_blocks+0x21f/0x370 [] xfs_vm_writepage+0x1c7/0x550 [] __writepage+0x1a/0x50 [] write_cache_pages+0x1c2/0x4c0 [] generic_writepages+0x27/0x30 [] xfs_vm_writepages+0x5d/0x80 By inspection, the leak occurs when xlog_write() returns and error and we jump to the abort path without dropping the reference on the active ticket. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_ioctl.c | 20 ++++++++++++- fs/xfs/quota/xfs_qm.c | 46 ++++++++++++++----------------- fs/xfs/xfs_alloc.h | 16 +++++++++++ fs/xfs/xfs_bmap.c | 61 +++++++++++++++++++++++++++++++----------- fs/xfs/xfs_buf_item.c | 12 +++++--- fs/xfs/xfs_extfree_item.c | 3 +- fs/xfs/xfs_iomap.c | 7 ++++- fs/xfs/xfs_log.h | 2 +- fs/xfs/xfs_log_cil.c | 15 ++++------ fs/xfs/xfs_trans.c | 41 ++++++++++++++++++++------- 10 files changed, 152 insertions(+), 71 deletions(-) hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Fri Jan 28 16:09:23 2011 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 p0SM9NCe175878 for ; Fri, 28 Jan 2011 16:09:23 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id p0SM9J5D175713; Fri, 28 Jan 2011 16:09:19 -0600 Date: Fri, 28 Jan 2011 16:09:19 -0600 Message-Id: <201101282209.p0SM9J5D175713@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-9178-g24446fc X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: 73efe4a4ddf8eb2b1cc7039e8a66a23a424961af X-Git-Newrev: 24446fc66fdebbdd8baca0f44fd2a47ad77ba580 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 24446fc xfs: xfs_bmap_add_extent_delay_real should init br_startblock 0fbca4d xfs: fix dquot shaker deadlock c6f990d xfs: handle CIl transaction commit failures correctly 5315837 xfs: limit extsize to size of AGs and/or MAXEXTLEN 4ce1598 xfs: prevent extsize alignment from exceeding maximum extent size 14b064c xfs: limit extent length for allocation to AG size b8fc826 xfs: speculative delayed allocation uses rounddown_power_of_2 badly e34a314 xfs: fix efi item leak on forced shutdown 7db37c5 xfs: fix log ticket leak on forced shutdown. cf78859 xfs: Do not name variables "panic" 2fe17c1 fallocate should be a file operation 64c23e8 make the feature checks in ->fallocate future proof 7cb3920 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs 275220f Merge branch 'for-2.6.38/core' of git://git.kernel.dk/linux-2.6-block b2034d4 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 008d23e Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial c25d246 XFS: handle hole punching via fallocate properly 92f1c00 Merge branch 'master' into for-linus-merged 23d69b0 Merge branch 'for-2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq 880566e xfs: provide simple rcu-walk ACL implementation b74c79e fs: provide rcu-walk aware permission i_ops fa0d7e3 fs: icache RCU free inodes 4b7bd36 Merge branch 'master' into for-next afe2c51 workqueue: convert cancel_rearming_delayed_work[queue]() users to cancel_delayed_work_sync() f30195c Merge branch 'cleanup-bd_claim' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc into for-2.6.38/core d4d7762 block: clean up blkdev_get() wrappers and their users e525fd8 block: make blkdev_get/put() handle exclusive access b595076 tree-wide: fix comment/printk typos from 73efe4a4ddf8eb2b1cc7039e8a66a23a424961af (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 24446fc66fdebbdd8baca0f44fd2a47ad77ba580 Author: bpm@sgi.com Date: Wed Jan 19 17:41:58 2011 +0000 xfs: xfs_bmap_add_extent_delay_real should init br_startblock When filling in the middle of a previous delayed allocation in xfs_bmap_add_extent_delay_real, set br_startblock of the new delay extent to the right to nullstartblock instead of 0 before inserting the extent into the ifork (xfs_iext_insert), rather than setting br_startblock afterward. Adding the extent into the ifork with br_startblock=0 can lead to the extent being copied into the btree by xfs_bmap_extent_to_btree if we happen to convert from extents format to btree format before updating br_startblock with the correct value. The unexpected addition of this delay extent to the btree can cause subsequent XFS_WANT_CORRUPTED_GOTO filesystem shutdown in several xfs_bmap_add_extent_delay_real cases where we are converting a delay extent to real and unexpectedly find an extent already inserted. For example: 911 case BMAP_LEFT_FILLING: 912 /* 913 * Filling in the first part of a previous delayed allocation. 914 * The left neighbor is not contiguous. 915 */ 916 trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); 917 xfs_bmbt_set_startoff(ep, new_endoff); 918 temp = PREV.br_blockcount - new->br_blockcount; 919 xfs_bmbt_set_blockcount(ep, temp); 920 xfs_iext_insert(ip, idx, 1, new, state); 921 ip->i_df.if_lastex = idx; 922 ip->i_d.di_nextents++; 923 if (cur == NULL) 924 rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; 925 else { 926 rval = XFS_ILOG_CORE; 927 if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, 928 new->br_startblock, new->br_blockcount, 929 &i))) 930 goto done; 931 XFS_WANT_CORRUPTED_GOTO(i == 0, done); With the bogus extent in the btree we shutdown the filesystem at 931. The conversion from extents to btree format happens when the number of extents in the inode increases above ip->i_df.if_ext_max. xfs_bmap_extent_to_btree copies extents from the ifork into the btree, ignoring all delalloc extents which are denoted by br_startblock having some value of nullstartblock. SGI-PV: 1013221 Signed-off-by: Ben Myers Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit 0fbca4d1c3932c27c4794bf5c2b5fc961cf5a54f Author: Dave Chinner Date: Fri Jan 28 11:20:46 2011 +1100 xfs: fix dquot shaker deadlock Commit 368e136 ("xfs: remove duplicate code from dquot reclaim") fails to unlock the dquot freelist when the number of loop restarts is exceeded in xfs_qm_dqreclaim_one(). This causes hangs in memory reclaim. Rework the loop control logic into an unwind stack that all the different cases jump into. This means there is only one set of code that processes the loop exit criteria, and simplifies the unlocking of all the items from different points in the loop. It also fixes a double increment of the restart counter from the qi_dqlist_lock case. Reported-by: Malcolm Scott Signed-off-by: Dave Chinner Reviewed-by: Alex Elder commit c6f990d1ff8e4e53b12f4175eb7d7ea710c3ca73 Author: Dave Chinner Date: Thu Jan 27 13:23:28 2011 +1100 xfs: handle CIl transaction commit failures correctly Failure to commit a transaction into the CIL is not handled correctly. This currently can only happen when racing with a shutdown and requires an explicit shutdown check, so it rare and can be avoided. Remove the shutdown check and make the CIL commit a void function to indicate it will always succeed, thereby removing the incorrectly handled failure case. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder commit 5315837daee7ed76c31ef643915f7d76ef8c1aa3 Author: Dave Chinner Date: Thu Jan 27 12:18:18 2011 +1100 xfs: limit extsize to size of AGs and/or MAXEXTLEN The extent size hint can be set to larger than an AG. This means that the alignment process can push the range to be allocated outside the bounds of the AG, resulting in assert failures or corrupted bmbt records. Similarly, if the extsize is larger than the maximum extent size supported, the alignment process will produce extents that are too large to fit into the bmbt records, resulting in a different type of assert/corruption failure. Fix this by limiting extsize at the time Ñ–t is set firstly to be less than MAXEXTLEN, then to be a maximum of half the size of the AGs in the filesystem for non-realtime inodes. Realtime inodes do not allocate out of AGs, so don't have to be restricted by the size of AGs. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder commit 4ce159890c00e2cc705e955a939bf1dca7b07ab8 Author: Dave Chinner Date: Thu Jan 27 12:17:58 2011 +1100 xfs: prevent extsize alignment from exceeding maximum extent size When doing delayed allocation, if the allocation size is for a maximally sized extent, extent size alignment can push it over this limit. This results in an assert failure in xfs_bmbt_set_allf() as the extent length is too large to find in the extent record. Fix this by ensuring that we allow for space that extent size alignment requires (up to 2 * (extsize -1) blocks as we have to handle both head and tail alignment) when limiting the maximum size of the extent. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder commit 14b064ceaa6f51a7426cc45b4b43685b94380658 Author: Dave Chinner Date: Thu Jan 27 12:16:28 2011 +1100 xfs: limit extent length for allocation to AG size Delayed allocation extents can be larger than AGs, so when trying to convert a large range we may scan every AG inside xfs_bmap_alloc_nullfb() trying to find an AG with a size larger than an AG. We should stop when we find the first AG with a maximum possible allocation size. This causes excessive CPU usage when there are lots of AGs. The same problem occurs when doing preallocation of a range larger than an AG. Fix the problem by limiting real allocation lengths to the maximum that an AG can support. This means if we have empty AGs, we'll stop the search at the first of them. If there are no empty AGs, we'll still scan them all, but that is a different problem.... Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder commit b8fc82630ae289bb4e661567808afc59e3298dce Author: Dave Chinner Date: Thu Jan 27 12:14:12 2011 +1100 xfs: speculative delayed allocation uses rounddown_power_of_2 badly rounddown_power_of_2() returns an undefined result when passed a value of zero. The specualtive delayed allocation code is doing this when the inode is zero length. Hence occasionally the preallocation is much, much larger than is necessary (e.g. 8GB for a 270 _byte_ file). Ensure we don't even pass a zero value to this function so the result of preallocation is always the desired size. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder commit e34a314c5e49fe6b763568f6576b19f1299c33c2 Author: Dave Chinner Date: Thu Jan 27 12:13:35 2011 +1100 xfs: fix efi item leak on forced shutdown After test 139, kmemleak shows: unreferenced object 0xffff880078b405d8 (size 400): comm "xfs_io", pid 4904, jiffies 4294909383 (age 1186.728s) hex dump (first 32 bytes): 60 c1 17 79 00 88 ff ff 60 c1 17 79 00 88 ff ff `..y....`..y.... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ backtrace: [] kmemleak_alloc+0x2d/0x60 [] kmem_cache_alloc+0x13f/0x2b0 [] kmem_zone_alloc+0x77/0xf0 [] kmem_zone_zalloc+0x1e/0x50 [] xfs_efi_init+0x4b/0xb0 [] xfs_trans_get_efi+0x58/0x90 [] xfs_bmap_finish+0x8b/0x1d0 [] xfs_itruncate_finish+0x2c4/0x5d0 [] xfs_setattr+0x8df/0xa70 [] xfs_vn_setattr+0x1b/0x20 [] notify_change+0x170/0x2e0 [] do_truncate+0x66/0xa0 [] sys_ftruncate+0xdb/0xe0 [] system_call_fastpath+0x16/0x1b [] 0xffffffffffffffff The cause of the leak is that the "remove" parameter of IOP_UNPIN() is never set when a CIL push is aborted. This means that the EFI item is never freed if it was in the push being cancelled. The problem is specific to delayed logging, but has uncovered a couple of problems with the handling of IOP_UNPIN(remove). Firstly, we cannot safely call xfs_trans_del_item() from IOP_UNPIN() in the CIL commit failure path or the iclog write failure path because for delayed loging we have no transaction context. Hence we must only call xfs_trans_del_item() if the log item being unpinned has an active log item descriptor. Secondly, xfs_trans_uncommit() does not handle log item descriptor freeing during the traversal of log items on a transaction. It can reference a freed log item descriptor when unpinning an EFI item. Hence it needs to use a safe list traversal method to allow items to be removed from the transaction during IOP_UNPIN(). Signed-off-by: Dave Chinner Reviewed-by: Alex Elder commit 7db37c5e6575b229a5051be1d3ef15257ae0ba5d Author: Dave Chinner Date: Thu Jan 27 12:02:00 2011 +1100 xfs: fix log ticket leak on forced shutdown. The kmemleak detector shows this after test 139: unreferenced object 0xffff880079b88bb0 (size 264): comm "xfs_io", pid 4904, jiffies 4294909382 (age 276.824s) hex dump (first 32 bytes): 00 00 00 00 ad 4e ad de ff ff ff ff 00 00 00 00 .....N.......... ff ff ff ff ff ff ff ff 48 7b c9 82 ff ff ff ff ........H{...... backtrace: [] kmemleak_alloc+0x2d/0x60 [] kmem_cache_alloc+0x13f/0x2b0 [] kmem_zone_alloc+0x77/0xf0 [] kmem_zone_zalloc+0x1e/0x50 [] xlog_ticket_alloc+0x34/0x170 [] xlog_cil_push+0xa4/0x3f0 [] xlog_cil_force_lsn+0x15a/0x160 [] _xfs_log_force_lsn+0x75/0x2d0 [] _xfs_trans_commit+0x2bd/0x2f0 [] xfs_iomap_write_allocate+0x1ad/0x350 [] xfs_map_blocks+0x21f/0x370 [] xfs_vm_writepage+0x1c7/0x550 [] __writepage+0x1a/0x50 [] write_cache_pages+0x1c2/0x4c0 [] generic_writepages+0x27/0x30 [] xfs_vm_writepages+0x5d/0x80 By inspection, the leak occurs when xlog_write() returns and error and we jump to the abort path without dropping the reference on the active ticket. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder commit cf78859f520f8275318f47d7864f4459d940cb6b Author: Geert Uytterhoeven Date: Mon Jan 17 21:21:14 2011 +0100 xfs: Do not name variables "panic" On platforms that call panic() inside their BUG() macro (m68k/sun3, and all platforms that don't set HAVE_ARCH_BUG), compilation fails with: | fs/xfs/support/debug.c: In function ‘xfs_cmn_err’: | fs/xfs/support/debug.c:92: error: called object ‘panic’ is not a function as the local variable "panic" conflicts with the "panic()" function. Rename the local variable to resolve this. Signed-off-by: Geert Uytterhoeven Reviewed-by: Christoph Hellwig Signed-off-by: Linus Torvalds commit 2fe17c1075836b66678ed2a305fd09b6773883aa Author: Christoph Hellwig Date: Fri Jan 14 13:07:43 2011 +0100 fallocate should be a file operation Currently all filesystems except XFS implement fallocate asynchronously, while XFS forced a commit. Both of these are suboptimal - in case of O_SYNC I/O we really want our allocation on disk, especially for the !KEEP_SIZE case where we actually grow the file with user-visible zeroes. On the other hand always commiting the transaction is a bad idea for fast-path uses of fallocate like for example in recent Samba versions. Given that block allocation is a data plane operation anyway change it from an inode operation to a file operation so that we have the file structure available that lets us check for O_SYNC. This also includes moving the code around for a few of the filesystems, and remove the already unnedded S_ISDIR checks given that we only wire up fallocate for regular files. Signed-off-by: Christoph Hellwig Signed-off-by: Al Viro commit 64c23e86873ee410554d6d1c76b60da47025e96f Author: Christoph Hellwig Date: Fri Jan 14 13:07:30 2011 +0100 make the feature checks in ->fallocate future proof Instead of various home grown checks that might need updates for new flags just check for any bit outside the mask of the features supported by the filesystem. This makes the check future proof for any newly added flag. Signed-off-by: Christoph Hellwig Signed-off-by: Al Viro commit 7cb3920a6529df7f54487abe973b903b8239e901 Merge: ad56cbf0fa6c09350c738ec59a3361f2e4ab4bc7 73efe4a4ddf8eb2b1cc7039e8a66a23a424961af Author: Linus Torvalds Date: Fri Jan 14 15:24:17 2011 -0800 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs * 'for-linus' of git://oss.sgi.com/xfs/xfs: xfs: prevent NMI timeouts in cmn_err xfs: Add log level to assertion printk xfs: fix an assignment within an ASSERT() xfs: fix error handling for synchronous writes xfs: add FITRIM support xfs: ensure log covering transactions are synchronous xfs: serialise unaligned direct IOs xfs: factor common write setup code xfs: split buffered IO write path from xfs_file_aio_write xfs: split direct IO write path from xfs_file_aio_write xfs: introduce xfs_rw_lock() helpers for locking the inode xfs: factor post-write newsize updates xfs: factor common post-write isize handling code xfs: ensure sync write errors are returned commit 275220f0fcff1adf28a717076e00f575edf05fda Merge: fe3c560b8a22cb28e54fe8950abef38e88d75831 81c5e2ae33c4b19e53966b427e33646bf6811830 Author: Linus Torvalds Date: Thu Jan 13 10:45:01 2011 -0800 Merge branch 'for-2.6.38/core' of git://git.kernel.dk/linux-2.6-block * 'for-2.6.38/core' of git://git.kernel.dk/linux-2.6-block: (43 commits) block: ensure that completion error gets properly traced blktrace: add missing probe argument to block_bio_complete block cfq: don't use atomic_t for cfq_group block cfq: don't use atomic_t for cfq_queue block: trace event block fix unassigned field block: add internal hd part table references block: fix accounting bug on cross partition merges kref: add kref_test_and_get bio-integrity: mark kintegrityd_wq highpri and CPU intensive block: make kblockd_workqueue smarter Revert "sd: implement sd_check_events()" block: Clean up exit_io_context() source code. Fix compile warnings due to missing removal of a 'ret' variable fs/block: type signature of major_to_index(int) to major_to_index(unsigned) block: convert !IS_ERR(p) && p to !IS_ERR_NOR_NULL(p) cfq-iosched: don't check cfqg in choose_service_tree() fs/splice: Pull buf->ops->confirm() from splice_from_pipe actors cdrom: export cdrom_check_events() sd: implement sd_check_events() sr: implement sr_check_events() ... commit b2034d474b7e1e8578bd5c2977024b51693269d9 Merge: 27d189c02ba25851973c8582e419c0bded9f7e5b 924241575a85249b9d410e38f5b2fcad9035e45c Author: Linus Torvalds Date: Thu Jan 13 10:27:28 2011 -0800 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (41 commits) fs: add documentation on fallocate hole punching Gfs2: fail if we try to use hole punch Btrfs: fail if we try to use hole punch Ext4: fail if we try to use hole punch Ocfs2: handle hole punching via fallocate properly XFS: handle hole punching via fallocate properly fs: add hole punching to fallocate vfs: pass struct file to do_truncate on O_TRUNC opens (try #2) fix signedness mess in rw_verify_area() on 64bit architectures fs: fix kernel-doc for dcache::prepend_path fs: fix kernel-doc for dcache::d_validate sanitize ecryptfs ->mount() switch afs move internal-only parts of ncpfs headers to fs/ncpfs switch ncpfs switch 9p pass default dentry_operations to mount_pseudo() switch hostfs switch affs switch configfs ... commit 008d23e4852d78bb2618f2035f8b2110b6a6b968 Merge: 8f685fbda43deccd130d192c9fcef1444649eaca bfc672dcf323877228682aff79dff8ecd9f30ff8 Author: Linus Torvalds Date: Thu Jan 13 10:05:56 2011 -0800 Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial: (43 commits) Documentation/trace/events.txt: Remove obsolete sched_signal_send. writeback: fix global_dirty_limits comment runtime -> real-time ppc: fix comment typo singal -> signal drivers: fix comment typo diable -> disable. m68k: fix comment typo diable -> disable. wireless: comment typo fix diable -> disable. media: comment typo fix diable -> disable. remove doc for obsolete dynamic-printk kernel-parameter remove extraneous 'is' from Documentation/iostats.txt Fix spelling milisec -> ms in snd_ps3 module parameter description Fix spelling mistakes in comments Revert conflicting V4L changes i7core_edac: fix typos in comments mm/rmap.c: fix comment sound, ca0106: Fix assignment to 'channel'. hrtimer: fix a typo in comment init/Kconfig: fix typo anon_inodes: fix wrong function name in comment fix comment typos concerning "consistent" poll: fix a typo in comment ... Fix up trivial conflicts in: - drivers/net/wireless/iwlwifi/iwl-core.c (moved to iwl-legacy.c) - fs/ext4/ext4.h Also fix missed 'diabled' typo in drivers/net/bnx2x/bnx2x.h while at it. commit c25d246715b87ad37e69e7abd1a0fed781423fa2 Author: Josef Bacik Date: Wed Nov 17 20:46:16 2010 -0500 XFS: handle hole punching via fallocate properly This patch simply allows XFS to handle the hole punching flag in fallocate properly. I've tested this with a little program that does a bunch of random hole punching with FL_KEEP_SIZE and without it to make sure it does the right thing. Thanks, Signed-off-by: Josef Bacik Signed-off-by: Al Viro commit 4b7bd364700d9ac8372eff48832062b936d0793b Merge: c0d8768af260e2cbb4bf659ae6094a262c86b085 90a8a73c06cc32b609a880d48449d7083327e11a Author: Jiri Kosina Date: Wed Dec 22 18:57:02 2010 +0100 Merge branch 'master' into for-next Conflicts: MAINTAINERS arch/arm/mach-omap2/pm24xx.c drivers/scsi/bfa/bfa_fcpim.c Needed to update to apply fixes for which the old branch was too outdated. commit f30195c50245d8ace628e1978b1daa8df86e7224 Merge: d07335e51df0c6dec202d315fc4f1f7e100eec4e d4d77629953eabd3c14f6fa5746f6b28babfc55f Author: Jens Axboe Date: Sat Nov 27 19:49:18 2010 +0100 Merge branch 'cleanup-bd_claim' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc into for-2.6.38/core commit d4d77629953eabd3c14f6fa5746f6b28babfc55f Author: Tejun Heo Date: Sat Nov 13 11:55:18 2010 +0100 block: clean up blkdev_get() wrappers and their users After recent blkdev_get() modifications, open_by_devnum() and open_bdev_exclusive() are simple wrappers around blkdev_get(). Replace them with blkdev_get_by_dev() and blkdev_get_by_path(). blkdev_get_by_dev() is identical to open_by_devnum(). blkdev_get_by_path() is slightly different in that it doesn't automatically add %FMODE_EXCL to @mode. All users are converted. Most conversions are mechanical and don't introduce any behavior difference. There are several exceptions. * btrfs now sets FMODE_EXCL in btrfs_device->mode, so there's no reason to OR it explicitly on blkdev_put(). * gfs2, nilfs2 and the generic mount_bdev() now set FMODE_EXCL in sb->s_mode. * With the above changes, sb->s_mode now always should contain FMODE_EXCL. WARN_ON_ONCE() added to kill_block_super() to detect errors. The new blkdev_get_*() functions are with proper docbook comments. While at it, add function description to blkdev_get() too. Signed-off-by: Tejun Heo Cc: Philipp Reisner Cc: Neil Brown Cc: Mike Snitzer Cc: Joern Engel Cc: Chris Mason Cc: Jan Kara Cc: "Theodore Ts'o" Cc: KONISHI Ryusuke Cc: reiserfs-devel@vger.kernel.org Cc: xfs-masters@oss.sgi.com Cc: Alexander Viro commit e525fd89d380c4a94c0d63913a1dd1a593ed25e7 Author: Tejun Heo Date: Sat Nov 13 11:55:17 2010 +0100 block: make blkdev_get/put() handle exclusive access Over time, block layer has accumulated a set of APIs dealing with bdev open, close, claim and release. * blkdev_get/put() are the primary open and close functions. * bd_claim/release() deal with exclusive open. * open/close_bdev_exclusive() are combination of open and claim and the other way around, respectively. * bd_link/unlink_disk_holder() to create and remove holder/slave symlinks. * open_by_devnum() wraps bdget() + blkdev_get(). The interface is a bit confusing and the decoupling of open and claim makes it impossible to properly guarantee exclusive access as in-kernel open + claim sequence can disturb the existing exclusive open even before the block layer knows the current open if for another exclusive access. Reorganize the interface such that, * blkdev_get() is extended to include exclusive access management. @holder argument is added and, if is @FMODE_EXCL specified, it will gain exclusive access atomically w.r.t. other exclusive accesses. * blkdev_put() is similarly extended. It now takes @mode argument and if @FMODE_EXCL is set, it releases an exclusive access. Also, when the last exclusive claim is released, the holder/slave symlinks are removed automatically. * bd_claim/release() and close_bdev_exclusive() are no longer necessary and either made static or removed. * bd_link_disk_holder() remains the same but bd_unlink_disk_holder() is no longer necessary and removed. * open_bdev_exclusive() becomes a simple wrapper around lookup_bdev() and blkdev_get(). It also has an unexpected extra bdev_read_only() test which probably should be moved into blkdev_get(). * open_by_devnum() is modified to take @holder argument and pass it to blkdev_get(). Most of bdev open/close operations are unified into blkdev_get/put() and most exclusive accesses are tested atomically at the open time (as it should). This cleans up code and removes some, both valid and invalid, but unnecessary all the same, corner cases. open_bdev_exclusive() and open_by_devnum() can use further cleanup - rename to blkdev_get_by_path() and blkdev_get_by_devt() and drop special features. Well, let's leave them for another day. Most conversions are straight-forward. drbd conversion is a bit more involved as there was some reordering, but the logic should stay the same. Signed-off-by: Tejun Heo Acked-by: Neil Brown Acked-by: Ryusuke Konishi Acked-by: Mike Snitzer Acked-by: Philipp Reisner Cc: Peter Osterlund Cc: Martin Schwidefsky Cc: Heiko Carstens Cc: Jan Kara Cc: Andrew Morton Cc: Andreas Dilger Cc: "Theodore Ts'o" Cc: Mark Fasheh Cc: Joel Becker Cc: Alex Elder Cc: Christoph Hellwig Cc: dm-devel@redhat.com Cc: drbd-dev@lists.linbit.com Cc: Leo Chen Cc: Scott Branden Cc: Chris Mason Cc: Steven Whitehouse Cc: Dave Kleikamp Cc: Joern Engel Cc: reiserfs-devel@vger.kernel.org Cc: Alexander Viro commit b595076a180a56d1bb170e6eceda6eb9d76f4cd3 Author: Uwe Kleine-König Date: Mon Nov 1 15:38:34 2010 -0400 tree-wide: fix comment/printk typos "gadget", "through", "command", "maintain", "maintain", "controller", "address", "between", "initiali[zs]e", "instead", "function", "select", "already", "equal", "access", "management", "hierarchy", "registration", "interest", "relative", "memory", "offset", "already", Signed-off-by: Uwe Kleine-König Signed-off-by: Jiri Kosina ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_acl.c | 11 ++++++- fs/xfs/linux-2.6/xfs_file.c | 56 ++++++++++++++++++++++++++++++++++++++ fs/xfs/linux-2.6/xfs_ioctl.c | 20 ++++++++++++- fs/xfs/linux-2.6/xfs_iops.c | 54 ------------------------------------- fs/xfs/linux-2.6/xfs_super.c | 7 +++-- fs/xfs/quota/xfs_qm.c | 46 ++++++++++++++----------------- fs/xfs/support/debug.c | 6 ++-- fs/xfs/xfs_acl.h | 2 +- fs/xfs/xfs_alloc.h | 16 +++++++++++ fs/xfs/xfs_bmap.c | 61 +++++++++++++++++++++++++++++++----------- fs/xfs/xfs_buf_item.c | 12 +++++--- fs/xfs/xfs_extfree_item.c | 3 +- fs/xfs/xfs_iget.c | 10 +++--- fs/xfs/xfs_iomap.c | 7 ++++- fs/xfs/xfs_log.h | 2 +- fs/xfs/xfs_log_cil.c | 15 ++++------ fs/xfs/xfs_mru_cache.c | 2 +- fs/xfs/xfs_trans.c | 41 ++++++++++++++++++++------- 18 files changed, 231 insertions(+), 140 deletions(-) hooks/post-receive -- XFS development tree From aelder@sgi.com Fri Jan 28 16:15:26 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0SMFQSC176264 for ; Fri, 28 Jan 2011 16:15:26 -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 076248F80BB; Fri, 28 Jan 2011 14:17: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); Fri, 28 Jan 2011 16:17:48 -0600 Subject: Re: [PATCH 4/6] xfs: optimize xfs_alloc_fix_freelist From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20110121092551.185804716@bombadil.infradead.org> References: <20110121092227.115815324@bombadil.infradead.org> <20110121092551.185804716@bombadil.infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Fri, 28 Jan 2011 16:17:48 -0600 Message-ID: <1296253068.2342.282.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 28 Jan 2011 22:17:49.0009 (UTC) FILETIME=[326AC410:01CBBF39] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 2011-01-21 at 04:22 -0500, Christoph Hellwig wrote: > plain text document attachment > (xfs-avoid-sync-transaction-for-freelist-refill) > If we shorten the freelist in xfs_alloc_fix_freelist there is no need > to wait for busy blocks as they will be marked busy again when we call > xfs_free_ag_extent. Avoid this by not marking blocks coming from the > freelist as busy in xfs_free_ag_extent, and not marking transactions > with busy extents as synchronous in xfs_alloc_get_freelist. Unlike > xfs_free_ag_extent which already has the isfl argument, > xfs_alloc_get_freelist needs to be told about the usage of the blocks > it returns. For this we extend the btreeblk flag to a type argument > which specifies in detail what the block is going to be used for. > > Signed-off-by: Christoph Hellwig Now that I've found my way through the paths that this code touches (Dave's analysis helped a lot), I understand what you're doing and I think it looks good. I agree that the XFS_FREELIST_* symbols need a little explanation. And on a broader subject, it might be nice if the sort of lifecycle of this kind of thing was documented somewhere (maybe it is). It would be really cool if certain changes could point to a Wiki page with a diagram of what's going on or something. Nah... Reviewed-by: Alex Elder From aelder@sgi.com Fri Jan 28 16:15:31 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0SMFVxF176283 for ; Fri, 28 Jan 2011 16:15:31 -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 042B88F80B5; Fri, 28 Jan 2011 14:17:56 -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); Fri, 28 Jan 2011 16:17:57 -0600 Subject: Re: [PATCH 5/6] xfs: do not classify freed allocation btree blocks as busy From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20110121092551.402449845@bombadil.infradead.org> References: <20110121092227.115815324@bombadil.infradead.org> <20110121092551.402449845@bombadil.infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Fri, 28 Jan 2011 16:17:56 -0600 Message-ID: <1296253076.2342.284.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 28 Jan 2011 22:17:57.0118 (UTC) FILETIME=[374019E0:01CBBF39] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 2011-01-21 at 04:22 -0500, Christoph Hellwig wrote: > During an allocation or freeing of an extent, we occasionally have an > interesting situation happen during a btree update. We may merge a block > as part of a record delete, then allocate it again immediately afterwards > when inserting a modified extent. xfs_alloc_fixup_trees() does this sort > of manipulation to the btrees, and so can merge then immediately split > the tree resulting the in the same busy block being used from the > freelist. Methinks someone must have observed this stuff by tracing... > Previously, this would trigger a synchronous log force of the entire log > (as the current transaction had a lsn of 0 until committed), but continue > to allow the extent to be used because if it is not on disk now then it > must have been freed and marked busy in this transaction. This could explain a mysterious slowdown I was looking at a while ago. > In the case of allocbt blocks, we log the fact that they get moved to the > freelist and we also log them when the move off the free list back into > the free space trees. When we move the blocks off the freelist back to > the trees, we mark the extent busy at that point so that it doesn't get > reused until the transaction is committed. > > This means that as long as the block is on the AGFL and is only used > for allocbt blocks, we don't have to force the log to ensure prior > manipulating transactions are on disk as the process of log recovery > will replay the transactions in the correct order. > > However, we still need to protect against the fact that as we approach > ENOSPC in an AG we can allocate data and metadata blocks direct from the > AGFL. In this case, we need to treat btree blocks just like any other > busy extent. Hence we still need to track btree blocks in the busy extent > tree, but we need to distinguish them from normal extents so we can apply > the necessary exceptions for btree block allocation. > > Signed-off-by: Dave Chinner > Signed-off-by: Christoph Hellwig Sorry, this ended up being a pretty pointless note... I see what you're doing here but have not completed my detailed review. I also have read Dave's comments and I think he's right that what the block is being allocated *for* (metadata or data) determines whether the log force is required. Anyway, I need to go now unfortunately. I'll try to finish reviewing this and the last one by Monday. -Alex From david@fromorbit.com Fri Jan 28 17:56:37 2011 X-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 p0SNuZN1180140 for ; Fri, 28 Jan 2011 17:56:37 -0600 X-ASG-Debug-ID: 1296259135-2bad01010000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1479229A8B8 for ; Fri, 28 Jan 2011 15:58:55 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id MBwA4ClpGsC2HFZD for ; Fri, 28 Jan 2011 15:58:55 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuUEAIvnQk15LN5mgWdsb2JhbAClAxYBARYiJLwMDYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 29 Jan 2011 10:28:49 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PiyDH-0003of-J0; Sat, 29 Jan 2011 10:58:47 +1100 Date: Sat, 29 Jan 2011 10:58:47 +1100 From: Dave Chinner To: Mark Lord Cc: Stan Hoeppner , Justin Piszcz , Christoph Hellwig , Alex Elder , Linux Kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount Message-ID: <20110128235847.GY21311@dastard> References: <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D41EA04.7010506@teksavvy.com> <20110128001735.GO21311@dastard> <4D421A68.9000607@teksavvy.com> <20110128073119.GV21311@dastard> <4D42D39E.4080304@teksavvy.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D42D39E.4080304@teksavvy.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296259139 X-Barracuda-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.53728 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, Jan 28, 2011 at 09:33:02AM -0500, Mark Lord wrote: > On 11-01-28 02:31 AM, Dave Chinner wrote: > > > > A simple google search turns up discussions like this: > > > > http://oss.sgi.com/archives/xfs/2009-01/msg01161.html > > "in the long term we still expect fragmentation to degrade the performance of > XFS file systems" "so we intend to add an on-line file system defragmentation utility to optimize the file system in the future" You are quoting from the wrong link - that's from the 1996 whitepaper. And sure, at the time that was written, nobody had any real experience with long term aging of XFS filesystems so it was still a guess at that point. XFS has had that online defragmentation utility since 1998, IIRC, even though in most cases it is unnecessary to use it. > Other than that, no hints there about how changing agcount affects things. If the reason given in the whitepaper for multiple AGs (i.e. they are for increasing the concurrency of allocation) doesn't help you understand why you'd want to increase the number of AGs in the filesystem, then you haven't really thought about what you read. As it is, from the same google search that found the above link as #1 hit, this was #6: http://oss.sgi.com/archives/xfs/2010-11/msg00497.html | > AG count has a | > direct relationship to the storage hardware, not the number of CPUs | > (cores) in the system | | Actually, I used 16 AGs because it's twice the number of CPU cores | and I want to make sure that CPU parallel workloads (e.g. make -j 8) | don't serialise on AG locks during allocation. IOWs, I laid it out | that way precisely because of the number of CPUs in the system... | | And to point out the not-so-obvious, this is the _default layout_ | that mkfs.xfs in the debian squeeze installer came up with. IOWs, | mkfs.xfs did exactly what I wanted without me having to tweak | _anything_." | [...] | | In that case, you are right. Single spindle SRDs go backwards in | performance pretty quickly once you go over 4 AGs... It seems to me that you haven't really done much looking for information; there's lots of relevant advice in xfs mailing list archives... (and before you ask - SRD == Spinning Rust Disk) > > Configuring XFS filesystems for optimal performance has always been > > a black art because it requires you to understand your storage, your > > application workload(s) and XFS from the ground up. Most people > > can't even tick one of those boxes, let alone all three.... > > Well, I've got 2/3 of those down just fine, thanks. > But it's the "XFS" part that is still the "black art" part, > because so little is written about *how* it works > (as opposed to how it is laid out on disk). If you want to know exactly how it works, there plenty of code to read. I know, you're going to call that a cop out, but I've got more important things to do than document 20,000 lines of allocation code just for you. In a world of infinite resources then everything would be documented just the way you want, but we don't have infinite resources so it remains documented by the code that implements it. However, if you want to go and understand it and document it all for us, then we'll happily take the patches. :) Cheers,, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Jan 28 18:14:38 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0T0EcFH181004 for ; Fri, 28 Jan 2011 18:14:38 -0600 X-ASG-Debug-ID: 1296260222-28f903020000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 16CED126E041 for ; Fri, 28 Jan 2011 16:17:02 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id bt0VQTL6rfbHkkpO for ; Fri, 28 Jan 2011 16:17:02 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuUEAJbqQk15LN5mgWdsb2JhbAClAxYBARYiJLwODYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 29 Jan 2011 10:47:01 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PiyUu-0003qb-CW; Sat, 29 Jan 2011 11:17:00 +1100 Date: Sat, 29 Jan 2011 11:17:00 +1100 From: Dave Chinner To: Jef Fox Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS Preallocation Subject: Re: XFS Preallocation Message-ID: <20110129001700.GZ21311@dastard> References: <155CAEA5D902E7429569DD197567724A01534D42@mail1.ad.kinetx.com> <20110128045205.GR21311@dastard> <155CAEA5D902E7429569DD197567724A01534D60@mail1.ad.kinetx.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <155CAEA5D902E7429569DD197567724A01534D60@mail1.ad.kinetx.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296260224 X-Barracuda-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.53729 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 Fri, Jan 28, 2011 at 10:33:03AM -0700, Jef Fox wrote: > I guess, disregard my previous message. After some further testing of > examining the hard disk blocks, we see what you are saying - the file is > presented at 0s to the user even if the blocks are changed on the hard > disk. So, we will always see 0s until we write to the extent. > > So, I think our only question now is if there is a way to force the > extents to be marked as allocated without writing all of the data? That > is, is there a fast way to lay down a file(s) of 1G size without > actually writing 1G of info. Preallocation is the only option. Allowing preallocation without marking extents as unwritten opens a massive security hole (i.e. exposes stale data) so I say no to any request for addition of such functionality (and have for years). You've already demonstrated the workaround you can apply to the problem for your very specialised application - when you put the disk back into the original machine you can read the disk blocks directly to get the data. i.e. use fiemap to map the location of the file on disk and then read the data directly from the block device underneath the filesystem... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Jan 28 18:23:29 2011 X-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 p0T0NSQi181324 for ; Fri, 28 Jan 2011 18:23:29 -0600 X-ASG-Debug-ID: 1296260752-558e01ae0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5F0841A47120 for ; Fri, 28 Jan 2011 16:25:53 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id AF3tXlLVerWU9Bwq for ; Fri, 28 Jan 2011 16:25:53 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuUEAJbqQk15LN5mgWdsb2JhbAClAxYBARYiJLwODYVCBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail06.adl2.internode.on.net with ESMTP; 29 Jan 2011 10:55:51 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PiydS-0003rS-Rb; Sat, 29 Jan 2011 11:25:50 +1100 Date: Sat, 29 Jan 2011 11:25:50 +1100 From: Dave Chinner To: Alex Elder Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/6] xfs: do not immediately reuse busy extent ranges Subject: Re: [PATCH 3/6] xfs: do not immediately reuse busy extent ranges Message-ID: <20110129002550.GA21311@dastard> References: <20110121092227.115815324@bombadil.infradead.org> <20110121092550.933551564@bombadil.infradead.org> <20110128015835.GQ21311@dastard> <1296231591.2342.47.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1296231591.2342.47.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296260754 X-Barracuda-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.53730 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, Jan 28, 2011 at 10:19:51AM -0600, Alex Elder wrote: > On Fri, 2011-01-28 at 12:58 +1100, Dave Chinner wrote: > > On Fri, Jan 21, 2011 at 04:22:30AM -0500, Christoph Hellwig wrote: > > > Every time we reallocate a busy extent, we cause a synchronous log force > > > to occur to ensure the freeing transaction is on disk before we continue > . . . > > > + > > > + spin_lock(&pag->pagb_lock); > > > + rbp = pag->pagb_tree.rb_node; > > > + while (rbp) { > > I will amend the loop termination condition I suggested > before to be this: > > while (rbp && len >= args->minlen) { Makes sense. > > > + struct xfs_busy_extent *busyp = > > > + rb_entry(rbp, struct xfs_busy_extent, rb_node); > > > + xfs_agblock_t end = bno + len; > > > + xfs_agblock_t bend = busyp->bno + busyp->length; > > > + > > > + if (bno + len <= busyp->bno) { > > > + rbp = rbp->rb_left; > > > + continue; > > > + } else if (bno >= busyp->bno + busyp->length) { > > > + rbp = rbp->rb_right; > > > + continue; > > > + } > > > > if (end <= bbno) > > left; > > else if (bno > bend) > > right; > > I think the original code is right in this case. > The value of "bend" is the offset *following* the > end of the range. So if "bno" equals that, we > want to move Right. (Same reason <= is correct > for the first condition here.) Oops, yes, you are right. Good catch - I failed to copy that code into psuedo code correctly. > > > /* overlap */ > > > > > + > > > + if (busyp->bno < bno) { > > > + /* start overlap */ > > > + ASSERT(bend >= bno); > > > + ASSERT(bend <= end); > > > + len -= bno - bend; > > > + bno = bend; > > > > if (bbno < bno) { > > > > bbno bend > > +-----------------+ > > Case 1: > > +---------+ > > bno end > > > > No unbusy region in extent, return failure > > Yes, that's right, I missed that. My suggestion goes > negative in this case. > > > Case 2: > > +------------------------+ > > bno end > > > > Needs to be trimmed to: > > +-------+ > > bno end > > bno = bend; > > len = end - bno; > > I like defining len in terms of the updated bno as > you have suggested here. > > > > + } else if (bend > end) { > > > + /* end overlap */ > > > + ASSERT(busyp->bno >= bno); > > > + ASSERT(busyp->bno < end); > > > + len -= bend - end; > > > . . . > > > > So, it looks to me like the "overlap found" algorithm shoul dbe > > something like: > > For this algorithm, updating the value of len can be done > once, at the bottom (or top) of the loop, based simply on > the (updated) value of end and bno: > > len = end - bno; > > You could rearrange things a bit so this gets done at > the top--instead of computing the value of end based > on bno and len. Quite possibly - I just wanted to enumerate what I though the code should do rather than present a optimal, completed function ;) > > if (bbno <= bno) { > > if (end <= bend) { > > /* case 1, 3, 5 */ > > return failure; > > } > > /* case 2, 6 */ > > bno = bend; > > len = end - bno; > > } else if (bend >= end) { > > ASSERT(bbno > bno); > > /* case 4, 7 */ > > end = bbno; > > len = end - bno; > > } else { > > ASSERT(bbno > bno); > > ASSERT(bend < end); > > /* case 8 */ > > if (bbno - bno >= args->minlen) { > > /* left candidate OK */ > > left = 1; > > } > > if (end - bend >= args->maxlen * 4) { > > The "4" here I understand, but it's arbitrary (based > on an educated guess) so it needs to at least be explained > here with a comment. Making it symbolic might make it > something one could search for at some future date. Yup. That value of "4" was simply a SWAG - I haven't really thought about the best way to determine if the "remaining free space is much larger than the allocation request" reliably, but I needed something there to demonstrate what I was thinking.... .... > > > - if (xfs_alloc_busy_search(mp, agno, fbno, flen)) { > > > - trace_xfs_discard_busy(mp, agno, fbno, flen); > > > - goto next_extent; > > > - } > > > + xfs_alloc_busy_search_trim(mp, pag, fbno, flen, &tbno, &tlen); > > > > > > - trace_xfs_discard_extent(mp, agno, fbno, flen); > > > + trace_xfs_discard_extent(mp, agno, tbno, tlen); > > > error = -blkdev_issue_discard(bdev, > > > - XFS_AGB_TO_DADDR(mp, agno, fbno), > > > - XFS_FSB_TO_BB(mp, flen), > > > + XFS_AGB_TO_DADDR(mp, agno, tbno), > > > + XFS_FSB_TO_BB(mp, tlen), > > > GFP_NOFS, 0); > > > if (error) > > > goto out_del_cursor; > > > - *blocks_trimmed += flen; > > > + *blocks_trimmed += tlen; > > > > Hmmm - that means if we get a case 8 overlap, we'll only trim one > > side of the extent. That's probably not a big deal. However, perhaps > > this should check the size of the trimmed extent before issuing the > > discard against it in case we've reduced it to something smaller > > thanthe minimum requested trim size.... > > I think all of the places that (ultimately) call this function > need to be looked at to make sure they handle the "error" case > properly--either checking for a returned error or verifying the > returned length is at least the minimum. *nods vigorously* Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Jan 28 23:38:01 2011 X-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 p0T5c0ih193601 for ; Fri, 28 Jan 2011 23:38:01 -0600 X-ASG-Debug-ID: 1296279624-169101640000-NocioJ 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 DE55429ADBC for ; Fri, 28 Jan 2011 21:40:25 -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 0evGC7WglPVZ1hFR for ; Fri, 28 Jan 2011 21:40:25 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkQFAJc1Q015LN5mgWdsb2JhbACWZY4eFgEBFiIkuwANhUIE Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail07.adl2.internode.on.net with ESMTP; 29 Jan 2011 16:10:23 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pj3Xp-0004Er-UD; Sat, 29 Jan 2011 16:40:21 +1100 Date: Sat, 29 Jan 2011 16:40:21 +1100 From: Dave Chinner To: david@lang.hm Cc: Stan Hoeppner , Linux Kernel , xfs@oss.sgi.com, Christoph Hellwig , Justin Piszcz , Alex Elder , Mark Lord X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount Message-ID: <20110129054021.GB21311@dastard> References: <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D42056E.2050505@hardwarefreak.com> <20110128135629.GX21311@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: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1296279625 X-Barracuda-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.53749 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, Jan 28, 2011 at 11:26:00AM -0800, david@lang.hm wrote: > On Sat, 29 Jan 2011, Dave Chinner wrote: > > >On Thu, Jan 27, 2011 at 06:09:58PM -0800, david@lang.hm wrote: > >>On Thu, 27 Jan 2011, Stan Hoeppner wrote: > >>>david@lang.hm put forth on 1/27/2011 2:11 PM: > >>> > >>>Picking the perfect mkfs.xfs parameters for a hardware RAID array can be > >>>somewhat of a black art, mainly because no two vendor arrays act or perform > >>>identically. > >> > >>if mkfs.xfs can figure out how to do the 'right thing' for md raid > >>arrays, can there be a mode where it asks the users for the same > >>information that it gets from the kernel? > > > >mkfs.xfs can get the information it needs directly from dm and md > >devices. However, when hardware RAID luns present themselves to the > >OS in an identical manner to single drives, how does mkfs tell the > >difference between a 2TB hardware RAID lun made up of 30x73GB drives > >and a single 2TB SATA drive? The person running mkfs should already > >know this little detail.... > > that's my point, the person running mkfs knows this information, and > can easily answer questions that mkfs asks (or provide this > information on the command line). but mkfs doesn't ask for this > infomation, instead it asks the user to define a whole bunch of > parameters that are not well understood. I'm going to be blunt - XFS is not a filesystem suited to use by clueless noobs. XFS is a highly complex filesystem designed for high end, high performance storage and therefore has the configurability and flexibility required by such environments. Hence I expect that anyone configuring an XFS filesystem for a production environments is a professional and has, at minimum, done their homework before they go fiddling with knobs. And we have a FAQ for a reason. ;) > An XFS guru can tell you > how to configure these parameters based on different hardware > layouts, but as long as it remains a 'back art' getting new people > up to speed is really hard. If this can be reduced down to > > is this a hardware raid device > if yes > how many drives are there > what raid type is used (linear, raid 0, 1, 5, 6, 10) > > and whatever questions are needed, it would _greatly_ improve the > quality of the settings that non-guru people end up using. As opposed to just making mkfs DTRT without needing to ask questions? If you really think an interactive mkfs-for-dummies script is necessary, then go ahead and write one - you don't need to modify mkfs at all to do it..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@lang.hm Sat Jan 29 00:06:59 2011 X-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 p0T66wr0196821 for ; Sat, 29 Jan 2011 00:06:59 -0600 X-ASG-Debug-ID: 1296281363-633602020000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bifrost.lang.hm (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5A7511DC5862; Fri, 28 Jan 2011 22:09:23 -0800 (PST) Received: from bifrost.lang.hm (mail.lang.hm [64.81.33.126]) by cuda.sgi.com with ESMTP id BGbjAKG5lqe5FVDM; Fri, 28 Jan 2011 22:09:23 -0800 (PST) Received: from asgard.lang.hm (asgard.lang.hm [10.0.0.100]) by bifrost.lang.hm (8.13.4/8.13.4/Debian-3) with ESMTP id p0T68gfw004883; Fri, 28 Jan 2011 22:08:42 -0800 Date: Fri, 28 Jan 2011 22:08:42 -0800 (PST) From: david@lang.hm X-X-Sender: dlang@asgard.lang.hm To: Dave Chinner cc: Stan Hoeppner , Linux Kernel , xfs@oss.sgi.com, Christoph Hellwig , Justin Piszcz , Alex Elder , Mark Lord X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount In-Reply-To: <20110129054021.GB21311@dastard> Message-ID: References: <4D40EB2F.2050809@teksavvy.com> <4D418B57.1000501@teksavvy.com> <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D42056E.2050505@hardwarefreak.com> <20110128135629.GX21311@dastard> <20110129054021.GB21311@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: mail.lang.hm[64.81.33.126] X-Barracuda-Start-Time: 1296281364 X-Barracuda-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.53752 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 On Sat, 29 Jan 2011, Dave Chinner wrote: > On Fri, Jan 28, 2011 at 11:26:00AM -0800, david@lang.hm wrote: >> On Sat, 29 Jan 2011, Dave Chinner wrote: >> >>> On Thu, Jan 27, 2011 at 06:09:58PM -0800, david@lang.hm wrote: >>>> On Thu, 27 Jan 2011, Stan Hoeppner wrote: >>>>> david@lang.hm put forth on 1/27/2011 2:11 PM: >>>>> >>>>> Picking the perfect mkfs.xfs parameters for a hardware RAID array can be >>>>> somewhat of a black art, mainly because no two vendor arrays act or perform >>>>> identically. >>>> >>>> if mkfs.xfs can figure out how to do the 'right thing' for md raid >>>> arrays, can there be a mode where it asks the users for the same >>>> information that it gets from the kernel? >>> >>> mkfs.xfs can get the information it needs directly from dm and md >>> devices. However, when hardware RAID luns present themselves to the >>> OS in an identical manner to single drives, how does mkfs tell the >>> difference between a 2TB hardware RAID lun made up of 30x73GB drives >>> and a single 2TB SATA drive? The person running mkfs should already >>> know this little detail.... >> >> that's my point, the person running mkfs knows this information, and >> can easily answer questions that mkfs asks (or provide this >> information on the command line). but mkfs doesn't ask for this >> infomation, instead it asks the user to define a whole bunch of >> parameters that are not well understood. > > I'm going to be blunt - XFS is not a filesystem suited to use by > clueless noobs. XFS is a highly complex filesystem designed for high > end, high performance storage and therefore has the configurability > and flexibility required by such environments. Hence I expect that > anyone configuring an XFS filesystem for a production environments > is a professional and has, at minimum, done their homework before > they go fiddling with knobs. And we have a FAQ for a reason. ;) > >> An XFS guru can tell you >> how to configure these parameters based on different hardware >> layouts, but as long as it remains a 'back art' getting new people >> up to speed is really hard. If this can be reduced down to >> >> is this a hardware raid device >> if yes >> how many drives are there >> what raid type is used (linear, raid 0, 1, 5, 6, 10) >> >> and whatever questions are needed, it would _greatly_ improve the >> quality of the settings that non-guru people end up using. > > As opposed to just making mkfs DTRT without needing to ask > questions? but you just said that mkfs couldn't do this with hardware raid because it can't "tell the difference between a 2TB hardware RAID lun made up of 30x73GB drives and a single 2TB SATA drive" if it could tell the difference, it should just do the right thing, but if it can't tell the difference, it should ask the user who can give it the answer. also, keep in mind that what it learns about the 'disks' from md and dm may not be the complete picture. I have one system that thinks it's doing a raid0 across 10 drives, but it's really 160 drives, grouped into 10 raid6 sets by hardware raid, than then gets combined by md. I am all for the defaults and auto-config being as good as possible (one of my biggest gripes about postgres is how bad it's defaults are), but whe you can't tell what reality is, ask the admin who knows (or at least have the option of asking the admin) > If you really think an interactive mkfs-for-dummies script is > necessary, then go ahead and write one - you don't need to modify > mkfs at all to do it..... it doesn't have to be interactive, the answers to the questions could be comand-line options. as for the reason that I don't do this, that's simple. I don't know enough of the black arts to know what the logic is to convert from knowing the disk layout to setting the existing parameters. David Lang From david@fromorbit.com Sat Jan 29 01:33:35 2011 X-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 p0T7XZDQ199498 for ; Sat, 29 Jan 2011 01:33:35 -0600 X-ASG-Debug-ID: 1296286557-03c301e50000-NocioJ 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 83504126E747 for ; Fri, 28 Jan 2011 23:35:58 -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 DnhWs6i1NkyY25xJ for ; Fri, 28 Jan 2011 23:35:58 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: At8EAHxRQ015LN5mgWdsb2JhbAClAxYBARYiJLsSDYVBBA Received: from ppp121-44-222-102.lns20.syd7.internode.on.net (HELO dastard) ([121.44.222.102]) by ipmail07.adl2.internode.on.net with ESMTP; 29 Jan 2011 18:05:56 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pj5Le-0004Nw-NX; Sat, 29 Jan 2011 18:35:54 +1100 Date: Sat, 29 Jan 2011 18:35:54 +1100 From: Dave Chinner To: david@lang.hm Cc: Stan Hoeppner , Linux Kernel , xfs@oss.sgi.com, Christoph Hellwig , Justin Piszcz , Alex Elder , Mark Lord X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount Message-ID: <20110129073554.GC21311@dastard> References: <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D42056E.2050505@hardwarefreak.com> <20110128135629.GX21311@dastard> <20110129054021.GB21311@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: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1296286560 X-Barracuda-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.53759 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, Jan 28, 2011 at 10:08:42PM -0800, david@lang.hm wrote: > On Sat, 29 Jan 2011, Dave Chinner wrote: > > >On Fri, Jan 28, 2011 at 11:26:00AM -0800, david@lang.hm wrote: > >>On Sat, 29 Jan 2011, Dave Chinner wrote: > >> > >>>On Thu, Jan 27, 2011 at 06:09:58PM -0800, david@lang.hm wrote: > >>>>On Thu, 27 Jan 2011, Stan Hoeppner wrote: > >>>>>david@lang.hm put forth on 1/27/2011 2:11 PM: > >>>>> > >>>>>Picking the perfect mkfs.xfs parameters for a hardware RAID array can be > >>>>>somewhat of a black art, mainly because no two vendor arrays act or perform > >>>>>identically. > >>>> > >>>>if mkfs.xfs can figure out how to do the 'right thing' for md raid > >>>>arrays, can there be a mode where it asks the users for the same > >>>>information that it gets from the kernel? > >>> > >>>mkfs.xfs can get the information it needs directly from dm and md > >>>devices. However, when hardware RAID luns present themselves to the > >>>OS in an identical manner to single drives, how does mkfs tell the > >>>difference between a 2TB hardware RAID lun made up of 30x73GB drives > >>>and a single 2TB SATA drive? The person running mkfs should already > >>>know this little detail.... > >> > >>that's my point, the person running mkfs knows this information, and > >>can easily answer questions that mkfs asks (or provide this > >>information on the command line). but mkfs doesn't ask for this > >>infomation, instead it asks the user to define a whole bunch of > >>parameters that are not well understood. > > > >I'm going to be blunt - XFS is not a filesystem suited to use by > >clueless noobs. XFS is a highly complex filesystem designed for high > >end, high performance storage and therefore has the configurability > >and flexibility required by such environments. Hence I expect that > >anyone configuring an XFS filesystem for a production environments > >is a professional and has, at minimum, done their homework before > >they go fiddling with knobs. And we have a FAQ for a reason. ;) > > > >>An XFS guru can tell you > >>how to configure these parameters based on different hardware > >>layouts, but as long as it remains a 'back art' getting new people > >>up to speed is really hard. If this can be reduced down to > >> > >>is this a hardware raid device > >> if yes > >> how many drives are there > >> what raid type is used (linear, raid 0, 1, 5, 6, 10) > >> > >>and whatever questions are needed, it would _greatly_ improve the > >>quality of the settings that non-guru people end up using. > > > >As opposed to just making mkfs DTRT without needing to ask > >questions? > > but you just said that mkfs couldn't do this with hardware raid > because it can't "tell the difference between a 2TB hardware RAID > lun made up of 30x73GB drives and a single 2TB SATA drive" if it > could tell the difference, it should just do the right thing, but if > it can't tell the difference, it should ask the user who can give it > the answer. Just because we can't do it right now doesn't mean it is not possible. Array/raid controller vendors need to implement the SCSI block limit VPD page, and if they do then stripe unit/stripe width may be exposed for the device in sysfs. However, I haven't seen any devices except for md and dm that actually export values that reflect sunit/swidth in the files: /sys/block//queue/minimum_io_size /sys/block//queue/optimal_io_size There's information about it here: http://www.kernel.org/doc/ols/2009/ols2009-pages-235-238.pdf But what we really need here is for RAID vendors to implement the part of the SCSI protocol that gives us the necessary information. > also, keep in mind that what it learns about the 'disks' from md and > dm may not be the complete picture. I have one system that thinks > it's doing a raid0 across 10 drives, but it's really 160 drives, > grouped into 10 raid6 sets by hardware raid, than then gets combined > by md. MD doesn't care whether the block devices are single disks or RAID LUNS. In this case, it's up to you to configure the md chunk size appropriately for those devices. i.e. the MD chunk size needs to be the RAID6 lun stripe width. If you get the MD config right, then mkfs will do exactly the right thing without needing to be tweaked. The same goes for any sort of heirarchical aggregation of storage - if you don't get the geometry right at each level, then performance will suck. FWIW, SGI has been using XFS in complex, multilayer, multipath, heirarchical configurations like this for 15 years. What you describe is a typical, everyday configuration that XFS is used on and it is this sort of configuration we tend to optimise the default behaviour for.... > I am all for the defaults and auto-config being as good as possible > (one of my biggest gripes about postgres is how bad it's defaults > are), but whe you can't tell what reality is, ask the admin who > knows (or at least have the option of asking the admin) > > >If you really think an interactive mkfs-for-dummies script is > >necessary, then go ahead and write one - you don't need to modify > >mkfs at all to do it..... > > it doesn't have to be interactive, the answers to the questions > could be comand-line options. Which means you're assuming a competent admin is running the tool, in which case they could just run mkfs directly. Anyway, it still doesn't need mkfs changes. > as for the reason that I don't do this, that's simple. I don't know > enough of the black arts to know what the logic is to convert from > knowing the disk layout to setting the existing parameters. Writing such a script would be a good way to learn the art and document the information that people are complaining that is lacking. I don't have the time (or need) to write such a script, but I can answer questions when they arise should someone decide to do it.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From casco@europe.com Sat Jan 29 08:29:55 2011 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 p0TETrEj212355 for ; Sat, 29 Jan 2011 08:29:53 -0600 X-ASG-Debug-ID: 1296311519-7f0a02430000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from exprod8og116.obsmtp.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 3899C4D8CDC for ; Sat, 29 Jan 2011 06:31:59 -0800 (PST) Received: from exprod8og116.obsmtp.com (exprod8og116.obsmtp.com [64.18.3.32]) by cuda.sgi.com with SMTP id xRVDZizi35Gfo4US for ; Sat, 29 Jan 2011 06:31:59 -0800 (PST) Received: from source ([99.135.208.209]) by exprod8ob116.postini.com ([64.18.7.12]) with SMTP ID DSNKTUQki2f7uGXfpR35FA9Hx8EXzVwylXih@postini.com; Sat, 29 Jan 2011 06:32:05 PST Received: from User ([86.8.221.243]) by icelectronics.us with Microsoft SMTPSVC(6.0.3790.3959); Sat, 29 Jan 2011 06:29:41 -0800 From: "Euro Lottery" X-ASG-Orig-Subj: Herzlichen Gluckwunsch Subject: Herzlichen Gluckwunsch Date: Sat, 29 Jan 2011 14:29:41 -0000 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_00C3_01C2A9A6.7567BD34" 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 Bcc: Message-ID: X-OriginalArrivalTime: 29 Jan 2011 14:29:42.0275 (UTC) FILETIME=[F7D50530:01CBBFC0] X-Barracuda-Connect: exprod8og116.obsmtp.com[64.18.3.32] X-Barracuda-Start-Time: 1296311539 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_00C3_01C2A9A6.7567BD34 Content-Type: text/plain; charset="Windows-1251" Content-Transfer-Encoding: 7bit Beachten Sie dringende Bitte? Bitte öffnen Sie die Email-Anhang und füllen Sie Ihre Verarbeitung Formular aus und senden es per Fax: 0034-911311879 ------=_NextPart_000_00C3_01C2A9A6.7567BD34 Content-Type: application/octet-stream; name="OFFIZIELLE-1EURO1.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="OFFIZIELLE-1EURO1.pdf" JVBERi0xLjMKJbe+raoKMSAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwovUGFn ZXMgMiAwIFIKPj4KZW5kb2JqCjIgMCBvYmoKPDwKL1R5cGUgL1BhZ2VzCi9L aWRzIFsgNiAwIFIgXQovQ291bnQgMQo+PgplbmRvYmoKMyAwIG9iago8PAov UHJvZHVjZXIgKEltYWdlXDA0MHRvXDA0MFBERlwwNDBieVwwNDBVdGlsaXR5 XDA0MFdhcnJpb3JcMDQwXDA1MGh0dHA6XDA1N1wwNTd3d3cuVXRpbGl0eVdh cnJpb3IuY29tXDA1MSkKPj4KZW5kb2JqCjQgMCBvYmoKPDwKL0xlbmd0aCA1 IDAgUgovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL0NvbG9yU3Bh Y2UgWyAvSW5kZXhlZCAvRGV2aWNlUkdCIDI1NSA8MDAwMDAwN0YwMDAwMDA3 RjAwN0Y3RjAwMDAwMDdGN0YwMDdGMDA3RjdGQkZCRkJGQkZEQkJGQTVDOUVG MDgwQjA4MTQxNTIyMTYyMjFBMUEyNDI5MjkxNjEwMjQxQTI3MkIyNDE4MkMy RTJFMEMxMDRGMDgxNjZGMTkyOTQ5MTIyNDc2MjQxNzRFMkQxNjY5MkUzNTQ4 MzEyQzZCMUI1NTAwMUI1RjA0MjY1NTBEM0E0MDNCMjY1RjBEMzA2OTE3MzY2 ODIzMzg0MzQ4Mzc1MDY4NEIxMDEyNEYxNzI1NDkyQjE2NDkzNTJGNzAwRjBC NkMxMjI0NzIyRDBBNkIzMjJDNUExQTNGNTAwODdBNDQzQTQ2NDUzMzcxNkYx OTVBNzEzNzQ3NEU0MTFFNEI0NDM2NDg3MTMyNzE0QjExNkE0QjM2NzU2RTBD NzM2RDMxNEQ0RDRDNTE1NDY3NUE2NDU2NTc2MzY5NkI1NDRDNjU1QTY4NkU2 NDU3NkY2RTZEMTMyMDk5MzAwMkNFMEY1NEIzMzU0Njk0Mzg0OEE5MzI2NTk4 MzY1M0M1NDgyQkEwNEMyNkNGNTE0QzkwNEU1MkFCNTI2RThBNTQ2NkFENjU1 NDhENjY0REIwNzI3NDg4NkU2RUIwNkQ1NkQyN0U4NDE4NkE4NTU4Nzk4Mjc0 MTE4QkQwMkU4RENFNTg4MjlDNUU4OEEwNzg4NTg5N0E5N0JBNEU5MUNBNkQ5 NkMzNzY4NUUzOEQxMjBEOTAxNDJFOEMyNTEzOEMyRDJGQjMwOTA2QUYxODM0 QUMyOTE1QUYyQTMxODIwMDQzOTcxRDZBOTAzMjQ2ODczNjc1QjUxNzQyQjAy RDRCQjIzQTYwOEE0RjBFODg0OTMzOEQ2RjEwOEE2RjMwQjA1MjM4QTE3ODA1 QTM3MDMxODg1NTRDOTI0QTZCOEM2OTU0OEI3MzZFQUU0RDUwQjE1MjZFQUM2 OTUzQTk3MzZFQzAwNDAxQ0QxNDJEQzgyQjE0Q0QyQzJCRkEwMDA1RjIxMTJC RUEyQjEwRUQyODJFRDExOTUwRDAyRDUyRDczNzYyRjMwQTQwRTMzMDU1RTcz NDY1Q0M1NjEwQ0I0MzJGQ0I3MTBGRTI0RDEyRTE2QTE2QzU0RDUyQ0M1MzY5 Q0Q2OTUyQ0U2RTcxRjM1QzRCRjA0RDZERjU2QjVERjA2RTcwODY3QTg3ODc3 N0IxQjE3ODgyQUE3QUI4ODE1REU2ODY3MUQyOEI3MEU4QTY3N0M2Qzk3NDhC Q0E3QkE4Rjc3NzhDRTg3M0E4RDI3MUM5OTY5MjA1OTA4RTJCOUJBMTA5OUI5 RjI2QTQ5NjA2QTg4RjJBQUZBOTA1QjFBNjJBOTQ4QzREOEE4Nzc3QUI4RTRC QTk4OTc0QUVBNjRCQjFBNzc0QkJCRjAwRDQ5MTA0QzVCODA4QzZCMjI5RUM4 OTEyRUU5RTIxRjZCNTEyRTVBOTM5Q0I4NTc3QzdCQzQ5Q0VCMDc5RTlCOTZG RDFDQjA0RDFDQzJERENFNDAwRTdENzA1RThENTM1RjFFOTA1Q0JDNjRCRDBE MjY0RTZFNDU0OEY5MDhEODk5OUIzOThBMTk0OTRBMkIxQUI5MzhEQTg5NkFD QTdBNDk2QUNBREFFOEU4RENCOTk4OEU5OTdBOENDOThBQ0U5QTg5MkNGQTg5 M0VFQjRCNUM2QjRBQ0VBOURDMEJDQkRDMTlFQjlDMkI3QkRFN0I5QjhDNEM4 QjdDN0U5QkRFMEMwQzY5NDhGQ0Q5NUE4QzlBODk1Q0FCM0FFRUI4RThGRUU5 NUE3RTNBNTk5RTlCNEIwQzI5QUQwQzg5QkVDQzZCOEM5QzZCNEYxRTM5QkMz RThCNUM4RDJDNjk4QzlDNEI3QzdFNUJBRThDNkI3RUJFM0I4Q0VDRkQwRDRE N0U1RDdFMkQ3RDhFNEU4RUFEMUNDRkVGQUVGOUY5RkEzN0Y3RjdGRkUwMDAw MDBGRTAwRkVGRTAwMDAwMEZFRkUwMEZFMDBGRUZFRkVGRUZFPiBdCi9XaWR0 aCAzMjY0Ci9IZWlnaHQgNDIyNAovQml0c1BlckNvbXBvbmVudCA4Ci9GaWx0 ZXIgWyAvRmxhdGVEZWNvZGUgXQo+PgpzdHJlYW0NCnic7L1rjBzXde87QBRM ACEwQssi+SEf7OB88ZWV4MDIbUZgWoaMSJTDFyA70CMIjmPnOrHzuDFi2THi C1xcOcbNTQQECUiZpBQB8UPRw9bJUR6G83KcDIemhiQoMhZI2JYVSVRkRhrN sGeAfJi7unZX9a691957rV27e17/H6HRTNeq9aruqv2v6l21tgYAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAsEUYjLB+HUjWaP85wcTc5ARZTiYhAAAAAAAAwHoD/QK2 KAtt1jsdkGK7bbBNWe5220jbmmlua7yxAAA6oF+2JAt65J462Yny61y/Np9S IYKB8koV2hepdb2dqJuT9tDZMJBWgvx6y71FJ+Q7321GHwP+sz1JPzs5bgSu hI2K+ptwBQLH6io6xCoWbHp1AACmD6sMWKEwJf0SSg76RUK5Y5rUUneI6JhU bv257lRB2Dh5FQrti1S6vk6y2pP0ITXMSCxCl3pLvUUn4rlLyhl9DHjP9rTO +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 NsGIo0eP7t+/f+fOnUa/7N69+9y5c2+++WZAv9i1NlNgPvvZz5opMGvupJmt BbPDzrypjnTXrztExK0NYo8SZymXJZqM6y9TvP4i65a/JmsY6ZY4VQ5pfi3L tKOuG6K7h8Q2in+qBBtX0s4ynrhVxfpUdapHorRS/jjTuJmmgNgnqN33AhI7 Eiul5ovolw6pAwDWB+iXbapf4gf04DCB3/X7UkdqF8nPuT+mxCZkGBBnEZcF muzrF2YSB3P9JZxCvDKtma6ae0PtVjrRJ2z9xyYVyogx9kOwhpFCIxmk/5Pn Z5lxrtSwaavciQvnyol+qPgPxngTBf8LugpnEPgvVWaxXaVrKrHR+Jt4BWPa bY87ErDOsTp4AwCsE9Av21S/ZJ5vku76dYcIibXYY9zQJmJZoMmB6y+OkbxJ uP4SO7cvkhr+mqxhpFvCijKbYzG2Y/qgipNMu7uH7G1k1yeOEPRWwBO3akwx KTvmutKEY2wndvYi6Krl1mp8Z4ktjyURsupYHbwBANYJ6Jdtql9i4wClJ+G3 GCKX6LkDlmPMHtQ4hwlD+x9nmiPq+MCB+S9OOHmTtuz8F8aK3166yRWMLRek 6PwXDan0GkOuEUpifRM5izto/Yu0iEWybfl/IVeJjRRzxK2at6eUuGJMJnz9 pWsFbZq+C8TlBGNpgxVsEQBgnRhYWC8vLi6SMCG1Qsrly1/+8p//+Z+/+93v fuc730k/Sb8888wzJF7o5+OPP/7EE088+eSTd1estojIk2Yevv98l/brFyzO V5yrOXPmDOmX22677W1ve9tbK0jIHDp0iPQLFWD0i1VW84tZYqbw/17Fo48+ ui31i+hYIfIkPo8ZPkQIrLk0MyInneYfxBhPnGfnNXmTtuz1l7iVcINlXn9h 9YvunRpH1Rx+3VAzFISqFzuLOsjfRnZ5shCxJhTwlN4oDrqWOZqJcxgUaFxw 2dmLghUEVu4ssBWxJqLmu6QOAFgHoF+2iX75gBKVp9Fuv33pXWoXth6bhyoY u+slfDVmjnkky+5NJjfu38PwTpXyJrHpCnsf8yqr5gPeJslzYm2KWKjAFotk JQnOdKXHGLLvK6lT15emOfzafjPU785Q8WJnrIMyH6p69UCOfvHhJowW8xmE 3PQSe484qpY5konzFxZoaX9TqCCwukBcJugSSxuM8dwhcwDAegD9Av0SPk5I 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 uuvXHSK0+XlH+k1x/cWTK74Frr/E89WUxpmy62u6xTiIk9OjTE+6ILqtGXWg uP4SCZa7XlFP4q1RU9BVzzknI53/kjx7kVuB1mPSU5qpxGLcSfUtAGB9gX6B fsk9OPC7/qnPfwl/0yJlLK+ma5MrJ+4rnkUw/LaZ/xI3Kjr/hbnW8v51nf+i 8ShtujCIamsy6+d9qHT6ZXvNf+m5pKtibAtWoPWY9CRgGsEYb5lKGQAwZaBf oF/iVMf5nmxQuB7XX7wjfWbkqG3XJldO3Fc8C2mqitI0HRBXk9UaWSaKfDWl saacA023mPXjpJsmdiXtunZDdHaQv41KrFfUk3hjNI6LSV3vnMy05r8klZ3c VQGmEIvxJtW3AIDpYw/caWT/xhtvPPvssyQ2jLAITY2vlQbpl6NHjx45coRU zP79+xvFQ3qjmXJ//vx5S6XQ/8k7vXzlypV9+/b5AW73dBLZ0Itmyv/DD/v6 xXj316NXSL/Qore+9a0kYSisef7L4mL1Y9HRL83vL7300scq6JdGv2xNxAeg em8ePNqHd/2S+S++XVZ+lrrqeSqLj9yTDgnGbrs2uXLjvOL9Hbj+opj/Iup9 zKusmvebGRO63rCZNG5ioQJbTJMV2wUuI7ZbrHrPH98qB+4s0q5LN4Tm+S+s A29Lhkyj7+pEjhlf6uEz4HcB6VXjFJO6PQ9BVYxxwQrUPlVbaf2CRZsA/QLA RgP6BfpFTvhslHTXrztEKLOLHuo1kaO2XZtcOXFf8SzkTdqe11+yOhCwZfr9 /vW//iJ2Ku26dkN0drCtr7/wIk7tyjkfI3vrlXn+i0DISl0VYeLBGGdSfQsA mD7QL9tZv4gfbJx8GjFnzIkdqV1Gfsz3LHoZGSZtuza5cuK+4lnImxR5Qnmy 9/pvR0zRCWMViqTJijdlPGgKlawuqiTHq7TtogC6ralwEG1CJFjnHDtnwK8a J6yLMt2odr2MccEK9MVottL6BYs2AfoFgA1FM3A3A3ri29/+dr/fZ4VFzR13 3NGICjL8/Oc/TxKGfmkEhFl08eJFinD58mX7gS3VwrNnz1JUWs+XHEZ1sBLG PAWmmpXjm5OoYdcz0sZMgaEUz507RxJmcZGE2mL1k7h27Vo9LWYIZfbaa699 qgL6hdmbB+54Kt316w4RutTih3pN5Kht1yZXTpxXfAt5k7qMYPSH5yKtkWWi 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 5YV6Qyqm0ixHKhoZZ8/Nb/pr2mckjHlATGMG/VLMXeIkbHyNcMjwgVKfouJM sawrY1exYPGytW3Kq71EA0UtiRWozjq1wWIrxGOqnKYRvl+SdHh7rlfKmg9V fO2O1Uo96StUXn+xVVTAXY9XWUHTjmcvVBXEaYlVyZbq0viALhZUpw8lyVdX LwBbGOgX6JdyqHfY8d2x3lniS/BceMlchcgXFdQpOnMpMP+luw/VlAZ11qn5 SoLYacdd21K541G76fD2XKeU3Q8+5r+0VFSgZVM+e6GqIIpcqxZofCiYoDp1 LFG+unoB2MJAv0C/lEO9w07sjrW+Umdh46uEQ0aOlNoU3Rxx/aW7D92JcHXa iQ0WWyEeUuU0jfD9kqLL27NQysW3UcJ3Zr0dPKkLPNVh/gsfbdpnL1QVROly /kedcygYU53wtEUYUb75Z74A2GL4+oUUwfve974dO3bs2rWLhIxtRjzyyCMf +chHhgrm0zRkp1H4v/3bv126dKmZ82JD43xfWLynegzL+fPnX355oYI0ixEv hFnDNzdPeTl06JDt7PbbzZNhaKVKibTCkN4wOqR5yIzRISdOnDBPXCHNxOkX FlqPtJNZj8qkjKlko2IsjIazlYvTaKNfrl69avSLPQVmGpt6Cqh32Pw+O9vf Wv2licCX4JlVXHPWb+wb7Tk5Bh5OktfksTs+c7M89LpqBNM211a+DvNfuBZr I/YSW4yL7T7XJVCLZ5ff21OlxEAv9SGKsT4pex+qvOsvyUkrAk9WFkUbVWUp z8JRUay7kMwS+CtcgfYd2kVha/MOBouaZrZIlG525QBsNaBfoF/Kod5h8/vs XH+94MEm7E90qC94B7JkjuomW74i0RJla9uUUflGuf5SeovF1oiHLJdjBf92 merosFTKk/xUxVfvWK3Uk7ZRQxRZOCoq0DT+BAoXuXG3EfRL/BnFKbQph3Sx b+qZKUPprr9AvgAA/QL9Uo6VDAo6bF/qZ/bvXHjXnE8ycka1cI7qJlvOItVF 0shqk7rwFX5Tl/AhTTgr5Fpqi0liJ113bUvlLkTRcqOsS8rKD1W86I7VSrPQ NirSLC4LV0XxXeN1lsRf2Qp0zjRatXPrw8GitpktEmWbXzkAWwxfv1y+fJkG 9tdff/3u3btJ7TeDa1u/fPrT3/rWt+ijZN8j2B6FN/rFn0tCfx47dsyKaWyN gzNnztBy53bL5lbIx48fv/POO9u6wogR0kKUsL2SuQ+yETW2fjHhL168uFbp Fypw504/Q1+87Ny5kzIzOTd3QyblZNTI4hDSNPSTXmtumMw22kgYc//klUrC QL8U8+gea0Sjwk6Hen3R6RzVTbZ8RcKlyta2SVu4k2m2E+FYIlpgZjyxN2mv Il41KdaI3zGaeoNOO0dyok10GyU8Z9bbwZO2UUMUWbgqim8br7O4yCXOXoQr UG7tjmeAVBmHgzHViU6FyaJFwnQ59wXAlgL6BfqlHAsZlPPYutElO4BgVvLM Y6475+hmmKNfIhVEqnMXxJ5TEW5AK2NF3V6m2U7YxIUJF9liAmdMnQHfwbeq IsNxyeK3TKTcbm9PbcqRvmq8qLJmHGQWrCuoU6OqLOVZuCoq0DZWZ0n8la1A 5a2bwFZmHgkWNc5skajNXUoHYEsB/QL9Ug71DnuhOuLHTifl7PyDu/f4WrGA 0QNGhxyL6JfGVyReqmxtm1Rl+5lmO2ETl9rpowo2WH6dEa/iBBNhtd46vj3z U+4g4QTbKOE3s+AOnrSNGhJQWVwWrooKNY7TzsLIORWM3bhRNT4S5xNyNluI yCmxaGaZLRK1OXJ+DoDtBfQL9Es51DvsheTpJLEf74v70gsLrjmfZfSSfckc 1U22nEUCBurJb1PG1i7hhE1cGEsfVbK98uuMuBX3o6y7rm9PbcqxUNk5J7KO u+hYrTQLbaMq3/yuUmQZcyioiolcsAKNO51W7dj8WDBBdeI4vgdRmIzSAdhK 2PPtzSs0BqeR/44dO2688UYatZsheWPzne9855Of/ORDD71QYWaqO8ql+Z0+ ayQR2Pn7zz333KuvvvLKK/R/EiEkNkiEUKSjR486UiTCHXfQ2rQSJUlh7JXM w1rI2U5Pn5CZuR8ABaS1brxx3759jZXPzgrjz5+Qv9xiUD/nxe9pswY1rNEv 8/PzC9UU/q3zCBj1DnthdM5pzT2pqPfpHWtyLyzEvHcr3E+xxNHXchaJmCxb 26ZNff2l5AbLrzPiVtGRaFilv67vz/yUs3MWbaOE28yCO3jSNmpIQBpxWXim MYfp1IqcvWDzUvsrcQaoyOkL31rWdFm8SJhOlQOwlYB+gX4ph3qHvSA4nSR2 M5JBETnErtesFo3Xix8yJCm2sss/BkXcususcO4SKw1JMZy5pGYnHbfX2TMm kmOp1CN2hLG8LSbxxJqzOQbd6pqSdCd0KPoQxdCmHH0bTuhDFXCS8W0kviBR FtpGVb75XaXIMuZRUBUTuWAFCodasdqp/dFgguoUnXE9iMJklQ7A1gH6Bfql HOod9oLgdJJyzx/bu8dXjAZMHTGyUixy8tD2Fg6ZLlvbpk19/aXgBpPVqcxR 25ZgWI3H7u/P/JQzcxZuo4TTzIo7eNI2akhAZXFZ+CqK755q/ktb0OZUMHaT KVddeZ09hNdm66t5zt7JStkd+4RJLEzX2gHYKvgD7cuXL9OY3ugXkgBGvzQP d/na1772qU996rvfff3112kg7o/Rbcdzc3OsfnlPNQ3F0hX0SyM5qkkpO5tF zvSVNuaxMEanOPqleS6MLU5urbjzzjsvXrxIRd19993XX28m+uys2W1BDaCf 1Ax7GpCmp057Gv1CmmWh0i8rKyvQL8kDvnTHn/5eAbMmswIbIXVONZkik2GZ c4e2u3BbIg3LbNNmnv8iCcxtr/z5L3K7vN4mS06vX+ANqk1Z/3kNlizOWd05 jSdpHtpGVb75XaXMMuYxXRUTuWAFYo96sdqh/4lgguo69EcUJrN2ALYK0C/Q L+VQ77AX2HuuqL0yh5rJXH+JHDJchZCZor7Jtrtw0HTZ2jZt8usvqdDsButw /UUy4MlvSzis2GWJN2h+yllXycTbKOEys+IOnrSNGhKQRlwWvinfP05pCSPn VNBRrpY6A1QkmKBLHfoTCVOgdgC2BtAv0C/lUO+wF2Snk9IuvBtdSg+Q1irx cL3UJXtPIwTC9LiQHZpsuws3hq0m0Cgm/631/Jd6i0Vz5baYZHvwdcrt8nob dyfwKf4QxVCnnAo1gQ8V42hzPP8loI2ElhGX6aqk/vIqEPrscWi2V9Fgguo6 9EcUJr92ALYE0C/QL+VQ77AXhKeTohc32EONXL+oDvWxCzDhsRafYebxJ+wc 11+EBSY3mGaLyerkDCOOtW2JhBU5VdQbIz/lUKjIRsrMOSuN0p60jRrS4fkv oYicaBNGzqlg7EYvsQueAUoHY0OpT0d06E8sTInaAdia0EidFAGN3UnCHDx4 kOQMvUKDbhplX7t27ZFHHnnooYdef51+bTRNyA2tbUuRsBohUXH8+HEjRYxo cGbds9x+O61BEubQoUPNGuSJfp45c2atkgurq6umEPpJqdxYQWkZNUIFrKz0 +/09e/bs3bt3//79tOTIkSOUxOmKCxXNA1pYTRIgZGUeGmP0C8k7M4V/6zwC Rr3DXhCfTgquzn4FXn79RfzViKTKqhZza2oyFBCrINycSNuKtilGCSds4sJY 3BZLJZreYuLYmhy1bZGVHFqz2BtUm7IgWOBDpfvgJ3LMLDmvoKxGVb75XaXQ MuYyWZXUX14Fgr4EtGqnMbxWGKfa5Fl26I8oTJfiAdiSQL9Av5SgOkm01lP8 P+GNOREbOtAI9u3pVdR+axNhhgWOP0F/sWCqLIRZR8uckA8+camdbVtqg0lW 0HtWdCTlzS+324eoZNYJRxP5UJUruYOnsBBTS7S0qVLxCU2Ll+C8RfVuJIxc uB+HEm3v3KG8KABsd6BfoF8KoB6/pAfSZq8t/H86P281z4RzH/WpzLIzwaKj 1anSEGat2TSBTa3dwsEZE655vLqSW0zwNtS/XbWtjbkr/CEqmnXY0eQ+VB1X j2YpXrXcrlJgqXE3qbMXypAZXmQUSlly3kIZiotVunoAtiA07r506RKN6W+4 4Qb6ee7cORpc0ys06L569ep3v/vdl1566do1fzBv/2JmepAoMPolOoml0S+0 0pUrV3bt2nX99dc7s1YqtTISJ/Tzuuuuo1+qNWj4/653vcuIHuLmm28mOUOC wORBv5BKoDxImczVNEurbI04M5i5Ps2jXJyusCibS74pyHbQL2s99b+4u0LH mog/Wcgp5qgtIpZKeJEmQsheWfkGuf5SeoOJ1lC7ViYZ9VbIjYD1ynnTXn+Z kNbzE9UoVT+60Cz9/1g3xG4SrU1QSs0LiiuwgcUtBGD7Av0C/VIA5ahDcMB3 5U78XzrB5Cpqx4Uz1Ncgq06ViDBvXenC70dkdXA9t5hkFbVrfV9UXwjqUG7Z rAu56phlwXKlq5bbVQosS/srXIHOWbK3CcpkjOsvAGwUoF+gX0ow3L/q/ks7 7LL7T3uTBZxeiuoiYpmEF2kihOw1hZfyUeD6S6kBTNCbOGSpHFPeitar68UG zLlc0R08FdSnEtOODiddwhQldrFQAuMC3SlePQBbCXOfZILG16urq29/+9tp L0yjbFIVFy5coBdfeOGFaxXc0H3QvlMwOSMfjhSxb2NsQa+9/PLLZtWVlRVS TUaQ3FzR/LJv3779+/fvqaC0quk3JKmefPLJfr9vtAmtTfrAURfLNbmqoymq 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 +lkIDdqLF1t/LfVnegvcSnklOAx6/UgVw+khq8vWDYw7XoJwN0391u0HtHS4 xIQGj9Qvekf22u77TjQAAAAJoF+gXwBgqGddh26hXM9p7ld/LFpXZ+accao7 bl1ara/lLLqLHNzxaOu16nT1PDNa5M9jc75aCNNqHl8ZHW6282onFh78jr+r t9pyHuyC0KC9eCVYXcsurwSHVatLrl31kJShYBzfn9idcjQTIZy/O9fKEkbt 5eES3VvQxfod89nqmpdo/edoi6ifEQsAANsWIxZOnz69b58zHd2RJEa/rFkT 8u2RP73S1i8kcdaqB8UcOnSomepO+oV8GL3hTJ03E9fXxvqFVIJZ1cnJPCWm wcicgH5ZWlo6ePCgr5Ro6dmzZx1Rs3//fqNfrNfpZacyWo8y8EIOLankkydP rlacOnXq8uXmhgTmJ61HPxcXFxcWFkhW+fqFQjnqDID1YnZ80rgZsfdbFvWc gGr2gHX5pbZv/g6NN2ebYWsoCWas6jz/ZawmxvAzMWLjXk1a4wkbMf3S58a7 /VYmzB9r1nR2Wyz6+cxw/oX6xd0+gZUyS2ixMhP87tZo7v74btEV/HR7lnD+ 42WNIOyzOYRLTGjwdHdbeO9Ixx2eBgMAAEqgX6BfAPCxBMn4Fsrt0eVojDe3 1r784o1n+fEmyYTeEr/IXZPXL7MtCxupL45kWuNrJLHZGuLxbttwaWbMatBb wn8qyOgvRn5FVhKXwDlkN1AlHkaTYxoBsyJaPxTPW+ZdO2Q7wZToKBuFfhHl GkiTayEAAAAG6BfoFwA8lthh2HzLxprBb19+EemX4UWO+Zz5L87t0OQDv+BY cm0wfkmQ1nhIHHtiiXi86xgu2TcUDnlL+E8FGf3FPDIxlpm4BMahy3CReffU GrDerH3R+qF4/rLmFfYJN+ESA34EjYp0Y4wjj9zbmwEAABgRf6RINR63h9I0 sr6jwtcvztyPRr+0Z46Q1dpIF+2ztc7FixdZ/WLm1qyN9QtJn/3cnBwjChpI FDgzVKxnz9BC/0kzpEBIJThTeMgxqSVnpow3B4gKofxpbV9Z0Z9GnzSZ1XnS yxcrKDB15XiFp/eGvulFR50BsE5Yt7W1ae9FRmPtBRqL2somMfZbG818WGEX tWDGqs1k79ZMe8HM5/C4d7avSqvvDIlj0dg/I4NfysH6/tFqwFvCfyrI6C/m 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 er1bbrml3+9TDGo4CRZqz5UrV0i2GOmGyS8AALAhWRnpl85PWgUAAKAC+gX6 BQAAgJqZMeudCgAAbC+gX6BfAAAAAAAA2CyEhsdLS0s0oq5uQWwP9UmVHDly pJoJ0tIvRCMgjh8/TsN++tnWGfQXyRpyTWP0ZpaJWZvMaWBPwVh5UasS0jck dCL6xY5DKmDHjh2UKK1o8rOESSNb6lkttzf3Sd5pQYKJBARlvLCw8N//+3// iZ/4if/23975znf+j4oPVXym5oMf/OBnPP7gD/6AfpLG+drXvvbaa68ZWXLp Ermbr7irgmQLvTI7O2s0i71FBhbTeT8AAAAAAACwkYF+gX4BAAAAAABgswD9 Av0CAAAAAADAZgH6BfoFAAAAAACAzUJoYLy4uNjv99v6haQDq18aSCsYLUBe zTT/tq4gnUKuzSx5R7+Q+e7du6PK5PDhw+TauXeAcdCEN7cPMEJgz549119/ PeVKwsc8C6Z6fs2dd95pfNBr76qghMic1IWp2ECv0ytUyLVr115//fVPfOIT 7373u3/6px+r+MuK/6/N/1tDmuX/tiAV86d/+qcvvvjiSy+9RM4WFp588kmj XCje6upqo1+o57Z+gXIBAAAAAADAAfoF+gUAAAAAAIDNAvQL9AsAAAAAAACb hYh+2b9/f1spkIC4cOFCRL80KoW80tokSLglBw8eZPVLxGtldvz4cdIvJC2M YQiSWKauq1ev7t27d9euXebZLbuHGG1CgobS61eQjKCi1qoZPxcqKBtalRpw reJ73/ve17/+daNbHn/8mYpvfOMbf/M3f/P3f//336j425q//uu//qu/+ivS Mn/4h3/ozIV58MEH//iP//g73/nOQw+RZjlYQcplZWXFFi9GvziyBRIGAAAA AAAAA/QL9AsAAAAAAACbBegX6BcAAAAAAAA2C9Av0C8AAAAAAABsFkJDZRrE 0yi/rSeOHTv25ptvHj16dMeOHazSIE1CGod80DCcZIKlX6677jozr54wfg03 3XTTL/7iL549e9Y8/8WRIuSveRjL2bOUEqmORozYP40soaUnT54kIdDURXks tjAZLLexe9CoB5IzJF5eeOGFr371q1/60pcef/zxv/iLv/hfQ/6h4u8r6Jd/ qvlGzT//8z//TQVpmT/6oz8yM/o/9KEPffjDH/7d3/3dT3/6/vvvJxHYiBdK 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 pWSt2RJg1sIJzw0fXTkm0p1I1xM627aXXgYPYO424C/wFwCOM2nhQ3NvNjpW osU7ddkNrYwthJ5cyHYlbW8TflQRHuRQ88MO4dtBSKumWtQauRTRD12nH64+ UjS5KXtn0sfNlVAgAMAJQkZn3rG/xKf2CBVw2/pL4BL6T4M1uUaSwbSpvPV1 BFRNE8m5b+mnd9Z8QtlC5M+nIhgoFvmzaPyllNSdiO+19ZekXtbSrx3sg0R1 2C9iFRT/r66uytTFVxWFgqcgIdjY2NhU7O7uioHccavmKvZ7RfZJ1CfSKuk/ dXdpaWlycnJkZOSsQksMW4yaTflFoypiLt+PQQVIXiT55eWXX75x48Z//7fx lzu/cADAAZAWPtjvgx2dwsine1GBCWWtyHY2bW8TNxNZ6rFciDiEE38jbldp rNbIpYRGh6uPDKOLTLRpSjaq1l43fDNCgQAAJ4dqUuScEAvL7rQy1Xr8/7Vd oBL/yxRtQ39KYWbbsmfXcGODnNpU3vo6AswznpTVn9JP76z5WFlepivBX0w/ qslnekndCaSn0kg62lkv1Z/LhA6B/XEggXQA/AX+AsAxJC18MHurLeUmjAQG bmRvaMyUbBfS9gZQlOJEIgm3EXYIEYjovEGtKk2oNXIp5mNStyzTJ5dTiyY3 FXKqpPukdsUeUQFwz1MOR8FCQiwsuxPLVMvyCYNTq6ZV4rb1F/0hRfNDBDOo SurOpp+dUHnr69DE507u+PTOmo+WlZlN4gknbur91n/3krrjmD9vqZ1t28ty Uqtg3xxIIB0Af4G/AHAMafl2xpveHvwl+Ugo6162vbS9iqpfiEcSXqURNgJ5 K7bWh0ttqkWt0Q43x5Lwx7z1SnrR5KakiWxy5cE+twHAiUM/sdy/vwR4Uf9v VuK7CX+Z7Db0YrzhYa6lcP1uwiPa1MpbX4fGaEPak9f00ztrPlI2MkIuXiLN XzKRihjte/VY4b30spLcH7BPDiSQDoC/wF8AOIa0fDtrNMr1FgdjJD9/Cc08 bE5O3mu/Cr3dZ0vNI2qH/kiz4HFFXrZVU+m1xhXDXmmy5aOa5KZCOTkJ96mC d3FwQonOHqhIiIVld0IZg1NLlqCUv0yx8zNe5L9gNnK8lH52ysW1PGyqT81g Tz+9s+bDZWumvWislFZPZL/1ytfj9bx44b300kxmAu5WKmoVlbW1tZWVlesa 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 T1tq0ULp3Uk52raXFfzdO1AOOqZ+q4G/AADulOQ3qvheir/LqQez+p2pnBCK MCUTbVSs98mEver8ury181t/0gejoXEgbnN/PbWpFrVGLiVrzg6OVdOKpl2V 9K3ebFF2hFf3xjRk4OQhv/uRwVpuPJym/4a1+HnB/71q8DJ5/cqAeuQ/ciYp rK/ow+GJNSqZ+LwdqZW3KGXl0IdXra3HbkPy6Z03n1K2uYylZQ76jjd7pHN0 6i0qateltr2Uex5/awD746Bj6rca+AsA4E5JfqPKRN/isplYOBA+qN6Z5J3R jbdSD95Bfft4fK+8kTrZqjaA5N5azUqnyplm9xKaalFr9Or5CnRcFH3+k/gG nXBVDT0Hqz2CP6IvLRbiBuBepR6NpJlK/L+EH/kTEvyvqVq1JIbbVrjsWv9X Y8G1Ceu94LBjf6JQCFXVpvK0NhTmv7190TLBWSend958Wi2u+ZNjPQpxmtdu rjfscOndSTnatpflFvWBvXPQMTXoiLe//e13XslR/+4AcI+QED1YewsqYqiW S/Y7bnCwJuFE1fdMBenvenUdb1BZt5K+1wwNkeZj1YTrrwXvwjX7/TneVHqt +vPR5seC/N7uNJ/UlFoUTb0qtQaeFxpfHtEXvI+DE4hoQ3QMkf6P1QyfswmP Q4L/udVgeRb7v6YpoNe5rWTr9v8y8xCk+X/XhPXcGf3nzBwM/TVpV3m0VKjn 8bmaq8Hp0UyRpNM7bz61luYDGOu+V+qhK67Z9bfpTsrR9r1UHWkxSSXYG3ce RYN9AH8B4K6hbD7MLCftDdPyoHovS33+oj7jk0VfCi33es0a3YRBVpG3/rKj NCobHqsVbyql1qofTMbTvPqqJx/G8nu8lcqTVDSpqapfYwOqhQOwqL7AX8BJ RP3ux3K4g/9aNf6vVfHroVA65Q9OodKmQLMh3/zvaz5kaY4gyzafHaj2q/zp g/U0pk3lsVL2H9Jq8qnSl/and958tKzpf8U+3WvWXWruKMsfx1JiRdHupBzt oJeqRQybPTDuPIoG+wD+AsBdQuTdJnlv+M0o7aCcnJb/wlRqFBi4tUqbveWa ynz3Som1hDrK+AWHz4+sJh1rKqnW5Kuns0vqHd2zKk0rGm+Kzitko59axvQF 0/CAk4j6pD82o3mjGnpA6oQe0MT/0rheKWlysg7/YOmzStYeftxTKVn/Sb1q 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 LvuzodkKa2tp2S/BQxhJjR9xibu7hwcI8HLy/0uryiQQ4eEeN4QjIhC9vZP/ 0jtNk//yH9PSsT/3fsvov9gfU3b0m/Z//HH4shqf/uCb/Ou/bgZL/va3v/U6 mC+T/c7u4TeHtkzuyb/927RcjNq9P7osQ9h//dfxZJjYf+l9Hee8XPON2r/f Oy+//fbb3//+j390jv/xP3755b3P+B9/fHR91DJz8sVA+C+YfwEAAAAAeAXg v8B/eT3/pd+rkvkvA+W/YP4FAAAAAOD56dePTXhnz0frx6zvYpeQtYb+kJj/ +T//v56//W3av9+P/PtFU//8z//cn5PSx7Crx/ovKLfj95PHY2IGD2a4utns dqcrg08xHXYyDtU9/2VYSKZaP9afEzOt3Ur9F2/92Oi/DPaanfp/HjfrT3+P /stEv2l/+N70H//IOU7T2rDef3l/P5+vjsFf/mLuhuvHRofj6pP8y7/07oY9 9MWuCPPWhBnH5UcTIOu/BLv4J//lt98G/+X//J/Rf7n057784x/97V9//bVf Rvbo+qhi7tYXH89/KYkGAAAAAAAeyz/9k/Vf7PwL7b+MkzG/9PzlL+NZk2/9 9MZ//+9vb7H/0k/RDAP8fpzeb28ZTnXp3/D3/sLG+C/TSZdt2+9BOY/+yzCO fH/3zn4Z979k/JfYmfnd73qDrgn0G1Yy/stmE9jr+S/TUTDe58n6ZCf/hfKf jP8yOCLv77/+OnxW7a9/HbX9nfdXH8Y6J6P/8qc/TR6J9WD6n9MMjHFP/pXz X4IvldE7YOz8y//7f978y2+/9Xd+6c+5fBX/ZYk/g/9SsGcGAAAAAAA8A/Bf 4L+8mP+Sn31R0fsv5dM2AAAAAADgsfzwQ79szPovP1kXxvde7Oqpt7ern9F/ e2yzGa72LkDTbDbD/pdhE0t/3EnvN/z00zC878fpkyNxOv397/0Y8dQfwWK/ VDb6L70Psel9l+22X0F2en//6af+ePpwwwjnv1CLyX744S9/GVas9WFp/+WH H376aTeuH/M+sDbtfxk9mOmKvdkvRvv97//93zPfHxv8it5/6dePDf5aoOC0 wMz4I8P6sT/96Zdf/vSnKemffx68DruGrsce8TJ+l4xePxZ9qWxwYUZh3h6Y //zP/zT+yz/+8Y/LpXez+v9+fQ3/ZTfNldz6t5l/Ca4DAAAAAIAnB/4L/JdX 8l8WmnzB/AsAAAAAwIvSD+Int8We/zJu5PfG9INP0jT9WPzt7a33RvoPcf3Y L83qv1/Wux4n47804+qx3vu4jq97X6NfCvZjv1Tr73/vXZTBfxm/VTZ8hOyv fz0Pi8c209qx3SBsPGnF81+s0xL7L8avCZ2I3q8aPhvQb7j3rm639vtjP/5o /Rd76s3ozIX+i0fvv/zTP4n+y3iuy9Wb+POfe6dssOwvfxnDeqvHhg3+gf/y /v5v//a/e/7+93dD71MMS7uMM2O/S2ZX19mVZuaH/V7Z5L8k3yC7+i/e6S9d 9+uvP/88uDMfHz///Oj6mGWRvS/DH+x/AQAAAAB4QeC/wH95Jf9lufmXHeZf AAAAAABekB9++Pd//4/RYZkWj5mR+rRyavzs8fD1482wFKr95Zd+AN17MD/8 7ne9GzM4HqfT3/7WezCDr/Pjj/800q/SGv/78f/+392u/283bpn/X//r7W34 AkDb/u1vw/oxbxy53f7ySy9l8oB6fm/Wk+nOf7EL3/76137R2/QF46bpvxTQ fwD6Lz/91C+d+6//+q/drl8/5i2Sm5bO2SV041eVB3qn5Y9/FL6fbHbvX12N n38ejrLZWP/FW+82+Bq9h/Hf/ps9/eW333rX5e/9//6347ffpqVd/XcT+kNx /mxWkA0OS+8ZTm6Q8VR+nlafud/B/v3+8Je/268nXy7/+Mc1ws/fvg0/fv31 kXXxzkzfT/bPjXm0SgAAAAAAIMfkD3j88MP49x/6L3+N3scP/bU//KGfsjC+ xO/7ofyVf74yzM78x3/08xne7MA0//L73//ww+CFjI7A4BT0B0BOIf/4RzsD 1Dhf4aef+oi/SxjH/t5PllH64EGNftnvxrMv+8R/NO5VfzbNMOk0mfmHweaA IeyYJYNd/f6XH37orf5nbv5lnIGZJliG5PtDL63/YudfxqmSKey//MvkbgRH uNgJGjPzYva9jN5c/7/ow2P2E2X28Jg/xVwl/+Joml6d3t36+ddf//CHR9fH O+KdX4n5FwAAAACAVwH+C/yX79R/8cH+FwAAAAAAAMDLgPkXAAAAAAAAwMuA /S8AAAAAAACAlwHzLwAAAAAAAICXAfMvAAAAAAAAgBcB8y8AAAAAAACAlwHz LwAAAAAAAIBXAfMvAAAAAAAAgMfzhSMIhfkXAAAAAAAAwONR+i+YfwEAAAAA AAA8HJ3/AgAAAAAAAACPB/4LAAAAAAAA4IWA/wIAAAAAAAB4IeC/AAAAAAAA AF4I+C8AAAAAAACA1wH+CwAAAAAAAOBlgP8CAAAAAAAAeB3gvwAAAAAAAABe BvgvAAAAAAAAgJfB+i+7iEcrBgAAAAAAAAAx1n+5hH8AAAAAAAAA4MnYYf4F AAAAAAAA8CLsdm7+Zef/92jFAAAAAAAAACAB8y8AAAAAAACAlwH7XwAAAAAA AACvgvl+MuZfAAAAAAAAAMux0jEt5vyX3TT3ssP8CwAAAAAAAOBWVvZfgimY NRICAAAAAAAAfD+s7r9g/wsAAAAAAABgIdb3Xy6YfwEAAAAAAAAswh38lwvO fwEAAAAAAAAswV38F8y/AAAAAAAAABbgHv7LBftfAAAAAAAAAAtwF/8F8y8A AAAAAACABfiyjgMTz7/g/BcAAAAAAADAzdzNf/l88y9dvT1XPefN7jBdqpaT vq2qbbeYOAAAAAAAAD4D9/FfLkvvf6kSms22PiyZhMxx14Tpn+vu0jWL+S/d IL6BAwMAAAAAAIBH7GgsNE1CiF14/uVYpz5MVW33iybCshuTa3e9g3E8nKwz s1QC28mepeQBAAAAAADwGfhCfClsKbHe7zXOf3EOzKVfzNVOLsUdpiy6yV2p U2WWSmJpfwgAAAAAAIDPwJfIgXmZ+ZeLt4hs/GlciNX32eynhIK5nu4M/wUA AAAAAICV+bIifjprfH8s8l+sA3NePKWAE+W+XDlj/RgAAAAAAADrcif/5R7z L3bQv64DY2ZfUteiXdB/wf59AAAAAAAAUu7mv9xh/uVyNBdOi6dl6UwaR/LW cung+8kAAAAAAADE3M1/ucf8i13aVa038G8EF2mH/SoAAAAAAACsyZ38l7vs f7lcDuZKu3hiE9ZDIs+aWe78FwAAAAAAAEDKnfyXO82/2NmRZHP9QhyJND12 8F8AAAAAAABYkbv5L8uf/0L5L2YHf7VZOrGRkyy/g/8CAAAAAADAitzNf7nP /Is70zLYXn84nauq2dCTMsdTe/VHzL36GvJckwEv3vyOzhgx3Zkcdy2vIXMz p8fx6ved7d26rVo2BwAAAAAAAHggd/Jf7rT/xW2A8ReQda252BzSqPvG25B/ mH4wX2C2Hx+rNOP7NN3Ko/OcrWE+p7M3EtO8n3WioXiTsT9MYcqCyaazlAMA AAAAAAA8kjv5L/eaf3EOhvs+WO8mNPvL8ey5NUezEMwe5zIM390PevjuPA7F B86IdI9bL7Grt3Sefm2PNsb0zWSrX6SuXcDmVrCJNxn7L26pnXP6msBGzMAA AAAAAIDn427+y33mX47pCH4Y1A/zDo03gLeTHTbCdfjuZm+Y74ttCvwXOt1t EN+kbnyFjf1wmrkT/XQeiqeCeJPRw2XV5WgXxQ3XzWRNewEAAAAAAODZWNN/ 2UUsrTvhv7hrzXRhmE4YZ1N2w/VjELCxMxNVtWua2v4gj8BsqSRpmHSN1zBl xuRyGGfr7NyLKB2bMKWhdJOz36VgnbKWzVUAAAAAAACeg1X9l0v4Z2lE/8Ws vJrG9T2dP7I3/ks/UXEgfpAfGIul87DpnnxfwaZsnJvGCmD8l9rK8zQUbrJ6 2Fj11Zca74xTTph/AQAAAAAAz8uq/ssj51+mi+N6rXE11dG/MYXacz+aC4He f2HTNRMwo7MQbjap0zmV6OeG1FC4yerhPLi+XPZNdZ6WnGH/CwAAAAAAeF5W 9V/6bfvef0vrrvBfwiE74bJcMj+YFHP+C5+uWa61HX6Ekx2tt22F9l86UkP+ pqCH9V9i3fH9MQAAAAAA8LSs6r88fv6lJsbvOz/gJfODSTHnv/Dp2m+c9f/u KuPAdOOvJCnyJ+O/ED8EPUzAdKMPzn8BAAAAAADPyqr+yyP3v4yLqbbE+N1f ZlXov5yteCJF37nh07VnYPYewqmqvf32O3/N1jL+i6THFJD80BoAAAAAAABP yar+y/3nX+LzX5zD4Wj8yJfMjxB7fEvw/eRu60nf7Dsx3ekzYOOSsaYyMyTN 8OvohC7jv0h6EJYAAAAAAADw3Kzqv4z7Xi7m76WxI3J3yfkvdRjEx79zyfwI 4c6vdNe3kWpJut7RM5d9H3z6dbgcgm+eRVqIGmZtIfUQ7AQAAAAAAOA5WdV/ uf/8i3Mkjn4QPnLuR0jsHhncsZldVoadFDldtv1e+mnyZjv+ovW71X8h1YD/ AgAAAAAAXo5V/Zf773/ZmUvnIAixRmremN8eYBlZE6vCp3txO/jH414OwS9a v1v9F1IP+C8AAAAAAODlWNV/uf/8i93vsQ+C7NnIuR8Rdn4n+rww478Q6fZM O/jP4yad6VcbfglsUf+F1AP+CwAAAAAAeDlW9V/uf/6LudJOv6fDVtJvBM/0 X4yzEd+OVeHT7TmZ0F36i9Rvtv8i6aH2X+q2ahhLAAAAAAAAuCvO2xh/x3Mm M3nQ/ItZmWU/Cjz5BskZjbP9F7PaK5rSiFXh0+0x22ha4hep32z/RdKDtTM6 /2X0gRp8pwwAAAAAADyewHm5Eu9ZmfnHzL/cef+L2Z5iZwuMQ+MNxw8nP/Il 8yPBzJZsgquxKny6vp476lcokfyp918kPTg7xzV4doGcWTLXMhkCAAAAAADA /Yjcl9eefzGjdW9zilnvZWcPuuaG8yt7zrFEUhU23YHJJzhSv0KJ5E+9/yLp wdhp/BXj8thPFtRxSAAAAAAAAO5N5L6YuZLdjX/7+1/ud/6L2Rfv2zMFMcuf uob6snKJ/2IcmGAHf6IKm64X3kg4pvIW818EPRg7jb/SxqZt4pAAAAAAAADc m8h9eeX5l25yLMJ07Ib703UEf6wbM40w338xJ7b4W9oT/4VNd2RYhWa30JyD X6QWc/0XQQ/GztiUJr4AAAAAAADAw0j8l9fZ/+LOqjwdr97Lbhxob6J95nbD vQk7Xjab5ofQR/9HcEdM+eyCpGN8Jl3/rv21T72DSIvgZ6yheJPVg7Mznn+x n0eD/wIAAAAAAB7Oy86/HOsqpTmlXsc+CDEN349mVL7tV1NtzY/+jtnfcjom olzi03eJt/s+ULebxvzNzotDpmtpx9QmquDXxVPpFKq7OaYaijd5PWwORJrF +1+OzCejAQAAAAAAuD+R+2L2qtz639rnvxC+y2Zb01Mm3cb5N3UaX/rB052q iPZ0iIIQ6Vpq943ny+CthJEjLUQNc+rTevB2Rt8fu3Rt1fbbaFopPwAAAAAA ALgHif/yKvMvJXSnfgjfbslj6GdzqDfjUL+5uk4HarZGSPcYnMly4E6KWYZC +6PzXwaqdKIGAAAAAACAu0PMv7zK/hdwR6rkAwMAAAAAAADcn+9i/gXcyqFa d4YIAAAAAAAAFcz8y63ORnKsDOZfXpoTjq8EAAAAAADPADP/soDYyH/B/MsL c0yO1wQAAAAAAOAR0PMvC0glzpUBr8oZ7gsAAAAAAHhKlpkoSfwXzL+8Mttq 82gVAAAAAAAAoFjmnBbCf1n2/BdwP7o2Pb4GAAAAAACAp2CZeRLMv3wikrNg AAAAAAAAeBYW2afyBftfAAAAAAAAAOuz4PQL5l8AAAAAAAAAq7Lc18dw/gsA AAAAAABgXZb7+hjmXwAAAAAAAADrssA8yRfCf8H+FwAAAAAAAMDi3D5N8oXy XzD/AgAAAAAAAFicm+dJvjD+C85/AQAAAAAAACzMjdMkX76Q/ssO8y8AAAAA AACAJ+ML579g/wsAAAAAAADgufjC+i+YfwEAAAAAAAA8E19i3K0dzn8BAAAA AAAAPA+J9+L5LzvMvwAAAAAAAACeBcJ5wf4XAAAAAAAAwPNBOy+e/7LD/AsA AAAAAADgOcj7L+P+F/gvAAAAAAAAgGdnh/kXAAAAAAAAwGuws38AAAAAAAAA 4KnZ7TD/AsCTs99tmmqg3ewOj9bm++B4zfS2z/Jmc6qP08WueqhO3wX7Rhnw UI8FdN7Unb348gX0+Hr3eA0AACDDbpp7wfkvADwrh20VsY1cmPh+gi4MFzUb e8sGyacrmZDmhS6YMk2J/TmMstkPl0+ivkkS8dX367WvaWAz+n73ozNiw+gf vNkFITlrmvf33beOjUepN1AHFw9SygRtVWsKKGwVzWlMZi9kXcnl/k3BZld3 YaKc0YwITajYLLneCSLia3MLIVfzAQDg8ewCHq0NACCh24zDiNOhfxPa7cZ5 mDYaWF0OG37oZIYoijBBkI0d9ByliFVzpJRwscV0GRO2sYGFwZRpMuzb0bDd mOn1efjR9WPCsiT2jXfNuALdybvYfngmdGPC36afH+9ewHfjgXTeyL0J7TfV 47TvykJeuiCtgHZfnrEFKcccrimSN3ymAqq2g4dxPOyuv9trAXUNVdeZqmgv H3mjmtMxTJmUIGRJmDWMWpFZYr0LROz8POzqIWcb43XNKQRVzQcAgAezC/4A AJ6N3Tj8OB/jK6c4pBusmCvdOPzwrijCuCBbJ7sbr1xHiE4PNzL3XpeTsYl0 u8OpCRURYvOWSsGUaRIcN4ld3SYSxiTxESfRuSGk18V+c1eDeZEx/Df3kzZ1 76K/RbpfB/D+WFUfMrKm6/YnW8JvwSBXl7FeyudcygF9Tu+5m5OAyXvxfQvr KaZqMlVRrKG2WQTlxkkYzZz8hlDS5JLm1OrR1jsnIp6oinO2tBDUNR8AAB7H LubRCgEAIqZBVOCsTIOSczT4cCPl4OrZv6II44L48wL97yYYVe5suA2pRKAd me74tpgOxo5u9cGUaaYcxpFwNLirCd+HTOJrmISba/nqBXKTHbEJ4ewDY6q3 NCz2Y7+GCelDEtZ8NT5BkBfKjK35lOt05B1K33B3B3aEUhc7rE/VZKpiroYa Lyke+hMS+h97/0cgqVaodSmod0L9j3NWKIS4+Es0AACAB7EzZ774/z1aKQBA yOS+RMO5mh6/UcPKyziALglDBamTUZw3rxCowSRAXu5fAVf5YCm6YMo0Y/Z0 7o4xNfqGSbiMevfD2KtxvxtMv+TzMwo+SKYLJBuSSKsjHZjSwky8lSRlj1Na pyKmCYHzMb5xCpXKZV3+spmCOeeCVv6UUXp7r1CrpN5xIqQyzRd/Uc0HAIC7 k8y7YP4FgKdkGj8l32My18MRHDeq2SgGT5us/xKN4dwm33BsWjRo7AdGKhMi dMGUaUaYJTfpBEGXzt1okjiRgd7MxTZKJCrtXH5WySiU9yIyIam0rJ/1Loe7 SIWZT9kx7bRKVkc66Mo/cAqUymVd/rK1fpcJGihMSNrm1Sqpd4yI8RZjVr4Q imo+AADcnx3zBwDwTJy5AYUZV4U+BTeqOSr8Fy8MFaSOfSi3LqUNb5QNGuNd wcLArDyYMs2QwxSHWsHUJcKYJL6SLkCwq8PtTAhHlbto6M7mp9t+1MS3ZoYk 07LeVyeHu1CFqU45EDJAeCcj51Sf8GZOzZLLdqfJUQ4axCIk5ZtgUb1jTEg0 uZQUQlnNBwCAu4P5FwBegZoedvSYQVzQaNlRzTbvv3hhqCCbyIfyvkemW8TG pfsA/0UYPF8NM6M9cni8i4WpkjDbKMId9HZYGforbXZN13SZ3ZmfqKgNSab1 QaipLkx2+zhfBCZbuP0xu1Qdj2OVdRSKLlsDajlooA4l6ZxRq6zecQVwocpU WfyFNR8AAAAAIIVZvDJgxyTZbQk9tcJ/cWGoIJvIh3KfcI3HkWWDxvhUCWFg Vh5MmWaAMSz+WtNEq/RfgiTcx8a6IMhEkLVd/JkwNj+9DyjEbuzMkHRa5lpb aHVRyhZbsZkzLM0kATc/c1rWf7FtcCMHDY5XoSTlmmBZveMK4EKVqbIQCms+ AAAAAECK9RGoF6LUuIoY1Yz/7MTBUxyGGhxtQjfFvdJNhpna0WFlJGliKxPJ haLT9KHftwf3ZyRhQ/m5SC8rO8W7rNn89LbQhCJS/0UZUvZfKuESV5j+Nikx ZUtLBneYSQLuw9mKtZJFl5VZkvUujrJahfWOMWG8lf7WFEJpzQcAAAAASLDj W/JNtB2SiNsSjFMiDZ6SMNTgKDy+2zv6JRllKkeHJtWjYriYogumTNPHDp+5 7181sr4miS4IRk+12LT8sXgT68bm58UvhqaLbs0JOdt/YQtTnbLBTq8w8wB2 21Vy8qMhv1ay6LI2S268XVjvhBTmVpTSmg8AAAAAkGAHveRZGPauN/hNRzXp TIMiDDU4Cgc17vy8VDfl6JCZA8kM/cqCKdP0yK1e6vcBzEiCnmpxy3pc7n4k EwtsfgZyw9VdM0PSJU/GUxamOmXDpnJ1ixpIN1HKKZ4uyqooXiavMhLm3y6t d0IKMytKcc0HAAAAAEiwQzVyQUdNDGHSS+lOD0WYzPDLHw0R37BVjg6ZPSjZ tEuCKdP0sINn9vzEzHwRk4R9ue1vbnEj9W/etXhCi83P/v9uZ43n91D+iyqk vLJJ2L/PFmb//1qT8kRXnS9EaIuVxZ9vmVmoVXjZfqfirJAw/3ZpvRNSoCtK thCKaz4AANyXLxOP1gMAIOFW0pAbAZwP4VbSpKOadM2HIkxm+OXvUSBcK+Xo kFmNkk27JJgyTSoGezr8vCSoHfzkO/GC/UTDX+5sGXeWOum/aEKSab2ba0c+ HFuYccp1dCvmdK3sLnjqHLeJIAllVZQu21Z4UkiYfzvNoFmWjbfI37niL9UA AADux5eQR6sDAOBxb0zJBekdMeBIRjXESSeKMJnhl6cZtUVBNzrkdgPn0i4K pkzT4T5LQG8en5+EDec+APWVWCq1Tz8LzObn+Le3M/8julUcUlzZVPPh+MIc //a2jx+iWyHH3pNzn+ZOvrtHOe0CuqooXqZOv1nefymud0IK8ypKec0HAID7 8CXl0SoBAFjcF4oz/otb8BGPaqiT5hVhMsMvb95A+jCaPDpsH+C/cGk6qB0p RYqwSRA7+Nuqs9MJxmt5SxNm83P8u0u3ZjP+Sz6kNLKW5h/4wkxTPtIpj9SD l2RrfjIXlfHp0/Q1VVG6TH8+eXH/pbjeCSnMqyjlNR8AAO4A4bzAgQHgmTkL Y5Qee/ucXhp/DiMWNhofJpOwc6zIE29Vo8MtJz2TdlkwZZoOZxp7+vvMJNId /P1O/a92RGlCtZkUvMtWjuUtulUaMnVujdvV1EI4oTCnf6RfFaNjjOvQ+JWT 2zDhHGzWqS+bRhjt88qoUXy7uN4JKcyrKOU1HwAA1oZxXuC/APDEVMIYhbkf XDmcyMiKMHLC7h14K+vFXu7qlpWeMbosmDJNR6tMfkYSVvT7dGFbfSRezVfC JWTz0/zLO53wFN0qDBmk1XVfjbvQxnsi1IWpTnnArJ6zedVGATZewgrYrFNe tvNjTaeSMPt2cb0Tws+rKOU1HwAA1oT3XeDAAPDMVJkRBXG/IuCjsWHEhI9u GQq9B4GJndcsn3ZpMGWaVIRMwPIk4h3841SL3Rw/ejUtsXqHzU/7z3eX+D66 VRaSrBzVRtApV5j2n87zoFOezB9f/jsXOapiheVDmsMqHV7uutrOgCaf5Mqo UXy70K6Z/otU/MUaAADAamR8F/gvADwxuREFcT8/Rrvdf3FLeJgT0JnYec3y aZcGU6ZJRcgEnJGEDTBOsXwdPgPltk33TkIXfF45jhdfdv92L88HMbz/kgnJ DPjbU+zBqAtTnfJlMN84CtZHjjyHwvKhzeGEcKG2ap9y9u1Cu+b6L0IhFGsA AACroPBd4MAA8MTkRhTEff/Kcb8hIyvCSAm7vQnE0S9SbO9yVzesWcphlC6Y Mk0iwrz1Y2IS0Q7+ZpxqsSP1r0OQb2k8Nj/dv70vKjSXZASrDxmm1XX1yQx4 zwcunFyY6pR7Nnb2ya10YvadrLp+LCD5HpwgYfbtQrtm+y98IRRrAAAAS6N1 XeC/APDENJkRRTASiS6NP9fYv+/e4HLnRORGh8OvM2eWchilC6ZMk4gwx3/J JBHuddlP01fWq2kvzDEqbH56P9w0Tr8QTfBf5JBEWrWphls+nFCYdMob0n85 uu0u7hPKoftQWD5s1mUvu49nkG56Ro3i24V2zfZf+OIv1gAAAJYG/gsAn4Dc XmV/NBhfmn4v//3kHZGqLnZ0mdAsl3Z5MGWajlaZ/KwkrPB+r8v7dAiH82o+ hi+SZVNwl/1f3umEO9F/EUNSadkJtzMfji9MdcqX8exKg12lGH5C2ZXPyt9P 9nZ5FZxxNPt2cb0Tws+rKOU1HwAAFgb+CwCfADfSIMdq1CvqZAxCHCyoCMMP ZTJHv0ixo8vEyZqZtGcEU6bpoM/cqSjKk/B38LsPJduB4+k6aKfODmTzM/jp n04o+i9SSDItOxWxY8PxhRn89I+xJGL4vgp1OusleyZSmj6TdfnL3kQF8ZVw RsLs28X1TkhhXkUpr/kAALAwRf7LbncZ/uzIkxwAAI8ic1ZfeqAINapJVyQp wvAjFTcC5VaPqQeN5Fqpdf0XLk0Hd4rfce/ex1dVszvY2yVJ2LDXHtfudPnq kkzPa6RSsJeDn/7phLL/IoQk03L18MiGYwsz+HkUUjZnVxqsW9eGYQyqU+LZ rFNc9iYq0u/sMRJm3y6ud0IK8ypKec0HAICFKfRfHI9WHADgcBMs5FjNbaTn h5X9KCyOpwjDDo6Eo186G5iJHV9ONZPTvvQ5UhhMmaaDPznR3xFBvqFWJOHt 4HcDfueHvhftFY9/e1Njsv8ihCTTcsF3bDi2MNUpxz6Qm//wS8KVD+8/Z8xR X5a2wLBGzLxdXO+EFOZVlPKaDwAAa6BeP7bz/gAAngf7Cpocq1lfwlufnw5L 9gr/JQnDDY689+fJQKa2+2F0o0M/1WPNBwvSYL9UwARTpklpmdxmBnglSdCu incox4eoUnw5CucmcjL+Cx+STMv50Wc2HFuYUco1m7K/YCsk2GjFfViZpsDK 9HInbIHhjJh9215S1jshhfjdgrL4SzUAAIDVKJx+wQwMAM+EHeyRY7UtMd5I hyVdMsBRhOEGR26NfLrP/Fzqv3ip7tt82mEaymDKND1srqZ5boUdyauaJNwm ac8BdAN3WiU2P1ndc/4LG5JOiwisLkx1yn7eRPi+8omLTlJiJeWUWeJHY0aL 8tul9Y5PoUvPzImDkIVQXPMBAGBN8v7Lxf8PAPA0mGEDuS2iJW4SwxKF/5KE YQZHbjyXKnR0Qzzl6NBLdbMRgvlpqPwXL5gyTY+OF0zfKUrC7eBvvav2PT/d AbP5mYRs6aD6kLP9F7Yw1Sknw276E8qufDRLmUqsJC574/xOJWH+7dJ617DB Ff4LWQjFNR8AANZGPf0CBwaAJ8JOwBBjNTu885d7aAYaijBMELeeJl1HcnJ6 aEeHnin8l618ap3/Ugv+C52mj51jSvKcFlaWhA3tn1N5YpOUUqCGrvSoVh9y vv9iiQpTnfIm2SXvplqOQbgJzcOqrCqml904v1FJuOF2Yb3bsCns45zRFkJp zQcAgDug2f2CHTAAPBdmmEG0TOPbtP5FzUBDEYYO4saT6dTF0fNpygaNl8D3 EdVrhQ3kdDBlmj72NXSS57SwsiROVGiT5ButEZufadA9o6I2JJmWezGvcR+j wtSmfKS+CGGoqavkpGREWVVML3tb3TcaCTfcLqx3tiIlS7rquNppC6G05gMA wB3Y7Xaa6RdMwADwRJids8RYzbwaDl6WagYaijBkEG8sly6D33iKlA0aB8Gq DyvV/kBWF0yZZhyfznNaWFkSJhPDD41NZfktCS6lQBbgjlZRG5JMy+25V2R/ XJjalE/EnJ6dEAiKwn7ol9tMnl+MqL/sfW+gVki45XZZvbMOSFLHzulaN0IF qhAKaz4AAKyMOd9ldyHmXrzzXzADA8CTYV6zJmM1M34JW6xmoKEIQwZxa2no aYXZ/stZ6b80Ov+l0fgvZ2H/hNn1EJtJCytMoqVGnd+YoaiYAl2Ab6SK2pBk WrbgGzncQFyYVMrnNOpRnCQIq7/5nG9LyQ4/5VxWFanLzBYYvvrNv11U7+zy 0bhnSCey9MVfVvMBAGBliFkWnkcrCwDwOCdDx5FpUBkdGKIZaCjCUEHcm+jk Y7Kjl5VLgEt3E15i1dtWKv8lCKZMM4LJc1pYYRKjqxKtFBtnZdJvuokpMBY0 lIrakPIUxF4MN5AUpjLlE/mNPbtLow0uG4eKfFptfcFlVZG87J32mJdw2+2i emfebMRHBqUTWQXFX6QBAACsTLzHRf4DAHgipiFFNLidRi/xoE8z0FCEIYJ4 q8eSaYJtGDY3OgxXn525kWG0SO0UJq0LpkwzZsrzyFGj7SpNYggbDzG31EU5 XW4FXJcE1YeUt4CcqHCi1eqUO/qMI3cmfHD3aGZg0hzrb+U3U5Vc9iq+8pSi +bdL6p2dgAlL4JD0CSXFX6QBAACsDOZfAHhdTuno0aysid+9aj4uqwhDBXFH v8R9RD2+yN1IsYPL+yTyJhfsctyEEnXBlGmmnKhhHDmKK06iF504NnvqYpJC kJ+ntPhHvsUq6kMS1lCbX9RWsynXUcpnOqBLJsqcDaFTz6GpGk+jbFXUXHY5 0OSC3nxbX+/c6rogcNcks6MFxV+oAQAArE98zgv736MVBQCETA6CNwMzDjKa 5JW1W6zPrUVShSGCUIO462ipq9NT75gE3GUzwuz2p2lxzkkKNgSMx3u6YMo0 CQ5NJPzCjOKKk+jIGw2vEJ2fwxiYnrE5VfHchjJkYk23s3tfNp0Q7kJbrU6Z 9Oku/sHvcWWd2kS18Wcfuqtbc/b1zFZFzWXKdc80ovm31fXu4jkwLg/qdHFn SfGXagAAAPcA8y8AvCTHyV85DSdkdLtxhHGKvwJ2cAOt68AuPk1DHYYKcmyq HDsxgeByQq0LZsdPumDKNBmmEXK7GwbE3X47ZcHZjzgniZZ6K38t4Q8y9Me7 J/DdhOnMpBz5fv/NX/6lDnk5stY0YWyd1XLKZ5fyfnSSmrqLavS+9cRGlfVo fNVzPRbQofe1GrZwmKpoLx+jy74qrvLvJMGZdJW3VfVukmQUMx1Dm87I6ot/ jgYAAHAfsPsFgFfkuPOHcsPgIhrrVRSX4jBMkC15PaDmY2fjHvi0Y1naYMo0 Jeo2ibSpvWyfmURNnfPSkV/TYoxLjI2FNRUpQArJWdNuTjX9iW7Z6nk6emvP CB8pElGfo/tn6gMDoYCyy0ZX/6Ic9Mbbo12ZeucHDd8rbCIvRUwmKITZGgAA wJ3A9AsAr0hXnzbDsKKJR5RgLWyeXzN9U+8XynVyNU+7ZN/7oV7oow+5NIcF Uj7u683oxJw3u/3nGWAX1LvDbgp57RXKM4At/nVqPgAA3Ahx7ssO8y8AAAAA AACAZwWzLwAAAAAAAIBXArtfAAAAAAAAAC8FJl8AAAAAAAAAAAAAAAAAAAAA AJ8d8kurAADwWB7dNQIAXoQvX768mGAAwK08epACAAAEj+4aAQAvAvwXAL4/ Hj1IAQAAgkd3jQCAFwH+CwDfH48epAAAAMGju0YAwIsA/wWA749HD1IAAIDg 0V0jAOBFgP8CwPfHowcpAABA8OiuEQDwIsB/AQAAAAAAALwK8F8AAAAAAAAA rwL8FwAAAAAAAMCr8GUtPwP+CwAAAAAAAGBh1vJfVvOLAAAAAAAAAN8tsZ+x u/5ZQ+5lIbkAAAAAAACA75cvX0JPY7dbxM/4kvgvCwkGAAAAAAAAfL98iRyY ReZfYqGTZAAAAAAAAAC4hS8rEiSE+RcAAAAAAADAjdzRf3mQhQAAAAAAAIDP wh39FzgwAAAAAAAAgJu4m/+C/S8AAAAAAACAG7mb/4L5FwAAAAAAAMCN3M1/ wfwLAAAAAAAA4Ebu5r9g/gUAAAAAAABwI/fyXxY5V2Y5um1VbbtnE7UEx3rT VFW1qe+c7pNlg4oldX5F+4GKJyvatdR5MjMXYn/aVAPNZnd4tDKLcmfLutN5 SKseqsixWjyBz1tS3y3tioO+NarLmvqCNbib/7LG/MtUgS3XnrWK2Uxh/UCX rhkq/hIP69mirEILKOE4WbGLWKcmzIZ1bFuaBWtBLOsJM+AJVZrPmsbEspes JguwkDpJDq5nZtIn+7BBkuuMpHaz2e2PdMrHUxT4xARMZafvf1L9SK1ZG+Uc KQySsawObjFiVSUz0bXuRlsfr88ZNiP1NurtERVV2DKlrrCXukNUsXIVtHmk LLqbs0TI2cRerU4R+6pRWq3QvKC6zFSX0TenC3ggd/RfVtD+cHZ16jw64Ue/ 8vqvE8cb9VDPt9PtBVSYL2q3fGPozkOD7Qa5ZN+xFmE22O7lnioUs2AtSGRt ny4DupcoEy0rNB5O9pLVZAGWUieuoWua2X0lBgFh8l3d2GvN3kU9DHptDjYY Lea8v6RMBTlENtX/RISbCB4dSe/p36yPVBRz1b/YUHrpwpCy1ZbtGy+yf+Mw vPXb7Ls0kZDE+G2f2kHfjfilzuWD0h5WSaesIojOXmUVyxY9I/6SlaIrOpW9 Gn1U9iqrU8j1FlXs5ZpHtT9f/Wepy+mratDgIdzFf9mNrKG/q6d2DvFAtNGB k63L9P1Z3CBqOSUMgzt3NJLv2dKibOiWt215FqwFiawnzIAnVOkG1jQmlL1k NVmApdSJq8O6Zn6L+uSu27VRcvu0Kx/Yukn0njqQ1O3ME2BziTBTBqYbHCeY xBkmf8wU957eq7KajFJTF/k+WBGGlK22zBvChTc2QWaF+UmWzBjGpnZW1xNX 6uKzKG9P/7MdV65FM4eT36sKorVXWcUyRc+Kz0vRFJ3SXnXx5uxVViePvodp ievFmkdzoarqX64uq+9F16DBA1jTf9ldwj9rQFUst6zsGIU1L9XCJn0TN4ha TomJk5G3VlPjVz3H2bC4bStAFh1homatdyLrCTPgCVWaz5rGhLIX7CyWYDF1 6BarkdvNSLxK5dfhzyMRZEwtcGjiYEfjWJyjaE3cC6ZXeC1TcZVzYOilTUfq Ip+UJgydotKyzsaumiD+IRzS5UtmkOS93z6r658mHzT2VN7EYCLzXE3+Sy6I 1l5tFdMWfSQ+gpCiKTqtvQp9VPZqq5NjGI4Qt4o1D4dxuupfri6rL6kneApW 9V8i1tDfNT3Xv7qqGzrup8qo8BTrxxYfgh2tvOEFxQrrx/hVz3E2vEJrJ4uO MDG/1puQ9YQZ8IQqzWdNY0LZn3T9WJyDBXI1DYJJLSixffiTGyNEF+Jg9hEQ qG7GNP5F87KLd2Cqyu3zCEcyp2ofJyxozZlSGIYMorbMKRwNvPO6hiUz5Ik/ CDxXypanyQeNPb4Fqczz6L9kg/A6ZWoiXcX0RR+JD+EiZIpOa69GH5W9yuoU SSXWa96iub76F6vL6svrAh7Nyv7LOPOyW2/+xW1Y94brZ7ritrYPfob9+8sP wXZWXrdZ5VNCHa9snA2v0NqpoiNMFKwWZD1hBjyhSvNZ05hQ9ufcv5/koF6u qkEwqYVR6yX8F/cI8Hc7mvUjwbvXyTnhjawqN6EfjmSaitGPvMqZUhiGClJg WeU4hdezevgls0/u9joIlmVkh6js8cs2ldmN/ks2iKBTpiZSVayk6GshB2Qp bNFp7dXoo7NXV538NJJivV1zffUvVJfXl9UFPJyV/ZfV51+8yRbnfDvX+xiE dOsen+L7yUu3iM3aLewsCI+y4SVaO1F0hImS1bysJ8yAJ1RpPmsaE8l+sg8L L6VOMnDQyn1bzH/pvYJckLz/Yjc8xkuc4pGLfU8brQMKknIL5/2Hx/4qidaP vKoZ7ijCUEEKLKs86uB6Xg+vZLbpXWk8npcdoLLHf9tOyDxXqiCSTnJNpKpY UdE3fA7IUtii09qr0Udnb16ngDYNuYDm+upfqC6vL6sLeDir+i932P9iq12w K8vWNj/R07PtvVq6RazdwnYFwl+0tRMmlljt8YQZ8IQqzWdNYz5VRrHMtXJe g6AHACdx1Givy5LsapfWhrGzKOGnAGxI7nSsq1D3ZVY/0KbqnsN/KbHMXw3n h9fo6pXMKCR8eArj8bxsH509ofZEpqiCSDrJNZGoYpwkhfgQRkqu6LT2avTR 2aurTgbzEjldxn6L5gXVv0xdQV9OF/B4VvVf7jH/4u3gd+8O7TOo9QI2d/2g sIKlW8TKLexQIvw1WzthYpHVHk+YAU+o0nzWNOZTZRTLTCs/5mVNPAAY/94v 4b8QVxpGlBnRcI+CawS3o9ILdOyfJLR+5FXNcEcRhghSYtn1keh9lNqfHJcS SUqGyjLlFqi8jTp7MtWk/8KKIgh9U1UT9aWsEB/CSMkVndZejT46e3XVyWAX 8Sdvjedq3lNQ/cvUFfTldAGPZ2X/5eL/txK2arkpRfcJZed376VP/z+EpVvE ui2sa0qEv2RrJ0wss9rjCTPgCVWaz5rGfKqMYpln5dwGEQ0Apk+YHTNjmem6 JIm6Yt9pxV9KtS+2mAmYXsTWinMjmbqPQOtHXuVMKQyTBimy7BqP3MUs6pqW TBL/0nuxgmUFNs4oqVn5xt/U1UR9KSvEK5TVFZ3GXo0+OnuLdOqIgLdp3lNS XcqyMKOvpCd4HCv7L3eYfyF38NuZQ+ezbLhP4z2MpVvEqi1sepfxFLqsBGFi odUeT5gBT6jSfNY05lNlFMssK2c3iGgAQL2P5sYIav+lNRds9x8PfuskaJoU NZJp3alasX7kVc6UwjBpkCLL+ng7K8P/OKSQSFoy5i1246/ZWch/mVFSs/KN v6mriaQ2mqIXJl5kKZqiE0UU6KOzt0gntwxTHHcVaN5TUl3KsjCjr6QneByr +i932f9C7uDfJfXtyD2yEo5b5jjn661dP8u42XXeclpeTn9Q1Dl5fdSdrpfb k3seCiIOp2t6zYbbtxNpKslLjMqITrRuypqvp0ufDVw6TB6JyjFxqJAnP+n6 LEcjTOSsVmQeVRgLmTWXXH071purve2WrW6ShnNKstxmsfEc623fPJtNLFDX bEsapqr5jPl5VYd8gBc2QA3D0XRvX5X3clZ2u7fr7fdrrn2zgbgG8XG6hm3e NSerjD+p9UfcGCHnMNgVX+ZlFfVEiO/Qg6pB6DkJdBhGP7R+5FXOlMIwSZAy y4Z47jQ0O+gTdU1Lxk1IbeiPMxUYwGqtL6k5+SbcVNXEpIrxySjEK5TVFZ0o okAfnb0lOl2HWw0l4wbNL4XVpSgLc/pKejKwjyMvSNEABaSs6r/cZ/6F+lzy Jqm1dTCzGFVG/8K+CeL57L1DXStSlPezbmKleo5Ws31+AGHfNrg3X6ymlU/W qJzoZNbZt1zT4dufhynmiQpL5xGhXDYOJX3vJ31IouVNZKyW9YszYGGzHE2S cKoFJWNUxoa1M/HO52/IppJqmFU/U80yNieIjafzHlXBm2Kq2RbIpmJSdiV4 b/RSEYkEP1gXHAS/caXVpep4v79Ndr5dFPfiGproSOVavkF8cLkRxaL2fxPZ NF2Xg9nVwmboQm2JnDS1d7jPDF38z1eaTms7rEOm9SOvcqYUhkmClFk2xnPu mFlNLeqaloy3CqcqfIjnbJxTUnPyTbipqolJFeOTUYhXKKsrOlFEgT46e0t0 ug63TonU2zS/FFaXoizM6auxJVSIexx5kjIDFJBnZf9l/fNfLn7/amq124Np q0Prfw7zZKvQxNZeMC2X2OHZ3zp3V7/ajxuKOtqfrjX4SzXHAUA9VN1EiYg+ mWY/HYZr3zdwmlY+OaNI0UdfoeBHOJYhNY6NMT/TsUA2jyjlcnEcLqRLuvbr iOsfciYyVpOZlxRmklW3mVWlDB115yfcyVUqvPkxKHKyD4LzqN/Yj9pMEjWc U5IFNseIjaf3vvqJjskn8t7Pkc22QHaaqXTLpAT26brX15UgwQUbyvVgnrvb o40wftw4UofKznejg3AvqaGR3H6b/lt36b56F5kG8XU0pnsTsiMaAJDf302z yVyXgxnNbS1yOc4Pc+hzOkeh1h0zzwziXYGsNWdKYZgkSJllU6+Q7GKWdKVK xuVH8G5DQc7GOSU1J9/4m7qamFQxPhmFeIWyuqITRRToo7O3RKemyb4rKNS8 p6i6FGVhTl9JTwr+cVQwQAFZVvZf7jL/4j5KYcbIp8o9sMdK24VuRFwZjcPj jkei2mQ1PdCGNkGLMj/9l6+urdlRkt+uGKMGCQdrnh3+MZpWPhmjGNGBKcGP KoTQNs7R6af/6q6Lw9J5RCsnx6E0cd3RdfRx8KId4pCcibTVsn5Wjfj3jWZV 9myO6FP3fKFRMvybdfBVlrNNuvOkZzScU5IFRRkiNp5e2M7PHyeRbLYFspNM ZewiBLbDv93wT5RgHs6mwxoxz9KNWf8aqyNlp5jVjBwv17oo16oQ35gPOTui AUBHFkSSTfa6GMx0c+65f+YkeZHpUcIYw73mHXO/HqsWLZW8yitQFCYJUmbZ FMrr/Fr/OpUIWTJeV9rL4Kcci22cU1Jz8o29qauJaRXjk1GIV0kZ/soUnSii QB+dvQU6DR9L2oTBSNSaDxRVl5IszOor6UkgPI4KBiggC+F1XOb+yUlajWQH /9WbtlX9NAUJnqtJZTQXhDpcuxgHL24kytbCenq76i+dOntK2upL21S7tjgs 7GnM9BGvqdaorGjBLlpZNnhjXzL7Sw+kPOKUE/OV0iRIummoaHkT00sZ/biY t5rl3iuZ4XV3CSSwJrDGbHz3Zef0G5vTJopFazinJAuKMkBqPHuX1pFSY/yn 32z1srVFGdBOBtoI/tHQtAQzaJjaydSpmXI42w4sLmObnV+nKRDPeMW9WM74 46v75wcbaOBb//vNM4bbWWKjjtNCYpDouhhsqkLUoXjCMIeuCNNl68KOVWKa u6ejklflVNRhkiBllpl/eqsRN/71JBGuZPzXUBU3dzXHxjklNSffmJvamphW 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 UEEKLCPqOrH0K1syzJzvt0R4isLG4pLiZGqDZO1VVrGyou/KPsGlK7pMmmp9 dPaqdKrjImuNpHYRzfXVRZeFSn05PTtqdCk9juIr/A+gIPFfLgvtVQnF3mH+ xVQ8/2E3vdFLhxFJRVHUHE/0xqvfUUypPo6/uC+XBZgOxCbZNfR6tXKjeNF+ 847PXcplUEE2SDdZ5fTtnA8p6qHyX5T6rWDWVLvtV6w68/5TKjQ+Y0wvPT3D Nr5248CtpQxZoiSFSPbZQbyqHG/QjWfLSmSbrVq23q6AfpMAvWVVljC5cEfq F6ndSv6L0+7dz7U4EmWM4vxKyzlcsU6U/jG7a9r7TovLKPJdq9ldRCk4yQ51 q4gPV9/iv5wV/stZ9l8KLCM6gmnvikLXs/8Gg9pzl8gm0ORDaUlxMrVBFDVR V8WKiv7MTvoxUpJwRNFl0lTro7NXpVMTm+lEUf5buebq6qLLQqW+nJ5n6lkl PY7iK/wPoICef1k+nfXnX6aK1/qXxpEYMbxIKoqi5njNY1gbTc+HSPVxcqem BrOT0jQ3zVKazp5gl23vOaN40d4+gOQjM9PPPuSe+nhPQTZIN1nl9O2cDynq QZqYXNLpt7xZplf1nvrTK+93odD4jDHTOdOb1c4XPqZF7theoiTzBUQ2Wanx TD/2fk45Fclmq5attyugYYshI2G4ZVQ+Br8odVbzX+wnxzo/1yqXU2yDIMdp tmj9i8OUmPtpFpAFpb/NH8XgNhq5mKYt+E8dcyAo41deojHP3tYpwYSiQey2 Sr9DJ4Uhg+gto2rgXqerXzJ++Q8MZwP5p5qyaPKhtKQYmeogipqoq2IFRR9V 9Lw+uqITRRToo7NXo1OdBrJzOaXOKH1PXV1UWajVl9EzqMhxYPJxdEk6Wu4H UEDOv6yS0urzL+OzPvSG24qsYDP9l3DtMrW+Rq6PR79HsKsl6NRsKzpd0znW TfxOjlZQZRQreho/nI+XfXJurD2Z4toiFZ8VEJuldJNTTt/O+ZCiHqSJ6SWV foubFa8e6z9qNQ0gpkJ764hCEzImWkG2ncy0/463GSusVJosRHLLFlLtpcYz /WgO3vl6ZhRd0c1WLVtvl89QKqfMBAwpYYhpu6xz8ItSZy3/hc61aTXZqd/E TTSI7mtDrytyXy/1jm0fKqy/NsnI8gzex72N+1DLMb3k5aQZ57jynnRo+Y89 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 /fSDEWooYuUsYG4dPLf/HIQkFrtom6KgBx9sTpyMkYRx8/0XN8Eb27yq/6KJ lw8i/9TobU4fC95wzSlAbazZpR79JCtBWTmpIkkSFNLHV+be2QLc6TkBdsnY tu8MpheE2/EXl7qkNX/vNvOEEMwtqtimn+v0TGXuRv82d1tSIxRVYLkn2ryn jOaR9pbq+G1mYtlbBrtkTKjkcl6TiYhlp39MRIWykDJSUrk7cvJs3VX4L2RM OR+L7aX7a36cQohIKG6ttBqz+mgpkeDnAqMV8DKciP2iFc1wr3dvW1kkX1eo xPICqVjMIbeZJY+KWOJ1Wuoo2pv6DHa5Eds41U2R14MXMSdOzsjUuPn+i5vg jT8ItKr/UlKWfBD5p0ZvsyQlGDzOKUBtrNmlHoelKgFnb9kLDm15qercoGU7 /LMdQkdf9yIFm1WN43EvH8EvLnUpY/l7t5knxOYiE8U2/VqnZypxN7q+hE5E sGz+MQJ7Sp9ofWm3jH50FuQW1gsSBR1nJpa/ZdBUcjmvyUTEstN1CF7AZfwX Vf8z57HqgrJ1N/uQYGLK+VhuL9lf8+OUfAnNaK2MGnP6aCmR8OftoxXwKuyC jrRuh78qmuGeYmqcrStkYlmBZKzMxgROjXwsPyr1nUe+IXgTC0PEJmxBnAyp KfJ68CLmxMkbGRt3g/9iz7A8uJuJsPhCkbrK/NCYQFYY+rQ3ld5mdnt7uXCx lAWojTW71NOwaSXg7CW/kMolpC4vXZ0bXiyfj9NjrLGCRNWmxvo2djXTrzYc ZCqyP3/vNvOE2HzkpNhW7ZkKKtywI+NEBcvmHy1wEuqV2rfWjxUz3JMeQPOe MoWPtEnHmYnlb1kUlVzOazIRsex0HYIXcBn/RdX/zHms2pB83c31o1xMOR/n 2Ev018RVbQnNaa2cGjP66ECu/Fi+ebQCXoR90JEem/DI7ojhXn5qnK0rdGI5 gXQssxsx/IJe8NCg1MjHGpheklMfMhUaQmferY8Lis2v9Ds0UnsPfvJ68CLm xFEYGRl3g/9iTlJr4+Rm+y+bsFS1+aEx4Z0qnRu+P0atHptXgNpYs0tdUwmS QEJuX+JAxeWlrHNOy6sY1/pE1axT3aW/mNSljOXv3WbeOx9biBwX26o9k77C DWOXpb+fHD4uuhufaPOeMmWPtO62R1r+lkVRyeW8JhN5j6SEgVQdghftRv+l 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 ON/QNu9zNr8W5Z5fbdRtH2nuysEC75gCRBfAY2gpe73NECumXsNlNvFlkmmr 04+E64q7qRcMZ+xcbzhdYht2aRue9qHoLVgAbY0jhonECdRGd3zBkxcGRNIk 7hxhqe7PWw2bUrLLoBpJFI25boU3HEUMRTwvfnn1/ktzX/+03l2ByRddTmE8 jhiAV7v5JLwyg5yrNIIPO7Y9hCSHjkmf+W167uwGKjbn3o/LWhJaLx0+muUA 0RdOK6ggoqHwzSUDXU3a//h2PJwJyltiG7u4zzjfzzbvdDa/E+WeX23UKcny ngXrmCJF2QVIiDPZmdDBL2Ds1BTmukfffR6+5vx34fuNV/GyX4r6Twxgsl2K C+g9sdlxp/FnpNaPekISYxJ3jrBk9+ethksp2iU6PsYYftlcNwSwXcNPwfPi l1fvvzRk/xy1/dV6tx7zIs+85jKm3n+IexKU+8QrmPwkYvCb+FVJHhc6fZxL duy0ARWbhennP4/YSfNpBRUAEg2BmPsfSvkKKbP2h0DiIye9JbaxC9I4f7Bt 0s7mb6PY84dPVmuMUR8RydKeBeuYPEouQMQY2HDPfgJcOAabsjcVXopZ/PIo +K54FH65tV/sXXgD4QLblM01jWf7e0Y9aUCkTeK+EZbu/rzVcCllu3SqkURR mOumoHkwvDWeFL8cDi/ff6GPdMivSQBY71Zj3ol1qyWzCwotn67KNHhpEidz BziGeAS5IinlL09fnC5/5AcX68EAsPj9IU37t/z9maRlKvhkqsMBSgO0StAJ dfPafwi2sQvSOH+wbdr5sRyFnj/E85K4JGfUt/j8PJ//iYdVxEXaommUXEAB mMsQ0OgojqHwLI6dH3sU/CQfNouf2R+J37JuNTQdGJvYfntZ6K0f9fgkziTu GmHp7s9bDZeisMtLVDU7ZP/IkczwVDwrfnn9/gv5Su2g7q/Wu7VYNg7cxH7e ffCTa3Ay12PICkYwcxHg77LNcz4p4kSnnyHbimIt5H9JDBOyL5j2DdMKKgDY 5zlBXlZXS4ILnY5poUegoGwlKOP8ybZp7+9nkHv+AN/2SguyRj12l0DBn+sX j5xCC6dMo+QCSsi4DG8bqDpCXCCZRLav1z0KYV8lmb27qXZis3G6nzbGLukk TL9d4tF7Rj3eyXMmcdcIS3d/3mq4FIVdjoFxfsgumuvGoBvR8NZ4SvxyOLzB /gv5SdPLD54jvSt2uY9bFoFuTqubP0YyxLcI4WIPnrFzE/vDaQgb1OqkgIFO L81dsmId8fRdShsKKgDAW/AT+igpp6vPXPvcDs8m2MguCOP80bZp309GKBj/ /vBdbdQ7eKBkX+4ErGNyuDd8ySeyfs1Dd3Z/937d+FfiQjaK32yBnSrO95Oz S0P6mDU7oLi/Z9RjkziTuGuEZbo/bzVcisIu4/ExfsgumevWoBvR8NZ4ZPxy i1gO8L9Xy5rjoO+v1ruVGBPXCJ/O0f+EaKCDBStOTDCbKIWkCeGtzOTXxXkL 0wxcrE2JLG7aOe5/VNrHUk0IJigVAEwOe/9viCPMxOEhpjK6GhLtp08PwcPs wmzzV6Fg/DO+64w6WT53XV04I887Js9hwQUU4V1E4DIcIOsrit/BgEGBcCos /aJVaCs4g4+bA/Bc2SX1qFmzh2xTsfWjXmFAJEzinhGW6f681bApCrsEx8cY UYrmujnM/H4gHhu/pHi1rBlOFf3VercSh9TTLE9z23dgKSisbMWf2qqlT6E9 xKY6N0civS3NMrJi+5RIC6VGaV8xraACgH/NR+qsO+i+v8D7+gl47T8Ij7IL s83fBVXPX2vUMYPwldWCaRRdQBlNJlf+S7n4PRwYyuiYNvGHxeAcP27A9PHH Fs3yuUZeflo/6pUGxLzWO0ZYrvvzVqMcaki7xNoiFPhrRjLDA/HI+MW99RL/ vRkG7jO6FKx3K+GGAb8IE73/mByUOmcK7dn39SkI7SE11fE29uTpztfzH/zJ i/UpEUehFdL+TaeKINFcBTCxT5+nten4KbGeW4nqKa/f03k3wYPswmzzd6Fk /AtWGnXMIO2esI5pRtEFKNA0mMv8l3LxezgwFBG2X/BhpHDkqqV+BD2jQwMV 08jTgtf+nlGvNCBmtO6oi+3+vNXI9pRyiexyUY0kipr8djDz+4F4ZPzy5vsv Q1fTX6136zAiRbnH/A56PIjM+xu7Xau8Nk5oDyFpPrmcp/cF50gUQ0ScOPti WkJ1Bv16Cv5y/zQa/fMPs64+P7+OWK0DqprT/nZ4jF2Ybf5qZMbvsM6oZ0wm 0Unr1QXHVHIBGjQN5tL/oKJr3fgZCO/k487SUo0Vv4ndxXyoZN7sM6ZdeBwP 1Ix6xQGx0F+qRliu+/NWoxzoSbvMVJOLop1HbAczvx+Ix8Yvy77L4Un7L+P5 ZoU7bxftpWkuwoDmD4iKJIeJZH8emd59Ot8q6Xbcot24L1+/PB56mU+2oFZa TcaCIEiStucveMOns9xjTnn5PS7MxKPG/UERwgjeRkjqp8/LZOlu5OIbgSiG /enyeBHS8otYsAokJATjx5r6Q+LR1dpXY5j65wc+rebsglImjafb5nrTHA/T 6ezdTbFtFcmyuYsEREcwkq2gwKZeolKpgptgev46o55x4/4sug3ZNIouQINg lf6HMPvFkpKKpEWs7nXf549bgU+mAG3PMtaUWQpOnSpw8vXBU1HllCWbv5nx UXJ18UQYE1s06SQ5bsC4vjF2+CWSrNnjz1n1uDsIo15xQCyZREVdbPfnrUY5 1JB2mbGdi7L5SMb418IMz/DeeGz88vj9F+A7/FcsZoM9uYcLkXFGetETTXwM Fn+kene8ZLYLxzshRcdQ7hRAplbkE/O3Rlo5IyuIIMmFIBHQxlKQTPFcbFzo mrArrrMQ7VFO2s/1ZelOKez0hyrmnlCM0hTTcka/s98JJDvu6WcwP4Guvuq0 3xS72T+nmyT4ih+7Je2CqKPQCRED99vmatNEd68VSHI0Sd4JAiBf5gioxA+q 3md5iVqlSm5iKZO9rEJoTZG0VFb6WLXsmEouQIWs2cP3x9BX+yVFplJWuuak wDeRP7PnJkdXKiN2P/CYdKpviUohp0YyT6MQZsU7Xbi969QtxEssXdhyzrwG UoDD5LHz72UtGTWjXnlApGpdVxff/Xmr0Q30pF3mqslF0c4jEuXjlgDPuX+d dSLP8AzvjkfGL894/2UMpzyPobO2V/AQ+mt6HBTdEEvSXqZR7ZyZOLE9WVh3 dLcsh3WB+L1AP3jl3/yITMfVnV2Whh9qpNWrhRWElaSN9Ajgq3SReBHzz314 xF+uL/WWvD3KSe1CFacfc5WUi+2QEmCqS/tHpWWM9oKQEcmOO68rfIO5e8yP qA2wZw2omw1E/wQkFrv4x9kFUUexEyZk7rfN9aY5J12G69iqSHI0le5CcgRk om+F4fleolapopuYU3r65xXxy3Ge2sqLHqJjKrkAHYLe/A/npBIPUpENhJxV 6smuwPABC0j23OT4Vyojeg/K6r9gp/rIqZRyTviiJAOa8B+vK3zEMn5CmI9f kpO+MeBpl1w9JhkyZBUxS5eRgjDqlQdEqtZ1dfHdn7cazUDP2GWumlwU7TxC OV8i/Ou1OMMzvD0eGb885f0X73XAmnQX172auP6QvhqAbJmk7Ds3XBCOyedA fE70HjWc2xyJMpjpaFXRnSZ84vcZqqUtZmQFYSXxy2A92R6M38lcY3I71ZW4 7uQir6eyuuWThvR4V/jdfRr5cNxPf/Xnk6aYGw3CUAdTpbRMBbpjGUn5TFfh U2VM/JIfXdN1M6p/OmP4in9y7VDRCRMGkHAkZdE27zHNKWkMdEskOZpYoRwB WdFC4tO9RLVSJTeBjd8j05oiaTyeQ83SPfeiYyq4ACWC2jxrSR0etCIbCDmr oHSmgNCTmnBPkfvqu3cWqq6ZPzCd6htQ+cZUyjmdZN+sZCVXFBC+g89thze4 vaK3nfzCjt01RBR9gQQVo155QCzIW1EX3/15qykN9IJd5qrJRdHOI+4YyEoz PMP747HxyzPuf3HdrgvLVDc77Lo2PJxRRlyQJTyXd6s5+ccI22hN83S1Sz+U 0cTTpj3P9GQ8Mp8M02ppyxlZQThJAu+k1nAil7lNVRMX3QLkAyECD1ySP7iM 0sesZrS3ThZzPSKs9sFUKQ3gX6oCCUfYYoKutNrHTOFsgfCXW/AE1X8A2eRv QOs7IWZApHot2OY9ptlGQicNyYKRXEsEgqIFpcyJuBU0zbehl6hXamA+03Fm /JhvogSf1EAIPgOzA59LLkAJLLJTYjp7K3eliqxI6VmB9DuEDWHPkT0/gyuX wbzSmu3Cbsncqf7xVBQ5Z1/5wUsWXwns6bZBVTZEV2KS4gbMeXI23JkwVOzY UJNt/ainGBA5OarrEro/Fi0+8ylIKxnrhGpyUUrkmbI4V+CA8mnyDM/wA/DY +OUZ3x+DFnIiHnYoIy7I0T0mnR0vB4zOKCYMSU5vL83BJVBredGq8u+EaOxR LW0xIy8IJ4m8/4LdAOcW5n386NXislgEXQGlJVXSrhnIdO/YpzfhT31UVKHY PrZgTL0kaV9JWrYJglQgYRrPv+EDoyut9rE4OJsvNx0lQZ9JS+0Cb/iQdZR7 a2X8ItrmXaZ5AW16VpDkaCIBWAJe0ZQjoBI/URqtLrXe1RnrlSq5Ca7nYzk0 SeMR3irOBzANogCfCy5AiwbQHIfDEhDsU0LlrlSRFSm92EiEPYf6vBa/rsUy mFdas7MGv4mHjEo55xA4YST7FzRReJ0wtJE6folfLGtG8sP1ZDH6+Jh+1FMM iJwc1XUJ3R+LFp/5lAW8XRKqyUUpkWfK4ly+GOVf5Rme4SfgkfHLc+5/cd3u yD2wq+CF/toDSvnG5GKbi1GOSZI32EncY8ccg2qgKUl8MkyrpS1m5AXhJJHf f/EOg3uGv+MeMZza+I0UIp2oR590QKFGekgjhB549sIWc+uVqaPfK9ISPnVG McCWdT99f8WvkAVCWu1jcXA29/wJHnz9sl2QdZR7a2X8IvJwl2lCZY4KkhxN JABLwOUjHcEbeYkVSpXcRNRx/jvT7EJSPObeCIseDaIAn2UXoEZDgPp0rNyV KrIipcMCA9VIhD17t+TDh+z1esoHqOIXvdXXdT9SMq+Jj1KrxZZRJ8Wdi/2R +lokWWx6zl+Hn36tGPXkAZGTo7ouoftj0eIznxLA2CWhmrysgjxVFudyz6QL rRnJDO+JR8YvT91/KT3Uxi+uOzPfkKKG8PQgs/waYQOpS3yKTKul5R8EQVhJ xO+PNTQfWM0tS2F552+B8DkgofXIpBP7Okr6Jr4brHbFYv57OF07Tl8YTYiE tK8hpuEXXaYXUokXUyhMpyeozyxDXQ2Ax63iF6J/ynahroOpUEVV5uE+03RZ LnPPO683klQAngCv6EKiXptSTm3GNUrl3QRr/FgOXdIVfpuK/cJqgyjAZ9EF 6NEQ6FIfpuhKFVlTpZcbiehJPkefZJHLZDRIzZYzqnNSIUvNcAsQW0afFDsX vroyLQd+mz8DkuVcNeqxSZwc1XUJ3R+LFp/5FADKLinV5GVV5POyOJd7pjpx 1UhmeE9Quyb43hbt//P45Rn3v/Ddl7YAumCGVsydpi4PhySjfKuHmk+R6XVU kgdBEF4S6f6XhuYDq7nLRvaI+P0p4ToGofWopLHruXRXm/djPXwUil3h3QAe gyot1Ktd4/0gii+IuvoHeNwqfiEevqSc+jrECu+yzftM05+y6JYDB0WSHM1U AJ7AylZ4dvyySqmsm2CNH8uhS5oRjsdwYUeDKMBnyQVUoIk04yp3/u0xRpFY xOpeV24k6mGR0n+cCgzSQnd4dvzyryiZ7hKtK3yLPUsKKT1KAF+04HYTMcUz mXflqMckcXJU1yV0fyxafOZTEuR2SakmL6skj8viXEKiPMMz/AjEsGUB3jNZ hd+w/7ITc++Tp8RAXUb5CzZqPvX2qKaSPAiC6CTB6Gk+0ILLQZ67+5OzwhKo 0HpU0iVfWGQeXeBxLhWbMLa7yffvDqdl/O/ztM/Dd542oaACiIEoHuB1NZ/z YLRPbfOs7GafUk59HWKFd9nmfaYZX9YFp8tWGEkqAE9gZSs8O365198l4Hs+ lkOXtCD5gFCTYvpJckwoKXEBFQD1xQ+DpRtCiq5UkTVVOlXgM8lP1jPBH57p c2noMlIin6ankuYsS6a6RGtCDCyzpJCSDTtCoWvS7AHhM4YQ60c9Mklgqa4u RAh2f95qdAM9skv/A1ZNLoqW/Pp+Ks/wDD8COH7J3llZ9c/v5Dzx/ZfSQ238 chFzUy/DpZ+pqvj6r8Sn3h7VVJIHQRCdJBiq77ZPw6V4k+455YSA0HpEUnLp mKSp9Fv4UrEUi7uluziZVlQBwBdLemEy6kp9/8vqbvYh5dTXIVZ4l23eaZrg K6Oh7VcYSSoAT0CvFElD+oJqKloB6r2E0POxHLqkBWGRHOSGP0mOCSWtvQ0G 1hcD4cSJKbpSRdZU6eVGIuuZ8EEQFMtIiXyankqak/piycruF29BwUXiV7gy Xxs/8EyRJBLJ42P3jHpUksBSXV2IEOz+993/MiGxyyujmlwU9T1yq/upPMMz /Ahk4cs2+Pn7L3LuhoKGbJHpJ89MBEHWGTS+Bso9po3fFefueHEkg8AckUSK 6bKg7PA9PqlYAjf2kfv1+JztgrIKIvq8OATYElFpP0kiHsREMae+jgIZkaqK W6rFZKoL4O0nfpgVSHI0yUwEAb1SJA3pC6qpaAWo9xJCzxdolauBMx6CU8k0 UNLaV3mT+mI0caay5Ipk2kaTtViAf5jxBZWByNFlpER9zdqcWskUiC/jY48a g5S8e6JKi4lnrMwJd416RJIkelVdiBDs/rzVqIcaFImQqslF0Y9kYncQEsWs hp8BFL5c8Z0ta//z77887f6X0sND4hdNwUqmXxO/qFSgQkvzkTjTS3nuPpbq rmuBhsac1qfZR5AmFUuwrOrRB07ItI+K8GUaT6QX/cHbrf8Qh5T20yTiQUwU c+rrKJARqVZNpqRyJE5gB+ZSLsekpT/zBFa2wovilwoFsJCM/65q3My0B7kb UEpyTIILqEFSH7iUcciySMVXZC0WkPpAvLyv05eREvk0PZU0p1YyBeIuC+6F ceWCrUUdv3RNHh/dN+oRSQJLdXUJ3Z+3Gs1APwPa5ZVWDSGKmrzFL38ZKHzZ av9l3oH5/fsv1KK4ygzUfOrtUU2FepA+8ixLgoHXLokKzpqj5fP6S8+nC8wR SQ2NOW2HOARpUrEE8wSAeV1ySUs1rFKBxxQA/ZMyRF0ptI+SiAcxUcypr6NA RqSq4na1aV4HcA7nUiJZFb+UbjzRt8KL4pf1Sg0Qe75Aq1yNm3btQe4GlJJM Q3ABNUjqAyeV+iyLpitVZC0WkPpAPHX6rS8jJfJpeippTq1kGoR3WfA75OHE X/ah++r45dTkY9e9o16exLNUWZfQ/XmrUQ810C5p1VCi6EeylT3M4pffABy/ bPP+y+3fT3//Rc7tnorr2vVMvyZ+IRdr1hl0T/HRgwyHxLm2MAlgXg0TnLDA HJHU0Fg4WP5G3rsvFYNYSNBfS1vS0vgjVcG/nhdzQt8Uznd/R10VtX9Nk35t /LLaNK/w3YWFjECyKn7ZcPHwNfHLPUpdIBu/QEtRzZKD/WahYBqCC6hB6DVJ hQlPgiKZttH3Om0j4cL+6pd9RRkpkU/TU0lzaiXTIBwgw69ShOsW+TmyNn4h zkjdPerlSSxLtXVJ3Z+3GvVQs6TES4GJQ2CEKJXkLX75k7D9F4asvCTnUilP ozIDNZ96e1RTSR4EQVYa9CFV3PIE2v6Y1DZ2XIwyFRP2wAXmiKSGxpzmVnra NC+1jJsUAxhiiQxUWqqCgVVBpEDTTsRbdFXSflqG6zxC4mdawUviF9E27zXN CUNYpN0VSOriF57AylZ4dvyyhVInFIxfoEUkHZZbC1EWtm7BNAQXMH8GumCh iEfPA3iVKnTViq5U3eu0jYQLk6fH3ip++VRKpoIPK7G8/two9dFL1LKlxPyM 1AajXpbEsVRdl9T9eathU0S7JI+P0dbNVSyV1fewrTZdDa8Etf+y9v6X5P8/ /f6Xvdi7hS+FqMxAzafeHtVUkgfpQ1+sJNL9L/h1daTGybnGouOxZ9dLm7ja QtUnqLnUAjh9GdDQPZU5WzzZ+cAR87WiOS19e+UI77IcbirwmzNfNznxLZdL ExUOM0ddFbSfllnTzWS7UNchVniXbd5nmp5o24HMK4wk/ZknsLIVnh2/rFJq brYl4xcaKE+aV40v8czm0vX5SEMyDcEFLNMc1afOmyblMqzoR+dQ0ZWqe522 keh6wumxodpeV3aqh3Y/fowKLyad6J+FU2rK+CX/3v2aUa+YxLC0oi6h+/NW w6WIdslcBUCIoh7JVvawupHM8J6w/ReG7BEacZbbb0ID13A6a8gWmX7yzEQQ hJWEv1h7xjLgu8Fh8UJxSQt+3mmB8x/npjsn3qkJs3ayPkHNpRbA6egiK640 S7YYvqRp/rhGpoLlK6HZm/pdVqmgK7dU6eYii/apryev7mauw3yROfV1iBXe ZZv3mWaY/47g85orjCT9mSewshWeHb+sUWputqzx01orJC2TrhhYzJNc6R52 wTHxLsCfJewFwojHSCd+CsIrrqIrVfc6bSOlhf28PXiJs+bOGCmRT9NTSXN6 ycDizrfc/aQxyoeVaahL3OAZkbWsmHjAZNaMepKTT+pF3KypSxoBeathUkS7 zFTDiyLOI7iymJCQKM/wDD8C9v6LTPfC5PYjU7DSoduRGWuZDqTnv4+Y2jpp hYy8IJwkfkTnlnUGmHrCxBsE59jOmOQpeCu6PkHNpRbI0hePe4TsK33shHmo ZG7aJNJYFfiPmKIdmCncSUfaM872DWYfA0z8TrWfYGU3c08fZE4MnoxY4X22 eZdp4qM+fYGkLn7hCeiVQlOc/368l1ih1Nxs2Z7PaU1O8jRcBceUPwKSY2Jd QO95ZTecM44il+ASGL8eXdGVqnudspHSwk7AMN8cVHdeSt2PL4ipqHMSklFc Bshj1IUq5KqgQ56sZcXEvkk74ppRT0hC9aY/rqlLHAF5q2FSfLWkXWLVCKJI 5gqxdiArzPAMPwHS/su9hDHFu+ix4Hso2V2zrj0NLEfi/QK3Z+1M5oBK+2fv 9m9uY6SrqWQ6OZcZnNGd0goZeUE4SfyI3nPCzYPHHpAPLZ87V3SLd/TQu+BY 6PoENZdaIEtPFndaTjaa7PK5XXqcpNIIFbiRmNHr1A/JDwPFbZVPuGnzxWo/ BXiRpaabFewiBU9GrPA+27zLNMF4Nn8351wgqYxfWAJ6paDE53qJFUrNujNv /JzW5KRAbne6NdbCoHzOkndMvAtgeeV5BFzusuIVXam61ykbKXnwqybhAyMf fvGDL3OVvQdfEFNR5yQkGyRNyGOU5xh6RhfxMN+QzFtWSMRnpFaNekISqpcU raoueQTkrYZOkeySOT5Gt6JgrhArPWHdSGZ4T+Txi7uvZQPCkehb3v/iVmHO k6EQp6ZHaO/hoyUhOVjptCc7tl2YpqrMQGFWl/F67LJq10krZWQFKUzNBBFn CcZAPSiXcK6+tjDghM1uvC6S1udPPRArMkISJ9cRsDJxQp52p6QeZ+e5I6si 0ygVpPMFrNcuW6bOdZWcOTtH4RPtI7hu9jHUdTOv3iV6yu0iAU9GrPBO27zH NKHCQCdaayThmSOgVwpKfLKXqFeqzx/6DW/8HnVGfc7IdaU7LzjHdOVdQOS6 QBteLTLmPwVZK7pSda/TNRJ8wKfHhg/sj+gKJe/BF8RU9DkTyYavLsRbtCYK jeb7YuxNTg89M2hI9LJmn2bCyfdZmgzlUU9ISlku7PRo6rrKIyBvNWSKZJdI NZIoYsVZrnpPWJzhGX4AsuNjW+2VEGTvpkkh6fojfEBGkdlI/D4/veriVmTO 43XYN9mZWXzM1CcUZ89ZJlwCXHzWHJm0OmmljKwgrCTF/ZfFpVxO7ioNMXzx 1OO1yNMAddqBtRayPt94xMaHkLTApcOfFs/XjgvH9CiWFzvNvYKOXug0SQW0 Xo9N5rhTXX1/4nWpSfsf38tchH+fWd3NcD/4F+qm7IKqotwJ8fNdtnmPaU7p 7t1T+N23WiPJfmYIqBzBO3iJeqWi7iz1fI86ox4xRdoQE9COaQbjAuJsrEg8 nhZrid/8jJDtSl7/sb9Xu2ZVIyUPn+BhGL4+IlWx90ndjy+o7+BZffilwUL3 K45R6KsMrndye2zR4xIRctbsU+Xx2wArRz0hyYEwiZV1zcnCCMhbDZUi2WWq GkmUQsUAqweywgzP8AOA45fN3lRBZB/1/svox5f95PZ9H5ymHf4F3Kl7Xq/U W3vRzuh1O7CQcMlXYKI/SKgGfjRM78acT/jZmuM1TVNLq1cLKwgrSen9lwnx EvM+uCvSuQZ1nnr4K3zRkKhviE3T4pkjn+SBal40G096cAeu0mLj8TzJ0x+I Stg0UQX0+y9T22Ey36yuXHrU/jdOSykviN3MTV28Dj8HFwUl9QC7+JBWJis6 YWacd9nmHaY5Z+imhpsG9LhCWWkkubMhCYiO4L28RLVSU7OVjX/JUmvU0GZv WiptvsygHBNBLrqAOBsrUB7ArUGAy3gZql+FLnUlMIGqdc1MgZG1539ZkzR+ sif7AN57hIL74Zp2KkxFn5NXBaOJ8hjlPjB4PkVGOi53XNfPt/jGFvTsdrKW aZocd8zXjnpSUqI80NlW1zULIoyAvNVQKbxdpqqRRClWDKDwhLQLLczwDO8P ev9l+3oetf+S2Cn/kD1OGLxBcyNfcE17V353OIHvAkYz7fDGvmwGEp8THOHu hDeu10lbqo4URJBE+rZLwHF/U16/B6olnSugcjwvb0zflCzWlxOheKZZh7nQ r2O7mzlWbtvcOsOuPXKnpZk0UgXh8Bf5/bGGXEQ8nueF0/7zQAcoufYJuLXX 7lvfzRb8w3ZxY4MI43gymGZex322uYlppktxVUZC/UwR0CuFoPhkL1Gt1MRs S8afJ2qShsNuJrw7t7QlEhBMg3QBt57YT+vDvUiVkM4VJ37Sd6Va16xopOSB n/DyZRw478EX1FdB1Td8ht+6f6RkEIoxqk3m8+yNAJl6YFVUYnpGavWoJyUx LN1R1wRpBOSthkrh7JI4PiZpV644YoUndJBneIa3B7X/8pBI42Hvv9yD9ubm +jPfYW8WfTOL/WTtN7POpmjD7A9K08QVON74ujxRX5WCiPe/PADPru9V+CLv f3kcjreI6WNNNxu+Pie7mGKnfv+vfGxnDe6zzbWm2bTXoZ3LXvDu2d3WvrW7 eLaXeHc38UA0xStkq1ChyOpO87BBCWO191iLYV60UUqm6XxDu1+mvjticF8N 5oyU4XGqWe8JCzM8w5vjWfsvD4qKDAaDwWB4JJriFbIGg8FgeCoe9v4Lxlvu vxgMBoPBIOEkX4xpMBgMhqfD9l8MBoPBYOBwVl1faTAYDIbnIY9f/tL7LwaD wWAwCBiLXysxGAwGw5Nh+y8Gg8FgMDC4WPhiMBgM74b/sgDG3n8xGAwGg2HC nr3X0PDDQH1g2PCj8OouZHgn4PjF9l8MBoPBYJgw9Oy9hoafhldPvg1349Vd yPBOoPZfHhJo2P6LwWAwGH4UfssVNoarxS+/AK/uQoZ3Arn/8oiKbP/FYDAY DAbDa/Dqybfhbry6CxneCeT7LwaDwWAwGAy/B6+efBvuxqu7kOGd8LT9F4PB YDAYDAaDwWC4E3n88qD3XwwGg8FgMBgMBoPhTvyHAhjbfzEYDAaDwWAwGAzv Chy/2PsvBoPBYDAYDAaD4V1h+y8Gg8FgMBgMBoPhp+C/LICx918MBoPBYDAY DAbDewLHLwfbgDEYDAaDwWAwGAxvCmr/xd6AMRgMBoPBYDAYDO+I/1AAY/sv BoPBYDAYDAaD4V3xHwpg5vtfLH4xGAwGg8FgMBgMb4g8frH9F4PBYDAYDAaD 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 cdIv0+3x7qWhlHPoks06oLMJGl4nOu8adSea/Vh+6xr/vi4aMUjyi1KwO22d MVnXjzLIbOWBUVbZOFSUhjlNj+Aa93SRAwQeX+DKkplLanuZjXHKdG4yGxaW 2XkW3/KxRJ6hT2LLEL04ZW58+1Y+8i16ErdN3vKO36PjGT8U9HvylDW9Ua6u nvKLO+czsA9b6pfvnn9RzNsMt84XgBVNJG622zXkN1FTN8SxgK3vt2lyo470 yxRPB9l47kGdspMdcyjevf97PKQ8/fJbOWn4h9ps1gHDQrNgSPMqOLnTNnmf n5Rft2jEIMkvTuFszrEFqHvvk9nKA6OssnGIKOYJbbhuzzxKrp3TRQ4QeHyB K0tmLqntZTbGKdO5yWxYVuYeM3C9crFknuHszB2jkMS37/4i95BI3Eadf+P1 y4rmKfN76pRVvVG+rsQXd85nYB+21C/jrMvlYv7+MJKdh2oSBzfMF4AVTSRu ths25DcxDvLJFdWB36ab/3nSL9HWNx1k4z3j70JNP1XiELd8rOo8kVLdlDJp BIdUJusARVVqH3AxN233HUmEj3TglWoaQRwvh7n5xSlQY7K2F21ktvJAYSHS UfST2GjDgRn7tF5hBA4QeHyBK0tmLqntZTbGKdO5yWxYVuYeo5lPXCyZZ+JG kC8DhyS+86F4agmWxG1aQjTumilev6xonjK/p05Z1Rvl60p8ced8BvZhS/2y 4/zL7f54taUT9yGy/gWlzpdWu/rU9NHr9C5u29yv51f8k9um9XQpe3J36Sd2 TxdFLFmNLK9a9zO0zmXWf6yJLdVUlnOfQHOi9++tMS7j1DDJl6mPyIhcGkHN +MeS1TTLOhlMGVLHyrmfrROihcxrIg5xs8025EQpCI90//4jubQyKQ8V3/Kf Zk5VlB79ppZTBK8YfHD65abCeE+74DyIe00civTLr+lIIFJ+6a/NxIeumawD Tv59WUfXR/ybdPI+T66KCOL4OczMj0jBfujFfE10GBOR2coDhYVIRrHaKvS6 PeI0r6fEAQKPL3Blycwltb3MxjhlOjeZDcvK3GPfetcxsUSeSW5I58rAIYjf VW2zJEtSQlQn8iVmIj88y/l9buZL9UtcV/KLO+czsA9b6pfd9r/oD6a6ctht rdfGu6icRxZuk47at/6p9O20MSMmZ7VnfNk8bZbucSq6tTw2ffoIX5X6yLZy +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 yHNGluvr30AddZmyUs4MyfiKsOl8v6X8m/a/nDP65eH8aPRbxxLG83W7pHIp VwQ/Z5+nf7vj1DY8GBi5uhpjM9gkZVe2tP9N/jx5v9yMihb55V/zL2rZ8nSE vJ7E95NUWVLd4JQ+0yozmc7yBgAAaLbWL8/99r+8sOtv+2dUxfRLQ33nZTwU rSub/bDXv1tc3TQEMbfXLypxTFIWc3NLeCKczPKSz7qJtNAr5WRJWwX5nNxK 1Efb6ZfysvdXk9OWZsyIzNrV36nkG+dYmFVcID8k5Z9EnvIsC9S/gTrqoLNS juD4NSRPtpRx28tvs6eF0y83/5hyC00Yn6jbJZVLRVx7XrLjoI1cX43R0YSj ZlzZvEVppyV+PcoX+eVOZ3lBfNtJXU/i+0m+LHQ3qC2kTc9kOssbAACg2UG/ 7Dj/4rwpdXhDrh+L7hk5/eJu+6Vms7kjFZdRRE106Bc3DUHM7fWLLN28hakV zXWQnJe80E2Jok4LR/TycdsQr85JyjzgHNfEtL5t/q3aTLtFueY87pq1q79T yY9+eJBZxQXyQ1L+SeQpz7JA/Ruoow4mK2UFx0VZc8OWchvWhf3uMvrF/0E9 nPZ+JOp2SeXyEZefJ9IvvpHrqzE6mnDUjCs7Z9EC/VKs53o6jbejvnFmSF1P 4vtJvix0NzjFTLbKMt4AAADN9vrludP3X0acPfyPtfrFmc0hvrY1HohnFR5E RlXM0+zG8OK4c+g2AT7mUfRL3kJq06nmFCTnJS90U66oRtu2TthUw/19+F7V zt7RS7AGJCg5vzElawYbdWN/J511M+9lvYaH4gL5ISn/pPIUZ7m+/sWXpMnK 0S/T82eypZyHbf7/ZumX4Jk18SNRt4sql424sX7xjSxyGftHU46afWWzFmV+ NkQqJXuuqrLHW/Mj7k4T15P4fiIuy4JWWawfBwCAgV30y37zL8Hnt/xYdM/I 6xdHDBGLn7h+1s7yuxs9lDP5X52uwyFnt06QUZg2H/Mo+iVvYeqNmI8gOS95 oZtyRTXpuIZMUzLts7936/puhl96zWBLlbxlHZE1g426sb9FzqqNZE8UyA9J +UeSZzbL9fUvviQTXqVbSte/ZlnN0i/5+khYsapyiWNLzxPpF9/IIpexfzTl KMGVLe5/kz+pYfmjfJGH4/E3zmKI60l8P0mUJdkNTkkkW2WxfhwAAAb20C/P 3fa/9LjdpB+L7hkT+sVJK179xPWz3MfybPjZT8GHTJuPeRT9IrcwawaTdc5N uWy0/712aL/Gfe2rZfp1e97YGRahI1KllSRV3t+COK+hT3MLD8VR/RBxKcg8 BVnyRZUUe8jEnJa5JBNepVvKtbua1ygX0y8JK1ZULnls6Xki/UKmQJRKbIS8 Zcy5snMWZX4S7+wKVnIWKfJ43PneTkvGJq8n8f0kX5ZkRTCmZzKFfgEALGIn /bLf/Iu76mu1fnG200SPu7h+1v2wg2dXlBTfU4dHEn168r6yu34RWCiJkspa aH2IbhbBTJpZWHLu1whOzx/P4y8y3RWOyJR6Y39nndU/uD1L2p4fIi4Fkaco S76o2SJNiC9JJw09qWKue7qldGf78ZfC+oUqyefrl1zaKSPkLeO54MrmbU3/ HBe/Ot9MSXzGa3mRp+MX85PalMlcT/L7ibgsooqQ1tYMbwAAgObPNgImnn/Z af/L0xMdfiy6ZwzuA9ztoo1zZfrZVp9yIU+I7gHEQgDmfkMtGUjeV3bXLwIL s2YwWefclMlG730N1mjrB5rjRyFu3i8yXaEjUqWVJFXe3xlnqb7Z3olDcVQ/ RFyKKCFhlnxRM0WySC9JNysV6Be6pbgffymsX8gFQkwpxZ4QG5HJN3kimVCB apS3jOeMKzvf/6Z/jkqpHf45NrTgZXFFiqyPO3v4wzsqez3NuJ/kykKnyJRA WlszvAEAAJqd9MuO8y/uJLsfi+wZVVK/ODsmwze+sP2sWZXyIE+I7gHsuwGi +w0R82D6RWBh1gwm65yb0tno8Uv04tFpWuYxrhCcfrXOesGWKjn/YRZBaZmo G/s77axBqN+pQ3FyfkjKP8k8pVnyRU0XyUF6SXpZKU++MC3lt/Pxl8L6harb z9cv6y7jRHVFZK9soUX5i3GY3Hl0TzWM/ptwgqdIkcPrLU6Yv57m3E+4siS7 QaYE0tqa4Q0AANDso1+eO+5/eTp7+N3AExXYD2z9rS3B7eJmfocPjsZA6s3K xAZKImVjEfFi4fB8PuZR9IvcQopT4GHvFKGb0tnQq8eeTltR8S83ez/Pt79/ bL6/k84aBivL3p+c8k8qT3GWJepfeEl6WYX6hWkpt+L6JVG3H6xfilzGieqK kF7Z+f43/fOFcmZF7vZjYSWLbI5ze/gT19Oc+0mmLH6KwfvHkqUs4w0AANCE QqPQNAmR7H7zL3bfvRtmbmD+xyjrYGIlvF3YlxSRz24p/WI0z5U4wbFqskjw bjM+5lH0i9xCisnJtH4RuimZja58vXpMmXj+W5WJdyz7ny3wN7W+T7/M93cq +bPjnPD0ODk/JOWfRJ7yLEvUv/CS9LNSnnxhWsrvrrh+SdTtB+uXEtUobhk9 2Stb3P+mf/Z0Uw92qt27S8ki2+POIzUn5dT1NOd+wpUl2Q0yJZDWVsobdVu1 0cduAABgEhr+Sq9iyboBO+5/6WniDtWsKgtf6+n/jm4X9nGX140qIkyjR8vJ lWnWIieN292NGtkexzyKfpFbSHENTvZOEboplY0evJgKuduqacdDF+qXc66i fr1Pv8z3dyL5a8qPcXJ+SMo/fJ4zsixQ/9JL0s9q0C+3aCVh0FLK65dE3X6w filSjanqcpMcyF3Z4v43/fPZt66H/1SsfJGd4843zkxzTl5Pc+4nXFmS3SBT AmltJbwxPokMHh0CAMBT6xcrNb5j/kVPsgfRov6zfwVRGyYWdMbOR2Dcfn3q wemvMlKfGiFuRE0YTTX09yv5mCv1i6vzws+eJe4qRLpiC0kq/zblnyJzUyqb NqhAd9PTVL8d9Wvg5GY+VnsbGL6/fpnv70TyZ/5QXr+k/MPnOSfL9fX/lF6S Xla9fjFefTItRZXXL4m6/WD9UqQaU9XlJjmQvbKl/W/653CzoYb8RYvsHif2 8Cevpxn3E74sqW6QKYG0tnhv6JsvZmAAABF/NsTNZ9f9L089GPeCyEew51CB xLcLe7dwz5z0C93X69GS99woTlm/3UyvY1b622qVTfx6TsaU3WptQgHOxhOz rppMKpuu2EKSu3dnu/in5NyUzSa6Cz7cG6JXU11cb8o9d0zq6p+8m35Z4+9E 8tOvqy1gPBh1sg5iJPzD5ynJUv9cXf8DokvSy0r18sW9wr0Expbyt9tAv/B1 +8n6pUQ1pqrr6TnKxE5c2TKLsvqlYe0tWGTy4UVlLjX3V3Q9zbif8GVJdYNM CaS1xXtjevDEfOwGAPCj2Um/bDn/ciPfaXKJO1Td6zuxr+F2QvtJiC4Ocke9 Yw/OTmxPz8Pc1IkbkbkP3V9delc3OgPz7YJXNvdkzMy9NU7IZ9INj+55jbY4 83cVN91/Ol2phSSTj0eBaFb65dyUstAhXD3Wv1rHqcm71yYe3q+Bs1OTZzch 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 hApL8YcWWrq4LqMTcZM/CoI6Ve4lUzJvWYeyDQe5d7z3QghyD8u3yjjlnvfe u67LIkPmmH+YkoLdWKRemO++7PDusXBQpgXMY+uMV/Pm9WP3ovrla9ePvV+/ kHbytefQmcyGecn3rR9zyh3PW8xfP3au5BogYcoq1GSGTL8ExS6gX0qtH8NN /jjk63RqRhtUmahD2Yjdbjjlzdgs97B8q4zzKvcw68eWlWmO+ejafiAlJ1+2 nwapqqCR6oWkhxcw792/r/jLeslV/7X799+vXyg7E7XncDGZqVP/zpY3+luX m/goyuz9+7dxrmZpMVbWpynBLTNl5H/eZcknX1KWltq/j5v8ccjX6Wb6Rdah bMRuN5zyZmyWe1i+Ncb5lXuU/fsLyzTHfHRtP5J56iWx82WHVVyRfjHrUe7b Z76Ot74/+VFWv3zx+5PfrV8oOxO153AKM3ufv6dyk7tG5r4/+W/1zvkX5ZuR Z6OVbsXen4yb/GHI1enU9jbYqSHrUDZivxtOeTM2yz0o3xrj/vrnHeYFxMvK NMN8dG0/lCJzL7t8+CXSL/aNsUe4RI/KJXFZ46r3eLt+iUnVXvHMipDSLzPp C//G/S/KM+N9+qUYB2olIImWL+WrTNihbMRBWuCx9Mu8wyneW7kJNnf4QRoW 2B/p3AvzzZdd9r70xPpFv52lavfI/zO5bdRVfiPH0y/J2iudWRkmUwrIl2t1 CP1ylRfnzTt1jpELWIK/6tA0p9JVJu1QNuIgLfBL9cv/juBbEugXsBmXdVMv +8y+kB8panTQZ3wH5g2Ma0i5o7jqPQ6nX9K1VzizQhTTL+NumTVfsC+iXyYz thUw0C8/HGq6sm9MhatM3KFsxEFa4Hfql3dXbgLoF7Ahl5SGSe562WnvSw+h X/QO/uq0jwkfx9ilQb/IOJp+ydRe2cxKUUq/jLph1dLQEvplMgP6BWzJPvpF 3qFsxEFa4Ffql7dXbgLoF7Ah0zTKgpmX3WZfSP1iv2nZORFv90dVNSduTqZ/ jeuDOdjVp6Y/t6YGIpl0l9Bd2pcx9exjZPT+E4ani3p5RYdNXZqgq7yeX1H/ 8y+K8b/731eZ/zOrzLP8xJRyeR1SfmCtrNqzk4rTvnqr4txzJXPNWp0YXXt0 8eZ034zvurtrZf0gaqWrz33mr8sjkbyjXy6/X4n8kg38+7h//0XyJS7SjJZB eoU+n7rwlWOGUL9wAoZu5ap3eXvvFt9+Z3YR2Sapk41aSNLpgpZDn0dan29k kvzSrWSm32JmdU+CHmmUL9fzq7Otfp9/2aaUr7IZpuRuB4uYVfv5dj7n5sFV YzaNrBljd+DdHPzj4kIPMf2Da/WL+u/QTpr//NcLlVWu+u9/kiVbdkPOXVDB QIO4thcNrtId6Jy7NfhoyO+5SP/eCUK/mA0wzgIy1eqw5kadeh2vc/JaMy8E qNwzmHTdWMqRUsNskDIHIsOdn/XU55g3QKeOpZ1xNWvpbKByw6iOTR9Rf3XR fAXjlPl/fC08uXNI/0tKuaIOCT9QJtsc4ixe7WpKxH+xHWUVb9b8xAI7ydqj qrmK4rExAiOd8Ktr5Y2qFXWyuTgOCJlivEZjUyLmcy/m7Pj3vynu31C+eMVg 6oArHXVTI+uQufBVaEYsV7xDgbnOT7KVd8af19SYJXRCLln2xGSTZH3IOM2J n285tFGk9Vwjm5dfppWk/Ob24/7FZKXpvO5J0CONM32/bcmvWgmbeHQvMsuU 7O3AxYsXnuT8nlX7XjtXJhW7eiLfKzo/mWpkLvE5ZlxsTdThSYJCuzbqdOjH ZIRvc8ap/5gwe1cmKzdK2S+Zc6vPOnXFBeWVST1ivwrSp0l3oPPu1uDDkUy0 vHP2hWzP9vI23XrfYbw6i+4xtuuJszlVS54mzmDsAh7q2Zl1aTazOF0ba7gE bvrSPHfmhOnlf3cvrc78tKMm3Tuljvn4aQ7F6i2vnUDvxpnSL1cnlnt//DeW eVQ32pd3PjnnnMD/cg/Qvu4R1SHlB8LkvhtvlO70dRY6mvWH6w3aKtasBYl5 dpK1RxaPiBeWmDHSVoS18tWY7Q/nhtS7rJ+dqH2fRUxndr9MIkbAaCv0XIX5 ba+3x3joF9N057WM8GzufObCV6EZxHSLWyRl7fCdS7byMdN6qOjkNRUcXNxF pJtk4uqinDan5bhkrGcb2az8yFqW+s1ed3pkMwxQ73aGf14jFPRIg3wZuqSb Vsy/VL7KZpqSvx3QFRX+mFsbLn4y4y3zboVhvlfMVyPTTc8x4zEmMVa8KcqM QhM2xs8Kosgi4/pm8u/167/+FUJWbtyt/J1K9r8++l8TvOiGLO+IsgMNus4y I410Bzrzbg0+nfwulzfufekJLs4e+8hTXzhDQx70duNda/rUrolTmRivh3b4 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 Dd8YaAImWOwOBx53neqPsx4QlOe7rkr80Dw7nLq++wkXGe7+p9vfRdBcpMc9 b5X5i8IGLGICsyc1zOS9JherrFB+ZcTwlR9+Il0p+mRpJSNOZs1dw2fiZfnL q+dfaqkUGCeoOBCMCS1BAe8HCO4WKWKxCA48DU5FxjADjdYvxEl2SmE5eD57 IJ1eqzr5NY7JJ8JIqJJg67kVYcHxB/1Ro38hGs7LChH8FZjgDn6JIiOkjaFQ imljwSnI8pKuo+DtYJGwGL5/kqLDX+pEyynt8nz+cqf9dlb+InWnALFTzxsn wM+LX3HyDEHCVA+qbR9X0lEwjNDHH/nWvi54aigaLesEIH9BFOuEIpQIBtjC 4SzF/IXTTdJGNAijCy/C+OO3RNklPWOm4j+a8Z/QNAxt0UzSvZmmd79+B7Nz 7hS+qIE+mA087jrVk2Y9ILTUcbViybFP3qSLIveQeOyouwp6zPO2aA+9DXh4 nrgwfXXMLfxUTZcV8hfQzM/QLbKZlpSUXFrJiJNZc9fwmXhZ/vLq719uUinw a0fcOuXFIAVYaR5FkQNPg1ORMQx661VV+/RrFoqDC+P9rsGeq1arC/jV7MdX cwV7zn0G6UdxTBPAPfDdEyjZfwutbQbFRJERcGMUq7sLsI0FpyDLS7qOZcdv XeJXn9fs8JexOTtSSn2jTQA2FfbbWfmL1J2YQnKXT0lIZkh+7lCQN49girB9 a//OvGECzjP45dhkUTkshfMXzgnS/AUvShvXWf1SITD8jW9GFPMXTjdJG9Eg jC68CErK/5JyTeUTmGb8xaonmUm6N9P0fmO0elxbxgjlBovSw8hdJ37Me0Bo qeNq/M3Qe8ZlmsJFkXu21K3MBFGjn7dFe+htwCO+zSI1zEj06vj3PurzX9JK pavUdTv/xcDgZfnLq+dfULpfg1KgzpG4dciLQT5wbdI8iiIHnganImOYyC0M pelaJJrDPa6e2fsLWq1u7Dgh2HON/EVoc4xTqmu6gOpIMYNfmyrIz89fYBsL TUaWl3Qd6fhPXvylXXb4y7Dn72iQSwX4vyh/wX47K38pOPsIsVPPGyeSnzfc PPMIpohnF4GFTu6a+3UEv8Yf+ccmcFUUzl84J0jzl+xLkX6j4PRrlBXyF043 SRvRIJwuCWqiepmyq3UeSp2TD+dP6REzSD3JTKIJ55k+Hk0juNMVfV3h7mYD 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 91Nj/+K7AivkAl2esEsbtmk7MMgZ4h/tFMHVjkSmXy7EaNqQo4mw030wLbAt tJUxTseujf44nm28a3+g/uddFbsAc+9udLQLN/903NgHjcom7Tv15mQ7dtm6 y/a/zExE3Ntz9EsIN3z6xpkovbV/38fzpIGuB0w31V5N/1x7+g0vmqaLjozt rs7H1liiJU96sE3t3ECoE/cmOx+V9GsnBgY1VngfugQNy3fkIJcP6EzyIwAt wYzXQE+Rni/kpEMLF2esKmaTypQ5P6YmqPyURa64x/WI5tJXhfz5XB/szQ/e asq0oJlKmzULHce7PzH1jfvzGpeq6djV1I1cW6Bn/ck/+bqmCkGMsz3wcnzW Bza5Xl/Y6FoNtHop5i0LMHbUm/PlWvUDsJvFVRgUBuP57mr1VH1UQimzWHB0 8DswXcDI8y1zXLlFK78es9n/jP04Df76jepMlWjOmP4027gzxtVmrN1zzoQU /Qd2zM8Y+s3vm6DYm22+8mtjauhmqq3nlCAKzrZK9Jrddn/ZMf1UZIVUoE+x Xf3lzv2Fi6wjUhAb7+NibL+Qo6l/jUY/mkyCzSOmtLN5PzczrZKNU30Md7BB XtWvQFQ+XUjtbrTsbJb2WB80mqTORdBZ3Gj3tr+Et579l5XJobIfDTG/Ruz8 EhhzLSc/W1eQE+kzBl6Mby/9kHBrcjqvvrhBySlZdGislS/u6kZ2KUkPXnz5 Yru7PqqL0k49kKZVPswuwYcuUauzHTnA5UM6M55FuBmPnZw8X8hJBxcuzVgV d2UQp1+3Vm5+TE5QA1IWuMKhfDofMp/bJmwuJlp370tnWnC1qTZh3X3jgqpt TUd1t6ddUNNfVJOiivBaNMnluDl0sYmySssxYz6jay0Q6uUufPMl+T9Xvzj7 J21D9AR/Xfc3lV11Evq2Xqfrf+JdDFRCKbNYcHQwjnwHGUIlIDbsZm1/E3lM N3X9azeoj89YL/WKf+N8JbSd7LorTXsvTm2OmKqtj7fdXvORT3Mi6sni0JfT de5PoobOZ5s+iftB34FWyV7rfb7RP4z0nnrKCqrAgFK7upNBd5mdOOk6wnJ/ 3Ebw/eKOJlP9YzQRtvRm2lKc0cS0SjROx67t79U7N5qzv7pTD12Eew599i5K vIVJ23tydkHRxz5b160qI5NLv9ucBIHs4hpg0R6u7Y6HTf7qC2mgLdJOlV/u 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 O3l/p1J27yUM7jOLsxAbT+kX42v/QSEjFx13n69iiSos5/rT71VeGpWo4eGz G9FrJVY9M2E+a4Xo+kK7TkHVcvc6R809mfqU4vtFrD6oLtj0LqgD9EtvnI7O 9CPsTDQX7Qj2+B+JDz4ZX7FFm+fmj325p31GwOpiTia7cLIv+YLMKSwlaeCz +iW37f+CZGWleBvmdW2NeI1fQRe062yTUo0mnBDuknwo5ct1ZHbKgs50YfWL NK0GWaSkQwv30geZ6SvDkKkltIY/WJhyuCsCCo0YNp+Tft3KLThJhg3TL0FN zk+tf/RFmCi81E93/nJsf6E2a5oZpRWaUZjy6dG1Ctivv4xS8vilSmjx4S4J aB1ADeGqIkaBeQ8QsQBzcxJSecnyMo7RB8370qmHL52U5jrOrsC433AKv0SV f8rFEL7ua+t3q5q66kTF2NeCKPc2MS9O3iZqaHqOnKkKrBK9Jl91n7ZCdH2p Xd0G/ZBihHvU6HmtLvh+KdcvXTuYr02ImY1x+od17+N+lbtBh3fBnu465umX LzKpn890q11dONdD1Yd+9KY2gfjZaJDayRR/kZMpJny4mzfwWf2S23a9tSPL L/OgbmsTycfLL9GtZjol3WjCCdEuwYdSvmxHZqcc3pkeijv1+ckpOgOFpEML 99IHmZkrg5ypcH4sTTncFaRjhpo7bD4PDnZr6CYoZlqwF+rm6wt269OOryn7 +5UTXI4dQ9qL2jajtIWNrlXArr+MUnJY6tOFinSn5tbd1cVY5OvEqooaBfY1 zOETMzfiLeET6hcjYHZyShPCbamCG7771lhtFhSX2iDZkI41P4nXJsStzfRB l2ju17O/Mdy6P5W7t0t0StRQ8/YOtcq7wTjyWnKKe84K0fWldl37fI4ljKHu UfMrqJYXfL+U65fONubXXjGzNc4L4NqHm42uj2LLJtj9t6cCvk6y6Cj32BeV iChttxrlU5vXFwuZPOxvEGbHzvzpPDhi3/bJB6ddOVFczRv4tH7JbHtwA9mh rBRqo2kur1/MgbZ6WoteqIER7xJ8yDpuiCOzUw7vTB9zyoTnPD85RWegkHRo 4V56PzN3ZZCnlsL5sTTlcFf4FF9mhszn+qAxrD0ZtuYg0wK9t53bN3HpTH2V Z1W6JkWW5pRy0uv+UhBTeDl21F975pArG0FpCxtdq4BafxnnWZVQv4zxTI1M N4X794pt7XlIJm7wBfqp9keNTu3JFypvv0+qi3iPAPdVF33RdxeC4iqESjv0 TLdTtmHj6JcL3Rxbx/Vx6LKpbW+QJYb3CDRvCdn0jb86jrBKiamhbWf8gF6J VXfrtduF8FpSJzxnhej6Ursurp9PUU4f72hwBxnfL4P1ixnYbUNqLloSxY9/ B5neqE8XRTwLsrNJjxWpX7owd+/83UsBL2mQz3bE/lGZOtb0D/1hZT3h3WPn nZUyuhk7dflna0nFpvG7dVkDn9YvmW03UXPXQrOQNLQUb6N/WT5x+5inZCO/ hLXHA4PYxfuQddwgR2anHNyZtInRSc9OTvEZyScdWriX3tvgrww5cf3Q+bE4 5XBXeJRO54Pmc33w5Obsr9t0C/S++ny/UE+6MvX5NSmppmbk/tKl6ZPv2izg XD0/kUFM4eW4Cn4yS98FvbjRtQa45ZeRig7LHaFYiX3cqc2vB+QjUP2784KH Y5Re06id/Y+xc03kZcvzjv1Gx/qXJYcHj/asNdiUdk9y/aVXR4+JRf/rP7/Q bV7cDeUnJGlO5nhdy/2qbXvmBWb4JZq3fzQzjFKbm5Ni6xtTp2qo/b23n41T 1TCrZK/5mYISnrdCdn2pXWYEPubyR2xvLkn064aCrKa6TaJf8keT3/5gFSdM HGwzxrVBnL2n6EEf75vHA/rXq+sbtUx39AH/l91sj/VPSXtJw3z9h3P9CsVM DuYrBI1R5/Nx5yRzR8w/vgRD06/EbU2cgZxR3m7lbkQZstp+sUtMe3U598Nv P6gUv0gbVVXE8osZfV+9W/qltKgN0cCgdrE+ZB03yJH5KYd2JmNiNL1wk1N/ Ll+SSdm5i8khzFj8lUGc5rLnR3GCyk853BUexdP5kPlcH9x2W21a5/dcugVb Z08fq5sHi7nGyTX9VT7cRdg7+Z7zk3A5brcvtgSyaQsfXauAef5lpJKnKFfg XEUn8SXe1e7eOGN7Eyh0c2zbDvfL+VA3v0SIeS/Oq8TD8rxjx2DMNT9EcAeV Xjfdn9oly4MRVoc+WfL5l/5NYY+5xJwH3dli3hGwvzjJmhPZhlTcSkKbnT5/ /Our9fzVKd6yqQjMlNU0tnlfe3vjzFalaiBK2qfy0FaxXtM9bTL9XGJPlVgh FjiSXX1Tq2bh3P5J1GDL6bL2c/ZG7JdL/mgyDah+zmYM9GdoeC32t1njGgFz tFtfZxvg9iKkP8/+eSFwH4q2H7+sH0fbS/aXjQTtcs7tEcwq82Ta3gTOdkHB Ky6RyXKsCEzVfXf/u7AleMEpFb7SBlIe8Axva3LTEK1gio5K7htS7ZzV62IP 2vs3pPu4qq/TpRFMlfvFlLjR4cAgd3E+dAmKznfkEJcP60zWxOi8Z6bIfua4 JpPy0ymZQ5ix+CtDYprLmB+TE9SAqazAFR7F03n+fG4Pbh+zrQpFBdOC3v+P Gd5UZX+r4hpn8/zl1xTP+I7qOIVpoiCmj2K+m1Udc7akL8ddi5pIqpnszb01 nzW61kCoX8ZbJ6EKHqNciW0cU++JMJsY136CzdY7uN3IeaXyxLpShqhreHh7 /fNSpN4/Zm8erf+C9RuvTn6DZUs/VuS8cL0O1zuDEoOfR4LjTtN9AUrWcCOK uiXySO3U6Rvd6icSPfW0FZJJT9h1d14UudeHfw5n8bUWbVYvkJD6ha8+KsBs 2Ec64q980q0SjXOCs0Mf4NZ9PH826zP/vBi3cm+5ccJsJw70khL5zn231+Ht PGymOFSmEumS69MljvpjvqjlF85AzijecCpDuu0d9meavT58O5zUgFLCIh+9 +dX8UvvF6Jfb+dSvx93OF7LQiymqoxc51C7Sh6zjBjkyP+XQzuRNjE58cnKi ZyQ66dDCvfR+Zv7KIGQqnR/zqyDqG+4Kj+LpPHs+bw7+qHMf0PyEv6BSLTCT fBOx6SnK3lDPNq5qVMRfX9N3WNN3X9PvnS3N3ADjqh8uiCm+HHv7wocv6dLK uissJT8l1zf5o2sFxPplwesvj4jmFu468fdWSajN9ac9b2/7zVuX6f6O351G qb/3x7/YlKP8/ZcHp0f+3fiu33DLl+ranHXbPf0153wum6YH6p9weYysIVxr bTnJeUROtybGGmjy6FaMZFfDw50Pb+6bhcTtU2Oa75c8+qm3saj6oV5uno0X vh7bkd7tOu/r6sv/Mbo5/CWsX1yaJwpuTdtuRzFVxHnfXCq/9skvtA/mX9uk zMRH9u6h6QzMLfrh2Wb4Ne+K+9ofIzuLDKyY5SgtWP7tGxmy28u3VF3IgUHs mtCHw3jSEPbUHzA5DZ/HxroqpCieH0t5rmHl5ubO51qwnPaNLLhdqSdwiRZs Wrv0DVaPqXRL35zm1/Tt1LSja/rO8VVz8m39/EVBjHA5rjZtiNe45DDgWriw 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 y6IobO8E+iXmENdA7Mphyl79Z6bwoRmL9MtqGEm/zOZq80b9QjDTq88YToJ+ mSOTrb6sWMDMYGjvtA0ZT6rNwNpR+JR2BAxs1jlKHO/5GKBfZsuM9csproHY lcWUvWqn8KGvUIZ+kYB+mbD0vyhxvOcdQL98LM+uvoTffFn3t19a3j+0zdv9 qmqXTPt+a8fhU9oRMKxZ3T3J8p4P4jUCBvplOPPVL90zLKldeUzYq+bdzI8p vNQoRfHuU/bdQL9MV/psrz7QL58LVl/G5v1Du//WbPoJ/vdbOw6f0o6AQc3q LheVuOejeImAgX4Zzmz1S6dVqsSuTCbsVfOBvGrwK5R7/fLus3OOQL9MVvp8 rz5jOCkoYzYDADyx+vK2p18um33zSaL6Z8MlOGyr6sYdHVbVT93WRF0Pztdb c8y7Tasf2qf9I+d3/BD933X3yPVN39ylGst3GU/es6hqW5uLH/MKZXV9VLK9 XsQTsbmI3lwjqdZeDk1H/BzUfVOl9sr9RpXuFEj2p9wOsUSqgWlIO8QhUtQu SzCY2PHeoC8XlbQnxyaRS+Nxm3FzY63PSpiwQ+igboTdDufL0Qsg1fH2aPTX XrztRh12ZObL5bRvjnjZnSj18PXIFZXc5qn9/UFoO1WkS1XNoPau8cddM8mE SQTf0TV1OerbMQiyM9pLeFp0NadfMtrVo7VKJe/q7ZNdS7ZSzKeaZgn22XTV l53CpVcoE+VZoxQ3YxSd/IMy5Vx9n7uE58wu8sXZUnINoVJ2V4HtXnARPZ9l T6kEhCFJx7KGCKVzoUzPgKuPGP+YzL/t/FB//yatdDLRYYcQ49AQnR6UQRb5 1JUelDL66svU+kX9VJb6bHfbfY9JQJ86t/igkzXIFGx0XON8vR1bwgo7tJW5 hbn2T3sn119s+a+2PH3nF8ux+r06Jcaob3P0FJyIbrZTZ4k948jWnuxl1q2L 3sv1G1e6U0Lcnw0XW17YDtZepoGesaHlKTukIVLULgeTUt1MKZt7XExXk+v0 it4jeCaulHKA6dlWF59D67MT8na4dYcj0MEbYU70drA7az5K/Mdkvpy/+uyn KCA0dfoBZZ+nz5KvX9wOOpt35na+6m8iOjvp0lVTpfdtbo03LfHvTRJ8x9Tk rBL49lEbvmqgPC262tUv2e0Kqj57JwS3i2twlCpuFpXPyXYk/U5wrI77qLq8 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 aRQkLy9hYc+0y0cfNMZ7g4m7gjSJT3tmj+CZuNoMBwQpsxMmzx/aHyZJPMKM ZDk+5Mtjo7vW0g9h28C5DTX0b+v2WxtmccH8FG58SESLthEm8LcfnPTTpfVL l8IYprwtsgi+aj6X0BLjO91y13dsTTXfIrH5rKdZAxtBWtYuZrMp7t+e2VXa q2w+yT6fY3ygn8IzGu9sUzNG3oQUkH2meptCifrQ4Et4/uySa3LpNYRemNDx xKZvneSJ3LYMvzLRjmUMqQzEr1hiKMN1TpPYv/o4e9j4J660bcVvWIn7/G7g DSfIcYIRylLBo7lnSLA5wpUeZFEmMzKeenmtfqnP9/7ZRnqp1tsI7x5rXhal 5xs9id0u9/67EHfn0FVegKmuj+ovmzr8VfzkVqzIXOpYV78py02G5LBXRJqD zX1yk1XmJSKnqHCmMrq1lTNL9M0k94r9xvmS94qeo0yHRu1ge4droDAKRDuk IVLULh+/9y6+28Kcet382ly9rswewTNxtRkOCFJmJ0yeP7Q/bJJ4hKnuYYx9 e1m66LfCEVTOM9ZNIvODt30W/evfI+w83cjvyngbTnC5b5Z9Hqfz8UKmCzYJ Wnut3Np5W2QRbNV8Lqklne+cv3vfMTVpb5OtkZvPeZrXLwNu6pOrtl/aeUiF PbertFe5fJJ9HmfiQD+F2/EglWcudPSMkTUhheSeqd6mUKI+NPQSLh4MUmaa XHoNiQxr23F1/nbUAOOJ7LYMvjLRjmUM6T+ZEhp4D68+QSgTZtPn0bX5IfXK 7GHjn7jS+u+uiFZob+xU5I2KDEYoSyWPZp4hYZHPX+lBFpPJjBfpF7Mc0Z5X /QWjPWbmbhVt2E+/NIGmUpubM8CVW6J/vjjfQ2oH/M+mPynO/rEqvDd22221 p2D/Y0z4gcmrbwNhefb6y7aqoh8z+rsP+gf0fu2J9pgf9r4dQd09dGtbp1xs xv2d3yv1G+dLwSt3+wvTQzsQ7WB7h2ugMApEO6QhUtYuD31w2235gynK2Yc6 5jbJeA/vGcIZpAMu7kaQMjshb4fsj94r8bi7q/+ZjOrcNZmiOaIf22hS9U+N 7HyDau/T8p3M8TYu8ccGTWFBujAbQVuS3frnbZFFcFXzuZS7EZX35R9yfMfU FIz83e14Jqsl6qI9zbo6li/Z7Qqrdk8Ixe0q7VUmnziCPL6IA+4Uni5PyZef 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 d3NbNaykafzFvv8LXvuAsQ37NTDxjxFmk3EPzxp/aaZf05VinUYxOz0WuMz+ L9bxF7TSYc7I+zkXh7fvS/cv1iBL7v8C6ReOvxBCyMaRo0z1CR8/8ovWvyRn h5iyGp1Tkz9i/UtRuwsrXyzjL6IPRhcS+unGEgJGKq412hCMOTcEmk1zb94N lWpWPB+aLngeVPJzoUvKeg05FvTaeWmNPqcKRJpUyhNT7kJJTtkT2FJsz7WL 50PTGRsZTGx8lRJCCFmPRIypPeCz7weOv+DuzGl4KTwYbM5wwVLzpH66U13A yMWV6xd5sr+SKzeJfoYiT5ix6tI561+g6ruEaxtSO/8YTCqXlPESihZ0gLXZ yfqX8pwJV0zPBmHtCzYgtPT6F2AAhuMvhBCyberpl4Kvp9ba/8XiHKZfVt// ZQItONzzxTep556yRB7gLiT10x1Iv8wurvL4ixakjXkUF4urmW1WPC+aLnok VOv+mn2cvYIgc13l4DYB/VULBExJeWLKXSjJmfJkbkcaGwRNV3n8hQMwhBCy cVIRpvqAz70fYCuZ+ATPinjbeCVhydVU6XIM7kihHlJ0IjwYTc5xocEmzzUJ BeUAChhEsyXE2rzxl8RmF5nVI1MW0eecMgUvqWRFsX4t3/9lrD32K3uwq0f/ vzahNKCrOinJy8dfmqCiYI22t/+LZRQlMIc7L3kP3xq+JfHqMDcIms60/ws2 /qKtRyKEEPI4gPhSns6R/6/AzAwPZiWHUs9og9Kmyr9ebSbNPgAqTJFPPegA jFZcurRbga1zRWdTpvFvi6RDFpOJapbW07fVttcWrxOYTK2+tfsr9jEIWs9s Yba0mBHQFvTULndhpvfYxWEyiruBe1vJpugvIYSQDYCEl9ojXqDETLkDs5Jj qbVUmWJs7rh5qkV6dhcmaSOWj4shTL9cc4Upxd23mnGvaXnWvfZfgDj7XjPS ZhoiaNeiavrt2raGShmq7iWXL7+suWSXz+tj04XU3L6Hp1TUcD2UXVL5lsWz 2I2kzc303jdhvzZmNYjBdC2j1C+EELJJoOiykT5Ym/8XNtNOf2ccsJVmTp5P P7cNtOSJKhtLc/4tMCdnKcM3A+uXcq7X+uMv5b+5+47Vq2Zsq13kp+u51c88 VIpt4qMv+PiLUsMqjVHSsNiDu9iFec7PvzjmNAhuupLNlMuEEEIeDKZf7JSY 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 wWifnrXSOQxs/4D9gvhlNOpCznMk12c5tr3EYYh2g/XWPPT82B3r1+RkIq2m //X3iY5dmqjmvz9xZbsfcm5iNO15jv6/uXJu7WqlZcIXswxziSpN/roezY9h re/4bfT+sacbffWEXGWe/u+SCPBqjlbHaSVugxL0FsYosUndOFWChTgVu8ap h25UacPiI9UbFosfvqg8PRKsGKfJumh2VEe9kybd+kN6RyfHRs7ZNjfG1FQU yy1CnfehBtrBjJNexNAEUvYQy5DrcOkaLrJZ7N/JerPO69n09PBJNzhzjnkS 7SF7yFUzIeBxl6lmNuuEHtzC3bwnhwkfZ9qTR0MnHXp+tXm5oLDqJ1m7frjx cp/uKJ2UEspbR9l28tomVlvgbEXudMDRDaHyUpuSHVeS2JEYfvFBniis7tkM 23SCXjLpQi9Ddi8krGlyZygqV4BST2k2YqFOnTQ3rKKJw3RVXPRvcjbB7Gp2 GyZ47i7D3521qb+p8tHF/KFmO30h05r9EnMGO7da18LI8iT8uTk9a+XMaxq+ f8Bu6WKTLmb5zyfdbxW//CVB/OJDZ4Pb8PeZTXzokWcdbVX8Ekl0Dz+GtYGv RipRpZTtuBDl7JT+ULAcrV3NWfw6HEt00yr6QyYWlY5fBCemm8OMW136AjKr 47P9aB2miM3XjagSLhSu8qJ/DOuDFiDsn25R7/RUoxf0qtmtaN0KuW5lkjkT tMyGuWhvFQ3bcndixp8pSV3ynPUFQvtnRg2D23UiR24mf7jevPMijsqji/3P 6abKail16JGpZkqAUdjU3NC8tPDNzRmt5uLUKWwbVAGMMjrjyB7sxnPl0kkp obwm2E5e28RqC5ytsId2zsjWXDsXUrWHlFmOHH7xQZ5VeOiMQ7BvVcvx3Z/b CylrmtwZplbHlDoO5FqCJTC1FktGjMtIojxbGoL8mgxedmd2E97spgjPAPHG i85+qTmDn1uNbdHlSfhzc3rWyprXVHKgf8BeQfwyHmvEVs5k5EyLgjkqVPwS SXQPd9yDM5LcTMtdefCkXKfFL6R2EQ1RRsUv3VrvJj4XHf3NF0bM1RZwHRO/ WNUFsl29KThf7BjdKqtCvlCkSp1tuFViLnkNF8/KUFHpI9YmVR4hJZ66/aRP enT80q+TzPOVdtFzwJYPtvgD+THc0jDXEGQTZNdwYKq8qfyRepPnJWuiaVVx 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 /L+4iWb2gt/cypr41PzOcAi+CmLcQj1iBtNF+PdCkNep8ziywrObewuHtWzm YUZ7HVQfYgrvrnjF8tTyJDztD2Gd02flkegfsFcQv4zHmmHyLq4GpsVoInf4 z51LjO0gC9f8x0u5heKXHtG0wQdNujktJ5FJU1Kd+EVNfY2L/WW3fokccc+g MScRyia9rzKQHBM7RjetSqRQvEqiLC1wjKnv3eLXMm92DV6FrafBTyJ+EXLt qa2LuXI5JAFKni3bC1J/3qf+T6nqiaQOQkpSNlJDY6V6+YP1ZpzXQ2W0KmCa SmeMSzx7JW/mgeeQmpSIgIfjfCrPiZ4PPSCbrXwI/92rIWu9WW8QVudHzfmi W4DbQca13Fk/vhJV3ogItZMnPFabLTKQr6AbyEIj28ng5qll+0SHX2qQhwv7 8Yu+880/AZ0w0cxe8FpNW1OoTXM7w0GF0v7tJE5g6OioGUxVXLGJgc1fQVky /4nkcGc3XdDbZMbtH9M2IZddmUYuMji5X7E8tTyJgPbpWStrXov3D75duR/u T06S//vkL0kXoxyfdMe6///ryV+EpfVeE9YMo6L9C5fIF4nKix6+6YsuVmJs B1m4Zrm4WJdGLuFy4jlteRfnzaTXhq/ck0QmTUoVjRO/yNsgjYuz46TLk/X8 vl2dI5Jmk+3yE0iOiR2jm1YlUiha5YDcLWYua0sv6MoX9XwkI/No1exVeHEr airjerLxy1m6QParS/1tR3m2zFyKl+7LwTVkKeNgZQ7XIMsTJWn+cL3p81J/ nUip2JBMSYwM2bCalNSYtzK3jpq23hfVaoK8XSgRv7TWXkl3n2bTDYmTFlV4 p89PiYcs5Y2IUDt5wmO1uTLYfIV9A6bLFHt+Xz0vYj28f5QjOTr8UoM8WNi6 XaZ1V3r4p5o00cxe8FpNW1OoTXM7w9fXFhwTGDw6agZTRQK3kuT9B/flYdoq ZXahUC2jD8jevQgH1rKD8YteB+UCQgamk3sOyzPNZ8/N6VkrmINGJdH+qcPG DLYG4pfXsSYkOT+WDZfIF4nKix0Wpb5sYydGdpCFa/7HnVoeJXFsvHKiLr1H woVenq+RnUck0U9TUv34ZbgQ2LjYc21Dp1ZPerg6V6Q3BVeB5KjYMbppVSKF YlUqfh11h1vsv6Gi7i1+I/Nq1exVKN0aomppcnPxy0GuUs7rTpVkY3d5tmyb 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 1c7P4k0ldVnWofhFfIhxRqcXT0fok5if3VoDN+7rReu+efbRylfTAOXrzwKd xmv9pRj8nPtvBghgdABD/AJM8WbxizUM9y+SO0kz69I9+wjPjaaLlRhNeFAz auMMpvae+hp+cnJGFtGNwXe9eBH+uZdwMla1V2DK8YF4p0t+p/cyG5egT2IW 8UObs2ilHyD21U8o2ztgWp/OsnKn8Vp/uDuE+8mb4X2UwHRvFr+oy8nb04V6 1f90sXVmNucUh/3Rfz5ReG40XazEaMJdf3ajLsrv7ufdul/zqgtbgmc0iSyi G4Nr7fEixnau+adN667py6dTOy/9OavTiz+K0icxvy/dIOsf4dDmLLrV4YqK X9qrx/orwJzfbT7lTvPttv4vMfg5S2kBINebxS/6LcJaeTQeEbS2ZrlnH+G5 0XSxEhMJ1VlNPZ7EnJwvzmJPTs7IIroxeNYRXoTqZkbo738f3L+IVj6dOrrp x0yjnV54wwx9Eo/wGWutti5cUa2zizi2RpBiH2i2agGv03ixjir9SyiM68cA XEXHKX9oSNOrxoOqdmvO2cEqMtM9+wjPjaaLlRhNWOpnqHZnSu1XZgfni7N9 IR1V8rOIbgzgRXi9xHue2K7/CdM7FeuIN7NkdHqxX9InMT+7VUVvf+na/xi/ dJeTOY/xVoKdxmv9ke7A/fsArvE+8Ys6canO4hNRxpnnXekNt+Pc2pkbTRcr MZqwHq4KU7+y7NoP1lPGok9OzsgiujGAF7H3zr3UZZfjt9DdbcgtMX45eOnP 2Z3eQ5/E/H5irdVd1P5RpeqWdl+4eo50Gu9NMT9SBwKAG3if+GUcht1XQpzt Mbr2zj7suf7ZUCBdrMRowtV4tOi+/+1eGmGFKn34Ev6KNpFFdGMY+tuXe+Xb /V2/2d+P3t7X/u1yoxX9VK+x41S6V6gsnPQ7L/05u9N76JP8PcOY5Igf2ixH 9euMyqj9swuh1ftgrMNPsNN4rd/vgABwG+8Tv5zGYViNuuY3UdaTSyv37KMy R/DTMTddrMREwuFC912f0H56cvTFLzlZRDeGQV+mpqzf7O/P/uvDd/n70dv7 +r9dqpsZYX5/MjjcWLIeOpGa4aQXb3/J6PTijSr0Sf6eYUwSu8CP3FrdRbsm 178A5qd/6aTK12yMn8FO82EWNpYevWgNACZrY5Nfe22skvs+y0fX+yLmg1C9 W2ztp6Sud+Gk9txouliJ8QLNI0J3ADjW1mOS1/rQFhbPIroxTCvr2Lh6s7+/ +qfnvMvfj97e1//tcKMV3aCHs7ht4XAyKN305wmdnj7J3w8Yk2z28yo+d+6M TtVPUf+r+OWnf9SyCrU/jCzDnSb09OTos4Htith/HW7yF9k8UzbPXTksxlvF L2oYVqcLK+OzMVPHA875ipW0OaU5ZKaLlZhIaFRNpdyaV8PHX/ySk0V0Y5js Jy3t3+zvH+fZPa/+96O39/V/e92gVRlTuh85Snu+yU5fe+nPEzo9fZK/HzAm Sa1V/ypjRBJm21fx/Hf/v4pPyj4UUkebrZujyZn14S5byQ1ZrMg9/iKbZ8rm uSuHxXir+MUchr2vZaPfd0Zup42mi5WYSGjO6G91GQ88/fdx44XOO//y4kQW 0Y1x9lMWepn3/rt+8b8fvX2v/9uhuplxVFIBie4b1tv8VBZ2+pWbfsw02unF mfRJ/p5jDJJaq/D84qORaNcvqv7vf9D5MJvbmG2s0xzdwrwOKLArco+/yOaZ snnuymEx3ip+sYZh9yZed4xu7U6xuRnpYiVGE1bWjD5cGRdTf48vfqlLv9vF s4hvDOBFqHZu/CzTfZc9hPuVecBy+0hrIx3V8ju9jT6J+YmttQ1NKuO8TT9M TM3+MSd6l4TFOo1XWOl1oB/zSrQ+Q7Mi5l+HG/1FNs+UzXNXDovxl42ceOUV 4hf7IfbO9RnyE+5XkbkZ6WIlJhLaM7pjwHDOpa8PHk7K6tK/2j6eRXxj8J48 vAjv3GtltfSN9cWwu2yrFKZN6PROOvok5ia3VvF++lr/4qLS9Mt8F3Y7jXUa rzD/ZbF1yb38AK73TvHLyhqGnbtshctEVu5c6RGQ0XSxEhMJ7bK6HziNS146 w1dazQS/atEs4lXb29ERsFjubSRd5xnuX1vZN5gI8UvtpDcyzer0Tjr6JOb2 5bfWr8DjJbb6wq+u2es7Zj7NYKZNbP1+YneaL7f1qwlmio9CF8b7jQBc7p3i F+eCDPu5qsaTS5XD2hiGvbnn4BwzXazEREL7upHuXEafdPW/dg5j/6qUqhbN Il419UclrC2wLP67XppoRHeDnfOttBC/bO2+ZmYa7fTiZdT0SczPe3lL/Rl6 Hct4fWNhXJ6suoX+K95pvMI+3A700Ze9FToWAGR7o/jlYA/D/ZnJSZ5ZH82v O9254UytdLESowlrr6zjeO7ivPilXnvnXMksEhujEM7jgAVy2nnddp7h1G3n /KDhX+oivD3Gz9Tru4Gxgj6JB3AbpGqt7jPKOruxgZXjDy7qF5RyXMZKa3ca r/V7pZc6PQ0awFV0/JJ73/6C4xd1I+74dac1svZPoNi2c+v99mQN2XqucE4S TRcrMZrw5H1/exgCFvPJyfXuqM6v/G/TYlmkNgbf9eJFrK2eu2tOnirrBZLW wv399Ht/kt2Von13HT4vo09ifrq1tu2o/tl+2Ic2Uxtb6GPc53D1WH+5cn8F mNdp+ieV/ehkTuvfWBPqzVg28QuAq7xN/FL3A2mxHqIQdUrQPrnrYL8fTOt/ 3B7mntwAJpouVmI04f7UV8u07k+rjmJC92qVaBaJjcG19ngRe/3ejGMTFNSr po2Pr5pUfcB8ga1+C8DYzWvdTUujM+R1+o33ZQd9EvOrv7yWOrZWe8k2ui8+ dCBS6qn64UxftW6k32aifu5HFx65rX+Y0N5WU39b15Jx/RiAq7xJ/GKfcvRn Ad47hF36kZImM9dYuotKbBOO71Jyrm2JlWmvbSKLeNXaOvCsIyzfxmrnxXq9 Mtr0ymzvLfMZmirIsF/SpyOdWN+1+7cVqtAn8QCx1mrb2PO+ujimthJVX25y q9N4rf87Xjb37wO4xpvELwAAAABeQPv+yt8m+tPGo+sNAAAA4P0QvwAAAABY CuIXAAAAAEtB/AIAAADglawbj64DAAAAAOQgfgEAAACwFMQvAAAAAJaC+AUA AADAM2vv69fvtGz/f3R9AAAAACCE+AUAAADAUhC/AAAAAFgK4hcAAAAAz+rY KBu/9nTc8kvv0fUDAAAAAI34BQAAAMBSEL8AAAAAWAriFwAAAADP7NT4rfFL hkfXFQAAAMB7I34BAAAAsBTELwAAAACWgvgFAAAAwLP71ZATu/D+SgAAAACP QvwCAAAAYCmIXwAAAAAsBfELAAAAgKUw4xLzsxvPtPf3P7quAAAAAN4b8QsA AACApSB+AQAAALAUxC8AAAAAlsKNXf7QWDfaee1nPf3YeHRdAQAoHuDR64wH obEBT4n4BQCwJJxSYjY0NuApEb8AAJaEU0rMhsYGPCXiFwDAknBKidnQ2ICn ZMYuvzWqhp73Zw3iFwDAM5n7FI9TyjdGYwOeEvELAGBJOKXEbGhswFMifgEA LAmnlJgNjQ14SsQvAIAl4ZQSs6GxAU/JfU+lez8/8QsA4JlwSonZ0NiAp0T8 AgBYEk4pMRsaG/CUiF8AAEvCKSVmQ2MDnhLxCwBgSTilxGxobMBT+rXnxiuh WOZPG4+uMwDgfXFKidnQ2ICnRPwCAFgSTikxGxob8JSIXwAAS8IpJWZDYwOe EvELAGBJOKXEbGhswFNr31vpxjLS3+3/j64rAOB9cUqJ2dDYgKdG/AIAWAJO KTEbGhvw1IhfAABLwCklZkNjA54a8QsAYAk4pcRsaGzAYrTvqiwbOl5x7+F/ dP0AAO+LU0rMhsYGLAbxCwDgWXFKidnQ2IDFIH4BADwrTikxGxobsBjELwCA Z8UpJWZDYwMW69T4rcH9+wCAR+OUErOhsQGLRfwCAHgWnFJiNjQ2YLGIXwAA z4JTSsyGxgYsFvELAOBZcEqJ2dDYgJfQ3tv/6DoAAN4Xp5SYDY0NeAnELwCA R+KUErOhsQEvgfgFAPBInFJiNjQ24CUQvwAAHolTSsyGxgYAAIArcUqJ2dDY AAAAcCVOKTEbGhsAAACuxCklZkNjAwAAwJU4pcRsaGwAAAC4EqeUmA2NDQAA AFfilBKzobEBwNsoRNYi+37iXkoZnCTMnpCuWHnz7Vzq1frUTq3WW6degt12 XTbLlt6yzmp/fm5/QvPMbSOt22772ZVhZmHm85VYoecQ2NeNutva9jR305Tr zcpLmGhAwT3tb+RTX0otzpVaUahm4V0rzGya2E4nrLop9ZDRuvt7bW+lbjNl FDHWp/7efHTVdFpP3lretK/cmF+b5ZeXaFxnubPk9paffvZPNHH1OTbKodRA K9IZDyNUbU7Oa2NyO+7th/E1kbPZg+/gFRsbAECUcXQ69hM3UsrgJGH2hHRF 6c03J+wq60RAOg0w6l8GlxVWvarD83Q9/FWwy/BjldQKPYvAvm6sgk3A4e+M aAMKbhhvI6/75WtxbsZZ18pZVNq1gZm62WzkjOyt1K1oRhE6UX00lzBbT95a 3rCv3JxX/xcoT9yx1naVOst1vUVKa48z4VbU+TKbQbVzcxYKi9TaWn6VnbPV g+/AW5E7m7s8AMAgeXQyFjkIk4OThNkT0tkHdifFYe3WtwofEfdlZFlx5Xex LSPGLz85ZZgnFKFt83DDGhzcORt3p5xDm+iUmameGtjT7kbuT8/6kx937jnn rOtkLyrt2uBM9TZgFZ9sdT51P3PY3dthjTKK6NPs3NbzMWSXuZa36it34NX/ BcqT96zZ7KXOMrm3CL9luIxXVEdaUaOunLmfTs5CFWIFF+Gc18Gc7R58B96K 3Nnc5QEABomj01mfsrVWQsrgJGH2hHSFdbLrHDHdI3XsmLgT1m78ilBe+zoy T4pfMstwY5pAjR8ptK/P/ZVTzlYObKGjvVS8ARWhPe1sZOfkx5nrTkrULDA7 OrOrvApYhlO0lTmvpaKFOq8I9fnHX2j4QSV3LW/TV+7Bq/8LlBfYtUazlzpL Zm/5HmZ8ZyQevhSJtSJxhPqwcxZqGi04kvMpkPPdw5eXbGwAAFH86NQ6DVMr IWVwkjB7QrrCOq5bKaRTMucampEUWhjBhbz2VWSeEL/klhFaoScS2tfn80Gq cmgT2Wco8QYU3DD2RtYXx+zO0lxvUqJmgbnRmeXBL1f/uLH265BRhPosNedP L7v4Wt6kr9yFV/8XKC+wa8dmL3aWzN7yMUyvMhIPwUCsFckj1IeVs1DTaMGx nE9izm4PvgNvRe5s7vIAAAH9qab5laD6xlkdfKbf9ymUkX28PNjz9R/9kbrs 7hU97PQppH/Hxnm8vqdatQvXw5Xa9j0ueuEf+RDrV9hOpsv46sr4lsuwN19o 2zxYcF/39+CvneXdLbPfCPsi0YCCe9rKXP/Q4USFwdokaiakjqxV38S6H1kq ed/2f6sT12pKEf337Z+7rvVsS6upZK1lcAtO6yv3EdkIiy0v2ezFznJdb3ET /3yqKf2PNNFWpKNYNVen1L/dZLWxwJbQOa93bQPUHUX/HGkl9XrwHbxiYwMA pPXHH+vI2x1KS3UmZF3qcOlxLyedU5qZoj/ojzP39sHa0scSw/0K+iga+u6x Px5Lt84Gp3hlfAllRFboiQT3dX9jh3xFv5eD/QV/vAGFN4yZuf6a170qL1ib RM2CjVOeaTxlTDW//jFeOnQdGt9+bD65RaizyeFaob4FHvPX8lZ95T7mbuhz lJds9mJnua63+IlVw/k0/wi0IjWz3DlzwwN1YvZonZ2z34Pv4BUbGwAgSd18 7Fzl0x9Jj96R9tLjXk46FWYcrPnqY3/KaJ4c1O5Z2mDnHzPtSV5dvoQt4FdY ODAnylD52vdl+/V9tOC+7s9U3Kfv+lvm4E+KN6DwnjZyEk5+Jre+Q3x2dK3q cdLKbH7dH0d3gvojtwh3OdVSPvLX8kZ95U7mbuhzlJds9mJnua63RBtlvBX1 vaf2kn4Fcs6OX4I5r9yks4QvL9nYAAAp/THGvr9STdz33yybh59Lj3s56Zzv H43Z6itl+wcS9TVm5RdVBRcOnh8maudPySsjvELxE91Zhfd1IOLK2ViJBhTe MGNO+uQn/n10qvVlNc5kWusG/u489eBOKEIPeBaLKMYk57GACatxo75yJ3O3 7TnKSzZ7edfn95af/nb8qfG63IrUzy/W85TNVnBFV1HN3fqhSc5Z6sF38IqN DQCQoC+Gsb83XOvDUXeebl5ZdulxL+ucbGUdj71s7QfxHsr1diVcElNLC9fm od6vS85JhjnFyi5cxtn+AcbMMXaCMK/wvpZfyBf8Rtk8ZU40oNSePo8N87qr F62aRbd5POvuk3EZ2kndNKYmVM5yGUWoK24+5Cu6ctbyNn3lXuZu23OUl2r2 cmfJ6i2fVm/5jCW2JkVaUW22WD2t/Nx+T7nHSshXV9/O2WxfQ1KxB9/BKzY2 4En9yQP8ofHo9cYTOvSXLtuXbatDVHtvx9Y9Gbr0uJd1TqYOyOuzNe2sv8jL vP94JS6svpX+lutSJ2rnTfnOK6NfIeu5UsHsHySyr/srpdwUftXVihvfG6ca UHBPD5nra+rt0ie3Pqtm0W3uz1S/HVXd59M4t1ar1q2YEatWk4ro71EpNtKl NTlreZu+ci9zt+05yks1e7mz5PSW2uktdSTxj9HYYq1oJ/SeeLVy45fcnOUe fAev2NiAJ0X8gqchPHrsfDa+2x0Prb1Lj3t552TWl8rj7KN7xI9xX5aumKd1 Xl2suw+CFTammJFKpAwd6Hgr9ETxS2Rfyy/kc6t+2KlGZP7IkmpAwT2tMw+c /ExrfW7Notvcn3kyamA8GmqlPu2HbVPHmlagiPEZAMXH9idZlXv1lXuZu23P UV6q2cudJZTM+JHF+JXW7S1+S/gwu0WkFalm4LasYLXcSZF2rHL27vNxs5kt fHnJxgY8KeIXPIv+Czz3bdDdZQyV+7FThJizhZLyzsmsy43G2cYNBmnywrVx 1uDWZScdaf0KG1M+88o421eEmDlGThDmFdnX6it+b7PL+99qQ6kGdA7t6T7z 4Q0mzuNoc1pRuGbybDnrelcVxk42btFf98sN1TNv7s8uYmMt8PFtbuWctQxu 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 V4O+p7+9X9+9h7+9r/8WsUtb7oM2DwAAAIAnQvwCAAAAYCmIXwAAAAAsBfEL AAAAgKVw45d/aKTSbAX/1Ph/en/XS93D/y8bOfHL3TcCAAAAgEUgfgEAAACw FMQvAAAAAJaC+AUAAADAUoTu32/9Va+9d/+vDP+L4H9u3OMe/vb9mA/YLAAA AACeEPELAAAAgKUgfgEAAACwFMQvAAAAAJYiFr9cor2P/z83/snwx8Ylscvv jVvUCcquKDbNf4WjXG9WwtL7fvbentxPXXnTzNnmzFNfSm2k7lXr406qqFy0 W28tMi+ryp7DanNSG2a799Jk5ems5qe8mjmV87enVA1ji24DRWVuhN12Xbar /rn9kZL7W7jq/quHBdfd3+vh71rVK5zFhM0wrqWzQYWtdK5X61O/SZwm3Ju1 5rmNb0Lbk6vjqb83H12Ozi6VEv1sP/u9XycWDRQZrlg8j5wtPEg28lg21oJ5 zc3JJ1LepKE0qw7mTGEkFTJMr4FX68/Nd+ZGdCeau+Km/WmszoT2K2yARL9L DhKpDTLpQOCmDXd3bd8Px+tJHdL4nFP3XmBUldPGVztYs/CkxPnGwO5iOasn 1nFTFOFjMhaD+OVtNMePsv1f7PH+YffYz9nYk/Uw4k0zZxvz1v3ytZnaHI+E A75cdGCsyo5fQlV2HI5mDqU3WObkKazml1jY9O2ZPk2RtmjmRjiWoSoHNnDR HggKs/lYW76x6v6U4mZryazNEFxLfyvtquQmmbXmeY1vUtuTqxPP8UvOUfky t1m1iy360PjF3TaJ4iPxS35zm7C6uUNpVh2MedJIGtqek4KQzpeTTX5SvStu 2p90ointd8oe7mQMEqkNMvlAYKYNd/d+i13YIY3POXUP1SGWNr7awZqFJyXO N2yr6NysXVOaoTaWivjlbVR9v5e7/MldfJhzECd7A505e5zVj0r9QVcs++SN I3LRgbEqO34JVdm2K508xurl5ynV5UMeLhOVM8uMVMMmXXGZsRH27qpXtZfc 1Z+VbPVydT99SLkdSg3lkL8ZbCe3dmPKw9pduPK3/rw194JBrz5C2/uItj2x Ohfl2K1/5Sz6Gdy88qRg1TLyiK6SPC/WyCPZ2AtOaG7Zq5s7lGbVYZwljqSh 7Tk9fik+cjaiPEvtipv2pz7NhPYb2ADh8S5rkEhtkAsOBMPMyKGm24Buh1zb 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 Mr6KUENEey/E1h3o+8SlOc4IQ6e+Xtf5OV4Yb6yrDqJFRzLJGMeCVfa3RDM6 pn73iecpVEedwfrPfM3cnrFqWLPVN1jVxHLGd8v5W+Pbz8cq8TROqdW+6/ac 8YCYKrQq12wGs90Ys3fimshmq3k/+9OfbZjW9nLil9wc1TYT7zULFRioQ7hq 8TzSW9ia+WPsnLziz8ImnNTcMms2YSjNrEP+SJrbRhK1npbUHG9u158Ko1oZ PUKYFN26UwaJ2xxcQttcXrkrO6TxOXdTa4FRVU6ad0xNVLaVOt8INtbrds2q EO93wnIQv7yDY+FefT/2+cNOHXbMLz3G7yzqYWQxU5/tbzX8oTNw0JXGG/G1 AWLRkUxyxrFQlf3KdE7bvTPTLCSeZ3A1A7ccJ7dntBpCNOEf+uLluO/OVqTD vF+i8dCYlfq0HzIzv9i9Zh8l2o0xW9Um77KA2WquHwUWbXxG2/vYuj/UxXd6 QG6Oajv4vw1KhYcnxasWzyO9ha2ZobvJsrOZ3txyajZtKM2rw4SRNLeNOPPq 3YdV6wlJz/Z4c7v+ZARBSnw0Dm2A0NadMkjc5uDi5xFbOVU/d42jNQrs/NxN bdfKG1XlpHnH1ERlW6nzjWAXu27XtIWFg0QsgI4bcuOXf278TePf9v6x0U7f NP59488b7f//pdFOb2OWv2/8baP9v323ZTt922jT/nWjvVe//fte64jS/DG6 EFmPEqzaKZX7cUx9tn/o9YbO4eH67uVfiREzXnQkE3md8qps2VgZnFbmzz9m pvE8g6sZjF/i2zO4+s7self1O2BiOWsxlbNrAhUyvrJb9/OGZP7XeZfto+AG 9Y608prIZqu5nv3pzTbZbe/j21yJws0yVJ1LcvxMbDO5QKnMcFWEOcak9BbO b+Q52eiP0eaWXNvrhtKsOkwZSb0VDKxBotbppEOJzq64XX/q/8gdjUMbILR1 pwwStzm4CLWNrFyqfnKNCmEvZW/qnj+qRopIr3ZGZc/n9PmG5xSda86M1rEM PCEIS0H88gbaQWn8Fl3s8tbXEOqaAHWsUT/o7u3UZ/3dfG1NGzIfX83lfKXv DlzetFjRkUyyxrFAlW0nJ4+189oOZ/yW80yupjM5XLngusbWW7praHqF06Ur xjerumx99mJ+I3vVPkpsUPlj0mw1D8+2fDglfEbaXqg6l+RYJraZXKCUJLGZ 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 IY3PmZvarL48ql622unKZp1vBBvrlbuG91cuHfHLG1gVReQelHrV30HXDZZq cLC/21RXJlRj6mGO8e2JnLkeiMWy61VlDsupokMrIE9yZoarbNLPQjm2tTjs 9euRY+9/kfJ0VvPbWs1pleuTlt2dm4ddf5StzNTC13reOz+T5ehvTlVBQ5vI eXi1cQ3A+HyC4akyp2jKzOo5G3TlbFB7dmmtyW7t5PWAmodnG4a2157S1z+6 7V3x/pfsHIe9/9kt+aW3YPh5t4E6RKpmNeR617+PpspYJW9mvJFPj1/So1hm zSYNpVPrYI+kUweG7FpPC33cXXGj/lRYKcXRON6gkv1uwiCRrm6knGAe8ZXT HXLdzh12UBmOLMxJxufcTX1OjqoXrXa6slnnG8HGeuWusU+MsDzEL2/A/pm0 COiWUEOHe59GOQ4yzoAxPvzQzNwpu0i8ebk6ZxVtr8DZn+QbZ4arbDqID0MR rsmI5xlbTUeqcrWYVfD3LH1Fh/fugORGkO+j9J5TK265rV583E9Ddkc7pS+n enLKSq5ULe5EefvPU/PYdh/I1f7y1zBanYtyDOz9cCu7IH6JNuToKvmZRht5 TjZOjnnNzV+x0HJZQ2lWHfwNuLH/dNi7TF6DaK1zkkZ2xY36k/oYHY1zNkB4 604ZJNLVjZRj5WFOia/cVR3SrV607uEtEEubudrJyuadbwjMS7pjqxeto31h PZaH+OUdVGanDXR59WWr6uTuY37V1PEX23HO+K2GmbmZtv9iyfxuTyw5XbS9 Amd/Ut445lbZshcy0d8beusZzDO2mo5k5VZCVs6ZgJmfe518djniEdN/zYa4 5XZeZmMBKzulL6d6YsJxgzqFy+cm0g3fM9U8PNv0IxShL49JboyrcjyLez/S yi6IX/o7YOQioqvkZxpt5DnZODlmNTdhxQKL5Q2lWXUwk1ojadbAIK9BtNZT 4xdnV9yoP/XJY6NxzgYIb90pg0S6urFyzDysSfGVu6ZDutWL1t3ljqpy2szV TlY273wjWMv06kXrWHD7/sLpmOL3xvFG1gHXxC//0LjH+r+HdjxIDEvWgCC/ iF0auMZvNczMrcTmJdJSySfruBkp2l6Bsz8pbxxzq+yU5x3WhkOat57BPGOr 6UhXzj9MH+3U9noELq7J2Ah7d9XL3Fukh6sdjGlVPy3rcJjXrIIb1KuU/1Cb tbz556l5eLZdmQltL1Sdi3IUFx1jVyH7QInBirS+vRpP/kZeizXynGzcHDOa m7Ri8lKZQ2lWHay0zs0m6YFBXoNorafGL86uuFF/0kVE2m/OBghv3VbuIJGu brycwIZLrNwVHdKtXrTuDm9UldNmrnaysupT6nzDkxNrp+vYFuO/kQ0LQvzy DqyOKnb4fuT2H+qiqEPQ6uwPCsO3GmbmVtr+i6StXHalz0HSRdsrYC00aRxz quw6WseNSn7wQTzPyGq6MipX2wfaKv4Wbn2dvPOsgKyNsDJXvRSrLG+5Pp2Z 4ujmf80+SmxQv1L2NiuPwasEZql5eLbDaXvjo8PiG+PaHJUvc9FjvJUFSoxU pFF/WvWt8k6VpjbynGzcHJPNTV4xcaHcoTSrDlZScyTttmdqYJDXIFbrrKSx XXGb/jQuGxyNczZAeOsKyYODRLq6iXICGy6xcs5wfDTaupCbOcnbmrG621vQ H1XltJmrnaps5vmGa50Ta6fr2F7syOVji0b88hZOxjWmbl8v1+tVPS5XSN9J qMuaT2d/UBi+BDMztxP3R4naK7tab8chO120vQLWQpPGMafKvt1x3R05TuOG ccuN5xlZTVdW5Q6rTf8yFrtG8td6aqJzJUTmRthvu1Uvg1WWt5yxi4ecCmfH XbOPEhtUqpTeZs0mC2/9mWoenu3ZHT+7tvfx+RVte6HqXJSj9nPsIoyPzXeq lQVKjFbk3D7KYqNimEqqTGwL5zfynGxydlrGFnbnTxpKs+pgp/Uaa2JgkNcg VuuspHal7F1xm/5kFhEYjd0NYDeozH6XNUikq5ssJ9gxoivXbLpjV73TZmVF 6kJu5iRva0Y3tRYYVeW0maudqmzm+YbBbqzp1YvVsfReAYSFIX55C+03d7Gz OAAAgLfQxtX+DZ5Ykj95AO7fn1/Fi5oAAADanwqrR9cB1yF+eQ/tDzBc6gkA AN5czc8vy0f88iYq3jQLAADe3pG7X5aP+OVN1PwAAwAA3h0nRK+A+OVdHLkD BgAAvLk17355AcQvb6Pick8AAPDWdty8/wqIX95GbbwDBgAA4P2UXD32Cohf 3sfOe98bAADA+9hwMQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBLWTdOjUfXAwAAAABSiF8AAAAA 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 FPhcq/joTGP9cuic/Wi9K3w7IWVgyNEj5Wdhj5RiTSLTg3PFBN29++4jz+Ir k9g08XrpJS7Zb86uuU02iyn+0TVdUMLnKn85mT5X3SYMzHiQl49fhj/ag7bx jJv2+LgW0rQ/Wez81Pr3G7/1elOuzrkq/B9w2sN8ZReoJw2LjzlMWETkzHRj P3vBO48iM2T6XNksp253KfC5VvHRmUb7Zct4SPq68K2llP6QY812RkqxJpHp wbligqqQ7t2Prkxi08TrpZe4ZL85u+Y22Sym+EfXdEEJn6v85WT6XHWbMDDj Qd4nftm3f+3tmf5rWuoxjd1Q+4su/NYrT7km53XhXw9uBEXDguqmFv+1MtMW kbgzq0IOyRY7ND1zNsup210KfK5VfHSm8X5pTWsHGPuHjPapHbWU0htyrNk/ 7V8/0UJj04NzpQRtTaTfdmMrk9g08XrpJWbdi/f4azkFLrb8xVZ8qZk+V90m DMx4kPeJX9RlUPaf/jl5ezzdSKn7iy781utPuTbn4WovJ8+tk3rTpVsN+Y45 TFlE4s603noH4CGkTjtMa4cI+2uP9iubo5TSG3JiI2VopIgfyIW5wqR2qBPu 3Y+vjFhw5sgGAHgNOm75xWFOa99z+eh6XsQ5klVWXCGek5u3+Tupu99vav/g 6E+5NuedHWh12hMO9/Jv9Xjk8SUvwiE8YxGJN3Nr1B7AQwidti6MZwxWzsxq GEgSQ44wUn5GCo1OD871J3U3uYjflcVWhvgFAPBO8YsTVxz9MKMLMjZy6i4K qHLil6tzLgr3ddRHZ2734dB9av85ONlOWUTiz2yrJ12mDmAuQqfd6HFlJYQC 2yL03ipnyJFGyu9wodHpwbnepO5ZzeJ1qdGVIX4BALxT/NIdFY2LrdujZ7Ee 71Q5dPeMlodAarV8Tvxybc5HM9gZJhy91O0TAVZjYCEdwjMWEfgzuYIMeDS/ X3Y/jHa/rVaFf9dd+/VFJae0hxx39pcxUt4vfqmK0HNBoitD/AIAeKv4pTub H39FqNUxfLPrXpGy26gDeh1Mvc+OX67Mubs8vSi33QXgh/22DEQ/+hVvK3fG pEUEwsytWQUA83P6Zb3qfkKp2s/tECLfdLcXUrpDjjf7o5nwEZgnVyY91520 sQZFt3LhlSF+AQC4sYoUw7xO/NLFFVv7T5vx84x/HNzkxi/X5iy9/GDvp677 Wd4XpZmLSILr1J4qhS6AA3B/cpft+nZ7cr/zEgyPLUwMOd5sY6QMjRLRESQn fglnEF8ZcfSxS84e1QAAy/Re8Yt1F/1ZX9dlMK75kg53ZeFPlI+KV+a8c+Mf OfpRS5XejMxFJh3pu0hoH1tnAPck9tjuRH98RLpNPUA9OeT4s7+HkTI0SkRH kKvil8TKiKOPXXL2qAYAWKY3i1/UfavG3/uTcZQ7Wd/5Can3hT8xdFS8LufD 0Tr+HuXUR2umePIQW2TakX5ThJ5mBGAGQn9dqy82toX7yA9FP3c9MeTERsrQ KBEdQa6KXxIrI44+8ZEtVCUAwEK9W/zSfYdnvRitXq27+0jXK+dSbCn11p8Y PipemfPuqH7DWR/tSymMBdV1ZjtvRuYiE4/09iUl8joDuBenr643K/2rbts3 pVtJ9OOVE0NObKQMjRLREeSq+CWxMuLoEx/ZgisJAFimUOxiWmz8AgAAAOCl EL8AAAAAWAriFwAAAABLQfwCAAAAYCl+z7BuPLqeAAAAAED8AgAAAGApiF8A AAAALAXxCwAAAIAl2jbWvUfXBQAAAABiiF8AAAAALAXxCwAAAIClIH4BAAAA 8Oz+2NDvqtTvs2yn/9p7dP0AAAAAQCN+AQAAALAUxC8AAAAAloL4BQAAAMAS 6HhFil/031XjwdUEAAAAAOIXAAAAAItB/AIAAABgKYhfAAAAACxB+75KM2Yx Y5l2vv77TxuPrisAAACA90b8AgAAAGApiF8AAAAALAXxCwAAAIClODV03KKn me+s1PHLb43H1RIAAAAAiF8AAAAALAfxCwAAAIClIH4BAAAAsBT/0ND367f3 8rfT9N/rhv5M/AIAAADg0YhfAAAAACwF8QsAAACApSB+AQAAALAk+n79Xxzm tKrx6HoCAAAAAPELAAAAgKUgfgEAAACwFMQvAAAAAJZCilfcOObRdQQAAACA FvELAAAAgKUgfgEAAACwFMQvAAAAAJYkFL+0046NR9cPAAAAADTiFwAAAABL QfwCAAAAYCmIXwAAAAAsyT80ysafNf7QaP9+dJ0AAAAAQEL8AgAAAGApiF8A AAAALAXxCwAAAIBnt+1NnQcAAAAAcyN+AQAAALAUxC8AAAAAloL4BQAAAMBS 6PdU/mnDnH5q/NqrGg+qHgAAAAAMiF8AAAAALAXxCwAAAIClIH4BAAAA8Kwq xy+9Nk75y0Y77S8a7d963m+NR9cbAAAAwPshfgEAAACwFMQvAAAAAJaC+AUA AADAUvze+CUD8QsAAACARyN+AQAAALAUxC8AAAAAloL4BQAAAMCSxGIVc5rW xjyPrjMAAACA90T8AgAAAGApiF8AAAAALAXxCwAAAIClkOKVUPyy6Hv3C0u5 3u6lpfbNvL2fcCvl5n7Sju2kXVa+o5NbofjswlGuj7vI7J6Zw+64bidV61Xt bYXYPAA3VjW9zepqm66/bsxJddsjzb9X60rspP6I9P+3dzdLrfPcgoCZMej6 BmfWN9FzTp3q4vIpqrr2vVCbAma7cSDEsS1pLdkhCTzP5H23LS0tKbIchfz8 my5YlfUsFL649BQWnnk+/FqTqfG2eJcpTr8Pi3eo2uQrTcL6fB3XrkVuzPeF u3/kKl3KFzj4pfuX3eK3sIMZnjc8LlQsrz6zhWZp+1KMe5xQfQsyPr20Zt7d Vk8f5flabLd+DtjccMndjg/cfVzR40O3N+N9x9N98SKdrUjHBxvrWSh8cekp LDyeivFlYXo8TDYplek3KNyhapOvNAnr83Vcuxa5Md8X7v72L7DeL96/LLwM +bI7/DKveDcpWF5oFrcvxbgTD9HTy8vpa/30V55/78rt1s4BJzC8QDt+gvP8 ee2Nn9YNT4L2247nt+lFOlpbxlf6wsFd+fJ6FgpfXHoKC4+nYnxZnCDjO2Z1 +lXuULXJV5qE9fk6rl2LXKr/Yenub/8C6/3q/ctsn/Fnd/TPQsWFP55M/29n cftSiTvxFjxdWE8bL4N+nn2en/kKXDsHnMTN8ZbidnI9D+5GF/D0Gdx77edx rOb+pbyehcIXl57CSU/F+LI8Qw4TrD79Kneo2uQrTcL6fB3XrkUu1f+wdPe3 f4FtvH7a71f+97vXkT/vzp3jascLwvPf3UZj+jLk+8r5Oj36uSLNP52yFHd5 +1KMO0ro6XG8FLdOT5e356fd+4HvXpZPH9v9cf7+453DLx8D8bW61s4BJzG8 4jx6jjZc7MO1N9plDE/bPl9o/nyC9/g01NivDIeneIFnRpX1LB1+svRUs4Dp zHj5mD/3+383pl/oDjWffKXpWJ+m8Thfhj+lHt4IsbN097d/gW38wv3Lv891 8uhN5/+ehmX0frIB+bzflzYfR3EL25di3OOEdn82vw2dXljenuqnD25vjjv+ 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 oMfA6eOzs2cRyctq95ejwkO7eG6jy773X78u6CXndj1BLyu3mcePp2j7Pctg v5d5OHy34XB6i99/2ZmvZ9nwxQ1MqZf7c1s/Dhs9KheVzE+pGJ8Z7ek3t3CH mjdRarSWTDjO7rP7C18+Wrn7Z67Scm49j9Qp/nU9DX7HBOc8ht+v3O9bpnuX /fFz59htYaaNfl/h4WZu6QOz+z+xHA4enR5W0qNlNhp377B+109Pzk43TrXL aunc/mePa+emMTa47Hv/9euCXnJu1xP0snKb+fwAzP3N4dXk/XvJbo63NEuv RB9+oXwx/uHg0enZepYOP3/NZqGZhXNbPw4bPSoXlcxPqRifGc3pt1R5foea lyo1WksmHOd+lsCHyt0/dZUWc+t5pE7xr+tp8DsmOOfx2/Yvh2PDTub49ZPh q0ufFyp+vuPicPDo9PA+9fHbYONxP90FT0/PDivoaN2vXVb3Nwvv1P2sUDs3 PXTi9ULQK8nteoJeVm4zw2bl+ejjL/vNzPPN6A0yNzdL7/V8PkRdjF86vbie pcJPlp55g8vntn4cNnpULiqZn1IxPjOa0y92h5o3UWq0mkwwznANLf0Nsnb3 z12lpdx6HqlT/Ot6GvyOCc55/N79y/B3jeNVcdiJLL1f4vMdF4eDx6d3b6c4 /mcs7ofh5dD7cr6H09OzRz9GV1/9Hm8W/hT/WaF2Djil++ESPn6nzMcfXG/H W5rh0Hy/MDyH+nyutHi9lhas2XqWDj9ZeuYNwlh1ZrSmX+wONW+i1Gh9mobi 7H5Pc/7Z/frdf/3+BRj7bfuX55vRD13fT07eF77OZ/cnlvLLkcevRibi7svX vid16fubP+0W0cZvY354Oip5OHbfOAec0uuwdBx+s3Lw8VuWD+P39y/uF8Zf HZJ7ZjRdz/Lh/ywsGp6AUVKdGa3pF7tDfef+ZZfR4odHa3d/+xfY1tJn9sd7 l8H/fXfuPLssLAiP+1d1bhdWoK9fkZtWHGrdFxeao/U3Ffff55fIl/MdnZ6f HVL6eg9udfVb+KWt+/3rQrVzwAkNW4ndFTg6trvkj1/HfZ0/xds9wXs8VMk8 M5qsZx3h7+eLhidglNRnRmv6he5Q37h/2X17wOJXo1Xv/vYvsK1ftn/ZvW64 +1DgsABO33T79T70WcVhwSovNMOqtX8zbC7u89t46a6fnvfmuVp5muHN3ehL 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAXJz/Dx6beWgKZW5kc3RyZWFtCmVuZG9iago1IDAgb2Jq CjQ1OTE2OQplbmRvYmoKNiAwIG9iago8PAovVHlwZSAvUGFnZQovTWVkaWFC b3ggWyAwIDAgNjEyIDc5MiBdCi9Db250ZW50cyA3IDAgUgovUmVzb3VyY2Vz IDw8Ci9Qcm9jU2V0IFsgL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0lt YWdlSSBdCi9YT2JqZWN0IDw8Ci9YMSA0IDAgUgo+Pgo+PgovUGFyZW50IDIg MCBSCj4+CmVuZG9iago3IDAgb2JqCjw8Ci9MZW5ndGggOCAwIFIKL0ZpbHRl ciBbIC9GbGF0ZURlY29kZSBdCj4+CnN0cmVhbQ0KeJwr5DIzNFIwAEJzSwid nMulH2Go4JLPFcgFAFs/BgEKZW5kc3RyZWFtCmVuZG9iago4IDAgb2JqCjMy CmVuZG9iagp4cmVmCjAgOQowMDAwMDAwMDAwIDY1NTM1IGYNCjAwMDAwMDAw MTUgMDAwMDAgbg0KMDAwMDAwMDA2NCAwMDAwMCBuDQowMDAwMDAwMTIzIDAw MDAwIG4NCjAwMDAwMDAyNTAgMDAwMDAgbg0KMDAwMDQ2MTE1MyAwMDAwMCBu DQowMDAwNDYxMTc1IDAwMDAwIG4NCjAwMDA0NjEzNTQgMDAwMDAgbg0KMDAw MDQ2MTQ2NSAwMDAwMCBuDQp0cmFpbGVyCjw8Ci9Sb290IDEgMCBSCi9JbmZv IDMgMCBSCi9TaXplIDkKPj4Kc3RhcnR4cmVmCjQ2MTQ4MwolJUVPRgo= ------=_NextPart_000_00C3_01C2A9A6.7567BD34-- From cryptopsy@live.com Sat Jan 29 18:22:47 2011 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,FREEMAIL_FROM, 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 p0U0MkeI238752 for ; Sat, 29 Jan 2011 18:22:47 -0600 X-ASG-Debug-ID: 1296347110-4a7403b60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from snt0-omc4-s51.snt0.hotmail.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A38E61A4DA92 for ; Sat, 29 Jan 2011 16:25:10 -0800 (PST) Received: from snt0-omc4-s51.snt0.hotmail.com (snt0-omc4-s51.snt0.hotmail.com [65.54.51.102]) by cuda.sgi.com with ESMTP id GxywG22BOr2w5qvZ for ; Sat, 29 Jan 2011 16:25:10 -0800 (PST) Received: from SNT130-W55 ([65.55.90.199]) by snt0-omc4-s51.snt0.hotmail.com with Microsoft SMTPSVC(6.0.3790.4675); Sat, 29 Jan 2011 16:25:10 -0800 Message-ID: Content-Type: multipart/alternative; boundary="_635d24fa-5854-42c3-903f-e2724fd8e034_" X-Originating-IP: [173.33.106.118] From: lord worm To: X-ASG-Orig-Subj: how to decode metadump info produced by xfs_db, and superblock error Subject: how to decode metadump info produced by xfs_db, and superblock error Date: Sat, 29 Jan 2011 19:25:10 -0500 Importance: Normal MIME-Version: 1.0 X-OriginalArrivalTime: 30 Jan 2011 00:25:10.0129 (UTC) FILETIME=[274AE610:01CBC014] X-Barracuda-Connect: snt0-omc4-s51.snt0.hotmail.com[65.54.51.102] X-Barracuda-Start-Time: 1296347112 X-Barracuda-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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.53826 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 --_635d24fa-5854-42c3-903f-e2724fd8e034_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable What kind of information is in this file produced by metadump=2C is it wort= h reading it somehow? I'm trying to first understand what's causing a 'superblock cannot be read'= error in my XFS after a succesfully dd of the partition (dd succeeds in co= pying to a file=2C and also restoring=2C but after restoring it cannot moun= t). xfs_repair fails to fix it=2C how should I attach the 55M metadata file to = this email (do we have an upload location for this?)=2C max size on hotmail= is 25M ... Does the superblock error refer to primary or secondary superblocks? Does x= fs_repair attempt to clone the broken superblock from the others? = --_635d24fa-5854-42c3-903f-e2724fd8e034_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable What kind of information is in this file produced by metadump=2C is it wort= h reading it somehow?

I'm trying to first understand what's causing = a 'superblock cannot be read' error in my XFS after a succesfully dd of the= partition (dd succeeds in copying to a file=2C and also restoring=2C but a= fter restoring it cannot mount).

xfs_repair fails to fix it=2C how s= hould I attach the 55M metadata file to this email (do we have an upload lo= cation for this?)=2C max size on hotmail is 25M ...

Does the superbl= ock error refer to primary or secondary superblocks? Does xfs_repair attemp= t to clone the broken superblock from the others?
= --_635d24fa-5854-42c3-903f-e2724fd8e034_-- From cryptopsy@live.com Sat Jan 29 18:45:46 2011 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_50,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_45,SUBJ_FORWARDED 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 p0U0jkF7240281 for ; Sat, 29 Jan 2011 18:45:46 -0600 X-ASG-Debug-ID: 1296348491-4801000f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from snt0-omc4-s20.snt0.hotmail.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 280F029BEBE for ; Sat, 29 Jan 2011 16:48:11 -0800 (PST) Received: from snt0-omc4-s20.snt0.hotmail.com (snt0-omc4-s20.snt0.hotmail.com [65.55.90.223]) by cuda.sgi.com with ESMTP id 1ReOLu7KVJt3dv7B for ; Sat, 29 Jan 2011 16:48:11 -0800 (PST) Received: from SNT130-W14 ([65.55.90.199]) by snt0-omc4-s20.snt0.hotmail.com with Microsoft SMTPSVC(6.0.3790.4675); Sat, 29 Jan 2011 16:48:10 -0800 Message-ID: Content-Type: multipart/alternative; boundary="_2a2d273f-dd39-4d3e-a7f4-879ce07e819a_" X-Originating-IP: [173.33.106.118] From: lord worm To: X-ASG-Orig-Subj: FW: how to decode metadump info produced by xfs_db, and superblock error Subject: FW: how to decode metadump info produced by xfs_db, and superblock error Date: Sat, 29 Jan 2011 19:48:10 -0500 Importance: Normal In-Reply-To: References: MIME-Version: 1.0 X-OriginalArrivalTime: 30 Jan 2011 00:48:10.0978 (UTC) FILETIME=[5E57BC20:01CBC017] X-Barracuda-Connect: snt0-omc4-s20.snt0.hotmail.com[65.55.90.223] X-Barracuda-Start-Time: 1296348492 X-Barracuda-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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.53826 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 --_2a2d273f-dd39-4d3e-a7f4-879ce07e819a_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable I supposed I should have added the output of xfs_repair -n -o assume_xfs /m= ybackupfile.bak (but I know you use the metadump file for real debugging ..= .). It seems the superblock is correct=2C so either mount is wrong in sayin= gs it incorrect (and something else is the problem)=2C or the superblock is= broken and xfs_repair cannot detect (also broken): Phase 1 - find and verify superblock... Phase 2 - using internal log - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan (but don't clear) agi unlinked lists... - process known inodes and perform inode discovery... - agno =3D 0 - agno =3D 1 - agno =3D 2 - agno =3D 3 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno =3D 0 - agno =3D 1 - agno =3D 2 - agno =3D 3 No modify flag set=2C skipping phase 5 Phase 6 - check inode connectivity... - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify link counts... No modify flag set=2C skipping filesystem flush and exiting. From: cryptopsy@live.com To: xfs@oss.sgi.com Subject: how to decode metadump info produced by xfs_db=2C and superblock e= rror Date: Sat=2C 29 Jan 2011 19:25:10 -0500 What kind of information is in this file produced by metadump=2C is it wort= h reading it somehow? I'm trying to first understand what's causing a 'superblock cannot be read'= error in my XFS after a succesfully dd of the partition (dd succeeds in co= pying to a file=2C and also restoring=2C but after restoring it cannot moun= t). xfs_repair fails to fix it=2C how should I attach the 55M metadata file to = this email (do we have an upload location for this?)=2C max size on hotmail= is 25M ... Does the superblock error refer to primary or secondary superblocks? Does x= fs_repair attempt to clone the broken superblock from the others? = --_2a2d273f-dd39-4d3e-a7f4-879ce07e819a_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable I supposed I should have added the output of xfs_repair -n -o assume_xfs /m= ybackupfile.bak (but I know you use the metadump file for real debugging ..= .). It seems the superblock is correct=2C so either mount is wrong in sayin= gs it incorrect (and something else is the problem)=2C or the superblock is= broken and xfs_repair cannot detect (also broken):

Phase 1 - find a= nd verify superblock...
Phase 2 - using internal log
 =3B =3B=  =3B =3B =3B =3B =3B - scan filesystem freespace and in= ode maps...
 =3B =3B =3B =3B =3B =3B =3B - f= ound root inode chunk
Phase 3 - for each AG...
 =3B =3B = =3B =3B =3B =3B =3B - scan (but don't clear) agi unlinked l= ists...
 =3B =3B =3B =3B =3B =3B =3B - proce= ss known inodes and perform inode discovery...
 =3B =3B =3B&= nbsp=3B =3B =3B =3B - agno =3D 0
 =3B =3B =3B&nb= sp=3B =3B =3B =3B - agno =3D 1
 =3B =3B =3B = =3B =3B =3B =3B - agno =3D 2
 =3B =3B =3B = =3B =3B =3B =3B - agno =3D 3
 =3B =3B =3B = =3B =3B =3B =3B - process newly discovered inodes...
Phase 4= - check for duplicate blocks...
 =3B =3B =3B =3B = =3B =3B =3B - setting up duplicate extent list...
 =3B = =3B =3B =3B =3B =3B =3B - check for inodes claiming dup= licate blocks...
 =3B =3B =3B =3B =3B =3B = =3B - agno =3D 0
 =3B =3B =3B =3B =3B =3B = =3B - agno =3D 1
 =3B =3B =3B =3B =3B =3B = =3B - agno =3D 2
 =3B =3B =3B =3B =3B =3B = =3B - agno =3D 3
No modify flag set=2C skipping phase 5
Phase 6 - che= ck inode connectivity...
 =3B =3B =3B =3B =3B = =3B =3B - traversing filesystem ...
 =3B =3B =3B =3B=  =3B =3B =3B - traversal finished ...
 =3B =3B = =3B =3B =3B =3B =3B - moving disconnected inodes to lost+fo= und ...
Phase 7 - verify link counts...
No modify flag set=2C skippin= g filesystem flush and exiting.


From: crypto= psy@live.com
To: xfs@oss.sgi.com
Subject: how to decode metadump info= produced by xfs_db=2C and superblock error
Date: Sat=2C 29 Jan 2011 19:= 25:10 -0500

What kind of information is in this file produced by metadump=2C is it wort= h reading it somehow?

I'm trying to first understand what's causing = a 'superblock cannot be read' error in my XFS after a succesfully dd of the= partition (dd succeeds in copying to a file=2C and also restoring=2C but a= fter restoring it cannot mount).

xfs_repair fails to fix it=2C how s= hould I attach the 55M metadata file to this email (do we have an upload lo= cation for this?)=2C max size on hotmail is 25M ...

Does the superbl= ock error refer to primary or secondary superblocks? Does xfs_repair attemp= t to clone the broken superblock from the others?
= --_2a2d273f-dd39-4d3e-a7f4-879ce07e819a_-- From stan@hardwarefreak.com Sat Jan 29 18:53:40 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0U0re4O240570 for ; Sat, 29 Jan 2011 18:53:40 -0600 X-ASG-Debug-ID: 1296348966-56d703bc0000-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 F06021EA5F79 for ; Sat, 29 Jan 2011 16:56: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 uAFF79oKHdcDBad1 for ; Sat, 29 Jan 2011 16:56:06 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 498CA6C0C3 for ; Sat, 29 Jan 2011 18:56:06 -0600 (CST) Message-ID: <4D44B726.8090409@hardwarefreak.com> Date: Sat, 29 Jan 2011 18:56: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: how to decode metadump info produced by xfs_db, and superblock error Subject: Re: how to decode metadump info produced by xfs_db, and superblock error 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: 1296348966 X-Barracuda-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.53828 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 lord worm put forth on 1/29/2011 6:25 PM: > > What kind of information is in this file produced by metadump, is it worth reading it somehow? > > I'm trying to first understand what's causing a 'superblock cannot be read' error in my XFS after a succesfully dd of the partition (dd succeeds in copying to a file, and also restoring, but after restoring it cannot mount). > > xfs_repair fails to fix it, how should I attach the 55M metadata file to this email (do we have an upload location for this?), max size on hotmail is 25M ... > > Does the superblock error refer to primary or secondary superblocks? Does xfs_repair attempt to clone the broken superblock from the others? dd is not a proper XFS filesystem backup/restore utility. Instead use xfsdump and xfsrestore, or any file level backup/restore solution. You obviously now know why you shouldn't use dd for this purpose with XFS. ;) -- Stan From david@fromorbit.com Sun Jan 30 01:14:08 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0U7E8Pp256225 for ; Sun, 30 Jan 2011 01:14:08 -0600 X-ASG-Debug-ID: 1296371792-74ae03b50000-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 A5B9B29BB4C for ; Sat, 29 Jan 2011 23:16:33 -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 ILVHLlWpYLMpRTyd for ; Sat, 29 Jan 2011 23:16:33 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEAE2eRE15LGFf/2dsb2JhbACkenS7EA2FQQSSBA Received: from ppp121-44-97-95.lns20.syd6.internode.on.net (HELO dastard) ([121.44.97.95]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Jan 2011 17:46:31 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PjRWQ-00068R-Fv; Sun, 30 Jan 2011 18:16:30 +1100 Date: Sun, 30 Jan 2011 18:16:30 +1100 From: Dave Chinner To: lord worm Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: how to decode metadump info produced by xfs_db, and superblock error Subject: Re: how to decode metadump info produced by xfs_db, and superblock error Message-ID: <20110130071630.GE21311@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: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1296371794 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0013 1.0000 -2.0127 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.53852 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, Jan 29, 2011 at 07:25:10PM -0500, lord worm wrote: > > What kind of information is in this file produced by metadump, is it worth reading it somehow? > > I'm trying to first understand what's causing a 'superblock cannot > be read' error in my XFS after a succesfully dd of the partition > (dd succeeds in copying to a file, and also restoring, but after > restoring it cannot mount). dmesg output when the mount fails? Cheers, Dave. -- Dave Chinner david@fromorbit.com From cryptopsy@live.com Sun Jan 30 12:25:26 2011 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,FREEMAIL_FROM, 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 p0UIPP7Z033380 for ; Sun, 30 Jan 2011 12:25:26 -0600 X-ASG-Debug-ID: 1296412072-685401ee0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from snt0-omc4-s28.snt0.hotmail.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B9F8B1A57D10 for ; Sun, 30 Jan 2011 10:27:52 -0800 (PST) Received: from snt0-omc4-s28.snt0.hotmail.com (snt0-omc4-s28.snt0.hotmail.com [65.55.90.231]) by cuda.sgi.com with ESMTP id QNjVwWkenl7LkfbH for ; Sun, 30 Jan 2011 10:27:52 -0800 (PST) Received: from SNT130-W7 ([65.55.90.200]) by snt0-omc4-s28.snt0.hotmail.com with Microsoft SMTPSVC(6.0.3790.4675); Sun, 30 Jan 2011 10:27:51 -0800 Message-ID: Content-Type: multipart/alternative; boundary="_68648385-8071-4321-b939-c4c539249683_" X-Originating-IP: [173.33.106.118] From: lord worm To: X-ASG-Orig-Subj: RE: xfs Digest, Vol 29, Issue 101 Subject: RE: xfs Digest, Vol 29, Issue 101 Date: Sun, 30 Jan 2011 13:27:51 -0500 Importance: Normal In-Reply-To: References: MIME-Version: 1.0 X-OriginalArrivalTime: 30 Jan 2011 18:27:51.0683 (UTC) FILETIME=[67656530:01CBC0AB] X-Barracuda-Connect: snt0-omc4-s28.snt0.hotmail.com[65.55.90.231] X-Barracuda-Start-Time: 1296412072 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1970 1.0000 -0.8437 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.84 X-Barracuda-Spam-Status: No, SCORE=-0.84 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.53898 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 --_68648385-8071-4321-b939-c4c539249683_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Stan I have no idea=2C could you tell me in detail why dd failed=2C and wha= t exactly those restore commands provide specifically? = --_68648385-8071-4321-b939-c4c539249683_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Stan I have no idea=2C could you tell me in detail why dd failed=2C and wha= t exactly those restore commands provide specifically?

<= /body> = --_68648385-8071-4321-b939-c4c539249683_-- From stan@hardwarefreak.com Sun Jan 30 15:01:17 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0UL1GO2039154 for ; Sun, 30 Jan 2011 15:01:17 -0600 X-ASG-Debug-ID: 1296421422-732d00ce0000-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 051581A58284 for ; Sun, 30 Jan 2011 13:03: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 lfAr3tLDltU3OCDX for ; Sun, 30 Jan 2011 13:03:42 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 5451B6C0A7 for ; Sun, 30 Jan 2011 15:03:42 -0600 (CST) Message-ID: <4D45D22E.2060603@hardwarefreak.com> Date: Sun, 30 Jan 2011 15:03:42 -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: xfs Digest, Vol 29, Issue 101 Subject: Re: xfs Digest, Vol 29, Issue 101 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: 1296421423 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1000 1.0000 -1.3925 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.79 X-Barracuda-Spam-Status: No, SCORE=-0.79 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.53908 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 lord worm put forth on 1/30/2011 12:27 PM: > > Stan I have no idea, could you tell me in detail why dd failed, and what exactly those restore commands provide specifically? This might have some relevance. 2nd hit Googling for "dd with xfs": http://oss.sgi.com/archives/xfs/2003-04/msg00802.html -- Stan From ajeet.yadav.77@gmail.com Sun Jan 30 20:36:50 2011 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.1 required=5.0 tests=BAYES_40,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_63,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 p0V2anRm059309 for ; Sun, 30 Jan 2011 20:36:49 -0600 X-ASG-Debug-ID: 1296441556-282402540000-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 B342A29D12C for ; Sun, 30 Jan 2011 18:39:16 -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 kMmEayYzPCju7hx9 for ; Sun, 30 Jan 2011 18:39:16 -0800 (PST) Received: by qyk12 with SMTP id 12so5612664qyk.5 for ; Sun, 30 Jan 2011 18:39:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:content-type; bh=X83e2z54EGgyU/Og4Np34g5vNAEie4G0btWC6aVBC9E=; b=blwYLi3Ww5pOXKS86pfGAL1eY7LL6rkmOcG8QMJeswqX8n4Q+8k+PYN138hWAMGIoT iPGtQXdrSFD2/t56yWrFYX0JQSanrmWGwL9aQgOd+bMxwFt0NANIHQTiNTpoG8Xwidqz Bx+brAcfQOS2GMlCfBTKPn1dpbV+bhbPpU8rs= 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=A7xug9igcNfA4a21oCM2B9tlj8r64wGwwZX/lVGaW/IbTFaRJXfJSJ+go6nVMuAFdV mCYi+4F31byiOTmoGSbGaQAXpvZLHq2/IbHiBj37mjcYDc4rZFMqjKNgpKSEC2jq+vXC FRt8RfcBj2hNdiwGZgpteZRu0kRhg08uxT+/Q= MIME-Version: 1.0 Received: by 10.224.28.202 with SMTP id n10mr6017111qac.4.1296441555733; Sun, 30 Jan 2011 18:39:15 -0800 (PST) Received: by 10.220.165.198 with HTTP; Sun, 30 Jan 2011 18:39:15 -0800 (PST) In-Reply-To: References: Date: Mon, 31 Jan 2011 11:39:15 +0900 Message-ID: X-ASG-Orig-Subj: Re: [patch] xfsprogs: repair pagefault due to missed out sanity NULL check Subject: Re: [patch] xfsprogs: repair pagefault due to missed out sanity NULL check From: Ajeet Yadav To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0015175ce04066cda8049b1b52f6 X-Barracuda-Connect: mail-qy0-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1296441556 X-Barracuda-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.53929 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 --0015175ce04066cda8049b1b52f6 Content-Type: text/plain; charset=ISO-8859-1 I did not receive any response / review comment on solution patch I sent. diff -Nurp xfsprogs/repair/dir2.c xfsprogs-dirty/repair/dir2.c --- xfsprogs/repair/dir2.c 2010-07-16 13:07:09.000000000 +0900 +++ xfsprogs-dirty/repair/dir2.c 2011-01-28 18:49:21.000000000 +0900 @@ -110,9 +110,10 @@ da_read_buf( bplist[i] = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bmp[i].startblock), XFS_FSB_TO_BB(mp, bmp[i].blockcount), 0); - if (!bplist[i]) + if (!bplist[i]){ + nex = i; goto failed; - + } pftrace("readbuf %p (%llu, %d)", bplist[i], (long long)XFS_BUF_ADDR(bplist[i]), XFS_BUF_COUNT(bplist[i])); On Fri, Jan 28, 2011 at 8:13 PM, Ajeet Yadav wrote: > libxfs_putbuf() is called with bp = NULL, resulting in pagefault in > libpthread. > > Function da_read_buf() allocate array of xfs_buf_t * > > * xfs_buf_t **bplist;* > > * bplist = calloc(nex, sizeof(*bplist));* > > Read and fill it using > > *for (i = 0; i < nex; i++) { > bplist[i] = libxfs_readbuf()* > > * if (!bplist[i]){ > goto failed; > } * > > *}* > > *failed: > for (i = 0; i < nex; i++) > libxfs_putbuf(bplist[i]);* > > Now assume nex = 10, > > 1. Will create bplist for 10 array elements. > > 3. Reading from disk 0,1, 2, 3 > > 4. When reading from disk 4, USB is removed > > 5. libxfs_readbuf() will at fail, pblist[4] = NULL, goto failed. > > 6. Since only 4 buffers were read successfully, so only 4 are in lock > state. > > 7. Error handling will unlock buffer from 1-10 > > 8. Buffer 0-3 were read successfully, hence will have valid pdlist[i] > > 9. Access pblist[4] == NULL, therefore unlocking will set bp == NULL in > libxfs_putbuf(bp); > 10. Page fault in libpthread > > > Solution patch attached with mail > > > --0015175ce04066cda8049b1b52f6 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
I did not receive any response / review comment on solution patch I se= nt.

diff -Nurp xfsprogs/repair/dir2.c xfsprogs-dirty/repair/dir2.c

--- xfsprogs/repair/dir2.c 2010-07-16 13:07:09.000000000 +0900

+++ xfsprogs-dirty/repair/dir2.c 2011-01-28 18:49:21.000000000 +0900

@@ -110,9 +110,10 @@ da_read_buf(

bplist[i] =3D libxfs_readbuf(mp->m_dev,

XFS_FSB_TO_DADDR(mp, bmp[i].startblock),

XFS_FSB_TO_BB(mp, bmp[i].blockcount), 0);

- if (!bplist[i])

+ if (!bplist[i]){

+ nex =3D i;

goto failed;

-

+ }

pftrace("readbuf %p (%llu, %d)", bplist[i],

(long long)XFS_BUF_ADDR(bplist[i]),

XFS_BUF_COUNT(bplist[i]));

On Fri, Jan 28, 2011 at 8:13 PM, Ajeet Yadav <ajeet.yadav.= 77@gmail.com> wrote:
libxfs_putbuf() is called with=A0bp =3D NULL, resulting in pa= gefault in libpthread.
=A0
Function da_read_buf() allocate array of=A0xfs_buf_t *=

=A0=A0=A0=A0xfs_buf_t=A0=A0=A0=A0=A0=A0 **bplist;

=A0=A0=A0=A0bplist =3D calloc(nex, sizeof(*bplist));

Read and fill it using =A0

for (i =3D 0; i < nex; i++) {
=A0=A0=A0=A0bplist[= i] =3D libxfs_readbuf()

=A0=A0=A0=A0if (!bplist[i]){
=A0=A0=A0=A0=A0=A0=A0= =A0goto failed;
=A0=A0=A0=A0}=A0=A0

}

failed:
=A0=A0=A0=A0=A0=A0=A0 for (i =3D 0; i < n= ex; i++)
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 libxfs_putbuf(bpl= ist[i]);

Now assume nex =3D 10,

1. Will create bplist for 10 array elements.

3. Reading from disk 0,1, 2, 3

4. When reading from disk 4, USB is removed

5. libxfs_readbuf() will at fail,=A0pblist[4] =3D NULL, goto fa= iled.

6. Since only 4 buffers were read successfully, so only 4 are i= n lock state.

7. =A0Error handling=A0will unlock buffer from 1-10

8. Buffer 0-3 were read successfully, hence will have valid pdl= ist[i]

9. Access=A0pblist[4] =3D=3D NULL, therefore unlocking will set= bp =3D=3D NULL in libxfs_putbuf(bp);

10. Page fault in libpthread
=A0
=A0
Solution patch attached with mail
=A0
=A0

--0015175ce04066cda8049b1b52f6-- From ajeet.yadav.77@gmail.com Sun Jan 30 20:38:49 2011 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,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 p0V2cnLA059378 for ; Sun, 30 Jan 2011 20:38:49 -0600 X-ASG-Debug-ID: 1296441676-24c502d30000-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 F3BA029D1DE for ; Sun, 30 Jan 2011 18:41:16 -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 XnsOhwCnmAGN33mv for ; Sun, 30 Jan 2011 18:41:16 -0800 (PST) Received: by qyk12 with SMTP id 12so5613782qyk.5 for ; Sun, 30 Jan 2011 18:41:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:content-type; bh=dtaIw4u82mHjjTAa8cr4ETIrP3dnmSDlwIzdQXh79Gk=; b=oW3JxtQD6V1w/V2v8BU98CSbIqNlD9cGw8P2+LPy8Fnp7x3+vZPZT2kvkkhowOBFT6 b+XgwCT7o9Evli2bWtUTUxP727w+flV75QLPh3WdfKPcsGuNEt3sYpk8ojPW2qDP9S4i BLVqMV6Z4VZpQg9PpBC6RQTyKdespsJIGY69I= 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=gEiuv3oq6dUSEYU+KDLltdDNocDy3poU0YI2zmo3V+KQYuvOmBCjr/DEWf6JO+bjOB mb9KMSctdbZ+n+pOLaqTkuJRzZj2eaZByugJuZsbYQDkmKG9L6X0Kx+rm8Q5qzKC5mip S/mVFiyjE0q7uHX4fzlv+d6xDXb2qtibQb04w= MIME-Version: 1.0 Received: by 10.229.38.140 with SMTP id b12mr3588091qce.161.1296441676254; Sun, 30 Jan 2011 18:41:16 -0800 (PST) Received: by 10.220.165.198 with HTTP; Sun, 30 Jan 2011 18:41:16 -0800 (PST) In-Reply-To: References: Date: Mon, 31 Jan 2011 11:41:16 +0900 Message-ID: X-ASG-Orig-Subj: Re: [patch] xfsprogs: repair never return if device removed Subject: Re: [patch] xfsprogs: repair never return if device removed From: Ajeet Yadav To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=00163646db8295ce3d049b1b5948 X-Barracuda-Connect: mail-qy0-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1296441676 X-Barracuda-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.53929 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 --00163646db8295ce3d049b1b5948 Content-Type: text/plain; charset=ISO-8859-1 I did not receive and response / reviews on patch. diff -Nurp xfsprogs/repair/sb.c xfsprogs-dirty/repair/sb.c --- xfsprogs/repair/sb.c 2011-01-28 20:23:02.000000000 +0900 +++ xfsprogs-dirty/repair/sb.c 2011-01-28 20:21:06.000000000 +0900 @@ -122,8 +122,9 @@ find_secondary_sb(xfs_sb_t *rsb) done = 1; } - if (!done && (bsize = read(x.dfd, sb, BSIZE)) == 0) { + if (!done && (bsize = read(x.dfd, sb, BSIZE)) <= 0) { done = 1; + do_warn(_("Couldn't find candidate secondary superblock, exiting...\n")); } do_warn("."); On Fri, Jan 28, 2011 at 8:31 PM, Ajeet Yadav wrote: > xfsprogs all version, delete primary superblock of xfs partition > > dd if=/dev/zero of=/dev/sda1 bs=512 count=1 > sync > > Run xfs_repair in partition, while its searching for secondary superblock, > remove the disk (USB) xfs_repair will never exit and will loop in never > ending ............ > > Please find patch attached with mail > --00163646db8295ce3d049b1b5948 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
I did not receive and response / reviews on patch.

diff -Nurp xfsprogs/repair/sb.c xfsprogs-dirty/repair/sb.c

--- xfsprogs/repair/sb.c 2011-01-28 20:23:02.000000000 +0900

+++ xfsprogs-dirty/repair/sb.c 2011-01-28 20:21:06.000000000 +0900

@@ -122,8 +122,9 @@ find_secondary_sb(xfs_sb_t *rsb)

done =3D 1;

}

- if (!done && (bsize =3D read(x.dfd, sb, BSIZE)) =3D=3D 0) {

+ if (!done && (bsize =3D read(x.dfd, sb, BSIZE)) <=3D 0) {

done =3D 1;

+ do_warn(_("Couldn't find candidate secondary superblock, exit= ing...\n"));

}

do_warn(".");


On Fri, Jan 28, 2011 at 8:31 PM, A= jeet Yadav <ajeet.yadav.77@gmail.com> wrote:
xfsprogs all version, delete primary superblock of xfs partition
=A0
dd if=3D/dev/zero of=3D/dev/sda1 bs=3D512 count=3D1
sync
=A0
Run xfs_repair in partition, while its searching for secondary superbl= ock, remove the disk (USB) xfs_repair will never exit and will loop in neve= r ending ............
=A0
Please find patch attached with mail

--00163646db8295ce3d049b1b5948-- From david@fromorbit.com Sun Jan 30 21:49:09 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0V3n9aL065052 for ; Sun, 30 Jan 2011 21:49:09 -0600 X-ASG-Debug-ID: 1296445893-1fb9001e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7743429D216 for ; Sun, 30 Jan 2011 19:51:34 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id U021ZVZzo9vMNCAc for ; Sun, 30 Jan 2011 19:51:34 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av0EAK/ARU15LGFf/2dsb2JhbACWI45RdLkaDYVBBJIE Received: from ppp121-44-97-95.lns20.syd6.internode.on.net (HELO dastard) ([121.44.97.95]) by ipmail04.adl6.internode.on.net with ESMTP; 31 Jan 2011 14:21:32 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pjknb-0007iK-S3; Mon, 31 Jan 2011 14:51:31 +1100 Date: Mon, 31 Jan 2011 14:51:31 +1100 From: Dave Chinner To: lord worm Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: how to decode metadump info produced by xfs_db, and superblock error Subject: Re: how to decode metadump info produced by xfs_db, and superblock error Message-ID: <20110131035131.GI21311@dastard> References: <20110130071630.GE21311@dastard> <20110130214026.GF21311@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: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1296445895 X-Barracuda-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.53935 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, Jan 30, 2011 at 08:21:19PM -0500, lord worm wrote: > > Date: Mon, 31 Jan 2011 08:40:26 +1100 > > From: david@fromorbit.com > > To: cryptopsy@live.com > > Subject: Re: how to decode metadump info produced by xfs_db, and superblock error > > > > On Sun, Jan 30, 2011 at 11:33:53AM -0500, lord worm wrote: > > > > Date: Sun, 30 Jan 2011 18:16:30 +1100 > > > > From: david@fromorbit.com > > > > To: cryptopsy@live.com > > > > CC: xfs@oss.sgi.com > > > > Subject: Re: how to decode metadump info produced by xfs_db, and superblock error > > > > > > > > On Sat, Jan 29, 2011 at 07:25:10PM -0500, lord worm wrote: > > > > > > > > > > What kind of information is in this file produced by metadump, is it worth reading it somehow? > > > > > > > > > > I'm trying to first understand what's causing a 'superblock cannot > > > > > be read' error in my XFS after a succesfully dd of the partition > > > > > (dd succeeds in copying to a file, and also restoring, but after > > > > > restoring it cannot mount). > > > > > > > > dmesg output when the mount fails? > > > > > > Could you email the mailing list next time as well, so that my > > > forwards are directed towards everyone, please? > > > > I did: > > > > http://oss.sgi.com/archives/xfs/2011-01/msg00486.html > > > > As for list ettiquette - please don't top post and wrap all you text > > except for code and pasted log messages at 72 columns..... Fixed that for you again. > > > Here's dmesg from the backup file, but I don't have it from the original disk after restoring it: > > > > > > [ 362.685464] attempt to access beyond end of device > > > [ 362.685468] loop5: rw=0, want=15662872, limit=15661056 > > > [ 362.685473] I/O error in filesystem ("loop5") meta-data dev loop5 block 0xeeff17 ("xfs_read_buf") error 5 buf count 512 > > > [ 362.685478] XFS: size check 2 failed > > > > Simple problem - you copied the filesystem back onto a device that > > is too small for the filesystem. > > When I reply to this email, it defaults to david@fromorbit.com, so > how will the others see it? Reply to all. It's common courtesy to reply to everyone on the cc-list for mailing list traffic as it often contains people not subscribed to the mailing list (e.g. a person reporting a bug). I've added the xfs list back onto the cc-list. > I can't mount the direct dd image of the drive as a loop device > either by the same error. Which means you probably didn't copy the entire drive in the first place. > The error persists even when its not > the filesystem that was copied back onto the device. Additionally, > its the exact same device with the exact same partition type > created by the exact same version of disk. partition type doesn't matter - the size does. The above error indicates that the loop device is 1816 sectors (908kiB) shorter than it needs to be, so maybe you aren't recreating the partition as large as it needs to be, too.... As it is, the question I have at this point is why are you trying to copy the filesystem via dd? if all you want is an image, xfs_copy is probably what you want.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Jan 30 22:15:06 2011 X-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 (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p0V4F5Ix067013 for ; Sun, 30 Jan 2011 22:15:06 -0600 X-ASG-Debug-ID: 1296447451-765202d20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5290229D56D for ; Sun, 30 Jan 2011 20:17:32 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id nW7K1qpBuz5aWcRy for ; Sun, 30 Jan 2011 20:17:32 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av0EADPERU15LGFf/2dsb2JhbACEFaBfdKlXj0MNgRaDN3QE Received: from ppp121-44-97-95.lns20.syd6.internode.on.net (HELO dastard) ([121.44.97.95]) by ipmail04.adl6.internode.on.net with ESMTP; 31 Jan 2011 14:47:30 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PjlCj-0007l6-WB; Mon, 31 Jan 2011 15:17:30 +1100 Date: Mon, 31 Jan 2011 15:17:29 +1100 From: Dave Chinner To: Ajeet Yadav Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [patch] xfsprogs: repair pagefault due to missed out sanity NULL check Subject: Re: [patch] xfsprogs: repair pagefault due to missed out sanity NULL check Message-ID: <20110131041729.GJ21311@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: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1296447453 X-Barracuda-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.53935 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, Jan 28, 2011 at 08:13:04PM +0900, Ajeet Yadav wrote: > libxfs_putbuf() is called with bp = NULL, resulting in pagefault in > libpthread. > > Function da_read_buf() allocate array of xfs_buf_t * > > * xfs_buf_t **bplist;* > > * bplist = calloc(nex, sizeof(*bplist));* > > Read and fill it using > > *for (i = 0; i < nex; i++) { > bplist[i] = libxfs_readbuf()* > > * if (!bplist[i]){ > goto failed; > } * > > *}* > > *failed: > for (i = 0; i < nex; i++) > libxfs_putbuf(bplist[i]);* > > Now assume nex = 10, > > 1. Will create bplist for 10 array elements. > > 3. Reading from disk 0,1, 2, 3 > > 4. When reading from disk 4, USB is removed > > 5. libxfs_readbuf() will at fail, pblist[4] = NULL, goto failed. > > 6. Since only 4 buffers were read successfully, so only 4 are in lock state. > > 7. Error handling will unlock buffer from 1-10 > > 8. Buffer 0-3 were read successfully, hence will have valid pdlist[i] > > 9. Access pblist[4] == NULL, therefore unlocking will set bp == NULL in > libxfs_putbuf(bp); > 10. Page fault in libpthread > > > Solution patch attached with mail Can you please include the patches in-line in your email rather than as base64 encoded attachments? Even though it is for xfsprogs, we ask that the same process is followed as per kernel patches. That includes addÑ–ng Signed-off-by tags to the patches... See Documentation/SubmittingPatches: | 7) No MIME, no links, no compression, no attachments. Just plain text. | | Linus and other kernel developers need to be able to read and comment | on the changes you are submitting. It is important for a kernel | developer to be able to "quote" your changes, using standard e-mail | tools, so that they may comment on specific portions of your code. | | For this reason, all patches should be submitting e-mail "inline". | WARNING: Be wary of your editor's word-wrap corrupting your patch, | if you choose to cut-n-paste your patch. | | Do not attach the patch as a MIME attachment, compressed or not. | Many popular e-mail applications will not always transmit a MIME | attachment as plain text, making it impossible to comment on your | code. A MIME attachment also takes Linus a bit more time to process, | decreasing the likelihood of your MIME-attached change being accepted. | | Exception: If your mailer is mangling patches then someone may ask | you to re-send them using MIME. | | See Documentation/email-clients.txt for hints about configuring | your e-mail client so that it sends your patches untouched. And as it suggests, read Documentation/email-clients.txt on how to do this with various mail clients. Cheers, Dave. -- Dave Chinner david@fromorbit.com From cryptopsy@live.com Sun Jan 30 22:39:00 2011 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.1 required=5.0 tests=BAYES_40,FREEMAIL_FROM, HTML_MESSAGE,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 p0V4cx9F070217 for ; Sun, 30 Jan 2011 22:39:00 -0600 X-ASG-Debug-ID: 1296448885-134401e70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from snt0-omc4-s39.snt0.hotmail.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D3DC11D38641 for ; Sun, 30 Jan 2011 20:41:25 -0800 (PST) Received: from snt0-omc4-s39.snt0.hotmail.com (snt0-omc4-s39.snt0.hotmail.com [65.54.51.90]) by cuda.sgi.com with ESMTP id 1L073PDTSYdRlECk for ; Sun, 30 Jan 2011 20:41:25 -0800 (PST) Received: from SNT130-W32 ([65.55.90.201]) by snt0-omc4-s39.snt0.hotmail.com with Microsoft SMTPSVC(6.0.3790.4675); Sun, 30 Jan 2011 20:41:24 -0800 Message-ID: Content-Type: multipart/alternative; boundary="_65f2faa3-9855-4813-b956-3872b2dcad28_" X-Originating-IP: [173.33.106.118] From: lord worm To: X-ASG-Orig-Subj: RE: xfs Digest, Vol 29, Issue 102 Subject: RE: xfs Digest, Vol 29, Issue 102 Date: Sun, 30 Jan 2011 23:41:24 -0500 Importance: Normal In-Reply-To: References: MIME-Version: 1.0 X-OriginalArrivalTime: 31 Jan 2011 04:41:24.0646 (UTC) FILETIME=[1DA1C460:01CBC101] X-Barracuda-Connect: snt0-omc4-s39.snt0.hotmail.com[65.54.51.90] X-Barracuda-Start-Time: 1296448885 X-Barracuda-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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.53937 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 --_65f2faa3-9855-4813-b956-3872b2dcad28_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Stan=2C do you check dates on links before you paste them here? I don't car= e if its the 1st results of the google search 'meaning of life'=2C its irre= levant and oudated. > From: xfs-request@oss.sgi.com > Subject: xfs Digest=2C Vol 29=2C Issue 102 > To: xfs@oss.sgi.com > Date: Sun=2C 30 Jan 2011 21:49:14 -0600 >=20 > Send xfs mailing list submissions to > xfs@oss.sgi.com >=20 > To subscribe or unsubscribe via the World Wide Web=2C visit > http://oss.sgi.com/mailman/listinfo/xfs > or=2C via email=2C send a message with subject or body 'help' to > xfs-request@oss.sgi.com >=20 > You can reach the person managing the list at > xfs-owner@oss.sgi.com >=20 > When replying=2C please edit your Subject line so it is more specific > than "Re: Contents of xfs digest..." >=20 >=20 > Today's Topics: >=20 > 1. RE: xfs Digest=2C Vol 29=2C Issue 101 (lord worm) > 2. Re: xfs Digest=2C Vol 29=2C Issue 101 (Stan Hoeppner) > 3. Re: [patch] xfsprogs: repair pagefault due to missed out > sanity NULL check (Ajeet Yadav) > 4. Re: [patch] xfsprogs: repair never return if device removed > (Ajeet Yadav) > 5. Re: how to decode metadump info produced by xfs_db=2C and > superblock error (Dave Chinner) >=20 >=20 > ---------------------------------------------------------------------- >=20 > Message: 1 > Date: Sun=2C 30 Jan 2011 13:27:51 -0500 > From: lord worm > Subject: RE: xfs Digest=2C Vol 29=2C Issue 101 > To: > Message-ID: > Content-Type: text/plain=3B charset=3D"iso-8859-1" >=20 >=20 > Stan I have no idea=2C could you tell me in detail why dd failed=2C and w= hat exactly those restore commands provide specifically? >=20 > =20 > -------------- next part -------------- > An HTML attachment was scrubbed... > URL: >=20 > ------------------------------ >=20 > Message: 2 > Date: Sun=2C 30 Jan 2011 15:03:42 -0600 > From: Stan Hoeppner > Subject: Re: xfs Digest=2C Vol 29=2C Issue 101 > To: xfs@oss.sgi.com > Message-ID: <4D45D22E.2060603@hardwarefreak.com> > Content-Type: text/plain=3B charset=3DISO-8859-1 >=20 > lord worm put forth on 1/30/2011 12:27 PM: > >=20 > > Stan I have no idea=2C could you tell me in detail why dd failed=2C and= what exactly those restore commands provide specifically? >=20 > This might have some relevance. 2nd hit Googling for "dd with xfs": >=20 > http://oss.sgi.com/archives/xfs/2003-04/msg00802.html >=20 > --=20 > Stan >=20 >=20 >=20 > ------------------------------ >=20 > Message: 3 > Date: Mon=2C 31 Jan 2011 11:39:15 +0900 > From: Ajeet Yadav > Subject: Re: [patch] xfsprogs: repair pagefault due to missed out > sanity NULL check > To: xfs@oss.sgi.com > Message-ID: > > Content-Type: text/plain=3B charset=3D"iso-8859-1" >=20 > I did not receive any response / review comment on solution patch I sent. >=20 > diff -Nurp xfsprogs/repair/dir2.c xfsprogs-dirty/repair/dir2.c >=20 > --- xfsprogs/repair/dir2.c 2010-07-16 13:07:09.000000000 +0900 >=20 > +++ xfsprogs-dirty/repair/dir2.c 2011-01-28 18:49:21.000000000 +0900 >=20 > @@ -110=2C9 +110=2C10 @@ da_read_buf( >=20 > bplist[i] =3D libxfs_readbuf(mp->m_dev=2C >=20 > XFS_FSB_TO_DADDR(mp=2C bmp[i].startblock)=2C >=20 > XFS_FSB_TO_BB(mp=2C bmp[i].blockcount)=2C 0)=3B >=20 > - if (!bplist[i]) >=20 > + if (!bplist[i]){ >=20 > + nex =3D i=3B >=20 > goto failed=3B >=20 > - >=20 > + } >=20 > pftrace("readbuf %p (%llu=2C %d)"=2C bplist[i]=2C >=20 > (long long)XFS_BUF_ADDR(bplist[i])=2C >=20 > XFS_BUF_COUNT(bplist[i]))=3B > On Fri=2C Jan 28=2C 2011 at 8:13 PM=2C Ajeet Yadav wrote: >=20 > > libxfs_putbuf() is called with bp =3D NULL=2C resulting in pagefault in > > libpthread. > > > > Function da_read_buf() allocate array of xfs_buf_t * > > > > * xfs_buf_t **bplist=3B* > > > > * bplist =3D calloc(nex=2C sizeof(*bplist))=3B* > > > > Read and fill it using > > > > *for (i =3D 0=3B i < nex=3B i++) { > > bplist[i] =3D libxfs_readbuf()* > > > > * if (!bplist[i]){ > > goto failed=3B > > } * > > > > *}* > > > > *failed: > > for (i =3D 0=3B i < nex=3B i++) > > libxfs_putbuf(bplist[i])=3B* > > > > Now assume nex =3D 10=2C > > > > 1. Will create bplist for 10 array elements. > > > > 3. Reading from disk 0=2C1=2C 2=2C 3 > > > > 4. When reading from disk 4=2C USB is removed > > > > 5. libxfs_readbuf() will at fail=2C pblist[4] =3D NULL=2C goto failed. > > > > 6. Since only 4 buffers were read successfully=2C so only 4 are in lock > > state. > > > > 7. Error handling will unlock buffer from 1-10 > > > > 8. Buffer 0-3 were read successfully=2C hence will have valid pdlist[i] > > > > 9. Access pblist[4] =3D=3D NULL=2C therefore unlocking will set bp =3D= =3D NULL in > > libxfs_putbuf(bp)=3B > > 10. Page fault in libpthread > > > > > > Solution patch attached with mail > > > > > > > -------------- next part -------------- > An HTML attachment was scrubbed... > URL: >=20 > ------------------------------ >=20 > Message: 4 > Date: Mon=2C 31 Jan 2011 11:41:16 +0900 > From: Ajeet Yadav > Subject: Re: [patch] xfsprogs: repair never return if device removed > To: xfs@oss.sgi.com > Message-ID: > > Content-Type: text/plain=3B charset=3D"iso-8859-1" >=20 > I did not receive and response / reviews on patch. >=20 > diff -Nurp xfsprogs/repair/sb.c xfsprogs-dirty/repair/sb.c >=20 > --- xfsprogs/repair/sb.c 2011-01-28 20:23:02.000000000 +0900 >=20 > +++ xfsprogs-dirty/repair/sb.c 2011-01-28 20:21:06.000000000 +0900 >=20 > @@ -122=2C8 +122=2C9 @@ find_secondary_sb(xfs_sb_t *rsb) >=20 > done =3D 1=3B >=20 > } >=20 > - if (!done && (bsize =3D read(x.dfd=2C sb=2C BSIZE)) =3D=3D 0) { >=20 > + if (!done && (bsize =3D read(x.dfd=2C sb=2C BSIZE)) <=3D 0) { >=20 > done =3D 1=3B >=20 > + do_warn(_("Couldn't find candidate secondary superblock=2C exiting...\n= "))=3B >=20 > } >=20 > do_warn(".")=3B >=20 > On Fri=2C Jan 28=2C 2011 at 8:31 PM=2C Ajeet Yadav wrote: >=20 > > xfsprogs all version=2C delete primary superblock of xfs partition > > > > dd if=3D/dev/zero of=3D/dev/sda1 bs=3D512 count=3D1 > > sync > > > > Run xfs_repair in partition=2C while its searching for secondary superb= lock=2C > > remove the disk (USB) xfs_repair will never exit and will loop in never > > ending ............ > > > > Please find patch attached with mail > > > -------------- next part -------------- > An HTML attachment was scrubbed... > URL: >=20 > ------------------------------ >=20 > Message: 5 > Date: Mon=2C 31 Jan 2011 14:51:31 +1100 > From: Dave Chinner > Subject: Re: how to decode metadump info produced by xfs_db=2C and > superblock error > To: lord worm > Cc: xfs@oss.sgi.com > Message-ID: <20110131035131.GI21311@dastard> > Content-Type: text/plain=3B charset=3Dus-ascii >=20 > On Sun=2C Jan 30=2C 2011 at 08:21:19PM -0500=2C lord worm wrote: > > > Date: Mon=2C 31 Jan 2011 08:40:26 +1100 > > > From: david@fromorbit.com > > > To: cryptopsy@live.com > > > Subject: Re: how to decode metadump info produced by xfs_db=2C and su= perblock error > > >=20 > > > On Sun=2C Jan 30=2C 2011 at 11:33:53AM -0500=2C lord worm wrote: > > > > > Date: Sun=2C 30 Jan 2011 18:16:30 +1100 > > > > > From: david@fromorbit.com > > > > > To: cryptopsy@live.com > > > > > CC: xfs@oss.sgi.com > > > > > Subject: Re: how to decode metadump info produced by xfs_db=2C an= d superblock error > > > > >=20 > > > > > On Sat=2C Jan 29=2C 2011 at 07:25:10PM -0500=2C lord worm wrote: > > > > > >=20 > > > > > > What kind of information is in this file produced by metadump= =2C is it worth reading it somehow? > > > > > >=20 > > > > > > I'm trying to first understand what's causing a 'superblock can= not > > > > > > be read' error in my XFS after a succesfully dd of the partitio= n > > > > > > (dd succeeds in copying to a file=2C and also restoring=2C but = after > > > > > > restoring it cannot mount). > > > > >=20 > > > > > dmesg output when the mount fails? > > > >=20 > > > > Could you email the mailing list next time as well=2C so that my > > > > forwards are directed towards everyone=2C please? > > >=20 > > > I did: > > >=20 > > > http://oss.sgi.com/archives/xfs/2011-01/msg00486.html > > >=20 > > > As for list ettiquette - please don't top post and wrap all you text > > > except for code and pasted log messages at 72 columns..... >=20 > Fixed that for you again. >=20 > > > > Here's dmesg from the backup file=2C but I don't have it from the o= riginal disk after restoring it: > > > >=20 > > > > [ 362.685464] attempt to access beyond end of device > > > > [ 362.685468] loop5: rw=3D0=2C want=3D15662872=2C limit=3D15661056 > > > > [ 362.685473] I/O error in filesystem ("loop5") meta-data dev loop= 5 block 0xeeff17 ("xfs_read_buf") error 5 buf count 512 > > > > [ 362.685478] XFS: size check 2 failed > > >=20 > > > Simple problem - you copied the filesystem back onto a device that > > > is too small for the filesystem. > >=20 > > When I reply to this email=2C it defaults to david@fromorbit.com=2C so > > how will the others see it? >=20 > Reply to all. It's common courtesy to reply to everyone on the > cc-list for mailing list traffic as it often contains people not > subscribed to the mailing list (e.g. a person reporting a bug). >=20 > I've added the xfs list back onto the cc-list. >=20 > > I can't mount the direct dd image of the drive as a loop device > > either by the same error. >=20 > Which means you probably didn't copy the entire drive in the first > place. >=20 > > The error persists even when its not > > the filesystem that was copied back onto the device. Additionally=2C > > its the exact same device with the exact same partition type > > created by the exact same version of disk. >=20 > partition type doesn't matter - the size does. The above error > indicates that the loop device is 1816 sectors (908kiB) shorter than > it needs to be=2C so maybe you aren't recreating the partition as > large as it needs to be=2C too.... >=20 > As it is=2C the question I have at this point is why are you trying to > copy the filesystem via dd? if all you want is an image=2C xfs_copy is > probably what you want.... >=20 > Cheers=2C >=20 > Dave. > --=20 > Dave Chinner > david@fromorbit.com >=20 >=20 >=20 > ------------------------------ >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs >=20 >=20 > End of xfs Digest=2C Vol 29=2C Issue 102 > ************************************ = --_65f2faa3-9855-4813-b956-3872b2dcad28_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Stan=2C do you check dates on links before you paste them here? I don't car= e if its the 1st results of the google search 'meaning of life'=2C its irre= levant and oudated.

>=3B From: xfs-request@oss.sgi.com
>=3B S= ubject: xfs Digest=2C Vol 29=2C Issue 102
>=3B To: xfs@oss.sgi.com
= >=3B Date: Sun=2C 30 Jan 2011 21:49:14 -0600
>=3B
>=3B Send xf= s mailing list submissions to
>=3B xfs@oss.sgi.com
>=3B
>= =3B To subscribe or unsubscribe via the World Wide Web=2C visit
>=3B = http://oss.sgi.com/mailman/listinfo/xfs
>=3B or=2C via email=2C send a= message with subject or body 'help' to
>=3B xfs-request@oss.sgi.com<= br>>=3B
>=3B You can reach the person managing the list at
>= =3B xfs-owner@oss.sgi.com
>=3B
>=3B When replying=2C please edi= t your Subject line so it is more specific
>=3B than "Re: Contents of = xfs digest..."
>=3B
>=3B
>=3B Today's Topics:
>=3B >=3B 1. RE: xfs Digest=2C Vol 29=2C Issue 101 (lord worm)
>=3B = 2. Re: xfs Digest=2C Vol 29=2C Issue 101 (Stan Hoeppner)
>=3B 3.= Re: [patch] xfsprogs: repair pagefault due to missed out
>=3B s= anity NULL check (Ajeet Yadav)
>=3B 4. Re: [patch] xfsprogs: repair= never return if device removed
>=3B (Ajeet Yadav)
>=3B = 5. Re: how to decode metadump info produced by xfs_db=2C and
>=3B = superblock error (Dave Chinner)
>=3B
>=3B
>=3B ---------= -------------------------------------------------------------
>=3B >=3B Message: 1
>=3B Date: Sun=2C 30 Jan 2011 13:27:51 -0500
>= =3B From: lord worm <=3Bcryptopsy@live.com>=3B
>=3B Subject: RE: x= fs Digest=2C Vol 29=2C Issue 101
>=3B To: <=3Bxfs@oss.sgi.com>=3B<= br>>=3B Message-ID: <=3BSNT130-w7320373265265D515EDD5DAE30@phx.gbl>= =3B
>=3B Content-Type: text/plain=3B charset=3D"iso-8859-1"
>=3B =
>=3B
>=3B Stan I have no idea=2C could you tell me in detail wh= y dd failed=2C and what exactly those restore commands provide specifically= ?
>=3B
>=3B
>=3B -------------- next part ----= ----------
>=3B An HTML attachment was scrubbed...
>=3B URL: <= =3Bhttp://oss.sgi.com/pipermail/xfs/attachments/20110130/dee98fcc/attachmen= t-0001.htm>=3B
>=3B
>=3B ------------------------------
>= =3B
>=3B Message: 2
>=3B Date: Sun=2C 30 Jan 2011 15:03:42 -0600=
>=3B From: Stan Hoeppner <=3Bstan@hardwarefreak.com>=3B
>=3B= Subject: Re: xfs Digest=2C Vol 29=2C Issue 101
>=3B To: xfs@oss.sgi.c= om
>=3B Message-ID: <=3B4D45D22E.2060603@hardwarefreak.com>=3B
= >=3B Content-Type: text/plain=3B charset=3DISO-8859-1
>=3B
>= =3B lord worm put forth on 1/30/2011 12:27 PM:
>=3B >=3B
>=3B = >=3B Stan I have no idea=2C could you tell me in detail why dd failed=2C = and what exactly those restore commands provide specifically?
>=3B >=3B This might have some relevance. 2nd hit Googling for "dd with xfs"= :
>=3B
>=3B http://oss.sgi.com/archives/xfs/2003-04/msg00802.htm= l
>=3B
>=3B --
>=3B Stan
>=3B
>=3B
>=3B <= br>>=3B ------------------------------
>=3B
>=3B Message: 3>=3B Date: Mon=2C 31 Jan 2011 11:39:15 +0900
>=3B From: Ajeet Yadav= <=3Bajeet.yadav.77@gmail.com>=3B
>=3B Subject: Re: [patch] xfspro= gs: repair pagefault due to missed out
>=3B sanity NULL check
>= =3B To: xfs@oss.sgi.com
>=3B Message-ID:
>=3B <=3BAANLkTinK25h= L3Ljy42S6KrqEJ7nW_L+c77GPJhBVo=3D58@mail.gmail.com>=3B
>=3B Content-= Type: text/plain=3B charset=3D"iso-8859-1"
>=3B
>=3B I did not r= eceive any response / review comment on solution patch I sent.
>=3B >=3B diff -Nurp xfsprogs/repair/dir2.c xfsprogs-dirty/repair/dir2.c
= >=3B
>=3B --- xfsprogs/repair/dir2.c 2010-07-16 13:07:09.000000000 = +0900
>=3B
>=3B +++ xfsprogs-dirty/repair/dir2.c 2011-01-28 18:4= 9:21.000000000 +0900
>=3B
>=3B @@ -110=2C9 +110=2C10 @@ da_read_= buf(
>=3B
>=3B bplist[i] =3D libxfs_readbuf(mp->=3Bm_dev=2C>=3B
>=3B XFS_FSB_TO_DADDR(mp=2C bmp[i].startblock)=2C
>=3B <= br>>=3B XFS_FSB_TO_BB(mp=2C bmp[i].blockcount)=2C 0)=3B
>=3B
>= =3B - if (!bplist[i])
>=3B
>=3B + if (!bplist[i]){
>=3B >=3B + nex =3D i=3B
>=3B
>=3B goto failed=3B
>=3B
&g= t=3B -
>=3B
>=3B + }
>=3B
>=3B pftrace("readbuf %p (%= llu=2C %d)"=2C bplist[i]=2C
>=3B
>=3B (long long)XFS_BUF_ADDR(bp= list[i])=2C
>=3B
>=3B XFS_BUF_COUNT(bplist[i]))=3B
>=3B On = Fri=2C Jan 28=2C 2011 at 8:13 PM=2C Ajeet Yadav <=3Bajeet.yadav.77@gmail.= com>=3Bwrote:
>=3B
>=3B >=3B libxfs_putbuf() is called with = bp =3D NULL=2C resulting in pagefault in
>=3B >=3B libpthread.
&g= t=3B >=3B
>=3B >=3B Function da_read_buf() allocate array of xfs_b= uf_t *
>=3B >=3B
>=3B >=3B * xfs_buf_t **bplist=3B*<= br>>=3B >=3B
>=3B >=3B * bplist =3D calloc(nex=2C sizeof(*bpl= ist))=3B*
>=3B >=3B
>=3B >=3B Read and fill it using
>= =3B >=3B
>=3B >=3B *for (i =3D 0=3B i <=3B nex=3B i++) {
>= =3B >=3B bplist[i] =3D libxfs_readbuf()*
>=3B >=3B
>=3B &= gt=3B * if (!bplist[i]){
>=3B >=3B goto failed=3B
>= =3B >=3B } *
>=3B >=3B
>=3B >=3B *}*
>=3B >=3B<= br>>=3B >=3B *failed:
>=3B >=3B for (i =3D 0=3B i <=3B= nex=3B i++)
>=3B >=3B libxfs_putbuf(bplist[i])=3B*<= br>>=3B >=3B
>=3B >=3B Now assume nex =3D 10=2C
>=3B >=3B=
>=3B >=3B 1. Will create bplist for 10 array elements.
>=3B &g= t=3B
>=3B >=3B 3. Reading from disk 0=2C1=2C 2=2C 3
>=3B >=3B=
>=3B >=3B 4. When reading from disk 4=2C USB is removed
>=3B &= gt=3B
>=3B >=3B 5. libxfs_readbuf() will at fail=2C pblist[4] =3D NU= LL=2C goto failed.
>=3B >=3B
>=3B >=3B 6. Since only 4 buffer= s were read successfully=2C so only 4 are in lock
>=3B >=3B state.>=3B >=3B
>=3B >=3B 7. Error handling will unlock buffer from= 1-10
>=3B >=3B
>=3B >=3B 8. Buffer 0-3 were read successfull= y=2C hence will have valid pdlist[i]
>=3B >=3B
>=3B >=3B 9. A= ccess pblist[4] =3D=3D NULL=2C therefore unlocking will set bp =3D=3D NULL = in
>=3B >=3B libxfs_putbuf(bp)=3B
>=3B >=3B 10. Page fault in= libpthread
>=3B >=3B
>=3B >=3B
>=3B >=3B Solution pat= ch attached with mail
>=3B >=3B
>=3B >=3B
>=3B >=3B>=3B -------------- next part --------------
>=3B An HTML attachmen= t was scrubbed...
>=3B URL: <=3Bhttp://oss.sgi.com/pipermail/xfs/att= achments/20110131/4e2718ae/attachment-0001.htm>=3B
>=3B
>=3B -= -----------------------------
>=3B
>=3B Message: 4
>=3B Dat= e: Mon=2C 31 Jan 2011 11:41:16 +0900
>=3B From: Ajeet Yadav <=3Bajee= t.yadav.77@gmail.com>=3B
>=3B Subject: Re: [patch] xfsprogs: repair = never return if device removed
>=3B To: xfs@oss.sgi.com
>=3B Mess= age-ID:
>=3B <=3BAANLkTikyOfkbtxN3Et5YZRJ2rPpdsVouJkyRW4fDbUG7@mail= .gmail.com>=3B
>=3B Content-Type: text/plain=3B charset=3D"iso-8859-= 1"
>=3B
>=3B I did not receive and response / reviews on patch.<= br>>=3B
>=3B diff -Nurp xfsprogs/repair/sb.c xfsprogs-dirty/repair/= sb.c
>=3B
>=3B --- xfsprogs/repair/sb.c 2011-01-28 20:23:02.0000= 00000 +0900
>=3B
>=3B +++ xfsprogs-dirty/repair/sb.c 2011-01-28 = 20:21:06.000000000 +0900
>=3B
>=3B @@ -122=2C8 +122=2C9 @@ find_= secondary_sb(xfs_sb_t *rsb)
>=3B
>=3B done =3D 1=3B
>=3B >=3B }
>=3B
>=3B - if (!done &=3B&=3B (bsize =3D read(= x.dfd=2C sb=2C BSIZE)) =3D=3D 0) {
>=3B
>=3B + if (!done &=3B= &=3B (bsize =3D read(x.dfd=2C sb=2C BSIZE)) <=3B=3D 0) {
>=3B >=3B done =3D 1=3B
>=3B
>=3B + do_warn(_("Couldn't find candi= date secondary superblock=2C exiting...\n"))=3B
>=3B
>=3B }
&= gt=3B
>=3B do_warn(".")=3B
>=3B
>=3B On Fri=2C Jan 28=2C 2= 011 at 8:31 PM=2C Ajeet Yadav <=3Bajeet.yadav.77@gmail.com>=3Bwrote:>=3B
>=3B >=3B xfsprogs all version=2C delete primary superblock= of xfs partition
>=3B >=3B
>=3B >=3B dd if=3D/dev/zero of=3D= /dev/sda1 bs=3D512 count=3D1
>=3B >=3B sync
>=3B >=3B
>= =3B >=3B Run xfs_repair in partition=2C while its searching for secondary= superblock=2C
>=3B >=3B remove the disk (USB) xfs_repair will never= exit and will loop in never
>=3B >=3B ending ............
>=3B= >=3B
>=3B >=3B Please find patch attached with mail
>=3B >= =3B
>=3B -------------- next part --------------
>=3B An HTML att= achment was scrubbed...
>=3B URL: <=3Bhttp://oss.sgi.com/pipermail/x= fs/attachments/20110131/77ad227f/attachment-0001.htm>=3B
>=3B
&g= t=3B ------------------------------
>=3B
>=3B Message: 5
>= =3B Date: Mon=2C 31 Jan 2011 14:51:31 +1100
>=3B From: Dave Chinner &l= t=3Bdavid@fromorbit.com>=3B
>=3B Subject: Re: how to decode metadump= info produced by xfs_db=2C and
>=3B superblock error
>=3B To: l= ord worm <=3Bcryptopsy@live.com>=3B
>=3B Cc: xfs@oss.sgi.com
&g= t=3B Message-ID: <=3B20110131035131.GI21311@dastard>=3B
>=3B Conte= nt-Type: text/plain=3B charset=3Dus-ascii
>=3B
>=3B On Sun=2C Ja= n 30=2C 2011 at 08:21:19PM -0500=2C lord worm wrote:
>=3B >=3B >= =3B Date: Mon=2C 31 Jan 2011 08:40:26 +1100
>=3B >=3B >=3B From: d= avid@fromorbit.com
>=3B >=3B >=3B To: cryptopsy@live.com
>=3B= >=3B >=3B Subject: Re: how to decode metadump info produced by xfs_db= =2C and superblock error
>=3B >=3B >=3B
>=3B >=3B >=3B O= n Sun=2C Jan 30=2C 2011 at 11:33:53AM -0500=2C lord worm wrote:
>=3B &= gt=3B >=3B >=3B >=3B Date: Sun=2C 30 Jan 2011 18:16:30 +1100
>= =3B >=3B >=3B >=3B >=3B From: david@fromorbit.com
>=3B >=3B = >=3B >=3B >=3B To: cryptopsy@live.com
>=3B >=3B >=3B >=3B = >=3B CC: xfs@oss.sgi.com
>=3B >=3B >=3B >=3B >=3B Subject: R= e: how to decode metadump info produced by xfs_db=2C and superblock error>=3B >=3B >=3B >=3B >=3B
>=3B >=3B >=3B >=3B >=3B= On Sat=2C Jan 29=2C 2011 at 07:25:10PM -0500=2C lord worm wrote:
>=3B= >=3B >=3B >=3B >=3B >=3B
>=3B >=3B >=3B >=3B >=3B = >=3B What kind of information is in this file produced by metadump=2C is = it worth reading it somehow?
>=3B >=3B >=3B >=3B >=3B >=3B <= br>>=3B >=3B >=3B >=3B >=3B >=3B I'm trying to first understand= what's causing a 'superblock cannot
>=3B >=3B >=3B >=3B >=3B = >=3B be read' error in my XFS after a succesfully dd of the partition
= >=3B >=3B >=3B >=3B >=3B >=3B (dd succeeds in copying to a file= =2C and also restoring=2C but after
>=3B >=3B >=3B >=3B >=3B &= gt=3B restoring it cannot mount).
>=3B >=3B >=3B >=3B >=3B >=3B >=3B >=3B >=3B >=3B dmesg output when the mount fails?
&= gt=3B >=3B >=3B >=3B
>=3B >=3B >=3B >=3B Could you email = the mailing list next time as well=2C so that my
>=3B >=3B >=3B &g= t=3B forwards are directed towards everyone=2C please?
>=3B >=3B >= =3B
>=3B >=3B >=3B I did:
>=3B >=3B >=3B
>=3B >= =3B >=3B http://oss.sgi.com/archives/xfs/2011-01/msg00486.html
>=3B = >=3B >=3B
>=3B >=3B >=3B As for list ettiquette - please don'= t top post and wrap all you text
>=3B >=3B >=3B except for code an= d pasted log messages at 72 columns.....
>=3B
>=3B Fixed that fo= r you again.
>=3B
>=3B >=3B >=3B >=3B Here's dmesg from th= e backup file=2C but I don't have it from the original disk after restoring= it:
>=3B >=3B >=3B >=3B
>=3B >=3B >=3B >=3B [ 362.= 685464] attempt to access beyond end of device
>=3B >=3B >=3B >= =3B [ 362.685468] loop5: rw=3D0=2C want=3D15662872=2C limit=3D15661056
= >=3B >=3B >=3B >=3B [ 362.685473] I/O error in filesystem ("loop5"= ) meta-data dev loop5 block 0xeeff17 ("xfs_read_buf") error 5 buf cou= nt 512
>=3B >=3B >=3B >=3B [ 362.685478] XFS: size check 2 fail= ed
>=3B >=3B >=3B
>=3B >=3B >=3B Simple problem - you co= pied the filesystem back onto a device that
>=3B >=3B >=3B is too = small for the filesystem.
>=3B >=3B
>=3B >=3B When I reply t= o this email=2C it defaults to david@fromorbit.com=2C so
>=3B >=3B h= ow will the others see it?
>=3B
>=3B Reply to all. It's common c= ourtesy to reply to everyone on the
>=3B cc-list for mailing list traf= fic as it often contains people not
>=3B subscribed to the mailing lis= t (e.g. a person reporting a bug).
>=3B
>=3B I've added the xfs = list back onto the cc-list.
>=3B
>=3B >=3B I can't mount the d= irect dd image of the drive as a loop device
>=3B >=3B either by the= same error.
>=3B
>=3B Which means you probably didn't copy the = entire drive in the first
>=3B place.
>=3B
>=3B >=3B The = error persists even when its not
>=3B >=3B the filesystem that was c= opied back onto the device. Additionally=2C
>=3B >=3B its the exact = same device with the exact same partition type
>=3B >=3B created by = the exact same version of disk.
>=3B
>=3B partition type doesn't= matter - the size does. The above error
>=3B indicates that the loop = device is 1816 sectors (908kiB) shorter than
>=3B it needs to be=2C so= maybe you aren't recreating the partition as
>=3B large as it needs t= o be=2C too....
>=3B
>=3B As it is=2C the question I have at thi= s point is why are you trying to
>=3B copy the filesystem via dd? if a= ll you want is an image=2C xfs_copy is
>=3B probably what you want....=
>=3B
>=3B Cheers=2C
>=3B
>=3B Dave.
>=3B -- >=3B Dave Chinner
>=3B david@fromorbit.com
>=3B
>=3B >=3B
>=3B ------------------------------
>=3B
>=3B ____= ___________________________________________
>=3B xfs mailing list
&= gt=3B xfs@oss.sgi.com
>=3B http://oss.sgi.com/mailman/listinfo/xfs
= >=3B
>=3B
>=3B End of xfs Digest=2C Vol 29=2C Issue 102
&g= t=3B ************************************
= --_65f2faa3-9855-4813-b956-3872b2dcad28_-- From karn@philkarn.net Sun Jan 30 22:44:59 2011 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,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 p0V4iwvR070967 for ; Sun, 30 Jan 2011 22:44:59 -0600 X-ASG-Debug-ID: 1296449244-05df02810000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-fx0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E83D98E7237 for ; Sun, 30 Jan 2011 20:47:25 -0800 (PST) Received: from mail-fx0-f53.google.com (mail-fx0-f53.google.com [209.85.161.53]) by cuda.sgi.com with ESMTP id IaDo5HdWvgOHd5qU for ; Sun, 30 Jan 2011 20:47:25 -0800 (PST) Received: by fxm11 with SMTP id 11so5886615fxm.26 for ; Sun, 30 Jan 2011 20:47:24 -0800 (PST) Received: by 10.223.96.6 with SMTP id f6mr2074721fan.22.1296449244428; Sun, 30 Jan 2011 20:47:24 -0800 (PST) MIME-Version: 1.0 Received: by 10.223.145.132 with HTTP; Sun, 30 Jan 2011 20:47:03 -0800 (PST) Reply-To: karn@ka9q.net From: Phil Karn Date: Sun, 30 Jan 2011 20:47:03 -0800 Message-ID: X-ASG-Orig-Subj: reordering file operations for performance Subject: reordering file operations for performance To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=20cf30433e3eaef9f2049b1d1ca8 X-Barracuda-Connect: mail-fx0-f53.google.com[209.85.161.53] X-Barracuda-Start-Time: 1296449245 X-Barracuda-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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.53938 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 --20cf30433e3eaef9f2049b1d1ca8 Content-Type: text/plain; charset=UTF-8 I have written a file deduplicator, dupmerge, that walks through a file system (or reads a list of files from stdin), sorts them by size, and compares each pair of the same size looking for duplicates. When it finds two distinct files with identical contents on the same file system, it deletes the newer copy and recreates its path name as a hard link to the older version. For performance it actually compares SHA1 hashes, not the actual file contents. To avoid unnecessary full-file reads, it first compares the hashes of the first pages (4kiB) of each file. Only if they match will I compute and compare the full file hashes. Each file is fully read at most once and sequentially, so if the file occupies a single extent it can be read in a single large contiguous transfer. This is noticeably faster than doing a direct compare, seeking between two files at opposite ends of the disk. I am looking for additional performance enhancements, and I don't mind using fs-specific features. E.g., I am now stashing the file hashes into xfs extended file attributes. I regularly run xfs_fsr and have added fallocate() calls to the major file copy utilities, so all of my files are in single extents. Is there an easy way to ask xfs where those extents are located so that I could sort a set of files by location and then access them in a more efficient order? I know that there's more to reading a file than accessing its data extents. But by the time I'm comparing files I have already lstat()'ed them all so their inodes and directory paths are probably all still in the cache. Thanks, Phil --20cf30433e3eaef9f2049b1d1ca8 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable I have written a file deduplicator, dupmerge, that walks through a file sys= tem (or reads a list of files from stdin), sorts them by size, and compares= each pair of the same size looking for duplicates. When it finds two disti= nct files with identical contents on the same file system, it deletes the n= ewer copy and recreates its path name as a hard link to the older version.<= br>
For performance it actually compares SHA1 hashes, not the actual file c= ontents. To avoid unnecessary full-file reads, it first compares the hashes= of the first pages (4kiB) of each file. Only if they match will I compute = and compare the full file hashes. Each file is fully read at most once and = sequentially, so if the file occupies a single extent it can be read in a s= ingle large contiguous transfer. This is noticeably faster than doing a dir= ect compare, seeking between two files at opposite ends of the disk.

I am looking for additional performance enhancements, and I don't m= ind using fs-specific features. E.g., I am now stashing the file hashes int= o xfs extended file attributes.

I regularly run xfs_fsr and have add= ed fallocate() calls to the major file copy utilities, so all of my files a= re in single extents. Is there an easy way to ask xfs where those extents a= re located so that I could sort a set of files by location and then access = them in a more efficient order?

I know that there's more to reading a file than accessing its data = extents. But by the time I'm comparing files I have already lstat()'= ;ed them all so their inodes and directory paths are probably all still in = the cache.

Thanks,
Phil



--20cf30433e3eaef9f2049b1d1ca8-- From david@fromorbit.com Sun Jan 30 23:52:19 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0V5qIDN073649 for ; Sun, 30 Jan 2011 23:52:19 -0600 X-ASG-Debug-ID: 1296453284-6fda003a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1730129D70C for ; Sun, 30 Jan 2011 21:54:44 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 9A1aA96YtFpusl2X for ; Sun, 30 Jan 2011 21:54:44 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AusFAAvdRU15LGFf/2dsb2JhbACWVY4gdLk6DYVBBA Received: from ppp121-44-97-95.lns20.syd6.internode.on.net (HELO dastard) ([121.44.97.95]) by ipmail04.adl6.internode.on.net with ESMTP; 31 Jan 2011 16:24:41 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pjmib-0007sf-Ci; Mon, 31 Jan 2011 16:54:29 +1100 Date: Mon, 31 Jan 2011 16:54:29 +1100 From: Dave Chinner To: karn@ka9q.net Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: reordering file operations for performance Subject: Re: reordering file operations for performance Message-ID: <20110131055429.GK21311@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: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1296453286 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.53943 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, Jan 30, 2011 at 08:47:03PM -0800, Phil Karn wrote: > I have written a file deduplicator, dupmerge, that walks through a file > system (or reads a list of files from stdin), sorts them by size, and > compares each pair of the same size looking for duplicates. When it finds > two distinct files with identical contents on the same file system, it > deletes the newer copy and recreates its path name as a hard link to the > older version. > > For performance it actually compares SHA1 hashes, not the actual file > contents. To avoid unnecessary full-file reads, it first compares the hashes > of the first pages (4kiB) of each file. Only if they match will I compute > and compare the full file hashes. Each file is fully read at most once and > sequentially, so if the file occupies a single extent it can be read in a > single large contiguous transfer. This is noticeably faster than doing a > direct compare, seeking between two files at opposite ends of the disk. > > I am looking for additional performance enhancements, and I don't mind using > fs-specific features. E.g., I am now stashing the file hashes into xfs > extended file attributes. > > I regularly run xfs_fsr and have added fallocate() calls to the major file > copy utilities, so all of my files are in single extents. Is there an easy > way to ask xfs where those extents are located so that I could sort a set of > files by location and then access them in a more efficient order? ioctl(FS_IOC_FIEMAP) is what you want. Cheers, Dave. -- Dave Chinner david@fromorbit.com From uasmsn1@prokonto.pl Mon Jan 31 00:25:04 2011 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 p0V6P25q079053 for ; Mon, 31 Jan 2011 00:25:03 -0600 X-ASG-Debug-ID: 1296455246-7e5e00970000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mout5.freenet.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EE7AB29D829 for ; Sun, 30 Jan 2011 22:27:26 -0800 (PST) Received: from mout5.freenet.de (mout5.freenet.de [195.4.92.95]) by cuda.sgi.com with ESMTP id vdezw9A0cZEbjtpE for ; Sun, 30 Jan 2011 22:27:26 -0800 (PST) Received: from [195.4.92.18] (helo=8.mx.freenet.de) by mout5.freenet.de with esmtpa (ID skyourrr6@freenet.de) (port 25) (Exim 4.72 #3) id 1PjnEN-0007yy-1W; Mon, 31 Jan 2011 07:27:19 +0100 Received: from 41-184-48-195.rv.ipnxtelecoms.com ([41.184.48.195]:11238 helo=hunter) by 8.mx.freenet.de with esmtpa (ID skyourrr6@freenet.de) (port 25) (Exim 4.72 #3) id 1Pjn69-000709-9R; Mon, 31 Jan 2011 07:27:18 +0100 From: " MS-WORLD- LOTTERY" X-ASG-Orig-Subj: YOU HAVE WON Subject: YOU HAVE WON Date: Mon, 31 Jan 2011 07:18:47 +0100 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_00C1_01C2A9A6.5F951E9C" 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: <1Pjn69-000709-9R@8.mx.freenet.de> X-Barracuda-Connect: mout5.freenet.de[195.4.92.95] X-Barracuda-Start-Time: 1296455249 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_00C1_01C2A9A6.5F951E9C Content-Type: text/plain; charset="Windows-1251" Content-Transfer-Encoding: 7bit YOUR WINNER PRIZE INFORMATION VIEW THE PROCEDURES ON HOW TO CLAIM YOUR PRIZE. ------=_NextPart_000_00C1_01C2A9A6.5F951E9C Content-Type: application/msword; name="YOUR WINNER INFORMATION.doc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="YOUR WINNER INFORMATION.doc" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAAL AAAALwUAAAAAAAAAEAAAMQUAAAEAAAD+////AAAAACQFAAAlBQAAJgUAACcF AAAoBQAAKQUAACoFAAArBQAALAUAAC0FAAAuBQAA//////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ///////////////////////spcEAA2AJBAAA+BK/AAAAAAAAEAAAAAAABgAA ExoAAA4AYmpiastzy3MAAAAAAAAAAAAAAAAAAAAAAAAJBBYA/MkAAKkZAQCp GQEAExIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAAAAAA AAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAAKQAAAAAAD4EAAAA AAAAPgQAAD4EAAAAAAAAPgQAAAAAAAA+BAAAAAAAAD4EAAAAAAAAPgQAABQA AAAAAAAAAAAAAFIEAAAAAAAA+gsAAAAAAAD6CwAAAAAAAPoLAAAAAAAA+gsA AJwAAACWDAAAFAAAAFIEAAAAAAAA6iYAALYAAAC2DAAAggAAADgNAAAAAAAA OA0AAAAAAAA4DQAAAAAAADgNAAAAAAAAvREAAAwAAADJEQAADAAAANURAAAI AAAAaSYAAAIAAABrJgAAAAAAAGsmAAAAAAAAayYAAAAAAABrJgAAAAAAAGsm AAAAAAAAayYAACQAAACgJwAAaAIAAAgqAABwAAAAjyYAABUAAAAAAAAAAAAA AAAAAAAAAAAAPgQAAAAAAADfGwAAAAAAAAAAAAAAAAAAAAAAAAAAAABfEQAA XgAAAL0RAAAAAAAA3xsAAAAAAADfGwAAAAAAAI8mAAAAAAAAAAAAAAAAAAA+ BAAAAAAAAD4EAAAAAAAAOA0AAAAAAAAAAAAAAAAAADgNAAAnBAAApCYAABYA AABBHgAAAAAAAEEeAAAAAAAAQR4AAAAAAADfGwAACgAAAD4EAAAAAAAAOA0A AAAAAAA+BAAAAAAAADgNAAAAAAAAaSYAAAAAAAAAAAAAAAAAAEEeAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA3xsAAAAAAABpJgAAAAAAAAAAAAAAAAAAQR4AAAAAAAAAAAAAAAAAAEEe AAAAAAAAPgQAAAAAAAA+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQR4AAAAAAAA4DQAA AAAAAKoMAAAMAAAAALEFE4OuywEAAAAAAAAAAPoLAAAAAAAA6RsAABYAAABB HgAAAAAAAAAAAAAAAAAAaSYAAAAAAAC6JgAAMAAAAOomAAAAAAAAQR4AAAAA AAB4KgAAAAAAAP8bAAA4AgAAeCoAAAAAAABBHgAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAABBHgAAvAMAAHgqAAAAAAAAAAAAAAAAAAA+BAAAAAAAAP0hAABs BAAA3REAADIDAAAPFQAASAIAAEEeAAAAAAAAVxcAANQBAAArGQAAtAIAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3REAAAAAAADdEQAAAAAA AN0RAAAAAAAAjyYAAAAAAACPJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAANx4AAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAN0RAAAAAAAA3REAAAAAAADdEQAAAAAAAOomAAAAAAAA3xsAAAAA AADfGwAAAAAAAN8bAAAAAAAA3xsAAAAAAAAAAAAAAAAAAFIEAAAAAAAAUgQA AAAAAABSBAAAZAUAALYJAABEAgAAUgQAAAAAAABSBAAAAAAAAFIEAAAAAAAA tgkAAAAAAABSBAAAAAAAAFIEAAAAAAAAUgQAAAAAAAA+BAAAAAAAAD4EAAAA AAAAPgQAAAAAAAA+BAAAAAAAAD4EAAAAAAAAPgQAAAAAAAD/////AAAAAAIA DAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAggEyBJ TkNMVURFUElDVFVSRSAiaHR0cDovL3d3dy5yb2xhbmRkZ2EuY29tL3J3b3Js ZC92MDEvaW1hZ2VzL2JyaXRpc2hfZmxhZy5qcGciIFwqIE1FUkdFRk9STUFU SU5FVCAUARUgIKCgoKCgoKCgoKCgoKCgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgDaCgoBMgSU5DTFVERVBJQ1RVUkUgImh0 dHA6Ly9pMi5taWNyb3NvZnQuY29tL2gvYWxsL2kvbXNfbWFzdGhlYWRfOHg2 YV9sdHIuanBnIiBcKiBNRVJHRUZPUk1BVElORVQgFAEVDUZST006IFRIRSBE RVNLIE9GIFRIRSBFLU1BSUwgUFJPTU9USU9OUyBNQU5BR0VSIElOVEVSTkFU SU9OQUwgUFJPTU9USU9OUy9QUklaRSBBV0FSRCBERVBBUlRNRU5ULCBNSUNS T1NPRlSgQ09SUE9SQVRJT06gV09STEQgTE9UVEVSWSBVTklURUQgS0lOR0RP TS42MS03MCBTT1VUSEFNUFRPTiBST1cgQkxPT01TQlVSWSBMT05ET04gVU5J VEVEIEtJTkdET00gV0MxQiA0QVIuDQ1SRUZFUkVOQ0UgTk86IDE3NTA1MTcy MC8xMCAgICANQkFUQ0ggTk86IDQwNTY0OTk5Mi80ODggICAgICANV0lOTklO RyBOTzogUEI4NzAxL0xQUkMNIFdJTk5FUjogTk8xNw2gAQENRUxFQ1RST05J QyBFTUFJTCBBV0FSRCBXSU5OSU5HIE5PVElGSUNBVElPTiBBV0FSRCBQUkVT RU5UQVRJT04gQ0VOVEVSOiBVTklURUQgS0lOR0RPTQ0IoA1ERUFSIFdJTk5F UiwNoA1NSUNST1NPRlQgQ08tT1BFUkFUSU9OIE1BTkFHRU1FTlSgV09STERX SURFIEFSRSBQTEVBU0VEIFRPIElORk9STSBZT1UgVEhBVCBZT1UgQVJFIEEg V0lOTkVSoE9GIE9VUiBBTk5VQUwgTVMtV09STEQgTE9UVEVSWSAoTUVHQSBK QUNLUE9UIExPVFRPIFBST0dSQU1NRSkgQ09ORFVDVEVEIE9OIDRUSCBPRiBK QU5VQVJZIDIwMTENoAkNWU9VUqBQRVJTT05BTCBFLU1BSUwgQUREUkVTUyBP UiBDT01QQU5ZIEVNQUlMIFdBUyBBVFRBQ0hFRCBUTyBUSElTIFlFQVKSUyBN U1dMTC4gV0lUSCBTRVJJQUwgTlVNQkVSIDc3NDExMzcwMDIgRFJFVyBUSEUg TFVDS1kgTlVNQkVSUyA1LTEzLTMzLTM3LTQyLCBBTkQgQ09OU0VRVUVOVExZ IFdPTiBJTiBUSEUgRklSU1QgTE9UVEVSWSBDQVRFR09SWS4gWU9VIEhBVkUg VEhFUkVGT1JFIEJFRU4gQVBQUk9WRUQgRk9SIExVTVAgU1VNUyBPRiBVU0Qg MSwwMDAsMDAwIChVU0QgT05FIE1JTExJT04gVU5JVEVEIFNUQVRFUyBET0xM QVJTKSBQQVlBQkxFIElOIENBU0ggQ1JFRElURUQgVE8gRklMRSBSRUYgTk86 IElMUC9IVyA4NzUwNjE3MjUvMTAgVEhJUyBJUyBGUk9NIFRPVEFMIFBSSVpF IE1PTkVZIE9GIFVTRCAyNSwwMDAsMDAwIFVTRCwgU0hBUkVEIEFNT05HIFRI RSBUV0VOVFktRklWRaAoMjUpoExVQ0tZIElOVEVSTkFUSU9OQUwgV0lOTkVS UyBJTqBGSVJTVCBBTkQgU0VDT05EoENBVEVHT1JZLg2gDUFMTCBQQVJUSUNJ UEFOVFMgV0VSRSBTRUxFQ1RFRKBGUk9NIFdPUkxEV0lERSBBIENPTVBVVEVS IEJBTExPVElORyBTWVNURU0gVEhST1VHSCBPVVIgTUlDUk9TT0ZUIENPTVBV VEVSIEJBTExPVCBTWVNURU0gRFJBV04gRlJPTSAyMSwwMDAgTkFNRVMsIDMs MDAwIE5BTUVTIEZST00gRUFDSCBDT05USU5FTlQgKENBTkFEQSwgQVNJQSwg QVVTVFJBTElBLCBVTklURUQgU1RBVEUsoEVVUk9QRSwgTUlERExFIEVBU1Qs IEFGUklDQSBBTkQgT0NFQU5JQSwgQVMgUEFSVCBPRiBJTlRFUk5BVElPTkFM ICJFLU1BSUwiIFBST01PVElPTlMgUFJPR1JBTU1FLCBXSElDSCBJUyBDT05E VUNURUQgQU5OVUFMTFkgRk9SIE9VUiBQUk9NSU5FTlQgTVMgLVdPUkQgVVNF UlMgQUxMIE9WRVIgVEhFIFdPUkxEIFRPIEVOQ09VUkFHRSBUSEUgVVNFIE9G IElOVEVSTkVUIEFORCBDT01QVVRFUlMgV09STERXSURFLqAgDaANCFlPVVIg RlVORCAoQ0VSVElGSUVEIENIRVFVRSkgSEFTIEJFRU4gSU5TVVJFRCBXSVRI IFlPVVIgUkVGIE5POiBJTFAvSFctNDc1MDYxNzI1LzEwIEFORCBXSUxMIEJF IFJFQURZIEZPUiBUUkFOU0ZFUiBBUyBTT09OIEFTIFlPVSBDT05UQUNUIFlP VVIgQ0xBSU0gQUdFTlQgRFIgU01JVEggV0FMS0VSoC4gWU9VUiBFLU1BSUwg QUREUkVTUyBTSE9VTEQgQkUgVVNFRCBJTiBBTEwgQ09SUkVTUE9OREVOQ0Ug V0lUSCBZT1VSIENMQUlNUyBPRkZJQ0VSLCBQTEVBU0UgTk9URSBUSEFULCBZ T1UgQVJFIFRPIENPTlRBQ1QgWU9VUiBDTEFJTVMgT0ZGSUNFUiBWSUEgRU1B SUwgT1IgVEVMRVBIT05FIEFTIFdFIEFSRSBQUk9NT1RJTkcgVEhFIFVTRSBP RiBFLU1BSUwuIEFMU08gWU9VIEhBVkUgVEhFIFJJR0hUIFRPIENBTEwgSElN IFRPIENPTkZJUk0gWU9VUiBXSU5OSU5HUyBBTkQgR09WRVJOTUVOVCBUQVgg UEFZTUVOVCBUSEFUIElTIEFMTCwgQVMgSEUgV0lMTCBQUk9WSURFIFlPVSBX SVRIIFRIRSBORUNFU1NBUlkgREVUQUlMUyBPTiBIT1cgVE8gQ0xBSU0gWU9V UiBQUklaRS4gQVMgUEFSVCBPRiBPVVIgU0VDVVJJVFkgUFJPVE9DT0wgWU9V IEFSRSBUTyBRVU9URSBUSElTIFNFQ1VSSVRZIENPREUgTVNXL01BWS9YWDEw IFRPIFlPVVIgQ0xBSU1JTkcgQUdFTlQuIFRISVMgSVMgVE8gUFJFVkVOVCBT Q0FNLg2goA1DT05UQUNUIFlPVVIgQ0xBSU1TIEFHRU5UIE9GRklDRVKgSU6g VU5JVEVEIEtJTkdET00uIA1OQU1FOqAgRHIuIFNNSVRIIFdBTEtFUg1FTUFJ TDogY2xhaW1zYWdlbnR1a0BnYWxhLm5ldA1URUxFUEhPTkU6ICs0NDcwMzE5 NzU2MDgJDQ1OT1RFOiBJTiBPUkRFUiBUTyBBVk9JRCBNSVNUQUtFUywgUExF QVNFIFJFTUVNQkVSIFRPIFFVT1RFIFlPVVIgUkVGRVJFTkNFIEFORCBCQVRD SCBOVU1CRVJTIEFORCBZT1VSIFNFQ1VSSVRZIENPREUgT0YgTVNXL01BWS9Y WDEwIElOIEFMTCBDT1JSRVNQT05ERU5DRVMgV0lUSCBZT1VSIENMQUlNUyBP RkZJQ0VSLiBETyBOT1QgUkVQTFkgQU5ZIE9USEVSIE1BSUxTIExJS0UgVEhJ UyBPTiBORVQsIEFTIFRIRVkgQVJFIEEgTE9UIE9GIFNDQU0gQVJUSVNUIE9V VCBUSEVSRSBQUkVURU5ESU5HIFRPIEJFIFVTLllPVSBNQVkgU0VFIE1BSUxT IExJS0UgVEhJUyBETyBOT1QgUkVQTFkuIERPIENPTlRBQ1QgWU9VUiBDTEFJ TVMgT0ZGSUNFUiwgRFIuIFNNSVRIIFdBTEtFUqBJTiBVTklURUQgS0lOR0RP TS6gIFlPVSBXSUxMIEJFIEFTS0VEIFRPIFBST1ZJREUgU09NRSBERVRBSUxT IEFORCBBUyBXRUxMIExFVCBZT1UgS05PVyBUSEUgQ09VTlRSSUVTIE9GIFRI RSBQQVlJTkcgQ0VOVFJFUyBBTkQgQUxTTyBUTyBFTkFCTEUgVEhFIE9GRklD RSBQUk9DRUVEIFdJVEggWU9VUiBXSU5OSU5HIENFUlRJRklDQVRFIEFORCBG SUxFIEtFRVBJTkcuDaAJDUNPTkdSQVRVTEFUSU9OUywgT05DRSBNT1JFIEZS T02gVEhFIEVOVElSRaBNQU5BR0VNRU5UIEFORCBTVEFGRiBPRiBNSUNST1NP RlQgQ08tT1BFUkFUSU9OIFRPIEFMTCBPVVKgTFVDS1kgV0lOTkVSUy4gVEhB TksgWU9VIEZPUiBCRUlORyBQQVJUIE9GIFRISVMgUFJPTU9USU9OQUwgTE9U VEVSWSBQUk9HUkFNLiBPVVIgU1BFQ0lBTCBUSEFOS1MgQU5EIEdSQVRJVFVE RSBUTyBBTEygVEhFIEFTU09DSUFURVMgRk9SIEFMTEVWSUFUSU5HIFBPVkVS VFkgUk9VTkQgVEhFIFdPUkxELiANoA1TSU5DRVJFTFkuIA1NUlMgQkVUSCBN T09EDaAgEyBJTkNMVURFUElDVFVSRSAiaHR0cDovL3d3dy5jc21vbml0b3Iu Y29tLzIwMDQvMDkxNi9jc21pbWcvcDFjLmpwZyIgXCogTUVSR0VGT1JNQVRJ TkVUIBQBFRMgSU5DTFVERVBJQ1RVUkUgImh0dHA6Ly9pbWFnZXMuZ29vZ2xl LmNvbS9pbWFnZXM/cT10Ym46LWJzcGppY3lBaGtKOnd3dy5wYWxvdHRlcnku c3RhdGUucGEudXMvbG90dGVyeS9saWIvbG90dGVyeS9yaWNreV9odXR0b24u anBnIiBcKiBNRVJHRUZPUk1BVElORVQgFAEVEyBJTkNMVURFUElDVFVSRSAi aHR0cDovL2ltYWdlcy5nb29nbGUuY29tL2ltYWdlcz9xPXRibjptTFlEUEUt QjJIc0o6d3d3LmxvdHRldHltYXJrLmNvbS9pbWFnZXMvaW5kZXguZ2lmIiBc KiBNRVJHRUZPUk1BVElORVQgFAEVAQ2goKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKAgDU1SUy4gVEFLSVlZQUggIEEnSVNIQUgNKENPLUNPT1JE SU5UT1IpLqCgoKANoA2goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgTE9UVEVSWSBTUE9OU09SUzogQ0hJRUYgU1BPTlNPUlM7ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgDU1JQ1JPU09GVCBDT1JQT1JBVElPTiBVSyygoKCgoKCg oKCgoKCgTUlDUk9TT0ZUIENPUlBPUkFUSU9OIEFGUklDQSwgDU1JQ1JPU09G VCBDT1JQT1JBVElPTiBVU0EsoKCgoKCgoKCgoKBNSUNST1NPRlQgQ09SUE9S QVRJT04gQVNJQQ2gDVBhc3Qgd2lubmVycyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIA0TIElOQ0xVREVQSUNUVVJFICJodHRwOi8vaW1hZ2Vz Lmdvb2dsZS5jb20vaW1hZ2VzP3E9dGJuOk1ud0dDNWNGcmp3Sjp3d3cudHJp YnVuZWluZGlhLmNvbS8yMDAyLzIwMDIxMjI4L2Jpei5qcGciIFwqIE1FUkdF Rk9STUFUSU5FVCAUARUBEyBJTkNMVURFUElDVFVSRSAiaHR0cDovL2ltYWdl cy5nb29nbGUuY29tL2ltYWdlcz9xPXRibjpxT1NkeUNTalBWTUo6d3d3Lm1p Y2hpZ2FuLmdvdi9pbWFnZXMvMjAwMjExQW5nZWxhUm9sbGluc182MTI2N183 LmpwZyIgXCogTUVSR0VGT1JNQVRJTkVUIBQBFQEgAQ0AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAEIAAACCAAAAwgA AGQIAABlCAAAZggAAGcIAABpCAAAbQgAAG4IAAB4CAAAoQgAAKIIAACjCAAA pQgAAPLgxrHGl8aFsWyx4LFaRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKRVoCFJfABZoCFJf AEIqAUNKFABPSgIAUUoCAF5KAgBhShQAcGgAAAAAIxZovmBxAEIqAUNKFABP SgIAUUoCAF5KAgBhShQAcGgAAAAAMRVoCFJfABZoCFJfADUIgTYIgUIqAUNK FABPSgIAUUoCAFwIgV0IgV5KAgBwaDMzMwAjFmjEXYUAQioBQ0oUAE9KAgBR SgIAXkoCAGFKFABwaDMzMwAyA2oAAAAAFWgIUl8AFmjlRk4AQioBQ0oUAE9K AgBRSgIAVQgBXkoCAGFKFABwaDMzMwAAKRVoCFJfABZoCFJfAEIqAUNKFABP SgIAUUoCAF5KAgBhShQAcGgzMzMAMgNqAAAAABVoCFJfABZoCFJfAEIqAUNK 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 AE9KAgBRSgIAXAiBXkoCAGFKFgBwaAAAAAAvFWgOXoAAFmgIUl8ANQiBQioO Q0oWAE9KAgBRSgIAXAiBXkoCAGFKFgBwaH9/AAAADWkLAABqCwAAawsAAKgL AACpCwAAtAsAALULAADPCwAA2gsAAPELAAD+CwAAZgwAAGkMAACbDAAAxQwA AM0MAADs1b2rnIq9c71zvV5GvTIAAAAAAAAAAAAAAAAAAAAAAAAAAAAnFmiq WZ0AMEoRAEIqAUNKFgBPSgIAUUoCAF5KAgBhShYAcGgREREALxVoDl6AABZo CFJfADUIgUIqBkNKFgBPSgIAUUoCAFwIgV5KAgBhShYAcGj/AAAAKRZo5jUt ADUIgUIqBkNKFgBPSgIAUUoCAFwIgV5KAgBhShYAcGj/AAAALRVoDl6AABZo dx3QADBKEQBCKgFDShYAT0oCAFFKAgBeSgIAYUoWAHBoERERACMVaA5egAAW aAhSXwA1CIFCKgFDShYAXAiBYUoWAHBoAAAAAB0WaNECqwA1CIFCKgFDShYA XAiBYUoWAHBoAAAAACMVaA5egAAWaAhSXwA1CIFCKglDShYAXAiBYUoWAHBo AAC/AC8VaA5egAAWaAhSXwA1CIFCKgFDShYAT0oCAFFKAgBcCIFeSgIAYUoW AHBoAAAAACwVaA5egAAWaAhSXwA1CIFCKgFDShYAT0oCAFFKAgBeSgIAYUoW AHBoMzMzAAAmFmgtd7sANQiBQioBQ0oWAE9KAgBRSgIAXkoCAGFKFgBwaDMz MwAPzQwAANYMAADXDAAA2AwAANkMAAD7DAAA/gwAACANAAA2DQAANw0AAGoN AABtDQAAkQ0AAJsNAAC3DQAAhw4AAI4OAACiDgAA6NTovaWQpXhgpUmleDGl eKUAAAAAAAAAAAAvFWgOXoAAFmh3HdAANQiBQioBQ0oWAE9KAgBRSgIAXAiB XkoCAGFKFgBwaDMzMwAsFWgOXoAAFmgIUl8ANQiBQioBQ0oWAE9KAgBRSgIA XkoCAGFKFgBwaDMzMwAALxVoDl6AABZoCFJfADUIgUIqDkNKFgBPSgIAUUoC AFwIgV5KAgBhShYAcGh/fwAALxVoDl6AABZoCFJfADUIgUIqAUNKFgBPSgIA UUoCAFwIgV5KAgBhShYAcGgzMzMAKRZo5jUtADUIgUIqAUNKFgBPSgIAUUoC AFwIgV5KAgBhShYAcGgAAAAALxVoDl6AABZoCFJfADUIgUIqAUNKFgBPSgIA UUoCAFwIgV5KAgBhShYAcGgAAAAALRVoDl6AABZodx3QADBKEQBCKgFDShYA T0oCAFFKAgBeSgIAYUoWAHBoERERACcWaIVwHAAwShEAQioBQ0oWAE9KAgBR SgIAXkoCAGFKFgBwaBEREQAtFWgOXoAAFmgpFjYAMEoRAEIqAUNKFgBPSgIA UUoCAF5KAgBhShYAcGgREREAABGiDgAApA4AANQOAADcDgAA9Q4AADEPAAA0 DwAANQ8AAHAPAAB7DwAAfA8AAIUPAACGDwAAiA8AAIkPAADPDwAA6tK60rqj h9Jv0ldvQirSAAAAAAAvFWgOXoAAFmh3HdAANQiBQioLQ0oWAE9KAgBRSgIA XAiBXkoCAGFKFgBwaAB/QAApFmjGFqQANQiBQioBQ0oWAE9KAgBRSgIAXAiB XkoCAGFKFgBwaAAAAAAvFWgOXoAAFmh3HdAANQiBQioBQ0oWAE9KAgBRSgIA XAiBXkoCAGFKFgBwaAAAAAAvFWgOXoAAFmgOXoAANQiBQioBQ0oWAE9KAgBR SgIAXAiBXkoCAGFKFgBwaAAAAAA3A2oAAAAAFmjcaCsAQioBQ0oUAE9KAgBR SgIAVQgBXkoCAGFKFABtSAAEbkgABHBoMzMzAHUIASwVaA5egAAWaAhSXwA1 CIFCKgFDShYAT0oCAFFKAgBeSgIAYUoWAHBoMzMzAAAvFWgOXoAAFmgIUl8A NQiBQioBQ0oWAE9KAgBRSgIAXAiBXkoCAGFKFgBwaDMzMwAvFWgOXoAAFmgI Ul8ANQiBQioBQ0oWAE9KAgBRSgIAXAiBXkoCAGFKFgBwaAAAAAApFmjRAqsA NQiBQioBQ0oWAE9KAgBRSgIAXAiBXkoCAGFKFgBwaAAAAAAAD88PAADSDwAA 0w8AAOAPAADhDwAA4g8AAAwQAAAaEAAApBEAAK4RAACwEQAAsREAANwRAADh EQAA4xEAAOQRAADnz7jPoM+Iz25Xbs/nQCgALxVoDl6AABZoCFJfADUIgUIq CUNKFgBPSgIAUUoCAFwIgV5KAgBhShYAcGgAAL8ALBVoDl6AABZoCFJfADUI gUIqAUNKFgBPSgIAUUoCAF5KAgBhShYAcGgzMzMAACwWaF5QWAA1CIE+KgFC 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 cGgAAAAAJhZo1i6nADUIgUIqAUNKFgBPSgIAUUoCAF5KAgBhShYAcGgzMzMA ACwVaA5egAAWaAhSXwA1CIFCKgFDShYAT0oCAFFKAgBeSgIAYUoWAHBoMzMz AAAvFWgOXoAAFmgIUl8ANQiBQioBQ0oWAE9KAgBRSgIAXAiBXkoCAGFKFgBw aDMzMwApFmj2AXsANQiBQioBQ0oWAE9KAgBRSgIAXAiBXkoCAGFKFgBwaDMz MwAADusVAADsFQAA7hUAAO8VAABGFgAARxYAAEgWAABKFgAA4RYAAOIWAADj FgAA5RYAAGIXAABjFwAAZBcAAGUXAABmFwAAZxcAAOfPss+ylbLPsniyz7Jb slM7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvFWgOXoAAFmgIUl8A NQiBQioBQ0oWAE9KAgBRSgIAXAiBXkoCAGFKFgBwaAAAAAAPA2qGYQIAFmgE bMMAVQgBOANqD1ICABVoDl6AABZoBGzDADUIgUIqAkNKFgBPSgIAUUoCAFUI AVwIgV5KAgBhShYAcGgAAP8AADgDag49AgAVaA5egAAWaARswwA1CIFCKgJD ShYAT0oCAFFKAgBVCAFcCIFeSgIAYUoWAHBoAAD/AAA4A2piDwIAFWgOXoAA FmgIUl8ANQiBQioCQ0oWAE9KAgBRSgIAVQgBXAiBXkoCAGFKFgBwaAAA/wAA OANqAAAAABVoDl6AABZoCFJfADUIgUIqAkNKFgBPSgIAUUoCAFUIAVwIgV5K AgBhShYAcGgAAP8AAC8VaA5egAAWaAhSXwA1CIFCKgJDShYAT0oCAFFKAgBc CIFeSgIAYUoWAHBoAAD/AC8VaA5egAAWaNd/ewA1CIFCKgFDShYAT0oCAFFK AgBcCIFeSgIAYUoWAHBoAAAAAAARZxcAAIkXAACKFwAAjxcAAJgXAACZFwAA oBcAAKEXAACiFwAArxcAANoXAADqFwAA7BcAAPsXAADnz7WbtZu1gWeBTYEz AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhVoz2fTABZoCFJf ADUIgUIqBUNKFgBPSgIAUUoCAFkoAVwIgV5KAgBhShYAcGj/AP8AADIVaM9n 0wAWaAhSXwA1CIFCKgtDShYAT0oCAFFKAgBZKAFcCIFeSgIAYUoWAHBoAIAA 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 hY3sDo9T4ISE1T/ArNA4In27DSABy9ShQj9XHq3w7svg54O9xC4VP7Rl3bC7 ICv/pYzAgZUOPDq0u+TLcCBjkEuekiyuKzDfdmCZAuPaYC5gVol0msLxnIJd H8kJ0A9t8Hzbp48S18F4IJ7XI6fwPJNC+lPz0x9/fE6wOj3SZvfK/58tPlhl AB+cybOVHN9JFe0eg6YbnX2eFrCf6ZvcHMg3s6ikav5mx0XLmEarfIbGtyeB dfa0Zm++1VoP46ivf7Xwq0c3AmBWkzi3WgGHxIfa2KCyxrVwbsBu967+pkRm ZUwzDC4AV1f/OL1ai1IykfvLJ3v27Hm0/GPilxNWjsUhwA1W5Yd1Ql8lnmNW lkbBmV2422S7CpmKn7ygyqz8hJXD7S4wz8OGulIhnKn9v96lerMibzCd8AYf HM7bYm+TU3vWZVUc0VzvQn2lT/713aM9cG6wNti3cPc7iDoGAuj+/XPnDIor UpjWlbusxGqKwZlC5WpylaosORhiAxe+3UPODY7nsU2DYa3BHMNToAoFsyrs gYLd+w75R2OTv0/5OmaRWRWeMaqUymjZ0NiYQwlD/XIOSlBJlIPI/y5q77gI o74ObXSr6+xJB7YpF94Y4N2aL/8toPoWXLBrspllowsKnY0vl4GV6hjAFTvs t25jH6xdrcIBq9JooIAUDwvaP5RJfTrEo4V1NKDiPpi9DsP53kRtk5bCg7Gj 9t7ObID5SB2d1+SE1O//9+te5JXWPYqunWYJK4SK1C+OwXyC7zGAKaomkXuc NM1z3OgojvlXu4pBSFX+X3v2/EVkPN5vP7nAiWJ0nZLD1MLAlYrdmvObVdhX 4T1XYVABXA+wHJDa9eFrEqrPAgze8Aeo6AtfLjz6yg+sYDxM4TswdCk56C4Q S80Sq1Ox57Myu2RW9mzQbkDfMYkLQhWoROz387EKOvHWKpFFUYvgQpxwNjea ik/+trwcgswF1LoYvvHtZxc4luXWKyRakJnrj2EB4nzvFcn+SioOrgRE7gIm dUhmdaON5QPIA52RoW8fPdrzycJTuPMtha9hjksPBgtBmJVZFXZBZaE4VgqN qfRYM06Flap+tFzMNz/LA3IsGvEijphFNpqKsIyt+dP/+i2w+hR3FfBceKB5 BmwrtLJQoiG0vp4FZzCd8wKtZYNheQWcr+0GkNr1GkrtZR/89rMhFuXebTc+ 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 UAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAUA UAUAUAUAUBWtb0+XVNA5o0+A2lylmjTtY4sYAPfuqfIieWIcqaDGiysaRlkh cFZFJDgj3Qb3vsrWy7dY1O52W6oXnFqqlFqhoXKfmq0cqQ65K0Mxsq6lGLX6 AJ1Xfv32Pd01rW77WkjfzO0QlWVl/wDb8vkzXMDnGWytmKmRjy7YsnHI2qbb tpV+naCO6t5NPY8xODi6NUZYcDV9O1If8rMGfpia6uN42o1j0VkiPaAKAKAK AKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAK AKAKAKAKAKAKAY6f/wBRqI6sof8AAiNSfAwjzhr+h6bj80Z+kOL4wznWQIeE hHk4hYjdYEVOS6o0YtXHCakt0M+Y/LXP04Nk6SWy8b60LECZPSLBx6q507DX pPSY/dYz0u6f3Ig9F5l5i5VlaLFcmAn8bAyFJjbvQ2Kn7y2NVRnR8jfyMR3Y 19a4Nb/qaZy/z3omu8EUn/K5VwzYc7bOMfWgl6x22NbsJ1PMX8VwfgWd83mf TsfxuXdTvY8SY2oBsjGa4/q5Gv40XYUfh7KtUk9zTaYxwP4gdMxMx9J500jJ 0fPhbgleEjJgGz4z8EgU9HCr99WfTrsY6jRtC5x5W5lUNoWq42axHF4McgEw H3oWtIvpWoOLRmpNVEyFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAMcD/qtS//ACl//XhqT4GEeePM/GbF 591ZRdRM0UqMDt9+FCSLfevVsdil7lc5f82ta0f/AJDW4/3pjRsV8Vm4chQD a3Huf9L11a7UZKuxKrLtianyNzwgixpIvmmG3ByR4MwJ/uzff+YxrWu49d1X xNrHyrlp1hJogtb8scmK8+lOzW2iGXY6n7si7D6a0XYcfSzuW+7QuKl6P/dE YaVzhzNydkDE1SN5MfdwTLf3fobvU1ON3hJalF/DjJddpqUfD/NcCa5im5Z8 wdNWRPDwtVhUjFyD8B6fBkbfwk7r/CfTXQx7nQ/6onGuQfHRmRZOFPhZLwTK YZ4WsynYVYdo+mun9FSVYuqNetCy6N5peYPL5C4et5MkWweDlEZSWG4KMgPw /okVrTtRXqVDNWaHo/8AExqsRCa/osGSCQPFw5HgYDpPhy+MGPZxLVf8VP0s l1Gg6L58eXmsN4c2VNpkpYKqZsRXiJ6eOEyoB+cRVErEoklNF703WdJ1iMza TnY+bGpszY8qSAHfZuAmx76paaJD2sAKAKAKAKAKAKAKAKAKAKAKAKAKAKAK AKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAj9NlWTM1ZFBBiy1Rr9JOLjvs9 DVJ8DC4mIeduKcfnCDJtZMnDjN/vI7ofYFq2GxTPcw7VIxHqGQoGwvxD9IXq 6D0JDTqPSNoPSDVibBb+XvM7mjQOGGSb944Q2fL5RLEDqSX4x6bjsrDtxlvu K0NK0rnbknnSEYOcEwsuTYcTMC8DMfsSH3T7D2VrXMdpf1Itt3XF1i6Mh9e8 tcjT5GzeXJjC2/5aQ3Rh1K5+hvXWqotek3f5MZ6XF+K+XyKLqkLZMpxtTibA 1OMcKs4IVgNwJ6uqtm1kteDKbmPxWqK/IJIJGhyF4HXYR0d9dO3lJ6SNNxoc lUbds+irZWIvWOhFM4KEG9r1Ck47qoF8bOysSZMjGyJIJoiGjkRirKV+Egg9 FY6YSBbtI83OfdJcGLWcidRa6zsMhSB0FZw/7JWqZYy4GVIuum/xK8xQSMNW 0jDzIvq/LtJiv6eM5A9la0sehJSLBg/xM6NI4Gp6FlY6fWbHmjyCO4OIPpqv 6PiZ6i3aR54+XGrcKNqTafK5sIs2J4rd8ih4h+vUXakjPUi+4+Rj5cKZOLKk 0Eqh45Y2DoysLqystwQRVRIUoAoAoAoAoAoAoAoAoAoAoAoAoAoAoAoAoAoA oAoAoAoAoAoAoAoAoAoBhp8aJmaqyixkykd+0/LQL9C1J7IwjKfPvFtJomcB sIyIWPcY2Ue1qnbK7h5715OHP4uh0U+rZ+SrUERtWIyfDsqxakWckX/kq5Mw WrlvzE5j5cVMZZvndOH/ANnkksoH+bf4k9GzsqErUZ+0ymaJha9ydz9AMHIR Ycw7sTIIWQH/ADEotxejb2VpXcdrfUtt3XHYqnM/l5qWAjSYPFm4kdyqH+vi HV95a19V4o2eqE/BlBdXicq1wRsPRWxavuOzNedtrc6WUfWFu0bvVXUtZUZb 6FLixQhXF7XHWNoralCMiJz4MRHSD1jbUfpxMana4xbYsgI6m2VNW/Ei504A 2I43i3duqEsdPgFcQ/5e5fy9e1rE0rHXiad/e6LIgLuf1RWrdt9CrwJp12Ns jxs/SHvGJsOQLweJEWQ8OzZxIRs2VoVTIaoY8zeZvOPL+Niw4OpHxJG2GWOK U+HGBe5kRmN7jbe9at9qNKHV7fY+rVvZHWlfxFa7CwGs6Ti5Ue7ixmfHfvs5 mB9la/1Tel29c3/j3F90Tzw5K1d1hnebT5W6MhRw36gyk3rP1lxKJdvnwaf5 f495dcPmHQ890ixNQgklkHFHD4iiQjsjazeypxnF7M1bmPch6otEjUygKAKA KAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAZ4ezL1Af55D/uYx+Sp PZGEUDz0xTLypi5Kjbj5qXP3XjdT7bVKDIzR5o5jQq2PL0MGUnuIP5a2La6q ojsQpqyGoYIrytwRKXb7KgsfUKuUaGBx+69UO7CyDfdaJ/5KlVV3FGO15X5l aPxRpGaY/tfLyW/m1nrjzQoxFtE1mNfEbAylCn4vBkFj38NT6o8x0st3LvmR rOi8GFr8UmdhLZQ0gK5EY+67fGOxvXWvcsReq0YrQtefy/ytz7iNqWizp8xb 33jHDIh6pozY/wDjYa0J22nroXxuUVHqjMNc5a1TQJzHmxHw7+5Mu1G9PR6a hVrcy4p6oilZlN1NjW7ZyJRKXGovHKkh4XHC3sNda3djMpaaFvCPRV/SQ60d JLJEdh2dR3UTaDiman5FQQ5nNWTlFAGxcNzf70jqn0Xrndyn/ppeJZjwabN4 yMDGnFpEBv2VwKm5QwXzYw8b/E/ykagJjQRiy7Pee7n6RXOyLz66cj3nYe3w ljdTXqk/kUCTTiNsT+hv5RVavczoXO1r9rG0mPkR/EhI6xtFXK4mc65hTjuj tNRzEg+VEzGAHiELe8oPWFa9vRUvE1+hosml+ZvPOjxJj4OrzCGOwSKXhmVQ NgCiQNYdg2VYpvmac8WEtXFf49heuVPOHnnU8iUZbYk0ECDiJgKkux925R16 jW1Zbkzj51iFqKa3ZZJ/MXmiUqY3ggA3iOK9+/xC/sra6EclzK5zL54c2aAY MTHTDyMiQGR3mif3U3KAI5EG03qStIx1MY4H8SnMUcn/AHTScKeP/wBuZYW/ beUVn6KM9TLFgfxLaHI1tT0bKhX7WPJHMf1X8L6ai7PJmesvvLfmlyNzSyQa bqkceW9gMPKBx5izbAiiSyu35haqpW2iSaLfUDIlk5WNhwvkZc0cEMYLPLKw RVA2klmIAFZSqCo5/m55d6bL4M+txSP/AO3jlyF/XgR19tWxsTfAi5pEe3nr 5Zr/AP1JD2DFyfyx1h2ZLcKSZ3j+ePllOQDrBiJNgJcbJX2iIj21FwZmpbdK 5l5e12/7l1TEzyoBZcaeOVlB3cSoSR6ai0xUk6wZCgCgCgCgCgCgCgCgCgCg GeLszc4dbxn/AHYH5Kk9jCKz5rYL5/JGfHGLujQyDZe1pVBPqJpHcxLY8/43 I8vM2VFp75QxhEGld+HjJUWBVRddvfV0bnS6kEi2aR5T8saU4mzQ+qE/CMj3 UX/VpYH01iV11qtCRfNP0nTNPjCYGLDjIQNkMax/zQKqbb3MjwLwHYSVPQTU TJ0hVdg3UB9uVGw+71VgyM8vHhnUiWNZQfquoYftVlMwRI0TR4MgZcODBDkL umijWN+4lAL+mrOp8zAlqWmYmowPBlRrJGwsQwvWEDJ+Z/LabEZ8rRzxRbzC 3R3Gs05E+pPcoM0MsEhhnQxyKbFWFiKnC447EZRO4cmSE2O1a69jJqa87dR4 kkUq2Nh21vqSZQ4tGu+QOI/zmuZQHEqRQRhvzmdv6NcjuWiijbsuqNvWVrAE bOquMbB555+yDk846tITe0/hjujUJ/RriXnWb9p9Y7NHpxLa8PjqV0qDtqqp 1nE4KDorNSqUBCXHjk+NAe3pqxSaNW5YjLdDV9OQ/wBWxXs31arrNCeBF7Gk cgcrZw0Js5EVhlSsVN7ErH7g9oNdTEmump4TvkWr3R/SviWGTRc5dngNfssf oreU0efcWYhzdmHL5hzSfhhcwJ2CL3fpvW10OgjsQl6z0kqhxU6TFT7xGnSC Rh5k5hxoWxsfVcyKB9rxR5EqIxsBdlVgDsHTTpQqN4NSzMfIGUkheW9yZPfD fnBr3rNDB3m6lmajK0swjVm3iKNIh6kAqyNtmGxt4bnfVn0SNTnht01B2fYT TY4xtP1DLdRhY0s0l/dESMx9HCKqlYW7dCSbNI5c1Pzu0uzafkZrIALY2e6z AqPqrHklnA/NtWpcUVxTJpMvGh+f2fhZ8elc/aN8i7NwPm43Eqrc2BaCTiuO srIe6q+iLVUzNWtzXNJ5k0LXVDaVnRZDEX8MHhkA6zG1mt6KpLHFrclKEQoA oAoAoAoAoAoBpBsz8sdaxH2MPyVl7GBlzdCs/LGqo24Ysr+lFLj2rRB7GJ8q WXmGFBtEqyRn0oT+SpMikXPMysTBRjmzxwIL3MjhBf0kVByS3Zbbszm6RTfs I2fn/lXBiVWzfmJANqwIz/tEBfbWvLJgvE6trsmVP9vT7WQ2Z5tYCqRg6fLK 3QZnWMd9l4zVMsxcEdS19tXH65pezX5FXzvM/mWeQ/LmHES/uiNONgO1pOK/ qqp5M2dC32LHh6qy/H5DQeYPN28agf8AZRW/mVD+RPmbP/xcV/t/N/MXXzL5 qC8EksLdphX17LVL+RPmUPseNxT958PmLzLv4sc98R/IwqSy5kZfb2Pw6veK J5m6vHsyMKCXtVmT/wA1Wxy3xRoXft6K2kx5F5maXNZM3CmhJ+JkKyL9Kn2V fHKic252S6tmmM9SHKnMKFsWeFpGB/Bl/DkH5vFwkHurZjdhLic65h3re8XT 3lC1nl3J0pi6gy4327bV/Ot9NWao1SHHEpuhroWbzenErlE3zyLE+Dy9mZ52 /O5NlB+zCvD9LGtXOn1SS5E4KiNbgzFnIHDY+sGtChZU82a/O0+valO23xMu dgewyNauDN1bZ9iwV0WYL+1fAY32VWbx8rJgCBSocRNo71JMplbN85Z06bT+ XNNx0c7MdHZT0NIPEb2tXZsKkEfI+5XOvInL+5/loLanmvp+DlZ8xBjxYZJm NuiNS35K2Yxq0jntnk+aZ55pJ5Dd5GLuessbmu+UHBoAAFY6UDoBeqs9KApF CZWWONS7sbKqgknuAqXTEUZcdD8qucdbVZI8P5PHaxE2YfBFj0hDdz+rWvcy bcONfYSUGy9aT5DYUNpNc1GWdumLFURp+u/E3sFaU85v0otVtE7J5e+XugQi TKjxoyu0PmyGQnvR22+gVqzy5cZUNizizuOkIuXsRDZmu8g4HEMSGOeRPh+V xFjU9zMFrVeaubZ1rfYMmW6Ufa/kRGT5kvACum4TKnR4klh6gDVf8tcjZX27 NbzXuIjJ8x+Y5VKQGLFjO/wk9497tUJZLeyNm32S1H1Ny/IgtQ1vP1dBDqWS 08Y3K1repQKq+pPepvLFxIrp6Y/5nzTtTnw3RY5XEaH8M7QyW3ENvq2N98TT uYCS/wBOrXJr/M0zlfzp1nl6eLF5j4tW0eT4MkEHKi/SJAlA6m9773RWwrhx r2Ent5Wbvo+taXzBp8WqaPkplYkvwyIdx6VZTtVh0g7atTOVODi6MfVkgFAF AFAFAFANIT/3LKX/ADUB9Zk/krPAwd58Xj4OTBa/iRSJb85SKwZPJr5E8MTS RSMkiDiV0YqwI6iKrvJ9DOngyX8iFVpUiMqeaeYZGRI0zNsZ3YsfWa461Poj hGFKJJH0G4qJsphQHMi8QrKITjVCKPwnhO6pNGvGVHQV2MPoqJfugG6hhHLg 1lEZIbSJckippmpOIgR1irEzUlEXg1DMxhwxSnw+mNveQ/omr4XpR4nOyMK3 c1a1GeXHBNeWJBDIfiRf6s9w3rW7C+medyMCUNjZfK3mTDx9Aw9I1ACNF4/C yFG5mdiVk9J31bcTl5qmgtNGaHnSLgYORnLIVWGF5eIG491SwNa0pUTZfZtd c4x5tHnjxmdmeVizMSzMeknfXEaPr9uXSqcD74qdBqPSy360TriB3VihPrTP txQlVH1QGYKN5Nh6aGG0epFxofAij6FRQB2AW2V3o6I+KzdW2UXzalfTeSNU kjP9ciY4vtP4rqrbd/w3rcxFW4iiex5htXcoVAFLEKoJJNgBtJNRMULbonln zZrSLOuKMPHbaJssmO4PSEsXPqrXnkwj4kuk0PQfJnQcYLJrmVLnS7zFH+DC PSLu3rFak8yT9KoTUUW0z8jcmw+HEMTBYD4IVDTno28PE59Nc67kf1M6GPgX 73oi/giA1HzdxomKaPhPNa/4mQ3AveFXiJ9JFaUstcEegx/tub1uSp4LUqWq eYnNWqcStlnFiP8AZ4o8IfrC7/tVryvzfE72P2fGtft6n/dr+hW5JZJXMkrF 3O9mJJPpNUHXSSWmhwaBjjC0nUNUkEWBjS5Dk2tGhb1kbqkqvY1r1y3BVnJR 9pZcbyr5nyEDZEcGIp22mcFh+jGHrYjYm/A4l7veLHRVl7F8x7H5Tsv/AFmo hbdEMNwPSzD6KvWK+LOVc7/H9kBzH5X6RGPxcueY9BBVF9XCT7an/FXM1Zd+ uvZJH3L8u9JbDkxsfjRztSVnZ7N18OwVZGykatzuM7jrKnuKvoOu8z+VmuiV AWx5SBkYxJ8DJjB6PsuPqtvHaLisaxZd5L8aPc9O8t8x6ZzVpEGs6TJx48w9 5DseNx8Ucg6GU/8Ai1Xp1OPctuEqMlayVhQBQBQBQDGEt++stSBw/LYxBvtv xzg7Ld1S4GOI+qJk8oa/j/L6xq2IuwQ5WREo7FkZR9FYkqpm3an0yi/FFWWQ bVbcd46r9NcWh9KU+D2FIyR7h3jp7Kwy6DezFKiWHw1kwISrY3FSRrXI6nxX sazQxGVBwtmHENtQZtx11R1a9YJUORBEz2cbT6KdToRVmLlRiU2GV2rtHRUo zKbuK1sM3QrvFqtTOfOFNxMjqqaZrStpjvTtTy9Ml44D7p+OI/C38hrZt3Wj jZWGuWhfIPMKWTlrO00WdZIGj8KXa8QbYxjPSLHdVt5qcHTc08Oz9K/Gb9KZ TQGlAcOGB3W2VyHofQ41mqp1R8IZTtFDDTQLJY7KUMqYp4hNRoW9dSR0KP5z WcDFIJ8XIiVh90uOL2VmMKtIoy8joszfKL+B6OTKY9N+2u5Q+SVM+87M58nl jE0uCNpMnMzYwkUYLO4jR2NlG07SK3sGim29qEJtsonLnkvq+eqZevy/u3Ha xGOoD5BHaPhT03PZWzdzIr06mFE0nA5Z5O5Ixvmo4ocYrvzMkh5Sex22+hRX Ou5DesnoX2rM7kumCbfgQOs+amHCWi0XHOS+75ie6R94T4j6bVz55aXpR6TF +3Zy1uy6fBb+/Yo2qc28w6ux+azXWM/2MR8NB+ilr+mtOV6Ut2eksdssWfTF V5vVkNtveqjoJBc9dDNSa0zlPmPVgGwtPmeM7pXHhpbsaThB9FSjblLZGnd7 jYteqa+PwLhpflHmykNq+akC9MUAMjW/ObhUe2r44snu6HGv/ckFpbi37dC4 6f5ecq6WgYYnzco/tMk+Jc/mbE9lbMcaC8ThZHesm5+7pX9un6ljjjWCIJEi xxge6iKFHsrYSS2ORKTbq3VnEga9996kQG2RHEYjxfH0EVlGCJa/FwnfU6ET l1YDiUX6DUWSTITWtPxNZw3ws+MFTukA95D9oGsUqWxm4uqK5yfmcxeW/Mj4 ScWRiZQusAvwTgHqF7Nbp/JcVCEaPwNvIuRuQTXqR6J0jVINZ0+HUcdWRJRt SQWZWBsynuPVUzQaHtDAUAUAUBUdLy/G8zOYcZWJEGl6YrLfYGMmU+wdzip/ tIrct1QJHmLnzFOFzrrWOTfjynm9E1pbft1mpbFaVKHPGVZgo2oTbtHSK4p9 JXmgmuSYQyh7KT731T1isNF1q4noOAb1A2kz7WDIk4qSKZoQYWF6mjXkhXGk 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 wBFVOLW6odK1nWLnpnF/iiBnx94It2VKMjF6ymMWUxNwttQ9PVV1anMlHodH sITQFTxLuq6Fzgzk5eB+6JzFK8TXHpFWSgpGnjZU7UqfkPY/Dm9+NuCTr6PS K1JJrc9JalC6uqDo/wDG5c/LzmyHlfVpRqnuYmVHwSSBS5DJ7yMvDtPSPTU7 M1GVeBo93xJ37aVPPF6cnz1NWj565LzIllTU442YX4XV19BBWt5ZEOZ5F9ny v6H+Rw/OPKYPu6pBf9ID6KysiHMjLs+Uv+NnSc28quf/AJXGHe/D9Nqkr0OZ U+15K/45H2bmflVd2qYt+sTIfy1L6sOaIPt2T/45e4RXmrlwGy6tikf6VP5a l9WPNEf/AJ+R/wCOXuFf8RcvsP8A5PE/2yfy0+pHmiLwb/8ARL3Mf4muYE4/ 5XKx5rf3ciMfYadUXsyuVi5H1Ra/BnZneVuI32/RUqFIrjg7VGwHaTWGZQoP cY0MjPO0PRdTRk1DAxsjxNhMkSE9/Fa9SjOS2ZhoqWZ5Qcl5rOI4ZsKToOPK eH9WQOK2o5lxcakOhMq2p+RUqI8mk6srb+GLJjKnu44yf5tbMe4c0QdsoWpe XnN+lcTzadJPEt/xsb8ZbDpsnvD0itmGRB8THSVmaJ4mKSKUcb1YEEeg1a0j DRwF6umsdJGgoBwixF7dPVWelciJNckwfM85cv45GyTU8NT3GdL1z8qNEWQP btc4uCgCgCgCgK7PpuKvP2Dq4W2XJpGZjO/QY48nGkQegyN66mvSR4liqBIy 3zfv81pmz+yn2/pJRhMQ5LCnQoyRtEsov6ayYZPX7KAAVPuOLq2wisCpyuC8 bMg95TtWsEhwmLJw3dwq9Tbb+gVgDPMhaEgkEBt3RUkYGMouL1lmEONLlUuU J9xzwg9vZWDJNQZRs0GQQ3Rt2GsNGUxM2A4Q116qGCJzYJsWf94YXxr/AFqD c6j8orJmpM6VqsWUqyA7DsYHeD21FoymTV77aiSGGZpWj5911HBx8lW2EyxI 59ZFVu3F7pGzbyrtv0ykvY2VPXPKjlPNRjDiHGJBAfHcrb9FuJfZVbx4cNDf h3nJjo31LxMq5h8s9Z0R2bBJ1DD+qVFpVHUU239HqqidiS21O5h96tz8s/L8 PeUjIxGRmUqUdSQykWII3gg1XG40dHIw43FVe8bAvG1xsIq/SSOPF3LE/wDG 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 z4tv20kP82rVmS5Ij0Igsr+HDnaO7Y2bp046AJJkY+gxW9tWLN5ox9MgczyR 8zcO5XSxkIu3ix8iFvUpdW9lTjmLxRjoZDvpfPXLgM2fpeoQQp8b5GPKIwB9 9l4fbWzDMjzK5Wam+eUmsYmZyRHPxpG/zMwlRmF1Nx0VzM1qVyq2oX2l0xoW xtYwuMIGAVrgTEXFx0dlalCyp5q1nOGXq+dlSOpaXIlc7ftOTXBlVts+vYzj C1GNVpFfAZGVCLXv3baxQ2HdR8WRb2vRoxGaF0cEW31Bo2oSqKlb8NqwTN98 qDfkzGX7E86j9cn8tdbF9B8x+41/7j9kfgWXXLfubUONgqnFnuTsH9W1btv1 L2nnZbHjJ5rn3T6q9a5nOUOY1dyT8W3qqhyLkhNmuLVU2BTGHv7KttLUjLY6 yI7bQKzciIMbXqgkX7y658/ccw0bWHLaVM34Ujbfl3P/AKbdPVv661Mix1ar cnGVDa1CEBlVeFgCGWxBB3G431y6F1fEeYhBjkt8Si4PTsrBg6kliyYWxp4l lhcWeNwGVgesGsuKa1JQuSi6xdGjPeZvLlW8TN5d7WfBY/8ACY/Qa593F4xP Ydu+4f23v/18zOZ4ZceVoJ0aOWM2dGBDA9RBrSoerU4ySadUIMtzWURlEtfL fP2p4EmPo+oT8eBIREJn+KBSbXDdI763LN1rfY8p3Xt9t6wVJvlxL3q/Lely 81aDzLgQA5S61iGaaNhwvFdRxMu42tvFdJXG49NdDyDhR+Jt1RMBQBQBQDNw Dq0B6Ux5v23i/wDLWeBgeVgyFAFAFAFAFAFAFAFAFAFAFAFAFAFAFANJtK0v IuZ8OCQseJi0SElgLX2jfagGs3LOizG5xuDdsjd412fcRgvspUGcax/D7omb PJlaZquVhySu0jrMkeRHdjeyhfBYW7WNa0sdM7VnvN2Co0mVLUfIDm/HMjad n4WbGu1FZpIJW7OEq6A971U8Z8DpW+/r9yZWc3yy570qz5GhZUt9xx+DK9mO 0hHpFUysT5HSs94xnrVp+JA5WHqOmyeFqEE2HIPqZMbwn1SBTVMoNbo6drNt z9M4+8+x5WyxYNbpBqlwOpbylzqbh5S583+F3EdyEypOJT2hTcV0sNeV+08B 9yOuTX+1f5jnzN1DKflPVZYJDFw4rKAD9s8DH1Gunjqs0jzM9jy0sbE2vYWJ 9ArsSUmqI16nwRM5FlJJ3WqpW58DLkjl0ZWK2NxsNSUZLcxVMdYkZX3m2E7h W7Zi1uVXHpQXmVWU1dNaFVttEewsbVpNG0cbawZNe8q+evESPlbV5PfUcOnT t9Yf3DE9I+r6uqtDIs/uRJM1lE4EkkA2FeG42bTWgywQU9FZMCyPbYo9NYBF 69yvpHMMVs2Pw8gD8PKjAEi9/wBodhqi7ZU/adLC7ldx35XWPLgZNzFylqnL zF508bDPwZcYJX9IfVPfXNuWpQ3Pd4XdLWQtNJcmVOe/jAdGy3rqdvZmpmt/ Vii48vc0avgajpOmRTCXFOo4pWFxxcJaVV907xvqWNclWnAq77iWuh3Kec9X 10zwgUAUAUA036p3Y/0v/krPAwO6wZCgCgCgCgCgCgCgCgCgCgCgCgCgCgCg CgCgCgCgCgPjIrqVdQynepFwaAhczkvlDUCzZuh4Ezt8UjY0XGf0wvF7aj0r kWRuzWzYjhci8q6bGYtPwTixljIUhmnQcRsCbLIOqkYpbEp3py9TqfNT5H0P VdPyNNn+YSHJjaKQpO5bhYW2eIXHsqxSadUVPUok38OHJrC0Oo6nGe2SBh/w RV6yri4lfQiHyP4aYQxbB5idBe6pNiBz+skqfRVkc24uRh20yEy/4ducIWY4 edp2TGvw8TSxO3T8Phuo/Wq+PcecSDs+JV9U8qfMPTFM0+gzyre3FitHlE90 cDO9v0a2o9wtveqK3YZUc3FzdNmbF1HHlxMhfihyI2icX61cA1fHIhLZox9N kbN8W0bKhPcsRzw1igOomeORXjJV1IZWU2II2gg9lEhU27k7zSxNVxodG111 xtQUBVymsIpzuFz9V/Ya5t/F6XWOxYpaF3D2bpJNaRk6OTwX2gW6SdnppQHA zIm3TK/WQb+qlAdPLDPC0bgPGw4WVhcMOqx31holGTTqtzNubeQ8Ysc7Q/w2 X3pMPoI3nwj0HsrUnj0TcT0OL3bqlFXuD9XzITkSI6rz7y/pipwBM5J5eMWY /K3yCpH+rqjHtUdWdPvXcVct9EVRb15nrauieMCgCgCgGa7dWk+7jx+13/kr PAwPKwZCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgC gCgEMvCw9QgbFz8eLKx3+OGZFkRu9XBBoDPeZvIrkXX1eXDx20fMa5EuEbRc RGzix2vHwjqTh76thelHZmGkzF+aPIrnjl1nmwIBrWCtyJsPbNw3sOLGPv37 E4u+t23lrjoVuHIzuWOXDmfHyonhnjJWSKRSjKRvDK1iK3YXYsg0JMeI1iU0 KFx5b8weZtLxxpkAOoRXAhjcM8qD7KMtzbsNc664ydaFiRc9O1jI1NmXXIMv S5BuGVDJHE3c7KF9dqpa5MkWfD0lcnh+VzIiu9nDqwA/RqptozQd5Qx8FRHB xTuBd8h9g2dC9ndRGGRMcD61M/HkLjY8exnZrFz9lRUm6CKJ/Q+VsbE565dz 8LHlkhxoMtps0RPwGSSJlUtNbhOw2G2qKa1NpT/02jW6ma4UAUAUAyjv++Mm +75bHt/tJr1ngY4j2sGQoAoAoAoAoAoAoAoAoAoAoAoAoAoAoAoAoAoAoAoA oAoAoAoAoAoAoAoAoAoAoCC5l/wV4Sf4v/dnh7fC/efgWv8Ac8f8lZQKXB// AJ++cPhf4f8AG+/4Xhejj/D9VZfV4mDQNE/w/wDJr/hz5P5L6nyHheF6PB92 omSRoCM1H/DnCP3t8lw8Wz5nwvi22tx9O+soEaf8AW97912+94NremmoJTSv 3D4B/cnyngcRv8p4fBxWF7+Hsva1YBI0AUAUAUAUB//ZJA0AAEQAZAAAAAAA AAAIAAAAAAAAAAAAAAAAAOAQ4BCxCS0BAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAPAATwgAAAALIECvAIAAAAAgQAAAAKAABTAAvwXAAAAARB AgAAAAXBKgAAAAYBAgAAAP8BAAAIAIHDFAAAAG0AcwBfAG0AYQBzAHQAaABl AGEAZABfADgAeAA2AGEAXwBsAHQAcgAAAE0AaQBjAHIAbwBzAG8AZgB0AAAA AAAQ8AQAAAABAACAUgAH8FAMAAAFBbg/2yMziv0dE5dxq9JT5mH/ACwMAAAB AAAA61IAAAAA3gqgRh3wJAwAALg/2yMziv0dE5dxq9JT5mH//9j/4AAQSkZJ RgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMgAA/+4ADkFkb2JlAGTAAAAA Af/bAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDg0NDgwRDxIT FBMSDxgYGhoYGCMiIiIjJycnJycnJycnJwEJCAgJCgkLCQkLDgsNCw4RDg4O DhETDQ0ODQ0TGBEPDw8PERgWFxQUFBcWGhoYGBoaISEgISEnJycnJycnJycn /8AAEQgAMgHpAwEiAAIRAQMRAf/EAJMAAQEBAQEBAAMAAAAAAAAAAAMAAgYE BQEHCAEBAQEBAQEBAAAAAAAAAAAAAgEABgMEBRAAAgIBAwIEBAUDAwUAAAAA AQIAAwQREgUhBjEiEwdRYXEUQYGRMiOhUhWxYjNCgpMkFhEAAgIBAgYAAwgD AAAAAAAAAAECAxESBCExQVFxE2GBMpGhsSJCYnIFgpIU/9oADAMBAAIRAxEA PwDmZSm6absixacetrbX6LXWpZj+PQL1ndcuLONMSnsu4nlcetrsjByKqk6t ZZU6qPw6ll0h43H5+aGbDxbsgJoHNVbOAT4a7QYdccZ1LHfPAumWcaXntg88 p7f8PywtFJwMn1SpcV+i+4qCAW27ddASJ5r8fIxbDTlVPTaNCa7FKMAfDo2h lUovgmn4ZnGS4tNeUHKUpQlKUpjFKUpjFKUpjFKaRHscV1qXdjoqqNST8gJq 7Hvx2C5FT1MRqBYpUkfHzTZWcZ4lw8ZDlKUxDQmhMiaEjKbE0JkTQhYkbEQQ xEELEjYiCGJsQsSEERYYiCBiQixFhrEWBjQqxFhrEWBiQqxFhrEWBjQqxFhr EWBjQqxVhLFWBjQqxVhLEWebGhVirCWKsDGhVirCWKsDEhFirCWKs82NCLFW EsVYGNCLEENYiwMaEEQQxEEDEhBNiYE2IWJCCbEwJsQMaNibEwJsQsqNCbEw JsQsRqUpSFP5anb+1eD913P9yR5cKiy3X/c+lIH6OZxE/bntBg7MDkeRYf8A NalCE/Cpd50/8k63+ys9eztfWS0r/Lg/uOY/r69e6rXSL1f68TqO+U9TtPlF 6/8AECNPirqw/wBJdlcD/wDP8Bj4ti6ZV38+X8RY4Hl/7FAWejicmrmqM9rQ LKFzbalU/tIx2VB+RKaxOG5D/KXchlVnXGqyDiY5HgwoA32fnYzD6ATnHKyN E9vyUZ65+WklH8T95RhK6N/Nyhpj4Tbb/A+Pk4/Ncj3PnZHEZlWGMCinDY20 +sGazXJfb5l06Mms4Vez+f7y5rP5DJyK0x1uahs9kKrb6H8OtFQPUeT46fPW fsHiMxcXt/k+4H/bkW5nIDX8UQslX611LPJ3a2Tg9itVxKsd1VNReoEsKn27 28v9w6E/OfXRfbXZ661GMm40qbivy4+t568T5rqa7IeyxylFKVzgpP8ANn6O HTgcbyHtVl04L5nE8jXyJQFvSFfplgviK2WywFvl0nm4r2zz+W4SjlqcxEty UL14zIfDcVXWzd4EdfCPxfE+4fDcL9xg3jBwSDkGlzWHG4DxV1LBm0HSdl3l yt/afaePj4NmzKYVYVNoHVQqeewfPRP6z657rdxlCmu+u2U7MRkksqK+pTSW F05HzQ2+2cZW2U2VRhXlxbfN8nB5z9pyC+0vJtmrj/e1jHFavdlFDoHJP8da btX0A11O0dYmV7Vepi23cJy1edfTqrUlVUFh4pvR3Ct8iP0nY8/kZmN2A93H vZdkNiUD1gS9hW3YtlhbqxJVidfznxPbrD5HguBy+SuwbbfvHD1UhqqiK6lP 8jnIsqAU7j+Q1nkt5u3TK/3xThYq4wcYrW+uc8hvabVWxp9Mmpwc3PMnoXTG OZyfbXt7nc7jPyGZkLx2FWzqXsXc5NZ0fykoFCkEEkz6j+2FGbgPm9v8zXyB TcAoQbGZRrsFiO2jfUTocXnee7ZxMy3uThHr4qzJuursototasZVrW+k6B/M NznzdJ6c3ge3eX7bu5jh0fjA9NmVTbQWxwCqk/yVKQmnl69PDwMVm93Ks1Oz TXKajBwULa/Enzz8yQ2m3delQ1TUHKam5V2eYrlj5H697X7A5PuSr71rBhYG pC32KWZyPH001XUD46ifWz/a5vsbM3guTr5I1a60hQNxXqVR0dxu+RnZd7G7 juyXx+HVvT2U46moftoOikjT8Co0/Oef26wbeA7XvzOV/wDWS6x8sizy7KVR QGYHw12k/SSW/wBzKuW6jYor2aIU6U9S+L5mjsqFYtvKDk/XrnblrT4XI32F 2dX2/XZn3XJk5WVXWFKrp6I03PXrqepJGv0n1cTgUyeTzeV5i3H5P1QtOIhp UrRUjO+zzF9T/J1M+XxVq8N7f38kq+k91ORmoPDzZBZqf6Mgnm7dqs4b21ty akP3N2PfkKFGp32blrPT/btnyW+2crrXZmUrY0p4Sz4f6UsLkfVX6oRqrVeF Gt3NZbx575yzge7uCowudzlTLqZXH3SpUgREFrvtpAUkeUAdZys/JBUlWBDA 6EHoQRPxOlqhKEIxlPXhJZxjkc/ZKMpuUY6ctvGc8zQmhMiaEbAbE0JkTQhY kbEQQxEELEjYiCGJsQsSEWIIYiLAxIRYiw1iLAxoVYiw1iLAxIVYiwlirAxo VYiw1iLAxoVYqwlirAxoVYqwliLPNjQqxVhLFWBjQqxVhLFWBiQixVhLFWeb GhFirCWKsDGhFiLDWIsDGhFiCGsQQMSEE2JgTYhYkIJsTAmxAxo2JsTAmxCy o0JsTAmxCxGpSEpCn8tTq+C9weY7f41OMwcfFalCzb7UsLkudxJK2qPl4TlJ Ttraa7Y6bYqSznD7nIV2zrlqrk4vGMrsdRxXfvN8PxVnE4a0bLTYxyHVzcGt 8WVg4XUeI8sTivcLmuH4lOHw6MUUVq6rayWG3WxmcsWFoGurdOk5OUEtpt5a tVcXqlqfxkuv3jW6vjjFklpjpXwj2Opv7+5i/gR276GNXhilMbfWlgs2IAPE 2FdW29fLPXwXuXzfDYVfHvVVmUUgJSbdwdVHgm5T1A/DUTi5SPZ7aUXB1Rac tT/l3Kt3uFJTVkk0tK/j2Or5X3B57l8jHsv9JMfGtS9cNFYVO9bB19XzbmGo 8N08ncveHKd0rjJyFdNS4xcouOrqCX26lt7v4bek5+UUNrRBwcK4xcM6cLln mGW5ukpKVkmp41Z645HYdv8AuLzfA4iYGyvMxa+lS3bg6D+1XU/t+oMHuDv/ AJ3uClsSxkxMRv3044I3j4WOxJP06CcrKFbPbKz2+qOvOc4698dy/wDVf6/V 7JacYxnp2O7473U53ExlxsyijOCrtFlgZXI8POVOjfpPFz/uJzfO4j4G2vDx LABZXSDucf2s7E9PoBORlJHY7WM/YqoqSefn45Fe83LhodsnFrHy88ztOD9y +c4bDrwLK6s2ilQlJt3B1UdAu5T1A/DUTw9xd9c33HX9rey42FqCcagEBtOo 9RmJLafDw+U5mUq2e2VntVUVPOc4698Ee6vdfqdknHGMfDsdRyXfnMcnwn+A toxqsPZXXrSlgfbSVKjVrGH/AEj8J6OI9ye4OHwKeOprxr6aF2VNejlgo8F1 rsTw+k4+Uz2e3cNDqi46tWP3dzLdXqWtWS1Y05/b2NWO9rtZYdzuSzMfEknU mZlKfQeJoTQmRNCRmNiaEyJoQsSNiIIYiCFiRsRBDEQQsSNiIIYiCBiQixFh rEWBjQqxFhrEWBiQqxFhrEWBjQqxFhrEWBjQqxVhLFWBjQqxVhLFWebGhFir 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 Yob5JBsf2C86SSiVCSfy02iKChYSTK6CptYGGaaqaZRjNxSm6EMd3cjIp/ss LaZGTUrzCVWhPpVat2xhmaJbdJ3SanmqnDKmeMtt3Lp9M5zCPUP3akaH70Pe EgC0TIsrOKyH00Lc8lsZWSuLr8YmolXTd5xn0twvevoHKvumfAxYKP2A1OtY gt5kHW4hSgZ6so76HAq2KNqvusbhMOX+gIczb2qzocIqcy2n5twAaILCTFr9 JMl8gXJk3ritbYxCzbvsRd5ryMK5TwzLId7n3haoeW8N6ODr8QRWRgpZh5cE TkSCp8qrmKrG/oXqdI9Jr1uIY0z3lWQp3TZnqpOn6+pKKgPxgBt2Tq8zduaY mj1tZ1gJu4cgtmJKhqSyO3byzySdNoc+9X7ifuhcN2ZLe7rsjANYOoyjO0/k +sfiVqyUcKdMo0pJIKj5Ms00VYOMthXZYnswHvQHILKDf//v/CX6EpK+lMoX W522rQMtGvDxWlsCV25ewAK4svwclNcU8k7hGdeU0Atnj/tdZyd0Ox0+p+XA xYsXX3rppV/7rf+hXqlSxZmbFju3zAuex83s6SsX9yvHOD4z6GgknsAviTjg TZ20ctnoa6++GUsu5hfWVPE0Mo5Tv09roiaMLhJrdc5p1qTuSzK4cZ6w+RS0 IFE2XAABbt/TOsk96BxYSiejPB07TlYlbYkpPj3G3RpKtfdH0fRAsJNRyvqT rm0/Morm+rUDCSh7cOD4PfbSt771bxOLG8H0Ip/E8P+q3zHVBpNhcmdsD5hE mAll1DdVOhP5SSl2m8SMB/W7mT18ocoHGKR4JnErxcadzLQe7NFHcYz3NR1o BTOrufWL9Vo7aqVx6d6C40jRzil1qmJvvvkmAj+dX+jgk42ngmPrCO1cU/NU Z3XN3IBE/uYSNLHrUamqocyGattAf+UnFgnQVFh2ZuhyrtPrddFD0ahw6say y8d1wgY0DaOeutpOKd5LNkYo/IPv/olKaBYW/RY5bkjSbZWS60VuHWNyDgzN PLlND5CamdCqqKff+ha4+5AHcsXd5vzNcip6sdkn8szoombH2pGnmPg/8X/o MQU3b54T2ysqdeLLNlG49Ae0u45T1RblDjUkqRgbuQ+sMzuOgrx7rXG90cri 2PvqD32WZBa8j2ylAWZVSm70EKHwaN6ZsyS3UB4nxJP6i9FEPJtP5grxTA6u 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 hc7yXIIuGvi38vnkYNCIBnGPsRHl6nJ4OmtrPb585fFHr2wF0ODp/ERkORrE ZAoEM4vFHHwWOQHsg6/hNGM2u+0WwgLjEQpUuYFoNFtYIHEd+UHY5/TqYqty CFjEUs7UVR6L9e7OnWgUTY/UPXY3N0x7jH6pmJgOKtS3TeVLivIFJulEuri4 SvbtxkYezn/m8iMXHnkmlCjWu9jfmeW189V6h2lE/1GEx0vQ12iXVtBZMjkw /rAAqjsnkGl9FpqUu2wxRzwqv7Sxe9AmlZDkPdXklREnJx3dEpUpQGcs+dEj +PhhFoTAcHfEwyixh6NgJ7MQx73Il3PpNPsPrp3NLwYjuXxpK4V9D02O+mh8 DANnMqleqXi41xuhD2QKOZQrC1KQXKnKgBBVEm+UUvpCC3CJYum41RvIqasc COnHUgGEDN7buUuIVoAn+BcwGsPHgc5TYyC+gI8byKsLTLPG1HcPBNgtiENT 0mCv7GRrV27HqE9ylBl2lHMoHIUfV9CBAIhcBZH1lj6gHQLZPOOD7rhT7zaq g1YD2m63O/fu7bz//tX/36/+i3/zzV///re/hSi+C8KA6Ts83js42N8/LJfL 1VqjBRPA2dI3X71KwujMeO65oqJgOLsIWwPix6pnUlxzZEsQwQUDmaItkJGi VuqY3yrfi7NxHH7x+U+rwDXI/RiWZH3c7+BRxHskFbsHMlgORA85b3o4q1Fa KOazyXNnz0RSIO82n//cF3H3/cbv/Fq4D2tJ1IMxsneSo048xEJBhWmuCO2p LAT0TG9mtJ7RcHFz9fKlM2srS6dPn0KyjSe90lJmgItxQHatJPfR8U4ikY5H ivKZTQdgEZ9/4bmNzY10JlMoLFjdHrIB4Qzoh16FdraLNS9H6wvs3Pqg1zl8 47VXDw7q9+7t3969s7NXbrWC7cb+9es3Op0eX2buYZPqFjzo4KqFNaI2AceC YNDa46kU9lqzepSLYr0Ednb2qBWtLntYg6HQ/t4dij4SuqE5jCqghUiYqm9v LVSO7vWmkQbTFA7ToInG5GhB5MBMR5Xl9a3HP/VCavnU0sal0+c/cfHyJ9fP PXL59KlSsQTXgJWBqSgt5FFPWp0GS14+PGrWsZ6Ohv0OZigCCsUYh2duYaHZ G1187FPVNl4ZJVJherHQDra4twe03+xhw1cjqFgU5ViNmxvLyUIOvg0mBV6V 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 FA0niOMR4VRlbAorUep6+/xZStuRZRRI5ijJUqXYS2hSTCSfvvLU1tZlcsTb 7ZVKrdpr1SbNQiF6jnXd3a/e21vEoSBFVVVT2Qngeklpoapt2zecNCJXO872 DUa/olUWZXLmOhtXcqNfGfcb7ExkHpVhwSB3OuV0fFjMpmANuDGpJkWFC66F GEE/LI6Ok4N6Jh4sV48RXuA0f/DmB3/06vut5hHJaHJCtuuDNkUZRiRcnFpZ d5dzVWPdSNQwzgSFPzbHF9zI3d71ZJptaC6t7vMqIqwguAqMg3lRBWM8k9Rx meKpa3WpvGPpJhi9/S4SFS8sVUdYFwJc+JxpncuBSsgBV1JBCoHlKcmKoYWX m/o2wUyhFQB82qt1unjNVEgB76eK0ngYSMsQxB5WwppjYW6QzpJ0x0wyJaQI hpP2zvflg5VtOURXFVxV5eGN642n5JqCKwqfP7U+6bQqO7sAzI/3boUGjVCn +uHr3795sHdr58Pdwzv7h3cPKnu3d26+8vqfvPbmD54AppCKH+zdIbGVXpN4 X4fd1t69Wwc7rbu39+/c2t/bqRzs1q++e+/aB7ujfuzqQWe/NS13w9imlUH0 xkH7qBvaq41WV1eQ0ZQ+tDYrqqgpb/s02EJBxSAORqFPvIXjUHwQitV6VPN3 9jeCG+ekoBWVapm86YuXnmqPJ7VuJ07tNeyHbp/cuAFJoUAmYTmhQKFUev2t d4mB376zX1xc3oLjkJ52tE9ltSB1AalHHwkTsL9w7pFWd0A6Xq092DmqbW6e Q1NvHDdZOfBpxP6y+dhjj3/isAIOXYVzmCySQdTnUjxM4QXS1WDCsFPesqxo aJSZYsY7zXY+kQL1SMlgnlTuorTdZz//uZ393VqnWewXaB+OvkoJg3go2BwN juLT0y9+Mp7ZvLF74+j4gIYDkWF3WN0BwT2tdQGegcMWHqTdBnX58udfXlzd fPv9awQ20TAxEevVvRTh8yBJsVLxYGdYI8qA7vdUOSdAxbEE5kgxTFJxK5BM DaPEjXC2dFYK4YtbuRs3jwXPMyVe9gKx+X6Xvq+5TKZDiZr1s/1Ipt4bV9pE ZpL1MabY4YULp7jZUqE0aKktYjYW/cSVS+/frVn9VoIHavNNYgcaZiaVUAE5 6Y8C7jBN8qaNQH33DFMQZl+iE1rZIuTz0IIHHgU6F4X5ZiUJKfkpVXOsvogG slD5RjYA3ktTKYijknOglgCuGhlaJoEagNcQqVJSaOJRKUNH0USuUe8c7Veo xEd9InV8pm4vvjzrZS0fq/LxPYwf40ZndAwFhBojUa1EY20kWrPuTJa0A/MT 4TFcWl0FtKDaPEwlwUMlKAFjCoUvXjhD+Amtl1wjPC6L+dTh3Zugz0eVY2CI 2fAgMWyPKABeOSiERo9trVKFp3z37qBWI5xJTV2KqyTwzrQ7kViJSCH2A55p GE6r1lwsLD79iSf/1/+v/8vP/5U/c+6JK1/9qW/86E997cf/3E8//5XP363s Xd4+s7S0CDYRRCwZOVYoz0R2MrG+ua0mTJbbiwL8+FPPEjo7vPWhYiDIv6gM a9aFHPZ6rR7MFL/6jR8+Ptq7+vZrQWp6Hez30Dt37qEWovke17FOQv/0X37z 5r3j5eUNuF/lELIKHdZ6oFW6o2hnGEkvbOZXtx8798Tq5oWj5qjZp6tzgMJt +VgBr+J42gADRAih1W8tLK0eHJEFNqTiy9H+Pj4q7Sp1Igyz0ak2aYUGooSG MFbIhckUl1ZWt9vVBqYxCVz0yhMBkEXbauCueP3111Dl9vcqu3dvTnqtreWF lcVib9SrNeoQz97N3x3UW2S7fP6Lj22dXdvZ6x/Wx995+9ubZy+Hk3n0Uzls B/1Ll67Qr++9a7fVLW1GdcAisesETMNdEYlj0anNIBvUireyNeHmZ7e2Gj1i 2+zTaAcQT3R8dqO4uZR/7W1yKVDbojhI8BM261QQ6pcWct1xvB+ItXr4hVuF 2KB9cLOUjpWUFSpd4/qNu/ncCuVdmIDVpeLnPv/id966aSaQEl/YhGS0NMpH 1MzE7aNyPQZOwa7zqY4EB1UWNYe21EVr80OFVcL0nEbhWcP5szGwUFWwVNgr oqpTNo9imETDozGkHLdmhKFabq5vpZXCJ6fEtBODv6AXIqFYBuodpjMLzBtQ BNrPsruI0UPCFNgjPstEqaWRNY1TmNDechZh1MTAxPrF4MyrKbejYJlUajK+ QLXJYBBf7t4u9X7wummTWLlaedLCL3/tG6XS6umtC4srG5unyeFf+OC9d0l5 /8S5x86eOvfI+cun1lmL4kph8dHT51985pOr22dIezh1+hwp52jaS6Vlwvdn zp4vrvbPXyicOpU5ey777HPnXnrp8spK5N7Oq//V//sf/eHv/Ovv//Fvvf/W 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 DFUn8rlP5vOXI5FT/e5jsdCTmfizxczzpcLT+dRjscilyPRiaHxxM3s2Fz+T Dj2+ln9me2k9MjrN8UoWh85iJraYiedj06Vc7NzawoXtxUunlgcJSt/137n5 wcLm+taVC9T0fuLTTz/53FPRpei5K5t0UoxmYrn1xOJW5uzj58Of+exX4umw MliV/xoe9cpHd2+nqXQdxwrHpQHfsxmyEhwqDkV01kUeBVFVmEWmgtXtcn5V ylHxwJHEr9CwSb8E4Mrexn/VJNW6cYwCQG+6afb0oEib1DFNRJXjHo1RD4AK hnAAYniR2NJR7RDlmKIY/3/O/jNIsjW978Qy86Q556T35au6q3339XbuYAYz sAPMECRAgssgKYIrhrggGStxPyoUCpkP2g9SiLshcoldSrvL4MZSIASJBBYk gHEYe73t296Vr8qq9N6nfs/7Zp46VdV9ASnnTN+srKzMc97zPv7//B8jxAiA HkVwCYcVL5TEpAKn9gmtvE2xnaGh0uem88sKUKSz1R7aIqv16pMnT/gokCUy /DxgAI3FuERi+GlE3hJuy6ypoQUVq9SH+mM6SsKpbGcSaMKIHhhTi+h1gFzh /0QPDuq2Hcdza5YOgrSZgV+F9kkYHElNs8GCcFcizEwjIkW8sQGtyeNmvU5D M0gNIJroCd7XHg2L9fqDrS2e9CZRD4xgdqLeG5dbdP+EgF0f1jqQ4PrMOAYU SEWx0WYkNK4LauXcOlXHAKA/0umTQf3ylQt7h5WdQmlIDlPIK4k6q8DvxBki dyiRB5sbz0+iDwl1pFLHhBiYRAPFwhG6iTobnheZvaUVxmjmfvrhLa+d7Bs2 hOc9X4jSUgdSdzO6WyseAIMaTj67ff/hw42F7Py43S9u79MyW2/019aRynWa +Lqd2uWri3/lm9+8eX+HlSX2EWw6KRCZjV1OxGLgYJT/JBGR6jsUzptardqu b+Zi4b/xrW/SKFs62o0mzXBw/Nd+9ZceHdT88WzPmutZaW8kBeOVJ5I5nIQL 8Qu12HzFtNtmsG+bRSgwQrF9LyccmmTSIJ6AFB0xBTEUaiSSzXSKMaIVK3xk BPY8k72Jt2D49z3enbG3EvYXmGgJEY7Pu+edHPqNathsxiJYEJLnzT4TTCzS V1DrwqDgs+kSE85czlzavsGNDLuNepmpxPZOsf54t7VZKN/b2vv07t6nd376 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 ILW3u/d3/ME4Y5AEmCwFWHr5hOMK0hQygQJO98DuQa2NSImasRRtv/LqjaNb P2xvfxAJZO599hGFplgiDqR5p0yy6pwvNO/der99dLOy94l32KCTwBeJsYm3 dj4177y7c/snnsYj218dHt1tVHYHzUKvtg/1IkMDBwKPJomCNafcTUo/+Nnt XUAecL8TwoFXEkIEcrxeb7Xfo3LA5CdBs5AStCnyGyAUc3PwzDWXU2mrse8/ up+0hj478PGnHyeak1D5ob/3oPPg+8XH71PSSUdz4WB8cvDewZ2323sPYySL Yik4DqDwPrz92ejhd0YHD/317UCvZPYqneK2t1vxto/wcnHP3/34DsWG0SRI 7iRsMmuCLCGn0if05BXauhmgRW0TWwcOkggKSka60mMRa9zrxO3AfC69Nt4Z NHbLpUcgCBkWQI503DgcVffaG+93ix8Omw+rjCAnlZg4BxD70cGGv7EN2UGr NQlfej6QXoDXrNuz9h6VB3sfkmCAJSYQzjzcbO5isRjuAxaqvC/DKWA3oCQj iLAxrHUBK80Qc5luRPmREqhACyZAz6hYhjjvDlMnuzF6bVuNNGz21UJ//2F6 YeWVtXkKEbDkjrqT/ULl2qULb15dn4yif/Zg8NkBqvsw7Gn99MMH+zX73u2K MTYur0Tb7cMx7SrhfGVzIxHxRNOh0kbgD9//Uf5c+OdXF64DuGpWqq39cnnr j97b9HSqNxYC3tZGr1EslQT+sAPPdoSm0JUasyACjReeI2sTOoDPMLN0+Zv/ gPFRNqwDS8nRUjIbbjArLnD+S9e/9VfX/9LfzL/5ixe/8q3hsJLMeXda9VFm dWkp9vyXXoin5vb395uDhpVIEF4aX//SmxSfPn33vY++9z7EQfagdvN73+3v Fn3NHz659aNgv50iYVVvDA/vHXzy7w5v/3558yaOok0ZrLO/+8kfFW79cWPj c7vdffv9RwwtePLgw0D/8eFn/+Gnf/jflTceD1vD0MrV/cakYwhABDr0w71C OL5YoUOiXwxEk5WBdWcHQbQZ/0uiggxMk9gPaiD61rtDM4yupa6K5HnwNXvk 3kfd51fyo8pms3Pw5i/+yg8/2Xs+4llZXHn86eOdjzaiqex+vzAofJ7b+MhX +YPH7//p4cZONjVnwkr28NNRfT8yaoe6D+2kGUwma01gJ55mYc8q78Ua+3jq 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 K8UgXJbCBaAIC3DeNHMBaRLUNG0GZw/9aU8VLbFBWr847zlepRNKwf0hp3aG VDqQMeFLO36i2kine/3UBeqPcm/06XOdzheeJTlfJdz6+fFedH/UKaXjvruy XrNvcb7u6V96qlamTsX9J2fP1r379XO9a0/qgqlWxb0XU60HfM5OSQRPa5aZ +GkhdBNwOFd96nxO7Ulns50SPP2j2Dm91OrrECRHls6uqk6EishJZxS/V5RA anyNJmvTVCbOxT5z/SnF4dgpGlLnTzTNsVheWSvnnh4z6Cn2PdfOcC7b2bv6 +xzFML0x6gr1dX7BQ5+3ozB44qy+NqpkU2bOvqQr1bcrvagyb7J2Evjpd4pY 4qMSzmr5dA61f6eHyqQI65h+4hzOjZneG+1znXzoC3FtGDkZuUx1InrbaBIR fWP0O+X+zYpR7qXQSlT+Rom5s4Hcz/WW1/tDXp/tTn22euX4P+fsPlP3j45d UwGBfJT+RvxFKSpKkkCCcv1cICOue/0Xe67tvLN15FvUbRW9yL9K+cjMJL1W 3AjZv8IKJXpE7q/kcE4YLnfl7sRquIVMLYtmGtdPRHRVPuiphyNgjsjpDxNx 4vIVjZT+Vx9qiVgonF7V+YiMCf+gkCtqclWpDqtDS6NMmBN6SHni/Cs3Qlh6 FE+zTOcRemt9p/Q+lr4rabpXBDraw3RfsKN4HDnRf+z8KFegJU0tot4iX/w4 9QnOhp6Kk/LQnNgaRh/F5UpkIU+URJHWmk4vIPEoG10rIn15T3toqT6xRWY/ an5c/SstBuoSTlyjoyD0yjjqSLVmq5qzUjTuRZdcnfQLHm/NU+fl3khuwZt+ jssv1fvGuSl68U8xoOk1dJ+nPiX3vTi1xU/d6NlePL777jecfe6cj/Mrvt2h tJoRW033CTKiNqle1+nmkz+U8tmf85itueMXyGTEpwnY8Sqd+hOtbnhMpVqR JTsPreWP0zmKB0/+AeoA8k82FXSskhSQoE5IUxVc1DmE6lt2jPtf+RGgBEE7 EiXwwSnTl+LMk9BXrY++ZWrYuD4bfR6SBZk93DrVvYGmKmS2Labm8QsFzy20 znZx31e+XUaKTr9dsd+qGUv6obeg4ycIw7mKE8QxEIY9ZRlmh7ACSOFMFMxT j+mGnm1Q+TJ18qe0jD49Jb363qk3CiXzVPDg3aUoQK1DlJ448qRCFPGDKzbW a6npsOR7tfE+GahMNa6oP/IeQuorkBLZZ4710ndL8di7QIxyzuot0209GzYm hm627bg75M/0IW4OSYzZ8y+WMX3mJ9+jsuuuF7kuLXXCXy9xjQihtg1yqmL2 ZKdpHjS5VVPH+fhD+IX7A8+sjFr3mX3TVHCikrR+kTLN6UMt3dSncERutuYz 4zY1F0rYptMWRVZkVg4ZLq3gwNAp0+oc2lZrrfrUhyIaVHtJjx3QrLBK1vQc HgHrQpsiIaC6u47ouxMDjqTp75hKgJKBYy9o5l7qrfYFj7OK2dHfjsJ2PkQQ Huo2kX2SEWyS8ztxkkLxPnsIeY/KCnJQ7HOenFoa544eeyCu0NnZu+6T0eej zmPq8U59J+XmiX+LsCungkqaPkCDOlfh3rhPfXF6hmrV3Kt6avO5z82970/d IPnVyZtwymaeErOnydX0TM7I2/SrnD/RT6bKVPEazmzdNATiXHDR3EERa6Ui B3fq7cR+cX/4icvU9C/aaZW5I0rsZpc6k6hjXaY/dHqXXQ6t48Tp9dTnJjyI kssVikQpcij3R2FWyakrvT47BAislBm/lUDt5KFeZPvJDtReqL7jjioX11tR xCq157J1jmFxruSsTIvCmj2ce/PF8qYv8uy/+oTcjtNUMp2PUwIud1ctqTpv 5TqLKtJ3WW64WibRo6cOZ++e2sSiQRzHUl3h2f3qViLu++oWAE5Ge7maBlNR acrDvbmdnaRs5vS7nDe4L9S9qs7puRf2rF774vV3S87/H7fsz72n+g3OHZze OyWB+lRlfdR2PlZewlg9DVOdzz91XadW++xWdJ/YKZE7e5nHi+DKYzk6wp0s EX9FiZwkCiguq/jcEdSzgnDqFflbJ4UzE7nZEjmR+XRllOgpdnxabUQWoSOR EfJ4qH7KyEKdIIw2akCMSobKRhdaAAOCRio22BlpC4ZWVpIbUpCgSsRBLZmD gdwcwzG0mERmsPDzQUCQhHUPyk3qmoosGKqBgKZWhdgLmn8ZTI11bsPeR9U6 PGHgMEiaCQBFSVrKPC7FTcchZOlSlpKrm5pi3aqlKMUlay3yKT4DV8QhE7Go 8lBIwsTTbyFDkpkvJaBBTBSFFTH9BsAuWFu6uGncCKkZkZRSrr5UCNlPiooP 3xLaFwWeoAJkDYZgfKllgaqC1BrGICrFUQ6f3wYCANt0h8mF4LuEtVNOXXvU mk4X+l4gTHC1crAelKI4pFdgaMPiNpw0jQBoGxm6Qh7XhOJZTmwAWkPm1/GE dtIJjG/UMQcgpiTS90CEQWxvwQwlXVK01qlSEQdgJa6Zg3vAx/D9FOmYr80B tI16LC/KtBUJv6YeqfZLpSZHmy+KHuo0wFRidtgaA4pkwMSgPlLYcOqYrKQa WyvTfnzcXBncK+MshZXIxPixmz2smMwz1P6h3Cl1v47dxakTK7TQguAOBWXk p4xD4c+5aLwZnI8+uWsugIPWIWElFgpu8kUyW1jUgTjrshkoW/OjeJMQ7DGY LRznoOEIojMGNMErSNW/ZwRAq0INA48ipDQcZDCV3EnqYxoCqEqWGvwyda04 dfcBkeIQKB87ZDyMe70QUobYTdDFUD+UkeEALfB+6WDpi0C51ZVjkZx9fBZD IDvPlWdXRnOq9qYK7+R/VBZLqh8nzdrUjmltpP9CxQHS0a+yKOJ0uV1fYUhW 7NGiQGWO+uxHuTlTD2f6FeqSdAAtn+DSS3yXJldWof6x8dHUxVrvuk+fH3Vy VRMYi9TPXG0ZUacSWTorJQG2Hi8GusDPzGVEEp5OE+IT0GQCKONFytx6cqRU hyV4A9Yhq/O0Q3v7Ok/opEnl/GGZmZlWvarO2jp24ylmcFppPGHDvsBW/LmG 1H3jTq2bYwadlXSb91PWjF891Sy7Xz9h32Y/KIYBCXYEXqcOnc0CyqqJtwFe AyUDlkc/O+h2FWNKbKBTkfr5NAZ92q136nWnnqhtKryl+nCeo+fQN/pfUT9S tZvGeO7b51haR/B0uuaZD2d13Bv01DY9K3hsHT5XJR4ljnS+1dkizk06Fj9d 8tAZeUWw8QVnpRMpAvzQU3BUyUsyF7M0jPu0RV8pp9rRJk7uVAfS6vz1vOip HCq3EWyEKG8h7xRXkr5yvw4jJcKehpRiQ3juGHzAHdK8K7yUtOLA04rug3VW Jn1jWEAjCQTl5AEWQh9ATJxt55arU+vgKCa35+9s8VPumfv1Uxvd/aNTYjlV dDn71fpWokWmD1k3wCDKIcJoTnMTs9Ko7HSxG87nuLXeKdl7lhy6z0Hw3CqB oW+EDC5jxxNaM5qUxhQOYGPQIPAjLL4yYINdqPA5nJ3IA7l+eUWPpuIQXY5N mv2oohuVS3f9KxWrWQFGP9HFGPVEBtYQ98n1i4eFkZMJSGrSgIx51GZHZVNU U5u65ultFnsqiGGXeBxnQR3wis4uTLXUDG4gZ3nikMgTjS0Ogo4kZeEFmD/F msgGVw8HzCG7Z2ZIRZqmNRbR+WK1ZiU7nb3Uuk3Hddp0ajuprZwj1VNDOrPq 02S3OFJArKbDt/R0dSV4qkV1msoSzSi6S9Vw8DLVKAJgj5gsKe/Id81yp2Lr lHNP3y0HXp1+Im244IWYLAzLrTroi4MqJwBva0gOEGs0yzHUDSXNASl4H8dR pZrP2hBZMZ1KEICE0tzK0vKvowpdpn1qzE+9cna7u19x3qzvr/tH/Ypcsnrw jVK8YbfLflUpCpkzJvMXZGPLuFjeMfVx1F+oxOPscVYLnD2NU+9x7zqdtZYC Gzua8RCMjYBXw2S2pw0JpwgbKHpwfLD9y8AJyeDrJL5z6FdwPJwDN9V5LsOG aeLnjrv+5UfmO+iDRhn3c7YJllUAZCaST1gizpm0OasBHu66rkiBsgmyFk6W Uj95lol3ki7amDgR56k/d34Ux10ooWSCjkrwKOWnKhh6V+mldO6xnJJL3rTn IN+i4YPSECT/snjayum6iqSuhZt9qqpEobhqjG7B0/lPxzjob5dPUf6tY+v0 jAse5Cr179Vp67Gd0hwx0/Cn/6snhOjkiuOciLlUD5nEoh56aAkjbBmlq48I dEXRCIcN+YnAZ1XLuqt+MDtPsbf605yBJGoey1SvuVby2Is+K0unhMrZ8U4N RifY9b/aRJ26U3yfXKdKKimjJ5JGXMeZ816J7eS5rhxIcCfyqqrzjvC4r879 4vHJaGE989XOG/Tqa03qXJHee05cQGhAeCkze5kIq564Dxm9qA441JznPJlB oUisSHjh/Ch5dXWQaHCe80SmxcgQGLr/SYkoG6dzojJ/iqnGMntO+vjFMUUr SaArxma2KLpuruIrXbyeZekdeVOugmst9BqIGjt5TMVNZZZ1fVkbebEl0wKr lg1tTfUeRV2hQrgCNhcqQsqWAGsZPKRSlzp7OSuqyI/6uU5vyv1Wb1A3Xh6O xXO23fSGTcerTy9kluOeFmykAKVMn8rzkmnRYAU5B4mLlYXRaDzRnurQdTo9 YExZXxmMrA/9nN4C7qvcWpoN1O2n3sfhBtYojIdCNShfQ5+qW33ItaukrkD9 JKo4fr++yU+VpVMbWr/t1Juf+or7D527L6VU9ZCbJUz6EmfrYp3wYIoIyomp Cp7konSFU1+K1u9PlSL3i865uS/H0e/TZVHLLiVQya8xmREyHQi4mcfMhFfa bJmcIx0eTOqhD4Nj0IF2h7ae44NXOPpgydXBTeFwfqTjQR/0DTv/ypNGRR+d ZpXD+bHFuL96rVWvc6eFO4M0EA6vSo066W6tI0S61I1yYaBFDKYTnty3x1kU vY9P/ets7lN/wo+i77TvL061+CTKCEwtiT4PnX+f6m+iJlGSJAynb1JvoHNH JcNUBVm2t1IZOlQgJyE5aQFjyp6UNqFZhdktbHrfzE5ABE2fLZ+vUyxyjicf cqUu90A2zcyXG9GZw7RE9S8HM8roZ+UJd905mKuqj363xTRxfXTUwR3ST6ol SPUP65WjRrXI0aqX9R11drmyw9OHI1rOvpxqxhn8+qwsOStw6leOnTklBm7x e6p8On+ob9z0zFgmNWvacaXE/ihDp89Zy5u7XOfYK7eMOWLmPlu3P+Vcjk5a ksmEw1FaGehZxvjwnFZVaRfo0utAa5+MAR4wX5wX+ZVYJwE/kdtUxkoOSZE9 5XAu89SWprVEH/Q5cDjP2/Uavej8S0MqOXvyKeRskTpRPeoxDW20ZXaL0Cm1 qpfMeeg/O7Uv/9wf+ROpBKiH81Huv5I3uGpfGsuvvQIZckotQfrSpSfuqQ/t McIroJ9oVLT0pLse7j+UeWLq0Ww26djnwRN+1DktdZY6jzLNpsjHgk7j5sLB rM6Fe8SPqFW4Uzh4Is/Rl+oJWhdtx8ETDtgQ9EEtQB/S0cqPFB9wY/r078pw Uxm7Q2llFtNjLvTlcBF6fZyVd8qD+kbOrPTUXX+qonyWID31dVUKVo0eMvJy GqkrQPb04fyVVgcafaJkS1ZNDJ2ImeT99XK6TkkrymNP9dRz94/PUgrOaeh6 gz6kDCMpEp3aZhllnjs5TpaUdknlJtNZJvxuUttwHdK7pVytaapDQ2rUWmu5 PHvQ9KQPIexwPRfuTzEXPqJJnvOv4reSac+CzZRBF8oxkSWifuVjHDDTldQw Hqo38GHQ9gW+UZOu8tqsqUHaFqUcQrOmghlIHlA38sl4mIHU7o+TGbJqquLI UNNQKCkUzgbEUsMQExf5jQmDDWaDeg4zOiwsHfkSmrLppaZtDyegF6B1iQbe CdzsXHkP0oAR3ZByMI9qApMHNA0dOXwMGaWNvd/xDjoeXocnptfigBSlXa1x 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 Ezi7+NNX9N+qtZuu4ExPO+vJG7RSVwJ/rMulm3q2yM7ncyGaMljprGNyS+e5 g4p2btmzbrdbSPTJHN9f1/NpnOJY+lk2zlnJU6tx9nP0K6c+/OyPx69wo0mQ MGAYNKw+Mc3ooZxqd/ZL/WbmT8pbtUGYuU+q4+547+rn7hqr0hvTmoZ7f7u3 u7N13GbEMXrOdzl7XcEtBKBNklNLrHzjSc7gZ90S91JOOSFnf6iL7NrJ1DbP Hfk4toJP1s+nnsAUSa/WThcMdEOgKxt+SvBOGbdTpkOfoeMaOCcsd8JVW3Pf 7+kSYfVnm0A/0efp7DznnJ24+Gz629lJp/aTe/s65z9dZLWA2vQ5X6fviy5U aNYP0qqKyUcVgDTBlnJNdVytP1PCBFU5cD7nqWJzdss9VRTdgDv3czGxen10 +DMbeqH2kOqsVf/qJ7rH7Vnf+NTvdb/f/QbJC1KOU0lLKTurjmvVxyvaULFB qzYxNV7mKdA490mcUgnuZdJl3BMXdjKj6rxZ7swMreuO63Qk4Ng9LZZSc58x eCoBUTdvdh5PXSPnhN3SLnvl5F/NRO4pHo5b6tyn7Uig6C1t5bRAzmyds4/P LtQXLJ1bVM6evH7F0Ueyc9RD/9WUfld1zh43eehulhl7haam15rlC07MLUin TskRDPcFnnqR2zddDVc1RSVFhZnXeehbzKlPF9lJB82eaBLlZ+3+p67wU+VE v3N6y9Tz48zcF0ybUQt09ttPfa/z49kneoWleY+pTEojU0+TM0HAVClYn5Vz O+TEvvjjzv72lNoTA+J40i7Vq69E/3t8B57xzBE8fYf4E8niz5qj3efg3hxu GXPfhulX60yAvqGaL1rlMJ/yTrXFn7UOsl46C+q0885O0r2h3X8+zUYofSHn 4Prss+f/rO1+ShE4b9P0E88SpxMRppqb8Re/v84tc05b2yjnjjs31Lmt+n6J w+1Kn0xJWGf61PmV/LlWXn+euXPurHvrf8GFnPrVqbt5doX/4h916p3OHT/7 CeLT6WkqOrKdbRinFq3vmv5DzJ9fJlNSgoLdyk8PkpdeKKmK6G5BrQkEoCJU TNQ1oMOQMW6S44de0svsX+bW9QN6kMUxW652RDERgtqEsGgadQgaFhGARsZr CE0dpTN9HgBHhfGGO8JHCWcPs0q7kxHda0M4Cn0wL84Gh7imiYj74N767ufw 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 uoFxz5LpATIMImz6wyZ1hoY/FF87d/nC8tIkPRlU29nEcnve/J9+718Fh8GD Rv/z7crdnaIdsROJKIsbTiZr5Se0y/ElqnVIingk+EKj3pLdt6ygL5LuR5dr kfMFc3nHyG4FkoqURuleTZQuqSrJPw8nUI8GxxRTVPbKT7YWT4lUJH0weiS0 mgCh51mjDiXnrRwtvdG4RUSTHAOSz8OW3e6MGQ3cPUzVD8YH1fbcxeC3/noj kd5s1AbdTooosXgYDozrnbJZbnSAoWdyV1596/OHW5/v3M9l7QsxXy+5bDcC uV7H8NbRYAfvv5P31KMX18cvvDSctCK2zwoYCcP+8E/+eMnfWY2PGrWWdf1i MxqP9o0M5Uh7vNurH9zZW4j7w/4QoEOS6ZxwJJeZWKG2wPOVdpco9Fg/43VQ aVGes7J2Ku0h5N8qPa1R+dp/0iB7GVCt01QyvJeXVLVWpE1q/7rwIO7AtKtZ ouIAODXiXo2P4tcBy4xlormlcrNTaY+PaiDmBBjMXFBaCZknSmcEeT71hXom rAB3ybfX28NOb0gPXbPdbbSagnIjehd3LEzS2CSDYPisoNltdYbt0UJq4dGd TcI8psV6QlZz4G0P8SmjxosvvMxXxGNpRoxgF5gKjm3gu4PeuM8T4mzZWhDa DnskHkgMglwiFqr2uqVepzQaVn3ethka2eZkLhHmWM4n1pdzV9YWrp5furK2 dHFtPmLa8VQcGG+7x4Tn5tHh4UGhQKGeCwmaVqlcxcJ0Oj0qGa1mrUPGsNNo 1atk98DTIJ1oAVwaiiBAm7DbaowMaVah/Z+O1VQaUatA8TFmbLtSuxDDLOl3 5XOizDB7PrIkdHIBX9ajcSwzhBIrHhbsaJhJGHgddj62nF9LJhY8c6nN2x+t pryZTGQuG0uHPLFhu779ZP/+k0mTeZDEiMGY4YtQMlZDGyd+sBaJQ3+q5Ikf TmJHI7MyCLQpHisViv8tCniWc3KeON0H09+o7SMK1tU5ddLFenp7OC0UpF1D iDa7p3QUKBQ66Mnr133nL/fI1GHf+mPLG8rFEpQBCOZsw24SPbOidixqR3ce POqUy+vLy72rz/uNiDHqUa+xguHtjz4c1g4vvvFGb/E82QPOzfRbvVr17k9+ tBSc5ENeWlo86+cm6TzNGzLO0fS1y5X9mw/z9iBu2uSjpRc6Yvtz2VE40hds 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 yD+QPyGLINtkmWWQKFFsJK12Wi3Jbs2tbg3dXV0jiywOReb3nXPf5eMjqwdD WoSWJRb5+IZ773fP/J3C/b37+dHmC88XS02GqlKYtdp1urR2Lj9Vfem3ur/3 yh4VkMVGEZZaeJBr1aPr10Y3blxstxrPv9CjSSwZeSQTFEvDW5/cuP3urzUb lc/vr1/eyT19iYJ/lUmt1bc3Lxzc+/zW3Y9PMVi+8vK03hQfe6M8o3V3szZb L5eb6wf7n332/lvtjeIGmybsRxub1noSp6lMHTr7yFxe9fJweVrDT+biHFkn Sy8OaRg6i0GEefB34e+IutQkJsfNvc4Lsx9P5FdJJkJEB+E+Xah64MPppOXn Rz80LyMujnLh+ef437OWL8VXktwsMXwNlDkCNtIypbfAn0OgWTVFOVK62q3m FsQPm5s7O90nLj958fJTFy6qLySujq32Bt/ClUKfJrJD6CWAOX/r7uHb792+ eu2d/7zyxqs/ff3ffvr6qz+78tZHdz/89C4+xhNcK/gaSImsN6vNjip6EFzw t8HPrdtXaFBtichSU/aQ0vasVFTt2UWBKB1YUhrL6GxCLikgVGIXT8iWg3DH 9UoN1Ukfdanc2d7uPvkU1QDE9RCKih8XK3pixRsta3auygWCASl7ttyjrHOX vTgxUtIuuklW4MGmMdkzU45NOw/7R4CZXUKpQARmjGI9WQkL23MadWnoqY03 CBHxtYqa8YIUjg9G+7uV+3v9sx4bTbnaxdNyMoSB4qRU71x49jfGO93eRuOg P6znK6OjPiUgsF69/c//eKl31G3Uay/9er/ZLI0m9HGlyrq3t3ft/euX1gsX ZzlYA2ovPofnk6rHETnkFcI0zfduvH1zb/83v/GHm5efZuF3c9XGNNfJl+ER aJD5s3u/99FHhf7gArJuayu3vUMBrJpKg2uC6iQ1KM9Oy1aP7qq4/WM+Dqnb pg6GN0rBSScHpda/UgPndp0h55HtOjs4ojNMWozshTk0dEW8pWVdYnk60ILC JPZ+q4khnmZl10opKXzzj76JyEMuEDJVcxlJE9iReT8iybPRrHbaja3tdndn 6xJ9di9SeLa1093s4sXfhCqyU220EETIjXG+cXC69un9wXs39669c+u/r737 2uu/+K8rv/yPNz76+ZvvvfXOxx/cvrd7CPEX5jktEDuE/PCmVCGzoz7ByitU nYquMRGfJO+t8kiymXAjbOGe3pzkkSpq4dkhlKKKMrlUQclUtxZ16qD0G36F Mdk6vAi7IdK42Mb2VqfbhbEcxxkLG6Ub4U2ghFAkMcT5KvdhNnGWtfF9tN3e M3fK3B5IAuLntXIO4fK0DzNBXfwq8GiaMzOt3BikDZy6pdWyjnAsuZLoa2hu oslFF+j1Rnu763t708GxGqfVL661O+MqWSRjskSoUcb/xuMz9+vMBVpPsQAP 353X/uVrMBbgD/vKi5PuNlyqDQxkml4dnt688j9btWmrvDbe6zVbTH/n8rDQ PeuXT4428ere+zh/fLRVqeXu743f/+X0xqfjd98b/eLtw5+/sX/1+tnNj3cm p89UIfbJT7e38ts7lLyL3Lci4snKjJoaUSFlXjYLKSGVyCyTIQ+XdYmXZa6X PIZdl3Gi2J2ZXRdkYMaum6e0JeZI2MR9D3C3gVGQyNb5i+9+73D/HrlaTz3Z xYklZzBlGNU6vWZwgBCMVsIjNCQKyqlBR5U+gAWYgvOoZ5BQ9mhEhRwZDD/s 1Qipk44Fs7P5O1FnjZF/pvNY3Q8LR9nVbjfXrQOz02Xr/mInPX6kFBDFfdUM R4azZZgXRLvrjS+S8VaEEqoBOOVz6EI13hjtrHrYTtdx4pVLpEr0YeODeJDN vkYZCpUV5DaJtJxEUE6rhyL2JkoQtYPUz42FVFqBDZ/sseQV0Ghb2ciclXL3 mxXiTTAYWfji/LWgyYgRZv6hH+CzAjO4a6vaCfxsdh7U9+Q8bqYHswHfA59H bEeBOGQbpUsBmaaFEsxqdYy02x8cv/m/T9/86N7dDyAsq33jjyuvfH3UGdIN bzrsbIxHgGs2gUwuPypPm532zSvXX/2Hf/p68+iVYvmdzz7J/fmfFV/5g8YB XNDjHvT3N/f/9e//7vln85VZ78Kgsl9uV1548fTTo9rkg+NZDdVhY3pEmhmN 6BAGlRkFkVuQWFfhOFCrSjhEqAyFv+zgbqlV+OrL+d/+ndNKA74APKH0eG2e URx8lIacD7nWT6rhZnoiFOmzh9dh5nnyFEgSL6ydiL1c6wvZla74ee1s4lNR zqjDIcyXO7Hi1VMaRzwg6cfg1mOwCrkHb0zKh74CQjNWwtdiV7YVxcHGdzDL fftb3xkcHTSKay880b10Ae8xwzSGmUFF4EoxIQuSZtO0koHVS1WkHx63QBbL 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 gH4SGz0znOmHgH4S/w/qvd6ZKZj4ZQAAAABJRU5ErkJggqwtAABEAGQAAAAA AAAACAAAAAAAAAAAAAAAAADgEOAQ/AI9AgAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAADwAE8GQAAACyBArwCAAAAAUEAAAACgAAUwAL8EAAAAAE QQUAAAAFwQgAAAAGAQIAAAD/AQAACACBwxoAAABwADEAYwAAACgAUABoAG8A dABvAGcAcgBhAHAAaAApAAAAAAAQ8AQAAAAEAACAUgAH8PQsAAAFBfFE6QO7 Pblto/F5vkWr2DL/ANAsAAABAAAApg8CAAAA3gqgRh3wyCwAAPFE6QO7Pblt o/F5vkWr2DL//9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBQYFBAYGBQYH BwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8t MC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgo KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAClANwDASIA AhEBAxEB/8QAHQAAAgIDAQEBAAAAAAAAAAAABQYEBwADCAIBCf/EAEkQAAIB AgQDBgIGBgcHAwUAAAECAwQRAAUSIQYxQQcTIlFhcTKBFCNCkaGxFTNSwdHh CCQ0YmOy8BY1U3JzkqIlgsImQ4PS4v/EABoBAAIDAQEAAAAAAAAAAAAAAAID AQQFAAb/xAAtEQACAgEDAwIEBgMAAAAAAAABAgARAwQSIRMxQSJRcYGx8AUy M5HB0RRh4f/aAAwDAQACEQMRAD8A5j7sPHHsnwjkox8EKAnwi/rjfTR953Vw SoQXIwWqsoSnoopzKztIRYAbAEXwBYDiRAXdr+yv3YxEXWAVXmOmGGoyamGk LUNGxF7MLjAyoyt47kSo6KQSRsR8scGBnQLILSNbzON9MiuhBtz5kXtjRJ+s b3OJFGbKb+eDnTcKSEDZ3dr/ALNhjw1HudLAD+9iSoY8lY+vLG4Qs0ZI2Plg bkcwnlHD9GXimkqoqxCT4IxYA+v8MPL5HlYqaJBl1JcoS31S79N9sI3B0TnO JCq+NY7AEebD+GLNJvmKj/hwj8TilqGIarljF2gClyjLzXVcjUFG0dpCqGBb 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 3bm9s3MbyXy8t4drsnzn7s6N13auvX37g3f27l6rlw8OD8lC263Wqp3B5Gd+ /s9+5od/9PkXP/vpF184t7l6dnP58rltEihsDkl7mApuha1jhDSQn8mSCIRP VSodZI+TCXGi29Qgrb61dTqGjau6F4W+IuH+pD+CP8RyKvH1v/3f/R/jC9ke uVKTVDHar+2+Uq8cb6xfBtTjoWCdRJ8l8yWzmQkx9gnQ7hhhyaXxwenye59b jPz314bT+sGPf/781uMZHBG/8+70B0fFdm41Pq40u7jayMaiGBmld1AJp+16 JbV6ZnVl+XB/l3ETGLHm42NA9UuZeC2Uw3N/8+pbuUw2kswnA+ON5LhTPQR5 CioZaCFcEnSrvMMAhVxR2xncwU9w7E6i+Uj7TCnaBOkTTwN2WMzlqgd73XE6 tXFhHKzkQtdqe7VHHvlJiiz94Lu/dPv1d3tLTzdj68TiYsNmanEtvLi+s3+w SAM2GhkGxxvreALxdJcGoQyZETff+lYmvzQWp0vh7k2Ge2sLoX7jsKUMfRV7 1AJYvxUh0jCusBbDKRDv7OK1jcLh0T7t/KbTTKbXvZeohGJn890ckeTbvXht sEltw8Xge/FJLxHsVqrHRNzRmeAOgJ4i8UIgnml0iPi1P/nEdjZT+PYP7kWz l1qBHvljPK+99w4QPMjO9UgOJ1MB8FnD5mPnNvbvXJeolrsgXQdXRZ+3QGgh k6aeIFZOernw+ntvF4PTwSQTHFLesdfCqZssNqqNEhQ0vhVfvHj1w/2kyngm muD/UrFJa68URMEkepwuLa+srC0fHuw++8zTr/zgBx/01lEY8Eup4AO1ToOj d19/tUDaRLIEYyIfBj96gHw6TRSR2FirVhUWTQ4F1VzCFMWlVq4chjMlyRYh V4D+zIrhw19GA/x/SBJMJdzzuJ7VloOEP5wUSnJ3NZoCKkCYFBomEDyKAJCY knGSrvZjJJgCBEcj6oT3rpQ+ff7lr99p7d779rfTwVAn1u3VdnqDJUi5R6GC Xgculge0NCXNhUQPQZSUNtOD3VPIoAc2Bm3zoFyjioEyUzDfKAKCrghCazzI ZhbIbJS4nIbAlAgdRSjmM595mSp8+McU2gYJ1zlGVqYzJXQ2s4aFAHIHXnqG QMaAtUl3ZMmC03Yt2jg4s5D5V2/u5YqLgHXApFV7kduV8CC28NRzzy0tl3KF ErF81WI1hJAASvia0vjVM+1WA7YhJ7F5BhFFiJI+rRhjyfrxoeV94v6dZCNT 4LQqwKiehVSY5IndT6hH/jGf6hw01r1SSWXSb4AgAyHS7I7qnWGl2oTlvTus 7dw5KF99+/Jq9tMvfmHxma/lSqcvLyzFmh/eION8JPeBen+ncuS491stCtUK KkPqUzoiHW6aguwJwNT27+LwArWg3ia0sQesHAOxjqWuuhkuTdkVGDRFC2NN SXpKyB4PQITUW6S9gjcIPn/5fGYlffr0xSub5AwOP/vlF772tS8u4Xnp7O3t vD8elDc2lyn2dFSt0wOVvOKQ+sDQehvG11tawN2dvrfXHAZS5MZZj9UpwD00 L/O/WSIEW0BR9AGio1I+xtcNXEEmOwoC0SZyMSgQx6PbhhgPDo+UThsC1pRs Vg+BFSodbtDbyEczoXilNkzFMxv53ISIebsT6jTWEqr8GMfrTsS8N9hDfuzt Xr50Cd3sbkOpMUhxOQElkSZH+3uEYwAxcH0xhFkTXjgSYZF2s8GYcdiyfNhF qoAUnJAIhqNKgkyeZQKTapuu7CZx6Umz0cAjK0Bdj1wngCMR7HCUaRQrSMqa k3dkRCpw1ay3tPeBVNUavVq7B5gmNG4spqf3bu3crXTfeuO1Qf3uaNR899UP j+/1w8XT1fJuhwJ2JE9ZAw/QFi3S/cfowYoTmt9YDwLRHHc6HUQ/023VRdgB qq7mSk/0OkLaMN8aDfuLuBTxus9+5os0g0HjpIByioSgQZn7T6eL2I3OM+sQ 4j5iFRtCPZiFyqY0bbhXPz66/v643VxfTa3k0oV0cu+4fPOoWx0We9HCbvX4 1s27uOaaxJUIMLtcCQJt/W4sVwIzAhBBOFH4r6XYMZnAMoeUdo4mmpUjPGbk 1ymcgneVOAkVvoD/wA6JZ1DHxWS8CsE7Jcb8ubNXknZH037r4rnTcamn2Vim pIb1gUimDxQ7+OSlpc9uxzt/9NuHv/XNSOXtwOTdzcVstdxvTimOpPJXZI7i sI8TwCFlRdWepoSm1BI3ANUlgYBUd24DFFefIu1uKlvjYgG10sWnbzEcizFB cnpaXgjJ3dRUVc2iSTKNQ6jTVwwVe6K7Xz8adIfF6OTe9T/uVK8tJbsbK6PH nnh8OTFYSPap9jxgsjMlhQSbbXK9sboBaQSm/cUirvyFgyouniyeYNfNuHp8 hB7j6kdI32Yvk6ONrzIaBIzG0DBdYUlyBhJ8VHaa6tngaQSmWK3XMX9qVZyt PTT6VDF37sqV5UzsSbw8j3z+2R/66U9/9SeWlpciAGJSxc5gfHp7q9tpsusN b0nwAENhfP7cGWxUR3XOra+KQ9Nx+fAAXQajGFCEGrGq8rJqqlgz3HFHZrai bk6pglcyf7zKchMOlJxIdWw217yQCnwZawXgHioEV4C8602QTWMojH2BtMfD IQ5HZiFFvcfjRocCPWRvW+U1BRJbG4Xws49uX0i0/72//tMvncsu1N/+7Itn ntg+c/jeXps87MSEOSA3TMGMYAh4bwN7Q0XBVd2DQbngAQ+g6kqNFXWq8a+E h6rXqWQ17BcMB/op6qrF84KZFNUmE+GXPvclggYgj9GECHSEJ6ju1Vi8IMXN Cl+Z8uxVYmKqBmOVTWaRemqCg6dv3Dra4Ut/8dnEY1trrWrtlbc+qE3Tg9Tp fmoR3XGoNBzBi4yNhZT7YyiDeHYBnx7silMrDqokJF0nzrmjhCgSzfIRaFNY u4pvjx14RL2qecXQUOVgzFul6FtNKXs+0CIO9aBVJ3x78+7u7YN6qx88LteB DaUW17Oj0fLxndONW/HJcWB0OGzeSlRvhW7cPezEyoEc1RdiSUAYUCmjxbBj pZVNS/Ix5weJoXzkwLi6e48C4+i6CouhJ8jXLM5L0Mf6gYvfoQ+hNInwtETk GalEJ6uCrFNplBG0mTyuHDb643t39nrV/UDzbrJzr7/zVik7CNQm49tvb2Wm R/s7H949Gkfz7e5ggdIPquyeobIvIkxlgtOZowqR4QwT4hrlIuugOqv5pRxQ Lo2gJjDJHifOBrQoJD8hZMiHqjipIupKKJ4SGwKHgRUDGhNTPhzG7TrpsPub Rxcy09yp8+mN5c7xvfCwcv7TTwCnuXu8v7K2cHplY0gEmBgrMJpwkmLvhSL4 u+5uK+6oTntNVpCojkQkgKNoDE7WkdnDNJH0h+FIoRh1Vg/KsWsOvL6UNHPT K8FFWS7K+VZFVyshDF9We2K8WAHSXGIkOsQTyedeeOGR82cBjlarVWgdenDV w4SujmVUplKJKKTzjAfN2kJ0fK6U+cLXnkpfuZCnJFSwlckkQtml7NlLsfWV jQybjDhrm9FLXcARifIjJ4eqy7ikNibZlfSF6pRpo7YbquuGm0emNbw6FAKe KlUORY9s4HikkM0iV8IvvfSlECVHMJnUWxmDpV2ldEIir/Ixlsk3UzLd5paq xAmZOIiRE4PdB2u/uLa8GjkMJldH6bVWPN+KL1XHuWmKKujTQU/9xYG58ONe n0pBgOmRWNF4RulPJM4KGmvJIKJuqBGvXyIHB+lUjjFSw2TdQ1942IHLIJDh haTNq2us4DboIarkbna2/3SaFWoBkTECu0e1ZneCIZNXKY7AZD82Wl0pBGsH H37r31KdcP0Tz0YTK3/4+29nW7X9cWF3mBnToTEZD1C4Ohqrt+tqayAUHgF3 WjhEh5ME2eljvB17+0RTrAk2Gdwqfwq6j+wwEi4siqon9GaasBK8VKscqhP9 jUk8Br7UwW8QiPVUEXsRJ1uaOmW9dpHaSldfWSa8cL38/X/1K7FWmWjrQZev Fak5Qp4k1ENgrUMhEKnYqst2VKUeTVKFhKyOCLJOKQozqmO/w2a1Qy1pLkKd bMpMqdor2x11UrlLQkMiH3J5IiDVShvsIOonhFHt9sq1ZrJd3QSb9eavFbq7 7//6/6f62m9ma3ff+P53Dm5fax/d3D/E8jzqg72CSfVD9UZnoZjZ3Ch9eMAq KZ1c1pUyoUbHB/tZKoKH4thoWD9WrVRVjOiYiE8UO4ktDZWxVSw3hTQopR6j 4lghSkXKFBe1zDKlSiqdDataBSL5ZjKFYbn65JNPP3HlCnQLqMNilXxHpdAU R1Hlo4FKNURJNQLrEMqi+FWOowe/33n9nV/+r375TGK8Ng2/c/Wdx3/o2Rce 3dgkBoGnPp3IEO5AnCIpwJQN6S3gxRuhNE/FUkLMiHJTYvzWgsdiiTJ90IuF UFSML8yKI9Zhh2Diwy985ouAcCntRsd7fEbxUOf48DAezws+aiR3QpIklAfd BbmJ7k95/k6jsb+/Q+PAV44Gv3utf2dUmi5v1aeJ1jC8uIw9SoaYGYREEuXK HrfRgFUGPpAuLAHowTzV/pxlpqO/o/njQQGT2C6L6gIx4KojUg26BDrER1SO QZUipLCrmrwQTU7QOfSAVfHliRuaKU+n4qhfQzUzCQdAtdSOcH9euHT2sUdO D/bv9u/dpTQRcK9Xr1195slPXxsu3OwnKBmgUhOE8HP5Tq/jyoggWbGNSQwd jii5QdXxaXv/EByD7BXQsXicQRL1uuwkmSOq/qapY3yEidUnhHGiqKhjB0Mc gUdgfzdaFJaNjFLh+hFISzwrvcbtnbVpvxBq9tuDTCS7EB4EOvgyJ3vjQita wh05JHuV7RdOtqE6OVt7uXy2S8mFWFbFWuSRmpAojH/eUZ0mRJJhghsGlVHJ nupPEAX2imsY9QOFV0xBdICGmSZ8QDCebJh2s4ZbeUBhfJxgvUahvpc+fBtO HN3fCe7ceeNb33/l7dsL25c7vRHSEd9sjCRqChBMyQAC1dNljx31so7qFFIT 5x4i63DcIOtgR6prQJlvUR2qE6DdlupQ4M4Ohs1zrpIfyDFz2Yt45MAwzJBE l8WogRD0SZ5SA5tBnXp33d7Rcfnd99//zh9/++oH15rtDtpmB1sKZVp546CT O4wB6wsjH90eyhtX9nfefQObNxQ4+0+/efPt18qH16u/8vqd3z/uvPPm3TtX r9+9uwMMkzAXowJhhtMpm0riGjTAVwytje3ngmq8otLyHXXPdJUOVcpegoTi S2qtTXkbVF0FlYXTDr/w0hfwprASqBZx1TjpHx4cxBN5ocS9HAyv94SAAHjk pzGiO5RFZGXxbu3t7NSb1eX11c7Ko5PsmeYEH1tm7dRpXEoIeiHaJkRfaQqP wqq6JbowvGESBKODTO60keCiGMMty2Oj5gipPApLhzTzFMk8JEMDda1OIjkZ 0kEktYpSGgZKYg67at6b4nyYum0qbQWGQvFFY412l2SEM6uFXGR6bxBKDfq5 cm0rlXjkhz8ZO5fAF/uJldPfbUTf7WfKkQLrSn1LCsYgyFvtFloM3jZMIwp+ pTPgiZTxQVy6c6BiSuQ/k46G1q7k5E5PwCKJbRPdYiYiOSufqyRAlSxR6fEJ eXmEvMiWJv1jFGmFSWenxs6kBTVcXIDfl//Zv7m2c/zBp566vLC8crs2vRdY rIazQ7BLYVxotObMtNtomFiZ3dW1FdolDYP4k2U7QXW4/7GHPVnHSJSXB0Z+ iuNKcALAxMEI9ol8gtSiYY+r4KvMYJysoH27iq0T4lA6QG0E3DyYbVYuRken Lm1/eG23cdgsZUoN0Ce9TG/pwhGh1nGw268RNVUrkgEGBXffiycmzemSL+t8 qkPWAVl1kBWsE+xQ64wNSLAORUB1qhQhVBerjOUp2sMJ61og4iJRYxqZPKJa wOv4DzVMq40FtAO9o1ZvsF4q1ouGR5ACSahydZMGwVvk61Q11XDKkYUAQiQ3 bS1Q72Pr1F6jD1bucibcaDVquYX6MLF3u3Lt7sHdowbQ3f1K66DSAOQEonD/ oAwUmocLYhOPh/zgAbj9QPbK48Omx2MDgFkokyFVuVDmBWkMRDB/GbNg91Sp tKR4iUSrkKFjt4kdStRvB+fa1vDAMYryChqw027cuXmtelze2j79xR/+eoHu jrSiZn7GzaPD281OC1XUcjMxzZSPnFLrmxi4MtLScA1ZYMzhdcXJ9DCW5jw3 rlmXq/srf5H0e9cm0g3PjE5r8DSvWzqUttMwhWKnyxDJDWwMMjJGg43F0sZi gaLgdyfNb/Xq//z9e7/7x7eu3gzf7Zz+vbuZ//Ha7Xs00y6tEi1GOC5SFHAw iilBjLX32jW73Aun1gtY7IUrNGumFOFtwZazOXSeHWWOuWLemPJWlEdxa2GF pP94qk9nARQG6m80gPpy8+Bg65GLf+Xv/tQ3fvHPRkmcCQfb8qFm0gX6MHEf 1HpQvwTxflxq+KSlHw6pj2Gm9/2HmzfNpPO2IayVNGq4fSXiCbaJeOzh60O9 RBeyKuF8CPlVmnW1XlKZLwDKxKyia4vrXTy0kWBpFeh7+tSple3TK51xa4TL oTvAM8SQWFkmgIrA2F8rKyvzA2AYfmjHW19bevcdHq6+rZtG58DzdkQo1CM4 CGHBq6zdrZUzkuxCweMMYINVcCUadWUmGAMEx6L1BmBoh0DnqnVKlo2phB0P sHWpty8dsDsg3ErNyNbpM2vvvnr9X3731Z3K/sJCplWM1lU0ZTFQvBBfPEu1 30G02Atm+8HMKJqd0pgtkZe9i6+z2aQUkBskxM+xshwNCOrMSFUDSGfyWdB0 BCPASapcM9wAp4uKhb74xS9gPCmPmqy0LMX7Agc3r20mg8PEhpD02C0UBlS1 GZJ36FJFglEFX2ejVnv39TeIeD528Qz0Pqi1G4eDdJgk+QCFK6yqVAd5EJsM twq5reViJhZu1KvoYKl4FH25fnAvsbyF/6nXrqJfKBtfzT+0WZk2NDMykaqj aTsYKS4Um9UGi8KMKwaldo34tQzrSr0vHFnBSbvfS2cLWoyR1CR0T2zxZJDq aBAvaTicl4UL1vuBG+VeLJ8K9KaNMqXwMjfbqau17M1e6W4oP1p/vNcZrGZC K4UUaayrm9stAqiI1lELqCVGW5rGZKqnTqFErN8hnuUk+pKg8AB9KRvSBmA4 DXYpvjiNJnvkLsrYGlL+BCgZNaRVLYptAhWp0QIKSKLZqNM4aTBd5F4i/QGF mVYvrb7fOKi0g5e2L1bKe29Xav9mb/hKa6kZpaheNQpzb8RzxWUM8Ea3Q9Iw nHR5/WwwuXhEIiAl6adJbrha2yFll9IzilrhJmON8RFTUKjXKxSLPAVPkvTD 3QquB+UnI1CA/BiNUiJ8iKEZUm7B+uoyhaMpXtbJl37jeFxqf/DJTz6VOX/5 964e/qub/Xux5SNiZIP+s5dLzXa5P5wUF9aJVLliAo89+ujtI+XLg+SA90Fh vVarfri/XMxDuvSSjIzBQpBSpcp3IHTB2pE0Swa5pbjgxiR1XUWjsTkJYLke oOx1+T2RgFY+hKILrDOcB4LEmYNjglrJVICi8Cl6nioLCs5L0FKhAzwxw3ZH zi3cdXg4ZIeHa9PEzX68NYkOprH9XuS1bnRnuhSILSpfVdFgsSPC9HKLyUKT qxwFErWCgj24kUl4raPX9ik+JndDMsb+oD7clC5uKI9t3KZcVPoxd4hsI+gj zHcxky5l0+GnXvgC8TTUg2Qhj0mLT6gQT7Qq1WE22adDFnm6WI/wCDDAFHiJ hkkLLR9UPnjnQyBh1HhIJ7KUhWniVYWQk5SpC3ASkAexZAZNjYIgieji/l51 /7COhYDLjgMgJkSCls5cRPp1mhRplYAzI4TtQHZHdXl5EWUZEs2Agp4McSHQ HItCRnIRqYaInEiuiQSPLM4lBHu3jVLNOfqdtrxHGNDpPPnBuEkpyoDiASi7 2urlFtaHwyOQExScoxQAtXCUxJZNLi+Xyg0aqoSolUmm/sHhcXFxLZbOApQF EhgiWDLqUGkKr0kfLTImxbJVPsR/KICQrkZIgFoS6shAzpR4hELD1DKVE5lu 3D2SV0GlhyLIBc6XTZBxk+22OoihLB5b0EoU8MyCTQ+/98GHV+/ea4UT37k+ /OBorT45FUynydtOTtKfOHuhdfROJEciXAQsK4wAJ9upU1uYjCrdiV8CJFNg XK/ukAJHqRg1YKAFZJywP9FaIrREdaetNu51casOFTCYbfK9+Bp64XicTC9U 23jY+/jcqaAISB3mpXAPLVdHo1fv4G1a/Pbbe/X4ai+5Ei8uUjUG1nbvziFw wt44GM+U6IqIGYKJur69eO+QeAenVy06pDxNXYD4MtngKlVAzxrHMY0KC6CL 4WxjrgSwUhKOlBkcDyDCVDBJrQKdEuSkt0Mpqk6NMvhUog+jQ+oMQpx7Icpu ypF8R5YLx9kUB7ae6Dg0+JBiA7bdpogpwDRD8LEwa7RO8PLFIqot/EQyT6qC zEpDPHgVspWu6tQtl0llaov6/uE8QLuFKUTCzBvTBqJFoli9/xQ1dQXmlGYu z0M0jqtWNapQqABBZbIUCaE2zWYyu8I6hBPpQCwXTi9ml9ZLW5uLZ95979qN m/dKKxtnLj5S2tieprN3avUmGpSgi0XSWFK5tXEgC0ay2UkmUqdHI8oHAOwo UDMvEOisLmewIpOU8STerYQlIicorRCOcHtsYhxHVI1LIF77zYTq0vRo30Va MfaQ4Dnm20FhZh54rVXKw3JlnWzMQpqoMbmldO9RxlYwTKlc3KvDfnOlmAwM m+lY4Pz5M6Qiv/3BnWYgdvnFz5/65HOD4nI5FL9Z69w8aoHEQKyDubp261ql SyI99Zr54rjFlgD9KR1R0Bk83GLGeFOlyGLuM+nq7mCKklYhHsuhq6kwBICP SARtjdzKHNlElBsR2jRC+Q7qCLYagBv7yUQWEXacGHRygXKn/M6fvJnups8s f3IUPBvMporrpYXVTDDSiGa6o2Svm53UUvhL2QqYMfQYRKCRonk86rVQ7H3l 0lcsnfKmbWvaL1/gGJvE6bfhCBIxq6KFFOc0GBP9LwbhjFqcyfeG2YljxHY8 waFGPb92sTxJHA7iidImxnkxHX50M3+hFA/Fc9tnr8TSdLrLEpYgbFgnObBR eUDjFTZNDz/w602WMVBHUYwQGnDj5K8uB869mjdSerVr0OmKFw7o3zsluyZD /Th1KpOTc5JTH0z1+uLrchRx69LptUzEBCndY2nh1LRVMg9FssC1dXKZ9Sef eOQzLyxfuhgA/429hrmJzjYr6+KG5yvGzpATJRuxCQdqD2eZYQZxTwDlTL+n pIzXnlHkae2Eca6wBBz2SCGbtGuDyuG0XuF4/861o71bRzt7tf2j8t7h0e4R /QpIB3vzrev/+td/597ebTAsa9sr08S0BRooNR3nw5ufODtNlIfho1rv5kH9 g0CivbyVjaRGR4274Ej2jsrNbh/UEIn61Vbnzu5+3xrKWXNcNSYj4UEoZzyh 1NaNJptUm05RaF0SHY9/HxRPmNxDmQHGMOQWg0cyeirzxKJZEAmYgfSDZJsA VCIeRQZ4NhnKxaexcfvpK6cvnVqa9Mo9ir60yk9duPTkxSvUqNzfO7xz7x6F a1ElOo1OlDqWIwDT4TGsFj9qLtqbtBBONFPACkKPZ08srywhRjAbgKiiwyv9 3hZHeZvE5dRuAKEXBMFJjuPx8SEijio2yRQNJ4jjEeFUZWwKK1Hqevv8WUrb kWUUSOYoyVKl2EtoUkwkn77y1NbWZXLE2+2VSq3aa9UmzUIheo513d2v3ttb xKEgRVVVU9kJ4HpJaaGqbds3nDQiVzvO9g1Gv6JVFmVy5jobV3KjXxn3G+xM ZB6VYcEgdzrldHxYzKZgDbgxqSZFhQuuhRhBPyyOjpODeiYeLFePEV7gNH/w 5gd/9Or7reYRyWhyQrbrgzZFGUYkXJxaWXeXc1Vj3UjUMM4EhT82xxfcyN3e 9WSabWgure7zKiKsILgKjIN5UQVjPJPUcZniqWt1qbxj6SYYvf0uEhUvLFVH WBcCXPicaZ3LgUrIAVdSQQqB5SnJiqGFl5v6NsFMoRUAfNqrdbp4zVRIAe+n itJ4GEjLEMQeVsKaY2FukM6SdMdMMiWkCIaT9s735YOVbTlEVxVcVeXhjeuN p+SagisKnz+1Pum0Kju7AMyP926FBo1Qp/rh69+/ebB3a+fD3cM7+4d3Dyp7 t3duvvL6n7z25g+eAKaQih/s3SGxlV6TeF+H3dbevVsHO627t/fv3Nrf26kc 7Navvnvv2ge7o37s6kFnvzUtd8PYppVB9MZB+6gb2quNVldXkNGUPrQ2K6qo KW/7NNhCQcUgDkahT7yF41B8EIrVelTzd/Y3ghvnpKAVlWqZvOmLl55qjye1 bidO7TXsh26f3LgBSaFAJmE5oUChVHr9rXeJgd++s19cXN6C45CedrRPZbUg dQGpRx8JE7C/cO6RVndAOl6tPdg5qm1unkNTbxw3WTnwacT+svnYY49/4rAC Dl2Fc5gskkHU51I8TOEF0tVgwrBT3rKsaGiUmWLGO812PpEC9UjJYJ5U7qK0 3Wc//7md/d1ap1nsF2gfjr5KCYN4KNgcDY7i09MvfjKe2byxe+Po+ICGA5Fh d1jdAcE9rXUBnoHDFh6k3QZ1+fLnX15c3Xz7/WsENtEwMRHr1b0U4fMgSbFS 8WBnWCPKgO73VDknQMWxBOZIMUxScSuQTA2jxI1wtnRWCuGLW7kbN48FzzMl XvYCsfl+l76vuUymQ4ma9bP9SKbeG1faRGaS9TGm2OGFC6e42VKhNGipLWI2 Fv3ElUvv361Z/VaCB2rzTWIHGmYmlVABOemPAu4wTfKmjUB99wxTEGZfohNa 2SLk89CCBx4FOheF+WYlCSn5KVVzrL6IBrJQ+UY2AN5LUymIo5JzoJYArhoZ WiaBGoDXEKlSUmjiUSlDR9FErlHvHO1XqMRHfSJ1fKZuL74862UtH6vy8T2M H+NGZ3QMBYQaI1GtRGNtJFqz7kyWtAPzE+ExXFpdBbSg2jxMJcFDJSgBYwqF L144Q/gJrZdcIzwui/nU4d2boM9HlWNgiNnwIDFsjygAXjkohEaPba1Shad8 9+6gViOcSU1diqsk8M60O5FYiUgh9gOeaRhOq9ZcLCw+/Ykn/9f/r//Lz/+V P3PuiStf/alv/OhPfe3H/9xPP/+Vz9+t7F3ePrO0tAg2EUQsGTlWKM9EdjKx vrmtJkyW24sC/PhTzxI6O7z1oWIgyL+oDGvWhRz2eq0ezBS/+o0fPj7au/r2 a0Fqeh3s99A7d+6hFqL5HtexTkL/9F9+8+a94+XlDbhf5RCyCh3WeqBVuqNo ZxhJL2zmV7cfO/fE6uaFo+ao2aerc4DCbflYAa/ieNoAA0QIodVvLSytHhyR BTak4svR/j4+Ku0qdSIMs9GpNmmFBqKEhjBWyIXJFJdWVrfb1QamMQlc9MoT AZBF22rgrnj99ddQ5fb3Krt3b056ra3lhZXFYm/UqzXqEM/ezd8d1Ftku3z+ i49tnV3b2esf1sffefvbm2cvh5N59FM5bAf9S5eu0K/vvWu31S1tRnXAIrHr BEzDXRGJY9GpzSAb1Iq3sjXh5me3tho9Ytvs02gHEE90fHajuLmUf+1tcilQ 26I4SPATNutUEOqXFnLdcbwfiLV6+IVbhdigfXCzlI6VlBUqXeP6jbv53Arl XZiA1aXi5z7/4nfeumkmkBJf2IRktDTKR9TMxO2jcj0GTsGu86mOBAdVFjWH ttRFa/NDhVXC9JxG4VnD+bMxsFBVsFTYK6KqUzaPYphEw6MxpBy3ZoShWm6u b6WVwienxLQTg7+gFyKhWAbqHaYzC8wbUATaz7K7iNFDwhTYIz7LRKmlkTWN U5jQ3nIWYdTEwMT6xeDMqym3o2CZVGoyvkC1yWAQX+7eLvV+8Lppk1i5WnnS wi9/7Rul0urprQuLKxubp8nhX/jgvXdJef/EucfOnjr3yPnLp9ZZi+JKYfHR 0+dffOaTq9tnSHs4dfocKedo2kulZcL3Z86eL672z18onDqVOXsu++xz5156 6fLKSuTezqv/1f/7H/3h7/zr7//xb73/1nf/8Pd/43d+619+949+853XvpXL rtE44fhwl9JOPAliEMyQNB73AASQ044sUnG0SGRrawuowcHtGwpNUsta7ixF KkmvROuLFvM/+sNfGtV23vzD3wxWdqKd6uh4f0zNp70blb175Cs99eQTBBWb R3vr2fjxzav14ZDCorRfhmKZjvOPPPLc51568oXnh7XKs5996cUvvbh14WKl Xl0u5MBdqkrEtMoisnmj6diZi1cS8SKljbqtY3KdqAcubApabTK+tLhwfLiH dYIGRASFKkkfXL8RTy/8+I//TLfeev+VN0qZafPwoH6AltvqVCqdeu2dV15r HB//+rd/Z/fu9e1SbrmYa3Wae/t7w2prsHMYbPcK8bWV1cuLG5eC2XOlsy+H Slc68eWt1eIklGh1hnilq5UKLrL2MHTvECOWrefJOjDRVJHVJiPlVzG8Eb2H oDqHx0Yxane6ydVn4okibrPtQqZE0/nA9Pi49oM3rlKmDMWDvXt0XNvd28V4 JuZD+ZSv/Ngv/Lm/8JdPb6+3ju9mg+3IgFTdwo/91M+98k7r/RsH+5Xu4urZ cCzf7HSaaKqF2L0DwlPEZa0+GEXhe+TrHebTyHyoTiEUVRlC2snTMoRFAffC 90CZcJRbacIUQRCiCtcrv/CqicMynHeET3qtsmKOYOKnE7pHUdgjnS8QSCFS SRylrsxpKfxIOUiCIJsr/xOnzh2+FNoDC/hLadrUKEq1HkUmUMIhVjU8iAQB bqoHqGJB1k5PPX2kjqmsp/Wy5T/LXlWqPueHPeXz5KFTR4sY3bBLCmg0RuGb o8MyYVJQ/mrSZEqpXClc5OVv/HQuu4xnqz8KHFDTPxKm2qfCiGcfayezNSKP mDHJbKS41E+ka4FItduJFYoUY0iWFgsra6TC0x4VT9moEe42ghQZoQJIuzbd v9vAOdRvhbZz6+le8LHNc6HmYOfta7296s6bHy7FskvnLuHOoaeMK8Os9iMq 8EpXmVYmQWeT6KjXKGZozRVgb1F9nSZUPHBMm3ktcABZtmzx+rC1e/O91WTw dCa4nY1/8uLZCxtLT1w4/YmtwsWtpRIFdYKj5XT0K5967OnTiy89srW9EX7+ 0soXnjzz7IWV9cx4WLt1/d1vv/nd33zj3Tfeuf7GlU8+fufw5j/9Z//fM5sL mRA5kTugtyiiRwsqCvx2B6NeG+Ogm0sFqa2glpUhir2SrpNeWlrY27mDJ53R jQZtPCkV/MqjyMULn7j53ockroe7R2AQQ+j6isIHCvhUAIWXj89tLG3Gops0 oCHGXcwwZ9QvxKeV33y2Gxtd/NRTtV5qp1z/iZ/9zLkLOfyfS6VSPF0EL6Hu DrUaoQAwo0e1NlGVB6nOZB0u4FEA9ONisUDKPEoRHJcOfoRGfu7v/N82Vs/8 4a/9s8qHr0d7ddQh0vT2G8FO5QA/6u7B8bWbN999730qdJ89vd1tNFYf//xu pdkcB/eoDtoZfP3P/OL601+ppc/8+Fd/7uylZ09feiy/uEFGHtbpKNCmFEG7 Q7VzAn74Q0igpKUDVZIPC5m0rEwVmlBlSE/WGdUBSAYFms7kQG+BokSmQVJk r9cabRXhQoiYr4Udj2pUKBTWFlNUVoNMsNwoV/vsCy/8h3/3P/rZP/8XfuQb X6f4oaiCGg0pcvoB86ogLDoI0Qk8XmXA+MfH4PBwbgGSPCa5X5kRhPlB2OMw BXcbwN5GZbOyYxqIeUNlxSnYaTlHMuoElcGQxObFluzUG2WMf7zlSEsus729 jS8HyxzFi+GhUwujQntG9QIOBP/3/8l/nlmM95VlUUBHySfbd95+LUFckbLe AzRXuS5gMc5NB2Y31GOBvdangp/h1E4mqd/a7bUQPvyEeo4QRq1cgSrkqkJn zCyRL9Dq490m/FM7vH2wkFk+f+WJ7nbm6M7NZRLLwfUQiQnEd9qtn3ru9JlL W3/4+zdqbfrX5VKx5dH4HtDF9qiF1IZnoCowGIq3Hu3vXn3vnf/zf/r3bt26 de3aNZaKJXFWOHwFRxb+jLW11b/2t//Gf/Gf/wOmg4SUYmGxUbl35swZ2i8z WnnDIkKlwcYeKxXerB+3I/GdD+8FOr0v/NDnWKbG0f4gsREhrtQ5TiWazz/3 6XevVqLZ1e6kd3T1lezSVo80NIlEcCPUNCERNBAfdaLJDBGku3sHTz/99MbK 0rf/8HcpLp8BIxMTSKBN/cbRaG1t7YMP3ic1KzcuM2nsMLbI13/+59/67re4 kUceeeSNu9fLR5V3Xn9vubSBT7TRH5XbfWpPfOqpi8sbl+mw9viV03/8e7/K zCcWzu1UAuOUHL/RUfv2+2+d2VzFtU68WOErcNv0lw5MGtVjGjuwHNRZaLQ6 Zy5fCdFLqLqHh1dlHXPrpx9/4ZX3bm3d+VVDDylRgtArTXPTuFSCo+sHMNpM ZTT+7Ne/HinkG/TESyVa3fbT25erndhbN17DrH7/T24TeNlr7ixsPEZnN8rV ESIh2xYRXDva2b39/sbawmCatWYhCmSB6aMDDnZNvVHpVtrvVg9+4W/++z/y 0hf/4f/mP731xtud1HTlyQvldz4Y7V5NNA8LxbU9EAPTwQ8/s/bk0mjp3Pk/ fn//D949PGxh84dWS/mf/emfeeZTLzQHh7/527/5yqvfI7jSqtVLWRKDZRe/ 3cNElD+Ewh+0aMSTnM9n2Sr1Kq2hrCyuAvQEdgWaUfQCW0mq+ITilphe5OoA aSaclVY7lzAKKUVv4wnZEGDF4L8/8vwy2WG1Vu/D2wfB5EIwVZrGi9fv7B7U j1cXcqV0AVjPaFgPJJqReC782c99DRCdmo0FrKPysHFw7wZdwCjky1aQjHUw EDnOzGEq9dVzpPoSH9bSbCqX1qr9kE+hOoHOtUo9Jvx/qUyeAtAUNSeftZRf AAmXWz3bSUepI59ALRAUhRpbI7UsHNWo3tHpYUK0MMMI2MYSlC8kiVv+MAUc Da/iKslANO++9SaeTAbEhtbVKauiaqNIIcFd8euurCy9//57zAtnM71AbKvR bKkOFD5KeSOpOZvu1Xv4sthYGQCfo+Di+lo8nWvRS1JdIwjj95ZKqQsXLty+ U+6AvwtNO+W9eDoPs0DpjwGcAKKtcUUKmQSOdZ0pkbxw/vz62iowI2Id6WIJ dBMFdynXurq9+dRzzyLTqCndDmZbwfQotXjcD7VG0WuHjfIwcu2w+eH77wN4 yKJiTEmv3aSwl5qtDfqU/cCQ2zvEl3SIe/9Hf+zrudLq1eu7kUxeva+Qs80y fbxk36AQCWOF/YfGi8XdZua4a7wpmWzuq1/9WhWNt3wE5cfTGSL32+cuXn7k Minh0eJmfHErXNgYpUvdSKoxjTeCibXzF370F/5Mmw0aiyNpf/Ob/+btV18v pXO/91u/+49/+Z//4R//boFszVD2CJNh2jp38RF65KpzOu4jNrGzZuvHeP3J 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 ooIMTJPYD2og+ta7QzOMrqWuiuR58DV75N5H3edX8qPKZrNz8OYv/soPP9l7 PuJZWVx5/OnjnY82oqnsfr8wKHye2/jIV/mDx+//6eHGTjY1Z8JK9vDTUX0/ MmqHug/tpBlMJmtNYCeeZmHPKu/FGvt46tSdrQgtmMRCk2h4rjGI3d+bFFt0 VodBfQhsgAwP+Q8A2KHgYbPP5sZS4ssAFGGwH0B96aUZW4mI7e2Xv/rSjUDP eHJ7NxtZLG2VxnNL4FFJaZu1VjIWmaMRb+dto/nB/o9/7/4P/8DuHKVjPs/B 54MHPzZKn4ZHO/1OVdqLvOO9vR24cLCEQLBa3KCVyz9+/1a3D3h2kZIjzpgd DwyMFrMdqC1CmtYQosYExJfSTCMtNdRoGIuEwWH6cDcfBzVO5b5qFnaoZnit 8+NRPm32N37y9uRJIdHdebhZmLSGOSsSrJUaT9717Pykefe7vsdvJ48+8rTL diICmV9wVO9vv3P02b+22z/0NitURygg75Rbj4tHlFVZSfsAAJ2/SURBVBmZ FETlrlvfpStIJtWNe0wFJzAut8dE8DKQRWI5BXIV54OEJQvn7ZkVf7+XMiIE q4FcchzsJ6OhH3733dt3H3It37v5+GZ5EL/04map//HnW+NJ7Nq5VMrf27t3 m/x2eRwuNDvl8tFCPvX1aykIl9++uXvx6sv0nj7YLnuN9Fr+8h+8/y5j0taX rrSN0D0wwKZ1be3Gzp3DHW8jmwzXD6vWOD6fubRRKH/78083PZ6fy8cmzIw4 7Dx5r3br23fu/PTbpU/fNm6/XSh8cP36l7wN/+N3fj/05F/2q58N5t7KvvSP jYuXth88fvCd3+vd+Q++xpPbt+8BZk5hIlfW1tYuf/jp7WaPrpJ5cxRoVXaM f/Bbv765eRNeE4pdi+eWz79w8cHhoZVdvWBQd9/ZuH17/+Gtzc9/XHvyfmJy EPUUve3R1fxceNA7fPC5v1NczcRykE0nsnQytPpNmNnXn79yVC7efbwx8Vu1 ziCX8PeaFdsYJkMTRdZA9o7B9uQl8d9HcE41mWVP9YD0JjM1aeIldKCCSn4Z eqmoSJ0CrtB4zWhBnJNhwraJBBgBBMFr1PAtLSrqn9HYTEcHUbp/2yZTvfe3 I4e3PSxupeQr7pTf/977/+afVz/8D7n6xnjSsQIjWDPg3U/HzbgNMznUw926 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 XfjsZ3mA+jyd9XGiOyd5qzQCEGKVZfHLTVbrr7I/Z7SVI/an5N+9YlOc9yxc 19kmR1ZP+rEn8A+nVBs/OlHi8Z+rrIy+WLllyq92fvvnKke9o5QgyO7UCSVJ VajULg81bVrdJFwFeYjVJ6lG9meaAGKMOGkgeEG0sDnypp/wr0z7JHmggi0c RA79o/I1n3Ioh0d6BLXoO4Knx5tLSVpVnojFp3kOyZlg7iRPosVYWIsJjdRD EGHKI9BqQvokn/Fw72D3Cp6yA/oeyLkJzYFKk6pmKgHB6R9djTb6uf5C1dkn 6d/j3JoGp50scz1VqNwI7GdJnSrMyUNrBCl8ifcmiBzcfo0tJkOoi9HqZI/3 tNoHypF7Rku129adOoFT5+/8KA0cGu6jC5UwqpKCIhjhe1Urp2owk9SBEM0J al8nNiVTpfelFjy3jOnX3XKoX5ktpLx3mvecvkkVime4/1O31fnRfReeKtKy hRyLfdwIIqpBftKVwFmO1HmiYwT9t6duND/i4YsFIbhQSlFKvCq7K6MCSRSS WeFVyrYy914GiHkk6Ff5HFBPUptQD8yXy6zJc/2K1M+OD8SA3II44c/KBSEb jiU5aevYLfpmiORIKQM+E7aWoFFUNY91EfYRnalU2kgtkPJMxRDoPf6sXfvU 15211tIi360e7jSPI1eOjE2TBerrtMjpD1fy5uyK2YuzMpdjQ5zeE+eU/iKn LZepgi4BECs/UooFSJugZCTm1zkqSRtI9UR0lkpjnF6Qs7hwB0jw/9P5TDW6 ikH0omlkmuMaiKbSel6hfwTMKBg4qf7MdvmxBDk3whFItwS6753e39Otr56c la6zYuD+2LNSfSxySIuKs7UzP5X5Wa/QUz/W+TRnqfXbFPSKehsUMuTDJSsj 6AplaVTdUt1BXaamHKUXxWnZlqSKVBuks1RBYTSEdPqEH0UqFLBFwdo0IFQO 3QUv7BizQ/+I1Mk5TS3rsenQu1Y31wsbq/jXqjwoa6CKPEL/A7gZ4shpjV+L nNyD2XpIYuYZD/2WU/dS26WzW1M8Ihm5KuAdBfaWPS1b280r40JpanHVtH/q octQupIhD/dXnD0T5x67t9ep5woKoLpcdKpQ4WPUM2qXCqyuTlILHg6mlM5m hXWtDvRmfdZXuPOT+rlOWjr79dQqaYCY/i2+Pz8KEkA1N+E8TTuvpbApZSLu qyoXCfKcPXfWqXOWyL13na/W/uTxujnGTS24LMsz2tzc4uQWD/fr7k/mxORe TO+XSiaIyMl21KKo/3U/OT6zk3lduReSIPTIXArZO4JNkdoleBcRNRDfAvUW HBEfy0vy3QL9kJZtx0WWXiHJFfGr4yciHpLamuJEOAO9QO5b6yyWflE+fNZ0 7PYwFYhaR9tqf/B/yp3YUrHvMqVeUI5KLqXJgdfUxTtf9tSvPnsa7nNzRO7U neavTqUodKLCrcUdA6ifyCe4RE6d1eku6VPr4N4EZ5+flY1pPsmV6XEAAAqr JLKnlIWcDodGwzh2+NSec++VU8/dauLUOZ/dxFOoivobkbdZMUpbOcfWyQ31 KiimWsnjq5stmvPJbiF3f7tzjxzjplWtI5DP0ibum+t+7r777i+SbL5y5nUg rf/krGf+BTtcf5r+fNYfkIeKnbSlo26Ajy0LJRI4TR/ofgEoSGb5XPdCn1r0 6QlhfyT7ItyPMux21nejQC5UD+Vf5wk/au9Cy5vzRMzubGPrGzOVdh02aFKK KcpDcWa4mtz10kz9TFXjfurDUR/OEj/10qafNtMLYktOPhyvWF+C/nEqeHIr pqA2Z/c4xS5tOpwfnb3u3mdn95z7bc65iSzpcBKDp8o5+jydUzrV1eEWuTPo 2GkJztlG7vV51hI55+nsSxEA9TirnrSjq1ZKAfgU2lwjHJ51vU+V/BMrdhLR 4oiT+8ROKZqz6+xez1NX7XyXfPKZBOaJ36qvcb+in4s4iFUQGIaGhWiMgEaA OHkmrRxZC5qeVH5TGrdwJsmgQPkXBI8LBhfwLl1eGtwt3XTcfXmz1HKoofRg 5DZ8cAJzaJivA/Z1fuz5LMalMSQmQBeYYY5MaNh7US/DFHH64XSGYJt2MmST wSEjqphEgfDPspsl34PXTUmFWeqCD56CTjS2mNE/+tBr7XYz9SsUq6UrGJwK pSIhwfUN/QZTnyAVE6+ZwhU2lN4nGWTeg7BSVVnxx2UogDoE1KSG+DKdjtiX RjKPqSgaaRxgXJ3CObMgnp6XlkGmydLeT6qnByMqrQTkLjUljsxMhE+RmtMz HvpyOHTJVxfJFFKPQaeebrfJ2HaCBTincUpC/ihEwl7B9ErGggeQHhNWUCPE 2AbGI5PVldsNDaMEV6o8p0G+MyiPQ+ig/WGpaLmKhAp5KSfAacgdVEh17jjn z1BKT3dkG+awI+S1iocyZAYteujZc2wtRntRHxZ1aTDCLmCFuTdAh2OIJYED pNHstLGn9dScqqhaugY1o5FuEtT4QcaSyfaTEZMC/pcOA9lmFMLdkGUHtcyT aepYoX413cP04AMExQTVphxSu+SD/ZMue1hm2rB1lTan41G1ADqUDVPXWp2V ZIkEzMDdoXbNfpGWSwg3GUZPPRISzSHbGzrjgSc8CXO1I6MH8IGurwkiQukU JnivzU1zJb5mXruj8M7I9DS/5FZ42jQ7fqajhNxaU9kHOTSK8pQ9cayHUt6a kG/6mEbhrjLUF9irU/pSZ6JUCVI+Te96Hec48YlzgS6jcWzN9Inp90x7Z+Wv NS/3mXhpBnh6lnQ5rzta9sQyukJQ9xvOWlo3OtlhGNBJRccpUD3R08dZrXxK c7tv2alz+4J3ikjPynHue3rKo9H2UC+gXmS3kXFWwG2yTp2wXjd3Kt+9P91b 9MSn6cTbmdt06m/PnsAXf7hciDo/1OOprcilaYdxGl0LGbNk5x2XxNmf2gk4 nboVf0Y9nF+5d5KzahLdzQItHY+6z8O9HO674gRLOtl1UuTUbZnJsOj2md/r sMSc3RbP2rv6Vrn3OpfqfvMpMTjrW+pXnIV2doOGYrov8NRC6cKAkyp0+Eu+ 4OTPXoUWGv7kpCd5rB/cn+akK+R7Z9w2agWekXaY3d+n3rJjFaNkxJ3Hd5+n 3l5qlaQYpX9UZyuSdkqRTc9WfeCppTsrZmcX6tQKy1mpT9GH1jjTH103XZZi pn3ce/jU8+M761qWL37Rfc7608QAqrKWxvTyBr0Cep/rV3ibfvFEkccJIqen 5cBkXDpjeoX6/FSGQ2d49J+clWFn6+jvdja3s6ede6BPSEDquojnw4hrdr7p 3nEv/VM1gns1dQO+LjGpvSNPtDqZ1rJc1sAxKY4i0NqBJZtSM6nsFg+9RI5i 0t94YtOrtzkVOUcCnXPjz53fOlvQ/SfOO530r+jRKfmkumezh7MIjg1xSvOO tLjXxP381J1yNrq+zOlVzy7EWUbnFvN+FkeWQpXgZAyn9Ioq0IUuqKj0q+6y d5ZOa0K3ULn3zKlfnXrbqQs5K5n6Ddrzko9yMp/Tv1Ses3L73XyYz/oc9/36 4s2mP0HS6VBqMAWAsSjTVKG4zbothsyTdlAV5f7xMik/apb5eOrtcS+Qs120 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 11/98levXH8xNbcUsuNAoqFba3Xlz6FiI78inGoqKlf34vRDGwN3vPcsedOv C4GXpp9RIeDx8YWZd8EtSXPxMdGw3khQUGPZhElSMQ5LjwhkriG/FQlHkD2E L0w8pTBiT5U6vVHOPpzd5t52znNH2UxFcZa30K+7VchZqXP/rf7ttN46K1V9 sQ1xX4Wzy+WJrvOqXzv2WV6ZMUDrm+ecj36PU1d0fZSsla6P65t66hud83cu cyrzWnCf9n7eIDk6DO7Jgxf7gxYHvgL3j9AXQmHCB8icdvvRx43gx3vdza7d jpzb86W2x8ndSbbjz1QGoebYbA2NSpPgiSFD8qd+ISEPCku8FGolrNXZZjX+ RM87oQNVDp5zkKLlkEYDfCiDOUyC+KcxNRJK2kwpGoNHEZLeKf0Wu7TT97X7 5mBiDjxmb2wPPBz+FvnWqqdTx8OCNFLxUJG0xE6MLfIjpE/ISNKpMZgwT4hk r+0NVjvdcrdb7eLlTwwrjA984fLVay++9OJrr12+cWN+eSkcTxBSQ3CJ+qg0 6mflzRFCJ8nhfuLw7px6cvZznFfOZllObWD3jWZJUGFKxQtOQBp8SAMJUS9Y MFzjHvw/WDmS90IG4N4NJzbryZK3s+Oda3NvKbeMud/pfv2Egp8VLs5aA+cc lNt2onz5VC2g33PqBJwXj3GYs9PSGs6RNOcP3X2ZmhIXXcW/DkXvFE8jlC7H 6Ge34DkL4l6ZEzdGncOpEz5VcXFq3yQaIeAkdQmHWqPRONgvPri/efOzu/eL w892mx89qW40fHUzX/VlasFcw8p3hyGy/RMfpicsaoFGFrxdWiD1kHfFoa1o V+QcpNohEa7u3+pzEMbqYwgTpxdjN+Ag2ziYEJ6QZcLIBDoDX6Mz7EDuqmjt OHi3n0RNj26sMWWNUYsc6MDoyvPAsDVq1wbt+rDbGg27ati1zL3wdPoMsDI9 /rAvEPYEYRwkf0o6lYINiUxGr6h5D3yypzMYc7DWkWh05fzaCy+9+PLrrz33 wgsYxez8gvsOuldejV7SA5iO/9V54Kc+CCv+Ig/CDffbdKLS/WBVndiEr5Mc tEKE4wkQskK/2oB0uNsiNyAF4N/+7d9+cO/htctXSOkRz+L9G5aFTSeTKHGt zpcIa6C25lSlTqT+T9mfaRw4yxVwizuN0m/86s++8fxquXLYpgwH3SKfOUSj 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 8243Q4vksf501KRLZboV5HQnHWvmmVqd5iCnt80xlfo+S9vC9AN1tKG9Ucmf 6bM6/SBZBWO39PaJ1AH99ldrIG3/v9WdyY9j13XGi/NQJIusqmZ1qyVBUwbJ CWwoMAILCDIA3gdBdgnsjQEjBoLAwyL2Jsg/kD8hiyDbZJllkChRbCStdlot yW7NrW4N3V1dI4ssDkXm951z3+XjI6sHQ1qEliUW+fiGe+93z/ydwv29+/nR 5gvPF0tNhqpSmLXadbq0di4/VX3pt7q/98oeFZDFRhGWWniQa9Wj69dGN25c bLcaz7/Qo0ksGXkkExRLw1uf3Lj97q81G5XP769f3sk9fYmCf5VJrdW3Ny8c 3Pv81t2PTzFYvvLytN4UH3ujPKN1d7M2Wy+Xm+sH+5999v5b7Y3iBpsm7Ecb m9Z6EqepTB06+8hcXvXycHlaw0/m4hxZJ0svDmkYOotBhHnwd+HviLrUJCbH zb3OC7MfT+RXSSZCRAfhPl2oeuDD6aTl50c/NC8jLo5y4fnn+N+zli/FV5Lc LDF8DZQ5AjbSMqW3wJ9DoFk1RTlSutqt5hbED5ubOzvdJy4/efHyUxcuqi8k ro6t9gbfwpVCnyayQ+glgDl/6+7h2+/dvnrtnf+88sarP3393376+qs/u/LW R3c//PQuPsYTXCv4GkiJrDerzY4qehBc8LfBz63bV2hQbYnIUlP2kNL2rFRU 7dlFgSgdWFIay+hsQi4pIFRiF0/IloNwx/VKDdVJH3Wp3Nne7j75FNUAxPUQ ioofFyt6YsUbLWt2rsoFggEpe7bco6xzl704MVLSLrpJVuDBpjHZM1OOTTsP +0eAmV1CqUAEZoxiPVkJC9tzGnVp6KmNNwgR8bWKmvGCFI4PRvu7lft7/bMe G0252sXTcjKEgeKkVO9cePY3xjvd3kbjoD+s5yujoz4lILBevf3P/3ipd9Rt 1Gsv/Xq/2SyNJvRxpcq6t7d37f3rl9YLF2c5WANqLz6H55OqxxE55BXCNM33 brx9c2//N7/xh5uXn2bhd3PVxjTXyZfhEWiQ+bN7v/fRR4X+4AKybmsrt71D AayaSoNrguokNSjPTstWj+6quP1jPg6p26YOhjdKwUknB6XWv1ID53adIeeR 7To7OKIzTFqM7IU5NHRFvKVlXWJ5OtCCwiT2fquJIZ5mZddKKSl884++ichD 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 vLx0wTB877zx2tb69urN9Xatfv7y2YWTM5FkaDhyQr7g7fdve/tmMpCIB8PN Zs0Me27v3L9zsLVaLuy223o8mpjIBJPxUDJuhENawO8YRm9k255huVFp9ZrN bj2dS+4e7qxt3q82ysFo5KkXPvX4px9PyUoNr994PRDWRvrgylOPtbqdV19/ /frND1ZOnjixstDr1jStEwz3Rt5CNK5hQ4bRXdt4/ebt71j25sXLC1a/7Tj2 aDQc6SOPPsKiTW/YNPVoZDgcNSy7PnBaxuXpz46P5dbv3fQMO2Gf49W7Xp/l jNpev56fyI80r9cb0kahzfWDarkTCYbNUS8RC/Xtwa27N8JxM5xOWI43lIxe fPRMJpeTZd3aP9zb0nr27ure7Zu30jOpp3/iM4vzE71O873X30mG4p62vnZn dWZiqlDai2XDO/X9vU7toN/Z73b1ZDQ7Mx7NplKTE8nxMTMa7jiDcqNaadb2 ivsDzS5XD6fnJpvtWq/fDUfDiUzqD776ldNnFqNJwxv2nLp8cvP+B/OLM5Va pdpqeP3+sYkxFiufS4Yj3nQm4A8OzGA/l8v2OlqjXm21DuIJTy7vm5sbC/qj wUDUH4j6TDaPz9D9uiek60Y05GdvDh2PofuMi5Ofnpoc27h/a+S0wn7H9Pa9 puUM22bAy2KxwJoW1PXI+up+qzGIhsJav9FuVjHSt+6+waZwTKM3MM5cvjC3 NHH77p3ifrNaKMd8XrvRCo6C8UT8d7/1ey+/8vXCwcbJxYXybuFgbXfU1k7M Lg3tQaVRSk+n6lqnFdBaPr1t+oK5lD8Vz87NXHri8YefOje9ONMd6ut7W1t7 281OMxwLlmuH2VzyoLDnD/ti8UjfYz/34sfrnYP9vdu91kGzvH39+tsLy7OH pcKZ8+cuP/zQ+QsX4qn4cNTTDbZLq1zZD4dT+ijZrPiiwczs1NSFC6cyqbDf F+y0RoO+1+oZnY7TbPWbjX6j4bRqg1qpWyna9arWrOteVg3Xpes6/k2+xQZ1 r8djaJjqSPdiZhYrqPM72JimDYNBf71RzU4Ogr7wfvVwGA3Vm43H45/oDy2r 0+7Wh6u3bvlGvWGvlwjlWi17bmY6m8cdRL/10rd3Vu/6/UbEjL58/XuX5y+1 rA72sl8/qBpW1xhFk/lQPNzRnIHfCKYTRkDzBrR4PmVEgkO/7ouGAj6PGQrU Ws37m+tL81OlmnFYPbj1/7qWToWysbDP42Sjwclc7s03vhtLpL/xza91u85Q N7LZ7PhEPp2MRsKBeDJx5/aW1S71m/FoILK18V6vtzbyrOXHQp6h4cGzDIzB 0LGHXaKP5gl6NN3jOLpn5PF4RqORcWH8hZnpyc37t4d2M2QOfabt8w0Gw7bH OxqfnDB9oU6XHyY2Nw6trmZ6zIA+7DRbZihabbf6XjtGdBibe+KZJ4kgBzs7 h9uVVrGcjXgvnz7pd7Tbax/4Ur6Dw+3N+zc3795rV2oDy7E7WsQXrzQqfLBA 2j/wO07AaA1sbyhS63SD6bg/FoknU+mxrDXQ7q9ubW1sdjutYuHA6jY9Q2du durenVs4Xe6trtn37tyYykWvXDjzJ1/9yqc/8bhjtQa9jml6i4XKH/3x1994 85ZpBuPxbKnc3Njc7ff0/PisPsJGx3SP/tJL/+XOvdf8wfrUTDQUMgLshfAo EOmH471wwoml9GRKS6W1RHIYT47iyeHRYrENnX4r7JPFMn22M+xpujMxNeE1 g61W3+9LbW0WrK74vqhhNBptIxDdLBxoEb07HE3Pn8qN5T64/vbq7dt23Vqe mvb06wGPU97bN0zPdmHL6x0ebK3lEnGr0wv7I3f3N8ay031nYEZMLTBs9htN u11rNsLBWL3VbvStLvvBMLjVB3vlD25cv3PzxuH+ntPvteu1SMBcXJh58/vf a1Srm+t71eKhf6Q5rWrzYHsiGRxLErVG+Uyq3+87jueV799vtLSPfeKFz7z4 FxYXL0xNrlx67GOVg1Kj1rYtn9Xp3rj+mulrTk77w2En6Dd03fYaA9202E7+ oOMP6IGg5tUdj8cWlKPbxtn8J/FZzWqpirsN6qbR9/kcLEui4cTEUPP4fDHL 0kuH7Wa9Zwx96VD07vrG0Ah5QoG+OWSL5sbmdEPfWr/erZbnx2ZXr1/36d2z J2Y3N1Ztux3CQVqddDwUCfoGVl/TvY5lGsGQxmcLAGOGug9g0w37Q35PwNDN mtUNx2Kl/YNurb6ztra9uqrZ/cL2ljaw0pFwNpUYSyTK+/sExtmpiZjpW0hn FtPZsD4MewZLU+mAPjA8A7ZGo2W//fb6SDcj0Zl7d4uvvX7v3r2y3dZ6Vv3R hx4p7DW/8od/MLArfn/Po5VmZtNefI821EZDlmak9bkFQ/7PBi8G9FHA4LN5 AuKM2I3sSb5R37M58Vbe0VDnD3FbODT11X14+raeT8/1+0azY9fb3UKpjF/A 5ZUOD0JBX618MOg3w4HR91//k1jC1D39sUg04w36+47danU6rbbdbQ+tptNr 6ZZl2O1+2+q1A55RwmdmTf9MNJ7WjbA9GFYqG9evbXxwvbq12S0Vo4Z+6dTp TCz2pc9+nsgQ9Id+9st/ORaIRX0RT9sTtP2+3mjQaOq9rungLltav2O1OwFT M0a8dnRnp7N2v97rxOLJuXR2PDg9Ho2FuBi/XyJdrdZy+iO7N+pbHp52zxiA mbs8/XbX6LQHnXbPfeqs1NE6sMmGrBQLhiPn5yyfLBzOnv8dr2a3249GkpVG q2sPfaGoLxROJpNTU1O5TNr0aIlIWNecdq8Rige2CuuJdMQcjWJeMxkMpeLx RDIWiYUNTMwY8RyZ+mBodzoNx+patVrjYL93WEyxGQqFcb8/S3BptxO6J+P3 DRqNsVg0EQxePHNax/UOhhP56cFAMzS/hicdmrrt6dVtXscYOf1uC2SmD7WA z9e3RpFgShuG+j3vaBQxjQjgU2uUY7HQ9PRUvda0ek4qmS8ddvpd36ATGrSj /Xai307222m7nbI7MbvXt/pN96m70dC1HZZm6PCVQMjCcTWs17FNuXYnwbLT 63at3sBxIvFYNp/HrE4un4hHo0F/oHR4yLLu7O/mJsZ3e0V8Q71e7XY7Awc3 wp91eqxLv2sPurVGtTfoaR7H9HkDAR+IPOAzYgFv77CQGA58nZZer1/GPyWT 1Z1t3HuzeOjT9ephKegNtJqdb37zW/VmG+c60o2hfCi9Z2uO4xCy2YR81EAg 5NG87WYvGAgDEQjKQZ92sL/+wa23bbtSbx60OsWxiaTXHJVKB/F4xDNyWAox HZKsoaENvDz5AVvOQ+Ji8D5Yk7Is13D4/mgbimXJ/mURJXx+xLiCIV+9VQ2E /fbIajQrw9Hg4OBgfm4uHo5eOne+3ehgQGYguleqzM6eqfX7Hc/I0kcWKK4j Xtzq9tic4D/w26jfHwz4n1Vr16udRmtktfstvdtaTqet/b3Gztazly4s5rO9 SiXu99vtNpZbr1VYC+7VjVu3rQF53EgLm61R1wl4tIBGZsvWGuJuvQGPx4/n 8uIIuo1Q0Mmkub6Dvf13q9XVr3/zP1XqG5Mz4WLlnjUozMzHmp1tw9cyfS2v r+n1t0yzafpbfOMzez7fyGca7lMWS5yaLJZsvaO10wy1zLIT3aWUXxDrGw00 Ik0nHPN5jFGhdIAbwnY84cATV55IxpJXHnlM0wPg4K398tAbss3AXqNS7bds Y+gN+yKRUCwajvr9AY83Fgg4va4z6BP3RqYnlk9NLM9mJvPxYOBw7b5drS2O 5Yi8IcPz8Pmzmt2LhIM47kgkUqqUO30rnkzjh+v9rh71HloViyWKaZahDX1e jz/AevWsgen1LyzM1Wt7zfqWZ1QMBarhUJcMURuZW5v7+3uldCrHVRcO6ol4 1PQZpl8zfZppOiZ4xkeg63t9pFsktUQeeX7EZynLYlOKQR35LOXSlVk98O9E rpbhczr9umb0naHFPmJ73X7z7ctXHmvVO/L2I7PvGORAja7jT6SDY1kjGQFn 9ok1OmDXo/UHdrMV8hi4fExs5fTKlWce/8JP/cRP/c2f++xPfOHsqeWxWCSo OalQoF0t762vZeJRWU9MHDRBRmdZxGjHo/clZ2sNItpuu9D22p6Yr6sLVB95 gwPNO9RNIOiTTzzs9fZ9ZnNsbLhyInD54vyTVz5dLUTqpYhfXyju6+Tm+cyM 1fUZnoiuBQ3NJ6vjlc2tGyR/gFFCRIinruGO2fUa6A5nLvBdnqyURyKg/Av7 VNyWa1aa/Io+8ofMarXEuuI+jKFRKZV/+z/9jja/ML508v31zYUL5/PLJ2MT M1c+9tzcmVN/8ed/5qlPPQuRQDbADvJ5zVgslkql0/lxM5yKpucm585PzF2Y XDiTGZsfeMzP/PgX/+E//R8m56f3DvZmZqeajdr2+sYzV54YWIOQGe60ugkc vd+3s7VGkPA4tt8z6jY1zen7/N6B4xk4xsjjxfMGgkYqGT5/9lwmnp7MTZ5c XD5/dn7h3NLs8oVceqlV12qVvmnGDUgiyxMOp4cgbs2nebwS3+TJOrm7ytA9 Pq/m46txKffJJMmiPtpavRMKaMGQbvqAxjY2EEnE4qmMZWnicNvO7jaWHAZR NPEZjhOORlv1HsCb3662YKXsT/+Vn1k4db4ykiWJ5HOPf+xjK2dXPv7JRxcW J2vV8uba5qBrR4KJar0dS+eDqfwoEI+PLyWnTjp6/P3rW9VKb3xyav7M8r/5 zX936bFHN3a3l5aX9/YOX37pe5cuPkL4K5eASFfefu31u7duxEO+SrU8FtDq G4UL85FUCHjUPbO8EjCDusfkAvFuPm94Yebh99/atFrB/Z3Cm29/ffP+ndU7 +/fu7ifjY+Pj2c2d64XirbnFSG6MdNbv0b3kz2TRhAvDMAFWXt3nN/0gZK/8 RBbSwaaUZanYJ/6er15SRYFaOC+MTVJFNoGHwKkbXj6K2B47YejTHd22cd6d 3/wPv7t5UF5eXk7NT82dWYYp6AwG8Wj8l3/1f+m2ilt37g8cLZHIsIPK9YYv Uh1bPJtfPrd85uz333mn1Wmms8nXX3vne9//7sUry53hcPPwoFCp+IMQSSGr Z1vd/sJSbmN7v1yszM/MQWpNT2WeysZWb7yTCem5UDSkW+BI0+OVK9KHzmjk DNpjuVmfEdjdKof9M3/l535m7qKtGe2tdbtafv+d77/rWJ2h08uNp7kwggyp LsSMrpm6jgt3yJUJpgQ3Xby2wgeswtnUx8dy2YFt7W6tRkKmX5w/AbPveOwU fFgsSiD2DH3VSquwVwLF+f3ebqfd6fa8Pj8Ygj+ABrIddpjz9tuvr96/+/Yb r+1vb7Ub9ft3biUTsTt3bmysrq+vrg8sNrvXIE7p/tPnL22QDIUCoVTi+++8 zu65t3k3P5FaWp65dePq9vrqa999KZ1IXrpw6fat26FI7P0PbmaJ85mMLxTo 9lr3790+f+bklUcv37r27mQ2lU2FDLNP1jE7N0siQGgaDIeFUvXGzZ3RMNu3 gqnslDXs7B1cX1273245m6sHO6uHzWbF9HZ0ox4N92dnc1B1eFSvYeKtDBOf xTp5gdsYBj6Jp/x/SQ2GEg75N3FIIAYF4mFwXCh/DLXE77OMmCHmyp/jdL16 gP958Bjg8LoBo+oD/nYalWK1dAAF+O9/5X+5ee329tbBaGhiVsFgeOAMARBb e7ulevXMxbPfe+2ljz3/7J21W3fWbn7jO1+/dfeDVDw2aENgWNPjE5FQKJXN 5Mby7U7n1Tden5qfDYYD5XKZC8okU45lY0UBApim2TaOAWsfYBSCWYd8Y3S6 1uFhyTC9vb59cFg+KDTv3tu6dvV6rVRcWpw/sbBALLbabcwpFCTYQWGzCELA 8JVNx5PvBGfJUzwYGBpgJxsNvhmW2U10ZBsOIW0M4aU97ER+U3aibEZZS43X 4ZUDhoktBk2v6RmxRn5d27p/986999967dW3X/8+i7a/s33j1q1yseH38Xki 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 GPKqVCwVC0UhQqFSr157a33tbrNWGQ6seq18WC5UG/Vio8aHHZ+fh8colyv0 RSQRJMcTpcP9EXlzLGTr3pbtqVnaW+/fX9us7hYaaxsHOKYY4vJUcoDsyXFg lGcXTz361Aur23v/6jd/GfY8nE6W6o3dQ5jX/quv76xvrjaabcMfSeUnU7mp wchXom5iDTzYVwBgGzCWQtlQIJ5Ln9gvFOxhjRxSPJseQOIA8T4xm+t7cAee 927cJQrouplJ5TqV8smZjNZt/5//+uLX/vPLUB/VaoF42h00dN/A1tr+kF6u lZqNdrnePWy2e8MBKqRGq4kvyE/mdZ+5traawwF7DCyLWl8ikiDM+UzErFYm HQM+etFxYi9ofiGpqHEkYpamT8zPh+PJYqVaODiMQImEQ9VKEQwFzVisd3bL na3D1vXbewcVq9qwvb5Ivdcs96rI+7j77Z599YN733jrlVAo/cZ7795bXRsY 7JiuEfaj5idKLyyMA6w2twvvX1+/cWv93tr+/a3ixuae1bbINBKJJP9qLIWz 5IbZ9NJBoWwNRRhPEPYY/sJhPRAJT86PQbiW6xavEqQHIJlkhfPJQK+xdbh9 48TM+SsPn772zpvNRpUiYoPCYKvQbEPM1IuFcqdF3IqkJiZur96BCuwDTIWe NfChCAOisVir3hAZ0hDEPFi/v9ZpdYic2Fw8Epibnjq9soSKe2Jq/LBWqfd6 WEF+aiozMbG9vVetVEN+it86JSIiJJ0n97YOivgtO9CweImohXbd8AJZEAj0 7H6l02zAdGsGK16pNq7evBpMRVp2r0m3laaZfn+h2DgogDG6Ugj1RQZDP8t9 WO5Uax2S02gE1ITWlW0YTAUDiVxmZe+gaA8bIteRikmg14OK9HpMp9Fu7xXq HWsYisSpNTSrh6bejgea2cTQau299r1vfe6zL5ZLRaoRhFuMC3hCPtXvm4Nu yPQlCq3D+4V7f+mnfuqZjz979tJ5X9APNG222osLS70u7CVMuwkoZaWo2kLr QrwMnX6nWatVi+XygT2y6S04c/HCwNDDdKnMLty4ebvXtSKkKs6oWa+S4tTq zfW9etfx2UZ86I3qwQT5GWWHYqXY7DZIYU4snL508bHZ6TPJeLbcOtyubnLb 9KAZT6cAloEgqzNMJbM4Nq9OjxGbYFCqihouFIi0auV4NIhEioIai5ULBOKZ 3OyBxI/2CG23CDh88WwetnivtLdfQjpeGxpePE6jVQsFtVZj3+oVDg7u/+Iv /o3f+M1fe/vdd//BP/mH3/ju/xFMBGiLCFNtFlwcbvQ9ljnyRUEwzguffe76 rWvb+xu5iVylXsENQuZR1wH8kchP5cbGU9loIISParbKLQrzzSLAaHd/Y6ew U23Xn3j2mVav6/UH52aXrr7zHvXKMBJ1oCmlD6tTbls7laal+3FbHcoJusnm AKZyG/KZsUcfevqZp56/fOGp5cVzSydW3rj6CnWC3tBudVtAMF4A/NFqdvll 9P1gHbYb3DrQTDf8oWCInJJIMpanD29Mp0ej04Uf3g/nzYZjNz3eou3sdlv7 uFej30AhZLOz++1hpeUcOHqp3z9sdQp0Bdk+/1df//4//19/1U7p//o//M8r j5+8uXcnNTez9Ogj1wt7r6zfPAi1nCmvN+8dBrt/+H/8f7zB3u17b3/pS598 5OHToYixs7PR7uKStHKpks/nc5nUEjrZ8XQojOCu543olmn1/P1gNjS5MPGH f/T7K4vzyIomxie96ApJcfyhcDQWyY33AsmtrtOGZTbJswf+0EikflSpHGjy uGPFPvfpn5vMnQ8Y+cnMSsCbQP1Qa6N+08AuJMeJSMTudoiWzVY9l09D9dhO B3UjrpM0Bjo76Mtdv7ajjWKaFjGWQxNsu+xEvm51d8uVnjMqN2n0oWMH1TMA TRERkPfQ+RqSpUG3Xc+l45TWkd1x2//Cl3+y0aq89L1vvHX19YevXNgr7v3+ H/0+MvdQOlIZNDb27wMgDotbp86cOH/pTDQehhFCq3T33howUcrJRG/Ki7Xm 555/oVmGM6G6VScv8fpHXh9+YJQbzyyfOrG4vMjGikeTKNvXVjeoyMOZkbTc 2dzcrTW3aSHt9XXZ0BTckKBIzSwSjDdr7Wxq8i/82E/THtFp2Pn0+I2b7799 /WWybuE+JdNRekeRBo1wTBTD2q0mP6LyCopAw0eahleidHfpwolUihtoC/hy C7DwwqCvbk/6GOv1CkpsSCIkiIrAATiQKg6CAU/XQulXTCR8e3urt26++9iV 85vVu91R5ZXvffuVq39C54YJ4q8cJOEG49G11fVUOl8q15OJ7GuvvZFK5n7v 9/6ApIdSM7eXFISvlKcoyp08vTIzMzWTn5jKZHLQigmeCUIeOpKlpQUCghHw /vr/9hsvvfnqvd31w1YlnInnpsdZOHJp9BakUVJWa7Ya9RqlRmoT/WE36PdO jmcTcVE1+Lyjt954FeJp1Ic9cHgC/JUWVFLnKsnnPmnDgLBAyVqIydGw22ta dsketgd6ZWjUjTkz4zF94zOzjW5/77AEbKDS4QuA4EWkDotE5qvYaHlVCsum PmzWi7G433bagLJaZf9zLz7/u7/9v5+Ymv6Zn/5JzbKq9SLGnM4naTskT+/1 Wtxq8A4VIW7K+tb2N7/9LqVrBCUBf4TSmSjGBsPD3b2nn3i8WjxIhn0QTKTE MUIZYhKvRr0rFAGwZjvdwe//8VdffW+1Ui9uFXYRGiAC2djYpaIDvUiiy2+D wkmeArAWmhnxhVBZPPexj9dKOOkoxN3v/+F/dDwNr3QZuFpGClsi+yBlIs0i w5ekEDoBltqm4csXlZ3ahWy/cmUpn48bC8Fx8q785FS11d0tFId8ctKEgB+w g1mJQHFgybWBd6Q8Z/WaJdQraJ52d9ZCIf1gb/2n/9KXmpXDKw9d+MLnP72y smj3O2/efGNpcYEiBbeZZgDsCN75v/lvfgmL+Uf/+F+l0qEBMFHzoeinCouA Pmz6t/fWn33iibnJsYSAejMc9EE2pDIIIiPhaJys2B4aja5Vbra3dtaDqQQw vd6t9lCZw7cNoFfo8pOLlP4QbpEzqpcrZKCNWu2/+ukvx8MRdub3v/fyd177 Gjp53SMVQFGGKm2eq8TutjtIjFgsSoVku1Ce1MNNryZ7rK6trODlQ8ZyeNID mTc2Xmo0dg4OpDwLn2qwMUGnFBvRUaMSQTXCh8E24VE73JlGo4xqHLYHZe3p 5YUvfeHztPStr907sbxId/RXvvIVODLME4MmAkM/Upj7H//5P/+lv/dLB4Ud j9evKim+VqOFxbA/2o0G1WariWs4iw4eeb6DihtWLxyChoP6iCQyfRry7q9f v7V69e4+JXprYLW6A3Sa/ZZjsbPQC+FEHNrIhbhDGNMbdLS+03VaX/zU52Cy aS36kz/5RqteIWklh0UvGA2GWc10KpXPklPkLpw7f/L0KTbBYaEgYlH2JpID 0/N3/87fGMt6kJFx06g/Cy8vlVceouYa8Tk0aDkR2DpsNCGQhLcB9CPjHfq9 BNoqUoMp2s3baDJHf/zVr/z0T/7Ye2/snVxeTifjnf32J5792OvvvV1pNaKp BPKbErLE5YV/+S/+pz/57uuZbKLeblM9isVNavoUkortCkXhaNj/vXdfPb08 //RDl32hRFDo7K4vaAxAH2ir9VAinsxkewHf/RMzkxja4qIftOkMPMlQBm8R xCnBK3uNKCRhLIplLcwu9HtOhUaPmRwKchjdfO5vBUPecByTGbLF0M5BUvnw wT46MtCJ26CTf/sbv/bOe+/Um3UCgB8UnkwbHnSBgXpl1CElfzp+lr6CM5ce 3iqWr969D84CEHt9OmpLYhMKOyWyBBajPGADezw9SmPDWCJOiYUVpl/HHIx+ 7Vd/xU+3x+7exYsX+Ny/8uv//ld+49/OnFjCQ42o+fp8xcO9i5fOXb/+HliR /iTdF6xXG1Mzi8W9QsTr/9TTzyaQc2jaUw89TNd9LhXnegB2oYgJs4jvjk5M NQqV2NLJxnYB50XvLOIOr59t4uf2IahCVYFIA2WpRCpDh72R3AAJSCRuNzvc e+IkAMpGMq8r+hcDUd03orxyRZGjUTyT+n//1v/+9/7+f8uLS+UBeBEMPPvI I2+++t3z51ZEUHglfCKVp71zsdzpXru71iZeorG0oYBa/Z50hcKUchcQdCA0 FqfYs0JBPykLtzEUCFbKZVTEn33h+b/+l3+OYAR4sbXB99547Z/9y3/RwV49 Os3p8skGtODCKdFvqChIknvkEYYZD0Xb1fq7r7xy8uQKEjyta2lGUErA0rtB cgKtxK8jhAK0iDBBa1nwod1GIwijD81Iw0WnH45GsHQcBe9DcIcyw3nBq2CK qG7xgTAvrXKNrSc8KPydYx3RoaJ+RI1HsZw2FINrLpSLFx9/JEgruGkgocDT 5UKhysFeOAK76TFmQ3mddj34tmqt2mqD3gkUMPSysrCMcFD8l2JYlUaQ3A5A 4+3jiZQLBIU7FDgN33Mff461Q88jEFr3fvfVV8F2pOtk39JpJVoC+ROpyImi l3cRkQAFyl63/Re++GOTmbRNDwLhxKG/awjOo/pPPyjirz6V0fZgf/MAqF48 rNlt1Cg07ViF/UKlWEmhPfDDW40wYDRKrALqc7GTgS16PnsgDUpcCXfXNCyr LZ+FZF+ViJQYUmINtxBjJExwU37nd34X5hWVCVwVd/anvvTFman84tLMiZVF eCBWd1AslRBekioyzkAa7CSsiIcjLvAV05A75YrASbUhUlXrDJdt+gPtnnX7 7v2Dg0NmSFA2wV+gbs1l8yLaEfW4XIAYu0xMYK9I2YRgQfCmIqBUHUPEDdSC MAq+lpudcotl4Wu70uhXmOSA9qZtp9OTyWQ+Fc9l02O0ZfOcyE5OjU3K34v2 ExmN4ADUdPC+VABliUiq0C3R8wcHL6UGB4KYRSEs4GraZJgd0J48+AZSHx8T i0QX5xdEb6T0kf1+lwEHU9OxZEofGw/oRBDMp0cj52iE7gn/Ijox2C7VK6Z0 b6KmVppU4b9xqtgGpstKsRaoB9DqNdutN996C2t2IS4bZ25ujoAhsjql0pE7 yadVWE0EVQ9wMz+kioHKFnPA3YYjEcZ0jDOpY3pmjqkhp0+fOHdp9vT5sZMn I+OTwfxYIp31UMyIxhBGRrLZyOwM3KYOm0Nsln4R0TfyFaaMF8RqsH3enfUR 9ENmYLO1cQLSkKPU7pj2kXYNMh8fyFY9sbQkciwlWKN8u7u3SlLRt8oegz4q 6cHk8rEZ2XhqaobEa2VHospV3SnSqSLfC43Neoi8mz+huxJrgYfkX15+9WVc PpYDUm4264snFlWVG0+jtp5owlh/UQDj2myrJ9S5Ekoj4Nnf2aXvDStGQ4ho yGp1ujReWhRjWF9bY8ZLrdZvVod0M9K6b1vldqVVhwgqaVYb+TPAFyzUon2X dthavdugyNDlPkuXplutQUvlR7TvC6NrQUSHV4tG8HrC4aBGRYQbifJVai4U O5aX+coi+ijH6xqd3hqUmccOUzzgXgBKcCjYV5sqtd33+n3cZFdoqur+YmHS NCAplGwo0U5L87WjFE5wpGxK7c7d26vrq8wAEJLX6U1OjlPGlbxLxPj4KLAI n0DUhtwUEc6qvIzl48ZsbW3xulgi/oSIy6wOKkW4Gfqpe5SykK/Vq/AtzA1p WU1b2rSHkFfFVqVUO6SBkEIJqnp+j0oiD9ln0B5qN6i2XIPlASJgLbCmanSF hD9XR3TUSokQhD5D2QmDE0vLeCPV60SuqcPKyjZ3bBSaUjdsdtpsNKmUSCmW 8oJqjVf35IE2V/UN8Ku4Bt1DngkWw3AA9zQhSawbDRh58t61t+k9pveFfEPd SBaEkCJRgrAAFxaPRVBFgQOBY9JGJYFD8jJ6YVkmuF3RidRqvUbNIg+qlEsH VLl3WShyNN68ayM1pBBja0GUDh7b2++MegHCezDIZyaho1s7lUIclkym0yI7 UKIqHvwCQa9cruIJaKitky532nxz/JWmFDwXC82qLC0tYSu4C+4ldTa6rEP+ uO4JABh1Ctu4OfYwNG04SB3YZMIBJUlITXe93IcYAppgYge8ASIMatiCwlWr q6BWD/TP7fv3yOOIzKF4lEq9aD5Jq9BbQC0YpG6UULOJjADmfG5cnILqK2ax aL5Q7lly9ihQMAYzmWRZ2SjxWHJ8HGCzODaOJDtCvGG/kujl0hkopmw6TSGb pmuEIcp7iJ+RT6WmDvDBZOKAKsBIp0LhoNOo93tsHgTzYDLutUAM/psnvp/l w1woN5FnKjHhgEugeEHtBjKpA6oJGWGExxgnvwqx1W5V2+0G14gcViSVA3yU tGfg2dhHuHtqm1TgkPuGgmI/1LiAMVgvW4eA+Df/5n+NOB9M3O73vvbNb7S6 TjwxAXeYSo6hX6rUW3C79LpVGlUa+foAq0E/QvbUs/7KX/pyLEUhQ8C0agIV upZqIBoZAIbpoxNuhyoLl8DkJIem9GYHVXP54JBgxKWziCw2V833VOsLzAup VxE2EfjYPX5yK8NIh0J4N/CEcP8+pBeRgA/MIUgIII2DyE2OleoV5Fff+JNv 3dteI76StGEisVi01elPzS7T8E6VWFPuV3QkIjNW0gh8GdLfAOk/n16cDHhE wojI5kCmAHzZvLCR9O6IrpJiseHYn/3Up2YmxlHrUPF+843XYOKLhUYighWM dxDt9GDC++XyIV4S0QWNKbgwH6yDpv30T/00U4Fg5Qd9HA5opMdd77Dhqd9R ArYHSNXZa0Eiph9OIYBr9ClnEU/GoeOJ4iGeflIU0TLhwhMpGXxFpsEfsZ3k PhMyg/xKKJRM+mGvRNYHpRGkqI5Z6z6fYlwGsXz2zTdff+PNd4hghDH2L13I CvPoRiKQwFD5JZZKUnEiq9p3AUrmvG+Ylg1k+OLC/ESUUKDeaTqsrWw7hvj4 4qEA00a8gz5eodM7nIylLp9aoZsoF428/cr3rl+7mklOLi+djEWov29anQYt P2zjfDqF6om9QsTBdGnK+fTnX5ycncLDhqKUREBvCNqD4QhhKsoMMLgHoABx B/G2DLbiI3GDhGjQhMdBqgfIxTZAAhQaKeTC0PNvIES0CNwfRH8gZMGF0vLY ZVYDJYYh0dwic0IKgSlEJydqhSKl1nQiUSwUv/q1rwZ0Vh9lPb0FAfrJMCMB BOx22aA44gcDMVy/fiS4QC/hR/ADkxePxBGwzS8szSyemJ2eGQsyzATCedga T8YCI2sxmnOqJbPXjKHs2t7MaM5kIPj55z8xNz1Oy44BgUHoZGAI8myRr0Bi d6nlEDnIkHZLB1606gFPs4uWEc2HyMewdxYFdyetCKp9Gw+HHpunNKxxD7F6 xAoibeEOqt4BCb/yREMPyBKhv/TymjgOyZaJ6pFQkZBRrZCs0TpQqdXK1Sp3 ZlBtrK2uHu4fWq3e4w9dyQTjkhd1bPAcy8qoJBHjzccW4GRoX1RSeLEsySGH QwCEau0REpUucEnTSSYMrd3vAK8wdowCpjsVDj//2GNffvGLxbW1bDg8bLWj DATp9ynOEAt86Ylf/aOXvvry6+1eTXV5DhjNNHB6qBZITpjSQcFKhP+G8T/8 P/7p3/rbf2d9dcMLuhJRmSTwWA02whthIKpLWXCQZBEKLUsXkmUjXpGxFZKy iE+VzkjFVOEgoJNkf0kvKZzAEE+H99gu7K9tbbK+tCOwpoxQgiydnmZEhn97 ZzObH7/4yEPE0Scff+zWxi3e7+nnHobdfvLJJwGPRtKfFCpaNZrLRxGdmWoJ ZuAPD2gQGSClAh95MM4oFsJVQXJLG2inbTVqn3vu+ctnTlW3t/PRiA3aKRXD fu/tG+/T/Ht/fUOPZ9947+pIs07NzZ89sfjUlYefevSRR8+fHctmhhSg63WL fTkcQu988jMvgBuSEPX0e/IgbvuAR2w9KoTSY+RibTfgYTX4BoVw3PRJrZQs luAdQDD3QDTtLLoK5SSwDMJpt1pzCwvzi3NLC0tjufzE2PgJZtwtL1O6Ib5F ojESD0g4VuGVl753f23txOIJ5Hx0b6A9YOaGkfQm8VzuWyrVqYA1d4iI7ErV DiXNndxvtXilUqnRrPMrVodKn6ffbP74Zz/XLJcHLSbcdEr7+2if+LTVagW4 eHd3R4ulV7e3B/0uHWERHy0cQ69t5RKx5ZlZGjsT4GYYiXY7n07/2Jd+Eh/r HQEFpemIq6blg9yYS4X5FSEeMn0+lRp5ctSO605QUNNOlKeVD88dB396A2iM RczKhqDobdKgBaEh+qQO0hReDVhF+MQjY6CVSiWTyTKzC/7b6SK6dA4Oi6+/ 9tYUZNh4HpvtSTXWayTNtJBrXAUVPP5O+XnuEzYr90TqAJKpSiLNa9D+RHzE 7DxewBHfQ3J/8cXP3r52Y3t1o1lHotOm2nHr7m3KyPTZUeF86f3rh9UKlwvO S0XDyDe79fp4KsWIJea1MXZyenySNIW87Etf/HEyVUwZKl2VT6j2q55u2VRq RIDqwxSuQD6j3FPJyHxeacpVDfKyP6TXWZ74dYFaklo7HjpJiEm8LGYqSYzs E/JHSkGyY6koqUKD9O7rTOWzmbvY6du/+R9+i66rw3JxfXPr7beubWztGEGb Jm+H8tTExEStVkehp8SgIBeZzOm6fKFmxOCVqL4PM99nEiUfGREAWfcTjzz+ 3W99m7uJGVOhajCbhzsfDr/6/vv3i8VbB3uU36CjUlB5/L1ttSrVJHzxwGEj JULRmfGpJx65MpEbO/vkM6NqHTEfLo+V8gVRtKOlsxhZI3M7MQHSxm6H1xDL YJfxGA3qgAwPimQFCJ0BKJwkTNIMmRREosFYQMevJuoQw7WeKJDFEokJDPOS tfYD7thZoVQKT+mjXCi6HHN8bu7f/cZvUG2r0Y3UYwhZEHRq5EMTCKZCwaCb IkCksbpyUdLOdTxXS+1LtWw08vs91H6Eguj2LMB4Opn99re/gwCjXKuvoeMs l8xYpK15rq3fRxXieMzTK6fzyfSJpQVJ+qQb0ZS2XwLWUCNVodYgQ5dqjQvn L5FMGBCNSA7hSVttagVcsHievl3Y3uG+48hwLrRLSA5LePIxx5O004OaCFDB 5wGA0esBsuHzRqi+R2LQx9S9tU5bqzYHTbrxUK60JLKCv2y7tr+P4hTvz5DO jd2dN99657V33nr9nfdeef3733nle0IwSNjzgSOlxXDKs2CP6HsNjE9NsPXo zeSyq4xRlOxX+UblC5QmFW2hTvdNJBhpdttUTNrd1guf/CS1mT/4L//Rz4fz BJAA+3XzxR//PPXYr3/nG/VGa2mBYTMncWoL01MfvP12q1ycnRirFSAwgyT6 dI0HqEGboMzw3/3v/4mGWqRcpBkMgol7w79CFHSrVTJtIsfiieXUFCGMUQY9 LrZr9xG2bzfK1WbdS19eD9FMncGQfOjtzY10OkvmSvzOxuO5WJobe7C6vbu5 1unUUqnY9MICSfX93Z1vvPzyK2+8VR61ZGacGUF9Rxjmc5GCk9zSbdRv9eUm iYJy5AUWkxoCuFRHRwDeU5gcyjuSqh37enc/CoeDQUsrmAy2kdkAZjB4cHgo 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 IOzbgdGQJJyx6fAZTJ1rcwfdOo0S3EphAYqVkI5jVsdyDqX+KiVl0Z6As3SN 0w/ddns5aku6VVG1y8lItN9iWXITVMFJlABSIpA6kzS+iKtSZ9NIBYW3EY+l XA1xWBJGjjKSA0jDAa6nK1On6ApQIxVYSXg35qxJH40UH8A+CLI45BEhoRBU MgZC1eyNv3j6kgtWkDWRWorcRN5Gwha7nx0E6gthpUzoHdiNw0pAi+DQ0LnK 2DcQUYcxXlSh7WSc4hLOIhT0RuS0BjlpYkSBk6mcuGTwN/dT1ksIWJAgB3mJ Op8f0tAg/Sn0k+B3qKFwHKskYmQ99FzLmAVWlp0L3S3nEuLgxKyOKCXBim6X g+rqOxKyKD8ks83FUKSbX3wVpiQ0MLQhDkymPrhVPsWlsFhEaqV/QX2n2jwo kMokV+RL6kAx1Z45+v8Cvagwrzr3Q9YAAAAASUVORK5CYIIKMwQARABkAAAA AAAAAAoAAAAAAAAAAAAAAAAA9Br9EXcGFgIAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAA8ABPAwAAAAsgQK8AgAAAANBAAAAAoAACMAC/AMAAAA BEEMAAAA/wEAAAgAAAAQ8AQAAAAMAACAYgAH8IYyBAAGBsG6ACSQEzBVTo4B uGkSpeT/AGIyBAABAAAAtv0EAAAA3goAbh7wWjIEAMG6ACSQEzBVTo4BuGkS peT/iVBORw0KGgoAAAANSUhEUgAAAcwAAAEzCAIAAAAzfaQdAAAAAXNSR0IA rs4c6QAA/8pJREFUeF5s/feX7el13omdnHOonKtu3Rz79u2cgAZAtghABCkR IsXRGnHWyEOvsZe8rB/9T9jjsZe5ZmRbEodB4lBiEkCCCJ37drg5Vc5Vp6pO ztGf533rFlq2Dy6qT536nm94ww7Pfvbezv/n//RH4Yiv1y2Go4OR0dDh8fru 3lY0Gm42HQ5XMOhPlSrdZt2dL9WdDt+dO3eWl54dH2y3mrXpiezl83MTI+mw y+vqdh9+db9bb4acrkQk4uy2CocH9VrJ7XXFR4bb/V4kGKmWK+1G+4XrN0aG h+/du7cwO8frk08+Oj4+rtQr1Wq1N+jGk6lWxzEzO//F7c99Pl86na5UKi++ cH1+fj4aDn/44Ye3b99OpVKOQa/T6XDA1evXdg5yhVIxEolks9nJyfEHDx7w lVgs5nY7o9Fot9fudrtut7tcLh8eHvI+4PP/1m/91sLCwvvvv//Jhx+5XK5I MMBfkxzc7ZYLRa/Xm82kuJ92szU0MXZYq7n83lq+EPX7eUz+NSqVoaEhznn9 5RfD2XTD6Tgol975B+/13K6R+cXjxxv/t//h/5pJphbOzAxnMyOj2eOD3WDI 53a6uBlnr8sV/R4u4nUOXDxys9dqdloOp8vj8bnc3k6nt7Sy/tVXd89fuBQJ x7Mjo8lEOl8of/nll198dWdr97BcHyRSQxcvLIxkE5cW50aHE5vLj+vVwlAm OTUxnohFisViqVTxcDpvoN3vNzrdvtvd6w7a7Xa33x8MBvyn1WkP+s5Or9vp DRwOB7fBeHYHfa/LHwsNtxvdVqtlPh/0eA36vHf7vIwP3+fMfNJsNvv9vsvr czqDzW6XA1w+L59wZoebdRNsN5qMf8DjrVWqjVrd43TxeL1eNxIONlkH7W7P yfldPefAzfrxepxOp8vlqBaLQ9nkzsb6ztZ6t9VePDtzdmHS43F+9vnt9fX1 M2fPT09PT05PvfLKK8lM1uF2O1qdVq3Wa+kGHP2Bg+eolmKhIOeqlMuVSo1p ikUTwXC43+27ON4fcPj9PI2j33cMBg6Xo+fod5kbru928ayNbpuH5lkGjr7D 43Y4+6xeJ1PlcQ+cHDpwd51el5vfeBqno9t3NAa9Zq/f6LVrLtfA43QMHD1n v6cBcWtQOoNAu+2LRsc9rkSj7g1HEt129eGDT3L793vtA9cgH/H0Am6Xq9N3 9dwOj6/nD9S73aDP22zVg15/tcbjhFnMLkefGfT6g8xUOBJrNBpOj6fVanq9 buax23EHI8nJmcXU5Kyj5zk+LviDIR7E6eq4PX1Gutur97uNwaBVOz7w+9yl YjUcjrY7g2KhkkgNOwaeRmPgdvtZ4K1Wz8F8uH21euuoWNs7rG3tHh0f51k5 jBkLw+MOMLMsi3A4zBLVejCryO8L+gPeRqXY7zOQfe6TG2ZJMLJMLkPCr8w7 M5KIs9ui/FKslmr1eqfHGHf6/a6j22VIQwFPOOAb9FrhkH/QaQeCHhfrqtUI +bztTuON12782z/8ny5cnP+vf++H9eZht19qNItTMyOlUqFerwcDMZfTXyk3 w6Gk3xs7yO35vY7sULJaLddq1fRQ1u0ZsD28PncoEkZQNNtdv9/v9fq5YzaA 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 Vz89ezY1BqswGrxTkbvLjlW+h+2uYNDBav7pfbmeIp8TLmSPLmd3dyIXx8tr anHSTs/Mcccbm1ut1ZsDvAAAk2NAei2Mc6IjgBHcbUDS+/v3Q6OWFrk+S1A5 eMWxE8cg09X1jZ9cuNTa2fP0i59b3dp57c13Z+bX6In++Cc/4e0eOXKIku9P fvIjHgxUJ0C9ygrsGg4l3hUrAO2CGUWvsUBcIlaI2DXw623WkW9ZsLE6PTZU VVKsBwZ9Hb7TwMDQndFp/tDcvLqau2RkVdDhjV++egXtT9X68WNHP/rkYx48 kTZ0PdF5rrayvol8uzdur3vDlBqgLlpeIUPCu8TS6e7q9u3REURP9dRNJC9R q9EG9kwOWXIkm89RWzEOx9TpIKMBfmc/N+KYhP3xesyKZwJPpDS0UyARaxsl /Zo4sRjTZKMD1MwckUTtCHolEAxgdT8V48kcyfpGc+24YiC0xuLJ2mzMkIaJ 169dNeX9fb2Ek+hmAzytE3UZYhXFXsoAAP/0SURBVO6wztYhjHJ5TZo72Ahz mKFFAFksnb59PTdvXhPAPffcs5+cPXv58nXMLXQMb8Hos5MQ/EG02i9CFZMj b0irDAJXw9qLAQkHNpWxpYJmx7clrTY6AJmKKnMrInRMRcCSWE1xVCRaOgPr 1oITG2Mbx0Ye5Ay/5FlIJ2scXdm39Tib7wCZ0qRkPynDfQxlHrTsCwc+lT4t oy65YMHLWFhULbaP3YwSuJQ8zLBGfqMVNTs3iwHS39fvsj/9+OzhQ4e1Zvch sLVvfvM3P/e5z0eCtyDE0tz7/OKy7DE2bxDnsW6pZ1RVW9H30fmQXgkDtzM9 NWlg9/a0ry5OlRSu1zeUHzu2t1E79spiqQrf6+0ysnHQlFcuLa/VN/hb7X/6 T39Bx+KF5z8fJM6Sct0G6VmilhiQro6OSxcvnDp+Qoua4v/6v/qvWQGjkyvt MpBvFMLnLihghs39t7/9bZYeTnzm4YfYM8X+goJv/dm3ELXefPPNSxcvR0Xd nijCuXDhokhEwq66rv5f/evf/+lf/ezQ/iMvvPjiiy99rl1RQ8ihhhC0Nnzu UwpVlS33xQFlk9vbzdoRNzZOjI+ZAOQwFjAdaPHJbIon0wEYilPsWJapM13s V6K4psLTkBOM7FFQgsImBogfzKCkDBAi/IlhFfS/wH2LDAGk27t0rvUzOzej 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 fKH9kxPKUebKDDmI+KoQHxaQnKiQH23WcrcSO5ubZpHX4OVKbmdnWE59bhzV JhYfTYDGJ+IRiMidB8try3KtZj/geV5GAuYidveGkN8PfyKRECLacpTZq5BN SmkCWnaB4Gl1Va1pBozU1UTLYJYZf54YGsfhJz/5K1kQISJHwG6KhkhRekDR UlQdKlzK2DyRufAcWMG+5Vnb0KhSCVrtc6wS5yGPI/XuhuCLtwOr8jwz4Rk0 49x7O8EcceBHO6osZxuZk0rYn4pd5nVidFhR2SOPPd7S1Xf9zu2fv/X2gYOH j588/vxzz0lbaKd2ZF/31Mjt+fHbt698erC7ZV9HQ+Ha3MrMaG3J7sLUyMrc RO2e4o6G6vKCzerSwn09HX0dzQf6uk4f3n/66KGj+/f2dbb0tjb3drW5CXpa jbWVzXVVDTXaUhIhUiewuL2+PDs1dvv6tbHhO9evXLp+5TL0+vatWw49KVrb k01hqlR5CUVBCRGcapq5soNUDwKVxJfoiyZdBYV1oY3SZe6Bk1aFciZp8eTV 8VQ4X9nXTOnDnW1HTALApeni4Ew4YFjhpOub6JApn/VZUitlj/HTgiYaHln4 niHbhq/GOHsyAv/I92QWvpZLYHrYSBXoppjThK/jeZ0jovw0KeMlICd83gi9 U8SdxIkiXIlC1FTYLfbjxlmDMl32tbZwklnR1zIOhVJyuqBVp/vo8CjA0dwK 7KK9BQtYUvTWL97s7VEd0sbtHZ+eq2psfe6lX6murW9qbXvwzMOfnj935Pix m7fv1DU1TrEO/fuw0uBF9BY6uzsxcqhCJUX2gD7sXykygyOv7frcAsZGwNGB tuZhLUROhPwbINRCVw8ccyWOmcgrJkzW5QUEG7z0QE7DK8ps2oCnI+Wc9BxI LoRVTlYsSCjZ/GYrkRzWe65qKpmLmpN7VN17fZ9jgWfXlp9idi0hXyL/iqKR ytt2ncS6F4Xx2thsaGg+eeoBGWNr/sLFy9dv3HJ5kQzfw2m9S8dZMP3iiy8J qAdvD90ZHBInITjye4QVzjqMvepKzlvptatXQVndXW2a7Sq36uxskG7v7Wvt 6iZRsr1/fzf4qr4+KkpsWyFufV3zyMjEv/x//MHevV1PPfmMi8FsyViHoF+U r3uFXdvT26cCs6urGwtLUs4scDo1fnzvvfdefPlFqpWF/+9//4eYWODUTCP3 mN9LokYZwh/+4R/+w3/4D/Fnee8sGrIboO3UqROKc/lZXu83VooIw8lsxKJ6 SiCc1M+sS6c98qQmfUty4iurnlHTErU0qQWxyRAHcUtz23T+DlM+PTGOinLz ymXjJPAULGPmHj18YHVtWdEYiQ3RkPcq8DC1ih3q6mss+ERKSezOnPBNfmsi 0IVz6JlcguIt+XTN56TNQ4g3lEADXSyVIrQ80NltJ91JX3311Wg+HNBERYqH 4ifAPuhO8pmdusEixPEM9Cq+LioL7wbwGt2HEorNaU0qt0H0icg3pGzuVRAm oDtyDREFS4KDZmND3xMpF/pGfmNP+fzs3MCtG/rPtDQ3a5va1rP33K2Bt97/ wHLzw8Hx+VpRKFRoqKtamJlqrqucGhuqq9yzsjDLOBJZd6hEIV6X4s5WB0KU RK+vkX837HEwpZ4zeeqtHSahkl5MYqYlbPReGat/hmaHtCA1OXtyeobvU+3W iD9s7MrM19fHNpibW3j19Tc5Gi2tHfgtoEPNOysqC9ULiHAtG+EnPf8vfeWL dGKMImcEBYffLzNLhZpJhSdEmUik7+9xA6K3ZFGI3gPYXTpyURL+L59fWg6H C1wTPRRCGt2uCN9TL8/kYZqUBBBFmbV/BhSTyAb3iUd5Ql2GDZOgsHtVBplI lNgLWSgje2nZWaYyQyU9KNUMhKEIxVtJl5Kiff19t25es4QUGuAgpwLgjZD4 qlcF3+srbg3cUPyRKsQCyJZnMyPYvdIeSio8bwou3rzzt//Bf9l78CAH4/CR fWPjg7SLz37y3tzcFBR7Y23FPcIz0Plqqup1tRq4I1ycNCYWG9cJuRrY5TWq 30hAQV5jWgujTYOTPnBqPMK7HPDAdoKLXxYDGxTsaG1PPDoUpQNxVoy3u+3T jCf2nuMt+57ZW40WRUmq1yCkpi/xafGnFIukApN7c5eR8bQpQxQl+7DZyc0P 4vd2VB+YFeNFHtAyk82DD7BCfX39Dzz0IJg5Qv6aWj6fLVl4tzjJzZSL2W0q N+5zxOJXryFuCyoJnm1gbjFZkGfpcVEKSF1CZWFmHmhu0SKVCpzcOlWvulpM rzr/NTRW1tUiyGOUxsoXdlg+b7/1wZ9963v79x3q7torGL127brLU/6KAmwV KeXCd7YNQRwdrW3odSwYSgMWrCptvqBSA4H+9773veL/+X/6n72BRXMD2asH Hj355JOWBeT4K1/5CtuR2yC7entV1WzI6ldW0Q3i1xkRWDsil3daUqIurMHW 5lbJ0NsDA65DpkeuQ+mnKRKMs6q2iLDIchSX+U9ow0eTNlXS2tnSsr20Ul9T 09nWVklMKwbRiNEfi4N0ZnYGDsuHlflykqvUtEqiU0q0MIrzNRyUID+lZHJq KhftYUJZIwhbfvNDwTk+BA3TfSWmoDR0CccyemqVVwCfHz7zyGuvvSEf2dXT 409qckL2r3wPz8kbAaCpLKgMDKQnjeJ6T+rJpNcDQIDEF0MmjZUIA6WsPTMM QZfOjl41bEP4/iRDeajlLFTgxYHDfmbBU9OayNcmoT984fGRIX5kV1vbkcOH uCM6Drz17jsd7a37+3sb62sYyJ/88Hu1e8rmZ8b2dbdtLM+W3N3o7Wh64qFT zz155tmnHjvx4Im2npaOnradorsDQ7c+vfDxx59+ePbCJ+cunL126+qlqxfP XTr36YVPPz738acXP71689rA0IDqsCsXzl+/fmVocMAkgmdiiEqKlVOhBBw6 cEBchn5nY8jCmZbW9lZnJg0K8x5BNz1DfysvM01wAF7t4npBQ2011FzAC0lc ieYLFbiAiszonWtaY7eEnKg+P5KTUW6UPPpg2YSqC08pI+08n3u19ik2TWK7 UfQZCKFjKlzXsLSBkH9WEcjcJH5fALp8ylzPYu5SB7mE0URsQYVdHjUKKzIR m++c8IdM6kzFoKETE25zsJSwnYK0kDSXN9aglOINXaMxt1aWF1lYETCpNZbK 9WLLazN8UwObEaR3OHu0GvFmTXwryvUD3VCmxJsB7xsYrKPO3r3dh0529e+v a2hiyTfubtwevn38gZN7aiqHRocIUZdWlGn2Ix/lnoRr/G72mhsINHPW5+5h USKND6duLDXHDBIBkfWgtkW8H8SeTRyMomoUk7KgGxo7Mxbjgt0ocRoU2VBE dsAY5+AnpFLLVGwZWZKs3ZUc2/AJ0sAErpLBgQQpJIQhtTVJ7n/Y0/wgPc7/ 3XNcnOf+5GI8ZRMFa7W6WihJy5BY8wMPP4yg9rNXfw7XHhwcamxsAcpFy4Op 2dr62rbWDprFROJTUxJ7KvrQZL6wyw32cmgzRSvY8ZHR6ZnJzo72hnryvit6 vOm4zfD292P063xc0b+vS/dL0kuuq7unj5qLJsHf+c73BwaW/sbf+CrjCCCO alKnlCYaMZpFoAARufscHBo8eOjQ7cE7UEc1q16AwmwjPPb4I3/xnb9obmkq Jr/NxWBnhcz/9t/+W0BBbi3p8PcYZ1aNE1Odz38FjhGPUzWHAfm+0lI0AxYq 2jcmDYgMNikr8CFUvWU52UiQQvYlebJx3lLWmZ+R38+VDqJok4OSGYq51VVt CAjlClciy0/ZA+RhsAyTrzBtzNnC4rxd4cQwy5KtcZoqnOWwhY8QsibROiWr t3Ezo5/LvV5MPO5oDwvASu0SWAGLPmoQszprURHP4snHn3jn3Xdhi3z2+dlF bAfjKSIOtWY6WImmwJhOTE1bai4GoTaCpQQkmgMAglwZC6uSPpAgNkJCTilX NLYJSjk+nEWAZOd3uLLKulJ9eazq4tCjC/lsQV60rV0dGbzDp9xLbL23h5Oh ZPf9d99WkNXSVNvWXC94P/vhuz3tyBuLh/t7Ca08dOrY808/fvzwft0ylhfm r1+99NOf/PjDsx+++d5b+gDeHrxN6mx1I2S3NO4mhIYcKM2hxkuciBQRo7Kn TBgWdV8gkdR6x/xylrCO1FYNDg05ZDBDEtuXaHzLmTOPuPzwlzliSCShtlcB O4pofXdnLRoFMXtbTiNjmDKK+i2Wn/30LIYNWpJaKOerbktUUyFxEYPIrhOt STmR8DojU18WXW8i3oz15p9eFrhWlIUmeDVluCLzGdF/gQ2WkltZMz2QRD+p 9imk2rKEG9MZCBIJ+WhrtuLG/TPp54fzywSj+hqLpJIRSfc0vwSZI+0jc4Bd wz8yhFXVqJG1pkbxM1FY/mx7GxyQSNkyUrDWSqS4nd2DQyOyYSJCKwfuAQVK B/zuO++9qxYTMsAUXrtxE3v667/+GxWNHctbdyvwiXa317bXu/u7R6fGrt+6 FtNUrnoiJJNuDw5y/2cW5kjd49qwI2IycQDQo0E/rtRrXsooqIBIQalcwohS Ng7y28Z2GFSk51RinsR0YoOEgHckMJKUXUgdxr5kbsVsCaSJXRYrNbW/TBBq YiUHBzk820ROiNxJGjRWOXKP8meWdKg+RIVhwDgRc0Qfo9D9SinnQkUr9lHU HAHrOzpeeOnl5qZWjiU39pNz599+910tzqgmMZ8DA4Nwf46Rs9ZC+spXvsoo SaXs27+fg8jhCSdvdpZVcZ0eoP87foRrN2+AQzc7O1pQgTnNzS26b9l9Cr3Q 9ufJBTc11crAdXa0WpAAIRL/Zz85/8f/8U8b6lv+s//s986fv9Dc3Kb9l1UH U83Vqilu3lGMev0arYkjfFSelWFxPVgiDObTTz/xne98m5X/nd/5LQIx/0j9 CV/1D/7gD/75P//nQNg/+qM/8nFQZNf953/+5z6URRPxGQI4o9SngNnBG0cj CkiqZYr2n2UgOe5M0BI4ZOZdBRb0dnJmWqDOH7RS8a4jvzA1wdQmFbuVQM+U w8ohrq6QG8EOVQzLSTAJ1o8zzWT4Lvl9mTvZpWgFNj4JWGGCHQU1lZXQWyRK 0+71Flzsuu20P7FQ43BL8hMggtjee+JITnwUKyIR5tWVNatPc4OK5U+ffuCj j83secY0pVYiet8TPYKiPX2uUxQauXEeMfPKoeaS80yjiiYBVf5jLr3YRg2R sdi35jVkZFIdtYuRuLynqxBqpyCUegzWbZZLak2dqtLRxfnp+dmZsaE7ENl9 fb0H9vV6Hd2Qa1cvr60u0BjsaFHUoj1bQWNNZWtj3VOPP/TEow8fP31yd331 9sB1taUff/zhhYtRVmqI78JSSkK0FHTs7iOTVlHFH6fcKn/C6EN1UE+4n+pZ WdVw6qOHVWUz4Ghmhn2CBrCtWXNevIFuDPZC9RRi+vwTx4/J5NRAckK0LHyb 2KIhLrdtvoQpvBYziISKBWxvDA+PAy6tfntOpjCAqOpqBYH2CRaUXUeBxQaE MWZYiUVLtlVTtUBb+Mipa0Z0xwDuO71SLBJpTOswNklMQ7hsVpZOFlh1trL3 SBPHaVpQGtHtXW8JwQk1MtEZNyyIoBjsEHlzcD4DncRTkkxG0qGyIEGZcGcz xaQ1NqJIVXd1dWjJw3WdnhqXJUIFE+Yvzs9y0h968EFn9sefnB0aHhOqewu7 xgXhqgRVpmAX2GrftXd2+447w6PO54fOPHL41EPGvYhi6frS8vpyRW2FDsXz wPB5wMt0XVO9XqVMVnV9tSMFNjU0NNzW2mwUNbKcmVnt626lCn5w3377AisZ G0UlkGOP+rPTel7STO1wdFgQJYrMQh080i27erOH6l5QcaI0IYxmnCtBAXPi BesgcwsyazjSC4nEA1ZK5XFmRkTGrAZ2HQ3mY48EkO31HvsrK4EXkZzb0PpS 4WZiLRqH0N69+w4cPPToY48fVqPfjlXRPTw6duPWwNVrN0y4olVeioWqWRzt PmtGEABMwNux3UOKd3X14sUL7JXhDYiyfE+4xtInOnCHlM8mcV7+KZ54RXlJ Q2M1Ke495YVbd5f6+7uEJZ0dTXv3EtmwCuTWQkq4oa710sWrf/AHf2TYnnvu eS2xrly5BvM11ODNBP0BT/TImGc0BMSqeGVwqCerinCZDEK1hdHd+dEnH45P jn71q19++MxDxdQIAxMpLAR5mPXI0JWUKP1iVRlspV8Ao9wHIhmFYvyvCBZS qYazLLzF5DxnhwyZIIDwJE7nBXgwoHfOfy5MNpf2FC6qFREUlnT8Wd2hZ7qn ot6oV9IeCfuYAaCoOUnBhR+EOB+C70KrlICzLCGHTLpAAyU44+LcYpS4GNQQ Eoxry/K4OXfJwqaqvntFBLGYUgdBjg3/AnTS2+vGo8ckp57vbK8yBxyzSOna n7n3RkSk96rao9bAqgqNgnt16zkgMj6RBEsi6Knw8l7DtPBbo9197nMeAFZe E5YqQj+SZnXlnqX5ubXlRR3NpyfHNpbne7s79pHJE4xvrKUuL+MgWk/0dreU QMU2Vrtam1545smTzzzRtKds4Nb1v/rh9959562BGzej5ZyzGBi9KwHC7XKY F/d1981Nz9ow6Agrc4sPnjwt+1ddWeNJAOapk6f6untpGmGtQu+YHpiW8Fkz BdBnZKUTJ4Sd4SPag9r8cls5tU5KkmMz05OmlyEMqxqGNcQYmQA1tdZcor4h NUcZHWsrIcRXEqM4boJrUR/VwyJ03CnlsvV1DXv7kd6EDcu5lVYUEUX5ltwj hiyyc+wfh5YBZzTNSW6dwLznaGZNwj1MbLA+zU0SdgkuCU58mMpAFNNfvR9W uxWaVWE1Ai+INFXQCEwywDHkSPGyk24rSxuddHkFqw4Gi7C7vc1pHbpha4ZR LZ9vKUSK4+f39vSomYHWCQGTCGkx1qBANVJSW5strU2A7avXr9lrbZ0dmkxc vX4TDeLBM2dOnH5QhWJdW0d5XVVRadHi2vzo9MjY5PDM4tT69hrDenvkTpWE ZJvDb0qalKij4zlYpsGT2Dl8uI9HQsd4RmtI+9H4prsLYRDVmzV1bhSeY+Xr MBQxTKFyjCR6k8J8GyQxXmgYFeSaN8MeWHaoDGcvNhzVXCfJFtuwwZRL9IvU YQy2EOUI9ot/O7SSqY7uSXLLRHBkAW3DpoZmFODurl5Nqo4dPRFGprGJbbp+ fUCZ6Ecff/ox6YlL9KmdZRvO3ZV1yoF7ImYpLGKF1Ij+zu/+Hjuj1pa8Dkzf RWX9M2VdUV29tW0uXKsDFDvw2vUrdfXVqCV1tVXdPe31dUo/VCEX9Ha3Ec1u auYObtfWVokU1XZiQHUfPfmzH/z0T/74zzgcL7/8BWuNN3H06HEOiwaRrOqV K1c5yIyBBemUtteOnzj5ys9ePXXqtN0M8xTcMFqqxc5fuPL880+//PKLtoOt UwKp1emMD0ucGwxP34GemGf4m8IZ9jsVwkXnSB4Jha2ooot2TMUKkDwOaQ8m iRRLcTGkARnWfmOD7DRBNj+Rh8uOkALkeaBoWBIOnLBzYDU9+IqLmI9o75nI /VCfoI2ICljeCixAWgcEDCsgd9YQSWM1woylfm1Q/Y8//IB/29/bh/05OTYx NDis/CbWE6pQKpA3FlFTvqoWFhUrGJRyFphfmUfpCwMRbqh3CyACKiNZpM7y 4JxxSBlxEEdQCtJEikcSRS9klglEKa3wHEJirKq01vxYPjjV/qutxlaodeq4 68yLTBLj4blnmNBvKV31bK1NzSuL89LgY6N3rl48v7cnzOuxw/sOHdjrHLt5 /crE+KjsI0jUZ6gvePj0iZeef6Z/fz+f6sIH777y05+++fprEcPOzuVkGmPP wkItmR0m88HjJ29euSY/1VLbPD8521rfhOwzNjjc1tAi47C2uCKjNDk85k84 aKzS/PISX2NBK52CSCJDP5yUnJewTrmAZytY614T7Gb+Zla+Ce5UkE/tzxin WkoOoeHPuTfIdbXVKPoQ1Nl5vcvoPZpDRQoFBicY9HIuJO927yaJ3rtCSDYC Rmlr5U2bQNF7rK5kFDErnVWx+SG19rSxDSuZGEihVJ1qlkLaJkDaVKAXqbCc A4+2rLnvoBdFRWdGbZMrh6IVMW809HUiBqYQSjp6sCvaDlm18tbmRsYGrENu ISVJNlIJMtWFCR6TAzu6Li4EzMKDw+uzoECN6DbshHDVoaCds7XX0NzE6KuY FhoeOHzs4cefbO7sWt7aFAxuFmwzpjzlzcL1O6MDg2O3ltbmSytLd3gyEXzv EltQJ8g/V48+PHQHc0v3oC9/9UvkNt9+R9VytatGrQsbVKj0sSLVZ0WmCyVG MaccgaEANXiGuWRzzSOvI9SBgbPgtdBfTtQ0V8yfjRr2sKgBCiRGR8AuhNUz GCMOSI5tgDPBKQi4zsBTUI5ooKhQzCTnHtdgWFW1bm2qw56gfDExNTI6/u3v fA+hFfVC2ER8gLsqe6Xba1IwgCDt8nvwi37zN36T5gYNBNknvFRfhRsuZR2e ciRp4wi061LyO0qPr125oqTo0CHQWWFvj8QvTRXBjdeUNAIpq4vb2iz2ikMH 9rmBweE76pEA6G/+1evf/faP2lu7zjz8qH/+7JXXBEM5vHMosl1i5cTtXVfx T9aWJVAKQdeTl6AZdiqM2tUM5bXX33nowcPf+MbXhKd3Bm8Vfzducuk//If/ AH6FexIryNkxBIWMmnMJ3QnTE8y11ejUCBnJdA1fn5L1MpJbnJrUHwFhAndS QLoW7gkVDDzHnZ1s/tF3I1CpKGcRQFqOSCVNOixqkwwwC/3tVPucCvvih8PC M0rNGqTpKjXnIOosXUDfeGl+Vtqyral59M7QzPgUmGl/f39jXeO4XNHwMCdL FU300a4iGlDK5XRiJzpNSfjOv6S6lokB4ib9ddgKJ4oN77xOzWy2mfiFubl0 cKnFjBgnMwrI5keUJBZNWrEGykUGk4vOaYhgx0/2ow1d9uJ9USLSRzCVrHFi FwSt9+4gEGZ3Z+DGtZ2NtYcfONGnH+VTjx/o74sK38lxCYyWpiYelc3Tv7fv +S9+rrGykqLi22/94vXXX9Ml14YISuBOCFmJa7jQ4WQT6NkNR6ysoGhucmp7 /e7MxIzkUVN9o/Q0/XLkTeq9W+tgloro4COsBnnrFWqiQwesBLAu/mNRFcu4 7+TIxI8vsp9SrWnkOnT0sxgMDr12zLQ4zKI2JFpYBuE/9UIXRzjhRTDNTY2L i2DuHR0pAQYGnp3LfGcBimNpYmoC+GXemYbofxNQdWhKJMgnvi4MZkS0cVbZ 9tKDXFBggig2KJFba+F4hpV1kTBcMX5cKiscVZeJxcQ8unAE/NQbo0ABpSI2 U8q8Onm92MKpRzsjuOGfetQrlq2plOzr7e7s7e7CY6cSJ8jx+Ta2mJTMhevB X9TzDUQQ+jVyyNFvGDqE8lXqjHe06yizvDSvFSkHk14doisFYdWD7b19ew8c qqxrUGfZ3b+3qKp8kZzZ0szKNk0lGrTDazur1Q1VM0szVXWVinodgc71ssoK Bw+yTXNrIxX9r//aN+SWJWGHR4aFC0wwFsSNgVvmBfJJSscMJ85psne7OxC8 UCywIDe020IDjykOVGvPHhswaydZsdCYqBoPWxroeg4qU5RGLS9WQiC9CbL1 khR0RuXuZ8TZktyJ0rdI9ItNXJhEcaT4VBnLeNJUm53VSAQL4sq16y5odjZy HwFoVIrrO6XyO7u6v/rVrzobXnvtNaG2r3aNS9idSfwhyffYgGHqLRIhoXUA jbx25Sr1Qs2WQOcnjh3u6W2Hiq2szrNStfUVtbXye1ttbU09XR1mkPspP+9E fuWnr37/ez9+4OSZ06ceRor/5ONP3eahQ4cvXbrMLNi2Il1Br9xVpieFhklD A3Bjb38/Q+cCiFhy6c5++snhw3t/93d/u3tf3/DggHxD8Td//ZsoJtxvJvKZ Z55hsJlXOmPWJJNhiWfybMoeaA1UgaZjDrii/ovD2dFHfHqRGlgNK8vIenFT SyPdDeGbaKi+tnFqaoaf7zRglNlxmyGisMJCkSUigYRo9IqxdaPP6y6DKnnr ifCYgnTD+QgOpR0Y5FvpW1yx1RWRV3dH1wMnT6DwmKvxkXGuSvTEq9aAKpCg 0bExsZx5V4arlNuFSSeJCTCtUuFQlBVlkQp2QTINsIQF7EDFc+a3hoBICpKA g0HE0ZrC5mOwSfWmBqWssOUVHn7CBXL/MdteG0GoUKRgww4ExuBj+E3WFVzM nRgWcaiPttn8d/3qVS731UsXGuurQKuPP/rgI089Pj8xzIEilOe3kiEwH8eQ /M7+h06PXLn61lvvvPX2u7PzC5jqvEaLm8U3Yqbc8StuwG+PmE4CTR/QGm04 F1VtW52IEFYwrDmI6LrGz845e3r7emSuBMoRoq2tEhrp7evr7KabPhftBHRq gX5EAJjalVgJEJjARSKp4Tcx1tC3DvcmfPkEbIFzxDzxxtbWZuW2FARlpM0q NJD0LZ9C98SlrYL1ZYDbSh4Na8ky1Xvdyr5585bd09ujk3kx1SyriHtnNeRa olySGWiPcM5lcOlyvj9Ixha/YjDsPRQ9hXnafPlPO0SnBWUscbN7JMAoruRR 8UiW6hrg/uwVCyvsce1aKcvDaNbkxGo8uL/3wIG+lpZ6752ZlIm8pbKXEgeI gI2aHB9zpNZUSR5UqguBJlM1HRsfhzwi4KRqp/hQ9TtWsdaTI8NDfFikH8Zx I3Uqb2hp23foSFtvf5k0KRpMeSmspXDPNojg5u0r3NhV7alLFbduFJQWTs1N M5HIPJMzs7K3Aqmp2ek91RXPvPTs7NJCWWX5+YsX+w8cgG9ylgeHhh17Fp86 Q6ogTS0tqhv0VhIa8+fBAuq2+UyGS6YEBmL5pvRUEJYDuIXSElpag70EwTDl /4LCEahg4IMxWVG2gL8TiEPmgHN1IyeRsNeg5IgFPeLRg25D1y3VOYR8chyi gj04fg1GgESbai5se3+NkvlKxOrtb/zqr6p1am9pldPTLAtjlrnwpqhK3d2J FF9j6PkFAzIg4VDcd6gPD95BNGTQgghYUHDmzIN9vR1y2HNzk1g8KQfPLShr b2+sJqC8tUGch0UaGhr9j//xTy6cv3Ls6Knerv68/PitDz74EN4qlMAGnxif EsSnCggdkqodpQcPHuaAk9YnPXrt+vUnn37SfP/HP/nhyZP7vvb1rwiDJsdG pqbHG4mlTYxPOIEltWAcmFsGEEpgBN3sfWpblimLwy3YnBHfMTeZDZfJd/4k EcAjTpxltngPnyiyE1vbrS3tEnARzaXQw7YU5hONtnFDKVoBD5PEUQrcQPo0 9RoJn2mHfcozmqoYI7hRJszSqQGDDXe2tSJ7zk5MNtU0HNq7n9fMp6NyK5DX mdyJHK3Pt/UFGB+fnrSY5GpDgRvYGnqDAUskjmT8ZP/ITBlNh6c/GYHkoe9h QOFU4fQklqUEaUYFIjXEVU7OckZaXXVAWlHsEJ8ZhinBrn7J0XllSFOnXICb Au2pc5scD90KnW4t6C99/uVTJ462NdUTDRgCJFVXmqFbN67dunFdz4rHHnv0 oTMPWSmv/ugvPzl7cXB4lK+oyoy7JKYGqopi3J16aic5C0vuwHD5WDmWCA82 N3lfh44d6eju8t/zL79IH180d+jYoZ69fS3tJItb5pfm+dgPPnIGDKt/OGOG 6B4SkRZryuH7tKhfMm6hTbWtsJ/raAVwQ0KyO2El4e/cY+wEqSqoQ5scpXgv X8mqN4ReCqlVbluKtbGmbMbARCc3b7d24YyhgCVTmihxtiunJqUTI5mbac6+ xOeAAe6xhnYiQ+DiUgBtq0PlxBbOPysnylNSFcNOc3M9ghO0VNpN2qq11U2T BqtdXV/GtbUge/d2HtjXt39fz6GD+44eOdjaXEfRcXZ24s4txR83FuamsbY0 g+Dya5bn5uS4DO2JE8d6e1H9is9fvCCnLIHM+LhdWhzaGdiAqUqtkJgvChFf vm9vj/U5OjbKj+vs7e0/eKjBBAhn9+1X63JndHh2bbKkAk6xMToxOLc0XVpZ tFmwPjQ2WNNQk6TddkIoKLIdgYlTpiko2RmdmmB5bw8NGZ0nnnyC23pr4M57 H3wAq5ZPs5uEUfIVW7t3YXcIWUHmlQemfxYYdQS/HEOLOhgdAQHckwIBDBlx yzmKEtNPLpv1ExMRoEsi5URSMDUTUw4UTm3ABbE6Aso1B1ZPFIvj22B2OBZT 27RoCes1jhmV5i6Gox8Jutrah8+cUXIJfmTOUEhFrvZUYrWHJrqsVxxdUZIa VOVo1b2xJo6RAgdIXrh4zh2lrBJdRE7oQWf85NTIwuL00vK8VHddrdbrrR3t TRzb/r29btRuvXz56p/+6bdmZxYfOfN4f/+BSxev6LhMJM/2h1yfP3cBeYD/ bStbn1F5X1fnkuRy+P6oq02trRcuXvrmN3+dFvCPfvjDw4d7vvCFz9GzB4Bx NbQH0baw+J/+l//0X/7Lf8ltIYaIBsuUOGmzOpnHWSKTjfA7VRBge0gylOG0 okSGmrpK05T74g9Grimq8wpS8esK50VIoRBB4osLCFeWkrM+2lpaBFlhpx2e TtKADjZDtDSxIYU2fAzfkmn/wf5HjUpJtugGVl6uKqy2qkpQMDc9I3N+59oA 9L5b+Ut3t2zMlatXaBe5hr39ffac2d3gs2yr50RTjXQ0eC8KddLqyOm1lECO 4vTUnSIa2ERT4IQzAhEDwNU/Xf1MdNYLOXCLipsoygihDVW3IYoabw+965x8 TfyXWJApKRuVmOrKSYZbE6ucafK+i5HlLyuTTz928NBTTzzW2dqsoODG1Yvv vv2GfoVAyJ+/9sra6uKZhx98+mtfqS0v/+H3v/dXP3sFz3RmfnVPVZ1yoJoa DQrD4gX5JnqvRSIquBPbbEFVZ3s7DJeyhP60I9OTbd1dnDctveqaGz8499Hk /Mza9sbq9trY7NTw9Ngoi78wjdsJa03Nf7dw45hISCISEH0T1jGiDfSWFIZH /x8TneSjyqpCuzMVW4b3HOkUEXpZJO9Fh7AjXHdHDp1JIxme/kq0JW5pUTVd XxiikqF4vrQUaHKUsSxpFVyYGgGQZ0ZgCIJr4H8Rxsag5hL5YMJHKVYqE3Nf cPxEkXY0F4UDi+saQG6obpERcEnFejIuiOtdjPM09n00ZrN+MaLQRc2yIdxe XVkcB06PDk2OD1MDn5oa3dlak7fTYIGiNzc5XIESBIPVibExoLSlSaTZeMna iYEcpmmp75HMDBmBiioBrAjg1q3rKDX4kgf20zlsCHnz9bVDR4/KrNc1txZI u7u/6lqbWJwErpxbmhwevTM5Pba2vbpbslOyp6iqrmplY7WlrcXGRthEjI+G DuoeAbulhSvRpX2Nu97T3XP5yhUL4sNPPnGCs7kRr8lblpSBJibnZpvaWuZm pq1hsR0xeECfW+CuTs8oKUo6D1ZUAjjtNTsutIxDoSHTzwO7CZGlMKYJik2q BOHG3qtsDsMaxZWJsJ7MKL8kpDxtuUg1J7ZG5ObjmTh8omFnaTk/V4e6p558 0umOzvXpuXN6iSbJpS3hsrm2PIPtJ+nd3MTooy35SQsm5PYRDMnuCK/7+/da aXKPJ08cf+zRR3zA5SsXZmbGy/cUiZeZkNa2pkOH+1vbGoEMzlrb/zvf/s6f /dm39/UffP65l+/uFA7dGa7cU6MSQQUXY6ognqVOSsErHC/eq9/Jl9pU33X9 +nU+gYAS+IPgdPbsJxbcV7725Zc+9+LVq5eRoRaX542HXVD4/e/+IOqFU983 BsFCd6xxbBMVLtQbs5HNd9Xd3SsDiCwG/grlIawDIkNJDT74BKkIxJ2H3odu CLyL3aLl2bX2ljYFcr4Chk0g6qknHudQaMEtiFOyzsKSV4oiKqVtwkpdi8mY auxRWe3DAsTcvutPUS3Dl5D/XFmGYEvsXr2or8q51bmlXuzhvj5HB/s1Oj4y ODI4uTAjHOs/cnDfkQPQq7nlRYxdUaePJUOkwCv6oSYzGByGUNKKggCDaPm6 X7YzON7BdgqVzSAXhkJ8lDNH9rCAFt96Y32T9wXLhU2hABoZiXAMgCc+OEVN qbwwVS5ZXCGxw8NMBcrw0K72jiOHjtLSxodoqqu+evnCH//HP0SH/sLnXmhr bRgbuUNa9+Ezp2saGz756KP33n9f1Zw4ijgt6Zi2jh43OyNzMDHB0rkbHoJc PPYxwlmmLlRWyApUdvX2XLh2ZWF1eWJ0rFruqaJS1Us4lQZ5ZckN9vRFYHX7 9qCkjZ5syup2A6XdQwg5hPcDhd3yLdRjV5bU7CnfS0hs0hUIj8b5VFIR+y+4 qSkrE2eQ5SC6DPIGvDRheXFJbJBakMKi8okpmJP1VyRYweW4dv3myMhWUzPj uMdJT4MDrS0vuTv6+YwMd/d2CzLiOMQoCCbxXRspwgubPdUeucqo4YhehBvo +hZeDlBi4HdST+mSckSAOO+C6Bw1Y5G23Yreyc4DiSNTFnAkMUD5dD2yKve4 gbjfaCcYSXXWGRIPY1XCOk1/fn5WQx1ev2DMPmd9NE+iNS5XQ69kPjpElKWi o5U7d666riMHjyhyC+jw7s7U7IxuJ4899SxWTWN7V0t3LyR7ZGqKAEFHX9vs 4u33P35reGywTu67qnR6YaqgtKCjq31kbDTgu6JSbEhXLjmzp6Rcn2CHimtk zJpqGyOr2dB8d/Xu+ND41QvXtBUeuDYwNjZ1cN9hFv/ypavsYk97J0qyjL/p Y5IiA7GxCR+N1Au99oIo9SaTZC78c00ZHj8oCkMCHDeMEbkGbnSvVURu7xTr If2EYYW9xMxQpUkpx2jRGAy7SDyGWE2o1UTxnLE2d8EuDxe1vibkqKiySt5I 2QcnGClYJ4vIUpeEBCUB+6SPEa5eKrKwPKYmxsm4c2tUfjY1NdgL9Oll7Hnt UmRobbiU2s3CNVtbGjUAbmuH+9vCZTI1v3jj59L7YK0jh483NbZJvtFIo1XY 29ULIpCU8r0MI78Te1I+08KQqfPP3NvRZjYUqg+WN9d79vb83/9v/+ro0Z7f +7u/s3dv942bVwRDA7evOcJVlzkeir/+tV9Voylz4njhxwUXB+dpTwVWk/7e qTFdo9Qxl0wEF7Wkm1tQ26GRweZWjFzNk4sU8HKeF+fJLavp0sEwSlAsUIWA oICSncJVRP6FBQzp4Vu3sGYee+hBblcQnRnQxAZj8mCCSR6lYGN3i5kSpWYL FZmTSLHgCxapQ+hoatXYqKW2aWl+qbq85sa1AYI38D+CvuQDlOOgrfa1dwAm 7Jkb169iYCgUceqSyamtqqmvbSBszEsFRwHnGM6UYQ7I3o17i5abKkxyV2ln bMT7QUAil7UNSrdmmB7JpJ7uzriFCLbCuDhYWC6XyZXjdnEN1NvgY22ryC7Y Hhm+Qxl2bnlhp6Sgvbf30JEjL77w+cba5oXphStnL9y88slf/uDP/vJ73xGx fu7llxh0ubuevfue/fKXZydn3nn73fc/+ljmvkp/Os3y9lQT9+ZUFWNzbuH5 aplV3dRcL3H47PPPMEYAZTq8QV4qKNADKXK201PYU62QoZoayg5iakbEvtLp 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 ffB+T3v3ow+fFo8vTI7PT05eu3S5u7VVc+s/+U9/emXg5vNf/kJpXfXNsVHI U5Uwc3cH7iG3Pb24fOP2wODAbRvALe/dS+GP8mM5WMS3SxTYh7ngxDEUFesc 7aJI7qWCwxATskYjOks9I4JaGCp5UjNljrgGComd3SE5vLltH44MDr359lva AU4tzIjAQcOaaC0rry6rnB0bq9gqqCzb7e9vPvPwsUAYqqrI8ViIP/zhD+8M DiRQXwV9uYNGJEvjx3tDk3Q3SpklT4Bljz72CDvx85+/hkotXo5ydX3vNVJb ob6KfKa+JVZ6ZJNzEzrLNBULWOSZaehSPfBPFx//rK/jxaC7AvLNo7+a97hm VbGpOaBlk/Z8qltPP4xQNq9BL0iGNc9j9nMzhPdLJjhAVZ+JxRMV8oLbALFJ kbGwu8BfMwMZtzZ4CoghYciLC/oP7Fd2GBjrLuXbVYwR7Rajy2cTekCDL2Zn /YQfVFYKuw+uQm4ZGwrC6/BK15u0CR2hckHhkEUKJl2eLHXmNady+7gvr88W IcOMKbMeDxL6qGypAWsNdYHDktziyDsyf6EiLy05M2NRnTp5gits6J0QK2vL H35ytqt33yOPP71O7r26tmffoVBNKC1mtjX22S7cmFuaGhkbmp4ZX9lc2i7e 0vDHgoo8R7qMhGTiNpVPT81WyNfs0YRmMfWFkuyecYx2dIIU4WfzBiTyKIup 5deequGBwY7Gtj0AhoLixZmFssLS21dv37pyc2l23o5zpKDLjo2MuIOwm5U1 qKmw0Jm5BeayoqoaMS3KSiqrnYt0J6KkKEW3ldWxKqxMF5a72wZpJEi14Thx RexbWyeo4uCV4PCEMcmncqrizAdyRFnh10Y1c5RB3v9JQG4EQ+j9xtOx7KTP Racuu7tTRrfr4TMPEnX113ff+8X161d9qZiGR8+dBM1J6OtWzP2sb6idmZuC map1URL22COPugucwldeeYXqHilV+jF9fT0Xz18AHHW0dSoX7+jqJPLH7qlV YHOj0ffQEGfNaFtjBnZ+dvrxxx//+c9//u67Z1/+wtPf/M1vko2U4UAIsx6w h2SMcQF5MklIJ1yQwjd//rb9A8nHjXVZhi+LLJhIe8yXuRMj5XFk2VZWu3v6 NRCtDHZTHG+MrFLPuVm9UqoRJyJBvaPapOzipXPd0hWtrXV76ibHJ5UYXjp/ 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 yMy0WZSjNn9488YNc/l6tm3Du7LytHfDpa8rX4NEAru0tlxoQ2ODqA2kIkD2 nvZVc3Pb5NS054cCOzQ8JNi0ITEgw2du2jQ2PdM3OLh11+5phIOlpS3bdl64 eO3OzTtPnjiFPfbqj342Pjzc1NAYk2aEhMUYRDVyMkDwklYQtFtzeDfkZyue r03rju739bJZboGpdWx9rjuFAjnLalY//vGPt3R1pQzg0dtvvwOCx19GdzUB 5LVfvYZqrZgE7HYjiqiw2ijjN+p8rVGPUisifgAI1s/HCkGBgWCuy07XV4Xe FyqI9Zht0RuZaPWTtqIrSfEBqbZQ7XCs/Mv3eCghezg5HePnKislURhK4qFy ho3zo5NLXC5JBvzH//TD4n/5X/zLiCOQmSsrHAYf6E31vE6MjcsA9VbNTeNd xeAjUTEc3bgP9EMqk3gMWmZjcLeaY23Vh++/MzjcX18rB1ltb23Ys3fXC889 vXPv9v7emxcvnP3www/v3bvjniVuTpXKHf8Gi+nr7aP5KPFUV5UJOsVwJe7X GWY7bDWrZksJ1GOtUzzrh6+88kp2KY6irZD7hfK6qM5F4pZQgpxf+1uvdFw9 JH9F3VrIAyCHcngShkw8HOhXOlsr2qjAzqmuUCCwXThD/5PyGFRPsQyiJC8N eCxGY0RtZVqshKFTTv9c262x0iWYUmfPnsNb2LWtmwrM1bMfcPqtteWbW+pF /iq/JNldIblfpiRrZqqrpEbAMG1sVNIuD1pY/l8KYx2F4LHGzDuGGU9rVcUm As8QYCwpcdfid2fVsnAhekx5GjfLLeVF4BdyoT/i4pzspxQ+l/tzMSrDpvkn +c3Dvof6X0Sm1jzZ6zyyNwQu8s7LBAMcT3eSUd3Qls6joENjaEWgnateShlR uiVy6MZXNxhhP/2yOJa4XMW0HOM9o80oRhWQ2g5/UCoWCFEP2BGBIUwsm9vK dO3aRfHbsqUapIJlMuIWUNcMliaZxxrRyoP/83//wStffQVGdvDQwXNnP3vp xefee/vX3/v971z4/Ow/+ct/fOXSha9//Wv3795+6cXn+x89OvPMmc/PXzhy 9KhBfsogDMqunTs1xRjwJhTV5x0d3jOjLfVlly6+/yd/9k3ihQqNQ8N32zsa oktYAWB5Y36l6KOzVwZGprq375MSDA4j6hqdaYTJijYKKDQebhq2qO4/a5Ws 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 lDZuTfdY0LvsBnsCO9ZaQRDcIMvCgViBaB8ka5R0fCy4/jeYBofkzJhPQ8y/ 935ftq3+fezkEls29sQXXzmKDFA4kAoNQnNQEaGNAMeDYNcCcc58gKhghS3I OEBK9sub21pUqK0ztSR3ytXH+4RkWYGkiawn4qVysNhHMJ7V/oVCQaBN+MDj d8t13DxsXOxouePURnrtM6MFqLxMGsiyqF9JX/oHBkhOtm/rUaf1KvphPlQp TNjCr6jwmpjy2Wef79qz94MPPzl16vS5c+effuqp82LVo4dwfQzaO3vu7LNn nvz8049Onz6lPO10Cf/v9d5n46iuzM5Mjo4M7Nxp+tPZf/2v/lldHdrDcnHY kzm7I8h8ibS2WlC6uF68sF42t162WLDp4fjsw8Gxmzfv6bKBcDc2Vk0vTCyu zKtsmE/V2FwvCkMeaO9sgcPZaHJn9PW0aLYVFtAyNoL97F4yc8i//GXA7og7 XdG5J6SFsFlt3zhUMep8g0LepIUEDXlA2EjeWWfs3n07n3/+6aracqMEkCZp PDKyBHqhsZFPVEZux7px58qwTqFQF7aYHJ4qfFQxJWzOrNKsGJaxw3zxcGuq q4OlK3DZwGmbbayvx5pP7L1iWiIbZYXzq4vFZcXqHEursGYRdvncwpxhFqOT Y+5lYHBge08wOkQzzGt0va+u2rQCQ7q9hg44mzEBvqiI+Jng37HNabuefpCm VFNobGdypawwnHdifIzZGhsdIeLFvOzYuZMqQDhyTL66apPStZ6iA6uxb+7c 7JmJ4j///Lzt2JGck7M8OjrB0eu01IFNi8vhwmJ2VYokIRC6vuFAKYra7ooh di96kPMY9AO9HGtrtLNBtABGDiPKC2RPVtb11Nq3b7z+BsCy+L/6q7/JumQB mCYCkYTZ/hG9bYAt+vvFvlGIUZ+bI82wcP/BnYcDvcThDch45ZUXvOrylfNT UyTBC+fmp1dWEZIyPJePEAp69PB4nDaKkN732VpNTU7l+YARNCVJvQwUXrt+ 3ZVYPrY1y6Hz8h6wrMF/8tsZDQgZIQovxcSoRnycp55bbxF9hIr8Hhg3G9lc KPSNjws1F42gRhWnKo3APcACRZONQt4Ji9QClBfbGGVJBGN+2Vi4ieHWlmZ6 i4IEHh2EJetVa8XGCBHlIqh5tISb22HAAS3I+dGhbhKoS9ON1eWG0XZ3thE2 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 +DnwV6AH/XOF93vvHzp0KIJQc3zXVg8dPaLQytbLayLX0WUXRD8CC2KCpLGg zBXR8WMsONwpPhL4M9GQQ8IwsfvEX5r2c7ujUa8WiQe190J3Wd67tFJSXjEx iR4r7a5ZXC3YVFkrI7YZZMdux4IkHeNKtDENTtev36LgrasZ1UnCLiSIfu4K ApUDDEEQg9LAtDRvlIXSpmUGzGzIfjbGkFqS3d/8na/2bO9W/QbTSSKh814m +klgUTw0USR7qh2yob5pdnbR5GqKrm0tPHUHDjs5qGhJr6qJtvLaeo6DZQ82 QjwAzO4gt+3ft5e76e3r3dzVwY6IHrq2br548XMOZXR8hNHQOnjy1LH9h/fv 2LVdfw80gDXxSop6sknpnm9CZl4NPQoMRjPEEBNQMs/nladOnTJC5fbd26yV HW7v+ZPmFtq15YpdSSBY07nOipi10dLUKOT21Oxr2qzgVG8SPe3LS/UNdXqa Wlqj4jI2GdI53D80yTK0NDfbjj5UfJ1aoibtXg93KsnCWvbxiTGIPXBf7zUc JpPqGRbRqN1iCIL8xjx5RUyfaJSRvGpmYfanr/7sqDFep044hjGrYstWpC4B ibYxuRcwIZqzq6HVKzYqryzLFZ6jHIm7Er65Jjt1yG7TLuh/sH1b94ULnzuf hw7uL/6n3/6ewhQ3/eBBHxzgYX8fORFD/KLlqsiiFHVv2czqc4PXb9xUAQRo JkAtOCs5BTAxyhHavnMnyQKZ0c9//nP20Y4wcQhs5whmtpbXZDZ7Puo5WMso Yc40E7A1ZyYrE8xb5lJ7LpGxG7k24pqSeD+cINZN0IJmSHL/2Jlnq8rKVWA+ MTPqIQbyRszF2UD9ISEQZV/oj3hVQy4UNkkrPa5rZ9zQV7YUfp6rQNkBRBAY 1nYjmgcC0owAklGz7jTjVzeA7hvLhcX7jh7//MrNa/fuVte33r3dxw2WF5d0 drSa/aW+a0qHnTExNQsgls2lvq+Vq5cvqTZ0dXYy/kAaoUfUQIgexJjiMJeJ bhn6O5DfrGhu3Vy1ne1hu1KHx2MWSIZWw3L0uaVwOOUGIWiFwxdZSPRxUMK3 oQQVaXIBA+crG9ZDhw5bPV+IrtSO27dsuXzxIkDt2rVrdkVwaJqbvTKPycnM DQEU9+4iXXP63McFwxyx5nWLpUvXky3sl1+W0u2jUSsBewcRkP2jUIBVDbL0 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 mkSwTU1QKYtZZ4wIt0RvCXgdifnyKtOgq1I02t29BZXSBuWNY+jgMtHFINyz kVELCqGd6KFQcLdsCXJZ9C+Pw6FGfSN6AuRE9rThPI79ouTfDmPK2Q5WMnXm REcfI5lPtY2eTa1//Tw2RlkZuYuvvfI1jvbtt97++KOPlaBERVyI52HsWxAe KyqEhQBEoIoCwrYt3ffu3LDviVQ89+Lz5TWVBO5YgtAn9PQjoI6pDXJSvhZm LysU38WcVCRw1CiHNuZUi7gjv9K/7xwSmcklxIpyA/6WZJRKKKJmWMHkzGS/ ykxZOQ9PpDlmM65u1FXrjp/u7uwa6B+srWqaGJvr7twh1vzf/7f/092J/oCb 03PTBcUrhOsmpkZCZGB5HrMV8OUwC8MtiqesHIhJ6kDRRtEqqfvphZeeZ1tF G3nubFCfl5c0BDKacu3KyjqwQFfX9olxhceKd995/9OPz33j678zPjwmPXIQ erZ1Dw8NMFihEBQM8hrjOfbs2e9xK745j7qzzGi5dOWyT29tbyFkWlpVfKfv ZnV95T/5679oaW9GKoB0L60sxJT79dAj1nduj0VNparaL0RA5Gu5Mf7Ph9oz DojynaMNmhBrY0w7LDduXidBKfSP5D0IOMXIEg1Npp9siBClhzgYtieUztYj e4iDfO7zz+2ZM88+PTI5oo8ThTwKDWaV4g+0t1nVTdWYi6vjk2OOAysJeI3u Vp11U9NSZKfcAFMHzbQ0Q3mjEz2EX2M8n9fzrgw3C4DkKgZXd2NhIkGMArLh FZUG/2zXz0LhfG6us6PdC0bGhjiylo7W0Zmx0anR4orC3Qd2NbU2jE2NX7p6 QbAs6AF3kFYWW4AOKSgIC0RrpeWFWLF19ZW1lRWffPTB4UP7uzd3DAw8cFyr aisMoCj+//zZ31ABUKElPyP7EujOL87pogL8s3pBmwy15oXBoUeW3kWPj4z2 bOvp3rrV6cIu8jCmp2bABTA+AFPMcE0e2+bjSWydLdu2BjPaAUbMdjYigApM FBzj1KWJbx4NRpQ8fhouMTE1I9KUS546dZpkGezj9q1bb731Fq0gMQtCWGht JG0XqR9TOxkZQSGjTTTWvxbCSrI1IbQTdeeYWR9azoKBUGYxsXxLTZ2pMLFc YgVuEDc/yOpFMdDCPtX/Om0Oc/qSQQli+UC1Ev3upaEuYiz74qzZMDWNfcPj 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 ufC5KA93Nsc7OXas45ikIuWZMhvc4Jnq+geDYzsPHd3cs/PKjdvgzIGBIX5I dKXOSLnCJA857PTkBG/XoEVvbePq5cu7tvWAoBlxdeRODSrLi9YkYSOFHt7o mJQnhh7ysayea2Nk4wrLN6GaB4UWoy711Gcb4QrDUqT2OVvEg7DXVZmz1I6z 4ajs3yd8PGgls/qBQMmEDpoD3KXVg7p5ZEykF8OYPH1HNsifX0i+fsnByJ+Y Q5hcG8yXYYtHdJNiGR8RJjKZ/lRJC5on8/rNb35z74EDvffu/ejHP9LQJXXI lTRxgZ2gJOLd7ATXHG2dJUX3791hFADx/mT37h0xPq668qVXXkEs09muwYhN dOSiH9e1ik2jdSvNutoATCe9vtS6naPynFfl4n4+SwmqTgM6rSFNLW6Y3jkn rY7HoaLZbKzbXuoNwdZIdVRPx0ljJYW3777zLj6WIpKD7X4FFoymrDlajzbp 7m9JQpQx45LZdW5jnWOQ4Tzr7DVCB+2qzz77LOeHfOrqgVJOr82iwV9+AkbQ 4hlEdyqLKxSXLgJ2KRZaXiBmDAmfpXoRgxRhEU6rGBbBUXugDgVlDB8qabCk J04cZ00UmB3eTz75iH/ZtWfHydMniG2zcfZGzJkfGxP5OJ6OWJSpy6L93ZX7 uVvwEyWmyHtSZpAtlO1qQTJBSKU6C7R70D7X9hDB8AqavLFHM/tFo+39+w9b mtpxDPruh4q2BhxOxRFAU7t+45o13Ltnv9dL2+APyC8gh4OH9ug+ZaEkozqp fKilsL2RtDy4BMWqWC5k1qOPZiicgoi4NzayfB3/IQfK3Ji8nxPB8XHE4AVI ky4+DdEJSN2p0fQUQsN0XkpLXCHMF+lF/hHjqeYW1OUAC56kwpp+B/30kv7b t66aujQ+MnLxwtnnn3tGt/v42PCevbt0n6T6c6SDxX/2wu8ovyLWuTiOEQ1L fR82XFNX5e205/OOjU11Ymbs6L6+XosuXxDeC6wuXrqIm/bss881trT0Xr18 v+8+sABovW37Nq93Hpg8IUlMbo1xpyZ3xQ2HrlLQXaObK1SWI9qKHio/b2lr v3/LlMahHJ3xy2I6zzVmKSpESrQm6P4WQF39BNRrT3P7Qb+xOZaX7Azptk3f s3MH1ps2zUOnTjZUV1+/du29t946++lnMIcHvQ9C59BJS9K/oU4SKgioaUFI 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 j3/++We6hrY0t4+MjLW0I4U2fvzJB2vrSxiy3/v+b0m1kIkJ7Cfa3cuY6oWD QrJFZsSX5oPh0CB4EBmXZN0ielvR5CXo8JMzk16fFcqtWGQ7N8i7YIUHHoVe neUaDN/akOBio9yvGCWTE4y2S+UzcNG8xi2w5kEwqKqC0iYhqm2DAEm1EVBU o/quNLx+AGmUiW/rLTt3/GhfSJr9d/+bP+CZRXf6yDoTUhHjQiY18qyy8+WC 8OyFXRV0/HcL0NYCGl9aUNI+tzgjVNNoQWBiA/QdU6EQQIktGkJ2xaivvMsN 426+7VhD7K78nEk/xkI9jI4s3pXAoxDWdT9DIwCv4NuHFUj1yEbH/ahxzqdr BEqFoe7hecMX5dUuLlVJ2lT5CMrBUdpLk8yrr87lH8gWimRxIqGIEcojze0X Mf1Yrno3KdRYWVzpam0/e/qcP33+2bVbDx4Q97/04gv9J0/X1DYMDo+zjHfv PdTIIB1F+2v6v0K7WbLNLeBKedDiNffSMFrLcHmwctV58G9M6Kq6eutidHr2 B7/3u5icLuPz61/+X/8f/89Xv/m9v/WHf9+h8q/+1b8SYp+/cHpyfGR9aba/ t2tvbf5Yd/PZ411luxurC1Pba0uoE831rQn/hAAgWhwYWQQAMxplWnGACACi 6ZMrDG7+JupVFFBaPdnTtIt0ycxVDNIyRtiKlwyR9bKfF+aFk/AZOZaokEld l6MzApNu2DIUkzSWwmuyY8cmJ4UvFqslqMW7/eDIlpM8e/rM1edfUpo6d/+x rNStGzc/+eiToUdTLQ11fb3HevuPcjE2dtdrGmvPP3Px3IWz3NqC0pKChSWd EXTAMMLOMOH0+uyCzeRmg64hhQQ8UW7idIgSDbgTeITDVUD6m8F1ZND3jtNH IMApSJVpfuJdMSBRA8bQ5Hb0uAZbO5v3Bh9riGDz7Ozv9B3pJchfU1HVRkVZ GX6VQoDVG4/vD8xO9p07c3v48RePH05sbx67cGZ5JWTbpmfnmppaSEx9+cXN f/bP/hevv/oySGd2ZqisRG3V+PDQ3Usne2ae3D3br3Nmh4bhGsBqzru+vX/r 9sDKZum1z+8PjS82tR8pLKsmuwIFm5iePtLVfe/uAzvcNrZZBIL2mpllAgCa 4+MRw2ag0H29+c6bGuIcPabfos5PI1QizY+xI1biFDEX+RBN40aGKVKmpj5z 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 wK7B2tqyHkOwIBQHMdIizZWi/53Etg4hxFDRyh5vMqJZijM9YatTQIhkZf5b mO1oPLMrARReEtmwjfVJrPTZOd8m3NDXw5hZPzQhh9UtTU54Te/Rni3BzxwD Mqo85LvfeQdbYXN9Afu1rGinprK4rbGmTQ18dXkppnTE7TPSqpycYm0dyqo2 94s398ofDkz94jefbu5V1DZ21De1o2zIW1gVD5+QqazWFSrl/aMi4CDNGFIY 0WVdz4X33/8NMW/qaGJYW6m7uwv3yJ5FjYA1Gxx2xwOvJybrNdDbmmrEgCg9 sFXZpuj0UR19Lrw9w69+MmfAns1eWHaJItsZCX2dtcKh5vdBNu0psENQtJ2A kSmKrBeBMMx1e/DWzbs/+s8/bnYuNTch9hLJ6+09QmM3ETwCTvSy1CizkYED a0bhe41uwUS1i6emJ197/VWKEIROmQpgm0+OtpgpNk1uacjFsidMnk/LTr2L 97IMKHtZPjMcSK4tMrd7RWurW/Nzi10d3TyD6UlyzjN379x//733x8cmiHxI lwqwGNloX7JXaJ1KcuCtgnZgtQ5OS83hBJazurRnx9uz5JDhHuPuDSKWtEXd /+4etngavSj9UPYoC5AwVWp8UUhZ+G/+6z8SjEVQKCRjTEMnQ+mQlLgsSiTf I/KCbRbsyc2ncpuIyvMyZZCxnapU6dgzm1vqpm988SVT88rLLzP8idywrpjb NmCc2HVj4b0gGOfz7/zRH8lf3rl3l/1iXg235OOLV658+MEHDqucBI/kRrK2 MbWJ+JV/siebd5M18eqrrxp0CU1pPiNufLPB9WR2fCLtnoBd7rYKKHX1m8HO a7p0/jIm2eT45J2bdzD72MCrV1954613tCKZGhmXl7v3+GFpdblUC0i4FAEj vNcduHWoe6TS1Xw9uUkyl7W4rHiPN5CKT+PykgRgcfIEObYh/ZXarPINE90q /EReJJqhaiJMzLLKmpmVlUllWkXFx85f6Dl1qra9Q4IJzW9te/f+4ye3bnzR 1VhbXyWNI4+tk0VhHbUAZ6K+uGtLaJhtzujqsrWFuSeP7o8ODmDVgHYXl9eM GA+U5xiUoPIKIKRSso0YjTgvGYLYBqGkqm0B9l8UfSShMsahorw45Gmg/nJu M1OR8hKE+hxpQzW304SoVkm4GJ0Czji5s87myvMXz8HFfKaJfu2VV5svXtRm 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 LvmrI8QljY2F9+ruka5iMe9tf/nllwyZt1ioxpkOQHd3J33VTNSNwicxaMoc ToxP+fzwqaOGJfITCthcvE9wzLger/GlKRG35QOz5qSZ8jlmyiW5bFeSxMaC dUOk5t79O1YUm/7kyWNC3WRfPHba2qlYbspx6uprMkHYe/NHBZXzafIgQpnE eM3hY+bO59DWjwdhr1J91yGNMi/yzOXIB7+3GP+8wkHeaSPsC+dy5bF/hulA 4Tr0OLINPTQZ2drG/vza88I6Jl+eSc5Omo6nKRhnpaO1ZCr/51eF6GnkLoJX kLTqioOww7DubIOWbNnGlmaaIeyKeA3HYGp6dmpiiiuslCRU4ArD6bA+ckI/ wBcC/pXC4VA75YELHi1izrkcehhldcqGcn6WJTbMjfy3yqiSgNu10JMIoQAJ 2X3kWN4Bk32oHpv34aGTlT0yX+quU+VfcbBBEybrnxltjDWSzOXXt30+db0x mCLhVB34bk/DgzA03nJ4SjEO2QT7cLxORwE9n1QuUSIcAplHNkM+NBrDzDkA WVOqd15mKkUWyZDt6/ZnqQamSSh6J9ROzTtXRTEPX8EGZwM00qS1biKQJ30K 39NCKCwpg/zNr222dHdp1RUjvL7ugmoqKpWaLi8s6g1A3iBytcks4vrYh7Bs Z1ZaKoWh24u5fICOhj+Yf/Ioua98IH39pMlDlLxRbix3Um0l9EJVZehV+lvK GfCtK6IFQHHxmbOnzdrg0GDAKSn+P8C5/8bQZkpt+jlgcKR/BxchAbfpv9TY VJG0WQ7RQ6aX9eSAp9ZKW1KIEsSp0iTYqVxIMZ73uBijzHswO9xGrViZtz7a QCdOCPl1ttcePbDGqBFYR7lHzxIk2qUSXwxBUpeNHcgXLi4vfvjkydH+fm2o amQyl5e+un2bfRoeGQsZkSTW7DjipZqvzz773DtpA1lz4X+kxu9R8iDOWIlm 3a1tHSf6T3iN/Kcp5iDjjfDSeJosEevGVt66dctXIz8lyxKnoPVmefCwQAFR U7Ozw7ZqnO4497zMPq/Qk37njBmLkznaIYe4sqrNu9AgSXiSeQrdGa4rLzIl BXcNjC91md/73nd5vrwodtAnJKOmv2yIfpnA6A0TEXdEfkkeM5aS+ri79x5I RuYaXDxZbizv0ifkoAdIanmKMO1LyCR2DaDKwmBzTBeI0g4anxzXW0Gmq61D 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 nVOoclxcy+rnDMlNaOxJHCYvy7XJgA0NKVV3hvMElRspOPAVzg+mn3G04OII oL8A1DqIhF6m0p3atL5+GOHTpQXRKLdQ89Ttjawk+qZc67ETUwSk6X+YCOZf 5oqpUKHGWzSZxlC3G3+19rmxvcf3hro7h/u67cIcyt396HNFv8GhiQa9DUGD y4w0QUjGyAma473Qrronx1u1Um9k2HIejYYrR2A6hyx94UJLB7ckRuNdMcc5 vksBNnxUmeXhYfsw4VOxgz2aI9wAnBxa9WgvMKkBCo6patcMJiF8y32FnFtY cvsELy7InfJRJjtr/tDXyJc3eh3rWe5uF7DQhzD0YYxOTKnKw22yHnxCYAEF KePjYMucKFUNZZ58VxHL6KSExBL1zt2DIfFZV9c3t259/u31b27dvvTWG13d fZ99/gU5BWuCogHG2Lc3riuEswz6RWGkferBq1Wqr8waIb859bxCji07+/6H H/JJXZ7L90pz4WKEOHxeOLKuWfomMKw+UMTtZ5bRG61bl8rpEc77Gr2ilYSW a5m5Y1NKlQnDdNAeBxQYwPIEwwcvamr69QZPqIwTg8LsekHmESmtWnbHJ61O hdXRINPRVEFaxF3v6mWdA+Ij5Kg/LlKUV5qU8J3r8dabb7iXBCUqrAgMHpPj qn7F1WC4gL3kRXxm81V9SJtur28J0mY9mzFtz0evtSJRb4n9LU/IJ5RN4GpA EljhFFK21dW2pGfayMfTk5QucPb2zdtfffE1K8yNvX/vIQejAbXl3Of6m9zz H+GCfwsi8KpmYf9NaxvDVMao6J+ol5Ho5lZwJW2qf8OT9d6YmzKy4l+Bhr4m 4lZgHndFtH/2wqV3P/z4FVlS5Pn0tekUPa2uPVct6l282sO0Upoq6GVtGaWA j3qThUIs8W2cjneu0iTi5cGiOXT0M6L9p/Stu2sHtX57a3pshIBOV2mB7ewF L+/V8hoLukkH2HIcligqRTwwfuvrioNQ0HKSRPqusijWpduxegxUkMZqqGm4 AUCWUcMNazqzUFL1UOsv6gcoSkXkjPKrrVbmJlPLjIf6GmChmXXQsE82T77o yePHthD2tVg+1TIP7lsxrkGnXi8TUhkcInSEEnVIxjGYnplNqRYPV/zV13/r Ls7lnfvEaveOvfnW1cnZqdWNNb13JGHomdGCXHj0SBdsFBnCkNyuJhMXNm4o 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 YRHPnLtA3BKSJ5anxi+TrquUZMfB5vrTu3emRofOnzqhpCYUTkTOnW3pF4nv ly9WPeMbpQwjRBBW+Q5cgS8BU5AE7u/uQOrkAodlvgdt0Bw7Oq6FbqBX4Y2E X0GkcxCfXDeElyjfgZWMYhmpqCLgE608X6Pd58VgTZimwzmE5LR+CP5j0N2I Gh38IuuVcN8DTYC//uoPv//95198rseGnZBcUOdxjsyJ6SmARurkDdHuLs4N DpYLSPM7aebFBU1fqpzywJei3nMFpk/MvPfB+6fPnXOefPbFl+IA+J2dwSRI 0qPAjYxNHHT2bis0StwaCRX+g7CcY+8wgyfwrlJCvr01NjH2jm6rb7393nvv izoePrwPIlB9T4I2xTiVq5H89Upm4SEseJ0EZ0akV8cKVKp0ggK6HshTGAfb xlp0L0wXjzG6xH0Yyjv0bXuGB1PzdESHsl5auMRVh374Icd28QeFEY537AI/ G5UGQLXwvNli6Q5ejLbbfrDKY0j0Khd9W35JeHY7nJKjKIPoDGvHf+LB4kY2 XnVBpSnwzuOot5hnmgFtjmqrFqs9T2z+sOFjDHQlJgIZxH0OD5dOmE3SgvQA UnGGU68rX5qO6lvboVcHKxWB6pcRQQbXoZ3qu++/N3nlDSobWrY9p6GaOul4 giIPWLwV9fvf/t6l+3ylvjfv37utpUJ35/TcDBUkzovpAcZGaaHScfHUe8In wyX3ZVFCI8p+oCrM0jpg041YYZoR67K02PNmO6w6zqxTnCEQJFmioH8nAnPp dvzLZBgQB5uQoqWAmq1swKGPZQSNtjoFW0pRFvPtjWYbxlUHj/ySnQTVycnk T85Q36smuCCXOF7e4q9sECthBPwnEKzTdISbWZ8WtIHlcjl88BbglyhBsh6G rhEMGgRkD8pHMfSqGFqyi4GuXp85e3w422gm2V9Ot892PBgKH8UstuPcD406 5k4b0GTt+bUd8O7XohJDpKp4T3P1OZALLbHGq8UkaW5EeIoEaw4OrMmNFxpa i5B3TkydSDFRR9fE2ATvJKmjShN1/ukPflB+a1uVCZ+K6RpPttatMPawsV1r 6vFyfXXAOTk0KGx/hfczNHSWHOHZs2kgTL0JhTslxsdtfpfigpRKAgocX8vP Vt944yolzckT8z4RV8fRuvDkoeTx/MToxsry7trzD99+Y6if8ZS/TmvbtNlj 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 +U7BeKPAFbZ3wM7KxqgcMzfPObzSPllGmHTpEmbWy7NLKDQ3N/vue+9fff8D 2Rxo7L1HD1gF6toyV2rG3n3vPbf3+OnTDz/5mIqj4bh++yYG7tPHTwuWSREE N+Pk6VNQF4vS+rh7/+63N64RHxE/muxYxu1XH3/wMbNFdt/hp8Gq20h1Oc26 5ZUHT57oXWxqbt+5S1uHWQMmLD156FyB8MKuEIiOazypdcqxDoFqekVgfcDE O9GBu4ZGh9SYBh7eiQJkIxU0HMo+ycIoEcjG97YG/JXZgkXym+wlS8X+ZFj1 y/rtb3+rxEj6y1tya/Wos76E0lvDTnY2wkFOrOhwZ9yZ1wYXHGIDcVAPl2rC l0PBlwIIUuidSy0l7Nceq4+VAo2L2iIewVOlgIyn7e1brAd7piEeldCQ8xmx kGRUhXHb6xtp0hzGSFdA53yy4GPq1BlK87P9/MHB4RvfXsfNcgOzc/pTnMaB A0jfvX1rZ1O/ZA1DJwZGhtf3dxbWVlFkJudml9DanXNJg0jZNhwm995SgqKl lMD2Dx1WmSMYlTtJwcTeZH2iOd2bKlUr3ugZfKmhykPS4kl3L+bS/bpZU8Pa tsoRt9a4+s18IB5YM+bU5yAFeUGbrzKI6Po5O8vX62YW/RCot9Eiy3X0K6JI Ib/D5o6hN7Np0pWTTAAnmxUEoGoHRN9pbJ/Ua3f3m2++4YsapbrxNYOAFV3X X32+XBMDI6I3cZXdSu9eH1L1gS/t7kZCCNcYlVuT5vTX2I7Od3FdGoWgHSrN tjaIg8vvK1ptApPG67emPOmogMbCYV1Vc3UBAh6G1JjbO7H7IObRsYY5uAtf 4fobKc3lNU+/80++/6MKh4uhXeUGjRJLli9FL1mPhw5MtlY3NsmT1ZUlexXY bgBctGglqjNgorhFcfsJERmFaRLRHspdXiptfEXHzAofnzohdSBguHvvri2N EnTn+jdde68unT65t7l+sLM1MzvpHHJa8mHTQSwXFrK/cyoAZnQhiX51a6Ha lzoDq1eLxr2egz0o8jFJAZT8aD1L4AP0zGVGQabOsvVRjoluPdkZC3i87TIx akIQuEKOUQ05PERAS15iaSF19M5bxeO2dWX5ikuWlR8762yV0BUrl9JD/H8H EgUWEAmvP0J6GdyUlTHOQYWr8xdaibwWlwFa+tZbb0KgxPzXbt7e2NJ3px88 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 6Syxifn99tsbbMSVN9+QetGSzjORL9d16ngHgOjzr760ceRqWEz7hVEB8J08 w45MCkuJWzNzp8+ec6XElJ88egK+MFN8NK5rQ65b70j3myrbpSX36Bm4HjND k4WWtgGRllFISUTYPlrhsG1tPFh8WhoanXfuwSRuiF0cl4wkDUzXwFK38Pw1 ZyMU72od6Hhu3VDMIwcTHKSg3iS2MNxpihTFexV3SMqAC5pCSovcXRjxoeS+ 4jKzzyHtOVJRjZGgLELru25nyvfaReByqS0Lw+cDewo2E7Jsc64VxUnS2A3c WHI0IAjb3x6TZnQNgAury7wXIpGckIVkhAGV7kuLza++/locxoEaHhgWKhWy RO75JW9a91xLYmnl2bfffn3vwT0Vl4YRajA+OV560p1SnxyIcI9T1BsoDK/J 3oZFWIrJQqWcwU8q+AaixV4AlEOce2oNDvYnmUZKjHl19BKQxYwSEomxbGNV /HUWFvZXvIK298v4BHLzfOdbJ0efOlufLpaI555UKZ4ElqZeQ1fefPvdD74n hvvFb/7wn/8X//z+w6cDI+P3nyyjUmlcpJoeE3Zqelb2U+gozciGOlWF0qUP EAhPQxTfDHh2mk5NTty6dRMUqLBXnOyiDaFsRYL1tAwJxyqqowedTln8LSGN uBeZkenlzciPqOmlXbCzf3yHurvuMYEFqgCo3N4GiLT7DIWiSBixcUVE82gY zevCohiiSspnRKowwAn8+PFTGFyK/5KOP8YB8cfGizIZzR1ggZhsy5miqOA6 QjZlNlPMkD7keVnlbA4NfvuKNuwxsoXWxhGLwHRwf2Ta5YWHL1YXdjbWJkaH qgv6NkQ7coIRfjyOdKI9FyeRXeYpMI4ktwVWia3aIVTpryMg9VBLxTW3UOj3 v/99K6uVLveyhpFxXdMYQzlvP3Z6pAPaQHDrmt+aQSwWRNu9Tbsgzr+WQajy iogDlO8Kt90P7NWHNPVFx48N7I3cK+PT8hK2uszKmdOnLpw5deniha+/+SZd 5wLwOZg1NRkPNYKN3t1hfNOSgWfh42CL+xbAttJq8QdknbEdGugfQQPrE/UP j7EEgxAAWBUIxoo5ODt/arwo+DZM6RSaqwQUJXL0ihF3qcYcj4I3ffbCJdkc AwFKfvR0oQxJPxXtU2d1QpwnbogpwV9gWyNkvrVNUkBHppQ9Fuk919zRYegw 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 zgDsAcnLUMUdjJq8vMRW4siTRHGqUPxbGODK0TnQH6cjTmiSILJTnGwD7/8Q snrTKHEPyRiudHPz3Ba4/L0ZSYiZbwomZ7qSKtimkJXBJRxrA3L750SaB/mt v1R8rCE5kkix7y/xGq/I2sQghdYP6G8DStyQ+PpknIjbf4lfmwQxDamd3F92 W0Nk/R8HTEtO4sEDMQAAAABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAACGAhIAEgABAJwADwAEAAAAAAAAAAAABAAIAAAAmAAAAJ4AAACe AAAAngAAAJ4AAACeAAAAngAAAJ4AAACeAAAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAA2BgAAdgIAAHYCAAB2AgAAdgIAAHYCAAB2AgAAdgIA AHYCAAB2AgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAAPgIAADYGAAA2BgAA NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAAKgAAAA2BgAANgYAABYAAAA2BgAANgYAADYGAAA2BgAANgYA ADYGAAA2BgAANgYAALgAAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAA NgYAADYGAAA2BgAANgYAADYGAABoAQAASAEAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYA ADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAA NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAA2BgAAsAMAADYGAABAAABA8f8CAEAADBQAAAAAAAAA AAYATgBvAHIAbQBhAGwAAAACAAAAGABDShgAX0gBBGFKGABtSAkEc0gJBHRI CQQAAAAAAAAAAAAAAAAAAAAAAABEAEFA8v+hAEQADAUAAAAAAAAAABYARABl AGYAYQB1AGwAdAAgAFAAYQByAGEAZwByAGEAcABoACAARgBvAG4AdAAAAAAA UgBpQPP/swBSAAwFAAAAAAAAAAAMAFQAYQBiAGwAZQAgAE4AbwByAG0AYQBs AAAAHAAX9gMAADTWBgABCgNsADTWBgABBQMAAGH2AwAAAgALAAAAKABrQPT/ wQAoAAAFAAAAAAAAAAAHAE4AbwAgAEwAaQBzAHQAAAACAAwAAAAAADwAVUCi APEAPAAMAAAACFJfAAAACQBIAHkAcABlAHIAbABpAG4AawAAABIANwiAPioA UyqAWSgAcGgAM5kALgBYQKIAAQEuAAwQAAAIUl8AAAAIAEUAbQBwAGgAYQBz AGkAcwAAAAYANgiBXQiBKgBXQKIAEQEqAAwQAAAIUl8AAAAGAFMAdAByAG8A bgBnAAAABgA1CIFcCIEAAAAAExIAAAcAAEgAAAYA/////wAAAACiAAAACAEA AN0BAADeAQAA/QEAABsCAAAzAgAAQQIAAEUCAACbAgAAngIAAKsCAACtAgAA aAMAAGsDAABrBQAAbQUAADIHAAA0BwAA4gkAAOUJAAAbCgAAMwoAAFEKAABr CgAAbAoAALoMAAC9DAAA0A0AANINAADeDQAA7A0AAGcPAACKDwAAoQ8AALYP AAC4DwAAPhAAAIMQAADDEAAAxRAAAPMQAAAVEgAAmAAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY AAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAA gAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAA AAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAAAAAACiAAAACAEAAN0BAADeAQAA/QEAABsC AAAzAgAAQQIAAEUCAADiCQAA5QkAABsKAAAzCgAAUQoAAMMQAADFEAAA8xAA ABUSAABqiwAwADAAAAAAAAABAAAADgAAAAAAAAAAAIAHaosAMAAwAAAAAAAA AQAAAA4AAAABAAAAHCi4B2qLADAAMAAAAAAAAAEAAAANAAAAAAAAAAAAgAdq iwAwADAAAAAAAAACAAAACwAAAAAAAAAAAIAHaosAMAAwAAAAAAAAAQAAAAMA AAAAAAAAAAAAB2rLADAAMAAAAAAAAAEAAAAEAAAAAAAAAAAAAAdqiwAwBTAA AAAAAAACAAAACwAAAAAAAAAAAIAHaosAMAAwAAAAAAAAAQAAAAMAAAAAAAAA AAAAB2qLADAAMAAAAAAAAAEAAAAEAAAAAAAAAAAAAAdqiwAwADAAAAAAAAAB AAAABAAAAAEAAAAMSCkHaIsAMAAwAAAAAAAAAQAAAAMAAAAAAAAAAAAAAWiL ADAAMAAAAAAAAAIAAAABAAAAAAAAAAAAAAEAAAAAADAAAAAAAAAAAAAAAAAA AAAAAAAAAAABaosAMAAwAAAAAAAAAQAAAAAAAAAAAAAAAACAB2qLADAFMAAA AAAAAAEAAAAEAAAABgAAAExPuAdqiwAwBTAAAAAAAAABAAAAAwAAAAAAAAAA AIAHaosAMAUwAAAAAAAAAgAAAAEAAAAAAAAAAACAB5pAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAAcABgAApQgAAOwJAAAUCgAAQQoAANgKAABpCwAAzQwA AKIOAADPDwAA5BEAADoSAABsEgAAJhQAAOsVAABnFwAA+xcAAHgZAAAQGgAA ExoAAA4AAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAa AAAAGwAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAABgAAMxIAABMa AAAPAAAAHAAAAAAGAAATGgAAEAAAAAIAAABkAAAAZgAAAKUAAAAEAQAABgEA AO4NAABGDgAASA4AAEkOAADhDgAA4w4AAOQOAABiDwAAZA8AAPMQAAB3EQAA eREAAHsRAAAMEgAADhIAABMSAAATQxT/FawTQxT/FawTQxT/FawTQxT/FawT QxT/FawTQxT/FawTQxT/FawPAADwbAAAAAAABvAYAAAAAggAAAIAAAAEAAAA AQAAAAEAAAAFAAAAHwAB8CwAAABiAAfwJAAAAAYGzUbDZ1qb99ZW1t8SEUi+ eP8AxIEAAAMAAAA4SAAAAAAAAEAAHvEQAAAA//8AAAAA/wCAgIAA9wAAEAAP AALwqgMAABAACPAIAAAABAAAAAQEAAAPAAPwSAMAAA8ABPAoAAAAAQAJ8BAA AAAAAAAAAAAAAAAAAAAAAAAAAgAK8AgAAAAABAAABQAAAA8ABPD0AAAAsgQK 8AgAAAACBAAAAAoAAGMAC/C2AAAABEEBAAAABcGQAAAABgEKAAAA/wEAAAgA gcMCAAAAvwMAACAAaAB0AHQAcAA6AC8ALwB1AHAAbABvAGEAZAAuAHcAaQBr AGkAbQBlAGQAaQBhAC4AbwByAGcALwB3AGkAawBpAHAAZQBkAGkAYQAvAGUA bgAvADQALwA0ADEALwBVAEsAXwBSAG8AeQBhAGwAXwBDAG8AYQB0AF8AbwBm AF8AQQByAG0AcwAuAHAAbgBnAAAAAAATACLxBgAAAL8BAABgAAAAEPAEAAAA AAAAAAAAEfAEAAAAAQAAAA8ABPAGAQAAsgQK8AgAAAADBAAAAAoAAJMAC/DI AAAABEEBAAAABcGQAAAABgEKAAAACAEKVwAACQFcTwAAPwEAAAIA/wEAAAgA gcMCAAAAvwMgACAAaAB0AHQAcAA6AC8ALwB1AHAAbABvAGEAZAAuAHcAaQBr AGkAbQBlAGQAaQBhAC4AbwByAGcALwB3AGkAawBpAHAAZQBkAGkAYQAvAGUA bgAvADQALwA0ADEALwBVAEsAXwBSAG8AeQBhAGwAXwBDAG8AYQB0AF8AbwBm AF8AQQByAG0AcwAuAHAAbgBnAAAAAAATACLxBgAAAL8BAABgAAAAEPAEAAAA AgAAAAAAEfAEAAAAAQAAAA8ABPAGAQAAsgQK8AgAAAAEBAAAAAoAAJMAC/DI AAAABEEBAAAABcGQAAAABgEKAAAACAHNTAAACQGaWQAAPwEAAAIA/wEAAAgA gcMCAAAAvwMgACAAaAB0AHQAcAA6AC8ALwB1AHAAbABvAGEAZAAuAHcAaQBr AGkAbQBlAGQAaQBhAC4AbwByAGcALwB3AGkAawBpAHAAZQBkAGkAYQAvAGUA bgAvADQALwA0ADEALwBVAEsAXwBSAG8AeQBhAGwAXwBDAG8AYQB0AF8AbwBm AF8AQQByAG0AcwAuAHAAbgBnAAAAAAATACLxBgAAAL8BAABgAAAAEPAEAAAA AQAAAAAAEfAEAAAAAQAAAA8ABPBCAAAAEgAK8AgAAAABBAAAAA4AAFMAC/Ae AAAAvwEAABAAywEAAAAA/wEAAAgABAMJAAAAPwMBAAEAAAAR8AQAAAABAAAA AAAAAJsCAAA0BwAAExIAAAIEAADcEQAAbAAAALgrAAAADQAAdAAAAAAABAQA AMwDAACvAAAAeCoAAIsSAAB0AAAAAAADBAAA6AUAAGwAAADEKQAA9B0AAHQA AAAAAP//AQAAAAIAegBhAGcAAAAVEgAAAAAAAGcAAAAVEgAA//86AAAABgAz kikCCAACAJwuIQAGADSSKQIRAAEA1KMWAAYANZIpAhEAAQDUz9wKBgA2kikC EQABAPyL2goGADeSKQIRAAEA7LcWAAYAOJIpAhEAAQCUoxYABgA5kikCEQAB AETZ3goGADqSKQIRAAEA5A8hAAYAO5IpAhEAAQBkjBYABgA8kikCEAABAKSM FgAGAD2SKQIIAAIAFPIgAAYAPpIpAggAAgBU8iAABgA/kikCCAACAJTyIAAG AECSKQIIAAIA3LUWAAYAQZIpAggAAgActhYABgBCkikCCAACAFy2FgAGAEOS KQIIAAIALBkhAAYARJIpAggAAgBsGSEABgBFkikCCAACAKwZIQAGAEaSKQII AAIAVJ4WAAYAR5IpAggAAgCUnhYABgBIkikCCAACANSeFgAGAEmSKQIIAAIA FJ8WAAYASpIpAggAAgBUnxYABgBLkikCCAACAJSfFgAGAEySKQIIAAIA1J8W AAYATZIpAggAAgAUoBYABgBOkikCCAACAFSgFgAGAE+SKQIIAAIAbNPeCgYA UJIpAggAAgCs094KBgBRkikCCAACAOzT3goGAFKSKQIIAAIALNTeCgYAU5Ip AggAAgBs1N4KBgBUkikCCAACAKzU3goGAFWSKQIIAAIA7NTeCgYAVpIpAggA AgAs1d4KBgBXkikCCAACAGzV3goGAFiSKQIIAAIArNXeCgYAWZIpAhAAAQDs 1d4KBgBakikCEQABACzW3goGAFuSKQIIAAIAbNbeCgYAXJIpAggAAgCs1t4K BgBdkikCCAACAOzW3goGAF6SKQIIAAIALNfeCgYAX5IpAggAAgBs194KBgBg kikCEAABAPzyIAAGAGGSKQIIAAIAPPMgAAYAYpIpAggAAgB88yAABgBjkikC EQABALzzIAAGAGSSKQIQAAEA/PMgAAYAZZIpAggAAgA89CAABgBmkikCCAAC AHz0IAAGAGeSKQIIAAIAvPQgAAYAaJIpAggAAgD89CAABgBpkikCCAACADz1 IAAGAGqSKQIIAAIAfPUgAAYAa5IpAhAAAQC89SAABgBskikCEAABAPz1IAAg AQAAUAIAAFYCAABcAgAAZAIAAHECAAB3AgAAhAIAAIwCAACMAgAA2QIAAPwC AAB7AwAAAAQAABEEAAB5BAAApwQAALgEAAC9BAAAJwUAAFYFAABtBQAAJgYA AGEGAACKBgAA4wYAABcHAABSBwAAbQcAAOkHAAAICAAASwgAAG4IAACLCAAA pggAAOkIAAAMCQAAhAkAAAoKAAAKCgAAtgoAAMgKAADyCgAASgsAAFcLAABd CwAAkgsAAJYLAADsCwAA7AsAAKgMAACsDAAA8wwAABoNAACCDQAAkw0AAHoQ AAC+EAAAFRIAAAAAAAABAAEAAAABAAIAAAABAAMAAAABAAQAAAABAAUAAAAB AAYAAAABAAcAAAABAAgAAAACAAkAAAACAAoAAAABAAsAAAABAAwAAAABAA0A AAABAA4AAAABAA8AAAABABAAAAABABEAAAABABIAAAABABMAAAABABQAAAAB ABUAAAABABYAAAABABcAAAABABgAAAABABkAAAABABoAAAABABsAAAABABwA AAABAB0AAAABAB4AAAABAB8AAAABACAAAAABACEAAAABACIAAAABACMAAAAB ACQAAAABACUAAAABACYAAAACACcAAAACACgAAAABACkAAAABACoAAAABACsA AAABACwAAAABAC0AAAABAC4AAAABAC8AAAABADAAAAACADEAAAACADIAAAAB ADMAAAABADQAAAABADUAAAABADYAAAABADcAAAABADgAAAABADkAAAABACQB AABVAgAAWwIAAGMCAABwAgAAdgIAAIMCAACKAgAAmgIAAJoCAADcAgAA/wIA AH8DAAADBAAAFAQAAHwEAACrBAAAvAQAAMAEAAArBQAAWQUAAHAFAAAqBgAA ZAYAAI4GAADmBgAAGgcAAFUHAABwBwAA7QcAAAsIAABOCAAAcQgAAI4IAACq CAAA7AgAAA8JAACHCQAAGAoAABgKAAC5CgAAywoAAPUKAABNCwAAWgsAAGAL AACVCwAAmQsAAPoLAAD6CwAAqwwAALAMAAD2DAAAHQ0AAIUNAACWDQAAgBAA AMIQAAAVEgAAAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAA CQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAU AAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8A AAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAA ACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAA NgAAADcAAAA4AAAAOQAAAAUAAAA5AAAAMQAAACqAdXJuOnNjaGVtYXMtbWlj cm9zb2Z0LWNvbTpvZmZpY2U6c21hcnR0YWdzBYBwbGFjZQCAPQAAADkAAAAq gHVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOnNtYXJ0dGFncwmA UGxhY2VOYW1lAIA9AAAAMwAAACqAdXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNv bTpvZmZpY2U6c21hcnR0YWdzCYBQbGFjZVR5cGUAgEIAAAAyAAAAKoB1cm46 c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpzbWFydHRhZ3MOgGNvdW50 cnktcmVnaW9uAIA/AAAAOgAAACqAdXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNv bTpvZmZpY2U6c21hcnR0YWdzC4BzdG9ja3RpY2tlcgCADAAAAQzvoQAAAAAA OgAAAAAAOQAAAAAAOQAAAAAAOQAAAAAAOQAAAAAAOQAAAAAAOQAAAAAAMwAA AAAAMgAAAAAAMQAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAA OgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAA AAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAA OgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAA AAAAMQAAAAAAMgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAOgAAAAAA MQAAAAAAOgAAAAAAOgAAAAAAMgAAAAAAMQAAAAAAOgAAAAAAOgAAAAAAOgAA AAAAOgAAAAAAOgAAAAAAOgAAAAAAMQAAAAAAMQAAAAAAAAAAABUSAAAHAAAA AACPDwAAoA8AABUSAAAHADMABwAAAAAAAgAAAGkAAABpAAAAeAAAAKEAAAAF AQAABgEAAAcBAAAHAQAA3QEAAN0BAADsAQAA7QEAAPABAADxAQAA9AEAAPUB AAD2AQAA9wEAAPgBAAD4AQAABwIAAAgCAAANAgAADgIAABECAAASAgAAMwIA ADMCAABBAgAAQQIAAEICAABEAgAARQIAAEUCAACbAgAAnAIAAJ4CAACeAgAA qwIAAKsCAACtAgAArQIAAFEDAABnAwAAaQMAAGoDAABmBAAAaQQAANYEAADX BAAA2AQAANgEAAD7BAAA/gQAAGwFAABsBQAAbQUAAG0FAAAyBwAAMgcAADQH AAA1BwAAhgcAAIgHAACuCQAArwkAALAJAACwCQAAOAoAAFAKAABpCgAAagoA AOwKAADtCgAA7goAAO4KAADiDgAA4w4AAGMPAABkDwAAZQ8AAGYPAAA9EAAA PRAAANEQAADyEAAAeBEAAHkRAAB6EQAAEBIAABESAAASEgAAFRIAAAQAAwAE AAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQA AwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAAD AAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMA BAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAE AAMAAAAAABUSAAAHAEMAAkYIAY0Ht2QBAAAAAAAXbwYJKA6KagEAAAAAAL0U ww0bZ7YtAQAAAAAAkllhDo0Ht2QBAAAAAABNcZsSjQe3ZAEAAAAAAORLshOx CB4bAQAAAAAA7W4HFY0Ht2QBAAAAAAB5KTgVjQe3ZAEAAAAAAG5x+xVLR1pm AQAAAAAAIwxQF40Ht2QBAAAAAABIQoIZjQe3ZAEAAAAAAPk8nBmNB7dkAQAA AAAA8gBZGo0Ht2QBAAAAAACxCB4bS0daZgEAAAAAAKAqJxwAAAAAAAAAAAMB CgBQAAAAUAAAAAIApiEXHY0Ht2QBAAAAAAAOejUfF28GCQEAAAAAAABMPiON B7dkAQAAAAAAg0pjI40Ht2QBAAAAAABfHuEjjQe3ZAEAAAAAAPRe5ySNB7dk AQAAAAAAlSEKJY0Ht2QBAAAAAADrMjkljQe3ZAEAAAAAAPJLaSaNB7dkAQAA AAAA8xOdKo0Ht2QBAAAAAAAqddUqjQe3ZAEAAAAAABtnti2NB7dkAQAAAAAA Fz9ZLuZer34BAAAAAACNNmMujQe3ZAEAAAAAAOZMdzKNB7dkAQAAAAAAHB74 Mo0Ht2QBAAAAAABHRwAzjQe3ZAEAAAAAADJSSDiNB7dkAQAAAAAAuz00ObEI HhsBAAAAAACxX7A5Dno1HwEAAAAAABNvRDuNB7dkAQAAAAAAtzjxP40Ht2QB AAAAAAAWMf4/jQe3ZAEAAAAAAOkCC0GNB7dkAQAAAAAAfhCVQo0Ht2QBAAAA AABRdLNDjQe3ZAEAAAAAAERqHkSNB7dkAQAAAAAAZy8+RY0Ht2QBAAAAAADa JnpIsQgeGwEAAAAAAJ818kyNB7dkAQAAAAAADiz5TI0Ht2QBAAAAAADZTGdQ jQe3ZAEAAAAAACdKeFSNB7dkAQAAAAAAxwMeWo0Ht2QBAAAAAAA2PsxcjQe3 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgBAAC0ALQAgYEyNAAAAAAAAAAAAAAA AAAAChIAAAoSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAACDKDUQDwEAAI AP/9AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLWAAAAAAp8P8PAQABPwAA 5AQAAP///3////9/////f////3////9/////f////38IUl8AAAQAADIAAAAA AAAAAAAAAAAAAAAAAP//EgAAAAAAAAAVACAAIAAgACAAIAAgACAAIAAgACAA IAAgACAAIAAgACAAIAAgACAAIAAgAAAAAAAAAAgAQQBMAEwASQBOAFMATwBO AAYAaAB1AG4AdABlAHIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7/AAAFAQIAAAAAAAAAAAAAAAAAAAAA AAEAAADghZ/y+U9oEKuRCAArJ7PZMAAAAIABAAARAAAAAQAAAJAAAAACAAAA mAAAAAMAAAC4AAAABAAAAMQAAAAFAAAA2AAAAAYAAADkAAAABwAAAPAAAAAI AAAAAAEAAAkAAAAQAQAAEgAAABwBAAAKAAAAPAEAAAwAAABIAQAADQAAAFQB AAAOAAAAYAEAAA8AAABoAQAAEAAAAHABAAATAAAAeAEAAAIAAADkBAAAHgAA ABgAAAAgICAgICAgICAgICAgICAgICAgICAAAAAeAAAABAAAAAAAAAAeAAAA DAAAAEFMTElOU09OAAAAAB4AAAAEAAAAAAAAAB4AAAAEAAAAAAAAAB4AAAAI AAAATm9ybWFsAAAeAAAACAAAAGh1bnRlcgAAHgAAAAQAAAA2AAAAHgAAABgA AABNaWNyb3NvZnQgT2ZmaWNlIFdvcmQAAABAAAAAANJJawAAAABAAAAAAJah as2VywFAAAAAANae9YKuywEDAAAAAQAAAAMAAACyAgAAAwAAAGEPAAADAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAABQECAAAAAAAAAAAAAAAAAAAA AAACAAAAAtXN1ZwuGxCTlwgAKyz5rkQAAAAF1c3VnC4bEJOXCAArLPmuQAEA APwAAAAMAAAAAQAAAGgAAAAPAAAAcAAAAAUAAAB8AAAABgAAAIQAAAARAAAA jAAAABcAAACUAAAACwAAAJwAAAAQAAAApAAAABMAAACsAAAAFgAAALQAAAAN AAAAvAAAAAwAAADeAAAAAgAAAOQEAAAeAAAABAAAAAAAAAADAAAAIAAAAAMA AAAJAAAAAwAAAAoSAAADAAAAqBkLAAsAAAAAAAAACwAAAAAAAAALAAAAAAAA AAsAAAAAAAAAHhAAAAEAAAAWAAAAICAgICAgICAgICAgICAgICAgICAgAAwQ AAACAAAAHgAAAAYAAABUaXRsZQADAAAAAQAAAJgCAAADAAAAAAAAACAAAAAB AAAAOAAAAAIAAABAAAAAAQAAAAIAAAAMAAAAX1BJRF9ITElOS1MAAgAAAOQE AABBAAAAUAIAABIAAAADAAAAEgAbAAMAAAD/////AwAAAAIEAAADAAAAAQAA AB8AAABIAAAAaAB0AHQAcAA6AC8ALwB1AHAAbABvAGEAZAAuAHcAaQBrAGkA bQBlAGQAaQBhAC4AbwByAGcALwB3AGkAawBpAHAAZQBkAGkAYQAvAGUAbgAv ADQALwA0ADEALwBVAEsAXwBSAG8AeQBhAGwAXwBDAG8AYQB0AF8AbwBmAF8A QQByAG0AcwAuAHAAbgBnAAAAHwAAAAEAAAAAAHwMAwAAABIAGwADAAAA//// /wMAAAADBAAAAwAAAAEAAAAfAAAASAAAAGgAdAB0AHAAOgAvAC8AdQBwAGwA bwBhAGQALgB3AGkAawBpAG0AZQBkAGkAYQAuAG8AcgBnAC8AdwBpAGsAaQBw AGUAZABpAGEALwBlAG4ALwA0AC8ANAAxAC8AVQBLAF8AUgBvAHkAYQBsAF8A QwBvAGEAdABfAG8AZgBfAEEAcgBtAHMALgBwAG4AZwAAAB8AAAABAAAAAAB8 DAMAAAASABsAAwAAAP////8DAAAABAQAAAMAAAABAAAAHwAAAEgAAABoAHQA dABwADoALwAvAHUAcABsAG8AYQBkAC4AdwBpAGsAaQBtAGUAZABpAGEALgBv AHIAZwAvAHcAaQBrAGkAcABlAGQAaQBhAC8AZQBuAC8ANAAvADQAMQAvAFUA SwBfAFIAbwB5AGEAbABfAEMAbwBhAHQAXwBvAGYAXwBBAHIAbQBzAC4AcABu AGcAAAAfAAAAAQAAAAAAfAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAG AAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEA AAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAA AB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAA KAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAz AAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4A AAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABIAAAASQAA AEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAA VQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABg AAAAYQAAAGIAAABjAAAAZAAAAP7///9mAAAAZwAAAGgAAABpAAAAagAAAGsA AABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1AAAAdgAA AHcAAAB4AAAAeQAAAHoAAAB7AAAAfAAAAH0AAAB+AAAAfwAAAIAAAACBAAAA ggAAAIMAAACEAAAAhQAAAIYAAACHAAAAiAAAAIkAAACKAAAAiwAAAIwAAACN AAAAjgAAAI8AAACQAAAAkQAAAJIAAACTAAAAlAAAAJUAAACWAAAAlwAAAJgA AACZAAAAmgAAAJsAAACcAAAAnQAAAJ4AAACfAAAAoAAAAKEAAACiAAAAowAA AKQAAAClAAAApgAAAKcAAACoAAAAqQAAAKoAAACrAAAArAAAAK0AAACuAAAA rwAAALAAAACxAAAAsgAAALMAAAC0AAAAtQAAALYAAAC3AAAAuAAAALkAAAC6 AAAAuwAAALwAAAC9AAAAvgAAAL8AAADAAAAAwQAAAMIAAADDAAAAxAAAAMUA AADGAAAAxwAAAMgAAADJAAAAygAAAMsAAADMAAAAzQAAAM4AAADPAAAA0AAA ANEAAADSAAAA0wAAANQAAADVAAAA1gAAANcAAADYAAAA2QAAANoAAADbAAAA 3AAAAN0AAADeAAAA3wAAAOAAAADhAAAA4gAAAOMAAADkAAAA5QAAAOYAAADn AAAA6AAAAOkAAADqAAAA6wAAAOwAAADtAAAA7gAAAO8AAADwAAAA8QAAAPIA AADzAAAA9AAAAPUAAAD2AAAA9wAAAPgAAAD5AAAA+gAAAPsAAAD8AAAA/QAA AP4AAAD/AAAAAAEAAAEBAAACAQAAAwEAAAQBAAAFAQAABgEAAAcBAAAIAQAA CQEAAAoBAAALAQAADAEAAA0BAAAOAQAADwEAABABAAARAQAAEgEAABMBAAAU AQAAFQEAABYBAAAXAQAAGAEAABkBAAAaAQAAGwEAABwBAAAdAQAAHgEAAB8B AAAgAQAAIQEAACIBAAAjAQAAJAEAACUBAAAmAQAAJwEAACgBAAApAQAAKgEA ACsBAAAsAQAALQEAAC4BAAAvAQAAMAEAADEBAAAyAQAAMwEAADQBAAA1AQAA NgEAADcBAAA4AQAAOQEAADoBAAA7AQAAPAEAAD0BAAA+AQAAPwEAAEABAABB AQAAQgEAAEMBAABEAQAARQEAAEYBAABHAQAASAEAAEkBAABKAQAASwEAAEwB AABNAQAATgEAAE8BAABQAQAAUQEAAFIBAABTAQAAVAEAAFUBAABWAQAAVwEA AFgBAABZAQAAWgEAAFsBAABcAQAAXQEAAF4BAABfAQAAYAEAAGEBAABiAQAA YwEAAGQBAABlAQAAZgEAAGcBAABoAQAAaQEAAGoBAABrAQAAbAEAAG0BAABu AQAAbwEAAHABAABxAQAAcgEAAHMBAAB0AQAAdQEAAHYBAAB3AQAAeAEAAHkB AAB6AQAAewEAAHwBAAB9AQAAfgEAAH8BAACAAQAAgQEAAIIBAACDAQAAhAEA AIUBAACGAQAAhwEAAIgBAACJAQAAigEAAIsBAACMAQAAjQEAAI4BAACPAQAA kAEAAJEBAACSAQAAkwEAAJQBAACVAQAAlgEAAJcBAACYAQAAmQEAAJoBAACb AQAAnAEAAJ0BAACeAQAAnwEAAKABAAChAQAAogEAAKMBAACkAQAApQEAAKYB AACnAQAAqAEAAKkBAACqAQAAqwEAAKwBAACtAQAArgEAAK8BAACwAQAAsQEA ALIBAACzAQAAtAEAALUBAAC2AQAAtwEAALgBAAC5AQAAugEAALsBAAC8AQAA vQEAAL4BAAC/AQAAwAEAAMEBAADCAQAAwwEAAMQBAADFAQAAxgEAAMcBAADI AQAAyQEAAMoBAADLAQAAzAEAAM0BAADOAQAAzwEAANABAADRAQAA0gEAANMB AADUAQAA1QEAANYBAADXAQAA2AEAANkBAADaAQAA2wEAANwBAADdAQAA3gEA AN8BAADgAQAA4QEAAOIBAADjAQAA5AEAAOUBAADmAQAA5wEAAOgBAADpAQAA 6gEAAOsBAADsAQAA7QEAAO4BAADvAQAA8AEAAPEBAADyAQAA8wEAAPQBAAD1 AQAA9gEAAPcBAAD4AQAA+QEAAPoBAAD7AQAA/AEAAP0BAAD+AQAA/wEAAAAC AAABAgAAAgIAAAMCAAAEAgAABQIAAAYCAAAHAgAACAIAAAkCAAAKAgAACwIA AAwCAAANAgAADgIAAA8CAAAQAgAAEQIAABICAAATAgAAFAIAABUCAAAWAgAA FwIAABgCAAAZAgAAGgIAABsCAAAcAgAAHQIAAB4CAAAfAgAAIAIAACECAAAi AgAAIwIAACQCAAAlAgAAJgIAACcCAAAoAgAAKQIAACoCAAArAgAALAIAAC0C AAAuAgAALwIAADACAAAxAgAAMgIAADMCAAA0AgAANQIAADYCAAA3AgAAOAIA ADkCAAA6AgAAOwIAADwCAAA9AgAAPgIAAD8CAABAAgAAQQIAAEICAABDAgAA RAIAAEUCAABGAgAARwIAAEgCAABJAgAASgIAAEsCAABMAgAATQIAAE4CAABP AgAAUAIAAFECAABSAgAAUwIAAFQCAABVAgAAVgIAAFcCAABYAgAAWQIAAFoC AABbAgAAXAIAAF0CAABeAgAAXwIAAGACAABhAgAAYgIAAGMCAABkAgAAZQIA AGYCAABnAgAAaAIAAGkCAABqAgAAawIAAGwCAABtAgAAbgIAAG8CAABwAgAA cQIAAHICAABzAgAAdAIAAHUCAAB2AgAAdwIAAHgCAAB5AgAAegIAAHsCAAB8 AgAAfQIAAH4CAAB/AgAAgAIAAIECAACCAgAAgwIAAIQCAACFAgAAhgIAAIcC AACIAgAAiQIAAIoCAACLAgAAjAIAAI0CAACOAgAAjwIAAJACAACRAgAAkgIA AJMCAACUAgAAlQIAAJYCAACXAgAAmAIAAJkCAACaAgAAmwIAAJwCAACdAgAA ngIAAJ8CAACgAgAAoQIAAKICAACjAgAApAIAAKUCAACmAgAApwIAAKgCAACp AgAAqgIAAKsCAACsAgAArQIAAK4CAACvAgAAsAIAALECAACyAgAAswIAALQC AAC1AgAAtgIAALcCAAC4AgAAuQIAALoCAAC7AgAAvAIAAL0CAAC+AgAAvwIA AMACAADBAgAAwgIAAMMCAADEAgAAxQIAAMYCAADHAgAAyAIAAMkCAADKAgAA ywIAAMwCAADNAgAAzgIAAM8CAADQAgAA0QIAANICAADTAgAA1AIAANUCAADW AgAA1wIAANgCAADZAgAA2gIAANsCAADcAgAA3QIAAN4CAADfAgAA4AIAAOEC AADiAgAA4wIAAOQCAADlAgAA5gIAAOcCAADoAgAA6QIAAOoCAADrAgAA7AIA AO0CAADuAgAA7wIAAPACAADxAgAA8gIAAPMCAAD0AgAA9QIAAPYCAAD3AgAA +AIAAPkCAAD6AgAA+wIAAPwCAAD9AgAA/gIAAP8CAAAAAwAAAQMAAAIDAAAD AwAABAMAAAUDAAAGAwAABwMAAAgDAAAJAwAACgMAAAsDAAAMAwAADQMAAA4D AAAPAwAAEAMAABEDAAASAwAAEwMAABQDAAAVAwAAFgMAABcDAAAYAwAAGQMA ABoDAAAbAwAAHAMAAB0DAAAeAwAAHwMAACADAAAhAwAAIgMAACMDAAAkAwAA JQMAACYDAAAnAwAAKAMAACkDAAAqAwAAKwMAACwDAAAtAwAALgMAAC8DAAAw AwAAMQMAADIDAAAzAwAANAMAADUDAAA2AwAANwMAADgDAAA5AwAAOgMAADsD AAA8AwAAPQMAAD4DAAA/AwAAQAMAAEEDAABCAwAAQwMAAEQDAABFAwAARgMA AEcDAABIAwAASQMAAEoDAABLAwAATAMAAE0DAABOAwAATwMAAFADAABRAwAA UgMAAFMDAABUAwAAVQMAAFYDAABXAwAAWAMAAFkDAABaAwAAWwMAAFwDAABd AwAAXgMAAF8DAABgAwAAYQMAAGIDAABjAwAAZAMAAGUDAABmAwAAZwMAAGgD AABpAwAAagMAAGsDAABsAwAAbQMAAG4DAABvAwAAcAMAAHEDAAByAwAAcwMA AHQDAAB1AwAAdgMAAHcDAAB4AwAAeQMAAHoDAAB7AwAAfAMAAH0DAAB+AwAA fwMAAIADAACBAwAAggMAAIMDAACEAwAAhQMAAIYDAACHAwAAiAMAAIkDAACK AwAAiwMAAIwDAACNAwAAjgMAAI8DAACQAwAAkQMAAJIDAACTAwAAlAMAAJUD AACWAwAAlwMAAJgDAACZAwAAmgMAAJsDAACcAwAAnQMAAJ4DAACfAwAAoAMA AKEDAACiAwAAowMAAKQDAAClAwAApgMAAKcDAACoAwAAqQMAAKoDAACrAwAA rAMAAK0DAACuAwAArwMAALADAACxAwAAsgMAALMDAAC0AwAAtQMAALYDAAC3 AwAAuAMAALkDAAC6AwAAuwMAALwDAAC9AwAAvgMAAL8DAADAAwAAwQMAAMID AADDAwAAxAMAAMUDAADGAwAAxwMAAMgDAADJAwAAygMAAMsDAADMAwAAzQMA AM4DAADPAwAA0AMAANEDAADSAwAA0wMAANQDAADVAwAA1gMAANcDAADYAwAA 2QMAANoDAADbAwAA3AMAAN0DAADeAwAA3wMAAOADAADhAwAA4gMAAOMDAADk AwAA5QMAAOYDAADnAwAA6AMAAOkDAADqAwAA6wMAAOwDAADtAwAA7gMAAO8D AADwAwAA8QMAAPIDAADzAwAA9AMAAPUDAAD2AwAA9wMAAPgDAAD5AwAA+gMA APsDAAD8AwAA/QMAAP4DAAD/AwAAAAQAAAEEAAACBAAAAwQAAAQEAAAFBAAA BgQAAAcEAAAIBAAACQQAAAoEAAALBAAADAQAAA0EAAAOBAAADwQAABAEAAAR BAAAEgQAABMEAAAUBAAAFQQAABYEAAAXBAAAGAQAABkEAAAaBAAAGwQAABwE AAAdBAAAHgQAAB8EAAAgBAAAIQQAACIEAAAjBAAAJAQAACUEAAAmBAAAJwQA ACgEAAApBAAAKgQAACsEAAAsBAAALQQAAC4EAAAvBAAAMAQAADEEAAAyBAAA MwQAADQEAAA1BAAANgQAADcEAAA4BAAAOQQAADoEAAA7BAAAPAQAAD0EAAA+ BAAAPwQAAEAEAABBBAAAQgQAAEMEAABEBAAARQQAAEYEAABHBAAASAQAAEkE AABKBAAASwQAAEwEAABNBAAATgQAAE8EAABQBAAAUQQAAFIEAABTBAAAVAQA AFUEAABWBAAAVwQAAFgEAABZBAAAWgQAAFsEAABcBAAAXQQAAF4EAABfBAAA YAQAAGEEAABiBAAAYwQAAGQEAABlBAAAZgQAAGcEAABoBAAAaQQAAGoEAABr BAAAbAQAAG0EAABuBAAAbwQAAHAEAABxBAAAcgQAAHMEAAB0BAAAdQQAAHYE AAB3BAAAeAQAAHkEAAB6BAAAewQAAHwEAAB9BAAAfgQAAH8EAACABAAAgQQA AIIEAACDBAAAhAQAAIUEAACGBAAAhwQAAIgEAACJBAAAigQAAIsEAACMBAAA jQQAAI4EAACPBAAAkAQAAJEEAACSBAAAkwQAAJQEAACVBAAAlgQAAJcEAACY BAAAmQQAAJoEAACbBAAAnAQAAJ0EAACeBAAAnwQAAKAEAAChBAAAogQAAKME AACkBAAApQQAAKYEAACnBAAAqAQAAKkEAACqBAAAqwQAAKwEAACtBAAArgQA AK8EAACwBAAAsQQAALIEAACzBAAAtAQAALUEAAC2BAAAtwQAALgEAAC5BAAA ugQAALsEAAC8BAAAvQQAAL4EAAC/BAAAwAQAAMEEAADCBAAAwwQAAMQEAADF BAAAxgQAAMcEAADIBAAAyQQAAMoEAADLBAAAzAQAAM0EAADOBAAAzwQAANAE AADRBAAA0gQAANMEAADUBAAA1QQAANYEAADXBAAA2AQAANkEAADaBAAA2wQA ANwEAADdBAAA3gQAAN8EAADgBAAA4QQAAOIEAADjBAAA5AQAAOUEAADmBAAA 5wQAAOgEAADpBAAA6gQAAOsEAADsBAAA7QQAAO4EAADvBAAA8AQAAPEEAADy BAAA8wQAAPQEAAD1BAAA9gQAAPcEAAD4BAAA+QQAAPoEAAD7BAAA/AQAAP0E AAD+/////wQAAAAFAAABBQAAAgUAAAMFAAAEBQAABQUAAAYFAAAHBQAACAUA AAkFAAAKBQAACwUAAAwFAAANBQAADgUAAA8FAAAQBQAAEQUAABIFAAATBQAA /v///xUFAAAWBQAAFwUAABgFAAAZBQAAGgUAABsFAAD+////HQUAAB4FAAAf BQAAIAUAACEFAAAiBQAAIwUAAP7////9/////f////3////9/////f////3/ ///9/////f////3////9/////f///zAFAAD+/////v////7///////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////////1IAbwBvAHQAIABFAG4A dAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAWAAUB//////////8DAAAABgkCAAAAAADAAAAAAAAARgAAAAAAAAAA AAAAALCqJBODrssBMgUAAIAAAAAAAAAARABhAHQAYQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoA AgH///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAABlAAAAfDAJAAAAAAAxAFQAYQBiAGwAZQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgACAQEAAAAG AAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4E AAB4KgAAAAAAAFcAbwByAGQARABvAGMAdQBtAGUAbgB0AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAIBAgAAAAUAAAD///// AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPzJAAAA AAAABQBTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAgH///////////////8AAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBQAAABAAAAAAAAAFAEQA bwBjAHUAbQBlAG4AdABTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABp AG8AbgAAAAAAAAAAAAAAOAACAQQAAAD//////////wAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAABwFAAAAEAAAAAAAAAEAQwBvAG0AcABP AGIAagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAASAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/v////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////////////////wEA/v8DCgAA /////wYJAgAAAAAAwAAAAAAAAEYfAAAATWljcm9zb2Z0IE9mZmljZSBXb3Jk IERvY3VtZW50AAoAAABNU1dvcmREb2MAEAAAAFdvcmQuRG9jdW1lbnQuOAD0 ObJxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA ------=_NextPart_000_00C1_01C2A9A6.5F951E9C-- From aelder@sgi.com Mon Jan 31 10:40:09 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-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 p0VGe9JP113738 for ; Mon, 31 Jan 2011 10:40:09 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay2.corp.sgi.com (Postfix) with ESMTP id 477E1304081; Mon, 31 Jan 2011 08:42: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 p0VGgXWS018852; Mon, 31 Jan 2011 10:42:34 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.4/8.14.4/Submit) id p0VGgXTS018851; Mon, 31 Jan 2011 10:42:33 -0600 From: Alex Elder Message-Id: <201101311642.p0VGgXTS018851@stout.americas.sgi.com> Date: Mon, 31 Jan 2011 10:42:33 -0600 To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update for 2.6.38-rc3 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 accept the following updates for XFS, for 2.6.38-rc3 (if it's not too late) or 2.6.38-rc4. They are all fixes for bugs that have some pretty undesirable consequences. They address: - One spot in which a hang can occur due to neglecting to drop a lock - A bug which in some cases a bogus block number can be recorded in a block map btree, resulting in a subsequent BUG_ON(). - Two memory leaks - Three places in which extent sizes are allowed to exceed various size limits - One place where code depends on behavior that is not well-defined by the C standard - One problem in handling transaction commit errors Thank you. -Alex The following changes since commit 70d1f365568e0cdbc9f4ab92428e1830fdb09ab0: Merge branch 'for-linus' of git://git.infradead.org/ubi-2.6 (2011-01-31 13:04:51 +1000) are available in the git repository at: git://oss.sgi.com/xfs/xfs for-linus Dave Chinner (8): xfs: fix log ticket leak on forced shutdown. xfs: fix efi item leak on forced shutdown xfs: speculative delayed allocation uses rounddown_power_of_2 badly xfs: limit extent length for allocation to AG size xfs: prevent extsize alignment from exceeding maximum extent size xfs: limit extsize to size of AGs and/or MAXEXTLEN xfs: handle CIl transaction commit failures correctly xfs: fix dquot shaker deadlock bpm@sgi.com (1): xfs: xfs_bmap_add_extent_delay_real should init br_startblock fs/xfs/linux-2.6/xfs_ioctl.c | 20 ++++++++++++- fs/xfs/quota/xfs_qm.c | 46 ++++++++++++++----------------- fs/xfs/xfs_alloc.h | 16 +++++++++++ fs/xfs/xfs_bmap.c | 61 +++++++++++++++++++++++++++++++----------- fs/xfs/xfs_buf_item.c | 12 +++++--- fs/xfs/xfs_extfree_item.c | 3 +- fs/xfs/xfs_iomap.c | 7 ++++- fs/xfs/xfs_log.h | 2 +- fs/xfs/xfs_log_cil.c | 15 ++++------ fs/xfs/xfs_trans.c | 41 ++++++++++++++++++++------- 10 files changed, 152 insertions(+), 71 deletions(-) From stan@hardwarefreak.com Mon Jan 31 12:28:46 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0VISk8O119747 for ; Mon, 31 Jan 2011 12:28:46 -0600 X-ASG-Debug-ID: 1296498673-114d02320000-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 D0F3A29FD04 for ; Mon, 31 Jan 2011 10:31:13 -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 EhqEL4pIvmESCDig for ; Mon, 31 Jan 2011 10:31:13 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 9F87C6C15A; Mon, 31 Jan 2011 12:31:12 -0600 (CST) Message-ID: <4D46FFF0.5090405@hardwarefreak.com> Date: Mon, 31 Jan 2011 12:31:12 -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: lord worm CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs Digest, Vol 29, Issue 102 Subject: Re: xfs Digest, Vol 29, Issue 102 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: 1296498673 X-Barracuda-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.53993 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 lord worm put forth on 1/30/2011 10:41 PM: > Stan, do you check dates on links before you paste them here? I don't care if its the 1st results of the google search 'meaning of life', its irrelevant and oudated. At the time I sent that reply, you had posted no log information, nothing concrete to allow us to focus our troubleshooting efforts. At that time, the information in the link I provided could have been as relevant as any other. At that time I had not seen the off list back-n-forth between you and Dave that contained a little bit more information from you. Note that I said "might be relevant", not "this is your answer". Note that Dave recently pointed an OP to a 1996 XFS paper. Some information in that 15 year old paper is still relevant today. You cannot simply discard information because it appears "old" to you. Some aspects of XFS haven't changed in 16 years. As I said in my first response, xfsdump/xfsrestore would have avoided your current problem, as well as xfs_copy, as Dave pointed out. There is nothing set in stone that prevents dd from working with XFS filesystems. However, it is obviously less forgiving of error, user or otherwise, than the 'equivalent' XFS utilities. Lastly, getting testy with those attempting to assist you isn't going to further your efforts in fixing your problem. -- Stan From BATV+68a2df791979b57b2639+2717+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 31 13:15:02 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p0VJF2bI121859 for ; Mon, 31 Jan 2011 13:15:02 -0600 X-ASG-Debug-ID: 1296501449-196901790000-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 0D72E1A546D2; Mon, 31 Jan 2011 11:17:29 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id yzEwgJfNJ1rLwwuo; Mon, 31 Jan 2011 11:17:29 -0800 (PST) X-ASG-Whitelist: Client X-ASG-Whitelist: Barracuda Reputation Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PjzFY-0007lJ-KX; Mon, 31 Jan 2011 19:17:20 +0000 Date: Mon, 31 Jan 2011 14:17:20 -0500 From: Christoph Hellwig To: Dave Chinner Cc: david@lang.hm, Stan Hoeppner , Linux Kernel , xfs@oss.sgi.com, Christoph Hellwig , Justin Piszcz , Alex Elder , Mark Lord X-ASG-Orig-Subj: Re: xfs: very slow after mount, very slow at umount Subject: Re: xfs: very slow after mount, very slow at umount Message-ID: <20110131191720.GA2327@infradead.org> References: <4D419765.4070805@teksavvy.com> <4D41CA16.8070001@hardwarefreak.com> <4D42056E.2050505@hardwarefreak.com> <20110128135629.GX21311@dastard> <20110129054021.GB21311@dastard> <20110129073554.GC21311@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110129073554.GC21311@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: 1296501450 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, Jan 29, 2011 at 06:35:54PM +1100, Dave Chinner wrote: > Just because we can't do it right now doesn't mean it is not > possible. Array/raid controller vendors need to implement the SCSI > block limit VPD page, and if they do then stripe unit/stripe width > may be exposed for the device in sysfs. However, I haven't seen any > devices except for md and dm that actually export values that > reflect sunit/swidth in the files: I have access to a few big vendor arrays that export it, but I think they are still running beta firmware versions. From dalestephenson@mac.com Mon Jan 31 15:26:58 2011 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=BAYES_50,FREEMAIL_FROM, J_CHICKENPOX_35,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 p0VLQw2o127950 for ; Mon, 31 Jan 2011 15:26:58 -0600 X-ASG-Debug-ID: 1296509365-111c03a30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from asmtpout013.mac.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0551B2A097A for ; Mon, 31 Jan 2011 13:29:25 -0800 (PST) Received: from asmtpout013.mac.com (asmtpout013.mac.com [17.148.16.88]) by cuda.sgi.com with ESMTP id A1QHWqYXYTyLyVjn for ; Mon, 31 Jan 2011 13:29:25 -0800 (PST) MIME-version: 1.0 Content-transfer-encoding: 7BIT Content-type: text/plain; CHARSET=US-ASCII; format=flowed; delsp=yes Received: from [172.16.1.32] ([74.95.156.201]) by asmtp013.mac.com (Oracle Communications Messaging Exchange Server 7u4-20.01 64bit (built Nov 21 2010)) with ESMTPSA id <0LFW00HG7P0TZZ80@asmtp013.mac.com> for xfs@oss.sgi.com; Mon, 31 Jan 2011 13:29:19 -0800 (PST) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.2.15,1.0.148,0.0.0000 definitions=2011-01-31_09:2011-01-31,2011-01-31,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 ipscore=0 suspectscore=1 phishscore=0 bulkscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx engine=6.0.2-1012030000 definitions=main-1101310143 Message-id: <86FBE6A1-CDCD-4FA3-B389-8D8C75A67CAB@mac.com> From: Dale Stephenson To: xfs@oss.sgi.com X-ASG-Orig-Subj: Possible memory corruption in xfs_buf_iomove() Subject: Possible memory corruption in xfs_buf_iomove() Date: Mon, 31 Jan 2011 16:29:16 -0500 X-Mailer: Apple Mail (2.936) X-Barracuda-Connect: asmtpout013.mac.com[17.148.16.88] X-Barracuda-Start-Time: 1296509366 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0199 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.54005 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 At Snap Appliance, we were running into appeared to be random oops when setting/reading large attributes. Trevor Heathorn was able to trace the problem down to the function xfs_buf_iomove() in linux-2.6- xfs/xfs_buf.c. The size of the copy within the loop is calculated as a minimum of the page size and bp->b_count_desired, minus the applicable offsets. This can result in a copy size greater than the remaining size of the data length, which in the case of a read caused whatever else is in the buffer to be written past the end of the data area we had allocated. He found that this fix prevented the oops: --- xfs_buf.c 17 Sep 2009 00:19:49 -0000 1.4 +++ xfs_buf.c 31 Jan 2011 20:22:59 -0000 1.5 @@ -1313,6 +1313,7 @@ PAGE_CACHE_SIZE-cpoff, bp->b_count_desired-boff); ASSERT(((csize + cpoff) <= PAGE_CACHE_SIZE)); + csize = min(csize, (bend - boff)); switch (mode) { case XBRW_ZERO: This fix also keeps the write from copying past the end of the buffer, though at least in that case it won't be written to unallocated memory. It also may keep the zero from zeroing to the end of the buffer if the bsize passed in doesn't justify it, though I'm not sure if there are any callers of this function that do not want it zeroed to the end. Dale J. Stephenson dstephenson@overlandstorage.com dalestephenson@mac.com From mailman-bounces@mb2d91.vdrs.net Mon Jan 31 16:28:04 2011 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 (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id p0VMS4cW130746 for ; Mon, 31 Jan 2011 16:28:04 -0600 X-ASG-Debug-ID: 1296513030-17a401680000-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 7FDCC2A0D98 for ; Mon, 31 Jan 2011 14:30:30 -0800 (PST) Received: from mb2d91.vdrs.net (mb2d91.vdrs.net [112.78.2.91]) by cuda.sgi.com with ESMTP id 2d7iKCbsgM9Xe05k for ; Mon, 31 Jan 2011 14:30:30 -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 1Pk2GS-0003V4-2N for linux-xfs@oss.sgi.com; Tue, 01 Feb 2011 05:30:28 +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: Tue, 01 Feb 2011 05:08:23 +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: 1296513032 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3507 1.0000 -0.1502 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.25 X-Barracuda-Spam-Status: No, SCORE=0.25 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.54009 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= From david@fromorbit.com Mon Jan 31 16:49:08 2011 X-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_35 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 p0VMn8fg131743 for ; Mon, 31 Jan 2011 16:49:08 -0600 X-ASG-Debug-ID: 1296514294-17a302280000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail04.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9E40F2A0F46 for ; Mon, 31 Jan 2011 14:51:34 -0800 (PST) Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id XyAHHY7BWLbW79In for ; Mon, 31 Jan 2011 14:51:34 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEABvMRk15LGFf/2dsb2JhbACkenS9HQ2FQQSSBA Received: from ppp121-44-97-95.lns20.syd6.internode.on.net (HELO dastard) ([121.44.97.95]) by ipmail04.adl6.internode.on.net with ESMTP; 01 Feb 2011 09:21:33 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pk2ap-0001Aw-Nm; Tue, 01 Feb 2011 09:51:31 +1100 Date: Tue, 1 Feb 2011 09:51:31 +1100 From: Dave Chinner To: Dale Stephenson Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Possible memory corruption in xfs_buf_iomove() Subject: Re: Possible memory corruption in xfs_buf_iomove() Message-ID: <20110131225131.GK11040@dastard> References: <86FBE6A1-CDCD-4FA3-B389-8D8C75A67CAB@mac.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <86FBE6A1-CDCD-4FA3-B389-8D8C75A67CAB@mac.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1296514295 X-Barracuda-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.54011 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, Jan 31, 2011 at 04:29:16PM -0500, Dale Stephenson wrote: > At Snap Appliance, we were running into appeared to be random oops > when setting/reading large attributes. Trevor Heathorn was able to > trace the problem down to the function xfs_buf_iomove() in > linux-2.6-xfs/xfs_buf.c. The size of the copy within the loop is > calculated as a minimum of the page size and bp->b_count_desired, > minus the applicable offsets. This can result in a copy size > greater than the remaining size of the data length, which in the > case of a read caused whatever else is in the buffer to be written > past the end of the data area we had allocated. He found that this > fix prevented the oops: Good catch! Do you have a test case that reproduced the problem? If so, can you post that, too, so we can push it into xfstests as a regression test? [ As an aside, if you've got other regression tests that you'd like to have run regularly during mainline developement and can be integrated into xfstests, we can help make that happen. ] > --- xfs_buf.c 17 Sep 2009 00:19:49 -0000 1.4 > +++ xfs_buf.c 31 Jan 2011 20:22:59 -0000 1.5 > @@ -1313,6 +1313,7 @@ > PAGE_CACHE_SIZE-cpoff, bp->b_count_desired-boff); > > ASSERT(((csize + cpoff) <= PAGE_CACHE_SIZE)); > + csize = min(csize, (bend - boff)); > > switch (mode) { > case XBRW_ZERO: Yup, definitely needed. Can you add a Signed-off-by tag to this with an appropriate commit message (pretty much what you've already included with this report), we can get this fix into mainline quickly. Cheers, Dave. -- Dave Chinner david@fromorbit.com From ajeet.yadav.77@gmail.com Mon Jan 31 19:24:11 2011 X-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 p111OAsZ138805 for ; Mon, 31 Jan 2011 19:24:10 -0600 X-ASG-Debug-ID: 1296523596-296c030a0000-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 E7CE7127592D for ; Mon, 31 Jan 2011 17:26:36 -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 5PZlLFCmqZUR9Fis for ; Mon, 31 Jan 2011 17:26:36 -0800 (PST) Received: by vws8 with SMTP id 8so2419448vws.26 for ; Mon, 31 Jan 2011 17:26:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=Fsusn76HwTtcbPQ/ZNdFG2yQgvBZ28y8Sp0KsMfG5JA=; b=PR/OA+wMB8l2Fibc8BA7qLrAwrcWZbuVBNweM3jv6zkeDG7tP7B4SUYfhPcBMxICis YVpbwznPuLENHTx0HJe2Ep5IXiec2DLhVMiqjVmTotPOxmpyaKTemGfh2v6r7qXknXoq QFv59BJFat3Nz3afzgdz1Cguq3dsa64HDQjRY= 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=YJDpqPLJjWF/CQWptbDzFZ2nXnYDybE/ILk6+DdRKuG/KwNn+Yugp6Muw7pK9hiXL4 oJHuJ32M5ZjUtBzE5tzHf4AaVqIkqVGWgBFaw+n6DMdyLlNNPsUdKhatEU3hc5Gylbvz y8WcshO8YUatUL8RhaRf6Q8/XAbHlY4fGS6EQ= MIME-Version: 1.0 Received: by 10.220.178.72 with SMTP id bl8mr1845227vcb.127.1296523594331; Mon, 31 Jan 2011 17:26:34 -0800 (PST) Received: by 10.220.165.198 with HTTP; Mon, 31 Jan 2011 17:26:34 -0800 (PST) In-Reply-To: References: <20110118045730.GU28803@dastard> Date: Tue, 1 Feb 2011 10:26:34 +0900 Message-ID: X-ASG-Orig-Subj: Re: XFS internal error xfs_iformat(realtime) even after xfs_repair. Subject: Re: XFS internal error xfs_iformat(realtime) even after xfs_repair. From: Ajeet Yadav To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=90e6ba4fc332487908049b2e6cc9 X-Barracuda-Connect: mail-vw0-f53.google.com[209.85.212.53] X-Barracuda-Start-Time: 1296523597 X-Barracuda-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.54020 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 --90e6ba4fc332487908049b2e6cc9 Content-Type: text/plain; charset=ISO-8859-1 Hello Dave, Thank you for patch "xfs_repair: validate inode di_flags field" it works fine after a minor modifications "dino" to "dinoc", I wish to know when this will be available in mainline xfsprogs. Otherwise we need to maintain them separately. On Wed, Jan 19, 2011 at 10:06 AM, Ajeet Yadav wrote: > Please find my response below > > On Tue, Jan 18, 2011 at 1:57 PM, Dave Chinner wrote: > >> On Mon, Jan 17, 2011 at 09:12:54PM +0900, Ajeet Yadav wrote: >> > Kernel: 2.6.30.9, XFS backported from 2.6.34, xfsprogs-3.0.5 >> > >> > I used a script >> > 1. create some file, directories, symlinks >> > 2. unmount the file system >> > 3. run xfs_bd with blocktrash >> > 4. xfs_xfsrepair -L >> > 5. list "ls -lR" >> > 6. remove all file and directory "rm -rf * >> >> OK, so you are effectively corrupting random blocks by introducing >> random bit errors in the blocks. No surprise that some errors are >> not being detected - what is the blocktrash command that you are >> using? >> > > xfs_db -x -c blockget -c "blocktrash -s 12345 -n 256 -x 1 -y 1024 -3" > /dev/sda1 > > >> >> > Often during testing I get the below backtrace from kernel during ls, rm >> > even though I already run xfs_repair on it. >> > Is it related to xfsrepair or xfs ?. I think xfs_repair must have >> detected >> > this problem and corrected it. >> >> xfs_repair is not checking the di_flags field in the inode for >> sanity, hence having a wrong flag set is going unnoticed. >> > > ok > > >> >> > There is similar problem already reported by >> > http://oss.sgi.com/archives/xfs/2010-06/msg00349.html >> >> Similar error message (xfs_iformt found an inode corruption), but >> that one is a completely different problem. >> >> Does the patch below (compile tested only) detect the bad inode? >> > > Yes I have tested it, It seems to work fine, > I did not find this patch in mainline xfsprogs git, also I need to modify > the patch somewhat. > dino->di_flags ===================> dinoc->di_flags > because dino is not having any member named di_flags in xfsprogs-3.0.5, so > I used dinoc instead. > > >> >> Cheers, >> >> Dave. >> -- >> Dave Chinner >> david@fromorbit.com >> >> xfs_repair: validate inode di_flags field >> >> xfs_repair is not validating the di_flags field in the inode for >> sanity. Block fuzzing indicates that we are not picking situations >> like the RT bit being set on filesystems without realtime devices. >> >> Signed-off-by: Dave Chinner >> --- >> repair/dinode.c | 62 >> +++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 files changed, 62 insertions(+), 0 deletions(-) >> >> diff --git a/repair/dinode.c b/repair/dinode.c >> index 2fa850d..e05d4e0 100644 >> --- a/repair/dinode.c >> +++ b/repair/dinode.c >> @@ -2519,6 +2519,68 @@ process_dinode_int(xfs_mount_t *mp, >> goto clear_bad_out; >> } >> >> + /* >> + * check that we only have valid flags set, and those that are set >> make >> + * sense. >> + */ >> + if (dino->di_flags) { >> + uint16_t flags = be16_to_cpu(dino->di_flags); >> + >> + if (flags & ~XFS_DIFLAG_ANY) { >> + do_warn(_("Bad flags set in inode %llu"), lino); >> + flags &= ~XFS_DIFLAG_ANY; >> + } >> + >> + if (flags & (XFS_DIFLAG_REALTIME | XFS_DIFLAG_RTINHERIT)) >> { >> + /* need an rt-dev! */ >> + if (!rt_name) { >> + do_warn(_( >> + "inode %llu has RT flag set but there is no RT device"), lino); >> + flags &= ~(XFS_DIFLAG_REALTIME | >> + XFS_DIFLAG_RTINHERIT); >> + } >> + } >> + if (flags & XFS_DIFLAG_NEWRTBM_BIT) { >> + /* must be a rt bitmap inode */ >> + if (lino != mp->m_sb.sb_rbmino) { >> + do_warn(_("inode %llu not rt bitmap"), >> lino); >> + flags &= ~XFS_DIFLAG_NEWRTBM_BIT; >> + } >> + } >> + if (flags & (XFS_DIFLAG_RTINHERIT | >> + XFS_DIFLAG_EXTSZINHERIT | >> + XFS_DIFLAG_PROJINHERIT | >> + XFS_DIFLAG_NOSYMLINKS)) { >> + /* must be a directory */ >> + if (di_mode && !S_ISDIR(di_mode)) { >> + do_warn(_( >> + "directory flags set on non-directory inode >> %llu"), >> + lino); >> + flags &= ~(XFS_DIFLAG_RTINHERIT | >> + XFS_DIFLAG_EXTSZINHERIT | >> + XFS_DIFLAG_PROJINHERIT | >> + XFS_DIFLAG_NOSYMLINKS); >> + } >> + } >> + if (flags & (XFS_DIFLAG_REALTIME | XFS_XFLAG_EXTSIZE)) { >> + /* must be a file */ >> + if (di_mode && !S_ISREG(di_mode)) { >> + do_warn(_( >> + "file flags set on non-file inode %llu"), lino); >> + flags &= ~(XFS_DIFLAG_REALTIME | >> + XFS_XFLAG_EXTSIZE); >> + } >> + } >> + if (!verify_mode && flags != be16_to_cpu(dino->di_flags)) >> { >> + if (!no_modify) { >> + do_warn(_(", fixing bad flags.\n")); >> + dino->di_flags = cpu_to_be16(flags); >> + *dirty = 1; >> + } else >> + do_warn(_(", would fix bad flags.\n")); >> + } >> + } >> + >> if (verify_mode) >> return retval; >> >> > --90e6ba4fc332487908049b2e6cc9 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Hello Dave,
Thank you for patch=A0"xfs_repair: validate inode di_flags field&= quot; it works fine after a minor modifications "dino" to "d= inoc", I wish to know when this will be available in mainline xfsprogs= . Otherwise we need to maintain them separately.=A0

On Wed, Jan 19, 2011 at 10:06 AM, Ajeet Yadav <ajeet.yadav= .77@gmail.com> wrote:
Please find my response below
=A0
On Tue, Jan 18, 2011 at 1:57 PM, Dave Chinner <david= @fromorbit.com> wrote:
On Mon, Jan 17, 2011 at 09:12:54PM +0900, Ajeet Yadav wrote:
> K= ernel: 2.6.30.9, XFS backported from 2.6.34, xfsprogs-3.0.5
>
>= I used a script
> 1. create some file, directories, symlinks
> 2. unmount the file system
> 3. run xfs_bd with blocktrash
&g= t; 4. xfs_xfsrepair -L
> 5. list "ls -lR"
> 6. remove= all file and directory "rm -rf *

OK, so you are effectiv= ely corrupting random blocks by introducing
random bit errors in the blocks. No surprise that some errors are
not be= ing detected - what is the blocktrash command that you are
using?
=A0
xfs_db -x -c blockget -c "blocktrash -s 12345 -= n 256 -x 1 -y 1024 -3" /dev/sda1
=A0

> Often during testing I get the below backtrace from kernel du= ring ls, rm
> even though I already run xfs_repair on it.
> Is = it related to xfsrepair or xfs ?. I think xfs_repair must have detected
> this problem and corrected it.

xfs_repair is not checking= the di_flags field in the inode for
sanity, hence having a wrong flag s= et is going unnoticed.
=A0
ok
=A0

> There is similar problem already reported by
> http://oss.sgi.com/archives/xfs/2010-06/msg00349.html

Si= milar error message (xfs_iformt found an inode corruption), but
that one is a completely different problem.

Does the patch below (co= mpile tested only) detect the bad inode?
=A0
Yes I have tested it, It seems to work fine,
I did not find this patch in mainline xfsprogs git, also I need to mod= ify the patch somewhat.
dino->di_flags=A0 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D> dinoc->di_flags
because dino is not having any member named di_flags in xfsprogs-3.0.5= , so I used dinoc instead.
=A0

Cheers,

Dave.
--Dave Chinner
= david@fromorbit.com

xfs_repair: validate inode di_flags field

xfs_repair is not vali= dating the di_flags field in the inode for
sanity. Block fuzzing indicat= es that we are not picking situations
like the RT bit being set on files= ystems without realtime devices.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
---
=A0repair/dinode.c = | =A0 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
=A01 fi= les changed, 62 insertions(+), 0 deletions(-)

diff --git a/repair/dinode.c b/repair/dinode.c
index 2fa850d..e05d4e= 0 100644
--- a/repair/dinode.c
+++ b/repair/dinode.c
@@ -2519,6 +2= 519,68 @@ process_dinode_int(xfs_mount_t *mp,
=A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0goto clear_bad_out;
=A0 =A0 =A0 =A0}

+ =A0 =A0 =A0 /*
+ =A0 =A0 =A0 =A0* check that w= e only have valid flags set, and those that are set make
+ =A0 =A0 =A0 = =A0* sense.
+ =A0 =A0 =A0 =A0*/
+ =A0 =A0 =A0 if (dino->di_flags) = {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 uint16_t flags =3D be16_to_cpu(dino->= di_flags);
+
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (flags & ~XFS_DIFLAG_ANY) {
+ = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 do_warn(_("Bad flags set i= n inode %llu"), lino);
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 flags &=3D ~XFS_DIFLAG_ANY;
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
+
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (flags & (XFS_DIFLAG_REALTIME | X= FS_DIFLAG_RTINHERIT)) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /*= need an rt-dev! */
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!r= t_name) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = do_warn(_(
+ =A0 =A0 =A0 "inode %llu has RT flag set but there is no RT device&qu= ot;), lino);
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 flags &=3D ~(XFS_DIFLAG_REALTIME |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 XFS_DIFLAG= _RTINHERIT);
+ =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 if (flags & XFS_DIFLAG_NEWRT= BM_BIT) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* must be a rt = bitmap inode */
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (lino != =3D mp->m_sb.sb_rbmino) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 do_warn(_(&qu= ot;inode %llu not rt bitmap"), lino);
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 flags &=3D ~XFS_DIFLAG_NEWRTBM_BIT;+ =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 if (flags & (XFS_DIFLAG_RTIN= HERIT |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0XFS_DIFLAG_EXTSZIN= HERIT |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0XFS_DIF= LAG_PROJINHERIT |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0XFS_DIFLAG_NOSYMLINKS)) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 /* must be a directory */
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (di_mode && !S_ISD= IR(di_mode)) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 do_warn(_(
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "dire= ctory flags set on non-directory inode %llu"),
+ =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 lino);
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 flags &= =3D ~(XFS_DIFLAG_RTINHERIT |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 XFS_DIFLAG_EXTSZINHERIT= |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 XFS_DIFLAG_PROJINHERIT |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 XFS_DIFLAG_NOSYMLINKS);
+ =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 if (flags & (XFS_DIFLAG_REALTIME | XFS_XFLAG_EXTSIZE)) = {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* must be a file */
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (di_mode && !S_ISR= EG(di_mode)) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 do_warn(_(
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 "file= flags set on non-file inode %llu"), lino);
+ =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 flags &=3D ~(XFS_DIFLAG_REALTIM= E |
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 XFS_XFLAG_EXTSIZE);
+ =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 if (!verify_mode && flags !=3D be16_to_cpu(dino->di_= flags)) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!no_modify) = {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 do_warn(_(&qu= ot;, fixing bad flags.\n"));
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 dino->di_flags =3D cpu_to_be16(flags);
+ =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 *dirty =3D 1;
+ = =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 do_warn(_(&qu= ot;, would fix bad flags.\n"));
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
= + =A0 =A0 =A0 }
+
=A0 =A0 =A0 =A0if (verify_mode)
=A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0return retval;



--90e6ba4fc332487908049b2e6cc9-- From ajeet.yadav.77@gmail.com Mon Jan 31 20:54:05 2011 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 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 p112s55g143668 for ; Mon, 31 Jan 2011 20:54:05 -0600 X-ASG-Debug-ID: 1296528992-640b013e0000-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 43A1F2A188C for ; Mon, 31 Jan 2011 18:56:32 -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 NPTkPBaZzOPLRQ8q for ; Mon, 31 Jan 2011 18:56:32 -0800 (PST) Received: by qwe5 with SMTP id 5so6711939qwe.26 for ; Mon, 31 Jan 2011 18:56:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=JLYid884GvnvcdlF1tYRj+akxtJo6l1TF/dxTap0RRI=; b=sA/kSBNQRZ5RrWthW8Bii8bSaQ+rNU78G1j5rHUYIC5TeZtIj+zSZD56lAgm9jW+gC 5drMbLT7txjxLN0QnDnnD5lWbT36WoE2a4PAUmbIuPvcBed6hM7kJGzS04WtEg703Svr gEeMJYgsHzZl0oh7Alh2MCvPb1wnpR99SSX6M= 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=RcOjY3yBOr5c6MRdpQr6qeeo1UoCxTOA3vzRI1W4bRHEQxM9ghklbZKy4MoBdizHlB rFToFILPIX4istO9jQq17drbmcAqYD8NPH0KlVaf4vNEXZWCxbH/50Q+9mwftmuCg9xt SJuGuTagkBFEKhafoD+sbnG1BS3gI8fcaRT3M= MIME-Version: 1.0 Received: by 10.224.11.145 with SMTP id t17mr7275706qat.54.1296528992075; Mon, 31 Jan 2011 18:56:32 -0800 (PST) Received: by 10.220.165.198 with HTTP; Mon, 31 Jan 2011 18:56:32 -0800 (PST) In-Reply-To: <20110131041729.GJ21311@dastard> References: <20110131041729.GJ21311@dastard> Date: Tue, 1 Feb 2011 11:56:32 +0900 Message-ID: X-ASG-Orig-Subj: Re: [patch] xfsprogs: repair pagefault due to missed out sanity NULL check Subject: Re: [patch] xfsprogs: repair pagefault due to missed out sanity NULL check From: Ajeet Yadav To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0015175cd0fc038043049b2fae10 X-Barracuda-Connect: mail-qw0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1296528993 X-Barracuda-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.54027 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 --0015175cd0fc038043049b2fae10 Content-Type: text/plain; charset=ISO-8859-1 xfsprogs: repair pagefaults due to unhandled NULL check in da_read_buf() xfs_repair does not correctly handle bplist[i] for error situations in function da_read_buf(). If libxfs_readbuf() fails then bplist[i] = NULL, but error handing code calls libxfs_putbuf(bdlist[i]) for all indexes of i without first checking whether its NULL. This result in pagefault in libpthread library during pthread_mutex_unlock(). This problem is identified when we remove the storage while xfs_repair is running on it. Signed-off-by: Ajeet Yadav diff -Nurp xfsprogs/repair/dir2.c xfsprogs-dirty/repair/dir2.c --- xfsprogs/repair/dir2.c 2010-07-16 13:07:09.000000000 +0900 +++ xfsprogs-dirty/repair/dir2.c 2011-01-28 18:49:21.000000000 +0900 @@ -110,9 +110,10 @@ da_read_buf( bplist[i] = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bmp[i].startblock), XFS_FSB_TO_BB(mp, bmp[i].blockcount), 0); - if (!bplist[i]) + if (!bplist[i]){ + nex = i; goto failed; - + } pftrace("readbuf %p (%llu, %d)", bplist[i], (long long)XFS_BUF_ADDR(bplist[i]), XFS_BUF_COUNT(bplist[i])); --0015175cd0fc038043049b2fae10 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
xfsprogs: repair pagefaults due to unhandled NULL check in da_read_buf= ()
=A0
xfs_repair does not correctly handle bplist[i] for error situa= tions in
function da_read_buf(). If libxfs_readbuf() fails then bplist[i= ] =3D NULL,
but error handing code calls libxfs_putbuf(bdlist[i]) for all indexes of i<= br>without first checking whether its NULL. This result in pagefault in
= libpthread library during pthread_mutex_unlock().
This problem is identi= fied when we remove the storage while xfs_repair
is running on it.
=A0
Signed-off-by: Ajeet Yadav <ajeet.yadav.77@gmail.com>
=A0
diff= -Nurp xfsprogs/repair/dir2.c xfsprogs-dirty/repair/dir2.c
--- xfsprogs/= repair/dir2.c=A0=A0=A0=A0=A0 2010-07-16 13:07:09.000000000 +0900
+++ xfsprogs-dirty/repair/dir2.c=A0=A0=A0=A0=A0=A0=A0 2011-01-28 18:49:21.0= 00000000 +0900
@@ -110,9 +110,10 @@ da_read_buf(
=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0 bplist[i] =3D libxfs_readbuf(mp->m_dev,
= =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 XFS_FSB_TO_DADDR(mp, bmp[i].startblock),
=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 XFS_FSB_TO_BB(mp, bmp[i].blockcount), 0);
-=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (!bplist[i])
+=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0 if (!bplist[i]){
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 nex =3D i;
=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 goto failed;
-
+=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 pftrace("readbuf %p (%llu, %d)", bplist[= i],
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0 (long long)XFS_BUF_ADDR(bplist[i]),
=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_COUNT(bplist[i]));
--0015175cd0fc038043049b2fae10-- From david@fromorbit.com Mon Jan 31 22:09:41 2011 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-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 p1149fXn146642 for ; Mon, 31 Jan 2011 22:09:41 -0600 X-ASG-Debug-ID: 1296533527-635503ad0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CB7FA1B425F2 for ; Mon, 31 Jan 2011 20:12:07 -0800 (PST) Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id FcRxir3KguE0cW5e for ; Mon, 31 Jan 2011 20:12:07 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av0EAEoUR015LGFf/2dsb2JhbACEF6BodKsBkFwNgRqDNnQEkgA Received: from ppp121-44-97-95.lns20.syd6.internode.on.net (HELO dastard) ([121.44.97.95]) by ipmail06.adl2.internode.on.net with ESMTP; 01 Feb 2011 14:42:04 +1030 Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1Pk7b1-0001fM-2I; Tue, 01 Feb 2011 15:12:03 +1100 Date: Tue, 1 Feb 2011 15:12:02 +1100 From: Dave Chinner To: Ajeet Yadav Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS internal error xfs_iformat(realtime) even after xfs_repair. Subject: Re: XFS internal error xfs_iformat(realtime) even after xfs_repair. Message-ID: <20110201041202.GL11040@dastard> References: <20110118045730.GU28803@dastard> 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: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1296533528 X-Barracuda-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.54031 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, Feb 01, 2011 at 10:26:34AM +0900, Ajeet Yadav wrote: > Hello Dave, > Thank you for patch "xfs_repair: validate inode di_flags field" it works > fine after a minor modifications "dino" to "dinoc", I wish to know when this > will be available in mainline xfsprogs. Otherwise we need to maintain them > separately. It will be in the next release, whenever we make that. I've got to finish of the sync of the userspace/kernel code, there's a few fixes already in the -dev branch as well, we need to pick up the FIEMAP changes to xfs_io, and so on. We probably should get t─is all done and plan for a new release in the next few weeks... Cheers, Dave. -- Dave Chinner david@fromorbit.com From pv@fb.com Mon Jan 31 22:42:44 2011 X-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_44 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 p114ghT0149448 for ; Mon, 31 Jan 2011 22:42:44 -0600 X-ASG-Debug-ID: 1296535511-525b01a00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx-out.facebook.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 966AA8E28B4 for ; Mon, 31 Jan 2011 20:45:11 -0800 (PST) Received: from mx-out.facebook.com (outmail020.snc4.facebook.com [66.220.144.152]) by cuda.sgi.com with ESMTP id oOHWd5tmuvQnz9Ht for ; Mon, 31 Jan 2011 20:45:11 -0800 (PST) Received: from [192.168.18.212] ([192.168.18.212:41603] helo=mail.thefacebook.com) by mta025.snc4.facebook.com (envelope-from ) (ecelerity 2.2.2.45 r(34222M)) with ESMTP id CC/90-29592-6DF874D4; Mon, 31 Jan 2011 20:45:11 -0800 Received: from SC-MBX02-2.TheFacebook.com ([fe80::f8e1:3c09:1d21:8dc1]) by sc-hub04.TheFacebook.com ([192.168.18.212]) with mapi id 14.01.0218.012; Mon, 31 Jan 2011 20:45:10 -0800 From: Peter Vajgel To: Dave Chinner , Jef Fox CC: "xfs@oss.sgi.com" X-ASG-Orig-Subj: RE: XFS Preallocation Subject: RE: XFS Preallocation Thread-Topic: XFS Preallocation Thread-Index: Acu+pyslMT8bBaoITbmmG6aQZJGIGgAadf3QAB748QAAHBqRwA== Date: Tue, 1 Feb 2011 04:45:09 +0000 Message-ID: <3F5ACD12257C714E9C0535D0A839171802A9B4@SC-MBX02-2.TheFacebook.com> References: <155CAEA5D902E7429569DD197567724A01534D42@mail1.ad.kinetx.com> <20110128045205.GR21311@dastard> <155CAEA5D902E7429569DD197567724A01534D60@mail1.ad.kinetx.com> <20110129001700.GZ21311@dastard> In-Reply-To: <20110129001700.GZ21311@dastard> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [192.168.18.252] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: outmail020.snc4.facebook.com[66.220.144.152] X-Barracuda-Start-Time: 1296535511 X-Barracuda-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.54034 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 > Preallocation is the only option. Allowing preallocation without marking = extents as unwritten opens a massive security hole (i.e. > exposes stale data) so I say no to any request for addition of such funct= ionality (and have for years). How about opening this option to at least root (root can already read the d= evice anyway)?. There are cases when creating large files without writing t= o them is important. A good example is testing xfs overhead when doing a sp= ecific workload (like random reads) to large files. In this case we want to= hit the disk on every request. Currently we have a workaround (below) but = official support would be preferable. --pv # create_xfs_files dev=3D$1 mntpt=3D$2 dircount=3D$3 filecount=3D$4 size=3D$5 # Umount. umount $2 # Create the fs. mkfs -t xfs -f -d unwritten=3D0,su=3D256k,sw=3D10 -l su=3D256k -L "/hay" $d= ev # Clear unwritten flag - current xfs ignores this flag typeset -i agcount=3D$(xfs_db -c "sb" -c "print" $dev | grep agcount) typeset -i i=3D0 while [[ $i !=3D $agcount ]] do xfs_db -x -c "sb $i" -c "write versionnum 0xa4a4" $dev i=3Di+1 done # Mount the filesystem. mount -t xfs -o nobarrier,noatime,nodiratime,inode64,allocsize=3D1g $dev $m= ntpt i=3D0 while [[ $i !=3D $dircount ]] do mkdir $mntpt/dir$i typeset -i j=3D0 while [[ $j !=3D $filecount ]] do file=3D$mntpt/dir$i/file$j xfs_io -f -c "resvsp 0 $size" $file inum=3D$(ls -i $file | awk '{print $1}') umount $mntpt xfs_db -x -c "inode $inum" -c "write core.size $size" $dev mount -t xfs -o nobarrier,noatime,nodiratime,inode64,allocsize=3D1g $de= v $mntpt j=3Dj+1 done i=3Di+1 done