• Johannes Thumshirn's avatar
    btrfs: don't fallback to buffered read if we don't need to · 0425e7ba
    Johannes Thumshirn authored
    Since we switched to the iomap infrastructure in b5ff9f1a96e8f ("btrfs:
    switch to iomap for direct IO") we're calling generic_file_buffered_read()
    directly and not via generic_file_read_iter() anymore.
    
    If the read could read everything there is no need to bother calling
    generic_file_buffered_read(), like it is handled in
    generic_file_read_iter().
    
    If we call generic_file_buffered_read() in this case we can hit a
    situation where we do an invalid readahead and cause this UBSAN splat
    in fstest generic/091:
    
      run fstests generic/091 at 2020-10-21 10:52:32
      ================================================================================
      UBSAN: shift-out-of-bounds in ./include/linux/log2.h:57:13
      shift exponent 64 is too large for 64-bit type 'long unsigned int'
      CPU: 0 PID: 656 Comm: fsx Not tainted 5.9.0-rc7+ #821
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4-rebuilt.opensuse.org 04/01/2014
      Call Trace:
       __dump_stack lib/dump_stack.c:77
       dump_stack+0x57/0x70 lib/dump_stack.c:118
       ubsan_epilogue+0x5/0x40 lib/ubsan.c:148
       __ubsan_handle_shift_out_of_bounds.cold+0x61/0xe9 lib/ubsan.c:395
       __roundup_pow_of_two ./include/linux/log2.h:57
       get_init_ra_size mm/readahead.c:318
       ondemand_readahead.cold+0x16/0x2c mm/readahead.c:530
       generic_file_buffered_read+0x3ac/0x840 mm/filemap.c:2199
       call_read_iter ./include/linux/fs.h:1876
       new_sync_read+0x102/0x180 fs/read_write.c:415
       vfs_read+0x11c/0x1a0 fs/read_write.c:481
       ksys_read+0x4f/0xc0 fs/read_write.c:615
       do_syscall_64+0x33/0x40 arch/x86/entry/common.c:46
       entry_SYSCALL_64_after_hwframe+0x44/0xa9 arch/x86/entry/entry_64.S:118
      RIP: 0033:0x7fe87fee992e
      RSP: 002b:00007ffe01605278 EFLAGS: 00000246 ORIG_RAX: 0000000000000000
      RAX: ffffffffffffffda RBX: 000000000004f000 RCX: 00007fe87fee992e
      RDX: 0000000000004000 RSI: 0000000001677000 RDI: 0000000000000003
      RBP: 000000000004f000 R08: 0000000000004000 R09: 000000000004f000
      R10: 0000000000053000 R11: 0000000000000246 R12: 0000000000004000
      R13: 0000000000000000 R14: 000000000007a120 R15: 0000000000000000
      ================================================================================
      BTRFS info (device nullb0): has skinny extents
      BTRFS info (device nullb0): ZONED mode enabled, zone size 268435456 B
      BTRFS info (device nullb0): enabling ssd optimizations
    
    Fixes: f85781fb ("btrfs: switch to iomap for direct IO")
    Reviewed-by: default avatarGoldwyn Rodrigues <rgoldwyn@suse.com>
    Signed-off-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    0425e7ba
file.c 98.6 KB