aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/quota/dquot.c48
-rw-r--r--include/linux/quota.h3
2 files changed, 24 insertions, 27 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
index 3c0a7e0dff78..e0b870f4749f 100644
--- a/fs/quota/dquot.c
+++ b/fs/quota/dquot.c
@@ -1181,13 +1181,13 @@ static int check_idq(struct dquot *dquot, qsize_t inodes, char *warntype)
1181 *warntype = QUOTA_NL_NOWARN; 1181 *warntype = QUOTA_NL_NOWARN;
1182 if (!sb_has_quota_limits_enabled(dquot->dq_sb, dquot->dq_type) || 1182 if (!sb_has_quota_limits_enabled(dquot->dq_sb, dquot->dq_type) ||
1183 test_bit(DQ_FAKE_B, &dquot->dq_flags)) 1183 test_bit(DQ_FAKE_B, &dquot->dq_flags))
1184 return QUOTA_OK; 1184 return 0;
1185 1185
1186 if (dquot->dq_dqb.dqb_ihardlimit && 1186 if (dquot->dq_dqb.dqb_ihardlimit &&
1187 newinodes > dquot->dq_dqb.dqb_ihardlimit && 1187 newinodes > dquot->dq_dqb.dqb_ihardlimit &&
1188 !ignore_hardlimit(dquot)) { 1188 !ignore_hardlimit(dquot)) {
1189 *warntype = QUOTA_NL_IHARDWARN; 1189 *warntype = QUOTA_NL_IHARDWARN;
1190 return NO_QUOTA; 1190 return -EDQUOT;
1191 } 1191 }
1192 1192
1193 if (dquot->dq_dqb.dqb_isoftlimit && 1193 if (dquot->dq_dqb.dqb_isoftlimit &&
@@ -1196,7 +1196,7 @@ static int check_idq(struct dquot *dquot, qsize_t inodes, char *warntype)
1196 get_seconds() >= dquot->dq_dqb.dqb_itime && 1196 get_seconds() >= dquot->dq_dqb.dqb_itime &&
1197 !ignore_hardlimit(dquot)) { 1197 !ignore_hardlimit(dquot)) {
1198 *warntype = QUOTA_NL_ISOFTLONGWARN; 1198 *warntype = QUOTA_NL_ISOFTLONGWARN;
1199 return NO_QUOTA; 1199 return -EDQUOT;
1200 } 1200 }
1201 1201
1202 if (dquot->dq_dqb.dqb_isoftlimit && 1202 if (dquot->dq_dqb.dqb_isoftlimit &&
@@ -1207,7 +1207,7 @@ static int check_idq(struct dquot *dquot, qsize_t inodes, char *warntype)
1207 sb_dqopt(dquot->dq_sb)->info[dquot->dq_type].dqi_igrace; 1207 sb_dqopt(dquot->dq_sb)->info[dquot->dq_type].dqi_igrace;
1208 } 1208 }
1209 1209
1210 return QUOTA_OK; 1210 return 0;
1211} 1211}
1212 1212
1213/* needs dq_data_lock */ 1213/* needs dq_data_lock */
@@ -1219,7 +1219,7 @@ static int check_bdq(struct dquot *dquot, qsize_t space, int prealloc, char *war
1219 *warntype = QUOTA_NL_NOWARN; 1219 *warntype = QUOTA_NL_NOWARN;
1220 if (!sb_has_quota_limits_enabled(sb, dquot->dq_type) || 1220 if (!sb_has_quota_limits_enabled(sb, dquot->dq_type) ||
1221 test_bit(DQ_FAKE_B, &dquot->dq_flags)) 1221 test_bit(DQ_FAKE_B, &dquot->dq_flags))
1222 return QUOTA_OK; 1222 return 0;
1223 1223
1224 tspace = dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace 1224 tspace = dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace
1225 + space; 1225 + space;
@@ -1229,7 +1229,7 @@ static int check_bdq(struct dquot *dquot, qsize_t space, int prealloc, char *war
1229 !ignore_hardlimit(dquot)) { 1229 !ignore_hardlimit(dquot)) {
1230 if (!prealloc) 1230 if (!prealloc)
1231 *warntype = QUOTA_NL_BHARDWARN; 1231 *warntype = QUOTA_NL_BHARDWARN;
1232 return NO_QUOTA; 1232 return -EDQUOT;
1233 } 1233 }
1234 1234
1235 if (dquot->dq_dqb.dqb_bsoftlimit && 1235 if (dquot->dq_dqb.dqb_bsoftlimit &&
@@ -1239,7 +1239,7 @@ static int check_bdq(struct dquot *dquot, qsize_t space, int prealloc, char *war
1239 !ignore_hardlimit(dquot)) { 1239 !ignore_hardlimit(dquot)) {
1240 if (!prealloc) 1240 if (!prealloc)
1241 *warntype = QUOTA_NL_BSOFTLONGWARN; 1241 *warntype = QUOTA_NL_BSOFTLONGWARN;
1242 return NO_QUOTA; 1242 return -EDQUOT;
1243 } 1243 }
1244 1244
1245 if (dquot->dq_dqb.dqb_bsoftlimit && 1245 if (dquot->dq_dqb.dqb_bsoftlimit &&
@@ -1255,10 +1255,10 @@ static int check_bdq(struct dquot *dquot, qsize_t space, int prealloc, char *war
1255 * We don't allow preallocation to exceed softlimit so exceeding will 1255 * We don't allow preallocation to exceed softlimit so exceeding will
1256 * be always printed 1256 * be always printed
1257 */ 1257 */
1258 return NO_QUOTA; 1258 return -EDQUOT;
1259 } 1259 }
1260 1260
1261 return QUOTA_OK; 1261 return 0;
1262} 1262}
1263 1263
1264static int info_idq_free(struct dquot *dquot, qsize_t inodes) 1264static int info_idq_free(struct dquot *dquot, qsize_t inodes)
@@ -1507,9 +1507,9 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number,
1507 for (cnt = 0; cnt < MAXQUOTAS; cnt++) { 1507 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1508 if (!inode->i_dquot[cnt]) 1508 if (!inode->i_dquot[cnt])
1509 continue; 1509 continue;
1510 if (check_bdq(inode->i_dquot[cnt], number, !warn, warntype+cnt) 1510 ret = check_bdq(inode->i_dquot[cnt], number, !warn,
1511 == NO_QUOTA) { 1511 warntype+cnt);
1512 ret = -EDQUOT; 1512 if (ret) {
1513 spin_unlock(&dq_data_lock); 1513 spin_unlock(&dq_data_lock);
1514 goto out_flush_warn; 1514 goto out_flush_warn;
1515 } 1515 }
@@ -1541,7 +1541,7 @@ EXPORT_SYMBOL(__dquot_alloc_space);
1541 */ 1541 */
1542int dquot_alloc_inode(const struct inode *inode) 1542int dquot_alloc_inode(const struct inode *inode)
1543{ 1543{
1544 int cnt, ret = -EDQUOT; 1544 int cnt, ret = 0;
1545 char warntype[MAXQUOTAS]; 1545 char warntype[MAXQUOTAS];
1546 1546
1547 /* First test before acquiring mutex - solves deadlocks when we 1547 /* First test before acquiring mutex - solves deadlocks when we
@@ -1555,8 +1555,8 @@ int dquot_alloc_inode(const struct inode *inode)
1555 for (cnt = 0; cnt < MAXQUOTAS; cnt++) { 1555 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1556 if (!inode->i_dquot[cnt]) 1556 if (!inode->i_dquot[cnt])
1557 continue; 1557 continue;
1558 if (check_idq(inode->i_dquot[cnt], 1, warntype+cnt) 1558 ret = check_idq(inode->i_dquot[cnt], 1, warntype + cnt);
1559 == NO_QUOTA) 1559 if (ret)
1560 goto warn_put_all; 1560 goto warn_put_all;
1561 } 1561 }
1562 1562
@@ -1565,7 +1565,7 @@ int dquot_alloc_inode(const struct inode *inode)
1565 continue; 1565 continue;
1566 dquot_incr_inodes(inode->i_dquot[cnt], 1); 1566 dquot_incr_inodes(inode->i_dquot[cnt], 1);
1567 } 1567 }
1568 ret = 0; 1568
1569warn_put_all: 1569warn_put_all:
1570 spin_unlock(&dq_data_lock); 1570 spin_unlock(&dq_data_lock);
1571 if (ret == 0) 1571 if (ret == 0)
@@ -1683,14 +1683,14 @@ static int __dquot_transfer(struct inode *inode, qid_t *chid, unsigned long mask
1683 qsize_t rsv_space = 0; 1683 qsize_t rsv_space = 0;
1684 struct dquot *transfer_from[MAXQUOTAS]; 1684 struct dquot *transfer_from[MAXQUOTAS];
1685 struct dquot *transfer_to[MAXQUOTAS]; 1685 struct dquot *transfer_to[MAXQUOTAS];
1686 int cnt, ret = QUOTA_OK; 1686 int cnt, ret = 0;
1687 char warntype_to[MAXQUOTAS]; 1687 char warntype_to[MAXQUOTAS];
1688 char warntype_from_inodes[MAXQUOTAS], warntype_from_space[MAXQUOTAS]; 1688 char warntype_from_inodes[MAXQUOTAS], warntype_from_space[MAXQUOTAS];
1689 1689
1690 /* First test before acquiring mutex - solves deadlocks when we 1690 /* First test before acquiring mutex - solves deadlocks when we
1691 * re-enter the quota code and are already holding the mutex */ 1691 * re-enter the quota code and are already holding the mutex */
1692 if (IS_NOQUOTA(inode)) 1692 if (IS_NOQUOTA(inode))
1693 return QUOTA_OK; 1693 return 0;
1694 /* Initialize the arrays */ 1694 /* Initialize the arrays */
1695 for (cnt = 0; cnt < MAXQUOTAS; cnt++) { 1695 for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1696 transfer_from[cnt] = NULL; 1696 transfer_from[cnt] = NULL;
@@ -1715,9 +1715,11 @@ static int __dquot_transfer(struct inode *inode, qid_t *chid, unsigned long mask
1715 if (!transfer_to[cnt]) 1715 if (!transfer_to[cnt])
1716 continue; 1716 continue;
1717 transfer_from[cnt] = inode->i_dquot[cnt]; 1717 transfer_from[cnt] = inode->i_dquot[cnt];
1718 if (check_idq(transfer_to[cnt], 1, warntype_to + cnt) == 1718 ret = check_idq(transfer_to[cnt], 1, warntype_to + cnt);
1719 NO_QUOTA || check_bdq(transfer_to[cnt], space, 0, 1719 if (ret)
1720 warntype_to + cnt) == NO_QUOTA) 1720 goto over_quota;
1721 ret = check_bdq(transfer_to[cnt], space, 0, warntype_to + cnt);
1722 if (ret)
1721 goto over_quota; 1723 goto over_quota;
1722 } 1724 }
1723 1725
@@ -1771,7 +1773,6 @@ over_quota:
1771 /* Clear dquot pointers we don't want to dqput() */ 1773 /* Clear dquot pointers we don't want to dqput() */
1772 for (cnt = 0; cnt < MAXQUOTAS; cnt++) 1774 for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1773 transfer_from[cnt] = NULL; 1775 transfer_from[cnt] = NULL;
1774 ret = NO_QUOTA;
1775 goto warn_put_all; 1776 goto warn_put_all;
1776} 1777}
1777 1778
@@ -1793,8 +1794,7 @@ int dquot_transfer(struct inode *inode, struct iattr *iattr)
1793 } 1794 }
1794 if (sb_any_quota_active(inode->i_sb) && !IS_NOQUOTA(inode)) { 1795 if (sb_any_quota_active(inode->i_sb) && !IS_NOQUOTA(inode)) {
1795 dquot_initialize(inode); 1796 dquot_initialize(inode);
1796 if (__dquot_transfer(inode, chid, mask) == NO_QUOTA) 1797 return __dquot_transfer(inode, chid, mask);
1797 return -EDQUOT;
1798 } 1798 }
1799 return 0; 1799 return 0;
1800} 1800}
diff --git a/include/linux/quota.h b/include/linux/quota.h
index 4aa93554f0eb..b462916b2a0a 100644
--- a/include/linux/quota.h
+++ b/include/linux/quota.h
@@ -279,9 +279,6 @@ struct dquot {
279 struct mem_dqblk dq_dqb; /* Diskquota usage */ 279 struct mem_dqblk dq_dqb; /* Diskquota usage */
280}; 280};
281 281
282#define QUOTA_OK 0
283#define NO_QUOTA 1
284
285/* Operations which must be implemented by each quota format */ 282/* Operations which must be implemented by each quota format */
286struct quota_format_ops { 283struct quota_format_ops {
287 int (*check_quota_file)(struct super_block *sb, int type); /* Detect whether file is in our format */ 284 int (*check_quota_file)(struct super_block *sb, int type); /* Detect whether file is in our format */