Commit a21e9298 authored by Philipp Reisner's avatar Philipp Reisner
Browse files

drbd: Moved the mdev member into drbd_work (from drbd_request and drbd_peer_request)

parent 360cc740
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -228,6 +228,7 @@ void drbd_al_begin_io(struct drbd_conf *mdev, sector_t sector)
		al_work.enr = enr;
		al_work.old_enr = al_ext->lc_number;
		al_work.w.cb = w_al_write_transaction;
		al_work.w.mdev = mdev;
		drbd_queue_work_front(&mdev->tconn->data.work, &al_work.w);
		wait_for_completion(&al_work.event);

@@ -717,6 +718,7 @@ static void drbd_try_clear_on_disk_bm(struct drbd_conf *mdev, sector_t sector,
			if (udw) {
				udw->enr = ext->lce.lc_number;
				udw->w.cb = w_update_odbm;
				udw->w.mdev = mdev;
				drbd_queue_work_front(&mdev->tconn->data.work, &udw->w);
			} else {
				dev_warn(DEV, "Could not kmalloc an udw\n");
+2 −3
Original line number Diff line number Diff line
@@ -645,13 +645,13 @@ typedef int (*drbd_work_cb)(struct drbd_conf *, struct drbd_work *, int cancel);
struct drbd_work {
	struct list_head list;
	drbd_work_cb cb;
	struct drbd_conf *mdev;
};

#include "drbd_interval.h"

struct drbd_request {
	struct drbd_work w;
	struct drbd_conf *mdev;

	/* if local IO is not allowed, will be NULL.
	 * if local IO _is_ allowed, holds the locally submitted bio clone,
@@ -715,7 +715,6 @@ struct digest_info {
struct drbd_peer_request {
	struct drbd_work w;
	struct drbd_epoch *epoch; /* for writes */
	struct drbd_conf *mdev;
	struct page *pages;
	atomic_t pending_bios;
	struct drbd_interval i;
@@ -1537,7 +1536,7 @@ extern void _drbd_wait_ee_list_empty(struct drbd_conf *mdev,
		struct list_head *head);
extern void drbd_set_recv_tcq(struct drbd_conf *mdev, int tcq_enabled);
extern void _drbd_clear_done_ee(struct drbd_conf *mdev, struct list_head *to_be_freed);
extern void drbd_flush_workqueue(struct drbd_tconn *tconn);
extern void drbd_flush_workqueue(struct drbd_conf *mdev);

/* yes, there is kernel_setsockopt, but only since 2.6.18. we don't need to
 * mess with get_fs/set_fs, we know we are KERNEL_DS always. */
+8 −0
Original line number Diff line number Diff line
@@ -1836,6 +1836,14 @@ void drbd_init_set_defaults(struct drbd_conf *mdev)
	mdev->md_sync_work.cb = w_md_sync;
	mdev->bm_io_work.w.cb = w_bitmap_io;
	mdev->start_resync_work.cb = w_start_resync;

	mdev->resync_work.mdev  = mdev;
	mdev->unplug_work.mdev  = mdev;
	mdev->go_diskless.mdev  = mdev;
	mdev->md_sync_work.mdev = mdev;
	mdev->bm_io_work.w.mdev = mdev;
	mdev->start_resync_work.mdev = mdev;

	init_timer(&mdev->resync_timer);
	init_timer(&mdev->md_sync_timer);
	init_timer(&mdev->start_resync_timer);
+3 −3
Original line number Diff line number Diff line
@@ -876,7 +876,7 @@ static void drbd_reconfig_start(struct drbd_conf *mdev)
	wait_event(mdev->state_wait, !test_and_set_bit(CONFIG_PENDING, &mdev->flags));
	wait_event(mdev->state_wait, !test_bit(DEVICE_DYING, &mdev->flags));
	drbd_thread_start(&mdev->tconn->worker);
	drbd_flush_workqueue(mdev->tconn);
	drbd_flush_workqueue(mdev);
}

/* if still unconfigured, stops worker again.
@@ -1076,7 +1076,7 @@ static int drbd_nl_disk_conf(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp
	/* also wait for the last barrier ack. */
	wait_event(mdev->misc_wait, !atomic_read(&mdev->ap_pending_cnt) || is_susp(mdev->state));
	/* and for any other previously queued work */
	drbd_flush_workqueue(mdev->tconn);
	drbd_flush_workqueue(mdev);

	rv = _drbd_request_state(mdev, NS(disk, D_ATTACHING), CS_VERBOSE);
	retcode = rv;  /* FIXME: Type mismatch. */
@@ -1520,7 +1520,7 @@ static int drbd_nl_net_conf(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp,
		}
	}

	drbd_flush_workqueue(mdev->tconn);
	drbd_flush_workqueue(mdev);
	spin_lock_irq(&mdev->tconn->req_lock);
	if (mdev->tconn->net_conf != NULL) {
		retcode = ERR_NET_CONFIGURED;
+6 −4
Original line number Diff line number Diff line
@@ -345,7 +345,7 @@ drbd_alloc_ee(struct drbd_conf *mdev, u64 id, sector_t sector,
	peer_req->i.waiting = false;

	peer_req->epoch = NULL;
	peer_req->mdev = mdev;
	peer_req->w.mdev = mdev;
	peer_req->pages = page;
	atomic_set(&peer_req->pending_bios, 0);
	peer_req->flags = 0;
@@ -3820,13 +3820,14 @@ static void drbdd(struct drbd_tconn *tconn)
	}
}

void drbd_flush_workqueue(struct drbd_tconn *tconn)
void drbd_flush_workqueue(struct drbd_conf *mdev)
{
	struct drbd_wq_barrier barr;

	barr.w.cb = w_prev_work_done;
	barr.w.mdev = mdev;
	init_completion(&barr.done);
	drbd_queue_work(&tconn->data.work, &barr.w);
	drbd_queue_work(&mdev->tconn->data.work, &barr.w);
	wait_for_completion(&barr.done);
}

@@ -3906,7 +3907,7 @@ static int drbd_disconnected(int vnr, void *p, void *data)
	/* wait for all w_e_end_data_req, w_e_end_rsdata_req, w_send_barrier,
	 * w_make_resync_request etc. which may still be on the worker queue
	 * to be "canceled" */
	drbd_flush_workqueue(mdev->tconn);
	drbd_flush_workqueue(mdev);

	/* This also does reclaim_net_ee().  If we do this too early, we might
	 * miss some resync ee and pages.*/
@@ -4507,6 +4508,7 @@ static int got_OVResult(struct drbd_conf *mdev, enum drbd_packet cmd)
		w = kmalloc(sizeof(*w), GFP_NOIO);
		if (w) {
			w->cb = w_ov_finished;
			w->mdev = mdev;
			drbd_queue_work_front(&mdev->tconn->data.work, w);
		} else {
			dev_err(DEV, "kmalloc(w) failed.");
Loading