| From 42e60e98b3c2232b143ef7494eb67d012e54eace Mon Sep 17 00:00:00 2001 |
| From: Chengguang Xu <cgxu519@mykernel.net> |
| Date: Mon, 25 Nov 2019 11:20:36 +0800 |
| Subject: [PATCH] f2fs: choose hardlimit when softlimit is larger than |
| hardlimit in f2fs_statfs_project() |
| |
| 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 |
| *** Report for project quotas on device /dev/nvme0n1p8 |
| Block grace time: 7days; Inode grace time: 7days |
| Block limits File limits |
| Project used soft hard grace used soft hard grace |
| ---------------------------------------------------------------------- |
| 0 -- 4 0 0 1 0 0 |
| 123 +- 10248 20480 10240 2 0 0 |
| |
| The result of df command as below: |
| |
| [root@hades f2fs]# df -h /mnt/f2fs/test |
| Filesystem Size Used Avail Use% Mounted on |
| /dev/nvme0n1p8 20M 11M 10M 51% /mnt/f2fs |
| |
| Even though it looks like there is another 10M free space to use, |
| if we write new data to diretory test(inherit project id), |
| the write will fail with errno(-EDQUOT). |
| |
| After this patch, the df result looks like below. |
| |
| [root@hades f2fs]# df -h /mnt/f2fs/test |
| Filesystem Size Used Avail Use% Mounted on |
| /dev/nvme0n1p8 10M 10M 0 100% /mnt/f2fs |
| |
| Signed-off-by: Chengguang Xu <cgxu519@mykernel.net> |
| Reviewed-by: Chao Yu <yuchao0@huawei.com> |
| Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c |
| index 6f15d43ad937..241a57372201 100644 |
| --- a/fs/f2fs/super.c |
| +++ b/fs/f2fs/super.c |
| @@ -1191,9 +1191,13 @@ static int f2fs_statfs_project(struct super_block *sb, |
| 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; |
| @@ -1202,9 +1206,13 @@ static int f2fs_statfs_project(struct super_block *sb, |
| (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 = |
| -- |
| 2.7.4 |
| |