Whamcloud - gitweb
LU-11697 ost: do not reuse T10PI guards of unaligned page write 52/33752/6
authorLi Xi <lixi@ddn.com>
Thu, 29 Nov 2018 14:51:44 +0000 (09:51 -0500)
committerOleg Drokin <green@whamcloud.com>
Tue, 4 Dec 2018 23:21:17 +0000 (23:21 +0000)
If the write is partial page, the guards of RPC checksum should not
be reused for bio submission since the data might not be full-sector.
The bio guards will be generated later based on the full sectors. If
the sector size is 512B rather than 4 KB, or the page size on OST is
larger than 4KB, this might drop some useful guards for partial page
write, but it will only add minimal extra time of checksum calculation.

Change-Id: I868342df87c28ea91f5f8364fe377277595ecf6d
Signed-off-by: Li Xi <lixi@ddn.com>
Reviewed-on: https://review.whamcloud.com/33752
Tested-by: Jenkins
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/target/tgt_handler.c

index e60df76..64c0052 100644 (file)
@@ -2034,8 +2034,18 @@ static int tgt_checksum_niobuf_t10pi(struct lu_target *tgt,
                }
 
                LASSERT(used <= MAX_GUARD_NUMBER);
-               /* If disk support T10PI checksum, copy guards to local_nb */
-               if (t10_cksum_type && opc == OST_WRITE) {
+               /*
+                * If disk support T10PI checksum, copy guards to local_nb.
+                * If the write is partial page, do not use the guards for bio
+                * submission since the data might not be full-sector. The bio
+                * guards will be generated later based on the full sectors. If
+                * the sector size is 512B rather than 4 KB, or the page size
+                * is larger than 4KB, this might drop some useful guards for
+                * partial page write, but it will only add minimal extra time
+                * of checksum calculation.
+                */
+               if (t10_cksum_type && opc == OST_WRITE &&
+                   local_nb[i].lnb_len == PAGE_SIZE) {
                        local_nb[i].lnb_guard_rpc = 1;
                        memcpy(local_nb[i].lnb_guards,
                               guard_start + used_number,