|
@@ -1371,9 +1371,9 @@ int drbd_submit_peer_request(struct drbd_device *device,
|
|
|
struct bio *bio;
|
|
|
struct page *page = peer_req->pages;
|
|
|
sector_t sector = peer_req->i.sector;
|
|
|
- unsigned ds = peer_req->i.size;
|
|
|
+ unsigned data_size = peer_req->i.size;
|
|
|
unsigned n_bios = 0;
|
|
|
- unsigned nr_pages = (ds + PAGE_SIZE -1) >> PAGE_SHIFT;
|
|
|
+ unsigned nr_pages = (data_size + PAGE_SIZE -1) >> PAGE_SHIFT;
|
|
|
int err = -ENOMEM;
|
|
|
|
|
|
if (peer_req->flags & EE_IS_TRIM_USE_ZEROOUT) {
|
|
@@ -1388,7 +1388,7 @@ int drbd_submit_peer_request(struct drbd_device *device,
|
|
|
list_add_tail(&peer_req->w.list, &device->active_ee);
|
|
|
spin_unlock_irq(&device->resource->req_lock);
|
|
|
if (blkdev_issue_zeroout(device->ldev->backing_bdev,
|
|
|
- sector, ds >> 9, GFP_NOIO))
|
|
|
+ sector, data_size >> 9, GFP_NOIO))
|
|
|
peer_req->flags |= EE_WAS_ERROR;
|
|
|
drbd_endio_write_sec_final(peer_req);
|
|
|
return 0;
|
|
@@ -1426,12 +1426,12 @@ next_bio:
|
|
|
++n_bios;
|
|
|
|
|
|
if (rw & REQ_DISCARD) {
|
|
|
- bio->bi_iter.bi_size = ds;
|
|
|
+ bio->bi_iter.bi_size = data_size;
|
|
|
goto submit;
|
|
|
}
|
|
|
|
|
|
page_chain_for_each(page) {
|
|
|
- unsigned len = min_t(unsigned, ds, PAGE_SIZE);
|
|
|
+ unsigned len = min_t(unsigned, data_size, PAGE_SIZE);
|
|
|
if (!bio_add_page(bio, page, len, 0)) {
|
|
|
/* A single page must always be possible!
|
|
|
* But in case it fails anyways,
|
|
@@ -1446,11 +1446,11 @@ next_bio:
|
|
|
}
|
|
|
goto next_bio;
|
|
|
}
|
|
|
- ds -= len;
|
|
|
+ data_size -= len;
|
|
|
sector += len >> 9;
|
|
|
--nr_pages;
|
|
|
}
|
|
|
- D_ASSERT(device, ds == 0);
|
|
|
+ D_ASSERT(device, data_size == 0);
|
|
|
submit:
|
|
|
D_ASSERT(device, page == NULL);
|
|
|
|
|
@@ -1591,24 +1591,24 @@ read_in_block(struct drbd_peer_device *peer_device, u64 id, sector_t sector,
|
|
|
const sector_t capacity = drbd_get_capacity(device->this_bdev);
|
|
|
struct drbd_peer_request *peer_req;
|
|
|
struct page *page;
|
|
|
- int dgs, ds, err;
|
|
|
- unsigned int data_size = pi->size;
|
|
|
+ int digest_size, err;
|
|
|
+ unsigned int data_size = pi->size, ds;
|
|
|
void *dig_in = peer_device->connection->int_dig_in;
|
|
|
void *dig_vv = peer_device->connection->int_dig_vv;
|
|
|
unsigned long *data;
|
|
|
struct p_trim *trim = (pi->cmd == P_TRIM) ? pi->data : NULL;
|
|
|
|
|
|
- dgs = 0;
|
|
|
+ digest_size = 0;
|
|
|
if (!trim && peer_device->connection->peer_integrity_tfm) {
|
|
|
- dgs = crypto_hash_digestsize(peer_device->connection->peer_integrity_tfm);
|
|
|
+ digest_size = crypto_hash_digestsize(peer_device->connection->peer_integrity_tfm);
|
|
|
/*
|
|
|
* FIXME: Receive the incoming digest into the receive buffer
|
|
|
* here, together with its struct p_data?
|
|
|
*/
|
|
|
- err = drbd_recv_all_warn(peer_device->connection, dig_in, dgs);
|
|
|
+ err = drbd_recv_all_warn(peer_device->connection, dig_in, digest_size);
|
|
|
if (err)
|
|
|
return NULL;
|
|
|
- data_size -= dgs;
|
|
|
+ data_size -= digest_size;
|
|
|
}
|
|
|
|
|
|
if (trim) {
|
|
@@ -1661,16 +1661,16 @@ read_in_block(struct drbd_peer_device *peer_device, u64 id, sector_t sector,
|
|
|
ds -= len;
|
|
|
}
|
|
|
|
|
|
- if (dgs) {
|
|
|
+ if (digest_size) {
|
|
|
drbd_csum_ee(peer_device->connection->peer_integrity_tfm, peer_req, dig_vv);
|
|
|
- if (memcmp(dig_in, dig_vv, dgs)) {
|
|
|
+ if (memcmp(dig_in, dig_vv, digest_size)) {
|
|
|
drbd_err(device, "Digest integrity check FAILED: %llus +%u\n",
|
|
|
(unsigned long long)sector, data_size);
|
|
|
drbd_free_peer_req(device, peer_req);
|
|
|
return NULL;
|
|
|
}
|
|
|
}
|
|
|
- device->recv_cnt += data_size>>9;
|
|
|
+ device->recv_cnt += data_size >> 9;
|
|
|
return peer_req;
|
|
|
}
|
|
|
|
|
@@ -1708,17 +1708,17 @@ static int recv_dless_read(struct drbd_peer_device *peer_device, struct drbd_req
|
|
|
struct bio_vec bvec;
|
|
|
struct bvec_iter iter;
|
|
|
struct bio *bio;
|
|
|
- int dgs, err, expect;
|
|
|
+ int digest_size, err, expect;
|
|
|
void *dig_in = peer_device->connection->int_dig_in;
|
|
|
void *dig_vv = peer_device->connection->int_dig_vv;
|
|
|
|
|
|
- dgs = 0;
|
|
|
+ digest_size = 0;
|
|
|
if (peer_device->connection->peer_integrity_tfm) {
|
|
|
- dgs = crypto_hash_digestsize(peer_device->connection->peer_integrity_tfm);
|
|
|
- err = drbd_recv_all_warn(peer_device->connection, dig_in, dgs);
|
|
|
+ digest_size = crypto_hash_digestsize(peer_device->connection->peer_integrity_tfm);
|
|
|
+ err = drbd_recv_all_warn(peer_device->connection, dig_in, digest_size);
|
|
|
if (err)
|
|
|
return err;
|
|
|
- data_size -= dgs;
|
|
|
+ data_size -= digest_size;
|
|
|
}
|
|
|
|
|
|
/* optimistically update recv_cnt. if receiving fails below,
|
|
@@ -1738,9 +1738,9 @@ static int recv_dless_read(struct drbd_peer_device *peer_device, struct drbd_req
|
|
|
data_size -= expect;
|
|
|
}
|
|
|
|
|
|
- if (dgs) {
|
|
|
+ if (digest_size) {
|
|
|
drbd_csum_bio(peer_device->connection->peer_integrity_tfm, bio, dig_vv);
|
|
|
- if (memcmp(dig_in, dig_vv, dgs)) {
|
|
|
+ if (memcmp(dig_in, dig_vv, digest_size)) {
|
|
|
drbd_err(peer_device, "Digest integrity check FAILED. Broken NICs?\n");
|
|
|
return -EINVAL;
|
|
|
}
|
|
@@ -5561,6 +5561,7 @@ int drbd_asender(struct drbd_thread *thi)
|
|
|
* rv < expected: "woken" by signal during receive
|
|
|
* rv == 0 : "connection shut down by peer"
|
|
|
*/
|
|
|
+received_more:
|
|
|
if (likely(rv > 0)) {
|
|
|
received += rv;
|
|
|
buf += rv;
|
|
@@ -5636,6 +5637,11 @@ int drbd_asender(struct drbd_thread *thi)
|
|
|
expect = header_size;
|
|
|
cmd = NULL;
|
|
|
}
|
|
|
+ if (test_bit(SEND_PING, &connection->flags))
|
|
|
+ continue;
|
|
|
+ rv = drbd_recv_short(connection->meta.socket, buf, expect-received, MSG_DONTWAIT);
|
|
|
+ if (rv > 0)
|
|
|
+ goto received_more;
|
|
|
}
|
|
|
|
|
|
if (0) {
|