提交 fbca779a 编写于 作者: T Trond Myklebust

NFS: Reduce the stack footprint of nfs_create_server

Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
上级 a4d7f168
...@@ -934,7 +934,6 @@ static int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *mntfh, str ...@@ -934,7 +934,6 @@ static int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *mntfh, str
} }
fsinfo.fattr = fattr; fsinfo.fattr = fattr;
nfs_fattr_init(fattr);
error = clp->rpc_ops->fsinfo(server, mntfh, &fsinfo); error = clp->rpc_ops->fsinfo(server, mntfh, &fsinfo);
if (error < 0) if (error < 0)
goto out_error; goto out_error;
...@@ -1047,13 +1046,18 @@ struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data, ...@@ -1047,13 +1046,18 @@ struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data,
struct nfs_fh *mntfh) struct nfs_fh *mntfh)
{ {
struct nfs_server *server; struct nfs_server *server;
struct nfs_fattr fattr; struct nfs_fattr *fattr;
int error; int error;
server = nfs_alloc_server(); server = nfs_alloc_server();
if (!server) if (!server)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
error = -ENOMEM;
fattr = nfs_alloc_fattr();
if (fattr == NULL)
goto error;
/* Get a client representation */ /* Get a client representation */
error = nfs_init_server(server, data); error = nfs_init_server(server, data);
if (error < 0) if (error < 0)
...@@ -1064,7 +1068,7 @@ struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data, ...@@ -1064,7 +1068,7 @@ struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data,
BUG_ON(!server->nfs_client->rpc_ops->file_inode_ops); BUG_ON(!server->nfs_client->rpc_ops->file_inode_ops);
/* Probe the root fh to retrieve its FSID */ /* Probe the root fh to retrieve its FSID */
error = nfs_probe_fsinfo(server, mntfh, &fattr); error = nfs_probe_fsinfo(server, mntfh, fattr);
if (error < 0) if (error < 0)
goto error; goto error;
if (server->nfs_client->rpc_ops->version == 3) { if (server->nfs_client->rpc_ops->version == 3) {
...@@ -1077,14 +1081,14 @@ struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data, ...@@ -1077,14 +1081,14 @@ struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data,
server->namelen = NFS2_MAXNAMLEN; server->namelen = NFS2_MAXNAMLEN;
} }
if (!(fattr.valid & NFS_ATTR_FATTR)) { if (!(fattr->valid & NFS_ATTR_FATTR)) {
error = server->nfs_client->rpc_ops->getattr(server, mntfh, &fattr); error = server->nfs_client->rpc_ops->getattr(server, mntfh, fattr);
if (error < 0) { if (error < 0) {
dprintk("nfs_create_server: getattr error = %d\n", -error); dprintk("nfs_create_server: getattr error = %d\n", -error);
goto error; goto error;
} }
} }
memcpy(&server->fsid, &fattr.fsid, sizeof(server->fsid)); memcpy(&server->fsid, &fattr->fsid, sizeof(server->fsid));
dprintk("Server FSID: %llx:%llx\n", dprintk("Server FSID: %llx:%llx\n",
(unsigned long long) server->fsid.major, (unsigned long long) server->fsid.major,
...@@ -1096,9 +1100,11 @@ struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data, ...@@ -1096,9 +1100,11 @@ struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data,
spin_unlock(&nfs_client_lock); spin_unlock(&nfs_client_lock);
server->mount_time = jiffies; server->mount_time = jiffies;
nfs_free_fattr(fattr);
return server; return server;
error: error:
nfs_free_fattr(fattr);
nfs_free_server(server); nfs_free_server(server);
return ERR_PTR(error); return ERR_PTR(error);
} }
...@@ -1340,7 +1346,7 @@ static int nfs4_init_server(struct nfs_server *server, ...@@ -1340,7 +1346,7 @@ static int nfs4_init_server(struct nfs_server *server,
struct nfs_server *nfs4_create_server(const struct nfs_parsed_mount_data *data, struct nfs_server *nfs4_create_server(const struct nfs_parsed_mount_data *data,
struct nfs_fh *mntfh) struct nfs_fh *mntfh)
{ {
struct nfs_fattr fattr; struct nfs_fattr *fattr;
struct nfs_server *server; struct nfs_server *server;
int error; int error;
...@@ -1350,6 +1356,11 @@ struct nfs_server *nfs4_create_server(const struct nfs_parsed_mount_data *data, ...@@ -1350,6 +1356,11 @@ struct nfs_server *nfs4_create_server(const struct nfs_parsed_mount_data *data,
if (!server) if (!server)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
error = -ENOMEM;
fattr = nfs_alloc_fattr();
if (fattr == NULL)
goto error;
/* set up the general RPC client */ /* set up the general RPC client */
error = nfs4_init_server(server, data); error = nfs4_init_server(server, data);
if (error < 0) if (error < 0)
...@@ -1375,7 +1386,7 @@ struct nfs_server *nfs4_create_server(const struct nfs_parsed_mount_data *data, ...@@ -1375,7 +1386,7 @@ struct nfs_server *nfs4_create_server(const struct nfs_parsed_mount_data *data,
nfs4_session_set_rwsize(server); nfs4_session_set_rwsize(server);
error = nfs_probe_fsinfo(server, mntfh, &fattr); error = nfs_probe_fsinfo(server, mntfh, fattr);
if (error < 0) if (error < 0)
goto error; goto error;
...@@ -1389,9 +1400,11 @@ struct nfs_server *nfs4_create_server(const struct nfs_parsed_mount_data *data, ...@@ -1389,9 +1400,11 @@ struct nfs_server *nfs4_create_server(const struct nfs_parsed_mount_data *data,
server->mount_time = jiffies; server->mount_time = jiffies;
dprintk("<-- nfs4_create_server() = %p\n", server); dprintk("<-- nfs4_create_server() = %p\n", server);
nfs_free_fattr(fattr);
return server; return server;
error: error:
nfs_free_fattr(fattr);
nfs_free_server(server); nfs_free_server(server);
dprintk("<-- nfs4_create_server() = error %d\n", error); dprintk("<-- nfs4_create_server() = error %d\n", error);
return ERR_PTR(error); return ERR_PTR(error);
...@@ -1405,7 +1418,7 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data, ...@@ -1405,7 +1418,7 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data,
{ {
struct nfs_client *parent_client; struct nfs_client *parent_client;
struct nfs_server *server, *parent_server; struct nfs_server *server, *parent_server;
struct nfs_fattr fattr; struct nfs_fattr *fattr;
int error; int error;
dprintk("--> nfs4_create_referral_server()\n"); dprintk("--> nfs4_create_referral_server()\n");
...@@ -1414,6 +1427,11 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data, ...@@ -1414,6 +1427,11 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data,
if (!server) if (!server)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
error = -ENOMEM;
fattr = nfs_alloc_fattr();
if (fattr == NULL)
goto error;
parent_server = NFS_SB(data->sb); parent_server = NFS_SB(data->sb);
parent_client = parent_server->nfs_client; parent_client = parent_server->nfs_client;
...@@ -1448,7 +1466,7 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data, ...@@ -1448,7 +1466,7 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data,
goto error; goto error;
/* probe the filesystem info for this server filesystem */ /* probe the filesystem info for this server filesystem */
error = nfs_probe_fsinfo(server, mntfh, &fattr); error = nfs_probe_fsinfo(server, mntfh, fattr);
if (error < 0) if (error < 0)
goto error; goto error;
...@@ -1466,10 +1484,12 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data, ...@@ -1466,10 +1484,12 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data,
server->mount_time = jiffies; server->mount_time = jiffies;
nfs_free_fattr(fattr);
dprintk("<-- nfs_create_referral_server() = %p\n", server); dprintk("<-- nfs_create_referral_server() = %p\n", server);
return server; return server;
error: error:
nfs_free_fattr(fattr);
nfs_free_server(server); nfs_free_server(server);
dprintk("<-- nfs4_create_referral_server() = error %d\n", error); dprintk("<-- nfs4_create_referral_server() = error %d\n", error);
return ERR_PTR(error); return ERR_PTR(error);
...@@ -1485,7 +1505,7 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source, ...@@ -1485,7 +1505,7 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,
struct nfs_fattr *fattr) struct nfs_fattr *fattr)
{ {
struct nfs_server *server; struct nfs_server *server;
struct nfs_fattr fattr_fsinfo; struct nfs_fattr *fattr_fsinfo;
int error; int error;
dprintk("--> nfs_clone_server(,%llx:%llx,)\n", dprintk("--> nfs_clone_server(,%llx:%llx,)\n",
...@@ -1496,6 +1516,11 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source, ...@@ -1496,6 +1516,11 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,
if (!server) if (!server)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
error = -ENOMEM;
fattr_fsinfo = nfs_alloc_fattr();
if (fattr_fsinfo == NULL)
goto out_free_server;
/* Copy data from the source */ /* Copy data from the source */
server->nfs_client = source->nfs_client; server->nfs_client = source->nfs_client;
atomic_inc(&server->nfs_client->cl_count); atomic_inc(&server->nfs_client->cl_count);
...@@ -1512,7 +1537,7 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source, ...@@ -1512,7 +1537,7 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,
nfs_init_server_aclclient(server); nfs_init_server_aclclient(server);
/* probe the filesystem info for this server filesystem */ /* probe the filesystem info for this server filesystem */
error = nfs_probe_fsinfo(server, fh, &fattr_fsinfo); error = nfs_probe_fsinfo(server, fh, fattr_fsinfo);
if (error < 0) if (error < 0)
goto out_free_server; goto out_free_server;
...@@ -1534,10 +1559,12 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source, ...@@ -1534,10 +1559,12 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source,
server->mount_time = jiffies; server->mount_time = jiffies;
nfs_free_fattr(fattr_fsinfo);
dprintk("<-- nfs_clone_server() = %p\n", server); dprintk("<-- nfs_clone_server() = %p\n", server);
return server; return server;
out_free_server: out_free_server:
nfs_free_fattr(fattr_fsinfo);
nfs_free_server(server); nfs_free_server(server);
dprintk("<-- nfs_clone_server() = error %d\n", error); dprintk("<-- nfs_clone_server() = error %d\n", error);
return ERR_PTR(error); return ERR_PTR(error);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册