Linux EXT4 FS development
 help / color / mirror / Atom feed
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
 >


      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