diff options
Diffstat (limited to 'fs/xfs/xfs_vfsops.c')
-rw-r--r-- | fs/xfs/xfs_vfsops.c | 67 |
1 files changed, 45 insertions, 22 deletions
diff --git a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c index 00aae9c6a904..b53736650100 100644 --- a/fs/xfs/xfs_vfsops.c +++ b/fs/xfs/xfs_vfsops.c | |||
@@ -1649,6 +1649,7 @@ xfs_vget( | |||
1649 | #define MNTOPT_SWIDTH "swidth" /* data volume stripe width */ | 1649 | #define MNTOPT_SWIDTH "swidth" /* data volume stripe width */ |
1650 | #define MNTOPT_NOUUID "nouuid" /* ignore filesystem UUID */ | 1650 | #define MNTOPT_NOUUID "nouuid" /* ignore filesystem UUID */ |
1651 | #define MNTOPT_MTPT "mtpt" /* filesystem mount point */ | 1651 | #define MNTOPT_MTPT "mtpt" /* filesystem mount point */ |
1652 | #define MNTOPT_ALLOCSIZE "allocsize" /* preferred allocation size */ | ||
1652 | #define MNTOPT_IHASHSIZE "ihashsize" /* size of inode hash table */ | 1653 | #define MNTOPT_IHASHSIZE "ihashsize" /* size of inode hash table */ |
1653 | #define MNTOPT_NORECOVERY "norecovery" /* don't run XFS recovery */ | 1654 | #define MNTOPT_NORECOVERY "norecovery" /* don't run XFS recovery */ |
1654 | #define MNTOPT_NOLOGFLUSH "nologflush" /* don't hard flush on log writes */ | 1655 | #define MNTOPT_NOLOGFLUSH "nologflush" /* don't hard flush on log writes */ |
@@ -1657,6 +1658,28 @@ xfs_vget( | |||
1657 | #define MNTOPT_IKEEP "ikeep" /* do not free empty inode clusters */ | 1658 | #define MNTOPT_IKEEP "ikeep" /* do not free empty inode clusters */ |
1658 | #define MNTOPT_NOIKEEP "noikeep" /* free empty inode clusters */ | 1659 | #define MNTOPT_NOIKEEP "noikeep" /* free empty inode clusters */ |
1659 | 1660 | ||
1661 | STATIC unsigned long | ||
1662 | suffix_strtoul(const char *cp, char **endp, unsigned int base) | ||
1663 | { | ||
1664 | int last, shift_left_factor = 0; | ||
1665 | char *value = (char *)cp; | ||
1666 | |||
1667 | last = strlen(value) - 1; | ||
1668 | if (value[last] == 'K' || value[last] == 'k') { | ||
1669 | shift_left_factor = 10; | ||
1670 | value[last] = '\0'; | ||
1671 | } | ||
1672 | if (value[last] == 'M' || value[last] == 'm') { | ||
1673 | shift_left_factor = 20; | ||
1674 | value[last] = '\0'; | ||
1675 | } | ||
1676 | if (value[last] == 'G' || value[last] == 'g') { | ||
1677 | shift_left_factor = 30; | ||
1678 | value[last] = '\0'; | ||
1679 | } | ||
1680 | |||
1681 | return simple_strtoul(cp, endp, base) << shift_left_factor; | ||
1682 | } | ||
1660 | 1683 | ||
1661 | int | 1684 | int |
1662 | xfs_parseargs( | 1685 | xfs_parseargs( |
@@ -1688,60 +1711,60 @@ xfs_parseargs( | |||
1688 | if (!strcmp(this_char, MNTOPT_LOGBUFS)) { | 1711 | if (!strcmp(this_char, MNTOPT_LOGBUFS)) { |
1689 | if (!value || !*value) { | 1712 | if (!value || !*value) { |
1690 | printk("XFS: %s option requires an argument\n", | 1713 | printk("XFS: %s option requires an argument\n", |
1691 | MNTOPT_LOGBUFS); | 1714 | this_char); |
1692 | return EINVAL; | 1715 | return EINVAL; |
1693 | } | 1716 | } |
1694 | args->logbufs = simple_strtoul(value, &eov, 10); | 1717 | args->logbufs = simple_strtoul(value, &eov, 10); |
1695 | } else if (!strcmp(this_char, MNTOPT_LOGBSIZE)) { | 1718 | } else if (!strcmp(this_char, MNTOPT_LOGBSIZE)) { |
1696 | int last, in_kilobytes = 0; | ||
1697 | |||
1698 | if (!value || !*value) { | 1719 | if (!value || !*value) { |
1699 | printk("XFS: %s option requires an argument\n", | 1720 | printk("XFS: %s option requires an argument\n", |
1700 | MNTOPT_LOGBSIZE); | 1721 | this_char); |
1701 | return EINVAL; | 1722 | return EINVAL; |
1702 | } | 1723 | } |
1703 | last = strlen(value) - 1; | 1724 | args->logbufsize = suffix_strtoul(value, &eov, 10); |
1704 | if (value[last] == 'K' || value[last] == 'k') { | ||
1705 | in_kilobytes = 1; | ||
1706 | value[last] = '\0'; | ||
1707 | } | ||
1708 | args->logbufsize = simple_strtoul(value, &eov, 10); | ||
1709 | if (in_kilobytes) | ||
1710 | args->logbufsize <<= 10; | ||
1711 | } else if (!strcmp(this_char, MNTOPT_LOGDEV)) { | 1725 | } else if (!strcmp(this_char, MNTOPT_LOGDEV)) { |
1712 | if (!value || !*value) { | 1726 | if (!value || !*value) { |
1713 | printk("XFS: %s option requires an argument\n", | 1727 | printk("XFS: %s option requires an argument\n", |
1714 | MNTOPT_LOGDEV); | 1728 | this_char); |
1715 | return EINVAL; | 1729 | return EINVAL; |
1716 | } | 1730 | } |
1717 | strncpy(args->logname, value, MAXNAMELEN); | 1731 | strncpy(args->logname, value, MAXNAMELEN); |
1718 | } else if (!strcmp(this_char, MNTOPT_MTPT)) { | 1732 | } else if (!strcmp(this_char, MNTOPT_MTPT)) { |
1719 | if (!value || !*value) { | 1733 | if (!value || !*value) { |
1720 | printk("XFS: %s option requires an argument\n", | 1734 | printk("XFS: %s option requires an argument\n", |
1721 | MNTOPT_MTPT); | 1735 | this_char); |
1722 | return EINVAL; | 1736 | return EINVAL; |
1723 | } | 1737 | } |
1724 | strncpy(args->mtpt, value, MAXNAMELEN); | 1738 | strncpy(args->mtpt, value, MAXNAMELEN); |
1725 | } else if (!strcmp(this_char, MNTOPT_RTDEV)) { | 1739 | } else if (!strcmp(this_char, MNTOPT_RTDEV)) { |
1726 | if (!value || !*value) { | 1740 | if (!value || !*value) { |
1727 | printk("XFS: %s option requires an argument\n", | 1741 | printk("XFS: %s option requires an argument\n", |
1728 | MNTOPT_RTDEV); | 1742 | this_char); |
1729 | return EINVAL; | 1743 | return EINVAL; |
1730 | } | 1744 | } |
1731 | strncpy(args->rtname, value, MAXNAMELEN); | 1745 | strncpy(args->rtname, value, MAXNAMELEN); |
1732 | } else if (!strcmp(this_char, MNTOPT_BIOSIZE)) { | 1746 | } else if (!strcmp(this_char, MNTOPT_BIOSIZE)) { |
1733 | if (!value || !*value) { | 1747 | if (!value || !*value) { |
1734 | printk("XFS: %s option requires an argument\n", | 1748 | printk("XFS: %s option requires an argument\n", |
1735 | MNTOPT_BIOSIZE); | 1749 | this_char); |
1736 | return EINVAL; | 1750 | return EINVAL; |
1737 | } | 1751 | } |
1738 | iosize = simple_strtoul(value, &eov, 10); | 1752 | iosize = simple_strtoul(value, &eov, 10); |
1739 | args->flags |= XFSMNT_IOSIZE; | 1753 | args->flags |= XFSMNT_IOSIZE; |
1740 | args->iosizelog = (uint8_t) iosize; | 1754 | args->iosizelog = (uint8_t) iosize; |
1755 | } else if (!strcmp(this_char, MNTOPT_ALLOCSIZE)) { | ||
1756 | if (!value || !*value) { | ||
1757 | printk("XFS: %s option requires an argument\n", | ||
1758 | this_char); | ||
1759 | return EINVAL; | ||
1760 | } | ||
1761 | iosize = suffix_strtoul(value, &eov, 10); | ||
1762 | args->flags |= XFSMNT_IOSIZE; | ||
1763 | args->iosizelog = ffs(iosize) - 1; | ||
1741 | } else if (!strcmp(this_char, MNTOPT_IHASHSIZE)) { | 1764 | } else if (!strcmp(this_char, MNTOPT_IHASHSIZE)) { |
1742 | if (!value || !*value) { | 1765 | if (!value || !*value) { |
1743 | printk("XFS: %s option requires an argument\n", | 1766 | printk("XFS: %s option requires an argument\n", |
1744 | this_char); | 1767 | this_char); |
1745 | return EINVAL; | 1768 | return EINVAL; |
1746 | } | 1769 | } |
1747 | args->flags |= XFSMNT_IHASHSIZE; | 1770 | args->flags |= XFSMNT_IHASHSIZE; |
@@ -1756,7 +1779,7 @@ xfs_parseargs( | |||
1756 | args->flags |= XFSMNT_INO64; | 1779 | args->flags |= XFSMNT_INO64; |
1757 | #if !XFS_BIG_INUMS | 1780 | #if !XFS_BIG_INUMS |
1758 | printk("XFS: %s option not allowed on this system\n", | 1781 | printk("XFS: %s option not allowed on this system\n", |
1759 | MNTOPT_INO64); | 1782 | this_char); |
1760 | return EINVAL; | 1783 | return EINVAL; |
1761 | #endif | 1784 | #endif |
1762 | } else if (!strcmp(this_char, MNTOPT_NOALIGN)) { | 1785 | } else if (!strcmp(this_char, MNTOPT_NOALIGN)) { |
@@ -1766,14 +1789,14 @@ xfs_parseargs( | |||
1766 | } else if (!strcmp(this_char, MNTOPT_SUNIT)) { | 1789 | } else if (!strcmp(this_char, MNTOPT_SUNIT)) { |
1767 | if (!value || !*value) { | 1790 | if (!value || !*value) { |
1768 | printk("XFS: %s option requires an argument\n", | 1791 | printk("XFS: %s option requires an argument\n", |
1769 | MNTOPT_SUNIT); | 1792 | this_char); |
1770 | return EINVAL; | 1793 | return EINVAL; |
1771 | } | 1794 | } |
1772 | dsunit = simple_strtoul(value, &eov, 10); | 1795 | dsunit = simple_strtoul(value, &eov, 10); |
1773 | } else if (!strcmp(this_char, MNTOPT_SWIDTH)) { | 1796 | } else if (!strcmp(this_char, MNTOPT_SWIDTH)) { |
1774 | if (!value || !*value) { | 1797 | if (!value || !*value) { |
1775 | printk("XFS: %s option requires an argument\n", | 1798 | printk("XFS: %s option requires an argument\n", |
1776 | MNTOPT_SWIDTH); | 1799 | this_char); |
1777 | return EINVAL; | 1800 | return EINVAL; |
1778 | } | 1801 | } |
1779 | dswidth = simple_strtoul(value, &eov, 10); | 1802 | dswidth = simple_strtoul(value, &eov, 10); |
@@ -1781,7 +1804,7 @@ xfs_parseargs( | |||
1781 | args->flags &= ~XFSMNT_32BITINODES; | 1804 | args->flags &= ~XFSMNT_32BITINODES; |
1782 | #if !XFS_BIG_INUMS | 1805 | #if !XFS_BIG_INUMS |
1783 | printk("XFS: %s option not allowed on this system\n", | 1806 | printk("XFS: %s option not allowed on this system\n", |
1784 | MNTOPT_64BITINODE); | 1807 | this_char); |
1785 | return EINVAL; | 1808 | return EINVAL; |
1786 | #endif | 1809 | #endif |
1787 | } else if (!strcmp(this_char, MNTOPT_NOUUID)) { | 1810 | } else if (!strcmp(this_char, MNTOPT_NOUUID)) { |
@@ -1877,7 +1900,7 @@ xfs_showargs( | |||
1877 | seq_printf(m, "," MNTOPT_IHASHSIZE "=%d", mp->m_ihsize); | 1900 | seq_printf(m, "," MNTOPT_IHASHSIZE "=%d", mp->m_ihsize); |
1878 | 1901 | ||
1879 | if (mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) | 1902 | if (mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) |
1880 | seq_printf(m, "," MNTOPT_BIOSIZE "=%d", mp->m_writeio_log); | 1903 | seq_printf(m, "," MNTOPT_ALLOCSIZE "=%d", 1<<mp->m_writeio_log); |
1881 | 1904 | ||
1882 | if (mp->m_logbufs > 0) | 1905 | if (mp->m_logbufs > 0) |
1883 | seq_printf(m, "," MNTOPT_LOGBUFS "=%d", mp->m_logbufs); | 1906 | seq_printf(m, "," MNTOPT_LOGBUFS "=%d", mp->m_logbufs); |