summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Ellenberg <lars.ellenberg@linbit.com>2012-08-07 06:42:09 +0200
committerPhilipp Reisner <philipp.reisner@linbit.com>2012-11-09 14:05:47 +0100
commit99b4d8fe6d12dcb49126df7153961fbc4de05f2a (patch)
tree6e9f8f96b8264f7d1ce801d32526ec47b99de051
parent8a0bab2a6dd05ee35777370be892daba01750712 (diff)
drbd: only start a new epoch, if the current epoch contains writes
Almost all code paths calling start_new_tl_epoch() guarded it with if (... current_tle_writes > 0 ... ). Just move that inside start_new_tl_epoch(). Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
-rw-r--r--drivers/block/drbd/drbd_req.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c
index 6e8d0976351..0c1b6327e20 100644
--- a/drivers/block/drbd/drbd_req.c
+++ b/drivers/block/drbd/drbd_req.c
@@ -162,6 +162,10 @@ static void wake_all_senders(struct drbd_tconn *tconn) {
/* must hold resource->req_lock */
static void start_new_tl_epoch(struct drbd_tconn *tconn)
{
+ /* no point closing an epoch, if it is empty, anyways. */
+ if (tconn->current_tle_writes == 0)
+ return;
+
tconn->current_tle_writes = 0;
atomic_inc(&tconn->current_tle_nr);
wake_all_senders(tconn);
@@ -861,9 +865,8 @@ static void maybe_pull_ahead(struct drbd_conf *mdev)
}
if (congested) {
- if (mdev->tconn->current_tle_writes)
- /* start a new epoch for non-mirrored writes */
- start_new_tl_epoch(mdev->tconn);
+ /* start a new epoch for non-mirrored writes */
+ start_new_tl_epoch(mdev->tconn);
if (on_congestion == OC_PULL_AHEAD)
_drbd_set_state(_NS(mdev, conn, C_AHEAD), 0, NULL);
@@ -950,7 +953,7 @@ static int drbd_process_write_request(struct drbd_request *req)
if (unlikely(req->i.size == 0)) {
/* The only size==0 bios we expect are empty flushes. */
D_ASSERT(req->master_bio->bi_rw & REQ_FLUSH);
- if (remote && mdev->tconn->current_tle_writes)
+ if (remote)
start_new_tl_epoch(mdev->tconn);
return 0;
}
@@ -1066,13 +1069,15 @@ void __drbd_make_request(struct drbd_conf *mdev, struct bio *bio, unsigned long
/* which transfer log epoch does this belong to? */
req->epoch = atomic_read(&mdev->tconn->current_tle_nr);
- if (rw == WRITE)
- mdev->tconn->current_tle_writes++;
/* no point in adding empty flushes to the transfer log,
* they are mapped to drbd barriers already. */
- if (likely(req->i.size!=0))
+ if (likely(req->i.size!=0)) {
+ if (rw == WRITE)
+ mdev->tconn->current_tle_writes++;
+
list_add_tail(&req->tl_requests, &mdev->tconn->transfer_log);
+ }
if (rw == WRITE) {
if (!drbd_process_write_request(req))