Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 364d015e authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFSv4: Reduce the stack footprint of try_location()

parent fbca779a
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -115,6 +115,7 @@ static struct vfsmount *try_location(struct nfs_clone_mount *mountdata,
				     char *page, char *page2,
				     const struct nfs4_fs_location *location)
{
	const size_t addr_bufsize = sizeof(struct sockaddr_storage);
	struct vfsmount *mnt = ERR_PTR(-ENOENT);
	char *mnt_path;
	unsigned int maxbuflen;
@@ -126,9 +127,12 @@ static struct vfsmount *try_location(struct nfs_clone_mount *mountdata,
	mountdata->mnt_path = mnt_path;
	maxbuflen = mnt_path - 1 - page2;

	mountdata->addr = kmalloc(addr_bufsize, GFP_KERNEL);
	if (mountdata->addr == NULL)
		return ERR_PTR(-ENOMEM);

	for (s = 0; s < location->nservers; s++) {
		const struct nfs4_string *buf = &location->servers[s];
		struct sockaddr_storage addr;

		if (buf->len <= 0 || buf->len >= maxbuflen)
			continue;
@@ -137,11 +141,10 @@ static struct vfsmount *try_location(struct nfs_clone_mount *mountdata,
			continue;

		mountdata->addrlen = nfs_parse_server_name(buf->data, buf->len,
				(struct sockaddr *)&addr, sizeof(addr));
				mountdata->addr, addr_bufsize);
		if (mountdata->addrlen == 0)
			continue;

		mountdata->addr = (struct sockaddr *)&addr;
		rpc_set_port(mountdata->addr, NFS_PORT);

		memcpy(page2, buf->data, buf->len);
@@ -156,6 +159,7 @@ static struct vfsmount *try_location(struct nfs_clone_mount *mountdata,
		if (!IS_ERR(mnt))
			break;
	}
	kfree(mountdata->addr);
	return mnt;
}