mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 updates from Martin Schwidefsky:
"The new features and main improvements in this merge for v4.9
- Support for the UBSAN sanitizer
- Set HAVE_EFFICIENT_UNALIGNED_ACCESS, it improves the code in some
places
- Improvements for the in-kernel fpu code, in particular the overhead
for multiple consecutive in kernel fpu users is recuded
- Add a SIMD implementation for the RAID6 gen and xor operations
- Add RAID6 recovery based on the XC instruction
- The PCI DMA flush logic has been improved to increase the speed of
the map / unmap operations
- The time synchronization code has seen some updates
And bug fixes all over the place"
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (48 commits)
s390/con3270: fix insufficient space padding
s390/con3270: fix use of uninitialised data
MAINTAINERS: update DASD maintainer
s390/cio: fix accidental interrupt enabling during resume
s390/dasd: add missing \n to end of dev_err messages
s390/config: Enable config options for Docker
s390/dasd: make query host access interruptible
s390/dasd: fix panic during offline processing
s390/dasd: fix hanging offline processing
s390/pci_dma: improve lazy flush for unmap
s390/pci_dma: split dma_update_trans
s390/pci_dma: improve map_sg
s390/pci_dma: simplify dma address calculation
s390/pci_dma: remove dma address range check
iommu/s390: simplify registration of I/O address translation parameters
s390: migrate exception table users off module.h and onto extable.h
s390: export header for CLP ioctl
s390/vmur: fix irq pointer dereference in int handler
s390/dasd: add missing KOBJ_CHANGE event for unformatted devices
s390: enable UBSAN
...
This commit is contained in:
commit
e46cae4418
66 changed files with 1535 additions and 1368 deletions
|
|
@ -212,16 +212,6 @@ static int dasd_state_known_to_new(struct dasd_device *device)
|
|||
{
|
||||
/* Disable extended error reporting for this device. */
|
||||
dasd_eer_disable(device);
|
||||
/* Forget the discipline information. */
|
||||
if (device->discipline) {
|
||||
if (device->discipline->uncheck_device)
|
||||
device->discipline->uncheck_device(device);
|
||||
module_put(device->discipline->owner);
|
||||
}
|
||||
device->discipline = NULL;
|
||||
if (device->base_discipline)
|
||||
module_put(device->base_discipline->owner);
|
||||
device->base_discipline = NULL;
|
||||
device->state = DASD_STATE_NEW;
|
||||
|
||||
if (device->block)
|
||||
|
|
@ -336,6 +326,7 @@ static int dasd_state_basic_to_ready(struct dasd_device *device)
|
|||
{
|
||||
int rc;
|
||||
struct dasd_block *block;
|
||||
struct gendisk *disk;
|
||||
|
||||
rc = 0;
|
||||
block = device->block;
|
||||
|
|
@ -346,6 +337,9 @@ static int dasd_state_basic_to_ready(struct dasd_device *device)
|
|||
if (rc) {
|
||||
if (rc != -EAGAIN) {
|
||||
device->state = DASD_STATE_UNFMT;
|
||||
disk = device->block->gdp;
|
||||
kobject_uevent(&disk_to_dev(disk)->kobj,
|
||||
KOBJ_CHANGE);
|
||||
goto out;
|
||||
}
|
||||
return rc;
|
||||
|
|
@ -2273,6 +2267,15 @@ static int _dasd_sleep_on(struct dasd_ccw_req *maincqr, int interruptible)
|
|||
cqr->intrc = -ENOLINK;
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
* Don't try to start requests if device is in
|
||||
* offline processing, it might wait forever
|
||||
*/
|
||||
if (test_bit(DASD_FLAG_OFFLINE, &device->flags)) {
|
||||
cqr->status = DASD_CQR_FAILED;
|
||||
cqr->intrc = -ENODEV;
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
* Don't try to start requests if device is stopped
|
||||
* except path verification requests
|
||||
|
|
@ -3364,6 +3367,22 @@ int dasd_generic_probe(struct ccw_device *cdev,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(dasd_generic_probe);
|
||||
|
||||
void dasd_generic_free_discipline(struct dasd_device *device)
|
||||
{
|
||||
/* Forget the discipline information. */
|
||||
if (device->discipline) {
|
||||
if (device->discipline->uncheck_device)
|
||||
device->discipline->uncheck_device(device);
|
||||
module_put(device->discipline->owner);
|
||||
device->discipline = NULL;
|
||||
}
|
||||
if (device->base_discipline) {
|
||||
module_put(device->base_discipline->owner);
|
||||
device->base_discipline = NULL;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dasd_generic_free_discipline);
|
||||
|
||||
/*
|
||||
* This will one day be called from a global not_oper handler.
|
||||
* It is also used by driver_unregister during module unload.
|
||||
|
|
|
|||
|
|
@ -617,6 +617,7 @@ dasd_delete_device(struct dasd_device *device)
|
|||
/* Wait for reference counter to drop to zero. */
|
||||
wait_event(dasd_delete_wq, atomic_read(&device->ref_count) == 0);
|
||||
|
||||
dasd_generic_free_discipline(device);
|
||||
/* Disconnect dasd_device structure from ccw_device structure. */
|
||||
cdev = device->cdev;
|
||||
device->cdev = NULL;
|
||||
|
|
|
|||
|
|
@ -5201,7 +5201,7 @@ static int dasd_eckd_query_host_access(struct dasd_device *device,
|
|||
|
||||
cqr->buildclk = get_tod_clock();
|
||||
cqr->status = DASD_CQR_FILLED;
|
||||
rc = dasd_sleep_on(cqr);
|
||||
rc = dasd_sleep_on_interruptible(cqr);
|
||||
if (rc == 0) {
|
||||
*data = *host_access;
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -169,12 +169,12 @@ dasd_log_sense(struct dasd_ccw_req *cqr, struct irb *irb)
|
|||
device = cqr->startdev;
|
||||
if (cqr->intrc == -ETIMEDOUT) {
|
||||
dev_err(&device->cdev->dev,
|
||||
"A timeout error occurred for cqr %p", cqr);
|
||||
"A timeout error occurred for cqr %p\n", cqr);
|
||||
return;
|
||||
}
|
||||
if (cqr->intrc == -ENOLINK) {
|
||||
dev_err(&device->cdev->dev,
|
||||
"A transport error occurred for cqr %p", cqr);
|
||||
"A transport error occurred for cqr %p\n", cqr);
|
||||
return;
|
||||
}
|
||||
/* dump sense data */
|
||||
|
|
|
|||
|
|
@ -725,6 +725,7 @@ void dasd_block_clear_timer(struct dasd_block *);
|
|||
int dasd_cancel_req(struct dasd_ccw_req *);
|
||||
int dasd_flush_device_queue(struct dasd_device *);
|
||||
int dasd_generic_probe (struct ccw_device *, struct dasd_discipline *);
|
||||
void dasd_generic_free_discipline(struct dasd_device *);
|
||||
void dasd_generic_remove (struct ccw_device *cdev);
|
||||
int dasd_generic_set_online(struct ccw_device *, struct dasd_discipline *);
|
||||
int dasd_generic_set_offline (struct ccw_device *cdev);
|
||||
|
|
|
|||
|
|
@ -124,7 +124,12 @@ con3270_create_status(struct con3270 *cp)
|
|||
static void
|
||||
con3270_update_string(struct con3270 *cp, struct string *s, int nr)
|
||||
{
|
||||
if (s->len >= cp->view.cols - 5)
|
||||
if (s->len < 4) {
|
||||
/* This indicates a bug, but printing a warning would
|
||||
* cause a deadlock. */
|
||||
return;
|
||||
}
|
||||
if (s->string[s->len - 4] != TO_RA)
|
||||
return;
|
||||
raw3270_buffer_address(cp->view.dev, s->string + s->len - 3,
|
||||
cp->view.cols * (nr + 1));
|
||||
|
|
@ -460,11 +465,11 @@ con3270_cline_end(struct con3270 *cp)
|
|||
cp->cline->len + 4 : cp->view.cols;
|
||||
s = con3270_alloc_string(cp, size);
|
||||
memcpy(s->string, cp->cline->string, cp->cline->len);
|
||||
if (s->len < cp->view.cols - 5) {
|
||||
if (cp->cline->len < cp->view.cols - 5) {
|
||||
s->string[s->len - 4] = TO_RA;
|
||||
s->string[s->len - 1] = 0;
|
||||
} else {
|
||||
while (--size > cp->cline->len)
|
||||
while (--size >= cp->cline->len)
|
||||
s->string[size] = cp->view.ascebc[' '];
|
||||
}
|
||||
/* Replace cline with allocated line s and reset cline. */
|
||||
|
|
|
|||
|
|
@ -312,15 +312,10 @@ static int tape_3592_ioctl_kekl_set(struct tape_device *device,
|
|||
return -ENOSYS;
|
||||
if (!crypt_enabled(device))
|
||||
return -EUNATCH;
|
||||
ext_kekls = kmalloc(sizeof(*ext_kekls), GFP_KERNEL);
|
||||
if (!ext_kekls)
|
||||
return -ENOMEM;
|
||||
if (copy_from_user(ext_kekls, (char __user *)arg, sizeof(*ext_kekls))) {
|
||||
rc = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
ext_kekls = memdup_user((char __user *)arg, sizeof(*ext_kekls));
|
||||
if (IS_ERR(ext_kekls))
|
||||
return PTR_ERR(ext_kekls);
|
||||
rc = tape_3592_kekl_set(device, ext_kekls);
|
||||
out:
|
||||
kfree(ext_kekls);
|
||||
return rc;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -306,10 +306,11 @@ static void ur_int_handler(struct ccw_device *cdev, unsigned long intparm,
|
|||
{
|
||||
struct urdev *urd;
|
||||
|
||||
TRACE("ur_int_handler: intparm=0x%lx cstat=%02x dstat=%02x res=%u\n",
|
||||
intparm, irb->scsw.cmd.cstat, irb->scsw.cmd.dstat,
|
||||
irb->scsw.cmd.count);
|
||||
|
||||
if (!IS_ERR(irb)) {
|
||||
TRACE("ur_int_handler: intparm=0x%lx cstat=%02x dstat=%02x res=%u\n",
|
||||
intparm, irb->scsw.cmd.cstat, irb->scsw.cmd.dstat,
|
||||
irb->scsw.cmd.count);
|
||||
}
|
||||
if (!intparm) {
|
||||
TRACE("ur_int_handler: unsolicited interrupt\n");
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -95,12 +95,13 @@ struct chsc_ssd_area {
|
|||
int chsc_get_ssd_info(struct subchannel_id schid, struct chsc_ssd_info *ssd)
|
||||
{
|
||||
struct chsc_ssd_area *ssd_area;
|
||||
unsigned long flags;
|
||||
int ccode;
|
||||
int ret;
|
||||
int i;
|
||||
int mask;
|
||||
|
||||
spin_lock_irq(&chsc_page_lock);
|
||||
spin_lock_irqsave(&chsc_page_lock, flags);
|
||||
memset(chsc_page, 0, PAGE_SIZE);
|
||||
ssd_area = chsc_page;
|
||||
ssd_area->request.length = 0x0010;
|
||||
|
|
@ -144,7 +145,7 @@ int chsc_get_ssd_info(struct subchannel_id schid, struct chsc_ssd_info *ssd)
|
|||
ssd->fla[i] = ssd_area->fla[i];
|
||||
}
|
||||
out:
|
||||
spin_unlock_irq(&chsc_page_lock);
|
||||
spin_unlock_irqrestore(&chsc_page_lock, flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -832,9 +833,10 @@ int __chsc_do_secm(struct channel_subsystem *css, int enable)
|
|||
u32 fmt : 4;
|
||||
u32 : 16;
|
||||
} __attribute__ ((packed)) *secm_area;
|
||||
unsigned long flags;
|
||||
int ret, ccode;
|
||||
|
||||
spin_lock_irq(&chsc_page_lock);
|
||||
spin_lock_irqsave(&chsc_page_lock, flags);
|
||||
memset(chsc_page, 0, PAGE_SIZE);
|
||||
secm_area = chsc_page;
|
||||
secm_area->request.length = 0x0050;
|
||||
|
|
@ -864,7 +866,7 @@ int __chsc_do_secm(struct channel_subsystem *css, int enable)
|
|||
CIO_CRW_EVENT(2, "chsc: secm failed (rc=%04x)\n",
|
||||
secm_area->response.code);
|
||||
out:
|
||||
spin_unlock_irq(&chsc_page_lock);
|
||||
spin_unlock_irqrestore(&chsc_page_lock, flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -992,6 +994,7 @@ chsc_initialize_cmg_chars(struct channel_path *chp, u8 cmcv,
|
|||
|
||||
int chsc_get_channel_measurement_chars(struct channel_path *chp)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ccode, ret;
|
||||
|
||||
struct {
|
||||
|
|
@ -1021,7 +1024,7 @@ int chsc_get_channel_measurement_chars(struct channel_path *chp)
|
|||
if (!css_chsc_characteristics.scmc || !css_chsc_characteristics.secm)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irq(&chsc_page_lock);
|
||||
spin_lock_irqsave(&chsc_page_lock, flags);
|
||||
memset(chsc_page, 0, PAGE_SIZE);
|
||||
scmc_area = chsc_page;
|
||||
scmc_area->request.length = 0x0010;
|
||||
|
|
@ -1053,7 +1056,7 @@ int chsc_get_channel_measurement_chars(struct channel_path *chp)
|
|||
chsc_initialize_cmg_chars(chp, scmc_area->cmcv,
|
||||
(struct cmg_chars *) &scmc_area->data);
|
||||
out:
|
||||
spin_unlock_irq(&chsc_page_lock);
|
||||
spin_unlock_irqrestore(&chsc_page_lock, flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1134,6 +1137,7 @@ struct css_chsc_char css_chsc_characteristics;
|
|||
int __init
|
||||
chsc_determine_css_characteristics(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
int result;
|
||||
struct {
|
||||
struct chsc_header request;
|
||||
|
|
@ -1146,7 +1150,7 @@ chsc_determine_css_characteristics(void)
|
|||
u32 chsc_char[508];
|
||||
} __attribute__ ((packed)) *scsc_area;
|
||||
|
||||
spin_lock_irq(&chsc_page_lock);
|
||||
spin_lock_irqsave(&chsc_page_lock, flags);
|
||||
memset(chsc_page, 0, PAGE_SIZE);
|
||||
scsc_area = chsc_page;
|
||||
scsc_area->request.length = 0x0010;
|
||||
|
|
@ -1168,7 +1172,7 @@ chsc_determine_css_characteristics(void)
|
|||
CIO_CRW_EVENT(2, "chsc: scsc failed (rc=%04x)\n",
|
||||
scsc_area->response.code);
|
||||
exit:
|
||||
spin_unlock_irq(&chsc_page_lock);
|
||||
spin_unlock_irqrestore(&chsc_page_lock, flags);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -127,7 +127,6 @@ extern int cio_resume (struct subchannel *);
|
|||
extern int cio_halt (struct subchannel *);
|
||||
extern int cio_start (struct subchannel *, struct ccw1 *, __u8);
|
||||
extern int cio_start_key (struct subchannel *, struct ccw1 *, __u8, __u8);
|
||||
extern int cio_cancel (struct subchannel *);
|
||||
extern int cio_set_options (struct subchannel *, int);
|
||||
extern int cio_update_schib(struct subchannel *sch);
|
||||
extern int cio_commit_config(struct subchannel *sch);
|
||||
|
|
|
|||
|
|
@ -310,7 +310,7 @@ static int zfcp_setup_adapter_work_queue(struct zfcp_adapter *adapter)
|
|||
|
||||
snprintf(name, sizeof(name), "zfcp_q_%s",
|
||||
dev_name(&adapter->ccw_device->dev));
|
||||
adapter->work_queue = create_singlethread_workqueue(name);
|
||||
adapter->work_queue = alloc_ordered_workqueue(name, WQ_MEM_RECLAIM);
|
||||
|
||||
if (adapter->work_queue)
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Reference in a new issue