• L
    vfs: avoid "attempt to access beyond end of device" warnings · 57302e0d
    Linus Torvalds 提交于
    The block device access simplification that avoided accessing the (racy)
    block size information (commit bbec0270: "blkdev_max_block: make
    private to fs/buffer.c") no longer checks the maximum block size in the
    block mapping path.
    
    That was _almost_ as simple as just removing the code entirely, because
    the readers and writers all check the size of the device anyway, so
    under normal circumstances it "just worked".
    
    However, the block size may be such that the end of the device may
    straddle one single buffer_head.  At which point we may still want to
    access the end of the device, but the buffer we use to access it
    partially extends past the end.
    
    The 'bd_set_size()' function intentionally sets the block size to avoid
    this, but mounting the device - or setting the block size by hand to
    some other value - can modify that block size.
    
    So instead, teach 'submit_bh()' about the special case of the buffer
    head straddling the end of the device, and turning such an access into a
    smaller IO access, avoiding the problem.
    
    This, btw, also means that unlike before, we can now access the whole
    device regardless of device block size setting.  So now, even if the
    device size is only 512-byte aligned, we can read and write even the
    last sector even when having a much bigger block size for accessing the
    rest of the device.
    
    So with this, we could now get rid of the 'bd_set_size()' block size
    code entirely - resulting in faster IO for the common case - but that
    would be a separate patch.
    Reported-and-tested-by: NRomain Francoise <romain@orebokech.com>
    Reporeted-and-tested-by: NMeelis Roos <mroos@linux.ee>
    Reported-by: NTony Luck <tony.luck@intel.com>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    57302e0d
buffer.c 87.0 KB