diff options
-rw-r--r-- | drivers/block/drbd/drbd_req.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index 6e8d09763510..0c1b6327e207 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)) |