aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2007-07-01 12:13:49 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2007-07-10 23:40:47 -0400
commit0076d7b7bab580ca2e94637d351fa7cd357743a8 (patch)
treeff41168c86b1ee4c5030c67bf2ca754b6fbe53e8
parentbf0fd7680f1cf31b9cbabcc037a204548e2c866d (diff)
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: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--fs/nfs/super.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 7e56411e55fc..48db52a7067a 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -992,6 +992,63 @@ out_unknown:
992} 992}
993 993
994/* 994/*
995 * Use the remote server's MOUNT service to request the NFS file handle
996 * corresponding to the provided path.
997 */
998static int nfs_try_mount(struct nfs_parsed_mount_data *args,
999 struct nfs_fh *root_fh)
1000{
1001 struct sockaddr_in sin;
1002 int status;
1003
1004 if (args->mount_server.version == 0) {
1005 if (args->flags & NFS_MOUNT_VER3)
1006 args->mount_server.version = NFS_MNT3_VERSION;
1007 else
1008 args->mount_server.version = NFS_MNT_VERSION;
1009 }
1010
1011 /*
1012 * Construct the mount server's address.
1013 */
1014 if (args->mount_server.address.sin_addr.s_addr != INADDR_ANY)
1015 sin = args->mount_server.address;
1016 else
1017 sin = args->nfs_server.address;
1018 if (args->mount_server.port == 0) {
1019 status = rpcb_getport_sync(&sin,
1020 args->mount_server.program,
1021 args->mount_server.version,
1022 args->mount_server.protocol);
1023 if (status < 0)
1024 goto out_err;
1025 sin.sin_port = htons(status);
1026 } else
1027 sin.sin_port = htons(args->mount_server.port);
1028
1029 /*
1030 * Now ask the mount server to map our export path
1031 * to a file handle.
1032 */
1033 status = nfs_mount((struct sockaddr *) &sin,
1034 sizeof(sin),
1035 args->nfs_server.hostname,
1036 args->nfs_server.export_path,
1037 args->mount_server.version,
1038 args->mount_server.protocol,
1039 root_fh);
1040 if (status < 0)
1041 goto out_err;
1042
1043 return status;
1044
1045out_err:
1046 dfprintk(MOUNT, "NFS: unable to contact server on host "
1047 NIPQUAD_FMT "\n", NIPQUAD(sin.sin_addr.s_addr));
1048 return status;
1049}
1050
1051/*
995 * Validate the NFS2/NFS3 mount data 1052 * Validate the NFS2/NFS3 mount data
996 * - fills in the mount root filehandle 1053 * - fills in the mount root filehandle
997 */ 1054 */