diff options
author | Andreas Gruenbacher <agruen@linbit.com> | 2011-03-16 04:41:10 -0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-08 10:44:40 -0500 |
commit | b987427b53f4bcddf0a951da573c83ce7eddf70d (patch) | |
tree | 611a82893802259a8bc8af4f2cdca7c6933df2f7 | |
parent | 73218a3c4c7ae87014b8fc258f8a16a75aad2870 (diff) |
drbd: _drbd_no_send_page(): Return 0 upon success and an error code otherwise
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 93805354eec4..ff75cce21f40 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
@@ -1403,13 +1403,19 @@ static void drbd_update_congested(struct drbd_tconn *tconn) | |||
1403 | * with page_count == 0 or PageSlab. | 1403 | * with page_count == 0 or PageSlab. |
1404 | */ | 1404 | */ |
1405 | static int _drbd_no_send_page(struct drbd_conf *mdev, struct page *page, | 1405 | static int _drbd_no_send_page(struct drbd_conf *mdev, struct page *page, |
1406 | int offset, size_t size, unsigned msg_flags) | 1406 | int offset, size_t size, unsigned msg_flags) |
1407 | { | 1407 | { |
1408 | int sent = drbd_send(mdev->tconn, mdev->tconn->data.socket, kmap(page) + offset, size, msg_flags); | 1408 | struct socket *socket; |
1409 | void *addr; | ||
1410 | int err; | ||
1411 | |||
1412 | socket = mdev->tconn->data.socket; | ||
1413 | addr = kmap(page) + offset; | ||
1414 | err = drbd_send_all(mdev->tconn, socket, addr, size, msg_flags); | ||
1409 | kunmap(page); | 1415 | kunmap(page); |
1410 | if (sent == size) | 1416 | if (!err) |
1411 | mdev->send_cnt += size>>9; | 1417 | mdev->send_cnt += size >> 9; |
1412 | return sent == size; | 1418 | return err; |
1413 | } | 1419 | } |
1414 | 1420 | ||
1415 | static int _drbd_send_page(struct drbd_conf *mdev, struct page *page, | 1421 | static int _drbd_send_page(struct drbd_conf *mdev, struct page *page, |
@@ -1426,7 +1432,7 @@ static int _drbd_send_page(struct drbd_conf *mdev, struct page *page, | |||
1426 | * __page_cache_release a page that would actually still be referenced | 1432 | * __page_cache_release a page that would actually still be referenced |
1427 | * by someone, leading to some obscure delayed Oops somewhere else. */ | 1433 | * by someone, leading to some obscure delayed Oops somewhere else. */ |
1428 | if (disable_sendpage || (page_count(page) < 1) || PageSlab(page)) | 1434 | if (disable_sendpage || (page_count(page) < 1) || PageSlab(page)) |
1429 | return _drbd_no_send_page(mdev, page, offset, size, msg_flags); | 1435 | return !_drbd_no_send_page(mdev, page, offset, size, msg_flags); |
1430 | 1436 | ||
1431 | msg_flags |= MSG_NOSIGNAL; | 1437 | msg_flags |= MSG_NOSIGNAL; |
1432 | drbd_update_congested(mdev->tconn); | 1438 | drbd_update_congested(mdev->tconn); |
@@ -1465,9 +1471,9 @@ static int _drbd_send_bio(struct drbd_conf *mdev, struct bio *bio) | |||
1465 | int i; | 1471 | int i; |
1466 | /* hint all but last page with MSG_MORE */ | 1472 | /* hint all but last page with MSG_MORE */ |
1467 | __bio_for_each_segment(bvec, bio, i, 0) { | 1473 | __bio_for_each_segment(bvec, bio, i, 0) { |
1468 | if (!_drbd_no_send_page(mdev, bvec->bv_page, | 1474 | if (_drbd_no_send_page(mdev, bvec->bv_page, |
1469 | bvec->bv_offset, bvec->bv_len, | 1475 | bvec->bv_offset, bvec->bv_len, |
1470 | i == bio->bi_vcnt -1 ? 0 : MSG_MORE)) | 1476 | i == bio->bi_vcnt -1 ? 0 : MSG_MORE)) |
1471 | return 0; | 1477 | return 0; |
1472 | } | 1478 | } |
1473 | return 1; | 1479 | return 1; |