aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2011-06-26 16:26:31 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2012-05-09 04:26:51 -0400
commit0c464425158482647226fb30708c68fffc061585 (patch)
tree8928c71c627290637da06ae9308ba95eef87189f /drivers/block
parente17117310b73ce6d2340ad46a539d3896a2d6de8 (diff)
drbd: Implemented wait_until_done_or_disk_failure()
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/drbd/drbd_actlog.c17
-rw-r--r--drivers/block/drbd/drbd_int.h3
-rw-r--r--drivers/block/drbd/drbd_worker.c3
3 files changed, 18 insertions, 5 deletions
diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c
index 4271352dd72b..aee599fad960 100644
--- a/drivers/block/drbd/drbd_actlog.c
+++ b/drivers/block/drbd/drbd_actlog.c
@@ -82,6 +82,17 @@ void drbd_md_put_buffer(struct drbd_conf *mdev)
82 wake_up(&mdev->misc_wait); 82 wake_up(&mdev->misc_wait);
83} 83}
84 84
85static bool md_io_allowed(struct drbd_conf *mdev)
86{
87 enum drbd_disk_state ds = mdev->state.disk;
88 return ds >= D_NEGOTIATING || ds == D_ATTACHING;
89}
90
91void wait_until_done_or_disk_failure(struct drbd_conf *mdev, unsigned int *done)
92{
93 wait_event(mdev->misc_wait, *done || !md_io_allowed(mdev));
94}
95
85static int _drbd_md_sync_page_io(struct drbd_conf *mdev, 96static int _drbd_md_sync_page_io(struct drbd_conf *mdev,
86 struct drbd_backing_dev *bdev, 97 struct drbd_backing_dev *bdev,
87 struct page *page, sector_t sector, 98 struct page *page, sector_t sector,
@@ -90,8 +101,8 @@ static int _drbd_md_sync_page_io(struct drbd_conf *mdev,
90 struct bio *bio; 101 struct bio *bio;
91 int ok; 102 int ok;
92 103
93 init_completion(&mdev->md_io.event); 104 mdev->md_io.done = 0;
94 mdev->md_io.error = 0; 105 mdev->md_io.error = -ENODEV;
95 106
96 if ((rw & WRITE) && !test_bit(MD_NO_FUA, &mdev->flags)) 107 if ((rw & WRITE) && !test_bit(MD_NO_FUA, &mdev->flags))
97 rw |= REQ_FUA | REQ_FLUSH; 108 rw |= REQ_FUA | REQ_FLUSH;
@@ -112,7 +123,7 @@ static int _drbd_md_sync_page_io(struct drbd_conf *mdev,
112 bio_endio(bio, -EIO); 123 bio_endio(bio, -EIO);
113 else 124 else
114 submit_bio(rw, bio); 125 submit_bio(rw, bio);
115 wait_for_completion(&mdev->md_io.event); 126 wait_until_done_or_disk_failure(mdev, &mdev->md_io.done);
116 ok = bio_flagged(bio, BIO_UPTODATE) && mdev->md_io.error == 0; 127 ok = bio_flagged(bio, BIO_UPTODATE) && mdev->md_io.error == 0;
117 128
118 out: 129 out:
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index 55cae74911e8..10ea9e388246 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -938,7 +938,7 @@ struct drbd_backing_dev {
938}; 938};
939 939
940struct drbd_md_io { 940struct drbd_md_io {
941 struct completion event; 941 unsigned int done;
942 int error; 942 int error;
943}; 943};
944 944
@@ -1541,6 +1541,7 @@ extern void *drbd_md_get_buffer(struct drbd_conf *mdev);
1541extern void drbd_md_put_buffer(struct drbd_conf *mdev); 1541extern void drbd_md_put_buffer(struct drbd_conf *mdev);
1542extern int drbd_md_sync_page_io(struct drbd_conf *mdev, 1542extern int drbd_md_sync_page_io(struct drbd_conf *mdev,
1543 struct drbd_backing_dev *bdev, sector_t sector, int rw); 1543 struct drbd_backing_dev *bdev, sector_t sector, int rw);
1544extern void wait_until_done_or_disk_failure(struct drbd_conf *mdev, unsigned int *done);
1544extern void drbd_ov_oos_found(struct drbd_conf*, sector_t, int); 1545extern void drbd_ov_oos_found(struct drbd_conf*, sector_t, int);
1545extern void drbd_rs_controller_reset(struct drbd_conf *mdev); 1546extern void drbd_rs_controller_reset(struct drbd_conf *mdev);
1546 1547
diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c
index 94a128b49f4f..ee8303680dd8 100644
--- a/drivers/block/drbd/drbd_worker.c
+++ b/drivers/block/drbd/drbd_worker.c
@@ -77,7 +77,8 @@ void drbd_md_io_complete(struct bio *bio, int error)
77 77
78 md_io->error = error; 78 md_io->error = error;
79 79
80 complete(&md_io->event); 80 md_io->done = 1;
81 wake_up(&mdev->misc_wait);
81 drbd_md_put_buffer(mdev); 82 drbd_md_put_buffer(mdev);
82} 83}
83 84