416e232cc6
clustering is not done. The bug caused extreme slowness for large files in some cases. There is no way to tell VOP_BMAP() how many blocks are wanted, so for all file systems it has to waste time in some cases by searching for more contiguous blocks than will be accessed. For msdosfs, it also clobbered the fatchain cache in these cases by advancing the cache to point to the chain entry for block that won't be read. This makes the cache useless for the next sequential i/o (or VOP_BMAP()), so the fat chain is searched from the beginning. The cache only has 1 relevant entry, so it is similarly useless for random i/o. Fix this by only advancing the cache to point to the chain entry for the first block that will be read. Clustering uses results from VOP_BMAP(), so when more than 1 block is read by clustering, the cache is not advanced as optimally as before, but it is at most 1 cluster size behind and searching the chain through the blocks for this cluster doesn't take too long. |
||
---|---|---|
.. | ||
bootsect.h | ||
bpb.h | ||
denode.h | ||
direntry.h | ||
fat.h | ||
msdosfs_conv.c | ||
msdosfs_denode.c | ||
msdosfs_fat.c | ||
msdosfs_iconv.c | ||
msdosfs_lookup.c | ||
msdosfs_vfsops.c | ||
msdosfs_vnops.c | ||
msdosfsmount.h |