|
Description
|
After putback of 6416641, rfs4_find_dr() is not checking the
dr_time_used field, when walking the DRC bucket for given XID.
Following can happen:
1) some DRC bucket has several entries old only few miliseconds,
they should be used if same request is retransmitted.
2) some NFS client sends a new request which is hashed according
to XID to same DRC bucket as above. rfs4_find_dr() will try to find
if matching entry (same XID, same client). As this is a new request
such entry is not found, and whole bucket is walked. As side effect
all entries in state NFS4_DUP_REPLAY are freed, no matter how old
are they.
This breaks the main purpose of DRC - avoidance of multiple processing
of non-idempotent requests.
|