]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
NFS: Introduce generic mount client API
authorChuck Lever <chuck.lever@oracle.com>
Sun, 1 Jul 2007 16:13:49 +0000 (12:13 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 11 Jul 2007 03:40:47 +0000 (23:40 -0400)
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>
fs/nfs/super.c

index 7e56411e55fcebf6f75c2861fbbc84c7dc0c5c47..48db52a7067a626e96aad2a06249f661671823e9 100644 (file)
@@ -991,6 +991,63 @@ out_unknown:
        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