diff options
| author | Manoj Naik <manoj@almaden.ibm.com> | 2006-06-09 09:34:26 -0400 |
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-06-09 09:34:26 -0400 |
| commit | c818ba43f9ca2e8214412ab5f126b1f436c35098 (patch) | |
| tree | 02e3646c172000c8bc71d6de52d4991bbeb3db14 | |
| parent | 830b8e33fe1900b87c8eb7ec5c646117a9f298d6 (diff) | |
NFSv4: Create NFSv4 transport and client
Move existing code into a separate function so that it can be also used by
referral code.
Signed-off-by: Manoj Naik <manoj@almaden.ibm.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
| -rw-r--r-- | fs/nfs/inode.c | 131 |
1 files changed, 73 insertions, 58 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 3eea556d8f59..db62a5a7e4fc 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
| @@ -2027,62 +2027,24 @@ static void nfs4_clear_inode(struct inode *inode) | |||
| 2027 | } | 2027 | } |
| 2028 | 2028 | ||
| 2029 | 2029 | ||
| 2030 | static int nfs4_fill_super(struct super_block *sb, struct nfs4_mount_data *data, int silent) | 2030 | static struct rpc_clnt *nfs4_create_client(struct nfs_server *server, |
| 2031 | struct rpc_timeout *timeparms, int proto, rpc_authflavor_t flavor) | ||
| 2031 | { | 2032 | { |
| 2032 | struct nfs_server *server; | 2033 | struct nfs4_client *clp; |
| 2033 | struct nfs4_client *clp = NULL; | ||
| 2034 | struct rpc_xprt *xprt = NULL; | 2034 | struct rpc_xprt *xprt = NULL; |
| 2035 | struct rpc_clnt *clnt = NULL; | 2035 | struct rpc_clnt *clnt = NULL; |
| 2036 | struct rpc_timeout timeparms; | ||
| 2037 | rpc_authflavor_t authflavour; | ||
| 2038 | int err = -EIO; | 2036 | int err = -EIO; |
| 2039 | 2037 | ||
| 2040 | sb->s_blocksize_bits = 0; | ||
| 2041 | sb->s_blocksize = 0; | ||
| 2042 | server = NFS_SB(sb); | ||
| 2043 | if (data->rsize != 0) | ||
| 2044 | server->rsize = nfs_block_size(data->rsize, NULL); | ||
| 2045 | if (data->wsize != 0) | ||
| 2046 | server->wsize = nfs_block_size(data->wsize, NULL); | ||
| 2047 | server->flags = data->flags & NFS_MOUNT_FLAGMASK; | ||
| 2048 | server->caps = NFS_CAP_ATOMIC_OPEN; | ||
| 2049 | |||
| 2050 | server->acregmin = data->acregmin*HZ; | ||
| 2051 | server->acregmax = data->acregmax*HZ; | ||
| 2052 | server->acdirmin = data->acdirmin*HZ; | ||
| 2053 | server->acdirmax = data->acdirmax*HZ; | ||
| 2054 | |||
| 2055 | server->rpc_ops = &nfs_v4_clientops; | ||
| 2056 | |||
| 2057 | nfs_init_timeout_values(&timeparms, data->proto, data->timeo, data->retrans); | ||
| 2058 | |||
| 2059 | server->retrans_timeo = timeparms.to_initval; | ||
| 2060 | server->retrans_count = timeparms.to_retries; | ||
| 2061 | |||
| 2062 | clp = nfs4_get_client(&server->addr.sin_addr); | 2038 | clp = nfs4_get_client(&server->addr.sin_addr); |
| 2063 | if (!clp) { | 2039 | if (!clp) { |
| 2064 | dprintk("%s: failed to create NFS4 client.\n", __FUNCTION__); | 2040 | dprintk("%s: failed to create NFS4 client.\n", __FUNCTION__); |
| 2065 | return -EIO; | 2041 | return ERR_PTR(err); |
| 2066 | } | 2042 | } |
| 2067 | 2043 | ||
| 2068 | /* Now create transport and client */ | 2044 | /* Now create transport and client */ |
| 2069 | authflavour = RPC_AUTH_UNIX; | ||
| 2070 | if (data->auth_flavourlen != 0) { | ||
| 2071 | if (data->auth_flavourlen != 1) { | ||
| 2072 | dprintk("%s: Invalid number of RPC auth flavours %d.\n", | ||
| 2073 | __FUNCTION__, data->auth_flavourlen); | ||
| 2074 | err = -EINVAL; | ||
| 2075 | goto out_fail; | ||
| 2076 | } | ||
| 2077 | if (copy_from_user(&authflavour, data->auth_flavours, sizeof(authflavour))) { | ||
| 2078 | err = -EFAULT; | ||
| 2079 | goto out_fail; | ||
| 2080 | } | ||
| 2081 | } | ||
| 2082 | |||
| 2083 | down_write(&clp->cl_sem); | 2045 | down_write(&clp->cl_sem); |
| 2084 | if (IS_ERR(clp->cl_rpcclient)) { | 2046 | if (IS_ERR(clp->cl_rpcclient)) { |
| 2085 | xprt = xprt_create_proto(data->proto, &server->addr, &timeparms); | 2047 | xprt = xprt_create_proto(proto, &server->addr, timeparms); |
| 2086 | if (IS_ERR(xprt)) { | 2048 | if (IS_ERR(xprt)) { |
| 2087 | up_write(&clp->cl_sem); | 2049 | up_write(&clp->cl_sem); |
| 2088 | err = PTR_ERR(xprt); | 2050 | err = PTR_ERR(xprt); |
| @@ -2091,7 +2053,7 @@ static int nfs4_fill_super(struct super_block *sb, struct nfs4_mount_data *data, | |||
| 2091 | goto out_fail; | 2053 | goto out_fail; |
| 2092 | } | 2054 | } |
| 2093 | clnt = rpc_create_client(xprt, server->hostname, &nfs_program, | 2055 | clnt = rpc_create_client(xprt, server->hostname, &nfs_program, |
| 2094 | server->rpc_ops->version, authflavour); | 2056 | server->rpc_ops->version, flavor); |
| 2095 | if (IS_ERR(clnt)) { | 2057 | if (IS_ERR(clnt)) { |
| 2096 | up_write(&clp->cl_sem); | 2058 | up_write(&clp->cl_sem); |
| 2097 | err = PTR_ERR(clnt); | 2059 | err = PTR_ERR(clnt); |
| @@ -2108,43 +2070,96 @@ static int nfs4_fill_super(struct super_block *sb, struct nfs4_mount_data *data, | |||
| 2108 | list_add_tail(&server->nfs4_siblings, &clp->cl_superblocks); | 2070 | list_add_tail(&server->nfs4_siblings, &clp->cl_superblocks); |
| 2109 | clnt = rpc_clone_client(clp->cl_rpcclient); | 2071 | clnt = rpc_clone_client(clp->cl_rpcclient); |
| 2110 | if (!IS_ERR(clnt)) | 2072 | if (!IS_ERR(clnt)) |
| 2111 | server->nfs4_state = clp; | 2073 | server->nfs4_state = clp; |
| 2112 | up_write(&clp->cl_sem); | 2074 | up_write(&clp->cl_sem); |
| 2113 | clp = NULL; | 2075 | clp = NULL; |
| 2114 | 2076 | ||
| 2115 | if (IS_ERR(clnt)) { | 2077 | if (IS_ERR(clnt)) { |
| 2116 | err = PTR_ERR(clnt); | ||
| 2117 | dprintk("%s: cannot create RPC client. Error = %d\n", | 2078 | dprintk("%s: cannot create RPC client. Error = %d\n", |
| 2118 | __FUNCTION__, err); | 2079 | __FUNCTION__, err); |
| 2119 | return err; | 2080 | return clnt; |
| 2120 | } | 2081 | } |
| 2121 | 2082 | ||
| 2122 | server->client = clnt; | ||
| 2123 | |||
| 2124 | if (server->nfs4_state->cl_idmap == NULL) { | 2083 | if (server->nfs4_state->cl_idmap == NULL) { |
| 2125 | dprintk("%s: failed to create idmapper.\n", __FUNCTION__); | 2084 | dprintk("%s: failed to create idmapper.\n", __FUNCTION__); |
| 2126 | return -ENOMEM; | 2085 | return ERR_PTR(-ENOMEM); |
| 2127 | } | 2086 | } |
| 2128 | 2087 | ||
| 2129 | if (clnt->cl_auth->au_flavor != authflavour) { | 2088 | if (clnt->cl_auth->au_flavor != flavor) { |
| 2130 | struct rpc_auth *auth; | 2089 | struct rpc_auth *auth; |
| 2131 | 2090 | ||
| 2132 | auth = rpcauth_create(authflavour, clnt); | 2091 | auth = rpcauth_create(flavor, clnt); |
| 2133 | if (IS_ERR(auth)) { | 2092 | if (IS_ERR(auth)) { |
| 2134 | dprintk("%s: couldn't create credcache!\n", __FUNCTION__); | 2093 | dprintk("%s: couldn't create credcache!\n", __FUNCTION__); |
| 2135 | return PTR_ERR(auth); | 2094 | return (struct rpc_clnt *)auth; |
| 2095 | } | ||
| 2096 | } | ||
| 2097 | return clnt; | ||
| 2098 | |||
| 2099 | out_fail: | ||
| 2100 | if (clp) | ||
| 2101 | nfs4_put_client(clp); | ||
| 2102 | return ERR_PTR(err); | ||
| 2103 | } | ||
| 2104 | |||
| 2105 | static int nfs4_fill_super(struct super_block *sb, struct nfs4_mount_data *data, int silent) | ||
| 2106 | { | ||
| 2107 | struct nfs_server *server; | ||
| 2108 | struct rpc_timeout timeparms; | ||
| 2109 | rpc_authflavor_t authflavour; | ||
| 2110 | int err = -EIO; | ||
| 2111 | |||
| 2112 | sb->s_blocksize_bits = 0; | ||
| 2113 | sb->s_blocksize = 0; | ||
| 2114 | server = NFS_SB(sb); | ||
| 2115 | if (data->rsize != 0) | ||
| 2116 | server->rsize = nfs_block_size(data->rsize, NULL); | ||
| 2117 | if (data->wsize != 0) | ||
| 2118 | server->wsize = nfs_block_size(data->wsize, NULL); | ||
| 2119 | server->flags = data->flags & NFS_MOUNT_FLAGMASK; | ||
| 2120 | server->caps = NFS_CAP_ATOMIC_OPEN; | ||
| 2121 | |||
| 2122 | server->acregmin = data->acregmin*HZ; | ||
| 2123 | server->acregmax = data->acregmax*HZ; | ||
| 2124 | server->acdirmin = data->acdirmin*HZ; | ||
| 2125 | server->acdirmax = data->acdirmax*HZ; | ||
| 2126 | |||
| 2127 | server->rpc_ops = &nfs_v4_clientops; | ||
| 2128 | |||
| 2129 | nfs_init_timeout_values(&timeparms, data->proto, data->timeo, data->retrans); | ||
| 2130 | |||
| 2131 | server->retrans_timeo = timeparms.to_initval; | ||
| 2132 | server->retrans_count = timeparms.to_retries; | ||
| 2133 | |||
| 2134 | /* Now create transport and client */ | ||
| 2135 | authflavour = RPC_AUTH_UNIX; | ||
| 2136 | if (data->auth_flavourlen != 0) { | ||
| 2137 | if (data->auth_flavourlen != 1) { | ||
| 2138 | dprintk("%s: Invalid number of RPC auth flavours %d.\n", | ||
| 2139 | __FUNCTION__, data->auth_flavourlen); | ||
| 2140 | err = -EINVAL; | ||
| 2141 | goto out_fail; | ||
| 2142 | } | ||
| 2143 | if (copy_from_user(&authflavour, data->auth_flavours, sizeof(authflavour))) { | ||
| 2144 | err = -EFAULT; | ||
| 2145 | goto out_fail; | ||
| 2136 | } | 2146 | } |
| 2137 | } | 2147 | } |
| 2138 | 2148 | ||
| 2149 | server->client = nfs4_create_client(server, &timeparms, data->proto, authflavour); | ||
| 2150 | if (IS_ERR(server->client)) { | ||
| 2151 | err = PTR_ERR(server->client); | ||
| 2152 | dprintk("%s: cannot create RPC client. Error = %d\n", | ||
| 2153 | __FUNCTION__, err); | ||
| 2154 | goto out_fail; | ||
| 2155 | } | ||
| 2156 | |||
| 2139 | sb->s_time_gran = 1; | 2157 | sb->s_time_gran = 1; |
| 2140 | 2158 | ||
| 2141 | sb->s_op = &nfs4_sops; | 2159 | sb->s_op = &nfs4_sops; |
| 2142 | err = nfs_sb_init(sb, authflavour); | 2160 | err = nfs_sb_init(sb, authflavour); |
| 2143 | if (err == 0) | 2161 | |
| 2144 | return 0; | 2162 | out_fail: |
| 2145 | out_fail: | ||
| 2146 | if (clp) | ||
| 2147 | nfs4_put_client(clp); | ||
| 2148 | return err; | 2163 | return err; |
| 2149 | } | 2164 | } |
| 2150 | 2165 | ||
