16 Jul, 2016

1 commit

  • Use __get_str(str) rather than __get_dynamic_array(str) when
    deadling with strings.

    It is just a code cleanup, no changes on tracepoint ABI.

    Link: http://lkml.kernel.org/r/ea260df91817411cca2a1f3db2abd88860094788.1467407618.git.bristot@redhat.com

    Cc: Trond Myklebust
    Cc: Anna Schumaker
    Cc: Ingo Molnar
    Cc: linux-nfs@vger.kernel.org
    Suggested-by: Steven Rostedt
    Reviewed-by: Steven Rostedt
    Signed-off-by: Daniel Bristot de Oliveira
    Signed-off-by: Steven Rostedt

    Daniel Bristot de Oliveira
     

18 May, 2016

1 commit

  • There are several problems in the way a stateid is selected for a
    LAYOUTGET operation:

    We pick a stateid to use in the RPC prepare op, but that makes
    it difficult to serialize LAYOUTGETs that use the open stateid. That
    serialization is done in pnfs_update_layout, which occurs well before
    the rpc_prepare operation.

    Between those two events, the i_lock is dropped and reacquired.
    pnfs_update_layout can find that the list has lsegs in it and not do any
    serialization, but then later pnfs_choose_layoutget_stateid ends up
    choosing the open stateid.

    This patch changes the client to select the stateid to use in the
    LAYOUTGET earlier, when we're searching for a usable layout segment.
    This way we can do it all while holding the i_lock the first time, and
    ensure that we serialize any LAYOUTGET call that uses a non-layout
    stateid.

    This also means a rework of how LAYOUTGET replies are handled, as we
    must now get the latest stateid if we want to retransmit in response
    to a retryable error.

    Most of those errors boil down to the fact that the layout state has
    changed in some fashion. Thus, what we really want to do is to re-search
    for a layout when it fails with a retryable error, so that we can avoid
    reissuing the RPC at all if possible.

    While the LAYOUTGET RPC is async, the initiating thread always waits for
    it to complete, so it's effectively synchronous anyway. Currently, when
    we need to retry a LAYOUTGET because of an error, we drive that retry
    via the rpc state machine.

    This means that once the call has been submitted, it runs until it
    completes. So, we must move the error handling for this RPC out of the
    rpc_call_done operation and into the caller.

    In order to handle errors like NFS4ERR_DELAY properly, we must also
    pass a pointer to the sliding timeout, which is now moved to the stack
    in pnfs_update_layout.

    The complicating errors are -NFS4ERR_RECALLCONFLICT and
    -NFS4ERR_LAYOUTTRYLATER, as those involve a timeout after which we give
    up and return NULL back to the caller. So, there is some special
    handling for those errors to ensure that the layers driving the retries
    can handle that appropriately.

    Signed-off-by: Jeff Layton
    Signed-off-by: Anna Schumaker

    Jeff Layton
     

08 Jan, 2016

1 commit

  • * bugfixes:
    SUNRPC: Fixup socket wait for memory
    SUNRPC: Fix a missing break in rpc_anyaddr()
    pNFS/flexfiles: Fix an Oopsable typo in ff_mirror_match_fh()
    NFS: Fix attribute cache revalidation
    NFS: Ensure we revalidate attributes before using execute_ok()
    NFS: Flush reclaim writes using FLUSH_COND_STABLE
    NFS: Background flush should not be low priority
    NFSv4.1/pnfs: Fixup an lo->plh_block_lgets imbalance in layoutreturn
    NFSv4: Don't perform cached access checks before we've OPENed the file
    NFS: Allow the combination pNFS and labeled NFS
    NFS42: handle layoutstats stateid error
    nfs: Fix race in __update_open_stateid()
    nfs: fix missing assignment in nfs4_sequence_done tracepoint

    Trond Myklebust
     

29 Dec, 2015

1 commit


28 Dec, 2015

5 commits

  • Instead of displaying a layout segment pointer in these tracepoints,
    let's use the layout stateid, now that Olga gave us a set of tools for
    displaying them.

    Signed-off-by: Trond Myklebust

    Trond Myklebust
     
  • pnfs_update_layout is really the "nexus" of layout handling. If it
    returns NULL then we end up going through the MDS. This patch adds
    some tracepoints to that function that allow us to determine the
    cause when we end up going through the MDS unexpectedly.

    Signed-off-by: Jeff Layton
    Signed-off-by: Trond Myklebust

    Jeff Layton
     
  • Signed-off-by: Olga Kornievskaia
    Signed-off-by: Trond Myklebust

    Olga Kornievskaia
     
  • Operations to which stateid information is added:
    close, delegreturn, open, read, setattr, layoutget, layoutcommit, test_stateid,
    write, lock, locku, lockt

    Format is "stateid=:", also "openstateid=",
    "layoutstateid=", and "lockstateid=" for open_file, layoutget, set_lock
    tracepoints.

    New function is added to internal.h, nfs_stateid_hash(), to compute the hash

    trace_nfs4_setattr() is moved from nfs4_do_setattr() to _nfs4_do_setattr()
    to get access to stateid.

    trace_nfs4_setattr and trace_nfs4_delegreturn are changed from INODE_EVENT
    to new event type, INODE_STATEID_EVENT which is same as INODE_EVENT but adds
    stateid information

    for locking tracepoints, moved trace_nfs4_set_lock() into _nfs4_do_setlk()
    to get access to stateid information, and removed trace_nfs4_lock_reclaim(),
    trace_nfs4_lock_expired() as they call into _nfs4_do_setlk() and both were
    previously same LOCK_EVENT type.

    Signed-off-by: Olga Kornievskaia
    Signed-off-by: Trond Myklebust

    Olga Kornievskaia
     
  • status_flags not set

    Signed-off-by: Andrew Elble
    Signed-off-by: Trond Myklebust

    Andrew Elble
     

07 Oct, 2015

1 commit

  • Running xfstest generic/013 with the tracepoint nfs:nfs4_open_file
    enabled produces a NULL-pointer dereference when calculating fileid and
    filehandle of the opened file. Fix this by checking if state is NULL
    before trying to use the inode pointer.

    Reported-by: Olga Kornievskaia
    Signed-off-by: Anna Schumaker
    Signed-off-by: Trond Myklebust

    Anna Schumaker
     

26 Aug, 2015

3 commits


16 Apr, 2015

1 commit


25 Jun, 2014

1 commit

  • struct nfs_pgio_data only exists as a member of nfs_pgio_header, but is
    passed around everywhere, because there used to be multiple _data structs
    per _header. Many of these functions then use the _data to find a pointer
    to the _header. This patch cleans this up by merging the nfs_pgio_data
    structure into nfs_pgio_header and passing nfs_pgio_header around instead.

    Reviewed-by: Christoph Hellwig
    Signed-off-by: Weston Andros Adamson
    Signed-off-by: Trond Myklebust

    Weston Andros Adamson
     

29 May, 2014

1 commit


22 Aug, 2013

13 commits