Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 242879
b: refs/heads/master
c: 725a97e
h: refs/heads/master
i:
  242877: 01ccbfd
  242875: 336b13f
  242871: e1ae780
  242863: 4c74133
  242847: 2d9de54
  242815: f54d050
v: v3
  • Loading branch information
Lars Ellenberg authored and Philipp Reisner committed Mar 10, 2011
1 parent 7605d5c commit eb8ccdc
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 06d33e968d2c58143a7aaafa8963cf6a58099467
refs/heads/master: 725a97e43ee945cc813fffd9e628e50d703b973b
38 changes: 22 additions & 16 deletions trunk/drivers/block/drbd/drbd_bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -897,7 +897,7 @@ void drbd_bm_clear_all(struct drbd_conf *mdev)
struct bm_aio_ctx {
struct drbd_conf *mdev;
atomic_t in_flight;
wait_queue_head_t io_wait;
struct completion done;
unsigned flags;
#define BM_AIO_COPY_PAGES 1
int error;
Expand Down Expand Up @@ -948,7 +948,7 @@ static void bm_async_io_complete(struct bio *bio, int error)
bio_put(bio);

if (atomic_dec_and_test(&ctx->in_flight))
wake_up(&ctx->io_wait);
complete(&ctx->done);
}

static void bm_page_io_async(struct bm_aio_ctx *ctx, int page_nr, int rw) __must_hold(local)
Expand Down Expand Up @@ -1009,8 +1009,12 @@ static void bm_page_io_async(struct bm_aio_ctx *ctx, int page_nr, int rw) __must
*/
static int bm_rw(struct drbd_conf *mdev, int rw, unsigned lazy_writeout_upper_idx) __must_hold(local)
{
struct bm_aio_ctx ctx =
{ .flags = lazy_writeout_upper_idx ? BM_AIO_COPY_PAGES : 0 };
struct bm_aio_ctx ctx = {
.mdev = mdev,
.in_flight = ATOMIC_INIT(1),
.done = COMPLETION_INITIALIZER_ONSTACK(ctx.done),
.flags = lazy_writeout_upper_idx ? BM_AIO_COPY_PAGES : 0,
};
struct drbd_bitmap *b = mdev->bitmap;
int num_pages, i, count = 0;
unsigned long now;
Expand All @@ -1031,10 +1035,6 @@ static int bm_rw(struct drbd_conf *mdev, int rw, unsigned lazy_writeout_upper_id
num_pages = b->bm_number_of_pages;

now = jiffies;
ctx.mdev = mdev;
atomic_set(&ctx.in_flight, 1); /* one extra ref */
init_waitqueue_head(&ctx.io_wait);
ctx.error = 0;

/* let the layers below us try to merge these bios... */
for (i = 0; i < num_pages; i++) {
Expand All @@ -1060,8 +1060,13 @@ static int bm_rw(struct drbd_conf *mdev, int rw, unsigned lazy_writeout_upper_id
cond_resched();
}

atomic_dec(&ctx.in_flight); /* drop the extra ref */
wait_event(ctx.io_wait, atomic_read(&ctx.in_flight) == 0);
/*
* We initialize ctx.in_flight to one to make sure bm_async_io_complete
* will not complete() early, and decrement / test it here. If there
* are still some bios in flight, we need to wait for them here.
*/
if (!atomic_dec_and_test(&ctx.in_flight))
wait_for_completion(&ctx.done);
dev_info(DEV, "bitmap %s of %u pages took %lu jiffies\n",
rw == WRITE ? "WRITE" : "READ",
count, jiffies - now);
Expand Down Expand Up @@ -1133,19 +1138,20 @@ int drbd_bm_write_lazy(struct drbd_conf *mdev, unsigned upper_idx) __must_hold(l
*/
int drbd_bm_write_page(struct drbd_conf *mdev, unsigned int idx) __must_hold(local)
{
struct bm_aio_ctx ctx = { .flags = BM_AIO_COPY_PAGES, };
struct bm_aio_ctx ctx = {
.mdev = mdev,
.in_flight = ATOMIC_INIT(1),
.done = COMPLETION_INITIALIZER_ONSTACK(ctx.done),
.flags = BM_AIO_COPY_PAGES,
};

if (bm_test_page_unchanged(mdev->bitmap->bm_pages[idx])) {
dynamic_dev_dbg(DEV, "skipped bm page write for idx %u\n", idx);
return 0;
}

ctx.mdev = mdev;
atomic_set(&ctx.in_flight, 1);
init_waitqueue_head(&ctx.io_wait);

bm_page_io_async(&ctx, idx, WRITE_SYNC);
wait_event(ctx.io_wait, atomic_read(&ctx.in_flight) == 0);
wait_for_completion(&ctx.done);

if (ctx.error)
drbd_chk_io_error(mdev, 1, true);
Expand Down

0 comments on commit eb8ccdc

Please sign in to comment.