Commit 7e08da50 authored by Jan Kara's avatar Jan Kara

quota: Fix maximum quota limit settings

Currently quota format that supports 64-bit usage sets maximum quota
limit as 2^64-1. However quota core code uses signed numbers to track
usage and even limits themselves are stored in long long. Checking of
maximum allowable limits worked by luck until commit 14bf61ff
(quota: Switch ->get_dqblk() and ->set_dqblk() to use bytes as space
units) because variable we compared with was unsigned. After that commit
the type we compared against changed to signed and thus checks for
maximum limits with the newest VFS quota format started to refuse any
non-negative value. Later the problem was inadvertedly fixed by commit
b10a0819 (quota: Store maximum space limit in bytes) because we
started to compare against unsigned type as well.

Fix possible future problems of this kind by setting maximum limits to
2^63-1 to avoid overflow issues.
Reported-by: default avatarCarlos Carvalho <carlos@fisica.ufpr.br>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 78197024
...@@ -117,12 +117,16 @@ static int v2_read_file_info(struct super_block *sb, int type) ...@@ -117,12 +117,16 @@ static int v2_read_file_info(struct super_block *sb, int type)
qinfo = info->dqi_priv; qinfo = info->dqi_priv;
if (version == 0) { if (version == 0) {
/* limits are stored as unsigned 32-bit data */ /* limits are stored as unsigned 32-bit data */
info->dqi_max_spc_limit = 0xffffffffULL << QUOTABLOCK_BITS; info->dqi_max_spc_limit = 0xffffffffLL << QUOTABLOCK_BITS;
info->dqi_max_ino_limit = 0xffffffff; info->dqi_max_ino_limit = 0xffffffff;
} else { } else {
/* used space is stored as unsigned 64-bit value in bytes */ /*
info->dqi_max_spc_limit = 0xffffffffffffffffULL; /* 2^64-1 */ * Used space is stored as unsigned 64-bit value in bytes but
info->dqi_max_ino_limit = 0xffffffffffffffffULL; * quota core supports only signed 64-bit values so use that
* as a limit
*/
info->dqi_max_spc_limit = 0x7fffffffffffffffLL; /* 2^63-1 */
info->dqi_max_ino_limit = 0x7fffffffffffffffLL;
} }
info->dqi_bgrace = le32_to_cpu(dinfo.dqi_bgrace); info->dqi_bgrace = le32_to_cpu(dinfo.dqi_bgrace);
info->dqi_igrace = le32_to_cpu(dinfo.dqi_igrace); info->dqi_igrace = le32_to_cpu(dinfo.dqi_igrace);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment