quota: correct space limit check
diff mbox

Message ID 1502112905-9525-1-git-send-email-yi.zhang@huawei.com
State New
Headers show

Commit Message

zhangyi (F) Aug. 7, 2017, 1:35 p.m. UTC
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@huawei.com>
---
 fs/quota/dquot.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

Comments

Jan Kara Aug. 7, 2017, 2:49 p.m. UTC | #1
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@huawei.com>

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
>

Patch
diff mbox

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))