| From 909110c060f22e65756659ec6fa957ae75777e00 Mon Sep 17 00:00:00 2001 |
| From: Chengguang Xu <cgxu519@mykernel.net> |
| Date: Mon, 25 Nov 2019 11:20:36 +0800 |
| Subject: f2fs: choose hardlimit when softlimit is larger than hardlimit in f2fs_statfs_project() |
| |
| From: Chengguang Xu <cgxu519@mykernel.net> |
| |
| commit 909110c060f22e65756659ec6fa957ae75777e00 upstream. |
| |
| Setting softlimit larger than hardlimit seems meaningless |
| for disk quota but currently it is allowed. In this case, |
| there may be a bit of comfusion for users when they run |
| df comamnd to directory which has project quota. |
| |
| For example, we set 20M softlimit and 10M hardlimit of |
| block usage limit for project quota of test_dir(project id 123). |
| |
| [root@hades f2fs]# repquota -P -a |
| --- |
| fs/f2fs/super.c | 20 ++++++++++++++------ |
| 1 file changed, 14 insertions(+), 6 deletions(-) |
| |
| --- a/fs/f2fs/super.c |
| +++ b/fs/f2fs/super.c |
| @@ -1148,9 +1148,13 @@ static int f2fs_statfs_project(struct su |
| return PTR_ERR(dquot); |
| spin_lock(&dquot->dq_dqb_lock); |
| |
| - limit = (dquot->dq_dqb.dqb_bsoftlimit ? |
| - dquot->dq_dqb.dqb_bsoftlimit : |
| - dquot->dq_dqb.dqb_bhardlimit) >> sb->s_blocksize_bits; |
| + limit = 0; |
| + if (dquot->dq_dqb.dqb_bsoftlimit) |
| + limit = dquot->dq_dqb.dqb_bsoftlimit; |
| + if (dquot->dq_dqb.dqb_bhardlimit && |
| + (!limit || dquot->dq_dqb.dqb_bhardlimit < limit)) |
| + limit = dquot->dq_dqb.dqb_bhardlimit; |
| + |
| if (limit && buf->f_blocks > limit) { |
| curblock = dquot->dq_dqb.dqb_curspace >> sb->s_blocksize_bits; |
| buf->f_blocks = limit; |
| @@ -1159,9 +1163,13 @@ static int f2fs_statfs_project(struct su |
| (buf->f_blocks - curblock) : 0; |
| } |
| |
| - limit = dquot->dq_dqb.dqb_isoftlimit ? |
| - dquot->dq_dqb.dqb_isoftlimit : |
| - dquot->dq_dqb.dqb_ihardlimit; |
| + limit = 0; |
| + if (dquot->dq_dqb.dqb_isoftlimit) |
| + limit = dquot->dq_dqb.dqb_isoftlimit; |
| + if (dquot->dq_dqb.dqb_ihardlimit && |
| + (!limit || dquot->dq_dqb.dqb_ihardlimit < limit)) |
| + limit = dquot->dq_dqb.dqb_ihardlimit; |
| + |
| if (limit && buf->f_files > limit) { |
| buf->f_files = limit; |
| buf->f_ffree = |