* [PATCH V2 0/4] nfs4.0: Refetch lease_time after clientID reset
@ 2019-07-07 19:26 Donald Buczek
2019-07-07 19:26 ` [PATCH V2 1/4] nfs: Fix copy-and-paste error in debug message Donald Buczek
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Donald Buczek @ 2019-07-07 19:26 UTC (permalink / raw)
To: linux-nfs, trond.myklebust, anna.schumaker; +Cc: Donald Buczek
V2: Make sure, code doesn't depend on CONFIG_NFS_V4_1. I've scattered
#endifs and #ifdefs into the source instead of moving code into other
areas to be more friendly to git. Tell me if you prefer otherwise.
Currently, nfs mounts with vers=4.0 do not pick up a updated
lease_time after a restart of the nfs server. This was discussed in
the thread "4.0 client and server restart with decreased lease time" on
linux-nfs [1].
This patch set fixes the issue for nsf4.0 clients so that hey behave as
nfs4.1 and nfs4.2 clients do. After a new clientID is established, the
lease_time is re-fetched and used.
Tested with
CONFIG_NFS_V4=m CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y : mount
CONFIG_NFS_V4=m CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y : mount vers=4.0
CONFIG_NFS_V4=m CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=n : mount
CONFIG_NFS_V4=m CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=n : mount vers=4.0
CONFIG_NFS_V4=m CONFIG_NFS_V4_1=n CONFIG_NFS_V4_2=n : mount
and several restarts of the nfs server with changed leases times, which
were picked up by the client.
[1] https://marc.info/?t=154954022700002&r=1&w=2
Donald Buczek (4):
nfs: Fix copy-and-paste error in debug message
nfs4: Make nfs4_proc_get_lease_time available for nfs4.0
nfs4: Rename nfs41_setup_state_renewal
nfs4.0: Refetch lease_time after clientid update
fs/nfs/nfs4_fs.h | 4 ++--
fs/nfs/nfs4proc.c | 6 +++++-
fs/nfs/nfs4state.c | 46 +++++++++++++++++++++++-----------------------
fs/nfs/nfs4xdr.c | 14 ++++++++++++--
4 files changed, 42 insertions(+), 28 deletions(-)
--
2.22.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH V2 1/4] nfs: Fix copy-and-paste error in debug message
2019-07-07 19:26 [PATCH V2 0/4] nfs4.0: Refetch lease_time after clientID reset Donald Buczek
@ 2019-07-07 19:26 ` Donald Buczek
2019-07-07 19:26 ` [PATCH V2 2/4] nfs4: Make nfs4_proc_get_lease_time available for nfs4.0 Donald Buczek
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Donald Buczek @ 2019-07-07 19:26 UTC (permalink / raw)
To: linux-nfs, trond.myklebust, anna.schumaker; +Cc: Donald Buczek
The debug message of decode_attr_lease_time incorrectly
says "file size". Fix it to "lease time".
Signed-off-by: Donald Buczek <buczek@molgen.mpg.de>
---
fs/nfs/nfs4xdr.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 602446158bfb..6d51877cd383 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -3427,7 +3427,7 @@ static int decode_attr_lease_time(struct xdr_stream *xdr, uint32_t *bitmap, uint
*res = be32_to_cpup(p);
bitmap[0] &= ~FATTR4_WORD0_LEASE_TIME;
}
- dprintk("%s: file size=%u\n", __func__, (unsigned int)*res);
+ dprintk("%s: lease time=%u\n", __func__, (unsigned int)*res);
return 0;
}
--
2.22.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH V2 2/4] nfs4: Make nfs4_proc_get_lease_time available for nfs4.0
2019-07-07 19:26 [PATCH V2 0/4] nfs4.0: Refetch lease_time after clientID reset Donald Buczek
2019-07-07 19:26 ` [PATCH V2 1/4] nfs: Fix copy-and-paste error in debug message Donald Buczek
@ 2019-07-07 19:26 ` Donald Buczek
2019-07-07 19:26 ` [PATCH V2 3/4] nfs4: Rename nfs41_setup_state_renewal Donald Buczek
2019-07-07 19:26 ` [PATCH V2 4/4] nfs4.0: Refetch lease_time after clientid update Donald Buczek
3 siblings, 0 replies; 5+ messages in thread
From: Donald Buczek @ 2019-07-07 19:26 UTC (permalink / raw)
To: linux-nfs, trond.myklebust, anna.schumaker; +Cc: Donald Buczek
Compile nfs4_proc_get_lease_time, enc_get_lease_time and
dec_get_lease_time for nfs4.0. Use nfs4_sequence_done instead of
nfs41_sequence_done in nfs4_proc_get_lease_time,
Signed-off-by: Donald Buczek <buczek@molgen.mpg.de>
---
fs/nfs/nfs4_fs.h | 4 ++--
fs/nfs/nfs4proc.c | 6 +++++-
fs/nfs/nfs4xdr.c | 12 +++++++++++-
3 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
index 8a38a254f516..d778dad9a75e 100644
--- a/fs/nfs/nfs4_fs.h
+++ b/fs/nfs/nfs4_fs.h
@@ -312,12 +312,12 @@ extern int nfs4_set_rw_stateid(nfs4_stateid *stateid,
const struct nfs_lock_context *l_ctx,
fmode_t fmode);
+extern int nfs4_proc_get_lease_time(struct nfs_client *clp,
+ struct nfs_fsinfo *fsinfo);
#if defined(CONFIG_NFS_V4_1)
extern int nfs41_sequence_done(struct rpc_task *, struct nfs4_sequence_res *);
extern int nfs4_proc_create_session(struct nfs_client *, const struct cred *);
extern int nfs4_proc_destroy_session(struct nfs4_session *, const struct cred *);
-extern int nfs4_proc_get_lease_time(struct nfs_client *clp,
- struct nfs_fsinfo *fsinfo);
extern int nfs4_proc_layoutcommit(struct nfs4_layoutcommit_data *data,
bool sync);
extern int nfs4_detect_session_trunking(struct nfs_client *clp,
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 6418cb6c079b..4783db7a1cf3 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -8241,6 +8241,8 @@ int nfs4_destroy_clientid(struct nfs_client *clp)
return ret;
}
+#endif /* CONFIG_NFS_V4_1 */
+
struct nfs4_get_lease_time_data {
struct nfs4_get_lease_time_args *args;
struct nfs4_get_lease_time_res *res;
@@ -8273,7 +8275,7 @@ static void nfs4_get_lease_time_done(struct rpc_task *task, void *calldata)
(struct nfs4_get_lease_time_data *)calldata;
dprintk("--> %s\n", __func__);
- if (!nfs41_sequence_done(task, &data->res->lr_seq_res))
+ if (!nfs4_sequence_done(task, &data->res->lr_seq_res))
return;
switch (task->tk_status) {
case -NFS4ERR_DELAY:
@@ -8331,6 +8333,8 @@ int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo)
return status;
}
+#ifdef CONFIG_NFS_V4_1
+
/*
* Initialize the values to be used by the client in CREATE_SESSION
* If nfs4_init_session set the fore channel request and response sizes,
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 6d51877cd383..07f28f6d0f31 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -837,6 +837,7 @@ static int decode_layoutget(struct xdr_stream *xdr, struct rpc_rqst *req,
#define NFS4_dec_sequence_sz \
(compound_decode_hdr_maxsz + \
decode_sequence_maxsz)
+#endif
#define NFS4_enc_get_lease_time_sz (compound_encode_hdr_maxsz + \
encode_sequence_maxsz + \
encode_putrootfh_maxsz + \
@@ -845,6 +846,7 @@ static int decode_layoutget(struct xdr_stream *xdr, struct rpc_rqst *req,
decode_sequence_maxsz + \
decode_putrootfh_maxsz + \
decode_fsinfo_maxsz)
+#if defined(CONFIG_NFS_V4_1)
#define NFS4_enc_reclaim_complete_sz (compound_encode_hdr_maxsz + \
encode_sequence_maxsz + \
encode_reclaim_complete_maxsz)
@@ -2957,6 +2959,8 @@ static void nfs4_xdr_enc_sequence(struct rpc_rqst *req, struct xdr_stream *xdr,
encode_nops(&hdr);
}
+#endif
+
/*
* a GET_LEASE_TIME request
*/
@@ -2977,6 +2981,8 @@ static void nfs4_xdr_enc_get_lease_time(struct rpc_rqst *req,
encode_nops(&hdr);
}
+#ifdef CONFIG_NFS_V4_1
+
/*
* a RECLAIM_COMPLETE request
*/
@@ -7122,6 +7128,8 @@ static int nfs4_xdr_dec_sequence(struct rpc_rqst *rqstp,
return status;
}
+#endif
+
/*
* Decode GET_LEASE_TIME response
*/
@@ -7143,6 +7151,8 @@ static int nfs4_xdr_dec_get_lease_time(struct rpc_rqst *rqstp,
return status;
}
+#ifdef CONFIG_NFS_V4_1
+
/*
* Decode RECLAIM_COMPLETE response
*/
@@ -7551,7 +7561,7 @@ const struct rpc_procinfo nfs4_procedures[] = {
PROC41(CREATE_SESSION, enc_create_session, dec_create_session),
PROC41(DESTROY_SESSION, enc_destroy_session, dec_destroy_session),
PROC41(SEQUENCE, enc_sequence, dec_sequence),
- PROC41(GET_LEASE_TIME, enc_get_lease_time, dec_get_lease_time),
+ PROC(GET_LEASE_TIME, enc_get_lease_time, dec_get_lease_time),
PROC41(RECLAIM_COMPLETE,enc_reclaim_complete, dec_reclaim_complete),
PROC41(GETDEVICEINFO, enc_getdeviceinfo, dec_getdeviceinfo),
PROC41(LAYOUTGET, enc_layoutget, dec_layoutget),
--
2.22.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH V2 3/4] nfs4: Rename nfs41_setup_state_renewal
2019-07-07 19:26 [PATCH V2 0/4] nfs4.0: Refetch lease_time after clientID reset Donald Buczek
2019-07-07 19:26 ` [PATCH V2 1/4] nfs: Fix copy-and-paste error in debug message Donald Buczek
2019-07-07 19:26 ` [PATCH V2 2/4] nfs4: Make nfs4_proc_get_lease_time available for nfs4.0 Donald Buczek
@ 2019-07-07 19:26 ` Donald Buczek
2019-07-07 19:26 ` [PATCH V2 4/4] nfs4.0: Refetch lease_time after clientid update Donald Buczek
3 siblings, 0 replies; 5+ messages in thread
From: Donald Buczek @ 2019-07-07 19:26 UTC (permalink / raw)
To: linux-nfs, trond.myklebust, anna.schumaker; +Cc: Donald Buczek
The function nfs41_setup_state_renewal is useful to the nfs 4.0 client
as well, so rename the function to nfs4_setup_state_renewal.
Signed-off-by: Donald Buczek <buczek@molgen.mpg.de>
---
fs/nfs/nfs4state.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index e2e3c4f04d3e..778ebfb00d13 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -286,7 +286,7 @@ static int nfs4_begin_drain_session(struct nfs_client *clp)
#if defined(CONFIG_NFS_V4_1)
-static int nfs41_setup_state_renewal(struct nfs_client *clp)
+static int nfs4_setup_state_renewal(struct nfs_client *clp)
{
int status;
struct nfs_fsinfo fsinfo;
@@ -313,7 +313,7 @@ static void nfs41_finish_session_reset(struct nfs_client *clp)
clear_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
/* create_session negotiated new slot table */
clear_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
- nfs41_setup_state_renewal(clp);
+ nfs4_setup_state_renewal(clp);
}
int nfs41_init_clientid(struct nfs_client *clp, const struct cred *cred)
--
2.22.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH V2 4/4] nfs4.0: Refetch lease_time after clientid update
2019-07-07 19:26 [PATCH V2 0/4] nfs4.0: Refetch lease_time after clientID reset Donald Buczek
` (2 preceding siblings ...)
2019-07-07 19:26 ` [PATCH V2 3/4] nfs4: Rename nfs41_setup_state_renewal Donald Buczek
@ 2019-07-07 19:26 ` Donald Buczek
3 siblings, 0 replies; 5+ messages in thread
From: Donald Buczek @ 2019-07-07 19:26 UTC (permalink / raw)
To: linux-nfs, trond.myklebust, anna.schumaker; +Cc: Donald Buczek
RFC 7530 requires us to refetch the lease time attribute once a new
clientID is established. This is already implemented for the
nfs4.1(+) clients by nfs41_init_clientid, which calls
nfs41_finish_session_reset, which calls nfs4_setup_state_renewal.
To make nfs4_setup_state_renewal available for nfs4.0, move it
further to the top of the source file to include it regardles of
CONFIG_NFS_V4_1 and to save a forward declaration.
Call nfs4_setup_state_renewal from nfs4_init_clientid.
Signed-off-by: Donald Buczek <buczek@molgen.mpg.de>
---
fs/nfs/nfs4state.c | 44 ++++++++++++++++++++++----------------------
1 file changed, 22 insertions(+), 22 deletions(-)
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 778ebfb00d13..f32b02c2bc73 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -87,6 +87,27 @@ const nfs4_stateid current_stateid = {
static DEFINE_MUTEX(nfs_clid_init_mutex);
+static int nfs4_setup_state_renewal(struct nfs_client *clp)
+{
+ int status;
+ struct nfs_fsinfo fsinfo;
+ unsigned long now;
+
+ if (!test_bit(NFS_CS_CHECK_LEASE_TIME, &clp->cl_res_state)) {
+ nfs4_schedule_state_renewal(clp);
+ return 0;
+ }
+
+ now = jiffies;
+ status = nfs4_proc_get_lease_time(clp, &fsinfo);
+ if (status == 0) {
+ nfs4_set_lease_period(clp, fsinfo.lease_time * HZ, now);
+ nfs4_schedule_state_renewal(clp);
+ }
+
+ return status;
+}
+
int nfs4_init_clientid(struct nfs_client *clp, const struct cred *cred)
{
struct nfs4_setclientid_res clid = {
@@ -114,7 +135,7 @@ int nfs4_init_clientid(struct nfs_client *clp, const struct cred *cred)
if (status != 0)
goto out;
clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
- nfs4_schedule_state_renewal(clp);
+ nfs4_setup_state_renewal(clp);
out:
return status;
}
@@ -286,27 +307,6 @@ static int nfs4_begin_drain_session(struct nfs_client *clp)
#if defined(CONFIG_NFS_V4_1)
-static int nfs4_setup_state_renewal(struct nfs_client *clp)
-{
- int status;
- struct nfs_fsinfo fsinfo;
- unsigned long now;
-
- if (!test_bit(NFS_CS_CHECK_LEASE_TIME, &clp->cl_res_state)) {
- nfs4_schedule_state_renewal(clp);
- return 0;
- }
-
- now = jiffies;
- status = nfs4_proc_get_lease_time(clp, &fsinfo);
- if (status == 0) {
- nfs4_set_lease_period(clp, fsinfo.lease_time * HZ, now);
- nfs4_schedule_state_renewal(clp);
- }
-
- return status;
-}
-
static void nfs41_finish_session_reset(struct nfs_client *clp)
{
clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
--
2.22.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2019-07-07 19:26 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-07 19:26 [PATCH V2 0/4] nfs4.0: Refetch lease_time after clientID reset Donald Buczek
2019-07-07 19:26 ` [PATCH V2 1/4] nfs: Fix copy-and-paste error in debug message Donald Buczek
2019-07-07 19:26 ` [PATCH V2 2/4] nfs4: Make nfs4_proc_get_lease_time available for nfs4.0 Donald Buczek
2019-07-07 19:26 ` [PATCH V2 3/4] nfs4: Rename nfs41_setup_state_renewal Donald Buczek
2019-07-07 19:26 ` [PATCH V2 4/4] nfs4.0: Refetch lease_time after clientid update Donald Buczek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).