mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Merge branch 'iov_iter' into for-next
This commit is contained in:
commit
ba00410b81
1101 changed files with 10861 additions and 7898 deletions
|
|
@ -480,9 +480,7 @@ void bnx2fc_rec_compl(struct bnx2fc_els_cb_arg *cb_arg)
|
|||
bnx2fc_initiate_cleanup(orig_io_req);
|
||||
/* Post a new IO req with the same sc_cmd */
|
||||
BNX2FC_IO_DBG(rec_req, "Post IO request again\n");
|
||||
spin_unlock_bh(&tgt->tgt_lock);
|
||||
rc = bnx2fc_post_io_req(tgt, new_io_req);
|
||||
spin_lock_bh(&tgt->tgt_lock);
|
||||
if (!rc)
|
||||
goto free_frame;
|
||||
BNX2FC_IO_DBG(rec_req, "REC: io post err\n");
|
||||
|
|
|
|||
|
|
@ -1894,18 +1894,24 @@ int bnx2fc_queuecommand(struct Scsi_Host *host,
|
|||
goto exit_qcmd;
|
||||
}
|
||||
}
|
||||
|
||||
spin_lock_bh(&tgt->tgt_lock);
|
||||
|
||||
io_req = bnx2fc_cmd_alloc(tgt);
|
||||
if (!io_req) {
|
||||
rc = SCSI_MLQUEUE_HOST_BUSY;
|
||||
goto exit_qcmd;
|
||||
goto exit_qcmd_tgtlock;
|
||||
}
|
||||
io_req->sc_cmd = sc_cmd;
|
||||
|
||||
if (bnx2fc_post_io_req(tgt, io_req)) {
|
||||
printk(KERN_ERR PFX "Unable to post io_req\n");
|
||||
rc = SCSI_MLQUEUE_HOST_BUSY;
|
||||
goto exit_qcmd;
|
||||
goto exit_qcmd_tgtlock;
|
||||
}
|
||||
|
||||
exit_qcmd_tgtlock:
|
||||
spin_unlock_bh(&tgt->tgt_lock);
|
||||
exit_qcmd:
|
||||
return rc;
|
||||
}
|
||||
|
|
@ -2020,6 +2026,8 @@ int bnx2fc_post_io_req(struct bnx2fc_rport *tgt,
|
|||
int task_idx, index;
|
||||
u16 xid;
|
||||
|
||||
/* bnx2fc_post_io_req() is called with the tgt_lock held */
|
||||
|
||||
/* Initialize rest of io_req fields */
|
||||
io_req->cmd_type = BNX2FC_SCSI_CMD;
|
||||
io_req->port = port;
|
||||
|
|
@ -2047,9 +2055,7 @@ int bnx2fc_post_io_req(struct bnx2fc_rport *tgt,
|
|||
/* Build buffer descriptor list for firmware from sg list */
|
||||
if (bnx2fc_build_bd_list_from_sg(io_req)) {
|
||||
printk(KERN_ERR PFX "BD list creation failed\n");
|
||||
spin_lock_bh(&tgt->tgt_lock);
|
||||
kref_put(&io_req->refcount, bnx2fc_cmd_release);
|
||||
spin_unlock_bh(&tgt->tgt_lock);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
|
|
@ -2061,19 +2067,15 @@ int bnx2fc_post_io_req(struct bnx2fc_rport *tgt,
|
|||
task = &(task_page[index]);
|
||||
bnx2fc_init_task(io_req, task);
|
||||
|
||||
spin_lock_bh(&tgt->tgt_lock);
|
||||
|
||||
if (tgt->flush_in_prog) {
|
||||
printk(KERN_ERR PFX "Flush in progress..Host Busy\n");
|
||||
kref_put(&io_req->refcount, bnx2fc_cmd_release);
|
||||
spin_unlock_bh(&tgt->tgt_lock);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
if (!test_bit(BNX2FC_FLAG_SESSION_READY, &tgt->flags)) {
|
||||
printk(KERN_ERR PFX "Session not ready...post_io\n");
|
||||
kref_put(&io_req->refcount, bnx2fc_cmd_release);
|
||||
spin_unlock_bh(&tgt->tgt_lock);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
|
|
@ -2091,6 +2093,5 @@ int bnx2fc_post_io_req(struct bnx2fc_rport *tgt,
|
|||
|
||||
/* Ring doorbell */
|
||||
bnx2fc_ring_doorbell(tgt);
|
||||
spin_unlock_bh(&tgt->tgt_lock);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -828,6 +828,8 @@ static void do_act_open_rpl(struct cxgbi_device *cdev, struct sk_buff *skb)
|
|||
if (status == CPL_ERR_RTX_NEG_ADVICE)
|
||||
goto rel_skb;
|
||||
|
||||
module_put(THIS_MODULE);
|
||||
|
||||
if (status && status != CPL_ERR_TCAM_FULL &&
|
||||
status != CPL_ERR_CONN_EXIST &&
|
||||
status != CPL_ERR_ARP_MISS)
|
||||
|
|
@ -936,20 +938,23 @@ static void do_abort_req_rss(struct cxgbi_device *cdev, struct sk_buff *skb)
|
|||
cxgbi_sock_get(csk);
|
||||
spin_lock_bh(&csk->lock);
|
||||
|
||||
if (!cxgbi_sock_flag(csk, CTPF_ABORT_REQ_RCVD)) {
|
||||
cxgbi_sock_set_flag(csk, CTPF_ABORT_REQ_RCVD);
|
||||
cxgbi_sock_set_state(csk, CTP_ABORTING);
|
||||
goto done;
|
||||
cxgbi_sock_clear_flag(csk, CTPF_ABORT_REQ_RCVD);
|
||||
|
||||
if (!cxgbi_sock_flag(csk, CTPF_TX_DATA_SENT)) {
|
||||
send_tx_flowc_wr(csk);
|
||||
cxgbi_sock_set_flag(csk, CTPF_TX_DATA_SENT);
|
||||
}
|
||||
|
||||
cxgbi_sock_clear_flag(csk, CTPF_ABORT_REQ_RCVD);
|
||||
cxgbi_sock_set_flag(csk, CTPF_ABORT_REQ_RCVD);
|
||||
cxgbi_sock_set_state(csk, CTP_ABORTING);
|
||||
|
||||
send_abort_rpl(csk, rst_status);
|
||||
|
||||
if (!cxgbi_sock_flag(csk, CTPF_ABORT_RPL_PENDING)) {
|
||||
csk->err = abort_status_to_errno(csk, req->status, &rst_status);
|
||||
cxgbi_sock_closed(csk);
|
||||
}
|
||||
done:
|
||||
|
||||
spin_unlock_bh(&csk->lock);
|
||||
cxgbi_sock_put(csk);
|
||||
rel_skb:
|
||||
|
|
|
|||
|
|
@ -399,6 +399,35 @@ EXPORT_SYMBOL_GPL(cxgbi_hbas_add);
|
|||
* If the source port is outside our allocation range, the caller is
|
||||
* responsible for keeping track of their port usage.
|
||||
*/
|
||||
|
||||
static struct cxgbi_sock *find_sock_on_port(struct cxgbi_device *cdev,
|
||||
unsigned char port_id)
|
||||
{
|
||||
struct cxgbi_ports_map *pmap = &cdev->pmap;
|
||||
unsigned int i;
|
||||
unsigned int used;
|
||||
|
||||
if (!pmap->max_connect || !pmap->used)
|
||||
return NULL;
|
||||
|
||||
spin_lock_bh(&pmap->lock);
|
||||
used = pmap->used;
|
||||
for (i = 0; used && i < pmap->max_connect; i++) {
|
||||
struct cxgbi_sock *csk = pmap->port_csk[i];
|
||||
|
||||
if (csk) {
|
||||
if (csk->port_id == port_id) {
|
||||
spin_unlock_bh(&pmap->lock);
|
||||
return csk;
|
||||
}
|
||||
used--;
|
||||
}
|
||||
}
|
||||
spin_unlock_bh(&pmap->lock);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int sock_get_port(struct cxgbi_sock *csk)
|
||||
{
|
||||
struct cxgbi_device *cdev = csk->cdev;
|
||||
|
|
@ -749,6 +778,7 @@ static struct cxgbi_sock *cxgbi_check_route6(struct sockaddr *dst_addr)
|
|||
csk->daddr6.sin6_addr = daddr6->sin6_addr;
|
||||
csk->daddr6.sin6_port = daddr6->sin6_port;
|
||||
csk->daddr6.sin6_family = daddr6->sin6_family;
|
||||
csk->saddr6.sin6_family = daddr6->sin6_family;
|
||||
csk->saddr6.sin6_addr = pref_saddr;
|
||||
|
||||
neigh_release(n);
|
||||
|
|
@ -786,7 +816,7 @@ static void cxgbi_inform_iscsi_conn_closing(struct cxgbi_sock *csk)
|
|||
read_lock_bh(&csk->callback_lock);
|
||||
if (csk->user_data)
|
||||
iscsi_conn_failure(csk->user_data,
|
||||
ISCSI_ERR_CONN_FAILED);
|
||||
ISCSI_ERR_TCP_CONN_CLOSE);
|
||||
read_unlock_bh(&csk->callback_lock);
|
||||
}
|
||||
}
|
||||
|
|
@ -875,18 +905,16 @@ void cxgbi_sock_rcv_abort_rpl(struct cxgbi_sock *csk)
|
|||
{
|
||||
cxgbi_sock_get(csk);
|
||||
spin_lock_bh(&csk->lock);
|
||||
|
||||
cxgbi_sock_set_flag(csk, CTPF_ABORT_RPL_RCVD);
|
||||
if (cxgbi_sock_flag(csk, CTPF_ABORT_RPL_PENDING)) {
|
||||
if (!cxgbi_sock_flag(csk, CTPF_ABORT_RPL_RCVD))
|
||||
cxgbi_sock_set_flag(csk, CTPF_ABORT_RPL_RCVD);
|
||||
else {
|
||||
cxgbi_sock_clear_flag(csk, CTPF_ABORT_RPL_RCVD);
|
||||
cxgbi_sock_clear_flag(csk, CTPF_ABORT_RPL_PENDING);
|
||||
if (cxgbi_sock_flag(csk, CTPF_ABORT_REQ_RCVD))
|
||||
pr_err("csk 0x%p,%u,0x%lx,%u,ABT_RPL_RSS.\n",
|
||||
csk, csk->state, csk->flags, csk->tid);
|
||||
cxgbi_sock_closed(csk);
|
||||
}
|
||||
cxgbi_sock_clear_flag(csk, CTPF_ABORT_RPL_PENDING);
|
||||
if (cxgbi_sock_flag(csk, CTPF_ABORT_REQ_RCVD))
|
||||
pr_err("csk 0x%p,%u,0x%lx,%u,ABT_RPL_RSS.\n",
|
||||
csk, csk->state, csk->flags, csk->tid);
|
||||
cxgbi_sock_closed(csk);
|
||||
}
|
||||
|
||||
spin_unlock_bh(&csk->lock);
|
||||
cxgbi_sock_put(csk);
|
||||
}
|
||||
|
|
@ -2647,12 +2675,14 @@ int cxgbi_get_host_param(struct Scsi_Host *shost, enum iscsi_host_param param,
|
|||
break;
|
||||
case ISCSI_HOST_PARAM_IPADDRESS:
|
||||
{
|
||||
__be32 addr;
|
||||
|
||||
addr = cxgbi_get_iscsi_ipv4(chba);
|
||||
len = sprintf(buf, "%pI4", &addr);
|
||||
struct cxgbi_sock *csk = find_sock_on_port(chba->cdev,
|
||||
chba->port_id);
|
||||
if (csk) {
|
||||
len = sprintf(buf, "%pIS",
|
||||
(struct sockaddr *)&csk->saddr);
|
||||
}
|
||||
log_debug(1 << CXGBI_DBG_ISCSI,
|
||||
"hba %s, ipv4 %pI4.\n", chba->ndev->name, &addr);
|
||||
"hba %s, addr %s.\n", chba->ndev->name, buf);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -700,11 +700,6 @@ static inline void cxgbi_set_iscsi_ipv4(struct cxgbi_hba *chba, __be32 ipaddr)
|
|||
chba->ndev->name);
|
||||
}
|
||||
|
||||
static inline __be32 cxgbi_get_iscsi_ipv4(struct cxgbi_hba *chba)
|
||||
{
|
||||
return chba->ipv4addr;
|
||||
}
|
||||
|
||||
struct cxgbi_device *cxgbi_device_register(unsigned int, unsigned int);
|
||||
void cxgbi_device_unregister(struct cxgbi_device *);
|
||||
void cxgbi_device_unregister_all(unsigned int flag);
|
||||
|
|
|
|||
|
|
@ -474,6 +474,13 @@ static int alua_check_sense(struct scsi_device *sdev,
|
|||
* LUN Not Ready -- Offline
|
||||
*/
|
||||
return SUCCESS;
|
||||
if (sdev->allow_restart &&
|
||||
sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x02)
|
||||
/*
|
||||
* if the device is not started, we need to wake
|
||||
* the error handler to start the motor
|
||||
*/
|
||||
return FAILED;
|
||||
break;
|
||||
case UNIT_ATTENTION:
|
||||
if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x00)
|
||||
|
|
|
|||
|
|
@ -4453,7 +4453,7 @@ static int megasas_init_fw(struct megasas_instance *instance)
|
|||
instance->msixentry[i].entry = i;
|
||||
i = pci_enable_msix_range(instance->pdev, instance->msixentry,
|
||||
1, instance->msix_vectors);
|
||||
if (i)
|
||||
if (i > 0)
|
||||
instance->msix_vectors = i;
|
||||
else
|
||||
instance->msix_vectors = 0;
|
||||
|
|
|
|||
|
|
@ -459,14 +459,6 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)
|
|||
if (! scsi_command_normalize_sense(scmd, &sshdr))
|
||||
return FAILED; /* no valid sense data */
|
||||
|
||||
if (scmd->cmnd[0] == TEST_UNIT_READY && scmd->scsi_done != scsi_eh_done)
|
||||
/*
|
||||
* nasty: for mid-layer issued TURs, we need to return the
|
||||
* actual sense data without any recovery attempt. For eh
|
||||
* issued ones, we need to try to recover and interpret
|
||||
*/
|
||||
return SUCCESS;
|
||||
|
||||
scsi_report_sense(sdev, &sshdr);
|
||||
|
||||
if (scsi_sense_is_deferred(&sshdr))
|
||||
|
|
@ -482,6 +474,14 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)
|
|||
/* handler does not care. Drop down to default handling */
|
||||
}
|
||||
|
||||
if (scmd->cmnd[0] == TEST_UNIT_READY && scmd->scsi_done != scsi_eh_done)
|
||||
/*
|
||||
* nasty: for mid-layer issued TURs, we need to return the
|
||||
* actual sense data without any recovery attempt. For eh
|
||||
* issued ones, we need to try to recover and interpret
|
||||
*/
|
||||
return SUCCESS;
|
||||
|
||||
/*
|
||||
* Previous logic looked for FILEMARK, EOM or ILI which are
|
||||
* mainly associated with tapes and returned SUCCESS.
|
||||
|
|
@ -2001,8 +2001,10 @@ static void scsi_restart_operations(struct Scsi_Host *shost)
|
|||
* is no point trying to lock the door of an off-line device.
|
||||
*/
|
||||
shost_for_each_device(sdev, shost) {
|
||||
if (scsi_device_online(sdev) && sdev->locked)
|
||||
if (scsi_device_online(sdev) && sdev->was_reset && sdev->locked) {
|
||||
scsi_eh_lock_door(sdev);
|
||||
sdev->was_reset = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1893,6 +1893,11 @@ static int scsi_queue_rq(struct blk_mq_hw_ctx *hctx, struct request *req,
|
|||
blk_mq_start_request(req);
|
||||
}
|
||||
|
||||
if (blk_queue_tagged(q))
|
||||
req->cmd_flags |= REQ_QUEUED;
|
||||
else
|
||||
req->cmd_flags &= ~REQ_QUEUED;
|
||||
|
||||
scsi_init_cmd_errh(cmd);
|
||||
cmd->scsi_done = scsi_mq_done;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue