提交 0076d7b7 编写于 作者: C Chuck Lever 提交者: Trond Myklebust

NFS: Introduce generic mount client API

For NFSv2 and v3 mounts, the first step is to contact the server's MOUNTD
and request the file handle for the root of the mounted share.  Add a
function to the NFS client that handles this operation.
Signed-off-by: NChuck Lever <chuck.lever@oracle.com>
Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
上级 bf0fd768
......@@ -991,6 +991,63 @@ static int nfs_parse_mount_options(char *raw,
return 0;
}
/*
* Use the remote server's MOUNT service to request the NFS file handle
* corresponding to the provided path.
*/
static int nfs_try_mount(struct nfs_parsed_mount_data *args,
struct nfs_fh *root_fh)
{
struct sockaddr_in sin;
int status;
if (args->mount_server.version == 0) {
if (args->flags & NFS_MOUNT_VER3)
args->mount_server.version = NFS_MNT3_VERSION;
else
args->mount_server.version = NFS_MNT_VERSION;
}
/*
* Construct the mount server's address.
*/
if (args->mount_server.address.sin_addr.s_addr != INADDR_ANY)
sin = args->mount_server.address;
else
sin = args->nfs_server.address;
if (args->mount_server.port == 0) {
status = rpcb_getport_sync(&sin,
args->mount_server.program,
args->mount_server.version,
args->mount_server.protocol);
if (status < 0)
goto out_err;
sin.sin_port = htons(status);
} else
sin.sin_port = htons(args->mount_server.port);
/*
* Now ask the mount server to map our export path
* to a file handle.
*/
status = nfs_mount((struct sockaddr *) &sin,
sizeof(sin),
args->nfs_server.hostname,
args->nfs_server.export_path,
args->mount_server.version,
args->mount_server.protocol,
root_fh);
if (status < 0)
goto out_err;
return status;
out_err:
dfprintk(MOUNT, "NFS: unable to contact server on host "
NIPQUAD_FMT "\n", NIPQUAD(sin.sin_addr.s_addr));
return status;
}
/*
* Validate the NFS2/NFS3 mount data
* - fills in the mount root filehandle
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册