mount.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /*
  2. * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
  3. * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
  4. *
  5. * This copyrighted material is made available to anyone wishing to use,
  6. * modify, copy, or redistribute it subject to the terms and conditions
  7. * of the GNU General Public License version 2.
  8. */
  9. #include <linux/slab.h>
  10. #include <linux/spinlock.h>
  11. #include <linux/completion.h>
  12. #include <linux/buffer_head.h>
  13. #include <linux/gfs2_ondisk.h>
  14. #include <linux/parser.h>
  15. #include "gfs2.h"
  16. #include "incore.h"
  17. #include "super.h"
  18. #include "sys.h"
  19. #include "util.h"
  20. enum {
  21. Opt_lockproto,
  22. Opt_locktable,
  23. Opt_hostdata,
  24. Opt_spectator,
  25. Opt_ignore_local_fs,
  26. Opt_localflocks,
  27. Opt_localcaching,
  28. Opt_debug,
  29. Opt_nodebug,
  30. Opt_upgrade,
  31. Opt_acl,
  32. Opt_noacl,
  33. Opt_quota_off,
  34. Opt_quota_account,
  35. Opt_quota_on,
  36. Opt_quota,
  37. Opt_noquota,
  38. Opt_suiddir,
  39. Opt_nosuiddir,
  40. Opt_data_writeback,
  41. Opt_data_ordered,
  42. Opt_meta,
  43. Opt_discard,
  44. Opt_nodiscard,
  45. Opt_err,
  46. };
  47. static const match_table_t tokens = {
  48. {Opt_lockproto, "lockproto=%s"},
  49. {Opt_locktable, "locktable=%s"},
  50. {Opt_hostdata, "hostdata=%s"},
  51. {Opt_spectator, "spectator"},
  52. {Opt_ignore_local_fs, "ignore_local_fs"},
  53. {Opt_localflocks, "localflocks"},
  54. {Opt_localcaching, "localcaching"},
  55. {Opt_debug, "debug"},
  56. {Opt_nodebug, "nodebug"},
  57. {Opt_upgrade, "upgrade"},
  58. {Opt_acl, "acl"},
  59. {Opt_noacl, "noacl"},
  60. {Opt_quota_off, "quota=off"},
  61. {Opt_quota_account, "quota=account"},
  62. {Opt_quota_on, "quota=on"},
  63. {Opt_quota, "quota"},
  64. {Opt_noquota, "noquota"},
  65. {Opt_suiddir, "suiddir"},
  66. {Opt_nosuiddir, "nosuiddir"},
  67. {Opt_data_writeback, "data=writeback"},
  68. {Opt_data_ordered, "data=ordered"},
  69. {Opt_meta, "meta"},
  70. {Opt_discard, "discard"},
  71. {Opt_nodiscard, "nodiscard"},
  72. {Opt_err, NULL}
  73. };
  74. /**
  75. * gfs2_mount_args - Parse mount options
  76. * @sdp:
  77. * @data:
  78. *
  79. * Return: errno
  80. */
  81. int gfs2_mount_args(struct gfs2_sbd *sdp, struct gfs2_args *args, char *options)
  82. {
  83. char *o;
  84. int token;
  85. substring_t tmp[MAX_OPT_ARGS];
  86. /* Split the options into tokens with the "," character and
  87. process them */
  88. while (1) {
  89. o = strsep(&options, ",");
  90. if (o == NULL)
  91. break;
  92. if (*o == '\0')
  93. continue;
  94. token = match_token(o, tokens, tmp);
  95. switch (token) {
  96. case Opt_lockproto:
  97. match_strlcpy(args->ar_lockproto, &tmp[0],
  98. GFS2_LOCKNAME_LEN);
  99. break;
  100. case Opt_locktable:
  101. match_strlcpy(args->ar_locktable, &tmp[0],
  102. GFS2_LOCKNAME_LEN);
  103. break;
  104. case Opt_hostdata:
  105. match_strlcpy(args->ar_hostdata, &tmp[0],
  106. GFS2_LOCKNAME_LEN);
  107. break;
  108. case Opt_spectator:
  109. args->ar_spectator = 1;
  110. break;
  111. case Opt_ignore_local_fs:
  112. args->ar_ignore_local_fs = 1;
  113. break;
  114. case Opt_localflocks:
  115. args->ar_localflocks = 1;
  116. break;
  117. case Opt_localcaching:
  118. args->ar_localcaching = 1;
  119. break;
  120. case Opt_debug:
  121. args->ar_debug = 1;
  122. break;
  123. case Opt_nodebug:
  124. args->ar_debug = 0;
  125. break;
  126. case Opt_upgrade:
  127. args->ar_upgrade = 1;
  128. break;
  129. case Opt_acl:
  130. args->ar_posix_acl = 1;
  131. break;
  132. case Opt_noacl:
  133. args->ar_posix_acl = 0;
  134. break;
  135. case Opt_quota_off:
  136. case Opt_noquota:
  137. args->ar_quota = GFS2_QUOTA_OFF;
  138. break;
  139. case Opt_quota_account:
  140. args->ar_quota = GFS2_QUOTA_ACCOUNT;
  141. break;
  142. case Opt_quota_on:
  143. case Opt_quota:
  144. args->ar_quota = GFS2_QUOTA_ON;
  145. break;
  146. case Opt_suiddir:
  147. args->ar_suiddir = 1;
  148. break;
  149. case Opt_nosuiddir:
  150. args->ar_suiddir = 0;
  151. break;
  152. case Opt_data_writeback:
  153. args->ar_data = GFS2_DATA_WRITEBACK;
  154. break;
  155. case Opt_data_ordered:
  156. args->ar_data = GFS2_DATA_ORDERED;
  157. break;
  158. case Opt_meta:
  159. args->ar_meta = 1;
  160. break;
  161. case Opt_discard:
  162. args->ar_discard = 1;
  163. break;
  164. case Opt_nodiscard:
  165. args->ar_discard = 0;
  166. break;
  167. case Opt_err:
  168. default:
  169. fs_info(sdp, "invalid mount option: %s\n", o);
  170. return -EINVAL;
  171. }
  172. }
  173. return 0;
  174. }