Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging

符永涛
2013-04-20T04:27:41Z

[-- Attachment #1.1: Type: text/plain, Size: 2595 bytes --]

Hi Eric,
The xfs module is loaded from system kernel, it happens on our production
server too (I did not touch that till now) and if the xfs module is mess up
the systemstap may also not working but now it works. As you have
mentioned, strange thing is xfs shutdown always happens when glusterfs
rebalance completes.

2013/4/20 Eric Sandeen <sandeen@sandeen.net>

> On 4/19/13 9:03 PM, 符永涛 wrote:
> > Hi Eric,
> > I will enable them and run test again. I can only reproduce it with
> > glusterfs rebalance. Glusterfs uses a mechanism it called syncop to
> > unlink file. For rebalance it uses
> > syncop_unlink(glusterfs/libglusterfs/src/syncop.c). In the glusterfs
> > sync_task framework(glusterfs/libglusterfs/src/syncop.c) it uses
> > "makecontext/swapcontext"
> > <
> http://www.opengroup.org/onlinepubs/009695399/functions/makecontext.html>.
> > Does it leads to racing unlink from different CPU core?
>
> Yep, I understand that it's rebalance. It dies when rebalance finishes
> because an
> open but unlinked file trips over the corrupted list from earlier, it
> seems.
>
> I don't know why makecontext would matter...
>
> Just to be sure, you are definitely loading the xfs module from the kernel
> you built, right, and you don't have a "priority" module getting loaded
> from elsewhere? Seems unlikely, but just to be sure.
>
> > Thank you.
>
> You could also add this patch to the xfs tracepoints to print more
> information about the inodes - the mode & flags.
>
> -Eric
>
>
> diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h
> index e8ce644..c314b87 100644
> --- a/fs/xfs/linux-2.6/xfs_trace.h
> +++ b/fs/xfs/linux-2.6/xfs_trace.h
> @@ -544,14 +544,18 @@ DECLARE_EVENT_CLASS(xfs_inode_class,
> TP_STRUCT__entry(
> __field(dev_t, dev)
> __field(xfs_ino_t, ino)
> + __field(__u16, mode)
> + __field(unsigned long, flags)
> ),
> TP_fast_assign(
> __entry->dev = VFS_I(ip)->i_sb->s_dev;
> __entry->ino = ip->i_ino;
> + __entry->mode = VFS_I(ip)->i_mode;
> + __entry->flags = ip->i_flags;
> ),
> - TP_printk("dev %d:%d ino 0x%llx",
> + TP_printk("dev %d:%d ino 0x%llx mode 0%o, flags 0x%lx",
> MAJOR(__entry->dev), MINOR(__entry->dev),
> - __entry->ino)
> + __entry->ino, __entry->mode, __entry->flags)
> )
>
> #define DEFINE_INODE_EVENT(name) \
>
>
>
>

--
符永涛

[-- Attachment #1.2: Type: text/html, Size: 3857 bytes --]