aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2010-06-11 07:56:33 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2010-10-14 08:58:36 -0400
commit87f7be4cf88e93069f4cc63baf2ce70fdfc59c63 (patch)
treeb76a190b93d4a5d3629c7f25737e11c8231efd6c /drivers
parent1616a25493cce727d582886f162c5bb0abd87e6a (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.h3
-rw-r--r--drivers/block/drbd/drbd_nl.c21
-rw-r--r--drivers/block/drbd/drbd_receiver.c8
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 *);
1423extern void drbd_setup_queue_param(struct drbd_conf *mdev, unsigned int) __must_hold(local); 1423extern void drbd_setup_queue_param(struct drbd_conf *mdev, unsigned int) __must_hold(local);
1424extern int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role, 1424extern int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role,
1425 int force); 1425 int force);
1426enum drbd_disk_state drbd_try_outdate_peer(struct drbd_conf *mdev); 1426extern enum drbd_disk_state drbd_try_outdate_peer(struct drbd_conf *mdev);
1427extern void drbd_try_outdate_peer_async(struct drbd_conf *mdev);
1427extern int drbd_khelper(struct drbd_conf *mdev, char *cmd); 1428extern 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
42static unsigned short *tl_add_blob(unsigned short *, enum drbd_tags, const void *, int); 44static unsigned short *tl_add_blob(unsigned short *, enum drbd_tags, const void *, int);
43static unsigned short *tl_add_str(unsigned short *, enum drbd_tags, const char *); 45static 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
261static 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
272void 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
260int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role, int force) 281int 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;