|
@@ -1297,21 +1297,18 @@ static int dquot_add_space(struct dquot *dquot, qsize_t space,
|
|
|
spin_lock(&dquot->dq_dqb_lock);
|
|
|
if (!sb_has_quota_limits_enabled(sb, dquot->dq_id.type) ||
|
|
|
test_bit(DQ_FAKE_B, &dquot->dq_flags))
|
|
|
- goto add;
|
|
|
+ goto finish;
|
|
|
|
|
|
tspace = dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace
|
|
|
+ space + rsv_space;
|
|
|
|
|
|
- if (flags & DQUOT_SPACE_NOFAIL)
|
|
|
- goto add;
|
|
|
-
|
|
|
if (dquot->dq_dqb.dqb_bhardlimit &&
|
|
|
tspace > dquot->dq_dqb.dqb_bhardlimit &&
|
|
|
!ignore_hardlimit(dquot)) {
|
|
|
if (flags & DQUOT_SPACE_WARN)
|
|
|
prepare_warning(warn, dquot, QUOTA_NL_BHARDWARN);
|
|
|
ret = -EDQUOT;
|
|
|
- goto out;
|
|
|
+ goto finish;
|
|
|
}
|
|
|
|
|
|
if (dquot->dq_dqb.dqb_bsoftlimit &&
|
|
@@ -1322,7 +1319,7 @@ static int dquot_add_space(struct dquot *dquot, qsize_t space,
|
|
|
if (flags & DQUOT_SPACE_WARN)
|
|
|
prepare_warning(warn, dquot, QUOTA_NL_BSOFTLONGWARN);
|
|
|
ret = -EDQUOT;
|
|
|
- goto out;
|
|
|
+ goto finish;
|
|
|
}
|
|
|
|
|
|
if (dquot->dq_dqb.dqb_bsoftlimit &&
|
|
@@ -1338,13 +1335,21 @@ static int dquot_add_space(struct dquot *dquot, qsize_t space,
|
|
|
* be always printed
|
|
|
*/
|
|
|
ret = -EDQUOT;
|
|
|
- goto out;
|
|
|
+ goto finish;
|
|
|
}
|
|
|
}
|
|
|
-add:
|
|
|
- dquot->dq_dqb.dqb_rsvspace += rsv_space;
|
|
|
- dquot->dq_dqb.dqb_curspace += space;
|
|
|
-out:
|
|
|
+finish:
|
|
|
+ /*
|
|
|
+ * We have to be careful and go through warning generation & grace time
|
|
|
+ * setting even if DQUOT_SPACE_NOFAIL is set. That's why we check it
|
|
|
+ * only here...
|
|
|
+ */
|
|
|
+ if (flags & DQUOT_SPACE_NOFAIL)
|
|
|
+ ret = 0;
|
|
|
+ if (!ret) {
|
|
|
+ dquot->dq_dqb.dqb_rsvspace += rsv_space;
|
|
|
+ dquot->dq_dqb.dqb_curspace += space;
|
|
|
+ }
|
|
|
spin_unlock(&dquot->dq_dqb_lock);
|
|
|
return ret;
|
|
|
}
|