Commit fc5be839 authored by Andreas Gruenbacher's avatar Andreas Gruenbacher Committed by Philipp Reisner

drbd: drbd_drain_block(): Return 0 upon success and an error code otherwise

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent 69bc7bc3
...@@ -1379,30 +1379,32 @@ read_in_block(struct drbd_conf *mdev, u64 id, sector_t sector, ...@@ -1379,30 +1379,32 @@ read_in_block(struct drbd_conf *mdev, u64 id, sector_t sector,
static int drbd_drain_block(struct drbd_conf *mdev, int data_size) static int drbd_drain_block(struct drbd_conf *mdev, int data_size)
{ {
struct page *page; struct page *page;
int rr, rv = 1; int rr, err = 0;
void *data; void *data;
if (!data_size) if (!data_size)
return true; return 0;
page = drbd_pp_alloc(mdev, 1, 1); page = drbd_pp_alloc(mdev, 1, 1);
data = kmap(page); data = kmap(page);
while (data_size) { while (data_size) {
rr = drbd_recv(mdev->tconn, data, min_t(int, data_size, PAGE_SIZE)); unsigned int len = min_t(int, data_size, PAGE_SIZE);
if (rr != min_t(int, data_size, PAGE_SIZE)) {
rv = 0; rr = drbd_recv(mdev->tconn, data, len);
if (rr != len) {
if (!signal_pending(current)) if (!signal_pending(current))
dev_warn(DEV, dev_warn(DEV,
"short read receiving data: read %d expected %d\n", "short read receiving data: read %d expected %d\n",
rr, min_t(int, data_size, PAGE_SIZE)); rr, len);
err = (rr < 0) ? rr : -EIO;
break; break;
} }
data_size -= rr; data_size -= rr;
} }
kunmap(page); kunmap(page);
drbd_pp_free(mdev, page, 0); drbd_pp_free(mdev, page, 0);
return rv; return err;
} }
static int recv_dless_read(struct drbd_conf *mdev, struct drbd_request *req, static int recv_dless_read(struct drbd_conf *mdev, struct drbd_request *req,
...@@ -1593,7 +1595,7 @@ static int receive_RSDataReply(struct drbd_conf *mdev, enum drbd_packet cmd, ...@@ -1593,7 +1595,7 @@ static int receive_RSDataReply(struct drbd_conf *mdev, enum drbd_packet cmd,
if (__ratelimit(&drbd_ratelimit_state)) if (__ratelimit(&drbd_ratelimit_state))
dev_err(DEV, "Can not write resync data to local disk.\n"); dev_err(DEV, "Can not write resync data to local disk.\n");
ok = drbd_drain_block(mdev, data_size); ok = !drbd_drain_block(mdev, data_size);
drbd_send_ack_dp(mdev, P_NEG_ACK, p, data_size); drbd_send_ack_dp(mdev, P_NEG_ACK, p, data_size);
} }
...@@ -1979,7 +1981,7 @@ static int receive_Data(struct drbd_conf *mdev, enum drbd_packet cmd, ...@@ -1979,7 +1981,7 @@ static int receive_Data(struct drbd_conf *mdev, enum drbd_packet cmd,
err = wait_for_and_update_peer_seq(mdev, peer_seq); err = wait_for_and_update_peer_seq(mdev, peer_seq);
drbd_send_ack_dp(mdev, P_NEG_ACK, p, data_size); drbd_send_ack_dp(mdev, P_NEG_ACK, p, data_size);
atomic_inc(&mdev->current_epoch->epoch_size); atomic_inc(&mdev->current_epoch->epoch_size);
return drbd_drain_block(mdev, data_size) && err == 0; return !drbd_drain_block(mdev, data_size) && err == 0;
} }
/* /*
...@@ -2188,7 +2190,7 @@ static int receive_DataRequest(struct drbd_conf *mdev, enum drbd_packet cmd, ...@@ -2188,7 +2190,7 @@ static int receive_DataRequest(struct drbd_conf *mdev, enum drbd_packet cmd,
"no local data.\n"); "no local data.\n");
/* drain possibly payload */ /* drain possibly payload */
return drbd_drain_block(mdev, digest_size); return !drbd_drain_block(mdev, digest_size);
} }
/* GFP_NOIO, because we must not cause arbitrary write-out: in a DRBD /* GFP_NOIO, because we must not cause arbitrary write-out: in a DRBD
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment