diff options
Diffstat (limited to 'fs/reiserfs/super.c')
-rw-r--r-- | fs/reiserfs/super.c | 102 |
1 files changed, 64 insertions, 38 deletions
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index b35b87744983..660aefca1fd2 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
@@ -866,8 +866,9 @@ static int reiserfs_parse_options (struct super_block * s, char * options, /* st | |||
866 | {"jdev", .arg_required = 'j', .values = NULL}, | 866 | {"jdev", .arg_required = 'j', .values = NULL}, |
867 | {"nolargeio", .arg_required = 'w', .values = NULL}, | 867 | {"nolargeio", .arg_required = 'w', .values = NULL}, |
868 | {"commit", .arg_required = 'c', .values = NULL}, | 868 | {"commit", .arg_required = 'c', .values = NULL}, |
869 | {"usrquota",}, | 869 | {"usrquota", .setmask = 1<<REISERFS_QUOTA}, |
870 | {"grpquota",}, | 870 | {"grpquota", .setmask = 1<<REISERFS_QUOTA}, |
871 | {"noquota", .clrmask = 1<<REISERFS_QUOTA}, | ||
871 | {"errors", .arg_required = 'e', .values = error_actions}, | 872 | {"errors", .arg_required = 'e', .values = error_actions}, |
872 | {"usrjquota", .arg_required = 'u'|(1<<REISERFS_OPT_ALLOWEMPTY), .values = NULL}, | 873 | {"usrjquota", .arg_required = 'u'|(1<<REISERFS_OPT_ALLOWEMPTY), .values = NULL}, |
873 | {"grpjquota", .arg_required = 'g'|(1<<REISERFS_OPT_ALLOWEMPTY), .values = NULL}, | 874 | {"grpjquota", .arg_required = 'g'|(1<<REISERFS_OPT_ALLOWEMPTY), .values = NULL}, |
@@ -964,6 +965,7 @@ static int reiserfs_parse_options (struct super_block * s, char * options, /* st | |||
964 | return 0; | 965 | return 0; |
965 | } | 966 | } |
966 | strcpy(REISERFS_SB(s)->s_qf_names[qtype], arg); | 967 | strcpy(REISERFS_SB(s)->s_qf_names[qtype], arg); |
968 | *mount_options |= 1<<REISERFS_QUOTA; | ||
967 | } | 969 | } |
968 | else { | 970 | else { |
969 | if (REISERFS_SB(s)->s_qf_names[qtype]) { | 971 | if (REISERFS_SB(s)->s_qf_names[qtype]) { |
@@ -995,7 +997,13 @@ static int reiserfs_parse_options (struct super_block * s, char * options, /* st | |||
995 | reiserfs_warning(s, "reiserfs_parse_options: journalled quota format not specified."); | 997 | reiserfs_warning(s, "reiserfs_parse_options: journalled quota format not specified."); |
996 | return 0; | 998 | return 0; |
997 | } | 999 | } |
1000 | /* This checking is not precise wrt the quota type but for our purposes it is sufficient */ | ||
1001 | if (!(*mount_options & (1<<REISERFS_QUOTA)) && sb_any_quota_enabled(s)) { | ||
1002 | reiserfs_warning(s, "reiserfs_parse_options: quota options must be present when quota is turned on."); | ||
1003 | return 0; | ||
1004 | } | ||
998 | #endif | 1005 | #endif |
1006 | |||
999 | return 1; | 1007 | return 1; |
1000 | } | 1008 | } |
1001 | 1009 | ||
@@ -1105,6 +1113,7 @@ static int reiserfs_remount (struct super_block * s, int * mount_flags, char * a | |||
1105 | safe_mask |= 1 << REISERFS_ERROR_RO; | 1113 | safe_mask |= 1 << REISERFS_ERROR_RO; |
1106 | safe_mask |= 1 << REISERFS_ERROR_CONTINUE; | 1114 | safe_mask |= 1 << REISERFS_ERROR_CONTINUE; |
1107 | safe_mask |= 1 << REISERFS_ERROR_PANIC; | 1115 | safe_mask |= 1 << REISERFS_ERROR_PANIC; |
1116 | safe_mask |= 1 << REISERFS_QUOTA; | ||
1108 | 1117 | ||
1109 | /* Update the bitmask, taking care to keep | 1118 | /* Update the bitmask, taking care to keep |
1110 | * the bits we're not allowed to change here */ | 1119 | * the bits we're not allowed to change here */ |
@@ -1841,13 +1850,18 @@ static int reiserfs_statfs (struct super_block * s, struct kstatfs * buf) | |||
1841 | static int reiserfs_dquot_initialize(struct inode *inode, int type) | 1850 | static int reiserfs_dquot_initialize(struct inode *inode, int type) |
1842 | { | 1851 | { |
1843 | struct reiserfs_transaction_handle th; | 1852 | struct reiserfs_transaction_handle th; |
1844 | int ret; | 1853 | int ret, err; |
1845 | 1854 | ||
1846 | /* We may create quota structure so we need to reserve enough blocks */ | 1855 | /* We may create quota structure so we need to reserve enough blocks */ |
1847 | reiserfs_write_lock(inode->i_sb); | 1856 | reiserfs_write_lock(inode->i_sb); |
1848 | journal_begin(&th, inode->i_sb, 2*REISERFS_QUOTA_INIT_BLOCKS); | 1857 | ret = journal_begin(&th, inode->i_sb, 2*REISERFS_QUOTA_INIT_BLOCKS(inode->i_sb)); |
1858 | if (ret) | ||
1859 | goto out; | ||
1849 | ret = dquot_initialize(inode, type); | 1860 | ret = dquot_initialize(inode, type); |
1850 | journal_end(&th, inode->i_sb, 2*REISERFS_QUOTA_INIT_BLOCKS); | 1861 | err = journal_end(&th, inode->i_sb, 2*REISERFS_QUOTA_INIT_BLOCKS(inode->i_sb)); |
1862 | if (!ret && err) | ||
1863 | ret = err; | ||
1864 | out: | ||
1851 | reiserfs_write_unlock(inode->i_sb); | 1865 | reiserfs_write_unlock(inode->i_sb); |
1852 | return ret; | 1866 | return ret; |
1853 | } | 1867 | } |
@@ -1855,13 +1869,18 @@ static int reiserfs_dquot_initialize(struct inode *inode, int type) | |||
1855 | static int reiserfs_dquot_drop(struct inode *inode) | 1869 | static int reiserfs_dquot_drop(struct inode *inode) |
1856 | { | 1870 | { |
1857 | struct reiserfs_transaction_handle th; | 1871 | struct reiserfs_transaction_handle th; |
1858 | int ret; | 1872 | int ret, err; |
1859 | 1873 | ||
1860 | /* We may delete quota structure so we need to reserve enough blocks */ | 1874 | /* We may delete quota structure so we need to reserve enough blocks */ |
1861 | reiserfs_write_lock(inode->i_sb); | 1875 | reiserfs_write_lock(inode->i_sb); |
1862 | journal_begin(&th, inode->i_sb, 2*REISERFS_QUOTA_INIT_BLOCKS); | 1876 | ret = journal_begin(&th, inode->i_sb, 2*REISERFS_QUOTA_DEL_BLOCKS(inode->i_sb)); |
1877 | if (ret) | ||
1878 | goto out; | ||
1863 | ret = dquot_drop(inode); | 1879 | ret = dquot_drop(inode); |
1864 | journal_end(&th, inode->i_sb, 2*REISERFS_QUOTA_INIT_BLOCKS); | 1880 | err = journal_end(&th, inode->i_sb, 2*REISERFS_QUOTA_DEL_BLOCKS(inode->i_sb)); |
1881 | if (!ret && err) | ||
1882 | ret = err; | ||
1883 | out: | ||
1865 | reiserfs_write_unlock(inode->i_sb); | 1884 | reiserfs_write_unlock(inode->i_sb); |
1866 | return ret; | 1885 | return ret; |
1867 | } | 1886 | } |
@@ -1869,12 +1888,17 @@ static int reiserfs_dquot_drop(struct inode *inode) | |||
1869 | static int reiserfs_write_dquot(struct dquot *dquot) | 1888 | static int reiserfs_write_dquot(struct dquot *dquot) |
1870 | { | 1889 | { |
1871 | struct reiserfs_transaction_handle th; | 1890 | struct reiserfs_transaction_handle th; |
1872 | int ret; | 1891 | int ret, err; |
1873 | 1892 | ||
1874 | reiserfs_write_lock(dquot->dq_sb); | 1893 | reiserfs_write_lock(dquot->dq_sb); |
1875 | journal_begin(&th, dquot->dq_sb, REISERFS_QUOTA_TRANS_BLOCKS); | 1894 | ret = journal_begin(&th, dquot->dq_sb, REISERFS_QUOTA_TRANS_BLOCKS(dquot->dq_sb)); |
1895 | if (ret) | ||
1896 | goto out; | ||
1876 | ret = dquot_commit(dquot); | 1897 | ret = dquot_commit(dquot); |
1877 | journal_end(&th, dquot->dq_sb, REISERFS_QUOTA_TRANS_BLOCKS); | 1898 | err = journal_end(&th, dquot->dq_sb, REISERFS_QUOTA_TRANS_BLOCKS(dquot->dq_sb)); |
1899 | if (!ret && err) | ||
1900 | ret = err; | ||
1901 | out: | ||
1878 | reiserfs_write_unlock(dquot->dq_sb); | 1902 | reiserfs_write_unlock(dquot->dq_sb); |
1879 | return ret; | 1903 | return ret; |
1880 | } | 1904 | } |
@@ -1882,12 +1906,17 @@ static int reiserfs_write_dquot(struct dquot *dquot) | |||
1882 | static int reiserfs_acquire_dquot(struct dquot *dquot) | 1906 | static int reiserfs_acquire_dquot(struct dquot *dquot) |
1883 | { | 1907 | { |
1884 | struct reiserfs_transaction_handle th; | 1908 | struct reiserfs_transaction_handle th; |
1885 | int ret; | 1909 | int ret, err; |
1886 | 1910 | ||
1887 | reiserfs_write_lock(dquot->dq_sb); | 1911 | reiserfs_write_lock(dquot->dq_sb); |
1888 | journal_begin(&th, dquot->dq_sb, REISERFS_QUOTA_INIT_BLOCKS); | 1912 | ret = journal_begin(&th, dquot->dq_sb, REISERFS_QUOTA_INIT_BLOCKS(dquot->dq_sb)); |
1913 | if (ret) | ||
1914 | goto out; | ||
1889 | ret = dquot_acquire(dquot); | 1915 | ret = dquot_acquire(dquot); |
1890 | journal_end(&th, dquot->dq_sb, REISERFS_QUOTA_INIT_BLOCKS); | 1916 | err = journal_end(&th, dquot->dq_sb, REISERFS_QUOTA_INIT_BLOCKS(dquot->dq_sb)); |
1917 | if (!ret && err) | ||
1918 | ret = err; | ||
1919 | out: | ||
1891 | reiserfs_write_unlock(dquot->dq_sb); | 1920 | reiserfs_write_unlock(dquot->dq_sb); |
1892 | return ret; | 1921 | return ret; |
1893 | } | 1922 | } |
@@ -1895,12 +1924,17 @@ static int reiserfs_acquire_dquot(struct dquot *dquot) | |||
1895 | static int reiserfs_release_dquot(struct dquot *dquot) | 1924 | static int reiserfs_release_dquot(struct dquot *dquot) |
1896 | { | 1925 | { |
1897 | struct reiserfs_transaction_handle th; | 1926 | struct reiserfs_transaction_handle th; |
1898 | int ret; | 1927 | int ret, err; |
1899 | 1928 | ||
1900 | reiserfs_write_lock(dquot->dq_sb); | 1929 | reiserfs_write_lock(dquot->dq_sb); |
1901 | journal_begin(&th, dquot->dq_sb, REISERFS_QUOTA_INIT_BLOCKS); | 1930 | ret = journal_begin(&th, dquot->dq_sb, REISERFS_QUOTA_DEL_BLOCKS(dquot->dq_sb)); |
1931 | if (ret) | ||
1932 | goto out; | ||
1902 | ret = dquot_release(dquot); | 1933 | ret = dquot_release(dquot); |
1903 | journal_end(&th, dquot->dq_sb, REISERFS_QUOTA_INIT_BLOCKS); | 1934 | err = journal_end(&th, dquot->dq_sb, REISERFS_QUOTA_DEL_BLOCKS(dquot->dq_sb)); |
1935 | if (!ret && err) | ||
1936 | ret = err; | ||
1937 | out: | ||
1904 | reiserfs_write_unlock(dquot->dq_sb); | 1938 | reiserfs_write_unlock(dquot->dq_sb); |
1905 | return ret; | 1939 | return ret; |
1906 | } | 1940 | } |
@@ -1920,39 +1954,29 @@ static int reiserfs_mark_dquot_dirty(struct dquot *dquot) | |||
1920 | static int reiserfs_write_info(struct super_block *sb, int type) | 1954 | static int reiserfs_write_info(struct super_block *sb, int type) |
1921 | { | 1955 | { |
1922 | struct reiserfs_transaction_handle th; | 1956 | struct reiserfs_transaction_handle th; |
1923 | int ret; | 1957 | int ret, err; |
1924 | 1958 | ||
1925 | /* Data block + inode block */ | 1959 | /* Data block + inode block */ |
1926 | reiserfs_write_lock(sb); | 1960 | reiserfs_write_lock(sb); |
1927 | journal_begin(&th, sb, 2); | 1961 | ret = journal_begin(&th, sb, 2); |
1962 | if (ret) | ||
1963 | goto out; | ||
1928 | ret = dquot_commit_info(sb, type); | 1964 | ret = dquot_commit_info(sb, type); |
1929 | journal_end(&th, sb, 2); | 1965 | err = journal_end(&th, sb, 2); |
1966 | if (!ret && err) | ||
1967 | ret = err; | ||
1968 | out: | ||
1930 | reiserfs_write_unlock(sb); | 1969 | reiserfs_write_unlock(sb); |
1931 | return ret; | 1970 | return ret; |
1932 | } | 1971 | } |
1933 | 1972 | ||
1934 | /* | 1973 | /* |
1935 | * Turn on quotas during mount time - we need to find | 1974 | * Turn on quotas during mount time - we need to find the quota file and such... |
1936 | * the quota file and such... | ||
1937 | */ | 1975 | */ |
1938 | static int reiserfs_quota_on_mount(struct super_block *sb, int type) | 1976 | static int reiserfs_quota_on_mount(struct super_block *sb, int type) |
1939 | { | 1977 | { |
1940 | int err; | 1978 | return vfs_quota_on_mount(sb, REISERFS_SB(sb)->s_qf_names[type], |
1941 | struct dentry *dentry; | 1979 | REISERFS_SB(sb)->s_jquota_fmt, type); |
1942 | struct qstr name = { .name = REISERFS_SB(sb)->s_qf_names[type], | ||
1943 | .hash = 0, | ||
1944 | .len = strlen(REISERFS_SB(sb)->s_qf_names[type])}; | ||
1945 | |||
1946 | dentry = lookup_hash(&name, sb->s_root); | ||
1947 | if (IS_ERR(dentry)) | ||
1948 | return PTR_ERR(dentry); | ||
1949 | err = vfs_quota_on_mount(type, REISERFS_SB(sb)->s_jquota_fmt, dentry); | ||
1950 | /* Now invalidate and put the dentry - quota got its own reference | ||
1951 | * to inode and dentry has at least wrong hash so we had better | ||
1952 | * throw it away */ | ||
1953 | d_invalidate(dentry); | ||
1954 | dput(dentry); | ||
1955 | return err; | ||
1956 | } | 1980 | } |
1957 | 1981 | ||
1958 | /* | 1982 | /* |
@@ -1963,6 +1987,8 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id, ch | |||
1963 | int err; | 1987 | int err; |
1964 | struct nameidata nd; | 1988 | struct nameidata nd; |
1965 | 1989 | ||
1990 | if (!(REISERFS_SB(sb)->s_mount_opt & (1<<REISERFS_QUOTA))) | ||
1991 | return -EINVAL; | ||
1966 | err = path_lookup(path, LOOKUP_FOLLOW, &nd); | 1992 | err = path_lookup(path, LOOKUP_FOLLOW, &nd); |
1967 | if (err) | 1993 | if (err) |
1968 | return err; | 1994 | return err; |