summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruen@linbit.com>2011-01-21 18:00:55 +0100
committerPhilipp Reisner <philipp.reisner@linbit.com>2011-08-29 11:26:50 +0200
commitbc9c5c41181a84ad243639c79a10f621a97af44b (patch)
treeb4caa79173624199cae5ec5c6f6dbc7385dfbe10 /drivers
parentdac1389ccc273b5486f2931c64c8e1672f233727 (diff)
downloadblackbird-op-linux-bc9c5c41181a84ad243639c79a10f621a97af44b.tar.gz
blackbird-op-linux-bc9c5c41181a84ad243639c79a10f621a97af44b.zip
drbd: Use the read and write request trees for request lookups
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_interval.h3
-rw-r--r--drivers/block/drbd/drbd_receiver.c44
2 files changed, 17 insertions, 30 deletions
diff --git a/drivers/block/drbd/drbd_interval.h b/drivers/block/drbd/drbd_interval.h
index bf8dcf7bab09..a847b4a07b25 100644
--- a/drivers/block/drbd/drbd_interval.h
+++ b/drivers/block/drbd/drbd_interval.h
@@ -22,8 +22,7 @@ static inline bool drbd_interval_empty(struct drbd_interval *i)
}
bool drbd_insert_interval(struct rb_root *, struct drbd_interval *);
-struct drbd_interval *drbd_find_interval(struct rb_root *, sector_t,
- struct drbd_interval *);
+bool drbd_contains_interval(struct rb_root *, sector_t, struct drbd_interval *);
void drbd_remove_interval(struct rb_root *, struct drbd_interval *);
struct drbd_interval *drbd_find_overlap(struct rb_root *, sector_t,
unsigned int);
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 6b0725842508..b148398b5aa4 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -1470,27 +1470,15 @@ fail:
}
static struct drbd_request *
-find_request(struct drbd_conf *mdev,
- struct hlist_head *(*hash_slot)(struct drbd_conf *, sector_t),
- u64 id, sector_t sector, bool missing_ok, const char *func)
+find_request(struct drbd_conf *mdev, struct rb_root *root, u64 id,
+ sector_t sector, bool missing_ok, const char *func)
{
- struct hlist_head *slot = hash_slot(mdev, sector);
- struct hlist_node *n;
struct drbd_request *req;
- hlist_for_each_entry(req, n, slot, collision) {
- if ((unsigned long)req != (unsigned long)id)
- continue;
- if (req->i.sector != sector) {
- dev_err(DEV, "%s: found request %lu but it has "
- "wrong sector (%llus versus %llus)\n",
- func, (unsigned long)req,
- (unsigned long long)req->i.sector,
- (unsigned long long)sector);
- return NULL;
- }
+ /* Request object according to our peer */
+ req = (struct drbd_request *)(unsigned long)id;
+ if (drbd_contains_interval(root, sector, &req->i))
return req;
- }
if (!missing_ok) {
dev_err(DEV, "%s: failed to find request %lu, sector %llus\n", func,
(unsigned long)id, (unsigned long long)sector);
@@ -1508,7 +1496,7 @@ static int receive_DataReply(struct drbd_conf *mdev, enum drbd_packets cmd, unsi
sector = be64_to_cpu(p->sector);
spin_lock_irq(&mdev->req_lock);
- req = find_request(mdev, ar_hash_slot, p->block_id, sector, false, __func__);
+ req = find_request(mdev, &mdev->read_requests, p->block_id, sector, false, __func__);
spin_unlock_irq(&mdev->req_lock);
if (unlikely(!req))
return false;
@@ -4245,16 +4233,16 @@ static int got_IsInSync(struct drbd_conf *mdev, struct p_header80 *h)
return true;
}
-static int validate_req_change_req_state(struct drbd_conf *mdev,
- u64 id, sector_t sector,
- struct hlist_head *(*hash_slot)(struct drbd_conf *, sector_t),
- const char *func, enum drbd_req_event what, bool missing_ok)
+static int
+validate_req_change_req_state(struct drbd_conf *mdev, u64 id, sector_t sector,
+ struct rb_root *root, const char *func,
+ enum drbd_req_event what, bool missing_ok)
{
struct drbd_request *req;
struct bio_and_error m;
spin_lock_irq(&mdev->req_lock);
- req = find_request(mdev, hash_slot, id, sector, missing_ok, func);
+ req = find_request(mdev, root, id, sector, missing_ok, func);
if (unlikely(!req)) {
spin_unlock_irq(&mdev->req_lock);
return false;
@@ -4304,8 +4292,8 @@ static int got_BlockAck(struct drbd_conf *mdev, struct p_header80 *h)
}
return validate_req_change_req_state(mdev, p->block_id, sector,
- tl_hash_slot, __func__, what,
- false);
+ &mdev->write_requests, __func__,
+ what, false);
}
static int got_NegAck(struct drbd_conf *mdev, struct p_header80 *h)
@@ -4326,7 +4314,7 @@ static int got_NegAck(struct drbd_conf *mdev, struct p_header80 *h)
}
found = validate_req_change_req_state(mdev, p->block_id, sector,
- tl_hash_slot, __func__,
+ &mdev->write_requests, __func__,
neg_acked, missing_ok);
if (!found) {
/* Protocol A has no P_WRITE_ACKs, but has P_NEG_ACKs.
@@ -4351,8 +4339,8 @@ static int got_NegDReply(struct drbd_conf *mdev, struct p_header80 *h)
(unsigned long long)sector, be32_to_cpu(p->blksize));
return validate_req_change_req_state(mdev, p->block_id, sector,
- ar_hash_slot, __func__, neg_acked,
- false);
+ &mdev->read_requests, __func__,
+ neg_acked, false);
}
static int got_NegRSDReply(struct drbd_conf *mdev, struct p_header80 *h)
OpenPOWER on IntegriCloud