s390 (7/16): dasd driver fixes.
Subsystems (2)
PATCH 1/1 s390 (7/16): dasd driver fixes.
s390 dasd driver fixes:
- Take request queue lock in dasd_end_request.
- Make it work with CONFIG_DEVFS_FS=y.
- Properly wait for the root device.
- Cope with requests killed due to failed channel path.
- Improve reference counting.
- Remove devno from struct dasd_device.
- Remove unnecessary bdget/bdput calls.
diffstat:
Kconfig | 2 block/dasd.c | 241 +++++++++++++++++++++++++++++----------------------- block/dasd_devmap.c | 188 +++++++++++++++++++++++++++++++++------- block/dasd_diag.c | 10 +- block/dasd_eckd.c | 25 ++++- block/dasd_fba.c | 11 +- block/dasd_genhd.c | 12 +- block/dasd_int.h | 52 +++++------ block/dasd_ioctl.c | 3 block/dasd_proc.c | 11 -- 10 files changed, 363 insertions(+), 192 deletions(-)
drivers/s390/Kconfig +1 -1
@@ -164,7 +164,7 @@ config DASD_DIAG tristate "Support for DIAG access to CMS reserved Disks" - depends on DASD + depends on DASD && ARCH_S390X = 'n' help Select this option if you want to use CMS reserved Disks under VM with the Diagnose250 command. If you are not running under VM or
drivers/s390/block/dasd.c +136 -105
500 lines not on this page · raw message
drivers/s390/block/dasd_devmap.c +155 -33
248 lines not on this page · raw message
drivers/s390/block/dasd_diag.c +5 -5
@@ -6,7 +6,7 @@* Bugreports.to..: <[email protected]> * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 * -* $Revision: 1.27 $ +* $Revision: 1.28 $ * * History of changes * 07/13/00 Added fixup sections for diagnoses ans saved some registers
@@ -96,7 +96,7 @@ iib = &private->iib;memset (iib,0 ,sizeof (diag_init_io_t)); - iib->dev_nr = device->devno; + iib->dev_nr =_ccw_device_get_device_number (device->cdev); iib->block_size = blocksize; iib->offset = offset; iib->start_block =0 ;
@@ -117,7 +117,7 @@ private = (dasd_diag_private_t *) device->private; iib = &private->iib;memset (iib,0 ,sizeof (diag_init_io_t)); - iib->dev_nr = device->devno; + iib->dev_nr =_ccw_device_get_device_number (device->cdev); rc =dia250 (iib,TERM_BIO );return rc &3 ; }
@@ -134,7 +134,7 @@ private = (dasd_diag_private_t *) device->private; dreq = (dasd_diag_req_t *) cqr->data; - private->iob.dev_nr = device->devno; + private->iob.dev_nr =_ccw_device_get_device_number (device->cdev); private->iob.key =0 ; private->iob.flags =2 ;/* do asynchronous io */ private->iob.block_count = dreq->block_count;
@@ -252,7 +252,7 @@ }/* Read Device Characteristics */ rdc_data = (void *) &(private->rdc_data); - rdc_data->dev_nr = device->devno; + rdc_data->dev_nr =_ccw_device_get_device_number (device->cdev); rdc_data->rdc_len =sizeof (dasd_diag_characteristics_t); rc =diag210 ((struct diag210 *) rdc_data);
drivers/s390/block/dasd_eckd.c +21 -4
@@ -7,7 +7,7 @@* Bugreports.to..: <[email protected]> * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 * -* $Revision: 1.36 $ +* $Revision: 1.38 $ * * History of changes (starts July 2000) * 07/11/00 Enabled rotational position sensing
@@ -1003,7 +1003,7 @@return ERR_PTR (-EINVAL ); count += bv->bv_len >> (device->s2b_shift +9 );#if defined(CONFIG_ARCH_S390X ) - cidaw +=idal_nr_words (kmap (bv->bv_page) + + cidaw +=idal_nr_words (page_address (bv->bv_page) + bv->bv_offset, bv->bv_len);#endif }
@@ -1042,7 +1042,7 @@ last_rec - recid + 1, cmd, device, blksize); } rq_for_each_bio(bio, req) bio_for_each_segment(bv, bio, i) { - dst =kmap (bv->bv_page) + bv->bv_offset; + dst =page_address (bv->bv_page) + bv->bv_offset;for (off =0 ; off < bv->bv_len; off += blksize) {sector_t trkid = recid;unsigned int recoffs =sector_div (trkid, blk_per_trk);
@@ -1453,6 +1453,8 @@static int __init dasd_eckd_init (void ) { +int ret; +dasd_ioctl_no_register (THIS_MODULE ,BIODASDSATTR , dasd_eckd_set_attrib); dasd_ioctl_no_register(THIS_MODULE, BIODASDPSRD,
@@ -1466,7 +1468,22 @@ASCEBC (dasd_eckd_discipline.ebcname,4 ); -ccw_driver_register (&dasd_eckd_driver); + ret =ccw_driver_register (&dasd_eckd_driver); +if (ret) { +dasd_ioctl_no_unregister (THIS_MODULE ,BIODASDSATTR , + dasd_eckd_set_attrib); +dasd_ioctl_no_unregister (THIS_MODULE ,BIODASDPSRD , + dasd_eckd_performance); +dasd_ioctl_no_unregister (THIS_MODULE ,BIODASDRLSE , + dasd_eckd_release); +dasd_ioctl_no_unregister (THIS_MODULE ,BIODASDRSRV , + dasd_eckd_reserve); +dasd_ioctl_no_unregister (THIS_MODULE ,BIODASDSLCK , + dasd_eckd_steal_lock); +return ret; + } + +dasd_generic_auto_online (&dasd_eckd_driver);return 0 ; }
drivers/s390/block/dasd_fba.c +9 -2
@@ -4,7 +4,7 @@* Bugreports.to..: <[email protected]> * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 * -* $Revision: 1.25 $ +* $Revision: 1.27 $ * * History of changes * fixed partition handling and HDIO_GETGEO
@@ -414,9 +414,16 @@static int __init dasd_fba_init (void ) { +int ret; +ASCEBC (dasd_fba_discipline.ebcname,4 ); -return ccw_driver_register (&dasd_fba_driver); + ret =ccw_driver_register (&dasd_fba_driver); +if (ret) +return ret; + +dasd_generic_auto_online (&dasd_fba_driver); +return 0 ; }static void __exit
drivers/s390/block/dasd_genhd.c +5 -7
@@ -9,7 +9,7 @@* * Dealing with devices registered to multiple major numbers. * -* $Revision: 1.23 $ +* $Revision: 1.24 $ * * History of changes * 05/04/02 split from dasd.c, code restructuring.
@@ -108,7 +108,6 @@struct gendisk *dasd_gendisk_alloc (int devindex) { -struct list_head *l;struct major_info *mi;struct gendisk *gdp;int index, len, rc;
@@ -118,8 +117,7 @@while (1 ) {spin_lock (&dasd_major_lock); index = devindex; -list_for_each (l, &dasd_major_info) { - mi = list_entry(l, struct major_info, list); +list_for_each_entry (mi, &dasd_major_info, list) {if (index <DASD_PER_MAJOR )break ; index -=DASD_PER_MAJOR ;
@@ -142,6 +140,7 @@ gdp->major = mi->major; gdp->first_minor = index <<DASD_PARTN_BITS ; gdp->fops = &dasd_device_operations; + gdp->flags |=GENHD_FL_DEVFS ;/* * Set device name.
@@ -191,14 +190,12 @@*/ int dasd_gendisk_index_major (int devindex) { -struct list_head *l;struct major_info *mi;int rc;spin_lock (&dasd_major_lock); rc = -ENODEV ; -list_for_each (l, &dasd_major_info) { - mi = list_entry(l, struct major_info, list); +list_for_each_entry (mi, &dasd_major_info, list) {if (devindex <DASD_PER_MAJOR ) { rc = mi->major;break ;
@@ -231,6 +228,7 @@ dasd_destroy_partitions(dasd_device_t * device) {del_gendisk (device->gdp); +put_disk (device->gdp); }int
drivers/s390/block/dasd_int.h +26 -26
94 lines not on this page · raw message
drivers/s390/block/dasd_ioctl.c +1 -2
@@ -12,7 +12,6 @@* 05/04/02 split from dasd.c, code restructuring. */ #include <linux/config.h> -#include <linux/version.h> #include <linux/interrupt.h> #include <linux/major.h> #include <linux/fs.h>
@@ -333,7 +332,7 @@ cdev = device->cdev; - dasd_info->devno = device->devno; + dasd_info->devno =_ccw_device_get_device_number (device->cdev); dasd_info->schid =_ccw_device_get_subchannel_number (device->cdev); dasd_info->cu_type = cdev->id.cu_type; dasd_info->cu_model = cdev->id.cu_model;
drivers/s390/block/dasd_proc.c +4 -7
@@ -9,7 +9,7 @@* * /proc interface for the dasd driver. * -* $Revision: 1.17 $ +* $Revision: 1.18 $ * * History of changes * 05/04/02 split from dasd.c, code restructuring.
@@ -56,17 +56,14 @@static int dasd_devices_show (struct seq_file *m,void *v) { -dasd_devmap_t *devmap;dasd_device_t *device;char *substr; - devmap =dasd_devmap_from_devindex ((unsigned long ) v -1 ); - device = (devmap !=NULL ) ? -dasd_get_device (devmap) :ERR_PTR (-ENODEV ); + device =dasd_device_from_devindex ((unsigned long ) v -1 );if (IS_ERR (device))return 0 ;/* Print device number. */ -seq_printf (m,"%04x" , devmap->devno); +seq_printf (m,"%04x" ,_ccw_device_get_device_number (device->cdev));/* Print discipline string. */ if (device !=NULL && device->discipline !=NULL )seq_printf (m,"(%s)" , device->discipline->name);
@@ -113,7 +110,7 @@seq_printf (m,"no stat" );break ; } -dasd_put_device (devmap); +dasd_put_device (device);if (dasd_probeonly)seq_printf (m,"(probeonly)" );seq_printf (m,"\n" );