quota: Add callbacks for allocating and destroying dquot structures
Jan Kara
reviewerPATCH 1/1 quota: Add callbacks for allocating and destroying dquot structures
Some filesystems would like to keep private information together with each dquot. Add callbacks alloc_dquot and destroy_dquot allowing filesystem to allocate larger dquots from their private slab in a similar fashion we currently allocate inodes.
Signed-off-by Jan Kara <[email protected]>
--- fs/dquot.c | 19 +++++++++++++++---- include/linux/quota.h | 2 ++ 2 files changed, 17 insertions(+), 4 deletions(-)
fs/dquot.c +15 -4
@@ -417,6 +417,14 @@ out_dqlock:return ret; } +static void destroy_dquot (struct dquot *dquot) +{ +if (dquot->dq_sb->dq_op->destroy_dquot) + dquot->dq_sb->dq_op->destroy_dquot (dquot); +else +kmem_cache_free (dquot_cachep, dquot); +} +/* Invalidate all dquots on the list. Note that this function is called after * quota is disabled and pointers from inodes removed so there cannot be new * quota users. There can still be some users of quotas due to inodes being
@@ -465,7 +473,7 @@ restart:remove_dquot_hash (dquot);remove_free_dquot (dquot);remove_inuse (dquot); -kmem_cache_free (dquot_cachep, dquot); +destroy_dquot (dquot); }spin_unlock (&dq_list_lock); }
@@ -529,7 +537,7 @@ static void prune_dqcache(int count)remove_dquot_hash (dquot);remove_free_dquot (dquot);remove_inuse (dquot); -kmem_cache_free (dquot_cachep, dquot); +destroy_dquot (dquot); count--; head = free_dquots.prev; }
@@ -631,7 +639,10 @@ static struct dquot *get_empty_dquot(struct super_block *sb, int type) {struct dquot *dquot; - dquot =kmem_cache_zalloc (dquot_cachep,GFP_NOFS ); +if (sb->dq_op->alloc_dquot) + dquot = sb->dq_op->alloc_dquot (sb, type); +else + dquot =kmem_cache_zalloc (dquot_cachep,GFP_NOFS );if (!dquot)return NODQUOT ;
@@ -684,7 +695,7 @@ we_slept: dqstats.lookups++;spin_unlock (&dq_list_lock);if (empty) -kmem_cache_free (dquot_cachep, empty); +destroy_dquot (empty); }/* Wait for dq_lock - after this we know that either dquot_release() is already * finished or it will be canceled due to dq_count > 1 test */
include/linux/quota.h +2 -0
@@ -294,6 +294,8 @@ struct dquot_operations {int (*free_inode) (const struct inode *,unsigned long );int (*transfer) (struct inode *,struct iattr *);int (*write_dquot) (struct dquot *);/* Ordinary dquot write */ +struct dquot *(*alloc_dquot)(struct super_block *,int );/* Allocate memory for new dquot (can be NULL if no special entries dquot are needed) */ +void (*destroy_dquot)(struct dquot *);/* Free memory for dquot */ int (*acquire_dquot) (struct dquot *);/* Quota is going to be created on disk */ int (*release_dquot) (struct dquot *);/* Quota is going to be deleted from disk */ int (*mark_dirty) (struct dquot *);/* Dquot is marked dirty */
Signature · 1 line
1.5.2.4
PATCH 1/1 quota: Add callbacks for allocating and destroying dquot structures
Quoted 4 lines · Jan Kara
Some filesystems would like to keep private information together with each dquot. Add callbacks
alloc_dquotanddestroy_dquotallowing filesystem to allocate larger dquots from their private slab in a similar fashion we currently allocate inodes.
...
include/linux/quota.h struct dquot_operations { · line 298
Quoted 8 lines
include/linux/quota.h +2
-0@@ -294,6 +294,8 @@ struct dquot_operations {int (*free_inode) (const struct inode *,unsigned long );int (*transfer) (struct inode *,struct iattr *);int (*write_dquot) (struct dquot *);/* Ordinary dquot write */ +struct dquot *(*alloc_dquot)(struct super_block *,int );/* Allocate memory for new dquot (can be NULL if no special entries dquot are needed) */ +void (*destroy_dquot)(struct dquot *);/* Free memory for dquot */
Probably want to mention that ->destroy_dquot() is optional and
really matches ->alloc_dquot().
Joel
Signature · 9 lines
"Every day I get up and look through the Forbes list of the richest
people in America. If I'm not there, I go to work."
- Robert Orben
Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127