aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/super.c230
1 files changed, 113 insertions, 117 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 69e5e70cfdee..9b36c11baad9 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -1508,8 +1508,7 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
1508 case Opt_sb: 1508 case Opt_sb:
1509 return 1; /* handled by get_sb_block() */ 1509 return 1; /* handled by get_sb_block() */
1510 case Opt_removed: 1510 case Opt_removed:
1511 ext4_msg(sb, KERN_WARNING, 1511 ext4_msg(sb, KERN_WARNING, "Ignoring removed %s option", opt);
1512 "Ignoring removed %s option", opt);
1513 return 1; 1512 return 1;
1514 case Opt_abort: 1513 case Opt_abort:
1515 sbi->s_mount_flags |= EXT4_MF_FS_ABORTED; 1514 sbi->s_mount_flags |= EXT4_MF_FS_ABORTED;
@@ -1519,132 +1518,129 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
1519 return 1; 1518 return 1;
1520 } 1519 }
1521 1520
1522 for (m = ext4_mount_opts; m->token != Opt_err; m++) { 1521 for (m = ext4_mount_opts; m->token != Opt_err; m++)
1523 if (token != m->token) 1522 if (token == m->token)
1524 continue; 1523 break;
1525 if (args->from && match_int(args, &arg)) 1524
1525 if (m->token == Opt_err) {
1526 ext4_msg(sb, KERN_ERR, "Unrecognized mount option \"%s\" "
1527 "or missing value", opt);
1528 return -1;
1529 }
1530
1531 if (args->from && match_int(args, &arg))
1532 return -1;
1533 if (args->from && (m->flags & MOPT_GTE0) && (arg < 0))
1534 return -1;
1535 if (m->flags & MOPT_EXPLICIT)
1536 set_opt2(sb, EXPLICIT_DELALLOC);
1537 if (m->flags & MOPT_CLEAR_ERR)
1538 clear_opt(sb, ERRORS_MASK);
1539 if (token == Opt_noquota && sb_any_quota_loaded(sb)) {
1540 ext4_msg(sb, KERN_ERR, "Cannot change quota "
1541 "options when quota turned on");
1542 return -1;
1543 }
1544
1545 if (m->flags & MOPT_NOSUPPORT) {
1546 ext4_msg(sb, KERN_ERR, "%s option not supported", opt);
1547 } else if (token == Opt_commit) {
1548 if (arg == 0)
1549 arg = JBD2_DEFAULT_MAX_COMMIT_AGE;
1550 sbi->s_commit_interval = HZ * arg;
1551 } else if (token == Opt_max_batch_time) {
1552 if (arg == 0)
1553 arg = EXT4_DEF_MAX_BATCH_TIME;
1554 sbi->s_max_batch_time = arg;
1555 } else if (token == Opt_min_batch_time) {
1556 sbi->s_min_batch_time = arg;
1557 } else if (token == Opt_inode_readahead_blks) {
1558 if (arg > (1 << 30))
1526 return -1; 1559 return -1;
1527 if (args->from && (m->flags & MOPT_GTE0) && (arg < 0)) 1560 if (arg && !is_power_of_2(arg)) {
1561 ext4_msg(sb, KERN_ERR, "EXT4-fs: inode_readahead_blks"
1562 " must be a power of 2");
1528 return -1; 1563 return -1;
1529 if (m->flags & MOPT_EXPLICIT) 1564 }
1530 set_opt2(sb, EXPLICIT_DELALLOC); 1565 sbi->s_inode_readahead_blks = arg;
1531 if (m->flags & MOPT_CLEAR_ERR) 1566 } else if (token == Opt_init_itable) {
1532 clear_opt(sb, ERRORS_MASK); 1567 set_opt(sb, INIT_INODE_TABLE);
1533 if (token == Opt_noquota && sb_any_quota_loaded(sb)) { 1568 if (!args->from)
1534 ext4_msg(sb, KERN_ERR, "Cannot change quota " 1569 arg = EXT4_DEF_LI_WAIT_MULT;
1535 "options when quota turned on"); 1570 sbi->s_li_wait_mult = arg;
1571 } else if (token == Opt_max_dir_size_kb) {
1572 sbi->s_max_dir_size_kb = arg;
1573 } else if (token == Opt_stripe) {
1574 sbi->s_stripe = arg;
1575 } else if (token == Opt_resuid) {
1576 uid = make_kuid(current_user_ns(), arg);
1577 if (!uid_valid(uid)) {
1578 ext4_msg(sb, KERN_ERR, "Invalid uid value %d", arg);
1536 return -1; 1579 return -1;
1537 } 1580 }
1538 1581 sbi->s_resuid = uid;
1539 if (m->flags & MOPT_NOSUPPORT) { 1582 } else if (token == Opt_resgid) {
1540 ext4_msg(sb, KERN_ERR, "%s option not supported", opt); 1583 gid = make_kgid(current_user_ns(), arg);
1541 } else if (token == Opt_commit) { 1584 if (!gid_valid(gid)) {
1542 if (arg == 0) 1585 ext4_msg(sb, KERN_ERR, "Invalid gid value %d", arg);
1543 arg = JBD2_DEFAULT_MAX_COMMIT_AGE; 1586 return -1;
1544 sbi->s_commit_interval = HZ * arg; 1587 }
1545 } else if (token == Opt_max_batch_time) { 1588 sbi->s_resgid = gid;
1546 if (arg == 0) 1589 } else if (token == Opt_journal_dev) {
1547 arg = EXT4_DEF_MAX_BATCH_TIME; 1590 if (is_remount) {
1548 sbi->s_max_batch_time = arg; 1591 ext4_msg(sb, KERN_ERR,
1549 } else if (token == Opt_min_batch_time) { 1592 "Cannot specify journal on remount");
1550 sbi->s_min_batch_time = arg; 1593 return -1;
1551 } else if (token == Opt_inode_readahead_blks) { 1594 }
1552 if (arg > (1 << 30)) 1595 *journal_devnum = arg;
1553 return -1; 1596 } else if (token == Opt_journal_ioprio) {
1554 if (arg && !is_power_of_2(arg)) { 1597 if (arg > 7) {
1555 ext4_msg(sb, KERN_ERR, 1598 ext4_msg(sb, KERN_ERR, "Invalid journal IO priority"
1556 "EXT4-fs: inode_readahead_blks" 1599 " (must be 0-7)");
1557 " must be a power of 2"); 1600 return -1;
1558 return -1; 1601 }
1559 } 1602 *journal_ioprio =
1560 sbi->s_inode_readahead_blks = arg; 1603 IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, arg);
1561 } else if (token == Opt_init_itable) { 1604 } else if (m->flags & MOPT_DATAJ) {
1562 set_opt(sb, INIT_INODE_TABLE); 1605 if (is_remount) {
1563 if (!args->from) 1606 if (!sbi->s_journal)
1564 arg = EXT4_DEF_LI_WAIT_MULT; 1607 ext4_msg(sb, KERN_WARNING, "Remounting file system with no journal so ignoring journalled data option");
1565 sbi->s_li_wait_mult = arg; 1608 else if (test_opt(sb, DATA_FLAGS) != m->mount_opt) {
1566 } else if (token == Opt_max_dir_size_kb) {
1567 sbi->s_max_dir_size_kb = arg;
1568 } else if (token == Opt_stripe) {
1569 sbi->s_stripe = arg;
1570 } else if (token == Opt_resuid) {
1571 uid = make_kuid(current_user_ns(), arg);
1572 if (!uid_valid(uid)) {
1573 ext4_msg(sb, KERN_ERR,
1574 "Invalid uid value %d", arg);
1575 return -1;
1576 }
1577 sbi->s_resuid = uid;
1578 } else if (token == Opt_resgid) {
1579 gid = make_kgid(current_user_ns(), arg);
1580 if (!gid_valid(gid)) {
1581 ext4_msg(sb, KERN_ERR,
1582 "Invalid gid value %d", arg);
1583 return -1;
1584 }
1585 sbi->s_resgid = gid;
1586 } else if (token == Opt_journal_dev) {
1587 if (is_remount) {
1588 ext4_msg(sb, KERN_ERR,
1589 "Cannot specify journal on remount");
1590 return -1;
1591 }
1592 *journal_devnum = arg;
1593 } else if (token == Opt_journal_ioprio) {
1594 if (arg > 7) {
1595 ext4_msg(sb, KERN_ERR, 1609 ext4_msg(sb, KERN_ERR,
1596 "Invalid journal IO priority"
1597 " (must be 0-7)");
1598 return -1;
1599 }
1600 *journal_ioprio =
1601 IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, arg);
1602 } else if (m->flags & MOPT_DATAJ) {
1603 if (is_remount) {
1604 if (!sbi->s_journal)
1605 ext4_msg(sb, KERN_WARNING, "Remounting file system with no journal so ignoring journalled data option");
1606 else if (test_opt(sb, DATA_FLAGS) !=
1607 m->mount_opt) {
1608 ext4_msg(sb, KERN_ERR,
1609 "Cannot change data mode on remount"); 1610 "Cannot change data mode on remount");
1610 return -1;
1611 }
1612 } else {
1613 clear_opt(sb, DATA_FLAGS);
1614 sbi->s_mount_opt |= m->mount_opt;
1615 }
1616#ifdef CONFIG_QUOTA
1617 } else if (m->flags & MOPT_QFMT) {
1618 if (sb_any_quota_loaded(sb) &&
1619 sbi->s_jquota_fmt != m->mount_opt) {
1620 ext4_msg(sb, KERN_ERR, "Cannot "
1621 "change journaled quota options "
1622 "when quota turned on");
1623 return -1; 1611 return -1;
1624 } 1612 }
1625 sbi->s_jquota_fmt = m->mount_opt;
1626#endif
1627 } else { 1613 } else {
1628 if (!args->from) 1614 clear_opt(sb, DATA_FLAGS);
1629 arg = 1; 1615 sbi->s_mount_opt |= m->mount_opt;
1630 if (m->flags & MOPT_CLEAR)
1631 arg = !arg;
1632 else if (unlikely(!(m->flags & MOPT_SET))) {
1633 ext4_msg(sb, KERN_WARNING,
1634 "buggy handling of option %s", opt);
1635 WARN_ON(1);
1636 return -1;
1637 }
1638 if (arg != 0)
1639 sbi->s_mount_opt |= m->mount_opt;
1640 else
1641 sbi->s_mount_opt &= ~m->mount_opt;
1642 } 1616 }
1643 return 1; 1617#ifdef CONFIG_QUOTA
1618 } else if (m->flags & MOPT_QFMT) {
1619 if (sb_any_quota_loaded(sb) &&
1620 sbi->s_jquota_fmt != m->mount_opt) {
1621 ext4_msg(sb, KERN_ERR, "Cannot change journaled "
1622 "quota options when quota turned on");
1623 return -1;
1624 }
1625 sbi->s_jquota_fmt = m->mount_opt;
1626#endif
1627 } else {
1628 if (!args->from)
1629 arg = 1;
1630 if (m->flags & MOPT_CLEAR)
1631 arg = !arg;
1632 else if (unlikely(!(m->flags & MOPT_SET))) {
1633 ext4_msg(sb, KERN_WARNING,
1634 "buggy handling of option %s", opt);
1635 WARN_ON(1);
1636 return -1;
1637 }
1638 if (arg != 0)
1639 sbi->s_mount_opt |= m->mount_opt;
1640 else
1641 sbi->s_mount_opt &= ~m->mount_opt;
1644 } 1642 }
1645 ext4_msg(sb, KERN_ERR, "Unrecognized mount option \"%s\" " 1643 return 1;
1646 "or missing value", opt);
1647 return -1;
1648} 1644}
1649 1645
1650static int parse_options(char *options, struct super_block *sb, 1646static int parse_options(char *options, struct super_block *sb,