Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 87f7be4c authored by Philipp Reisner's avatar Philipp Reisner
Browse files

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: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent 1616a254
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -1423,7 +1423,8 @@ extern void resync_after_online_grow(struct drbd_conf *);
extern void drbd_setup_queue_param(struct drbd_conf *mdev, unsigned int) __must_hold(local);
extern void drbd_setup_queue_param(struct drbd_conf *mdev, unsigned int) __must_hold(local);
extern int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role,
extern int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role,
		int force);
		int force);
enum drbd_disk_state drbd_try_outdate_peer(struct drbd_conf *mdev);
extern enum drbd_disk_state drbd_try_outdate_peer(struct drbd_conf *mdev);
extern void drbd_try_outdate_peer_async(struct drbd_conf *mdev);
extern int drbd_khelper(struct drbd_conf *mdev, char *cmd);
extern int drbd_khelper(struct drbd_conf *mdev, char *cmd);


/* drbd_worker.c */
/* drbd_worker.c */
+21 −0
Original line number Original line Diff line number Diff line
@@ -38,6 +38,8 @@
#include <asm/unaligned.h>
#include <asm/unaligned.h>
#include <linux/drbd_tag_magic.h>
#include <linux/drbd_tag_magic.h>
#include <linux/drbd_limits.h>
#include <linux/drbd_limits.h>
#include <linux/compiler.h>
#include <linux/kthread.h>


static unsigned short *tl_add_blob(unsigned short *, enum drbd_tags, const void *, int);
static unsigned short *tl_add_blob(unsigned short *, enum drbd_tags, const void *, int);
static unsigned short *tl_add_str(unsigned short *, enum drbd_tags, const char *);
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)
	return nps;
	return nps;
}
}


static int _try_outdate_peer_async(void *data)
{
	struct drbd_conf *mdev = (struct drbd_conf *)data;
	enum drbd_disk_state nps;

	nps = drbd_try_outdate_peer(mdev);
	drbd_request_state(mdev, NS(pdsk, nps));

	return 0;
}

void drbd_try_outdate_peer_async(struct drbd_conf *mdev)
{
	struct task_struct *opa;

	opa = kthread_run(_try_outdate_peer_async, mdev, "drbd%d_a_helper", mdev_to_minor(mdev));
	if (IS_ERR(opa))
		dev_err(DEV, "out of mem, failed to invoke fence-peer helper\n");
}


int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role, int force)
int drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role, int force)
{
{
+2 −6
Original line number Original line Diff line number Diff line
@@ -3747,12 +3747,8 @@ static void drbd_disconnect(struct drbd_conf *mdev)
		put_ldev(mdev);
		put_ldev(mdev);
	}
	}


	if (mdev->state.role == R_PRIMARY) {
	if (mdev->state.role == R_PRIMARY && fp >= FP_RESOURCE && mdev->state.pdsk >= D_UNKNOWN)
		if (fp >= FP_RESOURCE && mdev->state.pdsk >= D_UNKNOWN) {
		drbd_try_outdate_peer_async(mdev);
			enum drbd_disk_state nps = drbd_try_outdate_peer(mdev);
			drbd_request_state(mdev, NS(pdsk, nps));
		}
	}


	spin_lock_irq(&mdev->req_lock);
	spin_lock_irq(&mdev->req_lock);
	os = mdev->state;
	os = mdev->state;