diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-11 08:50:01 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-11 08:50:01 -0700 |
commit | 37d9869ed928268409b48f52c57449918c0fd307 (patch) | |
tree | 7dd954260d723d1e0716b6432ba07b5c7be7f2ac /drivers/s390/block/xpram.c | |
parent | 098ef215b1e87cff51f983bae4e4e1358b932ec9 (diff) | |
parent | 89d49841e9e7a90b04b036b7dbe7521b55edbe24 (diff) |
Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6: (27 commits)
[S390] Fix checkstack for s390
[S390] fix initialization of stp
[S390] 3215: Remove tasklet.
[S390] console flush on panic / reboot
[S390] introduce dirty bit for kvm live migration
[S390] Add ioctl support for EMC Symmetrix Subsystem Control I/O
[S390] xpram: per device block request queues.
[S390] dasd: fix message flood for unsolicited interrupts
[S390] Move private simple udelay function to arch/s390/lib/delay.c.
[S390] dcssblk: add >2G DCSSs support and stacked contiguous DCSSs support.
[S390] ptrace changes
[S390] s390: use sys_pause for 31bit pause entry point
[S390] qdio enhanced SIGA (iqdio) support.
[S390] cio: fix cio_tpi.
[S390] cio: Correct use of ! and &
[S390] cio: inline assembly cleanup
[S390] bus_id -> dev_set_name() for css and ccw busses
[S390] bus_id ->dev_name() conversions in qdio
[S390] Use s390_root_dev_* in kvm_virtio.
[S390] more bus_id -> dev_name conversions
...
Diffstat (limited to 'drivers/s390/block/xpram.c')
-rw-r--r-- | drivers/s390/block/xpram.c | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/drivers/s390/block/xpram.c b/drivers/s390/block/xpram.c index dd9b986389a..03916989ed2 100644 --- a/drivers/s390/block/xpram.c +++ b/drivers/s390/block/xpram.c @@ -56,6 +56,7 @@ typedef struct { static xpram_device_t xpram_devices[XPRAM_MAX_DEVS]; static unsigned int xpram_sizes[XPRAM_MAX_DEVS]; static struct gendisk *xpram_disks[XPRAM_MAX_DEVS]; +static struct request_queue *xpram_queues[XPRAM_MAX_DEVS]; static unsigned int xpram_pages; static int xpram_devs; @@ -330,18 +331,22 @@ static int __init xpram_setup_sizes(unsigned long pages) return 0; } -static struct request_queue *xpram_queue; - static int __init xpram_setup_blkdev(void) { unsigned long offset; int i, rc = -ENOMEM; for (i = 0; i < xpram_devs; i++) { - struct gendisk *disk = alloc_disk(1); - if (!disk) + xpram_disks[i] = alloc_disk(1); + if (!xpram_disks[i]) + goto out; + xpram_queues[i] = blk_alloc_queue(GFP_KERNEL); + if (!xpram_queues[i]) { + put_disk(xpram_disks[i]); goto out; - xpram_disks[i] = disk; + } + blk_queue_make_request(xpram_queues[i], xpram_make_request); + blk_queue_hardsect_size(xpram_queues[i], 4096); } /* @@ -352,18 +357,6 @@ static int __init xpram_setup_blkdev(void) goto out; /* - * Assign the other needed values: make request function, sizes and - * hardsect size. All the minor devices feature the same value. - */ - xpram_queue = blk_alloc_queue(GFP_KERNEL); - if (!xpram_queue) { - rc = -ENOMEM; - goto out_unreg; - } - blk_queue_make_request(xpram_queue, xpram_make_request); - blk_queue_hardsect_size(xpram_queue, 4096); - - /* * Setup device structures. */ offset = 0; @@ -377,18 +370,18 @@ static int __init xpram_setup_blkdev(void) disk->first_minor = i; disk->fops = &xpram_devops; disk->private_data = &xpram_devices[i]; - disk->queue = xpram_queue; + disk->queue = xpram_queues[i]; sprintf(disk->disk_name, "slram%d", i); set_capacity(disk, xpram_sizes[i] << 1); add_disk(disk); } return 0; -out_unreg: - unregister_blkdev(XPRAM_MAJOR, XPRAM_NAME); out: - while (i--) + while (i--) { + blk_cleanup_queue(xpram_queues[i]); put_disk(xpram_disks[i]); + } return rc; } @@ -400,10 +393,10 @@ static void __exit xpram_exit(void) int i; for (i = 0; i < xpram_devs; i++) { del_gendisk(xpram_disks[i]); + blk_cleanup_queue(xpram_queues[i]); put_disk(xpram_disks[i]); } unregister_blkdev(XPRAM_MAJOR, XPRAM_NAME); - blk_cleanup_queue(xpram_queue); } static int __init xpram_init(void) |