• Trond Myklebust's avatar
    pNFS: Ensure LAYOUTGET and LAYOUTRETURN are properly serialised · bf0291dd
    Trond Myklebust authored
    According to RFC5661, the client is responsible for serialising
    LAYOUTGET and LAYOUTRETURN to avoid ambiguity. Consider the case
    where we send both in parallel.
    
    Client					Server
    ======					======
    LAYOUTGET(seqid=X)
    LAYOUTRETURN(seqid=X)
    					LAYOUTGET return seqid=X+1
    					LAYOUTRETURN return seqid=X+2
    Process LAYOUTRETURN
              Forget layout stateid
    Process LAYOUTGET
              Set seqid=X+1
    
    The client processes the layoutget/layoutreturn in the wrong order,
    and since the result of the layoutreturn was to clear the only
    existing layout segment, the client forgets the layout stateid.
    
    When the LAYOUTGET comes in, it is treated as having a completely
    new stateid, and so the client sets the wrong sequence id...
    
    Fix is to check if there are outstanding LAYOUTGET requests
    before we send the LAYOUTRETURN (note that LAYOUGET will already
    wait if it sees an outstanding LAYOUTRETURN).
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
    Cc: stable@vger.kernel.org # v4.5+
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
    bf0291dd
pnfs.c 67.1 KB