• Chuck Lever's avatar
    NFS: Always use the same SETCLIENTID boot verifier · f092075d
    Chuck Lever authored
    Currently our NFS client assigns a unique SETCLIENTID boot verifier
    for each server IP address it knows about.  It's set to CURRENT_TIME
    when the struct nfs_client for that server IP is created.
    
    During the SETCLIENTID operation, our client also presents an
    nfs_client_id4 string to servers, as an identifier on which the server
    can hang all of this client's NFSv4 state.  Our client's
    nfs_client_id4 string is unique for each server IP address.
    
    An NFSv4 server is obligated to wipe all NFSv4 state associated with
    an nfs_client_id4 string when the client presents the same
    nfs_client_id4 string along with a changed SETCLIENTID boot verifier.
    
    When our client unmounts the last of a server's shares, it destroys
    that server's struct nfs_client.  The next time the client mounts that
    NFS server, it creates a fresh struct nfs_client with a fresh boot
    verifier.  On seeing the fresh verifer, the server wipes any previous
    NFSv4 state associated with that nfs_client_id4.
    
    However, NFSv4.1 clients are supposed to present the same
    nfs_client_id4 string to all servers.  And, to support Transparent
    State Migration, the same nfs_client_id4 string should be presented
    to all NFSv4.0 servers so they recognize that migrated state for this
    client belongs with state a server may already have for this client.
    (This is known as the Uniform Client String model).
    
    If the nfs_client_id4 string is the same but the boot verifier changes
    for each server IP address, SETCLIENTID and EXCHANGE_ID operations
    from such a client could unintentionally result in a server wiping a
    client's previously obtained lease.
    
    Thus, if our NFS client is going to use a fixed nfs_client_id4 string,
    either for NFSv4.0 or NFSv4.1 mounts, our NFS client should use a
    boot verifier that does not change depending on server IP address.
    Replace our current per-nfs_client boot verifier with a per-nfs_net
    boot verifier.
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
    f092075d
nfs4xdr.c 183 KB