|
@@ -33,14 +33,13 @@ int dquot_scan_active(struct super_block *sb,
|
|
struct dquot *dquot_alloc(struct super_block *sb, int type);
|
|
struct dquot *dquot_alloc(struct super_block *sb, int type);
|
|
void dquot_destroy(struct dquot *dquot);
|
|
void dquot_destroy(struct dquot *dquot);
|
|
|
|
|
|
-int dquot_alloc_space(struct inode *inode, qsize_t number, int prealloc);
|
|
|
|
-int dquot_alloc_inode(const struct inode *inode, qsize_t number);
|
|
|
|
|
|
+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_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_alloc_inode(const 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_free_inode(const struct inode *inode, qsize_t number);
|
|
|
|
|
|
int dquot_transfer(struct inode *inode, qid_t *chid, unsigned long mask);
|
|
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);
|
|
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)
|
|
static inline int vfs_dq_alloc_inode(struct inode *inode)
|
|
{
|
|
{
|
|
if (sb_any_quota_active(inode->i_sb)) {
|
|
if (sb_any_quota_active(inode->i_sb)) {
|
|
@@ -213,47 +158,6 @@ static inline int vfs_dq_alloc_inode(struct inode *inode)
|
|
return 0;
|
|
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)
|
|
static inline void vfs_dq_free_inode(struct inode *inode)
|
|
{
|
|
{
|
|
if (sb_any_quota_active(inode->i_sb))
|
|
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;
|
|
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;
|
|
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);
|
|
|
|
- return 0;
|
|
|
|
|
|
+ if (!reserve)
|
|
|
|
+ inode_sub_bytes(inode, number);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr)
|
|
|
|
|
|
+static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
|
|
{
|
|
{
|
|
- inode_add_bytes(inode, nr);
|
|
|
|
|
|
+ inode_add_bytes(inode, number);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static inline int vfs_dq_alloc_space(struct inode *inode, qsize_t nr)
|
|
|
|
|
|
+#endif /* CONFIG_QUOTA */
|
|
|
|
+
|
|
|
|
+static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
|
|
{
|
|
{
|
|
- vfs_dq_alloc_space_nodirty(inode, nr);
|
|
|
|
- mark_inode_dirty(inode);
|
|
|
|
- return 0;
|
|
|
|
|
|
+ return __dquot_alloc_space(inode, nr, 1, 0);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline int vfs_dq_reserve_space(struct inode *inode, qsize_t nr)
|
|
|
|
|
|
+static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
|
|
{
|
|
{
|
|
- return 0;
|
|
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ ret = dquot_alloc_space_nodirty(inode, nr);
|
|
|
|
+ if (!ret)
|
|
|
|
+ mark_inode_dirty(inode);
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-static inline int vfs_dq_claim_space(struct inode *inode, qsize_t nr)
|
|
|
|
|
|
+static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
|
|
{
|
|
{
|
|
- return vfs_dq_alloc_space(inode, nr);
|
|
|
|
|
|
+ return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline
|
|
|
|
-int vfs_dq_release_reservation_space(struct inode *inode, qsize_t nr)
|
|
|
|
|
|
+static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
|
|
{
|
|
{
|
|
- return 0;
|
|
|
|
|
|
+ return dquot_alloc_space(inode, nr << inode->i_blkbits);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr)
|
|
|
|
|
|
+static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
|
|
{
|
|
{
|
|
- inode_sub_bytes(inode, nr);
|
|
|
|
|
|
+ return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0, 0);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline void vfs_dq_free_space(struct inode *inode, qsize_t nr)
|
|
|
|
|
|
+static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
|
|
{
|
|
{
|
|
- vfs_dq_free_space_nodirty(inode, nr);
|
|
|
|
- mark_inode_dirty(inode);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-#endif /* CONFIG_QUOTA */
|
|
|
|
|
|
+ int ret;
|
|
|
|
|
|
-static inline int vfs_dq_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
|
|
|
|
-{
|
|
|
|
- return vfs_dq_prealloc_space_nodirty(inode, nr << inode->i_blkbits);
|
|
|
|
|
|
+ ret = dquot_prealloc_block_nodirty(inode, nr);
|
|
|
|
+ if (!ret)
|
|
|
|
+ mark_inode_dirty(inode);
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-static inline int vfs_dq_prealloc_block(struct inode *inode, qsize_t nr)
|
|
|
|
|
|
+static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
|
|
{
|
|
{
|
|
- return vfs_dq_prealloc_space(inode, nr << inode->i_blkbits);
|
|
|
|
|
|
+ return __dquot_alloc_space(inode, nr << inode->i_blkbits, 1, 1);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline int vfs_dq_alloc_block_nodirty(struct inode *inode, qsize_t nr)
|
|
|
|
|
|
+static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
|
|
{
|
|
{
|
|
- return vfs_dq_alloc_space_nodirty(inode, nr << inode->i_blkbits);
|
|
|
|
-}
|
|
|
|
|
|
+ int ret;
|
|
|
|
|
|
-static inline int vfs_dq_alloc_block(struct inode *inode, qsize_t nr)
|
|
|
|
-{
|
|
|
|
- return vfs_dq_alloc_space(inode, nr << inode->i_blkbits);
|
|
|
|
|
|
+ ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
|
|
|
|
+ if (!ret)
|
|
|
|
+ mark_inode_dirty(inode);
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-static inline int vfs_dq_reserve_block(struct inode *inode, qsize_t nr)
|
|
|
|
|
|
+static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
|
|
{
|
|
{
|
|
- return vfs_dq_reserve_space(inode, nr << inode->i_blkbits);
|
|
|
|
|
|
+ __dquot_free_space(inode, nr, 0);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline int vfs_dq_claim_block(struct inode *inode, qsize_t nr)
|
|
|
|
|
|
+static inline void dquot_free_space(struct inode *inode, qsize_t nr)
|
|
{
|
|
{
|
|
- return vfs_dq_claim_space(inode, nr << inode->i_blkbits);
|
|
|
|
|
|
+ dquot_free_space_nodirty(inode, nr);
|
|
|
|
+ mark_inode_dirty(inode);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline
|
|
|
|
-void vfs_dq_release_reservation_block(struct inode *inode, qsize_t nr)
|
|
|
|
|
|
+static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
|
|
{
|
|
{
|
|
- vfs_dq_release_reservation_space(inode, nr << inode->i_blkbits);
|
|
|
|
|
|
+ dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline void vfs_dq_free_block_nodirty(struct inode *inode, qsize_t nr)
|
|
|
|
|
|
+static inline void dquot_free_block(struct inode *inode, qsize_t nr)
|
|
{
|
|
{
|
|
- vfs_dq_free_space_nodirty(inode, nr << inode->i_blkbits);
|
|
|
|
|
|
+ dquot_free_space(inode, nr << inode->i_blkbits);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline void vfs_dq_free_block(struct inode *inode, qsize_t nr)
|
|
|
|
|
|
+static inline void dquot_release_reservation_block(struct inode *inode,
|
|
|
|
+ qsize_t nr)
|
|
{
|
|
{
|
|
- vfs_dq_free_space(inode, nr << inode->i_blkbits);
|
|
|
|
|
|
+ __dquot_free_space(inode, nr << inode->i_blkbits, 1);
|
|
}
|
|
}
|
|
|
|
|
|
#endif /* _LINUX_QUOTAOPS_ */
|
|
#endif /* _LINUX_QUOTAOPS_ */
|