diff options
author | Lars Ellenberg <lars.ellenberg@linbit.com> | 2011-03-31 16:00:51 +0200 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-08 16:45:01 +0100 |
commit | 7726547e67a1fda0d12e1de5ec917a2e5d4b8186 (patch) | |
tree | dbc58bedef80fbcb5655f9ee386b13b7570fe78e /drivers/block/drbd/drbd_actlog.c | |
parent | 181286ad22bf9bfb85de625e8501285de5261b35 (diff) |
drbd: prepare to activate two activity log extents at once
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_actlog.c')
-rw-r--r-- | drivers/block/drbd/drbd_actlog.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index 5f0eeb74a57..07f222cae98 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c @@ -207,15 +207,22 @@ static struct lc_element *_al_get(struct drbd_conf *mdev, unsigned int enr) void drbd_al_begin_io(struct drbd_conf *mdev, struct drbd_interval *i) { - unsigned int enr = (i->sector >> (AL_EXTENT_SHIFT-9)); - struct lc_element *al_ext; + /* for bios crossing activity log extent boundaries, + * we may need to activate two extents in one go */ + unsigned int enr[2]; + struct lc_element *al_ext[2] = { NULL, NULL }; struct update_al_work al_work; D_ASSERT(atomic_read(&mdev->local_cnt) > 0); - wait_event(mdev->al_wait, (al_ext = _al_get(mdev, enr))); + enr[0] = i->sector >> (AL_EXTENT_SHIFT-9); + enr[1] = (i->sector + (i->size >> 9) - 1) >> (AL_EXTENT_SHIFT-9); + wait_event(mdev->al_wait, (al_ext[0] = _al_get(mdev, enr[0]))); + if (enr[0] != enr[1]) + wait_event(mdev->al_wait, (al_ext[1] = _al_get(mdev, enr[1]))); - if (al_ext->lc_number != enr) { + if (al_ext[0]->lc_number != enr[0] || + (al_ext[1] && al_ext[1]->lc_number != enr[1])) { /* drbd_al_write_transaction(mdev,al_ext,enr); * recurses into generic_make_request(), which * disallows recursion, bios being serialized on the @@ -232,7 +239,8 @@ void drbd_al_begin_io(struct drbd_conf *mdev, struct drbd_interval *i) /* Double check: it may have been committed by someone else, * while we have been waiting for the lock. */ - if (al_ext->lc_number != enr) { + if (al_ext[0]->lc_number != enr[0] || + (al_ext[1] && al_ext[1]->lc_number != enr[1])) { init_completion(&al_work.event); al_work.w.cb = w_al_write_transaction; al_work.w.mdev = mdev; |