Lines Matching refs:peer_req
181 struct drbd_peer_request *peer_req; in drbd_alloc_peer_req() local
188 peer_req = mempool_alloc(&drbd_ee_mempool, gfp_mask & ~__GFP_HIGHMEM); in drbd_alloc_peer_req()
189 if (!peer_req) { in drbd_alloc_peer_req()
201 peer_req->flags |= EE_RELEASE_TO_MEMPOOL; in drbd_alloc_peer_req()
204 memset(peer_req, 0, sizeof(*peer_req)); in drbd_alloc_peer_req()
205 INIT_LIST_HEAD(&peer_req->w.list); in drbd_alloc_peer_req()
206 drbd_clear_interval(&peer_req->i); in drbd_alloc_peer_req()
207 peer_req->i.size = request_size; in drbd_alloc_peer_req()
208 peer_req->i.sector = sector; in drbd_alloc_peer_req()
209 peer_req->submit_jif = jiffies; in drbd_alloc_peer_req()
210 peer_req->peer_device = peer_device; in drbd_alloc_peer_req()
211 peer_req->pages = page; in drbd_alloc_peer_req()
216 peer_req->block_id = id; in drbd_alloc_peer_req()
218 return peer_req; in drbd_alloc_peer_req()
221 mempool_free(peer_req, &drbd_ee_mempool); in drbd_alloc_peer_req()
225 void drbd_free_peer_req(struct drbd_device *device, struct drbd_peer_request *peer_req) in drbd_free_peer_req() argument
228 if (peer_req->flags & EE_HAS_DIGEST) in drbd_free_peer_req()
229 kfree(peer_req->digest); in drbd_free_peer_req()
230 drbd_free_pages(device, peer_req->pages); in drbd_free_peer_req()
231 D_ASSERT(device, atomic_read(&peer_req->pending_bios) == 0); in drbd_free_peer_req()
232 D_ASSERT(device, drbd_interval_empty(&peer_req->i)); in drbd_free_peer_req()
233 if (!expect(device, !(peer_req->flags & EE_CALL_AL_COMPLETE_IO))) { in drbd_free_peer_req()
234 peer_req->flags &= ~EE_CALL_AL_COMPLETE_IO; in drbd_free_peer_req()
235 drbd_al_complete_io(device, &peer_req->i); in drbd_free_peer_req()
237 mempool_free(peer_req, &drbd_ee_mempool); in drbd_free_peer_req()
243 struct drbd_peer_request *peer_req, *t; in drbd_free_peer_reqs() local
250 list_for_each_entry_safe(peer_req, t, &work_list, w.list) { in drbd_free_peer_reqs()
251 drbd_free_peer_req(device, peer_req); in drbd_free_peer_reqs()
263 struct drbd_peer_request *peer_req, *t; in drbd_finish_peer_reqs() local
274 list_for_each_entry_safe(peer_req, t, &work_list, w.list) { in drbd_finish_peer_reqs()
278 err2 = peer_req->w.cb(&peer_req->w, !!err); in drbd_finish_peer_reqs()
281 drbd_free_peer_req(device, peer_req); in drbd_finish_peer_reqs()
1405 …drbd_issue_peer_discard_or_zero_out(struct drbd_device *device, struct drbd_peer_request *peer_req) in drbd_issue_peer_discard_or_zero_out() argument
1412 peer_req->flags |= EE_ZEROOUT; in drbd_issue_peer_discard_or_zero_out()
1414 if (drbd_issue_discard_or_zero_out(device, peer_req->i.sector, in drbd_issue_peer_discard_or_zero_out()
1415 peer_req->i.size >> 9, peer_req->flags & (EE_ZEROOUT|EE_TRIM))) in drbd_issue_peer_discard_or_zero_out()
1416 peer_req->flags |= EE_WAS_ERROR; in drbd_issue_peer_discard_or_zero_out()
1417 drbd_endio_write_sec_final(peer_req); in drbd_issue_peer_discard_or_zero_out()
1420 static int peer_request_fault_type(struct drbd_peer_request *peer_req) in peer_request_fault_type() argument
1422 if (peer_req_op(peer_req) == REQ_OP_READ) { in peer_request_fault_type()
1423 return peer_req->flags & EE_APPLICATION ? in peer_request_fault_type()
1426 return peer_req->flags & EE_APPLICATION ? in peer_request_fault_type()
1446 int drbd_submit_peer_request(struct drbd_peer_request *peer_req) in drbd_submit_peer_request() argument
1448 struct drbd_device *device = peer_req->peer_device->device; in drbd_submit_peer_request()
1451 struct page *page = peer_req->pages; in drbd_submit_peer_request()
1452 sector_t sector = peer_req->i.sector; in drbd_submit_peer_request()
1453 unsigned int data_size = peer_req->i.size; in drbd_submit_peer_request()
1463 if (peer_req->flags & (EE_TRIM | EE_ZEROOUT)) { in drbd_submit_peer_request()
1466 conn_wait_active_ee_empty(peer_req->peer_device->connection); in drbd_submit_peer_request()
1469 peer_req->submit_jif = jiffies; in drbd_submit_peer_request()
1470 peer_req->flags |= EE_SUBMITTED; in drbd_submit_peer_request()
1474 if (list_empty(&peer_req->w.list)) { in drbd_submit_peer_request()
1476 list_add_tail(&peer_req->w.list, &device->active_ee); in drbd_submit_peer_request()
1480 drbd_issue_peer_discard_or_zero_out(device, peer_req); in drbd_submit_peer_request()
1498 if (!(peer_req_op(peer_req) == REQ_OP_WRITE || in drbd_submit_peer_request()
1499 peer_req_op(peer_req) == REQ_OP_READ)) { in drbd_submit_peer_request()
1500 drbd_err(device, "Invalid bio op received: 0x%x\n", peer_req->opf); in drbd_submit_peer_request()
1504 bio = bio_alloc(device->ldev->backing_bdev, nr_pages, peer_req->opf, GFP_NOIO); in drbd_submit_peer_request()
1507 bio->bi_private = peer_req; in drbd_submit_peer_request()
1525 atomic_set(&peer_req->pending_bios, n_bios); in drbd_submit_peer_request()
1527 peer_req->submit_jif = jiffies; in drbd_submit_peer_request()
1528 peer_req->flags |= EE_SUBMITTED; in drbd_submit_peer_request()
1534 drbd_submit_bio_noacct(device, peer_request_fault_type(peer_req), bio); in drbd_submit_peer_request()
1540 struct drbd_peer_request *peer_req) in drbd_remove_epoch_entry_interval() argument
1542 struct drbd_interval *i = &peer_req->i; in drbd_remove_epoch_entry_interval()
1664 struct drbd_peer_request *peer_req; in read_in_block() local
1720 peer_req = drbd_alloc_peer_req(peer_device, id, sector, ds, data_size, GFP_NOIO); in read_in_block()
1721 if (!peer_req) in read_in_block()
1724 peer_req->flags |= EE_WRITE; in read_in_block()
1726 peer_req->flags |= EE_TRIM; in read_in_block()
1727 return peer_req; in read_in_block()
1730 peer_req->flags |= EE_ZEROOUT; in read_in_block()
1731 return peer_req; in read_in_block()
1736 page = peer_req->pages; in read_in_block()
1747 drbd_free_peer_req(device, peer_req); in read_in_block()
1754 drbd_csum_ee_size(peer_device->connection->peer_integrity_tfm, peer_req, dig_vv, data_size); in read_in_block()
1758 drbd_free_peer_req(device, peer_req); in read_in_block()
1763 return peer_req; in read_in_block()
1848 struct drbd_peer_request *peer_req = in e_end_resync_block() local
1850 struct drbd_peer_device *peer_device = peer_req->peer_device; in e_end_resync_block()
1852 sector_t sector = peer_req->i.sector; in e_end_resync_block()
1855 D_ASSERT(device, drbd_interval_empty(&peer_req->i)); in e_end_resync_block()
1857 if (likely((peer_req->flags & EE_WAS_ERROR) == 0)) { in e_end_resync_block()
1858 drbd_set_in_sync(peer_device, sector, peer_req->i.size); in e_end_resync_block()
1859 err = drbd_send_ack(peer_device, P_RS_WRITE_ACK, peer_req); in e_end_resync_block()
1862 drbd_rs_failed_io(peer_device, sector, peer_req->i.size); in e_end_resync_block()
1864 err = drbd_send_ack(peer_device, P_NEG_ACK, peer_req); in e_end_resync_block()
1875 struct drbd_peer_request *peer_req; in recv_resync_read() local
1877 peer_req = read_in_block(peer_device, ID_SYNCER, sector, pi); in recv_resync_read()
1878 if (!peer_req) in recv_resync_read()
1887 peer_req->w.cb = e_end_resync_block; in recv_resync_read()
1888 peer_req->opf = REQ_OP_WRITE; in recv_resync_read()
1889 peer_req->submit_jif = jiffies; in recv_resync_read()
1892 list_add_tail(&peer_req->w.list, &device->sync_ee); in recv_resync_read()
1896 if (drbd_submit_peer_request(peer_req) == 0) in recv_resync_read()
1902 list_del(&peer_req->w.list); in recv_resync_read()
1905 drbd_free_peer_req(device, peer_req); in recv_resync_read()
2019 struct drbd_peer_request *peer_req = in e_end_block() local
2021 struct drbd_peer_device *peer_device = peer_req->peer_device; in e_end_block()
2023 sector_t sector = peer_req->i.sector; in e_end_block()
2026 if (peer_req->flags & EE_SEND_WRITE_ACK) { in e_end_block()
2027 if (likely((peer_req->flags & EE_WAS_ERROR) == 0)) { in e_end_block()
2030 peer_req->flags & EE_MAY_SET_IN_SYNC) ? in e_end_block()
2032 err = drbd_send_ack(peer_device, pcmd, peer_req); in e_end_block()
2034 drbd_set_in_sync(peer_device, sector, peer_req->i.size); in e_end_block()
2036 err = drbd_send_ack(peer_device, P_NEG_ACK, peer_req); in e_end_block()
2045 if (peer_req->flags & EE_IN_INTERVAL_TREE) { in e_end_block()
2047 D_ASSERT(device, !drbd_interval_empty(&peer_req->i)); in e_end_block()
2048 drbd_remove_epoch_entry_interval(device, peer_req); in e_end_block()
2049 if (peer_req->flags & EE_RESTART_REQUESTS) in e_end_block()
2050 restart_conflicting_writes(device, sector, peer_req->i.size); in e_end_block()
2053 D_ASSERT(device, drbd_interval_empty(&peer_req->i)); in e_end_block()
2055 …drbd_may_finish_epoch(peer_device->connection, peer_req->epoch, EV_PUT + (cancel ? EV_CLEANUP : 0)… in e_end_block()
2062 struct drbd_peer_request *peer_req = in e_send_ack() local
2064 struct drbd_peer_device *peer_device = peer_req->peer_device; in e_send_ack()
2067 err = drbd_send_ack(peer_device, ack, peer_req); in e_send_ack()
2080 struct drbd_peer_request *peer_req = in e_send_retry_write() local
2082 struct drbd_connection *connection = peer_req->peer_device->connection; in e_send_retry_write()
2125 static bool overlapping_resync_write(struct drbd_device *device, struct drbd_peer_request *peer_req) in overlapping_resync_write() argument
2132 if (overlaps(peer_req->i.sector, peer_req->i.size, in overlapping_resync_write()
2258 struct drbd_peer_request *peer_req) in handle_write_conflicts() argument
2260 struct drbd_connection *connection = peer_req->peer_device->connection; in handle_write_conflicts()
2262 sector_t sector = peer_req->i.sector; in handle_write_conflicts()
2263 const unsigned int size = peer_req->i.size; in handle_write_conflicts()
2272 drbd_insert_interval(&device->write_requests, &peer_req->i); in handle_write_conflicts()
2276 if (i == &peer_req->i) in handle_write_conflicts()
2312 peer_req->w.cb = superseded ? e_send_superseded : in handle_write_conflicts()
2314 list_add_tail(&peer_req->w.list, &device->done_ee); in handle_write_conflicts()
2318 &peer_req->peer_device->send_acks_work)) in handle_write_conflicts()
2358 peer_req->flags |= EE_RESTART_REQUESTS; in handle_write_conflicts()
2365 drbd_remove_epoch_entry_interval(device, peer_req); in handle_write_conflicts()
2376 struct drbd_peer_request *peer_req; in receive_Data() local
2406 peer_req = read_in_block(peer_device, p->block_id, sector, pi); in receive_Data()
2407 if (!peer_req) { in receive_Data()
2412 peer_req->w.cb = e_end_block; in receive_Data()
2413 peer_req->submit_jif = jiffies; in receive_Data()
2414 peer_req->flags |= EE_APPLICATION; in receive_Data()
2417 peer_req->opf = wire_flags_to_bio(connection, dp_flags); in receive_Data()
2419 D_ASSERT(peer_device, peer_req->i.size > 0); in receive_Data()
2420 D_ASSERT(peer_device, peer_req_op(peer_req) == REQ_OP_DISCARD); in receive_Data()
2421 D_ASSERT(peer_device, peer_req->pages == NULL); in receive_Data()
2425 peer_req->flags |= EE_ZEROOUT; in receive_Data()
2427 D_ASSERT(peer_device, peer_req->i.size > 0); in receive_Data()
2428 D_ASSERT(peer_device, peer_req_op(peer_req) == REQ_OP_WRITE_ZEROES); in receive_Data()
2429 D_ASSERT(peer_device, peer_req->pages == NULL); in receive_Data()
2432 peer_req->flags |= EE_TRIM; in receive_Data()
2433 } else if (peer_req->pages == NULL) { in receive_Data()
2434 D_ASSERT(device, peer_req->i.size == 0); in receive_Data()
2439 peer_req->flags |= EE_MAY_SET_IN_SYNC; in receive_Data()
2442 peer_req->epoch = connection->current_epoch; in receive_Data()
2443 atomic_inc(&peer_req->epoch->epoch_size); in receive_Data()
2444 atomic_inc(&peer_req->epoch->active); in receive_Data()
2463 peer_req->flags |= EE_SEND_WRITE_ACK; in receive_Data()
2472 drbd_send_ack(peer_device, P_RECV_ACK, peer_req); in receive_Data()
2478 peer_req->flags |= EE_IN_INTERVAL_TREE; in receive_Data()
2483 err = handle_write_conflicts(device, peer_req); in receive_Data()
2500 if ((peer_req->flags & (EE_TRIM | EE_ZEROOUT)) == 0) in receive_Data()
2501 list_add_tail(&peer_req->w.list, &device->active_ee); in receive_Data()
2505 wait_event(device->ee_wait, !overlapping_resync_write(device, peer_req)); in receive_Data()
2509 drbd_set_out_of_sync(peer_device, peer_req->i.sector, peer_req->i.size); in receive_Data()
2510 peer_req->flags &= ~EE_MAY_SET_IN_SYNC; in receive_Data()
2511 drbd_al_begin_io(device, &peer_req->i); in receive_Data()
2512 peer_req->flags |= EE_CALL_AL_COMPLETE_IO; in receive_Data()
2515 err = drbd_submit_peer_request(peer_req); in receive_Data()
2522 list_del(&peer_req->w.list); in receive_Data()
2523 drbd_remove_epoch_entry_interval(device, peer_req); in receive_Data()
2525 if (peer_req->flags & EE_CALL_AL_COMPLETE_IO) { in receive_Data()
2526 peer_req->flags &= ~EE_CALL_AL_COMPLETE_IO; in receive_Data()
2527 drbd_al_complete_io(device, &peer_req->i); in receive_Data()
2531 drbd_may_finish_epoch(connection, peer_req->epoch, EV_PUT | EV_CLEANUP); in receive_Data()
2533 drbd_free_peer_req(device, peer_req); in receive_Data()
2624 struct drbd_peer_request *peer_req; in receive_DataRequest() local
2680 peer_req = drbd_alloc_peer_req(peer_device, p->block_id, sector, size, in receive_DataRequest()
2682 if (!peer_req) { in receive_DataRequest()
2686 peer_req->opf = REQ_OP_READ; in receive_DataRequest()
2690 peer_req->w.cb = w_e_end_data_req; in receive_DataRequest()
2692 peer_req->flags |= EE_APPLICATION; in receive_DataRequest()
2700 peer_req->flags |= EE_RS_THIN_REQ; in receive_DataRequest()
2703 peer_req->w.cb = w_e_end_rsdata_req; in receive_DataRequest()
2717 peer_req->digest = di; in receive_DataRequest()
2718 peer_req->flags |= EE_HAS_DIGEST; in receive_DataRequest()
2725 peer_req->w.cb = w_e_end_csum_rs_req; in receive_DataRequest()
2733 peer_req->w.cb = w_e_end_ov_reply; in receive_DataRequest()
2757 peer_req->w.cb = w_e_end_ov_req; in receive_DataRequest()
2792 list_add_tail(&peer_req->w.list, &device->read_ee); in receive_DataRequest()
2809 if (drbd_submit_peer_request(peer_req) == 0) in receive_DataRequest()
2817 list_del(&peer_req->w.list); in receive_DataRequest()
2822 drbd_free_peer_req(device, peer_req); in receive_DataRequest()
4780 struct drbd_peer_request *peer_req; in receive_rs_deallocated() local
4782 peer_req = drbd_alloc_peer_req(peer_device, ID_SYNCER, sector, in receive_rs_deallocated()
4784 if (!peer_req) { in receive_rs_deallocated()
4789 peer_req->w.cb = e_end_resync_block; in receive_rs_deallocated()
4790 peer_req->opf = REQ_OP_DISCARD; in receive_rs_deallocated()
4791 peer_req->submit_jif = jiffies; in receive_rs_deallocated()
4792 peer_req->flags |= EE_TRIM; in receive_rs_deallocated()
4795 list_add_tail(&peer_req->w.list, &device->sync_ee); in receive_rs_deallocated()
4799 err = drbd_submit_peer_request(peer_req); in receive_rs_deallocated()
4803 list_del(&peer_req->w.list); in receive_rs_deallocated()
4806 drbd_free_peer_req(device, peer_req); in receive_rs_deallocated()