nfs3client.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include <linux/nfs_fs.h>
  2. #include <linux/nfs_mount.h>
  3. #include "internal.h"
  4. #include "nfs3_fs.h"
  5. #ifdef CONFIG_NFS_V3_ACL
  6. static struct rpc_stat nfsacl_rpcstat = { &nfsacl_program };
  7. static const struct rpc_version *nfsacl_version[] = {
  8. [3] = &nfsacl_version3,
  9. };
  10. const struct rpc_program nfsacl_program = {
  11. .name = "nfsacl",
  12. .number = NFS_ACL_PROGRAM,
  13. .nrvers = ARRAY_SIZE(nfsacl_version),
  14. .version = nfsacl_version,
  15. .stats = &nfsacl_rpcstat,
  16. };
  17. /*
  18. * Initialise an NFSv3 ACL client connection
  19. */
  20. static void nfs_init_server_aclclient(struct nfs_server *server)
  21. {
  22. if (server->flags & NFS_MOUNT_NOACL)
  23. goto out_noacl;
  24. server->client_acl = rpc_bind_new_program(server->client, &nfsacl_program, 3);
  25. if (IS_ERR(server->client_acl))
  26. goto out_noacl;
  27. /* No errors! Assume that Sun nfsacls are supported */
  28. server->caps |= NFS_CAP_ACLS;
  29. return;
  30. out_noacl:
  31. server->caps &= ~NFS_CAP_ACLS;
  32. }
  33. #else
  34. static inline void nfs_init_server_aclclient(struct nfs_server *server)
  35. {
  36. server->flags &= ~NFS_MOUNT_NOACL;
  37. server->caps &= ~NFS_CAP_ACLS;
  38. }
  39. #endif
  40. struct nfs_server *nfs3_create_server(struct nfs_mount_info *mount_info,
  41. struct nfs_subversion *nfs_mod)
  42. {
  43. struct nfs_server *server = nfs_create_server(mount_info, nfs_mod);
  44. /* Create a client RPC handle for the NFS v3 ACL management interface */
  45. if (!IS_ERR(server))
  46. nfs_init_server_aclclient(server);
  47. return server;
  48. }
  49. struct nfs_server *nfs3_clone_server(struct nfs_server *source,
  50. struct nfs_fh *fh,
  51. struct nfs_fattr *fattr,
  52. rpc_authflavor_t flavor)
  53. {
  54. struct nfs_server *server = nfs_clone_server(source, fh, fattr, flavor);
  55. if (!IS_ERR(server) && !IS_ERR(source->client_acl))
  56. nfs_init_server_aclclient(server);
  57. return server;
  58. }
  59. /*
  60. * Set up a pNFS Data Server client over NFSv3.
  61. *
  62. * Return any existing nfs_client that matches server address,port,version
  63. * and minorversion.
  64. *
  65. * For a new nfs_client, use a soft mount (default), a low retrans and a
  66. * low timeout interval so that if a connection is lost, we retry through
  67. * the MDS.
  68. */
  69. struct nfs_client *nfs3_set_ds_client(struct nfs_client *mds_clp,
  70. const struct sockaddr *ds_addr, int ds_addrlen,
  71. int ds_proto, unsigned int ds_timeo, unsigned int ds_retrans,
  72. rpc_authflavor_t au_flavor)
  73. {
  74. struct nfs_client_initdata cl_init = {
  75. .addr = ds_addr,
  76. .addrlen = ds_addrlen,
  77. .nfs_mod = &nfs_v3,
  78. .proto = ds_proto,
  79. .net = mds_clp->cl_net,
  80. };
  81. struct rpc_timeout ds_timeout;
  82. struct nfs_client *clp;
  83. /* Use the MDS nfs_client cl_ipaddr. */
  84. nfs_init_timeout_values(&ds_timeout, ds_proto, ds_timeo, ds_retrans);
  85. clp = nfs_get_client(&cl_init, &ds_timeout, mds_clp->cl_ipaddr,
  86. au_flavor);
  87. return clp;
  88. }
  89. EXPORT_SYMBOL_GPL(nfs3_set_ds_client);