From Michelleberggreg@ymail.com Fri Jan 1 16:16:31 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.2 required=5.0 tests=BAYES_50,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o01MGVch034414 for ; Fri, 1 Jan 2010 16:16:31 -0600 X-ASG-Debug-ID: 1262384237-2a1601aa0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from node142.smtp.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A4AED136538 for ; Fri, 1 Jan 2010 14:17:17 -0800 (PST) Received: from node142.smtp.com (node142.smtp.com [72.55.175.142]) by cuda.sgi.com with ESMTP id noUb1A7vWxQ9xhFn for ; Fri, 01 Jan 2010 14:17:17 -0800 (PST) Received: from www.vexat.net (174.36.218.26-static.reverse.softlayer.com [174.36.218.26]) by node142.smtp.com (Postfix) with ESMTPA id 5B7512AF849 for ; Fri, 1 Jan 2010 17:17:16 -0500 (EST) X-SMTPCOM-Spam-Policy: interspire.smtp.com is a paid relay service. We do not tolerate UCE of any kind. Please report it ASAP to abuse@smtp.com X-SMTPCOM-Sender-ID: 1161 X-SMTPCOM-Tracking-Number: 125455983 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Hi Subject: Hi Message-ID: <63ba90258fee40aac2fba1123950d4fa@www.vexat.net> Date: Fri, 01 Jan 2010 16:17:16 -0600 From: "Michelle Berggreg" Reply-To: Michelleberggreg@ymail.com MIME-Version: 1.0 X-Mailer-LID: 42 List-Unsubscribe: X-Mailer-RecptId: 118198 X-Mailer-SID: 82 X-Mailer-Sent-By: 4 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: node142.smtp.com[72.55.175.142] X-Barracuda-Start-Time: 1262384238 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0007 1.0000 -2.0163 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18695 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hey, I'm just so excited, I can't tell you! I just bought a Louis Vuitton Monogram Graffiti Neverfull Bag for New Year. Have a look: http://www.vexat.net/iem/link.php?M=118198&N=82&L=97&F=T (Isn't it just AWESOME!) And this is the BEST Part. I got it for $200 off this super cool website selling some A+ Replicas. No one even notices its not authentic! Try your hand out. I'm sure you'll love it. Feel free to write to me in case you're looking for some coupons. I have some ;) Cya! Michelle Berggreg Powered by Interspire From SRS0+jZ7L+31+fromorbit.com=dave@internode.on.net Fri Jan 1 20:41:19 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o022fIk9051669 for ; Fri, 1 Jan 2010 20:41:19 -0600 X-ASG-Debug-ID: 1262400124-657402940000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6C2D01C1ED6D for ; Fri, 1 Jan 2010 18:42: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 Nqg9JFd5dPFn9ZkY for ; Fri, 01 Jan 2010 18:42:05 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10856271-1927428 for ; Sat, 02 Jan 2010 13:12:03 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NQtwH-0007we-AD for xfs@oss.sgi.com; Sat, 02 Jan 2010 13:42:01 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NQtsi-0004yn-GO for xfs@oss.sgi.com; Sat, 02 Jan 2010 13:38:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] XFS: Kill filestreams cache flush Subject: [PATCH] XFS: Kill filestreams cache flush Date: Sat, 2 Jan 2010 13:38:20 +1100 Message-Id: <1262399900-19110-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1262400127 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The filestreams cache flush is not needed in the sync code as it does not affect data writeback, and it is now not used by the growfs code, either, so kill it. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_sync.c | 3 --- fs/xfs/xfs_filestream.c | 14 -------------- fs/xfs/xfs_filestream.h | 1 - fs/xfs/xfs_mru_cache.c | 2 +- fs/xfs/xfs_mru_cache.h | 1 - 5 files changed, 1 insertions(+), 20 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 0e17683..c980d68 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -444,9 +444,6 @@ xfs_quiesce_data( xfs_sync_data(mp, SYNC_WAIT); xfs_qm_sync(mp, SYNC_WAIT); - /* drop inode references pinned by filestreams */ - xfs_filestream_flush(mp); - /* write superblock and hoover up shutdown errors */ error = xfs_sync_fsdata(mp, SYNC_WAIT); diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index 914d00d..390850e 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -455,20 +455,6 @@ xfs_filestream_unmount( } /* - * If the mount point's m_perag tree is going to be modified, all - * outstanding cache entries must be flushed to avoid accessing reference count - * addresses that have been freed. The call to xfs_filestream_flush() must be - * made inside the block that holds the m_perag_lock in write mode to do the - * reallocation. - */ -void -xfs_filestream_flush( - xfs_mount_t *mp) -{ - xfs_mru_cache_flush(mp->m_filestream); -} - -/* * Return the AG of the filestream the file or directory belongs to, or * NULLAGNUMBER otherwise. */ diff --git a/fs/xfs/xfs_filestream.h b/fs/xfs/xfs_filestream.h index 58378b2..260f757 100644 --- a/fs/xfs/xfs_filestream.h +++ b/fs/xfs/xfs_filestream.h @@ -135,7 +135,6 @@ int xfs_filestream_init(void); void xfs_filestream_uninit(void); int xfs_filestream_mount(struct xfs_mount *mp); void xfs_filestream_unmount(struct xfs_mount *mp); -void xfs_filestream_flush(struct xfs_mount *mp); xfs_agnumber_t xfs_filestream_lookup_ag(struct xfs_inode *ip); int xfs_filestream_associate(struct xfs_inode *dip, struct xfs_inode *ip); void xfs_filestream_deassociate(struct xfs_inode *ip); diff --git a/fs/xfs/xfs_mru_cache.c b/fs/xfs/xfs_mru_cache.c index 4b0613d..45ce15d 100644 --- a/fs/xfs/xfs_mru_cache.c +++ b/fs/xfs/xfs_mru_cache.c @@ -398,7 +398,7 @@ exit: * guaranteed that all the free functions for all the elements have finished * executing and the reaper is not running. */ -void +static void xfs_mru_cache_flush( xfs_mru_cache_t *mru) { diff --git a/fs/xfs/xfs_mru_cache.h b/fs/xfs/xfs_mru_cache.h index 5d439f3..36dd3ec 100644 --- a/fs/xfs/xfs_mru_cache.h +++ b/fs/xfs/xfs_mru_cache.h @@ -42,7 +42,6 @@ void xfs_mru_cache_uninit(void); int xfs_mru_cache_create(struct xfs_mru_cache **mrup, unsigned int lifetime_ms, unsigned int grp_count, xfs_mru_cache_free_func_t free_func); -void xfs_mru_cache_flush(xfs_mru_cache_t *mru); void xfs_mru_cache_destroy(struct xfs_mru_cache *mru); int xfs_mru_cache_insert(struct xfs_mru_cache *mru, unsigned long key, void *value); -- 1.6.5 From SRS0+BAOp+31+fromorbit.com=dave@internode.on.net Fri Jan 1 20:41:42 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o022fghb051706 for ; Fri, 1 Jan 2010 20:41:42 -0600 X-ASG-Debug-ID: 1262400148-623702ae0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5C5B0136B25 for ; Fri, 1 Jan 2010 18:42:29 -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 7giutCLkXQb8oGjK for ; Fri, 01 Jan 2010 18:42:29 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10928435-1927428 for ; Sat, 02 Jan 2010 13:12:28 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NQtwg-0007wk-V9 for xfs@oss.sgi.com; Sat, 02 Jan 2010 13:42:26 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NQttI-000508-5M for xfs@oss.sgi.com; Sat, 02 Jan 2010 13:38:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] XFS: Ensure we force all busy extents in range to disk Subject: [PATCH] XFS: Ensure we force all busy extents in range to disk Date: Sat, 2 Jan 2010 13:38:56 +1100 Message-Id: <1262399936-19195-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1262400151 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean When we search for and find a busy extent during allocation we force the log out to ensure the extent free transaction is on disk before the allocation transaction. The curret implementation has a subtle bug in it - it does not handle multiple overlapping ranges. That is, if we free lots of little extents into a single contiguous extent, then allocate the contiguous extent, the busy search code stops searching at the first extent it finds that overlaps the allocated range. It then uses the commit LSN of the transaction to force the log out to. Unfortunately, the other busy ranges might have more recent commit LSNs than the first busy extent that is found, and this results in xfs_alloc_search_busy() returning before all the extent free transactions are on disk for the range being allocated. This can lead to potential metadata corruption or stale data exposure after a crash because log replay won't replay all the extent free transactions that cover the allocation range. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_trace.h | 9 +++++-- fs/xfs/xfs_alloc.c | 44 ++++++++++++++++++++--------------------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 5ec1475..2b0819a 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -1064,14 +1064,15 @@ TRACE_EVENT(xfs_alloc_unbusy, TRACE_EVENT(xfs_alloc_busysearch, TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, - xfs_extlen_t len, int found), - TP_ARGS(mp, agno, agbno, len, found), + xfs_extlen_t len, int found, xfs_lsn_t lsn), + TP_ARGS(mp, agno, agbno, len, found, lsn), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_agnumber_t, agno) __field(xfs_agblock_t, agbno) __field(xfs_extlen_t, len) __field(int, found) + __field(xfs_lsn_t, lsn) ), TP_fast_assign( __entry->dev = mp->m_super->s_dev; @@ -1079,12 +1080,14 @@ TRACE_EVENT(xfs_alloc_busysearch, __entry->agbno = agbno; __entry->len = len; __entry->found = found; + __entry->lsn = lsn; ), - TP_printk("dev %d:%d agno %u agbno %u len %u %s", + TP_printk("dev %d:%d agno %u agbno %u len %u force lsn 0x%llx %s", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, __entry->agbno, __entry->len, + __entry->lsn, __print_symbolic(__entry->found, XFS_BUSY_STATES)) ); diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index d58ca99..407a671 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -2565,7 +2565,7 @@ xfs_alloc_search_busy(xfs_trans_t *tp, struct xfs_perag *pag; xfs_perag_busy_t *bsy; xfs_agblock_t uend, bend; - xfs_lsn_t lsn; + xfs_lsn_t lsn = 0; int cnt; pag = xfs_perag_get(tp->t_mountp, agno); @@ -2574,34 +2574,32 @@ xfs_alloc_search_busy(xfs_trans_t *tp, uend = bno + len - 1; - /* search pagb_list for this slot, skipping open slots */ - for (bsy = pag->pagb_list; cnt; bsy++) { + /* + * search pagb_list for this slot, skipping open slots. We have to + * search the entire array as there may be multiple overlaps and + * we have to get the most recent LSN for the log force to push out + * all the transactions that span the range. + */ + for (bsy = pag->pagb_list; cnt; bsy++, cnt--) { + if (!bsy->busy_tp) + continue; - /* - * (start1,length1) within (start2, length2) - */ - if (bsy->busy_tp != NULL) { - bend = bsy->busy_start + bsy->busy_length - 1; - if ((bno > bend) || (uend < bsy->busy_start)) { - cnt--; - } else { - break; - } - } - } + bend = bsy->busy_start + bsy->busy_length - 1; + if ((bno > bend) || (uend < bsy->busy_start)) + continue; - trace_xfs_alloc_busysearch(tp->t_mountp, agno, bno, len, !!cnt); + /* (start1,length1) within (start2, length2) */ + if (XFS_LSN_CMP(bsy->busy_tp->t_commit_lsn, lsn) > 0) + lsn = bsy->busy_tp->t_commit_lsn; + } + spin_unlock(&pag->pagb_lock); + xfs_perag_put(pag); + trace_xfs_alloc_busysearch(tp->t_mountp, agno, bno, len, !!cnt, lsn); /* * If a block was found, force the log through the LSN of the * transaction that freed the block */ - if (cnt) { - lsn = bsy->busy_tp->t_commit_lsn; - spin_unlock(&pag->pagb_lock); + if (lsn) xfs_log_force(tp->t_mountp, lsn, XFS_LOG_FORCE|XFS_LOG_SYNC); - } else { - spin_unlock(&pag->pagb_lock); - } - xfs_perag_put(pag); } -- 1.6.5 From SRS0+Qv3u+31+fromorbit.com=dave@internode.on.net Fri Jan 1 20:42:25 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o022gP78051762 for ; Fri, 1 Jan 2010 20:42:25 -0600 X-ASG-Debug-ID: 1262400192-6be302780000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 73C311DAB36D for ; Fri, 1 Jan 2010 18:43: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 dGksxI35Ac4rdvPS for ; Fri, 01 Jan 2010 18:43:13 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10818608-1927428 for ; Sat, 02 Jan 2010 13:13:12 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NQtxO-0007wo-Tg for xfs@oss.sgi.com; Sat, 02 Jan 2010 13:43:10 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NQtu0-00051S-43 for xfs@oss.sgi.com; Sat, 02 Jan 2010 13:39:40 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] XFS: Don't flush stale inodes Subject: [PATCH] XFS: Don't flush stale inodes Date: Sat, 2 Jan 2010 13:39:40 +1100 Message-Id: <1262399980-19277-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1262400194 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Because inodes remain in cache much longer than inode buffers do under memory pressure, we can get the situation where we have stale, dirty inodes being reclaimed but the backing storage has been freed. Hence we should never, ever flush XFS_ISTALE inodes to disk as there is no guarantee that the backing buffer is in cache and still marked stale when the flush occurs. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index c2618db..e5c9953 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2846,10 +2846,14 @@ xfs_iflush( mp = ip->i_mount; /* - * If the inode isn't dirty, then just release the inode - * flush lock and do nothing. + * If the inode isn't dirty, then just release the inode flush lock and + * do nothing. Treat stale inodes the same; we cannot rely on the + * backing buffer remaining stale in cache for the remaining life of + * the stale inode and so xfs_itobp() below may give us a buffer that + * no longer contains inodes below. Doing this stale check here also + * avoids forcing the log on pinned, stale inodes. */ - if (xfs_inode_clean(ip)) { + if (xfs_inode_clean(ip) || xfs_iflags_test(ip, XFS_ISTALE)) { xfs_ifunlock(ip); return 0; } -- 1.6.5 From SRS0+BAOp+31+fromorbit.com=dave@internode.on.net Fri Jan 1 20:43:00 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_63,J_CHICKENPOX_65,LOCAL_GNU_PATCH autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o022h0RO051829 for ; Fri, 1 Jan 2010 20:43:00 -0600 X-ASG-Debug-ID: 1262400227-14d700450000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AB91B135524 for ; Fri, 1 Jan 2010 18:43: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 vZNPrUJuK7PhtWg9 for ; Fri, 01 Jan 2010 18:43:48 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10928453-1927428 for ; Sat, 02 Jan 2010 13:13:46 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NQtxx-0007wt-IC for xfs@oss.sgi.com; Sat, 02 Jan 2010 13:43:45 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NQtuY-00052n-Oq for xfs@oss.sgi.com; Sat, 02 Jan 2010 13:40:14 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] XFS: Use list_heads for log recovery item lists Subject: [PATCH] XFS: Use list_heads for log recovery item lists Date: Sat, 2 Jan 2010 13:40:14 +1100 Message-Id: <1262400014-19360-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1262400229 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Remove the roll-your-own linked list operations. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 205 ++++++++++++++++------------------------------ fs/xfs/xfs_log_recover.h | 23 +++--- 2 files changed, 81 insertions(+), 147 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index abc2034..c988261 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -50,8 +50,6 @@ STATIC int xlog_find_zeroed(xlog_t *, xfs_daddr_t *); STATIC int xlog_clear_stale_blocks(xlog_t *, xfs_lsn_t); -STATIC void xlog_recover_insert_item_backq(xlog_recover_item_t **q, - xlog_recover_item_t *item); #if defined(DEBUG) STATIC void xlog_recover_check_summary(xlog_t *); #else @@ -1373,36 +1371,45 @@ xlog_clear_stale_blocks( 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 @@ -1415,8 +1422,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 + @@ -1424,7 +1430,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; @@ -1461,8 +1468,7 @@ xlog_recover_add_to_trans( if (!len) return 0; - item = trans->r_itemq; - if (item == NULL) { + 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: " @@ -1480,12 +1486,15 @@ 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 */ if (in_f->ilf_size == 0 || @@ -1510,96 +1519,29 @@ xlog_recover_add_to_trans( 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; - } -} - -STATIC void -xlog_recover_insert_item_frontq( - xlog_recover_item_t **q, - xlog_recover_item_t *item) -{ - xlog_recover_insert_item_backq(q, item); - *q = item; -} - +/* + * Sort the log items in the transaction. Cancelled buffers need + * to be put first so they are processed before any items that might + * modify the buffers. If they are cancelled, then the modifications + * don't need to be replayed. + */ STATIC int xlog_recover_reorder_trans( xlog_recover_t *trans) { - xlog_recover_item_t *first_item, *itemq, *itemq_next; - xfs_buf_log_format_t *buf_f; - ushort flags = 0; + xlog_recover_item_t *item, *n; + LIST_HEAD(sort_list); + + list_splice_init(&trans->r_itemq, &sort_list); + list_for_each_entry_safe(item, n, &sort_list, ri_list) { + xfs_buf_log_format_t *buf_f; - first_item = itemq = trans->r_itemq; - trans->r_itemq = NULL; - do { - itemq_next = itemq->ri_next; - buf_f = (xfs_buf_log_format_t *)itemq->ri_buf[0].i_addr; + buf_f = (xfs_buf_log_format_t *)item->ri_buf[0].i_addr; - switch (ITEM_TYPE(itemq)) { + switch (ITEM_TYPE(item)) { case XFS_LI_BUF: - flags = buf_f->blf_flags; - if (!(flags & XFS_BLI_CANCEL)) { - xlog_recover_insert_item_frontq(&trans->r_itemq, - itemq); + if (!(buf_f->blf_flags & XFS_BLI_CANCEL)) { + list_move(&item->ri_list, &trans->r_itemq); break; } case XFS_LI_INODE: @@ -1607,7 +1549,7 @@ xlog_recover_reorder_trans( case XFS_LI_QUOTAOFF: case XFS_LI_EFD: case XFS_LI_EFI: - xlog_recover_insert_item_backq(&trans->r_itemq, itemq); + list_move_tail(&item->ri_list, &trans->r_itemq); break; default: xlog_warn( @@ -1615,8 +1557,8 @@ xlog_recover_reorder_trans( ASSERT(0); return XFS_ERROR(EIO); } - itemq = itemq_next; - } while (first_item != itemq); + } + ASSERT(list_empty(&sort_list)); return 0; } @@ -2820,14 +2762,13 @@ xlog_recover_do_trans( int pass) { int error = 0; - xlog_recover_item_t *item, *first_item; + xlog_recover_item_t *item; error = xlog_recover_reorder_trans(trans); if (error) return error; - first_item = item = trans->r_itemq; - do { + list_for_each_entry(item, &trans->r_itemq, ri_list) { switch (ITEM_TYPE(item)) { case XFS_LI_BUF: error = xlog_recover_do_buffer_trans(log, item, pass); @@ -2860,8 +2801,7 @@ xlog_recover_do_trans( if (error) return error; - item = item->ri_next; - } while (first_item != item); + } return 0; } @@ -2875,21 +2815,18 @@ STATIC void xlog_recover_free_trans( xlog_recover_t *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); } @@ -2897,14 +2834,12 @@ xlog_recover_free_trans( STATIC int xlog_recover_commit_trans( xlog_t *log, - xlog_recover_t **q, xlog_recover_t *trans, int pass) { int error; - 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 */ @@ -2932,7 +2867,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) @@ -2966,7 +2901,7 @@ 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, @@ -2984,7 +2919,7 @@ xlog_recover_process_data( 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); @@ -3523,7 +3458,7 @@ xlog_do_recovery_pass( 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); diff --git a/fs/xfs/xfs_log_recover.h b/fs/xfs/xfs_log_recover.h index b225455..75d7492 100644 --- a/fs/xfs/xfs_log_recover.h +++ b/fs/xfs/xfs_log_recover.h @@ -35,22 +35,21 @@ * 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) -- 1.6.5 From SRS0+ft/C+31+fromorbit.com=dave@internode.on.net Fri Jan 1 20:46:25 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_74 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o022kOTx052091 for ; Fri, 1 Jan 2010 20:46:25 -0600 X-ASG-Debug-ID: 1262400432-6bd102970000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 169AA1DAB3C8 for ; Fri, 1 Jan 2010 18:47: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 IYEG2Q5Z0pxU1H20 for ; Fri, 01 Jan 2010 18:47:12 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11047658-1927428 for ; Sat, 02 Jan 2010 13:17:11 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NQu1G-0007xE-9b for xfs@oss.sgi.com; Sat, 02 Jan 2010 13:47:10 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NQtxr-00054L-HW for xfs@oss.sgi.com; Sat, 02 Jan 2010 13:43:39 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/2] XFS: Don't wake xfsbufd when idle Subject: [PATCH 2/2] XFS: Don't wake xfsbufd when idle Date: Sat, 2 Jan 2010 13:43:35 +1100 Message-Id: <1262400215-19443-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1262400215-19443-1-git-send-email-david@fromorbit.com> References: <1262400215-19443-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1262400434 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The xfsbufd wakes every xfsbufd_centisecs (once per second by default) for each filesystem even when the filesystem is idle. If the xfsbufd has nothing to do, put it into a long term sleep and only wake it up when there is work pending (i.e. dirty buffers to flush soon). This will make laptop power misers happy. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_buf.c | 28 +++++++++++++++++++--------- 1 files changed, 19 insertions(+), 9 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 77b8be8..759cbaf 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -43,10 +43,10 @@ static kmem_zone_t *xfs_buf_zone; STATIC int xfsbufd(void *); -STATIC int xfsbufd_wakeup(int, gfp_t); +STATIC int xfsbufd_wakeup_all(int, gfp_t); STATIC void xfs_buf_delwri_queue(xfs_buf_t *, int); static struct shrinker xfs_buf_shake = { - .shrink = xfsbufd_wakeup, + .shrink = xfsbufd_wakeup_all, .seeks = DEFAULT_SEEKS, }; @@ -385,7 +385,7 @@ _xfs_buf_lookup_pages( __func__, gfp_mask); XFS_STATS_INC(xb_page_retries); - xfsbufd_wakeup(0, gfp_mask); + xfsbufd_wakeup_all(0, gfp_mask); congestion_wait(BLK_RW_ASYNC, HZ/50); goto retry; } @@ -1595,6 +1595,11 @@ xfs_buf_delwri_queue( list_del(&bp->b_list); } + if (list_empty(dwq)) { + /* start xfsbufd as it has something to do now */ + wake_up_process(bp->b_target->bt_task); + } + bp->b_flags |= _XBF_DELWRI_Q; list_add_tail(&bp->b_list, dwq); bp->b_queuetime = jiffies; @@ -1634,7 +1639,7 @@ xfs_buf_runall_queues( } STATIC int -xfsbufd_wakeup( +xfsbufd_wakeup_all( int priority, gfp_t mask) { @@ -1644,6 +1649,8 @@ xfsbufd_wakeup( list_for_each_entry(btp, &xfs_buftarg_list, bt_list) { if (test_bit(XBT_FORCE_SLEEP, &btp->bt_flags)) continue; + if (list_empty(&btp->bt_delwrite_queue)) + continue; set_bit(XBT_FORCE_FLUSH, &btp->bt_flags); wake_up_process(btp->bt_task); } @@ -1708,6 +1715,9 @@ xfsbufd( set_freezable(); do { + long age = xfs_buf_age_centisecs * msecs_to_jiffies(10); + long tout = age; + if (unlikely(freezing(current))) { set_bit(XBT_FORCE_SLEEP, &target->bt_flags); refrigerator(); @@ -1715,12 +1725,12 @@ xfsbufd( clear_bit(XBT_FORCE_SLEEP, &target->bt_flags); } - schedule_timeout_interruptible( - xfs_buf_timer_centisecs * msecs_to_jiffies(10)); - - xfs_buf_delwri_split(target, &tmp, - xfs_buf_age_centisecs * msecs_to_jiffies(10)); + /* sleep for a long time if there is nothing to do. */ + if (list_empty(&target->bt_delwrite_queue)) + tout = MAX_SCHEDULE_TIMEOUT; + schedule_timeout_interruptible(tout); + xfs_buf_delwri_split(target, &tmp, age); count = 0; while (!list_empty(&tmp)) { bp = list_entry(tmp.next, xfs_buf_t, b_list); -- 1.6.5 From SRS0+ft/C+31+fromorbit.com=dave@internode.on.net Fri Jan 1 20:46:26 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o022kPcg052099 for ; Fri, 1 Jan 2010 20:46:25 -0600 X-ASG-Debug-ID: 1262400432-7dcd035f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E83611502C1C for ; Fri, 1 Jan 2010 18:47: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 TKhQIDIni9D8cBHp for ; Fri, 01 Jan 2010 18:47:12 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11047659-1927428 for ; Sat, 02 Jan 2010 13:17:12 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NQu1G-0007xD-7j for xfs@oss.sgi.com; Sat, 02 Jan 2010 13:47:10 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NQtxr-00054J-EY for xfs@oss.sgi.com; Sat, 02 Jan 2010 13:43:39 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/2] XFS: Don't wake the aild once per second Subject: [PATCH 1/2] XFS: Don't wake the aild once per second Date: Sat, 2 Jan 2010 13:43:34 +1100 Message-Id: <1262400215-19443-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1262400215-19443-1-git-send-email-david@fromorbit.com> References: <1262400215-19443-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1262400434 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18712 Rule breakdown below pts rule 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 the AIL push algorithm is traversal safe, we don't need a watchdog function in the xfsaild to catch pushes that fail to make progress. Remove the watchdog timeout and make pushes purely driven by demand. This will remove the once-per-second wakeup that is seen when the filesystem is idle and make laptop power misers happy. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 7 +++---- fs/xfs/xfs_trans_ail.c | 17 ++++++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 09783cc..84ce77a 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -877,12 +877,11 @@ xfsaild( { struct xfs_ail *ailp = data; xfs_lsn_t last_pushed_lsn = 0; - long tout = 0; + long tout = 1000; /* milliseconds */ while (!kthread_should_stop()) { - if (tout) - schedule_timeout_interruptible(msecs_to_jiffies(tout)); - tout = 1000; + tout = !tout ? MAX_SCHEDULE_TIMEOUT : msecs_to_jiffies(tout); + schedule_timeout_interruptible(tout); /* swsusp */ try_to_freeze(); diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 2ffc570..8ca123e 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -237,14 +237,15 @@ out: } /* - * Function that does the work of pushing on the AIL + * xfsaild_push does the work of pushing on the AIL. Returning a timeout of + * zero indicates that the caller should sleep until woken. */ long xfsaild_push( struct xfs_ail *ailp, xfs_lsn_t *last_lsn) { - long tout = 1000; /* milliseconds */ + long tout = 0; xfs_lsn_t last_pushed_lsn = *last_lsn; xfs_lsn_t target = ailp->xa_target; xfs_lsn_t lsn; @@ -279,7 +280,6 @@ xfsaild_push( * prevents use from spinning when we can't do anything or there is * lots of contention on the AIL lists. */ - tout = 10; lsn = lip->li_lsn; flush_log = stuck = count = 0; while ((XFS_LSN_CMP(lip->li_lsn, target) < 0)) { @@ -376,14 +376,14 @@ xfsaild_push( if (!count) { /* We're past our target or empty, so idle */ - tout = 1000; + tout = 0; } else if (XFS_LSN_CMP(lsn, target) >= 0) { /* * We reached the target so wait a bit longer for I/O to * complete and remove pushed items from the AIL before we * start the next scan from the start of the AIL. */ - tout += 20; + tout = 50; last_pushed_lsn = 0; } else if ((stuck * 100) / count > 90) { /* @@ -395,11 +395,14 @@ xfsaild_push( * Backoff a bit more to allow some I/O to complete before * continuing from where we were. */ - tout += 10; + tout = 20; + } else { + /* more to do, but wait a short while before continuing */ + tout = 10; } *last_lsn = last_pushed_lsn; return tout; -} /* xfsaild_push */ +} /* -- 1.6.5 From SRS0+ft/C+31+fromorbit.com=dave@internode.on.net Fri Jan 1 20:46:26 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o022kQXR052107 for ; Fri, 1 Jan 2010 20:46:26 -0600 X-ASG-Debug-ID: 1262400432-6bd102970002-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B99FF1DAB3F6 for ; Fri, 1 Jan 2010 18:47: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 FJIost45KmspaA07 for ; Fri, 01 Jan 2010 18:47:14 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11047660-1927428 for ; Sat, 02 Jan 2010 13:17:12 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NQu1G-0007xC-69 for xfs@oss.sgi.com; Sat, 02 Jan 2010 13:47:10 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NQtxr-00054H-Cg for xfs@oss.sgi.com; Sat, 02 Jan 2010 13:43:39 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/2] XFS: Run kernel threads on demand Subject: [PATCH 0/2] XFS: Run kernel threads on demand Date: Sat, 2 Jan 2010 13:43:33 +1100 Message-Id: <1262400215-19443-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1262400435 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18711 Rule breakdown below pts rule 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 run the xfsbufd and the xfsaild once a second even when there is no work to do. Make them demand driven so that we don't needlessly wake idle CPUs to do nothing. This should make power misers with XFS filesystems happy. From SRS0+BAOp+31+fromorbit.com=dave@internode.on.net Fri Jan 1 21:06:26 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_66 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o0236Q14053681 for ; Fri, 1 Jan 2010 21:06:26 -0600 X-ASG-Debug-ID: 1262401633-6bd102f20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 924E51DAB366 for ; Fri, 1 Jan 2010 19:07:14 -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 lqvOCTqSmxAgsntj for ; Fri, 01 Jan 2010 19:07:14 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10940213-1927428 for ; Sat, 02 Jan 2010 13:37:12 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NQuKd-0007yo-0Y for xfs@oss.sgi.com; Sat, 02 Jan 2010 14:07:11 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NQuHE-00057Z-8F for xfs@oss.sgi.com; Sat, 02 Jan 2010 14:03:40 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/3] XFS: Sort delayed write buffers before dispatch Subject: [PATCH 3/3] XFS: Sort delayed write buffers before dispatch Date: Sat, 2 Jan 2010 14:03:36 +1100 Message-Id: <1262401416-19546-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1262401416-19546-1-git-send-email-david@fromorbit.com> References: <1262401416-19546-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1262401635 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18713 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Currently when the xfsbufd writes delayed write buffers, it pushes them to disk in the order they come off the delayed write list. If there are lots of buffers ѕpread widely over the disk, this results in overwhelming the elevator sort queues in the block layer and we end up losing the posibility of merging adjacent buffers to minimise the number of IOs. Add a sort array to the buftarg so that we can do high level sorting of the buffers once they are pulled off the delwri queue for writeback. Currently this array can hold 4096 buffers at a time which gives us a window 32 times larger than the default elevator maximums for ordering buffers. Ideally this should use a list sort rather than requiring an external buffer to sort the buffers in, but for simplicity just do it via sort function. Followup patches are needed to take the list sort functions from the DRM and UBIFS code and make it a common function and to utilise it. That will allow sorting the entire delwri queue to be written in one go. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_buf.c | 121 ++++++++++++++++++++++++++++++++------------ fs/xfs/linux-2.6/xfs_buf.h | 5 ++ 2 files changed, 93 insertions(+), 33 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index aaefc33..d53d08b 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -1644,12 +1644,18 @@ xfs_buf_delwri_promote( spinlock_t *dwlk = &bp->b_target->bt_delwrite_lock; long age = xfs_buf_age_centisecs * msecs_to_jiffies(10) + 1; - spin_lock(dwlk); ASSERT(bp->b_flags & XBF_DELWRI); ASSERT(bp->b_flags & _XBF_DELWRI_Q); - list_del(&bp->b_list); - list_add(&bp->b_list, dwq); + + /* + * Check the buffer age before locking the delayed write queue as we + * don't need to promote buffers that are already past the flush age. + */ + if (bp->b_queuetime < jiffies - age) + return; bp->b_queuetime = jiffies - age; + spin_lock(dwlk); + list_move(&bp->b_list, dwq); spin_unlock(dwlk); } @@ -1723,14 +1729,55 @@ xfs_buf_delwri_split( } +/* + * Compare function is more complex than it needs to be because + * the return value is only 32 bits and we are doing comparisons + * on 64 bit values + */ +int +xfs_buf_cmp( + const void *a, + const void *b) +{ + const struct xfs_buf *ap = *(const struct xfs_buf**)a; + const struct xfs_buf *bp = *(const struct xfs_buf**)b; + xfs_daddr_t diff; + + diff = ap->b_bn - bp->b_bn; + if (diff < 0) + return -1; + if (diff > 0) + return 1; + return 0; +} + +int +xfs_buf_delwri_sort( + xfs_buftarg_t *target, + struct list_head *list) +{ + int i = 0; + + while (i < XFS_BUF_SORTBUF_SIZE && !list_empty(list)) { + struct xfs_buf *bp = list_entry(list->next, xfs_buf_t, b_list); + + ASSERT(target == bp->b_target); + list_del_init(&bp->b_list); + target->bt_sortbuf[i++] = bp; + } + sort(target->bt_sortbuf, i, sizeof(struct xfs_buf *), xfs_buf_cmp, NULL); + + target->bt_sortbuf_num = i; + if (!list_empty(list)) + return 1; + return 0; +} + STATIC int xfsbufd( void *data) { - struct list_head tmp; xfs_buftarg_t *target = (xfs_buftarg_t *)data; - int count; - xfs_buf_t *bp; current->flags |= PF_MEMALLOC; @@ -1739,6 +1786,9 @@ xfsbufd( do { long age = xfs_buf_age_centisecs * msecs_to_jiffies(10); long tout = age; + int count = 0; + int more = 0; + struct list_head tmp; if (unlikely(freezing(current))) { set_bit(XBT_FORCE_SLEEP, &target->bt_flags); @@ -1753,15 +1803,14 @@ xfsbufd( schedule_timeout_interruptible(tout); xfs_buf_delwri_split(target, &tmp, age); - count = 0; - while (!list_empty(&tmp)) { - bp = list_entry(tmp.next, xfs_buf_t, b_list); - ASSERT(target == bp->b_target); - - list_del_init(&bp->b_list); - xfs_buf_iostrategy(bp); - count++; - } + do { + int i; + more = xfs_buf_delwri_sort(target, &tmp); + for (i = 0; i < target->bt_sortbuf_num; i++) { + xfs_buf_iostrategy(target->bt_sortbuf[i]); + count++; + } + } while (more); if (as_list_len > 0) purge_addresses(); @@ -1783,38 +1832,44 @@ xfs_flush_buftarg( xfs_buftarg_t *target, int wait) { - struct list_head tmp; - xfs_buf_t *bp, *n; + xfs_buf_t *bp; int pincount = 0; + int more = 0; + LIST_HEAD(tmp_list); + LIST_HEAD(wait_list); xfs_buf_runall_queues(xfsconvertd_workqueue); xfs_buf_runall_queues(xfsdatad_workqueue); xfs_buf_runall_queues(xfslogd_workqueue); set_bit(XBT_FORCE_FLUSH, &target->bt_flags); - pincount = xfs_buf_delwri_split(target, &tmp, 0); + pincount = xfs_buf_delwri_split(target, &tmp_list, 0); /* - * Dropped the delayed write list lock, now walk the temporary list + * Dropped the delayed write list lock, now walk the temporary list. + * All I/O is issued async and then if we need to wait for completion + * we do that after issuing all the IO. */ - list_for_each_entry_safe(bp, n, &tmp, b_list) { - ASSERT(target == bp->b_target); - if (wait) - bp->b_flags &= ~XBF_ASYNC; - else - list_del_init(&bp->b_list); - - xfs_buf_iostrategy(bp); - } + do { + int i; + more = xfs_buf_delwri_sort(target, &tmp_list); + for (i = 0; i < target->bt_sortbuf_num; i++) { + bp = target->bt_sortbuf[i]; + ASSERT(target == bp->b_target); + if (wait) { + bp->b_flags &= ~XBF_ASYNC; + list_add(&bp->b_list, &wait_list); + } + xfs_buf_iostrategy(bp); + } + } while (more); if (wait) blk_run_address_space(target->bt_mapping); - /* - * Remaining list items must be flushed before returning - */ - while (!list_empty(&tmp)) { - bp = list_entry(tmp.next, xfs_buf_t, b_list); + /* Now wait for IO to complete if required. */ + while (!list_empty(&wait_list)) { + bp = list_entry(wait_list.next, xfs_buf_t, b_list); list_del_init(&bp->b_list); xfs_iowait(bp); diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index a7c6895..599708e 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h @@ -128,6 +128,8 @@ typedef struct xfs_bufhash { spinlock_t bh_lock; } xfs_bufhash_t; +#define XFS_BUF_SORTBUF_SIZE 4096 + typedef struct xfs_buftarg { dev_t bt_dev; struct block_device *bt_bdev; @@ -147,6 +149,9 @@ typedef struct xfs_buftarg { struct list_head bt_delwrite_queue; spinlock_t bt_delwrite_lock; unsigned long bt_flags; + int bt_sortbuf_num; + struct xfs_buf * bt_sortbuf[XFS_BUF_SORTBUF_SIZE]; + } xfs_buftarg_t; /* -- 1.6.5 From SRS0+BAOp+31+fromorbit.com=dave@internode.on.net Fri Jan 1 21:06:38 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o0236cfc053708 for ; Fri, 1 Jan 2010 21:06:38 -0600 X-ASG-Debug-ID: 1262401644-2086020d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9E1CE1502BEC for ; Fri, 1 Jan 2010 19:07:25 -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 0EHShOQzjAgEHNRB for ; Fri, 01 Jan 2010 19:07:25 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10940215-1927428 for ; Sat, 02 Jan 2010 13:37:24 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NQuKc-0007yl-TH for xfs@oss.sgi.com; Sat, 02 Jan 2010 14:07:10 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NQuHE-00057U-3d for xfs@oss.sgi.com; Sat, 02 Jan 2010 14:03:40 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/3] XFS: Use delayed write for inodes rather than async Subject: [PATCH 1/3] XFS: Use delayed write for inodes rather than async Date: Sat, 2 Jan 2010 14:03:34 +1100 Message-Id: <1262401416-19546-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1262401416-19546-1-git-send-email-david@fromorbit.com> References: <1262401416-19546-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1262401646 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18714 Rule breakdown below pts rule 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 currently do background inode flush asynchronously, resulting in inodes being written in whatever order the background writeback issues them. Make the inode flush delayed write instead of asynchronous which will push the inode into the backing buffer but not issue any IO. The buffer will then sit in cache to be flushed by either an AIL push or the xfsbufd timing out the buffer. This will allow accumulation of dirty inode buffers in memory and allow optimisation of inode cluster writeback at the xfsbufd level where we have much greater queue depths than the block layer elevators. This effectively means that any inode that is written back by background writeback will be seen as flush locked during AIL pushing, and will result in the buffers being pushed from there. A future path will address this non-optimal form of writeback, too. A side effect of this delayed write mechanism is that background inode reclaim will no longer directly flush inodes, nor can it wait on the flush lock. The result is that inode reclaim must leave the inode in the reclaimable state until it is clean. Hence attempts to reclaim a dirty inode in the background will simply skip the inode until it is clean and this allows other mechanisms (i.e. xfsbufd) to do more optimal writeback of the dirty buffers. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 2 +- fs/xfs/linux-2.6/xfs_sync.c | 52 +++++++++++++++++++++++++++++------------- fs/xfs/xfs_inode.c | 31 ++++--------------------- fs/xfs/xfs_inode.h | 8 ++---- fs/xfs/xfs_inode_item.c | 10 +++++-- fs/xfs/xfs_mount.c | 3 +- 6 files changed, 54 insertions(+), 52 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 84ce77a..752fa10 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1074,7 +1074,7 @@ xfs_fs_write_inode( if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip)) goto out_unlock; - error = xfs_iflush(ip, XFS_IFLUSH_ASYNC_NOBLOCK); + error = xfs_iflush(ip, XFS_IFLUSH_DELWRI_NOBLOCK); } out_unlock: diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index c980d68..f974d1a 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -460,8 +460,8 @@ xfs_quiesce_fs( { int count = 0, pincount; + xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI); xfs_flush_buftarg(mp->m_ddev_targp, 0); - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI_ELSE_ASYNC); /* * This loop must run at least twice. The first instance of the loop @@ -585,7 +585,7 @@ xfs_sync_worker( if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI_ELSE_ASYNC); + xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI); /* dgc: errors ignored here */ error = xfs_qm_sync(mp, SYNC_TRYLOCK); error = xfs_sync_fsdata(mp, SYNC_TRYLOCK); @@ -687,7 +687,7 @@ xfs_reclaim_inode( spin_unlock(&ip->i_flags_lock); write_unlock(&pag->pag_ici_lock); xfs_perag_put(pag); - return -EAGAIN; + return EAGAIN; } __xfs_iflags_set(ip, XFS_IRECLAIM); spin_unlock(&ip->i_flags_lock); @@ -695,32 +695,52 @@ xfs_reclaim_inode( xfs_perag_put(pag); /* - * If the inode is still dirty, then flush it out. If the inode - * is not in the AIL, then it will be OK to flush it delwri as - * long as xfs_iflush() does not keep any references to the inode. - * We leave that decision up to xfs_iflush() since it has the - * knowledge of whether it's OK to simply do a delwri flush of - * the inode or whether we need to wait until the inode is - * pulled from the AIL. - * We get the flush lock regardless, though, just to make sure - * we don't free it while it is being flushed. + * The inode is flushed delayed write. That means the flush lock + * may be held here and we will block for some time on it. Further, + * if we hold the inode lock, we prevent the AIL from locking and + * therefore being able to push the buffer. This means that we'll end + * up waiting here for the xfsbufd to age the buffer and write it out, + * which could be a long time. If we fail to get the flush lock, just + * clear the reclaim in progress state (we haven't cleared the reclaim + * needed state) so that the reclaim is delayed until the flush lock + * can be gained without blocking. */ xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_iflock(ip); + if (!xfs_iflock_nowait(ip)) + goto unlock_and_requeue; /* * In the case of a forced shutdown we rely on xfs_iflush() to * wait for the inode to be unpinned before returning an error. */ - if (!is_bad_inode(VFS_I(ip)) && xfs_iflush(ip, sync_mode) == 0) { - /* synchronize with xfs_iflush_done */ - xfs_iflock(ip); + if (!is_bad_inode(VFS_I(ip)) && !xfs_inode_clean(ip)) { + /* + * If we are flushing a dirty inode DELWRI, then don't + * immediately wait on the flush lock - requeue the inode for + * reclaim. Every time we re-enter and the flush lock is still + * held we will requeue at the initial flush lock check above. + * Otherwise, for synchronous writeback we synchronize with + * xfs_iflush_done by locking and unlocking the flush lock. + */ + if (xfs_iflush(ip, sync_mode) == 0) { + if (sync_mode == XFS_IFLUSH_DELWRI) + goto unlock_and_requeue; + xfs_iflock(ip); + xfs_ifunlock(ip); + } + } else { + /* need to unlock the clean inodes */ xfs_ifunlock(ip); } xfs_iunlock(ip, XFS_ILOCK_EXCL); xfs_ireclaim(ip); return 0; + +unlock_and_requeue: + xfs_iflags_clear(ip, XFS_IRECLAIM); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return EAGAIN; } void diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e5c9953..d175dca 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2832,7 +2832,7 @@ xfs_iflush( xfs_dinode_t *dip; xfs_mount_t *mp; int error; - int noblock = (flags == XFS_IFLUSH_ASYNC_NOBLOCK); + int noblock = (flags == XFS_IFLUSH_DELWRI_NOBLOCK); enum { INT_DELWRI = (1 << 0), INT_ASYNC = (1 << 1) }; XFS_STATS_INC(xs_iflush_count); @@ -2905,12 +2905,8 @@ xfs_iflush( case XFS_IFLUSH_DELWRI_ELSE_SYNC: flags = 0; break; - case XFS_IFLUSH_ASYNC_NOBLOCK: - case XFS_IFLUSH_ASYNC: - case XFS_IFLUSH_DELWRI_ELSE_ASYNC: - flags = INT_ASYNC; - break; case XFS_IFLUSH_DELWRI: + case XFS_IFLUSH_DELWRI_NOBLOCK: flags = INT_DELWRI; break; default: @@ -2920,15 +2916,11 @@ xfs_iflush( } } else { switch (flags) { + case XFS_IFLUSH_DELWRI_NOBLOCK: case XFS_IFLUSH_DELWRI_ELSE_SYNC: - case XFS_IFLUSH_DELWRI_ELSE_ASYNC: case XFS_IFLUSH_DELWRI: flags = INT_DELWRI; break; - case XFS_IFLUSH_ASYNC_NOBLOCK: - case XFS_IFLUSH_ASYNC: - flags = INT_ASYNC; - break; case XFS_IFLUSH_SYNC: flags = 0; break; @@ -2971,13 +2963,10 @@ xfs_iflush( if (error) goto cluster_corrupt_out; - if (flags & INT_DELWRI) { + if (flags & INT_DELWRI) xfs_bdwrite(mp, bp); - } else if (flags & INT_ASYNC) { - error = xfs_bawrite(mp, bp); - } else { + else error = xfs_bwrite(mp, bp); - } return error; corrupt_out: @@ -3012,16 +3001,6 @@ xfs_iflush_int( iip = ip->i_itemp; mp = ip->i_mount; - - /* - * If the inode isn't dirty, then just release the inode - * flush lock and do nothing. - */ - if (xfs_inode_clean(ip)) { - xfs_ifunlock(ip); - return 0; - } - /* set *dip = inode's place in the buffer */ dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index ec1f28c..559feeb 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -423,11 +423,9 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) * 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 +#define XFS_IFLUSH_SYNC 2 +#define XFS_IFLUSH_DELWRI 3 +#define XFS_IFLUSH_DELWRI_NOBLOCK 4 /* * Flags for xfs_itruncate_start(). diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index f38855d..beb7d9f 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -867,10 +867,14 @@ xfs_inode_item_push( iip->ili_format.ilf_fields != 0); /* - * Write out the inode. The completion routine ('iflush_done') will - * pull it from the AIL, mark it clean, unlock the flush lock. + * Push the inode to it's backing buffer. This will not remove + * the inode from the AIL - a further push will be required to trigger + * a buffer push. However, this allows all the dirty inodes to be pushed to + * the buffer before it is pushed to disk. THe buffer IO completion + * will pull th einode from the AIL, mark it clean and unlock the flush + * lock. */ - (void) xfs_iflush(ip, XFS_IFLUSH_ASYNC); + (void) xfs_iflush(ip, XFS_IFLUSH_DELWRI); xfs_iunlock(ip, XFS_ILOCK_SHARED); return; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 223d9c3..f3ce47a 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1444,7 +1444,8 @@ xfs_unmountfs( * need to force the log first. */ xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE | XFS_LOG_SYNC); - xfs_reclaim_inodes(mp, XFS_IFLUSH_ASYNC); + xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI); + XFS_bflush(mp->m_ddev_targp); xfs_qm_unmount(mp); -- 1.6.5 From SRS0+BAOp+31+fromorbit.com=dave@internode.on.net Fri Jan 1 21:06:38 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o0236b2s053706 for ; Fri, 1 Jan 2010 21:06:38 -0600 X-ASG-Debug-ID: 1262401644-208702040000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4AA9A11EE1BE for ; Fri, 1 Jan 2010 19:07:24 -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 PcSUWHUnCVdhyKMM for ; Fri, 01 Jan 2010 19:07:24 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10940214-1927428 for ; Sat, 02 Jan 2010 13:37:23 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NQuKc-0007ym-VO for xfs@oss.sgi.com; Sat, 02 Jan 2010 14:07:10 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NQuHE-00057W-6W for xfs@oss.sgi.com; Sat, 02 Jan 2010 14:03:40 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/3] XFS: Don't issue buffer IO direct from AIL push Subject: [PATCH 2/3] XFS: Don't issue buffer IO direct from AIL push Date: Sat, 2 Jan 2010 14:03:35 +1100 Message-Id: <1262401416-19546-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1262401416-19546-1-git-send-email-david@fromorbit.com> References: <1262401416-19546-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1262401646 X-Barracuda-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.18714 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 All buffers logged into the AIL are marked as delayed write. When the AIL needs to push the buffer out, it issues an async write of the buffer. This means that IO patterns are dependent on the order of buffers in the AIL. Instead of flushing the buffer, promote the buffer in the delayed write list so that the next time the xfsbufd is run the buffer will be flushed by the xfsbufd. Return the state to the xfsaild that the buffer was promoted so that the xfsaild knows that it needs to cause the xfsbufd to run to flush the buffers that were promoted. Using the xfsbufd for issuing the IO allows us to dispatch all buffer IO from the one queue. This means that we can make much more enlightened decisions on what order to flush buffers to disk as we don't have multiple places issuing IO. Optimisations to xfsbufd will be in a future patch. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_buf.c | 22 +++++++++ fs/xfs/linux-2.6/xfs_buf.h | 11 +++++ fs/xfs/linux-2.6/xfs_trace.h | 1 + fs/xfs/quota/xfs_dquot_item.c | 87 +++++------------------------------ fs/xfs/quota/xfs_dquot_item.h | 4 -- fs/xfs/xfs_buf_item.c | 64 ++++++++++++++------------ fs/xfs/xfs_inode_item.c | 99 ++++++---------------------------------- fs/xfs/xfs_inode_item.h | 6 --- fs/xfs/xfs_trans_ail.c | 7 +++ 9 files changed, 104 insertions(+), 197 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 759cbaf..aaefc33 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -1631,6 +1631,28 @@ xfs_buf_delwri_dequeue( trace_xfs_buf_delwri_dequeue(bp, _RET_IP_); } +/* + * If a delwri buffer needs to be pushed before it has aged out, then + * promote it to the head of the delwri queue so that it will be flushed + * on the next xfsbufd run. + */ +void +xfs_buf_delwri_promote( + xfs_buf_t *bp) +{ + struct list_head *dwq = &bp->b_target->bt_delwrite_queue; + spinlock_t *dwlk = &bp->b_target->bt_delwrite_lock; + long age = xfs_buf_age_centisecs * msecs_to_jiffies(10) + 1; + + spin_lock(dwlk); + ASSERT(bp->b_flags & XBF_DELWRI); + ASSERT(bp->b_flags & _XBF_DELWRI_Q); + list_del(&bp->b_list); + list_add(&bp->b_list, dwq); + bp->b_queuetime = jiffies - age; + spin_unlock(dwlk); +} + STATIC void xfs_buf_runall_queues( struct workqueue_struct *queue) diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index a34c7b5..a7c6895 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h @@ -261,6 +261,7 @@ extern int xfs_buf_ispin(xfs_buf_t *); /* Delayed Write Buffer Routines */ extern void xfs_buf_delwri_dequeue(xfs_buf_t *); +extern void xfs_buf_delwri_promote(xfs_buf_t *); /* Buffer Daemon Setup Routines */ extern int xfs_buf_init(void); @@ -424,6 +425,16 @@ extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *); extern void xfs_wait_buftarg(xfs_buftarg_t *); extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int); extern int xfs_flush_buftarg(xfs_buftarg_t *, int); + +/* + * run the xfsbufd on demand to age buffers. Use in combination with + * xfs_buf_delwri_promote() to flus delayed write buffers efficiently. + */ +static inline void xfs_flush_buftarg_delwri(xfs_buftarg_t *btp) +{ + wake_up_process(btp->bt_task); +} + #ifdef CONFIG_KDB_MODULES extern struct list_head *xfs_get_buftarg_list(void); #endif diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 2b0819a..bba87b7 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -464,6 +464,7 @@ DEFINE_BUF_ITEM_EVENT(xfs_buf_item_unlock); DEFINE_BUF_ITEM_EVENT(xfs_buf_item_unlock_stale); DEFINE_BUF_ITEM_EVENT(xfs_buf_item_committed); DEFINE_BUF_ITEM_EVENT(xfs_buf_item_push); +DEFINE_BUF_ITEM_EVENT(xfs_buf_item_pushbuf); DEFINE_BUF_ITEM_EVENT(xfs_trans_get_buf); DEFINE_BUF_ITEM_EVENT(xfs_trans_get_buf_recur); DEFINE_BUF_ITEM_EVENT(xfs_trans_getsb); diff --git a/fs/xfs/quota/xfs_dquot_item.c b/fs/xfs/quota/xfs_dquot_item.c index d0d4a9a..bc7e00e 100644 --- a/fs/xfs/quota/xfs_dquot_item.c +++ b/fs/xfs/quota/xfs_dquot_item.c @@ -212,68 +212,33 @@ xfs_qm_dquot_logitem_pushbuf( xfs_dquot_t *dqp; xfs_mount_t *mp; xfs_buf_t *bp; - uint dopush; dqp = qip->qli_dquot; ASSERT(XFS_DQ_IS_LOCKED(dqp)); /* - * The qli_pushbuf_flag keeps others from - * trying to duplicate our effort. - */ - ASSERT(qip->qli_pushbuf_flag != 0); - ASSERT(qip->qli_push_owner == current_pid()); - - /* * If flushlock isn't locked anymore, chances are that the * inode flush completed and the inode was taken off the AIL. * So, just get out. */ if (completion_done(&dqp->q_flush) || ((qip->qli_item.li_flags & XFS_LI_IN_AIL) == 0)) { - qip->qli_pushbuf_flag = 0; xfs_dqunlock(dqp); return; } mp = dqp->q_mount; bp = xfs_incore(mp->m_ddev_targp, qip->qli_format.qlf_blkno, - XFS_QI_DQCHUNKLEN(mp), - XFS_INCORE_TRYLOCK); - if (bp != NULL) { - if (XFS_BUF_ISDELAYWRITE(bp)) { - dopush = ((qip->qli_item.li_flags & XFS_LI_IN_AIL) && - !completion_done(&dqp->q_flush)); - qip->qli_pushbuf_flag = 0; - xfs_dqunlock(dqp); - - if (XFS_BUF_ISPINNED(bp)) { - xfs_log_force(mp, (xfs_lsn_t)0, - XFS_LOG_FORCE); - } - if (dopush) { - int error; -#ifdef XFSRACEDEBUG - delay_for_intr(); - delay(300); -#endif - error = xfs_bawrite(mp, bp); - if (error) - xfs_fs_cmn_err(CE_WARN, mp, - "xfs_qm_dquot_logitem_pushbuf: pushbuf error %d on qip %p, bp %p", - error, qip, bp); - } else { - xfs_buf_relse(bp); - } - } else { - qip->qli_pushbuf_flag = 0; - xfs_dqunlock(dqp); - xfs_buf_relse(bp); - } + XFS_QI_DQCHUNKLEN(mp), XFS_INCORE_TRYLOCK); + if (!bp) { + xfs_dqunlock(dqp); return; } - qip->qli_pushbuf_flag = 0; xfs_dqunlock(dqp); + if (XFS_BUF_ISDELAYWRITE(bp)) + xfs_buf_delwri_promote(bp); + xfs_buf_relse(bp); + return; } /* @@ -291,50 +256,24 @@ xfs_qm_dquot_logitem_trylock( xfs_dq_logitem_t *qip) { xfs_dquot_t *dqp; - uint retval; dqp = qip->qli_dquot; if (atomic_read(&dqp->q_pincount) > 0) - return (XFS_ITEM_PINNED); + return XFS_ITEM_PINNED; if (! xfs_qm_dqlock_nowait(dqp)) - return (XFS_ITEM_LOCKED); + return XFS_ITEM_LOCKED; - retval = XFS_ITEM_SUCCESS; if (!xfs_dqflock_nowait(dqp)) { /* - * The dquot is already being flushed. It may have been - * flushed delayed write, however, and we don't want to - * get stuck waiting for that to complete. So, we want to check - * to see if we can lock the dquot's buffer without sleeping. - * If we can and it is marked for delayed write, then we - * hold it and send it out from the push routine. We don't - * want to do that now since we might sleep in the device - * strategy routine. We also don't want to grab the buffer lock - * here because we'd like not to call into the buffer cache - * while holding the AIL lock. - * Make sure to only return PUSHBUF if we set pushbuf_flag - * ourselves. If someone else is doing it then we don't - * want to go to the push routine and duplicate their efforts. + * dquot has already been flushed to the backing buffer, + * leave it locked, pushbuf routine will unlock it. */ - if (qip->qli_pushbuf_flag == 0) { - qip->qli_pushbuf_flag = 1; - ASSERT(qip->qli_format.qlf_blkno == dqp->q_blkno); -#ifdef DEBUG - qip->qli_push_owner = current_pid(); -#endif - /* - * The dquot is left locked. - */ - retval = XFS_ITEM_PUSHBUF; - } else { - retval = XFS_ITEM_FLUSHING; - xfs_dqunlock_nonotify(dqp); - } + return XFS_ITEM_PUSHBUF; } ASSERT(qip->qli_item.li_flags & XFS_LI_IN_AIL); - return (retval); + return XFS_ITEM_SUCCESS; } diff --git a/fs/xfs/quota/xfs_dquot_item.h b/fs/xfs/quota/xfs_dquot_item.h index 5a63253..5acae2a 100644 --- a/fs/xfs/quota/xfs_dquot_item.h +++ b/fs/xfs/quota/xfs_dquot_item.h @@ -27,10 +27,6 @@ typedef struct xfs_dq_logitem { xfs_log_item_t qli_item; /* common portion */ struct xfs_dquot *qli_dquot; /* dquot ptr */ xfs_lsn_t qli_flush_lsn; /* lsn at last flush */ - unsigned short qli_pushbuf_flag; /* 1 bit used in push_ail */ -#ifdef DEBUG - uint64_t qli_push_owner; -#endif xfs_dq_logformat_t qli_format; /* logged structure */ } xfs_dq_logitem_t; diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index a30f7e9..0f30250 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -467,8 +467,10 @@ xfs_buf_item_unpin_remove( /* * This is called to attempt to lock the buffer associated with this * buf log item. Don't sleep on the buffer lock. If we can't get - * the lock right away, return 0. If we can get the lock, pull the - * buffer from the free list, mark it busy, and return 1. + * the lock right away, return 0. If we can get the lock, take a + * reference to the buffer. If this is a delayed write buffer that + * needs AIL help to be written back, invoke the pushbuf routine + * rather than the normal success path. */ STATIC uint xfs_buf_item_trylock( @@ -477,24 +479,18 @@ xfs_buf_item_trylock( xfs_buf_t *bp; bp = bip->bli_buf; - - if (XFS_BUF_ISPINNED(bp)) { + if (XFS_BUF_ISPINNED(bp)) return XFS_ITEM_PINNED; - } - - if (!XFS_BUF_CPSEMA(bp)) { + if (!XFS_BUF_CPSEMA(bp)) return XFS_ITEM_LOCKED; - } - /* - * Remove the buffer from the free list. Only do this - * if it's on the free list. Private buffers like the - * superblock buffer are not. - */ + /* take a reference to the buffer. */ XFS_BUF_HOLD(bp); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); trace_xfs_buf_item_trylock(bip); + if (XFS_BUF_ISDELAYWRITE(bp)) + return XFS_ITEM_PUSHBUF; return XFS_ITEM_SUCCESS; } @@ -626,11 +622,9 @@ xfs_buf_item_committed( } /* - * This is called to asynchronously write the buffer associated with this - * buf log item out to disk. The buffer will already have been locked by - * a successful call to xfs_buf_item_trylock(). If the buffer still has - * B_DELWRI set, then get it going out to disk with a call to bawrite(). - * If not, then just release the buffer. + * The buffer is locked, but is not a delayed write buffer. This happens + * if we race with IO completion and hence we don't want to try to write it + * again. Just release the buffer. */ STATIC void xfs_buf_item_push( @@ -642,17 +636,29 @@ xfs_buf_item_push( trace_xfs_buf_item_push(bip); bp = bip->bli_buf; + ASSERT(!XFS_BUF_ISDELAYWRITE(bp)); + xfs_buf_relse(bp); +} - if (XFS_BUF_ISDELAYWRITE(bp)) { - int error; - error = xfs_bawrite(bip->bli_item.li_mountp, bp); - if (error) - xfs_fs_cmn_err(CE_WARN, bip->bli_item.li_mountp, - "xfs_buf_item_push: pushbuf error %d on bip %p, bp %p", - error, bip, bp); - } else { - xfs_buf_relse(bp); - } +/* + * The buffer is locked and is a delayed write buffer. Promote the buffer + * in the delayed write queue as the caller knows that they must invoke + * the xfsbufd to get this buffer written. We have to unlock the buffer + * to allow the xfsbufd to write it, too. + */ +STATIC void +xfs_buf_item_pushbuf( + xfs_buf_log_item_t *bip) +{ + xfs_buf_t *bp; + + ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); + trace_xfs_buf_item_pushbuf(bip); + + bp = bip->bli_buf; + ASSERT(XFS_BUF_ISDELAYWRITE(bp)); + xfs_buf_delwri_promote(bp); + xfs_buf_relse(bp); } /* ARGSUSED */ @@ -677,7 +683,7 @@ static struct xfs_item_ops xfs_buf_item_ops = { .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) xfs_buf_item_committed, .iop_push = (void(*)(xfs_log_item_t*))xfs_buf_item_push, - .iop_pushbuf = NULL, + .iop_pushbuf = (void(*)(xfs_log_item_t*))xfs_buf_item_pushbuf, .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t)) xfs_buf_item_committing }; diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index beb7d9f..0c4e719 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -602,33 +602,20 @@ xfs_inode_item_trylock( if (!xfs_iflock_nowait(ip)) { /* - * If someone else isn't already trying to push the inode - * buffer, we get to do it. + * inode has already been flushed to the backing buffer, + * leave it locked in shared mode, pushbuf routine will + * unlock it. */ - if (iip->ili_pushbuf_flag == 0) { - iip->ili_pushbuf_flag = 1; -#ifdef DEBUG - iip->ili_push_owner = current_pid(); -#endif - /* - * Inode is left locked in shared mode. - * Pushbuf routine gets to unlock it. - */ - return XFS_ITEM_PUSHBUF; - } else { - /* - * We hold the AIL lock, so we must specify the - * NONOTIFY flag so that we won't double trip. - */ - xfs_iunlock(ip, XFS_ILOCK_SHARED|XFS_IUNLOCK_NONOTIFY); - return XFS_ITEM_FLUSHING; - } - /* NOTREACHED */ + return XFS_ITEM_PUSHBUF; } /* Stale items should force out the iclog */ if (ip->i_flags & XFS_ISTALE) { xfs_ifunlock(ip); + /* + * we hold the AIL lock - notify the unlock routine of this + * so it doesn't try to get the lock again. + */ xfs_iunlock(ip, XFS_ILOCK_SHARED|XFS_IUNLOCK_NONOTIFY); return XFS_ITEM_PINNED; } @@ -746,11 +733,8 @@ xfs_inode_item_committed( * This gets called by xfs_trans_push_ail(), when IOP_TRYLOCK * failed to get the inode flush lock but did get the inode locked SHARED. * Here we're trying to see if the inode buffer is incore, and if so whether it's - * marked delayed write. If that's the case, we'll initiate a bawrite on that - * buffer to expedite the process. - * - * We aren't holding the AIL lock (or the flush lock) when this gets called, - * so it is inherently race-y. + * marked delayed write. If that's the case, we'll promote it and that will + * allow the caller to write the buffer by triggering the xfsbufd to run. */ STATIC void xfs_inode_item_pushbuf( @@ -759,26 +743,16 @@ xfs_inode_item_pushbuf( xfs_inode_t *ip; xfs_mount_t *mp; xfs_buf_t *bp; - uint dopush; ip = iip->ili_inode; - ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED)); /* - * The ili_pushbuf_flag keeps others from - * trying to duplicate our effort. - */ - ASSERT(iip->ili_pushbuf_flag != 0); - ASSERT(iip->ili_push_owner == current_pid()); - - /* * If a flush is not in progress anymore, chances are that the * inode was taken off the AIL. So, just get out. */ if (completion_done(&ip->i_flush) || ((iip->ili_item.li_flags & XFS_LI_IN_AIL) == 0)) { - iip->ili_pushbuf_flag = 0; xfs_iunlock(ip, XFS_ILOCK_SHARED); return; } @@ -787,54 +761,12 @@ xfs_inode_item_pushbuf( bp = xfs_incore(mp->m_ddev_targp, iip->ili_format.ilf_blkno, iip->ili_format.ilf_len, XFS_INCORE_TRYLOCK); - if (bp != NULL) { - if (XFS_BUF_ISDELAYWRITE(bp)) { - /* - * We were racing with iflush because we don't hold - * the AIL lock or the flush lock. However, at this point, - * we have the buffer, and we know that it's dirty. - * So, it's possible that iflush raced with us, and - * this item is already taken off the AIL. - * If not, we can flush it async. - */ - dopush = ((iip->ili_item.li_flags & XFS_LI_IN_AIL) && - !completion_done(&ip->i_flush)); - iip->ili_pushbuf_flag = 0; - xfs_iunlock(ip, XFS_ILOCK_SHARED); - - trace_xfs_inode_item_push(bp, _RET_IP_); - - if (XFS_BUF_ISPINNED(bp)) { - xfs_log_force(mp, (xfs_lsn_t)0, - XFS_LOG_FORCE); - } - if (dopush) { - int error; - error = xfs_bawrite(mp, bp); - if (error) - xfs_fs_cmn_err(CE_WARN, mp, - "xfs_inode_item_pushbuf: pushbuf error %d on iip %p, bp %p", - error, iip, bp); - } else { - xfs_buf_relse(bp); - } - } else { - iip->ili_pushbuf_flag = 0; - xfs_iunlock(ip, XFS_ILOCK_SHARED); - xfs_buf_relse(bp); - } - return; - } - /* - * We have to be careful about resetting pushbuf flag too early (above). - * Even though in theory we can do it as soon as we have the buflock, - * we don't want others to be doing work needlessly. They'll come to - * this function thinking that pushing the buffer is their - * responsibility only to find that the buffer is still locked by - * another doing the same thing - */ - iip->ili_pushbuf_flag = 0; xfs_iunlock(ip, XFS_ILOCK_SHARED); + if (!bp) + return; + if (XFS_BUF_ISDELAYWRITE(bp)) + xfs_buf_delwri_promote(bp); + xfs_buf_relse(bp); return; } @@ -938,7 +870,6 @@ xfs_inode_item_init( /* We have zeroed memory. No need ... iip->ili_extents_buf = NULL; - iip->ili_pushbuf_flag = 0; */ iip->ili_format.ilf_type = XFS_LI_INODE; diff --git a/fs/xfs/xfs_inode_item.h b/fs/xfs/xfs_inode_item.h index cc8df1a..9a46795 100644 --- a/fs/xfs/xfs_inode_item.h +++ b/fs/xfs/xfs_inode_item.h @@ -144,12 +144,6 @@ typedef struct xfs_inode_log_item { data exts */ 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; diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 8ca123e..7e15433 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -253,6 +253,7 @@ xfsaild_push( int flush_log, count, stuck; xfs_mount_t *mp = ailp->xa_mount; struct xfs_ail_cursor *cur = &ailp->xa_cursors; + int push_xfsbufd = 0; spin_lock(&ailp->xa_lock); xfs_trans_ail_cursor_init(ailp, cur); @@ -308,6 +309,7 @@ xfsaild_push( XFS_STATS_INC(xs_push_ail_pushbuf); IOP_PUSHBUF(lip); last_pushed_lsn = lsn; + push_xfsbufd = 1; break; case XFS_ITEM_PINNED: @@ -374,6 +376,11 @@ xfsaild_push( xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); } + if (push_xfsbufd) { + /* we've got delayed write buffers to flush */ + xfs_flush_buftarg_delwri(mp->m_ddev_targp); + } + if (!count) { /* We're past our target or empty, so idle */ tout = 0; -- 1.6.5 From SRS0+BAOp+31+fromorbit.com=dave@internode.on.net Fri Jan 1 21:06:39 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_54 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o0236clD053722 for ; Fri, 1 Jan 2010 21:06:39 -0600 X-ASG-Debug-ID: 1262401644-208702040002-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0AC2A1502BEC for ; Fri, 1 Jan 2010 19:07:26 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id Y56q2By9Q7KObCJa for ; Fri, 01 Jan 2010 19:07:26 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10940216-1927428 for ; Sat, 02 Jan 2010 13:37:24 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NQuKc-0007yk-Rj for xfs@oss.sgi.com; Sat, 02 Jan 2010 14:07:10 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NQuHE-00057S-1w for xfs@oss.sgi.com; Sat, 02 Jan 2010 14:03:40 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [RFC, PATCH 0/3] Kill async inode writeback Subject: [RFC, PATCH 0/3] Kill async inode writeback Date: Sat, 2 Jan 2010 14:03:33 +1100 Message-Id: <1262401416-19546-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1262401648 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18714 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Currently we do background inode writeback on demand from many different places - xfssyncd, xfsbufd, the bdi writeback threads and when pushing the AIL. The result is that inodes can be pushed at any time and there is little to no locality to the IO patterns results from such writeback. Indeed, we can have completing writebacks occurring which only serves to slow down writeback. The idea behind this series is to make metadata buffers get written from xfsbufd via the delayed write queue rather than than from all these other places. All the other places do is make the buffers delayed write so that the xfsbufd can issue them. This means that inode flushes can no longer happen asynchronously, but we still need a method for ensuring timely dispatch of buffers that we may be waiting for IO completion on. To do this, we allow delayed write buffers to be "promoted" in the delayed write queue. This effectively short-cuts the aging of the buffers, and combined with a demand flush of the xfsbufd we push all aged and promoted buffers out at the same time. Combine this with sorting the delayed write buffers to be written into disk offset order before dispatch, and we vastly improve the IO patterns for metadata writeback. IO is issued from one place and in a disk/elevator friendly order. Perf results on a debug XFS build (means allocation patterns are variable, so runtimes are also a bit variable): Untar 2.6.32 kernel tarball, sync, then remove: Untar+sync rm -rf xfs-dev: 25.2s 13.0s xfs-dev-delwri: 22.5s 9.1s 4 processes each creating 100,000, five byte files in separate directories concurrently, then 4 processes removing a directory each concurrently. create rm -rf xfs-dev: 8m32s 4m10s xfs-dev-delwri: 4m55s 3m42s There is still followup work to be done on the buffer sorting to make it more efficient, but overall the concept appears to be solid based on the improvements in sustained small file create rates. From BATV+ad3dc5ce6bcf5dcfbbff+2323+infradead.org+hch@bombadil.srs.infradead.org Sat Jan 2 05:10:08 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o02BA7GL096292 for ; Sat, 2 Jan 2010 05:10:08 -0600 X-ASG-Debug-ID: 1262430657-516f01350000-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 72568137390 for ; Sat, 2 Jan 2010 03:10:57 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id B278Lgtk16zCsfE0 for ; Sat, 02 Jan 2010 03:10:57 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NR1sl-00075w-6i; Sat, 02 Jan 2010 11:10:55 +0000 Date: Sat, 2 Jan 2010 06:10:55 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/3] repair: compare superblock / AG headers fields against manual counts Subject: Re: [PATCH 3/3] repair: compare superblock / AG headers fields against manual counts Message-ID: <20100102111055.GA22222@infradead.org> References: <20091201150503.958283878@bombadil.infradead.org> <20091201151037.707510379@bombadil.infradead.org> <20091230224314.GD13802@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091230224314.GD13802@discord.disaster> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262430657 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 31, 2009 at 09:43:14AM +1100, Dave Chinner wrote: > Might be worth a comment here saying that we are only calculating > totals from the ABTC btree scan. OTOH, is is worth checking that the > two btrees add up to the same number of free blocks, same maximum > length extent, etc? Yes, I'll look into adding that additional check. From BATV+ad3dc5ce6bcf5dcfbbff+2323+infradead.org+hch@bombadil.srs.infradead.org Sat Jan 2 05:22:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o02BMeZr097876 for ; Sat, 2 Jan 2010 05:22:40 -0600 X-ASG-Debug-ID: 1262431409-5a0201540000-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 2118C1374BD for ; Sat, 2 Jan 2010 03:23:30 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Ke9tztTBoQFSHgsH for ; Sat, 02 Jan 2010 03:23:30 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NR24v-0004Ic-Pv; Sat, 02 Jan 2010 11:23:29 +0000 Date: Sat, 2 Jan 2010 06:23:29 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Ensure we force all busy extents in range to disk Subject: Re: [PATCH] XFS: Ensure we force all busy extents in range to disk Message-ID: <20100102112329.GA27329@infradead.org> References: <1262399936-19195-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262399936-19195-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262431410 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, and quite interestin that we never could it before. Some nipicks below: > + /* > + * search pagb_list for this slot, skipping open slots. We have to > + * search the entire array as there may be multiple overlaps and > + * we have to get the most recent LSN for the log force to push out > + * all the transactions that span the range. > + */ > + for (bsy = pag->pagb_list; cnt; bsy++, cnt--) { Maybe you coult convert this to a more standard loop idiom while you're at it: for (cnt = 0; cnt < pag->pagb_count; cnt++) { bsy = &pag->pagb_list[cnt]; > + if (!bsy->busy_tp) > + continue; > > + bend = bsy->busy_start + bsy->busy_length - 1; > + if ((bno > bend) || (uend < bsy->busy_start)) no need for the inner braces here. And btw, the standard subsystem prefix is all lower case, xfs:, not XFS:. Also it seems like this patch requires your perag-lookup fixes first. Time to get them into the for-2.6.34 git tree ASAP as a base to work against. That might also make it easier to work on the lockless patch separately. From BATV+ad3dc5ce6bcf5dcfbbff+2323+infradead.org+hch@bombadil.srs.infradead.org Sat Jan 2 05:52:50 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o02BqnC4102682 for ; Sat, 2 Jan 2010 05:52:49 -0600 X-ASG-Debug-ID: 1262433218-3b59033f0000-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 7E8D31DAB800 for ; Sat, 2 Jan 2010 03:53:38 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id KALeJaUkqxZIB2Ip for ; Sat, 02 Jan 2010 03:53:38 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NR2Y6-0007GM-LR; Sat, 02 Jan 2010 11:53:38 +0000 Date: Sat, 2 Jan 2010 06:53:38 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Kill filestreams cache flush Subject: Re: [PATCH] XFS: Kill filestreams cache flush Message-ID: <20100102115338.GA18502@infradead.org> References: <1262399900-19110-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262399900-19110-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262433219 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 02, 2010 at 01:38:20PM +1100, Dave Chinner wrote: > The filestreams cache flush is not needed in the sync code as it > does not affect data writeback, and it is now not used by the > growfs code, either, so kill it. I have to admit I never understood the purpose of this call. What xfs_fstrm_free_func does is: - clear the filesystems flag on the inode - decrement pagf_fstrms - drop references on the inode (and parent if known) - free the filestream item Nothing of that should matter for sync, although dropping inode references during sync might generally be a good idea. From BATV+ad3dc5ce6bcf5dcfbbff+2323+infradead.org+hch@bombadil.srs.infradead.org Sat Jan 2 06:00:05 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o02C051p103628 for ; Sat, 2 Jan 2010 06:00:05 -0600 X-ASG-Debug-ID: 1262433653-034c00f30000-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 CDCC71503378 for ; Sat, 2 Jan 2010 04:00:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id OIGeFDfYhgQnvgyJ for ; Sat, 02 Jan 2010 04:00:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NR2f7-0008UB-Px; Sat, 02 Jan 2010 12:00:53 +0000 Date: Sat, 2 Jan 2010 07:00:53 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Don't flush stale inodes Subject: Re: [PATCH] XFS: Don't flush stale inodes Message-ID: <20100102120053.GB18502@infradead.org> References: <1262399980-19277-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262399980-19277-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262433654 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 02, 2010 at 01:39:40PM +1100, Dave Chinner wrote: > Because inodes remain in cache much longer than inode buffers do > under memory pressure, we can get the situation where we have stale, > dirty inodes being reclaimed but the backing storage has been freed. > Hence we should never, ever flush XFS_ISTALE inodes to disk as > there is no guarantee that the backing buffer is in cache and > still marked stale when the flush occurs. We should not flush stale inodes. But how do we even end up calling xfs_iflush with a stale inode? From SRS0+w7V++31+fromorbit.com=david@internode.on.net Sat Jan 2 06:04:51 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o02C4o6N104136 for ; Sat, 2 Jan 2010 06:04:51 -0600 X-ASG-Debug-ID: 1262433937-3b5903a70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9344D1DAB9B4 for ; Sat, 2 Jan 2010 04:05:38 -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 AmXxRmRAsxRRinIk for ; Sat, 02 Jan 2010 04:05:38 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10830494-1927428 for multiple; Sat, 02 Jan 2010 22:35:36 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NR2je-0008Jk-KS; Sat, 02 Jan 2010 23:05:34 +1100 Date: Sat, 2 Jan 2010 23:05:34 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Ensure we force all busy extents in range to disk Subject: Re: [PATCH] XFS: Ensure we force all busy extents in range to disk Message-ID: <20100102120534.GF13802@discord.disaster> References: <1262399936-19195-1-git-send-email-david@fromorbit.com> <20100102112329.GA27329@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100102112329.GA27329@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1262433939 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18745 Rule breakdown below pts rule 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 02, 2010 at 06:23:29AM -0500, Christoph Hellwig wrote: > Looks good, and quite interestin that we never could it before. > > Some nipicks below: > > > + /* > > + * search pagb_list for this slot, skipping open slots. We have to > > + * search the entire array as there may be multiple overlaps and > > + * we have to get the most recent LSN for the log force to push out > > + * all the transactions that span the range. > > + */ > > + for (bsy = pag->pagb_list; cnt; bsy++, cnt--) { > > Maybe you coult convert this to a more standard loop idiom while you're > at it: > > for (cnt = 0; cnt < pag->pagb_count; cnt++) { > bsy = &pag->pagb_list[cnt]; Done. > > + if (!bsy->busy_tp) > > + continue; > > > > + bend = bsy->busy_start + bsy->busy_length - 1; > > + if ((bno > bend) || (uend < bsy->busy_start)) > > no need for the inner braces here. And done. Patch below. > And btw, the standard subsystem prefix is all lower case, xfs:, not > XFS:. One of these days I'll get it right ;) > Also it seems like this patch requires your perag-lookup fixes first. Yes. I've kind of been assuming that they will go in after reviews and fixups are completed. > Time to get them into the for-2.6.34 git tree ASAP as a base to work > against. That might also make it easier to work on the lockless patch > separately. Agreed. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: Ensure we force all busy extents in range to disk When we search for and find a busy extent during allocation we force the log out to ensure the extent free transaction is on disk before the allocation transaction. The curret implementation has a subtle bug in it - it does not handle multiple overlapping ranges. That is, if we free lots of little extents into a single contiguous extent, then allocate the contiguous extent, the busy search code stops searching at the first extent it finds that overlaps the allocated range. It then uses the commit LSN of the transaction to force the log out to. Unfortunately, the other busy ranges might have more recent commit LSNs than the first busy extent that is found, and this results in xfs_alloc_search_busy() returning before all the extent free transactions are on disk for the range being allocated. This can lead to potential metadata corruption or stale data exposure after a crash because log replay won't replay all the extent free transactions that cover the allocation range. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_trace.h | 9 +++++-- fs/xfs/xfs_alloc.c | 47 +++++++++++++++++++---------------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 5ec1475..2b0819a 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -1064,14 +1064,15 @@ TRACE_EVENT(xfs_alloc_unbusy, TRACE_EVENT(xfs_alloc_busysearch, TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, - xfs_extlen_t len, int found), - TP_ARGS(mp, agno, agbno, len, found), + xfs_extlen_t len, int found, xfs_lsn_t lsn), + TP_ARGS(mp, agno, agbno, len, found, lsn), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_agnumber_t, agno) __field(xfs_agblock_t, agbno) __field(xfs_extlen_t, len) __field(int, found) + __field(xfs_lsn_t, lsn) ), TP_fast_assign( __entry->dev = mp->m_super->s_dev; @@ -1079,12 +1080,14 @@ TRACE_EVENT(xfs_alloc_busysearch, __entry->agbno = agbno; __entry->len = len; __entry->found = found; + __entry->lsn = lsn; ), - TP_printk("dev %d:%d agno %u agbno %u len %u %s", + TP_printk("dev %d:%d agno %u agbno %u len %u force lsn 0x%llx %s", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, __entry->agbno, __entry->len, + __entry->lsn, __print_symbolic(__entry->found, XFS_BUSY_STATES)) ); diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index d58ca99..c9ee98d 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -2565,43 +2565,40 @@ xfs_alloc_search_busy(xfs_trans_t *tp, struct xfs_perag *pag; xfs_perag_busy_t *bsy; xfs_agblock_t uend, bend; - xfs_lsn_t lsn; + xfs_lsn_t lsn = 0; int cnt; pag = xfs_perag_get(tp->t_mountp, agno); spin_lock(&pag->pagb_lock); - cnt = pag->pagb_count; - uend = bno + len - 1; - /* search pagb_list for this slot, skipping open slots */ - for (bsy = pag->pagb_list; cnt; bsy++) { + /* + * search pagb_list for this slot, skipping open slots. We have to + * search the entire array as there may be multiple overlaps and + * we have to get the most recent LSN for the log force to push out + * all the transactions that span the range. + */ + for (cnt = 0; cnt < pag->pagb_count; cnt++) { + bsy = &pag->pagb_list[cnt]; + if (!bsy->busy_tp) + continue; - /* - * (start1,length1) within (start2, length2) - */ - if (bsy->busy_tp != NULL) { - bend = bsy->busy_start + bsy->busy_length - 1; - if ((bno > bend) || (uend < bsy->busy_start)) { - cnt--; - } else { - break; - } - } - } + bend = bsy->busy_start + bsy->busy_length - 1; + if (bno > bend || uend < bsy->busy_start) + continue; - trace_xfs_alloc_busysearch(tp->t_mountp, agno, bno, len, !!cnt); + /* (start1,length1) within (start2, length2) */ + if (XFS_LSN_CMP(bsy->busy_tp->t_commit_lsn, lsn) > 0) + lsn = bsy->busy_tp->t_commit_lsn; + } + spin_unlock(&pag->pagb_lock); + xfs_perag_put(pag); + trace_xfs_alloc_busysearch(tp->t_mountp, agno, bno, len, !!cnt, lsn); /* * If a block was found, force the log through the LSN of the * transaction that freed the block */ - if (cnt) { - lsn = bsy->busy_tp->t_commit_lsn; - spin_unlock(&pag->pagb_lock); + if (lsn) xfs_log_force(tp->t_mountp, lsn, XFS_LOG_FORCE|XFS_LOG_SYNC); - } else { - spin_unlock(&pag->pagb_lock); - } - xfs_perag_put(pag); } From SRS0+1s6Y+31+fromorbit.com=david@internode.on.net Sat Jan 2 06:11:20 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o02CBJVE104855 for ; Sat, 2 Jan 2010 06:11:19 -0600 X-ASG-Debug-ID: 1262434327-7f7301510000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 02C2715033D4 for ; Sat, 2 Jan 2010 04:12:07 -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 jOkaNyTZUwj6FlgD for ; Sat, 02 Jan 2010 04:12:07 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11059890-1927428 for multiple; Sat, 02 Jan 2010 22:42:05 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NR2pv-0008KH-U4; Sat, 02 Jan 2010 23:12:03 +1100 Date: Sat, 2 Jan 2010 23:12:03 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Kill filestreams cache flush Subject: Re: [PATCH] XFS: Kill filestreams cache flush Message-ID: <20100102121203.GG13802@discord.disaster> References: <1262399900-19110-1-git-send-email-david@fromorbit.com> <20100102115338.GA18502@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100102115338.GA18502@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1262434329 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18746 Rule breakdown below pts rule 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 02, 2010 at 06:53:38AM -0500, Christoph Hellwig wrote: > On Sat, Jan 02, 2010 at 01:38:20PM +1100, Dave Chinner wrote: > > The filestreams cache flush is not needed in the sync code as it > > does not affect data writeback, and it is now not used by the > > growfs code, either, so kill it. > > I have to admit I never understood the purpose of this call. I can't remember why it was put there, either. I may have even put it there when I was getting filestreams ready for merge but I can't remember at all... > What xfs_fstrm_free_func does is: > > - clear the filesystems flag on the inode > - decrement pagf_fstrms > - drop references on the inode (and parent if known) > - free the filestream item > > Nothing of that should matter for sync, although dropping inode > references during sync might generally be a good idea. Which means that sync destroys active filestreams associations and that seems more broken to me than anything an active reference will cause. I think just letting them time out is better than having them destroyed by external operations. I'm happy to leave it there if you want.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+5f+1+31+fromorbit.com=david@internode.on.net Sat Jan 2 06:14:00 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o02CDxrI105153 for ; Sat, 2 Jan 2010 06:13:59 -0600 X-ASG-Debug-ID: 1262434487-77a000770000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 423961DAB7C4 for ; Sat, 2 Jan 2010 04:14:47 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id dZCLDBgszggFFOVK for ; Sat, 02 Jan 2010 04:14:47 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10940498-1927428 for multiple; Sat, 02 Jan 2010 22:44:46 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NR2sX-0008KT-05; Sat, 02 Jan 2010 23:14:45 +1100 Date: Sat, 2 Jan 2010 23:14:44 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Don't flush stale inodes Subject: Re: [PATCH] XFS: Don't flush stale inodes Message-ID: <20100102121444.GH13802@discord.disaster> References: <1262399980-19277-1-git-send-email-david@fromorbit.com> <20100102120053.GB18502@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100102120053.GB18502@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1262434489 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18745 Rule breakdown below pts rule 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 02, 2010 at 07:00:53AM -0500, Christoph Hellwig wrote: > On Sat, Jan 02, 2010 at 01:39:40PM +1100, Dave Chinner wrote: > > Because inodes remain in cache much longer than inode buffers do > > under memory pressure, we can get the situation where we have stale, > > dirty inodes being reclaimed but the backing storage has been freed. > > Hence we should never, ever flush XFS_ISTALE inodes to disk as > > there is no guarantee that the backing buffer is in cache and > > still marked stale when the flush occurs. > > We should not flush stale inodes. But how do we even end up calling > xfs_iflush with a stale inode? xfs_reclaim_inode() -> xfs_iflush() according to the stack traces that found bad inode magic numbers in xfs_itobp(). Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+5f+1+31+fromorbit.com=david@internode.on.net Sat Jan 2 06:23:20 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o02CNKCo106285 for ; Sat, 2 Jan 2010 06:23:20 -0600 X-ASG-Debug-ID: 1262435047-0d1200250000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 48B001DAB8F8 for ; Sat, 2 Jan 2010 04:24:08 -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 ONBYLIySBVlEtlRO for ; Sat, 02 Jan 2010 04:24:08 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10940666-1927428 for multiple; Sat, 02 Jan 2010 22:54:07 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NR31Z-0008L0-CT; Sat, 02 Jan 2010 23:24:05 +1100 Date: Sat, 2 Jan 2010 23:24:05 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Don't flush stale inodes Subject: Re: [PATCH] XFS: Don't flush stale inodes Message-ID: <20100102122405.GI13802@discord.disaster> References: <1262399980-19277-1-git-send-email-david@fromorbit.com> <20100102120053.GB18502@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100102120053.GB18502@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1262435049 X-Barracuda-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.18747 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 Sat, Jan 02, 2010 at 07:00:53AM -0500, Christoph Hellwig wrote: > On Sat, Jan 02, 2010 at 01:39:40PM +1100, Dave Chinner wrote: > > Because inodes remain in cache much longer than inode buffers do > > under memory pressure, we can get the situation where we have stale, > > dirty inodes being reclaimed but the backing storage has been freed. > > Hence we should never, ever flush XFS_ISTALE inodes to disk as > > there is no guarantee that the backing buffer is in cache and > > still marked stale when the flush occurs. > > We should not flush stale inodes. But how do we even end up calling > xfs_iflush with a stale inode? Actually, here's most of the failure trace (unlimited scrollback buffers are great): [ 5703.683858] Device sdb2 - bad inode magic/vsn daddr 16129976 #0 (magic=0) [ 5703.690689] ------------[ cut here ]------------ [ 5703.691665] kernel BUG at fs/xfs/support/debug.c:62! [ 5703.691665] invalid opcode: 0000 [#1] SMP [ 5703.691665] last sysfs file: /sys/devices/virtual/net/lo/operstate [ 5703.691665] CPU 1 [ 5703.691665] Modules linked in: [ 5703.691665] Pid: 4017, comm: xfssyncd Not tainted 2.6.32-dgc #73 IBM eServer 326m -[796955M]- [ 5703.691665] RIP: 0010:[] [] cmn_err+0x101/0x110 [ 5703.691665] RSP: 0018:ffff8800a8cfdaa0 EFLAGS: 00010246 [ 5703.691665] RAX: 0000000002deff6d RBX: ffffffff819102d0 RCX: 0000000000000006 [ 5703.691665] RDX: ffffffff81fb5130 RSI: ffff8800ae2d9ba0 RDI: ffff8800ae2d9440 [ 5703.691665] RBP: ffff8800a8cfdb90 R08: 0000000000000000 R09: 0000000000000001 [ 5703.691665] R10: 0000000000000001 R11: 0000000000000001 R12: 0000000000000000 [ 5703.691665] R13: 0000000000000282 R14: 0000000000000000 R15: ffff8800ae34ca88 [ 5703.691665] FS: 00007f64efe476f0(0000) GS:ffff880007600000(0000) knlGS:0000000000000000 [ 5703.691665] CS: 0010 DS: 0018 ES: 0018 CR0: 000000008005003b [ 5703.691665] CR2: 00007f64efe4b000 CR3: 00000000ad04f000 CR4: 00000000000006e0 [ 5703.691665] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 5703.691665] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 [ 5703.691665] Process xfssyncd (pid: 4017, threadinfo ffff8800a8cfc000, task ffff8800ae2d9440) [ 5703.691665] Stack: [ 5703.691665] 0000003000000030 ffff8800a8cfdba0 ffff8800a8cfdac0 ffff8800ad585b24 [ 5703.691665] <0> 0000000000000002 ffffffff8135e77d ffff8800a8cfdbe0 0000000000f61fb8 [ 5703.691665] <0> 0000000000000000 0000000000000000 ffff8800a8cfdb10 ffffffff81388330 [ 5703.691665] Call Trace: [ 5703.691665] [] ? xfs_itobp+0x6d/0x100 [ 5703.691665] [] ? _xfs_buf_read+0x90/0xa0 [ 5703.691665] [] ? xfs_buf_read+0xdc/0x110 [ 5703.691665] [] ? xfs_trans_read_buf+0x43f/0x680 [ 5703.691665] [] ? disk_name+0x63/0xc0 [ 5703.691665] [] xfs_imap_to_bp+0x15a/0x240 [ 5703.691665] [] ? xfs_itobp+0x6d/0x100 [ 5703.691665] [] xfs_itobp+0x6d/0x100 [ 5703.691665] [] xfs_iflush+0x207/0x380 [ 5703.691665] [] xfs_reclaim_inode+0x15f/0x1b0 [ 5703.691665] [] xfs_reclaim_inode_now+0x68/0x90 [ 5703.691665] [] ? xfs_reclaim_inode_now+0x0/0x90 [ 5703.691665] [] xfs_inode_ag_walk+0x64/0xc0 [ 5703.691665] [] ? xfs_perag_get+0xe2/0x110 [ 5703.691665] [] xfs_inode_ag_iterator+0x77/0xc0 [ 5703.691665] [] ? xfs_reclaim_inode_now+0x0/0x90 I was hitting this regularly with workloads creating then removing hundreds of thousands of small files, and the patch I sent stopped them from occurring... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+ad3dc5ce6bcf5dcfbbff+2323+infradead.org+hch@bombadil.srs.infradead.org Sat Jan 2 06:46:02 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o02Ck1eV109169 for ; Sat, 2 Jan 2010 06:46:01 -0600 X-ASG-Debug-ID: 1262436411-0cb200ee0000-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 4CB5E172F08B for ; Sat, 2 Jan 2010 04:46:51 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id pEF46NtbYKwgx6BR for ; Sat, 02 Jan 2010 04:46:51 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NR3NZ-0003Ow-Om; Sat, 02 Jan 2010 12:46:49 +0000 Date: Sat, 2 Jan 2010 07:46:49 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Kill filestreams cache flush Subject: Re: [PATCH] XFS: Kill filestreams cache flush Message-ID: <20100102124649.GA8004@infradead.org> References: <1262399900-19110-1-git-send-email-david@fromorbit.com> <20100102115338.GA18502@infradead.org> <20100102121203.GG13802@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100102121203.GG13802@discord.disaster> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262436411 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 02, 2010 at 11:12:03PM +1100, Dave Chinner wrote: > Which means that sync destroys active filestreams associations and > that seems more broken to me than anything an active reference will > cause. I think just letting them time out is better than having them > destroyed by external operations. I'm happy to leave it there if you > want.... Just trying to understand what's going on here. If you think the new behaviour is better and it doesn't cause any regressions in QA I'm fine with it. Consider it: Reviewed-by: Christoph Hellwig From andi@firstfloor.org Sat Jan 2 07:07:54 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o02D7qmC111488 for ; Sat, 2 Jan 2010 07:07:53 -0600 X-ASG-Debug-ID: 1262437719-0cb1018e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from one.firstfloor.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5D3211DAB926 for ; Sat, 2 Jan 2010 05:08:39 -0800 (PST) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id KOadd3aBettPZ41n for ; Sat, 02 Jan 2010 05:08:39 -0800 (PST) Received: from basil.firstfloor.org (p5B3CABF9.dip0.t-ipconnect.de [91.60.171.249]) by one.firstfloor.org (Postfix) with ESMTP id AE6321A98018; Sat, 2 Jan 2010 14:08:37 +0100 (CET) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 05A33B17C2; Sat, 2 Jan 2010 14:08:36 +0100 (CET) To: Dave Chinner Cc: xfs@oss.sgi.com, axboe@kernel.dk X-ASG-Orig-Subj: Re: [PATCH 3/3] XFS: Sort delayed write buffers before dispatch Subject: Re: [PATCH 3/3] XFS: Sort delayed write buffers before dispatch From: Andi Kleen References: <1262401416-19546-1-git-send-email-david@fromorbit.com> <1262401416-19546-4-git-send-email-david@fromorbit.com> Date: Sat, 02 Jan 2010 14:08:36 +0100 In-Reply-To: <1262401416-19546-4-git-send-email-david@fromorbit.com> (Dave Chinner's message of "Sat, 2 Jan 2010 14:03:36 +1100") Message-ID: <87fx6o7iy3.fsf@basil.nowhere.org> User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1262437720 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18749 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave Chinner writes: > Currently when the xfsbufd writes delayed write buffers, it pushes > them to disk in the order they come off the delayed write list. If > there are lots of buffers ѕpread widely over the disk, this results > in overwhelming the elevator sort queues in the block layer and we > end up losing the posibility of merging adjacent buffers to minimise > the number of IOs. > > Add a sort array to the buftarg so that we can do high level sorting > of the buffers once they are pulled off the delwri queue for > writeback. Currently this array can hold 4096 buffers at a time > which gives us a window 32 times larger than the default elevator > maximums for ordering buffers. At first look it seems a bit wasteful because the elevator sorts again. Is your window that much bigger than the elevators? Perhaps the sort queue in the elevator should be just enlarged? > > Ideally this should use a list sort rather than requiring an > external buffer to sort the buffers in, but for simplicity > just do it via sort function. Doing merge sort on lists is relatively simple There are plenty examples in a google search. An alternative is also to construct a rbtree on the fly and then walk it. But if you use sort() this way you probably should at least add a u64 swap function to lib/sort.c, otherwise all the pointers will be exchanged byte-by-byte on 64bit systems which is rather slow. -andi -- ak@linux.intel.com -- Speaking for myself only. From BATV+ad3dc5ce6bcf5dcfbbff+2323+infradead.org+hch@bombadil.srs.infradead.org Sat Jan 2 07:16:13 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o02DGC7M112279 for ; Sat, 2 Jan 2010 07:16:13 -0600 X-ASG-Debug-ID: 1262438222-3c6f00450000-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 C00A11376DE for ; Sat, 2 Jan 2010 05:17:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id kpfOY93CL1Rh24vf for ; Sat, 02 Jan 2010 05:17:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NR3qn-0005Im-Pj; Sat, 02 Jan 2010 13:17:01 +0000 Date: Sat, 2 Jan 2010 08:17:01 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Don't flush stale inodes Subject: Re: [PATCH] XFS: Don't flush stale inodes Message-ID: <20100102131701.GA17320@infradead.org> References: <1262399980-19277-1-git-send-email-david@fromorbit.com> <20100102120053.GB18502@infradead.org> <20100102122405.GI13802@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100102122405.GI13802@discord.disaster> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262438222 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 looks like a bigger problem to me. We only mark inodes as stale from xfs_ifree_cluster, which via xfs_ifree and xfs_inactive gets called from xfs_fs_clear_inode. Given that the inode has now been deleted we should not mark it as reclaimable in xfs_fs_destroy_inode but go on to reap it given that there is nothing to reclaim. From SRS0+H4Gf+31+fromorbit.com=david@internode.on.net Sat Jan 2 07:38:19 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o02DcI5A114596 for ; Sat, 2 Jan 2010 07:38:19 -0600 X-ASG-Debug-ID: 1262439545-036803be0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6B57715034C7 for ; Sat, 2 Jan 2010 05:39: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 D41UDEJmgIymPGGg for ; Sat, 02 Jan 2010 05:39:06 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10869869-1927428 for multiple; Sun, 03 Jan 2010 00:09:04 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NR4C6-0008OX-TZ; Sun, 03 Jan 2010 00:39:02 +1100 Date: Sun, 3 Jan 2010 00:39:02 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Don't flush stale inodes Subject: Re: [PATCH] XFS: Don't flush stale inodes Message-ID: <20100102133902.GJ13802@discord.disaster> References: <1262399980-19277-1-git-send-email-david@fromorbit.com> <20100102120053.GB18502@infradead.org> <20100102122405.GI13802@discord.disaster> <20100102131701.GA17320@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100102131701.GA17320@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1262439547 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18752 Rule breakdown below pts rule 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 02, 2010 at 08:17:01AM -0500, Christoph Hellwig wrote: > This looks like a bigger problem to me. We only mark inodes as stale > from xfs_ifree_cluster, which via xfs_ifree and xfs_inactive gets > called from xfs_fs_clear_inode. Given that the inode has now been > deleted we should not mark it as reclaimable in xfs_fs_destroy_inode > but go on to reap it given that there is nothing to reclaim. We can't reap it immediately as the inodes are usually dirty and pinned in memory at this point by transactions that have not yet been written to disk and completed. We need the inodes in core for log IO completion processing.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+H4Gf+31+fromorbit.com=david@internode.on.net Sat Jan 2 08:13:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o02EDejc117892 for ; Sat, 2 Jan 2010 08:13:40 -0600 X-ASG-Debug-ID: 1262441667-0d1303d90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DE7671DABB03 for ; Sat, 2 Jan 2010 06:14:28 -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 15G5mpVCEFj0hmVJ for ; Sat, 02 Jan 2010 06:14:28 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10870536-1927428 for multiple; Sun, 03 Jan 2010 00:44:16 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NR4kA-0008Qc-H2; Sun, 03 Jan 2010 01:14:14 +1100 Date: Sun, 3 Jan 2010 01:14:14 +1100 From: Dave Chinner To: Andi Kleen Cc: xfs@oss.sgi.com, axboe@kernel.dk X-ASG-Orig-Subj: Re: [PATCH 3/3] XFS: Sort delayed write buffers before dispatch Subject: Re: [PATCH 3/3] XFS: Sort delayed write buffers before dispatch Message-ID: <20100102141414.GK13802@discord.disaster> References: <1262401416-19546-1-git-send-email-david@fromorbit.com> <1262401416-19546-4-git-send-email-david@fromorbit.com> <87fx6o7iy3.fsf@basil.nowhere.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <87fx6o7iy3.fsf@basil.nowhere.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1262441669 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18753 Rule breakdown below pts rule 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 02, 2010 at 02:08:36PM +0100, Andi Kleen wrote: > Dave Chinner writes: > > > Currently when the xfsbufd writes delayed write buffers, it pushes > > them to disk in the order they come off the delayed write list. If > > there are lots of buffers ѕpread widely over the disk, this results > > in overwhelming the elevator sort queues in the block layer and we > > end up losing the posibility of merging adjacent buffers to minimise > > the number of IOs. > > > > Add a sort array to the buftarg so that we can do high level sorting > > of the buffers once they are pulled off the delwri queue for > > writeback. Currently this array can hold 4096 buffers at a time > > which gives us a window 32 times larger than the default elevator > > maximums for ordering buffers. > > At first look it seems a bit wasteful because the elevator > sorts again. Is your window that much bigger than the elevators? Easily - at currently limits we can log about 8000 inodes a megabyte of log space and we can write over 150MB/s to the log. That adds up to about 1.2million inodes dirtied a second, or 40,000 inode buffers a second needing to be written back..... We have much more of a clue about what is happening at the filesytem level, and can optimise far more efficiently at higher levels. The elevator can only merge IOs if the higher layer sends it adjacent blocks. I don't want to do buffer merging in XFS, but I want adjacent IOs merged and the elevator does that well. Rather than sending buffers down in random order and only getting a few merges, sorting all the buffers first guarantees that all possible merges are made by the elevator across the entire dispatch without needing to tweak the elevator at all. IOWs, being smart at the higher layers where you have the context to do a good job means we don't need to add heuristics or tweaks to try to guess the best thing to do at the lower layers. > Perhaps the sort queue in the elevator should be just enlarged? Which we used to do and that caused all sorts of latency and OOM issues by pinning huge amounts of dirty memory in the elevators. > > Ideally this should use a list sort rather than requiring an > > external buffer to sort the buffers in, but for simplicity > > just do it via sort function. > > Doing merge sort on lists is relatively simple There are > plenty examples in a google search. An alternative is also > to construct a rbtree on the fly and then walk it. Already got it handled - there's a couple of copies of list_sort() already in the tree - I'll post an updated patch set in the next couple of days after I've had a chance to QA it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From lists@nerdbynature.de Sat Jan 2 16:15:22 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o02MFLdd163739 for ; Sat, 2 Jan 2010 16:15:21 -0600 X-ASG-Debug-ID: 1262470569-08d902230000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from moutng.kundenserver.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1497A1DAC2C4 for ; Sat, 2 Jan 2010 14:16:10 -0800 (PST) Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.187]) by cuda.sgi.com with ESMTP id FQsXRdoEBAcxcPWz for ; Sat, 02 Jan 2010 14:16:10 -0800 (PST) Received: from bogon.housecafe.de (ppp-93-104-176-88.dynamic.mnet-online.de [93.104.176.88]) by mrelayeu.kundenserver.de (node=mreu1) with ESMTP (Nemesis) id 0Lg4q7-1Nk5sB49BD-00pVON; Sat, 02 Jan 2010 23:16:09 +0100 Received: from localhost ([127.0.0.1]) by bogon.housecafe.de with esmtp (Exim 4.69) (envelope-from ) id 1NRCGW-0001Sm-4i for xfs@oss.sgi.com; Sat, 02 Jan 2010 23:16:08 +0100 Date: Sat, 2 Jan 2010 14:16:08 -0800 (PST) From: Christian Kujau To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] use CFLAGS in src/Makefile Subject: [PATCH] use CFLAGS in src/Makefile Message-ID: User-Agent: Alpine 2.01 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Provags-ID: V01U2FsdGVkX1/VjdBCLmXTzySXgj80HvgT1slQovjxzUElVd7 N7PPjtn4TQrWepMZsNsnUHzobDmphjPiJvncsHED6FrfFe57vn 5lo0CSXzoPKk7ba2P6F3A== X-Barracuda-Connect: moutng.kundenserver.de[212.227.126.187] X-Barracuda-Start-Time: 1262470571 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18784 Rule breakdown below pts rule 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, while compiling xfstests after configuring with a different CFLAGS value, gcc fails in ./src: [...] make[2]: Entering directory `/usr/local/src/xfstests-git/src' gcc -g -O2 -DDEBUG -I../include -DVERSION=\"1.0.0\" -L/opt/xfsprogs/lib -DREAD iopat.c -o preallo_rw_pattern_reader iopat.c:21:21: error: xfs/xfs.h: No such file or directory [...] Somehow CFLAGS isn't passed to gcc, but "GCFLAGS" is. I'm not too savvy with the xfstests build system, but in include/builddefs.in we see: # Global, Platform, Local CFLAGS CFLAGS += $(GCFLAGS) $(PCFLAGS) $(LCFLAGS) ...thus I'm proposing the following fix: --- xfstests-git/src/Makefile.orig 2010-01-02 14:01:32.692011000 -0800 +++ xfstests-git/src/Makefile 2010-01-02 14:04:13.352011000 -0800 @@ -97,10 +97,10 @@ dmiperf: dmiperf.o $(LINKTEST) $(LIBATTR) $(LDLIBS) preallo_rw_pattern_reader: - $(CC) $(GCFLAGS) $(LDFLAGS) -DREAD iopat.c -o preallo_rw_pattern_reader + $(CC) $(CFLAGS) $(LDFLAGS) -DREAD iopat.c -o preallo_rw_pattern_reader preallo_rw_pattern_writer: - $(CC) $(GCFLAGS) $(LDFLAGS) -DWRITE iopat.c -o preallo_rw_pattern_writer + $(CC) $(CFLAGS) $(LDFLAGS) -DWRITE iopat.c -o preallo_rw_pattern_writer ftrunc: ftrunc.o $(LINKTEST) Thanks, Christian. -- BOFH excuse #267: The UPS is on strike. From lists@nerdbynature.de Sun Jan 3 04:29:24 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_33,J_CHICKENPOX_62,LOCAL_GNU_PATCH autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o03ATNa7220022 for ; Sun, 3 Jan 2010 04:29:23 -0600 X-ASG-Debug-ID: 1262514608-13da004c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from moutng.kundenserver.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1B90915047B4 for ; Sun, 3 Jan 2010 02:30:09 -0800 (PST) Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.187]) by cuda.sgi.com with ESMTP id c3PlCNRRVCvT5FbE for ; Sun, 03 Jan 2010 02:30:09 -0800 (PST) Received: from bogon.housecafe.de (ppp-93-104-176-88.dynamic.mnet-online.de [93.104.176.88]) by mrelayeu.kundenserver.de (node=mreu0) with ESMTP (Nemesis) id 0MNyIR-1NYnZt2tQ3-007Lcq; Sun, 03 Jan 2010 11:30:07 +0100 Received: from localhost ([127.0.0.1]) by bogon.housecafe.de with esmtp (Exim 4.69) (envelope-from ) id 1NRNin-0000MF-Ha for xfs@oss.sgi.com; Sun, 03 Jan 2010 11:30:05 +0100 Date: Sun, 3 Jan 2010 02:30:05 -0800 (PST) From: Christian Kujau To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] remove bashisms from xfstests Subject: [PATCH] remove bashisms from xfstests Message-ID: User-Agent: Alpine 2.01 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Provags-ID: V01U2FsdGVkX18EMQLMSUUGbtxHaDSof8C7KLvz+ZWqr4uRa1t 9+YWh3fVVlDWgDmFLrWCn7SUoMwAoMSMG312fhgZToHvYiAWi7 Cm/irNn6mqfNkYTZIBFnw== X-Barracuda-Connect: moutng.kundenserver.de[212.227.126.187] X-Barracuda-Start-Time: 1262514611 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=INFO_TLD X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18832 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 INFO_TLD URI: Contains an URL in the INFO top-level domain X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean While trying to run xfstests, I encountered several errors due to the fact that my /bin/sh is not linked to /bin/bash but to dash(1), which can be made the default /bin/sh in Debian based systems. The patch below is rather large and is touching many files, but it's pretty straightfoward: 1) convert brace expansions (e.g. "rm -f symlink_{0,1,2,3}") 2) convert "let..." into something (hopefully) more portable 3) replace 'a == b' with 'a = b' in bourne shell scripts With these changes applied, xfstests is actually running on this box (tested on Ubuntu/9.10). I don't have an IRIX system to test on though. There are still a few things left to fix, as I'm still get a few errors while running the tests, but without these changes the testsuit pretty much would not run at all. Thoughts? Christian. 71 files changed, 197 insertions(+), 175 deletions(-) diff -Nrup xfstests.orig/005 xfstests/005 --- xfstests.orig/005 2010-01-03 00:42:16.471617592 -0800 +++ xfstests/005 2010-01-03 00:43:56.321617592 -0800 @@ -45,7 +45,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 1 _cleanup() { cd $testdir - rm -f symlink_{0,1,2,3}{0,1,2,3,4,5,6,7,8,9} symlink_self empty_file + rm -f symlink_* empty_file cd / _cleanup_testdir } @@ -70,7 +70,7 @@ _touch() _supported_fs generic # IRIX UDF does not support symlinks -if [ $FSTYP == 'udf' ]; then +if [ $FSTYP = 'udf' ]; then _supported_os Linux else _supported_os Linux IRIX @@ -82,17 +82,24 @@ cd $testdir o=empty_file touch $o -for f in symlink_{0,1,2,3}{0,1,2,3,4,5,6,7,8,9} +f=1 +while [ $f -le 40 ] do - ln -s $o $f + ln -s $o symlink_$f o=$f + o=symlink_$f + f=$((f + 1)) done ln -s symlink_self symlink_self echo "*** touch deep symlinks" echo "" -_touch symlink_{0,1,2,3}{0,1,2,3,4,5,6,7,8,9} +i=1 +while [ $i -le 40 ]; do + _touch symlink_"$i" + i=$((i + 1)) +done echo "" echo "*** touch recusive symlinks" echo "" diff -Nrup xfstests.orig/007 xfstests/007 --- xfstests.orig/007 2010-01-03 00:42:16.481617592 -0800 +++ xfstests/007 2010-01-03 00:43:56.321617592 -0800 @@ -64,7 +64,7 @@ num_filenames=100 i=1 while [ $i -le $num_filenames ]; do echo "nametest.$i" >>$sourcefile - let i=$i+1 + i=$((i + 1)) done mkdir $testdir/$seq diff -Nrup xfstests.orig/010 xfstests/010 --- xfstests.orig/010 2010-01-03 00:42:16.501617592 -0800 +++ xfstests/010 2010-01-03 00:43:56.321617592 -0800 @@ -36,7 +36,7 @@ _cleanup() { cd / rm -f $tmp.* - rm -f $testdir/DBtest*.{pag,dir} + rm -f $testdir/DBtest*.pag $testdir/DBtest*.dir _cleanup_testdir } diff -Nrup xfstests.orig/016 xfstests/016 --- xfstests.orig/016 2010-01-03 00:42:16.521617592 -0800 +++ xfstests/016 2010-01-03 00:43:56.321617592 -0800 @@ -102,7 +102,7 @@ _log_traffic() do touch $out rm $out - let "count = count - 1" + count=$((count - 1)) done echo " *** unmount" diff -Nrup xfstests.orig/020 xfstests/020 --- xfstests.orig/020 2010-01-03 00:42:16.541617592 -0800 +++ xfstests/020 2010-01-03 00:43:56.321617592 -0800 @@ -128,7 +128,7 @@ do exit 1 fi - let "v = v + 1" + v=$((v + 1)) done echo "*** check" @@ -151,7 +151,7 @@ do exit 1 fi - let "v = v + 1" + v=$((v + 1)) done _attr_list $testfile diff -Nrup xfstests.orig/028 xfstests/028 --- xfstests.orig/028 2010-01-03 00:42:16.581617592 -0800 +++ xfstests/028 2010-01-03 00:43:56.321617592 -0800 @@ -58,7 +58,7 @@ while [ $i -lt 5 ]; do fi rm $dump_file sleep 2 - let i=$i+1 + i=$((i + 1)) done echo "middate = $middate" >>$seq.full --- xfstests.orig/031 2010-01-03 00:42:16.591617592 -0800 +++ xfstests/031 2010-01-03 02:19:04.505494591 -0800 @@ -69,6 +69,7 @@ _check_repair() _create_proto() { total=$1 + isize=256 count=0 # take inode size into account for non-shortform directories... @@ -85,7 +86,7 @@ EOF while [ $count -lt $total ] do - let count=$count+1 + count=$((count + 1)) cat >>$tmp.proto </dev/null diff -Nrup xfstests.orig/043 xfstests/043 --- xfstests.orig/043 2010-01-03 00:42:16.651617592 -0800 +++ xfstests/043 2010-01-03 00:43:56.321617592 -0800 @@ -49,7 +49,7 @@ _require_tape $TAPE_DEV _create_dumpdir_fill _erase_hard _do_dump_sub -rm -rf /var/{,lib/}xfsdump/inventory # delete it - let cleanup fix it +rm -rf /var/lib/xfsdump/inventory /var/xfsdump/inventory # delete it - let cleanup fix it _do_restore _diff_compare_sub _ls_compare_sub diff -Nrup xfstests.orig/044 xfstests/044 --- xfstests.orig/044 2010-01-03 00:42:16.661617592 -0800 +++ xfstests/044 2010-01-03 00:43:56.321617592 -0800 @@ -172,7 +172,7 @@ echo "*** write large dirty log" $here/src/loggen -u 2 -e 16000 -z 100 >$SCRATCH_LOGDEV _check_mount -echo -e -n "\n\r*** XFS QA 044 - done\n\r\n\r" >/dev/console +printf "\n\r*** XFS QA 044 - done\n\r\n\r" >/dev/console status=0 # if error diff -Nrup xfstests.orig/047 xfstests/047 --- xfstests.orig/047 2010-01-03 00:42:16.671617592 -0800 +++ xfstests/047 2010-01-03 00:43:56.321617592 -0800 @@ -58,7 +58,7 @@ while [ $i -lt 5 ]; do fi rm $dump_file sleep 2 - let i=$i+1 + i=$((i + 1)) done echo "middate = $middate" >>$seq.full diff -Nrup xfstests.orig/050 xfstests/050 --- xfstests.orig/050 2010-01-03 00:42:16.681617592 -0800 +++ xfstests/050 2010-01-03 00:43:56.321617592 -0800 @@ -181,7 +181,7 @@ EOF projid_file="$tmp.projid" echo "*** user" -if [ "$HOSTOS" == "IRIX" ] +if [ "$HOSTOS" = "IRIX" ] then _qmount_option "quota" else @@ -194,7 +194,7 @@ _qmount_option "gquota" _exercise echo "*** uqnoenforce" -if [ "$HOSTOS" == "IRIX" ] +if [ "$HOSTOS" = "IRIX" ] then _qmount_option "qnoenforce" else diff -Nrup xfstests.orig/051 xfstests/051 --- xfstests.orig/051 2010-01-03 00:42:16.691617592 -0800 +++ xfstests/051 2010-01-03 00:43:56.321617592 -0800 @@ -289,16 +289,13 @@ chacl -l acldir/file2 | _acl_filter_id echo "" echo "=== Recursive change ACL ===" rm -fr root -mkdir root -pushd root >/dev/null # create an arbitrary little tree for i in 1 2 3 4 5 6 7 8 9 0 do - mkdir -p a/$i - mkdir -p b/c$i/$i - touch a/$i/mumble + mkdir -p root/a/$i + mkdir -p root/b/c$i/$i + touch root/a/$i/mumble done -popd >/dev/null chown -R 12345.54321 root echo "Change #1..." $runas -u 12345 -g 54321 -- `which chacl` -r u::rwx,g::-w-,o::--x root diff -Nrup xfstests.orig/053 xfstests/053 --- xfstests.orig/053 2010-01-03 00:42:16.701617592 -0800 +++ xfstests/053 2010-01-03 00:43:56.321617592 -0800 @@ -68,7 +68,7 @@ for acl in $acls do _do "touch $test.$i" _do "chacl $acl $test.$i" - let i=$i+1 + i=$((i + 1)) done list_acls() @@ -77,7 +77,7 @@ list_acls() for acl in $acls do chacl -l $test.$i | _acl_filter_id | sed -e "s!$SCRATCH_MNT!\$SCRATCH_MNT!" - let i=$i+1 + i=$((i + 1)) done } diff -Nrup xfstests.orig/064 xfstests/064 --- xfstests.orig/064 2010-01-03 00:42:16.751617592 -0800 +++ xfstests/064 2010-01-03 00:43:56.321617592 -0800 @@ -72,7 +72,7 @@ while [ $i -le 9 ]; do date >>$seq.full find $SCRATCH_MNT -exec $here/src/lstat64 {} \; | sed 's/(00.*)//' >$tmp.dates.$i if [ $i -gt 0 ]; then - let level_1=$i-1 + level_1=$((i - 1)) diff -c $tmp.dates.$level_1 $tmp.dates.$i >>$seq.full else cat $tmp.dates.$i >>$seq.full @@ -80,7 +80,7 @@ while [ $i -le 9 ]; do dump_file=$tmp.df.level$i _do_dump_file -l $i - let i=$i+1 + i=$((i + 1)) done echo "Listing of what files we start with:" @@ -93,7 +93,7 @@ while [ $i -le 9 ]; do echo "restoring from df.level$i" dump_file=$tmp.df.level$i _do_restore_toc - let i=$i+1 + i=$((i + 1)) done echo "Do the cumulative restores" @@ -105,7 +105,7 @@ while [ $i -le 9 ]; do _do_restore_file_cum -l $i echo "ls -l restore_dir" ls -lR $restore_dir | _ls_size_filter | _check_quota_file - let i=$i+1 + i=$((i + 1)) done # success, all done diff -Nrup xfstests.orig/065 xfstests/065 --- xfstests.orig/065 2010-01-03 00:42:16.751617592 -0800 +++ xfstests/065 2010-01-03 00:43:56.321617592 -0800 @@ -160,7 +160,7 @@ while [ $i -le $num_dumps ]; do dump_file=$tmp.df.level$i _do_dump_file -l $i - let i=$i+1 + i=$((i + 1)) done echo "Look at what files are contained in the inc. dump" @@ -170,7 +170,7 @@ while [ $i -le $num_dumps ]; do echo "restoring from df.level$i" dump_file=$tmp.df.level$i _do_restore_toc - let i=$i+1 + i=$((i + 1)) done echo "Do the cumulative restores" @@ -182,7 +182,7 @@ while [ $i -le $num_dumps ]; do _do_restore_file_cum -l $i echo "list restore_dir" _list_dir $restore_dir | _check_quota_file | tee $tmp.restorals.$i - let i=$i+1 + i=$((i + 1)) done echo "" @@ -192,7 +192,7 @@ while [ $i -le $num_dumps ]; do echo "Comparing ls of FS with restored FS at level $i" diff -s $tmp.ls.$i $tmp.restorals.$i | sed "s#$tmp#TMP#g" echo "" - let i=$i+1 + i=$((i + 1)) done diff -Nrup xfstests.orig/067 xfstests/067 --- xfstests.orig/067 2010-01-03 00:42:16.761617592 -0800 +++ xfstests/067 2010-01-03 00:43:56.321617592 -0800 @@ -50,7 +50,7 @@ _require_scratch # set up fs for 1K inodes isize=0 _scratch_mkfs_xfs | _filter_mkfs >$seq.full 2>$tmp.mkfs -[ $? -eq 0 ] && source $tmp.mkfs +[ $? -eq 0 ] && . $tmp.mkfs if [ "$isize" -lt 1024 ]; then _scratch_mkfs_xfs -i size=1024 >>$here/$seq.full \ || _notrun "Cannot mkfs for this test using MKFS_OPTIONS specified" diff -Nrup xfstests.orig/068 xfstests/068 --- xfstests.orig/068 2010-01-03 00:42:16.771617592 -0800 +++ xfstests/068 2010-01-03 00:43:56.331617592 -0800 @@ -89,7 +89,7 @@ touch $tmp.running } & i=0 -let ITERATIONS=$ITERATIONS-1 +ITERATIONS=$((ITERATIONS - 1)) echo | tee -a $seq.full while [ $i -le $ITERATIONS ] @@ -108,7 +108,7 @@ do sleep 2 echo | tee -a $seq.full - let i=$i+1 + i=$((i + 1)) done # stop fsstress iterations diff -Nrup xfstests.orig/071 xfstests/071 --- xfstests.orig/071 2010-01-03 00:42:16.781617592 -0800 +++ xfstests/071 2010-01-03 00:43:56.331617592 -0800 @@ -145,7 +145,7 @@ do echo === Iterating, `expr $upperbound - $count` remains echo echo - let count=$count+1 + count=$((count + 1)) done # success, all done diff -Nrup xfstests.orig/074 xfstests/074 --- xfstests.orig/074 2010-01-03 00:42:16.801617592 -0800 +++ xfstests/074 2010-01-03 00:43:56.331617592 -0800 @@ -119,7 +119,7 @@ _supported_os IRIX Linux # These params can take a while on different CPUs/OSs # so we set them differently for different machines # -if [ $HOSTOS == "IRIX" ]; then +if [ $HOSTOS = "IRIX" ]; then if uname -R | grep -iq debug; then # e.g. getting around 37secs for 1,1,1 on IP30 debug numchildren=2 @@ -133,7 +133,7 @@ if [ $HOSTOS == "IRIX" ]; then numchildren=3 param_type="IRIX nondebug" fi -elif [ $HOSTOS == "Linux" ]; then +elif [ $HOSTOS = "Linux" ]; then if uname -a | grep -q SMP; then numloops=10 numfiles=5 diff -Nrup xfstests.orig/075 xfstests/075 --- xfstests.orig/075 2010-01-03 00:42:16.801617592 -0800 +++ xfstests/075 2010-01-03 00:43:56.331617592 -0800 @@ -79,7 +79,7 @@ _do_test() cd $out if ! $here/ltp/fsx $_param -P $here $seq.$_n >/dev/null then - echo " fsx ($_param) failed, $? - compare $seq.$_n.{good,bad,fsxlog}" + echo " fsx ($_param) failed, $? - compare $seq.$_n.good/bad/fsxlog" mv $out/$seq.$_n $here/$seq.$_n.full od -xAx $here/$seq.$_n.full > $here/$seq.$_n.bad od -xAx $here/$seq.$_n.fsxgood > $here/$seq.$_n.good @@ -159,5 +159,5 @@ _do_test 1 "-d -N $numops1 -S 0 -x" _do_test 2 "-d -N $numops2 -l $filelen -S 0" _do_test 3 "-d -N $numops2 -l $filelen -S 0 -x" -rm -f $seq.*.fsx{good,log} +rm -f $seq.*.fsxgood $seq.*.fsxlog exit 0 diff -Nrup xfstests.orig/084 xfstests/084 --- xfstests.orig/084 2010-01-03 00:42:16.841617592 -0800 +++ xfstests/084 2010-01-03 00:43:56.331617592 -0800 @@ -54,7 +54,7 @@ pgsize=`$here/src/feature -s` _supported_fs xfs _supported_os IRIX Linux -if [ $HOSTOS == "IRIX" ]; then +if [ $HOSTOS = "IRIX" ]; then if uname -R | grep -iq debug; then # taking up to 23 mins on my 512K octane on debug # not worth worrying about diff -Nrup xfstests.orig/085 xfstests/085 --- xfstests.orig/085 2010-01-03 00:42:16.851617592 -0800 +++ xfstests/085 2010-01-03 00:43:56.331617592 -0800 @@ -58,7 +58,11 @@ _scratch_mount >>$seq.full 2>&1 \ || _fail "mount failed: $MOUNT_OPTIONS" echo "touch files" -touch $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9} +f=1 +while [ $f -le 100 ]; do + touch $SCRATCH_MNT/$f + f=$((f + 1)) +done echo "godown" src/godown -v -f $SCRATCH_MNT >> $seq.full diff -Nrup xfstests.orig/086 xfstests/086 --- xfstests.orig/086 2010-01-03 00:42:16.851617592 -0800 +++ xfstests/086 2010-01-03 00:43:56.331617592 -0800 @@ -102,15 +102,22 @@ for s in sync nosync ; do if [ $s = "sync" ]; then # generate some log traffic - but not too much # add some syncs to get the log flushed to disk - for file in $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}; do - touch $file + file=1 + while [ $file -le 100 ]; do + touch $SCRATCH_MNT/$file + file=$((file + 1)) sync done else # generate some log traffic - but not too much - life gets a little # more complicated if the log wraps around. This traffic is # pretty much arbitary, but could probably be made better than this. - touch $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9} + file=1 + while [ $file -le 100 ]; do + touch $SCRATCH_MNT/$file + file=$((file + 1)) + sync + done fi # check before on what FS should look like diff -Nrup xfstests.orig/089 xfstests/089 --- xfstests.orig/089 2010-01-03 00:42:16.871617592 -0800 +++ xfstests/089 2010-01-03 00:43:56.331617592 -0800 @@ -44,7 +44,7 @@ addentries() while [ $count -gt 0 ]; do touch `printf $pattern $count` - let count=$count-1 + count=$((count - 1)) done } diff -Nrup xfstests.orig/091 xfstests/091 --- xfstests.orig/091 2010-01-03 00:42:16.881617592 -0800 +++ xfstests/091 2010-01-03 00:43:56.331617592 -0800 @@ -40,7 +40,7 @@ trap "rm -f $tmp.*; exit \$status" 0 1 2 _supported_fs xfs _supported_os Linux IRIX -[ $HOSTOS == IRIX ] && _notrun "Not working on IRIX yet" +[ $HOSTOS = IRIX ] && _notrun "Not working on IRIX yet" rm -f $seq.full @@ -66,7 +66,7 @@ kernel=`uname -r | sed -e 's/\(2\..\).* if [ "$HOSTOS" = "Linux" -a "$kernel" = "2.6" ]; then xfs_info $TEST_DIR | _filter_mkfs 2> $tmp.info > /dev/null if [ $? -eq 0 ]; then - source $tmp.info + . $tmp.info bsize=$sectsz fi fi diff -Nrup xfstests.orig/097 xfstests/097 --- xfstests.orig/097 2010-01-03 00:42:16.911617592 -0800 +++ xfstests/097 2010-01-03 00:43:56.331617592 -0800 @@ -49,7 +49,7 @@ _umount_and_mount() { cd / umount $TARGET_DIR - if [ "$FSTYP" == "xfs" ]; then + if [ "$FSTYP" = "xfs" ]; then _test_mount else _scratch_mount @@ -65,7 +65,7 @@ _umount_and_mount() # link correct .out file # This is done bacause udf and xfs print attrs in different orders. rm -rf $seq.out -if [ "$FSTYP" == "xfs" ]; then +if [ "$FSTYP" = "xfs" ]; then ln -s $seq.out.xfs $seq.out else ln -s $seq.out.udf $seq.out @@ -79,7 +79,7 @@ _require_scratch _setup_testdir TARGET_DIR=$SCRATCH_MNT -[ "$FSTYP" == "xfs" ] && TARGET_DIR=$TEST_DIR +[ "$FSTYP" = "xfs" ] && TARGET_DIR=$TEST_DIR cd $TARGET_DIR echo "create file foo" diff -Nrup xfstests.orig/099 xfstests/099 --- xfstests.orig/099 2010-01-03 00:42:16.921617592 -0800 +++ xfstests/099 2010-01-03 00:43:56.331617592 -0800 @@ -40,7 +40,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 1 runas=$here/src/runas TARGET_DIR=$SCRATCH_MNT -[ "$FSTYP" == "xfs" ] && TARGET_DIR=$TEST_DIR +[ "$FSTYP" = "xfs" ] && TARGET_DIR=$TEST_DIR _cleanup() { @@ -331,7 +331,7 @@ _acl_list largeaclfile | _filter_aces_no #------------------------------------------------------- -if [ "$FSTYP" == "udf" ]; then +if [ "$FSTYP" = "udf" ]; then cd / umount $TARGET_DIR # Check the filesystem diff -Nrup xfstests.orig/100 xfstests/100 --- xfstests.orig/100 2010-01-03 00:42:16.921617592 -0800 +++ xfstests/100 2010-01-03 00:43:56.331617592 -0800 @@ -48,7 +48,7 @@ _supported_os IRIX Linux # Use _populate_fs() in common.rc to create a directory structure. TEMP_DIR=/tmp -[ "$FSTYP" == "xfs" ] && TEMP_DIR=$TEST_DIR +[ "$FSTYP" = "xfs" ] && TEMP_DIR=$TEST_DIR TAR_FILE=temp.tar NDIRS=3 NFILES=6 diff -Nrup xfstests.orig/105 xfstests/105 --- xfstests.orig/105 2010-01-03 00:42:16.941617592 -0800 +++ xfstests/105 2010-01-03 00:43:56.331617592 -0800 @@ -79,9 +79,9 @@ echo data > subdir/file ls -l subdir/file | awk '{ print $1, $3 }' # add an ACL with a user ACE which has no exec permission -if [ "$HOSTOS" == "Linux" ]; then +if [ "$HOSTOS" = "Linux" ]; then setfacl -m u:$acl1:r subdir -elif [ "$HOSTOS" == "IRIX" ]; then +elif [ "$HOSTOS" = "IRIX" ]; then chacl u:$acl:r--,g::---,o::--- subdir else echo "Unknown OS!" diff -Nrup xfstests.orig/108 xfstests/108 --- xfstests.orig/108 2010-01-03 00:42:16.961617592 -0800 +++ xfstests/108 2010-01-03 00:43:56.331617592 -0800 @@ -55,11 +55,11 @@ _require_prjquota test_files() { echo; echo "### create files, setting up ownership (type=$type)" - rm -f $SCRATCH_MNT/{buffer,direct,mmap} - $XFS_IO_PROG -fc "chproj $prid" $SCRATCH_MNT/{buffer,direct,mmap} - chown $uid $SCRATCH_MNT/{buffer,direct,mmap} - chgrp $gid $SCRATCH_MNT/{buffer,direct,mmap} - for file in $SCRATCH_MNT/{buffer,direct,mmap}; do + rm -f $SCRATCH_MNT/buffer $SCRATCH_MNT/direct $SCRATCH_MNT/mmap + $XFS_IO_PROG -fc "chproj $prid" $SCRATCH_MNT/buffer $SCRATCH_MNT/direct $SCRATCH_MNT/mmap + chown $uid $SCRATCH_MNT/buffer $SCRATCH_MNT/direct $SCRATCH_MNT/mmap + chgrp $gid $SCRATCH_MNT/buffer $SCRATCH_MNT/direct $SCRATCH_MNT/mmap + for file in $SCRATCH_MNT/buffer $SCRATCH_MNT/direct $SCRATCH_MNT/mmap; do $here/src/lstat64 $file | head -3 | filter_scratch $XFS_IO_PROG -c lsproj $file done @@ -78,7 +78,7 @@ test_accounting() wait echo "--- completed parallel IO ($type)" >>$seq.full - for file in $SCRATCH_MNT/{buffer,direct,mmap}; do + for file in $SCRATCH_MNT/buffer $SCRATCH_MNT/direct $SCRATCH_MNT/mmap; do $here/src/lstat64 $file | head -3 | filter_scratch done xfs_quota -c "quota -hnb -$type $id" $QARGS | filter_scratch diff -Nrup xfstests.orig/109 xfstests/109 --- xfstests.orig/109 2010-01-03 00:42:16.961617592 -0800 +++ xfstests/109 2010-01-03 00:43:56.331617592 -0800 @@ -52,7 +52,7 @@ populate() while [ $i -le $files -a "X$faststart" = "X" ]; do file=$SCRATCH_MNT/f$i xfs_io -f -d -c 'pwrite -b 64k 0 64k' $file >/dev/null - let i=$i+1 + i=$((i + 1)) done # remove every second file, freeing up lots of space @@ -60,7 +60,7 @@ populate() i=1 while [ $i -le $files -a "X$faststart" = "X" ]; do rm $SCRATCH_MNT/f$i - let i=$i+2 + i=$((i + 2)) done echo "flushing changes via umount/mount." @@ -81,10 +81,10 @@ allocate() xfs_io -f -c 'pwrite -b 64k 0 16m' $file \ >/dev/null 2>&1 rm $file - let j=$j+1 + j=$((j + 1)) done } & - let i=$i+1 + i=$((i + 1)) done wait diff -Nrup xfstests.orig/110 xfstests/110 --- xfstests.orig/110 2010-01-03 00:42:16.971617592 -0800 +++ xfstests/110 2010-01-03 00:43:56.331617592 -0800 @@ -66,8 +66,8 @@ E=10030600 while [ $I -le $E ] do echo > $SCRATCH_MNT/test/${STR1}${STR2}${STR3}${I} - let I=$I+1 - [ $[$I % 1000] -eq 0 ] && echo "Created $I/$E" + I=$((I + 1)) + [ `expr $I % 1000` -eq 0 ] && echo "Created $I/$E" done sync @@ -77,7 +77,7 @@ E=10030599 while [ $I -le $E ] do rm $SCRATCH_MNT/test/${STR1}${STR2}${STR3}${I} & - let I=$I+1 + I=$((I + 1)) done _check_scratch_fs diff -Nrup xfstests.orig/111 xfstests/111 --- xfstests.orig/111 2010-01-03 00:42:16.971617592 -0800 +++ xfstests/111 2010-01-03 00:43:56.331617592 -0800 @@ -55,7 +55,7 @@ I=0 while [ $I -lt 1000 ] do cp src/itrash.c $SCRATCH_MNT/${I} - let I=$I+1 + I=$((I + 1)) done umount $SCRATCH_DEV diff -Nrup xfstests.orig/112 xfstests/112 --- xfstests.orig/112 2010-01-03 00:42:16.981617592 -0800 +++ xfstests/112 2010-01-03 00:43:56.331617592 -0800 @@ -161,5 +161,5 @@ _do_test 1 "-A -d -N $numops1 -S 0 -x" _do_test 2 "-A -d -N $numops2 -l $filelen -S 0" _do_test 3 "-A -d -N $numops2 -l $filelen -S 0 -x" -rm -f $seq.*.fsx{good,log} +rm -f $seq.*.fsxgood $seq.*.fsxlog exit 0 diff -Nrup xfstests.orig/113 xfstests/113 --- xfstests.orig/113 2010-01-03 00:42:16.981617592 -0800 +++ xfstests/113 2010-01-03 00:43:56.331617592 -0800 @@ -55,7 +55,7 @@ _do_test() [ $__proc -gt 1 ] && _param="-t $__proc $_param" while [ $__proc -gt 1 ]; do _files="$_files $testdir/aiostress.$$.$_n.$__proc" - let __proc=$__proc-1 + __proc=$((__proc - 1)) done rm -f $_files diff -Nrup xfstests.orig/114 xfstests/114 --- xfstests.orig/114 2010-01-03 00:42:16.991617592 -0800 +++ xfstests/114 2010-01-03 00:43:56.331617592 -0800 @@ -149,8 +149,8 @@ _test_hardlink() paths="$d/l1 $d/l2 $d/l3 $d2/l4 $d2/l5 $d2/l6" i=0 for x in $paths; do - let i=$i+1 - let j=$i%2 + i=$((i + 1)) + j=`expr $i % 2` if [ $j -eq 0 ]; then echo "rm'ing $x" rm $x diff -Nrup xfstests.orig/117 xfstests/117 --- xfstests.orig/117 2010-01-03 00:42:17.001617592 -0800 +++ xfstests/117 2010-01-03 00:43:56.331617592 -0800 @@ -85,7 +85,7 @@ while [ $i -lt $ITERATIONS ]; do -s $seed \ -S -p 1 -n 1000 >>$seq.full 2>&1 - let i=$i+1 + i=$((i + 1)) done cd / diff -Nrup xfstests.orig/118 xfstests/118 --- xfstests.orig/118 2010-01-03 00:42:17.011617592 -0800 +++ xfstests/118 2010-01-03 00:43:56.331617592 -0800 @@ -57,17 +57,17 @@ _require_quota _chowning_file() { file=file.chown - let start=$1 - let limit=$2 - let delta=$3 + start=$1 + limit=$2 + delta=$3 cd $SCRATCH_MNT - let count=$start - while (( count < limit )); do + count=$start + while [ $count -lt $limit ]; do touch $file chown $count.$count $file - echo -n "." - let count=count+delta + printf "." + count=$((count + delta)) done echo "" } diff -Nrup xfstests.orig/119 xfstests/119 --- xfstests.orig/119 2010-01-03 00:42:17.011617592 -0800 +++ xfstests/119 2010-01-03 00:43:56.331617592 -0800 @@ -68,7 +68,7 @@ while [ $i -lt $max ]; do xfs_freeze -f $SCRATCH_MNT xfs_freeze -u $SCRATCH_MNT echo -n . - let i=$i+1 + i=$((i + 1)) done echo "done" diff -Nrup xfstests.orig/122 xfstests/122 --- xfstests.orig/122 2010-01-03 00:42:17.021617592 -0800 +++ xfstests/122 2010-01-03 00:43:56.331617592 -0800 @@ -46,7 +46,7 @@ _require_command /usr/bin/indent _type_size_filter() { # lazy SB adds __be32 agf_btreeblks - pv960372 - if [ "$($MKFS_XFS_PROG 2>&1 | grep -c lazy-count )" == "0" ]; then + if [ "$($MKFS_XFS_PROG 2>&1 | grep -c lazy-count )" = "0" ]; then perl -ne ' s/sizeof\( xfs_agf_t \) = 60/sizeof( xfs_agf_t ) = /; print;' diff -Nrup xfstests.orig/123 xfstests/123 --- xfstests.orig/123 2010-01-03 00:42:17.031617592 -0800 +++ xfstests/123 2010-01-03 00:43:56.331617592 -0800 @@ -58,7 +58,7 @@ s,^\s*$,,; _user_do() { - if [ "$HOSTOS" == "IRIX" ] + if [ "$HOSTOS" = "IRIX" ] then echo $1 | /bin/sh "su $qa_user 2>&1" | _filter_user_do else diff -Nrup xfstests.orig/124 xfstests/124 --- xfstests.orig/124 2010-01-03 00:42:17.031617592 -0800 +++ xfstests/124 2010-01-03 00:43:56.331617592 -0800 @@ -59,21 +59,21 @@ _scratch_mount for TESTFILE in $testdir/rw_pattern.tmp $SCRATCH_MNT/rw_pattern.tmp do count=1 - while (( count < 101 )) + while [ $count -lt 101 ] do src/preallo_rw_pattern_writer $TESTFILE src/preallo_rw_pattern_reader $TESTFILE - if (test $? -ne 0) then + if [ $? -ne 0 ]; then echo Read/Write Pattern Test FAILED. _cleanup exit 1 fi rm $TESTFILE - ((count=count+1)) + count=$((count + 1)) done #done for count of 100 done -if (test $? -eq 0 ) then +if [ $? -eq 0 ]; then status=0 fi diff -Nrup xfstests.orig/134 xfstests/134 --- xfstests.orig/134 2010-01-03 00:42:17.081617592 -0800 +++ xfstests/134 2010-01-03 00:43:56.331617592 -0800 @@ -101,7 +101,7 @@ cp $dir/2 $dir/3 xfs_quota -D $tmp.projects -P $tmp.projid -x -c "repquota -inN -p" $SCRATCH_DEV | tr -s '[:space:]' -if [ "$HOSTOS" == "IRIX" ] ; then +if [ "$HOSTOS" = "IRIX" ] ; then mkfile 1M $TEST_DIR/6 else xfs_mkfile 1M $TEST_DIR/6 diff -Nrup xfstests.orig/136 xfstests/136 --- xfstests.orig/136 2010-01-03 00:42:17.091617592 -0800 +++ xfstests/136 2010-01-03 00:43:56.331617592 -0800 @@ -75,7 +75,7 @@ add_eas() i=$start while [ $i -le $end ]; do attr -s name.$i -V value $file >/dev/null - let i=$i+1 + i=$((i + 1)) done } @@ -87,7 +87,7 @@ rm_eas() i=$start while [ $i -le $end ]; do attr -r name.$i $file >/dev/null - let i=$i+1 + i=$((i + 1)) done } @@ -185,7 +185,7 @@ _test_add_extents() while [ $j -le 30 ]; do do_extents $j _print_inode - let j=$j+2 + j=$((j + 2)) done #scale down @@ -193,7 +193,7 @@ _test_add_extents() while [ $j -ge 1 ]; do do_extents $j _print_inode - let j=$j-2 + j=$((j - 2)) done #build up @@ -201,7 +201,7 @@ _test_add_extents() while [ $j -le 30 ]; do do_extents $j _print_inode - let j=$j+2 + j=$((j + 2)) done } @@ -225,7 +225,7 @@ _test_extents_eas() _print_inode _print_inode_u > $tmp.u1 for j in `seq 1 $EAs_inc $EAs_max`; do - let k=$k+$EAs_inc-1 + k=$((k+ EAs_inc - 1)) add_eas $j $k done # should have same extents @@ -270,7 +270,7 @@ _test_eas_extents() EAs_inc=5 for j in `seq 1 $EAs_inc $EAs_max`; do - let k=$k+$EAs_inc-1 + k=$((k + EAs_inc - 1)) add_eas $j $k echo "--- EAs: $j ---" diff -Nrup xfstests.orig/137 xfstests/137 --- xfstests.orig/137 2010-01-03 00:42:17.101617592 -0800 +++ xfstests/137 2010-01-03 00:43:56.331617592 -0800 @@ -61,7 +61,7 @@ do echo error creating/writing file $file exit fi - let i=$i+1 + i=$((i + 1)) done # give the system a chance to write something out @@ -104,7 +104,7 @@ do rm -f $file fi fi - let i=$i+1 + i=$((i + 1)) done status=0 diff -Nrup xfstests.orig/138 xfstests/138 --- xfstests.orig/138 2010-01-03 00:42:17.101617592 -0800 +++ xfstests/138 2010-01-03 00:43:56.331617592 -0800 @@ -67,7 +67,7 @@ do echo error truncating file $file exit fi - let i=$i+1 + i=$((i + 1)) done # give the system a chance to write something out @@ -110,7 +110,7 @@ do rm -f $file fi fi - let i=$i+1 + i=$((i + 1)) done status=0 diff -Nrup xfstests.orig/139 xfstests/139 --- xfstests.orig/139 2010-01-03 00:42:17.101617592 -0800 +++ xfstests/139 2010-01-03 00:43:56.331617592 -0800 @@ -67,7 +67,7 @@ do echo error truncating file $file exit fi - let i=$i+1 + i=$((i + 1)) done # give the system a chance to write something out @@ -110,7 +110,7 @@ do rm -f $file fi fi - let i=$i+1 + i=$((i + 1)) done status=0 diff -Nrup xfstests.orig/140 xfstests/140 --- xfstests.orig/140 2010-01-03 00:42:17.111617592 -0800 +++ xfstests/140 2010-01-03 00:43:56.331617592 -0800 @@ -67,7 +67,7 @@ do echo error truncating file $file exit fi - let i=$i+1 + i=$((i + 1)) done # give the system a chance to write something out @@ -107,7 +107,7 @@ do rm -f $file fi fi - let i=$i+1 + i=$((i + 1)) done status=0 diff -Nrup xfstests.orig/149 xfstests/149 --- xfstests.orig/149 2010-01-03 00:42:17.151617592 -0800 +++ xfstests/149 2010-01-03 00:43:56.331617592 -0800 @@ -88,7 +88,7 @@ EOF while [ $count -lt $total ] do - let count=$count+1 + count=$((count + 1)) cat >>$tmp.proto </dev/null 2>&1 \ || _fail "mkfs failed!" diff -Nrup xfstests.orig/179 xfstests/179 --- xfstests.orig/179 2010-01-03 00:42:17.291617592 -0800 +++ xfstests/179 2010-01-03 00:43:56.341617592 -0800 @@ -77,7 +77,7 @@ _check_files() else echo file $file missing - fsync failed fi - let i=$i+1 + i=$((i + 1)) done } @@ -92,7 +92,7 @@ do echo error creating/writing file $file exit fi - let i=$i+1 + i=$((i + 1)) done # shutdown immediately after, then remount and test diff -Nrup xfstests.orig/180 xfstests/180 --- xfstests.orig/180 2010-01-03 00:42:17.301617592 -0800 +++ xfstests/180 2010-01-03 00:43:56.341617592 -0800 @@ -82,7 +82,7 @@ _check_files() else echo file $file missing - sync failed fi - let i=$i+1 + i=$((i + 1)) done } @@ -97,7 +97,7 @@ do echo error creating/writing file $file exit fi - let i=$i+1 + i=$((i + 1)) done # sync, then shutdown immediately after, then remount and test diff -Nrup xfstests.orig/182 xfstests/182 --- xfstests.orig/182 2010-01-03 00:42:17.311617592 -0800 +++ xfstests/182 2010-01-03 00:43:56.341617592 -0800 @@ -77,7 +77,7 @@ _check_files() else echo file $file missing - sync failed fi - let i=$i+1 + i=$((i + 1)) done } @@ -92,7 +92,7 @@ do echo error creating/writing file $file exit fi - let i=$i+1 + i=$((i + 1)) done # sync, then shutdown immediately after, then remount and test diff -Nrup xfstests.orig/190 xfstests/190 --- xfstests.orig/190 2010-01-03 00:42:17.341617592 -0800 +++ xfstests/190 2010-01-03 00:43:56.341617592 -0800 @@ -72,21 +72,21 @@ echo Verifying holes are in the correct xfs_bmap=`xfs_bmap $SCRATCH_MNT/$filename` xfs_bmap $SCRATCH_MNT/$filename >> $seq.full for i in $holes ; do - holeStart=$[`echo $i|$SED_PROG 's/:/ /g'|awk '{print $1}'`]; - holeEnd=$[`echo $i|$SED_PROG 's/:/ /g'|awk '{print $2}'`]; + holeStart=`echo $i | $SED_PROG 's/:/ /g' | awk '{print $1}'` + holeEnd=`echo $i | $SED_PROG 's/:/ /g' | awk '{print $2}'` #Round hole size down to a multiple of $fsblocksize - holeEnd=$[(($holeStart+$holeEnd)/$fsblocksize)*$fsblocksize] + holeEnd=`expr \( \( $holeStart + $holeEnd \) / $fsblocksize \) \* $fsblocksize` #Round hole start up to a multiple of $fsblocksize - if [ $[$holeStart % $fsblocksize] -gt 0 ] ; then - holeStart=$[($holeStart/$fsblocksize +1) * $fsblocksize] + if [ `expr $holeStart % $fsblocksize` -gt 0 ] ; then + holeStart=`expr \( $holeStart / $fsblocksize +1 \) \* $fsblocksize` fi #xfs_bmap prints holes in the following format # 1: [8..15]: hole - bmap="\[$[$holeStart/512]..$[($holeEnd/512) -1]\]"; + bmap="\[`expr $holeStart / 512`..`expr \( $holeEnd / 512 \) - 1`\]" echo $bmap >> $seq.full - if [ $holeEnd == $holeStart ] ; then + if [ $holeEnd = $holeStart ] ; then continue #there is no hole fi if ! echo $xfs_bmap|grep -q $bmap; then @@ -94,7 +94,7 @@ for i in $holes ; do status=1; fi done -if [ $status == 0 ] ; then +if [ $status = 0 ] ; then echo Test $seq Passed. fi diff -Nrup xfstests.orig/200 xfstests/200 --- xfstests.orig/200 2010-01-03 00:42:17.391617592 -0800 +++ xfstests/200 2010-01-03 00:43:56.341617592 -0800 @@ -84,7 +84,11 @@ echo "mounting read-write block device:" _scratch_mount 2>&1 | _filter_scratch echo "touch files" -touch $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9} +i=1 +while [ $i -le 100 ]; do + touch $SCRATCH_MNT/$i + i=$((i + 1)) +done echo "going down:" src/godown -f $SCRATCH_MNT diff -Nrup xfstests.orig/203 xfstests/203 --- xfstests.orig/203 2010-01-03 00:42:17.401617592 -0800 +++ xfstests/203 2010-01-03 00:43:56.341617592 -0800 @@ -35,12 +35,12 @@ _write_holes() { file=$1 holes=$2 - let writes=$holes+1 + writes=$((holes + 1)) offset=0 for i in `seq 0 $writes`; do xfs_io -f $file -c "pwrite -q $offset 1" - let offset=$offset+0x100000 + offset=$((offset + 0x100000)) done } diff -Nrup xfstests.orig/205 xfstests/205 --- xfstests.orig/205 2010-01-03 00:42:17.411617592 -0800 +++ xfstests/205 2010-01-03 00:43:56.341617592 -0800 @@ -71,7 +71,7 @@ dd if=/dev/zero of=$SCRATCH_MNT/fred bs= echo "*** one file, a few bytes at a time" # now try a single file of that size -dd if=/dev/zero of=$SCRATCH_MNT/fred bs=15 count=$[26745/15*512] 2>&1 | _filter_dd +dd if=/dev/zero of=$SCRATCH_MNT/fred bs=15 count=`expr 26745 / 15 \* 512` 2>&1 | _filter_dd # success, all done echo "*** done" diff -Nrup xfstests.orig/common xfstests/common --- xfstests.orig/common 2010-01-03 00:42:18.711617592 -0800 +++ xfstests/common 2010-01-03 00:43:56.341617592 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. # @@ -45,7 +44,7 @@ randomize=false rm -f $tmp.list $tmp.tmp $tmp.sed # Autodetect fs type based on what's on $TEST_DEV -if [ "$HOSTOS" == "Linux" ] +if [ "$HOSTOS" = "Linux" ] then export FSTYP=`blkid -s TYPE -o value $TEST_DEV` else diff -Nrup xfstests.orig/common.attr xfstests/common.attr --- xfstests.orig/common.attr 2010-01-03 00:42:18.711617592 -0800 +++ xfstests/common.attr 2010-01-03 00:43:56.341617592 -0800 @@ -77,11 +77,11 @@ _acl_list() # _create_n_aces() { - let n=$1-4 + n=$(($1 - 4)) acl='u::rwx,g::rwx,o::rwx,m::rwx' # 4 ace acl start while [ $n -ne 0 ]; do acl="$acl,u:$n:rwx" - let n=$n-1 + n=$((n - 1)) done echo $acl } diff -Nrup xfstests.orig/common.bonnie xfstests/common.bonnie --- xfstests.orig/common.bonnie 2010-01-03 00:42:18.721617592 -0800 +++ xfstests/common.bonnie 2010-01-03 01:11:24.505239592 -0800 @@ -17,7 +17,7 @@ # #check bonnie is installed -if [ "`whereis bonnie++`" == "bonnie++:"]; then +if [ "`whereis bonnie++`" = "bonnie++:"]; then echo $0 error bonnie not installed. exit fi diff -Nrup xfstests.orig/common.config xfstests/common.config --- xfstests.orig/common.config 2010-01-03 00:42:18.721617592 -0800 +++ xfstests/common.config 2010-01-03 00:43:56.341617592 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2000-2003,2006 Silicon Graphics, Inc. All Rights Reserved. # diff -Nrup xfstests.orig/common.dbench xfstests/common.dbench --- xfstests.orig/common.dbench 2010-01-03 00:42:18.731617592 -0800 +++ xfstests/common.dbench 2010-01-03 00:46:42.621617592 -0800 @@ -17,7 +17,7 @@ # #check dbench is installed -if [ "`whereis dbench`" == "dbench:"]; then +if [ "`whereis dbench`" = "dbench:"]; then echo $0 error dbench not installed. exit fi diff -Nrup xfstests.orig/common.dump xfstests/common.dump --- xfstests.orig/common.dump 2010-01-03 00:42:18.741617592 -0800 +++ xfstests/common.dump 2010-01-03 00:48:10.391617592 -0800 @@ -111,7 +111,7 @@ _check_onl() else sleep 1 fi - let i=$i+1 + i=$((i + 1)) done @@ -149,7 +149,7 @@ _wait_tape() else sleep 1 fi - let i=$i+1 + i=$((i + 1)) done } @@ -208,7 +208,7 @@ _require_tape() { dumptape=$1 - if [ -z "$dumptape" -o "@" == "$dumptape" ]; then + if [ -z "$dumptape" -o "@" = "$dumptape" ]; then echo "This test requires a dump tape - none was specified" echo "No dump tape specified" >$seq.notrun status=$NOTRUNSTS @@ -701,7 +701,7 @@ _create_hardlinks() _hardlink=$_fname$_suffix echo "creating hardlink $_hardlink to $_fname" ln $_fname $_hardlink - let _j=$_j+1 + _j=$((_j + 1)) done } @@ -717,7 +717,7 @@ _create_hardset() _i=1 while [ $_i -le $_numsets ]; do _create_hardlinks file$_i 5 - let _i=$_i+1 + _i=$((_i + 1)) done } @@ -993,7 +993,7 @@ _do_dump_multi_file() while [ $i -lt $multi ] do multi_args="$multi_args -f $dump_file.$i -M $media_label.$i" - let i=$i+1 + i=$((i + 1)) done echo "Dumping to files..." @@ -1113,7 +1113,7 @@ _do_restore_multi_file() while [ $i -lt $multi ] do multi_args="$multi_args -f $dump_file.$i" - let i=$i+1 + i=$((i + 1)) done echo "Restoring from file..." @@ -1384,7 +1384,7 @@ _check_quota_entries() # _check_quota_dumprestore() { - if [ "$HOSTOS" == "IRIX" ]; then + if [ "$HOSTOS" = "IRIX" ]; then _check_quota 'user quota information' \ 'group quota information' \ 'project quota information' | \ diff -Nrup xfstests.orig/common.filestreams xfstests/common.filestreams --- xfstests.orig/common.filestreams 2010-01-03 00:42:18.741617592 -0800 +++ xfstests/common.filestreams 2010-01-03 00:48:38.301617592 -0800 @@ -24,7 +24,7 @@ _check_filestreams_support() local irix_timeout_sysvar="xfs_mfstream_timeout" local linux_timeout_procvar="/proc/sys/fs/xfs/filestream_centisecs" local streams_avail="" - if [ "$HOSTOS" == "IRIX" ]; then + if [ "$HOSTOS" = "IRIX" ]; then # check for the filestreams timeout systune variable in irix streams_avail=`systune $irix_timeout_sysvar 2>&1 | perl -ne 'if (/'$irix_timeout_sysvar'\s+=\s+\d+/) {print "true"}'` @@ -33,7 +33,7 @@ _check_filestreams_support() [ -f $linux_timeout_procvar ] && streams_avail="true" fi - if [ "$streams_avail" == "true" ]; then + if [ "$streams_avail" = "true" ]; then return 0 else return 1 @@ -45,7 +45,7 @@ _set_stream_timeout_centisecs() local new_timeout_csecs=$1 local irix_timeout_sysvar="xfs_mfstream_timeout" local linux_timeout_procvar="/proc/sys/fs/xfs/filestream_centisecs" - if [ "$HOSTOS" == "IRIX" ]; then + if [ "$HOSTOS" = "IRIX" ]; then echo y | systune -r $irix_timeout_sysvar $new_timeout_csecs >/dev/null else echo $new_timeout_csecs > $linux_timeout_procvar @@ -70,7 +70,7 @@ _do_stream() cd $directory_name local dd_cmd="" - if [ "$HOSTOS" == "IRIX" ]; then + if [ "$HOSTOS" = "IRIX" ]; then # for irix use lmdd dd_cmd="lmdd" [ "$dio" = "1" ] && dd_cmd="$dd_cmd odirect=1" @@ -114,7 +114,7 @@ _check_for_dupes() local this_num_two for this_num_one in $num_str_one; do for this_num_two in $num_str_two; do - if [ "$this_num_one" == "$this_num_two" ]; then + if [ "$this_num_one" = "$this_num_two" ]; then echo "duplicate AG $this_num_one found" \ >> $here/$seq.full return 1 @@ -140,7 +140,7 @@ _test_streams() { _scratch_mkfs_xfs -dsize=$size,agcount=$agcount >/dev/null 2>&1 \ || _fail "mkfs failed" - if [ "$use_iflag" = "0" -o "$HOSTOS" == "IRIX" ]; then + if [ "$use_iflag" = "0" -o "$HOSTOS" = "IRIX" ]; then # mount using filestreams mount option _scratch_mount "-o filestreams" \ || _fail "filestreams mount failed" diff -Nrup xfstests.orig/common.log xfstests/common.log --- xfstests.orig/common.log 2010-01-03 00:42:18.751617592 -0800 +++ xfstests/common.log 2010-01-03 01:19:20.602131591 -0800 @@ -314,7 +314,11 @@ _create_log() # generate some log traffic - but not too much - life gets a little # more complicated if the log wraps around. This traffic is # pretty much arbitary, but could probably be made better than this. - touch $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9} + i=1 + while [ $i -le 100 ]; do + touch $SCRATCH_MNT/$i + i=$((i + 1)) + done # unmount the FS _full "umount" @@ -342,9 +346,11 @@ _create_log_sync() # generate some log traffic - but not too much # add some syncs to get the log flushed to disk - for file in $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}; do - touch $file + i=1 + while [ $i -le 100 ]; do + touch $SCRATCH_MNT/$i sync + i=$((i + 1)) done # unmount the FS diff -Nrup xfstests.orig/common.punch xfstests/common.punch --- xfstests.orig/common.punch 2010-01-03 00:42:18.761617592 -0800 +++ xfstests/common.punch 2010-01-03 00:49:22.511617592 -0800 @@ -40,7 +40,7 @@ _spawn_test_file() { -c "extsize" \ $test_file - if [ "$reserve_space" == "noresv" ]; then + if [ "$reserve_space" = "noresv" ]; then echo "+ not using resvsp at file creation" $XFS_IO_PROG -f \ -c "truncate $file_size" \ @@ -62,13 +62,13 @@ _do_punch() { local punch_type=$4 # u for unresvsp, d for dm_punch local test_file=$5 - if [ "$punch_type" == "u" ]; then + if [ "$punch_type" = "u" ]; then echo "+ hole punch using unresvsp" $XFS_IO_PROG -f \ -c "unresvsp $punch_offset $punch_size" \ $test_file fi - if [ "$punch_type" == "d" ]; then + if [ "$punch_type" = "d" ]; then echo "+ hole punch using dmapi punch_hole" ${DMAPI_QASUITE1_DIR}cmd/punch_hole -o $punch_offset -l $punch_size \ ${SCRATCH_MNT}/$test_file @@ -123,7 +123,7 @@ _test_punch() { local this_punch_type="" local dmap_punch_used=0 for this_punch_type in "${punch_types[@]}"; do - [ "$this_punch_type" == "d" ] && dmap_punch_used=1 + [ "$this_punch_type" = "d" ] && dmap_punch_used=1 done if [ $dmap_punch_used -ne 0 ]; then # a punch type of dm_punch has been specified, do a dmapi mount @@ -161,13 +161,13 @@ _test_punch() { local punch_index=0 local write_index=0 for operation in "${punch_write_order[@]}"; do - if [ "$operation" == "p" ]; then + if [ "$operation" = "p" ]; then _do_punch $blksize ${punch_points_blks[$punch_index]} \ ${punch_sizes_blks[$punch_index]} ${punch_types[$punch_index]} \ $filename punch_index=`expr $punch_index + 1` fi - if [ "$operation" == "w" ]; then + if [ "$operation" = "w" ]; then _do_write $blksize ${write_points_blks[$write_index]} \ ${write_sizes_blks[$write_index]} $filename write_index=`expr $write_index + 1` diff -Nrup xfstests.orig/common.quota xfstests/common.quota --- xfstests.orig/common.quota 2010-01-03 00:42:18.771617592 -0800 +++ xfstests/common.quota 2010-01-03 00:49:41.321617592 -0800 @@ -104,7 +104,7 @@ _choose_gid() _choose_prid() { - if [ "X$projid_file" == "X" ]; then + if [ "X$projid_file" = "X" ]; then projid_file=/etc/projid fi if [ ! -f $projid_file ]; then diff -Nrup xfstests.orig/common.rc xfstests/common.rc --- xfstests.orig/common.rc 2010-01-03 00:42:18.771617592 -0800 +++ xfstests/common.rc 2010-01-03 00:50:11.001617592 -0800 @@ -1,4 +1,3 @@ -##/bin/sh #----------------------------------------------------------------------- # Copyright (c) 2000-2006 Silicon Graphics, Inc. All Rights Reserved. # This program is free software; you can redistribute it and/or modify @@ -22,7 +21,7 @@ dd() { - if [ "$HOSTOS" == "Linux" ] + if [ "$HOSTOS" = "Linux" ] then command dd --help | grep noxfer > /dev/null 2>&1 @@ -170,7 +169,7 @@ _mount_ops_filter() params="$*" #get mount point to handle dmapi mtpt option correctly - let last_index=$#-1 + last_index=$(($# - 1)) [ $last_index -gt 0 ] && shift $last_index FS_ESCAPED=$1 @@ -701,7 +700,7 @@ _require_user() { qa_user=fsgqa cat /etc/passwd | grep -q $qa_user - [ "$?" == "0" ] || _notrun "$qa_user user not defined." + [ "$?" = "0" ] || _notrun "$qa_user user not defined." } # check that xfs_io, glibc, kernel, and filesystem all (!) support @@ -964,7 +963,7 @@ _udf_test_known_error_filter() _check_udf_filesystem() { - [ "$DISABLE_UDF_TEST" == "1" ] && return + [ "$DISABLE_UDF_TEST" = "1" ] && return if [ $# -ne 1 -a $# -ne 2 ] then @@ -1193,9 +1192,9 @@ _link_out_file() exit fi rm -f $1 - if [ "`uname`" == "IRIX64" ] || [ "`uname`" == "IRIX" ]; then + if [ "`uname`" = "IRIX64" ] || [ "`uname`" = "IRIX" ]; then ln -s $1.irix $1 - elif [ "`uname`" == "Linux" ]; then + elif [ "`uname`" = "Linux" ]; then ln -s $1.linux $1 else echo Error test $seq does not run on the operating system: `uname` @@ -1219,7 +1218,7 @@ _nfiles() if [ $size -gt 0 ]; then dd if=/dev/zero of=$file bs=1024 count=$size fi - let f=$f+1 + f=$((f + 1)) done } @@ -1233,7 +1232,7 @@ _descend() _nfiles $files # files for this dir [ $depth -eq 0 ] && return - let deep=$depth-1 # go 1 down + deep=$((depth - 1)) # go 1 down [ $verbose = true ] && echo "descending, depth from leaves = $deep" @@ -1241,7 +1240,7 @@ _descend() while [ $d -lt $dirs ] do _descend d$d $deep & - let d=$d+1 + d=$((d + 1)) wait done } -- BOFH excuse #134: because of network lag due to too many people playing deathmatch From andi@firstfloor.org Sun Jan 3 10:55:50 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o03GtoKX242308 for ; Sun, 3 Jan 2010 10:55:50 -0600 X-ASG-Debug-ID: 1262537799-4e6900700000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from one.firstfloor.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5A3441DACD2E for ; Sun, 3 Jan 2010 08:56:39 -0800 (PST) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id NclffNPM5TUbtqig for ; Sun, 03 Jan 2010 08:56:39 -0800 (PST) Received: from basil.firstfloor.org (p5B3CAA53.dip0.t-ipconnect.de [91.60.170.83]) by one.firstfloor.org (Postfix) with ESMTP id E68171A98018; Sun, 3 Jan 2010 17:56:34 +0100 (CET) Received: by basil.firstfloor.org (Postfix, from userid 1000) id C0DB4B17C2; Sun, 3 Jan 2010 17:56:33 +0100 (CET) To: Christian Kujau Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] remove bashisms from xfstests Subject: Re: [PATCH] remove bashisms from xfstests From: Andi Kleen References: Date: Sun, 03 Jan 2010 17:56:33 +0100 In-Reply-To: (Christian Kujau's message of "Sun, 3 Jan 2010 02:30:05 -0800 (PST)") Message-ID: <87vdfjceke.fsf@basil.nowhere.org> User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1262537800 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18859 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christian Kujau writes: > > Thoughts? The usual much easier and less riskier change is to just change the first line in each script to #!/bin/bash -Andi -- ak@linux.intel.com -- Speaking for myself only. From mw@dermichi.com Sun Jan 3 11:05:35 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o03H5Z3C243415 for ; Sun, 3 Jan 2010 11:05:35 -0600 X-ASG-Debug-ID: 1262538384-4e6900eb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from firestarter.dermichi.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6A99E1DACCC9 for ; Sun, 3 Jan 2010 09:06:24 -0800 (PST) Received: from firestarter.dermichi.com (firestarter.dermichi.com [78.41.115.230]) by cuda.sgi.com with ESMTP id Q75PBsB0F52cmuUk for ; Sun, 03 Jan 2010 09:06:24 -0800 (PST) Received: from [2001:15c0:6679:1:218:8bff:feb1:c9e8] by firestarter.dermichi.com with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1NRTuG-0002JG-W9; Sun, 03 Jan 2010 18:06:21 +0100 Message-ID: <4B40CE8A.3070105@dermichi.com> Date: Sun, 03 Jan 2010 18:06:18 +0100 From: Michael Weissenbacher User-Agent: Thunderbird 2.0.0.23 (Windows/20090812) MIME-Version: 1.0 To: Andi Kleen CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] remove bashisms from xfstests Subject: Re: [PATCH] remove bashisms from xfstests References: <87vdfjceke.fsf@basil.nowhere.org> In-Reply-To: <87vdfjceke.fsf@basil.nowhere.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: firestarter.dermichi.com[78.41.115.230] X-Barracuda-Start-Time: 1262538385 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18859 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean >> Thoughts? > > The usual much easier and less riskier change is to just change the > first line in each script to #!/bin/bash > Seconded, since there shouldn't be any linux distro around without /bin/bash installed. (just IMHO of course) From lists@nerdbynature.de Mon Jan 4 01:26:30 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,LOCAL_GNU_PATCH autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o047QTQd079672 for ; Mon, 4 Jan 2010 01:26:30 -0600 X-ASG-Debug-ID: 1262590037-5b0c02210000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from moutng.kundenserver.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 311B31505920 for ; Sun, 3 Jan 2010 23:27:18 -0800 (PST) Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.187]) by cuda.sgi.com with ESMTP id XVtbCwMI76DSLyv0 for ; Sun, 03 Jan 2010 23:27:18 -0800 (PST) Received: from bogon.housecafe.de (ppp-93-104-176-88.dynamic.mnet-online.de [93.104.176.88]) by mrelayeu.kundenserver.de (node=mreu0) with ESMTP (Nemesis) id 0MPKo0-1NW53a1oYK-004sAL; Mon, 04 Jan 2010 08:27:14 +0100 Received: from localhost ([127.0.0.1]) by bogon.housecafe.de with esmtp (Exim 4.69) (envelope-from ) id 1NRhLN-00024Z-Oq; Mon, 04 Jan 2010 08:27:13 +0100 Date: Sun, 3 Jan 2010 23:27:13 -0800 (PST) From: Christian Kujau To: Andi Kleen cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] remove bashisms from xfstests Subject: Re: [PATCH] remove bashisms from xfstests In-Reply-To: <87vdfjceke.fsf@basil.nowhere.org> Message-ID: References: <87vdfjceke.fsf@basil.nowhere.org> User-Agent: Alpine 2.01 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Provags-ID: V01U2FsdGVkX1+OzIeIXnQOb/Q2BVUXrRI1fGXjamh9hSuOHZX EWP3Usl+HziD9pzyN35YU+A8a89F4ZtHwc2YXNzHiNB8nEpw2z toADnVUG94Ju/BDbHwTGQ== X-Barracuda-Connect: moutng.kundenserver.de[212.227.126.187] X-Barracuda-Start-Time: 1262590039 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18911 Rule breakdown below pts rule 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, 3 Jan 2010 at 17:56, Andi Kleen wrote: > The usual much easier and less riskier change is to just change the > first line in each script to #!/bin/bash Hm, but it's less fun that way :-) OK, here's one with only changing /bin/sh to /bin/bash, for all scripts carrying bashisms according to checkbashisms(1). With this patch applied, I can now run xfstests w/o changing my /bin/sh to something else. Thanks, Christian. Signed-off-by: Christian Kujau diff -Nrup xfstests.orig/005 xfstests/005 --- xfstests.orig/005 2010-01-03 23:03:27.977265001 -0800 +++ xfstests/005 2010-01-03 22:19:34.825575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 005 # # Test symlinks & ELOOP diff -Nrup xfstests.orig/007 xfstests/007 --- xfstests.orig/007 2010-01-03 23:03:27.987270001 -0800 +++ xfstests/007 2010-01-03 22:21:42.535575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 007 # # drive the src/nametest program diff -Nrup xfstests.orig/010 xfstests/010 --- xfstests.orig/010 2010-01-03 23:03:28.017285001 -0800 +++ xfstests/010 2010-01-03 22:28:35.308153000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 010 # # dbtest diff -Nrup xfstests.orig/016 xfstests/016 --- xfstests.orig/016 2010-01-03 23:03:28.067310001 -0800 +++ xfstests/016 2010-01-03 22:21:32.755575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 016 # # test end of log overwrite bug #796141 diff -Nrup xfstests.orig/020 xfstests/020 --- xfstests.orig/020 2010-01-03 23:03:28.097325001 -0800 +++ xfstests/020 2010-01-03 22:51:21.338153000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 020 # # extended attributes diff -Nrup xfstests.orig/028 xfstests/028 --- xfstests.orig/028 2010-01-03 23:03:28.157355001 -0800 +++ xfstests/028 2010-01-03 22:51:29.958153000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 028 # # To test out xfsinvutil diff -Nrup xfstests.orig/031 xfstests/031 --- xfstests.orig/031 2010-01-03 23:03:28.187370001 -0800 +++ xfstests/031 2010-01-03 22:51:43.908153000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 031 # # exercise xfs_repair - ensure repeated use doesn't corrupt diff -Nrup xfstests.orig/043 xfstests/043 --- xfstests.orig/043 2010-01-03 23:03:28.277415001 -0800 +++ xfstests/043 2010-01-03 22:23:42.965575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 043 # # Test out xfsdump/restore but rmv inventory prior to restore. diff -Nrup xfstests.orig/044 xfstests/044 --- xfstests.orig/044 2010-01-03 23:03:28.287420001 -0800 +++ xfstests/044 2010-01-03 22:51:53.128153000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 044 # # external log uuid/format tests (TODO - version 2 log format) diff -Nrup xfstests.orig/047 xfstests/047 --- xfstests.orig/047 2010-01-03 23:03:28.317435001 -0800 +++ xfstests/047 2010-01-03 22:52:06.758153000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 047 # # invutil with interactive responses diff -Nrup xfstests.orig/050 xfstests/050 --- xfstests.orig/050 2010-01-03 23:03:28.337445001 -0800 +++ xfstests/050 2010-01-03 22:52:13.168153000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 050 # # Exercises basic XFS quota functionality diff -Nrup xfstests.orig/051 xfstests/051 --- xfstests.orig/051 2010-01-03 23:03:28.347450001 -0800 +++ xfstests/051 2010-01-03 22:21:07.435575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 051 # # Test out ACLs. diff -Nrup xfstests.orig/053 xfstests/053 --- xfstests.orig/053 2010-01-03 23:03:28.367460001 -0800 +++ xfstests/053 2010-01-03 22:19:28.225575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 053 # # xfs_repair breaks acls diff -Nrup xfstests.orig/064 xfstests/064 --- xfstests.orig/064 2010-01-03 23:03:28.457505001 -0800 +++ xfstests/064 2010-01-03 22:18:56.425575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 064 # # test multilevel dump and restores with hardlinks diff -Nrup xfstests.orig/065 xfstests/065 --- xfstests.orig/065 2010-01-03 23:03:28.457505001 -0800 +++ xfstests/065 2010-01-03 22:20:08.665575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 065 # # Testing incremental dumps and cumulative restores with diff -Nrup xfstests.orig/067 xfstests/067 --- xfstests.orig/067 2010-01-03 23:03:28.477515001 -0800 +++ xfstests/067 2010-01-03 22:27:51.538325001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 067 # # Test out acl/dacls which fit in shortform in the inode diff -Nrup xfstests.orig/068 xfstests/068 --- xfstests.orig/068 2010-01-03 23:03:28.487520001 -0800 +++ xfstests/068 2010-01-03 22:52:31.798153000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FSQA Test No. 068 # # Test case to reproduce xfs_freeze hang under filsystem load. diff -Nrup xfstests.orig/071 xfstests/071 --- xfstests.orig/071 2010-01-03 23:03:28.507530001 -0800 +++ xfstests/071 2010-01-03 22:52:39.198153000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 071 # # Exercise IO at large file offsets. diff -Nrup xfstests.orig/074 xfstests/074 --- xfstests.orig/074 2010-01-03 23:03:28.537545001 -0800 +++ xfstests/074 2010-01-03 22:52:48.748153000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 074 # # fstest diff -Nrup xfstests.orig/075 xfstests/075 --- xfstests.orig/075 2010-01-03 23:03:28.547550001 -0800 +++ xfstests/075 2010-01-03 22:19:23.145575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 075 # # fsx (non-AIO variant) diff -Nrup xfstests.orig/076 xfstests/076 --- xfstests.orig/076 2010-01-03 23:03:28.547550001 -0800 +++ xfstests/076 2010-01-03 22:53:01.758153000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 076 # # Test blockdev reads in parallel with filesystem reads/writes diff -Nrup xfstests.orig/084 xfstests/084 --- xfstests.orig/084 2010-01-03 23:03:28.617585001 -0800 +++ xfstests/084 2010-01-03 22:19:08.795575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 084 # # Exercises unwritten extent reads and writes, looking diff -Nrup xfstests.orig/085 xfstests/085 --- xfstests.orig/085 2010-01-03 23:03:28.627590001 -0800 +++ xfstests/085 2010-01-03 22:53:11.388153000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 085 # # To test log replay by shutdown of file system diff -Nrup xfstests.orig/086 xfstests/086 --- xfstests.orig/086 2010-01-03 23:03:28.627590001 -0800 +++ xfstests/086 2010-01-03 22:19:45.175575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 086 # # To test log replay with version 2 logs diff -Nrup xfstests.orig/089 xfstests/089 --- xfstests.orig/089 2010-01-03 23:03:28.657605001 -0800 +++ xfstests/089 2010-01-03 22:53:23.799048001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 089 # # Emulate the way Linux mount manipulates /etc/mtab to attempt to diff -Nrup xfstests.orig/091 xfstests/091 --- xfstests.orig/091 2010-01-03 23:03:28.677615001 -0800 +++ xfstests/091 2010-01-03 22:53:32.133213001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 091 # # fsx exercising direct IO -- sub-block sizes and concurrent buffered IO diff -Nrup xfstests.orig/097 xfstests/097 --- xfstests.orig/097 2010-01-03 23:03:28.717635001 -0800 +++ xfstests/097 2010-01-03 22:19:53.435575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 097. Modifed from UDFQA test 033. # # simple attr tests for EAs: diff -Nrup xfstests.orig/099 xfstests/099 --- xfstests.orig/099 2010-01-03 23:03:28.737645001 -0800 +++ xfstests/099 2010-01-03 22:23:16.295575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 099. Modified from UDFQA test 036. # # ACL test diff -Nrup xfstests.orig/100 xfstests/100 --- xfstests.orig/100 2010-01-03 23:03:28.747650001 -0800 +++ xfstests/100 2010-01-03 22:53:50.292288001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 100. Modified from UDF QA test 030. # # Test whether a tarred directory structure can be untarred onto diff -Nrup xfstests.orig/105 xfstests/105 --- xfstests.orig/105 2010-01-03 23:03:28.787670001 -0800 +++ xfstests/105 2010-01-03 22:53:58.046163001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 105 # # Test fix of bug: diff -Nrup xfstests.orig/108 xfstests/108 --- xfstests.orig/108 2010-01-03 23:03:28.807680001 -0800 +++ xfstests/108 2010-01-03 22:54:07.030653001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 108 # # Simple quota accounting test for direct/buffered/mmap IO. diff -Nrup xfstests.orig/109 xfstests/109 --- xfstests.orig/109 2010-01-03 23:03:28.817685001 -0800 +++ xfstests/109 2010-01-03 22:54:15.604938001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 109 # # ENOSPC deadlock case from Asano Masahiro. diff -Nrup xfstests.orig/110 xfstests/110 --- xfstests.orig/110 2010-01-03 23:03:28.827690001 -0800 +++ xfstests/110 2010-01-03 22:21:15.615575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 110 # # Incorrect dir2 freetab warning case from Masanori Tsuda. diff -Nrup xfstests.orig/111 xfstests/111 --- xfstests.orig/111 2010-01-03 23:03:28.837695001 -0800 +++ xfstests/111 2010-01-03 22:20:59.015575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 111 # # Infinite xfs_bulkstat bad-inode loop case from Roger Willcocks. diff -Nrup xfstests.orig/112 xfstests/112 --- xfstests.orig/112 2010-01-03 23:03:28.847700001 -0800 +++ xfstests/112 2010-01-03 22:21:38.345575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 112 # # fsx (AIO variant, based on 075) diff -Nrup xfstests.orig/113 xfstests/113 --- xfstests.orig/113 2010-01-03 23:03:28.847700001 -0800 +++ xfstests/113 2010-01-03 22:54:30.972618001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 113 # # aio-stress diff -Nrup xfstests.orig/114 xfstests/114 --- xfstests.orig/114 2010-01-03 23:03:28.857705001 -0800 +++ xfstests/114 2010-01-03 22:54:38.706483001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 114 # # Test some parent ptr stuff diff -Nrup xfstests.orig/117 xfstests/117 --- xfstests.orig/117 2010-01-03 23:03:28.887720001 -0800 +++ xfstests/117 2010-01-03 22:54:46.380318001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 117 # # Attempt to cause filesystem corruption with serial fsstresses doing diff -Nrup xfstests.orig/118 xfstests/118 --- xfstests.orig/118 2010-01-03 23:03:28.897725001 -0800 +++ xfstests/118 2010-01-03 22:54:54.974613001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 118 # # To test out pv#940675 crash in xfs_trans_brelse + quotas diff -Nrup xfstests.orig/119 xfstests/119 --- xfstests.orig/119 2010-01-03 23:03:28.907730001 -0800 +++ xfstests/119 2010-01-03 22:55:05.629938001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 119 # # Leaking reservation space in the GRH diff -Nrup xfstests.orig/122 xfstests/122 --- xfstests.orig/122 2010-01-03 23:03:28.927740001 -0800 +++ xfstests/122 2010-01-03 22:55:29.822028001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 122 # # pv#952498 diff -Nrup xfstests.orig/123 xfstests/123 --- xfstests.orig/123 2010-01-03 23:03:28.937745001 -0800 +++ xfstests/123 2010-01-03 22:55:42.188208001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FSQA Test No. 123 # # Make sure user cannot overwrite, append, delete or move a file created by diff -Nrup xfstests.orig/124 xfstests/124 --- xfstests.orig/124 2010-01-03 23:03:28.947750001 -0800 +++ xfstests/124 2010-01-03 22:55:47.270748001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FSQA Test No. 124 # # Test preallocated_rw_pattern_test modified from CXFSQA test preallocated_rw_pattern_test diff -Nrup xfstests.orig/134 xfstests/134 --- xfstests.orig/134 2010-01-03 23:03:29.027790001 -0800 +++ xfstests/134 2010-01-03 22:55:56.015118001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 134 # # test to reproduce PV951636: diff -Nrup xfstests.orig/136 xfstests/136 --- xfstests.orig/136 2010-01-03 23:03:29.037795001 -0800 +++ xfstests/136 2010-01-03 22:56:06.480348001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 136 # # Test the attr2 code diff -Nrup xfstests.orig/137 xfstests/137 --- xfstests.orig/137 2010-01-03 23:03:29.047800001 -0800 +++ xfstests/137 2010-01-03 22:20:52.045575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FSQA Test No. 137 # # Test for NULL files problem diff -Nrup xfstests.orig/138 xfstests/138 --- xfstests.orig/138 2010-01-03 23:03:29.057805001 -0800 +++ xfstests/138 2010-01-03 22:23:54.535575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FSQA Test No. 138 # # Test for NULL files problem diff -Nrup xfstests.orig/139 xfstests/139 --- xfstests.orig/139 2010-01-03 23:03:29.067810001 -0800 +++ xfstests/139 2010-01-03 22:23:48.345575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FSQA Test No. 139 # # Test for NULL files problem diff -Nrup xfstests.orig/140 xfstests/140 --- xfstests.orig/140 2010-01-03 23:03:29.077815001 -0800 +++ xfstests/140 2010-01-03 22:56:17.856033001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FSQA Test No. 140 # # Test for NULL files problem diff -Nrup xfstests.orig/149 xfstests/149 --- xfstests.orig/149 2010-01-03 23:03:29.147850001 -0800 +++ xfstests/149 2010-01-03 22:56:33.453828001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 149 # # Exercise xfs_prepair - ensure repeated use doesn't corrupt diff -Nrup xfstests.orig/158 xfstests/158 --- xfstests.orig/158 2010-01-03 23:03:29.217885001 -0800 +++ xfstests/158 2010-01-03 22:56:45.079638001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FSQA Test No. 158 # # get/set file attributes diff -Nrup xfstests.orig/165 xfstests/165 --- xfstests.orig/165 2010-01-03 23:03:29.277915001 -0800 +++ xfstests/165 2010-01-03 22:56:54.704448001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 165 # # Test out prealloc, direct writes and buffered read diff -Nrup xfstests.orig/178 xfstests/178 --- xfstests.orig/178 2010-01-03 23:03:29.387970001 -0800 +++ xfstests/178 2010-01-03 22:19:15.625575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 178 # # Reproduce PV#:967665 diff -Nrup xfstests.orig/179 xfstests/179 --- xfstests.orig/179 2010-01-03 23:03:29.397975001 -0800 +++ xfstests/179 2010-01-03 22:21:22.735575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FSQA Test No. 179 # # Test for NULL files problem diff -Nrup xfstests.orig/180 xfstests/180 --- xfstests.orig/180 2010-01-03 23:03:29.397975001 -0800 +++ xfstests/180 2010-01-03 22:57:06.130158001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FSQA Test No. 180 # # Test for NULL files problem diff -Nrup xfstests.orig/182 xfstests/182 --- xfstests.orig/182 2010-01-03 23:03:29.417985001 -0800 +++ xfstests/182 2010-01-03 22:20:02.055575000 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FSQA Test No. 182 # # Test for NULL files problem diff -Nrup xfstests.orig/190 xfstests/190 --- xfstests.orig/190 2010-01-03 23:03:29.478015001 -0800 +++ xfstests/190 2010-01-03 22:57:13.493838001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FSQA Test No. 190 # # This test uses xfs_io to unreserve space in a file at various different diff -Nrup xfstests.orig/200 xfstests/200 --- xfstests.orig/200 2010-01-03 23:03:29.568060001 -0800 +++ xfstests/200 2010-01-03 22:57:22.268223001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 200 # # Check out various mount/remount/unmount scenarious on a read-only blockdev. diff -Nrup xfstests.orig/203 xfstests/203 --- xfstests.orig/203 2010-01-03 23:03:29.588070001 -0800 +++ xfstests/203 2010-01-03 22:57:30.112143001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 203 # # Test out reallocation of the extent array in xfs_io. diff -Nrup xfstests.orig/205 xfstests/205 --- xfstests.orig/205 2010-01-03 23:03:29.608080001 -0800 +++ xfstests/205 2010-01-03 22:57:36.685428001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 205 # # Test out ENOSPC flushing on small filesystems. diff -Nrup xfstests.orig/213 xfstests/213 --- xfstests.orig/213 2010-01-03 23:03:29.678115001 -0800 +++ xfstests/213 2010-01-03 22:57:46.330248001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 213 # # Check some unwritten extent boundary conditions, fallocate version. diff -Nrup xfstests.orig/215 xfstests/215 --- xfstests.orig/215 2010-01-03 23:03:29.688120001 -0800 +++ xfstests/215 2010-01-03 22:57:52.063113001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 215 # # Test out c/mtime updates after mapped writes. diff -Nrup xfstests.orig/218 xfstests/218 --- xfstests.orig/218 2010-01-03 23:03:29.718135001 -0800 +++ xfstests/218 2010-01-03 22:58:00.757458001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 218 # # Basic defragmentation sanity tests diff -Nrup xfstests.orig/219 xfstests/219 --- xfstests.orig/219 2010-01-03 23:03:29.718135001 -0800 +++ xfstests/219 2010-01-03 22:58:09.541848001 -0800 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash # FS QA Test No. 219 # # Simple quota accounting test for direct/buffered/mmap IO. diff -Nrup xfstests.orig/check xfstests/check --- xfstests.orig/check 2010-01-03 23:03:27.917235001 -0800 +++ xfstests/check 2010-01-03 23:19:32.149110001 -0800 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # # Control script for QA # -- BOFH excuse #36: dynamic software linking table corrupted From lists@nerdbynature.de Mon Jan 4 01:55:59 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,LOCAL_GNU_PATCH autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o047txhX082334 for ; Mon, 4 Jan 2010 01:55:59 -0600 X-ASG-Debug-ID: 1262591808-604500cd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from moutng.kundenserver.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 565B11C27FB3 for ; Sun, 3 Jan 2010 23:56:48 -0800 (PST) Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.171]) by cuda.sgi.com with ESMTP id Q2AcpCjZFvNWVt6S for ; Sun, 03 Jan 2010 23:56:48 -0800 (PST) Received: from bogon.housecafe.de (ppp-93-104-176-88.dynamic.mnet-online.de [93.104.176.88]) by mrelayeu.kundenserver.de (node=mreu2) with ESMTP (Nemesis) id 0LbNoU-1OCL5D3vvG-00kwtz; Mon, 04 Jan 2010 08:56:47 +0100 Received: from localhost ([127.0.0.1]) by bogon.housecafe.de with esmtp (Exim 4.69) (envelope-from ) id 1NRhnx-0002kZ-Di; Mon, 04 Jan 2010 08:56:45 +0100 Date: Sun, 3 Jan 2010 23:56:45 -0800 (PST) From: Christian Kujau To: Andi Kleen cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] remove bashisms from xfstests Subject: Re: [PATCH] remove bashisms from xfstests In-Reply-To: Message-ID: References: <87vdfjceke.fsf@basil.nowhere.org> User-Agent: Alpine 2.01 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Provags-ID: V01U2FsdGVkX1+8T4K4tUrY9oZo3AHrVAOEOq7VJqcQSp2/Bdb cEpWv0sCMbVOrt03Jn0EDnEk8F/6zxv9FTzjkCkoR4WJqv9V/H 23lYXPmNRIAox9vgPhm8Q== X-Barracuda-Connect: moutng.kundenserver.de[212.227.126.171] X-Barracuda-Start-Time: 1262591809 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18914 Rule breakdown below pts rule 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, 3 Jan 2010 at 23:27, Christian Kujau wrote: > OK, here's one with only changing /bin/sh to /bin/bash, for all scripts > carrying bashisms according to checkbashisms(1). With this patch applied, > I can now run xfstests w/o changing my /bin/sh to something else. Well, almost - I'm still getting errors, because some of the scripts are not executed but sourced. Although the ./check script is /bin/bash now, the sourced scripts seem to get executed via /bin/sh, at least that's what I've experienced. Here's an additional patch, changing only the common.* scripts, for they are being sourced. Right now xfstests is running test 013 and no errors so far. Christian. Signed-off-by: Christian Kujau diff -Nrup xfstests.orig/common xfstests/common --- xfstests.orig/common 2010-01-03 23:03:32.029290001 -0800 +++ xfstests/common 2010-01-03 23:36:04.722433002 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. # @@ -45,7 +44,7 @@ randomize=false rm -f $tmp.list $tmp.tmp $tmp.sed # Autodetect fs type based on what's on $TEST_DEV -if [ "$HOSTOS" == "Linux" ] +if [ "$HOSTOS" = "Linux" ] then export FSTYP=`blkid -s TYPE -o value $TEST_DEV` else diff -Nrup xfstests.orig/common.attr xfstests/common.attr --- xfstests.orig/common.attr 2010-01-03 23:03:32.039295001 -0800 +++ xfstests/common.attr 2010-01-03 23:36:27.602433002 -0800 @@ -1,4 +1,3 @@ -##/bin/sh #----------------------------------------------------------------------- # Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. # This program is free software; you can redistribute it and/or modify @@ -77,11 +76,11 @@ _acl_list() # _create_n_aces() { - let n=$1-4 + n=$(($1 - 4)) acl='u::rwx,g::rwx,o::rwx,m::rwx' # 4 ace acl start while [ $n -ne 0 ]; do acl="$acl,u:$n:rwx" - let n=$n-1 + n=$((n - 1)) done echo $acl } diff -Nrup xfstests.orig/common.bonnie xfstests/common.bonnie --- xfstests.orig/common.bonnie 2010-01-03 23:03:32.049300001 -0800 +++ xfstests/common.bonnie 2010-01-03 23:36:48.682433002 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2002-2004 Silicon Graphics, Inc. All Rights Reserved. # @@ -17,7 +16,7 @@ # #check bonnie is installed -if [ "`whereis bonnie++`" == "bonnie++:"]; then +if [ "`whereis bonnie++`" = "bonnie++:"]; then echo $0 error bonnie not installed. exit fi diff -Nrup xfstests.orig/common.config xfstests/common.config --- xfstests.orig/common.config 2010-01-03 23:03:32.059305001 -0800 +++ xfstests/common.config 2010-01-03 23:33:46.432433002 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2000-2003,2006 Silicon Graphics, Inc. All Rights Reserved. # diff -Nrup xfstests.orig/common.dbench xfstests/common.dbench --- xfstests.orig/common.dbench 2010-01-03 23:03:32.059305001 -0800 +++ xfstests/common.dbench 2010-01-03 23:37:14.602433002 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2002-2005 Silicon Graphics, Inc. All Rights Reserved. # @@ -17,7 +16,7 @@ # #check dbench is installed -if [ "`whereis dbench`" == "dbench:"]; then +if [ "`whereis dbench`" = "dbench:"]; then echo $0 error dbench not installed. exit fi diff -Nrup xfstests.orig/common.defrag xfstests/common.defrag --- xfstests.orig/common.defrag 2010-01-03 23:03:32.079315001 -0800 +++ xfstests/common.defrag 2010-01-03 23:33:49.662433002 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2009 Eric Sandeen # All Rights Reserved. diff -Nrup xfstests.orig/common.dmapi xfstests/common.dmapi --- xfstests.orig/common.dmapi 2010-01-03 23:03:32.079315001 -0800 +++ xfstests/common.dmapi 2010-01-03 23:33:51.212433002 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2006 Silicon Graphics, Inc. All Rights Reserved. # diff -Nrup xfstests.orig/common.dump xfstests/common.dump --- xfstests.orig/common.dump 2010-01-03 23:03:32.099325001 -0800 +++ xfstests/common.dump 2010-01-03 23:38:42.102433002 -0800 @@ -1,4 +1,3 @@ -#/bin/sh # # Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. All Rights Reserved. # @@ -111,7 +110,7 @@ _check_onl() else sleep 1 fi - let i=$i+1 + i=$((i + 1)) done @@ -149,7 +148,7 @@ _wait_tape() else sleep 1 fi - let i=$i+1 + i=$((i + 1)) done } @@ -208,7 +207,7 @@ _require_tape() { dumptape=$1 - if [ -z "$dumptape" -o "@" == "$dumptape" ]; then + if [ -z "$dumptape" -o "@" = "$dumptape" ]; then echo "This test requires a dump tape - none was specified" echo "No dump tape specified" >$seq.notrun status=$NOTRUNSTS @@ -701,7 +700,7 @@ _create_hardlinks() _hardlink=$_fname$_suffix echo "creating hardlink $_hardlink to $_fname" ln $_fname $_hardlink - let _j=$_j+1 + _j=$((_j + 1)) done } @@ -717,7 +716,7 @@ _create_hardset() _i=1 while [ $_i -le $_numsets ]; do _create_hardlinks file$_i 5 - let _i=$_i+1 + _i=$((_i + 1)) done } @@ -993,7 +992,7 @@ _do_dump_multi_file() while [ $i -lt $multi ] do multi_args="$multi_args -f $dump_file.$i -M $media_label.$i" - let i=$i+1 + i=$((i + 1)) done echo "Dumping to files..." @@ -1113,7 +1112,7 @@ _do_restore_multi_file() while [ $i -lt $multi ] do multi_args="$multi_args -f $dump_file.$i" - let i=$i+1 + i=$((i + 1)) done echo "Restoring from file..." @@ -1384,7 +1383,7 @@ _check_quota_entries() # _check_quota_dumprestore() { - if [ "$HOSTOS" == "IRIX" ]; then + if [ "$HOSTOS" = "IRIX" ]; then _check_quota 'user quota information' \ 'group quota information' \ 'project quota information' | \ diff -Nrup xfstests.orig/common.filestreams xfstests/common.filestreams --- xfstests.orig/common.filestreams 2010-01-03 23:03:32.109330001 -0800 +++ xfstests/common.filestreams 2010-01-03 23:39:04.502433002 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2007 Silicon Graphics, Inc. All Rights Reserved. # @@ -24,7 +23,7 @@ _check_filestreams_support() local irix_timeout_sysvar="xfs_mfstream_timeout" local linux_timeout_procvar="/proc/sys/fs/xfs/filestream_centisecs" local streams_avail="" - if [ "$HOSTOS" == "IRIX" ]; then + if [ "$HOSTOS" = "IRIX" ]; then # check for the filestreams timeout systune variable in irix streams_avail=`systune $irix_timeout_sysvar 2>&1 | perl -ne 'if (/'$irix_timeout_sysvar'\s+=\s+\d+/) {print "true"}'` @@ -33,7 +32,7 @@ _check_filestreams_support() [ -f $linux_timeout_procvar ] && streams_avail="true" fi - if [ "$streams_avail" == "true" ]; then + if [ "$streams_avail" = "true" ]; then return 0 else return 1 @@ -45,7 +44,7 @@ _set_stream_timeout_centisecs() local new_timeout_csecs=$1 local irix_timeout_sysvar="xfs_mfstream_timeout" local linux_timeout_procvar="/proc/sys/fs/xfs/filestream_centisecs" - if [ "$HOSTOS" == "IRIX" ]; then + if [ "$HOSTOS" = "IRIX" ]; then echo y | systune -r $irix_timeout_sysvar $new_timeout_csecs >/dev/null else echo $new_timeout_csecs > $linux_timeout_procvar @@ -70,7 +69,7 @@ _do_stream() cd $directory_name local dd_cmd="" - if [ "$HOSTOS" == "IRIX" ]; then + if [ "$HOSTOS" = "IRIX" ]; then # for irix use lmdd dd_cmd="lmdd" [ "$dio" = "1" ] && dd_cmd="$dd_cmd odirect=1" @@ -114,7 +113,7 @@ _check_for_dupes() local this_num_two for this_num_one in $num_str_one; do for this_num_two in $num_str_two; do - if [ "$this_num_one" == "$this_num_two" ]; then + if [ "$this_num_one" = "$this_num_two" ]; then echo "duplicate AG $this_num_one found" \ >> $here/$seq.full return 1 @@ -140,7 +139,7 @@ _test_streams() { _scratch_mkfs_xfs -dsize=$size,agcount=$agcount >/dev/null 2>&1 \ || _fail "mkfs failed" - if [ "$use_iflag" = "0" -o "$HOSTOS" == "IRIX" ]; then + if [ "$use_iflag" = "0" -o "$HOSTOS" = "IRIX" ]; then # mount using filestreams mount option _scratch_mount "-o filestreams" \ || _fail "filestreams mount failed" diff -Nrup xfstests.orig/common.filter xfstests/common.filter --- xfstests.orig/common.filter 2010-01-03 23:03:32.119335001 -0800 +++ xfstests/common.filter 2010-01-03 23:33:56.372433002 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2000-2001 Silicon Graphics, Inc. All Rights Reserved. # diff -Nrup xfstests.orig/common.log xfstests/common.log --- xfstests.orig/common.log 2010-01-03 23:03:32.119335001 -0800 +++ xfstests/common.log 2010-01-03 23:44:11.282433002 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. # @@ -314,8 +313,12 @@ _create_log() # generate some log traffic - but not too much - life gets a little # more complicated if the log wraps around. This traffic is # pretty much arbitary, but could probably be made better than this. - touch $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9} - + i=1 + while [ $i -le 100 ]; do + touch $SCRATCH_MNT/$i + i=$((i + 1)) + done + # unmount the FS _full "umount" umount $SCRATCH_DEV >>$seq.full 2>&1 @@ -342,9 +345,11 @@ _create_log_sync() # generate some log traffic - but not too much # add some syncs to get the log flushed to disk - for file in $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}; do - touch $file + i=1 + while [ $i -le 100 ]; do + touch $SCRATCH_MNT/$i sync + i=$((i + 1)) done # unmount the FS diff -Nrup xfstests.orig/common.metaperf xfstests/common.metaperf --- xfstests.orig/common.metaperf 2010-01-03 23:03:32.129340001 -0800 +++ xfstests/common.metaperf 2010-01-03 23:33:59.432433002 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2003-2005 Silicon Graphics, Inc. All Rights Reserved. # diff -Nrup xfstests.orig/common.punch xfstests/common.punch --- xfstests.orig/common.punch 2010-01-03 23:03:32.139345001 -0800 +++ xfstests/common.punch 2010-01-03 23:39:55.132433002 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2007 Silicon Graphics, Inc. All Rights Reserved. # @@ -40,7 +39,7 @@ _spawn_test_file() { -c "extsize" \ $test_file - if [ "$reserve_space" == "noresv" ]; then + if [ "$reserve_space" = "noresv" ]; then echo "+ not using resvsp at file creation" $XFS_IO_PROG -f \ -c "truncate $file_size" \ @@ -62,13 +61,13 @@ _do_punch() { local punch_type=$4 # u for unresvsp, d for dm_punch local test_file=$5 - if [ "$punch_type" == "u" ]; then + if [ "$punch_type" = "u" ]; then echo "+ hole punch using unresvsp" $XFS_IO_PROG -f \ -c "unresvsp $punch_offset $punch_size" \ $test_file fi - if [ "$punch_type" == "d" ]; then + if [ "$punch_type" = "d" ]; then echo "+ hole punch using dmapi punch_hole" ${DMAPI_QASUITE1_DIR}cmd/punch_hole -o $punch_offset -l $punch_size \ ${SCRATCH_MNT}/$test_file @@ -123,7 +122,7 @@ _test_punch() { local this_punch_type="" local dmap_punch_used=0 for this_punch_type in "${punch_types[@]}"; do - [ "$this_punch_type" == "d" ] && dmap_punch_used=1 + [ "$this_punch_type" = "d" ] && dmap_punch_used=1 done if [ $dmap_punch_used -ne 0 ]; then # a punch type of dm_punch has been specified, do a dmapi mount @@ -161,13 +160,13 @@ _test_punch() { local punch_index=0 local write_index=0 for operation in "${punch_write_order[@]}"; do - if [ "$operation" == "p" ]; then + if [ "$operation" = "p" ]; then _do_punch $blksize ${punch_points_blks[$punch_index]} \ ${punch_sizes_blks[$punch_index]} ${punch_types[$punch_index]} \ $filename punch_index=`expr $punch_index + 1` fi - if [ "$operation" == "w" ]; then + if [ "$operation" = "w" ]; then _do_write $blksize ${write_points_blks[$write_index]} \ ${write_sizes_blks[$write_index]} $filename write_index=`expr $write_index + 1` diff -Nrup xfstests.orig/common.quota xfstests/common.quota --- xfstests.orig/common.quota 2010-01-03 23:03:32.149350001 -0800 +++ xfstests/common.quota 2010-01-03 23:40:10.632433002 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. # All Rights Reserved. @@ -117,7 +116,7 @@ _choose_gid() _choose_prid() { - if [ "X$projid_file" == "X" ]; then + if [ "X$projid_file" = "X" ]; then projid_file=/etc/projid fi if [ ! -f $projid_file ]; then diff -Nrup xfstests.orig/common.rc xfstests/common.rc --- xfstests.orig/common.rc 2010-01-03 23:03:32.159355001 -0800 +++ xfstests/common.rc 2010-01-03 23:41:30.712433002 -0800 @@ -1,5 +1,4 @@ -##/bin/sh -#----------------------------------------------------------------------- +# # Copyright (c) 2000-2006 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 @@ -18,11 +17,11 @@ # # Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, # Mountain View, CA 94043, USA, or: http://www.sgi.com -#----------------------------------------------------------------------- +# dd() { - if [ "$HOSTOS" == "Linux" ] + if [ "$HOSTOS" = "Linux" ] then command dd --help | grep noxfer > /dev/null 2>&1 @@ -186,7 +185,7 @@ _mount_ops_filter() params="$*" #get mount point to handle dmapi mtpt option correctly - let last_index=$#-1 + last_index=$(($# - 1)) [ $last_index -gt 0 ] && shift $last_index FS_ESCAPED=$1 @@ -409,7 +408,7 @@ _df_device() fi $DF_PROG 2>/dev/null | $AWK_PROG -v what=$1 ' - match($1,what) && NF==1 { + match($1,what) && NF == 1 { v=$1 getline print v, $0 @@ -439,7 +438,7 @@ _df_dir() fi $DF_PROG $1 2>/dev/null | $AWK_PROG -v what=$1 ' - NR == 2 && NF==1 { + NR == 2 && NF == 1 { v=$1 getline print v, $0; @@ -720,7 +719,7 @@ _require_user() { qa_user=fsgqa cat /etc/passwd | grep -q $qa_user - [ "$?" == "0" ] || _notrun "$qa_user user not defined." + [ "$?" = "0" ] || _notrun "$qa_user user not defined." } # check that xfs_io, glibc, kernel, and filesystem all (!) support @@ -983,7 +982,7 @@ _udf_test_known_error_filter() _check_udf_filesystem() { - [ "$DISABLE_UDF_TEST" == "1" ] && return + [ "$DISABLE_UDF_TEST" = "1" ] && return if [ $# -ne 1 -a $# -ne 2 ] then @@ -1212,9 +1211,9 @@ _link_out_file() exit fi rm -f $1 - if [ "`uname`" == "IRIX64" ] || [ "`uname`" == "IRIX" ]; then + if [ "`uname`" = "IRIX64" ] || [ "`uname`" = "IRIX" ]; then ln -s $1.irix $1 - elif [ "`uname`" == "Linux" ]; then + elif [ "`uname`" = "Linux" ]; then ln -s $1.linux $1 else echo Error test $seq does not run on the operating system: `uname` @@ -1238,7 +1237,7 @@ _nfiles() if [ $size -gt 0 ]; then dd if=/dev/zero of=$file bs=1024 count=$size fi - let f=$f+1 + f=$((f + 1)) done } @@ -1252,7 +1251,7 @@ _descend() _nfiles $files # files for this dir [ $depth -eq 0 ] && return - let deep=$depth-1 # go 1 down + deep=$((depth - 1)) # go 1 down [ $verbose = true ] && echo "descending, depth from leaves = $deep" @@ -1260,7 +1259,7 @@ _descend() while [ $d -lt $dirs ] do _descend d$d $deep & - let d=$d+1 + d=$((d + 1)) wait done } diff -Nrup xfstests.orig/common.repair xfstests/common.repair --- xfstests.orig/common.repair 2010-01-03 23:03:32.169360001 -0800 +++ xfstests/common.repair 2010-01-03 23:34:06.322433002 -0800 @@ -1,4 +1,3 @@ -##/bin/sh # # Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. # -- BOFH excuse #306: CPU-angle has to be adjusted because of vibrations coming from the nearby road From artur.piechocki@open-e.com Mon Jan 4 04:54:24 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX, RCVD_IN_BRBL autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o04AsNVP101542 for ; Mon, 4 Jan 2010 04:54:24 -0600 X-ASG-Debug-ID: 1262602512-2ac101df0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from moutng.kundenserver.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 865131DAD6BD for ; Mon, 4 Jan 2010 02:55:12 -0800 (PST) Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.17.10]) by cuda.sgi.com with ESMTP id jnknKmPEeD8ODxpw for ; Mon, 04 Jan 2010 02:55:12 -0800 (PST) Received: from [192.168.248.143] (ip-83-238-22-2.netia.com.pl [83.238.22.2]) by mrelayeu.kundenserver.de (node=mrbap1) with ESMTP (Nemesis) id 0LrZQz-1NuztB2Ldt-013tt7; Mon, 04 Jan 2010 11:55:10 +0100 Message-ID: <4B41D70E.4090205@open-e.com> Date: Mon, 04 Jan 2010 12:54:54 +0100 From: Artur Piechocki User-Agent: Thunderbird 2.0.0.23 (X11/20090812) MIME-Version: 1.0 To: david@fromorbit.com CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Call trace with 2.6.27.39 Subject: Re: Call trace with 2.6.27.39 References: <4B40E90D.4030409@poczta.onet.pl> In-Reply-To: <4B40E90D.4030409@poczta.onet.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Provags-ID: V01U2FsdGVkX19CyAxrjQu6rhvrV1O2SgVYKPGxsEePrhxhqT9 usMQNcPqoJYpFvvd45iIqpxlvaRnaYXJA22k27lLLlWDUYcIzU lX4pFUWafyCXa1DYQhutkF5/OxsEp3GUdjud8uHL7Q= X-Barracuda-Connect: moutng.kundenserver.de[212.227.17.10] X-Barracuda-Start-Time: 1262602513 X-Barracuda-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.18924 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 Sorry for my delay, > > On Tue, Dec 29, 2009 at 07:18:32PM +0100, aluno3 wrote: > >> Hi >> >> I have tested kernel 2.6.27.39 with fsstress, LVM, DD and snapshots and after a few hours I got call trace.I had 2 volumes and 10 snapshots for each volume.I created and deleted these snapshots from time to time and wrote to origin volumes with use DD from /dev/zero.Fsstress was run for 1 volume. >> >> >> Filesystem "dm-41": xfs_log_force: error 5 returned. >> > > What were the errors in the log before this? i.e. why did > xfs_log_force() get an EIO error? It sounds like there's something > already gone wrong before this point. > This error probably occurred after overflowing and umounting the snapshot. >> BUG: unable to handle kernel NULL pointer dereference at 0000000000000000 >> IP: [] bdevname+0x3/0x20 >> > .... > >> Process xfslogd/0 (pid: 404, threadinfo ffff88021d956000, task ffff88021fafd890) >> Stack: ffffffff803e7526 ffff880028046970 ffffffff80817020 ffff88021d957e38 >> 00000000ffff8b92 ffff88021fafdac0 ffff88021fafd890 000000001d957eb8 >> ffff880207fe8800 ffff88007fbf6cc0 ffff88021d937bc8 ffff88021d937bc8 >> Call Trace: >> [] ? xfs_ioerror_alert+0x56/0xc0 >> [] ? xlog_recover_iodone+0x40/0x90 >> [] ? xfs_buf_iodone_work+0x0/0x80 >> > > This has died during log recovery (on a different filesytem?), which > implies that a buffer has not been set up properly with a buftarg or > mount stucture. I can't see how that would happen from the code > because each place that explicitly sets xlog_recover_iodone() as the > completion also sets the bp->b_mount correctly. Still, there's been > an IO error of some kind to get to xfs_ioerror_alert(), so it comes > back to whether there were errors reported before this failure? > > Also, were you mounting a snapshot when this occurred? If so, you > shouldn't be doing log recovery on a snapshot because that writes to > the snapshot - you should mount them with the "ro,norecovery" > options to avoid this. > As I wrote above this call trace probably occurred after umounting the snapshots which was mounted with "rw,noatime,nouuid,attr2,nobarrier,noquota" options.I will try reproduce this error again and check if it is repetitious and which command cause this call trace. I send you whole dmesg: Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-61": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-61,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-61": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-61,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-61": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-61,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-41": Disabling barriers, trial barrier write failed XFS mounting filesystem dm-41 Starting XFS recovery on filesystem: dm-41 (logdev: internal) XFS resetting qflags for filesystem dm-41 Ending XFS recovery on filesystem: dm-41 (logdev: internal) Filesystem "dm-42": Disabling barriers, trial barrier write failed XFS mounting filesystem dm-42 Starting XFS recovery on filesystem: dm-42 (logdev: internal) XFS resetting qflags for filesystem dm-42 Ending XFS recovery on filesystem: dm-42 (logdev: internal) Filesystem "dm-43": Disabling barriers, trial barrier write failed XFS mounting filesystem dm-43 Starting XFS recovery on filesystem: dm-43 (logdev: internal) device-mapper: snapshots: Invalidating snapshot: Unable to allocate exception. XFS resetting qflags for filesystem dm-43 Ending XFS recovery on filesystem: dm-43 (logdev: internal) xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": I/O Error Detected. Shutting down filesystem: dm-41 Please umount the filesystem, and rectify the problem(s) Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-44": Disabling barriers, trial barrier write failed XFS mounting filesystem dm-44 Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. device-mapper: snapshots: Invalidating snapshot: Unable to allocate exception. Filesystem "dm-41": xfs_log_force: error 5 returned. device-mapper: snapshots: Invalidating snapshot: Unable to allocate exception. Starting XFS recovery on filesystem: dm-44 (logdev: internal) Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e xfs_force_shutdown(dm-42,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-42": I/O Error Detected. Shutting down filesystem: dm-42 Please umount the filesystem, and rectify the problem(s) xfs_force_shutdown(dm-43,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-43": I/O Error Detected. Shutting down filesystem: dm-43 Please umount the filesystem, and rectify the problem(s) device-mapper: snapshots: Invalidating snapshot: Unable to allocate exception. I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x2088 ("xlog_recover_do..(read#1)") error 5 buf count 4096 XFS: log mount/recovery failed: error 5 XFS: log mount failed I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x7d7820 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 Filesystem "dm-44": I/O Error Detected. Shutting down filesystem: dm-44 Please umount the filesystem, and rectify the problem(s) I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x105a8 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x7cb0 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x1772dd8 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x18 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x2 ("xlog_recover_iodone") error 5 buf count 512 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x39a90 ("xlog_recover_iodone") error 5 buf count 8192 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x7d0018 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x7d0002 ("xlog_recover_iodone") error 5 buf count 512 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x7d0008 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x7d0010 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x7d0001 ("xlog_recover_iodone") error 5 buf count 512 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x1770008 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x1770010 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x1770001 ("xlog_recover_iodone") error 5 buf count 512 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0xfa0008 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0xfa0010 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0xfa0001 ("xlog_recover_iodone") error 5 buf count 512 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x8 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x10 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x1 ("xlog_recover_iodone") error 5 buf count 512 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x0 ("xlog_recover_iodone") error 5 buf count 512 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 Filesystem "dm-41": xfs_log_force: error 5 returned. BUG: unable to handle kernel NULL pointer dereference at 0000000000000000 IP: [] bdevname+0x3/0x20 PGD 0 Oops: 0000 [1] SMP CPU 0 Modules linked in: iscsi_scst scst_vdisk scst drbd twofish twofish_common serpent blowfish cast5 sha256_generic crypto_null iscsi_tcp libiscsi scsi_transport_iscsi bonding button thermal processor e1000e sg ftdi_sio usbserial nls_iso8859_1 nls_cp437 arcmsr uhci_hcd ohci_hcd ehci_hcd vfat fat aufs [last unloaded: ohci_hcd] Pid: 404, comm: xfslogd/0 Not tainted 2.6.27.39-oe64-00000-g92ed9a0 #65 RIP: 0010:[] [] bdevname+0x3/0x20 RSP: 0000:ffff88021d957de8 EFLAGS: 00010286 RAX: ffff88021d957e00 RBX: ffff88007fbf6cc0 RCX: 0000000001770520 RDX: ffff88007fbf6cc0 RSI: ffff88021d957e00 RDI: 0000000000000000 RBP: ffff880207fe8800 R08: ffff88021d956000 R09: 0000000000000000 R10: 0000000000000000 R11: ffffffff803d5020 R12: 0000000001770520 R13: ffffffff8078cf02 R14: ffff88021d957e00 R15: 0000000000000005 FS: 0000000000000000(0000) GS:ffffffff80952080(0000) knlGS:0000000000000000 CS: 0010 DS: 0018 ES: 0018 CR0: 000000008005003b CR2: 0000000000000000 CR3: 0000000000201000 CR4: 00000000000006a0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Process xfslogd/0 (pid: 404, threadinfo ffff88021d956000, task ffff88021fafd890) Stack: ffffffff803e7526 ffff880028046970 ffffffff80817020 ffff88021d957e38 00000000ffff8b92 ffff88021fafdac0 ffff88021fafd890 000000001d957eb8 ffff880207fe8800 ffff88007fbf6cc0 ffff88021d937bc8 ffff88021d937bc8 Call Trace: [] ? xfs_ioerror_alert+0x56/0xc0 [] ? xlog_recover_iodone+0x40/0x90 [] ? xfs_buf_iodone_work+0x0/0x80 [] ? run_workqueue+0x5a/0x110 [] ? worker_thread+0x9c/0xf0 [] ? autoremove_wake_function+0x0/0x30 [] ? autoremove_wake_function+0x0/0x30 [] ? worker_thread+0x0/0xf0 [] ? kthread+0x6c/0xa0 [] ? child_rip+0xa/0x11 [] ? kthread+0x0/0xa0 [] ? child_rip+0x0/0x11 Code: 13 00 48 89 d8 5b c3 48 89 df 48 c7 c2 ea b5 7a 80 be 20 00 00 00 31 c0 e8 cb e7 13 00 48 89 d8 5b c3 66 66 90 66 66 90 48 89 f0 <8b> 37 48 8b bf 98 00 00 00 48 89 c2 81 e6 ff ff 0f 00 2b 77 04 RIP [] bdevname+0x3/0x20 RSP CR2: 0000000000000000 ---[ end trace e0541894570554ab ]--- Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-42": xfs_log_force: error 5 returned. Filesystem "dm-42": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-42,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-43": xfs_log_force: error 5 returned. Filesystem "dm-43": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-43,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-42": xfs_log_force: error 5 returned. Filesystem "dm-42": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-42,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-43": xfs_log_force: error 5 returned. Filesystem "dm-43": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-43,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-42": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-42": xfs_log_force: error 5 returned. Filesystem "dm-42": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-42,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-43": xfs_log_force: error 5 returned. Filesystem "dm-43": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-43,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-42": xfs_log_force: error 5 returned. Filesystem "dm-42": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-42,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-43": xfs_log_force: error 5 returned. Filesystem "dm-43": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-43,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-43": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-42": xfs_log_force: error 5 returned. Filesystem "dm-42": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-42,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-43": xfs_log_force: error 5 returned. Filesystem "dm-43": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-43,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-42": xfs_log_force: error 5 returned. Filesystem "dm-43": xfs_log_force: error 5 returned. > Cheers, > > Dave. > From aluno3@poczta.onet.pl Mon Jan 4 04:54:45 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, KB_DATE_CONTAINS_TAB,RCVD_IN_BRBL autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o04AsjOV101603 for ; Mon, 4 Jan 2010 04:54:45 -0600 X-ASG-Debug-ID: 1262602534-2ac101e20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtpout5.poczta.onet.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5AB791DAD6BD for ; Mon, 4 Jan 2010 02:55:34 -0800 (PST) Received: from smtpout5.poczta.onet.pl (smtpout5.poczta.onet.pl [213.180.147.165]) by cuda.sgi.com with ESMTP id KY46hWacuCJR7U6u for ; Mon, 04 Jan 2010 02:55:34 -0800 (PST) Received: from ip-83-238-22-2.netia.com.pl ([83.238.22.2]:53059 "EHLO [192.168.248.143]" rhost-flags-OK-FAIL-OK-FAIL) by ps1.m5r2.onet with ESMTPSA id S50332326Ab0ADKzdNoqjv (ORCPT ); Mon, 4 Jan 2010 11:55:33 +0100 Message-ID: <4B41D724.1090805@poczta.onet.pl> Date: Mon, 04 Jan 2010 12:55:16 +0100 From: aluno3 User-Agent: Thunderbird 2.0.0.23 (X11/20090812) MIME-Version: 1.0 To: david@fromorbit.com CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Call trace with 2.6.27.39 Subject: Re: Call trace with 2.6.27.39 References: <4B40E90D.4030409@poczta.onet.pl> In-Reply-To: <4B40E90D.4030409@poczta.onet.pl> X-Enigmail-Version: 0.96.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtpout5.poczta.onet.pl[213.180.147.165] X-Barracuda-Start-Time: 1262602535 X-Barracuda-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.18924 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 Sorry for my delay, > > On Tue, Dec 29, 2009 at 07:18:32PM +0100, aluno3 wrote: > >> Hi >> >> I have tested kernel 2.6.27.39 with fsstress, LVM, DD and snapshots and after a few hours I got call trace.I had 2 volumes and 10 snapshots for each volume.I created and deleted these snapshots from time to time and wrote to origin volumes with use DD from /dev/zero.Fsstress was run for 1 volume. >> >> >> Filesystem "dm-41": xfs_log_force: error 5 returned. >> > > What were the errors in the log before this? i.e. why did > xfs_log_force() get an EIO error? It sounds like there's something > already gone wrong before this point. > This error probably occurred after overflowing and umounting the snapshot. >> BUG: unable to handle kernel NULL pointer dereference at 0000000000000000 >> IP: [] bdevname+0x3/0x20 >> > .... > >> Process xfslogd/0 (pid: 404, threadinfo ffff88021d956000, task ffff88021fafd890) >> Stack: ffffffff803e7526 ffff880028046970 ffffffff80817020 ffff88021d957e38 >> 00000000ffff8b92 ffff88021fafdac0 ffff88021fafd890 000000001d957eb8 >> ffff880207fe8800 ffff88007fbf6cc0 ffff88021d937bc8 ffff88021d937bc8 >> Call Trace: >> [] ? xfs_ioerror_alert+0x56/0xc0 >> [] ? xlog_recover_iodone+0x40/0x90 >> [] ? xfs_buf_iodone_work+0x0/0x80 >> > > This has died during log recovery (on a different filesytem?), which > implies that a buffer has not been set up properly with a buftarg or > mount stucture. I can't see how that would happen from the code > because each place that explicitly sets xlog_recover_iodone() as the > completion also sets the bp->b_mount correctly. Still, there's been > an IO error of some kind to get to xfs_ioerror_alert(), so it comes > back to whether there were errors reported before this failure? > > Also, were you mounting a snapshot when this occurred? If so, you > shouldn't be doing log recovery on a snapshot because that writes to > the snapshot - you should mount them with the "ro,norecovery" > options to avoid this. > As I wrote above this call trace probably occurred after umounting the snapshots which was mounted with "rw,noatime,nouuid,attr2,nobarrier,noquota" options.I will try reproduce this error again and check if it is repetitious and which command cause this call trace. I send you whole dmesg: Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-61": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-61,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-61": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-61,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-61": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-61,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-61": xfs_log_force: error 5 returned. Filesystem "dm-41": Disabling barriers, trial barrier write failed XFS mounting filesystem dm-41 Starting XFS recovery on filesystem: dm-41 (logdev: internal) XFS resetting qflags for filesystem dm-41 Ending XFS recovery on filesystem: dm-41 (logdev: internal) Filesystem "dm-42": Disabling barriers, trial barrier write failed XFS mounting filesystem dm-42 Starting XFS recovery on filesystem: dm-42 (logdev: internal) XFS resetting qflags for filesystem dm-42 Ending XFS recovery on filesystem: dm-42 (logdev: internal) Filesystem "dm-43": Disabling barriers, trial barrier write failed XFS mounting filesystem dm-43 Starting XFS recovery on filesystem: dm-43 (logdev: internal) device-mapper: snapshots: Invalidating snapshot: Unable to allocate exception. XFS resetting qflags for filesystem dm-43 Ending XFS recovery on filesystem: dm-43 (logdev: internal) xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": I/O Error Detected. Shutting down filesystem: dm-41 Please umount the filesystem, and rectify the problem(s) Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-44": Disabling barriers, trial barrier write failed XFS mounting filesystem dm-44 Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. device-mapper: snapshots: Invalidating snapshot: Unable to allocate exception. Filesystem "dm-41": xfs_log_force: error 5 returned. device-mapper: snapshots: Invalidating snapshot: Unable to allocate exception. Starting XFS recovery on filesystem: dm-44 (logdev: internal) Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e xfs_force_shutdown(dm-42,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-42": I/O Error Detected. Shutting down filesystem: dm-42 Please umount the filesystem, and rectify the problem(s) xfs_force_shutdown(dm-43,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-43": I/O Error Detected. Shutting down filesystem: dm-43 Please umount the filesystem, and rectify the problem(s) device-mapper: snapshots: Invalidating snapshot: Unable to allocate exception. I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x2088 ("xlog_recover_do..(read#1)") error 5 buf count 4096 XFS: log mount/recovery failed: error 5 XFS: log mount failed I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x7d7820 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 Filesystem "dm-44": I/O Error Detected. Shutting down filesystem: dm-44 Please umount the filesystem, and rectify the problem(s) I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x105a8 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x7cb0 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x1772dd8 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x18 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x2 ("xlog_recover_iodone") error 5 buf count 512 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x39a90 ("xlog_recover_iodone") error 5 buf count 8192 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x7d0018 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x7d0002 ("xlog_recover_iodone") error 5 buf count 512 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x7d0008 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x7d0010 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x7d0001 ("xlog_recover_iodone") error 5 buf count 512 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x1770008 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x1770010 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x1770001 ("xlog_recover_iodone") error 5 buf count 512 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0xfa0008 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0xfa0010 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0xfa0001 ("xlog_recover_iodone") error 5 buf count 512 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x8 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x10 ("xlog_recover_iodone") error 5 buf count 4096 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x1 ("xlog_recover_iodone") error 5 buf count 512 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 I/O error in filesystem ("dm-44") meta-data dev dm-44 block 0x0 ("xlog_recover_iodone") error 5 buf count 512 xfs_force_shutdown(dm-44,0x1) called from line 285 of file fs/xfs/xfs_log_recover.c. Return address = 0xffffffff803d5079 Filesystem "dm-41": xfs_log_force: error 5 returned. BUG: unable to handle kernel NULL pointer dereference at 0000000000000000 IP: [] bdevname+0x3/0x20 PGD 0 Oops: 0000 [1] SMP CPU 0 Modules linked in: iscsi_scst scst_vdisk scst drbd twofish twofish_common serpent blowfish cast5 sha256_generic crypto_null iscsi_tcp libiscsi scsi_transport_iscsi bonding button thermal processor e1000e sg ftdi_sio usbserial nls_iso8859_1 nls_cp437 arcmsr uhci_hcd ohci_hcd ehci_hcd vfat fat aufs [last unloaded: ohci_hcd] Pid: 404, comm: xfslogd/0 Not tainted 2.6.27.39-oe64-00000-g92ed9a0 #65 RIP: 0010:[] [] bdevname+0x3/0x20 RSP: 0000:ffff88021d957de8 EFLAGS: 00010286 RAX: ffff88021d957e00 RBX: ffff88007fbf6cc0 RCX: 0000000001770520 RDX: ffff88007fbf6cc0 RSI: ffff88021d957e00 RDI: 0000000000000000 RBP: ffff880207fe8800 R08: ffff88021d956000 R09: 0000000000000000 R10: 0000000000000000 R11: ffffffff803d5020 R12: 0000000001770520 R13: ffffffff8078cf02 R14: ffff88021d957e00 R15: 0000000000000005 FS: 0000000000000000(0000) GS:ffffffff80952080(0000) knlGS:0000000000000000 CS: 0010 DS: 0018 ES: 0018 CR0: 000000008005003b CR2: 0000000000000000 CR3: 0000000000201000 CR4: 00000000000006a0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Process xfslogd/0 (pid: 404, threadinfo ffff88021d956000, task ffff88021fafd890) Stack: ffffffff803e7526 ffff880028046970 ffffffff80817020 ffff88021d957e38 00000000ffff8b92 ffff88021fafdac0 ffff88021fafd890 000000001d957eb8 ffff880207fe8800 ffff88007fbf6cc0 ffff88021d937bc8 ffff88021d937bc8 Call Trace: [] ? xfs_ioerror_alert+0x56/0xc0 [] ? xlog_recover_iodone+0x40/0x90 [] ? xfs_buf_iodone_work+0x0/0x80 [] ? run_workqueue+0x5a/0x110 [] ? worker_thread+0x9c/0xf0 [] ? autoremove_wake_function+0x0/0x30 [] ? autoremove_wake_function+0x0/0x30 [] ? worker_thread+0x0/0xf0 [] ? kthread+0x6c/0xa0 [] ? child_rip+0xa/0x11 [] ? kthread+0x0/0xa0 [] ? child_rip+0x0/0x11 Code: 13 00 48 89 d8 5b c3 48 89 df 48 c7 c2 ea b5 7a 80 be 20 00 00 00 31 c0 e8 cb e7 13 00 48 89 d8 5b c3 66 66 90 66 66 90 48 89 f0 <8b> 37 48 8b bf 98 00 00 00 48 89 c2 81 e6 ff ff 0f 00 2b 77 04 RIP [] bdevname+0x3/0x20 RSP CR2: 0000000000000000 ---[ end trace e0541894570554ab ]--- Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-42": xfs_log_force: error 5 returned. Filesystem "dm-42": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-42,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-43": xfs_log_force: error 5 returned. Filesystem "dm-43": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-43,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-42": xfs_log_force: error 5 returned. Filesystem "dm-42": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-42,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-43": xfs_log_force: error 5 returned. Filesystem "dm-43": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-43,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-42": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-42": xfs_log_force: error 5 returned. Filesystem "dm-42": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-42,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-43": xfs_log_force: error 5 returned. Filesystem "dm-43": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-43,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-42": xfs_log_force: error 5 returned. Filesystem "dm-42": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-42,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-43": xfs_log_force: error 5 returned. Filesystem "dm-43": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-43,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-43": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-41": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-41,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-42": xfs_log_force: error 5 returned. Filesystem "dm-42": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-42,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-43": xfs_log_force: error 5 returned. Filesystem "dm-43": xfs_log_force: error 5 returned. xfs_force_shutdown(dm-43,0x1) called from line 420 of file fs/xfs/xfs_rw.c. Return address = 0xffffffff803e776e Filesystem "dm-41": xfs_log_force: error 5 returned. Filesystem "dm-42": xfs_log_force: error 5 returned. Filesystem "dm-43": xfs_log_force: error 5 returned. > Cheers, > > Dave. > From nancy.naples@uconn.edu Mon Jan 4 06:48:23 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.5 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX, URIBL_BLACK autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o04CmM95114486 for ; Mon, 4 Jan 2010 06:48:22 -0600 X-ASG-Debug-ID: 1262609352-2cc700500000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from exchange.uconn.edu (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CC63E1DADE0D for ; Mon, 4 Jan 2010 04:49:12 -0800 (PST) Received: from exchange.uconn.edu (cashub2.grove.ad.uconn.edu [137.99.30.161]) by cuda.sgi.com with ESMTP id PJAaCNRDc3nOYti9 for ; Mon, 04 Jan 2010 04:49:12 -0800 (PST) Received: from Exchange2.grove.ad.uconn.edu ([fe80::88e:35f2:186a:2c48]) by CASHUB2.grove.ad.uconn.edu ([2002:8963:1ea1::8963:1ea1]) with mapi; Mon, 4 Jan 2010 07:49:11 -0500 From: "Naples, Nancy" To: "upgrade@webmaster.org" Date: Mon, 4 Jan 2010 07:49:10 -0500 X-ASG-Orig-Subj: Important: Email Account Verification Update!! ! Subject: Important: Email Account Verification Update!! ! Thread-Topic: Important: Email Account Verification Update!! ! Thread-Index: AQHKjTxP0DLmVa651Eu8m+cTxWgDUg== Message-ID: <78FF2F62888244409BB1B017513617A101C032978C@EXCHANGE2.grove.ad.uconn.edu> 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-Barracuda-Connect: cashub2.grove.ad.uconn.edu[137.99.30.161] X-Barracuda-Start-Time: 1262609352 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0004 1.0000 -2.0185 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18930 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Your mailbox quota has been exceeded the storage limit which is 20GB as set= by your administrator, You are currently running on 20.9GB. You may not be able to send or receive new mails until you re-validate your= mailbox. To re-activate your account please click the link below: http://www.acc-central.com/ Thanks and we are sorry for the inconveniences Local Host. From BATV+f7ef0c0ede44be5e1f80+2325+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 4 09:09:18 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o04F9GUx123947 for ; Mon, 4 Jan 2010 09:09:18 -0600 X-ASG-Debug-ID: 1262617806-5c9600710000-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 366FE4CA001 for ; Mon, 4 Jan 2010 07:10:06 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id fmPgRotz18W3MjX5 for ; Mon, 04 Jan 2010 07:10:06 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NRoZJ-0007B7-9i; Mon, 04 Jan 2010 15:10:05 +0000 Date: Mon, 4 Jan 2010 10:10:05 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Use list_heads for log recovery item lists Subject: Re: [PATCH] XFS: Use list_heads for log recovery item lists Message-ID: <20100104151005.GA24810@infradead.org> References: <1262400014-19360-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262400014-19360-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262617807 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 02, 2010 at 01:40:14PM +1100, Dave Chinner wrote: > Remove the roll-your-own linked list operations. Looks good. Reviewed-by: Christoph Hellwig From BATV+f7ef0c0ede44be5e1f80+2325+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 4 09:15:26 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o04FFQnM124297 for ; Mon, 4 Jan 2010 09:15:26 -0600 X-ASG-Debug-ID: 1262618176-037702930000-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 3848F1C28A28 for ; Mon, 4 Jan 2010 07:16:16 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id LwgOgzIWfbm5DbtY for ; Mon, 04 Jan 2010 07:16:16 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NRofI-0008G2-GA; Mon, 04 Jan 2010 15:16:16 +0000 Date: Mon, 4 Jan 2010 10:16:16 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] XFS: Don't wake the aild once per second Subject: Re: [PATCH 1/2] XFS: Don't wake the aild once per second Message-ID: <20100104151616.GB24810@infradead.org> References: <1262400215-19443-1-git-send-email-david@fromorbit.com> <1262400215-19443-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262400215-19443-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262618177 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 02, 2010 at 01:43:34PM +1100, Dave Chinner wrote: > Now that the AIL push algorithm is traversal safe, we don't need a > watchdog function in the xfsaild to catch pushes that fail to make > progress. Remove the watchdog timeout and make pushes purely driven > by demand. This will remove the once-per-second wakeup that is seen > when the filesystem is idle and make laptop power misers happy. Looks good, but a few nitpicks below: > - long tout = 0; > + long tout = 1000; /* milliseconds */ Why do we use a timeout when starting up now? If there's a good reason for it the reason at least should be explained in a comment here. > while (!kthread_should_stop()) { > - if (tout) > - schedule_timeout_interruptible(msecs_to_jiffies(tout)); > - tout = 1000; > + tout = !tout ? MAX_SCHEDULE_TIMEOUT : msecs_to_jiffies(tout); Why not just: schedule_timeout_interruptible(tout ? msecs_to_jiffies(tout) : MAX_SCHEDULE_TIMEOUT); that avoids the assignment of different units to the same variable, and also the negation. > + long tout = 0; > xfs_lsn_t last_pushed_lsn = *last_lsn; > xfs_lsn_t target = ailp->xa_target; > xfs_lsn_t lsn; > @@ -279,7 +280,6 @@ xfsaild_push( > * prevents use from spinning when we can't do anything or there is > * lots of contention on the AIL lists. > */ > - tout = 10; > lsn = lip->li_lsn; > flush_log = stuck = count = 0; > while ((XFS_LSN_CMP(lip->li_lsn, target) < 0)) { > @@ -376,14 +376,14 @@ xfsaild_push( > > if (!count) { > /* We're past our target or empty, so idle */ > - tout = 1000; > + tout = 0; tout always is 0 here already. > } else if (XFS_LSN_CMP(lsn, target) >= 0) { > /* > * We reached the target so wait a bit longer for I/O to > * complete and remove pushed items from the AIL before we > * start the next scan from the start of the AIL. > */ > - tout += 20; > + tout = 50; > last_pushed_lsn = 0; > } else if ((stuck * 100) / count > 90) { > /* > @@ -395,11 +395,14 @@ xfsaild_push( > * Backoff a bit more to allow some I/O to complete before > * continuing from where we were. > */ > - tout += 10; > + tout = 20; > + } else { > + /* more to do, but wait a short while before continuing */ > + tout = 10; > } > *last_lsn = last_pushed_lsn; > return tout; > -} /* xfsaild_push */ > +} All the += and co here is a bit confusing. We always return 0 now except for those last two cases that return 20 or 10. So I'd just change them to a tout = 10/20; From BATV+f7ef0c0ede44be5e1f80+2325+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 4 09:19:58 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_74 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o04FJvh7124548 for ; Mon, 4 Jan 2010 09:19:58 -0600 X-ASG-Debug-ID: 1262618448-3a3c02ee0000-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 C743C13D5B9 for ; Mon, 4 Jan 2010 07:20:48 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id pNOMjaN0Wbo8wmnR for ; Mon, 04 Jan 2010 07:20:48 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NRojg-0000qG-G9; Mon, 04 Jan 2010 15:20:48 +0000 Date: Mon, 4 Jan 2010 10:20:48 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] XFS: Don't wake xfsbufd when idle Subject: Re: [PATCH 2/2] XFS: Don't wake xfsbufd when idle Message-ID: <20100104152048.GC24810@infradead.org> References: <1262400215-19443-1-git-send-email-david@fromorbit.com> <1262400215-19443-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262400215-19443-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262618448 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 02, 2010 at 01:43:35PM +1100, Dave Chinner wrote: > The xfsbufd wakes every xfsbufd_centisecs (once per second by > default) for each filesystem even when the filesystem is idle. > If the xfsbufd has nothing to do, put it into a long term sleep > and only wake it up when there is work pending (i.e. dirty > buffers to flush soon). This will make laptop power misers happy. > > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_buf.c | 28 +++++++++++++++++++--------- > 1 files changed, 19 insertions(+), 9 deletions(-) > > STATIC int xfsbufd(void *); > -STATIC int xfsbufd_wakeup(int, gfp_t); > +STATIC int xfsbufd_wakeup_all(int, gfp_t); this rename seems unrelated to the rest of the patch. > @@ -1595,6 +1595,11 @@ xfs_buf_delwri_queue( > list_del(&bp->b_list); > } > > + if (list_empty(dwq)) { > + /* start xfsbufd as it has something to do now */ > + wake_up_process(bp->b_target->bt_task); > + } Does it make sense to wake xfsbufd before actually adding the item and unlocking the queue lock? Shouldn't this be defered until after the addition? From BATV+f7ef0c0ede44be5e1f80+2325+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 4 09:42:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o04Fgewg125797 for ; Mon, 4 Jan 2010 09:42:40 -0600 X-ASG-Debug-ID: 1262619811-5ce6014d0000-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 779B913D72B for ; Mon, 4 Jan 2010 07:43:31 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id l0HrUxrqUCeBD7hD for ; Mon, 04 Jan 2010 07:43:31 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NRp5f-0006Op-6X; Mon, 04 Jan 2010 15:43:31 +0000 Date: Mon, 4 Jan 2010 10:43:31 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/3] XFS: Sort delayed write buffers before dispatch Subject: Re: [PATCH 3/3] XFS: Sort delayed write buffers before dispatch Message-ID: <20100104154331.GA7924@infradead.org> References: <1262401416-19546-1-git-send-email-david@fromorbit.com> <1262401416-19546-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262401416-19546-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262619811 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 02, 2010 at 02:03:36PM +1100, Dave Chinner wrote: > Ideally this should use a list sort rather than requiring an > external buffer to sort the buffers in, but for simplicity > just do it via sort function. Followup patches are needed to > take the list sort functions from the DRM and UBIFS code and > make it a common function and to utilise it. That will allow > sorting the entire delwri queue to be written in one go. Maybe getting the common list sort in ASAP might be a good idea. That way we could have it ready by the time this patchset is merged. If not adding a new list sort to XFS temporarily might be a better idea than artifically flattening the list. From chris.mason@oracle.com Mon Jan 4 10:28:49 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,UNPARSEABLE_RELAY autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o04GSm3U128750 for ; Mon, 4 Jan 2010 10:28:49 -0600 X-ASG-Debug-ID: 1262622570-309102730000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from rcsinet12.oracle.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9081D1C283C3 for ; Mon, 4 Jan 2010 08:29:30 -0800 (PST) Received: from rcsinet12.oracle.com (rcsinet12.oracle.com [148.87.113.124]) by cuda.sgi.com with ESMTP id 8dXPa4XXXagT0Uyn for ; Mon, 04 Jan 2010 08:29:30 -0800 (PST) Received: from acsinet15.oracle.com (acsinet15.oracle.com [141.146.126.227]) by rcsinet12.oracle.com (Switch-3.4.2/Switch-3.4.2) with ESMTP id o04GT337003837 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 4 Jan 2010 16:29:06 GMT Received: from acsmt353.oracle.com (acsmt353.oracle.com [141.146.40.153]) by acsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o04GDZXX017424; Mon, 4 Jan 2010 16:29:02 GMT Received: from abhmt017.oracle.com by acsmt353.oracle.com with ESMTP id 1277669571262622479; Mon, 04 Jan 2010 08:27:59 -0800 Received: from localhost (/67.253.157.146) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 Jan 2010 08:27:55 -0800 Date: Mon, 4 Jan 2010 11:27:48 -0500 From: Chris Mason To: tytso@mit.edu Cc: Evgeniy Polyakov , Peter Grandi , xfs@oss.sgi.com, reiserfs-devel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, jfs-discussion@lists.sourceforge.net, ext-users , linux-nilfs@vger.kernel.org X-ASG-Orig-Subj: Re: [Jfs-discussion] benchmark results Subject: Re: [Jfs-discussion] benchmark results Message-ID: <20100104162748.GA11932@think> Mail-Followup-To: Chris Mason , tytso@mit.edu, Evgeniy Polyakov , Peter Grandi , xfs@oss.sgi.com, reiserfs-devel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, jfs-discussion@lists.sourceforge.net, ext-users , linux-nilfs@vger.kernel.org References: <19251.26403.762180.228181@tree.ty.sabi.co.uk> <20091224212756.GM21594@thunk.org> <20091224234631.GA1028@ioremap.net> <20091225161146.GC32757@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091225161146.GC32757@thunk.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Source-IP: acsmt353.oracle.com [141.146.40.153] X-Auth-Type: Internal IP X-CT-RefId: str=0001.0A090202.4B42174F.00B8:SCFMA4539814,ss=1,fgs=0 X-Barracuda-Connect: rcsinet12.oracle.com[148.87.113.124] X-Barracuda-Start-Time: 1262622571 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.18943 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 On Fri, Dec 25, 2009 at 11:11:46AM -0500, tytso@mit.edu wrote: > On Fri, Dec 25, 2009 at 02:46:31AM +0300, Evgeniy Polyakov wrote: > > > [1] http://samba.org/ftp/tridge/dbench/README > > > > Was not able to resist to write a small notice, what no matter what, but > > whatever benchmark is running, it _does_ show system behaviour in one > > or another condition. And when system behaves rather badly, it is quite > > a common comment, that benchmark was useless. But it did show that > > system has a problem, even if rarely triggered one :) > > If people are using benchmarks to improve file system, and a benchmark > shows a problem, then trying to remedy the performance issue is a good > thing to do, of course. Sometimes, though the case which is > demonstrated by a poor benchmark is an extremely rare corner case that > doesn't accurately reflect common real-life workloads --- and if > addressing it results in a tradeoff which degrades much more common > real-life situations, then that would be a bad thing. > > In situations where benchmarks are used competitively, it's rare that > it's actually a *problem*. Instead it's much more common that a > developer is trying to prove that their file system is *better* to > gullible users who think that a single one-dimentional number is > enough for them to chose file system X over file system Y. [ Look at all this email from my vacation...sorry for the delay ] It's important that people take benchmarks from filesystem developers with a big grain of salt, which is one reason the boxacle.net results are so nice. Steve more than willing to take patches and experiment to improve a given FS results, but his business is a fair representation of performance and it shows. > > For example, if I wanted to play that game and tell people that ext4 > is better, I'd might pick this graph: > > http://btrfs.boxacle.net/repository/single-disk/2.6.29-rc2/2.6.29-rc2/2.6.29-rc2_Mail_server_simulation._num_threads=32.html > > On the other hand, this one shows ext4 as the worst compared to all > other file systems: > > http://btrfs.boxacle.net/repository/single-disk/2.6.29-rc2/2.6.29-rc2/2.6.29-rc2_Large_file_random_writes_odirect._num_threads=8.html > > Benchmarking, like statistics, can be extremely deceptive, and if > people do things like carefully order a tar file so the files are > optimal for a file system, it's fair to ask whether that's a common > thing for people to be doing (either unpacking tarballs or unpacking > tarballs whose files have been carefully ordered for a particular file > systems). I tend to use compilebench for testing the ability to create lots of small files, which puts the file names into FS native order (by unpacking and then readdiring the results) before it does any timings. I'd agree with Larry that benchmarking is most useful to test a theory. Here's a patch that is supposed to do xyz, is that actually true. With that said we should also be trying to write benchmarks that show the worst case...we know some of our design weakness and should be able to show numbers for how bad it really is (see the random write btrfs.boxacle.net tests for that one). -chris From mrubin@google.com Mon Jan 4 12:57:25 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o04IvOB4137149 for ; Mon, 4 Jan 2010 12:57:24 -0600 X-ASG-Debug-ID: 1262631491-2bd401f70000-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 5EC4415081B8 for ; Mon, 4 Jan 2010 10:58:12 -0800 (PST) Received: from smtp-out.google.com (smtp-out.google.com [216.239.33.17]) by cuda.sgi.com with ESMTP id zg4uukkDDWrB0jVR for ; Mon, 04 Jan 2010 10:58:12 -0800 (PST) Received: from spaceape10.eur.corp.google.com (spaceape10.eur.corp.google.com [172.28.16.144]) by smtp-out.google.com with ESMTP id o04IwATb003282 for ; Mon, 4 Jan 2010 18:58:11 GMT DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta; t=1262631491; bh=DqeXOnYnLApXzHr6H+eXI3gRm/o=; h=MIME-Version:In-Reply-To:References:From:Date:Message-ID:Subject: To:Content-Type; b=oKk/6oZFg49hwFS5SoTc1aQPCbkzRXRfBj6OCy6rigfb+LoF3ylAZfyhr6icAzgRn DaDsu8ZNwgQV0mMFq51gA== DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns; h=mime-version:in-reply-to:references:from:date:message-id: subject:to:content-type:x-system-of-record; b=Zz2rocmdA06xy+ICnRqHtCqaIEteeDfJvXWHXqIKFl3xjUSog1wcgODO/IZGlt7WA kN7Kvyn5qPwvdAHEOASdg== Received: from pxi10 (pxi10.prod.google.com [10.243.27.10]) by spaceape10.eur.corp.google.com with ESMTP id o04ItWgu018562 for ; Mon, 4 Jan 2010 10:58:09 -0800 Received: by pxi10 with SMTP id 10so10981527pxi.13 for ; Mon, 04 Jan 2010 10:58:09 -0800 (PST) MIME-Version: 1.0 Received: by 10.143.154.38 with SMTP id g38mr15190083wfo.186.1262631489071; Mon, 04 Jan 2010 10:58:09 -0800 (PST) In-Reply-To: <20100104162748.GA11932@think> References: <19251.26403.762180.228181@tree.ty.sabi.co.uk> <20091224212756.GM21594@thunk.org> <20091224234631.GA1028@ioremap.net> <20091225161146.GC32757@thunk.org> <20100104162748.GA11932@think> From: Michael Rubin Date: Mon, 4 Jan 2010 10:57:49 -0800 Message-ID: <532480951001041057w3ad8d1dfy361ced0346ebaaa4@mail.gmail.com> X-ASG-Orig-Subj: Re: [Jfs-discussion] benchmark results Subject: Re: [Jfs-discussion] benchmark results To: Chris Mason , tytso@mit.edu, Evgeniy Polyakov , Peter Grandi , xfs@oss.sgi.com, reiserfs-devel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, jfs-discussion@lists.sourceforge.net, ext-users , linux-nilfs@vger.kernel.org Content-Type: text/plain; charset=ISO-8859-1 X-System-Of-Record: true X-Barracuda-Connect: smtp-out.google.com[216.239.33.17] X-Barracuda-Start-Time: 1262631495 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.18950 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 Google is currently in the middle of upgrading from ext2 to a more up to date file system. We ended up choosing ext4. This thread touches upon many of the issues we wrestled with, so I thought it would be interesting to share. We should be sending out more details soon. The driving performance reason to upgrade is that while ext2 had been "good enough" for a very long time the metadata arrangement on a stale file system was leading to what we call "read inflation". This is where we end up doing many seeks to read one block of data. In general latency from poor block allocation was causing performance hiccups. We spent a lot of time with unix standard benchmarks (dbench, compile bench, et al) on xfs, ext4, jfs to try to see which one was going to perform the best. In the end we mostly ended up using the benchmarks to validate our assumptions and do functional testing. Larry is completely right IMHO. These benchmarks were instrumental in helping us understand how the file systems worked in controlled situations and gain confidence from our customers. For our workloads we saw ext4 and xfs as "close enough" in performance in the areas we cared about. The fact that we had a much smoother upgrade path with ext4 clinched the deal. The only upgrade option we have is online. ext4 is already moving the bottleneck away from the storage stack for some of our most intensive applications. It was not until we moved from benchmarks to customer workload that we were able to make detailed performance comparisons and find bugs in our implementation. "Iterate often" seems to be the winning strategy for SW dev. But when it involves rebooting a cloud of systems and making a one way conversion of their data it can get messy. That said I see benchmarks as tools to build confidence before running traffic on redundant live systems. mrubin PS for some reason "dbench" holds mythical power over many folks I have met. They just believe it's the most trusted and standard benchmark for file systems. In my experience it often acts as a random number generator. It has found some bugs in our code as it exercises the VFS layer very well. From sandeen@redhat.com Mon Jan 4 17:17:23 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_21 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o04NHMqn154674 for ; Mon, 4 Jan 2010 17:17:23 -0600 X-ASG-Debug-ID: 1262647092-52bb03840000-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 BEAF211EE87D for ; Mon, 4 Jan 2010 15:18:12 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EqEVzEB3dCXGIbfe for ; Mon, 04 Jan 2010 15:18:12 -0800 (PST) Received: from int-mx04.intmail.prod.int.phx2.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.17]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o04NIAdt031560 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 4 Jan 2010 18:18:11 -0500 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by int-mx04.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o04NI9ia031352; Mon, 4 Jan 2010 18:18:10 -0500 Message-ID: <4B427731.9080801@redhat.com> Date: Mon, 04 Jan 2010 17:18:09 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list , ext4 development CC: Theodore Tso X-ASG-Orig-Subj: [PATCH] xfstests: add another fallocate test to 214 Subject: [PATCH] xfstests: add another fallocate test to 214 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.17 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1262647093 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18970 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean ext4 had a regression where it double-accounted used blocks if you fallocated on top of delalloc blocks. Ted sent a c program to exploit it (see "fsstress-induced corruption reproduced" on linux-ext4 on 12/31/2009) and it's trivial to do the same thing within the xfstests framework using xfs_io. This also changes the handcrafted xfs_io tests to use the _require_xfs_io_falloc helper, not sure how that got missed. Signed-off-by: Eric Sandeen --- diff --git a/214 b/214 index 98cfc3a..35ec2cb 100755 --- a/214 +++ b/214 @@ -52,14 +52,7 @@ _supported_os Linux rm -f $seq.full -testio=`$XFS_IO_PROG -F -f -c "falloc 0 1m" $TEST_DIR/$tmp.io 2>&1` - -# Old xfs_io doesn't have fallocate support -echo $testio | grep -q "not found" && \ - _notrun "xfs_io fallocate support is missing" -# Old glibc, old kernels, and some filesystems don't have fallocate support -echo $testio | grep -q "Operation not supported" && \ - _notrun "xfs_io fallocate command failed (old kernel? wrong fs?)" +_require_xfs_io_falloc # Ok, off we go. @@ -126,6 +119,20 @@ $XFS_IO_PROG -F -f -d \ rm -f $TEST_DIR/ouch +# Reported by Ted Ts'o on linux-ext4, 12/31/2009 +# double-allocation on ext4 when fallocating over delalloc blocks +# Regression due to d21cd8f163ac44b15c465aab7306db931c606908 + +echo "=== delalloc write 16k; fallocate same range ===" +# delalloc write 16k, fallocate same range. +# Should get caught on fsck when we're done. + +$XFS_IO_PROG -F -f \ + -c "pwrite 0 16k" \ + -c "falloc 0 16k" \ + -c "fsync" \ + $TEST_DIR/ouch2 | _filter_xfs_io_unique + # success, all done status=0 exit From SRS0+ix8d+33+fromorbit.com=david@internode.on.net Mon Jan 4 17:27:51 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o04NRpvt155440 for ; Mon, 4 Jan 2010 17:27:51 -0600 X-ASG-Debug-ID: 1262647718-30b7026b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9C4A61C2A89A for ; Mon, 4 Jan 2010 15:28:39 -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 mBGIctfLJ1U1w6cb for ; Mon, 04 Jan 2010 15:28:39 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11039705-1927428 for multiple; Tue, 05 Jan 2010 09:58:37 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NRwLj-00065Z-5r; Tue, 05 Jan 2010 10:28:35 +1100 Date: Tue, 5 Jan 2010 10:28:35 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] XFS: Don't wake the aild once per second Subject: Re: [PATCH 1/2] XFS: Don't wake the aild once per second Message-ID: <20100104232835.GM13802@discord.disaster> References: <1262400215-19443-1-git-send-email-david@fromorbit.com> <1262400215-19443-2-git-send-email-david@fromorbit.com> <20100104151616.GB24810@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100104151616.GB24810@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1262647721 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18971 Rule breakdown below pts rule 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 04, 2010 at 10:16:16AM -0500, Christoph Hellwig wrote: > On Sat, Jan 02, 2010 at 01:43:34PM +1100, Dave Chinner wrote: > > Now that the AIL push algorithm is traversal safe, we don't need a > > watchdog function in the xfsaild to catch pushes that fail to make > > progress. Remove the watchdog timeout and make pushes purely driven > > by demand. This will remove the once-per-second wakeup that is seen > > when the filesystem is idle and make laptop power misers happy. > > Looks good, but a few nitpicks below: > > > - long tout = 0; > > + long tout = 1000; /* milliseconds */ > > Why do we use a timeout when starting up now? If there's a good reason > for it the reason at least should be explained in a comment here. No good reason. > > while (!kthread_should_stop()) { > > - if (tout) > > - schedule_timeout_interruptible(msecs_to_jiffies(tout)); > > - tout = 1000; > > + tout = !tout ? MAX_SCHEDULE_TIMEOUT : msecs_to_jiffies(tout); > > Why not just: > > schedule_timeout_interruptible(tout ? > msecs_to_jiffies(tout) : MAX_SCHEDULE_TIMEOUT); > > that avoids the assignment of different units to the same variable, and > also the negation. Much cleaner. Fixed. > > + long tout = 0; > > xfs_lsn_t last_pushed_lsn = *last_lsn; > > xfs_lsn_t target = ailp->xa_target; > > xfs_lsn_t lsn; > > @@ -279,7 +280,6 @@ xfsaild_push( > > * prevents use from spinning when we can't do anything or there is > > * lots of contention on the AIL lists. > > */ > > - tout = 10; > > lsn = lip->li_lsn; > > flush_log = stuck = count = 0; > > while ((XFS_LSN_CMP(lip->li_lsn, target) < 0)) { > > @@ -376,14 +376,14 @@ xfsaild_push( > > > > if (!count) { > > /* We're past our target or empty, so idle */ > > - tout = 1000; > > + tout = 0; > > tout always is 0 here already. Good catch. Hmm - I just noticed that we should be resetting the last_lsn when we idle. I've fixed that now. > > } else if (XFS_LSN_CMP(lsn, target) >= 0) { > > /* > > * We reached the target so wait a bit longer for I/O to > > * complete and remove pushed items from the AIL before we > > * start the next scan from the start of the AIL. > > */ > > - tout += 20; > > + tout = 50; > > last_pushed_lsn = 0; > > } else if ((stuck * 100) / count > 90) { > > /* > > @@ -395,11 +395,14 @@ xfsaild_push( > > * Backoff a bit more to allow some I/O to complete before > > * continuing from where we were. > > */ > > - tout += 10; > > + tout = 20; > > + } else { > > + /* more to do, but wait a short while before continuing */ > > + tout = 10; > > } > > *last_lsn = last_pushed_lsn; > > return tout; > > -} /* xfsaild_push */ > > +} > > All the += and co here is a bit confusing. We always return 0 now > except for those last two cases that return 20 or 10. So I'd just > change them to a tout = 10/20; I'm not sure what you mean - isn't that what this patch does? i.e. now looks like: if idle tout = 0 else if we reach the target tout = 50 else if stuck tout = 20 else tout = 10 Updated patch below. Cheers, Dave. -- Dave Chinner david@fromorbit.com XFS: Don't wake the aild once per second Now that the AIL push algorithm is traversal safe, we don't need a watchdog function in the xfsaild to catch pushes that fail to make progress. Remove the watchdog timeout and make pushes purely driven by demand. This will remove the once-per-second wakeup that is seen when the filesystem is idle and make laptop power misers happy. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 7 +++---- fs/xfs/xfs_trans_ail.c | 19 +++++++++++-------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 09783cc..0a4fd0e 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -877,12 +877,11 @@ xfsaild( { struct xfs_ail *ailp = data; xfs_lsn_t last_pushed_lsn = 0; - long tout = 0; + long tout = 0; /* milliseconds */ while (!kthread_should_stop()) { - if (tout) - schedule_timeout_interruptible(msecs_to_jiffies(tout)); - tout = 1000; + schedule_timeout_interruptible(tout ? + msecs_to_jiffies(tout) : MAX_SCHEDULE_TIMEOUT); /* swsusp */ try_to_freeze(); diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 2ffc570..063dfbd 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -237,14 +237,15 @@ out: } /* - * Function that does the work of pushing on the AIL + * xfsaild_push does the work of pushing on the AIL. Returning a timeout of + * zero indicates that the caller should sleep until woken. */ long xfsaild_push( struct xfs_ail *ailp, xfs_lsn_t *last_lsn) { - long tout = 1000; /* milliseconds */ + long tout = 0; xfs_lsn_t last_pushed_lsn = *last_lsn; xfs_lsn_t target = ailp->xa_target; xfs_lsn_t lsn; @@ -262,7 +263,7 @@ xfsaild_push( */ xfs_trans_ail_cursor_done(ailp, cur); spin_unlock(&ailp->xa_lock); - last_pushed_lsn = 0; + *last_lsn = 0; return tout; } @@ -279,7 +280,6 @@ xfsaild_push( * prevents use from spinning when we can't do anything or there is * lots of contention on the AIL lists. */ - tout = 10; lsn = lip->li_lsn; flush_log = stuck = count = 0; while ((XFS_LSN_CMP(lip->li_lsn, target) < 0)) { @@ -376,14 +376,14 @@ xfsaild_push( if (!count) { /* We're past our target or empty, so idle */ - tout = 1000; + last_pushed_lsn = 0; } else if (XFS_LSN_CMP(lsn, target) >= 0) { /* * We reached the target so wait a bit longer for I/O to * complete and remove pushed items from the AIL before we * start the next scan from the start of the AIL. */ - tout += 20; + tout = 50; last_pushed_lsn = 0; } else if ((stuck * 100) / count > 90) { /* @@ -395,11 +395,14 @@ xfsaild_push( * Backoff a bit more to allow some I/O to complete before * continuing from where we were. */ - tout += 10; + tout = 20; + } else { + /* more to do, but wait a short while before continuing */ + tout = 10; } *last_lsn = last_pushed_lsn; return tout; -} /* xfsaild_push */ +} /* From SRS0+7eIB+33+fromorbit.com=david@internode.on.net Mon Jan 4 17:51:29 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_74 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o04NpSXU157314 for ; Mon, 4 Jan 2010 17:51:29 -0600 X-ASG-Debug-ID: 1262649137-53a100de0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B67E7EC6682 for ; Mon, 4 Jan 2010 15:52:18 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id LMlUYhdUuz1GohI2 for ; Mon, 04 Jan 2010 15:52:18 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10927764-1927428 for multiple; Tue, 05 Jan 2010 10:22:17 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NRwid-00067V-8V; Tue, 05 Jan 2010 10:52:15 +1100 Date: Tue, 5 Jan 2010 10:52:15 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] XFS: Don't wake xfsbufd when idle Subject: Re: [PATCH 2/2] XFS: Don't wake xfsbufd when idle Message-ID: <20100104235215.GN13802@discord.disaster> References: <1262400215-19443-1-git-send-email-david@fromorbit.com> <1262400215-19443-3-git-send-email-david@fromorbit.com> <20100104152048.GC24810@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100104152048.GC24810@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1262649139 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18972 Rule breakdown below pts rule 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 04, 2010 at 10:20:48AM -0500, Christoph Hellwig wrote: > On Sat, Jan 02, 2010 at 01:43:35PM +1100, Dave Chinner wrote: > > The xfsbufd wakes every xfsbufd_centisecs (once per second by > > default) for each filesystem even when the filesystem is idle. > > If the xfsbufd has nothing to do, put it into a long term sleep > > and only wake it up when there is work pending (i.e. dirty > > buffers to flush soon). This will make laptop power misers happy. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/linux-2.6/xfs_buf.c | 28 +++++++++++++++++++--------- > > 1 files changed, 19 insertions(+), 9 deletions(-) > > > > > STATIC int xfsbufd(void *); > > -STATIC int xfsbufd_wakeup(int, gfp_t); > > +STATIC int xfsbufd_wakeup_all(int, gfp_t); > > this rename seems unrelated to the rest of the patch. For memory reclaim we want to wake up the xfsbufd threads on every single filesystem to free up as much memory as possible. Hence with the addition of demand flushing we have a situation now where we can wakeup either a single xfsbufd or we need to wake up all of them. It seemed right to make the distinction clear by renaming the function. I can drop it if this doesn't make sense.... > > @@ -1595,6 +1595,11 @@ xfs_buf_delwri_queue( > > list_del(&bp->b_list); > > } > > > > + if (list_empty(dwq)) { > > + /* start xfsbufd as it has something to do now */ > > + wake_up_process(bp->b_target->bt_task); > > + } > > Does it make sense to wake xfsbufd before actually adding the item and > unlocking the queue lock? Shouldn't this be defered until after the > addition? I did it to avoid a temp var - if the xfsbufd runs before we finish here then is will spin on the lock until we have added the buffer to the list and dropped the lock. wake_up_process() is safe to call under a spinlock, so that is not an issue here. Also, the xfsbufd checks for an empty list before it sleeps, so on wakeup it will always see the newly added buffer because it tries unconditionally to dequeue buffers on wakeup. Hence I think this is safe and race free. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+ix8d+33+fromorbit.com=david@internode.on.net Mon Jan 4 17:52:22 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o04NqMbF157379 for ; Mon, 4 Jan 2010 17:52:22 -0600 X-ASG-Debug-ID: 1262649191-23d4033c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 73F081C2A854 for ; Mon, 4 Jan 2010 15:53:12 -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 xhPUCbdmH4pg2gf0 for ; Mon, 04 Jan 2010 15:53:12 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11050412-1927428 for multiple; Tue, 05 Jan 2010 10:23:10 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NRwjV-00067w-OH; Tue, 05 Jan 2010 10:53:09 +1100 Date: Tue, 5 Jan 2010 10:53:09 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/3] XFS: Sort delayed write buffers before dispatch Subject: Re: [PATCH 3/3] XFS: Sort delayed write buffers before dispatch Message-ID: <20100104235309.GO13802@discord.disaster> References: <1262401416-19546-1-git-send-email-david@fromorbit.com> <1262401416-19546-4-git-send-email-david@fromorbit.com> <20100104154331.GA7924@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100104154331.GA7924@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1262649193 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18973 Rule breakdown below pts rule 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 04, 2010 at 10:43:31AM -0500, Christoph Hellwig wrote: > On Sat, Jan 02, 2010 at 02:03:36PM +1100, Dave Chinner wrote: > > Ideally this should use a list sort rather than requiring an > > external buffer to sort the buffers in, but for simplicity > > just do it via sort function. Followup patches are needed to > > take the list sort functions from the DRM and UBIFS code and > > make it a common function and to utilise it. That will allow > > sorting the entire delwri queue to be written in one go. > > > Maybe getting the common list sort in ASAP might be a good idea. That > way we could have it ready by the time this patchset is merged. If not > adding a new list sort to XFS temporarily might be a better idea than > artifically flattening the list. I'm about to post that and an updated patch series to use it. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+3fdM+33+fromorbit.com=dave@internode.on.net Mon Jan 4 17:59:03 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_44,LOCAL_GNU_PATCH autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o04Nx2Kq157804 for ; Mon, 4 Jan 2010 17:59:03 -0600 X-ASG-Debug-ID: 1262649591-23b903e30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9AC5C13F0F9 for ; Mon, 4 Jan 2010 15:59:52 -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 zcRoNCg6hj7acNGN for ; Mon, 04 Jan 2010 15:59:52 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10964863-1927428 for multiple; Tue, 05 Jan 2010 10:28:47 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NRwov-00068I-GJ; Tue, 05 Jan 2010 10:58:45 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NRwlD-0007P2-PD; Tue, 05 Jan 2010 10:54:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-kernel@vger.kernel.org, Dave Airlie , Artem Bityutskiy , Adrian Hunter X-ASG-Orig-Subj: [PATCH] sort: Introduce generic list_sort function Subject: [PATCH] sort: Introduce generic list_sort function Date: Tue, 5 Jan 2010 10:54:55 +1100 Message-Id: <1262649295-28427-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1262649593 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18973 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean There are two copies of list_sort() in the tree already, one in the DRM code, another in ubifs. Now XFS needs this as well. Create a generic list_sort() function from the ubifs version and convert existing users to it so we don't end up with yet another copy in the tree. CC: Dave Airlie CC: Artem Bityutskiy CC: Adrian Hunter Signed-off-by: Dave Chinner --- drivers/gpu/drm/drm_modes.c | 90 ++-------------------------------------- fs/ubifs/gc.c | 95 ------------------------------------------ include/linux/sort.h | 5 ++ lib/sort.c | 97 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 181 deletions(-) diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index 51f6772..3846ed4 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c @@ -1,9 +1,4 @@ /* - * The list_sort function is (presumably) licensed under the GPL (see the - * top level "COPYING" file for details). - * - * The remainder of this file is: - * * Copyright © 1997-2003 by The XFree86 Project, Inc. * Copyright © 2007 Dave Airlie * Copyright © 2007-2008 Intel Corporation @@ -36,6 +31,7 @@ */ #include +#include #include "drmP.h" #include "drm.h" #include "drm_crtc.h" @@ -829,6 +825,7 @@ EXPORT_SYMBOL(drm_mode_prune_invalid); /** * drm_mode_compare - compare modes for favorability + * @priv: unused * @lh_a: list_head for first mode * @lh_b: list_head for second mode * @@ -842,7 +839,7 @@ EXPORT_SYMBOL(drm_mode_prune_invalid); * Negative if @lh_a is better than @lh_b, zero if they're equivalent, or * positive if @lh_b is better than @lh_a. */ -static int drm_mode_compare(struct list_head *lh_a, struct list_head *lh_b) +static int drm_mode_compare(void *priv, struct list_head *lh_a, struct list_head *lh_b) { struct drm_display_mode *a = list_entry(lh_a, struct drm_display_mode, head); struct drm_display_mode *b = list_entry(lh_b, struct drm_display_mode, head); @@ -859,85 +856,6 @@ static int drm_mode_compare(struct list_head *lh_a, struct list_head *lh_b) return diff; } -/* FIXME: what we don't have a list sort function? */ -/* list sort from Mark J Roberts (mjr@znex.org) */ -void list_sort(struct list_head *head, - int (*cmp)(struct list_head *a, struct list_head *b)) -{ - struct list_head *p, *q, *e, *list, *tail, *oldhead; - int insize, nmerges, psize, qsize, i; - - list = head->next; - list_del(head); - insize = 1; - for (;;) { - p = oldhead = list; - list = tail = NULL; - nmerges = 0; - - while (p) { - nmerges++; - q = p; - psize = 0; - for (i = 0; i < insize; i++) { - psize++; - q = q->next == oldhead ? NULL : q->next; - if (!q) - break; - } - - qsize = insize; - while (psize > 0 || (qsize > 0 && q)) { - if (!psize) { - e = q; - q = q->next; - qsize--; - if (q == oldhead) - q = NULL; - } else if (!qsize || !q) { - e = p; - p = p->next; - psize--; - if (p == oldhead) - p = NULL; - } else if (cmp(p, q) <= 0) { - e = p; - p = p->next; - psize--; - if (p == oldhead) - p = NULL; - } else { - e = q; - q = q->next; - qsize--; - if (q == oldhead) - q = NULL; - } - if (tail) - tail->next = e; - else - list = e; - e->prev = tail; - tail = e; - } - p = q; - } - - tail->next = list; - list->prev = tail; - - if (nmerges <= 1) - break; - - insize *= 2; - } - - head->next = list; - head->prev = list->prev; - list->prev->next = head; - list->prev = head; -} - /** * drm_mode_sort - sort mode list * @mode_list: list to sort @@ -949,7 +867,7 @@ void list_sort(struct list_head *head, */ void drm_mode_sort(struct list_head *mode_list) { - list_sort(mode_list, drm_mode_compare); + list_sort(NULL, mode_list, drm_mode_compare); } EXPORT_SYMBOL(drm_mode_sort); diff --git a/fs/ubifs/gc.c b/fs/ubifs/gc.c index 618c270..4976e07 100644 --- a/fs/ubifs/gc.c +++ b/fs/ubifs/gc.c @@ -108,101 +108,6 @@ static int switch_gc_head(struct ubifs_info *c) } /** - * list_sort - sort a list. - * @priv: private data, passed to @cmp - * @head: the list to sort - * @cmp: the elements comparison function - * - * This function has been implemented by Mark J Roberts . It - * implements "merge sort" which has O(nlog(n)) complexity. The list is sorted - * in ascending order. - * - * The comparison function @cmp is supposed to return a negative value if @a is - * than @b, and a positive value if @a is greater than @b. If @a and @b are - * equivalent, then it does not matter what this function returns. - */ -static void list_sort(void *priv, struct list_head *head, - int (*cmp)(void *priv, struct list_head *a, - struct list_head *b)) -{ - struct list_head *p, *q, *e, *list, *tail, *oldhead; - int insize, nmerges, psize, qsize, i; - - if (list_empty(head)) - return; - - list = head->next; - list_del(head); - insize = 1; - for (;;) { - p = oldhead = list; - list = tail = NULL; - nmerges = 0; - - while (p) { - nmerges++; - q = p; - psize = 0; - for (i = 0; i < insize; i++) { - psize++; - q = q->next == oldhead ? NULL : q->next; - if (!q) - break; - } - - qsize = insize; - while (psize > 0 || (qsize > 0 && q)) { - if (!psize) { - e = q; - q = q->next; - qsize--; - if (q == oldhead) - q = NULL; - } else if (!qsize || !q) { - e = p; - p = p->next; - psize--; - if (p == oldhead) - p = NULL; - } else if (cmp(priv, p, q) <= 0) { - e = p; - p = p->next; - psize--; - if (p == oldhead) - p = NULL; - } else { - e = q; - q = q->next; - qsize--; - if (q == oldhead) - q = NULL; - } - if (tail) - tail->next = e; - else - list = e; - e->prev = tail; - tail = e; - } - p = q; - } - - tail->next = list; - list->prev = tail; - - if (nmerges <= 1) - break; - - insize *= 2; - } - - head->next = list; - head->prev = list->prev; - list->prev->next = head; - list->prev = head; -} - -/** * data_nodes_cmp - compare 2 data nodes. * @priv: UBIFS file-system description object * @a: first data node diff --git a/include/linux/sort.h b/include/linux/sort.h index d534da2..99a2ed5 100644 --- a/include/linux/sort.h +++ b/include/linux/sort.h @@ -3,8 +3,13 @@ #include +struct list_head; + void sort(void *base, size_t num, size_t size, int (*cmp)(const void *, const void *), void (*swap)(void *, void *, int)); +void list_sort(void *priv, struct list_head *head, + int (*cmp)(void *priv, struct list_head *a, + struct list_head *b)); #endif diff --git a/lib/sort.c b/lib/sort.c index 926d004..1772c45 100644 --- a/lib/sort.c +++ b/lib/sort.c @@ -8,6 +8,7 @@ #include #include #include +#include static void u32_swap(void *a, void *b, int size) { @@ -121,3 +122,99 @@ static int sort_test(void) module_init(sort_test); #endif + +/** + * list_sort - sort a list. + * @priv: private data, passed to @cmp + * @head: the list to sort + * @cmp: the elements comparison function + * + * This function has been implemented by Mark J Roberts . It + * implements "merge sort" which has O(nlog(n)) complexity. The list is sorted + * in ascending order. + * + * The comparison function @cmp is supposed to return a negative value if @a is + * than @b, and a positive value if @a is greater than @b. If @a and @b are + * equivalent, then it does not matter what this function returns. + */ +void list_sort(void *priv, struct list_head *head, + int (*cmp)(void *priv, struct list_head *a, + struct list_head *b)) +{ + struct list_head *p, *q, *e, *list, *tail, *oldhead; + int insize, nmerges, psize, qsize, i; + + if (list_empty(head)) + return; + + list = head->next; + list_del(head); + insize = 1; + for (;;) { + p = oldhead = list; + list = tail = NULL; + nmerges = 0; + + while (p) { + nmerges++; + q = p; + psize = 0; + for (i = 0; i < insize; i++) { + psize++; + q = q->next == oldhead ? NULL : q->next; + if (!q) + break; + } + + qsize = insize; + while (psize > 0 || (qsize > 0 && q)) { + if (!psize) { + e = q; + q = q->next; + qsize--; + if (q == oldhead) + q = NULL; + } else if (!qsize || !q) { + e = p; + p = p->next; + psize--; + if (p == oldhead) + p = NULL; + } else if (cmp(priv, p, q) <= 0) { + e = p; + p = p->next; + psize--; + if (p == oldhead) + p = NULL; + } else { + e = q; + q = q->next; + qsize--; + if (q == oldhead) + q = NULL; + } + if (tail) + tail->next = e; + else + list = e; + e->prev = tail; + tail = e; + } + p = q; + } + + tail->next = list; + list->prev = tail; + + if (nmerges <= 1) + break; + + insize *= 2; + } + + head->next = list; + head->prev = list->prev; + list->prev->next = head; + list->prev = head; +} + -- 1.6.5 From SRS0+2nn4+34+fromorbit.com=dave@internode.on.net Mon Jan 4 18:07:29 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_54 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o0507SgH158242 for ; Mon, 4 Jan 2010 18:07:29 -0600 X-ASG-Debug-ID: 1262650098-23d8036d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E20E41C2A907 for ; Mon, 4 Jan 2010 16:08:18 -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 EAtpHtj4QU8RWVJS for ; Mon, 04 Jan 2010 16:08:18 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11041845-1927428 for ; Tue, 05 Jan 2010 10:38:17 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NRwy7-00069S-Fp for xfs@oss.sgi.com; Tue, 05 Jan 2010 11:08:15 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NRwuP-0007R5-Tp for xfs@oss.sgi.com; Tue, 05 Jan 2010 11:04:25 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/3] Kill async inode writeback V2 Subject: [PATCH 0/3] Kill async inode writeback V2 Date: Tue, 5 Jan 2010 11:04:18 +1100 Message-Id: <1262649861-28530-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1262650099 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18973 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Currently we do background inode writeback on demand from many different places - xfssyncd, xfsbufd, xfsaild and the bdi writeback threads. The result is that inodes can be pushed at any time and there is little to no locality to the IO patterns results from such writeback. Indeed, we can have completing writebacks occurring which only serves to slow down writeback. The idea behind this series is to make metadata buffers get written from xfsbufd via the delayed write queue rather than than from all these other places. All the other places do is make the buffers delayed write so that the xfsbufd can issue them. This means that inode flushes can no longer happen asynchronously, but we still need a method for ensuring timely dispatch of buffers that we may be waiting for IO completion on. To do this, we allow delayed write buffers to be "promoted" in the delayed write queue. This effectively short-cuts the aging of the buffers, and combined with a demand flush of the xfsbufd we push all aged and promoted buffers out at the same time. Combine this with sorting the delayed write buffers to be written into disk offset order before dispatch, and we vastly improve the IO patterns for metadata writeback. IO is issued from one place and in a disk/elevator friendly order. Version 2: - use generic list sort function - when unmounting, push the delwri buffers first, then do sync inode reclaim so that reclaim doesn't block for 15 seconds waiting for delwri inode buffers to be aged and written before the inodes can be reclaimed. Perf results (average of 3 runs) on a debug XFS build (means allocation patterns are randomly varied, so runtimes are also a bit variable): Untar 2.6.32 kernel tarball, sync, then remove: Untar+sync rm -rf xfs-dev: 25.2s 13.0s xfs-dev-delwri-1: 22.5s 9.1s xfs-dev-delwri-2: 21.9s 8.4s 4 processes each creating 100,000, five byte files in separate directories concurrently, then 4 processes removing a directory each concurrently. create rm -rf xfs-dev: 8m32s 4m10s xfs-dev-delwri-1: 4m55s 3m42s xfs-dev-delwri-2: 4m56s 3m33s From SRS0+m/r0+34+fromorbit.com=dave@internode.on.net Mon Jan 4 18:07:30 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o0507U9H158256 for ; Mon, 4 Jan 2010 18:07:30 -0600 X-ASG-Debug-ID: 1262650098-5c1200e80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BDCB5EC63BE for ; Mon, 4 Jan 2010 16:08:19 -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 4nja822nlXmXBYqr for ; Mon, 04 Jan 2010 16:08:19 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10928642-1927428 for ; Tue, 05 Jan 2010 10:38:18 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NRwy7-00069T-Hf for xfs@oss.sgi.com; Tue, 05 Jan 2010 11:08:15 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NRwuP-0007R7-VV for xfs@oss.sgi.com; Tue, 05 Jan 2010 11:04:25 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/3] xfs: Use delayed write for inodes rather than async Subject: [PATCH 1/3] xfs: Use delayed write for inodes rather than async Date: Tue, 5 Jan 2010 11:04:19 +1100 Message-Id: <1262649861-28530-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1262649861-28530-1-git-send-email-david@fromorbit.com> References: <1262649861-28530-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1262650100 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18974 Rule breakdown below pts rule 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 currently do background inode flush asynchronously, resulting in inodes being written in whatever order the background writeback issues them. Make the inode flush delayed write instead of asynchronous which will push the inode into the backing buffer but not issue any IO. The buffer will then sit in cache to be flushed by either an AIL push or the xfsbufd timing out the buffer. This will allow accumulation of dirty inode buffers in memory and allow optimisation of inode cluster writeback at the xfsbufd level where we have much greater queue depths than the block layer elevators. This effectively means that any inode that is written back by background writeback will be seen as flush locked during AIL pushing, and will result in the buffers being pushed from there. A future path will address this non-optimal form of writeback, too. A side effect of this delayed write mechanism is that background inode reclaim will no longer directly flush inodes, nor can it wait on the flush lock. The result is that inode reclaim must leave the inode in the reclaimable state until it is clean. Hence attempts to reclaim a dirty inode in the background will simply skip the inode until it is clean and this allows other mechanisms (i.e. xfsbufd) to do more optimal writeback of the dirty buffers. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 2 +- fs/xfs/linux-2.6/xfs_sync.c | 52 +++++++++++++++++++++++++++++------------- fs/xfs/xfs_inode.c | 31 ++++--------------------- fs/xfs/xfs_inode.h | 8 ++---- fs/xfs/xfs_inode_item.c | 10 +++++-- fs/xfs/xfs_mount.c | 9 ++++++- 6 files changed, 60 insertions(+), 52 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 0a4fd0e..f3dd67d 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1074,7 +1074,7 @@ xfs_fs_write_inode( if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip)) goto out_unlock; - error = xfs_iflush(ip, XFS_IFLUSH_ASYNC_NOBLOCK); + error = xfs_iflush(ip, XFS_IFLUSH_DELWRI_NOBLOCK); } out_unlock: diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index c980d68..f974d1a 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -460,8 +460,8 @@ xfs_quiesce_fs( { int count = 0, pincount; + xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI); xfs_flush_buftarg(mp->m_ddev_targp, 0); - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI_ELSE_ASYNC); /* * This loop must run at least twice. The first instance of the loop @@ -585,7 +585,7 @@ xfs_sync_worker( if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI_ELSE_ASYNC); + xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI); /* dgc: errors ignored here */ error = xfs_qm_sync(mp, SYNC_TRYLOCK); error = xfs_sync_fsdata(mp, SYNC_TRYLOCK); @@ -687,7 +687,7 @@ xfs_reclaim_inode( spin_unlock(&ip->i_flags_lock); write_unlock(&pag->pag_ici_lock); xfs_perag_put(pag); - return -EAGAIN; + return EAGAIN; } __xfs_iflags_set(ip, XFS_IRECLAIM); spin_unlock(&ip->i_flags_lock); @@ -695,32 +695,52 @@ xfs_reclaim_inode( xfs_perag_put(pag); /* - * If the inode is still dirty, then flush it out. If the inode - * is not in the AIL, then it will be OK to flush it delwri as - * long as xfs_iflush() does not keep any references to the inode. - * We leave that decision up to xfs_iflush() since it has the - * knowledge of whether it's OK to simply do a delwri flush of - * the inode or whether we need to wait until the inode is - * pulled from the AIL. - * We get the flush lock regardless, though, just to make sure - * we don't free it while it is being flushed. + * The inode is flushed delayed write. That means the flush lock + * may be held here and we will block for some time on it. Further, + * if we hold the inode lock, we prevent the AIL from locking and + * therefore being able to push the buffer. This means that we'll end + * up waiting here for the xfsbufd to age the buffer and write it out, + * which could be a long time. If we fail to get the flush lock, just + * clear the reclaim in progress state (we haven't cleared the reclaim + * needed state) so that the reclaim is delayed until the flush lock + * can be gained without blocking. */ xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_iflock(ip); + if (!xfs_iflock_nowait(ip)) + goto unlock_and_requeue; /* * In the case of a forced shutdown we rely on xfs_iflush() to * wait for the inode to be unpinned before returning an error. */ - if (!is_bad_inode(VFS_I(ip)) && xfs_iflush(ip, sync_mode) == 0) { - /* synchronize with xfs_iflush_done */ - xfs_iflock(ip); + if (!is_bad_inode(VFS_I(ip)) && !xfs_inode_clean(ip)) { + /* + * If we are flushing a dirty inode DELWRI, then don't + * immediately wait on the flush lock - requeue the inode for + * reclaim. Every time we re-enter and the flush lock is still + * held we will requeue at the initial flush lock check above. + * Otherwise, for synchronous writeback we synchronize with + * xfs_iflush_done by locking and unlocking the flush lock. + */ + if (xfs_iflush(ip, sync_mode) == 0) { + if (sync_mode == XFS_IFLUSH_DELWRI) + goto unlock_and_requeue; + xfs_iflock(ip); + xfs_ifunlock(ip); + } + } else { + /* need to unlock the clean inodes */ xfs_ifunlock(ip); } xfs_iunlock(ip, XFS_ILOCK_EXCL); xfs_ireclaim(ip); return 0; + +unlock_and_requeue: + xfs_iflags_clear(ip, XFS_IRECLAIM); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return EAGAIN; } void diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e5c9953..d175dca 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2832,7 +2832,7 @@ xfs_iflush( xfs_dinode_t *dip; xfs_mount_t *mp; int error; - int noblock = (flags == XFS_IFLUSH_ASYNC_NOBLOCK); + int noblock = (flags == XFS_IFLUSH_DELWRI_NOBLOCK); enum { INT_DELWRI = (1 << 0), INT_ASYNC = (1 << 1) }; XFS_STATS_INC(xs_iflush_count); @@ -2905,12 +2905,8 @@ xfs_iflush( case XFS_IFLUSH_DELWRI_ELSE_SYNC: flags = 0; break; - case XFS_IFLUSH_ASYNC_NOBLOCK: - case XFS_IFLUSH_ASYNC: - case XFS_IFLUSH_DELWRI_ELSE_ASYNC: - flags = INT_ASYNC; - break; case XFS_IFLUSH_DELWRI: + case XFS_IFLUSH_DELWRI_NOBLOCK: flags = INT_DELWRI; break; default: @@ -2920,15 +2916,11 @@ xfs_iflush( } } else { switch (flags) { + case XFS_IFLUSH_DELWRI_NOBLOCK: case XFS_IFLUSH_DELWRI_ELSE_SYNC: - case XFS_IFLUSH_DELWRI_ELSE_ASYNC: case XFS_IFLUSH_DELWRI: flags = INT_DELWRI; break; - case XFS_IFLUSH_ASYNC_NOBLOCK: - case XFS_IFLUSH_ASYNC: - flags = INT_ASYNC; - break; case XFS_IFLUSH_SYNC: flags = 0; break; @@ -2971,13 +2963,10 @@ xfs_iflush( if (error) goto cluster_corrupt_out; - if (flags & INT_DELWRI) { + if (flags & INT_DELWRI) xfs_bdwrite(mp, bp); - } else if (flags & INT_ASYNC) { - error = xfs_bawrite(mp, bp); - } else { + else error = xfs_bwrite(mp, bp); - } return error; corrupt_out: @@ -3012,16 +3001,6 @@ xfs_iflush_int( iip = ip->i_itemp; mp = ip->i_mount; - - /* - * If the inode isn't dirty, then just release the inode - * flush lock and do nothing. - */ - if (xfs_inode_clean(ip)) { - xfs_ifunlock(ip); - return 0; - } - /* set *dip = inode's place in the buffer */ dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index ec1f28c..559feeb 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -423,11 +423,9 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) * 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 +#define XFS_IFLUSH_SYNC 2 +#define XFS_IFLUSH_DELWRI 3 +#define XFS_IFLUSH_DELWRI_NOBLOCK 4 /* * Flags for xfs_itruncate_start(). diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index f38855d..beb7d9f 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -867,10 +867,14 @@ xfs_inode_item_push( iip->ili_format.ilf_fields != 0); /* - * Write out the inode. The completion routine ('iflush_done') will - * pull it from the AIL, mark it clean, unlock the flush lock. + * Push the inode to it's backing buffer. This will not remove + * the inode from the AIL - a further push will be required to trigger + * a buffer push. However, this allows all the dirty inodes to be pushed to + * the buffer before it is pushed to disk. THe buffer IO completion + * will pull th einode from the AIL, mark it clean and unlock the flush + * lock. */ - (void) xfs_iflush(ip, XFS_IFLUSH_ASYNC); + (void) xfs_iflush(ip, XFS_IFLUSH_DELWRI); xfs_iunlock(ip, XFS_ILOCK_SHARED); return; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 223d9c3..16c4654 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1444,7 +1444,14 @@ xfs_unmountfs( * need to force the log first. */ xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE | XFS_LOG_SYNC); - xfs_reclaim_inodes(mp, XFS_IFLUSH_ASYNC); + + /* + * flush the delwri buffers before the reclaim so that it doesn't + * block for a long time waiting to reclaim inodes that are already + * in the delwri state. + */ + XFS_bflush(mp->m_ddev_targp); + xfs_reclaim_inodes(mp, XFS_IFLUSH_SYNC); xfs_qm_unmount(mp); -- 1.6.5 From SRS0+m/r0+34+fromorbit.com=dave@internode.on.net Mon Jan 4 18:07:30 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o0507UM5158255 for ; Mon, 4 Jan 2010 18:07:30 -0600 X-ASG-Debug-ID: 1262650097-5371014f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 48B43EC63BB for ; Mon, 4 Jan 2010 16:08:18 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id 3KZL0I75DQj0tRVJ for ; Mon, 04 Jan 2010 16:08:18 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 10928640-1927428 for ; Tue, 05 Jan 2010 10:38:17 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NRwy7-00069U-JE for xfs@oss.sgi.com; Tue, 05 Jan 2010 11:08:15 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NRwuQ-0007R9-2E for xfs@oss.sgi.com; Tue, 05 Jan 2010 11:04:26 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/3] xfs: Don't issue buffer IO direct from AIL push Subject: [PATCH 2/3] xfs: Don't issue buffer IO direct from AIL push Date: Tue, 5 Jan 2010 11:04:20 +1100 Message-Id: <1262649861-28530-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1262649861-28530-1-git-send-email-david@fromorbit.com> References: <1262649861-28530-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1262650100 X-Barracuda-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.18974 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 All buffers logged into the AIL are marked as delayed write. When the AIL needs to push the buffer out, it issues an async write of the buffer. This means that IO patterns are dependent on the order of buffers in the AIL. Instead of flushing the buffer, promote the buffer in the delayed write list so that the next time the xfsbufd is run the buffer will be flushed by the xfsbufd. Return the state to the xfsaild that the buffer was promoted so that the xfsaild knows that it needs to cause the xfsbufd to run to flush the buffers that were promoted. Using the xfsbufd for issuing the IO allows us to dispatch all buffer IO from the one queue. This means that we can make much more enlightened decisions on what order to flush buffers to disk as we don't have multiple places issuing IO. Optimisations to xfsbufd will be in a future patch. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_buf.c | 22 +++++++++ fs/xfs/linux-2.6/xfs_buf.h | 11 +++++ fs/xfs/linux-2.6/xfs_trace.h | 1 + fs/xfs/quota/xfs_dquot_item.c | 87 +++++------------------------------ fs/xfs/quota/xfs_dquot_item.h | 4 -- fs/xfs/xfs_buf_item.c | 64 ++++++++++++++------------ fs/xfs/xfs_inode_item.c | 99 ++++++---------------------------------- fs/xfs/xfs_inode_item.h | 6 --- fs/xfs/xfs_trans_ail.c | 7 +++ 9 files changed, 104 insertions(+), 197 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 759cbaf..aaefc33 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -1631,6 +1631,28 @@ xfs_buf_delwri_dequeue( trace_xfs_buf_delwri_dequeue(bp, _RET_IP_); } +/* + * If a delwri buffer needs to be pushed before it has aged out, then + * promote it to the head of the delwri queue so that it will be flushed + * on the next xfsbufd run. + */ +void +xfs_buf_delwri_promote( + xfs_buf_t *bp) +{ + struct list_head *dwq = &bp->b_target->bt_delwrite_queue; + spinlock_t *dwlk = &bp->b_target->bt_delwrite_lock; + long age = xfs_buf_age_centisecs * msecs_to_jiffies(10) + 1; + + spin_lock(dwlk); + ASSERT(bp->b_flags & XBF_DELWRI); + ASSERT(bp->b_flags & _XBF_DELWRI_Q); + list_del(&bp->b_list); + list_add(&bp->b_list, dwq); + bp->b_queuetime = jiffies - age; + spin_unlock(dwlk); +} + STATIC void xfs_buf_runall_queues( struct workqueue_struct *queue) diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index a34c7b5..a7c6895 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h @@ -261,6 +261,7 @@ extern int xfs_buf_ispin(xfs_buf_t *); /* Delayed Write Buffer Routines */ extern void xfs_buf_delwri_dequeue(xfs_buf_t *); +extern void xfs_buf_delwri_promote(xfs_buf_t *); /* Buffer Daemon Setup Routines */ extern int xfs_buf_init(void); @@ -424,6 +425,16 @@ extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *); extern void xfs_wait_buftarg(xfs_buftarg_t *); extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int); extern int xfs_flush_buftarg(xfs_buftarg_t *, int); + +/* + * run the xfsbufd on demand to age buffers. Use in combination with + * xfs_buf_delwri_promote() to flus delayed write buffers efficiently. + */ +static inline void xfs_flush_buftarg_delwri(xfs_buftarg_t *btp) +{ + wake_up_process(btp->bt_task); +} + #ifdef CONFIG_KDB_MODULES extern struct list_head *xfs_get_buftarg_list(void); #endif diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 2b0819a..bba87b7 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -464,6 +464,7 @@ DEFINE_BUF_ITEM_EVENT(xfs_buf_item_unlock); DEFINE_BUF_ITEM_EVENT(xfs_buf_item_unlock_stale); DEFINE_BUF_ITEM_EVENT(xfs_buf_item_committed); DEFINE_BUF_ITEM_EVENT(xfs_buf_item_push); +DEFINE_BUF_ITEM_EVENT(xfs_buf_item_pushbuf); DEFINE_BUF_ITEM_EVENT(xfs_trans_get_buf); DEFINE_BUF_ITEM_EVENT(xfs_trans_get_buf_recur); DEFINE_BUF_ITEM_EVENT(xfs_trans_getsb); diff --git a/fs/xfs/quota/xfs_dquot_item.c b/fs/xfs/quota/xfs_dquot_item.c index d0d4a9a..bc7e00e 100644 --- a/fs/xfs/quota/xfs_dquot_item.c +++ b/fs/xfs/quota/xfs_dquot_item.c @@ -212,68 +212,33 @@ xfs_qm_dquot_logitem_pushbuf( xfs_dquot_t *dqp; xfs_mount_t *mp; xfs_buf_t *bp; - uint dopush; dqp = qip->qli_dquot; ASSERT(XFS_DQ_IS_LOCKED(dqp)); /* - * The qli_pushbuf_flag keeps others from - * trying to duplicate our effort. - */ - ASSERT(qip->qli_pushbuf_flag != 0); - ASSERT(qip->qli_push_owner == current_pid()); - - /* * If flushlock isn't locked anymore, chances are that the * inode flush completed and the inode was taken off the AIL. * So, just get out. */ if (completion_done(&dqp->q_flush) || ((qip->qli_item.li_flags & XFS_LI_IN_AIL) == 0)) { - qip->qli_pushbuf_flag = 0; xfs_dqunlock(dqp); return; } mp = dqp->q_mount; bp = xfs_incore(mp->m_ddev_targp, qip->qli_format.qlf_blkno, - XFS_QI_DQCHUNKLEN(mp), - XFS_INCORE_TRYLOCK); - if (bp != NULL) { - if (XFS_BUF_ISDELAYWRITE(bp)) { - dopush = ((qip->qli_item.li_flags & XFS_LI_IN_AIL) && - !completion_done(&dqp->q_flush)); - qip->qli_pushbuf_flag = 0; - xfs_dqunlock(dqp); - - if (XFS_BUF_ISPINNED(bp)) { - xfs_log_force(mp, (xfs_lsn_t)0, - XFS_LOG_FORCE); - } - if (dopush) { - int error; -#ifdef XFSRACEDEBUG - delay_for_intr(); - delay(300); -#endif - error = xfs_bawrite(mp, bp); - if (error) - xfs_fs_cmn_err(CE_WARN, mp, - "xfs_qm_dquot_logitem_pushbuf: pushbuf error %d on qip %p, bp %p", - error, qip, bp); - } else { - xfs_buf_relse(bp); - } - } else { - qip->qli_pushbuf_flag = 0; - xfs_dqunlock(dqp); - xfs_buf_relse(bp); - } + XFS_QI_DQCHUNKLEN(mp), XFS_INCORE_TRYLOCK); + if (!bp) { + xfs_dqunlock(dqp); return; } - qip->qli_pushbuf_flag = 0; xfs_dqunlock(dqp); + if (XFS_BUF_ISDELAYWRITE(bp)) + xfs_buf_delwri_promote(bp); + xfs_buf_relse(bp); + return; } /* @@ -291,50 +256,24 @@ xfs_qm_dquot_logitem_trylock( xfs_dq_logitem_t *qip) { xfs_dquot_t *dqp; - uint retval; dqp = qip->qli_dquot; if (atomic_read(&dqp->q_pincount) > 0) - return (XFS_ITEM_PINNED); + return XFS_ITEM_PINNED; if (! xfs_qm_dqlock_nowait(dqp)) - return (XFS_ITEM_LOCKED); + return XFS_ITEM_LOCKED; - retval = XFS_ITEM_SUCCESS; if (!xfs_dqflock_nowait(dqp)) { /* - * The dquot is already being flushed. It may have been - * flushed delayed write, however, and we don't want to - * get stuck waiting for that to complete. So, we want to check - * to see if we can lock the dquot's buffer without sleeping. - * If we can and it is marked for delayed write, then we - * hold it and send it out from the push routine. We don't - * want to do that now since we might sleep in the device - * strategy routine. We also don't want to grab the buffer lock - * here because we'd like not to call into the buffer cache - * while holding the AIL lock. - * Make sure to only return PUSHBUF if we set pushbuf_flag - * ourselves. If someone else is doing it then we don't - * want to go to the push routine and duplicate their efforts. + * dquot has already been flushed to the backing buffer, + * leave it locked, pushbuf routine will unlock it. */ - if (qip->qli_pushbuf_flag == 0) { - qip->qli_pushbuf_flag = 1; - ASSERT(qip->qli_format.qlf_blkno == dqp->q_blkno); -#ifdef DEBUG - qip->qli_push_owner = current_pid(); -#endif - /* - * The dquot is left locked. - */ - retval = XFS_ITEM_PUSHBUF; - } else { - retval = XFS_ITEM_FLUSHING; - xfs_dqunlock_nonotify(dqp); - } + return XFS_ITEM_PUSHBUF; } ASSERT(qip->qli_item.li_flags & XFS_LI_IN_AIL); - return (retval); + return XFS_ITEM_SUCCESS; } diff --git a/fs/xfs/quota/xfs_dquot_item.h b/fs/xfs/quota/xfs_dquot_item.h index 5a63253..5acae2a 100644 --- a/fs/xfs/quota/xfs_dquot_item.h +++ b/fs/xfs/quota/xfs_dquot_item.h @@ -27,10 +27,6 @@ typedef struct xfs_dq_logitem { xfs_log_item_t qli_item; /* common portion */ struct xfs_dquot *qli_dquot; /* dquot ptr */ xfs_lsn_t qli_flush_lsn; /* lsn at last flush */ - unsigned short qli_pushbuf_flag; /* 1 bit used in push_ail */ -#ifdef DEBUG - uint64_t qli_push_owner; -#endif xfs_dq_logformat_t qli_format; /* logged structure */ } xfs_dq_logitem_t; diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index a30f7e9..0f30250 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -467,8 +467,10 @@ xfs_buf_item_unpin_remove( /* * This is called to attempt to lock the buffer associated with this * buf log item. Don't sleep on the buffer lock. If we can't get - * the lock right away, return 0. If we can get the lock, pull the - * buffer from the free list, mark it busy, and return 1. + * the lock right away, return 0. If we can get the lock, take a + * reference to the buffer. If this is a delayed write buffer that + * needs AIL help to be written back, invoke the pushbuf routine + * rather than the normal success path. */ STATIC uint xfs_buf_item_trylock( @@ -477,24 +479,18 @@ xfs_buf_item_trylock( xfs_buf_t *bp; bp = bip->bli_buf; - - if (XFS_BUF_ISPINNED(bp)) { + if (XFS_BUF_ISPINNED(bp)) return XFS_ITEM_PINNED; - } - - if (!XFS_BUF_CPSEMA(bp)) { + if (!XFS_BUF_CPSEMA(bp)) return XFS_ITEM_LOCKED; - } - /* - * Remove the buffer from the free list. Only do this - * if it's on the free list. Private buffers like the - * superblock buffer are not. - */ + /* take a reference to the buffer. */ XFS_BUF_HOLD(bp); ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); trace_xfs_buf_item_trylock(bip); + if (XFS_BUF_ISDELAYWRITE(bp)) + return XFS_ITEM_PUSHBUF; return XFS_ITEM_SUCCESS; } @@ -626,11 +622,9 @@ xfs_buf_item_committed( } /* - * This is called to asynchronously write the buffer associated with this - * buf log item out to disk. The buffer will already have been locked by - * a successful call to xfs_buf_item_trylock(). If the buffer still has - * B_DELWRI set, then get it going out to disk with a call to bawrite(). - * If not, then just release the buffer. + * The buffer is locked, but is not a delayed write buffer. This happens + * if we race with IO completion and hence we don't want to try to write it + * again. Just release the buffer. */ STATIC void xfs_buf_item_push( @@ -642,17 +636,29 @@ xfs_buf_item_push( trace_xfs_buf_item_push(bip); bp = bip->bli_buf; + ASSERT(!XFS_BUF_ISDELAYWRITE(bp)); + xfs_buf_relse(bp); +} - if (XFS_BUF_ISDELAYWRITE(bp)) { - int error; - error = xfs_bawrite(bip->bli_item.li_mountp, bp); - if (error) - xfs_fs_cmn_err(CE_WARN, bip->bli_item.li_mountp, - "xfs_buf_item_push: pushbuf error %d on bip %p, bp %p", - error, bip, bp); - } else { - xfs_buf_relse(bp); - } +/* + * The buffer is locked and is a delayed write buffer. Promote the buffer + * in the delayed write queue as the caller knows that they must invoke + * the xfsbufd to get this buffer written. We have to unlock the buffer + * to allow the xfsbufd to write it, too. + */ +STATIC void +xfs_buf_item_pushbuf( + xfs_buf_log_item_t *bip) +{ + xfs_buf_t *bp; + + ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); + trace_xfs_buf_item_pushbuf(bip); + + bp = bip->bli_buf; + ASSERT(XFS_BUF_ISDELAYWRITE(bp)); + xfs_buf_delwri_promote(bp); + xfs_buf_relse(bp); } /* ARGSUSED */ @@ -677,7 +683,7 @@ static struct xfs_item_ops xfs_buf_item_ops = { .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) xfs_buf_item_committed, .iop_push = (void(*)(xfs_log_item_t*))xfs_buf_item_push, - .iop_pushbuf = NULL, + .iop_pushbuf = (void(*)(xfs_log_item_t*))xfs_buf_item_pushbuf, .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t)) xfs_buf_item_committing }; diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index beb7d9f..0c4e719 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -602,33 +602,20 @@ xfs_inode_item_trylock( if (!xfs_iflock_nowait(ip)) { /* - * If someone else isn't already trying to push the inode - * buffer, we get to do it. + * inode has already been flushed to the backing buffer, + * leave it locked in shared mode, pushbuf routine will + * unlock it. */ - if (iip->ili_pushbuf_flag == 0) { - iip->ili_pushbuf_flag = 1; -#ifdef DEBUG - iip->ili_push_owner = current_pid(); -#endif - /* - * Inode is left locked in shared mode. - * Pushbuf routine gets to unlock it. - */ - return XFS_ITEM_PUSHBUF; - } else { - /* - * We hold the AIL lock, so we must specify the - * NONOTIFY flag so that we won't double trip. - */ - xfs_iunlock(ip, XFS_ILOCK_SHARED|XFS_IUNLOCK_NONOTIFY); - return XFS_ITEM_FLUSHING; - } - /* NOTREACHED */ + return XFS_ITEM_PUSHBUF; } /* Stale items should force out the iclog */ if (ip->i_flags & XFS_ISTALE) { xfs_ifunlock(ip); + /* + * we hold the AIL lock - notify the unlock routine of this + * so it doesn't try to get the lock again. + */ xfs_iunlock(ip, XFS_ILOCK_SHARED|XFS_IUNLOCK_NONOTIFY); return XFS_ITEM_PINNED; } @@ -746,11 +733,8 @@ xfs_inode_item_committed( * This gets called by xfs_trans_push_ail(), when IOP_TRYLOCK * failed to get the inode flush lock but did get the inode locked SHARED. * Here we're trying to see if the inode buffer is incore, and if so whether it's - * marked delayed write. If that's the case, we'll initiate a bawrite on that - * buffer to expedite the process. - * - * We aren't holding the AIL lock (or the flush lock) when this gets called, - * so it is inherently race-y. + * marked delayed write. If that's the case, we'll promote it and that will + * allow the caller to write the buffer by triggering the xfsbufd to run. */ STATIC void xfs_inode_item_pushbuf( @@ -759,26 +743,16 @@ xfs_inode_item_pushbuf( xfs_inode_t *ip; xfs_mount_t *mp; xfs_buf_t *bp; - uint dopush; ip = iip->ili_inode; - ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED)); /* - * The ili_pushbuf_flag keeps others from - * trying to duplicate our effort. - */ - ASSERT(iip->ili_pushbuf_flag != 0); - ASSERT(iip->ili_push_owner == current_pid()); - - /* * If a flush is not in progress anymore, chances are that the * inode was taken off the AIL. So, just get out. */ if (completion_done(&ip->i_flush) || ((iip->ili_item.li_flags & XFS_LI_IN_AIL) == 0)) { - iip->ili_pushbuf_flag = 0; xfs_iunlock(ip, XFS_ILOCK_SHARED); return; } @@ -787,54 +761,12 @@ xfs_inode_item_pushbuf( bp = xfs_incore(mp->m_ddev_targp, iip->ili_format.ilf_blkno, iip->ili_format.ilf_len, XFS_INCORE_TRYLOCK); - if (bp != NULL) { - if (XFS_BUF_ISDELAYWRITE(bp)) { - /* - * We were racing with iflush because we don't hold - * the AIL lock or the flush lock. However, at this point, - * we have the buffer, and we know that it's dirty. - * So, it's possible that iflush raced with us, and - * this item is already taken off the AIL. - * If not, we can flush it async. - */ - dopush = ((iip->ili_item.li_flags & XFS_LI_IN_AIL) && - !completion_done(&ip->i_flush)); - iip->ili_pushbuf_flag = 0; - xfs_iunlock(ip, XFS_ILOCK_SHARED); - - trace_xfs_inode_item_push(bp, _RET_IP_); - - if (XFS_BUF_ISPINNED(bp)) { - xfs_log_force(mp, (xfs_lsn_t)0, - XFS_LOG_FORCE); - } - if (dopush) { - int error; - error = xfs_bawrite(mp, bp); - if (error) - xfs_fs_cmn_err(CE_WARN, mp, - "xfs_inode_item_pushbuf: pushbuf error %d on iip %p, bp %p", - error, iip, bp); - } else { - xfs_buf_relse(bp); - } - } else { - iip->ili_pushbuf_flag = 0; - xfs_iunlock(ip, XFS_ILOCK_SHARED); - xfs_buf_relse(bp); - } - return; - } - /* - * We have to be careful about resetting pushbuf flag too early (above). - * Even though in theory we can do it as soon as we have the buflock, - * we don't want others to be doing work needlessly. They'll come to - * this function thinking that pushing the buffer is their - * responsibility only to find that the buffer is still locked by - * another doing the same thing - */ - iip->ili_pushbuf_flag = 0; xfs_iunlock(ip, XFS_ILOCK_SHARED); + if (!bp) + return; + if (XFS_BUF_ISDELAYWRITE(bp)) + xfs_buf_delwri_promote(bp); + xfs_buf_relse(bp); return; } @@ -938,7 +870,6 @@ xfs_inode_item_init( /* We have zeroed memory. No need ... iip->ili_extents_buf = NULL; - iip->ili_pushbuf_flag = 0; */ iip->ili_format.ilf_type = XFS_LI_INODE; diff --git a/fs/xfs/xfs_inode_item.h b/fs/xfs/xfs_inode_item.h index cc8df1a..9a46795 100644 --- a/fs/xfs/xfs_inode_item.h +++ b/fs/xfs/xfs_inode_item.h @@ -144,12 +144,6 @@ typedef struct xfs_inode_log_item { data exts */ 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; diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 063dfbd..feb779a 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -253,6 +253,7 @@ xfsaild_push( int flush_log, count, stuck; xfs_mount_t *mp = ailp->xa_mount; struct xfs_ail_cursor *cur = &ailp->xa_cursors; + int push_xfsbufd = 0; spin_lock(&ailp->xa_lock); xfs_trans_ail_cursor_init(ailp, cur); @@ -308,6 +309,7 @@ xfsaild_push( XFS_STATS_INC(xs_push_ail_pushbuf); IOP_PUSHBUF(lip); last_pushed_lsn = lsn; + push_xfsbufd = 1; break; case XFS_ITEM_PINNED: @@ -374,6 +376,11 @@ xfsaild_push( xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); } + if (push_xfsbufd) { + /* we've got delayed write buffers to flush */ + xfs_flush_buftarg_delwri(mp->m_ddev_targp); + } + if (!count) { /* We're past our target or empty, so idle */ last_pushed_lsn = 0; -- 1.6.5 From SRS0+2nn4+34+fromorbit.com=dave@internode.on.net Mon Jan 4 18:07:39 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_66 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o0507cVp158295 for ; Mon, 4 Jan 2010 18:07:38 -0600 X-ASG-Debug-ID: 1262650107-324300160000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6131013EEB7 for ; Mon, 4 Jan 2010 16:08:27 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id pxzNUC0mib9KJOGN for ; Mon, 04 Jan 2010 16:08:27 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11051502-1927428 for ; Tue, 05 Jan 2010 10:38:26 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NRwy7-00069W-Ku for xfs@oss.sgi.com; Tue, 05 Jan 2010 11:08:15 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NRwuQ-0007RC-3y for xfs@oss.sgi.com; Tue, 05 Jan 2010 11:04:26 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/3] xfs: Sort delayed write buffers before dispatch Subject: [PATCH 3/3] xfs: Sort delayed write buffers before dispatch Date: Tue, 5 Jan 2010 11:04:21 +1100 Message-Id: <1262649861-28530-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1262649861-28530-1-git-send-email-david@fromorbit.com> References: <1262649861-28530-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1262650109 X-Barracuda-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.18973 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 Currently when the xfsbufd writes delayed write buffers, it pushes them to disk in the order they come off the delayed write list. If there are lots of buffers ѕpread widely over the disk, this results in overwhelming the elevator sort queues in the block layer and we end up losing the posibility of merging adjacent buffers to minimise the number of IOs. Use the new generic list_sort function to sort the delwri dispatch queue before issue to ensure that the buffers are pushed in the most friendly order possible to the lower layers. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_buf.c | 90 +++++++++++++++++++++++++++++++------------ 1 files changed, 65 insertions(+), 25 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index aaefc33..15c0dea 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "xfs_sb.h" #include "xfs_inum.h" @@ -1644,12 +1645,18 @@ xfs_buf_delwri_promote( spinlock_t *dwlk = &bp->b_target->bt_delwrite_lock; long age = xfs_buf_age_centisecs * msecs_to_jiffies(10) + 1; - spin_lock(dwlk); ASSERT(bp->b_flags & XBF_DELWRI); ASSERT(bp->b_flags & _XBF_DELWRI_Q); - list_del(&bp->b_list); - list_add(&bp->b_list, dwq); + + /* + * Check the buffer age before locking the delayed write queue as we + * don't need to promote buffers that are already past the flush age. + */ + if (bp->b_queuetime < jiffies - age) + return; bp->b_queuetime = jiffies - age; + spin_lock(dwlk); + list_move(&bp->b_list, dwq); spin_unlock(dwlk); } @@ -1723,14 +1730,42 @@ xfs_buf_delwri_split( } +/* + * Compare function is more complex than it needs to be because + * the return value is only 32 bits and we are doing comparisons + * on 64 bit values + */ +int +xfs_buf_cmp( + void *priv, + struct list_head *a, + struct list_head *b) +{ + struct xfs_buf *ap = container_of(a, struct xfs_buf, b_list); + struct xfs_buf *bp = container_of(b, struct xfs_buf, b_list); + xfs_daddr_t diff; + + diff = ap->b_bn - bp->b_bn; + if (diff < 0) + return -1; + if (diff > 0) + return 1; + return 0; +} + +void +xfs_buf_delwri_sort( + xfs_buftarg_t *target, + struct list_head *list) +{ + list_sort(NULL, list, xfs_buf_cmp); +} + STATIC int xfsbufd( void *data) { - struct list_head tmp; - xfs_buftarg_t *target = (xfs_buftarg_t *)data; - int count; - xfs_buf_t *bp; + xfs_buftarg_t *target = (xfs_buftarg_t *)data; current->flags |= PF_MEMALLOC; @@ -1739,6 +1774,8 @@ xfsbufd( do { long age = xfs_buf_age_centisecs * msecs_to_jiffies(10); long tout = age; + int count = 0; + struct list_head tmp; if (unlikely(freezing(current))) { set_bit(XBT_FORCE_SLEEP, &target->bt_flags); @@ -1753,11 +1790,10 @@ xfsbufd( schedule_timeout_interruptible(tout); xfs_buf_delwri_split(target, &tmp, age); - count = 0; + xfs_buf_delwri_sort(target, &tmp); while (!list_empty(&tmp)) { - bp = list_entry(tmp.next, xfs_buf_t, b_list); - ASSERT(target == bp->b_target); - + struct xfs_buf *bp; + bp = list_first_entry(&tmp, struct xfs_buf, b_list); list_del_init(&bp->b_list); xfs_buf_iostrategy(bp); count++; @@ -1783,38 +1819,42 @@ xfs_flush_buftarg( xfs_buftarg_t *target, int wait) { - struct list_head tmp; - xfs_buf_t *bp, *n; + xfs_buf_t *bp; int pincount = 0; + LIST_HEAD(tmp_list); + LIST_HEAD(wait_list); xfs_buf_runall_queues(xfsconvertd_workqueue); xfs_buf_runall_queues(xfsdatad_workqueue); xfs_buf_runall_queues(xfslogd_workqueue); set_bit(XBT_FORCE_FLUSH, &target->bt_flags); - pincount = xfs_buf_delwri_split(target, &tmp, 0); + pincount = xfs_buf_delwri_split(target, &tmp_list, 0); /* - * Dropped the delayed write list lock, now walk the temporary list + * Dropped the delayed write list lock, now walk the temporary list. + * All I/O is issued async and then if we need to wait for completion + * we do that after issuing all the IO. */ - list_for_each_entry_safe(bp, n, &tmp, b_list) { + xfs_buf_delwri_sort(target, &tmp_list); + while (!list_empty(&tmp_list)) { + struct xfs_buf *bp; + bp = list_first_entry(&tmp_list, struct xfs_buf, b_list); ASSERT(target == bp->b_target); - if (wait) + list_del_init(&bp->b_list); + if (wait) { bp->b_flags &= ~XBF_ASYNC; - else - list_del_init(&bp->b_list); - + list_add(&bp->b_list, &wait_list); + } xfs_buf_iostrategy(bp); } if (wait) blk_run_address_space(target->bt_mapping); - /* - * Remaining list items must be flushed before returning - */ - while (!list_empty(&tmp)) { - bp = list_entry(tmp.next, xfs_buf_t, b_list); + /* Now wait for IO to complete if required. */ + while (!list_empty(&wait_list)) { + bp = list_first_entry(&wait_list, struct xfs_buf, b_list); list_del_init(&bp->b_list); xfs_iowait(bp); -- 1.6.5 From SRS0+eCYC+34+fromorbit.com=david@internode.on.net Mon Jan 4 18:41:41 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o050ff5l160343 for ; Mon, 4 Jan 2010 18:41:41 -0600 X-ASG-Debug-ID: 1262652149-632f01100000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DF9F61C2AFCE for ; Mon, 4 Jan 2010 16:42:29 -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 1oLV6LiOnHmOiMIU for ; Mon, 04 Jan 2010 16:42:29 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11163878-1927428 for multiple; Tue, 05 Jan 2010 11:11:19 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NRxU5-0006Bv-9V; Tue, 05 Jan 2010 11:41:17 +1100 Date: Tue, 5 Jan 2010 11:41:17 +1100 From: Dave Chinner To: Chris Mason , tytso@mit.edu, Evgeniy Polyakov , Peter Grandi , xfs@oss.sgi.com, reiserfs-devel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, jfs-discussion@lists.sourceforge.net, ext-users , linux-nilfs@vger.kernel.org X-ASG-Orig-Subj: Re: [Jfs-discussion] benchmark results Subject: Re: [Jfs-discussion] benchmark results Message-ID: <20100105004117.GP13802@discord.disaster> References: <19251.26403.762180.228181@tree.ty.sabi.co.uk> <20091224212756.GM21594@thunk.org> <20091224234631.GA1028@ioremap.net> <20091225161146.GC32757@thunk.org> <20100104162748.GA11932@think> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100104162748.GA11932@think> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1262652150 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18975 Rule breakdown below pts rule 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 04, 2010 at 11:27:48AM -0500, Chris Mason wrote: > On Fri, Dec 25, 2009 at 11:11:46AM -0500, tytso@mit.edu wrote: > > On Fri, Dec 25, 2009 at 02:46:31AM +0300, Evgeniy Polyakov wrote: > > > > [1] http://samba.org/ftp/tridge/dbench/README > > > > > > Was not able to resist to write a small notice, what no matter what, but > > > whatever benchmark is running, it _does_ show system behaviour in one > > > or another condition. And when system behaves rather badly, it is quite > > > a common comment, that benchmark was useless. But it did show that > > > system has a problem, even if rarely triggered one :) > > > > If people are using benchmarks to improve file system, and a benchmark > > shows a problem, then trying to remedy the performance issue is a good > > thing to do, of course. Sometimes, though the case which is > > demonstrated by a poor benchmark is an extremely rare corner case that > > doesn't accurately reflect common real-life workloads --- and if > > addressing it results in a tradeoff which degrades much more common > > real-life situations, then that would be a bad thing. > > > > In situations where benchmarks are used competitively, it's rare that > > it's actually a *problem*. Instead it's much more common that a > > developer is trying to prove that their file system is *better* to > > gullible users who think that a single one-dimentional number is > > enough for them to chose file system X over file system Y. > > [ Look at all this email from my vacation...sorry for the delay ] > > It's important that people take benchmarks from filesystem developers > with a big grain of salt, which is one reason the boxacle.net results > are so nice. Steve more than willing to take patches and experiment to > improve a given FS results, but his business is a fair representation of > performance and it shows. Just looking at the results there, I notice that the RAID system XFS mailserver results dropped by an order of magnitude between 2.6.29-rc2 and 2.6.31. The single disk results are pretty much identical across the two kernels. IIRC, in 2.6.31 RAID0 started passing barriers through so I suspect this is the issue. However, seeing as dmesg is not collected by the scripts after the run and the output of the mounttab does not show default options, I cannot tell if this is the case. This might be worth checking by running XFS with the "nobarrier" mount option.... FWIW, is it possible to get these benchmarks run on each filesystem for each kernel release so ext/xfs/btrfs all get some regular basic performance regression test coverage? Cheers, Dave. -- Dave Chinner david@fromorbit.com From k@adamski.org Mon Jan 4 18:47:33 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, HTML_MESSAGE autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o050lXP9160693 for ; Mon, 4 Jan 2010 18:47:33 -0600 X-ASG-Debug-ID: 1262652503-5c14024a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from radon.netxsys.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DE8F7EC72D0 for ; Mon, 4 Jan 2010 16:48:23 -0800 (PST) Received: from radon.netxsys.com (radon.netxsys.com [204.16.202.162]) by cuda.sgi.com with ESMTP id PyfXqyV2LNNg9cbL for ; Mon, 04 Jan 2010 16:48:23 -0800 (PST) Received: from [205.233.151.7] (Oxygen.NetXSys.Com [205.233.151.7]) by radon.netxsys.com (Postfix) with ESMTP id 87F48C000091 for ; Mon, 4 Jan 2010 19:48:22 -0500 (EST) X-ASG-Orig-Subj: NFS export broke with change from ext3 to xfs Subject: NFS export broke with change from ext3 to xfs From: Krzysztof Adamski To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary="=-h5MnDdAbcldGztDVy+58" Date: Mon, 04 Jan 2010 19:48:20 -0500 Message-Id: <1262652500.24160.27.camel@oxygen.netxsys.com> Mime-Version: 1.0 X-Mailer: Evolution 2.22.3.1 X-Barracuda-Connect: radon.netxsys.com[204.16.202.162] X-Barracuda-Start-Time: 1262652503 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.18976 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 --=-h5MnDdAbcldGztDVy+58 Content-Type: text/plain Content-Transfer-Encoding: 7bit Hi All, I just changed one filesystem on my mythbox from ext3 to xfs, and now I can't get a client machine to NFS mount from it. This is the export file on the server: /file-store/nfs-roots/f1/home f1(rw,no_root_squash,sync,no_subtree_check) /file-store/nfs-roots/f1/usr f1(rw,no_root_squash,sync,no_subtree_check) /file-store/nfs-roots/f1/var f1(rw,no_root_squash,sync,no_subtree_check) and on the client(f1) the three filesystems are mount on /home, /usr, and /var This worked fine when /file-store on the server was formatted with ext3, now that it is formatted with xfs I get this message on the client: mount.nfs: Stale NFS file handle I get this message 3 times. Nothing else changed, both systems are Debian Lenny with custom kernel. Server is 2.6.28, client is 2.6.29.6. NFS is version 3. The fstab on the server has this: /dev/mapper/big--raid-file--store /file-store xfs noatime,logbsize=256k,inode64 0 1 The reason for the change of the filesystem was an upgrade of the drives in the RAID, now the filesystem is 7T instead of 2.4T, nothing else was changed. Why did this work with ext3 and does not with XFS? What can I do to get this to work, short of reverting to ext3? K --=-h5MnDdAbcldGztDVy+58 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit Hi All,

I just changed one filesystem on my mythbox from ext3 to xfs, and now I can't get a client machine to NFS mount from it.

This is the export file on the server:
/file-store/nfs-roots/f1/home   f1(rw,no_root_squash,sync,no_subtree_check)
/file-store/nfs-roots/f1/usr        f1(rw,no_root_squash,sync,no_subtree_check)
/file-store/nfs-roots/f1/var        f1(rw,no_root_squash,sync,no_subtree_check)

and on the client(f1) the three filesystems are mount on /home, /usr, and /var

This worked fine when /file-store on the server was formatted with ext3, now that it is formatted with xfs I get this message on the client:
mount.nfs: Stale NFS file handle
I get this message 3 times.
Nothing else changed, both systems are Debian Lenny with custom kernel.
Server is 2.6.28, client is 2.6.29.6. NFS is version 3.
The fstab on the server has this:
/dev/mapper/big--raid-file--store       /file-store     xfs     noatime,logbsize=256k,inode64   0       1

The reason for the change of the filesystem was an upgrade of the drives in the RAID, now the filesystem is 7T instead of 2.4T,
nothing else was changed. Why did this work with ext3 and does not with XFS? What can I do to get this to work, short of reverting to ext3?

K --=-h5MnDdAbcldGztDVy+58-- From airlied@redhat.com Mon Jan 4 18:50:53 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o050orCE160881 for ; Mon, 4 Jan 2010 18:50:53 -0600 X-ASG-Debug-ID: 1262652703-663f01390000-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 61B371C2AD22 for ; Mon, 4 Jan 2010 16:51:43 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UP4H0V4WRS0QqIlC for ; Mon, 04 Jan 2010 16:51:43 -0800 (PST) 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 o050pQoV012556 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 4 Jan 2010 19:51:26 -0500 Received: from [10.64.0.222] (dhcp-0-222.bne.redhat.com [10.64.0.222]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o050pNG8011294; Mon, 4 Jan 2010 19:51:24 -0500 X-ASG-Orig-Subj: Re: [PATCH] sort: Introduce generic list_sort function Subject: Re: [PATCH] sort: Introduce generic list_sort function From: Dave Airlie To: Dave Chinner Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Artem Bityutskiy , Adrian Hunter In-Reply-To: <1262649295-28427-1-git-send-email-david@fromorbit.com> References: <1262649295-28427-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 05 Jan 2010 10:48:26 +1000 Message-Id: <1262652506.25818.5.camel@localhost> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1262652704 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18977 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-01-05 at 10:54 +1100, Dave Chinner wrote: > There are two copies of list_sort() in the tree already, one in the DRM code, > another in ubifs. Now XFS needs this as well. Create a generic list_sort() > function from the ubifs version and convert existing users to it so we > don't end up with yet another copy in the tree. Acked-by: Dave Airlie Meant to do this myself when we imported modesetting, but never got around to it, Thanks, Dave. From dedekind@infradead.org Tue Jan 5 00:23:50 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o056Nnl9182029 for ; Tue, 5 Jan 2010 00:23:49 -0600 X-ASG-Debug-ID: 1262672676-075302160000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mgw-mx03.nokia.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D705D13EBF6 for ; Mon, 4 Jan 2010 22:24:36 -0800 (PST) Received: from mgw-mx03.nokia.com (smtp.nokia.com [192.100.122.230]) by cuda.sgi.com with ESMTP id MKtFEZkwyjBfa34c for ; Mon, 04 Jan 2010 22:24:36 -0800 (PST) Received: from esebh105.NOE.Nokia.com (esebh105.ntc.nokia.com [172.21.138.211]) by mgw-mx03.nokia.com (Switch-3.3.3/Switch-3.3.3) with ESMTP id o056O1cK011755; Tue, 5 Jan 2010 08:24:08 +0200 Received: from vaebh104.NOE.Nokia.com ([10.160.244.30]) by esebh105.NOE.Nokia.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 5 Jan 2010 08:24:02 +0200 Received: from mgw-sa02.ext.nokia.com ([147.243.1.48]) by vaebh104.NOE.Nokia.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.3959); Tue, 5 Jan 2010 08:24:01 +0200 Received: from [172.21.40.36] (esdhcp04036.research.nokia.com [172.21.40.36]) by mgw-sa02.ext.nokia.com (Switch-3.3.3/Switch-3.3.3) with ESMTP id o056NweA026491; Tue, 5 Jan 2010 08:23:59 +0200 X-ASG-Orig-Subj: Re: [PATCH] sort: Introduce generic list_sort function Subject: Re: [PATCH] sort: Introduce generic list_sort function From: Artem Bityutskiy Reply-To: dedekind@infradead.org To: Dave Chinner Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Dave Airlie , Adrian Hunter In-Reply-To: <1262649295-28427-1-git-send-email-david@fromorbit.com> References: <1262649295-28427-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 05 Jan 2010 08:23:58 +0200 Message-Id: <1262672638.4512.48.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.26.3 (2.26.3-1.fc11) Content-Transfer-Encoding: 8bit X-OriginalArrivalTime: 05 Jan 2010 06:24:01.0712 (UTC) FILETIME=[AC033B00:01CA8DCF] X-Nokia-AV: Clean X-Barracuda-Connect: smtp.nokia.com[192.100.122.230] X-Barracuda-Start-Time: 1262672679 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18997 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-01-05 at 10:54 +1100, Dave Chinner wrote: > There are two copies of list_sort() in the tree already, one in the DRM code, > another in ubifs. Now XFS needs this as well. Create a generic list_sort() > function from the ubifs version and convert existing users to it so we > don't end up with yet another copy in the tree. > > CC: Dave Airlie > CC: Artem Bityutskiy > CC: Adrian Hunter > > Signed-off-by: Dave Chinner Acked-by: Artem Bityutskiy Thanks, this has been in my TODO list for long time as well :-) -- Best Regards, Artem Bityutskiy (Đртём Битюцкий) From dedekind@infradead.org Tue Jan 5 00:25:34 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.4 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_44 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o056PYeq182176 for ; Tue, 5 Jan 2010 00:25:34 -0600 X-ASG-Debug-ID: 1262672783-529d019c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mgw-mx03.nokia.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4E7B21C2B9B3 for ; Mon, 4 Jan 2010 22:26:23 -0800 (PST) Received: from mgw-mx03.nokia.com (smtp.nokia.com [192.100.122.230]) by cuda.sgi.com with ESMTP id SpJOQfTUWfvtwrSr for ; Mon, 04 Jan 2010 22:26:23 -0800 (PST) Received: from esebh106.NOE.Nokia.com (esebh106.ntc.nokia.com [172.21.138.213]) by mgw-mx03.nokia.com (Switch-3.3.3/Switch-3.3.3) with ESMTP id o056Q5Hf014201; Tue, 5 Jan 2010 08:26:16 +0200 Received: from esebh102.NOE.Nokia.com ([172.21.138.183]) by esebh106.NOE.Nokia.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 5 Jan 2010 08:26:13 +0200 Received: from mgw-sa01.ext.nokia.com ([147.243.1.47]) by esebh102.NOE.Nokia.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.3959); Tue, 5 Jan 2010 08:26:13 +0200 Received: from [172.21.40.36] (esdhcp04036.research.nokia.com [172.21.40.36]) by mgw-sa01.ext.nokia.com (Switch-3.3.3/Switch-3.3.3) with ESMTP id o056QBPE031665; Tue, 5 Jan 2010 08:26:12 +0200 X-ASG-Orig-Subj: Re: [PATCH] sort: Introduce generic list_sort function Subject: Re: [PATCH] sort: Introduce generic list_sort function From: Artem Bityutskiy Reply-To: dedekind@infradead.org To: Dave Chinner Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Dave Airlie , Adrian Hunter In-Reply-To: <1262649295-28427-1-git-send-email-david@fromorbit.com> References: <1262649295-28427-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 05 Jan 2010 08:26:11 +0200 Message-Id: <1262672771.4512.50.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.26.3 (2.26.3-1.fc11) Content-Transfer-Encoding: 8bit X-OriginalArrivalTime: 05 Jan 2010 06:26:13.0886 (UTC) FILETIME=[FACB61E0:01CA8DCF] X-Nokia-AV: Clean X-Barracuda-Connect: smtp.nokia.com[192.100.122.230] X-Barracuda-Start-Time: 1262672785 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18997 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-01-05 at 10:54 +1100, Dave Chinner wrote: > There are two copies of list_sort() in the tree already, one in the DRM code, > another in ubifs. Now XFS needs this as well. Create a generic list_sort() > function from the ubifs version and convert existing users to it so we > don't end up with yet another copy in the tree. > > CC: Dave Airlie > CC: Artem Bityutskiy > CC: Adrian Hunter > > Signed-off-by: Dave Chinner > --- > drivers/gpu/drm/drm_modes.c | 90 ++-------------------------------------- > fs/ubifs/gc.c | 95 ------------------------------------------ > include/linux/sort.h | 5 ++ > lib/sort.c | 97 +++++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 106 insertions(+), 181 deletions(-) > > diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c > index 51f6772..3846ed4 100644 > --- a/drivers/gpu/drm/drm_modes.c > +++ b/drivers/gpu/drm/drm_modes.c > @@ -1,9 +1,4 @@ > /* > - * The list_sort function is (presumably) licensed under the GPL (see the > - * top level "COPYING" file for details). > - * > - * The remainder of this file is: > - * > * Copyright © 1997-2003 by The XFree86 Project, Inc. > * Copyright © 2007 Dave Airlie > * Copyright © 2007-2008 Intel Corporation > @@ -36,6 +31,7 @@ > */ > > #include > +#include > #include "drmP.h" > #include "drm.h" > #include "drm_crtc.h" > @@ -829,6 +825,7 @@ EXPORT_SYMBOL(drm_mode_prune_invalid); > > /** > * drm_mode_compare - compare modes for favorability > + * @priv: unused > * @lh_a: list_head for first mode > * @lh_b: list_head for second mode > * > @@ -842,7 +839,7 @@ EXPORT_SYMBOL(drm_mode_prune_invalid); > * Negative if @lh_a is better than @lh_b, zero if they're equivalent, or > * positive if @lh_b is better than @lh_a. > */ > -static int drm_mode_compare(struct list_head *lh_a, struct list_head *lh_b) > +static int drm_mode_compare(void *priv, struct list_head *lh_a, struct list_head *lh_b) > { > struct drm_display_mode *a = list_entry(lh_a, struct drm_display_mode, head); > struct drm_display_mode *b = list_entry(lh_b, struct drm_display_mode, head); > @@ -859,85 +856,6 @@ static int drm_mode_compare(struct list_head *lh_a, struct list_head *lh_b) > return diff; > } > > -/* FIXME: what we don't have a list sort function? */ > -/* list sort from Mark J Roberts (mjr@znex.org) */ > -void list_sort(struct list_head *head, > - int (*cmp)(struct list_head *a, struct list_head *b)) > -{ > - struct list_head *p, *q, *e, *list, *tail, *oldhead; > - int insize, nmerges, psize, qsize, i; > - > - list = head->next; > - list_del(head); > - insize = 1; > - for (;;) { > - p = oldhead = list; > - list = tail = NULL; > - nmerges = 0; > - > - while (p) { > - nmerges++; > - q = p; > - psize = 0; > - for (i = 0; i < insize; i++) { > - psize++; > - q = q->next == oldhead ? NULL : q->next; > - if (!q) > - break; > - } > - > - qsize = insize; > - while (psize > 0 || (qsize > 0 && q)) { > - if (!psize) { > - e = q; > - q = q->next; > - qsize--; > - if (q == oldhead) > - q = NULL; > - } else if (!qsize || !q) { > - e = p; > - p = p->next; > - psize--; > - if (p == oldhead) > - p = NULL; > - } else if (cmp(p, q) <= 0) { > - e = p; > - p = p->next; > - psize--; > - if (p == oldhead) > - p = NULL; > - } else { > - e = q; > - q = q->next; > - qsize--; > - if (q == oldhead) > - q = NULL; > - } > - if (tail) > - tail->next = e; > - else > - list = e; > - e->prev = tail; > - tail = e; > - } > - p = q; > - } > - > - tail->next = list; > - list->prev = tail; > - > - if (nmerges <= 1) > - break; > - > - insize *= 2; > - } > - > - head->next = list; > - head->prev = list->prev; > - list->prev->next = head; > - list->prev = head; > -} > - > /** > * drm_mode_sort - sort mode list > * @mode_list: list to sort > @@ -949,7 +867,7 @@ void list_sort(struct list_head *head, > */ > void drm_mode_sort(struct list_head *mode_list) > { > - list_sort(mode_list, drm_mode_compare); > + list_sort(NULL, mode_list, drm_mode_compare); > } > EXPORT_SYMBOL(drm_mode_sort); > > diff --git a/fs/ubifs/gc.c b/fs/ubifs/gc.c > index 618c270..4976e07 100644 > --- a/fs/ubifs/gc.c > +++ b/fs/ubifs/gc.c > @@ -108,101 +108,6 @@ static int switch_gc_head(struct ubifs_info *c) > } > > /** > - * list_sort - sort a list. > - * @priv: private data, passed to @cmp > - * @head: the list to sort > - * @cmp: the elements comparison function > - * > - * This function has been implemented by Mark J Roberts . It > - * implements "merge sort" which has O(nlog(n)) complexity. The list is sorted > - * in ascending order. > - * > - * The comparison function @cmp is supposed to return a negative value if @a is > - * than @b, and a positive value if @a is greater than @b. If @a and @b are > - * equivalent, then it does not matter what this function returns. > - */ > -static void list_sort(void *priv, struct list_head *head, > - int (*cmp)(void *priv, struct list_head *a, > - struct list_head *b)) > -{ > - struct list_head *p, *q, *e, *list, *tail, *oldhead; > - int insize, nmerges, psize, qsize, i; > - > - if (list_empty(head)) > - return; > - > - list = head->next; > - list_del(head); > - insize = 1; > - for (;;) { > - p = oldhead = list; > - list = tail = NULL; > - nmerges = 0; > - > - while (p) { > - nmerges++; > - q = p; > - psize = 0; > - for (i = 0; i < insize; i++) { > - psize++; > - q = q->next == oldhead ? NULL : q->next; > - if (!q) > - break; > - } > - > - qsize = insize; > - while (psize > 0 || (qsize > 0 && q)) { > - if (!psize) { > - e = q; > - q = q->next; > - qsize--; > - if (q == oldhead) > - q = NULL; > - } else if (!qsize || !q) { > - e = p; > - p = p->next; > - psize--; > - if (p == oldhead) > - p = NULL; > - } else if (cmp(priv, p, q) <= 0) { > - e = p; > - p = p->next; > - psize--; > - if (p == oldhead) > - p = NULL; > - } else { > - e = q; > - q = q->next; > - qsize--; > - if (q == oldhead) > - q = NULL; > - } > - if (tail) > - tail->next = e; > - else > - list = e; > - e->prev = tail; > - tail = e; > - } > - p = q; > - } > - > - tail->next = list; > - list->prev = tail; > - > - if (nmerges <= 1) > - break; > - > - insize *= 2; > - } > - > - head->next = list; > - head->prev = list->prev; > - list->prev->next = head; > - list->prev = head; > -} > - > -/** > * data_nodes_cmp - compare 2 data nodes. > * @priv: UBIFS file-system description object > * @a: first data node > diff --git a/include/linux/sort.h b/include/linux/sort.h > index d534da2..99a2ed5 100644 > --- a/include/linux/sort.h > +++ b/include/linux/sort.h > @@ -3,8 +3,13 @@ > > #include > > +struct list_head; > + > void sort(void *base, size_t num, size_t size, > int (*cmp)(const void *, const void *), > void (*swap)(void *, void *, int)); > > +void list_sort(void *priv, struct list_head *head, > + int (*cmp)(void *priv, struct list_head *a, > + struct list_head *b)); > #endif > diff --git a/lib/sort.c b/lib/sort.c > index 926d004..1772c45 100644 > --- a/lib/sort.c > +++ b/lib/sort.c > @@ -8,6 +8,7 @@ > #include > #include > #include > +#include > > static void u32_swap(void *a, void *b, int size) > { > @@ -121,3 +122,99 @@ static int sort_test(void) > > module_init(sort_test); > #endif > + > +/** > + * list_sort - sort a list. > + * @priv: private data, passed to @cmp > + * @head: the list to sort > + * @cmp: the elements comparison function > + * > + * This function has been implemented by Mark J Roberts . It > + * implements "merge sort" which has O(nlog(n)) complexity. The list is sorted > + * in ascending order. > + * > + * The comparison function @cmp is supposed to return a negative value if @a is > + * than @b, and a positive value if @a is greater than @b. If @a and @b are While you are on it, could you also please fix the typo: "if @a is less than @b". > + * equivalent, then it does not matter what this function returns. > + */ -- Best Regards, Artem Bityutskiy (Đртём Битюцкий) From SRS0+0kV4+34+fromorbit.com=david@internode.on.net Tue Jan 5 03:33:50 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_44 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o059Xn8J194288 for ; Tue, 5 Jan 2010 03:33:50 -0600 X-ASG-Debug-ID: 1262684077-419300c10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7473713FF28 for ; Tue, 5 Jan 2010 01:34:37 -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 fSSnyeeLOkHQIrCx for ; Tue, 05 Jan 2010 01:34:37 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11101363-1927428 for multiple; Tue, 05 Jan 2010 20:04:09 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NS5nj-0006jq-2W; Tue, 05 Jan 2010 20:34:07 +1100 Date: Tue, 5 Jan 2010 20:34:07 +1100 From: Dave Chinner To: Artem Bityutskiy Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Dave Airlie , Adrian Hunter X-ASG-Orig-Subj: Re: [PATCH] sort: Introduce generic list_sort function Subject: Re: [PATCH] sort: Introduce generic list_sort function Message-ID: <20100105093407.GQ13802@discord.disaster> References: <1262649295-28427-1-git-send-email-david@fromorbit.com> <1262672771.4512.50.camel@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1262672771.4512.50.camel@localhost> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1262684079 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19007 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Jan 05, 2010 at 08:26:11AM +0200, Artem Bityutskiy wrote: > > + * implements "merge sort" which has O(nlog(n)) complexity. The list is sorted > > + * in ascending order. > > + * > > + * The comparison function @cmp is supposed to return a negative value if @a is > > + * than @b, and a positive value if @a is greater than @b. If @a and @b are > > While you are on it, could you also please fix the typo: "if @a is less > than @b". Fixed. New patch below. Cheers, Dave. -- Dave Chinner david@fromorbit.com sort: Introduce generic list_sort function There are two copies of list_sort() in the tree already, one in the DRM code, another in ubifs. Now XFS needs this as well. Create a generic list_sort() function from the ubifs version and convert existing users to it so we don't end up with yet another copy in the tree. Signed-off-by: Dave Chinner Acked-by: Dave Airlie Acked-by: Artem Bityutskiy --- drivers/gpu/drm/drm_modes.c | 90 ++-------------------------------------- fs/ubifs/gc.c | 95 ------------------------------------------ include/linux/sort.h | 5 ++ lib/sort.c | 97 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 181 deletions(-) diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index 51f6772..3846ed4 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c @@ -1,9 +1,4 @@ /* - * The list_sort function is (presumably) licensed under the GPL (see the - * top level "COPYING" file for details). - * - * The remainder of this file is: - * * Copyright © 1997-2003 by The XFree86 Project, Inc. * Copyright © 2007 Dave Airlie * Copyright © 2007-2008 Intel Corporation @@ -36,6 +31,7 @@ */ #include +#include #include "drmP.h" #include "drm.h" #include "drm_crtc.h" @@ -829,6 +825,7 @@ EXPORT_SYMBOL(drm_mode_prune_invalid); /** * drm_mode_compare - compare modes for favorability + * @priv: unused * @lh_a: list_head for first mode * @lh_b: list_head for second mode * @@ -842,7 +839,7 @@ EXPORT_SYMBOL(drm_mode_prune_invalid); * Negative if @lh_a is better than @lh_b, zero if they're equivalent, or * positive if @lh_b is better than @lh_a. */ -static int drm_mode_compare(struct list_head *lh_a, struct list_head *lh_b) +static int drm_mode_compare(void *priv, struct list_head *lh_a, struct list_head *lh_b) { struct drm_display_mode *a = list_entry(lh_a, struct drm_display_mode, head); struct drm_display_mode *b = list_entry(lh_b, struct drm_display_mode, head); @@ -859,85 +856,6 @@ static int drm_mode_compare(struct list_head *lh_a, struct list_head *lh_b) return diff; } -/* FIXME: what we don't have a list sort function? */ -/* list sort from Mark J Roberts (mjr@znex.org) */ -void list_sort(struct list_head *head, - int (*cmp)(struct list_head *a, struct list_head *b)) -{ - struct list_head *p, *q, *e, *list, *tail, *oldhead; - int insize, nmerges, psize, qsize, i; - - list = head->next; - list_del(head); - insize = 1; - for (;;) { - p = oldhead = list; - list = tail = NULL; - nmerges = 0; - - while (p) { - nmerges++; - q = p; - psize = 0; - for (i = 0; i < insize; i++) { - psize++; - q = q->next == oldhead ? NULL : q->next; - if (!q) - break; - } - - qsize = insize; - while (psize > 0 || (qsize > 0 && q)) { - if (!psize) { - e = q; - q = q->next; - qsize--; - if (q == oldhead) - q = NULL; - } else if (!qsize || !q) { - e = p; - p = p->next; - psize--; - if (p == oldhead) - p = NULL; - } else if (cmp(p, q) <= 0) { - e = p; - p = p->next; - psize--; - if (p == oldhead) - p = NULL; - } else { - e = q; - q = q->next; - qsize--; - if (q == oldhead) - q = NULL; - } - if (tail) - tail->next = e; - else - list = e; - e->prev = tail; - tail = e; - } - p = q; - } - - tail->next = list; - list->prev = tail; - - if (nmerges <= 1) - break; - - insize *= 2; - } - - head->next = list; - head->prev = list->prev; - list->prev->next = head; - list->prev = head; -} - /** * drm_mode_sort - sort mode list * @mode_list: list to sort @@ -949,7 +867,7 @@ void list_sort(struct list_head *head, */ void drm_mode_sort(struct list_head *mode_list) { - list_sort(mode_list, drm_mode_compare); + list_sort(NULL, mode_list, drm_mode_compare); } EXPORT_SYMBOL(drm_mode_sort); diff --git a/fs/ubifs/gc.c b/fs/ubifs/gc.c index 618c270..4976e07 100644 --- a/fs/ubifs/gc.c +++ b/fs/ubifs/gc.c @@ -108,101 +108,6 @@ static int switch_gc_head(struct ubifs_info *c) } /** - * list_sort - sort a list. - * @priv: private data, passed to @cmp - * @head: the list to sort - * @cmp: the elements comparison function - * - * This function has been implemented by Mark J Roberts . It - * implements "merge sort" which has O(nlog(n)) complexity. The list is sorted - * in ascending order. - * - * The comparison function @cmp is supposed to return a negative value if @a is - * than @b, and a positive value if @a is greater than @b. If @a and @b are - * equivalent, then it does not matter what this function returns. - */ -static void list_sort(void *priv, struct list_head *head, - int (*cmp)(void *priv, struct list_head *a, - struct list_head *b)) -{ - struct list_head *p, *q, *e, *list, *tail, *oldhead; - int insize, nmerges, psize, qsize, i; - - if (list_empty(head)) - return; - - list = head->next; - list_del(head); - insize = 1; - for (;;) { - p = oldhead = list; - list = tail = NULL; - nmerges = 0; - - while (p) { - nmerges++; - q = p; - psize = 0; - for (i = 0; i < insize; i++) { - psize++; - q = q->next == oldhead ? NULL : q->next; - if (!q) - break; - } - - qsize = insize; - while (psize > 0 || (qsize > 0 && q)) { - if (!psize) { - e = q; - q = q->next; - qsize--; - if (q == oldhead) - q = NULL; - } else if (!qsize || !q) { - e = p; - p = p->next; - psize--; - if (p == oldhead) - p = NULL; - } else if (cmp(priv, p, q) <= 0) { - e = p; - p = p->next; - psize--; - if (p == oldhead) - p = NULL; - } else { - e = q; - q = q->next; - qsize--; - if (q == oldhead) - q = NULL; - } - if (tail) - tail->next = e; - else - list = e; - e->prev = tail; - tail = e; - } - p = q; - } - - tail->next = list; - list->prev = tail; - - if (nmerges <= 1) - break; - - insize *= 2; - } - - head->next = list; - head->prev = list->prev; - list->prev->next = head; - list->prev = head; -} - -/** * data_nodes_cmp - compare 2 data nodes. * @priv: UBIFS file-system description object * @a: first data node diff --git a/include/linux/sort.h b/include/linux/sort.h index d534da2..99a2ed5 100644 --- a/include/linux/sort.h +++ b/include/linux/sort.h @@ -3,8 +3,13 @@ #include +struct list_head; + void sort(void *base, size_t num, size_t size, int (*cmp)(const void *, const void *), void (*swap)(void *, void *, int)); +void list_sort(void *priv, struct list_head *head, + int (*cmp)(void *priv, struct list_head *a, + struct list_head *b)); #endif diff --git a/lib/sort.c b/lib/sort.c index 926d004..5bab8ff 100644 --- a/lib/sort.c +++ b/lib/sort.c @@ -8,6 +8,7 @@ #include #include #include +#include static void u32_swap(void *a, void *b, int size) { @@ -121,3 +122,99 @@ static int sort_test(void) module_init(sort_test); #endif + +/** + * list_sort - sort a list. + * @priv: private data, passed to @cmp + * @head: the list to sort + * @cmp: the elements comparison function + * + * This function has been implemented by Mark J Roberts . It + * implements "merge sort" which has O(nlog(n)) complexity. The list is sorted + * in ascending order. + * + * The comparison function @cmp is supposed to return a negative value if @a is + * less than @b, and a positive value if @a is greater than @b. If @a and @b + * are equivalent, then it does not matter what this function returns. + */ +void list_sort(void *priv, struct list_head *head, + int (*cmp)(void *priv, struct list_head *a, + struct list_head *b)) +{ + struct list_head *p, *q, *e, *list, *tail, *oldhead; + int insize, nmerges, psize, qsize, i; + + if (list_empty(head)) + return; + + list = head->next; + list_del(head); + insize = 1; + for (;;) { + p = oldhead = list; + list = tail = NULL; + nmerges = 0; + + while (p) { + nmerges++; + q = p; + psize = 0; + for (i = 0; i < insize; i++) { + psize++; + q = q->next == oldhead ? NULL : q->next; + if (!q) + break; + } + + qsize = insize; + while (psize > 0 || (qsize > 0 && q)) { + if (!psize) { + e = q; + q = q->next; + qsize--; + if (q == oldhead) + q = NULL; + } else if (!qsize || !q) { + e = p; + p = p->next; + psize--; + if (p == oldhead) + p = NULL; + } else if (cmp(priv, p, q) <= 0) { + e = p; + p = p->next; + psize--; + if (p == oldhead) + p = NULL; + } else { + e = q; + q = q->next; + qsize--; + if (q == oldhead) + q = NULL; + } + if (tail) + tail->next = e; + else + list = e; + e->prev = tail; + tail = e; + } + p = q; + } + + tail->next = list; + list->prev = tail; + + if (nmerges <= 1) + break; + + insize *= 2; + } + + head->next = list; + head->prev = list->prev; + list->prev->next = head; + list->prev = head; +} + From andi@firstfloor.org Tue Jan 5 05:30:31 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,RCVD_IN_BRBL autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o05BUT71201567 for ; Tue, 5 Jan 2010 05:30:31 -0600 X-ASG-Debug-ID: 1262691078-553502870000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from one.firstfloor.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4953E1C2CE85 for ; Tue, 5 Jan 2010 03:31:18 -0800 (PST) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id 8KZTbL888lA7HldS for ; Tue, 05 Jan 2010 03:31:18 -0800 (PST) Received: from basil.firstfloor.org (p5B3CB3DB.dip0.t-ipconnect.de [91.60.179.219]) by one.firstfloor.org (Postfix) with ESMTP id 18F0D22C8036; Tue, 5 Jan 2010 12:31:16 +0100 (CET) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 49B3FB17C2; Tue, 5 Jan 2010 12:31:15 +0100 (CET) To: Dave Chinner Cc: xfs@oss.sgi.com, Artem Bityutskiy , Dave Airlie , linux-kernel@vger.kernel.org, Adrian Hunter X-ASG-Orig-Subj: Re: [PATCH] sort: Introduce generic list_sort function Subject: Re: [PATCH] sort: Introduce generic list_sort function From: Andi Kleen References: <1262649295-28427-1-git-send-email-david__25057.2445955642$1262651404$gmane$org@fromorbit.com> Date: Tue, 05 Jan 2010 12:31:15 +0100 In-Reply-To: <1262649295-28427-1-git-send-email-david__25057.2445955642$1262651404$gmane$org@fromorbit.com> (Dave Chinner's message of "Tue, 5 Jan 2010 10:54:55 +1100") Message-ID: <87eim4dbzw.fsf@basil.nowhere.org> User-Agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1262691079 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19015 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave Chinner writes: > + > +/** > + * list_sort - sort a list. > + * @priv: private data, passed to @cmp > + * @head: the list to sort > + * @cmp: the elements comparison function > + * > + * This function has been implemented by Mark J Roberts . It > + * implements "merge sort" which has O(nlog(n)) complexity. The list is sorted > + * in ascending order. > + * > + * The comparison function @cmp is supposed to return a negative value if @a is > + * than @b, and a positive value if @a is greater than @b. If @a and @b are > + * equivalent, then it does not matter what this function returns. > + */ > +void list_sort(void *priv, struct list_head *head, > + int (*cmp)(void *priv, struct list_head *a, > + struct list_head *b)) No EXPORT_SYMBOL? Also it would seem cleaner to have it in a own file. -Andi -- ak@linux.intel.com -- Speaking for myself only. From SRS0+CcnX+34+fromorbit.com=david@internode.on.net Tue Jan 5 06:21:04 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_44 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o05CL4ca204513 for ; Tue, 5 Jan 2010 06:21:04 -0600 X-ASG-Debug-ID: 1262694112-0f5600520000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A8F834CA814 for ; Tue, 5 Jan 2010 04:21: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 mSbtBfUsCePipXUG for ; Tue, 05 Jan 2010 04:21:53 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11073213-1927428 for multiple; Tue, 05 Jan 2010 22:51:03 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NS8PF-0006t2-5w; Tue, 05 Jan 2010 23:21:01 +1100 Date: Tue, 5 Jan 2010 23:21:01 +1100 From: Dave Chinner To: Andi Kleen Cc: xfs@oss.sgi.com, Artem Bityutskiy , Dave Airlie , linux-kernel@vger.kernel.org, Adrian Hunter X-ASG-Orig-Subj: [PATCH V3] sort: Introduce generic list_sort function Subject: [PATCH V3] sort: Introduce generic list_sort function Message-ID: <20100105122101.GR13802@discord.disaster> References: <1262649295-28427-1-git-send-email-david__25057.2445955642$1262651404$gmane$org@fromorbit.com> <87eim4dbzw.fsf@basil.nowhere.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <87eim4dbzw.fsf@basil.nowhere.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1262694114 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19017 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Jan 05, 2010 at 12:31:15PM +0100, Andi Kleen wrote: > Dave Chinner writes: > > + > > +/** > > + * list_sort - sort a list. > > + * @priv: private data, passed to @cmp > > + * @head: the list to sort > > + * @cmp: the elements comparison function > > + * > > + * This function has been implemented by Mark J Roberts . It > > + * implements "merge sort" which has O(nlog(n)) complexity. The list is sorted > > + * in ascending order. > > + * > > + * The comparison function @cmp is supposed to return a negative value if @a is > > + * than @b, and a positive value if @a is greater than @b. If @a and @b are > > + * equivalent, then it does not matter what this function returns. > > + */ > > +void list_sort(void *priv, struct list_head *head, > > + int (*cmp)(void *priv, struct list_head *a, > > + struct list_head *b)) > > No EXPORT_SYMBOL? Bah, who uses modules? :P Fixed. Updated patch below. > Also it would seem cleaner to have it in a own file. That might make sense if we had a large number of generic sort functions and it was difficult to tell the code apart, but we've only got 2 right now.... Cheers, Dave. -- Dave Chinner david@fromorbit.com sort: Introduce generic list_sort function There are two copies of list_sort() in the tree already, one in the DRM code, another in ubifs. Now XFS needs this as well. Create a generic list_sort() function from the ubifs version and convert existing users to it so we don't end up with yet another copy in the tree. Signed-off-by: Dave Chinner Acked-by: Dave Airlie Acked-by: Artem Bityutskiy --- V3: Export list_sort() V2: fix a typo drivers/gpu/drm/drm_modes.c | 90 ++------------------------------------- fs/ubifs/gc.c | 95 ----------------------------------------- include/linux/sort.h | 5 ++ lib/sort.c | 98 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 181 deletions(-) diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index 51f6772..3846ed4 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c @@ -1,9 +1,4 @@ /* - * The list_sort function is (presumably) licensed under the GPL (see the - * top level "COPYING" file for details). - * - * The remainder of this file is: - * * Copyright © 1997-2003 by The XFree86 Project, Inc. * Copyright © 2007 Dave Airlie * Copyright © 2007-2008 Intel Corporation @@ -36,6 +31,7 @@ */ #include +#include #include "drmP.h" #include "drm.h" #include "drm_crtc.h" @@ -829,6 +825,7 @@ EXPORT_SYMBOL(drm_mode_prune_invalid); /** * drm_mode_compare - compare modes for favorability + * @priv: unused * @lh_a: list_head for first mode * @lh_b: list_head for second mode * @@ -842,7 +839,7 @@ EXPORT_SYMBOL(drm_mode_prune_invalid); * Negative if @lh_a is better than @lh_b, zero if they're equivalent, or * positive if @lh_b is better than @lh_a. */ -static int drm_mode_compare(struct list_head *lh_a, struct list_head *lh_b) +static int drm_mode_compare(void *priv, struct list_head *lh_a, struct list_head *lh_b) { struct drm_display_mode *a = list_entry(lh_a, struct drm_display_mode, head); struct drm_display_mode *b = list_entry(lh_b, struct drm_display_mode, head); @@ -859,85 +856,6 @@ static int drm_mode_compare(struct list_head *lh_a, struct list_head *lh_b) return diff; } -/* FIXME: what we don't have a list sort function? */ -/* list sort from Mark J Roberts (mjr@znex.org) */ -void list_sort(struct list_head *head, - int (*cmp)(struct list_head *a, struct list_head *b)) -{ - struct list_head *p, *q, *e, *list, *tail, *oldhead; - int insize, nmerges, psize, qsize, i; - - list = head->next; - list_del(head); - insize = 1; - for (;;) { - p = oldhead = list; - list = tail = NULL; - nmerges = 0; - - while (p) { - nmerges++; - q = p; - psize = 0; - for (i = 0; i < insize; i++) { - psize++; - q = q->next == oldhead ? NULL : q->next; - if (!q) - break; - } - - qsize = insize; - while (psize > 0 || (qsize > 0 && q)) { - if (!psize) { - e = q; - q = q->next; - qsize--; - if (q == oldhead) - q = NULL; - } else if (!qsize || !q) { - e = p; - p = p->next; - psize--; - if (p == oldhead) - p = NULL; - } else if (cmp(p, q) <= 0) { - e = p; - p = p->next; - psize--; - if (p == oldhead) - p = NULL; - } else { - e = q; - q = q->next; - qsize--; - if (q == oldhead) - q = NULL; - } - if (tail) - tail->next = e; - else - list = e; - e->prev = tail; - tail = e; - } - p = q; - } - - tail->next = list; - list->prev = tail; - - if (nmerges <= 1) - break; - - insize *= 2; - } - - head->next = list; - head->prev = list->prev; - list->prev->next = head; - list->prev = head; -} - /** * drm_mode_sort - sort mode list * @mode_list: list to sort @@ -949,7 +867,7 @@ void list_sort(struct list_head *head, */ void drm_mode_sort(struct list_head *mode_list) { - list_sort(mode_list, drm_mode_compare); + list_sort(NULL, mode_list, drm_mode_compare); } EXPORT_SYMBOL(drm_mode_sort); diff --git a/fs/ubifs/gc.c b/fs/ubifs/gc.c index 618c270..4976e07 100644 --- a/fs/ubifs/gc.c +++ b/fs/ubifs/gc.c @@ -108,101 +108,6 @@ static int switch_gc_head(struct ubifs_info *c) } /** - * list_sort - sort a list. - * @priv: private data, passed to @cmp - * @head: the list to sort - * @cmp: the elements comparison function - * - * This function has been implemented by Mark J Roberts . It - * implements "merge sort" which has O(nlog(n)) complexity. The list is sorted - * in ascending order. - * - * The comparison function @cmp is supposed to return a negative value if @a is - * than @b, and a positive value if @a is greater than @b. If @a and @b are - * equivalent, then it does not matter what this function returns. - */ -static void list_sort(void *priv, struct list_head *head, - int (*cmp)(void *priv, struct list_head *a, - struct list_head *b)) -{ - struct list_head *p, *q, *e, *list, *tail, *oldhead; - int insize, nmerges, psize, qsize, i; - - if (list_empty(head)) - return; - - list = head->next; - list_del(head); - insize = 1; - for (;;) { - p = oldhead = list; - list = tail = NULL; - nmerges = 0; - - while (p) { - nmerges++; - q = p; - psize = 0; - for (i = 0; i < insize; i++) { - psize++; - q = q->next == oldhead ? NULL : q->next; - if (!q) - break; - } - - qsize = insize; - while (psize > 0 || (qsize > 0 && q)) { - if (!psize) { - e = q; - q = q->next; - qsize--; - if (q == oldhead) - q = NULL; - } else if (!qsize || !q) { - e = p; - p = p->next; - psize--; - if (p == oldhead) - p = NULL; - } else if (cmp(priv, p, q) <= 0) { - e = p; - p = p->next; - psize--; - if (p == oldhead) - p = NULL; - } else { - e = q; - q = q->next; - qsize--; - if (q == oldhead) - q = NULL; - } - if (tail) - tail->next = e; - else - list = e; - e->prev = tail; - tail = e; - } - p = q; - } - - tail->next = list; - list->prev = tail; - - if (nmerges <= 1) - break; - - insize *= 2; - } - - head->next = list; - head->prev = list->prev; - list->prev->next = head; - list->prev = head; -} - -/** * data_nodes_cmp - compare 2 data nodes. * @priv: UBIFS file-system description object * @a: first data node diff --git a/include/linux/sort.h b/include/linux/sort.h index d534da2..99a2ed5 100644 --- a/include/linux/sort.h +++ b/include/linux/sort.h @@ -3,8 +3,13 @@ #include +struct list_head; + void sort(void *base, size_t num, size_t size, int (*cmp)(const void *, const void *), void (*swap)(void *, void *, int)); +void list_sort(void *priv, struct list_head *head, + int (*cmp)(void *priv, struct list_head *a, + struct list_head *b)); #endif diff --git a/lib/sort.c b/lib/sort.c index 926d004..a9ce544 100644 --- a/lib/sort.c +++ b/lib/sort.c @@ -8,6 +8,7 @@ #include #include #include +#include static void u32_swap(void *a, void *b, int size) { @@ -121,3 +122,100 @@ static int sort_test(void) module_init(sort_test); #endif + +/** + * list_sort - sort a list. + * @priv: private data, passed to @cmp + * @head: the list to sort + * @cmp: the elements comparison function + * + * This function has been implemented by Mark J Roberts . It + * implements "merge sort" which has O(nlog(n)) complexity. The list is sorted + * in ascending order. + * + * The comparison function @cmp is supposed to return a negative value if @a is + * less than @b, and a positive value if @a is greater than @b. If @a and @b + * are equivalent, then it does not matter what this function returns. + */ +void list_sort(void *priv, struct list_head *head, + int (*cmp)(void *priv, struct list_head *a, + struct list_head *b)) +{ + struct list_head *p, *q, *e, *list, *tail, *oldhead; + int insize, nmerges, psize, qsize, i; + + if (list_empty(head)) + return; + + list = head->next; + list_del(head); + insize = 1; + for (;;) { + p = oldhead = list; + list = tail = NULL; + nmerges = 0; + + while (p) { + nmerges++; + q = p; + psize = 0; + for (i = 0; i < insize; i++) { + psize++; + q = q->next == oldhead ? NULL : q->next; + if (!q) + break; + } + + qsize = insize; + while (psize > 0 || (qsize > 0 && q)) { + if (!psize) { + e = q; + q = q->next; + qsize--; + if (q == oldhead) + q = NULL; + } else if (!qsize || !q) { + e = p; + p = p->next; + psize--; + if (p == oldhead) + p = NULL; + } else if (cmp(priv, p, q) <= 0) { + e = p; + p = p->next; + psize--; + if (p == oldhead) + p = NULL; + } else { + e = q; + q = q->next; + qsize--; + if (q == oldhead) + q = NULL; + } + if (tail) + tail->next = e; + else + list = e; + e->prev = tail; + tail = e; + } + p = q; + } + + tail->next = list; + list->prev = tail; + + if (nmerges <= 1) + break; + + insize *= 2; + } + + head->next = list; + head->prev = list->prev; + list->prev->next = head; + list->prev = head; +} + +EXPORT_SYMBOL(list_sort); From andi@firstfloor.org Tue Jan 5 06:51:50 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, RCVD_IN_BRBL autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o05Cpmiu206334 for ; Tue, 5 Jan 2010 06:51:50 -0600 X-ASG-Debug-ID: 1262695958-744e02790000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from one.firstfloor.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B04451509E22 for ; Tue, 5 Jan 2010 04:52:38 -0800 (PST) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id FF4PG2BMOIJuhUmw for ; Tue, 05 Jan 2010 04:52:38 -0800 (PST) Received: from basil.firstfloor.org (p5B3CB3DB.dip0.t-ipconnect.de [91.60.179.219]) by one.firstfloor.org (Postfix) with ESMTP id A672D22C8036; Tue, 5 Jan 2010 13:52:37 +0100 (CET) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 634ABB17C2; Tue, 5 Jan 2010 13:52:35 +0100 (CET) Date: Tue, 5 Jan 2010 13:52:35 +0100 From: Andi Kleen To: Dave Chinner Cc: Andi Kleen , xfs@oss.sgi.com, Artem Bityutskiy , Dave Airlie , linux-kernel@vger.kernel.org, Adrian Hunter X-ASG-Orig-Subj: Re: [PATCH V3] sort: Introduce generic list_sort function Subject: Re: [PATCH V3] sort: Introduce generic list_sort function Message-ID: <20100105125234.GD1778@basil.fritz.box> References: <1262649295-28427-1-git-send-email-david__25057.2445955642$1262651404$gmane$org@fromorbit.com> <87eim4dbzw.fsf@basil.nowhere.org> <20100105122101.GR13802@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100105122101.GR13802@discord.disaster> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1262695959 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19019 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > > Also it would seem cleaner to have it in a own file. > > That might make sense if we had a large number of generic sort > functions and it was difficult to tell the code apart, but we've > only got 2 right now.... I was more thinking of the case that it can be easily made a lib-y and then eliminated by the linker on non modular kernels if not needed (unfortunately that would require putting the EXPORT_SYMBOL somewhere else) -Andi From slpratt@austin.ibm.com Tue Jan 5 09:30:11 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o05FUAtj216458 for ; Tue, 5 Jan 2010 09:30:11 -0600 X-ASG-Debug-ID: 1262705460-111600b70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e6.ny.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9B6901412D0 for ; Tue, 5 Jan 2010 07:31:00 -0800 (PST) Received: from e6.ny.us.ibm.com (e6.ny.us.ibm.com [32.97.182.146]) by cuda.sgi.com with ESMTP id Bq7tDsjieYDr1K9e for ; Tue, 05 Jan 2010 07:31:00 -0800 (PST) Received: from d01relay01.pok.ibm.com (d01relay01.pok.ibm.com [9.56.227.233]) by e6.ny.us.ibm.com (8.14.3/8.13.1) with ESMTP id o05FQufI013016 for ; Tue, 5 Jan 2010 10:26:56 -0500 Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay01.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o05FUxG3103376 for ; Tue, 5 Jan 2010 10:30:59 -0500 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.3/8.13.1/NCO v10.0 AVout) with ESMTP id o05FUw75007194 for ; Tue, 5 Jan 2010 13:30:59 -0200 Received: from [9.41.46.217] (slpratt-laptop.austin.ibm.com [9.41.46.217]) by d01av02.pok.ibm.com (8.14.3/8.13.1/NCO v10.0 AVin) with ESMTP id o05FUueZ007124; Tue, 5 Jan 2010 13:30:56 -0200 Message-ID: <4B435B34.20003@austin.ibm.com> Date: Tue, 05 Jan 2010 09:31:00 -0600 From: Steven Pratt User-Agent: Thunderbird 2.0.0.23 (X11/20090817) MIME-Version: 1.0 To: Dave Chinner CC: Chris Mason , tytso@mit.edu, Evgeniy Polyakov , Peter Grandi , xfs@oss.sgi.com, reiserfs-devel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, jfs-discussion@lists.sourceforge.net, ext-users , linux-nilfs@vger.kernel.org X-ASG-Orig-Subj: Re: [Jfs-discussion] benchmark results Subject: Re: [Jfs-discussion] benchmark results References: <19251.26403.762180.228181@tree.ty.sabi.co.uk> <20091224212756.GM21594@thunk.org> <20091224234631.GA1028@ioremap.net> <20091225161146.GC32757@thunk.org> <20100104162748.GA11932@think> <20100105004117.GP13802@discord.disaster> In-Reply-To: <20100105004117.GP13802@discord.disaster> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: e6.ny.us.ibm.com[32.97.182.146] X-Barracuda-Start-Time: 1262705461 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19030 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave Chinner wrote: > On Mon, Jan 04, 2010 at 11:27:48AM -0500, Chris Mason wrote: > >> On Fri, Dec 25, 2009 at 11:11:46AM -0500, tytso@mit.edu wrote: >> >>> On Fri, Dec 25, 2009 at 02:46:31AM +0300, Evgeniy Polyakov wrote: >>> >>>>> [1] http://samba.org/ftp/tridge/dbench/README >>>>> >>>> Was not able to resist to write a small notice, what no matter what, but >>>> whatever benchmark is running, it _does_ show system behaviour in one >>>> or another condition. And when system behaves rather badly, it is quite >>>> a common comment, that benchmark was useless. But it did show that >>>> system has a problem, even if rarely triggered one :) >>>> >>> If people are using benchmarks to improve file system, and a benchmark >>> shows a problem, then trying to remedy the performance issue is a good >>> thing to do, of course. Sometimes, though the case which is >>> demonstrated by a poor benchmark is an extremely rare corner case that >>> doesn't accurately reflect common real-life workloads --- and if >>> addressing it results in a tradeoff which degrades much more common >>> real-life situations, then that would be a bad thing. >>> >>> In situations where benchmarks are used competitively, it's rare that >>> it's actually a *problem*. Instead it's much more common that a >>> developer is trying to prove that their file system is *better* to >>> gullible users who think that a single one-dimentional number is >>> enough for them to chose file system X over file system Y. >>> >> [ Look at all this email from my vacation...sorry for the delay ] >> >> It's important that people take benchmarks from filesystem developers >> with a big grain of salt, which is one reason the boxacle.net results >> are so nice. Steve more than willing to take patches and experiment to >> improve a given FS results, but his business is a fair representation of >> performance and it shows. >> > > Just looking at the results there, I notice that the RAID system XFS > mailserver results dropped by an order of magnitude between > 2.6.29-rc2 and 2.6.31. The single disk results are pretty > much identical across the two kernels. > > IIRC, in 2.6.31 RAID0 started passing barriers through so I suspect > this is the issue. However, seeing as dmesg is not collected by > the scripts after the run and the output of the mounttab does > not show default options, I cannot tell if this is the case. Well the dmesg collection is done by the actual benchmark run which occurs after the mount command is issued, so if you are looking for dmesg related to mounting the xfs volume, it should be in the dmesg we did collect. If dmesg actually formatted timestamps, this would be easier to see. It seems that nothing from xfs is ending up in dmesg since we are running xfs with different threads counts in order without reboot, so the dmesg for 16 thread xfs is run right after 1 thread xfs, but the dmesg show ext3 as the last thing, so safe to say no output from xfs is ending up in dmesg at all. > This > might be worth checking by running XFS with the "nobarrier" mount > option.... > I could give that a try for you. > FWIW, is it possible to get these benchmarks run on each filesystem for > each kernel release so ext/xfs/btrfs all get some regular basic > performance regression test coverage? > Possible yes. Just need to find the time to do the runs, and more importantly postprocess the data in some meaningful way. I'll see what I can do. Steve > Cheers, > > Dave. > From sandeen@sandeen.net Tue Jan 5 11:08:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o05H8WYQ222509 for ; Tue, 5 Jan 2010 11:08:32 -0600 X-ASG-Debug-ID: 1262711363-7bb103b00000-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 F1C034CC549 for ; Tue, 5 Jan 2010 09:09:23 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ntyDZtfXgKcxDlIB for ; Tue, 05 Jan 2010 09:09:23 -0800 (PST) Received: from int-mx05.intmail.prod.int.phx2.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.18]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o05H9LrL027138 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 5 Jan 2010 12:09:21 -0500 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by int-mx05.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o05H9KaU001273; Tue, 5 Jan 2010 12:09:21 -0500 Message-ID: <4B437240.3030902@sandeen.net> Date: Tue, 05 Jan 2010 11:09:20 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Krzysztof Adamski CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: NFS export broke with change from ext3 to xfs Subject: Re: NFS export broke with change from ext3 to xfs References: <1262652500.24160.27.camel@oxygen.netxsys.com> In-Reply-To: <1262652500.24160.27.camel@oxygen.netxsys.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.18 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1262711363 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19036 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Krzysztof Adamski wrote: > Hi All, > > I just changed one filesystem on my mythbox from ext3 to xfs, and now I > can't get a client machine to NFS mount from it. > > This is the export file on the server: > /file-store/nfs-roots/f1/home f1(rw,no_root_squash,sync,no_subtree_check) > /file-store/nfs-roots/f1/usr > f1(rw,no_root_squash,sync,no_subtree_check) > /file-store/nfs-roots/f1/var > f1(rw,no_root_squash,sync,no_subtree_check) > > and on the client(f1) the three filesystems are mount on /home, /usr, > and /var > > This worked fine when /file-store on the server was formatted with ext3, > now that it is formatted with xfs I get this message on the client: > mount.nfs: Stale NFS file handle > I get this message 3 times. I dunno, this should work. Anything in either of the system logs? -Eric > Nothing else changed, both systems are Debian Lenny with custom kernel. > Server is 2.6.28, client is 2.6.29.6. NFS is version 3. > The fstab on the server has this: > /dev/mapper/big--raid-file--store /file-store xfs > noatime,logbsize=256k,inode64 0 1 > > The reason for the change of the filesystem was an upgrade of the drives > in the RAID, now the filesystem is 7T instead of 2.4T, > nothing else was changed. Why did this work with ext3 and does not with > XFS? What can I do to get this to work, short of reverting to ext3? > > K > From k@adamski.org Tue Jan 5 11:21:00 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o05HL0sn223501 for ; Tue, 5 Jan 2010 11:21:00 -0600 X-ASG-Debug-ID: 1262712109-50fd01a70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from radon.netxsys.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 665551C2EF2F for ; Tue, 5 Jan 2010 09:21:50 -0800 (PST) Received: from radon.netxsys.com (radon.netxsys.com [204.16.202.162]) by cuda.sgi.com with ESMTP id bt7HiNfcJJ7nDTFX for ; Tue, 05 Jan 2010 09:21:50 -0800 (PST) Received: by radon.netxsys.com (Postfix, from userid 33) id 63F2CC000091; Tue, 5 Jan 2010 12:21:49 -0500 (EST) Received: from 205.189.93.240 (SquirrelMail authenticated user k@adamski.org) by webmail.netxsys.com with HTTP; Tue, 5 Jan 2010 12:21:49 -0500 (EST) Message-ID: <43686.205.189.93.240.1262712109.squirrel@webmail.netxsys.com> In-Reply-To: <4B437240.3030902@sandeen.net> References: <1262652500.24160.27.camel@oxygen.netxsys.com> <4B437240.3030902@sandeen.net> Date: Tue, 5 Jan 2010 12:21:49 -0500 (EST) X-ASG-Orig-Subj: Re: NFS export broke with change from ext3 to xfs Subject: Re: NFS export broke with change from ext3 to xfs From: "Krzysztof Adamski" To: "Eric Sandeen" Cc: xfs@oss.sgi.com User-Agent: SquirrelMail/1.4.9a MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-Barracuda-Connect: radon.netxsys.com[204.16.202.162] X-Barracuda-Start-Time: 1262712110 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19038 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > Krzysztof Adamski wrote: >> Hi All, >> >> I just changed one filesystem on my mythbox from ext3 to xfs, and now I >> can't get a client machine to NFS mount from it. >> >> This is the export file on the server: >> /file-store/nfs-roots/f1/home >> f1(rw,no_root_squash,sync,no_subtree_check) >> /file-store/nfs-roots/f1/usr >> f1(rw,no_root_squash,sync,no_subtree_check) >> /file-store/nfs-roots/f1/var >> f1(rw,no_root_squash,sync,no_subtree_check) >> >> and on the client(f1) the three filesystems are mount on /home, /usr, >> and /var >> >> This worked fine when /file-store on the server was formatted with ext3, >> now that it is formatted with xfs I get this message on the client: >> mount.nfs: Stale NFS file handle >> I get this message 3 times. > > I dunno, this should work. Anything in either of the system logs? On the server: Jan 4 19:27:03 Myth mountd[5342]: authenticated mount request from x.x.x.x:741 for /file-store/nfs-roots/f1/var (/file-store/nfs-roots/f1/var) Jan 4 19:27:03 Myth mountd[5342]: authenticated mount request from x.x.x.x:757 for /file-store/nfs-roots/f1/usr (/file-store/nfs-roots/f1/usr) Jan 4 19:27:03 Myth mountd[5342]: authenticated mount request from x.x.x.x:759 for /file-store/nfs-roots/f1/home (/file-store/nfs-roots/f1/home) but this is identical to when it worked. No logs on the client, /var is not yet mounted. Should I be asking on the NFS list? > -Eric > >> Nothing else changed, both systems are Debian Lenny with custom kernel. >> Server is 2.6.28, client is 2.6.29.6. NFS is version 3. >> The fstab on the server has this: >> /dev/mapper/big--raid-file--store /file-store xfs >> noatime,logbsize=256k,inode64 0 1 >> >> The reason for the change of the filesystem was an upgrade of the drives >> in the RAID, now the filesystem is 7T instead of 2.4T, >> nothing else was changed. Why did this work with ext3 and does not with >> XFS? What can I do to get this to work, short of reverting to ext3? >> >> K >> > From BATV+bb8bdaeaf028fa0ec3b7+2326+infradead.org+hch@bombadil.srs.infradead.org Tue Jan 5 11:42:42 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o05HgfE8224987 for ; Tue, 5 Jan 2010 11:42:42 -0600 X-ASG-Debug-ID: 1262713412-50cb02630000-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 DA76B1C2F06F for ; Tue, 5 Jan 2010 09:43:32 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id XswLCgH0LHjB9fqd for ; Tue, 05 Jan 2010 09:43:32 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NSDRM-0003tM-AV; Tue, 05 Jan 2010 17:43:32 +0000 Date: Tue, 5 Jan 2010 12:43:32 -0500 From: Christoph Hellwig To: Krzysztof Adamski Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: NFS export broke with change from ext3 to xfs Subject: Re: NFS export broke with change from ext3 to xfs Message-ID: <20100105174332.GA14496@infradead.org> References: <1262652500.24160.27.camel@oxygen.netxsys.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262652500.24160.27.camel@oxygen.netxsys.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262713412 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Remove the inode64 mount option or move every export to a separate filesystem. The NFS code can't cope with 64 bit inode numbers when exporting a subtree of a filesystem. You'd see the same issue with e.g. ocfs2 or gfs2. From aelder@sgi.com Tue Jan 5 12:07:34 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o05I7Y66226665 for ; Tue, 5 Jan 2010 12:07: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 7E41D8F8073; Tue, 5 Jan 2010 10:08:23 -0800 (PST) Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable X-MimeOLE: Produced By Microsoft Exchange V6.5 Subject: RE: [PATCH 7/6] XFS: Add trace points for per-ag refcount debugging. Date: Tue, 5 Jan 2010 12:08:22 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE012A690A@cf--amer001e--3.americas.sgi.com> In-Reply-To: <20091220042813.GJ4850@discord.disaster> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH 7/6] XFS: Add trace points for per-ag refcount debugging. Thread-Index: AcqBLSji2hP0g8pARuWY5fegAjor1gNBM/eQ From: "Alex Elder" To: "Dave Chinner" Cc: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave Chinner wrote: > Uninline xfs_perag_{get,put} so that tracepoints can be inserted > into them to speed debugging of reference count problems. Looks good. > Signed-off-by: Dave Chinner Reviewed-by: Alex Elder > --- > fs/xfs/linux-2.6/xfs_trace.h | 27 +++++++++++++++++++++++++++ > fs/xfs/xfs_ag.h | 2 ++ > fs/xfs/xfs_mount.c | 34 = ++++++++++++++++++++++++++++++++++ > fs/xfs/xfs_mount.h | 25 ++----------------------- > 4 files changed, 65 insertions(+), 23 deletions(-) >=20 > diff --git a/fs/xfs/linux-2.6/xfs_trace.h = b/fs/xfs/linux-2.6/xfs_trace.h > index d4ded59..5ec1475 100644 > --- a/fs/xfs/linux-2.6/xfs_trace.h > +++ b/fs/xfs/linux-2.6/xfs_trace.h > @@ -33,6 +33,33 @@ struct xfs_dquot; > struct xlog_ticket; > struct log; >=20 > +#define DEFINE_PERAG_REF_EVENT(name) \ > +TRACE_EVENT(name, \ > + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, int refcount, \ > + unsigned long caller_ip), \ > + TP_ARGS(mp, agno, refcount, caller_ip), \ > + TP_STRUCT__entry( \ > + __field(dev_t, dev) \ > + __field(xfs_agnumber_t, agno) \ > + __field(int, refcount) \ > + __field(unsigned long, caller_ip) \ > + ), \ > + TP_fast_assign( \ > + __entry->dev =3D mp->m_super->s_dev; \ > + __entry->agno =3D agno; \ > + __entry->refcount =3D refcount; \ > + __entry->caller_ip =3D caller_ip; \ > + ), \ > + TP_printk("dev %d:%d agno %u refcount %d caller %pf", \ > + MAJOR(__entry->dev), MINOR(__entry->dev), \ > + __entry->agno, \ > + __entry->refcount, \ > + (char *)__entry->caller_ip) \ > +); > + > +DEFINE_PERAG_REF_EVENT(xfs_perag_get) > +DEFINE_PERAG_REF_EVENT(xfs_perag_put) > + > #define DEFINE_ATTR_LIST_EVENT(name) \ > TRACE_EVENT(name, \ > TP_PROTO(struct xfs_attr_list_context *ctx), \ > diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h > index 18ae43f..963bc27 100644 > --- a/fs/xfs/xfs_ag.h > +++ b/fs/xfs/xfs_ag.h > @@ -197,6 +197,8 @@ typedef struct xfs_perag_busy { > #endif >=20 > 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 */ > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 1d00f7f..223d9c3 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -201,6 +201,38 @@ xfs_uuid_unmount( >=20 >=20 > /* > + * Reference counting access wrappers to the perag structures. > + */ > +struct xfs_perag * > +xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) > +{ > + struct xfs_perag *pag; > + int ref =3D 0; > + > + spin_lock(&mp->m_perag_lock); > + pag =3D radix_tree_lookup(&mp->m_perag_tree, agno); > + if (pag) { > + ASSERT(atomic_read(&pag->pag_ref) >=3D 0); > + /* catch leaks in the positive direction during testing */ > + ASSERT(atomic_read(&pag->pag_ref) < 1000); > + ref =3D atomic_inc_return(&pag->pag_ref); > + } > + spin_unlock(&mp->m_perag_lock); > + trace_xfs_perag_get(mp, agno, ref, _RET_IP_); > + return pag; > +} > + > +void > +xfs_perag_put(struct xfs_perag *pag) > +{ > + int ref; > + > + ASSERT(atomic_read(&pag->pag_ref) > 0); > + ref =3D atomic_dec_return(&pag->pag_ref); > + trace_xfs_perag_put(pag->pag_mount, pag->pag_agno, ref, _RET_IP_); > +} > + > +/* > * Free up the resources associated with a mount structure. Assume = that > * the structure was initially zeroed, so we can tell which fields = got > * initialized. > @@ -433,6 +465,8 @@ xfs_initialize_perag( > kmem_free(pag); > return -EEXIST; > } > + pag->pag_agno =3D index; > + pag->pag_mount =3D mp; > spin_unlock(&mp->m_perag_lock); > radix_tree_preload_end(); > } > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 16b2212..e62fd1c 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -386,29 +386,8 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, = xfs_daddr_t d) > /* > * perag get/put wrappers for ref counting > */ > -static inline struct xfs_perag * > -xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) > -{ > - struct xfs_perag *pag; > - > - spin_lock(&mp->m_perag_lock); > - pag =3D radix_tree_lookup(&mp->m_perag_tree, agno); > - if (pag) { > - ASSERT(atomic_read(&pag->pag_ref) >=3D 0); > - /* catch leaks in the positive direction during testing */ > - ASSERT(atomic_read(&pag->pag_ref) < 1000); > - atomic_inc(&pag->pag_ref); > - } > - spin_unlock(&mp->m_perag_lock); > - return pag; > -} > - > -static inline void > -xfs_perag_put(struct xfs_perag *pag) > -{ > - ASSERT(atomic_read(&pag->pag_ref) > 0); > - atomic_dec(&pag->pag_ref); > -} > +struct xfs_perag *xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t = agno); > +void xfs_perag_put(struct xfs_perag *pag); >=20 > /* > * Per-cpu superblock locking functions >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From eflorac@intellique.com Tue Jan 5 14:36:36 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o05KaZ1a236179 for ; Tue, 5 Jan 2010 14:36:35 -0600 X-ASG-Debug-ID: 1262723843-492102cb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp5-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 282F4ECF3EF for ; Tue, 5 Jan 2010 12:37:24 -0800 (PST) Received: from smtp5-g21.free.fr (smtp5-g21.free.fr [212.27.42.5]) by cuda.sgi.com with ESMTP id htfUZPAq9VCfeXAi for ; Tue, 05 Jan 2010 12:37:24 -0800 (PST) Received: from smtp5-g21.free.fr (localhost [127.0.0.1]) by smtp5-g21.free.fr (Postfix) with ESMTP id B6491D48084 for ; Tue, 5 Jan 2010 21:37:21 +0100 (CET) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp5-g21.free.fr (Postfix) with ESMTP id C1BDCD480F3 for ; Tue, 5 Jan 2010 21:37:18 +0100 (CET) Date: Tue, 5 Jan 2010 21:37:14 +0100 From: Emmanuel Florac To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: NFS export broke with change from ext3 to xfs Subject: Re: NFS export broke with change from ext3 to xfs Message-ID: <20100105213714.5b9b2a11@galadriel.home> In-Reply-To: <20100105174332.GA14496@infradead.org> References: <1262652500.24160.27.camel@oxygen.netxsys.com> <20100105174332.GA14496@infradead.org> Organization: Intellique X-Mailer: Claws Mail 3.0.2 (GTK+ 2.12.9; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp5-g21.free.fr[212.27.42.5] X-Barracuda-Start-Time: 1262723847 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19050 Rule breakdown below pts rule 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, 5 Jan 2010 12:43:32 -0500 vous =E9criviez: > Remove the inode64 mount option or move every export to a separate > filesystem. The NFS code can't cope with 64 bit inode numbers when > exporting a subtree of a filesystem. You'd see the same issue with > e.g. ocfs2 or gfs2. Does the kernel architecture (32 or 64 bits) have any influence there? --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From aelder@sgi.com Tue Jan 5 19:01:15 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o0611EGn001143 for ; Tue, 5 Jan 2010 19:01:15 -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 4AA61AC01C; Tue, 5 Jan 2010 17:02:03 -0800 (PST) Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Subject: RE: [PATCH] xfs: fix timestamp handling in xfs_setattr X-MimeOLE: Produced By Microsoft Exchange V6.5 Date: Tue, 5 Jan 2010 19:02:02 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE012A6913@cf--amer001e--3.americas.sgi.com> In-Reply-To: <20091223160913.GA13039@infradead.org> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH] xfs: fix timestamp handling in xfs_setattr Thread-Index: AcqD7Y2fACPQHSIeRKSMN70yNLczdgKfHoCg From: "Alex Elder" To: "Christoph Hellwig" Cc: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > We currently have some rather odd code in xfs_setattr for updating the > a/c/mtime timestampts: >=20 > - first we do a non-transaction update if all three are updated = together > - second we implicitly update the ctime for various changes instead = of > relying on the ATTR_CTIME flag > - third we set the timestamps to the current time instead of the = arguments > in the iattr structure in many cases. >=20 > This patch makes sure we update it in a consistant way: >=20 > - always transactional > - ctime is only updated if ATTR_CTIME is set or we do a size update, = which > is a special case > - always to the times passed in from the caller instead of the = current time >=20 > The only non-size caller of xfs_setattr that doesn't come from the VFS = is > updated to set ATTR_CTIME and pass in a valid ctime value. This looks good to me, although I acknowledge I haven't worked through it 100%. Another reviewer would be good. But even better, I really want to see the gnulib timestamp unit tests into xfstests to verify the behavior either way (which you indicated you'd work on...). In fact, if you've made any headway on it I'd like to run the tests against this patch before committing it. I'll run with this and will synch up with you on the timestamp tests, and hope for another review. Despite all that caveat crap... > Reported-by: Eric Blake > Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder =20 > Index: linux-2.6/fs/xfs/xfs_vnodeops.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- linux-2.6.orig/fs/xfs/xfs_vnodeops.c 2009-12-23 13:51:24.706170043 = +0100 > +++ linux-2.6/fs/xfs/xfs_vnodeops.c 2009-12-23 13:51:30.774170044 = +0100 > @@ -70,7 +70,6 @@ xfs_setattr( > uint commit_flags=3D0; > uid_t uid=3D0, iuid=3D0; > gid_t gid=3D0, igid=3D0; > - int timeflags =3D 0; > struct xfs_dquot *udqp, *gdqp, *olddquot1, *olddquot2; > int need_iolock =3D 1; >=20 > @@ -135,16 +134,13 @@ xfs_setattr( > if (flags & XFS_ATTR_NOLOCK) > need_iolock =3D 0; > if (!(mask & ATTR_SIZE)) { > - if ((mask !=3D (ATTR_CTIME|ATTR_ATIME|ATTR_MTIME)) || > - (mp->m_flags & XFS_MOUNT_WSYNC)) { > - tp =3D xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE); > - commit_flags =3D 0; > - if ((code =3D xfs_trans_reserve(tp, 0, > - XFS_ICHANGE_LOG_RES(mp), 0, > - 0, 0))) { > - lock_flags =3D 0; > - goto error_return; > - } > + tp =3D xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE); > + commit_flags =3D 0; > + code =3D xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES(mp), > + 0, 0, 0); > + if (code) { > + lock_flags =3D 0; > + goto error_return; > } > } else { > if (DM_EVENT_ENABLED(ip, DM_EVENT_TRUNCATE) && > @@ -295,15 +291,23 @@ xfs_setattr( > * or we are explicitly asked to change it. This handles > * the semantic difference between truncate() and ftruncate() > * as implemented in the VFS. > - */ > - if (iattr->ia_size !=3D ip->i_size || (mask & ATTR_CTIME)) > - timeflags |=3D XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG; > + * > + * The regular truncate() case without ATTR_CTIME and ATTR_MTIME > + * is a special case where we need to update the times despite > + * not having these flags set. For all other operations the > + * VFS set these flags explicitly if it wants a timestamp > + * update. > + */ > + if (iattr->ia_size !=3D ip->i_size && > + (!(mask & (ATTR_CTIME | ATTR_MTIME)))) { > + iattr->ia_ctime =3D iattr->ia_mtime =3D > + current_fs_time(inode->i_sb); > + mask |=3D ATTR_CTIME | ATTR_MTIME; > + } >=20 > if (iattr->ia_size > ip->i_size) { > ip->i_d.di_size =3D iattr->ia_size; > ip->i_size =3D iattr->ia_size; > - if (!(flags & XFS_ATTR_DMI)) > - xfs_ichgtime(ip, XFS_ICHGTIME_CHG); > xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > } else if (iattr->ia_size <=3D ip->i_size || > (iattr->ia_size =3D=3D 0 && ip->i_d.di_nextents)) { > @@ -374,9 +378,6 @@ xfs_setattr( > ip->i_d.di_gid =3D gid; > inode->i_gid =3D gid; > } > - > - xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE); > - timeflags |=3D XFS_ICHGTIME_CHG; > } >=20 > /* > @@ -393,51 +394,37 @@ xfs_setattr( >=20 > inode->i_mode &=3D S_IFMT; > inode->i_mode |=3D mode & ~S_IFMT; > - > - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > - timeflags |=3D XFS_ICHGTIME_CHG; > } >=20 > /* > * Change file access or modified times. > */ > - if (mask & (ATTR_ATIME|ATTR_MTIME)) { > - if (mask & ATTR_ATIME) { > - inode->i_atime =3D iattr->ia_atime; > - ip->i_d.di_atime.t_sec =3D iattr->ia_atime.tv_sec; > - ip->i_d.di_atime.t_nsec =3D iattr->ia_atime.tv_nsec; > - ip->i_update_core =3D 1; > - } > - if (mask & ATTR_MTIME) { > - inode->i_mtime =3D iattr->ia_mtime; > - ip->i_d.di_mtime.t_sec =3D iattr->ia_mtime.tv_sec; > - ip->i_d.di_mtime.t_nsec =3D iattr->ia_mtime.tv_nsec; > - timeflags &=3D ~XFS_ICHGTIME_MOD; > - timeflags |=3D XFS_ICHGTIME_CHG; > - } > - if (tp && (mask & (ATTR_MTIME_SET|ATTR_ATIME_SET))) > - xfs_trans_log_inode (tp, ip, XFS_ILOG_CORE); > + if (mask & ATTR_ATIME) { > + inode->i_atime =3D iattr->ia_atime; > + ip->i_d.di_atime.t_sec =3D iattr->ia_atime.tv_sec; > + ip->i_d.di_atime.t_nsec =3D iattr->ia_atime.tv_nsec; > + ip->i_update_core =3D 1; > } > - > - /* > - * Change file inode change time only if ATTR_CTIME set > - * AND we have been called by a DMI function. > - */ > - > - if ((flags & XFS_ATTR_DMI) && (mask & ATTR_CTIME)) { > + if (mask & ATTR_CTIME) { > inode->i_ctime =3D iattr->ia_ctime; > ip->i_d.di_ctime.t_sec =3D iattr->ia_ctime.tv_sec; > ip->i_d.di_ctime.t_nsec =3D iattr->ia_ctime.tv_nsec; > ip->i_update_core =3D 1; > - timeflags &=3D ~XFS_ICHGTIME_CHG; > + } > + if (mask & ATTR_MTIME) { > + inode->i_mtime =3D iattr->ia_mtime; > + ip->i_d.di_mtime.t_sec =3D iattr->ia_mtime.tv_sec; > + ip->i_d.di_mtime.t_nsec =3D iattr->ia_mtime.tv_nsec; > + ip->i_update_core =3D 1; > } >=20 > /* > - * Send out timestamp changes that need to be set to the > - * current time. Not done when called by a DMI function. > + * And finally, log the inode core if any attribute in it > + * has been changed. > */ > - if (timeflags && !(flags & XFS_ATTR_DMI)) > - xfs_ichgtime(ip, timeflags); > + if (mask & (ATTR_UID|ATTR_GID|ATTR_MODE| > + ATTR_ATIME|ATTR_CTIME|ATTR_MTIME)) > + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); >=20 > XFS_STATS_INC(xs_ig_attrchg); >=20 > @@ -452,12 +439,10 @@ xfs_setattr( > * mix so this probably isn't worth the trouble to optimize. > */ > code =3D 0; > - if (tp) { > - if (mp->m_flags & XFS_MOUNT_WSYNC) > - xfs_trans_set_sync(tp); > + if (mp->m_flags & XFS_MOUNT_WSYNC) > + xfs_trans_set_sync(tp); >=20 > - code =3D xfs_trans_commit(tp, commit_flags); > - } > + code =3D xfs_trans_commit(tp, commit_flags); >=20 > xfs_iunlock(ip, lock_flags); >=20 > Index: linux-2.6/fs/xfs/linux-2.6/xfs_acl.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_acl.c 2009-12-23 = 13:51:24.718170043 +0100 > +++ linux-2.6/fs/xfs/linux-2.6/xfs_acl.c 2009-12-23 13:51:30.775170044 = +0100 > @@ -251,8 +251,9 @@ xfs_set_mode(struct inode *inode, mode_t > if (mode !=3D inode->i_mode) { > struct iattr iattr; >=20 > - iattr.ia_valid =3D ATTR_MODE; > + iattr.ia_valid =3D ATTR_MODE | ATTR_CTIME; > iattr.ia_mode =3D mode; > + iattr.ia_ctime =3D current_fs_time(inode->i_sb); >=20 > error =3D -xfs_setattr(XFS_I(inode), &iattr, XFS_ATTR_NOACL); > } >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From xfs@bob.dscon.sk Wed Jan 6 03:02:04 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06923FM050775 for ; Wed, 6 Jan 2010 03:02:04 -0600 X-ASG-Debug-ID: 1262768574-159f01280000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bob.dscon.sk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5D158143F7F for ; Wed, 6 Jan 2010 01:02:54 -0800 (PST) Received: from bob.dscon.sk (bob.dscon.sk [88.86.113.10]) by cuda.sgi.com with ESMTP id LjTLs4chjxghFfP2 for ; Wed, 06 Jan 2010 01:02:54 -0800 (PST) Received: by bob.dscon.sk (Postfix, from userid 1007) id 41384DC3DC; Wed, 6 Jan 2010 10:02:53 +0100 (CET) Date: Wed, 6 Jan 2010 10:02:53 +0100 From: DS To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs 2.6.31.9 error - possibly SOLVED Subject: Re: xfs 2.6.31.9 error - possibly SOLVED Message-ID: <20100106090253.GA19339@bob.dscon.sk> References: <20091228151048.GA24031@bob.dscon.sk> <20091228232204.GB7613@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091228232204.GB7613@discord.disaster> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bob.dscon.sk[88.86.113.10] X-Barracuda-Start-Time: 1262768575 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19098 Rule breakdown below pts rule 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 was something wrong with the old FS and the kernel 2.6.31.9 (unable to replay log) has not been of much help. All works fine with kernel 2.6.27.42 and new clear FS for a few days . Thanks. Dusan On Tue, Dec 29, 2009 at 10:22:04AM +1100, Dave Chinner wrote: > On Mon, Dec 28, 2009 at 04:10:48PM +0100, DS wrote: > > Hello, > > > > after upgrade from Debian etch -> Debian lenny with custom kernel > > 2.6.31.9 (before 2.6.28.1) I see this error and server is > > resetting sometimes.. > > > > Filesystem was creating far far away (about 4years ago). > > > > XFS internal error XFS_WANT_CORRUPTED_RETURN at line 366 of file fs/xfs/xfs_alloc.c. Caller 0xffffffff81169ae3 > > Any errors in the log before this (e.g. IO errors)? > > > Pid: 4022, comm: procmail Not tainted 2.6.31.9 #3 > > Call Trace: > > [] xfs_error_report+0x3e/0x40 > > [] xfs_alloc_fixup_trees+0x2ba/0x340 > > [] ? xfs_alloc_get_rec+0x29/0x60 > > [] xfs_alloc_ag_vextent_near+0x3f3/0x940 > > [] xfs_alloc_ag_vextent+0xd5/0x130 > > [] xfs_alloc_vextent+0x3a8/0x4f0 > ..... > > Looks like a corrupted free space tree - that could have happened a > long time ago and only now are you tripping over it. I'd run > xfs_repair on the filesystem to fix up the problem. If it happens > again then we'll have to look deeper. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From pcdataentry@freemail.lt Wed Jan 6 08:39:23 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=AWL,BAYES_50,FH_DATE_PAST_20XX, MIME_8BIT_HEADER autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06EdNnC082334 for ; Wed, 6 Jan 2010 08:39:23 -0600 X-ASG-Debug-ID: 1262788814-75fb00780000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from zun-exch01.MILLERINT.COM (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0DFF014647F for ; Wed, 6 Jan 2010 06:40:14 -0800 (PST) Received: from zun-exch01.MILLERINT.COM (dragon.mii-rmcc.com [207.94.16.130]) by cuda.sgi.com with ESMTP id URTRCFpn4HY5qDpG for ; Wed, 06 Jan 2010 06:40:14 -0800 (PST) Received: from server2 ([65.38.188.153]) by zun-exch01.MILLERINT.COM with Microsoft SMTPSVC(6.0.3790.1830); Wed, 6 Jan 2010 07:40:13 -0700 thread-index: AcqO3hyxbRT9wslLRfSmMJdpjB5M0Q== Thread-Topic: =?iso-8859-1?Q?ROCKIES=AE_logo_lanyard_-_CinchStuff.com?= From: To: X-ASG-Orig-Subj: =?iso-8859-1?Q?ROCKIES=AE_logo_lanyard_-_CinchStuff.com?= Subject: =?iso-8859-1?Q?ROCKIES=AE_logo_lanyard_-_CinchStuff.com?= Date: Wed, 6 Jan 2010 07:39:54 -0700 Message-ID: <0867A53FAEA2451C98E3E1B612A447F3@server2> MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Mailer: Microsoft CDO for Windows 2000 Content-Class: urn:content-classes:message Importance: normal Priority: normal X-MimeOLE: Produced By Microsoft MimeOLE V6.00.3790.4133 X-OriginalArrivalTime: 06 Jan 2010 14:40:13.0815 (UTC) FILETIME=[27FB6070:01CA8EDE] X-Barracuda-Connect: dragon.mii-rmcc.com[207.94.16.130] X-Barracuda-Start-Time: 1262788815 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2454 1.0000 -0.5975 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.40 X-Barracuda-Spam-Status: No, SCORE=-0.40 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_SA161f, MAILTO_TO_SPAM_ADDR, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19117 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.20 BSF_SC5_SA161f Custom Rule SA161f X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dear xfs, Look at what I found at CinchStuff.com URGENT ATTENTION: PAID @ Home WORKS! $550 - $1,100 per week! http://fyad.org/106x8 Greetings! We work with multi-million and even multi-billion dollar companies that offer big payouts! Let us show you how to work less while making more money, 100% scam free! We have spent the last few years researching the most lucrative and unique ways for people of all ages 18 and above, to make money from home. The owner of the site has even worked for such infomercial legends as Don Lapre of the "TV Show Making Money", Susan Powter of "Stop The Insanity", and has even starred on the NEW Rich Jerk Infomercial! We know what it takes to make legitimate money from home and we believe we have now found it and want to help you every step of the way. Whether you want to do data entry part-time, full-time, or even stop and start again this is it! Pay checks sent to you every two weeks! GET EXCITED, you can start as early as today making as much as $550 - $1,100 per week! Visit here for more details: http://fyad.org/106x8 Warm regards, MR. Cashbomber enterdatajobworks2010@gmail.com P.S Due to high demand for this special offer, we now have limited membership spots available. Be sure to lock in your membership now before its too late! "We absolutely Guarantee our DataPcJobs program will help you Make Money from anywhere in the world on your computer. If youre not completely satisfied with our DataPcJobs program, simply let us know within 60 days and we will refund your money with no questions asked!" -------------- simply email here: datasourceassociates@e-mile.co.uk and add "remove" if not interested................... .. http://www.cinchstuff.com/shop/pc/viewprd.asp?idproduct=52 pcdataentryworks xfs From BATV+c85c17bc10db0e3ebba7+2327+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 6 10:39:05 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06Gd3ts094279 for ; Wed, 6 Jan 2010 10:39:05 -0600 X-ASG-Debug-ID: 1262795994-1fea01730000-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 7B299ED7934 for ; Wed, 6 Jan 2010 08:39:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id npyqBMEqHt6lMGMm for ; Wed, 06 Jan 2010 08:39:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NSYvJ-0007cq-Sw; Wed, 06 Jan 2010 16:39:53 +0000 Date: Wed, 6 Jan 2010 11:39:53 -0500 From: Christoph Hellwig To: Christian Kujau Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] use CFLAGS in src/Makefile Subject: Re: [PATCH] use CFLAGS in src/Makefile Message-ID: <20100106163953.GA4209@infradead.org> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262795995 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 02, 2010 at 02:16:08PM -0800, Christian Kujau wrote: > Hi, > > while compiling xfstests after configuring with a different CFLAGS value, > gcc fails in ./src: > > [...] > make[2]: Entering directory `/usr/local/src/xfstests-git/src' > gcc -g -O2 -DDEBUG -I../include -DVERSION=\"1.0.0\" -L/opt/xfsprogs/lib > -DREAD iopat.c -o preallo_rw_pattern_reader > iopat.c:21:21: error: xfs/xfs.h: No such file or directory > [...] > > Somehow CFLAGS isn't passed to gcc, but "GCFLAGS" is. I'm not too savvy > with the xfstests build system, but in include/builddefs.in we see: > > # Global, Platform, Local CFLAGS > CFLAGS += $(GCFLAGS) $(PCFLAGS) $(LCFLAGS) > > ...thus I'm proposing the following fix: This looks correct, or at least better than what we had before. But I really dislike how we defeat the abstraction used for compiling all the other tools. What might be better is to add a small preallo_rw_pattern_writer.c file that just contains: #define WRITE #include iopat.c and the same for the reader side and use the normal rules to compile the program. From BATV+c85c17bc10db0e3ebba7+2327+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 6 10:47:56 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06GltNi095037 for ; Wed, 6 Jan 2010 10:47:55 -0600 X-ASG-Debug-ID: 1262796527-594603060000-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 018EA146023 for ; Wed, 6 Jan 2010 08:48:47 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id GTmrjpLEymOcSlVv for ; Wed, 06 Jan 2010 08:48:47 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NSZ3s-0004mv-RM; Wed, 06 Jan 2010 16:48:44 +0000 Date: Wed, 6 Jan 2010 11:48:44 -0500 From: Christoph Hellwig To: Christian Kujau Cc: Dave Chinner , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] remove bashisms from xfstests Subject: Re: [PATCH] remove bashisms from xfstests Message-ID: <20100106164844.GB4209@infradead.org> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262796528 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, Jan 03, 2010 at 02:30:05AM -0800, Christian Kujau wrote: > While trying to run xfstests, I encountered several errors due to the fact > that my /bin/sh is not linked to /bin/bash but to dash(1), which can be > made the default /bin/sh in Debian based systems. The patch below is > rather large and is touching many files, but it's pretty straightfoward: > > 1) convert brace expansions (e.g. "rm -f symlink_{0,1,2,3}") I'll comment on these in detail below. > 2) convert "let..." into something (hopefully) more portable Dave converted these away from expr due to performance reasons. I'd like too see a prove that performance hasn't regressed due to this change. > 3) replace 'a == b' with 'a = b' in bourne shell scripts This looks fine. If you want feel free to submit these as a separate first patch so that we have the large pile sorted out. > - rm -f symlink_{0,1,2,3}{0,1,2,3,4,5,6,7,8,9} symlink_self empty_file > + rm -f symlink_* empty_file This kind of replacement looks fine. > -for f in symlink_{0,1,2,3}{0,1,2,3,4,5,6,7,8,9} > +f=1 > +while [ $f -le 40 ] > do > - ln -s $o $f > + ln -s $o symlink_$f > o=$f > + o=symlink_$f > + f=$((f + 1)) > done I fear this might cause some overhead in the shell. What about the following instead: for i in `seq 0 39`; do ln -s $o symlink_$i o=symlink_$i done Same applies to similar subsitutions. > diff -Nrup xfstests.orig/032 xfstests/032 > --- xfstests.orig/032 2010-01-03 00:42:16.601617592 -0800 > +++ xfstests/032 2010-01-03 00:43:56.321617592 -0800 > @@ -66,6 +66,7 @@ do > [ $fs = ext3 ] && preargs="-F" > [ $fs = ext4 ] && preargs="-F" > [ $fs = ext4dev ] && preargs="-F" > + [ $fs = nilfs2 ] && preargs="-q" This hunk is unrelated. Please submit it with a trivial one-liner description and a signed-off-by line and I'll put it in. > -echo -e -n "\n\r*** XFS QA 044 - done\n\r\n\r" >/dev/console > +printf "\n\r*** XFS QA 044 - done\n\r\n\r" >/dev/console This looks okay, but should be mentioned in the patch description. > echo "=== Recursive change ACL ===" > rm -fr root > -mkdir root > -pushd root >/dev/null > # create an arbitrary little tree > for i in 1 2 3 4 5 6 7 8 9 0 > do > - mkdir -p a/$i > - mkdir -p b/c$i/$i > - touch a/$i/mumble > + mkdir -p root/a/$i > + mkdir -p root/b/c$i/$i > + touch root/a/$i/mumble > done > -popd >/dev/null Same here. From BATV+c85c17bc10db0e3ebba7+2327+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 6 10:48:54 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06GmrdX095149 for ; Wed, 6 Jan 2010 10:48:53 -0600 X-ASG-Debug-ID: 1262796585-1ecc02120000-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 B2E73ED8067 for ; Wed, 6 Jan 2010 08:49:45 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 4XbGzUuY1eSBmZE9 for ; Wed, 06 Jan 2010 08:49:45 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NSZ4q-0006ZN-Uw; Wed, 06 Jan 2010 16:49:44 +0000 Date: Wed, 6 Jan 2010 11:49:44 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list , ext4 development , Theodore Tso X-ASG-Orig-Subj: Re: [PATCH] xfstests: add another fallocate test to 214 Subject: Re: [PATCH] xfstests: add another fallocate test to 214 Message-ID: <20100106164944.GA20137@infradead.org> References: <4B427731.9080801@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B427731.9080801@redhat.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262796585 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 04, 2010 at 05:18:09PM -0600, Eric Sandeen wrote: > ext4 had a regression where it double-accounted used blocks > if you fallocated on top of delalloc blocks. Ted sent a > c program to exploit it (see "fsstress-induced corruption reproduced" > on linux-ext4 on 12/31/2009) and it's trivial to do the same thing > within the xfstests framework using xfs_io. > > This also changes the handcrafted xfs_io tests to use the > _require_xfs_io_falloc helper, not sure how that got missed. Looks good, Reviewed-by: Christoph Hellwig From BATV+c85c17bc10db0e3ebba7+2327+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 6 10:53:37 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06GrbVO095545 for ; Wed, 6 Jan 2010 10:53:37 -0600 X-ASG-Debug-ID: 1262796869-3c9002770000-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 90BDF1C34018; Wed, 6 Jan 2010 08:54:29 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id fFsdhprHkFWpdB0h; Wed, 06 Jan 2010 08:54:29 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NSZ9Q-0001vb-6D; Wed, 06 Jan 2010 16:54:28 +0000 Date: Wed, 6 Jan 2010 11:54:28 -0500 From: Christoph Hellwig To: Alex Elder Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: fix timestamp handling in xfs_setattr Subject: Re: [PATCH] xfs: fix timestamp handling in xfs_setattr Message-ID: <20100106165427.GD25393@infradead.org> References: <20091223160913.GA13039@infradead.org> <1AB9A794DBDDF54A8A81BE2296F7BDFE012A6913@cf--amer001e--3.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE012A6913@cf--amer001e--3.americas.sgi.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262796869 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 05, 2010 at 07:02:02PM -0600, Alex Elder wrote: > This looks good to me, although I acknowledge I haven't worked through > it 100%. Another reviewer would be good. But even better, I really > want to see the gnulib timestamp unit tests into xfstests to verify > the behavior either way (which you indicated you'd work on...). In > fact, if you've made any headway on it I'd like to run the tests against > this patch before committing it. I already have the original testcase wired up for xfstests, I just need to send out the patch after fixing some more bits. I haven't looked at the whole gnulib timestamp tests yet. Note that we'd need to look for an older GPLv2 version to not create even more licencing mess. From BATV+c85c17bc10db0e3ebba7+2327+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 6 11:22:35 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06HMZN1098022 for ; Wed, 6 Jan 2010 11:22:35 -0600 X-ASG-Debug-ID: 1262798607-2e0f03da0000-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 CC1651DAF95C for ; Wed, 6 Jan 2010 09:23:27 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id jp9OQB49MWssVoow for ; Wed, 06 Jan 2010 09:23:27 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NSZbL-0008Vv-Ic; Wed, 06 Jan 2010 17:23:19 +0000 Date: Wed, 6 Jan 2010 12:23:19 -0500 From: Christoph Hellwig To: Andi Kleen Cc: Dave Chinner , xfs@oss.sgi.com, Artem Bityutskiy , Dave Airlie , linux-kernel@vger.kernel.org, Adrian Hunter X-ASG-Orig-Subj: Re: [PATCH V3] sort: Introduce generic list_sort function Subject: Re: [PATCH V3] sort: Introduce generic list_sort function Message-ID: <20100106172319.GA25046@infradead.org> References: <1262649295-28427-1-git-send-email-david__25057.2445955642$1262651404$gmane$org@fromorbit.com> <87eim4dbzw.fsf@basil.nowhere.org> <20100105122101.GR13802@discord.disaster> <20100105125234.GD1778@basil.fritz.box> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100105125234.GD1778@basil.fritz.box> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262798607 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 05, 2010 at 01:52:35PM +0100, Andi Kleen wrote: > > > Also it would seem cleaner to have it in a own file. > > > > That might make sense if we had a large number of generic sort > > functions and it was difficult to tell the code apart, but we've > > only got 2 right now.... > > I was more thinking of the case that it can be easily made a lib-y > and then eliminated by the linker on non modular kernels if not needed > (unfortunately that would require putting the EXPORT_SYMBOL somewhere else) lib-y doesn't work together with EXPORT_SYMBOL, having the export outside would also always pull it in. These days the whole lib-y mess doesn't make sense anymore - if we really need an optional library symbol we can just pull it in through a Kconfig variable. From BATV+c85c17bc10db0e3ebba7+2327+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 6 11:35:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06HZdtR098993 for ; Wed, 6 Jan 2010 11:35:39 -0600 X-ASG-Debug-ID: 1262799391-2826022f0000-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 8D8BE146C2F for ; Wed, 6 Jan 2010 09:36:31 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id LOCfJSbhC8hAOG1i for ; Wed, 06 Jan 2010 09:36:31 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NSZo5-0003r6-0u; Wed, 06 Jan 2010 17:36:29 +0000 Date: Wed, 6 Jan 2010 12:36:29 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christian Kujau , LKML , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: lockdep: inconsistent lock state Subject: Re: lockdep: inconsistent lock state Message-ID: <20100106173628.GA14148@infradead.org> References: <20091227212700.GA7613@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091227212700.GA7613@discord.disaster> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262799391 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 28, 2009 at 08:27:00AM +1100, Dave Chinner wrote: > This is the usual false positive that is detected - XFS takes locks in > reclaim that it also takes in non-reclaim paths. The reclaim path > from kswapd inverts lock ordering and so we get this report. This > case has never been a deadlock case because an inode in reclaim > cannot be referenced by any other path, so once again it is a > false positive.... This should be gone in 2.6.33-rc as we now tell lockdep about resetting the dependency graph for the iolock once entering the inode reclaim path. From BATV+c85c17bc10db0e3ebba7+2327+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 6 11:40:16 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06HeEmE099335 for ; Wed, 6 Jan 2010 11:40:15 -0600 X-ASG-Debug-ID: 1262799666-2827027c0000-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 C20E9147047; Wed, 6 Jan 2010 09:41:06 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 5F5fTY3rJST0nrch; Wed, 06 Jan 2010 09:41:06 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NSZsY-0004hn-CF; Wed, 06 Jan 2010 17:41:06 +0000 Date: Wed, 6 Jan 2010 12:41:06 -0500 From: Christoph Hellwig To: Bill Kendall Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] add lpath_to_handle to libhandle Subject: Re: [PATCH 1/2] add lpath_to_handle to libhandle Message-ID: <20100106174106.GB14148@infradead.org> References: <4AE08DC7.7000200@sgi.com> <20091024133904.GB23125@infradead.org> <4B300B2F.7080305@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B300B2F.7080305@sgi.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262799666 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean After talking to Alex I applied this now. I also wrote a short description for the changes. From BATV+c85c17bc10db0e3ebba7+2327+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 6 11:48:11 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06HmBOk099829 for ; Wed, 6 Jan 2010 11:48:11 -0600 X-ASG-Debug-ID: 1262800143-3bcb032d0000-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 70B8EED7F06; Wed, 6 Jan 2010 09:49:03 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id XZ7ldaiBpyADBvxc; Wed, 06 Jan 2010 09:49:03 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NSa0E-0006zz-RW; Wed, 06 Jan 2010 17:49:02 +0000 Date: Wed, 6 Jan 2010 12:49:02 -0500 From: Christoph Hellwig To: Bill Kendall Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] use time32_t consistently in xfsdump tree Subject: Re: [PATCH] use time32_t consistently in xfsdump tree Message-ID: <20100106174902.GA18167@infradead.org> References: <4B300389.7020905@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B300389.7020905@sgi.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262800143 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean After discussion with Alex I've put both patches into the xfsdump-dev repository. I've taken the final version each, with the description of the initial posting. From BATV+c85c17bc10db0e3ebba7+2327+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 6 12:07:10 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06I7AGW101221 for ; Wed, 6 Jan 2010 12:07:10 -0600 X-ASG-Debug-ID: 1262801282-342b00d10000-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 694481C3439F for ; Wed, 6 Jan 2010 10:08:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id eGs322IInc1oDb7W for ; Wed, 06 Jan 2010 10:08:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NSaIa-0002eL-Qd; Wed, 06 Jan 2010 18:08:00 +0000 Date: Wed, 6 Jan 2010 13:08:00 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/3] Kill async inode writeback V2 Subject: Re: [PATCH 0/3] Kill async inode writeback V2 Message-ID: <20100106180800.GA9613@infradead.org> References: <1262649861-28530-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262649861-28530-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262801282 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 Btw, after this series XFS_IFLUSH_DELWRI_ELSE_SYNC is also unused, might be worth to throw something like the patch below in to clean up xfs_iflush: I'm also not sure we do enough of the noblock calls either with or without your series. There seem to be a lot more non-blocking sync calls than iflush calls. Index: linux-2.6/fs/xfs/xfs_inode.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_inode.c 2010-01-04 16:51:27.885262385 +0100 +++ linux-2.6/fs/xfs/xfs_inode.c 2010-01-04 17:03:28.096003992 +0100 @@ -2827,8 +2827,6 @@ xfs_iflush( xfs_dinode_t *dip; xfs_mount_t *mp; int error; - int noblock = (flags == XFS_IFLUSH_DELWRI_NOBLOCK); - enum { INT_DELWRI = (1 << 0), INT_ASYNC = (1 << 1) }; XFS_STATS_INC(xs_iflush_count); @@ -2860,7 +2858,7 @@ xfs_iflush( * in the same cluster are dirty, they will probably write the inode * out for us if they occur after the log force completes. */ - if (noblock && xfs_ipincount(ip)) { + if ((flags & XFS_IFLUSH_NOBLOCK) && xfs_ipincount(ip)) { xfs_iunpin_nowait(ip); xfs_ifunlock(ip); return EAGAIN; @@ -2881,52 +2879,11 @@ xfs_iflush( } /* - * Decide how buffer will be flushed out. This is done before - * the call to xfs_iflush_int because this field is zeroed by it. - */ - if (iip != NULL && iip->ili_format.ilf_fields != 0) { - /* - * Flush out the inode buffer according to the directions - * of the caller. In the cases where the caller has given - * us a choice choose the non-delwri case. This is because - * the inode is in the AIL and we need to get it out soon. - */ - switch (flags) { - case XFS_IFLUSH_SYNC: - case XFS_IFLUSH_DELWRI_ELSE_SYNC: - flags = 0; - break; - case XFS_IFLUSH_DELWRI: - case XFS_IFLUSH_DELWRI_NOBLOCK: - flags = INT_DELWRI; - break; - default: - ASSERT(0); - flags = 0; - break; - } - } else { - switch (flags) { - case XFS_IFLUSH_DELWRI_NOBLOCK: - case XFS_IFLUSH_DELWRI_ELSE_SYNC: - case XFS_IFLUSH_DELWRI: - flags = INT_DELWRI; - break; - case XFS_IFLUSH_SYNC: - flags = 0; - break; - default: - ASSERT(0); - flags = 0; - break; - } - } - - /* * Get the buffer containing the on-disk inode. */ error = xfs_itobp(mp, NULL, ip, &dip, &bp, - noblock ? XFS_BUF_TRYLOCK : XFS_BUF_LOCK); + (flags & XFS_IFLUSH_NOBLOCK) ? + XFS_BUF_TRYLOCK : XFS_BUF_LOCK); if (error || !bp) { xfs_ifunlock(ip); return error; @@ -2954,10 +2911,10 @@ xfs_iflush( if (error) goto cluster_corrupt_out; - if (flags & INT_DELWRI) - xfs_bdwrite(mp, bp); - else + if (flags & XFS_IFLUSH_SYNC) error = xfs_bwrite(mp, bp); + else + xfs_bdwrite(mp, bp); return error; corrupt_out: Index: linux-2.6/fs/xfs/xfs_inode.h =================================================================== --- linux-2.6.orig/fs/xfs/xfs_inode.h 2010-01-04 16:59:53.765261226 +0100 +++ linux-2.6/fs/xfs/xfs_inode.h 2010-01-04 17:03:14.421006071 +0100 @@ -422,10 +422,8 @@ static inline void xfs_ifunlock(xfs_inod /* * Flags for xfs_iflush() */ -#define XFS_IFLUSH_DELWRI_ELSE_SYNC 1 -#define XFS_IFLUSH_SYNC 2 -#define XFS_IFLUSH_DELWRI 3 -#define XFS_IFLUSH_DELWRI_NOBLOCK 4 +#define XFS_IFLUSH_SYNC 1 +#define XFS_IFLUSH_NOBLOCK 2 /* * Flags for xfs_itruncate_start(). Index: linux-2.6/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_super.c 2010-01-04 17:01:27.788003888 +0100 +++ linux-2.6/fs/xfs/linux-2.6/xfs_super.c 2010-01-04 17:01:33.362004189 +0100 @@ -1075,7 +1075,7 @@ xfs_fs_write_inode( if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip)) goto out_unlock; - error = xfs_iflush(ip, XFS_IFLUSH_DELWRI_NOBLOCK); + error = xfs_iflush(ip, XFS_IFLUSH_NOBLOCK); } out_unlock: Index: linux-2.6/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_sync.c 2010-01-04 17:01:27.801255295 +0100 +++ linux-2.6/fs/xfs/linux-2.6/xfs_sync.c 2010-01-04 17:02:00.155005972 +0100 @@ -260,8 +260,7 @@ xfs_sync_inode_attr( goto out_unlock; } - error = xfs_iflush(ip, (flags & SYNC_WAIT) ? - XFS_IFLUSH_SYNC : XFS_IFLUSH_DELWRI); + error = xfs_iflush(ip, (flags & SYNC_WAIT) ? XFS_IFLUSH_SYNC : 0); out_unlock: xfs_iunlock(ip, XFS_ILOCK_SHARED); @@ -460,7 +459,7 @@ xfs_quiesce_fs( { int count = 0, pincount; - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI); + xfs_reclaim_inodes(mp, 0); xfs_flush_buftarg(mp->m_ddev_targp, 0); /* @@ -585,7 +584,7 @@ xfs_sync_worker( if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI); + xfs_reclaim_inodes(mp, 0); /* dgc: errors ignored here */ error = xfs_qm_sync(mp, SYNC_TRYLOCK); error = xfs_sync_fsdata(mp, SYNC_TRYLOCK); @@ -718,7 +717,7 @@ xfs_reclaim_inode( * xfs_iflush_done by locking and unlocking the flush lock. */ if (xfs_iflush(ip, sync_mode) == 0) { - if (sync_mode == XFS_IFLUSH_DELWRI) + if (sync_mode == 0) goto unlock_and_requeue; xfs_iflock(ip); xfs_ifunlock(ip); Index: linux-2.6/fs/xfs/xfs_inode_item.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_inode_item.c 2010-01-04 17:03:37.557003904 +0100 +++ linux-2.6/fs/xfs/xfs_inode_item.c 2010-01-04 17:03:42.356006322 +0100 @@ -806,7 +806,7 @@ xfs_inode_item_push( * will pull th einode from the AIL, mark it clean and unlock the flush * lock. */ - (void) xfs_iflush(ip, XFS_IFLUSH_DELWRI); + (void) xfs_iflush(ip, 0); xfs_iunlock(ip, XFS_ILOCK_SHARED); return; Index: linux-2.6/fs/xfs/xfs_mount.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_mount.c 2010-01-04 17:01:27.815003765 +0100 +++ linux-2.6/fs/xfs/xfs_mount.c 2010-01-04 17:02:16.218005804 +0100 @@ -1373,7 +1373,7 @@ xfs_unmountfs( * need to force the log first. */ xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE | XFS_LOG_SYNC); - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI); + xfs_reclaim_inodes(mp, 0); XFS_bflush(mp->m_ddev_targp); xfs_qm_unmount(mp); From BATV+c85c17bc10db0e3ebba7+2327+infradead.org+hch@bombadil.srs.infradead.org Wed Jan 6 12:08:46 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06I8kgX101382 for ; Wed, 6 Jan 2010 12:08:46 -0600 X-ASG-Debug-ID: 1262801378-6ec202140000-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 C5334ED82F3 for ; Wed, 6 Jan 2010 10:09:38 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id hCE0XxyXlFk94DMR for ; Wed, 06 Jan 2010 10:09:38 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NSaKA-0002uG-2n; Wed, 06 Jan 2010 18:09:38 +0000 Date: Wed, 6 Jan 2010 13:09:38 -0500 From: Christoph Hellwig To: Emmanuel Florac Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: NFS export broke with change from ext3 to xfs Subject: Re: NFS export broke with change from ext3 to xfs Message-ID: <20100106180938.GB9613@infradead.org> References: <1262652500.24160.27.camel@oxygen.netxsys.com> <20100105174332.GA14496@infradead.org> <20100105213714.5b9b2a11@galadriel.home> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100105213714.5b9b2a11@galadriel.home> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262801378 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 05, 2010 at 09:37:14PM +0100, Emmanuel Florac wrote: > Le Tue, 5 Jan 2010 12:43:32 -0500 vous ?criviez: > > > Remove the inode64 mount option or move every export to a separate > > filesystem. The NFS code can't cope with 64 bit inode numbers when > > exporting a subtree of a filesystem. You'd see the same issue with > > e.g. ocfs2 or gfs2. > > Does the kernel architecture (32 or 64 bits) have any influence there? Unfortunately not. But if you specify a uuid in the /etc/exports file it should use a different filesystem handle format that has space for 8 byte inode numbers. I'm not entirely sure how nfsutils selects them - it's been a while since I dealt with that code. From lists@nerdbynature.de Wed Jan 6 13:24:24 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_33 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06JONE1105866 for ; Wed, 6 Jan 2010 13:24:24 -0600 X-ASG-Debug-ID: 1262805914-552e002b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from moutng.kundenserver.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BE84214717A for ; Wed, 6 Jan 2010 11:25:14 -0800 (PST) Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.17.8]) by cuda.sgi.com with ESMTP id 3hDd20r4ovz2lTG0 for ; Wed, 06 Jan 2010 11:25:14 -0800 (PST) Received: from bogon.housecafe.de (ppp-93-104-176-88.dynamic.mnet-online.de [93.104.176.88]) by mrelayeu.kundenserver.de (node=mrbap2) with ESMTP (Nemesis) id 0Lurx3-1Nt2Gw0QEL-00zv4D; Wed, 06 Jan 2010 20:24:12 +0100 Received: from localhost ([127.0.0.1]) by bogon.housecafe.de with esmtp (Exim 4.69) (envelope-from ) id 1NSbUI-0008I7-JI; Wed, 06 Jan 2010 20:24:10 +0100 Date: Wed, 6 Jan 2010 11:24:10 -0800 (PST) From: Christian Kujau To: Christoph Hellwig cc: Dave Chinner , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] remove bashisms from xfstests Subject: Re: [PATCH] remove bashisms from xfstests In-Reply-To: <20100106164844.GB4209@infradead.org> Message-ID: References: <20100106164844.GB4209@infradead.org> User-Agent: Alpine 2.01 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Provags-ID: V01U2FsdGVkX19jaLzs+3nzOh2HCWXvge/2jFz3p5BlXfcu8Hv 7yGddOUaLa5Ml+0cUZJkZ+VRzEi6nhOYQnfx4zp6nWPtnbZ1rt H6WM2EwcY9yr7cJK66wJg== X-Barracuda-Connect: moutng.kundenserver.de[212.227.17.8] X-Barracuda-Start-Time: 1262805915 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19134 Rule breakdown below pts rule 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, 6 Jan 2010 at 11:48, Christoph Hellwig wrote: > > 2) convert "let..." into something (hopefully) more portable > > Dave converted these away from expr due to performance reasons. I'd > like too see a prove that performance hasn't regressed due to this > change. That's why I hesitated to just change all scripts to /bin/bash, but didn't dare to say so, because of the inevitable "but today's computers are fast enough" reactions :-) > > 3) replace 'a == b' with 'a = b' in bourne shell scripts > > This looks fine. If you want feel free to submit these as a separate > first patch so that we have the large pile sorted out. OK, will do. > I fear this might cause some overhead in the shell. What about the > following instead: > > for i in `seq 0 39`; do > ln -s $o symlink_$i > o=symlink_$i > done I didn't go for seq(1), as I feared this wouldn't be available on every machine. Given that the xfstests scripts have a lot of "what if we're running on IRIX" conditions, I just wasn't sure if seq(1) would be available there. But yes, I'd much rather like to do this with seq(1) as well, if this is OK to everybody. > > --- xfstests.orig/032 2010-01-03 00:42:16.601617592 -0800 > > +++ xfstests/032 2010-01-03 00:43:56.321617592 -0800 > > @@ -66,6 +66,7 @@ do > > [ $fs = ext3 ] && preargs="-F" > > [ $fs = ext4 ] && preargs="-F" > > [ $fs = ext4dev ] && preargs="-F" > > + [ $fs = nilfs2 ] && preargs="-q" > > This hunk is unrelated. Please submit it with a trivial one-liner > description and a signed-off-by line and I'll put it in. OK, will do. > > -echo -e -n "\n\r*** XFS QA 044 - done\n\r\n\r" >/dev/console > > +printf "\n\r*** XFS QA 044 - done\n\r\n\r" >/dev/console > > This looks okay, but should be mentioned in the patch description. Will do. It's needed, because sh(1)'s echo builtin doesn't know about -e. > > done > > -popd >/dev/null > > Same here. Will do. Standard sh(1) doesn't know popd/pushd either. Thanks Christoph! Christian. -- BOFH excuse #398: Data for intranet got routed through the extranet and landed on the internet. From andi@firstfloor.org Wed Jan 6 13:32:25 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06JWOJ3106399 for ; Wed, 6 Jan 2010 13:32:25 -0600 X-ASG-Debug-ID: 1262806395-5c9900240000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from one.firstfloor.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D83661471E3 for ; Wed, 6 Jan 2010 11:33:15 -0800 (PST) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id 1iXfclKCjnur1CVH for ; Wed, 06 Jan 2010 11:33:15 -0800 (PST) Received: from basil.firstfloor.org (p5B3CB538.dip0.t-ipconnect.de [91.60.181.56]) by one.firstfloor.org (Postfix) with ESMTP id 4CAA91A98018; Wed, 6 Jan 2010 20:33:13 +0100 (CET) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 95C60B17C2; Wed, 6 Jan 2010 20:33:12 +0100 (CET) Date: Wed, 6 Jan 2010 20:33:12 +0100 From: Andi Kleen To: Christoph Hellwig Cc: Andi Kleen , Dave Chinner , xfs@oss.sgi.com, Artem Bityutskiy , Dave Airlie , linux-kernel@vger.kernel.org, Adrian Hunter X-ASG-Orig-Subj: Re: [PATCH V3] sort: Introduce generic list_sort function Subject: Re: [PATCH V3] sort: Introduce generic list_sort function Message-ID: <20100106193312.GB31857@basil.fritz.box> References: <1262649295-28427-1-git-send-email-david__25057.2445955642$1262651404$gmane$org@fromorbit.com> <87eim4dbzw.fsf@basil.nowhere.org> <20100105122101.GR13802@discord.disaster> <20100105125234.GD1778@basil.fritz.box> <20100106172319.GA25046@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100106172319.GA25046@infradead.org> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1262806395 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19134 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > lib-y doesn't work together with EXPORT_SYMBOL, having the export > outside would also always pull it in. These days the whole lib-y mess > doesn't make sense anymore - if we really need an optional library > symbol we can just pull it in through a Kconfig variable. It works for non modular kernels with CONFIG_MODULES turned off. See also the other patch I posted yesterday to fix this for lib/* -Andi -- ak@linux.intel.com -- Speaking for myself only. From SRS0+mAyG+35+fromorbit.com=david@internode.on.net Wed Jan 6 16:35:44 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06MZipI117026 for ; Wed, 6 Jan 2010 16:35:44 -0600 X-ASG-Debug-ID: 1262817393-2466023b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EAD14148BC7 for ; Wed, 6 Jan 2010 14:36:34 -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 okDQbSDsBzZ4GCH5 for ; Wed, 06 Jan 2010 14:36:34 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11181299-1927428 for multiple; Thu, 07 Jan 2010 09:06:33 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NSeUR-0000gl-9j; Thu, 07 Jan 2010 09:36:31 +1100 Date: Thu, 7 Jan 2010 09:36:31 +1100 From: Dave Chinner To: Christian Kujau Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] remove bashisms from xfstests Subject: Re: [PATCH] remove bashisms from xfstests Message-ID: <20100106223631.GV13802@discord.disaster> References: <20100106164844.GB4209@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1262817395 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19143 Rule breakdown below pts rule 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 06, 2010 at 11:24:10AM -0800, Christian Kujau wrote: > On Wed, 6 Jan 2010 at 11:48, Christoph Hellwig wrote: > > > 2) convert "let..." into something (hopefully) more portable > > > > Dave converted these away from expr due to performance reasons. I'd > > like too see a prove that performance hasn't regressed due to this > > change. > > That's why I hesitated to just change all scripts to /bin/bash, but didn't > dare to say so, because of the inevitable "but today's computers are fast > enough" reactions :-) FYI - the problem I came across was to do with running xfsqa under UML, where forking a new process is an expensive operation (I measured it at about 300ms) and so using bash built-in expressions for incrementing variables is a major win in terms of test run time. IIRC, one test loops 100,000 times and the runtime went from half an hour to 10s just by using "let n=n+1" instead of expr... > > > > 3) replace 'a == b' with 'a = b' in bourne shell scripts > > > > This looks fine. If you want feel free to submit these as a separate > > first patch so that we have the large pile sorted out. > > OK, will do. > > > I fear this might cause some overhead in the shell. What about the > > following instead: > > > > for i in `seq 0 39`; do > > ln -s $o symlink_$i > > o=symlink_$i > > done > > I didn't go for seq(1), as I feared this wouldn't be available on every > machine. seq(1) is already used in several tests, so it is ok to use in more. :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+LiXy+35+fromorbit.com=david@internode.on.net Wed Jan 6 16:48:57 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06Mmvlf117975 for ; Wed, 6 Jan 2010 16:48:57 -0600 X-ASG-Debug-ID: 1262818186-303b03770000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7ECBAEDA0DF for ; Wed, 6 Jan 2010 14:49:47 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id FFkVPmG6pmOJTIQC for ; Wed, 06 Jan 2010 14:49:47 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11148643-1927428 for multiple; Thu, 07 Jan 2010 09:19:46 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NSehE-0000hb-Cr; Thu, 07 Jan 2010 09:49:44 +1100 Date: Thu, 7 Jan 2010 09:49:44 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/3] Kill async inode writeback V2 Subject: Re: [PATCH 0/3] Kill async inode writeback V2 Message-ID: <20100106224944.GW13802@discord.disaster> References: <1262649861-28530-1-git-send-email-david@fromorbit.com> <20100106180800.GA9613@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100106180800.GA9613@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1262818189 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19143 Rule breakdown below pts rule 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 06, 2010 at 01:08:00PM -0500, Christoph Hellwig wrote: > Btw, after this series XFS_IFLUSH_DELWRI_ELSE_SYNC is also unused, > might be worth to throw something like the patch below in to clean > up xfs_iflush: Yes, makes sense. I'll add the patch to my QA series after updating it for the slight changes to the unmount reclaim I ahd in the second posting of the patch. Can I get a signoff from you for this? > I'm also not sure we do enough of the noblock calls either with or > without your series. There seem to be a lot more non-blocking sync > calls than iflush calls. I don't quite follow - inode flushes from the bdi threads should be the majority of flushes (i.e. from xfs_fs_write_inode()) and they are non-blocking. the xfssyncd does delwri writeback (maybe that should be non-blocking and then we can get rid of that flag, too), so the only sync inode writeback path is from xfs_fs_write_inode() for sync flushing, as well as the unmount reclaim path.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+75kz+35+fromorbit.com=dave@internode.on.net Wed Jan 6 17:08:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06N8VIM120044 for ; Wed, 6 Jan 2010 17:08:32 -0600 X-ASG-Debug-ID: 1262819362-7eb001190000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C0C1FEDA2A1 for ; Wed, 6 Jan 2010 15:09: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 2RTVPm9vqpVxm6B5 for ; Wed, 06 Jan 2010 15:09:22 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11070986-1927428 for ; Thu, 07 Jan 2010 09:39:21 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NSf0B-0000jR-8O for xfs@oss.sgi.com; Thu, 07 Jan 2010 10:09:19 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NSewS-00073q-SU for xfs@oss.sgi.com; Thu, 07 Jan 2010 10:05:28 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/2] Fix inode reclaim problems (hopefully) Subject: [PATCH 0/2] Fix inode reclaim problems (hopefully) Date: Thu, 7 Jan 2010 10:05:23 +1100 Message-Id: <1262819125-27083-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1262819363 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19143 Rule breakdown below pts rule 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 seem to fix the inode reclaim issues I've been able to reproduce lately. The changes are still running xfsqa in a loop to confirm this, but the directory/small file stress test I've been running to trigger the problem has run for 10 hours with these fixes instead of dying after 20-30 minutes. The first patch is a rewrite of Christoph's reclaim under write lock fixes without all the code duplication, and the second avoids direct reclaim altogether because xfs_inode_clean() needs to be run when the flush lock is held to ensure the inode not under IO and really is reclaimable. From SRS0+75kz+35+fromorbit.com=dave@internode.on.net Wed Jan 6 17:08:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06N8V1h120045 for ; Wed, 6 Jan 2010 17:08:31 -0600 X-ASG-Debug-ID: 1262819361-7fc003bd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A1C411C35D04 for ; Wed, 6 Jan 2010 15:09: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 sWZ8JqoCf04na1dO for ; Wed, 06 Jan 2010 15:09:22 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11070984-1927428 for ; Thu, 07 Jan 2010 09:39:20 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NSf0B-0000jT-Bk for xfs@oss.sgi.com; Thu, 07 Jan 2010 10:09:19 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NSewT-00073u-0o for xfs@oss.sgi.com; Thu, 07 Jan 2010 10:05:29 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/2] xfs: reclaim all inodes by background tree walks Subject: [PATCH 2/2] xfs: reclaim all inodes by background tree walks Date: Thu, 7 Jan 2010 10:05:25 +1100 Message-Id: <1262819125-27083-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1262819125-27083-1-git-send-email-david@fromorbit.com> References: <1262819125-27083-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1262819363 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19143 Rule breakdown below pts rule 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 cannot do direct inode reclaim without taking the flush lock to ensure that we do not reclaim an inode under IO. We check the inode is clean before doing direct reclaim, but this is not good enough because the inode flush code marks the inode clean once it has copied the in-core dirty state to the backing buffer. It is the flush lock that determines whether the inode is still under IO, even though it is marked clean, and the inode is still required at IO completion so we can't reclaim it even though it is clean in core. Hence the requirement that we need to take the flush lock even on clean inodes because this guarantees that the inode writeback IO has completed and it is safe to reclaim the inode. With delayed write inode flushing, we coul dend up waiting a long time on the flush lock even for a clean inode. The background reclaim already handles this efficiently, so avoid all the problems by killing the direct reclaim path altogether. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 14 ++++++-------- fs/xfs/linux-2.6/xfs_sync.c | 11 ++++++++++- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index f3dd67d..23768f4 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -953,16 +953,14 @@ xfs_fs_destroy_inode( ASSERT_ALWAYS(!xfs_iflags_test(ip, XFS_IRECLAIM)); /* - * If we have nothing to flush with this inode then complete the - * teardown now, otherwise delay the flush operation. + * we always use background reclaim here because even if the + * inode is clean, it still may be under IO and hence we have + * to take the flush lock. The background reclaim path handles + * this more efficiently than we can here, so simply let background + * reclaim tear down all inodes. */ - if (!xfs_inode_clean(ip)) { - xfs_inode_set_reclaim_tag(ip); - return; - } - out_reclaim: - xfs_ireclaim(ip); + xfs_inode_set_reclaim_tag(ip); } /* diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 6d1cd6e..a1d7876 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -700,6 +700,8 @@ xfs_reclaim_inode( /* * In the case of a forced shutdown we rely on xfs_iflush() to * wait for the inode to be unpinned before returning an error. + * Because we hold the flush lock, we know that the inode cannot + * be under IO, so if it reports clean it can be reclaimed. */ if (!is_bad_inode(VFS_I(ip)) && !xfs_inode_clean(ip)) { /* @@ -726,9 +728,16 @@ xfs_reclaim_inode( return 0; unlock_and_requeue: + /* + * We could return EAGAIN here to make reclaim rescan the inode tree in + * a short while. However, this just burns CPU time scanning the tree + * waiting for IO to complete and xfssyncd never goes back to the idle + * state. Instead, return 0 to let the next scheduled background reclaim + * attempt to reclaim the inode again. + */ xfs_iflags_clear(ip, XFS_IRECLAIM); xfs_iunlock(ip, XFS_ILOCK_EXCL); - return EAGAIN; + return 0; } void -- 1.6.5 From SRS0+PCbb+35+fromorbit.com=dave@internode.on.net Wed Jan 6 17:08:32 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o06N8VED120046 for ; Wed, 6 Jan 2010 17:08:31 -0600 X-ASG-Debug-ID: 1262819361-7f2203df0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BBEF91C35D07 for ; Wed, 6 Jan 2010 15:09:22 -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 DtOyGSPqbPBtCJoT for ; Wed, 06 Jan 2010 15:09:22 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11267354-1927428 for ; Thu, 07 Jan 2010 09:39:20 +1030 (CDT) Received: from [192.168.1.6] (helo=disturbed) by discord with esmtp (Exim 4.69) (envelope-from ) id 1NSf0B-0000jS-9v for xfs@oss.sgi.com; Thu, 07 Jan 2010 10:09:19 +1100 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1NSewS-00073s-U8 for xfs@oss.sgi.com; Thu, 07 Jan 2010 10:05:28 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/2] xfs: reclaim inodes under a write lock Subject: [PATCH 1/2] xfs: reclaim inodes under a write lock Date: Thu, 7 Jan 2010 10:05:24 +1100 Message-Id: <1262819125-27083-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.6.5 In-Reply-To: <1262819125-27083-1-git-send-email-david@fromorbit.com> References: <1262819125-27083-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1262819363 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19143 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Make the inode tree reclaim walk exclusive to avoid races with concurrent sync walkers and lookups. This is a version of a patch posted by Christoph Hellwig that avoids all the code duplication. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_sync.c | 90 +++++++++++++++++++-------------------- fs/xfs/linux-2.6/xfs_sync.h | 2 +- fs/xfs/quota/xfs_qm_syscalls.c | 2 +- 3 files changed, 46 insertions(+), 48 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index f974d1a..6d1cd6e 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -55,7 +55,8 @@ xfs_inode_ag_lookup( struct xfs_mount *mp, struct xfs_perag *pag, uint32_t *first_index, - int tag) + int tag, + int write_lock) { int nr_found; struct xfs_inode *ip; @@ -65,7 +66,10 @@ xfs_inode_ag_lookup( * as the tree is sparse and a gang lookup walks to find * the number of objects requested. */ - read_lock(&pag->pag_ici_lock); + if (write_lock) + write_lock(&pag->pag_ici_lock); + else + read_lock(&pag->pag_ici_lock); if (tag == XFS_ICI_NO_TAG) { nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void **)&ip, *first_index, 1); @@ -89,7 +93,10 @@ xfs_inode_ag_lookup( return ip; unlock: - read_unlock(&pag->pag_ici_lock); + if (write_lock) + write_unlock(&pag->pag_ici_lock); + else + read_unlock(&pag->pag_ici_lock); return NULL; } @@ -100,7 +107,8 @@ xfs_inode_ag_walk( int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), int flags, - int tag) + int tag, + int write_lock) { uint32_t first_index; int last_error = 0; @@ -113,7 +121,8 @@ restart: int error = 0; xfs_inode_t *ip; - ip = xfs_inode_ag_lookup(mp, pag, &first_index, tag); + ip = xfs_inode_ag_lookup(mp, pag, &first_index, tag, + write_lock); if (!ip) break; @@ -145,7 +154,8 @@ xfs_inode_ag_iterator( int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), int flags, - int tag) + int tag, + int write_lock) { int error = 0; int last_error = 0; @@ -159,7 +169,8 @@ xfs_inode_ag_iterator( xfs_perag_put(pag); continue; } - error = xfs_inode_ag_walk(mp, pag, execute, flags, tag); + error = xfs_inode_ag_walk(mp, pag, execute, flags, tag, + write_lock); xfs_perag_put(pag); if (error) { last_error = error; @@ -184,18 +195,20 @@ xfs_sync_inode_valid( return EFSCORRUPTED; } - /* - * If we can't get a reference on the inode, it must be in reclaim. - * Leave it for the reclaim code to flush. Also avoid inodes that - * haven't been fully initialised. - */ + /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ + if (xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) { + read_unlock(&pag->pag_ici_lock); + return ENOENT; + } + + /* If we can't get a reference on the inode, it must be in reclaim. */ if (!igrab(inode)) { read_unlock(&pag->pag_ici_lock); return ENOENT; } read_unlock(&pag->pag_ici_lock); - if (is_bad_inode(inode) || xfs_iflags_test(ip, XFS_INEW)) { + if (is_bad_inode(inode)) { IRELE(ip); return ENOENT; } @@ -285,7 +298,7 @@ xfs_sync_data( ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, - XFS_ICI_NO_TAG); + XFS_ICI_NO_TAG, 0); if (error) return XFS_ERROR(error); @@ -307,7 +320,7 @@ xfs_sync_attr( ASSERT((flags & ~SYNC_WAIT) == 0); return xfs_inode_ag_iterator(mp, xfs_sync_inode_attr, flags, - XFS_ICI_NO_TAG); + XFS_ICI_NO_TAG, 0); } STATIC int @@ -669,33 +682,8 @@ xfs_reclaim_inode( xfs_inode_t *ip, int sync_mode) { - struct xfs_mount *mp = ip->i_mount; - struct xfs_perag *pag; - - /* - * The radix tree lock here protects a thread in xfs_iget_core from - * racing with us on linking the inode back with a vnode. - * Once we have the XFS_IRECLAIM flag set it will not touch - * us. - */ - pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); - write_lock(&pag->pag_ici_lock); - spin_lock(&ip->i_flags_lock); - if (__xfs_iflags_test(ip, XFS_IRECLAIM) || - !__xfs_iflags_test(ip, XFS_IRECLAIMABLE)) { - spin_unlock(&ip->i_flags_lock); - write_unlock(&pag->pag_ici_lock); - xfs_perag_put(pag); - return EAGAIN; - } - __xfs_iflags_set(ip, XFS_IRECLAIM); - spin_unlock(&ip->i_flags_lock); - write_unlock(&pag->pag_ici_lock); - xfs_perag_put(pag); - - /* - * The inode is flushed delayed write. That means the flush lock + * Inodes are flushed delayed write. That means the flush lock * may be held here and we will block for some time on it. Further, * if we hold the inode lock, we prevent the AIL from locking and * therefore being able to push the buffer. This means that we'll end @@ -791,12 +779,22 @@ xfs_reclaim_inode_now( struct xfs_perag *pag, int flags) { - /* ignore if already under reclaim */ - if (xfs_iflags_test(ip, XFS_IRECLAIM)) { - read_unlock(&pag->pag_ici_lock); + /* + * The radix tree lock here protects a thread in xfs_iget from racing + * with us starting reclaim on the inode. Once we have the + * XFS_IRECLAIM flag set it will not touch us. + */ + spin_lock(&ip->i_flags_lock); + ASSERT_ALWAYS(__xfs_iflags_test(ip, XFS_IRECLAIMABLE)); + if (__xfs_iflags_test(ip, XFS_IRECLAIM)) { + /* ignore as it is already under reclaim */ + spin_unlock(&ip->i_flags_lock); + write_unlock(&pag->pag_ici_lock); return 0; } - read_unlock(&pag->pag_ici_lock); + __xfs_iflags_set(ip, XFS_IRECLAIM); + spin_unlock(&ip->i_flags_lock); + write_unlock(&pag->pag_ici_lock); return xfs_reclaim_inode(ip, flags); } @@ -807,5 +805,5 @@ xfs_reclaim_inodes( int mode) { return xfs_inode_ag_iterator(mp, xfs_reclaim_inode_now, mode, - XFS_ICI_RECLAIM_TAG); + XFS_ICI_RECLAIM_TAG, 1); } diff --git a/fs/xfs/linux-2.6/xfs_sync.h b/fs/xfs/linux-2.6/xfs_sync.h index a500b4d..ea932b4 100644 --- a/fs/xfs/linux-2.6/xfs_sync.h +++ b/fs/xfs/linux-2.6/xfs_sync.h @@ -54,6 +54,6 @@ void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, int xfs_sync_inode_valid(struct xfs_inode *ip, struct xfs_perag *pag); int xfs_inode_ag_iterator(struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), - int flags, int tag); + int flags, int tag, int write_lock); #endif diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 71af76f..873e07e 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -891,7 +891,7 @@ xfs_qm_dqrele_all_inodes( uint flags) { ASSERT(mp->m_quotainfo); - xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, XFS_ICI_NO_TAG); + xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, XFS_ICI_NO_TAG, 0); } /*------------------------------------------------------------------------*/ -- 1.6.5 From lemaja1@t-com.me Thu Jan 7 00:28:35 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.2 required=5.0 tests=BAYES_50,FH_DATE_PAST_20XX, TVD_PH_7 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o076SYZp150545 for ; Thu, 7 Jan 2010 00:28:35 -0600 X-ASG-Debug-ID: 1262845547-1980007a0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from t-com.me (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6796F1499BF for ; Wed, 6 Jan 2010 22:25:47 -0800 (PST) Received: from t-com.me (mail30.t-com.me [213.149.114.239]) by cuda.sgi.com with ESMTP id VCNrF9qj90CY5Eyj for ; Wed, 06 Jan 2010 22:25:47 -0800 (PST) Received: (qmail 32443 invoked by uid 8); 7 Jan 2010 06:25:45 -0000 Received: from mail23.t-com.me by mxnode-2-21 (envelope-from , uid 105) with qmail-scanner-2.06 (spamassassin: 3.2.5. Clear:RC:0(213.149.114.232):SA:0(-2.3/6.0):. Processed in 0.491369 secs); 07 Jan 2010 06:25:45 -0000 X-OpenMX-Version: 1.2 Received: from mail23.t-com.me (HELO webmax.t-com.me) (213.149.114.232) by t-com.me with SMTP; 7 Jan 2010 06:25:44 -0000 MIME-Version: 1.0 Date: Thu, 07 Jan 2010 07:25:41 +0100 From: UPGRADETEAM To: undisclosed-recipients:; X-ASG-Orig-Subj: Account User Subject: Account User Reply-To: upgradeteam@india.com Message-ID: <7e2036b0e7bd8287a686c0bcd8a11c81@t-com.me> X-Sender: lemaja1@t-com.me User-Agent: Webmail Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="UTF-8" X-Barracuda-Connect: mail30.t-com.me[213.149.114.239] X-Barracuda-Start-Time: 1262845549 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0197 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19165 Rule breakdown below pts rule 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 Account User Due to the congestion in all Webmail users and removal of all unused Webmail Accounts, We would be shutting down all unused Accounts, You will have to confirm your E-mail by filling out your Login Information below after clicking the reply button, or your account will be suspended within 24 hours for security reasons. please send detail of login via: * User name:......................... * Password: ........................ * Date of Birth: .................... * Country Or Territory: ...... After following the instructions in the sheet, your account will not be interrupted and will continue as normal. Thanks for your attention to this request. We apologize for any inconveniences. Warning!!! Account owner that refuses to update his/her account after two weeks of receiving this warning will lose his or her account permanently. Sincerely, The Webmail From raziebe@gmail.com Thu Jan 7 01:36:46 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.6 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, HEADER_ESQ autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o077ajaL155052 for ; Thu, 7 Jan 2010 01:36:45 -0600 X-ASG-Debug-ID: 1262849856-2c1402000000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-fx0-f212.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3064B1C36D34 for ; Wed, 6 Jan 2010 23:37:37 -0800 (PST) Received: from mail-fx0-f212.google.com (mail-fx0-f212.google.com [209.85.220.212]) by cuda.sgi.com with ESMTP id NEUH1BxT84OEhuCO for ; Wed, 06 Jan 2010 23:37:37 -0800 (PST) Received: by fxm4 with SMTP id 4so14981151fxm.12 for ; Wed, 06 Jan 2010 23:37:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:from:date:message-id :subject:to:content-type; bh=rhSXaL8mj+vwo7WhObCrLmgZZ/AWf3mCPxt/JA3Y63Y=; b=r4lEDOl1VO2pt3EozSDUggznuDfAwOdtQnku5HkbpvA/RTh6bIXeYC//s5GFiXuFg3 H2qKPxlzChSQW8Gzwou/+bEyx5htRVOEpfCXjttgVSuzATpmGN25+6yZ/BwEsqJXgPVo aG/1ufJoVtN0cwfK51yeRHqcJo5sP4fB1IesQ= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:from:date:message-id:subject:to:content-type; b=w5+YQ8VeIIL/3PFelxMnvbtiK4SvpAccsG6n5B1NCrePMN53E96MfP/SOUdTadfe5v nkYWai5u0skrAyqSjnJvRXSdcAdFgZo6BcVsqmnZn5oOzWbCG7DbTfSsPFFIRQcN6V3o LFKv5/NOUsSSStRRza5CdKsEzWk4bagHOVe6U= MIME-Version: 1.0 Received: by 10.239.193.72 with SMTP id h8mr365283hbi.102.1262849856120; Wed, 06 Jan 2010 23:37:36 -0800 (PST) From: Raz Date: Thu, 7 Jan 2010 09:37:16 +0200 Message-ID: <5d96567b1001062337w105194c8u8eff888444709925@mail.gmail.com> X-ASG-Orig-Subj: how does sectsz is determined ? Subject: how does sectsz is determined ? To: linux-xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-fx0-f212.google.com[209.85.220.212] X-Barracuda-Start-Time: 1262849858 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.19169 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 How does sectsz determined to be 512 or 4096 ? I have an xfs file system over software raid , and sometimes I have 1/2K sector size and sometimes 4K . Problem is that direct io buffers are aligned to 1/2k and not 4K. kernel is 2.6.18-8.el5. thank you. raz meta-data=/dev/md5 isize=256 agcount=33, agsize=10992384 blks = sectsz=4096 attr=0 data = bsize=4096 blocks=351780864, imaxpct=25 = sunit=768 swidth=768 blks, unwritten=1 naming =version 2 bsize=4096 log =internal bsize=4096 blocks=32768, version=2 = sectsz=4096 sunit=1 blks realtime =none extsz=3145728 blocks=0, rtextents=0 From SRS0+8UbP+36+fromorbit.com=david@internode.on.net Thu Jan 7 04:48:37 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o07AmaCW168063 for ; Thu, 7 Jan 2010 04:48:36 -0600 X-ASG-Debug-ID: 1262861365-2bac01330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3B257150F9CD for ; Thu, 7 Jan 2010 02:49: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 pckkSS1jELQc0Hgn for ; Thu, 07 Jan 2010 02:49:26 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11302954-1927428 for ; Thu, 07 Jan 2010 21:19:25 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NSpvf-0001RI-HQ for xfs@oss.sgi.com; Thu, 07 Jan 2010 21:49:23 +1100 Date: Thu, 7 Jan 2010 21:49:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/2] Fix inode reclaim problems (hopefully) Subject: Re: [PATCH 0/2] Fix inode reclaim problems (hopefully) Message-ID: <20100107104923.GZ13802@discord.disaster> References: <1262819125-27083-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262819125-27083-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1262861368 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19182 Rule breakdown below pts rule 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 07, 2010 at 10:05:23AM +1100, Dave Chinner wrote: > These two patches seem to fix the inode reclaim issues I've been > able to reproduce lately. The changes are still running xfsqa in a > loop to confirm this, but the directory/small file stress test I've > been running to trigger the problem has run for 10 hours with these > fixes instead of dying after 20-30 minutes. Still running xfsqa 11 hours later without any problem, so it looks like this series fixes the problem I was seeing. Score another win for the new tracing code :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Jan 7 10:34:26 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_25 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o07GYPk0192995 for ; Thu, 7 Jan 2010 10:34:25 -0600 X-ASG-Debug-ID: 1262882117-5ca101610000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 46FBA14B135 for ; Thu, 7 Jan 2010 08:35:17 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id vZyRGcAquGSk6k5R for ; Thu, 07 Jan 2010 08:35:17 -0800 (PST) Received: by mail.sandeen.net (Postfix, from userid 48) id 361A3178B901; Thu, 7 Jan 2010 10:35:17 -0600 (CST) Received: from 66.187.233.202 (SquirrelMail authenticated user sandeen) by sandeen.net with HTTP; Thu, 7 Jan 2010 10:35:17 -0600 (CST) Message-ID: <26076.66.187.233.202.1262882117.squirrel@sandeen.net> In-Reply-To: <5d96567b1001062337w105194c8u8eff888444709925@mail.gmail.com> References: <5d96567b1001062337w105194c8u8eff888444709925@mail.gmail.com> Date: Thu, 7 Jan 2010 10:35:17 -0600 (CST) X-ASG-Orig-Subj: Re: how does sectsz is determined ? Subject: Re: how does sectsz is determined ? From: "Eric Sandeen" To: "Raz" Cc: linux-xfs@oss.sgi.com User-Agent: SquirrelMail/1.4.8-5.el5.centos.10 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1262882118 X-Barracuda-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.19196 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 Raz wrote: > How does sectsz determined to be 512 or 4096 ? > I have an xfs file system over software raid , and sometimes I have > 1/2K sector size > and sometimes 4K . Problem is that direct io buffers are aligned to > 1/2k and not 4K. > kernel is 2.6.18-8.el5. thank you. > raz > > > meta-data=/dev/md5 isize=256 agcount=33, agsize=10992384 > blks > = sectsz=4096 attr=0 > data = bsize=4096 blocks=351780864, imaxpct=25 > = sunit=768 swidth=768 blks, unwritten=1 > naming =version 2 bsize=4096 > log =internal bsize=4096 blocks=32768, version=2 > = sectsz=4096 sunit=1 blks > realtime =none extsz=3145728 blocks=0, rtextents=0 > for actual hardware sector size, see platform_findsizes(char *path, int fd, long long *sz, int *bsz) : if (ioctl(fd, BLKSSZGET, bsz) < 0) { fprintf(stderr, _("%s: warning - cannot get sector size " "from block device %s: %s\n"), progname, path, strerror(errno)); *bsz = BBSIZE; } but also for software raid, which is more relevant to your case: int md_get_subvol_stripe( char *dfile, sv_type_t type, int *sunit, int *swidth, int *sectalign, struct stat64 *sb) { ... *sectalign = (md.level == 4 || md.level == 5 || md.level == 6); ... } This sets ft->sectoralign, if (ft.sectoralign) { sectorsize = blocksize; sectorlog = libxfs_highbit32(sectorsize); if (loginternal) { lsectorsize = sectorsize; lsectorlog = sectorlog; } } IOW we set "sector size" to the block size to avoid md switching cache sizes... -Eric From BATV+46b1ae413952afea7e2e+2329+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 8 04:13:49 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08ADknQ028683 for ; Fri, 8 Jan 2010 04:13:49 -0600 X-ASG-Debug-ID: 1262945679-610a022b0000-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 11FB21C3B430 for ; Fri, 8 Jan 2010 02:14:39 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 5M0rCwXsxpQAsq8y for ; Fri, 08 Jan 2010 02:14:39 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NTBrZ-0004DP-J3; Fri, 08 Jan 2010 10:14:37 +0000 Date: Fri, 8 Jan 2010 05:14:37 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/3] Kill async inode writeback V2 Subject: Re: [PATCH 0/3] Kill async inode writeback V2 Message-ID: <20100108101437.GA19491@infradead.org> References: <1262649861-28530-1-git-send-email-david@fromorbit.com> <20100106180800.GA9613@infradead.org> <20100106224944.GW13802@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100106224944.GW13802@discord.disaster> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262945680 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 07, 2010 at 09:49:44AM +1100, Dave Chinner wrote: > On Wed, Jan 06, 2010 at 01:08:00PM -0500, Christoph Hellwig wrote: > > Btw, after this series XFS_IFLUSH_DELWRI_ELSE_SYNC is also unused, > > might be worth to throw something like the patch below in to clean > > up xfs_iflush: > > Yes, makes sense. I'll add the patch to my QA series after updating > it for the slight changes to the unmount reclaim I ahd in the > second posting of the patch. Can I get a signoff from you for this? Signed-off-by: Christoph Hellwig > > > I'm also not sure we do enough of the noblock calls either with or > > without your series. There seem to be a lot more non-blocking sync > > calls than iflush calls. > > I don't quite follow - inode flushes from the bdi threads should be > the majority of flushes (i.e. from xfs_fs_write_inode()) and they > are non-blocking. the xfssyncd does delwri writeback (maybe that > should be non-blocking and then we can get rid of that flag, too), > so the only sync inode writeback path is from xfs_fs_write_inode() > for sync flushing, as well as the unmount reclaim path.... Sorry, I mean non-blocking delwri calls above. xfs_sync_worker should certainly be non-blocking as the whole daemon is operating that way. And possibly xfs_sync_attr as well. From BATV+46b1ae413952afea7e2e+2329+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 8 04:19:49 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08AJnn4029267 for ; Fri, 8 Jan 2010 04:19:49 -0600 X-ASG-Debug-ID: 1262946042-1278002c0000-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 A1BDC1C3B563 for ; Fri, 8 Jan 2010 02:20:42 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id f6O1qTH1552SyWFA for ; Fri, 08 Jan 2010 02:20:42 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NTBxS-0005vq-Bt; Fri, 08 Jan 2010 10:20:42 +0000 Date: Fri, 8 Jan 2010 05:20:42 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: reclaim inodes under a write lock Subject: Re: [PATCH 1/2] xfs: reclaim inodes under a write lock Message-ID: <20100108102042.GA16640@infradead.org> References: <1262819125-27083-1-git-send-email-david@fromorbit.com> <1262819125-27083-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262819125-27083-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262946042 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 07, 2010 at 10:05:24AM +1100, Dave Chinner wrote: > Make the inode tree reclaim walk exclusive to avoid races with > concurrent sync walkers and lookups. This is a version of > a patch posted by Christoph Hellwig that avoids all the code > duplication. I don't like the write_lock flag very much, but given that the other option is duplication we might have to live it. > - /* > - * If we can't get a reference on the inode, it must be in reclaim. > - * Leave it for the reclaim code to flush. Also avoid inodes that > - * haven't been fully initialised. > - */ > + /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ > + if (xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) { > + read_unlock(&pag->pag_ici_lock); > + return ENOENT; > + } > + > + /* If we can't get a reference on the inode, it must be in reclaim. */ > if (!igrab(inode)) { > read_unlock(&pag->pag_ici_lock); > return ENOENT; > } > read_unlock(&pag->pag_ici_lock); > > - if (is_bad_inode(inode) || xfs_iflags_test(ip, XFS_INEW)) { > + if (is_bad_inode(inode)) { > IRELE(ip); > return ENOENT; That's an unrelated change and should be a separate patch. > @@ -791,12 +779,22 @@ xfs_reclaim_inode_now( > struct xfs_perag *pag, > int flags) > { > + /* > + * The radix tree lock here protects a thread in xfs_iget from racing > + * with us starting reclaim on the inode. Once we have the > + * XFS_IRECLAIM flag set it will not touch us. > + */ > + spin_lock(&ip->i_flags_lock); > + ASSERT_ALWAYS(__xfs_iflags_test(ip, XFS_IRECLAIMABLE)); > + if (__xfs_iflags_test(ip, XFS_IRECLAIM)) { > + /* ignore as it is already under reclaim */ > + spin_unlock(&ip->i_flags_lock); > + write_unlock(&pag->pag_ici_lock); > return 0; > } > + __xfs_iflags_set(ip, XFS_IRECLAIM); > + spin_unlock(&ip->i_flags_lock); > + write_unlock(&pag->pag_ici_lock); > > return xfs_reclaim_inode(ip, flags); Once you move things around please merge xfs_reclaim_inode_now and xfs_reclaim_inode into a single function. And yes, all this currently doesn't apply against the XFS tree or mainline, but you know that already. From BATV+46b1ae413952afea7e2e+2329+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 8 04:23:19 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08ANJK7029595 for ; Fri, 8 Jan 2010 04:23:19 -0600 X-ASG-Debug-ID: 1262946252-61cf01310000-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 9DE7F151C9F for ; Fri, 8 Jan 2010 02:24:12 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id rDhnMslyIEURfvpg for ; Fri, 08 Jan 2010 02:24:12 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NTC0m-00029G-Sw; Fri, 08 Jan 2010 10:24:09 +0000 Date: Fri, 8 Jan 2010 05:24:08 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: reclaim all inodes by background tree walks Subject: Re: [PATCH 2/2] xfs: reclaim all inodes by background tree walks Message-ID: <20100108102408.GB16640@infradead.org> References: <1262819125-27083-1-git-send-email-david@fromorbit.com> <1262819125-27083-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262819125-27083-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262946252 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 safe to me. I wonder whaimpact leaving the inodes around for longer has to memory usage for inode heavy workloads, though. > unlock_and_requeue: > + /* > + * We could return EAGAIN here to make reclaim rescan the inode tree in > + * a short while. However, this just burns CPU time scanning the tree > + * waiting for IO to complete and xfssyncd never goes back to the idle > + * state. Instead, return 0 to let the next scheduled background reclaim > + * attempt to reclaim the inode again. > + */ > xfs_iflags_clear(ip, XFS_IRECLAIM); > xfs_iunlock(ip, XFS_ILOCK_EXCL); > - return EAGAIN; > + return 0; This is an unrelated change and should be a patch of it's own. From BATV+46b1ae413952afea7e2e+2329+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 8 04:35:29 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08AZSai030808 for ; Fri, 8 Jan 2010 04:35:29 -0600 X-ASG-Debug-ID: 1262946981-792402250000-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 18793EE9A0E for ; Fri, 8 Jan 2010 02:36:21 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id vQvbdZrNbFxVHFfB for ; Fri, 08 Jan 2010 02:36:21 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NTCCb-0004CZ-BI; Fri, 08 Jan 2010 10:36:21 +0000 Date: Fri, 8 Jan 2010 05:36:21 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: Use delayed write for inodes rather than async Subject: Re: [PATCH 1/3] xfs: Use delayed write for inodes rather than async Message-ID: <20100108103620.GA11769@infradead.org> References: <1262649861-28530-1-git-send-email-david@fromorbit.com> <1262649861-28530-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262649861-28530-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262946982 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 > +++ b/fs/xfs/linux-2.6/xfs_sync.c > @@ -460,8 +460,8 @@ xfs_quiesce_fs( > { > int count = 0, pincount; > > + xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI); > xfs_flush_buftarg(mp->m_ddev_targp, 0); > - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI_ELSE_ASYNC); Hmm. I think the current code here is simply wrong. We do need to flush all delwri buffers after the inode reclaim. Maybe we should get this hunk in for .33? > - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI_ELSE_ASYNC); > + xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI); > /* dgc: errors ignored here */ > error = xfs_qm_sync(mp, SYNC_TRYLOCK); > error = xfs_sync_fsdata(mp, SYNC_TRYLOCK); > @@ -687,7 +687,7 @@ xfs_reclaim_inode( > spin_unlock(&ip->i_flags_lock); > write_unlock(&pag->pag_ici_lock); > xfs_perag_put(pag); > - return -EAGAIN; > + return EAGAIN; Unrelated bug in the upsteam code. But your inode direct reclaim changes should sort this out already. > @@ -3012,16 +3001,6 @@ xfs_iflush_int( > iip = ip->i_itemp; > mp = ip->i_mount; > > - > - /* > - * If the inode isn't dirty, then just release the inode > - * flush lock and do nothing. > - */ > - if (xfs_inode_clean(ip)) { > - xfs_ifunlock(ip); > - return 0; > - } > - while we now have this check in xfs_reclaim_inode there still are various other callers. Did you audit them all to make sure we don't need the check here anymore? > index 223d9c3..16c4654 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -1444,7 +1444,14 @@ xfs_unmountfs( > * need to force the log first. > */ > xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE | XFS_LOG_SYNC); > - xfs_reclaim_inodes(mp, XFS_IFLUSH_ASYNC); > + > + /* > + * flush the delwri buffers before the reclaim so that it doesn't > + * block for a long time waiting to reclaim inodes that are already > + * in the delwri state. > + */ > + XFS_bflush(mp->m_ddev_targp); > + xfs_reclaim_inodes(mp, XFS_IFLUSH_SYNC); Wouldn't it be more efficient to also write them out delwri and then flush out the delwri queue again? Either way the current code seems fishy to me with an async writeout here. From SRS0+vdeK+37+fromorbit.com=david@internode.on.net Fri Jan 8 04:43:01 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08Ah03H031558 for ; Fri, 8 Jan 2010 04:43:01 -0600 X-ASG-Debug-ID: 1262947431-6af0018d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B310F151F32 for ; Fri, 8 Jan 2010 02:43:52 -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 PCBl54Wbcd8PkAV2 for ; Fri, 08 Jan 2010 02:43:52 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11239843-1927428 for multiple; Fri, 08 Jan 2010 21:13:50 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NTCJo-0002lA-Re; Fri, 08 Jan 2010 21:43:48 +1100 Date: Fri, 8 Jan 2010 21:43:48 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: reclaim all inodes by background tree walks Subject: Re: [PATCH 2/2] xfs: reclaim all inodes by background tree walks Message-ID: <20100108104348.GB8718@discord.disaster> References: <1262819125-27083-1-git-send-email-david@fromorbit.com> <1262819125-27083-3-git-send-email-david@fromorbit.com> <20100108102408.GB16640@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100108102408.GB16640@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1262947433 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19259 Rule breakdown below pts rule 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 08, 2010 at 05:24:08AM -0500, Christoph Hellwig wrote: > > Looks safe to me. I wonder whaimpact leaving the inodes around for > longer has to memory usage for inode heavy workloads, though. In terms of wall time, nothing I can measure, but it seems to reduce system time slightly. My main concern is memory pressure - maybe it needs a shrinker registered to reclaim inodes immediately rather than waiting for the next xfsssyncd run... > > unlock_and_requeue: > > + /* > > + * We could return EAGAIN here to make reclaim rescan the inode tree in > > + * a short while. However, this just burns CPU time scanning the tree > > + * waiting for IO to complete and xfssyncd never goes back to the idle > > + * state. Instead, return 0 to let the next scheduled background reclaim > > + * attempt to reclaim the inode again. > > + */ > > xfs_iflags_clear(ip, XFS_IRECLAIM); > > xfs_iunlock(ip, XFS_ILOCK_EXCL); > > - return EAGAIN; > > + return 0; > > This is an unrelated change and should be a patch of it's own. Yup. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+vdeK+37+fromorbit.com=david@internode.on.net Fri Jan 8 05:04:40 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08B4d0m033659 for ; Fri, 8 Jan 2010 05:04:39 -0600 X-ASG-Debug-ID: 1262948727-754f03dc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 428E3EE74D9 for ; Fri, 8 Jan 2010 03:05: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 LQVRLVlG0Cn0590D for ; Fri, 08 Jan 2010 03:05:27 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11408712-1927428 for multiple; Fri, 08 Jan 2010 21:35:26 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NTCei-0002mM-Oc; Fri, 08 Jan 2010 22:05:24 +1100 Date: Fri, 8 Jan 2010 22:05:24 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: Use delayed write for inodes rather than async Subject: Re: [PATCH 1/3] xfs: Use delayed write for inodes rather than async Message-ID: <20100108110524.GC8718@discord.disaster> References: <1262649861-28530-1-git-send-email-david@fromorbit.com> <1262649861-28530-2-git-send-email-david@fromorbit.com> <20100108103620.GA11769@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100108103620.GA11769@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1262948729 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19262 Rule breakdown below pts rule 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 08, 2010 at 05:36:21AM -0500, Christoph Hellwig wrote: > > +++ b/fs/xfs/linux-2.6/xfs_sync.c > > @@ -460,8 +460,8 @@ xfs_quiesce_fs( > > { > > int count = 0, pincount; > > > > + xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI); > > xfs_flush_buftarg(mp->m_ddev_targp, 0); > > - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI_ELSE_ASYNC); > > Hmm. I think the current code here is simply wrong. We do need to > flush all delwri buffers after the inode reclaim. Maybe we should > get this hunk in for .33? I don't think it really matters for the existing code as we do the xfs_flush_buftarg(SYNC_WAIT) in the loop below which will push out inodes flushed during reclaim. Hmmm - given that xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI) can skip inodes, there probably should be a sync reclaim done in the flush loop to ensure we've caught them. > > - xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI_ELSE_ASYNC); > > + xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI); > > /* dgc: errors ignored here */ > > error = xfs_qm_sync(mp, SYNC_TRYLOCK); > > error = xfs_sync_fsdata(mp, SYNC_TRYLOCK); > > @@ -687,7 +687,7 @@ xfs_reclaim_inode( > > spin_unlock(&ip->i_flags_lock); > > write_unlock(&pag->pag_ici_lock); > > xfs_perag_put(pag); > > - return -EAGAIN; > > + return EAGAIN; > > Unrelated bug in the upsteam code. But your inode direct reclaim > changes should sort this out already. *nod* > > @@ -3012,16 +3001,6 @@ xfs_iflush_int( > > iip = ip->i_itemp; > > mp = ip->i_mount; > > > > - > > - /* > > - * If the inode isn't dirty, then just release the inode > > - * flush lock and do nothing. > > - */ > > - if (xfs_inode_clean(ip)) { > > - xfs_ifunlock(ip); > > - return 0; > > - } > > - > > while we now have this check in xfs_reclaim_inode there still are > various other callers. Did you audit them all to make sure we don't > need the check here anymore? Yes - xfs_iflush_int() gets called only from xfs_iflush() and xfs_iflush_cluster() and both check first. > > index 223d9c3..16c4654 100644 > > --- a/fs/xfs/xfs_mount.c > > +++ b/fs/xfs/xfs_mount.c > > @@ -1444,7 +1444,14 @@ xfs_unmountfs( > > * need to force the log first. > > */ > > xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE | XFS_LOG_SYNC); > > - xfs_reclaim_inodes(mp, XFS_IFLUSH_ASYNC); > > + > > + /* > > + * flush the delwri buffers before the reclaim so that it doesn't > > + * block for a long time waiting to reclaim inodes that are already > > + * in the delwri state. > > + */ > > + XFS_bflush(mp->m_ddev_targp); > > + xfs_reclaim_inodes(mp, XFS_IFLUSH_SYNC); > > Wouldn't it be more efficient to also write them out delwri and then > flush out the delwri queue again? The delayed write flush can skip inodes, so we need to do a sync flush to guarantee that we reclaim all dirty inodes. The flush is done first so the sync flush doesn't block on the flush locks for too long for inodes that are already locked for delwri flushing. Perhaps a: xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI); XFS_bflush(mp->m_ddev_targp); xfs_reclaim_inodes(mp, XFS_IFLUSH_SYNC); sequence would be better here? > Either way the current code seems fishy to me with an async writeout > here. Agreed. Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+46b1ae413952afea7e2e+2329+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 8 05:06:26 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08B6QRK033840 for ; Fri, 8 Jan 2010 05:06:26 -0600 X-ASG-Debug-ID: 1262948839-127902cb0000-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 6F35A1C3B599 for ; Fri, 8 Jan 2010 03:07:19 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Sj5MumKviNvGbtd5 for ; Fri, 08 Jan 2010 03:07:19 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NTCgZ-0007X2-55; Fri, 08 Jan 2010 11:07:19 +0000 Date: Fri, 8 Jan 2010 06:07:19 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: Don't issue buffer IO direct from AIL push Subject: Re: [PATCH 2/3] xfs: Don't issue buffer IO direct from AIL push Message-ID: <20100108110719.GA17442@infradead.org> References: <1262649861-28530-1-git-send-email-david@fromorbit.com> <1262649861-28530-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262649861-28530-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262948839 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 a delwri buffer needs to be pushed before it has aged out, then > + * promote it to the head of the delwri queue so that it will be flushed > + * on the next xfsbufd run. > + */ > +void > +xfs_buf_delwri_promote( > + xfs_buf_t *bp) > +{ > + struct list_head *dwq = &bp->b_target->bt_delwrite_queue; > + spinlock_t *dwlk = &bp->b_target->bt_delwrite_lock; > + long age = xfs_buf_age_centisecs * msecs_to_jiffies(10) + 1; > + > + spin_lock(dwlk); > + ASSERT(bp->b_flags & XBF_DELWRI); > + ASSERT(bp->b_flags & _XBF_DELWRI_Q); > + list_del(&bp->b_list); > + list_add(&bp->b_list, dwq); > + bp->b_queuetime = jiffies - age; > + spin_unlock(dwlk); Sorry for the nitpicking, but: a) can you use the struct types instead of the typedefs where possible? b) second the pointer to spinlock style used here like in some other buf code is rather odd. What about this instead: void xfs_buf_delwri_promote( struct xfs_buf *bp) { struct xfs_buftarg *target = bp->b_target; spin_lock(&target->bt_delwrite_lock); ASSERT(bp->b_flags & XBF_DELWRI); ASSERT(bp->b_flags & _XBF_DELWRI_Q); list_move(&bp->b_list, &target->bt_delwrite_queue); bp->b_queuetime = jiffies - xfs_buf_age_centisecs * msecs_to_jiffies(10) - 1; spin_unlock(&target->bt_delwrite_lock); } Also the queuetime calculation could use some comments. > extern void xfs_wait_buftarg(xfs_buftarg_t *); > extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int); > extern int xfs_flush_buftarg(xfs_buftarg_t *, int); > + > +/* > + * run the xfsbufd on demand to age buffers. Use in combination with > + * xfs_buf_delwri_promote() to flus delayed write buffers efficiently. > + */ > +static inline void xfs_flush_buftarg_delwri(xfs_buftarg_t *btp) > +{ > + wake_up_process(btp->bt_task); > +} The function name is extremly misleading. It's an xfsbufd wakeup, so it should be named like that. In doubt I'd just opencode the wake_up_process call instead. The changes to the various log items look good, especially as we bring some more commonality into the various items. You removed the only call to trace_xfs_inode_item_push, so you might aswell remove the trace point declaration, too. From BATV+46b1ae413952afea7e2e+2329+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 8 05:11:00 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08BAxc6034288 for ; Fri, 8 Jan 2010 05:11:00 -0600 X-ASG-Debug-ID: 1262949113-2b1c01640000-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 402E81DAFE66 for ; Fri, 8 Jan 2010 03:11:53 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id FVVkMJouuVg8z12r for ; Fri, 08 Jan 2010 03:11:53 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NTCky-0000xt-UK; Fri, 08 Jan 2010 11:11:52 +0000 Date: Fri, 8 Jan 2010 06:11:52 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: Sort delayed write buffers before dispatch Subject: Re: [PATCH 3/3] xfs: Sort delayed write buffers before dispatch Message-ID: <20100108111152.GA29812@infradead.org> References: <1262649861-28530-1-git-send-email-david@fromorbit.com> <1262649861-28530-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1262649861-28530-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262949113 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 > +/* > + * Compare function is more complex than it needs to be because > + * the return value is only 32 bits and we are doing comparisons > + * on 64 bit values > + */ > +int > +xfs_buf_cmp( Should be marked static. > +void > +xfs_buf_delwri_sort( > + xfs_buftarg_t *target, > + struct list_head *list) > +{ > + list_sort(NULL, list, xfs_buf_cmp); > +} Same here. Not sure I would even bother with the wrapper. Also the first argument is entirely unused. > STATIC int > xfsbufd( > void *data) > { > + xfs_buftarg_t *target = (xfs_buftarg_t *)data; > > current->flags |= PF_MEMALLOC; > > @@ -1739,6 +1774,8 @@ xfsbufd( > do { > long age = xfs_buf_age_centisecs * msecs_to_jiffies(10); > long tout = age; > + int count = 0; > + struct list_head tmp; > > if (unlikely(freezing(current))) { > set_bit(XBT_FORCE_SLEEP, &target->bt_flags); > @@ -1753,11 +1790,10 @@ xfsbufd( > schedule_timeout_interruptible(tout); > > xfs_buf_delwri_split(target, &tmp, age); > + xfs_buf_delwri_sort(target, &tmp); > while (!list_empty(&tmp)) { > + struct xfs_buf *bp; > + bp = list_first_entry(&tmp, struct xfs_buf, b_list); > list_del_init(&bp->b_list); > xfs_buf_iostrategy(bp); > count++; > > > if (wait) > blk_run_address_space(target->bt_mapping); > > + /* Now wait for IO to complete if required. */ > + while (!list_empty(&wait_list)) { > + bp = list_first_entry(&wait_list, struct xfs_buf, b_list); > > list_del_init(&bp->b_list); > xfs_iowait(bp); As a tiny optimization you might want to move this into the if (wait) block From BATV+46b1ae413952afea7e2e+2329+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 8 05:13:39 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08BDdux034539 for ; Fri, 8 Jan 2010 05:13:39 -0600 X-ASG-Debug-ID: 1262949272-6b65032a0000-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 1081B152281 for ; Fri, 8 Jan 2010 03:14:32 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id fApTdMiMWtHb4IaB for ; Fri, 08 Jan 2010 03:14:32 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NTCnY-0001cH-N2; Fri, 08 Jan 2010 11:14:32 +0000 Date: Fri, 8 Jan 2010 06:14:32 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: Use delayed write for inodes rather than async Subject: Re: [PATCH 1/3] xfs: Use delayed write for inodes rather than async Message-ID: <20100108111432.GA4685@infradead.org> References: <1262649861-28530-1-git-send-email-david@fromorbit.com> <1262649861-28530-2-git-send-email-david@fromorbit.com> <20100108103620.GA11769@infradead.org> <20100108110524.GC8718@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100108110524.GC8718@discord.disaster> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262949273 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 08, 2010 at 10:05:24PM +1100, Dave Chinner wrote: > I don't think it really matters for the existing code as we do the > xfs_flush_buftarg(SYNC_WAIT) in the loop below which will push out > inodes flushed during reclaim. True. > Hmmm - given that xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI) can skip > inodes, there probably should be a sync reclaim done in the flush > loop to ensure we've caught them. Indeed, the skipping behaviour is rather confusing and needs to be taken care off. > Yes - xfs_iflush_int() gets called only from xfs_iflush() and > xfs_iflush_cluster() and both check first. Ok. > The delayed write flush can skip inodes, so we need to do a sync > flush to guarantee that we reclaim all dirty inodes. The flush is done > first so the sync flush doesn't block on the flush locks for too > long for inodes that are already locked for delwri flushing. > Perhaps a: > > xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI); > XFS_bflush(mp->m_ddev_targp); > xfs_reclaim_inodes(mp, XFS_IFLUSH_SYNC); > > sequence would be better here? I guess that would be optimal. Maybe with a little comment explaining why we do it. From SRS0+vdeK+37+fromorbit.com=david@internode.on.net Fri Jan 8 05:14:25 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08BEOwE034629 for ; Fri, 8 Jan 2010 05:14:25 -0600 X-ASG-Debug-ID: 1262949316-2f3e01430000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E41CF1C37C8D for ; Fri, 8 Jan 2010 03:15:16 -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 8vS0rmbDnHGEgfbj for ; Fri, 08 Jan 2010 03:15:16 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11251599-1927428 for multiple; Fri, 08 Jan 2010 21:45:15 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NTCoD-0002n4-Mm; Fri, 08 Jan 2010 22:15:13 +1100 Date: Fri, 8 Jan 2010 22:15:13 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: Don't issue buffer IO direct from AIL push Subject: Re: [PATCH 2/3] xfs: Don't issue buffer IO direct from AIL push Message-ID: <20100108111513.GD8718@discord.disaster> References: <1262649861-28530-1-git-send-email-david@fromorbit.com> <1262649861-28530-3-git-send-email-david@fromorbit.com> <20100108110719.GA17442@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100108110719.GA17442@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1262949317 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19259 Rule breakdown below pts rule 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 08, 2010 at 06:07:19AM -0500, Christoph Hellwig wrote: > > +/* > > + * If a delwri buffer needs to be pushed before it has aged out, then > > + * promote it to the head of the delwri queue so that it will be flushed > > + * on the next xfsbufd run. > > + */ > > +void > > +xfs_buf_delwri_promote( > > + xfs_buf_t *bp) > > +{ > > + struct list_head *dwq = &bp->b_target->bt_delwrite_queue; > > + spinlock_t *dwlk = &bp->b_target->bt_delwrite_lock; > > + long age = xfs_buf_age_centisecs * msecs_to_jiffies(10) + 1; > > + > > + spin_lock(dwlk); > > + ASSERT(bp->b_flags & XBF_DELWRI); > > + ASSERT(bp->b_flags & _XBF_DELWRI_Q); > > + list_del(&bp->b_list); > > + list_add(&bp->b_list, dwq); > > + bp->b_queuetime = jiffies - age; > > + spin_unlock(dwlk); > > Sorry for the nitpicking, but: > > a) can you use the struct types instead of the typedefs where possible? Sure - I missed that one when I went back over this patch after a c'n'p to create the function. > b) second the pointer to spinlock style used here like in some other > buf code is rather odd. What about this instead: > > void > xfs_buf_delwri_promote( > struct xfs_buf *bp) > { > struct xfs_buftarg *target = bp->b_target; > > spin_lock(&target->bt_delwrite_lock); > ASSERT(bp->b_flags & XBF_DELWRI); > ASSERT(bp->b_flags & _XBF_DELWRI_Q); > > list_move(&bp->b_list, &target->bt_delwrite_queue); > bp->b_queuetime = jiffies - > xfs_buf_age_centisecs * msecs_to_jiffies(10) - 1; > spin_unlock(&target->bt_delwrite_lock); > } Yup, will change. > Also the queuetime calculation could use some comments. OK, will do. > > extern void xfs_wait_buftarg(xfs_buftarg_t *); > > extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int); > > extern int xfs_flush_buftarg(xfs_buftarg_t *, int); > > + > > +/* > > + * run the xfsbufd on demand to age buffers. Use in combination with > > + * xfs_buf_delwri_promote() to flus delayed write buffers efficiently. > > + */ > > +static inline void xfs_flush_buftarg_delwri(xfs_buftarg_t *btp) > > +{ > > + wake_up_process(btp->bt_task); > > +} > > The function name is extremly misleading. It's an xfsbufd wakeup, so it > should be named like that. In doubt I'd just opencode the > wake_up_process call instead. OK, I just didn't want to be digging deep into the buftarg structure in places that don't really know about it. > The changes to the various log items look good, especially as we bring > some more commonality into the various items. > > > You removed the only call to trace_xfs_inode_item_push, so you might > aswell remove the trace point declaration, too. Will do. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+/+/0+37+fromorbit.com=david@internode.on.net Fri Jan 8 05:16:55 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08BGtfK034898 for ; Fri, 8 Jan 2010 05:16:55 -0600 X-ASG-Debug-ID: 1262949467-2f3d01780000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8A5381DAFEE1 for ; Fri, 8 Jan 2010 03:17:47 -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 r9tBuCIDh2IfUYRA for ; Fri, 08 Jan 2010 03:17:47 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11358111-1927428 for multiple; Fri, 08 Jan 2010 21:47:46 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NTCqf-0002nZ-0r; Fri, 08 Jan 2010 22:17:45 +1100 Date: Fri, 8 Jan 2010 22:17:44 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: Sort delayed write buffers before dispatch Subject: Re: [PATCH 3/3] xfs: Sort delayed write buffers before dispatch Message-ID: <20100108111744.GA10735@discord.disaster> References: <1262649861-28530-1-git-send-email-david@fromorbit.com> <1262649861-28530-4-git-send-email-david@fromorbit.com> <20100108111152.GA29812@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100108111152.GA29812@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1262949468 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19259 Rule breakdown below pts rule 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 08, 2010 at 06:11:52AM -0500, Christoph Hellwig wrote: > > +/* > > + * Compare function is more complex than it needs to be because > > + * the return value is only 32 bits and we are doing comparisons > > + * on 64 bit values > > + */ > > +int > > +xfs_buf_cmp( > > Should be marked static. > > > +void > > +xfs_buf_delwri_sort( > > + xfs_buftarg_t *target, > > + struct list_head *list) > > +{ > > + list_sort(NULL, list, xfs_buf_cmp); > > +} > > Same here. Not sure I would even bother with the wrapper. Also the > first argument is entirely unused. > > > STATIC int > > xfsbufd( > > void *data) > > { > > + xfs_buftarg_t *target = (xfs_buftarg_t *)data; > > > > current->flags |= PF_MEMALLOC; > > > > @@ -1739,6 +1774,8 @@ xfsbufd( > > do { > > long age = xfs_buf_age_centisecs * msecs_to_jiffies(10); > > long tout = age; > > + int count = 0; > > + struct list_head tmp; > > > > if (unlikely(freezing(current))) { > > set_bit(XBT_FORCE_SLEEP, &target->bt_flags); > > @@ -1753,11 +1790,10 @@ xfsbufd( > > schedule_timeout_interruptible(tout); > > > > xfs_buf_delwri_split(target, &tmp, age); > > + xfs_buf_delwri_sort(target, &tmp); > > while (!list_empty(&tmp)) { > > + struct xfs_buf *bp; > > + bp = list_first_entry(&tmp, struct xfs_buf, b_list); > > list_del_init(&bp->b_list); > > xfs_buf_iostrategy(bp); > > count++; > > > > > > if (wait) > > blk_run_address_space(target->bt_mapping); > > > > + /* Now wait for IO to complete if required. */ > > + while (!list_empty(&wait_list)) { > > + bp = list_first_entry(&wait_list, struct xfs_buf, b_list); > > > > list_del_init(&bp->b_list); > > xfs_iowait(bp); > > As a tiny optimization you might want to move this into the if (wait) > block All makes sense, will update. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+vdeK+37+fromorbit.com=david@internode.on.net Fri Jan 8 05:30:28 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08BURjX036339 for ; Fri, 8 Jan 2010 05:30:28 -0600 X-ASG-Debug-ID: 1262950277-364500520000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2100CEEB2D5 for ; Fri, 8 Jan 2010 03:31:17 -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 CRqsybUXJkXs6gFh for ; Fri, 08 Jan 2010 03:31:17 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11252039-1927428 for multiple; Fri, 08 Jan 2010 22:01:16 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NTD3i-0002oK-8m; Fri, 08 Jan 2010 22:31:14 +1100 Date: Fri, 8 Jan 2010 22:31:14 +1100 From: Dave Chinner To: Patrick Schreurs Cc: Christoph Hellwig , Tommy van Leeuwen , xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Subject: [PATCH] Inode reclaim fixes (was Re: 2.6.31 xfs_fs_destroy_inode: cannot reclaim) Message-ID: <20100108113114.GA8654@discord.disaster> References: <89c4f90c0910270341r7833f490g60810f2817eb0950@mail.gmail.com> <89c4f90c0910280519k759230c1r7b1586932ac792f7@mail.gmail.com> <20091030101601.GA11142@infradead.org> <4AF0422D.1070104@news-service.com> <20091114162126.GB17658@infradead.org> <4B0A8075.8080008@news-service.com> <20091211115932.GA20632@infradead.org> <4B3F9F88.9030307@news-service.com> <20100107110446.GA13802@discord.disaster> <4B45CFAC.4000607@news-service.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="ReaqsoxgOBHFXBhH" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <4B45CFAC.4000607@news-service.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1262950280 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0033 1.0000 -1.9992 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.50 X-Barracuda-Spam-Status: No, SCORE=-1.50 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19262 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 --ReaqsoxgOBHFXBhH Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit Hi Patrick, I've attached two compendium patches that will hopefully fix the inode reclaim problems you've been seeing - one is for 2.6.31, the other is for 2.6.32. I've cc'd this to the XFS list Ń•o that anyone else who has been seeing crashes, assert failures and general nastiness around inode reclaim can test them as well. These are not final patches - there's a few changes that Christoph has picked up on during review - so there'll be another round of patches before checkins and -stable backports can be requested. I'm hoping that these patches fix your problem, because with them I can't make my machines fall over anymore.... Cheers, Dave. -- Dave Chinner david@fromorbit.com --ReaqsoxgOBHFXBhH Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="xfs-inode-reclaim-2.6.31" diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index a220d36..793f5d0 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -926,13 +926,37 @@ xfs_fs_alloc_inode( */ STATIC void xfs_fs_destroy_inode( - struct inode *inode) + struct inode *inode) { - xfs_inode_t *ip = XFS_I(inode); + struct xfs_inode *ip = XFS_I(inode); + + xfs_itrace_entry(ip); XFS_STATS_INC(vn_reclaim); - if (xfs_reclaim(ip)) - panic("%s: cannot reclaim 0x%p\n", __func__, inode); + + /* bad inode, get out here ASAP */ + if (is_bad_inode(inode)) + goto out_reclaim; + + xfs_ioend_wait(ip); + + ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); + + /* + * We should never get here with one of the reclaim flags already set. + */ + ASSERT_ALWAYS(!xfs_iflags_test(ip, XFS_IRECLAIMABLE)); + ASSERT_ALWAYS(!xfs_iflags_test(ip, XFS_IRECLAIM)); + + /* + * we always use background reclaim here because even if the + * inode is clean, it still may be under IO and hence we have + * to take the flush lock. The background reclaim path handles + * this more efficiently than we can here, so simply let background + * reclaim tear down all inodes. + */ +out_reclaim: + xfs_inode_set_reclaim_tag(ip); } /* diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 98ef624..cfc2e70 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -54,7 +54,8 @@ xfs_inode_ag_lookup( struct xfs_mount *mp, struct xfs_perag *pag, uint32_t *first_index, - int tag) + int tag, + int write_lock) { int nr_found; struct xfs_inode *ip; @@ -64,7 +65,10 @@ xfs_inode_ag_lookup( * as the tree is sparse and a gang lookup walks to find * the number of objects requested. */ - read_lock(&pag->pag_ici_lock); + if (write_lock) + write_lock(&pag->pag_ici_lock); + else + read_lock(&pag->pag_ici_lock); if (tag == XFS_ICI_NO_TAG) { nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void **)&ip, *first_index, 1); @@ -88,7 +92,10 @@ xfs_inode_ag_lookup( return ip; unlock: - read_unlock(&pag->pag_ici_lock); + if (write_lock) + write_unlock(&pag->pag_ici_lock); + else + read_unlock(&pag->pag_ici_lock); return NULL; } @@ -99,7 +106,8 @@ xfs_inode_ag_walk( int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), int flags, - int tag) + int tag, + int write_lock) { struct xfs_perag *pag = &mp->m_perag[ag]; uint32_t first_index; @@ -113,7 +121,8 @@ restart: int error = 0; xfs_inode_t *ip; - ip = xfs_inode_ag_lookup(mp, pag, &first_index, tag); + ip = xfs_inode_ag_lookup(mp, pag, &first_index, tag, + write_lock); if (!ip) break; @@ -147,7 +156,8 @@ xfs_inode_ag_iterator( int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), int flags, - int tag) + int tag, + int write_lock) { int error = 0; int last_error = 0; @@ -156,7 +166,8 @@ xfs_inode_ag_iterator( for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { if (!mp->m_perag[ag].pag_ici_init) continue; - error = xfs_inode_ag_walk(mp, ag, execute, flags, tag); + error = xfs_inode_ag_walk(mp, ag, execute, flags, tag, + write_lock); if (error) { last_error = error; if (error == EFSCORRUPTED) @@ -180,18 +191,20 @@ xfs_sync_inode_valid( return EFSCORRUPTED; } - /* - * If we can't get a reference on the inode, it must be in reclaim. - * Leave it for the reclaim code to flush. Also avoid inodes that - * haven't been fully initialised. - */ + /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ + if (xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) { + read_unlock(&pag->pag_ici_lock); + return ENOENT; + } + + /* If we can't get a reference on the inode, it must be in reclaim. */ if (!igrab(inode)) { read_unlock(&pag->pag_ici_lock); return ENOENT; } read_unlock(&pag->pag_ici_lock); - if (is_bad_inode(inode) || xfs_iflags_test(ip, XFS_INEW)) { + if (is_bad_inode(inode)) { IRELE(ip); return ENOENT; } @@ -281,7 +294,7 @@ xfs_sync_data( ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, - XFS_ICI_NO_TAG); + XFS_ICI_NO_TAG, 0); if (error) return XFS_ERROR(error); @@ -303,7 +316,7 @@ xfs_sync_attr( ASSERT((flags & ~SYNC_WAIT) == 0); return xfs_inode_ag_iterator(mp, xfs_sync_inode_attr, flags, - XFS_ICI_NO_TAG); + XFS_ICI_NO_TAG, 0); } STATIC int @@ -647,36 +660,11 @@ xfs_syncd_stop( kthread_stop(mp->m_sync_task); } -int +STATIC int xfs_reclaim_inode( xfs_inode_t *ip, - int locked, int sync_mode) { - xfs_perag_t *pag = xfs_get_perag(ip->i_mount, ip->i_ino); - - /* The hash lock here protects a thread in xfs_iget_core from - * racing with us on linking the inode back with a vnode. - * Once we have the XFS_IRECLAIM flag set it will not touch - * us. - */ - write_lock(&pag->pag_ici_lock); - spin_lock(&ip->i_flags_lock); - if (__xfs_iflags_test(ip, XFS_IRECLAIM) || - !__xfs_iflags_test(ip, XFS_IRECLAIMABLE)) { - spin_unlock(&ip->i_flags_lock); - write_unlock(&pag->pag_ici_lock); - if (locked) { - xfs_ifunlock(ip); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - } - return -EAGAIN; - } - __xfs_iflags_set(ip, XFS_IRECLAIM); - spin_unlock(&ip->i_flags_lock); - write_unlock(&pag->pag_ici_lock); - xfs_put_perag(ip->i_mount, pag); - /* * If the inode is still dirty, then flush it out. If the inode * is not in the AIL, then it will be OK to flush it delwri as @@ -688,14 +676,14 @@ xfs_reclaim_inode( * We get the flush lock regardless, though, just to make sure * we don't free it while it is being flushed. */ - if (!locked) { - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_iflock(ip); - } + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_iflock(ip); /* * In the case of a forced shutdown we rely on xfs_iflush() to * wait for the inode to be unpinned before returning an error. + * Because we hold the flush lock, we know that the inode cannot + * be under IO, so if it reports clean it can be reclaimed. */ if (!is_bad_inode(VFS_I(ip)) && xfs_iflush(ip, sync_mode) == 0) { /* synchronize with xfs_iflush_done */ @@ -770,14 +758,24 @@ xfs_reclaim_inode_now( struct xfs_perag *pag, int flags) { - /* ignore if already under reclaim */ - if (xfs_iflags_test(ip, XFS_IRECLAIM)) { - read_unlock(&pag->pag_ici_lock); + /* + * The radix tree lock here protects a thread in xfs_iget from racing + * with us starting reclaim on the inode. Once we have the + * XFS_IRECLAIM flag set it will not touch us. + */ + spin_lock(&ip->i_flags_lock); + ASSERT_ALWAYS(__xfs_iflags_test(ip, XFS_IRECLAIMABLE)); + if (__xfs_iflags_test(ip, XFS_IRECLAIM)) { + /* ignore as it is already under reclaim */ + spin_unlock(&ip->i_flags_lock); + write_unlock(&pag->pag_ici_lock); return 0; } - read_unlock(&pag->pag_ici_lock); + __xfs_iflags_set(ip, XFS_IRECLAIM); + spin_unlock(&ip->i_flags_lock); + write_unlock(&pag->pag_ici_lock); - return xfs_reclaim_inode(ip, 0, flags); + return xfs_reclaim_inode(ip, flags); } int @@ -786,5 +784,5 @@ xfs_reclaim_inodes( int mode) { return xfs_inode_ag_iterator(mp, xfs_reclaim_inode_now, mode, - XFS_ICI_RECLAIM_TAG); + XFS_ICI_RECLAIM_TAG, 1); } diff --git a/fs/xfs/linux-2.6/xfs_sync.h b/fs/xfs/linux-2.6/xfs_sync.h index 5912060..0cef0b8 100644 --- a/fs/xfs/linux-2.6/xfs_sync.h +++ b/fs/xfs/linux-2.6/xfs_sync.h @@ -44,7 +44,6 @@ void xfs_quiesce_attr(struct xfs_mount *mp); void xfs_flush_inodes(struct xfs_inode *ip); -int xfs_reclaim_inode(struct xfs_inode *ip, int locked, int sync_mode); int xfs_reclaim_inodes(struct xfs_mount *mp, int mode); void xfs_inode_set_reclaim_tag(struct xfs_inode *ip); @@ -56,6 +55,6 @@ void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, int xfs_sync_inode_valid(struct xfs_inode *ip, struct xfs_perag *pag); int xfs_inode_ag_iterator(struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), - int flags, int tag); + int flags, int tag, int write_lock); #endif diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 4e4276b..1024e4f 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -894,7 +894,7 @@ xfs_qm_dqrele_all_inodes( uint flags) { ASSERT(mp->m_quotainfo); - xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, XFS_ICI_NO_TAG); + xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, XFS_ICI_NO_TAG, 0); } /*------------------------------------------------------------------------*/ diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index ecbf8b4..883bca9 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -538,17 +538,21 @@ xfs_ireclaim( { struct xfs_mount *mp = ip->i_mount; struct xfs_perag *pag; + xfs_agino_t agino = XFS_INO_TO_AGINO(mp, ip->i_ino); XFS_STATS_INC(xs_ig_reclaims); /* - * Remove the inode from the per-AG radix tree. It doesn't matter - * if it was never added to it because radix_tree_delete can deal - * with that case just fine. + * Remove the inode from the per-AG radix tree. + * + * Because radix_tree_delete won't complain even if the item was never + * added to the tree assert that it's been there before to catch + * problems with the inode life time early on. */ pag = xfs_get_perag(mp, ip->i_ino); write_lock(&pag->pag_ici_lock); - radix_tree_delete(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino)); + if (!radix_tree_delete(&pag->pag_ici_root, agino)) + ASSERT(0); write_unlock(&pag->pag_ici_lock); xfs_put_perag(mp, pag); diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index da428b3..64373bc 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2877,10 +2877,14 @@ xfs_iflush( mp = ip->i_mount; /* - * If the inode isn't dirty, then just release the inode - * flush lock and do nothing. + * If the inode isn't dirty, then just release the inode flush lock and + * do nothing. Treat stale inodes the same; we cannot rely on the + * backing buffer remaining stale in cache for the remaining life of + * the stale inode and so xfs_itobp() below may give us a buffer that + * no longer contains inodes below. Doing this stale check here also + * avoids forcing the log on pinned, stale inodes. */ - if (xfs_inode_clean(ip)) { + if (xfs_inode_clean(ip) || xfs_iflags_test(ip, XFS_ISTALE)) { xfs_ifunlock(ip); return 0; } diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 492d75b..15875e5 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -2461,52 +2461,6 @@ xfs_set_dmattrs( return error; } -int -xfs_reclaim( - xfs_inode_t *ip) -{ - - xfs_itrace_entry(ip); - - ASSERT(!VN_MAPPED(VFS_I(ip))); - - /* bad inode, get out here ASAP */ - if (is_bad_inode(VFS_I(ip))) { - xfs_ireclaim(ip); - return 0; - } - - xfs_ioend_wait(ip); - - ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); - - /* - * Make sure the atime in the XFS inode is correct before freeing the - * Linux inode. - */ - xfs_synchronize_atime(ip); - - /* - * If we have nothing to flush with this inode then complete the - * teardown now, otherwise break the link between the xfs inode and the - * linux inode and clean up the xfs inode later. This avoids flushing - * the inode to disk during the delete operation itself. - * - * When breaking the link, we need to set the XFS_IRECLAIMABLE flag - * first to ensure that xfs_iunpin() will never see an xfs inode - * that has a linux inode being reclaimed. Synchronisation is provided - * by the i_flags_lock. - */ - if (!ip->i_update_core && (ip->i_itemp == NULL)) { - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_iflock(ip); - xfs_iflags_set(ip, XFS_IRECLAIMABLE); - return xfs_reclaim_inode(ip, 1, XFS_IFLUSH_DELWRI_ELSE_SYNC); - } - xfs_inode_set_reclaim_tag(ip); - return 0; -} - /* * xfs_alloc_file_space() * This routine allocates disk space for the given file. diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h index a9e102d..167a467 100644 --- a/fs/xfs/xfs_vnodeops.h +++ b/fs/xfs/xfs_vnodeops.h @@ -38,7 +38,6 @@ int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, const char *target_path, mode_t mode, struct xfs_inode **ipp, cred_t *credp); int xfs_set_dmattrs(struct xfs_inode *ip, u_int evmask, u_int16_t state); -int xfs_reclaim(struct xfs_inode *ip); int xfs_change_file_space(struct xfs_inode *ip, int cmd, xfs_flock64_t *bf, xfs_off_t offset, int attr_flags); int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, --ReaqsoxgOBHFXBhH Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="xfs-inode-reclaim-2.6.32" diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 18a4b8e..f3c622a 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -930,13 +930,37 @@ xfs_fs_alloc_inode( */ STATIC void xfs_fs_destroy_inode( - struct inode *inode) + struct inode *inode) { - xfs_inode_t *ip = XFS_I(inode); + struct xfs_inode *ip = XFS_I(inode); + + xfs_itrace_entry(ip); XFS_STATS_INC(vn_reclaim); - if (xfs_reclaim(ip)) - panic("%s: cannot reclaim 0x%p\n", __func__, inode); + + /* bad inode, get out here ASAP */ + if (is_bad_inode(inode)) + goto out_reclaim; + + xfs_ioend_wait(ip); + + ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); + + /* + * We should never get here with one of the reclaim flags already set. + */ + ASSERT_ALWAYS(!xfs_iflags_test(ip, XFS_IRECLAIMABLE)); + ASSERT_ALWAYS(!xfs_iflags_test(ip, XFS_IRECLAIM)); + + /* + * we always use background reclaim here because even if the + * inode is clean, it still may be under IO and hence we have + * to take the flush lock. The background reclaim path handles + * this more efficiently than we can here, so simply let background + * reclaim tear down all inodes. + */ +out_reclaim: + xfs_inode_set_reclaim_tag(ip); } /* diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 961df0a..897fcb5 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -54,7 +54,8 @@ xfs_inode_ag_lookup( struct xfs_mount *mp, struct xfs_perag *pag, uint32_t *first_index, - int tag) + int tag, + int write_lock) { int nr_found; struct xfs_inode *ip; @@ -64,7 +65,10 @@ xfs_inode_ag_lookup( * as the tree is sparse and a gang lookup walks to find * the number of objects requested. */ - read_lock(&pag->pag_ici_lock); + if (write_lock) + write_lock(&pag->pag_ici_lock); + else + read_lock(&pag->pag_ici_lock); if (tag == XFS_ICI_NO_TAG) { nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void **)&ip, *first_index, 1); @@ -88,7 +92,10 @@ xfs_inode_ag_lookup( return ip; unlock: - read_unlock(&pag->pag_ici_lock); + if (write_lock) + write_unlock(&pag->pag_ici_lock); + else + read_unlock(&pag->pag_ici_lock); return NULL; } @@ -99,7 +106,8 @@ xfs_inode_ag_walk( int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), int flags, - int tag) + int tag, + int write_lock) { struct xfs_perag *pag = &mp->m_perag[ag]; uint32_t first_index; @@ -113,7 +121,8 @@ restart: int error = 0; xfs_inode_t *ip; - ip = xfs_inode_ag_lookup(mp, pag, &first_index, tag); + ip = xfs_inode_ag_lookup(mp, pag, &first_index, tag, + write_lock); if (!ip) break; @@ -147,7 +156,8 @@ xfs_inode_ag_iterator( int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), int flags, - int tag) + int tag, + int write_lock) { int error = 0; int last_error = 0; @@ -156,7 +166,8 @@ xfs_inode_ag_iterator( for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { if (!mp->m_perag[ag].pag_ici_init) continue; - error = xfs_inode_ag_walk(mp, ag, execute, flags, tag); + error = xfs_inode_ag_walk(mp, ag, execute, flags, tag, + write_lock); if (error) { last_error = error; if (error == EFSCORRUPTED) @@ -180,18 +191,20 @@ xfs_sync_inode_valid( return EFSCORRUPTED; } - /* - * If we can't get a reference on the inode, it must be in reclaim. - * Leave it for the reclaim code to flush. Also avoid inodes that - * haven't been fully initialised. - */ + /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ + if (xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) { + read_unlock(&pag->pag_ici_lock); + return ENOENT; + } + + /* If we can't get a reference on the inode, it must be in reclaim. */ if (!igrab(inode)) { read_unlock(&pag->pag_ici_lock); return ENOENT; } read_unlock(&pag->pag_ici_lock); - if (is_bad_inode(inode) || xfs_iflags_test(ip, XFS_INEW)) { + if (is_bad_inode(inode)) { IRELE(ip); return ENOENT; } @@ -281,7 +294,7 @@ xfs_sync_data( ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, - XFS_ICI_NO_TAG); + XFS_ICI_NO_TAG, 0); if (error) return XFS_ERROR(error); @@ -303,7 +316,7 @@ xfs_sync_attr( ASSERT((flags & ~SYNC_WAIT) == 0); return xfs_inode_ag_iterator(mp, xfs_sync_inode_attr, flags, - XFS_ICI_NO_TAG); + XFS_ICI_NO_TAG, 0); } STATIC int @@ -663,36 +676,11 @@ xfs_syncd_stop( kthread_stop(mp->m_sync_task); } -int +STATIC int xfs_reclaim_inode( xfs_inode_t *ip, - int locked, int sync_mode) { - xfs_perag_t *pag = xfs_get_perag(ip->i_mount, ip->i_ino); - - /* The hash lock here protects a thread in xfs_iget_core from - * racing with us on linking the inode back with a vnode. - * Once we have the XFS_IRECLAIM flag set it will not touch - * us. - */ - write_lock(&pag->pag_ici_lock); - spin_lock(&ip->i_flags_lock); - if (__xfs_iflags_test(ip, XFS_IRECLAIM) || - !__xfs_iflags_test(ip, XFS_IRECLAIMABLE)) { - spin_unlock(&ip->i_flags_lock); - write_unlock(&pag->pag_ici_lock); - if (locked) { - xfs_ifunlock(ip); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - } - return -EAGAIN; - } - __xfs_iflags_set(ip, XFS_IRECLAIM); - spin_unlock(&ip->i_flags_lock); - write_unlock(&pag->pag_ici_lock); - xfs_put_perag(ip->i_mount, pag); - /* * If the inode is still dirty, then flush it out. If the inode * is not in the AIL, then it will be OK to flush it delwri as @@ -704,14 +692,14 @@ xfs_reclaim_inode( * We get the flush lock regardless, though, just to make sure * we don't free it while it is being flushed. */ - if (!locked) { - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_iflock(ip); - } + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_iflock(ip); /* * In the case of a forced shutdown we rely on xfs_iflush() to * wait for the inode to be unpinned before returning an error. + * Because we hold the flush lock, we know that the inode cannot + * be under IO, so if it reports clean it can be reclaimed. */ if (!is_bad_inode(VFS_I(ip)) && xfs_iflush(ip, sync_mode) == 0) { /* synchronize with xfs_iflush_done */ @@ -771,14 +759,24 @@ xfs_reclaim_inode_now( struct xfs_perag *pag, int flags) { - /* ignore if already under reclaim */ - if (xfs_iflags_test(ip, XFS_IRECLAIM)) { - read_unlock(&pag->pag_ici_lock); + /* + * The radix tree lock here protects a thread in xfs_iget from racing + * with us starting reclaim on the inode. Once we have the + * XFS_IRECLAIM flag set it will not touch us. + */ + spin_lock(&ip->i_flags_lock); + ASSERT_ALWAYS(__xfs_iflags_test(ip, XFS_IRECLAIMABLE)); + if (__xfs_iflags_test(ip, XFS_IRECLAIM)) { + /* ignore as it is already under reclaim */ + spin_unlock(&ip->i_flags_lock); + write_unlock(&pag->pag_ici_lock); return 0; } - read_unlock(&pag->pag_ici_lock); + __xfs_iflags_set(ip, XFS_IRECLAIM); + spin_unlock(&ip->i_flags_lock); + write_unlock(&pag->pag_ici_lock); - return xfs_reclaim_inode(ip, 0, flags); + return xfs_reclaim_inode(ip, flags); } int @@ -787,5 +785,5 @@ xfs_reclaim_inodes( int mode) { return xfs_inode_ag_iterator(mp, xfs_reclaim_inode_now, mode, - XFS_ICI_RECLAIM_TAG); + XFS_ICI_RECLAIM_TAG, 1); } diff --git a/fs/xfs/linux-2.6/xfs_sync.h b/fs/xfs/linux-2.6/xfs_sync.h index 27920eb..ea932b4 100644 --- a/fs/xfs/linux-2.6/xfs_sync.h +++ b/fs/xfs/linux-2.6/xfs_sync.h @@ -44,7 +44,6 @@ void xfs_quiesce_attr(struct xfs_mount *mp); void xfs_flush_inodes(struct xfs_inode *ip); -int xfs_reclaim_inode(struct xfs_inode *ip, int locked, int sync_mode); int xfs_reclaim_inodes(struct xfs_mount *mp, int mode); void xfs_inode_set_reclaim_tag(struct xfs_inode *ip); @@ -55,6 +54,6 @@ void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, int xfs_sync_inode_valid(struct xfs_inode *ip, struct xfs_perag *pag); int xfs_inode_ag_iterator(struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), - int flags, int tag); + int flags, int tag, int write_lock); #endif diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 5d1a3b9..f99cfa4 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -893,7 +893,7 @@ xfs_qm_dqrele_all_inodes( uint flags) { ASSERT(mp->m_quotainfo); - xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, XFS_ICI_NO_TAG); + xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, XFS_ICI_NO_TAG, 0); } /*------------------------------------------------------------------------*/ diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 80e5264..40e8775 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -511,17 +511,21 @@ xfs_ireclaim( { struct xfs_mount *mp = ip->i_mount; struct xfs_perag *pag; + xfs_agino_t agino = XFS_INO_TO_AGINO(mp, ip->i_ino); XFS_STATS_INC(xs_ig_reclaims); /* - * Remove the inode from the per-AG radix tree. It doesn't matter - * if it was never added to it because radix_tree_delete can deal - * with that case just fine. + * Remove the inode from the per-AG radix tree. + * + * Because radix_tree_delete won't complain even if the item was never + * added to the tree assert that it's been there before to catch + * problems with the inode life time early on. */ pag = xfs_get_perag(mp, ip->i_ino); write_lock(&pag->pag_ici_lock); - radix_tree_delete(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino)); + if (!radix_tree_delete(&pag->pag_ici_root, agino)) + ASSERT(0); write_unlock(&pag->pag_ici_lock); xfs_put_perag(mp, pag); diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index b92a4fa..13d7d21 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2877,10 +2877,14 @@ xfs_iflush( mp = ip->i_mount; /* - * If the inode isn't dirty, then just release the inode - * flush lock and do nothing. + * If the inode isn't dirty, then just release the inode flush lock and + * do nothing. Treat stale inodes the same; we cannot rely on the + * backing buffer remaining stale in cache for the remaining life of + * the stale inode and so xfs_itobp() below may give us a buffer that + * no longer contains inodes below. Doing this stale check here also + * avoids forcing the log on pinned, stale inodes. */ - if (xfs_inode_clean(ip)) { + if (xfs_inode_clean(ip) || xfs_iflags_test(ip, XFS_ISTALE)) { xfs_ifunlock(ip); return 0; } diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index b572f7e..3fac146 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -2456,46 +2456,6 @@ xfs_set_dmattrs( return error; } -int -xfs_reclaim( - xfs_inode_t *ip) -{ - - xfs_itrace_entry(ip); - - ASSERT(!VN_MAPPED(VFS_I(ip))); - - /* bad inode, get out here ASAP */ - if (is_bad_inode(VFS_I(ip))) { - xfs_ireclaim(ip); - return 0; - } - - xfs_ioend_wait(ip); - - ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); - - /* - * If we have nothing to flush with this inode then complete the - * teardown now, otherwise break the link between the xfs inode and the - * linux inode and clean up the xfs inode later. This avoids flushing - * the inode to disk during the delete operation itself. - * - * When breaking the link, we need to set the XFS_IRECLAIMABLE flag - * first to ensure that xfs_iunpin() will never see an xfs inode - * that has a linux inode being reclaimed. Synchronisation is provided - * by the i_flags_lock. - */ - if (!ip->i_update_core && (ip->i_itemp == NULL)) { - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_iflock(ip); - xfs_iflags_set(ip, XFS_IRECLAIMABLE); - return xfs_reclaim_inode(ip, 1, XFS_IFLUSH_DELWRI_ELSE_SYNC); - } - xfs_inode_set_reclaim_tag(ip); - return 0; -} - /* * xfs_alloc_file_space() * This routine allocates disk space for the given file. diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h index a9e102d..167a467 100644 --- a/fs/xfs/xfs_vnodeops.h +++ b/fs/xfs/xfs_vnodeops.h @@ -38,7 +38,6 @@ int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, const char *target_path, mode_t mode, struct xfs_inode **ipp, cred_t *credp); int xfs_set_dmattrs(struct xfs_inode *ip, u_int evmask, u_int16_t state); -int xfs_reclaim(struct xfs_inode *ip); int xfs_change_file_space(struct xfs_inode *ip, int cmd, xfs_flock64_t *bf, xfs_off_t offset, int attr_flags); int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, --ReaqsoxgOBHFXBhH-- From BATV+46b1ae413952afea7e2e+2329+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 8 06:25:47 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_43,J_CHICKENPOX_73 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08CPkFu040268 for ; Fri, 8 Jan 2010 06:25:47 -0600 X-ASG-Debug-ID: 1262953599-4d9c01e60000-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 029421C3B6E4 for ; Fri, 8 Jan 2010 04:26:39 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Zy2oU7sbXCC0mlAF for ; Fri, 08 Jan 2010 04:26:39 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NTDvL-0004v6-Cu for xfs@oss.sgi.com; Fri, 08 Jan 2010 12:26:39 +0000 Date: Fri, 8 Jan 2010 07:26:39 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfsprogs: bump version and update changelog Subject: [PATCH] xfsprogs: bump version and update changelog Message-ID: <20100108122639.GA17229@infradead.org> References: <20091223135718.GA29975@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20091223135718.GA29975@infradead.org> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262953600 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Christoph Hellwig Index: xfsprogs-dev/VERSION =================================================================== --- xfsprogs-dev.orig/VERSION 2010-01-02 12:11:42.871003354 +0100 +++ xfsprogs-dev/VERSION 2010-01-06 18:49:38.221274008 +0100 @@ -2,6 +2,6 @@ # This file is used by configure to get version information # PKG_MAJOR=3 -PKG_MINOR=0 -PKG_REVISION=4 +PKG_MINOR=1 +PKG_REVISION=0 PKG_BUILD=1 Index: xfsprogs-dev/doc/CHANGES =================================================================== --- xfsprogs-dev.orig/doc/CHANGES 2010-01-02 12:11:42.873010034 +0100 +++ xfsprogs-dev/doc/CHANGES 2010-01-08 13:24:09.150268999 +0100 @@ -1,3 +1,23 @@ +xfsprogs-3.1.0 + - Reduce memory usage in xfs_repair by using better data structures. + - Add additional checks in xfs_repair to detect freespace btree + corruption instead of only rebuilding the btrees. Useful for the + no-modify mode. + - Fix libhandle to use the right path to issue by-handle ioctls for + symbolic links and special files. + - Use lazy superblock counters by default. At least kernel 2.6.22 is + needed for this feature. + - Add a German translation, thanks to Chris Leick. + - Enable the madvise and mincor commands in xfs_io. + - Fix unsafe temporary file creation in xfs_fsr. + - Add support for discarding unused space on SSDs or thing provionen + arrays in mkfs.xfs. + - Allow linking against libblkid for topology information. + - Add symbol versioning for libhandle. + - Remove the included RPM and binary tarball built infrastructure. + - Various build system improvements. + - Small fixes to xfs_db and xfs_io. + xfsprogs-3.0.4 (17 September 2009) - Fix a memory leak in xfsprogs. - Increase hash chain length in xfsprogs when running out of memory. Index: xfsprogs-dev/debian/changelog =================================================================== --- xfsprogs-dev.orig/debian/changelog 2010-01-02 12:11:42.872012141 +0100 +++ xfsprogs-dev/debian/changelog 2010-01-06 18:49:38.224273412 +0100 @@ -1,6 +1,6 @@ xfsprogs (3.1.0) unstable; urgency=low - * New bugfix release + * New upstream release * Merged German translation (closes: #521389) * Merged German translation update (closes: #557100) * Uptodate po file is provided now (closes: #538962) From aelder@oss.sgi.com Fri Jan 8 10:24:29 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08GOTHk054493 for ; Fri, 8 Jan 2010 10:24:29 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o08GOQjR054446; Fri, 8 Jan 2010 10:24:26 -0600 Date: Fri, 8 Jan 2010 10:24:26 -0600 Message-Id: <201001081624.o08GOQjR054446@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.30-rc4-34424-g74d2e4f X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: 3fc98b1ac036675b95f6e3fafd5ef147b97d4d30 X-Git-Newrev: 74d2e4f8d79ae0c4b6ec027958d5b18058662eea 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 eaff807 kill I_LOCK bea4c89 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs 1e431f5 cleanup blockdev_direct_IO locking 431547b sanitize xattr handler prototypes from 3fc98b1ac036675b95f6e3fafd5ef147b97d4d30 (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 eaff8079d4f1016a12e34ab323737314f24127dd Author: Christoph Hellwig Date: Thu Dec 17 14:25:01 2009 +0100 kill I_LOCK After I_SYNC was split from I_LOCK the leftover is always used together with I_NEW and thus superflous. Signed-off-by: Christoph Hellwig Signed-off-by: Al Viro commit bea4c899f2b5fad80099aea979780ef19f9b1987 Merge: 73efc4681cb5e3c8807daf106f001e7f0798d8a0 3fc98b1ac036675b95f6e3fafd5ef147b97d4d30 Author: Linus Torvalds Date: Wed Dec 16 13:29:39 2009 -0800 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs * 'for-linus' of git://oss.sgi.com/xfs/xfs: XFS: Free buffer pages array unconditionally xfs: kill xfs_bmbt_rec_32/64 types xfs: improve metadata I/O merging in the elevator xfs: check for not fully initialized inodes in xfs_ireclaim commit 1e431f5ce78f3ae8254d725060288b78ff74f086 Author: Christoph Hellwig Date: Tue Nov 3 16:44:53 2009 +0100 cleanup blockdev_direct_IO locking Currently the locking in blockdev_direct_IO is a mess, we have three different locking types and very confusing checks for some of them. The most complicated one is DIO_OWN_LOCKING for reads, which happens to not actually be used. This patch gets rid of the DIO_OWN_LOCKING - as mentioned above the read case is unused anyway, and the write side is almost identical to DIO_NO_LOCKING. The difference is that DIO_NO_LOCKING always sets the create argument for the get_blocks callback to zero, but we can easily move that to the actual get_blocks callbacks. There are four users of the DIO_NO_LOCKING mode: gfs already ignores the create argument and thus is fine with the new version, ocfs2 only errors out if create were ever set, and we can remove this dead code now, the block device code only ever uses create for an error message if we are fully beyond the device which can never happen, and last but not least XFS will need the new behavour for writes. Now we can replace the lock_type variable with a flags one, where no flag means the DIO_NO_LOCKING behaviour and DIO_LOCKING is kept as the first flag. Separate out the check for not allowing to fill holes into a separate flag, although for now both flags always get set at the same time. Also revamp the documentation of the locking scheme to actually make sense. Signed-off-by: Christoph Hellwig Signed-off-by: Al Viro commit 431547b3c4533b8c7fd150ab36980b9a3147797b Author: Christoph Hellwig Date: Fri Nov 13 09:52:56 2009 +0000 sanitize xattr handler prototypes Add a flags argument to struct xattr_handler and pass it to all xattr handler methods. This allows using the same methods for multiple handlers, e.g. for the ACL methods which perform exactly the same action for the access and default ACLs, just using a different underlying attribute. With a little more groundwork it'll also allow sharing the methods for the regular user/trusted/secure handlers in extN, ocfs2 and jffs2 like it's already done for xfs in this patch. Also change the inode argument to the handlers to a dentry to allow using the handlers mechnism for filesystems that require it later, e.g. cifs. [with GFS2 bits updated by Steven Whitehouse ] Signed-off-by: Christoph Hellwig Reviewed-by: James Morris Acked-by: Joel Becker Signed-off-by: Al Viro ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_acl.c | 57 ++++++++++++---------------------- fs/xfs/linux-2.6/xfs_iops.c | 2 +- fs/xfs/linux-2.6/xfs_xattr.c | 71 +++++++++--------------------------------- fs/xfs/xfs_acl.h | 3 +- fs/xfs/xfs_iget.c | 4 +- 5 files changed, 40 insertions(+), 97 deletions(-) hooks/post-receive -- XFS development tree From sandeen@sandeen.net Fri Jan 8 10:45:50 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_210,J_CHICKENPOX_43,J_CHICKENPOX_45,J_CHICKENPOX_52 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08GjoeQ055771 for ; Fri, 8 Jan 2010 10:45:50 -0600 X-ASG-Debug-ID: 1262969202-3669030e0000-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 28FF3153217 for ; Fri, 8 Jan 2010 08:46:42 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id 5vsCA9HztnsoM18O for ; Fri, 08 Jan 2010 08:46:42 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id C08C28E0507; Fri, 8 Jan 2010 10:46:41 -0600 (CST) Message-ID: <4B476171.4020701@sandeen.net> Date: Fri, 08 Jan 2010 10:46:41 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss , Christoph Hellwig X-ASG-Orig-Subj: [PATCH V2] mkfs: handle 4k sector devices more cleanly Subject: [PATCH V2] mkfs: handle 4k sector devices more cleanly References: <4B1E9A25.50108@redhat.com> In-Reply-To: <4B1E9A25.50108@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1262969203 X-Barracuda-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.19282 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 Trying to mkfs a 4k sector device today fails w/o manually specifying sector size: # modprobe scsi_debug sector_size=4096 dev_size_mb=32 # mkfs.xfs -f /dev/sdc mkfs.xfs: warning - cannot set blocksize on block device /dev/sdc: Invalid argument Warning: the data subvolume sector size 512 is less than the sector size reported by the device (4096). ... add sectorsize to the device topology info, and use that if present. Also check that explicitly requested sector sizes are not smaller than the hardware size. This already fails today, but with the more cryptic "cannot set blocksize" ioctl error above. Signed-off-by: Eric Sandeen --- diff --git a/libxfs/linux.c b/libxfs/linux.c index bc49903..2e07d54 100644 --- a/libxfs/linux.c +++ b/libxfs/linux.c @@ -112,9 +112,9 @@ platform_set_blocksize(int fd, char *path, dev_t device, int blocksize, int fata if (major(device) != RAMDISK_MAJOR) { if ((error = ioctl(fd, BLKBSZSET, &blocksize)) < 0) { fprintf(stderr, _("%s: %s - cannot set blocksize " - "on block device %s: %s\n"), + "%d on block device %s: %s\n"), progname, fatal ? "error": "warning", - path, strerror(errno)); + blocksize, path, strerror(errno)); } } return error; diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index d3ed00a..356dcb4 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -33,6 +33,7 @@ struct fs_topology { int dsunit; /* stripe unit - data subvolume */ int dswidth; /* stripe width - data subvolume */ int rtswidth; /* stripe width - rt subvolume */ + int sectorsize; int sectoralign; }; @@ -320,7 +321,7 @@ out_free_probe: return ret; } -static void blkid_get_topology(const char *device, int *sunit, int *swidth) +static void blkid_get_topology(const char *device, int *sunit, int *swidth, int *sectorsize) { blkid_topology tp; blkid_probe pr; @@ -348,6 +349,8 @@ static void blkid_get_topology(const char *device, int *sunit, int *swidth) val = blkid_topology_get_optimal_io_size(tp) >> 9; if (val > 1) *swidth = val; + val = blkid_probe_get_sectorsize(pr); + *sectorsize = val; if (blkid_topology_get_alignment_offset(tp) != 0) { fprintf(stderr, @@ -370,13 +373,14 @@ static void get_topology(libxfs_init_t *xi, struct fs_topology *ft) if (!xi->disfile) { const char *dfile = xi->volname ? xi->volname : xi->dname; - blkid_get_topology(dfile, &ft->dsunit, &ft->dswidth); + blkid_get_topology(dfile, &ft->dsunit, &ft->dswidth, + &ft->sectorsize); } if (xi->rtname && !xi->risfile) { int dummy; - blkid_get_topology(xi->rtname, &dummy, &ft->rtswidth); + blkid_get_topology(xi->rtname, &dummy, &ft->rtswidth, &dummy); } } #else /* ENABLE_BLKID */ @@ -403,15 +407,29 @@ check_overwrite( return 0; } +extern void platform_findsizes (char *path, int fd, long long *sz, int *bsz); + static void get_topology(libxfs_init_t *xi, struct fs_topology *ft) { char *dfile = xi->volname ? xi->volname : xi->dname; + int bsz = BBSIZE; if (!xi->disfile) { + int fd; + long long dummy; + get_subvol_stripe_wrapper(dfile, SVTYPE_DATA, &ft->dsunit, &ft->dswidth, &ft->sectoralign); + fd = open(dfile, O_RDONLY); + /* If this fails we just fall back to BBSIZE */ + if (fd) { + platform_findsizes(dfile, fd, &dummy, &bsz); + close(fd); + } } + ft->sectorsize = bsz; + if (xi->rtname && !xi->risfile) { int dummy1; @@ -1543,8 +1561,15 @@ main( memset(&ft, 0, sizeof(ft)); get_topology(&xi, &ft); - if (ft.sectoralign) { - sectorsize = blocksize; + /* + * MD wants sector size set == block size to avoid switching. + * Otherwise, if not specfied via command, use device sectorsize + */ + if (ft.sectoralign || !ssflag) { + if (ft.sectoralign) + sectorsize = blocksize; + else + sectorsize = ft.sectorsize; sectorlog = libxfs_highbit32(sectorsize); if (loginternal) { lsectorsize = sectorsize; @@ -1556,6 +1581,11 @@ main( fprintf(stderr, _("illegal sector size %d\n"), sectorsize); usage(); } + if (sectorsize < ft.sectorsize) { + fprintf(stderr, _("illegal sector size %d; hw sector is %d\n"), + sectorsize, ft.sectorsize); + usage(); + } if (lsectorsize < XFS_MIN_SECTORSIZE || lsectorsize > XFS_MAX_SECTORSIZE || lsectorsize > blocksize) { fprintf(stderr, _("illegal log sector size %d\n"), lsectorsize); @@ -1751,8 +1781,6 @@ main( if (slflag || ssflag) xi.setblksize = sectorsize; - else - xi.setblksize = 1; /* * Initialize. This will open the log and rt devices as well. From BATV+46b1ae413952afea7e2e+2329+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 8 11:43:09 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_210 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08Hh8Ip059783 for ; Fri, 8 Jan 2010 11:43:08 -0600 X-ASG-Debug-ID: 1262972641-357101b70000-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 0B0FF1535DE for ; Fri, 8 Jan 2010 09:44:01 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id HcoFDSh1QdTmbjip for ; Fri, 08 Jan 2010 09:44:01 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1NTIsS-0001Dn-8y; Fri, 08 Jan 2010 17:44:00 +0000 Date: Fri, 8 Jan 2010 12:44:00 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: Eric Sandeen , Christoph Hellwig , xfs-oss X-ASG-Orig-Subj: Re: [PATCH V2] mkfs: handle 4k sector devices more cleanly Subject: Re: [PATCH V2] mkfs: handle 4k sector devices more cleanly Message-ID: <20100108174400.GA17634@infradead.org> References: <4B1E9A25.50108@redhat.com> <4B476171.4020701@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B476171.4020701@sandeen.net> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 1262972642 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 08, 2010 at 10:46:41AM -0600, Eric Sandeen wrote: > +extern void platform_findsizes (char *path, int fd, long long *sz, int *bsz); Can you move the prototype from libxfs/init.h to include/libxfs.h instead of adding it to the .c file? > + /* > + * MD wants sector size set == block size to avoid switching. > + * Otherwise, if not specfied via command, use device sectorsize > + */ > + if (ft.sectoralign || !ssflag) { > + if (ft.sectoralign) > + sectorsize = blocksize; > + else > + sectorsize = ft.sectorsize; This still confuses the heck out of me. What do you think about the incremental patch at the end of the mail? > if (slflag || ssflag) > xi.setblksize = sectorsize; > - else > - xi.setblksize = 1; So for the defaul case we now never set the sector size in the libxfs init. This seems safe to me, but why did we do it before? Could a previous user have left it set to a wrong value? Maye we should just do the xi.setblksize = sectorsize unconditionally? Index: xfsprogs-dev/mkfs/xfs_mkfs.c =================================================================== --- xfsprogs-dev.orig/mkfs/xfs_mkfs.c 2010-01-08 18:33:53.619277529 +0100 +++ xfsprogs-dev/mkfs/xfs_mkfs.c 2010-01-08 18:39:37.758005711 +0100 @@ -1561,21 +1561,32 @@ main( memset(&ft, 0, sizeof(ft)); get_topology(&xi, &ft); - /* - * MD wants sector size set == block size to avoid switching. - * Otherwise, if not specfied via command, use device sectorsize - */ + if (ft.sectoralign) { + /* + * Older Linux software RAID versions want the sector size + * to match the block size to avoid switching I/O sizes. + * For the legacy libdisk case we thus set the sector size to + * match the block size. For systems using libblkid we assume + * that the kernel is recent enough to not require this and + * ft.sectoralign will never be set. + */ + sectorsize = blocksize; + } else if (!ssflag) { + /* + * Unless specified manually on the command line use the + * advertised sector size of the device. + */ + sectorsize = ft.sectorsize; + } + if (ft.sectoralign || !ssflag) { - if (ft.sectoralign) - sectorsize = blocksize; - else - sectorsize = ft.sectorsize; sectorlog = libxfs_highbit32(sectorsize); if (loginternal) { lsectorsize = sectorsize; lsectorlog = sectorlog; } } + if (sectorsize < XFS_MIN_SECTORSIZE || sectorsize > XFS_MAX_SECTORSIZE || sectorsize > blocksize) { fprintf(stderr, _("illegal sector size %d\n"), sectorsize); From randy.dunlap@oracle.com Fri Jan 8 11:44:06 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,UNPARSEABLE_RELAY autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08Hi6vI059871 for ; Fri, 8 Jan 2010 11:44:06 -0600 X-ASG-Debug-ID: 1262972699-38c001780000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from rcsinet12.oracle.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CFCBE153605; Fri, 8 Jan 2010 09:44:59 -0800 (PST) Received: from rcsinet12.oracle.com (rcsinet12.oracle.com [148.87.113.124]) by cuda.sgi.com with ESMTP id tCrHAZGhh0F9EASH; Fri, 08 Jan 2010 09:44:59 -0800 (PST) Received: from acsinet15.oracle.com (acsinet15.oracle.com [141.146.126.227]) by rcsinet12.oracle.com (Switch-3.4.2/Switch-3.4.2) with ESMTP id o08HiaEX002108 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 8 Jan 2010 17:44:37 GMT Received: from acsmt355.oracle.com (acsmt355.oracle.com [141.146.40.155]) by acsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o08FjgRv013109; Fri, 8 Jan 2010 17:44:35 GMT Received: from abhmt015.oracle.com by acsmt355.oracle.com with ESMTP id 1304923431262972670; Fri, 08 Jan 2010 09:44:30 -0800 Received: from chimera.site (/141.144.226.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 08 Jan 2010 09:44:30 -0800 Date: Fri, 8 Jan 2010 09:44:28 -0800 From: Randy Dunlap To: "Alex Elder" Cc: "Dave Chinner" , , , , X-ASG-Orig-Subj: Re: [GIT PULL] XFS update for 2.6.33-rc1 Subject: Re: [GIT PULL] XFS update for 2.6.33-rc1 Message-Id: <20100108094428.ff03c720.randy.dunlap@oracle.com> In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE012A687F@cf--amer001e--3.americas.sgi.com> References: <20091217002007.GF4850@discord.disaster> <1AB9A794DBDDF54A8A81BE2296F7BDFE012A687F@cf--amer001e--3.americas.sgi.com> Organization: Oracle Linux Eng. X-Mailer: Sylpheed 2.7.1 (GTK+ 2.12.0; x86_64-unknown-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Source-IP: acsmt355.oracle.com [141.146.40.155] X-Auth-Type: Internal IP X-CT-RefId: str=0001.0A0B0207.4B476F04.00D7:SCFMA4539814,ss=1,fgs=0 X-Barracuda-Connect: rcsinet12.oracle.com[148.87.113.124] X-Barracuda-Start-Time: 1262972699 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.19285 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 On Wed, 16 Dec 2009 21:41:12 -0600 Alex Elder wrote: > Dave Chinner wrote: > > On Wed, Dec 16, 2009 at 01:55:12PM -0800, Randy Dunlap wrote: > >> On Wed, 16 Dec 2009 15:26:10 -0600 Alex Elder wrote: > >> > >>> One more XFS update for -rc1, now that the new XFS tracing code has > >>> been committed. > >> > >> Sorry if I have missed it, but have the printk format warnings > >> on i386 builds been fixed? > > > > I don't see any here w/ gcc 4.3.4 x86-64 compiling i386 kernels.... > > I didn't get them either when I built in my environment. > > Dave, your patch looks good to me, and Randy has acked it > so I'm going to pull it into our XFS top-of-tree. I'll > hold off sending yet another pull request to Linus for > now. Thanks for addressing it quickly. > > -Alex Hi Alex, Dave's patch is now needed in Linus's mainline kernel tree... > > /me hates gcc's warning inconsistencies with a passion. > > > >> e.g.: > >> > >> In file included from linux-next-20091216/include/trace/ftrace.h:398, > >> from linux-next-20091216/include/trace/define_trace.h:69, > >> from linux-next-20091216/fs/xfs/linux-2.6/xfs_trace.h:1369, > >> from linux-next-20091216/fs/xfs/linux-2.6/xfs_trace.c:75: > >> linux-next-20091216/fs/xfs/linux-2.6/./xfs_trace.h: In function > >> 'ftrace_raw_output_id_xfs_iomap_enter': linux-next-20091216/fs/xfs/linux-2.6/./xfs_trace.h:830: > >> warning: format '%llx' expects type 'long long unsigned int', but argument 12 has type > >> 'xfs_fsblock_t' > > > > Patch that should fix this below. > > > > Cheers, > > > > Dave. --- ~Randy From sandeen@sandeen.net Fri Jan 8 11:51:05 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_210 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08Hp4wF060322 for ; Fri, 8 Jan 2010 11:51:04 -0600 X-ASG-Debug-ID: 1262973117-23a900f70000-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 D6F5E1C3C045 for ; Fri, 8 Jan 2010 09:51:57 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id ATg026AYv9KhUHTD for ; Fri, 08 Jan 2010 09:51:57 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 16B548E050C; Fri, 8 Jan 2010 11:51:57 -0600 (CST) Message-ID: <4B4770BC.4050306@sandeen.net> Date: Fri, 08 Jan 2010 11:51:56 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Christoph Hellwig CC: Eric Sandeen , xfs-oss X-ASG-Orig-Subj: Re: [PATCH V2] mkfs: handle 4k sector devices more cleanly Subject: Re: [PATCH V2] mkfs: handle 4k sector devices more cleanly References: <4B1E9A25.50108@redhat.com> <4B476171.4020701@sandeen.net> <20100108174400.GA17634@infradead.org> In-Reply-To: <20100108174400.GA17634@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1262973117 X-Barracuda-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.19287 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 Christoph Hellwig wrote: > On Fri, Jan 08, 2010 at 10:46:41AM -0600, Eric Sandeen wrote: >> +extern void platform_findsizes (char *path, int fd, long long *sz, int *bsz); > > Can you move the prototype from libxfs/init.h to include/libxfs.h > instead of adding it to the .c file? sure, heh, you know - I knew that was a bad idea ;) >> + /* >> + * MD wants sector size set == block size to avoid switching. >> + * Otherwise, if not specfied via command, use device sectorsize >> + */ >> + if (ft.sectoralign || !ssflag) { >> + if (ft.sectoralign) >> + sectorsize = blocksize; >> + else >> + sectorsize = ft.sectorsize; > > This still confuses the heck out of me. What do you think about the > incremental patch at the end of the mail? yeah, that seems good. >> if (slflag || ssflag) >> xi.setblksize = sectorsize; >> - else >> - xi.setblksize = 1; > > So for the defaul case we now never set the sector size in the libxfs > init. This seems safe to me, but why did we do it before? Could > a previous user have left it set to a wrong value? > > Maye we should just do the xi.setblksize = sectorsize unconditionally? ugh this stuff is messy. let me see what sectorsize's default is... If we take out the "1 is special" stuff I should probably chase it through all the code. Ok, will give this one more crack :) Thanks, -Eric > > Index: xfsprogs-dev/mkfs/xfs_mkfs.c > =================================================================== > --- xfsprogs-dev.orig/mkfs/xfs_mkfs.c 2010-01-08 18:33:53.619277529 +0100 > +++ xfsprogs-dev/mkfs/xfs_mkfs.c 2010-01-08 18:39:37.758005711 +0100 > @@ -1561,21 +1561,32 @@ main( > memset(&ft, 0, sizeof(ft)); > get_topology(&xi, &ft); > > - /* > - * MD wants sector size set == block size to avoid switching. > - * Otherwise, if not specfied via command, use device sectorsize > - */ > + if (ft.sectoralign) { > + /* > + * Older Linux software RAID versions want the sector size > + * to match the block size to avoid switching I/O sizes. > + * For the legacy libdisk case we thus set the sector size to > + * match the block size. For systems using libblkid we assume > + * that the kernel is recent enough to not require this and > + * ft.sectoralign will never be set. > + */ > + sectorsize = blocksize; > + } else if (!ssflag) { > + /* > + * Unless specified manually on the command line use the > + * advertised sector size of the device. > + */ > + sectorsize = ft.sectorsize; > + } > + > if (ft.sectoralign || !ssflag) { > - if (ft.sectoralign) > - sectorsize = blocksize; > - else > - sectorsize = ft.sectorsize; > sectorlog = libxfs_highbit32(sectorsize); > if (loginternal) { > lsectorsize = sectorsize; > lsectorlog = sectorlog; > } > } > + > if (sectorsize < XFS_MIN_SECTORSIZE || > sectorsize > XFS_MAX_SECTORSIZE || sectorsize > blocksize) { > fprintf(stderr, _("illegal sector size %d\n"), sectorsize); > From aelder@sgi.com Fri Jan 8 12:09:05 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08I94xe061541 for ; Fri, 8 Jan 2010 12:09:04 -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 D79A58F80DA; Fri, 8 Jan 2010 10:09:54 -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="iso-8859-1" Content-Transfer-Encoding: quoted-printable Subject: RE: [GIT PULL] XFS update for 2.6.33-rc1 Date: Fri, 8 Jan 2010 12:09:54 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE012A6931@cf--amer001e--3.americas.sgi.com> In-Reply-To: <20100108094428.ff03c720.randy.dunlap@oracle.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [GIT PULL] XFS update for 2.6.33-rc1 Thread-Index: AcqQik3BMM2tECHFQwGmeZGO+yJPIAAAs5Hw From: "Alex Elder" To: "Randy Dunlap" Cc: "Dave Chinner" , , , , X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Randy Dunlap wrote: > On Wed, 16 Dec 2009 21:41:12 -0600 Alex Elder wrote: >=20 >> Dave Chinner wrote: >>> On Wed, Dec 16, 2009 at 01:55:12PM -0800, Randy Dunlap wrote: >>>> On Wed, 16 Dec 2009 15:26:10 -0600 Alex Elder wrote: >>>>=20 >>>>> One more XFS update for -rc1, now that the new XFS tracing code = has >>>>> been committed. >>>>=20 >>>> Sorry if I have missed it, but have the printk format warnings >>>> on i386 builds been fixed? >>>=20 >>> I don't see any here w/ gcc 4.3.4 x86-64 compiling i386 kernels.... >>=20 >> I didn't get them either when I built in my environment. >>=20 >> Dave, your patch looks good to me, and Randy has acked it >> so I'm going to pull it into our XFS top-of-tree. I'll >> hold off sending yet another pull request to Linus for >> now. Thanks for addressing it quickly. >>=20 >> -Alex >=20 > Hi Alex, > Dave's patch is now needed in Linus's mainline kernel tree... Yes, I noticed that. I forgot I hadn't requested it get pulled. Sorry. Working on that today. -Alex >>> /me hates gcc's warning inconsistencies with a passion. >>>=20 >>>> e.g.: >>>>=20 >>>> In file included from = linux-next-20091216/include/trace/ftrace.h:398, >>>> from = linux-next-20091216/include/trace/define_trace.h:69, >>>> from = linux-next-20091216/fs/xfs/linux-2.6/xfs_trace.h:1369, >>>> from = linux-next-20091216/fs/xfs/linux-2.6/xfs_trace.c:75: >>>> linux-next-20091216/fs/xfs/linux-2.6/./xfs_trace.h: In function >>>> 'ftrace_raw_output_id_xfs_iomap_enter': >>>> linux-next-20091216/fs/xfs/linux-2.6/./xfs_trace.h:830: warning: = format '%llx' expects type >>>> 'long long unsigned int', but argument 12 has type 'xfs_fsblock_t' >>>=20 >>> Patch that should fix this below. >>>=20 >>> Cheers, >>>=20 >>> Dave. >=20 >=20 > --- > ~Randy From aelder@sgi.com Fri Jan 8 12:13:44 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08IDiWO061840 for ; Fri, 8 Jan 2010 12:13:44 -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 D4B038F808E for ; Fri, 8 Jan 2010 10:14:37 -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="iso-8859-1" Content-Transfer-Encoding: quoted-printable Subject: xfstests: [PATCH 0/2] ignore duplicates reported by repquota Date: Fri, 8 Jan 2010 12:14:37 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE012A6932@cf--amer001e--3.americas.sgi.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: xfstests: [PATCH 0/2] ignore duplicates reported by repquota Thread-Index: AcqQjnHs9Z3G/vQ+SOaiVt4AsJ2RVw== From: "Alex Elder" To: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean It is possible for the same numeric user id to be assigned to more than one user account. The repquota command, as well as the xfs_quota "repquota" command (if not given an upper bound user id to scan for) will scan the entire password file using getpwent() in order to report quota information for all users. As a result, any numeric id that is used more than once will also be reported more than once by "repquota". Multiply-used group and project id's would have the same behavior. The effect of this is that in some of the quota-related tests, output mismatches will be reported in the event an id used in testing is associated with multiple users/groups/projects. To get around this, arrange to ignore duplicate entries reported by requota and the "repquota" xfs_quota command. From aelder@sgi.com Fri Jan 8 12:13:52 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08IDq8a061864 for ; Fri, 8 Jan 2010 12:13:52 -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 713B7AC033 for ; Fri, 8 Jan 2010 10:14:42 -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="iso-8859-1" Content-Transfer-Encoding: quoted-printable Subject: [PATCH 1/2] xfstests: 050: ignore duplicates reported by repquota Date: Fri, 8 Jan 2010 12:14:41 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE012A6933@cf--amer001e--3.americas.sgi.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH 1/2] xfstests: 050: ignore duplicates reported by repquota Thread-Index: AcqQjnSJNBfngVT/RBWOBPvfciuZbQ== From: "Alex Elder" To: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Arrange to ignore duplicate entries reported by the "repquota" xfs_quota command. This can happen if an id is used more than once (such as when two user names are assigned the same uid). Since we are already sorting the output we can accomplish this by adding the "-u" (unique) option to the sort command. Shorten some long lines while we're at it. Signed-off-by: Alex Elder --- 050 | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) Index: b/050 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- a/050 +++ b/050 @@ -118,7 +118,9 @@ =20 echo echo "*** report no quota settings" | tee -a $seq.full - xfs_quota -D $tmp.projects -P $tmp.projid -x -c "repquota -birnN = -$type" $SCRATCH_DEV | _filter_report | LC_COLLATE=3DPOSIX sort -r + xfs_quota -D $tmp.projects -P $tmp.projid -x \ + -c "repquota -birnN -$type" $SCRATCH_DEV | + _filter_report | LC_COLLATE=3DPOSIX sort -ru =20 echo echo "*** report initial settings" | tee -a $seq.full @@ -129,20 +131,26 @@ -c "limit -$type bsoft=3D${bsoft}k bhard=3D${bhard}k $id" \ -c "limit -$type isoft=3D$isoft ihard=3D$ihard $id" \ $SCRATCH_DEV - xfs_quota -D $tmp.projects -P $tmp.projid -x -c "repquota -birnN = -$type" $SCRATCH_DEV | _filter_report | LC_COLLATE=3DPOSIX sort -r + xfs_quota -D $tmp.projects -P $tmp.projid -x \ + -c "repquota -birnN -$type" $SCRATCH_DEV | + _filter_report | LC_COLLATE=3DPOSIX sort -ru =20 echo echo "*** push past the soft inode limit" | tee -a $seq.full _file_as_id $SCRATCH_MNT/softie1 $id $type 1024 0 _file_as_id $SCRATCH_MNT/softie2 $id $type 1024 0 _qmount - xfs_quota -D $tmp.projects -P $tmp.projid -x -c "repquota -birnN = -$type" $SCRATCH_DEV | _filter_report | LC_COLLATE=3DPOSIX sort -r + xfs_quota -D $tmp.projects -P $tmp.projid -x \ + -c "repquota -birnN -$type" $SCRATCH_DEV | + _filter_report | LC_COLLATE=3DPOSIX sort -ru =20 echo echo "*** push past the soft block limit" | tee -a $seq.full _file_as_id $SCRATCH_MNT/softie $id $type 1024 140 _qmount - xfs_quota -D $tmp.projects -P $tmp.projid -x -c "repquota -birnN = -$type" $SCRATCH_DEV | _filter_report | LC_COLLATE=3DPOSIX sort -r + xfs_quota -D $tmp.projects -P $tmp.projid -x \ + -c "repquota -birnN -$type" $SCRATCH_DEV | + _filter_report | LC_COLLATE=3DPOSIX sort -ru =20 echo # Note: for quota accounting (not enforcement), EDQUOT is not expected @@ -152,7 +160,9 @@ _file_as_id $SCRATCH_MNT/hard$i $id $type 1024 0 done _qmount - xfs_quota -D $tmp.projects -P $tmp.projid -x -c "repquota -birnN = -$type" $SCRATCH_DEV | _filter_report | LC_COLLATE=3DPOSIX sort -r + xfs_quota -D $tmp.projects -P $tmp.projid -x \ + -c "repquota -birnN -$type" $SCRATCH_DEV | + _filter_report | LC_COLLATE=3DPOSIX sort -ru =20 echo # Note: for quota accounting (not enforcement), EDQUOT is not expected @@ -161,7 +171,9 @@ echo "ls -l $SCRATCH_MNT" >>$seq.full ls -l $SCRATCH_MNT >>$seq.full _qmount - xfs_quota -D $tmp.projects -P $tmp.projid -x -c "repquota -birnN = -$type" $SCRATCH_DEV | _filter_and_check_blks | LC_COLLATE=3DPOSIX sort = -r + xfs_quota -D $tmp.projects -P $tmp.projid -x \ + -c "repquota -birnN -$type" $SCRATCH_DEV | + _filter_and_check_blks | LC_COLLATE=3DPOSIX sort -ru =20 echo echo "*** unmount" From aelder@oss.sgi.com Fri Jan 8 12:50:03 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08Io3tA064525 for ; Fri, 8 Jan 2010 12:50:03 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o08Io1Va064352; Fri, 8 Jan 2010 12:50:01 -0600 Date: Fri, 8 Jan 2010 12:50:01 -0600 Message-Id: <201001081850.o08Io1Va064352@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v2.6.30-rc4-34425-ga2b6311 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: f8c89a9e39a10448543c8dc720626d4cf7f2ec49 X-Git-Newrev: a2b63114daf490a68bc9a32dac99d1888c5de842 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 discards f8c89a9e39a10448543c8dc720626d4cf7f2ec49 (commit) discards 47e96ea6187f0ea7322d9beedc046a5409c4d45e (commit) discards 2402c0970562d7c815a23db92827af1c33a34fad (commit) discards 79c3f79f1cfc128410293a400921bef7ba42d37e (commit) discards 26d56b2f0597d0529f829629f6f1873356c4a9b2 (commit) discards d0c156230fa510e7e091e60d4c9c3ea7bd96edf6 (commit) discards b3460b3bf6a017a2cb0a67e4fe74c0b6dc25ddd7 (commit) discards febec432aeeaa5edead1c4a6db3b75e2402b0e9d (commit) a2b6311 xfs: kill some warnings on i386 builds eaff807 kill I_LOCK bea4c89 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs 3fc98b1 XFS: Free buffer pages array unconditionally a5f9be5 xfs: kill xfs_bmbt_rec_32/64 types 2ee1aba xfs: improve metadata I/O merging in the elevator b44b112 xfs: check for not fully initialized inodes in xfs_ireclaim 1e431f5 cleanup blockdev_direct_IO locking 431547b sanitize xattr handler prototypes 5fe878a direct-io: cleanup blockdev_direct_IO locking d180ec5 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs 03daa57 fs/xfs/xfs_log_recover.c: use %pU to print UUIDs 0b1b213 xfs: event tracing support 6ef3554 xfs: change the xfs_iext_insert / xfs_iext_remove 7574aa9 xfs: cleanup bmap extent state macros d031655 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu 3126c13 Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6 f4d544e Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs 6b2f3d1 vfs: Implement proper O_SYNC semantics 4ef58d4 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 6035ccd Merge branch 'for-2.6.33' of git://git.kernel.dk/linux-2.6-block 1557d33 Merge git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/sysctl-2.6 d014d04 Merge branch 'for-next' into for-linus af901ca tree-wide: fix assorted typos all over the place 0d99519 writeback: remove unused nonblocking and congestion checks 6d45611 sysctl: Drop & in front of every proc_handler. ab09203 sysctl fs: Remove dead binary sysctl support 7a9e02d this_cpu: xfs_icsb_modify_counters does not need "cpu" variable from f8c89a9e39a10448543c8dc720626d4cf7f2ec49 (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 a2b63114daf490a68bc9a32dac99d1888c5de842 Author: Dave Chinner Date: Thu Dec 17 00:20:07 2009 +0000 xfs: kill some warnings on i386 builds Randy Dunlap Reported printk() format-related warnings reported on i386 builds in his environment. Dave Chinner provided this patch to eliminate them. Signed-off by: Dave Chinner Acked-by: Randy Dunlap Signed-off-by: Alex Elder ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_acl.c | 57 +++++++++++--------------------- fs/xfs/linux-2.6/xfs_aops.c | 29 +++++------------ fs/xfs/linux-2.6/xfs_iops.c | 2 +- fs/xfs/linux-2.6/xfs_lrw.c | 2 +- fs/xfs/linux-2.6/xfs_sysctl.c | 62 +++++++++--------------------------- fs/xfs/linux-2.6/xfs_xattr.c | 71 +++++++++-------------------------------- fs/xfs/quota/xfs_dquot.h | 2 +- fs/xfs/xfs_acl.h | 3 +- fs/xfs/xfs_iget.c | 4 +- fs/xfs/xfs_log_recover.c | 14 ++------ fs/xfs/xfs_mount.c | 12 +++--- 11 files changed, 75 insertions(+), 183 deletions(-) hooks/post-receive -- XFS development tree From aelder@sgi.com Fri Jan 8 13:24:22 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_66 autolearn=no version=3.3.0-rupdated Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08JOLEQ066432 for ; Fri, 8 Jan 2010 13:24:22 -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 A4D4D8F80D5 for ; Fri, 8 Jan 2010 11:25:12 -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="iso-8859-1" Content-Transfer-Encoding: quoted-printable Subject: RE: [XFS updates] XFS development tree branch, master,updated. v2.6.30-rc4-34425-ga2b6311 Date: Fri, 8 Jan 2010 13:25:09 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE012A6935@cf--amer001e--3.americas.sgi.com> In-Reply-To: <201001081850.o08Io1Va064352@oss.sgi.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [XFS updates] XFS development tree branch, master,updated. v2.6.30-rc4-34425-ga2b6311 Thread-Index: AcqQlQJWWQyZGxPORFunFEjA5J5EIAAAfQrw From: "Alex Elder" To: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This update makes the XFS master branch be based on v2.6.33-rc3. I will probably be doing rebases to the -rcX branches more often than in the past. This is another forced update so in order to update your tree you will need to sort of rewind to an older commit (like v2.6.32) first. I.e., something like this: (first, stash any of your own work) git checkout master git reset --hard v2.6.32 git fetch git://oss.sgi.com/xfs/xfs.git master:master I hope to avoid this sort of thing in the future. Sorry for the inconvenience. -Alex xfs@oss.sgi.com wrote: > This is an automated email from the git hooks/post-receive script. It = was > generated because a ref change was pushed to the repository containing > the project "XFS development tree". >=20 > The branch, master has been updated > discards f8c89a9e39a10448543c8dc720626d4cf7f2ec49 (commit) > discards 47e96ea6187f0ea7322d9beedc046a5409c4d45e (commit) > discards 2402c0970562d7c815a23db92827af1c33a34fad (commit) > discards 79c3f79f1cfc128410293a400921bef7ba42d37e (commit) > discards 26d56b2f0597d0529f829629f6f1873356c4a9b2 (commit) > discards d0c156230fa510e7e091e60d4c9c3ea7bd96edf6 (commit) > discards b3460b3bf6a017a2cb0a67e4fe74c0b6dc25ddd7 (commit) > discards febec432aeeaa5edead1c4a6db3b75e2402b0e9d (commit) > a2b6311 xfs: kill some warnings on i386 builds > eaff807 kill I_LOCK > bea4c89 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs > 3fc98b1 XFS: Free buffer pages array unconditionally > a5f9be5 xfs: kill xfs_bmbt_rec_32/64 types > 2ee1aba xfs: improve metadata I/O merging in the elevator > b44b112 xfs: check for not fully initialized inodes in xfs_ireclaim > 1e431f5 cleanup blockdev_direct_IO locking > 431547b sanitize xattr handler prototypes > 5fe878a direct-io: cleanup blockdev_direct_IO locking > d180ec5 Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs > 03daa57 fs/xfs/xfs_log_recover.c: use %pU to print UUIDs > 0b1b213 xfs: event tracing support > 6ef3554 xfs: change the xfs_iext_insert / xfs_iext_remove > 7574aa9 xfs: cleanup bmap extent state macros > d031655 Merge branch 'for-linus' of = git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu > 3126c13 Merge branch 'for_linus' of > git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6 = f4d544e Merge branch > 'for-linus' of git://oss.sgi.com/xfs/xfs 6b2f3d1 vfs: Implement = proper O_SYNC semantics > 4ef58d4 Merge branch 'for-linus' of = git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial > 6035ccd Merge branch 'for-2.6.33' of = git://git.kernel.dk/linux-2.6-block > 1557d33 Merge = git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/sysctl-2.6 > d014d04 Merge branch 'for-next' into for-linus > af901ca tree-wide: fix assorted typos all over the place > 0d99519 writeback: remove unused nonblocking and congestion checks > 6d45611 sysctl: Drop & in front of every proc_handler. > ab09203 sysctl fs: Remove dead binary sysctl support > 7a9e02d this_cpu: xfs_icsb_modify_counters does not need "cpu" = variable > from f8c89a9e39a10448543c8dc720626d4cf7f2ec49 (commit) >=20 > 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. >=20 > - Log = ----------------------------------------------------------------- > commit a2b63114daf490a68bc9a32dac99d1888c5de842 > Author: Dave Chinner > Date: Thu Dec 17 00:20:07 2009 +0000 >=20 > xfs: kill some warnings on i386 builds >=20 > Randy Dunlap Reported printk() format-related warnings reported > on i386 builds in his environment. Dave Chinner provided this > patch to eliminate them. >=20 > Signed-off by: Dave Chinner > Acked-by: Randy Dunlap >=20 > Signed-off-by: Alex Elder >=20 > = ----------------------------------------------------------------------- >=20 > Summary of changes: > fs/xfs/linux-2.6/xfs_acl.c | 57 +++++++++++--------------------- > fs/xfs/linux-2.6/xfs_aops.c | 29 +++++------------ > fs/xfs/linux-2.6/xfs_iops.c | 2 +- > fs/xfs/linux-2.6/xfs_lrw.c | 2 +- > fs/xfs/linux-2.6/xfs_sysctl.c | 62 = +++++++++--------------------------- > fs/xfs/linux-2.6/xfs_xattr.c | 71 = +++++++++-------------------------------- > fs/xfs/quota/xfs_dquot.h | 2 +- > fs/xfs/xfs_acl.h | 3 +- > fs/xfs/xfs_iget.c | 4 +- > fs/xfs/xfs_log_recover.c | 14 ++------ > fs/xfs/xfs_mount.c | 12 +++--- > 11 files changed, 75 insertions(+), 183 deletions(-) >=20 >=20 > hooks/post-receive From aelder@oss.sgi.com Fri Jan 8 13:39:02 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08Jd1kA067554 for ; Fri, 8 Jan 2010 13:39:02 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o08Jd0MA067524; Fri, 8 Jan 2010 13:39:00 -0600 Date: Fri, 8 Jan 2010 13:39:00 -0600 Message-Id: <201001081939.o08Jd0MA067524@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.30-rc4-34425-ga539bd8 X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: 74d2e4f8d79ae0c4b6ec027958d5b18058662eea X-Git-Newrev: a539bd8c86549b545b4ed27a0cfaf53fe649054d 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 a539bd8 xfs: kill some warnings on i386 builds from 74d2e4f8d79ae0c4b6ec027958d5b18058662eea (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 a539bd8c86549b545b4ed27a0cfaf53fe649054d Author: Dave Chinner Date: Thu Dec 17 00:20:07 2009 +0000 xfs: kill some warnings on i386 builds Randy Dunlap Reported printk() format-related warnings reported on i386 builds in his environment. Dave Chinner provided this patch to eliminate them. Signed-off by: Dave Chinner Acked-by: Randy Dunlap Signed-off-by: Alex Elder ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_trace.h | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) hooks/post-receive -- XFS development tree From aelder@sgi.com Fri Jan 8 13:46:08 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08Jk8WA068013 for ; Fri, 8 Jan 2010 13:46:08 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id CB76B8F80E0; Fri, 8 Jan 2010 11:46:58 -0800 (PST) Received: from stout.americas.sgi.com (localhost6.localdomain6 [127.0.0.1]) by stout.americas.sgi.com (8.14.3/8.14.2) with ESMTP id o08JkubE018977; Fri, 8 Jan 2010 13:46:56 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o08JksvX018976; Fri, 8 Jan 2010 13:46:54 -0600 From: Alex Elder Message-Id: <201001081946.o08JksvX018976@stout.americas.sgi.com> Date: Fri, 08 Jan 2010 13:46:54 -0600 To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update 1 for 2.6.33-rc3 Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org User-Agent: Heirloom mailx 12.4 7/29/08 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 I have a few other commits to send along but there's no sense in waiting for them. I forgot to send this one before; it eliminates some i386 build warnings in certain environments. -Alex The following changes since commit 74d2e4f8d79ae0c4b6ec027958d5b18058662eea: Linus Torvalds (1): Linux 2.6.33-rc3 are available in the git repository at: git://oss.sgi.com/xfs/xfs for-linus Dave Chinner (1): xfs: kill some warnings on i386 builds fs/xfs/linux-2.6/xfs_trace.h | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) From aelder@sgi.com Fri Jan 8 15:01:00 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08L10Hu072472 for ; Fri, 8 Jan 2010 15:01:00 -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 3C09D8F8073; Fri, 8 Jan 2010 13:01:50 -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="iso-8859-1" Content-Transfer-Encoding: quoted-printable Subject: RE: [PATCH] XFS: Don't flush stale inodes Date: Fri, 8 Jan 2010 14:59:40 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE012A6936@cf--amer001e--3.americas.sgi.com> In-Reply-To: <1262399980-19277-1-git-send-email-david@fromorbit.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH] XFS: Don't flush stale inodes Thread-Index: AcqLV7bI0nnFfSqfTh2fVEXLp9a9CwFTY/kg From: "Alex Elder" To: "Dave Chinner" Cc: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave Chinner wrote: > Because inodes remain in cache much longer than inode buffers do > under memory pressure, we can get the situation where we have stale, > dirty inodes being reclaimed but the backing storage has been freed. > Hence we should never, ever flush XFS_ISTALE inodes to disk as > there is no guarantee that the backing buffer is in cache and > still marked stale when the flush occurs. Looks good. Seems like this could be the source of some pretty gnarly problems. > Signed-off-by: Dave Chinner Reviewed-by: Alex Elder > --- > fs/xfs/xfs_inode.c | 10 +++++++--- > 1 files changed, 7 insertions(+), 3 deletions(-) >=20 > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index c2618db..e5c9953 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -2846,10 +2846,14 @@ xfs_iflush( > mp =3D ip->i_mount; >=20 > /* > - * If the inode isn't dirty, then just release the inode > - * flush lock and do nothing. > + * If the inode isn't dirty, then just release the inode flush lock = and > + * do nothing. Treat stale inodes the same; we cannot rely on the > + * backing buffer remaining stale in cache for the remaining life of > + * the stale inode and so xfs_itobp() below may give us a buffer = that > + * no longer contains inodes below. Doing this stale check here also > + * avoids forcing the log on pinned, stale inodes. > */ > - if (xfs_inode_clean(ip)) { > + if (xfs_inode_clean(ip) || xfs_iflags_test(ip, XFS_ISTALE)) { > xfs_ifunlock(ip); > return 0; > } From aelder@sgi.com Fri Jan 8 15:29:57 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX,J_CHICKENPOX_12 autolearn=no version=3.3.0-rupdated Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08LTaKG074950 for ; Fri, 8 Jan 2010 15:29:52 -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 6DCC88F8158; Fri, 8 Jan 2010 13:30:25 -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="iso-8859-1" Content-Transfer-Encoding: quoted-printable Subject: RE: use DECLARE_EVENT_CLASS Date: Fri, 8 Jan 2010 15:30:16 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE012A6937@cf--amer001e--3.americas.sgi.com> In-Reply-To: <20091221140303.GA31919@infradead.org> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: use DECLARE_EVENT_CLASS Thread-Index: AcqCSh6Tqw0GWDzuSnmOouYHHiQcNwOXzb8g From: "Alex Elder" To: "Christoph Hellwig" , X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > Using DECLARE_EVENT_CLASS allows us to to use trace event code instead = of > duplicating it in the binary. This was not avaible before 2.6.33 so = it > had to be done as a separate step once the prerequisite was merged. >=20 > This only requires changes to xfs_trace.h and the results are rather = impressive: >=20 > hch@brick:~/work/linux-2.6/obj-kvm$ size fs/xfs/xfs.o* > text data bss dec hex filename > 607732 41884 3616 653232 9f7b0 fs/xfs/xfs.o > 1026732 41884 3808 1072424 105d28 fs/xfs/xfs.o.old 40% reduction is quite nice. > Signed-off-by: Christoph Hellwig Reviewed-by: Alex Elder > Index: linux-2.6/fs/xfs/linux-2.6/xfs_trace.h > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_trace.h 2009-12-21 = 14:28:56.056990760 +0100 > +++ linux-2.6/fs/xfs/linux-2.6/xfs_trace.h 2009-12-21 = 14:42:56.788990761 +0100 > @@ -33,51 +33,55 @@ struct xfs_dquot; > struct xlog_ticket; > struct log; >=20 > +DECLARE_EVENT_CLASS(xfs_attr_list_class, > + TP_PROTO(struct xfs_attr_list_context *ctx), > + TP_ARGS(ctx), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_ino_t, ino) > + __field(u32, hashval) > + __field(u32, blkno) > + __field(u32, offset) > + __field(void *, alist) > + __field(int, bufsize) > + __field(int, count) > + __field(int, firstu) > + __field(int, dupcnt) > + __field(int, flags) > + ), > + TP_fast_assign( > + __entry->dev =3D VFS_I(ctx->dp)->i_sb->s_dev; > + __entry->ino =3D ctx->dp->i_ino; > + __entry->hashval =3D ctx->cursor->hashval; > + __entry->blkno =3D ctx->cursor->blkno; > + __entry->offset =3D ctx->cursor->offset; > + __entry->alist =3D ctx->alist; > + __entry->bufsize =3D ctx->bufsize; > + __entry->count =3D ctx->count; > + __entry->firstu =3D ctx->firstu; > + __entry->flags =3D ctx->flags; > + ), > + TP_printk("dev %d:%d ino 0x%llx cursor h/b/o 0x%x/0x%x/%u dupcnt %u = " > + "alist 0x%p size %u count %u firstu %u flags %d %s", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->ino, > + __entry->hashval, > + __entry->blkno, > + __entry->offset, > + __entry->dupcnt, > + __entry->alist, > + __entry->bufsize, > + __entry->count, > + __entry->firstu, > + __entry->flags, > + __print_flags(__entry->flags, "|", XFS_ATTR_FLAGS) > + ) > +) > + > #define DEFINE_ATTR_LIST_EVENT(name) \ > -TRACE_EVENT(name, \ > +DEFINE_EVENT(xfs_attr_list_class, name, \ > TP_PROTO(struct xfs_attr_list_context *ctx), \ > - TP_ARGS(ctx), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_ino_t, ino) \ > - __field(u32, hashval) \ > - __field(u32, blkno) \ > - __field(u32, offset) \ > - __field(void *, alist) \ > - __field(int, bufsize) \ > - __field(int, count) \ > - __field(int, firstu) \ > - __field(int, dupcnt) \ > - __field(int, flags) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D VFS_I(ctx->dp)->i_sb->s_dev; \ > - __entry->ino =3D ctx->dp->i_ino; \ > - __entry->hashval =3D ctx->cursor->hashval; \ > - __entry->blkno =3D ctx->cursor->blkno; \ > - __entry->offset =3D ctx->cursor->offset; \ > - __entry->alist =3D ctx->alist; \ > - __entry->bufsize =3D ctx->bufsize; \ > - __entry->count =3D ctx->count; \ > - __entry->firstu =3D ctx->firstu; \ > - __entry->flags =3D ctx->flags; \ > - ), \ > - TP_printk("dev %d:%d ino 0x%llx cursor h/b/o 0x%x/0x%x/%u dupcnt %u = " \ > - "alist 0x%p size %u count %u firstu %u flags %d %s", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - __entry->ino, \ > - __entry->hashval, \ > - __entry->blkno, \ > - __entry->offset, \ > - __entry->dupcnt, \ > - __entry->alist, \ > - __entry->bufsize, \ > - __entry->count, \ > - __entry->firstu, \ > - __entry->flags, \ > - __print_flags(__entry->flags, "|", XFS_ATTR_FLAGS) \ > - ) \ > -) > + TP_ARGS(ctx)) > DEFINE_ATTR_LIST_EVENT(xfs_attr_list_sf); > DEFINE_ATTR_LIST_EVENT(xfs_attr_list_sf_all); > DEFINE_ATTR_LIST_EVENT(xfs_attr_list_leaf); > @@ -178,91 +182,99 @@ TRACE_EVENT(xfs_iext_insert, > (char *)__entry->caller_ip) > ); >=20 > +DECLARE_EVENT_CLASS(xfs_bmap_class, > + TP_PROTO(struct xfs_inode *ip, xfs_extnum_t idx, int state, > + unsigned long caller_ip), > + TP_ARGS(ip, idx, state, caller_ip), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_ino_t, ino) > + __field(xfs_extnum_t, idx) > + __field(xfs_fileoff_t, startoff) > + __field(xfs_fsblock_t, startblock) > + __field(xfs_filblks_t, blockcount) > + __field(xfs_exntst_t, state) > + __field(int, bmap_state) > + __field(unsigned long, caller_ip) > + ), > + TP_fast_assign( > + struct xfs_ifork *ifp =3D (state & BMAP_ATTRFORK) ? > + ip->i_afp : &ip->i_df; > + struct xfs_bmbt_irec r; > + > + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx), &r); > + __entry->dev =3D VFS_I(ip)->i_sb->s_dev; > + __entry->ino =3D ip->i_ino; > + __entry->idx =3D idx; > + __entry->startoff =3D r.br_startoff; > + __entry->startblock =3D r.br_startblock; > + __entry->blockcount =3D r.br_blockcount; > + __entry->state =3D r.br_state; > + __entry->bmap_state =3D state; > + __entry->caller_ip =3D caller_ip; > + ), > + TP_printk("dev %d:%d ino 0x%llx state %s idx %ld " > + "offset %lld block %s count %lld flag %d caller %pf", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->ino, > + __print_flags(__entry->bmap_state, "|", XFS_BMAP_EXT_FLAGS), > + (long)__entry->idx, > + __entry->startoff, > + xfs_fmtfsblock(__entry->startblock), > + __entry->blockcount, > + __entry->state, > + (char *)__entry->caller_ip) > +) > + > #define DEFINE_BMAP_EVENT(name) \ > -TRACE_EVENT(name, \ > +DEFINE_EVENT(xfs_bmap_class, name, \ > TP_PROTO(struct xfs_inode *ip, xfs_extnum_t idx, int state, \ > unsigned long caller_ip), \ > - TP_ARGS(ip, idx, state, caller_ip), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_ino_t, ino) \ > - __field(xfs_extnum_t, idx) \ > - __field(xfs_fileoff_t, startoff) \ > - __field(xfs_fsblock_t, startblock) \ > - __field(xfs_filblks_t, blockcount) \ > - __field(xfs_exntst_t, state) \ > - __field(int, bmap_state) \ > - __field(unsigned long, caller_ip) \ > - ), \ > - TP_fast_assign( \ > - struct xfs_ifork *ifp =3D (state & BMAP_ATTRFORK) ? \ > - ip->i_afp : &ip->i_df; \ > - struct xfs_bmbt_irec r; \ > - \ > - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx), &r); \ > - __entry->dev =3D VFS_I(ip)->i_sb->s_dev; \ > - __entry->ino =3D ip->i_ino; \ > - __entry->idx =3D idx; \ > - __entry->startoff =3D r.br_startoff; \ > - __entry->startblock =3D r.br_startblock; \ > - __entry->blockcount =3D r.br_blockcount; \ > - __entry->state =3D r.br_state; \ > - __entry->bmap_state =3D state; \ > - __entry->caller_ip =3D caller_ip; \ > - ), \ > - TP_printk("dev %d:%d ino 0x%llx state %s idx %ld " \ > - "offset %lld block %s count %lld flag %d caller %pf", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - __entry->ino, \ > - __print_flags(__entry->bmap_state, "|", XFS_BMAP_EXT_FLAGS), \ > - (long)__entry->idx, \ > - __entry->startoff, \ > - xfs_fmtfsblock(__entry->startblock), \ > - __entry->blockcount, \ > - __entry->state, \ > - (char *)__entry->caller_ip) \ > -) > - > + TP_ARGS(ip, idx, state, caller_ip)) > DEFINE_BMAP_EVENT(xfs_iext_remove); > DEFINE_BMAP_EVENT(xfs_bmap_pre_update); > DEFINE_BMAP_EVENT(xfs_bmap_post_update); > DEFINE_BMAP_EVENT(xfs_extlist); >=20 > -#define DEFINE_BUF_EVENT(tname) \ > -TRACE_EVENT(tname, \ > - TP_PROTO(struct xfs_buf *bp, unsigned long caller_ip), \ > - TP_ARGS(bp, caller_ip), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_daddr_t, bno) \ > - __field(size_t, buffer_length) \ > - __field(int, hold) \ > - __field(int, pincount) \ > - __field(unsigned, lockval) \ > - __field(unsigned, flags) \ > - __field(unsigned long, caller_ip) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D bp->b_target->bt_dev; \ > - __entry->bno =3D bp->b_bn; \ > - __entry->buffer_length =3D bp->b_buffer_length; \ > - __entry->hold =3D atomic_read(&bp->b_hold); \ > - __entry->pincount =3D atomic_read(&bp->b_pin_count); \ > - __entry->lockval =3D xfs_buf_lock_value(bp); \ > - __entry->flags =3D bp->b_flags; \ > - __entry->caller_ip =3D caller_ip; \ > - ), \ > - TP_printk("dev %d:%d bno 0x%llx len 0x%zx hold %d pincount %d " \ > - "lock %d flags %s caller %pf", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - (unsigned long long)__entry->bno, \ > - __entry->buffer_length, \ > - __entry->hold, \ > - __entry->pincount, \ > - __entry->lockval, \ > - __print_flags(__entry->flags, "|", XFS_BUF_FLAGS), \ > - (void *)__entry->caller_ip) \ > +DECLARE_EVENT_CLASS(xfs_buf_class, > + TP_PROTO(struct xfs_buf *bp, unsigned long caller_ip), > + TP_ARGS(bp, caller_ip), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_daddr_t, bno) > + __field(size_t, buffer_length) > + __field(int, hold) > + __field(int, pincount) > + __field(unsigned, lockval) > + __field(unsigned, flags) > + __field(unsigned long, caller_ip) > + ), > + TP_fast_assign( > + __entry->dev =3D bp->b_target->bt_dev; > + __entry->bno =3D bp->b_bn; > + __entry->buffer_length =3D bp->b_buffer_length; > + __entry->hold =3D atomic_read(&bp->b_hold); > + __entry->pincount =3D atomic_read(&bp->b_pin_count); > + __entry->lockval =3D xfs_buf_lock_value(bp); > + __entry->flags =3D bp->b_flags; > + __entry->caller_ip =3D caller_ip; > + ), > + TP_printk("dev %d:%d bno 0x%llx len 0x%zx hold %d pincount %d " > + "lock %d flags %s caller %pf", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + (unsigned long long)__entry->bno, > + __entry->buffer_length, > + __entry->hold, > + __entry->pincount, > + __entry->lockval, > + __print_flags(__entry->flags, "|", XFS_BUF_FLAGS), > + (void *)__entry->caller_ip) > ) > + > +#define DEFINE_BUF_EVENT(name) \ > +DEFINE_EVENT(xfs_buf_class, name, \ > + TP_PROTO(struct xfs_buf *bp, unsigned long caller_ip), \ > + TP_ARGS(bp, caller_ip)) > DEFINE_BUF_EVENT(xfs_buf_init); > DEFINE_BUF_EVENT(xfs_buf_free); > DEFINE_BUF_EVENT(xfs_buf_hold); > @@ -299,41 +311,45 @@ DEFINE_BUF_EVENT(xfs_reset_dqcounts); > DEFINE_BUF_EVENT(xfs_inode_item_push); >=20 > /* pass flags explicitly */ > -#define DEFINE_BUF_FLAGS_EVENT(tname) \ > -TRACE_EVENT(tname, \ > - TP_PROTO(struct xfs_buf *bp, unsigned flags, unsigned long = caller_ip), \ > - TP_ARGS(bp, flags, caller_ip), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_daddr_t, bno) \ > - __field(size_t, buffer_length) \ > - __field(int, hold) \ > - __field(int, pincount) \ > - __field(unsigned, lockval) \ > - __field(unsigned, flags) \ > - __field(unsigned long, caller_ip) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D bp->b_target->bt_dev; \ > - __entry->bno =3D bp->b_bn; \ > - __entry->buffer_length =3D bp->b_buffer_length; \ > - __entry->flags =3D flags; \ > - __entry->hold =3D atomic_read(&bp->b_hold); \ > - __entry->pincount =3D atomic_read(&bp->b_pin_count); \ > - __entry->lockval =3D xfs_buf_lock_value(bp); \ > - __entry->caller_ip =3D caller_ip; \ > - ), \ > - TP_printk("dev %d:%d bno 0x%llx len 0x%zx hold %d pincount %d " \ > - "lock %d flags %s caller %pf", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - (unsigned long long)__entry->bno, \ > - __entry->buffer_length, \ > - __entry->hold, \ > - __entry->pincount, \ > - __entry->lockval, \ > - __print_flags(__entry->flags, "|", XFS_BUF_FLAGS), \ > - (void *)__entry->caller_ip) \ > +DECLARE_EVENT_CLASS(xfs_buf_flags_class, > + TP_PROTO(struct xfs_buf *bp, unsigned flags, unsigned long = caller_ip), > + TP_ARGS(bp, flags, caller_ip), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_daddr_t, bno) > + __field(size_t, buffer_length) > + __field(int, hold) > + __field(int, pincount) > + __field(unsigned, lockval) > + __field(unsigned, flags) > + __field(unsigned long, caller_ip) > + ), > + TP_fast_assign( > + __entry->dev =3D bp->b_target->bt_dev; > + __entry->bno =3D bp->b_bn; > + __entry->buffer_length =3D bp->b_buffer_length; > + __entry->flags =3D flags; > + __entry->hold =3D atomic_read(&bp->b_hold); > + __entry->pincount =3D atomic_read(&bp->b_pin_count); > + __entry->lockval =3D xfs_buf_lock_value(bp); > + __entry->caller_ip =3D caller_ip; > + ), > + TP_printk("dev %d:%d bno 0x%llx len 0x%zx hold %d pincount %d " > + "lock %d flags %s caller %pf", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + (unsigned long long)__entry->bno, > + __entry->buffer_length, > + __entry->hold, > + __entry->pincount, > + __entry->lockval, > + __print_flags(__entry->flags, "|", XFS_BUF_FLAGS), > + (void *)__entry->caller_ip) > ) > + > +#define DEFINE_BUF_FLAGS_EVENT(name) \ > +DEFINE_EVENT(xfs_buf_flags_class, name, \ > + TP_PROTO(struct xfs_buf *bp, unsigned flags, unsigned long = caller_ip), \ > + TP_ARGS(bp, flags, caller_ip)) > DEFINE_BUF_FLAGS_EVENT(xfs_buf_find); > DEFINE_BUF_FLAGS_EVENT(xfs_buf_get); > DEFINE_BUF_FLAGS_EVENT(xfs_buf_read); > @@ -376,55 +392,58 @@ TRACE_EVENT(xfs_buf_ioerror, > (void *)__entry->caller_ip) > ); >=20 > -#define DEFINE_BUF_ITEM_EVENT(tname) \ > -TRACE_EVENT(tname, \ > - TP_PROTO(struct xfs_buf_log_item *bip), \ > - TP_ARGS(bip), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_daddr_t, buf_bno) \ > - __field(size_t, buf_len) \ > - __field(int, buf_hold) \ > - __field(int, buf_pincount) \ > - __field(int, buf_lockval) \ > - __field(unsigned, buf_flags) \ > - __field(unsigned, bli_recur) \ > - __field(int, bli_refcount) \ > - __field(unsigned, bli_flags) \ > - __field(void *, li_desc) \ > - __field(unsigned, li_flags) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D bip->bli_buf->b_target->bt_dev; \ > - __entry->bli_flags =3D bip->bli_flags; \ > - __entry->bli_recur =3D bip->bli_recur; \ > - __entry->bli_refcount =3D atomic_read(&bip->bli_refcount); \ > - __entry->buf_bno =3D bip->bli_buf->b_bn; \ > - __entry->buf_len =3D bip->bli_buf->b_buffer_length; \ > - __entry->buf_flags =3D bip->bli_buf->b_flags; \ > - __entry->buf_hold =3D atomic_read(&bip->bli_buf->b_hold); \ > - __entry->buf_pincount =3D \ > - atomic_read(&bip->bli_buf->b_pin_count); \ > - __entry->buf_lockval =3D xfs_buf_lock_value(bip->bli_buf); \ > - __entry->li_desc =3D bip->bli_item.li_desc; \ > - __entry->li_flags =3D bip->bli_item.li_flags; \ > - ), \ > - TP_printk("dev %d:%d bno 0x%llx len 0x%zx hold %d pincount %d " \ > - "lock %d flags %s recur %d refcount %d bliflags %s " \ > - "lidesc 0x%p liflags %s", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - (unsigned long long)__entry->buf_bno, \ > - __entry->buf_len, \ > - __entry->buf_hold, \ > - __entry->buf_pincount, \ > - __entry->buf_lockval, \ > - __print_flags(__entry->buf_flags, "|", XFS_BUF_FLAGS), \ > - __entry->bli_recur, \ > - __entry->bli_refcount, \ > - __print_flags(__entry->bli_flags, "|", XFS_BLI_FLAGS), \ > - __entry->li_desc, \ > - __print_flags(__entry->li_flags, "|", XFS_LI_FLAGS)) \ > +DECLARE_EVENT_CLASS(xfs_buf_item_class, > + TP_PROTO(struct xfs_buf_log_item *bip), > + TP_ARGS(bip), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_daddr_t, buf_bno) > + __field(size_t, buf_len) > + __field(int, buf_hold) > + __field(int, buf_pincount) > + __field(int, buf_lockval) > + __field(unsigned, buf_flags) > + __field(unsigned, bli_recur) > + __field(int, bli_refcount) > + __field(unsigned, bli_flags) > + __field(void *, li_desc) > + __field(unsigned, li_flags) > + ), > + TP_fast_assign( > + __entry->dev =3D bip->bli_buf->b_target->bt_dev; > + __entry->bli_flags =3D bip->bli_flags; > + __entry->bli_recur =3D bip->bli_recur; > + __entry->bli_refcount =3D atomic_read(&bip->bli_refcount); > + __entry->buf_bno =3D bip->bli_buf->b_bn; > + __entry->buf_len =3D bip->bli_buf->b_buffer_length; > + __entry->buf_flags =3D bip->bli_buf->b_flags; > + __entry->buf_hold =3D atomic_read(&bip->bli_buf->b_hold); > + __entry->buf_pincount =3D atomic_read(&bip->bli_buf->b_pin_count); > + __entry->buf_lockval =3D xfs_buf_lock_value(bip->bli_buf); > + __entry->li_desc =3D bip->bli_item.li_desc; > + __entry->li_flags =3D bip->bli_item.li_flags; > + ), > + TP_printk("dev %d:%d bno 0x%llx len 0x%zx hold %d pincount %d " > + "lock %d flags %s recur %d refcount %d bliflags %s " > + "lidesc 0x%p liflags %s", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + (unsigned long long)__entry->buf_bno, > + __entry->buf_len, > + __entry->buf_hold, > + __entry->buf_pincount, > + __entry->buf_lockval, > + __print_flags(__entry->buf_flags, "|", XFS_BUF_FLAGS), > + __entry->bli_recur, > + __entry->bli_refcount, > + __print_flags(__entry->bli_flags, "|", XFS_BLI_FLAGS), > + __entry->li_desc, > + __print_flags(__entry->li_flags, "|", XFS_LI_FLAGS)) > ) > + > +#define DEFINE_BUF_ITEM_EVENT(name) \ > +DEFINE_EVENT(xfs_buf_item_class, name, \ > + TP_PROTO(struct xfs_buf_log_item *bip), \ > + TP_ARGS(bip)) > DEFINE_BUF_ITEM_EVENT(xfs_buf_item_size); > DEFINE_BUF_ITEM_EVENT(xfs_buf_item_size_stale); > DEFINE_BUF_ITEM_EVENT(xfs_buf_item_format); > @@ -450,78 +469,90 @@ DEFINE_BUF_ITEM_EVENT(xfs_trans_bhold); > DEFINE_BUF_ITEM_EVENT(xfs_trans_bhold_release); > DEFINE_BUF_ITEM_EVENT(xfs_trans_binval); >=20 > +DECLARE_EVENT_CLASS(xfs_lock_class, > + TP_PROTO(struct xfs_inode *ip, unsigned lock_flags, > + unsigned long caller_ip), > + TP_ARGS(ip, lock_flags, caller_ip), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_ino_t, ino) > + __field(int, lock_flags) > + __field(unsigned long, caller_ip) > + ), > + TP_fast_assign( > + __entry->dev =3D VFS_I(ip)->i_sb->s_dev; > + __entry->ino =3D ip->i_ino; > + __entry->lock_flags =3D lock_flags; > + __entry->caller_ip =3D caller_ip; > + ), > + TP_printk("dev %d:%d ino 0x%llx flags %s caller %pf", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->ino, > + __print_flags(__entry->lock_flags, "|", XFS_LOCK_FLAGS), > + (void *)__entry->caller_ip) > +) > + > #define DEFINE_LOCK_EVENT(name) \ > -TRACE_EVENT(name, \ > +DEFINE_EVENT(xfs_lock_class, name, \ > TP_PROTO(struct xfs_inode *ip, unsigned lock_flags, \ > unsigned long caller_ip), \ > - TP_ARGS(ip, lock_flags, caller_ip), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_ino_t, ino) \ > - __field(int, lock_flags) \ > - __field(unsigned long, caller_ip) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D VFS_I(ip)->i_sb->s_dev; \ > - __entry->ino =3D ip->i_ino; \ > - __entry->lock_flags =3D lock_flags; \ > - __entry->caller_ip =3D caller_ip; \ > - ), \ > - TP_printk("dev %d:%d ino 0x%llx flags %s caller %pf", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - __entry->ino, \ > - __print_flags(__entry->lock_flags, "|", XFS_LOCK_FLAGS), \ > - (void *)__entry->caller_ip) \ > -) > - > + TP_ARGS(ip, lock_flags, caller_ip)) > DEFINE_LOCK_EVENT(xfs_ilock); > DEFINE_LOCK_EVENT(xfs_ilock_nowait); > DEFINE_LOCK_EVENT(xfs_ilock_demote); > DEFINE_LOCK_EVENT(xfs_iunlock); >=20 > +DECLARE_EVENT_CLASS(xfs_iget_class, > + TP_PROTO(struct xfs_inode *ip), > + TP_ARGS(ip), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_ino_t, ino) > + ), > + TP_fast_assign( > + __entry->dev =3D VFS_I(ip)->i_sb->s_dev; > + __entry->ino =3D ip->i_ino; > + ), > + TP_printk("dev %d:%d ino 0x%llx", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->ino) > +) > + > #define DEFINE_IGET_EVENT(name) \ > -TRACE_EVENT(name, \ > +DEFINE_EVENT(xfs_iget_class, name, \ > TP_PROTO(struct xfs_inode *ip), \ > - TP_ARGS(ip), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_ino_t, ino) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D VFS_I(ip)->i_sb->s_dev; \ > - __entry->ino =3D ip->i_ino; \ > - ), \ > - TP_printk("dev %d:%d ino 0x%llx", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - __entry->ino) \ > -) > + TP_ARGS(ip)) > DEFINE_IGET_EVENT(xfs_iget_skip); > DEFINE_IGET_EVENT(xfs_iget_reclaim); > DEFINE_IGET_EVENT(xfs_iget_found); > DEFINE_IGET_EVENT(xfs_iget_alloc); >=20 > +DECLARE_EVENT_CLASS(xfs_inode_class, > + TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), > + TP_ARGS(ip, caller_ip), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_ino_t, ino) > + __field(int, count) > + __field(unsigned long, caller_ip) > + ), > + TP_fast_assign( > + __entry->dev =3D VFS_I(ip)->i_sb->s_dev; > + __entry->ino =3D ip->i_ino; > + __entry->count =3D atomic_read(&VFS_I(ip)->i_count); > + __entry->caller_ip =3D caller_ip; > + ), > + TP_printk("dev %d:%d ino 0x%llx count %d caller %pf", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->ino, > + __entry->count, > + (char *)__entry->caller_ip) > +) > + > #define DEFINE_INODE_EVENT(name) \ > -TRACE_EVENT(name, \ > +DEFINE_EVENT(xfs_inode_class, name, \ > TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), \ > - TP_ARGS(ip, caller_ip), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_ino_t, ino) \ > - __field(int, count) \ > - __field(unsigned long, caller_ip) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D VFS_I(ip)->i_sb->s_dev; \ > - __entry->ino =3D ip->i_ino; \ > - __entry->count =3D atomic_read(&VFS_I(ip)->i_count); \ > - __entry->caller_ip =3D caller_ip; \ > - ), \ > - TP_printk("dev %d:%d ino 0x%llx count %d caller %pf", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - __entry->ino, \ > - __entry->count, \ > - (char *)__entry->caller_ip) \ > -) > + TP_ARGS(ip, caller_ip)) > DEFINE_INODE_EVENT(xfs_ihold); > DEFINE_INODE_EVENT(xfs_irele); > /* the old xfs_itrace_entry tracer - to be replaced by s.th. in the = VFS */ > @@ -529,55 +560,59 @@ DEFINE_INODE_EVENT(xfs_inode); > #define xfs_itrace_entry(ip) \ > trace_xfs_inode(ip, _THIS_IP_) >=20 > -#define DEFINE_DQUOT_EVENT(tname) \ > -TRACE_EVENT(tname, \ > - TP_PROTO(struct xfs_dquot *dqp), \ > - TP_ARGS(dqp), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(__be32, id) \ > - __field(unsigned, flags) \ > - __field(unsigned, nrefs) \ > - __field(unsigned long long, res_bcount) \ > - __field(unsigned long long, bcount) \ > - __field(unsigned long long, icount) \ > - __field(unsigned long long, blk_hardlimit) \ > - __field(unsigned long long, blk_softlimit) \ > - __field(unsigned long long, ino_hardlimit) \ > - __field(unsigned long long, ino_softlimit) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D dqp->q_mount->m_super->s_dev; \ > - __entry->id =3D dqp->q_core.d_id; \ > - __entry->flags =3D dqp->dq_flags; \ > - __entry->nrefs =3D dqp->q_nrefs; \ > - __entry->res_bcount =3D dqp->q_res_bcount; \ > - __entry->bcount =3D be64_to_cpu(dqp->q_core.d_bcount); \ > - __entry->icount =3D be64_to_cpu(dqp->q_core.d_icount); \ > - __entry->blk_hardlimit =3D \ > - be64_to_cpu(dqp->q_core.d_blk_hardlimit); \ > - __entry->blk_softlimit =3D \ > - be64_to_cpu(dqp->q_core.d_blk_softlimit); \ > - __entry->ino_hardlimit =3D \ > - be64_to_cpu(dqp->q_core.d_ino_hardlimit); \ > - __entry->ino_softlimit =3D \ > - be64_to_cpu(dqp->q_core.d_ino_softlimit); \ > +DECLARE_EVENT_CLASS(xfs_dquot_class, > + TP_PROTO(struct xfs_dquot *dqp), > + TP_ARGS(dqp), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(__be32, id) > + __field(unsigned, flags) > + __field(unsigned, nrefs) > + __field(unsigned long long, res_bcount) > + __field(unsigned long long, bcount) > + __field(unsigned long long, icount) > + __field(unsigned long long, blk_hardlimit) > + __field(unsigned long long, blk_softlimit) > + __field(unsigned long long, ino_hardlimit) > + __field(unsigned long long, ino_softlimit) > ), \ > - TP_printk("dev %d:%d id 0x%x flags %s nrefs %u res_bc 0x%llx " \ > - "bcnt 0x%llx [hard 0x%llx | soft 0x%llx] " \ > - "icnt 0x%llx [hard 0x%llx | soft 0x%llx]", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - be32_to_cpu(__entry->id), \ > - __print_flags(__entry->flags, "|", XFS_DQ_FLAGS), \ > - __entry->nrefs, \ > - __entry->res_bcount, \ > - __entry->bcount, \ > - __entry->blk_hardlimit, \ > - __entry->blk_softlimit, \ > - __entry->icount, \ > - __entry->ino_hardlimit, \ > - __entry->ino_softlimit) \ > + TP_fast_assign( > + __entry->dev =3D dqp->q_mount->m_super->s_dev; > + __entry->id =3D dqp->q_core.d_id; > + __entry->flags =3D dqp->dq_flags; > + __entry->nrefs =3D dqp->q_nrefs; > + __entry->res_bcount =3D dqp->q_res_bcount; > + __entry->bcount =3D be64_to_cpu(dqp->q_core.d_bcount); > + __entry->icount =3D be64_to_cpu(dqp->q_core.d_icount); > + __entry->blk_hardlimit =3D > + be64_to_cpu(dqp->q_core.d_blk_hardlimit); > + __entry->blk_softlimit =3D > + be64_to_cpu(dqp->q_core.d_blk_softlimit); > + __entry->ino_hardlimit =3D > + be64_to_cpu(dqp->q_core.d_ino_hardlimit); > + __entry->ino_softlimit =3D > + be64_to_cpu(dqp->q_core.d_ino_softlimit); > + ), > + TP_printk("dev %d:%d id 0x%x flags %s nrefs %u res_bc 0x%llx " > + "bcnt 0x%llx [hard 0x%llx | soft 0x%llx] " > + "icnt 0x%llx [hard 0x%llx | soft 0x%llx]", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + be32_to_cpu(__entry->id), > + __print_flags(__entry->flags, "|", XFS_DQ_FLAGS), > + __entry->nrefs, > + __entry->res_bcount, > + __entry->bcount, > + __entry->blk_hardlimit, > + __entry->blk_softlimit, > + __entry->icount, > + __entry->ino_hardlimit, > + __entry->ino_softlimit) > ) > + > +#define DEFINE_DQUOT_EVENT(name) \ > +DEFINE_EVENT(xfs_dquot_class, name, \ > + TP_PROTO(struct xfs_dquot *dqp), \ > + TP_ARGS(dqp)) > DEFINE_DQUOT_EVENT(xfs_dqadjust); > DEFINE_DQUOT_EVENT(xfs_dqshake_dirty); > DEFINE_DQUOT_EVENT(xfs_dqshake_unlink); > @@ -610,72 +645,75 @@ DEFINE_DQUOT_EVENT(xfs_dqflush_done); > DEFINE_IGET_EVENT(xfs_dquot_dqalloc); > DEFINE_IGET_EVENT(xfs_dquot_dqdetach); >=20 > +DECLARE_EVENT_CLASS(xfs_loggrant_class, > + TP_PROTO(struct log *log, struct xlog_ticket *tic), > + TP_ARGS(log, tic), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(unsigned, trans_type) > + __field(char, ocnt) > + __field(char, cnt) > + __field(int, curr_res) > + __field(int, unit_res) > + __field(unsigned int, flags) > + __field(void *, reserve_headq) > + __field(void *, write_headq) > + __field(int, grant_reserve_cycle) > + __field(int, grant_reserve_bytes) > + __field(int, grant_write_cycle) > + __field(int, grant_write_bytes) > + __field(int, curr_cycle) > + __field(int, curr_block) > + __field(xfs_lsn_t, tail_lsn) > + ), > + TP_fast_assign( > + __entry->dev =3D log->l_mp->m_super->s_dev; > + __entry->trans_type =3D tic->t_trans_type; > + __entry->ocnt =3D tic->t_ocnt; > + __entry->cnt =3D tic->t_cnt; > + __entry->curr_res =3D tic->t_curr_res; > + __entry->unit_res =3D tic->t_unit_res; > + __entry->flags =3D tic->t_flags; > + __entry->reserve_headq =3D log->l_reserve_headq; > + __entry->write_headq =3D log->l_write_headq; > + __entry->grant_reserve_cycle =3D log->l_grant_reserve_cycle; > + __entry->grant_reserve_bytes =3D log->l_grant_reserve_bytes; > + __entry->grant_write_cycle =3D log->l_grant_write_cycle; > + __entry->grant_write_bytes =3D log->l_grant_write_bytes; > + __entry->curr_cycle =3D log->l_curr_cycle; > + __entry->curr_block =3D log->l_curr_block; > + __entry->tail_lsn =3D log->l_tail_lsn; > + ), > + TP_printk("dev %d:%d type %s t_ocnt %u t_cnt %u t_curr_res %u " > + "t_unit_res %u t_flags %s reserve_headq 0x%p " > + "write_headq 0x%p grant_reserve_cycle %d " > + "grant_reserve_bytes %d grant_write_cycle %d " > + "grant_write_bytes %d curr_cycle %d curr_block %d " > + "tail_cycle %d tail_block %d", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __print_symbolic(__entry->trans_type, XFS_TRANS_TYPES), > + __entry->ocnt, > + __entry->cnt, > + __entry->curr_res, > + __entry->unit_res, > + __print_flags(__entry->flags, "|", XLOG_TIC_FLAGS), > + __entry->reserve_headq, > + __entry->write_headq, > + __entry->grant_reserve_cycle, > + __entry->grant_reserve_bytes, > + __entry->grant_write_cycle, > + __entry->grant_write_bytes, > + __entry->curr_cycle, > + __entry->curr_block, > + CYCLE_LSN(__entry->tail_lsn), > + BLOCK_LSN(__entry->tail_lsn) > + ) > +) >=20 > -#define DEFINE_LOGGRANT_EVENT(tname) \ > -TRACE_EVENT(tname, \ > +#define DEFINE_LOGGRANT_EVENT(name) \ > +DEFINE_EVENT(xfs_loggrant_class, name, \ > TP_PROTO(struct log *log, struct xlog_ticket *tic), \ > - TP_ARGS(log, tic), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(unsigned, trans_type) \ > - __field(char, ocnt) \ > - __field(char, cnt) \ > - __field(int, curr_res) \ > - __field(int, unit_res) \ > - __field(unsigned int, flags) \ > - __field(void *, reserve_headq) \ > - __field(void *, write_headq) \ > - __field(int, grant_reserve_cycle) \ > - __field(int, grant_reserve_bytes) \ > - __field(int, grant_write_cycle) \ > - __field(int, grant_write_bytes) \ > - __field(int, curr_cycle) \ > - __field(int, curr_block) \ > - __field(xfs_lsn_t, tail_lsn) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D log->l_mp->m_super->s_dev; \ > - __entry->trans_type =3D tic->t_trans_type; \ > - __entry->ocnt =3D tic->t_ocnt; \ > - __entry->cnt =3D tic->t_cnt; \ > - __entry->curr_res =3D tic->t_curr_res; \ > - __entry->unit_res =3D tic->t_unit_res; \ > - __entry->flags =3D tic->t_flags; \ > - __entry->reserve_headq =3D log->l_reserve_headq; \ > - __entry->write_headq =3D log->l_write_headq; \ > - __entry->grant_reserve_cycle =3D log->l_grant_reserve_cycle; \ > - __entry->grant_reserve_bytes =3D log->l_grant_reserve_bytes; \ > - __entry->grant_write_cycle =3D log->l_grant_write_cycle; \ > - __entry->grant_write_bytes =3D log->l_grant_write_bytes; \ > - __entry->curr_cycle =3D log->l_curr_cycle; \ > - __entry->curr_block =3D log->l_curr_block; \ > - __entry->tail_lsn =3D log->l_tail_lsn; \ > - ), \ > - TP_printk("dev %d:%d type %s t_ocnt %u t_cnt %u t_curr_res %u " \ > - "t_unit_res %u t_flags %s reserve_headq 0x%p " \ > - "write_headq 0x%p grant_reserve_cycle %d " \ > - "grant_reserve_bytes %d grant_write_cycle %d " \ > - "grant_write_bytes %d curr_cycle %d curr_block %d " \ > - "tail_cycle %d tail_block %d", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - __print_symbolic(__entry->trans_type, XFS_TRANS_TYPES), \ > - __entry->ocnt, \ > - __entry->cnt, \ > - __entry->curr_res, \ > - __entry->unit_res, \ > - __print_flags(__entry->flags, "|", XLOG_TIC_FLAGS), \ > - __entry->reserve_headq, \ > - __entry->write_headq, \ > - __entry->grant_reserve_cycle, \ > - __entry->grant_reserve_bytes, \ > - __entry->grant_write_cycle, \ > - __entry->grant_write_bytes, \ > - __entry->curr_cycle, \ > - __entry->curr_block, \ > - CYCLE_LSN(__entry->tail_lsn), \ > - BLOCK_LSN(__entry->tail_lsn) \ > - ) \ > -) > + TP_ARGS(log, tic)) > DEFINE_LOGGRANT_EVENT(xfs_log_done_nonperm); > DEFINE_LOGGRANT_EVENT(xfs_log_done_perm); > DEFINE_LOGGRANT_EVENT(xfs_log_reserve); > @@ -701,169 +739,184 @@ DEFINE_LOGGRANT_EVENT(xfs_log_ungrant_en > DEFINE_LOGGRANT_EVENT(xfs_log_ungrant_exit); > DEFINE_LOGGRANT_EVENT(xfs_log_ungrant_sub); >=20 > +DECLARE_EVENT_CLASS(xfs_rw_class, > + TP_PROTO(struct xfs_inode *ip, size_t count, loff_t offset, int = flags), > + TP_ARGS(ip, count, offset, flags), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_ino_t, ino) > + __field(xfs_fsize_t, size) > + __field(xfs_fsize_t, new_size) > + __field(loff_t, offset) > + __field(size_t, count) > + __field(int, flags) > + ), > + TP_fast_assign( > + __entry->dev =3D VFS_I(ip)->i_sb->s_dev; > + __entry->ino =3D ip->i_ino; > + __entry->size =3D ip->i_d.di_size; > + __entry->new_size =3D ip->i_new_size; > + __entry->offset =3D offset; > + __entry->count =3D count; > + __entry->flags =3D flags; > + ), > + TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx " > + "offset 0x%llx count 0x%zx ioflags %s", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->ino, > + __entry->size, > + __entry->new_size, > + __entry->offset, > + __entry->count, > + __print_flags(__entry->flags, "|", XFS_IO_FLAGS)) > +) > + > #define DEFINE_RW_EVENT(name) \ > -TRACE_EVENT(name, \ > +DEFINE_EVENT(xfs_rw_class, name, \ > TP_PROTO(struct xfs_inode *ip, size_t count, loff_t offset, int = flags), \ > - TP_ARGS(ip, count, offset, flags), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_ino_t, ino) \ > - __field(xfs_fsize_t, size) \ > - __field(xfs_fsize_t, new_size) \ > - __field(loff_t, offset) \ > - __field(size_t, count) \ > - __field(int, flags) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D VFS_I(ip)->i_sb->s_dev; \ > - __entry->ino =3D ip->i_ino; \ > - __entry->size =3D ip->i_d.di_size; \ > - __entry->new_size =3D ip->i_new_size; \ > - __entry->offset =3D offset; \ > - __entry->count =3D count; \ > - __entry->flags =3D flags; \ > - ), \ > - TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx " \ > - "offset 0x%llx count 0x%zx ioflags %s", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - __entry->ino, \ > - __entry->size, \ > - __entry->new_size, \ > - __entry->offset, \ > - __entry->count, \ > - __print_flags(__entry->flags, "|", XFS_IO_FLAGS)) \ > -) > + TP_ARGS(ip, count, offset, flags)) > DEFINE_RW_EVENT(xfs_file_read); > DEFINE_RW_EVENT(xfs_file_buffered_write); > DEFINE_RW_EVENT(xfs_file_direct_write); > DEFINE_RW_EVENT(xfs_file_splice_read); > DEFINE_RW_EVENT(xfs_file_splice_write); >=20 > +DECLARE_EVENT_CLASS(xfs_page_class, > + TP_PROTO(struct inode *inode, struct page *page, unsigned long off), > + TP_ARGS(inode, page, off), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_ino_t, ino) > + __field(pgoff_t, pgoff) > + __field(loff_t, size) > + __field(unsigned long, offset) > + __field(int, delalloc) > + __field(int, unmapped) > + __field(int, unwritten) > + ), > + TP_fast_assign( > + int delalloc =3D -1, unmapped =3D -1, unwritten =3D -1; > + > + if (page_has_buffers(page)) > + xfs_count_page_state(page, &delalloc, > + &unmapped, &unwritten); > + __entry->dev =3D inode->i_sb->s_dev; > + __entry->ino =3D XFS_I(inode)->i_ino; > + __entry->pgoff =3D page_offset(page); > + __entry->size =3D i_size_read(inode); > + __entry->offset =3D off; > + __entry->delalloc =3D delalloc; > + __entry->unmapped =3D unmapped; > + __entry->unwritten =3D unwritten; > + ), > + TP_printk("dev %d:%d ino 0x%llx pgoff 0x%lx size 0x%llx offset %lx " > + "delalloc %d unmapped %d unwritten %d", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->ino, > + __entry->pgoff, > + __entry->size, > + __entry->offset, > + __entry->delalloc, > + __entry->unmapped, > + __entry->unwritten) > +) >=20 > #define DEFINE_PAGE_EVENT(name) \ > -TRACE_EVENT(name, \ > +DEFINE_EVENT(xfs_page_class, name, \ > TP_PROTO(struct inode *inode, struct page *page, unsigned long off), = \ > - TP_ARGS(inode, page, off), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_ino_t, ino) \ > - __field(pgoff_t, pgoff) \ > - __field(loff_t, size) \ > - __field(unsigned long, offset) \ > - __field(int, delalloc) \ > - __field(int, unmapped) \ > - __field(int, unwritten) \ > - ), \ > - TP_fast_assign( \ > - int delalloc =3D -1, unmapped =3D -1, unwritten =3D -1; \ > - \ > - if (page_has_buffers(page)) \ > - xfs_count_page_state(page, &delalloc, \ > - &unmapped, &unwritten); \ > - __entry->dev =3D inode->i_sb->s_dev; \ > - __entry->ino =3D XFS_I(inode)->i_ino; \ > - __entry->pgoff =3D page_offset(page); \ > - __entry->size =3D i_size_read(inode); \ > - __entry->offset =3D off; \ > - __entry->delalloc =3D delalloc; \ > - __entry->unmapped =3D unmapped; \ > - __entry->unwritten =3D unwritten; \ > - ), \ > - TP_printk("dev %d:%d ino 0x%llx pgoff 0x%lx size 0x%llx offset %lx " = \ > - "delalloc %d unmapped %d unwritten %d", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - __entry->ino, \ > - __entry->pgoff, \ > - __entry->size, \ > - __entry->offset, \ > - __entry->delalloc, \ > - __entry->unmapped, \ > - __entry->unwritten) \ > -) > + TP_ARGS(inode, page, off)) > DEFINE_PAGE_EVENT(xfs_writepage); > DEFINE_PAGE_EVENT(xfs_releasepage); > DEFINE_PAGE_EVENT(xfs_invalidatepage); >=20 > +DECLARE_EVENT_CLASS(xfs_iomap_class, > + TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count, > + int flags, struct xfs_bmbt_irec *irec), > + TP_ARGS(ip, offset, count, flags, irec), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_ino_t, ino) > + __field(loff_t, size) > + __field(loff_t, new_size) > + __field(loff_t, offset) > + __field(size_t, count) > + __field(int, flags) > + __field(xfs_fileoff_t, startoff) > + __field(xfs_fsblock_t, startblock) > + __field(xfs_filblks_t, blockcount) > + ), > + TP_fast_assign( > + __entry->dev =3D VFS_I(ip)->i_sb->s_dev; > + __entry->ino =3D ip->i_ino; > + __entry->size =3D ip->i_d.di_size; > + __entry->new_size =3D ip->i_new_size; > + __entry->offset =3D offset; > + __entry->count =3D count; > + __entry->flags =3D flags; > + __entry->startoff =3D irec ? irec->br_startoff : 0; > + __entry->startblock =3D irec ? irec->br_startblock : 0; > + __entry->blockcount =3D irec ? irec->br_blockcount : 0; > + ), > + TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx " > + "offset 0x%llx count %zd flags %s " > + "startoff 0x%llx startblock 0x%llx blockcount 0x%llx", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->ino, > + __entry->size, > + __entry->new_size, > + __entry->offset, > + __entry->count, > + __print_flags(__entry->flags, "|", BMAPI_FLAGS), > + __entry->startoff, > + __entry->startblock, > + __entry->blockcount) > +) > + > #define DEFINE_IOMAP_EVENT(name) \ > -TRACE_EVENT(name, \ > +DEFINE_EVENT(xfs_iomap_class, name, \ > TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count, \ > int flags, struct xfs_bmbt_irec *irec), \ > - TP_ARGS(ip, offset, count, flags, irec), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_ino_t, ino) \ > - __field(loff_t, size) \ > - __field(loff_t, new_size) \ > - __field(loff_t, offset) \ > - __field(size_t, count) \ > - __field(int, flags) \ > - __field(xfs_fileoff_t, startoff) \ > - __field(xfs_fsblock_t, startblock) \ > - __field(xfs_filblks_t, blockcount) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D VFS_I(ip)->i_sb->s_dev; \ > - __entry->ino =3D ip->i_ino; \ > - __entry->size =3D ip->i_d.di_size; \ > - __entry->new_size =3D ip->i_new_size; \ > - __entry->offset =3D offset; \ > - __entry->count =3D count; \ > - __entry->flags =3D flags; \ > - __entry->startoff =3D irec ? irec->br_startoff : 0; \ > - __entry->startblock =3D irec ? irec->br_startblock : 0; \ > - __entry->blockcount =3D irec ? irec->br_blockcount : 0; \ > - ), \ > - TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx " \ > - "offset 0x%llx count %zd flags %s " \ > - "startoff 0x%llx startblock 0x%llx blockcount 0x%llx", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - __entry->ino, \ > - __entry->size, \ > - __entry->new_size, \ > - __entry->offset, \ > - __entry->count, \ > - __print_flags(__entry->flags, "|", BMAPI_FLAGS), \ > - __entry->startoff, \ > - __entry->startblock, \ > - __entry->blockcount) \ > -) > + TP_ARGS(ip, offset, count, flags, irec)) > DEFINE_IOMAP_EVENT(xfs_iomap_enter); > DEFINE_IOMAP_EVENT(xfs_iomap_found); > DEFINE_IOMAP_EVENT(xfs_iomap_alloc); >=20 > +DECLARE_EVENT_CLASS(xfs_simple_io_class, > + TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count), > + TP_ARGS(ip, offset, count), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_ino_t, ino) > + __field(loff_t, size) > + __field(loff_t, new_size) > + __field(loff_t, offset) > + __field(size_t, count) > + ), > + TP_fast_assign( > + __entry->dev =3D VFS_I(ip)->i_sb->s_dev; > + __entry->ino =3D ip->i_ino; > + __entry->size =3D ip->i_d.di_size; > + __entry->new_size =3D ip->i_new_size; > + __entry->offset =3D offset; > + __entry->count =3D count; > + ), > + TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx " > + "offset 0x%llx count %zd", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->ino, > + __entry->size, > + __entry->new_size, > + __entry->offset, > + __entry->count) > +); > + > #define DEFINE_SIMPLE_IO_EVENT(name) \ > -TRACE_EVENT(name, \ > +DEFINE_EVENT(xfs_simple_io_class, name, \ > TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count), \ > - TP_ARGS(ip, offset, count), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_ino_t, ino) \ > - __field(loff_t, size) \ > - __field(loff_t, new_size) \ > - __field(loff_t, offset) \ > - __field(size_t, count) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D VFS_I(ip)->i_sb->s_dev; \ > - __entry->ino =3D ip->i_ino; \ > - __entry->size =3D ip->i_d.di_size; \ > - __entry->new_size =3D ip->i_new_size; \ > - __entry->offset =3D offset; \ > - __entry->count =3D count; \ > - ), \ > - TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx " \ > - "offset 0x%llx count %zd", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - __entry->ino, \ > - __entry->size, \ > - __entry->new_size, \ > - __entry->offset, \ > - __entry->count) \ > -); > + TP_ARGS(ip, offset, count)) > DEFINE_SIMPLE_IO_EVENT(xfs_delalloc_enospc); > DEFINE_SIMPLE_IO_EVENT(xfs_unwritten_convert); >=20 > - > TRACE_EVENT(xfs_itruncate_start, > TP_PROTO(struct xfs_inode *ip, xfs_fsize_t new_size, int flag, > xfs_off_t toss_start, xfs_off_t toss_finish), > @@ -897,28 +950,32 @@ TRACE_EVENT(xfs_itruncate_start, > __entry->toss_finish) > ); >=20 > +DECLARE_EVENT_CLASS(xfs_itrunc_class, > + TP_PROTO(struct xfs_inode *ip, xfs_fsize_t new_size), > + TP_ARGS(ip, new_size), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_ino_t, ino) > + __field(xfs_fsize_t, size) > + __field(xfs_fsize_t, new_size) > + ), > + TP_fast_assign( > + __entry->dev =3D VFS_I(ip)->i_sb->s_dev; > + __entry->ino =3D ip->i_ino; > + __entry->size =3D ip->i_d.di_size; > + __entry->new_size =3D new_size; > + ), > + TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->ino, > + __entry->size, > + __entry->new_size) > +) > + > #define DEFINE_ITRUNC_EVENT(name) \ > -TRACE_EVENT(name, \ > +DEFINE_EVENT(xfs_itrunc_class, name, \ > TP_PROTO(struct xfs_inode *ip, xfs_fsize_t new_size), \ > - TP_ARGS(ip, new_size), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_ino_t, ino) \ > - __field(xfs_fsize_t, size) \ > - __field(xfs_fsize_t, new_size) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D VFS_I(ip)->i_sb->s_dev; \ > - __entry->ino =3D ip->i_ino; \ > - __entry->size =3D ip->i_d.di_size; \ > - __entry->new_size =3D new_size; \ > - ), \ > - TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - __entry->ino, \ > - __entry->size, \ > - __entry->new_size) \ > -) > + TP_ARGS(ip, new_size)) > DEFINE_ITRUNC_EVENT(xfs_itruncate_finish_start); > DEFINE_ITRUNC_EVENT(xfs_itruncate_finish_end); >=20 > @@ -1152,77 +1209,80 @@ TRACE_EVENT(xfs_free_extent, >=20 > ); >=20 > -#define DEFINE_ALLOC_EVENT(name) \ > -TRACE_EVENT(name, \ > - TP_PROTO(struct xfs_alloc_arg *args), \ > - TP_ARGS(args), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_agnumber_t, agno) \ > - __field(xfs_agblock_t, agbno) \ > - __field(xfs_extlen_t, minlen) \ > - __field(xfs_extlen_t, maxlen) \ > - __field(xfs_extlen_t, mod) \ > - __field(xfs_extlen_t, prod) \ > - __field(xfs_extlen_t, minleft) \ > - __field(xfs_extlen_t, total) \ > - __field(xfs_extlen_t, alignment) \ > - __field(xfs_extlen_t, minalignslop) \ > - __field(xfs_extlen_t, len) \ > - __field(short, type) \ > - __field(short, otype) \ > - __field(char, wasdel) \ > - __field(char, wasfromfl) \ > - __field(char, isfl) \ > - __field(char, userdata) \ > - __field(xfs_fsblock_t, firstblock) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D args->mp->m_super->s_dev; \ > - __entry->agno =3D args->agno; \ > - __entry->agbno =3D args->agbno; \ > - __entry->minlen =3D args->minlen; \ > - __entry->maxlen =3D args->maxlen; \ > - __entry->mod =3D args->mod; \ > - __entry->prod =3D args->prod; \ > - __entry->minleft =3D args->minleft; \ > - __entry->total =3D args->total; \ > - __entry->alignment =3D args->alignment; \ > - __entry->minalignslop =3D args->minalignslop; \ > - __entry->len =3D args->len; \ > - __entry->type =3D args->type; \ > - __entry->otype =3D args->otype; \ > - __entry->wasdel =3D args->wasdel; \ > - __entry->wasfromfl =3D args->wasfromfl; \ > - __entry->isfl =3D args->isfl; \ > - __entry->userdata =3D args->userdata; \ > - __entry->firstblock =3D args->firstblock; \ > - ), \ > - TP_printk("dev %d:%d agno %u agbno %u minlen %u maxlen %u mod %u " \ > - "prod %u minleft %u total %u alignment %u minalignslop %u " \ > - "len %u type %s otype %s wasdel %d wasfromfl %d isfl %d " \ > - "userdata %d firstblock 0x%llx", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - __entry->agno, \ > - __entry->agbno, \ > - __entry->minlen, \ > - __entry->maxlen, \ > - __entry->mod, \ > - __entry->prod, \ > - __entry->minleft, \ > - __entry->total, \ > - __entry->alignment, \ > - __entry->minalignslop, \ > - __entry->len, \ > - __print_symbolic(__entry->type, XFS_ALLOC_TYPES), \ > - __print_symbolic(__entry->otype, XFS_ALLOC_TYPES), \ > - __entry->wasdel, \ > - __entry->wasfromfl, \ > - __entry->isfl, \ > - __entry->userdata, \ > - __entry->firstblock) \ > +DECLARE_EVENT_CLASS(xfs_alloc_class, > + TP_PROTO(struct xfs_alloc_arg *args), > + TP_ARGS(args), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_agnumber_t, agno) > + __field(xfs_agblock_t, agbno) > + __field(xfs_extlen_t, minlen) > + __field(xfs_extlen_t, maxlen) > + __field(xfs_extlen_t, mod) > + __field(xfs_extlen_t, prod) > + __field(xfs_extlen_t, minleft) > + __field(xfs_extlen_t, total) > + __field(xfs_extlen_t, alignment) > + __field(xfs_extlen_t, minalignslop) > + __field(xfs_extlen_t, len) > + __field(short, type) > + __field(short, otype) > + __field(char, wasdel) > + __field(char, wasfromfl) > + __field(char, isfl) > + __field(char, userdata) > + __field(xfs_fsblock_t, firstblock) > + ), > + TP_fast_assign( > + __entry->dev =3D args->mp->m_super->s_dev; > + __entry->agno =3D args->agno; > + __entry->agbno =3D args->agbno; > + __entry->minlen =3D args->minlen; > + __entry->maxlen =3D args->maxlen; > + __entry->mod =3D args->mod; > + __entry->prod =3D args->prod; > + __entry->minleft =3D args->minleft; > + __entry->total =3D args->total; > + __entry->alignment =3D args->alignment; > + __entry->minalignslop =3D args->minalignslop; > + __entry->len =3D args->len; > + __entry->type =3D args->type; > + __entry->otype =3D args->otype; > + __entry->wasdel =3D args->wasdel; > + __entry->wasfromfl =3D args->wasfromfl; > + __entry->isfl =3D args->isfl; > + __entry->userdata =3D args->userdata; > + __entry->firstblock =3D args->firstblock; > + ), > + TP_printk("dev %d:%d agno %u agbno %u minlen %u maxlen %u mod %u " > + "prod %u minleft %u total %u alignment %u minalignslop %u " > + "len %u type %s otype %s wasdel %d wasfromfl %d isfl %d " > + "userdata %d firstblock 0x%llx", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->agno, > + __entry->agbno, > + __entry->minlen, > + __entry->maxlen, > + __entry->mod, > + __entry->prod, > + __entry->minleft, > + __entry->total, > + __entry->alignment, > + __entry->minalignslop, > + __entry->len, > + __print_symbolic(__entry->type, XFS_ALLOC_TYPES), > + __print_symbolic(__entry->otype, XFS_ALLOC_TYPES), > + __entry->wasdel, > + __entry->wasfromfl, > + __entry->isfl, > + __entry->userdata, > + __entry->firstblock) > ) >=20 > +#define DEFINE_ALLOC_EVENT(name) \ > +DEFINE_EVENT(xfs_alloc_class, name, \ > + TP_PROTO(struct xfs_alloc_arg *args), \ > + TP_ARGS(args)) > DEFINE_ALLOC_EVENT(xfs_alloc_exact_done); > DEFINE_ALLOC_EVENT(xfs_alloc_exact_error); > DEFINE_ALLOC_EVENT(xfs_alloc_near_nominleft); > @@ -1245,92 +1305,100 @@ DEFINE_ALLOC_EVENT(xfs_alloc_vextent_noa > DEFINE_ALLOC_EVENT(xfs_alloc_vextent_loopfailed); > DEFINE_ALLOC_EVENT(xfs_alloc_vextent_allfailed); >=20 > -#define DEFINE_DIR2_TRACE(tname) \ > -TRACE_EVENT(tname, \ > +DECLARE_EVENT_CLASS(xfs_dir2_class, > + TP_PROTO(struct xfs_da_args *args), > + TP_ARGS(args), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_ino_t, ino) > + __dynamic_array(char, name, args->namelen) > + __field(int, namelen) > + __field(xfs_dahash_t, hashval) > + __field(xfs_ino_t, inumber) > + __field(int, op_flags) > + ), > + TP_fast_assign( > + __entry->dev =3D VFS_I(args->dp)->i_sb->s_dev; > + __entry->ino =3D args->dp->i_ino; > + if (args->namelen) > + memcpy(__get_str(name), args->name, args->namelen); > + __entry->namelen =3D args->namelen; > + __entry->hashval =3D args->hashval; > + __entry->inumber =3D args->inumber; > + __entry->op_flags =3D args->op_flags; > + ), > + TP_printk("dev %d:%d ino 0x%llx name %.*s namelen %d hashval 0x%x " > + "inumber 0x%llx op_flags %s", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->ino, > + __entry->namelen, > + __entry->namelen ? __get_str(name) : NULL, > + __entry->namelen, > + __entry->hashval, > + __entry->inumber, > + __print_flags(__entry->op_flags, "|", XFS_DA_OP_FLAGS)) > +) > + > +#define DEFINE_DIR2_EVENT(name) \ > +DEFINE_EVENT(xfs_dir2_class, name, \ > TP_PROTO(struct xfs_da_args *args), \ > - TP_ARGS(args), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_ino_t, ino) \ > - __dynamic_array(char, name, args->namelen) \ > - __field(int, namelen) \ > - __field(xfs_dahash_t, hashval) \ > - __field(xfs_ino_t, inumber) \ > - __field(int, op_flags) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D VFS_I(args->dp)->i_sb->s_dev; \ > - __entry->ino =3D args->dp->i_ino; \ > - if (args->namelen) \ > - memcpy(__get_str(name), args->name, args->namelen); \ > - __entry->namelen =3D args->namelen; \ > - __entry->hashval =3D args->hashval; \ > - __entry->inumber =3D args->inumber; \ > - __entry->op_flags =3D args->op_flags; \ > - ), \ > - TP_printk("dev %d:%d ino 0x%llx name %.*s namelen %d hashval 0x%x " = \ > - "inumber 0x%llx op_flags %s", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - __entry->ino, \ > - __entry->namelen, \ > - __entry->namelen ? __get_str(name) : NULL, \ > - __entry->namelen, \ > - __entry->hashval, \ > - __entry->inumber, \ > - __print_flags(__entry->op_flags, "|", XFS_DA_OP_FLAGS)) \ > + TP_ARGS(args)) > +DEFINE_DIR2_EVENT(xfs_dir2_sf_addname); > +DEFINE_DIR2_EVENT(xfs_dir2_sf_create); > +DEFINE_DIR2_EVENT(xfs_dir2_sf_lookup); > +DEFINE_DIR2_EVENT(xfs_dir2_sf_replace); > +DEFINE_DIR2_EVENT(xfs_dir2_sf_removename); > +DEFINE_DIR2_EVENT(xfs_dir2_sf_toino4); > +DEFINE_DIR2_EVENT(xfs_dir2_sf_toino8); > +DEFINE_DIR2_EVENT(xfs_dir2_sf_to_block); > +DEFINE_DIR2_EVENT(xfs_dir2_block_addname); > +DEFINE_DIR2_EVENT(xfs_dir2_block_lookup); > +DEFINE_DIR2_EVENT(xfs_dir2_block_replace); > +DEFINE_DIR2_EVENT(xfs_dir2_block_removename); > +DEFINE_DIR2_EVENT(xfs_dir2_block_to_sf); > +DEFINE_DIR2_EVENT(xfs_dir2_block_to_leaf); > +DEFINE_DIR2_EVENT(xfs_dir2_leaf_addname); > +DEFINE_DIR2_EVENT(xfs_dir2_leaf_lookup); > +DEFINE_DIR2_EVENT(xfs_dir2_leaf_replace); > +DEFINE_DIR2_EVENT(xfs_dir2_leaf_removename); > +DEFINE_DIR2_EVENT(xfs_dir2_leaf_to_block); > +DEFINE_DIR2_EVENT(xfs_dir2_leaf_to_node); > +DEFINE_DIR2_EVENT(xfs_dir2_node_addname); > +DEFINE_DIR2_EVENT(xfs_dir2_node_lookup); > +DEFINE_DIR2_EVENT(xfs_dir2_node_replace); > +DEFINE_DIR2_EVENT(xfs_dir2_node_removename); > +DEFINE_DIR2_EVENT(xfs_dir2_node_to_leaf); > + > +DECLARE_EVENT_CLASS(xfs_dir2_space_class, > + TP_PROTO(struct xfs_da_args *args, int idx), > + TP_ARGS(args, idx), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_ino_t, ino) > + __field(int, op_flags) > + __field(int, idx) > + ), > + TP_fast_assign( > + __entry->dev =3D VFS_I(args->dp)->i_sb->s_dev; > + __entry->ino =3D args->dp->i_ino; > + __entry->op_flags =3D args->op_flags; > + __entry->idx =3D idx; > + ), > + TP_printk("dev %d:%d ino 0x%llx op_flags %s index %d", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->ino, > + __print_flags(__entry->op_flags, "|", XFS_DA_OP_FLAGS), > + __entry->idx) > ) > -DEFINE_DIR2_TRACE(xfs_dir2_sf_addname); > -DEFINE_DIR2_TRACE(xfs_dir2_sf_create); > -DEFINE_DIR2_TRACE(xfs_dir2_sf_lookup); > -DEFINE_DIR2_TRACE(xfs_dir2_sf_replace); > -DEFINE_DIR2_TRACE(xfs_dir2_sf_removename); > -DEFINE_DIR2_TRACE(xfs_dir2_sf_toino4); > -DEFINE_DIR2_TRACE(xfs_dir2_sf_toino8); > -DEFINE_DIR2_TRACE(xfs_dir2_sf_to_block); > -DEFINE_DIR2_TRACE(xfs_dir2_block_addname); > -DEFINE_DIR2_TRACE(xfs_dir2_block_lookup); > -DEFINE_DIR2_TRACE(xfs_dir2_block_replace); > -DEFINE_DIR2_TRACE(xfs_dir2_block_removename); > -DEFINE_DIR2_TRACE(xfs_dir2_block_to_sf); > -DEFINE_DIR2_TRACE(xfs_dir2_block_to_leaf); > -DEFINE_DIR2_TRACE(xfs_dir2_leaf_addname); > -DEFINE_DIR2_TRACE(xfs_dir2_leaf_lookup); > -DEFINE_DIR2_TRACE(xfs_dir2_leaf_replace); > -DEFINE_DIR2_TRACE(xfs_dir2_leaf_removename); > -DEFINE_DIR2_TRACE(xfs_dir2_leaf_to_block); > -DEFINE_DIR2_TRACE(xfs_dir2_leaf_to_node); > -DEFINE_DIR2_TRACE(xfs_dir2_node_addname); > -DEFINE_DIR2_TRACE(xfs_dir2_node_lookup); > -DEFINE_DIR2_TRACE(xfs_dir2_node_replace); > -DEFINE_DIR2_TRACE(xfs_dir2_node_removename); > -DEFINE_DIR2_TRACE(xfs_dir2_node_to_leaf); >=20 > -#define DEFINE_DIR2_SPACE_TRACE(tname) \ > -TRACE_EVENT(tname, \ > +#define DEFINE_DIR2_SPACE_EVENT(name) \ > +DEFINE_EVENT(xfs_dir2_space_class, name, \ > TP_PROTO(struct xfs_da_args *args, int idx), \ > - TP_ARGS(args, idx), \ > - TP_STRUCT__entry( \ > - __field(dev_t, dev) \ > - __field(xfs_ino_t, ino) \ > - __field(int, op_flags) \ > - __field(int, idx) \ > - ), \ > - TP_fast_assign( \ > - __entry->dev =3D VFS_I(args->dp)->i_sb->s_dev; \ > - __entry->ino =3D args->dp->i_ino; \ > - __entry->op_flags =3D args->op_flags; \ > - __entry->idx =3D idx; \ > - ), \ > - TP_printk("dev %d:%d ino 0x%llx op_flags %s index %d", \ > - MAJOR(__entry->dev), MINOR(__entry->dev), \ > - __entry->ino, \ > - __print_flags(__entry->op_flags, "|", XFS_DA_OP_FLAGS), \ > - __entry->idx) \ > -) > -DEFINE_DIR2_SPACE_TRACE(xfs_dir2_leafn_add); > -DEFINE_DIR2_SPACE_TRACE(xfs_dir2_leafn_remove); > -DEFINE_DIR2_SPACE_TRACE(xfs_dir2_grow_inode); > -DEFINE_DIR2_SPACE_TRACE(xfs_dir2_shrink_inode); > + TP_ARGS(args, idx)) > +DEFINE_DIR2_SPACE_EVENT(xfs_dir2_leafn_add); > +DEFINE_DIR2_SPACE_EVENT(xfs_dir2_leafn_remove); > +DEFINE_DIR2_SPACE_EVENT(xfs_dir2_grow_inode); > +DEFINE_DIR2_SPACE_EVENT(xfs_dir2_shrink_inode); >=20 > TRACE_EVENT(xfs_dir2_leafn_moveents, > TP_PROTO(struct xfs_da_args *args, int src_idx, int dst_idx, int = count), >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From aelder@sgi.com Fri Jan 8 17:15:00 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o08NExgp082508 for ; Fri, 8 Jan 2010 17:14:59 -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 3217B304082; Fri, 8 Jan 2010 15:15:48 -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="iso-8859-1" Content-Transfer-Encoding: quoted-printable Subject: [PATCH v2] xfs: Don't flush stale inodes Date: Fri, 8 Jan 2010 17:14:25 -0600 Message-ID: <1AB9A794DBDDF54A8A81BE2296F7BDFE012A693A@cf--amer001e--3.americas.sgi.com> In-Reply-To: <1262399980-19277-1-git-send-email-david@fromorbit.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH] XFS: Don't flush stale inodes Thread-Index: AcqLV7bI0nnFfSqfTh2fVEXLp9a9CwFXuZbQ From: "Alex Elder" To: "Dave Chinner" Cc: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave Chinner wrote: > Because inodes remain in cache much longer than inode buffers do > under memory pressure, we can get the situation where we have stale, > dirty inodes being reclaimed but the backing storage has been freed. > Hence we should never, ever flush XFS_ISTALE inodes to disk as > there is no guarantee that the backing buffer is in cache and > still marked stale when the flush occurs. > > Signed-off-by: Dave Chinner Dave, I'm putting this patch in before your perag radix tree patch series, so I had to port it. I am submitting here on your behalf, but would like you to review it if possible. It builds fine, and I've run it through a quick test. I will retain all of your original commentary, etc. I did *not* implement Christoph's recommendation that you change the "for" loop in xfs_alloc_search_busy() to a more typical form. For reference, the original patch is here: http://patchwork.xfs.org/patch/382/ Signed-off-by: Alex Elder --- fs/xfs/linux-2.6/xfs_trace.h | 9 +++++--- fs/xfs/xfs_alloc.c | 44 = ++++++++++++++++++++----------------------- 2 files changed, 27 insertions(+), 26 deletions(-) Index: b/fs/xfs/linux-2.6/xfs_trace.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -1079,14 +1079,15 @@ TRACE_EVENT(xfs_alloc_unbusy, =20 TRACE_EVENT(xfs_alloc_busysearch, TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t = agbno, - xfs_extlen_t len, int found), - TP_ARGS(mp, agno, agbno, len, found), + xfs_extlen_t len, int found, xfs_lsn_t lsn), + TP_ARGS(mp, agno, agbno, len, found, lsn), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_agnumber_t, agno) __field(xfs_agblock_t, agbno) __field(xfs_extlen_t, len) __field(int, found) + __field(xfs_lsn_t, lsn) ), TP_fast_assign( __entry->dev =3D mp->m_super->s_dev; @@ -1094,12 +1095,14 @@ TRACE_EVENT(xfs_alloc_busysearch, __entry->agbno =3D agbno; __entry->len =3D len; __entry->found =3D found; + __entry->lsn =3D lsn; ), - TP_printk("dev %d:%d agno %u agbno %u len %u %s", + TP_printk("dev %d:%d agno %u agbno %u len %u force lsn 0x%llx %s", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, __entry->agbno, __entry->len, + __entry->lsn, __print_symbolic(__entry->found, XFS_BUSY_STATES)) ); =20 Index: b/fs/xfs/xfs_alloc.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -2563,7 +2563,7 @@ xfs_alloc_search_busy(xfs_trans_t *tp, xfs_mount_t *mp; xfs_perag_busy_t *bsy; xfs_agblock_t uend, bend; - xfs_lsn_t lsn; + xfs_lsn_t lsn =3D 0; int cnt; =20 mp =3D tp->t_mountp; @@ -2573,33 +2573,31 @@ xfs_alloc_search_busy(xfs_trans_t *tp, =20 uend =3D bno + len - 1; =20 - /* search pagb_list for this slot, skipping open slots */ - for (bsy =3D mp->m_perag[agno].pagb_list; cnt; bsy++) { - - /* - * (start1,length1) within (start2, length2) - */ - if (bsy->busy_tp !=3D NULL) { - bend =3D bsy->busy_start + bsy->busy_length - 1; - if ((bno > bend) || (uend < bsy->busy_start)) { - cnt--; - } else { - break; - } - } + /* + * search pagb_list for this slot, skipping open slots. We have to + * search the entire array as there may be multiple overlaps and + * we have to get the most recent LSN for the log force to push out + * all the transactions that span the range. + */ + for (bsy =3D mp->m_perag[agno].pagb_list; cnt; bsy++, cnt--) { + if (!bsy->busy_tp) + continue; + + bend =3D bsy->busy_start + bsy->busy_length - 1; + if ((bno > bend) || (uend < bsy->busy_start)) + continue; + + /* (start1,length1) within (start2, length2) */ + if (XFS_LSN_CMP(bsy->busy_tp->t_commit_lsn, lsn) > 0) + lsn =3D bsy->busy_tp->t_commit_lsn; } - - trace_xfs_alloc_busysearch(mp, agno, bno, len, !!cnt); + spin_unlock(&mp->m_perag[agno].pagb_lock); + trace_xfs_alloc_busysearch(tp->t_mountp, agno, bno, len, !!cnt, lsn); =20 /* * If a block was found, force the log through the LSN of the * transaction that freed the block */ - if (cnt) { - lsn =3D bsy->busy_tp->t_commit_lsn; - spin_unlock(&mp->m_perag[agno].pagb_lock); + if (lsn) xfs_log_force(mp, lsn, XFS_LOG_FORCE|XFS_LOG_SYNC); - } else { - spin_unlock(&mp->m_perag[agno].pagb_lock); - } } From SRS0+OI6W+38+fromorbit.com=david@internode.on.net Fri Jan 8 18:08:41 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=AWL,BAYES_00, FH_DATE_PAST_20XX autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o0908d38085735 for ; Fri, 8 Jan 2010 18:08:40 -0600 X-ASG-Debug-ID: 1262995770-361f037d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 808E4EE3337 for ; Fri, 8 Jan 2010 16:09:31 -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 gA0JtgCjSp4nCvfv for ; Fri, 08 Jan 2010 16:09:31 -0800 (PST) Received: from discord (unverified [121.44.238.220]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 11140149-1927428 for multiple; Sat, 09 Jan 2010 10:39:29 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1NTOtT-0003Vu-Og; Sat, 09 Jan 2010 11:09:27 +1100 Date: Sat, 9 Jan 2010 11:09:27 +1100 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v2] xfs: Don't flush stale inodes Subject: Re: [PATCH v2] xfs: Don't flush stale inodes Message-ID: <20100109000927.GE8654@discord.disaster> References: <1262399980-19277-1-git-send-email-david@fromorbit.com> <1AB9A794DBDDF54A8A81BE2296F7BDFE012A693A@cf--amer001e--3.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1AB9A794DBDDF54A8A81BE2296F7BDFE012A693A@cf--amer001e--3.americas.sgi.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1262995772 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19310 Rule breakdown below pts rule 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 08, 2010 at 05:14:25PM -0600, Alex Elder wrote: > Dave Chinner wrote: > > Because inodes remain in cache much longer than inode buffers do > > under memory pressure, we can get the situation where we have stale, > > dirty inodes being reclaimed but the backing storage has been freed. > > Hence we should never, ever flush XFS_ISTALE inodes to disk as > > there is no guarantee that the backing buffer is in cache and > > still marked stale when the flush occurs. > > > > Signed-off-by: Dave Chinner > > Dave, I'm putting this patch in before your perag radix tree > patch series, so I had to port it. I am submitting here on > your behalf, but would like you to review it if possible. > It builds fine, and I've run it through a quick test. > I will retain all of your original commentary, etc. I did > *not* implement Christoph's recommendation that you change > the "for" loop in xfs_alloc_search_busy() to a more typical > form. > > For reference, the original patch is here: > http://patchwork.xfs.org/patch/382/ > > Signed-off-by: Alex Elder Ah, which patch are you talking about? The title says stale inodes, the patch is searching busy extents. Assuming you meant the busy extent search fix, you've ported the wrong version of the busy extent search fix. I posted an updated version after Christoph reviewed that one (in my response to Christoph's review). Because it was a new patch, patchwork doesn't add the email to the original thread - it starts a new one. It's a real PITA, IMO, but that is the way patchwork does stuff. The patch that should be checked in is this one: http://patchwork.xfs.org/patch/387/ Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Fri Jan 8 20:23:09 2010 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=AWL,BAYES_00,FH_DATE_PAST_20XX, J_CHICKENPOX_210 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o092N8Wo093905 for ; Fri, 8 Jan 2010 20:23:09 -0600 X-ASG-Debug-ID: 1263003840-147e02a10000-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 27985EE92DC for ; Fri, 8 Jan 2010 18:24:01 -0800 (PST) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id ss04ESdU94DNH2EW for ; Fri, 08 Jan 2010 18:24:01 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 76FB28E0505; Fri, 8 Jan 2010 20:24:00 -0600 (CST) Message-ID: <4B47E8C0.2040809@sandeen.net> Date: Fri, 08 Jan 2010 20:24:00 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Christoph Hellwig CC: Eric Sandeen , xfs-oss X-ASG-Orig-Subj: Re: [PATCH V2] mkfs: handle 4k sector devices more cleanly Subject: Re: [PATCH V2] mkfs: handle 4k sector devices more cleanly References: <4B1E9A25.50108@redhat.com> <4B476171.4020701@sandeen.net> <20100108174400.GA17634@infradead.org> In-Reply-To: <20100108174400.GA17634@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1263003842 X-Barracuda-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.19317 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 Christoph Hellwig wrote: > On Fri, Jan 08, 2010 at 10:46:41AM -0600, Eric Sandeen wrote: >> +extern void platform_findsizes (char *path, int fd, long long *sz, int *bsz); > > Can you move the prototype from libxfs/init.h to include/libxfs.h > instead of adding it to the .c file? actually it seems a little out of place in libxfs/init.h; that probably works but there are no other platform_* functions there... Should this be more like an xfs_findsizes in libxfs, which calls platform_findsizes internally just for consistency? *shrug* >> + /* >> + * MD wants sector size set == block size to avoid switching. >> + * Otherwise, if not specfied via command, use device sectorsize >> + */ >> + if (ft.sectoralign || !ssflag) { >> + if (ft.sectoralign) >> + sectorsize = blocksize; >> + else >> + sectorsize = ft.sectorsize; > > This still confuses the heck out of me. What do you think about the > incremental patch at the end of the mail? > >> if (slflag || ssflag) >> xi.setblksize = sectorsize; >> - else >> - xi.setblksize = 1; > > So for the defaul case we now never set the sector size in the libxfs > init. This seems safe to me, but why did we do it before? Could > a previous user have left it set to a wrong value? ok so I read this wrong on my previous reply I guess. The only way this is used is: it's sent to libxfs_init and then from there only to libxfs_open which does: if (!readonly && setblksize && (statb.st_mode & S_IFMT) == S_IFBLK) { if (setblksize == 1) /* use the default blocksize */ (void)platform_set_blocksize(fd, path, statb.st_rdev, XFS_MIN_SECTORSIZE, 0); else { /* given an explicit blocksize to use */ if (platform_set_blocksize(fd, path, statb.st_rdev, setblksize, 1)) exit(1); } } so "1" seems to have the special meaning of "use XFS_MIN_SECTORSIZE" Hm, ok but in my patch setblksize is 0, so it's not getting set. I suppose this -might- mess up other utils ... > Maye we should just do the xi.setblksize = sectorsize unconditionally? I think that's best. It's already defaulted to XFS_MIN_SECTORSIZE so should be no functional change if it doesn't get otherwise set - although I think it -does- get set in all cases now - either from ft.sectoralign/blocksize, from the explicit -s setting, or the ft.sectorsize by default. What do you think about removing the "1" magic if so? At that point I think nothing relies on it. Thanks, -Eric From onur.yuksel@pashainternational.com Sat Jan 9 06:34:32 2010 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o09CYUG9147059 for ; Sat, 9 Jan 2010 06:34:32 -0600 X-ASG-Debug-ID: 1263040342-67b302df0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.pashainternational.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 44AB2155238 for ; Sat, 9 Jan 2010 04:32:23 -0800 (PST) Received: from mail.pashainternational.com (cpe-212-175-252-252.ari.net.tr [212.175.252.252]) by cuda.sgi.com with ESMTP id IjOCuU3lsLvVDFag for ; Sat, 09 Jan 2010 04:32:23 -0800 (PST) Received: from tel43d7a70afe3 ([212.175.49.14]) by mail.pashainternational.com (Pasha Gaming Mail Server) with ASMTP id RLC66222; Sat, 09 Jan 2010 11:45:22 +0100 From: "M. Onur Yuksel" To: X-ASG-Orig-Subj: Golden Tulip Nicosia Hotel & Casino Subject: Golden Tulip Nicosia Hotel & Casino Date: Sat, 9 Jan 2010 12:44:32 +0200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_00D5_01CA9129.9BE8EAA0" X-Mailer: Microsoft Office Outlook, Build 11.0.5510 Thread-Index: Acp/AxzKR25mEcisQ1KDPAOUy5u8kgBmOm+AAAAIumAA/GE+IAAAE8QgAACevVAAAEr2sABeY+lgAsCrT6AAAVuggAABV7fA X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579 Message-ID: 8dd91ef68a6d9b3f7e2093ab249c9baa X-Barracuda-Connect: cpe-212-175-252-252.ari.net.tr[212.175.252.252] X-Barracuda-Start-Time: 1263040524 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_00D5_01CA9129.9BE8EAA0 Content-Type: multipart/related; boundary="----=_NextPart_001_00D6_01CA9129.9BE8EAA0" ------=_NextPart_001_00D6_01CA9129.9BE8EAA0 Content-Type: multipart/alternative; boundary="----=_NextPart_002_00D7_01CA9129.9BE8EAA0" ------=_NextPart_002_00D7_01CA9129.9BE8EAA0 Content-Type: text/plain; charset="iso-8859-9" Content-Transfer-Encoding: quoted-printable Sn. Yetkili ;=20 =20 =D6ncelikle Golden Tulip Nicosia Hotel olarak g=FCzel g=FCnler dileriz.=20 =20 Kuzey K=FDbr=FDs Lefko=FEa'n=FDn en prestijli caddesi Dereboyu'nda, = Lefko=FEa'n=FDn ilk uluslararas=FD zincir oteli olan Golden Tulip Nicosia, odalarda sabun- = =FEampuan Azzaro Paris, genel mekanlarda Thierry Mugler =FCr=FCnler, pe=E7eteler = Mank - Almanya , =C7ok =F6zel sofra aksesuarlar=FD, bak=FDml=FD, ho=FE = tav=FDrl=FD =E7al=FD=FEma ekibi ile size ve konuklar=FDn=FDza zevk ve konfor'u ya=FEatmaktan mutluluk = duyacakt=FDr. =20 Konaklama fiyatlar=FDm=FDz i=E7in l=FCtfen irtibata ge=E7iniz. =20 =20 =20 =20 =20 No virus found in this incoming message. Checked by AVG - www.avg.com Version: 8.5.430 / Virus Database: 270.14.118/2584 - Release Date: = 12/23/09 19:02:00 ------=_NextPart_002_00D7_01CA9129.9BE8EAA0 Content-Type: text/html; charset="iso-8859-9" Content-Transfer-Encoding: quoted-printable

Sn. = Yetkili  ;

&nbs= p;

=D6ncelikle Golden Tulip Nicosia Hotel = olarak g=FCzel g=FCnler dileriz.

 

Kuzey K=FDbr=FDs Lefko=FEa’n=FDn en prestijli = caddesi Dereboyu’nda, Lefko=FEa’n=FDn  ilk uluslararas=FD = zincir oteli olan Golden Tulip Nicosia, odalarda sabun- =FEampuan Azzaro Paris, genel = mekanlarda Thierry Mugler =FCr=FCnler, pe=E7eteler Mank – Almanya , =C7ok = =F6zel sofra aksesuarlar=FD, bak=FDml=FD, ho=FE tav=FDrl=FD =E7al=FD=FEma ekibi ile =  size ve konuklar=FDn=FDza zevk ve konfor’u ya=FEatmaktan mutluluk = duyacakt=FDr.

 

Konaklama fiyatlar=FDm=FDz i=E7in l=FCtfen = irtibata ge=E7iniz.  

 

 

 

 

No virus found in this incoming = message.
Checked by AVG - www.avg.com
Version: 8.5.430 / Virus Database: 270.14.118/2584 - Release Date: = 12/23/09 19:02:00

------=_NextPart_002_00D7_01CA9129.9BE8EAA0-- ------=_NextPart_001_00D6_01CA9129.9BE8EAA0 Content-Type: image/jpeg; name="image001.jpg" Content-Transfer-Encoding: base64 Content-ID: /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCACIAlgDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2Wiim o6PnY4bHXBzigB1FU3u38t5l8uOFCQZJOc444A965e+17UXv90U0cVtZOGmAyu9u0XfLHIzjpwOS eLjByJckjtKha7tkYq08QI6gsMiueEmrzg3GqWNyISuRDbXCKFH+1kqSfxxVyx1K5W1RI9EvN2Dj IjjBHbPzemO1NwsHMbKSJIoaNlZT3U5FOrGbUDYwyXdwkfmzyCKO1gbcWk54z/e9fQD2q5HHqJaK SWeJTn95EqZXHoD1z7/pUuNh3LtFNZlRSzEKoGSSelZsF/dalC1xYRxpb4/dSTg/vvcAdFPY/p6p K4XNSimRlyilwA2PmAOcGn0hhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRTFdWZlVgSn3gD0+tPo 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 Vqf/AEDIv/An/wCxrmtev/EUMGnPH9ojmNqHmit4Sd03HyhgrDPX5Tge9arahf2+sXsssFw9pDp6 SpGsecyZbcowOW6cc0cml9A5tTQ+1an/ANAyL/wJ/wDsaPtWp/8AQMi/8Cf/ALGsvwpe61Ktxa65 bypcLtmjdkABVhyoK8fKQR64xVXxHeeI4L7UF0pGaFLBXQ7DxJubOzCnc2McGhQ97l0Dn0ub32rU /wDoGRf+BP8A9jR9q1P/AKBkX/gT/wDY1ga/e6xDeOsUl9Cgsw9p9mt/ME0/OVf5Tjtxx1PpVnUY tYlvdG2Xd1bi4+W8SBVZIyELZyVOPmwOtHItNg5jW+06n/0DYv8AwK/+xo+1an/0DIv/AAJ/+xrA uLzVh42kgaW6SxEkPlqsbbGBX5uQhHXrlhWho+qXDarqFjfLc7/tb/Zy1uwTytoI+fGOu7vQ4WV7 Apa2L/2rU/8AoGRf+BP/ANjR9q1P/oGRf+BP/wBjWV4zvdXtLO2XSEm82SQlnij34AHC4weSSMdB xgkZra0+6e802G5MTxvJGGMcgwVPofxqWrRUrFX1sRfatT/6BkX/AIE//Y01pdQcgvpUDEdCbgHH /jtYvh+91OS7jOoS6gZykhu4XtQsEJB+UK2AenTG7PXik0PVddmv7s6hZ3MdvdRvNZ7oh+6wcBOO 5Xafmxzmq5LX20J59jd+1an/ANAyL/wJ/wDsaPtWp/8AQMi/8Cf/ALGuW0rUPEDabq3mm8lnjsy8 MjQ4/e4PygFAd3T5fmHvUusX/iW3aKSxjmlRdL3zRiLJMp4yOPvAkHb6A0/Za20Fz6XOrtZbuQsL m2SED7pWXfn9BVmuP1W81eMWgaW+giaw3h7W38xnuf7rDacD247810umPdSaZavfII7poVMyjoHx yPzrOUbK5ald2LdFFFQUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA f//Z ------=_NextPart_001_00D6_01CA9129.9BE8EAA0-- ------=_NextPart_000_00D5_01CA9129.9BE8EAA0 Content-Type: application/msword; name="Golden Tulip Nicosia Hotel-Fact Sheet.doc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Golden Tulip Nicosia Hotel-Fact Sheet.doc" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAACAAAAfgAAAAAAAAAA EAAAfAAAAAEAAAD+////AAAAAH8AAACAAAAA//////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////s pcEAcWAfBAAA+BK/AAAAAAAAEAAAAAAABgAAbC0AAA4AYmpianFQcVAAAAAAAAAAAAAAAAAAAAAA AAAfBBYACnIAABM6AQATOgEAtgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA AAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAAKQAAAAAAJIEAAAAAAAAkgQAAJIE AAAAAAAAkgQAAAAAAACSBAAAAAAAAJIEAAAAAAAAkgQAABQAAAAAAAAAAAAAAKYEAAAAAAAAjhgA AAAAAACOGAAAAAAAAI4YAAAAAAAAjhgAADQAAADCGAAAPAAAAKYEAAAAAAAAokcAAOIBAAAKGQAA TAAAAFYZAAAAAAAAVhkAAAAAAABWGQAAAAAAAFYZAAAAAAAA9xoAAAAAAAD3GgAAAAAAAPcaAAAA AAAA/UYAAAIAAAD/RgAAAAAAAP9GAAAAAAAA/0YAAAAAAAD/RgAAAAAAAP9GAAAAAAAA/0YAAAAA AACESQAAaAIAAOxLAABaAAAA/0YAAF0AAAAAAAAAAAAAAAAAAAAAAAAAkgQAAAAAAADLGwAAAAAA AAAAAAAAAAAAAAAAAAAAAADVGgAAIgAAAPcaAAAAAAAAyxsAAAAAAADLGwAAAAAAAP9GAAAAAAAA AAAAAAAAAACSBAAAAAAAAJIEAAAAAAAAVhkAAAAAAAAAAAAAAAAAAFYZAAB/AQAAXEcAABYAAAD9 IAAAAAAAAP0gAAAAAAAA/SAAAAAAAADLGwAAMAQAAJIEAAAAAAAAVhkAAAAAAACSBAAAAAAAAFYZ AAAAAAAA/UYAAAAAAAAAAAAAAAAAAP0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAyxsAAAAAAAD9RgAAAAAAAAAAAAAAAAAA/SAAAAAAAAD9IAAA UgEAAA1DAAD0AAAAkgQAAAAAAACSBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7UUAAAAAAABWGQAAAAAAAP4YAAAMAAAAQGhcm8UK ygEAAAAAAAAAAI4YAAAAAAAA+x8AALIAAAABRAAAHgAAAAAAAAAAAAAA4UYAABwAAAByRwAAMAAA AKJHAAAAAAAAH0QAAM4BAABGTAAAAAAAAK0gAABGAAAARkwAADwAAADtRQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAEZMAAAAAAAAAAAAAAAAAACSBAAAAAAAAO1FAAD0AAAA9xoAACIAAAAZGwAAGAAAAP0g AAAAAAAAMRsAABQAAABFGwAAhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9xoA AAAAAAD3GgAAAAAAAPcaAAAAAAAA/0YAAAAAAAD/RgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA8yAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPcaAAAA AAAA9xoAAAAAAAD3GgAAAAAAAKJHAAAAAAAAyxsAAAAAAADLGwAAAAAAAMsbAAAAAAAAyxsAAAAA AAAAAAAAAAAAAKYEAAAAAAAApgQAAAAAAACmBAAAJBMAAMoXAADEAAAApgQAAAAAAACmBAAAAAAA AKYEAAAAAAAAyhcAAAAAAACmBAAAAAAAAKYEAAAAAAAApgQAAAAAAACSBAAAAAAAAJIEAAAAAAAA kgQAAAAAAACSBAAAAAAAAJIEAAAAAAAAkgQAAAAAAAD/////AAAAAAIADAEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMAIABT AEgAQQBQAEUAIAAgAFwAKgAgAE0ARQBSAEcARQBGAE8AUgBNAEEAVAAgABQACAABABUADQANAE8A ZABhACAAQgBpAGwAZwBpAGwAZQByAGkACQA6AA0AVABvAHAAbABhAG0AIABPAGQAYQAgAFMAYQB5 ADEBcwAxAQkAOgAxADMAOQANAEsAYQB0ACAAUwBhAHkAMQFzADEBCQAJADoAIAAxADAADQBTAHQA YQBuAGQAYQByAGQAIABPAGQAYQAgAFMAYQB5ADEBcwAxAQkAOgAgADEAMQAyAA0AUwB1AGkAdAAg AFMAYQB5ADEBcwAxAQkACQA6ACAANgANAEsA9gBfAWUAIABPAGQAYQBsAGEAcgAJAAkAOgAgADIA MAANAEsAcgBhAGwAIABEAGEAaQByAGUAcwBpADoACQAJADoAIAAxAA0ATwB0AGUAbABkAGUAbgAg AMcAMQFrADEBXwEgAFMAYQBhAHQAaQAJADoAIAAxADMAOgAwADAADQANAE8AdABlAGwAIABIAGkA egBtAGUAdABsAGUAcgBpADoAIAANAMcAYQBtAGEAXwExAXIAaABhAG4AZQAgAHYAZQAgAEsAdQBy AHUAIABUAGUAbQBpAHoAbABlAG0AZQAgAEgAaQB6AG0AZQB0AGkADQAyADQAIABzAGEAYQB0ACAA TwBkAGEAIABTAGUAcgB2AGkAcwBpAA0ASABhAHYAYQBsAGkAbQBhAG4AMQFuAGEAIABVAGwAYQBf ATEBbQAgACgAaQBzAHQAZQBrACAA/AB6AGUAcgBpAG4AZQApAA0ARABvAGsAdABvAHIAKABpAHMA dABlAGsAIAD8AHoAZQByAGkAbgBlACkADQBNAGUAcwBzAGUAbgBnAGUAcgAgAFMAZQByAHYAaQBj AGUADQBJAG4AdABlAHIAbgBlAHQADQBHAPwAbgBsAPwAawAgAEcAYQB6AGUAdABlAA0ATwBkAGEA bABhAHIAZABhACAAUwBhAB8BbAAxAWsAIABEAGEAbgAxAV8BbQBhACAASABhAHQAdAAxASAADQBC AHUAcwBpAG4AZQBzAHMAIABDAGUAbgB0AGUAcgANAEgAZQByACAAZwD8AG4AIAAxADcAOgAwADAA IAB5AGUAIABrAGEAZABhAHIAIABiAGkAcgAgAGcA9gBtAGwAZQBrACAAdgBlACAAcABhAG4AdABv AGwAbwBuACAA/AB0APwAIABzAGUAcgB2AGkAcwBpACAA/ABjAHIAZQB0AHMAaQB6AC4ADQANAFoA ZQB2AGsAIAB2AGUAIABLAG8AbgBmAG8AcgAJADoADQBQAGUA5wBlAHQAZQBsAGUAcgAgAC0AQQBs AG0AYQBuAHkAYQANAE8AZABhACAAcwBhAGIAdQBuACAAXwFhAG0AcAB1AGEAbgAsACAAQQB6AHoA YQByAG8AIAATICAAUABhAHIAaQBzACwADQBEAPwAbgB5AGEAYwBhACAA/ABuAGwA/AAgAEsAMQFi AHIAMQFzACAAcABhAHQAYQB0AGUAcwBpACwADQBPAHQAZQBsAGkAbQBpAHoAIABnAGUAbgBlAGwA aQBuAGQAZQAgAHQA/ABtACAAZAD8AG4AeQBhAGQAYQAgAHMAYQB5AGcAMQEgAGcA9gByAGUAbgAg AFQA/AByAGsAIAB0AGUAawBzAHQAaQBsAGkALAANAEQA/ABuAHkAYQBjAGEAIAD8AG4AbAD8ACAA 5wBhAHkAbABhAHIAIABsAG8AYgBiAHkAIAA1ACAA5wBhAHkAMQFuAGQAYQAsAA0AxwBvAGsAIAD2 AHoAZQBsACAAcwBvAGYAcgBhACAAYQBrAHMAZQBzAHUAYQByAGwAYQByADEBLAANAEYAaQBuAGUA IABkAGkAbgBpAG4AZwAgAHMAdQBsAGEAcgAgACgAUwBhAG4AIABQAGUAbABsAGUAZwByAGkAbgBv ACwAIABBAHEAdQBhACAAUABhAG4AbgBhACwAIABQAGUAcgByAGkAZQByACkADQANAEsAbwBuAHUA bQAJAAkAOgANAEwAZQBmAGsAbwBfAWEAGSBuADEBbgAgAGsAYQBsAGIAaQAgAGsAbwBuAHUAbQB1 AG4AZABhAGsAaQAgAGUAbgAgAGUAbABpAHQAIABjAGEAZABkAGUAcwBpACAARABlAHIAZQBiAG8A eQB1ABkgbgBkAGEAIABMAGUAZgBrAG8AXwFhAG4AMQFuACAAaQBfASwAIABmAGkAbgBhAG4AcwAs ACAAcwBhAG4AYQB0ACwAIABrAPwAbAB0APwAcgAsACAAZQAfAWwAZQBuAGMAZQAsACAAZABlAHYA bABlAHQAIABkAGEAaQByAGUAbABlAHIAaQAsACAAdgBlACAAYgBhAGsAYQBuAGwAMQFrAGwAYQBy AGEAIABzAGEAZABlAGMAZQAgAHkA/AByAPwAbQBlACAAbQBlAHMAYQBmAGUAcwBpAG4AZABlACwA IABoAGEAeQBhAHQAMQFuACAAdABhAG0AIABvAHIAdABhAHMAMQFuAGQAYQAuAA0ADQBVAGwAYQBf ATEBbQAJAAkACQA6AA0ARQByAGMAYQBuACAASABhAHYAYQBsAGkAbQBhAG4AMQFuAGEACQAxADUA IABkAGsADQBeAWUAaABpAHIAIABNAGUAcgBrAGUAegBpAAkACQB5APwAcgD8AG0AZQAgAG0AZQBz AGEAZgBlAHMAaQANAE8AdABvAGIA/ABzACAACQAJAHkA/AByAPwAbQBlACAAbQBlAHMAYQBmAGUA cwBpAA0ARwBpAHIAbgBlACAAXgFlAGgAaQByACAATQBlAHIAawBlAHoAaQAJADEANQAgAGQAawAN AEQAZQB2AGwAZQB0ACAASABhAHMAdABhAG4AZQBzAGkACQA1ACAAIAAgAGQAawANAEIAYQBrAGEA bgBsADEBawBsAGEAcgAJAAkANQAgACAAIABkAGsADQBPAHIAZwBhAG4AaQB6AGUAIABTAGEAbgBh AHkAaQAJADUAIAAgACAAZABrAA0AWQBhAGsAMQFuACAARABvAB8BdQAgANwAbgBpAC4ACQA1ACAA IAAgAGQAawANAA0ATwB0AGUAbAAgANYAegBlAGwAbABpAGsAbABlAHIAaQAJADoADQBLAHUAegBl AHkAIABLADEBYgByADEBcwAZIDEBbgAgAGkAbABrACAAHCBCAHUAcwBpAG4AZQBzAHMAIABGAHIA aQBlAG4AZABsAHkAIABPAHQAZQBsAB0gaQANAEEAbAAxAV8BdgBlAHIAaQBfASAATQBlAHIAawBl AHoAbABlAHIAaQBuAGkAbgAgAHQAYQBtACAAaQDnAGkAbgBkAGUADQBLAHUAegBlAHkAIABLADEB YgByADEBcwAxAW4AIABlAG4AIABwAHIAZQBzAHQAaQBqAGwAaQAgAGMAYQBkAGQAZQBzAGkAIABE AGUAcgBlAGIAbwB5AHUAbgBkAGEADQBUAG8AcABsAGEAbQAgADYAIABhAGQAZQB0ACAAVABvAHAA bABhAG4AdAAxASAAcwBhAGwAbwBuAHUADQAyADUAMAAgAG0AMgAgAGkAbABlACAATABlAGYAawBv AF8BYQAZIG4AMQFuACAAZQBuACAAYgD8AHkA/ABrACAAeQD8AHoAbQBlACAAaABhAHYAdQB6AHUA DQBMAGUAZgBrAG8AXwFhAG4AMQFuACAAZQBuACAAYgD8AHkA/ABrACAAegBpAHkAYQBmAGUAdAAg AGEAbABhAG4AMQEgACgAMQA1ADAAMAAgAGsAaQBfAWkAbABpAGsAIABLAG8AawB0AGUAeQBsACwA IAA4ADAAMAAgAGsAaQBfAWkAbABpAGsAIABnAGEAbABhACAAeQBlAG0AZQAfAWkAIABkAPwAegBl AG4AaQANAFMAcABhACwAIABGAGkAdABuAGUAcwBzACAAQwBlAG4AdABlAHIALAAgAE0AYQBzAGEA agAsACAAUwBhAHUAbgBhACwAIABQAHIAaQB2AGEAdABlACAASABhAG0AYQBtACAAKAAgADQAIABr AGkAXwFpAGwAaQBrACkADQBCAGEAeQAsACAAQgBhAHkAYQBuACAASwB1AGEAZgD2AHIA/AANAEwA ZQBmAGsAbwBfAWEAbgAxAW4AIABpAGwAawAgAFUAbAB1AHMAbABhAHIAIABhAHIAYQBzADEBIABP AHQAZQBsAGwAZQByACAAegBpAG4AYwBpAHIAaQAgAPwAeQBlAHMAaQAoAEcAbwBsAGQAZQBuACAA VAB1AGwAaQBwACAATgBpAGMAbwBzAGkAYQApAA0ADQBSAGUAcwB0AGEAdQByAGEAbgB0AHMACQAJ ADoADQBRAHUAZQBuAHQAZQAgAEIAUgBBAFMASQBMAEwASQBBAE4AIABSAGUAcwB0AGEAdQByAGEA bgB0ACAAMQAwADAAIABrAGkAXwFpAGwAaQBrACAARgB1AG4AIAByAGUAcwB0AGEAdQByAGEAbgB0 AA0ATQBhAGkAbgAgAFIAZQBzAHQAYQB1AHIAYQBuAHQALAAgADEANAAwACAAawBpAF8BaQBsAGkA awAgACAARwByAGUAbgBhAGQAYQAgAFIAZQBzAHQAYQB1AHIAYQBuAHQAIAANAC0AIABFAG4AZQBy AGcAaQBzAGkAbgBnACAAQgByAGUAYQBrAGYAYQBzAHQAIAANAC0AIABTAHAAAAYAAAIIAAAwCAAA MggAADQIAAA2CAAAOAgAADoIAAA8CAAAVggAAFoIAABcCAAAiAgAAKwIAADeCAAAIAkAACQJAACG CQAApAkAAKoJAADgCQAA5AkAAEYKAABkCgAAHgsAACALAABeCwAAYAsAAGILAABuCwAAxgsAAMgL AADKCwAAzAsAANwLAADsCwAA7gsAAAIMAAAEDAAABgwAABQMAAA8DAAAVgwAAFgMAABaDAAApg0A APwNAAD38/fl3ffZ1Mm+ybq2ura6tq7Jtqq2praitqK2oraitp6UjYZ/nn+ee557nnt3AAAAAAYW aH5eIwAABhZotyvoAAAMFWjaKjUAFmjaKjUAAAwWaNoqNQA1CIE+KgEADBZotyvoADUIgT4qAQAS FWjaKjUAFmjaKjUANQiBPioBAAYWaNoqNQAABhZoojluAAAGFmibWFsAAAYWaGs8JwAADxZoNEIJ ADUIgTsIgT4qAQYWaEgIKgAABhZocUOOAAAVFWg0QgkAFmg0QgkANQiBOwiBPioBFRVoNEIJABZo SAgqADUIgTsIgT4qAQkWaDRCCQA1CIEGFmg0QgkAAA8DagAAAAAWaB9GPABVCAEaA2oAAAAAFmje LGgAVQgBbUgABG5IAAR1CAEABhZo3ixoAAAPA2oAAAAAFmjeLGgAVQgBAC4ABgAAOggAADwIAABc CAAAiggAAKwIAADgCAAAAgkAACYJAABMCQAAhAkAAIYJAACqCQAA9gkAAB4KAABmCgAAkgoAALYK AADICgAA5AoAACILAABCCwAAygsAAMwLAADuCwAA9wAAAAAAAAAAAAAAAPIAAAAAAAAAAAAAAADq AAAAAAAAAAAAAAAA6gAAAAAAAAAAAAAAAOoAAAAAAAAAAAAAAADqAAAAAAAAAAAAAAAA6gAAAAAA AAAAAAAAAOoAAAAAAAAAAAAAAADqAAAAAAAAAAAAAAAA6gAAAAAAAAAAAAAAAOoAAAAAAAAAAAAA AADqAAAAAAAAAAAAAAAA3wAAAAAAAAAAAAAAAN8AAAAAAAAAAAAAAADfAAAAAAAAAAAAAAAA3wAA AAAAAAAAAAAAAN8AAAAAAAAAAAAAAADfAAAAAAAAAAAAAAAA3wAAAAAAAAAAAAAAAN8AAAAAAAAA AAAAAADfAAAAAAAAAAAAAAAA3wAAAAAAAAAAAAAAANcAAAAAAAAAAAAAAADXAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAcAABJkaAEBAGdk2io1AAsAAAomAAtGAQASZGgBAQBnZDRCCQAA BwAAEmRoAQEAZ2Q0QgkAAAQAAGdkczzAAAAHAAADJAFhJAFnZDRCCQAAGAAGAABsLQAA/QAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAQEB7gsAABQMAABaDAAAlgwA AAoNAABUDQAAjg0AAP4NAAAADgAAEg4AAI4PAACQDwAApg8AANgPAAAWEAAASBAAAHwQAACsEAAA 1BAAAAIRAAAwEQAAMhEAAFgRAAC0EQAA+hEAAPQAAAAAAAAAAAAAAAD0AAAAAAAAAAAAAAAA9AAA AAAAAAAAAAAAAPQAAAAAAAAAAAAAAAD0AAAAAAAAAAAAAAAA9AAAAAAAAAAAAAAAAPQAAAAAAAAA AAAAAADoAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAA 4AAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAOAAAAAA AAAAAAAAAADgAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAADgAAAAAAAAAAAA AAAA4AAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAADVAAAAAAAAAAAAAAAA1QAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAACwAACiYAC0YCABJkaAEBAGdkNEIJAAAHAAASZGgBAQBnZDRCCQAACwAAD4TQ AhJkaAEBAF6E0AJnZNoqNQALAAAKJgALRgwAEmRoAQEAZ2TaKjUAABj8DQAA/g0AAAAOAAASDgAA Xg4AAG4OAAB+DgAAhg4AAJAPAACgDwAAog8AAKYPAADYDwAAFBAAACYQAABGEAAAohAAAKYQAACs EAAA0hAAANQQAAAAEQAAAhEAADIRAABYEQAAshEAALQRAACUEgAAlhIAAHoTAACSEwAAChQAABgU AABCFAAA1BQAANYUAADeFAAA7BQAAPAUAAD0FAAAFhUAABgVAAAsFQAAThUAAGIVAABkFQAAbhUA AIIVAACmFQAAsBUAAMQVAADIFQAA4BUAAAAWAAAAIgAAXCIAAPz16ubi5uLm6trq5tbm1ubW5tbP 1ubWxMDWwLzAvMC8wLy1qp/aqrzAmMCQwLyQvMCQwLzAjsAAAAAAAANVCAEPFWibWFsAFmibWFsA PioBDBVoIHAbABZoIHAbAAAVFWg0QgkAFmibWFsANQiBOwiBPioBFRVoNEIJABZoIHAbADUIgTsI gT4qAQwWaNJROwA1CIE+KgEABhZom1hbAAAGFmggcBsAABUVaDRCCQAWaNR/PwA1CIE7CIE+KgEM FWhICCoAFmhICCoAAAYWaNR/PwAADxZoNEIJADUIgTsIgT4qAQYWaKI5bgAABhZoSAgqAAAVFWg0 QgkAFmhICCoANQiBOwiBPioBDBVo2io1ABZo2io1AAAGFmi3K+gAN/oRAABaEgAAlhIAAPASAACg EwAAHBQAAEIUAADUFAAA1hQAAPQUAABkFQAAyBUAAPgVAAAUIgAAXCIAANoiAADcIgAA8CIAAIgj AACyIwAA/iMAACYkAAD0AAAAAAAAAAAAAAAA9AAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAD0AAAA AAAAAAAAAAAA9AAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAD0AAAAAAAAAAAAAAAA7AAAAAAAAAAA AAAAAOwAAAAAAAAAAAAAAADhAAAAAAAAAAAAAAAA4QAAAAAAAAAAAAAAANEAAAAAAAAAAAAAAADR AAAAAAAAAAAAAAAAxQAAAAAAAAAAAAAAAMUAAAAAAAAAAAAAAADsAAAAAAAAAAAAAAAA7AAAAAAA AAAAAAAAALoAAAAAAAAAAAAAAAC6AAAAAAAAAAAAAAAAugAAAAAAAAAAAAAAALoAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAsAAAomAAtGBgASZGgBAQBnZDRCCQAACwAAD4RoARJkaAEBAF6EaAFnZDRC CQAADwAAD4RoARGEXAESZGgBAQBehGgBYIRcAWdkNEIJAAsAAAomAAtGAwASZGgBAQBnZDRCCQAA BwAAEmRoAQEAZ2Q0QgkACwAACiYAC0YCABJkaAEBAGdkNEIJAAAVbwByAHQAIABMAHUAbgBjAGgA DQAJAC0AIABNAPwAawBlAG0AbQBlAGwAIABTAGUAcgB2AGkAcwAgAGkAbABlACAAQQBrAF8BYQBt ACAAWQBlAG0AZQAfAWkADQAJAC0AIABQAG8AbABhAG4AYwBvACAAUABvAG8AbAAgAHIAZQBzAHQA YQB1AHIAYQBuAHQALAAgADgAMAAgAGsAaQBfAWkAbABpAGsAIABMAHUAbgBjAGgAIAAmACAARABp AG4AbgBlAHIAIAAoAEMAYQBzAHUAYQBsACkADQANAEIAQQBSAFMACQAJAAkACQA6AA0AUABhAHMA aQBsAGwAbwAgAEwAbwBiAGIAeQAgAEIAYQByACAAKABoAGUAcgAgAGcA/ABuACAAcwBhAGEAdAAg ADUAIADnAGEAeQAgAHMAYQBhAHQAaQAgAPYAegBlAGwAIABiAGkAcwBrAPwAdgBpAGwAZQByACwA IADnAGEAeQAgAG0A/AB6AGkAawBsAGUAcgBpACkADQBMAG8AYgBiAHkAGSBkAGUAIABjAGEAbgBs ADEBIABtAPwAegBpAGsADQBQAG8AbwBsACAAQgBhAHIAcwAsACAAbQBlAHkAdgBlACAAcwBlAHIA dgBpAHMAaQAgAGkAbABlACAAYgBlAHIAYQBiAGUAcgAgAA0AMgA0ACAAcwBhAGEAdAAgAFIAbwBv AG0AIABTAGUAcgB2AGkAcwANAA0AUwBQAE8AUgAgACYAIABFAB4BTABFAE4AQwBFAAkAOgANAEYA aQB0AG4AZQBzAHMAIABDAGUAbgB0AGUAcgAoAPwAeQBlAGwAZQByAGUAIAD2AHoAZQBsACkAIAD2 AHoAZQBsACAAZQAfAWkAdABtAGUAbgBsAGUAcgAgAGUAXwFsAGkAHwFpAG4AZABlAA0ASwBpAF8B aQB5AGUAIAD2AHoAZQBsACAASABhAG0AYQBtACgANAAgAGsAaQBfAWkAbABpAGsAKQAgADIAIABh AGQAZQB0AA0AUwBhAHUAbgBhAGwAYQByAA0AMgA1ADAAIABtADIAIABoAGEAdgB1AHoADQBNAGEA cwBhAGoAIABTAGEAbABvAG4AbABhAHIAMQENAFkAYQB6ACAAYQB5AGwAYQByADEBbgBkAGEAIAD8 AG4AbAD8ACAARABKABkgbABlAHIAbABlACAAXwFlAGgAcgBpAG4AIABlAG4AIABrAGEAcgBpAHoA bQBhAHQAaQBrACAAaABhAHYAdQB6ACAAYgBhAF8BMQEgAGEAawBfAWEAbQBsAGEAcgAxASgAMQAu ADAAMAAwACAAawBpAF8BaQApAA0AWQBhAHoAIABhAHkAbABhAHIAMQFuAGQAYQAgAGcA/ABuAGQA /AB6ACAAaABhAHYAdQB6ACAAYgBhAF8BMQEgAEIAZQBhAGMAaAAgAEMAbAB1AGIADQANAEwARQBG AEsATwBeAUEAGSBEAEEAIABHAEUAWgAwAUwARQBDAEUASwAgAFkARQBSAEwARQBSAA0AUwBlAGwA aQBtAGkAeQBlACAAQwBhAG0AaQANAEcAaQByAG4AZQAgAEsAYQBwADEBcwAxAQ0ASwB1AG0AYQBy AGMAMQFsAGEAcgAgAEgAYQBuADEBDQBCAPwAeQD8AGsAIABIAGEAbgANAFYAZQBuAGUAZABpAGsA IABTAPwAdAB1AG4AdQANAE0AZQB2AGwAZQB2AGkAIABNAPwAegBlAHMAaQANAEQAZQByAHYAaQBf ASAAUABhAF8BYQAgAEsAbwBuAGEAHwExAQ0ARQByAG0AZQBuAGkAIABLAGkAbABpAHMAZQBzAGkA DQBTAGEAYwBhAGsAbAAxASAARQB2AA0AQQByAGEAcAAgAEEAaABtAGUAdAAgAEMAYQBtAGkAcwBp AA0ADQDWAFoARQBMACAARwDcAE4ATABFAFIAIABWAEUAIABZAEUAUgBFAEwAIABFAFQASwAwAU4A TABFAFIAOgANADIAMAAgAFQAZQBtAG0AdQB6AA0AMQA1ACAASwBhAHMAMQFtACwAIABLAEsAVABD ACAAQwB1AG0AaAB1AHIAaQB5AGUAdAAgAEIAYQB5AHIAYQBtADEBDQBMAGUAZgBrAG8AXwFhACAA XgFlAGgAaQByACAARgBlAHMAdABpAHYAYQBsAGkADQBMAGUAZgBrAG8AXwFhACAAVABpAHkAYQB0 AHIAbwAgAEYAZQBzAHQAaQB2AGEAbABpACwADQBHAPYAbgB5AGUAbABpACAARgBlAHMAdABpAHYA YQBsAGkALgANAA0ADQANAA0ARABpAB8BZQByACAAUABhAHMAaABhACAARwByAG8AdQBwACAAXgFp AHIAawBlAHQAbABlAHIAaQAJADoADQBNAGkAcgBhAGcAZQAgAEgAbwB0AGUAbAAgACYAIABDAGEA cwBpAG4AbwAtACAAUwB1AHIAaQBuAGEAbQBlAA0AVAByAG8AcABpAGMAYQBuAGEAIABIAG8AdABl AGwAIAAmACAAQwBhAHMAaQBuAG8ALQBTAHUAcgBpAG4AYQBtAGUADQBTAGEAdgBhAG4AbgBhAGgA IABDAGEAcwBpAG4AbwAtACAAUwB1AHIAaQBuAGEAbQBlAA0AQQBjAGEAcAB1AGwAYwBvACAAQwBh AHMAaQBuAG8ALQAgAEsAMQFiAHIAMQFzACAADQBDAGEAcwBpAG4AbwAgAFMAaQBtAGIAYQAgAC0A VQBnAGEAbgBkAGEAIAANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQAN AA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ARABlAHIAZQBiAG8AeQB1ACwA IAB0AGgAZQAgAHAAcgBlAHMAdABpAGcAaQBvAHUAcwAgAFMAdAByAGUAZQB0ACwAIABOAGkAYwBv AHMAaQBhACwAIABOAG8AcgB0AGgAIABDAHkAcAByAHUAcwANAFQAOgAgACsAOQAwACAAMwA5ADIA IAA2ADEAMAAgADUAMAAgADUAMAAsACAARgA6ACAAKwA5ADAAIAAzADkAMgAgADYAMQAwACAANQAw ACAANgA0AA0AEwAgAEgAWQBQAEUAUgBMAEkATgBLACAAIgBtAGEAaQBsAHQAbwA6AGcAbwBsAGQA ZQBuAHQAdQBsAGkAcABuAGkAYwBvAHMAaQBhAC4AYwBvAG0AIgAgAAEAFABnAG8AbABkAGUAbgB0 AHUAbABpAHAAbgBpAGMAbwBzAGkAYQAuAGMAbwBtABUAIAAgACAAIAATACAASABZAFAARQBSAEwA SQBOAEsAIAAiAG0AYQBpAGwAdABvADoAaQBuAGYAbwBAAGcAbwBsAGQAZQBuAHQAdQBsAGkAcABu AGkAYwBvAHMAaQBhAC4AYwBvAG0AIgAgAAEAFABpAG4AZgBvAEAAZwBvAGwAZABlAG4AdAB1AGwA aQBwAG4AaQBjAG8AcwBpAGEALgBjAG8AbQAVACAAIAAgACAAEwAgAEgAWQBQAEUAUgBMAEkATgBL ACAAIgBtAGEAaQBsAHQAbwA6AHMAYQBsAGUAcwBAAGcAbwBsAGQAZQBuAHQAdQBsAGkAcABuAGkA YwBvAHMAaQBhAC4AYwBvAG0AIgAgAAEAFABzAGEAbABlAHMAQABnAG8AbABkAGUAbgB0AHUAbABp AHAAbgBpAGMAbwBzAGkAYQAuAGMAbwBtABUADQANAEkAbgB0AGUAcgBuAGEAdABpAG8AbgBhAGwA IABzAHQAYQBuAGQAYQByAGQAcwAsACAAbABvAGMAYQBsACAAZgBsAGEAdgBvAHUAcgBzAA0ADQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXCIAAHwiAACQIgAA2CIAANoiAADcIgAA 6iIAAOwiAADuIgAA8CIAAPQiAAD8IgAA/iIAADQjAACEIwAAJiQAACgkAABEJAAASCQAAEokAABm JAAAuCQAAM4kAAAAJQAAEiUAACwlAABIJgAAgCYAAJomAACcJgAApicAAKgnAADmJwAACigAADwo AAA+KAAAUCgAAFooAABcKAAAbigAAH4oAACOKAAAkCgAAKQoAAC2KAAAyCgAAMooAADSKAAA3CgA AN4oAAD89Pzw5tzV3M7Kw8q/yr+7tNW0v7DKsL+wv7Ssv6yl1ayhrLCssKywrLCssKydlo+FAAAA AAAAAAAAAAAAAAAAAAASFWjKGV0AFmjKGV0ANQiBPioBAAwWaEVk4wA1CIE+KgEADBZoL07jADUI gT4qAQAGFmhICCoAAAYWaGNrCwAADBZo1HdXADUIgT4qAQAGFmiEaJQAAAYWaOw1kwAADBZolHQG ADUIgT4qAQAGFmi+UUcAAAYWaJR0BgAADBVolHQGABZolHQGAAAGFmibWFsAAAwWaDw84QA1CIE+ KgEADBZohGiUADUIgT4qAQASFWg8POEAFmg8POEANQiBPioBABIVaJR0BgAWaDw84QA1CIE+KgEA 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 CUNKHgBhSh4AcGgAAIAAAB0VaLY0iwAWaN9V0QBCKglDSh4AYUoeAHBoAACAACAVaLY0iwAWaN9V 0QA1CIFCKglDSh4AYUoeAHBoAACAAAAaFmjfVdEANQiBQioJQ0oUAGFKFABwaAAAgAAALwIIgQNq kgIAAAYIARVotjSLABZo31XRADUIgUIqCUNKFABVCAFhShQAcGgAAIAALwIIgQNqhwEAAAYIARVo tjSLABZo31XRADUIgUIqCUNKFABVCAFhShQAcGgAAIAAIBVotjSLABZo31XRADUIgUIqCUNKFABh ShQAcGgAAIAAACQVaLY0iwAWaN9V0QAwShEANQiBQioJQ0oUAGFKFABwaAAAgAAAKQNqAAAAABVo tjSLABZo31XRADUIgUIqCUNKFABVCAFhShQAcGgAAIAALwIIgQNqkAAAAAYIARVotjSLABZo31XR ADUIgUIqCUNKFABVCAFhShQAcGgAAIAAABhqLQAAbC0AAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAGFmjfVdEAATIAMZBoATpwNEIJAB+wgi4gsMZBIbCJBSKwiQUjkM8C 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAA AABEAGQAAAAAAAAAAgAAAAAAAAAAAAAAAAA4E3AIFgMWAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAADwAE8EQAAACyBArwCAAAAAEEAAAACgAAMwAL8BIAAAB/AEABQAEAARAA//8BAfD/ AAATACLxBgAAAD8FAQABAAAAEPAEAAAAAAAAgPcAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDJ6nn5us4RjIIAqgBLqQsC AAAAFwAAABcAAABnAG8AbABkAGUAbgB0AHUAbABpAHAAbgBpAGMAbwBzAGkAYQAuAGMAbwBtAAAA 4Mnqefm6zhGMggCqAEupC1QAAABtAGEAaQBsAHQAbwA6AGcAbwBsAGQAZQBuAHQAdQBsAGkAcABu AGkAYwBvAHMAaQBhAC4AYwBvAG0AAAB5WIH0Ox1/SK8sgl3EhSdjAAAAAKWrAAALAQAARAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AADQyep5+brOEYyCAKoAS6kLAgAAABcAAAAcAAAAaQBuAGYAbwBAAGcAbwBsAGQAZQBuAHQAdQBs AGkAcABuAGkAYwBvAHMAaQBhAC4AYwBvAG0AAADgyep5+brOEYyCAKoAS6kLXgAAAG0AYQBpAGwA dABvADoAaQBuAGYAbwBAAGcAbwBsAGQAZQBuAHQAdQBsAGkAcABuAGkAYwBvAHMAaQBhAC4AYwBv AG0AAAB5WIH0Ox1/SK8sgl3EhSdjAAAAAKWrAAAPAQAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQyep5+brOEYyCAKoAS6kL AgAAABcAAAAdAAAAcwBhAGwAZQBzAEAAZwBvAGwAZABlAG4AdAB1AGwAaQBwAG4AaQBjAG8AcwBp AGEALgBjAG8AbQAAAODJ6nn5us4RjIIAqgBLqQtgAAAAbQBhAGkAbAB0AG8AOgBzAGEAbABlAHMA QABnAG8AbABkAGUAbgB0AHUAbABpAHAAbgBpAGMAbwBzAGkAYQAuAGMAbwBtAAAAeViB9Dsdf0iv LIJdxIUnYwAAAAClqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAhIAEgABAJwA DwAEAAAAAAAAAAAABAAIAAAACAAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAABAAABA8f8CAEAADBQAAAAAAAAAAAYATgBvAHIAbQBhAGwAAAACAAAAGABDShgA X0gBBGFKGABtSB8Ec0gfBHRIHwQAAAAAAAAAAAAAAAAAAAAAAABSAEFA8v+hAFIADAUAAAAAAAAA AB0AVgBhAHIAcwBhAHkAMQFsAGEAbgAgAFAAYQByAGEAZwByAGEAZgAgAFkAYQB6ADEBIABUAGkA cABpAAAAAABSAGkA8/+zAFIADAUAAAAAAAAAAAwATgBvAHIAbQBhAGwAIABUAGEAYgBsAG8AAAAc ABf2AwAANNYGAAEKA2wANNYGAAEFAwAAYfYDAAACAAsAAAAsAGsA9P/BACwAAAUAAAAAAAAAAAkA TABpAHMAdABlACAAWQBvAGsAAAACAAwAAAAAAGIA/k/x//IAYgAMAAAAwR+KAAAABwBEAGUAZgBh AHUAbAB0AAAACwAPADckADgkAEgkAAAtAEIqAUNKGABPSgQAUUoEAF5KBABfSAEEYUoYAG1IHwRw aAAAAABzSB8EdEgfBABGAJkAAQACAUYADAUAAJtYWwAAAAsAQgBhAGwAbwBuACAATQBlAHQAbgBp AAAAAgAQABQAQ0oQAE9KBQBRSgUAXkoFAGFKEAAuAFVAogARAS4ADAQAAN9V0QAAAAUASwD2AHAA cgD8AAAADAA+KgFCKgJwaAAA/wAAAAAAtgwAAAQAAD4AAAAA/////wAAAAAdAAAAHgAAAC4AAABF AAAAVgAAAHAAAACBAAAAkwAAAKYAAADCAAAAwwAAANUAAAD7AAAADwEAADMBAABJAQAAWwEAAGQB AAByAQAAkQEAAKEBAADlAQAA5gEAAPcBAAAKAgAALQIAAEsCAACFAgAAqgIAAMcCAAD/AgAAAAMA AAkDAADHAwAAyAMAANMDAADsAwAACwQAACQEAAA+BAAAVgQAAGoEAACBBAAAmAQAAJkEAACsBAAA 2gQAAP0EAAAtBQAASwUAAHgFAADQBQAADgYAACEGAABqBgAAawYAAHoGAACyBgAA5AYAAPwGAAAK BwAALgcAAG0HAABuBwAAeAcAAMQHAADZBwAA/wcAABMIAAAUCAAAJQgAAFwIAACACAAAiQgAAJYI AACmCAAA+AgAACMJAAAkCQAAQAkAAE4JAABbCQAAawkAAHUJAACECQAAkwkAAKYJAAC2CQAAwQkA ANMJAADUCQAA8wkAAP0JAAAfCgAANwoAAFIKAABlCgAAZgoAAGcKAABoCgAAaQoAAIgKAACoCgAA ygoAAOQKAAD9CgAAEwsAABQLAAAVCwAAFgsAABcLAAAYCwAAGQsAABoLAAAbCwAAHAsAAB0LAAAe CwAAHwsAACALAAAhCwAAIgsAACMLAAAkCwAAJQsAACYLAAAnCwAAKAsAACkLAAAqCwAAKwsAACwL AAAtCwAALgsAAC8LAAAwCwAAMQsAADILAAAzCwAANAsAADULAAA2CwAANwsAADgLAAA5CwAAOgsA ADsLAABzCwAAngsAAIwMAACNDAAAtQwAALgMAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAACAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAgACY AAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAIAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAACAAJgA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAgACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAIAAmAAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAACAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAgACYAAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAIAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAACAAJgAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAgACYAAEgADAAAAAAAAAAgAAAAIAAAAAAAAAAAIAAmAABIAAw AQAAAAAAAIAAAACAAAAAAAAAAACAAJgAASAAMAIAAAAAAACAAAAAgAAAAAAAAAAAgACYAAEgADAD AAAAAAAAgAAAAIAAAAAAAAAAAIAAmAABIAAwBAAAAAAAAIAAAACAAAAAAAAAAACAAJgAASAAMAUA AAAAAACAAAAAgAAAAAAAAAAAgACYAAEgADAGAAAAAAAAgAAAAIAAAAAAAAAAAIAAmAABIAAwBwAA AAAAAIAAAACAAAAAAAAAAACAAJgAASAAMAgAAAAAAACAAAAAgAAAAAAAAAAAgACYAAEgADAJAAAA AAAAgAAAAIAAAAAAAAAAAIAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAACAAJgAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAgACYAAwgADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAMIAAwAQAAAAAA AIAAAACAAAAAAAAAAACAAJgADCAAMAIAAAAAAACAAAAAgAAAAAAAAAAAgACYAAwgADADAAAAAAAA gAAAAIAAAAAAAAAAAIAAmAAMIAAwBAAAAAAAAIAAAACAAAAAAAAAAACAAJgADCAAMAUAAAAAAACA AAAAgAAAAAAAAAAAgACYAAwgADAGAAAAAAAAgAAAAIAAAAAAAAAAAIAAmAAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAACAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAgACYAAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAIAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAACAAJgAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAgACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAIAAmAAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAACAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAgACYAAAAADAAAAAAAAAAgAAAAIAA AAAAAAAAAIAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAACAAJgAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAgACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAIAAmAAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAACAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAgACYAAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAIAAmAACIAAwAAAAAAAAAIAAAACAAAAAAAAAAACAAJgAAiAAMAEAAAAAAACAAAAAgAAAAAAA AAAAgACYAAIgADACAAAAAAAAgAAAAIAAAAAAAAAAAIAAmAACIAAwAwAAAAAAAIAAAACAAAAAAAAA AACAAJgAAiAAMAQAAAAAAACAAAAAgAAAAAAAAAAAgACYAAIgADAFAAAAAAAAgAAAAIAAAAAAAAAA AIAAmAACIAAwBgAAAAAAAIAAAACAAAAAAAAAAACAAJgAAiAAMAcAAAAAAACAAAAAgAAAAAAAAAAA gACYAAIgADAIAAAAAAAAgAAAAIAAAAAAAAAAAIAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAACA AJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAgACYAAMgADAAAAAAAAAAgAAAAIAAAAAAAAAAAIAA mAADIAAwAQAAAAAAAIAAAACAAAAAAAAAAACAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAgACY AAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAIAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAACAAJgA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAgACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgABiAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAYg ADABAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAGIAAwAgAAAAAAAIAAAACAAAAAAAAAAAAAAJgABiAA MAMAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAByAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAcgADAB AAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAHIAAwAgAAAAAAAIAAAACAAAAAAAAAAAAAAJgAByAAMAMA AAAAAACAAAAAgAAAAAAAAAAAAACYAAcgADAEAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAHIAAwBQAA AAAAAIAAAACAAAAAAAAAAAAAAJgAByAAMAYAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAByAAMAcAAAAA AACAAAAAgAAAAAAAAAAAAACYAAcgADAIAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAHIAAwCQAAAAAA AIAAAACAAAAAAAAAAAAAAJgAByAAMAoAAAAAAACAAAAAgAAAAAAAAAAAAACYAAcgADALAAAAAAAA gAAAAIAAAAAAAAAAAAAAmAAHIAAwDAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAByAAMA0AAAAAAACA AAAAgAAAAAAAAAAAAACYAAcgADAOAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAHIAAwDwAAAAAAAIAA AACAAAAAAAAAAAAAAJgAByAAMBAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgACiAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYAAogADABAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAKIAAwAgAAAAAAAIAAAACA AAAAAAAAAAAAAJgACiAAMAMAAAAAAACAAAAAgAAAAAAAAAAAAACYAAogADAEAAAAAAAAgAAAAIAA AAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAsgADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmAALIAAwAQAAAAAAAIAAAACAAAAAAAAAAAAAAJgACyAAMAIAAAAAAACAAAAAgAAAAAAA AAAAAACYAAsgADADAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAALIAAwBAAAAAAAAIAAAACAAAAAAAAA AAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAA AACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY AAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAA gAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAOgsAAHMLAACeCwAAjQwA ALUMAAC4DAAAS8gAMAAQAAAAAAAAAQAAAAQAAAABAAAAAAAGB0vIADAAEAAAAAAAAAEAAAADAAAA AAAAAAAAAAdLyAAwABAAAAAAAAACAAAAAQAAAAAAAAAAAAAHAkAAAAAQAAAAAAAAAAAAAAAAAAAA AAAAAAAAB0vIADAAEAAAAAAAAAEAAAAAAAAAAAAAAAAAqQcKAAAAAAAAAAAAAAAAAAAAAAAGMHsB AAAAAAAHAAYAAPwNAABcIgAA3igAAJQrAABqLQAAbC0AAAsAAAAPAAAAFwAAABoAAAAdAAAAHgAA AAAGAADuCwAA+hEAACYkAAD6JwAAPCoAAHQqAABsLQAADAAAAA4AAAAQAAAAGAAAABkAAAAbAAAA HAAAAAAGAABsLQAADQAAAAAAAAAYAAAAGwAAAJ4LAADLCwAA4gsAAOcLAAAZDAAANQwAADoMAABt DAAAigwAALYMAACTXxT/FZwTWBT/FYQTWBT/FYQTWBT/FYQPAADwbAAAAAAABvAYAAAAAggAAAIA AAACAAAAAQAAAAEAAAADAAAAHwAB8CwAAABiAAfwJAAAAAYGRLdb4TtTRf5oYp/Umvd8if8A1jMA AAEAAAA0PgAAAAAAAEAAHvEQAAAA//8AAAAA/wCAgIAA9wAAEAAPAALwAgEAABAACPAIAAAAAgAA AAIEAAAPAAPwoAAAAA8ABPAoAAAAAQAJ8BAAAAAAAAAAAAAAAAAAAAAAAAAAAgAK8AgAAAAABAAA BQAAAA8ABPBoAAAAsgQK8AgAAAACBAAAAAoAADMAC/ASAAAAfwBAAUABBEEBAAAAvwMAACAAUwAi 8R4AAAC/AQAAYACQAwMAAACSAwMAAAC/AwACAAI/BQEAAQAAABDwBAAAAAAAAAAAABHwBAAAAAEA AAAPAATwQgAAABIACvAIAAAAAQQAAAAOAABTAAvwHgAAAL8BAAAQAMsBAAAAAP8BAAAIAAQDCQAA AD8DAQABAAAAEfAEAAAAAQAAABkAAAC2DAAAAgQAAAAAAAAAAAAAMQ8AAKsGAAB0gAAAAAD//wIA AAAGANciZAEIAAIAFP0iAAYA2CJkAQgAAgDU/CIASwUAAIkIAAC4DAAAAAAAAAEAAQAAAAEAUQUA AI8IAAC4DAAAAAAAAAEAAAABAAAAQwAAAAIAAAAqgHVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206 b2ZmaWNlOnNtYXJ0dGFncw+AbWV0cmljY29udmVydGVyAIAMAAAB9L7FDgIAAAAGgDI1MCBtMgmA UHJvZHVjdElEAgABAAAAAQAAAAAAAAACAAEAAAABAAAAAAAAAAAAAAAuAAAARAAAAEUAAABvAAAA cAAAAJIAAACTAAAAwgAAAMMAAADSAAAA1QAAAPIAAADzAAAAGwEAABwBAAAjAQAAJAEAADIBAAAz AQAAjwEAAJEBAACwAQAAsgEAALcBAAC8AQAA4wEAAOYBAAD0AQAA9wEAAPgBAAATAgAAGAIAAB0C AAAeAgAAJgIAACsCAAAtAgAASQIAAEsCAABhAgAAagIAAIQCAACFAgAAigIAAI0CAACYAgAAmQIA AJoCAACfAgAAoAIAAKECAACoAgAAqgIAALQCAAC5AgAAzQIAANMCAADYAgAA3gIAAOECAADqAgAA /gIAAAkDAAAUAwAAFQMAAD8DAABEAwAAxwMAAMgDAADOAwAA0wMAAAoEAAALBAAAEwQAABQEAAAj BAAAJAQAAFEEAABTBAAAaQQAAGoEAACABAAAgQQAAJgEAACZBAAA2QQAANoEAABKBQAASwUAAAwG AAAOBgAAagYAAGsGAAB2BgAAegYAAIsGAACMBgAAlgYAAJcGAACxBgAAsgYAAMEGAADDBgAA4gYA AOQGAADwBgAA8QYAAAoHAAALBwAALgcAAC8HAABIBwAASgcAAGwHAABuBwAAdQcAAHgHAAB/BwAA gAcAAMIHAADEBwAAEwgAABQIAAAiCAAAJQgAADMIAAA0CAAAZwgAAGgIAAAjCQAAJAkAAE0JAABO CQAA0wkAANQJAAAFCgAABwoAAB4KAAAfCgAAZAoAAG8KAAB0CgAAdQoAAHoKAACFCgAAiAoAAKcK AACoCgAA9AoAAPUKAAD7CgAA/QoAAAkLAAAKCwAAEQsAADsLAABDCwAARQsAAEgLAABJCwAAVAsA AFULAABbCwAAXQsAAGQLAABsCwAAcgsAAIULAACHCwAAjQwAAJoMAACbDAAApAwAAKYMAACrDAAA rAwAALQMAAC4DAAABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAH AAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcA BQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAF AAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUA BwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAH AAUABwAFAAcAHAAHABwABQAHAAUABwAFAAcABQAHAAUABwAFAAcAHAAHABwABwAcAAcAHAAHABwA BwAcAAcAGwAHABwABwAcAAcAHAAHABwABwAAAAAAvAAAAMEAAACpAQAArgEAAHoDAACEAwAATwQA AFUEAABjBAAAaQQAAHoEAACABAAAkQQAAJcEAAAPBQAAGAUAAL0FAADBBQAAxwYAANcGAADkBgAA 8AYAAPwGAAADBwAACwcAABUHAAAvBwAAOAcAALgMAAAHABoABwAaAAcAGgAHABoABwAaAAcAGgAH ABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAAAAAABoAAAAbAAAAAQIAAAECAABlCgAA aQoAADMLAAAzCwAANwsAADcLAAC4DAAAAwAEAAMABAADAAQAAwAEAAMABAADAAAAAAC4DAAABwAM AH4A4TMOYyw4/w//D/8P/w//D/8P/w//D/8PEACwJVg1lIQsKP8P/w//D/8P/w//D/8P/w//DxAA Dmu7OTqy5rL/D/8P/w//D/8P/w//D/8P/w8QAFgOREzASiz9/w//D/8P/w//D/8P/w//D/8PEAD/ b+9OeN/SwP8P/w//D/8P/w//D/8P/w//DxAAImBsYPzPxIH/D/8P/w//D/8P/w//D/8P/w8QAKFP LmIQl8wz/w//D/8P/w//D/8P/w//D/8PEACaaUVwpDMU//8P/w//D/8P/w//D/8P/w//DxAA9zyS cc7q1Dn/D/8P/w//D/8P/w//D/8P/w8QAPholnRgFChw/w//D/8P/w//D/8P/w//D/8PEADNYcZ5 DvgYbv8P/w//D/8P/w//D/8P/w//DxAAjHrYfthyIqL/D/8P/w//D/8P/w//D/8P/w8QAAEAAAAX EAAAAAAAAAAAAABoAQAAAAAAABUYAAAPhNACEYSY/hXGBQAB0AIGXoTQAmCEmP5PSgEAUUoBAG8o AIdoAAAAAIhIAAABALfwAQAAABeQAAAAAAAAAAAAAGgBAAAAAAAAGRgAAA+EoAURhJj+FcYFAAGg BQZehKAFYISY/k9KBgBRSgYAXkoGAG8oAIdoAAAAAIhIAAABAG8AAQAAABeQAAAAAAAAAAAAAGgB AAAAAAAAFRgAAA+EcAgRhJj+FcYFAAFwCAZehHAIYISY/k9KBwBRSgcAbygAh2gAAAAAiEgAAAEA p/ABAAAAF5AAAAAAAAAAAAAAaAEAAAAAAAAVGAAAD4RACxGEmP4VxgUAAUALBl6EQAtghJj+T0oB AFFKAQBvKACHaAAAAACISAAAAQC38AEAAAAXkAAAAAAAAAAAAABoAQAAAAAAABkYAAAPhBAOEYSY /hXGBQABEA4GXoQQDmCEmP5PSgYAUUoGAF5KBgBvKACHaAAAAACISAAAAQBvAAEAAAAXkAAAAAAA AAAAAABoAQAAAAAAABUYAAAPhOAQEYSY/hXGBQAB4BAGXoTgEGCEmP5PSgcAUUoHAG8oAIdoAAAA AIhIAAABAKfwAQAAABeQAAAAAAAAAAAAAGgBAAAAAAAAFRgAAA+EsBMRhJj+FcYFAAGwEwZehLAT YISY/k9KAQBRSgEAbygAh2gAAAAAiEgAAAEAt/ABAAAAF5AAAAAAAAAAAAAAaAEAAAAAAAAZGAAA D4SAFhGEmP4VxgUAAYAWBl6EgBZghJj+T0oGAFFKBgBeSgYAbygAh2gAAAAAiEgAAAEAbwABAAAA F5AAAAAAAAAAAAAAaAEAAAAAAAAVGAAAD4RQGRGEmP4VxgUAAVAZBl6EUBlghJj+T0oHAFFKBwBv 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 AQC38AEAAAAXkAAAAAAAAAAAAABoAQAAAAAAABkYAAAPhBAOEYSY/hXGBQABEA4GXoQQDmCEmP5P SgYAUUoGAF5KBgBvKACHaAAAAACISAAAAQBvAAEAAAAXkAAAAAAAAAAAAABoAQAAAAAAABUYAAAP hOAQEYSY/hXGBQAB4BAGXoTgEGCEmP5PSgcAUUoHAG8oAIdoAAAAAIhIAAABAKfwAQAAABeQAAAA AAAAAAAAAGgBAAAAAAAAFRgAAA+EsBMRhJj+FcYFAAGwEwZehLATYISY/k9KAQBRSgEAbygAh2gA AAAAiEgAAAEAt/ABAAAAF5AAAAAAAAAAAAAAaAEAAAAAAAAZGAAAD4SAFhGEmP4VxgUAAYAWBl6E gBZghJj+T0oGAFFKBgBeSgYAbygAh2gAAAAAiEgAAAEAbwABAAAAF5AAAAAAAAAAAAAAaAEAAAAA AAAVGAAAD4RQGRGEmP4VxgUAAVAZBl6EUBlghJj+T0oHAFFKBwBvKACHaAAAAACISAAAAQCn8AwA AACMeth+AAAAAAAAAAAAAAAADmu7OQAAAAAAAAAAAAAAAJppRXAAAAAAAAAAAAAAAADNYcZ5AAAA AAAAAAAAAAAA+GiWdAAAAAAAAAAAAAAAAH4A4TMAAAAAAAAAAAAAAACwJVg1AAAAAAAAAAAAAAAA /2/vTgAAAAAAAAAAAAAAACJgbGAAAAAAAAAAAAAAAAChTy5iAAAAAAAAAAAAAAAA9zyScQAAAAAA AAAAAAAAAFgOREwAAAAAAAAAAAAAAAD///////////////////////////////////////////// /////////////////////wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wwAAAASAAEAHwQD AB8EBQAfBAEAHwQDAB8EBQAfBAEAHwQDAB8EBQAfBBIAAQAfBAMAHwQFAB8EAQAfBAMAHwQFAB8E AQAfBAMAHwQFAB8EEgABAB8EAwAfBAUAHwQBAB8EAwAfBAUAHwQBAB8EAwAfBAUAHwQSAAEACQQD AAkEBQAJBAEACQQDAAkEBQAJBAEACQQDAAkEBQAJBBIAAQAfBAMAHwQFAB8EAQAfBAMAHwQFAB8E AQAfBAMAHwQFAB8EEgABAB8EAwAfBAUAHwQBAB8EAwAfBAUAHwQBAB8EAwAfBAUAHwQSAAEAHwQD AB8EBQAfBAEAHwQDAB8EBQAfBAEAHwQDAB8EBQAfBBIAAQAfBAMAHwQFAB8EAQAfBAMAHwQFAB8E AQAfBAMAHwQFAB8EEgABAB8EAwAfBAUAHwQBAB8EAwAfBAUAHwQBAB8EAwAfBAUAHwQSAAEAHwQD AB8EBQAfBAEAHwQDAB8EBQAfBAEAHwQDAB8EBQAfBBIAAQAfBAMAHwQFAB8EAQAfBAMAHwQFAB8E AQAfBAMAHwQFAB8EEgABAB8EaMNeIgUAHwQBAB8EAwAfBAUAHwQBAB8EAwAfBAUAHwQ3AAAABAAA AAgAAADlAAAAAAAAADYAAACUdAYA4WIHAPU/CQA0QgkAY2sLAE52DADYbQ8A6z4TACBwGwCmbx8A fl4jAGs8JwBICCoA5VUqAANQLwA6NjEA2io1ANJROwBqOzwAH0Y8ANR/PwBvPEQAWAlGAL5RRwCm TVUA1HdXAJtYWwDKGV0A3ixoAK4uaQCiOW4AKlR0AKsBeADLTH8AwR+KAHFDjgDsNZMAhGiUAAwX mADXAasAJHyxAHM8wAD8H8EA7xDIAN9V0QDBFdQA3TjWADw84QAvTuMARWTjALcr6AA9SusA9EL4 AHIs+wDAE/0AAAAAAAECAAC1DAAAuAwAAAAAAAAPAAAAAAAAAP9AAlgAAAAAAAAAAAEAAAACAAAA AwAAAAQAAAAGAAAABwAAtgwAAEAAAAgAAAAAQAAACgAAAABAAAAMAAAAAEAAAA4AAAAAQAAAEAAA AABAAAAUAAAAAEAAACIAAAAA//8BAAAABwBVAG4AawBuAG8AdwBuAP//AQAIAAAAAAAAAAAAAAD/ /wEAAAAAAP//AAACAP//AAAAAP//AAACAP//AAAAAAgAAABHFpABogACAgYDBQQFAgMEh3oAIAAA AIAIAAAAAAAAAP8BAAAAAAAAVABpAG0AZQBzACAATgBlAHcAIABSAG8AbQBhAG4AAAA1FpABAgAF BQECAQcGAgUHAAAAAAAAABAAAAAAAAAAAAAAAIAAAAAAUwB5AG0AYgBvAGwAAAAzJpABogACCwYE AgICAgIEh3oAIAAAAIAIAAAAAAAAAP8BAAAAAAAAQQByAGkAYQBsAAAAQSaQAaIAAgsFBgICAgMC BIcCAAAAAAAAAAAAAAAAAACfAAAAAAAAAEEAcgBpAGEAbAAgAE4AYQByAHIAbwB3AAAANy6QAQAA Ag8FAgICBAMCBO8CAKB7IABAAAAAAAAAAACfAAAAAAAAAEMAYQBsAGkAYgByAGkAAAA1JpABogAC CwYEAwUEBAIEh3oAYQAAAIAIAAAAAAAAAP8BAQAAAAAAVABhAGgAbwBtAGEAAAA/NZABogACBwMJ AgIFAgQEh3oAIAAAAIAIAAAAAAAAAP8BAAAAAAAAQwBvAHUAcgBpAGUAcgAgAE4AZQB3AAAAOwaQ AQIABQAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAACAAAAAAFcAaQBuAGcAZABpAG4AZwBzAAAA IgAEAHEIiBgA8MQCAACpAQAAAADVk9Umy7PXZmtc18YgAL8AAADlAQAA0QoAAAEABgAAAAQAAxAX AAAA5QEAANEKAAABAAYAAAAXAAAAAAAAACEDAPAQAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AIkFzwK0ALQAgYEyNAAAAAAAAAAAAAAAAAAAsAwAALAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAADDKDUQDwEAAI APz9AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIWAAAAAAo8P8PAQABPwAA5gQAAP///3////9/ ////f////3////9/////f////3/BH4oAAAQAADIAAAAAAAAAAAAAAAAAAAAAAP//EgAAAAAAAAAO AE8AVABFAEwAIABCADABTABHADABTABFAFIAMAEAAAAAAAAGAE4AbwBOAGEAbQBlAAQAVQBzAGUA cgAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAGAAAADAAAAAAADAABAAwAAgAMAAMADAAEAAwABQAM AAYADAAHAAwACAAMAAkADAAKAAwACwAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAD+/wAABQECAAAAAAAAAAAAAAAAAAAAAAABAAAA4IWf8vlPaBCrkQgAKyez2TAAAAB0 AQAAEQAAAAEAAACQAAAAAgAAAJgAAAADAAAAsAAAAAQAAAC8AAAABQAAAMwAAAAHAAAA2AAAAAgA AADoAAAACQAAAPgAAAASAAAABAEAAAoAAAAkAQAACwAAADABAAAMAAAAPAEAAA0AAABIAQAADgAA AFQBAAAPAAAAXAEAABAAAABkAQAAEwAAAGwBAAACAAAA5gQAAB4AAAAQAAAAT1RFTCBC3UxH3UxF Ut0AAB4AAAAEAAAAAAAAAB4AAAAIAAAATm9OYW1lAAAeAAAABAAAAAAAAAAeAAAACAAAAE5vcm1h bAAAHgAAAAgAAABVc2VyAAAAAB4AAAAEAAAAMzIAAB4AAAAYAAAATWljcm9zb2Z0IE9mZmljZSBX b3JkAAAAQAAAAAA6sa4aAAAAQAAAAADyF+M1AsoBQAAAAACeeBqz18kBQAAAAACisXnFCsoBAwAA AAEAAAADAAAA5QEAAAMAAADRCgAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA /v8AAAUBAgAAAAAAAAAAAAAAAAAAAAAAAgAAAALVzdWcLhsQk5cIACss+a5EAAAABdXN1ZwuGxCT lwgAKyz5rkQBAAAAAQAADAAAAAEAAABoAAAADwAAAHAAAAAFAAAAgAAAAAYAAACIAAAAEQAAAJAA AAAXAAAAmAAAAAsAAACgAAAAEAAAAKgAAAATAAAAsAAAABYAAAC4AAAADQAAAMAAAAAMAAAA2wAA AAIAAADmBAAAHgAAAAgAAABIT01FAAAAAAMAAAAXAAAAAwAAAAYAAAADAAAAsAwAAAMAAADmFQsA CwAAAAAAAAALAAAAAAAAAAsAAAAAAAAACwAAAAAAAAAeEAAAAQAAAA8AAABPVEVMIELdTEfdTEVS 3QAMEAAAAgAAAB4AAAANAAAAS29udSBCYf5s/fD9AAMAAAABAAAAtAEAAAMAAAAAAAAAIAAAAAEA AAA4AAAAAgAAAEAAAAABAAAAAgAAAAwAAABfUElEX0hMSU5LUwACAAAA5gQAAEEAAABsAQAAEgAA AAMAAAALACYAAwAAAAkAAAADAAAAAAAAAAMAAAAFAAAAHwAAACQAAABtAGEAaQBsAHQAbwA6AHMA YQBsAGUAcwBAAGcAbwBsAGQAZQBuAHQAdQBsAGkAcABuAGkAYwBvAHMAaQBhAC4AYwBvAG0AAAAf AAAAAQAAAAAAEQADAAAAYwBFAAMAAAAGAAAAAwAAAAAAAAADAAAABQAAAB8AAAAjAAAAbQBhAGkA bAB0AG8AOgBpAG4AZgBvAEAAZwBvAGwAZABlAG4AdAB1AGwAaQBwAG4AaQBjAG8AcwBpAGEALgBj AG8AbQAAAAAAHwAAAAEAAAAAABEAAwAAAE8ASgADAAAAAwAAAAMAAAAAAAAAAwAAAAUAAAAfAAAA HgAAAG0AYQBpAGwAdABvADoAZwBvAGwAZABlAG4AdAB1AGwAaQBwAG4AaQBjAG8AcwBpAGEALgBj AG8AbQAAAB8AAAABAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAA AwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAAR AAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8A AAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAA AC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAAP7///87AAAA PAAAAD0AAAA+AAAAPwAAAEAAAABBAAAA/v///0MAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABK AAAASwAAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgA AABZAAAAWgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAA AGcAAABoAAAA/v///2oAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAAD+////cgAAAHMAAAB0AAAA dQAAAHYAAAB3AAAAeAAAAP7////9////ewAAAP7////+/////v//////////////UgBvAG8AdAAg AEUAbgB0AHIAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYA BQH//////////wMAAAAGCQIAAAAAAMAAAAAAAABGAAAAAAAAAAAAAAAAEOxxm8UKygF9AAAAgAAA AAAAAABEAGEAdABhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAACgACAf///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAADoAAAAAEAAAAAAAADEAVABhAGIAbABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAIBAQAAAAYAAAD/////AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAQgAAAIJMAAAAAAAAVwBvAHIAZABEAG8AYwB1AG0AZQBuAHQA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoAAgECAAAABQAAAP////8A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnIAAAAAAAAFAFMAdQBtAG0A YQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAC Af///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAAAAEAAA AAAAAAUARABvAGMAdQBtAGUAbgB0AFMAdQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBu AAAAAAAAAAAAAAA4AAIBBAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAcQAAAAAQAAAAAAAAAQBDAG8AbQBwAE8AYgBqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAgD///////////////8AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////wAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD+//////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////AQD+/wMKAAD///// BgkCAAAAAADAAAAAAAAARh4AAABNaWNyb3NvZnQgT2ZmaWNlIFdvcmQgQmVsZ2VzaQAKAAAATVNX b3JkRG9jABAAAABXb3JkLkRvY3VtZW50LjgA9DmycQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSAG8AbwB0ACAARQBu AHQAcgB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAFAf// ////////AwAAAAYJAgAAAAAAwAAAAAAAAEYAAAAAAAAAAAAAAADwkOscA3/KAX0AAACAAAAAAAAA AEQAYQB0AGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAKAAIB////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAOgAAAAAQAAAAAAAAMQBUAGEAYgBsAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAgEBAAAABgAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAABCAAAAgkwAAAAAAABXAG8AcgBkAEQAbwBjAHUAbQBlAG4AdAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgACAQIAAAAFAAAA/////wAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKcgAAAAAAAAEAAAACAAAAAwAAAAQA AAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAA ABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAA IQAAACIAAAAjAAAAJAAAACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAv AAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAAP7///87AAAAPAAAAD0A AAA+AAAAPwAAAEAAAABBAAAA/v///0MAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAA AEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAA WgAAAFsAAABcAAAAXQAAAF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABo AAAA/v///2oAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAAD+//////////////////////////// ///////////////////////////////////+/////v///4kAAAD9/////f///4IAAACDAAAAhAAA AIUAAACGAAAAhwAAAIgAAAD+/////v////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////+/wAABQECAAAAAAAAAAAA AAAAAAAAAAACAAAAAtXN1ZwuGxCTlwgAKyz5rkQAAAAF1c3VnC4bEJOXCAArLPmuRAEAAAABAAAM AAAAAQAAAGgAAAAPAAAAcAAAAAUAAACAAAAABgAAAIgAAAARAAAAkAAAABcAAACYAAAACwAAAKAA AAAQAAAAqAAAABMAAACwAAAAFgAAALgAAAANAAAAwAAAAAwAAADbAAAAAgAAAOYEAAAeAAAACAAA AEhPTUUAAAAAAwAAABcAAAADAAAABgAAAAMAAACwDAAAAwAAAOYVCwALAAAAAAAAAAsAAAAAAAAA CwAAAAAAAAALAAAAAAAAAB4QAAABAAAADwAAAE9URUwgQt1MR91MRVLdAAwQAAACAAAAHgAAAA0A AABLb251IEJh/mz98P0AAwAAAAEAAAC0AQAAAwAAAAAAAAAgAAAAAQAAADgAAAACAAAAQAAAAAEA AAACAAAADAAAAF9QSURfSExJTktTAAIAAADmBAAAQQAAAGwBAAASAAAAAwAAAAsAJgADAAAACQAA AAMAAAAAAAAAAwAAAAUAAAAfAAAAJAAAAG0AYQBpAGwAdABvADoAcwBhAGwAZQBzAEAAZwBvAGwA ZABlAG4AdAB1AGwAaQBwAG4AaQBjAG8AcwBpAGEALgBjAG8AbQAAAB8AAAABAAAAAAARAAMAAABj AEUAAwAAAAYAAAADAAAAAAAAAAMAAAAFAAAAHwAAACMAAABtAGEAaQBsAHQAbwA6AGkAbgBmAG8A QABnAG8AbABkAGUAbgB0AHUAbABpAHAAbgBpAGMAbwBzAGkAYQAuAGMAbwBtAAAAAAAfAAAAAQAA AAAAEQADAAAATwBKAAMAAAADAAAAAwAAAAAAAAADAAAABQAAAB8AAAAeAAAAbQBhAGkAbAB0AG8A OgBnAG8AbABkAGUAbgB0AHUAbABpAHAAbgBpAGMAbwBzAGkAYQAuAGMAbwBtAAAAHwAAAAEAAAAA ABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQBTAHUAbQBtAGEAcgB5AEkAbgBmAG8A cgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAgH///////////////8A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpAAAAABAAAAAAAAAFAEQAbwBjAHUA bQBlAG4AdABTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAOAAC AQQAAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAEAAA AAAAAAEAQwBvAG0AcABPAGIAagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAASAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= ------=_NextPart_000_00D5_01CA9129.9BE8EAA0 Content-Type: image/jpeg; name="ODA RESIM.JPG" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="ODA RESIM.JPG" /9j/4AAQSkZJRgABAQEAYABgAAD/4T1ZRXhpZgAASUkqAAgAAAASAA4BAgAgAAAA5gAAAA8BAgAF AAAABgEAABABAgAHAAAADAEAABIBAwABAAAAAQAgyBoBBQABAAAAFAEAABsBBQABAAAAHAEAACgB AwABAAAAAgAAADIBAgAUAAAAJAEAABMCAwABAAAAAgAh1mmHBAABAAAAVAEAAAGkAwABAAAAAAA8 2AKkAwABAAAAAACyhAOkAwABAAAAAAABWgakAwABAAAAAAAb2gikAwABAAAAAAAI4wmkAwABAAAA AAABoQqkAwABAAAAAAAb1KXEBwAcAAAAOAEAANoIAAAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgAFNPTlkAZkRTQy1XNQBkSAAAAAEAAABIAAAAAQAAADIwMDk6MTA6MDcgMTU6MTg6MDUA UHJpbnRJTQAwMzAwAAACAAIAAQAAAAEBAQAAABYAmoIFAAEAAABiAgAAnYIFAAEAAABqAgAAIogD AAEAAAACAADlJ4gDAAEAAABkAAHhAJAHAAQAAAAwMjIwA5ACABQAAAByAgAABJACABQAAACGAgAA AZEHAAQAAAABAgMAApEFAAEAAACaAgAABJIKAAEAAACiAgAABZIFAAEAAACqAgAAB5IDAAEAAAAF AA4ACJIDAAEAAAAAAE0BCZIDAAEAAABPAD8ACpIFAAEAAACyAgAAfJIHACAGAAC6AgAAAKAHAAQA AAAwMTAwAaADAAEAAAABAD8AAqAEAAEAAAAgCgAAA6AEAAEAAACYBwAAAKMHAAEAAAADAFkBAaMH AAEAAAABrD8AAAAAAAoAAABQAAAAHAAAAAoAAAAyMDA5OjEwOjA3IDE1OjE4OjA1ADIwMDk6MTA6 MDcgMTU6MTg6MDUACAAAAAEAAAAAAAAACgAAADAAAAAQAAAATwAAAAoAAABTT05ZIERTQyAAAAAJ AAAgBwABAAAAAAAAAAGQBwCUAAAAQAMAAAKQBwDIAAAA1AMAAAOQBwDIAAAAnAQAAASQBwB8AAAA ZAUAAAWQBwB6AAAA4AUAAAaQBwD8AAAAWgYAAAeQBwDIAAAAVgcAAAiQBwDIAAAAHggAAAGPBbUA fQBeACMAAAFDzGIBQ8xiAOq/AAAAAO8AAAAAAAAA7wCH/t7/AADYAABdUzDFAIrgSn1o53IAAACK AAAAoYgAiH2Ks4gAiH1wAFYAAABpKQHFAKAAAADBAAAbOwAAVqEAANdOiH2IAHAAAFUI+14kQOAA ALvRAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAABAAAAACQAioogAAAAbnDncGxwbHAMcAwAbueK zYIgeYraAAAAAHBNitoAAACKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIcIOUoAAC8A5wDn/QAAAAAAZ2wzAABRXpUAAAAA AAHcc0YAbACIANMALwHkAJgBpAEfAacBAAGDAQABAAEAAQD+b/zJEKndgr29vb29vQAA7HrqiijI 6m9whDCbcCjXyP9wAOMAW6n8O2EtfQ6KOAy1APgA7gCkAF1wAAAAAAAAAAAAcAAAAAAAAAAAAHAA AAAAAAAAAABwAL29vb29J8XdBzORM5FYB83fAACNAeoAAEfuR+4nxe8QmYfgOOA4J8UBAAAAAAAA AAAB5wsEABu9vb29vb29vb29vb1wthsAAdzcvF8QAQEBQgFCAfcBQgE0ATQBNAE07AAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAElgRPAHUA1gSWBE8AdQDWAAAAAUJ8AAFC2gAB97wAAUJR AAFCfAABQtoAAfe8AAFCUQAACDwAAAgBAAAIwQAACHkAAAAAAAAA5wEBAAEAAAAAACAAAAAAAAAA AAAAAAAA2AAAAAAACAAAAAEAAAAIAAAAAAABAAEAAAAAAEAAQABAAAD/AAAAAAAAAAAAAAAAAAAA ABMBAAAAAP//AP8AAAAAAAAAAP//AAD//wAAzQD/AAAAAAAAAAAAAAAAAAAAAAAAAQAAAV7lAUYB 9gFgCK1WKgCAXk8btQCjAJAbFRtfADQbvEBEAcIB1wjKCLEAhgANAeIIlQFeAL8B1wDrAKQAawE1 CIgI7wiVAWgA0QjECHUBtQHvAHcA4AASAJ8AwgDDAAYA6QB02G8AtQBJAFUI3FbzAL/YCQgqABgA 3QhnG5UAHwgZG+gAKgARCBoB3gBEAG0AgAAJAHMAjgBfANAAtwC6AG4AEADzAEoApACCAF8AYQCW AEcAUQCIAFMADABpAIEAUQDFAIHsMV4zfRxwWHDbfUPYPRvqASwbWwjFG9wbm0BEQDcbHQjyAZsB mAAuAAAAAAAAAAAAAAAAAQDnGM2+BK/Yzn0BQIEbuRvkG8PnGASJVnjqcs3C6pTqiFbL57MAo+c9 6ogE116i2JN9SH3NQBxAk+daBK9WM1YK6nTYgef92GRAfxtTCCEIrQjRCKHYDl5GDj3nUARc5x8O X153fUMAo9jL57fYlECJQKAbGRufG4Mb4NhcXuxe+A6r5/BpXoHmiGOKvYq9ir2KvYq9ir1pXiAv vjPX3ru+gUC+VCDIaaUAo4racIhwwbYztpxpFYgbiLUgeYraiqaKcor4cFEBAAAAAIyRaACMRvMA K8IqAFrcEAAAqC4AlSHWAC+VVwDN/QEAUWZIAAC+pwBuZQEAUzzYAAfO2wCTzUwAALKEG6UbJgGz Gz8BrwFaAAsBzBswG3cBeRvaCI4IVwAsCOIBIgjjAB4BNAGhAcwAQgGhCFYIMgB6AYkboRvUAR0b fghPCDkBuwjiARABHgA6AXQBVAFGAHYB3X19G+UbEH0vCHcB+gHoCL0ADwAdAB8AFwBJAOUAYgAR AX4BWAAZAeEBwwG6AJcBFQoAAwEDAAEAAAAGAGMADwECAAUAAABYCQAAEAECAAcAAABeCQAAEgED AAEAAAABAGcAGgEFAAEAAABmCQAAGwEFAAEAAABuCQAAKAEDAAEAAAACAGsAMgECABQAAAB2CQAA AQIEAAEAAACKCQAAAgIEAAEAAADHMwAAAAAAAFNPTlkAAERTQy1XNQAASAAAAAEAAABIAAAAAQAA ADIwMDk6MTA6MDcgMTU6MTg6MDUA/9j/2wCEAAEBAQEBAQEBAQEBAQECAgMCAgICAgQDAwIDBQQF BQUEBAQFBgcGBQUHBgQEBgkGBwgICAgIBQYJCgkICgcICAgBAQEBAgICBAICBAgFBAUICAgICAgI CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICP/EAaIAAAEFAQEBAQEB AAAAAAAAAAABAgMEBQYHCAkKCxAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKB kaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZn aGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT 1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6AQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgsR AAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDTh JfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJ ipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz 9PX29/j5+v/AABEIAHgAoAMBIQACEQEDEQH/2gAMAwEAAhEDEQA/APTPhxoSXN7bRCFSH46da+rf C2ip9htwYVyoKHI9CR/Sv89cnqr63WT7fqf3XmlP9zBnpVto0SJ/qU5/WpDZRLkBEHfpX0tKd3qe BURSktEIP7tM5/OqLWUeOUUfUV69BnLPcpPZJnhE9c4qvJZx9TGuc13rzMG76lU2cY3fIp5qpJax ZPyLnOenWplqF76ka2sXGUQ9+lfyg/8ABSWztz+0z8SfMSPZ/wAJHqBO7/dgrqyyTVVtG8IqUlc+ NNKsbCVcNHaPCcA5AI3duvevtD9jLSDH8evDkotyqJYXzE4wB+6x/WuTNsQ+SUZM+wpUF7OUkj+n jTpLe20Tw4Qkfy2kDfkoNfzZ6LBHO95dBF2zXdzPnHXdM7f1ryskXLSm/T9TwK+s7nVpaJj5kX8q 6jTtNiNnbnyweCf1r1FJ2ucVXc1YtNTk+UFH86lTTY1B+QflWcpMhO5+4Hwh0zzNW0zKjHmqT271 9COW0PV/EunsFjS21S5hGeAMOT/I1+UZFW5s2rUuvJf/AMmR9lm9O2FhN9/0Jf8AhI3YHyZklXuV O4fiRWS/jGxguY4b3U7G1dmwBJMqE/gTmv0fD0IJXv8AifKVea9rHWQ3UcucMDmpGMZ6YzXVC6ep yt31Kj+XknK465zVGZ0wcd67Itswe5nu6knOKquy85Oe+fWpncaYxSnqD6571+Rf7Tf/AAS81/8A aJ+KXif4h2vxx8M+EbLUdTuNQW0m0Oa4kiEgj+QuJFBI8s8jrmsIY10Z81rnZhrc3vXsfOur/wDB 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 5QKeGyxIGRwTgc45rXsEuBdSRxSR3u9QGkLBUXPXg/f9cnqPWvmk25XR7+6uVtWlh014neTTliaH y2aQ53NnHIAyGweh4Fc4moQG2a1lZJrVBxDwSydei8BcEtk46jHSqlKzaHG7VzLnM1zptxIqLp6M pkRFIYBACMsTyfTgk9favNpL/UI2jbfcW1huI3CMu4OO2O3LcZyOaUpbdDaLT3LMNwlwl7Jdahby 28e1JJyxQsP90/N6cdfavOdc1XSre0uZIriV7PP3E4wc4JB6jn0x0PNaJX1fUdPmctD/2f/bAEMA CAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicgIiwjHBwoNyksMDE0NDQfJzk9 ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAwoEDQMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAA AAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGR oQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdo aWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJ Cgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVi ctEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqC g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl 5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AIQKcBQBTwK8NntIAtSKtAHNPUVmykPRalC57U1B UwFQxkRWpYF+U/WginwD7wrSluRLYkC04LSgU4CtzMaFp22lApwFIY3bS7afilAoAYFpQvtTwKMU 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 DwMcYFBLHJPctbiA3kn2cZwkZC5z15A3H6Zx