Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f54587b authored by Jan Kara's avatar Jan Kara Committed by Linus Torvalds
Browse files

[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: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 4e5117ba
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -393,7 +393,8 @@ ext3_acl_chmod(struct inode *inode)
		int retries = 0;
		int retries = 0;


	retry:
	retry:
		handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS);
		handle = ext3_journal_start(inode,
				EXT3_DATA_TRANS_BLOCKS(inode->i_sb));
		if (IS_ERR(handle)) {
		if (IS_ERR(handle)) {
			error = PTR_ERR(handle);
			error = PTR_ERR(handle);
			ext3_std_error(inode->i_sb, error);
			ext3_std_error(inode->i_sb, error);
@@ -503,7 +504,7 @@ ext3_xattr_set_acl(struct inode *inode, int type, const void *value,
		acl = NULL;
		acl = NULL;


retry:
retry:
	handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS);
	handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS(inode->i_sb));
	if (IS_ERR(handle))
	if (IS_ERR(handle))
		return PTR_ERR(handle);
		return PTR_ERR(handle);
	error = ext3_set_acl(handle, inode, type, acl);
	error = ext3_set_acl(handle, inode, type, acl);
+4 −3
Original line number Original line Diff line number Diff line
@@ -128,7 +128,7 @@ static unsigned long blocks_for_truncate(struct inode *inode)
	if (needed > EXT3_MAX_TRANS_DATA) 
	if (needed > EXT3_MAX_TRANS_DATA) 
		needed = EXT3_MAX_TRANS_DATA;
		needed = EXT3_MAX_TRANS_DATA;


	return EXT3_DATA_TRANS_BLOCKS + needed;
	return EXT3_DATA_TRANS_BLOCKS(inode->i_sb) + needed;
}
}


/* 
/* 
@@ -2763,7 +2763,8 @@ int ext3_setattr(struct dentry *dentry, struct iattr *attr)


		/* (user+group)*(old+new) structure, inode write (sb,
		/* (user+group)*(old+new) structure, inode write (sb,
		 * inode block, ? - but truncate inode update has it) */
		 * inode block, ? - but truncate inode update has it) */
		handle = ext3_journal_start(inode, 4*EXT3_QUOTA_INIT_BLOCKS+3);
		handle = ext3_journal_start(inode, 2*(EXT3_QUOTA_INIT_BLOCKS(inode->i_sb)+
					EXT3_QUOTA_DEL_BLOCKS(inode->i_sb))+3);
		if (IS_ERR(handle)) {
		if (IS_ERR(handle)) {
			error = PTR_ERR(handle);
			error = PTR_ERR(handle);
			goto err_out;
			goto err_out;
@@ -2861,7 +2862,7 @@ static int ext3_writepage_trans_blocks(struct inode *inode)
#ifdef CONFIG_QUOTA
#ifdef CONFIG_QUOTA
	/* We know that structure was already allocated during DQUOT_INIT so
	/* We know that structure was already allocated during DQUOT_INIT so
	 * we will be updating only the data blocks + inodes */
	 * we will be updating only the data blocks + inodes */
	ret += 2*EXT3_QUOTA_TRANS_BLOCKS;
	ret += 2*EXT3_QUOTA_TRANS_BLOCKS(inode->i_sb);
#endif
#endif


	return ret;
	return ret;
+13 −12
Original line number Original line Diff line number Diff line
@@ -1645,9 +1645,9 @@ static int ext3_create (struct inode * dir, struct dentry * dentry, int mode,
	int err, retries = 0;
	int err, retries = 0;


retry:
retry:
	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS +
	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) +
					EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 +
					EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 +
					2*EXT3_QUOTA_INIT_BLOCKS);
					2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb));
	if (IS_ERR(handle))
	if (IS_ERR(handle))
		return PTR_ERR(handle);
		return PTR_ERR(handle);


