Merge branch 'quota_scaling' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
Pull quota scaling updates from Jan Kara: "This contains changes to make the quota subsystem more scalable. Reportedly it improves number of files created per second on ext4 filesystem on fast storage by about a factor of 2x" * 'quota_scaling' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs: (28 commits) quota: Add lock annotations to struct members quota: Reduce contention on dq_data_lock fs: Provide __inode_get_bytes() quota: Inline dquot_[re]claim_reserved_space() into callsite quota: Inline inode_{incr,decr}_space() into callsites quota: Inline functions into their callsites ext4: Disable dirty list tracking of dquots when journalling quotas quota: Allow disabling tracking of dirty dquots in a list quota: Remove dq_wait_unused from dquot quota: Move locking into clear_dquot_dirty() quota: Do not dirty bad dquots quota: Fix possible corruption of dqi_flags quota: Propagate ->quota_read errors from v2_read_file_info() quota: Fix error codes in v2_read_file_info() quota: Push dqio_sem down to ->read_file_info() quota: Push dqio_sem down to ->write_file_info() quota: Push dqio_sem down to ->get_next_id() quota: Push dqio_sem down to ->release_dqblk() quota: Remove locking for writing to the old quota format quota: Do not acquire dqio_sem for dquot overwrites in v2 format ...
This commit is contained in:
@@ -5215,7 +5215,7 @@ static int ext4_statfs_project(struct super_block *sb,
|
||||
dquot = dqget(sb, qid);
|
||||
if (IS_ERR(dquot))
|
||||
return PTR_ERR(dquot);
|
||||
spin_lock(&dq_data_lock);
|
||||
spin_lock(&dquot->dq_dqb_lock);
|
||||
|
||||
limit = (dquot->dq_dqb.dqb_bsoftlimit ?
|
||||
dquot->dq_dqb.dqb_bsoftlimit :
|
||||
@@ -5238,7 +5238,7 @@ static int ext4_statfs_project(struct super_block *sb,
|
||||
(buf->f_files - dquot->dq_dqb.dqb_curinodes) : 0;
|
||||
}
|
||||
|
||||
spin_unlock(&dq_data_lock);
|
||||
spin_unlock(&dquot->dq_dqb_lock);
|
||||
dqput(dquot);
|
||||
return 0;
|
||||
}
|
||||
@@ -5284,18 +5284,13 @@ static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Helper function for writing quotas on sync - we need to start transaction
|
||||
* before quota file is locked for write. Otherwise the are possible deadlocks:
|
||||
* Process 1 Process 2
|
||||
* ext4_create() quota_sync()
|
||||
* jbd2_journal_start() write_dquot()
|
||||
* dquot_initialize() down(dqio_mutex)
|
||||
* down(dqio_mutex) jbd2_journal_start()
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_QUOTA
|
||||
|
||||
/*
|
||||
* Helper functions so that transaction is started before we acquire dqio_sem
|
||||
* to keep correct lock ordering of transaction > dqio_sem
|
||||
*/
|
||||
static inline struct inode *dquot_to_inode(struct dquot *dquot)
|
||||
{
|
||||
return sb_dqopt(dquot->dq_sb)->files[dquot->dq_id.type];
|
||||
@@ -5430,6 +5425,13 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id,
|
||||
ext4_msg(sb, KERN_WARNING,
|
||||
"Quota file not on filesystem root. "
|
||||
"Journaled quota will not work");
|
||||
sb_dqopt(sb)->flags |= DQUOT_NOLIST_DIRTY;
|
||||
} else {
|
||||
/*
|
||||
* Clear the flag just in case mount options changed since
|
||||
* last time.
|
||||
*/
|
||||
sb_dqopt(sb)->flags &= ~DQUOT_NOLIST_DIRTY;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -5526,7 +5528,7 @@ static int ext4_enable_quotas(struct super_block *sb)
|
||||
test_opt(sb, PRJQUOTA),
|
||||
};
|
||||
|
||||
sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE;
|
||||
sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE | DQUOT_NOLIST_DIRTY;
|
||||
for (type = 0; type < EXT4_MAXQUOTAS; type++) {
|
||||
if (qf_inums[type]) {
|
||||
err = ext4_quota_enable(sb, type, QFMT_VFS_V1,
|
||||
|
Verwijs in nieuw issue
Block a user