diff options
| author | Christoph Hellwig <hch@infradead.org> | 2010-03-03 09:05:00 -0500 |
|---|---|---|
| committer | Jan Kara <jack@suse.cz> | 2010-03-04 18:20:28 -0500 |
| commit | 5dd4056db84387975140ff2568eaa0406f07985e (patch) | |
| tree | 03c26d7f6e3367b167bfeeb1a01654c6619573f4 /fs/quota | |
| parent | 49792c806d0bfd53afc789dcdf50dc9bed2c5b83 (diff) | |
dquot: cleanup space allocation / freeing routines
Get rid of the alloc_space, free_space, reserve_space, claim_space and
release_rsv dquot operations - they are always called from the filesystem
and if a filesystem really needs their own (which none currently does)
it can just call into it's own routine directly.
Move shared logic into the common __dquot_alloc_space,
dquot_claim_space_nodirty and __dquot_free_space low-level methods,
and rationalize the wrappers around it to move as much as possible
code into the common block for CONFIG_QUOTA vs not. Also rename
all these helpers to be named dquot_* instead of vfs_dq_*.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/quota')
| -rw-r--r-- | fs/quota/dquot.c | 79 |
1 files changed, 26 insertions, 53 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 10d021dd37c1..baf202c012cc 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
| @@ -1464,28 +1464,29 @@ static void inode_decr_space(struct inode *inode, qsize_t number, int reserve) | |||
| 1464 | } | 1464 | } |
| 1465 | 1465 | ||
| 1466 | /* | 1466 | /* |
| 1467 | * Following four functions update i_blocks+i_bytes fields and | 1467 | * This functions updates i_blocks+i_bytes fields and quota information |
| 1468 | * quota information (together with appropriate checks) | 1468 | * (together with appropriate checks). |
| 1469 | * NOTE: We absolutely rely on the fact that caller dirties | 1469 | * |
| 1470 | * the inode (usually macros in quotaops.h care about this) and | 1470 | * NOTE: We absolutely rely on the fact that caller dirties the inode |
| 1471 | * holds a handle for the current transaction so that dquot write and | 1471 | * (usually helpers in quotaops.h care about this) and holds a handle for |
| 1472 | * inode write go into the same transaction. | 1472 | * the current transaction so that dquot write and inode write go into the |
| 1473 | * same transaction. | ||
| 1473 | */ | 1474 | */ |
| 1474 | 1475 | ||
| 1475 | /* | 1476 | /* |
| 1476 | * This operation can block, but only after everything is updated | 1477 | * This operation can block, but only after everything is updated |
| 1477 | */ | 1478 | */ |
| 1478 | int __dquot_alloc_space(struct inode *inode, qsize_t number, | 1479 | int __dquot_alloc_space(struct inode *inode, qsize_t number, |
| 1479 | int warn, int reserve) | 1480 | int warn, int reserve) |
| 1480 | { | 1481 | { |
| 1481 | int cnt, ret = QUOTA_OK; | 1482 | int cnt, ret = 0; |
| 1482 | char warntype[MAXQUOTAS]; | 1483 | char warntype[MAXQUOTAS]; |
| 1483 | 1484 | ||
| 1484 | /* | 1485 | /* |
| 1485 | * First test before acquiring mutex - solves deadlocks when we | 1486 | * First test before acquiring mutex - solves deadlocks when we |
| 1486 | * re-enter the quota code and are already holding the mutex | 1487 | * re-enter the quota code and are already holding the mutex |
| 1487 | */ | 1488 | */ |
| 1488 | if (IS_NOQUOTA(inode)) { | 1489 | if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode)) { |
| 1489 | inode_incr_space(inode, number, reserve); | 1490 | inode_incr_space(inode, number, reserve); |
| 1490 | goto out; | 1491 | goto out; |
| 1491 | } | 1492 | } |
| @@ -1498,9 +1499,9 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, | |||
| 1498 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { | 1499 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { |
| 1499 | if (!inode->i_dquot[cnt]) | 1500 | if (!inode->i_dquot[cnt]) |
| 1500 | continue; | 1501 | continue; |
| 1501 | if (check_bdq(inode->i_dquot[cnt], number, warn, warntype+cnt) | 1502 | if (check_bdq(inode->i_dquot[cnt], number, !warn, warntype+cnt) |
| 1502 | == NO_QUOTA) { | 1503 | == NO_QUOTA) { |
| 1503 | ret = NO_QUOTA; | 1504 | ret = -EDQUOT; |
| 1504 | spin_unlock(&dq_data_lock); | 1505 | spin_unlock(&dq_data_lock); |
| 1505 | goto out_flush_warn; | 1506 | goto out_flush_warn; |
| 1506 | } | 1507 | } |
| @@ -1525,18 +1526,7 @@ out_flush_warn: | |||
| 1525 | out: | 1526 | out: |
| 1526 | return ret; | 1527 | return ret; |
| 1527 | } | 1528 | } |
| 1528 | 1529 | EXPORT_SYMBOL(__dquot_alloc_space); | |
| 1529 | int dquot_alloc_space(struct inode *inode, qsize_t number, int warn) | ||
| 1530 | { | ||
| 1531 | return __dquot_alloc_space(inode, number, warn, 0); | ||
| 1532 | } | ||
| 1533 | EXPORT_SYMBOL(dquot_alloc_space); | ||
| 1534 | |||
| 1535 | int dquot_reserve_space(struct inode *inode, qsize_t number, int warn) | ||
| 1536 | { | ||
| 1537 | return __dquot_alloc_space(inode, number, warn, 1); | ||
| 1538 | } | ||
| 1539 | EXPORT_SYMBOL(dquot_reserve_space); | ||
| 1540 | 1530 | ||
| 1541 | /* | 1531 | /* |
| 1542 | * This operation can block, but only after everything is updated | 1532 | * This operation can block, but only after everything is updated |
| @@ -1578,14 +1568,16 @@ warn_put_all: | |||
| 1578 | } | 1568 | } |
| 1579 | EXPORT_SYMBOL(dquot_alloc_inode); | 1569 | EXPORT_SYMBOL(dquot_alloc_inode); |
| 1580 | 1570 | ||
| 1581 | int dquot_claim_space(struct inode *inode, qsize_t number) | 1571 | /* |
| 1572 | * Convert in-memory reserved quotas to real consumed quotas | ||
| 1573 | */ | ||
| 1574 | int dquot_claim_space_nodirty(struct inode *inode, qsize_t number) | ||
| 1582 | { | 1575 | { |
| 1583 | int cnt; | 1576 | int cnt; |
| 1584 | int ret = QUOTA_OK; | ||
| 1585 | 1577 | ||
| 1586 | if (IS_NOQUOTA(inode)) { | 1578 | if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode)) { |
| 1587 | inode_claim_rsv_space(inode, number); | 1579 | inode_claim_rsv_space(inode, number); |
| 1588 | goto out; | 1580 | return 0; |
| 1589 | } | 1581 | } |
| 1590 | 1582 | ||
| 1591 | down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); | 1583 | down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); |
| @@ -1601,24 +1593,23 @@ int dquot_claim_space(struct inode *inode, qsize_t number) | |||
| 1601 | spin_unlock(&dq_data_lock); | 1593 | spin_unlock(&dq_data_lock); |
| 1602 | mark_all_dquot_dirty(inode->i_dquot); | 1594 | mark_all_dquot_dirty(inode->i_dquot); |
| 1603 | up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); | 1595 | up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); |
| 1604 | out: | 1596 | return 0; |
| 1605 | return ret; | ||
| 1606 | } | 1597 | } |
| 1607 | EXPORT_SYMBOL(dquot_claim_space); | 1598 | EXPORT_SYMBOL(dquot_claim_space_nodirty); |
| 1608 | 1599 | ||
| 1609 | /* | 1600 | /* |
| 1610 | * This operation can block, but only after everything is updated | 1601 | * This operation can block, but only after everything is updated |
| 1611 | */ | 1602 | */ |
| 1612 | int __dquot_free_space(struct inode *inode, qsize_t number, int reserve) | 1603 | void __dquot_free_space(struct inode *inode, qsize_t number, int reserve) |
| 1613 | { | 1604 | { |
| 1614 | unsigned int cnt; | 1605 | unsigned int cnt; |
| 1615 | char warntype[MAXQUOTAS]; | 1606 | char warntype[MAXQUOTAS]; |
| 1616 | 1607 | ||
| 1617 | /* First test before acquiring mutex - solves deadlocks when we | 1608 | /* First test before acquiring mutex - solves deadlocks when we |
| 1618 | * re-enter the quota code and are already holding the mutex */ | 1609 | * re-enter the quota code and are already holding the mutex */ |
| 1619 | if (IS_NOQUOTA(inode)) { | 1610 | if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode)) { |
| 1620 | inode_decr_space(inode, number, reserve); | 1611 | inode_decr_space(inode, number, reserve); |
| 1621 | return QUOTA_OK; | 1612 | return; |
| 1622 | } | 1613 | } |
| 1623 | 1614 | ||
| 1624 | down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); | 1615 | down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); |
| @@ -1641,24 +1632,8 @@ int __dquot_free_space(struct inode *inode, qsize_t number, int reserve) | |||
| 1641 | out_unlock: | 1632 | out_unlock: |
| 1642 | flush_warnings(inode->i_dquot, warntype); | 1633 | flush_warnings(inode->i_dquot, warntype); |
| 1643 | up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); | 1634 | up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); |
| 1644 | return QUOTA_OK; | ||
| 1645 | } | ||
| 1646 | |||
| 1647 | int dquot_free_space(struct inode *inode, qsize_t number) | ||
| 1648 | { | ||
| 1649 | return __dquot_free_space(inode, number, 0); | ||
| 1650 | } | ||
| 1651 | EXPORT_SYMBOL(dquot_free_space); | ||
| 1652 | |||
| 1653 | /* | ||
| 1654 | * Release reserved quota space | ||
| 1655 | */ | ||
| 1656 | void dquot_release_reserved_space(struct inode *inode, qsize_t number) | ||
| 1657 | { | ||
| 1658 | __dquot_free_space(inode, number, 1); | ||
| 1659 | |||
| 1660 | } | 1635 | } |
| 1661 | EXPORT_SYMBOL(dquot_release_reserved_space); | 1636 | EXPORT_SYMBOL(__dquot_free_space); |
| 1662 | 1637 | ||
| 1663 | /* | 1638 | /* |
| 1664 | * This operation can block, but only after everything is updated | 1639 | * This operation can block, but only after everything is updated |
| @@ -1840,9 +1815,7 @@ EXPORT_SYMBOL(dquot_commit_info); | |||
| 1840 | const struct dquot_operations dquot_operations = { | 1815 | const struct dquot_operations dquot_operations = { |
| 1841 | .initialize = dquot_initialize, | 1816 | .initialize = dquot_initialize, |
| 1842 | .drop = dquot_drop, | 1817 | .drop = dquot_drop, |
| 1843 | .alloc_space = dquot_alloc_space, | ||
| 1844 | .alloc_inode = dquot_alloc_inode, | 1818 | .alloc_inode = dquot_alloc_inode, |
| 1845 | .free_space = dquot_free_space, | ||
| 1846 | .free_inode = dquot_free_inode, | 1819 | .free_inode = dquot_free_inode, |
| 1847 | .transfer = dquot_transfer, | 1820 | .transfer = dquot_transfer, |
| 1848 | .write_dquot = dquot_commit, | 1821 | .write_dquot = dquot_commit, |
