]> Pileus Git - ~andy/linux/blobdiff - drivers/target/target_core_sbc.c
Merge tag 'sunxi-fixes-for-3.14' of https://github.com/mripard/linux into fixes
[~andy/linux] / drivers / target / target_core_sbc.c
index 75364c7f6219b065548c64ef9f2caa86e9fd074d..a4489444ffbc640d940869ca7de305b2ae6c4b58 100644 (file)
@@ -1074,12 +1074,19 @@ sbc_dif_copy_prot(struct se_cmd *cmd, unsigned int sectors, bool read,
        struct scatterlist *psg;
        void *paddr, *addr;
        unsigned int i, len, left;
+       unsigned int offset = 0;
 
        left = sectors * dev->prot_length;
 
        for_each_sg(cmd->t_prot_sg, psg, cmd->t_prot_nents, i) {
 
                len = min(psg->length, left);
+               if (offset >= sg->length) {
+                       sg = sg_next(sg);
+                       offset = 0;
+                       sg_off = sg->offset;
+               }
+
                paddr = kmap_atomic(sg_page(psg)) + psg->offset;
                addr = kmap_atomic(sg_page(sg)) + sg_off;
 
@@ -1089,6 +1096,7 @@ sbc_dif_copy_prot(struct se_cmd *cmd, unsigned int sectors, bool read,
                        memcpy(addr, paddr, len);
 
                left -= len;
+               offset += len;
                kunmap_atomic(paddr);
                kunmap_atomic(addr);
        }
@@ -1131,6 +1139,7 @@ sbc_dif_verify_write(struct se_cmd *cmd, sector_t start, unsigned int sectors,
                        if (rc) {
                                kunmap_atomic(paddr);
                                kunmap_atomic(daddr);
+                               cmd->bad_sector = sector;
                                return rc;
                        }
 
@@ -1191,6 +1200,7 @@ sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors,
                        if (rc) {
                                kunmap_atomic(paddr);
                                kunmap_atomic(daddr);
+                               cmd->bad_sector = sector;
                                return rc;
                        }