<div>Hello Dave,</div>
<div>Thank you for patch "xfs_repair: validate inode di_flags field" it works fine after a minor modifications "dino" to "dinoc", I wish to know when this will be available in mainline xfsprogs. Otherwise we need to maintain them separately. <br>
<br></div>
<div class="gmail_quote">On Wed, Jan 19, 2011 at 10:06 AM, Ajeet Yadav <span dir="ltr"><<a href="mailto:ajeet.yadav.77@gmail.com">ajeet.yadav.77@gmail.com</a>></span> wrote:<br>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">
<div>Please find my response below</div>
<div> </div>
<div class="gmail_quote">
<div class="im">On Tue, Jan 18, 2011 at 1:57 PM, Dave Chinner <span dir="ltr"><<a href="mailto:david@fromorbit.com" target="_blank">david@fromorbit.com</a>></span> wrote:<br>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">
<div>On Mon, Jan 17, 2011 at 09:12:54PM +0900, Ajeet Yadav wrote:<br>> Kernel: 2.6.30.9, XFS backported from 2.6.34, xfsprogs-3.0.5<br>><br>> I used a script<br>> 1. create some file, directories, symlinks<br>
> 2. unmount the file system<br>> 3. run xfs_bd with blocktrash<br>> 4. xfs_xfsrepair -L<br>> 5. list "ls -lR"<br>> 6. remove all file and directory "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>
<div><span lang="EN">xfs_db -x -c blockget -c "blocktrash -s 12345 -n 256 -x 1 -y 1024 -3" /dev/sda1</span></div>
<div class="im">
<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><br>> Often during testing I get the below backtrace from kernel during ls, rm<br>> even though I already run xfs_repair on it.<br>> Is it related to xfsrepair or xfs ?. I think xfs_repair must have detected<br>
> 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>
<div>ok</div>
<div class="im">
<div> </div>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">
<div><br>> There is similar problem already reported by<br>> <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>
<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->di_flags ===================> dinoc->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></div>
<div class="h5">
<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" target="_blank">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 <<a href="mailto:dchinner@redhat.com" target="_blank">dchinner@redhat.com</a>><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->di_flags) {<br>+ uint16_t flags = be16_to_cpu(dino->di_flags);<br>
+<br>+ if (flags & ~XFS_DIFLAG_ANY) {<br>+ do_warn(_("Bad flags set in inode %llu"), lino);<br>+ flags &= ~XFS_DIFLAG_ANY;<br>+ }<br>
+<br>+ if (flags & (XFS_DIFLAG_REALTIME | XFS_DIFLAG_RTINHERIT)) {<br>+ /* need an rt-dev! */<br>+ if (!rt_name) {<br>+ do_warn(_(<br>
+ "inode %llu has RT flag set but there is no RT device"), lino);<br>+ flags &= ~(XFS_DIFLAG_REALTIME |<br>+ XFS_DIFLAG_RTINHERIT);<br>
+ }<br>+ }<br>+ if (flags & XFS_DIFLAG_NEWRTBM_BIT) {<br>+ /* must be a rt bitmap inode */<br>+ if (lino != mp->m_sb.sb_rbmino) {<br>
+ do_warn(_("inode %llu not rt bitmap"), lino);<br>+ flags &= ~XFS_DIFLAG_NEWRTBM_BIT;<br>+ }<br>+ }<br>+ if (flags & (XFS_DIFLAG_RTINHERIT |<br>
+ XFS_DIFLAG_EXTSZINHERIT |<br>+ XFS_DIFLAG_PROJINHERIT |<br>+ XFS_DIFLAG_NOSYMLINKS)) {<br>+ /* must be a directory */<br>
+ if (di_mode && !S_ISDIR(di_mode)) {<br>+ do_warn(_(<br>+ "directory flags set on non-directory inode %llu"),<br>+ lino);<br>
+ flags &= ~(XFS_DIFLAG_RTINHERIT |<br>+ XFS_DIFLAG_EXTSZINHERIT |<br>+ XFS_DIFLAG_PROJINHERIT |<br>
+ XFS_DIFLAG_NOSYMLINKS);<br>+ }<br>+ }<br>+ if (flags & (XFS_DIFLAG_REALTIME | XFS_XFLAG_EXTSIZE)) {<br>+ /* must be a file */<br>
+ if (di_mode && !S_ISREG(di_mode)) {<br>+ do_warn(_(<br>+ "file flags set on non-file inode %llu"), lino);<br>+ flags &= ~(XFS_DIFLAG_REALTIME |<br>
+ XFS_XFLAG_EXTSIZE);<br>+ }<br>+ }<br>+ if (!verify_mode && flags != be16_to_cpu(dino->di_flags)) {<br>+ if (!no_modify) {<br>
+ do_warn(_(", fixing bad flags.\n"));<br>+ dino->di_flags = cpu_to_be16(flags);<br>+ *dirty = 1;<br>+ } else<br>
+ do_warn(_(", would fix bad flags.\n"));<br>+ }<br>+ }<br>+<br> if (verify_mode)<br> return retval;<br><br></blockquote></div></div></div><br>
</blockquote></div><br>