diff options
author | Jan Kara <jack@suse.cz> | 2005-06-24 01:01:04 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-24 03:05:20 -0400 |
commit | 1f54587bea84a35125c95e19b98c2f464c50871b (patch) | |
tree | 42f2467d6892be821271a2257e1259922bdafd45 /fs/ext3 | |
parent | 4e5117ba0af4582b6ec9164874f719d7f3f1eb2b (diff) |
[PATCH] quota: ext3: Improve quota credit estimates
Use improved credits estimates for quota operations. Also reserve a space
for a quota operation in a transaction only if filesystem was mounted with
some quota options.
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/ext3')
-rw-r--r-- | fs/ext3/acl.c | 5 | ||||
-rw-r--r-- | fs/ext3/inode.c | 7 | ||||
-rw-r--r-- | fs/ext3/namei.c | 25 | ||||
-rw-r--r-- | fs/ext3/super.c | 37 | ||||
-rw-r--r-- | fs/ext3/xattr.c | 2 |
5 files changed, 48 insertions, 28 deletions
diff --git a/fs/ext3/acl.c b/fs/ext3/acl.c index 133f5aa581bb..3ac38266fc9e 100644 --- a/fs/ext3/acl.c +++ b/fs/ext3/acl.c | |||
@@ -393,7 +393,8 @@ ext3_acl_chmod(struct inode *inode) | |||
393 | int retries = 0; | 393 | int retries = 0; |
394 | 394 | ||
395 | retry: | 395 | retry: |
396 | handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS); | 396 | handle = ext3_journal_start(inode, |
397 | EXT3_DATA_TRANS_BLOCKS(inode->i_sb)); | ||
397 | if (IS_ERR(handle)) { | 398 | if (IS_ERR(handle)) { |
398 | error = PTR_ERR(handle); | 399 | error = PTR_ERR(handle); |
399 | ext3_std_error(inode->i_sb, error); | 400 | ext3_std_error(inode->i_sb, error); |
@@ -503,7 +504,7 @@ ext3_xattr_set_acl(struct inode *inode, int type, const void *value, | |||
503 | acl = NULL; | 504 | acl = NULL; |
504 | 505 | ||
505 | retry: | 506 | retry: |
506 | handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS); | 507 | handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS(inode->i_sb)); |
507 | if (IS_ERR(handle)) | 508 | if (IS_ERR(handle)) |
508 | return PTR_ERR(handle); | 509 | return PTR_ERR(handle); |
509 | error = ext3_set_acl(handle, inode, type, acl); | 510 | error = ext3_set_acl(handle, inode, type, acl); |
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 0d5fa73b18dc..0b2db4f618cb 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c | |||
@@ -128,7 +128,7 @@ static unsigned long blocks_for_truncate(struct inode *inode) | |||
128 | if (needed > EXT3_MAX_TRANS_DATA) | 128 | if (needed > EXT3_MAX_TRANS_DATA) |
129 | needed = EXT3_MAX_TRANS_DATA; | 129 | needed = EXT3_MAX_TRANS_DATA; |
130 | 130 | ||
131 | return EXT3_DATA_TRANS_BLOCKS + needed; | 131 | return EXT3_DATA_TRANS_BLOCKS(inode->i_sb) + needed; |
132 | } | 132 | } |
133 | 133 | ||
134 | /* | 134 | /* |
@@ -2763,7 +2763,8 @@ int ext3_setattr(struct dentry *dentry, struct iattr *attr) | |||
2763 | 2763 | ||
2764 | /* (user+group)*(old+new) structure, inode write (sb, | 2764 | /* (user+group)*(old+new) structure, inode write (sb, |
2765 | * inode block, ? - but truncate inode update has it) */ | 2765 | * inode block, ? - but truncate inode update has it) */ |
2766 | handle = ext3_journal_start(inode, 4*EXT3_QUOTA_INIT_BLOCKS+3); | 2766 | handle = ext3_journal_start(inode, 2*(EXT3_QUOTA_INIT_BLOCKS(inode->i_sb)+ |
2767 | EXT3_QUOTA_DEL_BLOCKS(inode->i_sb))+3); | ||
2767 | if (IS_ERR(handle)) { | 2768 | if (IS_ERR(handle)) { |
2768 | error = PTR_ERR(handle); | 2769 | error = PTR_ERR(handle); |
2769 | goto err_out; | 2770 | goto err_out; |
@@ -2861,7 +2862,7 @@ static int ext3_writepage_trans_blocks(struct inode *inode) | |||
2861 | #ifdef CONFIG_QUOTA | 2862 | #ifdef CONFIG_QUOTA |
2862 | /* We know that structure was already allocated during DQUOT_INIT so | 2863 | /* We know that structure was already allocated during DQUOT_INIT so |
2863 | * we will be updating only the data blocks + inodes */ | 2864 | * we will be updating only the data blocks + inodes */ |
2864 | ret += 2*EXT3_QUOTA_TRANS_BLOCKS; | 2865 | ret += 2*EXT3_QUOTA_TRANS_BLOCKS(inode->i_sb); |
2865 | #endif | 2866 | #endif |
2866 | 2867 | ||
2867 | return ret; | 2868 | return ret; |
diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c index 60e44e6dd7a6..50378d8ff84b 100644 --- a/fs/ext3/namei.c +++ b/fs/ext3/namei.c | |||
@@ -1645,9 +1645,9 @@ static int ext3_create (struct inode * dir, struct dentry * dentry, int mode, | |||
1645 | int err, retries = 0; | 1645 | int err, retries = 0; |
1646 | 1646 | ||
1647 | retry: | 1647 | retry: |
1648 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + | 1648 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + |
1649 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + | 1649 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + |
1650 | 2*EXT3_QUOTA_INIT_BLOCKS); | 1650 | 2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb)); |
1651 | if (IS_ERR(handle)) | 1651 | if (IS_ERR(handle)) |
1652 | return PTR_ERR(handle); | 1652 | return PTR_ERR(handle); |
1653 | 1653 | ||
@@ -1679,9 +1679,9 @@ static int ext3_mknod (struct inode * dir, struct dentry *dentry, | |||
1679 | return -EINVAL; | 1679 | return -EINVAL; |
1680 | 1680 | ||
1681 | retry: | 1681 | retry: |
1682 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + | 1682 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + |
1683 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + | 1683 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + |
1684 | 2*EXT3_QUOTA_INIT_BLOCKS); | 1684 | 2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb)); |
1685 | if (IS_ERR(handle)) | 1685 | if (IS_ERR(handle)) |
1686 | return PTR_ERR(handle); | 1686 | return PTR_ERR(handle); |
1687 | 1687 | ||
@@ -1715,9 +1715,9 @@ static int ext3_mkdir(struct inode * dir, struct dentry * dentry, int mode) | |||
1715 | return -EMLINK; | 1715 | return -EMLINK; |
1716 | 1716 | ||
1717 | retry: | 1717 | retry: |
1718 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + | 1718 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + |
1719 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + | 1719 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + |
1720 | 2*EXT3_QUOTA_INIT_BLOCKS); | 1720 | 2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb)); |
1721 | if (IS_ERR(handle)) | 1721 | if (IS_ERR(handle)) |
1722 | return PTR_ERR(handle); | 1722 | return PTR_ERR(handle); |
1723 | 1723 | ||
@@ -2006,7 +2006,7 @@ static int ext3_rmdir (struct inode * dir, struct dentry *dentry) | |||
2006 | /* Initialize quotas before so that eventual writes go in | 2006 | /* Initialize quotas before so that eventual writes go in |
2007 | * separate transaction */ | 2007 | * separate transaction */ |
2008 | DQUOT_INIT(dentry->d_inode); | 2008 | DQUOT_INIT(dentry->d_inode); |
2009 | handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); | 2009 | handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS(dir->i_sb)); |
2010 | if (IS_ERR(handle)) | 2010 | if (IS_ERR(handle)) |
2011 | return PTR_ERR(handle); | 2011 | return PTR_ERR(handle); |
2012 | 2012 | ||
@@ -2065,7 +2065,7 @@ static int ext3_unlink(struct inode * dir, struct dentry *dentry) | |||
2065 | /* Initialize quotas before so that eventual writes go | 2065 | /* Initialize quotas before so that eventual writes go |
2066 | * in separate transaction */ | 2066 | * in separate transaction */ |
2067 | DQUOT_INIT(dentry->d_inode); | 2067 | DQUOT_INIT(dentry->d_inode); |
2068 | handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); | 2068 | handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS(dir->i_sb)); |
2069 | if (IS_ERR(handle)) | 2069 | if (IS_ERR(handle)) |
2070 | return PTR_ERR(handle); | 2070 | return PTR_ERR(handle); |
2071 | 2071 | ||
@@ -2120,9 +2120,9 @@ static int ext3_symlink (struct inode * dir, | |||
2120 | return -ENAMETOOLONG; | 2120 | return -ENAMETOOLONG; |
2121 | 2121 | ||
2122 | retry: | 2122 | retry: |
2123 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + | 2123 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + |
2124 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5 + | 2124 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5 + |
2125 | 2*EXT3_QUOTA_INIT_BLOCKS); | 2125 | 2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb)); |
2126 | if (IS_ERR(handle)) | 2126 | if (IS_ERR(handle)) |
2127 | return PTR_ERR(handle); | 2127 | return PTR_ERR(handle); |
2128 | 2128 | ||
@@ -2174,7 +2174,7 @@ static int ext3_link (struct dentry * old_dentry, | |||
2174 | return -EMLINK; | 2174 | return -EMLINK; |
2175 | 2175 | ||
2176 | retry: | 2176 | retry: |
2177 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + | 2177 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + |
2178 | EXT3_INDEX_EXTRA_TRANS_BLOCKS); | 2178 | EXT3_INDEX_EXTRA_TRANS_BLOCKS); |
2179 | if (IS_ERR(handle)) | 2179 | if (IS_ERR(handle)) |
2180 | return PTR_ERR(handle); | 2180 | return PTR_ERR(handle); |
@@ -2216,7 +2216,8 @@ static int ext3_rename (struct inode * old_dir, struct dentry *old_dentry, | |||
2216 | * in separate transaction */ | 2216 | * in separate transaction */ |
2217 | if (new_dentry->d_inode) | 2217 | if (new_dentry->d_inode) |
2218 | DQUOT_INIT(new_dentry->d_inode); | 2218 | DQUOT_INIT(new_dentry->d_inode); |
2219 | handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + | 2219 | handle = ext3_journal_start(old_dir, 2 * |
2220 | EXT3_DATA_TRANS_BLOCKS(old_dir->i_sb) + | ||
2220 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2); | 2221 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2); |
2221 | if (IS_ERR(handle)) | 2222 | if (IS_ERR(handle)) |
2222 | return PTR_ERR(handle); | 2223 | return PTR_ERR(handle); |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 9630fbfdc24a..b4b3e8a39131 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -589,7 +589,7 @@ enum { | |||
589 | Opt_commit, Opt_journal_update, Opt_journal_inum, | 589 | Opt_commit, Opt_journal_update, Opt_journal_inum, |
590 | Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback, | 590 | Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback, |
591 | Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, | 591 | Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, |
592 | Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, | 592 | Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_quota, Opt_noquota, |
593 | Opt_ignore, Opt_barrier, Opt_err, Opt_resize, | 593 | Opt_ignore, Opt_barrier, Opt_err, Opt_resize, |
594 | }; | 594 | }; |
595 | 595 | ||
@@ -634,10 +634,10 @@ static match_table_t tokens = { | |||
634 | {Opt_grpjquota, "grpjquota=%s"}, | 634 | {Opt_grpjquota, "grpjquota=%s"}, |
635 | {Opt_jqfmt_vfsold, "jqfmt=vfsold"}, | 635 | {Opt_jqfmt_vfsold, "jqfmt=vfsold"}, |
636 | {Opt_jqfmt_vfsv0, "jqfmt=vfsv0"}, | 636 | {Opt_jqfmt_vfsv0, "jqfmt=vfsv0"}, |
637 | {Opt_ignore, "grpquota"}, | 637 | {Opt_quota, "grpquota"}, |
638 | {Opt_ignore, "noquota"}, | 638 | {Opt_noquota, "noquota"}, |
639 | {Opt_ignore, "quota"}, | 639 | {Opt_quota, "quota"}, |
640 | {Opt_ignore, "usrquota"}, | 640 | {Opt_quota, "usrquota"}, |
641 | {Opt_barrier, "barrier=%u"}, | 641 | {Opt_barrier, "barrier=%u"}, |
642 | {Opt_err, NULL}, | 642 | {Opt_err, NULL}, |
643 | {Opt_resize, "resize"}, | 643 | {Opt_resize, "resize"}, |
@@ -876,6 +876,7 @@ set_qf_name: | |||
876 | sbi->s_qf_names[qtype] = NULL; | 876 | sbi->s_qf_names[qtype] = NULL; |
877 | return 0; | 877 | return 0; |
878 | } | 878 | } |
879 | set_opt(sbi->s_mount_opt, QUOTA); | ||
879 | break; | 880 | break; |
880 | case Opt_offusrjquota: | 881 | case Opt_offusrjquota: |
881 | qtype = USRQUOTA; | 882 | qtype = USRQUOTA; |
@@ -898,6 +899,17 @@ clear_qf_name: | |||
898 | case Opt_jqfmt_vfsv0: | 899 | case Opt_jqfmt_vfsv0: |
899 | sbi->s_jquota_fmt = QFMT_VFS_V0; | 900 | sbi->s_jquota_fmt = QFMT_VFS_V0; |
900 | break; | 901 | break; |
902 | case Opt_quota: | ||
903 | set_opt(sbi->s_mount_opt, QUOTA); | ||
904 | break; | ||
905 | case Opt_noquota: | ||
906 | if (sb_any_quota_enabled(sb)) { | ||
907 | printk(KERN_ERR "EXT3-fs: Cannot change quota " | ||
908 | "options when quota turned on.\n"); | ||
909 | return 0; | ||
910 | } | ||
911 | clear_opt(sbi->s_mount_opt, QUOTA); | ||
912 | break; | ||
901 | #else | 913 | #else |
902 | case Opt_usrjquota: | 914 | case Opt_usrjquota: |
903 | case Opt_grpjquota: | 915 | case Opt_grpjquota: |
@@ -909,6 +921,9 @@ clear_qf_name: | |||
909 | "EXT3-fs: journalled quota options not " | 921 | "EXT3-fs: journalled quota options not " |
910 | "supported.\n"); | 922 | "supported.\n"); |
911 | break; | 923 | break; |
924 | case Opt_quota: | ||
925 | case Opt_noquota: | ||
926 | break; | ||
912 | #endif | 927 | #endif |
913 | case Opt_abort: | 928 | case Opt_abort: |
914 | set_opt(sbi->s_mount_opt, ABORT); | 929 | set_opt(sbi->s_mount_opt, ABORT); |
@@ -2238,7 +2253,7 @@ static int ext3_dquot_initialize(struct inode *inode, int type) | |||
2238 | int ret, err; | 2253 | int ret, err; |
2239 | 2254 | ||
2240 | /* We may create quota structure so we need to reserve enough blocks */ | 2255 | /* We may create quota structure so we need to reserve enough blocks */ |
2241 | handle = ext3_journal_start(inode, 2*EXT3_QUOTA_INIT_BLOCKS); | 2256 | handle = ext3_journal_start(inode, 2*EXT3_QUOTA_INIT_BLOCKS(inode->i_sb)); |
2242 | if (IS_ERR(handle)) | 2257 | if (IS_ERR(handle)) |
2243 | return PTR_ERR(handle); | 2258 | return PTR_ERR(handle); |
2244 | ret = dquot_initialize(inode, type); | 2259 | ret = dquot_initialize(inode, type); |
@@ -2254,7 +2269,7 @@ static int ext3_dquot_drop(struct inode *inode) | |||
2254 | int ret, err; | 2269 | int ret, err; |
2255 | 2270 | ||
2256 | /* We may delete quota structure so we need to reserve enough blocks */ | 2271 | /* We may delete quota structure so we need to reserve enough blocks */ |
2257 | handle = ext3_journal_start(inode, 2*EXT3_QUOTA_INIT_BLOCKS); | 2272 | handle = ext3_journal_start(inode, 2*EXT3_QUOTA_DEL_BLOCKS(inode->i_sb)); |
2258 | if (IS_ERR(handle)) | 2273 | if (IS_ERR(handle)) |
2259 | return PTR_ERR(handle); | 2274 | return PTR_ERR(handle); |
2260 | ret = dquot_drop(inode); | 2275 | ret = dquot_drop(inode); |
@@ -2272,7 +2287,7 @@ static int ext3_write_dquot(struct dquot *dquot) | |||
2272 | 2287 | ||
2273 | inode = dquot_to_inode(dquot); | 2288 | inode = dquot_to_inode(dquot); |
2274 | handle = ext3_journal_start(inode, | 2289 | handle = ext3_journal_start(inode, |
2275 | EXT3_QUOTA_TRANS_BLOCKS); | 2290 | EXT3_QUOTA_TRANS_BLOCKS(dquot->dq_sb)); |
2276 | if (IS_ERR(handle)) | 2291 | if (IS_ERR(handle)) |
2277 | return PTR_ERR(handle); | 2292 | return PTR_ERR(handle); |
2278 | ret = dquot_commit(dquot); | 2293 | ret = dquot_commit(dquot); |
@@ -2288,7 +2303,7 @@ static int ext3_acquire_dquot(struct dquot *dquot) | |||
2288 | handle_t *handle; | 2303 | handle_t *handle; |
2289 | 2304 | ||
2290 | handle = ext3_journal_start(dquot_to_inode(dquot), | 2305 | handle = ext3_journal_start(dquot_to_inode(dquot), |
2291 | EXT3_QUOTA_INIT_BLOCKS); | 2306 | EXT3_QUOTA_INIT_BLOCKS(dquot->dq_sb)); |
2292 | if (IS_ERR(handle)) | 2307 | if (IS_ERR(handle)) |
2293 | return PTR_ERR(handle); | 2308 | return PTR_ERR(handle); |
2294 | ret = dquot_acquire(dquot); | 2309 | ret = dquot_acquire(dquot); |
@@ -2304,7 +2319,7 @@ static int ext3_release_dquot(struct dquot *dquot) | |||
2304 | handle_t *handle; | 2319 | handle_t *handle; |
2305 | 2320 | ||
2306 | handle = ext3_journal_start(dquot_to_inode(dquot), | 2321 | handle = ext3_journal_start(dquot_to_inode(dquot), |
2307 | EXT3_QUOTA_INIT_BLOCKS); | 2322 | EXT3_QUOTA_DEL_BLOCKS(dquot->dq_sb)); |
2308 | if (IS_ERR(handle)) | 2323 | if (IS_ERR(handle)) |
2309 | return PTR_ERR(handle); | 2324 | return PTR_ERR(handle); |
2310 | ret = dquot_release(dquot); | 2325 | ret = dquot_release(dquot); |
@@ -2361,6 +2376,8 @@ static int ext3_quota_on(struct super_block *sb, int type, int format_id, | |||
2361 | int err; | 2376 | int err; |
2362 | struct nameidata nd; | 2377 | struct nameidata nd; |
2363 | 2378 | ||
2379 | if (!test_opt(sb, QUOTA)) | ||
2380 | return -EINVAL; | ||
2364 | /* Not journalling quota? */ | 2381 | /* Not journalling quota? */ |
2365 | if (!EXT3_SB(sb)->s_qf_names[USRQUOTA] && | 2382 | if (!EXT3_SB(sb)->s_qf_names[USRQUOTA] && |
2366 | !EXT3_SB(sb)->s_qf_names[GRPQUOTA]) | 2383 | !EXT3_SB(sb)->s_qf_names[GRPQUOTA]) |
diff --git a/fs/ext3/xattr.c b/fs/ext3/xattr.c index 4cbc6d0212d3..3f9dfa643b19 100644 --- a/fs/ext3/xattr.c +++ b/fs/ext3/xattr.c | |||
@@ -1044,7 +1044,7 @@ ext3_xattr_set(struct inode *inode, int name_index, const char *name, | |||
1044 | int error, retries = 0; | 1044 | int error, retries = 0; |
1045 | 1045 | ||
1046 | retry: | 1046 | retry: |
1047 | handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS); | 1047 | handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS(inode->i_sb)); |
1048 | if (IS_ERR(handle)) { | 1048 | if (IS_ERR(handle)) { |
1049 | error = PTR_ERR(handle); | 1049 | error = PTR_ERR(handle); |
1050 | } else { | 1050 | } else { |