diff options
-rw-r--r-- | fs/gfs2/incore.h | 1 | ||||
-rw-r--r-- | fs/gfs2/mount.c | 10 | ||||
-rw-r--r-- | fs/gfs2/ops_fstype.c | 4 | ||||
-rw-r--r-- | fs/gfs2/ops_super.c | 13 | ||||
-rw-r--r-- | fs/gfs2/sys.c | 92 |
5 files changed, 60 insertions, 60 deletions
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index 399d1b978049..65f438e9537a 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h | |||
@@ -418,6 +418,7 @@ struct gfs2_args { | |||
418 | unsigned int ar_data:2; /* ordered/writeback */ | 418 | unsigned int ar_data:2; /* ordered/writeback */ |
419 | unsigned int ar_meta:1; /* mount metafs */ | 419 | unsigned int ar_meta:1; /* mount metafs */ |
420 | unsigned int ar_discard:1; /* discard requests */ | 420 | unsigned int ar_discard:1; /* discard requests */ |
421 | int ar_commit; /* Commit interval */ | ||
421 | }; | 422 | }; |
422 | 423 | ||
423 | struct gfs2_tune { | 424 | struct gfs2_tune { |
diff --git a/fs/gfs2/mount.c b/fs/gfs2/mount.c index f7e8527a21e0..947af151fa24 100644 --- a/fs/gfs2/mount.c +++ b/fs/gfs2/mount.c | |||
@@ -45,6 +45,7 @@ enum { | |||
45 | Opt_meta, | 45 | Opt_meta, |
46 | Opt_discard, | 46 | Opt_discard, |
47 | Opt_nodiscard, | 47 | Opt_nodiscard, |
48 | Opt_commit, | ||
48 | Opt_err, | 49 | Opt_err, |
49 | }; | 50 | }; |
50 | 51 | ||
@@ -73,6 +74,7 @@ static const match_table_t tokens = { | |||
73 | {Opt_meta, "meta"}, | 74 | {Opt_meta, "meta"}, |
74 | {Opt_discard, "discard"}, | 75 | {Opt_discard, "discard"}, |
75 | {Opt_nodiscard, "nodiscard"}, | 76 | {Opt_nodiscard, "nodiscard"}, |
77 | {Opt_commit, "commit=%d"}, | ||
76 | {Opt_err, NULL} | 78 | {Opt_err, NULL} |
77 | }; | 79 | }; |
78 | 80 | ||
@@ -89,6 +91,7 @@ int gfs2_mount_args(struct gfs2_sbd *sdp, struct gfs2_args *args, char *options) | |||
89 | char *o; | 91 | char *o; |
90 | int token; | 92 | int token; |
91 | substring_t tmp[MAX_OPT_ARGS]; | 93 | substring_t tmp[MAX_OPT_ARGS]; |
94 | int rv; | ||
92 | 95 | ||
93 | /* Split the options into tokens with the "," character and | 96 | /* Split the options into tokens with the "," character and |
94 | process them */ | 97 | process them */ |
@@ -173,6 +176,13 @@ int gfs2_mount_args(struct gfs2_sbd *sdp, struct gfs2_args *args, char *options) | |||
173 | case Opt_nodiscard: | 176 | case Opt_nodiscard: |
174 | args->ar_discard = 0; | 177 | args->ar_discard = 0; |
175 | break; | 178 | break; |
179 | case Opt_commit: | ||
180 | rv = match_int(&tmp[0], &args->ar_commit); | ||
181 | if (rv || args->ar_commit <= 0) { | ||
182 | fs_info(sdp, "commit mount option requires a positive numeric argument\n"); | ||
183 | return rv ? rv : -EINVAL; | ||
184 | } | ||
185 | break; | ||
176 | case Opt_err: | 186 | case Opt_err: |
177 | default: | 187 | default: |
178 | fs_info(sdp, "invalid mount option: %s\n", o); | 188 | fs_info(sdp, "invalid mount option: %s\n", o); |
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 1ff9473ea753..7981fbc9fc3b 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c | |||
@@ -55,7 +55,6 @@ static void gfs2_tune_init(struct gfs2_tune *gt) | |||
55 | spin_lock_init(>->gt_spin); | 55 | spin_lock_init(>->gt_spin); |
56 | 56 | ||
57 | gt->gt_incore_log_blocks = 1024; | 57 | gt->gt_incore_log_blocks = 1024; |
58 | gt->gt_log_flush_secs = 60; | ||
59 | gt->gt_recoverd_secs = 60; | 58 | gt->gt_recoverd_secs = 60; |
60 | gt->gt_logd_secs = 1; | 59 | gt->gt_logd_secs = 1; |
61 | gt->gt_quota_simul_sync = 64; | 60 | gt->gt_quota_simul_sync = 64; |
@@ -1165,6 +1164,7 @@ static int fill_super(struct super_block *sb, void *data, int silent) | |||
1165 | 1164 | ||
1166 | sdp->sd_args.ar_quota = GFS2_QUOTA_DEFAULT; | 1165 | sdp->sd_args.ar_quota = GFS2_QUOTA_DEFAULT; |
1167 | sdp->sd_args.ar_data = GFS2_DATA_DEFAULT; | 1166 | sdp->sd_args.ar_data = GFS2_DATA_DEFAULT; |
1167 | sdp->sd_args.ar_commit = 60; | ||
1168 | 1168 | ||
1169 | error = gfs2_mount_args(sdp, &sdp->sd_args, data); | 1169 | error = gfs2_mount_args(sdp, &sdp->sd_args, data); |
1170 | if (error) { | 1170 | if (error) { |
@@ -1191,6 +1191,8 @@ static int fill_super(struct super_block *sb, void *data, int silent) | |||
1191 | GFS2_BASIC_BLOCK_SHIFT; | 1191 | GFS2_BASIC_BLOCK_SHIFT; |
1192 | sdp->sd_fsb2bb = 1 << sdp->sd_fsb2bb_shift; | 1192 | sdp->sd_fsb2bb = 1 << sdp->sd_fsb2bb_shift; |
1193 | 1193 | ||
1194 | sdp->sd_tune.gt_log_flush_secs = sdp->sd_args.ar_commit; | ||
1195 | |||
1194 | error = init_names(sdp, silent); | 1196 | error = init_names(sdp, silent); |
1195 | if (error) | 1197 | if (error) |
1196 | goto fail; | 1198 | goto fail; |
diff --git a/fs/gfs2/ops_super.c b/fs/gfs2/ops_super.c index 458019569dcb..0677a8378560 100644 --- a/fs/gfs2/ops_super.c +++ b/fs/gfs2/ops_super.c | |||
@@ -436,8 +436,12 @@ static int gfs2_remount_fs(struct super_block *sb, int *flags, char *data) | |||
436 | { | 436 | { |
437 | struct gfs2_sbd *sdp = sb->s_fs_info; | 437 | struct gfs2_sbd *sdp = sb->s_fs_info; |
438 | struct gfs2_args args = sdp->sd_args; /* Default to current settings */ | 438 | struct gfs2_args args = sdp->sd_args; /* Default to current settings */ |
439 | struct gfs2_tune *gt = &sdp->sd_tune; | ||
439 | int error; | 440 | int error; |
440 | 441 | ||
442 | spin_lock(>->gt_spin); | ||
443 | args.ar_commit = gt->gt_log_flush_secs; | ||
444 | spin_unlock(>->gt_spin); | ||
441 | error = gfs2_mount_args(sdp, &args, data); | 445 | error = gfs2_mount_args(sdp, &args, data); |
442 | if (error) | 446 | if (error) |
443 | return error; | 447 | return error; |
@@ -473,6 +477,10 @@ static int gfs2_remount_fs(struct super_block *sb, int *flags, char *data) | |||
473 | sb->s_flags |= MS_POSIXACL; | 477 | sb->s_flags |= MS_POSIXACL; |
474 | else | 478 | else |
475 | sb->s_flags &= ~MS_POSIXACL; | 479 | sb->s_flags &= ~MS_POSIXACL; |
480 | spin_lock(>->gt_spin); | ||
481 | gt->gt_log_flush_secs = args.ar_commit; | ||
482 | spin_unlock(>->gt_spin); | ||
483 | |||
476 | return 0; | 484 | return 0; |
477 | } | 485 | } |
478 | 486 | ||
@@ -550,6 +558,7 @@ static int gfs2_show_options(struct seq_file *s, struct vfsmount *mnt) | |||
550 | { | 558 | { |
551 | struct gfs2_sbd *sdp = mnt->mnt_sb->s_fs_info; | 559 | struct gfs2_sbd *sdp = mnt->mnt_sb->s_fs_info; |
552 | struct gfs2_args *args = &sdp->sd_args; | 560 | struct gfs2_args *args = &sdp->sd_args; |
561 | int lfsecs; | ||
553 | 562 | ||
554 | if (is_ancestor(mnt->mnt_root, sdp->sd_master_dir)) | 563 | if (is_ancestor(mnt->mnt_root, sdp->sd_master_dir)) |
555 | seq_printf(s, ",meta"); | 564 | seq_printf(s, ",meta"); |
@@ -610,7 +619,9 @@ static int gfs2_show_options(struct seq_file *s, struct vfsmount *mnt) | |||
610 | } | 619 | } |
611 | if (args->ar_discard) | 620 | if (args->ar_discard) |
612 | seq_printf(s, ",discard"); | 621 | seq_printf(s, ",discard"); |
613 | 622 | lfsecs = sdp->sd_tune.gt_log_flush_secs; | |
623 | if (lfsecs != 60) | ||
624 | seq_printf(s, ",commit=%d", lfsecs); | ||
614 | return 0; | 625 | return 0; |
615 | } | 626 | } |
616 | 627 | ||
diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c index 7655f5025fec..d53b22edc980 100644 --- a/fs/gfs2/sys.c +++ b/fs/gfs2/sys.c | |||
@@ -26,6 +26,36 @@ | |||
26 | #include "util.h" | 26 | #include "util.h" |
27 | #include "glops.h" | 27 | #include "glops.h" |
28 | 28 | ||
29 | struct gfs2_attr { | ||
30 | struct attribute attr; | ||
31 | ssize_t (*show)(struct gfs2_sbd *, char *); | ||
32 | ssize_t (*store)(struct gfs2_sbd *, const char *, size_t); | ||
33 | }; | ||
34 | |||
35 | static ssize_t gfs2_attr_show(struct kobject *kobj, struct attribute *attr, | ||
36 | char *buf) | ||
37 | { | ||
38 | struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj); | ||
39 | struct gfs2_attr *a = container_of(attr, struct gfs2_attr, attr); | ||
40 | return a->show ? a->show(sdp, buf) : 0; | ||
41 | } | ||
42 | |||
43 | static ssize_t gfs2_attr_store(struct kobject *kobj, struct attribute *attr, | ||
44 | const char *buf, size_t len) | ||
45 | { | ||
46 | struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj); | ||
47 | struct gfs2_attr *a = container_of(attr, struct gfs2_attr, attr); | ||
48 | return a->store ? a->store(sdp, buf, len) : len; | ||
49 | } | ||
50 | |||
51 | static struct sysfs_ops gfs2_attr_ops = { | ||
52 | .show = gfs2_attr_show, | ||
53 | .store = gfs2_attr_store, | ||
54 | }; | ||
55 | |||
56 | |||
57 | static struct kset *gfs2_kset; | ||
58 | |||
29 | static ssize_t id_show(struct gfs2_sbd *sdp, char *buf) | 59 | static ssize_t id_show(struct gfs2_sbd *sdp, char *buf) |
30 | { | 60 | { |
31 | return snprintf(buf, PAGE_SIZE, "%u:%u\n", | 61 | return snprintf(buf, PAGE_SIZE, "%u:%u\n", |
@@ -212,11 +242,6 @@ static ssize_t demote_rq_store(struct gfs2_sbd *sdp, const char *buf, size_t len | |||
212 | return len; | 242 | return len; |
213 | } | 243 | } |
214 | 244 | ||
215 | struct gfs2_attr { | ||
216 | struct attribute attr; | ||
217 | ssize_t (*show)(struct gfs2_sbd *, char *); | ||
218 | ssize_t (*store)(struct gfs2_sbd *, const char *, size_t); | ||
219 | }; | ||
220 | 245 | ||
221 | #define GFS2_ATTR(name, mode, show, store) \ | 246 | #define GFS2_ATTR(name, mode, show, store) \ |
222 | static struct gfs2_attr gfs2_attr_##name = __ATTR(name, mode, show, store) | 247 | static struct gfs2_attr gfs2_attr_##name = __ATTR(name, mode, show, store) |
@@ -246,49 +271,21 @@ static struct attribute *gfs2_attrs[] = { | |||
246 | NULL, | 271 | NULL, |
247 | }; | 272 | }; |
248 | 273 | ||
249 | static ssize_t gfs2_attr_show(struct kobject *kobj, struct attribute *attr, | ||
250 | char *buf) | ||
251 | { | ||
252 | struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj); | ||
253 | struct gfs2_attr *a = container_of(attr, struct gfs2_attr, attr); | ||
254 | return a->show ? a->show(sdp, buf) : 0; | ||
255 | } | ||
256 | |||
257 | static ssize_t gfs2_attr_store(struct kobject *kobj, struct attribute *attr, | ||
258 | const char *buf, size_t len) | ||
259 | { | ||
260 | struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj); | ||
261 | struct gfs2_attr *a = container_of(attr, struct gfs2_attr, attr); | ||
262 | return a->store ? a->store(sdp, buf, len) : len; | ||
263 | } | ||
264 | |||
265 | static struct sysfs_ops gfs2_attr_ops = { | ||
266 | .show = gfs2_attr_show, | ||
267 | .store = gfs2_attr_store, | ||
268 | }; | ||
269 | |||
270 | static struct kobj_type gfs2_ktype = { | 274 | static struct kobj_type gfs2_ktype = { |
271 | .default_attrs = gfs2_attrs, | 275 | .default_attrs = gfs2_attrs, |
272 | .sysfs_ops = &gfs2_attr_ops, | 276 | .sysfs_ops = &gfs2_attr_ops, |
273 | }; | 277 | }; |
274 | 278 | ||
275 | static struct kset *gfs2_kset; | ||
276 | |||
277 | /* | 279 | /* |
278 | * display struct lm_lockstruct fields | 280 | * display struct lm_lockstruct fields |
279 | */ | 281 | */ |
280 | 282 | ||
281 | struct lockstruct_attr { | ||
282 | struct attribute attr; | ||
283 | ssize_t (*show)(struct gfs2_sbd *, char *); | ||
284 | }; | ||
285 | |||
286 | #define LOCKSTRUCT_ATTR(name, fmt) \ | 283 | #define LOCKSTRUCT_ATTR(name, fmt) \ |
287 | static ssize_t name##_show(struct gfs2_sbd *sdp, char *buf) \ | 284 | static ssize_t name##_show(struct gfs2_sbd *sdp, char *buf) \ |
288 | { \ | 285 | { \ |
289 | return snprintf(buf, PAGE_SIZE, fmt, sdp->sd_lockstruct.ls_##name); \ | 286 | return snprintf(buf, PAGE_SIZE, fmt, sdp->sd_lockstruct.ls_##name); \ |
290 | } \ | 287 | } \ |
291 | static struct lockstruct_attr lockstruct_attr_##name = __ATTR_RO(name) | 288 | static struct gfs2_attr lockstruct_attr_##name = __ATTR_RO(name) |
292 | 289 | ||
293 | LOCKSTRUCT_ATTR(jid, "%u\n"); | 290 | LOCKSTRUCT_ATTR(jid, "%u\n"); |
294 | LOCKSTRUCT_ATTR(first, "%u\n"); | 291 | LOCKSTRUCT_ATTR(first, "%u\n"); |
@@ -401,14 +398,8 @@ static ssize_t recover_status_show(struct gfs2_sbd *sdp, char *buf) | |||
401 | return sprintf(buf, "%d\n", ls->ls_recover_jid_status); | 398 | return sprintf(buf, "%d\n", ls->ls_recover_jid_status); |
402 | } | 399 | } |
403 | 400 | ||
404 | struct gdlm_attr { | ||
405 | struct attribute attr; | ||
406 | ssize_t (*show)(struct gfs2_sbd *sdp, char *); | ||
407 | ssize_t (*store)(struct gfs2_sbd *sdp, const char *, size_t); | ||
408 | }; | ||
409 | |||
410 | #define GDLM_ATTR(_name,_mode,_show,_store) \ | 401 | #define GDLM_ATTR(_name,_mode,_show,_store) \ |
411 | static struct gdlm_attr gdlm_attr_##_name = __ATTR(_name,_mode,_show,_store) | 402 | static struct gfs2_attr gdlm_attr_##_name = __ATTR(_name,_mode,_show,_store) |
412 | 403 | ||
413 | GDLM_ATTR(proto_name, 0444, proto_name_show, NULL); | 404 | GDLM_ATTR(proto_name, 0444, proto_name_show, NULL); |
414 | GDLM_ATTR(block, 0644, block_show, block_store); | 405 | GDLM_ATTR(block, 0644, block_show, block_store); |
@@ -434,21 +425,12 @@ static struct attribute *lock_module_attrs[] = { | |||
434 | NULL, | 425 | NULL, |
435 | }; | 426 | }; |
436 | 427 | ||
437 | /* | ||
438 | * display struct gfs2_args fields | ||
439 | */ | ||
440 | |||
441 | struct args_attr { | ||
442 | struct attribute attr; | ||
443 | ssize_t (*show)(struct gfs2_sbd *, char *); | ||
444 | }; | ||
445 | |||
446 | #define ARGS_ATTR(name, fmt) \ | 428 | #define ARGS_ATTR(name, fmt) \ |
447 | static ssize_t name##_show(struct gfs2_sbd *sdp, char *buf) \ | 429 | static ssize_t name##_show(struct gfs2_sbd *sdp, char *buf) \ |
448 | { \ | 430 | { \ |
449 | return snprintf(buf, PAGE_SIZE, fmt, sdp->sd_args.ar_##name); \ | 431 | return snprintf(buf, PAGE_SIZE, fmt, sdp->sd_args.ar_##name); \ |
450 | } \ | 432 | } \ |
451 | static struct args_attr args_attr_##name = __ATTR_RO(name) | 433 | static struct gfs2_attr args_attr_##name = __ATTR_RO(name) |
452 | 434 | ||
453 | ARGS_ATTR(lockproto, "%s\n"); | 435 | ARGS_ATTR(lockproto, "%s\n"); |
454 | ARGS_ATTR(locktable, "%s\n"); | 436 | ARGS_ATTR(locktable, "%s\n"); |
@@ -531,14 +513,8 @@ static ssize_t tune_set(struct gfs2_sbd *sdp, unsigned int *field, | |||
531 | return len; | 513 | return len; |
532 | } | 514 | } |
533 | 515 | ||
534 | struct tune_attr { | ||
535 | struct attribute attr; | ||
536 | ssize_t (*show)(struct gfs2_sbd *, char *); | ||
537 | ssize_t (*store)(struct gfs2_sbd *, const char *, size_t); | ||
538 | }; | ||
539 | |||
540 | #define TUNE_ATTR_3(name, show, store) \ | 516 | #define TUNE_ATTR_3(name, show, store) \ |
541 | static struct tune_attr tune_attr_##name = __ATTR(name, 0644, show, store) | 517 | static struct gfs2_attr tune_attr_##name = __ATTR(name, 0644, show, store) |
542 | 518 | ||
543 | #define TUNE_ATTR_2(name, store) \ | 519 | #define TUNE_ATTR_2(name, store) \ |
544 | static ssize_t name##_show(struct gfs2_sbd *sdp, char *buf) \ | 520 | static ssize_t name##_show(struct gfs2_sbd *sdp, char *buf) \ |