Commit 672241fc authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[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: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent d5432de8
...@@ -2584,6 +2584,20 @@ static inline void block_wait_queue_running(request_queue_t *q) ...@@ -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 * 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. * @bio: The bio describing the location in memory and on the device.
...@@ -2620,21 +2634,13 @@ void generic_make_request(struct bio *bio) ...@@ -2620,21 +2634,13 @@ void generic_make_request(struct bio *bio)
if (maxsector) { if (maxsector) {
sector_t sector = bio->bi_sector; sector_t sector = bio->bi_sector;
if (maxsector < nr_sectors || if (maxsector < nr_sectors || maxsector - nr_sectors < sector) {
maxsector - nr_sectors < sector) { /*
char b[BDEVNAME_SIZE]; * This may well happen - the kernel calls bread()
/* This may well happen - the kernel calls * without checking the size of the device, e.g., when
* bread() without checking the size of the * mounting a device.
* device, e.g., when mounting a device. */ */
printk(KERN_INFO handle_bad_sector(bio);
"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);
goto end_io; goto end_io;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment