aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruen@linbit.com>2011-03-16 04:41:10 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2012-11-08 10:44:40 -0500
commitb987427b53f4bcddf0a951da573c83ce7eddf70d (patch)
tree611a82893802259a8bc8af4f2cdca7c6933df2f7
parent73218a3c4c7ae87014b8fc258f8a16a75aad2870 (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.c24
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 */
1405static int _drbd_no_send_page(struct drbd_conf *mdev, struct page *page, 1405static 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
1415static int _drbd_send_page(struct drbd_conf *mdev, struct page *page, 1421static 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;