aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_nl.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block/drbd/drbd_nl.c')
-rw-r--r--drivers/block/drbd/drbd_nl.c62
1 files changed, 28 insertions, 34 deletions
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c
index c49bda7918b3..56bafdcd943e 100644
--- a/drivers/block/drbd/drbd_nl.c
+++ b/drivers/block/drbd/drbd_nl.c
@@ -2446,26 +2446,19 @@ int drbd_adm_invalidate(struct sk_buff *skb, struct genl_info *info)
2446 wait_event(mdev->misc_wait, !test_bit(BITMAP_IO, &mdev->flags)); 2446 wait_event(mdev->misc_wait, !test_bit(BITMAP_IO, &mdev->flags));
2447 drbd_flush_workqueue(mdev); 2447 drbd_flush_workqueue(mdev);
2448 2448
2449 retcode = _drbd_request_state(mdev, NS(conn, C_STARTING_SYNC_T), CS_ORDERED); 2449 /* If we happen to be C_STANDALONE R_SECONDARY, just change to
2450 2450 * D_INCONSISTENT, and set all bits in the bitmap. Otherwise,
2451 /* If that did not work, try again, 2451 * try to start a resync handshake as sync target for full sync.
2452 * but log failures this time (implicit CS_VERBOSE).
2453 *
2454 * If we happen to be C_STANDALONE R_SECONDARY,
2455 * just change to D_INCONSISTENT, and set all bits in the bitmap.
2456 * Otherwise, we just fail, to avoid races with the resync handshake.
2457 */ 2452 */
2458 if (retcode < SS_SUCCESS) { 2453 if (mdev->state.conn == C_STANDALONE && mdev->state.role == R_SECONDARY) {
2459 if (mdev->state.conn == C_STANDALONE && mdev->state.role == R_SECONDARY) { 2454 retcode = drbd_request_state(mdev, NS(disk, D_INCONSISTENT));
2460 retcode = drbd_request_state(mdev, NS(disk, D_INCONSISTENT)); 2455 if (retcode >= SS_SUCCESS) {
2461 if (retcode >= SS_SUCCESS) { 2456 if (drbd_bitmap_io(mdev, &drbd_bmio_set_n_write,
2462 if (drbd_bitmap_io(mdev, &drbd_bmio_set_n_write, 2457 "set_n_write from invalidate", BM_LOCKED_MASK))
2463 "set_n_write from invalidate", BM_LOCKED_MASK)) 2458 retcode = ERR_IO_MD_DISK;
2464 retcode = ERR_IO_MD_DISK; 2459 }
2465 } 2460 } else
2466 } else 2461 retcode = drbd_request_state(mdev, NS(conn, C_STARTING_SYNC_T));
2467 retcode = drbd_request_state(mdev, NS(conn, C_STARTING_SYNC_T));
2468 }
2469 drbd_resume_io(mdev); 2462 drbd_resume_io(mdev);
2470 2463
2471out: 2464out:
@@ -2519,21 +2512,22 @@ int drbd_adm_invalidate_peer(struct sk_buff *skb, struct genl_info *info)
2519 wait_event(mdev->misc_wait, !test_bit(BITMAP_IO, &mdev->flags)); 2512 wait_event(mdev->misc_wait, !test_bit(BITMAP_IO, &mdev->flags));
2520 drbd_flush_workqueue(mdev); 2513 drbd_flush_workqueue(mdev);
2521 2514
2522 retcode = _drbd_request_state(mdev, NS(conn, C_STARTING_SYNC_S), CS_ORDERED); 2515 /* If we happen to be C_STANDALONE R_PRIMARY, just set all bits
2523 if (retcode < SS_SUCCESS) { 2516 * in the bitmap. Otherwise, try to start a resync handshake
2524 if (mdev->state.conn == C_STANDALONE && mdev->state.role == R_PRIMARY) { 2517 * as sync source for full sync.
2525 /* The peer will get a resync upon connect anyways. Just make that 2518 */
2526 into a full resync. */ 2519 if (mdev->state.conn == C_STANDALONE && mdev->state.role == R_PRIMARY) {
2527 retcode = drbd_request_state(mdev, NS(pdsk, D_INCONSISTENT)); 2520 /* The peer will get a resync upon connect anyways. Just make that
2528 if (retcode >= SS_SUCCESS) { 2521 into a full resync. */
2529 if (drbd_bitmap_io(mdev, &drbd_bmio_set_susp_al, 2522 retcode = drbd_request_state(mdev, NS(pdsk, D_INCONSISTENT));
2530 "set_n_write from invalidate_peer", 2523 if (retcode >= SS_SUCCESS) {
2531 BM_LOCKED_SET_ALLOWED)) 2524 if (drbd_bitmap_io(mdev, &drbd_bmio_set_susp_al,
2532 retcode = ERR_IO_MD_DISK; 2525 "set_n_write from invalidate_peer",
2533 } 2526 BM_LOCKED_SET_ALLOWED))
2534 } else 2527 retcode = ERR_IO_MD_DISK;
2535 retcode = drbd_request_state(mdev, NS(conn, C_STARTING_SYNC_S)); 2528 }
2536 } 2529 } else
2530 retcode = drbd_request_state(mdev, NS(conn, C_STARTING_SYNC_S));
2537 drbd_resume_io(mdev); 2531 drbd_resume_io(mdev);
2538 2532
2539out: 2533out: