Lines Matching refs:device
155 static struct page *__drbd_alloc_pages(struct drbd_device *device, in __drbd_alloc_pages() argument
201 static void reclaim_finished_net_peer_reqs(struct drbd_device *device, in reclaim_finished_net_peer_reqs() argument
211 list_for_each_entry_safe(peer_req, tmp, &device->net_ee, w.list) { in reclaim_finished_net_peer_reqs()
218 static void drbd_kick_lo_and_reclaim_net(struct drbd_device *device) in drbd_kick_lo_and_reclaim_net() argument
223 spin_lock_irq(&device->resource->req_lock); in drbd_kick_lo_and_reclaim_net()
224 reclaim_finished_net_peer_reqs(device, &reclaimed); in drbd_kick_lo_and_reclaim_net()
225 spin_unlock_irq(&device->resource->req_lock); in drbd_kick_lo_and_reclaim_net()
228 drbd_free_net_peer_req(device, peer_req); in drbd_kick_lo_and_reclaim_net()
254 struct drbd_device *device = peer_device->device; in drbd_alloc_pages() local
265 if (atomic_read(&device->pp_in_use) < mxb) in drbd_alloc_pages()
266 page = __drbd_alloc_pages(device, number); in drbd_alloc_pages()
271 drbd_kick_lo_and_reclaim_net(device); in drbd_alloc_pages()
273 if (atomic_read(&device->pp_in_use) < mxb) { in drbd_alloc_pages()
274 page = __drbd_alloc_pages(device, number); in drbd_alloc_pages()
283 drbd_warn(device, "drbd_alloc_pages interrupted!\n"); in drbd_alloc_pages()
293 atomic_add(number, &device->pp_in_use); in drbd_alloc_pages()
301 static void drbd_free_pages(struct drbd_device *device, struct page *page, int is_net) in drbd_free_pages() argument
303 atomic_t *a = is_net ? &device->pp_in_use_by_net : &device->pp_in_use; in drbd_free_pages()
321 drbd_warn(device, "ASSERTION FAILED: %s: %d < 0\n", in drbd_free_pages()
344 struct drbd_device *device = peer_device->device; in drbd_alloc_peer_req() local
349 if (drbd_insert_fault(device, DRBD_FAULT_AL_EE)) in drbd_alloc_peer_req()
355 drbd_err(device, "%s: allocation failed\n", __func__); in drbd_alloc_peer_req()
386 void __drbd_free_peer_req(struct drbd_device *device, struct drbd_peer_request *peer_req, in __drbd_free_peer_req() argument
392 drbd_free_pages(device, peer_req->pages, is_net); in __drbd_free_peer_req()
393 D_ASSERT(device, atomic_read(&peer_req->pending_bios) == 0); in __drbd_free_peer_req()
394 D_ASSERT(device, drbd_interval_empty(&peer_req->i)); in __drbd_free_peer_req()
397 drbd_al_complete_io(device, &peer_req->i); in __drbd_free_peer_req()
402 int drbd_free_peer_reqs(struct drbd_device *device, struct list_head *list) in drbd_free_peer_reqs() argument
407 int is_net = list == &device->net_ee; in drbd_free_peer_reqs()
409 spin_lock_irq(&device->resource->req_lock); in drbd_free_peer_reqs()
411 spin_unlock_irq(&device->resource->req_lock); in drbd_free_peer_reqs()
414 __drbd_free_peer_req(device, peer_req, is_net); in drbd_free_peer_reqs()
423 static int drbd_finish_peer_reqs(struct drbd_device *device) in drbd_finish_peer_reqs() argument
430 spin_lock_irq(&device->resource->req_lock); in drbd_finish_peer_reqs()
431 reclaim_finished_net_peer_reqs(device, &reclaimed); in drbd_finish_peer_reqs()
432 list_splice_init(&device->done_ee, &work_list); in drbd_finish_peer_reqs()
433 spin_unlock_irq(&device->resource->req_lock); in drbd_finish_peer_reqs()
436 drbd_free_net_peer_req(device, peer_req); in drbd_finish_peer_reqs()
449 drbd_free_peer_req(device, peer_req); in drbd_finish_peer_reqs()
451 wake_up(&device->ee_wait); in drbd_finish_peer_reqs()
456 static void _drbd_wait_ee_list_empty(struct drbd_device *device, in _drbd_wait_ee_list_empty() argument
464 prepare_to_wait(&device->ee_wait, &wait, TASK_UNINTERRUPTIBLE); in _drbd_wait_ee_list_empty()
465 spin_unlock_irq(&device->resource->req_lock); in _drbd_wait_ee_list_empty()
467 finish_wait(&device->ee_wait, &wait); in _drbd_wait_ee_list_empty()
468 spin_lock_irq(&device->resource->req_lock); in _drbd_wait_ee_list_empty()
472 static void drbd_wait_ee_list_empty(struct drbd_device *device, in drbd_wait_ee_list_empty() argument
475 spin_lock_irq(&device->resource->req_lock); in drbd_wait_ee_list_empty()
476 _drbd_wait_ee_list_empty(device, head); in drbd_wait_ee_list_empty()
477 spin_unlock_irq(&device->resource->req_lock); in drbd_wait_ee_list_empty()
870 struct drbd_device *device = peer_device->device; in drbd_connected() local
873 atomic_set(&device->packet_seq, 0); in drbd_connected()
874 device->peer_seq = 0; in drbd_connected()
876 device->state_mutex = peer_device->connection->agreed_pro_version < 100 ? in drbd_connected()
878 &device->own_state_mutex; in drbd_connected()
887 clear_bit(USE_DEGR_WFC_T, &device->flags); in drbd_connected()
888 clear_bit(RESIZE_PENDING, &device->flags); in drbd_connected()
889 atomic_set(&device->ap_in_flight, 0); in drbd_connected()
890 mod_timer(&device->request_timer, jiffies + HZ); /* just start it here. */ in drbd_connected()
1071 mutex_lock(peer_device->device->state_mutex); in conn_connect()
1076 mutex_unlock(peer_device->device->state_mutex); in conn_connect()
1080 struct drbd_device *device = peer_device->device; in conn_connect() local
1081 kref_get(&device->kref); in conn_connect()
1085 set_bit(DISCARD_MY_DATA, &device->flags); in conn_connect()
1087 clear_bit(DISCARD_MY_DATA, &device->flags); in conn_connect()
1090 kref_put(&device->kref, drbd_destroy_device); in conn_connect()
1183 struct drbd_device *device = peer_device->device; in drbd_flush() local
1185 if (!get_ldev(device)) in drbd_flush()
1187 kref_get(&device->kref); in drbd_flush()
1195 device->flush_jif = jiffies; in drbd_flush()
1196 set_bit(FLUSH_PENDING, &device->flags); in drbd_flush()
1197 rv = blkdev_issue_flush(device->ldev->backing_bdev, in drbd_flush()
1199 clear_bit(FLUSH_PENDING, &device->flags); in drbd_flush()
1201 drbd_info(device, "local disk flush failed with status %d\n", rv); in drbd_flush()
1207 put_ldev(device); in drbd_flush()
1208 kref_put(&device->kref, drbd_destroy_device); in drbd_flush()
1317 struct drbd_device *device; in drbd_bump_write_ordering() local
1330 idr_for_each_entry(&resource->devices, device, vnr) { in drbd_bump_write_ordering()
1331 if (get_ldev(device)) { in drbd_bump_write_ordering()
1332 wo = max_allowed_wo(device->ldev, wo); in drbd_bump_write_ordering()
1333 if (device->ldev == bdev) in drbd_bump_write_ordering()
1335 put_ldev(device); in drbd_bump_write_ordering()
1366 int drbd_submit_peer_request(struct drbd_device *device, in drbd_submit_peer_request() argument
1382 conn_wait_active_ee_empty(first_peer_device(device)->connection); in drbd_submit_peer_request()
1387 spin_lock_irq(&device->resource->req_lock); in drbd_submit_peer_request()
1388 list_add_tail(&peer_req->w.list, &device->active_ee); in drbd_submit_peer_request()
1389 spin_unlock_irq(&device->resource->req_lock); in drbd_submit_peer_request()
1390 if (blkdev_issue_zeroout(device->ldev->backing_bdev, in drbd_submit_peer_request()
1414 drbd_err(device, "submit_ee: Allocation of a bio failed (nr_pages=%u)\n", nr_pages); in drbd_submit_peer_request()
1419 bio->bi_bdev = device->ldev->backing_bdev; in drbd_submit_peer_request()
1440 drbd_err(device, in drbd_submit_peer_request()
1453 D_ASSERT(device, data_size == 0); in drbd_submit_peer_request()
1455 D_ASSERT(device, page == NULL); in drbd_submit_peer_request()
1466 drbd_generic_make_request(device, fault_type, bio); in drbd_submit_peer_request()
1479 static void drbd_remove_epoch_entry_interval(struct drbd_device *device, in drbd_remove_epoch_entry_interval() argument
1484 drbd_remove_interval(&device->write_requests, i); in drbd_remove_epoch_entry_interval()
1489 wake_up(&device->misc_wait); in drbd_remove_epoch_entry_interval()
1499 struct drbd_device *device = peer_device->device; in conn_wait_active_ee_empty() local
1501 kref_get(&device->kref); in conn_wait_active_ee_empty()
1503 drbd_wait_ee_list_empty(device, &device->active_ee); in conn_wait_active_ee_empty()
1504 kref_put(&device->kref, drbd_destroy_device); in conn_wait_active_ee_empty()
1590 struct drbd_device *device = peer_device->device; in read_in_block() local
1591 const sector_t capacity = drbd_get_capacity(device->this_bdev); in read_in_block()
1628 drbd_err(device, "request from peer beyond end of local disk: " in read_in_block()
1652 if (drbd_insert_fault(device, DRBD_FAULT_RECEIVE)) { in read_in_block()
1653 drbd_err(device, "Fault injection: Corrupting data on receive\n"); in read_in_block()
1658 drbd_free_peer_req(device, peer_req); in read_in_block()
1667 drbd_err(device, "Digest integrity check FAILED: %llus +%u\n", in read_in_block()
1669 drbd_free_peer_req(device, peer_req); in read_in_block()
1673 device->recv_cnt += data_size >> 9; in read_in_block()
1701 drbd_free_pages(peer_device->device, page, 0); in drbd_drain_block()
1726 peer_device->device->recv_cnt += data_size>>9; in recv_dless_read()
1729 D_ASSERT(peer_device->device, sector == bio->bi_iter.bi_sector); in recv_dless_read()
1749 D_ASSERT(peer_device->device, data_size == 0); in recv_dless_read()
1762 struct drbd_device *device = peer_device->device; in e_end_resync_block() local
1766 D_ASSERT(device, drbd_interval_empty(&peer_req->i)); in e_end_resync_block()
1769 drbd_set_in_sync(device, sector, peer_req->i.size); in e_end_resync_block()
1773 drbd_rs_failed_io(device, sector, peer_req->i.size); in e_end_resync_block()
1777 dec_unacked(device); in e_end_resync_block()
1785 struct drbd_device *device = peer_device->device; in recv_resync_read() local
1792 dec_rs_pending(device); in recv_resync_read()
1794 inc_unacked(device); in recv_resync_read()
1801 spin_lock_irq(&device->resource->req_lock); in recv_resync_read()
1802 list_add_tail(&peer_req->w.list, &device->sync_ee); in recv_resync_read()
1803 spin_unlock_irq(&device->resource->req_lock); in recv_resync_read()
1805 atomic_add(pi->size >> 9, &device->rs_sect_ev); in recv_resync_read()
1806 if (drbd_submit_peer_request(device, peer_req, WRITE, DRBD_FAULT_RS_WR) == 0) in recv_resync_read()
1810 drbd_err(device, "submit failed, triggering re-connect\n"); in recv_resync_read()
1811 spin_lock_irq(&device->resource->req_lock); in recv_resync_read()
1813 spin_unlock_irq(&device->resource->req_lock); in recv_resync_read()
1815 drbd_free_peer_req(device, peer_req); in recv_resync_read()
1817 put_ldev(device); in recv_resync_read()
1822 find_request(struct drbd_device *device, struct rb_root *root, u64 id, in find_request() argument
1832 drbd_err(device, "%s: failed to find request 0x%lx, sector %llus\n", func, in find_request()
1841 struct drbd_device *device; in receive_DataReply() local
1850 device = peer_device->device; in receive_DataReply()
1854 spin_lock_irq(&device->resource->req_lock); in receive_DataReply()
1855 req = find_request(device, &device->read_requests, p->block_id, sector, false, __func__); in receive_DataReply()
1856 spin_unlock_irq(&device->resource->req_lock); in receive_DataReply()
1876 struct drbd_device *device; in receive_RSDataReply() local
1884 device = peer_device->device; in receive_RSDataReply()
1887 D_ASSERT(device, p->block_id == ID_SYNCER); in receive_RSDataReply()
1889 if (get_ldev(device)) { in receive_RSDataReply()
1896 drbd_err(device, "Can not write resync data to local disk.\n"); in receive_RSDataReply()
1903 atomic_add(pi->size >> 9, &device->rs_sect_in); in receive_RSDataReply()
1908 static void restart_conflicting_writes(struct drbd_device *device, in restart_conflicting_writes() argument
1914 drbd_for_each_overlap(i, &device->write_requests, sector, size) { in restart_conflicting_writes()
1935 struct drbd_device *device = peer_device->device; in e_end_block() local
1941 pcmd = (device->state.conn >= C_SYNC_SOURCE && in e_end_block()
1942 device->state.conn <= C_PAUSED_SYNC_T && in e_end_block()
1947 drbd_set_in_sync(device, sector, peer_req->i.size); in e_end_block()
1953 dec_unacked(device); in e_end_block()
1959 spin_lock_irq(&device->resource->req_lock); in e_end_block()
1960 D_ASSERT(device, !drbd_interval_empty(&peer_req->i)); in e_end_block()
1961 drbd_remove_epoch_entry_interval(device, peer_req); in e_end_block()
1963 restart_conflicting_writes(device, sector, peer_req->i.size); in e_end_block()
1964 spin_unlock_irq(&device->resource->req_lock); in e_end_block()
1966 D_ASSERT(device, drbd_interval_empty(&peer_req->i)); in e_end_block()
1968 …drbd_may_finish_epoch(first_peer_device(device)->connection, peer_req->epoch, EV_PUT + (cancel ? E… in e_end_block()
1981 dec_unacked(peer_device->device); in e_send_ack()
2018 struct drbd_device *device = peer_device->device; in update_peer_seq() local
2022 spin_lock(&device->peer_seq_lock); in update_peer_seq()
2023 newest_peer_seq = seq_max(device->peer_seq, peer_seq); in update_peer_seq()
2024 device->peer_seq = newest_peer_seq; in update_peer_seq()
2025 spin_unlock(&device->peer_seq_lock); in update_peer_seq()
2028 wake_up(&device->seq_wait); in update_peer_seq()
2038 static bool overlapping_resync_write(struct drbd_device *device, struct drbd_peer_request *peer_req) in overlapping_resync_write() argument
2043 spin_lock_irq(&device->resource->req_lock); in overlapping_resync_write()
2044 list_for_each_entry(rs_req, &device->sync_ee, w.list) { in overlapping_resync_write()
2051 spin_unlock_irq(&device->resource->req_lock); in overlapping_resync_write()
2079 struct drbd_device *device = peer_device->device; in wait_for_and_update_peer_seq() local
2087 spin_lock(&device->peer_seq_lock); in wait_for_and_update_peer_seq()
2089 if (!seq_greater(peer_seq - 1, device->peer_seq)) { in wait_for_and_update_peer_seq()
2090 device->peer_seq = seq_max(device->peer_seq, peer_seq); in wait_for_and_update_peer_seq()
2100 tp = rcu_dereference(first_peer_device(device)->connection->net_conf)->two_primaries; in wait_for_and_update_peer_seq()
2107 prepare_to_wait(&device->seq_wait, &wait, TASK_INTERRUPTIBLE); in wait_for_and_update_peer_seq()
2108 spin_unlock(&device->peer_seq_lock); in wait_for_and_update_peer_seq()
2113 spin_lock(&device->peer_seq_lock); in wait_for_and_update_peer_seq()
2116 drbd_err(device, "Timed out waiting for missing ack packets; disconnecting\n"); in wait_for_and_update_peer_seq()
2120 spin_unlock(&device->peer_seq_lock); in wait_for_and_update_peer_seq()
2121 finish_wait(&device->seq_wait, &wait); in wait_for_and_update_peer_seq()
2136 static void fail_postponed_requests(struct drbd_device *device, sector_t sector, in fail_postponed_requests() argument
2142 drbd_for_each_overlap(i, &device->write_requests, sector, size) { in fail_postponed_requests()
2153 spin_unlock_irq(&device->resource->req_lock); in fail_postponed_requests()
2155 complete_master_bio(device, &m); in fail_postponed_requests()
2156 spin_lock_irq(&device->resource->req_lock); in fail_postponed_requests()
2161 static int handle_write_conflicts(struct drbd_device *device, in handle_write_conflicts() argument
2176 drbd_insert_interval(&device->write_requests, &peer_req->i); in handle_write_conflicts()
2179 drbd_for_each_overlap(i, &device->write_requests, sector, size) { in handle_write_conflicts()
2191 err = drbd_wait_misc(device, i); in handle_write_conflicts()
2209 drbd_alert(device, "Concurrent writes detected: " in handle_write_conflicts()
2218 list_add_tail(&peer_req->w.list, &device->done_ee); in handle_write_conflicts()
2228 drbd_alert(device, "Concurrent writes detected: " in handle_write_conflicts()
2246 err = drbd_wait_misc(device, &req->i); in handle_write_conflicts()
2249 fail_postponed_requests(device, sector, size); in handle_write_conflicts()
2265 drbd_remove_epoch_entry_interval(device, peer_req); in handle_write_conflicts()
2273 struct drbd_device *device; in receive_Data() local
2286 device = peer_device->device; in receive_Data()
2288 if (!get_ldev(device)) { in receive_Data()
2309 put_ldev(device); in receive_Data()
2320 struct request_queue *q = bdev_get_queue(device->ldev->backing_bdev); in receive_Data()
2328 D_ASSERT(device, peer_req->i.size == 0); in receive_Data()
2329 D_ASSERT(device, dp_flags & DP_FLUSH); in receive_Data()
2358 inc_unacked(device); in receive_Data()
2366 drbd_send_ack(first_peer_device(device), P_RECV_ACK, peer_req); in receive_Data()
2371 D_ASSERT(device, dp_flags & DP_SEND_WRITE_ACK); in receive_Data()
2376 spin_lock_irq(&device->resource->req_lock); in receive_Data()
2377 err = handle_write_conflicts(device, peer_req); in receive_Data()
2379 spin_unlock_irq(&device->resource->req_lock); in receive_Data()
2381 put_ldev(device); in receive_Data()
2388 spin_lock_irq(&device->resource->req_lock); in receive_Data()
2395 list_add_tail(&peer_req->w.list, &device->active_ee); in receive_Data()
2396 spin_unlock_irq(&device->resource->req_lock); in receive_Data()
2398 if (device->state.conn == C_SYNC_TARGET) in receive_Data()
2399 wait_event(device->ee_wait, !overlapping_resync_write(device, peer_req)); in receive_Data()
2401 if (device->state.pdsk < D_INCONSISTENT) { in receive_Data()
2403 drbd_set_out_of_sync(device, peer_req->i.sector, peer_req->i.size); in receive_Data()
2405 drbd_al_begin_io(device, &peer_req->i); in receive_Data()
2409 err = drbd_submit_peer_request(device, peer_req, rw, DRBD_FAULT_DT_WR); in receive_Data()
2414 drbd_err(device, "submit failed, triggering re-connect\n"); in receive_Data()
2415 spin_lock_irq(&device->resource->req_lock); in receive_Data()
2417 drbd_remove_epoch_entry_interval(device, peer_req); in receive_Data()
2418 spin_unlock_irq(&device->resource->req_lock); in receive_Data()
2421 drbd_al_complete_io(device, &peer_req->i); in receive_Data()
2426 put_ldev(device); in receive_Data()
2427 drbd_free_peer_req(device, peer_req); in receive_Data()
2442 bool drbd_rs_should_slow_down(struct drbd_device *device, sector_t sector, in drbd_rs_should_slow_down() argument
2446 bool throttle = drbd_rs_c_min_rate_throttle(device); in drbd_rs_should_slow_down()
2451 spin_lock_irq(&device->al_lock); in drbd_rs_should_slow_down()
2452 tmp = lc_find(device->resync, BM_SECT_TO_EXT(sector)); in drbd_rs_should_slow_down()
2460 spin_unlock_irq(&device->al_lock); in drbd_rs_should_slow_down()
2465 bool drbd_rs_c_min_rate_throttle(struct drbd_device *device) in drbd_rs_c_min_rate_throttle() argument
2467 struct gendisk *disk = device->ldev->backing_bdev->bd_contains->bd_disk; in drbd_rs_c_min_rate_throttle()
2473 c_min_rate = rcu_dereference(device->ldev->disk_conf)->c_min_rate; in drbd_rs_c_min_rate_throttle()
2482 atomic_read(&device->rs_sect_ev); in drbd_rs_c_min_rate_throttle()
2484 if (atomic_read(&device->ap_actlog_cnt) in drbd_rs_c_min_rate_throttle()
2485 || curr_events - device->rs_last_events > 64) { in drbd_rs_c_min_rate_throttle()
2489 device->rs_last_events = curr_events; in drbd_rs_c_min_rate_throttle()
2493 i = (device->rs_last_mark + DRBD_SYNC_MARKS-1) % DRBD_SYNC_MARKS; in drbd_rs_c_min_rate_throttle()
2495 if (device->state.conn == C_VERIFY_S || device->state.conn == C_VERIFY_T) in drbd_rs_c_min_rate_throttle()
2496 rs_left = device->ov_left; in drbd_rs_c_min_rate_throttle()
2498 rs_left = drbd_bm_total_weight(device) - device->rs_failed; in drbd_rs_c_min_rate_throttle()
2500 dt = ((long)jiffies - (long)device->rs_mark_time[i]) / HZ; in drbd_rs_c_min_rate_throttle()
2503 db = device->rs_mark_left[i] - rs_left; in drbd_rs_c_min_rate_throttle()
2515 struct drbd_device *device; in receive_DataRequest() local
2527 device = peer_device->device; in receive_DataRequest()
2528 capacity = drbd_get_capacity(device->this_bdev); in receive_DataRequest()
2534 drbd_err(device, "%s:%d: sector: %llus, size: %u\n", __FILE__, __LINE__, in receive_DataRequest()
2539 drbd_err(device, "%s:%d: sector: %llus, size: %u\n", __FILE__, __LINE__, in receive_DataRequest()
2544 if (!get_ldev_if_state(device, D_UP_TO_DATE)) { in receive_DataRequest()
2557 dec_rs_pending(device); in receive_DataRequest()
2564 drbd_err(device, "Can not satisfy peer's read request, " in receive_DataRequest()
2577 put_ldev(device); in receive_DataRequest()
2593 device->bm_resync_fo = BM_SECT_TO_BIT(sector); in receive_DataRequest()
2613 D_ASSERT(device, peer_device->connection->agreed_pro_version >= 89); in receive_DataRequest()
2616 device->bm_resync_fo = BM_SECT_TO_BIT(sector); in receive_DataRequest()
2618 device->use_csums = true; in receive_DataRequest()
2621 atomic_add(size >> 9, &device->rs_sect_in); in receive_DataRequest()
2623 dec_rs_pending(device); in receive_DataRequest()
2631 if (device->ov_start_sector == ~(sector_t)0 && in receive_DataRequest()
2635 device->ov_start_sector = sector; in receive_DataRequest()
2636 device->ov_position = sector; in receive_DataRequest()
2637 device->ov_left = drbd_bm_bits(device) - BM_SECT_TO_BIT(sector); in receive_DataRequest()
2638 device->rs_total = device->ov_left; in receive_DataRequest()
2640 device->rs_mark_left[i] = device->ov_left; in receive_DataRequest()
2641 device->rs_mark_time[i] = now; in receive_DataRequest()
2643 drbd_info(device, "Online Verify start sector: %llu\n", in receive_DataRequest()
2681 spin_lock_irq(&device->resource->req_lock); in receive_DataRequest()
2682 list_add_tail(&peer_req->w.list, &device->read_ee); in receive_DataRequest()
2683 spin_unlock_irq(&device->resource->req_lock); in receive_DataRequest()
2686 if (device->state.peer != R_PRIMARY in receive_DataRequest()
2687 && drbd_rs_should_slow_down(device, sector, false)) in receive_DataRequest()
2690 if (drbd_rs_begin_io(device, sector)) in receive_DataRequest()
2694 atomic_add(size >> 9, &device->rs_sect_ev); in receive_DataRequest()
2698 inc_unacked(device); in receive_DataRequest()
2699 if (drbd_submit_peer_request(device, peer_req, READ, fault_type) == 0) in receive_DataRequest()
2703 drbd_err(device, "submit failed, triggering re-connect\n"); in receive_DataRequest()
2706 spin_lock_irq(&device->resource->req_lock); in receive_DataRequest()
2708 spin_unlock_irq(&device->resource->req_lock); in receive_DataRequest()
2711 put_ldev(device); in receive_DataRequest()
2712 drbd_free_peer_req(device, peer_req); in receive_DataRequest()
2721 struct drbd_device *device = peer_device->device; in drbd_asb_recover_0p() local
2726 self = device->ldev->md.uuid[UI_BITMAP] & 1; in drbd_asb_recover_0p()
2727 peer = device->p_uuid[UI_BITMAP] & 1; in drbd_asb_recover_0p()
2729 ch_peer = device->p_uuid[UI_SIZE]; in drbd_asb_recover_0p()
2730 ch_self = device->comm_bm_set; in drbd_asb_recover_0p()
2740 drbd_err(device, "Configuration error.\n"); in drbd_asb_recover_0p()
2764 drbd_warn(device, "Discard younger/older primary did not find a decision\n" in drbd_asb_recover_0p()
2802 struct drbd_device *device = peer_device->device; in drbd_asb_recover_1p() local
2816 drbd_err(device, "Configuration error.\n"); in drbd_asb_recover_1p()
2822 if (hg == -1 && device->state.role == R_SECONDARY) in drbd_asb_recover_1p()
2824 if (hg == 1 && device->state.role == R_PRIMARY) in drbd_asb_recover_1p()
2831 return device->state.role == R_PRIMARY ? 1 : -1; in drbd_asb_recover_1p()
2834 if (hg == -1 && device->state.role == R_PRIMARY) { in drbd_asb_recover_1p()
2840 rv2 = drbd_change_state(device, CS_VERBOSE, NS(role, R_SECONDARY)); in drbd_asb_recover_1p()
2842 drbd_khelper(device, "pri-lost-after-sb"); in drbd_asb_recover_1p()
2844 drbd_warn(device, "Successfully gave up primary role.\n"); in drbd_asb_recover_1p()
2859 struct drbd_device *device = peer_device->device; in drbd_asb_recover_2p() local
2875 drbd_err(device, "Configuration error.\n"); in drbd_asb_recover_2p()
2890 rv2 = drbd_change_state(device, CS_VERBOSE, NS(role, R_SECONDARY)); in drbd_asb_recover_2p()
2892 drbd_khelper(device, "pri-lost-after-sb"); in drbd_asb_recover_2p()
2894 drbd_warn(device, "Successfully gave up primary role.\n"); in drbd_asb_recover_2p()
2904 static void drbd_uuid_dump(struct drbd_device *device, char *text, u64 *uuid, in drbd_uuid_dump() argument
2908 drbd_info(device, "%s uuid info vanished while I was looking!\n", text); in drbd_uuid_dump()
2911 drbd_info(device, "%s %016llX:%016llX:%016llX:%016llX bits:%llu flags:%llX\n", in drbd_uuid_dump()
2933 static int drbd_uuid_compare(struct drbd_device *const device, int *rule_nr) __must_hold(local) in drbd_uuid_compare() argument
2935 struct drbd_peer_device *const peer_device = first_peer_device(device); in drbd_uuid_compare()
2940 self = device->ldev->md.uuid[UI_CURRENT] & ~((u64)1); in drbd_uuid_compare()
2941 peer = device->p_uuid[UI_CURRENT] & ~((u64)1); in drbd_uuid_compare()
2960 if (device->p_uuid[UI_BITMAP] == (u64)0 && device->ldev->md.uuid[UI_BITMAP] != (u64)0) { in drbd_uuid_compare()
2965 …if ((device->ldev->md.uuid[UI_BITMAP] & ~((u64)1)) == (device->p_uuid[UI_HISTORY_START] & ~((u64)1… in drbd_uuid_compare()
2966 …(device->ldev->md.uuid[UI_HISTORY_START] & ~((u64)1)) == (device->p_uuid[UI_HISTORY_START + 1] & ~… in drbd_uuid_compare()
2967 drbd_info(device, "was SyncSource, missed the resync finished event, corrected myself:\n"); in drbd_uuid_compare()
2968 drbd_uuid_move_history(device); in drbd_uuid_compare()
2969 device->ldev->md.uuid[UI_HISTORY_START] = device->ldev->md.uuid[UI_BITMAP]; in drbd_uuid_compare()
2970 device->ldev->md.uuid[UI_BITMAP] = 0; in drbd_uuid_compare()
2972 drbd_uuid_dump(device, "self", device->ldev->md.uuid, in drbd_uuid_compare()
2973 device->state.disk >= D_NEGOTIATING ? drbd_bm_total_weight(device) : 0, 0); in drbd_uuid_compare()
2976 drbd_info(device, "was SyncSource (peer failed to write sync_uuid)\n"); in drbd_uuid_compare()
2983 if (device->ldev->md.uuid[UI_BITMAP] == (u64)0 && device->p_uuid[UI_BITMAP] != (u64)0) { in drbd_uuid_compare()
2988 …if ((device->ldev->md.uuid[UI_HISTORY_START] & ~((u64)1)) == (device->p_uuid[UI_BITMAP] & ~((u64)1… in drbd_uuid_compare()
2989 …(device->ldev->md.uuid[UI_HISTORY_START + 1] & ~((u64)1)) == (device->p_uuid[UI_HISTORY_START] & ~… in drbd_uuid_compare()
2990 drbd_info(device, "was SyncTarget, peer missed the resync finished event, corrected peer:\n"); in drbd_uuid_compare()
2992 device->p_uuid[UI_HISTORY_START + 1] = device->p_uuid[UI_HISTORY_START]; in drbd_uuid_compare()
2993 device->p_uuid[UI_HISTORY_START] = device->p_uuid[UI_BITMAP]; in drbd_uuid_compare()
2994 device->p_uuid[UI_BITMAP] = 0UL; in drbd_uuid_compare()
2996 … drbd_uuid_dump(device, "peer", device->p_uuid, device->p_uuid[UI_SIZE], device->p_uuid[UI_FLAGS]); in drbd_uuid_compare()
2999 drbd_info(device, "was SyncTarget (failed to write sync_uuid)\n"); in drbd_uuid_compare()
3007 rct = (test_bit(CRASHED_PRIMARY, &device->flags) ? 1 : 0) + in drbd_uuid_compare()
3008 (device->p_uuid[UI_FLAGS] & 2); in drbd_uuid_compare()
3024 peer = device->p_uuid[UI_BITMAP] & ~((u64)1); in drbd_uuid_compare()
3029 peer = device->p_uuid[UI_HISTORY_START] & ~((u64)1); in drbd_uuid_compare()
3032 (device->ldev->md.uuid[UI_HISTORY_START] & ~((u64)1)) == in drbd_uuid_compare()
3033 (device->p_uuid[UI_HISTORY_START + 1] & ~((u64)1)) : in drbd_uuid_compare()
3034 peer + UUID_NEW_BM_OFFSET == (device->p_uuid[UI_BITMAP] & ~((u64)1))) { in drbd_uuid_compare()
3041 device->p_uuid[UI_BITMAP] = device->p_uuid[UI_HISTORY_START]; in drbd_uuid_compare()
3042 device->p_uuid[UI_HISTORY_START] = device->p_uuid[UI_HISTORY_START + 1]; in drbd_uuid_compare()
3044 drbd_info(device, "Lost last syncUUID packet, corrected:\n"); in drbd_uuid_compare()
3045 … drbd_uuid_dump(device, "peer", device->p_uuid, device->p_uuid[UI_SIZE], device->p_uuid[UI_FLAGS]); in drbd_uuid_compare()
3052 self = device->ldev->md.uuid[UI_CURRENT] & ~((u64)1); in drbd_uuid_compare()
3054 peer = device->p_uuid[i] & ~((u64)1); in drbd_uuid_compare()
3060 self = device->ldev->md.uuid[UI_BITMAP] & ~((u64)1); in drbd_uuid_compare()
3061 peer = device->p_uuid[UI_CURRENT] & ~((u64)1); in drbd_uuid_compare()
3066 self = device->ldev->md.uuid[UI_HISTORY_START] & ~((u64)1); in drbd_uuid_compare()
3069 (device->ldev->md.uuid[UI_HISTORY_START + 1] & ~((u64)1)) == in drbd_uuid_compare()
3070 (device->p_uuid[UI_HISTORY_START] & ~((u64)1)) : in drbd_uuid_compare()
3071 self + UUID_NEW_BM_OFFSET == (device->ldev->md.uuid[UI_BITMAP] & ~((u64)1))) { in drbd_uuid_compare()
3078 __drbd_uuid_set(device, UI_BITMAP, device->ldev->md.uuid[UI_HISTORY_START]); in drbd_uuid_compare()
3079 __drbd_uuid_set(device, UI_HISTORY_START, device->ldev->md.uuid[UI_HISTORY_START + 1]); in drbd_uuid_compare()
3081 drbd_info(device, "Last syncUUID did not get through, corrected:\n"); in drbd_uuid_compare()
3082 drbd_uuid_dump(device, "self", device->ldev->md.uuid, in drbd_uuid_compare()
3083 device->state.disk >= D_NEGOTIATING ? drbd_bm_total_weight(device) : 0, 0); in drbd_uuid_compare()
3091 peer = device->p_uuid[UI_CURRENT] & ~((u64)1); in drbd_uuid_compare()
3093 self = device->ldev->md.uuid[i] & ~((u64)1); in drbd_uuid_compare()
3099 self = device->ldev->md.uuid[UI_BITMAP] & ~((u64)1); in drbd_uuid_compare()
3100 peer = device->p_uuid[UI_BITMAP] & ~((u64)1); in drbd_uuid_compare()
3106 self = device->ldev->md.uuid[i] & ~((u64)1); in drbd_uuid_compare()
3108 peer = device->p_uuid[j] & ~((u64)1); in drbd_uuid_compare()
3124 struct drbd_device *device = peer_device->device; in drbd_sync_handshake() local
3130 mydisk = device->state.disk; in drbd_sync_handshake()
3132 mydisk = device->new_state_tmp.disk; in drbd_sync_handshake()
3134 drbd_info(device, "drbd_sync_handshake:\n"); in drbd_sync_handshake()
3136 spin_lock_irq(&device->ldev->md.uuid_lock); in drbd_sync_handshake()
3137 drbd_uuid_dump(device, "self", device->ldev->md.uuid, device->comm_bm_set, 0); in drbd_sync_handshake()
3138 drbd_uuid_dump(device, "peer", device->p_uuid, in drbd_sync_handshake()
3139 device->p_uuid[UI_SIZE], device->p_uuid[UI_FLAGS]); in drbd_sync_handshake()
3141 hg = drbd_uuid_compare(device, &rule_nr); in drbd_sync_handshake()
3142 spin_unlock_irq(&device->ldev->md.uuid_lock); in drbd_sync_handshake()
3144 drbd_info(device, "uuid_compare()=%d by rule %d\n", hg, rule_nr); in drbd_sync_handshake()
3147 drbd_alert(device, "Unrelated data, aborting!\n"); in drbd_sync_handshake()
3151 …drbd_alert(device, "To resolve this both sides have to support at least protocol %d\n", -hg - 1000… in drbd_sync_handshake()
3161 drbd_info(device, "Becoming sync %s due to disk states.\n", in drbd_sync_handshake()
3166 drbd_khelper(device, "initial-split-brain"); in drbd_sync_handshake()
3172 int pcount = (device->state.role == R_PRIMARY) in drbd_sync_handshake()
3188 drbd_warn(device, "Split-Brain detected, %d primaries, " in drbd_sync_handshake()
3192 drbd_warn(device, "Doing a full sync, since" in drbd_sync_handshake()
3200 if (test_bit(DISCARD_MY_DATA, &device->flags) && !(device->p_uuid[UI_FLAGS]&1)) in drbd_sync_handshake()
3202 if (!test_bit(DISCARD_MY_DATA, &device->flags) && (device->p_uuid[UI_FLAGS]&1)) in drbd_sync_handshake()
3206 drbd_warn(device, "Split-Brain detected, manually solved. " in drbd_sync_handshake()
3219 drbd_alert(device, "Split-Brain detected but unresolved, dropping connection!\n"); in drbd_sync_handshake()
3220 drbd_khelper(device, "split-brain"); in drbd_sync_handshake()
3225 drbd_err(device, "I shall become SyncSource, but I am inconsistent!\n"); in drbd_sync_handshake()
3230 device->state.role == R_PRIMARY && device->state.disk >= D_CONSISTENT) { in drbd_sync_handshake()
3233 drbd_khelper(device, "pri-lost"); in drbd_sync_handshake()
3236 drbd_err(device, "I shall become SyncTarget, but I am primary!\n"); in drbd_sync_handshake()
3239 drbd_warn(device, "Becoming SyncTarget, violating the stable-data" in drbd_sync_handshake()
3246 drbd_info(device, "dry-run connect: No resync, would become Connected immediately.\n"); in drbd_sync_handshake()
3248 drbd_info(device, "dry-run connect: Would become %s, doing a %s resync.", in drbd_sync_handshake()
3255 drbd_info(device, "Writing the whole bitmap, full sync required after drbd_sync_handshake.\n"); in drbd_sync_handshake()
3256 if (drbd_bitmap_io(device, &drbd_bmio_set_n_write, "set_n_write from sync_handshake", in drbd_sync_handshake()
3267 if (drbd_bm_total_weight(device)) { in drbd_sync_handshake()
3268 drbd_info(device, "No resync, but %lu bits in bitmap!\n", in drbd_sync_handshake()
3269 drbd_bm_total_weight(device)); in drbd_sync_handshake()
3445 static struct crypto_hash *drbd_crypto_alloc_digest_safe(const struct drbd_device *device, in drbd_crypto_alloc_digest_safe() argument
3455 drbd_err(device, "Can not allocate \"%s\" as %s (reason: %ld)\n", in drbd_crypto_alloc_digest_safe()
3503 struct drbd_device *device; in receive_SyncParam() local
3518 device = peer_device->device; in receive_SyncParam()
3527 drbd_err(device, "SyncParam packet too long: received %u, expected <= %u bytes\n", in receive_SyncParam()
3538 D_ASSERT(device, data_size == 0); in receive_SyncParam()
3542 D_ASSERT(device, data_size == 0); in receive_SyncParam()
3555 if (get_ldev(device)) { in receive_SyncParam()
3558 put_ldev(device); in receive_SyncParam()
3560 drbd_err(device, "Allocation of new disk_conf failed\n"); in receive_SyncParam()
3564 old_disk_conf = device->ldev->disk_conf; in receive_SyncParam()
3573 drbd_err(device, "verify-alg of wrong size, " in receive_SyncParam()
3585 D_ASSERT(device, p->verify_alg[data_size-1] == 0); in receive_SyncParam()
3591 D_ASSERT(device, p->verify_alg[SHARED_SECRET_MAX-1] == 0); in receive_SyncParam()
3592 D_ASSERT(device, p->csums_alg[SHARED_SECRET_MAX-1] == 0); in receive_SyncParam()
3598 if (device->state.conn == C_WF_REPORT_PARAMS) { in receive_SyncParam()
3599 drbd_err(device, "Different verify-alg settings. me=\"%s\" peer=\"%s\"\n", in receive_SyncParam()
3603 verify_tfm = drbd_crypto_alloc_digest_safe(device, in receive_SyncParam()
3612 if (device->state.conn == C_WF_REPORT_PARAMS) { in receive_SyncParam()
3613 drbd_err(device, "Different csums-alg settings. me=\"%s\" peer=\"%s\"\n", in receive_SyncParam()
3617 csums_tfm = drbd_crypto_alloc_digest_safe(device, in receive_SyncParam()
3632 if (fifo_size != device->rs_plan_s->size) { in receive_SyncParam()
3635 drbd_err(device, "kmalloc of fifo_buffer failed"); in receive_SyncParam()
3636 put_ldev(device); in receive_SyncParam()
3645 drbd_err(device, "Allocation of new net_conf failed\n"); in receive_SyncParam()
3656 drbd_info(device, "using verify-alg: \"%s\"\n", p->verify_alg); in receive_SyncParam()
3663 drbd_info(device, "using csums-alg: \"%s\"\n", p->csums_alg); in receive_SyncParam()
3670 rcu_assign_pointer(device->ldev->disk_conf, new_disk_conf); in receive_SyncParam()
3671 put_ldev(device); in receive_SyncParam()
3675 old_plan = device->rs_plan_s; in receive_SyncParam()
3676 rcu_assign_pointer(device->rs_plan_s, new_plan); in receive_SyncParam()
3690 put_ldev(device); in receive_SyncParam()
3699 put_ldev(device); in receive_SyncParam()
3713 static void warn_if_differ_considerably(struct drbd_device *device, in warn_if_differ_considerably() argument
3721 drbd_warn(device, "Considerable difference in %s: %llus vs. %llus\n", s, in warn_if_differ_considerably()
3728 struct drbd_device *device; in receive_sizes() local
3738 device = peer_device->device; in receive_sizes()
3746 device->p_size = p_size; in receive_sizes()
3748 if (get_ldev(device)) { in receive_sizes()
3750 my_usize = rcu_dereference(device->ldev->disk_conf)->disk_size; in receive_sizes()
3753 warn_if_differ_considerably(device, "lower level device sizes", in receive_sizes()
3754 p_size, drbd_get_max_capacity(device->ldev)); in receive_sizes()
3755 warn_if_differ_considerably(device, "user requested size", in receive_sizes()
3760 if (device->state.conn == C_WF_REPORT_PARAMS) in receive_sizes()
3765 if (drbd_new_dev_size(device, device->ldev, p_usize, 0) < in receive_sizes()
3766 drbd_get_capacity(device->this_bdev) && in receive_sizes()
3767 device->state.disk >= D_OUTDATED && in receive_sizes()
3768 device->state.conn < C_CONNECTED) { in receive_sizes()
3769 drbd_err(device, "The peer's disk size is too small!\n"); in receive_sizes()
3771 put_ldev(device); in receive_sizes()
3780 drbd_err(device, "Allocation of new disk_conf failed\n"); in receive_sizes()
3781 put_ldev(device); in receive_sizes()
3786 old_disk_conf = device->ldev->disk_conf; in receive_sizes()
3790 rcu_assign_pointer(device->ldev->disk_conf, new_disk_conf); in receive_sizes()
3795 drbd_info(device, "Peer sets u_size to %lu sectors\n", in receive_sizes()
3799 put_ldev(device); in receive_sizes()
3802 device->peer_max_bio_size = be32_to_cpu(p->max_bio_size); in receive_sizes()
3809 if (get_ldev(device)) { in receive_sizes()
3810 drbd_reconsider_max_bio_size(device, device->ldev); in receive_sizes()
3811 dd = drbd_determine_dev_size(device, ddsf, NULL); in receive_sizes()
3812 put_ldev(device); in receive_sizes()
3815 drbd_md_sync(device); in receive_sizes()
3830 drbd_reconsider_max_bio_size(device, NULL); in receive_sizes()
3831 drbd_set_my_capacity(device, p_csize ?: p_usize ?: p_size); in receive_sizes()
3834 if (get_ldev(device)) { in receive_sizes()
3835 if (device->ldev->known_size != drbd_get_capacity(device->ldev->backing_bdev)) { in receive_sizes()
3836 device->ldev->known_size = drbd_get_capacity(device->ldev->backing_bdev); in receive_sizes()
3840 put_ldev(device); in receive_sizes()
3843 if (device->state.conn > C_WF_REPORT_PARAMS) { in receive_sizes()
3845 drbd_get_capacity(device->this_bdev) || ldsc) { in receive_sizes()
3850 if (test_and_clear_bit(RESIZE_PENDING, &device->flags) || in receive_sizes()
3851 (dd == DS_GREW && device->state.conn == C_CONNECTED)) { in receive_sizes()
3852 if (device->state.pdsk >= D_INCONSISTENT && in receive_sizes()
3853 device->state.disk >= D_INCONSISTENT) { in receive_sizes()
3855 drbd_info(device, "Resync of new storage suppressed with --assume-clean\n"); in receive_sizes()
3857 resync_after_online_grow(device); in receive_sizes()
3859 set_bit(RESYNC_AFTER_NEG, &device->flags); in receive_sizes()
3869 struct drbd_device *device; in receive_uuids() local
3877 device = peer_device->device; in receive_uuids()
3881 drbd_err(device, "kmalloc of p_uuid failed\n"); in receive_uuids()
3888 kfree(device->p_uuid); in receive_uuids()
3889 device->p_uuid = p_uuid; in receive_uuids()
3891 if (device->state.conn < C_CONNECTED && in receive_uuids()
3892 device->state.disk < D_INCONSISTENT && in receive_uuids()
3893 device->state.role == R_PRIMARY && in receive_uuids()
3894 (device->ed_uuid & ~((u64)1)) != (p_uuid[UI_CURRENT] & ~((u64)1))) { in receive_uuids()
3895 drbd_err(device, "Can only connect to data with current UUID=%016llX\n", in receive_uuids()
3896 (unsigned long long)device->ed_uuid); in receive_uuids()
3901 if (get_ldev(device)) { in receive_uuids()
3903 device->state.conn == C_CONNECTED && in receive_uuids()
3905 device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED && in receive_uuids()
3908 drbd_info(device, "Accepted new current UUID, preparing to skip initial sync\n"); in receive_uuids()
3909 drbd_bitmap_io(device, &drbd_bmio_clear_n_write, in receive_uuids()
3912 _drbd_uuid_set(device, UI_CURRENT, p_uuid[UI_CURRENT]); in receive_uuids()
3913 _drbd_uuid_set(device, UI_BITMAP, 0); in receive_uuids()
3914 _drbd_set_state(_NS2(device, disk, D_UP_TO_DATE, pdsk, D_UP_TO_DATE), in receive_uuids()
3916 drbd_md_sync(device); in receive_uuids()
3919 put_ldev(device); in receive_uuids()
3920 } else if (device->state.disk < D_INCONSISTENT && in receive_uuids()
3921 device->state.role == R_PRIMARY) { in receive_uuids()
3924 updated_uuids = drbd_set_ed_uuid(device, p_uuid[UI_CURRENT]); in receive_uuids()
3931 mutex_lock(device->state_mutex); in receive_uuids()
3932 mutex_unlock(device->state_mutex); in receive_uuids()
3933 if (device->state.conn >= C_CONNECTED && device->state.disk < D_INCONSISTENT) in receive_uuids()
3934 updated_uuids |= drbd_set_ed_uuid(device, p_uuid[UI_CURRENT]); in receive_uuids()
3937 drbd_print_uuids(device, "receiver updated UUIDs to"); in receive_uuids()
3976 struct drbd_device *device; in receive_req_state() local
3984 device = peer_device->device; in receive_req_state()
3990 mutex_is_locked(device->state_mutex)) { in receive_req_state()
3998 rv = drbd_change_state(device, CS_VERBOSE, mask, val); in receive_req_state()
4001 drbd_md_sync(device); in receive_req_state()
4033 struct drbd_device *device; in receive_state() local
4043 device = peer_device->device; in receive_state()
4049 real_peer_disk = device->p_uuid[UI_FLAGS] & 4 ? D_INCONSISTENT : D_CONSISTENT; in receive_state()
4050 drbd_info(device, "real peer disk state = %s\n", drbd_disk_str(real_peer_disk)); in receive_state()
4053 spin_lock_irq(&device->resource->req_lock); in receive_state()
4055 os = ns = drbd_read_state(device); in receive_state()
4056 spin_unlock_irq(&device->resource->req_lock); in receive_state()
4088 if (drbd_bm_total_weight(device) <= device->rs_failed) in receive_state()
4089 drbd_resync_finished(device); in receive_state()
4097 ov_out_of_sync_print(device); in receive_state()
4098 drbd_resync_finished(device); in receive_state()
4117 if (device->p_uuid && peer_state.disk >= D_NEGOTIATING && in receive_state()
4118 get_ldev_if_state(device, D_NEGOTIATING)) { in receive_state()
4130 cr |= test_bit(CONSIDER_RESYNC, &device->flags); in receive_state()
4140 put_ldev(device); in receive_state()
4143 if (device->state.disk == D_NEGOTIATING) { in receive_state()
4144 drbd_force_state(device, NS(disk, D_FAILED)); in receive_state()
4146 drbd_err(device, "Disk attach process on the peer node was aborted.\n"); in receive_state()
4152 D_ASSERT(device, os.conn == C_WF_REPORT_PARAMS); in receive_state()
4159 spin_lock_irq(&device->resource->req_lock); in receive_state()
4160 if (os.i != drbd_read_state(device).i) in receive_state()
4162 clear_bit(CONSIDER_RESYNC, &device->flags); in receive_state()
4167 ns.disk = device->new_state_tmp.disk; in receive_state()
4169 …if (ns.pdsk == D_CONSISTENT && drbd_suspended(device) && ns.conn == C_CONNECTED && os.conn < C_CON… in receive_state()
4170 test_bit(NEW_CUR_UUID, &device->flags)) { in receive_state()
4173 spin_unlock_irq(&device->resource->req_lock); in receive_state()
4174 drbd_err(device, "Aborting Connect, can not thaw IO with an only Consistent peer\n"); in receive_state()
4176 drbd_uuid_new_current(device); in receive_state()
4177 clear_bit(NEW_CUR_UUID, &device->flags); in receive_state()
4181 rv = _drbd_set_state(device, ns, cs_flags, NULL); in receive_state()
4182 ns = drbd_read_state(device); in receive_state()
4183 spin_unlock_irq(&device->resource->req_lock); in receive_state()
4201 clear_bit(DISCARD_MY_DATA, &device->flags); in receive_state()
4203 drbd_md_sync(device); /* update connected indicator, la_size_sect, ... */ in receive_state()
4211 struct drbd_device *device; in receive_sync_uuid() local
4217 device = peer_device->device; in receive_sync_uuid()
4219 wait_event(device->misc_wait, in receive_sync_uuid()
4220 device->state.conn == C_WF_SYNC_UUID || in receive_sync_uuid()
4221 device->state.conn == C_BEHIND || in receive_sync_uuid()
4222 device->state.conn < C_CONNECTED || in receive_sync_uuid()
4223 device->state.disk < D_NEGOTIATING); in receive_sync_uuid()
4229 if (get_ldev_if_state(device, D_NEGOTIATING)) { in receive_sync_uuid()
4230 _drbd_uuid_set(device, UI_CURRENT, be64_to_cpu(p->uuid)); in receive_sync_uuid()
4231 _drbd_uuid_set(device, UI_BITMAP, 0UL); in receive_sync_uuid()
4233 drbd_print_uuids(device, "updated sync uuid"); in receive_sync_uuid()
4234 drbd_start_resync(device, C_SYNC_TARGET); in receive_sync_uuid()
4236 put_ldev(device); in receive_sync_uuid()
4238 drbd_err(device, "Ignoring SyncUUID packet!\n"); in receive_sync_uuid()
4270 drbd_bm_merge_lel(peer_device->device, c->word_offset, num_words, p); in receive_bitmap_plain()
4334 _drbd_bm_set_bits(peer_device->device, s, e); in recv_bm_rle_bits()
4388 void INFO_bm_xfer_stats(struct drbd_device *device, in INFO_bm_xfer_stats() argument
4392 unsigned int header_size = drbd_header_size(first_peer_device(device)->connection); in INFO_bm_xfer_stats()
4416 drbd_info(device, "%s bitmap stats [Bytes(packets)]: plain %u(%u), RLE %u(%u), " in INFO_bm_xfer_stats()
4435 struct drbd_device *device; in receive_bitmap() local
4442 device = peer_device->device; in receive_bitmap()
4444 drbd_bm_lock(device, "receive bitmap", BM_LOCKED_SET_ALLOWED); in receive_bitmap()
4449 .bm_bits = drbd_bm_bits(device), in receive_bitmap()
4450 .bm_words = drbd_bm_words(device), in receive_bitmap()
4462 drbd_err(device, "ReportCBitmap packet too large\n"); in receive_bitmap()
4467 drbd_err(device, "ReportCBitmap packet too small (l:%u)\n", pi->size); in receive_bitmap()
4476 …drbd_warn(device, "receive_bitmap: cmd neither ReportBitMap nor ReportCBitMap (is 0x%x)", pi->cmd); in receive_bitmap()
4494 INFO_bm_xfer_stats(device, "receive", &c); in receive_bitmap()
4496 if (device->state.conn == C_WF_BITMAP_T) { in receive_bitmap()
4499 err = drbd_send_bitmap(device); in receive_bitmap()
4503 rv = _drbd_request_state(device, NS(conn, C_WF_SYNC_UUID), CS_VERBOSE); in receive_bitmap()
4504 D_ASSERT(device, rv == SS_SUCCESS); in receive_bitmap()
4505 } else if (device->state.conn != C_WF_BITMAP_S) { in receive_bitmap()
4508 drbd_info(device, "unexpected cstate (%s) in receive_bitmap\n", in receive_bitmap()
4509 drbd_conn_str(device->state.conn)); in receive_bitmap()
4514 drbd_bm_unlock(device); in receive_bitmap()
4515 if (!err && device->state.conn == C_WF_BITMAP_S) in receive_bitmap()
4516 drbd_start_resync(device, C_SYNC_SOURCE); in receive_bitmap()
4540 struct drbd_device *device; in receive_out_of_sync() local
4546 device = peer_device->device; in receive_out_of_sync()
4548 switch (device->state.conn) { in receive_out_of_sync()
4554 drbd_err(device, "ASSERT FAILED cstate = %s, expected: WFSyncUUID|WFBitMapT|Behind\n", in receive_out_of_sync()
4555 drbd_conn_str(device->state.conn)); in receive_out_of_sync()
4558 drbd_set_out_of_sync(device, be64_to_cpu(p->sector), be32_to_cpu(p->blksize)); in receive_out_of_sync()
4669 struct drbd_device *device = peer_device->device; in conn_disconnect() local
4670 kref_get(&device->kref); in conn_disconnect()
4673 kref_put(&device->kref, drbd_destroy_device); in conn_disconnect()
4702 struct drbd_device *device = peer_device->device; in drbd_disconnected() local
4706 spin_lock_irq(&device->resource->req_lock); in drbd_disconnected()
4707 _drbd_wait_ee_list_empty(device, &device->active_ee); in drbd_disconnected()
4708 _drbd_wait_ee_list_empty(device, &device->sync_ee); in drbd_disconnected()
4709 _drbd_wait_ee_list_empty(device, &device->read_ee); in drbd_disconnected()
4710 spin_unlock_irq(&device->resource->req_lock); in drbd_disconnected()
4722 drbd_rs_cancel_all(device); in drbd_disconnected()
4723 device->rs_total = 0; in drbd_disconnected()
4724 device->rs_failed = 0; in drbd_disconnected()
4725 atomic_set(&device->rs_pending_cnt, 0); in drbd_disconnected()
4726 wake_up(&device->misc_wait); in drbd_disconnected()
4728 del_timer_sync(&device->resync_timer); in drbd_disconnected()
4729 resync_timer_fn((unsigned long)device); in drbd_disconnected()
4736 drbd_finish_peer_reqs(device); in drbd_disconnected()
4745 drbd_rs_cancel_all(device); in drbd_disconnected()
4747 kfree(device->p_uuid); in drbd_disconnected()
4748 device->p_uuid = NULL; in drbd_disconnected()
4750 if (!drbd_suspended(device)) in drbd_disconnected()
4753 drbd_md_sync(device); in drbd_disconnected()
4757 wait_event(device->misc_wait, !test_bit(BITMAP_IO, &device->flags)); in drbd_disconnected()
4766 i = drbd_free_peer_reqs(device, &device->net_ee); in drbd_disconnected()
4768 drbd_info(device, "net_ee not empty, killed %u entries\n", i); in drbd_disconnected()
4769 i = atomic_read(&device->pp_in_use_by_net); in drbd_disconnected()
4771 drbd_info(device, "pp_in_use_by_net = %d, expected 0\n", i); in drbd_disconnected()
4772 i = atomic_read(&device->pp_in_use); in drbd_disconnected()
4774 drbd_info(device, "pp_in_use = %d, expected 0\n", i); in drbd_disconnected()
4776 D_ASSERT(device, list_empty(&device->read_ee)); in drbd_disconnected()
4777 D_ASSERT(device, list_empty(&device->active_ee)); in drbd_disconnected()
4778 D_ASSERT(device, list_empty(&device->sync_ee)); in drbd_disconnected()
4779 D_ASSERT(device, list_empty(&device->done_ee)); in drbd_disconnected()
5118 struct drbd_device *device; in got_RqSReply() local
5125 device = peer_device->device; in got_RqSReply()
5128 D_ASSERT(device, connection->agreed_pro_version < 100); in got_RqSReply()
5133 set_bit(CL_ST_CHG_SUCCESS, &device->flags); in got_RqSReply()
5135 set_bit(CL_ST_CHG_FAIL, &device->flags); in got_RqSReply()
5136 drbd_err(device, "Requested state change failed by peer: %s (%d)\n", in got_RqSReply()
5139 wake_up(&device->state_wait); in got_RqSReply()
5163 struct drbd_device *device; in got_IsInSync() local
5171 device = peer_device->device; in got_IsInSync()
5173 D_ASSERT(device, peer_device->connection->agreed_pro_version >= 89); in got_IsInSync()
5177 if (get_ldev(device)) { in got_IsInSync()
5178 drbd_rs_complete_io(device, sector); in got_IsInSync()
5179 drbd_set_in_sync(device, sector, blksize); in got_IsInSync()
5181 device->rs_same_csum += (blksize >> BM_BLOCK_SHIFT); in got_IsInSync()
5182 put_ldev(device); in got_IsInSync()
5184 dec_rs_pending(device); in got_IsInSync()
5185 atomic_add(blksize >> 9, &device->rs_sect_in); in got_IsInSync()
5191 validate_req_change_req_state(struct drbd_device *device, u64 id, sector_t sector, in validate_req_change_req_state() argument
5198 spin_lock_irq(&device->resource->req_lock); in validate_req_change_req_state()
5199 req = find_request(device, root, id, sector, missing_ok, func); in validate_req_change_req_state()
5201 spin_unlock_irq(&device->resource->req_lock); in validate_req_change_req_state()
5205 spin_unlock_irq(&device->resource->req_lock); in validate_req_change_req_state()
5208 complete_master_bio(device, &m); in validate_req_change_req_state()
5215 struct drbd_device *device; in got_BlockAck() local
5224 device = peer_device->device; in got_BlockAck()
5229 drbd_set_in_sync(device, sector, blksize); in got_BlockAck()
5230 dec_rs_pending(device); in got_BlockAck()
5253 return validate_req_change_req_state(device, p->block_id, sector, in got_BlockAck()
5254 &device->write_requests, __func__, in got_BlockAck()
5261 struct drbd_device *device; in got_NegAck() local
5270 device = peer_device->device; in got_NegAck()
5275 dec_rs_pending(device); in got_NegAck()
5276 drbd_rs_failed_io(device, sector, size); in got_NegAck()
5280 err = validate_req_change_req_state(device, p->block_id, sector, in got_NegAck()
5281 &device->write_requests, __func__, in got_NegAck()
5289 drbd_set_out_of_sync(device, sector, size); in got_NegAck()
5297 struct drbd_device *device; in got_NegDReply() local
5304 device = peer_device->device; in got_NegDReply()
5308 drbd_err(device, "Got NegDReply; Sector %llus, len %u.\n", in got_NegDReply()
5311 return validate_req_change_req_state(device, p->block_id, sector, in got_NegDReply()
5312 &device->read_requests, __func__, in got_NegDReply()
5319 struct drbd_device *device; in got_NegRSDReply() local
5327 device = peer_device->device; in got_NegRSDReply()
5334 dec_rs_pending(device); in got_NegRSDReply()
5336 if (get_ldev_if_state(device, D_FAILED)) { in got_NegRSDReply()
5337 drbd_rs_complete_io(device, sector); in got_NegRSDReply()
5340 drbd_rs_failed_io(device, sector, size); in got_NegRSDReply()
5346 put_ldev(device); in got_NegRSDReply()
5362 struct drbd_device *device = peer_device->device; in got_BarrierAck() local
5364 if (device->state.conn == C_AHEAD && in got_BarrierAck()
5365 atomic_read(&device->ap_in_flight) == 0 && in got_BarrierAck()
5366 !test_and_set_bit(AHEAD_TO_SYNC_SOURCE, &device->flags)) { in got_BarrierAck()
5367 device->start_resync_timer.expires = jiffies + HZ; in got_BarrierAck()
5368 add_timer(&device->start_resync_timer); in got_BarrierAck()
5379 struct drbd_device *device; in got_OVResult() local
5388 device = peer_device->device; in got_OVResult()
5396 drbd_ov_out_of_sync_found(device, sector, size); in got_OVResult()
5398 ov_out_of_sync_print(device); in got_OVResult()
5400 if (!get_ldev(device)) in got_OVResult()
5403 drbd_rs_complete_io(device, sector); in got_OVResult()
5404 dec_rs_pending(device); in got_OVResult()
5406 --device->ov_left; in got_OVResult()
5409 if ((device->ov_left & 0x200) == 0x200) in got_OVResult()
5410 drbd_advance_rs_marks(device, device->ov_left); in got_OVResult()
5412 if (device->ov_left == 0) { in got_OVResult()
5416 dw->device = device; in got_OVResult()
5419 drbd_err(device, "kmalloc(dw) failed."); in got_OVResult()
5420 ov_out_of_sync_print(device); in got_OVResult()
5421 drbd_resync_finished(device); in got_OVResult()
5424 put_ldev(device); in got_OVResult()
5444 struct drbd_device *device = peer_device->device; in connection_finish_peer_reqs() local
5445 kref_get(&device->kref); in connection_finish_peer_reqs()
5447 if (drbd_finish_peer_reqs(device)) { in connection_finish_peer_reqs()
5448 kref_put(&device->kref, drbd_destroy_device); in connection_finish_peer_reqs()
5451 kref_put(&device->kref, drbd_destroy_device); in connection_finish_peer_reqs()
5458 struct drbd_device *device = peer_device->device; in connection_finish_peer_reqs() local
5459 not_empty = !list_empty(&device->done_ee); in connection_finish_peer_reqs()