Commit fd48d6c888eb3eb3c7e94a8880c6121893bd17b8
Exists in
master
and in
4 other branches
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6: [SCSI] qla2xxx: Obtain proper host structure during response-queue processing. [SCSI] compat_ioct: fix bsg SG_IO [SCSI] qla2xxx: make msix interrupt handler safe for irq [SCSI] zfcp: Report FC BSG errors in correct field [SCSI] mptfusion : mptscsih_abort return value should be SUCCESS instead of value 0.
Showing 6 changed files Side-by-side Diff
drivers/message/fusion/mptscsih.c
drivers/s390/scsi/zfcp_fc.c
... | ... | @@ -671,12 +671,11 @@ |
671 | 671 | { |
672 | 672 | struct fc_bsg_job *job = data; |
673 | 673 | struct zfcp_fsf_ct_els *zfcp_ct_els = job->dd_data; |
674 | - int status = zfcp_ct_els->status; | |
675 | - int reply_status; | |
674 | + struct fc_bsg_reply *jr = job->reply; | |
676 | 675 | |
677 | - reply_status = status ? FC_CTELS_STATUS_REJECT : FC_CTELS_STATUS_OK; | |
678 | - job->reply->reply_data.ctels_reply.status = reply_status; | |
679 | - job->reply->reply_payload_rcv_len = job->reply_payload.payload_len; | |
676 | + jr->reply_payload_rcv_len = job->reply_payload.payload_len; | |
677 | + jr->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK; | |
678 | + jr->result = zfcp_ct_els->status ? -EIO : 0; | |
680 | 679 | job->job_done(job); |
681 | 680 | } |
682 | 681 |
drivers/scsi/qla2xxx/qla_gbl.h
... | ... | @@ -453,7 +453,6 @@ |
453 | 453 | extern void qla25xx_wrt_req_reg(struct qla_hw_data *, uint16_t, uint16_t); |
454 | 454 | extern void qla25xx_wrt_rsp_reg(struct qla_hw_data *, uint16_t, uint16_t); |
455 | 455 | extern void qla24xx_wrt_rsp_reg(struct qla_hw_data *, uint16_t, uint16_t); |
456 | -extern struct scsi_qla_host * qla25xx_get_host(struct rsp_que *); | |
457 | 456 | |
458 | 457 | #endif /* _QLA_GBL_H */ |
drivers/scsi/qla2xxx/qla_isr.c
... | ... | @@ -1917,6 +1917,7 @@ |
1917 | 1917 | struct rsp_que *rsp; |
1918 | 1918 | struct device_reg_24xx __iomem *reg; |
1919 | 1919 | struct scsi_qla_host *vha; |
1920 | + unsigned long flags; | |
1920 | 1921 | |
1921 | 1922 | rsp = (struct rsp_que *) dev_id; |
1922 | 1923 | if (!rsp) { |
1923 | 1924 | |
1924 | 1925 | |
... | ... | @@ -1927,15 +1928,15 @@ |
1927 | 1928 | ha = rsp->hw; |
1928 | 1929 | reg = &ha->iobase->isp24; |
1929 | 1930 | |
1930 | - spin_lock_irq(&ha->hardware_lock); | |
1931 | + spin_lock_irqsave(&ha->hardware_lock, flags); | |
1931 | 1932 | |
1932 | - vha = qla25xx_get_host(rsp); | |
1933 | + vha = pci_get_drvdata(ha->pdev); | |
1933 | 1934 | qla24xx_process_response_queue(vha, rsp); |
1934 | 1935 | if (!ha->flags.disable_msix_handshake) { |
1935 | 1936 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); |
1936 | 1937 | RD_REG_DWORD_RELAXED(®->hccr); |
1937 | 1938 | } |
1938 | - spin_unlock_irq(&ha->hardware_lock); | |
1939 | + spin_unlock_irqrestore(&ha->hardware_lock, flags); | |
1939 | 1940 | |
1940 | 1941 | return IRQ_HANDLED; |
1941 | 1942 | } |
... | ... | @@ -1946,6 +1947,7 @@ |
1946 | 1947 | struct qla_hw_data *ha; |
1947 | 1948 | struct rsp_que *rsp; |
1948 | 1949 | struct device_reg_24xx __iomem *reg; |
1950 | + unsigned long flags; | |
1949 | 1951 | |
1950 | 1952 | rsp = (struct rsp_que *) dev_id; |
1951 | 1953 | if (!rsp) { |
1952 | 1954 | |
... | ... | @@ -1958,10 +1960,10 @@ |
1958 | 1960 | /* Clear the interrupt, if enabled, for this response queue */ |
1959 | 1961 | if (rsp->options & ~BIT_6) { |
1960 | 1962 | reg = &ha->iobase->isp24; |
1961 | - spin_lock_irq(&ha->hardware_lock); | |
1963 | + spin_lock_irqsave(&ha->hardware_lock, flags); | |
1962 | 1964 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); |
1963 | 1965 | RD_REG_DWORD_RELAXED(®->hccr); |
1964 | - spin_unlock_irq(&ha->hardware_lock); | |
1966 | + spin_unlock_irqrestore(&ha->hardware_lock, flags); | |
1965 | 1967 | } |
1966 | 1968 | queue_work_on((int) (rsp->id - 1), ha->wq, &rsp->q_work); |
1967 | 1969 | |
... | ... | @@ -1979,6 +1981,7 @@ |
1979 | 1981 | uint32_t stat; |
1980 | 1982 | uint32_t hccr; |
1981 | 1983 | uint16_t mb[4]; |
1984 | + unsigned long flags; | |
1982 | 1985 | |
1983 | 1986 | rsp = (struct rsp_que *) dev_id; |
1984 | 1987 | if (!rsp) { |
... | ... | @@ -1990,7 +1993,7 @@ |
1990 | 1993 | reg = &ha->iobase->isp24; |
1991 | 1994 | status = 0; |
1992 | 1995 | |
1993 | - spin_lock_irq(&ha->hardware_lock); | |
1996 | + spin_lock_irqsave(&ha->hardware_lock, flags); | |
1994 | 1997 | vha = pci_get_drvdata(ha->pdev); |
1995 | 1998 | do { |
1996 | 1999 | stat = RD_REG_DWORD(®->host_status); |
... | ... | @@ -2039,7 +2042,7 @@ |
2039 | 2042 | } |
2040 | 2043 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); |
2041 | 2044 | } while (0); |
2042 | - spin_unlock_irq(&ha->hardware_lock); | |
2045 | + spin_unlock_irqrestore(&ha->hardware_lock, flags); | |
2043 | 2046 | |
2044 | 2047 | if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) && |
2045 | 2048 | (status & MBX_INTERRUPT) && ha->flags.mbox_int) { |
... | ... | @@ -2276,32 +2279,5 @@ |
2276 | 2279 | msix->have_irq = 1; |
2277 | 2280 | msix->rsp = rsp; |
2278 | 2281 | return ret; |
2279 | -} | |
2280 | - | |
2281 | -struct scsi_qla_host * | |
2282 | -qla25xx_get_host(struct rsp_que *rsp) | |
2283 | -{ | |
2284 | - srb_t *sp; | |
2285 | - struct qla_hw_data *ha = rsp->hw; | |
2286 | - struct scsi_qla_host *vha = NULL; | |
2287 | - struct sts_entry_24xx *pkt; | |
2288 | - struct req_que *req; | |
2289 | - uint16_t que; | |
2290 | - uint32_t handle; | |
2291 | - | |
2292 | - pkt = (struct sts_entry_24xx *) rsp->ring_ptr; | |
2293 | - que = MSW(pkt->handle); | |
2294 | - handle = (uint32_t) LSW(pkt->handle); | |
2295 | - req = ha->req_q_map[que]; | |
2296 | - if (handle < MAX_OUTSTANDING_COMMANDS) { | |
2297 | - sp = req->outstanding_cmds[handle]; | |
2298 | - if (sp) | |
2299 | - return sp->fcport->vha; | |
2300 | - else | |
2301 | - goto base_que; | |
2302 | - } | |
2303 | -base_que: | |
2304 | - vha = pci_get_drvdata(ha->pdev); | |
2305 | - return vha; | |
2306 | 2282 | } |
drivers/scsi/qla2xxx/qla_mid.c
... | ... | @@ -636,13 +636,15 @@ |
636 | 636 | |
637 | 637 | static void qla_do_work(struct work_struct *work) |
638 | 638 | { |
639 | + unsigned long flags; | |
639 | 640 | struct rsp_que *rsp = container_of(work, struct rsp_que, q_work); |
640 | 641 | struct scsi_qla_host *vha; |
642 | + struct qla_hw_data *ha = rsp->hw; | |
641 | 643 | |
642 | - spin_lock_irq(&rsp->hw->hardware_lock); | |
643 | - vha = qla25xx_get_host(rsp); | |
644 | + spin_lock_irqsave(&rsp->hw->hardware_lock, flags); | |
645 | + vha = pci_get_drvdata(ha->pdev); | |
644 | 646 | qla24xx_process_response_queue(vha, rsp); |
645 | - spin_unlock_irq(&rsp->hw->hardware_lock); | |
647 | + spin_unlock_irqrestore(&rsp->hw->hardware_lock, flags); | |
646 | 648 | } |
647 | 649 | |
648 | 650 | /* create response queue */ |
fs/compat_ioctl.c
... | ... | @@ -301,6 +301,12 @@ |
301 | 301 | u32 data; |
302 | 302 | void __user *dxferp; |
303 | 303 | int err; |
304 | + int interface_id; | |
305 | + | |
306 | + if (get_user(interface_id, &sgio32->interface_id)) | |
307 | + return -EFAULT; | |
308 | + if (interface_id != 'S') | |
309 | + return sys_ioctl(fd, cmd, (unsigned long)sgio32); | |
304 | 310 | |
305 | 311 | if (get_user(iovec_count, &sgio32->iovec_count)) |
306 | 312 | return -EFAULT; |