On Mon, 2014-04-07 at 10:36 +0300, Sagi Grimberg wrote:
> On 4/3/2014 12:35 PM, Nicholas A. Bellinger wrote:
> > From: Nicholas Bellinger <[email protected]>
> >
> > This patch adds WRITE_INSERT emulation within target-core
> > using TYPE1 / TYPE3 PI modes.
> >
> > This is useful in order for existing legacy fabrics that do not
> > support protection offloads to interact with backend devices that
> > currently 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_sbc.c     |   44 
> > ++++++++++++++++++++++++++++++++++
> >   include/target/target_core_backend.h |    1 +
> >   2 files changed, 45 insertions(+)
> >
> > diff --git a/drivers/target/target_core_sbc.c 
> > b/drivers/target/target_core_sbc.c
> > index f2d73dd..97b207d 100644
> > --- a/drivers/target/target_core_sbc.c
> > +++ b/drivers/target/target_core_sbc.c
> > @@ -1096,6 +1096,50 @@ err:
> >   }
> >   EXPORT_SYMBOL(sbc_execute_unmap);
> >   
> > +void
> > +sbc_dif_write_insert(struct se_cmd *cmd)
> 
> Better to call it sbc_dif_generate()

Changed to sbc_dif_generate().

> 
> > +{
> > +   struct se_device *dev = cmd->se_dev;
> > +   struct se_dif_v1_tuple *sdt;
> > +   struct scatterlist *dsg, *psg = cmd->t_prot_sg;
> > +   sector_t sector = cmd->t_task_lba;
> > +   void *daddr, *paddr;
> > +   int i, j, offset = 0;
> > +
> > +   for_each_sg(cmd->t_data_sg, dsg, cmd->t_data_nents, i) {
> > +           daddr = kmap_atomic(sg_page(dsg)) + dsg->offset;
> > +           paddr = kmap_atomic(sg_page(psg)) + psg->offset;
> > +
> > +           for (j = 0; j < dsg->length; j += dev->dev_attrib.block_size) {
> > +
> > +                   if (offset >= psg->length) {
> > +                           kunmap_atomic(paddr);
> > +                           psg = sg_next(psg);
> > +                           paddr = kmap_atomic(sg_page(psg)) + psg->offset;
> > +                           offset = 0;
> > +                   }
> > +
> > +                   sdt = paddr + offset;
> > +                   sdt->guard_tag = cpu_to_be16(crc_t10dif(daddr + j,
> > +                                           dev->dev_attrib.block_size));
> > +                   if (dev->dev_attrib.pi_prot_type == 
> > TARGET_DIF_TYPE1_PROT)
> > +                           sdt->ref_tag = cpu_to_be32(sector & 0xffffffff);
> > +                   sdt->app_tag = 0;
> > +
> > +                   pr_debug("DIF WRITE INSERT sector: %llu guard_tag: 
> > 0x%04x"
> > +                            " app_tag: 0x%04x ref_tag: %u\n",
> > +                            (unsigned long long)sector, sdt->guard_tag,
> > +                            sdt->app_tag, be32_to_cpu(sdt->ref_tag));
> > +
> > +                   sector++;
> > +                   offset += sizeof(struct se_dif_v1_tuple);
> > +           }
> > +
> > +           kunmap_atomic(paddr);
> > +           kunmap_atomic(daddr);
> > +   }
> > +}
> 
> Seems like a substantial code duplication here, can't you reuse the code 
> from verify?
> Maybe use this function also from verify (call generate() and then do 
> compare to t_prot_sg).

Yeah, there are a few differences between the two cases, and I stopped
short of merging them together for the moment.

Should be a pretty straight-forward post -rc1 change to make this into
common code.

--nab

--
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

Reply via email to