Commit c5a2c150 authored by Lars Ellenberg's avatar Lars Ellenberg Committed by Philipp Reisner

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: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent 21ae5d7f
...@@ -362,17 +362,14 @@ drbd_alloc_peer_req(struct drbd_peer_device *peer_device, u64 id, sector_t secto ...@@ -362,17 +362,14 @@ drbd_alloc_peer_req(struct drbd_peer_device *peer_device, u64 id, sector_t secto
goto fail; goto fail;
} }
memset(peer_req, 0, sizeof(*peer_req));
INIT_LIST_HEAD(&peer_req->w.list);
drbd_clear_interval(&peer_req->i); drbd_clear_interval(&peer_req->i);
peer_req->i.size = data_size; peer_req->i.size = data_size;
peer_req->i.sector = sector; peer_req->i.sector = sector;
peer_req->i.local = false; peer_req->submit_jif = jiffies;
peer_req->i.waiting = false;
peer_req->epoch = NULL;
peer_req->peer_device = peer_device; peer_req->peer_device = peer_device;
peer_req->pages = page; 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 * The block_id is opaque to the receiver. It is not endianness
* converted, and sent back to the sender unchanged. * converted, and sent back to the sender unchanged.
...@@ -2668,6 +2665,15 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet ...@@ -2668,6 +2665,15 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet
* we would also throttle its application reads. * we would also throttle its application reads.
* In that case, throttling is done on the SyncTarget only. * 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 if (device->state.peer != R_PRIMARY
&& drbd_rs_should_slow_down(device, sector, false)) && drbd_rs_should_slow_down(device, sector, false))
schedule_timeout_uninterruptible(HZ/10); schedule_timeout_uninterruptible(HZ/10);
...@@ -2679,21 +2685,18 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet ...@@ -2679,21 +2685,18 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet
submit: submit:
inc_unacked(device); 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) if (drbd_submit_peer_request(device, peer_req, READ, fault_type) == 0)
return 0; return 0;
/* don't care for the reason here */ /* don't care for the reason here */
drbd_err(device, "submit failed, triggering re-connect\n"); drbd_err(device, "submit failed, triggering re-connect\n");
out_free_e:
spin_lock_irq(&device->resource->req_lock); spin_lock_irq(&device->resource->req_lock);
list_del(&peer_req->w.list); list_del(&peer_req->w.list);
spin_unlock_irq(&device->resource->req_lock); spin_unlock_irq(&device->resource->req_lock);
/* no drbd_rs_complete_io(), we are dropping the connection anyways */ /* no drbd_rs_complete_io(), we are dropping the connection anyways */
out_free_e:
put_ldev(device); put_ldev(device);
drbd_free_peer_req(device, peer_req); drbd_free_peer_req(device, peer_req);
return -EIO; return -EIO;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment