On Thu, Oct 30, 2008 at 01:29:16PM +1100, Lachlan McIlroy wrote:
> Dave Chinner wrote:
>> On Wed, Oct 29, 2008 at 11:43:31AM +1100, Lachlan McIlroy wrote:
>>> Dave Chinner wrote:
>>>> Hmmmm - there's also another bug in xfs_iget_cache_hit() - we don't
>>>> drop the reference we got if we found an unlinked inode after the
>>>> igrab() (the ENOENT case). I'll fix that as well.
>>>>
>>>> Patch below that I'm currently running through xfsqa.
>>> I gave this patch a go and it still asserted at the same place running
>>> the same test.
>>
>> Can you put more inode trace points in so that we can see where the
>> extra reference is coming from?
>
> xfs_sync_inodes_ag() found the inode before it was completely
> initialised.
>
> --> itrace @ 0xffff880078d67800/0xffff880073563e40
> ref @fs/xfs/xfs_inode.c:863(xfs_inode_alloc+0x205) i_count = 1
> cpu = 2 pid = 9938 ra = xfs_iread+0x29
> exit from xfs_iget.alloc i_count = 1
> cpu = 2 pid = 9938 ra = xfs_trans_iget+0x205
> ref @fs/xfs/xfs_iget.c:218(xfs_iget+0x585) i_count = 1
> cpu = 2 pid = 9938 ra = xfs_trans_iget+0x205
> ref @fs/xfs/xfs_iget.c:305(xfs_iget+0x643) i_count = 1
> cpu = 2 pid = 9938 ra = xfs_trans_iget+0x205
> ref @fs/xfs/linux-2.6/xfs_sync.c:113(xfs_sync_inodes_ag+0x118) i_count = 1
> cpu = 3 pid = 9953 ra = xfs_sync_inodes+0x68
> ref @fs/xfs/linux-2.6/xfs_iops.c:780(xfs_setup_inode+0x2c) i_count = 2
> cpu = 2 pid = 9938 ra = xfs_ialloc+0x5d8
Ah - ok, that makes sense now. That should be trivial to fix up;
we just need to avoid XFS_INEW() inodes in xfs_sync_inodes_ag()
and probably also in xfs_qm_dqrele_all(), and that will mean
the assert needs to be removed as well.
Patch soon.
Cheers,
Dave.
--
Dave Chinner
david@xxxxxxxxxxxxx
|