<div>Please find my response below</div>
<div> </div>
<div class="gmail_quote">On Tue, Jan 18, 2011 at 1:57 PM, Dave Chinner <span dir="ltr">&lt;<a href="mailto:david@fromorbit.com">david@fromorbit.com</a>&gt;</span> wrote:<br>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">
<div class="im">On Mon, Jan 17, 2011 at 09:12:54PM +0900, Ajeet Yadav wrote:<br>&gt; Kernel: 2.6.30.9, XFS backported from 2.6.34, xfsprogs-3.0.5<br>&gt;<br>&gt; I used a script<br>&gt; 1. create some file, directories, symlinks<br>
&gt; 2. unmount the file system<br>&gt; 3. run xfs_bd with blocktrash<br>&gt; 4. xfs_xfsrepair -L<br>&gt; 5. list &quot;ls -lR&quot;<br>&gt; 6. remove all file and directory &quot;rm -rf *<br><br></div>OK, so you are effectively corrupting random blocks by introducing<br>
random bit errors in the blocks. No surprise that some errors are<br>not being detected - what is the blocktrash command that you are<br>using?<br></blockquote>
<div><span lang="EN"></span> </div>
<div><span lang="EN">xfs_db -x -c blockget -c &quot;blocktrash -s 12345 -n 256 -x 1 -y 1024 -3&quot; /dev/sda1</span></div>
<div><span lang="EN"> </span></div>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">
<div class="im"><br>&gt; Often during testing I get the below backtrace from kernel during ls, rm<br>&gt; even though I already run xfs_repair on it.<br>&gt; Is it related to xfsrepair or xfs ?. I think xfs_repair must have detected<br>
&gt; this problem and corrected it.<br><br></div>xfs_repair is not checking the di_flags field in the inode for<br>sanity, hence having a wrong flag set is going unnoticed.<br></blockquote>
<div> </div>
<div>ok</div>
<div> </div>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">
<div class="im"><br>&gt; There is similar problem already reported by<br>&gt; <a href="http://oss.sgi.com/archives/xfs/2010-06/msg00349.html" target="_blank">http://oss.sgi.com/archives/xfs/2010-06/msg00349.html</a><br><br>
</div>Similar error message (xfs_iformt found an inode corruption), but<br>that one is a completely different problem.<br><br>Does the patch below (compile tested only) detect the bad inode?<br></blockquote>
<div> </div>
<div>Yes I have tested it, It seems to work fine,</div>
<div>I did not find this patch in mainline xfsprogs git, also I need to modify the patch somewhat.</div>
<div>dino-&gt;di_flags  ===================&gt; dinoc-&gt;di_flags</div>
<div>because dino is not having any member named di_flags in xfsprogs-3.0.5, so I used dinoc instead.</div>
<div> </div>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote"><br>Cheers,<br><br>Dave.<br>--<br>Dave Chinner<br><a href="mailto:david@fromorbit.com">david@fromorbit.com</a><br>
<br>xfs_repair: validate inode di_flags field<br><br>xfs_repair is not validating the di_flags field in the inode for<br>sanity. Block fuzzing indicates that we are not picking situations<br>like the RT bit being set on filesystems without realtime devices.<br>
<br>Signed-off-by: Dave Chinner &lt;<a href="mailto:dchinner@redhat.com">dchinner@redhat.com</a>&gt;<br>---<br> repair/dinode.c |   62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> 1 files changed, 62 insertions(+), 0 deletions(-)<br>
<br>diff --git a/repair/dinode.c b/repair/dinode.c<br>index 2fa850d..e05d4e0 100644<br>--- a/repair/dinode.c<br>+++ b/repair/dinode.c<br>@@ -2519,6 +2519,68 @@ process_dinode_int(xfs_mount_t *mp,<br>               goto clear_bad_out;<br>
       }<br><br>+       /*<br>+        * check that we only have valid flags set, and those that are set make<br>+        * sense.<br>+        */<br>+       if (dino-&gt;di_flags) {<br>+               uint16_t flags = be16_to_cpu(dino-&gt;di_flags);<br>
+<br>+               if (flags &amp; ~XFS_DIFLAG_ANY) {<br>+                       do_warn(_(&quot;Bad flags set in inode %llu&quot;), lino);<br>+                       flags &amp;= ~XFS_DIFLAG_ANY;<br>+               }<br>
+<br>+               if (flags &amp; (XFS_DIFLAG_REALTIME | XFS_DIFLAG_RTINHERIT)) {<br>+                       /* need an rt-dev! */<br>+                       if (!rt_name) {<br>+                               do_warn(_(<br>
+       &quot;inode %llu has RT flag set but there is no RT device&quot;), lino);<br>+                               flags &amp;= ~(XFS_DIFLAG_REALTIME |<br>+                                               XFS_DIFLAG_RTINHERIT);<br>
+                       }<br>+               }<br>+               if (flags &amp; XFS_DIFLAG_NEWRTBM_BIT) {<br>+                       /* must be a rt bitmap inode */<br>+                       if (lino != mp-&gt;m_sb.sb_rbmino) {<br>
+                               do_warn(_(&quot;inode %llu not rt bitmap&quot;), lino);<br>+                               flags &amp;= ~XFS_DIFLAG_NEWRTBM_BIT;<br>+                       }<br>+               }<br>+               if (flags &amp; (XFS_DIFLAG_RTINHERIT |<br>
+                            XFS_DIFLAG_EXTSZINHERIT |<br>+                            XFS_DIFLAG_PROJINHERIT |<br>+                            XFS_DIFLAG_NOSYMLINKS)) {<br>+                       /* must be a directory */<br>
+                       if (di_mode &amp;&amp; !S_ISDIR(di_mode)) {<br>+                               do_warn(_(<br>+                       &quot;directory flags set on non-directory inode %llu&quot;),<br>+                                       lino);<br>
+                               flags &amp;= ~(XFS_DIFLAG_RTINHERIT |<br>+                                               XFS_DIFLAG_EXTSZINHERIT |<br>+                                               XFS_DIFLAG_PROJINHERIT |<br>
+                                               XFS_DIFLAG_NOSYMLINKS);<br>+                       }<br>+               }<br>+               if (flags &amp; (XFS_DIFLAG_REALTIME | XFS_XFLAG_EXTSIZE)) {<br>+                       /* must be a file */<br>
+                       if (di_mode &amp;&amp; !S_ISREG(di_mode)) {<br>+                               do_warn(_(<br>+                       &quot;file flags set on non-file inode %llu&quot;), lino);<br>+                               flags &amp;= ~(XFS_DIFLAG_REALTIME |<br>
+                                               XFS_XFLAG_EXTSIZE);<br>+                       }<br>+               }<br>+               if (!verify_mode &amp;&amp; flags != be16_to_cpu(dino-&gt;di_flags)) {<br>+                       if (!no_modify) {<br>
+                               do_warn(_(&quot;, fixing bad flags.\n&quot;));<br>+                               dino-&gt;di_flags = cpu_to_be16(flags);<br>+                               *dirty = 1;<br>+                       } else<br>
+                               do_warn(_(&quot;, would fix bad flags.\n&quot;));<br>+               }<br>+       }<br>+<br>       if (verify_mode)<br>               return retval;<br><br></blockquote></div><br>