diff options
author | zhangyi (F) <yi.zhang@huawei.com> | 2017-08-07 09:35:05 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2017-08-07 10:51:28 -0400 |
commit | 41e327b586762833e48b3703d53312ac32f05f24 (patch) | |
tree | cab5f841224d5fb7ca53c7e706891a0a1393d1e7 /fs/quota | |
parent | aae4e7a8bc44722fe70d58920a36916b1043195e (diff) |
quota: correct space limit check
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>
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/quota')
-rw-r--r-- | fs/quota/dquot.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 53a17496c5c5..566e6ef99f07 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) | |||
1124 | WARN_ON_ONCE(1); | 1124 | WARN_ON_ONCE(1); |
1125 | dquot->dq_dqb.dqb_rsvspace = 0; | 1125 | dquot->dq_dqb.dqb_rsvspace = 0; |
1126 | } | 1126 | } |
1127 | if (dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace <= | ||
1128 | dquot->dq_dqb.dqb_bsoftlimit) | ||
1129 | dquot->dq_dqb.dqb_btime = (time64_t) 0; | ||
1130 | clear_bit(DQ_BLKS_B, &dquot->dq_flags); | ||
1127 | } | 1131 | } |
1128 | 1132 | ||
1129 | static void dquot_decr_inodes(struct dquot *dquot, qsize_t number) | 1133 | 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) | |||
1145 | dquot->dq_dqb.dqb_curspace -= number; | 1149 | dquot->dq_dqb.dqb_curspace -= number; |
1146 | else | 1150 | else |
1147 | dquot->dq_dqb.dqb_curspace = 0; | 1151 | dquot->dq_dqb.dqb_curspace = 0; |
1148 | if (dquot->dq_dqb.dqb_curspace <= dquot->dq_dqb.dqb_bsoftlimit) | 1152 | if (dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace <= |
1153 | dquot->dq_dqb.dqb_bsoftlimit) | ||
1149 | dquot->dq_dqb.dqb_btime = (time64_t) 0; | 1154 | dquot->dq_dqb.dqb_btime = (time64_t) 0; |
1150 | clear_bit(DQ_BLKS_B, &dquot->dq_flags); | 1155 | clear_bit(DQ_BLKS_B, &dquot->dq_flags); |
1151 | } | 1156 | } |
@@ -1381,14 +1386,18 @@ static int info_idq_free(struct dquot *dquot, qsize_t inodes) | |||
1381 | 1386 | ||
1382 | static int info_bdq_free(struct dquot *dquot, qsize_t space) | 1387 | static int info_bdq_free(struct dquot *dquot, qsize_t space) |
1383 | { | 1388 | { |
1389 | qsize_t tspace; | ||
1390 | |||
1391 | tspace = dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace; | ||
1392 | |||
1384 | if (test_bit(DQ_FAKE_B, &dquot->dq_flags) || | 1393 | if (test_bit(DQ_FAKE_B, &dquot->dq_flags) || |
1385 | dquot->dq_dqb.dqb_curspace <= dquot->dq_dqb.dqb_bsoftlimit) | 1394 | tspace <= dquot->dq_dqb.dqb_bsoftlimit) |
1386 | return QUOTA_NL_NOWARN; | 1395 | return QUOTA_NL_NOWARN; |
1387 | 1396 | ||
1388 | if (dquot->dq_dqb.dqb_curspace - space <= dquot->dq_dqb.dqb_bsoftlimit) | 1397 | if (tspace - space <= dquot->dq_dqb.dqb_bsoftlimit) |
1389 | return QUOTA_NL_BSOFTBELOW; | 1398 | return QUOTA_NL_BSOFTBELOW; |
1390 | if (dquot->dq_dqb.dqb_curspace >= dquot->dq_dqb.dqb_bhardlimit && | 1399 | if (tspace >= dquot->dq_dqb.dqb_bhardlimit && |
1391 | dquot->dq_dqb.dqb_curspace - space < dquot->dq_dqb.dqb_bhardlimit) | 1400 | tspace - space < dquot->dq_dqb.dqb_bhardlimit) |
1392 | return QUOTA_NL_BHARDBELOW; | 1401 | return QUOTA_NL_BHARDBELOW; |
1393 | return QUOTA_NL_NOWARN; | 1402 | return QUOTA_NL_NOWARN; |
1394 | } | 1403 | } |
@@ -2681,7 +2690,7 @@ static int do_set_dqblk(struct dquot *dquot, struct qc_dqblk *di) | |||
2681 | 2690 | ||
2682 | if (check_blim) { | 2691 | if (check_blim) { |
2683 | if (!dm->dqb_bsoftlimit || | 2692 | if (!dm->dqb_bsoftlimit || |
2684 | dm->dqb_curspace < dm->dqb_bsoftlimit) { | 2693 | dm->dqb_curspace + dm->dqb_rsvspace < dm->dqb_bsoftlimit) { |
2685 | dm->dqb_btime = 0; | 2694 | dm->dqb_btime = 0; |
2686 | clear_bit(DQ_BLKS_B, &dquot->dq_flags); | 2695 | clear_bit(DQ_BLKS_B, &dquot->dq_flags); |
2687 | } else if (!(di->d_fieldmask & QC_SPC_TIMER)) | 2696 | } else if (!(di->d_fieldmask & QC_SPC_TIMER)) |