mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-27 17:11:46 +00:00
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>
This commit is contained in:
parent
49792c806d
commit
5dd4056db8
29 changed files with 273 additions and 398 deletions
|
@ -33,14 +33,13 @@ int dquot_scan_active(struct super_block *sb,
|
|||
struct dquot *dquot_alloc(struct super_block *sb, int type);
|
||||
void dquot_destroy(struct dquot *dquot);
|
||||
|
||||
int dquot_alloc_space(struct inode *inode, qsize_t number, int prealloc);
|
||||
int __dquot_alloc_space(struct inode *inode, qsize_t number,
|
||||
int warn, int reserve);
|
||||
void __dquot_free_space(struct inode *inode, qsize_t number, int reserve);
|
||||
|
||||
int dquot_alloc_inode(const struct inode *inode, qsize_t number);
|
||||
|
||||
int dquot_reserve_space(struct inode *inode, qsize_t number, int prealloc);
|
||||
int dquot_claim_space(struct inode *inode, qsize_t number);
|
||||
void dquot_release_reserved_space(struct inode *inode, qsize_t number);
|
||||
|
||||
int dquot_free_space(struct inode *inode, qsize_t number);
|
||||
int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
|
||||
int dquot_free_inode(const struct inode *inode, qsize_t number);
|
||||
|
||||
int dquot_transfer(struct inode *inode, qid_t *chid, unsigned long mask);
|
||||
|
@ -149,60 +148,6 @@ static inline void vfs_dq_init(struct inode *inode)
|
|||
inode->i_sb->dq_op->initialize(inode, -1);
|
||||
}
|
||||
|
||||
/* The following allocation/freeing/transfer functions *must* be called inside
|
||||
* a transaction (deadlocks possible otherwise) */
|
||||
static inline int vfs_dq_prealloc_space_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
if (sb_any_quota_active(inode->i_sb)) {
|
||||
/* Used space is updated in alloc_space() */
|
||||
if (inode->i_sb->dq_op->alloc_space(inode, nr, 1) == NO_QUOTA)
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
inode_add_bytes(inode, nr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_prealloc_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
int ret;
|
||||
if (!(ret = vfs_dq_prealloc_space_nodirty(inode, nr)))
|
||||
mark_inode_dirty(inode);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
if (sb_any_quota_active(inode->i_sb)) {
|
||||
/* Used space is updated in alloc_space() */
|
||||
if (inode->i_sb->dq_op->alloc_space(inode, nr, 0) == NO_QUOTA)
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
inode_add_bytes(inode, nr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_alloc_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
int ret;
|
||||
if (!(ret = vfs_dq_alloc_space_nodirty(inode, nr)))
|
||||
mark_inode_dirty(inode);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_reserve_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
if (sb_any_quota_active(inode->i_sb)) {
|
||||
/* Used space is updated in alloc_space() */
|
||||
if (inode->i_sb->dq_op->reserve_space(inode, nr, 0) == NO_QUOTA)
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
inode_add_rsv_space(inode, nr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_alloc_inode(struct inode *inode)
|
||||
{
|
||||
if (sb_any_quota_active(inode->i_sb)) {
|
||||
|
@ -213,47 +158,6 @@ static inline int vfs_dq_alloc_inode(struct inode *inode)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert in-memory reserved quotas to real consumed quotas
|
||||
*/
|
||||
static inline int vfs_dq_claim_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
if (sb_any_quota_active(inode->i_sb)) {
|
||||
if (inode->i_sb->dq_op->claim_space(inode, nr) == NO_QUOTA)
|
||||
return 1;
|
||||
} else
|
||||
inode_claim_rsv_space(inode, nr);
|
||||
|
||||
mark_inode_dirty(inode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Release reserved (in-memory) quotas
|
||||
*/
|
||||
static inline
|
||||
void vfs_dq_release_reservation_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
if (sb_any_quota_active(inode->i_sb))
|
||||
inode->i_sb->dq_op->release_rsv(inode, nr);
|
||||
else
|
||||
inode_sub_rsv_space(inode, nr);
|
||||
}
|
||||
|
||||
static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
if (sb_any_quota_active(inode->i_sb))
|
||||
inode->i_sb->dq_op->free_space(inode, nr);
|
||||
else
|
||||
inode_sub_bytes(inode, nr);
|
||||
}
|
||||
|
||||
static inline void vfs_dq_free_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
vfs_dq_free_space_nodirty(inode, nr);
|
||||
mark_inode_dirty(inode);
|
||||
}
|
||||
|
||||
static inline void vfs_dq_free_inode(struct inode *inode)
|
||||
{
|
||||
if (sb_any_quota_active(inode->i_sb))
|
||||
|
@ -351,105 +255,109 @@ static inline int vfs_dq_transfer(struct inode *inode, struct iattr *iattr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_prealloc_space_nodirty(struct inode *inode, qsize_t nr)
|
||||
static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
|
||||
int warn, int reserve)
|
||||
{
|
||||
inode_add_bytes(inode, nr);
|
||||
if (!reserve)
|
||||
inode_add_bytes(inode, number);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_prealloc_space(struct inode *inode, qsize_t nr)
|
||||
static inline void __dquot_free_space(struct inode *inode, qsize_t number,
|
||||
int reserve)
|
||||
{
|
||||
vfs_dq_prealloc_space_nodirty(inode, nr);
|
||||
mark_inode_dirty(inode);
|
||||
if (!reserve)
|
||||
inode_sub_bytes(inode, number);
|
||||
}
|
||||
|
||||
static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
|
||||
{
|
||||
inode_add_bytes(inode, number);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
inode_add_bytes(inode, nr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_alloc_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
vfs_dq_alloc_space_nodirty(inode, nr);
|
||||
mark_inode_dirty(inode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_reserve_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_claim_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return vfs_dq_alloc_space(inode, nr);
|
||||
}
|
||||
|
||||
static inline
|
||||
int vfs_dq_release_reservation_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
inode_sub_bytes(inode, nr);
|
||||
}
|
||||
|
||||
static inline void vfs_dq_free_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
vfs_dq_free_space_nodirty(inode, nr);
|
||||
mark_inode_dirty(inode);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_QUOTA */
|
||||
|
||||
static inline int vfs_dq_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
|
||||
static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return vfs_dq_prealloc_space_nodirty(inode, nr << inode->i_blkbits);
|
||||
return __dquot_alloc_space(inode, nr, 1, 0);
|
||||
}
|
||||
|
||||
static inline int vfs_dq_prealloc_block(struct inode *inode, qsize_t nr)
|
||||
static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return vfs_dq_prealloc_space(inode, nr << inode->i_blkbits);
|
||||
int ret;
|
||||
|
||||
ret = dquot_alloc_space_nodirty(inode, nr);
|
||||
if (!ret)
|
||||
mark_inode_dirty(inode);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int vfs_dq_alloc_block_nodirty(struct inode *inode, qsize_t nr)
|
||||
static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return vfs_dq_alloc_space_nodirty(inode, nr << inode->i_blkbits);
|
||||
return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
|
||||
}
|
||||
|
||||
static inline int vfs_dq_alloc_block(struct inode *inode, qsize_t nr)
|
||||
static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return vfs_dq_alloc_space(inode, nr << inode->i_blkbits);
|
||||
return dquot_alloc_space(inode, nr << inode->i_blkbits);
|
||||
}
|
||||
|
||||
static inline int vfs_dq_reserve_block(struct inode *inode, qsize_t nr)
|
||||
static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return vfs_dq_reserve_space(inode, nr << inode->i_blkbits);
|
||||
return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0, 0);
|
||||
}
|
||||
|
||||
static inline int vfs_dq_claim_block(struct inode *inode, qsize_t nr)
|
||||
static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
return vfs_dq_claim_space(inode, nr << inode->i_blkbits);
|
||||
int ret;
|
||||
|
||||
ret = dquot_prealloc_block_nodirty(inode, nr);
|
||||
if (!ret)
|
||||
mark_inode_dirty(inode);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline
|
||||
void vfs_dq_release_reservation_block(struct inode *inode, qsize_t nr)
|
||||
static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
vfs_dq_release_reservation_space(inode, nr << inode->i_blkbits);
|
||||
return __dquot_alloc_space(inode, nr << inode->i_blkbits, 1, 1);
|
||||
}
|
||||
|
||||
static inline void vfs_dq_free_block_nodirty(struct inode *inode, qsize_t nr)
|
||||
static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
vfs_dq_free_space_nodirty(inode, nr << inode->i_blkbits);
|
||||
int ret;
|
||||
|
||||
ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
|
||||
if (!ret)
|
||||
mark_inode_dirty(inode);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void vfs_dq_free_block(struct inode *inode, qsize_t nr)
|
||||
static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
vfs_dq_free_space(inode, nr << inode->i_blkbits);
|
||||
__dquot_free_space(inode, nr, 0);
|
||||
}
|
||||
|
||||
static inline void dquot_free_space(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
dquot_free_space_nodirty(inode, nr);
|
||||
mark_inode_dirty(inode);
|
||||
}
|
||||
|
||||
static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
|
||||
}
|
||||
|
||||
static inline void dquot_free_block(struct inode *inode, qsize_t nr)
|
||||
{
|
||||
dquot_free_space(inode, nr << inode->i_blkbits);
|
||||
}
|
||||
|
||||
static inline void dquot_release_reservation_block(struct inode *inode,
|
||||
qsize_t nr)
|
||||
{
|
||||
__dquot_free_space(inode, nr << inode->i_blkbits, 1);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_QUOTAOPS_ */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue