On Mon, 2014-04-07 at 10:49 +0300, Sagi Grimberg wrote:
> On 4/3/2014 12:35 PM, Nicholas A. Bellinger wrote:
> > From: Nicholas Bellinger <[email protected]>
> >
> > This patch enables the use of READ_STRIP software emulation in
> > target_complete_ok_work() code for I/O READs.
> >
> > This is useful when the fabric does not support READ_STRIP hardware
> > offload, but would still like to interact with backend device
> > that have T10 PI enabled.
> >
> > Cc: Martin K. Petersen <[email protected]>
> > Cc: Sagi Grimberg <[email protected]>
> > Cc: Or Gerlitz <[email protected]>
> > Cc: Quinn Tran <[email protected]>
> > Cc: Giridhar Malavali <[email protected]>
> > Signed-off-by: Nicholas Bellinger <[email protected]>
> > ---
> > drivers/target/target_core_transport.c | 33
> > ++++++++++++++++++++++++++++++++
> > 1 file changed, 33 insertions(+)
> >
> > diff --git a/drivers/target/target_core_transport.c
> > b/drivers/target/target_core_transport.c
> > index 530a9e8..a184103 100644
> > --- a/drivers/target/target_core_transport.c
> > +++ b/drivers/target/target_core_transport.c
> > @@ -1905,6 +1905,24 @@ static void transport_handle_queue_full(
> > schedule_work(&cmd->se_dev->qf_work_queue);
> > }
> >
> > +static bool target_check_read_strip(struct se_cmd *cmd)
> > +{
> > + sense_reason_t rc;
> > +
> > + if (cmd->prot_op != TARGET_PROT_DIN_STRIP)
> > + return false;
> > +
> > + if (!(cmd->se_sess->sup_prot_ops & TARGET_PROT_DIN_STRIP)) {
> > + rc = sbc_dif_read_strip(cmd);
> > + if (rc) {
> > + cmd->pi_err = rc;
> > + return true;
> > + }
> > + }
> > +
> > + return false;
> > +}
> > +
> > static void target_complete_ok_work(struct work_struct *work)
> > {
> > struct se_cmd *cmd = container_of(work, struct se_cmd, work);
> > @@ -1969,6 +1987,21 @@ static void target_complete_ok_work(struct
> > work_struct *work)
> > cmd->data_length;
> > }
> > spin_unlock(&cmd->se_lun->lun_sep_lock);
> > + /*
> > + * Perform READ_STRIP of PI using software emulation when
> > + * backend had PI enabled, if the transport will not be
> > + * performing hardware READ_STRIP offload.
> > + */
>
> You always call read_strip() even if the operation is not READ_STRIP
> (the routine won't do anything in this case).
> Personally, I usually prefer to avoid calling a routine rather then
> calling it and perform the checks there.
>
> I suggest:
>
> if (cmd->prot_op == TARGET_PROT_DIN_STRIP &&
> target_check_read_strip(cmd)) {
> ret = transport_send_check_condition_and_sense(cmd, cmd->pi_err, 0);
> ...
> }
>
>
Yep, this was done to save the indention in transport_complete_work_ok()
from being too obnoxious..
Squashing the following incremental patch into the original.
Thanks Sagi!
--nab
diff --git a/drivers/target/target_core_transport.c
b/drivers/target/target_core_transport.c
index 673a72d..d4b9869 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -1909,9 +1909,6 @@ static bool target_check_read_strip(struct se_cmd *cmd)
{
sense_reason_t rc;
- if (cmd->prot_op != TARGET_PROT_DIN_STRIP)
- return false;
-
if (!(cmd->se_sess->sup_prot_ops & TARGET_PROT_DIN_STRIP)) {
rc = sbc_dif_read_strip(cmd);
if (rc) {
@@ -1992,7 +1989,8 @@ static void target_complete_ok_work(struct work_struct
*work)
* backend had PI enabled, if the transport will not be
* performing hardware READ_STRIP offload.
*/
- if (target_check_read_strip(cmd)) {
+ if (cmd->prot_op == TARGET_PROT_DIN_STRIP &&
+ target_check_read_strip(cmd)) {
ret = transport_send_check_condition_and_sense(cmd,
cmd->pi_err, 0);
if (ret == -EAGAIN || ret == -ENOMEM)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html