• Fred Isaman's avatar
    pnfs: avoid incorrect use of layout stateid · 38511722
    Fred Isaman authored
    The code could violate the following from RFC5661, section 12.5.3:
    "Once a client has no more layouts on a file, the layout stateid is no
    longer valid and MUST NOT be used."
    
    This can occur when a layout already has a lseg, starts another
    non-everlapping LAYOUTGET, and a CB_LAYOUTRECALL for the existing lseg
    is processed before we hit pnfs_layout_process().
    
    Solve by setting, each time the client has no more lsegs for a file, a
    flag which blocks further use of the layout and triggers its removal.
    
    This also fixes a second bug which occurs in the same instance as
    above.  If we actually use pnfs_layout_process, we add the new lseg to
    the layout, but the layout has been removed from the nfs_client list
    by the intervening CB_LAYOUTRECALL and will not be added back.  Thus
    the newly acquired lseg will not be properly returned in the event of
    a subsequent CB_LAYOUTRECALL.
    Signed-off-by: default avatarFred Isaman <iisaman@netapp.com>
    Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
    38511722
pnfs.c 25.6 KB