GitHub/moto-9609/android_kernel_motorola_exynos9610.git
8 years agoNFSv4: Retry the DELEGRETURN if the embedded GETATTR is rejected with EACCES
Trond Myklebust [Mon, 19 Dec 2016 15:23:10 +0000 (10:23 -0500)]
NFSv4: Retry the DELEGRETURN if the embedded GETATTR is rejected with EACCES

If our DELEGRETURN RPC call is rejected with an EACCES call, then we should
remove the GETATTR call from the compound RPC and retry.
This could potentially happen when there is a conflict between an
ACL denying attribute reads and our use of SP4_MACH_CRED.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Retry the CLOSE if the embedded GETATTR is rejected with EACCES
Trond Myklebust [Mon, 19 Dec 2016 15:34:14 +0000 (10:34 -0500)]
NFS: Retry the CLOSE if the embedded GETATTR is rejected with EACCES

If our CLOSE RPC call is rejected with an EACCES call, then we should
remove the GETATTR call from the compound RPC and retry.
This could potentially happen when there is a conflict between an
ACL denying attribute reads and our use of SP4_MACH_CRED.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Place the GETATTR operation before the CLOSE
Trond Myklebust [Mon, 19 Dec 2016 17:14:44 +0000 (12:14 -0500)]
NFSv4: Place the GETATTR operation before the CLOSE

In order to benefit from the DENY share lock protection, we should
put the GETATTR operation before the CLOSE. Otherwise, we might race
with a Windows machine that thinks it is now safe to modify the file.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Also ask for attributes when downgrading to a READ-only state
Trond Myklebust [Mon, 19 Dec 2016 16:36:41 +0000 (11:36 -0500)]
NFSv4: Also ask for attributes when downgrading to a READ-only state

If we're downgrading from a READ+WRITE mode to a READ-only mode, then
ask for cache consistency attributes so that we avoid the revalidation
in nfs_close_context()

Fixes: 3947b74d0f9d ("NFSv4: Don't request a GETATTR on open_downgrade.")
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Don't abuse NFS_INO_REVAL_FORCED in nfs_post_op_update_inode_locked()
Trond Myklebust [Mon, 19 Dec 2016 14:47:32 +0000 (09:47 -0500)]
NFS: Don't abuse NFS_INO_REVAL_FORCED in nfs_post_op_update_inode_locked()

The NFS_INO_REVAL_FORCED flag now really only has meaning for the
case when we've just been handed a delegation for a file that was already
cached, and we're unsure about that cache.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Return RW layouts on OPEN_DOWNGRADE
Trond Myklebust [Mon, 21 Nov 2016 15:56:38 +0000 (10:56 -0500)]
pNFS: Return RW layouts on OPEN_DOWNGRADE

If the client holds no more writeable open state, and does not hold a
write delegation, then send a layoutreturn as part of the OPEN_DOWNGRADE.

We do this only for writes, since some layout drivers may require you to
also hold a read layout if you are doing a R/W workload.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Add encode/decode of the layoutreturn op in OPEN_DOWNGRADE
Trond Myklebust [Sun, 20 Nov 2016 18:34:16 +0000 (13:34 -0500)]
NFSv4: Add encode/decode of the layoutreturn op in OPEN_DOWNGRADE

While we do not need to return the RW layout when downgrading from a
read/write open state to read-only, we might want to do so in order
to reduce the burden on the metadataserver so that it does not need
to check for changed data when responding to GETATTR requests.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Don't disconnect open-owner on NFS4ERR_BAD_SEQID
NeilBrown [Mon, 19 Dec 2016 00:48:23 +0000 (11:48 +1100)]
NFS: Don't disconnect open-owner on NFS4ERR_BAD_SEQID

When an NFS4ERR_BAD_SEQID is received the open-owner is removed from
the ->state_owners rbtree so that it will no longer be used.

If any stateids attached to this open-owner are still in use, and if a
request using one gets an NFS4ERR_BAD_STATEID reply, this can for bad.

The state is marked as needing recovery and the nfs4_state_manager()
is scheduled to clean up.  nfs4_state_manager() finds states to be
recovered by walking the state_owners rbtree.  As the open-owner is
not in the rbtree, the bad state is not found so nfs4_state_manager()
completes having done nothing.  The request is then retried, with a
predicatable result (indefinite retries).

If the stateid is for a delegation, this open_owner will be used
to open files when the delegation is returned.  For that to work,
a new open-owner needs to be presented to the server.

This patch changes NFS4ERR_BAD_SEQID handling to leave the open-owner
in the rbtree but updates the 'create_time' so it looks like a new
open-owner.  With this the indefinite retries no longer happen.

Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: ensure __nfs4_find_lock_state returns consistent result.
NeilBrown [Mon, 19 Dec 2016 00:33:13 +0000 (11:33 +1100)]
NFSv4: ensure __nfs4_find_lock_state returns consistent result.

If a file has both flock locks and OFD locks, then it is possible that
two different nfs4 lock states could apply to file accesses from a
single process.

It is not possible to know, efficiently, which one is "correct".
Presumably the state which represents a lock that covers the region
undergoing IO would be the "correct" one to use, but finding that has
a non-trivial cost and would provide miniscule value.

Currently we just return whichever is first in the list, which could
result in inconsistent behaviour if an application ever put it self in
this position.  As consistent behaviour is preferable (when perfectly
correct behaviour is not available), change the search to return a
consistent result in this circumstance.
Specifically: if there is both a flock and OFD lock state, always return
the flock one.

Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4.1: nfs4_fl_prepare_ds must be careful about reporting success.
NeilBrown [Mon, 19 Dec 2016 00:19:31 +0000 (11:19 +1100)]
NFSv4.1: nfs4_fl_prepare_ds must be careful about reporting success.

Various places assume that if nfs4_fl_prepare_ds() turns a non-NULL 'ds',
then ds->ds_clp will also be non-NULL.

This is not necessasrily true in the case when the process received a fatal signal
while nfs4_pnfs_ds_connect is waiting in nfs4_wait_ds_connect().
In that case ->ds_clp may not be set, and the devid may not recently have been marked
unavailable.

So add a test for ds_clp == NULL and return NULL in that case.

Fixes: c23266d532b4 ("NFS4.1 Fix data server connection race")
Signed-off-by: NeilBrown <neilb@suse.com>
Acked-by: Olga Kornievskaia <aglo@umich.edu>
Acked-by: Adamson, Andy <William.Adamson@netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS/flexfiles: delete deviceid, don't mark inactive
Weston Andros Adamson [Wed, 14 Dec 2016 21:31:55 +0000 (16:31 -0500)]
pNFS/flexfiles: delete deviceid, don't mark inactive

Instead of marking a device inactive, remove it from the cache entirely.

Flexfiles has a way to report errors back to the server, so we don't want
to stop devices from being tried again for 120 seconds.

Signed-off-by: Weston Andros Adamson <dros@primarydata.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Clean up nfs_attribute_timeout()
Trond Myklebust [Fri, 16 Dec 2016 23:51:15 +0000 (18:51 -0500)]
NFS: Clean up nfs_attribute_timeout()

It can be made static.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Remove unused function nfs_revalidate_inode_rcu()
Trond Myklebust [Fri, 16 Dec 2016 23:49:38 +0000 (18:49 -0500)]
NFS: Remove unused function nfs_revalidate_inode_rcu()

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Fix and clean up the access cache validity checking
Trond Myklebust [Fri, 16 Dec 2016 23:40:03 +0000 (18:40 -0500)]
NFS: Fix and clean up the access cache validity checking

The access cache needs to check whether or not the mode bits, ownership,
or ACL has changed or the cache has timed out.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Only look at the change attribute cache state in nfs_weak_revalidate()
Trond Myklebust [Fri, 16 Dec 2016 23:04:47 +0000 (18:04 -0500)]
NFS: Only look at the change attribute cache state in nfs_weak_revalidate()

Just like in nfs_check_verifier(), we want to use
nfs_mapping_need_revalidate_inode() to check our knowledge of the
change attribute is up to date.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Clean up cache validity checking
Trond Myklebust [Thu, 8 Dec 2016 23:18:38 +0000 (18:18 -0500)]
NFS: Clean up cache validity checking

Consolidate the open-coded checking of NFS_I(inode)->cache_validity
into a couple of helper functions.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Don't revalidate the file on close if we hold a delegation
Trond Myklebust [Fri, 16 Dec 2016 22:39:58 +0000 (17:39 -0500)]
NFS: Don't revalidate the file on close if we hold a delegation

If we're holding a delegation, we can skip sending the close-to-open
GETATTR until we're returning that delegation.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Don't discard the attributes returned by asynchronous DELEGRETURN
Trond Myklebust [Sat, 17 Dec 2016 00:48:09 +0000 (19:48 -0500)]
NFSv4: Don't discard the attributes returned by asynchronous DELEGRETURN

DELEGRETURN will always carry a reference to the inode except when
the latter is being freed, so let's ensure that we always use that
inode information to ensure close-to-open cache consistency, even
when the DELEGRETURN call is asynchronous.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Update the attribute cache info in update_changeattr
Trond Myklebust [Fri, 16 Dec 2016 21:55:55 +0000 (16:55 -0500)]
NFSv4: Update the attribute cache info in update_changeattr

If we successfully updated the change attribute, we should timestamp the
cache. While we do know that the other attributes are not completely up
to date, we have the NFS_INO_INVALID_ATTR flag that let us know that,
so it is valid to say that the cache has not timed out.
We can also clear NFS_INO_REVAL_PAGECACHE, since our change attribute
is now known to be valid.

Conversely, if the change attribute did not match, we should make sure to
also revalidate the access and ACL caches.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoMerge tag 'nfs-rdma-4.10-1' of git://git.linux-nfs.org/projects/anna/nfs-rdma
Trond Myklebust [Sat, 10 Dec 2016 15:31:44 +0000 (10:31 -0500)]
Merge tag 'nfs-rdma-4.10-1' of git://git.linux-nfs.org/projects/anna/nfs-rdma

NFS: NFSoRDMA Client Side Changes

New Features:
- Support for SG_GAP devices

Bugfixes and cleanups:
- Cap size of callback buffer resources
- Improve send queue and RPC metric accounting
- Fix coverity warning
- Avoid calls to ro_unmap_safe()
- Refactor FRMR invalidation
- Error message improvements

8 years agoSUNRPC: fix refcounting problems with auth_gss messages.
NeilBrown [Mon, 5 Dec 2016 04:10:11 +0000 (15:10 +1100)]
SUNRPC: fix refcounting problems with auth_gss messages.

There are two problems with refcounting of auth_gss messages.

First, the reference on the pipe->pipe list (taken by a call
to rpc_queue_upcall()) is not counted.  It seems to be
assumed that a message in pipe->pipe will always also be in
pipe->in_downcall, where it is correctly reference counted.

However there is no guaranty of this.  I have a report of a
NULL dereferences in rpc_pipe_read() which suggests a msg
that has been freed is still on the pipe->pipe list.

One way I imagine this might happen is:
- message is queued for uid=U and auth->service=S1
- rpc.gssd reads this message and starts processing.
  This removes the message from pipe->pipe
- message is queued for uid=U and auth->service=S2
- rpc.gssd replies to the first message. gss_pipe_downcall()
  calls __gss_find_upcall(pipe, U, NULL) and it finds the
  *second* message, as new messages are placed at the head
  of ->in_downcall, and the service type is not checked.
- This second message is removed from ->in_downcall and freed
  by gss_release_msg() (even though it is still on pipe->pipe)
- rpc.gssd tries to read another message, and dereferences a pointer
  to this message that has just been freed.

I fix this by incrementing the reference count before calling
rpc_queue_upcall(), and decrementing it if that fails, or normally in
gss_pipe_destroy_msg().

It seems strange that the reply doesn't target the message more
precisely, but I don't know all the details.  In any case, I think the
reference counting irregularity became a measureable bug when the
extra arg was added to __gss_find_upcall(), hence the Fixes: line
below.

The second problem is that if rpc_queue_upcall() fails, the new
message is not freed. gss_alloc_msg() set the ->count to 1,
gss_add_msg() increments this to 2, gss_unhash_msg() decrements to 1,
then the pointer is discarded so the memory never gets freed.

Fixes: 9130b8dbc6ac ("SUNRPC: allow for upcalls for same uid but different gss service")
Cc: stable@vger.kernel.org
Link: https://bugzilla.opensuse.org/show_bug.cgi?id=1011250
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agonfs: add support for the umask attribute
Andreas Gruenbacher [Sat, 3 Dec 2016 03:53:30 +0000 (22:53 -0500)]
nfs: add support for the umask attribute

Clients can set the umask attribute when creating files to cause the
server to apply it always except when inheriting permissions from the
parent directory.  That way, the new files will end up with the same
permissions as files created locally.

See https://tools.ietf.org/html/draft-ietf-nfsv4-umask-02 for more details.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS/flexfiles: Ensure we have enough buffer for layoutreturn
Trond Myklebust [Fri, 9 Dec 2016 23:07:51 +0000 (18:07 -0500)]
pNFS/flexfiles: Ensure we have enough buffer for layoutreturn

The flexfiles client can piggyback both layout errors and layoutstats
as part of the layoutreturn. Both these payloads can get large, with
20 layout error entries taking up about 1.2K, and 4 layoutstats entries
taking up another 1K.
This patch allows a maximum payload of 4k by allocating a full page.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS/flexfiles: Remove a redundant parameter in ff_layout_encode_ioerr()
Trond Myklebust [Fri, 9 Dec 2016 23:24:18 +0000 (18:24 -0500)]
pNFS/flexfiles: Remove a redundant parameter in ff_layout_encode_ioerr()

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS/flexfiles: Fix a deadlock on LAYOUTGET
Fred Isaman [Fri, 30 Sep 2016 18:37:41 +0000 (14:37 -0400)]
pNFS/flexfiles: Fix a deadlock on LAYOUTGET

  We encountered a deadlock where the SEQUENCE that accompanied the
LAYOUTGET triggered a session drain, while ff_layout_alloc_lseg
triggered a GETDEVICEINFO.  The GETDEVICEINFO hung waiting for the
session drain, while the LAYOUTGET held the slot waiting for
alloc_lseg to finish.
  Avoid this by moving the call to nfs4_find_get_deviceid out of
ff_layout_alloc_lseg and into nfs4_ff_layout_prepare_ds.

Signed-off-by: Fred Isaman <fred.isaman@gmail.com>
[dros@primarydata.com: pNFS/flexfiles: fix races in ff_layout_mirror_valid]
Signed-off-by: Weston Andros Adamson <dros@primarydata.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Layoutreturn must free the layout after the layout-private data
Trond Myklebust [Wed, 7 Dec 2016 17:29:26 +0000 (12:29 -0500)]
pNFS: Layoutreturn must free the layout after the layout-private data

The layout-private data may depend on the layout and/or the inode
still existing when it does post-processing and frees its data, so we
need to free them after calling lrp->ld_private.ops->free().

This fixes a mirror list corruption issue in the flexfiles driver.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS/flexfiles: Fix ff_layout_add_ds_error_locked()
Trond Myklebust [Tue, 6 Dec 2016 17:00:51 +0000 (12:00 -0500)]
pNFS/flexfiles: Fix ff_layout_add_ds_error_locked()

When we're merging an old entry into our new entry, we want to ensure that
we add the list entry in the correct place.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Add missing nfs_put_lock_context()
NeilBrown [Tue, 6 Dec 2016 20:50:06 +0000 (15:50 -0500)]
NFSv4: Add missing nfs_put_lock_context()

Otherwise the lock context won't be freed when we're done with it.

From: NeilBrown <neilb@suse.com>
Fixes: 5bd3f817 ("NFSv4: change nfs4_select_rw_stateid to take a lock_context inplace of lock_owner")
Signed-off-by: Anna Schumaker <Anna.Schumaker@netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Release NFS_LAYOUT_RETURN when invalidating the layout stateid
Trond Myklebust [Mon, 5 Dec 2016 22:33:07 +0000 (17:33 -0500)]
pNFS: Release NFS_LAYOUT_RETURN when invalidating the layout stateid

Ensure we release the NFS_LAYOUT_RETURN lock when we invalidate the
layout stateid, so that processes and RPC tasks that are waiting on
the layout return can continue.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4.1: Don't schedule lease recovery in nfs4_schedule_session_recovery()
Trond Myklebust [Mon, 5 Dec 2016 00:34:38 +0000 (19:34 -0500)]
NFSv4.1: Don't schedule lease recovery in nfs4_schedule_session_recovery()

If the session has an error, then we want to start by recovering the
session, as any SEQUENCE we send is going to fail with a session
error.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4.1: Handle NFS4ERR_BADSESSION/NFS4ERR_DEADSESSION replies to OP_SEQUENCE
Trond Myklebust [Mon, 5 Dec 2016 00:26:40 +0000 (19:26 -0500)]
NFSv4.1: Handle NFS4ERR_BADSESSION/NFS4ERR_DEADSESSION replies to OP_SEQUENCE

In the case where SEQUENCE receives a NFS4ERR_BADSESSION or
NFS4ERR_DEADSESSION error, we just want to report the session as needing
recovery, and then we want to retry the operation.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Only look at the change attribute cache state in nfs_check_verifier
Trond Myklebust [Sun, 4 Dec 2016 23:34:34 +0000 (18:34 -0500)]
NFS: Only look at the change attribute cache state in nfs_check_verifier

When looking at whether or not our dcache is valid, we really don't care
about the general state of the directory attribute cache. Instead, we
we only care about the state of the change attribute.

This fixes a performance issue when the client is responsible for
changing the directory contents; a number of NFSv4 operations will
atomically update the directory change attribute, but may not return
all the other attributes.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Fix incorrect size revalidation when holding a delegation
Trond Myklebust [Sun, 4 Dec 2016 23:08:40 +0000 (18:08 -0500)]
NFS: Fix incorrect size revalidation when holding a delegation

We should only care about checking the attributes if the page cache
is marked as dubious (using NFS_INO_REVAL_PAGECACHE) and the
NFS_INO_REVAL_FORCED flag is set.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Fix incorrect mapping revalidation when holding a delegation
Trond Myklebust [Sun, 4 Dec 2016 21:02:43 +0000 (16:02 -0500)]
NFS: Fix incorrect mapping revalidation when holding a delegation

