Implement VFS read clustering for MSDOSFS
authorsf <sf@openbsd.org>
Mon, 29 May 2017 13:48:12 +0000 (13:48 +0000)
committersf <sf@openbsd.org>
Mon, 29 May 2017 13:48:12 +0000 (13:48 +0000)
commitf4aaab5fd4219e21322d2fe25905a711d91e97da
treefe3785fa2ad1440108cf6f8d717157fd9f84a3e5
parent27509f9efb2bf4d204d0d911991fd4473a800bd7
Implement VFS read clustering for MSDOSFS

This is the reverted commit by mpi@ from msdosfs_vnops.c 1.105 plus some
additional tweaks to fix some cluster/block number confusion that lead
to regressions when seeking past the end of a file.

The original commit message was:

  The logic used in msdosfs_bmap() to loop calling pcbmap() comes from
  FreeBSD and is not really efficient but it is good enough since it is
  only called when generating I/O.

  With this diff I get a 100% improvement when reading big files from a
  crappy USB stick.

  With this and bread_cluster(9) modified to not re-fetch B_CACHED buffers,
  reading large contiguous files with chunk sizes of MAXPHYS is almost as
  fast as physio(9) on the same device.

  For a 'real world' example, when copying music files from a USB stick I
  see a speed jump from 15MB/s on -current to 24Mb/s with this diff.

  While here rename some 'lbn' variables into 'cn' to better reflect what
  we're dealing with.

  Tested by Mathieu, with support from deraadt@

ok mpi@
sys/msdosfs/denode.h
sys/msdosfs/msdosfs_vnops.c