X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_integrity.c;fp=lustre%2Fosd-ldiskfs%2Fosd_integrity.c;h=0c1412f50f4dc0e1e9c6e8957ef8ebe6a0319e78;hp=56d632c0dd4ba9ef4a64004c993acd735df1eeb3;hb=7fdd664b3518e5e8d8a243898d48d9c62c22e18a;hpb=75ebfb994fb0bce8a0f0400429f04127ead50ea4 diff --git a/lustre/osd-ldiskfs/osd_integrity.c b/lustre/osd-ldiskfs/osd_integrity.c index 56d632c..0c1412f 100644 --- a/lustre/osd-ldiskfs/osd_integrity.c +++ b/lustre/osd-ldiskfs/osd_integrity.c @@ -69,10 +69,13 @@ static struct niobuf_local *find_lnb(struct blk_integrity_exchg *bix) /* * Type 1 and Type 2 protection use the same format: 16 bit guard tag, - * 16 bit app tag, 32 bit reference tag. + * 16 bit app tag, 32 bit reference tag (sector number). + * + * Type 3 protection has a 16-bit guard tag and 16 + 32 bits of opaque + * tag space. */ -static void osd_dif_type1_generate(struct blk_integrity_exchg *bix, - obd_dif_csum_fn *fn) +static void osd_dif_generate(struct blk_integrity_exchg *bix, + obd_dif_csum_fn *fn, enum osd_t10_type type) { void *buf = bix->data_buf; struct sd_dif_tuple *sdt = bix->prot_buf; @@ -81,32 +84,28 @@ static void osd_dif_type1_generate(struct blk_integrity_exchg *bix, sector_t sector = bix->sector; unsigned int i; + ENTRY; for (i = 0 ; i < bix->data_size ; i += bix->sector_size, sdt++) { if (lnb && lnb->lnb_guard_rpc) { sdt->guard_tag = *guard_buf; guard_buf++; - } else + } else { sdt->guard_tag = fn(buf, bix->sector_size); - sdt->ref_tag = cpu_to_be32(sector & 0xffffffff); + } sdt->app_tag = 0; + if (type == OSD_T10_TYPE1) + sdt->ref_tag = cpu_to_be32(sector & 0xffffffff); + else /* if (type == OSD_T10_TYPE3) */ + sdt->ref_tag = 0; buf += bix->sector_size; sector++; } + RETURN_EXIT; } -static void osd_dif_type1_generate_crc(struct blk_integrity_exchg *bix) -{ - osd_dif_type1_generate(bix, obd_dif_crc_fn); -} - -static void osd_dif_type1_generate_ip(struct blk_integrity_exchg *bix) -{ - osd_dif_type1_generate(bix, obd_dif_ip_fn); -} - -static int osd_dif_type1_verify(struct blk_integrity_exchg *bix, - obd_dif_csum_fn *fn) +static int osd_dif_verify(struct blk_integrity_exchg *bix, + obd_dif_csum_fn *fn, enum osd_t10_type type) { void *buf = bix->data_buf; struct sd_dif_tuple *sdt = bix->prot_buf; @@ -116,25 +115,33 @@ static int osd_dif_type1_verify(struct blk_integrity_exchg *bix, unsigned int i; __u16 csum; + ENTRY; for (i = 0 ; i < bix->data_size ; i += bix->sector_size, sdt++) { - /* Unwritten sectors */ - if (sdt->app_tag == 0xffff) - return 0; - - if (be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) { - CERROR("%s: ref tag error on sector %lu (rcvd %u)\n", - bix->disk_name, (unsigned long)sector, - be32_to_cpu(sdt->ref_tag)); - return -EIO; + if (type == OSD_T10_TYPE1) { + /* Unwritten sectors */ + if (sdt->app_tag == 0xffff) + RETURN(0); + + if (be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) { + CERROR("%s: ref tag error on sector %lu (rcvd %u): rc = %d\n", + bix->disk_name, (unsigned long)sector, + be32_to_cpu(sdt->ref_tag), -EIO); + return -EIO; + } + } else /* if (type == OSD_T10_TYPE3) */ { + /* Unwritten sectors */ + if (sdt->app_tag == 0xffff && + sdt->ref_tag == 0xffffffff) + RETURN(0); } csum = fn(buf, bix->sector_size); if (sdt->guard_tag != csum) { - CERROR("%s: guard tag error on sector %lu " \ - "(rcvd %04x, data %04x)\n", bix->disk_name, - (unsigned long)sector, - be16_to_cpu(sdt->guard_tag), be16_to_cpu(csum)); + CERROR("%s: guard tag error on sector %lu (rcvd %04x, data %04x): rc = %d\n", + bix->disk_name, (unsigned long)sector, + be16_to_cpu(sdt->guard_tag), be16_to_cpu(csum), + -EIO); return -EIO; } @@ -149,103 +156,48 @@ static int osd_dif_type1_verify(struct blk_integrity_exchg *bix, if (lnb) lnb->lnb_guard_disk = 1; - return 0; -} -static int osd_dif_type1_verify_crc(struct blk_integrity_exchg *bix) -{ - return osd_dif_type1_verify(bix, obd_dif_crc_fn); + RETURN(0); } -static int osd_dif_type1_verify_ip(struct blk_integrity_exchg *bix) +static void osd_dif_type1_generate_crc(struct blk_integrity_exchg *bix) { - return osd_dif_type1_verify(bix, obd_dif_ip_fn); + osd_dif_generate(bix, obd_dif_crc_fn, OSD_T10_TYPE1); } -/* - * Type 3 protection has a 16-bit guard tag and 16 + 32 bits of opaque - * tag space. - */ -static void osd_dif_type3_generate(struct blk_integrity_exchg *bix, - obd_dif_csum_fn *fn) +static void osd_dif_type1_generate_ip(struct blk_integrity_exchg *bix) { - void *buf = bix->data_buf; - struct sd_dif_tuple *sdt = bix->prot_buf; - struct niobuf_local *lnb = find_lnb(bix); - __u16 *guard_buf = lnb ? lnb->lnb_guards : NULL; - unsigned int i; - - for (i = 0 ; i < bix->data_size ; i += bix->sector_size, sdt++) { - if (lnb && lnb->lnb_guard_rpc) { - sdt->guard_tag = *guard_buf; - guard_buf++; - } else - sdt->guard_tag = fn(buf, bix->sector_size); - sdt->ref_tag = 0; - sdt->app_tag = 0; - - buf += bix->sector_size; - } + osd_dif_generate(bix, obd_dif_ip_fn, OSD_T10_TYPE1); } static void osd_dif_type3_generate_crc(struct blk_integrity_exchg *bix) { - osd_dif_type3_generate(bix, obd_dif_crc_fn); + osd_dif_generate(bix, obd_dif_crc_fn, OSD_T10_TYPE3); } static void osd_dif_type3_generate_ip(struct blk_integrity_exchg *bix) { - osd_dif_type3_generate(bix, obd_dif_ip_fn); + osd_dif_generate(bix, obd_dif_ip_fn, OSD_T10_TYPE3); } -static int osd_dif_type3_verify(struct blk_integrity_exchg *bix, - obd_dif_csum_fn *fn) +static int osd_dif_type1_verify_crc(struct blk_integrity_exchg *bix) { - void *buf = bix->data_buf; - struct sd_dif_tuple *sdt = bix->prot_buf; - struct niobuf_local *lnb = find_lnb(bix); - __u16 *guard_buf = lnb ? lnb->lnb_guards : NULL; - sector_t sector = bix->sector; - unsigned int i; - __u16 csum; - - for (i = 0 ; i < bix->data_size ; i += bix->sector_size, sdt++) { - /* Unwritten sectors */ - if (sdt->app_tag == 0xffff && sdt->ref_tag == 0xffffffff) - return 0; - - csum = fn(buf, bix->sector_size); - - if (sdt->guard_tag != csum) { - CERROR("%s: guard tag error on sector %lu " \ - "(rcvd %04x, data %04x)\n", bix->disk_name, - (unsigned long)sector, - be16_to_cpu(sdt->guard_tag), be16_to_cpu(csum)); - return -EIO; - } - - if (guard_buf) { - *guard_buf = csum; - guard_buf++; - } - - buf += bix->sector_size; - sector++; - } + return osd_dif_verify(bix, obd_dif_crc_fn, OSD_T10_TYPE1); +} - if (lnb) - lnb->lnb_guard_disk = 1; - return 0; +static int osd_dif_type1_verify_ip(struct blk_integrity_exchg *bix) +{ + return osd_dif_verify(bix, obd_dif_ip_fn, OSD_T10_TYPE1); } static int osd_dif_type3_verify_crc(struct blk_integrity_exchg *bix) { - return osd_dif_type3_verify(bix, obd_dif_crc_fn); + return osd_dif_verify(bix, obd_dif_crc_fn, OSD_T10_TYPE3); } static int osd_dif_type3_verify_ip(struct blk_integrity_exchg *bix) { - return osd_dif_type3_verify(bix, obd_dif_ip_fn); + return osd_dif_verify(bix, obd_dif_ip_fn, OSD_T10_TYPE3); } int osd_get_integrity_profile(struct osd_device *osd,