aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/super.c
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2012-08-17 09:48:17 -0400
committerTheodore Ts'o <tytso@mit.edu>2012-08-17 09:48:17 -0400
commitdf981d03eeff7971ac7e6ff37000bfa702327ef1 (patch)
tree4e944139b9e45c4af910c517b57f2d9bc7c81a1a /fs/ext4/super.c
parent01fc48e8929e45e67527200017cff4e74e4ba054 (diff)
ext4: add max_dir_size_kb mount option
Very large directories can cause significant performance problems, or perhaps even invoke the OOM killer, if the process is running in a highly constrained memory environment (whether it is VM's with a small amount of memory or in a small memory cgroup). So it is useful, in cloud server/data center environments, to be able to set a filesystem-wide cap on the maximum size of a directory, to ensure that directories never get larger than a sane size. We do this via a new mount option, max_dir_size_kb. If there is an attempt to grow the directory larger than max_dir_size_kb, the system call will return ENOSPC instead. Google-Bug-Id: 6863013 Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r--fs/ext4/super.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 598498904035..5a97e590692d 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -1230,6 +1230,7 @@ enum {
1230 Opt_inode_readahead_blks, Opt_journal_ioprio, 1230 Opt_inode_readahead_blks, Opt_journal_ioprio,
1231 Opt_dioread_nolock, Opt_dioread_lock, 1231 Opt_dioread_nolock, Opt_dioread_lock,
1232 Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable, 1232 Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable,
1233 Opt_max_dir_size_kb,
1233}; 1234};
1234 1235
1235static const match_table_t tokens = { 1236static const match_table_t tokens = {
@@ -1303,6 +1304,7 @@ static const match_table_t tokens = {
1303 {Opt_init_itable, "init_itable=%u"}, 1304 {Opt_init_itable, "init_itable=%u"},
1304 {Opt_init_itable, "init_itable"}, 1305 {Opt_init_itable, "init_itable"},
1305 {Opt_noinit_itable, "noinit_itable"}, 1306 {Opt_noinit_itable, "noinit_itable"},
1307 {Opt_max_dir_size_kb, "max_dir_size_kb=%u"},
1306 {Opt_removed, "check=none"}, /* mount option from ext2/3 */ 1308 {Opt_removed, "check=none"}, /* mount option from ext2/3 */
1307 {Opt_removed, "nocheck"}, /* mount option from ext2/3 */ 1309 {Opt_removed, "nocheck"}, /* mount option from ext2/3 */
1308 {Opt_removed, "reservation"}, /* mount option from ext2/3 */ 1310 {Opt_removed, "reservation"}, /* mount option from ext2/3 */
@@ -1483,6 +1485,7 @@ static const struct mount_opts {
1483 {Opt_jqfmt_vfsold, QFMT_VFS_OLD, MOPT_QFMT}, 1485 {Opt_jqfmt_vfsold, QFMT_VFS_OLD, MOPT_QFMT},
1484 {Opt_jqfmt_vfsv0, QFMT_VFS_V0, MOPT_QFMT}, 1486 {Opt_jqfmt_vfsv0, QFMT_VFS_V0, MOPT_QFMT},
1485 {Opt_jqfmt_vfsv1, QFMT_VFS_V1, MOPT_QFMT}, 1487 {Opt_jqfmt_vfsv1, QFMT_VFS_V1, MOPT_QFMT},
1488 {Opt_max_dir_size_kb, 0, MOPT_GTE0},
1486 {Opt_err, 0, 0} 1489 {Opt_err, 0, 0}
1487}; 1490};
1488 1491
@@ -1598,6 +1601,8 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
1598 if (!args->from) 1601 if (!args->from)
1599 arg = EXT4_DEF_LI_WAIT_MULT; 1602 arg = EXT4_DEF_LI_WAIT_MULT;
1600 sbi->s_li_wait_mult = arg; 1603 sbi->s_li_wait_mult = arg;
1604 } else if (token == Opt_max_dir_size_kb) {
1605 sbi->s_max_dir_size_kb = arg;
1601 } else if (token == Opt_stripe) { 1606 } else if (token == Opt_stripe) {
1602 sbi->s_stripe = arg; 1607 sbi->s_stripe = arg;
1603 } else if (m->flags & MOPT_DATAJ) { 1608 } else if (m->flags & MOPT_DATAJ) {
@@ -1829,6 +1834,8 @@ static int _ext4_show_options(struct seq_file *seq, struct super_block *sb,
1829 if (nodefs || (test_opt(sb, INIT_INODE_TABLE) && 1834 if (nodefs || (test_opt(sb, INIT_INODE_TABLE) &&
1830 (sbi->s_li_wait_mult != EXT4_DEF_LI_WAIT_MULT))) 1835 (sbi->s_li_wait_mult != EXT4_DEF_LI_WAIT_MULT)))
1831 SEQ_OPTS_PRINT("init_itable=%u", sbi->s_li_wait_mult); 1836 SEQ_OPTS_PRINT("init_itable=%u", sbi->s_li_wait_mult);
1837 if (nodefs || sbi->s_max_dir_size_kb)
1838 SEQ_OPTS_PRINT("max_dir_size_kb=%u", sbi->s_max_dir_size_kb);
1832 1839
1833 ext4_show_quota_options(seq, sb); 1840 ext4_show_quota_options(seq, sb);
1834 return 0; 1841 return 0;