Lines Matching refs:mdev
33 extern void tl_abort_disk_io(struct drbd_conf *mdev);
53 static void after_state_ch(struct drbd_conf *mdev, union drbd_state os,
58 static union drbd_state sanitize_state(struct drbd_conf *mdev, union drbd_state ns,
68 struct drbd_conf *mdev; in conn_all_vols_unconf() local
73 idr_for_each_entry(&tconn->volumes, mdev, vnr) { in conn_all_vols_unconf()
74 if (mdev->state.disk != D_DISKLESS || in conn_all_vols_unconf()
75 mdev->state.conn != C_STANDALONE || in conn_all_vols_unconf()
76 mdev->state.role != R_SECONDARY) { in conn_all_vols_unconf()
108 struct drbd_conf *mdev; in conn_highest_role() local
112 idr_for_each_entry(&tconn->volumes, mdev, vnr) in conn_highest_role()
113 role = max_role(role, mdev->state.role); in conn_highest_role()
122 struct drbd_conf *mdev; in conn_highest_peer() local
126 idr_for_each_entry(&tconn->volumes, mdev, vnr) in conn_highest_peer()
127 peer = max_role(peer, mdev->state.peer); in conn_highest_peer()
136 struct drbd_conf *mdev; in conn_highest_disk() local
140 idr_for_each_entry(&tconn->volumes, mdev, vnr) in conn_highest_disk()
141 ds = max_t(enum drbd_disk_state, ds, mdev->state.disk); in conn_highest_disk()
150 struct drbd_conf *mdev; in conn_lowest_disk() local
154 idr_for_each_entry(&tconn->volumes, mdev, vnr) in conn_lowest_disk()
155 ds = min_t(enum drbd_disk_state, ds, mdev->state.disk); in conn_lowest_disk()
164 struct drbd_conf *mdev; in conn_highest_pdsk() local
168 idr_for_each_entry(&tconn->volumes, mdev, vnr) in conn_highest_pdsk()
169 ds = max_t(enum drbd_disk_state, ds, mdev->state.pdsk); in conn_highest_pdsk()
178 struct drbd_conf *mdev; in conn_lowest_conn() local
182 idr_for_each_entry(&tconn->volumes, mdev, vnr) in conn_lowest_conn()
183 conn = min_t(enum drbd_conns, conn, mdev->state.conn); in conn_lowest_conn()
191 struct drbd_conf *mdev; in no_peer_wf_report_params() local
196 idr_for_each_entry(&tconn->volumes, mdev, vnr) in no_peer_wf_report_params()
197 if (mdev->state.conn == C_WF_REPORT_PARAMS) { in no_peer_wf_report_params()
213 static int cl_wide_st_chg(struct drbd_conf *mdev, in cl_wide_st_chg() argument
235 drbd_change_state(struct drbd_conf *mdev, enum chg_state_flags f, in drbd_change_state() argument
242 spin_lock_irqsave(&mdev->tconn->req_lock, flags); in drbd_change_state()
243 ns = apply_mask_val(drbd_read_state(mdev), mask, val); in drbd_change_state()
244 rv = _drbd_set_state(mdev, ns, f, NULL); in drbd_change_state()
245 spin_unlock_irqrestore(&mdev->tconn->req_lock, flags); in drbd_change_state()
256 void drbd_force_state(struct drbd_conf *mdev, in drbd_force_state() argument
259 drbd_change_state(mdev, CS_HARD, mask, val); in drbd_force_state()
263 _req_st_cond(struct drbd_conf *mdev, union drbd_state mask, in _req_st_cond() argument
270 if (test_and_clear_bit(CL_ST_CHG_SUCCESS, &mdev->flags)) in _req_st_cond()
273 if (test_and_clear_bit(CL_ST_CHG_FAIL, &mdev->flags)) in _req_st_cond()
276 spin_lock_irqsave(&mdev->tconn->req_lock, flags); in _req_st_cond()
277 os = drbd_read_state(mdev); in _req_st_cond()
278 ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL); in _req_st_cond()
283 if (!cl_wide_st_chg(mdev, os, ns)) in _req_st_cond()
286 rv = is_valid_state(mdev, ns); in _req_st_cond()
288 rv = is_valid_soft_transition(os, ns, mdev->tconn); in _req_st_cond()
293 spin_unlock_irqrestore(&mdev->tconn->req_lock, flags); in _req_st_cond()
309 drbd_req_state(struct drbd_conf *mdev, union drbd_state mask, in drbd_req_state() argument
320 mutex_lock(mdev->state_mutex); in drbd_req_state()
322 spin_lock_irqsave(&mdev->tconn->req_lock, flags); in drbd_req_state()
323 os = drbd_read_state(mdev); in drbd_req_state()
324 ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL); in drbd_req_state()
327 spin_unlock_irqrestore(&mdev->tconn->req_lock, flags); in drbd_req_state()
331 if (cl_wide_st_chg(mdev, os, ns)) { in drbd_req_state()
332 rv = is_valid_state(mdev, ns); in drbd_req_state()
334 rv = is_valid_soft_transition(os, ns, mdev->tconn); in drbd_req_state()
335 spin_unlock_irqrestore(&mdev->tconn->req_lock, flags); in drbd_req_state()
339 print_st_err(mdev, os, ns, rv); in drbd_req_state()
343 if (drbd_send_state_req(mdev, mask, val)) { in drbd_req_state()
346 print_st_err(mdev, os, ns, rv); in drbd_req_state()
350 wait_event(mdev->state_wait, in drbd_req_state()
351 (rv = _req_st_cond(mdev, mask, val))); in drbd_req_state()
355 print_st_err(mdev, os, ns, rv); in drbd_req_state()
358 spin_lock_irqsave(&mdev->tconn->req_lock, flags); in drbd_req_state()
359 ns = apply_mask_val(drbd_read_state(mdev), mask, val); in drbd_req_state()
360 rv = _drbd_set_state(mdev, ns, f, &done); in drbd_req_state()
362 rv = _drbd_set_state(mdev, ns, f, &done); in drbd_req_state()
365 spin_unlock_irqrestore(&mdev->tconn->req_lock, flags); in drbd_req_state()
368 D_ASSERT(current != mdev->tconn->worker.task); in drbd_req_state()
374 mutex_unlock(mdev->state_mutex); in drbd_req_state()
390 _drbd_request_state(struct drbd_conf *mdev, union drbd_state mask, in _drbd_request_state() argument
395 wait_event(mdev->state_wait, in _drbd_request_state()
396 (rv = drbd_req_state(mdev, mask, val, f)) != SS_IN_TRANSIENT_STATE); in _drbd_request_state()
401 static void print_st(struct drbd_conf *mdev, char *name, union drbd_state ns) in print_st() argument
419 void print_st_err(struct drbd_conf *mdev, union drbd_state os, in print_st_err() argument
425 print_st(mdev, " state", os); in print_st_err()
426 print_st(mdev, "wanted", ns); in print_st_err()
460 static void drbd_pr_state_change(struct drbd_conf *mdev, union drbd_state os, union drbd_state ns, in drbd_pr_state_change() argument
509 is_valid_state(struct drbd_conf *mdev, union drbd_state ns) in is_valid_state() argument
519 if (get_ldev(mdev)) { in is_valid_state()
520 fp = rcu_dereference(mdev->ldev->disk_conf)->fencing; in is_valid_state()
521 put_ldev(mdev); in is_valid_state()
524 nc = rcu_dereference(mdev->tconn->net_conf); in is_valid_state()
529 else if (conn_highest_peer(mdev->tconn) == R_PRIMARY) in is_valid_state()
536 else if (ns.role == R_SECONDARY && mdev->open_cnt) in is_valid_state()
570 mdev->tconn->agreed_pro_version < 88) in is_valid_state()
706 static void print_sanitize_warnings(struct drbd_conf *mdev, enum sanitize_state_warnings warn) in print_sanitize_warnings() argument
731 static union drbd_state sanitize_state(struct drbd_conf *mdev, union drbd_state ns, in sanitize_state() argument
741 if (get_ldev(mdev)) { in sanitize_state()
743 fp = rcu_dereference(mdev->ldev->disk_conf)->fencing; in sanitize_state()
745 put_ldev(mdev); in sanitize_state()
771 get_ldev_if_state(mdev, D_NEGOTIATING)) { in sanitize_state()
772 if (mdev->ed_uuid == mdev->ldev->md.uuid[UI_CURRENT]) { in sanitize_state()
773 ns.disk = mdev->new_state_tmp.disk; in sanitize_state()
774 ns.pdsk = mdev->new_state_tmp.pdsk; in sanitize_state()
781 put_ldev(mdev); in sanitize_state()
876 if (mdev->tconn->res_opts.on_no_data == OND_SUSPEND_IO && in sanitize_state()
895 void drbd_resume_al(struct drbd_conf *mdev) in drbd_resume_al() argument
897 if (test_and_clear_bit(AL_SUSPENDED, &mdev->flags)) in drbd_resume_al()
902 static void set_ov_position(struct drbd_conf *mdev, enum drbd_conns cs) in set_ov_position() argument
904 if (mdev->tconn->agreed_pro_version < 90) in set_ov_position()
905 mdev->ov_start_sector = 0; in set_ov_position()
906 mdev->rs_total = drbd_bm_bits(mdev); in set_ov_position()
907 mdev->ov_position = 0; in set_ov_position()
914 mdev->ov_start_sector = ~(sector_t)0; in set_ov_position()
916 unsigned long bit = BM_SECT_TO_BIT(mdev->ov_start_sector); in set_ov_position()
917 if (bit >= mdev->rs_total) { in set_ov_position()
918 mdev->ov_start_sector = in set_ov_position()
919 BM_BIT_TO_SECT(mdev->rs_total - 1); in set_ov_position()
920 mdev->rs_total = 1; in set_ov_position()
922 mdev->rs_total -= bit; in set_ov_position()
923 mdev->ov_position = mdev->ov_start_sector; in set_ov_position()
925 mdev->ov_left = mdev->rs_total; in set_ov_position()
938 __drbd_set_state(struct drbd_conf *mdev, union drbd_state ns, in __drbd_set_state() argument
947 os = drbd_read_state(mdev); in __drbd_set_state()
949 ns = sanitize_state(mdev, ns, &ssw); in __drbd_set_state()
961 rv = is_valid_state(mdev, ns); in __drbd_set_state()
966 if (is_valid_state(mdev, os) == rv) in __drbd_set_state()
967 rv = is_valid_soft_transition(os, ns, mdev->tconn); in __drbd_set_state()
969 rv = is_valid_soft_transition(os, ns, mdev->tconn); in __drbd_set_state()
974 print_st_err(mdev, os, ns, rv); in __drbd_set_state()
978 print_sanitize_warnings(mdev, ssw); in __drbd_set_state()
980 drbd_pr_state_change(mdev, os, ns, flags); in __drbd_set_state()
986 conn_pr_state_change(mdev->tconn, os, ns, (flags & ~CS_DC_MASK) | CS_DC_SUSP); in __drbd_set_state()
994 atomic_inc(&mdev->local_cnt); in __drbd_set_state()
996 did_remote = drbd_should_do_remote(mdev->state); in __drbd_set_state()
997 mdev->state.i = ns.i; in __drbd_set_state()
998 should_do_remote = drbd_should_do_remote(mdev->state); in __drbd_set_state()
999 mdev->tconn->susp = ns.susp; in __drbd_set_state()
1000 mdev->tconn->susp_nod = ns.susp_nod; in __drbd_set_state()
1001 mdev->tconn->susp_fen = ns.susp_fen; in __drbd_set_state()
1005 start_new_tl_epoch(mdev->tconn); in __drbd_set_state()
1008 drbd_print_uuids(mdev, "attached to UUIDs"); in __drbd_set_state()
1012 no_peer_wf_report_params(mdev->tconn)) in __drbd_set_state()
1013 clear_bit(STATE_SENT, &mdev->tconn->flags); in __drbd_set_state()
1015 wake_up(&mdev->misc_wait); in __drbd_set_state()
1016 wake_up(&mdev->state_wait); in __drbd_set_state()
1017 wake_up(&mdev->tconn->ping_wait); in __drbd_set_state()
1023 mdev->ov_start_sector = in __drbd_set_state()
1024 BM_BIT_TO_SECT(drbd_bm_bits(mdev) - mdev->ov_left); in __drbd_set_state()
1025 if (mdev->ov_left) in __drbd_set_state()
1027 (unsigned long long)mdev->ov_start_sector); in __drbd_set_state()
1033 mdev->rs_paused += (long)jiffies in __drbd_set_state()
1034 -(long)mdev->rs_mark_time[mdev->rs_last_mark]; in __drbd_set_state()
1036 mod_timer(&mdev->resync_timer, jiffies); in __drbd_set_state()
1042 mdev->rs_mark_time[mdev->rs_last_mark] = jiffies; in __drbd_set_state()
1050 set_ov_position(mdev, ns.conn); in __drbd_set_state()
1051 mdev->rs_start = now; in __drbd_set_state()
1052 mdev->rs_last_events = 0; in __drbd_set_state()
1053 mdev->rs_last_sect_ev = 0; in __drbd_set_state()
1054 mdev->ov_last_oos_size = 0; in __drbd_set_state()
1055 mdev->ov_last_oos_start = 0; in __drbd_set_state()
1058 mdev->rs_mark_left[i] = mdev->ov_left; in __drbd_set_state()
1059 mdev->rs_mark_time[i] = now; in __drbd_set_state()
1062 drbd_rs_controller_reset(mdev); in __drbd_set_state()
1066 (unsigned long long)mdev->ov_position); in __drbd_set_state()
1067 mod_timer(&mdev->resync_timer, jiffies); in __drbd_set_state()
1071 if (get_ldev(mdev)) { in __drbd_set_state()
1072 u32 mdf = mdev->ldev->md.flags & ~(MDF_CONSISTENT|MDF_PRIMARY_IND| in __drbd_set_state()
1077 if (test_bit(CRASHED_PRIMARY, &mdev->flags)) in __drbd_set_state()
1079 if (mdev->state.role == R_PRIMARY || in __drbd_set_state()
1080 (mdev->state.pdsk < D_INCONSISTENT && mdev->state.peer == R_PRIMARY)) in __drbd_set_state()
1082 if (mdev->state.conn > C_WF_REPORT_PARAMS) in __drbd_set_state()
1084 if (mdev->state.disk > D_INCONSISTENT) in __drbd_set_state()
1086 if (mdev->state.disk > D_OUTDATED) in __drbd_set_state()
1088 if (mdev->state.pdsk <= D_OUTDATED && mdev->state.pdsk >= D_INCONSISTENT) in __drbd_set_state()
1090 if (mdf != mdev->ldev->md.flags) { in __drbd_set_state()
1091 mdev->ldev->md.flags = mdf; in __drbd_set_state()
1092 drbd_md_mark_dirty(mdev); in __drbd_set_state()
1095 drbd_set_ed_uuid(mdev, mdev->ldev->md.uuid[UI_CURRENT]); in __drbd_set_state()
1096 put_ldev(mdev); in __drbd_set_state()
1102 set_bit(CONSIDER_RESYNC, &mdev->flags); in __drbd_set_state()
1106 drbd_thread_stop_nowait(&mdev->tconn->receiver); in __drbd_set_state()
1110 drbd_thread_stop_nowait(&mdev->tconn->receiver); in __drbd_set_state()
1115 drbd_thread_restart_nowait(&mdev->tconn->receiver); in __drbd_set_state()
1119 drbd_resume_al(mdev); in __drbd_set_state()
1126 mdev->last_reattach_jif = jiffies; in __drbd_set_state()
1134 ascw->w.mdev = mdev; in __drbd_set_state()
1136 drbd_queue_work(&mdev->tconn->sender_work, &ascw->w); in __drbd_set_state()
1148 struct drbd_conf *mdev = w->mdev; in w_after_state_ch() local
1150 after_state_ch(mdev, ascw->os, ascw->ns, ascw->flags); in w_after_state_ch()
1160 static void abw_start_sync(struct drbd_conf *mdev, int rv) in abw_start_sync() argument
1164 _drbd_request_state(mdev, NS(conn, C_CONNECTED), CS_VERBOSE); in abw_start_sync()
1168 switch (mdev->state.conn) { in abw_start_sync()
1170 _drbd_request_state(mdev, NS(conn, C_WF_SYNC_UUID), CS_VERBOSE); in abw_start_sync()
1173 drbd_start_resync(mdev, C_SYNC_SOURCE); in abw_start_sync()
1178 int drbd_bitmap_io_from_worker(struct drbd_conf *mdev, in drbd_bitmap_io_from_worker() argument
1184 D_ASSERT(current == mdev->tconn->worker.task); in drbd_bitmap_io_from_worker()
1187 set_bit(SUSPEND_IO, &mdev->flags); in drbd_bitmap_io_from_worker()
1189 drbd_bm_lock(mdev, why, flags); in drbd_bitmap_io_from_worker()
1190 rv = io_fn(mdev); in drbd_bitmap_io_from_worker()
1191 drbd_bm_unlock(mdev); in drbd_bitmap_io_from_worker()
1193 drbd_resume_io(mdev); in drbd_bitmap_io_from_worker()
1205 static void after_state_ch(struct drbd_conf *mdev, union drbd_state os, in after_state_ch() argument
1215 clear_bit(CRASHED_PRIMARY, &mdev->flags); in after_state_ch()
1216 if (mdev->p_uuid) in after_state_ch()
1217 mdev->p_uuid[UI_FLAGS] &= ~((u64)2); in after_state_ch()
1221 drbd_bcast_event(mdev, &sib); in after_state_ch()
1225 drbd_khelper(mdev, "pri-on-incon-degr"); in after_state_ch()
1231 struct drbd_tconn *tconn = mdev->tconn; in after_state_ch()
1253 struct drbd_tconn *tconn = mdev->tconn; in after_state_ch()
1280 mdev->tconn->agreed_pro_version >= 96 && get_ldev(mdev)) { in after_state_ch()
1281 drbd_gen_and_send_sync_uuid(mdev); in after_state_ch()
1282 put_ldev(mdev); in after_state_ch()
1290 mdev->rs_total = 0; in after_state_ch()
1291 mdev->rs_failed = 0; in after_state_ch()
1292 atomic_set(&mdev->rs_pending_cnt, 0); in after_state_ch()
1293 drbd_rs_cancel_all(mdev); in after_state_ch()
1295 drbd_send_uuids(mdev); in after_state_ch()
1296 drbd_send_state(mdev, ns); in after_state_ch()
1302 mdev->state.conn == C_WF_BITMAP_S) in after_state_ch()
1303 drbd_queue_bitmap_io(mdev, &drbd_send_bitmap, NULL, in after_state_ch()
1314 if (get_ldev(mdev)) { in after_state_ch()
1316 mdev->ldev->md.uuid[UI_BITMAP] == 0 && ns.disk >= D_UP_TO_DATE) { in after_state_ch()
1317 if (drbd_suspended(mdev)) { in after_state_ch()
1318 set_bit(NEW_CUR_UUID, &mdev->flags); in after_state_ch()
1320 drbd_uuid_new_current(mdev); in after_state_ch()
1321 drbd_send_uuids(mdev); in after_state_ch()
1324 put_ldev(mdev); in after_state_ch()
1328 if (ns.pdsk < D_INCONSISTENT && get_ldev(mdev)) { in after_state_ch()
1330 mdev->ldev->md.uuid[UI_BITMAP] == 0 && ns.disk >= D_UP_TO_DATE) { in after_state_ch()
1331 drbd_uuid_new_current(mdev); in after_state_ch()
1332 drbd_send_uuids(mdev); in after_state_ch()
1339 drbd_bitmap_io_from_worker(mdev, &drbd_bm_write, in after_state_ch()
1341 put_ldev(mdev); in after_state_ch()
1348 mdev->state.conn <= C_CONNECTED && get_ldev(mdev)) { in after_state_ch()
1351 drbd_bitmap_io_from_worker(mdev, &drbd_bm_write, in after_state_ch()
1353 put_ldev(mdev); in after_state_ch()
1359 drbd_send_sizes(mdev, 0, 0); /* to start sync... */ in after_state_ch()
1360 drbd_send_uuids(mdev); in after_state_ch()
1361 drbd_send_state(mdev, ns); in after_state_ch()
1368 drbd_send_state(mdev, ns); in after_state_ch()
1373 suspend_other_sg(mdev); in after_state_ch()
1378 drbd_send_state(mdev, ns); in after_state_ch()
1381 drbd_send_state(mdev, ns); in after_state_ch()
1387 drbd_queue_bitmap_io(mdev, in after_state_ch()
1400 if (mdev->ldev) { in after_state_ch()
1402 eh = rcu_dereference(mdev->ldev->disk_conf)->on_io_error; in after_state_ch()
1405 was_io_error = test_and_clear_bit(WAS_IO_ERROR, &mdev->flags); in after_state_ch()
1408 drbd_khelper(mdev, "local-io-error"); in after_state_ch()
1423 if (test_and_clear_bit(FORCE_DETACH, &mdev->flags)) in after_state_ch()
1424 tl_abort_disk_io(mdev); in after_state_ch()
1429 if (mdev->state.disk != D_FAILED) in after_state_ch()
1432 drbd_disk_str(mdev->state.disk)); in after_state_ch()
1435 drbd_send_state(mdev, ns); in after_state_ch()
1437 drbd_rs_cancel_all(mdev); in after_state_ch()
1442 drbd_md_sync(mdev); in after_state_ch()
1444 put_ldev(mdev); in after_state_ch()
1453 if (mdev->state.disk != D_DISKLESS) in after_state_ch()
1456 drbd_disk_str(mdev->state.disk)); in after_state_ch()
1459 drbd_send_state(mdev, ns); in after_state_ch()
1462 put_ldev(mdev); in after_state_ch()
1467 drbd_send_state(mdev, ns); in after_state_ch()
1471 test_and_clear_bit(RESYNC_AFTER_NEG, &mdev->flags)) { in after_state_ch()
1473 resync_after_online_grow(mdev); in after_state_ch()
1480 resume_next_sg(mdev); in after_state_ch()
1485 drbd_send_state(mdev, ns); in after_state_ch()
1491 && verify_can_do_stop_sector(mdev)) in after_state_ch()
1492 drbd_send_state(mdev, ns); in after_state_ch()
1501 if (os.conn > C_CONNECTED && ns.conn <= C_CONNECTED && get_ldev(mdev)) { in after_state_ch()
1502 drbd_queue_bitmap_io(mdev, &drbd_bm_write_copy_pages, NULL, in after_state_ch()
1504 put_ldev(mdev); in after_state_ch()
1511 resume_next_sg(mdev); in after_state_ch()
1514 drbd_md_sync(mdev); in after_state_ch()
1532 struct drbd_conf *mdev; in w_after_conn_state_ch() local
1560 idr_for_each_entry(&tconn->volumes, mdev, vnr) { in w_after_conn_state_ch()
1561 if (test_bit(NEW_CUR_UUID, &mdev->flags)) { in w_after_conn_state_ch()
1562 drbd_uuid_new_current(mdev); in w_after_conn_state_ch()
1563 clear_bit(NEW_CUR_UUID, &mdev->flags); in w_after_conn_state_ch()
1586 struct drbd_conf *mdev; in conn_old_common_state() local
1597 idr_for_each_entry(&tconn->volumes, mdev, vnr) { in conn_old_common_state()
1598 os = mdev->state; in conn_old_common_state()
1634 struct drbd_conf *mdev; in conn_is_valid_transition() local
1638 idr_for_each_entry(&tconn->volumes, mdev, vnr) { in conn_is_valid_transition()
1639 os = drbd_read_state(mdev); in conn_is_valid_transition()
1640 ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL); in conn_is_valid_transition()
1653 rv = is_valid_state(mdev, ns); in conn_is_valid_transition()
1655 if (is_valid_state(mdev, os) == rv) in conn_is_valid_transition()
1666 print_st_err(mdev, os, ns, rv); in conn_is_valid_transition()
1683 struct drbd_conf *mdev; in conn_set_state() local
1698 idr_for_each_entry(&tconn->volumes, mdev, vnr) { in conn_set_state()
1700 os = drbd_read_state(mdev); in conn_set_state()
1702 ns = sanitize_state(mdev, ns, NULL); in conn_set_state()
1707 rv = __drbd_set_state(mdev, ns, flags, NULL); in conn_set_state()
1711 ns.i = mdev->state.i; in conn_set_state()