Skip to content

Commit

Permalink
NFSv4.1: Don't confuse CREATE_SESSION arguments and results
Browse files Browse the repository at this point in the history
Don't store the target request and response sizes in the same
variables used to store the server's replies to those targets.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
  • Loading branch information
Trond Myklebust authored and Trond Myklebust committed Nov 21, 2012
1 parent 5df904a commit ae72ae6
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 13 deletions.
30 changes: 17 additions & 13 deletions fs/nfs/nfs4proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -5807,8 +5807,8 @@ void nfs4_destroy_session(struct nfs4_session *session)
static void nfs4_init_channel_attrs(struct nfs41_create_session_args *args)
{
struct nfs4_session *session = args->client->cl_session;
unsigned int mxrqst_sz = session->fc_attrs.max_rqst_sz,
mxresp_sz = session->fc_attrs.max_resp_sz;
unsigned int mxrqst_sz = session->fc_target_max_rqst_sz,
mxresp_sz = session->fc_target_max_resp_sz;

if (mxrqst_sz == 0)
mxrqst_sz = NFS_MAX_FILE_IO_SIZE;
Expand Down Expand Up @@ -6015,24 +6015,28 @@ int nfs4_init_session(struct nfs_server *server)
{
struct nfs_client *clp = server->nfs_client;
struct nfs4_session *session;
unsigned int rsize, wsize;
unsigned int target_max_rqst_sz = NFS_MAX_FILE_IO_SIZE;
unsigned int target_max_resp_sz = NFS_MAX_FILE_IO_SIZE;

if (!nfs4_has_session(clp))
return 0;

if (server->rsize != 0)
target_max_resp_sz = server->rsize;
target_max_resp_sz += nfs41_maxread_overhead;

if (server->wsize != 0)
target_max_rqst_sz = server->wsize;
target_max_rqst_sz += nfs41_maxwrite_overhead;

session = clp->cl_session;
spin_lock(&clp->cl_lock);
if (test_and_clear_bit(NFS4_SESSION_INITING, &session->session_state)) {

rsize = server->rsize;
if (rsize == 0)
rsize = NFS_MAX_FILE_IO_SIZE;
wsize = server->wsize;
if (wsize == 0)
wsize = NFS_MAX_FILE_IO_SIZE;

session->fc_attrs.max_rqst_sz = wsize + nfs41_maxwrite_overhead;
session->fc_attrs.max_resp_sz = rsize + nfs41_maxread_overhead;
/* Initialise targets and channel attributes */
session->fc_target_max_rqst_sz = target_max_rqst_sz;
session->fc_attrs.max_rqst_sz = target_max_rqst_sz;
session->fc_target_max_resp_sz = target_max_resp_sz;
session->fc_attrs.max_resp_sz = target_max_resp_sz;
}
spin_unlock(&clp->cl_lock);

Expand Down
3 changes: 3 additions & 0 deletions include/linux/nfs_fs_sb.h
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,9 @@ struct nfs4_session {
struct nfs4_channel_attrs bc_attrs;
struct nfs4_slot_table bc_slot_table;
struct nfs_client *clp;
/* Create session arguments */
unsigned int fc_target_max_rqst_sz;
unsigned int fc_target_max_resp_sz;
};

#endif /* CONFIG_NFS_V4 */
Expand Down

0 comments on commit ae72ae6

Please sign in to comment.