drbd: register peer requests on read_ee early
Initialize peer_request with timestamp and proper empty list head. Add peer_request to list early, so debugfs can find this request and report it as "preparing", even if we sleep before we actually submit it. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
21ae5d7f95
commit
c5a2c1509e
1 changed files with 14 additions and 11 deletions
|
@ -362,17 +362,14 @@ drbd_alloc_peer_req(struct drbd_peer_device *peer_device, u64 id, sector_t secto
|
|||
goto fail;
|
||||
}
|
||||
|
||||
memset(peer_req, 0, sizeof(*peer_req));
|
||||
INIT_LIST_HEAD(&peer_req->w.list);
|
||||
drbd_clear_interval(&peer_req->i);
|
||||
peer_req->i.size = data_size;
|
||||
peer_req->i.sector = sector;
|
||||
peer_req->i.local = false;
|
||||
peer_req->i.waiting = false;
|
||||
|
||||
peer_req->epoch = NULL;
|
||||
peer_req->submit_jif = jiffies;
|
||||
peer_req->peer_device = peer_device;
|
||||
peer_req->pages = page;
|
||||
atomic_set(&peer_req->pending_bios, 0);
|
||||
peer_req->flags = 0;
|
||||
/*
|
||||
* The block_id is opaque to the receiver. It is not endianness
|
||||
* converted, and sent back to the sender unchanged.
|
||||
|
@ -2668,6 +2665,15 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet
|
|||
* we would also throttle its application reads.
|
||||
* In that case, throttling is done on the SyncTarget only.
|
||||
*/
|
||||
|
||||
/* Even though this may be a resync request, we do add to "read_ee";
|
||||
* "sync_ee" is only used for resync WRITEs.
|
||||
* Add to list early, so debugfs can find this request
|
||||
* even if we have to sleep below. */
|
||||
spin_lock_irq(&device->resource->req_lock);
|
||||
list_add_tail(&peer_req->w.list, &device->read_ee);
|
||||
spin_unlock_irq(&device->resource->req_lock);
|
||||
|
||||
if (device->state.peer != R_PRIMARY
|
||||
&& drbd_rs_should_slow_down(device, sector, false))
|
||||
schedule_timeout_uninterruptible(HZ/10);
|
||||
|
@ -2679,21 +2685,18 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet
|
|||
|
||||
submit:
|
||||
inc_unacked(device);
|
||||
spin_lock_irq(&device->resource->req_lock);
|
||||
list_add_tail(&peer_req->w.list, &device->read_ee);
|
||||
spin_unlock_irq(&device->resource->req_lock);
|
||||
|
||||
if (drbd_submit_peer_request(device, peer_req, READ, fault_type) == 0)
|
||||
return 0;
|
||||
|
||||
/* don't care for the reason here */
|
||||
drbd_err(device, "submit failed, triggering re-connect\n");
|
||||
|
||||
out_free_e:
|
||||
spin_lock_irq(&device->resource->req_lock);
|
||||
list_del(&peer_req->w.list);
|
||||
spin_unlock_irq(&device->resource->req_lock);
|
||||
/* no drbd_rs_complete_io(), we are dropping the connection anyways */
|
||||
|
||||
out_free_e:
|
||||
put_ldev(device);
|
||||
drbd_free_peer_req(device, peer_req);
|
||||
return -EIO;
|
||||
|
|
Loading…
Reference in a new issue