aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2011-02-08 08:29:53 -0500
committerPhilipp Reisner <philipp.reisner@linbit.com>2011-09-28 04:33:06 -0400
commit360cc7405295d1f604d5689e8d6c206968d47886 (patch)
treecc73c62efb761f35e3a8218b0ae9cbb0b27bb2e7 /drivers
parenteefc2f7de2e4a35247c932a2c09f1890864a8381 (diff)
drbd: Converted drbd_free_sock() and drbd_disconnect() from mdev to tconn
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/block/drbd/drbd_int.h2
-rw-r--r--drivers/block/drbd/drbd_main.c28
-rw-r--r--drivers/block/drbd/drbd_receiver.c72
3 files changed, 56 insertions, 46 deletions
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index a51d0a46146e..a70365452d2f 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -1165,7 +1165,7 @@ extern void tl_release(struct drbd_conf *mdev, unsigned int barrier_nr,
1165 unsigned int set_size); 1165 unsigned int set_size);
1166extern void tl_clear(struct drbd_conf *mdev); 1166extern void tl_clear(struct drbd_conf *mdev);
1167extern void _tl_add_barrier(struct drbd_conf *, struct drbd_tl_epoch *); 1167extern void _tl_add_barrier(struct drbd_conf *, struct drbd_tl_epoch *);
1168extern void drbd_free_sock(struct drbd_conf *mdev); 1168extern void drbd_free_sock(struct drbd_tconn *tconn);
1169extern int drbd_send(struct drbd_tconn *tconn, struct socket *sock, 1169extern int drbd_send(struct drbd_tconn *tconn, struct socket *sock,
1170 void *buf, size_t size, unsigned msg_flags); 1170 void *buf, size_t size, unsigned msg_flags);
1171extern int drbd_send_protocol(struct drbd_tconn *tconn); 1171extern int drbd_send_protocol(struct drbd_tconn *tconn);
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index 3bb412c82729..a26ec93a9d7f 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -2430,21 +2430,21 @@ void drbd_free_bc(struct drbd_backing_dev *ldev)
2430 kfree(ldev); 2430 kfree(ldev);
2431} 2431}
2432 2432
2433void drbd_free_sock(struct drbd_conf *mdev) 2433void drbd_free_sock(struct drbd_tconn *tconn)
2434{ 2434{
2435 if (mdev->tconn->data.socket) { 2435 if (tconn->data.socket) {
2436 mutex_lock(&mdev->tconn->data.mutex); 2436 mutex_lock(&tconn->data.mutex);
2437 kernel_sock_shutdown(mdev->tconn->data.socket, SHUT_RDWR); 2437 kernel_sock_shutdown(tconn->data.socket, SHUT_RDWR);
2438 sock_release(mdev->tconn->data.socket); 2438 sock_release(tconn->data.socket);
2439 mdev->tconn->data.socket = NULL; 2439 tconn->data.socket = NULL;
2440 mutex_unlock(&mdev->tconn->data.mutex); 2440 mutex_unlock(&tconn->data.mutex);
2441 } 2441 }
2442 if (mdev->tconn->meta.socket) { 2442 if (tconn->meta.socket) {
2443 mutex_lock(&mdev->tconn->meta.mutex); 2443 mutex_lock(&tconn->meta.mutex);
2444 kernel_sock_shutdown(mdev->tconn->meta.socket, SHUT_RDWR); 2444 kernel_sock_shutdown(tconn->meta.socket, SHUT_RDWR);
2445 sock_release(mdev->tconn->meta.socket); 2445 sock_release(tconn->meta.socket);
2446 mdev->tconn->meta.socket = NULL; 2446 tconn->meta.socket = NULL;
2447 mutex_unlock(&mdev->tconn->meta.mutex); 2447 mutex_unlock(&tconn->meta.mutex);
2448 } 2448 }
2449} 2449}
2450 2450
@@ -2462,7 +2462,7 @@ void drbd_free_resources(struct drbd_conf *mdev)
2462 crypto_free_hash(mdev->tconn->integrity_r_tfm); 2462 crypto_free_hash(mdev->tconn->integrity_r_tfm);
2463 mdev->tconn->integrity_r_tfm = NULL; 2463 mdev->tconn->integrity_r_tfm = NULL;
2464 2464
2465 drbd_free_sock(mdev); 2465 drbd_free_sock(mdev->tconn);
2466 2466
2467 __no_warn(local, 2467 __no_warn(local,
2468 drbd_free_bc(mdev->ldev); 2468 drbd_free_bc(mdev->ldev);
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 4c61802c3421..2e5318f9422e 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -62,6 +62,7 @@ enum finish_epoch {
62 62
63static int drbd_do_handshake(struct drbd_tconn *tconn); 63static int drbd_do_handshake(struct drbd_tconn *tconn);
64static int drbd_do_auth(struct drbd_tconn *tconn); 64static int drbd_do_auth(struct drbd_tconn *tconn);
65static int drbd_disconnected(int vnr, void *p, void *data);
65 66
66static enum finish_epoch drbd_may_finish_epoch(struct drbd_conf *, struct drbd_epoch *, enum epoch_event); 67static enum finish_epoch drbd_may_finish_epoch(struct drbd_conf *, struct drbd_epoch *, enum epoch_event);
67static int e_end_block(struct drbd_conf *, struct drbd_work *, int); 68static int e_end_block(struct drbd_conf *, struct drbd_work *, int);
@@ -3829,19 +3830,49 @@ void drbd_flush_workqueue(struct drbd_tconn *tconn)
3829 wait_for_completion(&barr.done); 3830 wait_for_completion(&barr.done);
3830} 3831}
3831 3832
3832static void drbd_disconnect(struct drbd_conf *mdev) 3833static void drbd_disconnect(struct drbd_tconn *tconn)
3833{ 3834{
3834 enum drbd_fencing_p fp;
3835 union drbd_state os, ns; 3835 union drbd_state os, ns;
3836 int rv = SS_UNKNOWN_ERROR; 3836 int rv = SS_UNKNOWN_ERROR;
3837 unsigned int i;
3838 3837
3839 if (mdev->state.conn == C_STANDALONE) 3838 if (tconn->volume0->state.conn == C_STANDALONE)
3840 return; 3839 return;
3841 3840
3842 /* asender does not clean up anything. it must not interfere, either */ 3841 /* asender does not clean up anything. it must not interfere, either */
3843 drbd_thread_stop(&mdev->tconn->asender); 3842 drbd_thread_stop(&tconn->asender);
3844 drbd_free_sock(mdev); 3843 drbd_free_sock(tconn);
3844
3845 idr_for_each(&tconn->volumes, drbd_disconnected, tconn);
3846
3847 conn_info(tconn, "Connection closed\n");
3848
3849 spin_lock_irq(&tconn->req_lock);
3850 os = tconn->volume0->state;
3851 if (os.conn >= C_UNCONNECTED) {
3852 /* Do not restart in case we are C_DISCONNECTING */
3853 ns.i = os.i;
3854 ns.conn = C_UNCONNECTED;
3855 rv = _drbd_set_state(tconn->volume0, ns, CS_VERBOSE, NULL);
3856 }
3857 spin_unlock_irq(&tconn->req_lock);
3858
3859 if (os.conn == C_DISCONNECTING) {
3860 wait_event(tconn->net_cnt_wait, atomic_read(&tconn->net_cnt) == 0);
3861
3862 crypto_free_hash(tconn->cram_hmac_tfm);
3863 tconn->cram_hmac_tfm = NULL;
3864
3865 kfree(tconn->net_conf);
3866 tconn->net_conf = NULL;
3867 drbd_request_state(tconn->volume0, NS(conn, C_STANDALONE));
3868 }
3869}
3870
3871static int drbd_disconnected(int vnr, void *p, void *data)
3872{
3873 struct drbd_conf *mdev = (struct drbd_conf *)p;
3874 enum drbd_fencing_p fp;
3875 unsigned int i;
3845 3876
3846 /* wait for current activity to cease. */ 3877 /* wait for current activity to cease. */
3847 spin_lock_irq(&mdev->tconn->req_lock); 3878 spin_lock_irq(&mdev->tconn->req_lock);
@@ -3887,8 +3918,6 @@ static void drbd_disconnect(struct drbd_conf *mdev)
3887 if (!is_susp(mdev->state)) 3918 if (!is_susp(mdev->state))
3888 tl_clear(mdev); 3919 tl_clear(mdev);
3889 3920
3890 dev_info(DEV, "Connection closed\n");
3891
3892 drbd_md_sync(mdev); 3921 drbd_md_sync(mdev);
3893 3922
3894 fp = FP_DONT_CARE; 3923 fp = FP_DONT_CARE;
@@ -3900,27 +3929,6 @@ static void drbd_disconnect(struct drbd_conf *mdev)
3900 if (mdev->state.role == R_PRIMARY && fp >= FP_RESOURCE && mdev->state.pdsk >= D_UNKNOWN) 3929 if (mdev->state.role == R_PRIMARY && fp >= FP_RESOURCE && mdev->state.pdsk >= D_UNKNOWN)
3901 drbd_try_outdate_peer_async(mdev); 3930 drbd_try_outdate_peer_async(mdev);
3902 3931
3903 spin_lock_irq(&mdev->tconn->req_lock);
3904 os = mdev->state;
3905 if (os.conn >= C_UNCONNECTED) {
3906 /* Do not restart in case we are C_DISCONNECTING */
3907 ns = os;
3908 ns.conn = C_UNCONNECTED;
3909 rv = _drbd_set_state(mdev, ns, CS_VERBOSE, NULL);
3910 }
3911 spin_unlock_irq(&mdev->tconn->req_lock);
3912
3913 if (os.conn == C_DISCONNECTING) {
3914 wait_event(mdev->tconn->net_cnt_wait, atomic_read(&mdev->tconn->net_cnt) == 0);
3915
3916 crypto_free_hash(mdev->tconn->cram_hmac_tfm);
3917 mdev->tconn->cram_hmac_tfm = NULL;
3918
3919 kfree(mdev->tconn->net_conf);
3920 mdev->tconn->net_conf = NULL;
3921 drbd_request_state(mdev, NS(conn, C_STANDALONE));
3922 }
3923
3924 /* serialize with bitmap writeout triggered by the state change, 3932 /* serialize with bitmap writeout triggered by the state change,
3925 * if any. */ 3933 * if any. */
3926 wait_event(mdev->misc_wait, !test_bit(BITMAP_IO, &mdev->flags)); 3934 wait_event(mdev->misc_wait, !test_bit(BITMAP_IO, &mdev->flags));
@@ -3950,6 +3958,8 @@ static void drbd_disconnect(struct drbd_conf *mdev)
3950 /* ok, no more ee's on the fly, it is safe to reset the epoch_size */ 3958 /* ok, no more ee's on the fly, it is safe to reset the epoch_size */
3951 atomic_set(&mdev->current_epoch->epoch_size, 0); 3959 atomic_set(&mdev->current_epoch->epoch_size, 0);
3952 D_ASSERT(list_empty(&mdev->current_epoch->list)); 3960 D_ASSERT(list_empty(&mdev->current_epoch->list));
3961
3962 return 0;
3953} 3963}
3954 3964
3955/* 3965/*
@@ -4226,7 +4236,7 @@ int drbdd_init(struct drbd_thread *thi)
4226 do { 4236 do {
4227 h = drbd_connect(mdev->tconn); 4237 h = drbd_connect(mdev->tconn);
4228 if (h == 0) { 4238 if (h == 0) {
4229 drbd_disconnect(mdev); 4239 drbd_disconnect(mdev->tconn);
4230 schedule_timeout_interruptible(HZ); 4240 schedule_timeout_interruptible(HZ);
4231 } 4241 }
4232 if (h == -1) { 4242 if (h == -1) {
@@ -4242,7 +4252,7 @@ int drbdd_init(struct drbd_thread *thi)
4242 } 4252 }
4243 } 4253 }
4244 4254
4245 drbd_disconnect(mdev); 4255 drbd_disconnect(mdev->tconn);
4246 4256
4247 dev_info(DEV, "receiver terminated\n"); 4257 dev_info(DEV, "receiver terminated\n");
4248 return 0; 4258 return 0;