This patch adds sg_init_table() calls in order
to have proper sg list initialization including
magics, tables sizes, etc.
Without it, when using kernels with CONFIG_DEBUG_SG
option, the following crash can happen:
kernel BUG at include/linux/scatterlist.h:65!
invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC
last sysfs file: /sys/devices/system/cpu/online
CPU 0
Pid: 4911, comm: ptlrpcd_3 Not tainted 2.6.32-431 #7 /D525MWV
RIP: 0010:[<
ffffffffa0b60170>] [<
ffffffffa0b60170>] krb5_make_checksum+0x750/0x770 [ptlrpc_gss]
Change-Id: Ic6c52c8b15393d8d7f67f4bf675c1f57cf27004a
Signed-off-by: Andrew Perepechko <andrew.perepechko@seagate.com>
Reviewed-on: http://review.whamcloud.com/13631
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Nathaniel Clark <nathaniel.l.clark@intel.com>
if (iovs[i].kiov_len == 0)
continue;
if (iovs[i].kiov_len == 0)
continue;
sg_set_page(&sg[0], iovs[i].kiov_page, iovs[i].kiov_len,
iovs[i].kiov_offset);
crypto_hash_update(&desc, sg, iovs[i].kiov_len);
sg_set_page(&sg[0], iovs[i].kiov_page, iovs[i].kiov_len,
iovs[i].kiov_offset);
crypto_hash_update(&desc, sg, iovs[i].kiov_len);
if (iovs[i].kiov_len == 0)
continue;
if (iovs[i].kiov_len == 0)
continue;
sg_set_page(&sg[0], iovs[i].kiov_page, iovs[i].kiov_len,
iovs[i].kiov_offset);
crypto_hash_update(&desc, sg, iovs[i].kiov_len);
sg_set_page(&sg[0], iovs[i].kiov_page, iovs[i].kiov_len,
iovs[i].kiov_offset);
crypto_hash_update(&desc, sg, iovs[i].kiov_len);
/* encrypt clear pages */
for (i = 0; i < desc->bd_iov_count; i++) {
/* encrypt clear pages */
for (i = 0; i < desc->bd_iov_count; i++) {
+ sg_init_table(&src, 1);
sg_set_page(&src, desc->bd_iov[i].kiov_page,
(desc->bd_iov[i].kiov_len + blocksize - 1) &
(~(blocksize - 1)),
desc->bd_iov[i].kiov_offset);
if (adj_nob)
nob += src.length;
sg_set_page(&src, desc->bd_iov[i].kiov_page,
(desc->bd_iov[i].kiov_len + blocksize - 1) &
(~(blocksize - 1)),
desc->bd_iov[i].kiov_offset);
if (adj_nob)
nob += src.length;
+ sg_init_table(&dst, 1);
sg_set_page(&dst, desc->bd_enc_iov[i].kiov_page, src.length,
src.offset);
sg_set_page(&dst, desc->bd_enc_iov[i].kiov_page, src.length,
src.offset);
if (desc->bd_enc_iov[i].kiov_len == 0)
continue;
if (desc->bd_enc_iov[i].kiov_len == 0)
continue;
+ sg_init_table(&src, 1);
sg_set_page(&src, desc->bd_enc_iov[i].kiov_page,
desc->bd_enc_iov[i].kiov_len,
desc->bd_enc_iov[i].kiov_offset);
sg_set_page(&src, desc->bd_enc_iov[i].kiov_page,
desc->bd_enc_iov[i].kiov_len,
desc->bd_enc_iov[i].kiov_offset);