lkml.org 
[lkml]   [2007]   [Jul]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] block: factor out bio_check_eod()
    End of device check is done twice in __generic_make_request() and it's
    fully inlined each time. Factor out bio_check_eod().

    This is taken from Jens' zero-length barrier patch.

    Signed-off-by: Tejun Heo <htejun@gmail.com>
    Cc: Jens Axboe <jens.axboe@oracle.com>
    ---
    block/ll_rw_blk.c | 63 ++++++++++++++++++++++++++++--------------------------
    1 file changed, 33 insertions(+), 30 deletions(-)

    Index: work/block/ll_rw_blk.c
    ===================================================================
    --- work.orig/block/ll_rw_blk.c
    +++ work/block/ll_rw_blk.c
    @@ -3094,6 +3094,35 @@ static inline int should_fail_request(st

    #endif /* CONFIG_FAIL_MAKE_REQUEST */

    +/*
    + * Check whether this bio extends beyond the end of the device.
    + */
    +static int bio_check_eod(struct bio *bio, unsigned int nr_sectors)
    +{
    + sector_t maxsector;
    +
    + if (!nr_sectors)
    + return 0;
    +
    + /* Test device or partition size, when known. */
    + maxsector = bio->bi_bdev->bd_inode->i_size >> 9;
    + if (maxsector) {
    + sector_t sector = bio->bi_sector;
    +
    + if (maxsector < nr_sectors || maxsector - nr_sectors < sector) {
    + /*
    + * This may well happen - the kernel calls bread()
    + * without checking the size of the device, e.g., when
    + * mounting a device.
    + */
    + handle_bad_sector(bio);
    + return 1;
    + }
    + }
    +
    + return 0;
    +}
    +
    /**
    * generic_make_request: hand a buffer to its device driver for I/O
    * @bio: The bio describing the location in memory and on the device.
    @@ -3121,27 +3150,14 @@ static inline int should_fail_request(st
    static inline void __generic_make_request(struct bio *bio)
    {
    request_queue_t *q;
    - sector_t maxsector;
    sector_t old_sector;
    int ret, nr_sectors = bio_sectors(bio);
    dev_t old_dev;

    might_sleep();
    - /* Test device or partition size, when known. */
    - maxsector = bio->bi_bdev->bd_inode->i_size >> 9;
    - if (maxsector) {
    - sector_t sector = bio->bi_sector;

    - if (maxsector < nr_sectors || maxsector - nr_sectors < sector) {
    - /*
    - * This may well happen - the kernel calls bread()
    - * without checking the size of the device, e.g., when
    - * mounting a device.
    - */
    - handle_bad_sector(bio);
    - goto end_io;
    - }
    - }
    + if (bio_check_eod(bio, nr_sectors))
    + goto end_io;

    /*
    * Resolve the mapping until finished. (drivers are
    @@ -3197,21 +3213,8 @@ end_io:
    old_sector = bio->bi_sector;
    old_dev = bio->bi_bdev->bd_dev;

    - maxsector = bio->bi_bdev->bd_inode->i_size >> 9;
    - if (maxsector) {
    - sector_t sector = bio->bi_sector;
    -
    - if (maxsector < nr_sectors ||
    - maxsector - nr_sectors < sector) {
    - /*
    - * This may well happen - partitions are not
    - * checked to make sure they are within the size
    - * of the whole device.
    - */
    - handle_bad_sector(bio);
    - goto end_io;
    - }
    - }
    + if (bio_check_eod(bio, nr_sectors))
    + goto end_io;

    ret = q->make_request_fn(q, bio);
    } while (ret);
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2007-07-18 13:03    [W:0.027 / U:0.460 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site