diff options
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/client.c | 41 | ||||
-rw-r--r-- | fs/nfs/namespace.c | 2 | ||||
-rw-r--r-- | fs/nfs/super.c | 2 |
3 files changed, 20 insertions, 25 deletions
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index ff778ecee0bd..3b21731ae571 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
@@ -96,7 +96,7 @@ struct rpc_program nfsacl_program = { | |||
96 | struct nfs_client_initdata { | 96 | struct nfs_client_initdata { |
97 | const char *hostname; | 97 | const char *hostname; |
98 | const struct sockaddr_in *addr; | 98 | const struct sockaddr_in *addr; |
99 | int version; | 99 | const struct nfs_rpc_ops *rpc_ops; |
100 | }; | 100 | }; |
101 | 101 | ||
102 | /* | 102 | /* |
@@ -112,7 +112,9 @@ static struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_ | |||
112 | if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL) | 112 | if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL) |
113 | goto error_0; | 113 | goto error_0; |
114 | 114 | ||
115 | if (cl_init->version == 4) { | 115 | clp->rpc_ops = cl_init->rpc_ops; |
116 | |||
117 | if (cl_init->rpc_ops->version == 4) { | ||
116 | if (nfs_callback_up() < 0) | 118 | if (nfs_callback_up() < 0) |
117 | goto error_2; | 119 | goto error_2; |
118 | __set_bit(NFS_CS_CALLBACK, &clp->cl_res_state); | 120 | __set_bit(NFS_CS_CALLBACK, &clp->cl_res_state); |
@@ -121,7 +123,6 @@ static struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_ | |||
121 | atomic_set(&clp->cl_count, 1); | 123 | atomic_set(&clp->cl_count, 1); |
122 | clp->cl_cons_state = NFS_CS_INITING; | 124 | clp->cl_cons_state = NFS_CS_INITING; |
123 | 125 | ||
124 | clp->cl_nfsversion = cl_init->version; | ||
125 | memcpy(&clp->cl_addr, cl_init->addr, sizeof(clp->cl_addr)); | 126 | memcpy(&clp->cl_addr, cl_init->addr, sizeof(clp->cl_addr)); |
126 | 127 | ||
127 | if (cl_init->hostname) { | 128 | if (cl_init->hostname) { |
@@ -170,7 +171,7 @@ static void nfs4_shutdown_client(struct nfs_client *clp) | |||
170 | */ | 171 | */ |
171 | static void nfs_free_client(struct nfs_client *clp) | 172 | static void nfs_free_client(struct nfs_client *clp) |
172 | { | 173 | { |
173 | dprintk("--> nfs_free_client(%d)\n", clp->cl_nfsversion); | 174 | dprintk("--> nfs_free_client(%u)\n", clp->rpc_ops->version); |
174 | 175 | ||
175 | nfs4_shutdown_client(clp); | 176 | nfs4_shutdown_client(clp); |
176 | 177 | ||
@@ -222,7 +223,7 @@ struct nfs_client *nfs_find_client(const struct sockaddr_in *addr, int nfsversio | |||
222 | continue; | 223 | continue; |
223 | 224 | ||
224 | /* Different NFS versions cannot share the same nfs_client */ | 225 | /* Different NFS versions cannot share the same nfs_client */ |
225 | if (clp->cl_nfsversion != nfsversion) | 226 | if (clp->rpc_ops->version != nfsversion) |
226 | continue; | 227 | continue; |
227 | 228 | ||
228 | /* Match only the IP address, not the port number */ | 229 | /* Match only the IP address, not the port number */ |
@@ -251,7 +252,7 @@ static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *dat | |||
251 | continue; | 252 | continue; |
252 | 253 | ||
253 | /* Different NFS versions cannot share the same nfs_client */ | 254 | /* Different NFS versions cannot share the same nfs_client */ |
254 | if (clp->cl_nfsversion != data->version) | 255 | if (clp->rpc_ops != data->rpc_ops) |
255 | continue; | 256 | continue; |
256 | 257 | ||
257 | /* Match the full socket address */ | 258 | /* Match the full socket address */ |
@@ -273,9 +274,9 @@ static struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_in | |||
273 | struct nfs_client *clp, *new = NULL; | 274 | struct nfs_client *clp, *new = NULL; |
274 | int error; | 275 | int error; |
275 | 276 | ||
276 | dprintk("--> nfs_get_client(%s,"NIPQUAD_FMT":%d,%d)\n", | 277 | dprintk("--> nfs_get_client(%s,"NIPQUAD_FMT":%d,%u)\n", |
277 | cl_init->hostname ?: "", NIPQUAD(cl_init->addr->sin_addr), | 278 | cl_init->hostname ?: "", NIPQUAD(cl_init->addr->sin_addr), |
278 | cl_init->addr->sin_port, cl_init->version); | 279 | cl_init->addr->sin_port, cl_init->rpc_ops->version); |
279 | 280 | ||
280 | /* see if the client already exists */ | 281 | /* see if the client already exists */ |
281 | do { | 282 | do { |
@@ -430,7 +431,7 @@ static int nfs_start_lockd(struct nfs_server *server) | |||
430 | { | 431 | { |
431 | int error = 0; | 432 | int error = 0; |
432 | 433 | ||
433 | if (server->nfs_client->cl_nfsversion > 3) | 434 | if (server->nfs_client->rpc_ops->version > 3) |
434 | goto out; | 435 | goto out; |
435 | if (server->flags & NFS_MOUNT_NONLM) | 436 | if (server->flags & NFS_MOUNT_NONLM) |
436 | goto out; | 437 | goto out; |
@@ -450,7 +451,7 @@ out: | |||
450 | #ifdef CONFIG_NFS_V3_ACL | 451 | #ifdef CONFIG_NFS_V3_ACL |
451 | static void nfs_init_server_aclclient(struct nfs_server *server) | 452 | static void nfs_init_server_aclclient(struct nfs_server *server) |
452 | { | 453 | { |
453 | if (server->nfs_client->cl_nfsversion != 3) | 454 | if (server->nfs_client->rpc_ops->version != 3) |
454 | goto out_noacl; | 455 | goto out_noacl; |
455 | if (server->flags & NFS_MOUNT_NOACL) | 456 | if (server->flags & NFS_MOUNT_NOACL) |
456 | goto out_noacl; | 457 | goto out_noacl; |
@@ -521,12 +522,6 @@ static int nfs_init_client(struct nfs_client *clp, | |||
521 | return 0; | 522 | return 0; |
522 | } | 523 | } |
523 | 524 | ||
524 | /* Check NFS protocol revision and initialize RPC op vector */ | ||
525 | clp->rpc_ops = &nfs_v2_clientops; | ||
526 | #ifdef CONFIG_NFS_V3 | ||
527 | if (clp->cl_nfsversion == 3) | ||
528 | clp->rpc_ops = &nfs_v3_clientops; | ||
529 | #endif | ||
530 | /* | 525 | /* |
531 | * Create a client RPC handle for doing FSSTAT with UNIX auth only | 526 | * Create a client RPC handle for doing FSSTAT with UNIX auth only |
532 | * - RFC 2623, sec 2.3.2 | 527 | * - RFC 2623, sec 2.3.2 |
@@ -553,7 +548,7 @@ static int nfs_init_server(struct nfs_server *server, | |||
553 | struct nfs_client_initdata cl_init = { | 548 | struct nfs_client_initdata cl_init = { |
554 | .hostname = data->nfs_server.hostname, | 549 | .hostname = data->nfs_server.hostname, |
555 | .addr = &data->nfs_server.address, | 550 | .addr = &data->nfs_server.address, |
556 | .version = 2, | 551 | .rpc_ops = &nfs_v2_clientops, |
557 | }; | 552 | }; |
558 | struct nfs_client *clp; | 553 | struct nfs_client *clp; |
559 | int error; | 554 | int error; |
@@ -562,7 +557,7 @@ static int nfs_init_server(struct nfs_server *server, | |||
562 | 557 | ||
563 | #ifdef CONFIG_NFS_V3 | 558 | #ifdef CONFIG_NFS_V3 |
564 | if (data->flags & NFS_MOUNT_VER3) | 559 | if (data->flags & NFS_MOUNT_VER3) |
565 | cl_init.version = 3; | 560 | cl_init.rpc_ops = &nfs_v3_clientops; |
566 | #endif | 561 | #endif |
567 | 562 | ||
568 | /* Allocate or find a client reference we can use */ | 563 | /* Allocate or find a client reference we can use */ |
@@ -906,7 +901,7 @@ static int nfs4_set_client(struct nfs_server *server, | |||
906 | struct nfs_client_initdata cl_init = { | 901 | struct nfs_client_initdata cl_init = { |
907 | .hostname = hostname, | 902 | .hostname = hostname, |
908 | .addr = addr, | 903 | .addr = addr, |
909 | .version = 4, | 904 | .rpc_ops = &nfs_v4_clientops, |
910 | }; | 905 | }; |
911 | struct nfs_client *clp; | 906 | struct nfs_client *clp; |
912 | int error; | 907 | int error; |
@@ -1284,8 +1279,8 @@ static int nfs_server_list_show(struct seq_file *m, void *v) | |||
1284 | /* display one transport per line on subsequent lines */ | 1279 | /* display one transport per line on subsequent lines */ |
1285 | clp = list_entry(v, struct nfs_client, cl_share_link); | 1280 | clp = list_entry(v, struct nfs_client, cl_share_link); |
1286 | 1281 | ||
1287 | seq_printf(m, "v%d %02x%02x%02x%02x %4hx %3d %s\n", | 1282 | seq_printf(m, "v%u %02x%02x%02x%02x %4hx %3d %s\n", |
1288 | clp->cl_nfsversion, | 1283 | clp->rpc_ops->version, |
1289 | NIPQUAD(clp->cl_addr.sin_addr), | 1284 | NIPQUAD(clp->cl_addr.sin_addr), |
1290 | ntohs(clp->cl_addr.sin_port), | 1285 | ntohs(clp->cl_addr.sin_port), |
1291 | atomic_read(&clp->cl_count), | 1286 | atomic_read(&clp->cl_count), |
@@ -1363,8 +1358,8 @@ static int nfs_volume_list_show(struct seq_file *m, void *v) | |||
1363 | (unsigned long long) server->fsid.major, | 1358 | (unsigned long long) server->fsid.major, |
1364 | (unsigned long long) server->fsid.minor); | 1359 | (unsigned long long) server->fsid.minor); |
1365 | 1360 | ||
1366 | seq_printf(m, "v%d %02x%02x%02x%02x %4hx %-7s %-17s\n", | 1361 | seq_printf(m, "v%u %02x%02x%02x%02x %4hx %-7s %-17s\n", |
1367 | clp->cl_nfsversion, | 1362 | clp->rpc_ops->version, |
1368 | NIPQUAD(clp->cl_addr.sin_addr), | 1363 | NIPQUAD(clp->cl_addr.sin_addr), |
1369 | ntohs(clp->cl_addr.sin_port), | 1364 | ntohs(clp->cl_addr.sin_port), |
1370 | dev, | 1365 | dev, |
diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c index acfc56f9edc0..be4ce1c3a3d8 100644 --- a/fs/nfs/namespace.c +++ b/fs/nfs/namespace.c | |||
@@ -188,7 +188,7 @@ static struct vfsmount *nfs_do_clone_mount(struct nfs_server *server, | |||
188 | { | 188 | { |
189 | #ifdef CONFIG_NFS_V4 | 189 | #ifdef CONFIG_NFS_V4 |
190 | struct vfsmount *mnt = NULL; | 190 | struct vfsmount *mnt = NULL; |
191 | switch (server->nfs_client->cl_nfsversion) { | 191 | switch (server->nfs_client->rpc_ops->version) { |
192 | case 2: | 192 | case 2: |
193 | case 3: | 193 | case 3: |
194 | mnt = vfs_kern_mount(&nfs_xdev_fs_type, 0, devname, mountdata); | 194 | mnt = vfs_kern_mount(&nfs_xdev_fs_type, 0, devname, mountdata); |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index a3492d6f8f9b..5608e6a4c1e1 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
@@ -529,7 +529,7 @@ static int nfs_show_stats(struct seq_file *m, struct vfsmount *mnt) | |||
529 | seq_printf(m, ",namelen=%d", nfss->namelen); | 529 | seq_printf(m, ",namelen=%d", nfss->namelen); |
530 | 530 | ||
531 | #ifdef CONFIG_NFS_V4 | 531 | #ifdef CONFIG_NFS_V4 |
532 | if (nfss->nfs_client->cl_nfsversion == 4) { | 532 | if (nfss->nfs_client->rpc_ops->version == 4) { |
533 | seq_printf(m, "\n\tnfsv4:\t"); | 533 | seq_printf(m, "\n\tnfsv4:\t"); |
534 | seq_printf(m, "bm0=0x%x", nfss->attr_bitmask[0]); | 534 | seq_printf(m, "bm0=0x%x", nfss->attr_bitmask[0]); |
535 | seq_printf(m, ",bm1=0x%x", nfss->attr_bitmask[1]); | 535 | seq_printf(m, ",bm1=0x%x", nfss->attr_bitmask[1]); |