Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6

* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6:
[S390] sclp_vt220 build fix
[S390] cio: change misleading console logic
[S390] call home support: fix proc handler
[S390] dasd: use idal for device characteristics
[S390] Add highgprs facility to /proc/cpuinfo
[S390] dasd: fix locking bug
[S390] tape390: Fix request queue handling in block driver
[S390] hypfs: Use subcode 6 if subcode 7 is not available

+43 -32
+1 -1
arch/s390/hypfs/hypfs_diag.c
··· 438 } 439 if (diag204((unsigned long)SUBC_STIB6 | 440 (unsigned long)INFO_EXT, pages, buf) >= 0) { 441 - diag204_store_sc = SUBC_STIB7; 442 diag204_info_type = INFO_EXT; 443 goto out; 444 }
··· 438 } 439 if (diag204((unsigned long)SUBC_STIB6 | 440 (unsigned long)INFO_EXT, pages, buf) >= 0) { 441 + diag204_store_sc = SUBC_STIB6; 442 diag204_info_type = INFO_EXT; 443 goto out; 444 }
+3 -3
arch/s390/kernel/processor.c
··· 31 32 static int show_cpuinfo(struct seq_file *m, void *v) 33 { 34 - static const char *hwcap_str[9] = { 35 "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp", 36 - "edat", "etf3eh" 37 }; 38 struct _lowcore *lc; 39 unsigned long n = (unsigned long) v - 1; ··· 48 num_online_cpus(), loops_per_jiffy/(500000/HZ), 49 (loops_per_jiffy/(5000/HZ))%100); 50 seq_puts(m, "features\t: "); 51 - for (i = 0; i < 9; i++) 52 if (hwcap_str[i] && (elf_hwcap & (1UL << i))) 53 seq_printf(m, "%s ", hwcap_str[i]); 54 seq_puts(m, "\n");
··· 31 32 static int show_cpuinfo(struct seq_file *m, void *v) 33 { 34 + static const char *hwcap_str[10] = { 35 "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp", 36 + "edat", "etf3eh", "highgprs" 37 }; 38 struct _lowcore *lc; 39 unsigned long n = (unsigned long) v - 1; ··· 48 num_online_cpus(), loops_per_jiffy/(500000/HZ), 49 (loops_per_jiffy/(5000/HZ))%100); 50 seq_puts(m, "features\t: "); 51 + for (i = 0; i < 10; i++) 52 if (hwcap_str[i] && (elf_hwcap & (1UL << i))) 53 seq_printf(m, "%s ", hwcap_str[i]); 54 seq_puts(m, "\n");
+11 -2
drivers/s390/block/dasd.c
··· 2533 { 2534 struct dasd_ccw_req *cqr; 2535 struct ccw1 *ccw; 2536 2537 cqr = dasd_smalloc_request(magic, 1 /* RDC */, rdc_buffer_size, device); 2538 ··· 2547 2548 ccw = cqr->cpaddr; 2549 ccw->cmd_code = CCW_CMD_RDC; 2550 - ccw->cda = (__u32)(addr_t)rdc_buffer; 2551 - ccw->count = rdc_buffer_size; 2552 2553 cqr->startdev = device; 2554 cqr->memdev = device; 2555 cqr->expires = 10*HZ;
··· 2533 { 2534 struct dasd_ccw_req *cqr; 2535 struct ccw1 *ccw; 2536 + unsigned long *idaw; 2537 2538 cqr = dasd_smalloc_request(magic, 1 /* RDC */, rdc_buffer_size, device); 2539 ··· 2546 2547 ccw = cqr->cpaddr; 2548 ccw->cmd_code = CCW_CMD_RDC; 2549 + if (idal_is_needed(rdc_buffer, rdc_buffer_size)) { 2550 + idaw = (unsigned long *) (cqr->data); 2551 + ccw->cda = (__u32)(addr_t) idaw; 2552 + ccw->flags = CCW_FLAG_IDA; 2553 + idaw = idal_create_words(idaw, rdc_buffer, rdc_buffer_size); 2554 + } else { 2555 + ccw->cda = (__u32)(addr_t) rdc_buffer; 2556 + ccw->flags = 0; 2557 + } 2558 2559 + ccw->count = rdc_buffer_size; 2560 cqr->startdev = device; 2561 cqr->memdev = device; 2562 cqr->expires = 10*HZ;
+5 -3
drivers/s390/block/dasd_eckd.c
··· 3216 struct dasd_eckd_characteristics temp_rdc_data; 3217 int is_known, rc; 3218 struct dasd_uid temp_uid; 3219 3220 private = (struct dasd_eckd_private *) device->private; 3221 ··· 3229 rc = dasd_eckd_generate_uid(device, &private->uid); 3230 dasd_get_uid(device->cdev, &temp_uid); 3231 if (memcmp(&private->uid, &temp_uid, sizeof(struct dasd_uid)) != 0) 3232 - dev_err(&device->cdev->dev, "The UID of the DASD has changed\n"); 3233 if (rc) 3234 goto out_err; 3235 dasd_set_uid(device->cdev, &private->uid); ··· 3258 "device: %s", rc, dev_name(&device->cdev->dev)); 3259 goto out_err; 3260 } 3261 - spin_lock(get_ccwdev_lock(device->cdev)); 3262 memcpy(&private->rdc_data, &temp_rdc_data, sizeof(temp_rdc_data)); 3263 - spin_unlock(get_ccwdev_lock(device->cdev)); 3264 3265 /* add device to alias management */ 3266 dasd_alias_add_device(device);
··· 3216 struct dasd_eckd_characteristics temp_rdc_data; 3217 int is_known, rc; 3218 struct dasd_uid temp_uid; 3219 + unsigned long flags; 3220 3221 private = (struct dasd_eckd_private *) device->private; 3222 ··· 3228 rc = dasd_eckd_generate_uid(device, &private->uid); 3229 dasd_get_uid(device->cdev, &temp_uid); 3230 if (memcmp(&private->uid, &temp_uid, sizeof(struct dasd_uid)) != 0) 3231 + dev_err(&device->cdev->dev, "The UID of the DASD has " 3232 + "changed\n"); 3233 if (rc) 3234 goto out_err; 3235 dasd_set_uid(device->cdev, &private->uid); ··· 3256 "device: %s", rc, dev_name(&device->cdev->dev)); 3257 goto out_err; 3258 } 3259 + spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); 3260 memcpy(&private->rdc_data, &temp_rdc_data, sizeof(temp_rdc_data)); 3261 + spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); 3262 3263 /* add device to alias management */ 3264 dasd_alias_add_device(device);
+2 -2
drivers/s390/char/sclp_async.c
··· 62 .priority = INT_MAX, 63 }; 64 65 - static int proc_handler_callhome(ctl_table *ctl, int write, struct file *filp, 66 void __user *buffer, size_t *count, 67 loff_t *ppos) 68 { ··· 100 { 101 .procname = "callhome", 102 .mode = 0644, 103 - .proc_handler = &proc_handler_callhome, 104 }, 105 { .ctl_name = 0 } 106 };
··· 62 .priority = INT_MAX, 63 }; 64 65 + static int proc_handler_callhome(struct ctl_table *ctl, int write, 66 void __user *buffer, size_t *count, 67 loff_t *ppos) 68 { ··· 100 { 101 .procname = "callhome", 102 .mode = 0644, 103 + .proc_handler = proc_handler_callhome, 104 }, 105 { .ctl_name = 0 } 106 };
+15 -15
drivers/s390/char/sclp_vt220.c
··· 705 } 706 __initcall(sclp_vt220_tty_init); 707 708 - #ifdef CONFIG_SCLP_VT220_CONSOLE 709 - 710 - static void 711 - sclp_vt220_con_write(struct console *con, const char *buf, unsigned int count) 712 - { 713 - __sclp_vt220_write((const unsigned char *) buf, count, 1, 1, 0); 714 - } 715 - 716 - static struct tty_driver * 717 - sclp_vt220_con_device(struct console *c, int *index) 718 - { 719 - *index = 0; 720 - return sclp_vt220_driver; 721 - } 722 - 723 static void __sclp_vt220_flush_buffer(void) 724 { 725 unsigned long flags; ··· 759 sclp_vt220_resume(); 760 break; 761 } 762 } 763 764 static int
··· 705 } 706 __initcall(sclp_vt220_tty_init); 707 708 static void __sclp_vt220_flush_buffer(void) 709 { 710 unsigned long flags; ··· 774 sclp_vt220_resume(); 775 break; 776 } 777 + } 778 + 779 + #ifdef CONFIG_SCLP_VT220_CONSOLE 780 + 781 + static void 782 + sclp_vt220_con_write(struct console *con, const char *buf, unsigned int count) 783 + { 784 + __sclp_vt220_write((const unsigned char *) buf, count, 1, 1, 0); 785 + } 786 + 787 + static struct tty_driver * 788 + sclp_vt220_con_device(struct console *c, int *index) 789 + { 790 + *index = 0; 791 + return sclp_vt220_driver; 792 } 793 794 static int
+2 -1
drivers/s390/char/tape_block.c
··· 162 spin_lock_irq(&device->blk_data.request_queue_lock); 163 while ( 164 !blk_queue_plugged(queue) && 165 - (req = blk_fetch_request(queue)) && 166 nr_queued < TAPEBLOCK_MIN_REQUEUE 167 ) { 168 if (rq_data_dir(req) == WRITE) { 169 DBF_EVENT(1, "TBLOCK: Rejecting write request\n"); 170 spin_unlock_irq(&device->blk_data.request_queue_lock);
··· 162 spin_lock_irq(&device->blk_data.request_queue_lock); 163 while ( 164 !blk_queue_plugged(queue) && 165 + blk_peek_request(queue) && 166 nr_queued < TAPEBLOCK_MIN_REQUEUE 167 ) { 168 + req = blk_fetch_request(queue); 169 if (rq_data_dir(req) == WRITE) { 170 DBF_EVENT(1, "TBLOCK: Rejecting write request\n"); 171 spin_unlock_irq(&device->blk_data.request_queue_lock);
+4 -5
drivers/s390/cio/device.c
··· 1250 unsigned long flags; 1251 struct ccw_dev_id dev_id; 1252 1253 - cdev = sch_get_cdev(sch); 1254 - if (cdev) { 1255 rc = sysfs_create_group(&sch->dev.kobj, 1256 &io_subchannel_attr_group); 1257 if (rc) ··· 1259 "0.%x.%04x (rc=%d)\n", 1260 sch->schid.ssid, sch->schid.sch_no, rc); 1261 /* 1262 - * This subchannel already has an associated ccw_device. 1263 * Throw the delayed uevent for the subchannel, register 1264 - * the ccw_device and exit. This happens for all early 1265 - * devices, e.g. the console. 1266 */ 1267 dev_set_uevent_suppress(&sch->dev, 0); 1268 kobject_uevent(&sch->dev.kobj, KOBJ_ADD); 1269 cdev->dev.groups = ccwdev_attr_groups; 1270 device_initialize(&cdev->dev); 1271 ccw_device_register(cdev);
··· 1250 unsigned long flags; 1251 struct ccw_dev_id dev_id; 1252 1253 + if (cio_is_console(sch->schid)) { 1254 rc = sysfs_create_group(&sch->dev.kobj, 1255 &io_subchannel_attr_group); 1256 if (rc) ··· 1260 "0.%x.%04x (rc=%d)\n", 1261 sch->schid.ssid, sch->schid.sch_no, rc); 1262 /* 1263 + * The console subchannel already has an associated ccw_device. 1264 * Throw the delayed uevent for the subchannel, register 1265 + * the ccw_device and exit. 1266 */ 1267 dev_set_uevent_suppress(&sch->dev, 0); 1268 kobject_uevent(&sch->dev.kobj, KOBJ_ADD); 1269 + cdev = sch_get_cdev(sch); 1270 cdev->dev.groups = ccwdev_attr_groups; 1271 device_initialize(&cdev->dev); 1272 ccw_device_register(cdev);