• Mingming Cao's avatar
    ext4: Use end_io callback to avoid direct I/O fallback to buffered I/O · 4c0425ff
    Mingming Cao authored
    Currently the DIO VFS code passes create = 0 when writing to the
    middle of file.  It does this to avoid block allocation for holes, so
    as not to expose stale data out when there is a parallel buffered read
    (which does not hold the i_mutex lock).  Direct I/O writes into holes
    falls back to buffered IO for this reason.
    
    Since preallocated extents are treated as holes when doing a
    get_block() look up (buffer is not mapped), direct IO over fallocate
    also falls back to buffered IO.  Thus ext4 actually silently falls
    back to buffered IO in above two cases, which is undesirable.
    
    To fix this, this patch creates unitialized extents when a direct I/O
    write into holes in sparse files, and registering an end_io callback which
    converts the uninitialized extent to an initialized extent after the
    I/O is completed.
    Singed-Off-By: default avatarMingming Cao <cmm@us.ibm.com>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    4c0425ff
super.c 113 KB