Message ID | 1473174760-29859-10-git-send-email-jlayton@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Jeff, On 09/06/2016 11:12 AM, Jeff Layton wrote: > If it does, then always have the client sleep for the max time before > repolling for the lock. > > Signed-off-by: Jeff Layton <jlayton@redhat.com> > --- > fs/nfs/nfs4_fs.h | 1 + > fs/nfs/nfs4proc.c | 7 ++++++- > 2 files changed, 7 insertions(+), 1 deletion(-) > > diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h > index 9bf64eacba5b..91e4f135a5f2 100644 > --- a/fs/nfs/nfs4_fs.h > +++ b/fs/nfs/nfs4_fs.h > @@ -156,6 +156,7 @@ enum { > NFS_STATE_RECLAIM_NOGRACE, /* OPEN stateid needs to recover state */ > NFS_STATE_POSIX_LOCKS, /* Posix locks are supported */ > NFS_STATE_RECOVERY_FAILED, /* OPEN stateid state recovery failed */ > + NFS_STATE_MAY_NOTIFY_LOCK, /* server may CB_NOTIFY_LOCK */ > }; > > struct nfs4_state { > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c > index 6829b998776d..ecd00431fe0c 100644 > --- a/fs/nfs/nfs4proc.c > +++ b/fs/nfs/nfs4proc.c > @@ -2537,6 +2537,8 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, > goto out; > if (server->caps & NFS_CAP_POSIX_LOCK) > set_bit(NFS_STATE_POSIX_LOCKS, &state->flags); > + if (opendata->o_res.rflags & NFS4_OPEN_RESULT_MAY_NOTIFY_LOCK) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Where does the NFS4_OPEN_RESULT_MAY_NOTIFY_LOCK flag come from? `git grep` isn't finding it in my source directory. Thanks, Anna > + set_bit(NFS_STATE_MAY_NOTIFY_LOCK, &state->flags); > > dentry = opendata->dentry; > if (d_really_is_negative(dentry)) { > @@ -6230,7 +6232,7 @@ nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request) > { > struct nfs_open_context *ctx; > struct nfs4_state *state; > - unsigned long timeout = NFS4_LOCK_MINTIMEOUT; > + unsigned long timeout; > int status; > > /* verify open state */ > @@ -6279,6 +6281,9 @@ nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request) > if (status != 0) > return status; > > + timeout = test_bit(NFS_STATE_MAY_NOTIFY_LOCK, &state->flags) ? > + NFS4_LOCK_MAXTIMEOUT : NFS4_LOCK_MINTIMEOUT; > + > do { > struct nfs4_lock_state *lsp = request->fl_u.nfs4_fl.owner; > struct inode *inode = lsp->ls_state->inode; > -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, 2016-09-08 at 16:15 -0400, Anna Schumaker wrote: > Hi Jeff, > > On 09/06/2016 11:12 AM, Jeff Layton wrote: > > > > If it does, then always have the client sleep for the max time > > before > > repolling for the lock. > > > > Signed-off-by: Jeff Layton <jlayton@redhat.com> > > --- > > fs/nfs/nfs4_fs.h | 1 + > > fs/nfs/nfs4proc.c | 7 ++++++- > > 2 files changed, 7 insertions(+), 1 deletion(-) > > > > diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h > > index 9bf64eacba5b..91e4f135a5f2 100644 > > --- a/fs/nfs/nfs4_fs.h > > +++ b/fs/nfs/nfs4_fs.h > > @@ -156,6 +156,7 @@ enum { > > NFS_STATE_RECLAIM_NOGRACE, /* OPEN stateid needs to > > recover state */ > > NFS_STATE_POSIX_LOCKS, /* Posix locks are > > supported */ > > NFS_STATE_RECOVERY_FAILED, /* OPEN stateid state > > recovery failed */ > > + NFS_STATE_MAY_NOTIFY_LOCK, /* server may > > CB_NOTIFY_LOCK */ > > }; > > > > struct nfs4_state { > > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c > > index 6829b998776d..ecd00431fe0c 100644 > > --- a/fs/nfs/nfs4proc.c > > +++ b/fs/nfs/nfs4proc.c > > @@ -2537,6 +2537,8 @@ static int _nfs4_open_and_get_state(struct > > nfs4_opendata *opendata, > > goto out; > > if (server->caps & NFS_CAP_POSIX_LOCK) > > set_bit(NFS_STATE_POSIX_LOCKS, &state->flags); > > + if (opendata->o_res.rflags & > > NFS4_OPEN_RESULT_MAY_NOTIFY_LOCK) > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > ^ > Where does the NFS4_OPEN_RESULT_MAY_NOTIFY_LOCK flag come from? `git > grep` isn't finding it in my source directory. > > Thanks, > Anna > It's in: include/uapi/linux/nfs4.h ...which I think is already included here. > > > > > + set_bit(NFS_STATE_MAY_NOTIFY_LOCK, &state->flags); > > > > dentry = opendata->dentry; > > if (d_really_is_negative(dentry)) { > > @@ -6230,7 +6232,7 @@ nfs4_proc_lock(struct file *filp, int cmd, > > struct file_lock *request) > > { > > struct nfs_open_context *ctx; > > struct nfs4_state *state; > > - unsigned long timeout = NFS4_LOCK_MINTIMEOUT; > > + unsigned long timeout; > > int status; > > > > /* verify open state */ > > @@ -6279,6 +6281,9 @@ nfs4_proc_lock(struct file *filp, int cmd, > > struct file_lock *request) > > if (status != 0) > > return status; > > > > + timeout = test_bit(NFS_STATE_MAY_NOTIFY_LOCK, &state- > > >flags) ? > > + NFS4_LOCK_MAXTIMEOUT : > > NFS4_LOCK_MINTIMEOUT; > > + > > do { > > struct nfs4_lock_state *lsp = request- > > >fl_u.nfs4_fl.owner; > > struct inode *inode = lsp->ls_state->inode; > > >
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index 9bf64eacba5b..91e4f135a5f2 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h @@ -156,6 +156,7 @@ enum { NFS_STATE_RECLAIM_NOGRACE, /* OPEN stateid needs to recover state */ NFS_STATE_POSIX_LOCKS, /* Posix locks are supported */ NFS_STATE_RECOVERY_FAILED, /* OPEN stateid state recovery failed */ + NFS_STATE_MAY_NOTIFY_LOCK, /* server may CB_NOTIFY_LOCK */ }; struct nfs4_state { diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 6829b998776d..ecd00431fe0c 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -2537,6 +2537,8 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, goto out; if (server->caps & NFS_CAP_POSIX_LOCK) set_bit(NFS_STATE_POSIX_LOCKS, &state->flags); + if (opendata->o_res.rflags & NFS4_OPEN_RESULT_MAY_NOTIFY_LOCK) + set_bit(NFS_STATE_MAY_NOTIFY_LOCK, &state->flags); dentry = opendata->dentry; if (d_really_is_negative(dentry)) { @@ -6230,7 +6232,7 @@ nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request) { struct nfs_open_context *ctx; struct nfs4_state *state; - unsigned long timeout = NFS4_LOCK_MINTIMEOUT; + unsigned long timeout; int status; /* verify open state */ @@ -6279,6 +6281,9 @@ nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request) if (status != 0) return status; + timeout = test_bit(NFS_STATE_MAY_NOTIFY_LOCK, &state->flags) ? + NFS4_LOCK_MAXTIMEOUT : NFS4_LOCK_MINTIMEOUT; + do { struct nfs4_lock_state *lsp = request->fl_u.nfs4_fl.owner; struct inode *inode = lsp->ls_state->inode;
If it does, then always have the client sleep for the max time before repolling for the lock. Signed-off-by: Jeff Layton <jlayton@redhat.com> --- fs/nfs/nfs4_fs.h | 1 + fs/nfs/nfs4proc.c | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-)