diff options
author | Lars Ellenberg <lars.ellenberg@linbit.com> | 2012-08-07 06:42:09 +0200 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-09 14:05:47 +0100 |
commit | 99b4d8fe6d12dcb49126df7153961fbc4de05f2a (patch) | |
tree | 6e9f8f96b8264f7d1ce801d32526ec47b99de051 /drivers/block/drbd/drbd_req.c | |
parent | 8a0bab2a6dd05ee35777370be892daba01750712 (diff) | |
download | op-kernel-dev-99b4d8fe6d12dcb49126df7153961fbc4de05f2a.zip op-kernel-dev-99b4d8fe6d12dcb49126df7153961fbc4de05f2a.tar.gz |
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>
Diffstat (limited to 'drivers/block/drbd/drbd_req.c')
-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 6e8d097..0c1b632 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)) |