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