XFS internal error xfs_iformat(realtime) even after xfs_repair.
Ajeet Yadav
ajeet.yadav.77 at gmail.com
Mon Jan 31 19:26:34 CST 2011
Hello Dave,
Thank you for patch "xfs_repair: validate inode di_flags field" it works
fine after a minor modifications "dino" to "dinoc", I wish to know when this
will be available in mainline xfsprogs. Otherwise we need to maintain them
separately.
On Wed, Jan 19, 2011 at 10:06 AM, Ajeet Yadav <ajeet.yadav.77 at gmail.com>wrote:
> Please find my response below
>
> On Tue, Jan 18, 2011 at 1:57 PM, Dave Chinner <david at fromorbit.com>wrote:
>
>> On Mon, Jan 17, 2011 at 09:12:54PM +0900, Ajeet Yadav wrote:
>> > Kernel: 2.6.30.9, XFS backported from 2.6.34, xfsprogs-3.0.5
>> >
>> > I used a script
>> > 1. create some file, directories, symlinks
>> > 2. unmount the file system
>> > 3. run xfs_bd with blocktrash
>> > 4. xfs_xfsrepair -L
>> > 5. list "ls -lR"
>> > 6. remove all file and directory "rm -rf *
>>
>> OK, so you are effectively corrupting random blocks by introducing
>> random bit errors in the blocks. No surprise that some errors are
>> not being detected - what is the blocktrash command that you are
>> using?
>>
>
> xfs_db -x -c blockget -c "blocktrash -s 12345 -n 256 -x 1 -y 1024 -3"
> /dev/sda1
>
>
>>
>> > Often during testing I get the below backtrace from kernel during ls, rm
>> > even though I already run xfs_repair on it.
>> > Is it related to xfsrepair or xfs ?. I think xfs_repair must have
>> detected
>> > this problem and corrected it.
>>
>> xfs_repair is not checking the di_flags field in the inode for
>> sanity, hence having a wrong flag set is going unnoticed.
>>
>
> ok
>
>
>>
>> > There is similar problem already reported by
>> > http://oss.sgi.com/archives/xfs/2010-06/msg00349.html
>>
>> Similar error message (xfs_iformt found an inode corruption), but
>> that one is a completely different problem.
>>
>> Does the patch below (compile tested only) detect the bad inode?
>>
>
> Yes I have tested it, It seems to work fine,
> I did not find this patch in mainline xfsprogs git, also I need to modify
> the patch somewhat.
> dino->di_flags ===================> dinoc->di_flags
> because dino is not having any member named di_flags in xfsprogs-3.0.5, so
> I used dinoc instead.
>
>
>>
>> Cheers,
>>
>> Dave.
>> --
>> Dave Chinner
>> david at fromorbit.com
>>
>> xfs_repair: validate inode di_flags field
>>
>> xfs_repair is not validating the di_flags field in the inode for
>> sanity. Block fuzzing indicates that we are not picking situations
>> like the RT bit being set on filesystems without realtime devices.
>>
>> Signed-off-by: Dave Chinner <dchinner at redhat.com>
>> ---
>> repair/dinode.c | 62
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> 1 files changed, 62 insertions(+), 0 deletions(-)
>>
>> diff --git a/repair/dinode.c b/repair/dinode.c
>> index 2fa850d..e05d4e0 100644
>> --- a/repair/dinode.c
>> +++ b/repair/dinode.c
>> @@ -2519,6 +2519,68 @@ process_dinode_int(xfs_mount_t *mp,
>> goto clear_bad_out;
>> }
>>
>> + /*
>> + * check that we only have valid flags set, and those that are set
>> make
>> + * sense.
>> + */
>> + if (dino->di_flags) {
>> + uint16_t flags = be16_to_cpu(dino->di_flags);
>> +
>> + if (flags & ~XFS_DIFLAG_ANY) {
>> + do_warn(_("Bad flags set in inode %llu"), lino);
>> + flags &= ~XFS_DIFLAG_ANY;
>> + }
>> +
>> + if (flags & (XFS_DIFLAG_REALTIME | XFS_DIFLAG_RTINHERIT))
>> {
>> + /* need an rt-dev! */
>> + if (!rt_name) {
>> + do_warn(_(
>> + "inode %llu has RT flag set but there is no RT device"), lino);
>> + flags &= ~(XFS_DIFLAG_REALTIME |
>> + XFS_DIFLAG_RTINHERIT);
>> + }
>> + }
>> + if (flags & XFS_DIFLAG_NEWRTBM_BIT) {
>> + /* must be a rt bitmap inode */
>> + if (lino != mp->m_sb.sb_rbmino) {
>> + do_warn(_("inode %llu not rt bitmap"),
>> lino);
>> + flags &= ~XFS_DIFLAG_NEWRTBM_BIT;
>> + }
>> + }
>> + if (flags & (XFS_DIFLAG_RTINHERIT |
>> + XFS_DIFLAG_EXTSZINHERIT |
>> + XFS_DIFLAG_PROJINHERIT |
>> + XFS_DIFLAG_NOSYMLINKS)) {
>> + /* must be a directory */
>> + if (di_mode && !S_ISDIR(di_mode)) {
>> + do_warn(_(
>> + "directory flags set on non-directory inode
>> %llu"),
>> + lino);
>> + flags &= ~(XFS_DIFLAG_RTINHERIT |
>> + XFS_DIFLAG_EXTSZINHERIT |
>> + XFS_DIFLAG_PROJINHERIT |
>> + XFS_DIFLAG_NOSYMLINKS);
>> + }
>> + }
>> + if (flags & (XFS_DIFLAG_REALTIME | XFS_XFLAG_EXTSIZE)) {
>> + /* must be a file */
>> + if (di_mode && !S_ISREG(di_mode)) {
>> + do_warn(_(
>> + "file flags set on non-file inode %llu"), lino);
>> + flags &= ~(XFS_DIFLAG_REALTIME |
>> + XFS_XFLAG_EXTSIZE);
>> + }
>> + }
>> + if (!verify_mode && flags != be16_to_cpu(dino->di_flags))
>> {
>> + if (!no_modify) {
>> + do_warn(_(", fixing bad flags.\n"));
>> + dino->di_flags = cpu_to_be16(flags);
>> + *dirty = 1;
>> + } else
>> + do_warn(_(", would fix bad flags.\n"));
>> + }
>> + }
>> +
>> if (verify_mode)
>> return retval;
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://oss.sgi.com/pipermail/xfs/attachments/20110201/bc5db289/attachment.htm>
More information about the xfs
mailing list