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()
387 void __drbd_free_peer_req(struct drbd_device *device, struct drbd_peer_request *peer_req, in __drbd_free_peer_req() argument
393 drbd_free_pages(device, peer_req->pages, is_net); in __drbd_free_peer_req()
394 D_ASSERT(device, atomic_read(&peer_req->pending_bios) == 0); in __drbd_free_peer_req()
395 D_ASSERT(device, drbd_interval_empty(&peer_req->i)); in __drbd_free_peer_req()
398 drbd_al_complete_io(device, &peer_req->i); in __drbd_free_peer_req()
403 int drbd_free_peer_reqs(struct drbd_device *device, struct list_head *list) in drbd_free_peer_reqs() argument
408 int is_net = list == &device->net_ee; in drbd_free_peer_reqs()
410 spin_lock_irq(&device->resource->req_lock); in drbd_free_peer_reqs()
412 spin_unlock_irq(&device->resource->req_lock); in drbd_free_peer_reqs()
415 __drbd_free_peer_req(device, peer_req, is_net); in drbd_free_peer_reqs()
424 static int drbd_finish_peer_reqs(struct drbd_device *device) in drbd_finish_peer_reqs() argument
431 spin_lock_irq(&device->resource->req_lock); in drbd_finish_peer_reqs()
432 reclaim_finished_net_peer_reqs(device, &reclaimed); in drbd_finish_peer_reqs()
433 list_splice_init(&device->done_ee, &work_list); in drbd_finish_peer_reqs()
434 spin_unlock_irq(&device->resource->req_lock); in drbd_finish_peer_reqs()
437 drbd_free_net_peer_req(device, peer_req); in drbd_finish_peer_reqs()
450 drbd_free_peer_req(device, peer_req); in drbd_finish_peer_reqs()
452 wake_up(&device->ee_wait); in drbd_finish_peer_reqs()
457 static void _drbd_wait_ee_list_empty(struct drbd_device *device, in _drbd_wait_ee_list_empty() argument
465 prepare_to_wait(&device->ee_wait, &wait, TASK_UNINTERRUPTIBLE); in _drbd_wait_ee_list_empty()
466 spin_unlock_irq(&device->resource->req_lock); in _drbd_wait_ee_list_empty()
468 finish_wait(&device->ee_wait, &wait); in _drbd_wait_ee_list_empty()
469 spin_lock_irq(&device->resource->req_lock); in _drbd_wait_ee_list_empty()
473 static void drbd_wait_ee_list_empty(struct drbd_device *device, in drbd_wait_ee_list_empty() argument
476 spin_lock_irq(&device->resource->req_lock); in drbd_wait_ee_list_empty()
477 _drbd_wait_ee_list_empty(device, head); in drbd_wait_ee_list_empty()
478 spin_unlock_irq(&device->resource->req_lock); in drbd_wait_ee_list_empty()
871 struct drbd_device *device = peer_device->device; in drbd_connected() local
874 atomic_set(&device->packet_seq, 0); in drbd_connected()
875 device->peer_seq = 0; in drbd_connected()
877 device->state_mutex = peer_device->connection->agreed_pro_version < 100 ? in drbd_connected()
879 &device->own_state_mutex; in drbd_connected()
888 clear_bit(USE_DEGR_WFC_T, &device->flags); in drbd_connected()
889 clear_bit(RESIZE_PENDING, &device->flags); in drbd_connected()
890 atomic_set(&device->ap_in_flight, 0); in drbd_connected()
891 mod_timer(&device->request_timer, jiffies + HZ); /* just start it here. */ in drbd_connected()
1072 mutex_lock(peer_device->device->state_mutex); in conn_connect()
1077 mutex_unlock(peer_device->device->state_mutex); in conn_connect()
1081 struct drbd_device *device = peer_device->device; in conn_connect() local
1082 kref_get(&device->kref); in conn_connect()
1086 set_bit(DISCARD_MY_DATA, &device->flags); in conn_connect()
1088 clear_bit(DISCARD_MY_DATA, &device->flags); in conn_connect()
1091 kref_put(&device->kref, drbd_destroy_device); in conn_connect()
1184 struct drbd_device *device = peer_device->device; in drbd_flush() local
1186 if (!get_ldev(device)) in drbd_flush()
1188 kref_get(&device->kref); in drbd_flush()
1196 device->flush_jif = jiffies; in drbd_flush()
1197 set_bit(FLUSH_PENDING, &device->flags); in drbd_flush()
1198 rv = blkdev_issue_flush(device->ldev->backing_bdev, in drbd_flush()
1200 clear_bit(FLUSH_PENDING, &device->flags); in drbd_flush()
1202 drbd_info(device, "local disk flush failed with status %d\n", rv); in drbd_flush()
1208 put_ldev(device); in drbd_flush()
1209 kref_put(&device->kref, drbd_destroy_device); in drbd_flush()
1318 struct drbd_device *device; in drbd_bump_write_ordering() local
1331 idr_for_each_entry(&resource->devices, device, vnr) { in drbd_bump_write_ordering()
1332 if (get_ldev(device)) { in drbd_bump_write_ordering()
1333 wo = max_allowed_wo(device->ldev, wo); in drbd_bump_write_ordering()
1334 if (device->ldev == bdev) in drbd_bump_write_ordering()
1336 put_ldev(device); in drbd_bump_write_ordering()
1367 int drbd_submit_peer_request(struct drbd_device *device, in drbd_submit_peer_request() argument
1383 conn_wait_active_ee_empty(first_peer_device(device)->connection); in drbd_submit_peer_request()
1388 spin_lock_irq(&device->resource->req_lock); in drbd_submit_peer_request()
1389 list_add_tail(&peer_req->w.list, &device->active_ee); in drbd_submit_peer_request()
1390 spin_unlock_irq(&device->resource->req_lock); in drbd_submit_peer_request()
1391 if (blkdev_issue_zeroout(device->ldev->backing_bdev, in drbd_submit_peer_request()
1415 drbd_err(device, "submit_ee: Allocation of a bio failed (nr_pages=%u)\n", nr_pages); in drbd_submit_peer_request()
1420 bio->bi_bdev = device->ldev->backing_bdev; in drbd_submit_peer_request()
1441 drbd_err(device, in drbd_submit_peer_request()
1454 D_ASSERT(device, data_size == 0); in drbd_submit_peer_request()
1456 D_ASSERT(device, page == NULL); in drbd_submit_peer_request()
1467 drbd_generic_make_request(device, fault_type, bio); in drbd_submit_peer_request()
1480 static void drbd_remove_epoch_entry_interval(struct drbd_device *device, in drbd_remove_epoch_entry_interval() argument
1485 drbd_remove_interval(&device->write_requests, i); in drbd_remove_epoch_entry_interval()
1490 wake_up(&device->misc_wait); in drbd_remove_epoch_entry_interval()
1500 struct drbd_device *device = peer_device->device; in conn_wait_active_ee_empty() local
1502 kref_get(&device->kref); in conn_wait_active_ee_empty()
1504 drbd_wait_ee_list_empty(device, &device->active_ee); in conn_wait_active_ee_empty()
1505 kref_put(&device->kref, drbd_destroy_device); in conn_wait_active_ee_empty()
1591 struct drbd_device *device = peer_device->device; in read_in_block() local
1592 const sector_t capacity = drbd_get_capacity(device->this_bdev); in read_in_block()
1629 drbd_err(device, "request from peer beyond end of local disk: " in read_in_block()
1653 if (drbd_insert_fault(device, DRBD_FAULT_RECEIVE)) { in read_in_block()
1654 drbd_err(device, "Fault injection: Corrupting data on receive\n"); in read_in_block()
1659 drbd_free_peer_req(device, peer_req); in read_in_block()
1668 drbd_err(device, "Digest integrity check FAILED: %llus +%u\n", in read_in_block()
1670 drbd_free_peer_req(device, peer_req); in read_in_block()
1674 device->recv_cnt += data_size >> 9; in read_in_block()
1702 drbd_free_pages(peer_device->device, page, 0); in drbd_drain_block()
1727 peer_device->device->recv_cnt += data_size>>9; in recv_dless_read()
1730 D_ASSERT(peer_device->device, sector == bio->bi_iter.bi_sector); in recv_dless_read()
1750 D_ASSERT(peer_device->device, data_size == 0); in recv_dless_read()
1763 struct drbd_device *device = peer_device->device; in e_end_resync_block() local
1767 D_ASSERT(device, drbd_interval_empty(&peer_req->i)); in e_end_resync_block()
1770 drbd_set_in_sync(device, sector, peer_req->i.size); in e_end_resync_block()
1774 drbd_rs_failed_io(device, sector, peer_req->i.size); in e_end_resync_block()
1778 dec_unacked(device); in e_end_resync_block()
1786 struct drbd_device *device = peer_device->device; in recv_resync_read() local
1793 dec_rs_pending(device); in recv_resync_read()
1795 inc_unacked(device); in recv_resync_read()
1802 spin_lock_irq(&device->resource->req_lock); in recv_resync_read()
1803 list_add_tail(&peer_req->w.list, &device->sync_ee); in recv_resync_read()
1804 spin_unlock_irq(&device->resource->req_lock); in recv_resync_read()
1806 atomic_add(pi->size >> 9, &device->rs_sect_ev); in recv_resync_read()
1807 if (drbd_submit_peer_request(device, peer_req, WRITE, DRBD_FAULT_RS_WR) == 0) in recv_resync_read()
1811 drbd_err(device, "submit failed, triggering re-connect\n"); in recv_resync_read()
1812 spin_lock_irq(&device->resource->req_lock); in recv_resync_read()
1814 spin_unlock_irq(&device->resource->req_lock); in recv_resync_read()
1816 drbd_free_peer_req(device, peer_req); in recv_resync_read()
1818 put_ldev(device); in recv_resync_read()
1823 find_request(struct drbd_device *device, struct rb_root *root, u64 id, in find_request() argument
1833 drbd_err(device, "%s: failed to find request 0x%lx, sector %llus\n", func, in find_request()
1842 struct drbd_device *device; in receive_DataReply() local
1851 device = peer_device->device; in receive_DataReply()
1855 spin_lock_irq(&device->resource->req_lock); in receive_DataReply()
1856 req = find_request(device, &device->read_requests, p->block_id, sector, false, __func__); in receive_DataReply()
1857 spin_unlock_irq(&device->resource->req_lock); in receive_DataReply()
1877 struct drbd_device *device; in receive_RSDataReply() local
1885 device = peer_device->device; in receive_RSDataReply()
1888 D_ASSERT(device, p->block_id == ID_SYNCER); in receive_RSDataReply()
1890 if (get_ldev(device)) { in receive_RSDataReply()
1897 drbd_err(device, "Can not write resync data to local disk.\n"); in receive_RSDataReply()
1904 atomic_add(pi->size >> 9, &device->rs_sect_in); in receive_RSDataReply()
1909 static void restart_conflicting_writes(struct drbd_device *device, in restart_conflicting_writes() argument
1915 drbd_for_each_overlap(i, &device->write_requests, sector, size) { in restart_conflicting_writes()
1936 struct drbd_device *device = peer_device->device; in e_end_block() local
1942 pcmd = (device->state.conn >= C_SYNC_SOURCE && in e_end_block()
1943 device->state.conn <= C_PAUSED_SYNC_T && in e_end_block()
1948 drbd_set_in_sync(device, sector, peer_req->i.size); in e_end_block()
1954 dec_unacked(device); in e_end_block()
1960 spin_lock_irq(&device->resource->req_lock); in e_end_block()
1961 D_ASSERT(device, !drbd_interval_empty(&peer_req->i)); in e_end_block()
1962 drbd_remove_epoch_entry_interval(device, peer_req); in e_end_block()
1964 restart_conflicting_writes(device, sector, peer_req->i.size); in e_end_block()
1965 spin_unlock_irq(&device->resource->req_lock); in e_end_block()
1967 D_ASSERT(device, drbd_interval_empty(&peer_req->i)); in e_end_block()
1969 …drbd_may_finish_epoch(first_peer_device(device)->connection, peer_req->epoch, EV_PUT + (cancel ? E… in e_end_block()
1982 dec_unacked(peer_device->device); in e_send_ack()
2019 struct drbd_device *device = peer_device->device; in update_peer_seq() local
2023 spin_lock(&device->peer_seq_lock); in update_peer_seq()
2024 newest_peer_seq = seq_max(device->peer_seq, peer_seq); in update_peer_seq()
2025 device->peer_seq = newest_peer_seq; in update_peer_seq()
2026 spin_unlock(&device->peer_seq_lock); in update_peer_seq()
2029 wake_up(&device->seq_wait); in update_peer_seq()
2039 static bool overlapping_resync_write(struct drbd_device *device, struct drbd_peer_request *peer_req) in overlapping_resync_write() argument
2044 spin_lock_irq(&device->resource->req_lock); in overlapping_resync_write()
2045 list_for_each_entry(rs_req, &device->sync_ee, w.list) { in overlapping_resync_write()
2052 spin_unlock_irq(&device->resource->req_lock); in overlapping_resync_write()
2080 struct drbd_device *device = peer_device->device; in wait_for_and_update_peer_seq() local
2088 spin_lock(&device->peer_seq_lock); in wait_for_and_update_peer_seq()
2090 if (!seq_greater(peer_seq - 1, device->peer_seq)) { in wait_for_and_update_peer_seq()
2091 device->peer_seq = seq_max(device->peer_seq, peer_seq); in wait_for_and_update_peer_seq()
2101 tp = rcu_dereference(first_peer_device(device)->connection->net_conf)->two_primaries; in wait_for_and_update_peer_seq()
2108 prepare_to_wait(&device->seq_wait, &wait, TASK_INTERRUPTIBLE); in wait_for_and_update_peer_seq()
2109 spin_unlock(&device->peer_seq_lock); in wait_for_and_update_peer_seq()
2114 spin_lock(&device->peer_seq_lock); in wait_for_and_update_peer_seq()
2117 drbd_err(device, "Timed out waiting for missing ack packets; disconnecting\n"); in wait_for_and_update_peer_seq()
2121 spin_unlock(&device->peer_seq_lock); in wait_for_and_update_peer_seq()
2122 finish_wait(&device->seq_wait, &wait); in wait_for_and_update_peer_seq()
2137 static void fail_postponed_requests(struct drbd_device *device, sector_t sector, in fail_postponed_requests() argument
2143 drbd_for_each_overlap(i, &device->write_requests, sector, size) { in fail_postponed_requests()
2154 spin_unlock_irq(&device->resource->req_lock); in fail_postponed_requests()
2156 complete_master_bio(device, &m); in fail_postponed_requests()
2157 spin_lock_irq(&device->resource->req_lock); in fail_postponed_requests()
2162 static int handle_write_conflicts(struct drbd_device *device, in handle_write_conflicts() argument
2177 drbd_insert_interval(&device->write_requests, &peer_req->i); in handle_write_conflicts()
2180 drbd_for_each_overlap(i, &device->write_requests, sector, size) { in handle_write_conflicts()
2192 err = drbd_wait_misc(device, i); in handle_write_conflicts()
2210 drbd_alert(device, "Concurrent writes detected: " in handle_write_conflicts()
2219 list_add_tail(&peer_req->w.list, &device->done_ee); in handle_write_conflicts()
2229 drbd_alert(device, "Concurrent writes detected: " in handle_write_conflicts()
2247 err = drbd_wait_misc(device, &req->i); in handle_write_conflicts()
2250 fail_postponed_requests(device, sector, size); in handle_write_conflicts()
2266 drbd_remove_epoch_entry_interval(device, peer_req); in handle_write_conflicts()
2274 struct drbd_device *device; in receive_Data() local
2287 device = peer_device->device; in receive_Data()
2289 if (!get_ldev(device)) { in receive_Data()
2310 put_ldev(device); in receive_Data()
2321 struct request_queue *q = bdev_get_queue(device->ldev->backing_bdev); in receive_Data()
2329 D_ASSERT(device, peer_req->i.size == 0); in receive_Data()
2330 D_ASSERT(device, dp_flags & DP_FLUSH); in receive_Data()
2359 inc_unacked(device); in receive_Data()
2367 drbd_send_ack(first_peer_device(device), P_RECV_ACK, peer_req); in receive_Data()
2372 D_ASSERT(device, dp_flags & DP_SEND_WRITE_ACK); in receive_Data()
2377 spin_lock_irq(&device->resource->req_lock); in receive_Data()
2378 err = handle_write_conflicts(device, peer_req); in receive_Data()
2380 spin_unlock_irq(&device->resource->req_lock); in receive_Data()
2382 put_ldev(device); in receive_Data()
2389 spin_lock_irq(&device->resource->req_lock); in receive_Data()
2396 list_add_tail(&peer_req->w.list, &device->active_ee); in receive_Data()
2397 spin_unlock_irq(&device->resource->req_lock); in receive_Data()
2399 if (device->state.conn == C_SYNC_TARGET) in receive_Data()
2400 wait_event(device->ee_wait, !overlapping_resync_write(device, peer_req)); in receive_Data()
2402 if (device->state.pdsk < D_INCONSISTENT) { in receive_Data()
2404 drbd_set_out_of_sync(device, peer_req->i.sector, peer_req->i.size); in receive_Data()
2406 drbd_al_begin_io(device, &peer_req->i); in receive_Data()
2410 err = drbd_submit_peer_request(device, peer_req, rw, DRBD_FAULT_DT_WR); in receive_Data()
2415 drbd_err(device, "submit failed, triggering re-connect\n"); in receive_Data()
2416 spin_lock_irq(&device->resource->req_lock); in receive_Data()
2418 drbd_remove_epoch_entry_interval(device, peer_req); in receive_Data()
2419 spin_unlock_irq(&device->resource->req_lock); in receive_Data()
2422 drbd_al_complete_io(device, &peer_req->i); in receive_Data()
2427 put_ldev(device); in receive_Data()
2428 drbd_free_peer_req(device, peer_req); in receive_Data()
2443 bool drbd_rs_should_slow_down(struct drbd_device *device, sector_t sector, in drbd_rs_should_slow_down() argument
2447 bool throttle = drbd_rs_c_min_rate_throttle(device); in drbd_rs_should_slow_down()
2452 spin_lock_irq(&device->al_lock); in drbd_rs_should_slow_down()
2453 tmp = lc_find(device->resync, BM_SECT_TO_EXT(sector)); in drbd_rs_should_slow_down()
2461 spin_unlock_irq(&device->al_lock); in drbd_rs_should_slow_down()
2466 bool drbd_rs_c_min_rate_throttle(struct drbd_device *device) in drbd_rs_c_min_rate_throttle() argument
2468 struct gendisk *disk = device->ldev->backing_bdev->bd_contains->bd_disk; in drbd_rs_c_min_rate_throttle()
2474 c_min_rate = rcu_dereference(device->ldev->disk_conf)->c_min_rate; in drbd_rs_c_min_rate_throttle()
2483 atomic_read(&device->rs_sect_ev); in drbd_rs_c_min_rate_throttle()
2485 if (atomic_read(&device->ap_actlog_cnt) in drbd_rs_c_min_rate_throttle()
2486 || curr_events - device->rs_last_events > 64) { in drbd_rs_c_min_rate_throttle()
2490 device->rs_last_events = curr_events; in drbd_rs_c_min_rate_throttle()
2494 i = (device->rs_last_mark + DRBD_SYNC_MARKS-1) % DRBD_SYNC_MARKS; in drbd_rs_c_min_rate_throttle()
2496 if (device->state.conn == C_VERIFY_S || device->state.conn == C_VERIFY_T) in drbd_rs_c_min_rate_throttle()
2497 rs_left = device->ov_left; in drbd_rs_c_min_rate_throttle()
2499 rs_left = drbd_bm_total_weight(device) - device->rs_failed; in drbd_rs_c_min_rate_throttle()
2501 dt = ((long)jiffies - (long)device->rs_mark_time[i]) / HZ; in drbd_rs_c_min_rate_throttle()
2504 db = device->rs_mark_left[i] - rs_left; in drbd_rs_c_min_rate_throttle()
2516 struct drbd_device *device; in receive_DataRequest() local
2528 device = peer_device->device; in receive_DataRequest()
2529 capacity = drbd_get_capacity(device->this_bdev); in receive_DataRequest()
2535 drbd_err(device, "%s:%d: sector: %llus, size: %u\n", __FILE__, __LINE__, in receive_DataRequest()
2540 drbd_err(device, "%s:%d: sector: %llus, size: %u\n", __FILE__, __LINE__, in receive_DataRequest()
2545 if (!get_ldev_if_state(device, D_UP_TO_DATE)) { in receive_DataRequest()
2558 dec_rs_pending(device); in receive_DataRequest()
2565 drbd_err(device, "Can not satisfy peer's read request, " in receive_DataRequest()
2578 put_ldev(device); in receive_DataRequest()
2594 device->bm_resync_fo = BM_SECT_TO_BIT(sector); in receive_DataRequest()
2614 D_ASSERT(device, peer_device->connection->agreed_pro_version >= 89); in receive_DataRequest()
2617 device->bm_resync_fo = BM_SECT_TO_BIT(sector); in receive_DataRequest()
2619 device->use_csums = true; in receive_DataRequest()
2622 atomic_add(size >> 9, &device->rs_sect_in); in receive_DataRequest()
2624 dec_rs_pending(device); in receive_DataRequest()
2632 if (device->ov_start_sector == ~(sector_t)0 && in receive_DataRequest()
2636 device->ov_start_sector = sector; in receive_DataRequest()
2637 device->ov_position = sector; in receive_DataRequest()
2638 device->ov_left = drbd_bm_bits(device) - BM_SECT_TO_BIT(sector); in receive_DataRequest()
2639 device->rs_total = device->ov_left; in receive_DataRequest()
2641 device->rs_mark_left[i] = device->ov_left; in receive_DataRequest()
2642 device->rs_mark_time[i] = now; in receive_DataRequest()
2644 drbd_info(device, "Online Verify start sector: %llu\n", in receive_DataRequest()
2682 spin_lock_irq(&device->resource->req_lock); in receive_DataRequest()
2683 list_add_tail(&peer_req->w.list, &device->read_ee); in receive_DataRequest()
2684 spin_unlock_irq(&device->resource->req_lock); in receive_DataRequest()
2687 if (device->state.peer != R_PRIMARY in receive_DataRequest()
2688 && drbd_rs_should_slow_down(device, sector, false)) in receive_DataRequest()
2691 if (drbd_rs_begin_io(device, sector)) in receive_DataRequest()
2695 atomic_add(size >> 9, &device->rs_sect_ev); in receive_DataRequest()
2699 inc_unacked(device); in receive_DataRequest()
2700 if (drbd_submit_peer_request(device, peer_req, READ, fault_type) == 0) in receive_DataRequest()
2704 drbd_err(device, "submit failed, triggering re-connect\n"); in receive_DataRequest()
2707 spin_lock_irq(&device->resource->req_lock); in receive_DataRequest()
2709 spin_unlock_irq(&device->resource->req_lock); in receive_DataRequest()
2712 put_ldev(device); in receive_DataRequest()
2713 drbd_free_peer_req(device, peer_req); in receive_DataRequest()
2722 struct drbd_device *device = peer_device->device; in drbd_asb_recover_0p() local
2727 self = device->ldev->md.uuid[UI_BITMAP] & 1; in drbd_asb_recover_0p()
2728 peer = device->p_uuid[UI_BITMAP] & 1; in drbd_asb_recover_0p()
2730 ch_peer = device->p_uuid[UI_SIZE]; in drbd_asb_recover_0p()
2731 ch_self = device->comm_bm_set; in drbd_asb_recover_0p()
2741 drbd_err(device, "Configuration error.\n"); in drbd_asb_recover_0p()
2765 drbd_warn(device, "Discard younger/older primary did not find a decision\n" in drbd_asb_recover_0p()
2803 struct drbd_device *device = peer_device->device; in drbd_asb_recover_1p() local
2817 drbd_err(device, "Configuration error.\n"); in drbd_asb_recover_1p()
2823 if (hg == -1 && device->state.role == R_SECONDARY) in drbd_asb_recover_1p()
2825 if (hg == 1 && device->state.role == R_PRIMARY) in drbd_asb_recover_1p()
2832 return device->state.role == R_PRIMARY ? 1 : -1; in drbd_asb_recover_1p()
2835 if (hg == -1 && device->state.role == R_PRIMARY) { in drbd_asb_recover_1p()
2841 rv2 = drbd_change_state(device, CS_VERBOSE, NS(role, R_SECONDARY)); in drbd_asb_recover_1p()
2843 drbd_khelper(device, "pri-lost-after-sb"); in drbd_asb_recover_1p()
2845 drbd_warn(device, "Successfully gave up primary role.\n"); in drbd_asb_recover_1p()
2860 struct drbd_device *device = peer_device->device; in drbd_asb_recover_2p() local
2876 drbd_err(device, "Configuration error.\n"); in drbd_asb_recover_2p()
2891 rv2 = drbd_change_state(device, CS_VERBOSE, NS(role, R_SECONDARY)); in drbd_asb_recover_2p()
2893 drbd_khelper(device, "pri-lost-after-sb"); in drbd_asb_recover_2p()
2895 drbd_warn(device, "Successfully gave up primary role.\n"); in drbd_asb_recover_2p()
2905 static void drbd_uuid_dump(struct drbd_device *device, char *text, u64 *uuid, in drbd_uuid_dump() argument
2909 drbd_info(device, "%s uuid info vanished while I was looking!\n", text); in drbd_uuid_dump()
2912 drbd_info(device, "%s %016llX:%016llX:%016llX:%016llX bits:%llu flags:%llX\n", in drbd_uuid_dump()
2934 static int drbd_uuid_compare(struct drbd_device *const device, int *rule_nr) __must_hold(local) in drbd_uuid_compare() argument
2936 struct drbd_peer_device *const peer_device = first_peer_device(device); in drbd_uuid_compare()
2941 self = device->ldev->md.uuid[UI_CURRENT] & ~((u64)1); in drbd_uuid_compare()
2942 peer = device->p_uuid[UI_CURRENT] & ~((u64)1); in drbd_uuid_compare()
2961 if (device->p_uuid[UI_BITMAP] == (u64)0 && device->ldev->md.uuid[UI_BITMAP] != (u64)0) { in drbd_uuid_compare()
2966 …if ((device->ldev->md.uuid[UI_BITMAP] & ~((u64)1)) == (device->p_uuid[UI_HISTORY_START] & ~((u64)1… in drbd_uuid_compare()
2967 …(device->ldev->md.uuid[UI_HISTORY_START] & ~((u64)1)) == (device->p_uuid[UI_HISTORY_START + 1] & ~… in drbd_uuid_compare()
2968 drbd_info(device, "was SyncSource, missed the resync finished event, corrected myself:\n"); in drbd_uuid_compare()
2969 drbd_uuid_move_history(device); in drbd_uuid_compare()
2970 device->ldev->md.uuid[UI_HISTORY_START] = device->ldev->md.uuid[UI_BITMAP]; in drbd_uuid_compare()
2971 device->ldev->md.uuid[UI_BITMAP] = 0; in drbd_uuid_compare()
2973 drbd_uuid_dump(device, "self", device->ldev->md.uuid, in drbd_uuid_compare()
2974 device->state.disk >= D_NEGOTIATING ? drbd_bm_total_weight(device) : 0, 0); in drbd_uuid_compare()
2977 drbd_info(device, "was SyncSource (peer failed to write sync_uuid)\n"); in drbd_uuid_compare()
2984 if (device->ldev->md.uuid[UI_BITMAP] == (u64)0 && device->p_uuid[UI_BITMAP] != (u64)0) { in drbd_uuid_compare()
2989 …if ((device->ldev->md.uuid[UI_HISTORY_START] & ~((u64)1)) == (device->p_uuid[UI_BITMAP] & ~((u64)1… in drbd_uuid_compare()
2990 …(device->ldev->md.uuid[UI_HISTORY_START + 1] & ~((u64)1)) == (device->p_uuid[UI_HISTORY_START] & ~… in drbd_uuid_compare()
2991 drbd_info(device, "was SyncTarget, peer missed the resync finished event, corrected peer:\n"); in drbd_uuid_compare()
2993 device->p_uuid[UI_HISTORY_START + 1] = device->p_uuid[UI_HISTORY_START]; in drbd_uuid_compare()
2994 device->p_uuid[UI_HISTORY_START] = device->p_uuid[UI_BITMAP]; in drbd_uuid_compare()
2995 device->p_uuid[UI_BITMAP] = 0UL; in drbd_uuid_compare()
2997 … drbd_uuid_dump(device, "peer", device->p_uuid, device->p_uuid[UI_SIZE], device->p_uuid[UI_FLAGS]); in drbd_uuid_compare()
3000 drbd_info(device, "was SyncTarget (failed to write sync_uuid)\n"); in drbd_uuid_compare()
3008 rct = (test_bit(CRASHED_PRIMARY, &device->flags) ? 1 : 0) + in drbd_uuid_compare()
3009 (device->p_uuid[UI_FLAGS] & 2); in drbd_uuid_compare()
3025 peer = device->p_uuid[UI_BITMAP] & ~((u64)1); in drbd_uuid_compare()
3030 peer = device->p_uuid[UI_HISTORY_START] & ~((u64)1); in drbd_uuid_compare()
3033 (device->ldev->md.uuid[UI_HISTORY_START] & ~((u64)1)) == in drbd_uuid_compare()
3034 (device->p_uuid[UI_HISTORY_START + 1] & ~((u64)1)) : in drbd_uuid_compare()
3035 peer + UUID_NEW_BM_OFFSET == (device->p_uuid[UI_BITMAP] & ~((u64)1))) { in drbd_uuid_compare()
3042 device->p_uuid[UI_BITMAP] = device->p_uuid[UI_HISTORY_START]; in drbd_uuid_compare()
3043 device->p_uuid[UI_HISTORY_START] = device->p_uuid[UI_HISTORY_START + 1]; in drbd_uuid_compare()
3045 drbd_info(device, "Lost last syncUUID packet, corrected:\n"); in drbd_uuid_compare()
3046 … drbd_uuid_dump(device, "peer", device->p_uuid, device->p_uuid[UI_SIZE], device->p_uuid[UI_FLAGS]); in drbd_uuid_compare()
3053 self = device->ldev->md.uuid[UI_CURRENT] & ~((u64)1); in drbd_uuid_compare()
3055 peer = device->p_uuid[i] & ~((u64)1); in drbd_uuid_compare()
3061 self = device->ldev->md.uuid[UI_BITMAP] & ~((u64)1); in drbd_uuid_compare()
3062 peer = device->p_uuid[UI_CURRENT] & ~((u64)1); in drbd_uuid_compare()
3067 self = device->ldev->md.uuid[UI_HISTORY_START] & ~((u64)1); in drbd_uuid_compare()
3070 (device->ldev->md.uuid[UI_HISTORY_START + 1] & ~((u64)1)) == in drbd_uuid_compare()
3071 (device->p_uuid[UI_HISTORY_START] & ~((u64)1)) : in drbd_uuid_compare()
3072 self + UUID_NEW_BM_OFFSET == (device->ldev->md.uuid[UI_BITMAP] & ~((u64)1))) { in drbd_uuid_compare()
3079 __drbd_uuid_set(device, UI_BITMAP, device->ldev->md.uuid[UI_HISTORY_START]); in drbd_uuid_compare()
3080 __drbd_uuid_set(device, UI_HISTORY_START, device->ldev->md.uuid[UI_HISTORY_START + 1]); in drbd_uuid_compare()
3082 drbd_info(device, "Last syncUUID did not get through, corrected:\n"); in drbd_uuid_compare()
3083 drbd_uuid_dump(device, "self", device->ldev->md.uuid, in drbd_uuid_compare()
3084 device->state.disk >= D_NEGOTIATING ? drbd_bm_total_weight(device) : 0, 0); in drbd_uuid_compare()
3092 peer = device->p_uuid[UI_CURRENT] & ~((u64)1); in drbd_uuid_compare()
3094 self = device->ldev->md.uuid[i] & ~((u64)1); in drbd_uuid_compare()
3100 self = device->ldev->md.uuid[UI_BITMAP] & ~((u64)1); in drbd_uuid_compare()
3101 peer = device->p_uuid[UI_BITMAP] & ~((u64)1); in drbd_uuid_compare()
3107 self = device->ldev->md.uuid[i] & ~((u64)1); in drbd_uuid_compare()
3109 peer = device->p_uuid[j] & ~((u64)1); in drbd_uuid_compare()
3125 struct drbd_device *device = peer_device->device; in drbd_sync_handshake() local
3131 mydisk = device->state.disk; in drbd_sync_handshake()
3133 mydisk = device->new_state_tmp.disk; in drbd_sync_handshake()
3135 drbd_info(device, "drbd_sync_handshake:\n"); in drbd_sync_handshake()
3137 spin_lock_irq(&device->ldev->md.uuid_lock); in drbd_sync_handshake()
3138 drbd_uuid_dump(device, "self", device->ldev->md.uuid, device->comm_bm_set, 0); in drbd_sync_handshake()
3139 drbd_uuid_dump(device, "peer", device->p_uuid, in drbd_sync_handshake()
3140 device->p_uuid[UI_SIZE], device->p_uuid[UI_FLAGS]); in drbd_sync_handshake()
3142 hg = drbd_uuid_compare(device, &rule_nr); in drbd_sync_handshake()
3143 spin_unlock_irq(&device->ldev->md.uuid_lock); in drbd_sync_handshake()
3145 drbd_info(device, "uuid_compare()=%d by rule %d\n", hg, rule_nr); in drbd_sync_handshake()
3148 drbd_alert(device, "Unrelated data, aborting!\n"); in drbd_sync_handshake()
3152 …drbd_alert(device, "To resolve this both sides have to support at least protocol %d\n", -hg - 1000… in drbd_sync_handshake()
3162 drbd_info(device, "Becoming sync %s due to disk states.\n", in drbd_sync_handshake()
3167 drbd_khelper(device, "initial-split-brain"); in drbd_sync_handshake()
3173 int pcount = (device->state.role == R_PRIMARY) in drbd_sync_handshake()
3189 drbd_warn(device, "Split-Brain detected, %d primaries, " in drbd_sync_handshake()
3193 drbd_warn(device, "Doing a full sync, since" in drbd_sync_handshake()
3201 if (test_bit(DISCARD_MY_DATA, &device->flags) && !(device->p_uuid[UI_FLAGS]&1)) in drbd_sync_handshake()
3203 if (!test_bit(DISCARD_MY_DATA, &device->flags) && (device->p_uuid[UI_FLAGS]&1)) in drbd_sync_handshake()
3207 drbd_warn(device, "Split-Brain detected, manually solved. " in drbd_sync_handshake()
3220 drbd_alert(device, "Split-Brain detected but unresolved, dropping connection!\n"); in drbd_sync_handshake()
3221 drbd_khelper(device, "split-brain"); in drbd_sync_handshake()
3226 drbd_err(device, "I shall become SyncSource, but I am inconsistent!\n"); in drbd_sync_handshake()
3231 device->state.role == R_PRIMARY && device->state.disk >= D_CONSISTENT) { in drbd_sync_handshake()
3234 drbd_khelper(device, "pri-lost"); in drbd_sync_handshake()
3237 drbd_err(device, "I shall become SyncTarget, but I am primary!\n"); in drbd_sync_handshake()
3240 drbd_warn(device, "Becoming SyncTarget, violating the stable-data" in drbd_sync_handshake()
3247 drbd_info(device, "dry-run connect: No resync, would become Connected immediately.\n"); in drbd_sync_handshake()
3249 drbd_info(device, "dry-run connect: Would become %s, doing a %s resync.", in drbd_sync_handshake()
3256 drbd_info(device, "Writing the whole bitmap, full sync required after drbd_sync_handshake.\n"); in drbd_sync_handshake()
3257 if (drbd_bitmap_io(device, &drbd_bmio_set_n_write, "set_n_write from sync_handshake", in drbd_sync_handshake()
3268 if (drbd_bm_total_weight(device)) { in drbd_sync_handshake()
3269 drbd_info(device, "No resync, but %lu bits in bitmap!\n", in drbd_sync_handshake()
3270 drbd_bm_total_weight(device)); in drbd_sync_handshake()
3446 static struct crypto_hash *drbd_crypto_alloc_digest_safe(const struct drbd_device *device, in drbd_crypto_alloc_digest_safe() argument
3456 drbd_err(device, "Can not allocate \"%s\" as %s (reason: %ld)\n", in drbd_crypto_alloc_digest_safe()
3504 struct drbd_device *device; in receive_SyncParam() local
3519 device = peer_device->device; in receive_SyncParam()
3528 drbd_err(device, "SyncParam packet too long: received %u, expected <= %u bytes\n", in receive_SyncParam()
3539 D_ASSERT(device, data_size == 0); in receive_SyncParam()
3543 D_ASSERT(device, data_size == 0); in receive_SyncParam()
3556 if (get_ldev(device)) { in receive_SyncParam()
3559 put_ldev(device); in receive_SyncParam()
3561 drbd_err(device, "Allocation of new disk_conf failed\n"); in receive_SyncParam()
3565 old_disk_conf = device->ldev->disk_conf; in receive_SyncParam()
3574 drbd_err(device, "verify-alg of wrong size, " in receive_SyncParam()
3586 D_ASSERT(device, p->verify_alg[data_size-1] == 0); in receive_SyncParam()
3592 D_ASSERT(device, p->verify_alg[SHARED_SECRET_MAX-1] == 0); in receive_SyncParam()
3593 D_ASSERT(device, p->csums_alg[SHARED_SECRET_MAX-1] == 0); in receive_SyncParam()
3599 if (device->state.conn == C_WF_REPORT_PARAMS) { in receive_SyncParam()
3600 drbd_err(device, "Different verify-alg settings. me=\"%s\" peer=\"%s\"\n", in receive_SyncParam()
3604 verify_tfm = drbd_crypto_alloc_digest_safe(device, in receive_SyncParam()
3613 if (device->state.conn == C_WF_REPORT_PARAMS) { in receive_SyncParam()
3614 drbd_err(device, "Different csums-alg settings. me=\"%s\" peer=\"%s\"\n", in receive_SyncParam()
3618 csums_tfm = drbd_crypto_alloc_digest_safe(device, in receive_SyncParam()
3633 if (fifo_size != device->rs_plan_s->size) { in receive_SyncParam()
3636 drbd_err(device, "kmalloc of fifo_buffer failed"); in receive_SyncParam()
3637 put_ldev(device); in receive_SyncParam()
3646 drbd_err(device, "Allocation of new net_conf failed\n"); in receive_SyncParam()
3657 drbd_info(device, "using verify-alg: \"%s\"\n", p->verify_alg); in receive_SyncParam()
3664 drbd_info(device, "using csums-alg: \"%s\"\n", p->csums_alg); in receive_SyncParam()
3671 rcu_assign_pointer(device->ldev->disk_conf, new_disk_conf); in receive_SyncParam()
3672 put_ldev(device); in receive_SyncParam()
3676 old_plan = device->rs_plan_s; in receive_SyncParam()
3677 rcu_assign_pointer(device->rs_plan_s, new_plan); in receive_SyncParam()
3691 put_ldev(device); in receive_SyncParam()
3700 put_ldev(device); in receive_SyncParam()
3714 static void warn_if_differ_considerably(struct drbd_device *device, in warn_if_differ_considerably() argument
3722 drbd_warn(device, "Considerable difference in %s: %llus vs. %llus\n", s, in warn_if_differ_considerably()
3729 struct drbd_device *device; in receive_sizes() local
3739 device = peer_device->device; in receive_sizes()
3747 device->p_size = p_size; in receive_sizes()
3749 if (get_ldev(device)) { in receive_sizes()
3751 my_usize = rcu_dereference(device->ldev->disk_conf)->disk_size; in receive_sizes()
3754 warn_if_differ_considerably(device, "lower level device sizes", in receive_sizes()
3755 p_size, drbd_get_max_capacity(device->ldev)); in receive_sizes()
3756 warn_if_differ_considerably(device, "user requested size", in receive_sizes()
3761 if (device->state.conn == C_WF_REPORT_PARAMS) in receive_sizes()
3766 if (drbd_new_dev_size(device, device->ldev, p_usize, 0) < in receive_sizes()
3767 drbd_get_capacity(device->this_bdev) && in receive_sizes()
3768 device->state.disk >= D_OUTDATED && in receive_sizes()
3769 device->state.conn < C_CONNECTED) { in receive_sizes()
3770 drbd_err(device, "The peer's disk size is too small!\n"); in receive_sizes()
3772 put_ldev(device); in receive_sizes()
3781 drbd_err(device, "Allocation of new disk_conf failed\n"); in receive_sizes()
3782 put_ldev(device); in receive_sizes()
3787 old_disk_conf = device->ldev->disk_conf; in receive_sizes()
3791 rcu_assign_pointer(device->ldev->disk_conf, new_disk_conf); in receive_sizes()
3796 drbd_info(device, "Peer sets u_size to %lu sectors\n", in receive_sizes()
3800 put_ldev(device); in receive_sizes()
3803 device->peer_max_bio_size = be32_to_cpu(p->max_bio_size); in receive_sizes()
3810 if (get_ldev(device)) { in receive_sizes()
3811 drbd_reconsider_max_bio_size(device, device->ldev); in receive_sizes()
3812 dd = drbd_determine_dev_size(device, ddsf, NULL); in receive_sizes()
3813 put_ldev(device); in receive_sizes()
3816 drbd_md_sync(device); in receive_sizes()
3831 drbd_reconsider_max_bio_size(device, NULL); in receive_sizes()
3832 drbd_set_my_capacity(device, p_csize ?: p_usize ?: p_size); in receive_sizes()
3835 if (get_ldev(device)) { in receive_sizes()
3836 if (device->ldev->known_size != drbd_get_capacity(device->ldev->backing_bdev)) { in receive_sizes()
3837 device->ldev->known_size = drbd_get_capacity(device->ldev->backing_bdev); in receive_sizes()
3841 put_ldev(device); in receive_sizes()
3844 if (device->state.conn > C_WF_REPORT_PARAMS) { in receive_sizes()
3846 drbd_get_capacity(device->this_bdev) || ldsc) { in receive_sizes()
3851 if (test_and_clear_bit(RESIZE_PENDING, &device->flags) || in receive_sizes()
3852 (dd == DS_GREW && device->state.conn == C_CONNECTED)) { in receive_sizes()
3853 if (device->state.pdsk >= D_INCONSISTENT && in receive_sizes()
3854 device->state.disk >= D_INCONSISTENT) { in receive_sizes()
3856 drbd_info(device, "Resync of new storage suppressed with --assume-clean\n"); in receive_sizes()
3858 resync_after_online_grow(device); in receive_sizes()
3860 set_bit(RESYNC_AFTER_NEG, &device->flags); in receive_sizes()
3870 struct drbd_device *device; in receive_uuids() local
3878 device = peer_device->device; in receive_uuids()
3882 drbd_err(device, "kmalloc of p_uuid failed\n"); in receive_uuids()
3889 kfree(device->p_uuid); in receive_uuids()
3890 device->p_uuid = p_uuid; in receive_uuids()
3892 if (device->state.conn < C_CONNECTED && in receive_uuids()
3893 device->state.disk < D_INCONSISTENT && in receive_uuids()
3894 device->state.role == R_PRIMARY && in receive_uuids()
3895 (device->ed_uuid & ~((u64)1)) != (p_uuid[UI_CURRENT] & ~((u64)1))) { in receive_uuids()
3896 drbd_err(device, "Can only connect to data with current UUID=%016llX\n", in receive_uuids()
3897 (unsigned long long)device->ed_uuid); in receive_uuids()
3902 if (get_ldev(device)) { in receive_uuids()
3904 device->state.conn == C_CONNECTED && in receive_uuids()
3906 device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED && in receive_uuids()
3909 drbd_info(device, "Accepted new current UUID, preparing to skip initial sync\n"); in receive_uuids()
3910 drbd_bitmap_io(device, &drbd_bmio_clear_n_write, in receive_uuids()
3913 _drbd_uuid_set(device, UI_CURRENT, p_uuid[UI_CURRENT]); in receive_uuids()
3914 _drbd_uuid_set(device, UI_BITMAP, 0); in receive_uuids()
3915 _drbd_set_state(_NS2(device, disk, D_UP_TO_DATE, pdsk, D_UP_TO_DATE), in receive_uuids()
3917 drbd_md_sync(device); in receive_uuids()
3920 put_ldev(device); in receive_uuids()
3921 } else if (device->state.disk < D_INCONSISTENT && in receive_uuids()
3922 device->state.role == R_PRIMARY) { in receive_uuids()
3925 updated_uuids = drbd_set_ed_uuid(device, p_uuid[UI_CURRENT]); in receive_uuids()
3932 mutex_lock(device->state_mutex); in receive_uuids()
3933 mutex_unlock(device->state_mutex); in receive_uuids()
3934 if (device->state.conn >= C_CONNECTED && device->state.disk < D_INCONSISTENT) in receive_uuids()
3935 updated_uuids |= drbd_set_ed_uuid(device, p_uuid[UI_CURRENT]); in receive_uuids()
3938 drbd_print_uuids(device, "receiver updated UUIDs to"); in receive_uuids()
3977 struct drbd_device *device; in receive_req_state() local
3985 device = peer_device->device; in receive_req_state()
3991 mutex_is_locked(device->state_mutex)) { in receive_req_state()
3999 rv = drbd_change_state(device, CS_VERBOSE, mask, val); in receive_req_state()
4002 drbd_md_sync(device); in receive_req_state()
4034 struct drbd_device *device; in receive_state() local
4044 device = peer_device->device; in receive_state()
4050 real_peer_disk = device->p_uuid[UI_FLAGS] & 4 ? D_INCONSISTENT : D_CONSISTENT; in receive_state()
4051 drbd_info(device, "real peer disk state = %s\n", drbd_disk_str(real_peer_disk)); in receive_state()
4054 spin_lock_irq(&device->resource->req_lock); in receive_state()
4056 os = ns = drbd_read_state(device); in receive_state()
4057 spin_unlock_irq(&device->resource->req_lock); in receive_state()
4089 if (drbd_bm_total_weight(device) <= device->rs_failed) in receive_state()
4090 drbd_resync_finished(device); in receive_state()
4098 ov_out_of_sync_print(device); in receive_state()
4099 drbd_resync_finished(device); in receive_state()
4118 if (device->p_uuid && peer_state.disk >= D_NEGOTIATING && in receive_state()
4119 get_ldev_if_state(device, D_NEGOTIATING)) { in receive_state()
4131 cr |= test_bit(CONSIDER_RESYNC, &device->flags); in receive_state()
4141 put_ldev(device); in receive_state()
4144 if (device->state.disk == D_NEGOTIATING) { in receive_state()
4145 drbd_force_state(device, NS(disk, D_FAILED)); in receive_state()
4147 drbd_err(device, "Disk attach process on the peer node was aborted.\n"); in receive_state()
4153 D_ASSERT(device, os.conn == C_WF_REPORT_PARAMS); in receive_state()
4160 spin_lock_irq(&device->resource->req_lock); in receive_state()
4161 if (os.i != drbd_read_state(device).i) in receive_state()
4163 clear_bit(CONSIDER_RESYNC, &device->flags); in receive_state()
4168 ns.disk = device->new_state_tmp.disk; in receive_state()
4170 …if (ns.pdsk == D_CONSISTENT && drbd_suspended(device) && ns.conn == C_CONNECTED && os.conn < C_CON… in receive_state()
4171 test_bit(NEW_CUR_UUID, &device->flags)) { in receive_state()
4174 spin_unlock_irq(&device->resource->req_lock); in receive_state()
4175 drbd_err(device, "Aborting Connect, can not thaw IO with an only Consistent peer\n"); in receive_state()
4177 drbd_uuid_new_current(device); in receive_state()
4178 clear_bit(NEW_CUR_UUID, &device->flags); in receive_state()
4182 rv = _drbd_set_state(device, ns, cs_flags, NULL); in receive_state()
4183 ns = drbd_read_state(device); in receive_state()
4184 spin_unlock_irq(&device->resource->req_lock); in receive_state()
4202 clear_bit(DISCARD_MY_DATA, &device->flags); in receive_state()
4204 drbd_md_sync(device); /* update connected indicator, la_size_sect, ... */ in receive_state()
4212 struct drbd_device *device; in receive_sync_uuid() local
4218 device = peer_device->device; in receive_sync_uuid()
4220 wait_event(device->misc_wait, in receive_sync_uuid()
4221 device->state.conn == C_WF_SYNC_UUID || in receive_sync_uuid()
4222 device->state.conn == C_BEHIND || in receive_sync_uuid()
4223 device->state.conn < C_CONNECTED || in receive_sync_uuid()
4224 device->state.disk < D_NEGOTIATING); in receive_sync_uuid()
4230 if (get_ldev_if_state(device, D_NEGOTIATING)) { in receive_sync_uuid()
4231 _drbd_uuid_set(device, UI_CURRENT, be64_to_cpu(p->uuid)); in receive_sync_uuid()
4232 _drbd_uuid_set(device, UI_BITMAP, 0UL); in receive_sync_uuid()
4234 drbd_print_uuids(device, "updated sync uuid"); in receive_sync_uuid()
4235 drbd_start_resync(device, C_SYNC_TARGET); in receive_sync_uuid()
4237 put_ldev(device); in receive_sync_uuid()
4239 drbd_err(device, "Ignoring SyncUUID packet!\n"); in receive_sync_uuid()
4271 drbd_bm_merge_lel(peer_device->device, c->word_offset, num_words, p); in receive_bitmap_plain()
4335 _drbd_bm_set_bits(peer_device->device, s, e); in recv_bm_rle_bits()
4389 void INFO_bm_xfer_stats(struct drbd_device *device, in INFO_bm_xfer_stats() argument
4393 unsigned int header_size = drbd_header_size(first_peer_device(device)->connection); in INFO_bm_xfer_stats()
4417 drbd_info(device, "%s bitmap stats [Bytes(packets)]: plain %u(%u), RLE %u(%u), " in INFO_bm_xfer_stats()
4436 struct drbd_device *device; in receive_bitmap() local
4443 device = peer_device->device; in receive_bitmap()
4445 drbd_bm_lock(device, "receive bitmap", BM_LOCKED_SET_ALLOWED); in receive_bitmap()
4450 .bm_bits = drbd_bm_bits(device), in receive_bitmap()
4451 .bm_words = drbd_bm_words(device), in receive_bitmap()
4463 drbd_err(device, "ReportCBitmap packet too large\n"); in receive_bitmap()
4468 drbd_err(device, "ReportCBitmap packet too small (l:%u)\n", pi->size); in receive_bitmap()
4477 …drbd_warn(device, "receive_bitmap: cmd neither ReportBitMap nor ReportCBitMap (is 0x%x)", pi->cmd); in receive_bitmap()
4495 INFO_bm_xfer_stats(device, "receive", &c); in receive_bitmap()
4497 if (device->state.conn == C_WF_BITMAP_T) { in receive_bitmap()
4500 err = drbd_send_bitmap(device); in receive_bitmap()
4504 rv = _drbd_request_state(device, NS(conn, C_WF_SYNC_UUID), CS_VERBOSE); in receive_bitmap()
4505 D_ASSERT(device, rv == SS_SUCCESS); in receive_bitmap()
4506 } else if (device->state.conn != C_WF_BITMAP_S) { in receive_bitmap()
4509 drbd_info(device, "unexpected cstate (%s) in receive_bitmap\n", in receive_bitmap()
4510 drbd_conn_str(device->state.conn)); in receive_bitmap()
4515 drbd_bm_unlock(device); in receive_bitmap()
4516 if (!err && device->state.conn == C_WF_BITMAP_S) in receive_bitmap()
4517 drbd_start_resync(device, C_SYNC_SOURCE); in receive_bitmap()
4541 struct drbd_device *device; in receive_out_of_sync() local
4547 device = peer_device->device; in receive_out_of_sync()
4549 switch (device->state.conn) { in receive_out_of_sync()
4555 drbd_err(device, "ASSERT FAILED cstate = %s, expected: WFSyncUUID|WFBitMapT|Behind\n", in receive_out_of_sync()
4556 drbd_conn_str(device->state.conn)); in receive_out_of_sync()
4559 drbd_set_out_of_sync(device, be64_to_cpu(p->sector), be32_to_cpu(p->blksize)); in receive_out_of_sync()
4670 struct drbd_device *device = peer_device->device; in conn_disconnect() local
4671 kref_get(&device->kref); in conn_disconnect()
4674 kref_put(&device->kref, drbd_destroy_device); in conn_disconnect()
4703 struct drbd_device *device = peer_device->device; in drbd_disconnected() local
4707 spin_lock_irq(&device->resource->req_lock); in drbd_disconnected()
4708 _drbd_wait_ee_list_empty(device, &device->active_ee); in drbd_disconnected()
4709 _drbd_wait_ee_list_empty(device, &device->sync_ee); in drbd_disconnected()
4710 _drbd_wait_ee_list_empty(device, &device->read_ee); in drbd_disconnected()
4711 spin_unlock_irq(&device->resource->req_lock); in drbd_disconnected()
4723 drbd_rs_cancel_all(device); in drbd_disconnected()
4724 device->rs_total = 0; in drbd_disconnected()
4725 device->rs_failed = 0; in drbd_disconnected()
4726 atomic_set(&device->rs_pending_cnt, 0); in drbd_disconnected()
4727 wake_up(&device->misc_wait); in drbd_disconnected()
4729 del_timer_sync(&device->resync_timer); in drbd_disconnected()
4730 resync_timer_fn((unsigned long)device); in drbd_disconnected()
4737 drbd_finish_peer_reqs(device); in drbd_disconnected()
4746 drbd_rs_cancel_all(device); in drbd_disconnected()
4748 kfree(device->p_uuid); in drbd_disconnected()
4749 device->p_uuid = NULL; in drbd_disconnected()
4751 if (!drbd_suspended(device)) in drbd_disconnected()
4754 drbd_md_sync(device); in drbd_disconnected()
4758 wait_event(device->misc_wait, !test_bit(BITMAP_IO, &device->flags)); in drbd_disconnected()
4767 i = drbd_free_peer_reqs(device, &device->net_ee); in drbd_disconnected()
4769 drbd_info(device, "net_ee not empty, killed %u entries\n", i); in drbd_disconnected()
4770 i = atomic_read(&device->pp_in_use_by_net); in drbd_disconnected()
4772 drbd_info(device, "pp_in_use_by_net = %d, expected 0\n", i); in drbd_disconnected()
4773 i = atomic_read(&device->pp_in_use); in drbd_disconnected()
4775 drbd_info(device, "pp_in_use = %d, expected 0\n", i); in drbd_disconnected()
4777 D_ASSERT(device, list_empty(&device->read_ee)); in drbd_disconnected()
4778 D_ASSERT(device, list_empty(&device->active_ee)); in drbd_disconnected()
4779 D_ASSERT(device, list_empty(&device->sync_ee)); in drbd_disconnected()
4780 D_ASSERT(device, list_empty(&device->done_ee)); in drbd_disconnected()
5119 struct drbd_device *device; in got_RqSReply() local
5126 device = peer_device->device; in got_RqSReply()
5129 D_ASSERT(device, connection->agreed_pro_version < 100); in got_RqSReply()
5134 set_bit(CL_ST_CHG_SUCCESS, &device->flags); in got_RqSReply()
5136 set_bit(CL_ST_CHG_FAIL, &device->flags); in got_RqSReply()
5137 drbd_err(device, "Requested state change failed by peer: %s (%d)\n", in got_RqSReply()
5140 wake_up(&device->state_wait); in got_RqSReply()
5164 struct drbd_device *device; in got_IsInSync() local
5172 device = peer_device->device; in got_IsInSync()
5174 D_ASSERT(device, peer_device->connection->agreed_pro_version >= 89); in got_IsInSync()
5178 if (get_ldev(device)) { in got_IsInSync()
5179 drbd_rs_complete_io(device, sector); in got_IsInSync()
5180 drbd_set_in_sync(device, sector, blksize); in got_IsInSync()
5182 device->rs_same_csum += (blksize >> BM_BLOCK_SHIFT); in got_IsInSync()
5183 put_ldev(device); in got_IsInSync()
5185 dec_rs_pending(device); in got_IsInSync()
5186 atomic_add(blksize >> 9, &device->rs_sect_in); in got_IsInSync()
5192 validate_req_change_req_state(struct drbd_device *device, u64 id, sector_t sector, in validate_req_change_req_state() argument
5199 spin_lock_irq(&device->resource->req_lock); in validate_req_change_req_state()
5200 req = find_request(device, root, id, sector, missing_ok, func); in validate_req_change_req_state()
5202 spin_unlock_irq(&device->resource->req_lock); in validate_req_change_req_state()
5206 spin_unlock_irq(&device->resource->req_lock); in validate_req_change_req_state()
5209 complete_master_bio(device, &m); in validate_req_change_req_state()
5216 struct drbd_device *device; in got_BlockAck() local
5225 device = peer_device->device; in got_BlockAck()
5230 drbd_set_in_sync(device, sector, blksize); in got_BlockAck()
5231 dec_rs_pending(device); in got_BlockAck()
5254 return validate_req_change_req_state(device, p->block_id, sector, in got_BlockAck()
5255 &device->write_requests, __func__, in got_BlockAck()
5262 struct drbd_device *device; in got_NegAck() local
5271 device = peer_device->device; in got_NegAck()
5276 dec_rs_pending(device); in got_NegAck()
5277 drbd_rs_failed_io(device, sector, size); in got_NegAck()
5281 err = validate_req_change_req_state(device, p->block_id, sector, in got_NegAck()
5282 &device->write_requests, __func__, in got_NegAck()
5290 drbd_set_out_of_sync(device, sector, size); in got_NegAck()
5298 struct drbd_device *device; in got_NegDReply() local
5305 device = peer_device->device; in got_NegDReply()
5309 drbd_err(device, "Got NegDReply; Sector %llus, len %u.\n", in got_NegDReply()
5312 return validate_req_change_req_state(device, p->block_id, sector, in got_NegDReply()
5313 &device->read_requests, __func__, in got_NegDReply()
5320 struct drbd_device *device; in got_NegRSDReply() local
5328 device = peer_device->device; in got_NegRSDReply()
5335 dec_rs_pending(device); in got_NegRSDReply()
5337 if (get_ldev_if_state(device, D_FAILED)) { in got_NegRSDReply()
5338 drbd_rs_complete_io(device, sector); in got_NegRSDReply()
5341 drbd_rs_failed_io(device, sector, size); in got_NegRSDReply()
5347 put_ldev(device); in got_NegRSDReply()
5363 struct drbd_device *device = peer_device->device; in got_BarrierAck() local
5365 if (device->state.conn == C_AHEAD && in got_BarrierAck()
5366 atomic_read(&device->ap_in_flight) == 0 && in got_BarrierAck()
5367 !test_and_set_bit(AHEAD_TO_SYNC_SOURCE, &device->flags)) { in got_BarrierAck()
5368 device->start_resync_timer.expires = jiffies + HZ; in got_BarrierAck()
5369 add_timer(&device->start_resync_timer); in got_BarrierAck()
5380 struct drbd_device *device; in got_OVResult() local
5389 device = peer_device->device; in got_OVResult()
5397 drbd_ov_out_of_sync_found(device, sector, size); in got_OVResult()
5399 ov_out_of_sync_print(device); in got_OVResult()
5401 if (!get_ldev(device)) in got_OVResult()
5404 drbd_rs_complete_io(device, sector); in got_OVResult()
5405 dec_rs_pending(device); in got_OVResult()
5407 --device->ov_left; in got_OVResult()
5410 if ((device->ov_left & 0x200) == 0x200) in got_OVResult()
5411 drbd_advance_rs_marks(device, device->ov_left); in got_OVResult()
5413 if (device->ov_left == 0) { in got_OVResult()
5417 dw->device = device; in got_OVResult()
5420 drbd_err(device, "kmalloc(dw) failed."); in got_OVResult()
5421 ov_out_of_sync_print(device); in got_OVResult()
5422 drbd_resync_finished(device); in got_OVResult()
5425 put_ldev(device); in got_OVResult()
5445 struct drbd_device *device = peer_device->device; in connection_finish_peer_reqs() local
5446 kref_get(&device->kref); in connection_finish_peer_reqs()
5448 if (drbd_finish_peer_reqs(device)) { in connection_finish_peer_reqs()
5449 kref_put(&device->kref, drbd_destroy_device); in connection_finish_peer_reqs()
5452 kref_put(&device->kref, drbd_destroy_device); in connection_finish_peer_reqs()
5459 struct drbd_device *device = peer_device->device; in connection_finish_peer_reqs() local
5460 not_empty = !list_empty(&device->done_ee); in connection_finish_peer_reqs()