Lines Matching refs:device
35 struct drbd_device *device; member
52 static void after_state_ch(struct drbd_device *device, union drbd_state os,
57 static union drbd_state sanitize_state(struct drbd_device *device, union drbd_state os,
73 struct drbd_device *device = peer_device->device; in conn_all_vols_unconf() local
74 if (device->state.disk != D_DISKLESS || in conn_all_vols_unconf()
75 device->state.conn != C_STANDALONE || in conn_all_vols_unconf()
76 device->state.role != R_SECONDARY) { in conn_all_vols_unconf()
113 struct drbd_device *device = peer_device->device; in conn_highest_role() local
114 role = max_role(role, device->state.role); in conn_highest_role()
129 struct drbd_device *device = peer_device->device; in conn_highest_peer() local
130 peer = max_role(peer, device->state.peer); in conn_highest_peer()
145 struct drbd_device *device = peer_device->device; in conn_highest_disk() local
146 disk_state = max_t(enum drbd_disk_state, disk_state, device->state.disk); in conn_highest_disk()
161 struct drbd_device *device = peer_device->device; in conn_lowest_disk() local
162 disk_state = min_t(enum drbd_disk_state, disk_state, device->state.disk); in conn_lowest_disk()
177 struct drbd_device *device = peer_device->device; in conn_highest_pdsk() local
178 disk_state = max_t(enum drbd_disk_state, disk_state, device->state.pdsk); in conn_highest_pdsk()
193 struct drbd_device *device = peer_device->device; in conn_lowest_conn() local
194 conn = min_t(enum drbd_conns, conn, device->state.conn); in conn_lowest_conn()
209 if (peer_device->device->state.conn == C_WF_REPORT_PARAMS) { in no_peer_wf_report_params()
225 wake_up(&peer_device->device->state_wait); in wake_up_all_devices()
237 static int cl_wide_st_chg(struct drbd_device *device, in cl_wide_st_chg() argument
259 drbd_change_state(struct drbd_device *device, enum chg_state_flags f, in drbd_change_state() argument
266 spin_lock_irqsave(&device->resource->req_lock, flags); in drbd_change_state()
267 ns = apply_mask_val(drbd_read_state(device), mask, val); in drbd_change_state()
268 rv = _drbd_set_state(device, ns, f, NULL); in drbd_change_state()
269 spin_unlock_irqrestore(&device->resource->req_lock, flags); in drbd_change_state()
280 void drbd_force_state(struct drbd_device *device, in drbd_force_state() argument
283 drbd_change_state(device, CS_HARD, mask, val); in drbd_force_state()
287 _req_st_cond(struct drbd_device *device, union drbd_state mask, in _req_st_cond() argument
294 if (test_and_clear_bit(CL_ST_CHG_SUCCESS, &device->flags)) in _req_st_cond()
297 if (test_and_clear_bit(CL_ST_CHG_FAIL, &device->flags)) in _req_st_cond()
300 spin_lock_irqsave(&device->resource->req_lock, flags); in _req_st_cond()
301 os = drbd_read_state(device); in _req_st_cond()
302 ns = sanitize_state(device, os, apply_mask_val(os, mask, val), NULL); in _req_st_cond()
307 if (!cl_wide_st_chg(device, os, ns)) in _req_st_cond()
310 rv = is_valid_state(device, ns); in _req_st_cond()
312 rv = is_valid_soft_transition(os, ns, first_peer_device(device)->connection); in _req_st_cond()
317 spin_unlock_irqrestore(&device->resource->req_lock, flags); in _req_st_cond()
333 drbd_req_state(struct drbd_device *device, union drbd_state mask, in drbd_req_state() argument
344 mutex_lock(device->state_mutex); in drbd_req_state()
346 spin_lock_irqsave(&device->resource->req_lock, flags); in drbd_req_state()
347 os = drbd_read_state(device); in drbd_req_state()
348 ns = sanitize_state(device, os, apply_mask_val(os, mask, val), NULL); in drbd_req_state()
351 spin_unlock_irqrestore(&device->resource->req_lock, flags); in drbd_req_state()
355 if (cl_wide_st_chg(device, os, ns)) { in drbd_req_state()
356 rv = is_valid_state(device, ns); in drbd_req_state()
358 rv = is_valid_soft_transition(os, ns, first_peer_device(device)->connection); in drbd_req_state()
359 spin_unlock_irqrestore(&device->resource->req_lock, flags); in drbd_req_state()
363 print_st_err(device, os, ns, rv); in drbd_req_state()
367 if (drbd_send_state_req(first_peer_device(device), mask, val)) { in drbd_req_state()
370 print_st_err(device, os, ns, rv); in drbd_req_state()
374 wait_event(device->state_wait, in drbd_req_state()
375 (rv = _req_st_cond(device, mask, val))); in drbd_req_state()
379 print_st_err(device, os, ns, rv); in drbd_req_state()
382 spin_lock_irqsave(&device->resource->req_lock, flags); in drbd_req_state()
383 ns = apply_mask_val(drbd_read_state(device), mask, val); in drbd_req_state()
384 rv = _drbd_set_state(device, ns, f, &done); in drbd_req_state()
386 rv = _drbd_set_state(device, ns, f, &done); in drbd_req_state()
389 spin_unlock_irqrestore(&device->resource->req_lock, flags); in drbd_req_state()
392 D_ASSERT(device, current != first_peer_device(device)->connection->worker.task); in drbd_req_state()
398 mutex_unlock(device->state_mutex); in drbd_req_state()
414 _drbd_request_state(struct drbd_device *device, union drbd_state mask, in _drbd_request_state() argument
419 wait_event(device->state_wait, in _drbd_request_state()
420 (rv = drbd_req_state(device, mask, val, f)) != SS_IN_TRANSIENT_STATE); in _drbd_request_state()
426 _drbd_request_state_holding_state_mutex(struct drbd_device *device, union drbd_state mask, in _drbd_request_state_holding_state_mutex() argument
433 wait_event_cmd(device->state_wait, in _drbd_request_state_holding_state_mutex()
434 (rv = drbd_req_state(device, mask, val, f)) != SS_IN_TRANSIENT_STATE, in _drbd_request_state_holding_state_mutex()
435 mutex_unlock(device->state_mutex), in _drbd_request_state_holding_state_mutex()
436 mutex_lock(device->state_mutex)); in _drbd_request_state_holding_state_mutex()
441 static void print_st(struct drbd_device *device, const char *name, union drbd_state ns) in print_st() argument
443 drbd_err(device, " %s = { cs:%s ro:%s/%s ds:%s/%s %c%c%c%c%c%c }\n", in print_st()
459 void print_st_err(struct drbd_device *device, union drbd_state os, in print_st_err() argument
464 drbd_err(device, "State change failed: %s\n", drbd_set_st_err_str(err)); in print_st_err()
465 print_st(device, " state", os); in print_st_err()
466 print_st(device, "wanted", ns); in print_st_err()
500 static void drbd_pr_state_change(struct drbd_device *device, union drbd_state os, union drbd_state … in drbd_pr_state_change() argument
522 drbd_info(device, "%s\n", pb); in drbd_pr_state_change()
549 is_valid_state(struct drbd_device *device, union drbd_state ns) in is_valid_state() argument
559 if (get_ldev(device)) { in is_valid_state()
560 fp = rcu_dereference(device->ldev->disk_conf)->fencing; in is_valid_state()
561 put_ldev(device); in is_valid_state()
564 nc = rcu_dereference(first_peer_device(device)->connection->net_conf); in is_valid_state()
569 else if (conn_highest_peer(first_peer_device(device)->connection) == R_PRIMARY) in is_valid_state()
576 else if (ns.role == R_SECONDARY && device->open_cnt) in is_valid_state()
610 first_peer_device(device)->connection->agreed_pro_version < 88) in is_valid_state()
743 static void print_sanitize_warnings(struct drbd_device *device, enum sanitize_state_warnings warn) in print_sanitize_warnings() argument
755 drbd_warn(device, "%s\n", msg_table[warn]); in print_sanitize_warnings()
768 static union drbd_state sanitize_state(struct drbd_device *device, union drbd_state os, in sanitize_state() argument
778 if (get_ldev(device)) { in sanitize_state()
780 fp = rcu_dereference(device->ldev->disk_conf)->fencing; in sanitize_state()
782 put_ldev(device); in sanitize_state()
808 get_ldev_if_state(device, D_NEGOTIATING)) { in sanitize_state()
809 if (device->ed_uuid == device->ldev->md.uuid[UI_CURRENT]) { in sanitize_state()
810 ns.disk = device->new_state_tmp.disk; in sanitize_state()
811 ns.pdsk = device->new_state_tmp.pdsk; in sanitize_state()
818 put_ldev(device); in sanitize_state()
914 if (device->resource->res_opts.on_no_data == OND_SUSPEND_IO && in sanitize_state()
934 void drbd_resume_al(struct drbd_device *device) in drbd_resume_al() argument
936 if (test_and_clear_bit(AL_SUSPENDED, &device->flags)) in drbd_resume_al()
937 drbd_info(device, "Resumed AL updates\n"); in drbd_resume_al()
941 static void set_ov_position(struct drbd_device *device, enum drbd_conns cs) in set_ov_position() argument
943 if (first_peer_device(device)->connection->agreed_pro_version < 90) in set_ov_position()
944 device->ov_start_sector = 0; in set_ov_position()
945 device->rs_total = drbd_bm_bits(device); in set_ov_position()
946 device->ov_position = 0; in set_ov_position()
953 device->ov_start_sector = ~(sector_t)0; in set_ov_position()
955 unsigned long bit = BM_SECT_TO_BIT(device->ov_start_sector); in set_ov_position()
956 if (bit >= device->rs_total) { in set_ov_position()
957 device->ov_start_sector = in set_ov_position()
958 BM_BIT_TO_SECT(device->rs_total - 1); in set_ov_position()
959 device->rs_total = 1; in set_ov_position()
961 device->rs_total -= bit; in set_ov_position()
962 device->ov_position = device->ov_start_sector; in set_ov_position()
964 device->ov_left = device->rs_total; in set_ov_position()
977 __drbd_set_state(struct drbd_device *device, union drbd_state ns, in __drbd_set_state() argument
980 struct drbd_peer_device *peer_device = first_peer_device(device); in __drbd_set_state()
987 os = drbd_read_state(device); in __drbd_set_state()
989 ns = sanitize_state(device, os, ns, &ssw); in __drbd_set_state()
1001 rv = is_valid_state(device, ns); in __drbd_set_state()
1006 if (is_valid_state(device, os) == rv) in __drbd_set_state()
1014 print_st_err(device, os, ns, rv); in __drbd_set_state()
1018 print_sanitize_warnings(device, ssw); in __drbd_set_state()
1020 drbd_pr_state_change(device, os, ns, flags); in __drbd_set_state()
1035 atomic_inc(&device->local_cnt); in __drbd_set_state()
1038 clear_bit(RS_DONE, &device->flags); in __drbd_set_state()
1044 device->state.i = ns.i; in __drbd_set_state()
1045 device->resource->susp = ns.susp; in __drbd_set_state()
1046 device->resource->susp_nod = ns.susp_nod; in __drbd_set_state()
1047 device->resource->susp_fen = ns.susp_fen; in __drbd_set_state()
1056 drbd_print_uuids(device, "attached to UUIDs"); in __drbd_set_state()
1065 wake_up(&device->misc_wait); in __drbd_set_state()
1066 wake_up(&device->state_wait); in __drbd_set_state()
1073 device->ov_start_sector = in __drbd_set_state()
1074 BM_BIT_TO_SECT(drbd_bm_bits(device) - device->ov_left); in __drbd_set_state()
1075 if (device->ov_left) in __drbd_set_state()
1076 drbd_info(device, "Online Verify reached sector %llu\n", in __drbd_set_state()
1077 (unsigned long long)device->ov_start_sector); in __drbd_set_state()
1082 drbd_info(device, "Syncer continues.\n"); in __drbd_set_state()
1083 device->rs_paused += (long)jiffies in __drbd_set_state()
1084 -(long)device->rs_mark_time[device->rs_last_mark]; in __drbd_set_state()
1086 mod_timer(&device->resync_timer, jiffies); in __drbd_set_state()
1091 drbd_info(device, "Resync suspended\n"); in __drbd_set_state()
1092 device->rs_mark_time[device->rs_last_mark] = jiffies; in __drbd_set_state()
1100 set_ov_position(device, ns.conn); in __drbd_set_state()
1101 device->rs_start = now; in __drbd_set_state()
1102 device->rs_last_sect_ev = 0; in __drbd_set_state()
1103 device->ov_last_oos_size = 0; in __drbd_set_state()
1104 device->ov_last_oos_start = 0; in __drbd_set_state()
1107 device->rs_mark_left[i] = device->ov_left; in __drbd_set_state()
1108 device->rs_mark_time[i] = now; in __drbd_set_state()
1111 drbd_rs_controller_reset(device); in __drbd_set_state()
1114 drbd_info(device, "Starting Online Verify from sector %llu\n", in __drbd_set_state()
1115 (unsigned long long)device->ov_position); in __drbd_set_state()
1116 mod_timer(&device->resync_timer, jiffies); in __drbd_set_state()
1120 if (get_ldev(device)) { in __drbd_set_state()
1121 u32 mdf = device->ldev->md.flags & ~(MDF_CONSISTENT|MDF_PRIMARY_IND| in __drbd_set_state()
1126 if (test_bit(CRASHED_PRIMARY, &device->flags)) in __drbd_set_state()
1128 if (device->state.role == R_PRIMARY || in __drbd_set_state()
1129 (device->state.pdsk < D_INCONSISTENT && device->state.peer == R_PRIMARY)) in __drbd_set_state()
1131 if (device->state.conn > C_WF_REPORT_PARAMS) in __drbd_set_state()
1133 if (device->state.disk > D_INCONSISTENT) in __drbd_set_state()
1135 if (device->state.disk > D_OUTDATED) in __drbd_set_state()
1137 if (device->state.pdsk <= D_OUTDATED && device->state.pdsk >= D_INCONSISTENT) in __drbd_set_state()
1139 if (mdf != device->ldev->md.flags) { in __drbd_set_state()
1140 device->ldev->md.flags = mdf; in __drbd_set_state()
1141 drbd_md_mark_dirty(device); in __drbd_set_state()
1144 drbd_set_ed_uuid(device, device->ldev->md.uuid[UI_CURRENT]); in __drbd_set_state()
1145 put_ldev(device); in __drbd_set_state()
1151 set_bit(CONSIDER_RESYNC, &device->flags); in __drbd_set_state()
1168 drbd_resume_al(device); in __drbd_set_state()
1177 device->last_reattach_jif = jiffies; in __drbd_set_state()
1185 ascw->device = device; in __drbd_set_state()
1190 drbd_err(device, "Could not kmalloc an ascw\n"); in __drbd_set_state()
1200 struct drbd_device *device = ascw->device; in w_after_state_ch() local
1202 after_state_ch(device, ascw->os, ascw->ns, ascw->flags); in w_after_state_ch()
1210 static void abw_start_sync(struct drbd_device *device, int rv) in abw_start_sync() argument
1213 drbd_err(device, "Writing the bitmap failed not starting resync.\n"); in abw_start_sync()
1214 _drbd_request_state(device, NS(conn, C_CONNECTED), CS_VERBOSE); in abw_start_sync()
1218 switch (device->state.conn) { in abw_start_sync()
1220 _drbd_request_state(device, NS(conn, C_WF_SYNC_UUID), CS_VERBOSE); in abw_start_sync()
1223 drbd_start_resync(device, C_SYNC_SOURCE); in abw_start_sync()
1228 int drbd_bitmap_io_from_worker(struct drbd_device *device, in drbd_bitmap_io_from_worker() argument
1234 D_ASSERT(device, current == first_peer_device(device)->connection->worker.task); in drbd_bitmap_io_from_worker()
1237 set_bit(SUSPEND_IO, &device->flags); in drbd_bitmap_io_from_worker()
1239 drbd_bm_lock(device, why, flags); in drbd_bitmap_io_from_worker()
1240 rv = io_fn(device); in drbd_bitmap_io_from_worker()
1241 drbd_bm_unlock(device); in drbd_bitmap_io_from_worker()
1243 drbd_resume_io(device); in drbd_bitmap_io_from_worker()
1255 static void after_state_ch(struct drbd_device *device, union drbd_state os, in after_state_ch() argument
1258 struct drbd_resource *resource = device->resource; in after_state_ch()
1259 struct drbd_peer_device *peer_device = first_peer_device(device); in after_state_ch()
1269 clear_bit(CRASHED_PRIMARY, &device->flags); in after_state_ch()
1270 if (device->p_uuid) in after_state_ch()
1271 device->p_uuid[UI_FLAGS] &= ~((u64)2); in after_state_ch()
1275 drbd_bcast_event(device, &sib); in after_state_ch()
1279 drbd_khelper(device, "pri-on-incon-degr"); in after_state_ch()
1287 spin_lock_irq(&device->resource->req_lock); in after_state_ch()
1302 spin_unlock_irq(&device->resource->req_lock); in after_state_ch()
1306 spin_lock_irq(&device->resource->req_lock); in after_state_ch()
1314 clear_bit(NEW_CUR_UUID, &peer_device->device->flags); in after_state_ch()
1322 spin_unlock_irq(&device->resource->req_lock); in after_state_ch()
1331 connection->agreed_pro_version >= 96 && get_ldev(device)) { in after_state_ch()
1333 put_ldev(device); in after_state_ch()
1341 device->rs_total = 0; in after_state_ch()
1342 device->rs_failed = 0; in after_state_ch()
1343 atomic_set(&device->rs_pending_cnt, 0); in after_state_ch()
1344 drbd_rs_cancel_all(device); in after_state_ch()
1353 device->state.conn == C_WF_BITMAP_S) in after_state_ch()
1354 drbd_queue_bitmap_io(device, &drbd_send_bitmap, NULL, in after_state_ch()
1365 if (get_ldev(device)) { in after_state_ch()
1367 device->ldev->md.uuid[UI_BITMAP] == 0 && ns.disk >= D_UP_TO_DATE) { in after_state_ch()
1368 if (drbd_suspended(device)) { in after_state_ch()
1369 set_bit(NEW_CUR_UUID, &device->flags); in after_state_ch()
1371 drbd_uuid_new_current(device); in after_state_ch()
1375 put_ldev(device); in after_state_ch()
1379 if (ns.pdsk < D_INCONSISTENT && get_ldev(device)) { in after_state_ch()
1381 device->ldev->md.uuid[UI_BITMAP] == 0 && ns.disk >= D_UP_TO_DATE) { in after_state_ch()
1382 drbd_uuid_new_current(device); in after_state_ch()
1390 drbd_bitmap_io_from_worker(device, &drbd_bm_write, in after_state_ch()
1392 put_ldev(device); in after_state_ch()
1399 device->state.conn <= C_CONNECTED && get_ldev(device)) { in after_state_ch()
1402 drbd_bitmap_io_from_worker(device, &drbd_bm_write, in after_state_ch()
1404 put_ldev(device); in after_state_ch()
1424 suspend_other_sg(device); in after_state_ch()
1438 drbd_queue_bitmap_io(device, in after_state_ch()
1451 if (device->ldev) { in after_state_ch()
1453 eh = rcu_dereference(device->ldev->disk_conf)->on_io_error; in after_state_ch()
1456 was_io_error = test_and_clear_bit(WAS_IO_ERROR, &device->flags); in after_state_ch()
1459 drbd_khelper(device, "local-io-error"); in after_state_ch()
1474 if (test_and_clear_bit(FORCE_DETACH, &device->flags)) in after_state_ch()
1475 tl_abort_disk_io(device); in after_state_ch()
1480 if (device->state.disk != D_FAILED) in after_state_ch()
1481 drbd_err(device, in after_state_ch()
1483 drbd_disk_str(device->state.disk)); in after_state_ch()
1488 drbd_rs_cancel_all(device); in after_state_ch()
1493 drbd_md_sync(device); in after_state_ch()
1495 put_ldev(device); in after_state_ch()
1504 if (device->state.disk != D_DISKLESS) in after_state_ch()
1505 drbd_err(device, in after_state_ch()
1507 drbd_disk_str(device->state.disk)); in after_state_ch()
1513 put_ldev(device); in after_state_ch()
1522 test_and_clear_bit(RESYNC_AFTER_NEG, &device->flags)) { in after_state_ch()
1524 resync_after_online_grow(device); in after_state_ch()
1531 resume_next_sg(device); in after_state_ch()
1542 && verify_can_do_stop_sector(device)) in after_state_ch()
1552 if (os.conn > C_CONNECTED && ns.conn <= C_CONNECTED && get_ldev(device)) { in after_state_ch()
1553 drbd_queue_bitmap_io(device, &drbd_bm_write_copy_pages, NULL, in after_state_ch()
1555 put_ldev(device); in after_state_ch()
1562 resume_next_sg(device); in after_state_ch()
1565 drbd_md_sync(device); in after_state_ch()
1613 struct drbd_device *device = peer_device->device; in w_after_conn_state_ch() local
1614 if (test_bit(NEW_CUR_UUID, &device->flags)) { in w_after_conn_state_ch()
1615 drbd_uuid_new_current(device); in w_after_conn_state_ch()
1616 clear_bit(NEW_CUR_UUID, &device->flags); in w_after_conn_state_ch()
1651 struct drbd_device *device = peer_device->device; in conn_old_common_state() local
1652 os = device->state; in conn_old_common_state()
1693 struct drbd_device *device = peer_device->device; in conn_is_valid_transition() local
1694 os = drbd_read_state(device); in conn_is_valid_transition()
1695 ns = sanitize_state(device, os, apply_mask_val(os, mask, val), NULL); in conn_is_valid_transition()
1706 rv = is_valid_state(device, ns); in conn_is_valid_transition()
1708 if (is_valid_state(device, os) == rv) in conn_is_valid_transition()
1716 print_st_err(device, os, ns, rv); in conn_is_valid_transition()
1753 struct drbd_device *device = peer_device->device; in conn_set_state() local
1755 os = drbd_read_state(device); in conn_set_state()
1757 ns = sanitize_state(device, os, ns, NULL); in conn_set_state()
1762 rv = __drbd_set_state(device, ns, flags, NULL); in conn_set_state()
1766 ns.i = device->state.i; in conn_set_state()