Commit 5ce765a540f34d1e2005e1210f49f67fdf11e997

Authored by Alex Elder
Committed by Sage Weil
1 parent 340c7a2b2c

libceph: only kunmap kmapped pages

In write_partial_msg_pages(), pages need to be kmapped in order to
perform a CRC-32c calculation on them.  As an artifact of the way
this code used to be structured, the kunmap() call was separated
from the kmap() call and both were done conditionally.  But the
conditions under which the kmap() and kunmap() calls were made
differed, so there was a chance a kunmap() call would be done on a
page that had not been mapped.

The symptom of this was tripping a BUG() in kunmap_high() when
pkmap_count[nr] became 0.

Reported-by: Bryan K. Wright <bryan@virginia.edu>
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>

Showing 1 changed file with 1 additions and 4 deletions Side-by-side Diff

net/ceph/messenger.c
... ... @@ -1073,16 +1073,13 @@
1073 1073 BUG_ON(kaddr == NULL);
1074 1074 base = kaddr + con->out_msg_pos.page_pos + bio_offset;
1075 1075 crc = crc32c(crc, base, len);
  1076 + kunmap(page);
1076 1077 msg->footer.data_crc = cpu_to_le32(crc);
1077 1078 con->out_msg_pos.did_page_crc = true;
1078 1079 }
1079 1080 ret = ceph_tcp_sendpage(con->sock, page,
1080 1081 con->out_msg_pos.page_pos + bio_offset,
1081 1082 len, 1);
1082   -
1083   - if (do_datacrc)
1084   - kunmap(page);
1085   -
1086 1083 if (ret <= 0)
1087 1084 goto out;
1088 1085