• Karsten Wiese's avatar
    [PATCH] Speedup FAT filesystem directory reads · f3ef6f63
    Karsten Wiese authored
          OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
    
    This speeds up directory reads for large FAT partitions, if the buffercache
    has to be filled from the drive. Following values were taken from:
    
            $ time find path_to_freshly_mounted_fat > /dev/null
    
    on an otherwise idle system.
    
    FAT with 16KB Clusters on IDE attached drive:   Factor  2
    FAT with 32KB Clusters on USB2 attached drive:  Factor 10 (!)
    Its less than 1/10 slower, if the buffercache is uptodate.
    
    The patch introduces the new function fat_dir_readahead().
    
    fat_dir_readahead() calls sb_breadahead() to readahead a whole cluster,
    if the requested sector is the first one in a cluster.
    It is usefull to do this, because on FAT directories occupy whole
    clusters, with the exception of FAT12/FAT16 root dirs.
    
    Readahead is only done, if the cluster's first sector is not uptodate
    to avoid overhead, when the buffer cache is already uptodate.
    Note that under memory pressure, the maximal byte count wasted
    (read: has to be red from disk twice) is 1 cluster's size.  Thats 64KB.
    
    fat_dir_readahead() is called from fat__get_entry().
    
    There is also an unrelated cleanup at one spot:
    
            if (bh)
                    brelse(bh);
    
    is replaced with:
    
            brelse(bh);
    
    brelse() can handle NULL pointer arguments by itself.
    Signed-off-by: default avatarKarsten Wiese <annabellesgarden@yahoo.de>
    Signed-off-by: default avatarOGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    f3ef6f63
dir.c 31.3 KB