Lines Matching refs:device

63 	struct drbd_device *device;  in drbd_md_endio()  local
65 device = bio->bi_private; in drbd_md_endio()
66 device->md_io.error = blk_status_to_errno(bio->bi_status); in drbd_md_endio()
69 if (device->ldev) in drbd_md_endio()
70 put_ldev(device); in drbd_md_endio()
84 drbd_md_put_buffer(device); in drbd_md_endio()
85 device->md_io.done = 1; in drbd_md_endio()
86 wake_up(&device->misc_wait); in drbd_md_endio()
96 struct drbd_device *device = peer_device->device; in drbd_endio_read_sec_final() local
98 spin_lock_irqsave(&device->resource->req_lock, flags); in drbd_endio_read_sec_final()
99 device->read_cnt += peer_req->i.size >> 9; in drbd_endio_read_sec_final()
101 if (list_empty(&device->read_ee)) in drbd_endio_read_sec_final()
102 wake_up(&device->ee_wait); in drbd_endio_read_sec_final()
104 __drbd_chk_io_error(device, DRBD_READ_ERROR); in drbd_endio_read_sec_final()
105 spin_unlock_irqrestore(&device->resource->req_lock, flags); in drbd_endio_read_sec_final()
108 put_ldev(device); in drbd_endio_read_sec_final()
117 struct drbd_device *device = peer_device->device; in drbd_endio_write_sec_final() local
137 inc_unacked(device); in drbd_endio_write_sec_final()
138 drbd_set_out_of_sync(device, peer_req->i.sector, peer_req->i.size); in drbd_endio_write_sec_final()
141 spin_lock_irqsave(&device->resource->req_lock, flags); in drbd_endio_write_sec_final()
142 device->writ_cnt += peer_req->i.size >> 9; in drbd_endio_write_sec_final()
143 list_move_tail(&peer_req->w.list, &device->done_ee); in drbd_endio_write_sec_final()
153 do_wake = list_empty(block_id == ID_SYNCER ? &device->sync_ee : &device->active_ee); in drbd_endio_write_sec_final()
158 __drbd_chk_io_error(device, DRBD_WRITE_ERROR); in drbd_endio_write_sec_final()
161 kref_get(&device->kref); /* put is in drbd_send_acks_wf() */ in drbd_endio_write_sec_final()
163 kref_put(&device->kref, drbd_destroy_device); in drbd_endio_write_sec_final()
165 spin_unlock_irqrestore(&device->resource->req_lock, flags); in drbd_endio_write_sec_final()
168 drbd_rs_complete_io(device, i.sector); in drbd_endio_write_sec_final()
171 wake_up(&device->ee_wait); in drbd_endio_write_sec_final()
174 drbd_al_complete_io(device, &i); in drbd_endio_write_sec_final()
176 put_ldev(device); in drbd_endio_write_sec_final()
185 struct drbd_device *device = peer_req->peer_device->device; in drbd_peer_request_endio() local
191 drbd_warn(device, "%s: error=%d s=%llus\n", in drbd_peer_request_endio()
209 drbd_panic_after_delayed_completion_of_aborted_request(struct drbd_device *device) in drbd_panic_after_delayed_completion_of_aborted_request() argument
212 device->minor, device->resource->name, device->vnr); in drbd_panic_after_delayed_completion_of_aborted_request()
221 struct drbd_device *device = req->device; in drbd_request_endio() local
255 …drbd_emerg(device, "delayed completion of aborted local request; disk-timeout may be too aggressiv… in drbd_request_endio()
258 drbd_panic_after_delayed_completion_of_aborted_request(device); in drbd_request_endio()
289 spin_lock_irqsave(&device->resource->req_lock, flags); in drbd_request_endio()
291 spin_unlock_irqrestore(&device->resource->req_lock, flags); in drbd_request_endio()
292 put_ldev(device); in drbd_request_endio()
295 complete_master_bio(device, &m); in drbd_request_endio()
359 struct drbd_device *device = peer_device->device; in w_e_send_csum() local
381 drbd_free_peer_req(device, peer_req); in w_e_send_csum()
383 inc_rs_pending(device); in w_e_send_csum()
389 drbd_err(device, "kmalloc() of digest failed.\n"); in w_e_send_csum()
395 drbd_free_peer_req(device, peer_req); in w_e_send_csum()
398 drbd_err(device, "drbd_send_drequest(..., csum) failed\n"); in w_e_send_csum()
406 struct drbd_device *device = peer_device->device; in read_for_csum() local
409 if (!get_ldev(device)) in read_for_csum()
420 spin_lock_irq(&device->resource->req_lock); in read_for_csum()
421 list_add_tail(&peer_req->w.list, &device->read_ee); in read_for_csum()
422 spin_unlock_irq(&device->resource->req_lock); in read_for_csum()
424 atomic_add(size >> 9, &device->rs_sect_ev); in read_for_csum()
425 if (drbd_submit_peer_request(device, peer_req, REQ_OP_READ, 0, in read_for_csum()
433 spin_lock_irq(&device->resource->req_lock); in read_for_csum()
435 spin_unlock_irq(&device->resource->req_lock); in read_for_csum()
437 drbd_free_peer_req(device, peer_req); in read_for_csum()
439 put_ldev(device); in read_for_csum()
445 struct drbd_device *device = in w_resync_timer() local
448 switch (device->state.conn) { in w_resync_timer()
450 make_ov_request(device, cancel); in w_resync_timer()
453 make_resync_request(device, cancel); in w_resync_timer()
462 struct drbd_device *device = from_timer(device, t, resync_timer); in resync_timer_fn() local
465 &first_peer_device(device)->connection->sender_work, in resync_timer_fn()
466 &device->resync_work); in resync_timer_fn()
513 static int drbd_rs_controller(struct drbd_device *device, unsigned int sect_in) in drbd_rs_controller() argument
525 dc = rcu_dereference(device->ldev->disk_conf); in drbd_rs_controller()
526 plan = rcu_dereference(device->rs_plan_s); in drbd_rs_controller()
530 if (device->rs_in_flight + sect_in == 0) { /* At start of resync */ in drbd_rs_controller()
537 correction = want - device->rs_in_flight - plan->total; in drbd_rs_controller()
565 static int drbd_rs_number_requests(struct drbd_device *device) in drbd_rs_number_requests() argument
570 sect_in = atomic_xchg(&device->rs_sect_in, 0); in drbd_rs_number_requests()
571 device->rs_in_flight -= sect_in; in drbd_rs_number_requests()
574 mxb = drbd_get_max_buffers(device) / 2; in drbd_rs_number_requests()
575 if (rcu_dereference(device->rs_plan_s)->size) { in drbd_rs_number_requests()
576 number = drbd_rs_controller(device, sect_in) >> (BM_BLOCK_SHIFT - 9); in drbd_rs_number_requests()
577 device->c_sync_rate = number * HZ * (BM_BLOCK_SIZE / 1024) / SLEEP_TIME; in drbd_rs_number_requests()
579 device->c_sync_rate = rcu_dereference(device->ldev->disk_conf)->resync_rate; in drbd_rs_number_requests()
580 number = SLEEP_TIME * device->c_sync_rate / ((BM_BLOCK_SIZE / 1024) * HZ); in drbd_rs_number_requests()
594 if (mxb - device->rs_in_flight/8 < number) in drbd_rs_number_requests()
595 number = mxb - device->rs_in_flight/8; in drbd_rs_number_requests()
600 static int make_resync_request(struct drbd_device *const device, int cancel) in make_resync_request() argument
602 struct drbd_peer_device *const peer_device = first_peer_device(device); in make_resync_request()
606 const sector_t capacity = drbd_get_capacity(device->this_bdev); in make_resync_request()
616 if (device->rs_total == 0) { in make_resync_request()
618 drbd_resync_finished(device); in make_resync_request()
622 if (!get_ldev(device)) { in make_resync_request()
627 drbd_err(device, "Disk broke down during resync!\n"); in make_resync_request()
633 discard_granularity = rcu_dereference(device->ldev->disk_conf)->rs_discard_granularity; in make_resync_request()
637 max_bio_size = queue_max_hw_sectors(device->rq_queue) << 9; in make_resync_request()
638 number = drbd_rs_number_requests(device); in make_resync_request()
663 bit = drbd_bm_find_next(device, device->bm_resync_fo); in make_resync_request()
666 device->bm_resync_fo = drbd_bm_bits(device); in make_resync_request()
667 put_ldev(device); in make_resync_request()
673 if (drbd_try_rs_begin_io(device, sector)) { in make_resync_request()
674 device->bm_resync_fo = bit; in make_resync_request()
677 device->bm_resync_fo = bit + 1; in make_resync_request()
679 if (unlikely(drbd_bm_test_bit(device, bit) == 0)) { in make_resync_request()
680 drbd_rs_complete_io(device, sector); in make_resync_request()
712 if (drbd_bm_test_bit(device, bit+1) != 1) in make_resync_request()
723 device->bm_resync_fo = bit + 1; in make_resync_request()
730 if (device->use_csums) { in make_resync_request()
733 put_ldev(device); in make_resync_request()
736 drbd_rs_complete_io(device, sector); in make_resync_request()
737 device->bm_resync_fo = BM_SECT_TO_BIT(sector); in make_resync_request()
749 inc_rs_pending(device); in make_resync_request()
754 drbd_err(device, "drbd_send_drequest() failed, aborting...\n"); in make_resync_request()
755 dec_rs_pending(device); in make_resync_request()
756 put_ldev(device); in make_resync_request()
762 if (device->bm_resync_fo >= drbd_bm_bits(device)) { in make_resync_request()
769 put_ldev(device); in make_resync_request()
774 device->rs_in_flight += (i << (BM_BLOCK_SHIFT - 9)); in make_resync_request()
775 mod_timer(&device->resync_timer, jiffies + SLEEP_TIME); in make_resync_request()
776 put_ldev(device); in make_resync_request()
780 static int make_ov_request(struct drbd_device *device, int cancel) in make_ov_request() argument
784 const sector_t capacity = drbd_get_capacity(device->this_bdev); in make_ov_request()
790 number = drbd_rs_number_requests(device); in make_ov_request()
792 sector = device->ov_position; in make_ov_request()
801 && verify_can_do_stop_sector(device) in make_ov_request()
802 && sector >= device->ov_stop_sector; in make_ov_request()
808 if (drbd_try_rs_begin_io(device, sector)) { in make_ov_request()
809 device->ov_position = sector; in make_ov_request()
816 inc_rs_pending(device); in make_ov_request()
817 if (drbd_send_ov_request(first_peer_device(device), sector, size)) { in make_ov_request()
818 dec_rs_pending(device); in make_ov_request()
823 device->ov_position = sector; in make_ov_request()
826 device->rs_in_flight += (i << (BM_BLOCK_SHIFT - 9)); in make_ov_request()
828 mod_timer(&device->resync_timer, jiffies + SLEEP_TIME); in make_ov_request()
836 struct drbd_device *device = dw->device; in w_ov_finished() local
838 ov_out_of_sync_print(device); in w_ov_finished()
839 drbd_resync_finished(device); in w_ov_finished()
848 struct drbd_device *device = dw->device; in w_resync_finished() local
851 drbd_resync_finished(device); in w_resync_finished()
856 static void ping_peer(struct drbd_device *device) in ping_peer() argument
858 struct drbd_connection *connection = first_peer_device(device)->connection; in ping_peer()
863 test_bit(GOT_PING_ACK, &connection->flags) || device->state.conn < C_CONNECTED); in ping_peer()
866 int drbd_resync_finished(struct drbd_device *device) in drbd_resync_finished() argument
868 struct drbd_connection *connection = first_peer_device(device)->connection; in drbd_resync_finished()
879 if (drbd_rs_del_all(device)) { in drbd_resync_finished()
889 dw->device = device; in drbd_resync_finished()
893 drbd_err(device, "Warn failed to drbd_rs_del_all() and to kmalloc(dw).\n"); in drbd_resync_finished()
896 dt = (jiffies - device->rs_start - device->rs_paused) / HZ; in drbd_resync_finished()
900 db = device->rs_total; in drbd_resync_finished()
902 if (device->state.conn == C_VERIFY_S || device->state.conn == C_VERIFY_T) in drbd_resync_finished()
903 db -= device->ov_left; in drbd_resync_finished()
906 device->rs_paused /= HZ; in drbd_resync_finished()
908 if (!get_ldev(device)) in drbd_resync_finished()
911 ping_peer(device); in drbd_resync_finished()
913 spin_lock_irq(&device->resource->req_lock); in drbd_resync_finished()
914 os = drbd_read_state(device); in drbd_resync_finished()
926 drbd_info(device, "%s done (total %lu sec; paused %lu sec; %lu K/sec)\n", in drbd_resync_finished()
928 dt + device->rs_paused, device->rs_paused, dbdt); in drbd_resync_finished()
930 n_oos = drbd_bm_total_weight(device); in drbd_resync_finished()
934 drbd_alert(device, "Online verify found %lu %dk block out of sync!\n", in drbd_resync_finished()
939 D_ASSERT(device, (n_oos - device->rs_failed) == 0); in drbd_resync_finished()
944 if (device->use_csums && device->rs_total) { in drbd_resync_finished()
945 const unsigned long s = device->rs_same_csum; in drbd_resync_finished()
946 const unsigned long t = device->rs_total; in drbd_resync_finished()
950 drbd_info(device, "%u %% had equal checksums, eliminated: %luK; " in drbd_resync_finished()
953 Bit2KB(device->rs_same_csum), in drbd_resync_finished()
954 Bit2KB(device->rs_total - device->rs_same_csum), in drbd_resync_finished()
955 Bit2KB(device->rs_total)); in drbd_resync_finished()
959 if (device->rs_failed) { in drbd_resync_finished()
960 drbd_info(device, " %lu failed blocks\n", device->rs_failed); in drbd_resync_finished()
974 if (device->p_uuid) { in drbd_resync_finished()
977 _drbd_uuid_set(device, i, device->p_uuid[i]); in drbd_resync_finished()
978 drbd_uuid_set(device, UI_BITMAP, device->ldev->md.uuid[UI_CURRENT]); in drbd_resync_finished()
979 _drbd_uuid_set(device, UI_CURRENT, device->p_uuid[UI_CURRENT]); in drbd_resync_finished()
981 drbd_err(device, "device->p_uuid is NULL! BUG\n"); in drbd_resync_finished()
988 drbd_uuid_set_bm(device, 0UL); in drbd_resync_finished()
989 drbd_print_uuids(device, "updated UUIDs"); in drbd_resync_finished()
990 if (device->p_uuid) { in drbd_resync_finished()
995 device->p_uuid[i] = device->ldev->md.uuid[i]; in drbd_resync_finished()
1000 _drbd_set_state(device, ns, CS_VERBOSE, NULL); in drbd_resync_finished()
1002 spin_unlock_irq(&device->resource->req_lock); in drbd_resync_finished()
1012 fp = rcu_dereference(device->ldev->disk_conf)->fencing; in drbd_resync_finished()
1017 struct drbd_device *device = peer_device->device; in drbd_resync_finished() local
1018 disk_state = min_t(enum drbd_disk_state, disk_state, device->state.disk); in drbd_resync_finished()
1019 pdsk_state = min_t(enum drbd_disk_state, pdsk_state, device->state.pdsk); in drbd_resync_finished()
1027 put_ldev(device); in drbd_resync_finished()
1029 device->rs_total = 0; in drbd_resync_finished()
1030 device->rs_failed = 0; in drbd_resync_finished()
1031 device->rs_paused = 0; in drbd_resync_finished()
1034 if (verify_done && device->ov_left == 0) in drbd_resync_finished()
1035 device->ov_start_sector = 0; in drbd_resync_finished()
1037 drbd_md_sync(device); in drbd_resync_finished()
1040 drbd_khelper(device, khelper_cmd); in drbd_resync_finished()
1046 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
1051 atomic_add(i, &device->pp_in_use_by_net); in move_to_net_ee_or_free()
1052 atomic_sub(i, &device->pp_in_use); in move_to_net_ee_or_free()
1053 spin_lock_irq(&device->resource->req_lock); in move_to_net_ee_or_free()
1054 list_add_tail(&peer_req->w.list, &device->net_ee); in move_to_net_ee_or_free()
1055 spin_unlock_irq(&device->resource->req_lock); in move_to_net_ee_or_free()
1058 drbd_free_peer_req(device, peer_req); in move_to_net_ee_or_free()
1070 struct drbd_device *device = peer_device->device; in w_e_end_data_req() local
1074 drbd_free_peer_req(device, peer_req); in w_e_end_data_req()
1075 dec_unacked(device); in w_e_end_data_req()
1083 drbd_err(device, "Sending NegDReply. sector=%llus.\n", in w_e_end_data_req()
1089 dec_unacked(device); in w_e_end_data_req()
1091 move_to_net_ee_or_free(device, peer_req); in w_e_end_data_req()
1094 drbd_err(device, "drbd_send_block() failed\n"); in w_e_end_data_req()
1131 struct drbd_device *device = peer_device->device; in w_e_end_rsdata_req() local
1135 drbd_free_peer_req(device, peer_req); in w_e_end_rsdata_req()
1136 dec_unacked(device); in w_e_end_rsdata_req()
1140 if (get_ldev_if_state(device, D_FAILED)) { in w_e_end_rsdata_req()
1141 drbd_rs_complete_io(device, peer_req->i.sector); in w_e_end_rsdata_req()
1142 put_ldev(device); in w_e_end_rsdata_req()
1145 if (device->state.conn == C_AHEAD) { in w_e_end_rsdata_req()
1148 if (likely(device->state.pdsk >= D_INCONSISTENT)) { in w_e_end_rsdata_req()
1149 inc_rs_pending(device); in w_e_end_rsdata_req()
1156 drbd_err(device, "Not sending RSDataReply, " in w_e_end_rsdata_req()
1162 drbd_err(device, "Sending NegRSDReply. sector %llus.\n", in w_e_end_rsdata_req()
1168 drbd_rs_failed_io(device, peer_req->i.sector, peer_req->i.size); in w_e_end_rsdata_req()
1171 dec_unacked(device); in w_e_end_rsdata_req()
1173 move_to_net_ee_or_free(device, peer_req); in w_e_end_rsdata_req()
1176 drbd_err(device, "drbd_send_block() failed\n"); in w_e_end_rsdata_req()
1184 struct drbd_device *device = peer_device->device; in w_e_end_csum_rs_req() local
1191 drbd_free_peer_req(device, peer_req); in w_e_end_csum_rs_req()
1192 dec_unacked(device); in w_e_end_csum_rs_req()
1196 if (get_ldev(device)) { in w_e_end_csum_rs_req()
1197 drbd_rs_complete_io(device, peer_req->i.sector); in w_e_end_csum_rs_req()
1198 put_ldev(device); in w_e_end_csum_rs_req()
1209 D_ASSERT(device, digest_size == di->digest_size); in w_e_end_csum_rs_req()
1219 drbd_set_in_sync(device, peer_req->i.sector, peer_req->i.size); in w_e_end_csum_rs_req()
1221 device->rs_same_csum += peer_req->i.size >> BM_BLOCK_SHIFT; in w_e_end_csum_rs_req()
1224 inc_rs_pending(device); in w_e_end_csum_rs_req()
1233 drbd_err(device, "Sending NegDReply. I guess it gets messy.\n"); in w_e_end_csum_rs_req()
1236 dec_unacked(device); in w_e_end_csum_rs_req()
1237 move_to_net_ee_or_free(device, peer_req); in w_e_end_csum_rs_req()
1240 drbd_err(device, "drbd_send_block/ack() failed\n"); in w_e_end_csum_rs_req()
1248 struct drbd_device *device = peer_device->device; in w_e_end_ov_req() local
1275 drbd_free_peer_req(device, peer_req); in w_e_end_ov_req()
1277 inc_rs_pending(device); in w_e_end_ov_req()
1280 dec_rs_pending(device); in w_e_end_ov_req()
1285 drbd_free_peer_req(device, peer_req); in w_e_end_ov_req()
1286 dec_unacked(device); in w_e_end_ov_req()
1290 void drbd_ov_out_of_sync_found(struct drbd_device *device, sector_t sector, int size) in drbd_ov_out_of_sync_found() argument
1292 if (device->ov_last_oos_start + device->ov_last_oos_size == sector) { in drbd_ov_out_of_sync_found()
1293 device->ov_last_oos_size += size>>9; in drbd_ov_out_of_sync_found()
1295 device->ov_last_oos_start = sector; in drbd_ov_out_of_sync_found()
1296 device->ov_last_oos_size = size>>9; in drbd_ov_out_of_sync_found()
1298 drbd_set_out_of_sync(device, sector, size); in drbd_ov_out_of_sync_found()
1305 struct drbd_device *device = peer_device->device; in w_e_end_ov_reply() local
1315 drbd_free_peer_req(device, peer_req); in w_e_end_ov_reply()
1316 dec_unacked(device); in w_e_end_ov_reply()
1322 if (get_ldev(device)) { in w_e_end_ov_reply()
1323 drbd_rs_complete_io(device, peer_req->i.sector); in w_e_end_ov_reply()
1324 put_ldev(device); in w_e_end_ov_reply()
1335 D_ASSERT(device, digest_size == di->digest_size); in w_e_end_ov_reply()
1346 drbd_free_peer_req(device, peer_req); in w_e_end_ov_reply()
1348 drbd_ov_out_of_sync_found(device, sector, size); in w_e_end_ov_reply()
1350 ov_out_of_sync_print(device); in w_e_end_ov_reply()
1355 dec_unacked(device); in w_e_end_ov_reply()
1357 --device->ov_left; in w_e_end_ov_reply()
1360 if ((device->ov_left & 0x200) == 0x200) in w_e_end_ov_reply()
1361 drbd_advance_rs_marks(device, device->ov_left); in w_e_end_ov_reply()
1363 stop_sector_reached = verify_can_do_stop_sector(device) && in w_e_end_ov_reply()
1364 (sector + (size>>9)) >= device->ov_stop_sector; in w_e_end_ov_reply()
1366 if (device->ov_left == 0 || stop_sector_reached) { in w_e_end_ov_reply()
1367 ov_out_of_sync_print(device); in w_e_end_ov_reply()
1368 drbd_resync_finished(device); in w_e_end_ov_reply()
1406 struct drbd_device *device = in w_send_write_hint() local
1411 return pd_send_unplug_remote(first_peer_device(device)); in w_send_write_hint()
1439 struct drbd_device *device = req->device; in w_send_out_of_sync() local
1440 struct drbd_peer_device *const peer_device = first_peer_device(device); in w_send_out_of_sync()
1470 struct drbd_device *device = req->device; in w_send_dblock() local
1471 struct drbd_peer_device *const peer_device = first_peer_device(device); in w_send_dblock()
1503 struct drbd_device *device = req->device; in w_send_read_req() local
1504 struct drbd_peer_device *const peer_device = first_peer_device(device); in w_send_read_req()
1533 struct drbd_device *device = req->device; in w_restart_disk_io() local
1536 drbd_al_begin_io(device, &req->i); in w_restart_disk_io()
1539 bio_set_dev(req->private_bio, device->ldev->backing_bdev); in w_restart_disk_io()
1545 static int _drbd_may_sync_now(struct drbd_device *device) in _drbd_may_sync_now() argument
1547 struct drbd_device *odev = device; in _drbd_may_sync_now()
1575 static bool drbd_pause_after(struct drbd_device *device) in drbd_pause_after() argument
1601 static bool drbd_resume_next(struct drbd_device *device) in drbd_resume_next() argument
1622 void resume_next_sg(struct drbd_device *device) in resume_next_sg() argument
1625 drbd_resume_next(device); in resume_next_sg()
1629 void suspend_other_sg(struct drbd_device *device) in suspend_other_sg() argument
1632 drbd_pause_after(device); in suspend_other_sg()
1637 enum drbd_ret_code drbd_resync_after_valid(struct drbd_device *device, int o_minor) in drbd_resync_after_valid() argument
1650 if (odev == device) in drbd_resync_after_valid()
1675 void drbd_resync_after_changed(struct drbd_device *device) in drbd_resync_after_changed() argument
1680 changed = drbd_pause_after(device); in drbd_resync_after_changed()
1681 changed |= drbd_resume_next(device); in drbd_resync_after_changed()
1685 void drbd_rs_controller_reset(struct drbd_device *device) in drbd_rs_controller_reset() argument
1687 struct gendisk *disk = device->ldev->backing_bdev->bd_contains->bd_disk; in drbd_rs_controller_reset()
1690 atomic_set(&device->rs_sect_in, 0); in drbd_rs_controller_reset()
1691 atomic_set(&device->rs_sect_ev, 0); in drbd_rs_controller_reset()
1692 device->rs_in_flight = 0; in drbd_rs_controller_reset()
1693 device->rs_last_events = (int)part_stat_read_accum(&disk->part0, sectors); in drbd_rs_controller_reset()
1700 plan = rcu_dereference(device->rs_plan_s); in drbd_rs_controller_reset()
1708 struct drbd_device *device = from_timer(device, t, start_resync_timer); in start_resync_timer_fn() local
1709 drbd_device_post_work(device, RS_START); in start_resync_timer_fn()
1712 static void do_start_resync(struct drbd_device *device) in do_start_resync() argument
1714 if (atomic_read(&device->unacked_cnt) || atomic_read(&device->rs_pending_cnt)) { in do_start_resync()
1715 drbd_warn(device, "postponing start_resync ...\n"); in do_start_resync()
1716 device->start_resync_timer.expires = jiffies + HZ/10; in do_start_resync()
1717 add_timer(&device->start_resync_timer); in do_start_resync()
1721 drbd_start_resync(device, C_SYNC_SOURCE); in do_start_resync()
1722 clear_bit(AHEAD_TO_SYNC_SOURCE, &device->flags); in do_start_resync()
1725 …atic bool use_checksum_based_resync(struct drbd_connection *connection, struct drbd_device *device) in use_checksum_based_resync() argument
1734 || test_bit(CRASHED_PRIMARY, &device->flags)); /* or only after Primary crash? */ in use_checksum_based_resync()
1745 void drbd_start_resync(struct drbd_device *device, enum drbd_conns side) in drbd_start_resync() argument
1747 struct drbd_peer_device *peer_device = first_peer_device(device); in drbd_start_resync()
1752 if (device->state.conn >= C_SYNC_SOURCE && device->state.conn < C_AHEAD) { in drbd_start_resync()
1753 drbd_err(device, "Resync already running!\n"); in drbd_start_resync()
1758 drbd_err(device, "No connection to peer, aborting!\n"); in drbd_start_resync()
1762 if (!test_bit(B_RS_H_DONE, &device->flags)) { in drbd_start_resync()
1767 r = drbd_khelper(device, "before-resync-target"); in drbd_start_resync()
1770 drbd_info(device, "before-resync-target handler returned %d, " in drbd_start_resync()
1776 r = drbd_khelper(device, "before-resync-source"); in drbd_start_resync()
1780 drbd_info(device, "before-resync-source handler returned %d, " in drbd_start_resync()
1783 drbd_info(device, "before-resync-source handler returned %d, " in drbd_start_resync()
1796 if (!mutex_trylock(device->state_mutex)) { in drbd_start_resync()
1797 set_bit(B_RS_H_DONE, &device->flags); in drbd_start_resync()
1798 device->start_resync_timer.expires = jiffies + HZ/5; in drbd_start_resync()
1799 add_timer(&device->start_resync_timer); in drbd_start_resync()
1803 mutex_lock(device->state_mutex); in drbd_start_resync()
1807 clear_bit(B_RS_H_DONE, &device->flags); in drbd_start_resync()
1809 if (device->state.conn < C_CONNECTED in drbd_start_resync()
1810 || !get_ldev_if_state(device, D_NEGOTIATING)) { in drbd_start_resync()
1815 ns = drbd_read_state(device); in drbd_start_resync()
1817 ns.aftr_isp = !_drbd_may_sync_now(device); in drbd_start_resync()
1826 r = _drbd_set_state(device, ns, CS_VERBOSE, NULL); in drbd_start_resync()
1827 ns = drbd_read_state(device); in drbd_start_resync()
1833 unsigned long tw = drbd_bm_total_weight(device); in drbd_start_resync()
1837 device->rs_failed = 0; in drbd_start_resync()
1838 device->rs_paused = 0; in drbd_start_resync()
1839 device->rs_same_csum = 0; in drbd_start_resync()
1840 device->rs_last_sect_ev = 0; in drbd_start_resync()
1841 device->rs_total = tw; in drbd_start_resync()
1842 device->rs_start = now; in drbd_start_resync()
1844 device->rs_mark_left[i] = tw; in drbd_start_resync()
1845 device->rs_mark_time[i] = now; in drbd_start_resync()
1847 drbd_pause_after(device); in drbd_start_resync()
1851 spin_lock(&device->al_lock); in drbd_start_resync()
1852 lc_reset(device->resync); in drbd_start_resync()
1853 device->resync_locked = 0; in drbd_start_resync()
1854 device->resync_wenr = LC_FREE; in drbd_start_resync()
1855 spin_unlock(&device->al_lock); in drbd_start_resync()
1860 wake_up(&device->al_wait); /* for lc_reset() above */ in drbd_start_resync()
1863 device->rs_last_bcast = jiffies - HZ; in drbd_start_resync()
1865 drbd_info(device, "Began resync as %s (will sync %lu KB [%lu bits set]).\n", in drbd_start_resync()
1867 (unsigned long) device->rs_total << (BM_BLOCK_SHIFT-10), in drbd_start_resync()
1868 (unsigned long) device->rs_total); in drbd_start_resync()
1870 device->bm_resync_fo = 0; in drbd_start_resync()
1871 device->use_csums = use_checksum_based_resync(connection, device); in drbd_start_resync()
1873 device->use_csums = false; in drbd_start_resync()
1886 if (connection->agreed_pro_version < 95 && device->rs_total == 0) { in drbd_start_resync()
1907 drbd_resync_finished(device); in drbd_start_resync()
1910 drbd_rs_controller_reset(device); in drbd_start_resync()
1916 mod_timer(&device->resync_timer, jiffies); in drbd_start_resync()
1918 drbd_md_sync(device); in drbd_start_resync()
1920 put_ldev(device); in drbd_start_resync()
1922 mutex_unlock(device->state_mutex); in drbd_start_resync()
1925 static void update_on_disk_bitmap(struct drbd_device *device, bool resync_done) in update_on_disk_bitmap() argument
1928 device->rs_last_bcast = jiffies; in update_on_disk_bitmap()
1930 if (!get_ldev(device)) in update_on_disk_bitmap()
1933 drbd_bm_write_lazy(device, 0); in update_on_disk_bitmap()
1934 if (resync_done && is_sync_state(device->state.conn)) in update_on_disk_bitmap()
1935 drbd_resync_finished(device); in update_on_disk_bitmap()
1937 drbd_bcast_event(device, &sib); in update_on_disk_bitmap()
1939 device->rs_last_bcast = jiffies; in update_on_disk_bitmap()
1940 put_ldev(device); in update_on_disk_bitmap()
1943 static void drbd_ldev_destroy(struct drbd_device *device) in drbd_ldev_destroy() argument
1945 lc_destroy(device->resync); in drbd_ldev_destroy()
1946 device->resync = NULL; in drbd_ldev_destroy()
1947 lc_destroy(device->act_log); in drbd_ldev_destroy()
1948 device->act_log = NULL; in drbd_ldev_destroy()
1951 drbd_backing_dev_free(device, device->ldev); in drbd_ldev_destroy()
1952 device->ldev = NULL; in drbd_ldev_destroy()
1955 clear_bit(GOING_DISKLESS, &device->flags); in drbd_ldev_destroy()
1956 wake_up(&device->misc_wait); in drbd_ldev_destroy()
1959 static void go_diskless(struct drbd_device *device) in go_diskless() argument
1961 D_ASSERT(device, device->state.disk == D_FAILED); in go_diskless()
1980 if (device->bitmap && device->ldev) { in go_diskless()
1985 if (drbd_bitmap_io_from_worker(device, drbd_bm_write, in go_diskless()
1987 if (test_bit(WAS_READ_ERROR, &device->flags)) { in go_diskless()
1988 drbd_md_set_flag(device, MDF_FULL_SYNC); in go_diskless()
1989 drbd_md_sync(device); in go_diskless()
1994 drbd_force_state(device, NS(disk, D_DISKLESS)); in go_diskless()
1997 static int do_md_sync(struct drbd_device *device) in do_md_sync() argument
1999 drbd_warn(device, "md_sync_timer expired! Worker calls drbd_md_sync().\n"); in do_md_sync()
2000 drbd_md_sync(device); in do_md_sync()
2027 static void do_device_work(struct drbd_device *device, const unsigned long todo) in do_device_work() argument
2030 do_md_sync(device); in do_device_work()
2033 update_on_disk_bitmap(device, test_bit(RS_DONE, &todo)); in do_device_work()
2035 go_diskless(device); in do_device_work()
2037 drbd_ldev_destroy(device); in do_device_work()
2039 do_start_resync(device); in do_device_work()
2068 struct drbd_device *device = peer_device->device; in do_unqueued_work() local
2069 unsigned long todo = get_work_bits(&device->flags); in do_unqueued_work()
2073 kref_get(&device->kref); in do_unqueued_work()
2075 do_device_work(device, todo); in do_unqueued_work()
2076 kref_put(&device->kref, drbd_destroy_device); in do_unqueued_work()
2235 struct drbd_device *device = peer_device->device; in drbd_worker() local
2236 D_ASSERT(device, device->state.disk == D_DISKLESS && device->state.conn == C_STANDALONE); in drbd_worker()
2237 kref_get(&device->kref); in drbd_worker()
2239 drbd_device_cleanup(device); in drbd_worker()
2240 kref_put(&device->kref, drbd_destroy_device); in drbd_worker()