Lines Matching refs:device
70 struct drbd_device *device; in drbd_md_endio() local
72 device = bio->bi_private; in drbd_md_endio()
73 device->md_io.error = error; in drbd_md_endio()
86 drbd_md_put_buffer(device); in drbd_md_endio()
87 device->md_io.done = 1; in drbd_md_endio()
88 wake_up(&device->misc_wait); in drbd_md_endio()
90 if (device->ldev) /* special case: drbd_md_read() during drbd_adm_attach() */ in drbd_md_endio()
91 put_ldev(device); in drbd_md_endio()
101 struct drbd_device *device = peer_device->device; in drbd_endio_read_sec_final() local
103 spin_lock_irqsave(&device->resource->req_lock, flags); in drbd_endio_read_sec_final()
104 device->read_cnt += peer_req->i.size >> 9; in drbd_endio_read_sec_final()
106 if (list_empty(&device->read_ee)) in drbd_endio_read_sec_final()
107 wake_up(&device->ee_wait); in drbd_endio_read_sec_final()
109 __drbd_chk_io_error(device, DRBD_READ_ERROR); in drbd_endio_read_sec_final()
110 spin_unlock_irqrestore(&device->resource->req_lock, flags); in drbd_endio_read_sec_final()
113 put_ldev(device); in drbd_endio_read_sec_final()
122 struct drbd_device *device = peer_device->device; in drbd_endio_write_sec_final() local
137 spin_lock_irqsave(&device->resource->req_lock, flags); in drbd_endio_write_sec_final()
138 device->writ_cnt += peer_req->i.size >> 9; in drbd_endio_write_sec_final()
139 list_move_tail(&peer_req->w.list, &device->done_ee); in drbd_endio_write_sec_final()
149 do_wake = list_empty(block_id == ID_SYNCER ? &device->sync_ee : &device->active_ee); in drbd_endio_write_sec_final()
154 __drbd_chk_io_error(device, DRBD_WRITE_ERROR); in drbd_endio_write_sec_final()
155 spin_unlock_irqrestore(&device->resource->req_lock, flags); in drbd_endio_write_sec_final()
158 drbd_rs_complete_io(device, i.sector); in drbd_endio_write_sec_final()
161 wake_up(&device->ee_wait); in drbd_endio_write_sec_final()
164 drbd_al_complete_io(device, &i); in drbd_endio_write_sec_final()
167 put_ldev(device); in drbd_endio_write_sec_final()
176 struct drbd_device *device = peer_req->peer_device->device; in drbd_peer_request_endio() local
182 drbd_warn(device, "%s: error=%d s=%llus\n", in drbd_peer_request_endio()
188 drbd_warn(device, "%s: setting error to -EIO s=%llus\n", in drbd_peer_request_endio()
215 struct drbd_device *device = req->device; in drbd_request_endio() local
221 drbd_warn(device, "p %s: setting error to -EIO\n", in drbd_request_endio()
260 …drbd_emerg(device, "delayed completion of aborted local request; disk-timeout may be too aggressiv… in drbd_request_endio()
285 spin_lock_irqsave(&device->resource->req_lock, flags); in drbd_request_endio()
287 spin_unlock_irqrestore(&device->resource->req_lock, flags); in drbd_request_endio()
288 put_ldev(device); in drbd_request_endio()
291 complete_master_bio(device, &m); in drbd_request_endio()
346 struct drbd_device *device = peer_device->device; in w_e_send_csum() local
368 drbd_free_peer_req(device, peer_req); in w_e_send_csum()
370 inc_rs_pending(device); in w_e_send_csum()
376 drbd_err(device, "kmalloc() of digest failed.\n"); in w_e_send_csum()
382 drbd_free_peer_req(device, peer_req); in w_e_send_csum()
385 drbd_err(device, "drbd_send_drequest(..., csum) failed\n"); in w_e_send_csum()
393 struct drbd_device *device = peer_device->device; in read_for_csum() local
396 if (!get_ldev(device)) in read_for_csum()
407 spin_lock_irq(&device->resource->req_lock); in read_for_csum()
408 list_add_tail(&peer_req->w.list, &device->read_ee); in read_for_csum()
409 spin_unlock_irq(&device->resource->req_lock); in read_for_csum()
411 atomic_add(size >> 9, &device->rs_sect_ev); in read_for_csum()
412 if (drbd_submit_peer_request(device, peer_req, READ, DRBD_FAULT_RS_RD) == 0) in read_for_csum()
419 spin_lock_irq(&device->resource->req_lock); in read_for_csum()
421 spin_unlock_irq(&device->resource->req_lock); in read_for_csum()
423 drbd_free_peer_req(device, peer_req); in read_for_csum()
425 put_ldev(device); in read_for_csum()
431 struct drbd_device *device = in w_resync_timer() local
434 switch (device->state.conn) { in w_resync_timer()
436 make_ov_request(device, cancel); in w_resync_timer()
439 make_resync_request(device, cancel); in w_resync_timer()
448 struct drbd_device *device = (struct drbd_device *) data; in resync_timer_fn() local
451 &first_peer_device(device)->connection->sender_work, in resync_timer_fn()
452 &device->resync_work); in resync_timer_fn()
499 static int drbd_rs_controller(struct drbd_device *device, unsigned int sect_in) in drbd_rs_controller() argument
511 dc = rcu_dereference(device->ldev->disk_conf); in drbd_rs_controller()
512 plan = rcu_dereference(device->rs_plan_s); in drbd_rs_controller()
516 if (device->rs_in_flight + sect_in == 0) { /* At start of resync */ in drbd_rs_controller()
523 correction = want - device->rs_in_flight - plan->total; in drbd_rs_controller()
551 static int drbd_rs_number_requests(struct drbd_device *device) in drbd_rs_number_requests() argument
556 sect_in = atomic_xchg(&device->rs_sect_in, 0); in drbd_rs_number_requests()
557 device->rs_in_flight -= sect_in; in drbd_rs_number_requests()
560 mxb = drbd_get_max_buffers(device) / 2; in drbd_rs_number_requests()
561 if (rcu_dereference(device->rs_plan_s)->size) { in drbd_rs_number_requests()
562 number = drbd_rs_controller(device, sect_in) >> (BM_BLOCK_SHIFT - 9); in drbd_rs_number_requests()
563 device->c_sync_rate = number * HZ * (BM_BLOCK_SIZE / 1024) / SLEEP_TIME; in drbd_rs_number_requests()
565 device->c_sync_rate = rcu_dereference(device->ldev->disk_conf)->resync_rate; in drbd_rs_number_requests()
566 number = SLEEP_TIME * device->c_sync_rate / ((BM_BLOCK_SIZE / 1024) * HZ); in drbd_rs_number_requests()
580 if (mxb - device->rs_in_flight/8 < number) in drbd_rs_number_requests()
581 number = mxb - device->rs_in_flight/8; in drbd_rs_number_requests()
586 static int make_resync_request(struct drbd_device *const device, int cancel) in make_resync_request() argument
588 struct drbd_peer_device *const peer_device = first_peer_device(device); in make_resync_request()
592 const sector_t capacity = drbd_get_capacity(device->this_bdev); in make_resync_request()
601 if (device->rs_total == 0) { in make_resync_request()
603 drbd_resync_finished(device); in make_resync_request()
607 if (!get_ldev(device)) { in make_resync_request()
612 drbd_err(device, "Disk broke down during resync!\n"); in make_resync_request()
616 max_bio_size = queue_max_hw_sectors(device->rq_queue) << 9; in make_resync_request()
617 number = drbd_rs_number_requests(device); in make_resync_request()
642 bit = drbd_bm_find_next(device, device->bm_resync_fo); in make_resync_request()
645 device->bm_resync_fo = drbd_bm_bits(device); in make_resync_request()
646 put_ldev(device); in make_resync_request()
652 if (drbd_try_rs_begin_io(device, sector)) { in make_resync_request()
653 device->bm_resync_fo = bit; in make_resync_request()
656 device->bm_resync_fo = bit + 1; in make_resync_request()
658 if (unlikely(drbd_bm_test_bit(device, bit) == 0)) { in make_resync_request()
659 drbd_rs_complete_io(device, sector); in make_resync_request()
688 if (drbd_bm_test_bit(device, bit+1) != 1) in make_resync_request()
699 device->bm_resync_fo = bit + 1; in make_resync_request()
706 if (device->use_csums) { in make_resync_request()
709 put_ldev(device); in make_resync_request()
712 drbd_rs_complete_io(device, sector); in make_resync_request()
713 device->bm_resync_fo = BM_SECT_TO_BIT(sector); in make_resync_request()
725 inc_rs_pending(device); in make_resync_request()
729 drbd_err(device, "drbd_send_drequest() failed, aborting...\n"); in make_resync_request()
730 dec_rs_pending(device); in make_resync_request()
731 put_ldev(device); in make_resync_request()
737 if (device->bm_resync_fo >= drbd_bm_bits(device)) { in make_resync_request()
744 put_ldev(device); in make_resync_request()
749 device->rs_in_flight += (i << (BM_BLOCK_SHIFT - 9)); in make_resync_request()
750 mod_timer(&device->resync_timer, jiffies + SLEEP_TIME); in make_resync_request()
751 put_ldev(device); in make_resync_request()
755 static int make_ov_request(struct drbd_device *device, int cancel) in make_ov_request() argument
759 const sector_t capacity = drbd_get_capacity(device->this_bdev); in make_ov_request()
765 number = drbd_rs_number_requests(device); in make_ov_request()
767 sector = device->ov_position; in make_ov_request()
776 && verify_can_do_stop_sector(device) in make_ov_request()
777 && sector >= device->ov_stop_sector; in make_ov_request()
783 if (drbd_try_rs_begin_io(device, sector)) { in make_ov_request()
784 device->ov_position = sector; in make_ov_request()
791 inc_rs_pending(device); in make_ov_request()
792 if (drbd_send_ov_request(first_peer_device(device), sector, size)) { in make_ov_request()
793 dec_rs_pending(device); in make_ov_request()
798 device->ov_position = sector; in make_ov_request()
801 device->rs_in_flight += (i << (BM_BLOCK_SHIFT - 9)); in make_ov_request()
803 mod_timer(&device->resync_timer, jiffies + SLEEP_TIME); in make_ov_request()
811 struct drbd_device *device = dw->device; in w_ov_finished() local
813 ov_out_of_sync_print(device); in w_ov_finished()
814 drbd_resync_finished(device); in w_ov_finished()
823 struct drbd_device *device = dw->device; in w_resync_finished() local
826 drbd_resync_finished(device); in w_resync_finished()
831 static void ping_peer(struct drbd_device *device) in ping_peer() argument
833 struct drbd_connection *connection = first_peer_device(device)->connection; in ping_peer()
838 test_bit(GOT_PING_ACK, &connection->flags) || device->state.conn < C_CONNECTED); in ping_peer()
841 int drbd_resync_finished(struct drbd_device *device) in drbd_resync_finished() argument
853 if (drbd_rs_del_all(device)) { in drbd_resync_finished()
863 dw->device = device; in drbd_resync_finished()
864 drbd_queue_work(&first_peer_device(device)->connection->sender_work, in drbd_resync_finished()
868 drbd_err(device, "Warn failed to drbd_rs_del_all() and to kmalloc(dw).\n"); in drbd_resync_finished()
871 dt = (jiffies - device->rs_start - device->rs_paused) / HZ; in drbd_resync_finished()
875 db = device->rs_total; in drbd_resync_finished()
877 if (device->state.conn == C_VERIFY_S || device->state.conn == C_VERIFY_T) in drbd_resync_finished()
878 db -= device->ov_left; in drbd_resync_finished()
881 device->rs_paused /= HZ; in drbd_resync_finished()
883 if (!get_ldev(device)) in drbd_resync_finished()
886 ping_peer(device); in drbd_resync_finished()
888 spin_lock_irq(&device->resource->req_lock); in drbd_resync_finished()
889 os = drbd_read_state(device); in drbd_resync_finished()
901 drbd_info(device, "%s done (total %lu sec; paused %lu sec; %lu K/sec)\n", in drbd_resync_finished()
903 dt + device->rs_paused, device->rs_paused, dbdt); in drbd_resync_finished()
905 n_oos = drbd_bm_total_weight(device); in drbd_resync_finished()
909 drbd_alert(device, "Online verify found %lu %dk block out of sync!\n", in drbd_resync_finished()
914 D_ASSERT(device, (n_oos - device->rs_failed) == 0); in drbd_resync_finished()
919 if (device->use_csums && device->rs_total) { in drbd_resync_finished()
920 const unsigned long s = device->rs_same_csum; in drbd_resync_finished()
921 const unsigned long t = device->rs_total; in drbd_resync_finished()
925 drbd_info(device, "%u %% had equal checksums, eliminated: %luK; " in drbd_resync_finished()
928 Bit2KB(device->rs_same_csum), in drbd_resync_finished()
929 Bit2KB(device->rs_total - device->rs_same_csum), in drbd_resync_finished()
930 Bit2KB(device->rs_total)); in drbd_resync_finished()
934 if (device->rs_failed) { in drbd_resync_finished()
935 drbd_info(device, " %lu failed blocks\n", device->rs_failed); in drbd_resync_finished()
949 if (device->p_uuid) { in drbd_resync_finished()
952 _drbd_uuid_set(device, i, device->p_uuid[i]); in drbd_resync_finished()
953 drbd_uuid_set(device, UI_BITMAP, device->ldev->md.uuid[UI_CURRENT]); in drbd_resync_finished()
954 _drbd_uuid_set(device, UI_CURRENT, device->p_uuid[UI_CURRENT]); in drbd_resync_finished()
956 drbd_err(device, "device->p_uuid is NULL! BUG\n"); in drbd_resync_finished()
963 drbd_uuid_set_bm(device, 0UL); in drbd_resync_finished()
964 drbd_print_uuids(device, "updated UUIDs"); in drbd_resync_finished()
965 if (device->p_uuid) { in drbd_resync_finished()
970 device->p_uuid[i] = device->ldev->md.uuid[i]; in drbd_resync_finished()
975 _drbd_set_state(device, ns, CS_VERBOSE, NULL); in drbd_resync_finished()
977 spin_unlock_irq(&device->resource->req_lock); in drbd_resync_finished()
978 put_ldev(device); in drbd_resync_finished()
980 device->rs_total = 0; in drbd_resync_finished()
981 device->rs_failed = 0; in drbd_resync_finished()
982 device->rs_paused = 0; in drbd_resync_finished()
985 if (verify_done && device->ov_left == 0) in drbd_resync_finished()
986 device->ov_start_sector = 0; in drbd_resync_finished()
988 drbd_md_sync(device); in drbd_resync_finished()
991 drbd_khelper(device, khelper_cmd); in drbd_resync_finished()
997 static void move_to_net_ee_or_free(struct drbd_device *device, struct drbd_peer_request *peer_req) in move_to_net_ee_or_free() argument
1002 atomic_add(i, &device->pp_in_use_by_net); in move_to_net_ee_or_free()
1003 atomic_sub(i, &device->pp_in_use); in move_to_net_ee_or_free()
1004 spin_lock_irq(&device->resource->req_lock); in move_to_net_ee_or_free()
1005 list_add_tail(&peer_req->w.list, &device->net_ee); in move_to_net_ee_or_free()
1006 spin_unlock_irq(&device->resource->req_lock); in move_to_net_ee_or_free()
1009 drbd_free_peer_req(device, peer_req); in move_to_net_ee_or_free()
1022 struct drbd_device *device = peer_device->device; in w_e_end_data_req() local
1026 drbd_free_peer_req(device, peer_req); in w_e_end_data_req()
1027 dec_unacked(device); in w_e_end_data_req()
1035 drbd_err(device, "Sending NegDReply. sector=%llus.\n", in w_e_end_data_req()
1041 dec_unacked(device); in w_e_end_data_req()
1043 move_to_net_ee_or_free(device, peer_req); in w_e_end_data_req()
1046 drbd_err(device, "drbd_send_block() failed\n"); in w_e_end_data_req()
1059 struct drbd_device *device = peer_device->device; in w_e_end_rsdata_req() local
1063 drbd_free_peer_req(device, peer_req); in w_e_end_rsdata_req()
1064 dec_unacked(device); in w_e_end_rsdata_req()
1068 if (get_ldev_if_state(device, D_FAILED)) { in w_e_end_rsdata_req()
1069 drbd_rs_complete_io(device, peer_req->i.sector); in w_e_end_rsdata_req()
1070 put_ldev(device); in w_e_end_rsdata_req()
1073 if (device->state.conn == C_AHEAD) { in w_e_end_rsdata_req()
1076 if (likely(device->state.pdsk >= D_INCONSISTENT)) { in w_e_end_rsdata_req()
1077 inc_rs_pending(device); in w_e_end_rsdata_req()
1081 drbd_err(device, "Not sending RSDataReply, " in w_e_end_rsdata_req()
1087 drbd_err(device, "Sending NegRSDReply. sector %llus.\n", in w_e_end_rsdata_req()
1093 drbd_rs_failed_io(device, peer_req->i.sector, peer_req->i.size); in w_e_end_rsdata_req()
1096 dec_unacked(device); in w_e_end_rsdata_req()
1098 move_to_net_ee_or_free(device, peer_req); in w_e_end_rsdata_req()
1101 drbd_err(device, "drbd_send_block() failed\n"); in w_e_end_rsdata_req()
1109 struct drbd_device *device = peer_device->device; in w_e_end_csum_rs_req() local
1116 drbd_free_peer_req(device, peer_req); in w_e_end_csum_rs_req()
1117 dec_unacked(device); in w_e_end_csum_rs_req()
1121 if (get_ldev(device)) { in w_e_end_csum_rs_req()
1122 drbd_rs_complete_io(device, peer_req->i.sector); in w_e_end_csum_rs_req()
1123 put_ldev(device); in w_e_end_csum_rs_req()
1134 D_ASSERT(device, digest_size == di->digest_size); in w_e_end_csum_rs_req()
1144 drbd_set_in_sync(device, peer_req->i.sector, peer_req->i.size); in w_e_end_csum_rs_req()
1146 device->rs_same_csum += peer_req->i.size >> BM_BLOCK_SHIFT; in w_e_end_csum_rs_req()
1149 inc_rs_pending(device); in w_e_end_csum_rs_req()
1158 drbd_err(device, "Sending NegDReply. I guess it gets messy.\n"); in w_e_end_csum_rs_req()
1161 dec_unacked(device); in w_e_end_csum_rs_req()
1162 move_to_net_ee_or_free(device, peer_req); in w_e_end_csum_rs_req()
1165 drbd_err(device, "drbd_send_block/ack() failed\n"); in w_e_end_csum_rs_req()
1173 struct drbd_device *device = peer_device->device; in w_e_end_ov_req() local
1200 drbd_free_peer_req(device, peer_req); in w_e_end_ov_req()
1202 inc_rs_pending(device); in w_e_end_ov_req()
1205 dec_rs_pending(device); in w_e_end_ov_req()
1210 drbd_free_peer_req(device, peer_req); in w_e_end_ov_req()
1211 dec_unacked(device); in w_e_end_ov_req()
1215 void drbd_ov_out_of_sync_found(struct drbd_device *device, sector_t sector, int size) in drbd_ov_out_of_sync_found() argument
1217 if (device->ov_last_oos_start + device->ov_last_oos_size == sector) { in drbd_ov_out_of_sync_found()
1218 device->ov_last_oos_size += size>>9; in drbd_ov_out_of_sync_found()
1220 device->ov_last_oos_start = sector; in drbd_ov_out_of_sync_found()
1221 device->ov_last_oos_size = size>>9; in drbd_ov_out_of_sync_found()
1223 drbd_set_out_of_sync(device, sector, size); in drbd_ov_out_of_sync_found()
1230 struct drbd_device *device = peer_device->device; in w_e_end_ov_reply() local
1240 drbd_free_peer_req(device, peer_req); in w_e_end_ov_reply()
1241 dec_unacked(device); in w_e_end_ov_reply()
1247 if (get_ldev(device)) { in w_e_end_ov_reply()
1248 drbd_rs_complete_io(device, peer_req->i.sector); in w_e_end_ov_reply()
1249 put_ldev(device); in w_e_end_ov_reply()
1260 D_ASSERT(device, digest_size == di->digest_size); in w_e_end_ov_reply()
1271 drbd_free_peer_req(device, peer_req); in w_e_end_ov_reply()
1273 drbd_ov_out_of_sync_found(device, sector, size); in w_e_end_ov_reply()
1275 ov_out_of_sync_print(device); in w_e_end_ov_reply()
1280 dec_unacked(device); in w_e_end_ov_reply()
1282 --device->ov_left; in w_e_end_ov_reply()
1285 if ((device->ov_left & 0x200) == 0x200) in w_e_end_ov_reply()
1286 drbd_advance_rs_marks(device, device->ov_left); in w_e_end_ov_reply()
1288 stop_sector_reached = verify_can_do_stop_sector(device) && in w_e_end_ov_reply()
1289 (sector + (size>>9)) >= device->ov_stop_sector; in w_e_end_ov_reply()
1291 if (device->ov_left == 0 || stop_sector_reached) { in w_e_end_ov_reply()
1292 ov_out_of_sync_print(device); in w_e_end_ov_reply()
1293 drbd_resync_finished(device); in w_e_end_ov_reply()
1322 struct drbd_device *device = in w_send_write_hint() local
1328 sock = &first_peer_device(device)->connection->data; in w_send_write_hint()
1329 if (!drbd_prepare_command(first_peer_device(device), sock)) in w_send_write_hint()
1331 return drbd_send_command(first_peer_device(device), sock, P_UNPLUG_REMOTE, 0, NULL, 0); in w_send_write_hint()
1358 struct drbd_device *device = req->device; in w_send_out_of_sync() local
1359 struct drbd_peer_device *const peer_device = first_peer_device(device); in w_send_out_of_sync()
1389 struct drbd_device *device = req->device; in w_send_dblock() local
1390 struct drbd_peer_device *const peer_device = first_peer_device(device); in w_send_dblock()
1418 struct drbd_device *device = req->device; in w_send_read_req() local
1419 struct drbd_peer_device *const peer_device = first_peer_device(device); in w_send_read_req()
1444 struct drbd_device *device = req->device; in w_restart_disk_io() local
1447 drbd_al_begin_io(device, &req->i); in w_restart_disk_io()
1450 req->private_bio->bi_bdev = device->ldev->backing_bdev; in w_restart_disk_io()
1456 static int _drbd_may_sync_now(struct drbd_device *device) in _drbd_may_sync_now() argument
1458 struct drbd_device *odev = device; in _drbd_may_sync_now()
1486 static int _drbd_pause_after(struct drbd_device *device) in _drbd_pause_after() argument
1510 static int _drbd_resume_next(struct drbd_device *device) in _drbd_resume_next() argument
1530 void resume_next_sg(struct drbd_device *device) in resume_next_sg() argument
1533 _drbd_resume_next(device); in resume_next_sg()
1537 void suspend_other_sg(struct drbd_device *device) in suspend_other_sg() argument
1540 _drbd_pause_after(device); in suspend_other_sg()
1545 enum drbd_ret_code drbd_resync_after_valid(struct drbd_device *device, int o_minor) in drbd_resync_after_valid() argument
1558 if (odev == device) in drbd_resync_after_valid()
1583 void drbd_resync_after_changed(struct drbd_device *device) in drbd_resync_after_changed() argument
1588 changes = _drbd_pause_after(device); in drbd_resync_after_changed()
1589 changes |= _drbd_resume_next(device); in drbd_resync_after_changed()
1593 void drbd_rs_controller_reset(struct drbd_device *device) in drbd_rs_controller_reset() argument
1595 struct gendisk *disk = device->ldev->backing_bdev->bd_contains->bd_disk; in drbd_rs_controller_reset()
1598 atomic_set(&device->rs_sect_in, 0); in drbd_rs_controller_reset()
1599 atomic_set(&device->rs_sect_ev, 0); in drbd_rs_controller_reset()
1600 device->rs_in_flight = 0; in drbd_rs_controller_reset()
1601 device->rs_last_events = in drbd_rs_controller_reset()
1610 plan = rcu_dereference(device->rs_plan_s); in drbd_rs_controller_reset()
1618 struct drbd_device *device = (struct drbd_device *) data; in start_resync_timer_fn() local
1619 drbd_device_post_work(device, RS_START); in start_resync_timer_fn()
1622 static void do_start_resync(struct drbd_device *device) in do_start_resync() argument
1624 if (atomic_read(&device->unacked_cnt) || atomic_read(&device->rs_pending_cnt)) { in do_start_resync()
1625 drbd_warn(device, "postponing start_resync ...\n"); in do_start_resync()
1626 device->start_resync_timer.expires = jiffies + HZ/10; in do_start_resync()
1627 add_timer(&device->start_resync_timer); in do_start_resync()
1631 drbd_start_resync(device, C_SYNC_SOURCE); in do_start_resync()
1632 clear_bit(AHEAD_TO_SYNC_SOURCE, &device->flags); in do_start_resync()
1635 …atic bool use_checksum_based_resync(struct drbd_connection *connection, struct drbd_device *device) in use_checksum_based_resync() argument
1644 || test_bit(CRASHED_PRIMARY, &device->flags)); /* or only after Primary crash? */ in use_checksum_based_resync()
1655 void drbd_start_resync(struct drbd_device *device, enum drbd_conns side) in drbd_start_resync() argument
1657 struct drbd_peer_device *peer_device = first_peer_device(device); in drbd_start_resync()
1662 if (device->state.conn >= C_SYNC_SOURCE && device->state.conn < C_AHEAD) { in drbd_start_resync()
1663 drbd_err(device, "Resync already running!\n"); in drbd_start_resync()
1667 if (!test_bit(B_RS_H_DONE, &device->flags)) { in drbd_start_resync()
1672 r = drbd_khelper(device, "before-resync-target"); in drbd_start_resync()
1675 drbd_info(device, "before-resync-target handler returned %d, " in drbd_start_resync()
1681 r = drbd_khelper(device, "before-resync-source"); in drbd_start_resync()
1685 drbd_info(device, "before-resync-source handler returned %d, " in drbd_start_resync()
1688 drbd_info(device, "before-resync-source handler returned %d, " in drbd_start_resync()
1701 if (!mutex_trylock(device->state_mutex)) { in drbd_start_resync()
1702 set_bit(B_RS_H_DONE, &device->flags); in drbd_start_resync()
1703 device->start_resync_timer.expires = jiffies + HZ/5; in drbd_start_resync()
1704 add_timer(&device->start_resync_timer); in drbd_start_resync()
1708 mutex_lock(device->state_mutex); in drbd_start_resync()
1710 clear_bit(B_RS_H_DONE, &device->flags); in drbd_start_resync()
1714 spin_lock_irq(&device->resource->req_lock); in drbd_start_resync()
1717 if (device->state.conn < C_CONNECTED in drbd_start_resync()
1718 || !get_ldev_if_state(device, D_NEGOTIATING)) { in drbd_start_resync()
1720 spin_unlock_irq(&device->resource->req_lock); in drbd_start_resync()
1721 mutex_unlock(device->state_mutex); in drbd_start_resync()
1725 ns = drbd_read_state(device); in drbd_start_resync()
1727 ns.aftr_isp = !_drbd_may_sync_now(device); in drbd_start_resync()
1736 r = __drbd_set_state(device, ns, CS_VERBOSE, NULL); in drbd_start_resync()
1737 ns = drbd_read_state(device); in drbd_start_resync()
1743 unsigned long tw = drbd_bm_total_weight(device); in drbd_start_resync()
1747 device->rs_failed = 0; in drbd_start_resync()
1748 device->rs_paused = 0; in drbd_start_resync()
1749 device->rs_same_csum = 0; in drbd_start_resync()
1750 device->rs_last_sect_ev = 0; in drbd_start_resync()
1751 device->rs_total = tw; in drbd_start_resync()
1752 device->rs_start = now; in drbd_start_resync()
1754 device->rs_mark_left[i] = tw; in drbd_start_resync()
1755 device->rs_mark_time[i] = now; in drbd_start_resync()
1757 _drbd_pause_after(device); in drbd_start_resync()
1761 spin_lock(&device->al_lock); in drbd_start_resync()
1762 lc_reset(device->resync); in drbd_start_resync()
1763 device->resync_locked = 0; in drbd_start_resync()
1764 device->resync_wenr = LC_FREE; in drbd_start_resync()
1765 spin_unlock(&device->al_lock); in drbd_start_resync()
1768 spin_unlock_irq(&device->resource->req_lock); in drbd_start_resync()
1771 wake_up(&device->al_wait); /* for lc_reset() above */ in drbd_start_resync()
1774 device->rs_last_bcast = jiffies - HZ; in drbd_start_resync()
1776 drbd_info(device, "Began resync as %s (will sync %lu KB [%lu bits set]).\n", in drbd_start_resync()
1778 (unsigned long) device->rs_total << (BM_BLOCK_SHIFT-10), in drbd_start_resync()
1779 (unsigned long) device->rs_total); in drbd_start_resync()
1781 device->bm_resync_fo = 0; in drbd_start_resync()
1782 device->use_csums = use_checksum_based_resync(connection, device); in drbd_start_resync()
1784 device->use_csums = 0; in drbd_start_resync()
1797 if (connection->agreed_pro_version < 95 && device->rs_total == 0) { in drbd_start_resync()
1818 drbd_resync_finished(device); in drbd_start_resync()
1821 drbd_rs_controller_reset(device); in drbd_start_resync()
1827 mod_timer(&device->resync_timer, jiffies); in drbd_start_resync()
1829 drbd_md_sync(device); in drbd_start_resync()
1831 put_ldev(device); in drbd_start_resync()
1832 mutex_unlock(device->state_mutex); in drbd_start_resync()
1835 static void update_on_disk_bitmap(struct drbd_device *device, bool resync_done) in update_on_disk_bitmap() argument
1838 device->rs_last_bcast = jiffies; in update_on_disk_bitmap()
1840 if (!get_ldev(device)) in update_on_disk_bitmap()
1843 drbd_bm_write_lazy(device, 0); in update_on_disk_bitmap()
1844 if (resync_done && is_sync_state(device->state.conn)) in update_on_disk_bitmap()
1845 drbd_resync_finished(device); in update_on_disk_bitmap()
1847 drbd_bcast_event(device, &sib); in update_on_disk_bitmap()
1849 device->rs_last_bcast = jiffies; in update_on_disk_bitmap()
1850 put_ldev(device); in update_on_disk_bitmap()
1853 static void drbd_ldev_destroy(struct drbd_device *device) in drbd_ldev_destroy() argument
1855 lc_destroy(device->resync); in drbd_ldev_destroy()
1856 device->resync = NULL; in drbd_ldev_destroy()
1857 lc_destroy(device->act_log); in drbd_ldev_destroy()
1858 device->act_log = NULL; in drbd_ldev_destroy()
1861 drbd_free_ldev(device->ldev); in drbd_ldev_destroy()
1862 device->ldev = NULL; in drbd_ldev_destroy()
1865 clear_bit(GOING_DISKLESS, &device->flags); in drbd_ldev_destroy()
1866 wake_up(&device->misc_wait); in drbd_ldev_destroy()
1869 static void go_diskless(struct drbd_device *device) in go_diskless() argument
1871 D_ASSERT(device, device->state.disk == D_FAILED); in go_diskless()
1890 if (device->bitmap && device->ldev) { in go_diskless()
1895 if (drbd_bitmap_io_from_worker(device, drbd_bm_write, in go_diskless()
1897 if (test_bit(WAS_READ_ERROR, &device->flags)) { in go_diskless()
1898 drbd_md_set_flag(device, MDF_FULL_SYNC); in go_diskless()
1899 drbd_md_sync(device); in go_diskless()
1904 drbd_force_state(device, NS(disk, D_DISKLESS)); in go_diskless()
1907 static int do_md_sync(struct drbd_device *device) in do_md_sync() argument
1909 drbd_warn(device, "md_sync_timer expired! Worker calls drbd_md_sync().\n"); in do_md_sync()
1910 drbd_md_sync(device); in do_md_sync()
1937 static void do_device_work(struct drbd_device *device, const unsigned long todo) in do_device_work() argument
1940 do_md_sync(device); in do_device_work()
1943 update_on_disk_bitmap(device, test_bit(RS_DONE, &todo)); in do_device_work()
1945 go_diskless(device); in do_device_work()
1947 drbd_ldev_destroy(device); in do_device_work()
1949 do_start_resync(device); in do_device_work()
1978 struct drbd_device *device = peer_device->device; in do_unqueued_work() local
1979 unsigned long todo = get_work_bits(&device->flags); in do_unqueued_work()
1983 kref_get(&device->kref); in do_unqueued_work()
1985 do_device_work(device, todo); in do_unqueued_work()
1986 kref_put(&device->kref, drbd_destroy_device); in do_unqueued_work()
2145 struct drbd_device *device = peer_device->device; in drbd_worker() local
2146 D_ASSERT(device, device->state.disk == D_DISKLESS && device->state.conn == C_STANDALONE); in drbd_worker()
2147 kref_get(&device->kref); in drbd_worker()
2149 drbd_device_cleanup(device); in drbd_worker()
2150 kref_put(&device->kref, drbd_destroy_device); in drbd_worker()