diff options
Diffstat (limited to 'fs/ocfs2/super.c')
| -rw-r--r-- | fs/ocfs2/super.c | 51 |
1 files changed, 20 insertions, 31 deletions
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 83723179e1ec..26675185b886 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
| @@ -191,6 +191,7 @@ enum { | |||
| 191 | Opt_coherency_full, | 191 | Opt_coherency_full, |
| 192 | Opt_resv_level, | 192 | Opt_resv_level, |
| 193 | Opt_dir_resv_level, | 193 | Opt_dir_resv_level, |
| 194 | Opt_journal_async_commit, | ||
| 194 | Opt_err, | 195 | Opt_err, |
| 195 | }; | 196 | }; |
| 196 | 197 | ||
| @@ -222,6 +223,7 @@ static const match_table_t tokens = { | |||
| 222 | {Opt_coherency_full, "coherency=full"}, | 223 | {Opt_coherency_full, "coherency=full"}, |
| 223 | {Opt_resv_level, "resv_level=%u"}, | 224 | {Opt_resv_level, "resv_level=%u"}, |
| 224 | {Opt_dir_resv_level, "dir_resv_level=%u"}, | 225 | {Opt_dir_resv_level, "dir_resv_level=%u"}, |
| 226 | {Opt_journal_async_commit, "journal_async_commit"}, | ||
| 225 | {Opt_err, NULL} | 227 | {Opt_err, NULL} |
| 226 | }; | 228 | }; |
| 227 | 229 | ||
| @@ -1000,36 +1002,6 @@ static void ocfs2_disable_quotas(struct ocfs2_super *osb) | |||
| 1000 | } | 1002 | } |
| 1001 | } | 1003 | } |
| 1002 | 1004 | ||
| 1003 | /* Handle quota on quotactl */ | ||
| 1004 | static int ocfs2_quota_on(struct super_block *sb, int type, int format_id) | ||
| 1005 | { | ||
| 1006 | unsigned int feature[OCFS2_MAXQUOTAS] = { | ||
| 1007 | OCFS2_FEATURE_RO_COMPAT_USRQUOTA, | ||
| 1008 | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA}; | ||
| 1009 | |||
| 1010 | if (!OCFS2_HAS_RO_COMPAT_FEATURE(sb, feature[type])) | ||
| 1011 | return -EINVAL; | ||
| 1012 | |||
| 1013 | return dquot_enable(sb_dqopt(sb)->files[type], type, | ||
| 1014 | format_id, DQUOT_LIMITS_ENABLED); | ||
| 1015 | } | ||
| 1016 | |||
| 1017 | /* Handle quota off quotactl */ | ||
| 1018 | static int ocfs2_quota_off(struct super_block *sb, int type) | ||
| 1019 | { | ||
| 1020 | return dquot_disable(sb, type, DQUOT_LIMITS_ENABLED); | ||
| 1021 | } | ||
| 1022 | |||
| 1023 | static const struct quotactl_ops ocfs2_quotactl_ops = { | ||
| 1024 | .quota_on_meta = ocfs2_quota_on, | ||
| 1025 | .quota_off = ocfs2_quota_off, | ||
| 1026 | .quota_sync = dquot_quota_sync, | ||
| 1027 | .get_info = dquot_get_dqinfo, | ||
| 1028 | .set_info = dquot_set_dqinfo, | ||
| 1029 | .get_dqblk = dquot_get_dqblk, | ||
| 1030 | .set_dqblk = dquot_set_dqblk, | ||
| 1031 | }; | ||
| 1032 | |||
| 1033 | static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | 1005 | static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) |
| 1034 | { | 1006 | { |
| 1035 | struct dentry *root; | 1007 | struct dentry *root; |
| @@ -1500,6 +1472,9 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
| 1500 | option < OCFS2_MAX_RESV_LEVEL) | 1472 | option < OCFS2_MAX_RESV_LEVEL) |
| 1501 | mopt->dir_resv_level = option; | 1473 | mopt->dir_resv_level = option; |
| 1502 | break; | 1474 | break; |
| 1475 | case Opt_journal_async_commit: | ||
| 1476 | mopt->mount_opt |= OCFS2_MOUNT_JOURNAL_ASYNC_COMMIT; | ||
| 1477 | break; | ||
| 1503 | default: | 1478 | default: |
| 1504 | mlog(ML_ERROR, | 1479 | mlog(ML_ERROR, |
| 1505 | "Unrecognized mount option \"%s\" " | 1480 | "Unrecognized mount option \"%s\" " |
| @@ -1606,6 +1581,9 @@ static int ocfs2_show_options(struct seq_file *s, struct dentry *root) | |||
| 1606 | if (osb->osb_dir_resv_level != osb->osb_resv_level) | 1581 | if (osb->osb_dir_resv_level != osb->osb_resv_level) |
| 1607 | seq_printf(s, ",dir_resv_level=%d", osb->osb_resv_level); | 1582 | seq_printf(s, ",dir_resv_level=%d", osb->osb_resv_level); |
| 1608 | 1583 | ||
| 1584 | if (opts & OCFS2_MOUNT_JOURNAL_ASYNC_COMMIT) | ||
| 1585 | seq_printf(s, ",journal_async_commit"); | ||
| 1586 | |||
| 1609 | return 0; | 1587 | return 0; |
| 1610 | } | 1588 | } |
| 1611 | 1589 | ||
| @@ -1768,6 +1746,8 @@ static void ocfs2_inode_init_once(void *data) | |||
| 1768 | ocfs2_lock_res_init_once(&oi->ip_inode_lockres); | 1746 | ocfs2_lock_res_init_once(&oi->ip_inode_lockres); |
| 1769 | ocfs2_lock_res_init_once(&oi->ip_open_lockres); | 1747 | ocfs2_lock_res_init_once(&oi->ip_open_lockres); |
| 1770 | 1748 | ||
| 1749 | init_waitqueue_head(&oi->append_dio_wq); | ||
| 1750 | |||
| 1771 | ocfs2_metadata_cache_init(INODE_CACHE(&oi->vfs_inode), | 1751 | ocfs2_metadata_cache_init(INODE_CACHE(&oi->vfs_inode), |
| 1772 | &ocfs2_inode_caching_ops); | 1752 | &ocfs2_inode_caching_ops); |
| 1773 | 1753 | ||
| @@ -2079,7 +2059,7 @@ static int ocfs2_initialize_super(struct super_block *sb, | |||
| 2079 | sb->s_op = &ocfs2_sops; | 2059 | sb->s_op = &ocfs2_sops; |
| 2080 | sb->s_d_op = &ocfs2_dentry_ops; | 2060 | sb->s_d_op = &ocfs2_dentry_ops; |
| 2081 | sb->s_export_op = &ocfs2_export_ops; | 2061 | sb->s_export_op = &ocfs2_export_ops; |
| 2082 | sb->s_qcop = &ocfs2_quotactl_ops; | 2062 | sb->s_qcop = &dquot_quotactl_sysfile_ops; |
| 2083 | sb->dq_op = &ocfs2_quota_operations; | 2063 | sb->dq_op = &ocfs2_quota_operations; |
| 2084 | sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; | 2064 | sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; |
| 2085 | sb->s_xattr = ocfs2_xattr_handlers; | 2065 | sb->s_xattr = ocfs2_xattr_handlers; |
| @@ -2475,6 +2455,15 @@ static int ocfs2_check_volume(struct ocfs2_super *osb) | |||
| 2475 | goto finally; | 2455 | goto finally; |
| 2476 | } | 2456 | } |
| 2477 | 2457 | ||
| 2458 | if (osb->s_mount_opt & OCFS2_MOUNT_JOURNAL_ASYNC_COMMIT) | ||
| 2459 | jbd2_journal_set_features(osb->journal->j_journal, | ||
| 2460 | JBD2_FEATURE_COMPAT_CHECKSUM, 0, | ||
| 2461 | JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT); | ||
| 2462 | else | ||
| 2463 | jbd2_journal_clear_features(osb->journal->j_journal, | ||
| 2464 | JBD2_FEATURE_COMPAT_CHECKSUM, 0, | ||
| 2465 | JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT); | ||
| 2466 | |||
| 2478 | if (dirty) { | 2467 | if (dirty) { |
| 2479 | /* recover my local alloc if we didn't unmount cleanly. */ | 2468 | /* recover my local alloc if we didn't unmount cleanly. */ |
| 2480 | status = ocfs2_begin_local_alloc_recovery(osb, | 2469 | status = ocfs2_begin_local_alloc_recovery(osb, |
