• Eric Sandeen's avatar
    ext4: fix ext4_free_inode() vs. ext4_claim_inode() race · 7ce9d5d1
    Eric Sandeen authored
    I was seeing fsck errors on inode bitmaps after a 4 thread
    dbench run on a 4 cpu machine:
    
    Inode bitmap differences: -50736 -(50752--50753) etc...
    
    I believe that this is because ext4_free_inode() uses atomic
    bitops, and although ext4_new_inode() *used* to also use atomic 
    bitops for synchronization, commit 
    39341867 changed this to use
    the sb_bgl_lock, so that we could also synchronize against
    read_inode_bitmap and initialization of uninit inode tables.
    
    However, that change left ext4_free_inode using atomic bitops,
    which I think leaves no synchronization between setting & 
    unsetting bits in the inode table.
    
    The below patch fixes it for me, although I wonder if we're 
    getting at all heavy-handed with this spinlock...
    Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
    Reviewed-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    7ce9d5d1
ialloc.c 31 KB