Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0c464425 authored by Philipp Reisner's avatar Philipp Reisner
Browse files

drbd: Implemented wait_until_done_or_disk_failure()

parent e1711731
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -82,6 +82,17 @@ void drbd_md_put_buffer(struct drbd_conf *mdev)
		wake_up(&mdev->misc_wait);
}

static bool md_io_allowed(struct drbd_conf *mdev)
{
	enum drbd_disk_state ds = mdev->state.disk;
	return ds >= D_NEGOTIATING || ds == D_ATTACHING;
}

void wait_until_done_or_disk_failure(struct drbd_conf *mdev, unsigned int *done)
{
	wait_event(mdev->misc_wait, *done || !md_io_allowed(mdev));
}

static int _drbd_md_sync_page_io(struct drbd_conf *mdev,
				 struct drbd_backing_dev *bdev,
				 struct page *page, sector_t sector,
@@ -90,8 +101,8 @@ static int _drbd_md_sync_page_io(struct drbd_conf *mdev,
	struct bio *bio;
	int ok;

	init_completion(&mdev->md_io.event);
	mdev->md_io.error = 0;
	mdev->md_io.done = 0;
	mdev->md_io.error = -ENODEV;

	if ((rw & WRITE) && !test_bit(MD_NO_FUA, &mdev->flags))
		rw |= REQ_FUA | REQ_FLUSH;
@@ -112,7 +123,7 @@ static int _drbd_md_sync_page_io(struct drbd_conf *mdev,
		bio_endio(bio, -EIO);
	else
		submit_bio(rw, bio);
	wait_for_completion(&mdev->md_io.event);
	wait_until_done_or_disk_failure(mdev, &mdev->md_io.done);
	ok = bio_flagged(bio, BIO_UPTODATE) && mdev->md_io.error == 0;

 out:
+2 −1
Original line number Diff line number Diff line
@@ -938,7 +938,7 @@ struct drbd_backing_dev {
};

struct drbd_md_io {
	struct completion event;
	unsigned int done;
	int error;
};

@@ -1541,6 +1541,7 @@ extern void *drbd_md_get_buffer(struct drbd_conf *mdev);
extern void drbd_md_put_buffer(struct drbd_conf *mdev);
extern int drbd_md_sync_page_io(struct drbd_conf *mdev,
				struct drbd_backing_dev *bdev, sector_t sector, int rw);
extern void wait_until_done_or_disk_failure(struct drbd_conf *mdev, unsigned int *done);
extern void drbd_ov_oos_found(struct drbd_conf*, sector_t, int);
extern void drbd_rs_controller_reset(struct drbd_conf *mdev);

+2 −1
Original line number Diff line number Diff line
@@ -77,7 +77,8 @@ void drbd_md_io_complete(struct bio *bio, int error)

	md_io->error = error;

	complete(&md_io->event);
	md_io->done = 1;
	wake_up(&mdev->misc_wait);
	drbd_md_put_buffer(mdev);
}