• Darrick J. Wong's avatar
    xfs: fix toctou race when locking an inode to access the data map · 8059f061
    Darrick J. Wong authored
    commit 4b5bd5bf upstream.
    
    We use di_format and if_flags to decide whether we're grabbing the ilock
    in btree mode (btree extents not loaded) or shared mode (anything else),
    but the state of those fields can be changed by other threads that are
    also trying to load the btree extents -- IFEXTENTS gets set before the
    _bmap_read_extents call and cleared if it fails.
    
    We don't actually need to have IFEXTENTS set until after the bmbt
    records are successfully loaded and validated, which will fix the race
    between multiple threads trying to read the same directory.  The next
    patch strengthens directory bmbt validation by refusing to open the
    directory if reading the bmbt to start directory readahead fails.
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    8059f061
xfs_inode_fork.c 58.2 KB