Commit c119c5b9749e ("quota: Don't store flags for v2 quota format") stopped persisting dqi_flags because no v2 flag was supported and on-disk flags could contain unvalidated garbage. Now that DQF_ROOT_SQUASH is settable on v2, losing it across quotaoff/quotaon or remount would silently re-enable the CAP_SYS_RESOURCE exemption - a poor property for an enforcement policy. Store the flag in the existing on-disk dqi_flags field and mask on read so only the supported flag is ever accepted from disk, which also keeps pre-existing garbage bits out of the in-memory flags. An older kernel rewriting quota info still clears the stored flag; strict enforcement then needs to be set up again after booting back. Signed-off-by: Kitae Yoo --- fs/quota/quota_v2.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/fs/quota/quota_v2.c b/fs/quota/quota_v2.c index a24fab5f9f..814db61681 100644 --- a/fs/quota/quota_v2.c +++ b/fs/quota/quota_v2.c @@ -142,8 +142,7 @@ static int v2_read_file_info(struct super_block *sb, int type) } info->dqi_bgrace = le32_to_cpu(dinfo.dqi_bgrace); info->dqi_igrace = le32_to_cpu(dinfo.dqi_igrace); - /* No flags currently supported */ - info->dqi_flags = 0; + info->dqi_flags = le32_to_cpu(dinfo.dqi_flags) & DQF_ROOT_SQUASH; qinfo->dqi_sb = sb; qinfo->dqi_type = type; qinfo->dqi_blocks = le32_to_cpu(dinfo.dqi_blocks); @@ -209,8 +208,7 @@ static int v2_write_file_info(struct super_block *sb, int type) info->dqi_flags &= ~DQF_INFO_DIRTY; dinfo.dqi_bgrace = cpu_to_le32(info->dqi_bgrace); dinfo.dqi_igrace = cpu_to_le32(info->dqi_igrace); - /* No flags currently supported */ - dinfo.dqi_flags = cpu_to_le32(0); + dinfo.dqi_flags = cpu_to_le32(info->dqi_flags & DQF_ROOT_SQUASH); spin_unlock(&dq_data_lock); dinfo.dqi_blocks = cpu_to_le32(qinfo->dqi_blocks); dinfo.dqi_free_blk = cpu_to_le32(qinfo->dqi_free_blk); -- 2.50.1 (Apple Git-155)