• Josef Bacik's avatar
    Btrfs: lock extents as we map them in DIO · eb838e73
    Josef Bacik authored
    A deadlock in xfstests 113 was uncovered by commit
    
    d187663e
    
    This is because we would not return EIOCBQUEUED for short AIO reads, instead
    we'd wait for the DIO to complete and then return the amount of data we
    transferred, which would allow our stuff to unlock the remaning amount.  But
    with this change this no longer happens, so if we have a short AIO read (for
    example if we try to read past EOF), we could leave the section from EOF to
    the end of where we tried to read locked.  Fixing this is tricky since there
    is no clear way to know exactly how much data DIO truly submitted for IO, so
    to make this less hard on ourselves and less combersome we need to lock the
    extents as we try to map them, and then we unlock any areas we didn't
    actually map.  This makes us completely safe from deadlocks and reliance on
    a particular behavior of the DIO code.  This also lays the groundwork for
    allowing us to use the normal csum storage method for reads which means we
    can remove an allocation.  Thanks,
    Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
    eb838e73
inode.c 203 KB