pnfs.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. * pNFS functions to call and manage layout drivers.
  3. *
  4. * Copyright (c) 2002 [year of first publication]
  5. * The Regents of the University of Michigan
  6. * All Rights Reserved
  7. *
  8. * Dean Hildebrand <dhildebz@umich.edu>
  9. *
  10. * Permission is granted to use, copy, create derivative works, and
  11. * redistribute this software and such derivative works for any purpose,
  12. * so long as the name of the University of Michigan is not used in
  13. * any advertising or publicity pertaining to the use or distribution
  14. * of this software without specific, written prior authorization. If
  15. * the above copyright notice or any other identification of the
  16. * University of Michigan is included in any copy of any portion of
  17. * this software, then the disclaimer below must also be included.
  18. *
  19. * This software is provided as is, without representation or warranty
  20. * of any kind either express or implied, including without limitation
  21. * the implied warranties of merchantability, fitness for a particular
  22. * purpose, or noninfringement. The Regents of the University of
  23. * Michigan shall not be liable for any damages, including special,
  24. * indirect, incidental, or consequential damages, with respect to any
  25. * claim arising out of or in connection with the use of the software,
  26. * even if it has been or is hereafter advised of the possibility of
  27. * such damages.
  28. */
  29. #include <linux/nfs_fs.h>
  30. #include "pnfs.h"
  31. #define NFSDBG_FACILITY NFSDBG_PNFS
  32. /* STUB that returns the equivalent of "no module found" */
  33. static struct pnfs_layoutdriver_type *
  34. find_pnfs_driver(u32 id)
  35. {
  36. return NULL;
  37. }
  38. void
  39. unset_pnfs_layoutdriver(struct nfs_server *nfss)
  40. {
  41. nfss->pnfs_curr_ld = NULL;
  42. }
  43. /*
  44. * Try to set the server's pnfs module to the pnfs layout type specified by id.
  45. * Currently only one pNFS layout driver per filesystem is supported.
  46. *
  47. * @id layout type. Zero (illegal layout type) indicates pNFS not in use.
  48. */
  49. void
  50. set_pnfs_layoutdriver(struct nfs_server *server, u32 id)
  51. {
  52. struct pnfs_layoutdriver_type *ld_type = NULL;
  53. if (id == 0)
  54. goto out_no_driver;
  55. if (!(server->nfs_client->cl_exchange_flags &
  56. (EXCHGID4_FLAG_USE_NON_PNFS | EXCHGID4_FLAG_USE_PNFS_MDS))) {
  57. printk(KERN_ERR "%s: id %u cl_exchange_flags 0x%x\n", __func__,
  58. id, server->nfs_client->cl_exchange_flags);
  59. goto out_no_driver;
  60. }
  61. ld_type = find_pnfs_driver(id);
  62. if (!ld_type) {
  63. request_module("%s-%u", LAYOUT_NFSV4_1_MODULE_PREFIX, id);
  64. ld_type = find_pnfs_driver(id);
  65. if (!ld_type) {
  66. dprintk("%s: No pNFS module found for %u.\n",
  67. __func__, id);
  68. goto out_no_driver;
  69. }
  70. }
  71. server->pnfs_curr_ld = ld_type;
  72. dprintk("%s: pNFS module for %u set\n", __func__, id);
  73. return;
  74. out_no_driver:
  75. dprintk("%s: Using NFSv4 I/O\n", __func__);
  76. server->pnfs_curr_ld = NULL;
  77. }