/* * unlink path */ /* assert that nlink == 0 on addition to the unlinked inode list */ probe module("xfs").function("xfs_iunlink") { if ($ip->i_d->di_nlink == 0) next; printf("\n--- %s\n", probefunc()); printf("vars: %s\n", $$vars) printf("ip: i_ino = 0x%x, i_flags = 0x%x\n", $ip->i_ino, $ip->i_flags); printf("ip->i_d: di_nlink = 0x%x, di_gen = 0x%x\n", $ip->i_d->di_nlink, $ip->i_d->di_gen); printf("kernel backtrace:\n"); print_backtrace(); printf("user backtrace:\n"); print_ubacktrace(); } /* can we check the nlink count when an agi buffer is written out?? */ /* * reclaim path */ /* if we failed to remove an unlinked inode, what inode caused us to blow up? */ /*probe module("xfs").statement("xfs_iunlink_remove@fs/xfs/xfs_inode.c:1779")*/ probe module("xfs").function("xfs_iunlink_remove").return { /* EINVAL */ if (returnval() != 22) next; printf("\n--- %s -- %s -- %s\n", probefunc(), pp(), $$return); printf("vars: %s\n", $$vars); printf("ip: i_ino = 0x%x, i_flags = 0x%x\n", $ip->i_ino, $ip->i_flags); printf("ip->i_d: di_nlink = 0x%x, di_gen = 0x%x\n", $ip->i_d->di_nlink, $ip->i_d->di_gen); } /* # Capture an EINVAL return from xfs_imap() based on an invalid ino. probe module("xfs").statement("xfs_imap@fs/xfs/xfs_ialloc.c:1283") { //if (($agno < $mp->m_sb->sb_agcount) && ($agbno < $mp->m_sb->sb_agblocks)) //next; printf("\n--- %s -- %s -- EINVAL 1\n", probefunc(), pp()); printf("vars: %s\n", $$vars); printf("mp: m_agno_log = 0x%x, m_agino_log = 0x%x\n", $mp->m_agno_log, $mp->m_agino_log); printf("mp->m_sb: sb_agcount = 0x%x, sb_agblocks = 0x%x, sb_inopblog = 0x%x, sb_agblklog = 0x%x\n", $mp->m_sb->sb_agcount, $mp->m_sb->sb_agblocks, $mp->m_sb->sb_inopblog, $mp->m_sb->sb_agblklog); printf("kernel backtrace:\n"); print_backtrace(); printf("user backtrace:\n"); print_ubacktrace(); } */ probe module("xfs").function("xfs_imap").return { /* EINVAL */ if (returnval() != 22) next; printf("\n--- %s -- %s -- %s\n", probefunc(), pp(), $$return); printf("vars: %s\n", $$vars); printf("mp: m_agno_log = 0x%x, m_agino_log = 0x%x\n", $mp->m_agno_log, $mp->m_agino_log); printf("mp->m_sb: sb_agcount = 0x%x, sb_agblocks = 0x%x, sb_inopblog = 0x%x, sb_agblklog = 0x%x, sb_dblocks = 0x%x\n", $mp->m_sb->sb_agcount, $mp->m_sb->sb_agblocks, $mp->m_sb->sb_inopblog, $mp->m_sb->sb_agblklog, $mp->m_sb->sb_dblocks); /* * this doesn't appear to print valid data (at least if I'm modifying * the code explicitly), but alas there is an xfs_alert() if invalid. */ printf("imap: im_blkno = 0x%x, im_len = 0x%x, im_boffset = 0x%x\n", $imap->im_blkno, $imap->im_len, $imap->im_boffset); printf("kernel backtrace:\n"); print_backtrace(); printf("user backtrace:\n"); print_ubacktrace(); } /* # Capture an EINVAL return from xfs_imap() based on an invalid imap. probe module("xfs").statement("xfs_imap@fs/xfs/xfs_ialloc.c+115") { printf("\n--- %s -- %s -- EINVAL 2\n", probefunc(), pp()); printf("vars: %s\n", $$vars); printf("imap: im_blkno = 0x%x, im_len = 0x%x, im_boffset = 0x%x\n", $imap->im_blkno, $imap->im_len, $imap->im_boffset); printf("mp->m_sb: sb_dblocks = 0x%x\n", $mp->m_sb->sb_dblocks); printf("kernel backtrace:\n"); print_backtrace(); printf("user backtrace:\n"); print_ubacktrace(); } */