@@ -1679,9 +1679,9 @@ static int ext3_mknod (struct inode * dir, struct dentry *dentry,
		return -EINVAL;
		return -EINVAL;


retry:
retry:
	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS +
	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) +
			 		EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 +
			 		EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 +
					2*EXT3_QUOTA_INIT_BLOCKS);
					2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb));
	if (IS_ERR(handle))
	if (IS_ERR(handle))
		return PTR_ERR(handle);
		return PTR_ERR(handle);


@@ -1715,9 +1715,9 @@ static int ext3_mkdir(struct inode * dir, struct dentry * dentry, int mode)
		return -EMLINK;
		return -EMLINK;


retry:
retry:
	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS +
	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) +
					EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 +
					EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 +
					2*EXT3_QUOTA_INIT_BLOCKS);
					2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb));
	if (IS_ERR(handle))
	if (IS_ERR(handle))
		return PTR_ERR(handle);
		return PTR_ERR(handle);


@@ -2006,7 +2006,7 @@ static int ext3_rmdir (struct inode * dir, struct dentry *dentry)
	/* Initialize quotas before so that eventual writes go in
	/* Initialize quotas before so that eventual writes go in
	 * separate transaction */
	 * separate transaction */
	DQUOT_INIT(dentry->d_inode);
	DQUOT_INIT(dentry->d_inode);
	handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS);
	handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS(dir->i_sb));
	if (IS_ERR(handle))
	if (IS_ERR(handle))
		return PTR_ERR(handle);
		return PTR_ERR(handle);


@@ -2065,7 +2065,7 @@ static int ext3_unlink(struct inode * dir, struct dentry *dentry)
	/* Initialize quotas before so that eventual writes go
	/* Initialize quotas before so that eventual writes go
	 * in separate transaction */
	 * in separate transaction */
	DQUOT_INIT(dentry->d_inode);
	DQUOT_INIT(dentry->d_inode);
	handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS);
	handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS(dir->i_sb));
	if (IS_ERR(handle))
	if (IS_ERR(handle))
		return PTR_ERR(handle);
		return PTR_ERR(handle);


@@ -2120,9 +2120,9 @@ static int ext3_symlink (struct inode * dir,
		return -ENAMETOOLONG;
		return -ENAMETOOLONG;


retry:
retry:
	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS +
	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) +
			 		EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5 +
			 		EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5 +
					2*EXT3_QUOTA_INIT_BLOCKS);
					2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb));
	if (IS_ERR(handle))
	if (IS_ERR(handle))
		return PTR_ERR(handle);
		return PTR_ERR(handle);


@@ -2174,7 +2174,7 @@ static int ext3_link (struct dentry * old_dentry,
		return -EMLINK;
		return -EMLINK;


retry:
retry:
	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS +
	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) +
					EXT3_INDEX_EXTRA_TRANS_BLOCKS);
					EXT3_INDEX_EXTRA_TRANS_BLOCKS);
	if (IS_ERR(handle))
	if (IS_ERR(handle))
		return PTR_ERR(handle);
		return PTR_ERR(handle);
@@ -2216,7 +2216,8 @@ static int ext3_rename (struct inode * old_dir, struct dentry *old_dentry,
	 * in separate transaction */
	 * in separate transaction */
	if (new_dentry->d_inode)
	if (new_dentry->d_inode)
		DQUOT_INIT(new_dentry->d_inode);
		DQUOT_INIT(new_dentry->d_inode);
	handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS +
	handle = ext3_journal_start(old_dir, 2 *
					EXT3_DATA_TRANS_BLOCKS(old_dir->i_sb) +
			 		EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2);
			 		EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2);
	if (IS_ERR(handle))
	if (IS_ERR(handle))
		return PTR_ERR(handle);
		return PTR_ERR(handle);
+27 −10
Original line number Original line Diff line number Diff line
@@ -589,7 +589,7 @@ enum {
	Opt_commit, Opt_journal_update, Opt_journal_inum,
	Opt_commit, Opt_journal_update, Opt_journal_inum,
	Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback,
	Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback,
	Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota,
	Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota,
	Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0,
	Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_quota, Opt_noquota,
	Opt_ignore, Opt_barrier, Opt_err, Opt_resize,
	Opt_ignore, Opt_barrier, Opt_err, Opt_resize,
};
};


@@ -634,10 +634,10 @@ static match_table_t tokens = {
	{Opt_grpjquota, "grpjquota=%s"},
	{Opt_grpjquota, "grpjquota=%s"},
	{Opt_jqfmt_vfsold, "jqfmt=vfsold"},
	{Opt_jqfmt_vfsold, "jqfmt=vfsold"},
	{Opt_jqfmt_vfsv0, "jqfmt=vfsv0"},
	{Opt_jqfmt_vfsv0, "jqfmt=vfsv0"},
	{Opt_ignore, "grpquota"},
	{Opt_quota, "grpquota"},
	{Opt_ignore, "noquota"},
	{Opt_noquota, "noquota"},
	{Opt_ignore, "quota"},
	{Opt_quota, "quota"},
	{Opt_ignore, "usrquota"},
	{Opt_quota, "usrquota"},
	{Opt_barrier, "barrier=%u"},
	{Opt_barrier, "barrier=%u"},
	{Opt_err, NULL},
	{Opt_err, NULL},
	{Opt_resize, "resize"},
	{Opt_resize, "resize"},
@@ -876,6 +876,7 @@ static int parse_options (char * options, struct super_block *sb,
				sbi->s_qf_names[qtype] = NULL;
				sbi->s_qf_names[qtype] = NULL;
				return 0;
				return 0;
			}
			}
			set_opt(sbi->s_mount_opt, QUOTA);
			break;
			break;
		case Opt_offusrjquota:
		case Opt_offusrjquota:
			qtype = USRQUOTA;
			qtype = USRQUOTA;
@@ -898,6 +899,17 @@ static int parse_options (char * options, struct super_block *sb,
		case Opt_jqfmt_vfsv0:
		case Opt_jqfmt_vfsv0:
			sbi->s_jquota_fmt = QFMT_VFS_V0;
			sbi->s_jquota_fmt = QFMT_VFS_V0;
			break;
			break;
		case Opt_quota:
			set_opt(sbi->s_mount_opt, QUOTA);
			break;
		case Opt_noquota:
			if (sb_any_quota_enabled(sb)) {
				printk(KERN_ERR "EXT3-fs: Cannot change quota "
					"options when quota turned on.\n");
				return 0;
			}
			clear_opt(sbi->s_mount_opt, QUOTA);
			break;
#else
#else
		case Opt_usrjquota:
		case Opt_usrjquota:
		case Opt_grpjquota:
		case Opt_grpjquota:
@@ -909,6 +921,9 @@ static int parse_options (char * options, struct super_block *sb,
				"EXT3-fs: journalled quota options not "
				"EXT3-fs: journalled quota options not "
				"supported.\n");
				"supported.\n");
			break;
			break;
		case Opt_quota:
		case Opt_noquota:
			break;
#endif
#endif
		case Opt_abort:
		case Opt_abort:
			set_opt(sbi->s_mount_opt, ABORT);
			set_opt(sbi->s_mount_opt, ABORT);
@@ -2238,7 +2253,7 @@ static int ext3_dquot_initialize(struct inode *inode, int type)
	int ret, err;
	int ret, err;


	/* We may create quota structure so we need to reserve enough blocks */
	/* We may create quota structure so we need to reserve enough blocks */
	handle = ext3_journal_start(inode, 2*EXT3_QUOTA_INIT_BLOCKS);
	handle = ext3_journal_start(inode, 2*EXT3_QUOTA_INIT_BLOCKS(inode->i_sb));
	if (IS_ERR(handle))
	if (IS_ERR(handle))
		return PTR_ERR(handle);
		return PTR_ERR(handle);
	ret = dquot_initialize(inode, type);
	ret = dquot_initialize(inode, type);
@@ -2254,7 +2269,7 @@ static int ext3_dquot_drop(struct inode *inode)
	int ret, err;
	int ret, err;


	/* We may delete quota structure so we need to reserve enough blocks */
	/* We may delete quota structure so we need to reserve enough blocks */
	handle = ext3_journal_start(inode, 2*EXT3_QUOTA_INIT_BLOCKS);
	handle = ext3_journal_start(inode, 2*EXT3_QUOTA_DEL_BLOCKS(inode->i_sb));
	if (IS_ERR(handle))
	if (IS_ERR(handle))
		return PTR_ERR(handle);
		return PTR_ERR(handle);
	ret = dquot_drop(inode);
	ret = dquot_drop(inode);
@@ -2272,7 +2287,7 @@ static int ext3_write_dquot(struct dquot *dquot)


	inode = dquot_to_inode(dquot);
	inode = dquot_to_inode(dquot);
	handle = ext3_journal_start(inode,
	handle = ext3_journal_start(inode,
					EXT3_QUOTA_TRANS_BLOCKS);
					EXT3_QUOTA_TRANS_BLOCKS(dquot->dq_sb));
	if (IS_ERR(handle))
	if (IS_ERR(handle))
		return PTR_ERR(handle);
		return PTR_ERR(handle);
	ret = dquot_commit(dquot);
	ret = dquot_commit(dquot);
@@ -2288,7 +2303,7 @@ static int ext3_acquire_dquot(struct dquot *dquot)
	handle_t *handle;
	handle_t *handle;


	handle = ext3_journal_start(dquot_to_inode(dquot),
	handle = ext3_journal_start(dquot_to_inode(dquot),
					EXT3_QUOTA_INIT_BLOCKS);
					EXT3_QUOTA_INIT_BLOCKS(dquot->dq_sb));
	if (IS_ERR(handle))
	if (IS_ERR(handle))
		return PTR_ERR(handle);
		return PTR_ERR(handle);
	ret = dquot_acquire(dquot);
	ret = dquot_acquire(dquot);
@@ -2304,7 +2319,7 @@ static int ext3_release_dquot(struct dquot *dquot)
	handle_t *handle;
	handle_t *handle;


	handle = ext3_journal_start(dquot_to_inode(dquot),
	handle = ext3_journal_start(dquot_to_inode(dquot),
					EXT3_QUOTA_INIT_BLOCKS);
					EXT3_QUOTA_DEL_BLOCKS(dquot->dq_sb));
	if (IS_ERR(handle))
	if (IS_ERR(handle))
		return PTR_ERR(handle);
		return PTR_ERR(handle);
	ret = dquot_release(dquot);
	ret = dquot_release(dquot);
@@ -2361,6 +2376,8 @@ static int ext3_quota_on(struct super_block *sb, int type, int format_id,
	int err;
	int err;
	struct nameidata nd;
	struct nameidata nd;


	if (!test_opt(sb, QUOTA))
		return -EINVAL;
	/* Not journalling quota? */
	/* Not journalling quota? */
	if (!EXT3_SB(sb)->s_qf_names[USRQUOTA] &&
	if (!EXT3_SB(sb)->s_qf_names[USRQUOTA] &&
	    !EXT3_SB(sb)->s_qf_names[GRPQUOTA])
	    !EXT3_SB(sb)->s_qf_names[GRPQUOTA])
+1 −1
Original line number Original line Diff line number Diff line
@@ -1044,7 +1044,7 @@ ext3_xattr_set(struct inode *inode, int name_index, const char *name,
	int error, retries = 0;
	int error, retries = 0;


retry:
retry:
	handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS);
	handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS(inode->i_sb));
	if (IS_ERR(handle)) {
	if (IS_ERR(handle)) {
		error = PTR_ERR(handle);
		error = PTR_ERR(handle);
	} else {
	} else {
Loading