• Chuck Lever's avatar
    NFSD: Fix the NFSv4.1 CREATE_SESSION operation · e4469c6c
    Chuck Lever authored
    RFC 8881 Section 18.36.4 discusses the implementation of the NFSv4.1
    CREATE_SESSION operation. The section defines four phases of
    operation.
    
    Phase 2 processes the CREATE_SESSION sequence ID. As a separate
    step, Phase 3 evaluates the CREATE_SESSION arguments.
    
    The problem we are concerned with is when phase 2 is successful but
    phase 3 fails. The spec language in this case is "No changes are
    made to any client records on the server."
    
    RFC 8881 Section 18.35.4 defines a "client record", and it does
    /not/ contain any details related to the special CREATE_SESSION
    slot. Therefore NFSD is incorrect to skip incrementing the
    CREATE_SESSION sequence id when phase 3 (see Section 18.36.4) of
    CREATE_SESSION processing fails. In other words, even though NFSD
    happens to store the cs_slot in a client record, in terms of the
    protocol the slot is logically separate from the client record.
    
    Three complications:
    
    1. The world has moved on since commit 86c3e16c ("nfsd4: confirm
       only on succesful create_session") broke this. So we can't simply
       revert that commit.
    
    2. NFSD's CREATE_SESSION implementation does not cleanly delineate
       the logic of phases 2 and 3. So this won't be a surgical fix.
    
    3. Because of the way it currently handles the CREATE_SESSION slot
       sequence number, nfsd4_create_session() isn't caching error
       responses in the CREATE_SESSION slot. Instead of replaying the
       response cache in those cases, it's executing the transaction
       again.
    
    Reorganize the CREATE_SESSION slot sequence number accounting. This
    requires that error responses are appropriately cached in the
    CREATE_SESSION slot (once it is found).
    Reported-by: default avatarConnor Smith <connor.smith@hitachivantara.com>
    Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218382Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    e4469c6c
nfs4state.c 227 KB