public inbox for linux-nfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/8] What's in the 'bugfixes' branch of the NFS client git tree
@ 2010-01-25 21:57 Trond Myklebust
       [not found] ` <20100125215734.14716.19614.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
  2010-01-25 22:39 ` [PATCH 0/8] What's in the 'bugfixes' branch of the NFS client git tree Chuck Lever
  0 siblings, 2 replies; 10+ messages in thread
From: Trond Myklebust @ 2010-01-25 21:57 UTC (permalink / raw)
  To: linux-nfs

I've committed the following patches to the 'bugfixes' branch for
merging into mainline before the release of 2.6.33. Please review

Cheers
  Trond

---

David Howells (1):
      NFS: Avoid warnings when CONFIG_NFS_V4=n

H Hartley Sweeten (1):
      NFS: Make nfs_commitdata_release static

Trond Myklebust (6):
      NFS: Ensure that we handle NFS4ERR_STALE_STATEID correctly
      NFSv4.1: Don't call nfs4_schedule_state_recovery() unnecessarily
      NFSv4: Don't allow posix locking against servers that don't support it
      NFSv4: Ensure that the NFSv4 locking can recover from stateid errors
      NFS: Try to commit unstable writes in nfs_release_page()
      NFS: Fix a reference leak in nfs_wb_cancel_page()


 fs/nfs/file.c      |    2 +
 fs/nfs/nfs4_fs.h   |    2 +
 fs/nfs/nfs4proc.c  |   78 +++++++++++++++++++++++++++++++++++++++-------------
 fs/nfs/nfs4state.c |    2 +
 fs/nfs/sysctl.c    |    2 +
 fs/nfs/write.c     |    3 +-
 6 files changed, 67 insertions(+), 22 deletions(-)


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 2/8] NFS: Try to commit unstable writes in nfs_release_page()
       [not found] ` <20100125215734.14716.19614.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
                     ` (4 preceding siblings ...)
  2010-01-25 21:57   ` [PATCH 7/8] NFSv4.1: Don't call nfs4_schedule_state_recovery() unnecessarily Trond Myklebust
@ 2010-01-25 21:57   ` Trond Myklebust
  2010-01-25 21:57   ` [PATCH 8/8] NFS: Ensure that we handle NFS4ERR_STALE_STATEID correctly Trond Myklebust
  2010-01-25 21:57   ` [PATCH 4/8] NFS: Avoid warnings when CONFIG_NFS_V4=n Trond Myklebust
  7 siblings, 0 replies; 10+ messages in thread
From: Trond Myklebust @ 2010-01-25 21:57 UTC (permalink / raw)
  To: linux-nfs

If someone calls nfs_release_page(), we presumably already know that the
page is clean, however it may be holding an unstable write.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: stable@kernel.org
---

 fs/nfs/file.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index 6b89132..63f2071 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -486,6 +486,8 @@ static int nfs_release_page(struct page *page, gfp_t gfp)
 {
 	dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page);
 
+	if (gfp & __GFP_WAIT)
+		nfs_wb_page(page->mapping->host, page);
 	/* If PagePrivate() is set, then the page is not freeable */
 	if (PagePrivate(page))
 		return 0;


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/8] NFS: Make nfs_commitdata_release static
       [not found] ` <20100125215734.14716.19614.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
  2010-01-25 21:57   ` [PATCH 5/8] NFSv4: Ensure that the NFSv4 locking can recover from stateid errors Trond Myklebust
  2010-01-25 21:57   ` [PATCH 1/8] NFS: Fix a reference leak in nfs_wb_cancel_page() Trond Myklebust
@ 2010-01-25 21:57   ` Trond Myklebust
  2010-01-25 21:57   ` [PATCH 6/8] NFSv4: Don't allow posix locking against servers that don't support it Trond Myklebust
                     ` (4 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Trond Myklebust @ 2010-01-25 21:57 UTC (permalink / raw)
  To: linux-nfs

From: H Hartley Sweeten <hartleys-3FF4nKcrg1dE2c76skzGb0EOCMrvLtNR@public.gmane.org>

The symbol nfs_commitdata_release is only used locally
in this file. Make it static to prevent the following sparse warning:

warning: symbol 'nfs_commitdata_release' was not declared. Should it be static?

Signed-off-by: H Hartley Sweeten <hsweeten-3FF4nKcrg1dE2c76skzGb0EOCMrvLtNR@public.gmane.org>
Cc: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
---

 fs/nfs/write.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index dac8d76..7b54b8b 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -1233,7 +1233,7 @@ int nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)
 
 
 #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
-void nfs_commitdata_release(void *data)
+static void nfs_commitdata_release(void *data)
 {
 	struct nfs_write_data *wdata = data;
 


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 1/8] NFS: Fix a reference leak in nfs_wb_cancel_page()
       [not found] ` <20100125215734.14716.19614.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
  2010-01-25 21:57   ` [PATCH 5/8] NFSv4: Ensure that the NFSv4 locking can recover from stateid errors Trond Myklebust
@ 2010-01-25 21:57   ` Trond Myklebust
  2010-01-25 21:57   ` [PATCH 3/8] NFS: Make nfs_commitdata_release static Trond Myklebust
                     ` (5 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Trond Myklebust @ 2010-01-25 21:57 UTC (permalink / raw)
  To: linux-nfs

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: stable@kernel.org
---

 fs/nfs/write.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index d171696..dac8d76 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -1541,6 +1541,7 @@ int nfs_wb_page_cancel(struct inode *inode, struct page *page)
 			break;
 		}
 		ret = nfs_wait_on_request(req);
+		nfs_release_request(req);
 		if (ret < 0)
 			goto out;
 	}


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 5/8] NFSv4: Ensure that the NFSv4 locking can recover from stateid errors
       [not found] ` <20100125215734.14716.19614.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
@ 2010-01-25 21:57   ` Trond Myklebust
  2010-01-25 21:57   ` [PATCH 1/8] NFS: Fix a reference leak in nfs_wb_cancel_page() Trond Myklebust
                     ` (6 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Trond Myklebust @ 2010-01-25 21:57 UTC (permalink / raw)
  To: linux-nfs

In most cases, we just want to mark the lock_stateid sequence id as being
uninitialised.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: stable@kernel.org
---

 fs/nfs/nfs4proc.c |   19 +++++++++++++++++++
 1 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 198d51d..0b68238 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -4088,6 +4088,22 @@ static const struct rpc_call_ops nfs4_recover_lock_ops = {
 	.rpc_release = nfs4_lock_release,
 };
 
+static void nfs4_handle_setlk_error(struct nfs_server *server, struct nfs4_lock_state *lsp, int new_lock_owner, int error)
+{
+	struct nfs_client *clp = server->nfs_client;
+	struct nfs4_state *state = lsp->ls_state;
+
+	switch (error) {
+	case -NFS4ERR_ADMIN_REVOKED:
+	case -NFS4ERR_BAD_STATEID:
+	case -NFS4ERR_EXPIRED:
+		if (new_lock_owner != 0 ||
+		   (lsp->ls_flags & NFS_LOCK_INITIALIZED) != 0)
+			nfs4_state_mark_reclaim_nograce(clp, state);
+		lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED;
+	};
+}
+
 static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int recovery_type)
 {
 	struct nfs4_lockdata *data;
@@ -4126,6 +4142,9 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
 	ret = nfs4_wait_for_completion_rpc_task(task);
 	if (ret == 0) {
 		ret = data->rpc_status;
+		if (ret)
+			nfs4_handle_setlk_error(data->server, data->lsp,
+					data->arg.new_lock_owner, ret);
 	} else
 		data->cancelled = 1;
 	rpc_put_task(task);


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 4/8] NFS: Avoid warnings when CONFIG_NFS_V4=n
       [not found] ` <20100125215734.14716.19614.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
                     ` (6 preceding siblings ...)
  2010-01-25 21:57   ` [PATCH 8/8] NFS: Ensure that we handle NFS4ERR_STALE_STATEID correctly Trond Myklebust
@ 2010-01-25 21:57   ` Trond Myklebust
  7 siblings, 0 replies; 10+ messages in thread
From: Trond Myklebust @ 2010-01-25 21:57 UTC (permalink / raw)
  To: linux-nfs

From: David Howells <dhowells@redhat.com>

Avoid the following warnings when CONFIG_NFS_V4=n:

	fs/nfs/sysctl.c:19: warning: unused variable `nfs_set_port_max'
	fs/nfs/sysctl.c:18: warning: unused variable `nfs_set_port_min'

by making those variables contingent on NFSv4 being configured.

Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
---

 fs/nfs/sysctl.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/fs/nfs/sysctl.c b/fs/nfs/sysctl.c
index 70e1fbb..ad4d2e7 100644
--- a/fs/nfs/sysctl.c
+++ b/fs/nfs/sysctl.c
@@ -15,8 +15,10 @@
 
 #include "callback.h"
 
+#ifdef CONFIG_NFS_V4
 static const int nfs_set_port_min = 0;
 static const int nfs_set_port_max = 65535;
+#endif
 static struct ctl_table_header *nfs_callback_sysctl_table;
 
 static ctl_table nfs_cb_sysctls[] = {


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 8/8] NFS: Ensure that we handle NFS4ERR_STALE_STATEID correctly
       [not found] ` <20100125215734.14716.19614.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
                     ` (5 preceding siblings ...)
  2010-01-25 21:57   ` [PATCH 2/8] NFS: Try to commit unstable writes in nfs_release_page() Trond Myklebust
@ 2010-01-25 21:57   ` Trond Myklebust
  2010-01-25 21:57   ` [PATCH 4/8] NFS: Avoid warnings when CONFIG_NFS_V4=n Trond Myklebust
  7 siblings, 0 replies; 10+ messages in thread
From: Trond Myklebust @ 2010-01-25 21:57 UTC (permalink / raw)
  To: linux-nfs

Even if the server is crazy, we should be able to mark the stateid as being
bad, to ensure it gets recovered.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
---

 fs/nfs/nfs4_fs.h   |    1 +
 fs/nfs/nfs4proc.c  |   44 +++++++++++++++++++++++++++++++-------------
 fs/nfs/nfs4state.c |    2 +-
 3 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
index ea2f41b..0c6fda3 100644
--- a/fs/nfs/nfs4_fs.h
+++ b/fs/nfs/nfs4_fs.h
@@ -278,6 +278,7 @@ extern void nfs4_state_set_mode_locked(struct nfs4_state *, fmode_t);
 extern void nfs4_schedule_state_recovery(struct nfs_client *);
 extern void nfs4_schedule_state_manager(struct nfs_client *);
 extern int nfs4_state_mark_reclaim_nograce(struct nfs_client *clp, struct nfs4_state *state);
+extern int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state);
 extern void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags);
 extern void nfs4_put_lock_state(struct nfs4_lock_state *lsp);
 extern int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl);
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index afbfe67..375f0fa 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -249,14 +249,14 @@ static int nfs4_handle_exception(const struct nfs_server *server, int errorcode,
 			if (state == NULL)
 				break;
 			nfs4_state_mark_reclaim_nograce(clp, state);
-		case -NFS4ERR_STALE_CLIENTID:
+			goto do_state_recovery;
 		case -NFS4ERR_STALE_STATEID:
+			if (state == NULL)
+				break;
+			nfs4_state_mark_reclaim_reboot(clp, state);
+		case -NFS4ERR_STALE_CLIENTID:
 		case -NFS4ERR_EXPIRED:
-			nfs4_schedule_state_recovery(clp);
-			ret = nfs4_wait_clnt_recover(clp);
-			if (ret == 0)
-				exception->retry = 1;
-			break;
+			goto do_state_recovery;
 #if defined(CONFIG_NFS_V4_1)
 		case -NFS4ERR_BADSESSION:
 		case -NFS4ERR_BADSLOT:
@@ -289,6 +289,12 @@ static int nfs4_handle_exception(const struct nfs_server *server, int errorcode,
 	}
 	/* We failed to handle the error */
 	return nfs4_map_errors(ret);
+do_state_recovery:
+	nfs4_schedule_state_recovery(clp);
+	ret = nfs4_wait_clnt_recover(clp);
+	if (ret == 0)
+		exception->retry = 1;
+	return ret;
 }
 
 
@@ -3420,15 +3426,14 @@ _nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server,
 			if (state == NULL)
 				break;
 			nfs4_state_mark_reclaim_nograce(clp, state);
-		case -NFS4ERR_STALE_CLIENTID:
+			goto do_state_recovery;
 		case -NFS4ERR_STALE_STATEID:
+			if (state == NULL)
+				break;
+			nfs4_state_mark_reclaim_reboot(clp, state);
+		case -NFS4ERR_STALE_CLIENTID:
 		case -NFS4ERR_EXPIRED:
-			rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL);
-			nfs4_schedule_state_recovery(clp);
-			if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0)
-				rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task);
-			task->tk_status = 0;
-			return -EAGAIN;
+			goto do_state_recovery;
 #if defined(CONFIG_NFS_V4_1)
 		case -NFS4ERR_BADSESSION:
 		case -NFS4ERR_BADSLOT:
@@ -3456,6 +3461,13 @@ _nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server,
 	}
 	task->tk_status = nfs4_map_errors(task->tk_status);
 	return 0;
+do_state_recovery:
+	rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL);
+	nfs4_schedule_state_recovery(clp);
+	if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0)
+		rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task);
+	task->tk_status = 0;
+	return -EAGAIN;
 }
 
 static int
@@ -4099,6 +4111,12 @@ static void nfs4_handle_setlk_error(struct nfs_server *server, struct nfs4_lock_
 		   (lsp->ls_flags & NFS_LOCK_INITIALIZED) != 0)
 			nfs4_state_mark_reclaim_nograce(clp, state);
 		lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED;
+		break;
+	case -NFS4ERR_STALE_STATEID:
+		if (new_lock_owner != 0 ||
+		    (lsp->ls_flags & NFS_LOCK_INITIALIZED) != 0)
+			nfs4_state_mark_reclaim_reboot(clp, state);
+		lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED;
 	};
 }
 
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 6d263ed..c1e2733 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -901,7 +901,7 @@ void nfs4_schedule_state_recovery(struct nfs_client *clp)
 	nfs4_schedule_state_manager(clp);
 }
 
-static int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state)
+int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state)
 {
 
 	set_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags);


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 7/8] NFSv4.1: Don't call nfs4_schedule_state_recovery() unnecessarily
       [not found] ` <20100125215734.14716.19614.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
                     ` (3 preceding siblings ...)
  2010-01-25 21:57   ` [PATCH 6/8] NFSv4: Don't allow posix locking against servers that don't support it Trond Myklebust
@ 2010-01-25 21:57   ` Trond Myklebust
  2010-01-25 21:57   ` [PATCH 2/8] NFS: Try to commit unstable writes in nfs_release_page() Trond Myklebust
                     ` (2 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Trond Myklebust @ 2010-01-25 21:57 UTC (permalink / raw)
  To: linux-nfs

Currently, nfs4_handle_exception() will call it twice if called with an
error of -NFS4ERR_STALE_CLIENTID, -NFS4ERR_STALE_STATEID or
-NFS4ERR_EXPIRED.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
---

 fs/nfs/nfs4proc.c |    8 ++------
 1 files changed, 2 insertions(+), 6 deletions(-)

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index be044b5..afbfe67 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -256,12 +256,8 @@ static int nfs4_handle_exception(const struct nfs_server *server, int errorcode,
 			ret = nfs4_wait_clnt_recover(clp);
 			if (ret == 0)
 				exception->retry = 1;
-#if !defined(CONFIG_NFS_V4_1)
 			break;
-#else /* !defined(CONFIG_NFS_V4_1) */
-			if (!nfs4_has_session(server->nfs_client))
-				break;
-			/* FALLTHROUGH */
+#if defined(CONFIG_NFS_V4_1)
 		case -NFS4ERR_BADSESSION:
 		case -NFS4ERR_BADSLOT:
 		case -NFS4ERR_BAD_HIGH_SLOT:
@@ -274,7 +270,7 @@ static int nfs4_handle_exception(const struct nfs_server *server, int errorcode,
 			nfs4_schedule_state_recovery(clp);
 			exception->retry = 1;
 			break;
-#endif /* !defined(CONFIG_NFS_V4_1) */
+#endif /* defined(CONFIG_NFS_V4_1) */
 		case -NFS4ERR_FILE_OPEN:
 			if (exception->timeout > HZ) {
 				/* We have retried a decent amount, time to


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 6/8] NFSv4: Don't allow posix locking against servers that don't support it
       [not found] ` <20100125215734.14716.19614.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
                     ` (2 preceding siblings ...)
  2010-01-25 21:57   ` [PATCH 3/8] NFS: Make nfs_commitdata_release static Trond Myklebust
@ 2010-01-25 21:57   ` Trond Myklebust
  2010-01-25 21:57   ` [PATCH 7/8] NFSv4.1: Don't call nfs4_schedule_state_recovery() unnecessarily Trond Myklebust
                     ` (3 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Trond Myklebust @ 2010-01-25 21:57 UTC (permalink / raw)
  To: linux-nfs

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: stable@kernel.org
---

 fs/nfs/nfs4_fs.h  |    1 +
 fs/nfs/nfs4proc.c |    7 ++++++-
 2 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
index 865265b..ea2f41b 100644
--- a/fs/nfs/nfs4_fs.h
+++ b/fs/nfs/nfs4_fs.h
@@ -146,6 +146,7 @@ enum {
 	NFS_O_RDWR_STATE,		/* OPEN stateid has read/write state */
 	NFS_STATE_RECLAIM_REBOOT,	/* OPEN stateid server rebooted */
 	NFS_STATE_RECLAIM_NOGRACE,	/* OPEN stateid needs to recover state */
+	NFS_STATE_POSIX_LOCKS,		/* Posix locks are supported */
 };
 
 struct nfs4_state {
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 0b68238..be044b5 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -1658,6 +1658,8 @@ static int _nfs4_do_open(struct inode *dir, struct path *path, fmode_t fmode, in
 	status = PTR_ERR(state);
 	if (IS_ERR(state))
 		goto err_opendata_put;
+	if ((opendata->o_res.rflags & NFS4_OPEN_RESULT_LOCKTYPE_POSIX) != 0)
+		set_bit(NFS_STATE_POSIX_LOCKS, &state->flags);
 	nfs4_opendata_put(opendata);
 	nfs4_put_state_owner(sp);
 	*res = state;
@@ -4200,8 +4202,11 @@ static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock
 {
 	struct nfs_inode *nfsi = NFS_I(state->inode);
 	unsigned char fl_flags = request->fl_flags;
-	int status;
+	int status = -ENOLCK;
 
+	if ((fl_flags & FL_POSIX) &&
+			!test_bit(NFS_STATE_POSIX_LOCKS, &state->flags))
+		goto out;
 	/* Is this a delegated open? */
 	status = nfs4_set_lock_state(state, request);
 	if (status != 0)


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 0/8] What's in the 'bugfixes' branch of the NFS client git tree
  2010-01-25 21:57 [PATCH 0/8] What's in the 'bugfixes' branch of the NFS client git tree Trond Myklebust
       [not found] ` <20100125215734.14716.19614.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
@ 2010-01-25 22:39 ` Chuck Lever
  1 sibling, 0 replies; 10+ messages in thread
From: Chuck Lever @ 2010-01-25 22:39 UTC (permalink / raw)
  To: Trond Myklebust; +Cc: linux-nfs

On Jan 25, 2010, at 4:57 PM, Trond Myklebust wrote:
> I've committed the following patches to the 'bugfixes' branch for
> merging into mainline before the release of 2.6.33. Please review

Reviewed-by: Chuck Lever <chuck.lever@oracle.com>

I checked for mechanical problems.  The semantics of NFSv4 locking is  
beyond me, but fortunately the changes looked mostly obvious.

> Cheers
>  Trond
>
> ---
>
> David Howells (1):
>      NFS: Avoid warnings when CONFIG_NFS_V4=n
>
> H Hartley Sweeten (1):
>      NFS: Make nfs_commitdata_release static
>
> Trond Myklebust (6):
>      NFS: Ensure that we handle NFS4ERR_STALE_STATEID correctly
>      NFSv4.1: Don't call nfs4_schedule_state_recovery() unnecessarily
>      NFSv4: Don't allow posix locking against servers that don't  
> support it
>      NFSv4: Ensure that the NFSv4 locking can recover from stateid  
> errors
>      NFS: Try to commit unstable writes in nfs_release_page()
>      NFS: Fix a reference leak in nfs_wb_cancel_page()
>
>
> fs/nfs/file.c      |    2 +
> fs/nfs/nfs4_fs.h   |    2 +
> fs/nfs/nfs4proc.c  |   78 ++++++++++++++++++++++++++++++++++++++ 
> +-------------
> fs/nfs/nfs4state.c |    2 +
> fs/nfs/sysctl.c    |    2 +
> fs/nfs/write.c     |    3 +-
> 6 files changed, 67 insertions(+), 22 deletions(-)
>
> --
> 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

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com




^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2010-01-25 22:40 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-01-25 21:57 [PATCH 0/8] What's in the 'bugfixes' branch of the NFS client git tree Trond Myklebust
     [not found] ` <20100125215734.14716.19614.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2010-01-25 21:57   ` [PATCH 5/8] NFSv4: Ensure that the NFSv4 locking can recover from stateid errors Trond Myklebust
2010-01-25 21:57   ` [PATCH 1/8] NFS: Fix a reference leak in nfs_wb_cancel_page() Trond Myklebust
2010-01-25 21:57   ` [PATCH 3/8] NFS: Make nfs_commitdata_release static Trond Myklebust
2010-01-25 21:57   ` [PATCH 6/8] NFSv4: Don't allow posix locking against servers that don't support it Trond Myklebust
2010-01-25 21:57   ` [PATCH 7/8] NFSv4.1: Don't call nfs4_schedule_state_recovery() unnecessarily Trond Myklebust
2010-01-25 21:57   ` [PATCH 2/8] NFS: Try to commit unstable writes in nfs_release_page() Trond Myklebust
2010-01-25 21:57   ` [PATCH 8/8] NFS: Ensure that we handle NFS4ERR_STALE_STATEID correctly Trond Myklebust
2010-01-25 21:57   ` [PATCH 4/8] NFS: Avoid warnings when CONFIG_NFS_V4=n Trond Myklebust
2010-01-25 22:39 ` [PATCH 0/8] What's in the 'bugfixes' branch of the NFS client git tree Chuck Lever

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox