diff options
Diffstat (limited to 'drivers/block/drbd/drbd_req.c')
-rw-r--r-- | drivers/block/drbd/drbd_req.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index 9e91a2545fc8..d26b213dbf15 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c | |||
@@ -942,12 +942,21 @@ allocate_barrier: | |||
942 | if (local) { | 942 | if (local) { |
943 | req->private_bio->bi_bdev = mdev->ldev->backing_bdev; | 943 | req->private_bio->bi_bdev = mdev->ldev->backing_bdev; |
944 | 944 | ||
945 | if (FAULT_ACTIVE(mdev, rw == WRITE ? DRBD_FAULT_DT_WR | 945 | /* State may have changed since we grabbed our reference on the |
946 | : rw == READ ? DRBD_FAULT_DT_RD | 946 | * mdev->ldev member. Double check, and short-circuit to endio. |
947 | : DRBD_FAULT_DT_RA)) | 947 | * In case the last activity log transaction failed to get on |
948 | * stable storage, and this is a WRITE, we may not even submit | ||
949 | * this bio. */ | ||
950 | if (get_ldev(mdev)) { | ||
951 | if (FAULT_ACTIVE(mdev, rw == WRITE ? DRBD_FAULT_DT_WR | ||
952 | : rw == READ ? DRBD_FAULT_DT_RD | ||
953 | : DRBD_FAULT_DT_RA)) | ||
954 | bio_endio(req->private_bio, -EIO); | ||
955 | else | ||
956 | generic_make_request(req->private_bio); | ||
957 | put_ldev(mdev); | ||
958 | } else | ||
948 | bio_endio(req->private_bio, -EIO); | 959 | bio_endio(req->private_bio, -EIO); |
949 | else | ||
950 | generic_make_request(req->private_bio); | ||
951 | } | 960 | } |
952 | 961 | ||
953 | /* we need to plug ALWAYS since we possibly need to kick lo_dev. | 962 | /* we need to plug ALWAYS since we possibly need to kick lo_dev. |