Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 01b04759 authored by Swen Schillig's avatar Swen Schillig Committed by James Bottomley
Browse files

[SCSI] zfcp: Cleanup function parameters for sbal value.



A lot of functions require the amount of SBALs as one of their
parameter which is most times invariable.  Therefore remove this
parameter and set the SBAL value explicitly if a non standard value is
required.  In addition the warning message "oversized data" is
replaced with a BUG_ON() statement assuring the limits defined and
requested by zfcp.

Signed-off-by: default avatarSwen Schillig <swen@vnet.ibm.com>
Signed-off-by: default avatarChristof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent faf4cd85
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -146,7 +146,7 @@ extern void zfcp_qdio_destroy(struct zfcp_qdio *);
extern int zfcp_qdio_sbal_get(struct zfcp_qdio *);
extern int zfcp_qdio_sbal_get(struct zfcp_qdio *);
extern int zfcp_qdio_send(struct zfcp_qdio *, struct zfcp_qdio_req *);
extern int zfcp_qdio_send(struct zfcp_qdio *, struct zfcp_qdio_req *);
extern int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *, struct zfcp_qdio_req *,
extern int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *, struct zfcp_qdio_req *,
				   struct scatterlist *, int);
				   struct scatterlist *);
extern int zfcp_qdio_open(struct zfcp_qdio *);
extern int zfcp_qdio_open(struct zfcp_qdio *);
extern void zfcp_qdio_close(struct zfcp_qdio *);
extern void zfcp_qdio_close(struct zfcp_qdio *);


+14 −26
Original line number Original line Diff line number Diff line
@@ -959,8 +959,7 @@ static void zfcp_fsf_setup_ct_els_unchained(struct zfcp_qdio *qdio,


static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req,
static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req,
				       struct scatterlist *sg_req,
				       struct scatterlist *sg_req,
				       struct scatterlist *sg_resp,
				       struct scatterlist *sg_resp)
				       int max_sbals)
{
{
	struct zfcp_adapter *adapter = req->adapter;
	struct zfcp_adapter *adapter = req->adapter;
	u32 feat = adapter->adapter_features;
	u32 feat = adapter->adapter_features;
@@ -983,15 +982,14 @@ static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req,
		return 0;
		return 0;
	}
	}


	bytes = zfcp_qdio_sbals_from_sg(adapter->qdio, &req->qdio_req,
	bytes = zfcp_qdio_sbals_from_sg(adapter->qdio, &req->qdio_req, sg_req);
					sg_req, max_sbals);
	if (bytes <= 0)
	if (bytes <= 0)
		return -EIO;
		return -EIO;
	req->qtcb->bottom.support.req_buf_length = bytes;
	req->qtcb->bottom.support.req_buf_length = bytes;
	zfcp_qdio_skip_to_last_sbale(&req->qdio_req);
	zfcp_qdio_skip_to_last_sbale(&req->qdio_req);


	bytes = zfcp_qdio_sbals_from_sg(adapter->qdio, &req->qdio_req,
	bytes = zfcp_qdio_sbals_from_sg(adapter->qdio, &req->qdio_req,
					sg_resp, max_sbals);
					sg_resp);
	req->qtcb->bottom.support.resp_buf_length = bytes;
	req->qtcb->bottom.support.resp_buf_length = bytes;
	if (bytes <= 0)
	if (bytes <= 0)
		return -EIO;
		return -EIO;
@@ -1002,11 +1000,11 @@ static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req,
static int zfcp_fsf_setup_ct_els(struct zfcp_fsf_req *req,
static int zfcp_fsf_setup_ct_els(struct zfcp_fsf_req *req,
				 struct scatterlist *sg_req,
				 struct scatterlist *sg_req,
				 struct scatterlist *sg_resp,
				 struct scatterlist *sg_resp,
				 int max_sbals, unsigned int timeout)
				 unsigned int timeout)
{
{
	int ret;
	int ret;


	ret = zfcp_fsf_setup_ct_els_sbals(req, sg_req, sg_resp, max_sbals);
	ret = zfcp_fsf_setup_ct_els_sbals(req, sg_req, sg_resp);
	if (ret)
	if (ret)
		return ret;
		return ret;


@@ -1046,8 +1044,7 @@ int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port,
	}
	}


	req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
	req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
	ret = zfcp_fsf_setup_ct_els(req, ct->req, ct->resp,
	ret = zfcp_fsf_setup_ct_els(req, ct->req, ct->resp, timeout);
				    ZFCP_FSF_MAX_SBALS_PER_REQ, timeout);
	if (ret)
	if (ret)
		goto failed_send;
		goto failed_send;


@@ -1143,7 +1140,10 @@ int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id,
	}
	}


	req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
	req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
	ret = zfcp_fsf_setup_ct_els(req, els->req, els->resp, 2, timeout);

	zfcp_qdio_sbal_limit(qdio, &req->qdio_req, 2);

	ret = zfcp_fsf_setup_ct_els(req, els->req, els->resp, timeout);


	if (ret)
	if (ret)
		goto failed_send;
		goto failed_send;
@@ -2259,20 +2259,9 @@ int zfcp_fsf_send_fcp_command_task(struct zfcp_unit *unit,
	zfcp_fc_scsi_to_fcp(fcp_cmnd, scsi_cmnd);
	zfcp_fc_scsi_to_fcp(fcp_cmnd, scsi_cmnd);


	real_bytes = zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req,
	real_bytes = zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req,
					     scsi_sglist(scsi_cmnd),
					     scsi_sglist(scsi_cmnd));
					     ZFCP_FSF_MAX_SBALS_PER_REQ);
	if (unlikely(real_bytes < 0))
	if (unlikely(real_bytes < 0)) {
		if (req->qdio_req.sbal_number >= ZFCP_FSF_MAX_SBALS_PER_REQ) {
			dev_err(&adapter->ccw_device->dev,
				"Oversize data package, unit 0x%016Lx "
				"on port 0x%016Lx closed\n",
				(unsigned long long)unit->fcp_lun,
				(unsigned long long)unit->port->wwpn);
			zfcp_erp_unit_shutdown(unit, 0, "fssfct1", req);
			retval = -EINVAL;
		}
		goto failed_scsi_cmnd;
		goto failed_scsi_cmnd;
	}


	retval = zfcp_fsf_req_send(req);
	retval = zfcp_fsf_req_send(req);
	if (unlikely(retval))
	if (unlikely(retval))
@@ -2391,9 +2380,8 @@ struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter,
	bottom->operation_subtype = FSF_CFDC_OPERATION_SUBTYPE;
	bottom->operation_subtype = FSF_CFDC_OPERATION_SUBTYPE;
	bottom->option = fsf_cfdc->option;
	bottom->option = fsf_cfdc->option;


	bytes = zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req,
	bytes = zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, fsf_cfdc->sg);
					fsf_cfdc->sg,

					ZFCP_FSF_MAX_SBALS_PER_REQ);
	if (bytes != ZFCP_CFDC_MAX_SIZE) {
	if (bytes != ZFCP_CFDC_MAX_SIZE) {
		zfcp_fsf_req_free(req);
		zfcp_fsf_req_free(req);
		goto out;
		goto out;
+0 −8
Original line number Original line Diff line number Diff line
@@ -151,14 +151,6 @@
/* fc service class */
/* fc service class */
#define FSF_CLASS_3				0x00000003
#define FSF_CLASS_3				0x00000003


/* SBAL chaining */
#define ZFCP_FSF_MAX_SBALS_PER_REQ		36

/* max. number of (data buffer) SBALEs in largest SBAL chain
 * request ID + QTCB in SBALE 0 + 1 of first SBAL in chain   */
#define ZFCP_FSF_MAX_SBALES_PER_REQ	\
	(ZFCP_FSF_MAX_SBALS_PER_REQ * ZFCP_QDIO_MAX_SBALES_PER_SBAL - 2)

/* logging space behind QTCB */
/* logging space behind QTCB */
#define FSF_QTCB_LOG_SIZE			1024
#define FSF_QTCB_LOG_SIZE			1024


+2 −13
Original line number Original line Diff line number Diff line
@@ -141,15 +141,6 @@ static void zfcp_qdio_int_resp(struct ccw_device *cdev, unsigned int qdio_err,
	zfcp_qdio_resp_put_back(qdio, count);
	zfcp_qdio_resp_put_back(qdio, count);
}
}


static void zfcp_qdio_sbal_limit(struct zfcp_qdio *qdio,
				 struct zfcp_qdio_req *q_req, int max_sbals)
{
	int count = atomic_read(&qdio->req_q.count);
	count = min(count, max_sbals);
	q_req->sbal_limit = (q_req->sbal_first + count - 1)
					% QDIO_MAX_BUFFERS_PER_Q;
}

static struct qdio_buffer_element *
static struct qdio_buffer_element *
zfcp_qdio_sbal_chain(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
zfcp_qdio_sbal_chain(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
{
{
@@ -173,6 +164,7 @@ zfcp_qdio_sbal_chain(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)


	/* keep this requests number of SBALs up-to-date */
	/* keep this requests number of SBALs up-to-date */
	q_req->sbal_number++;
	q_req->sbal_number++;
	BUG_ON(q_req->sbal_number > ZFCP_QDIO_MAX_SBALS_PER_REQ);


	/* start at first SBALE of new SBAL */
	/* start at first SBALE of new SBAL */
	q_req->sbale_curr = 0;
	q_req->sbale_curr = 0;
@@ -213,14 +205,11 @@ static void zfcp_qdio_undo_sbals(struct zfcp_qdio *qdio,
 * Returns: number of bytes, or error (negativ)
 * Returns: number of bytes, or error (negativ)
 */
 */
int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
			    struct scatterlist *sg, int max_sbals)
			    struct scatterlist *sg)
{
{
	struct qdio_buffer_element *sbale;
	struct qdio_buffer_element *sbale;
	int bytes = 0;
	int bytes = 0;


	/* figure out last allowed SBAL */
	zfcp_qdio_sbal_limit(qdio, q_req, max_sbals);

	/* set storage-block type for this request */
	/* set storage-block type for this request */
	sbale = zfcp_qdio_sbale_req(qdio, q_req);
	sbale = zfcp_qdio_sbale_req(qdio, q_req);
	sbale->flags |= q_req->sbtype;
	sbale->flags |= q_req->sbtype;
+28 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,14 @@
/* index of last SBALE (with respect to DMQ bug workaround) */
/* index of last SBALE (with respect to DMQ bug workaround) */
#define ZFCP_QDIO_LAST_SBALE_PER_SBAL	(ZFCP_QDIO_MAX_SBALES_PER_SBAL - 1)
#define ZFCP_QDIO_LAST_SBALE_PER_SBAL	(ZFCP_QDIO_MAX_SBALES_PER_SBAL - 1)


/* Max SBALS for chaining */
#define ZFCP_QDIO_MAX_SBALS_PER_REQ	36

/* max. number of (data buffer) SBALEs in largest SBAL chain
 * request ID + QTCB in SBALE 0 + 1 of first SBAL in chain   */
#define ZFCP_QDIO_MAX_SBALES_PER_REQ     \
	(ZFCP_QDIO_MAX_SBALS_PER_REQ * ZFCP_QDIO_MAX_SBALES_PER_SBAL - 2)

/**
/**
 * struct zfcp_qdio_queue - qdio queue buffer, zfcp index and free count
 * struct zfcp_qdio_queue - qdio queue buffer, zfcp index and free count
 * @sbal: qdio buffers
 * @sbal: qdio buffers
@@ -134,10 +142,14 @@ void zfcp_qdio_req_init(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
			unsigned long req_id, u32 sbtype, void *data, u32 len)
			unsigned long req_id, u32 sbtype, void *data, u32 len)
{
{
	struct qdio_buffer_element *sbale;
	struct qdio_buffer_element *sbale;
	int count = min(atomic_read(&qdio->req_q.count),
			ZFCP_QDIO_MAX_SBALS_PER_REQ);


	q_req->sbal_first = q_req->sbal_last = qdio->req_q.first;
	q_req->sbal_first = q_req->sbal_last = qdio->req_q.first;
	q_req->sbal_number = 1;
	q_req->sbal_number = 1;
	q_req->sbtype = sbtype;
	q_req->sbtype = sbtype;
	q_req->sbal_limit = (q_req->sbal_first + count - 1)
					% QDIO_MAX_BUFFERS_PER_Q;


	sbale = zfcp_qdio_sbale_req(qdio, q_req);
	sbale = zfcp_qdio_sbale_req(qdio, q_req);
	sbale->addr = (void *) req_id;
	sbale->addr = (void *) req_id;
@@ -210,4 +222,20 @@ void zfcp_qdio_skip_to_last_sbale(struct zfcp_qdio_req *q_req)
	q_req->sbale_curr = ZFCP_QDIO_LAST_SBALE_PER_SBAL;
	q_req->sbale_curr = ZFCP_QDIO_LAST_SBALE_PER_SBAL;
}
}


/**
 * zfcp_qdio_sbal_limit - set the sbal limit for a request in q_req
 * @qdio: pointer to struct zfcp_qdio
 * @q_req: The current zfcp_qdio_req
 * @max_sbals: maximum number of SBALs allowed
 */
static inline
void zfcp_qdio_sbal_limit(struct zfcp_qdio *qdio,
			  struct zfcp_qdio_req *q_req, int max_sbals)
{
	int count = min(atomic_read(&qdio->req_q.count), max_sbals);

	q_req->sbal_limit = (q_req->sbal_first + count - 1) %
				QDIO_MAX_BUFFERS_PER_Q;
}

#endif /* ZFCP_QDIO_H */
#endif /* ZFCP_QDIO_H */
Loading