diff options
Diffstat (limited to 'fs/ext3/super.c')
| -rw-r--r-- | fs/ext3/super.c | 92 |
1 files changed, 81 insertions, 11 deletions
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 3c3c6e399fb3..a93c3609025d 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <linux/mount.h> | 35 | #include <linux/mount.h> |
| 36 | #include <linux/namei.h> | 36 | #include <linux/namei.h> |
| 37 | #include <linux/quotaops.h> | 37 | #include <linux/quotaops.h> |
| 38 | #include <linux/seq_file.h> | ||
| 38 | #include <asm/uaccess.h> | 39 | #include <asm/uaccess.h> |
| 39 | #include "xattr.h" | 40 | #include "xattr.h" |
| 40 | #include "acl.h" | 41 | #include "acl.h" |
| @@ -509,8 +510,41 @@ static void ext3_clear_inode(struct inode *inode) | |||
| 509 | kfree(rsv); | 510 | kfree(rsv); |
| 510 | } | 511 | } |
| 511 | 512 | ||
| 512 | #ifdef CONFIG_QUOTA | 513 | static int ext3_show_options(struct seq_file *seq, struct vfsmount *vfs) |
| 514 | { | ||
| 515 | struct ext3_sb_info *sbi = EXT3_SB(vfs->mnt_sb); | ||
| 516 | |||
| 517 | if (sbi->s_mount_opt & EXT3_MOUNT_JOURNAL_DATA) | ||
| 518 | seq_puts(seq, ",data=journal"); | ||
| 519 | |||
| 520 | if (sbi->s_mount_opt & EXT3_MOUNT_ORDERED_DATA) | ||
| 521 | seq_puts(seq, ",data=ordered"); | ||
| 522 | |||
| 523 | if (sbi->s_mount_opt & EXT3_MOUNT_WRITEBACK_DATA) | ||
| 524 | seq_puts(seq, ",data=writeback"); | ||
| 525 | |||
| 526 | #if defined(CONFIG_QUOTA) | ||
| 527 | if (sbi->s_jquota_fmt) | ||
| 528 | seq_printf(seq, ",jqfmt=%s", | ||
| 529 | (sbi->s_jquota_fmt == QFMT_VFS_OLD) ? "vfsold": "vfsv0"); | ||
| 530 | |||
| 531 | if (sbi->s_qf_names[USRQUOTA]) | ||
| 532 | seq_printf(seq, ",usrjquota=%s", sbi->s_qf_names[USRQUOTA]); | ||
| 533 | |||
| 534 | if (sbi->s_qf_names[GRPQUOTA]) | ||
| 535 | seq_printf(seq, ",grpjquota=%s", sbi->s_qf_names[GRPQUOTA]); | ||
| 513 | 536 | ||
| 537 | if (sbi->s_mount_opt & EXT3_MOUNT_USRQUOTA) | ||
| 538 | seq_puts(seq, ",usrquota"); | ||
| 539 | |||
| 540 | if (sbi->s_mount_opt & EXT3_MOUNT_GRPQUOTA) | ||
| 541 | seq_puts(seq, ",grpquota"); | ||
| 542 | #endif | ||
| 543 | |||
| 544 | return 0; | ||
| 545 | } | ||
| 546 | |||
| 547 | #ifdef CONFIG_QUOTA | ||
| 514 | #define QTYPE2NAME(t) ((t)==USRQUOTA?"user":"group") | 548 | #define QTYPE2NAME(t) ((t)==USRQUOTA?"user":"group") |
| 515 | #define QTYPE2MOPT(on, t) ((t)==USRQUOTA?((on)##USRJQUOTA):((on)##GRPJQUOTA)) | 549 | #define QTYPE2MOPT(on, t) ((t)==USRQUOTA?((on)##USRJQUOTA):((on)##GRPJQUOTA)) |
| 516 | 550 | ||
| @@ -569,6 +603,7 @@ static struct super_operations ext3_sops = { | |||
| 569 | .statfs = ext3_statfs, | 603 | .statfs = ext3_statfs, |
| 570 | .remount_fs = ext3_remount, | 604 | .remount_fs = ext3_remount, |
| 571 | .clear_inode = ext3_clear_inode, | 605 | .clear_inode = ext3_clear_inode, |
| 606 | .show_options = ext3_show_options, | ||
| 572 | #ifdef CONFIG_QUOTA | 607 | #ifdef CONFIG_QUOTA |
| 573 | .quota_read = ext3_quota_read, | 608 | .quota_read = ext3_quota_read, |
| 574 | .quota_write = ext3_quota_write, | 609 | .quota_write = ext3_quota_write, |
| @@ -590,7 +625,8 @@ enum { | |||
| 590 | Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback, | 625 | Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback, |
| 591 | Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, | 626 | Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, |
| 592 | Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_quota, Opt_noquota, | 627 | Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_quota, Opt_noquota, |
| 593 | Opt_ignore, Opt_barrier, Opt_err, Opt_resize, | 628 | Opt_ignore, Opt_barrier, Opt_err, Opt_resize, Opt_usrquota, |
| 629 | Opt_grpquota | ||
| 594 | }; | 630 | }; |
| 595 | 631 | ||
| 596 | static match_table_t tokens = { | 632 | static match_table_t tokens = { |
| @@ -634,10 +670,10 @@ static match_table_t tokens = { | |||
| 634 | {Opt_grpjquota, "grpjquota=%s"}, | 670 | {Opt_grpjquota, "grpjquota=%s"}, |
| 635 | {Opt_jqfmt_vfsold, "jqfmt=vfsold"}, | 671 | {Opt_jqfmt_vfsold, "jqfmt=vfsold"}, |
| 636 | {Opt_jqfmt_vfsv0, "jqfmt=vfsv0"}, | 672 | {Opt_jqfmt_vfsv0, "jqfmt=vfsv0"}, |
| 637 | {Opt_quota, "grpquota"}, | 673 | {Opt_grpquota, "grpquota"}, |
| 638 | {Opt_noquota, "noquota"}, | 674 | {Opt_noquota, "noquota"}, |
| 639 | {Opt_quota, "quota"}, | 675 | {Opt_quota, "quota"}, |
| 640 | {Opt_quota, "usrquota"}, | 676 | {Opt_usrquota, "usrquota"}, |
| 641 | {Opt_barrier, "barrier=%u"}, | 677 | {Opt_barrier, "barrier=%u"}, |
| 642 | {Opt_err, NULL}, | 678 | {Opt_err, NULL}, |
| 643 | {Opt_resize, "resize"}, | 679 | {Opt_resize, "resize"}, |
| @@ -903,7 +939,13 @@ clear_qf_name: | |||
| 903 | sbi->s_jquota_fmt = QFMT_VFS_V0; | 939 | sbi->s_jquota_fmt = QFMT_VFS_V0; |
| 904 | break; | 940 | break; |
| 905 | case Opt_quota: | 941 | case Opt_quota: |
| 942 | case Opt_usrquota: | ||
| 906 | set_opt(sbi->s_mount_opt, QUOTA); | 943 | set_opt(sbi->s_mount_opt, QUOTA); |
| 944 | set_opt(sbi->s_mount_opt, USRQUOTA); | ||
| 945 | break; | ||
| 946 | case Opt_grpquota: | ||
| 947 | set_opt(sbi->s_mount_opt, QUOTA); | ||
| 948 | set_opt(sbi->s_mount_opt, GRPQUOTA); | ||
| 907 | break; | 949 | break; |
| 908 | case Opt_noquota: | 950 | case Opt_noquota: |
| 909 | if (sb_any_quota_enabled(sb)) { | 951 | if (sb_any_quota_enabled(sb)) { |
| @@ -912,8 +954,13 @@ clear_qf_name: | |||
| 912 | return 0; | 954 | return 0; |
| 913 | } | 955 | } |
| 914 | clear_opt(sbi->s_mount_opt, QUOTA); | 956 | clear_opt(sbi->s_mount_opt, QUOTA); |
| 957 | clear_opt(sbi->s_mount_opt, USRQUOTA); | ||
| 958 | clear_opt(sbi->s_mount_opt, GRPQUOTA); | ||
| 915 | break; | 959 | break; |
| 916 | #else | 960 | #else |
| 961 | case Opt_quota: | ||
| 962 | case Opt_usrquota: | ||
| 963 | case Opt_grpquota: | ||
| 917 | case Opt_usrjquota: | 964 | case Opt_usrjquota: |
| 918 | case Opt_grpjquota: | 965 | case Opt_grpjquota: |
| 919 | case Opt_offusrjquota: | 966 | case Opt_offusrjquota: |
| @@ -924,7 +971,6 @@ clear_qf_name: | |||
| 924 | "EXT3-fs: journalled quota options not " | 971 | "EXT3-fs: journalled quota options not " |
| 925 | "supported.\n"); | 972 | "supported.\n"); |
| 926 | break; | 973 | break; |
| 927 | case Opt_quota: | ||
| 928 | case Opt_noquota: | 974 | case Opt_noquota: |
| 929 | break; | 975 | break; |
| 930 | #endif | 976 | #endif |
| @@ -962,14 +1008,38 @@ clear_qf_name: | |||
| 962 | } | 1008 | } |
| 963 | } | 1009 | } |
| 964 | #ifdef CONFIG_QUOTA | 1010 | #ifdef CONFIG_QUOTA |
| 965 | if (!sbi->s_jquota_fmt && (sbi->s_qf_names[USRQUOTA] || | 1011 | if (sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA]) { |
| 966 | sbi->s_qf_names[GRPQUOTA])) { | 1012 | if ((sbi->s_mount_opt & EXT3_MOUNT_USRQUOTA) && |
| 967 | printk(KERN_ERR | 1013 | sbi->s_qf_names[USRQUOTA]) |
| 968 | "EXT3-fs: journalled quota format not specified.\n"); | 1014 | clear_opt(sbi->s_mount_opt, USRQUOTA); |
| 969 | return 0; | 1015 | |
| 1016 | if ((sbi->s_mount_opt & EXT3_MOUNT_GRPQUOTA) && | ||
| 1017 | sbi->s_qf_names[GRPQUOTA]) | ||
| 1018 | clear_opt(sbi->s_mount_opt, GRPQUOTA); | ||
| 1019 | |||
| 1020 | if ((sbi->s_qf_names[USRQUOTA] && | ||
| 1021 | (sbi->s_mount_opt & EXT3_MOUNT_GRPQUOTA)) || | ||
| 1022 | (sbi->s_qf_names[GRPQUOTA] && | ||
| 1023 | (sbi->s_mount_opt & EXT3_MOUNT_USRQUOTA))) { | ||
| 1024 | printk(KERN_ERR "EXT3-fs: old and new quota " | ||
| 1025 | "format mixing.\n"); | ||
| 1026 | return 0; | ||
| 1027 | } | ||
| 1028 | |||
| 1029 | if (!sbi->s_jquota_fmt) { | ||
| 1030 | printk(KERN_ERR "EXT3-fs: journalled quota format " | ||
| 1031 | "not specified.\n"); | ||
| 1032 | return 0; | ||
| 1033 | } | ||
| 1034 | } else { | ||
| 1035 | if (sbi->s_jquota_fmt) { | ||
| 1036 | printk(KERN_ERR "EXT3-fs: journalled quota format " | ||
| 1037 | "specified with no journalling " | ||
| 1038 | "enabled.\n"); | ||
| 1039 | return 0; | ||
| 1040 | } | ||
| 970 | } | 1041 | } |
| 971 | #endif | 1042 | #endif |
| 972 | |||
| 973 | return 1; | 1043 | return 1; |
| 974 | } | 1044 | } |
| 975 | 1045 | ||