We should only care about checking the attributes if the page cache
is marked as dubious (using NFS_INO_REVAL_PAGECACHE) and the
NFS_INO_REVAL_FORCED flag is set.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS/flexfiles: Support sending layoutstats in layoutreturn
Trond Myklebust [Wed, 19 Oct 2016 19:59:28 +0000 (15:59 -0400)]
pNFS/flexfiles: Support sending layoutstats in layoutreturn

Add the ability to send an array of layoutstats entries as part of
layoutreturn.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS/flexfiles: Minor refactoring before adding iostats to layoutreturn
Trond Myklebust [Thu, 6 Oct 2016 21:53:20 +0000 (17:53 -0400)]
pNFS/flexfiles: Minor refactoring before adding iostats to layoutreturn

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Fix up read of mirror stats
Trond Myklebust [Mon, 3 Oct 2016 22:13:20 +0000 (18:13 -0400)]
NFS: Fix up read of mirror stats

Need to lock while reading in order to ensure 64-bit reads are correct.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS/flexfiles: Clean up layoutstats
Trond Myklebust [Thu, 29 Sep 2016 16:15:27 +0000 (09:15 -0700)]
pNFS/flexfiles: Clean up layoutstats

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS/flexfiles: Refactor encoding of the layoutreturn payload
Trond Myklebust [Fri, 2 Dec 2016 21:15:05 +0000 (16:15 -0500)]
pNFS/flexfiles: Refactor encoding of the layoutreturn payload

Add the layout error payload to the flexfiles layoutreturn private
data, and set up the encoding mechanisms. This is a refactoring in
preparation for adding the layout iostats payload.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Add a layoutreturn callback to performa layout-private setup
Trond Myklebust [Fri, 2 Dec 2016 21:12:12 +0000 (16:12 -0500)]
pNFS: Add a layoutreturn callback to performa layout-private setup

Add a callback to allow the flexfiles layout driver to initialise the
layout private payload.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Allow layout drivers to manage private data in struct nfs4_layoutreturn
Trond Myklebust [Fri, 23 Sep 2016 15:38:08 +0000 (11:38 -0400)]
pNFS: Allow layout drivers to manage private data in struct nfs4_layoutreturn

Cleanup to allow layout drivers to attach private data to layoutreturn,
and manage the data.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Add a generic structure for managing layout-private information
Trond Myklebust [Thu, 20 Oct 2016 14:12:45 +0000 (10:12 -0400)]
NFSv4: Add a generic structure for managing layout-private information

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS/flexfiles: Only send layoutstats updates for mirrors that were updated
Trond Myklebust [Fri, 25 Nov 2016 18:17:15 +0000 (13:17 -0500)]
pNFS/flexfiles: Only send layoutstats updates for mirrors that were updated

If there have been no reads or writes to a given mirror since the last
layoutstats update, then don't resend the same data.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS/flexfiles: Don't attempt to send layoutstats if there are no entries
Trond Myklebust [Fri, 25 Nov 2016 18:24:09 +0000 (13:24 -0500)]
pNFS/flexfiles: Don't attempt to send layoutstats if there are no entries

If the list of mirrors is empty, then don't send an RPC call.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Allow getattr to also report readdirplus cache hits
Trond Myklebust [Fri, 2 Dec 2016 14:15:37 +0000 (09:15 -0500)]
NFS: Allow getattr to also report readdirplus cache hits

If the use called stat() on an 'ls -l' workload, and the attribute
cache was successfully revalidate by READDIRPLUS, then we want to
report that back so that the readdir code continues to use
readdirplus.

Reviewed-by: Benjamin Coddington <bcodding@redhat.com>
Tested-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Be more targeted about readdirplus use when doing lookup/revalidation
Trond Myklebust [Sat, 19 Nov 2016 16:21:54 +0000 (11:21 -0500)]
NFS: Be more targeted about readdirplus use when doing lookup/revalidation

There is little point in setting NFS_INO_ADVISE_RDPLUS in nfs_lookup and
nfs_lookup_revalidate() unless a process is actually doing readdir on the
parent directory.
Furthermore, there is little point in using readdirplus if we're trying
to revalidate a negative dentry.

Reviewed-by: Benjamin Coddington <bcodding@redhat.com>
Tested-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Fix a performance regression in readdir
Trond Myklebust [Sat, 19 Nov 2016 15:54:55 +0000 (10:54 -0500)]
NFS: Fix a performance regression in readdir

Ben Coddington reports that commit 311324ad1713, by adding the function
nfs_dir_mapping_need_revalidate() that checks page cache validity on
each call to nfs_readdir() causes a performance regression when
the directory is being modified.

If the directory is changing while we're iterating through the directory,
POSIX does not require us to invalidate the page cache unless the user
calls rewinddir(). However, we still do want to ensure that we use
readdirplus in order to avoid a load of stat() calls when the user
is doing an 'ls -l' workload.

The fix should be to invalidate the page cache immediately when we're
setting the NFS_INO_ADVISE_RDPLUS bit.

Reported-by: Benjamin Coddington <bcodding@redhat.com>
Fixes: 311324ad1713 ("NFS: Be more aggressive in using readdirplus...")
Reviewed-by: Benjamin Coddington <bcodding@redhat.com>
Tested-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: fix typo in parameter description
Wei Yongjun [Fri, 28 Oct 2016 14:37:02 +0000 (14:37 +0000)]
NFS: fix typo in parameter description

Fix typo in parameter description.

Fixes: 5405fc44c337 ("NFSv4.x: Add kernel parameter to control the
callback server")
Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: discard nfs_lockowner structure.
NeilBrown [Thu, 13 Oct 2016 04:26:47 +0000 (15:26 +1100)]
NFS: discard nfs_lockowner structure.

It now has only one field and is only used in one structure.
So replaced it in that structure by the field it contains.

Signed-off-by: NeilBrown <neilb@suse.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: enhance nfs4_copy_lock_stateid to use a flock stateid if there is one
NeilBrown [Thu, 13 Oct 2016 04:26:47 +0000 (15:26 +1100)]
NFSv4: enhance nfs4_copy_lock_stateid to use a flock stateid if there is one

A process can have two possible lock owner for a given open file:
a per-process Posix lock owner and a per-open-file flock owner
Use both of these when searching for a suitable stateid to use.

With this patch, READ/WRITE requests will use the correct stateid
if a flock lock is active.

Signed-off-by: NeilBrown <neilb@suse.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: change nfs4_select_rw_stateid to take a lock_context inplace of lock_owner
NeilBrown [Thu, 13 Oct 2016 04:26:47 +0000 (15:26 +1100)]
NFSv4: change nfs4_select_rw_stateid to take a lock_context inplace of lock_owner

The only time that a lock_context is not immediately available is in
setattr, and now that it has an open_context, it can easily find one
with nfs_get_lock_context.
This removes the need for the on-stack nfs_lockowner.

This change is preparation for correctly support flock stateids.

Signed-off-by: NeilBrown <neilb@suse.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: change nfs4_do_setattr to take an open_context instead of a nfs4_state.
NeilBrown [Thu, 13 Oct 2016 04:26:47 +0000 (15:26 +1100)]
NFSv4: change nfs4_do_setattr to take an open_context instead of a nfs4_state.

The open_context can always lead directly to the state, and is always easily
available, so this is a straightforward change.
Doing this makes more information available to _nfs4_do_setattr() for use
in the next patch.

Signed-off-by: NeilBrown <neilb@suse.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: add flock_owner to open context
NeilBrown [Thu, 13 Oct 2016 04:26:47 +0000 (15:26 +1100)]
NFSv4: add flock_owner to open context

An open file description (struct file) in a given process can be
associated with two different lock owners.

It can have a Posix lock owner which will be different in each process
that has a fd on the file.
It can have a Flock owner which will be the same in all processes.

When searching for a lock stateid to use, we need to consider both of these
owners

So add a new "flock_owner" to the "nfs_open_context" (of which there
is one for each open file description).

This flock_owner does not need to be reference-counted as there is a
1-1 relation between 'struct file' and nfs open contexts,
and it will never be part of a list of contexts.  So there is no need
for a 'flock_context' - just the owner is enough.

The io_count included in the (Posix) lock_context provides no
guarantee that all read-aheads that could use the state have
completed, so not supporting it for flock locks in not a serious
problem.  Synchronization between flock and read-ahead can be added
later if needed.

When creating an open_context for a non-openning create call, we don't have
a 'struct file' to pass in, so the lock context gets initialized with
a NULL owner, but this will never be used.

The flock_owner is not used at all in this patch, that will come later.

Acked-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: NeilBrown <neilb@suse.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: remove l_pid field from nfs_lockowner
NeilBrown [Thu, 13 Oct 2016 04:26:47 +0000 (15:26 +1100)]
NFS: remove l_pid field from nfs_lockowner

this field is not used in any important way and probably should
have been removed by

Commit: 8003d3c4aaa5 ("nfs4: treat lock owners as opaque values")

which removed the pid argument from nfs4_get_lock_state.

Except in unusual and uninteresting cases, two threads with the same
->tgid will have the same ->files pointer, so keeping them both
for comparison brings no benefit.

Acked-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: NeilBrown <neilb@suse.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Remove unused argument from nfs_direct_write_complete()
Anna Schumaker [Wed, 23 Nov 2016 18:49:38 +0000 (13:49 -0500)]
NFS: Remove unused argument from nfs_direct_write_complete()

This parameter hasn't been used since 2a009ec9 (Linux 3.13-rc3), so
let's remove it from this function.

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFS: Remove unused authflavour parameter from nfs_get_client()
Anna Schumaker [Thu, 17 Nov 2016 20:15:55 +0000 (15:15 -0500)]
NFS: Remove unused authflavour parameter from nfs_get_client()

This parameter hasn't been used since f8407299 (Linux 3.11-rc2), so
let's remove it from this function and callers.

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agonfs: fix false positives in nfs40_walk_client_list()
J. Bruce Fields [Mon, 28 Nov 2016 14:02:52 +0000 (09:02 -0500)]
nfs: fix false positives in nfs40_walk_client_list()

It's possible that two different servers can return the same (clientid,
verifier) pair purely by coincidence.  Both are 64-bit values, but
depending on the server implementation, they can be highly predictable
and collisions may be quite likely, especially when there are lots of
servers.

So, check for this case.  If the clientid and verifier both match, then
we actually know they *can't* be the same server, since a new
SETCLIENTID to an already-known server should have changed the verifier.

This helps fix a bug that could cause the client to mount a filesystem
from the wrong server.

Reviewed-by: Jeff Layton <jlayton@redhat.com>
Tested-by: Yongcheng Yang <yoyang@redhat.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agosunrpc: Don't engage exponential backoff when connection attempt is rejected.
NeilBrown [Wed, 23 Nov 2016 03:44:58 +0000 (14:44 +1100)]
sunrpc: Don't engage exponential backoff when connection attempt is rejected.

xs_connect() contains an exponential backoff mechanism so the repeated
connection attempts are delayed by longer and longer amounts.

This is appropriate when the connection failed due to a timeout, but
it not appropriate when a definitive "no" answer is received.  In such
cases, call_connect_status() imposes a minimum 3-second back-off, so
not having the exponetial back-off will never result in immediate
retries.

The current situation is a problem when the NFS server tries to
register with rpcbind but rpcbind isn't running.  All connection
attempts are made on the same "xprt" and as the connection is never
"closed", the exponential back delays successive attempts to register,
or de-register, different protocols.  This results in a multi-minute
delay with no benefit.

So, when call_connect_status() receives a definitive "no", use
xprt_conditional_disconnect() to cancel the previous connection attempt.
This will set XPRT_CLOSE_WAIT so that xprt->ops->close() calls xs_close()
which resets the reestablish_timeout.

To ensure xprt_conditional_disconnect() does the right thing, we
ensure that rq_connect_cookie is set before a connection attempt, and
allow xprt_conditional_disconnect() to complete even when the
transport is not fully connected.

Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Skip invalid stateids when doing a bulk destroy
Trond Myklebust [Wed, 30 Nov 2016 23:00:07 +0000 (18:00 -0500)]
pNFS: Skip invalid stateids when doing a bulk destroy

If the layout stateid is already invalid, we have no work to do.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Wait on outstanding layoutreturns to complete in pnfs_roc()
Trond Myklebust [Wed, 30 Nov 2016 21:23:38 +0000 (16:23 -0500)]
pNFS: Wait on outstanding layoutreturns to complete in pnfs_roc()

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Don't mark the layout as freed if the last lseg is marked for return
Trond Myklebust [Wed, 30 Nov 2016 16:38:10 +0000 (11:38 -0500)]
pNFS: Don't mark the layout as freed if the last lseg is marked for return

Address another memory leak.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Sync the layout state bits in pnfs_cache_lseg_for_layoutreturn
Trond Myklebust [Wed, 30 Nov 2016 15:47:48 +0000 (10:47 -0500)]
pNFS: Sync the layout state bits in pnfs_cache_lseg_for_layoutreturn

Ensure that the layout state bits are synced when we cache a layout
segment for layoutreturn using an appropriate call to
pnfs_set_plh_return_info.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Fix bugs in _pnfs_return_layout
Trond Myklebust [Wed, 30 Nov 2016 15:19:09 +0000 (10:19 -0500)]
pNFS: Fix bugs in _pnfs_return_layout

We need to honour the NFS_LAYOUT_RETURN_REQUESTED bit regardless of
whether or not there are layout segments pending.
Furthermore, we should ensure that we leave the plh_return_segs list
empty.

This patch fixes a memory leak of the layout segments on plh_return_segs.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Clear all layout segment state in pnfs_mark_layout_stateid_invalid
Trond Myklebust [Wed, 30 Nov 2016 17:32:55 +0000 (12:32 -0500)]
pNFS: Clear all layout segment state in pnfs_mark_layout_stateid_invalid

When the layout state is invalidated, then so is the layout segment
state, and hence we do need to clean up the state bits.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Prevent unnecessary layoutreturns after delegreturn
Trond Myklebust [Sat, 19 Nov 2016 13:48:47 +0000 (08:48 -0500)]
pNFS: Prevent unnecessary layoutreturns after delegreturn

If we cannot grab the inode or superblock, then we cannot pin the
layout header, and so we cannot send a layoutreturn as part of an
async delegreturn call. In this case, we currently end up sending
an extra layoutreturn after the delegreturn. Since the layout was
implicitly returned by the delegreturn, that just gets a BAD_STATEID.

The fix is to simply complete the return-on-close immediately.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Enable layoutreturn operation for return-on-close
Trond Myklebust [Wed, 16 Nov 2016 06:11:25 +0000 (01:11 -0500)]
pNFS: Enable layoutreturn operation for return-on-close

Amend the pnfs return on close helper functions to enable sending the
layoutreturn op in CLOSE/DELEGRETURN. This closes a potential race between
CLOSE/DELEGRETURN and parallel OPEN calls to the same file, and allows the
client and the server to agree on whether or not there is an outstanding
layout.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Clean up - add a helper to initialise struct layoutreturn_args
Trond Myklebust [Wed, 16 Nov 2016 02:47:27 +0000 (21:47 -0500)]
pNFS: Clean up - add a helper to initialise struct layoutreturn_args

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Add encode/decode of the layoutreturn op in DELEGRETURN
Trond Myklebust [Tue, 15 Nov 2016 20:03:33 +0000 (15:03 -0500)]
NFSv4: Add encode/decode of the layoutreturn op in DELEGRETURN

Add XDR encoding for the layoutreturn op, and storage for the layoutreturn
arguments to the DELEGRETURN compound.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Add encode/decode of the layoutreturn op in CLOSE
Trond Myklebust [Tue, 15 Nov 2016 19:56:07 +0000 (14:56 -0500)]
NFSv4: Add encode/decode of the layoutreturn op in CLOSE

Add XDR encoding for the layoutreturn op, and storage for the layoutreturn
arguments to the CLOSE compound.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Fix missing operation accounting in NFS4_dec_delegreturn_sz
Trond Myklebust [Wed, 16 Nov 2016 18:54:00 +0000 (13:54 -0500)]
NFSv4: Fix missing operation accounting in NFS4_dec_delegreturn_sz

We need to account for the reply to the PUTFH operation in the
DELEGRETURN compound.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Don't mark layout segments invalid on layoutreturn in pnfs_roc
Trond Myklebust [Tue, 15 Nov 2016 23:29:59 +0000 (18:29 -0500)]
pNFS: Don't mark layout segments invalid on layoutreturn in pnfs_roc

The layoutreturn call will take care of invalidating the layout segments
once the call is successful.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Get rid of unnecessary layout parameter in encode_layoutreturn callback
Trond Myklebust [Thu, 15 Sep 2016 22:49:52 +0000 (18:49 -0400)]
pNFS: Get rid of unnecessary layout parameter in encode_layoutreturn callback

The parameter is already present in the "args" structure.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Skip checking for return-on-close if the layout is invalid
Trond Myklebust [Mon, 21 Nov 2016 16:05:33 +0000 (11:05 -0500)]
pNFS: Skip checking for return-on-close if the layout is invalid

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Remove spurious wake up in pnfs_layout_remove_lseg()
Trond Myklebust [Fri, 18 Nov 2016 20:18:52 +0000 (15:18 -0500)]
pNFS: Remove spurious wake up in pnfs_layout_remove_lseg()

There is no change to the value of NFS_LAYOUT_RETURN, so we should
not be waking up the RPC call.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Ignore LAYOUTRETURN result if the layout doesn't match or is invalid
Trond Myklebust [Sun, 20 Nov 2016 18:13:54 +0000 (13:13 -0500)]
NFSv4: Ignore LAYOUTRETURN result if the layout doesn't match or is invalid

Fix a potential race with CB_LAYOUTRECALL in which the server recalls the
remaining layout segments while our LAYOUTRETURN is still in transit.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Do not free layout segments that are marked for return
Trond Myklebust [Wed, 12 Oct 2016 23:50:54 +0000 (19:50 -0400)]
pNFS: Do not free layout segments that are marked for return

We may want to process and transmit layout stat information for the
layout segments that are being returned, so we should defer freeing
them until after the layoutreturn has completed.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Delay getting the layout header in CB_LAYOUTRECALL handlers
Trond Myklebust [Mon, 31 Oct 2016 14:05:21 +0000 (10:05 -0400)]
pNFS: Delay getting the layout header in CB_LAYOUTRECALL handlers

Instead of grabbing the layout, we want to get the inode so that we
can reduce races between layoutget and layoutrecall when the server
does not support call referring.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: consolidate the different range intersection tests
Trond Myklebust [Tue, 25 Oct 2016 16:24:25 +0000 (12:24 -0400)]
pNFS: consolidate the different range intersection tests

Both pnfs.c and the flexfiles code have their own versions of the
range intersection testing, and the "end_offset" helper.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Fix race in pnfs_wait_on_layoutreturn
Trond Myklebust [Fri, 18 Nov 2016 20:21:30 +0000 (15:21 -0500)]
pNFS: Fix race in pnfs_wait_on_layoutreturn

We must put the task to sleep while holding the inode->i_lock in order
to ensure atomicity with the test for NFS_LAYOUT_RETURN.

Fixes: 500d701f336b ("NFS41: make close wait for layoutreturn")
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: On error, do not send LAYOUTGET until the LAYOUTRETURN has completed
Trond Myklebust [Mon, 17 Oct 2016 21:54:32 +0000 (17:54 -0400)]
pNFS: On error, do not send LAYOUTGET until the LAYOUTRETURN has completed

If there is an I/O error, we should not call LAYOUTGET until the
LAYOUTRETURN that reports the error is complete.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Cc: stable@vger.kernel.org # v4.8+
8 years agopNFS: Force a retry of LAYOUTGET if the stateid doesn't match our cache
Trond Myklebust [Wed, 23 Nov 2016 17:36:04 +0000 (12:36 -0500)]
pNFS: Force a retry of LAYOUTGET if the stateid doesn't match our cache

If the server sends us a completely new stateid, and the client thinks
it already holds a layout, then force a retry of the LAYOUTGET after
invalidating the existing layout in order to avoid corruption due to
races.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agopNFS: Clear NFS_LAYOUT_RETURN_REQUESTED when invalidating the layout stateid
Trond Myklebust [Mon, 14 Nov 2016 19:34:18 +0000 (14:34 -0500)]
pNFS: Clear NFS_LAYOUT_RETURN_REQUESTED when invalidating the layout stateid

We must ensure that we don't schedule a layoutreturn if the layout stateid
has been marked as invalid.

Fixes: 2a59a0411671e ("pNFS: Fix pnfs_set_layout_stateid() to clear...")
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Cc: stable@vger.kernel.org # v4.8+
8 years agopNFS: Don't clear the layout stateid if a layout return is outstanding
Trond Myklebust [Mon, 14 Nov 2016 18:10:48 +0000 (13:10 -0500)]
pNFS: Don't clear the layout stateid if a layout return is outstanding

If we no longer hold any layout segments, we're normally expected to
consider the layout stateid to be invalid. However we cannot assume this
if we're about to, or in the process of sending a layoutreturn.

Fixes: 334a8f37115b ("pNFS: Don't forget the layout stateid if...")
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Cc: stable@vger.kernel.org # v4.8+
8 years agopNFS: Fix a deadlock between read resends and layoutreturn
Trond Myklebust [Sun, 27 Nov 2016 20:12:39 +0000 (15:12 -0500)]
pNFS: Fix a deadlock between read resends and layoutreturn

We must not call nfs_pageio_init_read() on a new nfs_pageio_descriptor
while holding a reference to a layout segment, as that can deadlock
pnfs_update_layout().

Fixes: d67ae825a59d6 ("pnfs/flexfiles: Add the FlexFile Layout Driver")
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Cc: stable@vger.kernel.org # v4.0+
8 years agoNFSv4.1: Fix regression in callback retry handling
Fred Isaman [Tue, 27 Sep 2016 19:37:11 +0000 (15:37 -0400)]
NFSv4.1: Fix regression in callback retry handling

When initializing a freshly created slot for the calllback channel,
the seq_nr needs to be 0, not 1.  Otherwise validate_seqid
and nfs4_slot_wait_on_seqid get confused and believe that the
mpty slot corresponds to a previously sent reply.

Signed-off-by: Fred Isaman <fred.isaman@gmail.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Optimise away forced revalidation when we know the attributes are OK
Trond Myklebust [Thu, 27 Oct 2016 22:42:04 +0000 (18:42 -0400)]
NFSv4: Optimise away forced revalidation when we know the attributes are OK

The NFS_INO_REVAL_FORCED flag needs to be set if we just got a delegation,
and we see that there might still be some ambiguity as to whether or not
our attribute or data cache are valid.
In practice, this means that a call to nfs_check_inode_attributes() will
have noticed a discrepancy between cached attributes and measured ones,
so let's move the setting of NFS_INO_REVAL_FORCED to there.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Don't request close-to-open attribute when holding a delegation
Trond Myklebust [Thu, 27 Oct 2016 22:25:04 +0000 (18:25 -0400)]
NFSv4: Don't request close-to-open attribute when holding a delegation

If holding a delegation, we do not need to ask the server to return
close-to-open cache consistency attributes as part of the CLOSE
compound.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Don't request a GETATTR on open_downgrade.
Trond Myklebust [Thu, 27 Oct 2016 22:27:02 +0000 (18:27 -0400)]
NFSv4: Don't request a GETATTR on open_downgrade.

If we're not closing the file completely, there is no need to request
close-to-open attributes.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Don't ask for the change attribute when reclaiming state
Trond Myklebust [Thu, 10 Nov 2016 20:47:26 +0000 (15:47 -0500)]
NFSv4: Don't ask for the change attribute when reclaiming state

We don't need to ask for the change attribute when returning a delegation
or recovering from a server reboot, and it could actually cause us to
obtain an incorrect value if we're using a pNFS flavour that requires
LAYOUTCOMMIT.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoNFSv4: Don't check file access when reclaiming state
Trond Myklebust [Thu, 10 Nov 2016 20:40:34 +0000 (15:40 -0500)]
NFSv4: Don't check file access when reclaiming state

