NFSv4: Don't return the delegation when not needed by NFSv4.x (x>0)
Starting with NFSv4.1, the server is able to deduce the client id from the SEQUENCE op which means it can always figure out whether or not the client is holding a delegation on a file that is being changed. For that reason, RFC5661 does not require a delegation to be unconditionally recalled on operations such as SETATTR, RENAME, or REMOVE. Note that for now, we continue to return READ delegations since that is still expected by the Linux knfsd server. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:

committed by
Anna Schumaker

parent
c135cb39a9
commit
c01d36457d
@@ -19,6 +19,7 @@
|
||||
#include <linux/nfs_xdr.h>
|
||||
|
||||
#include "nfs4_fs.h"
|
||||
#include "nfs4session.h"
|
||||
#include "delegation.h"
|
||||
#include "internal.h"
|
||||
#include "nfs4trace.h"
|
||||
@@ -547,6 +548,22 @@ int nfs4_inode_return_delegation(struct inode *inode)
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* nfs4_inode_make_writeable
|
||||
* @inode: pointer to inode
|
||||
*
|
||||
* Make the inode writeable by returning the delegation if necessary
|
||||
*
|
||||
* Returns zero on success, or a negative errno value.
|
||||
*/
|
||||
int nfs4_inode_make_writeable(struct inode *inode)
|
||||
{
|
||||
if (!nfs4_has_session(NFS_SERVER(inode)->nfs_client) ||
|
||||
!nfs4_check_delegation(inode, FMODE_WRITE))
|
||||
return nfs4_inode_return_delegation(inode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void nfs_mark_return_if_closed_delegation(struct nfs_server *server,
|
||||
struct nfs_delegation *delegation)
|
||||
{
|
||||
|
Reference in New Issue
Block a user