Skip to content

Commit c41375e

Browse files
Merge branch 7.2/scsi-queue into 7.2/scsi-fixes
Pull in outstanding commits from 7.2/scsi-queue. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
2 parents dc59e4f + 57a6ed0 commit c41375e

5 files changed

Lines changed: 25 additions & 17 deletions

File tree

drivers/scsi/bfa/bfa_fcs_lport.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2627,7 +2627,7 @@ bfa_fcs_fdmi_get_hbaattr(struct bfa_fcs_lport_fdmi_s *fdmi,
26272627

26282628
}
26292629

2630-
static void
2630+
static noinline_for_stack void
26312631
bfa_fcs_fdmi_get_portattr(struct bfa_fcs_lport_fdmi_s *fdmi,
26322632
struct bfa_fcs_fdmi_port_attr_s *port_attr)
26332633
{

drivers/scsi/scsi_lib.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2224,14 +2224,6 @@ struct scsi_device *scsi_device_from_queue(struct request_queue *q)
22242224

22252225
return sdev;
22262226
}
2227-
/*
2228-
* pktcdvd should have been integrated into the SCSI layers, but for historical
2229-
* reasons like the old IDE driver it isn't. This export allows it to safely
2230-
* probe if a given device is a SCSI one and only attach to that.
2231-
*/
2232-
#ifdef CONFIG_CDROM_PKTCDVD_MODULE
2233-
EXPORT_SYMBOL_GPL(scsi_device_from_queue);
2234-
#endif
22352227

22362228
/**
22372229
* scsi_block_requests - Utility function used by low-level drivers to prevent

drivers/scsi/scsi_priv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ void scsi_eh_done(struct scsi_cmnd *scmd);
102102

103103
/* scsi_lib.c */
104104
extern void scsi_device_unbusy(struct scsi_device *sdev, struct scsi_cmnd *cmd);
105+
extern struct scsi_device *scsi_device_from_queue(struct request_queue *q);
105106
extern void scsi_queue_insert(struct scsi_cmnd *cmd,
106107
enum scsi_qc_status reason);
107108
extern void scsi_io_completion(struct scsi_cmnd *, unsigned int);

drivers/xen/xen-scsiback.c

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,25 @@ static void scsiback_disconnect(struct vscsibk_info *info)
611611
xenbus_unmap_ring_vfree(info->dev, info->ring.sring);
612612
}
613613

614+
/*
615+
* Send the error response for a request that did not reach the target core
616+
* and return its tag. Free the tag before the response drops the v2p
617+
* reference that keeps the session alive, and snapshot what the response
618+
* needs since returning the tag can let the slot be reused.
619+
*/
620+
static void scsiback_resp_and_free(struct vscsibk_pend *pending_req,
621+
int32_t result)
622+
{
623+
struct vscsibk_info *info = pending_req->info;
624+
struct v2p_entry *v2p = pending_req->v2p;
625+
struct se_session *se_sess = v2p->tpg->tpg_nexus->tvn_se_sess;
626+
u16 rqid = pending_req->rqid;
627+
628+
target_free_tag(se_sess, &pending_req->se_cmd);
629+
scsiback_send_response(info, NULL, result, 0, rqid);
630+
kref_put(&v2p->kref, scsiback_free_translation_entry);
631+
}
632+
614633
static void scsiback_device_action(struct vscsibk_pend *pending_req,
615634
enum tcm_tmreq_table act, int tag)
616635
{
@@ -639,7 +658,7 @@ static void scsiback_device_action(struct vscsibk_pend *pending_req,
639658
return;
640659

641660
err:
642-
scsiback_do_resp_with_sense(NULL, err, 0, pending_req);
661+
scsiback_resp_and_free(pending_req, err);
643662
}
644663

645664
/*
@@ -792,9 +811,8 @@ static int scsiback_do_cmd_fn(struct vscsibk_info *info,
792811
case VSCSIIF_ACT_SCSI_CDB:
793812
if (scsiback_gnttab_data_map(&ring_req, pending_req)) {
794813
scsiback_fast_flush_area(pending_req);
795-
scsiback_do_resp_with_sense(NULL,
796-
DID_ERROR << 16, 0, pending_req);
797-
transport_generic_free_cmd(&pending_req->se_cmd, 0);
814+
scsiback_resp_and_free(pending_req,
815+
DID_ERROR << 16);
798816
} else {
799817
scsiback_cmd_exec(pending_req);
800818
}
@@ -808,9 +826,7 @@ static int scsiback_do_cmd_fn(struct vscsibk_info *info,
808826
break;
809827
default:
810828
pr_err_ratelimited("invalid request\n");
811-
scsiback_do_resp_with_sense(NULL, DID_ERROR << 16, 0,
812-
pending_req);
813-
transport_generic_free_cmd(&pending_req->se_cmd, 0);
829+
scsiback_resp_and_free(pending_req, DID_ERROR << 16);
814830
break;
815831
}
816832

include/scsi/scsi_device.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,6 @@ void scsi_attach_vpd(struct scsi_device *sdev);
408408
void scsi_cdl_check(struct scsi_device *sdev);
409409
int scsi_cdl_enable(struct scsi_device *sdev, bool enable);
410410

411-
extern struct scsi_device *scsi_device_from_queue(struct request_queue *q);
412411
extern int __must_check scsi_device_get(struct scsi_device *);
413412
extern void scsi_device_put(struct scsi_device *);
414413
extern struct scsi_device *scsi_device_lookup(struct Scsi_Host *,

0 commit comments

Comments
 (0)