mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
NFSv4.2: define limits and sizes for user xattr handling
Set limits for extended attributes (attribute value size and listxattr buffer size), based on the fs-independent limits (XATTR_*_MAX). Define the maximum XDR sizes for the RFC 8276 XATTR operations. In the case of operations that carry a larger payload (SETXATTR, GETXATTR, LISTXATTR), these exclude that payload, which is added as separate pages, like other operations do. Define, much like for read and write operations, the maximum overhead sizes for get/set/listxattr, and use them to limit the maximum payload size for those operations, in combination with the channel attributes. Signed-off-by: Frank van der Linden <fllinden@amazon.com> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
9a67fcc8f3
commit
04a5da690e
6 changed files with 149 additions and 2 deletions
|
@ -992,6 +992,36 @@ static void nfs4_session_limit_rwsize(struct nfs_server *server)
|
|||
#endif /* CONFIG_NFS_V4_1 */
|
||||
}
|
||||
|
||||
/*
|
||||
* Limit xattr sizes using the channel attributes.
|
||||
*/
|
||||
static void nfs4_session_limit_xasize(struct nfs_server *server)
|
||||
{
|
||||
#ifdef CONFIG_NFS_V4_2
|
||||
struct nfs4_session *sess;
|
||||
u32 server_gxa_sz;
|
||||
u32 server_sxa_sz;
|
||||
u32 server_lxa_sz;
|
||||
|
||||
if (!nfs4_has_session(server->nfs_client))
|
||||
return;
|
||||
|
||||
sess = server->nfs_client->cl_session;
|
||||
|
||||
server_gxa_sz = sess->fc_attrs.max_resp_sz - nfs42_maxgetxattr_overhead;
|
||||
server_sxa_sz = sess->fc_attrs.max_rqst_sz - nfs42_maxsetxattr_overhead;
|
||||
server_lxa_sz = sess->fc_attrs.max_resp_sz -
|
||||
nfs42_maxlistxattrs_overhead;
|
||||
|
||||
if (server->gxasize > server_gxa_sz)
|
||||
server->gxasize = server_gxa_sz;
|
||||
if (server->sxasize > server_sxa_sz)
|
||||
server->sxasize = server_sxa_sz;
|
||||
if (server->lxasize > server_lxa_sz)
|
||||
server->lxasize = server_lxa_sz;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int nfs4_server_common_setup(struct nfs_server *server,
|
||||
struct nfs_fh *mntfh, bool auth_probe)
|
||||
{
|
||||
|
@ -1039,6 +1069,7 @@ static int nfs4_server_common_setup(struct nfs_server *server,
|
|||
goto out;
|
||||
|
||||
nfs4_session_limit_rwsize(server);
|
||||
nfs4_session_limit_xasize(server);
|
||||
|
||||
if (server->namelen == 0 || server->namelen > NFS4_MAXNAMLEN)
|
||||
server->namelen = NFS4_MAXNAMLEN;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue