diff options
-rw-r--r-- | drivers/block/drbd/drbd_actlog.c | 26 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 3 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_req.c | 19 |
3 files changed, 37 insertions, 11 deletions
diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index ac04ef97eac2..bd925180a2b0 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c | |||
@@ -284,18 +284,32 @@ w_al_write_transaction(struct drbd_conf *mdev, struct drbd_work *w, int unused) | |||
284 | u32 xor_sum = 0; | 284 | u32 xor_sum = 0; |
285 | 285 | ||
286 | if (!get_ldev(mdev)) { | 286 | if (!get_ldev(mdev)) { |
287 | dev_err(DEV, "get_ldev() failed in w_al_write_transaction\n"); | 287 | dev_err(DEV, |
288 | "disk is %s, cannot start al transaction (-%d +%d)\n", | ||
289 | drbd_disk_str(mdev->state.disk), evicted, new_enr); | ||
288 | complete(&((struct update_al_work *)w)->event); | 290 | complete(&((struct update_al_work *)w)->event); |
289 | return 1; | 291 | return 1; |
290 | } | 292 | } |
291 | /* do we have to do a bitmap write, first? | 293 | /* do we have to do a bitmap write, first? |
292 | * TODO reduce maximum latency: | 294 | * TODO reduce maximum latency: |
293 | * submit both bios, then wait for both, | 295 | * submit both bios, then wait for both, |
294 | * instead of doing two synchronous sector writes. */ | 296 | * instead of doing two synchronous sector writes. |
297 | * For now, we must not write the transaction, | ||
298 | * if we cannot write out the bitmap of the evicted extent. */ | ||
295 | if (mdev->state.conn < C_CONNECTED && evicted != LC_FREE) | 299 | if (mdev->state.conn < C_CONNECTED && evicted != LC_FREE) |
296 | drbd_bm_write_sect(mdev, evicted/AL_EXT_PER_BM_SECT); | 300 | drbd_bm_write_sect(mdev, evicted/AL_EXT_PER_BM_SECT); |
297 | 301 | ||
298 | mutex_lock(&mdev->md_io_mutex); /* protects md_io_page, al_tr_cycle, ... */ | 302 | /* The bitmap write may have failed, causing a state change. */ |
303 | if (mdev->state.disk < D_INCONSISTENT) { | ||
304 | dev_err(DEV, | ||
305 | "disk is %s, cannot write al transaction (-%d +%d)\n", | ||
306 | drbd_disk_str(mdev->state.disk), evicted, new_enr); | ||
307 | complete(&((struct update_al_work *)w)->event); | ||
308 | put_ldev(mdev); | ||
309 | return 1; | ||
310 | } | ||
311 | |||
312 | mutex_lock(&mdev->md_io_mutex); /* protects md_io_buffer, al_tr_cycle, ... */ | ||
299 | buffer = (struct al_transaction *)page_address(mdev->md_io_page); | 313 | buffer = (struct al_transaction *)page_address(mdev->md_io_page); |
300 | 314 | ||
301 | buffer->magic = __constant_cpu_to_be32(DRBD_MAGIC); | 315 | buffer->magic = __constant_cpu_to_be32(DRBD_MAGIC); |
@@ -739,7 +753,7 @@ void drbd_al_apply_to_bm(struct drbd_conf *mdev) | |||
739 | unsigned int enr; | 753 | unsigned int enr; |
740 | unsigned long add = 0; | 754 | unsigned long add = 0; |
741 | char ppb[10]; | 755 | char ppb[10]; |
742 | int i; | 756 | int i, tmp; |
743 | 757 | ||
744 | wait_event(mdev->al_wait, lc_try_lock(mdev->act_log)); | 758 | wait_event(mdev->al_wait, lc_try_lock(mdev->act_log)); |
745 | 759 | ||
@@ -747,7 +761,9 @@ void drbd_al_apply_to_bm(struct drbd_conf *mdev) | |||
747 | enr = lc_element_by_index(mdev->act_log, i)->lc_number; | 761 | enr = lc_element_by_index(mdev->act_log, i)->lc_number; |
748 | if (enr == LC_FREE) | 762 | if (enr == LC_FREE) |
749 | continue; | 763 | continue; |
750 | add += drbd_bm_ALe_set_all(mdev, enr); | 764 | tmp = drbd_bm_ALe_set_all(mdev, enr); |
765 | dynamic_dev_dbg(DEV, "AL: set %d bits in extent %u\n", tmp, enr); | ||
766 | add += tmp; | ||
751 | } | 767 | } |
752 | 768 | ||
753 | lc_unlock(mdev->act_log); | 769 | lc_unlock(mdev->act_log); |
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 04a823b01da5..1146faa7ae38 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c | |||
@@ -1995,10 +1995,11 @@ static int receive_Data(struct drbd_conf *mdev, enum drbd_packets cmd, unsigned | |||
1995 | break; | 1995 | break; |
1996 | } | 1996 | } |
1997 | 1997 | ||
1998 | if (mdev->state.pdsk == D_DISKLESS) { | 1998 | if (mdev->state.pdsk < D_INCONSISTENT) { |
1999 | /* In case we have the only disk of the cluster, */ | 1999 | /* In case we have the only disk of the cluster, */ |
2000 | drbd_set_out_of_sync(mdev, e->sector, e->size); | 2000 | drbd_set_out_of_sync(mdev, e->sector, e->size); |
2001 | e->flags |= EE_CALL_AL_COMPLETE_IO; | 2001 | e->flags |= EE_CALL_AL_COMPLETE_IO; |
2002 | e->flags &= ~EE_MAY_SET_IN_SYNC; | ||
2002 | drbd_al_begin_io(mdev, e->sector); | 2003 | drbd_al_begin_io(mdev, e->sector); |
2003 | } | 2004 | } |
2004 | 2005 | ||
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. |