diff options
Diffstat (limited to 'fs/nfs/client.c')
-rw-r--r-- | fs/nfs/client.c | 45 |
1 files changed, 25 insertions, 20 deletions
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 8d25ccb2d51d..99ea196f071f 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
@@ -648,8 +648,6 @@ static int nfs_start_lockd(struct nfs_server *server) | |||
648 | .hostname = clp->cl_hostname, | 648 | .hostname = clp->cl_hostname, |
649 | .address = (struct sockaddr *)&clp->cl_addr, | 649 | .address = (struct sockaddr *)&clp->cl_addr, |
650 | .addrlen = clp->cl_addrlen, | 650 | .addrlen = clp->cl_addrlen, |
651 | .protocol = server->flags & NFS_MOUNT_TCP ? | ||
652 | IPPROTO_TCP : IPPROTO_UDP, | ||
653 | .nfs_version = clp->rpc_ops->version, | 651 | .nfs_version = clp->rpc_ops->version, |
654 | .noresvport = server->flags & NFS_MOUNT_NORESVPORT ? | 652 | .noresvport = server->flags & NFS_MOUNT_NORESVPORT ? |
655 | 1 : 0, | 653 | 1 : 0, |
@@ -660,6 +658,14 @@ static int nfs_start_lockd(struct nfs_server *server) | |||
660 | if (server->flags & NFS_MOUNT_NONLM) | 658 | if (server->flags & NFS_MOUNT_NONLM) |
661 | return 0; | 659 | return 0; |
662 | 660 | ||
661 | switch (clp->cl_proto) { | ||
662 | default: | ||
663 | nlm_init.protocol = IPPROTO_TCP; | ||
664 | break; | ||
665 | case XPRT_TRANSPORT_UDP: | ||
666 | nlm_init.protocol = IPPROTO_UDP; | ||
667 | } | ||
668 | |||
663 | host = nlmclnt_init(&nlm_init); | 669 | host = nlmclnt_init(&nlm_init); |
664 | if (IS_ERR(host)) | 670 | if (IS_ERR(host)) |
665 | return PTR_ERR(host); | 671 | return PTR_ERR(host); |
@@ -787,7 +793,7 @@ static int nfs_init_server(struct nfs_server *server, | |||
787 | dprintk("--> nfs_init_server()\n"); | 793 | dprintk("--> nfs_init_server()\n"); |
788 | 794 | ||
789 | #ifdef CONFIG_NFS_V3 | 795 | #ifdef CONFIG_NFS_V3 |
790 | if (data->flags & NFS_MOUNT_VER3) | 796 | if (data->version == 3) |
791 | cl_init.rpc_ops = &nfs_v3_clientops; | 797 | cl_init.rpc_ops = &nfs_v3_clientops; |
792 | #endif | 798 | #endif |
793 | 799 | ||
@@ -809,6 +815,9 @@ static int nfs_init_server(struct nfs_server *server, | |||
809 | /* Initialise the client representation from the mount data */ | 815 | /* Initialise the client representation from the mount data */ |
810 | server->flags = data->flags; | 816 | server->flags = data->flags; |
811 | server->options = data->options; | 817 | server->options = data->options; |
818 | server->caps |= NFS_CAP_HARDLINKS|NFS_CAP_SYMLINKS|NFS_CAP_FILEID| | ||
819 | NFS_CAP_MODE|NFS_CAP_NLINK|NFS_CAP_OWNER|NFS_CAP_OWNER_GROUP| | ||
820 | NFS_CAP_ATIME|NFS_CAP_CTIME|NFS_CAP_MTIME; | ||
812 | 821 | ||
813 | if (data->rsize) | 822 | if (data->rsize) |
814 | server->rsize = nfs_block_size(data->rsize, NULL); | 823 | server->rsize = nfs_block_size(data->rsize, NULL); |
@@ -879,6 +888,7 @@ static void nfs_server_set_fsinfo(struct nfs_server *server, struct nfs_fsinfo * | |||
879 | server->rsize = NFS_MAX_FILE_IO_SIZE; | 888 | server->rsize = NFS_MAX_FILE_IO_SIZE; |
880 | server->rpages = (server->rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; | 889 | server->rpages = (server->rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; |
881 | 890 | ||
891 | server->backing_dev_info.name = "nfs"; | ||
882 | server->backing_dev_info.ra_pages = server->rpages * NFS_MAX_READAHEAD; | 892 | server->backing_dev_info.ra_pages = server->rpages * NFS_MAX_READAHEAD; |
883 | 893 | ||
884 | if (server->wsize > max_rpc_payload) | 894 | if (server->wsize > max_rpc_payload) |
@@ -929,10 +939,6 @@ static int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *mntfh, str | |||
929 | goto out_error; | 939 | goto out_error; |
930 | 940 | ||
931 | nfs_server_set_fsinfo(server, &fsinfo); | 941 | nfs_server_set_fsinfo(server, &fsinfo); |
932 | error = bdi_init(&server->backing_dev_info); | ||
933 | if (error) | ||
934 | goto out_error; | ||
935 | |||
936 | 942 | ||
937 | /* Get some general file system info */ | 943 | /* Get some general file system info */ |
938 | if (server->namelen == 0) { | 944 | if (server->namelen == 0) { |
@@ -964,6 +970,7 @@ static void nfs_server_copy_userdata(struct nfs_server *target, struct nfs_serve | |||
964 | target->acdirmin = source->acdirmin; | 970 | target->acdirmin = source->acdirmin; |
965 | target->acdirmax = source->acdirmax; | 971 | target->acdirmax = source->acdirmax; |
966 | target->caps = source->caps; | 972 | target->caps = source->caps; |
973 | target->options = source->options; | ||
967 | } | 974 | } |
968 | 975 | ||
969 | /* | 976 | /* |
@@ -991,6 +998,12 @@ static struct nfs_server *nfs_alloc_server(void) | |||
991 | return NULL; | 998 | return NULL; |
992 | } | 999 | } |
993 | 1000 | ||
1001 | if (bdi_init(&server->backing_dev_info)) { | ||
1002 | nfs_free_iostats(server->io_stats); | ||
1003 | kfree(server); | ||
1004 | return NULL; | ||
1005 | } | ||
1006 | |||
994 | return server; | 1007 | return server; |
995 | } | 1008 | } |
996 | 1009 | ||
@@ -1074,10 +1087,6 @@ struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data, | |||
1074 | (unsigned long long) server->fsid.major, | 1087 | (unsigned long long) server->fsid.major, |
1075 | (unsigned long long) server->fsid.minor); | 1088 | (unsigned long long) server->fsid.minor); |
1076 | 1089 | ||
1077 | BUG_ON(!server->nfs_client); | ||
1078 | BUG_ON(!server->nfs_client->rpc_ops); | ||
1079 | BUG_ON(!server->nfs_client->rpc_ops->file_inode_ops); | ||
1080 | |||
1081 | spin_lock(&nfs_client_lock); | 1090 | spin_lock(&nfs_client_lock); |
1082 | list_add_tail(&server->client_link, &server->nfs_client->cl_superblocks); | 1091 | list_add_tail(&server->client_link, &server->nfs_client->cl_superblocks); |
1083 | list_add_tail(&server->master_link, &nfs_volume_list); | 1092 | list_add_tail(&server->master_link, &nfs_volume_list); |
@@ -1171,7 +1180,7 @@ static int nfs4_init_client(struct nfs_client *clp, | |||
1171 | 1, flags & NFS_MOUNT_NORESVPORT); | 1180 | 1, flags & NFS_MOUNT_NORESVPORT); |
1172 | if (error < 0) | 1181 | if (error < 0) |
1173 | goto error; | 1182 | goto error; |
1174 | memcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr)); | 1183 | strlcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr)); |
1175 | 1184 | ||
1176 | error = nfs_idmap_new(clp); | 1185 | error = nfs_idmap_new(clp); |
1177 | if (error < 0) { | 1186 | if (error < 0) { |
@@ -1274,7 +1283,7 @@ static int nfs4_init_server(struct nfs_server *server, | |||
1274 | 1283 | ||
1275 | /* Initialise the client representation from the mount data */ | 1284 | /* Initialise the client representation from the mount data */ |
1276 | server->flags = data->flags; | 1285 | server->flags = data->flags; |
1277 | server->caps |= NFS_CAP_ATOMIC_OPEN; | 1286 | server->caps |= NFS_CAP_ATOMIC_OPEN|NFS_CAP_CHANGE_ATTR; |
1278 | server->options = data->options; | 1287 | server->options = data->options; |
1279 | 1288 | ||
1280 | /* Get a client record */ | 1289 | /* Get a client record */ |
@@ -1359,10 +1368,6 @@ struct nfs_server *nfs4_create_server(const struct nfs_parsed_mount_data *data, | |||
1359 | if (server->namelen == 0 || server->namelen > NFS4_MAXNAMLEN) | 1368 | if (server->namelen == 0 || server->namelen > NFS4_MAXNAMLEN) |
1360 | server->namelen = NFS4_MAXNAMLEN; | 1369 | server->namelen = NFS4_MAXNAMLEN; |
1361 | 1370 | ||
1362 | BUG_ON(!server->nfs_client); | ||
1363 | BUG_ON(!server->nfs_client->rpc_ops); | ||
1364 | BUG_ON(!server->nfs_client->rpc_ops->file_inode_ops); | ||
1365 | |||
1366 | spin_lock(&nfs_client_lock); | 1371 | spin_lock(&nfs_client_lock); |
1367 | list_add_tail(&server->client_link, &server->nfs_client->cl_superblocks); | 1372 | list_add_tail(&server->client_link, &server->nfs_client->cl_superblocks); |
1368 | list_add_tail(&server->master_link, &nfs_volume_list); | 1373 | list_add_tail(&server->master_link, &nfs_volume_list); |
@@ -1400,7 +1405,7 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data, | |||
1400 | 1405 | ||
1401 | /* Initialise the client representation from the parent server */ | 1406 | /* Initialise the client representation from the parent server */ |
1402 | nfs_server_copy_userdata(server, parent_server); | 1407 | nfs_server_copy_userdata(server, parent_server); |
1403 | server->caps |= NFS_CAP_ATOMIC_OPEN; | 1408 | server->caps |= NFS_CAP_ATOMIC_OPEN|NFS_CAP_CHANGE_ATTR; |
1404 | 1409 | ||
1405 | /* Get a client representation. | 1410 | /* Get a client representation. |
1406 | * Note: NFSv4 always uses TCP, */ | 1411 | * Note: NFSv4 always uses TCP, */ |
@@ -1533,7 +1538,7 @@ static void *nfs_server_list_next(struct seq_file *p, void *v, loff_t *pos); | |||
1533 | static void nfs_server_list_stop(struct seq_file *p, void *v); | 1538 | static void nfs_server_list_stop(struct seq_file *p, void *v); |
1534 | static int nfs_server_list_show(struct seq_file *m, void *v); | 1539 | static int nfs_server_list_show(struct seq_file *m, void *v); |
1535 | 1540 | ||
1536 | static struct seq_operations nfs_server_list_ops = { | 1541 | static const struct seq_operations nfs_server_list_ops = { |
1537 | .start = nfs_server_list_start, | 1542 | .start = nfs_server_list_start, |
1538 | .next = nfs_server_list_next, | 1543 | .next = nfs_server_list_next, |
1539 | .stop = nfs_server_list_stop, | 1544 | .stop = nfs_server_list_stop, |
@@ -1554,7 +1559,7 @@ static void *nfs_volume_list_next(struct seq_file *p, void *v, loff_t *pos); | |||
1554 | static void nfs_volume_list_stop(struct seq_file *p, void *v); | 1559 | static void nfs_volume_list_stop(struct seq_file *p, void *v); |
1555 | static int nfs_volume_list_show(struct seq_file *m, void *v); | 1560 | static int nfs_volume_list_show(struct seq_file *m, void *v); |
1556 | 1561 | ||
1557 | static struct seq_operations nfs_volume_list_ops = { | 1562 | static const struct seq_operations nfs_volume_list_ops = { |
1558 | .start = nfs_volume_list_start, | 1563 | .start = nfs_volume_list_start, |
1559 | .next = nfs_volume_list_next, | 1564 | .next = nfs_volume_list_next, |
1560 | .stop = nfs_volume_list_stop, | 1565 | .stop = nfs_volume_list_stop, |