mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-11 07:30:16 +00:00
Ext4 regression fixes for 3.4
This fixes a scalability problem reported by Andi Kleen and Tim Chen; they were quite secretive about the precise nature of their workload, but they later admitted that it only showed up when they were using a large sparse file, so the amount of data I/O that was needed was close to zero. I'm not sure how realistic this is and it's only a regression if you consider changes made since 2.6.39 to be a "regression" vis-a-vis the policy regarding post-merge window bug fixes, but Linus agreed it was worth fixing, so I'm including it in this pull request. This also fixes the journalled quota mount options, which I accidentally broke while I was cleaning up the mount option handling. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iQIcBAABCAAGBQJPjbs2AAoJENNvdpvBGATw/4UQAOMsxRlzbMnOAmohIBmesJiB nTPX41dNw0QCXstMFjvSyRbUJI0NZPGg6ZDhbtoQ/c42/izZOVNd7gh7QQYHRCt2 Oqh6WS159P04ixcAe8NgCm5B5AV/C5Er/vSOUZENBaBo430vvrZasifsyUgQnx+b PxXlYsfPVzaQVeSxCu/68OeiBRLcLwmKZ6MicOaWt9GCNoCsWzgU+/LNskYuscPI 841yQL6/BE7redU2E9qoEn/xjxx57hJOj2iiIAuqGPmNmRQqq3VtvTqNZHldNBLp Hz5mB3zSZsPg0uwvp+OxrnpP37NQCCn1L64UFIXxqGF47mcCYw7schAoGBtqwGQS neGUfkzG4beKk7kojyDawvnrrvVn4iCMaIkR1ZjzjPOk+QBPagckrS2nmuObbYzJ l4lmHq1v8nOh0clxqJPioNp5/Y13sbpEOY4tAa6sLpzKLKXF330RNuwwrKKHB7zo ZhCvSwVEjmxacgPCPhFJnR3fxtjoXWR8WvJs7H+gZB/QaC8hjEYw6xvvrkw8mAiS RNe3cYdYAz6kOJdtJrJaMzp/1CYdHydf+0WvNYCQ/d1poPr7uU5wQY61hdm2gFxh owsbVAOiEFjZWJHqrRRdcg2irTpINJTS3iRe4g/ltcvYzzRSeOcZNWvkKFspq3i8 EUMHRBxLzPMRa+gU6Unm =jb3f -----END PGP SIGNATURE----- Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 Pull ext4 regression fixes from Ted Ts'o: "This fixes a scalability problem reported by Andi Kleen and Tim Chen; they were quite secretive about the precise nature of their workload, but they later admitted that it only showed up when they were using a large sparse file, so the amount of data I/O that was needed was close to zero. I'm not sure how realistic this is and it's only a regression if you consider changes made since 2.6.39 to be a "regression" vis-a-vis the policy regarding post-merge window bug fixes, but Linus agreed it was worth fixing, so I'm including it in this pull request. This also fixes the journalled quota mount options, which I accidentally broke while I was cleaning up the mount option handling." * tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: ext4: fix handling of journalled quota options ext4: address scalability issue by removing extent cache statistics
This commit is contained in:
commit
592fe89806
@ -1203,9 +1203,6 @@ struct ext4_sb_info {
|
|||||||
unsigned long s_ext_blocks;
|
unsigned long s_ext_blocks;
|
||||||
unsigned long s_ext_extents;
|
unsigned long s_ext_extents;
|
||||||
#endif
|
#endif
|
||||||
/* ext4 extent cache stats */
|
|
||||||
unsigned long extent_cache_hits;
|
|
||||||
unsigned long extent_cache_misses;
|
|
||||||
|
|
||||||
/* for buddy allocator */
|
/* for buddy allocator */
|
||||||
struct ext4_group_info ***s_group_info;
|
struct ext4_group_info ***s_group_info;
|
||||||
|
@ -2066,10 +2066,6 @@ static int ext4_ext_check_cache(struct inode *inode, ext4_lblk_t block,
|
|||||||
ret = 1;
|
ret = 1;
|
||||||
}
|
}
|
||||||
errout:
|
errout:
|
||||||
if (!ret)
|
|
||||||
sbi->extent_cache_misses++;
|
|
||||||
else
|
|
||||||
sbi->extent_cache_hits++;
|
|
||||||
trace_ext4_ext_in_cache(inode, block, ret);
|
trace_ext4_ext_in_cache(inode, block, ret);
|
||||||
spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
|
spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1305,20 +1305,20 @@ static int set_qf_name(struct super_block *sb, int qtype, substring_t *args)
|
|||||||
ext4_msg(sb, KERN_ERR,
|
ext4_msg(sb, KERN_ERR,
|
||||||
"Cannot change journaled "
|
"Cannot change journaled "
|
||||||
"quota options when quota turned on");
|
"quota options when quota turned on");
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
qname = match_strdup(args);
|
qname = match_strdup(args);
|
||||||
if (!qname) {
|
if (!qname) {
|
||||||
ext4_msg(sb, KERN_ERR,
|
ext4_msg(sb, KERN_ERR,
|
||||||
"Not enough memory for storing quotafile name");
|
"Not enough memory for storing quotafile name");
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
if (sbi->s_qf_names[qtype] &&
|
if (sbi->s_qf_names[qtype] &&
|
||||||
strcmp(sbi->s_qf_names[qtype], qname)) {
|
strcmp(sbi->s_qf_names[qtype], qname)) {
|
||||||
ext4_msg(sb, KERN_ERR,
|
ext4_msg(sb, KERN_ERR,
|
||||||
"%s quota file already specified", QTYPE2NAME(qtype));
|
"%s quota file already specified", QTYPE2NAME(qtype));
|
||||||
kfree(qname);
|
kfree(qname);
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
sbi->s_qf_names[qtype] = qname;
|
sbi->s_qf_names[qtype] = qname;
|
||||||
if (strchr(sbi->s_qf_names[qtype], '/')) {
|
if (strchr(sbi->s_qf_names[qtype], '/')) {
|
||||||
@ -1326,7 +1326,7 @@ static int set_qf_name(struct super_block *sb, int qtype, substring_t *args)
|
|||||||
"quotafile must be on filesystem root");
|
"quotafile must be on filesystem root");
|
||||||
kfree(sbi->s_qf_names[qtype]);
|
kfree(sbi->s_qf_names[qtype]);
|
||||||
sbi->s_qf_names[qtype] = NULL;
|
sbi->s_qf_names[qtype] = NULL;
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
set_opt(sb, QUOTA);
|
set_opt(sb, QUOTA);
|
||||||
return 1;
|
return 1;
|
||||||
@ -1341,7 +1341,7 @@ static int clear_qf_name(struct super_block *sb, int qtype)
|
|||||||
sbi->s_qf_names[qtype]) {
|
sbi->s_qf_names[qtype]) {
|
||||||
ext4_msg(sb, KERN_ERR, "Cannot change journaled quota options"
|
ext4_msg(sb, KERN_ERR, "Cannot change journaled quota options"
|
||||||
" when quota turned on");
|
" when quota turned on");
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* The space will be released later when all options are confirmed
|
* The space will be released later when all options are confirmed
|
||||||
@ -1450,6 +1450,16 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
|
|||||||
const struct mount_opts *m;
|
const struct mount_opts *m;
|
||||||
int arg = 0;
|
int arg = 0;
|
||||||
|
|
||||||
|
#ifdef CONFIG_QUOTA
|
||||||
|
if (token == Opt_usrjquota)
|
||||||
|
return set_qf_name(sb, USRQUOTA, &args[0]);
|
||||||
|
else if (token == Opt_grpjquota)
|
||||||
|
return set_qf_name(sb, GRPQUOTA, &args[0]);
|
||||||
|
else if (token == Opt_offusrjquota)
|
||||||
|
return clear_qf_name(sb, USRQUOTA);
|
||||||
|
else if (token == Opt_offgrpjquota)
|
||||||
|
return clear_qf_name(sb, GRPQUOTA);
|
||||||
|
#endif
|
||||||
if (args->from && match_int(args, &arg))
|
if (args->from && match_int(args, &arg))
|
||||||
return -1;
|
return -1;
|
||||||
switch (token) {
|
switch (token) {
|
||||||
@ -1549,18 +1559,6 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
|
|||||||
sbi->s_mount_opt |= m->mount_opt;
|
sbi->s_mount_opt |= m->mount_opt;
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_QUOTA
|
#ifdef CONFIG_QUOTA
|
||||||
} else if (token == Opt_usrjquota) {
|
|
||||||
if (!set_qf_name(sb, USRQUOTA, &args[0]))
|
|
||||||
return -1;
|
|
||||||
} else if (token == Opt_grpjquota) {
|
|
||||||
if (!set_qf_name(sb, GRPQUOTA, &args[0]))
|
|
||||||
return -1;
|
|
||||||
} else if (token == Opt_offusrjquota) {
|
|
||||||
if (!clear_qf_name(sb, USRQUOTA))
|
|
||||||
return -1;
|
|
||||||
} else if (token == Opt_offgrpjquota) {
|
|
||||||
if (!clear_qf_name(sb, GRPQUOTA))
|
|
||||||
return -1;
|
|
||||||
} else if (m->flags & MOPT_QFMT) {
|
} else if (m->flags & MOPT_QFMT) {
|
||||||
if (sb_any_quota_loaded(sb) &&
|
if (sb_any_quota_loaded(sb) &&
|
||||||
sbi->s_jquota_fmt != m->mount_opt) {
|
sbi->s_jquota_fmt != m->mount_opt) {
|
||||||
@ -2366,18 +2364,6 @@ static ssize_t lifetime_write_kbytes_show(struct ext4_attr *a,
|
|||||||
EXT4_SB(sb)->s_sectors_written_start) >> 1)));
|
EXT4_SB(sb)->s_sectors_written_start) >> 1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t extent_cache_hits_show(struct ext4_attr *a,
|
|
||||||
struct ext4_sb_info *sbi, char *buf)
|
|
||||||
{
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%lu\n", sbi->extent_cache_hits);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t extent_cache_misses_show(struct ext4_attr *a,
|
|
||||||
struct ext4_sb_info *sbi, char *buf)
|
|
||||||
{
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%lu\n", sbi->extent_cache_misses);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t inode_readahead_blks_store(struct ext4_attr *a,
|
static ssize_t inode_readahead_blks_store(struct ext4_attr *a,
|
||||||
struct ext4_sb_info *sbi,
|
struct ext4_sb_info *sbi,
|
||||||
const char *buf, size_t count)
|
const char *buf, size_t count)
|
||||||
@ -2435,8 +2421,6 @@ static struct ext4_attr ext4_attr_##name = __ATTR(name, mode, show, store)
|
|||||||
EXT4_RO_ATTR(delayed_allocation_blocks);
|
EXT4_RO_ATTR(delayed_allocation_blocks);
|
||||||
EXT4_RO_ATTR(session_write_kbytes);
|
EXT4_RO_ATTR(session_write_kbytes);
|
||||||
EXT4_RO_ATTR(lifetime_write_kbytes);
|
EXT4_RO_ATTR(lifetime_write_kbytes);
|
||||||
EXT4_RO_ATTR(extent_cache_hits);
|
|
||||||
EXT4_RO_ATTR(extent_cache_misses);
|
|
||||||
EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, sbi_ui_show,
|
EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, sbi_ui_show,
|
||||||
inode_readahead_blks_store, s_inode_readahead_blks);
|
inode_readahead_blks_store, s_inode_readahead_blks);
|
||||||
EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal);
|
EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal);
|
||||||
@ -2452,8 +2436,6 @@ static struct attribute *ext4_attrs[] = {
|
|||||||
ATTR_LIST(delayed_allocation_blocks),
|
ATTR_LIST(delayed_allocation_blocks),
|
||||||
ATTR_LIST(session_write_kbytes),
|
ATTR_LIST(session_write_kbytes),
|
||||||
ATTR_LIST(lifetime_write_kbytes),
|
ATTR_LIST(lifetime_write_kbytes),
|
||||||
ATTR_LIST(extent_cache_hits),
|
|
||||||
ATTR_LIST(extent_cache_misses),
|
|
||||||
ATTR_LIST(inode_readahead_blks),
|
ATTR_LIST(inode_readahead_blks),
|
||||||
ATTR_LIST(inode_goal),
|
ATTR_LIST(inode_goal),
|
||||||
ATTR_LIST(mb_stats),
|
ATTR_LIST(mb_stats),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user