aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_receiver.c
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2011-02-08 06:55:24 -0500
committerPhilipp Reisner <philipp.reisner@linbit.com>2011-09-28 04:33:05 -0400
commiteefc2f7de2e4a35247c932a2c09f1890864a8381 (patch)
tree7ab6f6d14020c005f8fc8b872cee022823c91a09 /drivers/block/drbd/drbd_receiver.c
parent808222845d62e551630699a1381bbf8a1fd4a286 (diff)
drbd: Converted drbdd() from mdev to tconn
The drbd_md_sync(mdev) happens in the after state change anyways... 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_receiver.c')
-rw-r--r--drivers/block/drbd/drbd_receiver.c30
1 files changed, 14 insertions, 16 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index c8d173c11390..4c61802c3421 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -939,6 +939,7 @@ static bool decode_header(struct drbd_tconn *tconn, struct p_header *h, struct p
939 if (h->h80.magic == cpu_to_be32(DRBD_MAGIC)) { 939 if (h->h80.magic == cpu_to_be32(DRBD_MAGIC)) {
940 pi->cmd = be16_to_cpu(h->h80.command); 940 pi->cmd = be16_to_cpu(h->h80.command);
941 pi->size = be16_to_cpu(h->h80.length); 941 pi->size = be16_to_cpu(h->h80.length);
942 pi->vnr = 0;
942 } else if (h->h95.magic == cpu_to_be16(DRBD_MAGIC_BIG)) { 943 } else if (h->h95.magic == cpu_to_be16(DRBD_MAGIC_BIG)) {
943 pi->cmd = be16_to_cpu(h->h95.command); 944 pi->cmd = be16_to_cpu(h->h95.command);
944 pi->size = be32_to_cpu(h->h95.length) & 0x00ffffff; 945 pi->size = be32_to_cpu(h->h95.length) & 0x00ffffff;
@@ -3771,42 +3772,42 @@ static struct data_cmd drbd_cmd_handler[] = {
3771 p_header, but they may not rely on that. Since there is also p_header95 ! 3772 p_header, but they may not rely on that. Since there is also p_header95 !
3772 */ 3773 */
3773 3774
3774static void drbdd(struct drbd_conf *mdev) 3775static void drbdd(struct drbd_tconn *tconn)
3775{ 3776{
3776 struct p_header *header = &mdev->tconn->data.rbuf.header; 3777 struct p_header *header = &tconn->data.rbuf.header;
3777 struct packet_info pi; 3778 struct packet_info pi;
3778 size_t shs; /* sub header size */ 3779 size_t shs; /* sub header size */
3779 int rv; 3780 int rv;
3780 3781
3781 while (get_t_state(&mdev->tconn->receiver) == RUNNING) { 3782 while (get_t_state(&tconn->receiver) == RUNNING) {
3782 drbd_thread_current_set_cpu(&mdev->tconn->receiver); 3783 drbd_thread_current_set_cpu(&tconn->receiver);
3783 if (!drbd_recv_header(mdev->tconn, &pi)) 3784 if (!drbd_recv_header(tconn, &pi))
3784 goto err_out; 3785 goto err_out;
3785 3786
3786 if (unlikely(pi.cmd >= P_MAX_CMD || !drbd_cmd_handler[pi.cmd].function)) { 3787 if (unlikely(pi.cmd >= P_MAX_CMD || !drbd_cmd_handler[pi.cmd].function)) {
3787 dev_err(DEV, "unknown packet type %d, l: %d!\n", pi.cmd, pi.size); 3788 conn_err(tconn, "unknown packet type %d, l: %d!\n", pi.cmd, pi.size);
3788 goto err_out; 3789 goto err_out;
3789 } 3790 }
3790 3791
3791 shs = drbd_cmd_handler[pi.cmd].pkt_size - sizeof(struct p_header); 3792 shs = drbd_cmd_handler[pi.cmd].pkt_size - sizeof(struct p_header);
3792 if (pi.size - shs > 0 && !drbd_cmd_handler[pi.cmd].expect_payload) { 3793 if (pi.size - shs > 0 && !drbd_cmd_handler[pi.cmd].expect_payload) {
3793 dev_err(DEV, "No payload expected %s l:%d\n", cmdname(pi.cmd), pi.size); 3794 conn_err(tconn, "No payload expected %s l:%d\n", cmdname(pi.cmd), pi.size);
3794 goto err_out; 3795 goto err_out;
3795 } 3796 }
3796 3797
3797 if (shs) { 3798 if (shs) {
3798 rv = drbd_recv(mdev->tconn, &header->payload, shs); 3799 rv = drbd_recv(tconn, &header->payload, shs);
3799 if (unlikely(rv != shs)) { 3800 if (unlikely(rv != shs)) {
3800 if (!signal_pending(current)) 3801 if (!signal_pending(current))
3801 dev_warn(DEV, "short read while reading sub header: rv=%d\n", rv); 3802 conn_warn(tconn, "short read while reading sub header: rv=%d\n", rv);
3802 goto err_out; 3803 goto err_out;
3803 } 3804 }
3804 } 3805 }
3805 3806
3806 rv = drbd_cmd_handler[pi.cmd].function(mdev, pi.cmd, pi.size - shs); 3807 rv = drbd_cmd_handler[pi.cmd].function(vnr_to_mdev(tconn, pi.vnr), pi.cmd, pi.size - shs);
3807 3808
3808 if (unlikely(!rv)) { 3809 if (unlikely(!rv)) {
3809 dev_err(DEV, "error receiving %s, l: %d!\n", 3810 conn_err(tconn, "error receiving %s, l: %d!\n",
3810 cmdname(pi.cmd), pi.size); 3811 cmdname(pi.cmd), pi.size);
3811 goto err_out; 3812 goto err_out;
3812 } 3813 }
@@ -3814,11 +3815,8 @@ static void drbdd(struct drbd_conf *mdev)
3814 3815
3815 if (0) { 3816 if (0) {
3816 err_out: 3817 err_out:
3817 drbd_force_state(mdev, NS(conn, C_PROTOCOL_ERROR)); 3818 drbd_force_state(tconn->volume0, NS(conn, C_PROTOCOL_ERROR));
3818 } 3819 }
3819 /* If we leave here, we probably want to update at least the
3820 * "Connected" indicator on stable storage. Do so explicitly here. */
3821 drbd_md_sync(mdev);
3822} 3820}
3823 3821
3824void drbd_flush_workqueue(struct drbd_tconn *tconn) 3822void drbd_flush_workqueue(struct drbd_tconn *tconn)
@@ -4239,7 +4237,7 @@ int drbdd_init(struct drbd_thread *thi)
4239 4237
4240 if (h > 0) { 4238 if (h > 0) {
4241 if (get_net_conf(mdev->tconn)) { 4239 if (get_net_conf(mdev->tconn)) {
4242 drbdd(mdev); 4240 drbdd(mdev->tconn);
4243 put_net_conf(mdev->tconn); 4241 put_net_conf(mdev->tconn);
4244 } 4242 }
4245 } 4243 }