aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_actlog.c
diff options
context:
space:
mode:
authorLars Ellenberg <lars.ellenberg@linbit.com>2012-09-27 09:07:11 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2012-11-09 08:11:40 -0500
commite34b677d09ce375a87acd0360537cbed33881b0c (patch)
tree6b8d1a2d6224f095c046bc0792d9288190253e19 /drivers/block/drbd/drbd_actlog.c
parent8747d30af97232f9ff4cde78b8d259cc715a9b7a (diff)
drbd: wait for meta data IO completion even with failed disk, unless force-detached
The intention of force-detach is to be able to deal with a completely unresponsive lower level IO stack, which does not even deliver error completions anymore, but no completion at all. In all other cases, we must still wait for the meta data IO completion. 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.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c
index e81085795ec4..bc6284ef21d5 100644
--- a/drivers/block/drbd/drbd_actlog.c
+++ b/drivers/block/drbd/drbd_actlog.c
@@ -123,13 +123,7 @@ void drbd_md_put_buffer(struct drbd_conf *mdev)
123 wake_up(&mdev->misc_wait); 123 wake_up(&mdev->misc_wait);
124} 124}
125 125
126static bool md_io_allowed(struct drbd_conf *mdev) 126void wait_until_done_or_force_detached(struct drbd_conf *mdev, struct drbd_backing_dev *bdev,
127{
128 enum drbd_disk_state ds = mdev->state.disk;
129 return ds >= D_NEGOTIATING || ds == D_ATTACHING;
130}
131
132void wait_until_done_or_disk_failure(struct drbd_conf *mdev, struct drbd_backing_dev *bdev,
133 unsigned int *done) 127 unsigned int *done)
134{ 128{
135 long dt; 129 long dt;
@@ -141,9 +135,12 @@ void wait_until_done_or_disk_failure(struct drbd_conf *mdev, struct drbd_backing
141 if (dt == 0) 135 if (dt == 0)
142 dt = MAX_SCHEDULE_TIMEOUT; 136 dt = MAX_SCHEDULE_TIMEOUT;
143 137
144 dt = wait_event_timeout(mdev->misc_wait, *done || !md_io_allowed(mdev), dt); 138 dt = wait_event_timeout(mdev->misc_wait,
145 if (dt == 0) 139 *done || test_bit(FORCE_DETACH, &mdev->flags), dt);
140 if (dt == 0) {
146 dev_err(DEV, "meta-data IO operation timed out\n"); 141 dev_err(DEV, "meta-data IO operation timed out\n");
142 drbd_chk_io_error(mdev, 1, DRBD_FORCE_DETACH);
143 }
147} 144}
148 145
149static int _drbd_md_sync_page_io(struct drbd_conf *mdev, 146static int _drbd_md_sync_page_io(struct drbd_conf *mdev,
@@ -183,7 +180,7 @@ static int _drbd_md_sync_page_io(struct drbd_conf *mdev,
183 bio_endio(bio, -EIO); 180 bio_endio(bio, -EIO);
184 else 181 else
185 submit_bio(rw, bio); 182 submit_bio(rw, bio);
186 wait_until_done_or_disk_failure(mdev, bdev, &mdev->md_io.done); 183 wait_until_done_or_force_detached(mdev, bdev, &mdev->md_io.done);
187 if (bio_flagged(bio, BIO_UPTODATE)) 184 if (bio_flagged(bio, BIO_UPTODATE))
188 err = mdev->md_io.error; 185 err = mdev->md_io.error;
189 186