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

Commit 21f97697 authored by Jan Kara's avatar Jan Kara Committed by Theodore Ts'o
Browse files

ext4: remove unnecessary [cm]time update of quota file



It is not necessary to update [cm]time of quota file on each quota
file write and it wastes journal space and IO throughput with inode
writes. So just remove the updating from ext4_quota_write() and only
update times when quotas are being turned off. Userspace cannot get
anything reliable from quota files while they are used by the kernel
anyway.

Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 50f689af
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -86,8 +86,8 @@


#ifdef CONFIG_QUOTA
#ifdef CONFIG_QUOTA
/* Amount of blocks needed for quota update - we know that the structure was
/* Amount of blocks needed for quota update - we know that the structure was
 * allocated so we need to update only inode+data */
 * allocated so we need to update only data block */
#define EXT4_QUOTA_TRANS_BLOCKS(sb) (test_opt(sb, QUOTA) ? 2 : 0)
#define EXT4_QUOTA_TRANS_BLOCKS(sb) (test_opt(sb, QUOTA) ? 1 : 0)
/* Amount of blocks needed for quota insert/delete - we do some block writes
/* Amount of blocks needed for quota insert/delete - we do some block writes
 * but inode, sb and group updates are done only once */
 * but inode, sb and group updates are done only once */
#define EXT4_QUOTA_INIT_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_INIT_ALLOC*\
#define EXT4_QUOTA_INIT_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_INIT_ALLOC*\
+14 −2
Original line number Original line Diff line number Diff line
@@ -4614,11 +4614,24 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id,


static int ext4_quota_off(struct super_block *sb, int type)
static int ext4_quota_off(struct super_block *sb, int type)
{
{
	struct inode *inode = sb_dqopt(sb)->files[type];
	handle_t *handle;

	/* Force all delayed allocation blocks to be allocated.
	/* Force all delayed allocation blocks to be allocated.
	 * Caller already holds s_umount sem */
	 * Caller already holds s_umount sem */
	if (test_opt(sb, DELALLOC))
	if (test_opt(sb, DELALLOC))
		sync_filesystem(sb);
		sync_filesystem(sb);


	/* Update modification times of quota files when userspace can
	 * start looking at them */
	handle = ext4_journal_start(inode, 1);
	if (IS_ERR(handle))
		goto out;
	inode->i_mtime = inode->i_ctime = CURRENT_TIME;
	ext4_mark_inode_dirty(handle, inode);
	ext4_journal_stop(handle);

out:
	return dquot_quota_off(sb, type);
	return dquot_quota_off(sb, type);
}
}


@@ -4714,9 +4727,8 @@ static ssize_t ext4_quota_write(struct super_block *sb, int type,
	if (inode->i_size < off + len) {
	if (inode->i_size < off + len) {
		i_size_write(inode, off + len);
		i_size_write(inode, off + len);
		EXT4_I(inode)->i_disksize = inode->i_size;
		EXT4_I(inode)->i_disksize = inode->i_size;
	}
	inode->i_mtime = inode->i_ctime = CURRENT_TIME;
		ext4_mark_inode_dirty(handle, inode);
		ext4_mark_inode_dirty(handle, inode);
	}
	mutex_unlock(&inode->i_mutex);
	mutex_unlock(&inode->i_mutex);
	return len;
	return len;
}
}