patch-2.3.99-pre4 linux/fs/nfs/mount_clnt.c
Next file: linux/fs/nfs/nfs2xdr.c
Previous file: linux/fs/nfs/inode.c
Back to the patch index
Back to the overall index
- Lines: 122
- Date:
Sat Apr 1 08:04:27 2000
- Orig file:
v2.3.99-pre3/linux/fs/nfs/mount_clnt.c
- Orig date:
Sun Nov 7 16:37:34 1999
diff -u --recursive --new-file v2.3.99-pre3/linux/fs/nfs/mount_clnt.c linux/fs/nfs/mount_clnt.c
@@ -30,7 +30,9 @@
#define MOUNT_UMNT 3
*/
-static struct rpc_clnt * mnt_create(char *, struct sockaddr_in *);
+static int nfs_gen_mount(struct sockaddr_in *,
+ char *, struct nfs_fh *, int);
+static struct rpc_clnt * mnt_create(char *, struct sockaddr_in *, int);
extern struct rpc_program mnt_program;
struct mnt_fhstatus {
@@ -44,24 +46,38 @@
int
nfs_mount(struct sockaddr_in *addr, char *path, struct nfs_fh *fh)
{
+ return nfs_gen_mount(addr, path, fh, NFS_MNT_VERSION);
+}
+
+int
+nfs3_mount(struct sockaddr_in *addr, char *path, struct nfs_fh *fh)
+{
+ return nfs_gen_mount(addr, path, fh, NFS_MNT3_VERSION);
+}
+
+static int
+nfs_gen_mount(struct sockaddr_in *addr, char *path, struct nfs_fh *fh, int version)
+{
struct rpc_clnt *mnt_clnt;
struct mnt_fhstatus result = { 0, fh };
char hostname[32];
int status;
+ int call;
dprintk("NFS: nfs_mount(%08x:%s)\n",
(unsigned)ntohl(addr->sin_addr.s_addr), path);
strcpy(hostname, in_ntoa(addr->sin_addr.s_addr));
- if (!(mnt_clnt = mnt_create(hostname, addr)))
+ if (!(mnt_clnt = mnt_create(hostname, addr, version)))
return -EACCES;
- status = rpc_call(mnt_clnt, NFS_MNTPROC_MNT, path, &result, 0);
+ call = (version == 3) ? MOUNTPROC3_MNT : MNTPROC_MNT;
+ status = rpc_call(mnt_clnt, call, path, &result, 0);
return status < 0? status : (result.status? -EACCES : 0);
}
static struct rpc_clnt *
-mnt_create(char *hostname, struct sockaddr_in *srvaddr)
+mnt_create(char *hostname, struct sockaddr_in *srvaddr, int version)
{
struct rpc_xprt *xprt;
struct rpc_clnt *clnt;
@@ -70,7 +86,7 @@
return NULL;
clnt = rpc_create_client(xprt, hostname,
- &mnt_program, NFS_MNT_VERSION,
+ &mnt_program, version,
RPC_AUTH_NULL);
if (!clnt) {
xprt_destroy(xprt);
@@ -104,8 +120,26 @@
static int
xdr_decode_fhstatus(struct rpc_rqst *req, u32 *p, struct mnt_fhstatus *res)
{
- if ((res->status = ntohl(*p++)) == 0)
- memcpy(res->fh, p, sizeof(*res->fh));
+ memset((u8 *)res, 0, sizeof(*res));
+ if ((res->status = ntohl(*p++)) == 0) {
+ res->fh->size = NFS2_FHSIZE;
+ memcpy(res->fh->data, p, NFS2_FHSIZE);
+ }
+ return 0;
+}
+
+static int
+xdr_decode_fhstatus3(struct rpc_rqst *req, u32 *p, struct mnt_fhstatus *res)
+{
+ memset((u8 *)res, 0, sizeof(*res));
+ if ((res->status = ntohl(*p++)) == 0) {
+ int size = ntohl(*p++);
+ if (size <= NFS3_FHSIZE) {
+ res->fh->size = size;
+ memcpy(res->fh->data, p, res->fh->size);
+ } else
+ res->status = -EBADHANDLE;
+ }
return 0;
}
@@ -122,13 +156,30 @@
MNT_dirpath_sz << 2, 0 },
};
+static struct rpc_procinfo mnt3_procedures[2] = {
+ { "mnt3_null",
+ (kxdrproc_t) xdr_error,
+ (kxdrproc_t) xdr_error, 0, 0 },
+ { "mnt3_mount",
+ (kxdrproc_t) xdr_encode_dirpath,
+ (kxdrproc_t) xdr_decode_fhstatus3,
+ MNT_dirpath_sz << 2, 0 },
+};
+
+
static struct rpc_version mnt_version1 = {
1, 2, mnt_procedures
};
+static struct rpc_version mnt_version3 = {
+ 3, 2, mnt3_procedures
+};
+
static struct rpc_version * mnt_version[] = {
NULL,
&mnt_version1,
+ NULL,
+ &mnt_version3,
};
static struct rpc_stat mnt_stats;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)