From: Chengguang Xu <cgxu519@mykernel.net>
To: "Jan Kara" <jack@suse.cz>
Cc: "tytso" <tytso@mit.edu>,
"adilger.kernel" <adilger.kernel@dilger.ca>,
"linux-ext4" <linux-ext4@vger.kernel.org>
Subject: Re: [PATCH] ext4: choose hardlimit when softlimit is larger than hardlimit in ext4_statfs_project()
Date: Tue, 15 Oct 2019 17:34:31 +0800 [thread overview]
Message-ID: <16dcec4df57.d8e9fcdc10107.7620254946323645087@mykernel.net> (raw)
In-Reply-To: <20191015082001.GD21550@quack2.suse.cz>
---- 在 星期二, 2019-10-15 16:20:01 Jan Kara <jack@suse.cz> 撰写 ----
> On Thu 10-10-19 13:14:26, Chengguang Xu wrote:
> > 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 mnt_ext4]# repquota -P -a
> > *** Report for project quotas on device /dev/loop0
> > Block grace time: 7days; Inode grace time: 7days
> > Block limits File limits
> > Project used soft hard grace used soft hard grace
> > ----------------------------------------------------------------------
> > 0 -- 13 0 0 2 0 0
> > 123 -- 10237 20480 10240 5 200 100
> >
> > The result of df command as below:
> >
> > [root@hades mnt_ext4]# df -h test_dir
> > Filesystem Size Used Avail Use% Mounted on
> > /dev/loop0 20M 10M 10M 50% /home/cgxu/test/mnt_ext4
> >
> > Even though it looks like there is another 10M free space to use,
> > if we write new data to diretory test_dir(inherit project id),
> > the write will fail with errno(-EDQUOT).
> >
> > After this patch, the df result looks like below.
> >
> > [root@hades mnt_ext4]# df -h test_dir
> > Filesystem Size Used Avail Use% Mounted on
> > /dev/loop0 10M 10M 3.0K 100% /home/cgxu/test/mnt_ext4
> >
> > Signed-off-by: Chengguang Xu <cgxu519@mykernel.net>
>
> Good spotting! But the patch has a bug:
>
> > diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> > index dd654e53ba3d..08d4f993b365 100644
> > --- a/fs/ext4/super.c
> > +++ b/fs/ext4/super.c
> > @@ -5546,9 +5546,11 @@ static int ext4_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 = ((dquot->dq_dqb.dqb_bhardlimit &&
> > + (dquot->dq_dqb.dqb_bhardlimit < dquot->dq_dqb.dqb_bsoftlimit)) ?
> > + dquot->dq_dqb.dqb_bhardlimit :
> > + dquot->dq_dqb.dqb_bsoftlimit) >> sb->s_blocksize_bits;
> > +
>
> This is wrong in case softlimit isn't set and hardlimit is. In that case
> you'd have 'limit' equal to 0, which is wrong. Also the formula is rather
> hard to parse already. So I'd rather go with something like:
Ah, you are right, I overlooked it.
I'll fix in next version. Thanks for your review.
Thanks,
Chengguang
>
> limit = 0;
> if (dquot->dq_dqb.dqb_bsoftlimit &&
> (!limit || dquot->dq_dqb.dqb_bsoftlimit < limit))
> 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;
> limit >>= sb->s_blocksize_bits;
>
> and similarly for inode limit...
>
> Honza
>
> > if (limit && buf->f_blocks > limit) {
> > curblock = (dquot->dq_dqb.dqb_curspace +
> > dquot->dq_dqb.dqb_rsvspace) >> sb->s_blocksize_bits;
> > @@ -5558,9 +5560,11 @@ static int ext4_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 = (dquot->dq_dqb.dqb_ihardlimit &&
> > + (dquot->dq_dqb.dqb_ihardlimit < dquot->dq_dqb.dqb_isoftlimit)) ?
> > + dquot->dq_dqb.dqb_ihardlimit :
> > + dquot->dq_dqb.dqb_isoftlimit;
> > +
> > if (limit && buf->f_files > limit) {
> > buf->f_files = limit;
> > buf->f_ffree =
> > --
> > 2.20.1
> >
> >
> >
> --
> Jan Kara <jack@suse.com>
> SUSE Labs, CR
>
prev parent reply other threads:[~2019-10-15 9:34 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-10 5:14 [PATCH] ext4: choose hardlimit when softlimit is larger than hardlimit in ext4_statfs_project() Chengguang Xu
2019-10-15 8:20 ` Jan Kara
2019-10-15 9:34 ` Chengguang Xu [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=16dcec4df57.d8e9fcdc10107.7620254946323645087@mykernel.net \
--to=cgxu519@mykernel.net \
--cc=adilger.kernel@dilger.ca \
--cc=jack@suse.cz \
--cc=linux-ext4@vger.kernel.org \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox