On Mon 07-08-17 21:35:05, zhangyi (F) wrote: > Currently we compare total space (curspace + rsvspace) > with space limit in quota-tools when setting grace time > and also in check_bdq(), but we missing rsvspace in > somewhere else, correct them. This patch also fix incorrect > zero dqb_btime and grace time updating failure when we use > rsvspace(e.g. ext4 dalloc feature). > > Signed-off-by: zhangyi (F) <yi.zhang@xxxxxxxxxx> Thanks for the patch. I'll merge it through my tree. Honza > --- > fs/quota/dquot.c | 21 +++++++++++++++------ > 1 file changed, 15 insertions(+), 6 deletions(-) > > diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c > index 53a1749..566e6ef 100644 > --- a/fs/quota/dquot.c > +++ b/fs/quota/dquot.c > @@ -1124,6 +1124,10 @@ void dquot_free_reserved_space(struct dquot *dquot, qsize_t number) > WARN_ON_ONCE(1); > dquot->dq_dqb.dqb_rsvspace = 0; > } > + if (dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace <= > + dquot->dq_dqb.dqb_bsoftlimit) > + dquot->dq_dqb.dqb_btime = (time64_t) 0; > + clear_bit(DQ_BLKS_B, &dquot->dq_flags); > } > > static void dquot_decr_inodes(struct dquot *dquot, qsize_t number) > @@ -1145,7 +1149,8 @@ static void dquot_decr_space(struct dquot *dquot, qsize_t number) > dquot->dq_dqb.dqb_curspace -= number; > else > dquot->dq_dqb.dqb_curspace = 0; > - if (dquot->dq_dqb.dqb_curspace <= dquot->dq_dqb.dqb_bsoftlimit) > + if (dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace <= > + dquot->dq_dqb.dqb_bsoftlimit) > dquot->dq_dqb.dqb_btime = (time64_t) 0; > clear_bit(DQ_BLKS_B, &dquot->dq_flags); > } > @@ -1381,14 +1386,18 @@ static int info_idq_free(struct dquot *dquot, qsize_t inodes) > > static int info_bdq_free(struct dquot *dquot, qsize_t space) > { > + qsize_t tspace; > + > + tspace = dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace; > + > if (test_bit(DQ_FAKE_B, &dquot->dq_flags) || > - dquot->dq_dqb.dqb_curspace <= dquot->dq_dqb.dqb_bsoftlimit) > + tspace <= dquot->dq_dqb.dqb_bsoftlimit) > return QUOTA_NL_NOWARN; > > - if (dquot->dq_dqb.dqb_curspace - space <= dquot->dq_dqb.dqb_bsoftlimit) > + if (tspace - space <= dquot->dq_dqb.dqb_bsoftlimit) > return QUOTA_NL_BSOFTBELOW; > - if (dquot->dq_dqb.dqb_curspace >= dquot->dq_dqb.dqb_bhardlimit && > - dquot->dq_dqb.dqb_curspace - space < dquot->dq_dqb.dqb_bhardlimit) > + if (tspace >= dquot->dq_dqb.dqb_bhardlimit && > + tspace - space < dquot->dq_dqb.dqb_bhardlimit) > return QUOTA_NL_BHARDBELOW; > return QUOTA_NL_NOWARN; > } > @@ -2681,7 +2690,7 @@ static int do_set_dqblk(struct dquot *dquot, struct qc_dqblk *di) > > if (check_blim) { > if (!dm->dqb_bsoftlimit || > - dm->dqb_curspace < dm->dqb_bsoftlimit) { > + dm->dqb_curspace + dm->dqb_rsvspace < dm->dqb_bsoftlimit) { > dm->dqb_btime = 0; > clear_bit(DQ_BLKS_B, &dquot->dq_flags); > } else if (!(di->d_fieldmask & QC_SPC_TIMER)) > -- > 2.5.0 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR