<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>
<!--
body
        {line-height:1.5}
blockquote
        {margin-top:0px;
        margin-bottom:0px;
        margin-left:0.5em}
p
        {margin-top:0px;
        margin-bottom:0px}
body
        {font-size:16pt;
        font-family:微软雅黑;
        color:rgb(0,128,0);
        line-height:1.5}
-->
</style>
</head>
<body>
<div>
<pre><span style="color:rgb(0,0,0); font-family:微软雅黑; font-size:16pt; line-height:1.5; background-color:window">I think the patch has a&nbsp;</span><span class="op_dict3_highlight" style="color:rgb(0,0,0); font-family:微软雅黑; font-size:16pt; line-height:1.5; background-color:window">potential&nbsp;</span><span style="color:rgb(0,0,0); font-family:微软雅黑; font-size:16pt; line-height:1.5; background-color:window">risk.&nbsp;</span><span style="color:rgb(0,0,0); font-family:微软雅黑; font-size:16pt; line-height:1.5; background-color:window">as follows</span></pre>
<pre><span style="color:rgb(0,0,0); font-family:微软雅黑; font-size:16pt; background-color:window; line-height:19px">Callback: ocfs2_write_end_nolock-&gt;</span><span style="color:rgb(0,0,0); font-family:微软雅黑; font-size:16pt; line-height:1.5; background-color:window">ocfs2_journal_access_di-&gt;</span><span style="color:rgb(0,0,0); font-family:微软雅黑; font-size:16pt; line-height:1.5; background-color:window">__ocfs2_journal_access-&gt;</span><span style="color:rgb(0,0,0); font-family:微软雅黑; font-size:16pt; line-height:1.5; background-color:window">buffer_uptodate</span></pre>
</div>
<div><font color="#000000"><span style="line-height:19px">So it i</span><span style="line-height:1.5">ncreases the probability&nbsp;</span><span style="line-height:19px">triggering BUG in the &nbsp;</span><span style="line-height:19px">__ocfs2_journal_access().<span style="background-color:rgb(255,255,255)">&nbsp;&nbsp;</span></span></font></div>
<div><font color="#000000"><span style="line-height:19px"><span style="background-color:rgb(255,255,255)"><br>
</span></span></font></div>
<div><font color="#000000"><span style="background-color:rgb(255,255,255)"><span style="line-height:1.5">In addition, t</span><span style="line-height:1.5">est res</span></span></font><span style="background-color:window; color:rgb(0,0,0); font-size:16pt; line-height:1.5">ults
 have been confirmed.</span></div>
<div style="font-size:16px">
<pre style="font-size:21px; line-height:32px"><font color="#000000" face="微软雅黑">Finally, any feedback about this process (positive or negative) would be  greatly appreciated.</font></pre>
</div>
<blockquote style="margin-top:0px; margin-bottom:0px; margin-left:0.5em">
<div>&nbsp;</div>
<div style="border:none; border-top:solid #B5C4DF 1.0pt; padding:3.0pt 0cm 0cm 0cm">
<div style="padding-right:8px; padding-left:8px; font-size:12px; font-family:tahoma; color:#000000; background:#efefef; padding-bottom:8px; padding-top:8px">
<div><b>From:</b>&nbsp;<a href="mailto:ocfs2-devel-bounces@oss.oracle.com">ocfs2-devel-bounces@oss.oracle.com</a></div>
<div><b>Date:</b>&nbsp;2015-05-31&nbsp;03:00</div>
<div><b>To:</b>&nbsp;<a href="mailto:ocfs2-devel@oss.oracle.com">ocfs2-devel@oss.oracle.com</a></div>
<div><b>Subject:</b>&nbsp;Ocfs2-devel Digest, Vol 135, Issue 28</div>
</div>
</div>
<div>
<div class="FoxDiv20150611104948884674">
<p><font size="2">Send Ocfs2-devel mailing list submissions to<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocfs2-devel@oss.oracle.com<br>
<br>
To subscribe or unsubscribe via the World Wide Web, visit<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://oss.oracle.com/mailman/listinfo/ocfs2-devel">https://oss.oracle.com/mailman/listinfo/ocfs2-devel</a><br>
or, via email, send a message with subject or body 'help' to<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocfs2-devel-request@oss.oracle.com<br>
<br>
You can reach the person managing the list at<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocfs2-devel-owner@oss.oracle.com<br>
<br>
When replying, please edit your Subject line so it is more specific<br>
than &quot;Re: Contents of Ocfs2-devel digest...&quot;<br>
<br>
<br>
Today's Topics:<br>
<br>
&nbsp;&nbsp; 1. [PATCH V2] ocfs2: call ocfs2_journal_access_di() before<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocfs2_journal_dirty() in ocfs2_write_end_nolock() (yangwenfang)<br>
<br>
<br>
----------------------------------------------------------------------<br>
<br>
Message: 1<br>
Date: Sat, 30 May 2015 18:08:43 &#43;0800<br>
From: yangwenfang &lt;vicky.yangwenfang@huawei.com&gt;<br>
Subject: [Ocfs2-devel] [PATCH V2] ocfs2: call<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocfs2_journal_access_di() before ocfs2_journal_dirty() in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocfs2_write_end_nolock()<br>
To: Andrew Morton &lt;akpm@linux-foundation.org&gt;, &lt;mfasheh@suse.com&gt;<br>
Cc: ocfs2-devel@oss.oracle.com<br>
Message-ID: &lt;55698C2B.9000801@huawei.com&gt;<br>
Content-Type: text/plain; charset=&quot;ISO-8859-1&quot;<br>
<br>
1.After we call ocfs2_journal_access_di() in ocfs2_write_begin(),<br>
jbd2_journal_restart() may also be called, in this function<br>
transaction A's t_updates-- and obtains a new transaction B.<br>
If jbd2_journal_commit_transaction() is happened to commit<br>
transaction A, when t_updates==0, it will continue to complete<br>
commit and unfile buffer.<br>
<br>
So when jbd2_journal_dirty_metadata(), the handle is pointed a new<br>
transaction B, and the buffer head's journal head is already freed,<br>
jh-&gt;b_transaction == NULL, jh-&gt;b_next_transaction == NULL,<br>
it returns EINVAL, So it triggers the BUG_ON(status).<br>
<br>
thread 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jbd2<br>
ocfs2_write_begin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jbd2_journal_commit_transaction<br>
ocfs2_write_begin_nolock<br>
&nbsp; ocfs2_start_trans<br>
&nbsp;&nbsp;&nbsp; jbd2__journal_start(t_updates&#43;1,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transaction A)<br>
&nbsp;&nbsp;&nbsp; ocfs2_journal_access_di<br>
&nbsp;&nbsp;&nbsp; ocfs2_write_cluster_by_desc<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocfs2_mark_extent_written<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocfs2_change_extent_flag<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocfs2_split_extent<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocfs2_extend_rotate_transaction<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jbd2_journal_restart<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (t_updates-1,transaction B) t_updates==0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __jbd2_journal_refile_buffer<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (jh-&gt;b_transaction = NULL)<br>
ocfs2_write_end<br>
ocfs2_write_end_nolock<br>
&nbsp;&nbsp;&nbsp; ocfs2_journal_dirty<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jbd2_journal_dirty_metadata(bug)<br>
&nbsp;&nbsp; ocfs2_commit_trans<br>
<br>
2. In ext4, I found that: jbd2_journal_get_write_access() called by<br>
ext4_write_end.<br>
ext4_write_begin<br>
&nbsp;&nbsp;&nbsp; ext4_journal_start<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __ext4_journal_start_sb<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ext4_journal_check_start<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jbd2__journal_start<br>
<br>
ext4_write_end<br>
&nbsp;&nbsp;&nbsp; ext4_mark_inode_dirty<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ext4_reserve_inode_write<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ext4_journal_get_write_access<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jbd2_journal_get_write_access<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ext4_mark_iloc_dirty<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ext4_do_update_inode<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ext4_handle_dirty_metadata<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jbd2_journal_dirty_metadata<br>
<br>
3.So I think we should put ocfs2_journal_access_di before<br>
ocfs2_journal_dirty in the ocfs2_write_end.<br>
and it works well after my modification.<br>
<br>
Signed-off-by: vicky &lt;vicky.yangwenfang@huawei.com&gt;<br>
---<br>
&nbsp;fs/ocfs2/aops.c | 16 &#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;-----<br>
&nbsp;1 file changed, 11 insertions(&#43;), 5 deletions(-)<br>
<br>
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c<br>
index f906a25..f3d7e52 100644<br>
--- a/fs/ocfs2/aops.c<br>
&#43;&#43;&#43; b/fs/ocfs2/aops.c<br>
@@ -2176,10 &#43;2176,7 @@ try_again:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ret)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto out_commit;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * We don't want this to fail in ocfs2_write_end(), so do it<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * here.<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>
&#43;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = ocfs2_journal_access_di(handle, INODE_CACHE(inode), wc-&gt;w_di_bh,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OCFS2_JOURNAL_ACCESS_WRITE);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ret) {<br>
@@ -2336,7 &#43;2333,7 @@ int ocfs2_write_end_nolock(struct address_space *mapping,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; loff_t pos, unsigned len, unsigned copied,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; struct page *page, void *fsdata)<br>
&nbsp;{<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i, ret;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned from, to, start = pos &amp; (PAGE_CACHE_SIZE - 1);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct inode *inode = mapping-&gt;host;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct ocfs2_super *osb = OCFS2_SB(inode-&gt;i_sb);<br>
@@ -2345,6 &#43;2342,14 @@ int ocfs2_write_end_nolock(struct address_space *mapping,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handle_t *handle = wc-&gt;w_handle;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct page *tmppage;<br>
<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = ocfs2_journal_access_di(handle, INODE_CACHE(inode), wc-&gt;w_di_bh,<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OCFS2_JOURNAL_ACCESS_WRITE);<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ret) {<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; copied = ret;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mlog_errno(ret);<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto out;<br>
&#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&#43;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (OCFS2_I(inode)-&gt;ip_dyn_features &amp; OCFS2_INLINE_DATA_FL) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocfs2_write_end_inline(inode, pos, len, &amp;copied, di, wc);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto out_write_size;<br>
@@ -2400,6 &#43;2405,7 @@ out_write_size:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocfs2_update_inode_fsync_trans(handle, inode, 1);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocfs2_journal_dirty(handle, wc-&gt;w_di_bh);<br>
<br>
&#43;out:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* unlock pages before dealloc since it needs acquiring j_trans_barrier<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * lock, or it will cause a deadlock since journal commit threads holds<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * this lock and will ask for the page lock when flushing the data.<br>
--<br>
1.7.12.4<br>
<br>
<br>
<br>
<br>
------------------------------<br>
<br>
_______________________________________________<br>
Ocfs2-devel mailing list<br>
Ocfs2-devel@oss.oracle.com<br>
<a href="https://oss.oracle.com/mailman/listinfo/ocfs2-devel">https://oss.oracle.com/mailman/listinfo/ocfs2-devel</a><br>
<br>
End of Ocfs2-devel Digest, Vol 135, Issue 28<br>
********************************************<br>
</font></p>
</div>
</div>
</blockquote>
<span style="font-size:7.5pt; font-family:华文细黑; color:gray"><span lang="EN-US">-------------------------------------------------------------------------------------------------------------------------------------<br>
</span>本邮件及其附件含有杭州华三通信技术有限公司的保密信息,仅限于发送给上面地址中列出<span lang="EN-US"><br>
</span>的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制、<span lang="EN-US"><br>
</span>或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本<span lang="EN-US"><br>
</span>邮件!<span lang="EN-US"><br>
</span></span><span lang="EN-US" style="font-size:7.5pt; font-family:&quot;Arial&quot;,&quot;sans-serif&quot;; color:gray">This e-mail and its attachments contain confidential information from H3C, which is
<br>
intended only for the person or entity whose address is listed above. Any use of the
<br>
information contained herein in any way (including, but not limited to, total or partial
<br>
disclosure, reproduction, or dissemination) by persons other than the intended <br>
recipient(s) is prohibited. If you receive this e-mail in error, please notify the sender
<br>
by phone or email immediately and delete it!</span>
</body>
</html>