NFSv4.1: Apply session size limits on clone path
nfs4_clone_server() builds a child nfs_server for same-server
automounted submounts but never calls nfs4_session_limit_rwsize()
or nfs4_session_limit_xasize() after nfs_clone_server(). This means
the child mount can end up with rsize/wsize values that exceed the
negotiated session channel limits, causing NFS4ERR_REQ_TOO_BIG and
EIO on servers that enforce tight max_request_size budgets.
Top-level mounts go through nfs4_server_common_setup() which calls
these limiters after nfs_probe_server(). Apply the same clamping on
the clone path for consistency.
Fixes: 2b092175f5 ("NFS: Fix inheritance of the block sizes when automounting")
Cc: stable@vger.kernel.org
Signed-off-by: Tushar Sariya <tushar.97@hotmail.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
515af10044
commit
8c787b286f
3 changed files with 7 additions and 2 deletions
|
|
@ -253,6 +253,8 @@ extern struct nfs_client *nfs4_set_ds_client(struct nfs_server *mds_srv,
|
|||
u32 minor_version);
|
||||
extern struct rpc_clnt *nfs4_find_or_create_ds_client(struct nfs_client *,
|
||||
struct inode *);
|
||||
extern void nfs4_session_limit_rwsize(struct nfs_server *server);
|
||||
extern void nfs4_session_limit_xasize(struct nfs_server *server);
|
||||
extern struct nfs_client *nfs3_set_ds_client(struct nfs_server *mds_srv,
|
||||
const struct sockaddr_storage *ds_addr, int ds_addrlen,
|
||||
int ds_proto, unsigned int ds_timeo,
|
||||
|
|
|
|||
|
|
@ -855,7 +855,7 @@ EXPORT_SYMBOL_GPL(nfs4_set_ds_client);
|
|||
* Limit the mount rsize, wsize and dtsize using negotiated fore
|
||||
* channel attributes.
|
||||
*/
|
||||
static void nfs4_session_limit_rwsize(struct nfs_server *server)
|
||||
void nfs4_session_limit_rwsize(struct nfs_server *server)
|
||||
{
|
||||
struct nfs4_session *sess;
|
||||
u32 server_resp_sz;
|
||||
|
|
@ -878,7 +878,7 @@ static void nfs4_session_limit_rwsize(struct nfs_server *server)
|
|||
/*
|
||||
* Limit xattr sizes using the channel attributes.
|
||||
*/
|
||||
static void nfs4_session_limit_xasize(struct nfs_server *server)
|
||||
void nfs4_session_limit_xasize(struct nfs_server *server)
|
||||
{
|
||||
#ifdef CONFIG_NFS_V4_2
|
||||
struct nfs4_session *sess;
|
||||
|
|
|
|||
|
|
@ -10637,6 +10637,9 @@ static struct nfs_server *nfs4_clone_server(struct nfs_server *source,
|
|||
if (IS_ERR(server))
|
||||
return server;
|
||||
|
||||
nfs4_session_limit_rwsize(server);
|
||||
nfs4_session_limit_xasize(server);
|
||||
|
||||
error = nfs4_delegation_hash_alloc(server);
|
||||
if (error) {
|
||||
nfs_free_server(server);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue