Skip to content

Commit

Permalink
drbd: Add read_requests tree
Browse files Browse the repository at this point in the history
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: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
  • Loading branch information
Andreas Gruenbacher authored and Philipp Reisner committed Aug 29, 2011
1 parent de69671 commit dac1389
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 4 deletions.
3 changes: 2 additions & 1 deletion drivers/block/drbd/drbd_int.h
Original file line number Diff line number Diff line change
Expand Up @@ -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] */
Expand Down
1 change: 1 addition & 0 deletions drivers/block/drbd/drbd_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
13 changes: 10 additions & 3 deletions drivers/block/drbd/drbd_req.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit dac1389

Please sign in to comment.