diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2011-02-08 08:29:53 -0500 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2011-09-28 04:33:06 -0400 |
commit | 360cc7405295d1f604d5689e8d6c206968d47886 (patch) | |
tree | cc73c62efb761f35e3a8218b0ae9cbb0b27bb2e7 /drivers | |
parent | eefc2f7de2e4a35247c932a2c09f1890864a8381 (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.h | 2 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 28 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 72 |
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); |
1166 | extern void tl_clear(struct drbd_conf *mdev); | 1166 | extern void tl_clear(struct drbd_conf *mdev); |
1167 | extern void _tl_add_barrier(struct drbd_conf *, struct drbd_tl_epoch *); | 1167 | extern void _tl_add_barrier(struct drbd_conf *, struct drbd_tl_epoch *); |
1168 | extern void drbd_free_sock(struct drbd_conf *mdev); | 1168 | extern void drbd_free_sock(struct drbd_tconn *tconn); |
1169 | extern int drbd_send(struct drbd_tconn *tconn, struct socket *sock, | 1169 | extern 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); |
1171 | extern int drbd_send_protocol(struct drbd_tconn *tconn); | 1171 | extern 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 | ||
2433 | void drbd_free_sock(struct drbd_conf *mdev) | 2433 | void 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 | ||
63 | static int drbd_do_handshake(struct drbd_tconn *tconn); | 63 | static int drbd_do_handshake(struct drbd_tconn *tconn); |
64 | static int drbd_do_auth(struct drbd_tconn *tconn); | 64 | static int drbd_do_auth(struct drbd_tconn *tconn); |
65 | static int drbd_disconnected(int vnr, void *p, void *data); | ||
65 | 66 | ||
66 | static enum finish_epoch drbd_may_finish_epoch(struct drbd_conf *, struct drbd_epoch *, enum epoch_event); | 67 | static enum finish_epoch drbd_may_finish_epoch(struct drbd_conf *, struct drbd_epoch *, enum epoch_event); |
67 | static int e_end_block(struct drbd_conf *, struct drbd_work *, int); | 68 | static 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 | ||
3832 | static void drbd_disconnect(struct drbd_conf *mdev) | 3833 | static 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 | |||
3871 | static 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; |