|
@@ -35,6 +35,7 @@
|
|
|
#include <linux/mount.h>
|
|
|
#include <linux/namei.h>
|
|
|
#include <linux/quotaops.h>
|
|
|
+#include <linux/seq_file.h>
|
|
|
#include <asm/uaccess.h>
|
|
|
#include "xattr.h"
|
|
|
#include "acl.h"
|
|
@@ -509,8 +510,41 @@ static void ext3_clear_inode(struct inode *inode)
|
|
|
kfree(rsv);
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_QUOTA
|
|
|
+static int ext3_show_options(struct seq_file *seq, struct vfsmount *vfs)
|
|
|
+{
|
|
|
+ struct ext3_sb_info *sbi = EXT3_SB(vfs->mnt_sb);
|
|
|
+
|
|
|
+ if (sbi->s_mount_opt & EXT3_MOUNT_JOURNAL_DATA)
|
|
|
+ seq_puts(seq, ",data=journal");
|
|
|
+
|
|
|
+ if (sbi->s_mount_opt & EXT3_MOUNT_ORDERED_DATA)
|
|
|
+ seq_puts(seq, ",data=ordered");
|
|
|
+
|
|
|
+ if (sbi->s_mount_opt & EXT3_MOUNT_WRITEBACK_DATA)
|
|
|
+ seq_puts(seq, ",data=writeback");
|
|
|
+
|
|
|
+#if defined(CONFIG_QUOTA)
|
|
|
+ if (sbi->s_jquota_fmt)
|
|
|
+ seq_printf(seq, ",jqfmt=%s",
|
|
|
+ (sbi->s_jquota_fmt == QFMT_VFS_OLD) ? "vfsold": "vfsv0");
|
|
|
+
|
|
|
+ if (sbi->s_qf_names[USRQUOTA])
|
|
|
+ seq_printf(seq, ",usrjquota=%s", sbi->s_qf_names[USRQUOTA]);
|
|
|
+
|
|
|
+ if (sbi->s_qf_names[GRPQUOTA])
|
|
|
+ seq_printf(seq, ",grpjquota=%s", sbi->s_qf_names[GRPQUOTA]);
|
|
|
|
|
|
+ if (sbi->s_mount_opt & EXT3_MOUNT_USRQUOTA)
|
|
|
+ seq_puts(seq, ",usrquota");
|
|
|
+
|
|
|
+ if (sbi->s_mount_opt & EXT3_MOUNT_GRPQUOTA)
|
|
|
+ seq_puts(seq, ",grpquota");
|
|
|
+#endif
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef CONFIG_QUOTA
|
|
|
#define QTYPE2NAME(t) ((t)==USRQUOTA?"user":"group")
|
|
|
#define QTYPE2MOPT(on, t) ((t)==USRQUOTA?((on)##USRJQUOTA):((on)##GRPJQUOTA))
|
|
|
|
|
@@ -569,6 +603,7 @@ static struct super_operations ext3_sops = {
|
|
|
.statfs = ext3_statfs,
|
|
|
.remount_fs = ext3_remount,
|
|
|
.clear_inode = ext3_clear_inode,
|
|
|
+ .show_options = ext3_show_options,
|
|
|
#ifdef CONFIG_QUOTA
|
|
|
.quota_read = ext3_quota_read,
|
|
|
.quota_write = ext3_quota_write,
|
|
@@ -590,7 +625,8 @@ enum {
|
|
|
Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback,
|
|
|
Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota,
|
|
|
Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_quota, Opt_noquota,
|
|
|
- Opt_ignore, Opt_barrier, Opt_err, Opt_resize,
|
|
|
+ Opt_ignore, Opt_barrier, Opt_err, Opt_resize, Opt_usrquota,
|
|
|
+ Opt_grpquota
|
|
|
};
|
|
|
|
|
|
static match_table_t tokens = {
|
|
@@ -634,10 +670,10 @@ static match_table_t tokens = {
|
|
|
{Opt_grpjquota, "grpjquota=%s"},
|
|
|
{Opt_jqfmt_vfsold, "jqfmt=vfsold"},
|
|
|
{Opt_jqfmt_vfsv0, "jqfmt=vfsv0"},
|
|
|
- {Opt_quota, "grpquota"},
|
|
|
+ {Opt_grpquota, "grpquota"},
|
|
|
{Opt_noquota, "noquota"},
|
|
|
{Opt_quota, "quota"},
|
|
|
- {Opt_quota, "usrquota"},
|
|
|
+ {Opt_usrquota, "usrquota"},
|
|
|
{Opt_barrier, "barrier=%u"},
|
|
|
{Opt_err, NULL},
|
|
|
{Opt_resize, "resize"},
|
|
@@ -903,7 +939,13 @@ clear_qf_name:
|
|
|
sbi->s_jquota_fmt = QFMT_VFS_V0;
|
|
|
break;
|
|
|
case Opt_quota:
|
|
|
+ case Opt_usrquota:
|
|
|
set_opt(sbi->s_mount_opt, QUOTA);
|
|
|
+ set_opt(sbi->s_mount_opt, USRQUOTA);
|
|
|
+ break;
|
|
|
+ case Opt_grpquota:
|
|
|
+ set_opt(sbi->s_mount_opt, QUOTA);
|
|
|
+ set_opt(sbi->s_mount_opt, GRPQUOTA);
|
|
|
break;
|
|
|
case Opt_noquota:
|
|
|
if (sb_any_quota_enabled(sb)) {
|
|
@@ -912,8 +954,13 @@ clear_qf_name:
|
|
|
return 0;
|
|
|
}
|
|
|
clear_opt(sbi->s_mount_opt, QUOTA);
|
|
|
+ clear_opt(sbi->s_mount_opt, USRQUOTA);
|
|
|
+ clear_opt(sbi->s_mount_opt, GRPQUOTA);
|
|
|
break;
|
|
|
#else
|
|
|
+ case Opt_quota:
|
|
|
+ case Opt_usrquota:
|
|
|
+ case Opt_grpquota:
|
|
|
case Opt_usrjquota:
|
|
|
case Opt_grpjquota:
|
|
|
case Opt_offusrjquota:
|
|
@@ -924,7 +971,6 @@ clear_qf_name:
|
|
|
"EXT3-fs: journalled quota options not "
|
|
|
"supported.\n");
|
|
|
break;
|
|
|
- case Opt_quota:
|
|
|
case Opt_noquota:
|
|
|
break;
|
|
|
#endif
|
|
@@ -962,14 +1008,38 @@ clear_qf_name:
|
|
|
}
|
|
|
}
|
|
|
#ifdef CONFIG_QUOTA
|
|
|
- if (!sbi->s_jquota_fmt && (sbi->s_qf_names[USRQUOTA] ||
|
|
|
- sbi->s_qf_names[GRPQUOTA])) {
|
|
|
- printk(KERN_ERR
|
|
|
- "EXT3-fs: journalled quota format not specified.\n");
|
|
|
- return 0;
|
|
|
+ if (sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA]) {
|
|
|
+ if ((sbi->s_mount_opt & EXT3_MOUNT_USRQUOTA) &&
|
|
|
+ sbi->s_qf_names[USRQUOTA])
|
|
|
+ clear_opt(sbi->s_mount_opt, USRQUOTA);
|
|
|
+
|
|
|
+ if ((sbi->s_mount_opt & EXT3_MOUNT_GRPQUOTA) &&
|
|
|
+ sbi->s_qf_names[GRPQUOTA])
|
|
|
+ clear_opt(sbi->s_mount_opt, GRPQUOTA);
|
|
|
+
|
|
|
+ if ((sbi->s_qf_names[USRQUOTA] &&
|
|
|
+ (sbi->s_mount_opt & EXT3_MOUNT_GRPQUOTA)) ||
|
|
|
+ (sbi->s_qf_names[GRPQUOTA] &&
|
|
|
+ (sbi->s_mount_opt & EXT3_MOUNT_USRQUOTA))) {
|
|
|
+ printk(KERN_ERR "EXT3-fs: old and new quota "
|
|
|
+ "format mixing.\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!sbi->s_jquota_fmt) {
|
|
|
+ printk(KERN_ERR "EXT3-fs: journalled quota format "
|
|
|
+ "not specified.\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (sbi->s_jquota_fmt) {
|
|
|
+ printk(KERN_ERR "EXT3-fs: journalled quota format "
|
|
|
+ "specified with no journalling "
|
|
|
+ "enabled.\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
}
|
|
|
#endif
|
|
|
-
|
|
|
return 1;
|
|
|
}
|
|
|
|