• Andrew Elble's avatar
    nfsd: fix race with open / open upgrade stateids · 7fc0564e
    Andrew Elble authored
    We observed multiple open stateids on the server for files that
    seemingly should have been closed.
    
    nfsd4_process_open2() tests for the existence of a preexisting
    stateid. If one is not found, the locks are dropped and a new
    one is created. The problem is that init_open_stateid(), which
    is also responsible for hashing the newly initialized stateid,
    doesn't check to see if another open has raced in and created
    a matching stateid. This fix is to enable init_open_stateid() to
    return the matching stateid and have nfsd4_process_open2()
    swap to that stateid and switch to the open upgrade path.
    In testing this patch, coverage to the newly created
    path indicates that the race was indeed happening.
    Signed-off-by: default avatarAndrew Elble <aweits@rit.edu>
    Reviewed-by: default avatarJeff Layton <jlayton@poochiereds.net>
    Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
    7fc0564e
nfs4state.c 175 KB