2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
3 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
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.
10 #include <linux/sched.h>
11 #include <linux/slab.h>
12 #include <linux/spinlock.h>
13 #include <linux/completion.h>
14 #include <linux/buffer_head.h>
15 #include <linux/gfs2_ondisk.h>
16 #include <linux/lm_interface.h>
25 * gfs2_mount_args - Parse mount options
32 int gfs2_mount_args(struct gfs2_sbd
*sdp
, char *data_arg
, int remount
)
34 struct gfs2_args
*args
= &sdp
->sd_args
;
35 char *data
= data_arg
;
36 char *options
, *o
, *v
;
40 /* If someone preloaded options, use those instead */
41 spin_lock(&gfs2_sys_margs_lock
);
43 data
= gfs2_sys_margs
;
44 gfs2_sys_margs
= NULL
;
46 spin_unlock(&gfs2_sys_margs_lock
);
48 /* Set some defaults */
49 args
->ar_num_glockd
= GFS2_GLOCKD_DEFAULT
;
50 args
->ar_quota
= GFS2_QUOTA_DEFAULT
;
51 args
->ar_data
= GFS2_DATA_DEFAULT
;
54 /* Split the options into tokens with the "," character and
57 for (options
= data
; (o
= strsep(&options
, ",")); ) {
65 if (!strcmp(o
, "lockproto")) {
68 if (remount
&& strcmp(v
, args
->ar_lockproto
))
70 strncpy(args
->ar_lockproto
, v
, GFS2_LOCKNAME_LEN
);
71 args
->ar_lockproto
[GFS2_LOCKNAME_LEN
- 1] = 0;
74 else if (!strcmp(o
, "locktable")) {
77 if (remount
&& strcmp(v
, args
->ar_locktable
))
79 strncpy(args
->ar_locktable
, v
, GFS2_LOCKNAME_LEN
);
80 args
->ar_locktable
[GFS2_LOCKNAME_LEN
- 1] = 0;
83 else if (!strcmp(o
, "hostdata")) {
86 if (remount
&& strcmp(v
, args
->ar_hostdata
))
88 strncpy(args
->ar_hostdata
, v
, GFS2_LOCKNAME_LEN
);
89 args
->ar_hostdata
[GFS2_LOCKNAME_LEN
- 1] = 0;
92 else if (!strcmp(o
, "spectator")) {
93 if (remount
&& !args
->ar_spectator
)
95 args
->ar_spectator
= 1;
96 sdp
->sd_vfs
->s_flags
|= MS_RDONLY
;
99 else if (!strcmp(o
, "ignore_local_fs")) {
100 if (remount
&& !args
->ar_ignore_local_fs
)
102 args
->ar_ignore_local_fs
= 1;
105 else if (!strcmp(o
, "localflocks")) {
106 if (remount
&& !args
->ar_localflocks
)
108 args
->ar_localflocks
= 1;
111 else if (!strcmp(o
, "localcaching")) {
112 if (remount
&& !args
->ar_localcaching
)
114 args
->ar_localcaching
= 1;
117 else if (!strcmp(o
, "debug"))
120 else if (!strcmp(o
, "nodebug"))
123 else if (!strcmp(o
, "upgrade")) {
124 if (remount
&& !args
->ar_upgrade
)
126 args
->ar_upgrade
= 1;
129 else if (!strcmp(o
, "num_glockd")) {
134 if (remount
&& x
!= args
->ar_num_glockd
)
136 if (!x
|| x
> GFS2_GLOCKD_MAX
) {
137 fs_info(sdp
, "0 < num_glockd <= %u (not %u)\n",
142 args
->ar_num_glockd
= x
;
145 else if (!strcmp(o
, "acl")) {
146 args
->ar_posix_acl
= 1;
147 sdp
->sd_vfs
->s_flags
|= MS_POSIXACL
;
150 else if (!strcmp(o
, "noacl")) {
151 args
->ar_posix_acl
= 0;
152 sdp
->sd_vfs
->s_flags
&= ~MS_POSIXACL
;
155 else if (!strcmp(o
, "quota")) {
158 if (!strcmp(v
, "off"))
159 args
->ar_quota
= GFS2_QUOTA_OFF
;
160 else if (!strcmp(v
, "account"))
161 args
->ar_quota
= GFS2_QUOTA_ACCOUNT
;
162 else if (!strcmp(v
, "on"))
163 args
->ar_quota
= GFS2_QUOTA_ON
;
165 fs_info(sdp
, "invalid value for quota\n");
171 else if (!strcmp(o
, "suiddir"))
172 args
->ar_suiddir
= 1;
174 else if (!strcmp(o
, "nosuiddir"))
175 args
->ar_suiddir
= 0;
177 else if (!strcmp(o
, "data")) {
180 if (!strcmp(v
, "writeback"))
181 args
->ar_data
= GFS2_DATA_WRITEBACK
;
182 else if (!strcmp(v
, "ordered"))
183 args
->ar_data
= GFS2_DATA_ORDERED
;
185 fs_info(sdp
, "invalid value for data\n");
192 fs_info(sdp
, "unknown option: %s\n", o
);
199 fs_info(sdp
, "invalid mount option(s)\n");
201 if (data
!= data_arg
)
207 fs_info(sdp
, "need value for option %s\n", o
);
211 fs_info(sdp
, "can't remount with option %s\n", o
);