NFS: Remake nfsroot_mount as a permanent part of NFS client

In preparation for supporting NFSv2 and NFSv3 mount option handling in the
kernel NFS client, convert mount_clnt.c to be a permanent part of the NFS
client, instead of built only when CONFIG_ROOT_NFS is enabled.

In addition, we also replace the "struct sockaddr_in *" argument with
something more generic, to help support IPv6 at some later point.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Chuck Lever
2007-07-01 12:13:27 -04:00
committed by Trond Myklebust
parent 43780b87fa
commit 3ea97309e6
4 changed files with 34 additions and 33 deletions

View File

@@ -18,7 +18,7 @@
#include <linux/nfs_fs.h>
#ifdef RPC_DEBUG
# define NFSDBG_FACILITY NFSDBG_ROOT
# define NFSDBG_FACILITY NFSDBG_MOUNT
#endif
/*
@@ -28,7 +28,6 @@
#define MOUNT_UMNT 3
*/
static struct rpc_clnt * mnt_create(struct sockaddr_in *, int, int);
static struct rpc_program mnt_program;
struct mnt_fhstatus {
@@ -36,14 +35,21 @@ struct mnt_fhstatus {
struct nfs_fh * fh;
};
/*
* Obtain an NFS file handle for the given host and path
/**
* nfs_mount - Obtain an NFS file handle for the given host and path
* @addr: pointer to server's address
* @len: size of server's address
* @hostname: name of server host, or NULL
* @path: pointer to string containing export path to mount
* @version: mount version to use for this request
* @protocol: transport protocol to use for thie request
* @fh: pointer to location to place returned file handle
*
* Uses default timeout parameters specified by underlying transport.
*/
int
nfsroot_mount(struct sockaddr_in *addr, char *path, struct nfs_fh *fh,
int version, int protocol)
int nfs_mount(struct sockaddr *addr, size_t len, char *hostname, char *path,
int version, int protocol, struct nfs_fh *fh)
{
struct rpc_clnt *mnt_clnt;
struct mnt_fhstatus result = {
.fh = fh
};
@@ -51,12 +57,23 @@ nfsroot_mount(struct sockaddr_in *addr, char *path, struct nfs_fh *fh,
.rpc_argp = path,
.rpc_resp = &result,
};
struct rpc_create_args args = {
.protocol = protocol,
.address = addr,
.addrsize = len,
.servername = hostname,
.program = &mnt_program,
.version = version,
.authflavor = RPC_AUTH_UNIX,
.flags = RPC_CLNT_CREATE_INTR,
};
struct rpc_clnt *mnt_clnt;
int status;
dprintk("NFS: nfs_mount(%08x:%s)\n",
(unsigned)ntohl(addr->sin_addr.s_addr), path);
dprintk("NFS: sending MNT request for %s:%s\n",
(hostname ? hostname : "server"), path);
mnt_clnt = mnt_create(addr, version, protocol);
mnt_clnt = rpc_create(&args);
if (IS_ERR(mnt_clnt))
return PTR_ERR(mnt_clnt);
@@ -70,22 +87,6 @@ nfsroot_mount(struct sockaddr_in *addr, char *path, struct nfs_fh *fh,
return status < 0? status : (result.status? -EACCES : 0);
}
static struct rpc_clnt *mnt_create(struct sockaddr_in *srvaddr, int version,
int protocol)
{
struct rpc_create_args args = {
.protocol = protocol,
.address = (struct sockaddr *)srvaddr,
.addrsize = sizeof(*srvaddr),
.program = &mnt_program,
.version = version,
.authflavor = RPC_AUTH_UNIX,
.flags = RPC_CLNT_CREATE_INTR,
};
return rpc_create(&args);
}
/*
* XDR encode/decode functions for MOUNT
*/