s390 patches for the 2.6.28 merge window
Subsystems (11)
cover s390 patches for the 2.6.28 merge window
Greetings,
I have the following patches on the features branch of git390 for the merge window of 2.6.28:
Christoph Hellwig (1):
[S390] s390: use sys_pause for 31bit pause entry point
Cornelia Huck (6):
[S390] cio: Update cio_ignore documentation.
[S390] cio: Exorcise cio_msg= from documentation.
[S390] bus_id -> dev_set_name() changes
[S390] more bus_id -> dev_name conversions
[S390] Use s390_root_dev_* in kvm_virtio.
[S390] bus_id -> dev_set_name() for css and ccw bussesHeiko Carstens (2):
[S390] nohz: Fix __udelay.
[S390] Move private simple udelay function to arch/s390/lib/delay.c.
Hongjie Yang (1):
[S390] dcssblk: add >2G DCSSs support and stacked contiguous DCSSs support.
Kay Sievers (1):
[S390] bus_id -> dev_name conversions
Klaus-Dieter Wacker (1):
[S390] qdio enhanced SIGA (iqdio) support.
Martin Schwidefsky (3):
[S390] bus_id ->dev_name() conversions in qdio [S390] ptrace changes
[S390] xpram: per device block request queues.
Nigel Hislop (1):
[S390] Add ioctl support for EMC Symmetrix Subsystem Control I/O
Peter Oberparleiter (3):
[S390] cio: move device unregistration to dedicated work queue [S390] cio: introduce purge function for /proc/cio_ignore [S390] cio: inline assembly cleanup
Stefan Haberland (1):
[S390] dasd: fix message flood for unsolicited interrupts
Ursula Braun (1):
[S390] qdio: speed up multicast traffic on full HiperSocket queue
Comments are as always welcome.
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 1/21 qdio: speed up multicast traffic on full HiperSocket queue
From: Ursula Braun <[email protected]>
If an asynchronous HiperSockets queue runs full, no further packet can be sent. In this case the next initiative to give transmitted skbs back to the stack is triggered only by a 10-seconds qdio timer. This timer has been introduced for low multicast traffic scenarios to guarantee freeing of skbs in a limited amount of time. For high HiperSocket multicast traffic scenarios progress checking on the outbound queue should be enforced by tasklet rescheduling.
---
drivers/s390/cio/qdio.h | 8 ++++++++ drivers/s390/cio/qdio_main.c | 6 ++++++ 2 files changed, 14 insertions(+)
drivers/s390/cio/qdio.h +8 -0
@@ -16,6 +16,14 @@#define QDIO_BUSY_BIT_GIVE_UP 2000000/* 2 seconds = eternity */ #define QDIO_INPUT_THRESHOLD 500/* 500 microseconds */ +/* +* if an asynchronous HiperSockets queue runs full, the 10 seconds timer wait +* till next initiative to give transmitted skbs back to the stack is too long. +* Therefore polling is started in case of multicast queue is filled more +* than 50 percent. +*/ +#define QDIO_IQDIO_POLL_LVL 65/* HS multicast queue */ +enum qdio_irq_states {QDIO_IRQ_STATE_INACTIVE ,QDIO_IRQ_STATE_ESTABLISHED ,
drivers/s390/cio/qdio_main.c +6 -0
@@ -851,6 +851,12 @@ static void __qdio_outbound_processing(sif (queue_type (q) ==QDIO_IQDIO_QFMT && !multicast_outbound (q))return ; +if ((queue_type (q) ==QDIO_IQDIO_QFMT ) && + (atomic_read (&q->nr_buf_used)) >QDIO_IQDIO_POLL_LVL ) { +tasklet_schedule (&q->tasklet); +return ; + } +if (q->u.out.pci_out_enabled)return ;
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 2/21 cio: move device unregistration to dedicated work queue
In reply to Martin SchwidefskyFrom: Peter Oberparleiter <[email protected]>
Use dedicated slow path work queue when unregistering a device due to a user action. This ensures serialialization of other register/ unregister requests.
---
drivers/s390/cio/device.c | 56 ++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 31 deletions(-)
drivers/s390/cio/device.c +25 -31
@@ -296,36 +296,33 @@ static void ccw_device_unregister(structdevice_del (&cdev->dev); } -static void ccw_device_remove_orphan_cb (struct device *dev) +static void ccw_device_remove_orphan_cb (struct work_struct *work) { -struct ccw_device *cdev =to_ccwdev (dev); +struct ccw_device_private *priv; +struct ccw_device *cdev; + priv = container_of(work, struct ccw_device_private, kick_work); + cdev = priv->cdev;ccw_device_unregister (cdev);put_device (&cdev->dev); +/* Release cdev reference for workqueue processing. */ +put_device (&cdev->dev); } -static void ccw_device_remove_sch_cb (struct device *dev) -{ -struct subchannel *sch; - - sch =to_subchannel (dev); -css_sch_device_unregister (sch); -/* Reset intparm to zeroes. */ - sch->schib.pmcw.intparm =0 ; -cio_modify (sch); -put_device (&sch->dev); -} +static void ccw_device_call_sch_unregister (struct work_struct *work);static void ccw_device_remove_disconnected (struct ccw_device *cdev) {unsigned long flags; -int rc;/* * Forced offline in disconnected state means * 'throw away device'. */ +/* Get cdev reference for workqueue processing. */ +if (!get_device (&cdev->dev)) +return ;if (ccw_device_is_orphan (cdev)) {/* * Deregister ccw device.
@@ -335,23 +332,13 @@ ccw_device_remove_disconnected(struct ccspin_lock_irqsave (cdev->ccwlock, flags); cdev->private->state =DEV_STATE_NOT_OPER ;spin_unlock_irqrestore (cdev->ccwlock, flags); - rc =device_schedule_callback (&cdev->dev, - ccw_device_remove_orphan_cb); -if (rc) -CIO_MSG_EVENT (0 ,"Couldn't unregister orphan " -"0.%x.%04x\n" , - cdev->private->dev_id.ssid, - cdev->private->dev_id.devno); -return ; - } -/* Deregister subchannel, which will kill the ccw device. */ - rc =device_schedule_callback (cdev->dev.parent, - ccw_device_remove_sch_cb); -if (rc) -CIO_MSG_EVENT (0 ,"Couldn't unregister disconnected device " -"0.%x.%04x\n" , - cdev->private->dev_id.ssid, - cdev->private->dev_id.devno); +PREPARE_WORK (&cdev->private->kick_work, + ccw_device_remove_orphan_cb); + }else +/* Deregister subchannel, which will kill the ccw device. */ +PREPARE_WORK (&cdev->private->kick_work, + ccw_device_call_sch_unregister); +queue_work (slow_path_wq, &cdev->private->kick_work); }/**
@@ -970,12 +957,17 @@ static void ccw_device_call_sch_unregist priv = container_of(work, struct ccw_device_private, kick_work); cdev = priv->cdev; +/* Get subchannel reference for local processing. */ +if (!get_device (cdev->dev.parent)) +return ; sch =to_subchannel (cdev->dev.parent);css_sch_device_unregister (sch);/* Reset intparm to zeroes. */ sch->schib.pmcw.intparm =0 ;cio_modify (sch); +/* Release cdev reference for workqueue processing.*/ put_device (&cdev->dev); +/* Release subchannel reference for local processing. */ put_device (&sch->dev); }
@@ -1001,6 +993,8 @@ io_subchannel_recog_done(struct ccw_deviPREPARE_WORK (&cdev->private->kick_work, ccw_device_call_sch_unregister);queue_work (slow_path_wq, &cdev->private->kick_work); +/* Release subchannel reference for asynchronous recognition. */ +put_device (&sch->dev);if (atomic_dec_and_test (&ccw_device_init_count))wake_up (&ccw_device_init_wq);break ;
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 3/21 cio: introduce purge function for /proc/cio_ignore
In reply to Martin SchwidefskyFrom: Peter Oberparleiter <[email protected]>
Allow users to remove blacklisted ccw devices by using the /proc/cio_ignore interface:
echo purge > /proc/cio_ignore
will remove all devices which are offline and blacklisted.
---
drivers/s390/cio/blacklist.c | 11 +++++++---- drivers/s390/cio/device.c | 40 ++++++++++++++++++++++++++++++++++++++++ drivers/s390/cio/device.h | 1 + 3 files changed, 48 insertions(+), 4 deletions(-)
drivers/s390/cio/blacklist.c +7 -4
@@ -24,6 +24,7 @@#include "cio.h" #include "cio_debug.h" #include "css.h" +#include "device.h" /* * "Blacklisting" of certain devices:
@@ -191,9 +192,9 @@ static int blacklist_parse_parameters(ch rc =blacklist_range (ra, from_ssid, to_ssid, from, to, msgtrigger);if (rc) - totalrc =1 ; + totalrc = -EINVAL ; }else - totalrc =1 ; + totalrc = -EINVAL ; }return totalrc;
@@ -240,8 +241,10 @@ static int blacklist_parse_proc_paramete rc =blacklist_parse_parameters (buf, free,0 ); else if (strcmp("add", parm) == 0) rc =blacklist_parse_parameters (buf, add,0 ); + else if (strcmp("purge", parm) == 0) +return ccw_purge_blacklisted (); else - return 1; + return -EINVAL;css_schedule_reprobe ();
@@ -353,7 +356,7 @@ cio_ignore_write(struct file *file, cons } ret =blacklist_parse_proc_parameters (buf);if (ret) - rc = -EINVAL ; + rc = ret;else rc = user_len;
drivers/s390/cio/device.c +40 -0
@@ -31,6 +31,7 @@#include "device.h" #include "ioasm.h" #include "io_sch.h" +#include "blacklist.h" static struct timer_list recovery_timer;static DEFINE_SPINLOCK (recovery_lock);
@@ -1470,6 +1471,45 @@ static void ccw_device_schedule_recoveryspin_unlock_irqrestore (&recovery_lock, flags); } +static int purge_fn (struct device *dev,void *data) +{ +struct ccw_device *cdev =to_ccwdev (dev); +struct ccw_device_private *priv = cdev->private; +int unreg; + +spin_lock_irq (cdev->ccwlock); + unreg =is_blacklisted (priv->dev_id.ssid, priv->dev_id.devno) && + (priv->state ==DEV_STATE_OFFLINE ); +spin_unlock_irq (cdev->ccwlock); +if (!unreg) + goto out; +if (!get_device (&cdev->dev)) + goto out; +CIO_MSG_EVENT (3 ,"ccw: purging 0.%x.%04x\n" , priv->dev_id.ssid, + priv->dev_id.devno); +PREPARE_WORK (&cdev->private->kick_work, ccw_device_call_sch_unregister); +queue_work (slow_path_wq, &cdev->private->kick_work); + +out: +/* Abort loop in case of pending signal. */ +if (signal_pending (current)) +return -EINTR ; + +return 0 ; +} + +/** +* ccw_purge_blacklisted - purge unused, blacklisted devices +* +* Unregister all ccw devices that are offline and on the blacklist. +*/ +int ccw_purge_blacklisted (void ) +{ +CIO_MSG_EVENT (2 ,"ccw: purging blacklisted devices\n" ); +bus_for_each_dev (&ccw_bus_type,NULL ,NULL , purge_fn); +return 0 ; +} +static void device_set_disconnected (struct ccw_device *cdev) {if (!cdev)
drivers/s390/cio/device.h +1 -0
@@ -86,6 +86,7 @@ int ccw_device_is_orphan(struct ccw_deviint ccw_device_recognition (struct ccw_device *);int ccw_device_online (struct ccw_device *);int ccw_device_offline (struct ccw_device *); +int ccw_purge_blacklisted (void );/* Function prototypes for device status and basic sense stuff. */ void ccw_device_accumulate_irb (struct ccw_device *,struct irb *);
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 4/21 cio: Update cio_ignore documentation.
In reply to Martin SchwidefskyFrom: Cornelia Huck <[email protected]>
Add documentation for the new "purge" cio_ignore parameter.
---
Documentation/s390/CommonIO | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
Documentation/s390/CommonIO +7 -1
@@ -70,13 +70,19 @@ Command line parameters Note: While already known devices can be added to the list of devices to be ignored, there will be no effect on then. However, if such a device - disappears and then reappears, it will then be ignored. + disappears and then reappears, it will then be ignored. To make + known devices go away, you need the "purge" command (see below). For example, "echo add 0.0.a000-0.0.accc, 0.0.af00-0.0.afff > /proc/cio_ignore" will add 0.0.a000-0.0.accc and 0.0.af00-0.0.afff to the list of ignored devices. + You can remove already known but now ignored devices via + "echo purge > /proc/cio_ignore" + All devices ignored but still registered and not online (= not in use) + will be deregistered and thus removed from the system. + The devices can be specified either by bus id (0.x.abcd) or, for 2.4 backward compatibility, by the device number in hexadecimal (0xabcd or abcd). Device numbers given as 0xabcd will be interpreted as 0.0.abcd.
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 5/21 cio: Exorcise cio_msg= from documentation.
In reply to Martin SchwidefskyFrom: Cornelia Huck <[email protected]>
---
Documentation/s390/CommonIO | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
Documentation/s390/CommonIO +1 -2
@@ -104,8 +104,7 @@ debugfs entries handling). - /sys/kernel/debug/s390dbf/cio_msg/sprintf - Various debug messages from the common I/O-layer, including messages - printed when cio_msg=yes. + Various debug messages from the common I/O-layer. - /sys/kernel/debug/s390dbf/cio_trace/hex_ascii Logs the calling of functions in the common I/O-layer and, if applicable,
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 6/21 bus_id -> dev_name conversions
In reply to Martin SchwidefskyFrom: Kay Sievers <[email protected]>
bus_id -> dev_name() conversions in s390 code.
---
drivers/s390/block/dasd.c | 32 ++++---- drivers/s390/block/dasd_3990_erp.c | 2 drivers/s390/block/dasd_devmap.c | 28 +++---- drivers/s390/block/dasd_eckd.c | 6 - drivers/s390/block/dasd_eer.c | 6 + drivers/s390/block/dasd_fba.c | 4 - drivers/s390/block/dasd_int.h | 4 - drivers/s390/block/dasd_proc.c | 2 drivers/s390/block/dcssblk.c | 5 - drivers/s390/char/tape_3590.c | 132 +++++++++++++++++++------------------ drivers/s390/char/tape_block.c | 2 drivers/s390/char/tape_core.c | 21 +++-- drivers/s390/char/tape_proc.c | 2 drivers/s390/char/tape_std.c | 13 +-- drivers/s390/char/vmlogrdr.c | 2 drivers/s390/char/vmur.c | 6 - drivers/s390/cio/ccwgroup.c | 2 drivers/s390/cio/cio.c | 16 ++-- drivers/s390/cio/device.c | 4 - drivers/s390/cio/device_fsm.c | 6 + drivers/s390/cio/device_ops.c | 2 drivers/s390/net/claw.c | 23 +++--- drivers/s390/net/claw.h | 2 drivers/s390/net/ctcm_main.c | 18 ++--- drivers/s390/net/ctcm_main.h | 2 drivers/s390/net/lcs.c | 34 +++++---- drivers/s390/net/qeth_core.h | 10 +- drivers/s390/net/qeth_core_main.c | 10 +- drivers/s390/scsi/zfcp_def.h | 2 29 files changed, 207 insertions(+), 191 deletions(-)
drivers/s390/block/dasd_3990_erp.c +1 -1
@@ -1397,7 +1397,7 @@ static struct dasd_ccw_req *dasd_3990_erDEV_MESSAGE (KERN_ERR , cqr->startdev,"ERP on alias device for request %p," " recover on base device %s" , cqr, - cqr->block->base->cdev->dev.bus_id); +dev_name (&cqr->block->base->cdev->dev)); }dasd_eckd_reset_ccw_to_base_io (cqr); erp->startdev = cqr->block->base;
drivers/s390/block/dasd.c +16 -16
@@ -215,7 +215,7 @@ static int dasd_state_known_to_basic(strreturn rc; }/* register 'device' debug area, used for all DBF_DEV_XXX calls */ - device->debug_area =debug_register (device->cdev->dev.bus_id,1 ,1 , + device->debug_area =debug_register (dev_name (&device->cdev->dev),1 ,1 ,8 *sizeof (long ));debug_register_view (device->debug_area, &debug_sprintf_view);debug_set_level (device->debug_area,DBF_WARNING );
@@ -933,7 +933,7 @@ static void dasd_handle_killed_request(sMESSAGE (KERN_DEBUG ,"invalid status in handle_killed_request: " "bus_id %s, status %02x" , - cdev->dev.bus_id, cqr->status); +dev_name (&cdev->dev), cqr->status);return ; }
@@ -942,7 +942,7 @@ static void dasd_handle_killed_request(s device != dasd_device_from_cdev_locked(cdev) || strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) {MESSAGE (KERN_DEBUG ,"invalid device in request: bus_id %s" , - cdev->dev.bus_id); +dev_name (&cdev->dev));return ; }
@@ -982,11 +982,11 @@ void dasd_int_handler(struct ccw_devicebreak ;case -ETIMEDOUT :printk (KERN_WARNING "%s(%s): request timed out\n" , - __func__, cdev->dev.bus_id); + __func__,dev_name (&cdev->dev));break ;default :printk (KERN_WARNING "%s(%s): unknown error %ld\n" , - __func__, cdev->dev.bus_id,PTR_ERR (irb)); + __func__,dev_name (&cdev->dev),PTR_ERR (irb)); }dasd_handle_killed_request (cdev, intparm);return ;
@@ -995,7 +995,7 @@ void dasd_int_handler(struct ccw_device now =get_clock ();DBF_EVENT (DBF_ERR ,"Interrupt: bus_id %s CS/DS %04x ip %08x" , - cdev->dev.bus_id, ((irb->scsw.cmd.cstat <<8 ) | +dev_name (&cdev->dev), ((irb->scsw.cmd.cstat <<8 ) | irb->scsw.cmd.dstat), (unsigned int ) intparm);/* check for unsolicited interrupts */
@@ -1019,7 +1019,7 @@ void dasd_int_handler(struct ccw_deviceif (!device ||strncmp (device->discipline->ebcname, (char *) &cqr->magic,4 )) {MESSAGE (KERN_DEBUG ,"invalid device in request: bus_id %s" , - cdev->dev.bus_id); +dev_name (&cdev->dev));return ; }
@@ -1037,7 +1037,7 @@ void dasd_int_handler(struct ccw_deviceif (cqr->status !=DASD_CQR_IN_IO ) {MESSAGE (KERN_DEBUG ,"invalid status: bus_id %s, status %02x" , - cdev->dev.bus_id, cqr->status); +dev_name (&cdev->dev), cqr->status);return ; } DBF_DEV_EVENT(DBF_DEBUG, device, "Int: CS/DS 0x%04x for cqr %p",
@@ -2134,14 +2134,14 @@ int dasd_generic_probe(struct ccw_deviceif (ret) {printk (KERN_WARNING "dasd_generic_probe: could not set ccw-device options " -"for %s\n" , cdev->dev.bus_id); +"for %s\n" ,dev_name (&cdev->dev));return ret; } ret =dasd_add_sysfs_files (cdev);if (ret) {printk (KERN_WARNING "dasd_generic_probe: could not add sysfs entries " -"for %s\n" , cdev->dev.bus_id); +"for %s\n" ,dev_name (&cdev->dev));return ret; } cdev->handler = &dasd_int_handler;
@@ -2152,13 +2152,13 @@ int dasd_generic_probe(struct ccw_device* initial probe. */ if ((dasd_get_feature (cdev,DASD_FEATURE_INITIAL_ONLINE ) >0 ) || - (dasd_autodetect &&dasd_busid_known (cdev->dev.bus_id) !=0 )) + (dasd_autodetect &&dasd_busid_known (dev_name (&cdev->dev)) !=0 )) ret =ccw_device_set_online (cdev);if (ret)printk (KERN_WARNING "dasd_generic_probe: could not initially " "online ccw-device %s; return code: %d\n" , - cdev->dev.bus_id, ret); +dev_name (&cdev->dev), ret);return 0 ; }
@@ -2224,7 +2224,7 @@ int dasd_generic_set_online(struct ccw_dprintk (KERN_WARNING "dasd_generic couldn't online device %s " "- discipline DIAG not available\n" , - cdev->dev.bus_id); +dev_name (&cdev->dev));dasd_delete_device (device);return -ENODEV ; }
@@ -2248,7 +2248,7 @@ int dasd_generic_set_online(struct ccw_dprintk (KERN_WARNING "dasd_generic couldn't online device %s " "with discipline %s rc=%i\n" , - cdev->dev.bus_id, discipline->name, rc); +dev_name (&cdev->dev), discipline->name, rc);module_put (discipline->owner);module_put (base_discipline->owner);dasd_delete_device (device);
@@ -2259,7 +2259,7 @@ int dasd_generic_set_online(struct ccw_dif (device->state <=DASD_STATE_KNOWN ) {printk (KERN_WARNING "dasd_generic discipline not found for %s\n" , - cdev->dev.bus_id); +dev_name (&cdev->dev)); rc = -ENODEV ;dasd_set_target_state (device,DASD_STATE_NEW );if (device->block)
@@ -2267,7 +2267,7 @@ int dasd_generic_set_online(struct ccw_ddasd_delete_device (device); }else pr_debug ("dasd_generic device %s found\n" , - cdev->dev.bus_id); +dev_name (&cdev->dev));/* FIXME: we have to wait for the root device but we don't want * to wait for each single device but for all at once. */
drivers/s390/block/dasd_devmap.c +14 -14
@@ -515,9 +515,9 @@ dasd_devmap_from_cdev(struct ccw_device {struct dasd_devmap *devmap; - devmap =dasd_find_busid (cdev->dev.bus_id); + devmap =dasd_find_busid (dev_name (&cdev->dev));if (IS_ERR (devmap)) - devmap =dasd_add_busid (cdev->dev.bus_id, + devmap =dasd_add_busid (dev_name (&cdev->dev),DASD_FEATURE_DEFAULT );return devmap; }
@@ -584,7 +584,7 @@ dasd_delete_device(struct dasd_device *dunsigned long flags;/* First remove device pointer from devmap. */ - devmap =dasd_find_busid (device->cdev->dev.bus_id); + devmap =dasd_find_busid (dev_name (&device->cdev->dev));BUG_ON (IS_ERR (devmap));spin_lock (&dasd_devmap_lock);if (devmap->device != device) {
@@ -674,7 +674,7 @@ dasd_ro_show(struct device *dev, structstruct dasd_devmap *devmap;int ro_flag; - devmap =dasd_find_busid (dev->bus_id); + devmap =dasd_find_busid (dev_name (dev));if (!IS_ERR (devmap)) ro_flag = (devmap->features &DASD_FEATURE_READONLY ) !=0 ;else
@@ -723,7 +723,7 @@ dasd_erplog_show(struct device *dev, strstruct dasd_devmap *devmap;int erplog; - devmap =dasd_find_busid (dev->bus_id); + devmap =dasd_find_busid (dev_name (dev));if (!IS_ERR (devmap)) erplog = (devmap->features &DASD_FEATURE_ERPLOG ) !=0 ;else
@@ -770,7 +770,7 @@ dasd_use_diag_show(struct device *dev, sstruct dasd_devmap *devmap;int use_diag; - devmap =dasd_find_busid (dev->bus_id); + devmap =dasd_find_busid (dev_name (dev));if (!IS_ERR (devmap)) use_diag = (devmap->features &DASD_FEATURE_USEDIAG ) !=0 ;else
@@ -876,7 +876,7 @@ dasd_alias_show(struct device *dev, strustruct dasd_devmap *devmap;int alias; - devmap =dasd_find_busid (dev->bus_id); + devmap =dasd_find_busid (dev_name (dev));spin_lock (&dasd_devmap_lock);if (IS_ERR (devmap) ||strlen (devmap->uid.vendor) ==0 ) {spin_unlock (&dasd_devmap_lock);
@@ -899,7 +899,7 @@ dasd_vendor_show(struct device *dev, strstruct dasd_devmap *devmap;char *vendor; - devmap =dasd_find_busid (dev->bus_id); + devmap =dasd_find_busid (dev_name (dev));spin_lock (&dasd_devmap_lock);if (!IS_ERR (devmap) &&strlen (devmap->uid.vendor) >0 ) vendor = devmap->uid.vendor;
@@ -924,7 +924,7 @@ dasd_uid_show(struct device *dev, structchar ua_string[3 ];struct dasd_uid *uid; - devmap =dasd_find_busid (dev->bus_id); + devmap =dasd_find_busid (dev_name (dev));spin_lock (&dasd_devmap_lock);if (IS_ERR (devmap) ||strlen (devmap->uid.vendor) ==0 ) {spin_unlock (&dasd_devmap_lock);
@@ -972,7 +972,7 @@ dasd_eer_show(struct device *dev, structstruct dasd_devmap *devmap;int eer_flag; - devmap =dasd_find_busid (dev->bus_id); + devmap =dasd_find_busid (dev_name (dev));if (!IS_ERR (devmap) && devmap->device) eer_flag =dasd_eer_enabled (devmap->device);else
@@ -1034,7 +1034,7 @@ dasd_get_uid(struct ccw_device *cdev, st {struct dasd_devmap *devmap; - devmap =dasd_find_busid (cdev->dev.bus_id); + devmap =dasd_find_busid (dev_name (&cdev->dev));if (IS_ERR (devmap))return PTR_ERR (devmap);spin_lock (&dasd_devmap_lock);
@@ -1057,7 +1057,7 @@ dasd_set_uid(struct ccw_device *cdev, st {struct dasd_devmap *devmap; - devmap =dasd_find_busid (cdev->dev.bus_id); + devmap =dasd_find_busid (dev_name (&cdev->dev));if (IS_ERR (devmap))return PTR_ERR (devmap);
@@ -1077,7 +1077,7 @@ dasd_get_feature(struct ccw_device *cdev {struct dasd_devmap *devmap; - devmap =dasd_find_busid (cdev->dev.bus_id); + devmap =dasd_find_busid (dev_name (&cdev->dev));if (IS_ERR (devmap))return PTR_ERR (devmap);
@@ -1093,7 +1093,7 @@ dasd_set_feature(struct ccw_device *cdev {struct dasd_devmap *devmap; - devmap =dasd_find_busid (cdev->dev.bus_id); + devmap =dasd_find_busid (dev_name (&cdev->dev));if (IS_ERR (devmap))return PTR_ERR (devmap);
drivers/s390/block/dasd_eckd.c +3 -3
@@ -84,7 +84,7 @@ dasd_eckd_probe (struct ccw_device *cdevif (ret) {printk (KERN_WARNING "dasd_eckd_probe: could not set ccw-device options " -"for %s\n" , cdev->dev.bus_id); +"for %s\n" ,dev_name (&cdev->dev));return ret; } ret =dasd_generic_probe (cdev, &dasd_eckd_discipline);
@@ -2145,13 +2145,13 @@ static void dasd_eckd_dump_sense(struct/* dump the sense data */ len = sprintf(page, KERN_ERR PRINTK_HEADER" I/O status report for device %s:\n" , - device->cdev->dev.bus_id); +dev_name (&device->cdev->dev)); len += sprintf(page + len, KERN_ERR PRINTK_HEADER" in req: %p CS: 0x%02X DS: 0x%02X\n" , req, irb->scsw.cmd.cstat, irb->scsw.cmd.dstat); len += sprintf(page + len, KERN_ERR PRINTK_HEADER" device %s: Failing CCW: %p\n" , - device->cdev->dev.bus_id, +dev_name (&device->cdev->dev), (void *) (addr_t ) irb->scsw.cmd.cpa);if (irb->esw.esw0.erw.cons) {for (sl =0 ; sl <4 ; sl++) {
drivers/s390/block/dasd_eer.c +4 -2
@@ -309,7 +309,8 @@ static void dasd_eer_write_standard_trigdo_gettimeofday (&tv); header.tv_sec = tv.tv_sec; header.tv_usec = tv.tv_usec; -strncpy (header.busid, device->cdev->dev.bus_id,DASD_EER_BUSID_SIZE ); +strncpy (header.busid,dev_name (&device->cdev->dev), +DASD_EER_BUSID_SIZE );spin_lock_irqsave (&bufferlock, flags);list_for_each_entry (eerb, &bufferlist, list) {
@@ -349,7 +350,8 @@ static void dasd_eer_write_snss_trigger(do_gettimeofday (&tv); header.tv_sec = tv.tv_sec; header.tv_usec = tv.tv_usec; -strncpy (header.busid, device->cdev->dev.bus_id,DASD_EER_BUSID_SIZE ); +strncpy (header.busid,dev_name (&device->cdev->dev), +DASD_EER_BUSID_SIZE );spin_lock_irqsave (&bufferlock, flags);list_for_each_entry (eerb, &bufferlist, list) {
drivers/s390/block/dasd_fba.c +2 -2
@@ -451,13 +451,13 @@ dasd_fba_dump_sense(struct dasd_device * } len = sprintf(page, KERN_ERR PRINTK_HEADER" I/O status report for device %s:\n" , - device->cdev->dev.bus_id); +dev_name (&device->cdev->dev)); len += sprintf(page + len, KERN_ERR PRINTK_HEADER" in req: %p CS: 0x%02X DS: 0x%02X\n" , req, irb->scsw.cmd.cstat, irb->scsw.cmd.dstat); len += sprintf(page + len, KERN_ERR PRINTK_HEADER" device %s: Failing CCW: %p\n" , - device->cdev->dev.bus_id, +dev_name (&device->cdev->dev), (void *) (addr_t ) irb->scsw.cmd.cpa);if (irb->esw.esw0.erw.cons) {for (sl =0 ; sl <4 ; sl++) {
drivers/s390/block/dasd_int.h +2 -2
@@ -126,7 +126,7 @@ do { \ #define DEV_MESSAGE(d_loglevel,d_device,d_string,d_args...)\ do { \ printk(d_loglevel PRINTK_HEADER " %s: " d_string "\n", \ - d_device->cdev->dev.bus_id, d_args); \ + dev_name(&d_device->cdev->dev), d_args); \ DBF_DEV_EVENT(DBF_ALERT, d_device, d_string, d_args); \ } while(0)
@@ -140,7 +140,7 @@ do { \ #define DEV_MESSAGE_LOG(d_loglevel,d_device,d_string,d_args...)\ do { \ printk(d_loglevel PRINTK_HEADER " %s: " d_string "\n", \ - d_device->cdev->dev.bus_id, d_args); \ + dev_name(&d_device->cdev->dev), d_args); \ } while(0) #define MESSAGE_LOG(d_loglevel,d_string,d_args...)\
drivers/s390/block/dasd_proc.c +1 -1
@@ -67,7 +67,7 @@ dasd_devices_show(struct seq_file *m, voreturn 0 ; }/* Print device number. */ -seq_printf (m,"%s" , device->cdev->dev.bus_id); +seq_printf (m,"%s" ,dev_name (&device->cdev->dev));/* Print discipline string. */ if (device !=NULL && device->discipline !=NULL )seq_printf (m,"(%s)" , device->discipline->name);
drivers/s390/block/dcssblk.c +3 -2
@@ -91,7 +91,7 @@ static struct rw_semaphore dcssblk_devicstatic void dcssblk_release_segment (struct device *dev) { -PRINT_DEBUG ("segment release fn called for %s\n" , dev->bus_id); +PRINT_DEBUG ("segment release fn called for %s\n" ,dev_name (dev));kfree (container_of(dev ,struct dcssblk_dev_info ,dev ));module_put (THIS_MODULE ); }
@@ -602,7 +602,8 @@ dcssblk_make_request(struct request_queucase SEG_TYPE_SC :/* cannot write to these segments */ if (bio_data_dir (bio) ==WRITE ) { -PRINT_WARN ("rejecting write to ro segment %s\n" , dev_info->dev.bus_id); +PRINT_WARN ("rejecting write to ro segment %s\n" , +dev_name (&dev_info->dev)); goto fail; } }
drivers/s390/char/tape_3590.c +68 -64
394 lines not on this page · raw message
drivers/s390/char/tape_block.c +1 -1
@@ -278,7 +278,7 @@ tapeblock_cleanup_device(struct tape_devif (!device->blk_data.disk) {PRINT_ERR ("(%s): No gendisk to clean up!\n" , - device->cdev->dev.bus_id); +dev_name (&device->cdev->dev)); goto cleanup_queue; }
drivers/s390/char/tape_core.c +11 -10
@@ -215,12 +215,12 @@ tape_med_state_set(struct tape_device *dcase MS_UNLOADED : device->tape_generic_status |=GMT_DR_OPEN (~0 );PRINT_INFO ("(%s): Tape is unloaded\n" , - device->cdev->dev.bus_id); +dev_name (&device->cdev->dev));break ;case MS_LOADED : device->tape_generic_status &= ~GMT_DR_OPEN (~0 );PRINT_INFO ("(%s): Tape has been mounted\n" , - device->cdev->dev.bus_id); +dev_name (&device->cdev->dev));break ;default :// print nothing
@@ -415,7 +415,7 @@ tape_generic_offline(struct tape_device device->cdev_id);PRINT_WARN ("(%s): Set offline failed " "- drive in use.\n" , - device->cdev->dev.bus_id); +dev_name (&device->cdev->dev));spin_unlock_irq (get_ccwdev_lock (device->cdev));return -EBUSY ; }
@@ -538,7 +538,8 @@ tape_generic_probe(struct ccw_device *cd ret =sysfs_create_group (&cdev->dev.kobj, &tape_attr_group);if (ret) {tape_put_device (device); -PRINT_ERR ("probe failed for tape device %s\n" , cdev->dev.bus_id); +PRINT_ERR ("probe failed for tape device %s\n" , +dev_name (&cdev->dev));return ret; } cdev->dev.driver_data = device;
@@ -546,7 +547,7 @@ tape_generic_probe(struct ccw_device *cd device->cdev = cdev;ccw_device_get_id (cdev, &dev_id); device->cdev_id =devid_to_int (&dev_id); -PRINT_INFO ("tape device %s found\n" , cdev->dev.bus_id); +PRINT_INFO ("tape device %s found\n" ,dev_name (&cdev->dev));return ret; }
@@ -616,7 +617,7 @@ tape_generic_remove(struct ccw_device *c device->cdev_id);PRINT_WARN ("(%s): Drive in use vanished - " "expect trouble!\n" , - device->cdev->dev.bus_id); +dev_name (&device->cdev->dev));PRINT_WARN ("State was %i\n" , device->tape_state);tape_state_set (device,TS_NOT_OPER );__tape_discard_requests (device);
@@ -840,7 +841,7 @@ tape_dump_sense(struct tape_device* deviPRINT_INFO ("-------------------------------------------------\n" );PRINT_INFO ("DSTAT : %02x CSTAT: %02x CPA: %04x\n" , irb->scsw.cmd.dstat, irb->scsw.cmd.cstat, irb->scsw.cmd.cpa); -PRINT_INFO ("DEVICE: %s\n" , device->cdev->dev.bus_id); +PRINT_INFO ("DEVICE: %s\n" ,dev_name (&device->cdev->dev));if (request !=NULL )PRINT_INFO ("OP : %s\n" , tape_op_verbose[request->op]);
@@ -1051,7 +1052,7 @@ __tape_do_irq (struct ccw_device *cdev, device = (struct tape_device *) cdev->dev.driver_data;if (device ==NULL ) {PRINT_ERR ("could not get device structure for %s " -"in interrupt\n" , cdev->dev.bus_id); +"in interrupt\n" ,dev_name (&cdev->dev));return ; } request = (struct tape_request *) intparm;
@@ -1064,13 +1065,13 @@ __tape_do_irq (struct ccw_device *cdev,switch (PTR_ERR (irb)) {case -ETIMEDOUT :PRINT_WARN ("(%s): Request timed out\n" , - cdev->dev.bus_id); +dev_name (&cdev->dev));case -EIO :__tape_end_request (device, request, -EIO );break ;default :PRINT_ERR ("(%s): Unexpected i/o error %li\n" , - cdev->dev.bus_id, +dev_name (&cdev->dev),PTR_ERR (irb)); }return ;
drivers/s390/char/tape_proc.c +1 -1
@@ -52,7 +52,7 @@ static int tape_proc_show(struct seq_filreturn 0 ;spin_lock_irq (get_ccwdev_lock (device->cdev));seq_printf (m,"%d\t" , (int ) n); -seq_printf (m,"%-10.10s " , device->cdev->dev.bus_id); +seq_printf (m,"%-10.10s " ,dev_name (&device->cdev->dev));seq_printf (m,"%04X/" , device->cdev->id.cu_type);seq_printf (m,"%02X\t" , device->cdev->id.cu_model);seq_printf (m,"%04X/" , device->cdev->id.dev_type);
drivers/s390/char/tape_std.c +7 -6
@@ -47,7 +47,7 @@ tape_std_assign_timeout(unsigned long da rc =tape_cancel_io (device, request);if (rc)PRINT_ERR ("(%s): Assign timeout: Cancel failed with rc = %i\n" , - device->cdev->dev.bus_id, rc); +dev_name (&device->cdev->dev), rc); }
@@ -83,7 +83,7 @@ tape_std_assign(struct tape_device *deviif (rc !=0 ) {PRINT_WARN ("%s: assign failed - device might be busy\n" , - device->cdev->dev.bus_id); +dev_name (&device->cdev->dev));DBF_EVENT (3 ,"%08x: assign failed - device might be busy\n" , device->cdev_id); }else {
@@ -106,7 +106,7 @@ tape_std_unassign (struct tape_device *dDBF_EVENT (3 ,"(%08x): Can't unassign device\n" , device->cdev_id);PRINT_WARN ("(%s): Can't unassign device - device gone\n" , - device->cdev->dev.bus_id); +dev_name (&device->cdev->dev));return -EIO ; }
@@ -120,7 +120,8 @@ tape_std_unassign (struct tape_device *dif ((rc =tape_do_io (device, request)) !=0 ) {DBF_EVENT (3 ,"%08x: Unassign failed\n" , device->cdev_id); -PRINT_WARN ("%s: Unassign failed\n" , device->cdev->dev.bus_id); +PRINT_WARN ("%s: Unassign failed\n" , +dev_name (&device->cdev->dev)); }else {DBF_EVENT (3 ,"%08x: Tape unassigned\n" , device->cdev_id); }
@@ -634,10 +635,10 @@ tape_std_mtcompression(struct tape_devicDBF_EXCEPTION (6 ,"xcom parm\n" );if (*device->modeset_byte &0x08 )PRINT_INFO ("(%s) Compression is currently on\n" , - device->cdev->dev.bus_id); +dev_name (&device->cdev->dev));else PRINT_INFO ("(%s) Compression is currently off\n" , - device->cdev->dev.bus_id); +dev_name (&device->cdev->dev));PRINT_INFO ("Use 1 to switch compression on, 0 to " "switch it off\n" );return -EINVAL ;
drivers/s390/char/vmlogrdr.c +1 -1
@@ -751,7 +751,7 @@ static int vmlogrdr_register_device(stru priv->class_device =device_create_drvdata (vmlogrdr_class, dev,MKDEV (vmlogrdr_major, priv->minor_num), - priv,"%s" , dev->bus_id); + priv,"%s" ,dev_name (dev));if (IS_ERR (priv->class_device)) { ret =PTR_ERR (priv->class_device); priv->class_device=NULL ;
drivers/s390/char/vmur.c +3 -3
@@ -886,11 +886,11 @@ static int ur_set_online(struct ccw_devi goto fail_free_cdev;if (urd->cdev->id.cu_type ==READER_PUNCH_DEVTYPE ) {if (urd->class ==DEV_CLASS_UR_I ) -sprintf (node_id,"vmrdr-%s" , cdev->dev.bus_id); +sprintf (node_id,"vmrdr-%s" ,dev_name (&cdev->dev));if (urd->class ==DEV_CLASS_UR_O ) -sprintf (node_id,"vmpun-%s" , cdev->dev.bus_id); +sprintf (node_id,"vmpun-%s" ,dev_name (&cdev->dev)); }else if (urd->cdev->id.cu_type ==PRINTER_DEVTYPE ) { -sprintf (node_id,"vmprt-%s" , cdev->dev.bus_id); +sprintf (node_id,"vmprt-%s" ,dev_name (&cdev->dev)); }else { rc = -EOPNOTSUPP ; goto fail_free_cdev;
drivers/s390/cio/ccwgroup.c +1 -1
@@ -270,7 +270,7 @@ int ccwgroup_create_from_string(struct d }snprintf (gdev->dev.bus_id,BUS_ID_SIZE ,"%s" , - gdev->cdev[0 ]->dev.bus_id); +dev_name (&gdev->cdev[0 ]->dev)); rc =device_add (&gdev->dev);if (rc)
drivers/s390/cio/cio.c +8 -8
@@ -153,7 +153,7 @@ cio_start_handle_notoper(struct subchannCIO_MSG_EVENT (2 ,"cio_start: 'not oper' status for " "subchannel 0.%x.%04x!\n" , sch->schid.ssid, sch->schid.sch_no); -sprintf (dbf_text,"no%s" , sch->dev.bus_id); +sprintf (dbf_text,"no%s" ,dev_name (&sch->dev));CIO_TRACE_EVENT (0 , dbf_text);CIO_HEX_EVENT (0 , &sch->schib,sizeof (struct schib ));
@@ -171,7 +171,7 @@ cio_start_key (struct subchannel *sch, /union orb *orb;CIO_TRACE_EVENT (4 ,"stIO" ); -CIO_TRACE_EVENT (4 , sch->dev.bus_id); +CIO_TRACE_EVENT (4 ,dev_name (&sch->dev)); orb = &to_io_private (sch)->orb;memset (orb,0 ,sizeof (union orb ));
@@ -232,7 +232,7 @@ cio_resume (struct subchannel *sch)int ccode;CIO_TRACE_EVENT (4 ,"resIO" ); -CIO_TRACE_EVENT (4 , sch->dev.bus_id); +CIO_TRACE_EVENT (4 ,dev_name (&sch->dev)); ccode =rsch (sch->schid);
@@ -269,7 +269,7 @@ cio_halt(struct subchannel *sch)return -ENODEV ;CIO_TRACE_EVENT (2 ,"haltIO" ); -CIO_TRACE_EVENT (2 , sch->dev.bus_id); +CIO_TRACE_EVENT (2 ,dev_name (&sch->dev));/* * Issue "Halt subchannel" and process condition code
@@ -304,7 +304,7 @@ cio_clear(struct subchannel *sch)return -ENODEV ;CIO_TRACE_EVENT (2 ,"clearIO" ); -CIO_TRACE_EVENT (2 , sch->dev.bus_id); +CIO_TRACE_EVENT (2 ,dev_name (&sch->dev));/* * Issue "Clear subchannel" and process condition code
@@ -340,7 +340,7 @@ cio_cancel (struct subchannel *sch)return -ENODEV ;CIO_TRACE_EVENT (2 ,"cancelIO" ); -CIO_TRACE_EVENT (2 , sch->dev.bus_id); +CIO_TRACE_EVENT (2 ,dev_name (&sch->dev)); ccode =xsch (sch->schid);
@@ -404,7 +404,7 @@ int cio_enable_subchannel(struct subchanint ret;CIO_TRACE_EVENT (2 ,"ensch" ); -CIO_TRACE_EVENT (2 , sch->dev.bus_id); +CIO_TRACE_EVENT (2 ,dev_name (&sch->dev));if (sch_is_pseudo_sch (sch))return -EINVAL ;
@@ -454,7 +454,7 @@ int cio_disable_subchannel(struct subchaint ret;CIO_TRACE_EVENT (2 ,"dissch" ); -CIO_TRACE_EVENT (2 , sch->dev.bus_id); +CIO_TRACE_EVENT (2 ,dev_name (&sch->dev));if (sch_is_pseudo_sch (sch))return 0 ;
drivers/s390/cio/device.c +2 -2
@@ -1101,7 +1101,7 @@ static void io_subchannel_irq(struct sub cdev =sch_get_cdev (sch);CIO_TRACE_EVENT (3 ,"IRQ" ); -CIO_TRACE_EVENT (3 , sch->dev.bus_id); +CIO_TRACE_EVENT (3 ,dev_name (&sch->dev));if (cdev)dev_fsm_event (cdev,DEV_EVENT_INTERRUPT ); }
@@ -1707,7 +1707,7 @@ __ccwdev_check_busid(struct device *dev, bus_id = id; -return (strncmp (bus_id, dev->bus_id,BUS_ID_SIZE ) ==0 ); +return (strncmp (bus_id,dev_name (dev),BUS_ID_SIZE ) ==0 ); }
drivers/s390/cio/device_fsm.c +4 -2
@@ -52,8 +52,10 @@ static void ccw_timeout_log(struct ccw_dprintk (KERN_WARNING "cio: orb:\n" );print_hex_dump (KERN_WARNING ,"cio: " ,DUMP_PREFIX_NONE ,16 ,1 , orb,sizeof (*orb),0 ); -printk (KERN_WARNING "cio: ccw device bus id: %s\n" , cdev->dev.bus_id); -printk (KERN_WARNING "cio: subchannel bus id: %s\n" , sch->dev.bus_id); +printk (KERN_WARNING "cio: ccw device bus id: %s\n" , +dev_name (&cdev->dev)); +printk (KERN_WARNING "cio: subchannel bus id: %s\n" , +dev_name (&sch->dev));printk (KERN_WARNING "cio: subchannel lpm: %02x, opm: %02x, " "vpm: %02x\n" , sch->lpm, sch->opm, sch->vpm);
drivers/s390/cio/device_ops.c +1 -1
@@ -498,7 +498,7 @@ ccw_device_stlck(struct ccw_device *cdev sch =to_subchannel (cdev->dev.parent);CIO_TRACE_EVENT (2 ,"stl lock" ); -CIO_TRACE_EVENT (2 , cdev->dev.bus_id); +CIO_TRACE_EVENT (2 ,dev_name (&cdev->dev)); buf =kmalloc (32 *sizeof (char ),GFP_DMA |GFP_KERNEL );if (!buf)
drivers/s390/net/claw.c +12 -11
@@ -299,7 +299,7 @@ claw_probe(struct ccwgroup_device *cgdevprobe_error (cgdev);put_device (&cgdev->dev);printk (KERN_WARNING "add_files failed %s %s Exit Line %d \n" , - cgdev->cdev[0 ]->dev.bus_id,__func__,__LINE__); +dev_name (&cgdev->cdev[0 ]->dev), __func__, __LINE__);CLAW_DBF_TEXT_ (2 , setup,"probex%d" , rc);return rc; }
@@ -584,7 +584,7 @@ claw_irq_handler(struct ccw_device *cdevif (!cdev->dev.driver_data) {printk (KERN_WARNING "claw: unsolicited interrupt for device:" "%s received c-%02x d-%02x\n" , - cdev->dev.bus_id, irb->scsw.cmd.cstat, +dev_name (&cdev->dev), irb->scsw.cmd.cstat, irb->scsw.cmd.dstat);CLAW_DBF_TEXT (2 , trace,"badirq" );return ;
@@ -598,7 +598,7 @@ claw_irq_handler(struct ccw_device *cdev p_ch = &privptr->channel[WRITE ]; else {printk (KERN_WARNING "claw: Can't determine channel for " -"interrupt, device %s\n" , cdev->dev.bus_id); +"interrupt, device %s\n" ,dev_name (&cdev->dev));CLAW_DBF_TEXT (2 , trace,"badchan" );return ; }
@@ -662,7 +662,7 @@ claw_irq_handler(struct ccw_device *cdevprintk (KERN_WARNING "claw: unsolicited " "interrupt for device:" "%s received c-%02x d-%02x\n" , - cdev->dev.bus_id, +dev_name (&cdev->dev), irb->scsw.cmd.cstat, irb->scsw.cmd.dstat);return ;
@@ -1136,19 +1136,20 @@ ccw_check_return_code(struct ccw_devicebreak ;case -ENODEV :printk (KERN_EMERG "%s: Missing device called " -"for IO ENODEV\n" , cdev->dev.bus_id); +"for IO ENODEV\n" ,dev_name (&cdev->dev));break ;case -EIO :printk (KERN_EMERG "%s: Status pending... EIO \n" , - cdev->dev.bus_id); +dev_name (&cdev->dev));break ;case -EINVAL :printk (KERN_EMERG "%s: Invalid Dev State EINVAL \n" , - cdev->dev.bus_id); +dev_name (&cdev->dev));break ;default :printk (KERN_EMERG "%s: Unknown error in " -"Do_IO %d\n" ,cdev->dev.bus_id, return_code); +"Do_IO %d\n" ,dev_name (&cdev->dev), + return_code); } }CLAW_DBF_TEXT (4 , trace,"ccwret" );
@@ -2848,11 +2849,11 @@ add_channel(struct ccw_device *cdev,intstruct chbk *p_ch;struct ccw_dev_id dev_id; -CLAW_DBF_TEXT_ (2 , setup,"%s" , cdev->dev.bus_id); +CLAW_DBF_TEXT_ (2 , setup,"%s" ,dev_name (&cdev->dev)); privptr->channel[i].flag = i+1 ;/* Read is 1 Write is 2 */ p_ch = &privptr->channel[i]; p_ch->cdev = cdev; -snprintf (p_ch->id,CLAW_ID_SIZE ,"cl-%s" , cdev->dev.bus_id); +snprintf (p_ch->id,CLAW_ID_SIZE ,"cl-%s" ,dev_name (&cdev->dev));ccw_device_get_id (cdev, &dev_id); p_ch->devno = dev_id.devno;if ((p_ch->irb =kzalloc (sizeof (struct irb ),GFP_KERNEL )) ==NULL ) {
@@ -3020,7 +3021,7 @@ claw_remove_device(struct ccwgroup_devic priv = cgdev->dev.driver_data;BUG_ON (!priv);printk (KERN_INFO "claw: %s() called %s will be removed.\n" , - __func__,cgdev->cdev[0 ]->dev.bus_id); + __func__,dev_name (&cgdev->cdev[0 ]->dev));if (cgdev->state ==CCWGROUP_ONLINE )claw_shutdown_device (cgdev);claw_remove_files (&cgdev->dev);
drivers/s390/net/claw.h +1 -1
@@ -85,7 +85,7 @@#define CLAW_MAX_DEV 256/* max claw devices */ #define MAX_NAME_LEN 8/* host name, adapter name length */ #define CLAW_FRAME_SIZE 4096 -#define CLAW_ID_SIZE BUS_ID_SIZE+3 +#define CLAW_ID_SIZE 20+3/* state machine codes used in claw_irq_handler */
drivers/s390/net/ctcm_main.c +9 -9
@@ -277,18 +277,18 @@ static long ctcm_check_irb_error(structCTCM_DBF_TEXT_ (ERROR ,CTC_DBF_WARN ,"irb error %ld on device %s\n" , -PTR_ERR (irb), cdev->dev.bus_id); +PTR_ERR (irb),dev_name (&cdev->dev));switch (PTR_ERR (irb)) {case -EIO : -ctcm_pr_warn ("i/o-error on device %s\n" , cdev->dev.bus_id); +ctcm_pr_warn ("i/o-error on device %s\n" ,dev_name (&cdev->dev));break ;case -ETIMEDOUT : -ctcm_pr_warn ("timeout on device %s\n" , cdev->dev.bus_id); +ctcm_pr_warn ("timeout on device %s\n" ,dev_name (&cdev->dev));break ;default :ctcm_pr_warn ("unknown error %ld on device %s\n" , -PTR_ERR (irb), cdev->dev.bus_id); +PTR_ERR (irb),dev_name (&cdev->dev)); }return PTR_ERR (irb); }
@@ -1182,7 +1182,7 @@ static void ctcm_irq_handler(struct ccw_int dstat;CTCM_DBF_TEXT_ (TRACE ,CTC_DBF_DEBUG , -"Enter %s(%s)" ,CTCM_FUNTAIL , &cdev->dev.bus_id); +"Enter %s(%s)" ,CTCM_FUNTAIL ,dev_name (&cdev->dev));if (ctcm_check_irb_error (cdev, irb))return ;
@@ -1208,14 +1208,14 @@ static void ctcm_irq_handler(struct ccw_ ch = priv->channel[WRITE ]; else {ctcm_pr_err ("ctcm: Can't determine channel for interrupt, " -"device %s\n" , cdev->dev.bus_id); +"device %s\n" ,dev_name (&cdev->dev));return ; } dev = ch->netdev;if (dev ==NULL ) {ctcm_pr_crit ("ctcm: %s dev=NULL bus_id=%s, ch=0x%p\n" , - __func__, cdev->dev.bus_id, ch); + __func__,dev_name (&cdev->dev), ch);return ; }
@@ -1329,7 +1329,7 @@ static int add_channel(struct ccw_deviceCTCM_DBF_TEXT_ (SETUP ,CTC_DBF_INFO ,"%s(%s), type %d, proto %d" , - __func__, cdev->dev.bus_id, type, priv->protocol); + __func__,dev_name (&cdev->dev), type, priv->protocol); ch =kzalloc (sizeof (struct channel ),GFP_KERNEL );if (ch ==NULL )
@@ -1358,7 +1358,7 @@ static int add_channel(struct ccw_device goto nomem_return; ch->cdev = cdev; -snprintf (ch->id,CTCM_ID_SIZE ,"ch-%s" , cdev->dev.bus_id); +snprintf (ch->id,CTCM_ID_SIZE ,"ch-%s" ,dev_name (&cdev->dev)); ch->type = type;/**
drivers/s390/net/ctcm_main.h +1 -1
@@ -104,7 +104,7 @@#define READ 0#define WRITE 1 -#define CTCM_ID_SIZE BUS_ID_SIZE+3 +#define CTCM_ID_SIZE 20+3struct ctcm_profile {unsigned long maxmulti;
drivers/s390/net/lcs.c +19 -15
@@ -492,7 +492,7 @@ lcs_start_channel(struct lcs_channel *chunsigned long flags;int rc; -LCS_DBF_TEXT_ (4 ,trace,"ssch%s" , channel->ccwdev->dev.bus_id); +LCS_DBF_TEXT_ (4 , trace,"ssch%s" ,dev_name (&channel->ccwdev->dev));spin_lock_irqsave (get_ccwdev_lock (channel->ccwdev), flags); rc = ccw_device_start(channel->ccwdev, channel->ccws + channel->io_idx, 0, 0,
@@ -501,7 +501,8 @@ lcs_start_channel(struct lcs_channel *ch channel->state =LCS_CH_STATE_RUNNING ;spin_unlock_irqrestore (get_ccwdev_lock (channel->ccwdev), flags);if (rc) { -LCS_DBF_TEXT_ (4 ,trace,"essh%s" , channel->ccwdev->dev.bus_id); +LCS_DBF_TEXT_ (4 ,trace,"essh%s" , +dev_name (&channel->ccwdev->dev));PRINT_ERR ("Error in starting channel, rc=%d!\n" , rc); }return rc;
@@ -514,12 +515,13 @@ lcs_clear_channel(struct lcs_channel *chint rc;LCS_DBF_TEXT (4 ,trace,"clearch" ); -LCS_DBF_TEXT_ (4 ,trace,"%s" , channel->ccwdev->dev.bus_id); +LCS_DBF_TEXT_ (4 , trace,"%s" ,dev_name (&channel->ccwdev->dev));spin_lock_irqsave (get_ccwdev_lock (channel->ccwdev), flags); rc =ccw_device_clear (channel->ccwdev, (addr_t ) channel);spin_unlock_irqrestore (get_ccwdev_lock (channel->ccwdev), flags);if (rc) { -LCS_DBF_TEXT_ (4 ,trace,"ecsc%s" , channel->ccwdev->dev.bus_id); +LCS_DBF_TEXT_ (4 , trace,"ecsc%s" , +dev_name (&channel->ccwdev->dev));return rc; }wait_event (channel->wait_q, (channel->state ==LCS_CH_STATE_CLEARED ));
@@ -540,13 +542,14 @@ lcs_stop_channel(struct lcs_channel *chaif (channel->state ==LCS_CH_STATE_STOPPED )return 0 ;LCS_DBF_TEXT (4 ,trace,"haltsch" ); -LCS_DBF_TEXT_ (4 ,trace,"%s" , channel->ccwdev->dev.bus_id); +LCS_DBF_TEXT_ (4 , trace,"%s" ,dev_name (&channel->ccwdev->dev)); channel->state =LCS_CH_STATE_INIT ;spin_lock_irqsave (get_ccwdev_lock (channel->ccwdev), flags); rc =ccw_device_halt (channel->ccwdev, (addr_t ) channel);spin_unlock_irqrestore (get_ccwdev_lock (channel->ccwdev), flags);if (rc) { -LCS_DBF_TEXT_ (4 ,trace,"ehsc%s" , channel->ccwdev->dev.bus_id); +LCS_DBF_TEXT_ (4 , trace,"ehsc%s" , +dev_name (&channel->ccwdev->dev));return rc; }/* Asynchronous halt initialted. Wait for its completion. */
@@ -632,10 +635,11 @@ __lcs_resume_channel(struct lcs_channelreturn 0 ;if (channel->ccws[channel->io_idx].flags &CCW_FLAG_SUSPEND )return 0 ; -LCS_DBF_TEXT_ (5 , trace,"rsch%s" , channel->ccwdev->dev.bus_id); +LCS_DBF_TEXT_ (5 , trace,"rsch%s" ,dev_name (&channel->ccwdev->dev)); rc =ccw_device_resume (channel->ccwdev);if (rc) { -LCS_DBF_TEXT_ (4 , trace,"ersc%s" , channel->ccwdev->dev.bus_id); +LCS_DBF_TEXT_ (4 , trace,"ersc%s" , +dev_name (&channel->ccwdev->dev));PRINT_ERR ("Error in lcs_resume_channel: rc=%d\n" ,rc); }else channel->state =LCS_CH_STATE_RUNNING ;
@@ -1302,18 +1306,18 @@ lcs_check_irb_error(struct ccw_device *cswitch (PTR_ERR (irb)) {case -EIO : -PRINT_WARN ("i/o-error on device %s\n" , cdev->dev.bus_id); +PRINT_WARN ("i/o-error on device %s\n" ,dev_name (&cdev->dev));LCS_DBF_TEXT (2 , trace,"ckirberr" );LCS_DBF_TEXT_ (2 , trace," rc%d" , -EIO );break ;case -ETIMEDOUT : -PRINT_WARN ("timeout on device %s\n" , cdev->dev.bus_id); +PRINT_WARN ("timeout on device %s\n" ,dev_name (&cdev->dev));LCS_DBF_TEXT (2 , trace,"ckirberr" );LCS_DBF_TEXT_ (2 , trace," rc%d" , -ETIMEDOUT );break ;default :PRINT_WARN ("unknown error %ld on device %s\n" ,PTR_ERR (irb), - cdev->dev.bus_id); +dev_name (&cdev->dev));LCS_DBF_TEXT (2 , trace,"ckirberr" );LCS_DBF_TEXT (2 , trace," rc???" ); }
@@ -1390,7 +1394,7 @@ lcs_irq(struct ccw_device *cdev, unsigne cstat = irb->scsw.cmd.cstat; dstat = irb->scsw.cmd.dstat; -LCS_DBF_TEXT_ (5 , trace,"Rint%s" ,cdev->dev.bus_id); +LCS_DBF_TEXT_ (5 , trace,"Rint%s" ,dev_name (&cdev->dev));LCS_DBF_TEXT_ (5 , trace,"%4x%4x" , irb->scsw.cmd.cstat, irb->scsw.cmd.dstat); LCS_DBF_TEXT_(5, trace, "%4x%4x", irb->scsw.cmd.fctl,
@@ -1400,7 +1404,7 @@ lcs_irq(struct ccw_device *cdev, unsigne rc =lcs_get_problem (cdev, irb);if (rc || (dstat &DEV_STAT_UNIT_EXCEP )) {PRINT_WARN ("check on device %s, dstat=0x%X, cstat=0x%X \n" , - cdev->dev.bus_id, dstat, cstat); +dev_name (&cdev->dev), dstat, cstat);if (rc) { channel->state =LCS_CH_STATE_ERROR ; }
@@ -1463,7 +1467,7 @@ lcs_tasklet(unsigned long data)int rc; channel = (struct lcs_channel *) data; -LCS_DBF_TEXT_ (5 , trace,"tlet%s" ,channel->ccwdev->dev.bus_id); +LCS_DBF_TEXT_ (5 , trace,"tlet%s" ,dev_name (&channel->ccwdev->dev));/* Check for processed buffers. */ iob = channel->iob;
@@ -2244,7 +2248,7 @@ lcs_recovery(void *ptr)return 0 ;LCS_DBF_TEXT (4 , trace,"recover2" ); gdev = card->gdev; -PRINT_WARN ("Recovery of device %s started...\n" , gdev->dev.bus_id); +PRINT_WARN ("Recovery of device %s started...\n" ,dev_name (&gdev->dev)); rc =__lcs_shutdown_device (gdev,1 ); rc =lcs_new_device (gdev);if (!rc)
drivers/s390/net/qeth_core.h +5 -5
@@ -90,11 +90,11 @@ struct qeth_dbf_info {#define CARD_RDEV (card) card->read.ccwdev#define CARD_WDEV (card) card->write.ccwdev#define CARD_DDEV (card) card->data.ccwdev -#define CARD_BUS_ID (card) card->gdev->dev.bus_id -#define CARD_RDEV_ID (card) card->read.ccwdev->dev.bus_id -#define CARD_WDEV_ID (card) card->write.ccwdev->dev.bus_id -#define CARD_DDEV_ID (card) card->data.ccwdev->dev.bus_id -#define CHANNEL_ID (channel) channel->ccwdev->dev.bus_id +#define CARD_BUS_ID (card) dev_name(&card->gdev->dev) +#define CARD_RDEV_ID (card) dev_name(&card->read.ccwdev->dev) +#define CARD_WDEV_ID (card) dev_name(&card->write.ccwdev->dev) +#define CARD_DDEV_ID (card) dev_name(&card->data.ccwdev->dev) +#define CHANNEL_ID (channel) dev_name(&channel->ccwdev->dev)/** * card stuff
drivers/s390/net/qeth_core_main.c +5 -5
@@ -745,7 +745,7 @@ static int qeth_get_problem(struct ccw_d SCHN_STAT_PROT_CHECK | SCHN_STAT_PROG_CHECK)) {QETH_DBF_TEXT (TRACE ,2 ,"CGENCHK" );PRINT_WARN ("check on device %s, dstat=x%x, cstat=x%x " , - cdev->dev.bus_id, dstat, cstat); +dev_name (&cdev->dev), dstat, cstat);print_hex_dump (KERN_WARNING ,"qeth: irb " ,DUMP_PREFIX_OFFSET ,16 ,1 , irb,64 ,1 );return 1 ;
@@ -784,12 +784,12 @@ static long __qeth_check_irb_error(strucswitch (PTR_ERR (irb)) {case -EIO : -PRINT_WARN ("i/o-error on device %s\n" , cdev->dev.bus_id); +PRINT_WARN ("i/o-error on device %s\n" ,dev_name (&cdev->dev));QETH_DBF_TEXT (TRACE ,2 ,"ckirberr" );QETH_DBF_TEXT_ (TRACE ,2 ," rc%d" , -EIO );break ;case -ETIMEDOUT : -PRINT_WARN ("timeout on device %s\n" , cdev->dev.bus_id); +PRINT_WARN ("timeout on device %s\n" ,dev_name (&cdev->dev));QETH_DBF_TEXT (TRACE ,2 ,"ckirberr" );QETH_DBF_TEXT_ (TRACE ,2 ," rc%d" , -ETIMEDOUT );if (intparm ==QETH_RCD_PARM ) {
@@ -803,7 +803,7 @@ static long __qeth_check_irb_error(strucbreak ;default :PRINT_WARN ("unknown error %ld on device %s\n" ,PTR_ERR (irb), - cdev->dev.bus_id); +dev_name (&cdev->dev));QETH_DBF_TEXT (TRACE ,2 ,"ckirberr" );QETH_DBF_TEXT (TRACE ,2 ," rc???" ); }
@@ -4081,7 +4081,7 @@ static int qeth_core_probe_device(structif (!get_device (dev))return -ENODEV ; -QETH_DBF_TEXT_ (SETUP ,2 ,"%s" , gdev->dev.bus_id); +QETH_DBF_TEXT_ (SETUP ,2 ,"%s" ,dev_name (&gdev->dev)); card =qeth_alloc_card ();if (!card) {
drivers/s390/scsi/zfcp_def.h +1 -1
@@ -655,7 +655,7 @@ struct zfcp_data {struct semaphore config_sema;/* serialises configuration changes */ atomic_t loglevel;/* current loglevel */ -char init_busid[BUS_ID_SIZE ]; +char init_busid[20 ];wwn_t init_wwpn;fcp_lun_t init_fcp_lun;struct kmem_cache *fsf_req_qtcb_cache;
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 7/21 bus_id -> dev_set_name() changes
In reply to Martin SchwidefskyFrom: Cornelia Huck <[email protected]>
Convert most s390 users setting bus_id to dev_set_name(). css and ccw busses are deferred since they need some special treatment.
---
drivers/s390/block/dcssblk.c | 2 +- drivers/s390/char/vmlogrdr.c | 3 +-- drivers/s390/cio/ccwgroup.c | 3 +-- drivers/s390/cio/chp.c | 3 +-- drivers/s390/cio/css.c | 4 ++-- drivers/s390/crypto/ap_bus.c | 4 ++-- drivers/s390/net/netiucv.c | 2 +- drivers/s390/s390_rdev.c | 2 +- drivers/s390/scsi/zfcp_aux.c | 10 ++++------ 9 files changed, 14 insertions(+), 19 deletions(-)
drivers/s390/block/dcssblk.c +1 -1
@@ -343,7 +343,7 @@ dcssblk_add_store(struct device *dev, st }strcpy (dev_info->segment_name, local_buf); -strlcpy (dev_info->dev.bus_id, local_buf,BUS_ID_SIZE ); +dev_set_name (&dev_info->dev, local_buf); dev_info->dev.release = dcssblk_release_segment;INIT_LIST_HEAD (&dev_info->lh);
drivers/s390/char/vmlogrdr.c +1 -2
@@ -724,8 +724,7 @@ static int vmlogrdr_register_device(stru dev =kzalloc (sizeof (struct device ),GFP_KERNEL );if (dev) { -snprintf (dev->bus_id,BUS_ID_SIZE ,"%s" , - priv->internal_name); +dev_set_name (dev, priv->internal_name); dev->bus = &iucv_bus; dev->parent = iucv_root; dev->driver = &vmlogrdr_driver;
drivers/s390/cio/ccwgroup.c +1 -2
@@ -269,8 +269,7 @@ int ccwgroup_create_from_string(struct d goto error; } -snprintf (gdev->dev.bus_id,BUS_ID_SIZE ,"%s" , -dev_name (&gdev->cdev[0 ]->dev)); +dev_set_name (&gdev->dev,"%s" ,dev_name (&gdev->cdev[0 ]->dev)); rc =device_add (&gdev->dev);if (rc)
drivers/s390/cio/chp.c +1 -2
@@ -393,8 +393,7 @@ int chp_new(struct chp_id chpid) chp->state =1 ; chp->dev.parent = &channel_subsystems[chpid.cssid]->device; chp->dev.release = chp_release; -snprintf (chp->dev.bus_id,BUS_ID_SIZE ,"chp%x.%02x" , chpid.cssid, - chpid.id); +dev_set_name (&chp->dev,"chp%x.%02x" , chpid.cssid, chpid.id);/* Obtain channel path description and fill it in. */ ret =chsc_determine_base_channel_path_desc (chpid, &chp->desc);
drivers/s390/cio/css.c +2 -2
@@ -698,7 +698,7 @@ static int __init setup_css(int nr)return -ENOMEM ; css->pseudo_subchannel->dev.parent = &css->device; css->pseudo_subchannel->dev.release = css_subchannel_release; -sprintf (css->pseudo_subchannel->dev.bus_id,"defunct" ); +dev_set_name (&css->pseudo_subchannel->dev,"defunct" ); ret =cio_create_sch_lock (css->pseudo_subchannel);if (ret) {kfree (css->pseudo_subchannel);
@@ -707,7 +707,7 @@ static int __init setup_css(int nr)mutex_init (&css->mutex); css->valid =1 ; css->cssid = nr; -sprintf (css->device.bus_id,"css%x" , nr); +dev_set_name (&css->device,"css%x" , nr); css->device.release = channel_subsystem_release; tod_high = (u32) (get_clock () >>32 );css_generate_pgid (css, tod_high);
drivers/s390/crypto/ap_bus.c +2 -2
@@ -892,8 +892,8 @@ static void ap_scan_bus(struct work_stru ap_dev->device.bus = &ap_bus_type; ap_dev->device.parent = ap_root_device; -snprintf (ap_dev->device.bus_id,BUS_ID_SIZE ,"card%02x" , -AP_QID_DEVICE (ap_dev->qid)); +dev_set_name (&ap_dev->device,"card%02x" , +AP_QID_DEVICE (ap_dev->qid)); ap_dev->device.release = ap_device_release; rc =device_register (&ap_dev->device);if (rc) {
drivers/s390/net/netiucv.c +1 -1
@@ -1724,7 +1724,7 @@ static int netiucv_register_device(strucIUCV_DBF_TEXT (trace,3 , __func__);if (dev) { -snprintf (dev->bus_id,BUS_ID_SIZE ,"net%s" , ndev->name); +dev_set_name (dev,"net%s" , ndev->name); dev->bus = &iucv_bus; dev->parent = iucv_root;/*
drivers/s390/s390_rdev.c +1 -1
@@ -30,7 +30,7 @@ s390_root_dev_register(const char *name) dev =kzalloc (sizeof (struct device ),GFP_KERNEL );if (!dev)return ERR_PTR (-ENOMEM ); -strncpy (dev->bus_id, name,min (strlen (name), (size_t )BUS_ID_SIZE )); +dev_set_name (dev, name); dev->release = s390_root_dev_release; ret =device_register (dev);if (ret) {
drivers/s390/scsi/zfcp_aux.c +4 -6
@@ -290,7 +290,7 @@ struct zfcp_unit *zfcp_unit_enqueue(stru unit->port = port; unit->fcp_lun = fcp_lun; -snprintf (unit->sysfs_device.bus_id,BUS_ID_SIZE ,"0x%016llx" , fcp_lun); +dev_set_name (&unit->sysfs_device,"0x%016llx" , fcp_lun); unit->sysfs_device.parent = &port->sysfs_device; unit->sysfs_device.release = zfcp_sysfs_unit_release;dev_set_drvdata (&unit->sysfs_device, unit);
@@ -539,8 +539,7 @@ int zfcp_adapter_enqueue(struct ccw_devi adapter->generic_services.parent = &adapter->ccw_device->dev; adapter->generic_services.release = zfcp_dummy_release; -snprintf (adapter->generic_services.bus_id,BUS_ID_SIZE , -"generic_services" ); +dev_set_name (&adapter->generic_services,"generic_services" );if (device_register (&adapter->generic_services)) goto generic_services_failed;
@@ -678,11 +677,10 @@ struct zfcp_port *zfcp_port_enqueue(strukfree (port);return ERR_PTR (-EINVAL ); } -snprintf (port->sysfs_device.bus_id,BUS_ID_SIZE ,"%s" , bus_id); +dev_set_name (&port->sysfs_device,"%s" , bus_id); port->sysfs_device.parent = &adapter->generic_services; }else { -snprintf (port->sysfs_device.bus_id, -BUS_ID_SIZE ,"0x%016llx" , wwpn); +dev_set_name (&port->sysfs_device,"0x%016llx" , wwpn); port->sysfs_device.parent = &adapter->ccw_device->dev; }
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 8/21 more bus_id -> dev_name conversions
In reply to Martin SchwidefskyFrom: Cornelia Huck <[email protected]>
Some further bus_id -> dev_name() conversions in s390 code.
---
drivers/s390/char/raw3270.c | 4 ++-- drivers/s390/cio/device.c | 2 +- drivers/s390/net/claw.c | 13 ++++++++----- drivers/s390/net/ctcm_main.c | 4 ++-- drivers/s390/scsi/zfcp_def.h | 2 +- drivers/s390/scsi/zfcp_erp.c | 2 +- drivers/s390/scsi/zfcp_sysfs.c | 2 +- 7 files changed, 16 insertions(+), 13 deletions(-)
drivers/s390/char/raw3270.c +2 -2
@@ -1171,7 +1171,7 @@ static int raw3270_create_attributes(str rp->clttydev =device_create_drvdata (class3270, &rp->cdev->dev,MKDEV (IBM_TTY3270_MAJOR , rp->minor),NULL , -"tty%s" , rp->cdev->dev.bus_id); +"tty%s" ,dev_name (&rp->cdev->dev));if (IS_ERR (rp->clttydev)) { rc =PTR_ERR (rp->clttydev); goto out_ttydev;
@@ -1180,7 +1180,7 @@ static int raw3270_create_attributes(str rp->cltubdev =device_create_drvdata (class3270, &rp->cdev->dev,MKDEV (IBM_FS3270_MAJOR , rp->minor),NULL , -"tub%s" , rp->cdev->dev.bus_id); +"tub%s" ,dev_name (&rp->cdev->dev));if (!IS_ERR (rp->cltubdev)) goto out;
drivers/s390/cio/device.c +1 -1
@@ -1526,7 +1526,7 @@ void ccw_device_set_notoper(struct ccw_dstruct subchannel *sch =to_subchannel (cdev->dev.parent);CIO_TRACE_EVENT (2 ,"notoper" ); -CIO_TRACE_EVENT (2 , sch->dev.bus_id); +CIO_TRACE_EVENT (2 ,dev_name (&sch->dev));ccw_device_set_timeout (cdev,0 );cio_disable_subchannel (sch); cdev->private->state =DEV_STATE_NOT_OPER ;
drivers/s390/net/claw.c +8 -5
@@ -2880,7 +2880,8 @@ claw_new_device(struct ccwgroup_device *int ret;struct ccw_dev_id dev_id; -printk (KERN_INFO "claw: add for %s\n" ,cgdev->cdev[READ ]->dev.bus_id); +printk (KERN_INFO "claw: add for %s\n" , +dev_name (&cgdev->cdev[READ ]->dev));CLAW_DBF_TEXT (2 , setup,"new_dev" ); privptr = cgdev->dev.driver_data; cgdev->cdev[READ ]->dev.driver_data = privptr;
@@ -2904,14 +2905,16 @@ claw_new_device(struct ccwgroup_device *if (ret !=0 ) {printk (KERN_WARNING "claw: ccw_device_set_online %s READ failed " -"with ret = %d\n" ,cgdev->cdev[READ ]->dev.bus_id,ret); +"with ret = %d\n" ,dev_name (&cgdev->cdev[READ ]->dev), + ret); goto out; } ret =ccw_device_set_online (cgdev->cdev[WRITE ]);if (ret !=0 ) {printk (KERN_WARNING "claw: ccw_device_set_online %s WRITE failed " -"with ret = %d\n" ,cgdev->cdev[WRITE ]->dev.bus_id, ret); +"with ret = %d\n" ,dev_name (&cgdev->cdev[WRITE ]->dev) + ret); goto out; } dev =alloc_netdev (0 ,"claw%d" ,claw_init_netdevice);
@@ -2987,7 +2990,7 @@ claw_shutdown_device(struct ccwgroup_devstruct net_device *ndev;int ret; -CLAW_DBF_TEXT_ (2 , setup,"%s" , cgdev->dev.bus_id); +CLAW_DBF_TEXT_ (2 , setup,"%s" ,dev_name (&cgdev->dev)); priv = cgdev->dev.driver_data;if (!priv)return -ENODEV ;
@@ -3017,7 +3020,7 @@ claw_remove_device(struct ccwgroup_devicstruct claw_privbk *priv;BUG_ON (!cgdev); -CLAW_DBF_TEXT_ (2 , setup,"%s" , cgdev->dev.bus_id); +CLAW_DBF_TEXT_ (2 , setup,"%s" ,dev_name (&cgdev->dev)); priv = cgdev->dev.driver_data;BUG_ON (!priv); printk(KERN_INFO "claw: %s() called %s will be removed.\n",
drivers/s390/net/ctcm_main.c +2 -2
@@ -1518,8 +1518,8 @@ static int ctcm_new_device(struct ccwgro type =get_channel_type (&cdev0->id); -snprintf (read_id,CTCM_ID_SIZE ,"ch-%s" , cdev0->dev.bus_id); -snprintf (write_id,CTCM_ID_SIZE ,"ch-%s" , cdev1->dev.bus_id); +snprintf (read_id,CTCM_ID_SIZE ,"ch-%s" ,dev_name (&cdev0->dev)); +snprintf (write_id,CTCM_ID_SIZE ,"ch-%s" ,dev_name (&cdev1->dev)); ret =add_channel (cdev0, type, priv);if (ret)
drivers/s390/scsi/zfcp_def.h +1 -1
@@ -682,7 +682,7 @@ struct zfcp_fsf_req_qtcb { ((atomic_read(target) & mask) == mask)#endif -#define zfcp_get_busid_by_adapter (adapter) (adapter->ccw_device->dev.bus_id) +#define zfcp_get_busid_by_adapter (adapter) (dev_name(&adapter->ccw_device->dev))#define zfcp_get_busid_by_port (port) (zfcp_get_busid_by_adapter(port->adapter))#define zfcp_get_busid_by_unit (unit) (zfcp_get_busid_by_port(unit->port))
drivers/s390/scsi/zfcp_erp.c +1 -1
@@ -1439,7 +1439,7 @@ static int zfcp_erp_thread(void *data)struct zfcp_erp_action *act;unsigned long flags; -daemonize ("zfcperp%s" , adapter->ccw_device->dev.bus_id); +daemonize ("zfcperp%s" ,dev_name (&adapter->ccw_device->dev));/* Block all signals */ siginitsetinv (¤t->blocked,0 );atomic_set_mask (ZFCP_STATUS_ADAPTER_ERP_THREAD_UP , &adapter->status);
drivers/s390/scsi/zfcp_sysfs.c +1 -1
@@ -394,7 +394,7 @@ static ssize_t zfcp_sysfs_scsi_##_name## static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_scsi_##_name##_show, NULL);ZFCP_DEFINE_SCSI_ATTR (hba_id,"%s\n" , - unit->port->adapter->ccw_device->dev.bus_id); +dev_name (&unit->port->adapter->ccw_device->dev));ZFCP_DEFINE_SCSI_ATTR (wwpn,"0x%016llx\n" , unit->port->wwpn);ZFCP_DEFINE_SCSI_ATTR (fcp_lun,"0x%016llx\n" , unit->fcp_lun);
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 9/21 Use s390_root_dev_* in kvm_virtio.
In reply to Martin SchwidefskyFrom: Cornelia Huck <[email protected]>
No need to define a static device for the kvm_s390 root device, just use s390_root_dev_register().
This is needed for the bus_id rework
---
drivers/s390/kvm/kvm_virtio.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
drivers/s390/kvm/kvm_virtio.c +7 -8
@@ -24,6 +24,7 @@#include <asm/kvm_virtio.h> #include <asm/setup.h> #include <asm/s390_ext.h> +#include <asm/s390_rdev.h> #define VIRTIO_SUBCODE_64 0x0D00
@@ -241,10 +242,7 @@ static struct virtio_config_ops kvm_vq_c* The root device for the kvm virtio devices. * This makes them appear as /sys/devices/kvm_s390/0,1,2 not /sys/devices/0,1,2. */ -static struct device kvm_root = { - .parent =NULL , - .bus_id ="kvm_s390" , -}; +static struct device *kvm_root;/* * adds a new device and register it with virtio
@@ -261,7 +259,7 @@ static void add_kvm_device(struct kvm_dereturn ; } - kdev->vdev.dev.parent = &kvm_root; + kdev->vdev.dev.parent = kvm_root; kdev->vdev.id.device = d->type; kdev->vdev.config = &kvm_vq_configspace_ops; kdev->desc = d;
@@ -317,15 +315,16 @@ static int __init kvm_devices_init(void)if (!MACHINE_IS_KVM )return -ENODEV ; - rc =device_register (&kvm_root); -if (rc) { + kvm_root =s390_root_dev_register ("kvm_s390" ); +if (IS_ERR (kvm_root)) { + rc =PTR_ERR (kvm_root);printk (KERN_ERR "Could not register kvm_s390 root device" );return rc; } rc =vmem_add_mapping (PFN_PHYS (max_pfn),PAGE_SIZE );if (rc) { -device_unregister (&kvm_root); +s390_root_dev_unregister (kvm_root);return rc; }
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 10/21 bus_id ->dev_name() conversions in qdio
In reply to Martin SchwidefskyUse dev_name() in the new qdio driver.
---
drivers/s390/cio/qdio_debug.c | 2 +- drivers/s390/cio/qdio_main.c | 2 +- drivers/s390/cio/qdio_setup.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-)
drivers/s390/cio/qdio_debug.c +1 -1
@@ -155,7 +155,7 @@ static int qstat_seq_open(struct inode *static void get_queue_name (struct qdio_q *q,struct ccw_device *cdev,char *name) {memset (name,0 ,sizeof (name)); -sprintf (name,"%s" , cdev->dev.bus_id); +sprintf (name,"%s" ,dev_name (&cdev->dev));if (q->is_input_q)sprintf (name +strlen (name),"_input" );else
drivers/s390/cio/qdio_main.c +1 -1
@@ -962,7 +962,7 @@ static void qdio_handle_activate_check(schar dbf_text[15 ];QDIO_DBF_TEXT2 (1 , trace,"ick2" ); -sprintf (dbf_text,"%s" , cdev->dev.bus_id); +sprintf (dbf_text,"%s" ,dev_name (&cdev->dev));QDIO_DBF_TEXT2 (1 , trace, dbf_text);QDIO_DBF_HEX2 (0 , trace, &intparm,sizeof (int ));QDIO_DBF_HEX2 (0 , trace, &dstat,sizeof (int ));
drivers/s390/cio/qdio_setup.c +2 -2
@@ -447,7 +447,7 @@ void qdio_print_subchannel_info(struct q {char s[80 ]; -sprintf (s,"%s sc:%x " , cdev->dev.bus_id, irq_ptr->schid.sch_no); +sprintf (s,"%s sc:%x " ,dev_name (&cdev->dev), irq_ptr->schid.sch_no);switch (irq_ptr->qib.qfmt) {case QDIO_QETH_QFMT :
@@ -477,7 +477,7 @@ void qdio_print_subchannel_info(struct qprintk (KERN_INFO "qdio: %s" , s);memset (s,0 ,sizeof (s)); -sprintf (s,"%s SIGA required: " , cdev->dev.bus_id); +sprintf (s,"%s SIGA required: " ,dev_name (&cdev->dev));if (irq_ptr->siga_flag.input)sprintf (s +strlen (s),"Read " );if (irq_ptr->siga_flag.output)
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 11/21 bus_id -> dev_set_name() for css and ccw busses
In reply to Martin SchwidefskyFrom: Cornelia Huck <[email protected]>
Convert remaining s390 users setting bus_id to dev_set_name() or init_name.
---
drivers/s390/cio/cio.c | 13 +++++++++++-- drivers/s390/cio/cio.h | 4 ++++ drivers/s390/cio/device.c | 16 ++++++++++++++-- 3 files changed, 29 insertions(+), 4 deletions(-)
drivers/s390/cio/cio.c +11 -2
@@ -571,8 +571,10 @@ int cio_validate_subchannel(struct subch }mutex_init (&sch->reg_mutex);/* Set a name for the subchannel */ -snprintf (sch->dev.bus_id,BUS_ID_SIZE ,"0.%x.%04x" , schid.ssid, - schid.sch_no); +if (cio_is_console (schid)) + sch->dev.init_name =cio_get_console_sch_name (schid); +else +dev_set_name (&sch->dev,"0.%x.%04x" , schid.ssid, schid.sch_no);/* * The first subchannel that is not-operational (ccode==3)
@@ -677,6 +679,7 @@ do_IRQ (struct pt_regs *regs)#ifdef CONFIG_CCW_CONSOLE static struct subchannel console_subchannel; +static char console_sch_name[10 ] ="0.x.xxxx" ;static struct io_subchannel_private console_priv;static int console_subchannel_in_use;
@@ -827,6 +830,12 @@ cio_get_console_subchannel(void) return &console_subchannel; } +const char *cio_get_console_sch_name (struct subchannel_id schid) +{ +snprintf (console_sch_name,10 ,"0.%x.%04x" , schid.ssid, schid.sch_no); +return (const char *)console_sch_name; +} +#endif static int __disable_subchannel_easy (struct subchannel_id schid,struct schib *schib)
drivers/s390/cio/cio.h +4 -0
@@ -117,11 +117,15 @@ extern int cio_is_console(struct subchanextern struct subchannel *cio_get_console_subchannel (void );extern spinlock_t *cio_get_console_lock (void );extern void *cio_get_console_priv (void ); +extern const char *cio_get_console_sch_name (struct subchannel_id schid); +extern const char *cio_get_console_cdev_name (struct subchannel *sch);#else #define cio_is_console (schid) 0#define cio_get_console_subchannel () NULL#define cio_get_console_lock () NULL#define cio_get_console_priv () NULL +#define cio_get_console_sch_name (schid) NULL +#define cio_get_console_cdev_name (sch) NULL#endif #endif
drivers/s390/cio/device.c +14 -2
@@ -1035,8 +1035,11 @@ io_subchannel_recog(struct ccw_device *cinit_timer (&priv->timer);/* Set an initial name for the device. */ -snprintf (cdev->dev.bus_id,BUS_ID_SIZE ,"0.%x.%04x" , - sch->schid.ssid, sch->schib.pmcw.dev); +if (cio_is_console (sch->schid)) + cdev->dev.init_name =cio_get_console_cdev_name (sch); +else +dev_set_name (&cdev->dev,"0.%x.%04x" , + sch->schid.ssid, sch->schib.pmcw.dev);/* Increase counter of devices currently in recognition. */ atomic_inc (&ccw_device_init_count);
@@ -1625,6 +1628,7 @@ static int io_subchannel_sch_event(struc#ifdef CONFIG_CCW_CONSOLE static struct ccw_device console_cdev; +static char console_cdev_name[10 ] ="0.x.xxxx" ;static struct ccw_device_private console_private;static int console_cdev_in_use;
@@ -1695,6 +1699,14 @@ ccw_device_probe_console(void) console_cdev.online =1 ; return &console_cdev; } + + +const char *cio_get_console_cdev_name (struct subchannel *sch) +{ +snprintf (console_cdev_name,10 ,"0.%x.%04x" , + sch->schid.ssid, sch->schib.pmcw.dev); +return (const char *)console_cdev_name; +}#endif /*
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 12/21 cio: inline assembly cleanup
In reply to Martin SchwidefskyFrom: Peter Oberparleiter <[email protected]>
Fix incorrect in- and output constraints, remove volatile declaration of inline assembly parameters and reformat constraint declarations to be more consistent.
---
drivers/s390/cio/cio.c | 2 - drivers/s390/cio/io_sch.h | 22 +++++++++++++++----- drivers/s390/cio/ioasm.h | 49 ++++++++++++++++++++++++++-------------------- 3 files changed, 45 insertions(+), 28 deletions(-)
drivers/s390/cio/cio.c +1 -1
@@ -901,7 +901,7 @@ static void cio_reset_pgm_check_handler( pgm_check_occured =1 ; } -static int stsch_reset (struct subchannel_id schid,volatile struct schib *addr) +static int stsch_reset (struct subchannel_id schid,struct schib *addr) {int rc;
drivers/s390/cio/ioasm.h +28 -21
111 lines not on this page · raw message
drivers/s390/cio/io_sch.h +16 -6
@@ -123,7 +123,7 @@ struct ccw_device_private {void *cmb_wait;/* deferred cmb enable/disable */ }; -static inline int ssch (struct subchannel_id schid,volatile union orb *addr) +static inline int ssch (struct subchannel_id schid,union orb *addr) { register struct subchannel_id reg1 asm("1") = schid;int ccode = -EIO ;
@@ -134,7 +134,9 @@ static inline int ssch(struct subchannel" srl %0,28\n" "1:\n" EX_TABLE (0b ,1b ) - : "+d" (ccode) : "d" (reg1), "a" (addr), "m" (*addr) : "cc"); + : "+d" (ccode) + : "d" (reg1), "a" (addr), "m" (*addr) + : "cc", "memory"); return ccode; }
@@ -147,7 +149,9 @@ static inline int rsch(struct subchannel " rsch\n" " ipm %0\n" " srl %0,28" - : "=d" (ccode) : "d" (reg1) : "cc"); + : "=d" (ccode) + : "d" (reg1) + : "cc", "memory");return ccode; }
@@ -160,7 +164,9 @@ static inline int csch(struct subchannel " csch\n" " ipm %0\n" " srl %0,28" - : "=d" (ccode) : "d" (reg1) : "cc"); + : "=d" (ccode) + : "d" (reg1) + : "cc");return ccode; }
@@ -173,7 +179,9 @@ static inline int hsch(struct subchannel " hsch\n" " ipm %0\n" " srl %0,28" - : "=d" (ccode) : "d" (reg1) : "cc"); + : "=d" (ccode) + : "d" (reg1) + : "cc");return ccode; }
@@ -186,7 +194,9 @@ static inline int xsch(struct subchannel " .insn rre,0xb2760000,%1,0\n" " ipm %0\n" " srl %0,28" - : "=d" (ccode) : "d" (reg1) : "cc"); + : "=d" (ccode) + : "d" (reg1) + : "cc");return ccode; }
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 13/21 qdio enhanced SIGA (iqdio) support.
In reply to Martin SchwidefskyFrom: Klaus-Dieter Wacker <[email protected]>
Add support for z10 HiperSockets multiwrite SBALs on output queues. This is used on LPAR with EDDP enabled devices.
---
arch/s390/include/asm/qdio.h | 8 +++++++- drivers/s390/cio/qdio.h | 3 +++ drivers/s390/cio/qdio_main.c | 24 +++++++++++++++++++----- 3 files changed, 29 insertions(+), 6 deletions(-)
arch/s390/include/asm/qdio.h +7 -1
@@ -299,7 +299,13 @@ struct qdio_ssqd_desc {u8 mbccnt;u16 qdioac2;u64 sch_token; - u64:64 ; +u8 mro; +u8 mri; + u8:8 ; +u8 sbalic; + u16:16 ; + u8:8 ; +u8 mmwc; } __attribute__ ((packed));/* params are: ccw_device, qdio_error, queue_number,
drivers/s390/cio/qdio.h +3 -0
@@ -203,6 +203,9 @@ struct qdio_output_q {/* PCIs are enabled for the queue */ int pci_out_enabled; +/* IQDIO: output multiple buffers (enhanced SIGA) */ +int use_enh_siga; +/* timer to check for more outbound work */ struct timer_list timer; };
drivers/s390/cio/qdio_main.c +19 -5
@@ -316,6 +316,9 @@ static inline int qdio_do_siga_output(stunsigned int fc =0 ;unsigned long schid; +if (q->u.out.use_enh_siga) { + fc =3 ; + }if (!is_qebsm (q)) schid = *((u32 *)&q->irq_ptr->schid);else {
@@ -1449,6 +1452,8 @@ int qdio_establish(struct qdio_initializ }qdio_setup_ssqd_info (irq_ptr); +sprintf (dbf_text,"qDmmwc%2x" , irq_ptr->ssqd_desc.mmwc); +QDIO_DBF_TEXT2 (0 , setup, dbf_text);sprintf (dbf_text,"qib ac%2x" , irq_ptr->qib.ac);QDIO_DBF_TEXT2 (0 , setup, dbf_text);
@@ -1621,12 +1626,21 @@ static void handle_outbound(struct qdio_if (multicast_outbound (q))qdio_kick_outbound_q (q);else -/* -* One siga-w per buffer required for unicast -* HiperSockets. -*/ -while (count--) +if ((q->irq_ptr->ssqd_desc.mmwc >1 ) && + (count >1 ) && + (count <= q->irq_ptr->ssqd_desc.mmwc)) { +/* exploit enhanced SIGA */ + q->u.out.use_enh_siga =1 ;qdio_kick_outbound_q (q); + }else { +/* +* One siga-w per buffer required for unicast +* HiperSockets. +*/ + q->u.out.use_enh_siga =0 ; +while (count--) +qdio_kick_outbound_q (q); + } goto out; }
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 14/21 s390: use sys_pause for 31bit pause entry point
In reply to Martin SchwidefskyFrom: Christoph Hellwig <[email protected]>
sys32_pause is a useless copy of the generic sys_pause. (and it's certainly not there for old sparc32 binaries..)
---
arch/s390/kernel/compat_linux.c | 8 -------- arch/s390/kernel/compat_linux.h | 1 - arch/s390/kernel/compat_wrapper.S | 2 -- arch/s390/kernel/syscalls.S | 2 +- 4 files changed, 1 insertion(+), 12 deletions(-)
arch/s390/kernel/compat_linux.c +0 -8
@@ -608,14 +608,6 @@ asmlinkage long sys32_settimeofday(strucreturn do_sys_settimeofday (tv ? &kts :NULL , tz ? &ktz :NULL ); } -/* These are here just in case some old sparc32 binary calls it. */ -asmlinkage long sys32_pause (void ) -{ - current->state =TASK_INTERRUPTIBLE ; -schedule (); -return -ERESTARTNOHAND ; -} -asmlinkage long sys32_pread64 (unsigned int fd,char __user *ubuf,size_t count,u32 poshi,u32 poslo) {
arch/s390/kernel/compat_linux.h +0 -1
@@ -206,7 +206,6 @@ long sys32_gettimeofday(struct compat_ti struct timezone __user *tz);long sys32_settimeofday (struct compat_timeval __user *tv,struct timezone __user *tz); -long sys32_pause (void );long sys32_pread64 (unsigned int fd,char __user *ubuf,size_t count,u32 poshi,u32 poslo); long sys32_pwrite64(unsigned int fd, const char __user *ubuf,
arch/s390/kernel/compat_wrapper.S +0 -2
@@ -128,8 +128,6 @@ sys32_alarm_wrapper: llgfr %r2,%r2 # unsigned int jg sys_alarm # branch to system call -#sys32_pause_wrapper # void - .globl compat_sys_utime_wrapper compat_sys_utime_wrapper: llgtr %r2,%r2 # char *
arch/s390/kernel/syscalls.S +1 -1
@@ -37,7 +37,7 @@ SYSCALL(sys_stime,sys_ni_syscall,sys32_s SYSCALL(sys_ptrace,sys_ptrace,sys32_ptrace_wrapper) SYSCALL(sys_alarm,sys_alarm,sys32_alarm_wrapper) NI_SYSCALL /* old fstat syscall */ -SYSCALL(sys_pause,sys_pause,sys32_pause) +SYSCALL(sys_pause,sys_pause,sys_pause) SYSCALL(sys_utime,sys_utime,compat_sys_utime_wrapper) /* 30 */ NI_SYSCALL /* old stty syscall */ NI_SYSCALL /* old gtty syscall */
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 15/21 ptrace changes
In reply to Martin SchwidefskyFrom: Martin Schwidefsky <[email protected]>
* System call parameter and result access functions
* Add tracehook calls
* Split syscall_trace into two functions do_syscall_trace_enter and do_syscall_trace_exit
---
arch/s390/Kconfig | 1 arch/s390/include/asm/ptrace.h | 1 arch/s390/include/asm/syscall.h | 80 ++++++++++++++++++++++++++++++++++++ arch/s390/include/asm/thread_info.h | 2 arch/s390/kernel/entry.S | 50 ++++++++++++++++++---- arch/s390/kernel/entry64.S | 42 ++++++++++++++---- arch/s390/kernel/ptrace.c | 61 ++++++++++++++------------- arch/s390/kernel/signal.c | 13 +++++ 8 files changed, 202 insertions(+), 48 deletions(-)
arch/s390/include/asm/ptrace.h +1 -0
@@ -490,6 +490,7 @@ extern void user_disable_single_step(str#define user_mode (regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0)#define instruction_pointer (regs) ((regs)->psw.addr & PSW_ADDR_INSN) +#define user_stack_pointer (regs)((regs)->gprs[15])#define regs_return_value (regs)((regs)->gprs[2])#define profile_pc (regs) instruction_pointer(regs)extern void show_regs (struct pt_regs * regs);
arch/s390/include/asm/syscall.h new file +80 -0
80 lines not on this page · raw message
arch/s390/include/asm/thread_info.h +2 -0
@@ -86,6 +86,7 @@ static inline struct thread_info *curren* thread information flags bit numbers */ #define TIF_SYSCALL_TRACE 0/* syscall trace active */ +#define TIF_NOTIFY_RESUME 1/* callback before returning to user */ #define TIF_SIGPENDING 2/* signal pending */ #define TIF_NEED_RESCHED 3/* rescheduling necessary */ #define TIF_RESTART_SVC 4/* restart svc with new svc number */
@@ -100,6 +101,7 @@ static inline struct thread_info *curren#define TIF_RESTORE_SIGMASK 20/* restore signal mask in do_signal() */ #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) +#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
arch/s390/Kconfig +1 -0
@@ -74,6 +74,7 @@ config S390 select HAVE_KPROBES select HAVE_KRETPROBES select HAVE_KVM if 64BIT + select HAVE_ARCH_TRACEHOOK source "init/Kconfig"
arch/s390/kernel/entry64.S +32 -10
94 lines not on this page · raw message
arch/s390/kernel/entry.S +40 -10
115 lines not on this page · raw message
arch/s390/kernel/ptrace.c +33 -28
79 lines not on this page · raw message
arch/s390/kernel/signal.c +13 -0
@@ -24,6 +24,7 @@#include <linux/tty.h> #include <linux/personality.h> #include <linux/binfmts.h> +#include <linux/tracehook.h> #include <asm/ucontext.h> #include <asm/uaccess.h> #include <asm/lowcore.h>
@@ -507,6 +508,12 @@ void do_signal(struct pt_regs *regs)*/ if (current->thread.per_info.single_step)set_thread_flag (TIF_SINGLE_STEP ); + +/* +* Let tracing know that we've done the handler setup. +*/ +tracehook_signal_handler (signr, &info, &ka, regs, +test_thread_flag (TIF_SINGLE_STEP )); }return ; }
@@ -526,3 +533,9 @@ void do_signal(struct pt_regs *regs)set_thread_flag (TIF_RESTART_SVC ); } } + +void do_notify_resume (struct pt_regs *regs) +{ +clear_thread_flag (TIF_NOTIFY_RESUME ); +tracehook_notify_resume (regs); +}
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
Re: [patch 15/21] ptrace changes
Note that I know ~0 about s390 register layouts, but...
Quoted 12 lines · Martin Schwidefsky
Index:
quilt-2.6/arch/s390/kernel/ptrace.c
===================================================================arch/s390/kernel/ptrace.c +1
-2@@ -639,40 +640,44 @@ long compat_arch_ptrace(struct task_stru }#endif -asmlinkage void -syscall_trace (struct pt_regs *regs,int entryexit) +asmlinkage long do_syscall_trace_enter (struct pt_regs *regs) {
...
arch/s390/kernel/ptrace.c long compat_arch_ptrace(struct task_stru · line 671
Quoted 8 lines
arch/s390/kernel/ptrace.c +8
-0+if (unlikely (current->audit_context)) +audit_syscall_entry (test_thread_flag (TIF_31BIT ) ? +AUDIT_ARCH_S390 :AUDIT_ARCH_S390X , + regs->gprs[2 ], regs->orig_gpr2, + regs->gprs[3 ], regs->gprs[4 ], + regs->gprs[5 ]); +return ret; +}
According to the above, the syscall number is in regs->gprs[2] and the 1st syscall argument is in regs->orig_gpr2.
Then in:
Quoted 2 lines
Index:
quilt-2.6/arch/s390/include/asm/syscall.h
===================================================================
...
arch/s390/kernel/ptrace.c
Quoted 7 lines
arch/s390/kernel/ptrace.c +7
-0+static inline long syscall_get_nr (struct task_struct *task, +struct pt_regs *regs) +{ +if (regs->trap != __LC_SVC_OLD_PSW) +return -1 ; +return regs->gprs[2 ]; +}
... according to the syscall_get_nr(), the syscall number is in regs->gprs[2], which matches what is in arch/s390/kernel/ptrace.c ...
Quoted 21 lines
arch/s390/kernel/ptrace.c +21
-0+static inline void syscall_get_arguments (struct task_struct *task, +struct pt_regs *regs, +unsigned int i,unsigned int n, +unsigned long *args) +{ +BUG_ON (i + n >6 ); +#ifdef CONFIG_COMPAT +if (test_tsk_thread_flag (task,TIF_31BIT )) { +if (i + n ==6 ) + args[--n] = (u32 ) regs->args[0 ]; +while (n-- >0 ) + args[n] = (u32 ) regs->gprs[2 + i + n]; + } +#endif +if (i + n ==6 ) + args[--n] = regs->args[0 ]; +memcpy (args, ®s->gprs[2 + i], n *sizeof (args[0 ])); +} + +static inline void syscall_set_arguments(struct task_struct *task, + struct pt_regs *regs,
arch/s390/kernel/ptrace.c
Quoted 10 lines
arch/s390/kernel/ptrace.c +10
-0+ unsigned int i, unsigned int n, + const unsigned long *args) +{ + BUG_ON(i + n > 6); +if (i + n ==6 ) + regs->args[0 ] = args[--n]; +memcpy (®s->gprs[2 + i], args, n *sizeof (args[0 ])); +} + +#endif /* _ASM_SYSCALL_H */
According to syscall_get_arguments()/syscall_set_arguments(), the 1st syscall argument is in regs->gprs[2], which *doesn't* match what is in arch/s390/kernel/ptrace.c.
Is this correct, or should the 1st syscall argument be found in regs->orig_gpr2 by syscall_get_arguments()/syscall_set_arguments()?
Signature · 6 lines
David Smith [email protected] Red Hat http://www.redhat.com 256.217.0141 (direct) 256.837.0057 (fax)
Re: [patch 15/21] ptrace changes
Quoted 2 lines · David Smith
Is this correct, or should the 1st syscall argument be found in
regs->orig_gpr2by syscall_get_arguments()/syscall_set_arguments()?
The question is when do syscall_get_arguments and syscall_set_arguments functions get called? If they are called on a call chain that started from do_syscall_trace_enter then we'd have to use orig_gpr2 instead of gprs[2] but if the functions are not called via do_syscall_trace_enter the first argument is located in grprs[2]. As far as I can see the sole user of syscall_get_arguments is collect_syscall which is used to get the registers of a blocked process. In this case the kernel call chain does not include do_syscall_trace_enter, therefore the first argument is in gprs[2], no?
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
Re: [patch 15/21] ptrace changes
Quoted 5 lines · Martin Schwidefsky
Quoted 2 lines · David Smith
Is this correct, or should the 1st syscall argument be found in
regs->orig_gpr2by syscall_get_arguments()/syscall_set_arguments()?
Quoted 9 lines
The question is when do
syscall_get_argumentsandsyscall_set_argumentsfunctions get called? If they are called on a call chain that started fromdo_syscall_trace_enterthen we'd have to useorig_gpr2instead of gprs[2] but if the functions are not called viado_syscall_trace_enterthe first argument is located in grprs[2]. As far as I can see the sole user ofsyscall_get_argumentsiscollect_syscallwhich is used to get the registers of a blocked process. In this case the kernel call chain does not includedo_syscall_trace_enter, therefore the first argument is in gprs[2], no?
But, collect_syscall() also calls syscall_get_nr():
*callno = syscall_get_nr(target, regs); if (*callno != -1L && maxargs > 0) syscall_get_arguments(target, regs, 0, maxargs, args);
Both syscall_get_nr() *and* syscall_get_arguments() returning gprs[2] can't be right, can it?
Signature · 6 lines
David Smith [email protected] Red Hat http://www.redhat.com 256.217.0141 (direct) 256.837.0057 (fax)
Re: [patch 15/21] ptrace changes
Quoted 16 lines · David Smith
Quoted 5 lines · Martin Schwidefsky
Quoted 2 lines · David Smith
Is this correct, or should the 1st syscall argument be found in
regs->orig_gpr2by syscall_get_arguments()/syscall_set_arguments()?Quoted 9 lines
The question is when do
syscall_get_argumentsandsyscall_set_argumentsfunctions get called? If they are called on a call chain that started fromdo_syscall_trace_enterthen we'd have to useorig_gpr2instead of gprs[2] but if the functions are not called viado_syscall_trace_enterthe first argument is located in grprs[2]. As far as I can see the sole user ofsyscall_get_argumentsiscollect_syscallwhich is used to get the registers of a blocked process. In this case the kernel call chain does not includedo_syscall_trace_enter, therefore the first argument is in gprs[2], no?
Quoted 8 lines
But,
collect_syscall()also callssyscall_get_nr():*callno = syscall_get_nr(target, regs); if (*callno != -1L && maxargs > 0) syscall_get_arguments(target, regs, 0, maxargs, args);Both
syscall_get_nr()*and*syscall_get_arguments()returning gprs[2] can't be right, can it?
Indeed, this cannot work. syscall_get_nr() requires that it is called on a call chain that includes do_syscall_trace_enter(). And the fix for it is not trivial. Probably the best would be to add another field to pt_regs which contains the system call number. syscall_get_arguments() could be improved to always use orig_gpr2 instead of grps[2] then it doesn't matter when it is called. The problematic one is syscall_set_arguments(), there it depends if grps[2] needs to be stored of not. Hmm, this needs some thinking ..
Good spotting by the way :-)
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
Re: [patch 15/21] ptrace changes
In reply to David SmithQuoted 8 lines · David Smith
But,
collect_syscall()also callssyscall_get_nr():*callno = syscall_get_nr(target, regs); if (*callno != -1L && maxargs > 0) syscall_get_arguments(target, regs, 0, maxargs, args);Both
syscall_get_nr()*and*syscall_get_arguments()returning gprs[2] can't be right, can it?
Ok, I managed to get syscall_get_nr() independent from do_syscall_trace_enter. With the patch below syscall_get_nr() can now be called anytime for a speeling process.
Signature · 294 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin. --- Subject: [PATCH] fix syscall_get_nr. From: Martin Schwidefsky <[email protected]> syscall_get_nr() currently returns a valid result only if the call chain of the traced process includes do_syscall_trace_enter(). But collect_syscall() can be called for any sleeping task, the result of syscall_get_nr() in general is completely bogus. To make syscall_get_nr() work for any sleeping task the traps field in pt_regs is replace with svcnr - the system call number the process is executing. If svcnr == 0 the process is not on a system call path. Signed-off-by: Martin Schwidefsky <[email protected]> Signed-off-by: Martin Schwidefsky <[email protected]> --- arch/s390/include/asm/ptrace.h | 2 +- arch/s390/include/asm/syscall.h | 4 +--- arch/s390/kernel/asm-offsets.c | 2 +- arch/s390/kernel/compat_signal.c | 2 +- arch/s390/kernel/entry.S | 21 +++++++++++---------- arch/s390/kernel/entry64.S | 23 ++++++++++------------- arch/s390/kernel/ptrace.c | 2 +- arch/s390/kernel/signal.c | 6 +++--- 8 files changed, 29 insertions(+), 33 deletions(-) diff -urpN linux-2.6/arch/s390/include/asm/ptrace.h linux-2.6-patched/arch/s390/include/asm/ptrace.h --- linux-2.6/arch/s390/include/asm/ptrace.h 2008-11-07 16:35:54.000000000 +0100 +++ linux-2.6-patched/arch/s390/include/asm/ptrace.h 2008-11-07 16:36:20.000000000 +0100 @@ -321,8 +321,8 @@ struct pt_regs psw_t psw; unsigned long gprs[NUM_GPRS]; unsigned long orig_gpr2; + unsigned short svcnr; unsigned short ilc; - unsigned short trap; }; #endif diff -urpN linux-2.6/arch/s390/include/asm/syscall.h linux-2.6-patched/arch/s390/include/asm/syscall.h --- linux-2.6/arch/s390/include/asm/syscall.h 2008-11-07 16:35:54.000000000 +0100 +++ linux-2.6-patched/arch/s390/include/asm/syscall.h 2008-11-07 16:36:20.000000000 +0100 @@ -17,9 +17,7 @@ static inline long syscall_get_nr(struct task_struct *task, struct pt_regs *regs) { - if (regs->trap != __LC_SVC_OLD_PSW) - return -1; - return regs->gprs[2]; + return regs->svcnr ? regs->svcnr : -1; } static inline void syscall_rollback(struct task_struct *task, diff -urpN linux-2.6/arch/s390/kernel/asm-offsets.c linux-2.6-patched/arch/s390/kernel/asm-offsets.c --- linux-2.6/arch/s390/kernel/asm-offsets.c 2008-11-07 16:36:07.000000000 +0100 +++ linux-2.6-patched/arch/s390/kernel/asm-offsets.c 2008-11-07 16:36:20.000000000 +0100 @@ -33,7 +33,7 @@ int main(void) DEFINE(__PT_GPRS, offsetof(struct pt_regs, gprs)); DEFINE(__PT_ORIG_GPR2, offsetof(struct pt_regs, orig_gpr2)); DEFINE(__PT_ILC, offsetof(struct pt_regs, ilc)); - DEFINE(__PT_TRAP, offsetof(struct pt_regs, trap)); + DEFINE(__PT_SVCNR, offsetof(struct pt_regs, svcnr)); DEFINE(__PT_SIZE, sizeof(struct pt_regs)); BLANK(); DEFINE(__SF_BACKCHAIN, offsetof(struct stack_frame, back_chain)); diff -urpN linux-2.6/arch/s390/kernel/compat_signal.c linux-2.6-patched/arch/s390/kernel/compat_signal.c --- linux-2.6/arch/s390/kernel/compat_signal.c 2008-10-10 00:13:53.000000000 +0200 +++ linux-2.6-patched/arch/s390/kernel/compat_signal.c 2008-11-07 16:36:20.000000000 +0100 @@ -340,7 +340,7 @@ static int restore_sigregs32(struct pt_r return err; restore_fp_regs(¤t->thread.fp_regs); - regs->trap = -1; /* disable syscall checks */ + regs->svcnr = 0; /* disable syscall checks */ return 0; } diff -urpN linux-2.6/arch/s390/kernel/entry64.S linux-2.6-patched/arch/s390/kernel/entry64.S --- linux-2.6/arch/s390/kernel/entry64.S 2008-11-07 16:36:04.000000000 +0100 +++ linux-2.6-patched/arch/s390/kernel/entry64.S 2008-11-07 16:36:20.000000000 +0100 @@ -46,7 +46,7 @@ SP_R14 = STACK_FRAME_OVERHEAD + __P SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 120 SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2 SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC -SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP +SP_SVCNR = STACK_FRAME_OVERHEAD + __PT_SVCNR SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER @@ -171,11 +171,10 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_ .macro CREATE_STACK_FRAME psworg,savearea aghi %r15,-SP_SIZE # make room for registers & psw mvc SP_PSW(16,%r15),0(%r12) # move user PSW to stack - la %r12,\psworg stg %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 - icm %r12,12,__LC_SVC_ILC + icm %r12,3,__LC_SVC_ILC stmg %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack - st %r12,SP_ILC(%r15) + st %r12,SP_SVCNR(%r15) mvc SP_R12(32,%r15),\savearea # move %r12-%r15 to stack la %r12,0 stg %r12,__SF_BACKCHAIN(%r15) @@ -250,16 +249,17 @@ sysc_update: #endif sysc_do_svc: lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct - slag %r7,%r7,2 # *4 and test for svc 0 + ltgr %r7,%r7 # test for svc 0 jnz sysc_nr_ok # svc 0: system call number in %r1 cl %r1,BASED(.Lnr_syscalls) jnl sysc_nr_ok lgfr %r7,%r1 # clear high word in r1 - slag %r7,%r7,2 # svc 0: system call number in %r1 sysc_nr_ok: mvc SP_ARGS(8,%r15),SP_R7(%r15) sysc_do_restart: + sth %r7,SP_SVCNR(%r15) + sllg %r7,%r7,2 # svc number * 4 larl %r10,sys_call_table #ifdef CONFIG_COMPAT tm __TI_flags+5(%r9),(_TIF_31BIT>>16) # running in 31 bit mode ? @@ -363,7 +363,6 @@ sysc_notify_resume: sysc_restart: ni __TI_flags+7(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC lg %r7,SP_R2(%r15) # load new svc number - slag %r7,%r7,2 # *4 mvc SP_R2(8,%r15),SP_ORIG_R2(%r15) # restore first argument lmg %r2,%r6,SP_R2(%r15) # load svc arguments j sysc_do_restart # restart svc @@ -372,9 +371,8 @@ sysc_restart: # _TIF_SINGLE_STEP is set, call do_single_step # sysc_singlestep: - ni __TI_flags+7(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP - lhi %r0,__LC_PGM_OLD_PSW - sth %r0,SP_TRAP(%r15) # set trap indication to pgm check + ni __TI_flags+7(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP + xc SP_SVCNR(2,%r15),SP_SVCNR(%r15) # clear svc number la %r2,SP_PTREGS(%r15) # address of register-save area larl %r14,sysc_return # load adr. of system return jg do_single_step # branch to do_sigtrap @@ -392,7 +390,7 @@ sysc_tracesys: lghi %r0,NR_syscalls clgr %r0,%r2 jnh sysc_tracenogo - slag %r7,%r2,2 # *4 + sllg %r7,%r2,2 # svc number *4 lgf %r8,0(%r7,%r10) sysc_tracego: lmg %r3,%r6,SP_R3(%r15) @@ -567,8 +565,7 @@ pgm_svcper: # per was called from kernel, must be kprobes # kernel_per: - lhi %r0,__LC_PGM_OLD_PSW - sth %r0,SP_TRAP(%r15) # set trap indication to pgm check + xc SP_SVCNR(2,%r15),SP_SVCNR(%r15) # clear svc number la %r2,SP_PTREGS(%r15) # address of register-save area larl %r14,sysc_restore # load adr. of system ret, no work jg do_single_step # branch to do_single_step diff -urpN linux-2.6/arch/s390/kernel/entry.S linux-2.6-patched/arch/s390/kernel/entry.S --- linux-2.6/arch/s390/kernel/entry.S 2008-11-07 16:36:04.000000000 +0100 +++ linux-2.6-patched/arch/s390/kernel/entry.S 2008-11-07 16:36:20.000000000 +0100 @@ -46,7 +46,7 @@ SP_R14 = STACK_FRAME_OVERHEAD + __P SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 60 SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2 SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC -SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP +SP_SVCNR = STACK_FRAME_OVERHEAD + __PT_SVCNR SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ @@ -183,11 +183,10 @@ STACK_SIZE = 1 << STACK_SHIFT .macro CREATE_STACK_FRAME psworg,savearea s %r15,BASED(.Lc_spsize) # make room for registers & psw mvc SP_PSW(8,%r15),0(%r12) # move user PSW to stack - la %r12,\psworg st %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 - icm %r12,12,__LC_SVC_ILC + icm %r12,3,__LC_SVC_ILC stm %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack - st %r12,SP_ILC(%r15) + st %r12,SP_SVCNR(%r15) mvc SP_R12(16,%r15),\savearea # move %r12-%r15 to stack la %r12,0 st %r12,__SF_BACKCHAIN(%r15) # clear back chain @@ -264,16 +263,17 @@ sysc_update: #endif sysc_do_svc: l %r9,__LC_THREAD_INFO # load pointer to thread_info struct - sla %r7,2 # *4 and test for svc 0 + ltr %r7,%r7 # test for svc 0 bnz BASED(sysc_nr_ok) # svc number > 0 # svc 0: system call number in %r1 cl %r1,BASED(.Lnr_syscalls) bnl BASED(sysc_nr_ok) lr %r7,%r1 # copy svc number to %r7 - sla %r7,2 # *4 sysc_nr_ok: mvc SP_ARGS(4,%r15),SP_R7(%r15) sysc_do_restart: + sth %r7,SP_SVCNR(%r15) + sll %r7,2 # svc number *4 l %r8,BASED(.Lsysc_table) tm __TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT) l %r8,0(%r7,%r8) # get system call addr. @@ -376,7 +376,6 @@ sysc_notify_resume: sysc_restart: ni __TI_flags+3(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC l %r7,SP_R2(%r15) # load new svc number - sla %r7,2 mvc SP_R2(4,%r15),SP_ORIG_R2(%r15) # restore first argument lm %r2,%r6,SP_R2(%r15) # load svc arguments b BASED(sysc_do_restart) # restart svc @@ -386,7 +385,8 @@ sysc_restart: # sysc_singlestep: ni __TI_flags+3(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP - mvi SP_TRAP+1(%r15),0x28 # set trap indication to pgm check + mvi SP_SVCNR(%r15),0xff # set trap indication to pgm check + mvi SP_SVCNR+1(%r15),0xff la %r2,SP_PTREGS(%r15) # address of register-save area l %r1,BASED(.Lhandle_per) # load adr. of per handler la %r14,BASED(sysc_return) # load adr. of system return @@ -407,7 +407,7 @@ sysc_tracesys: bnl BASED(sysc_tracenogo) l %r8,BASED(.Lsysc_table) lr %r7,%r2 - sll %r7,2 # *4 + sll %r7,2 # svc number *4 l %r8,0(%r7,%r8) sysc_tracego: lm %r3,%r6,SP_R3(%r15) @@ -586,7 +586,8 @@ pgm_svcper: # per was called from kernel, must be kprobes # kernel_per: - mvi SP_TRAP+1(%r15),0x28 # set trap indication to pgm check + mvi SP_SVCNR(%r15),0xff # set trap indication to pgm check + mvi SP_SVCNR+1(%r15),0xff la %r2,SP_PTREGS(%r15) # address of register-save area l %r1,BASED(.Lhandle_per) # load adr. of per handler la %r14,BASED(sysc_restore)# load adr. of system return diff -urpN linux-2.6/arch/s390/kernel/ptrace.c linux-2.6-patched/arch/s390/kernel/ptrace.c --- linux-2.6/arch/s390/kernel/ptrace.c 2008-11-07 16:36:18.000000000 +0100 +++ linux-2.6-patched/arch/s390/kernel/ptrace.c 2008-11-07 16:36:20.000000000 +0100 @@ -655,7 +655,7 @@ asmlinkage long do_syscall_trace_enter(s * debugger stored an invalid system call number. Skip * the system call and the system call restart handling. */ - regs->trap = -1; + regs->svcnr = 0; ret = -1; } diff -urpN linux-2.6/arch/s390/kernel/signal.c linux-2.6-patched/arch/s390/kernel/signal.c --- linux-2.6/arch/s390/kernel/signal.c 2008-11-07 16:35:54.000000000 +0100 +++ linux-2.6-patched/arch/s390/kernel/signal.c 2008-11-07 16:36:20.000000000 +0100 @@ -160,7 +160,7 @@ static int restore_sigregs(struct pt_reg current->thread.fp_regs.fpc &= FPC_VALID_MASK; restore_fp_regs(¤t->thread.fp_regs); - regs->trap = -1; /* disable syscall checks */ + regs->svcnr = 0; /* disable syscall checks */ return 0; } @@ -445,7 +445,7 @@ void do_signal(struct pt_regs *regs) oldset = ¤t->blocked; /* Are we from a system call? */ - if (regs->trap == __LC_SVC_OLD_PSW) { + if (regs->svcnr) { continue_addr = regs->psw.addr; restart_addr = continue_addr - regs->ilc; retval = regs->gprs[2]; @@ -462,7 +462,7 @@ void do_signal(struct pt_regs *regs) case -ERESTART_RESTARTBLOCK: regs->gprs[2] = -EINTR; } - regs->trap = -1; /* Don't deal with this again. */ + regs->svcnr = 0; /* Don't deal with this again. */ } /* Get signal to deliver. When running under ptrace, at this point
PATCH 16/21 dcssblk: add >2G DCSSs support and stacked contiguous DCSSs support.
In reply to Martin SchwidefskyFrom: Hongjie Yang <[email protected]>
The DCSS block device driver is modified to add >2G DCSSs support and allow a DCSS block device to map to a set of contiguous DCSSs. The extmem code is also modified to use new Diagnose x'64' subcodes for
Quoted 1 line
2G DCSSs.
---
arch/s390/mm/extmem.c | 251 +++++++++++++++++--- drivers/s390/block/dcssblk.c | 515 ++++++++++++++++++++++++++++++++----------- 2 files changed, 596 insertions(+), 170 deletions(-)
arch/s390/mm/extmem.c +212 -39
@@ -43,20 +43,40 @@#define DCSS_FINDSEG 0x0c#define DCSS_LOADNOLY 0x10#define DCSS_SEGEXT 0x18 +#define DCSS_LOADSHRX 0x20 +#define DCSS_LOADNSRX 0x24 +#define DCSS_FINDSEGX 0x2c +#define DCSS_SEGEXTX 0x38#define DCSS_FINDSEGA 0x0cstruct qrange { -unsigned int start;// 3byte start address, 1 byte type -unsigned int end;// 3byte end address, 1 byte reserved +unsigned long start;/* last byte type */ +unsigned long end;/* last byte reserved */ };struct qout64 { +unsigned long segstart; +unsigned long segend; +int segcnt; +int segrcnt; +struct qrange range[6 ]; +}; + +#ifdef CONFIG_64BIT +struct qrange_old { +unsigned int start;/* last byte type */ +unsigned int end;/* last byte reserved */ +}; + +/* output area format for the Diag x'64' old subcode x'18' */ +struct qout64_old {int segstart;int segend;int segcnt;int segrcnt; -struct qrange range[6 ]; +struct qrange_old range[6 ]; }; +#endif struct qin64 {char qopcode;
@@ -86,6 +106,55 @@ static DEFINE_MUTEX(dcss_lock);static LIST_HEAD (dcss_list);static char *segtype_string[] = {"SW" ,"EW" ,"SR" ,"ER" ,"SN" ,"EN" ,"SC" ,"EW/EN-MIXED" }; +static int loadshr_scode, loadnsr_scode, findseg_scode; +static int segext_scode, purgeseg_scode; +static int scode_set; + +/* set correct Diag x'64' subcodes. */ +static int +dcss_set_subcodes (void ) +{ +#ifdef CONFIG_64BIT +char *name =kmalloc (8 *sizeof (char ),GFP_DMA ); +unsigned long rx, ry; +int rc; + +if (name ==NULL ) +return -ENOMEM ; + + rx = (unsigned long ) name; + ry =DCSS_FINDSEGX ; + +strcpy (name,"dummy" ); + asmvolatile ( +" diag %0,%1,0x64\n" +"0: ipm %2\n" +" srl %2,28\n" +" j 2f\n" +"1: la %2,3\n" +"2:\n" + EX_TABLE(0b, 1b) + : "+d" (rx), "+d" (ry), "=d" (rc) : : "cc"); + + kfree(name); +/* Diag x'64' new subcodes are supported, set to new subcodes */ +if (rc !=3 ) { + loadshr_scode =DCSS_LOADSHRX ; + loadnsr_scode =DCSS_LOADNSRX ; + purgeseg_scode =DCSS_PURGESEG ; + findseg_scode =DCSS_FINDSEGX ; + segext_scode =DCSS_SEGEXTX ; +return 0 ; + } +#endif +/* Diag x'64' new subcodes are not supported, set to old subcodes */ + loadshr_scode =DCSS_LOADNOLY ; + loadnsr_scode =DCSS_LOADNSR ; + purgeseg_scode =DCSS_PURGESEG ; + findseg_scode =DCSS_FINDSEG ; + segext_scode =DCSS_SEGEXT ; +return 0 ; +}/* * Create the 8 bytes, ebcdic VM segment name from
@@ -135,25 +204,45 @@ segment_by_name (char *name)* Perform a function on a dcss segment. */ static inline int -dcss_diag (__u8 func,void *parameter, +dcss_diag (int *func,void *parameter,unsigned long *ret1,unsigned long *ret2) {unsigned long rx, ry;int rc; +if (scode_set ==0 ) { + rc =dcss_set_subcodes (); +if (rc <0 ) +return rc; + scode_set =1 ; + } rx = (unsigned long ) parameter; - ry = (unsigned long ) func; - asmvolatile ( + ry = (unsigned long ) *func; +#ifdef CONFIG_64BIT - " sam31\n" - " diag %0,%1,0x64\n" - " sam64\n" +/* 64-bit Diag x'64' new subcode, keep in 64-bit addressing mode */ +if (*func >DCSS_SEGEXT ) + asmvolatile ( +" diag %0,%1,0x64\n" +" ipm %2\n" +" srl %2,28\n" + :"+d" (rx),"+d" (ry),"=d" (rc) : :"cc" ); +/* 31-bit Diag x'64' old subcode, switch to 31-bit addressing mode */ +else + asmvolatile ( +" sam31\n" +" diag %0,%1,0x64\n" +" sam64\n" +" ipm %2\n" +" srl %2,28\n" + :"+d" (rx),"+d" (ry),"=d" (rc) : :"cc" );#else + asmvolatile (" diag %0,%1,0x64\n" -#endif" ipm %2\n" " srl %2,28\n" :"+d" (rx),"+d" (ry),"=d" (rc) : :"cc" ); +#endif *ret1 = rx; *ret2 = ry;return rc;
@@ -190,14 +279,45 @@ query_segment_type (struct dcss_segment qin->qoutlen =sizeof (struct qout64 );memcpy (qin->qname, seg->dcss_name,8 ); - diag_cc =dcss_diag (DCSS_SEGEXT , qin, &dummy, &vmrc); + diag_cc =dcss_diag (&segext_scode, qin, &dummy, &vmrc); +if (diag_cc <0 ) { + rc = diag_cc; + goto out_free; + }if (diag_cc >1 ) {PRINT_WARN ("segment_type: diag returned error %ld\n" , vmrc); rc =dcss_diag_translate_rc (vmrc); goto out_free; } +#ifdef CONFIG_64BIT +/* Only old format of output area of Diagnose x'64' is supported, +copy data for the new format. */ +if (segext_scode ==DCSS_SEGEXT ) { +struct qout64_old *qout_old; + qout_old =kzalloc (sizeof (struct qout64_old ),GFP_DMA ); +if (qout_old ==NULL ) { + rc = -ENOMEM ; + goto out_free; + } +memcpy (qout_old, qout,sizeof (struct qout64_old )); + qout->segstart = (unsigned long ) qout_old->segstart; + qout->segend = (unsigned long ) qout_old->segend; + qout->segcnt = qout_old->segcnt; + qout->segrcnt = qout_old->segrcnt; + +if (qout->segcnt >6 ) + qout->segrcnt =6 ; +for (i =0 ; i < qout->segrcnt; i++) { + qout->range[i].start = + (unsigned long ) qout_old->range[i].start; + qout->range[i].end = + (unsigned long ) qout_old->range[i].end; + } +kfree (qout_old); + } +#endif if (qout->segcnt >6 ) { rc = -ENOTSUPP ; goto out_free;
@@ -269,6 +389,30 @@ segment_type (char* name) }/* +* check if segment collides with other segments that are currently loaded +* returns 1 if this is the case, 0 if no collision was found +*/ +static int +segment_overlaps_others (struct dcss_segment *seg) +{ +struct list_head *l; +struct dcss_segment *tmp; + +BUG_ON (!mutex_is_locked (&dcss_lock)); +list_for_each (l, &dcss_list) { + tmp = list_entry(l, struct dcss_segment, list); +if ((tmp->start_addr >>20 ) > (seg->end >>20 )) +continue ; +if ((tmp->end >>20 ) < (seg->start_addr >>20 )) +continue ; +if (seg == tmp) +continue ; +return 1 ; + } +return 0 ; +} + +/* * real segment loading function, called from segment_load */ static int
@@ -276,7 +420,8 @@ __segment_load (char *name, int do_nonsh {struct dcss_segment *seg =kmalloc (sizeof (struct dcss_segment ),GFP_DMA ); -int dcss_command, rc, diag_cc; +int rc, diag_cc; +unsigned long start_addr, end_addr, dummy;if (seg ==NULL ) { rc = -ENOMEM ;
@@ -287,6 +432,13 @@ __segment_load (char *name, int do_nonshif (rc <0 ) goto out_free; +if (loadshr_scode ==DCSS_LOADSHRX ) { +if (segment_overlaps_others (seg)) { + rc = -EBUSY ; + goto out_free; + } + } + rc =vmem_add_mapping (seg->start_addr, seg->end - seg->start_addr +1 );if (rc)
@@ -316,20 +468,28 @@ __segment_load (char *name, int do_nonsh }if (do_nonshared) - dcss_command =DCSS_LOADNSR ; + diag_cc =dcss_diag (&loadnsr_scode, seg->dcss_name, + &start_addr, &end_addr);else - dcss_command =DCSS_LOADNOLY ; - - diag_cc =dcss_diag (dcss_command, seg->dcss_name, - &seg->start_addr, &seg->end); + diag_cc =dcss_diag (&loadshr_scode, seg->dcss_name, + &start_addr, &end_addr); +if (diag_cc <0 ) { +dcss_diag (&purgeseg_scode, seg->dcss_name, + &dummy, &dummy); + rc = diag_cc; + goto out_resource; + }if (diag_cc >1 ) {PRINT_WARN ("segment_load: could not load segment %s - " -"diag returned error (%ld)\n" ,name,seg->end); - rc =dcss_diag_translate_rc (seg->end); -dcss_diag (DCSS_PURGESEG , seg->dcss_name, - &seg->start_addr, &seg->end); +"diag returned error (%ld)\n" , + name, end_addr); + rc =dcss_diag_translate_rc (end_addr); +dcss_diag (&purgeseg_scode, seg->dcss_name, + &dummy, &dummy); goto out_resource; } + seg->start_addr = start_addr; + seg->end = end_addr; seg->do_nonshared = do_nonshared;atomic_set (&seg->ref_count,1 );list_add (&seg->list, &dcss_list);
@@ -423,8 +583,8 @@ int segment_modify_shared (char *name, int do_nonshared) {struct dcss_segment *seg; -unsigned long dummy; -int dcss_command, rc, diag_cc; +unsigned long start_addr, end_addr, dummy; +int rc, diag_cc;mutex_lock (&dcss_lock); seg =segment_by_name (name);
@@ -445,38 +605,51 @@ segment_modify_shared (char *name, int d goto out_unlock; }release_resource (seg->res); -if (do_nonshared) { - dcss_command =DCSS_LOADNSR ; +if (do_nonshared) seg->res->flags &= ~IORESOURCE_READONLY ; - }else { - dcss_command =DCSS_LOADNOLY ; +else if (seg->vm_segtype ==SEG_TYPE_SR || seg->vm_segtype ==SEG_TYPE_ER ) seg->res->flags |=IORESOURCE_READONLY ; - } +if (request_resource (&iomem_resource, seg->res)) {PRINT_WARN ("segment_modify_shared: could not reload segment %s" " - overlapping resources\n" , name); rc = -EBUSY ;kfree (seg->res); - goto out_del; + goto out_del_mem; + } + +dcss_diag (&purgeseg_scode, seg->dcss_name, &dummy, &dummy); +if (do_nonshared) + diag_cc =dcss_diag (&loadnsr_scode, seg->dcss_name, + &start_addr, &end_addr); +else + diag_cc =dcss_diag (&loadshr_scode, seg->dcss_name, + &start_addr, &end_addr); +if (diag_cc <0 ) { + rc = diag_cc; + goto out_del_res; } -dcss_diag (DCSS_PURGESEG , seg->dcss_name, &dummy, &dummy); - diag_cc =dcss_diag (dcss_command, seg->dcss_name, - &seg->start_addr, &seg->end);if (diag_cc >1 ) {PRINT_WARN ("segment_modify_shared: could not reload segment %s" -" - diag returned error (%ld)\n" ,name,seg->end); - rc =dcss_diag_translate_rc (seg->end); - goto out_del; +" - diag returned error (%ld)\n" , + name, end_addr); + rc =dcss_diag_translate_rc (end_addr); + goto out_del_res; } + seg->start_addr = start_addr; + seg->end = end_addr; seg->do_nonshared = do_nonshared; rc =0 ; goto out_unlock; - out_del: + out_del_res: +release_resource (seg->res); +kfree (seg->res); + out_del_mem:vmem_remove_mapping (seg->start_addr, seg->end - seg->start_addr +1 );list_del (&seg->list); -dcss_diag (DCSS_PURGESEG , seg->dcss_name, &dummy, &dummy); +dcss_diag (&purgeseg_scode, seg->dcss_name, &dummy, &dummy);kfree (seg); out_unlock:mutex_unlock (&dcss_lock);
@@ -510,7 +683,7 @@ segment_unload(char *name)kfree (seg->res);vmem_remove_mapping (seg->start_addr, seg->end - seg->start_addr +1 );list_del (&seg->list); -dcss_diag (DCSS_PURGESEG , seg->dcss_name, &dummy, &dummy); +dcss_diag (&purgeseg_scode, seg->dcss_name, &dummy, &dummy);kfree (seg); out_unlock:mutex_unlock (&dcss_lock);
@@ -545,7 +718,7 @@ segment_save(char *name) endpfn = (seg->end) >>PAGE_SHIFT ;sprintf (cmd1,"DEFSEG %s" , name);for (i=0 ; i<seg->segcnt; i++) { -sprintf (cmd1+strlen (cmd1)," %X-%X %s" , +sprintf (cmd1+strlen (cmd1)," %lX-%lX %s" , seg->range[i].start >>PAGE_SHIFT , seg->range[i].end >>PAGE_SHIFT , segtype_string[seg->range[i].start &0xff ]);
drivers/s390/block/dcssblk.c +384 -131
772 lines not on this page · raw message
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 17/21 nohz: Fix __udelay.
In reply to Martin SchwidefskyFrom: Heiko Carstens <[email protected]>
rcutorture reveals that our __udelay implementation is still buggy, since it might schedule tasklets, but prevents their execution:
NOHZ: local_softirq_pending 42
NOHZ: local_softirq_pending 02
NOHZ: local_softirq_pending 142
NOHZ: local_softirq_pending 02
To fix this we make sure that only the clock comparator interrupt is enabled when the enabled wait psw is loaded.
Also no code gets called anymore which might schedule tasklets.
---
arch/s390/kernel/time.c | 2 + arch/s390/lib/delay.c | 88 +++++++++++++++++++++++++++++------------------- 2 files changed, 56 insertions(+), 34 deletions(-)
arch/s390/kernel/time.c +2 -0
@@ -169,6 +169,8 @@ void init_cpu_timer(void)static void clock_comparator_interrupt (__u16 code) { +if (S390_lowcore.clock_comparator ==-1ULL ) +set_clock_comparator (S390_lowcore.clock_comparator); }static void etr_timing_alert (struct etr_irq_parm *);
arch/s390/lib/delay.c +54 -34
111 lines not on this page · raw message
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 18/21 Move private simple udelay function to arch/s390/lib/delay.c.
In reply to Martin SchwidefskyFrom: Heiko Carstens <[email protected]>
Move cio's private simple udelay function to lib/delay.c and turn it into something much more readable. So we have all implementations at one place.
---
arch/s390/include/asm/delay.h | 1 + arch/s390/lib/delay.c | 13 +++++++++++++ drivers/s390/cio/cio.c | 17 ++--------------- 3 files changed, 16 insertions(+), 15 deletions(-)
arch/s390/include/asm/delay.h +1 -0
@@ -15,6 +15,7 @@#define _S390_DELAY_Hextern void __udelay (unsigned long usecs); +extern void udelay_simple (unsigned long usecs);extern void __delay (unsigned long loops);#define udelay (n) __udelay(n)
arch/s390/lib/delay.c +13 -0
@@ -92,3 +92,16 @@ out:local_irq_restore (flags);preempt_enable (); } + +/* +* Simple udelay variant. To be used on startup and reboot +* when the interrupt handler isn't working. +*/ +void udelay_simple (unsigned long usecs) +{ +u64 end; + + end =get_clock () + ((u64 ) usecs <<12 ); +while (get_clock () < end) +cpu_relax (); +}
drivers/s390/cio/cio.c +2 -15
@@ -855,19 +855,6 @@ __disable_subchannel_easy(struct subchanreturn -EBUSY ;/* uhm... */ } -/* we can't use the normal udelay here, since it enables external interrupts */ - -static void udelay_reset (unsigned long usecs) -{ -uint64_t start_cc, end_cc; - - asmvolatile ("STCK %0" :"=m" (start_cc)); -do { -cpu_relax (); - asmvolatile ("STCK %0" :"=m" (end_cc)); - }while (((end_cc - start_cc)/4096 ) < usecs); -} -static int __clear_io_subchannel_easy (struct subchannel_id schid) {
@@ -883,7 +870,7 @@ __clear_io_subchannel_easy(struct subchaif (schid_equal (&ti.schid, &schid))return 0 ; } -udelay_reset (100 ); +udelay_simple (100 ); }return -EBUSY ; }
@@ -891,7 +878,7 @@ __clear_io_subchannel_easy(struct subchastatic void __clear_chsc_subchannel_easy (void ) {/* It seems we can only wait for a bit here :/ */ -udelay_reset (100 ); +udelay_simple (100 ); }static int pgm_check_occured;
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 19/21 dasd: fix message flood for unsolicited interrupts
In reply to Martin SchwidefskyFrom: Stefan Haberland <[email protected]>
In the unsolicited interupt handler fake IRBs from CIO have to be ignored because there is nothing to do.
The function dump_sense should not be called if there is no sense data available.
---
drivers/s390/block/dasd_eckd.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-)
drivers/s390/block/dasd_eckd.c +20 -5
@@ -1501,12 +1501,27 @@ static void dasd_eckd_handle_unsolicitedreturn ; } -/* just report other unsolicited interrupts */ -DEV_MESSAGE (KERN_DEBUG , device,"%s" , -"unsolicited interrupt received" ); - device->discipline->dump_sense (device,NULL , irb); -dasd_schedule_device_bh (device); +if ((irb->scsw.cmd.cc ==1 ) && + (irb->scsw.cmd.fctl &SCSW_FCTL_START_FUNC ) && + (irb->scsw.cmd.actl &SCSW_ACTL_START_PEND ) && + (irb->scsw.cmd.stctl &SCSW_STCTL_STATUS_PEND )) { +/* fake irb do nothing, they are handled elsewhere */ +dasd_schedule_device_bh (device); +return ; + } +if (!(irb->esw.esw0.erw.cons)) { +/* just report other unsolicited interrupts */ +DEV_MESSAGE (KERN_ERR , device,"%s" , +"unsolicited interrupt received" ); + }else { +DEV_MESSAGE (KERN_ERR , device,"%s" , +"unsolicited interrupt received " +"(sense available)" ); + device->discipline->dump_sense (device,NULL , irb); + } + +dasd_schedule_device_bh (device);return ; };
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 20/21 xpram: per device block request queues.
In reply to Martin SchwidefskyFrom: Martin Schwidefsky <[email protected]>
The xpram driver uses a single block device queue for all of its devices so far. With recent kernels removing xpram module fails to clean up all sysfs files. The next time the xpram module is loaded you'll get warnings:
WARNING: at fs/sysfs/dir.c:463 sysfs_add_one+0x5e/0x64() sysfs: duplicate filename '35:0' can not be created Modules linked in: xpram(+) [last unloaded: xpram]
Followed by the usual WARN_ON output, followed by an error message from kobject_add_internal, followed by a badness in genhd. Allocating a block queue per device fixes this.
---
drivers/s390/block/xpram.c | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-)
drivers/s390/block/xpram.c +15 -22
@@ -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(unsireturn 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(voi 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(voi 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 )
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 21/21 Add ioctl support for EMC Symmetrix Subsystem Control I/O
In reply to Martin SchwidefskyFrom: Nigel Hislop <[email protected]>
EMC Symmetrix Subsystem Control I/O through CKD dasd requires a specific parameter list sent to the array via a Perform Subsystem Function CCW. The Symmetrix response is retrieved from the array via a Read Subsystem Data CCW.
---
arch/s390/include/asm/dasd.h | 13 +++++ drivers/s390/block/dasd_eckd.c | 98 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+)
arch/s390/include/asm/dasd.h +13 -0
@@ -3,6 +3,8 @@* Author(s)......: Holger Smolinski <[email protected]> * Bugreports.to..: <[email protected]> * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 +* EMC Symmetrix ioctl Copyright EMC Corporation, 2008 +* Author.........: Nigel Hislop <[email protected]> * * This file is the interface of the DASD device driver, which is exported to user space * any future changes wrt the API will result in a change of the APIVERSION reported
@@ -202,6 +204,16 @@ typedef struct attrib_data_t {#define DASD_SEQ_PRESTAGE 0x4#define DASD_REC_ACCESS 0x5 +/* +* Perform EMC Symmetrix I/O +*/ +typedef struct dasd_symmio_parms { +unsigned char reserved[8 ];/* compat with older releases */ +unsigned long long psf_data;/* char * cast to u64 */ +unsigned long long rssd_result;/* char * cast to u64 */ +int psf_data_len; +int rssd_result_len; +} __attribute__ ((packed))dasd_symmio_parms_t ;/******************************************************************************** * SECTION: Definition of IOCTLs
@@ -247,6 +259,7 @@ typedef struct attrib_data_t {/* Set Attributes (cache operations) */ #define BIODASDSATTR _IOW(DASD_IOCTL_LETTER,2,attrib_data_t) +#define BIODASDSYMMIO _IOWR(DASD_IOCTL_LETTER, 240, dasd_symmio_parms_t)#endif /* DASD_H */
drivers/s390/block/dasd_eckd.c +98 -0
116 lines not on this page · raw message
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
Re: [patch 21/21] Add ioctl support for EMC Symmetrix Subsystem Control I/O
drivers/s390/block/dasd_eckd.c dasd_eckd_set_attrib(struct dasd_device · line 2103
Quoted 12 lines
drivers/s390/block/dasd_eckd.c +12
-0+static int dasd_symm_io (struct dasd_device *device,void __user *argp) +{ +struct dasd_symmio_parms usrparm; +char *psf_data, *rssd_result; +struct dasd_ccw_req *cqr; +struct ccw1 *ccw; +int rc; + +/* Copy parms from caller */ + rc =copy_from_user (&usrparm, argp,sizeof (usrparm)) ? -EFAULT :0 ; +if (rc) + goto out;
That style is quite odd, what about the more normal
rc = -EFAULT; if (copy_from_user(&usrparm, argp, sizeof(usrparm))) goto out;
instead?
drivers/s390/block/dasd_eckd.c dasd_eckd_set_attrib(struct dasd_device · line 2117
Quoted 7 lines
drivers/s390/block/dasd_eckd.c +7
-0+/* alloc I/O data area */ + psf_data =kzalloc (usrparm.psf_data_len,GFP_KERNEL |GFP_DMA ); + rssd_result =kzalloc (usrparm.rssd_result_len,GFP_KERNEL |GFP_DMA ); +if (!psf_data || !rssd_result) { + rc = -ENOMEM ; + goto out_free; + }
just check each on individually and do individual unwinding. Makes the code a little more easily readable.
drivers/s390/block/dasd_eckd.c dasd_eckd_set_attrib(struct dasd_device · line 2124
Quoted 6 lines
drivers/s390/block/dasd_eckd.c +6
-0+/* get syscall header from user space */ + rc =copy_from_user (psf_data, + (void __user *)(unsigned long ) usrparm.psf_data, + usrparm.psf_data_len) ? -EFAULT :0 ; +if (rc) + goto out_free;
Same as the first copy_from_user
drivers/s390/block/dasd_eckd.c dasd_eckd_set_attrib(struct dasd_device · line 2170
Quoted 2 lines
drivers/s390/block/dasd_eckd.c +2
-0+ rc =copy_to_user ((void __user *)(unsigned long ) usrparm.rssd_result, + rssd_result, usrparm.rssd_result_len) ? -EFAULT :0 ;
And here again.
Re: [patch 21/21] Add ioctl support for EMC Symmetrix Subsystem Control I/O
Quoted 15 lines · Christoph Hellwig
drivers/s390/block/dasd_eckd.c dasd_eckd_set_attrib(struct dasd_device · line 2103
Quoted 12 lines
drivers/s390/block/dasd_eckd.c +12
-0+static int dasd_symm_io (struct dasd_device *device,void __user *argp) +{ +struct dasd_symmio_parms usrparm; +char *psf_data, *rssd_result; +struct dasd_ccw_req *cqr; +struct ccw1 *ccw; +int rc; + +/* Copy parms from caller */ + rc =copy_from_user (&usrparm, argp,sizeof (usrparm)) ? -EFAULT :0 ; +if (rc) + goto out;That style is quite odd, what about the more normal
Quoted 5 lines
rc = -EFAULT; if (copy_from_user(&usrparm, argp, sizeof(usrparm))) goto out;instead?
Ok, I will change that.
Quoted 10 lines
drivers/s390/block/dasd_eckd.c dasd_eckd_set_attrib(struct dasd_device · line 2117
Quoted 7 lines
drivers/s390/block/dasd_eckd.c +7
-0+/* alloc I/O data area */ + psf_data =kzalloc (usrparm.psf_data_len,GFP_KERNEL |GFP_DMA ); + rssd_result =kzalloc (usrparm.rssd_result_len,GFP_KERNEL |GFP_DMA ); +if (!psf_data || !rssd_result) { + rc = -ENOMEM ; + goto out_free; + }just check each on individually and do individual unwinding. Makes the code a little more easily readable.
Well, matter of taste I would say. Two kzallocs, one check for the results and just two kfrees if one of the kzallocs failed. I find this version to be a little more compact and therefore easier to read. If you insist I will change it ..
Quoted 8 lines
drivers/s390/block/dasd_eckd.c dasd_eckd_set_attrib(struct dasd_device · line 2124
Quoted 6 lines
drivers/s390/block/dasd_eckd.c +6
-0+/* get syscall header from user space */ + rc =copy_from_user (psf_data, + (void __user *)(unsigned long ) usrparm.psf_data, + usrparm.psf_data_len) ? -EFAULT :0 ; +if (rc) + goto out_free;Same as the first
copy_from_user
Ok.
Quoted 4 lines
drivers/s390/block/dasd_eckd.c dasd_eckd_set_attrib(struct dasd_device · line 2170
Quoted 2 lines
drivers/s390/block/dasd_eckd.c +2
-0+ rc =copy_to_user ((void __user *)(unsigned long ) usrparm.rssd_result, + rssd_result, usrparm.rssd_result_len) ? -EFAULT :0 ;And here again.
Ok.
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.