more s390 patches for 2.6.23-rc1
Subsystems (2)
cover more s390 patches for 2.6.23-rc1
Six additional patches for the 2.6.23-rc1 update for s390. The shortlog:
Cornelia Huck (3):
[S390] cio: Clean up messages.
[S390] cio: Make CIO_* macros safe if dbfs are not available. [S390] cio: Reorganize initialization.
Frank Munzert (1):
[S390] vmur: fix diag14_read.
Heiko Carstens (2):
[S390] Fix IRQ tracing.
[S390] Fix sclp_vt220 error handling.Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 1/6 vmur: fix diag14_read.
From: Frank Munzert <[email protected]>
Record length of spool file must be only stored in 1st SPLINK record
---
drivers/s390/char/vmur.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/s390/char/vmur.c +1 -1
@@ -486,7 +486,7 @@ static ssize_t diag14_read(struct file * }if (rc) goto fail; -if (reclen) +if (reclen && (copied ==0 ) && (*offs <PAGE_SIZE )) *((u16 *) &buf[FILE_RECLEN_OFFSET ]) = reclen; len =min (count - copied,PAGE_SIZE - res);if (copy_to_user (ubuf + copied, buf + res, len)) {
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 2/6 Fix IRQ tracing.
In reply to Martin SchwidefskyFrom: Heiko Carstens <[email protected]>
If a machine check is pending and the external or I/O interrupt handler returns to userspace io_mcck_pending is going to call s390_handle_mcck. Before this happens a call to TRACE_IRQS_ON was already made since we know that we are going back to userspace and hence interrupts will be enabled. So there was an indication that interrupts are enabled while in reality they are still disabled.s390_handle_mcck will do a local_irq_save/restore pair and confuse lockdep which later complains about inconsistent irq tracing. To solve this just call trace_hardirqs_off before calling s390_handle_mcck and trace_hardirqs_on afterwards.
---
arch/s390/kernel/entry.S | 6 ++++-- arch/s390/kernel/entry64.S | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-)
arch/s390/kernel/entry64.S +4 -2
@@ -611,8 +611,10 @@ io_work_loop: # _TIF_MCCK_PENDING is set, call handler # io_mcck_pending: - larl %r14,io_work_loop - jg s390_handle_mcck # TIF bit will be cleared by handler + TRACE_IRQS_OFF + brasl %r14,s390_handle_mcck # TIF bit will be cleared by handler + TRACE_IRQS_ON + j io_work_loop # # _TIF_NEED_RESCHED is set, call schedule
arch/s390/kernel/entry.S +4 -2
@@ -624,9 +624,11 @@ io_work_loop: # _TIF_MCCK_PENDING is set, call handler # io_mcck_pending: + TRACE_IRQS_OFF l %r1,BASED(.Ls390_handle_mcck) - la %r14,BASED(io_work_loop) - br %r1 # TIF bit will be cleared by handler + basr %r14,%r1 # TIF bit will be cleared by handler + TRACE_IRQS_ON + b BASED(io_work_loop) # # _TIF_NEED_RESCHED is set, call schedule
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 3/6 cio: Clean up messages.
In reply to Martin SchwidefskyFrom: Cornelia Huck <[email protected]>
- Remove unneeded messages.
- Move some messages into the debug feature.
- Use dev_* where appropriate.
- Use "cio: " prefix consistently.
---
drivers/s390/cio/blacklist.c | 19 +++++-------- drivers/s390/cio/ccwgroup.c | 3 -- drivers/s390/cio/chp.c | 19 ++----------- drivers/s390/cio/chsc.c | 16 +++++------ drivers/s390/cio/cio.c | 13 ++++----- drivers/s390/cio/cmf.c | 16 +++++------ drivers/s390/cio/css.c | 11 +++---- drivers/s390/cio/device.c | 60 ++++++++++++++++++++++++++---------------- drivers/s390/cio/device_fsm.c | 20 +++++++------- 9 files changed, 87 insertions(+), 90 deletions(-)
drivers/s390/cio/blacklist.c +8 -11
@@ -51,7 +51,7 @@ blacklist_range (range_action action, un to = from;if (from > to || to > __MAX_SUBCHANNEL || ssid > __MAX_SSID) { -printk (KERN_WARNING "Invalid blacklist range " +printk (KERN_WARNING "cio: Invalid blacklist range " "0.%x.%04x to 0.%x.%04x, skipping\n" , ssid, from, ssid, to);return ;
@@ -119,7 +119,7 @@ blacklist_busid(char **str, int *id0, inreturn 0 ; confused:strsep (str,",\n" ); -printk (KERN_WARNING "Invalid cio_ignore parameter '%s'\n" , sav); +printk (KERN_WARNING "cio: Invalid cio_ignore parameter '%s'\n" , sav);return 1 ; }
@@ -166,22 +166,19 @@ blacklist_parse_parameters (char *str, rcontinue ; }if (*str =='-' ) { -printk (KERN_WARNING "invalid cio_ignore " +printk (KERN_WARNING "cio: invalid cio_ignore " "parameter '%s'\n" ,strsep (&str,",\n" ));continue ; }if ((from_id0 != to_id0) || (from_ssid != to_ssid)) { -printk (KERN_WARNING "invalid cio_ignore range " -"%x.%x.%04x-%x.%x.%04x\n" , - from_id0, from_ssid, from, - to_id0, to_ssid, to); +printk (KERN_WARNING "cio: invalid cio_ignore " +"range %x.%x.%04x-%x.%x.%04x\n" , + from_id0, from_ssid, from, + to_id0, to_ssid, to);continue ; } -pr_debug ("blacklist_setup: adding range " -"from %x.%x.%04x to %x.%x.%04x\n" , - from_id0, from_ssid, from, to_id0, to_ssid, to);blacklist_range (ra, from, to, to_ssid); } }
@@ -239,7 +236,7 @@ blacklist_parse_proc_parameters (char *b*/ blacklist_parse_parameters (buf +4 , add); }else { -printk (KERN_WARNING "cio_ignore: Parse error; \n" +printk (KERN_WARNING "cio: cio_ignore: Parse error; \n" KERN_WARNING "try using 'free all|<devno-range>," "<devno-range>,...'\n" KERN_WARNING "or 'add <devno-range>,"
drivers/s390/cio/ccwgroup.c +0 -3
@@ -359,7 +359,6 @@ ccwgroup_probe (struct device *dev)if ((ret =device_create_file (dev, &dev_attr_online)))return ret; -pr_debug ("%s: device %s\n" , __func__, gdev->dev.bus_id); ret = gdrv->probe ? gdrv->probe (gdev) : -ENODEV ;if (ret)device_remove_file (dev, &dev_attr_online);
@@ -376,8 +375,6 @@ ccwgroup_remove (struct device *dev) gdev =to_ccwgroupdev (dev); gdrv =to_ccwgroupdrv (dev->driver); -pr_debug ("%s: device %s\n" , __func__, gdev->dev.bus_id); -device_remove_file (dev, &dev_attr_online);if (gdrv && gdrv->remove)
drivers/s390/cio/chp.c +3 -16
@@ -121,14 +121,8 @@ static int s390_vary_chpid(struct chp_idCIO_TRACE_EVENT (2 , dbf_text); status =chp_get_status (chpid); -if (status <0 ) { -printk (KERN_ERR "Can't vary unknown chpid %x.%02x\n" , - chpid.cssid, chpid.id); -return -EINVAL ; - } -if (!on && !status) { -printk (KERN_ERR "chpid %x.%02x is already offline\n" , +printk (KERN_ERR "cio: chpid %x.%02x is already offline\n" , chpid.cssid, chpid.id);return -EINVAL ; }
@@ -421,21 +415,14 @@ int chp_new(struct chp_id chpid)if (ret) goto out_free; }else { -static int msg_done; - -if (!msg_done) { -printk (KERN_WARNING "cio: Channel measurements not " -"available, continuing.\n" ); - msg_done =1 ; - } chp->cmg =-1 ; }/* make it known to the system */ ret =device_register (&chp->dev);if (ret) { -printk (KERN_WARNING "%s: could not register %x.%02x\n" , - __func__, chpid.cssid, chpid.id); +CIO_MSG_EVENT (0 ,"Could not register chp%x.%02x: %d\n" , + chpid.cssid, chpid.id, ret); goto out_free; } ret =sysfs_create_group (&chp->dev.kobj, &chp_attr_group);
drivers/s390/cio/chsc.c +8 -8
@@ -995,8 +995,8 @@ chsc_alloc_sei_area(void) { sei_page = (void *)get_zeroed_page (GFP_KERNEL |GFP_DMA );if (!sei_page) -printk (KERN_WARNING "Can't allocate page for processing of " \ -"chsc machine checks!\n" ); +CIO_MSG_EVENT (0 ,"Can't allocate page for processing of " +"chsc machine checks!\n" );return (sei_page ?0 : -ENOMEM ); }
@@ -1073,8 +1073,8 @@ chsc_determine_css_characteristics(void) scsc_area = (void *)get_zeroed_page (GFP_KERNEL |GFP_DMA );if (!scsc_area) { -printk (KERN_WARNING "cio: Was not able to determine available" \ -"CHSCs due to no memory.\n" ); +CIO_MSG_EVENT (0 ,"Was not able to determine available" +"CHSCs due to no memory.\n" );return -ENOMEM ; }
@@ -1083,15 +1083,15 @@ chsc_determine_css_characteristics(void) result =chsc (scsc_area);if (result) { -printk (KERN_WARNING "cio: Was not able to determine " \ -"available CHSCs, cc=%i.\n" , result); +CIO_MSG_EVENT (0 ,"Was not able to determine available CHSCs, " +"cc=%i.\n" , result); result = -EIO ; goto exit; }if (scsc_area->response.code !=1 ) { -printk (KERN_WARNING "cio: Was not able to determine " \ -"available CHSCs.\n" ); +CIO_MSG_EVENT (0 ,"Was not able to determine " +"available CHSCs.\n" ); result = -EIO ; goto exit; }
drivers/s390/cio/cio.c +6 -7
@@ -47,8 +47,8 @@ cio_setup (char *parm)else if (!strcmp (parm,"no" )) cio_show_msg =0 ;else -printk (KERN_ERR "cio_setup : invalid cio_msg parameter '%s'" , - parm); +printk (KERN_ERR "cio: cio_setup: " +"invalid cio_msg parameter '%s'" , parm);return 1 ; }
@@ -80,7 +80,6 @@ cio_debug_init (void) goto out_unregister;debug_register_view (cio_debug_crw_id, &debug_sprintf_view);debug_set_level (cio_debug_crw_id,2 ); -pr_debug ("debugging initialized\n" );return 0 ; out_unregister:
@@ -90,7 +89,7 @@ out_unregister:debug_unregister (cio_debug_trace_id);if (cio_debug_crw_id)debug_unregister (cio_debug_crw_id); -pr_debug ("could not initialize debugging\n" ); +printk (KERN_WARNING "cio: could not initialize debugging\n" );return -1 ; }
@@ -568,7 +567,7 @@ cio_validate_subchannel (struct subchann*/ if (sch->st !=0 ) {CIO_DEBUG (KERN_INFO ,0 , -"Subchannel 0.%x.%04x reports " +"cio: Subchannel 0.%x.%04x reports " "non-I/O subchannel type %04X\n" , sch->schid.ssid, sch->schid.sch_no, sch->st);/* We stop here for non-io subchannels. */
@@ -601,7 +600,7 @@ cio_validate_subchannel (struct subchann sch->lpm = sch->schib.pmcw.pam & sch->opm; CIO_DEBUG(KERN_INFO, 0, - "Detected device %04x on subchannel 0.%x.%04X" + "cio: Detected device %04x on subchannel 0.%x.%04X" " - PIM = %02X, PAM = %02X, POM = %02X\n", sch->schib.pmcw.dev, sch->schid.ssid, sch->schid.sch_no, sch->schib.pmcw.pim,
@@ -766,7 +765,7 @@ cio_get_console_sch_no(void)/* unlike in 2.4, we cannot autoprobe here, since * the channel subsystem is not fully initialized. * With some luck, the HWC console can take over */ -printk (KERN_WARNING "No ccw console found!\n" ); +printk (KERN_WARNING "cio: No ccw console found!\n" );return -1 ; }return console_irq;
drivers/s390/cio/cmf.c +8 -8
@@ -1185,12 +1185,12 @@ static ssize_t cmb_enable_store(struct dcase '0' : ret =disable_cmf (cdev);if (ret) -printk (KERN_INFO "disable_cmf failed (%d)\n" , ret); +dev_info (&cdev->dev,"disable_cmf failed (%d)\n" , ret);break ;case '1' : ret =enable_cmf (cdev);if (ret && ret != -EBUSY ) -printk (KERN_INFO "enable_cmf failed (%d)\n" , ret); +dev_info (&cdev->dev,"enable_cmf failed (%d)\n" , ret);break ; }
@@ -1280,10 +1280,10 @@ init_cmf(void) format_string ="basic" ; cmbops = &cmbops_basic;if (cmb_area.num_channels >4096 || cmb_area.num_channels <1 ) { -printk (KERN_ERR "Basic channel measurement facility" -" can only use 1 to 4096 devices\n" +printk (KERN_ERR "cio: Basic channel measurement " +"facility can only use 1 to 4096 devices\n" KERN_ERR "when the cmf driver is built" -" as a loadable module\n" ); +" as a loadable module\n" );return 1 ; }break ;
@@ -1292,13 +1292,13 @@ init_cmf(void) cmbops = &cmbops_extended;break ;default : -printk (KERN_ERR "Invalid format %d for channel " +printk (KERN_ERR "cio: Invalid format %d for channel " "measurement facility\n" , format);return 1 ; } -printk (KERN_INFO "Channel measurement facility using %s format (%s)\n" , - format_string, detect_string); +printk (KERN_INFO "cio: Channel measurement facility using %s " +"format (%s)\n" , format_string, detect_string);return 0 ; }
drivers/s390/cio/css.c +5 -6
@@ -184,8 +184,8 @@ static int css_register_subchannel(struc/* make it known to the system */ ret =css_sch_device_register (sch);if (ret) { -printk (KERN_WARNING "%s: could not register %s\n" , - __func__, sch->dev.bus_id); +CIO_MSG_EVENT (0 ,"Could not register sch 0.%x.%04x: %d\n" , + sch->schid.ssid, sch->schid.sch_no, ret);return ret; }return ret;
@@ -371,8 +371,7 @@ static int __init slow_subchannel_init(vspin_lock_init (&slow_subchannel_lock); slow_subchannel_set =idset_sch_new ();if (!slow_subchannel_set) { -printk (KERN_WARNING "cio: could not allocate slow subchannel " -"set\n" ); +CIO_MSG_EVENT (0 ,"could not allocate slow subchannel set\n" );return -ENOMEM ; }return 0 ;
@@ -425,8 +424,8 @@ static int reprobe_subchannel(struct substruct subchannel *sch;int ret; -CIO_DEBUG (KERN_INFO ,6 ,"cio: reprobe 0.%x.%04x\n" , - schid.ssid, schid.sch_no); +CIO_MSG_EVENT (6 ,"cio: reprobe 0.%x.%04x\n" , + schid.ssid, schid.sch_no);if (need_reprobe)return -EAGAIN ;
drivers/s390/cio/device.c +38 -22
126 lines not on this page · raw message
drivers/s390/cio/device_fsm.c +11 -9
@@ -268,7 +268,7 @@ ccw_device_recog_done(struct ccw_deviceswitch (state) {case DEV_STATE_NOT_OPER :CIO_DEBUG (KERN_WARNING ,2 , -"SenseID : unknown device %04x on subchannel " +"cio: SenseID : unknown device %04x on subchannel " "0.%x.%04x\n" , cdev->private->dev_id.devno, sch->schid.ssid, sch->schid.sch_no);break ;
@@ -293,7 +293,8 @@ ccw_device_recog_done(struct ccw_devicereturn ; }/* Issue device info message. */ - CIO_DEBUG(KERN_INFO, 2, "SenseID : device 0.%x.%04x reports: " + CIO_DEBUG(KERN_INFO, 2, + "cio: SenseID : device 0.%x.%04x reports: " "CU Type/Mod = %04X/%02X, Dev Type/Mod = " "%04X/%02X\n", cdev->private->dev_id.ssid,
@@ -303,7 +304,7 @@ ccw_device_recog_done(struct ccw_devicebreak ;case DEV_STATE_BOXED :CIO_DEBUG (KERN_WARNING ,2 , -"SenseID : boxed device %04x on subchannel " +"cio: SenseID : boxed device %04x on subchannel " "0.%x.%04x\n" , cdev->private->dev_id.devno, sch->schid.ssid, sch->schid.sch_no);break ;
@@ -388,7 +389,7 @@ ccw_device_done(struct ccw_device *cdev,if (state ==DEV_STATE_BOXED )CIO_DEBUG (KERN_WARNING ,2 , -"Boxed device %04x on subchannel %04x\n" , +"cio: Boxed device %04x on subchannel %04x\n" , cdev->private->dev_id.devno, sch->schid.sch_no);if (cdev->private->flags.donotify) {
@@ -946,9 +947,10 @@ ccw_device_w4sense(struct ccw_device *cd/* Basic sense hasn't started. Try again. */ ccw_device_do_sense (cdev, irb); else { -printk (KERN_INFO "Huh? %s(%s): unsolicited " -"interrupt...\n" , - __FUNCTION__, cdev->dev.bus_id); +CIO_MSG_EVENT (2 ,"Huh? 0.%x.%04x: unsolicited " +"interrupt during w4sense...\n" , + cdev->private->dev_id.ssid, + cdev->private->dev_id.devno);if (cdev->handler) cdev->handler (cdev,0 , irb); }
@@ -1215,8 +1217,8 @@ ccw_device_nop(struct ccw_device *cdev,static void ccw_device_bug (struct ccw_device *cdev,enum dev_event dev_event) { -printk (KERN_EMERG "dev_jumptable[%i][%i] == NULL\n" , - cdev->private->state, dev_event); +CIO_MSG_EVENT (0 ,"dev_jumptable[%i][%i] == NULL\n" , + cdev->private->state, dev_event);BUG (); }
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 4/6 cio: Make CIO_* macros safe if dbfs are not available.
In reply to Martin SchwidefskyFrom: Cornelia Huck <[email protected]>
---
drivers/s390/cio/cio_debug.h | 2 ++ 1 file changed, 2 insertions(+)
drivers/s390/cio/cio_debug.h +2 -0
@@ -23,6 +23,8 @@ extern debug_info_t *cio_debug_crw_id;static inline void CIO_HEX_EVENT (int level,void *data,int length) { +if (unlikely (!cio_debug_trace_id)) +return ;while (length >0 ) {debug_event (cio_debug_trace_id, level, data, length); length -= cio_debug_trace_id->buf_size;
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 5/6 cio: Reorganize initialization.
In reply to Martin SchwidefskyFrom: Cornelia Huck <[email protected]>
- Localize more of the init calls in init_channel_subsystem().
- Print a warning if init_channel_subsystem() failed.
---
drivers/s390/cio/chsc.c | 10 ++++++---- drivers/s390/cio/chsc.h | 2 ++ drivers/s390/cio/css.c | 19 ++++++++++++++++--- 3 files changed, 24 insertions(+), 7 deletions(-)
drivers/s390/cio/chsc.c +6 -4
@@ -990,8 +990,7 @@ out:return ret; } -static int __init -chsc_alloc_sei_area (void ) +int __init chsc_alloc_sei_area (void ) { sei_page = (void *)get_zeroed_page (GFP_KERNEL |GFP_DMA );if (!sei_page)
@@ -1000,6 +999,11 @@ chsc_alloc_sei_area(void)return (sei_page ?0 : -ENOMEM ); } +void __init chsc_free_sei_area (void ) +{ +kfree (sei_page); +} +int __init chsc_enable_facility (int operation_code) {
@@ -1051,8 +1055,6 @@ chsc_enable_facility(int operation_code)return ret; } -subsys_initcall (chsc_alloc_sei_area); -struct css_general_char css_general_characteristics;struct css_chsc_char css_chsc_characteristics;
drivers/s390/cio/chsc.h +2 -0
@@ -79,6 +79,8 @@ extern int chsc_get_ssd_info(struct subc struct chsc_ssd_info *ssd);extern int chsc_determine_css_characteristics (void );extern int css_characteristics_avail; +extern int chsc_alloc_sei_area (void ); +extern void chsc_free_sei_area (void );extern int chsc_enable_facility (int );struct channel_subsystem ;
drivers/s390/cio/css.c +16 -3
@@ -377,8 +377,6 @@ static int __init slow_subchannel_init(vreturn 0 ; } -subsys_initcall (slow_subchannel_init); -static void css_slow_path_func (struct work_struct *unused) {struct subchannel_id schid;
@@ -641,9 +639,20 @@ init_channel_subsystem (void) {int ret, i; -if (chsc_determine_css_characteristics () ==0 ) + ret =chsc_determine_css_characteristics (); +if (ret == -ENOMEM ) + goto out;/* No need to continue. */ +if (ret ==0 ) css_characteristics_avail =1 ; + ret =chsc_alloc_sei_area (); +if (ret) + goto out; + + ret =slow_subchannel_init (); +if (ret) + goto out; +if ((ret =bus_register (&css_bus_type))) goto out;
@@ -709,6 +718,10 @@ out_unregister: out_bus:bus_unregister (&css_bus_type); out: +chsc_free_sei_area (); +kfree (slow_subchannel_set); +printk (KERN_WARNING "cio: failed to initialize css driver (%d)!\n" , + ret);return ret; }
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
PATCH 6/6 Fix sclp_vt220 error handling.
In reply to Martin SchwidefskyFrom: Heiko Carstens <[email protected]>
Also convert to slab_is_available() as an indicator if get_zeroed_page() will work or not.
---
drivers/s390/char/sclp_vt220.c | 61 ++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 21 deletions(-)
drivers/s390/char/sclp_vt220.c +40 -21
@@ -621,10 +621,24 @@ sclp_vt220_flush_buffer(struct tty_struc/* * Initialize all relevant components and register driver with system. */ -static int __init_refok __sclp_vt220_init(int early) +static void __init __sclp_vt220_cleanup (void ) +{ +struct list_head *page, *p; + +list_for_each_safe (page, p, &sclp_vt220_empty) { +list_del (page); +if (slab_is_available ()) +free_page ((unsigned long ) page); +else +free_bootmem ((unsigned long ) page,PAGE_SIZE ); + } +} + +static int __init __sclp_vt220_init (void ) {void *page;int i; +int num_pages;if (sclp_vt220_initialized)return 0 ;
@@ -641,13 +655,16 @@ static int __init_refok __sclp_vt220_ini sclp_vt220_flush_later =0 ;/* Allocate pages for output buffering */ -for (i =0 ; i < (early ?MAX_CONSOLE_PAGES :MAX_KMEM_PAGES ); i++) { -if (early) - page =alloc_bootmem_low_pages (PAGE_SIZE ); -else + num_pages =slab_is_available () ?MAX_KMEM_PAGES :MAX_CONSOLE_PAGES ; +for (i =0 ; i < num_pages; i++) { +if (slab_is_available ()) page = (void *)get_zeroed_page (GFP_KERNEL |GFP_DMA ); -if (!page) +else + page =alloc_bootmem_low_pages (PAGE_SIZE ); +if (!page) { +__sclp_vt220_cleanup ();return -ENOMEM ; + }list_add_tail ((struct list_head *) page, &sclp_vt220_empty); }return 0 ;
@@ -661,14 +678,13 @@ static const struct tty_operations sclp_ .flush_chars = sclp_vt220_flush_chars, .write_room = sclp_vt220_write_room, .chars_in_buffer = sclp_vt220_chars_in_buffer, - .flush_buffer = sclp_vt220_flush_buffer + .flush_buffer = sclp_vt220_flush_buffer, };/* * Register driver with SCLP and Linux and initialize internal tty structures. */ -static int __init -sclp_vt220_tty_init (void ) +static int __init sclp_vt220_tty_init (void ) {struct tty_driver *driver;int rc;
@@ -678,18 +694,15 @@ sclp_vt220_tty_init(void) driver =alloc_tty_driver (1 );if (!driver)return -ENOMEM ; - rc =__sclp_vt220_init (0 ); -if (rc) { -put_tty_driver (driver); -return rc; - } + rc =__sclp_vt220_init (); +if (rc) + goto out_driver; rc =sclp_register (&sclp_vt220_register);if (rc) { printk(KERN_ERR SCLP_VT220_PRINT_HEADER"could not register tty - " "sclp_register returned %d\n", rc); -put_tty_driver (driver); -return rc; + goto out_init; } driver->owner =THIS_MODULE ;
@@ -708,14 +721,20 @@ sclp_vt220_tty_init(void) printk(KERN_ERR SCLP_VT220_PRINT_HEADER"could not register tty - " "tty_register_driver returned %d\n", rc); -put_tty_driver (driver); -return rc; + goto out_sclp; } sclp_vt220_driver = driver;return 0 ; -} -module_init (sclp_vt220_tty_init); +out_sclp: +sclp_unregister (&sclp_vt220_register); +out_init: +__sclp_vt220_cleanup (); +out_driver: +put_tty_driver (driver); +return rc; +} +__initcall (sclp_vt220_tty_init);#ifdef CONFIG_SCLP_VT220_CONSOLE
@@ -761,7 +780,7 @@ sclp_vt220_con_init(void)if (!CONSOLE_IS_SCLP )return 0 ; - rc =__sclp_vt220_init (1 ); + rc =__sclp_vt220_init ();if (rc)return rc;/* Attach linux console */
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.