• Naohiro Aota's avatar
    btrfs: clear bio reference after submit_one_bio() · 289454ad
    Naohiro Aota authored
    After submit_one_bio(), `bio' can go away. However submit_extent_page()
    leave `bio' referable if submit_one_bio() failed (e.g. -ENOMEM on OOM).
    It will cause invalid paging request when submit_extent_page() is called
    next time.
    
    I reproduced ENOMEM case with the following script (need
    CONFIG_FAIL_PAGE_ALLOC, and CONFIG_FAULT_INJECTION_DEBUG_FS).
    
      #!/bin/bash
    
      dmesgout=dmesg.txt
      start=100000
      end=300000
      step=1000
    
      # btrfs options
      device=/dev/vdb1
      directory=/mnt/btrfs
    
      # fault-injection options
      percent=100
      times=3
    
      mkdir -p $directory || exit 1
      mount -o compress $device $directory || exit 1
    
      rm -f $directory/file || exit 1
      dd if=/dev/zero of=$directory/file bs=1M count=512 || exit 1
    
      for interval in `seq $start $step $end`; do
              dmesg -C
              echo 1 > /proc/sys/vm/drop_caches
              sync
              export FAILCMD_TYPE=fail_page_alloc
              ./failcmd.sh -p $percent -t $times -i $interval \
                      --ignore-gfp-highmem=N --ignore-gfp-wait=N --min-order=0 \
                      -- \
                      cat $directory/file > /dev/null
              dmesg > ${dmesgout}
              if grep -q BUG: ${dmesgout}; then
                      cat ${dmesgout}
                      exit 1
              fi
      done
    
      umount $directory
      exit 0
    Signed-off-by: default avatarNaohiro Aota <naota@elisp.net>
    Tested-by: default avatarSatoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    289454ad
extent_io.c 140 KB