• Darrick J. Wong's avatar
    iomap: don't skip reading in !uptodate folios when unsharing a range · 35d30c9c
    Darrick J. Wong authored
    Prior to commit a01b8f22, we would always read in the contents of a
    !uptodate folio prior to writing userspace data into the folio,
    allocated a folio state object, etc.  Ritesh introduced an optimization
    that skips all of that if the write would cover the entire folio.
    
    Unfortunately, the optimization misses the unshare case, where we always
    have to read in the folio contents since there isn't a data buffer
    supplied by userspace.  This can result in stale kernel memory exposure
    if userspace issues a FALLOC_FL_UNSHARE_RANGE call on part of a shared
    file that isn't already cached.
    
    This was caught by observing fstests regressions in the "unshare around"
    mechanism that is used for unaligned writes to a reflinked realtime
    volume when the realtime extent size is larger than 1FSB, though I think
    it applies to any shared file.
    
    Cc: ritesh.list@gmail.com, willy@infradead.org
    Fixes: a01b8f22 ("iomap: Allocate ifs in ->write_begin() early")
    Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Reviewed-by: default avatarRitesh Harjani (IBM) <ritesh.list@gmail.com>
    35d30c9c
buffered-io.c 57.7 KB