Adding a flags argument allows flags such as RPC_TASK_NO_ROUND_ROBIN to be passed to rpc_run_task(). This is needed when calling nfs4_call_sync() for state-management commands. Rather than adding a flags argument to nfs4_call_sync(), add a new nfs4_call_sync_state(), which passes RPC_TASK_NO_ROUND_ROBIN to nfs4_call_sync_sequence(). A previous commit incorrectly passed RPC_TASK_NO_ROUND_ROBIN in the last arg to nfs4_call_sync(), where that arg is not a general flags argument. This patch fixes that by changing those call-sites to call the new nfs4_call_sync_state() Repored-by: Anna Schumaker <Anna.Schumaker@xxxxxxxxxx> Fixes: 5a0c257f8e0f ("NFS: send state management on a single connection.") Signed-off-by: NeilBrown <neilb@xxxxxxxx> --- fs/nfs/nfs4proc.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 39896afc6edf..dd2725fe7a74 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -1077,7 +1077,8 @@ static int nfs4_call_sync_sequence(struct rpc_clnt *clnt, struct nfs_server *server, struct rpc_message *msg, struct nfs4_sequence_args *args, - struct nfs4_sequence_res *res) + struct nfs4_sequence_res *res, + int flags) { int ret; struct rpc_task *task; @@ -1091,7 +1092,8 @@ static int nfs4_call_sync_sequence(struct rpc_clnt *clnt, .rpc_client = clnt, .rpc_message = msg, .callback_ops = clp->cl_mvops->call_sync_ops, - .callback_data = &data + .callback_data = &data, + .flags = flags, }; task = rpc_run_task(&task_setup); @@ -1112,7 +1114,20 @@ int nfs4_call_sync(struct rpc_clnt *clnt, int cache_reply) { nfs4_init_sequence(args, res, cache_reply, 0); - return nfs4_call_sync_sequence(clnt, server, msg, args, res); + return nfs4_call_sync_sequence(clnt, server, msg, args, res, 0); +} + +int nfs4_call_sync_state(struct rpc_clnt *clnt, + struct nfs_server *server, + struct rpc_message *msg, + struct nfs4_sequence_args *args, + struct nfs4_sequence_res *res, + int cache_reply) +{ + /* State management commands are never round-robined */ + nfs4_init_sequence(args, res, cache_reply, 0); + return nfs4_call_sync_sequence(clnt, server, msg, args, res, + RPC_TASK_NO_ROUND_ROBIN); } static void @@ -7387,7 +7402,7 @@ static int _nfs40_proc_get_locations(struct inode *inode, nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 1); status = nfs4_call_sync_sequence(clnt, server, &msg, - &args.seq_args, &res.seq_res); + &args.seq_args, &res.seq_res, 0); if (status) return status; @@ -7440,7 +7455,7 @@ static int _nfs41_proc_get_locations(struct inode *inode, nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 1); status = nfs4_call_sync_sequence(clnt, server, &msg, - &args.seq_args, &res.seq_res); + &args.seq_args, &res.seq_res, 0); if (status == NFS4_OK && res.seq_res.sr_status_flags & SEQ4_STATUS_LEASE_MOVED) status = -NFS4ERR_LEASE_MOVED; @@ -7529,7 +7544,7 @@ static int _nfs40_proc_fsid_present(struct inode *inode, const struct cred *cred nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 1); status = nfs4_call_sync_sequence(clnt, server, &msg, - &args.seq_args, &res.seq_res); + &args.seq_args, &res.seq_res, 0); nfs_free_fhandle(res.fh); if (status) return status; @@ -7570,7 +7585,7 @@ static int _nfs41_proc_fsid_present(struct inode *inode, const struct cred *cred nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 1); status = nfs4_call_sync_sequence(clnt, server, &msg, - &args.seq_args, &res.seq_res); + &args.seq_args, &res.seq_res, 0); nfs_free_fhandle(res.fh); if (status == NFS4_OK && res.seq_res.sr_status_flags & SEQ4_STATUS_LEASE_MOVED) @@ -7656,8 +7671,8 @@ static int _nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct nfs4_state_protect(NFS_SERVER(dir)->nfs_client, NFS_SP4_MACH_CRED_SECINFO, &clnt, &msg); - status = nfs4_call_sync(clnt, NFS_SERVER(dir), &msg, &args.seq_args, - &res.seq_res, RPC_TASK_NO_ROUND_ROBIN); + status = nfs4_call_sync_state(clnt, NFS_SERVER(dir), &msg, &args.seq_args, + &res.seq_res, 0); dprintk("NFS reply secinfo: %d\n", status); put_cred(cred); @@ -9357,8 +9372,8 @@ _nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle, } dprintk("--> %s\n", __func__); - status = nfs4_call_sync(clnt, server, &msg, &args.seq_args, - &res.seq_res, RPC_TASK_NO_ROUND_ROBIN); + status = nfs4_call_sync_state(clnt, server, &msg, &args.seq_args, + &res.seq_res, 0); dprintk("<-- %s status=%d\n", __func__, status); put_cred(cred); @@ -9497,7 +9512,7 @@ static int _nfs41_test_stateid(struct nfs_server *server, dprintk("NFS call test_stateid %p\n", stateid); nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 1); status = nfs4_call_sync_sequence(rpc_client, server, &msg, - &args.seq_args, &res.seq_res); + &args.seq_args, &res.seq_res, 0); if (status != NFS_OK) { dprintk("NFS reply test_stateid: failed, %d\n", status); return status; -- 2.14.0.rc0.dirty
Attachment:
signature.asc
Description: PGP signature