• Chao Yu's avatar
    f2fs: fix to avoid racing in between read and OPU dio write · 0cac5118
    Chao Yu authored
    If lfs mode is on, buffered read may race w/ OPU dio write as below,
    it may cause buffered read hits unwritten data unexpectly, and for
    dio read, the race condition exists as well.
    
    Thread A			Thread B
    - f2fs_file_write_iter
     - f2fs_dio_write_iter
      - __iomap_dio_rw
       - f2fs_iomap_begin
        - f2fs_map_blocks
         - __allocate_data_block
          - allocated blkaddr #x
           - iomap_dio_submit_bio
    				- f2fs_file_read_iter
    				 - filemap_read
    				  - f2fs_read_data_folio
    				   - f2fs_mpage_readpages
    				    - f2fs_map_blocks
    				     : get blkaddr #x
    				    - f2fs_submit_read_bio
    				IRQ
    				- f2fs_read_end_io
    				 : read IO on blkaddr #x complete
    IRQ
    - iomap_dio_bio_end_io
     : direct write IO on blkaddr #x complete
    
    In LFS mode, if there is inflight dio, let's wait for its completion,
    this policy won't cover all race cases, however it is a tradeoff which
    avoids abusing lock around IO paths.
    
    Fixes: f847c699 ("f2fs: allow out-place-update for direct IO in LFS mode")
    Signed-off-by: default avatarChao Yu <chao@kernel.org>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    0cac5118
file.c 124 KB