mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-22 09:54:43 +07:00
drbd: differentiate early and later "postponing" of requests
We use the RQ_POSTPONED flag to mark a request for several reasons. It may be a conflicting request in a dual-primary setup, where conflict detection and resolution on the peer decided that this request needs to be re-submitted, it needs to re-enter drbd_make_request() to fix the data divergence caused by these conflicting, partially overlapping, quasi-simultaneous requests. In this case we need to mark the corresponding area as out-of-sync, before we call drbd_al_complete_io(). We also use the RQ_POSTPONED flag to just "push back" a request, before even processing it, if IO is suspended for some reason. In this case, as this request was neither submitted nor sent yet, we must not touch the bitmap. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
76590cd1fc
commit
70f17b6bd1
@ -123,7 +123,14 @@ void drbd_req_destroy(struct kref *kref)
|
||||
* (local only or remote failed).
|
||||
* Other places where we set out-of-sync:
|
||||
* READ with local io-error */
|
||||
if (!(s & RQ_POSTPONED)) {
|
||||
|
||||
/* There is a special case:
|
||||
* we may notice late that IO was suspended,
|
||||
* and postpone, or schedule for retry, a write,
|
||||
* before it even was submitted or sent.
|
||||
* In that case we do not want to touch the bitmap at all.
|
||||
*/
|
||||
if ((s & (RQ_POSTPONED|RQ_LOCAL_MASK|RQ_NET_MASK)) != RQ_POSTPONED) {
|
||||
if (!(s & RQ_NET_OK) || !(s & RQ_LOCAL_OK))
|
||||
drbd_set_out_of_sync(mdev, req->i.sector, req->i.size);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user