From: Andrew Morton Date: Wed, 1 Dec 2004 09:09:52 +0000 (-0800) Subject: [PATCH] generic_make_request stack savings X-Git-Tag: v2.6.10-rc3~37 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=672241fcb024a8f07ea2641bbcb4c4b5241d5ea6;p=history.git [PATCH] generic_make_request stack savings Move this error-handling into a separate function so that its sizeable stack utilisation is avoided - generic_make_request() can be called recursively by stacking drivers. Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c index 1cd5e9f69e4c..98db1776ba31 100644 --- a/drivers/block/ll_rw_blk.c +++ b/drivers/block/ll_rw_blk.c @@ -2584,6 +2584,20 @@ static inline void block_wait_queue_running(request_queue_t *q) } } +static void handle_bad_sector(struct bio *bio) +{ + char b[BDEVNAME_SIZE]; + + printk(KERN_INFO "attempt to access beyond end of device\n"); + printk(KERN_INFO "%s: rw=%ld, want=%Lu, limit=%Lu\n", + bdevname(bio->bi_bdev, b), + bio->bi_rw, + (unsigned long long)bio->bi_sector + bio_sectors(bio), + (long long)(bio->bi_bdev->bd_inode->i_size >> 9)); + + set_bit(BIO_EOF, &bio->bi_flags); +} + /** * 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. @@ -2620,21 +2634,13 @@ void generic_make_request(struct bio *bio) if (maxsector) { sector_t sector = bio->bi_sector; - if (maxsector < nr_sectors || - maxsector - nr_sectors < sector) { - char b[BDEVNAME_SIZE]; - /* This may well happen - the kernel calls - * bread() without checking the size of the - * device, e.g., when mounting a device. */ - printk(KERN_INFO - "attempt to access beyond end of device\n"); - printk(KERN_INFO "%s: rw=%ld, want=%Lu, limit=%Lu\n", - bdevname(bio->bi_bdev, b), - bio->bi_rw, - (unsigned long long) sector + nr_sectors, - (long long) maxsector); - - set_bit(BIO_EOF, &bio->bi_flags); + 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; } }