diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2010-06-11 07:56:33 -0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2010-10-14 08:58:36 -0400 |
commit | 87f7be4cf88e93069f4cc63baf2ce70fdfc59c63 (patch) | |
tree | b76a190b93d4a5d3629c7f25737e11c8231efd6c /drivers | |
parent | 1616a25493cce727d582886f162c5bb0abd87e6a (diff) |
drbd: Run the fence-peer helper asynchronously
Since we can not thaw the transfer log, the next logical step is
to allow reconnects while the fence-peer handler runs.
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 | 3 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_nl.c | 21 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 8 |
3 files changed, 25 insertions, 7 deletions
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 03cc975b9e6c..ab20c0062d21 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h | |||
@@ -1423,7 +1423,8 @@ extern void resync_after_online_grow(struct drbd_conf *); | |||
1423 | extern void drbd_setup_queue_param(struct drbd_conf *mdev, unsigned int) __must_hold(local); | 1423 | extern void drbd_setup_queue_param(struct drbd_conf *mdev, unsigned int) __must_hold(local); |
1424 | extern int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role, | 1424 | extern int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role, |
1425 | int force); | 1425 | int force); |
1426 | enum drbd_disk_state drbd_try_outdate_peer(struct drbd_conf *mdev); | 1426 | extern enum drbd_disk_state drbd_try_outdate_peer(struct drbd_conf *mdev); |
1427 | extern void drbd_try_outdate_peer_async(struct drbd_conf *mdev); | ||
1427 | extern int drbd_khelper(struct drbd_conf *mdev, char *cmd); | 1428 | extern int drbd_khelper(struct drbd_conf *mdev, char *cmd); |
1428 | 1429 | ||
1429 | /* drbd_worker.c */ | 1430 | /* drbd_worker.c */ |
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index cda7cb3202b9..32d00720470b 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c | |||
@@ -38,6 +38,8 @@ | |||
38 | #include <asm/unaligned.h> | 38 | #include <asm/unaligned.h> |
39 | #include <linux/drbd_tag_magic.h> | 39 | #include <linux/drbd_tag_magic.h> |
40 | #include <linux/drbd_limits.h> | 40 | #include <linux/drbd_limits.h> |
41 | #include <linux/compiler.h> | ||
42 | #include <linux/kthread.h> | ||
41 | 43 | ||
42 | static unsigned short *tl_add_blob(unsigned short *, enum drbd_tags, const void *, int); | 44 | static unsigned short *tl_add_blob(unsigned short *, enum drbd_tags, const void *, int); |
43 | static unsigned short *tl_add_str(unsigned short *, enum drbd_tags, const char *); | 45 | static unsigned short *tl_add_str(unsigned short *, enum drbd_tags, const char *); |
@@ -256,6 +258,25 @@ enum drbd_disk_state drbd_try_outdate_peer(struct drbd_conf *mdev) | |||
256 | return nps; | 258 | return nps; |
257 | } | 259 | } |
258 | 260 | ||
261 | static int _try_outdate_peer_async(void *data) | ||
262 | { | ||
263 | struct drbd_conf *mdev = (struct drbd_conf *)data; | ||
264 | enum drbd_disk_state nps; | ||
265 | |||
266 | nps = drbd_try_outdate_peer(mdev); | ||
267 | drbd_request_state(mdev, NS(pdsk, nps)); | ||
268 | |||
269 | return 0; | ||
270 | } | ||
271 | |||
272 | void drbd_try_outdate_peer_async(struct drbd_conf *mdev) | ||
273 | { | ||
274 | struct task_struct *opa; | ||
275 | |||
276 | opa = kthread_run(_try_outdate_peer_async, mdev, "drbd%d_a_helper", mdev_to_minor(mdev)); | ||
277 | if (IS_ERR(opa)) | ||
278 | dev_err(DEV, "out of mem, failed to invoke fence-peer helper\n"); | ||
279 | } | ||
259 | 280 | ||
260 | int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role, int force) | 281 | int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role, int force) |
261 | { | 282 | { |
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 72bc1a130645..101ad186244c 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c | |||
@@ -3747,12 +3747,8 @@ static void drbd_disconnect(struct drbd_conf *mdev) | |||
3747 | put_ldev(mdev); | 3747 | put_ldev(mdev); |
3748 | } | 3748 | } |
3749 | 3749 | ||
3750 | if (mdev->state.role == R_PRIMARY) { | 3750 | if (mdev->state.role == R_PRIMARY && fp >= FP_RESOURCE && mdev->state.pdsk >= D_UNKNOWN) |
3751 | if (fp >= FP_RESOURCE && mdev->state.pdsk >= D_UNKNOWN) { | 3751 | drbd_try_outdate_peer_async(mdev); |
3752 | enum drbd_disk_state nps = drbd_try_outdate_peer(mdev); | ||
3753 | drbd_request_state(mdev, NS(pdsk, nps)); | ||
3754 | } | ||
3755 | } | ||
3756 | 3752 | ||
3757 | spin_lock_irq(&mdev->req_lock); | 3753 | spin_lock_irq(&mdev->req_lock); |
3758 | os = mdev->state; | 3754 | os = mdev->state; |