diff options
| -rw-r--r-- | MAINTAINERS | 8 | ||||
| -rw-r--r-- | drivers/char/tty_port.c | 3 | ||||
| -rw-r--r-- | drivers/scsi/bfa/bfad_fwimg.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/bfa/bfad_im.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/gdth.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/ipr.c | 42 | ||||
| -rw-r--r-- | drivers/scsi/ipr.h | 1 | ||||
| -rw-r--r-- | drivers/scsi/libsas/sas_expander.c | 1 | ||||
| -rw-r--r-- | drivers/scsi/pmcraid.c | 10 | ||||
| -rw-r--r-- | drivers/scsi/scsi_transport_fc.c | 3 | ||||
| -rw-r--r-- | drivers/spi/spi_stmp.c | 2 | ||||
| -rw-r--r-- | drivers/usb/serial/cp210x.c | 21 | ||||
| -rw-r--r-- | drivers/video/da8xx-fb.c | 2 | ||||
| -rw-r--r-- | fs/fcntl.c | 4 | ||||
| -rw-r--r-- | fs/proc/array.c | 2 | ||||
| -rw-r--r-- | include/asm-generic/fcntl.h | 2 | ||||
| -rw-r--r-- | include/linux/suspend.h | 21 | ||||
| -rw-r--r-- | include/scsi/scsi_host.h | 29 | ||||
| -rw-r--r-- | kernel/workqueue.c | 28 | ||||
| -rw-r--r-- | mm/Kconfig | 5 | ||||
| -rw-r--r-- | mm/memory_hotplug.c | 24 |
21 files changed, 145 insertions, 69 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 81d68d5b7ee..1ba4f98c9cb 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -3084,9 +3084,13 @@ F: kernel/kgdb.c | |||
| 3084 | 3084 | ||
| 3085 | KMEMCHECK | 3085 | KMEMCHECK |
| 3086 | M: Vegard Nossum <vegardno@ifi.uio.no> | 3086 | M: Vegard Nossum <vegardno@ifi.uio.no> |
| 3087 | P Pekka Enberg | 3087 | M: Pekka Enberg <penberg@cs.helsinki.fi> |
| 3088 | M: penberg@cs.helsinki.fi | ||
| 3089 | S: Maintained | 3088 | S: Maintained |
| 3089 | F: Documentation/kmemcheck.txt | ||
| 3090 | F: arch/x86/include/asm/kmemcheck.h | ||
| 3091 | F: arch/x86/mm/kmemcheck/ | ||
| 3092 | F: include/linux/kmemcheck.h | ||
| 3093 | F: mm/kmemcheck.c | ||
| 3090 | 3094 | ||
| 3091 | KMEMLEAK | 3095 | KMEMLEAK |
| 3092 | M: Catalin Marinas <catalin.marinas@arm.com> | 3096 | M: Catalin Marinas <catalin.marinas@arm.com> |
diff --git a/drivers/char/tty_port.c b/drivers/char/tty_port.c index a4bbb28f10b..2e8552dc5ed 100644 --- a/drivers/char/tty_port.c +++ b/drivers/char/tty_port.c | |||
| @@ -221,6 +221,9 @@ int tty_port_block_til_ready(struct tty_port *port, | |||
| 221 | the port has just hung up or is in another error state */ | 221 | the port has just hung up or is in another error state */ |
| 222 | if ((filp->f_flags & O_NONBLOCK) || | 222 | if ((filp->f_flags & O_NONBLOCK) || |
| 223 | (tty->flags & (1 << TTY_IO_ERROR))) { | 223 | (tty->flags & (1 << TTY_IO_ERROR))) { |
| 224 | /* Indicate we are open */ | ||
| 225 | if (tty->termios->c_cflag & CBAUD) | ||
| 226 | tty_port_raise_dtr_rts(port); | ||
| 224 | port->flags |= ASYNC_NORMAL_ACTIVE; | 227 | port->flags |= ASYNC_NORMAL_ACTIVE; |
| 225 | return 0; | 228 | return 0; |
| 226 | } | 229 | } |
diff --git a/drivers/scsi/bfa/bfad_fwimg.c b/drivers/scsi/bfa/bfad_fwimg.c index b2f6949bc8d..bd34b0db2d6 100644 --- a/drivers/scsi/bfa/bfad_fwimg.c +++ b/drivers/scsi/bfa/bfad_fwimg.c | |||
| @@ -41,6 +41,8 @@ u32 *bfi_image_cb; | |||
| 41 | 41 | ||
| 42 | #define BFAD_FW_FILE_CT "ctfw.bin" | 42 | #define BFAD_FW_FILE_CT "ctfw.bin" |
| 43 | #define BFAD_FW_FILE_CB "cbfw.bin" | 43 | #define BFAD_FW_FILE_CB "cbfw.bin" |
| 44 | MODULE_FIRMWARE(BFAD_FW_FILE_CT); | ||
| 45 | MODULE_FIRMWARE(BFAD_FW_FILE_CB); | ||
| 44 | 46 | ||
| 45 | u32 * | 47 | u32 * |
| 46 | bfad_read_firmware(struct pci_dev *pdev, u32 **bfi_image, | 48 | bfad_read_firmware(struct pci_dev *pdev, u32 **bfi_image, |
diff --git a/drivers/scsi/bfa/bfad_im.c b/drivers/scsi/bfa/bfad_im.c index 158c99243c0..55d012a9a66 100644 --- a/drivers/scsi/bfa/bfad_im.c +++ b/drivers/scsi/bfa/bfad_im.c | |||
| @@ -948,7 +948,7 @@ bfad_os_fc_host_init(struct bfad_im_port_s *im_port) | |||
| 948 | if (bfad_supported_fc4s & (BFA_PORT_ROLE_FCP_IM | BFA_PORT_ROLE_FCP_TM)) | 948 | if (bfad_supported_fc4s & (BFA_PORT_ROLE_FCP_IM | BFA_PORT_ROLE_FCP_TM)) |
| 949 | /* For FCP type 0x08 */ | 949 | /* For FCP type 0x08 */ |
| 950 | fc_host_supported_fc4s(host)[2] = 1; | 950 | fc_host_supported_fc4s(host)[2] = 1; |
| 951 | if (bfad_supported_fc4s | BFA_PORT_ROLE_FCP_IPFC) | 951 | if (bfad_supported_fc4s & BFA_PORT_ROLE_FCP_IPFC) |
| 952 | /* For LLC/SNAP type 0x05 */ | 952 | /* For LLC/SNAP type 0x05 */ |
| 953 | fc_host_supported_fc4s(host)[3] = 0x20; | 953 | fc_host_supported_fc4s(host)[3] = 0x20; |
| 954 | /* For fibre channel services type 0x20 */ | 954 | /* For fibre channel services type 0x20 */ |
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 185e6bc4dd4..9e8fce0f0c1 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c | |||
| @@ -2900,7 +2900,7 @@ static int gdth_read_event(gdth_ha_str *ha, int handle, gdth_evt_str *estr) | |||
| 2900 | eindex = handle; | 2900 | eindex = handle; |
| 2901 | estr->event_source = 0; | 2901 | estr->event_source = 0; |
| 2902 | 2902 | ||
| 2903 | if (eindex >= MAX_EVENTS) { | 2903 | if (eindex < 0 || eindex >= MAX_EVENTS) { |
| 2904 | spin_unlock_irqrestore(&ha->smp_lock, flags); | 2904 | spin_unlock_irqrestore(&ha->smp_lock, flags); |
| 2905 | return eindex; | 2905 | return eindex; |
| 2906 | } | 2906 | } |
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 5f045505a1f..76d294fc784 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
| @@ -4189,6 +4189,25 @@ static irqreturn_t ipr_handle_other_interrupt(struct ipr_ioa_cfg *ioa_cfg, | |||
| 4189 | } | 4189 | } |
| 4190 | 4190 | ||
| 4191 | /** | 4191 | /** |
| 4192 | * ipr_isr_eh - Interrupt service routine error handler | ||
| 4193 | * @ioa_cfg: ioa config struct | ||
| 4194 | * @msg: message to log | ||
| 4195 | * | ||
| 4196 | * Return value: | ||
| 4197 | * none | ||
| 4198 | **/ | ||
| 4199 | static void ipr_isr_eh(struct ipr_ioa_cfg *ioa_cfg, char *msg) | ||
| 4200 | { | ||
| 4201 | ioa_cfg->errors_logged++; | ||
| 4202 | dev_err(&ioa_cfg->pdev->dev, "%s\n", msg); | ||
| 4203 | |||
| 4204 | if (WAIT_FOR_DUMP == ioa_cfg->sdt_state) | ||
| 4205 | ioa_cfg->sdt_state = GET_DUMP; | ||
| 4206 | |||
| 4207 | ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); | ||
| 4208 | } | ||
| 4209 | |||
| 4210 | /** | ||
| 4192 | * ipr_isr - Interrupt service routine | 4211 | * ipr_isr - Interrupt service routine |
| 4193 | * @irq: irq number | 4212 | * @irq: irq number |
| 4194 | * @devp: pointer to ioa config struct | 4213 | * @devp: pointer to ioa config struct |
| @@ -4203,6 +4222,7 @@ static irqreturn_t ipr_isr(int irq, void *devp) | |||
| 4203 | volatile u32 int_reg, int_mask_reg; | 4222 | volatile u32 int_reg, int_mask_reg; |
| 4204 | u32 ioasc; | 4223 | u32 ioasc; |
| 4205 | u16 cmd_index; | 4224 | u16 cmd_index; |
| 4225 | int num_hrrq = 0; | ||
| 4206 | struct ipr_cmnd *ipr_cmd; | 4226 | struct ipr_cmnd *ipr_cmd; |
| 4207 | irqreturn_t rc = IRQ_NONE; | 4227 | irqreturn_t rc = IRQ_NONE; |
| 4208 | 4228 | ||
| @@ -4233,13 +4253,7 @@ static irqreturn_t ipr_isr(int irq, void *devp) | |||
| 4233 | IPR_HRRQ_REQ_RESP_HANDLE_MASK) >> IPR_HRRQ_REQ_RESP_HANDLE_SHIFT; | 4253 | IPR_HRRQ_REQ_RESP_HANDLE_MASK) >> IPR_HRRQ_REQ_RESP_HANDLE_SHIFT; |
| 4234 | 4254 | ||
| 4235 | if (unlikely(cmd_index >= IPR_NUM_CMD_BLKS)) { | 4255 | if (unlikely(cmd_index >= IPR_NUM_CMD_BLKS)) { |
| 4236 | ioa_cfg->errors_logged++; | 4256 | ipr_isr_eh(ioa_cfg, "Invalid response handle from IOA"); |
| 4237 | dev_err(&ioa_cfg->pdev->dev, "Invalid response handle from IOA\n"); | ||
| 4238 | |||
| 4239 | if (WAIT_FOR_DUMP == ioa_cfg->sdt_state) | ||
| 4240 | ioa_cfg->sdt_state = GET_DUMP; | ||
| 4241 | |||
| 4242 | ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); | ||
| 4243 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); | 4257 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); |
| 4244 | return IRQ_HANDLED; | 4258 | return IRQ_HANDLED; |
| 4245 | } | 4259 | } |
| @@ -4266,8 +4280,18 @@ static irqreturn_t ipr_isr(int irq, void *devp) | |||
| 4266 | 4280 | ||
| 4267 | if (ipr_cmd != NULL) { | 4281 | if (ipr_cmd != NULL) { |
| 4268 | /* Clear the PCI interrupt */ | 4282 | /* Clear the PCI interrupt */ |
| 4269 | writel(IPR_PCII_HRRQ_UPDATED, ioa_cfg->regs.clr_interrupt_reg); | 4283 | do { |
| 4270 | int_reg = readl(ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg; | 4284 | writel(IPR_PCII_HRRQ_UPDATED, ioa_cfg->regs.clr_interrupt_reg); |
| 4285 | int_reg = readl(ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg; | ||
| 4286 | } while (int_reg & IPR_PCII_HRRQ_UPDATED && | ||
| 4287 | num_hrrq++ < IPR_MAX_HRRQ_RETRIES); | ||
| 4288 | |||
| 4289 | if (int_reg & IPR_PCII_HRRQ_UPDATED) { | ||
| 4290 | ipr_isr_eh(ioa_cfg, "Error clearing HRRQ"); | ||
| 4291 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); | ||
| 4292 | return IRQ_HANDLED; | ||
| 4293 | } | ||
| 4294 | |||
| 4271 | } else | 4295 | } else |
| 4272 | break; | 4296 | break; |
| 4273 | } | 4297 | } |
diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h index 163245a1c3e..19bbcf39f0c 100644 --- a/drivers/scsi/ipr.h +++ b/drivers/scsi/ipr.h | |||
| @@ -144,6 +144,7 @@ | |||
| 144 | #define IPR_IOA_MAX_SECTORS 32767 | 144 | #define IPR_IOA_MAX_SECTORS 32767 |
| 145 | #define IPR_VSET_MAX_SECTORS 512 | 145 | #define IPR_VSET_MAX_SECTORS 512 |
| 146 | #define IPR_MAX_CDB_LEN 16 | 146 | #define IPR_MAX_CDB_LEN 16 |
| 147 | #define IPR_MAX_HRRQ_RETRIES 3 | ||
| 147 | 148 | ||
| 148 | #define IPR_DEFAULT_BUS_WIDTH 16 | 149 | #define IPR_DEFAULT_BUS_WIDTH 16 |
| 149 | #define IPR_80MBs_SCSI_RATE ((80 * 10) / (IPR_DEFAULT_BUS_WIDTH / 8)) | 150 | #define IPR_80MBs_SCSI_RATE ((80 * 10) / (IPR_DEFAULT_BUS_WIDTH / 8)) |
diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c index b3381959acc..33cf988c8c8 100644 --- a/drivers/scsi/libsas/sas_expander.c +++ b/drivers/scsi/libsas/sas_expander.c | |||
| @@ -960,7 +960,6 @@ static int sas_ex_discover_dev(struct domain_device *dev, int phy_id) | |||
| 960 | 960 | ||
| 961 | } | 961 | } |
| 962 | } | 962 | } |
| 963 | res = 0; | ||
| 964 | } | 963 | } |
| 965 | 964 | ||
| 966 | return res; | 965 | return res; |
diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c index f7c70e2a822..0a97bc9074b 100644 --- a/drivers/scsi/pmcraid.c +++ b/drivers/scsi/pmcraid.c | |||
| @@ -1071,7 +1071,7 @@ static struct pmcraid_cmd *pmcraid_init_hcam | |||
| 1071 | 1071 | ||
| 1072 | ioarcb->data_transfer_length = cpu_to_le32(rcb_size); | 1072 | ioarcb->data_transfer_length = cpu_to_le32(rcb_size); |
| 1073 | 1073 | ||
| 1074 | ioadl[0].flags |= cpu_to_le32(IOADL_FLAGS_READ_LAST); | 1074 | ioadl[0].flags |= IOADL_FLAGS_READ_LAST; |
| 1075 | ioadl[0].data_len = cpu_to_le32(rcb_size); | 1075 | ioadl[0].data_len = cpu_to_le32(rcb_size); |
| 1076 | ioadl[0].address = cpu_to_le32(dma); | 1076 | ioadl[0].address = cpu_to_le32(dma); |
| 1077 | 1077 | ||
| @@ -2251,7 +2251,7 @@ static void pmcraid_request_sense(struct pmcraid_cmd *cmd) | |||
| 2251 | 2251 | ||
| 2252 | ioadl->address = cpu_to_le64(cmd->sense_buffer_dma); | 2252 | ioadl->address = cpu_to_le64(cmd->sense_buffer_dma); |
| 2253 | ioadl->data_len = cpu_to_le32(SCSI_SENSE_BUFFERSIZE); | 2253 | ioadl->data_len = cpu_to_le32(SCSI_SENSE_BUFFERSIZE); |
| 2254 | ioadl->flags = cpu_to_le32(IOADL_FLAGS_LAST_DESC); | 2254 | ioadl->flags = IOADL_FLAGS_LAST_DESC; |
| 2255 | 2255 | ||
| 2256 | /* request sense might be called as part of error response processing | 2256 | /* request sense might be called as part of error response processing |
| 2257 | * which runs in tasklets context. It is possible that mid-layer might | 2257 | * which runs in tasklets context. It is possible that mid-layer might |
| @@ -3017,7 +3017,7 @@ static int pmcraid_build_ioadl( | |||
| 3017 | ioadl[i].flags = 0; | 3017 | ioadl[i].flags = 0; |
| 3018 | } | 3018 | } |
| 3019 | /* setup last descriptor */ | 3019 | /* setup last descriptor */ |
| 3020 | ioadl[i - 1].flags = cpu_to_le32(IOADL_FLAGS_LAST_DESC); | 3020 | ioadl[i - 1].flags = IOADL_FLAGS_LAST_DESC; |
| 3021 | 3021 | ||
| 3022 | return 0; | 3022 | return 0; |
| 3023 | } | 3023 | } |
| @@ -3387,7 +3387,7 @@ static int pmcraid_build_passthrough_ioadls( | |||
| 3387 | } | 3387 | } |
| 3388 | 3388 | ||
| 3389 | /* setup the last descriptor */ | 3389 | /* setup the last descriptor */ |
| 3390 | ioadl[i - 1].flags = cpu_to_le32(IOADL_FLAGS_LAST_DESC); | 3390 | ioadl[i - 1].flags = IOADL_FLAGS_LAST_DESC; |
| 3391 | 3391 | ||
| 3392 | return 0; | 3392 | return 0; |
| 3393 | } | 3393 | } |
| @@ -5314,7 +5314,7 @@ static void pmcraid_querycfg(struct pmcraid_cmd *cmd) | |||
| 5314 | cpu_to_le32(sizeof(struct pmcraid_config_table)); | 5314 | cpu_to_le32(sizeof(struct pmcraid_config_table)); |
| 5315 | 5315 | ||
| 5316 | ioadl = &(ioarcb->add_data.u.ioadl[0]); | 5316 | ioadl = &(ioarcb->add_data.u.ioadl[0]); |
| 5317 | ioadl->flags = cpu_to_le32(IOADL_FLAGS_LAST_DESC); | 5317 | ioadl->flags = IOADL_FLAGS_LAST_DESC; |
| 5318 | ioadl->address = cpu_to_le64(pinstance->cfg_table_bus_addr); | 5318 | ioadl->address = cpu_to_le64(pinstance->cfg_table_bus_addr); |
| 5319 | ioadl->data_len = cpu_to_le32(sizeof(struct pmcraid_config_table)); | 5319 | ioadl->data_len = cpu_to_le32(sizeof(struct pmcraid_config_table)); |
| 5320 | 5320 | ||
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index a67fed10598..c6f70dae9b2 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c | |||
| @@ -3656,6 +3656,7 @@ fc_bsg_host_dispatch(struct request_queue *q, struct Scsi_Host *shost, | |||
| 3656 | fail_host_msg: | 3656 | fail_host_msg: |
| 3657 | /* return the errno failure code as the only status */ | 3657 | /* return the errno failure code as the only status */ |
| 3658 | BUG_ON(job->reply_len < sizeof(uint32_t)); | 3658 | BUG_ON(job->reply_len < sizeof(uint32_t)); |
| 3659 | job->reply->reply_payload_rcv_len = 0; | ||
| 3659 | job->reply->result = ret; | 3660 | job->reply->result = ret; |
| 3660 | job->reply_len = sizeof(uint32_t); | 3661 | job->reply_len = sizeof(uint32_t); |
| 3661 | fc_bsg_jobdone(job); | 3662 | fc_bsg_jobdone(job); |
| @@ -3741,6 +3742,7 @@ check_bidi: | |||
| 3741 | fail_rport_msg: | 3742 | fail_rport_msg: |
| 3742 | /* return the errno failure code as the only status */ | 3743 | /* return the errno failure code as the only status */ |
| 3743 | BUG_ON(job->reply_len < sizeof(uint32_t)); | 3744 | BUG_ON(job->reply_len < sizeof(uint32_t)); |
| 3745 | job->reply->reply_payload_rcv_len = 0; | ||
| 3744 | job->reply->result = ret; | 3746 | job->reply->result = ret; |
| 3745 | job->reply_len = sizeof(uint32_t); | 3747 | job->reply_len = sizeof(uint32_t); |
| 3746 | fc_bsg_jobdone(job); | 3748 | fc_bsg_jobdone(job); |
| @@ -3797,6 +3799,7 @@ fc_bsg_request_handler(struct request_queue *q, struct Scsi_Host *shost, | |||
| 3797 | /* check if we have the msgcode value at least */ | 3799 | /* check if we have the msgcode value at least */ |
| 3798 | if (job->request_len < sizeof(uint32_t)) { | 3800 | if (job->request_len < sizeof(uint32_t)) { |
| 3799 | BUG_ON(job->reply_len < sizeof(uint32_t)); | 3801 | BUG_ON(job->reply_len < sizeof(uint32_t)); |
| 3802 | job->reply->reply_payload_rcv_len = 0; | ||
| 3800 | job->reply->result = -ENOMSG; | 3803 | job->reply->result = -ENOMSG; |
| 3801 | job->reply_len = sizeof(uint32_t); | 3804 | job->reply_len = sizeof(uint32_t); |
| 3802 | fc_bsg_jobdone(job); | 3805 | fc_bsg_jobdone(job); |
diff --git a/drivers/spi/spi_stmp.c b/drivers/spi/spi_stmp.c index d871dc23909..2552bb36400 100644 --- a/drivers/spi/spi_stmp.c +++ b/drivers/spi/spi_stmp.c | |||
| @@ -242,7 +242,7 @@ static int stmp_spi_txrx_dma(struct stmp_spi *ss, int cs, | |||
| 242 | wait_for_completion(&ss->done); | 242 | wait_for_completion(&ss->done); |
| 243 | 243 | ||
| 244 | if (!busy_wait(readl(ss->regs + HW_SSP_CTRL0) & BM_SSP_CTRL0_RUN)) | 244 | if (!busy_wait(readl(ss->regs + HW_SSP_CTRL0) & BM_SSP_CTRL0_RUN)) |
| 245 | status = ETIMEDOUT; | 245 | status = -ETIMEDOUT; |
| 246 | 246 | ||
| 247 | if (!dma_buf) | 247 | if (!dma_buf) |
| 248 | dma_unmap_single(ss->master_dev, spi_buf_dma, len, dir); | 248 | dma_unmap_single(ss->master_dev, spi_buf_dma, len, dir); |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index 698252a4dc5..bd254ec97d1 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
| @@ -50,6 +50,8 @@ static int cp210x_tiocmset_port(struct usb_serial_port *port, struct file *, | |||
| 50 | static void cp210x_break_ctl(struct tty_struct *, int); | 50 | static void cp210x_break_ctl(struct tty_struct *, int); |
| 51 | static int cp210x_startup(struct usb_serial *); | 51 | static int cp210x_startup(struct usb_serial *); |
| 52 | static void cp210x_disconnect(struct usb_serial *); | 52 | static void cp210x_disconnect(struct usb_serial *); |
| 53 | static void cp210x_dtr_rts(struct usb_serial_port *p, int on); | ||
| 54 | static int cp210x_carrier_raised(struct usb_serial_port *p); | ||
| 53 | 55 | ||
| 54 | static int debug; | 56 | static int debug; |
| 55 | 57 | ||
| @@ -143,6 +145,8 @@ static struct usb_serial_driver cp210x_device = { | |||
| 143 | .tiocmset = cp210x_tiocmset, | 145 | .tiocmset = cp210x_tiocmset, |
| 144 | .attach = cp210x_startup, | 146 | .attach = cp210x_startup, |
| 145 | .disconnect = cp210x_disconnect, | 147 | .disconnect = cp210x_disconnect, |
| 148 | .dtr_rts = cp210x_dtr_rts, | ||
| 149 | .carrier_raised = cp210x_carrier_raised | ||
| 146 | }; | 150 | }; |
| 147 | 151 | ||
| 148 | /* Config request types */ | 152 | /* Config request types */ |
| @@ -746,6 +750,14 @@ static int cp210x_tiocmset_port(struct usb_serial_port *port, struct file *file, | |||
| 746 | return cp210x_set_config(port, CP210X_SET_MHS, &control, 2); | 750 | return cp210x_set_config(port, CP210X_SET_MHS, &control, 2); |
| 747 | } | 751 | } |
| 748 | 752 | ||
| 753 | static void cp210x_dtr_rts(struct usb_serial_port *p, int on) | ||
| 754 | { | ||
| 755 | if (on) | ||
| 756 | cp210x_tiocmset_port(p, NULL, TIOCM_DTR|TIOCM_RTS, 0); | ||
| 757 | else | ||
| 758 | cp210x_tiocmset_port(p, NULL, 0, TIOCM_DTR|TIOCM_RTS); | ||
| 759 | } | ||
| 760 | |||
| 749 | static int cp210x_tiocmget (struct tty_struct *tty, struct file *file) | 761 | static int cp210x_tiocmget (struct tty_struct *tty, struct file *file) |
| 750 | { | 762 | { |
| 751 | struct usb_serial_port *port = tty->driver_data; | 763 | struct usb_serial_port *port = tty->driver_data; |
| @@ -768,6 +780,15 @@ static int cp210x_tiocmget (struct tty_struct *tty, struct file *file) | |||
| 768 | return result; | 780 | return result; |
| 769 | } | 781 | } |
| 770 | 782 | ||
| 783 | static int cp210x_carrier_raised(struct usb_serial_port *p) | ||
| 784 | { | ||
| 785 | unsigned int control; | ||
| 786 | cp210x_get_config(p, CP210X_GET_MDMSTS, &control, 1); | ||
| 787 | if (control & CONTROL_DCD) | ||
| 788 | return 1; | ||
| 789 | return 0; | ||
| 790 | } | ||
| 791 | |||
| 771 | static void cp210x_break_ctl (struct tty_struct *tty, int break_state) | 792 | static void cp210x_break_ctl (struct tty_struct *tty, int break_state) |
| 772 | { | 793 | { |
| 773 | struct usb_serial_port *port = tty->driver_data; | 794 | struct usb_serial_port *port = tty->driver_data; |
diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c index d065894ce38..035d56835b7 100644 --- a/drivers/video/da8xx-fb.c +++ b/drivers/video/da8xx-fb.c | |||
| @@ -704,7 +704,7 @@ static int __init fb_probe(struct platform_device *device) | |||
| 704 | 704 | ||
| 705 | if (i == ARRAY_SIZE(known_lcd_panels)) { | 705 | if (i == ARRAY_SIZE(known_lcd_panels)) { |
| 706 | dev_err(&device->dev, "GLCD: No valid panel found\n"); | 706 | dev_err(&device->dev, "GLCD: No valid panel found\n"); |
| 707 | ret = ENODEV; | 707 | ret = -ENODEV; |
| 708 | goto err_clk_disable; | 708 | goto err_clk_disable; |
| 709 | } else | 709 | } else |
| 710 | dev_info(&device->dev, "GLCD: Found %s panel\n", | 710 | dev_info(&device->dev, "GLCD: Found %s panel\n", |
diff --git a/fs/fcntl.c b/fs/fcntl.c index fc089f2f7f5..2cf93ec40a6 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c | |||
| @@ -284,7 +284,7 @@ static int f_setown_ex(struct file *filp, unsigned long arg) | |||
| 284 | type = PIDTYPE_PID; | 284 | type = PIDTYPE_PID; |
| 285 | break; | 285 | break; |
| 286 | 286 | ||
| 287 | case F_OWNER_GID: | 287 | case F_OWNER_PGRP: |
| 288 | type = PIDTYPE_PGID; | 288 | type = PIDTYPE_PGID; |
| 289 | break; | 289 | break; |
| 290 | 290 | ||
| @@ -321,7 +321,7 @@ static int f_getown_ex(struct file *filp, unsigned long arg) | |||
| 321 | break; | 321 | break; |
| 322 | 322 | ||
| 323 | case PIDTYPE_PGID: | 323 | case PIDTYPE_PGID: |
| 324 | owner.type = F_OWNER_GID; | 324 | owner.type = F_OWNER_PGRP; |
| 325 | break; | 325 | break; |
| 326 | 326 | ||
| 327 | default: | 327 | default: |
diff --git a/fs/proc/array.c b/fs/proc/array.c index 07f77a7945c..822c2d50651 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
| @@ -571,7 +571,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, | |||
| 571 | rsslim, | 571 | rsslim, |
| 572 | mm ? mm->start_code : 0, | 572 | mm ? mm->start_code : 0, |
| 573 | mm ? mm->end_code : 0, | 573 | mm ? mm->end_code : 0, |
| 574 | (permitted) ? task->stack_start : 0, | 574 | (permitted && mm) ? task->stack_start : 0, |
| 575 | esp, | 575 | esp, |
| 576 | eip, | 576 | eip, |
| 577 | /* The signal information here is obsolete. | 577 | /* The signal information here is obsolete. |
diff --git a/include/asm-generic/fcntl.h b/include/asm-generic/fcntl.h index cd2d7896e34..495dc8af404 100644 --- a/include/asm-generic/fcntl.h +++ b/include/asm-generic/fcntl.h | |||
| @@ -89,7 +89,7 @@ | |||
| 89 | 89 | ||
| 90 | #define F_OWNER_TID 0 | 90 | #define F_OWNER_TID 0 |
| 91 | #define F_OWNER_PID 1 | 91 | #define F_OWNER_PID 1 |
| 92 | #define F_OWNER_GID 2 | 92 | #define F_OWNER_PGRP 2 |
| 93 | 93 | ||
| 94 | struct f_owner_ex { | 94 | struct f_owner_ex { |
| 95 | int type; | 95 | int type; |
diff --git a/include/linux/suspend.h b/include/linux/suspend.h index cd15df6c63c..5e781d824e6 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h | |||
| @@ -301,6 +301,8 @@ static inline int unregister_pm_notifier(struct notifier_block *nb) | |||
| 301 | #define pm_notifier(fn, pri) do { (void)(fn); } while (0) | 301 | #define pm_notifier(fn, pri) do { (void)(fn); } while (0) |
| 302 | #endif /* !CONFIG_PM_SLEEP */ | 302 | #endif /* !CONFIG_PM_SLEEP */ |
| 303 | 303 | ||
| 304 | extern struct mutex pm_mutex; | ||
| 305 | |||
| 304 | #ifndef CONFIG_HIBERNATION | 306 | #ifndef CONFIG_HIBERNATION |
| 305 | static inline void register_nosave_region(unsigned long b, unsigned long e) | 307 | static inline void register_nosave_region(unsigned long b, unsigned long e) |
| 306 | { | 308 | { |
| @@ -308,8 +310,23 @@ static inline void register_nosave_region(unsigned long b, unsigned long e) | |||
| 308 | static inline void register_nosave_region_late(unsigned long b, unsigned long e) | 310 | static inline void register_nosave_region_late(unsigned long b, unsigned long e) |
| 309 | { | 311 | { |
| 310 | } | 312 | } |
| 311 | #endif | ||
| 312 | 313 | ||
| 313 | extern struct mutex pm_mutex; | 314 | static inline void lock_system_sleep(void) {} |
| 315 | static inline void unlock_system_sleep(void) {} | ||
| 316 | |||
| 317 | #else | ||
| 318 | |||
| 319 | /* Let some subsystems like memory hotadd exclude hibernation */ | ||
| 320 | |||
| 321 | static inline void lock_system_sleep(void) | ||
| 322 | { | ||
| 323 | mutex_lock(&pm_mutex); | ||
| 324 | } | ||
| 325 | |||
| 326 | static inline void unlock_system_sleep(void) | ||
| 327 | { | ||
| 328 | mutex_unlock(&pm_mutex); | ||
| 329 | } | ||
| 330 | #endif | ||
| 314 | 331 | ||
| 315 | #endif /* _LINUX_SUSPEND_H */ | 332 | #endif /* _LINUX_SUSPEND_H */ |
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 6e728b17690..47941fc5aba 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h | |||
| @@ -797,30 +797,23 @@ static inline unsigned int scsi_host_get_prot(struct Scsi_Host *shost) | |||
| 797 | 797 | ||
| 798 | static inline unsigned int scsi_host_dif_capable(struct Scsi_Host *shost, unsigned int target_type) | 798 | static inline unsigned int scsi_host_dif_capable(struct Scsi_Host *shost, unsigned int target_type) |
| 799 | { | 799 | { |
| 800 | switch (target_type) { | 800 | static unsigned char cap[] = { 0, |
| 801 | case 1: | 801 | SHOST_DIF_TYPE1_PROTECTION, |
| 802 | if (shost->prot_capabilities & SHOST_DIF_TYPE1_PROTECTION) | 802 | SHOST_DIF_TYPE2_PROTECTION, |
| 803 | return target_type; | 803 | SHOST_DIF_TYPE3_PROTECTION }; |
| 804 | case 2: | ||
| 805 | if (shost->prot_capabilities & SHOST_DIF_TYPE2_PROTECTION) | ||
| 806 | return target_type; | ||
| 807 | case 3: | ||
| 808 | if (shost->prot_capabilities & SHOST_DIF_TYPE3_PROTECTION) | ||
| 809 | return target_type; | ||
| 810 | } | ||
| 811 | 804 | ||
| 812 | return 0; | 805 | return shost->prot_capabilities & cap[target_type] ? target_type : 0; |
| 813 | } | 806 | } |
| 814 | 807 | ||
| 815 | static inline unsigned int scsi_host_dix_capable(struct Scsi_Host *shost, unsigned int target_type) | 808 | static inline unsigned int scsi_host_dix_capable(struct Scsi_Host *shost, unsigned int target_type) |
| 816 | { | 809 | { |
| 817 | #if defined(CONFIG_BLK_DEV_INTEGRITY) | 810 | #if defined(CONFIG_BLK_DEV_INTEGRITY) |
| 818 | switch (target_type) { | 811 | static unsigned char cap[] = { SHOST_DIX_TYPE0_PROTECTION, |
| 819 | case 0: return shost->prot_capabilities & SHOST_DIX_TYPE0_PROTECTION; | 812 | SHOST_DIX_TYPE1_PROTECTION, |
| 820 | case 1: return shost->prot_capabilities & SHOST_DIX_TYPE1_PROTECTION; | 813 | SHOST_DIX_TYPE2_PROTECTION, |
| 821 | case 2: return shost->prot_capabilities & SHOST_DIX_TYPE2_PROTECTION; | 814 | SHOST_DIX_TYPE3_PROTECTION }; |
| 822 | case 3: return shost->prot_capabilities & SHOST_DIX_TYPE3_PROTECTION; | 815 | |
| 823 | } | 816 | return shost->prot_capabilities & cap[target_type]; |
| 824 | #endif | 817 | #endif |
| 825 | return 0; | 818 | return 0; |
| 826 | } | 819 | } |
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 12328147132..67e526b6ae8 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
| @@ -692,31 +692,29 @@ int schedule_on_each_cpu(work_func_t func) | |||
| 692 | if (!works) | 692 | if (!works) |
| 693 | return -ENOMEM; | 693 | return -ENOMEM; |
| 694 | 694 | ||
| 695 | get_online_cpus(); | ||
| 696 | |||
| 695 | /* | 697 | /* |
| 696 | * when running in keventd don't schedule a work item on itself. | 698 | * When running in keventd don't schedule a work item on |
| 697 | * Can just call directly because the work queue is already bound. | 699 | * itself. Can just call directly because the work queue is |
| 698 | * This also is faster. | 700 | * already bound. This also is faster. |
| 699 | * Make this a generic parameter for other workqueues? | ||
| 700 | */ | 701 | */ |
| 701 | if (current_is_keventd()) { | 702 | if (current_is_keventd()) |
| 702 | orig = raw_smp_processor_id(); | 703 | orig = raw_smp_processor_id(); |
| 703 | INIT_WORK(per_cpu_ptr(works, orig), func); | ||
| 704 | func(per_cpu_ptr(works, orig)); | ||
| 705 | } | ||
| 706 | 704 | ||
| 707 | get_online_cpus(); | ||
| 708 | for_each_online_cpu(cpu) { | 705 | for_each_online_cpu(cpu) { |
| 709 | struct work_struct *work = per_cpu_ptr(works, cpu); | 706 | struct work_struct *work = per_cpu_ptr(works, cpu); |
| 710 | 707 | ||
| 711 | if (cpu == orig) | ||
| 712 | continue; | ||
| 713 | INIT_WORK(work, func); | 708 | INIT_WORK(work, func); |
| 714 | schedule_work_on(cpu, work); | ||
| 715 | } | ||
| 716 | for_each_online_cpu(cpu) { | ||
| 717 | if (cpu != orig) | 709 | if (cpu != orig) |
| 718 | flush_work(per_cpu_ptr(works, cpu)); | 710 | schedule_work_on(cpu, work); |
| 719 | } | 711 | } |
| 712 | if (orig >= 0) | ||
| 713 | func(per_cpu_ptr(works, orig)); | ||
| 714 | |||
| 715 | for_each_online_cpu(cpu) | ||
| 716 | flush_work(per_cpu_ptr(works, cpu)); | ||
| 717 | |||
| 720 | put_online_cpus(); | 718 | put_online_cpus(); |
| 721 | free_percpu(works); | 719 | free_percpu(works); |
| 722 | return 0; | 720 | return 0; |
diff --git a/mm/Kconfig b/mm/Kconfig index fd3386242cf..44cf6f0a3a6 100644 --- a/mm/Kconfig +++ b/mm/Kconfig | |||
| @@ -128,12 +128,9 @@ config SPARSEMEM_VMEMMAP | |||
| 128 | config MEMORY_HOTPLUG | 128 | config MEMORY_HOTPLUG |
| 129 | bool "Allow for memory hot-add" | 129 | bool "Allow for memory hot-add" |
| 130 | depends on SPARSEMEM || X86_64_ACPI_NUMA | 130 | depends on SPARSEMEM || X86_64_ACPI_NUMA |
| 131 | depends on HOTPLUG && !(HIBERNATION && !S390) && ARCH_ENABLE_MEMORY_HOTPLUG | 131 | depends on HOTPLUG && ARCH_ENABLE_MEMORY_HOTPLUG |
| 132 | depends on (IA64 || X86 || PPC_BOOK3S_64 || SUPERH || S390) | 132 | depends on (IA64 || X86 || PPC_BOOK3S_64 || SUPERH || S390) |
| 133 | 133 | ||
| 134 | comment "Memory hotplug is currently incompatible with Software Suspend" | ||
| 135 | depends on SPARSEMEM && HOTPLUG && HIBERNATION && !S390 | ||
| 136 | |||
| 137 | config MEMORY_HOTPLUG_SPARSE | 134 | config MEMORY_HOTPLUG_SPARSE |
| 138 | def_bool y | 135 | def_bool y |
| 139 | depends on SPARSEMEM && MEMORY_HOTPLUG | 136 | depends on SPARSEMEM && MEMORY_HOTPLUG |
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 821dee59637..2047465cd27 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/migrate.h> | 26 | #include <linux/migrate.h> |
| 27 | #include <linux/page-isolation.h> | 27 | #include <linux/page-isolation.h> |
| 28 | #include <linux/pfn.h> | 28 | #include <linux/pfn.h> |
| 29 | #include <linux/suspend.h> | ||
| 29 | 30 | ||
| 30 | #include <asm/tlbflush.h> | 31 | #include <asm/tlbflush.h> |
| 31 | 32 | ||
| @@ -447,7 +448,8 @@ int online_pages(unsigned long pfn, unsigned long nr_pages) | |||
| 447 | } | 448 | } |
| 448 | #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */ | 449 | #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */ |
| 449 | 450 | ||
| 450 | static pg_data_t *hotadd_new_pgdat(int nid, u64 start) | 451 | /* we are OK calling __meminit stuff here - we have CONFIG_MEMORY_HOTPLUG */ |
| 452 | static pg_data_t __ref *hotadd_new_pgdat(int nid, u64 start) | ||
| 451 | { | 453 | { |
| 452 | struct pglist_data *pgdat; | 454 | struct pglist_data *pgdat; |
| 453 | unsigned long zones_size[MAX_NR_ZONES] = {0}; | 455 | unsigned long zones_size[MAX_NR_ZONES] = {0}; |
| @@ -484,14 +486,18 @@ int __ref add_memory(int nid, u64 start, u64 size) | |||
| 484 | struct resource *res; | 486 | struct resource *res; |
| 485 | int ret; | 487 | int ret; |
| 486 | 488 | ||
| 489 | lock_system_sleep(); | ||
| 490 | |||
| 487 | res = register_memory_resource(start, size); | 491 | res = register_memory_resource(start, size); |
| 492 | ret = -EEXIST; | ||
| 488 | if (!res) | 493 | if (!res) |
| 489 | return -EEXIST; | 494 | goto out; |
| 490 | 495 | ||
| 491 | if (!node_online(nid)) { | 496 | if (!node_online(nid)) { |
| 492 | pgdat = hotadd_new_pgdat(nid, start); | 497 | pgdat = hotadd_new_pgdat(nid, start); |
| 498 | ret = -ENOMEM; | ||
| 493 | if (!pgdat) | 499 | if (!pgdat) |
| 494 | return -ENOMEM; | 500 | goto out; |
| 495 | new_pgdat = 1; | 501 | new_pgdat = 1; |
| 496 | } | 502 | } |
| 497 | 503 | ||
| @@ -514,7 +520,8 @@ int __ref add_memory(int nid, u64 start, u64 size) | |||
| 514 | BUG_ON(ret); | 520 | BUG_ON(ret); |
| 515 | } | 521 | } |
| 516 | 522 | ||
| 517 | return ret; | 523 | goto out; |
| 524 | |||
| 518 | error: | 525 | error: |
| 519 | /* rollback pgdat allocation and others */ | 526 | /* rollback pgdat allocation and others */ |
| 520 | if (new_pgdat) | 527 | if (new_pgdat) |
| @@ -522,6 +529,8 @@ error: | |||
| 522 | if (res) | 529 | if (res) |
| 523 | release_memory_resource(res); | 530 | release_memory_resource(res); |
| 524 | 531 | ||
| 532 | out: | ||
| 533 | unlock_system_sleep(); | ||
| 525 | return ret; | 534 | return ret; |
| 526 | } | 535 | } |
| 527 | EXPORT_SYMBOL_GPL(add_memory); | 536 | EXPORT_SYMBOL_GPL(add_memory); |
| @@ -758,6 +767,8 @@ int offline_pages(unsigned long start_pfn, | |||
| 758 | if (!test_pages_in_a_zone(start_pfn, end_pfn)) | 767 | if (!test_pages_in_a_zone(start_pfn, end_pfn)) |
| 759 | return -EINVAL; | 768 | return -EINVAL; |
| 760 | 769 | ||
| 770 | lock_system_sleep(); | ||
| 771 | |||
| 761 | zone = page_zone(pfn_to_page(start_pfn)); | 772 | zone = page_zone(pfn_to_page(start_pfn)); |
| 762 | node = zone_to_nid(zone); | 773 | node = zone_to_nid(zone); |
| 763 | nr_pages = end_pfn - start_pfn; | 774 | nr_pages = end_pfn - start_pfn; |
| @@ -765,7 +776,7 @@ int offline_pages(unsigned long start_pfn, | |||
| 765 | /* set above range as isolated */ | 776 | /* set above range as isolated */ |
| 766 | ret = start_isolate_page_range(start_pfn, end_pfn); | 777 | ret = start_isolate_page_range(start_pfn, end_pfn); |
| 767 | if (ret) | 778 | if (ret) |
| 768 | return ret; | 779 | goto out; |
| 769 | 780 | ||
| 770 | arg.start_pfn = start_pfn; | 781 | arg.start_pfn = start_pfn; |
| 771 | arg.nr_pages = nr_pages; | 782 | arg.nr_pages = nr_pages; |
| @@ -843,6 +854,7 @@ repeat: | |||
| 843 | writeback_set_ratelimit(); | 854 | writeback_set_ratelimit(); |
| 844 | 855 | ||
| 845 | memory_notify(MEM_OFFLINE, &arg); | 856 | memory_notify(MEM_OFFLINE, &arg); |
| 857 | unlock_system_sleep(); | ||
| 846 | return 0; | 858 | return 0; |
| 847 | 859 | ||
| 848 | failed_removal: | 860 | failed_removal: |
| @@ -852,6 +864,8 @@ failed_removal: | |||
| 852 | /* pushback to free area */ | 864 | /* pushback to free area */ |
| 853 | undo_isolate_page_range(start_pfn, end_pfn); | 865 | undo_isolate_page_range(start_pfn, end_pfn); |
| 854 | 866 | ||
| 867 | out: | ||
| 868 | unlock_system_sleep(); | ||
| 855 | return ret; | 869 | return ret; |
| 856 | } | 870 | } |
| 857 | 871 | ||
