diff options
Diffstat (limited to 'fs/quota/dquot.c')
-rw-r--r-- | fs/quota/dquot.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 50b0556a124f..52ad15192e72 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
@@ -1297,21 +1297,18 @@ static int dquot_add_space(struct dquot *dquot, qsize_t space, | |||
1297 | spin_lock(&dquot->dq_dqb_lock); | 1297 | spin_lock(&dquot->dq_dqb_lock); |
1298 | if (!sb_has_quota_limits_enabled(sb, dquot->dq_id.type) || | 1298 | if (!sb_has_quota_limits_enabled(sb, dquot->dq_id.type) || |
1299 | test_bit(DQ_FAKE_B, &dquot->dq_flags)) | 1299 | test_bit(DQ_FAKE_B, &dquot->dq_flags)) |
1300 | goto add; | 1300 | goto finish; |
1301 | 1301 | ||
1302 | tspace = dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace | 1302 | tspace = dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace |
1303 | + space + rsv_space; | 1303 | + space + rsv_space; |
1304 | 1304 | ||
1305 | if (flags & DQUOT_SPACE_NOFAIL) | ||
1306 | goto add; | ||
1307 | |||
1308 | if (dquot->dq_dqb.dqb_bhardlimit && | 1305 | if (dquot->dq_dqb.dqb_bhardlimit && |
1309 | tspace > dquot->dq_dqb.dqb_bhardlimit && | 1306 | tspace > dquot->dq_dqb.dqb_bhardlimit && |
1310 | !ignore_hardlimit(dquot)) { | 1307 | !ignore_hardlimit(dquot)) { |
1311 | if (flags & DQUOT_SPACE_WARN) | 1308 | if (flags & DQUOT_SPACE_WARN) |
1312 | prepare_warning(warn, dquot, QUOTA_NL_BHARDWARN); | 1309 | prepare_warning(warn, dquot, QUOTA_NL_BHARDWARN); |
1313 | ret = -EDQUOT; | 1310 | ret = -EDQUOT; |
1314 | goto out; | 1311 | goto finish; |
1315 | } | 1312 | } |
1316 | 1313 | ||
1317 | if (dquot->dq_dqb.dqb_bsoftlimit && | 1314 | if (dquot->dq_dqb.dqb_bsoftlimit && |
@@ -1322,7 +1319,7 @@ static int dquot_add_space(struct dquot *dquot, qsize_t space, | |||
1322 | if (flags & DQUOT_SPACE_WARN) | 1319 | if (flags & DQUOT_SPACE_WARN) |
1323 | prepare_warning(warn, dquot, QUOTA_NL_BSOFTLONGWARN); | 1320 | prepare_warning(warn, dquot, QUOTA_NL_BSOFTLONGWARN); |
1324 | ret = -EDQUOT; | 1321 | ret = -EDQUOT; |
1325 | goto out; | 1322 | goto finish; |
1326 | } | 1323 | } |
1327 | 1324 | ||
1328 | if (dquot->dq_dqb.dqb_bsoftlimit && | 1325 | if (dquot->dq_dqb.dqb_bsoftlimit && |
@@ -1338,13 +1335,21 @@ static int dquot_add_space(struct dquot *dquot, qsize_t space, | |||
1338 | * be always printed | 1335 | * be always printed |
1339 | */ | 1336 | */ |
1340 | ret = -EDQUOT; | 1337 | ret = -EDQUOT; |
1341 | goto out; | 1338 | goto finish; |
1342 | } | 1339 | } |
1343 | } | 1340 | } |
1344 | add: | 1341 | finish: |
1345 | dquot->dq_dqb.dqb_rsvspace += rsv_space; | 1342 | /* |
1346 | dquot->dq_dqb.dqb_curspace += space; | 1343 | * We have to be careful and go through warning generation & grace time |
1347 | out: | 1344 | * setting even if DQUOT_SPACE_NOFAIL is set. That's why we check it |
1345 | * only here... | ||
1346 | */ | ||
1347 | if (flags & DQUOT_SPACE_NOFAIL) | ||
1348 | ret = 0; | ||
1349 | if (!ret) { | ||
1350 | dquot->dq_dqb.dqb_rsvspace += rsv_space; | ||
1351 | dquot->dq_dqb.dqb_curspace += space; | ||
1352 | } | ||
1348 | spin_unlock(&dquot->dq_dqb_lock); | 1353 | spin_unlock(&dquot->dq_dqb_lock); |
1349 | return ret; | 1354 | return ret; |
1350 | } | 1355 | } |