Commit dac1389c authored by Andreas Gruenbacher's avatar Andreas Gruenbacher Committed by Philipp Reisner
Browse files

drbd: Add read_requests tree



We do not do collision detection for read requests, but we still need to
look up the request objects when we receive a package over the network.
Using the same data structure for read and write requests results in
simpler code once the tl_hash and app_reads_hash tables are removed.

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent de696716
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1019,7 +1019,8 @@ struct drbd_conf {
	struct hlist_head *tl_hash;
	unsigned int tl_hash_s;

	/* Interval tree of pending local write requests */
	/* Interval tree of pending local requests */
	struct rb_root read_requests;
	struct rb_root write_requests;

	/* blocks to resync in this run [unit BM_BLOCK_SIZE] */
+1 −0
Original line number Diff line number Diff line
@@ -3473,6 +3473,7 @@ struct drbd_conf *drbd_new_device(unsigned int minor)
	/* no need to lock access, we are still initializing this minor device. */
	if (!tl_init(mdev))
		goto out_no_tl;
	mdev->read_requests = RB_ROOT;
	mdev->write_requests = RB_ROOT;

	mdev->app_reads_hash = kzalloc(APP_R_HSIZE*sizeof(void *), GFP_KERNEL);
+10 −3
Original line number Diff line number Diff line
@@ -260,10 +260,15 @@ void _req_may_be_done(struct drbd_request *req, struct bio_and_error *m)

		/* remove the request from the conflict detection
		 * respective block_id verification hash */
		if (!hlist_unhashed(&req->collision)) {
		if (!drbd_interval_empty(&req->i)) {
			struct rb_root *root;

			hlist_del(&req->collision);
			if (!drbd_interval_empty(&req->i))
				drbd_remove_interval(&mdev->write_requests, &req->i);
			if (rw == WRITE)
				root = &mdev->write_requests;
			else
				root = &mdev->read_requests;
			drbd_remove_interval(root, &req->i);
		} else
			D_ASSERT((s & (RQ_NET_MASK & ~RQ_NET_DONE)) == 0);

@@ -332,6 +337,7 @@ static int _req_conflicts(struct drbd_request *req)
	struct hlist_head *slot;

	D_ASSERT(hlist_unhashed(&req->collision));
	D_ASSERT(drbd_interval_empty(&req->i));

	if (!get_net_conf(mdev))
		return 0;
@@ -493,6 +499,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
		/* so we can verify the handle in the answer packet
		 * corresponding hlist_del is in _req_may_be_done() */
		hlist_add_head(&req->collision, ar_hash_slot(mdev, req->i.sector));
		drbd_insert_interval(&mdev->read_requests, &req->i);

		set_bit(UNPLUG_REMOTE, &mdev->flags);