• Goldwyn Rodrigues's avatar
    btrfs: nowait aio: Correct assignment of pos · ff0fa732
    Goldwyn Rodrigues authored
    Assigning pos for usage early messes up in append mode, where the pos is
    re-assigned in generic_write_checks(). Assign pos later to get the
    correct position to write from iocb->ki_pos.
    
    Since check_can_nocow also uses the value of pos, we shift
    generic_write_checks() before check_can_nocow(). Checks with IOCB_DIRECT
    are present in generic_write_checks(), so checking for IOCB_NOWAIT is
    enough.
    
    Also, put locking sequence in the fast path.
    
    This fixes a user visible bug, as reported:
    
    "apparently breaks several shell related features on my system.
    In zsh history stopped working, because no new entries are added
    anymore.
    I fist noticed the issue when I tried to build mplayer. It uses a shell
    script to generate a help_mp.h file:
    [...]
    
    Here is a simple testcase:
    
     % echo "foo" >> test
     % echo "foo" >> test
     % cat test
     foo
     %
    "
    
    Fixes: edf064e7 ("btrfs: nowait aio support")
    CC: Jens Axboe <axboe@kernel.dk>
    Reported-by: default avatarMarkus Trippelsdorf <markus@trippelsdorf.de>
    Link: https://lkml.kernel.org/r/20170704042306.GA274@x4Signed-off-by: default avatarGoldwyn Rodrigues <rgoldwyn@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    ff0fa732
file.c 83.8 KB