If we're reclaiming state after a reboot, or as part of returning a
delegation, we don't need to check access modes again.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
8 years agoxprtrdma: Relocate connection helper functions
Chuck Lever [Tue, 29 Nov 2016 15:53:37 +0000 (10:53 -0500)]
xprtrdma: Relocate connection helper functions

Clean up: Disentangle connection helpers from RPC-over-RDMA reply
decoding functions.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
8 years agoxprtrdma: Update dprintk in rpcrdma_count_chunks
Chuck Lever [Tue, 29 Nov 2016 15:53:29 +0000 (10:53 -0500)]
xprtrdma: Update dprintk in rpcrdma_count_chunks

Clean up: offset and handle should be zero-filled, just like in the
chunk encoders.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
8 years agoxprtrdma: Shorten QP access error message
Chuck Lever [Tue, 29 Nov 2016 15:53:21 +0000 (10:53 -0500)]
xprtrdma: Shorten QP access error message

Clean up: The convention for this type of warning message is not to
show the function name or "RPC:       ".

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
8 years agoxprtrdma: Squelch "max send, max recv" messages at connect time
Chuck Lever [Tue, 29 Nov 2016 15:53:13 +0000 (10:53 -0500)]
xprtrdma: Squelch "max send, max recv" messages at connect time

Clean up: This message was intended to be a dprintk, as it is on the
server-side.

Fixes: 87cfb9a0c85c ('xprtrdma: Client-side support for ...')
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
8 years agoxprtrdma: Update documenting comment
Chuck Lever [Tue, 29 Nov 2016 15:53:05 +0000 (10:53 -0500)]
xprtrdma: Update documenting comment

Clean up: If reset fails, FRMRs are no longer abandoned, rather
they are released immediately. Update the comment to reflect this.

Fixes: 2ffc871a574d ('xprtrdma: Release orphaned MRs immediately')
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
8 years agoxprtrdma: Refactor FRMR invalidation
Chuck Lever [Tue, 29 Nov 2016 15:52:57 +0000 (10:52 -0500)]
xprtrdma: Refactor FRMR invalidation

Clean up: After some recent updates, clarifications can be made to
the FRMR invalidation logic.

- Both the remote and local invalidation case mark the frmr INVALID,
  so make that a common path.

- Manage the WR list more "tastefully" by replacing the conditional
  that discriminates between the list head and ->next pointers.

- Use mw->mw_handle in all cases, since that has the same value as
  f->fr_mr->rkey, and is already in cache.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
8 years agoxprtrdma: Avoid calls to ro_unmap_safe()
Chuck Lever [Tue, 29 Nov 2016 15:52:48 +0000 (10:52 -0500)]
xprtrdma: Avoid calls to ro_unmap_safe()

Micro-optimization: Most of the time, calls to ro_unmap_safe are
expensive no-ops. Call only when there is work to do.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
8 years agoxprtrdma: Address coverity complaint about wait_for_completion()
Chuck Lever [Tue, 29 Nov 2016 15:52:40 +0000 (10:52 -0500)]
xprtrdma: Address coverity complaint about wait_for_completion()

> ** CID 114101:  Error handling issues  (CHECKED_RETURN)
> /net/sunrpc/xprtrdma/verbs.c: 355 in rpcrdma_create_id()

Commit 5675add36e76 ("RPC/RDMA: harden connection logic against
missing/late rdma_cm upcalls.") replaced wait_for_completion() calls
with these two call sites.

The original wait_for_completion() calls were added in the initial
commit of verbs.c, which was commit c56c65fb67d6 ("RPCRDMA: rpc rdma
verbs interface implementation"), but these returned void.

rpcrdma_create_id() is called by the RDMA connect worker, which
probably won't ever be interrupted. It is also called by
rpcrdma_ia_open which is in the synchronous mount path, and ^C is
possible there.

Add a bit of logic at those two call sites to return if the waits
return ERESTARTSYS.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
8 years agoSUNRPC: Proper metric accounting when RPC is not transmitted
Chuck Lever [Tue, 29 Nov 2016 15:52:32 +0000 (10:52 -0500)]
SUNRPC: Proper metric accounting when RPC is not transmitted

I noticed recently that during an xfstests on a krb5i mount, the
retransmit count for certain operations had gone negative, and the
backlog value became unreasonably large. I recall that Andy has
pointed this out to me in the past.

When call_refresh fails to find a valid credential for an RPC, the
RPC exits immediately without sending anything on the wire. This
leaves rq_ntrans, rq_xtime, and rq_rtt set to zero.

The solution for om_queue is to not add the to RPC's running backlog
queue total whenever rq_xtime is zero.

For om_ntrans, it's a bit more difficult. A zero rq_ntrans causes
om_ops to become larger than om_ntrans. The design of the RPC
metrics API assumes that ntrans will always be equal to or larger
than the ops count. The result is that when an RPC fails to find
credentials, the RPC operation's reported retransmit count, which is
computed in user space as the difference between ops and ntrans,
goes negative.

Ideally the kernel API should report a separate retransmit and
"exited before initial transmission" metric, so that user space can
sort out the difference properly.

To avoid kernel API changes and changes to the way rq_ntrans is used
when performing transport locking, account for untransmitted RPCs
so that om_ntrans keeps up with om_ops: always add one or more to
om_ntrans.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
8 years agoxprtrdma: Support for SG_GAP devices
Chuck Lever [Tue, 29 Nov 2016 15:52:24 +0000 (10:52 -0500)]
xprtrdma: Support for SG_GAP devices

Some devices (such as the Mellanox CX-4) can register, under a
single R_key, a set of memory regions that are not contiguous. When
this is done, all the segments in a Reply list, say, can then be
invalidated in a single LocalInv Work Request (or via Remote
Invalidation, which can invalidate exactly one R_key when completing
a Receive).

This means a single FastReg WR is used to register, and one or zero
LocalInv WRs can invalidate, the memory involved with RDMA transfers
on behalf of an RPC.

In addition, xprtrdma constructs some Reply chunks from three or
more segments. By registering them with SG_GAP, only one segment
is needed for the Reply chunk, allowing the whole chunk to be
invalidated remotely.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>