diff options
author | Andreas Gruenbacher | 2011-03-16 09:41:10 +0100 |
---|---|---|
committer | Philipp Reisner | 2012-11-08 16:44:40 +0100 |
commit | b987427b53f4bcddf0a951da573c83ce7eddf70d (patch) | |
tree | 611a82893802259a8bc8af4f2cdca7c6933df2f7 /drivers/block/drbd/drbd_main.c | |
parent | drbd: drbd_send_oos(): Return 0 upon success and an error code otherwise (diff) | |
download | kernel-qcow2-linux-b987427b53f4bcddf0a951da573c83ce7eddf70d.tar.gz kernel-qcow2-linux-b987427b53f4bcddf0a951da573c83ce7eddf70d.tar.xz kernel-qcow2-linux-b987427b53f4bcddf0a951da573c83ce7eddf70d.zip |
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>
Diffstat (limited to 'drivers/block/drbd/drbd_main.c')
-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) * with page_count == 0 or PageSlab. */ static int _drbd_no_send_page(struct drbd_conf *mdev, struct page *page, - int offset, size_t size, unsigned msg_flags) + int offset, size_t size, unsigned msg_flags) { - int sent = drbd_send(mdev->tconn, mdev->tconn->data.socket, kmap(page) + offset, size, msg_flags); + struct socket *socket; + void *addr; + int err; + + socket = mdev->tconn->data.socket; + addr = kmap(page) + offset; + err = drbd_send_all(mdev->tconn, socket, addr, size, msg_flags); kunmap(page); - if (sent == size) - mdev->send_cnt += size>>9; - return sent == size; + if (!err) + mdev->send_cnt += size >> 9; + return err; } 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, * __page_cache_release a page that would actually still be referenced * by someone, leading to some obscure delayed Oops somewhere else. */ if (disable_sendpage || (page_count(page) < 1) || PageSlab(page)) - return _drbd_no_send_page(mdev, page, offset, size, msg_flags); + return !_drbd_no_send_page(mdev, page, offset, size, msg_flags); msg_flags |= MSG_NOSIGNAL; drbd_update_congested(mdev->tconn); @@ -1465,9 +1471,9 @@ static int _drbd_send_bio(struct drbd_conf *mdev, struct bio *bio) int i; /* hint all but last page with MSG_MORE */ __bio_for_each_segment(bvec, bio, i, 0) { - if (!_drbd_no_send_page(mdev, bvec->bv_page, - bvec->bv_offset, bvec->bv_len, - i == bio->bi_vcnt -1 ? 0 : MSG_MORE)) + if (_drbd_no_send_page(mdev, bvec->bv_page, + bvec->bv_offset, bvec->bv_len, + i == bio->bi_vcnt -1 ? 0 : MSG_MORE)) return 0; } return 1; |